Repository: Automattic/harper Branch: master Commit: 8be8bbe327a5 Files: 1334 Total size: 34.8 MB Directory structure: gitextract_av__3sa_/ ├── .dockerignore ├── .editorconfig ├── .envrc ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── report-false-positive.md │ │ ├── report-grammatical-error.md │ │ └── suggest-a-feature.md │ ├── dependabot.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── binaries.yml │ ├── build_web.yml │ ├── chrome_plugin.yml │ ├── just_checks.yml │ ├── stale.yml │ ├── vscode_plugin.yml │ └── wp_plugin.yml ├── .gitignore ├── .node-version ├── .npmrc ├── AGENTS.md ├── ARCHITECTURE.md ├── COMPARISON.md ├── CONTRIBUTING.md ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── biome.json ├── demo.md ├── docker-compose.dev.yml ├── docker-compose.yml ├── flake.nix ├── fuzz/ │ ├── .gitignore │ ├── Cargo.toml │ ├── README.md │ └── fuzz_targets/ │ ├── fuzz_harper_comment.rs │ ├── fuzz_harper_core_markdown.rs │ ├── fuzz_harper_html.rs │ ├── fuzz_harper_literate_haskell.rs │ └── fuzz_harper_typst.rs ├── harper-asciidoc/ │ ├── Cargo.toml │ ├── src/ │ │ └── lib.rs │ └── tests/ │ ├── asciidoc_tests.rs │ └── test_sources/ │ ├── basic.adoc │ ├── comment.adoc │ ├── comprehensive.adoc │ └── table.adoc ├── harper-brill/ │ ├── Cargo.toml │ ├── finished_chunker/ │ │ ├── model.mpk │ │ └── vocab.json │ ├── src/ │ │ └── lib.rs │ ├── trained_chunker_model.json │ └── trained_tagger_model.json ├── harper-cli/ │ ├── Cargo.toml │ ├── README.md │ ├── src/ │ │ ├── annotate.rs │ │ ├── input/ │ │ │ ├── multi_input.rs │ │ │ └── single_input.rs │ │ ├── input.rs │ │ ├── lint.rs │ │ └── main.rs │ └── tests/ │ ├── no_color.rs │ └── output_format.rs ├── harper-comments/ │ ├── Cargo.toml │ ├── README.md │ ├── src/ │ │ ├── comment_parser.rs │ │ ├── comment_parsers/ │ │ │ ├── go.rs │ │ │ ├── javadoc.rs │ │ │ ├── jsdoc.rs │ │ │ ├── lua.rs │ │ │ ├── mod.rs │ │ │ ├── solidity.rs │ │ │ └── unit.rs │ │ ├── lib.rs │ │ └── masker.rs │ └── tests/ │ ├── language_support.rs │ └── language_support_sources/ │ ├── basic.clj │ ├── basic_groovy.groovy │ ├── basic_kotlin.kt │ ├── clean.lua │ ├── clean.ps1 │ ├── clean.rs │ ├── clean.sol │ ├── clean.zig │ ├── common.mill │ ├── complex_gradle_build.gradle │ ├── complex_groovy_block_comments.groovy │ ├── complex_groovy_strings_regex.groovy │ ├── dirty.lua │ ├── dirty.zig │ ├── empty.js │ ├── eof.rs │ ├── ignore_comments.c │ ├── ignore_comments.ps1 │ ├── ignore_comments.rs │ ├── ignore_comments.sol │ ├── ignore_shebang_1.sh │ ├── ignore_shebang_2.sh │ ├── ignore_shebang_3.sh │ ├── ignore_shebang_4.sh │ ├── issue_1097.lua │ ├── issue_132.rs │ ├── issue_229.c │ ├── issue_229.cs │ ├── issue_229.js │ ├── issue_96.lua │ ├── issue_96.rb │ ├── javadoc_clean_simple.java │ ├── javadoc_complex.java │ ├── jsdoc.ts │ ├── laravel_app.php │ ├── merged_lines.ts │ ├── multiline_comments.cpp │ ├── multiline_comments.sol │ └── multiline_comments.ts ├── harper-core/ │ ├── Cargo.toml │ ├── README.md │ ├── annotations.json │ ├── benches/ │ │ ├── essay.md │ │ └── parse_essay.rs │ ├── build.rs │ ├── clippy.toml │ ├── dictionary.dict │ ├── irregular_nouns.json │ ├── irregular_verbs.json │ ├── proper_noun_rules.json │ ├── src/ │ │ ├── case.rs │ │ ├── char_ext.rs │ │ ├── char_string.rs │ │ ├── currency.rs │ │ ├── dict_word_metadata.rs │ │ ├── dict_word_metadata_orthography.rs │ │ ├── document.rs │ │ ├── edit_distance.rs │ │ ├── expr/ │ │ │ ├── all.rs │ │ │ ├── anchor_end.rs │ │ │ ├── anchor_start.rs │ │ │ ├── duration_expr.rs │ │ │ ├── expr_map.rs │ │ │ ├── filter.rs │ │ │ ├── first_match_of.rs │ │ │ ├── fixed_phrase.rs │ │ │ ├── longest_match_of.rs │ │ │ ├── mergeable_words.rs │ │ │ ├── mod.rs │ │ │ ├── optional.rs │ │ │ ├── reflexive_pronoun.rs │ │ │ ├── repeating.rs │ │ │ ├── sequence_expr.rs │ │ │ ├── similar_to_phrase.rs │ │ │ ├── space_or_hyphen.rs │ │ │ ├── spelled_number_expr.rs │ │ │ ├── step.rs │ │ │ ├── time_unit_expr.rs │ │ │ ├── unless_step.rs │ │ │ └── word_expr_group.rs │ │ ├── fat_token.rs │ │ ├── ignored_lints/ │ │ │ ├── lint_context.rs │ │ │ └── mod.rs │ │ ├── indefinite_article.rs │ │ ├── irregular_nouns.rs │ │ ├── irregular_verbs.rs │ │ ├── language_detection.rs │ │ ├── lexing/ │ │ │ ├── email_address.rs │ │ │ ├── hostname.rs │ │ │ ├── mod.rs │ │ │ └── url.rs │ │ ├── lib.rs │ │ ├── linting/ │ │ │ ├── a_part.rs │ │ │ ├── a_while.rs │ │ │ ├── addicting.rs │ │ │ ├── adjective_double_degree.rs │ │ │ ├── adjective_of_a.rs │ │ │ ├── after_later.rs │ │ │ ├── all_hell_break_loose.rs │ │ │ ├── all_intents_and_purposes.rs │ │ │ ├── allow_to.rs │ │ │ ├── am_in_the_morning.rs │ │ │ ├── amounts_for.rs │ │ │ ├── an_a.rs │ │ │ ├── and_in.rs │ │ │ ├── and_the_like.rs │ │ │ ├── another_thing_coming.rs │ │ │ ├── another_think_coming.rs │ │ │ ├── apart_from.rs │ │ │ ├── ask_no_preposition.rs │ │ │ ├── avoid_curses.rs │ │ │ ├── back_in_the_day.rs │ │ │ ├── be_allowed.rs │ │ │ ├── be_worried.rs │ │ │ ├── behind_the_scenes.rs │ │ │ ├── best_of_all_time.rs │ │ │ ├── boring_words.rs │ │ │ ├── bought.rs │ │ │ ├── brand_brandish.rs │ │ │ ├── by_accident.rs │ │ │ ├── call_them.rs │ │ │ ├── cant.rs │ │ │ ├── capitalize_personal_pronouns.rs │ │ │ ├── cautionary_tale.rs │ │ │ ├── change_tack.rs │ │ │ ├── chock_full.rs │ │ │ ├── closed_compounds.rs │ │ │ ├── comma_fixes.rs │ │ │ ├── compound_nouns/ │ │ │ │ ├── compound_noun_after_det_adj.rs │ │ │ │ ├── compound_noun_after_possessive.rs │ │ │ │ ├── compound_noun_before_aux_verb.rs │ │ │ │ └── mod.rs │ │ │ ├── compound_subject_i.rs │ │ │ ├── confident.rs │ │ │ ├── correct_number_suffix.rs │ │ │ ├── criteria_phenomena.rs │ │ │ ├── cure_for.rs │ │ │ ├── currency_placement.rs │ │ │ ├── damages.rs │ │ │ ├── dashes.rs │ │ │ ├── day_and_age.rs │ │ │ ├── despite_it_is.rs │ │ │ ├── despite_of.rs │ │ │ ├── determiner_without_noun.rs │ │ │ ├── did_past.rs │ │ │ ├── didnt.rs │ │ │ ├── discourse_markers.rs │ │ │ ├── disjoint_prefixes.rs │ │ │ ├── do_mistake.rs │ │ │ ├── dot_initialisms.rs │ │ │ ├── double_click.rs │ │ │ ├── double_modal.rs │ │ │ ├── ellipsis_length.rs │ │ │ ├── else_possessive.rs │ │ │ ├── ever_every.rs │ │ │ ├── everyday.rs │ │ │ ├── expand_memory_shorthands.rs │ │ │ ├── expand_time_shorthands.rs │ │ │ ├── expr_linter.rs │ │ │ ├── far_be_it.rs │ │ │ ├── fascinated_by.rs │ │ │ ├── fed_up_with.rs │ │ │ ├── feel_fell.rs │ │ │ ├── few_units_of_time_ago.rs │ │ │ ├── filler_words.rs │ │ │ ├── find_fine.rs │ │ │ ├── first_aid_kit.rs │ │ │ ├── flesh_out_vs_full_fledged.rs │ │ │ ├── for_noun.rs │ │ │ ├── free_predicate.rs │ │ │ ├── friend_of_me.rs │ │ │ ├── go_so_far_as_to.rs │ │ │ ├── go_to_war.rs │ │ │ ├── good_at.rs │ │ │ ├── handful.rs │ │ │ ├── have_pronoun.rs │ │ │ ├── have_take_a_look.rs │ │ │ ├── hedging.rs │ │ │ ├── hello_greeting.rs │ │ │ ├── hereby.rs │ │ │ ├── hop_hope/ │ │ │ │ ├── mod.rs │ │ │ │ ├── to_hop.rs │ │ │ │ └── to_hope.rs │ │ │ ├── hope_youre.rs │ │ │ ├── how_to.rs │ │ │ ├── hyphenate_number_day.rs │ │ │ ├── i_am_agreement.rs │ │ │ ├── if_wouldve.rs │ │ │ ├── in_on_the_cards.rs │ │ │ ├── inflected_verb_after_to.rs │ │ │ ├── initialism_linter.rs │ │ │ ├── initialisms.rs │ │ │ ├── interested_in.rs │ │ │ ├── it_is.rs │ │ │ ├── it_looks_like_that.rs │ │ │ ├── it_would_be.rs │ │ │ ├── its_contraction/ │ │ │ │ ├── general.rs │ │ │ │ ├── mod.rs │ │ │ │ └── proper_noun.rs │ │ │ ├── its_possessive.rs │ │ │ ├── jealous_of.rs │ │ │ ├── johns_hopkins.rs │ │ │ ├── lead_rise_to.rs │ │ │ ├── left_right_hand.rs │ │ │ ├── less_worse.rs │ │ │ ├── let_to_do.rs │ │ │ ├── lets_confusion/ │ │ │ │ ├── let_us_redundancy.rs │ │ │ │ ├── mod.rs │ │ │ │ └── no_contraction_with_verb.rs │ │ │ ├── likewise.rs │ │ │ ├── lint.rs │ │ │ ├── lint_group.rs │ │ │ ├── lint_kind.rs │ │ │ ├── long_sentences.rs │ │ │ ├── look_down_ones_nose.rs │ │ │ ├── looking_forward_to.rs │ │ │ ├── map_phrase_linter.rs │ │ │ ├── map_phrase_set_linter.rs │ │ │ ├── mass_nouns/ │ │ │ │ ├── mass_plurals.rs │ │ │ │ ├── mod.rs │ │ │ │ └── noun_countability.rs │ │ │ ├── means_a_lot_to.rs │ │ │ ├── merge_linters.rs │ │ │ ├── merge_words.rs │ │ │ ├── missing_preposition.rs │ │ │ ├── missing_space.rs │ │ │ ├── missing_to.rs │ │ │ ├── misspell.rs │ │ │ ├── mixed_bag.rs │ │ │ ├── mod.rs │ │ │ ├── modal_be_adjective.rs │ │ │ ├── modal_of.rs │ │ │ ├── modal_seem.rs │ │ │ ├── months.rs │ │ │ ├── more_adjective.rs │ │ │ ├── more_better.rs │ │ │ ├── most_number.rs │ │ │ ├── most_of_the_times.rs │ │ │ ├── multiple_frequency_adverbs.rs │ │ │ ├── multiple_sequential_pronouns.rs │ │ │ ├── nail_on_the_head.rs │ │ │ ├── need_to_noun.rs │ │ │ ├── no_french_spaces.rs │ │ │ ├── no_longer.rs │ │ │ ├── no_match_for.rs │ │ │ ├── no_oxford_comma.rs │ │ │ ├── nobody.rs │ │ │ ├── nominal_wants.rs │ │ │ ├── nor_modal_pronoun.rs │ │ │ ├── not_only_inversion.rs │ │ │ ├── noun_verb_confusion/ │ │ │ │ ├── effect_affect/ │ │ │ │ │ ├── affect_to_effect.rs │ │ │ │ │ ├── effect_to_affect.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── mod.rs │ │ │ │ ├── noun_instead_of_verb/ │ │ │ │ │ ├── general.rs │ │ │ │ │ └── mod.rs │ │ │ │ └── verb_instead_of_noun.rs │ │ │ ├── number_suffix_capitalization.rs │ │ │ ├── obsess_preposition.rs │ │ │ ├── of_course.rs │ │ │ ├── oldest_in_the_book.rs │ │ │ ├── on_floor.rs │ │ │ ├── once_or_twice.rs │ │ │ ├── one_and_the_same.rs │ │ │ ├── one_of_the_singular.rs │ │ │ ├── open_compounds.rs │ │ │ ├── open_the_light.rs │ │ │ ├── orthographic_consistency.rs │ │ │ ├── ought_to_be.rs │ │ │ ├── out_of_date.rs │ │ │ ├── oxford_comma.rs │ │ │ ├── oxymorons.rs │ │ │ ├── phrasal_verb_as_compound_noun.rs │ │ │ ├── phrase_set_corrections/ │ │ │ │ ├── mod.rs │ │ │ │ └── tests.rs │ │ │ ├── pique_interest.rs │ │ │ ├── plural_decades/ │ │ │ │ ├── four_digits.rs │ │ │ │ ├── mod.rs │ │ │ │ └── two_digits.rs │ │ │ ├── plural_wrong_word_of_phrase.rs │ │ │ ├── possessive_noun.rs │ │ │ ├── possessive_your.rs │ │ │ ├── progressive_needs_be.rs │ │ │ ├── pronoun_are.rs │ │ │ ├── pronoun_contraction/ │ │ │ │ ├── avoid_contraction.rs │ │ │ │ ├── mod.rs │ │ │ │ └── should_contract.rs │ │ │ ├── pronoun_inflection_be.rs │ │ │ ├── pronoun_knew.rs │ │ │ ├── pronoun_verb_agreement.rs │ │ │ ├── proper_noun_capitalization_linters.rs │ │ │ ├── quantifier_needs_of.rs │ │ │ ├── quantifier_numeral_conflict.rs │ │ │ ├── quite_quiet.rs │ │ │ ├── quote_spacing.rs │ │ │ ├── reason_for_doing.rs │ │ │ ├── redundant_acronyms.rs │ │ │ ├── redundant_additive_adverbs.rs │ │ │ ├── redundant_progressive_comparative.rs │ │ │ ├── regionalisms.rs │ │ │ ├── regular_irregulars.rs │ │ │ ├── repeated_words.rs │ │ │ ├── respond.rs │ │ │ ├── right_click.rs │ │ │ ├── rise_the_ranks.rs │ │ │ ├── roller_skated.rs │ │ │ ├── safe_to_save.rs │ │ │ ├── save_to_safe.rs │ │ │ ├── sentence_capitalization.rs │ │ │ ├── shoot_oneself_in_the_foot.rs │ │ │ ├── simple_past_to_past_participle.rs │ │ │ ├── since_duration.rs │ │ │ ├── single_be.rs │ │ │ ├── some_without_article.rs │ │ │ ├── something_is.rs │ │ │ ├── somewhat_something.rs │ │ │ ├── soon_to_be.rs │ │ │ ├── sought_after.rs │ │ │ ├── spaces.rs │ │ │ ├── spell_check.rs │ │ │ ├── spelled_numbers.rs │ │ │ ├── split_words.rs │ │ │ ├── subject_pronoun.rs │ │ │ ├── suggestion.rs │ │ │ ├── take_a_look_to.rs │ │ │ ├── take_medicine.rs │ │ │ ├── take_serious.rs │ │ │ ├── that_than.rs │ │ │ ├── that_which.rs │ │ │ ├── the_how_why.rs │ │ │ ├── the_my.rs │ │ │ ├── the_point_for.rs │ │ │ ├── the_proper_noun_possessive.rs │ │ │ ├── then_than.rs │ │ │ ├── theres.rs │ │ │ ├── theses_these.rs │ │ │ ├── theyre_confusions/ │ │ │ │ ├── mod.rs │ │ │ │ ├── over_theyre_to_there.rs │ │ │ │ └── typographic_theyre_to_their.rs │ │ │ ├── thing_think.rs │ │ │ ├── this_type_of_thing.rs │ │ │ ├── though_thought.rs │ │ │ ├── throw_away.rs │ │ │ ├── throw_rubbish.rs │ │ │ ├── to_adverb.rs │ │ │ ├── to_two_too/ │ │ │ │ ├── mod.rs │ │ │ │ ├── to_too_adjective_end.rs │ │ │ │ ├── to_too_adjective_punct.rs │ │ │ │ ├── to_too_adjverb_ed_punct.rs │ │ │ │ ├── to_too_adverb.rs │ │ │ │ ├── to_too_chunk_start_comma.rs │ │ │ │ ├── to_too_degree_words.rs │ │ │ │ ├── to_too_eos.rs │ │ │ │ ├── to_too_pronoun_end.rs │ │ │ │ └── too_to.rs │ │ │ ├── touristic.rs │ │ │ ├── transposed_space.rs │ │ │ ├── try_ones_hand_at.rs │ │ │ ├── unclosed_quotes.rs │ │ │ ├── update_place_names.rs │ │ │ ├── use_title_case.rs │ │ │ ├── verb_to_adjective.rs │ │ │ ├── very_unique.rs │ │ │ ├── vice_versa.rs │ │ │ ├── vicious_loop/ │ │ │ │ └── mod.rs │ │ │ ├── was_aloud.rs │ │ │ ├── way_too_adjective.rs │ │ │ ├── weir_rules/ │ │ │ │ ├── ACoupleMore.weir │ │ │ │ ├── ALongTime.weir │ │ │ │ ├── AOkHyphen.weir │ │ │ │ ├── AdNauseam.weir │ │ │ │ ├── AfterAWhile.weir │ │ │ │ ├── AfterAll.weir │ │ │ │ ├── AheadAnd.weir │ │ │ │ ├── Albeit.weir │ │ │ │ ├── AllOfASudden.weir │ │ │ │ ├── AllReady.weir │ │ │ │ ├── AllThough.weir │ │ │ │ ├── Alongside.weir │ │ │ │ ├── AlzheimersDisease.weir │ │ │ │ ├── AnAnother.weir │ │ │ │ ├── AnotherAn.weir │ │ │ │ ├── AnotherOnes.weir │ │ │ │ ├── AnotherThings.weir │ │ │ │ ├── ArriveOnWeekday.weir │ │ │ │ ├── AsEvidentBy.weir │ │ │ │ ├── AsFarBackAs.weir │ │ │ │ ├── AsFollows.weir │ │ │ │ ├── AsIfThough.weir │ │ │ │ ├── AsItHappens.weir │ │ │ │ ├── AsLongAs.weir │ │ │ │ ├── AsOfCurrently.weir │ │ │ │ ├── AsOfLately.weir │ │ │ │ ├── AsOpposedTo.weir │ │ │ │ ├── AtFaceValue.weir │ │ │ │ ├── AtTheEndOfTheDay.weir │ │ │ │ ├── AtTheExpenseOf.weir │ │ │ │ ├── AvoidAndAlso.weir │ │ │ │ ├── AwareOf.weir │ │ │ │ ├── BadRap.weir │ │ │ │ ├── BanTogether.weir │ │ │ │ ├── BareInMind.weir │ │ │ │ ├── BatedBreath.weir │ │ │ │ ├── BeckAndCall.weir │ │ │ │ ├── BeenThere.weir │ │ │ │ ├── Beforehand.weir │ │ │ │ ├── BesideThePoint.weir │ │ │ │ ├── BestRegards.weir │ │ │ │ ├── BetterOffWith.weir │ │ │ │ ├── BewareOf.weir │ │ │ │ ├── BlacklistWhitelist.weir │ │ │ │ ├── BlanketStatement.weir │ │ │ │ ├── Brutality.weir │ │ │ │ ├── BuiltIn.weir │ │ │ │ ├── CanBeSeen.weir │ │ │ │ ├── CaseInPoint.weir │ │ │ │ ├── CaseSensitive.weir │ │ │ │ ├── ClickThroughRate.weir │ │ │ │ ├── ComprisesOf.weir │ │ │ │ ├── CondenseAllThe.weir │ │ │ │ ├── CoursingThroughVeins.weir │ │ │ │ ├── CuttingAgeEggcorn.weir │ │ │ │ ├── Cybersec.weir │ │ │ │ ├── DampSquib.weir │ │ │ │ ├── DegreesKelvin.weir │ │ │ │ ├── DegreesKelvinSymbol.weir │ │ │ │ ├── DoIAdjective.weir │ │ │ │ ├── DoNotWant.weir │ │ │ │ ├── DoToDueTo.weir │ │ │ │ ├── DontCan.weir │ │ │ │ ├── DoubleNegative.weir │ │ │ │ ├── DueDiligence.weir │ │ │ │ ├── DuringAges.weir │ │ │ │ ├── EachAndEveryOne.weir │ │ │ │ ├── EagleEyed.weir │ │ │ │ ├── EggYolk.weir │ │ │ │ ├── EludedTo.weir │ │ │ │ ├── EnMasse.weir │ │ │ │ ├── EnRoute.weir │ │ │ │ ├── EverPresent.weir │ │ │ │ ├── EverSince.weir │ │ │ │ ├── EveryOnceAndAgain.weir │ │ │ │ ├── EveryTime.weir │ │ │ │ ├── Excellent.weir │ │ │ │ ├── ExpandBecause.weir │ │ │ │ ├── ExpandControl.weir │ │ │ │ ├── ExpandForward.weir │ │ │ │ ├── ExpandMinimum.weir │ │ │ │ ├── ExpandPrevious.weir │ │ │ │ ├── ExpandThrough.weir │ │ │ │ ├── ExpandWith.weir │ │ │ │ ├── ExpandWithout.weir │ │ │ │ ├── FaceFirst.weir │ │ │ │ ├── FairBit.weir │ │ │ │ ├── FarAndFewBetween.weir │ │ │ │ ├── FastPaste.weir │ │ │ │ ├── FatalOutcome.weir │ │ │ │ ├── FetalPosition.weir │ │ │ │ ├── ForALongTime.weir │ │ │ │ ├── ForAWhile.weir │ │ │ │ ├── ForArgumentsSake.weir │ │ │ │ ├── ForTheMostPart.weir │ │ │ │ ├── FreeRein.weir │ │ │ │ ├── Freezing.weir │ │ │ │ ├── FromTheGetGo.weir │ │ │ │ ├── GildedAge.weir │ │ │ │ ├── GoggleBrand.weir │ │ │ │ ├── GoingTo.weir │ │ │ │ ├── GuineaBissau.weir │ │ │ │ ├── HadOf.weir │ │ │ │ ├── HalfAnHour.weir │ │ │ │ ├── Haphazard.weir │ │ │ │ ├── HeDos.weir │ │ │ │ ├── HeartToHeard.weir │ │ │ │ ├── HiddenIn.weir │ │ │ │ ├── HowMach.weir │ │ │ │ ├── HumanBeings.weir │ │ │ │ ├── HumanLife.weir │ │ │ │ ├── HungerPang.weir │ │ │ │ ├── IAm.weir │ │ │ │ ├── IDo.weir │ │ │ │ ├── ImitateFrom.weir │ │ │ │ ├── InAHurry.weir │ │ │ │ ├── InAWhile.weir │ │ │ │ ├── InAnyWay.weir │ │ │ │ ├── InLieuOf.weir │ │ │ │ ├── InNeedOf.weir │ │ │ │ ├── InOfItself.weir │ │ │ │ ├── InThe.weir │ │ │ │ ├── Initiatively.weir │ │ │ │ ├── Insensitive.weir │ │ │ │ ├── InsteadOf.weir │ │ │ │ ├── Insurmountable.weir │ │ │ │ ├── IsKnownFor.weir │ │ │ │ ├── ItCan.weir │ │ │ │ ├── IveGotTo.weir │ │ │ │ ├── JawDropping.weir │ │ │ │ ├── JustDeserts.weir │ │ │ │ ├── KindOf.weir │ │ │ │ ├── KindRegards.weir │ │ │ │ ├── KindSortOf.weir │ │ │ │ ├── LastButNotLeast.weir │ │ │ │ ├── LastDitch.weir │ │ │ │ ├── LastNight.weir │ │ │ │ ├── LaughOfAt.weir │ │ │ │ ├── LeaveToFor.weir │ │ │ │ ├── LetAlone.weir │ │ │ │ ├── LikeAsIf.weir │ │ │ │ ├── LikeThePlague.weir │ │ │ │ ├── LikeTheresNoTomorrow.weir │ │ │ │ ├── LikelyHood.weir │ │ │ │ ├── LinesOfCode.weir │ │ │ │ ├── LooksLikes.weir │ │ │ │ ├── LowHangingFruit.weir │ │ │ │ ├── ManagerialReins.weir │ │ │ │ ├── MercedesBenzHyphen.weir │ │ │ │ ├── MissingDeterminer.weir │ │ │ │ ├── Monumentous.weir │ │ │ │ ├── MoreThatLikely.weir │ │ │ │ ├── MyHouse.weir │ │ │ │ ├── NeedHelp.weir │ │ │ │ ├── NerveRacking.weir │ │ │ │ ├── NobelPeacePrize.weir │ │ │ │ ├── NotBeAfterNot.weir │ │ │ │ ├── NotIn.weir │ │ │ │ ├── NotTo.weir │ │ │ │ ├── NowWay.weir │ │ │ │ ├── OffTheCuff.weir │ │ │ │ ├── OldWivesTale.weir │ │ │ │ ├── OnFirstGlance.weir │ │ │ │ ├── OnSecondThought.weir │ │ │ │ ├── OnTheSpurOfTheMoment.weir │ │ │ │ ├── OnTopOf.weir │ │ │ │ ├── OnceInAWhile.weir │ │ │ │ ├── OneFellSwoop.weir │ │ │ │ ├── OneHanded.weir │ │ │ │ ├── OutOfSync.weir │ │ │ │ ├── PartsOfSpeech.weir │ │ │ │ ├── PasswordProtectedHyphen.weir │ │ │ │ ├── PeaceOfMind.weir │ │ │ │ ├── PedalToTheMetal.weir │ │ │ │ ├── PerSe.weir │ │ │ │ ├── PointsOfView.weir │ │ │ │ ├── PortAuPrince.weir │ │ │ │ ├── PortoNovo.weir │ │ │ │ ├── PrayingMantis.weir │ │ │ │ ├── QuiteMany.weir │ │ │ │ ├── RainbowColoredHyphen.weir │ │ │ │ ├── RallyToReally.weir │ │ │ │ ├── RapidFire.weir │ │ │ │ ├── RealTrouper.weir │ │ │ │ ├── RedundantIIRC.weir │ │ │ │ ├── RedundantPretty.weir │ │ │ │ ├── RedundantThat.weir │ │ │ │ ├── RifeWith.weir │ │ │ │ ├── RoadMap.weir │ │ │ │ ├── RulesOfThumb.weir │ │ │ │ ├── SameAs.weir │ │ │ │ ├── ScantilyClad.weir │ │ │ │ ├── SendAnEmailTo.weir │ │ │ │ ├── ShutdownVerb.weir │ │ │ │ ├── SimilarLike.weir │ │ │ │ ├── SimpleGrammatical.weir │ │ │ │ ├── SneakingSuspicion.weir │ │ │ │ ├── SomeOfThe.weir │ │ │ │ ├── SomebodyElses.weir │ │ │ │ ├── SoonerOrLater.weir │ │ │ │ ├── SpecialAttention.weir │ │ │ │ ├── SpinalChord.weir │ │ │ │ ├── Starving.weir │ │ │ │ ├── StateOfTheArt.weir │ │ │ │ ├── StatuteOfLimitations.weir │ │ │ │ ├── StrikeChord.weir │ │ │ │ ├── SufficeItToSay.weir │ │ │ │ ├── SupposedTo.weir │ │ │ │ ├── TakeItPersonally.weir │ │ │ │ ├── ThanksALot.weir │ │ │ │ ├── ThatChallenged.weir │ │ │ │ ├── ThatThis.weir │ │ │ │ ├── The.weir │ │ │ │ ├── TheAnother.weir │ │ │ │ ├── TheDifferenceBetween.weir │ │ │ │ ├── TheirToThere.weir │ │ │ │ ├── TheirToTheyre.weir │ │ │ │ ├── ThereToTheir.weir │ │ │ │ ├── TheyToThem.weir │ │ │ │ ├── TheyreToTheir.weir │ │ │ │ ├── ThoughtProcess.weir │ │ │ │ ├── ThreatenVerb.weir │ │ │ │ ├── TickingTimeClock.weir │ │ │ │ ├── ToBackOut.weir │ │ │ │ ├── ToDoHyphen.weir │ │ │ │ ├── ToGreatLengths.weir │ │ │ │ ├── ToLoseTooLoose.weir │ │ │ │ ├── ToSomeDegree.weir │ │ │ │ ├── ToTheMannerBorn.weir │ │ │ │ ├── ToWorryAbout.weir │ │ │ │ ├── TongueInCheek.weir │ │ │ │ ├── Towards.weir │ │ │ │ ├── TrialAndError.weir │ │ │ │ ├── TrueToWord.weir │ │ │ │ ├── TuffEnough.weir │ │ │ │ ├── TurnItOff.weir │ │ │ │ ├── Unless.weir │ │ │ │ ├── VeryKnown.weir │ │ │ │ ├── VeryLess.weir │ │ │ │ ├── WantBe.weir │ │ │ │ ├── WaveFunction.weir │ │ │ │ ├── WellBeing.weir │ │ │ │ ├── WellKept.weir │ │ │ │ ├── WhetYourAppetite.weir │ │ │ │ ├── WillContain.weir │ │ │ │ ├── WithoutOut.weir │ │ │ │ ├── WorstCaseScenario.weir │ │ │ │ ├── WroughtIron.weir │ │ │ │ ├── YeaToYeah.weir │ │ │ │ ├── YehToYeah.weir │ │ │ │ ├── YourPredicateAdjective.weir │ │ │ │ └── mod.rs │ │ │ ├── well_educated.rs │ │ │ ├── were_where.rs │ │ │ ├── whereas.rs │ │ │ ├── whom_subject_of_verb.rs │ │ │ ├── widely_accepted.rs │ │ │ ├── win_prize.rs │ │ │ ├── wish_could.rs │ │ │ ├── wordpress_dotcom.rs │ │ │ ├── worth_to_do.rs │ │ │ ├── would_never_have.rs │ │ │ └── wrong_apostrophe.rs │ │ ├── mask/ │ │ │ ├── mod.rs │ │ │ └── regex_masker.rs │ │ ├── number.rs │ │ ├── offsets.rs │ │ ├── parsers/ │ │ │ ├── collapse_identifiers.rs │ │ │ ├── isolate_english.rs │ │ │ ├── markdown.rs │ │ │ ├── mask.rs │ │ │ ├── mod.rs │ │ │ ├── oops_all_headings.rs │ │ │ ├── org_mode.rs │ │ │ └── plain_english.rs │ │ ├── patterns/ │ │ │ ├── any_pattern.rs │ │ │ ├── derived_from.rs │ │ │ ├── implies_quantity.rs │ │ │ ├── indefinite_article.rs │ │ │ ├── inflection_of_be.rs │ │ │ ├── invert.rs │ │ │ ├── mod.rs │ │ │ ├── modal_verb.rs │ │ │ ├── nominal_phrase.rs │ │ │ ├── prepositional_preceder.rs │ │ │ ├── upos_set.rs │ │ │ ├── whitespace_pattern.rs │ │ │ ├── within_edit_distance.rs │ │ │ ├── word.rs │ │ │ └── word_set.rs │ │ ├── punctuation.rs │ │ ├── render_markdown.rs │ │ ├── span.rs │ │ ├── spell/ │ │ │ ├── dictionary.rs │ │ │ ├── fst_dictionary.rs │ │ │ ├── merged_dictionary.rs │ │ │ ├── mod.rs │ │ │ ├── mutable_dictionary.rs │ │ │ ├── rune/ │ │ │ │ ├── affix_replacement.rs │ │ │ │ ├── attribute_list.rs │ │ │ │ ├── error.rs │ │ │ │ ├── expansion.rs │ │ │ │ ├── matcher.rs │ │ │ │ ├── mod.rs │ │ │ │ └── word_list.rs │ │ │ ├── trie_dictionary.rs │ │ │ ├── word_id.rs │ │ │ └── word_map.rs │ │ ├── sync.rs │ │ ├── thesaurus_helper.rs │ │ ├── title_case.rs │ │ ├── token.rs │ │ ├── token_kind.rs │ │ ├── token_string_ext.rs │ │ ├── vec_ext.rs │ │ ├── weir/ │ │ │ ├── ast.rs │ │ │ ├── error.rs │ │ │ ├── mod.rs │ │ │ ├── optimize.rs │ │ │ └── parsing/ │ │ │ ├── expr.rs │ │ │ ├── mod.rs │ │ │ └── stmt.rs │ │ └── weirpack/ │ │ ├── error.rs │ │ ├── manifest.rs │ │ └── mod.rs │ └── tests/ │ ├── linters.rs │ ├── pos_tags.rs │ ├── run_tests.rs │ ├── snapshot.rs │ ├── test_sources/ │ │ ├── allows_domain_extensions.md │ │ ├── amazon_hostname.md │ │ ├── chinese_lorem_ipsum.md │ │ ├── hex_basic_clean.md │ │ ├── hex_basic_dirty.md │ │ ├── index.org │ │ ├── issue_109.md │ │ ├── issue_109_ext.md │ │ ├── issue_118.md │ │ ├── issue_1581.md │ │ ├── issue_159.md │ │ ├── issue_1873.md │ │ ├── issue_195.md │ │ ├── issue_1988.md │ │ ├── issue_2054.md │ │ ├── issue_2054_clean.md │ │ ├── issue_2151.md │ │ ├── issue_2233.md │ │ ├── issue_2240.md │ │ ├── issue_2246.md │ │ ├── issue_267.md │ │ ├── issue_358.md │ │ ├── lots_of_latin.md │ │ ├── lukas_homework.md │ │ ├── misc_closed_compound_clean.md │ │ ├── obsidian_links.md │ │ ├── pr_452.md │ │ ├── pr_504.md │ │ ├── proper_noun_capitalization.md │ │ ├── statist_localist.md │ │ ├── title_case_clean.md │ │ ├── title_case_errors.md │ │ ├── whack_bullets.md │ │ └── yogurt_british_clean.md │ └── text/ │ ├── Alice's Adventures in Wonderland.md │ ├── Computer science.md │ ├── Difficult sentences.md │ ├── Part-of-speech tagging.md │ ├── Spell.US.md │ ├── Spell.md │ ├── Swear.md │ ├── The Constitution of the United States.md │ ├── The Great Gatsby.md │ ├── linters/ │ │ ├── Alice's Adventures in Wonderland.snap.yml │ │ ├── Computer science.snap.yml │ │ ├── Difficult sentences.snap.yml │ │ ├── Part-of-speech tagging.snap.yml │ │ ├── Spell.US.snap.yml │ │ ├── Spell.snap.yml │ │ ├── Swear.snap.yml │ │ ├── The Constitution of the United States.snap.yml │ │ ├── The Great Gatsby.snap.yml │ │ └── this and that.snap.yml │ ├── tagged/ │ │ ├── Alice's Adventures in Wonderland.md │ │ ├── Computer science.md │ │ ├── Difficult sentences.md │ │ ├── Part-of-speech tagging.md │ │ ├── Spell.US.md │ │ ├── Spell.md │ │ ├── Swear.md │ │ ├── The Constitution of the United States.md │ │ ├── The Great Gatsby.md │ │ └── this and that.md │ └── this and that.md ├── harper-html/ │ ├── Cargo.toml │ ├── src/ │ │ └── lib.rs │ └── tests/ │ ├── run_tests.rs │ └── test_sources/ │ ├── issue_156.html │ ├── issue_541.html │ └── run_on.html ├── harper-ink/ │ ├── Cargo.toml │ ├── src/ │ │ └── lib.rs │ └── tests/ │ ├── run_tests.rs │ └── test_sources/ │ ├── bad.ink │ └── good.ink ├── harper-jjdescription/ │ ├── Cargo.toml │ ├── src/ │ │ └── lib.rs │ └── tests/ │ ├── run_tests.rs │ └── test_sources/ │ ├── complex_verbose_description.txt │ ├── conventional_description.txt │ └── simple_description.txt ├── harper-literate-haskell/ │ ├── Cargo.toml │ ├── src/ │ │ ├── lib.rs │ │ └── masker.rs │ └── tests/ │ ├── run_tests.rs │ └── test_sources/ │ ├── bird_format.lhs │ ├── latex_format.lhs │ └── mixed_format.lhs ├── harper-ls/ │ ├── Cargo.toml │ ├── README.md │ └── src/ │ ├── backend.rs │ ├── config.rs │ ├── diagnostics.rs │ ├── dictionary_io.rs │ ├── document_state.rs │ ├── git_commit_parser.rs │ ├── ignored_lints_io.rs │ ├── io_utils.rs │ ├── main.rs │ └── pos_conv.rs ├── harper-pos-utils/ │ ├── Cargo.toml │ └── src/ │ ├── chunker/ │ │ ├── brill_chunker/ │ │ │ ├── mod.rs │ │ │ └── patch.rs │ │ ├── burn_chunker.rs │ │ ├── cached_chunker.rs │ │ ├── mod.rs │ │ ├── np_extraction.rs │ │ └── upos_freq_dict.rs │ ├── conllu_utils.rs │ ├── lib.rs │ ├── patch_criteria.rs │ ├── tagger/ │ │ ├── brill_tagger/ │ │ │ ├── mod.rs │ │ │ └── patch.rs │ │ ├── error_counter.rs │ │ ├── freq_dict.rs │ │ ├── freq_dict_builder.rs │ │ └── mod.rs │ ├── upos.rs │ └── word_counter.rs ├── harper-python/ │ ├── Cargo.toml │ ├── src/ │ │ └── lib.rs │ └── tests/ │ ├── run_tests.rs │ └── test_sources/ │ ├── comments.py │ ├── docstrings.py │ └── field_docstrings.py ├── harper-stats/ │ ├── Cargo.toml │ ├── README.md │ └── src/ │ ├── lib.rs │ ├── record.rs │ └── summary.rs ├── harper-tex/ │ ├── Cargo.toml │ ├── src/ │ │ ├── lib.rs │ │ └── masker.rs │ └── tests/ │ ├── run_tests.rs │ └── test_sources/ │ ├── city.tex │ ├── clean.tex │ ├── em_dash.tex │ ├── heading.tex │ ├── issue_2835.tex │ ├── many_more_tags.tex │ ├── many_tags.tex │ ├── simple.tex │ └── title.tex ├── harper-thesaurus/ │ ├── Cargo.toml │ ├── build.rs │ ├── clippy.toml │ ├── src/ │ │ ├── lib.rs │ │ └── thesaurus.rs │ ├── thesaurus.txt │ └── word-freq.txt ├── harper-tree-sitter/ │ ├── Cargo.toml │ └── src/ │ └── lib.rs ├── harper-typst/ │ ├── Cargo.toml │ ├── src/ │ │ ├── lib.rs │ │ ├── offset_cursor.rs │ │ └── typst_translator.rs │ └── tests/ │ ├── run_tests.rs │ ├── test_sources/ │ │ ├── complex_document.typ │ │ ├── complex_document_with_spelling_mistakes.typ │ │ ├── contractions.typ │ │ ├── function_with_ignorable_args.typ │ │ ├── issue_1926.typ │ │ ├── issue_399.typ │ │ └── simplified_document.typ │ └── tests.rs ├── harper-wasm/ │ ├── Cargo.toml │ ├── README.md │ └── src/ │ └── lib.rs ├── justfile ├── package.json ├── packages/ │ ├── chrome-plugin/ │ │ ├── .editorconfig │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── app.css │ │ ├── options.html │ │ ├── package.json │ │ ├── playwright.config.ts │ │ ├── popup.html │ │ ├── public/ │ │ │ ├── google-docs-bridge-request-handler.js │ │ │ ├── google-docs-bridge.js │ │ │ └── google-docs-protocol.js │ │ ├── sidepanel.html │ │ ├── src/ │ │ │ ├── PopupState.ts │ │ │ ├── ProtocolClient.ts │ │ │ ├── background/ │ │ │ │ ├── detectDialect.ts │ │ │ │ └── index.ts │ │ │ ├── contentScript/ │ │ │ │ ├── GoogleDocsBridgeClient.ts │ │ │ │ ├── googleDocs.ts │ │ │ │ ├── googleDocsBootstrap.js │ │ │ │ ├── googleDocsLayout.ts │ │ │ │ └── index.ts │ │ │ ├── detectBrowserEngine.ts │ │ │ ├── generateGreeting.ts │ │ │ ├── global.d.ts │ │ │ ├── isSubstack.ts │ │ │ ├── isWordPress.ts │ │ │ ├── manifest.ts │ │ │ ├── options/ │ │ │ │ ├── Options.svelte │ │ │ │ └── index.ts │ │ │ ├── popup/ │ │ │ │ ├── Main.svelte │ │ │ │ ├── Onboarding.svelte │ │ │ │ ├── Popup.svelte │ │ │ │ ├── ReportProblematicLint.svelte │ │ │ │ └── index.ts │ │ │ ├── protocol.ts │ │ │ ├── theme.ts │ │ │ └── zip.js │ │ ├── tests/ │ │ │ ├── draft.spec.ts │ │ │ ├── fixtures.ts │ │ │ ├── github.spec.ts │ │ │ ├── google_docs.spec.ts │ │ │ ├── hn.spec.ts │ │ │ ├── lexical.spec.ts │ │ │ ├── lexical_webcomponent.spec.ts │ │ │ ├── lint-kinds.spec.ts │ │ │ ├── nested_elements.spec.ts │ │ │ ├── pages/ │ │ │ │ ├── github_textarea.html │ │ │ │ ├── lexical_webcomponent.html │ │ │ │ ├── nested_elements.html │ │ │ │ ├── quill_simple.html │ │ │ │ ├── simple_inputs_disabled.html │ │ │ │ └── simple_textarea.html │ │ │ ├── prosemirror.spec.ts │ │ │ ├── quill.spec.ts │ │ │ ├── review_banner.spec.ts │ │ │ ├── simple_inputs_disabled.spec.ts │ │ │ ├── simple_textarea.spec.ts │ │ │ ├── slate.spec.ts │ │ │ ├── testUtils.ts │ │ │ └── typst.spec.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── components/ │ │ ├── .gitignore │ │ ├── .npmrc │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app.d.ts │ │ │ ├── app.html │ │ │ ├── lib/ │ │ │ │ ├── Button.svelte │ │ │ │ ├── Card.svelte │ │ │ │ ├── Collapsible.svelte │ │ │ │ ├── Input.svelte │ │ │ │ ├── Link.svelte │ │ │ │ ├── Select.svelte │ │ │ │ ├── Textarea.svelte │ │ │ │ ├── index.ts │ │ │ │ └── styles.css │ │ │ └── routes/ │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ └── layout.css │ │ ├── svelte.config.js │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── harper.js/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── docs.sh │ │ ├── examples/ │ │ │ ├── commonjs-simple/ │ │ │ │ ├── README.md │ │ │ │ ├── index.js │ │ │ │ └── package.json │ │ │ └── raw-web/ │ │ │ ├── README.md │ │ │ └── index.html │ │ ├── package.json │ │ ├── renderPage.js │ │ ├── src/ │ │ │ ├── Linter.bench.ts │ │ │ ├── Linter.test.ts │ │ │ ├── Linter.ts │ │ │ ├── LocalLinter.ts │ │ │ ├── Serializer.test.ts │ │ │ ├── Serializer.ts │ │ │ ├── Summary.ts │ │ │ ├── WorkerLinter/ │ │ │ │ ├── index.ts │ │ │ │ ├── shims.ts │ │ │ │ └── worker.ts │ │ │ ├── binary.ts │ │ │ ├── main.ts │ │ │ ├── utils.ts │ │ │ ├── weirpack.test.ts │ │ │ └── weirpack.ts │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── lint-framework/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── assets/ │ │ │ │ ├── bookDownSvg.ts │ │ │ │ └── hints.json │ │ │ ├── index.ts │ │ │ └── lint/ │ │ │ ├── Box.ts │ │ │ ├── Highlights.ts │ │ │ ├── LintFramework.ts │ │ │ ├── PopupHandler.ts │ │ │ ├── RenderBox.ts │ │ │ ├── SourceElement.ts │ │ │ ├── SuggestionBox.ts │ │ │ ├── TextFieldRange.ts │ │ │ ├── computeLintBoxes.ts │ │ │ ├── domUtils.ts │ │ │ ├── editorUtils.ts │ │ │ ├── lintKindColor.ts │ │ │ ├── unpackLint.ts │ │ │ └── utils.ts │ │ ├── tsconfig.json │ │ └── vite.config.ts │ ├── obsidian-plugin/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── HarperSettingTab.ts │ │ │ ├── State.test.ts │ │ │ ├── State.ts │ │ │ ├── index.ts │ │ │ ├── lint.test.ts │ │ │ ├── lint.ts │ │ │ ├── lintKindColor.test.ts │ │ │ ├── lintKindColor.ts │ │ │ ├── textUtils.test.ts │ │ │ └── textUtils.ts │ │ └── vite.config.ts │ ├── vscode-plugin/ │ │ ├── .gitignore │ │ ├── .vscodeignore │ │ ├── README.md │ │ ├── development-guide.md │ │ ├── esbuild.cjs │ │ ├── package.json │ │ ├── src/ │ │ │ ├── extension.ts │ │ │ └── tests/ │ │ │ ├── fixtures/ │ │ │ │ ├── integration.md │ │ │ │ └── languages/ │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── c.c │ │ │ │ ├── cpp.cpp │ │ │ │ ├── cpp.h │ │ │ │ ├── csharp.cs │ │ │ │ ├── dart.dart │ │ │ │ ├── git-commit │ │ │ │ ├── go.go │ │ │ │ ├── groovy.groovy │ │ │ │ ├── haskell.hs │ │ │ │ ├── html.html │ │ │ │ ├── java.java │ │ │ │ ├── javascript.js │ │ │ │ ├── javascriptreact.jsx │ │ │ │ ├── latex.tex │ │ │ │ ├── literate-haskell.lhs │ │ │ │ ├── lua.lua │ │ │ │ ├── nix.nix │ │ │ │ ├── php.php │ │ │ │ ├── plaintext │ │ │ │ ├── plaintext.txt │ │ │ │ ├── powershell.ps1 │ │ │ │ ├── python.py │ │ │ │ ├── ruby.rb │ │ │ │ ├── rust.rs │ │ │ │ ├── shellscript │ │ │ │ ├── shellscript.bash │ │ │ │ ├── shellscript.sh │ │ │ │ ├── solidity.sol │ │ │ │ ├── swift.swift │ │ │ │ ├── toml.toml │ │ │ │ ├── typescript.ts │ │ │ │ ├── typescriptreact.tsx │ │ │ │ ├── typst.typ │ │ │ │ └── zig.zig │ │ │ ├── runTests.ts │ │ │ └── suite/ │ │ │ ├── helper.ts │ │ │ ├── index.ts │ │ │ ├── integration.test.ts │ │ │ └── languages.test.ts │ │ └── tsconfig.json │ ├── web/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── README.md │ │ ├── demo_wp_blueprint.json │ │ ├── drizzle/ │ │ │ ├── 0000_cute_zuras.sql │ │ │ ├── 0001_blushing_corsair.sql │ │ │ ├── 0002_blushing_chameleon.sql │ │ │ └── meta/ │ │ │ ├── 0000_snapshot.json │ │ │ ├── 0001_snapshot.json │ │ │ ├── 0002_snapshot.json │ │ │ └── _journal.json │ │ ├── drizzle.config.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app.css │ │ │ ├── app.d.ts │ │ │ ├── app.html │ │ │ ├── brace.d.ts │ │ │ ├── hooks.server.ts │ │ │ ├── lib/ │ │ │ │ ├── GitHubClient.ts │ │ │ │ ├── components/ │ │ │ │ │ ├── AutomatticLogo.svelte │ │ │ │ │ ├── ChromeLogo.svelte │ │ │ │ │ ├── CodeLogo.svelte │ │ │ │ │ ├── DefaultNeovimConfig.svelte │ │ │ │ │ ├── EdgeLogo.svelte │ │ │ │ │ ├── Editor.svelte │ │ │ │ │ ├── EmacsLogo.svelte │ │ │ │ │ ├── FirefoxLogo.svelte │ │ │ │ │ ├── GitHubLogo.svelte │ │ │ │ │ ├── Graph.svelte │ │ │ │ │ ├── GutterCenter.svelte │ │ │ │ │ ├── HelixLogo.svelte │ │ │ │ │ ├── Isolate.svelte │ │ │ │ │ ├── LazyEditor.svelte │ │ │ │ │ ├── LintCard.svelte │ │ │ │ │ ├── LintKindChart.svelte │ │ │ │ │ ├── LintSidebar.svelte │ │ │ │ │ ├── Logo.svelte │ │ │ │ │ ├── NeovimLogo.svelte │ │ │ │ │ ├── ObsidianLogo.svelte │ │ │ │ │ ├── Section.svelte │ │ │ │ │ ├── SublimeLogo.svelte │ │ │ │ │ ├── Testimonial.svelte │ │ │ │ │ ├── TestimonialCollection.svelte │ │ │ │ │ ├── Toasts.svelte │ │ │ │ │ ├── WeirStudioFileExplorer.svelte │ │ │ │ │ ├── WeirStudioStart.svelte │ │ │ │ │ ├── WeirStudioWorkspace.svelte │ │ │ │ │ ├── WordPressLogo.svelte │ │ │ │ │ ├── ZedLogo.svelte │ │ │ │ │ └── icons/ │ │ │ │ │ ├── CheckIcon.svelte │ │ │ │ │ ├── ChevronLeftIcon.svelte │ │ │ │ │ ├── ChevronRightIcon.svelte │ │ │ │ │ ├── CloseIcon.svelte │ │ │ │ │ ├── DownloadIcon.svelte │ │ │ │ │ ├── EditIcon.svelte │ │ │ │ │ ├── PlayIcon.svelte │ │ │ │ │ ├── PlusIcon.svelte │ │ │ │ │ └── TrashIcon.svelte │ │ │ │ └── db/ │ │ │ │ ├── index.ts │ │ │ │ ├── models/ │ │ │ │ │ ├── ProblematicLints.ts │ │ │ │ │ └── UninstallFeedback.ts │ │ │ │ └── schema.ts │ │ │ └── routes/ │ │ │ ├── +layout.svelte │ │ │ ├── +page.svelte │ │ │ ├── api/ │ │ │ │ ├── problematic-lints/ │ │ │ │ │ └── +server.ts │ │ │ │ └── uninstall-feedback/ │ │ │ │ └── +server.ts │ │ │ ├── cache-healthcheck/ │ │ │ │ └── +server.ts │ │ │ ├── docs/ │ │ │ │ ├── about/ │ │ │ │ │ ├── +page.md │ │ │ │ │ └── +page.ts │ │ │ │ ├── contributors/ │ │ │ │ │ ├── architecture/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── author-a-rule/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── brill/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── chrome-extension/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── committing/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── dictionary/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── environment/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── faq/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── introduction/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── local-stats/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── obsidian/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── review/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── tests/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── visual-studio-code/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ └── wordpress/ │ │ │ │ │ └── +page.md │ │ │ │ ├── harperjs/ │ │ │ │ │ ├── CDN/ │ │ │ │ │ │ ├── +page.md │ │ │ │ │ │ └── example/ │ │ │ │ │ │ └── +server.ts │ │ │ │ │ ├── configurerules/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── introduction/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── linting/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── node/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ └── spans/ │ │ │ │ │ └── +page.md │ │ │ │ ├── integrations/ │ │ │ │ │ ├── chrome-extension/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── emacs/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── firefox-extension/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── helix/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── language-server/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── neovim/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── obsidian/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── sublime-text/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── visual-studio-code/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ ├── wordpress/ │ │ │ │ │ │ └── +page.md │ │ │ │ │ └── zed/ │ │ │ │ │ └── +page.md │ │ │ │ ├── rules/ │ │ │ │ │ └── +page.svelte │ │ │ │ └── weir/ │ │ │ │ └── +page.md │ │ │ ├── editor/ │ │ │ │ ├── +page.svelte │ │ │ │ └── +page.ts │ │ │ ├── install-browser-extension/ │ │ │ │ └── +page.svelte │ │ │ ├── languagedetection/ │ │ │ │ └── +page.svelte │ │ │ ├── latestversion/ │ │ │ │ └── +server.ts │ │ │ ├── presentation/ │ │ │ │ └── +page.svelte │ │ │ ├── report-problematic-lint/ │ │ │ │ └── +page.svelte │ │ │ ├── request-browser-support/ │ │ │ │ └── +page.svelte │ │ │ ├── stats/ │ │ │ │ └── +page.svelte │ │ │ ├── titlecase/ │ │ │ │ └── +page.svelte │ │ │ ├── uninstall-browser-extension/ │ │ │ │ └── +page.svelte │ │ │ ├── weir/ │ │ │ │ └── studio/ │ │ │ │ └── +page.svelte │ │ │ └── wpdemo/ │ │ │ └── +page.server.ts │ │ ├── static/ │ │ │ ├── browserconfig.xml │ │ │ └── site.webmanifest │ │ ├── svelte.config.js │ │ ├── tailwind.config.js │ │ ├── tsconfig.json │ │ └── vite.config.ts │ └── wordpress-plugin/ │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── harper.php │ ├── package.json │ └── src/ │ └── harper/ │ ├── Box.ts │ ├── DataBlock.ts │ ├── DialectSelectRow.tsx │ ├── Highlighter.tsx │ ├── LintList.tsx │ ├── LintListItem.tsx │ ├── LintSettingList.tsx │ ├── LintSettingRow.tsx │ ├── LinterProvider.tsx │ ├── Logo.jsx │ ├── RichText.ts │ ├── SidebarControl.tsx │ ├── SidebarTabContainer.tsx │ ├── SuggestionControl.tsx │ ├── block.json │ ├── domUtils.ts │ ├── index.css │ ├── index.tsx │ ├── lintUtils.ts │ ├── useDialect.ts │ ├── useIgnoredLintState.ts │ ├── useLintBoxes.ts │ ├── useLintConfig.ts │ ├── usePersonalDictionary.ts │ └── useToggle.ts ├── pnpm-workspace.yaml ├── rust-toolchain.toml ├── rustfmt.toml └── weir_rules/ ├── AtLeasToLeast.weir ├── BelieveInPreposition.weir ├── BetterOffPhrase.weir ├── BluRayHyphen.weir ├── CauseItIsBecause.weir ├── ColdModalTypo.weir ├── DoubleCheckHyphen.weir ├── EachOthersPossessive.weir ├── EasyGoingCompoundAdjective.weir ├── ExistentialPluralAgreement.weir ├── ExitedExcitedContext.weir ├── FirstPersonModifierHyphen.weir ├── FullWithToOf.weir ├── HaveNegNoAny.weir ├── InAdjectiveMatter.weir ├── IntroCueCommaBeforeThanks.weir ├── IsBeenAuxSequence.weir ├── ItTimeAuxiliary.weir ├── KnowNothingVerb.weir ├── LookInto.weir ├── MakeupCompoundNoun.weir ├── OvertimeCompoundNoun.weir ├── PleasRequestVerb.weir ├── PostItNoteHyphen.weir ├── PrincipleToPrincipalRoleNoun.weir ├── RelayOnForRely.weir ├── SayTellYou.weir ├── SneakPeekPreview.weir ├── TheWhetherWeather.weir ├── ThereAfterCompound.weir ├── ThereMissingIsClause.weir ├── ThieveNoun.weir ├── ThinkKnowOff.weir ├── TomorrowPossessiveModifier.weir ├── WasComprisedOf.weir ├── WokVerbTypo.weir └── YourOutClauseAgreement.weir ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ target build *.pdf node_modules ================================================ FILE: .editorconfig ================================================ root = true [*] end_of_line = lf ================================================ FILE: .envrc ================================================ use flake ================================================ FILE: .gitattributes ================================================ * text=auto eol=lf quill_simple.html linguist-generated github_textarea.html linguist-generated ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Platform** What platform has the issue? Is it in Obsidian, Neovim, Visual Studio Code, Chrome, or Firefox? Something else? **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/report-false-positive.md ================================================ --- name: Report False Positive about: Harper flagged something that's actually correct title: '' labels: bug, harper-core, linting, false-positive --- **What got flagged?** The text that was incorrectly flagged. **Why is this incorrect?** Brief explanation. **Example of correct usage:** [Your example here] ================================================ FILE: .github/ISSUE_TEMPLATE/report-grammatical-error.md ================================================ --- name: Report Grammatical Error about: Harper missed a grammatical error title: '' labels: enhancement, harper-core, linting --- **The Error** Description of the error. **Examples (2-3):** 1. 2. **References** Any grammar rules or resources that support this. **Potential Edge Cases** When might this not apply? ================================================ FILE: .github/ISSUE_TEMPLATE/suggest-a-feature.md ================================================ --- name: Suggest a Feature about: Propose a new feature title: '' labels: enhancement --- **What problem does this solve?** Brief description. **Proposed Solution** How should it work? **Examples** Show, don't tell. **Component** - [ ] Core engine - [ ] Plugin/Extension - [ ] Other: _____ **Additional Context** Any other relevant info. ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: "cargo" directory: "/" schedule: interval: "weekly" - package-ecosystem: "npm" directory: "/" schedule: interval: "weekly" ================================================ FILE: .github/pull_request_template.md ================================================ # Issues # Description # Demo # How Has This Been Tested? # Checklist - [ ] I have performed a self-review of my own code - [ ] I have added tests to cover my changes ================================================ FILE: .github/workflows/binaries.yml ================================================ name: Binaries on: push: branches: ["master"] tags: ["v*"] merge_group: jobs: binaries: name: ${{ matrix.platform.project }} - ${{ matrix.platform.release_for }} if: github.event.pull_request.draft == false strategy: matrix: platform: - release_for: Windows-x86_64 os: windows-latest target: x86_64-pc-windows-msvc project: harper-ls bin: harper-ls.exe name: harper-ls-x86_64-pc-windows-msvc.zip command: build - release_for: macOS-x86_64 os: macOS-latest target: x86_64-apple-darwin project: harper-ls bin: harper-ls name: harper-ls-x86_64-apple-darwin.tar.gz command: build - release_for: macOS-aarch64 os: macOS-latest target: aarch64-apple-darwin project: harper-ls bin: harper-ls name: harper-ls-aarch64-apple-darwin.tar.gz command: build - release_for: Linux-x86_64-GNU os: ubuntu-latest target: x86_64-unknown-linux-gnu project: harper-ls bin: harper-ls name: harper-ls-x86_64-unknown-linux-gnu.tar.gz command: build - release_for: Linux-aarch64-GNU os: ubuntu-latest target: aarch64-unknown-linux-gnu project: harper-ls bin: harper-ls name: harper-ls-aarch64-unknown-linux-gnu.tar.gz command: build - release_for: Linux-x86_64-musl os: ubuntu-latest target: x86_64-unknown-linux-musl project: harper-ls bin: harper-ls name: harper-ls-x86_64-unknown-linux-musl.tar.gz command: build - release_for: Linux-aarch64-musl os: ubuntu-latest target: aarch64-unknown-linux-musl project: harper-ls bin: harper-ls name: harper-ls-aarch64-unknown-linux-musl.tar.gz command: build - release_for: Windows-x86_64 os: windows-latest target: x86_64-pc-windows-msvc project: harper-cli bin: harper-cli.exe name: harper-cli-x86_64-pc-windows-msvc.zip command: build - release_for: macOS-x86_64 os: macOS-latest target: x86_64-apple-darwin project: harper-cli bin: harper-cli name: harper-cli-x86_64-apple-darwin.tar.gz command: build - release_for: macOS-aarch64 os: macOS-latest target: aarch64-apple-darwin project: harper-cli bin: harper-cli name: harper-cli-aarch64-apple-darwin.tar.gz command: build - release_for: Linux-x86_64-GNU os: ubuntu-latest target: x86_64-unknown-linux-gnu project: harper-cli bin: harper-cli name: harper-cli-x86_64-unknown-linux-gnu.tar.gz command: build - release_for: Linux-aarch64-GNU os: ubuntu-latest target: aarch64-unknown-linux-gnu project: harper-cli bin: harper-cli name: harper-cli-aarch64-unknown-linux-gnu.tar.gz command: build - release_for: Linux-x86_64-musl os: ubuntu-latest target: x86_64-unknown-linux-musl project: harper-cli bin: harper-cli name: harper-cli-x86_64-unknown-linux-musl.tar.gz command: build - release_for: Linux-aarch64-musl os: ubuntu-latest target: aarch64-unknown-linux-musl project: harper-cli bin: harper-cli name: harper-cli-aarch64-unknown-linux-musl.tar.gz command: build runs-on: ${{ matrix.platform.os }} steps: - name: Checkout uses: actions/checkout@v4 - name: Rust Cache uses: Swatinem/rust-cache@v2.7.8 - name: Build binary uses: houseabsolute/actions-rust-cross@v1 with: command: ${{ matrix.platform.command }} target: ${{ matrix.platform.target }} args: "--locked --release --bin ${{ matrix.platform.project }}" force-use-cross: ${{ matrix.platform.os == 'ubuntu-latest' }} strip: true - name: Package as archive shell: bash run: | cd target/${{ matrix.platform.target }}/release if [[ "${{ matrix.platform.os }}" == "windows-latest" ]]; then 7z a ../../../${{ matrix.platform.name }} ${{ matrix.platform.bin }} else tar czvf ../../../${{ matrix.platform.name }} ${{ matrix.platform.bin }} fi cd - - name: Upload Artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.platform.bin }}-${{ matrix.platform.target }} path: ${{ matrix.platform.name }} - name: Release artifacts if: startsWith(github.ref, 'refs/tags/v') uses: ncipollo/release-action@v1 with: artifacts: ${{ matrix.platform.name }} allowUpdates: true draft: true ================================================ FILE: .github/workflows/build_web.yml ================================================ name: Build Web on: push: branches: ["master", "web-prod"] pull_request: branches: ["master"] merge_group: jobs: build-web: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup node uses: actions/setup-node@v4 with: node-version-file: ".node-version" - name: Retrieve version after install id: nodenv run: echo "node-version=$(node -v | sed 's/^v//')" >> $GITHUB_OUTPUT - uses: redhat-actions/buildah-build@v2 with: image: web containerfiles: | Dockerfile build-args: | NODE_VERSION=${{ steps.nodenv.outputs.node-version }}-slim extra-args: | --ulimit nofile=65536:65536 ================================================ FILE: .github/workflows/chrome_plugin.yml ================================================ name: Chrome Plugin on: push: branches: ["master"] tags: ["v*"] pull_request: branches: ["master"] merge_group: env: CARGO_TERM_COLOR: always jobs: chrome-plugin: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v2 - uses: actions/setup-node@v4 with: node-version-file: ".node-version" - name: Enable Corepack run: corepack enable - uses: cargo-bins/cargo-binstall@main - name: Install `wasm-pack` run: cargo binstall wasm-pack --force --no-confirm - name: Build Chrome Plugin run: just build-chrome-plugin - name: Build Firefox Plugin run: just build-firefox-plugin - name: Upload Chrome extension uses: actions/upload-artifact@v4 with: name: harper-chrome-plugin.zip path: "packages/chrome-plugin/package/harper-chrome-plugin.zip" - name: Upload Firefox extension uses: actions/upload-artifact@v4 with: name: harper-firefox-plugin.zip path: "packages/chrome-plugin/package/harper-firefox-plugin.zip" - name: Release artifacts uses: ncipollo/release-action@v1 if: startsWith(github.ref, 'refs/tags/v') with: artifacts: "packages/chrome-plugin/package/*.zip" allowUpdates: true draft: true ================================================ FILE: .github/workflows/just_checks.yml ================================================ name: Just Checks on: push: branches: ["master", "web-prod"] pull_request: branches: ["master"] merge_group: env: CARGO_TERM_COLOR: always jobs: just-checks: runs-on: ubuntu-latest name: just ${{ matrix.task }} strategy: matrix: task: [ check-rust, check-js, test-rust, test-harperjs, test-vscode, test-chrome-plugin, test-firefox-plugin, test-obsidian, ] steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v2 - name: Install pnpm uses: pnpm/action-setup@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 with: components: rustfmt,clippy - name: Install Node.js uses: actions/setup-node@v4 with: node-version-file: ".node-version" - name: Enable Corepack run: corepack enable - name: Rust Cache uses: Swatinem/rust-cache@v2.7.8 - uses: cargo-bins/cargo-binstall@main - name: Install `wasm-pack` run: cargo binstall wasm-pack --force --no-confirm - name: Install `cargo hack` run: cargo binstall cargo-hack --force --no-confirm - name: Run `${{ matrix.task }}` run: just ${{ matrix.task }} ================================================ FILE: .github/workflows/stale.yml ================================================ # Adapted from [Jeff Geerling's Stale Workflow](https://github.com/geerlingguy/mac-dev-playbook/blob/719de3569804fcf4974fc3a14f46f3ebb92989b2/.github/workflows/stale.yml) --- name: Close inactive issues "on": schedule: - cron: "0 2 * * *" jobs: close-issues: runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: - uses: actions/stale@v10 with: days-before-stale: 60 days-before-close: 14 exempt-issue-labels: bug,pinned,security,planned exempt-pr-labels: bug,pinned,security,planned stale-issue-label: "stale" stale-pr-label: "stale" stale-issue-message: | This issue has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 14 days. Thank you for your contribution! close-issue-message: | This issue has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details. stale-pr-message: | This pr has been marked 'stale' due to lack of recent activity. If there is no further activity, the issue will be closed in another 14 days. Thank you for your contribution! close-pr-message: | This pr has been closed due to inactivity. If you feel this is in error, please reopen the issue or file a new issue with the relevant details. repo-token: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/vscode_plugin.yml ================================================ name: VS Code Plugin on: push: branches: ["master"] tags: ["v*"] merge_group: jobs: vscode-plugin: name: ${{ matrix.platform.code_target }} if: github.event.pull_request.draft == false strategy: matrix: platform: - os: windows-latest rust_target: x86_64-pc-windows-msvc code_target: win32-x64 - os: windows-latest rust_target: aarch64-pc-windows-msvc code_target: win32-arm64 - os: macOS-latest rust_target: x86_64-apple-darwin code_target: darwin-x64 - os: macOS-latest rust_target: aarch64-apple-darwin code_target: darwin-arm64 - os: ubuntu-latest rust_target: x86_64-unknown-linux-gnu code_target: linux-x64 - os: ubuntu-latest rust_target: aarch64-unknown-linux-gnu code_target: linux-arm64 - os: ubuntu-latest rust_target: armv7-unknown-linux-gnueabihf code_target: linux-armhf - os: ubuntu-latest rust_target: x86_64-unknown-linux-musl code_target: alpine-x64 - os: ubuntu-latest rust_target: aarch64-unknown-linux-musl code_target: alpine-arm64 runs-on: ${{ matrix.platform.os }} steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v2 - uses: actions/setup-node@v4 with: node-version-file: ".node-version" - name: Enable Corepack run: corepack enable - name: Build harper-ls uses: houseabsolute/actions-rust-cross@v1 with: target: ${{ matrix.platform.rust_target }} args: "--locked --release --bin harper-ls" force-use-cross: ${{ matrix.platform.os == 'ubuntu-latest' }} strip: true - name: Package extension id: package_extension shell: bash run: | bin_dir="packages/vscode-plugin/bin" release_dir="target/${{ matrix.platform.rust_target }}/release" mkdir "$bin_dir" if [[ "${{ matrix.platform.os }}" == "windows-latest" ]]; then cp "${release_dir}/harper-ls.exe" "$bin_dir" else cp "${release_dir}/harper-ls" "$bin_dir" fi just package-vscode ${{ matrix.platform.code_target }} echo artifact=$(echo packages/vscode-plugin/*.vsix) >> $GITHUB_OUTPUT - name: Release artifacts if: startsWith(github.ref, 'refs/tags/v') uses: ncipollo/release-action@v1 with: artifacts: "./packages/vscode-plugin/*.vsix" allowUpdates: true draft: true - name: Publish to OpenVSX if: startsWith(github.ref, 'refs/tags/v') uses: HaaLeo/publish-vscode-extension@v1 with: pat: ${{ secrets.OPEN_VSX_TOKEN }} packagePath: "./packages/vscode-plugin/" extensionFile: ${{ steps.package_extension.outputs.artifact }} skipDuplicate: true - name: Publish to the Visual Studio Marketplace if: startsWith(github.ref, 'refs/tags/v') uses: HaaLeo/publish-vscode-extension@v1 with: pat: ${{ secrets.VS_MARKETPLACE_TOKEN }} packagePath: "./packages/vscode-plugin/" extensionFile: ${{ steps.package_extension.outputs.artifact }} registryUrl: https://marketplace.visualstudio.com ================================================ FILE: .github/workflows/wp_plugin.yml ================================================ name: WordPress Plugin on: push: branches: ["master"] tags: ["v*"] pull_request: branches: ["master"] merge_group: env: CARGO_TERM_COLOR: always jobs: wp-plugin: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v2 - uses: actions/setup-node@v4 with: node-version-file: ".node-version" - name: Enable Corepack run: corepack enable - uses: cargo-bins/cargo-binstall@main - name: Install wasm-pack run: cargo binstall wasm-pack --force --no-confirm - name: Build run: just build-wp - name: Upload artifact uses: actions/upload-artifact@v4 with: name: harper.zip path: packages/wordpress-plugin/harper.zip - name: Draft GitHub release if: startsWith(github.ref, 'refs/tags/v') uses: ncipollo/release-action@v1 with: artifacts: packages/wordpress-plugin/harper.zip allowUpdates: true draft: true ================================================ FILE: .gitignore ================================================ target build .idea .vscode .DS_Store *.pdf node_modules mariadb_data # Ignore direnv files .direnv/* ================================================ FILE: .node-version ================================================ lts/* ================================================ FILE: .npmrc ================================================ registry=https://registry.npmjs.org ================================================ FILE: AGENTS.md ================================================ # Harper Docs Map for Agents This repository’s documentation site is powered by Vite + SvelteKit + SveltePress. Use `packages/web/vite.config.ts` as the source of truth for documentation scope: - Sidebar and important doc routes are defined in `packages/web/vite.config.ts`. - Route `/docs/...` maps to `packages/web/src/routes/docs/...`. - Most docs are in `+page.md`; some are `+page.svelte` or route helpers. If you're working on the Harper repository itself, please pay special attention to the `contributors/*` pages. Importantly, all of the tools available in this repository are available via `just`. To learn more, run `just --list`. ## Read First 1. `packages/web/vite.config.ts`: Sidebar source of truth and canonical map of important docs routes. 2. `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context. 3. `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples. 4. `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions). 5. `packages/web/src/routes/docs/contributors/introduction/+page.md`: Entry point for contributors and links to deeper contributor docs. ## Core Documentation Directories - `packages/web/src/routes/docs/about` - `packages/web/src/routes/docs/weir` - `packages/web/src/routes/docs/rules` - `packages/web/src/routes/docs/integrations` - `packages/web/src/routes/docs/harperjs` - `packages/web/src/routes/docs/contributors` ## Route Prefix to File Prefix - `/docs/about` -> `packages/web/src/routes/docs/about/+page.md` - `/docs/weir` -> `packages/web/src/routes/docs/weir/+page.md` - `/docs/rules` -> `packages/web/src/routes/docs/rules/+page.svelte` - `/docs/integrations/*` -> `packages/web/src/routes/docs/integrations/*/+page.md` - `/docs/harperjs/*` -> `packages/web/src/routes/docs/harperjs/*/+page.md` - `/docs/contributors/*` -> `packages/web/src/routes/docs/contributors/*/+page.md` ## Files Listed in the Sidebar (Local) - `packages/web/src/routes/docs/about/+page.md`: High-level product overview, privacy model, versioning policy, and ecosystem context. - `packages/web/src/routes/docs/weir/+page.md`: Weir rule language reference with syntax, expression types, and examples. Very important if you're asked to write a Weir rule. - `packages/web/src/routes/docs/rules/+page.svelte`: Live/generated rule catalog (rule names, defaults, and descriptions). - `packages/web/src/routes/docs/integrations/obsidian/+page.md`: Obsidian plugin overview, privacy/value comparison, installation, and support links. - `packages/web/src/routes/docs/integrations/chrome-extension/+page.md`: End-user Chrome extension overview and install link. - `packages/web/src/routes/docs/integrations/firefox-extension/+page.md`: End-user Firefox extension overview and install link. - `packages/web/src/routes/docs/integrations/wordpress/+page.md`: Current WordPress guidance, including migration recommendation to Chrome extension and legacy plugin status. - `packages/web/src/routes/docs/integrations/language-server/+page.md`: `harper-ls` install methods, dictionaries, code actions, ignore comments, and full configuration reference. - `packages/web/src/routes/docs/integrations/visual-studio-code/+page.md`: VS Code extension install, command list, and settings reference. - `packages/web/src/routes/docs/integrations/neovim/+page.md`: Neovim setup using `harper-ls`, plus optional and common config tweaks. - `packages/web/src/routes/docs/integrations/helix/+page.md`: Helix setup using `harper-ls`, plus optional and common config tweaks. - `packages/web/src/routes/docs/integrations/emacs/+page.md`: Emacs setup using `harper-ls`, plus optional and common config tweaks. - `packages/web/src/routes/docs/integrations/zed/+page.md`: Zed extension entry point and link to canonical extension README. - `packages/web/src/routes/docs/integrations/sublime-text/+page.md`: Sublime Text setup with `harper-ls` and LSP package configuration. - `packages/web/src/routes/docs/harperjs/introduction/+page.md`: `harper.js` mission, package overview, and installation starting point. - `packages/web/src/routes/docs/harperjs/linting/+page.md`: Core `harper.js` lint workflow and linter usage patterns. - `packages/web/src/routes/docs/harperjs/spans/+page.md`: Explains span objects and how to use them to locate/handle lint ranges. - `packages/web/src/routes/docs/harperjs/configurerules/+page.md`: How to programmatically read and set `LintConfig` to enable/disable rules. - `packages/web/src/routes/docs/harperjs/node/+page.md`: Node.js-specific usage notes, especially `LocalLinter` vs `WorkerLinter`. - `packages/web/src/routes/docs/harperjs/CDN/+page.md`: Browser/CDN usage via unpkg and ESM import patterns. - `packages/web/src/routes/docs/contributors/introduction/+page.md`: Contributor onboarding overview and links to architecture/testing/rule-authoring docs. - `packages/web/src/routes/docs/contributors/environment/+page.md`: Local development environment setup across Rust, Node/pnpm, and optional Nix shell. - `packages/web/src/routes/docs/contributors/committing/+page.md`: Commit message conventions and commit hygiene requirements. - `packages/web/src/routes/docs/contributors/architecture/+page.md`: System architecture and roles of core components like `harper-core`, `harper-ls`, and `harper.js`. - `packages/web/src/routes/docs/contributors/dictionary/+page.md`: Process for adding or updating curated dictionary entries. - `packages/web/src/routes/docs/contributors/tests/+page.md`: Test-suite strategy, quality/performance focus, and related testing references. - `packages/web/src/routes/docs/contributors/author-a-rule/+page.md`: Step-by-step workflow for implementing and testing new grammar rules. - `packages/web/src/routes/docs/contributors/visual-studio-code/+page.md`: How to run, debug, test, and package the VS Code extension locally. - `packages/web/src/routes/docs/contributors/chrome-extension/+page.md`: Internal architecture and local development notes for the browser extensions. - `packages/web/src/routes/docs/contributors/wordpress/+page.md`: How to build and run the WordPress plugin locally. - `packages/web/src/routes/docs/contributors/obsidian/+page.md`: Obsidian-plugin contributor workflow and plugin-specific constraints. - `packages/web/src/routes/docs/contributors/review/+page.md`: PR reviewer playbook, including ways to fetch artifacts and test patches locally. - `packages/web/src/routes/docs/contributors/local-stats/+page.md`: Local stats logging model, `stats.txt` format, locations, and privacy behavior. - `packages/web/src/routes/docs/contributors/brill/+page.md`: Brief explanation of Harper’s Brill-tagging approach and further reading link. - `packages/web/src/routes/docs/contributors/faq/+page.md`: Contributor FAQ for conceptual distinctions (for example `Linter` vs `PatternLinter`). ## Documentation Route Helpers (Non-`+page.md`) - `packages/web/src/routes/docs/about/+page.ts`: Route behavior helper (`ssr = false`) for the About page. - `packages/web/src/routes/docs/harperjs/CDN/example/+server.ts`: Serves the HTML example used by the `harper.js` CDN documentation page. ## External Sidebar Targets (No Local Source File) - `https://docs.rs/harper-core/latest/harper_core/` - `/docs/harperjs/ref/index.html` (generated API reference target) ## Projects Contained in This Repository - `harper-core`: The core grammar checking engine. This is a dependency to pretty much everything related to Harper. - `harper-ls`: A Language Server compatible with a number of text editors, including Neovim, Zed, and Helix. See above linked documentation for more details. - `harper-cli`: A command-line binary for debugging Harper's core engine and markup language support. - `harper-comments`: Provides parsers for a number of programming languages to support linting their comments. - `harper-wasm`: The WebAssembly build target that powers browser and JavaScript integrations such as `harper.js`. - `packages/lint-framework`: A package containing the tooling necessary to read/write/highlight text on the web for the purpose of linting. - `packages/components`: Shared Svelte component package used by web-facing packages. - `packages/web`: The Harper website, including documentation and a live demo that uses the `lint-framework`. - `packages/harper.js`: The JavaScript package that uses `harper-wasm` to lint text from websites or Node.js processes. - `packages/chrome-plugin`: The Harper Chrome Extension - uses the `lint-framework`. Also support Firefox. - `packages/obsidian-plugin` - `packages/wordpress-plugin` - `packages/vscode-plugin`: The Harper Visual Studio Code plugin. Uses `harper-ls`. There are of course projects in this repository not listed above. If relevant, feel free to poke around. ## On Writing New Rules When asked to write a new rule, keep these guidelines in mind: - The user is almost always expecting you to write it to a file. Which file and where is up to you to find out. - You should include at least 15 total tests, covering a wide variety of cases. Cover false-positives, false negatives, true positives, and if relevant, true negatives. - You should run any and all tests to ensure that you do no break existing behavior and that your new rule runs the way you expect. - If the rule is related to a closed compound noun, see if you can just add an entry to the existing closed compound linter. Unless you are specifically requested to write the rule in a specific way, choose the language (Rust or Weir) and methodology that fits the task. ALWAYS run extensive bullet tests with `cargo run --bin harper-cli --release -- lint ` to make sure the new rule isn't already covered by Harper. ## Workflow for Writing Weir Rules 1. Draft the core expression - Encode the match with `expr main` using words, sequences, alternatives, filters, exceptions, POS tags, wildcards, or punctuation. - Keep the expression minimal but precise; avoid overmatching. - If a wordlist is needed, include it as its own expression, used with an expression reference. 2. Add rule metadata - `let message`, `let description`, `let kind`, `let becomes` (and `let strategy` if needed). - Use `strategy "Exact"` when casing must be normalized; otherwise default behavior or `MatchCase` as appropriate. 3. Add tests (required) - Include at least 15 tests. - Tests must cover: true positives, false positives, false negatives, and (if relevant) true negatives. - Prefer a mix of casing, punctuation, whitespace, and nearby-token variations. 4. Sanity-check edge cases - Ensure exceptions do not block valid matches. - Ensure replacements are correct and not destructive. 5. Run the tests. - Fix any issues that arise. ### Output Format Write a Weir rule to a new file with a name of your choosing, including `expr main`, `let` fields, and tests. Make sure it has the extension `.weir`. ================================================ FILE: ARCHITECTURE.md ================================================ # Harper's Architecture This document has been moved to the [online documentation](https://writewithharper.com/docs/contributors/architecture). ================================================ FILE: COMPARISON.md ================================================ # Comparison to Other Grammar Checkers | | Suggestion Time | License | LSP Support | Ruleset | Multi-Lingual/Multi-Dialect | | ------------ | --------------- | ------------------------ | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | --------------------------- | | Harper | 10ms | Apache-2.0 | ✅ | [Custom](https://github.com/automattic/harper/tree/master/harper-core/src/linting) | ❌ | | LanguageTool | 650ms | LGPL-2.1 | 🟨 Through [ltex-ls](https://github.com/valentjn/ltex-ls) | [Custom](https://community.languagetool.org/rule/list?lang=en) + N-Gram Based + LLM Based | 🟨 Not simultaneously | | hunspell | | LGPL/GPL/MPL tri-license | ❌ | hunspell/MySpell | 🟨 Not simultaneously | | Grammarly | 4000ms | Proprietary | 🟨 Through [grammarly-language-server](https://github.com/emacs-grammarly/grammarly-language-server) | Proprietary | ❌ | ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing This page has been moved to [the main documentation](https://writewithharper.com/docs/contributors/introduction). ================================================ FILE: Cargo.toml ================================================ [workspace] members = ["harper-cli", "harper-core", "harper-ls", "harper-comments", "harper-wasm", "harper-tree-sitter", "harper-html", "harper-literate-haskell", "harper-typst", "harper-stats", "harper-pos-utils", "harper-brill", "harper-ink", "harper-python", "harper-jjdescription", "harper-thesaurus", "harper-asciidoc", "fuzz", "harper-tex"] resolver = "2" [profile.test] opt-level = 1 [profile.test.package."*"] opt-level = 3 [profile.release] opt-level = 3 panic = "abort" lto = "fat" # Stripping binaries triggers a bug in `wasm-opt`. # Disable it for now. # strip = true # Release profile with debug info. # Useful for debugging and profiling. [profile.release-debug] inherits = "release" debug = 2 ================================================ FILE: Dockerfile ================================================ # This Dockerfile is for the Harper website and web services. # You do not need it to use Harper. ARG NODE_VERSION=24 FROM rust:latest AS wasm-build RUN rustup toolchain install RUN apt-get update -y && apt-get install clang -y RUN mkdir -p /usr/build/ WORKDIR /usr/build/ RUN cargo install wasm-pack COPY . . WORKDIR /usr/build/harper-wasm RUN wasm-pack build --target web RUN cargo clean FROM node:${NODE_VERSION} AS node-build RUN apt-get update && apt-get install git parallel -y RUN corepack enable RUN mkdir -p /usr/build/ WORKDIR /usr/build/ COPY . . COPY --from=wasm-build /usr/build/harper-wasm/pkg /usr/build/harper-wasm/pkg RUN pnpm install --engine-strict=false --shamefully-hoist WORKDIR /usr/build/packages/components RUN pnpm install --engine-strict=false --shamefully-hoist RUN pnpm build WORKDIR /usr/build/packages/harper.js RUN pnpm build && ./docs.sh WORKDIR /usr/build/packages/lint-framework RUN pnpm build WORKDIR /usr/build/packages/web RUN pnpm install --engine-strict=false --shamefully-hoist RUN pnpm build FROM node:${NODE_VERSION} COPY --from=node-build /usr/build/node_modules /usr/build/packages/web/node_modules COPY --from=node-build /usr/build/packages/web/build /usr/build/packages/web/build COPY ./packages/web/drizzle /usr/build/packages/web/build/drizzle COPY --from=node-build /usr/build/packages/web/package.json /usr/build/packages/web/package.json WORKDIR /usr/build/packages/web/build ENV HOST=0.0.0.0 ENV PORT=3000 ENTRYPOINT ["node", "index"] ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2024 Elijah Potter Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.md ================================================ [![Harper Binaries](https://github.com/automattic/harper/actions/workflows/binaries.yml/badge.svg)](https://github.com/automattic/harper/actions/workflows/binaries.yml) [![Website](https://github.com/automattic/harper/actions/workflows/build_web.yml/badge.svg)](https://github.com/automattic/harper/actions/workflows/build_web.yml) [![Checks](https://github.com/automattic/harper/actions/workflows/just_checks.yml/badge.svg)](https://github.com/automattic/harper/actions/workflows/just_checks.yml) [![Crates.io](https://img.shields.io/crates/v/harper-ls)](https://crates.io/crates/harper-ls) ![NPM Version](https://img.shields.io/npm/v/harper.js) ![Downloads](https://img.shields.io/github/downloads/automattic/harper/total?label=Binary+Downloads) ![Obsidian Plugin Downloads](https://img.shields.io/github/downloads/automattic/harper-obsidian-plugin/total?label=Obsidian+Plugin+Downloads) Harper is an English grammar checker designed to be _just right._ I created it after years of dealing with the shortcomings of the competition. Grammarly was too expensive and too overbearing. Its suggestions lacked context, and were often just plain _wrong_. Not to mention: it's a privacy nightmare. Everything you write with Grammarly is sent to their servers. Their privacy policy claims they don't sell the data, but that doesn't mean they don't use it to train large language models and god knows what else. Not only that, but the round-trip-time of the network request makes revising your work all the more tedious. LanguageTool is great, if you have gigabytes of RAM to spare and are willing to download the ~16GB n-gram dataset. Besides the memory requirements, I found LanguageTool too slow: it would take several seconds to lint even a moderate-size document. That's why I created Harper: it is the grammar checker that fits my needs. Not only does it take milliseconds to lint a document, take less than 1/50th of LanguageTool's memory footprint, but it is also completely private. Harper is even small enough to load via [WebAssembly.](https://writewithharper.com) ## Language Support Harper currently only supports English, but the core is extensible to support other languages, so we welcome contributions that allow for other language support. ## Performance Issues We consider long lint times bugs. If you encounter any significant performance issues, please create an issue on the topic. If you find a fix to any performance issue, we would appreciate the contribution. Just please make sure to read [our contribution guidelines first.](https://writewithharper.com/docs/contributors/introduction) ## Links - [Frequently Asked Questions](https://writewithharper.com/#faqs) - [Obsidian Documentation](https://writewithharper.com/docs/integrations/obsidian) - [`harper-ls` Documentation](https://writewithharper.com/docs/integrations/language-server) - Supported Editors' Documentation - [Visual Studio Code](https://writewithharper.com/docs/integrations/visual-studio-code) - [Neovim](https://writewithharper.com/docs/integrations/neovim) - [Helix](https://writewithharper.com/docs/integrations/helix) - [Emacs](https://writewithharper.com/docs/integrations/emacs) - [Zed](https://writewithharper.com/docs/integrations/zed) - [`harper.js` Documentation](https://writewithharper.com/docs/harperjs/introduction) - [Official Discord Server](https://discord.com/invite/JBqcAaKrzQ) ## Huge Thanks This project would not be possible without the hard work from those who [contribute](https://writewithharper.com/docs/contributors/introduction). Harper's logo was designed by [Lukas Werner](https://lukaswerner.com/). ================================================ FILE: biome.json ================================================ { "$schema": "https://biomejs.dev/schemas/2.3.3/schema.json", "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, "files": { "ignoreUnknown": true, "includes": [ "**/packages/**/*", "**/*.json", "!**/test-results", "!**/node_modules", "!**/mariadb_data", "!**/dist", "!**/target", "!**/build", "!**/temp", "!**/*.zip", "!**/*.rs", "!**/harper-wasm/pkg", "!**/.vscode-test", "!**/.svelte-kit", "!**/.sveltepress", "!**/packages/obsidian-plugin/main.js", "!**/pnpm-lock.yaml", "!**/package-lock.json", "!**/playwright-report", "!**/yarn.lock" ] }, "css": { "parser": { "tailwindDirectives": true } }, "formatter": { "enabled": true, "lineWidth": 100, "indentStyle": "tab", "useEditorconfig": true }, "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { "enabled": true, "rules": { "recommended": true, "suspicious": { "noExplicitAny": "off", "noArrayIndexKey": "off", "noLabelVar": "warn", "noDoubleEquals": "off" }, "a11y": { "noSvgWithoutTitle": "off", "useGenericFontNames": "warn" }, "correctness": { "useExhaustiveDependencies": "off", "noUnusedVariables": "off" }, "style": { "noParameterAssign": "off", "noNonNullAssertion": "off", "noUselessElse": "off", "useNodejsImportProtocol": "off", "useAsConstAssertion": "error", "useDefaultParameterLast": "error", "useEnumInitializers": "error", "useSelfClosingElements": "error", "useSingleVarDeclarator": "error", "noUnusedTemplateLiteral": "error", "useNumberNamespace": "error", "noInferrableTypes": "error" }, "complexity": { "noForEach": "off", "noStaticOnlyClass": "off", "noThisInStatic": "off", "noArguments": "off", "noUselessFragments": "off" } } }, "javascript": { "formatter": { "quoteStyle": "single" } }, "overrides": [ { "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"], "linter": { "rules": { "correctness": { "noUnusedImports": "off" }, "style": { "useConst": "off", "useImportType": "off" } } } } ] } ================================================ FILE: demo.md ================================================ There are some cases where the the standard grammar checkers don't cut it. That;s where Harper comes in handy. Harper is an language checker for developers. It can detect improper capitalization and misspellled words, as well as a number of other issues. Like if you break up words you shoul dn't. Harper can be an lifesaver when writing technical documents, emails or other formal forms of communication. Harper works everywhere, even when you're not online. Since your data never leaves your device, you don't ned too worry aout us selling it or using it to train large language models. The best part: Harper can give you feedback instantly. For most documents, Harper can serve up suggestions in under 10 ms, faster that Grammarly. ================================================ FILE: docker-compose.dev.yml ================================================ # This Docker compose file is for development of the Harper website and web services. # You do not need it to use Harper. services: db: image: mariadb:lts restart: always environment: MARIADB_ROOT_PASSWORD: password MARIADB_DATABASE: harper MARIADB_USER: devuser MARIADB_PASSWORD: password ports: - "3306:3306" volumes: - ./mariadb_data:/var/lib/mysql healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"] interval: 5s timeout: 5s retries: 10 ================================================ FILE: docker-compose.yml ================================================ # This Docker compose file is for development of the Harper website and web services. # You do not need it to use Harper. services: site: build: dockerfile: Dockerfile restart: always ports: - "3000:3000" environment: - ORIGIN=http://localhost:3000 - DATABASE_URL=mysql://devuser:password@db:3306/harper depends_on: db: condition: service_healthy db: image: mariadb:lts restart: always environment: MARIADB_ROOT_PASSWORD: password MARIADB_DATABASE: harper MARIADB_USER: devuser MARIADB_PASSWORD: password ports: - "3306:3306" volumes: - ./mariadb_data:/var/lib/mysql healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"] interval: 5s timeout: 5s retries: 10 ================================================ FILE: flake.nix ================================================ { inputs = { utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, utils, }: utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; }; in { devShell = with pkgs; mkShell { buildInputs = [ just bash parallel rustup gcc pnpm nodejs wasm-pack zip wasm-bindgen-cli_0_2_100 ]; shellHook = '' echo " YSOKGECAACDFIMRVZ YQHAAAAABDFFDBAAAAABU WKAAAFNTWZ ZWTQNNY ZTPMIFDCAAAAAEJPUZ ZKAADOX ZTJBAAABFHJMMMMLFAAAAGRZ YFAAKZ XDAAELSW ZVQIAADQZ QAAL ZPNW VIAACOZ VTZ YPLIGDBBDFIKPY VIABX YOKIFDABDGILPY TJAAABEILLIFCAAAJT WW ZSIAAACFIMLHEBAABKU UEAADNW XNEAADT SDAAEOX WMDAAEV YTTTNAACT UDAAM ZLAAEV TCAAOTTTY WBAAAAAFX YGAAM KAAHY XEAAAAACX YAAAAACZ ZEAAJMMMMMMIGIMMMMMMIAAFZ YBAAAAAZ YAAAAAK JAAAAAAAAAAAAAAAAAAAAAL IAAAAAZ TNDAAT TAAAAAAAAAAAAAAAAAAAAAV RAAENU KAAM NAAGTTTTTTRORTTTTTTFAAP KAAM UAAC EAAU RAAF ZBAAW NAAHX XIAAM KAAJY WGAAO OAABNX XOBAAM ZLAACOY XMAAAP UEAAAGQVY ZVQHAAAET SDAAAHRVZ YVPGAAAFV VNDAAAABEFBAAAADMV UMCAAAABFEBAAAAENW VRPMKHHJMORV UROMJHHKMPRW " ''; }; } ); } ================================================ FILE: fuzz/.gitignore ================================================ target corpus artifacts coverage ================================================ FILE: fuzz/Cargo.toml ================================================ [package] name = "fuzz" version = "0.0.0" publish = false edition = "2024" [package.metadata] cargo-fuzz = true [dependencies] libfuzzer-sys = "0.4" harper-core = { path = "../harper-core" } harper-typst = { path = "../harper-typst" } harper-literate-haskell = { path = "../harper-literate-haskell" } harper-html = { path = "../harper-html" } harper-comments = { path = "../harper-comments" } [[bin]] name = "fuzz_harper_typst" path = "fuzz_targets/fuzz_harper_typst.rs" test = false doc = false bench = false [[bin]] name = "fuzz_harper_literate_haskell" path = "fuzz_targets/fuzz_harper_literate_haskell.rs" test = false doc = false bench = false [[bin]] name = "fuzz_harper_html" path = "fuzz_targets/fuzz_harper_html.rs" test = false doc = false bench = false [[bin]] name = "fuzz_harper_comment" path = "fuzz_targets/fuzz_harper_comment.rs" test = false doc = false bench = false [[bin]] name = "fuzz_harper_core_markdown" path = "fuzz_targets/fuzz_harper_core_markdown.rs" test = false doc = false bench = false ================================================ FILE: fuzz/README.md ================================================ # cargo-fuzz targets ## Setup Follow the rust-fuzz [setup guide](https://rust-fuzz.github.io/book/cargo-fuzz/setup.html). You need a nightly toolchain and the cargo-fuzz plugin. Simple installation steps: - `rustup install nightly` - `cargo install cargo-fuzz` ## Adding a new fuzzing target To add a new target, run `cargo fuzz add $TARGET_NAME` ## Doing a fuzzing run If possible, prefill the `fuzz/corpus/$TARGET_NAME` directory with appropriate examples to speed up fuzzing. The fuzzer should be coverage aware, so providing a well formed input document to fuzzing targets only expecting a string as input can speed things up a lot. Then, run `cargo +nightly fuzz run $TARGET_NAME -- -timeout=$TIMEOUT` The timeout flag accepts a timeout in seconds, after which a long-running test case will be aborted. This should be set to a low number to quickly report endless loops / deep recursion in parsers. The normal fuzzing run will continue until a crash is found. Alternatively, if you want to run all the fuzzing targets at once: `cargo +nightly fuzz list | parallel -j0 cargo +nightly fuzz run {} -- -timeout=$TIMEOUT` ## Minifying a test case Once the fuzzer finds a crash, we probably want to minify the result. This can be done with `CARGO_PROFILE_RELEASE_LTO=false cargo +nightly fuzz tmin $TARGET $TEST_CASE_PATH` ================================================ FILE: fuzz/fuzz_targets/fuzz_harper_comment.rs ================================================ #![no_main] use harper_core::parsers::{MarkdownOptions, StrParser}; use libfuzzer_sys::arbitrary::{Arbitrary, Result, Unstructured}; use libfuzzer_sys::fuzz_target; #[derive(Debug)] struct Language(String); const LANGUAGES: [&str; 34] = [ "cmake", "cpp", "csharp", "c", "dart", "go", "haskell", "javascriptreact", "javascript", "java", "kotlin", "lua", "nix", "php", "powershell", "python", "ruby", "rust", "scala", "shellscript", "solidity", "swift", "toml", "typescriptreact", "typescript", "clojure", "go", "lua", "java", "javascriptreact", "typescript", "typescriptreact", "solidity", "zig", ]; impl<'a> Arbitrary<'a> for Language { fn arbitrary(u: &mut Unstructured<'a>) -> Result { let &lang = u.choose(&LANGUAGES)?; Ok(Language(lang.to_owned())) } } #[derive(Debug)] struct Input { language: Language, text: String, } impl<'a> Arbitrary<'a> for Input { fn arbitrary(u: &mut Unstructured<'a>) -> Result { let (language, text) = Arbitrary::arbitrary(u)?; Ok(Input { language, text }) } fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { let (language, text) = Arbitrary::arbitrary_take_rest(u)?; Ok(Input { language, text }) } } fuzz_target!(|data: Input| { let opts = MarkdownOptions::default(); let parser = harper_comments::CommentParser::new_from_language_id(&data.language.0, opts); if let Some(parser) = parser { let _res = parser.parse_str(&data.text); } }); ================================================ FILE: fuzz/fuzz_targets/fuzz_harper_core_markdown.rs ================================================ #![no_main] use harper_core::parsers::{Markdown, MarkdownOptions, StrParser}; use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &str| { let opts = MarkdownOptions::default(); let parser = Markdown::new(opts); let _res = parser.parse_str(data); }); ================================================ FILE: fuzz/fuzz_targets/fuzz_harper_html.rs ================================================ #![no_main] use harper_core::parsers::StrParser; use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &str| { let parser = harper_html::HtmlParser::default(); let _res = parser.parse_str(data); }); ================================================ FILE: fuzz/fuzz_targets/fuzz_harper_literate_haskell.rs ================================================ #![no_main] // use harper_core::parsers::StrParser; use libfuzzer_sys::fuzz_target; fuzz_target!(|_data: &str| { // TODO: figure out how to create a literate haskell parser // let _res = typst.parse_str(&data); }); ================================================ FILE: fuzz/fuzz_targets/fuzz_harper_typst.rs ================================================ #![no_main] use harper_core::parsers::StrParser; use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &str| { let typst = harper_typst::Typst; let _res = typst.parse_str(data); }); ================================================ FILE: harper-asciidoc/Cargo.toml ================================================ [package] name = "harper-asciidoc" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } tree-sitter-asciidoc = "0.6.0" tree-sitter = "0.25.10" [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-asciidoc/src/lib.rs ================================================ use harper_core::parsers::{self, Parser, PlainEnglish}; use harper_core::{Token, TokenKind}; use harper_tree_sitter::TreeSitterMasker; use tree_sitter::Node; pub struct AsciidocParser { inner: parsers::Mask, } impl AsciidocParser { fn node_condition(n: &Node) -> bool { matches!( n.kind(), "line" | "body" | "table_cell_content" | "author" | "ident_block_line" ) } } impl Default for AsciidocParser { fn default() -> Self { Self { inner: parsers::Mask::new( TreeSitterMasker::new(tree_sitter_asciidoc::language(), Self::node_condition), PlainEnglish, ), } } } impl Parser for AsciidocParser { fn parse(&self, source: &[char]) -> Vec { let mut tokens = self.inner.parse(source); for token in &mut tokens { if let TokenKind::Space(v) = &mut token.kind { *v = (*v).clamp(0, 1); } } tokens } } ================================================ FILE: harper-asciidoc/tests/asciidoc_tests.rs ================================================ use harper_asciidoc::AsciidocParser; use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; /// Creates a unit test checking Asciidoc source code parsing. macro_rules! create_test { ($filename:ident.$ext:ident, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!( stringify!($filename), ".", stringify!($ext)) ) ); let parser = AsciidocParser::default(); let dict = FstDictionary::curated(); let document = Document::new(&source, &parser, &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(basic.adoc, 2); create_test!(table.adoc, 1); create_test!(comment.adoc, 2); create_test!(comprehensive.adoc, 13); ================================================ FILE: harper-asciidoc/tests/test_sources/basic.adoc ================================================ = This is a titlle This is a basic paragraph with a typo here: mstakes. ================================================ FILE: harper-asciidoc/tests/test_sources/comment.adoc ================================================ // This is a comment with a typo: spelll // Another line of the same comment. ================================================ FILE: harper-asciidoc/tests/test_sources/comprehensive.adoc ================================================ = Document Title Author Name :revdate: 2026-01-01 :custom-attr: Value with typpo. This is a paragraph with a deliberate typpo. == Section Titlre * List item with errorr * Another item .Block Titlle [NOTE] ==== Admonition with mistacke. ==== |=== | Header with errorr | Header 2 | Cell with typpo | Cell 1.2 |=== // Comment with mistacke. //// Block comment with errorr. //// Indented block: This has a typpo too. Term with errorr:: Definition with mistacke. ================================================ FILE: harper-asciidoc/tests/test_sources/table.adoc ================================================ |=== | Cell 1 | Cell 2, but with a typo: errorr |=== ================================================ FILE: harper-brill/Cargo.toml ================================================ [package] name = "harper-brill" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-pos-utils = { path = "../harper-pos-utils/", version = "1.0.0" } serde_json = "1.0.149" [build-dependencies] serde_json = "1.0.149" ================================================ FILE: harper-brill/finished_chunker/vocab.json ================================================ { "kicked": 8723, "ADPL": 12418, "Stirling": 4479, "proper": 1178, "blond-haired": 30464, "unitary": 14934, "hyper": 13552, "Montenegro": 16486, "trying": 2272, "interrogations": 20679, "adopt": 7874, "500": 12101, "km": 12102, "DPA": 18474, "defund": 14161, "1829": 14690, "DeCook": 21039, "4641": 24959, "bondad": 21405, "03": 22242, "FROM": 11799, "Atkins": 3803, "sanctuary": 19754, "pillars": 13167, "spots": 18825, "wagon": 19793, "milky": 27686, "asparagus": 28449, "singular": 15407, "sampler": 29347, "Maulana": 19098, "Shaganon": 11441, "202.456.2461": 24353, "1614": 25367, "customer's": 23511, "purely": 1717, "Parties": 14282, "Clark": 14445, "Homeland": 12110, "Is": 6490, "lousy": 6935, "drag": 9979, "mosque": 12267, "Equity": 14518, "Friendliness": 27506, "glittering-eyed": 31934, "greenhouse": 2176, "legality": 31337, "Jo-Ann": 31978, "said": 1772, "tranquillity": 14886, "buckaroo": 32363, "SF": 21175, "tatters": 9853, "Zagros": 16745, "Marketing": 21395, "traceable": 20672, "General": 3456, "insect": 9884, "Change": 13457, "tombstone": 5444, "inspires": 12190, "Hilton’s": 15109, "Harkat": 19617, "Feagan": 22533, "instructors": 18208, "hacked": 12791, "sown": 25214, "disrepute": 9127, "Revenue": 7961, "Stefania": 13223, "hitting": 4882, "ARCHILOCHUS": 25345, "Toledo": 19923, "pros": 10570, "Hoston": 22163, "APPROVE": 23047, "pretext": 12856, "Base": 11991, "Full": 10826, "Dillard": 8786, "Rebecca": 10730, "adversaries": 14327, "J'": 4052, "entry": 12114, "evening's": 31381, "Honest": 29051, "ripping": 24116, "Morality": 8279, "1960s": 4548, "828-296-8466": 24670, "defunct": 19576, "magazine": 12033, "Siwu": 1841, "snobbery": 32793, "denote": 24153, "CAROLINA": 24646, "barely": 8434, "9/11": 11046, "(b)": 2457, "decrease": 2174, "Wu": 3413, "BEING": 11845, "incorrect": 2335, "http://travel.state.gov/travel/cis_pa_tw/cis/cis_1052.html": 27123, "–": 504, "insurance": 7211, "could": 1930, "perv": 23908, "Lynley": 4215, "sashimi": 26939, "Galen": 23174, "Corp": 21364, "Mississippi": 17474, "chapters": 13755, "Kitty": 21768, "any1": 26210, "acute": 2197, "outbid": 24581, "ridiculous": 17366, "reliable": 1254, "glitz": 16947, "Unlce": 21998, "Martinez@ENRON": 23442, "swivel": 30301, "independently": 10732, "Gin": 32603, "Fluff": 18399, "Workpapers": 23313, "remotely": 10451, "tries": 8831, "!!!": 21469, "subjects": 2748, "poisoning": 18692, "shelters": 18762, "Stl": 23008, "thats": 23915, "sentiment": 4662, "Glacier": 15955, "#descriptive": 8009, "effaced": 31235, "Manogue": 23224, "0400": 25426, "modulated": 2780, "diminishes": 1252, "announce": 7801, "jigsaw": 32521, "notable": 3781, "Holding": 21125, "associated": 2273, "cemented": 25863, "Chin": 2472, "heckuvalot": 23648, "geologists": 10603, "desperate": 4672, "cooked": 18389, "Cell": 20985, "Paradero": 29314, "mexican": 28525, "GEORGE": 24347, "arrested": 12193, "generative": 3691, "joy": 14378, "anticipated": 3039, "bite": 18384, "transform": 243, "1738": 3131, "candid": 5878, "37": 7324, "atty": 23808, "diarheya": 27592, "Motel's": 3968, "donkey": 32012, "stories": 4608, "sizzling": 32113, "Ben": 6131, "nationally": 10884, "litten": 9418, "satanic": 20028, "confessions": 32517, "shah": 16770, "Did": 6355, "Ana": 5591, "6400": 15561, "glove": 20018, "Leavenworth": 20836, "apps": 2970, "slavery": 12354, "seek": 2539, "alternated": 30505, "Beast": 13635, "upon": 140, "eggnog": 8599, "channelled": 14266, "Armenian": 16748, "stewardesses": 30554, "wakes": 7023, "neckless": 32049, "educated": 4248, "'S": 11492, "accountability": 14167, "ramifications": 7274, "Hwang": 13076, "Agassiz": 3462, "acknowledged": 7633, "Sinhala": 18975, "trans-European": 31450, "importing": 17158, "attaching": 22283, "overcooked": 29488, "ploys": 30426, "curating": 20187, "Vercellotti": 19947, "brack": 27198, "overcharges": 23709, "Re(a)d": 2919, "regarding": 199, "cawing": 17926, "Suarez": 21076, "entertained": 29384, "Double": 4877, "associate": 13389, "!!!!!!!!!!?": 26330, "exports": 31519, "Mohandas": 15043, "civic": 13945, "ANDREAE": 10095, "when's": 16207, "American": 1266, "republican": 29025, "Stojic's": 22752, "Attribution": 8540, "12/26/2000": 23328, "brook": 32740, "China": 2718, "premium": 20990, "Mental": 13557, "beverage": 10478, "http://farm3.static.flickr.com/2406/2527255596_db23df940f.jpg": 26584, "dente": 18383, "Cunard": 32555, "1954": 3453, "members'": 12372, "gathers": 201, "Abundance": 25277, "Seoul": 22069, "leprechauns": 9889, "lambs": 28940, "utilization": 14545, "Mann": 8420, "focuses": 1595, "Youngstown": 28599, "silver-mounted": 31317, "biogeochemistry": 2553, "sufferings": 31957, "Bhatia": 24167, "outrageously": 21157, "PHX": 17104, "apostrophe": 30136, "Sands": 4913, "x33907": 22263, "hierarchical": 20294, "walls": 5054, "dragons": 10319, "bursting": 9098, "weathered": 9166, "valet": 28772, "&": 30657, "satire": 10568, "Afghanistan’s": 19653, "condition": 3191, "devotion": 31022, "DNA": 10621, "whisky": 31613, "Recognition": 12079, "muscle": 9509, "plunged": 5139, "1542": 25467, "hibernation": 27681, "DATE": 24017, "computer’s": 7788, "cocktail": 10474, "Messages": 21372, "Mandelstam": 30772, "forward": 5072, "1533": 25462, "30s": 17090, "preconditions": 6611, "clumsy": 13037, "den": 31479, "training": 349, "Sne": 5928, "Measure": 23026, "http://en.wikipedia.org/wiki/Bullfighting": 28331, "stranglehold": 31453, "Kwa": 1842, "Natsuko": 4605, "swirl": 9736, "Curry": 18391, "soprano": 32624, "spoiled": 27942, "planeful": 32721, "Ric": 21203, "60622": 26915, "Task": 25938, "Rawalpindi": 20590, "colonies": 3566, "oversees": 24288, "mileage": 29193, "reservoirs": 17066, "washing-up": 32214, "glowed": 9973, "plastic": 7769, "Beringia": 15273, "Shrodinger": 24904, "willow": 25056, "someplace": 28428, "6": 469, "hanging": 7807, "pasta": 15771, "towed": 28777, "$$": 28013, "Middle": 7817, "gangland": 19913, "Scheuer": 20615, "senatorial": 4999, "duty": 12277, "kidnapping": 18496, "historians": 27098, "Pemex": 22293, "Esna": 5929, "cigarette": 7348, "Georgia": 14363, "comprehension": 14500, "bronzy": 16054, "cave": 17002, "06:30": 16609, "mini-serial": 4165, "Doing": 13844, "tube": 6836, "consciously": 14843, "semi-empirical": 2678, "Popup": 23595, "smashed": 13679, "selective": 1639, "ashtrays": 30268, "FRIENDLY": 29680, "hose": 3011, "monies": 24510, "Dreamworks": 13589, "strangle": 8618, "waves": 2428, "Łódzkie": 16860, "adjusting": 17930, "Ravenna": 31003, "kitchens": 29981, "akin": 22493, "hour": 10888, "persuasion": 20879, "401.3": 25982, "homosexuals": 25581, "meetings": 11419, "BUSH": 24349, "bunioned": 32358, "hoping": 14776, "fools": 31884, "thanking": 14472, "Robinson": 6169, "Henga": 16313, "reporter": 11103, "freedom": 6521, "tranquilize": 7066, "BW": 24960, "billiard": 25063, "renamed": 16917, "eyed": 7992, "deem": 15530, "PAINT": 25369, "island": 5018, "reigon": 28217, "equilibrium": 31489, "94.40": 26013, "donating": 18590, "considers": 2502, "timetable": 22601, "learns": 25466, "emblem": 9310, "heights": 4703, "Thanksgiving": 21965, "encased": 25894, "Fucking": 9665, "symmetries": 32646, "celebrated": 3963, "Rapid": 11518, "Collingswood": 28810, "unfriendly": 20536, "amalgamation": 10739, "later": 1189, "Kuwait": 16765, "humming": 20330, "Alhaznawi": 20781, "McNealy": 24212, "had": 1277, "rebuild": 11536, "2021": 12985, "vols": 4451, "felt": 4656, "conveys": 8205, "1.3": 14702, "carrots": 27443, "Ayatollah": 18923, "Arrow": 17464, "wavered": 31614, "sulphur": 31375, "PPM": 27885, "ragamuffin": 4673, "dialed": 30504, "symbolized": 6869, "Distorted": 8636, "Activity": 21956, "nonviolent": 15049, "WASTE": 24456, "stretched": 8608, "admiral": 4268, "Caucasian": 27250, "snake's": 27679, "Stay": 9567, "whites": 31783, "Paper": 10514, "IRS": 23573, "experiment": 10308, "GM": 21540, "For": 437, "Contractual": 23023, "apathetic": 30029, "Imagine": 4107, "Gregg": 21931, "reserved": 7571, "masking": 601, "playground": 9595, "dismantled": 31297, "Eisenhower": 14589, "Kalkat": 19034, "Berkman": 14556, "widest": 25932, "disgustingly": 27452, "doesn’t": 9503, "Piaget’s": 15029, "NW": 22804, "conversational": 1812, "turn": 1829, "you'll": 6506, "international": 10999, "modestly": 30231, "ceases": 25850, "Intelligence": 13969, "mermaids": 8999, "stronger": 10877, "high-carrying": 32704, "recognition": 732, "draining": 32406, "f-": 6038, "remark": 9668, "obligated": 22711, "Vassar": 29461, "Specified": 22045, "Jubilee": 10347, "Contest": 5731, "enjambed": 989, "unilateral": 14226, "maddened": 9410, "Are": 6509, "BEFORE": 28785, "poses": 19747, "coming": 6903, "Who'll": 31785, "volatilities": 22689, "median": 15638, "doorknob": 30244, "Elie": 30650, "LSD": 12430, "preventive": 20399, "flirting": 17962, "Champagne": 27010, "Ben-Gurion": 30721, "dead": 5056, "fringed": 31091, "Eats": 6682, "curdle": 17871, "I/C": 23642, "Morse": 31397, "Importantly": 226, "threads": 3060, "municipalities": 7631, "stacked": 28888, "kidding": 7116, "staying": 7064, "turnover": 28972, "revolutionaries": 14727, "crosses": 17288, "trades": 15373, "losses": 11605, "MAGICAL": 32346, "macro": 22595, "vaccines": 1394, "2710": 20924, "commitments": 11217, "enviroment": 26497, "Yogi": 24186, "arises": 11622, "document's": 30104, "Mathias": 10203, "owl": 30841, "HATE": 11901, "crops": 13445, "stellar": 29330, "catalytic": 21837, "jungles": 31014, "fry": 18390, "miao": 14890, "Kaoshikii": 24032, "undertakes": 3025, "Stubley": 23164, "nuisance": 31236, "jack": 26325, "twins": 32149, "mid-town": 17472, "perhaps": 1927, "preaching": 31020, "picnics": 11787, "II": 3155, "metaphysics": 3219, "marae": 16350, "movie's": 13624, "cautiously": 5071, "N.Y.": 11801, "Marymegan": 10587, "Barn": 27197, "manager's": 31315, "health": 1263, "retardation": 20042, "controversially": 1391, "Boot": 1550, "713/853-5984": 22976, "styler": 15926, "met": 3801, "casual": 26213, "19/11/2004": 24556, "Period": 21642, "Terrell's": 19400, "lessen": 7146, "prominence": 5404, "Lionel": 11409, "1984": 3095, "hoorah": 21853, "sprayed": 31709, "Babe's": 16560, "Happiness": 25295, "asserted": 5952, "governs": 23564, "Unfortunately": 2165, "fried": 28526, "1694": 14945, "Marshall": 23770, "parliament": 18551, "apogee": 27105, "shrunken": 32281, "tug-boat": 32376, "Weil": 20144, "teacher's": 27660, "Looks": 6478, "extremely": 1753, "Merson": 4903, "jumps": 13842, "artworld": 14900, "mobiles": 13436, "Mackey": 2417, "diseases": 13495, "instruction": 14836, "Michelle": 5453, "Program": 5713, "activists": 12477, "Makos": 13365, "Baja": 23293, "counterweight": 25827, "Watson": 28283, "arrangements": 8081, "cigar": 31623, "pools": 26548, "interquartile": 15659, "instinct": 14405, "plummet": 24590, "Concerned": 28899, "crux": 7369, "pagefilename.bak.htm": 30065, "Grusendorf": 21794, "Zafra": 25461, "Govind": 28557, "quart": 31304, "allocation": 11619, "boulevard": 25541, "heat": 6269, "Rams": 29445, "deeply": 5140, "fyi": 21213, "pleased": 13897, "Terminals": 17107, "nematocysts": 10650, "181": 24144, "marketing": 8209, "plumbers": 27310, "pizzas": 29640, "Kingdom": 21, "AK": 18575, "http://bit.ly/kPlaylists": 26540, "Catholic": 4290, "commander": 12867, "HONKA": 28650, "nestling": 32946, "Lynch": 23339, "uncomprehendingly": 9525, "Bay": 4935, "CBD": 26963, "Brad": 23086, "rulers": 18976, "weather": 6151, "knick": 8064, "refute": 22464, "mayur...@yahoo.com": 24222, "your": 4580, "department's": 27892, "depopulated": 31575, "internalised": 32837, "herewith": 23088, "symbolic": 20618, "Renata": 9505, "horizontally": 2769, "examining": 1868, "quilling": 29535, "Plaskitt": 14707, "wheels": 26421, "AM": 11127, "excellant": 28115, "Breyer": 26825, "intensely": 9997, "OLE": 23115, "#technology": 8257, "matchup": 12091, "Schenectady": 11800, "Daphnia": 27847, "daily": 1645, "Fawn": 12640, "alternating": 25271, "prescribe": 27613, "dean": 18518, "9221": 22243, "pertains": 19420, "Blount": 19800, "steadily": 9989, "disrupt": 19665, "Crescent": 22237, "spiders": 31739, "autumn": 26007, "unify": 24774, "Jerusalem": 20449, "EEI": 22180, "Gianutto": 25485, "Finns": 31952, "predictors": 8507, "horse's": 6389, "amazed": 9936, "<": 1688, "tile": 9717, "stowed": 25520, "Eugene": 5547, "fenders": 30647, "Neuralink": 8340, "Keeper": 18308, "Romance": 25281, "Parthenon": 32816, "Genius": 15252, "flickering": 10054, "20006": 22827, "YE": 21026, "figure": 2143, "Around": 3180, "Concerning": 6532, "Launch": 24792, "Łódź's": 16874, "definition": 1080, "afresh": 14091, "Rickenbacker": 11711, "registered": 14436, "considerate": 17289, "saddened": 28656, "R&D": 16420, "little": 861, "Armaments": 25757, "OUT": 26477, "80435": 23327, "cascading": 8932, "S’pose": 9908, "tighten": 9326, "750,000": 16955, "accomdating": 28128, "Little": 5733, "talked": 3882, "fueled": 16976, "bows": 30897, "alienating": 18869, "involvement": 1584, "magickal": 20226, "infiltrators": 18812, "7.3": 15047, "Powder": 21881, "christmas": 26391, "shackled": 26075, "neighbour": 31892, "licked": 32641, "Anon": 12719, "Steel": 23002, "drawings": 28477, "713-853-1696": 21702, "characterized": 12703, "Jahan": 16732, "confirms": 22540, "1551": 25476, "Havelock": 19540, "Arts": 10383, "India": 7311, "tel": 16557, "cheques": 26040, "62": 17015, "Bartlesville": 17405, "Cap-": 6733, "lace": 8351, "Taffy": 22030, "inoperable": 29925, "upraised": 24098, "restructure": 30071, "skiing": 29138, "Chris": 5716, "TIBCO": 21362, "swarthy": 32732, "differential": 23292, "committee": 14170, "Mosul": 4525, "By": 634, "harmonisation": 31458, "tie": 6505, "gagged": 25572, "Stelle": 13201, "grounded": 3072, "depersonalizing": 13681, "spike": 23711, "...............": 27385, "Matisse": 21176, "exporters": 31530, "Republican": 3978, "hazy": 11487, "Vanguards": 20566, "exits": 32725, "Ouiji": 7004, "sequences": 1141, "child's": 27469, "Serbia": 16495, "pear": 31794, "Barber": 28709, "accommodating": 32861, "profit": 1387, "spraying": 28272, "thinker": 7869, "!!!!": 24943, "antisocialism": 25699, "AAAAAGGGHHHHHH": 22117, "asleep": 6817, "advise": 16460, "04:31": 22040, "SERVICE": 28281, "Proxy": 29923, "occasioned": 3965, "190": 13314, "hastened": 14420, "Alcala": 25483, "nowadays": 2160, "downside": 23426, "obscure": 3887, "trees": 9168, "Kat": 15865, "!?": 26297, "bs": 29538, "merry": 31132, "Devlin": 2435, "Morne": 16678, "Dudley's": 32106, "policy": 10710, "butter-hearted": 32361, "4.": 1903, "mix": 18428, "Unitary": 24727, "Occupation": 5347, "FORMAL": 22873, "pairing": 383, "Clouds": 5499, "Northumberland": 17578, "Dependant": 24773, "MYSTERYS": 28764, "Newton’s": 15542, "balconies": 13936, "front": 5835, "interactions": 14808, "moonshine": 30984, "man": 4670, "mop": 27855, "Peninsula": 2063, "Operation": 12742, "leaf": 8898, "Grenadines": 16494, "EDIT": 26302, "respectfully": 7498, "duh": 6337, "doubts": 8387, "reached": 14215, "Malaysian": 12167, "reduces": 764, "shrewdness": 25526, "populous": 17030, "scary": 6757, "Ichiyō": 4597, "eHow": 10799, "petsmart": 26448, "Albatross": 17978, "battlefield": 25862, "barbecue": 27307, "intruder": 27694, "commit": 11219, "protégé": 4982, "therapist": 15725, "contend": 17615, "keyword": 14862, "Kiss": 8819, "seeing": 4621, "cheung": 12405, "Nehru": 19000, "adult's": 27875, "unilevel": 23996, "kiln": 26265, "principle": 3123, "COVID": 14172, "geologically": 30631, "unquestionably": 20065, "eating": 8199, "cripple": 25799, "pays": 20459, "patents": 5203, "impasse": 19062, "Building": 11346, "Correspondents": 19518, "unexpected": 10596, "dilly": 17935, "harms": 19362, "ignore": 3875, "ANTHONY": 25404, "bland": 27617, "acted": 13762, "corporations": 7974, "climate": 802, "emotional": 3082, "Uncle": 21981, "priority": 3848, "finished": 10563, "professor": 3209, "Port": 16332, "detract": 22091, "Diagnostic": 13554, "locking": 8083, "dwellings": 15417, "FITNESS": 28520, "Tweed": 23759, "banished": 31633, "fisheries": 25161, "jolly": 8626, "Crawfish": 22528, "Visual": 13265, "programmatically": 30041, "worthwhile": 4726, "Items": 30087, "productively": 18270, "yoyos": 30481, "Cups": 11006, "Operations": 21100, "multiple": 7634, "Congolese": 31869, "tackling": 13007, "absorb": 14408, "Hutt": 16333, "gall": 24083, "hitched": 32090, ":)": 10654, "repulsive": 24217, ".......": 18726, "true": 3885, "inspire": 8454, "wails": 8778, "Admissions": 22672, "protecting": 7440, "towns": 13020, "Depth": 17320, "Nierman": 6034, "splashy": 6053, "Rond": 3277, "partition": 19341, "Lai": 3485, "attributable": 21223, "Damage": 24443, "distributed": 488, "TOO": 27350, "Sstaff": 28169, "snaking": 31822, "guqin": 14881, "insider": 20900, "Tire": 28691, "US's": 20340, "official": 3531, "noon": 14411, "steered": 18201, "Jeremy": 12491, "nonetheless": 15185, "retest": 30186, "Maarten": 27497, "stretching": 9115, "363-0555": 16567, "suitcases": 29967, "overseas": 11000, "Kumaratunga": 19019, "cockpits": 9273, "layout": 16812, "production": 293, "dilemma": 15087, "homemade": 26262, "01:14": 22764, "884": 25353, "might": 435, "tarpaulin": 17309, "Buffet": 28720, "Beautiful": 19471, "Tabennese": 5905, "fighters": 9284, "note": 1437, "bowls": 8975, "Barack": 12194, "stocking": 18166, "guardsmen": 19216, "laurie.ellis@enron.com": 21418, "pigs": 15446, "everyone's": 13617, "knowing": 4637, "hedging": 23427, "toddler": 28993, "romatic": 29005, "drenched": 29396, "bɛʁˈnʊli": 3104, "battling": 16863, "neo-colonialism": 31958, "leotard": 17683, "Parmesan's": 25134, "Wenders": 5517, "Entree": 28603, "creditors": 22626, "animal": 10631, "churchyards": 9468, "frightened": 10140, "formerly": 5308, "Control": 20825, "Pixel": 26233, "cultures’": 15441, "Chamber": 14350, "leaped": 31305, "Dishwasher": 18416, "blisters": 32825, "Cloud9": 12578, "finishing": 10922, "because": 856, "barbeque": 17153, "MASS": 10105, "guffaw": 30463, "tanned": 30882, "Tarahumara": 5568, "hindsight": 16155, "lit": 9568, "brand": 2933, "Turismo": 17006, "UW": 28855, "achieve": 2726, "master": 6567, "ft": 17037, "NEEEEEEEEEVERRRR": 29089, "tempting": 6952, "Tips": 17888, "dinosaur": 2890, "part-session": 31388, "topological": 2348, "other's": 30903, "Revisited": 4123, "Interconnect": 23566, "reconvene": 15739, "50th": 15639, "Rosemary's": 25612, "Louisiana's": 24439, "Chiang": 12469, "checked": 15813, "E@tG": 20232, "Bernardini": 10293, "groaned": 32222, "strenuous": 19721, "bidding": 22733, "katan": 30535, "hammocks": 26868, "dismiss": 15248, "http://www.infoukes.com/history/chornobyl/gregorovich/index.html": 18703, "bends": 15621, "holy": 13156, "gas": 6263, "Escaping": 26473, "646-8420": 21417, "friday": 27958, "trundling": 32741, "destruction": 18244, "breakdown": 7207, "valley": 5440, "Aesthetic": 1, "news": 6746, "---": 23345, "Stretching": 17665, "minute": 4692, "Leah": 7091, "liked": 6093, "staples": 16146, "frosting": 17878, "confirmations": 9355, "ethnically": 25435, "obviously": 6646, "ConnectionFile": 30061, "Fla.": 11943, "08/07/2001": 23120, "forwards": 31457, "XML-based": 30097, "premier": 7335, "weren't": 6119, "fell": 4636, "twist": 15938, "02:10": 21648, "Heisenberg": 24903, "furnished": 27914, "PROVIDED": 27475, "Rated": 16374, "1914": 5550, "Butterfly": 16630, "2018": 2524, "escalation": 25753, "barcoding": 29306, "complications": 18684, "Chalmers": 9225, "stranger": 9625, "electron": 15580, "syrupy": 18449, "asian": 28207, "hunts": 15506, "202.456.1111": 24351, "Lotf": 16802, "sliver": 18899, "persistence": 1712, "puns": 3471, "humanities": 179, "criterion": 13222, "Minchah": 30588, "Non": 17324, "pickup": 29717, "raw-potato": 31715, "refuse": 13944, "islets": 17207, "KNOW": 21519, "moss": 10002, "Emails": 20658, "Sussex": 27131, "wiring": 9632, "a-": 6278, "Aelius": 5023, "64.75": 1694, "USDA": 20711, "windows": 5064, "reneged": 25922, "cotton": 13480, "audiotape": 20668, "CT": 24023, "dotted": 17586, "layers": 24045, "utilitarianism": 24876, "people’s": 1248, "fill": 6254, "informed": 2504, "Capitol": 15272, "uterine": 27059, "yr": 27907, "hardware": 628, "leap": 8920, "NOV": 28604, "OMFG": 28731, "dally": 17936, "neglected": 29879, "bluntly": 25890, "Normalcy": 5987, "cards": 8812, "youre": 26719, "bobbed": 32431, "HOUSEMOTHER": 11904, "distrusted": 14695, "packages": 17155, "btw": 26737, "strengthen": 13859, "equipment": 6342, "Regenesis": 26509, "outsourcing": 20060, "relatively": 2811, "painted": 8589, "regular": 1531, "spoilers": 3054, "country": 922, "sore": 6383, "coughing": 15806, "boutiques": 16615, "pursuant": 20801, "JOYSTICK": 26787, "physicist": 3110, "dreaming": 7993, "sifted": 17855, "socio-political": 20135, "Muscovy": 4398, "budge": 28223, "insets": 32889, "fat": 9501, "experimented": 3284, "McConnell@ECT": 21186, "Unfair": 27642, "*~*~*~*~*~*~*~*~*~*": 23078, "306": 25767, "becouse": 26755, "Robogee": 12131, "haunt": 23969, "directives": 31416, "Conrad's": 10911, "Integrity": 32578, "Cities": 16655, "dangerously": 8624, "latitude": 2329, "mot": 7754, "restoring": 14343, "overflow": 26671, "preconception": 13703, "chambers": 24863, "BCE": 15316, "bashing": 21343, "Barbara": 6719, "vacuous": 20298, "napkin": 28221, "different": 155, "resource": 7879, "tracking": 144, "dangled": 8554, "biologists": 10601, "attributes": 30127, "level": 588, "6500": 31521, "unless": 6909, "Arabia": 13155, "buttering": 32216, "82": 4812, "laughed": 9014, "lawsuits": 8573, "governorates": 19317, "Shawnta": 15912, "Dupont": 28122, "strolling": 31282, "Cab": 16225, "Hour": 5470, "2:25": 15860, "Aksa": 20493, "dumbstruck": 32165, "rat": 26481, "Everything's": 15991, "un-ruly": 28507, "structure": 753, "excitement": 2483, "boasting": 24159, "telegram": 11036, "Universidade": 1504, "Pierre": 3265, "Buddy": 6082, "borders": 8440, "revolt": 14726, "relativism": 15509, ":O": 26395, "uneasy": 25556, "calming": 29789, "cutoff": 2700, "motorway": 16876, "retaliation": 18637, "bourbon": 17987, "Kumar": 10071, "mother": 4232, "ANYTHING": 27337, "backing": 15928, "!!!!!!!!!!": 28361, "titles": 10962, "1825": 3507, "re-read": 24857, "373": 5120, "trails": 8915, "PASSWORD": 23038, "suffocate": 27899, "noone": 23905, "blackened": 9181, "vermiculite": 17729, "GCP": 22034, "illuminating": 8375, "Hats": 28655, "Limerick's": 26152, "Gulf": 14238, "TK": 23600, "pirate": 31501, "cutting": 6886, "obtaining": 11614, "elegance": 17690, "CANADA": 26743, "cheated": 29181, "buns": 30309, "useful": 513, "messages": 5667, "tanning": 5220, "tulips": 15885, "fires": 24843, "co-workers": 21269, "JOHN": 10096, "removal": 12821, "chromosome": 15281, "examine": 15572, "Kyle.Jones@ra": 22024, "Decision": 14389, "nosedive": 8491, "comeback": 16392, "occurs": 1117, "articles": 1392, "padded": 13170, "lengthy": 13052, "purporting": 20848, "resond": 21292, "advocate": 1270, "fringes": 30518, "beautifully": 10154, "Bearing": 32918, "Leaky": 16100, "lilac-coloured": 32899, "COM": 31461, "beadwork": 31562, "pins": 7044, "overdose": 25611, "concur": 19316, "Strasburgh": 4454, "Astros": 4899, "positioned": 23983, "Omar": 19673, "Game": 2926, "Sommer's": 22779, "http://www.beardeddragon.org/articles/caresheet/?page=1": 27762, "12:30": 18255, "afraid": 6319, "Yadavaran": 25840, "consumption": 2084, "DON'T": 28398, "===>": 26514, "rvs": 29720, "freeways": 17455, "tomb": 4390, "grabs": 8789, "Fragile": 18147, "316": 14909, "Torrey": 22560, "01/13/2001": 22771, "Mideast": 25875, "divisions": 14387, "Derrick": 29861, "Been": 6495, "11/29/00": 22037, "448-9499": 22377, "licensed": 7140, "damn": 6078, "muddle": 31746, "Palette": 16069, "FIRE": 22947, "contaminated": 18674, "shout": 11071, "endevour": 28927, "propose": 1810, "aggravated": 19447, "Member": 11594, "295870": 23558, "unbelievable": 6872, "maintaining": 1588, "quiz": 18817, "http://www.adventurehobbycraft.com/products/hobby_craft_supplies.html#metal": 26846, "Jeanne": 5339, "Defend": 27707, "Bosco": 7316, "OVER": 28408, "FREEDOM": 25245, "Sassanid": 16813, "pint": 29354, "disorders": 13562, "10:38": 15851, "effects": 154, "fate": 6568, "Marsha": 2935, "especially": 1589, "Abbey": 4156, "1584": 25361, "inferiors": 17341, "shewing": 9476, "Bud": 29735, "ponder": 10185, "gleaned": 24770, "p.m.": 15565, "test": 1666, "1831": 3840, "imperil": 25843, "Crystal": 5822, "resort": 16073, "43.6": 26082, "Carrasco": 13099, "diagnose": 29058, "profits": 11654, "asterisk": 30180, "WWW": 22456, "ConnectionString": 30058, "eldest": 3535, "steamer": 31078, "Heather": 25650, "blackmail": 20486, "Hikmetar": 19676, "HBS": 23154, "butterflies": 10254, "piloting": 2513, "probably": 1896, "Seized": 5150, "struggling": 5874, "contents": 10844, "pharmaceutical": 1323, "experimentation": 5032, "available": 547, "calmness": 28680, "Chicago": 3778, "bouncy": 28990, "Owls": 4843, "backup": 9615, "brick-dust": 31703, "wander": 7748, "Abd": 4542, "viewership": 2948, "Telugu": 28505, "filigree": 16738, "fetishism": 18805, "Joker": 12555, "Equipment": 28724, "Among": 2671, "Darren": 22100, "shark": 29207, "genius": 28835, "movement": 658, "ascetics": 4997, "1,095,000": 15681, "alley": 32337, "bout": 19150, "Infected": 10224, "14721": 22790, "view-only": 30177, "customers": 10579, "***********************************": 23881, "wouldnt": 26369, "VM": 11391, "badgers": 17229, "Khosla": 24211, "Quarter": 4418, "Thors": 31469, "blasting": 31182, "Centuries": 948, "convince": 7777, "http://news.yahoo.com/nestl-purina-releases-commercial-aimed-dogs-183443091.html": 27204, "tatty": 32940, "cautioned": 25078, "marshes": 9427, "safer": 10715, "Yoshiwara": 4699, "Malacca": 19556, "Counselor": 7565, "quo": 10411, "ld2d-#69397-1.DOC": 22434, "unturned": 28074, "murderer": 20400, "counsel": 7353, "Prompted": 12715, "Protection": 13489, "cab": 6061, "unable": 2867, "Putin": 14668, "declares": 12720, "deducted": 7202, "etc.": 7797, "freezer": 8016, "Israel": 11170, "DURING": 11860, "converter": 21838, "Bayley": 31807, "Cycle": 23457, "bassiana": 10222, "Mustapha": 13136, "daunting": 16154, "5,600": 3066, "sundry": 30346, "Nadereh": 20076, "collector": 11338, "Simone": 20143, "S@P": 20972, "Shankman": 22534, "Kenny": 26064, "Device": 21073, "Pyrenees": 27529, "Frost": 17887, "Tempe": 17044, "attendees": 12559, "Emergency": 8864, "Mitten": 26275, "345-8702": 21146, "Skittle": 18430, "specifics": 13668, "Braised": 18392, "Street": 6304, "CPUC": 22390, "prongs": 27370, "Barb": 6725, "radiant": 30924, "warranty": 28343, "cowboy": 28862, "therefore": 933, "apprehension": 19076, "Inter": 19566, "Political": 10370, "savagely": 32107, "coordinator": 20946, "wriggle": 31889, "Tiziano": 12344, "Healing": 23952, "learners": 14548, "manners": 25658, "multi-millionnaires": 19757, "daniel.smith2@durham.ac.uk": 28, "Swiss": 3108, "abundance": 15372, "A.M.": 11484, "Give": 6804, "fades": 25275, "bombs": 18506, "Boardroom": 22971, "Religious": 14835, "Tapping": 8118, "stomped": 9746, "mysteriously": 19966, "decides": 25818, "frontal": 6855, "Okmulgee": 17443, "deter": 18635, "We": 160, "claire.bailey-ross@port.ac.uk": 15, "process's": 27384, "motel": 29466, "Prabhakaran": 19022, "estimates": 13519, "panicked": 9227, "Circus": 25591, "subconsciously": 7798, "Nonpartisan": 12488, "house-elf": 32128, "developmental": 9581, "hurtling": 24786, "Justice": 7219, "twenty-year": 32629, "noodling": 13749, "shiny": 31912, "recurrent": 4646, "lifeguard": 21248, "stools": 30302, "Lolland": 17244, "Digimon's": 12633, "Civic": 12393, "goddamn": 9766, "seem": 1926, "richest": 17184, "Confidentiality": 21003, "UPI": 24999, "scatters": 32388, "EOL": 21572, "guides": 27760, "measuring": 3296, "iconic": 8407, "pagodas": 9416, "commend": 14110, "nachos": 28349, "80th": 3668, "LBJ": 27728, "Speaking": 18604, "ingenuity": 14630, "Agency": 2577, "chill": 7465, "coal-hole": 32479, "wardrobe": 30242, "reduction": 2898, "Dalmatia": 4976, "d'etat": 19311, "sometime": 11744, "opposed": 10453, "representative": 122, "Mukhabarat": 20790, "6565": 23625, "Trees": 29022, "Peoples": 21937, "20.00": 1695, "Tussauds": 5198, "planeloads": 19881, "Praying": 5936, "butterfly": 10025, "bordered": 16523, "They’re": 9541, "vaguer": 32439, "vinyl": 32552, "employs": 26116, "dysphoria": 1305, "excavations": 17541, "Woking": 26123, "Bargain": 27347, "Cheese": 29353, "braining": 27674, "Curtis": 31959, "strutting": 32178, "conscientious": 8097, "oceans": 9387, "18th": 13104, "Lansing": 11995, "installation": 13413, "shish": 15557, "submersion": 17214, "Muhammad": 4520, "Epis.": 11752, "Global's": 21613, "phosphorous": 32600, "OF": 11513, "mothers": 20040, "Because": 496, "dinginess": 30495, "zero": 7125, "Marrying": 27374, "THEY": 27046, "London": 4486, "writings": 4981, "TIRED": 11876, "01:00:51": 22029, "referral": 22928, "peru": 25465, "inquire": 26445, "RhodeRunner": 27161, "Connaught": 27419, "cope": 29904, "statistically": 1686, "enforcing": 13877, "1423": 16889, "1605": 25386, "demanded": 6627, "brick": 14323, "Mcdonald's": 26331, "07": 28605, "376-9004": 23861, "Significant": 1934, "seis": 6315, "lava": 30840, "post": 882, "bang": 19907, "Suck": 28465, "pre": 23802, "Expo": 12525, "trend": 1096, "fox": 32633, "commitment": 13874, "Tobias": 14475, "Anonymous": 12687, "shade": 13567, "ambush": 30532, "stranger's": 30227, "participant": 1660, "ministered": 5567, "reffered": 29010, "Dursley": 32023, "Brigade": 20734, "Enfranchising": 8109, "masculinity": 10871, "yourselves": 21614, "goo": 9873, "Domain": 14708, "nesting": 25138, "Reymont": 16913, "daytime": 10890, "x36709": 23617, "Builds": 24007, "shaggy": 32809, "expansion": 1181, "Review": 14281, "Value": 25995, "Thi$": 26745, "It's": 6137, "Highlighting": 21955, "dogma": 6607, "wildlife": 17000, "Douglas": 4253, "camper": 21834, "bill": 7062, "issues": 60, "gratitude": 14155, "hens": 27130, "speadsheet": 21816, "Bu": 19328, "http://www.time.com/time/daily/chernobyl/860901.accident.html": 18707, "stewardess": 30564, "smoothly": 25287, "mystical": 25313, "EMERCOM": 18668, "diety": 13412, "briefing": 20682, "particularized": 31145, "Rental": 7303, "Garcia@ENRON": 21626, "WITHOUT": 29877, "Tyler": 8697, "#1": 17126, "scrub": 27062, "memorable": 5321, "melanie.gray@weil.com": 23821, "shorter": 2812, "congestion": 15820, "cheerful": 30592, "cruel": 17643, "Wiltshire": 31638, "ranks": 4280, "aggregators": 22428, "breadth": 10808, "Photos": 12265, "N": 2053, "Bremen": 16181, "deductions": 7201, "must": 794, "whitehouse.gov": 20271, "sympathy": 23910, "mutate": 13822, "quesadillas": 29165, "64,500": 15684, "medicating": 10196, "True": 20306, "chubby": 8773, "Location": 15629, "hoarse": 32204, "Crim": 28100, "60's": 20363, "Novotel": 29792, "domestically": 13952, "keeping": 10252, "flavoring": 17890, "Cabalah": 25638, "unawares": 3045, "mid-thirties": 30408, "paired": 1681, "occupied": 18958, "3,500": 21396, "balding": 27792, "radio": 2714, "Leainne": 26450, "finding": 1931, "salespeople": 28120, "Elevator": 5405, "profession": 1288, "Cranmore": 29211, "Chapter": 7573, "Joyce": 8867, "Fusion": 29362, "favor": 7268, "Dry": 21882, "Shorty": 22101, "Laughter": 31994, "friends'": 9283, "Find": 17685, "ENERGY": 23437, "COSTS": 29230, "accommodation": 7304, "combed": 9011, "Effective": 21550, "Gabonese": 12094, "lonely": 4667, "tapping": 8924, "appetite": 16164, "enquiry": 22593, "Engineering": 2060, "GOD": 25605, "inked": 25838, "Mae": 6346, "heads": 5821, "Groningen": 3133, "Scipio": 23974, "versus": 7129, "Proposition": 21030, "gaming": 13559, "ounce": 29300, "backward": 14701, "offsite": 21654, "Awesome": 15901, "h=guys": 26459, "recovery": 10653, "II's": 25397, "remembering": 14997, "Sharq": 18556, "Westchester": 16541, "sanitation": 32503, "grappling": 15714, "Marilyn": 13384, "lagoon": 16179, "governmental": 11634, "Mission": 13924, "126": 22235, "Roger": 29140, "Discuss": 15268, "admit": 1783, "Berg": 13069, "youtube": 26475, "Augustin": 3547, "starvation": 20525, "heavenly": 31048, "specially": 31745, "installed": 13173, "Can't": 22789, "woo-": 6219, "company": 8339, "Olson": 21807, "remnants": 9208, "royally": 20521, "Effects": 18653, "firms": 19901, "PIP": 31778, "innovators": 8100, "That’s": 9888, "treatments": 13580, "Stillman's": 30271, "driveby": 9807, "4,489,109": 17084, "diplomacy": 14252, "Im": 24231, "83": 25962, "pantry": 17904, "depots": 17513, "nation's": 12665, "CPIM": 23300, "Tracy": 22315, "implementation": 673, "Feng": 1546, "soups": 8026, "Psychiatry": 8530, "neglect": 16938, "imprisonment": 20808, "sentimental": 31030, "privatly": 29799, "picture": 6503, "places": 2323, "parishioners": 29049, "1225": 2476, "bowlders": 31172, "their": 347, "team": 4824, "photojournalism": 11113, "engaged": 1385, "Panda": 29845, "Definitely": 16045, "Easter": 8700, "pears": 32430, "broadcast": 7555, "bartenders": 29578, "predicted": 3706, "transpired": 23716, "trotting": 25236, "dressing-table": 32004, "owe": 23233, "victim": 3933, "summons": 14181, "Goldbach": 3232, "interferes": 13549, "1.024": 26667, "flashlights": 11826, "4:30": 22200, "malignant": 20528, "Jeffs": 19991, "society": 476, "Kindly": 20244, "Lombardy": 13203, "SPM": 2676, "Star": 2998, "greetings": 14084, "shitting": 15782, "relaxation": 24624, "sweets": 28209, "predator": 25034, "surface": 1925, "embodies": 14629, "Championship": 11004, "blacksmithing": 6396, "08:30": 16607, "weakening": 25696, "microscopic": 27871, "called": 210, "dissemination": 1354, "Grammar": 3697, "complying": 12694, "bradley": 28139, "timing": 17689, "hairy": 30531, "uniform": 14151, "Spitfire": 10996, "Jersey": 11050, "rsjacobs@Encoreacq.com": 23796, "cat": 11972, "cropduster": 20717, "plotter": 20802, "Gibraltar": 22513, "mechanical": 3270, "Stolmy": 4914, "DOWN": 29871, "hairs": 9845, "chatter": 30297, "Algeria": 20359, "Eberhard": 11375, "waterfalls": 16708, "619-231-9449": 23878, "equalise": 13091, "religions": 13521, "Marin": 27267, "Bjerrebyvej": 17297, "revisions": 21718, "Kayani": 19713, "linchpin": 2477, "Alliance": 18550, "Higuchi's": 4648, "Given": 1029, "unconsciously": 14841, "balm": 10190, "Jaquier": 12815, "strategy": 13890, "Captured": 17535, "ASSISTANCE": 24346, "JUST": 27482, "intimidating": 9321, "http://herp-info.webs.com/beardeddragon.htm": 27761, "Waterproof": 27821, "gun-oil": 31617, "pleasantness": 31969, "Priorities": 22463, "Client": 21414, "Cj": 28056, "encrusted": 9056, "ways": 74, "Florida": 12312, "disagree": 13728, "poneh": 28043, "VPP": 23391, "alr-": 6785, "Jimmy": 13645, "platforms": 21575, "543": 12860, "glistening": 9694, "Élysées": 16982, "Saint": 4972, "unmistakable": 9688, "-_-": 27087, "Experimental": 2815, "Means": 14469, "moon": 9364, "descend": 9452, "fcking": 29643, "seeping": 30395, "acquaintance": 18733, "deliberate": 14819, "youngest": 4238, "Out": 6689, "militaries": 12888, "WTA": 10849, "Researchers": 15292, "exporter": 24570, "Giving": 24707, "Goodwill": 8215, "City": 2066, "subdued": 11160, "survive": 2072, "Default": 23494, "clinking": 31183, "decoupled": 22646, "mailto:galent@nepco.com": 23184, "MacGyver": 5758, "aggravation": 22777, "atheists": 32573, "economizing": 11642, "Enjoyed": 28606, "gives": 1852, "convience": 23157, "spread": 4744, "ownership": 10461, "hospitals": 20407, "Arms": 5872, "dispersal": 20721, "populated": 15286, "136": 14980, "gym": 8843, "extras": 11755, "flowed": 21421, "ethics": 15141, "MO": 22605, "Harpoon": 25796, "BOTHERED": 28907, "schema": 30112, "guideline": 31546, "attentions": 31882, "monarchy": 19505, "readings": 11017, "1835": 14734, "crafts": 29536, "uppercasing": 24170, "outcome": 3063, "felicity": 1913, "runaround": 29420, "Suspension": 23987, "recruit": 19386, "magnifying": 6865, "2.5": 13934, "2020": 13815, "conforms": 30033, "pizza": 6971, "jeju": 26587, "drafting": 14769, "integrated": 1598, "shopped": 29192, "Lebanon": 20533, "display": 274, "rehab": 17990, "tighter": 28036, "1588": 25380, "Zahā": 4469, "looming": 9052, "Félicie": 3897, "transcriptome": 10624, "1834": 14757, "Mars": 23405, "Empire": 4406, "outgrow": 6742, "Anthropologist": 15492, "crisis": 2448, "IMO": 26869, "lesser": 7616, "lets": 8782, "chiefs": 19893, "bakeries": 29504, "1562": 15409, "Employment": 23084, "laboratory": 18066, "locate": 15554, "Khinssacasnondelibreatenibever": 18094, "former": 3599, "ours": 6513, "Ft.": 20691, "shops": 6163, "edifices": 15317, "Disposable": 19381, "Cancer": 25270, "Walrus": 25617, "PC": 12778, "AREA'S": 26155, "initiator": 1768, "messengers": 30955, "distractions": 7675, "Jarrold": 4119, "1640": 14880, "impart": 18372, "EVERY": 28733, "Caron": 3548, "man's": 5970, "Push": 17917, "74419": 23556, "Trying": 6904, "shot": 4021, "accompany": 23449, "greed": 24871, "Biomed": 13976, "absoulutely": 28552, "Acedraz": 25455, "shave": 28144, "skytrain": 17124, "impatient": 29603, "hypnotizing": 17823, "Facility": 22632, "sheltering": 9037, "Anti-Israeli": 18919, "marched": 14719, "Herbert": 24355, "deteriorated": 19524, "rampaged": 18868, "prefer": 11691, "riots": 4035, "achieving": 5649, "forty": 7069, "email": 7792, "backside": 5258, "among": 804, "socialism": 25200, "和": 14902, "AMERICAS": 22027, "215": 26018, "anglo": 27627, "runflats": 29739, "lens": 15510, "1689": 4369, "commonplace": 8305, "analogy": 11155, "Future": 1952, "deadly": 7785, "manage": 3015, "happen": 7638, "Speaker’s": 14105, "creates": 10819, "clamps": 26833, "Jawaharlal": 14000, "5.87": 26015, "Earth's": 24825, "Sage": 22048, "Guess": 6441, "menus": 32404, "Northwestern": 13326, "Visitors'": 16573, "confine": 7240, "obsess": 15727, "purchased": 16444, "Floo": 32227, "usurp": 30372, "reliability": 1343, "atrophied": 28003, "BK": 28668, "beating": 11039, "gate": 15733, "fairly": 17150, "Highly": 13811, "Russian": 3678, "'Akkab": 18525, "distresses": 25636, "rudeness": 28951, "conquerors": 31024, "poach": 13943, "Navtej": 7285, "watered": 9895, "Lamonica": 19455, "deepening": 13868, "forestry": 25048, "national-level": 31429, "Vaisseau": 11427, "simply": 1834, "skydiving": 18180, "trams": 16979, "Hellada": 28177, "MYTHS": 18657, "Demante": 3922, "filed": 7496, "lump": 7956, "Visualisations": 24598, "Huver": 23877, "Statistical": 13555, "Africa": 1978, "Barstool": 5226, "wel": 26207, "cart": 18171, "Skype": 7795, "Rosalee": 21760, "Myanmar": 12159, "resounding": 25238, "qualitative": 1622, "shut": 7738, "needy": 17997, "Works": 11572, "topographic": 15307, "+852": 20922, "Unlike": 11304, "04:41": 23206, "Studies": 2663, "dip": 28440, "presumably": 29458, "electricity": 2117, "roadways": 16552, "5000": 4758, "evened": 28328, "incandescent": 2162, "bodies": 1453, "handsome": 4669, "ingested": 10299, "discovery": 8747, "squeaky": 27205, "EDU's": 31524, "quitter": 14403, "charities": 10787, "internship": 10258, "U.S.A": 21555, "audiences": 315, "Swift": 19241, "society's": 3450, "by": 207, "invention": 7947, "broaden": 650, "Stop": 7758, "colleague": 8017, "Gratification": 15208, "spool": 30476, "STAY": 29274, "Usage": 29307, "friendly": 2223, "mixer": 17873, "uncommon": 13672, "axis": 15608, "GOP": 20059, "#analysis": 7660, "overheated": 31134, "Upon": 2018, "source": 2118, "Most": 482, "Bearded": 27734, "fullness": 14078, "cm": 17791, "129": 28202, "loathing": 17998, "Claude": 24585, "religiously": 25740, "patronage": 27101, "Ranong": 19594, "Copan": 15389, "(c)": 2459, "Data": 3822, "x3-9890": 22996, "gerbil": 27677, "talks": 10394, "berth": 30813, "donors": 13279, "+44": 20927, "yielding": 13059, "Patriot": 19382, "d'état": 4541, "sir": 7171, "ignorance": 8744, "Visualization": 24604, "gasps": 27653, "revived": 18646, "665": 24475, "Ship": 32583, "label": 327, "Castagnola@ENRON_DEVELOPMENT": 23208, "Bond": 23523, "scrubby": 9727, "DEAL": 28910, "Can": 7279, "automatically": 610, "chunk": 7919, "Pandolfi": 8006, "freed": 14793, "unsure": 1373, "9866": 20929, "deciding": 25279, "Dynegy": 22745, "quid": 10409, "Waugh's": 4121, "tax": 8395, "Usmani": 19674, "Husband": 32420, "sinnel": 27199, "reside": 3631, "NEVER": 11856, "exhibit": 13267, "manned": 24776, "Hopper": 13258, "’ve": 7721, "juggling": 27503, "scandal": 25902, "Offices": 23874, "Jordanian": 30754, "Sabeer": 24166, "Exceptionally": 15011, "flavorful": 18465, "clump": 31177, "Garden": 22530, "Shakspere": 25342, "theatre": 4236, "delicately": 29096, "first": 298, "McDonald": 17337, "robes": 32040, "Chineese": 28153, "outreach": 12220, "creaks": 32148, "Kowloon": 12470, "Hein": 1981, "deep-rooted": 31345, "THEN": 27872, "Sellafield": 31486, "pollutant": 1321, "fit": 6105, "attempted": 1478, "Monde": 30595, "SSA": 2675, "futuristic": 15078, "sooner": 7717, "Share": 8541, "stinging": 10648, "Bend": 29291, "entirely": 7737, "embraced": 14488, "nearer": 32265, "withdrawn": 12980, "Abbotsford": 22238, "ANSI-92": 30039, "headlong": 9980, "Aster": 27411, "pall": 32832, "violence": 9621, "forms": 359, "Hood's": 25001, "disturb": 26418, "compression": 28019, "tortoise": 30327, "hot": 6397, "kind-faced": 32199, "inequalities": 533, "corking": 28966, "158,000": 15671, "345": 13154, "foot": 4314, "capacities": 13861, "Percentiles": 15643, "Kosovo": 13920, "delicacy": 29996, "spawning": 27853, "breeded": 9437, "directionless": 32784, "quinoa's": 18376, "blood-stained": 32242, "refuge": 13040, "abolishing": 20499, "Hedwig's": 32079, "flashlight": 26730, "rigorous": 443, "who’ve": 10107, "lanterns": 12925, "reservations": 20932, "Governor": 14460, "Exotic": 22694, "town’s": 16545, "levitated": 32669, "unreliable": 1255, "tantalising": 9015, "overstay": 27378, "Sehar": 12243, "informative": 28271, "spatial": 2565, "quinoa": 18354, "Jeremiah": 30649, "corruption": 4343, "website": 1088, "assailants": 9653, "shovel": 21264, "Holt": 4768, "giggling": 8726, "sheds": 24842, "937,000": 17404, "Nathaniel": 25415, "collaged": 10123, "scissored": 32389, "hollering": 24404, "gardens": 12624, "Sanctified": 5910, "mobilised": 24441, "2,500": 11556, "boisterous": 29830, "Mountain": 8807, "ascendance": 14358, "kicks": 8103, "Ivan": 5455, "descriptive": 15199, "Information": 2229, "24,000": 24968, "oven": 17866, "booth": 12609, "retiree’s": 7934, "Qtr3": 30149, "Table": 20934, "pension": 32691, "217": 21079, "pimple": 15702, "riddled": 28717, "Surrounded": 15388, "retroactive": 11561, "Moon": 9361, "Latino": 14361, "hike": 15971, "Karzai": 19638, "ended": 3288, "null": 30062, "kibbutznik": 30779, "Sons": 273, "sweeping": 9942, "Representatives": 14102, "Tulsa's": 17510, "Pax": 13784, "Cooper": 12993, "Barno": 19693, "Ugly": 4088, "Democrats": 12446, "11": 505, "Grand": 3640, "predecessors": 6017, "forgive": 11567, "Hydrogen": 10230, ";)": 24240, "intolerance": 4364, "Spa": 27509, "Mohawk": 22300, "fluids": 3281, "garment": 32787, "Usenet": 24334, "cited": 7618, "grocerys": 27601, "Burroughs": 12018, "1890": 16384, "Epic": 5273, "unbearable": 25309, "Mails": 25325, "Jemaah": 20724, "Bengal": 19586, "Percell,": 22903, "anxieties": 14182, "Rem": 4553, "Atlantic": 13901, "existent": 25713, "=(": 26301, "Governor's": 31929, "noir": 4126, "enhancing": 11637, "handkerchief": 9876, "Bernoullis": 3161, "Mesa": 17134, "ALWAYS": 21466, "future": 1966, "parental": 26546, "faithless": 31284, "parameters": 2550, "invest": 8511, "LV": 10978, "subsidiary": 24364, "active": 2581, "Ferjani": 13141, "Shaikh": 18468, "CRA": 552, "i-": 6114, "appy": 26194, "co-ownership": 7979, "5th": 20634, "Tina": 10985, "gated": 24293, "Nacional": 963, "post-modern": 13411, "beckons": 14028, "Shahar": 30610, "Again": 8438, "Bradley": 7546, "Divine": 10148, "three": 524, "there'd": 32820, "helping": 4387, "voicing": 18844, "Libby": 25959, "gtee": 23228, "24": 1396, "sonnet": 1086, "2023": 12953, "Last": 4732, "disc": 20601, "Gon": 6415, "reward": 11066, "Carroll": 9801, "bestseller": 10381, "duplicity": 22780, "CDT": 22970, "furthering": 14086, "prejudices": 11216, "shrinking": 32164, "17": 510, "comment": 3059, "expecting": 5849, "hobby": 10331, "vowels": 18116, "Shamanism": 20219, "Box": 21821, "sorted": 29339, "vitalized": 13855, "athletes": 10866, "Chief": 7218, "concluding": 19432, "Fabio's": 20166, "Written": 32223, "concentration": 7787, "Visualizations": 24594, "80": 10378, "frankly": 7302, "pace": 9952, "Arthritis": 24055, "dozen": 7700, "u.k": 26305, "spay": 29401, "h": 25730, "Haas": 22445, "Spend": 24602, "Creativity": 20011, "Italy's": 13358, "runway": 17156, "Overpriced": 28598, "Sanders": 23760, "stipes": 27791, "mid-July": 23522, "Organization": 8052, "swallow": 18017, "silver": 10989, "gravitational": 15543, "binding": 9857, "Ladakh": 19120, "prompting": 12939, "Resource": 23439, "Shiraz": 16220, "Collaboration": 2425, "possible": 467, "WHO": 11851, "yea": 27290, "Taylors": 22202, "Gossip": 30731, "Landgraf": 11380, "----": 21350, "midterms": 25900, "persecution": 3140, "scam": 27026, "ideal": 7976, "mangers": 29530, "Egypt": 5930, "seasoned": 27861, "unorthodox": 10661, "Brook": 3273, "Yeo": 13031, "08/17/2000": 22103, "hugs": 27950, "http://www.petsathome.com/shop/combi-1-dwarf-hamster-cage-by-ferplast-15986": 26488, "Mongolian": 28878, "person": 6590, "reservoir": 23401, "Costs": 23484, ".:": 24906, "Editor": 30196, "non-crumbly": 27858, "letting": 6897, "leader": 3355, "CONTACT": 24757, "glad": 6234, "Loch": 23388, "brainer": 28344, "$": 5216, "filtered": 15022, "bemused": 31415, "plenty": 16548, "job": 7138, "abuse": 11668, "spadework": 20876, "Peter's": 30264, "1810": 23873, "simplest": 18330, "milestone": 10768, "Cafasso's": 16600, "Higuchi": 4598, "rowing": 32526, "advisers": 23705, "functioning": 1583, "obligation": 19218, "Shop": 28059, "Duct": 28824, "attract": 914, "_report.xml": 30125, "Pian": 3495, "Tajik": 19720, "12:01": 23543, "street": 8987, "vastness": 24614, "ymsgr:sendIM?mayursha&__Hi+Mayur...": 25329, "handcuffed": 12206, "swapped": 13630, "Somebody": 13528, "chasers": 18307, "Child's": 4704, "PGT": 21305, "distort": 15619, "liquidation": 22326, "crumples": 8833, "???": 21784, "capabilities": 8370, "movie": 5753, "MUCK": 11937, "detected": 25575, "rhinoceros": 32034, "calculation": 15692, "Tanker": 25776, "crawl": 17001, "omnipotent": 6650, "torrents": 8922, "grade": 9546, "MUD": 24246, "119th": 30397, "legitimacy": 1347, "pleaded": 5976, "SPRING": 11861, "inspiration": 15253, "Hypnosis": 17812, "Sincerely": 11676, "disadvantages": 10777, "profilers": 20673, "lb.": 21750, "infield": 30508, "lends": 15282, "Tåsinge": 17233, "times": 1371, "geologist": 4231, "terrifying": 19891, "Walters": 21508, "Haim": 20347, "NCAA": 4849, "ERCOT": 22870, "1860s": 17064, "telephone": 23835, "accountant": 29870, "Hafijj": 17145, "01:09:32": 23951, "Ten": 7030, "Phone": 21415, "apron": 27638, "municipality": 13978, "suburban": 16388, "foster": 27458, "06:02": 24506, "pots": 31561, "Czechoslovakia": 10430, "origin": 4270, "strategies": 596, "Chatnam": 16253, "Eelam": 19004, "creams": 26968, "superb": 10898, "stategy": 20992, "debit": 29031, "Leno": 13661, "urgently": 14383, "industries": 15060, "dmetcalfe@cullenanddykman.com": 21493, "macadamia": 17899, "Exocets": 25802, "Nelson": 14598, "profitable": 3609, "notably": 3941, "Apa": 5992, "NO": 19476, "Alena": 21972, "Suzanne": 28276, "lieutenant": 4355, "horizontal": 2632, "pro-Zionist": 18961, "willed": 31828, "remodelling": 17583, "centimetre": 24128, "Magazine": 10533, "snowy": 9703, "zoo": 21249, "percentile": 15636, "promise": 8410, "vanishing": 30891, "Mozilla": 12774, "exclusive": 11101, "345-9945": 21416, "chloride": 27895, "Shot": 18413, "Kensington": 31570, "simplicity": 10967, "endemics": 17186, "souls": 19974, "yummy": 29327, "Riders": 17509, "reflected": 830, "buckled": 9350, "cinnamon": 15888, "literary": 4658, "welcoming": 27276, "facilities": 7605, "Ware": 8236, "awake": 8601, "Senate's": 9301, "armholes": 8612, "fascinates": 15434, "Admiral": 17473, "Fourth": 7359, "competence": 14654, "crest": 9004, "FIRST": 12062, "Bertrand": 3375, "Manchester": 17522, "575": 22249, "Parama": 24099, "lead": 371, "preserve": 14245, "sang": 9007, "Marbles's": 5271, "they’re": 7814, "activities": 1599, "plain": 9818, "kits": 12656, "All": 890, "Resilience": 15216, "100,000,000,000": 24371, "banners": 20456, "asceticism": 32855, "disposition": 32492, "Nuria_R_Ibarra@calpx.com": 23814, "Cause": 6434, "columns": 7701, "sensory": 7752, "pupils": 16833, "leg": 10725, "thugs": 19353, "beds": 8936, "Maya’s": 15383, "rabbi": 14367, "selectively": 18144, "Mapplethorpe": 13394, "article": 2251, "Length": 26063, "containing": 2179, "Episcopal": 13237, "successor": 5912, "obedience": 5945, "vodka": 10516, "economy": 754, "correspond": 21677, "Laughing": 27982, "sought": 7401, "barcodes": 29308, "designers'": 30009, "washing": 4618, "worries": 24802, "publications": 1328, "creations": 2974, "Maldives": 14206, "800.713.8600": 23326, "reconvened": 14745, "specks": 31097, "boiling": 32579, "categorization": 3075, "Wooh": 16236, "banishes": 7449, "fade": 32684, "picks": 6488, "Olympic": 8405, "Leslie": 22877, "afar": 9450, "<<": 21063, "stage": 299, "republic": 24358, "occasion": 11058, "schoolchildren": 17368, "guacamole": 28489, "levers": 9940, "#pathos": 7824, "collection": 95, "Residential": 7184, "carafe": 32403, "commissions": 11417, "innovation": 7445, "rediscover": 14419, "pjɛʁ": 3503, "compensate": 17651, "Roadhouse": 29397, "Revised": 21032, "briefcase": 32791, "pens": 30483, "Shires": 6420, "strolled": 31201, "lifestyles": 15269, "value": 1915, "biologically": 17039, "see": 247, "Seleznov": 23087, "edges": 4008, "Yannick": 13098, "CEC": 22792, "toothache": 28254, "Weekly": 11149, "Drink": 10191, "envelop": 25886, "mayor": 7652, "Megapixel": 26223, "Karachi": 20743, "She's": 6125, "08:22": 23791, "inconsiderable": 32835, "insisting": 32329, "holiday": 16784, "94": 4653, "carbs": 16170, "to-": 6871, "Derivatives": 22517, "Comex": 19583, "aging": 2207, "Chasers": 18296, "imposition": 15467, "heater": 26712, "Asset": 29521, "colossal": 31089, "unravel": 32788, "Earls": 32897, "rarely": 1864, "Enemy's": 9240, "peanutjak...@usa.com": 24337, "mormon": 26454, "semester": 15528, "Rise": 21877, "1)": 10806, "ache": 32038, "MfM": 25371, "god’s": 10188, "hooligans": 14326, "twenties": 11019, "Higher": 19180, "Glasgow": 29636, "vampires": 9574, "struck": 6195, "Galante": 16644, "subterfuge": 20182, "WOW": 28419, "Angelic": 15908, "pinkish": 32185, "imports": 31527, "inflation": 14409, "parade": 12618, "1950s": 3454, "Designed": 19473, "01:39:56": 22919, "Rocca": 19117, "weeks": 1647, "unprecedented": 11213, "sprays": 15063, "Nagin": 24418, "drum": 8963, "pacifically": 30920, "week": 2855, "satisfy": 1211, "expands": 8114, "void": 20098, "tutor": 32839, "noons": 9198, "rot": 19954, "guider": 6895, "Prom": 11735, "esimien@nisource.com": 21928, "scriptural": 24690, "curious": 4748, "creeping": 9965, "Cleveland": 8563, "Qaeda's": 20625, "Reports": 12950, "cactus": 26368, "fist": 9652, "fresh-faced": 32463, "Money": 6132, "s.hernandez@udc.es": 2244, "ensign": 31121, "point": 1519, "make": 590, "2009": 1580, "Global": 12063, "exploitation": 2359, "empire": 9210, "rescue": 12186, "inversion": 20126, "types": 1161, "http://www.playatmcd.com/en-us/Main/Gameboard": 26341, "Luxembourg": 11435, "thing": 6359, "EVEN": 11834, "AUD": 22216, "lent": 6424, "narcotic": 9369, "281-735-5919": 23630, "higher": 1312, "sighs": 8872, "faulty": 4429, "ashamed": 9143, "Gorman": 14309, "sanctions": 24568, "superiors": 17342, "Muttering": 32276, "jets": 19204, "gras": 29490, "UFOs": 25022, "supposedly": 19897, "research": 174, "REALLY": 21518, "THX": 28868, "McGrath": 16006, "Khan’s": 19739, "Sao": 23195, "mailing": 12711, "zoom": 26219, "Rae": 6091, "redeems": 31029, "Plantation": 23240, "Bob": 14454, "tuning": 23549, "Equine": 26111, "DO": 11832, "gulf": 20079, "relay": 25931, "firepower": 27714, "Thoroughly": 28162, "inspirational": 9648, "18:20": 22629, "large": 416, "1968": 3705, "amputated": 32386, "": 1, "Class": 4867, "god": 7006, "concertina": 30991, "struggle": 14044, "transferable": 23528, "quadruplets": 32717, "Erebus": 30944, "Arakan": 19510, "affordable": 14541, "databases": 23126, "Makkai": 21040, "“": 690, "GOING": 21521, "Nowadays": 2089, "RTE": 2687, "elder": 6004, "Strasbourg": 3196, "Renton": 28933, "thinset": 29559, "Pimentel": 4915, "I’d": 7715, "Orissa": 19588, "eliminating": 20909, "Almost": 15454, "Juego": 25454, "Liz": 22289, "sorry": 6811, "clutches": 32085, "Yung": 12443, "mailto:amy.cornell@compaq.com": 22140, "conviction": 19429, "jade": 15329, "PDT": 20270, "optionality": 21218, "leaked": 12977, "1.877.999.3223": 22813, "Salsa": 29220, "Rodents": 26569, "watches": 30834, "pouch": 6027, "Shake": 18062, "earlier": 2384, "Remain": 18184, "extradite": 27664, "Stridon": 4973, "corns": 26893, "byproduct": 10495, "Constantine": 17533, "35": 15113, "groups": 840, "Liberia": 19886, "Hue": 27721, "http://i.imgur.com/S2MD2.jpg": 27164, "waitress": 29156, "Kit": 30169, "attitude": 15256, "fuck": 13618, "necks": 30589, "victory": 12458, "companies": 1324, "reminded": 10020, "lackluster": 19573, "probable": 25749, "DISCOURSE": 14912, "typo": 27516, "1/4": 17862, "topic": 10242, "barred": 8415, "buzzwords": 13383, "glorious": 7680, "promising": 4684, "nonconventional": 20680, "Lower": 32187, "Wat": 17389, "McNeally": 21545, "Instant": 17950, "Colonial": 16973, "alluded": 6874, "sci": 5797, "podcasts": 2971, "Draco": 32082, "performance": 902, "Bonacci": 5472, "191": 13884, "Crockett": 14790, "Parker": 32607, "au": 5402, "Wire": 20766, "frowning": 31082, "Henley": 25640, "Coeur": 29334, "Jerry's": 21845, "roughest": 6066, "bathe": 18018, "aggregate": 548, "raging": 30859, "alarmed": 17943, "sole": 21495, "disability": 10869, "NASA's": 24492, "leered": 32288, "aerated": 10279, "signage": 28928, "UNLIMITED": 28521, "TA": 28795, "family": 3113, "sink": 7695, "hadn’t": 10174, "scientology": 12729, "sour": 18458, "tail": 2730, "east": 10413, "BTA": 27014, "reasonable": 1313, "thouhgt": 29553, "Omnimax": 16426, "program's": 24780, "Cowpland": 24156, "9th": 4954, "Frontiers": 1377, "upright": 15531, "percentiles": 15631, "trains": 20432, "Asher": 25663, "Equality": 24651, "deadlines": 15738, "2004": 1609, "Arabic": 4466, "kicking": 10463, "yards": 21510, "HOAX": 24449, "divert": 25506, "dipping": 9061, "fidgeted": 31272, "ireland": 26307, "ONLINE": 22484, "04:13": 21724, "wagging": 27702, "prevalent": 2997, "freedoms": 13873, "Sat": 16608, "connections": 6885, "Walsingham": 25362, "Jackson": 11016, "Stony": 8534, "chart": 10733, "flunking": 14799, "Clifford": 14824, "emperor": 18357, "directors": 5488, "feelings": 8754, "clip": 15823, "toes": 24053, "amazes": 28681, "somewhere": 6076, "nigiri": 29590, "Hiring": 10717, "weirder": 20096, "Addressing": 30605, "Southwest": 17031, "has": 128, "wind": 2650, "dilemmas": 20501, "cozy": 21980, "pre-killed": 27365, "Capote": 13342, "repay": 11555, "VIP": 12198, "Centilli": 22722, "02:19": 23840, "valuable": 566, "Ed.": 10950, "herself": 5290, "F.R.S.": 25391, "thematically": 27910, "buys": 28617, "fireplace": 15559, "1750": 3222, "faithful": 12051, "Onion": 11098, "Natalie": 24415, "hauls": 21241, "Funny": 20025, "aunt": 25228, "balsa": 26839, "Doris": 6680, "bullshit": 23904, "figuring": 6446, "Mexican": 6033, "income": 7837, "es": 18068, "Amsterdam": 16757, "Ground": 11052, "Tough": 23917, "grown": 8235, "Estonian": 12095, "VI": 14970, "hostel": 3901, "essence": 15250, "hence": 541, "iis": 22961, "sincerely": 14471, "mathematically": 7963, "Asbestos": 25958, "Wide": 614, "Kong's": 12461, "satay": 28482, "easter": 27201, "aid": 14265, "Turkey": 11242, "criminologist": 18052, "1979": 5358, "liquor": 16612, "Nick's": 28711, "monumental": 3436, "contingencies": 22651, "presents": 894, "McCutchan": 13288, "implants": 8384, "phased": 26050, "posts": 7704, "Chambermaid": 5509, "81P/Wild": 11301, "struggles": 5879, "spotlights": 32757, "Heidenreich": 264, "overtopped": 25557, "César": 5373, "booked": 13078, "na": 6048, "grow": 8123, "partners": 8512, "worn": 9526, "lack": 417, "listed": 12129, "Baffin": 24107, "Trails": 23576, "amendmnets": 22232, "hanged": 31158, "12:21": 21354, "chimneys": 9054, "bravest": 30767, "preserving": 8021, "garage": 8874, "Caves": 30750, "challenging": 2981, "one's": 6484, "Mayko": 26507, "pretend": 14978, "reprioritised": 22603, "Hewlett": 14576, "experienced": 11045, "A-": 11940, "fearsome": 9064, "Ani": 18470, "awesome": 14373, "desparate": 24516, "downgrading": 25926, "laborers": 17367, "OLYMPUS": 26202, "Surgeon": 28126, "Hasht": 16836, "Label": 18149, "boom": 16862, "Nook": 23949, "variants": 3770, "left": 3443, "Lifetime": 3670, "operated": 5193, "coordinate": 2309, "liberals": 7839, "508": 11500, "Cheng": 12390, "Voters": 12681, "readers": 7671, "Fascist": 24739, "Alastair": 24422, "Break": 27927, "gutters": 8949, "Michel": 26603, "insolence": 31265, "geographic": 2260, "continuing": 13910, "faced": 12086, "macadam": 30357, "Newspaper": 25977, "Fabiani": 1553, "529999204044": 17029, "frothing": 19919, "Balard": 26608, "garbage": 29572, "kippers": 32425, "ambition": 4674, "omission": 20383, "analyst": 20616, "13279": 20274, "StoolLaLa": 5228, "Globe": 12699, "communicated": 13628, "normality": 18955, "Dems": 19211, "Genesis": 11321, "committment": 22679, "uninteresting": 25069, "Thats": 29727, "Atomic": 18654, "Simons": 1552, "probation": 24304, "Simon": 3266, "Diane": 23105, "28": 1484, "traitress": 25569, "WANT": 28401, "Sanders'": 23811, "No": 6146, "ITALIAN": 32483, "Split": 28516, "snap": 13440, "Appendix": 2390, "imagine": 10034, "approval": 8179, "ramp": 19168, "sledge": 32640, "mullah": 25737, "W3C": 30103, "NEXT": 11896, "Pawtucket": 4921, "thumbs": 15999, "unalterable": 31260, "soldier": 4330, "ENJOYABLE": 29662, "Together": 3279, "virtual": 11387, "Sustainable": 14481, "☏": 17259, "Netherlands": 3134, "Paramus": 16504, "racking": 19215, ">>>": 26619, "hoax": 24517, "customer": 10530, "heel": 24094, "PEREGRINO": 25409, "Conclusions": 2365, "subsidies": 26057, "Limits": 29522, "Simien": 21913, "Voldemort": 32059, "Gebo": 5526, "yielded": 20555, "distorted": 15584, "over-prescriptive": 31554, "emphasized": 14250, "contentious": 18771, "fund": 5888, "Uh": 6090, "embrace": 15158, "intuitive": 25311, "Mouez": 13133, "imperialism": 15466, "frosts": 27836, "daughters": 4207, "umbilical": 25744, "neuro": 15855, "Breaking": 1130, "Wayne's": 12564, "decisive": 6585, "motions": 3240, "Region": 26313, "Langeland": 17234, "sporadically": 29363, "pyjama": 31566, "wrongful": 32931, "Technlogy": 12080, "Finally": 653, "moniker": 16393, "invovled": 20031, "Ruy": 25460, "Resign": 14390, "atrocities": 19127, "spelling": 18111, "dignitaries": 12199, "Pirates": 4783, "WHEN": 11935, "EST": 18819, "Linna": 25227, "cge": 26764, "pre-made": 29501, "Art.": 11769, "Bieber": 16140, "reminds": 18491, "Mormons": 20239, "structural": 5687, "linguists": 3431, "wire": 17876, "perks": 2163, "14:00": 17024, "bakery": 27332, "Dzida": 28179, "seventeen": 6536, "pilots": 9266, "skills": 1536, "militants": 18614, "Eden": 13116, "Ayman": 18740, "trademarked": 24175, "Nigel": 28475, "mischief": 23649, "Application": 701, "bitch": 15755, "allow": 2173, "removing": 15073, "caverns": 30645, "feast": 5008, "oneself": 8570, "eremites": 5159, "MBA": 20944, "naturalist": 15160, "Kyle": 13139, "Sevil": 20955, ".04": 21813, "Baghdadis": 18567, "fanfics": 2972, "scenario": 903, "Mormonism": 19989, "swish": 9709, "Devil’s": 26992, "65": 21017, "SpreadingSantorum.com": 10546, "Flag": 9616, "pilgrams": 13171, "Toast": 18373, "dungarees": 12028, "veterans": 3606, "headspace": 16153, "yelled": 29084, "Professional": 4863, "picnickers": 9806, "Anthrax": 20574, "105": 23889, "Ham": 28363, "bag": 6940, "polishing": 3878, "Geri's": 6123, "10:07": 23188, "lovin'": 28721, "So": 6135, "lanky": 17755, "Guest": 4187, "51,516": 12487, "850": 25041, "REAAAALLY": 28738, "renal": 27068, "inwardness": 30373, "Holderness": 29255, "7.2": 15019, "compassionate": 27655, "06:20": 22368, "despite": 1382, "indicators": 9941, "trace": 9962, "huge": 6474, "depiction": 25210, "interesting": 1961, "inch": 7379, "Piaget": 15030, "maam": 21455, "resign": 14410, "teenager": 12809, "ISS": 24479, "beguiled": 31326, "Hence": 5662, "movies": 4766, "equating": 18862, "prankster": 17911, "inhabitants": 15274, "psychiatrists": 26080, "Gu'ud": 19327, "Richmond": 28645, "inclined": 6892, "foreigner": 19139, "bat": 18328, "collected": 683, "epistemologies": 2538, "Rick": 10488, "Rumsfeld": 25974, "hammered": 32157, "ANYWAY": 28759, "philosophy": 3220, "Sufaat": 20646, "1691": 21090, "حديد": 4468, "alchemical": 20286, "ROMs": 26161, "Valentin": 10109, "Plant": 17733, "buttery": 15924, "filler": 28961, "cooperating": 13905, "Boom": 13794, "pictures": 1996, "phobia": 29215, "Kermit": 5335, "Bush's": 18846, "detrimental": 10302, "go's": 15941, "Elite": 29412, "horizons": 25299, "10:39:03": 21597, "represents": 2976, "received": 3648, "Eurostar": 22195, "leisurely": 11407, "LLC": 21101, "tonic": 17804, "eis": 26967, "Winging": 27884, "scent": 15936, "bush": 15979, "Schadenfreude": 13723, "Aguilar": 13084, "Fedayeen": 18572, "reformer": 6609, "Wonderland": 11273, "Murders": 19963, "Philosophy": 10372, "inconvenienced": 32950, "effected": 24892, "preoccupied": 30432, "snitches": 18335, "LAST": 29143, "Presidents": 14452, "angels": 5794, "par": 28713, "traditional": 3400, "Hyatt": 21562, "BENEFIT": 24531, "Murfreesboro": 29733, "occupation": 7627, "unfortunately": 2905, "sarcastic": 9909, "repition": 27541, "revolution": 4372, "charmed": 31068, "reread": 15260, "man-about-town": 31733, "heavens": 10145, "suspension": 14737, "sheriff's": 12338, "million": 2124, "lawless": 20512, "ar": 26365, "circulation": 8108, "x34703": 22664, "smacked": 13416, "benches": 32937, "McFarlane": 1608, "substitutes": 8039, "Landfall": 19512, "snapping": 32527, "CAROLS": 2664, "chilly": 31927, "Sarah": 20942, "OpenAI": 13691, "7:40": 11754, "pregnancy": 16150, "sobriquet": 25418, "parking": 9556, "Qanooni": 19723, "boyfriend": 5304, "Xbox": 8561, "unruly": 20062, "Cherokee": 15419, "853-7557": 23074, "peak": 1299, "fucking": 13608, "Distances": 25206, "mountains": 13951, "admitting": 29034, "exist": 1000, "wikis": 10825, "peddle": 28897, "Unhunh": 6922, "bestowed": 32727, "strip": 7461, "fighter": 9271, "unprofessionalism": 29856, "VEGAN": 24907, "Minkin": 23268, "Maryam": 20074, "750": 19628, "melded": 19829, "1300": 29054, "10.0": 23608, "fraction": 7106, "Votaw": 21378, "gut": 29204, "downloading": 28264, "miniature": 26826, "TEN": 18670, "5.8": 27886, "verb": 1145, "lucky": 6759, "bills": 8628, "Sacred": 18965, "autonomy": 8392, "dinners": 27931, "thanks": 6481, "recognised": 5001, "tasted": 17988, "lorry": 32394, "appropriation": 20287, "passcode": 21696, "moll": 5400, "stink": 8656, "attacking": 13095, "RefLibPaths": 30197, "brimming": 25314, "Guys": 15985, "mm": 22609, "Officer": 20838, "03:20": 23554, "Day": 4733, "Pediatricians": 1268, "palette": 16222, "aa": 29409, "companion": 2958, "desirer": 32665, "wolf's": 25032, "hydrated": 14814, "delivering": 20240, "mitigated": 21325, "ADSL": 26520, "reckoning": 14116, "hippie": 23902, "killed": 12248, "Wagner's": 32614, "catholic": 13189, "tweet": 12200, "channels": 10881, "tens": 17069, "Road": 15966, "nitrogen": 18029, "cross-functional": 23856, "creativity": 7457, "hesitated": 15497, "seize": 25254, "Knudsen": 23141, "inconvenient": 25283, "PUCT": 22852, "apparatus": 19839, "Lopez's": 25449, "idols": 9415, "exhibition": 13285, "rambunctious": 26858, "seriousness": 27630, "Lemell": 23552, "Maize1_1017013": 1848, "Galois": 3833, "inhaling": 13710, "raffles": 12597, "Large": 13697, "hazards": 26972, "exceeds": 28682, "dirty": 9758, "Emminence": 19269, "assure": 13209, "77": 16572, "detectors": 11373, "Books": 18131, "shorthanded": 30835, "AUCTION": 24532, "01/26/2001": 23383, "blindfolds": 26078, "Discussing": 12168, "Agreements": 23104, "return": 716, "solstices": 15320, "percentage": 8078, "sweeper": 25649, "garnered": 4114, "Chrome": 12777, "artful": 32655, "word's": 1720, "Moloch": 30627, "Nixon": 7850, "Columbia": 15992, "Germany": 4316, "starring": 5494, "HICKENLOOPER": 14356, "5.37": 21927, "Adopts": 23288, "transition": 14288, "longitude": 2330, "doubtless": 9226, "Read": 10755, "vote": 8144, "poem": 10957, "structures": 10619, "surfaced": 19052, "1940s": 3488, "Cyprus": 30800, "Aren’t": 9887, "ld2d-#69334-1.DOC": 22441, "dunes": 17182, "use": 998, "swaying": 9428, "whenever": 7075, "orderd": 29161, "illness": 3212, "catagory": 29417, "aquavit": 30794, "Bernie": 31516, "CRACKDOWN": 19976, "713-793-2000": 22145, "Clyst": 4245, "Loved": 28061, "accompanied": 5119, "schedulers": 23655, "cleverly": 19758, "armchair": 30277, "jewelry": 6162, "Buy": 16590, "CA's": 23270, "Quaid": 5773, "collar": 9847, "invoiced": 21908, "withhold": 23691, "Nonna's": 16120, "Leisure": 16413, "testify": 19406, "Barger’s": 15503, "Marquis": 3571, "Greyhound": 17121, "Baluchistan": 18763, "WMDs": 26106, "Peach": 5336, "mailto:galen.torneby@nepco.com": 23185, "troubled": 8745, "Dranove": 10388, "Laidlaw": 21731, "memory's": 15866, "Whatever": 3987, "Resources": 14498, "commitee": 22677, "recognises": 31432, "copper": 18042, "federation": 5917, "curse": 10170, "paralegal": 22058, "doc": 23225, "heresy": 5145, "Mashhad": 16763, "hiatus": 23520, "Sunshine": 23973, "Walking": 3002, "fairest": 11537, "Elliott": 5855, "RVS": 17424, "assert": 5977, "menacingly": 32398, "radiative": 2684, "Shortstop": 4772, "Curr": 21664, "solved": 13980, "literal": 13542, "strikingly": 19252, "enovate": 21942, "Lisbon": 27527, "attendants": 30560, "Onward": 20331, "Rance@ENRON": 23743, "Intel": 24173, "dismissing": 19504, "assuage": 29067, "multiethnic": 15370, "Amen": 21357, "raise": 9601, "curly": 29288, "Gyanendra": 19503, "denounced": 30729, "joking": 14820, "mournful": 30894, "rumpled": 30409, "cabinets": 29101, "incentive": 1464, "accusing": 20882, "Colorado": 13446, "Awards": 4097, "Ranja": 14496, "uncover": 20158, "socio": 20212, "happens": 885, "predisposition": 20887, "Past": 351, "borritos": 29164, "Clem": 11123, "Greek": 3372, "retired": 3813, "lazy": 10171, "Picture": 14809, "redefined": 15119, "asians": 27258, "inspecting": 30336, "loyalty": 14672, "rally": 19500, "consumed": 13385, "prominent": 3111, "Crabs": 17225, "stamp": 10836, "chair": 7346, "Leonard": 20826, "Kiev": 4352, "ballads": 32530, "known": 1210, "whither": 9390, "repressed": 25660, "concerto": 31655, "sister": 2506, "activism": 3847, "IQ": 10744, "suppose": 6662, "dragged": 18640, "nail": 16596, "second": 684, "define": 442, "bugle": 11041, "murderous": 20408, "dialogue": 14211, "hypocrisy": 20131, "calf": 27176, "screwing": 30823, "Clutching": 32278, "hood": 29744, "Rook": 9800, "goodness": 14345, "usally": 29795, "fairness": 11583, "sharing": 5212, "Claudio": 13225, "dismembered": 20395, "Sheltered": 31604, "Martinis": 32703, "overlooked": 10867, "8.00": 10527, "travelguides": 27405, "closing-down": 31485, "rearrange": 31684, "gesturing": 32695, "hug": 11090, "https://www.nytimes.com/2017/04/16/technology/inside-the-hotel-industrys-plan-to-combat-airbnb.html": 15138, "BEE": 11864, "Cargo": 32538, "Schema": 30114, "motionless": 9672, "Ras": 31895, "Acupuncture": 29510, "Grounds": 16326, "obese": 8625, "lagged": 16176, "incompetence": 19908, "alerted": 22709, "Setoff": 23513, "readability": 30139, "protested": 18928, "hoss": 22788, "create": 3334, "classical": 1106, "utmost": 30447, "smacks": 25051, "arbitration": 23742, "alternative": 1895, "UAAR": 13253, "he’s": 9767, "1994": 3814, "scallop": 29589, "connotation": 18115, "DEMANDS": 11938, "Hambali's": 20676, "cared": 26804, "reinforcements": 9685, "communication": 6882, "bind": 14090, "Cafes": 27330, "provisions": 11570, "flannel": 31074, "exceed": 25159, "Scarne": 10322, "Cairo's": 20866, "Japanese": 1734, "Wildwood": 28837, "OER": 14502, "quoted": 10555, "software": 1032, "container": 6256, "Thorell": 1576, "Sit": 7133, "eat-e": 31744, "Merrist": 26118, "Kennedy": 11140, "Alberta": 22355, "Auster": 30262, "greasy": 29751, "equips": 20463, "unlikely": 2001, "puffs": 29841, "ev": 11485, "giraffe": 26263, "uprush": 31594, "spent": 3651, "Retiring": 5960, "represented": 14247, "balances": 22585, "airwaves": 7925, "Moor": 30442, "distortions": 11296, "dimensions": 2453, "jury": 5529, "Elinor": 729, "independent": 4249, "yowled": 32410, "Mr.": 5270, "diversification": 20973, "philipinos": 27259, "98011": 23180, "Islamiah": 20725, "RFI": 2716, "a.k.a": 22085, "Removes": 24068, "SERVICES": 23438, "garrison": 12590, "smuggled": 19877, "TRUST": 29272, "mankind": 4002, "concludes": 31535, "recieve": 28141, "Noble": 22102, "Lost": 18216, "necessities": 24673, "beach": 9984, "3/4": 17844, "realy": 29608, "villages": 16999, "apple": 15827, "Brings": 9362, "G.": 6168, "Could": 6098, "08:27:46": 20269, "irrigation": 17068, "dictate": 17340, "Levitt": 21763, "Michigan's": 25010, "inexhaustible": 30233, "et": 252, "Monday's": 21012, "Fang": 3429, "onesie": 28634, "embarrassed": 18002, "invitaion": 23189, "Limerick": 26146, "Soviet": 10397, "leaky": 691, "clarify": 7490, "oppression": 10018, "wordlessly": 14853, "Ranasinghe": 19055, "death-knell": 31451, "Beautifully": 29063, "harbor": 17157, "Davidson": 6961, "USAMRIID": 20660, "cooperate": 14085, "Whilst": 27666, "microcosm": 3007, "bullseye": 25778, "risking": 8457, "Charleston": 3582, "plot": 3028, "mistruth": 14337, "failure": 7392, "steppers": 6925, "MIT": 10389, "alcoholic": 13578, "explains": 7209, "fruit": 8241, "Moriaty": 2532, "litigation": 23781, "prognosis": 24529, "his": 272, "pouring": 4004, "Aafia": 20741, "gaze": 21863, "husbands": 21509, "toasting": 30601, "faltered": 18826, "monthly": 11690, "kosher-beef": 30574, "Apache": 17052, "businesses": 8094, "header": 13090, ":-)": 21266, "Oberst": 4423, "Not": 6143, "non-realism": 14939, "monitor": 2563, "inspired": 2839, "insanity": 6875, ".2": 18036, "Bailey": 13, "footpaths": 30358, "altered": 9258, "continuously": 13547, "strict": 4305, "begged": 30609, "humid": 9371, "greyness": 9946, "Canadians": 16447, "Should": 6989, "overplayed": 19354, "13": 303, "distinguish": 1204, "committments": 22981, "overtures": 18903, "loudspeaker": 12869, "22301": 24764, "wud": 26220, "although": 1190, "misinform": 29183, "MIND": 28493, "seamen": 30969, "fusions": 29071, "experiance": 11790, "hopping": 2940, "buried": 4017, "quoting": 12839, "hillside": 31214, "pencils": 16043, "Campaign": 19824, "Matthew": 4077, "flattered": 32680, "Indexed": 21441, "watching": 6361, "Disatisfied": 29315, "dark-panelled": 32888, "Poitiers": 5111, "branch": 4276, "shoe": 6390, "dismissed": 8615, "junkie": 28986, "Kenyatta": 31805, "http://www.antifraudcentre-centreantifraude.ca/english/home-eng.html": 27037, "dolomite": 30632, "Gentle": 28260, "re-routed": 19903, "vital": 11580, "christchurch": 26964, "drowned": 31104, "Romans": 17525, "Podcast": 5307, "origination": 26518, "Facebook": 12195, "unused": 15121, "head": 4581, "author": 1016, "Bridget's": 25343, "Calcutta": 26437, "SEATS": 29664, "arrogantly": 25639, "horsetail": 15935, "Polo": 32699, "tables": 13425, "caveat": 2897, "confluence": 20284, "Inca": 15420, "Rcommended": 28267, "Detrick": 20692, "ANDRILL": 10602, "Trek": 13704, "#ethos": 7823, "tavern": 26698, "7": 481, "slumbered": 32374, "artificially": 2263, "intersected": 32756, "outnumbered": 14781, "investigations": 3264, "merger": 20868, "Macrocosm": 24048, "GUESS": 24914, "kenneth.lay@enron.com": 21796, "Ye$": 26742, "exhausted-looking": 31665, "Shenzhou": 24784, "Deutsched": 22064, "domains": 2274, "Navarro": 1070, "Misha": 5858, "heck": 15730, "Israelis": 18872, "last": 3903, "cantons": 31674, "parents": 1525, "turned": 3367, "weaker": 14666, "every": 1855, "Washington": 3512, "invoked": 19183, "consulates": 19641, "Aloha": 7552, "Sadly": 31392, "ladies": 14552, "1928": 3424, "Being": 14921, "seal": 18060, "Ongoing": 14568, "likely": 1279, "Brumbley": 24962, "SA": 8537, "Pan": 12431, "diver": 18243, "BRADLEY": 22832, "renew": 16468, "hanks": 9148, "Ave.": 17453, "crude": 23402, "MORE": 26430, "Address": 14003, "elves": 6438, "Nat": 13363, "System": 2266, "Mohib": 12075, "ear": 25957, "constitution": 869, "spend": 3839, "Kenya": 14485, "Armed": 18910, "21,000": 19486, "K": 20958, "creepy": 20262, "dunny": 32473, "pipe": 3287, "Hold": 15916, "impressionist": 21150, "elites": 827, "Total": 23604, "Abourezk": 11593, "Section": 21943, "ultraefficient": 30806, "ornaments": 15332, "Purpose": 25427, "seething": 25755, "comedians": 27504, "Monaco": 22185, "Let’s": 2478, "toll": 12272, "authority": 1251, "Lol": 27651, "feeds": 6681, "promoting": 792, "chains": 8105, "died": 3490, "appears": 1379, "GRECO": 25366, "objection": 27635, "tariff": 22389, "com": 28197, "Giannini": 13224, "Εὐσέβιος": 4963, "arrives": 13061, "curbing": 19683, "virus": 13801, "indiscriminately": 15513, "retrial": 20811, "contraction": 25143, "cleric": 18473, "co.": 29179, "Plateau": 17409, "may": 1066, "potash": 30807, "permanently": 5450, "hijackers": 20723, "Automotive": 29803, "testosterone": 13611, "excursions": 30370, "launcher": 26176, "tanks": 19134, "bet": 6327, "greys": 9043, "impede": 11610, "appendices": 22419, "WARWICK": 29949, "co-starred": 4221, "credited": 10373, "superficial": 5029, "founder's": 24155, "sulky": 31933, "applied": 654, "home": 2088, "second-hand": 32328, "fiction": 4627, "efficient": 616, "Andrea": 23203, "hairdresser": 29097, "freelance": 13798, "unsweetened": 17857, "shopwindow": 31659, "prefers": 6622, "knows": 9637, "mid-20s": 19860, "1967": 18901, "Affairs": 22825, "picketing": 23160, "4.0": 7670, "minor": 3530, "Yak": 15429, "path": 808, "alternations": 9954, "sheik": 20620, "lineatus": 27852, "图": 14869, "scratchy": 27213, "hips": 30258, "overtaking": 31035, "errands": 15008, "Lattice": 954, "Yang": 3395, "Daisy": 9701, "Namibia": 16487, "overrun": 19544, "Andreae": 10110, "Principia": 3262, "Steak": 20937, "native": 2029, "Stage": 23692, "5.10": 29385, "artifacts": 13300, "shown": 394, "5.5": 26026, "livelihoods": 14538, "Sydfynske": 17200, "intractable": 19033, "Nordic": 23257, "Assault": 12601, "slave": 14696, "sniffing": 27688, "these": 165, "Len": 3792, "NX1": 21281, "Characters": 18096, "sneakers": 16662, "instructed": 20662, "Kendrick": 12313, "Irregularities": 24058, "children": 1571, "compounded": 22636, "Priests": 19951, "occur": 864, "screamed": 11967, "Bradford": 22056, "r": 11489, "subpoenas": 23665, "1528": 25358, ".udl": 30054, "visits": 12751, "projectlondonmovie.com": 13759, "Ribs": 28434, "attacks": 12748, "I’ll": 9785, "evening": 6526, "Addition": 27255, "sensors": 13948, "30,858": 26051, "Economics": 698, "Assessment": 25152, "Caucus": 14132, "indefensible": 31946, "truths": 8443, "judicial": 906, "beat": 8962, "SPICES": 27624, "Ian": 4948, "whatsoever": 7365, "SE": 23242, "father": 3162, "exclude": 1901, "nobody": 11209, "ron.com": 22020, "any": 602, "slipped": 8965, "genetics": 27135, "targeted": 14128, "Stutenberg": 2526, "functions": 1457, "NASTY": 28397, "vapour": 8914, "craft": 9358, "patriot": 7943, "correctness": 15176, "winner": 12546, "vehemently": 18927, "mistook": 1294, "Heights": 22531, "DG": 23102, "O'clock": 24147, "ATE": 28564, "mary": 28830, "necklace": 32270, "pop...@spinach.eat": 25723, "indentured": 14692, "personaly": 28180, "stationed": 3674, "Bill": 6666, "ABBEY": 11899, "consolidation": 23495, "over": 277, "gloating": 19378, "Masters": 21840, "statutory": 7223, "#health": 8471, "spores": 10303, "feeder": 27753, "Haifa": 30819, "Hariri": 25823, "persuading": 19688, "tactic": 20440, "adoptive": 14850, "Porte": 2403, "patience": 11197, "assassinated": 18520, "thinned": 2607, "politician": 12481, "Mahady": 14451, "child’s": 7926, "tombs": 30748, "insurers": 23782, "Bray": 31592, "Eleanor": 4211, "intend": 2370, "Hawker": 21275, "Maitra": 19509, "KNOWS": 29773, "associations": 1451, "component": 11625, "sensitivity": 2619, "steps": 7577, "575,000": 15679, "touched": 8435, "Prices": 15668, "scatter": 8134, "Alzheimer": 9518, "handiwork": 9593, "Jenna": 5174, "DENISE": 8262, "mandated": 24687, "rebelling": 3543, "remote": 2592, "employers": 5269, "ration": 19537, "415.782.7822": 23322, "darker": 8736, "roughness": 2642, "aquatic": 4492, "helps": 6377, "Haven": 19861, "expropriation": 892, "originate": 10736, "Pop": 12524, "deer": 10155, "wiki": 10750, "spying": 19745, "Beardies": 26374, "distortion": 15586, "ranking": 12306, "agreed": 2534, "suspense": 6295, "row": 9308, "misery": 25717, "Oz": 27667, "Fitzsimons": 31487, "Goodbye": 8596, "freaky": 20173, "dependance": 13569, "Anne": 13648, "becuse": 27964, "exemplified": 2995, "introduction": 5629, "Tarsia": 25504, "scaring": 23243, "Presto": 22869, "They": 1456, "Moment": 16068, "pursed": 31890, "taxpayers'": 19121, "Soviets": 24822, "dialect": 3386, "racket": 32848, "Bending": 24101, "610": 25349, "rides": 6067, "Criminal": 25997, "Phyllis": 23526, "dissertation": 3361, "bow": 9080, "1576": 25499, "workers": 1301, "fumes": 27301, "Author": 25489, "amused": 19284, "forida": 26269, "block": 12013, "unsightly": 32715, "Fran": 23750, "panels": 26831, "Urban": 16046, "Stir": 17870, "Efrem": 20880, "fresco": 27108, "flooding": 8152, "simultaneously": 1544, "metallic": 10044, "reaffirms": 7431, "Current": 21021, "songwriter": 13343, "early": 1105, "begun": 9345, "Frontier": 17113, "Amin": 12165, "golfers": 28316, "santorum": 10479, "veto": 12371, "transmitted": 15018, "Partially": 23044, "warlord": 19707, "towing": 28822, "french": 28555, "bacteriologist": 20740, "Craig": 11739, "dodgy": 32170, "BEEN": 27478, "austere": 18118, "hullo": 11703, "Galway": 32827, "chamber": 10173, "Medicine": 20728, "Thur.": 22182, "Belgians": 13107, "paralyzed": 18239, "shaped": 3601, "Evangelicals": 26107, "aftershocks": 26960, "disagreed": 30013, "confidence-building": 31353, "misrepresentations": 14162, "ubiquitousness": 8206, "reasons": 1093, "USA": 5613, "aspen": 25055, "leaned": 8548, "IQA": 18337, "URSULA": 22844, "Modell's": 29431, "declining": 7920, "invaded": 20071, "extravagant": 32808, "repetitive": 13571, "Skittled": 18415, "Bruna": 1508, "Feel": 18320, "Waitangi": 12670, "Thanx": 21277, "extractive": 835, "St.": 3206, "shoer": 6410, "Tradename": 23064, "micron": 11336, "pamphlet": 6530, "rust": 16399, "hernia": 24080, "inventory": 8086, "Record": 26091, "tested": 2369, "ventures": 5315, "compound": 3238, "drooped": 32028, "UNLESS": 12318, "reiterate": 22699, "budgie": 26279, "races": 6192, "09/11/99": 23248, "worship's": 25525, "olympus": 26209, "GREEN": 28575, "mosquito": 28039, "bacon": 32236, "God": 5136, "regain": 24362, "friends": 3919, "Mango": 8283, "www.standfor.co.nz": 12660, "washed": 597, "calm": 9405, "defectors": 12307, "Evaluations": 22842, "11/7/08": 28055, "unacceptable": 14240, "energy": 2087, "Osage": 17504, "Bruyne's": 13115, "Polk's": 20235, "viewpoints": 1273, "550": 23871, "expose": 18019, "Conservatives": 31340, "raw": 16925, "Reception": 21785, ".........": 19475, "receiver": 26727, "sewage": 28858, "archosaur": 2764, "Shrugging": 30581, "thaks": 28359, "responsive": 14385, "covering": 1075, "1981": 3479, "enemy": 3953, "objectively": 15145, "favoring": 10441, "WAITRESS": 29678, "circumcision": 30523, "latter": 4138, "serivce": 29577, "Saturdays": 16103, "92842": 24952, "gross": 6830, "cross-clause": 1156, "2:30": 12523, "throat": 6549, "Theoretical": 699, "magistrate": 31754, "Elimination": 18665, "GREEK": 11922, "surveyed": 26019, "expeditions": 4370, "pregnant": 16148, "dont": 20230, "ld2d-#69377-1.XLS": 22436, "valiant": 18580, "scaling": 2807, ":(": 26252, "www.norcalfightingalliance.com": 28547, "few": 283, "UTC": 29009, "harbour": 16304, "Philip": 20916, "Branom": 21144, "neighbourhood": 18570, "widen": 7985, "tragic": 24725, "supervisory": 31367, "convenient": 16551, "Saddamites": 18602, "group's": 19997, "Technologically": 8253, "ingredients": 10515, "Sitara": 21401, "borenste@haas.berkeley.edu": 22455, "Oracle": 24198, "Girls": 5703, "Bruha": 24308, "epic": 16093, "calmest": 16180, "chipped": 6864, "distract": 8799, "Azov": 4389, "interaction": 190, "2100": 2064, "Spacecraft": 11312, "aisle": 14159, "bait": 15787, "foundations": 16021, "Indoor": 26803, "landmines": 26010, "epidemic": 8489, "pool": 16848, "inferiority": 25665, "Wood": 22853, "PPI": 20906, "immutability": 30972, "Chris.Germany@enron.com": 21532, "Atheists": 13251, "obeyed": 31246, "industrialist": 4524, "Suella": 13017, "regard": 1989, "ed": 19145, "acne": 9587, "Croucher": 13503, "briskly": 30325, "Japan's": 4612, "bought": 6111, "non-approved": 22503, "c": 18109, "36.2": 5259, "Bridgeline": 23094, "LISTEN": 29952, "showered": 30240, "ChangeCoordSys": 2305, "reader": 1170, "Bergère": 5421, "PERSON": 29667, "insistent": 32868, "device": 2333, "130": 11689, "1.2": 15270, "Anthropology": 14830, "lemony": 17712, "horn": 27060, "Bladder": 27065, "civilization": 13849, "Lovely": 16246, "baggy": 17681, "knee": 2752, "Koolhaas": 4554, "demonstrated": 2594, "ROWS": 30051, "self-contained": 30260, "Rest": 18729, "1655": 4317, "accents": 27662, "Educational": 10840, "Email": 18126, "hunt": 20794, "She’d": 8579, "Friedman": 7849, "859-7187": 22014, "21st": 7815, "camping": 17151, "Sharayu": 28308, "rate": 6031, "Institutional": 697, "generation's": 20081, "meditate": 6527, "ordering": 15880, "Founded": 17032, "attended": 3402, "Distant": 942, "plaintiffs": 7535, "shoot": 12625, "Component": 30077, "issued": 1289, "Gringotts": 32295, "\"": 1108, "compassion": 28063, "ur": 26211, "Absolute": 28549, "Pixar": 13593, "pub": 20164, "rescheduled": 21007, "onerous": 10979, "smail": 24326, "16.2": 26980, "Iguaçu": 26997, "about": 80, "transit": 11629, "Rude": 6748, "abandonment": 8755, "Mandil": 24586, "hung": 9091, "gauzy": 30923, "objects": 1543, "Obama’s": 10438, "migrants": 12161, "past": 498, "measly": 11774, "dangerous": 7708, "parish": 4297, "acquired": 5027, "bankruptcy": 23635, "Ajay": 27401, "stock": 18379, "inviting": 14478, "inner": 18012, "vingt": 4061, "Ebola": 13838, "Unique": 16311, "lodging": 17141, "Taiwanese": 18832, "Seaboard": 25536, "flea": 29335, "Fresh": 17703, "barking": 32639, "incompetent": 20149, "exchanged": 3586, "Luther": 6519, "California's": 22470, "AMERICANS": 15305, "attitudes": 8494, "Graduate": 22666, "vanilla": 17851, "McNamara": 26947, "messy": 21975, "Caracas": 19374, "Undeterred": 32545, "contest": 3165, "esp.": 29196, "1,000": 7887, "Work": 7903, "PS3": 26778, "505-625-8031": 23584, "u": 3323, "13.9": 21340, "envied": 32519, "diversity": 360, "locomotory": 2733, "Hunters": 30954, "Ca-": 7149, "Dando": 31742, "co": 20198, "gant": 28000, "wonderfully": 20960, "mouthed": 9804, "MKM's": 22773, "ones": 6417, "devout": 20380, "unde$tood": 26753, "nonessential": 20910, "pigeons": 32880, "boosted": 24572, "fakes": 17400, "trainer": 27387, "engineering": 3611, "grudge": 3177, "ensures": 16870, "01/19/01": 21187, "Tana.Jones@en": 22019, "copyright": 7467, "expects": 12921, "rs": 27398, "chock": 16405, "devour": 7986, "consulted": 23714, "Episcopalian": 16542, "Friedkin": 5356, "beak": 17789, "http://www.adorama.com/BLCBS.html": 26538, "Cinematic": 3005, "verge": 5975, "Go": 7855, "BPA": 12472, "Winking": 14818, "Ercot": 22849, "IM": 7791, "rental": 11621, "Halliburton": 24376, "notions": 733, "incubating": 27860, "Panera": 29440, "GOT": 11939, "unfold": 7287, "listen": 9290, "restaurants": 16512, "Description": 21659, "holdings": 23301, "admiration": 9831, "mugs": 31764, "technology": 2321, "Spread": 18138, "Especially": 7761, "Aberdeen": 4446, "kept": 7617, "impose": 17599, "Ōtsugomori": 4731, "assigned": 18275, "Kathryn": 13297, "Hoot's": 22075, "Construction": 3748, "colonials": 3544, "alphabet": 31950, "guilds": 24254, "salmon-pink": 32114, "kiosks": 32883, "purchase": 11649, "showing": 6408, "Airbnb’s": 15115, "366": 5013, "envelopes": 8600, "maddening": 32396, "reasoned": 3084, "belong": 4730, "Slower": 9981, "citation": 5095, "Poor": 6947, "evade": 18318, "ancestral": 5438, "counted": 10291, "Frequent": 27063, "ELectronics": 24177, "colder": 15907, "Hafs": 18619, "crazier": 27806, "nose": 6835, "Innovation": 13970, "VICTOR": 11847, "envision": 22881, "gained": 10549, "gates": 27120, "destiny": 5938, "http://www.bullatomsci.org/issues/1993/s93/s93Marples.html": 18701, "predestination": 6606, "fishes": 27919, "stall": 6781, "Saints": 19987, "immigeration": 27074, "--------------------------------------------------": 26927, "establishing": 3738, "indicated": 2031, "scoff": 25826, "jerks": 29086, "player": 1603, "skilled": 13147, "Cayman": 27494, "gimmicky": 29646, "Baron": 288, "drinkers": 32668, "permits": 1055, "Objectives": 14989, "899-4310": 22012, "Ursula": 22831, "broadcasts": 12870, "rum": 6496, "hysterical": 20396, "firmament": 32411, "acclaimed": 4164, "overall": 1568, "Resort": 17130, "Moxon": 12314, "EI.London": 22204, "Aner": 11246, "comfortable": 12050, "principal": 4282, "FABULOUS": 28797, "c-": 6167, "browse": 14863, "Beliefs": 15181, "fluid": 3117, "Ālī": 16826, "abusing": 19270, "2:00": 22343, "slots": 26382, "JOB": 28070, "Zhou": 3483, "Godiva": 10524, "built-in": 30094, "grieving": 30790, "4_28_00.doc": 23819, "boulevards": 16741, "underlying": 3124, "menaces": 27535, "blog": 7703, "gangly": 28035, "electrolyte": 27615, "FUTURE": 1938, "Nick": 7172, "I'ile": 16631, "boundary": 7626, "hazardous": 18048, "Advice": 26500, "M.D.": 19091, "botany": 3199, "security": 7205, "450": 17269, "five": 1646, "2015": 2426, "hoists": 18814, "Off": 9795, "conceptualizing": 6588, "Herzegovina": 16478, "high-speed": 31401, "stamps": 24920, "Journey": 16098, "*****": 24980, "Between": 1150, "dominos": 29937, "conform": 15076, "speculation": 3888, "emits": 2191, "suggestion": 7648, "reflection": 2289, "Likewise": 17123, "origins": 3565, "Village": 6154, "Abuse": 19441, "Chestney": 29719, "student's": 1560, "sundaes": 11479, "she's": 6655, "yawning": 31876, "bony": 9145, "Methodist": 23624, "Kumon": 28508, "desired": 17277, "this's": 22329, "breathe": 6261, "dunno": 29642, "Prominent": 19830, "Levine": 23875, "enables": 14542, "Terrorists": 19875, "Navarro’s": 1069, "Resume": 22904, "ebbed": 9443, "humans": 14601, "appreciation": 131, "Brazillian": 12584, "Grazie": 16123, "noctivagant": 32378, "Eastern": 4881, "Baltimore": 14148, "Of": 789, "WASHINGTON": 18821, "enacted": 24474, "commercial": 1334, "jury's": 19926, "Enoch": 15179, "St": 4438, "liquefied": 25839, "bisected": 32871, "Fontainbleu": 22192, "trademarks": 22495, "680": 25992, "hon": 6485, "doorway": 32158, "explore": 180, "commence": 22655, "gimp": 26617, "owners": 10476, "monday": 27086, "Aren't": 20412, "semantic": 1899, "intelligibility": 5671, "11831": 23176, "necessity": 2082, "submitted": 4011, "whoooooo": 26300, "Incredibly": 28121, "Requiring": 11664, "mirth": 25234, "al.": 253, "Ruse": 15148, "stayed": 3902, "COMp": 24151, "alterations": 25144, "machine-like": 30279, "Month": 5457, "equity": 20969, "refrigerators": 17149, "rigid": 12628, "drowning": 17984, "dark": 5058, "Mechanism": 23299, "Components": 30068, "97th": 30363, "Schwartzenburg@ENRON_DEVELOPMENT": 21727, "intrigued": 13345, "friends’": 9560, "Ethiopia": 15519, "eneedle": 26363, "Expect": 18224, "Atithi": 27422, "Grit": 15217, "conceding": 7640, "beatingsup": 31780, "Rgds": 22995, "flop": 13686, "thematic": 3712, "processed": 15023, "irish": 26308, "proto-language": 18127, "R.": 3789, "trove": 17421, "tome": 10981, "seals": 25177, "v-": 6634, "Islands": 16252, "WALKER": 24348, "Paje": 991, "remembers": 19821, "speeds": 11397, "west": 7384, "Thrace": 5121, "miserable": 19520, "mesh": 18395, "non-profit": 10778, "eavesdrop": 17593, "CDs": 11027, "consisted": 1643, "expresses": 11056, "Barbuda": 16474, "circled": 6983, "tyranny": 30704, "Maybe": 2824, "inequality": 466, "families": 5000, "shorthand": 30132, "Vomiting": 27070, "Victim": 28366, "tragedies": 11290, "bin": 6942, "infrastructure": 2423, "missed": 13070, "décor": 28147, "pp": 24319, "nautical": 30899, "mount": 26720, "Percy": 32181, "Atef": 20659, "shouldn’t": 7743, "buttressed": 30667, "contained": 5648, "Grether": 22444, "nests": 10216, "snored": 31802, "concentrate": 26199, "Republics": 11597, "skylight": 28500, "ROMANCE": 10089, "Grangers": 32330, "companies’": 1333, "query": 18831, "Stand": 17931, "Polaroid": 13317, "greater": 367, "tee": 27187, "welcomed": 5946, "Emperor": 4457, "Fame": 5730, "options": 8213, "MWh": 22688, "progression": 14520, "03:15": 23329, "Whole": 29202, "lolling": 32733, "sticking": 3300, "RADISON": 29948, "revocation": 22633, "fled": 14231, "1758": 3533, "Beto": 5860, "Spanish": 4, "Donaldson": 26036, "Wii": 26783, "Cornelissen's": 31406, "viewers": 2951, "emeritus": 10371, "unheeded": 9679, "appellation": 20180, "you’ve": 7755, "teaching": 3412, "Nimr": 19329, "apothecary's": 32299, "S&M": 10693, "genuinely": 13653, "sizing": 18722, "declared": 3834, "stilted": 21982, "intervening": 7336, "Singer": 24875, "antiquated": 12762, "Ipanema": 28644, "besides": 1196, "Solidarity": 24306, "Mayur": 25324, "volunteers": 10770, "employment": 554, "unpalatable": 15166, "phylogenetic": 2888, "Muni": 18998, "Populaire": 5463, "centuries": 1023, "SHU": 28436, "difference": 1683, "spinal": 18240, "What": 888, "lipstick": 16000, "poop": 27451, "hauled": 9094, "crustaceans": 25168, "1894": 4714, "SHOCKED": 29573, "era": 928, "Jiangsu": 3342, "Clara": 958, "Congressmen": 11546, "realize": 1707, "Comb": 27151, "cartoons": 27912, "childrens": 28413, "starched": 32651, "Edgewater": 16524, "Chiefs": 21554, "USB": 26312, "lungs": 8858, "chrisssake": 29116, "altar": 5555, "libido": 14954, "Yucatan": 17008, "fierce": 31094, "surplus": 22768, "elk": 25053, "Prepare": 17724, "'02": 23646, "Texan": 25673, "backpedalling": 21361, "Waterfalls": 27002, "Howard": 29462, "----------------------------------------------------------------": 25419, "formed": 5885, "888-422-7132": 21387, "Quimba": 29546, "tombed": 30644, "uncle": 3926, "imperfections": 17621, "evaluated": 316, "personable": 29585, "liability": 23429, "yellow-pale-yellow-yellow": 32683, "Nigeria": 14490, "Hagghier": 17178, "bees'": 28512, "prevenient": 6584, "belittle": 21330, "edible": 28874, "broke": 4373, "Giovannini": 23452, "businesslike": 11153, "Balochistan": 19645, "abnormal": 27596, "counter-terrorism": 14271, "small": 838, "fair": 7421, "Paragraph": 21621, "Broken": 17463, "strainer": 18369, "Directions": 26910, "DIRECTIONS": 1939, "th-": 6177, "loop": 15968, "Chatham": 16251, "scrap": 12973, "718-780-0046": 21491, "Locust": 29957, "grin": 31207, "Gala": 31586, "Simmer": 18380, "Locked": 32146, "Lieutenant": 19835, "seemed": 3846, "greatest": 4392, "01:04": 21338, "Tijuana": 23076, "jeff": 19973, "Klain": 13836, "annoyed": 15484, "Frontpage": 3129, "COwpland": 24157, "control": 1661, "Passive": 2652, "brilliantly": 9974, "EPM": 27993, "classics": 5138, "Murray": 5780, "thresholds": 22209, "Hubbard": 12300, "twisting": 32293, "solidarity": 18594, "Inspector": 4216, "skeptical": 5100, "disguise": 25694, "sunset": 17099, "lording": 30312, "Brieber": 249, "contribution": 2704, "market": 7989, "plaza": 16964, "HEATING": 28463, "reluctantly": 19050, "influence": 1533, "contacts": 19412, "Asking": 17970, "comfyy": 26794, "Arizona": 5612, "cites": 7432, "Luo": 3427, "horse": 6191, "nibble": 8967, "self-pity": 30479, "remaining": 9289, "neurological": 28002, "operandi": 8312, "nine": 4682, "Actually": 6694, "YEAR": 11897, "Site": 16781, "Lucky": 29238, "toward": 432, "priory": 31574, "itchy": 26504, "forgiveness": 11576, "RNR": 23737, "Professor": 3463, "3.30": 23128, "Valentines": 29502, "demise": 18246, "recieved": 24502, "unwatched": 32515, "basic": 1535, "léxico": 1135, "excel": 22653, "teh": 22719, "Adriana": 25399, "stylist": 29287, "Luckily": 29725, "coals": 6398, "Developer": 22333, "NMANNE@SusmanGodfrey.com": 23732, "Check": 24242, "Cimarron": 17446, "algae": 26716, "Correspondence": 5654, "maturity": 8717, "Late": 3475, "roundtable": 24805, "biased": 20968, "recruitment": 594, "Behari": 19147, "KONG": 11805, "elephant": 17197, "Committees": 11585, "termination": 22173, "skulking": 31000, "wrapping": 2318, "refused": 3185, "darkling": 9960, "Blumenfeld": 22395, "borrowings": 2032, "urination": 27064, "Race": 17551, "loom": 25836, "acrylic": 16002, "conditons": 27044, "veiled": 30974, "betta": 26706, "ruthless": 20543, "tea": 6702, "golden": 9562, "upwards": 3337, "bounces": 26799, "stabros": 10083, "POS": 29305, "snowstorm": 25136, "dedicated": 3451, "distain": 28639, "Wednesday": 5230, "clang": 9707, "Bruce": 12563, "whoo-hoo": 15981, "wine": 9191, "RAW": 19646, "Exocet": 25801, "Eulogic": 28581, "Smyth": 8595, "instructing": 31775, "Tsarevna": 4378, "pabloruizfabo@gmail.com": 953, "Festus's": 31801, "locust": 29956, "Cottage": 5814, "Raina's": 28506, "bad": 1386, "flatbread": 9184, "8000": 12187, "alt.consumers": 25724, "attracts": 28958, "Next": 675, "dope": 20094, "marketplace": 16890, "MAILING": 24934, "Burma": 31532, "THIS": 11838, "Senator": 10487, "revelations": 8749, "Guests": 16318, "40": 1665, "biases": 2711, "Evelyn": 4120, "Mohieddin": 30681, "emigration": 16935, "evaluate": 24711, "knees": 6862, "Anatole": 5423, "weirdness": 20296, "Nasser": 30660, "Exactly": 31755, "Kraków": 16933, "red-headed": 32217, ",,": 27364, "telescope": 14610, "abdomen": 4022, "½": 3321, "LEARNING": 15067, "Desiring": 32667, "detained": 20764, "inserted": 22227, "scowl": 9322, "worsening": 24398, "francisco.pinto.leite@enron.com": 22298, "relevance": 82, "Needs": 21854, "shine": 14622, "comply": 7411, "wedged": 31697, "roaming": 25042, "Roland": 31910, "pricey": 27546, "concepts": 734, "Allawi's": 19257, "aren't": 10332, "hh": 26977, "intersect": 17484, "dig": 17744, "visual": 158, "oracional": 1157, "unwieldy": 13042, "glimpse": 13380, "1662": 16817, "luna": 29710, "declivity": 31163, "spacetime": 15540, "left-over": 31771, "VERIFIES": 24975, "Incorporated": 23050, "I’ve": 7720, "understandably": 23058, "Walked": 5377, "nerve": 20850, "Lavorato": 21014, "flowing": 21425, "vile": 9486, "comet": 9958, "Fyi": 22482, "Bonde": 11686, "Starbucks": 13597, "Nesbitt": 21567, "Hizbullah": 18892, "panting": 30826, "comics": 12532, "wise": 10321, "Woodinville": 29134, "goofy": 20822, "pyramids": 15324, "bearers": 30956, "Conseguences": 18666, "boundless": 32800, "Slope": 7880, "enterprises": 11604, "Puerto": 16635, "scholarly": 433, "cafe": 10992, "Paulo": 23196, "skyrocketing": 23712, "slowing": 9977, "Sounds": 21742, "Fayetteville": 13378, "framed": 3090, "Joachim": 27116, "allowed": 2848, "governing": 5691, "rocks": 8998, "Samoa": 26014, "spikes": 23337, "Drama": 4188, "barrister": 13030, "Visitors": 16424, "tour": 2964, "uncompleted": 18084, "SERIOUSLY": 27358, "1:1:19": 1816, "Appeal": 18211, "mah": 9134, "conceivable": 26802, "guitars": 32417, "UK's": 4475, "Birdie": 11097, "03:31": 22819, "files": 15024, "Daimler": 23847, "ruinin'": 32300, "Vij": 19075, "ENRONR~1.DOC": 23441, "wooden": 8957, "apology": 30354, "Project": 12646, "Gérald": 13015, "Conf": 22973, "competed": 8417, "conquering": 9463, "concerns": 2450, "Sanzio": 25338, "landmine": 8647, "!!!!!!": 24991, "dialects": 1786, "piece": 4001, "taxi-driver": 32635, "Trump's": 12071, "augmentations": 8389, "dialog": 30194, "Acquired": 14827, "suit": 12568, "sedentary": 30970, "$2,000": 11569, "castling": 25480, "UCSB": 7142, "overarching": 15325, "perspectives": 387, "Cheap": 16717, "Yassin": 18929, "Lorenzo": 27110, "workspace": 30084, "negligence": 7412, "cross-border": 31471, "Fridays": 20070, "sponge-bag": 31693, "elses": 21974, "embedding": 3696, "actresses": 5386, "http://www.ontario.ca/en/information_bundle/birthcertificates/119274.html": 27473, "keenly": 19048, "Haddo": 4277, "seller": 3723, "Rochester": 5200, "tugging": 8840, "Settlers": 14686, "tied": 8981, "fodder": 8207, "Handwritten": 20623, "cyanide": 20849, "advantage": 1259, "tiring": 15874, "stash": 18176, "Beirut": 4550, "filipinos": 26140, "Blvd.": 23888, "Willis": 29846, "unconsumables": 25178, "substrate": 26885, "enchanting": 14916, "Evil-looking": 32243, "06:15": 22157, "website’s": 12733, "barges": 17252, "Prejudice": 10931, "1380": 17306, "airline": 16456, "terrent": 5081, "Tikrit": 18523, "Maati": 20775, "wants": 8801, "billiards": 25509, "searched": 30510, "Does": 6794, "Coil's": 20224, "anti-democratic": 20498, "signifies": 16145, "jungle": 12000, "baleful": 9388, "autograph": 11026, "AWOL": 19226, "taxed": 25750, "Sabine": 14721, "raced": 31820, "charges": 3982, "correspondences": 5684, "officers": 3600, "bendings": 9417, "stimulating": 758, "adhering": 22109, "55": 17206, "Fountain": 17053, "Assassinate": 18745, "brothers": 3153, "already": 2301, "joined": 3815, "mares": 27978, "Producer": 20926, "protective": 17639, "torturing": 24271, "comparisons": 10628, "lacerating": 30478, "til": 11069, "Announce": 17934, "hamper": 2645, "evolves": 20095, "conflagration": 23971, "rectangle": 9849, "Congratulations": 17959, "neighborhood": 4687, "SUITABLE": 11930, "Nhut": 19195, "generic": 2367, "VOF": 21139, "PROCESS": 28188, "identifies": 1036, "helicopters": 11205, "Process": 23113, "wet": 6248, "Bourret": 24954, "vol.": 14908, "SCLED": 2107, "XIII": 21944, "proof": 2282, "clicked": 22551, "Chevy": 6933, "stuff": 6084, "overrides": 31335, "darkened": 24881, "ghetto": 30797, "Beginner": 8330, "reused": 16972, "Unit": 23025, "corrugated": 10046, "EVERYBODY": 11908, "Hizb": 19679, "polka": 32553, "apparently": 5979, "catering": 27328, "democrat": 12432, "peers": 392, "skull": 27355, "SiriusXM": 5326, "1896": 3305, "rubber": 7338, "whale’s": 9086, "jihadis": 19110, "thinks": 8170, "cufflinks": 31900, "torsional": 2817, "47": 22767, "Moses": 30537, "pains": 14025, "3s": 18743, "compete": 8404, "stairs": 8953, "guerilla": 24314, "passed": 9083, "matters": 8352, "DAD": 21531, "reputations": 1492, "caustic": 17999, "Numero": 24771, "jar": 27873, "Own": 27962, "51": 17462, "request": 3603, "Marine": 10439, "wiser": 25310, "psychedelic": 6839, "expertise": 1224, "ministries": 13930, "Approvals": 22036, "Kori": 22098, "Khan@TRANSREDES": 22910, "ruin": 26815, "chrome": 26953, "Feeling": 32283, "1575": 25495, "Eventually": 4649, "magistrates": 31758, "mound": 32015, "skinny": 32054, "Homer": 1101, "tricks": 10318, "hulk": 31940, "revise": 22286, "ya": 11705, "punished": 32913, "Claimed": 28562, "icicles": 32522, "Entrance": 16701, "sacred": 14322, "absorbing": 24628, "Edgar": 18479, "quad": 27567, "Anyway": 9906, "revealing": 15197, "Edison": 15251, "Sufaat's": 20719, "Law": 7275, "summary": 567, "WARNOCK": 14353, "monarchies": 24369, "wai'd": 17345, "misc.consumers.frugal-living": 25726, "smiled": 9787, "Liberty": 4093, "interfering": 11618, "DAUGHTERS": 29685, "realer": 15735, "sociologist": 15450, "jazz": 17932, "manipulated": 1474, "purportedly": 20247, "appreciative": 32706, "sunshield": 14618, "Paniotis's": 32885, "warm": 6477, "Burckhardt": 27099, "Biewener's": 2771, "Marvel": 3004, "Audit": 21945, "friend's": 9612, "resignation": 5592, "Alabama": 15041, "lust": 9832, "Others": 20635, "grab": 8839, "exper-": 6907, "Beth": 6708, "hole": 6331, "dearly": 32094, "exclamation": 14834, "Hamburger": 6953, "pleadings": 23825, "owner's": 16904, "complete": 522, "woodland": 15289, "Equilon's": 23408, "Password": 22982, "Bridge's": 16503, "Carribbean": 26579, "Curious": 30539, "Someone": 12727, "monastic": 5916, "showgirl": 5398, "stonework": 16971, "harmful": 2097, "of": 17, "desire": 5151, "Snyder": 22308, "Merry": 8690, "impotent": 31144, "vaunted": 25815, "survived": 9119, "checkerspot": 25130, "vertically": 2621, "equivalence": 5552, "waiver": 20806, "serpent": 15355, "angry": 8960, "inverted": 19938, "stealing": 15164, "misstated": 22597, "handfuls": 32326, "75th": 15637, "rejoice": 14052, "somberness": 31113, "Wedding": 2920, "Nobody": 19658, "functionalism": 14928, "subtlety": 14887, "ocean": 2556, "1925": 3411, "Lou": 22761, "mid-ocean": 30783, "translucent": 9737, "thought": 2495, "Knights": 20812, "Aberdeenshire": 4263, "rigger": 18230, "quidditch": 18333, "adaptations": 10206, "22:30": 12520, "conditionting": 17147, "ballot": 12522, "Hamilton": 3627, "not": 232, "da": 2241, "asexually": 10671, "Adnan": 20773, "Molten": 27297, "EAT": 28798, "brides": 30007, "eccentricity": 32749, "single": 474, "Roberts": 7128, "bird": 2757, "TOWNIES": 11855, "rebel": 19023, "modified": 11395, "prostitute": 24297, "reptile": 26884, "Increasingly": 24584, "onboard": 11374, "lapping": 8955, "Quinoa": 18351, "willows": 25070, "wand": 16092, "reportedly": 12144, "Sinners": 5395, "Muslims": 12072, "Merlot": 16240, "gardening": 22641, "Gosier": 16660, "hackles": 20315, "changes": 646, "501st": 12591, "visitors": 10763, "Alternatively": 17569, "Werner": 5513, "ago": 6045, "industry’s": 15103, "mold": 17757, "painting": 4591, "crystallizes": 21762, "sums": 25847, "disembarking": 31718, "gened": 32611, "tamed": 27783, "ebay": 26875, "producer": 5328, "graves": 4075, "Agel": 23982, "Baghdad": 4516, "distributing": 7906, "contain": 2096, "2.11": 15658, "combining": 13335, "analyzed": 737, "Med": 16672, "bureaucratically": 20606, "Isn’t": 11212, "35,000": 20733, "burning": 7358, "getting": 4923, "tasked": 12820, "vested": 12832, "Trading": 21574, "expect": 1427, "deterrent": 10433, "80s": 5415, "COS": 23311, "notification": 23594, "unstained": 30922, "irrelevant": 7428, "Somalia": 18638, "punches": 24141, "pleasantly": 28635, "smelling": 15830, "Hamburg": 4319, "Spang’s": 1197, "Katherine": 5416, "wouldn’t": 7688, "NEEDED": 24342, "Benzie": 8237, "Dems’": 19210, "Spirit": 17111, "launchers": 19598, "underestimate": 20632, "Pigeons": 32939, "prosthetic": 8406, "Ombre": 5528, "2017": 688, "counter-conference": 10393, "situated": 14849, "penn": 18099, "solemnly": 32488, "delegate": 24804, "there’s": 7740, "Errol's": 32180, "pudding": 31773, "Customers": 15117, "sirloin": 29395, "quaffle": 18293, "astronomer": 32568, "70": 11678, "dislocate": 18198, "fizzle": 10471, "wisdom": 7237, "Alexander": 3626, "Everyone": 8770, "forbidding": 20557, "submerged": 24419, "sheet": 15600, "95": 12975, "confirmation": 23052, "387,000": 15676, "likley": 23907, "civilizations": 15267, "Sun.": 22188, "judgment": 6600, "Scotland": 4264, "anasthesia": 7063, "Court": 7413, "Choose": 17706, "winging": 32901, "sublime": 14892, "Fabio": 20160, "CE": 15367, "inclusive": 780, "replication": 2380, "drawn": 2339, "lap": 18085, "sleeves": 17360, "crippled": 25671, "Carytown": 29446, "Republicans": 14435, "caves": 10004, "Anderson": 12636, "Servings": 17838, "mink": 32421, "11:57": 23431, "Keepers": 18304, "Paraíso": 1005, "sneaks": 27283, "cancel": 21193, "1940": 3442, "African": 8399, "personalized": 28163, "unconstrained": 32737, "nudes": 26547, "derivatives": 22510, "Using": 2172, "http://www.disinfo.com/archive/pages/dossier/id334/pg1/": 19424, "claque": 32696, "SoCal's": 23657, "sneeze": 9862, "spaghetti": 17364, "11:08": 21360, "‘cuz": 11694, "icon": 20444, "downtrodden": 24269, "Theodorus’": 5931, "Comfort": 28165, "lock": 7390, "bone": 2798, "laid": 6517, "Dumbledore": 32247, "Made": 6859, "Airways": 17117, "Brighton": 5201, "What's": 6665, "Maharishi": 24184, "aspire": 27845, "scholars": 1064, "blinks": 14804, "prizes": 24548, "confusing": 22201, "Abdel": 20621, "verdict": 12675, "featured": 5244, "Morocco": 12132, "SoCal": 23613, "activity": 832, "Dobby": 32126, "dept": 23169, "disarm": 19043, "generalizability": 516, "living": 3509, "Sapulpa": 17494, "bake": 6457, "pry": 17974, "braver": 9662, "Forensic": 5718, "jail": 20841, "3.75": 29593, "Kazimir": 4595, "Khinssa": 18088, "derailing": 18886, "fence": 29962, "complication": 18075, "newborn": 26320, "mustache": 6173, "longitudinal": 8498, "cool": 8822, "GUARDS": 11850, "Debbie's": 7344, "graduating": 5564, "Roomers": 11782, "16/10/2004": 19756, "Sandalwood": 21843, "Sympathy": 25620, "included": 1947, "vs.": 5277, "dubbed": 12701, "Tiberias": 11250, "Ordinarily": 19847, "211": 17530, "summarised": 22650, "exercising": 2844, "hm": 7090, "elapsed": 15607, "smuggle": 19387, "re-record": 10954, "knacks": 8065, "Ramtanu": 19508, "supplied": 24368, "diner": 29770, "injection": 9540, "captions": 30086, "missing": 5825, "Oh-ho": 6928, "17H": 21123, "Bro": 21883, "lasting": 7938, "info.": 22720, "cylinders": 27312, "Brandee": 23109, "predominated": 32860, "ecological": 16998, "daring": 8918, "Amanda": 14308, "lots": 6160, "recalled": 4574, "Drinks": 16702, "caloy": 26137, "affronted": 30566, "ignorant": 14700, "Tommy": 16355, "potato": 28875, "LED": 2051, "tongue": 18105, "BTW": 27583, "appointed": 4350, "ever": 4564, "Balochi": 19644, "defanged": 18782, "HIV": 1399, "tailor": 18322, "HollyŁódź": 16946, "regards": 14941, "doorstep": 15962, "Florence": 17482, "Fighting": 5866, "4193": 22246, "02/27/2001": 21617, "ground": 2183, "disjoint": 489, "06:07": 21657, "27.doc": 23310, "Mini": 29729, "roomful": 29932, "Fifth": 7360, "Haishen": 24790, "unhealthy": 27225, "1976": 3720, "arm": 7100, "Beach": 17226, "hotpot": 29115, "casing": 20600, "touted": 8126, "leaflets": 20168, "slobber": 6828, "Brian": 12961, "reacted": 3868, "functionality": 22635, "galleries": 6164, "is": 55, "drop-down": 30150, "whoever": 11214, "honking": 30824, "CVTS": 29915, "ld2d-#69381-1.DOC": 22437, "Mob": 32461, "Nazi": 16915, "Funen": 17202, "mausoleum": 9105, "pcs": 28072, "beared": 23683, "Inn": 23369, "school": 1558, "meters": 15594, "arbitrators": 23739, "regularity": 21332, "antiseptic": 9533, "Daly": 10588, "whitened": 31843, "afterward": 17816, "Lawyers": 24264, "twigs": 30360, "rehabilitate": 25033, "giraffes": 26261, "giggled": 28719, "dish": 18405, "nourishing": 27865, "wolves": 25021, "drugs": 14651, "whore": 6621, "creation": 779, "mouthpiece": 24565, "booklist": 32347, "Legion": 12592, "porch": 8917, "anywere": 28358, "Forester": 5737, "ex-cons": 24275, "gelatin": 13281, "Hormuz": 25787, "GoogleScholar": 451, "picturesque": 16339, "luminol": 18038, "expected": 1309, "ICU": 21681, "Cohen": 2489, "delights": 7714, "http://www.wikihow.com/wikiHow:Statistics": 10827, "GUYS": 28071, "Waters": 4736, "23rd": 22619, "gambling": 13546, "LibriVox": 10905, "Hacienda": 29166, "deposed": 32677, "Galantino": 13239, "chemist": 5202, "tiles": 9033, "58,825": 12440, "scheduling": 21560, "twenty-five": 30580, "Citation": 10385, "Up": 4710, "Wendy": 23139, "Canever": 29373, "DAYS": 10092, "Korean": 12841, "wreathed": 25560, "graffitied": 32938, "Fantoni": 262, "Military": 3545, "2007": 1549, "rearview": 32930, "wishes": 9913, "abolished": 14758, "skin": 2200, "Bought": 12042, "Crest": 27150, "wikiLove": 10791, "li": 14883, "recessive": 27141, "skittish": 27433, "operators": 2253, "Nullvalues": 30161, "Neo": 12445, "interest": 853, "SUPER": 28744, "universe": 7946, "remains": 412, "assertion": 3966, "Pittsburgh": 4782, "ABB": 21736, "taunts": 9598, "Spaghetti": 28299, "Wilson": 6668, "\"\"": 22053, "1.50": 29975, "Regulatory": 23687, "advertised": 27668, "structurally": 1839, "http://www.mikegigi.com/techspec.htm#SELCTEMP": 27315, "University's": 4495, "crimson": 30839, "Toys": 6966, "provision": 11624, "libertarian": 26069, "Strike": 25810, "repeat": 11232, "bozos": 20174, "suffices": 30978, "bay": 20236, "bicycle": 16579, "some": 544, "isn't": 6404, ".!": 27091, "Colorful": 12922, "crisp": 16143, "land": 2353, "Tots": 28133, "extrudes": 30544, "Wouldn't": 20410, "burrowed": 24301, "Pat": 16005, "editorial": 11110, "spoil": 28414, "enthusiastically": 25257, "streamline": 12974, "Stock": 21851, "husband's": 25653, "No-8": 31540, "least": 1380, "lethargy": 24069, "loudly": 17923, "03/10/2000": 22570, "Trophy": 4854, "empowering": 10794, "107th": 30294, "lasciviousness": 25712, "heartbreaking": 28026, "aggregation": 23295, "Play": 4705, "CNRS": 956, "Jim": 5410, "dedication": 10861, "Beachcrofts": 23787, "Hephaestus": 32412, "operative": 8293, "Ip": 12452, "281-443-3744": 22931, "Spot": 11974, "anatomical": 10665, "increase": 1954, "interpretations": 988, "Contracts": 22518, "Hurricane": 24392, "0000108806": 22921, "attaining": 6586, "outraged": 31193, "1907": 17491, "viscosity": 32870, "Nordstrom": 29150, "physical": 216, "delays": 11422, "Alone": 3766, "enrongss.xls": 21423, "appearance": 2017, "sympathised": 32644, "uncontrolled": 9583, "wedding": 3401, "venality": 4344, "Petroleum": 21790, "sympathetic": 19696, "uncomfortably": 30752, "WITH": 21522, "major": 2147, "Bootham": 17581, "Yellow": 2721, "career": 4515, "CONFIRMIT": 21371, "Within": 1139, "330": 2481, "@POTUS": 12235, "08:00": 17021, "Avenue": 15562, "38": 14888, "Participants": 23276, "‘’": 19649, "pho": 29029, "historicism": 14930, "lung": 25954, "affect": 66, "Bridge": 13158, "accomodating": 28280, "unprofessional": 29085, "slightly": 9511, "blazed": 32104, "access": 638, "questions": 577, "combative": 29069, "statute": 7284, "originated": 926, "finger": 9878, "Chorus": 13767, "subcontinent": 18838, "I/S": 21120, "receptions": 31844, "Figuratively": 20484, "allocate": 21612, "solve": 1890, "Murph": 19804, "teenage": 8741, "dancing": 5223, "wizarding": 18285, "feathering": 17820, "seed": 15920, "Center's": 20013, "1936": 5563, "Lennon": 25596, "savage": 31084, "blade": 11368, "Pandorans": 9300, "trick": 9886, "nauseous": 16174, "Jazz": 29292, "Fully": 14264, "happiest": 11950, "Santa’s": 8565, "validate": 23853, "concentrating": 24603, "couples": 24652, "handy": 21222, "undertake": 25745, "saponins": 18371, "GEM": 28919, "jacks": 26532, "neo-conservatives": 19742, "roam": 16843, "uneven": 28327, "Yvette": 12992, "Clearwater": 12816, "largest": 518, "Orleans": 24394, "Guv": 32369, "Afternoon": 21629, "Dulaymi": 19334, "Evanston": 13327, "sociology": 15478, "responders": 14153, "CAME": 29676, "Champion": 5522, "interspersed": 206, "embers": 31306, "don't": 6056, "COMCAST": 29763, "Geno's": 29961, "Tanganyika": 31855, "extensions": 12982, "hardly": 1431, "improving": 1534, "Lipstick": 16020, "Flakes": 27843, "keys": 6453, "mailto:rosario.gonzales@compaq.com": 22154, "various": 358, "pack": 8230, "Motoko": 8258, "prosperous": 809, "batted": 4789, "Questar's": 23580, "braid": 15940, "Commissioner": 12996, "suggesting": 1765, "missionary's": 31961, "reptiles": 27742, "Catarin": 1507, "Uno": 21970, "outlets": 8072, "IAEA": 18676, "Border": 12956, "Kumaratunga's": 18997, "Aye": 24229, "ruins": 6083, "sake": 8693, "Covid": 13808, "Wakare": 4737, "omnibus": 21651, "Consciousness": 24049, "testified": 13731, "ADDRESS": 29954, "punctual": 28946, "formally": 8318, "presid...@whitehouse.gov": 24390, "outsider": 31597, "drunker": 32458, "exponential": 32775, "Para13": 22313, "Argentina": 924, "pets": 25094, "printed": 4443, "-FINAL.doc": 21503, "fairway": 30965, "streets": 9158, "70's": 27265, "Sasquatch": 25023, "nets": 9441, "choramine": 27869, "poorest": 20420, "reveals": 1698, "harsh": 8245, "graveyard": 9223, "backwards": 9003, "characteristics": 328, "naughty": 8617, "tales": 9924, "hurry": 11408, "ethicities": 27263, "re-purpose": 14546, "seclusion": 27924, "circumscribed": 30329, "buses": 16521, "3,800": 2414, "Cuz": 16029, "monk": 5941, "persuade": 12765, "soy": 17843, "attainment": 15236, "Lawrence": 10915, "residence": 16840, "immortalized": 5293, "Gerald": 5708, "subdomains": 2505, "ate": 8750, "Porch": 21078, "Useful": 26384, "Arthur's": 10949, "speculated": 3967, "Issues": 29403, "Older": 8464, "Hegelian": 14915, "Behavioral": 3656, "prolific": 5414, "fake": 1339, "Egyptian": 20290, "Reviews": 2375, "unenlightened": 32915, "Show": 30030, "processor": 7685, "deck": 8811, "alignment": 14534, "Tools": 30195, "raiser": 24526, "oral": 31407, "insane": 10723, "Islamists": 19296, "collapsible": 30342, "constructivist": 3071, "Emotion": 15020, "translations": 5663, "Albert": 6054, "dislike": 9538, "Knitters": 7763, "mimicked": 10566, "dough": 21903, "unfaithful": 14397, "earth": 5053, "3,000": 7888, "Small": 19979, "consequences": 828, "Deco": 17417, "illwill": 14039, "unexercised": 20993, "populace": 30670, "Paine’s": 7970, "testament": 3991, "BROWNING": 11796, "Odense": 17240, "inquisitive": 19361, "Denton": 23539, "ah": 6309, "4861": 23073, "SMSU": 21743, "Dutchman": 11426, "reapply": 26465, "dare": 10141, "reschedule": 23215, "Cultural": 15423, "IPA": 29348, "1851": 4439, "Aid": 13424, "sheesh": 27769, "D7000": 27163, "opener": 19960, "timeframes": 22229, "Examples": 15597, "Fisher": 14553, "centrally": 27424, "dealship": 28853, "lettuce": 27438, "ominously": 30966, "persistently": 25004, "protect": 795, "milks": 26895, "expertly": 28921, "lamb": 29991, "haven": 8944, "Historic": 16324, "implemented": 815, "Hayek": 7847, "fail": 11266, "grief": 8712, "shredded": 9848, "Flora": 17219, "Charm": 32209, "McCartney": 25644, "wash": 9084, "convulsed": 25707, "ipsa": 5079, "Delightful": 28984, "stirs": 31013, "Williamson": 728, "ans": 4062, "verbally": 2010, "cracking": 9031, "representations": 183, "fantasy": 4194, "currant": 16229, "1.1": 15265, "programs": 15124, "Election": 12377, "cocked": 25887, "Salinity": 2548, "Jacques": 9224, "volunteered": 23454, "Gapinski": 20974, "spells": 32184, "finance": 4536, "1355": 16586, "gesticulating": 30521, "leaps": 7800, "PLUS": 29561, "328": 5947, "excluded": 18546, "fingered": 23352, "Kreyol": 16696, "saviour": 26108, "unquantified": 32590, "Atwood": 12540, "commandment": 32731, "reconciliation": 3176, "arrange": 17278, "parallel": 655, "marine": 2549, "3.1": 5186, "possessed": 3388, "Ahmad": 18547, "Shawna": 23359, "observers": 18537, "Phet": 29801, "cries": 27699, "marry": 20000, "devils": 31213, "Coruña": 2242, "speculator": 14787, "tempers": 22781, "circulated": 21327, "terrorists": 11189, "procrastination": 18250, "supportive": 396, "Ukrops": 29249, "Experiment": 17905, "businessmen": 11531, "Declaration": 13887, "clink": 31186, "passing": 3312, "90s": 19894, "counter": 6333, "acquittal": 3962, "Hmm": 6460, "arc": 15551, "Ličen": 10834, "Lemon": 6710, "201": 16558, "Winning": 11065, "blinked": 19927, "enamel": 32447, "positing": 17688, "investigación": 2239, "undisputed": 20398, "rudely": 28671, "feature": 850, "interrogated": 12288, "02:42": 22744, "currency": 8629, "uncut": 27844, "Speed": 17321, "411507": 21389, "reduce": 13049, "Serve": 18387, "Cluster": 23040, "awkwardly": 31692, "typos": 26462, "Flourish": 32340, "colleges": 15647, "mooring": 32777, "mimic": 1236, "watering": 8979, "Larry": 10960, "equine": 26120, "Janell": 23587, "THAT'S": 24992, "resigned": 12448, "crusader": 20664, "Casinos": 24428, "slaves": 14673, "chop": 15780, "respective": 13922, "recreating": 2910, "offsets": 10789, "sunny": 11455, "Madame": 5197, "drained": 17743, "crane": 12250, "Pamplona": 27525, "didn't": 6051, "dispute": 7176, "cracker": 29748, "turgid": 32735, "fellas": 32844, "1853": 4440, "SALLY": 11795, "ARCO's": 22561, "headaches": 4752, "delegation": 11473, "Stuff": 28866, "amendments": 31413, "hiring": 10699, "compatibility": 2219, "estimated": 7143, "fruits": 8056, "disrepair": 19854, "i'll": 26975, "Mechanics": 28998, "Sizzle": 15788, "stakes": 7458, "http://www.flickr.com/photos/adamtolle/6094960940/in/set-72157627535453128/": 26615, "incensed": 9141, "bathing": 29520, "sky": 8887, "translator": 5670, "21,600": 25764, "befuddled": 20151, "mL": 18412, "out": 598, "stomach": 9334, "water-melon": 32887, "25.1": 2950, "Machina": 8451, "charitable": 5887, "scoured": 9175, "Re-evaluate": 18256, "USE": 28399, "realization": 8758, "violates": 7451, "burst": 8946, "administrator": 14684, "UCAS": 26122, "hoped": 1336, "institutions": 717, "Nacer": 13119, "I'm": 5249, "learned": 5025, "restraint": 14242, "type": 685, "injured": 11037, "entree": 28819, "brag": 31001, "Canada": 10858, "Rudolf": 4453, "endowment": 14186, "gallon": 18424, "Whereas": 13706, "Nasser's": 30676, "minimum": 10824, "Hooser": 23771, "exulting": 30557, "hesitate": 22233, "enrichment": 847, "livid": 32086, "integral": 16713, "pie": 10584, "discomfiture": 30586, "effacing": 31596, "View": 12222, "Single": 4147, "regret": 14421, "prolong": 24847, "gingerly": 32239, "hookless": 27139, "library": 9838, "Hambali": 20650, "Jurek": 29615, "hotheads": 20417, "Supporting": 2392, "l-": 6272, "argue": 2907, "nor": 2189, "prosecution": 19408, "connects": 15460, "lasping": 30496, "Marriott": 15112, "Robinson's": 19945, "Presentation": 21191, "dined": 28894, "faded": 8759, "Carriles": 19343, "Scampi": 29797, "compact": 2050, "connotations": 8189, "itty": 6273, "biologist": 25028, "neither": 940, "Denmark": 17211, "Answered": 24457, "Quebec": 24105, "rhetorical": 5020, "gouging": 23336, "perpetrated": 12849, "homer": 4884, "agrees": 21366, "Conference": 11415, "recommending": 12976, "affecting": 25125, "Nos": 31382, "Skip": 28172, "steel": 6459, "i'm": 22556, "Benin": 16476, "French": 1730, "Many": 2666, "assisting": 5973, "Lock": 24013, "blah": 15741, "deleterious": 32953, "maintains": 7439, "Guardian": 4485, "glut": 9472, "Corps": 3558, "murmured": 31271, "9": 1442, "Agencies": 24730, "Ultraviolet": 2192, "manufacturer": 21216, "bodyworker": 28375, "over-rated": 28524, "offs": 25020, "Cate": 24669, "07/30/2001": 21070, "R.I": 24799, "directly": 346, "Eleuthra": 23238, "association": 13228, "bodice": 30014, "Truth": 19244, "statutes": 7620, "Performance": 21229, "Dunn": 23647, "drving": 30021, "museums": 7464, "JMB": 23260, "abhorrent": 14404, "consuming": 10658, "apologetically": 31698, "rich": 2980, "abiding": 19867, "supposed": 3925, "anal": 10496, "Nomination": 24703, "regreted": 28669, "humanatarian": 24520, "Holocaust": 14372, "re-invest": 8120, "Turk": 27499, "expanding": 426, "bared": 31968, "bound": 9578, "http://dianacamera.com": 26542, "Nepal": 19525, "confiscated": 7642, "11:15:11": 23816, "Depression": 25856, "reinforces": 10863, "naw": 6099, "Para.": 22301, "Jagger": 25624, "smeared": 8825, "flavors": 16190, "c.l.h.warwick@durham.ac.uk": 30, "killie": 27876, "Controls": 30214, "owned": 12804, "de'": 27111, "Gran'": 31106, "Baking": 32211, "Burkes": 32280, "unspecified": 25179, "CDG": 26600, "freakin": 27574, "Lanka's": 19077, "Walloch": 21142, "pipefitters": 23170, "thundering": 32632, "lull": 12886, "borough": 16583, "account": 3404, "holocaust": 20448, "France": 957, "Le": 28287, "dais": 31818, "Package": 28067, "start": 2175, "Hassan": 12227, "Co-founder": 12223, "lest": 9491, "Overall": 14891, "earning": 4139, "lids": 18063, "relaxes": 24631, "Price": 21643, "quill": 32327, "protects": 14166, "xferring": 21088, "stranded": 27716, "moved": 3144, "Mm": 6037, "Tell": 6210, "Pointe": 16657, "hillocks": 10029, "Evangelical": 5594, "Fuji": 26938, "recipients": 556, "brings": 171, "jewel": 17176, "flicker": 27214, "mother’s": 9528, "dharmad...@gmail.com": 24027, "Invisible": 6927, "ritual": 15312, "chinatown": 29028, "1973": 3487, "04/04/2001": 22572, "smugglers": 12177, "391,000": 17403, "raft": 8958, "feared": 15412, "Corporation": 12829, "strawberries": 8234, "bdr": 29610, "public-relations": 30655, "REPORT": 11493, "Boiled": 27621, "At": 1370, "anti-India": 19565, "Azzam": 20860, "noise": 7779, "sofa": 29827, "abstinence": 26068, "distemper": 7033, "1251": 22006, "slick": 9693, "M-m": 7046, "03/02/2001": 21594, "Sh-": 7025, "Iraq's": 19889, "Navigating": 8336, "alma": 26017, "endanger": 11192, "duel": 3883, "Elaine": 13333, "condor": 9451, "Trump": 12100, "afore": 25655, "pollutes": 30847, "groupings": 15025, "Intelligencer": 24317, "sheik's": 20842, "Parliament": 7256, "disregard": 15090, "saluted": 31848, "sprawled": 12533, "Clauses": 22231, "chewed": 28006, "Sirae": 19610, "11-20-2000": 23813, "PR": 23943, "dinner's": 32072, "Mariner": 27491, "remember": 6065, "popes": 25515, "punch": 11115, "thy": 20118, "petrol": 24563, "heated": 26883, "calcium": 27893, "Barrett": 14453, "system": 540, "Khattab": 18621, "Southampton": 32462, "Twenty": 6044, "dusty": 8900, "startled": 10085, "Reactive": 10296, "Dessert": 29168, "Me": 4108, "Ryder": 4116, "Ahmadinejad": 20248, "Conquest": 20567, "oz": 18436, "fastened": 30470, "PSP": 26782, "Micro": 24191, "specific": 41, "Chu": 12380, "oak": 11970, "sustainable": 16408, "Twante": 19604, "sprits": 30889, "Announcing": 14388, "Often": 5048, "gorse": 25574, "safest": 27223, "neutral": 7278, "hoarier": 30633, "crests": 9070, "Adelle": 11700, "Beside": 17174, "NWP": 21304, "media's": 19918, "Shee": 28027, "Val": 23550, "wile": 27579, "unspeakably": 25820, "XP": 12800, "Surrey": 26124, "Distinguish": 14991, "March": 2125, "Ginger": 21754, "Mixed": 28534, "pavements": 32658, "securing": 4394, "1947": 3457, "70th": 30246, "exceptionally": 14346, "mountaineering": 10021, "rapacity": 31289, "Terrell": 19383, "http://www.chernobyl.info/en": 18714, "-2-F.doc": 21506, "girlfriend": 8868, "minicab": 20763, "Martyrs": 20858, "post-Chavez": 19373, "2,210": 25816, "flexibiltiy": 22718, "2/7/2005": 23950, "stared": 31197, "relatedness": 2889, "Napa": 28674, "Suilen": 2230, "Guilds": 24252, "preparations": 18583, "gun": 9544, "Credit's": 22525, "k": 21018, "settlers": 14674, "useless": 9768, "striking": 1754, "Sonya": 21069, "unfair": 8414, "furze": 31704, "theorized": 12744, "programmed": 20246, "Earthquakes": 26959, "Vienna": 19144, "blower": 27316, "lobbed": 25897, "571-9571": 21082, "law's": 32803, "Alfred": 4047, "shore": 9406, "Duncan": 22799, "standard": 1691, "Fabo": 952, "attachment": 21227, "opposites": 32380, "explicitly": 13733, "youngsters": 18588, "fifth": 12946, "icing": 17834, "misty": 30981, "basketball": 10856, "implant": 9519, "puppy": 9742, "poll": 12677, "penetrated": 20401, "wreck": 29898, "Ramadi": 18627, "QLD": 24948, "working": 1512, "Note": 10767, "Humans": 14812, "bellow": 32159, "cute": 5764, "widgets": 8063, "Aztecs": 15357, "Hyundai": 29549, "constructs": 2541, "agreeing": 12298, "PADILLA": 14351, "pairs": 12087, "yearning": 14190, "Freshly": 18388, "eThink": 21541, "popularly": 24150, "19:14": 24469, "desperately": 8456, "Transmission": 21047, "281-518-1081": 22138, "tame": 26818, "Write": 5870, "url": 24893, "revealed": 5902, "flabby": 31215, "SCREENS": 11863, "Cochin": 4029, "07/19/2001": 22818, "casting": 7065, "+1918584-4428": 17450, "positions": 17661, "acceptable": 6578, "organization": 486, "diachronic": 1085, "Islamic": 12237, "faction": 20565, "Comparison": 26691, "Diagram": 15609, "upstage": 14348, "Per": 21109, "television": 2932, "incessant": 14031, "fine": 581, "burden": 7147, "silk": 8818, "blasphemies": 30452, "recipient": 5380, "blogging": 5222, "dissolved": 18426, "spiraled": 6858, "bomb": 12202, "Curve": 4879, "OPENING": 29696, "scar": 31226, "sights": 17248, "Destiny": 13999, "veterans’": 19247, "machines": 8355, "cloak": 20309, "unset": 26407, "sleigh": 32636, "examination": 3089, "Oija": 7002, "Duran": 13351, "cenotaph": 4071, "day": 2073, "bundled": 31666, "Anything": 6247, "deceleration": 30383, "projectile": 31126, "Controller": 21334, "chases": 27218, "wastes": 2178, "above": 1164, "thrown": 9904, "Laird": 22473, "nasty": 26134, "SCIRI": 25743, "trooper": 4281, "pacifying": 27708, "onwards": 3425, "unawareness": 32910, "entire": 623, "memorized": 21973, "surest": 25101, "psychology": 116, "messing": 12046, "Temecula": 28693, "Hull": 29170, "III": 14554, "cycled": 31585, "Ward": 29266, "Beresford": 23, "voting": 19255, "9.3": 26053, "parentheses": 23473, "profundity": 3999, "Taking": 3314, "nation": 6320, "i'd": 27584, "Prints": 13304, "Charles": 3501, "OAS": 30606, "'ye": 30987, "company’s": 10886, "woodsmoke": 31681, "contraptions": 31824, "travelling": 9927, "lazers": 26717, "overheats": 6779, "cheapest": 26632, "Mutation": 2225, "versions": 10106, "instant": 13433, "Martin’s": 3044, "piping": 26673, "?????": 20121, "MSU": 28037, "laureate": 16911, "Cosmic": 11344, "jihad": 19129, "temperature's": 15814, "case-sensitive": 30130, "Print": 24925, "Cappelletto": 22515, "Complexities": 22630, "girl": 5432, "DRIVE": 28760, "Recent": 12286, "preferring": 20791, "0nside": 26276, "beginners": 24599, "529,000": 15678, "Insights": 7, "Serpent": 15379, "appreciate": 15734, "I’m": 7728, "portends": 25099, "LUCIO": 25368, "Keep": 5865, "reporter's": 18816, "robe": 8613, "512": 28262, "enemies": 14430, "proliferate": 18952, "disintegration": 25597, "suffix": 18073, "Czech": 22506, "noninteractive": 30142, "ahead": 6340, "florist": 28091, "stanza": 11055, "ally": 18914, "steep": 28558, "Lawman": 26065, "04:34": 22021, ",": 19, "enlisted": 4318, "Legacy": 13293, "go-": 6818, "establishment": 931, "aerospace": 16421, "acrimony": 18119, "Webber": 4252, "irritates": 18593, "interviewing": 23364, "which": 196, "Kyle.Jones@radianz.com": 21985, "Lovers": 5481, "Alpha": 20792, "488,800": 15680, "http://www.loveallpeople.org/theonereasonwhy.txt": 24755, "CARREAU": 24782, "fecundity": 31579, "OPEC": 25243, "reclamation": 31738, "substituted": 13071, "historically": 11176, "contractor": 7141, "corpus": 1037, "LTTE's": 19606, "gaining": 8177, "crackling": 30506, "2000": 979, "acquisition": 1944, "manipulations": 2816, "sleeve": 9507, "closest": 5680, "FLY": 29689, "confessed": 19449, "House": 4500, "Mhm": 6378, "Bonosus": 5015, "encountered": 10615, "attain": 23634, "Majorca": 32073, "underpinned": 29217, "unbroken": 32730, "strongly": 355, "posing": 19729, "lichen": 10003, "pullback": 20994, "discomfort": 7780, "Hirsch": 5466, "John": 7841, "Jong": 12864, "correcting": 17693, "unique": 94, "curfew": 18569, "petco": 26591, "crafter": 29539, "ruling": 7460, "Gorbachev": 10401, "AFP": 12162, "enough": 1948, "blender": 17779, "Ocean": 2661, "free": 6572, "Quartiles": 15632, "neroli": 17906, "chisaya": 18355, "Campenni": 19229, "stabilization": 23316, "18:32": 24464, "deceit": 1344, "Obudu": 27534, "unhappy": 3210, "she’d": 8651, "Pediatrics": 1303, "stir": 20016, "Flynn": 9340, "envoy": 19029, "Drug": 19788, "fastest": 25794, "c'mon": 28149, "59,339": 26062, "Calculator": 7042, "REWARDED": 26335, "salatim": 29986, "show's": 5834, "Pervez": 18747, "batch": 8073, "Fate": 32364, "eatables": 27917, "Properly": 17670, "Interceptor": 26003, "phoned": 22141, "(": 219, "Milekic": 268, "Isle": 25008, "NASA’s": 14631, "Typically": 10708, "tempura": 28539, "Army": 3553, "motivation": 15205, "strap": 18194, "sapped": 25864, "Liquid": 6251, "CC": 7668, "Laos": 1847, "Guinea": 27286, "dandelions": 25181, "ambiguous": 30183, "NOTEBOOK": 11925, "olds": 9559, "taonga": 16348, "LITTLE": 21523, "mice": 26249, "canopy": 18200, "Tavern": 28585, "aloft": 14059, "Vilt": 11317, "feedback": 12245, "lazily": 30915, "achieved": 3614, "skewer": 17885, "bridges": 9421, "Canadian": 8418, "MEK": 20064, "seat": 8862, "musical": 11280, "Kelowna": 21290, "appliance": 29317, "Wife": 4162, "personified": 30901, "Spikes": 4869, "QuickenLoans": 16430, "blending": 22691, "miscellaneous": 29544, "storybooks": 8756, "REALY": 28742, "Nashville's": 29740, "Home": 4786, "butcher": 20362, "Fincher": 23140, "Emily": 7666, "bear": 3167, "corridor": 16507, "chiro": 28009, "reticence": 32801, "animal's": 10639, "Snbehnke": 13306, "Breakfast": 10501, "FOR": 11894, "forkfuls": 29988, "hacking": 8290, "Temperament": 24716, "search": 5824, "DS": 26781, "disappearance": 11432, "distress": 32598, "Berry's": 20898, "Filner": 23343, "participants": 235, "conced-": 7609, "Independence": 14670, "Ethnocentrism": 15422, "Pretty": 8779, "BUNCH": 21453, "filtering": 5065, "Binderman": 251, ")": 225, "interviewed": 10475, "Assuming": 7507, "leaks": 20897, "09": 25732, "Room": 276, "Boston": 4769, "Heagle": 13478, "===================================================": 21802, "++++": 28805, "EXPERIENCES": 29774, "Trafalgar": 32557, "difficulty": 1422, "advantaged": 26030, "navigated": 32516, "broken": 973, "depression": 5875, "Britani": 20653, "bludgers": 18294, "08": 14391, "Clelia": 32864, "spanned": 27095, "mysticism": 24050, "http://v2.cache7.c.bigcache.googleapis.com/static.panoramio.com/photos/original/42661265.jpg?redirect_counter=2": 26582, "6TH": 29683, "'05": 29713, "Northeast": 16372, "1833": 14703, "dusk": 30960, "grog": 32551, "dazzling": 31677, "Thompson": 13377, "mood": 13551, "spared": 17213, "Bataan": 2062, "9:00": 15801, "Hooray": 21852, "4": 402, "government": 851, "Pyramid": 15376, "facilitating": 29933, "html": 11360, "disliked": 4341, "115": 17094, "Jill": 29167, "inalienable": 24677, "20s": 5459, "Powers": 11421, "intent": 21323, "harass": 23801, "Theravada": 17398, "chant": 18926, "Libro": 25451, "language": 1738, "Mobile": 29338, "poison": 16079, "singers": 11429, "causing": 12685, "Claiming": 15167, "Course": 7008, "inquiring": 18835, "03/04/2001": 22579, "reproducing": 5689, "Citizenship": 26469, "Pound": 25086, "CHRIS": 28579, "surgeon": 18503, "referee": 13083, "submit": 3849, "jersey": 11094, "blasted": 6704, "clips": 28917, "Ambassador": 12073, "Montana’s": 15487, "consensus": 1296, "ooze": 9489, "Módulo": 17009, "partial": 18830, "accumulated": 2560, "newsgroups": 12707, "others": 1002, "normally": 11092, "bulbous": 30613, "JANUARY": 27092, "Niklaus": 3154, "organizational": 22119, "Powersports": 28471, "decaying": 31175, "ported": 26379, "SPEECH": 14300, "positioning": 17691, "candidates": 12387, "multi-compartment": 24809, "Holinshed": 25336, "float": 9025, "http://www.netpetshop.co.uk/p-19500-savic-chichi-2-chinchilla-rat-degu-ferret-cage.aspx": 26873, "ministers": 19261, "1381": 26913, "streamed": 27211, "DKK": 17264, "ESTAR": 2610, "Jenkins": 2939, "definitive": 3860, "pages": 12785, "z": 7114, "VIETNAMESE": 27723, "Tikal": 15390, "calligraphic": 16801, "Mohammed's": 20569, "somber": 30927, "http://www.loveallpeople.org/theonereasonwhy.html": 24754, "breakneck": 32321, "certificates": 14494, "Environment": 25916, "prowess": 16401, "plump": 32198, "preparatory": 31341, "rises": 14048, "hibernate": 27680, "bras": 27292, "On": 819, "Reinvestment": 24489, "Allard": 24806, "windfall": 25319, "sternly": 29972, "insatiable": 24557, "goods": 8151, "durable": 18170, "rare": 7727, "abundant": 15296, "cross-breeded": 16216, "Lucas": 25565, "adulterated": 25585, "Thirteenth": 4742, "problem": 694, "rallied": 27722, "concerts": 11018, "walkie": 27934, "relief": 7649, "Climbing": 32838, "2500": 17300, "old-fashioned": 30321, "explicit": 1865, "inches": 4808, "Foundation": 10780, "profound": 14415, "caramel": 15892, "ARVN": 18492, "Opportunity": 20578, "transformations": 3022, "Broadcasting": 12828, "thankfully": 26979, "Christie": 10932, "surprising": 2825, "stupidly": 30350, "Opening": 13266, "unweaponized": 20683, "Them": 24292, "crazy": 13432, "Jorge": 21625, "campaigns": 2665, "parent": 18690, "Coffee": 18466, "older": 5204, "deficiency": 20047, "canon": 26387, "released": 2182, "preliminary": 3086, "It'll": 6476, "Pike": 24817, "scratching": 9900, "arresting": 20430, "Rabbi": 30526, "Hjalmar's": 31735, "content": 1591, "funnels": 18026, "Jérôme": 5360, "Rice@ENRON": 21182, "Freeman": 24544, "Primary": 22439, "Gillman": 23818, "oncoming": 9005, "secret": 7745, "Bowtie": 29524, "tumbled": 31228, "occasions": 1439, "Senator’s": 10545, "Landa": 15411, "brother": 3534, "transmit": 21000, "fulfils": 1806, "Livingston": 4360, "Unreported": 19085, "wellshaped": 31915, "appropriated": 20193, "publishing": 1325, "Fly": 22198, "Petersen": 13928, "Lakes": 16369, "determined": 213, "injure": 26292, "1930s": 4531, "inciting": 20478, "affective": 193, "2008": 1555, "Buddhism": 17393, "courtesy": 25091, "BECAUSE": 29147, "departs": 30935, "baring": 31983, "Spill": 28088, "drumming": 8964, "Sc.": 25372, "He'd": 6958, "fungus": 10223, "wins": 817, "paramilitary": 18917, "Throat": 26993, "lifelong": 3352, "Mix": 17872, "beaten": 13725, "HOUSE": 11502, "Percentage": 25921, "QUESTIONS": 28394, "2008's": 5812, "enemy's": 12878, "multiplied": 21672, "together": 172, "Altman": 13730, "gargling": 15826, "kidnappings": 18499, "Dont": 27408, "valve": 29920, "Autos": 29337, "Jeffrey": 1403, "Garten": 21767, "medicinal": 31468, "reproducibility": 2460, "equipped": 12907, "massacred": 16274, "internet": 8366, "identical": 1840, "prior": 4046, "TIS": 21102, "Diplomacy": 24767, "stratosphere": 11355, "skipper": 31237, "mantids": 10255, "Armies": 11181, "appointment": 15810, "Merseybeat": 32375, "halts": 26442, "warrant": 18545, "non-fiction": 10382, "1980s": 5609, "crumbs": 6868, "Cakes": 29500, "insisted": 12030, "lime": 15894, "web": 492, "sholids": 6238, "Judiciary's": 7556, "brandy": 31787, "Robert": 4706, "Another": 849, "Skull": 26032, "pyjamas": 30788, "emission": 2668, "Naqsh-e": 16769, "10:44": 23545, "Strynø": 17255, "Semantics": 3719, "nephews": 6788, "hills": 9117, "naivety": 20554, "Days": 5367, "dilapidation": 16936, "onshore": 23410, "Changzhou": 3341, "1868": 4610, "Bands": 24549, "event": 3721, "*ss": 29757, "Damasus": 4984, "discontent": 14689, "EnronOnLine": 23041, "Debi": 28152, "Prof.": 10263, "Lover": 29357, "childcare": 23922, "Never": 6267, "Forster": 22164, "Innate": 14826, "55,008": 21043, "trifurcation": 19118, "permission": 4395, "pleasantries": 17972, "Tens": 24430, "inhospitable": 15301, "Montague": 21489, "notebook": 18257, "acquainted": 25403, "conjunctions": 32585, "Assembly": 13846, "syntax": 3662, "treasure": 16354, "Phonologie": 3440, "You": 4109, "condemn": 20451, "pH": 18016, "Kroeker": 2487, "Working": 18272, "once": 5129, "intelligence's": 19572, "bottomless": 31761, "Specializing": 4607, "world’s": 7875, "thrashed": 29102, "Eat": 16623, "glazed": 15883, "Windsor": 28030, "Apart": 18982, "Wang": 26718, "aesthetics": 7710, "co-op": 15745, "Isfahan": 16723, "rips": 32123, "Talbott": 19106, "?!?": 28904, "Language": 1034, "yonder": 10035, "Starry": 12504, "marks": 18123, "increased": 831, "ballroom": 13561, "Alpine": 5611, "queerly": 30630, "policemen": 32393, "freeze": 17089, "allows": 1317, "clientelage": 18549, "Suite": 21295, "allegory": 10150, "sense": 1208, "Otters": 17227, "300": 18444, "Tre": 27558, "Principal": 28859, "peace": 6911, "ornamented": 10047, "Nawaz": 18853, "hygiene": 27333, "chairs": 3218, "armed": 14237, "Historically": 16341, "zone": 10414, "Basya": 12149, "ourselves": 7241, "determines": 30207, "summoned": 31721, "49th": 14333, "Utah": 20003, "commented": 6552, "differences": 593, "preparedness": 19007, "enron": 22924, "focal": 920, "searches": 10548, "Dorsey": 22977, "Deb": 28282, "nerf": 21832, "networking": 27669, "Diglipur": 19541, "antecedent": 1151, "Frisco": 17486, "rushing": 18185, "paper": 88, "finches": 27782, "blossoming": 24047, "organisation": 4530, "11:23": 23211, "Gobierno": 17017, "03:58": 22123, "Original": 2341, "grammars": 3756, "perfectly": 2707, "academia": 1372, "Tax": 21095, "manufacturers": 25798, "serotonin": 13583, "tooth": 7012, "Jessica": 7527, "Einstein’s": 15537, "mad": 8837, "Chloe": 23235, "we've": 7043, "evict": 14715, "UNIX": 24213, "muttering": 31277, "hmm": 29483, "Mathematically": 3319, "maid": 11817, "encircled": 20537, "Meditation": 24183, "modernizing": 25779, "1972": 4551, "JUI": 19698, "747": 30528, "Gemini": 25266, "astronomy": 14628, "Confirmations": 21630, "cocktails": 18419, "La.": 19443, "predictable": 15086, "fulfilled": 5060, "lacked": 18813, "Ramzi": 20639, "conned": 27034, "Lessons": 18678, "arterials": 17466, "SQL": 24199, "uncovered": 1345, "rums": 16716, "married": 3971, "scholastic": 6538, "Tournament": 10997, "PT": 24020, "conferred": 31581, "Anton": 19027, "Rusted": 27224, "seven": 1669, "thunder": 32155, "LTTE": 18981, "saw": 6092, "deducting": 22692, "diarrhea": 27457, "Transformation": 30100, "overwhelm": 25860, "Focus": 18254, "hospitality": 14856, "Elsevier’s": 1351, "peculiar": 9944, "flavor": 8181, "yours": 12048, "emancipate": 27730, "Parliament's": 7255, "Tzu": 27386, "Newcomer": 4828, "Upper": 16508, "corner": 4584, "frightens": 17612, "pleure": 4049, "chefs": 8124, "forbade": 14733, "….": 10742, "Øhav": 17201, "Synge": 32823, "3": 382, "targeting": 22374, "death-speckled": 30761, "restricting": 870, "wonderful": 5442, "dollars": 6040, "dyed": 27904, "9:46": 15872, "Mature": 27041, "cybernetic": 8388, "enjoys": 16746, "Gospel": 5169, "cockles": 9058, "Help": 24011, "antiquity": 1098, "Hom": 29816, "detour": 32785, "mischievous": 17929, "His": 1186, "Hydraulica": 3173, "Throughout": 711, "Same": 21128, "Consumption": 2114, "contemplate": 18222, "SAMPLE.DOC": 21721, "Holistic": 23977, "educational": 7484, "NOTICE": 21686, "granddaughter": 9118, "WAITING": 29661, "embarrassing": 10074, "blush": 16064, "beta": 24247, "unwilling": 18218, "officiate": 24692, "Jiabao": 19175, "enters": 15583, "Correct": 6213, "04:52": 23000, "Wolfson": 30635, "Beau": 16697, "Sinh": 27547, "shrugged": 30292, "Kazan": 5510, "girl's": 15720, "continuation": 11240, "Indonesian": 12140, "between": 121, "luxurious": 17138, "Bechtel": 25993, "pedantry": 25684, "winds": 9009, "solution": 2101, "Ærø": 17313, "stations": 16599, "assess": 153, "Leavy": 18849, "Financial": 20977, "causes": 2362, "extracts": 842, "sponsoring": 24527, "Eating": 26814, "designs": 4501, "butter": 15923, "1774": 3526, "KELLY": 14355, "917": 22013, "Prophet": 20729, "liars": 20446, "Horton@ENRON": 22914, "scapes": 11287, "Airborne": 2658, "Polykron": 22281, "mentality": 17652, "greatness": 14344, "ridden": 6630, "GPS": 13669, "salaries": 15682, "Olympus": 26221, "productive": 11655, "raid": 20502, "Really": 6381, "Gatorade": 15839, "misanthropy": 25708, "Ninevah": 18497, "arise": 7271, "shen": 14889, "serpentine": 7380, "fourteen": 5925, "purpose": 111, "Russians": 4388, "491,667": 12502, "local": 8046, "phone": 8680, "glided": 31033, "disentangle": 8783, "and's": 29469, "Fleck": 15126, "LLM": 13709, "covert": 19393, "sentimentality": 32464, "or": 133, "14.2": 26985, "atoms": 18030, "appointees": 25927, "broadly": 7969, "needles": 29516, "Jeju": 26575, "Bonté": 10122, "disorder": 13560, "discouraged": 18889, "Rich": 23798, "teething": 6750, "humanitarian": 14262, "UNSCEAR": 18651, "Slammed": 6077, "Cliffs": 16526, "histories": 11198, "platform": 1668, "badder": 26371, "master's": 5585, "Ferrous": 22988, "supermarkets": 16591, "Michi": 4738, "Tamils": 18972, "flowerbeds": 32100, "bars": 12317, "psychologist": 10724, "Enchantment": 32210, "deduce": 9647, "Outraged": 14717, "Fugitives": 19994, "minutes": 2852, "obsessed": 13607, "battleground": 7321, "overthrough": 32676, "Linguistics": 3647, "unfavorable": 901, "07/17/2000": 22132, "aimlessly": 30235, "bulbs": 2052, "emerged": 2406, "mortality": 8616, "Policy": 14532, "Dylan": 19868, "Seeker": 18350, "oil-fired": 31555, "Wolf": 5784, "unsustainable": 13019, "hiss": 27698, "DB": 22054, "weren’t": 11147, "Habit": 27973, "counteract": 17610, "WASN'T": 29148, "jeering": 32089, "Structuring": 23765, "infidels": 18634, "Barros": 29073, "Miri": 8468, "Jane": 10929, "Aleksei": 4333, "Bonn": 31499, "plentiful": 11979, "guarantee": 781, "instances": 23920, "ratify": 25918, "t'": 31995, "Cardinals": 4929, "Beaters": 18298, "sq": 29557, "underpinning": 2451, "collaborations": 3808, "Mam": 10078, "pebble": 15620, "untouched": 19866, "Company": 21119, "combinations": 30119, "pasture": 21864, "Shawntas": 15905, "rectified": 29297, "1593": 25402, "statistical": 1680, "2003": 4820, "Megumi": 15879, "rapid": 208, "Rachels": 24870, "solicitous": 29594, "Patterson's": 23800, "lopsided": 28685, "with": 385, "bombing": 18484, "91": 7574, "increasing": 1466, "Loss": 26059, "Pervaiz": 18836, "witnesses": 19959, "initiate": 4037, "ulterior": 20150, "Know": 11082, "Cruze": 29368, "bolt": 32087, "Cosplay": 12613, "accordingly": 21683, "Sweetser": 3795, "crows": 11966, "Nonna": 16111, "Constitutional": 15052, "OIR": 1883, "THEO": 10099, "Traffic": 12749, "Appreciation": 2, "accounted": 12772, "tibia": 7059, "Wilkins": 13283, "ringleader": 20492, "11/22/2000": 22060, "Tse": 12489, "Hibernation": 27685, "37th": 14392, "Jenny": 20856, "locks": 9017, "ZEE-no": 15527, "COMM": 23436, "Fragments": 3905, "suitcase": 20784, "malformed": 12731, "dots": 32554, "artificial": 2729, "assortment": 29545, "Imi": 16346, "beneficent": 25293, "uphill": 9837, "my": 4065, "Rotorua": 26962, "Younger": 27966, "Balazick": 28905, "HOTEL": 29950, "Sutcliffe": 25598, "Tenacity": 25263, "Pakistani": 18749, "self-definition": 32794, "Paula": 20940, "A64": 17566, "uncivil": 31261, "aphorisms": 15249, "Germans": 16928, "un": 12865, "thawed": 24772, "Saturday": 10369, "monetary": 7151, "institutionally": 19972, "rods": 32401, "himself": 3679, "Muffs": 27146, "politeness": 31886, "FuelCell": 21225, "http://www.nea.fr/html/rp/chernobyl/c01.html": 18711, "piteous": 9734, "Falernian": 30994, "Son": 19194, "SBA": 11553, "adjudicated": 7293, "pulling": 9274, "meet": 4616, "cheese": 9186, "Younis": 19722, "illusion": 8391, "sandals": 17374, "Stephanie's": 28707, "Mozart": 31652, "roughened": 2709, "attack": 8068, "Philonise": 14173, "circulating": 19514, "Wolności": 16931, "hissing": 20123, "backdated": 3175, "dingy": 28347, "took": 3634, "poetry": 976, "too": 1986, "defending": 11178, "BITCHING": 11873, "brought": 4292, "retirement": 13208, "Bien": 19198, "furious": 24580, "Saffavid": 16789, "Ken's": 27559, "jetty": 31166, "satellite": 2574, "bogus": 25628, "skewering": 32426, "Genevieve": 5829, "commuting": 12940, "footlight": 32693, "Constructions": 3765, "seive": 18402, "commands": 19165, "Corpse": 20329, "majestic": 16578, "Megumi's": 15878, "chasing": 9725, "textbook": 5623, "FREEMAN": 24535, "popularized": 2937, "inadvertently": 6081, "empathized": 9619, "spray": 15976, "FADEL": 10100, "pile": 16024, "dismay": 29481, "infected": 10220, "mumble": 30353, "Herodian": 30755, "mark.carr...@chron.com": 24826, "Namsan": 26576, "reap": 29814, "Independent": 10236, "Dance": 17656, "Dear": 11401, "vlogs": 15781, "acoustic": 10907, "Crossed": 27157, "capsules": 10649, "suffers": 19796, "Ways": 4740, "Gallie": 11942, "prosecutor": 19942, "IHOP": 29438, "Advanced": 3655, "Aside": 30012, "Western": 10449, "Comparing": 4702, "Huh": 1766, "unscreened": 26024, "showroom": 28418, "emptier": 32874, "Aceh": 12146, "Pakistan’s": 19660, "paris": 26596, "encroaches": 30497, "Jealousy": 17601, "Alphabet": 18098, "n-": 6178, "tastings": 28137, "flashing": 24405, "landed": 5768, "inspection": 26025, "Resolution": 19042, "armchairs": 32799, "samples": 502, "fitted": 17671, "04:28": 22161, "retention": 595, "Geneva": 6608, "Chuck": 13393, "community": 369, "**": 24021, "mighty": 31061, "Persians": 16729, "Without": 6504, "974-6721": 21276, "Caspian": 25841, "believer": 20078, "quarter": 12678, "bogging": 18259, "automatic": 1045, "endorse": 19143, "mingled": 31868, "MISS": 11936, "Manic": 17977, "mindlessness": 30377, "invariably": 32764, "coast": 12141, "diplomat": 19680, "sensible": 11626, "traitors": 19309, "wide": 2965, "713-819-2784": 23631, "utter": 8731, "highrise": 16522, "Manager": 10854, "look": 34, "Balanga": 2065, "OK'd": 22219, "shock": 15479, "Mimosas": 29251, "distinguishes": 7625, "łodzianin": 16884, "oath": 14318, "Michaels": 13663, "jaqamofino": 24505, "noting": 13419, "entrepreneurial": 15058, "boarding": 4549, "730": 28478, "were": 866, "NX3": 21280, "FY05": 24480, "fulfilling": 20114, "Banner": 20813, "ecumenical": 5593, "Chinatown": 27251, "nope": 29246, "forks": 31913, "altering": 2383, "SOLVE": 28763, "Satanists": 20133, "distantly": 8031, "dire": 18864, "Town": 28226, "Lawsuits": 12710, "Schmidt": 2494, "sunk": 9107, "chapel": 19932, "Saratoga": 13322, "Better": 8463, "concentrated": 15587, "rainy": 15858, "thumb": 9850, "nobler": 15532, "Shia": 18598, "worshippers": 13506, "11,000": 13255, "PEREGRINate": 25413, "interlopers": 30952, "explosives": 19388, "topics": 125, "improve": 652, "finds": 7283, "Mexico’s": 14746, "youths": 25705, "Bilboa": 27524, "slabs": 32942, "census": 464, "Accountant": 30906, "irregardles": 11951, "justification": 15182, "6:00": 12818, "Justin": 16139, "Side": 18251, "support": 1775, "Cory": 7655, "Melanie": 21479, "leporjj@selectenergy.com": 23538, "Slow": 8091, "Helpers": 28114, "imbecile": 31288, "Aziz": 18630, "reminder": 1941, "Campbell's": 13421, "Guerrillas": 18494, "fiftyfive": 7960, "Adams": 13392, "inject": 579, "PJM": 21583, "averse": 3053, "Arabia’s": 14239, "Reality": 17619, "binary": 23994, "project": 92, "Dependency": 31756, "boat": 11430, "bureaucratic": 13050, "Dior": 32564, "cheap": 2048, "Try": 6825, "kg": 4813, "thrives": 17192, "w/o": 22043, "grandchild": 21749, "Biblically": 6577, "toxic": 2109, "Selah": 23946, "pixie": 9751, "conceived": 7870, "Venetia": 31589, "stenosis": 29921, "resembled": 12201, "homework": 7009, "decks": 28977, "e-mailed": 22146, "anyhow": 31223, "agencies": 11587, "Computer": 3817, "telecommunications": 13918, "print": 10961, "fouling": 11780, "1937": 5582, "exterminator": 14369, "fruitless": 14952, "reproduce": 2277, "products": 1335, "Compositionally": 27175, "Target": 16001, "obligations": 14080, "Rowling": 18284, "junior": 18552, "stalls": 6780, "Theres": 12724, "waterproof": 27830, "glass": 3301, "livable": 11522, "buring": 21902, "blowdry": 29011, "trader": 14788, "Monti": 13221, "river-beds": 31705, "wrestle": 32486, "Jean": 3275, "polluted": 1241, "Hussein": 18560, "cooking": 15556, "rotting": 31137, "Beaches": 27520, "invade": 20361, "nineteenth": 15257, "O'Reilly's": 10980, "Sprague": 5600, "resolve": 8455, "Chardonnay": 16196, "subsides": 23353, "483": 7332, "1982": 1012, "runtime": 30178, "Horror": 5075, "campaign": 2656, "*": 9261, "Finals": 15870, "grad": 20945, "votes": 12386, "rein": 15114, "command": 4351, "unnatural": 1120, "merry-minded": 30556, "Pack": 6978, "LINK": 15066, "Bolshevik": 30703, "jams": 17585, "05:39": 22568, "bitter": 14979, "Warwick": 29, "Soleil": 16698, "soda": 6249, "http://www.arps.org.au/Chernobyl.htm": 18715, "Therefore": 1869, "cheek": 9659, "Viking": 17539, "Farewell": 24898, "boob": 26635, "Max's": 28095, "Oasis": 25687, "upside": 17810, "L'Enfant": 3502, "琴况": 14879, "Concepts": 15014, "craves": 16171, "positively": 356, "picannins": 31931, "booze": 30787, "Whipple": 24995, "MEN": 11989, "07:35": 23777, "likes": 8516, "VICE": 14593, "achievement": 12058, "Sistani": 18933, "recheck": 7016, "Provisions": 21645, "Ortega": 31372, "bella": 28843, "dreadful": 8857, "what’s": 8367, "J.": 3644, "Vergil": 5074, "luv": 28845, "standstill": 30827, "ebb": 30957, "Spaniard": 25406, "COMPANY": 21528, "obstacles": 8155, "grapefruit": 11684, "Asians": 15280, "Spouse(s)": 5351, "Brussels": 5615, "H-0218/97": 31359, "FDR": 18806, "718-780-0276": 21492, "accidental": 26642, "answers": 9901, "disarmament": 14275, "220": 17273, "bun": 15857, "SECOND": 28754, "Franklin": 21457, "Patience": 26816, "microcomputer": 24209, "milking": 20053, "inhabiting": 5160, "Cooker": 18394, "MSNBC": 20694, "4,000": 16892, "basic­ally": 27811, "Welling": 5751, "Mall": 14314, "Golf": 30148, "Across": 14255, "Shrii": 24033, "Stillman": 30263, "Clayton": 15096, "Kerry’s": 19240, "homeless": 24277, "China's": 3408, "Hui": 12463, "600": 14467, "forgetting": 29157, "EOS": 26396, "allegations": 12830, "audible": 24896, "85": 26087, "BLAST": 27929, "Secular": 18947, "righter": 24827, "restrictions": 2349, "Toby": 22273, "subvert": 30257, "77541": 21890, "reactions": 182, "comfort": 9237, "Harold": 30848, "33A": 17028, "stuffing": 8569, "visas": 12068, "observable": 2544, "Tmobile": 28203, "Coppergate": 17540, "12:33": 21348, "patterns": 2806, "Evan": 22791, "Sochi": 10838, "Iran": 12123, "Hopefully": 11698, "S&S": 23227, "unsuspecting": 9217, "Restaurant": 29905, "Authoring": 30174, "mimed": 32722, "blip": 12783, "index": 10951, "Communications": 10848, "stale": 11960, "bn": 24444, "phoenix": 27756, "willingness": 15436, "encounters": 8505, "whisked": 32117, "ME": 7809, "clinic": 26637, "ESAI": 21585, "Cocteau's": 5473, "Petite": 16652, "gingerbread": 8654, "lurid": 10017, "recommendations": 2518, "femora": 2814, "Wootch": 16858, "softener": 18459, "Autumn": 27812, "11/29/2000": 21986, "guz": 26299, "Lam": 12433, "quietly": 19704, "evacuated": 12881, "McGuire": 10906, "Seeing": 23934, "collapse": 12251, "145th": 17476, "Dining": 27505, "environmentalists": 25939, "Auster's": 30238, "examined": 13460, "alright": 6201, "footsteps": 31187, "strut": 19377, "statuette": 4504, "replacing": 6674, "U2": 11354, "Abdullah": 18469, "gamut": 25192, "merit": 10860, "Due": 2887, "pearls": 16052, "alt.animals.horses.breeding": 24837, "Jeez": 7026, "forma": 22740, "Scathalos": 10080, "Tourism": 12926, "students'": 28727, "20001": 22805, "gift": 3389, "advisable": 9257, "dangerous-loiterer": 30638, "430": 16743, "hunh": 6432, "rapidly": 425, "ugly": 15715, "attachments": 21689, "but": 289, "four": 1677, "1.428,000": 16942, "plotting": 31328, "occupancy": 27237, "AG": 22065, "MLB": 4781, "Phantome": 11428, "terrain": 15606, "patchwork": 32186, "Filtered": 30147, "Spiral": 9774, "Laws": 2429, "civilian": 11047, "Robbie": 6964, "saboteurs": 18513, "Buddha": 31019, "Malone": 31517, "Arrogant": 17588, "nonpartisan": 12383, "flicked": 31793, "lintels": 31602, "PA": 22169, "glories": 31050, "Sahhaf": 18608, "vaccine": 7034, "wield": 24593, ">=": 28334, "commodity": 21324, "speeding": 9280, "11/8/2000": 21623, "Newton's": 3259, "Bogliasco": 13197, "particlular": 29781, "midnight": 12819, "Fleming": 21782, "Blanco": 24402, "pin": 7070, "purposes": 2415, "GNU": 10820, "haircuts": 23653, "Each": 6879, "Shuttle": 24453, "Zawahiri": 18741, "processing": 245, "Diebner@ECT": 22039, "calendar": 15318, "GMT": 12739, "credentials": 1462, "heartwarming": 21507, "Mob.": 22247, "STORE": 28649, "wife's": 21155, "bloody": 9200, "Boxes": 18146, "Chinese": 3385, "instincts": 18860, "Sheraton": 29825, "500.00": 29617, "sighed": 9825, "#IStandWithAhmed": 12210, "accused": 18538, "461-1776": 16575, "hooked": 31313, "Nuclear": 14284, "flaws": 32952, "body": 1300, "Pages": 9852, "representing": 14023, "compromising": 23054, "refold": 28220, "medicate": 10210, "137": 14981, "stunt": 31813, "shores": 16367, "fruit-cake": 31611, "bubbles": 32689, "tout": 4055, "backed": 9689, "Suddenly": 9893, "dolls": 31672, "mid-air": 18049, "harm": 10137, "warship": 12152, "avian": 2862, "borrowed": 31874, "adaptive": 14960, "oppressed": 24679, "Rooms": 27404, "incidentally": 32716, "GNP": 11223, "canopied": 31817, "nicks": 26643, "amphitheatre": 31835, "awhile": 27456, "godsend": 21346, "disappointment": 28446, "downs": 25252, "abou": 29359, "non-functional": 18210, "overcharge": 29366, "pill": 16149, "spokesperson": 20695, "course": 790, "Northfield": 30492, "96/96/EC": 31424, "bull": 28329, "alternately": 4320, "taller": 26867, "prestige": 1338, "childlike": 30591, "hospital": 6735, "govern": 14609, "chilling": 16105, "corporation": 20345, "Calvinist": 4296, "Whisk": 17884, "blackouts": 23694, "buddies": 8556, "220b": 23098, "mesmerized": 16136, "110": 10839, "proportion": 13814, "Marlow's": 31040, "IE's": 12771, "malfunction": 18182, "Nagaland": 19528, "Gass": 2396, "climb": 25261, "Tholt": 21450, "appartently": 20146, "non-lexical": 1797, "Tourist": 17005, "truck": 18944, "Mongolia": 16485, "unbeaten": 12583, "revolves": 12911, "junction": 17562, "investments": 14254, "Recuperation": 18730, "transaction": 735, "Michigan": 3649, "client": 7408, "sunbathing": 17387, "acquistion": 21116, "signified": 30725, "Chadli": 13120, "flashest": 16305, "stop": 6292, "exposed": 18655, "salvage": 19032, "PPL": 28189, "sly": 30763, "worrying": 18877, "Jose": 6789, "Poisonous": 20851, "Allowance": 27017, "forgot": 6411, "satirical": 10498, "Sub": 23062, "dusters": 20643, "disaster": 11548, "genome": 10623, "Joke": 17980, "involve": 742, "light": 531, "1987": 13310, "approve": 21476, "reminding": 18607, "gang": 22073, "5.1": 22362, "zeroes": 30164, "battleships": 9247, "Superb": 29090, "exhaustion": 29388, "lurch": 9335, "speculators": 11653, "Chanley": 23583, "Orient": 30728, "lalo": 7522, "superiority": 14697, "PEP": 22840, "reviewer": 28710, "variable": 574, "Washington's": 3568, "3.29": 26011, "technique": 2261, "Beckett": 32822, "chats": 22379, "perceived": 2447, "Library": 25963, "http://www.droidforums.net/forum/droid-news/181335-ereader-tablet-comparison-b-n-nook-tablet-b-n-nook-color-kindle-fire-htc-flyer.html": 26694, "Thailand": 12174, "Founder": 24165, "Thane": 22846, "Measuring": 421, "snorted": 9824, "droughts": 13492, "saleable": 8090, "Bunnell": 24554, "Saudis’": 11224, "15071": 2243, "deported": 19513, "copied": 3907, "Eboracum": 17524, "Yau": 12479, "repeated": 2211, "shinning": 26994, "Brothers": 25089, "mic": 8678, "proud": 9151, "renovated": 16951, "639,000": 15673, "lighthearted": 17916, "39938": 22171, "Geri": 6122, "democratic": 13860, "heavyweight": 20516, "1302": 24970, "shoddy": 27992, "sensed": 24625, "thinness": 30287, "loud": 9714, "EVERYONE": 28341, "Doc": 23066, "Prize": 721, "_": 6242, "Initially": 7917, "daisy": 20055, "dazzlingly": 32353, "Hilton": 5781, "consult": 17722, "Jgerma5@aol.com": 21872, "Excitement": 16012, "Phat": 29004, "exodus": 12938, "dressed": 8635, "optimized": 9590, "540,000": 25761, "No-46": 31473, "04:06:52": 21917, "study": 150, "Order": 18772, "waffle": 29015, "suspects": 29565, "non-prototypical": 1801, "non": 1920, "Everyone’s": 8769, "Selection": 30154, "sussex": 27125, "custom-house": 31079, "checkout": 9839, "Modern": 23155, "excitedly": 31920, "Lucy": 11916, "Tabors": 22354, "425-415-3052": 23181, "7:00": 21564, "offworlder's": 10082, "townhouse": 28969, "gambit": 19859, "features": 1600, "paperclips": 13701, "mailer's": 20863, "42,008": 21045, "03:33": 23331, "postcard": 31676, "connectedness": 30371, "Twitter": 8349, "Center": 3654, "1:00": 22255, "bungling": 18908, "Andres": 2055, "server": 20962, "Aeronautics": 2585, "manifestations": 25674, "STORM": 22955, "uncredited": 5745, "M.": 7532, "name": 3120, "painter": 3520, "thwart": 14228, "Bramen": 29046, "twirl": 31789, "Reza": 16831, "re-wiring": 28377, "Whither": 14074, "assuring": 24386, "jumbled": 25519, "clinging": 9034, "problems": 1620, "Runs": 4788, "Imam": 16797, "where-ever": 27564, "side-locks": 30533, "down": 2188, "Easiest": 28696, "Iron": 29491, "Squirrels": 29525, "carry": 2346, "42,000.00": 24918, "Hugo": 8423, "slithers": 26887, "plan": 1706, "complexities": 6311, "he'll": 6692, "obligates": 22707, "youngish": 31628, "recognize": 1705, "conscience": 5039, "railway-truck": 31173, "blackworms": 27053, "selfie": 5294, "Anastacio": 1509, "Operandi": 20577, "NOTE": 15665, "They'll": 18453, "Jolfa": 16749, "HONG": 11804, "citrus": 10518, "Mrs.": 6456, "prolonged": 2210, "evenings": 16785, "tonnes": 20231, "structured": 1079, "explorers": 17543, "exploding": 4571, "Braque": 21164, "longshoreman": 29969, "have": 49, "hurdles": 13051, "healthier": 8523, "pre-fab": 24913, "della": 25486, "sticks": 9564, "slipstream": 18186, "Akin@ECT": 21383, "approximates": 480, "hvae": 26455, "strangely": 32873, "scientists’": 657, "Possibilities": 14634, "tackle": 14272, "specification": 30035, "spirited": 11142, "Kohne": 16792, "endorsed": 31541, "fluffy": 17836, "manikins": 26549, "Acer": 26317, "fam": 26900, "hatch": 27862, "modifying": 2316, "Final": 3829, "clouds": 9050, "societies": 642, "Chelsea": 7318, "Immacolata": 13213, "activist": 10366, "miseries": 20480, "rattled": 30291, "people's": 13347, "unequipped": 19553, "engendered": 3023, "customs": 14738, "munching": 25059, "father's": 3188, "44": 17433, "rapacious": 31217, "Near": 15377, "grandma": 25002, "backlog": 12971, "instability": 18879, "opportune": 16147, "animators": 13639, "disruptions": 15093, "chants": 20105, "replacement": 19968, "drooling": 6831, "unavoidable": 25905, "Hartpury": 26117, "stupidity": 14645, "gelato": 28303, "Thursday's": 23774, "Dubai": 16764, "representation": 457, "Solids": 27883, "labor": 661, "include": 1953, "http://www.physics.isu.edu/radinf/chern.htm": 18713, "emigrated": 3138, "speeches": 7707, "aggressive": 10426, "dreamed": 9550, "04:44": 21712, "NBA": 16431, "banned": 3170, "geopolitics": 19178, "Fehl": 22934, "NetMeeting": 21448, "condiments": 29987, "Handy": 28864, "Margot's": 31914, "1922": 3496, "output": 20225, "http://www.equinecaninefeline.com/catalog/mamble-hamster-narrow-100cm-cage-p-12642.html": 26870, "particular": 507, "studymate": 10251, "soundtrack": 13768, "rising": 4042, "Ban": 18845, "Brain": 23762, "CONVENIENT": 29194, "Hindi": 20652, "mid-size": 8116, "math": 7739, "anxiously": 32145, "Personal": 4204, "clause": 1155, "measure": 3311, "university": 336, "sentencing": 19944, "sunglasses": 27808, "word": 1131, "lope": 26195, "Grant": 24528, "Love": 5871, "NFL": 16434, "Lawyer": 14761, "whipped": 15335, "winery": 16183, "MIUI": 26162, "purple-faced": 32031, "characterize": 18841, "wands": 16095, "bottle": 6816, "windmills": 30449, "patron": 4995, "intelligible": 30616, "intertwined": 6853, "skipped": 10156, "ECC": 22541, "waked": 27179, "relaxed": 16742, "Gamaa": 20831, "dat": 26819, "Richard": 5352, "discrepancy": 21408, "Lagrange's": 3246, "Shahid": 16759, "Beutel": 24807, "canoeing": 24113, "re-enlist": 25866, "sunlight": 9174, "107": 12247, "spiel": 20243, "McNuggets": 26343, "stressed": 17822, "http://www.squidoo.com/nook-tablet": 26689, "People": 5233, "innkeeper": 29965, "Clinical": 8533, "Bonnard": 21160, "pretty": 6778, "meek": 21971, "Pursuant": 10720, "knocking": 11243, "confirm": 7570, "DID": 11869, "midwife": 16157, "Pakistan's": 18840, "screened": 25952, "plight": 4718, "patriots": 30689, "blond": 32052, "accent": 19828, "Saintes": 16645, "slaughter": 27329, "Nellie": 30872, "engraved": 12662, "eastern": 10000, "decent": 13775, "mosquitoes": 31713, "persisting": 14221, "04/28/2000": 23815, "Methodius": 25351, "Dingle": 27829, "tracks": 11364, "occasional": 11424, "pure": 15930, "empirically": 15168, "symbol": 6867, "Wiki": 12689, "minarets": 16807, "850-748-0740": 24698, "Essex": 25429, "discoverer": 11318, "stunk": 23354, "Daughters": 12066, "happier": 25274, "4-5": 30603, "Mangold": 22801, "Digital": 1495, "inflammatory": 20561, "58369": 23379, "Widely": 26989, "tentatively": 30413, "wase": 28355, "packing": 12136, "Virtual": 11358, "Chasing": 4092, "accomplished": 15221, "reaping": 25269, "obsidian": 15327, "numb": 9534, "Qatar": 4510, "Yam": 30802, "dental": 6946, "',": 26453, "1341": 24971, "futurity": 9943, "ids": 23106, "2,300": 14658, "Diablo": 26991, "restricted": 1742, "flow": 3012, "FCE": 21964, "document": 1955, "checked-cloth": 32399, "Rock": 11163, "Buckeye": 17120, "result": 900, "blindman": 30379, "05:51": 23049, "influenced": 357, "Instead": 7987, "acquaintances": 32922, "urinary": 26805, "mines": 21512, "Sill": 22234, "cosmic": 7000, "clients": 28159, "certainly": 7476, "Applying": 15247, "screams": 24123, "Athene": 32416, "DELHI": 18993, "unhygienic": 32459, "scholars’": 1063, "affluent": 4998, "Panama's": 13108, "Police": 12203, "exciting": 13796, "spa": 27510, "Albergo": 25543, "Link": 19755, "tormented": 24891, "Bet": 10079, "singularity": 13996, "Marstal": 17312, "978": 23860, "boys": 6726, "Perle": 25976, "Administration": 2586, "Ba'athist": 19276, "misleading": 1284, "Bait": 29554, "Hind": 30940, "Sara's": 22256, "rotted": 32824, "slandered": 31330, "abstained": 5137, "Pasejo": 16980, "Cupcakes": 17825, "OOPS": 22279, "inadequate": 5571, "Chili": 28531, "Shrek": 13596, "rider": 6631, "polytheism": 13524, "Aeroméxico": 17116, "northward": 19623, "Creekside": 29195, "0800": 24867, "UPDATE": 18648, "inspectors": 22658, "Bumrungard": 26638, "neoformalism": 14924, "Warrants": 31769, "car": 6073, "WB": 5785, "placate": 6008, "weekday": 9834, "gesture": 26812, "Briggs": 19416, "pre-cut": 26841, "Recreational": 16371, "Congresswoman": 14111, "hit": 4894, "CLOSING": 29697, "350": 17268, "gearing": 22341, "crocodilians": 2762, "Wait": 6444, "believers": 20307, "omnipotence": 30700, "Penman": 21932, "befriend": 30693, "y-": 6351, "Ristorante": 29006, "appealed": 7588, "broccoli": 27444, "separation": 7630, "713-654-1281": 20984, "simulates": 2312, "Julie": 22076, "Guerra": 29044, "paste": 24260, "What’s": 8060, "hastag": 12232, "Croke": 27189, "Pros": 28346, "Supermechanized": 30805, "AUBREY": 25390, "festival": 12910, "Workers": 29931, "limerick": 26156, "Pachomius’": 6014, "operator": 2302, "prevent": 10284, "unlawful": 19550, "05:17": 21071, "queso": 28494, "Homes": 28651, "silliest": 32766, "Bagh": 27415, "diligent": 15710, "dated": 19852, "seated": 7523, "knocks": 25268, "player's": 1672, "cramp": 31669, "novellas": 7706, "ER": 28340, "cuttings": 8980, "kitchen": 8130, "shrine": 32390, "anemone": 10589, "baking": 6455, "adn": 22559, "Siméon": 3830, "Source": 10815, "Tourists": 17154, "downfall": 8921, "Shelia": 23758, "Nunzio": 13238, "glared": 9959, "motto": 13904, "wizards": 32045, "Cook": 18378, "insignias": 3605, "divides": 19631, "feet": 4807, "Plants": 16620, "crews": 7187, "dad's": 13752, "Mitchell": 4170, "1926": 3414, "reefs": 16686, "Murphy": 23394, "naked": 6852, "prepaid": 23637, "litterbox": 27464, "Weiss": 3037, "illumination": 30983, "scheduler": 19820, "outfitting": 26004, "banknote": 4760, "Malfoy": 32083, "predatory": 871, "stamping": 9840, "Mary": 4246, "Innovative": 23984, "pioneering": 3118, "cycling": 9229, "Assad": 20364, "VISA": 27122, "saga": 21880, "futures": 11239, "hui": 18834, "dials": 9935, "radiantly": 24629, "inky": 9987, "headboard": 29888, "cichlid": 27048, "Aphrodite": 13517, "Branford": 28670, "non-art": 13387, "Fallujan": 18599, "Aircraft": 24455, "Parents": 28509, "havn't": 24241, "Dempseys": 27047, "11.30": 31420, "anti-christ": 12333, "Elia": 4555, "shipment": 19578, "pepperoni": 29711, "Kitts": 16490, "synthetic": 24642, "noises": 17925, "Savage's": 10483, "Blount's": 19803, "Shane": 5313, "Letter": 20852, "Summit": 13866, "Dutton": 14984, "scratches": 27453, "gro": 26138, "thursday": 21008, "refiners": 31348, "alternatives": 7645, "abandoned": 4023, "inquiringly": 32000, "Sean.Cooper@ElPaso.com": 21006, "apprehensive": 18581, "Went": 28559, "Filipino": 20735, "includes": 1159, "cannot": 1425, "growing": 1360, "British": 3824, "invite": 11207, "busier": 11416, "dine": 16996, "could've": 13144, "Revolutionary": 3540, "gifts": 6425, "colleagues": 1990, "Furnishings": 29893, "York": 3613, "want": 5255, "Represent.com": 5868, "Iceland": 25150, "stereo": 21830, "hunks": 23941, "held": 3217, "Custom": 19472, "1920s": 16975, "displacing": 2909, "soulless": 6913, "blood": 3282, "runner": 8403, "cleaser": 27447, "stiffening": 30637, "Tenn": 21515, "toiling": 31184, "incentives": 755, "synonymous": 9129, "butt": 9783, "transactional": 22587, "tomorrow": 6963, "++++++": 21684, "multiplex": 29523, "Harley": 6960, "metabolism": 27683, "lightly": 9536, "rescinded": 10422, "supplier": 19156, "masks": 26005, "elaborately": 30269, "paths": 1898, "anyone": 8169, "placing": 18398, "exclusion": 13553, "remilitarization": 10425, "Canal": 27248, "paratexts": 2986, "personal": 5297, "Happy": 15884, "FEVER": 22951, "latin": 27257, "lemonade": 27946, "chips": 11350, "say": 2929, "scrumptious": 28148, "millions": 1951, "disdain": 15461, "revising": 22288, "Alexandria": 24762, "Yaay": 16116, "believe": 771, "Mon.": 22189, "heather": 26192, "nylon": 9726, "1986": 5178, "arrow": 8684, "Hispanic": 17101, "contradicting": 19762, "outfielder": 4799, "SHOCK": 22945, "dressing-case": 31318, "commercialize": 13403, "sacrifices": 10805, "repeating": 14121, "breeds": 31765, "weigh": 15361, "history": 176, "I": 1438, "graduation": 4559, "vibrated": 9933, "Former": 19437, "Solana": 28828, "inferred": 2738, "Cocoa": 11992, "boldness": 14381, "Sacramento": 22373, "Math": 11722, "rakau": 16329, "Emission": 2098, "artwork": 77, "Terrex": 15961, "Society": 3226, "entitlement": 7596, "indicate": 2755, "arguments": 6593, "craftsmen": 16896, "c'm": 28150, "Describe": 14990, "gossipy": 17627, "Bernhard": 3434, "importantly": 8159, "crooked": 9137, "Tomorrow": 6943, "tankmates": 27043, "Mar": 21665, "YES": 29942, "shortest": 15548, "shrewd": 25523, "worshiped": 25685, "Roly": 31847, "Sharing": 32923, "Buddakan": 28957, "farce": 20255, "blooming": 17196, "Skylight": 28499, "Directive": 31365, "visit": 260, "fragmentary": 13525, "railroad": 17487, "couches": 9561, "Harrison": 22001, "engage": 2988, "Outside": 8997, "wager": 23727, "folly": 31219, "deliciousness": 29715, "x-37097": 22414, "Fernandina": 28259, "wines": 16206, "kids": 6652, "discussed": 911, "Russia": 4259, "Passages": 4441, "Paganism": 20220, "Send": 22082, "MACS": 22210, "plagued": 8386, "clicker": 27395, "arent": 27786, "MAIN": 24537, "QFs": 23652, "miserably": 32074, "Antipasto": 28297, "Ridge": 17129, "Laplace": 3267, "Kurds": 18801, "JWVS": 21739, "brazen": 19096, "69": 24320, "Fenway": 4937, "Prophet's": 20614, "upstairs": 8562, "desultorily": 31609, "severed": 30344, "augmentation": 8273, "3.2": 23572, "climber": 29387, "journalist": 4168, "Having": 5967, "1776": 14949, "censored": 26543, "die": 4066, "Huffington": 13465, "Randy": 22703, "both": 345, "metro": 16378, "Truman": 13341, "Jackie": 16050, "bark": 17190, "slips": 31080, "kyle.jones@radianz.com": 22015, "reporting": 1969, "Mount": 26722, "pre-rinsed": 18367, "preposterous": 20441, "Enquirer": 20821, "eaiser": 27787, "undermine": 14711, "racketeers": 30817, "Implicated": 19440, "Casper": 6997, "neatly": 9816, "fruitcake": 6497, "Las": 10344, "Gameplay": 12586, "Chicken": 17782, "GUARANTEE": 28409, "GEMMA": 8261, "saplings": 25057, "Relief": 11529, "antichrist": 25595, "Wakes": 27181, "Kadhim": 18515, "pm": 15802, "Governments": 20481, "france": 26599, "Compression": 22705, "ceremonies": 16849, "250": 278, "proving": 12135, "Arrival": 24259, "sholder": 27800, "deposit": 12084, "pinkies": 27671, "itself": 874, "Alfa": 18053, "mailto:mayur...@yahoo.com": 25327, "FIT": 29851, "impossible": 6663, "developers": 3149, "avoid": 500, "WOMAN": 21524, "Farrier": 6407, "1": 331, "LEGAL": 24942, "green": 8683, "Nonna!": 16131, "eliminated": 20524, "Hotel": 13182, "bob": 23158, "spies": 22774, "curate": 25505, "fortnight": 32064, "53": 21711, "Jingū": 4762, "#kairos": 7825, "rush": 12587, "well": 185, "dash": 11959, "Yonhap": 12837, "celebrities": 13339, "condo": 19346, "Sainte": 11464, "sp": 21472, "dome": 9968, "Giverny": 22193, "Jordanians": 30753, "constructing": 19607, "empresario": 14712, "promotion": 4893, "Lau": 7528, "Widow": 12632, "Few": 23318, "Andover": 11713, "itll": 26588, "catastrophe": 25885, "stopped": 4753, "cuckoo": 25121, "Oliver": 727, "Cognition": 15005, "launched": 5867, "UofH": 23448, "statement": 1290, "pathological": 13568, "tattoos": 28129, "promises": 7937, "Montavano": 23728, "Cannes": 5364, "honesty": 19433, "awe": 14376, "separated": 5449, "hurts": 7007, "4600": 17301, "LOVE": 26864, "rep.": 26306, "multiply": 7107, "formalized": 2287, "Marquez": 22291, "per": 2853, "Noyce": 24174, "Complaint": 20893, "mechanicly": 29416, "webcomic": 10503, "swamp": 31010, "optional": 8242, "Jenks": 17495, "Kiwi": 27560, "live": 1237, "brunt": 9753, "togas": 31829, "dripping": 9460, "Christchurch": 12649, "Roosevelt": 25805, "claiming": 7497, "biological": 14807, "circumstances": 6612, "1500": 29055, "doctrine": 6561, "deficit": 26045, "Azzaman": 18628, "sailed": 27490, "codifies": 31383, "southern": 4340, "abrasive": 29838, "Chemical": 10087, "cardboard": 30304, "1715": 3528, "novelist": 4625, "10/31/2000": 22400, "discipline": 619, "Taliban": 12107, "inability": 19494, "rejection": 3857, "UNC": 13340, "formless": 31136, "squared": 7081, "180.9": 23605, "Tie": 8816, "elected": 3223, "Compson's": 30711, "increasingly": 2984, "it'll": 7049, "GTCs": 23516, "LOCKHART": 32345, "liquidations": 22318, "dancer": 5419, "hateful": 9434, "precedent": 7429, "bowl": 6975, "ring": 4927, "Factory": 10468, "daydreams": 18269, "guarentee": 29823, "pao": 29840, "Document": 10821, "Palacio": 17012, "responds": 17973, "travels": 15547, "Jamaica": 20911, "Theodorus": 5904, "Rat": 26878, "____________________________________________________": 21494, "relocating": 29290, "carol.st.clair@enron.com": 23505, "lid": 17776, "Arkham": 12561, "reporters": 13278, "Normale": 3838, "evalu-": 6551, "Ask": 16530, "arrv.": 22196, "Romanick": 29602, "YOU": 19470, "warn": 20617, "yell": 6212, "slapped": 29103, "Patricia": 23817, "contrasts": 16960, "-------------------": 24905, "twenty": 4067, "Inc": 21115, "boyhood": 31056, "chicken-processing": 32840, "checkups": 16161, "slip": 17371, "poring": 30340, "70,000": 5889, "Ted.Bockius@ivita.com": 22131, "chiropractric": 29072, "membership": 478, "detail": 5664, "SAP": 21103, "GIRL": 27969, "root": 7080, "drainage-pipes": 31227, "80119": 17020, "driest": 27810, "inheritance": 7234, "Souvlaki": 32928, "sub-division": 29223, "60s": 26950, "recording": 10920, "orally": 22785, "endeavor": 2378, "PUC": 22462, "appellants": 7317, "lasted": 15397, "ammonium": 18045, "Mandelstams": 30768, "Daniel": 26, "Tehran": 16727, "roadworthiness": 31426, "Magi": 10353, "doublethink": 23954, "dramatically": 17753, "Biloxi": 24413, "0.8": 2624, "kinematics": 2737, "bushy": 17766, "moderate": 18932, "103": 980, "infinite": 1220, "pass": 7854, "peas": 8012, "hybrids": 25093, "Rayburn": 32450, "presence": 2079, "Only": 4044, "ridiculed": 20442, "aways": 26573, "ocho": 6317, "JOHANN": 10093, "facing": 11533, "Architect": 15271, "itching": 9869, "procedural": 23264, "audibly": 9657, "Thus": 69, "Land": 2662, "Uncover": 18385, "Pi": 13960, "cauldron": 25756, "03/08/2000": 22480, "requests": 12695, "FRL3@pge.com": 23272, "afterlife": 18223, "dissatisfaction": 11658, "potable": 25998, "pince-nez": 32256, "rampant": 13833, "Karlgren's": 3435, "Funds": 31503, "invested": 7928, "°": 16988, "ps.": 26965, "proponents": 2217, "defendants": 7386, "Baseball": 4801, "Asansol": 26436, "destructive": 14038, "except": 4803, "robotics": 12059, "malfunctions": 8393, "reclining": 26999, "vault": 32322, "punctuated": 8592, "Shandao": 12944, "Maker": 10127, "hes": 26857, "Scriptures": 6633, "governed": 30726, "860-665-2368": 23537, "Andorra": 27530, "Lawmakers": 23671, "Budgies": 26733, "seaweed": 9016, "Callon": 23396, "attentive": 28325, "...........": 27379, "locomotion": 2760, "marketplaces": 23857, "Bush’s": 19209, "U$": 26744, "eatin": 27738, "8:00": 19809, "re-run": 22105, "Norwegian": 19013, "Cauldron": 16101, "Pending": 22159, "libeled": 19184, "incredulity": 19313, "Hedging": 21573, "Guadeloupean": 16721, "theirs": 2842, "deception": 1230, "Kaplan": 22365, "Dixie": 22113, "avenging": 31296, "PAY": 29964, "officials": 4345, "Venezuelan": 19375, "spiral": 7050, "http://www.bigeye.com/111003.htm": 19434, "thirty-eight": 30864, "P.A.": 11789, "Felicia": 23752, "Yellowstone": 25012, "retained": 11608, "Solutions": 22003, "resting": 14030, "Spacetoday.net": 24491, "nightclubs": 5224, "viability": 15201, "folder": 30199, "Fascinating": 26663, "Recovery": 21888, "looked": 6148, "Question": 20089, "attache": 5608, "Clause": 6994, "Approval": 22417, "TV": 4085, "gestures": 19131, "vanguard": 29024, "redesigning": 3617, "keyboard": 7756, "reclaim": 7637, "Prescott": 19864, "OFFICE": 11503, "smoking": 7345, "enormously": 17088, "civil": 3610, "supreme": 12866, "envisioned": 10798, "Kazakhstan": 25842, "Were": 13025, "willl": 26765, "executable": 22225, "Luncheonette": 30299, "governor's": 23704, "Shukrijumah": 20597, "beasts": 10633, "1,537,058": 17083, "mode": 14564, "http://www.calguard.ca.gov/ia/Chernobyl-15%20years.htm": 18702, "O": 13932, "Tonight": 9292, "pad": 11329, "provinces": 22521, "magnesium": 27894, "beetles": 10253, "formulate": 10605, "streamside": 25066, "Wookie": 7549, "SARS": 13804, "don": 13431, "crying": 8740, "Cars": 29721, "mpg": 29369, "Relatedly": 15161, "Bertone@ENRON_DEVELOPMENT": 23204, "matches": 12576, "Basil": 15893, "Great": 4285, "Hakim": 16815, "Dollars": 21679, "so": 1182, "unconscious": 148, "Respect": 17332, "passive": 2582, "remerged": 30355, "ii": 22701, "Besides": 1163, "OUTTA": 28794, "Isn't": 6486, "waved": 9013, "myopic": 13785, "coping": 14925, "Snow": 32387, "horseshoes": 6413, "bear's": 24115, "dog": 1722, "Mets": 11014, "organize": 15003, "objectless": 31181, "explain": 6685, "unconcious": 20050, "Decor": 29616, "Burrows": 12652, "Embassies": 20546, "fiancé": 3927, "Form": 23532, "Division": 21122, "Increases": 24054, "PHOTOS": 28175, "tablespoon": 17840, "eg": 21376, "stupid": 10062, "solutions": 379, "hypothetically": 2766, "orange": 10517, "rhaps": 11986, "E500's": 21778, "Stuart's": 29813, "cleanup": 13496, "Batting": 4784, "Morning": 10500, "entrée": 18804, "1,700": 25966, "momentary": 9971, "crunch": 16134, "Pasta": 16168, "frantic": 30266, "stonily": 31198, "debates": 1282, "doi:10.1037/0022-3514.92.6.1087": 15244, "bryer": 26837, "settler": 31631, "Volunteer": 12594, "indefinite": 9930, "polar": 24106, "intends": 12674, "maps": 2614, "YOU'LL": 28922, "Syria": 5124, "Jacobs": 23795, "lively": 30590, "ICT": 13993, "taunting": 30477, "transferring": 4836, "ld2d-#69396-1.DOC": 22435, "sooo": 29853, "Braunsberg": 4302, "Pik-wan": 12476, "nylons": 11827, "dairy": 12003, "weaknesses": 571, "basters": 18027, "Ma": 21992, "harshly": 27391, "Jacobsen": 29868, "hurling": 19302, "zinc": 27296, "shit": 9675, "morning's": 30318, "deadliest": 13177, "Nigorie": 4734, "persons": 7516, "can't": 6064, "vet": 26254, "1220": 15650, "mshames@ucan.org": 23892, "misc.consumers": 24339, "thi": 7084, "disciplines": 455, "prove": 2025, "Re": 21920, "environment": 1238, "Master": 5208, "Medical": 20572, "Nazis": 16926, "race": 7628, "opportunities": 8115, "Sassi": 13142, "GOODWYN": 19815, "panicking": 26756, "restfully": 24621, "Kibbutz": 11248, "combines": 1621, "blind": 10309, "40,000": 5893, "photographs": 7513, ",?": 22425, "Displays": 12589, "Rod": 29867, "Rendy": 28292, "Arco": 22557, "Metropolitan": 5843, "Minster": 17523, "subscribe": 15904, "Arrv.": 22183, "o’clock": 8576, "0.70": 27219, "manipulating": 2344, "neurology": 20750, "fostering": 8520, "Slowest": 28167, "fleece": 26865, "age": 1563, "served": 3374, "Prague": 20785, "thou-": 6050, "ul": 19618, "addition": 1701, "maniacs": 12846, "caper": 25031, "white-blond": 30274, "assumptions": 14847, "loins": 31189, "Milton": 7848, "nearsightedness": 9586, "df": 22747, "XSL": 30093, "Marek": 28178, "tapering": 2876, "Shea": 11062, "advises": 20768, "Caucasians": 27272, "veranda": 31276, "footing": 32908, "congratulate": 13850, "immediate": 5621, "robbed": 29180, "underwear": 8845, "Bradenton": 4871, "enclosure": 2847, "beyond": 8365, "Perez": 25433, "railways": 26447, "Friendly": 28103, "bandage": 7037, "Chipotle": 29441, "uptown": 30295, "acquiring": 20233, "expostulation": 30853, "worked": 5495, "unparalleled": 28978, "feasible": 2906, "Nations": 8050, "125": 17267, "dismisses": 19278, "Barcelona": 27243, "volunteer": 10817, "adversary": 32692, "Sandwiches": 29430, "Eichelberger's": 30677, "arbitrariness": 1746, "Distractions": 7665, "Miles": 30658, "Margaritas": 28490, "Until": 5518, "ANY": 26466, "Mujahedeen": 20067, "Assam": 19625, "Cleveland's": 16404, "rode": 9060, "Toowoomba": 24947, "chlorination": 27870, "seeks": 14487, "Tobin": 7840, "TGIF": 29113, "washes": 28896, "situations": 6625, "lightbulb": 29824, "albums": 2961, "backtracked": 30389, "wit": 4347, "gilded": 14188, "Scalzo": 1539, "indignation": 30569, "variability": 1921, "ʃɑʁl": 3504, "sinks": 19917, "floor": 6671, "cheaper": 15758, "utensils": 27327, "draw": 2519, "shop-cum-post-office": 31576, "wop": 30715, "Party's": 12399, "fiasco": 32168, "dividend": 7905, "NWSC": 12497, "up": 974, "leak": 13043, "severe": 2449, "Curveball": 20787, "Senabre": 1011, "Where’s": 8774, "assertions": 22469, "Yemen": 12125, "ugliness": 31923, "video": 2955, "Visited": 26774, "Satanic": 19939, "Gus": 29050, "Te": 16345, "Provides": 23281, "facets": 2915, "Fi": 8281, "dreams": 9376, "Siegel": 11157, "constitutions": 7595, "disposed": 2181, "Mubarak": 20809, "privileges": 859, "Conservation": 3315, "binds": 25304, "fragile": 18141, ":D": 26339, "IL": 26914, "assault": 6537, "undermining": 19647, "omitted": 1090, "beneficiary": 19153, "Department": 2061, "feb": 24235, "I'd": 6183, "monetize": 7442, "Southeast": 17441, "Except": 17355, "feisty": 27670, "insoles": 32627, "Serving": 16409, "dessert": 10582, "amends": 22544, "directions": 6881, "Neal": 23730, "they’ll": 14633, "complicated": 10053, "Cathedral": 16959, "shirts": 5890, "watchful": 19982, "Nathan": 7089, "BIG": 26239, "Patrizia": 10264, "10/23/2000": 21933, "accuses": 19640, "Rossi": 22392, "legislate": 14384, "constitute": 19534, "coop": 27279, "knight": 32705, "purchases": 19898, "accuracy": 1642, "3/03": 21404, "successful": 2569, "penne": 15772, "Cleaning": 28825, "disastrous": 19777, "Tho": 27554, "persuasive": 25256, "pecking": 26662, "WERE": 27715, "smakkecenter": 17254, "Stephen.Dyer@bakerbotts.com": 22962, "Faris": 28099, "icecream": 31833, "embolden": 18121, "silently": 29376, "Sr": 22332, "blur": 27813, "Terms": 15415, "we": 138, "TwenCen": 9591, "2.3": 15222, "Privacy": 21002, "Signs": 27069, "twinkies": 21536, "Closs": 28849, "COST": 19477, "Ventures": 21143, "Logic": 25904, "cross": 11143, "hydrogen": 10227, "detection": 25811, "investigation": 2913, "crust": 16118, "IGTS": 21500, "appetizing": 29294, "nodding": 32917, "Marie": 3529, "foisted": 15150, "Intrepid": 27565, "flatness": 30892, "Factor": 7424, "risk": 8376, "Problem": 13545, "chronic": 2198, "w/": 23645, "non-Mediterranean": 31544, "guess": 6129, "reddish": 9996, "Aeromexico": 16497, "Copies": 22547, "accomplishes": 15261, "Instagram": 15868, "developmentally": 8781, "hundredth": 15646, "helicopter": 18579, "Indivero": 23165, "demonstrating": 1971, "immigration": 13029, "winters": 17087, "Saucey's": 28057, "11.8": 18434, "neural": 8343, "retaking": 22673, "Alaskans’": 7893, "barber's": 30450, "Rank": 26084, "fanaticism": 20376, "Vandergrift": 2398, "Hall": 3618, "Maoists": 19569, "lamp": 2167, "Produce": 8005, "Rack": 10590, "Depends": 27427, "analyzing": 2827, "performers": 21035, "smells": 16107, "Patio": 28241, "conclusions": 1988, "NK": 22913, "Sigma": 18055, "myself": 5049, "Maeena": 12270, "partisan": 30684, "ensuring": 5673, "fascinating": 7320, "Humanities": 10384, "anti-shipping": 25782, "doubles": 4956, "Connolly": 27825, "thirties": 30713, "1988": 1104, "1780": 3585, "petshoppe": 26595, "convenience": 14547, "Bhutan": 19526, "Reinstein's": 11472, "1525": 25438, "71": 1648, "face": 7679, "oaks": 12016, "coating": 26954, "kayak": 17246, "hottie": 27967, "cleaner": 15065, "lotus-flower": 31021, "awarding": 719, "VS": 27045, "http://www.goldentriangleindia.com/delhi/hotels-in-delhi.html": 27409, "prototype": 15036, "Scene": 25414, "fucked": 23906, "Quixote's": 30427, "Ace": 22820, "Card": 10323, "Jupiter": 25294, "tails": 2845, "Rural": 31492, "hardcore": 20297, "shotgun": 21579, "breathless": 32351, "murdered": 9699, "Design": 2224, "Paschal": 10132, "learner": 15210, "afterwards": 3447, "Liberty's": 27508, "Hirsohima": 18724, "Association": 551, "Generic": 15227, "stealthy": 31244, "Vichy": 5434, "uprising": 4038, "bedding": 26570, "dumping": 14647, "unusual": 1169, "Yampa": 28708, "enhancements": 8411, "Bonafide": 28380, "Suitable": 4219, "Passion": 12394, "stand-ins": 8174, "stacks": 9036, "architecture": 4481, "immovable": 30871, "becoming": 2996, "relinquished": 31894, "panga": 31930, "starve": 6693, "radiators": 9708, "egg": 6518, "Mesoamerica": 15298, "Arctic": 15496, "nationals": 19561, "glittering": 32544, "shaded": 32819, "Liverpool": 17574, "Muggles": 32046, "lusty": 31211, "Crosstab": 30072, "galleon": 9073, "Sabunji": 4546, "oils": 17901, "courteous": 24717, "Mia's": 29648, "purged": 15171, "187": 26102, "sneaked": 32350, "RECORD": 14296, "Battery": 32581, "overlooking": 15474, "ceasefire": 19017, "Refugees": 12997, "rumbling": 30462, "pests": 13494, "frequent": 3235, "ROOMATES": 11792, "Fe": 29313, "G": 1819, "Steichen": 13323, "Shih": 3354, "7037686710": 24765, "cleansing": 9773, "Urinary": 27066, "officially": 14578, "a.m.": 15732, "non-veg": 27289, "pay": 1383, "stating": 12737, "depicts": 14753, "Forties": 16262, "orbit": 4561, "LAMP": 11831, "reverence": 14377, "observes": 20458, "NVA": 27712, "Summer": 5581, "herding": 21587, "correspondent": 19250, "melting": 24608, "inaccurate": 10597, "Solheim": 19031, "cellfone": 24515, "mellow": 27656, "investigated": 321, "Bit": 29872, "PATH": 30204, "bareback": 26987, "Geographic": 2228, "regional": 2554, "cultures": 15287, "Steeped": 16263, "litely": 2279, "overt": 9620, "toss": 16114, "Polish": 4326, "Sesame": 6303, "Access": 16322, "http://www.collectinghistory.net/chernobyl/": 18699, "perceive": 1542, "Crab": 28431, "Dillards": 29035, "glamour's": 31052, "PO": 21820, "Midnight": 5504, "peach": 17893, "seekers": 12138, "Missouri": 17432, "Horatio": 25488, "HTC": 26692, "sixties": 13386, "Aka": 28628, "T.": 7537, "DINING": 29653, "Exile": 28954, "frigidity": 8490, "pre-fabricated": 24912, "Category": 24458, "04/30/2001": 22883, "snoozing": 7092, "Rail": 29199, "collaborate": 15050, "smoke": 7398, "opossums": 28033, "A&E": 29316, "AT": 24542, "Route": 17447, "staffed": 18912, "REsearch": 24158, "romaine": 27439, "____________________________________________________________": 22501, "445": 21209, "Highness": 30943, "Act": 7222, "Kusal": 28318, "undeniable": 28053, "Purchase": 21701, "Sikkim": 19176, "customarily": 14313, "Wahhabis": 18603, "sociable": 24880, "finals": 12577, "ACPeds": 1269, "desks": 13651, "nationalities": 11195, "CORRECT": 22338, "coup-d'etat": 30665, "gallery": 169, "homo": 28809, "acquiesce": 14974, "national": 5719, "continental": 107, "banquets": 31845, "Heating": 28457, "fraying": 8969, "chose": 10225, "nationalists": 18810, "trusted": 8146, "Karim": 4543, "responses": 1992, "belidve": 11984, "LC": 23527, "sensations": 25549, "Scary": 6758, "choppy": 8971, "Thunder": 13622, "Dental": 29212, "connected": 1118, "publicity": 10586, "paternal": 5437, "caption": 30216, "app": 16162, "buttons": 9354, "swayed": 9932, "1782": 3107, "rushed": 6007, "BETTER": 32482, "urging": 1481, "unemployable": 24274, "unfrightened": 32597, "individuals": 384, "gstrathmann@mediaone.net": 23839, "pity": 10901, "Earl": 4179, "repaired": 9594, "Related": 1957, "Lunch": 23222, "resources": 843, "rabid": 19305, "corrupt": 20370, "unclear": 2698, "!!!!!!!!!!!!!!": 28808, "Returning": 30719, "Transit": 17492, "chapter": 3773, "differing": 2042, "LETTER": 11510, "argument": 3853, "Kane": 6283, "20.doc": 21948, "stolen": 4847, "domestic": 12039, "revolutionary": 14464, "can’t": 8663, "Opened": 16344, "Blotts": 32341, "mezza": 29705, "exhibited": 13332, "VERY": 26227, "delegations": 31582, "constructive": 22872, "favourable": 23462, "Chevron": 24378, "clockwork": 26171, "mid": 21958, "Registry": 30198, "bankrupt": 20491, "exposing": 10290, "prayer": 5984, "mouth": 6834, "Anti-Fraud": 27036, "damaged": 9859, "dissent": 31536, ".": 68, "anemic": 26652, "anti-Luther": 6529, "vendor": 29318, "outlined": 4007, "Mason": 32070, "member": 5579, "stages": 15031, "hr": 16321, "Brave": 24737, "Qaeda": 18632, "shadow": 9193, "armored": 25765, "Acting": 14599, "Cocaine": 19403, "Technical": 22002, "endured": 14024, "Matthews": 15238, "airliners": 20636, "embarked": 14612, "application": 1670, "Cairo": 30674, "functionaries": 30708, "Restoration": 28427, "!!!.": 28687, "balance": 7262, "Treat": 29777, "brutal": 14269, "rout": 31250, "aggrieved": 32765, "Orwell's": 23953, "Computers": 24146, "cork": 26838, "TW": 22717, "translate": 14565, "Pedicures": 28291, "subtract": 6268, "ABOVE": 19485, "Argentine": 702, "OTC": 22516, "opinion": 3861, "hundredths": 15644, "mask": 15805, "viewed": 5238, "starfighter's": 9230, "Postal": 24972, "+++": 28350, "pressuring": 29865, "unhooked": 31706, "Christine": 31474, "Bredders": 27049, "components": 5636, "Youngblood": 30509, "Key": 12667, "Asi": 18522, "Montgomery@ENRON": 23790, "acting": 5538, "Tulsans": 17427, "vanished": 9963, "Toni": 21483, "developments": 3029, "detect": 11377, "Victory": 18067, "Crete": 25364, "Nancy": 14101, "feebly": 31178, "Idaho": 5848, "ISDAs": 22282, "kings": 26894, "LEAVE": 11858, "unprocessed": 20689, "sausages": 32213, "dot": 24644, "Whether": 1402, "kin": 12484, "wounds": 14417, "Imperial": 9209, "brim": 18133, "BLACKLINE": 21504, "regions": 2562, "grumble": 19856, "asks": 8865, "WD": 23411, "flourished": 25040, "publisher": 1407, "Veronique": 10058, "ABC's": 4084, "Guardsmen": 14317, "resided": 3446, "Plac": 16930, "tub": 9705, "dresses": 17380, "Dash": 31066, "rippled": 8993, "Anthony's": 22220, "commentaries": 2389, "thirst": 25837, "data": 419, "Sculpture": 3538, "laminated": 23221, "11.25": 31419, "Foolhardy": 12862, "doomed": 11231, "generals": 19112, "streams": 8119, "charms": 17542, "BooleanPolygonConstraint": 2342, "helpers": 7152, "susceptibility": 9588, "1995": 8248, "petroleum": 18939, "80's": 11781, "near": 4247, "Romelu": 13096, "barns": 26823, "disrupted": 30326, "Perold": 16213, "elongate": 17667, "Commission": 10853, "memos": 23676, "climbed": 30245, "ministry": 13977, "non-commercial": 10976, "?!": 22023, "chores": 18265, "evidenced": 2618, "en": 9629, "brochure": 21058, "Through": 3074, "affairs": 5296, "sandwiches": 11474, "prerequisite": 7834, "bottles": 12011, "Coco": 15909, "Wow": 6475, "venturing": 11402, "Presidency": 14306, "recourse": 18207, "crapfest": 23901, "Ted": 9569, "Senegal": 14489, "Tai": 1845, "Biologist": 10193, "sacristy": 19930, "pro-same": 24657, "Yousef": 20803, "Formica": 10199, "ashore": 30995, "campaigning": 16943, "Hainan": 24824, "#cognitivebias": 7659, "Terrestrial": 15588, "industrialized": 8053, "privatisation": 31547, "target": 8525, "Bohlin": 1579, "Fassbinder": 5514, "Salem": 12239, "Rulan": 3494, "Maximum": 5329, "handle": 7188, "underwrite": 19049, "statewide": 19841, "cooled": 22782, "Gibson": 22778, "Flooding": 24407, "lasts": 8820, "voices": 9008, "tendency": 15220, "bulrush": 32359, "Immanuel": 14897, "Resignation": 31404, "arrest": 3863, "crunched": 9658, "jitsu": 28544, "Mortons": 26563, "cuts": 24576, "hereby": 21688, "Scientology's": 12684, "socks": 9024, "ARCHIBALD": 19844, "MM": 21599, "whom": 3928, "Shimon": 11172, "suffering": 4729, "drain": 9732, "Seals": 17228, "Shag": 11975, "install": 13953, "Bases": 2234, "It’s": 7709, "floods": 13491, "habits": 14851, "signaled": 4679, "purchace": 29371, "bench": 8710, "35620": 23212, "participate": 21356, "strongest": 8518, "dehydrated": 27228, "Continually": 15284, "premised": 7312, "sate": 27874, "horses": 6354, "Measures": 15628, "gardneri": 27889, "tone": 13619, "Keeney": 23768, "refinery": 23417, "NBC": 10882, "peninsula": 14286, "muff": 27147, "insecure": 904, "hackneyed": 11139, "frontline": 9241, "Hughes": 19426, "owes": 18794, "zealous": 17633, "g0v": 13931, "counterparty": 22068, "supporting": 2820, "well-formed": 30129, "adding": 10301, "targetting": 18609, "unity": 14341, "Chateaux": 16663, "nissan": 28852, "lists": 490, "Bus": 16531, "sinuses": 15818, "recommendation": 22927, "Congrats": 21653, "Jeep": 29800, "GOOD": 27081, "icecreams": 11482, "typically": 857, "dragon's": 17187, "twin": 18962, "ambassadors": 16850, "teachers": 1526, "m": 2680, "Abbas": 16752, "melodramatic": 27650, "Suppose": 15183, "verify": 21713, "recite": 11054, "wanting": 6184, "discovers": 14017, "airport": 16457, "Caraibes": 16691, "Limited": 21667, "place": 748, "attend": 5723, "reveal": 8378, "defeat": 12450, "December": 3596, "Bench": 31759, "airing": 32818, "Judges": 24263, "afford": 6985, "Lao": 1844, "Información": 17010, "cod": 25162, "yeah": 6232, "capita": 11669, "phenotypic": 2911, "ontogeny": 2731, "Ackles": 5787, "Jonesy": 13616, "Moral": 15139, "Lancashire": 5428, "15th": 1043, "insulation": 23942, "imaginations": 15613, "Mahal": 29023, "signing": 11025, "realises": 19318, "Hunger": 24873, "huit": 6322, "diners": 16626, "quickest": 17559, "Diana": 6510, "cross-legged": 30910, "fixeded": 28352, "Protocol": 23843, "actively": 2405, "Elliotts": 22264, "Consumers'": 23884, "underlip": 30543, "ingesting": 10294, "proliferated": 18913, "swollen": 6307, "Yea": 22787, "Travelers": 26494, "cat's": 24850, "presume": 7139, "Kenyan": 14536, "Depot": 20966, "complex": 57, "Kilinochchi": 19025, "elderly": 31841, "hoods": 29455, "Growing": 4709, "Occasionally": 30339, "Iraq": 4517, "charge": 5994, "medical": 7301, "Hut": 15988, "Courtesy": 29596, "caffeine": 15764, "Kerry's": 19759, "Théâtre": 5462, "bade": 9424, "taking": 1258, "Californians": 23710, "eaters": 8147, "segueway": 23919, "flinched": 30718, "flames": 31034, "recruits": 20870, "adventurous": 17139, "11:48": 22385, "Kurdish": 19292, "eligible": 16469, "Lingard": 13128, "Hebrew": 5163, "extremes": 32379, "coat": 10143, "fresh": 8040, "newspaper": 3973, "couple": 3406, "11/2": 22406, "Op": 8227, "Services": 19567, "Hai": 22316, "Crosse": 28092, "winked": 9890, "influencing": 19045, "ward": 9603, "convinced": 3988, "formalin": 10617, "external": 2797, "Communion": 5007, "neighbours’": 19748, "VIC": 22239, "obscurity": 25551, "http://www.nsrl.ttu.edu/chernobyl/wildlifepreserve.htm": 18695, "magnificent": 11470, "cake-like": 32754, "praises": 20075, "kindness": 27124, "Schott": 22990, "Oxley": 21046, "SRD": 28086, "opossum": 17808, "unpacking": 8382, "http://www.compaq.com/products/notebooks/index.html": 21779, "Braverman": 12954, "ECT": 21693, "gloated": 30596, "Jāmé": 16810, "Walnut": 29959, "stones": 8884, "fireplaces": 8571, "f*ed": 19307, "bipedal": 2759, "17,000": 7957, "ratio": 18427, "July": 3851, "Caffasso’s": 16592, "Mecca's": 12253, "Bureau": 16387, "complaint": 1524, "1849": 4437, "evaporate": 17749, "Counter-Strike": 12581, "burrows": 10627, "PMA": 28885, "peacekeeping": 18984, "brooded": 9957, "biggest": 5490, "gud": 26212, "insular": 13655, "Albanian": 13858, "WMD": 20795, "Sensor": 2654, "Horsiesios": 5993, "Palmer@ENRON": 23864, "boston": 7667, "disrespect": 17399, "reassignment": 1292, "faceless": 30253, "Arbery": 14142, "ta": 6043, "reckon": 32172, "sale": 21174, "1000.00": 24916, "whitish": 27841, "demonstrate": 2037, "poisons": 32258, "humus": 8912, "wow": 6448, "1796": 7941, "windsheild": 28915, "Progressive": 16427, "endowments": 11670, "Taxi": 16565, "raises": 15198, "Westerners": 17351, "detectives": 19450, "rep": 22539, "friendlier": 27802, "page": 5647, "368": 5907, "CONSIDER": 11932, "Prod": 21658, "!?!": 28903, "utensil": 18057, "STUDYING": 11843, "murders": 19971, "converting": 22687, "Committee's": 24476, "lecturing": 30594, "eve.": 23067, "gains": 745, "Afghan": 12055, "Meiko": 26508, "formalism": 14923, "Su": 17023, "Poseidon": 13516, "senses": 3466, "fleets": 30953, "follow": 5943, "Cruse": 3774, "weakened": 11560, "We’re": 15989, "robber": 24139, "11:26": 21963, "14,000": 20641, "drivel": 30480, "praying": 30585, "loyal": 25752, "83N": 21118, "Kid": 7095, "arrived": 3550, "parasite": 10208, "sweat": 24845, "Algarve": 27528, "Compson": 30716, "John's": 21084, "Sr.": 20952, "16:29": 22580, "smallest": 3698, "Chapman's": 13632, "Finest": 11100, "Odara's": 31947, "negotiator": 19026, "capture": 2299, "servers": 29284, "wives": 20037, "Background": 10497, "ranging": 7886, "alcohol": 13534, "12/22/2000": 23262, "riso": 28814, "3:00": 21761, "trust": 1249, "Freemason": 25528, "ventilated": 26282, "Wed": 11767, "Peekaboo": 12639, "tonight": 7022, "swaps": 22055, "Jerusalem's": 11252, "EAST": 23433, "Mr": 12669, "reopen": 19953, "someone": 1771, "unstirred": 32872, "contacting": 7651, "HURRAH": 32006, "staves": 31283, "Gillette": 15996, "receipts": 31537, "572": 19533, "longed": 9440, "paw": 9487, "1991": 992, "atmospheric": 2638, "Saudi": 12258, "eradicate": 32713, "fluently": 3370, "ʒan": 5361, "closer": 8058, "Round": 20933, "Beginner’s": 8329, "Taulbee": 558, "Tuesday's": 21010, "moto": 27562, "half": 712, "Holley": 14706, "wished": 4640, "landowners": 7962, "Varanasi": 27397, "Contra": 19385, "rattling": 19152, "semi": 15863, "steers": 21856, "downloads": 11363, "all-night": 31866, "transmedia": 2934, "frequency": 2611, "waitstaff": 29999, "sexing": 27850, "Wenatchee": 28999, "watt": 26897, "stillness": 31232, "Ed": 11741, "DAKOTA": 11499, "soap": 9723, "rhythm": 24103, "Pinto": 22295, "living-room": 31618, "scones": 32452, "herpes": 28620, "1590": 25363, "work": 127, "H-0045/99": 31482, "affiliate": 4868, "accumulating": 20263, "mollified": 18893, "Oregon": 25047, "Hobbes": 25379, "darkroom": 26534, "bday": 26899, "muslin": 18451, "Nile": 28040, "Vehicle": 24002, "subdivide": 8133, "Gates": 17110, "compeltly": 28661, "Reserves": 16325, "equitable": 14484, "Blizzard": 24232, "sprinkle": 17738, "intermarrying": 20045, "red": 4697, "Bos": 10194, "chewing": 6914, "Axel": 13121, "magnitude": 24385, "Prime": 12170, "BUFFALO": 29687, "crew-cut": 31964, "You’ve": 9764, "tks": 23258, "geese": 30553, "twenty-four": 31077, "60.23": 1693, "Carroll's": 9830, "affinity": 19111, "trousers": 19826, "sites": 10275, "salary": 20957, "Rutgers": 29464, "Mike": 11737, "goggled": 32131, "MAKE": 24909, "countryside": 15605, "entertaining": 7347, "grizzly": 15975, "Wisteria": 25563, "threadbare": 32898, "arranging": 20004, "Thurber": 32608, "114,950": 15674, "Man": 4137, "realisation": 14501, "Paradises": 16838, "34.6": 26056, "boils": 7177, "DOOR": 24543, "alt.animals.cat": 24831, "Volume": 10939, "heightened": 14234, "audio": 10953, "peaks": 25315, "windy": 15995, "criticized": 10561, "surround": 7858, "relating": 2454, "beneath": 9474, "crazed": 10167, "doubling": 26531, "WELL": 11870, "rank": 3562, "none": 8167, "devastating": 19808, "report": 139, "mostly": 7857, "??????": 21005, "collusion": 23689, "Bonaire": 12806, "read": 6522, "verde": 29158, "lithos": 21163, "visibility": 10857, "grains": 18356, "exert": 30375, "trays": 30587, "grows": 12920, "Anasazi": 15418, "dividends": 7877, "chunked": 11973, "deathly": 20125, "ck": 21904, "unimportant": 11201, "simulation": 22895, "seasonings": 18409, "Comments": 22472, "RSS": 7794, "benefit": 665, "McGovern": 7844, "veined": 9150, "channel's": 26620, "employees": 7144, "coined": 10481, "scroll": 24990, "exacerbated": 19368, "stifled": 19402, "state’s": 7897, "AllowDeletions": 30220, "initiatives": 13916, "gushing": 18005, "renegotiate": 11563, "Walk": 17270, "Legislation": 11552, "Joyce's": 30634, "Instructions": 19488, "puppets": 2014, "cousins": 8194, "dancers": 24092, "Mexicana": 22260, "optimal": 1879, "1,922,000": 23471, "cherished": 14049, "wasting": 7122, "downsizing": 23980, "dependency": 25247, "crepe": 28768, "648": 25346, "thriving": 17077, "expire": 16037, "Fischer": 21135, "causal": 7374, "quarry": 31221, "2006": 1014, "76": 13180, "attic": 8737, "unexplored": 2914, "wasn’t": 8951, "packaging": 16048, "fills": 6264, "retraction": 2750, "confrontation": 12823, "Autobiography": 3383, "councillor": 12486, "magical": 13415, "rusty": 31176, "entrails": 31253, "Kolonaki": 32936, "ensconced": 30310, "U": 26784, "http://www.ontario.ca/en/information_bundle/birthcertificates/119275.html": 27474, "permissions": 13722, "vigorously": 18448, "trustee's": 23831, "Jemison": 22671, "v": 24318, "moonlit": 32008, "plates": 16138, "censuses": 689, "approximately": 3065, "Jerry": 4912, "BATCH": 29694, "rational": 6616, "TAKE": 11890, "ozs": 22272, "vindication": 14407, "mineral": 8890, "IMPOSSIBLE": 26487, "astrophysics": 11343, "Boil": 22529, "glue": 26832, "drinking": 6716, "713-546-5000": 23836, "8.25": 28537, "particularly": 424, "defend": 24138, "promotional": 1341, "winter": 5131, "reconfirm": 21432, "impenetrable": 25550, "common": 1207, "F%#king": 29190, "punishment": 12218, "Hamster": 26415, "ANYONE": 20313, "180": 4810, "mike": 21178, "Subject": 21919, "conservatory": 5451, "12/14/2000": 22723, "M18": 17563, "CLH": 22197, "E.g": 26512, "eater": 24333, "Wikipedia": 10762, "participatory": 15494, "Miharris": 13270, "Finishing": 18261, "Tradition": 20283, "LET": 29144, "Pour": 17883, "Singmaster": 24316, "ElPaso": 21464, "1943": 5595, "#proposal": 7828, "Hospitals": 26646, "round": 4858, "analgesic": 32780, "wobblers": 28008, "function": 1448, "IOTM": 11308, "unemployment": 7210, "changing": 542, "978-376-9004": 23858, "deplorable": 30738, "prune": 17759, "Movimento": 13200, "projected": 8079, "hobbies": 17986, "Executive": 12236, "gf": 27169, "fateful": 14047, "Exp.doc": 22906, "Allegheny": 17470, "sieze": 20264, "miraculous": 14635, "eighth": 5192, "Results": 12378, "bruises": 25601, "OVERVIEW": 21050, "Interviews": 23368, "SETI": 11305, "reputation": 3521, ".....................": 28536, "residents": 16380, "mildly": 10585, "Libra": 25291, "crises": 14253, "Olmec": 15337, "12/21/2000": 23273, "Blimey": 32220, "Guidelines": 14533, "arterial": 17580, "tyrants": 24678, "injurious": 25930, "Pico": 6563, "grease": 28390, "burial": 16680, "sugared": 32111, "pretended": 10075, "Geertz": 14825, "uk": 26113, "Pho": 27557, "intelligent": 15615, "award": 4478, "clay": 7767, "fuss": 20394, "89": 4566, "Nidd": 28476, "832.676.3177": 21459, "BALLROOM": 29258, "house": 1491, "vibrating": 3271, "compass": 17490, "driver`s": 21251, "ends": 3858, "chaser": 18302, "turnout": 12363, "ROCKERS": 22952, "mussels": 28582, "Peggy": 21725, "anatomy": 3198, "Jeopardy": 13620, "Despite": 407, "wintertime": 15906, "baths": 9756, "713-793-1429": 23628, "Brampton": 12603, "Solent": 12960, "unrelated": 1784, "shouldn't": 7400, "2539": 22447, "thievery": 24939, "starfighters": 9253, "railway": 26446, "grudging": 30856, "Bonino": 31411, "evasion": 31507, "easy": 810, "Asia": 5122, "er": 20116, "athwart": 31156, "2001": 17519, "façades": 16952, "sniffed": 19065, "will": 161, "26": 1413, "millionth": 11386, "Warsaw": 16873, "http://www.sploid.com/news/2006/05/evil_priest_gui.php": 20087, "cross-section": 12620, "Boyles": 29894, "inhabits": 8304, "Joking": 27654, "idiot": 6731, "comprehend": 28024, "agility": 7199, "sword": 10180, "summertime": 17055, "Realtime": 7782, "Zacarias": 20581, "One": 517, "McGowan": 23372, "coordinated": 22784, "Temple": 3943, "rioted": 31251, "Okinawa": 26929, "finery": 9101, "deflated": 18295, "Mantar": 27421, "Indemnity": 3346, "sodomise": 32707, "Angeliki": 32892, "collasped": 13185, "Jkthom": 13287, "Solid": 6228, "punchline": 30456, "enveloping": 30980, "Lamb": 10133, "Tanabe": 4624, "awaiting": 3184, "Philipe": 5465, "Basalt": 16310, "Kinkade": 5816, "Islamiya": 20832, "SUSHI": 28784, "despotism": 25683, "Accidentally": 15187, "splendour": 16800, "clad": 9309, "behaviours": 168, "outdoors": 12029, "each": 353, "Stronger": 24012, "ignored": 14678, "ext.": 22170, "fineally": 27085, "hate": 9363, "mourning": 25652, "unveiled": 5292, "vent": 27788, "Sun": 5847, "descended": 4271, "Sonia": 7525, "Pearl": 17460, "apprised": 22859, "AutoFilter": 30151, "functional": 2784, "opening": 6832, "lanes": 10445, "Zaha": 4460, "fitting": 1800, "5:00": 21764, "Guild": 24226, "fiscal": 24471, "finalists": 12221, "intercept": 19236, "6.3": 23478, "quizzing": 20169, "running": 5804, "0": 4957, "11th": 17059, "listlessness": 27071, "organic": 8233, "advances": 663, "district": 4698, "orientations": 5681, "miles": 6071, "accident": 1727, "Olsens": 5767, "weekends": 7746, "duck": 11759, "Heels": 17282, "Scottsdale": 17043, "incomes": 11611, "BAFTA": 5370, "approaches": 1624, "Verde": 17057, "surveillance": 20603, "luncheon": 23213, "crucify": 25635, "Auerbach": 30777, "destabilize": 14656, "default": 2007, "cost": 6109, "gel-": 6437, "partners'": 8515, "CPCG": 22136, "Group": 12602, "Web": 615, "Blocks": 23398, "characteristic": 15092, "CDEC": 22708, "banquet": 3964, "demagogues": 14198, "Hudson": 16515, "12/27": 23265, "pretzel": 19794, "intercourse": 25668, "changeable": 27826, "Console": 28345, "outage": 22363, "unwanted": 18461, "cite": 1482, "armaments": 25759, "processional": 31719, "07:48:44": 23249, "banked-over": 31637, "bathtub": 9722, "SEQUENCE": 29260, "perfumed": 31711, "’m": 7729, "percentages": 23744, "whether": 317, "premise": 2535, "Discipline": 15055, "202-828-3372": 22829, "Stretch": 17664, "youth": 5957, "departure": 16449, "receipt": 13027, "Whore": 20209, "cravings": 29511, "virtues": 5934, "featuring": 5882, "elegant": 16961, "Managing": 29304, "beer": 10971, "polytheistic": 15310, "resentful": 8739, "APPROVAL": 23028, "Revenues": 23602, "speaker": 1818, "Baker": 2434, "preparing": 9809, "pedicures": 29322, "admirers": 4747, "Fake": 5281, "Rina": 23440, "soo": 26793, "adjusted": 22322, "gals": 10706, "Alternative": 18203, "WHDH": 18828, "ENJOYS": 28570, "non-smokers": 29104, "put-on": 32625, "Exhibit": 13434, "Name": 16879, "relocate": 17080, "Hitwise": 12752, "guerrillas": 18500, "approving": 31493, "verbs": 1167, "multiplying": 2696, "transporting": 8150, "Prologue": 9203, "steadfast": 15051, "Milan": 13190, "That": 5225, "Fireflies": 9575, "fog": 12908, "Hussein's": 18935, "Empty": 30131, "Lloyd": 22394, "Update": 29793, "Shin-Wook": 13067, "Desert": 5146, "Wentzes": 31991, "Chapman": 13626, "shots": 13348, "Dress": 17348, "http://www.irisdatabase.org": 2411, "T2i": 26397, "created": 4403, "trim": 6353, "Harry": 3000, "412": 17440, "pls": 22746, "alt.animals.ethics.vegetarian": 24832, "Meanwhile": 19921, "That's": 6358, "Frame": 3718, "Vice-President": 31405, "answer": 2008, "ham": 8590, "hunter": 17329, "murals": 16855, "accusations": 1486, "e-visit": 15811, "disband": 14744, "GRILL": 28792, "triage": 28854, "repugnant": 7466, "Strobe": 19105, "drunken": 29451, "98.7": 15815, "Elena": 5603, "gem": 28631, "Da": 19196, "stylers": 15927, "anti-Semitism": 30745, "editors": 4633, "rarefied": 10022, "Corbyn": 13741, "Be": 10056, "wording": 21200, "moderator": 24329, "Olbina": 28256, "!!!!!!!!!!!!!!!!!!": 29142, "Dixam": 17166, "calculate": 15640, "culture": 324, "hormonal": 15706, "stirred": 8412, "whatnot": 26463, "Dursleys": 32027, "nightdress": 32218, "Longer": 2832, "Baathist": 18512, "declined": 13500, "jolt": 32769, "Peels": 26342, "chocked": 16044, "burned": 15414, "Eye": 9, "glaces": 11480, "draping": 8791, "Kamaow": 18080, "Naturalis": 3261, "Persian": 16724, "sociodemographic": 8510, "Archipelago": 17203, "infringing": 7493, "eReader": 26690, "selectiveness": 1748, "fandom": 2979, "Meiring's": 19363, "jargon": 10244, "wooing": 18003, "Lind's": 30740, "fulfilment": 13853, "adjoining": 19931, "Ogden": 26911, "LIBERTY": 22953, "rosario.gonzales@compaq.com": 22153, "lengthening": 30493, "caster": 17860, "unheeding": 9934, "13339": 20275, "inevitable": 11234, "photographed": 26001, "Protestants": 27183, "placement": 534, "315-460-3349": 22307, "roadshows": 12648, "189": 13274, "dragon": 26355, "crown": 9479, "AWESOME": 28970, "grips": 8272, "canvas": 7250, "Dame": 4462, "38.": 14901, "communist": 24795, "chauvinisms": 25686, "drastic": 30367, "deteriorate": 8482, "developer": 22640, "retail": 16506, "modes": 26621, "harshest": 19910, "sheltered": 16338, "long": 286, "Worse": 18930, "settings": 11696, "masters": 8321, "reasonably": 1426, "Support": 14095, "e": 16731, "Troubled": 4735, "Albania's": 13869, "outrages": 18784, "HISTORY": 11924, "Fairy": 9923, "vapor": 27746, "badge": 3597, "serves": 1940, "footage": 9246, "Seriously": 30015, "scandals": 20260, "unemployed": 5266, "ornament": 28014, "sappy": 18000, "Operating": 10684, "spayed": 27058, "healing": 10189, "04": 18875, "unfreeze": 22552, "kernel": 30979, "cockpit": 9236, "LOCATION": 24019, "righ-": 6813, "Boothbay": 28376, "anti-Americanism": 19701, "BEER": 10102, "Eunice": 12442, "reigning": 19671, "dealership": 28697, "dialogical": 7290, "1983": 1007, "dismal": 10030, "-Stip": 21505, "co-parenting": 7699, "stouter": 2813, "month": 7702, "phillies": 29128, "sat": 6699, "condemnation": 17648, "stated": 5248, "demanding": 6003, "human": 1513, "Northwest": 18761, "KNEW": 28901, "liturgy": 32724, "rockjumbled": 30618, "Polmar": 4159, "amidst": 9426, "parliamentary": 13908, "effort": 3387, "Greenwalt": 28049, "Libya": 12124, "yourself": 5070, "tease": 8452, "integrate": 15002, "tonight's": 32110, "irritable": 31270, "Mom": 6429, "Starting": 17699, "bored": 26434, "subduing": 27731, "g-": 6229, "girlfriends": 32813, "symbolism": 20857, "disconnected": 26523, "Madhlum": 19333, "Australian": 4135, "feather": 26859, "Italy": 10352, "Affair": 10935, "grateful": 14146, "armadilla": 11977, "People’s": 14287, "scramble": 23726, "black-red": 31641, "tasteful": 16351, "considerations": 14402, "modernity": 11191, "Darunta": 20869, "decline": 8195, "00:20": 23465, "Rohingya": 12156, "02:18": 22125, "pre-war": 20532, "Those": 860, "internationally": 5491, "Gaul": 5103, "CENTER": 29943, "tempest": 14068, "Spinal": 24078, "academic": 525, "Angel": 12547, "Denial": 24684, "Savannah": 3576, "Grail": 32584, "Need": 18288, "bleach": 32506, "1918": 3360, "p.m": 21680, "Wajiha": 4545, "plat": 17489, "mingle": 28980, "technically": 13806, "Estimates": 11521, "CP": 22212, "upsizing": 30043, "boss": 24732, "Bantu": 1946, "MOVING": 28400, "adult": 1907, "confer.": 11729, "receptive": 10879, "AllowEdits": 30221, "Jungwook": 7548, "System32": 30202, "stunning": 14607, "ROOMING": 11913, "begin": 670, "Enough": 26881, "editing": 10832, "47th": 17481, "traced": 20194, "minority": 12158, "peeing": 27061, "blowout": 29732, "104": 22939, "ethnic": 362, "anyways": 6812, "mouthful": 31770, "custody": 19347, "grouped": 2131, "Or": 6259, "Analysts": 22837, "Grow": 17697, "inquired": 23171, "hesitant": 10813, "ridiculized": 25632, "carless": 29088, "province": 3343, "clamoring": 11958, "Byron": 19249, "wang": 26721, "scientist": 6841, "Chalcis": 5155, "Lab": 955, "wa": 21172, "Satanism": 25692, "IoT": 13937, "Ryan": 4861, "Philly": 26696, "Alta": 28833, "Santorum’s": 10567, "white": 6374, "accounts": 7300, "only": 104, "marbled": 8916, "Development": 13888, "appreciable": 31379, "80,000": 7933, "U.K": 22512, "Gay": 27371, "celebration": 3667, "breezes": 16992, "info@smakkecenter.dk": 17262, "outnumber": 24722, "Maritain": 30744, "Gen.": 18746, "hams": 32424, "northeast": 7342, "scoop": 18455, "flew": 19189, "Sony": 24202, "top-of-the-range": 32041, "Rangott": 19543, "Gabriel": 3921, "didn’t": 8425, "curving": 15578, "Jules": 5409, "slimy": 28444, "HOT": 28734, "eligibility": 23217, "Utility": 23883, "Economist": 26099, "Italiano": 28842, "costumed": 12626, "foe": 25861, "bothered": 11076, "repetition": 1822, "1962": 5411, "Bechtolsheim": 24208, "underwater": 32433, "Medium": 14510, "tumor": 20529, "wore": 25672, "Additionally": 393, "functionally": 20227, "Localist": 12493, "blue": 8886, "inscription": 4421, "causation": 7370, "Honor": 7499, "Herald": 12650, "wholly": 14006, "Diagon": 16090, "http://www.world-nuclear.org/info/chernobyl/inf07.htm": 18709, "trusty": 19155, "yoke": 27897, "taint": 31287, "ominous": 18857, "FAX": 24352, "companions": 5127, "likewise": 18800, "Volaris": 17118, "rolled": 7164, "Ka-ki": 12397, "ratchet": 18790, "microphone": 8672, "counterparty's": 23053, "zouk": 16704, "Rebellion": 21878, "sodium": 18039, "reviews": 1194, "authorised": 31551, "multimillions": 20034, "environment-friendly": 31350, "stripes": 27789, "procure": 21734, "settled": 5104, "wal": 29550, "indefinitely": 19162, "caching": 8025, "Brittan": 31496, "Alondra": 14600, "stationery": 4689, "Meiring": 19360, "Karaite": 30628, "humankind": 10187, "critters": 25072, "With": 1528, "terraces": 32876, "bazaar": 16777, "economists": 11598, "angles": 2627, "cookie": 8800, "Watch": 15068, "Festival": 5365, "Whosoever": 6637, "primary": 5668, "SELECT": 30179, "Mazirat": 5439, "dramatization": 7478, "Lie": 19764, "rope": 9090, "Abu": 18618, "Leibman@ENRON": 22399, "groom": 26984, "Andes": 15300, "claim": 1776, "sprouts": 17740, "Indo": 18978, "embassies": 27121, "Repsitun": 27750, "spiked": 32244, "tug": 7694, "CRUEL": 29916, "slopes": 30749, "Biden": 14168, "Five": 6305, "girdle": 8681, "8th": 19418, "Map": 16656, "Astr": 23611, "undersized": 25876, "repeal": 18770, "Anaheim": 4924, "Said": 20438, "recreated": 2895, "Thinking": 5235, "honest": 14448, "scholarship": 287, "multi-national": 20351, "simultaneous": 25988, "13389": 20277, "Flight": 5770, "pepper": 15842, "Centre": 4449, "scissors": 27578, "bee-keeping": 31389, "architect": 3616, "LOTS": 26852, "bandwidth": 24227, "Four": 947, "anachronistic": 13591, "receive": 2334, "spreading": 13781, "Conversations": 15729, "herbs": 15934, "publishes": 18970, "ninth": 4857, "newsletter": 21313, "2.1.": 704, "Buck": 19398, "Charity": 21315, "you’ll": 11220, "warrants": 29716, "Quickly": 5948, "06/01/2001": 23553, "roughhousing": 8873, "brighter": 9993, "limbs": 2833, "Macaulay": 10937, "reactor": 18660, "quasi": 12836, "similar": 1804, "number": 839, "calico": 27057, "tape": 6980, "sourcing": 8142, "milling": 12931, "Museum": 4497, "Navigator": 27937, "tightly": 18064, "Presented": 2245, "Council": 12108, "Enver": 13046, "polygamous": 19980, "17547490": 15246, "Endo": 29080, "revved": 32141, "partially": 2885, "trends": 543, "Tom": 5750, "match": 1095, "itinerary": 6236, "delight": 9157, "forwarded": 22203, "Roosters": 27285, "abused": 19322, "resembles": 2884, "Faretta": 2525, "deemed": 2542, "Place": 17479, "Detailed": 31528, "churchy": 29117, "Chennai": 28066, "uninsured": 24276, "cosmetics": 16009, "overflowed": 8930, "succinctly": 19082, "^_^": 26580, "220a": 23101, "morale": 23938, "Procrastinating": 18247, "Pests": 32226, "Residual": 24001, "sandbags": 24411, "ranch": 26093, "Medina": 31371, "evidently": 32905, "unfunny": 11165, "7/26/08": 29647, "--": 7231, "Co": 8226, "spaciously": 27923, "during": 2280, "subsequently": 5732, "Devraj": 18991, "plywood": 26840, "giving": 981, "reflects": 929, "urethra": 24065, "recent": 1476, "bug": 15071, "sculpture": 15342, "strangers": 18103, "skies": 26190, "earthworms": 27054, "invincible": 31294, "Theory": 14987, "just": 624, "Lora": 22816, "ill": 4695, "Landscape": 12516, "deserve": 7096, "considering": 2826, "clashing": 31832, "Wong": 12475, "tremor": 31774, "Croft": 3775, "eastgardens": 28214, "Pen": 23370, "experimenter": 10310, "Climb": 26937, "breathing": 10013, "Pewter": 27303, "unprepossessingly": 32711, "key": 291, "Hundreds": 9294, "Preserves": 23291, "fallibility": 19493, "caked": 9139, ".odc": 30053, "46093": 21722, "PEOPLE": 11512, "ability": 1541, "Mezza": 29702, "embassy": 16461, "encouragingly": 32206, "authoritative": 18650, "preorder": 24233, "kinds": 1215, "Annual": 23482, "re-schedule": 28266, "unsteady": 27572, "Graham": 15451, "localist": 12388, "hookers": 26132, "27": 2145, "deffly": 29707, "puzzles": 10153, "flotsam": 30347, "input": 17623, "peasants": 14076, "SLFMR": 2612, "threshold": 2679, "unthinking": 13038, "foreign": 9124, "stretch": 6880, "dimension": 15569, "uploaded": 24861, "CONCLUSION": 15195, "BRETT": 28569, "Title": 9856, "contouring": 32650, "TALK": 28758, "Brawler": 29349, "constitutional": 7309, "Akin": 21392, "intifada": 18888, "allege": 23672, "Associated": 10541, "A/73/PV.6": 14203, "Born": 3338, "clerks": 31100, "cabbages": 32301, "titts": 26735, "Toll": 14457, "Picasa": 26626, "labeled": 2511, "grave": 4018, "send": 7021, "Les": 5482, "4434": 22409, "bays": 16649, "licking": 8952, "wounding": 12256, "pedestrian": 17428, "Psalms": 5113, "customize": 27231, "engines": 10551, "Major": 3554, "sulfate": 18043, "Amiriya": 19300, "stipend": 7959, "intentions": 15462, "preferable": 17357, "bless": 24523, "Can’t": 8633, "real": 1972, "Aryan": 20009, "restrain": 19689, "10,694": 12508, "irritation": 27609, "unambiguously": 7430, "translating": 5650, "manoeuvring": 31417, "unstable": 935, "scraps": 27280, "diapers": 26284, "BALLET": 29263, "Panjsheri": 19724, "sub": 28712, "CRY": 28402, "similarities": 1778, "hierarchies": 25706, "fire's": 7368, "ODIHR": 13913, "America’s": 7997, "motorist": 15603, "UEComm": 22215, "sets": 1517, "Get-A-Free-House.com": 19490, "enthusiasm": 14479, "curb": 18129, "Match": 4105, "sit": 6678, "grandparents": 29374, "Explain": 14993, "Pew": 25124, "Quilis’": 1195, "polygons": 2360, "#langu": 7663, "skeleton": 6369, "pals": 27636, "masterpieces": 16799, "coupons": 6972, "October": 3577, "scope": 10470, "Heil": 2530, "alphabetical": 17467, "fitters": 23161, "thigh": 27587, "basalt": 9478, "bowel": 29003, "Comets": 22938, "pixels": 26236, "Anacapa": 7183, "scribbles": 31645, "Leo": 25276, "duration": 11667, "ENW_GCP": 22997, "barrel": 16228, "worship": 13382, "Gem": 28284, "Junlong": 24788, "breathed": 5089, "CHINESE": 28453, "Valencia": 27523, "Forbes": 8465, "receives": 17410, "MEPs": 31384, "seemingly": 19958, "Mesoamerica’s": 15381, "Belize": 15384, "grueling": 25758, "curled": 9641, "pathogens": 26028, "remainder": 3588, "folded": 9817, "children's": 3500, "almanac": 17723, "HOW": 19479, "Earthworms": 8937, "who've": 17783, "conventions": 13776, "Deep": 19838, "tickled": 6802, "Xu": 14873, "Jihad's": 20631, "dears": 26251, "Kinect": 26780, "house-elves": 32171, "No.": 3638, "flaring": 32262, "anti-Pyongyang": 12871, "streaming": 9844, "posthumously": 4503, "Islamism": 18867, "Ames": 20655, "portal": 16819, "Brickell": 29040, "Ashley": 5760, "Leicester": 25431, "prototypes": 14992, "Antwerp": 3137, "D:": 26298, "Chewing": 6916, "plotted": 15612, "Claire": 12, "Snitch": 18332, "Bandera": 29909, "Svendborg": 17237, "Alaskan": 25145, "UCAN": 23880, "meadowlarks": 25187, "Feather": 27137, "Chandeliers": 28422, "Sagittarius": 25301, "glow": 10612, "Joe's": 29201, "Aha": 32485, "ghostly": 25695, "scorpion": 17942, "Releases": 21502, "pastry": 32884, "non-Indians": 19633, "Kirk": 6730, "reappropriation": 20207, "Club": 3050, "potentially": 13487, "irreconcilable": 23956, "sadly": 1410, "stipulation": 13316, "Hansen@ENRON": 22160, "saem_aero": 24499, "Patent": 22158, "farcical": 28640, "patients": 3298, "validity": 679, "16,900": 21842, "12/28": 23266, "nap": 18279, "constituencies": 12369, "senate": 19798, "Chimes": 5503, "flip": 9351, "reconfigured": 15105, "nails": 9812, "organization’s": 1295, "IS": 11844, "vial": 13592, "Evolutionary": 15193, "blogs": 13637, "lofts": 16869, "sufficiently": 3854, "Shanna": 23144, "dishonors": 24693, "embracing": 15514, "pot": 6208, "circumference": 12923, "amendment": 22536, "lifting": 23698, "napkins": 28616, "Tunisia's": 13131, "suggest": 1530, "blanket": 9195, "Starr": 28959, "overflowing": 24401, "sorting": 30225, "Tindi": 31858, "STOA": 31374, "give": 1125, "handles": 11348, "slinking": 9492, "dealt": 12336, "Missile": 11994, "grinder": 29558, "incompletely": 27158, "trillion": 14657, "dial": 9937, "day’s": 7749, "seventeenth": 31974, "bleak": 8034, "collapsed": 10400, "Nothing": 4567, "Causes": 14770, "Ojala": 31338, "general": 896, "shift": 2756, "aphids": 10235, "Smutney": 23713, "Petitions": 31390, "+4533330040": 17298, "Larbalestier": 9921, "isn’t": 7891, "filled": 9306, "ICDC": 18578, "racial": 363, "necessarily": 6618, "notice": 7587, "l'": 5527, "Bert": 11410, "PAL": 26314, "pelvic": 2865, "TEST": 23030, "menacing": 9320, "Linda": 18736, "muse": 7731, "lapped": 8973, "perched": 32192, "Grocery": 29301, "cable": 10887, "ammount": 29241, "marvelled": 16398, "Put": 9690, "cheaply": 18145, "unproven": 15088, "well-to-do": 32659, "paid": 5215, "Adelphi": 29771, "office": 6130, "benedict": 28831, "Herrick": 10746, "anemone's": 10681, "besoin": 4054, "presently": 11554, "Gai-Hinnom": 30624, "Boris": 12987, "savagery": 31012, "Everything": 9515, "flies": 16279, "Googol": 24160, "recitals": 31452, "shedload": 13711, "cosmetic": 18502, "founds": 7267, "comp.": 11726, "swings": 8838, "Lan": 26517, "chicken": 6970, "reconcilable": 6580, "col": 27202, "space": 1092, "encouragement": 27437, "muzzles": 31123, "Boulder": 24998, "faint": 9687, "Nineteen": 32274, "conciliatory": 19101, "inflate": 1461, "robotic": 8396, "pounded": 29902, "drool": 21180, "Add": 6265, "ACCIDENT": 18669, "brothers’": 5950, "inca": 25464, "chi": 27544, "Karla": 28944, "cafes": 27319, "Hoop": 10442, "headquarters": 6015, "embarrased": 21976, "RA": 4465, "Ebay": 26877, "Year": 4134, "irritated": 8848, "experiments": 1123, "nameless": 9433, "smudge": 18143, "incur": 31444, "Position": 17696, "appreciated": 4614, "pastures": 25183, "LEONARDO": 25468, "mermaid": 9079, "Monks": 17392, "NZ": 12676, "varied": 10232, "Sommer": 22772, "Majesty's": 31976, "Springs": 10341, "expense": 11595, "Superheroes": 12631, "animated": 27911, "exposure": 2212, "Gonzales": 14765, "Color": 16038, "Welles": 5501, "Realism": 14940, "expired": 10958, "tourism": 16281, "reputable": 24356, "conveniences": 32951, "Workshops": 21059, "embryo": 27898, "DECENT": 28577, "Sushi": 21306, "Gino's": 6790, "EPA's": 25915, "Zionist": 20199, "retreat": 5995, "tropical": 16987, "forelimb": 2900, "Einstein": 6905, "Alaska": 7867, "Freedom": 12304, "realizing": 14815, "lottery": 24921, "under": 865, "SD": 22965, "div.": 5355, "everywhere": 6110, "programmes": 13878, "exposures": 26237, "recomend": 29611, "infrastructures": 7973, "Styler": 15917, "humanity’s": 14611, "knot": 18104, "underway": 10166, "victims": 11171, "occupations": 18963, "recalls": 20829, "pull": 8810, "Airlines": 17106, "primaries": 22735, "Kapor": 24180, "Horace": 12456, "silentia": 5080, "Lindsey": 7071, "REAL": 20119, "damnation": 6604, "stays": 8107, "disappear": 10028, "lucrative": 19163, "restocked": 17296, "upheaval": 20357, "S.D.": 22474, "florence": 26544, "thereabouts": 31120, "qua": 32663, "explaining": 11584, "Extracurricular": 14838, "Ms.": 7491, "12:42": 22911, "schemes": 18767, "gymnasiums": 29456, "deafening": 32231, "01/25/2002": 21533, "guns": 19551, "Superior": 25011, "suggests": 1597, "tempests": 30998, "LOI": 21214, "Poisson's": 3862, "leave": 5575, "undervalued": 25851, "shapes": 23970, "tense": 10063, "Strongid": 28038, "10.99": 26425, "recruiting": 18793, "Adam": 5276, "hamster": 26428, "REFUNDABLE": 29619, "user": 2295, "EATTING": 28787, "workout": 15746, "potty": 6721, "CARE": 29575, "Meagan": 21314, "unit": 972, "malfunctioned": 18190, "relate": 659, "Regina": 12451, "escalator": 23289, "Augustine": 21847, "Supper": 27109, "Scientist": 6848, "38,000": 21644, "afternoon": 7041, "setoff": 23500, "Tang": 13318, "stoop": 30334, "Changes": 30499, "indifference": 31200, "evil": 6592, "air": 1342, "rhythmically": 24089, "Michael's": 6787, "take-out": 30319, "qualifications": 10862, "entitled": 3362, "Krueger": 8467, "stood": 9099, "Oatmeal": 26353, "offerings": 23854, "marrying": 3393, "interfaces": 8303, "Posselt": 4433, "auto": 26943, "churning": 32237, "unveiling": 14595, "transcendence": 24597, "pillagings": 9102, "cimartinez@flog.uned.es": 961, "executions": 19784, "PG&E's": 23277, "Ellison": 24196, "Juggernaut": 25207, "Chilis": 29439, "secure": 6910, "Moreau's": 5426, "other": 483, "Realists": 19104, "membrane": 27905, "medium": 7477, "protesting": 11190, "preservation": 10664, "notices": 32907, "Malevich": 4596, "yelling": 29612, "gloves": 18014, "Ide": 2491, "pun": 10240, "aim": 1611, "Rip": 28913, "affiliates": 21804, "Fidelity": 29176, "Kawashima": 7562, "#44": 17128, "Instructor": 29380, "compiling": 1860, "yucky": 6979, "Slovenian": 10852, "AGAIN": 11914, "aeroplane": 3332, "1977": 5357, "northwest": 8214, "Liu": 2528, "PINKERTON": 11849, "client's": 7403, "propelled": 19596, "207": 29966, "assurance": 22644, "locomotor": 2805, "Aids": 26067, "regroup": 22381, "Jehosaphat": 30747, "Facts": 15140, "PRICED": 29245, "sand": 9432, "1.5": 14795, "Speaker": 14100, "Yekaterinburg": 4258, "2": 381, "sabotaging": 29753, "backyard": 15700, "considerable": 530, "cried": 9142, "wears": 21260, "rebels": 6009, "WA": 23179, "nn": 30050, "disclosed": 20579, "artists'": 7441, "Mh": 15899, "swivels": 27388, "brute": 31025, "outwards": 17762, "Ruby": 5833, "being": 848, "secretions": 24062, "neighbor": 15698, "Freeport": 21889, "medal": 12061, "mildew": 29979, "re-use": 18175, "Brazosport": 21885, "Rican": 30303, "Darla": 21402, "solo": 10945, "86th": 5190, "Wholesale": 21735, "brumation": 27682, "Chatillon": 26610, "breakfasts": 28592, "Main": 16544, "findings": 1084, "Frustrated": 30664, "Jared": 5695, "insecticide": 31712, "faculty": 337, "Benengali": 30438, "folks": 6198, "dth": 23285, "shuttle": 21865, "Taub": 22134, "FAIR": 28803, "Come": 6296, "arena": 7292, "Antony": 4175, "06:28": 23263, "warming": 13443, "Shikibu": 4765, "First": 572, "Caring": 17701, "agglomeration": 16941, "Similarly": 20288, "Clare": 24662, "hideous": 9366, "vacancy": 24708, "360": 5012, "parched": 8883, "India's": 19036, "robbery": 31027, "coolness": 17640, "Lund": 23093, "Tennessee": 10357, "practise": 31410, "stroked": 32679, "mosques": 16775, "omelettes": 30482, "pixies": 9729, "geographical": 2327, "stint": 19801, "Dentistry": 28261, "Baltic": 17208, "shrines": 26933, "prearranged": 25567, "aswered": 28624, "exploded": 20425, "emphatically": 23348, "materializes": 14050, "Step": 17961, "dim": 9484, "Reserve": 16315, "shone": 9368, "yields": 13458, "quartile": 15633, "refund": 18174, "who’s": 8298, "Earth": 10065, "influx": 16905, "Ambitious": 25979, "sustain": 1709, "http://www.romancescam.com/forum/viewtopic.php?t=7231": 27027, "values": 11199, "screwed": 13627, "KABUL": 19655, "arrogance": 17594, "region's": 17034, "tweed": 32886, "Gotschal": 21486, "Safari": 12782, "beaver": 25067, "trait": 15219, "sercvice": 28411, "Big": 6171, "legitimate": 1260, "truer": 8141, "muggles": 18323, "pig": 12906, "marriages": 20005, "54,000": 15685, "Bremmer's": 20424, "mma": 28545, "secular": 5134, "antique": 28420, "10:46": 21595, "thyme": 31664, "hagiography": 5922, "Achilles": 11288, "Yeung": 12425, "hubristic": 17649, "http://i.imgur.com/T2zff.jpg": 27165, "flirty": 27949, "Shahshahan": 16793, "crumbling": 6860, "Muqrin": 18631, "OSTRICH": 28943, "Folies": 5420, "boxing": 18274, "SHOWS": 28736, "EXCELS": 29444, "Hoffman": 14450, "Michaelis": 3785, "lil": 26372, "Sky": 4192, "invented": 6844, "rumours": 18582, "Styles": 10936, "Atop": 28976, "EnronEAuction": 22499, "Min-Woo": 13074, "HIGHLY": 24343, "Consent": 24709, "Venta": 15345, "you'd": 6392, "tag": 10657, "SUN": 24207, "Merchanting": 22574, "153B09": 22151, "fixed": 6673, "4632": 24963, "entertainment": 7373, "freighters": 30799, "Discourse": 2922, "snowscape": 8643, "Yemenia": 17169, "plaudits": 31393, "um": 6362, "negotiate": 2983, "collectors": 2005, "throwing": 13799, "02:21": 22133, "Bourdain": 15437, "dealers": 20500, "Barese": 28301, "quieter": 26772, "chatted": 30836, "Tallulah": 29769, "numbers": 546, "calls": 1179, "households": 2119, "[": 375, "embroidered": 9846, "whereby": 13060, "granting": 14741, "pic": 27168, "Account": 20975, "bat-like": 32119, "woven": 15330, "Transcendental": 24182, "Ken": 15400, "him": 3182, "almost": 1363, "sepulchres": 5041, "Crossing": 12530, "contested": 7132, "demurrage": 30815, "computer": 429, "Beeline": 17444, "healthy": 6589, "adhear": 20333, "hell": 5047, "package": 11544, "extradition": 20688, "Sherri": 5709, "theological": 5106, "chartered": 3641, "comp.sources.d": 24331, "herring": 25165, "Attorney": 20758, "LATIN": 29259, "task": 501, "TAU": 22364, "582": 23400, "builder": 32065, "continue": 2427, "project's": 12654, "computational": 3798, "arteries": 3303, "transforms": 14135, "highline": 15970, "voiced": 19900, "Superdome": 24399, "Potidea": 25389, "potentiality": 24077, "Ulster": 27195, "flat": 2708, "Americans": 6108, "Giants": 9103, "deaths": 9281, "Yes": 6237, "Comic": 5895, "Najib": 12172, "23": 592, "bruise": 9782, "bolder": 18573, "compulsion": 14811, "overseeing": 20804, "sounded": 6752, "Tuesday": 10198, "Rick's": 22868, "cognitive": 192, "enslaved": 16275, "Mesoamerican": 15336, "Portugese": 25439, "example": 106, "sterile": 29326, "lieutenants": 31899, "Uncharacteristically": 32407, "Baptist": 5597, "christened": 24190, "tolerant": 17334, "moored": 32774, "Recall": 15645, "readily": 8092, "Procurement": 23297, "squirelled": 20026, "Evidently": 22323, "micro-fiber": 26286, "shaft": 26728, "camp's": 12389, "represent": 2990, "dissipated": 31130, "Allen's": 4104, "migrant": 15290, "Jūsan'ya": 4741, "flying": 8358, "Photography": 26613, "deal": 6097, "headed": 4400, "Character": 11256, "Witches": 4197, "relax": 9781, "Pole": 31051, "Terrified": 14794, "230,500": 15670, "specialist": 20956, "senseless": 20148, "HBO": 2931, "glitter": 31093, "spanning": 1022, "trespass": 7619, "Directors": 22794, "defector": 12285, "http://www.consumerreports.org/health/healthy-living/beauty-personal-care/hair-loss-10-08/hair-loss.htm": 29784, "THINGS": 11917, "markings": 29389, "Absalom's": 30756, "deceptive": 1355, "cast": 5735, "thrashing": 30359, "Cold": 8000, "Leaders": 24655, "photographic": 13277, "risen": 30568, "Saltillo": 14685, "260": 29562, "Quilis": 1003, "menace": 18907, "observant": 30733, "Particles": 11353, "tough": 11519, "Thx": 26616, "impressive": 5389, "seriously": 5128, "Interviewers": 23371, "Ichor": 9750, "X37047": 22490, "overland": 24582, "Libyan": 20366, "detached": 32745, "piled": 16514, "grape": 16187, "spoon": 26654, "specials": 28155, "WPO": 21797, "ordination": 32831, "Harvest": 8002, "fuckwad": 9696, "alarms": 7404, "Vessels": 16297, "Madam": 14107, "Industries": 8217, "role": 340, "bother": 6700, "neat": 13718, "Investigators": 19933, "imported": 25025, "Freeze": 17777, "diary": 4426, "K/psu": 2625, "hurtle": 9285, "---------": 19208, "-------------------------------------------------------------------": 25458, "meddlesome": 32257, "Media": 10847, "making": 65, "cage": 26479, "no": 126, "renewed": 14212, "equivalent": 2870, "proves": 6626, "KINDY": 23662, "vanish": 9439, "export": 13987, "artery": 21704, "dictators": 20375, "jars": 32428, "couldn’t": 4585, "Zenghelis": 4556, "protests": 10391, "breeder": 26321, "Playstation": 12588, "slats": 26842, "45,756": 13004, "MICROcomputer": 24188, "usually": 506, "self": 2510, "SECTIONS": 11927, "tempted": 11643, "Pump": 29447, "warmth": 8711, "budgets": 24280, "studio": 6087, "gnaw": 9471, "Fischler": 31463, "failed": 2828, "auction": 11646, "Venezuela": 14230, "falters": 24589, "eleventh": 30405, "troubling": 15191, "crackdown": 19691, "DOUBLE": 27246, "YouTubers": 5311, "nascent": 32944, "46th": 14332, "College": 1267, "wrote": 3268, "significantly": 2644, "dispossesed": 24270, "voluntarily": 25912, "Return": 22025, "Structure": 916, "Horribly": 27972, "twentieth": 15570, "trash": 18266, "enrolled": 29066, "random": 10927, "451": 21891, "Logan": 29592, "develops": 189, "truth": 1914, "extent": 2462, "socially": 1271, "addressed": 9288, "sisal": 16978, "thieves": 19308, "Circumstances": 31464, "Mauer": 13315, "doers": 19787, "francs": 31153, "connection": 1719, "Sexual": 13539, "Make": 9295, "gravity": 15538, "monitoring": 1616, "fundamentalist": 18758, "Wells": 21759, "heartedly": 18278, "religious": 4363, "psychotherapist": 6797, "Frames": 3828, "Tibet": 15432, "investigating": 23685, "preside": 13851, "anticipates": 23296, "Lava": 28304, "gee": 28511, "Billing": 29309, "scrummy": 29645, "mimicry": 1242, "Spiritually": 16327, "rallying": 18809, "antiques": 11523, "EES's": 21434, "'60's": 8495, "stack": 18134, "strikes": 7329, "Carolyn": 6717, "meditation": 8332, "buzzers": 9771, "denominator": 7105, "airlines": 16446, "laces": 8344, "Veronica": 23746, "syntactic": 971, "Christopher": 3786, "Houseman": 6565, "Generally": 17165, "servings": 18432, "deliveries": 23939, "satisfaction": 9660, "counterattacked": 27720, "gin": 32395, "earned": 3197, "establish": 352, "cue": 19356, "post-production": 13751, "Callum": 26295, "Orange": 5280, "impediment": 7786, "43": 4840, "standup": 13664, "coroner": 18050, "Comparative": 2921, "recollected": 668, "describe": 2254, "secretaries": 19093, "ultimately": 3970, "Redwood": 23283, "Separated": 27864, "worst": 7686, "Jawaharal": 18999, "Peas": 29171, "statehood": 14748, "aviatio": 18083, "credible": 14216, "Whisky": 28089, "talking": 6422, "driven": 2758, "swept": 11983, "Napier": 16278, "circles": 17274, "furs": 10061, "fire": 3010, "bring": 9374, "glowing": 9969, "Cozumel": 27495, "telegraphic": 23024, "exclusively": 6579, "ach": 31960, "Boy": 6302, "Evergreen": 28652, "slope": 2672, "Rats": 11702, "Jason": 12346, "misfortunes": 14016, "Virgo": 25286, "Newbies": 3055, "Haven't": 22079, "smack": 19818, "gears": 29342, "monastery": 5926, "MAJOR": 27536, "Afshari": 20077, "paranoid": 26973, "deposited": 12328, "points": 7355, "pies": 29639, "minerals": 23990, "AirBox": 13954, "Dawson": 5314, "Advance": 22887, "handling": 12022, ";P": 26958, "minister": 4535, "explanations": 15163, "TBH": 27369, "2022": 4512, "Needles": 22742, "Neptune": 28437, "insipid": 31083, "713-853-4743": 21910, "ould": 27361, "CHRISTIAN": 29141, "brainwash": 20082, "bisexual": 26734, "arriving": 13021, "Cordially": 21624, "dslr": 26229, "germs": 6776, "Changing": 30044, "decision's": 19922, "PHONE": 21467, "gnawed": 9858, "transferability": 23562, "complacent": 32409, "slowly": 7111, "vocals": 24852, "Pigs": 25003, "AWAY": 29275, "regulated": 13732, "imbued": 20223, "chien": 1731, "unilaterally": 13729, "mullahs": 19697, "holding": 5900, "Biology": 10257, "breast": 9311, "Vogelaviatiolaps": 18072, "visibly": 30546, "crooks": 20523, "When": 198, "Travelled": 27403, "nutrients": 8196, "Charlie": 5752, "Martin's": 20959, "permissive": 10965, "wires": 25733, "heartless": 28250, "promised": 9663, "recrudescence": 31168, "submarine": 19608, "GWB": 20176, "UltraSonic": 23643, "heebee": 28510, "Shrimp": 28538, "studying": 227, "straight": 6393, "Hutcheson": 14944, "Belief": 14709, "WebLogic": 21368, "diverted": 10472, "evacuate": 16571, "IBM": 21358, "sincere": 31462, "conceptualize": 24313, "contempt": 31924, "eliminate": 3952, "Malle": 5408, "knife": 6376, "days": 2854, "Toyota": 28550, "4,700": 25829, "strike": 10424, "Subway": 29429, "Bolivar": 25531, "organizations": 12542, "lash": 16072, "miscalculation": 14241, "Watt": 21307, "produce": 395, "Kiyani": 19712, "Printing": 28387, "Umoregi": 4677, "candidate": 5710, "majors": 4901, "Menger": 21204, "superior": 15525, "bread": 6454, "5249025": 24901, "comprising": 17205, "Litzmannstadt": 16918, "Kaminski": 20918, "ingrown": 29404, "Yelp": 29435, "MUUUUUUM": 32093, "hat": 25888, "irresistible": 32620, "sh-": 6658, "Michelangelo": 5496, "chem": 15854, "arsenic": 26253, "DOCTOR": 29515, "Edwardsiella": 10669, "fluttered": 9396, ".432": 4897, "thoroughly": 6124, "4350": 24949, "Inspection": 22657, "dodging": 30548, "hierarchy": 2041, "leaves": 1831, "Santorum": 10473, "you’re": 7759, "contracts": 807, "Shippers": 23601, "endure": 14328, "Calgary": 21278, "fevers": 6768, "Pasquallie": 21818, "bent": 8631, "TROUBLE": 28403, "houseware": 18169, "ankle": 17378, "stickhandle": 13532, "postponed": 4043, "numbness": 17673, "pewter": 8988, "clarified": 2702, "motifs": 16835, "Algerians": 20360, "frothy": 10491, "upload": 13939, "Abused": 19950, "º": 17315, "gamers": 12574, "Steamboat": 28705, "tobacco": 31649, "chills": 15812, "pan-democratic": 12411, "accessing": 14567, "obstructions": 18202, "win": 1606, "third": 3033, "who's": 6515, "measurement": 31565, "Houston": 4898, "innovate": 8460, "713-853-3098": 23575, "countless": 1592, "perturbation": 2674, "Christianity": 5097, "guaranteeing": 20488, "render": 3433, "surprised": 5898, "pebbles": 6386, "promoted": 3590, "carvings": 16312, "tell": 6095, "Lindqvist": 1577, "postponement": 18959, "soften": 23515, "saxon": 27628, "brunaanastacio@hotmail.com": 1510, "Maureen": 20902, "playoffs": 11083, "lovable": 29537, "jumble": 32193, "towel": 8669, "service": 3522, "intensity": 8714, "confided": 3913, "meal": 7742, "attempt": 5161, "whiskered": 9019, "merely": 14884, "SOLAS": 26920, "cookin'": 24547, "Goals": 13889, "Safavid": 16782, "....": 18686, "cuz": 13666, "honro": 21431, "Velupillai": 19021, "celery": 27441, "Gryffindor": 32248, "derived": 1897, "ST": 5645, "litgation": 23780, "Auto": 28820, "Network": 19949, "hooves": 6344, "incrementally": 7249, "Gérard": 5464, "inhibitors": 13585, "station": 12339, "Socotra's": 17193, "addendum": 22897, "Indianapolis": 4887, "988,000": 17406, "sophisticated": 14661, "Association's": 23851, "Plains": 13150, "gray": 8878, "sick": 5250, "Gardens": 16851, "EBS": 21085, "T.V.": 27210, "Wave": 5485, "Challenges": 24487, "important": 258, "property": 767, "sexual": 5031, "whatever": 6255, "Antarctica": 10591, "http://www.un.org/ha/chernobyl/": 18704, "Portrait": 13257, "08:15": 23207, "nebulous": 13707, "formidable": 15082, "roughly": 631, "Arab": 11226, "forum": 1283, "asking": 10737, "chairpersons": 19837, "tricycles": 31834, "coding": 2514, "judge": 3855, "carried": 2871, "Austria": 22504, "Z1": 21922, "Garganta": 26990, "eyedropper": 27902, "Dong": 28443, "Bistro": 29768, "treatment": 2402, "canes": 8934, "X940": 26203, "newcomers": 12437, "Hedwig": 32048, "Ron": 12299, "homage": 14089, "snipers": 18611, "honorific": 15046, "Dark": 11285, "Stones": 13129, "demonstrations": 24813, "guidelines": 18107, "wavenumber": 2701, "journey": 4311, "Turkish": 25734, "spacecraft": 11372, "CIC": 27031, "Guthrie": 23574, "werewolf": 26185, "Definite": 29512, "Live": 10343, "Nitrogen": 29355, "License": 8543, "gristle-studded": 30306, "Anybody": 31953, "narcotics": 9589, "inevitably": 18953, "color": 6138, "Afterwards": 10288, "spark": 7372, "Vvedenskoye": 4391, "supplementary": 31484, "Mekong": 27543, "150301": 22150, "Payment": 21639, "Expires": 24465, "6.00": 24919, "unfamiliar": 3043, "Mediterranean": 27008, "employees'": 30025, "anthrax": 20570, "dismantle": 14321, "declaring": 3852, "175": 29271, "watchfully": 31161, "Create": 18252, "torso": 12629, "Actual": 25989, "honored": 12056, "Yahoo": 24221, "cup": 15757, "0.4": 2623, "Chubby": 8787, "indicates": 1417, "Antioch": 5125, "soothing": 18649, "SARA": 23246, "☎": 17018, "observe": 1805, "surrounded": 8959, "04:03": 21691, "happening": 11053, "pulse": 25112, "RAFFLE": 24533, "Melon": 16065, "blogger": 12718, "Gentilz": 14797, "ravines": 32761, "grit": 15206, "unsettling": 15483, "vitamin": 2204, "Pennsylvania": 10486, "VCU": 29443, "Feb.": 11693, "legislation": 11540, "houston": 28495, "jihadi": 19123, "Hernan": 13124, "dissecting": 10638, "aye": 23447, "summit": 13870, "Purple": 17713, "2050": 13449, "Duo": 5720, "temperment": 28613, "clapped": 32029, "sycamore": 32446, "cheers": 15984, "Golden": 1073, "modest": 7734, "years'": 16233, "sequential": 1891, "sped": 32317, "NOTES": 11929, "given": 1740, "alumni": 25928, "Issac": 6786, "solitude": 5985, "awards": 4793, "pedagogical": 3755, "leant": 8968, "tempered": 14311, "saithe": 25164, "obvious": 7482, "Male": 4100, "Joys": 26792, "eee": 15753, "Bundy": 9570, "rec.": 27142, "Tool": 30175, "insert": 16008, "probing": 22864, "divorce": 7233, "reversal": 21511, "microwaved": 28249, "keywords": 24335, "inu": 1735, "Crimea": 4371, "TUL": 17422, "plate": 21454, "Drew": 22758, "witnessed": 715, "whereas": 8200, "pans": 8650, "model": 2635, "whil": 11413, "regularly": 5338, "bombed": 13683, "rivers": 31057, "paradigmatic": 7435, "monsoon": 17162, "11/13/2000": 23822, "flag-stones": 31612, "carribean": 26666, "unruffled": 30931, "Underage": 32080, "Hunter": 22878, "Replication": 2372, "lb": 8074, "Balances": 24706, "screws": 18160, "ECP": 23487, "sketch": 13658, "conferenced": 22349, "shedding": 8184, "biology": 25126, "An": 3707, "TOOK": 29699, "unloading": 8585, "fingernail": 17677, "Montrouge": 26611, "commission": 6086, "Edwards'": 18870, "ho": 8614, "EESI": 23488, "Gabin": 5397, "countries": 8054, "Neil": 19542, "existence": 7598, "politically": 7980, "Hazim": 19273, "serenity": 30918, "psychological": 12876, "stemmed": 4994, "basement": 8735, "blobs": 31980, "competitive": 21053, "Bella": 28294, "think": 6279, "referendums": 12658, "Panama": 13063, "guidebook": 17290, "1,200": 18983, "Personality": 10718, "resisted": 19752, "Cork": 32660, "monuments": 10183, "a)": 12351, "nonsense": 6546, "justice": 11675, "Holland": 3636, "systemic": 14138, "Bankman": 13735, "inaugural": 14340, "cares": 21004, "Completed": 17275, "Caparrós": 978, "non-Moslem": 20356, "Althea": 5598, "pink": 9121, "bragging": 20736, "threat": 9655, "Iris": 20963, "979": 21894, "snatched": 32156, "leather": 29154, "bourgeois": 30403, "E": 1820, "amassed": 10325, "presenter": 4239, "nukes": 19157, "mid-nineties": 19331, "d-": 6281, "pitch": 18339, "Ngoc": 23117, "hockey": 18327, "Scotsman": 27824, "hippies": 27262, "refreshing": 28589, "stench": 9464, "fascination": 13390, "inexpensive": 6115, "delightfully": 32914, "Bar": 7306, "MSA": 22388, "whips": 10041, "toured": 17328, "wavy": 28439, "Tien": 12400, "cautious": 14766, "meanest": 28664, "defining": 2772, "Iguazu": 26988, "disk": 20629, "arancini": 28812, "bits": 9162, "spite": 6020, "Jobs": 7818, "honor": 7181, "Algonquin": 32605, "Gray's": 31767, "mental": 3729, "wearies": 18876, "rewrote": 11557, "triumphs": 14019, "transitional": 26732, "replicate": 2480, "cross-sectional": 2803, "harbouring": 13026, "Volgograd": 13126, "06:16": 23734, "spouting": 9049, "deviating": 15624, "jolts": 8334, "parole": 12113, "triggered": 25064, "circa": 30003, "copyright's": 7455, "barrels": 8947, "Wine": 28135, "Wentz": 31728, "travelers": 15107, "Carol": 7057, "Combat": 15137, "extensively": 996, "Indiana": 13269, "Budd": 10364, "digress": 11333, "outta": 28253, "Medusa": 23393, "sewn": 31675, "1955": 30659, "pissed": 6106, "Software": 26098, "belonged": 22917, "Boat": 19242, "Hawaiʻi": 7519, "Horomona": 16357, "woudn't": 21993, "Nope": 26464, "3926": 22532, "Newer": 26726, "conjecture": 3918, "interrupted": 21335, "Mehraban": 12090, "Asus": 26318, "disorderly": 31827, "flows": 662, "manuscripts": 3877, "bouts": 5036, "resorted": 26813, "grass": 8899, "simplistically": 20799, "physicians": 3294, "Minor": 4864, "05:59": 21384, "quixotic": 19114, "REMEMBER": 24974, "glibness": 31626, "OBSF": 22586, "Steakhouse": 26553, "extending": 11179, "900": 12137, "literate": 27100, "pubs": 28117, "story": 4628, "packed": 9182, "acknowledges": 20386, "reaches": 8061, "crept": 9296, "enabling": 1024, "strawberry": 16201, "burglars": 29818, "drawers": 29889, "nuclear": 10415, "Thebaid": 5158, "384": 4985, "Agreement": 21031, "Alright": 6197, "touch": 6714, "admirals": 30951, "devised": 13540, "Tablet's": 26688, "sucks": 15069, "Kim": 7550, "top": 7108, "scented": 9712, "Booker": 12545, "workplace": 15013, "1101": 15243, "thousand": 6039, "pact": 25621, "Montana": 15482, "goodbye": 12768, "Failed": 15258, "confines": 22896, "donuts": 15881, "maple": 8591, "Officials": 12983, "relentlessly": 32779, "defended": 13055, "trauma": 15721, "fearless": 16718, "W.": 3156, "faintly": 32812, "biochemical": 20613, "stripe": 16685, "Absolutely": 10329, "earnest": 4683, "bipartisan": 14179, "outing": 29390, "hehehe": 29221, "network": 2985, "mist": 6837, "Affirmative": 23151, "Soon": 3293, "Salad": 28602, "Synopsis": 5619, "densely": 19547, "Caffasso": 16593, "Security": 7911, "tolerable": 21841, "sinking": 9457, "Oversite": 9502, "10": 1761, "numbered": 17108, "chaps": 25202, "luxerious": 17146, "coils": 7382, "Referee": 18343, "Memon": 12244, "houses": 3621, "ovr": 26360, "ASWERING": 28908, "assimilate": 32718, "ratings": 5811, "www.juancole.com": 18964, "Financially": 25308, "would": 863, "systematic": 1759, "Making": 8003, "nerds": 13638, "requisite": 31280, "array": 2608, "Experts": 3052, "prosperity": 7990, "melts": 27304, "bustling": 16914, "admire": 27393, "athlete": 8400, "Yoga": 27576, "P": 3324, "ragga": 16703, "DAILY": 18968, "Castano@EES": 23506, "zones": 2340, "dominated": 9239, "summaries": 15262, "enriched": 15918, "Wim": 5516, "1594": 25408, "plane": 3313, "societal": 7273, "pleasure": 8519, "scratch": 12622, "Ireland": 18871, "rags": 31188, "Marbles": 5175, "0590883899": 16670, "majority": 8487, "Visibility": 30514, "1665": 4334, "religion": 8732, "Whi-": 6870, "maternal": 29783, "Cardenas": 5717, "Ressam": 20779, "Cheryl": 23063, "Goose's": 28636, "footer": 30215, "mature": 4713, "Leasing": 29177, "prefere": 26502, "interjection": 1779, "Sigh": 29234, "costumes": 12544, "Annie": 13399, "0448": 21893, "Vanilla": 17826, "Oomen-Ruijten": 31386, "http://www.mikegigi.com/meltmetl.htm": 27317, "waitresses": 29579, "contributed": 731, "batteries": 25788, "sisters": 14070, "payoff": 27943, "chute": 18192, "You'd": 6464, "exacting": 32604, "rear": 4267, "MMA": 18760, "BE": 27777, "ai": 4053, "CANNOT": 28004, "Cheers": 15994, "Where": 6428, "massacring": 20358, "proverbial": 20352, "substitute": 7559, "44th": 17125, "Falls": 15993, "niece": 31853, "stifle": 7054, "army": 4332, "Gloucestershire": 26129, "configures": 30167, "Nicaragua": 25475, "fingers": 7778, "allowing": 2880, "Devon": 4229, "photography": 13295, "Columbus": 3687, "Rule": 7323, "deeper": 8288, "ordinarily": 19848, "Misalette": 11749, "hostages": 20504, "org": 21715, "Filo": 24219, "slice": 11366, "Elisha": 5776, "Rinascimento": 27102, "cavies": 27435, "notepad": 24987, "CO": 9303, "Cowboys": 13401, "Expired": 16042, "roaches": 21978, "mindset": 15077, "Marino": 20163, "Murillo": 13110, "method": 1851, "analysts": 19142, "users": 10818, "Sunlight": 9843, "Kaho": 4623, "1280": 14103, "meticulously": 32869, "innovator’s": 15094, "Children's": 18727, "T&D": 23512, "http://www.blueoakstables.com/breyerhorsebarns_barn003.asp": 26844, "compulsive": 13544, "jokingly": 16945, "Shelf": 10674, "Lanka": 18974, "fiance's": 29724, "magnification": 10640, "abstaining": 27186, "Nostromo": 25535, "eaves": 8948, "14": 739, "chasers'": 18306, "Gelceuticals": 23985, "full": 463, "HATES": 26429, "farming": 15062, "sevenyear-old": 32630, "Brent": 21326, "Enterprise": 15582, "Living": 14852, "Hoecker": 22378, "ecologist": 25105, "necessary": 2170, "peer": 1330, "opiate": 9397, "Cave": 12567, "graze": 25018, "Olsen": 5761, "Brought": 28430, "application's": 30190, "rut": 31491, "Gwadloup": 16628, "Ahali": 4528, "columnist": 10482, "journals": 1332, "1483": 25376, "Hadid": 4461, "Babington": 10938, "fists": 9691, "hopeful": 11575, "pillow": 26366, "generated": 2152, "Clay": 5820, "Peanutjake": 24336, "prefect": 31007, "biasing": 16221, "1678": 4349, "loosing": 26810, "fino": 27571, "negro": 31263, "Computing": 549, "1960": 3458, "Flourishing": 15338, "hey": 15761, "slurped": 32336, "Furthermore": 1632, "we're": 6345, "six": 1906, "Wi940": 18675, "alleyway": 32279, "Scientific": 18652, "TEXAS": 22665, "adverse": 19714, "Socialists": 20186, "complain": 22851, "interprets": 30105, "medals": 3624, "Than": 26956, "indignity": 23968, "Glove": 4853, "Careful": 29831, "sun's": 16366, "prevention": 13966, "202-466-9142": 22828, "skating": 32738, "macho": 13609, "1704": 3518, "Cester": 21447, "champagne": 30602, "WebSphere": 21367, "fancied": 31254, "born": 3132, "Saddam": 18559, "s-": 6121, "greens": 8023, "repainted": 32103, "feeling": 8738, "Rhodesia": 30598, "delhi": 27410, "unto": 14069, "Common": 7996, "innocents": 20611, "singer": 5363, "guitarist": 25622, "Lane": 21823, "lawn": 8931, "C": 11731, "philosopher": 10367, "sunday": 21192, "hammy": 26493, "trigger": 1050, "prohibition": 14676, "partying": 18034, "ole": 19405, "he’d": 15499, "drags": 18238, "stuffed": 31621, "tin-billy": 32533, "neonatal": 18685, "MAIDEN": 14299, "A1M": 17565, "Lorie": 21692, "Cemetery": 4069, "LE": 11414, "combination": 2040, "13381": 20276, "consultants": 23855, "rodents": 26482, "`s": 21240, "occupies": 7799, "Downton": 4155, "alt.religion.scientology": 12708, "restrained": 20592, "Respectfully": 22930, "Kingsman": 4201, "adapts": 2800, "e-reader": 26682, "food": 8020, "conveyed": 14840, "superintendant": 28313, "Sdot": 30801, "martyrs": 5042, "hover": 30349, "rebellion": 25704, "Lighting": 2083, "console": 26777, "Brigades": 18622, "mid-2004": 26048, "literaly": 20325, "canceling": 29858, "evzone": 31671, "XoveTIC": 2247, "Lectures": 3734, "towels": 17774, "naturalism": 15157, "Constitution": 7224, "Shiite": 18510, "that": 230, "speed": 342, "Compare": 15108, "hers": 26420, "monotonous": 20139, "fifteen": 4299, "pressurized": 27298, "sized": 7890, "P.S.": 11707, "President's": 14129, "Doyon": 24125, "Wheel": 26417, "jokes": 3470, "Evolution": 10209, "quarters": 15642, "Winckelmann": 27117, "minuscule": 18226, "verification": 2347, "Sullivan@ENRON": 22817, "urged": 14401, "airfare": 13779, "silicone": 16055, "uniquely": 4425, "respectful": 17343, "Valerie": 23546, "CISCO": 24148, "conferees": 19141, "Camera": 26224, "legalised": 25971, "Fallen": 19873, "Jews": 7244, "emerges": 1956, "Detail": 30085, "&apos;": 30135, "Messenger": 20872, "Fistfights": 19286, "cheesecloth": 18450, "stalled": 32736, "famously": 3930, "poster": 6840, "conjointly": 3252, "Parachute": 18179, "OLMEC": 15306, "Kohoutek": 32567, "streaked": 9537, "banks": 9393, "penalty": 13082, "Bondad": 21410, "averted": 23696, "Luminol": 18013, "Wise": 10057, "Christ’s": 10151, "Hilgert": 23375, "imam": 16771, "roadway": 17438, "Hours": 17817, "Jerome": 4958, "condone": 18847, "ve": 26183, "Cyprian": 31856, "Tripura": 19529, "4.99": 29498, "covers": 2351, "praise": 4115, "M.Sc.": 10259, "Anglo": 14682, "robotically": 9342, "Rumor": 25026, "queueing": 31812, "spel": 21286, "catacombs": 5044, "incorporates": 22486, "aft": 30911, "heave": 32032, "deluded": 25647, "institutional": 763, "Students": 1674, "Ottley": 12020, "Hoax": 24769, "struggled": 8940, "UN": 13941, "Datasheet": 30078, "calendars": 21201, "referring": 15459, "ESA": 2578, "disruption": 25874, "congested": 17571, "tight": 9059, "Gone": 29233, "diameter": 11389, "Shinza": 31777, "Successful": 12611, "publish": 1362, "talent": 9829, "solemn": 14010, "massage": 9165, "colours": 24611, "Fuel": 21215, "sculpted": 26264, "undeclared": 20387, "adopted": 812, "babe": 6443, "Husbands": 20039, "Sugarbowl": 11477, "Bear": 7889, "Model": 13698, "discourteous": 28047, "1.00": 24936, "Zeitgeist": 13410, "anchorage": 16340, "1520": 25377, "lifestyle": 12303, "brains": 7010, "Kamen": 12081, "DC": 4129, "selected": 8286, "Stacey": 22324, "Plucker": 2443, "Federal": 1505, "jangling": 32332, "hehe": 27515, "Neuendorffer": 25578, "novelty": 3998, "ha": 9097, "docks": 9161, "creators": 18316, "tributaries": 23964, "237": 25985, "Possibly": 7994, "Gilbert": 17048, "Stepping": 30793, "snow-white": 32294, "mimicking": 1329, "Talal": 18516, "certificated": 32574, "devil": 12930, "collect": 11314, "advisors": 20965, "distinct": 1773, "Sand": 17493, "precise": 1866, "privy": 32550, "fauna": 17218, "Ive": 26769, "Such": 563, "Hong": 12361, "around": 473, "far": 1183, "baseman": 4771, "mornings": 16990, "Leonardos": 27107, "men": 7200, "Platt's": 23414, "ghost": 8300, "origami": 29533, "sulphuric": 16641, "belch": 32026, "correction": 2648, "mansions": 17420, "03:13:58": 21534, "morph": 23156, "BILL": 29700, "Lives": 14119, "hatred": 14336, "Nickelodean": 6973, "Montgomery": 15040, "Probing": 23659, "Types": 23042, "Californian": 28485, "admonished": 25633, "half-hesitant": 32744, "Philippines": 2067, "Ἱερώνυμος": 4965, "1881": 4763, "389,950": 15669, "Datamanager": 23001, "strengths": 175, "approach": 319, "P&I": 22697, "Coordinator": 23380, "Byargeon": 23387, "THERE": 26768, "Hawaii": 27519, "foundational": 3700, "surv": 24885, "happily": 10157, "stylists": 29864, "Methodology": 3024, "destroyed": 10406, "spaces": 8131, "Vigor": 28324, "Jasny": 2471, "Enrique": 25583, "Fired": 11008, "Rehabilitation": 12825, "1892": 4620, "Beats": 28412, "growth": 833, "Butter": 15430, "aimless": 30332, "astonishing": 15165, "Martin": 2431, "rapists": 14652, "guys": 5252, "Count": 4404, "VA": 24763, "emergent": 3087, "deduction": 7162, "Utilization": 2044, "Prearranged": 27239, "methods": 1243, "Liberation": 19002, "realise": 19682, "beauty": 11263, "condemnations": 20509, "planks": 8956, "1580": 14875, "backgrounds": 17631, "nicknamed": 10268, "Cry": 5783, "suggested": 1111, "Writing": 7653, "deformity": 14977, "HIS": 28752, "decided": 1405, "wagin": 27606, "distant": 1025, "caterers": 16617, "Tintman": 28110, "1908": 24758, "Gaza": 18787, "revolutions": 25530, "shura": 20686, "0590854959": 16675, "son's": 20171, "Meraux": 23416, "center's": 29082, "possibility": 1673, "Dustin": 28458, "words": 769, "atop": 9249, "astronauts": 23929, "labyrinth": 29123, "contours": 17512, "Raspberry": 13959, "downwelling": 2703, "reprisals": 19710, "200,987.33": 22729, "bustle": 29427, "200,000,000,000": 24372, "toil": 31114, "unchanged": 30870, "priest": 4033, "pounds": 4811, "CAEM": 22793, "redesign": 8129, "Lemoine": 16556, "slacked": 19802, "Tracking": 11, "1701": 4407, "overawing": 31731, "February": 3105, "supplements": 7892, "matchsticks": 31796, "gave": 3187, "pollutants": 13474, "Honda": 28560, "5.": 2033, "RELEASES": 14587, "symbolizes": 12914, "Beheshti": 16760, "7.5": 23284, "Telescope": 14583, "balloon": 6286, "Sarah's": 20951, "epistemology": 15177, "Vice": 14307, "Iris'": 20964, "weakness": 31026, "Browsing": 10952, "Methods": 17698, "effectually": 31331, "MRS.": 11902, "throes": 14316, "Blood": 9677, "creole": 16629, "carpets": 16737, "rigor": 3856, "lifted": 8670, "stateless": 12157, "restored": 11578, "bushes": 17719, "convict": 24295, "physios": 28321, "Illinois": 13328, "qualification": 32841, "specialty": 16614, "DPR": 22610, "defender": 13138, "Yoshida": 8327, "DISTRICT": 11497, "Flagship": 29914, "Ignore": 26736, "11:32": 21941, "triple": 4906, "spin": 19212, "incorrectly": 21288, "application’s": 2337, "fascinated": 31065, "fray": 20279, "Ralph": 4213, "Rhodes": 13350, "nikon": 26228, "crystal": 9378, "denied": 5923, "housed": 2849, "blocks": 11946, "AAA": 23807, "slower": 9951, "Roberto": 13233, "Manson": 28626, "debating": 10454, "Wikimedia": 10779, "money": 1470, "Helmut": 13395, "Shell": 8250, "Rocks": 11349, "CRAZY": 11874, "preschoolers": 27939, "TB": 26982, "D": 2205, "allegation": 19271, "stopping": 9554, "proposition": 30578, "i've": 26460, "june": 2138, "congratulations": 22268, "siesta": 16991, "tryed": 27598, "Sheikh": 16795, "trembling": 9743, "bomber": 19357, "refurbish": 31376, "ATTENTION": 24341, "Fraction": 7104, "Ulistic": 29808, "Antigone": 5447, "feathered": 11962, "Hazara": 19727, "tele": 27552, "mechanics": 2916, "optimization": 22888, "Mark": 4916, "terrific": 10902, "provides": 322, "Cheveux": 29075, "Percell": 22885, "Colombo": 19001, "Une": 10120, "POV": 11325, "pennies": 7909, "world's": 1737, "eikon": 9481, "Matte": 16019, "unwittingly": 18481, "Stuart": 4324, "Salary": 21022, "trade": 11603, "payers": 24508, "Dinners": 21991, "Minimum": 25986, "Ltd": 28112, "salad": 17770, "Fernley": 21310, ".xsl": 30126, "Stromboli": 30838, "chanting": 9096, "dimly": 7863, "cheerfully": 32333, "Maya": 15353, "ß": 18097, "Bowen": 22121, "smokers": 29107, "1951": 4904, "d'Enfer": 16684, "Farm": 8218, "soup": 9759, "complicit": 19461, "......": 19487, "Connecticut": 10947, "quantitatively": 20391, "spitting": 19239, "dies": 25352, "HD": 26679, "fries": 26344, "Chow": 12506, "postal": 24665, "Translation": 5553, "replete": 7581, "tomorrow's": 23325, "halos": 30982, "seriograph": 6187, "Rating": 21028, "prey": 17807, "standards": 883, "needle": 30997, "tray": 17868, "Moretti": 1027, "Ew": 16039, "Owners": 32275, "sickly": 5978, "combat": 25768, "6,000": 5897, "Anyhow": 29785, "Listen": 16133, "Julfa": 16750, "Phnoum": 5996, "Sova": 7547, "Jensen": 5786, "Took": 6088, "Deputy": 19439, "CTRL–V": 30158, "Croatia": 22505, "Aww": 16137, "warred": 32511, "healthiest": 15990, "homey": 29468, "launder": 12047, "nausea": 27597, "Fishing": 26770, "Rauschenberg": 10510, "€": 16443, "apathy": 14157, "stil": 26524, "Nakarai": 4635, "requires": 762, "essential": 868, "C.V": 22262, "fragrant": 17710, "radiographs": 27612, "dries": 26410, "Hermione": 32076, "snack": 15697, "land's": 17511, "nuanced": 2918, "google": 27477, "Thelema": 20202, "chronicler": 30433, "Kriste": 23071, "temptations": 17394, "divergent": 15072, "boiler": 9770, "showcase": 26932, "Thrones": 2927, "Oryana": 8224, "Crown": 4183, "Nagaski": 18725, "Abnormal": 17819, "logistical": 20738, "hasn't": 6703, "advancing": 4870, "shorts": 8844, "trimmed": 9811, "Topack": 22741, "frolicking": 8970, "babinos": 6784, "interacts": 2194, "Fort": 4774, "Body": 15832, "Boswell": 13036, "1965": 3703, "IRC": 11309, "EXCEPT": 26530, "listened": 14189, "downpour": 9038, "bpd": 23403, "are": 305, "tripartite": 19686, "mentioned": 3924, "checking": 2314, "'M": 11892, "Airport": 16445, "doesn't": 6470, "foodies": 8037, "Endless": 5744, "guarantor": 10446, "bond": 14368, "writhing": 8942, "baker": 27323, "Quaint": 29078, "mentoring": 404, "ventilation": 27764, "muscular": 30639, "hide-out": 32495, "Hazard's": 13117, "Warning": 23201, "unlisted": 30390, "standardized": 14858, "thickness": 23012, "nun": 19934, "treating": 20056, "absent-mindedly": 32088, "Datos": 2235, "stumping": 25241, "deceiving": 1256, "Pritzker": 4473, "an": 50, "heavier": 17894, "louder": 32142, "Teams": 4791, "gladly": 9496, "immensity": 30921, "1717": 23886, "Hong-Kong": 31344, "chickens": 2734, "http://www.canadavisa.com/canadian-immigration-faq-skilled-workers.html": 27082, "Surveying": 12514, "Industry": 15136, "Malle's": 5480, "preferred": 14399, "jester": 20445, "Pescheux": 3958, "onions": 16125, "pearl": 32621, "women's": 10987, "Amused": 30570, "latest": 7914, "controversial": 13543, "terror": 5090, "version": 5818, "Co.": 21089, "starting": 4955, "Olympics": 4494, "straightened": 25229, "Armatho": 25400, "mobile": 2320, "CBS": 4160, "Priscilla": 12471, "L": 2599, "dhin": 24090, "plans": 4036, "sharers": 14073, "seaports": 31539, "Katie": 15133, "dresser": 29890, "Sherry": 6709, "confronted": 15476, "pony's": 28941, "development": 2281, "strictly": 10964, "Bradley's": 25113, "staffs": 28171, "ice": 6205, "yelped": 9670, "Chong": 2473, "berths": 17319, "Chaharbagh": 16786, "imposingly": 27921, "sanitary": 18058, "mover": 30695, "jumbo": 25232, "countrymen's": 31984, "dissembling": 31624, "biochemist": 20644, "discharged": 3594, "waterfront": 9131, "Senate": 5862, "amazing": 8860, "GB": 13018, "Sotoun": 16825, "Chase": 6934, "risky": 8095, "leagues": 4865, "!!!!!": 28048, "Stainless": 6458, "whose": 477, "illegally": 13022, "stuttering": 18858, "named": 4832, "Clinic": 29214, "MAPS": 11928, "Radiation": 2100, "marching": 32196, "shrill": 19275, "loudspeakers": 12885, "OFFER": 11933, "administrations": 13210, "11/27/2000": 23809, "collages": 26112, "eyelids": 25559, "i',": 26452, "BASIC": 27028, "short": 664, "Reasonable": 28274, "Spoken": 11022, "ól": 19464, "hedge": 20970, "planting": 11956, "plateau": 17180, "Nowheresville": 28629, "certification": 14550, "Junction": 4148, "tights": 6493, "actions": 938, "payer": 24509, "correlation": 20971, "asylum": 8320, "tooted": 31179, "kerosene": 31436, "Hash": 26347, "meetups": 10784, "toda": 28554, "Chicks": 22114, "ferries": 17235, "considered": 1049, "meowing": 27692, "Toronto": 12526, "eighties": 24361, "Th-": 6180, "Citing": 12120, "Bush": 10403, "delightedly": 32956, "Viral": 23978, "Sierra": 29286, "alternatively": 18303, "Sandi": 22477, "introduces": 1320, "Primetime": 4184, "ROV": 10613, "46C1": 23130, "nestled": 29428, "meatball": 29111, "eSpeakers": 21543, "why": 1803, "Albeit": 2035, "hovers": 8788, "statistic": 14665, "intellectuals": 20371, "won": 4928, "Mecole": 23136, "Right's": 18796, "713/871-5119": 21801, "measures": 1638, "scaly": 9001, "Eva": 11294, "personally": 7692, "Defence": 18663, "NOT": 21086, "x": 7017, "A59": 17572, "wallet": 17245, "dying": 13818, "1S9": 21297, "permissible": 1276, "Poibeau": 969, "LNG": 23466, "Wrocław": 16934, "Wenner": 13353, "voyage": 30781, "mutt": 27134, "Kinnock": 31514, "Evaluation": 22835, "bands": 13428, "U-haul": 18173, "Jake": 16428, "labs": 20697, "tattoo": 28060, "rewards": 3183, "harming": 27798, "deliverance": 30484, "Kindle": 26681, "Tschumi": 4558, "algebra": 3843, "After": 1817, "hardliners": 19732, "well-mannered": 31880, "erect": 30963, "circling": 9964, "continuity": 31342, "1938": 3445, "Akropolis": 32814, "anesthetic": 29225, "Barbados": 16475, "initiation": 1780, "1996": 5383, "initiative": 14259, "Caroline": 21592, "Transport": 27229, "collars": 31734, "Auchleuchries": 4261, "Corel": 24154, "build": 7770, "trembled": 9449, "touch-ups": 16061, "Becky": 22875, "roofs": 9459, "economies": 11600, "migrates": 17222, "insured": 17067, "mytouch": 26178, "2016": 1071, "Towers": 12327, "MONEY": 28909, "koran": 20661, "Peachstate": 28470, "OBSERVATION": 23335, "firmly": 9545, ":/": 27590, "Anahuac": 14760, "XF": 29718, "reccomend": 28556, "dung": 25527, "Sports": 5227, "11.5": 15654, "McLean": 29079, "Re-interviewed": 28609, "Piotrkowska": 16919, "bore": 6542, "inter-animation": 5646, "shape": 6240, "enhancement": 14529, "moments": 2834, "grabbed": 7099, "Below": 14104, "Lepore": 23534, "Masjid": 13183, "payed": 29606, "alleged": 2452, "Cara’s": 8832, "Sputnik": 31989, "Lexical": 1129, "C.": 15237, "Gansu": 24785, "Enron": 20961, "Grant's": 30399, "Scribners": 11952, "maximized": 23991, "varying": 1875, "Alice": 11272, "consist": 7288, "passages": 6635, "Lankan": 18995, "determine": 752, "brand-new": 32469, "tip": 8436, "thesis": 22096, "Bockius": 22130, "Shopping": 27416, "May": 3221, "Morton": 26564, "aspirational": 23849, "swords": 12929, "explosions": 8572, "lemelpe@NU.COM": 23529, "Sheriff's": 12324, "European": 2575, "equal": 825, "Anglican": 5006, "State’s": 708, "State": 709, "gentle": 10012, "became": 2020, "cross-sectoral": 13984, "stars": 4191, "They're": 6179, "LYNX": 22958, "ANSWERS": 27357, "AllowAdditions": 30219, "cornflakes": 30503, "fortune": 4331, "Google's": 10557, "cleaned": 15959, "fraught": 25883, "Crust": 28237, "prepare": 12845, "Granger's": 32313, "everything": 5057, "reducing": 4583, "http://www.newsday.com/news/opinion/ny-vpnasa054135614feb05,0,5979821.story?coll=ny-editorials-headlines": 23926, "distilleries": 16711, "suggestions": 17976, "warmly": 24261, "mart": 29551, "mythical": 19154, "Transmutation": 25298, "Tori": 21758, "waning": 11211, "Detroit": 17452, "tankers": 19557, "hikes": 23660, "inland": 24435, "Choate": 21037, "Actress": 5348, "downfalls": 25199, "ploughing": 17236, "gone": 5014, "tribes": 14740, "commate": 11814, "Satan": 13161, "scrambled": 9055, "scattered": 9220, "LAGESSE": 22754, "topline": 28001, "pardon": 29764, "practically": 16899, "strode": 32310, "Ford": 14412, "David": 10360, "anarchy": 12726, "fault": 6803, "click": 7677, "dynamics": 423, "http://isc.enron.com/site": 23114, "highlights": 4792, "Regent": 4377, "Grammatical": 3764, "emphasis": 984, "refusing": 4031, "Stewart": 28981, "unpleasantly": 28675, "Stylesheet": 30099, "Chapelle": 11465, "tips": 17293, "fashion": 9929, "coastline": 17181, "brainwashing": 20129, "GE": 21539, "pickups": 29236, "unwooded": 16195, "converts": 30163, "leads": 1858, "Teterboro": 16539, "layman": 17397, "socialization": 27462, "prejudice": 23972, "sides": 5087, "watchers": 25140, "wouldn't": 6687, "businessperson": 13402, "Trey": 5762, "pinky": 27672, "Disney": 5741, "Clap": 17800, "Disabilities": 10878, "Everland": 26578, "non-avian": 2739, "Rachels'": 24897, "woollies": 27809, "We're": 6348, "militarism": 10427, "compress": 11357, "awkward": 15699, "handing": 20167, "serious": 4641, "regardless": 7624, "Lt.": 19692, "gear": 28356, "extraction": 24360, "ONSI": 21226, "Princeton": 20609, "simple": 2782, "saucepan": 18374, "territory's": 31861, "Images": 12204, "breakout": 5467, "distinguished": 3135, "Greece": 14208, "Cheney's": 25937, "fuel": 17159, "25,000": 27646, "communities": 2027, "critically": 4163, "Kaminski@ECT": 22882, "flashy": 28887, "traits": 15311, "WarpSpeed": 21117, "obstruction": 27625, "distributor": 8062, "tanker": 24379, "hybrid": 23517, "arose": 5999, "goddesses": 20291, "California": 3459, "willing": 6894, "worth": 8390, "flour": 17846, "appear": 1369, "we'd": 6399, "benefits": 8513, "dredge": 30419, "Turnpike": 17435, "detention": 20619, "Warm": 17075, "Mc": 22496, "serenely": 24620, "project’s": 1087, "graphic": 2956, "Reservation": 26441, "Traveller": 27020, "Observatory": 14632, "yyone": 11486, "Turbine": 21700, "violet": 32169, "Chaman": 19694, "Auditorium": 14588, "Humpty": 8676, "Lauralee": 7529, "dear": 9092, "tenth": 11340, "3:30": 21011, "impeccable": 28219, "younger": 3160, "mothy": 31646, "published": 1348, "strides": 30494, "kale": 27772, "http://www.radianz.com": 22016, "Accomodating": 28278, "ripe": 13438, "stooping": 32250, "Here's": 6920, "embowered": 9392, "grain": 14621, "Rusk": 19094, "flank": 19571, "Attached": 21302, "Lara": 22398, "Solis": 23753, "ABSOLUTELY": 24941, "refunds": 23338, "condemns": 6594, "congressman": 14771, "pulled": 5262, "ruby": 9323, "inequities": 24685, "Caleb": 13745, "appreciates": 13921, "Endowment": 24511, "interface": 2311, "galaxies": 14626, "Judge": 7409, "repairs": 28138, "appropriations": 20800, "licenses": 10959, "cookies": 29508, "Andamans": 19517, "Tana": 21988, "impulse": 5141, "suprematist": 4594, "anemones": 10606, "marvellous": 31584, "intranet": 22880, "evidentary": 27468, "Tozzini": 23194, "kinetic": 3317, "mh": 15890, "Dartmouth": 27321, "IMPLICATION": 23350, "ballad": 25634, "visible": 9985, "Connections": 22972, "hostess": 29083, "Rap": 5274, "quickly": 609, "islands'": 19555, "richly": 30267, "english": 20770, "http://www.sonic.net/~fsjob/TragiCore-TheCivetCat.mp3": 24894, "significance": 186, "hunkering": 15737, "buffet": 16676, "Delainey@ECT": 21336, "Nida": 5548, "mathematics": 3116, "Sure": 7074, "Desk": 22567, "eighteen": 6012, "proprietary": 10801, "navel": 9775, "genetically": 14828, "contradicts": 7453, "patently": 20318, "Cat": 24855, "ecosystem": 7789, "freshly": 28715, "discouraging": 759, "capers": 31298, "Dinner": 29796, "punishments": 32909, "referred": 16882, "Sherrar": 21876, "61,000,000,000": 24366, "crunching": 32143, "psycholical": 27737, "favourites": 32261, "UK": 105, "accord": 19051, "imperceptible": 30929, "financial": 1463, "Local": 12932, "Ikhbariya": 12263, "vintaged": 23282, "http://www.bumrungrad.com/en/patient-services/clinics-and-centers/plastic-surgery-thailand-bangkok/breast-augmentation-ba": 26645, "elevated": 29242, "Power": 12429, "suppressed": 14009, "carries": 10450, "disrupting": 19690, "hilltop": 32817, "phases": 18234, "cools": 26409, "initial": 1917, "measurable": 13863, "googlenut": 24468, "comp.sources.unix": 24327, "violent": 9894, "results": 676, "themed": 10477, "Brooms": 18290, "Veterans": 19243, "SAM": 23250, "48": 7899, "202.582.1234": 22806, "successors": 20468, "374": 5132, "Ross": 14, "EBIC": 21137, "History": 3420, "CoM": 2743, "fide": 8111, "Isoza": 31737, "viewing": 54, "Way": 6749, "Brick": 28194, "Nella": 22350, "beneficial": 1975, "ADMISSION": 24540, "granadilla": 31772, "postmaster": 19833, "]": 376, "Teen": 4095, "eggshells": 11085, "cataloging": 6900, "high-octave": 32623, "technical": 1824, "Dec.": 18541, "Apostle": 29048, "mills": 16740, "swabs": 9532, "committing": 18636, "lies": 11517, "litter": 26274, "JBennett@GMSSR.com": 23261, "Degu": 27434, "chemically": 10630, "EPI": 21129, "divinity": 25642, "mind": 4309, "semifreddo": 29998, "crypto": 13737, "require": 936, "Debaathification": 18543, "Kioka": 24406, "winks": 14857, "expression": 7443, "immersed": 8453, "Straits": 12211, "queues": 12521, "mercury": 2095, "trenchant": 31240, "troops": 4374, "transvestite": 32422, "Weasleys": 32162, "mishap": 30382, "poverty": 7898, "spotted": 10219, "hypothesized": 1905, "believes": 12160, "fabric": 15577, "Inspired": 8342, "plunder": 19539, "Tigers'": 19063, "brilliant": 9173, "cognitively": 20147, "practitioners": 3017, "shields": 20497, "approx.": 1038, "one’s": 13039, "POLYGAMY": 19977, "wipe": 8826, "influenza": 13824, "lip": 9744, "respecting": 14274, "Nalapat": 19092, "Shona": 21328, "bulletin": 20602, "semi-pelagianism": 6583, "foreigner's": 26440, "indefinable": 31243, "telling": 6324, "runs": 4787, "Norwegians": 19046, "extremist": 13902, "Andy": 13264, "Ozone": 13497, "unfolding": 14616, "bitterness": 14418, "Kristof": 20890, "Subscription": 22542, "Called": 7056, "remembered": 3115, "ex-pat": 27563, "grey-bearded": 32916, "HCC": 28315, "Titman": 22669, "granddaughters": 21753, "Otto": 11449, "veils": 20558, "beam": 15579, "Diligence": 25264, "sanctioned": 20612, "studied": 1881, "Team": 4851, "ETA_revision0307.doc": 22565, "raids": 32254, "Atal": 19146, "watched": 9282, "EGM": 23450, "43228": 24964, "company's": 25645, "string": 4101, "Glass": 28368, "Filled": 28584, "L.P": 25718, "flood": 11532, "Breonna": 14140, "Ok": 19182, "contingent": 1378, "woke": 7020, "Newman": 10249, "abolition": 14691, "1800s": 16974, "morning": 4020, "classmates": 20112, "computing": 458, "immigrants": 16511, "Linda's": 25651, "seventy": 6166, "Conservative": 25844, "balloting": 19254, "Insurance": 23769, "Rufinus": 5108, "untreated": 27067, "insurgency": 12717, "Taurus": 25262, "joint": 5886, "Eddie": 12379, "Troubles": 24063, "olfactory": 15825, "Qapu": 16823, "Weight": 24879, "paranormal": 5790, "drew": 4576, "coed": 11760, "TRAVEL": 27029, "guests": 5312, "hissy": 20337, "Holga": 26533, "irony": 9667, "plumber": 27311, "old": 1653, "Meira": 22331, "bereaved": 20462, "Lady": 5375, "rumor": 20587, "Flowers": 17751, "IATA": 16761, "mid-2003": 26079, "Radison": 29940, "listings": 639, "http://haas.berkeley.edu/~borenste": 22457, "savages": 15471, "passes": 11568, "thirty-five": 30230, "Vintage": 28424, "bursts": 8597, "underneath": 6494, "admin": 16466, "driving": 1859, "Glowstick": 18007, "Labat": 19454, "disperse": 20604, "definately": 20256, "Dignitaries": 20461, "Chess": 25456, "preference": 1704, "possibly": 5117, "Bourg": 4014, "tenpound": 32312, "swallowed": 9883, "Deutsche": 22052, "civilize": 31049, "rid": 9892, "ego": 25648, "Udorn": 19200, "PX": 11476, "Yorkshire": 17518, "bumped": 13772, "CAMERA": 26205, "selections": 28632, "administered": 6013, "cells": 18476, "adorable": 27785, "haggle": 32263, "FANTASTIC": 28648, "re-code": 8310, "Questions": 13054, "BNA": 29235, "rotorua": 26974, "It": 280, "L'instant": 16690, "partly": 10966, "astonishment": 32904, "Mormon": 20241, "citadel": 14302, "employ": 7186, "bioweaponeer": 20698, "amend": 22638, "Bernoulli's": 3122, "LWs": 22107, "静": 14903, "delete": 21497, "yawl": 30874, "transcendent": 20228, "Standards": 31439, "infamous": 3934, "sergeant": 20878, "Siete": 6321, "40.": 14971, "pureed": 17889, "deworming": 27460, "Channing": 22448, "discusses": 10245, "equation": 2686, "techniques": 145, "Legato": 11281, "sculptures": 15343, "Wilson's": 19428, "Peterson": 9329, "defects": 23936, "guts": 27697, "9000": 29370, "MoI": 18477, "umbrella": 27823, "Times": 5245, "slept": 9802, "aware": 6436, "walkin": 27605, "misinformation": 29186, "worshipers": 30626, "blend": 16239, "celebrations": 12919, "THRIVE": 28665, "straw": 3289, "raining": 15862, "fact": 1222, "lyrics": 24895, "Foundations": 700, "Poterin": 3898, "Awarding": 14492, "opponent": 3954, "abusers": 20027, "understood": 296, "SALOON": 24539, "talented": 8294, "Persia": 16734, "meanwhile": 25100, "establishes": 811, "fashionable": 32891, "Vossen": 2490, "overdue": 20939, "Rittenhouse": 29941, "Special": 7266, "flag-pole": 31103, "(collapsible|expandable)": 30095, "bathroom": 9716, "loot": 18589, "Louisiana": 19444, "Cute": 27989, "d'": 26605, "East": 2722, "ADOX": 30040, "Gehenna": 30625, "instead": 487, "Importing": 30188, "treated": 4645, "unmarried": 5639, "flustered": 19677, "senior": 4835, "balanced": 10537, "hates": 13601, "1.800.233.1234": 22807, "Dick": 14446, "1877": 4420, "subsequent": 3806, "rolls": 29588, "defendant": 14681, "No-6": 31357, "commerce": 14751, "AN": 11508, "civility": 10792, "inertia": 2879, "Central": 8240, "THOUSANDS": 24910, ">>": 21064, "Berlin": 5531, "Grilled": 29352, "diplomatic": 5607, "Travis": 14762, "easiest": 15027, "associates": 27768, "Brushing": 30821, "sesame": 15919, "3143C": 21699, "drop": 13685, "Fred": 22226, "Louisianna": 19436, "Victoria": 10984, "resulting": 2363, "shan't": 32657, "forcing": 30256, "conventional": 1788, "Rhinegold": 32613, "design-time": 30171, "anti-trust": 23869, "fall": 3079, "Halal": 27320, "Europe’s": 15468, "86M": 21107, "puzzled": 9953, "hearts": 14026, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!": 28806, "Bombs": 30866, "Maps": 17102, "10030": 22899, "Croall's": 23173, "beaches": 9430, "Arnold": 22535, "nuts": 11475, "century": 714, "opposite": 1346, "Siu-lai": 12478, "naturally": 1871, "shrimp": 25170, "prevailing": 7192, "MSDN": 30176, "Ebert": 2533, "baffled": 13598, "ranges": 2024, "vegetarians": 18360, "MVB": 27745, "Tate": 14449, "cruises": 2559, "a.m": 22865, "Herat": 12103, "much": 1304, "motherland": 14087, "Appellants": 7586, "independents": 7191, "fend": 29745, "mountain": 11454, "roaring": 32230, "danced": 24095, "800": 5217, "Gout": 24057, "grill": 27313, "rugger-square": 32443, "Wayne": 13640, "slap": 7101, "America": 561, "sits": 8197, "Reporters": 22821, "influential": 1408, "couldnt": 27600, "Sonoran": 17040, "erected": 4073, "favourite": 10923, "HTML": 12789, "rentals": 11639, "bounds": 17488, "Behesht": 16837, "wheelchair": 10855, "Coase": 726, "enjoy": 1226, "doctors": 1265, "scenes": 9365, "phobic": 13574, "abstraction": 19791, "crowd": 12282, "Caramel": 15891, "jugular": 24135, "erupted": 8638, "Sunak's": 12969, "Emergencies": 18664, "Mat": 18077, "grotesque": 9420, "phlox": 25119, "Herpes": 23967, "catapult": 9286, "Miyako": 4680, "SEA": 26949, "Rivers": 14724, "EASTHAMPTON": 10104, "Hatfill": 20709, "foul": 13079, "tend": 11130, "realised": 3318, "trail": 8611, "Ann": 12468, "Ansems": 24957, "hormones": 15717, "gourmet": 16616, "#valuesbased": 8008, "prising": 9085, "contemplating": 15007, "Shinza's": 31898, "snug": 17672, "offspring": 26327, "hats": 28659, "normal": 2199, "confess": 31483, "Miniseries": 4171, "Bothell": 23178, "co-creators": 13989, "drafts": 11112, "gearbox": 29341, "jeopardised": 13041, "irrigate": 15347, "Terrace": 16574, "Waziristan": 19700, "edit": 3432, "he's": 6433, "Palm": 5384, "visualizations": 24596, "pelt": 32563, "Fossum": 22759, "Rent": 22074, "Cómbita": 1566, "glamour": 16948, "Historian": 25384, "ice-creams": 32098, "stumps": 10217, "elephants": 11202, "titled": 5756, "meaningless": 30364, "160": 17880, "limp": 24622, "Voltage": 13696, "Diego's": 23868, "underfoot": 31707, "drives": 12295, "Pay": 7819, "Hz": 27212, "apparition": 32468, "20,000": 11565, "renegade": 25027, "Chanukah": 23803, "verbal": 7157, "Parks": 6156, "battles": 11237, "doing": 4009, "culturally": 14932, "lone": 20608, "Parts": 28468, "copying": 18112, "sensitive": 10716, "cure": 24038, "cc": 21918, "Reggie": 21859, "Estimated": 2153, "swinging": 6954, "Lyons": 4707, "clues": 23717, "pre-organised": 16288, "Transportation": 21458, "Bloody": 29250, "country’s": 921, "Juste": 25558, "rewriting": 30189, "sensing": 2593, "Lifestyle": 12753, "asked": 3189, "limitless": 11222, "quarterly": 19637, "defect": 21803, "downtown": 12045, "whim": 23332, "graduate": 6364, "manages": 23779, "crapload": 27093, "tiers": 31815, "frock": 32617, "axial": 2794, "01:58": 22992, "riiight": 30026, "on": 45, "Equator": 31053, "overalls": 32456, "scooping": 27455, "Area": 17050, "medieval": 13595, "Hasid": 30540, "re-enactments": 16576, "improperly": 2180, "ottle-": 6863, "languid": 31112, "dignity": 6581, "chimichangas": 29162, "dragging": 22070, "water": 2184, "weed": 31610, "designed": 3333, "looters": 24426, "cooperation": 803, "yams": 8582, "HMC": 12958, "applicant": 22983, "JUNO": 28807, "rinsed": 27856, "fixtures": 28421, "H-0209/99": 31518, "Phoebe": 23234, "purported": 7603, "Westphal": 11297, "lieu": 27938, "M.S.": 19289, "detain": 30229, "l/c": 23229, "NORTH": 24645, "commandant": 10440, "Hatzidakis": 31478, "liberalisation": 31548, "NIGHT": 11888, "assigning": 13816, "sacrifice": 10807, "spokesman": 12150, "spurt": 26983, "laden": 8938, "care": 1264, "nasa": 24497, "seductive": 30261, "01/25/2001": 23385, "arch-murderer": 20506, "destinations": 16707, "DISPOSAL": 29227, "¢": 11765, "&": 265, "Donatus": 5024, "Blown": 12290, "cross-linguistic": 1943, "Harp": 20757, "Vagabond": 17284, "thinner": 2838, "judgement": 13248, "tomatoes": 15349, "yrs": 26361, "Hair": 28212, "Basel": 3145, "football": 6189, "many": 290, "Collections": 13296, "galleryfurniture.com": 21195, "Dorsey@ENRON_DEVELOPMENT": 22967, "O&M": 22684, "WAIT": 27382, "chased": 11059, "quotes": 5322, "peaceful": 6908, "350,000": 25762, "adequate": 918, "exchanges": 2308, "distaste": 31762, "Notional": 21640, "prudence": 31205, "wrap": 7768, "68,500": 15687, "bon": 7753, "London's": 4251, "unvocal": 9435, "Terme": 11254, "Interplanetary": 11352, "Nina": 25104, "Kobeys": 28078, "merging": 24626, "Leadership": 10841, "conquered": 25387, "aesthetic": 85, "stints": 17991, "enhanced": 436, "Behind": 24005, "worm": 9027, "favorites": 21156, "Errors": 31336, "Beschta": 25050, "Zuckerberg": 12196, "blinking": 9948, "perfectionist": 29281, "22s": 24298, "colored": 10144, "wildflowers": 26193, "Sooner": 11193, "Plus": 16379, "cpys": 22550, "broadline": 8127, "Assistance": 27021, "tricky": 28504, "Infinite": 24635, "dissatisfied": 28662, "MicroMega": 13246, "code": 13961, "Impossible": 27220, "hostesses": 30555, "rats": 26256, "Religion": 12754, "Poulenc": 31620, "harness": 18195, "presentation": 21016, "predicts": 8522, "severely": 16282, "effectively": 8309, "Laity": 7831, "compliant": 30036, "stubble": 31689, "1992": 5379, "fatal": 3884, "Dumas": 3956, "HARRIS": 14304, "%": 2150, "abstract": 1078, "Penn": 15128, "adolescents": 18681, "Silver": 4852, "illnesses": 5130, "fisherman": 12151, "those": 660, "stand": 8875, "Pacific": 10505, "volley": 13106, "assumes": 14416, "Cut": 17763, "uncongenial": 31325, "fuzzy": 31606, "05/30/2001": 23507, "burdens": 14055, "Qaim": 18472, "tsetse": 31714, "means": 1244, "Giovanni": 5147, "Cheuk": 12413, "pandemic": 13813, "1000": 1042, "Acphillips": 13271, "viruses": 13803, "-ll": 28232, "http://www.equinecaninefeline.com/catalog/savic-freddy-cage-free-delivery-p-6750.html": 26872, "certainty": 17614, "Insofar": 1306, "Woody": 4103, "Biblical": 14374, "******************************************************************": 21463, "Doves": 26592, "Borenstein": 22442, "I.B.": 18966, "Bodhi": 29629, "Balance": 18139, "workforce": 420, "interviews": 1628, "who": 1229, "Instruments": 2407, "clubhouse": 28593, "restoration": 4325, "observation": 1626, "RecentChangesCamp": 10748, "FTU": 12485, "celebrating": 32601, "Broadway": 11167, "pivotal": 1856, "Oldham": 5427, "ushering": 8043, "Director-General": 31907, "ROS": 10295, "Insurgency": 12688, "indispensable": 15174, "judges": 24720, "bags": 18442, "also": 643, "grandmother's": 32451, "accelerate": 11396, "BAD": 28181, "electric": 13422, "brigadier": 4402, "fixture": 27170, "textures": 15849, "Władysław": 16912, "Chronicle": 5099, "gnocchi": 28892, "someday": 13797, "fore-and-aft": 30513, "Soup": 7433, "wharf": 16302, "Degus": 27428, "YPF": 893, "coz": 26788, "toolbar": 30141, "downstream": 22986, "cd": 21270, "Erith": 30948, "Fear": 24073, "swallows": 25137, "Over-rated": 28523, "Radio's": 19806, "Ass't.": 21393, "shard": 30337, "exercised": 7307, "killings": 14125, "dissolves": 18456, "events": 3041, "manipulate": 20737, "Zone": 28166, "mid-day": 20457, "wasent": 28354, "MISSISSIPPI": 28571, "wear": 6465, "11:30": 21282, "reminisced": 32924, "can-teen": 9192, "Hebrews": 5172, "annex": 21605, "symptoms": 15799, "0.10": 23468, "fed": 27340, "Furniture": 29884, "asap": 22748, "LLMs": 13700, "honour": 4072, "thrifty": 27890, "audacity": 29226, "table": 6204, "volleyball": 18347, "packs": 25039, "residing": 29772, "buildings": 4506, "Considering": 1581, "Crowleyan": 20201, "EL": 25365, "Example": 10292, "loves": 24721, "retaliate": 25812, "broader": 1307, "flops": 17373, "Carlo": 13356, "Yeah": 6069, "politest": 30414, "Titanic": 25580, "expectedly": 19262, "finally": 1887, "styles": 6126, "obeying": 20030, "accept": 5557, "-------------------------------------------------------------": 25333, "Reporting": 14559, "correspondence": 5166, "wagged": 31190, "genealogy": 20242, "rivalries": 17645, "http://www.ibiblio.org/expo/soviet.exhibit/chernobyl.html": 18693, "Sheepdog": 8804, "Goode": 4078, "Jamaican": 29017, "be-all": 32849, "grasped": 27944, "interact": 8380, "los": 19468, "assassin": 25625, "darkness": 5069, "11030": 20273, "Kar": 28702, "rewarded": 14184, "Compact": 2092, "developed": 1031, "participating": 1629, "sudden": 10134, "shallac": 28289, "cages": 2851, "high": 587, "acknowledge": 3704, "Rib": 26562, "editorship": 4444, "Alvin": 12424, "Lockhart's": 32225, "close": 3201, "Options": 22695, "episodes": 2946, "precipitation": 17411, "Schonwetter": 14476, "analytical": 11161, "Services.DOC": 23103, "through": 203, "businessmen's": 31904, "precaution": 25564, "Jintao": 19173, "repair": 1767, "mini": 26684, "esp": 28597, "Toph": 8823, "complexion": 30913, "http://youtube.com/watch?v=d46_ctqDmI4": 20153, "Nadu": 18987, "1783": 3592, "vulnerable": 8307, "Expectations": 18065, "pullers": 26378, "thinking": 374, "USS": 25803, "tourist": 11581, "indicating": 20637, "Musharraf": 18748, "Niagara": 22299, "Food": 8047, "Weiner": 10504, "descent": 5429, "UPI's": 25061, "http://www.UnitaryExecutive.net": 24750, "martial": 8961, "translates": 12217, "non-locals": 16403, "Nov": 23833, "Says": 26880, "cutlery": 27331, "PARTY": 11885, "manliness": 25664, "Mills": 11125, "http://www.InternetchurchOfChrist.org": 24753, "IRR": 16766, "ties": 15382, "lengthens": 30156, "closing": 7351, "splattered": 9680, "precipitous": 8191, "secured": 29737, "vessels": 19591, "LIVE": 26767, "wading": 27941, "decor": 26555, "daughter's": 31588, "exfoliating": 9740, "67.70": 12041, "pair": 5844, "Razak": 12173, "extremity": 31143, "she": 3969, "J.doc": 22845, "Keck": 20342, "Stanley": 4169, "Exporting": 30111, "837": 14870, "co-founded": 4526, "chemicals": 2110, "Dakota": 15998, "liturgical": 24691, "coated": 8657, "Pacquiao": 26130, "typologies": 1192, "decipher": 30444, "Marches": 27190, "relations": 3713, "stadium": 11080, "hungry": 13783, "Ofra": 16025, "guest": 5832, "duct": 28827, "co-operate": 24388, "Hood": 25052, "Ingram": 12698, "Panel": 20591, "enforcement": 909, "dioxide": 13486, "lifespan": 8528, "Marcelo": 22330, "torch": 14060, "jellies": 15954, "emergency": 6751, "accidentally": 7356, "tenants": 29106, "extension": 1352, "cafeteria": 29019, "Steps": 17592, "Victor": 19905, "tests": 10626, "creditor": 22584, "summarily": 25440, "Esp.": 28486, "social": 397, "ocnversation": 21997, "zeros": 24161, "two-day": 30410, "Compaq.com": 21780, "Operator": 2306, "née": 5417, "irrational": 13572, "CI": 13967, "disgust": 9875, "fortress": 17526, "ICC": 23563, "luminescence": 10634, "Petersburg": 3207, "DAUGHTER": 29686, "30": 2689, "Figure": 1863, "donned": 12543, "franchise": 23245, "Friday": 5819, "confessor": 4969, "tactical": 3083, "drivers": 16719, "Eight": 6298, "Księży": 16877, "Turner": 17445, "normall": 26311, "quiet": 5968, "12.45": 22270, "violators": 806, "prerogative": 6599, "liquid": 6253, "animation": 13633, "accepts": 15649, "jam": 15925, "Plaster": 26408, "bounded": 1138, "completely": 3056, "sonus": 24203, "mecca": 16342, "justifies": 24883, "Consider": 1446, "snakes": 26891, "rearing": 2843, "Benedetti": 13357, "employer": 7163, "pin-heads": 31098, "bile-coloured": 32878, "observatories": 15395, "carburetor": 3125, "Courtois": 13112, "highlight": 16071, "window-sill": 32154, "Nightwing": 12570, "diesel": 31349, "overwhelmingly": 18509, "saltiness": 15848, "MYSTIC": 11802, "tastes": 6701, "Luna": 29703, "contemporaries": 19235, "oppositon": 23832, "enduring": 18824, "assaulted": 8422, "Kelly's": 22753, "Carnival": 10356, "hotspots": 16411, "gathering": 8901, "Rico": 16636, "hahahaahh": 27794, "spotlight": 12241, "Wellington": 12666, "comers": 25448, "enrollment": 7907, "Like": 6745, "Jones": 4177, "Petrarch": 25354, "Khymberly": 23134, "goats": 28939, "hacker": 8295, "Aplocheilus": 27851, "Leap": 4133, "Contemplate": 18220, "1949": 5354, "flickered": 32752, "paragraph": 6614, "mb": 23785, "GYM": 28519, "trampled": 13179, "ep": 9697, "2002": 4083, "core": 2466, "tide": 9026, "Magazine’s": 11135, "commentators": 2469, "1957": 32609, "760,000": 16940, "step": 431, "simulate": 11398, "stabilise": 19731, "tensions": 18791, "Autofiltering": 30146, "delusions": 30430, "subscribed": 5191, "Dizzy": 32238, "Hilary": 5109, "nationalist": 18948, "memorializes": 22738, "publication": 1349, "Graydon": 25906, "fanatic": 20409, "switching": 29564, "encounter": 10234, "decoration": 17714, "farmer": 4026, "into": 147, "counter-propaganda": 20526, "counteractions": 12879, "Goldsmith's": 7419, "presidential": 14432, "can": 78, "Clarke": 2432, "Irony": 20134, "Number": 25909, "damp": 17746, "There've": 31729, "diminish": 25160, "Philadelphia": 14431, "unanimous": 11539, "Select": 23535, "humanists": 3021, "pilgrimage": 12273, "judgments": 1418, "investigator": 12325, "chiros": 28323, "d": 26568, "timer": 18273, "appropriators": 20205, "dialague": 22680, "nabbed": 20751, "debate": 1047, "Rhodesian": 31865, "analyse": 13442, "Calzolari": 2492, "converted": 5101, "Welfare": 12511, "intoxication": 18463, "Philipines": 26131, "locals": 16309, "Roberts'": 7174, "Windermere": 25208, "tennis": 13370, "gipsy": 31972, "Answer": 20892, "pricy": 12329, "epistemological": 15192, "inwards": 20485, "Garcia": 25571, "315": 17881, "monologue": 13644, "snails": 27877, "USUAL": 23036, "islamists": 20573, "series": 204, "Reducing": 17801, "abroad": 14406, "pharmacy": 29465, "Marc": 12212, "Purus'a": 24100, "mush": 29493, "bath-stool": 32690, "Modus": 20576, "hardship": 14338, "ninety": 15254, "digs": 8854, "telephones": 11630, "^": 11762, "YOUR": 11866, "rated": 12795, "Anticipating": 30563, "Must": 21898, "nessasary": 26714, "Worst": 28025, "settlements": 14736, "morphological": 2783, "Oppose": 24702, "Seekers": 18309, "281-518-9526": 22137, "acronym": 24149, "NCLAN": 13476, "garlic": 8580, "Tacoma": 28863, "Hand": 25681, "workshop": 29340, "!!!!!!!": 22266, "Fahrenheit": 6225, "7/16": 23521, "collapsing": 5918, "http://www.ebay.co.uk/itm/250927098564?var=550057729382&ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1438.l2649#ht_": 26863, "curl": 15943, "leisure": 14855, "mean": 1690, "maw": 9051, "Forget": 7774, "cicada": 10246, "dishwasher": 18447, "Maintains": 23279, "Tropic": 13621, "prideful": 17637, "profited": 23355, "Craving": 29509, "screen": 3031, "garret": 31449, "memories": 238, "distal": 2859, "Tristan": 5697, "montparnasse": 26598, "STAR": 18969, "Second": 586, "Sooners": 21181, "flips": 28660, "Ticket": 23585, "sorta": 6028, "gamble": 13548, "Craft": 29532, "nutrition": 8182, "stoning": 13160, "tremble": 14375, "restore": 25195, "electrical": 2086, "phenomenal": 10408, "irresistibly": 31837, "Vegetarianism": 24878, "things": 5678, "Attitudes": 26085, "telephony": 23590, "fussy": 28889, "when": 886, "Union": 10399, "225-5185": 11507, "fingerprints": 31893, "presented": 4502, "1990s": 3797, "hing": 12507, "Fried": 13736, "shabby-looking": 32282, "subscribers": 5189, "Banks": 8347, "spends": 25981, "http://www-formal.stanford.edu/jmc/progress/chernobyl.html": 18716, "liner": 21833, "REMARK": 14914, "Tranekær": 17286, "Jammu": 19119, "lapses": 19559, "64.2": 26103, "Spay": 29399, "what'd": 30986, "Wasn't": 6929, "Countless": 32077, "heart": 8325, "veg": 16173, "SCBA": 7305, "2030": 14486, "culminating": 31045, "fee": 1365, "boast": 20066, "CPI": 20905, "Pluto": 25303, "Editorial": 11121, "Shiites": 18799, "stable": 7053, "Pete's": 26705, "breed": 19831, "puffy": 9469, "NEPCO": 23159, "plays": 2148, "ideate": 24617, "understanding": 167, "1789": 3635, "Livorno": 13195, "crosstab": 30070, "discuss": 162, "Jai": 21274, "plunderers": 32260, "GPA": 15231, "whir": 29364, "instruments": 2660, "1891": 4630, "viral": 5267, "Wake": 17798, "saddle": 9928, "meat": 15443, "Bosnia": 16477, "citations": 7606, "Chalabi": 18548, "popularize": 10569, "Labrador": 31799, "Mikhail": 11596, "Bonus": 24009, "declines": 8503, "leapt": 32290, "Proletariat": 12482, "Addiction": 13564, "priorities": 8506, "printers": 28382, "Marae": 16286, "03/15/2001": 21690, "amphibious": 25771, "=)": 26699, "Manne": 23731, "Raleigh": 24667, "DEFINITELY": 28461, "it": 72, "cupcake": 17831, "Rohatgi": 7263, "rooms": 10689, "70s": 27274, "lot": 6042, "Gallows": 5406, "rescheduling": 28902, "relation": 1700, "roots": 7117, "noticeable": 15625, "Eco": 23461, "sordid": 31109, "Levi": 28473, "Sera": 22975, "11/8/00": 22057, "browsers": 11362, "constitutes": 18205, "11201": 21490, "354": 16377, "Lay's": 21757, "truely": 29007, "filthy": 29568, "Kayak": 17266, "oxygen": 18031, "sex": 7286, "281-514-3183": 22152, "freaked": 6756, "reprinted": 11073, "unmolested": 25054, "hegemonic": 25848, "penalties": 25934, "pesticides": 28273, "weaken": 19570, "mommy": 23914, "A19": 17576, "pleasing": 27640, "Munk": 23091, "Domínguez": 977, "3rd": 4941, "shouting": 8637, "d'Alembert": 3278, "416-865-3700": 21298, "Institute": 3419, "D’Alesandro": 14149, "Iranians": 19744, "District": 4822, "copyrights": 7495, "utterly": 20245, "proprietors": 28982, "Kenyans": 14539, "Youngspiration's": 12435, "Advertising": 30106, "trading-post": 31329, "538": 23399, "cdg": 26597, "http://www.binkyswoodworking.com/HorseStable.php": 26843, "fixes": 6696, "intellectual": 7972, "Arabian": 17177, "Determine": 17636, "Panamal": 27247, "deepest": 9040, "defence": 19892, "Calculater": 26879, "FANFUCKINGTASTIC": 29632, "cloth": 10289, "sequence": 1826, "mapped": 17247, "cannibals": 20519, "gases": 25919, "OSU": 17506, "woman": 3893, "provoked": 3929, "somethin": 29423, "surprise": 1893, "jelly": 15944, "1%P701!.doc": 23269, "foam": 2643, "scorn": 23966, "candle": 15833, "visualisations": 24601, "cuticles": 29323, "fervent": 30584, "examples": 1060, "inauguration": 14312, "Tried": 15080, "capability": 15835, "underage": 18464, "http://www.LoveAllPeople.org": 24752, "buzzing": 26522, "anti-establishment": 12366, "Kuykendall": 22553, "scream": 10024, "kids'": 27928, "acupuncturist": 28010, "mislabeled": 29248, "Rivertrail": 17501, "XMAS": 21983, "horror": 5068, "formation": 11617, "using": 181, "Goodwyn": 19813, "Scots": 4358, "NEW": 18992, "american": 26697, "here's": 6514, "Steve's": 22387, "me$$age": 26754, "pleasant": 6150, "delirious": 7681, "dentist": 27999, "borderline": 1376, "Huguenots": 3141, "repercussions": 22856, "Convention": 10350, "Prompt": 28102, "legs": 7055, "lakes": 31058, "teen": 20041, "basils": 17716, "Sf": 29120, "yarn": 7764, "asbestos": 12822, "620-294-3000": 24015, "postural": 2732, "man’s": 9075, "Hershey": 16013, "ripped": 24119, "snaffle": 26385, "photoscape": 26631, "routed": 12320, "tasting": 10535, "Hamill": 12538, "Palace": 16808, "majeure": 23514, "unequally": 7949, "discounts": 29531, "superstores": 18164, "refining": 7722, "appeal": 86, "act": 6636, "Transwestern": 22712, "tarantula": 17940, "Foods": 8225, "behaves": 17617, "password": 21580, "recitation": 1185, "inhalable": 20704, "sharpest": 20647, "Exeter": 4228, "upholding": 13848, "club": 5253, "ET": 19810, "reforms": 12373, "EU": 13716, "bath": 6246, "accommodate": 8132, "5:55": 11745, "doesnt": 23918, "flapping": 9000, "Silkies": 27138, "RESTAURANT": 28454, "10:16": 23199, "BBC's": 24421, "soft-looking": 31891, "Christian": 4287, "Hyperion": 21104, "late-": 6487, "sugarcane": 9739, "Harris": 14169, "Test": 1637, "Whitmore": 12334, "Catch": 19482, "Accordingly": 23741, "epithet": 25416, "Campbell": 6430, "Particularly": 23735, "George's": 14176, "flags": 13740, "empirical": 2547, "Janeiro": 26998, "perform": 10333, "Blanc": 16185, "Gracee": 28945, "Alto": 28962, "Branson": 13747, "Bering": 15277, "02/22/2001": 23361, "sacrificed": 15380, "licensing": 7508, "indistinguishable": 17968, "consenting": 24689, "Rob": 11156, "kinect": 26796, "sheets": 26289, "identified": 1162, "Practice": 18113, "barometers": 25102, "Nicholas": 8469, "2)": 10809, "hasn’t": 11779, "Jorvik": 17537, "Sheffield": 13447, "thermal": 23940, "rabbits": 11976, "Badr": 18916, "425-415-3098": 23183, "ALEX": 14360, "plume": 32734, "Lope": 26200, "guss": 27985, "own": 846, "continent": 14505, "10:34": 22756, "sprinting": 32304, "circulations": 2552, "weak": 6000, "reaffirm": 7469, "Yankee": 10948, "vigor": 11982, "old-maid": 31749, "tribulation": 32543, "Gives": 24066, "Gomez": 8584, "puppies": 28611, "Mann@ENRON": 21205, "tasteless": 28445, "strengthened": 14613, "09:24": 22916, "contemplated": 20585, "sorority": 15769, "Dad's": 21855, "Dealbench": 23089, "Parisian": 25540, "dwarfs": 26492, "incited": 20416, "room": 6502, "Seth": 28515, "reject": 7295, "focused": 117, "smackers": 11775, "diminishing": 18253, "Hare": 23048, "12-20-00.doc": 23308, "Dissolved": 27882, "60,000": 10786, "cartoony": 13615, "fathom": 14627, "listening": 8577, "Mexico's": 14675, "sweaters": 30762, "Shackleton@ECT": 23190, "watch": 5964, "shorten": 27833, "composing": 3990, "Eng.": 11719, "finest": 14649, "bobbing": 17933, "nt": 19466, "chewy": 29993, "Tropical": 25139, "ppm": 31378, "obliged": 25511, "field": 427, "enlist": 3539, "shitty": 11810, "northern": 5123, "participated": 1664, "Nadler": 14134, "senator": 19863, "elude": 30328, "Meats": 29496, "addicts": 24273, "vacated": 25081, "pallor": 30285, "THEM": 28393, "Tree": 17199, "look-out": 31605, "neighbours": 19650, "Moyross": 26149, "broached": 19851, "relapse": 28045, "awash": 20052, "guidance": 5164, "evoke": 3821, "Index": 10386, "sieve": 18396, "shrapnel": 19767, "buck": 28337, "troubles": 3914, "Granqvist": 13088, "1996-1997": 31391, "pushing": 18262, "MERCURY": 22957, "maids": 16549, "Minute": 5704, "artifact": 30469, "river": 8986, "03:43": 23823, "HyperLink": 10754, "polished": 8904, "zooming": 15718, "postings": 24323, "Dujail": 18562, "applicants": 31552, "Walmart": 18165, "throughout": 3418, "Tana's": 23055, ".5": 18044, "dissolving": 8992, "Notre": 11459, "Entity": 30134, "END": 9917, "02:34": 22165, "”": 693, "Gonzaga": 13188, "queries-views": 30123, "Continue": 6899, "smugness": 17596, "Sanborn": 23110, "Teaching": 13319, "encampment": 16569, "Uecomm's": 22217, "syntheses": 2439, "Midwest": 10346, "yes": 1994, "Ohh": 16141, "Exercises": 3231, "Yucatán": 15399, "monstrous": 9482, "rusting": 30648, "valued": 15504, "1929": 1100, "consumers": 3098, "Belgium": 5616, "…": 7235, "alarm": 18280, "Moonlight": 32132, "wrinkled": 31763, "selecting": 12680, "Repubblica": 13359, "09:40": 23386, "IE9": 12759, "E-mail": 25096, "descriptions": 2000, "sheep": 25013, "sox": 29127, "28th": 13073, "glimpses": 32235, "amended": 7322, "Combine": 18021, "there'll": 6800, "1490s": 27106, "relative": 1154, "blinding": 31167, "masses": 20311, "examines": 25175, "Myself": 29723, "Crawford": 24136, "guerrilla": 25817, "ordinary": 1247, "Edwards’s": 14725, "volcano": 16642, "Vetri": 28891, "goyish": 30722, "shame": 3168, "foliage": 9373, "Frankly": 11571, "longest": 5126, "1790": 3629, "employed": 4408, "Marines": 18615, "nomination": 4094, "strong": 1987, "aphid": 10214, "drumsticks": 32418, "Car": 28850, "separately": 3069, "Vespers": 11743, "blaming": 14040, "smartly": 17963, "ascertain": 2540, "mutilation": 15518, "Shep": 5853, "geez": 13788, "wig": 13430, "rectify": 15522, "Let's": 6294, "warps": 15576, "suffer": 569, "Bronze": 28886, "procrastinator": 18248, "Rather": 15212, "detoured": 11456, "£": 16463, "sail": 27233, "vigilantly": 31157, "variety's": 27759, "pitiless": 31218, "Its": 10045, "warms": 27820, "kinsman": 4455, "1721": 3200, "good-hearted": 30545, "mumbled": 31590, "House's": 26105, "Lensey": 3499, "flung": 31105, "Moritz": 4432, "15,000": 18915, "140": 25967, "transportation": 12933, "thorough": 5628, "Reform": 21792, "companion’s": 14822, "Pettigrew's": 31963, "Eritrea": 12967, "deputies": 13199, "29th": 11772, "tearful": 19946, "fo": 27790, "drifting": 30883, "casually": 5034, "Jurisdictions": 22509, "shortcut": 18114, "civilized": 20495, "BROUGHT": 29675, "oyster": 32622, "ballerina": 20513, "desk": 7810, "repeatedly": 8724, "profanity": 8558, "negotiation": 3081, "Interpretation": 5721, "comma": 23491, "ascetic": 5152, "photoshop": 26627, "Toes": 27156, "spectator": 31838, "crumpled": 8627, "Looking": 5237, "Moldovan": 19885, "ascending": 9346, "30,0": 17317, "idea": 2821, "depending": 2132, "insults": 9626, "encyclopedic": 24714, "temp": 27056, "BOARD": 27479, "mowed": 32099, "harrowing": 9339, "carbonyl": 11393, "1985": 16362, "everbody": 27607, "strife": 18994, "midway": 9233, "Exclaim": 17937, "especial": 31472, "nominated": 14414, "terminated": 24200, "horrors": 9473, "grossly": 19552, "Depending": 10711, "8:30": 21765, "disgruntled": 25747, "planet": 4560, "premises": 12012, "Gianna": 14177, "gleams": 30887, "worker": 21289, "elements": 40, "TRANSPARENT": 30017, "worldly": 27518, "wanderer": 30968, "pelts": 32810, "portions": 3908, "sulfur": 23407, "paddled": 24132, "Montmartre": 5343, "Hamill's": 12552, "yah": 18110, "Furnace": 28456, "Abymes": 16689, "sexually": 8488, "favors": 12035, "Sixth": 17528, "snub": 19684, "ideas": 3172, "Cavalcade": 10358, "patties": 29018, "section": 11079, "pastries": 29475, "atmosphere": 7775, "populate": 25223, "absurdity": 19766, "cry": 4064, "Forgot": 6035, "Who's": 6783, "Creator": 7945, "vacation": 11681, "subsection": 15573, "Oats": 24197, "trainable": 27429, "Regularity": 3762, "exponentially": 9337, "judged": 3997, "Mysterious": 10934, "shrubs": 9414, "Danny_Jones%ENRON@eott.com": 22918, "neighbourhoods": 18568, "fleshy": 32763, "twos": 7113, "bonded": 27230, "Internet": 7678, "Kente": 31857, "headache": 15819, "Racing": 17549, "occurrence": 11005, "mock": 31849, "bleeding": 24129, "denny's": 26902, "reference": 17241, "Euler": 3204, "vicious": 20426, "horrifying": 20487, "cattle": 17251, "retreats": 25321, "Alatorre@ENRON": 21656, "Macedonia": 14209, "Pratt": 1548, "ROW": 23579, "steadied": 31657, "Laboratory": 20727, "一葉": 4600, "hauling": 9002, "son": 3147, "!": 4051, "ripples": 9381, "team's": 11010, "roadside": 25814, "Ghost’s": 8381, "friendships": 17625, "apocalyptic": 20007, "map": 2338, "Hoping": 12215, "agriculture": 13475, "Danny": 10248, "shreds": 25804, "Yer": 32296, "firewalls": 24238, "guide": 1217, "clustered": 16546, "rewrite": 30187, "hoa": 28622, "Oil": 17402, "competent": 11701, "pragmatic": 1912, "palatial": 16968, "wildest": 31877, "42,000": 15689, "r.": 22222, "dusting": 20638, "Deacon": 24661, "Jordan": 18943, "broadcasting": 10883, "Abby": 24522, "ppl": 26150, "reneging": 14759, "athletic": 10899, "Panamanian": 13123, "automotive": 16396, "regimen": 28016, "trailhead": 15969, "Sharjah": 17172, "TAOM": 10348, "purse": 29155, "potatoes": 8652, "Phbow": 5961, "Laodicea": 5143, "Sauvignon": 16184, "seeds": 17707, "Plenty": 26909, "plaster": 26405, "terrorism": 14222, "neighbors": 11999, "Pride": 10930, "pointer": 30168, "hair": 8877, "Cleopatra": 11206, "unaffected": 6736, "Collecting": 11650, "reverent": 14088, "hatched": 6520, "Freight": 16295, "Nida's": 5640, "Phoenix": 5771, "grouping": 1950, "deportation": 31768, "philippine": 2139, "strait": 15279, "09819602175": 25328, "sitcom": 29377, "Bilbray": 23344, "phenological": 25109, "aviation": 16422, "forget-me-not": 32354, "e-mails": 23675, "concert": 12904, "Communication": 14575, "Borgin's": 32253, "Hopelessness": 24075, "RER": 26602, "contemptuously": 31152, "FREAK": 26476, "Enpower": 23557, "nighstand": 29891, "TomiPilates": 28158, "Winton": 19799, "pangs": 30829, "fought": 14783, "Engineers": 3559, "serve": 2381, "Slovenia": 10845, "slowed": 6335, "revision": 21485, "ton": 21826, "Empowerment": 25302, "brewery": 29346, "broad": 460, "L.I.T": 26148, "Cinnamon": 15889, "agar": 10307, "outer": 11825, "fever": 6760, "processors": 8082, "Inwood": 16587, "busted": 2045, "despair": 20419, "!!": 21319, "crawler": 608, "Ferry": 17311, "non-life-threatening": 18227, "Medieval": 27096, "state": 791, "been": 129, "quartet": 30439, "shook": 30488, "dislikes": 8517, "trivial": 10652, "aint": 19465, "magnet": 27932, "Details": 30121, "cautionary": 13605, "penetration": 14563, "Hands": 19874, "def": 26226, "mud": 9108, "Bevernondelibreatekin": 18093, "marking": 12918, "Ildefonso": 16957, "assist": 7280, "hopefully": 6291, "touristic": 16643, "confounded": 31072, "Grey": 15428, "Ruse’s": 15156, "larger": 1018, "Nizhny": 13065, "Gordon's": 4384, "asthma": 8798, "bloodied": 12266, "naturalistic": 1970, "commonly": 2090, "06/04/01": 23560, "pointe": 16682, "complements": 1068, "Sex": 8461, "Vere's": 25360, "Marriage": 7221, "Tagesthemen": 19460, "self-righteously": 31748, "adapted": 618, "brutality": 14118, "dancewear": 28234, "façade": 31601, "Bottles": 18414, "bean": 26957, "split": 1051, "culture’s": 15439, "laundromats": 29569, "environmental": 8138, "JI": 20726, "executive": 5300, "x35172": 21096, "Delhi": 19079, "19th": 1044, "counterfeit": 1441, "fluid's": 3292, "Friedrich": 7846, "rinse": 18368, "inducted": 10336, "enlarging": 18721, "arguing": 7367, "Island": 12453, "vinegar": 15829, "During": 2861, "magicians": 10330, "favoured": 12679, "Huble@ENRON": 23419, "Hot": 23003, "theres": 26630, "sentry": 9617, "m-": 6384, "neon": 28987, "L.L.C": 21953, "urgent": 8084, "IPN": 25158, "intermediate": 27007, "imagination": 7968, "http://www.wikihow.com/wikiHow:Right-to-Fork": 10812, "loading": 2788, "publishers": 1424, "Rummy": 19458, "sheeting": 27819, "snows": 28594, "proteins": 10636, "Sumatra": 19629, "Field": 2377, "still": 1188, "2029": 18820, "cake": 27200, "20th": 713, "empty": 8709, "CANT": 28192, "d'Ettorre": 10265, "windscreen": 32444, "his.": 11768, "Chevrolet": 14644, "reaching": 14427, "alphabets": 18095, "unhesitantly": 9497, "unleavened": 10130, "legacy": 3779, "unrealistic": 29930, "direct": 256, "pediatricians": 1298, "Incas": 18353, "Hobbit": 13771, "1/30/10": 29547, "bodyguards": 20006, "Want": 5242, "Essie's": 21093, "someone's": 29897, "glob": 29992, "admiring": 9821, "underpin": 30666, "bus": 13164, ".xml": 30118, "passion": 13349, "GSP": 31533, "There": 1261, "bodyless": 30562, "56": 12773, "Arp": 21165, "i.e": 27241, "Nicktendo64": 10271, "unnamed": 19536, "Run": 28370, "aught": 6416, "Tor": 24946, "respondents": 8186, "margins": 15120, "Applications": 23056, "Pete": 9863, "C&IC": 26470, "cooler": 27684, "oysters": 32719, "Midwesterners": 17079, "Pilot": 20599, "trumpets": 10164, "undermines": 7454, "Larson": 28105, "kosher": 30565, "candy": 18425, "t-": 6906, "Gordon": 4257, "Video": 12637, "Meen": 4241, "im": 26182, "adopting": 2882, "Inuit": 15495, "entering": 3163, "transfer": 2685, "Though": 9277, "Abbassi": 16832, "Manyema": 31935, "pierce": 9325, "Peer": 23146, "Olgletree": 23163, "delicous": 28218, "offensive": 10421, "divide": 13949, "yesterday": 6669, "Kristin": 13282, "denoted": 1729, "05/03/2001": 21916, "nigger": 31307, "companie$": 26751, "assessment": 10556, "week's": 24808, "canape's": 29484, "buster": 24800, "Offer": 27348, "300,000": 14434, "Iraqis": 18555, "parts": 4315, "eighteenth": 31971, "Jessen": 13927, "bitty": 6274, "announcing": 20867, "assisted": 9514, "beers": 15986, "resonate": 8211, "RTO": 21055, "brokered": 19018, "Deptford": 30946, "PS": 21194, "Am": 7077, "Gate": 9779, "birthdate": 27033, "sidestepped": 11662, "Sharon": 15162, "stroll": 16994, "Kinga": 23799, "Baath": 18544, "Israeli": 11245, "shortness": 15798, "loaded": 4661, "enterprise": 21773, "Phy": 23006, "Block": 13325, "tryst": 14004, "FAMILY": 29480, "usage": 2159, "McBride": 10338, "incomprehensible": 3835, "Socky": 13793, "Oct.": 22181, "cord": 27172, "swam": 9006, "crossing": 13005, "73": 20996, "holidays": 23267, "myths": 18659, "disgusting": 29109, "Award": 3672, "400": 15340, "curved": 15549, "bar": 1450, "CC-BY": 15228, "breakfast": 6325, "cheque": 24163, "Your": 6667, "Say": 6937, "Eau": 11941, "peanut": 13481, "quietness": 24607, "Rotarua": 26961, "Jantar": 27420, "Galveston": 25224, "hummus": 29990, "1754": 3506, "Kramer": 1551, "interplay": 12109, "sender": 20847, "Yahoos": 28022, "openness": 30617, "frankness": 32666, "330i": 29736, "grist": 27906, "dice": 31006, "famous": 3992, "technologically": 8275, "slung": 8621, "277": 12793, "tired": 5251, "Dead": 3003, "remnant": 25007, "qualify": 27083, "EARTHHHHHHH": 28782, "tolls": 29605, "lawful": 31356, "hold": 6657, "department": 16634, "Freezing": 8162, "ridiculing": 25411, "topped": 10523, "yeaa": 26392, "shanks": 27149, "Manual": 13556, "Institutions": 13912, "pickles": 32429, "injected": 31600, "thrilled": 11292, "Flirt": 17949, "U.T.": 22071, "adw": 26177, "Katsof": 21808, "Fernández": 1015, "saint": 5002, "faster": 8567, "dual": 5468, "shipped": 12799, "olive": 17903, "halibut": 25173, "1?!?!?": 28123, "maker": 16129, "baggage": 17279, "argumentative": 28950, "Rhodesians": 30599, "de": 964, "resale": 11652, "PATROL": 11852, "aristocrat": 31316, "despective": 25676, "manifested": 32423, "infielder": 4802, "routes": 7402, "feat": 7967, "conflating": 7632, "workforce’s": 645, "States": 1297, "appearances": 5319, "kinesiologist": 21869, "Ocho": 6312, "factor": 2697, "Sea": 5378, "Stanislavsky": 5532, "defrosted": 27863, "admittedly": 29832, "twelfth": 11461, "Enclosed": 22205, "weight": 1315, "Bird": 18070, "stormy": 9039, "sensation": 10019, "shampoo": 29976, "hitch": 19221, "applying": 2255, "Philology": 3421, "Beauty": 13634, "angel": 18214, "Pounds": 22211, "hedgehog": 32010, "comfty": 28553, "Corp.": 21294, "IMMEDIATE": 24340, "Perspective": 25731, "Fuck": 23911, "KIMBERLY": 23661, "turntable": 32471, "Inaugural": 14002, "shunted": 25240, "ordained": 5596, "agents": 770, "boiled": 27602, "accomplish": 10795, "metrics": 1480, "12th": 2857, "Indonesia": 12147, "workpapers": 23303, "professionally": 7690, "put": 1445, "Countdown": 12764, "Vera": 28930, "grassy": 9419, "EVER": 11857, "crucible": 27308, "Orders": 19882, "Aplo.": 27878, "Barton": 23342, "1348": 25375, "circulatory": 21706, "kill": 6775, "ENRON.XLS": 21422, "Magic": 10314, "shallow": 9377, "wishing": 32176, "yu": 12501, "speaker’s": 14833, "grandmother": 8698, "imitation": 30239, "Wikinews": 10195, "Light": 2094, "exhaust": 28460, "Waves": 8972, "www.caem.org": 22797, "ʻŌlelo": 7557, "appraisal": 11551, "even": 84, "comb": 27153, "CHANGE": 28187, "AI": 8274, "whittle": 11108, "nonbondad": 21429, "reconcile": 15521, "gotten": 6724, "Expressway": 17459, "Lexus": 28694, "peopled": 30932, "desisted": 27180, "maniac": 25882, "Semaine": 10121, "responding": 7257, "intense": 8361, "picked": 2015, ">----------------------------------------------------------------------------|": 22022, "Vernon": 24760, "transplant": 17741, "feminism": 25703, "Thuma": 1984, "Ali": 16822, "Nang": 19197, "vests": 24283, "Programs": 23362, "Roussos": 32934, "Calculation": 21635, "Minh": 27545, "to": 152, "blankly": 32958, "life": 3097, "START": 14277, "waving": 10042, "involves": 2262, "eh": 31309, "Gravesend": 30893, "bulb": 2091, "Turística": 17011, "recognising": 13193, "Col.": 19228, "Python": 27351, "TIME": 24018, "linen": 9110, "Crime": 24279, "Conditional": 30152, "municipal": 13218, "realistic": 10760, "Amants": 5483, "Lantern": 12889, "Latin": 3373, "farewell": 12551, "Rorschach": 9572, "succeeded": 18778, "lobster": 25169, "11:36": 23443, "comedy": 4091, "panko": 29591, "favour": 4376, "flutter": 30876, "zeitgeist": 11131, "transformed": 14920, "––": 17604, "armies": 18883, "reversed": 29408, "5,500,000": 15675, "tax-gatherer": 31008, "deed": 21284, "BED": 11867, "unforgivable": 18613, "SCHEDULE": 22310, "Disgusting": 28672, "phrases": 5659, "cosplayer": 12623, "geyser": 16688, "1590's": 25428, "spine": 9855, "SAC-D": 2580, "procedure": 7150, "Gerry": 23837, "passionately": 30795, "3.5": 22412, "Ortiz": 22294, "Assurance": 27022, "plague": 25374, "sun-dial": 32686, "decentralized": 13301, "Noori": 12099, "LIKE": 11868, "Laser": 26723, "blinds": 8137, "Jack": 4902, "acrid": 9153, "Kabul": 12104, "Andreas": 13087, "visiting": 5944, "warping": 15539, "1,650,000": 23470, "thrilling": 31870, "Engine": 29809, "clarity": 14608, "'scopes": 10651, "1600's": 17657, "knives": 25570, "XSD": 30115, "Consumers": 23885, "denying": 12119, "cheating": 18011, "Series": 4189, "referendum": 12671, "rotating": 12905, "companion's": 18199, "Breakout": 4098, "Communist": 10943, "rationale": 12668, "limes": 16204, "exceeded": 9360, "repository": 2410, "motion": 3239, "Natsu": 4603, "Kedourie's": 30651, "experiencing": 10114, "Fagan": 22352, "unapologetic": 29651, "gorgeous": 10637, "Houson": 21650, "/": 123, "2003's": 5747, "compensation": 7213, "blooded": 16359, "evaluating": 647, "eyewitness": 18558, "overweight": 32497, "Chocolate": 17827, "parchment": 32255, "e-mail": 11075, "ball": 9674, "coordinator's": 20948, "joystick": 26790, "precedence": 31257, "TASTES": 32481, "storefronts": 16513, "besieged": 14779, "financially": 12279, "routinely": 14677, "Lucia": 16492, "Electricity": 21065, "Blaine@ENRON_DEVELOPMENT": 23776, "object": 1056, "who'd": 27253, "list": 1160, "tiptoe": 31821, "laboring": 14596, "94720-5180": 22450, "Church's": 12735, "Valley": 3569, "infant": 28084, "mechanism": 910, "satisfied": 7436, "Pitt": 16265, "magnetic": 5493, "Alamo": 14777, "extant": 2763, "Motherwell": 21168, "Pool": 21810, "portrayed": 4174, "866": 17536, "Kermie": 5316, "subway": 12936, "Doctorow": 7656, "spontaneously": 31851, "Princess": 16130, "0590854950": 16673, "Bosnian": 19895, "align": 14526, "constraints": 19070, "misogyny": 25709, "expressionless": 25553, "lugubrious": 31128, "Knowledge": 10797, "Guangzhou": 4498, "radicals": 18811, "splash": 6244, "Time": 8125, "Hubble": 14604, "Caesarea": 30778, "flora": 17217, "interpret": 7272, "MARCH": 14098, "Yiu-chung": 12496, "harp": 31653, "utilise": 16353, "ex-husband": 12813, "markets": 10804, "Nasim": 22909, "revenge": 13600, "Mauritania": 20368, "scanning": 1641, "Miriam": 3788, "heifers": 21857, "horribly": 9401, "http://www.adiccp.org/home/default.asp": 18728, "O'Rourke": 5861, "Reilly": 24307, "smash-up": 31230, "Java": 2288, "PUTS": 22328, "McCullough": 23755, "sandalled": 32501, "behave": 15489, "gist": 15574, "revoke": 20266, "picket": 23162, "ENE": 20988, "servant": 19355, "wedges": 28876, "Music": 3498, "road": 6231, "11:05": 23508, "Accountabilities": 23620, "http://www.wikihow.com/wikiHow:Carbon-Neutral": 10790, "diplomats": 19669, "Fernandel": 5391, "Decoud": 25537, "http://www.equinecaninefeline.com/catalog/abode-large-metal-cage-liberta-free-delivery-p-6679.html": 26871, "sacking": 27113, "deployments": 25865, "Paniotis": 32867, "posting": 12683, "resolutions": 14224, "Connection": 25821, "Seidensticker": 4712, "supercuts": 28667, "patio": 9126, "damaging": 13490, "Wear": 17370, "millet": 27796, "king's": 16841, "A1": 17575, "citizenship": 27476, "discussion": 2517, "Capital": 8229, "Delight": 29842, "pc": 26310, "EXACTLY": 24929, "Vietnamese": 26506, "María": 5602, "punishing": 18540, "mole": 28487, "slippers": 17669, "fool": 17786, "coalition": 18759, "grained": 582, "Hmmm": 11159, "attributing": 21349, "postacetabular": 2869, "Seinfeld": 29378, "appropriate": 2156, "overview": 1001, "morelias": 28496, "luckily": 31954, "Ages": 27103, "divorces": 25586, "western": 12848, "exempt": 31433, "P&L": 22319, "Sharif's": 18854, "inherited": 14829, "Storm": 20346, "remission": 28044, "lavatory": 30551, "Hana": 4681, "legalizing": 10543, "registrar's": 27470, "Luis": 5507, "Obligation": 24874, "NYMEX": 21009, "authorizing": 22284, "farms": 8093, "concept": 1724, "compounds": 15375, "socialising": 32895, "blackline": 21719, "Strambler": 23749, "numerous": 1949, "Katrina's": 24440, "gunpowder": 26952, "twines": 16983, "Just": 6449, "canadian": 26740, "revive": 19016, "producers": 8077, "rebirth": 16410, "humour": 28679, "Laureate": 25868, "engine": 12811, "Cereal": 10502, "fiercely": 14784, "predetermined": 19067, "eyewitnesses": 19763, "Fedexed": 23226, "matter": 6402, "503/464-7927": 21391, "OK": 9882, "Least": 19481, "spell": 22099, "Truly": 15844, "Pinot": 16197, "parakeet": 26278, "sliding": 7388, "lamps": 30869, "Registrar": 27471, "litttle": 28630, "interval": 1667, "plazas": 16995, "oblivious": 19699, "wrapped": 6857, "parrot": 27209, "hiking": 15956, "weedy": 9500, "08/16/2000": 22115, "expansive": 32776, "Dykman": 21478, "probably've": 6755, "skincare": 15712, "Inner": 17582, "contemplates": 14951, "230": 29240, "Hamma": 20365, "kiss": 29756, "ceremony": 3398, "Funkhouser": 23145, "Sunday": 6152, "lol": 24239, "#review": 8256, "Cyanogen": 26163, "DVD": 27575, "folders": 30201, "Hôpital": 4028, "1910": 3348, "Action": 14249, "madness": 30428, "Sweat": 18404, "Cake": 28305, "microns": 11388, "accelerations": 15545, "couldn't": 6656, "Specialist": 21025, "appologized": 29137, "fold": 12750, "dominoes": 30907, "organizing": 4409, "urge": 11588, "adorned": 13426, "Aeron": 22766, "overcrowded": 26324, "orchestra": 16415, "PM": 13933, "year": 3397, "personality": 5181, "http://www.thetruthseeker.co.uk/article.asp?id=4503": 20249, "hovered": 30272, "Lego": 17945, "reformulated": 13829, "out-house": 32455, "Introduction": 332, "contracted": 19883, "Methylene": 27903, "41": 14961, "Heald": 13464, "scale": 1019, "risotto": 28815, "spartan": 24286, "loan": 11534, "squeal": 32219, "Hoof": 27965, "garden": 8881, "Tu": 14867, "addressee": 3731, "http://pageturnpro2.com.s3-website-us-east-1.amazonaws.com/Publications/201803/15/83956/PDF/131668002208352000_CPBJ033018WEB.pdf": 15132, "nurture": 24680, "PST": 23079, "Headley": 12291, "there’ll": 11776, "valid": 13694, "flanks": 30941, "26th": 22348, "Martha": 6718, "Low": 16102, "regrets": 20917, "consented": 5981, "fleshing": 23319, "recycling": 2222, "Quinn": 30228, "vacant": 31694, "Darius": 25388, "permeate": 20282, "protections": 7622, "Petruck": 3791, "snacks": 18155, "helmets": 9275, "genre": 5799, "Green": 14433, "paves": 14927, "toenail": 29405, "disciples": 6638, "idol": 30914, "Strategy": 22416, "sealing-wax": 31267, "Outfielder": 4773, "crashes": 26159, "handlebar": 6172, "hindered": 25305, "vocabulary": 13654, "!.": 28054, "deregulation": 22179, "curtain": 27173, "noisy": 3399, "relinquish": 32781, "integration": 13857, "hypnotic": 17803, "punish": 8757, "ceiling": 4582, "beginner": 26707, "Skidmore": 13321, "rule": 1758, "discharge": 3680, "Sketchy": 29875, "sarcastically": 29926, "seasons": 2944, "this": 137, "variation": 1699, "classified": 14936, "wordy": 24636, "celebrates": 10956, "dignitary": 20510, "filing": 20648, "polution": 25246, "absenting": 19797, "49": 13471, "SW": 21430, "review": 1452, "Castle": 103, "Parry": 1099, "Loretta": 22465, "emphasize": 7175, "Weapons": 14285, "Goonewardena": 28319, "Serotonin": 15762, "Objects": 14969, "Désirade": 16650, "Samuel": 22989, "Stéphanie": 3896, "detach": 27363, "Kerry": 12179, "anyones": 29486, "rows": 21710, "vomiting": 27608, "farm": 8121, "Liquidweb": 28881, "actor": 4081, "errors": 2265, "Subcommittee": 11573, "fingernails": 32287, "Nord": 29332, "flown": 9475, "valuing": 22685, "specimens": 10616, "UTH": 26892, "CUISINE": 28568, "freak": 6801, "Klimberg": 23773, "shoreless": 30860, "motor": 15123, "Mom’s": 8851, "cartoon": 6847, "1710": 3525, "attracted": 3844, "ran": 9318, "pale": 8038, "spaceflight": 24777, "pursue": 1894, "embedded": 7851, "SSD": 23097, "soul": 5091, "pegged": 18301, "floors": 16828, "Daniela": 1500, "Credit": 15224, "metres": 24118, "fleeting": 25024, "addresses": 22391, "addicting": 28522, "sectors": 2130, "laundry": 21318, "softly": 31916, "Earlier": 15056, "interviewer": 23367, "hooking": 18197, "poised": 30412, "RI": 19876, "THING": 27025, "musicians": 11024, "pollution": 1199, "gloss": 5688, "externals": 30374, "fantasies": 30699, "Arguably": 14860, "bell": 8659, "updating": 30057, "BRAWLER": 29360, "prodded": 32920, "Suerat": 21162, "Hugh": 5774, "ants": 10197, "Kittie": 11708, "Above": 14235, "accented": 28658, "University": 16, "poems": 11038, "screw": 18161, "11:00": 15731, "flirtatious": 17996, "Gilmore": 5702, "tears": 11091, "Pamphlets": 17292, "Window": 28108, "three–day": 3664, "eager": 4651, "intensified": 31245, "Fits": 6500, "lunch": 6679, "practical": 7954, "baseline": 10735, "lightest": 21777, "bookshop": 32342, "ribbons": 26658, "Universe": 3006, "direction": 212, "predisposed": 9585, "澹": 14907, "Distance": 15611, "Parra": 23747, "compose": 29833, "PRS": 22866, "delivery": 14521, "Notes": 10924, "glamorous": 10893, "Jude": 18215, "sent": 3604, "Y": 10277, "threatens": 14227, "grenade": 19597, "Worm": 5317, "bottleneck": 13166, "07:55": 21188, "Solomon": 13047, "cap": 23684, "Stoker": 4149, "observed": 1710, "one-sided": 31440, "attractive": 16335, "McVeigh": 24416, "mould": 29299, "sympathizer": 20649, "fracture": 7051, "loosely": 9531, "interceptor": 19191, "ships": 9238, "Clinton": 10418, "storage": 7604, "Business": 15129, "lingua": 10066, "correctly": 7579, "missions": 11313, "delegates": 11439, "virtuous": 10830, "Dario": 13125, "genocide": 19086, "Obscurity": 4678, "-----------------------------------------------": 24595, "Prudential": 28704, "birthdays": 31975, "feel": 1168, "Max": 10118, "APPLICATIONS": 23031, "surrendering": 30698, "probe": 19888, "Floridian": 20772, "Talk": 5243, "miracle": 8566, "disclose": 22502, "Flirting": 17964, "Critics": 4143, "experimental": 177, "stands": 5660, "endorsements": 26090, "periodizing": 27104, "petting": 28938, "military's": 18852, "Mertens's": 13103, "invisible": 30288, "reputed": 14491, "slack": 19772, "steak": 26554, "bias": 580, "Hee-Chan": 13077, "Dwibbling": 6823, "Apps": 28601, "Davis": 7526, "firstly": 4452, "swift": 14463, "honors": 4834, "Byrne": 14458, "approximate": 28625, "Examining": 10182, "depend": 233, "Adolf": 16920, "troupe": 5461, "hermit": 5017, "sun": 9955, "Angie": 22402, "websites": 10814, "detailed": 997, "groomed": 28326, "Minutes": 19187, "prayed": 24315, "Nowhere": 8140, "brass": 19072, "Odaras": 31990, "demographic": 23152, "Rev.": 19924, "Ernest": 3979, "Deemed": 22258, "Mama`s": 21238, "sage": 7236, "raising": 2467, "inquiry": 14899, "abandoning": 18977, "succint": 20252, "beginning": 195, "trademarking": 22498, "handicapped": 25666, "WORRY": 11836, "nations": 11599, "traditions": 14193, "literature": 1046, "hand": 484, "CIS": 16479, "carrying": 2520, "thousands": 6157, "Beijing": 16779, "Mother": 21322, "blows": 9604, "adapt": 15512, "certificate": 25444, "annexation": 18957, "tire": 28692, "outfits": 12617, "Freewinds": 12805, "seized": 12714, "nmemdrft8-7-01": 22311, "terms": 1134, "stride": 26196, "319": 17496, "procession": 10165, "causality": 591, "Husseiniyas": 19299, "creases": 9140, "payout": 23428, "GREEDY": 24848, "HIM": 27953, "Brazilian": 27000, "Pag's": 9639, "commemorated": 3121, "Charmaz": 3073, "Roy": 11403, "laptop": 20624, "destined": 12635, "drums": 11040, "Bernoulli": 3101, "scrubbed": 32207, "commanded": 19781, "dynamic": 5551, "Libertarian": 10376, "rankings": 1467, "trillions": 24514, "pigsty": 32190, "curves": 15575, "Evening": 12025, "Hasidim": 30515, "F.O.B.": 23015, "sump": 26669, "oregano": 29641, "Łódź": 16856, "worldwide": 13450, "Angostura": 10521, "Death": 25999, "Amazon": 15302, "Ingredients": 17837, "observations": 2590, "meant": 649, "stressful": 16088, "seminal": 3695, "BACK": 29677, "Follow": 1963, "bladder": 24064, "sloping": 10007, "artistically": 7691, "dwindled": 12947, "apply": 2283, "Fairway": 16594, "subreports": 30213, "pagan": 13520, "back-to-nature": 32954, "nonexistent": 28949, "behaviors": 3100, "networks": 2941, "Pager": 21461, "1,613": 25763, "comments": 3067, "stringing": 27632, "Tyler’s": 8704, "doubled": 13114, "Tsar's": 4356, "Computational": 3673, "treacherous": 9494, "CONFIDENTIALITY": 21685, "disappeared": 8888, "saved": 7927, "Breathing": 6833, "Convicts": 31906, "Architecture": 4474, "robot": 12092, "silverware": 28614, "material": 3030, "Critical": 23596, "dozens": 12884, "exercises": 5630, "Natural": 1033, "poetic": 1112, "Olsens'": 5766, "poet": 4631, "shipping": 8156, "3.": 2364, "complained": 11964, "context": 1559, "Daddy": 14178, "rules": 750, "respectively": 738, "carcinoma": 18672, "understands": 19172, "customizing": 30079, "scuffling": 32881, "apologizing": 31683, "expiration": 16036, "Mare": 27976, "melted": 15276, "blindly": 20072, "Habits": 21549, "finesse": 23357, "#finances": 7829, "engagement": 5827, "mouths": 26380, "hopefuls": 12966, "V": 8603, "corresponding": 5657, "M1": 17560, "Magicians": 10313, "Faster": 23992, "curator": 13284, "enormous": 1739, "mob": 14319, "202.785.0786": 22814, "fart": 30502, "Heritage": 16780, "Cummings": 30712, "OCD": 13588, "starship": 15581, "oblivion": 28871, "offense": 17346, "Zócalo": 16958, "Thurday": 11440, "scruff": 27696, "sorts": 13565, "19.5": 5188, "Agrarian": 7942, "legit": 24253, "Search": 24496, "Ellon": 4274, "Pioneers": 26041, "prolly": 29708, "夏子": 4606, "Beghe": 12347, "Disclaimer": 23498, "restless": 30520, "Overtures": 11284, "pickling": 19789, "Lihaib": 19337, "kidney": 24082, "damage": 6763, "appointing": 31753, "unmarked": 32532, "breakthroughs": 8362, "carbon": 7922, "exams": 9899, "irritate": 12015, "远": 14905, "flatten": 26484, "confidence": 1428, "pip": 31795, "FRIES": 28573, "woods": 31011, "helmet": 9312, "NPP": 12421, "BTS": 15876, "backcloth": 31110, "worms": 9470, "Baileys": 10519, "99": 19878, "Gut": 32645, "Razaq": 19325, "suspected": 5144, "Stormtroopers": 12612, "Kickstarter": 13773, "deprecating": 17993, "repurposed": 16867, "compelled": 4657, "rise": 982, "Turgenev's": 5456, "Kobey": 28079, "Hemisphere": 15299, "jitney": 16529, "turkey": 21967, "lying": 10059, "categorically": 7427, "capped": 17359, "setups": 10267, "Cara": 8776, "conceptual": 2545, "Won't": 32419, "sponoring": 24519, "Th-thank": 32124, "testimony": 20777, "responsible": 799, "bulk": 10702, "TERM": 11862, "salinity": 2561, "headset": 8553, "Ihara": 4720, "stimuli": 1964, "priced": 10526, "smartest": 27517, "Botero": 2531, "landmark": 15973, "Mahault": 16693, "Ghaza": 13181, "Recommend": 28373, "Christians": 5168, "424": 12483, "Switchboard": 24389, "Endangered": 25910, "recreational": 16376, "aching": 32109, "linking": 1393, "P.M.": 14591, "Klingberg": 1575, "cultural": 1979, "Armstrong": 4176, "twilight": 9956, "haven't": 9823, "mirrors": 17692, "extinction": 9972, "from": 8, "bank": 7299, "netting": 21647, "reconciling": 22599, "Richardson": 23610, "Raw": 20024, "grandsons": 21752, "Gazing": 31627, "Cargill": 21598, "rebuilding": 11541, "Ministry": 13153, "testifying": 13734, "over-priced": 28960, "http://news.bbc.co.uk/2/hi/programmes/this_world/4446342.stm": 20157, "drones": 13955, "07/18/2000": 22176, "899-4425": 22011, "investment": 13907, "brianp@aiglincoln.com": 23794, "thx": 27779, "84,121": 12385, "Driving": 17579, "virginia": 26273, "aboard": 9095, "announced": 5831, "chances": 11550, "5C": 9763, "http://www.cic.gc.ca/english/contacts/index.asp": 27032, "Shankbone": 11126, "transports": 21705, "hid": 9278, "Kubler": 18233, "passage": 5939, "Practicing": 15511, "Warming": 25205, "deceive": 25693, "non-proliferation": 14246, "backbiting": 31327, "Sudan": 12122, "Judiciary": 14109, "losing": 8458, "Klingon": 12600, "gibbering": 32140, "Mrs": 28848, "paraphernalia": 20170, "perishable": 8085, "am": 3932, "segment": 5287, "4.5": 19057, "collisions": 24558, "Babalon": 20210, "staircases": 4575, "bright": 9120, "perseverance": 10874, "Currency": 21670, "Hosanna": 19451, "Subforms": 30212, "crystal-clear": 31513, "travelled": 5102, "Start": 15887, "re-embarking": 4310, "quivered": 31196, "careers": 20885, "thereby": 600, "Alito": 24704, "sumo": 26934, "Siege": 3575, "Whenever": 18264, "layer": 24043, "turbines": 13956, "Goldsmith": 7415, "wielding": 24140, "quote": 5085, "redundant": 15154, "jejudo": 26586, "sushi": 26936, "Ballroom": 29267, "Unfortunalty": 29628, "coax": 7776, "./": 23656, "Visas": 26467, "parma": 32643, "stem": 1440, "TCO": 21812, "manoeuvre": 25715, "Vikings": 16436, "Cintra": 23193, "skyscrapers": 15589, "22": 585, "marginalized": 8036, "Nashua": 25218, "McCallum": 26034, "Forthwith": 30930, "Tatum": 17132, "broomstick": 32044, "Aug.": 24137, "bodytalk": 28052, "????": 28193, "There's": 6277, "orbiting": 14623, "lawlessness": 19614, "funerals": 29093, "Beware": 28307, "Yanhee": 26639, "321": 14910, "COURT": 25721, "Trail": 17503, "Adidas": 15960, "http://i.imgur.com/Xytex.jpg": 27166, "5/18": 20935, "town's": 24436, "conveniently": 26908, "basically": 6270, "whereabouts": 19351, "Winter": 10355, "Enforcement": 14163, "niche": 29806, "generally": 1945, "oldest": 14625, "F": 5683, "lived": 2846, "permutations": 31881, "Mmm": 6766, "Driver's": 10822, "MAY": 29939, "combating": 31430, "gullibility": 30446, "hop": 26986, "Leon's": 28196, "JFK": 16540, "excite": 14963, "Skin": 2206, "Patty": 8593, "Tigers": 19003, "governor": 7866, "policing": 14136, "aftermath": 16923, "caught": 4754, "all": 441, "Dasovich": 21347, "Grab": 18100, "yan": 12414, "ill-placed": 32373, "Adriatic": 5019, "efficacy": 603, "la": 3439, "televised": 10880, "Strasse": 16922, "SELL": 11921, "I.=": 16804, "such": 491, "healed": 7068, "bubble": 18140, "precisely": 19103, "Night": 4743, "logging": 10274, "red-haired": 32135, "Jehad": 19619, "divorcing": 7608, "North": 560, "extreme": 8149, "passionate": 4643, "otherwise": 1756, "unfolds": 8313, "needs": 1942, "tumbling": 9205, "|--------+----------------------->": 22017, "lied": 29182, "wage": 7156, "demonstrates": 678, "Umm": 20088, "Range": 28106, "insight": 229, "coincidence": 1782, "confident": 14440, "snags": 12054, "vice": 7719, "grazing": 28979, "portrayal": 11134, "botanicals": 15933, "http://www.thekcrachannel.com/news/4503872/detail.html": 19435, "multi": 26729, "noted": 1165, "HE": 28750, "Joe_Lardy@cargill.com": 21596, "OPEN": 11509, "subject": 573, "picnic": 16783, "innovator": 15095, "channeled": 20470, "accumulation": 25846, "François": 5412, "Government": 11579, "lever": 9733, "Owwww": 9896, "premiering": 13790, "refrig.": 11687, "erase": 14137, "understandable": 20563, "Repair": 28426, "Vo": 27732, "re-trained": 29580, "entered": 4300, "Americas": 15263, "you're": 6202, "GOVERNMENT": 24452, "Thoughts": 29175, "dorm": 15560, "guarantees": 766, "gloom": 16156, "mild": 9874, "'n": 29571, "gleaming": 9431, "Che": 12404, "7.64": 1656, "Blue": 15756, "Enjoy": 16234, "tops": 17362, "motorcycle": 18644, "Feet": 9333, "vistas": 9413, "Efforts": 4615, "24.2": 15533, "crowds": 12941, "basing": 18081, "LIPA": 23775, "gratified": 14465, "Standard": 10506, "Claudia": 12473, "plying": 31525, "blaze": 30985, "Balkans": 30844, "Shiu": 12509, "Attitude": 28210, "diagram": 15610, "vomited": 28498, "Somehow": 6774, "#istandwithahmed": 12216, "lost": 3986, "plunge": 17967, "inform": 79, "commanding": 9287, "3/8/00": 22526, "topical": 607, "Her": 4491, "BY": 8015, "Santos": 2393, "adjust": 2881, "Palaces": 16821, "markup": 12788, "HANDLE": 21525, "BP": 21578, "armament": 25791, "debuted": 4922, "emissions": 2177, "gravel": 26708, "castle": 13612, "Jacob": 100, "plowed": 9113, "formal": 5634, "uncoiled": 31063, "wicked": 17828, "Paperback": 28385, "stampedes": 13176, "Arabs": 11187, "shocks": 30576, "sony": 26208, "sugar": 13535, "negligent": 7410, "autism": 1395, "invoke": 7503, "courses": 14549, "impact": 51, "916": 22376, "mergers": 22549, "Bland": 27623, "stamina": 24037, "inspiring": 28474, "smirking": 32268, "Awaiting": 23043, "hydrocele": 24081, "Dinghies": 17250, "outlier": 15662, "blandness": 31903, "RELIGIOUS": 24647, "penultimate": 3032, "guilty": 15465, "prints": 13268, "Directorate": 19654, "KilliFish": 27838, "luna's": 29706, "operate": 19515, "bones": 2790, "wavelength": 13754, "positive": 408, "Brendler": 6523, "deserves": 12863, "beige": 16166, "robust": 1757, "Into": 5234, "60,760": 12454, "Today": 2070, "Sempra": 23609, "amalgam": 25739, "innocently": 31926, "Hits": 5327, "Cabernet": 16226, "enlargement": 2901, "consideration": 5669, "Inch": 32151, "false": 8761, "politely": 21355, "420072": 24467, "MILF": 20685, "soldier's": 26002, "additive": 28029, "stain": 29153, "moans": 9898, "reluctant": 23636, "Well": 6030, "dog’s": 8976, "Kusanagi": 8259, "Tycoon": 5511, "reads": 13010, "retaliated": 12883, "Entities": 22046, "handily": 25447, "Papacy": 6543, "offline": 25330, "atrophy": 28005, "birdy": 26854, "windier": 27835, "Conservatoire": 5346, "sideways": 9881, "Colors": 16035, "puffing": 23933, "Languages": 2408, "Symbiote": 12606, "penny": 28452, "departures": 16498, "Queen": 4487, "JPL": 11327, "Yiddish": 30538, "Oklahoma": 5554, "drying": 20796, "Phenology": 25110, "categorizing": 15026, "US": 3444, "cayenne": 15841, "(:": 26340, "bta": 27013, "Hanged": 31159, "tees": 20107, "artist's": 6089, "Ariel": 18881, "statements": 7193, "Minister": 12171, "Teco": 22683, "Stadium": 4509, "reproduction": 5692, "determiner": 24801, "408": 25913, "Armada": 21769, "retain": 11673, "trafficking": 12176, "http://digon_va.tripod.com/Chernobyl.htm": 18697, "IV": 20913, "Appel": 21154, "Mind": 24616, "programme": 20920, "eMachines": 26319, "justices": 7560, "temporarily": 19538, "Pea": 27154, "islands": 16256, "pagen": 29125, "sings": 13765, "habitation": 19087, "Stevens": 28563, "laying": 7097, "Yack": 6977, "simplified": 2319, "WORTH": 28906, "Julien": 5305, "expressed": 2028, "process": 1522, "Thank": 6306, "Conditions": 23022, "yorkedness": 29644, "SAID": 29691, "Excel": 29817, "We’ve": 8814, "ARe": 29958, "height": 3290, "Specifically": 20002, "hardest": 10705, "stress": 17815, "Diwaniya": 19288, "fourth": 4589, "retracted": 28314, "cyborg": 8292, "successive": 14509, "career-wise": 25259, "distracting": 15705, "August": 2126, "purposefully": 15211, "universal": 1752, "uncertainly": 10036, "759933": 21428, "Casualty": 23784, "mixed": 7385, "mid-August": 17163, "reciprocate": 17344, "sunburn": 2203, "podcasters": 10910, "waggled": 31986, "Aerogel": 11365, "Jenna's": 5263, "roads": 11628, "pipette": 27901, "dilated": 31195, "Ibrahim": 19136, "keen": 17642, "Brideshead": 4122, "Garibaldi": 25546, "divorced": 27970, "Content": 10973, "ambiance": 16986, "Lysa": 21382, "records": 9938, "Microscope": 11359, "AS": 13477, "frenzy": 18268, "teeth": 7013, "Brown": 9331, "todays": 28912, "holes": 17354, "#'s": 22320, "!!!!!!!!!!!!!!!!!!!!!": 26328, "Auckland": 102, "CONTAINING": 11926, "Bank": 18786, "Use": 1493, "Guatemala": 15386, "acceptance": 4724, "chaotic": 13652, "landlocked": 19656, "curated": 682, "Relleno": 28532, "greeted": 14441, "poetically": 32499, "W": 16564, "turkistan": 27757, "pr-": 6754, "cacao": 15333, "Murungi": 14558, "courts": 7414, "patent": 7923, "patron’s": 15458, "revolve": 17609, "jingle": 8658, "jet": 16175, "inning": 4885, "Il": 25470, "Irish": 4450, "prevented": 14428, "FFFF": 10359, "they'll": 6798, "right": 782, "Pet": 26422, "Russell's": 3376, "avenue": 16790, "Burnell": 12962, "specimen": 10663, "SALAD": 29671, "Carrano": 2770, "warfare": 12877, "texting": 26145, "confidants": 30675, "Miranda": 5605, "wizard's": 32240, "elf": 32130, "Democrat": 14438, "substantiating": 22662, "game": 751, "BAY": 28576, "A'nandamu'rti": 24034, "resemblance": 29994, "gooseberry": 16189, "whistleblowing": 19401, "Corn": 15314, "Bexar": 29908, "awareness": 4728, "hund": 1733, "angst": 8430, "Kinsler": 4949, "Dreams": 24003, "despondently": 31202, "disciplined": 14056, "Robin": 16289, "reborn": 17062, "Disaster": 11528, "ruts": 8335, "fundamentally": 1876, "extend": 2371, "113": 26037, "Galleries": 13290, "defied": 23673, "19": 527, "leon.branom@enron.com": 21147, "earmuffs": 26077, "sea-going": 31148, "sticky": 31987, "Dr": 4431, "nearest": 16536, "intuition": 24641, "privilege": 14425, "2543": 24761, "Wolak": 23347, "construe": 7265, "hustle": 15784, "interferometers": 2604, "Bilmes": 25867, "US$": 12293, "toys": 2968, "overhead": 32105, "940": 26222, "product": 10564, "fabolous": 28215, "diffuse": 15326, "Eve": 3794, "objective": 2355, "intial": 21198, "Huber": 22762, "45r.p.m.": 32472, "enfurates": 20032, "silhouette": 11433, "foxes": 26660, "1505": 5149, "Denmark's": 17209, "disputes": 19161, "Morrell": 26126, "Kate": 5759, "Receipt": 22026, "CruiseCompete": 27234, "chartering": 16287, "cook": 16128, "Bobby": 20827, "how's": 31897, "patriotic": 11043, "Goddard": 22488, "revalue": 20915, "treaty": 20816, "Huskers": 21179, "thierry.poibeau@ens.fr": 970, "Cashion": 23137, "mutant": 2269, "congratulated": 15502, "deadline": 12981, "Chevalier": 3873, "leitmotivs": 16953, "Grille": 26560, "defuses": 13708, "Alibek": 20699, "melt": 27291, "Risk": 20919, "272,000": 23467, "atm": 26499, "confined": 24882, "quitting": 28925, "eluded": 30454, "posterity": 24675, "Agenda": 31505, "'07": 29361, "herb": 17704, "guild": 24257, "relates": 7391, "done": 1602, "RBIs": 4841, "Charge": 28201, "gardeners": 16622, "analyses": 583, "sidewalk": 7614, "boss's": 27570, "Saw": 16059, "removed": 7643, "knit": 14035, "discrimination": 27268, "McDonalds": 17436, "rooftops": 8991, "hydration": 27619, "lobbyist": 19115, "offers": 228, "mid-January": 21321, "devotional": 134, "GO": 11878, "toy": 26855, "exhausting": 12937, "blotted": 32854, "23,000": 25819, "memoir": 3250, "americans": 27119, "seventh": 13892, "below": 1933, "Lynne": 6347, "Trivia": 22097, "coats": 28080, "Glenn": 16423, "thriller": 5769, "notes": 5171, "CNS": 31460, "defendant’s": 14680, "wisely": 18342, "Europe": 3295, "Mapping": 26234, "ROLLS": 28802, "narrator": 11291, "ideologized": 13242, "diaper": 18168, "newly": 5884, "peg": 18299, "Bangladesh": 19126, "corrections": 2637, "Petri": 13845, "asset": 19384, "vs": 14938, "vegan": 5333, "oversight": 13636, "intoxicating": 20142, "Rainer": 5512, "Notice": 20998, "CSIS": 25772, "Interface": 26786, "SUCKS": 28663, "continues": 3780, "flagship": 14522, "2014": 250, "run": 4883, "loss": 858, "Canyon": 23397, "Idiot": 9902, "Jet": 11990, "2nd": 2246, "topple": 27724, "thirds": 7085, "Hermann": 3995, "boil": 6215, "consume": 2144, "57": 26066, "menu": 15456, "L'espalier": 28222, "Vet's": 29630, "11:25": 23797, "650": 25831, "Projected": 26046, "Wherever": 20671, "Aries": 25249, "discreet": 4644, "dreary": 30300, "reliance": 21496, "chorion": 27896, "Levico": 11253, "BJs": 29282, "shoulders": 8836, "sleepers": 20875, "callum": 26303, "formatted": 21714, "pup": 27390, "interactivity": 30165, "jiffy": 7912, "college": 1285, "Sells": 7314, "#systemanalysis": 7658, "Cancun": 16453, "Duchatelet": 3980, "poker": 23706, "Hammond’s": 7878, "mmbtu": 21397, "frazzled": 7723, "take": 747, "formalisms": 3751, "attached": 2858, "nightclub": 16694, "grandpa": 6819, "420": 4968, "Preheat": 17865, "outrunners": 10081, "scents": 15937, "Travelling": 27235, "hooting": 32024, "em": 6158, "launch": 2570, "Bellini": 5148, "incapacitated": 9624, "Tenured": 333, "cynangon": 26169, "dischord": 23962, "span": 1561, "Paine": 7944, "spilled": 32771, "etiquette": 15426, "veer": 32783, "54th": 13109, "evolve": 7253, "http://www.wyndham.com/Washington_DC/default.cfm": 22815, "timings": 29279, "need": 1030, "habitat": 16269, "stockpiles": 18904, "Art": 5, "wanton": 31229, "Guantanamo": 26073, "outlines": 9982, "hype": 29621, "Ca": 8634, "10:45": 15852, "07/14/2000": 22122, "Fujairah": 26766, "LOW": 28407, "mauling": 24120, "paving": 20562, "burger": 26703, "instantaneously": 29216, "cum": 5561, "identification": 10593, "aversions": 16165, "fan": 2973, "Shots": 5542, "metaphysical": 15159, "nurtured": 19616, "republics": 20538, "Cruden": 4298, "goblin-driven": 32315, "6.1": 23475, "stretchy": 15747, "steer": 14523, "somewhat": 6021, "rubble": 6861, "starchy": 16169, "Dogwood": 29351, "flexed": 17674, "CDEC's": 22710, "sentences": 3811, "pieces": 4573, "bullet": 7354, "collections": 132, "favorite": 5836, "interpreting": 15322, "Feathered": 15378, "Universal": 16085, "upset": 8847, "unravelling": 19457, "Theft": 29722, "star's": 32003, "POINTS": 26329, "wheat": 13451, "Incitement": 20452, "479,000": 15672, "WILLING": 11920, "lacks": 15089, "Gravity": 15535, "steamboats": 31067, "rites": 13162, "Smiling": 30252, "4G": 26158, "committed": 11265, "harmony": 14885, "MOVE": 28405, "Vestry": 24659, "media": 2433, "nightlife": 16661, "apricot": 17892, "Iraqiya": 19258, "instinctively": 9638, "E.T.": 22443, "3d": 26828, "outlived": 12801, "41.": 14982, "Wandering": 30376, "disabled": 10868, "INSULTING": 27356, "insurgents": 18600, "Birkholm": 17310, "Comeback": 16390, "Lautrec": 21161, "02": 22342, "TC": 26443, "hooded": 32688, "beads": 31295, "ti": 29552, "accomplishments": 5540, "Atahualpa": 25463, "defense": 7349, "Orla": 26154, "furnishings": 28653, "www.designofashion.com": 29812, "James": 4401, "Spokesperson": 12184, "night-owl": 30317, "50": 2386, "Arosa": 11727, "misinterpretation": 576, "escaped": 8314, "song": 17989, "introduce": 2286, "http://tong.visitkorea.or.kr/cms/resource/81/188181_image2_1.jpg": 26583, "bagels": 28096, "NDI": 29135, "Done": 21267, "Ebor": 17550, "02:02": 23460, "restaurant": 11438, "dealing": 5795, "iii": 23253, "Fahim": 19706, "2301": 21884, "Ant": 15616, "---------------------------------------------------------------------------": 24321, "7034": 21897, "declarations": 19068, "Bangladeshi": 19497, "lv.": 22199, "masquerade": 25654, "ancestry": 3340, "Rough": 27407, "supply": 8158, "alert": 12844, "mailings": 20605, "Apr": 21930, "rock": 6227, "WalMart": 27513, "Ghirlandaio": 5084, "USI": 13263, "moustache": 32050, "Legit": 24250, "Started": 12916, "rail": 17133, "unofficial": 19545, "catches": 18312, "Merseyside-Egypt": 32662, "Vol.": 25422, "Posted": 23947, "extends": 25857, "Humanistic": 6560, "resolved": 14210, "monitored": 22577, "modem": 26526, "Festus": 31743, "employee": 20712, "identity": 3984, "brink": 19009, "cucumbers": 27442, "Magazines": 10709, "purple": 11471, "inflating": 1245, "Mourvèdre": 16249, "Monet's": 22194, "geography": 8136, "weights": 22278, "Entrepreneurial": 15053, "Wen": 19174, "Harbor": 17103, "pluralism": 855, "Uranus": 25318, "Eusebius": 4960, "comforts": 27913, "Thibaut": 13111, "Aztec": 15288, "squares": 10282, "suited": 10970, "Eng": 11766, "identities": 30391, "trackless": 14012, "opens": 8291, "Cure": 26232, "limb": 2773, "fallen": 6032, "Listed": 4806, "shelf": 627, "engineer": 3511, "revenue": 7913, "lawyers": 19928, "trinity": 6297, "PLATE": 21530, "industry": 3018, "ABOUT": 11837, "Nationally": 7904, "album": 8746, "Kent": 11738, "cleared": 12004, "alcoholics": 13527, "0.3": 18046, "COB": 22375, "bolted": 32115, "Brittany": 29383, "articulating": 21846, "packer": 27550, "superlative": 9608, "rosewater": 17907, "Jelly": 15947, "ideation": 24097, "confront": 11295, "amnesty": 12988, "tall": 6851, "funding": 18781, "GET": 11918, "Finland": 10276, "bartending": 5219, "welfare": 7859, "Aldo": 25106, "counselor": 28934, "chopping": 11954, "estimation": 13473, "regrettable": 20896, "Analyst": 21145, "intruders": 29819, "Hiroshima": 24431, "non-violence": 20334, "pipes": 30314, "http://www.cic.gc.ca/english/immigrate/skilled/assess/index.asp": 27076, "Friends": 11516, "Noel": 22854, "11/1/01": 21439, "QE2's": 32561, "semi-automatic": 26725, "Mandros": 19943, "RAPHAEL": 25335, "Presidential": 5711, "glory": 5980, "mainstreamed": 14537, "Human": 6628, "Paul": 3744, "duties": 13023, "Puree": 17780, "Quebecker": 24104, "acutely": 18880, "interim": 5588, "emerge": 12358, "Rosemont": 23638, "dom.": 27143, "yorkshire": 26184, "Tires": 28695, "Beyond": 2404, "Oscar": 8401, "echo": 9213, "Places": 16373, "withdrawal": 19312, "yacht": 30916, "separates": 15651, "oozes": 17191, "pottery": 15341, "Volumes": 21435, "Ideation": 24096, "adherent": 20200, "Misto": 28298, "joints": 24056, "Missed": 29087, "improved": 372, "Black": 9796, "corrected": 2683, "exploited": 3331, "sirremático": 1148, "Feed": 6690, "liberation": 16927, "Premadasa": 19056, "Shannon": 28374, "hadn't": 9609, "hindrance": 18291, "symbiosis": 8354, "vision": 4570, "Damascus": 14218, "vain": 19376, "seaward": 30898, "quarrel": 31826, "statue": 6850, "x.x": 26850, "ITS": 29669, "immensely": 18985, "graduates": 31936, "constructed": 15374, "slapping": 32233, "bettering": 15724, "off-": 13649, "totalling": 29609, "doctor's": 16159, "bye": 7076, "reintroduction": 25044, "Boi": 25493, "Alia": 12238, "survivors": 14191, "Supreme": 7518, "ALONE": 29442, "practice": 170, "simplifies": 30056, "Hera": 13515, "http://www.speedtest.net/result/1155244347.png": 28200, "Andrei": 30774, "Yvan": 22698, "mercy": 6602, "Vincenti": 13226, "myTouch": 26157, "craziest": 29436, "euros": 13216, "scraping": 30501, "hurting": 6944, "Weasley": 32075, "Pachomius": 5913, "Interiors": 7131, "fatigue": 31944, "adage": 11230, "requirement": 19233, "Treaty": 14278, "vegetable": 17850, "Federation": 18662, "MDGs": 14530, "ringed": 9167, "Moussaoui's": 20582, "America's": 11099, "continuous": 620, "LaGrange": 28472, "segmented": 2049, "Matters": 11286, "self-questioning": 31625, "Lung": 12897, "instilling": 24300, "cunclude": 26393, "youthful": 24039, "Moreau": 5340, "reluctance": 14728, "2019": 2250, "Dari": 22775, "Sunburn": 25793, "baseball": 4797, "•": 14585, "november": 26389, "door": 6079, "Wonder": 27837, "comparability": 1880, "surrounding": 1415, "bypass": 23287, "generalized": 3747, "crow": 9147, "12:45": 23541, "visitor": 329, "shove": 13714, "trips": 11001, "screener": 13778, "gauge": 17605, "shied": 32001, "month's": 21588, "Committee": 11012, "minorities": 13879, "spicy": 16223, "Nato": 19899, "chinese": 27252, "interracial": 24682, "kosas": 24046, "ambitious": 5983, "reclusive": 19020, "bidders": 22732, "volcanic": 16268, "friend(s)": 18106, "vaulted": 24794, "packet": 13657, "Fixtures": 28417, "rugs": 31558, "Jafar": 20598, "barbers": 31918, "responded": 1991, "regulators": 23702, "Winchester": 5699, "renewing": 14260, "uncommitted": 25948, "crashing": 30381, "1/31": 23392, "tasty": 17756, "aiming": 18241, "monotony": 28992, "undergoing": 12276, "today's": 6912, "ALL": 24740, "Porpoise": 17232, "clapping": 17799, "council": 12374, "Mandir": 27418, "legitimated": 30668, "@jasthenurse": 15794, "Talked": 21320, "Barclays": 22622, "Muskogee": 17442, "indirectly": 348, "Madrid": 5614, "designing": 2284, "compliment": 12001, "co-star": 5828, "muddy": 15958, "10:56": 22116, "headcount": 22607, "713-790-2605": 23632, "canapés": 32467, "Litterarum": 27649, "negotiated": 19069, "letter": 3870, "William": 4079, "Additional": 2011, "unknowns": 13375, "institutionalism": 14929, "Hoped": 26585, "Reynolds": 15223, "unwillingness": 20015, "cohesive": 24291, "SPARKS": 22946, "fulfil": 24102, "multipolar": 14294, "Horrible": 28666, "wether": 20326, "triggering": 1119, "1492": 15264, "terrible": 5035, "Philippine": 19369, "lane": 28098, "vividly": 30547, "situ": 110, "notch": 19234, "retrieval": 2634, "08:23": 21618, "sizable": 7918, "biked": 9835, "Baffled": 28146, "spider": 9910, "Streett": 11813, "reverie": 9713, "starved": 16937, "skittles": 18446, "airway": 26491, "Moussaoui": 20633, "federal": 7594, "anesthesia": 7031, "day's": 29310, "displaying": 10362, "reaffirmed": 25289, "Sat.": 11740, "way": 257, "outside": 8644, "forming": 17682, "creep": 17958, "Webb": 14582, "shrug": 19352, "tracked": 19587, "recorder": 6094, "05/17/99": 23209, "Kettner": 23887, "gash": 24134, "fusion": 27215, "pillowcase": 32122, "reserve": 7330, "Steven": 6936, "theropod": 2874, "Moslems": 20381, "aside": 5133, "proclaimers": 25697, "anyone’s": 9566, "10:05": 22104, "coupled": 14566, "differently": 14379, "NCRC4ME": 24654, "1Q": 23404, "Cranston": 24311, "Bahamas": 27496, "Vic": 29372, "Rights": 706, "Rewind": 5288, "perp": 20865, "videotape": 18737, "exhibits": 889, "advised": 17388, "deviation": 1692, "Dagger": 19190, "Alexandre": 3955, "extermination": 25015, "motives": 3886, "integrates": 1612, "signatures": 13256, "lauding": 9649, "Gustavo": 29043, "endangering": 31427, "Royale": 25009, "Burrito": 29767, "Tame": 8821, "housing": 12182, "Papa": 32513, "sanded": 25542, "CITIC": 2240, "ain't": 7119, "stomachs": 16722, "footprints": 9747, "Paralympic": 10837, "interests": 3366, "BRINGS": 28751, "Bonanza": 29556, "pushed": 3336, "comforting": 29790, "time": 71, "man-": 6582, "Ramsay": 15779, "f*ck": 27700, "blankets": 10060, "equivalents": 5679, "ding": 17922, "dropping": 18689, "explanatorily": 15153, "migrations": 25116, "1797": 14896, "Demand": 21815, "stuck": 9650, "bending": 2795, "gentile": 30558, "163": 12126, "appealing": 7981, "Pants": 17356, "targets": 18485, "Parmesan": 25128, "oppose": 854, "Radianz": 22005, "Hal": 13705, "24.7": 15602, "Annoy": 17909, "autobiography": 3474, "commenced": 17063, "pruned": 32101, "albeit": 25038, "whiting": 25166, "online?u=mayursha&m=g&t=1": 25331, "DOING": 24856, "Barbaric": 31412, "equaling": 24381, "footwear": 27822, "cauliflower": 27445, "Sixties": 25579, "Chips": 15824, "spouses": 21212, "message": 5666, "karol": 27412, "rightholder": 31454, "Frankfurt": 3143, "appellees": 7536, "residences": 16901, "W2": 7145, "particle": 11339, "uncontroversial": 13727, "Transformational": 29036, "expunging": 31803, "foresaw": 27299, "obs-": 6559, "intents": 27725, "Management": 10842, "Figured": 23654, "Talking": 5241, "progress": 344, "Johnson@ENRON": 23360, "§": 14967, "Zawahiri's": 20626, "Lords": 7216, "09:37": 23423, "remarkably": 1857, "studios": 25675, "Nylon": 22280, "interpreted": 7277, "TIMES": 28566, "concede": 7610, "ticket": 11086, "212": 22010, "baksheesh": 30737, "Rains": 3034, "Nicobar": 19535, "criticising": 19666, "hello": 8689, "mid-February": 20840, "collaborators": 30691, "carved": 10281, "grams": 18037, "thank": 6323, "wood": 9749, "Cookie": 27804, "barclays": 22588, "hallway": 8994, "anchor": 30875, "clash": 24578, "overtook": 24571, "World": 613, "laughing": 8649, "Dividends": 7915, "Beverly": 16032, "Somewhere": 29625, "straightforward": 17687, "chew": 27206, "codex": 15408, "freighter": 19582, "myriad": 7674, "Secondly": 14935, "Flex": 25292, "dived": 32160, "Swiffer": 26285, "planing": 22162, "Also": 10968, "Ice": 10673, "93": 8500, "opt": 10781, "120,000": 15690, "silky": 31556, "exact": 1882, "cancer": 2208, "Plague": 25497, "owed": 31395, "handed": 4815, "Pomper": 29852, "statues": 15393, "Phillips": 23142, "winding": 19230, "redistribution": 7860, "reopened": 19965, "07:24": 21189, "Transplant": 17742, "totes": 29970, "centers": 4989, "Chalmers'": 9305, "unavailable": 1411, "Guantánamo": 26071, "Architectural": 4552, "concern": 4717, "pirates": 20429, "synthesis": 2509, "Rose": 4212, "olives": 9185, "herring's": 32437, "Impact": 25151, "tunnel": 10287, "provider": 26739, "planets": 9298, "hyperbole": 13690, "Brass": 27306, "adjustments": 22321, "He": 3114, "###": 24756, "until": 3178, "mid-September": 16163, "Formal": 5682, "Soldier": 30250, "Beings": 13995, "12:00": 22980, "vaults": 32314, "gazing": 9819, "Sinyavskys": 30769, "YEARS": 18671, "line": 1115, "beards": 30516, "forbid": 27334, "Environmental": 13488, "misrepresent": 29184, "coauthor": 13462, "contagious": 9128, "absurd": 12855, "Steady": 19611, "brushed": 30394, "Joby": 27968, "belongs": 7950, "species": 10212, "boycott": 20527, "interpolated": 3939, "parochial": 22643, "Crowds": 27816, "Exercitationes": 3230, "gods": 13513, "22nd": 12528, "90th": 13118, "Self": 25317, "spinning": 30486, "Islamophobia": 12233, "deploying": 14617, "negating": 9313, "marker": 32542, "guesswork": 13823, "Rolling": 13354, "Wisconsin": 25182, "needing": 22627, "waiters": 29001, "6:30": 11747, "'71": 11783, "strips": 25516, "ps": 21652, "2030’s": 14527, "Stranger": 9792, "original": 1823, "expectancy": 8527, "unpriced": 22661, "nutritive": 8202, "Draw": 17795, "Shapiro": 23729, "beckoning": 32514, "outbreaks": 24425, "Citizen": 6282, "summer": 5211, "Open": 2419, "members’": 8243, "biographical": 4182, "perpetual": 10006, "summarized": 15585, "supported": 1919, "karma": 9784, "Certeau": 3094, "Arafat": 13151, "Attack": 25727, "Chechnya": 18829, "Foot": 27980, "trendy": 17074, "hostilities": 24583, "gastric": 24084, "forums": 24225, "Suggestion": 24924, "Weyl": 3996, "transport": 12178, "Polaroids": 13261, "Square": 7088, "behind": 2445, "disease": 13827, "Thou": 25521, "bolstered": 7896, "onion": 15775, "flaxen": 30286, "Flames": 31032, "kissed": 9827, "Yoko": 25629, "prepayments": 23641, "thei": 26419, "Caution": 32272, "democratically": 18848, "delusion": 31115, "Filed": 24555, "Mak": 12407, "Users": 11674, "faltering": 21849, "scripts": 11985, "cans": 6939, "n.d.": 14872, "crinkly": 31667, "gain": 1605, "pony": 26978, "HO": 11798, "blurring": 27177, "hunches": 8834, "indomitable": 11592, "extended": 14279, "stalk": 17761, "iw": 27360, "drive": 5788, "Director": 10846, "chairman": 12653, "Assh@%$e": 29191, "Colin": 3254, "Japan": 3675, "908": 14871, "bitmaps": 30218, "rendered": 24734, "chalk": 13566, "Texans'": 14755, "waterway": 30878, "Zeus": 13514, "Adhamiya": 18566, "bolting": 17754, "intermediary": 24383, "OWNER": 29627, "Para": 23571, "Ossendrecht": 24961, "applicable": 3699, "co-owned": 10508, "ridiculously": 13828, "ease": 14029, "Thousands": 14637, "Clarkson": 29712, "leering": 9493, "Allen": 6996, "Going": 14846, "projects": 10655, "Burke": 14894, "TERRIFIED": 27342, "Snap": 9911, "ONE": 11871, "mug": 15427, "@Ryan": 27644, "Instep": 28235, "prioritised": 22617, "Hogwarts": 16099, "over-generalizations": 20304, "Rio": 14722, "Proposal.xls": 23315, "Remington": 32547, "Air": 13499, "1e": 26058, "1999": 5728, "staccato": 8923, "Thirdly": 26763, "hull": 9995, "Hypnotize": 17781, "973-2776": 23306, "surveys": 564, "revitalization": 16391, "wondered": 9684, "gladdened": 10158, "Photographic": 13292, "regulatory": 21051, "crowns": 28257, "unmatched": 32448, "formats": 30052, "Nikon": 27162, "Deffner": 23761, "radius": 2331, "astronomical": 15394, "feathers": 6769, "write": 7112, "Moro": 20684, "sin": 6562, "actins": 23778, "feed": 6684, "kinda": 6360, "135th": 10765, "Sri": 18973, "http://www.dailykos.com/story/2006/5/12/232746/857": 20261, "murdering": 25587, "earliest": 3228, "nervous": 9279, "scene": 218, "complementary": 1191, "holdup": 30816, "STREET": 24538, "Trip": 27566, "plo-": 7153, "collecting": 622, "Disappointed": 28673, "deputy": 18530, "Gwen": 12605, "Foster": 9330, "BJ": 29283, "ideology": 13241, "turned-up": 31162, "Average": 23481, "secessionists": 19562, "Gatineau": 24109, "Oxygen": 10297, "waste": 7687, "it'd": 13726, "Socio-economic": 14517, "interrupting": 29650, "Confer": 11734, "choose": 1202, "fired": 12857, "celebrate": 14018, "wary": 14731, "1:45": 15873, "Petunias": 32129, "surviving": 13526, "lusted": 32672, "retiree": 7935, "Christian’s": 10108, "electoral": 12673, "swim": 17003, "funnel": 18047, "mainly": 11261, "non-social": 19413, "scrape": 24844, "tipped": 9382, "Wai-keung": 12455, "fated": 18859, "rocking": 8978, "destroy": 12875, "magician's": 20183, "campaigner": 13034, "Denis": 14983, "Already": 3365, "tiger": 32201, "blocked": 18553, "extradited": 19359, "Less": 11963, "Negro": 12021, "Carnegie": 5537, "festivals": 12917, "grant": 1469, "Production": 23039, "Moines": 21445, "Parish": 19453, "tuberculosis": 4755, "recommends": 29927, "coincidental": 20895, "CONGRESSMAN": 11491, "spacefaring": 24796, "tundra": 25146, "modicum": 18954, "Ismail": 19708, "03:11": 23059, "basil": 15897, "’’": 19648, "bron-": 6739, "Gilderoy": 32224, "flourishing": 2436, "jalapeno": 29163, "believable": 8760, "taxes": 7861, "Piccadilla": 25593, "artistic": 7459, "Forty-eight": 32842, "geographically": 32932, "interstellar": 9222, "dread": 32457, "oil": 7881, "Palestine": 14229, "studies": 115, "back": 4312, "javascript": 11361, "undertaken": 2464, "recreation": 11577, "walnut": 17898, "Canibal": 20328, "10016": 22008, "Correction": 21537, "Dharma": 24031, "Helps": 24076, "thickened": 31138, "form": 1113, "self-will": 32805, "tendencies": 7983, "Stan": 10509, "Airbnb": 15100, "Kalikhola": 19624, "sunless": 8642, "smiling": 9523, "defibrillator": 8427, "non-compete": 23095, "mistrust": 31248, "Loop": 22144, "Trick": 5232, "b)": 12356, "Milligan": 22031, "L/C": 23223, "hmmm": 29997, "Realty": 28706, "narratives": 2989, "Talley": 28725, "wait": 6349, "She’s": 8780, "resides": 5856, "Chelan": 28627, "Cayuga": 29320, "happy": 6743, "bmil": 29928, "Borgin": 32252, "arid": 17085, "5:19": 15768, "VP": 23377, "equals": 7102, "yamwhatiyam": 25722, "employable": 27658, "saves": 6597, "ID": 22985, "JUNE": 24536, "undoubtedly": 7259, "payroll": 7189, "exploiting": 13028, "wholesome": 16113, "sweated": 14641, "Salah": 19338, "tower": 2649, "39": 12794, "Bangs": 25060, "tickets": 16087, "d.": 5422, "Premier": 3482, "Coil": 20216, "14:14": 21309, "woman's": 30255, "mistress": 30976, "Sophia": 4379, "Virgil": 5086, "birthday": 3669, "Outstanding": 4186, "Elements": 13417, "dull": 9970, "TikToks": 15836, "swiftly": 19715, "secretive": 13509, "think-": 6412, "!!!!!!!!!!!!!!!": 27801, "saints": 31334, "slacks": 12044, "subjected": 17748, "Captain": 6729, "relearned": 30281, "Ever": 8252, "agreeable": 21604, "velocity": 3327, "Boyish": 30784, "120": 7501, "graphics": 24244, "videos": 5264, "mum": 11680, "echoing": 8348, "Abramo@ENRON": 21593, "1661": 4328, "Lavan": 7597, "suddenly": 8602, "adhered": 24927, "coworkers": 28093, "threatening": 10460, "Islam's": 12274, "Adam's": 22964, "burnt": 9207, "Chop": 13792, "worksheet": 22206, "Modrian": 21167, "immaculately": 28920, "digest": 27282, "wardrobes": 32866, "People's": 12444, "caution": 2781, "Sadr": 18565, "Comédie": 5387, "BS": 20154, "F&AM": 3639, "earthquake": 13965, "PGE": 21436, "crafting": 24299, "swamped": 12935, "Hidden": 23948, "1.888.509.3736": 21462, "p&l": 22611, "operational": 22637, "funny": 6403, "NB": 1815, "panic": 16929, "Hydor": 26674, "Mahatma": 15045, "pulls": 9506, "vans": 16308, "youngster": 24206, "availability": 666, "neologism": 10480, "splitting": 14290, "charger": 29836, "rejuvenate": 27925, "TAGG": 22067, "completly": 29159, "Devocht": 12308, "initials": 3975, "blacked": 12326, "bottled": 18154, "dressage": 27577, "MEAN": 28737, "VBA": 22652, "FusionRetail": 29302, "Wentz's": 31938, "Bever": 18089, "justly": 11663, "grissini": 32402, "i-Nick": 10270, "curiosity": 17544, "addiction": 5876, "Portland": 21949, "massages": 15754, "77.92": 26016, "du": 3899, "rifle": 8598, "defeated": 12419, "Shakespearean": 23668, "powerful": 852, "fights": 28330, "clinical": 8526, "fields": 438, "Mon": 16605, "Circle": 4144, "Copyright": 24783, "persistent": 2185, "919819602175": 24224, "pyramid": 15344, "trireme": 30988, "Entry": 20999, "Virtually": 18393, "D2": 1636, "headset’s": 8671, "projecting": 9999, "hated": 9791, "TIGER": 28462, "Theories": 5617, "510-642-3689": 22451, "Mlle.": 3912, "Command": 19522, "Islamist": 18765, "63": 17016, "Culture": 3356, "pro-Palestinian": 18920, "penitentiary": 12349, "condominium": 20730, "Carried": 24454, "consistently": 8481, "donut": 15900, "crevices": 32760, "fraud": 1487, "elimination": 7327, "marionette": 30284, "Em-enro2.doc": 23202, "Waiting": 31720, "Systems": 1473, "ilk": 20203, "unwrap": 8813, "Cassation": 13192, "tong": 10278, "brooms": 18292, "9800": 20930, "زها": 4467, "Aquiriums": 26490, "corpses": 30646, "marvels": 14603, "mounting": 23678, "entery": 27217, "accouterments": 10690, "buyer": 3724, "circularisation": 22618, "EU's": 31399, "Hear": 7515, "satellites": 15595, "pranks": 17914, "Sometimes": 10076, "caucasian": 27261, "canister": 28916, "insanely": 16108, "33rd": 5530, "Processing": 1035, "browser": 12760, "proliferation": 25773, "http://nigeria.usembassy.gov/scams.html": 27040, "corporate": 16429, "non-scientific": 10243, "intending": 10604, "Idiomaticity": 3763, "spit": 6826, "Slate": 10532, "naming": 5989, "HoTMaiL": 24169, "billing": 23509, "Reason": 24701, "greek": 28953, "eHow's": 10810, "shutters": 14620, "shake": 15079, "migrate": 23108, "kind": 284, "volition": 31798, "wealth": 7902, "re-elected": 12447, "asylee": 12965, "discrediting": 19390, "epilepsy": 9698, "Cash": 23085, "Neuroscience": 15850, "restaurateur": 5425, "united": 9547, "enlightenment": 20084, "buddy": 9614, "beginnings": 16407, "futile": 31274, "chocolate": 8824, "whhich": 26486, "effortful": 32743, "vessel": 12957, "sprang": 25568, "Savier": 21471, "chain-gang": 31208, "cleaning": 16015, "specialized": 13894, "predefined": 30083, "excellence": 14859, "chef's": 30305, "pockets": 12357, "Calaria": 25472, "Chung": 12391, "mouthing": 8793, "generates": 2304, "musk": 24887, "neck": 8555, "Stephen": 11137, "reinforcing": 13469, "superboys": 9643, "Rishi": 12968, "Prestige": 28883, "wheezed": 32477, "Shore": 17224, "critical": 373, "complaints": 22850, "square": 7079, "SI": 1908, "silent": 14126, "induced": 10428, "Pho-nomenal": 29027, "Ouse": 17527, "progressive": 14077, "underground": 20029, "ga": 24462, "Liwei": 24793, "flame": 31125, "dove": 26589, "understaffing": 29582, "DANGER": 11840, "roar": 8928, "4:00": 21591, "voters": 12364, "cheered": 31002, "cherries": 16232, "attendance": 13331, "Herman": 14456, "renaissance": 27097, "Lorne": 13662, "kosa": 24042, "lo": 26541, "MORALITY": 20120, "12:35": 22915, "Experienced": 28948, "No-15": 31370, "prohibited": 14774, "lexicography": 3799, "updo": 16053, "Build": 17944, "knots": 9202, "Silly": 29758, "overcharged": 29804, "well-kept": 30401, "stocks": 8027, "Garment": 29151, "performances": 5390, "Kueck": 28723, "handbag": 29805, "mute": 31085, "update": 12766, "ANSI-89": 30032, "lakefront": 16381, "tanins": 16219, "diversion": 25510, "majestically": 31917, "sidewalks": 7602, "Simply": 15000, "264": 24945, "wages": 7197, "Arc": 5838, "personnel": 13175, "Expressions": 30223, "fix": 4588, "Recently": 21786, "hunting": 5789, "indirect": 1235, "Freud": 9557, "Stiglitz": 25869, "Hermes": 10186, "Makel": 2442, "polly": 9600, "med": 13975, "11:42": 23455, "interference": 2715, "Tablet": 26678, "starters": 24860, "vibrant": 10908, "TAP": 29264, "Febuary": 24234, "Chair": 14106, "new": 323, "sic": 12725, "dammit": 9745, "Shetland": 8803, "blame": 1432, "Abbot": 11712, "devoid": 29635, "pricing": 21057, "))": 21197, "serried": 32859, "Vulgate": 4979, "pavement": 30333, "superhero": 4127, "coincides": 8360, "multilateral": 13899, "battery": 2446, "Coahuila": 14742, "des": 4435, "sweatshirts": 6468, "sweep": 7650, "alias": 20877, "bed": 7098, "Barclay": 26561, "largely": 2503, "Almanac": 16375, "scant": 3938, "castration": 7073, "Stillmans": 30392, "distribute": 8231, "tune": 8583, "tap": 11044, "heeded": 14325, "deeping": 9067, "pawn": 23912, "Saying": 29068, "Mayor": 7541, "scientific": 343, "incident": 3947, "Gazette": 12271, "welcomes": 31553, "logic": 19765, "Motel": 3900, "bites": 26849, "illustrated": 10098, "annuals": 17718, "failures": 11078, "Thing": 27709, "hip-bath": 32580, "retarded": 8772, "Bishop": 15410, "chili": 28529, "summarising": 31543, "Pizza": 15987, "Wilbur": 32790, "flu": 13812, "halves": 15652, "INTegrated": 24176, "colonialism": 31945, "yawned": 32221, "Unable": 32465, "Amr": 12262, "comfy": 15748, "stockings": 31708, "5.2": 25920, "stores": 16520, "Ruiz": 951, "Daily": 10680, "Jasmine": 15792, "Teheran": 20507, "stumble": 29907, "Reich": 1982, "disintegrate": 30620, "Good": 4161, "charlatans": 1206, "plug": 32229, "expulse": 26142, "Marx": 10940, "tablets": 1644, "ligaments": 6370, "portion": 1743, "Arrange": 18401, "screaming": 9343, "2D": 11496, "deliteful": 27005, "Rekohu": 16254, "interrogative": 12321, "waiting": 7696, "shop": 13774, "grapples": 8276, "counteracts": 15953, "cowered": 32203, "SOL": 22944, "Beall’s": 1416, "boulders": 15360, "subjective": 239, "mindful": 7247, "Johar": 7298, "pdf": 17294, "Post–Revolutionary": 3607, "Rockin": 24521, "Yorker": 29633, "Farouk": 13135, "Representative": 13929, "warranted": 16306, "preceded": 19012, "flyer": 24524, "exactly": 6991, "Lipton": 5763, "extremism": 14273, "1830s": 16893, "velvet": 30276, "unspoken": 19379, "thinnest": 27817, "ld2d-#69336-1.XLS": 22438, "7:15": 15957, "Elsewhere": 30619, "Load": 22727, "exam": 9810, "rubbish": 29209, "EVERYTHING": 26529, "Emeritus": 12651, "bitters": 10522, "01/19/2001": 21184, "Here": 605, "ironies": 30746, "nonsensical": 19291, "Molly": 22523, "grim": 4686, "Producers": 23715, "legal": 785, "Zach": 6999, "rain": 8882, "uncultured": 15470, "Posada's": 19350, "worry": 9661, "J": 11145, "hint": 3911, "AD": 5009, "untidy": 32056, "Carbet": 16709, "2.": 695, "spirituality": 20285, "GTC": 23486, "emphasizing": 1711, "Powell's": 19130, "satanism": 20128, "artless": 32656, "engulfed": 9029, "forwarding": 17280, "Asian": 3497, "Quadra": 24006, "Pakistanis": 18757, "predicated": 10607, "seafood": 29497, "you": 4578, "husband": 9106, "ballet": 11434, "re-writing": 8299, "blatantly": 25533, "goggling": 32133, "Plaza": 16562, "despairingly": 9399, "humanistic": 6557, "macbook": 26629, "series’": 3046, "compares": 15449, "imparting": 30706, "exurbs": 17051, "Bwana": 32009, "emotionally": 15785, "Type": 23007, "Luest": 24950, "Joule": 28383, "speech": 14443, "gullible": 20057, "specifies": 15566, "Nourished": 15911, "legislative": 7260, "royal": 16806, "comfortably": 20489, "ass": 21242, "Nemec": 22725, "undiscovered": 10594, "bonds": 8477, "there": 304, "devastation": 31165, "totally": 6569, "Rinse": 17768, "Administration's": 19909, "yep": 28351, "Iranian": 10435, "aura": 8767, "tribal": 15501, "merchants": 16897, "capacity": 1253, "Chris'": 26565, "grasses": 32748, "Peacekeeping": 14258, "Osama": 19177, "Ineos.xls": 22213, "LOL": 26294, "STEAK": 28567, "music": 3368, "stony": 19925, "area": 2725, "quartiles": 15630, "Mailing": 22960, "combine": 11269, "bookstands": 32833, "referenced": 21607, "bypasses": 17456, "anytime": 25209, "indexing": 31437, "plied": 12330, "perpetuates": 18773, "lighter": 9918, "sins": 12350, "Positioning": 15592, "spectrum": 2695, "violating": 5965, "Wicca": 13522, "daycare": 28684, "materials": 2220, "Dan": 6439, "medalist": 10991, "ncfa": 28546, "Geofences": 2325, "resultant": 15371, "WILL": 27936, "7.15": 31488, "intended": 1280, "Junius": 12409, "items": 1929, "sinus": 6949, "Ahab": 13599, "electrostatic": 20700, "receptionist": 25680, "condescending": 29060, "reactionary": 11129, "crack": 11152, "SCUD": 25833, "overs": 26143, "http://www.natureandtech.com/?page_id=2200": 26847, "midget": 25785, "Party": 4534, "weekend": 9805, "compliance": 877, "rescued": 12139, "Seems": 20208, "settlement": 15304, "durations": 17171, "Warhol": 7486, "sustained": 1640, "Look": 6442, "president": 3449, "baling": 6676, "cellar": 16208, "violations": 25942, "STILL": 29881, "slush": 9711, "Girl": 30251, "http://www.justcages.co.uk/ferret-cages/ferplast-furet-plus-ferret-cage#v_431": 26874, "weeping": 5937, "Er": 32127, "sorcerer": 32058, "HORRIBLE": 28548, "appearing": 4153, "conversation": 7802, "berries": 8022, "illustrate": 8429, "Damned": 9728, "aisles": 30549, "began": 3415, "Rubell": 13361, "U.": 29459, "Olivia": 31573, "sweared": 18623, "bestiality": 10544, "chap": 31043, "partner’s": 8817, "midden": 32475, "headline": 11104, "Appropriations": 20805, "victories": 14643, "ablest": 3159, "regalia": 14754, "12:12": 21934, "08:38": 23561, "driver": 6062, "Glen": 21141, "roms": 26167, "http://www.cic.gc.ca/english/index.asp": 26471, "Lonely": 26941, "Ginny": 8665, "Accord": 19037, "whistle": 27436, "strive": 11632, "python": 27336, "wight": 27582, "enjoying": 13724, "Alfaro": 21738, "zebra": 27781, "Wildernest": 28974, "literalist": 20305, "error": 2313, "bundle": 25677, "pinkness": 32011, "modification": 1837, "Games": 1496, "bully": 5746, "January": 2137, "walkway": 29208, "platter": 16235, "incarceration": 12219, "bearing": 20108, "Amoxi": 7039, "Ukraine": 16480, "milkshakes": 11478, "Spelling": 15234, "modern": 2896, "slanted": 9319, "miners": 31730, "Qāpū": 16827, "meaning": 1721, "categories": 3080, "wandering": 9555, "clogs": 17658, "prayerful": 14154, "three-day": 32566, "simulating": 15617, "Holly": 5545, "AT&T": 22974, "Bateman": 28501, "Blinking": 14810, "sign": 1747, "theme": 4647, "Oprah": 21551, "revenues": 23606, "penetrates": 24612, "NATO": 10390, "consumes": 2149, "praised": 11981, "Chiara": 20162, "Kurdistan": 18495, "cadres": 30690, "ETA": 22168, "nutritious": 8089, "Georges": 16668, "Gulfport": 24434, "reopening": 19961, "squashed": 10647, "rounded": 32068, "capitalism": 7984, "ca": 8664, "Pelosi": 14092, "baked": 26175, "Lot": 6139, "Potty": 27542, "terrors": 5046, "Flap": 18087, "actualy": 29604, "illustrating": 3076, "FBI": 18478, "Relations": 11733, "mightily": 11072, "1520s": 15401, "DAB's": 12401, "friendship": 17629, "Tronicus": 20281, "Kahneman": 15004, "Anastasia": 16031, "NCRC4ME’s": 24653, "starter": 19858, "Barry": 27957, "presidency": 31498, "knickers": 32510, "12": 307, "#research": 8470, "unthinkable": 6120, "Dominique": 16067, "outgrowth": 22876, "icq": 24899, "parakeets": 26283, "manual": 10751, "post-call": 22380, "patrons": 11074, "specifications": 23581, "Sear's": 30019, "dʒəˈroʊm": 4959, "AA": 22594, "Decay": 16047, "sometimes": 1835, "72nd": 30290, "electronic-warfare": 30791, "God-forsaken": 31102, "colorful": 8707, "sequel": 7480, "Bring": 20254, "COUPLE": 28565, "imposters": 20181, "Mogadishu": 18641, "RAC's": 22700, "her": 3906, "prepares": 21649, "Miss": 11710, "statistics": 568, "Down": 6308, "debts": 23981, "info@vagabondtours.dk": 17299, "FWS": 25082, "Survival": 10380, "evil-smelling": 32449, "02:49": 22724, "Okabayashi": 21732, "defined": 749, "Dhaka": 19501, "Harbour": 17231, "insights": 142, "artillery": 3961, "backbone": 16227, "swirls": 24630, "Galois'": 3832, "antiquities": 26187, "juncture": 14551, "unheard": 17091, "roommate": 15555, "raised": 4412, "cliff": 15416, "Kennebunkport": 26094, "disco": 13360, "Winfrey": 21552, "wafer": 10131, "dvd": 27573, "cameras": 13174, "likelihood": 1751, "Schedule": 21608, "Vicki": 23720, "paperweight": 15626, "genital": 15517, "grasping": 31668, "breath": 8892, "reality": 5807, "Arun": 17390, "Confessions": 4087, "stroke": 14007, "utterances": 32857, "gumball": 13427, "eternally": 14422, "fun": 1518, "noggins": 9891, "unclipped": 8679, "German": 1732, "partnership": 13915, "weals": 32509, "simpering": 32067, "Obina": 28255, "1179": 21132, "102": 4896, "designated": 8319, "Araujo": 23192, "Politically": 23903, "media’s": 11133, "empires": 30959, "Disorders": 13558, "ling": 20938, "compartmentalize": 20295, "stagger": 30378, "blow": 9656, "Guided": 11993, "unknowledgeable": 26496, "Wed.": 11692, "supersonic": 19205, "Clair": 23501, "year's": 11665, "Shakespeare": 25420, "fare": 15440, "crunchy": 16135, "bookkeeping": 10704, "hardened": 32616, "2/3": 17859, "learning": 400, "Battles": 5275, "Bergen": 16502, "refusal": 31402, "animals": 2746, "Apollo": 11319, "Owen": 19395, "Britannica": 32852, "Force": 12826, "sixty": 6222, "guiding": 6893, "Scientology.org": 12746, "Paris's": 12814, "adversity": 11032, "reparcelling": 2354, "Company's": 31169, "repoire": 28041, "DANCING": 29262, "Toccafondi": 13230, "36,000,000,000": 24367, "tallith": 30534, "Pompey": 25370, "NHS": 16158, "anonymous": 10782, "popped": 6330, "unease": 32947, "Ruddy": 32302, "jacket": 19827, "Gasping": 32308, "suck": 23894, "archives": 24328, "Iván": 4918, "Gross": 6824, "Caribbean": 16633, "centres": 16868, "twiddled": 32183, "save": 7179, "1859": 4447, "chest": 7378, "orderly": 12002, "Tints": 28109, "Noam": 3689, "Orchestra": 16416, "Membership": 31351, "http://3.bp.blogspot.com/-X_e2uwT6wPw/Tkj_7UVTw6I/AAAAAAAAAGs/e_hICAdYPYI/s1600/lotte_world_from_high_up.jpg": 26581, "==": 20265, "REVOKE": 30046, "peacefully": 6024, "journal": 1375, "NON": 29618, "Triple": 4886, "Puppet": 8297, "Thessaloniki": 32925, "computer's": 24986, "opportunity": 1228, "Sanwiches": 29110, "whoa": 13753, "McGinnis": 24699, "superseding": 7337, "twisted": 9206, "aerial": 20720, "subsume": 25903, "uphold": 31455, "Firm": 28513, "Dymoke": 4206, "Kristen": 13294, "sticker": 28699, "o": 7087, "absolute": 5661, "Trade": 20622, "Non-Proliferation": 14283, "agency": 12838, "4th": 16518, "benefited": 7712, "young": 405, "processes": 149, "incarcerated": 24303, "Article": 22361, "debut": 4082, "Term": 14511, "provoking": 31264, "Coogan": 20137, "nonenforcement": 23828, "dthat": 21446, "URGENT": 24345, "duality": 23957, "novella": 13744, "genteel": 31732, "crusty": 16027, "trip": 9628, "92": 15241, "bachelors": 27659, "degree": 465, "shooting": 10086, "killers": 19170, "dangers": 25892, "fundraising": 12596, "ch-": 6917, "Patrick": 4256, "tidbit": 11020, "stampede": 13149, "Hills": 16033, "Crepes": 28770, "2005": 254, "find": 1764, "preserved": 108, "salutatory": 30234, "Amendment": 7468, "dream": 9551, "delicious": 10565, "lick": 13576, "Nirmal": 19073, "LOT": 21520, "wilderness": 30996, "able": 6713, "Y-": 6233, "Coconut": 17902, "displays": 10562, "Kashmir": 18776, "philosophers": 1225, "1.6": 24478, "degrees": 3642, "Ready": 15974, "soles": 15963, "Achievement": 3671, "possessions": 7600, "Verizon": 28119, "increments": 30323, "discretion": 7248, ".adp": 30117, "NSU": 17508, "Sandbanks": 30992, "Islami": 19620, "foremost": 12185, "frame": 445, "borne": 2728, "yarns": 30904, "Termination": 23011, "aka": 8296, "wholegrains": 32828, "drilled": 10286, "Irving": 12192, "improvement": 630, "Tanya": 12465, "pizzerias": 16624, "affirms": 24676, "Afghanistan": 12117, "havoc": 25789, "Austin": 5852, "conquistador": 16969, "POP": 26403, "cus": 29709, "twenty-six": 31879, "Lookout": 4146, "comprise": 19627, "shorn": 30343, "followed": 1082, "Continuity": 3363, ".doc": 22312, "COME": 11910, "Twist": 16132, "looking": 6866, "looks": 6926, "downright": 17590, "ambulances": 18610, "prompt": 21959, "11608": 22336, "shady": 27763, "boggles": 20312, "32": 2712, "blames": 19246, "identify": 1020, "designation": 17480, "Ba'athists": 18601, "Marcia": 6055, "karen": 11797, "wont": 21566, "slanting": 10026, "suppliers": 22426, "Ghostbusters": 12599, "imperiled": 25880, "played": 4214, "perceptions": 1630, "antifreeze": 10611, "clue": 14669, "mutated": 2300, "bombast": 25401, "envelops": 25871, "Pannonia": 4977, "consecutive": 13893, "Nehru's": 14001, "opera": 30232, "coarse": 31722, "Copenhagen": 10237, "against": 4337, "register": 22500, "Grigorenko": 1985, "izakaya": 26940, "relied": 30654, "1964": 1004, "Database": 30042, "nervously": 32264, "Kant's": 24888, "builds": 24640, "WTC": 20681, "fearing": 32525, "earthly": 24623, "However": 1017, "preferably": 17695, "Towing": 28821, "Hammer": 26259, "Dory": 11812, "fans": 2982, "license": 7487, "elevation": 17035, "participants’": 234, "GIVE": 28406, "Spirito": 13212, "112": 19223, "glyphs": 15403, "coiled": 27747, "organism's": 25111, "universally": 18949, "Cuyahoga": 16370, "Vs": 21173, "murder": 12569, "selling": 5892, "Louis": 3245, "inconsiderate": 29033, "amorphous": 9194, "buying": 10712, "Mommism": 23924, "Pisa": 3800, "pre-arrest": 20748, "sidelocks": 30517, "members": 3455, "exaggeration": 2928, "commissioners": 22848, "95,000": 23415, "dungeon": 10683, "Half": 15653, "delightful": 31059, "Animal": 27594, "invoices": 22663, "Smosh": 5291, "Forty": 16844, "Municipal": 17013, "Investment": 21887, "清": 14904, "intersection": 1516, "blowback": 13530, "November": 3587, "tortilla": 28488, "SCAP-22-368": 7524, "touchstones": 13381, "burrowing": 26890, "super": 9769, "menstruation": 24059, "alt.animals.felines.snowleopards": 24838, "endangered": 16270, "survey": 559, "skip": 6613, "uh": 6059, "microscope": 6878, "exchange": 746, "researcher": 8419, "cloud": 6260, "profile": 10728, "Donohue": 21484, "undertook": 5583, "Nashville": 27521, "london": 26186, "Country’s": 14508, "deathlike": 31199, "creator": 7474, "Moher": 27828, "dubia": 27758, "rosemary": 15949, "hooks": 11824, "tolerance": 15032, "something": 6057, "frost": 17721, "fitful": 30280, "Favorite": 28836, "pray": 12049, "flats": 17727, "Pin": 21388, "enable": 8364, "scavenging": 30348, "Cream": 10520, "trimmer": 6409, "spires": 9445, "tucked": 8605, "Foz": 26996, "Implications": 30210, "Romania": 22508, "additional": 1968, "wellington": 32194, "Musharraf's": 18777, "18T": 21098, "Popo": 31108, "Journal": 15130, "Siri": 9695, "recordings": 1870, "ex-members": 19999, "multisite": 2521, "intolerant": 17589, "prophetic": 32906, "madly": 30825, "hellish": 9488, "variables": 1678, "Woods": 22468, "giants": 9136, "Thierry": 968, "Moreton": 26125, "2.2.": 915, "clusters": 30884, "Reflection": 2292, "widely": 1209, "generators": 13957, "throats": 18597, "elucidate": 656, "legislature": 14688, "15": 776, "Further": 447, "handlers": 8316, "chance": 1781, "altogether": 7450, "flinching": 30717, "Elviña": 2237, "Arya": 23133, "again": 1367, "asserting": 5655, "Immigrants": 13033, "outline": 22602, "watery": 8879, "ethnocentrism": 15447, "whilst": 9391, "ETS": 22929, "1214": 16601, "gunfire": 8560, "Kosher": 27335, "steamed": 29843, "Blvd": 16566, "Teng": 18833, "Rahman": 19100, "martyr": 20460, "amongst": 9265, "Nicco": 8007, "Hamas": 18780, "inspected": 9871, "relaxing": 15752, "Achieving": 777, "swarming": 9254, "cropping": 32013, "emphasizes": 10859, "mama": 15983, "summers": 17086, "goddess": 18212, "preservatives": 10662, "excepted": 25907, "Ram": 21825, "shattered": 27726, "upward": 30155, "Nor": 4639, "non-European": 31409, "5": 461, "Immortals": 12579, "6.5": 27051, "rations": 32520, "Wish": 12593, "Demosisto": 12467, "ISI": 19568, "Confirmation": 22566, "alt.animals": 24830, "meter": 11341, "fork": 10811, "Maurer": 13312, "everyone": 6734, "Jump": 16084, "coup": 4540, "attracting": 1471, "Humanpixel": 24228, "mustaches": 31300, "Iowa": 28447, "shortly": 4291, "Namaskar": 24028, "understand": 244, "401": 5808, "Preston": 10983, "1787": 3519, "05/01/2001": 22933, "foothills": 16744, "traded": 4908, "honey": 6711, "pilgrims": 12252, "typifies": 5686, "{": 21646, "frayed": 30425, "ludicrous": 30429, "League": 4800, "Melted": 16018, "advert": 27208, "Melbourne": 10994, "rumors": 25092, "Questar": 23567, "dried": 8550, "availed": 29570, "1933": 16360, "Sensations": 15021, "overloaded": 32768, "motivations": 20310, "dumbly": 30289, "journalism": 11102, "impugned": 19185, "Clinton's": 26054, "recognise": 32804, "idle": 14466, "Envoy": 14217, "Khan": 19709, "featurelessness": 32798, "twists": 23669, "alt.animals.tiger": 24834, "terminate": 22413, "rejects": 12989, "Bart's": 21221, "veteran": 12359, "navigate": 8398, "Nivine": 28213, "rosé": 16200, "belive": 27963, "mill": 21610, "Contrary": 31466, "CURSE": 25606, "Delta": 17112, "folding": 15405, "position": 2883, "170": 3304, "Ronn": 22670, "OPINION": 29698, "Bender": 20828, "Fernandez": 5604, "TX": 22118, "chip": 9542, "diminished": 1353, "Zakaria": 30680, "desperation": 32846, "eCommerce": 23841, "negotiating": 3078, "NEST": 11865, "comforter": 5951, "Talbot": 4154, "2.7": 23612, "2010": 269, "softened": 32215, "rapporteur's": 31414, "novel": 141, "infinity": 26230, "locution": 30237, "show": 1777, "Fortier": 24108, "qualified": 5991, "Holofernes": 25410, "outcrops": 16267, "insists": 19746, "classiest": 28991, "Watched": 8442, "Spears": 11120, "Transfer": 17886, "http://www.solutions.com/jump.jsp?itemID=1361&itemType=PRODUCT&path=1%2C3%2C477&iProductID=1361": 26290, "possesses": 6591, "16.4": 24493, "Harry's": 15783, "58": 12365, "groaning": 9078, "trashed": 6945, "McCAFE": 26345, "lower": 3335, "Pam": 29218, "sills": 31603, "eyebrows": 32746, "grifter": 13738, "Product": 21661, "pumpkin": 29432, "spices": 29492, "flash": 9915, "Tarawa": 25808, "terribly": 13817, "Chanel": 32391, "mainstream": 10539, "Best": 4140, "reestablish": 25030, "indulgences": 6545, "demons": 5793, "chatting": 21984, "disturbed": 30842, "Ex": 8450, "England's": 17545, "stadiums": 25222, "rssc.com": 27512, "Alaska’s": 7872, "FAQ": 20859, "Iroq": 21516, "shows": 366, ".322": 4895, "Bachelor": 5206, "carve": 7803, "wetter": 27834, "Downtown": 16963, "coach": 12088, "Analytics": 10764, "SamChawk@aol.com": 23247, "415": 23305, "archival": 3891, "******": 28130, "taut": 8729, "baptized": 5011, "requested": 12348, "Thankfully": 13819, "tutorial": 26622, "Education": 1650, "knights": 29129, "follows": 669, "festoons": 9447, "daddy": 19213, "Part": 17662, "tech": 8377, "97": 30185, "Thousand": 32043, "hack": 8368, "39.": 14962, "appointments": 29479, "pre-existing": 2978, "www.risk-conferences.com/risk2001aus": 20931, "dawn": 14011, "experice": 27011, "world": 285, "minds": 3730, "THE": 9916, "case": 891, "Mama": 21239, "RODERIGO": 25436, "Bohéme": 31448, "eastbound": 17564, "as": 184, "jug": 9190, "policeman": 16300, "having": 640, "resturant": 29794, "glancing": 30265, "lifetime": 5381, "Hunh": 6727, "storing": 8163, "2545": 20923, "Palestinians": 11186, "asthmatic": 6737, "16s": 26948, "FTW": 29704, "Touchdown": 32188, "Narrative": 2373, "He's": 4113, "ups": 25251, "lightning-shaped": 32057, "engaging": 10900, "http://www.utrechtart.com/Craft-Supplies/Woodworking%20Supplies/": 26848, "No-44": 31515, "529999420000": 17019, "drilling": 23389, "e-commerce": 22563, "marble": 9104, "laugh": 10580, "commissioned": 3556, "juice": 15838, "Jubur": 18529, "genres": 12531, "booths": 13397, "incompatible": 14158, "separatists": 19511, "hornet's": 20017, "Object": 23116, "minimunm": 27075, "you-ll": 28231, "pigmy": 12734, "Mimmy": 28956, "Rate": 29114, "LIMITATIONS": 1936, "hotly": 3064, "Surgery": 29278, "BRINGING": 29668, "catacomb": 31135, "exquisitely": 32797, "Civil": 11035, "Conflict": 19041, "-": 10, "rounds": 12575, "sham": 25748, "responsibility": 1213, "Sciences": 3657, "coloured": 9375, "relativity": 15591, "Grecian": 16051, "surfing": 17164, "predicting": 25155, "Spongy": 28248, "Leaving": 12352, "Log": 24498, "mortal": 19769, "Freezer": 8219, "policymaking": 917, "Reward": 25973, "revenue-raising": 31545, "News": 5247, "listing": 440, "innovative": 14543, "entourage": 20789, "phenophases": 25114, "BOWL": 26240, "careful": 2016, "perfect": 2908, "blackberry": 15895, "Ditch": 9922, "theraphy": 21451, "motley": 29543, "antiwar": 27729, "Roofing": 28730, "fertile": 15364, "officer": 5301, "tosses": 27540, "Hoover": 18480, "foraging": 10218, "verticalization": 2836, "blamed": 9752, "equivalant": 22522, "bunk": 32863, "maintained": 5955, "Interesting": 16202, "pectoral": 2904, "stigma": 8183, "displace": 15099, "illustrator": 12549, "utters": 1821, "bankruptcies": 26042, "highest": 1923, "=": 1655, "voted": 10490, "Cockroaches": 31788, "Sox": 4770, "Wars": 2999, "mumbling": 8632, "Pastor": 19438, "admired": 32795, "Murasaki": 4764, "polluters": 25933, "sourced": 8032, "postive": 28134, "09/03/99": 23218, "Register": 23663, "sleepy": 16984, "Incentive": 23298, "Turano": 266, "y'": 7103, "奈津": 4604, "leadership": 12449, "DPRK": 12847, "1946": 11400, "Mention": 17644, "prescriptive": 23333, "devices": 13938, "iv": 26358, "mechanic": 29057, "classes": 2294, "surprisingly": 10419, "Twice": 17737, "intertextualities": 2942, "Hybrid": 10774, "cabin": 26272, "rib": 31191, "hottest": 17093, "Films": 8277, "dock": 26924, "Walker": 13140, "playfully": 13418, "tandem": 18788, "yard": 7185, "burn": 7381, "proponent": 3688, "strain": 12990, "lighted": 14061, "STEP": 24932, "Timothy": 31859, "Grimm": 25090, "knitting": 7765, "26/09/2000": 21308, "1711": 14948, "glance": 16939, "heard": 1770, "Cresson": 31511, "Ladies": 14506, "cyber": 8397, "climates": 398, "whisper": 9905, "engineered": 9642, "op": 11697, "ABBOT": 11903, "hairpins": 32565, "—": 873, "Dust": 11345, "schedule": 7733, "fattening": 11756, "cups": 17842, "11/10/2000": 21337, "VISIT": 11912, "lawyer": 5606, "01810": 11714, "conservative": 1272, "physics": 3349, "superpower": 25849, "eaten": 26322, "mainland": 16272, "Aditya": 27423, "SHE": 21465, "barre": 17694, "Feith": 20844, "nationality": 10865, "greyhound": 32649, "mentions": 22714, "Free": 6533, "CUC": 16442, "arrangement": 18277, "Soft": 15915, "moves": 15259, "bunker": 25754, "SEEMS": 28790, "hope": 6471, "bugs": 15070, "psycho-spiritual": 24035, "slant": 27226, "flexibility": 17659, "CHEF": 28800, "uphi-": 15977, "Smack": 17249, "Rhino": 28466, "concentrates": 30776, "cases": 1177, "181,000": 17520, "smelled": 9170, "Band": 24550, "IE6": 12761, "snow": 17416, "archaeological": 16997, "cubist": 21171, "Skiatook": 17507, "High": 4817, "06/01/2000": 21235, "unmanned": 29747, "rationally": 1201, "sniffling": 8852, "fringe": 8192, "unhappiness": 32490, "FYI": 20941, "galloping": 26659, "Odara": 31860, "mistreatment": 24884, "beats": 25496, "Manufacturing": 13840, "61": 10317, "Parent": 22984, "Janet": 21961, "shelling": 31119, "scammer": 27018, "deployed": 12153, "forcefully": 14382, "dreaded": 3040, "bicycling": 17515, "Placid": 25552, "Advisory": 20349, "blouses": 17358, "Blackberry": 15896, "firing": 12851, "Elsevier": 1327, "pitched": 27207, "Stardust": 11298, "peaked": 30886, "Memphis": 23237, "unrestrained": 24736, "STOP": 28786, "manner": 5796, "oracle": 32675, "legislators": 7873, "grunt": 1796, "Variety": 14966, "Tollis": 20161, "unsurprising": 3866, "fragment": 31324, "theeth": 27997, "Posada": 19342, "thoughts": 1586, "waterfall": 15967, "Wildlife": 25037, "Canned": 26650, "psychic": 25312, "Pinotage": 16211, "text": 5644, "WEEK": 25607, "Enron's": 21954, "must've": 6155, "retriever": 9563, "Vietnam": 10375, "fortunate": 8212, "calender": 24237, "PRICE": 11931, "->": 23859, "unsolved": 2692, ".324": 4831, "goodies": 6976, "speckled": 9087, "piles": 24079, "4101": 22244, "Hello": 15859, "submission": 5998, "567.77": 22769, "deliverd": 28113, "Science": 2420, "Representation": 22538, "reflector": 27735, "seldom": 20874, "desert": 5154, "flipped": 26235, "abate": 9232, "plum": 16218, "thief": 19279, "warmonger": 18856, "Lets": 22351, "forearm": 12627, "Retired": 20678, "Havana": 16501, "lodge": 16319, "characterizing": 12332, "sided": 23220, "stirrups": 27580, "arbitrary": 1718, "educators": 21793, "disconnect": 12808, "startling": 19574, "everyone’s": 17918, "Cathy": 3759, "M.P.": 31632, "shrunk": 6473, "Unemployent": 24287, "Amnesty": 19887, "Eichelberger": 30672, "geographer": 11451, "towers": 9458, "Vision": 9925, "Technology": 8278, "describing": 11586, "squawk": 9715, "terrorist": 18475, "Friday's": 18873, "boats": 11049, "horrific": 19957, "pause": 1110, "Davy": 14789, "Dew": 8808, "upcoming": 16589, "mom’s": 8784, "łodzianka": 16885, "T'ho": 16967, "advisory": 20343, "Zurbarán’s": 270, "Compensation": 23993, "UGLY": 28743, "saaaaaam": 26296, "markers": 1223, "depredations": 31522, "host": 5805, "Ubisoft": 12556, "shrieked": 9490, "impostor": 31075, "wearing": 12205, "scenicly": 16334, "12.99": 26426, "tasking": 21733, "peanut-butter": 32335, "racked": 27663, "TRIPPED": 28861, "clerk": 28718, "Katy": 17502, "Jellicoh": 9833, "withstanding": 19530, "territories": 20535, "owner": 2358, "Yikes": 16040, "while": 1515, "toned": 29021, "regulars": 29112, "e.g.": 220, "timely": 22582, "undue": 17622, "Creating": 8350, "commentary": 5112, "Palk": 19078, "Underwear": 27974, "McManus": 2529, "Include": 18151, "INSULTED": 28391, "May's": 11307, "Assume": 7505, "EXPERIENCE": 28404, "rejuvenating": 27909, "enforcement's": 19996, "neo": 4125, "gotta": 6891, "galaxy": 9214, "formula": 7900, "Superstars": 13338, "surley": 28595, "Dempsey": 24695, "Express": 21403, "suspended": 25996, "obesity": 24087, "loose": 6257, "Prussia": 4303, "touting": 25244, "journal’s": 1374, "DeJesús": 4919, "imprisoned": 3981, "aspects": 292, "aligned": 3070, "polarization": 2633, "merchant": 19558, "Suez": 27244, "Slacks": 11709, "insulting": 9885, "Sam's": 23051, "Williams@ENRON_DEVELOPMENT": 23805, "feels": 8431, "analysis": 446, "Albania": 12995, "outperformed": 20467, "gda": 21426, "CLEMENT's": 25350, "Chad": 5778, "cursed": 9389, "insignia": 3625, "recently": 1359, "EU/US": 31500, "SCAMMERS": 27038, "Mellon": 29463, "stabbed": 19937, "straightening": 8790, "800-553-3119": 20981, "trios": 27431, "nearly": 521, "Hammond": 7865, "individually": 2850, "Vivien": 31806, "20": 536, "Mahesh": 24185, "scraped": 9199, "anything": 1364, "hock": 7060, "contract": 12297, "accumulate": 19217, "Ash": 11715, "thailand": 26634, "Sharon's": 18783, "negates": 15116, "privatized": 19912, "semi-sketchiness": 29876, "empowerment": 20083, "photographing": 12031, "cramped": 17913, "batter": 8655, "Cinsault": 16217, "2.2": 15202, "tools": 7784, "SMALL": 10101, "mediation": 14251, "generosity": 32535, "New": 696, "discussions": 3807, "tension": 8428, "schoolgirls": 31629, "authentic": 18336, "sadistic": 19782, "Metcalfe": 21487, "coerce": 24688, "accommodated": 29973, "emigrate": 30723, "Hotels": 26501, "grew": 4243, "traveler": 9144, "Walt": 11033, "Con": 5896, "campus": 12376, "Along": 12595, "egress": 7395, "supporters": 13243, "laffa": 29989, "Dillard’s": 8785, "cycles": 12913, "nigh": 7520, "postcards": 29414, "administration": 10404, "Reading": 30709, "margin": 10015, "polo": 17379, "+4550981306": 17260, "revolted": 25201, "intervention": 1635, "accomplishing": 28826, "introspection": 20136, "Module": 17026, "develop": 821, "AIDS": 1400, "Regency": 21563, "Cedar": 21822, "rrly": 29778, "Doctor": 5003, "CST": 21698, "dropout": 15233, "planes": 19589, "Protestant": 5430, "withheld": 14185, "averaging": 599, "Chairman": 14171, "assumption": 15146, "483.00": 29407, "reflective": 13684, "appropriating": 20204, "downgrade": 25083, "meadows": 31615, "MacKenzie": 8473, "Recommendations": 2376, "Chichen": 15391, "Holdings": 22304, "fails": 7471, "order": 801, "Orr": 29453, "neighbour's": 32758, "elbows": 9023, "pantomine": 30467, "ankles": 32593, "Potential": 15664, "Benjamin": 309, "UT": 22675, "Principles": 5653, "Nimbus": 32042, "silkie": 27126, "disbanded": 3595, "barons": 17418, "Territories": 12382, "subparagraph": 22546, "Trustee": 23830, "Hormel's": 28530, "+": 1143, "thingy": 16178, "phenomena": 3743, "non-philosophers": 15147, "11222": 24956, "UTH's": 26889, "lovers": 16621, "react": 6740, "1686": 4367, "Archive": 4427, "Sam": 5698, "Mingo": 17458, "Rhee": 23374, "construction": 3754, "Faced": 16017, "recognized": 3771, "comedian": 5183, "Indirectly": 30491, "unending": 10448, "obesium": 17195, "conceded": 13081, "284": 21475, "Polaroid's": 13398, "Mosque": 12254, "MAYA": 15363, "knew": 3923, "BDSM": 10682, "demonstration": 12560, "2470": 16555, "philosophies": 20008, "outsiders": 24779, "unexpectedly": 25320, "jamming": 26955, "Inside": 5734, "elections": 12517, "Alain": 24121, "Might": 27995, "Secretary": 12180, "wodges": 27023, "JOKE": 29244, "electioneering": 31364, "collaboration": 2424, "Pitch": 8049, "Frederick": 12416, "09/15/99": 23205, "Iraqi": 4472, "remain": 4629, "AMI": 20820, "Knockturn": 32286, "mentally": 15722, "bald": 25062, "enmities": 17647, "expanded": 4892, "instigated": 22616, "mid-October": 25972, "4-12": 22440, "Janice": 21740, "aspirin": 21246, "convictions": 24694, "stewardship": 8098, "forged": 19188, "warehouse": 16706, "Walter": 30673, "Drafting": 11420, "traveled": 12311, "proudly": 14144, "freezing": 8076, "grandeur": 14014, "Sinhalese": 18989, "immunity": 20520, "choice": 2699, "diet": 5572, "1,350": 24410, "linked": 3810, "DESPERATE": 11919, "argues": 740, "economically": 14646, "Currently": 11251, "notifications": 2336, "fewer": 14798, "cuisine": 15442, "Shakespeare's": 4224, "Growers": 8080, "microwave": 2603, "Poland's": 16859, "permanent": 15297, "Sistani's": 19267, "difficult": 414, "intentional": 19272, "Specifications": 19474, "'60s": 29119, "enjoyed": 10833, "AKMA": 10914, "mechanisms": 878, "Smakkecenter": 17257, "UDCs": 23722, "Henry": 2938, "Quat": 12422, "pinning": 22111, "Covey": 21548, "plated": 10305, "solar": 11316, "Teresa": 23092, "sponge": 26711, "Acapulco": 6188, "1602": 16772, "invencion": 25452, "garner": 25896, "h-": 6815, "told": 6214, "meals": 11437, "Woods'": 22467, "creative": 378, "Academy": 1302, "1939": 5587, "unclenched": 9692, "counting": 6287, "colonialists": 31955, "puny": 32685, "Crew": 24481, "gets": 6512, "tussock": 25184, "marionettes": 25716, "owning": 28997, "York's": 5842, "Commodity": 21133, "’s": 271, "Danelia": 21966, "learnt": 1789, "Gary": 12441, "bass": 8559, "Vindebyørevej": 17302, "Metis": 32674, "extraterrestrial": 11320, "swung": 8722, "V-legged": 32493, "Tha-": 7126, "musician": 12343, "charming": 27960, "technician": 30023, "bona": 8110, "sell": 3725, "yen": 4759, "cross-cultural": 1958, "Ya": 6889, "convey": 7418, "threatened": 8728, "De": 3092, "suspicion": 13536, "frowned": 8727, "QUESO": 28491, "Blowback": 25738, "DOORS": 29695, "kebabs": 15558, "1865": 16894, "Steffes": 22460, "Mister": 6732, "transmission": 21052, "Non-Bondad": 21412, "Leithead": 24423, "operations": 2345, "Attention": 1499, "assertive": 6016, "inscriptions": 10163, "United": 20, "Horse": 17548, "ABC": 5246, "expensive": 7048, "nagged": 27345, "Turn": 22252, "1998": 5714, "A": 760, "bookings": 13650, "uneducated": 15463, "RAFAEL": 14362, "Oven": 18400, "queer": 31071, "FERC's": 21054, "Yep": 6461, "gasped": 14114, "UGH": 28714, "vigilant": 15711, "rather": 1350, "walk": 4693, "teach": 3192, "waiing": 17347, "aimed": 3749, "gandalf": 19463, "anybody's": 14639, "styrofoam": 27859, "pioneer": 5618, "skill": 26776, "slides": 10644, "oily": 8896, "ventured": 10534, "1560": 25443, "parenthetically": 11324, "grenades": 25813, "reeds": 9429, "01:47": 23210, "lighting": 2075, "multiplayer": 24243, "Moments": 9357, "Shalev": 11247, "Dante": 10147, "FERC": 21345, "Papeluna": 29426, "notional": 23418, "paradox": 6648, "I.S.C.": 23111, "Mademoiselle": 3895, "5.3": 5239, "hidden": 8379, "Interior": 13152, "jodud...@aol.com": 24671, "steward": 5958, "havens": 20473, "Counselors": 24266, "facilitate": 403, "ARD": 19459, "auditioned": 5754, "enchilada": 28528, "Flow": 21839, "nullified": 14716, "outward": 17797, "gender": 364, "sturdy": 18132, "eviction": 7590, "regulate": 14976, "suburbs": 16659, "CLEAN": 27383, "ll": 11068, "sailing": 14470, "elastic": 31567, "Tighten": 26731, "September": 2249, ".mdb": 30116, "conservation": 2104, "descends": 25348, "__________________________________________________": 22081, "ordeal": 30028, "Tco": 21809, "Seats": 22941, "nightly": 15480, "delectable": 28296, "joyous": 8557, "Cesar": 28540, "post-season": 11084, "Dulaim": 18527, "Surface": 32850, "LONGER": 11881, "investigative": 23666, "internally": 24637, "pushy": 29152, "memory": 63, "Ranger": 22087, "b-": 6326, "rays": 7018, "Rider": 13260, "Ants": 10261, "Greensboro": 13330, "peculiarly": 32372, "18:11": 24500, "definable": 2543, "owls": 16094, "ensured": 17076, "flattened": 31740, "originality": 2484, "venue": 4511, "Jove": 31292, "Shek": 12894, "switched": 8677, "handcraft": 28586, "phenomenon": 1368, "concerning": 2102, "knowledgable": 28381, "bights": 31192, "quartered": 25441, "assume": 7506, "communicate": 6002, "explained": 2886, "Kwik": 28701, "cuisines": 15433, "Tel": 20921, "meager": 20369, "boring": 17975, "Islamabad": 19132, "Emona": 4974, "w-": 6221, "’73": 19232, "flimsy": 32392, "pager": 23320, "Cuban": 16458, "full-length": 32698, "04:49": 22033, "Manakau": 16364, "Cortese": 5830, "Pictures": 26824, "HERE": 11886, "longevity": 23998, "flogging": 25233, "banner": 11081, "Tale": 14442, "runners": 19563, "Julian": 4117, "ailment": 25432, "grisbi": 5403, "Wyndham": 22798, "1:30": 21386, "Meiji": 4609, "lizards": 27765, "mins": 26773, "re-": 6645, "vendors": 12536, "drove": 4951, "cities": 9297, "filters": 26225, "incumbent": 1436, "craftsmanship": 12614, "closet": 10686, "proxy": 2775, "unimpeded": 12949, "crush": 13172, "lipsticks": 16003, "squeaks": 26432, "http://www.wikihow.com/wikiHow:Contributions-to-Charity": 10788, "farmland": 9114, "intervals": 18334, "sickness": 9926, "adjustment": 22317, "poles": 17276, "avoiding": 9611, "lines": 975, "bringing": 1468, "West": 4411, "Smith": 27, "frowns": 8775, "sorghum": 13483, "ramshackle": 18905, "Bullet": 24282, "inflated": 24588, "safeguards": 13169, "conduct": 3416, "Ibn": 18620, "dangerou-": 6761, "followings": 27487, "directive": 24403, "communalism": 14081, "Study": 3364, "handled": 23070, "vying": 17521, "deposition": 18563, "virile": 25667, "unpretentious": 29776, "offsetting": 13468, "C.I.A.": 30682, "rephrasing": 30857, "man-of-war": 31118, "notion": 3753, "Decrease": 29513, "happenstance": 14842, "sing": 17924, "missile's": 25797, "Getting": 17663, "behavior": 756, "Heian": 4655, "guy's": 6080, "governance": 15472, "metabolically": 10629, "paperwork": 18163, "Husayn": 4523, "emptiness": 8768, "Walton": 7533, "group’s": 12728, "LGBTQ": 7297, "Visualize": 24610, "Coach": 29037, "replied": 18837, "unorganized": 28952, "1960's": 29393, "coronavirus": 13802, "Viola": 25545, "theft": 12337, "Grill": 26907, "BAC": 28333, "moreso": 24262, "garnishes": 28890, "deity": 18219, "succession": 9949, "Nix": 14455, "frying": 32096, "hesitantly": 9602, "2;30": 26458, "disclaim": 31242, "taken": 772, "1959": 5484, "Digi": 12634, "Twister": 17947, "wish": 2297, "unselfish": 31031, "Bazar": 19603, "Lutheran": 5005, "joyfully": 32167, "move": 3715, "Renee": 21737, "Afghans": 12097, "21/03/2001": 22628, "impolite": 20607, "eight": 5810, "Altoona": 4878, "Cherry": 8228, "metropolitan": 16382, "Fisheries": 16301, "fainting": 17813, "Karine": 1501, ".?": 21791, "ambitiously": 19038, "Patrick’s": 27815, "Rhonda": 23533, "jiu": 28543, "Failing": 30669, "Gas": 6262, "Rodaba": 12098, "noun": 1142, "Uniformity": 14965, "brothel": 25592, "Parking": 29728, "acts": 907, "Zoning": 23168, "louise": 26976, "robots": 12083, "Wanted": 19993, "alternate": 22734, "touts": 29980, "outbreak": 1361, "Mohammad": 4463, "authors": 999, "Deploy": 18196, "Winston": 17468, "Snake's": 27349, "ads": 10692, "yr.": 11791, "blacks": 31782, "Subsequently": 19605, "04/16/2001": 22999, "steal": 27035, "scrutiny": 19492, "Tricks": 10324, "Francisco": 9776, "8.3": 15656, "Godspeed": 32592, "powerhead": 26668, "undergo": 31425, "Systematic": 2374, "gradually": 11276, "OFOs": 23658, "stooge": 19280, "Today’s": 2069, "Judd": 13641, "17:32": 24466, "clamped": 13826, "stronghold": 19024, "fulltime": 23456, "mirror": 9820, "rowdy": 30831, "GCP_London": 22994, "encourage": 12082, "essentials": 18150, "SHOULD": 24741, "GI": 25978, "haircut": 28142, "twenty-thousand-dollar": 30812, "overly": 17679, "MOON": 24447, "ponies": 6421, "currently": 4190, "somehow": 3881, "loo": 18069, "UNESCO": 10851, "stops": 8201, "corpora": 3812, "behold": 20238, "NASA": 2587, "investors": 11660, "s...@sonic.net": 24869, "S-": 6314, "unstaunched": 32875, "preconceptions": 20776, "Newton": 13396, "boozy": 30296, "staind": 11467, "livestock": 25088, "variant": 16273, "attendant": 22923, "equally": 7951, "KEVALAM": 24634, "bank's": 32319, "Faulkner": 30720, "triviality": 19920, "person's": 8484, "reversing": 9939, "potted": 32631, "fulfill": 14032, "Usually": 12780, "iguana": 6957, "joinery": 4587, "K.": 23072, "ambulance": 20505, "farthest": 31044, "Rumanian": 30575, "hinges": 6547, "separate": 3057, "AntyScience": 10239, "upgrade": 8394, "clan": 18526, "POA": 21609, "childhood": 8715, "5:30": 19849, "discovered": 3308, "Mmkay": 6951, "allowance": 17350, "Bat": 12566, "McMasters": 9762, "Marianne": 16056, "Pass": 19480, "schoolboy": 5028, "rocket": 11326, "238": 12257, "Brock": 4767, "w": 22221, "credence": 8178, "forehead": 9483, "Ruhollah": 18924, "boost": 1479, "singles": 11808, "sleek": 9020, "Kunst": 20190, "plagiarized": 3171, "confession": 20687, "holders": 4272, "train": 6356, "charged": 11638, "betray": 32710, "pursued": 18894, "allotted": 18276, "progresses": 25265, "lowly": 32575, "tmesis": 1136, "Marauders": 4872, "me": 1381, "Tyburn": 25442, "exquisite": 10722, "PD": 19970, "Kingdom's": 12643, "SOUND": 25381, "Aldrich": 18056, "Glandular": 24061, "Cruise": 12693, "Steal": 31333, "Kingel": 24248, "arms": 6856, "rotation": 3242, "02:17": 22405, "shirt": 5881, "resident": 7885, "Evansville": 13272, "tissue": 9870, "tat": 12495, "whipping": 32163, "recover": 15491, "Floyd": 14096, "power": 836, "broker": 19047, "unmediated": 10115, "degu": 27426, "metrical": 1072, "deterring": 19008, "workshops": 23278, "anime": 8266, "soaring": 24561, "tattoed": 30311, "25/01/2001": 23464, "Joseph": 3244, "peacekeepers": 14256, "GROOM": 19823, "Anouilh's": 5446, "rangoon": 28479, "software's": 26612, "pointing": 8830, "CONN.": 11803, "reported": 1703, "gradual": 2877, "Extracts": 1838, "hindering": 15209, "lovely": 15877, "Dollar": 21678, "shy": 25225, "pastor": 5589, "Heineken": 26918, "........": 27926, "abstractedly": 30416, "prosecutors": 19956, "familia": 28841, "1971": 3661, "Boutique": 28633, "brushes": 15708, "Aviation": 19590, "PoP": 26404, "forces": 2796, "Orthodox": 5004, "Members": 12302, "wireless": 8341, "excess": 18370, "dab": 19819, "TW's": 23616, "http://gimpedblog.blogspot.com/2011/09/gimp-video-tutorial-how-to-convert.html": 26623, "CANNON": 11501, "Spalding": 4445, "ordered": 15641, "conquer": 11182, "Christiane": 27639, "benefiting": 24036, "securely": 18136, "post-Saddam": 18950, "Dealer": 28851, "labels": 48, "passengers": 16294, "linens": 29826, "....................": 20101, "size": 1928, "whirl": 32232, "oja": 7001, "unpack": 18156, "petit": 28288, "reclaimed": 15352, "affectionate": 27353, "embarrass": 9543, "visa": 12053, "cereal": 16104, "Scientists": 13441, "plantains": 29473, "17,100": 11525, "100": 13291, "freckle-faced": 32134, "sorrrow": 14027, "Provide": 26323, "confirmed": 4288, "locally": 1798, "Passion's": 12494, "meds": 28051, "01/24/2001": 23420, "perfection": 23492, "16": 508, "CRRA": 21224, "simplifications": 22598, "RAPED": 29146, "flirt": 17952, "4TH": 29684, "rosters": 4891, "KAMALA": 14303, ":.": 24908, "heaven's": 31563, "Penny": 28448, "made": 1520, "Chet": 11122, "Catbird": 12548, "pilot": 91, "kiddies": 29122, "spot": 7512, "ribs": 9644, "Odette": 5854, "sample": 444, "fixing": 11945, "ante": 881, ":": 6, "horrible": 7036, "radios": 12014, "Mommies": 23921, "Brotherhood": 10312, "remind": 5045, "pitcher": 4804, "0590920648": 16700, "ammonia": 26571, "Asked": 24460, "nicest": 28116, "Caprese": 17769, "instigate": 18764, "Ambiguity": 17611, "Azerbaijan": 20630, "breakaway": 23995, "Frisbee": 18348, "notte": 5498, "27th": 5533, "typical": 2141, "leaning": 9864, "conditioned": 29098, "outfit": 9813, "quantitative": 1623, "games’": 1631, "6th": 2856, "succintly": 20251, "calculating": 22172, "LAURA": 25355, "muttered": 30417, "solicit": 24359, "Conversation": 8536, "2.4": 26083, "LeRoy": 6141, "confidently": 29903, "29": 2688, "You’re": 8619, "stubborn": 17323, "looser": 19659, "6/14": 21789, "Conversion": 5096, "$ometime$": 26750, "Ghassemlou": 29065, "Aquarius": 2579, "Forest": 28132, "tarred": 9076, "Cursed": 32273, "plots": 4659, "Requests": 13196, "Quixote": 25513, "pride": 15435, "filmed": 15736, "elbow": 31018, "Johnelle": 20713, "showdown": 12610, "Naha's": 26942, "reprimand": 5966, "http://www.caribbean-cruising.net": 26926, "parachutes": 18181, "continued": 3194, "enthusiasts": 17161, "migrains": 32826, "subpar": 8033, "intuitively": 24638, "Doesn’t": 9861, "misunderstanding": 5674, "dramatic": 532, "Sunni": 18536, "basket": 8977, "good": 2080, "Amount": 21637, "go": 5061, "importance": 1582, "rocky": 16266, "grey": 13702, "psychologists": 15012, "creating": 875, "Stark": 22908, "perfecting": 17686, "Looming": 25728, "recession": 26043, "MVP": 4880, "bastard": 30845, "us's": 31993, "catastrophic": 19125, "indivisible": 14036, "carpet": 7137, "Approximate": 25929, "distorts": 15622, "jumper": 18191, "Pellegrino": 16109, "Ellis": 21413, "heels": 8575, "laborer": 31070, "meal-times": 31255, "62,500": 21042, "obscured": 32383, "manifold": 29053, "Mackinaw": 29631, "uttermost": 30933, "uncrowded": 12268, "doltish": 25522, "Topless": 17386, "airless": 31682, "militant": 10458, "duster": 26281, "CONTEMPORARY": 14911, "Quaffle": 18346, "resubstantiation": 22656, "peroxide": 10228, "FOUR": 24988, "natives": 15413, "hideouts": 20472, "vocal": 1736, "revisited": 11463, "MERS": 13805, "groove": 9317, "salesman": 13404, "screening": 26022, "skinned": 9146, "frightening": 10464, "Tues.": 11724, "explosive": 17082, "vera": 15950, "numbing": 23896, "documented": 8101, "AREA": 11515, "snowboard": 28050, "claimed": 6011, "1978": 4080, "Grizzly": 28467, "Hapupu": 16323, "dih": 6339, "museum": 47, "RELEASE": 14099, "tripping": 18177, "stare": 25554, "throbbing": 32030, "prompted": 3915, "handful": 19306, "01:09": 23061, "cherry-": 31559, "Separating": 27866, "Increased": 24562, "narrowly": 23695, "Italia": 28295, "lauded": 23346, "RUDE": 28396, "conducting": 3804, "Appreciate": 20987, "10/31/00": 22404, "Riding": 25000, "phoebe": 25118, "club's": 4856, "09:01": 23525, "Harvard": 3359, "Daniels": 9328, "03:51": 22555, "dynamically": 30074, "Pioneer": 26038, "Afraid": 19869, "temple": 14330, "society’s": 8326, "planning": 8071, "flock": 12928, "clinched": 11089, "p": 1687, "sailor": 30832, "Possible": 25881, "FOURTH": 10159, "madrasas": 20477, "proceeded": 12315, "laser": 12909, "apprenticed": 27954, "astronomers": 15321, "rack": 17877, "manor": 12565, "thump": 9718, "Juan": 18874, "disturbing": 18843, "A1237": 17568, "rudest": 29613, "Dandenong": 28884, "Interim": 13923, "images": 10162, "Links": 24749, "captains": 30950, "hindlimb": 2891, "Compaq": 21202, "Travellers": 27019, "shines": 7811, "Maine": 26095, "hoop": 30512, "earthy": 31133, "Vernon's": 32066, "turquoise": 32137, "guardian": 18213, "Hotline": 23591, "datasheet": 30073, "NICER": 30016, "strictures": 30384, "wolf": 25005, "proceed": 7567, "ratty": 26866, "bunch": 6890, "predestined": 6649, "N'T": 11833, "brief": 3142, "ie": 21339, "boot": 27581, "driver's": 27221, "exemptions": 31443, "Determined": 13864, "WHY": 21083, "Ercot's": 22863, "democracy": 12395, "timeframe": 22613, "illusionless": 30694, "swap": 6103, "Shemin": 21468, "blades": 8409, "Chandler": 17047, "Here’s": 7732, "Delete": 23483, "Dampen": 17731, "143": 23409, "asymmetric": 905, "unearthed": 15723, "sleeping": 9408, "Feasts": 32212, "fur": 24127, "playing": 2023, "1969": 11716, "Cheer": 11070, "MTPs": 14513, "wee": 19770, "Bowes": 23846, "eather": 29607, "diaphanous": 30926, "cranium": 18245, "principles": 1745, "fading": 10184, "connecting": 15101, "mystery": 8733, "seasonal": 21582, "Travels": 24216, "wall": 3286, "complimented": 29076, "Introduces": 25482, "lure": 9412, "Maviglio": 23677, "Bojinka": 20675, "Unfriendly": 28168, "Spare": 28433, "Nz": 30162, "boxwood": 31644, "fairer": 7975, "relationship": 2507, "fleeing": 4362, "Whoa": 14636, "planners": 20475, "Calle": 17014, "t.": 22223, "integrity": 24930, "consumer": 3020, "6:13": 14590, "routines": 15035, "contains": 4000, "HOPE": 11898, "Qaeda’s": 20595, "oaths": 14305, "Messaging": 17951, "abuses": 19303, "arrayed": 25786, "MANAGER": 29690, "Spacetime": 15534, "heedless": 9409, "egalitarian": 15516, "planned": 5722, "ages": 8499, "sunroom": 28240, "reedy": 17767, "enviably": 5949, "Top": 18366, "adjusts": 6624, "peanuts": 21250, "Student": 12242, "before": 1633, "Buwei": 3396, "thick": 8835, "secondary": 14573, "Judicial": 24715, "12:36": 23121, "Tucson": 28252, "Kut": 18505, "theta": 3714, "thin": 4660, "attorney": 7169, "fish": 8815, "whistling": 30472, "counterintelligence": 19392, "deadness": 30614, "Adorned": 16347, "smacking": 9730, "Campus": 2236, "611": 26741, "let's": 6216, "electronic": 20479, "Roaring": 16261, "apologetic": 29880, "Hamdullah": 12074, "surely": 1275, "ISO": 22871, "intersects": 2350, "Sophie": 4205, "meritocratically": 12984, "consequential": 14347, "Publications": 20861, "regarded": 14861, "Kerrigan": 23763, "sharp": 10008, "oddly": 13614, "hectic": 25273, "consciousness": 8333, "Hotmail": 24164, "Book": 28386, "Deals": 28225, "Pettigrew": 31979, "constituted": 32789, "Australia": 4145, "timbers": 9077, "bruised": 29934, "japanese": 26133, "YouTube": 5180, "Padmasana": 24181, "hesitating": 31038, "walks": 11257, "soot": 9149, "petard": 18815, "DOJ": 20774, "casualty": 20833, "Thanh": 26513, "Boxer": 3345, "smuggling": 19380, "miscreants": 29822, "Kendel": 24553, "upscale": 27245, "03/21/2001": 22991, "Esports": 12573, "AIM": 17955, "COMES": 28749, "quashed": 14756, "storms": 8153, "Democratic": 4533, "cell": 8661, "by-and-by": 31004, "Perfect": 16126, "dentists": 28258, "behaving": 31302, "Broad": 4496, "CHICK": 28735, "!!!!!!!!!!!": 26336, "p.": 2475, "exploration": 159, "jewels": 9100, "horseshoe": 6400, "DUMB": 28739, "make-shift": 32595, "Deeper": 32618, "controls": 2551, "Quantcast": 10766, "Aaron": 19446, "How": 31, "cynical": 20428, "Patel": 22038, "methodically": 30356, "Basically": 11330, "DECOR": 29622, "fluttering": 10027, "book": 2400, "narrative": 2501, "Sibley": 22857, "Leads": 23131, "nineteen-forties": 31973, "Alarcos": 1009, "Aesar": 18054, "Signoffs": 22035, "Spreading": 30663, "Ernie": 21911, "torture": 24859, "central": 439, "wilted": 30308, "lean": 11971, "chattering": 30550, "wats": 17377, "Buis": 22403, "vlogger": 5182, "great-grandfather": 31640, "debutans": 13102, "Investments": 32558, "tranquil": 30445, "Baggio": 12436, "lemon": 6698, "disenfranchisement": 8160, "heavy": 6660, "fairy": 9867, "Bee": 15235, "969's": 21066, "quantifying": 410, "Polat": 1538, "Lone": 22086, "Enemy": 9252, "Parvovirus": 27611, "billion": 5187, "Listening": 23644, "Flickr": 15226, "impersonal": 31598, "Leach": 21811, "dadaniela@gmail.com": 1503, "biodiversity": 17136, "resilience": 8165, "Buxton": 10351, "C.DTF": 23804, "Fruit": 26351, "behaviour": 330, "recoil": 20564, "اصفهان": 16725, "07:50": 23274, "miss": 10176, "Right": 4780, "Lotfollah": 16796, "SENATE": 14297, "hay": 6677, "lookout": 18511, "since": 1097, "thereafter": 19219, "golf": 13372, "stalked": 10043, "relative's": 20765, "saxons": 27629, "aortic": 29919, "Neither": 23700, "perceiving": 14996, "Stories": 26807, "theatrical": 5385, "Terminal": 17109, "colonization": 18785, "rekindle": 23945, "downloaded": 24976, "stitch": 32786, "farrier": 27947, "Age": 1074, "identifying": 8716, "!!!!!!!!!!!!": 26246, "scrambling": 9272, "Waxman": 25987, "Outback": 28918, "Certain": 30037, "streamlined": 12951, "Refusing": 6001, "1920": 3380, "towering": 15599, "etc": 224, "jumpy": 32284, "Brava": 16121, "Checks": 24010, "arrive": 12280, "luck": 12915, "http://www.chernobyl.org.uk/page2.htm": 18706, "Sacre": 29333, "forgave": 5986, "biographers": 3940, "traces": 20545, "updates": 21452, "so-called": 31751, "Koran": 25347, "padlocked": 32047, "Differences": 2786, "plaque": 10181, "archeological": 13507, "Veterinary": 20571, "shell": 12858, "flirts": 17960, "boards": 7005, "Nottingham": 25204, "Staccato": 11282, "Incidentally": 16847, "HBO’s": 2930, "ANTONIO": 25393, "cult": 20035, "brightly": 7812, "Hm": 6499, "Edit": 26928, "Pilates": 28157, "audio-visual": 31396, "secluded": 20001, "CHILL": 26761, "Sophronius": 4961, "diagnosed": 21244, "CCA-15": 22149, "outro": 15790, "insufficient": 1960, "Goldberg": 3783, "sleeps": 14008, "Kowalke": 23592, "renewal": 14342, "Europe's": 16866, "friendliness": 29791, "Kelly": 15239, "vitamins": 15929, "Oglethorpe": 21905, "signers": 24666, "stereotype": 17413, "bonus": 26808, "Buckingham": 28967, "Antarctic": 10675, "expires": 16028, "God's": 31160, "09:22": 21729, "PLAN": 22874, "megawatt": 23681, "offer": 325, "mutually": 21603, "figures": 15362, "courtyard": 9179, "wiped": 8668, "Sorry": 8694, "Victory's": 11061, "Settlement": 21662, "6.25": 21925, "deepen": 8478, "avenues": 2912, "rabble": 24290, "manufacturing": 16400, "TMS": 23598, "invited": 3476, "AS400": 22590, "weighed": 6659, "rendering": 11311, "PALS": 2655, "several": 191, "restful": 25272, "’d": 7716, "transact": 23057, "wa-": 6796, "extraordinarily": 28236, "Centro": 2238, "swelling": 9510, "Image": 10202, "08:50": 22167, "cardiac": 20747, "messaging": 17957, "shrink": 25603, "Carlos": 21655, "belly": 8607, "Euro": 13900, "gentleman": 14108, "MT": 24022, "Spang": 1006, "10,000": 8075, "Dave": 14462, "improves": 2157, "flower": 8935, "fraternity": 7310, "alternates": 22736, "neighboring": 17042, "o.k.": 21795, "Cheney": 24375, "Gaining": 26809, "Collateral": 23490, "comparable": 10452, "compost": 12006, "6/1/01": 23544, "Rules": 29759, "1952": 3461, "equations": 3850, "harmonious": 32772, "ultra": 21771, "Chi-wai": 12490, "documentation": 13379, "capitalization": 15110, "Secunia.com": 12792, "generations": 11188, "Kevin": 6777, "taxpayers": 19122, "potatos": 27446, "queen": 29252, "Babylon": 20211, "unformatted": 30144, "WiFi": 26749, "XV": 3524, "Explorer's": 12769, "reviewers": 28623, "DIGITAL": 26204, "theory": 2537, "52": 8059, "borrow": 6341, "dressing": 8171, "usefulness": 12802, "2.975": 21398, "Structural": 31502, "ON": 11879, "axe": 31241, "tethered": 7364, "unfixed": 32487, "encouraged": 318, "blended": 16199, "court's": 13247, "sport": 10843, "SORRY": 29692, "retrieve": 12154, ".lpk": 30173, "redownload": 15869, ".348": 4839, "propane": 27309, "sofas": 17423, "’ll": 8374, "Sussman": 28778, "genetic": 9582, "refers": 2461, "vlog": 15696, "ale": 27945, "Q": 15634, "strategically": 8028, "1527": 27112, "that'd": 7204, "outright": 11645, "Pitney": 23845, "D-": 6501, "'70's": 8496, "Over": 2646, "technological": 8287, "Jarrold’s": 4118, "marvelous": 20141, "monetized": 7965, "enabled": 686, "Etudes": 3437, "deep": 5051, "Shortages": 24575, "opals": 32271, "believing": 30000, "underlined": 31943, "buoys": 2558, "lush": 16639, "substantially": 7251, "ten": 3652, "B2B": 23852, "http://judiciary.senate.gov/testimony.cfm?id=1725&wit_id=4905": 24747, "congregation": 20132, "cooperated": 12319, "browning": 17875, "motivated": 12310, "equip": 21774, "owns": 5802, "Love's": 25398, "Moreover": 876, "rights": 768, "STUFF": 27483, "alive": 7838, "Shindand": 19735, "kindergarten": 28083, "ethnocentric": 15455, "maintain": 5643, "delinquent": 10921, "danger": 11607, "Gore": 18839, "bit": 6382, "teams": 11002, "253": 15151, "JPY": 21666, "Civet": 24840, "kitten": 26268, "clearly": 1769, "dashed": 9720, "cantering": 26655, "quantification": 13586, "mentor": 4642, "navigation": 26925, "beaten-up": 32397, "billions": 9215, "spawn": 19169, "apprentice": 25700, "transactions": 741, "cults": 20033, "AFTER": 11841, "Sept": 11399, "welch": 21538, "RIGHT": 29657, "Housing": 31571, "diode": 2106, "strobe": 29598, "SS": 23125, "Ḥadīd": 4470, "insects": 10207, "we’ll": 8866, "02/13/2001": 21723, "rented": 19853, "boots": 15965, "stalemated": 19005, "union": 7282, "conclusion": 12309, "regading": 21611, "Restored": 28994, "wallowing": 31171, "47's": 18576, "delta": 9116, "Bali": 20397, "MUNI": 27269, "tenet": 1715, "EXPECTING": 28578, "Hamid": 18524, "Kr": 17291, "easing": 14263, "Rice": 4837, "carotid": 21703, "20005": 22811, "inexperienced": 29061, "shrouded": 10608, "fruity": 16248, "delicate": 26375, "more": 377, "illegal": 7463, "abt": 26215, "frustration": 9201, "====================================================": 21806, "Credibility": 707, "1733": 3213, "09/20/2000": 21206, "incredibly": 11323, "anti-essentialist": 14926, "sporadic": 29874, "Movement": 3357, "doses": 13841, "emirate": 24363, "completes": 17678, "silence": 5088, "encircle": 20540, "bewildering": 32896, "Edinburgh": 27009, "empathy": 9646, "moorland": 26191, "Sjöstedt": 31369, "decade": 2568, "flexion": 2753, "territorial": 24560, "extinct": 2776, "Calvary": 5590, "SOO": 14577, "Christina": 19116, "Wontons": 28432, "battled": 11063, "nerves": 8870, "Mako": 16075, "disarming": 19039, "Sally": 4240, "depraved": 6570, "blessings": 18735, "Substantive": 22660, "Greater": 17049, "staff": 1465, "ranked": 16383, "non-interference": 19668, "detonation": 31180, "sweet": 10536, "boarders": 29788, "Quinn's": 30278, "handsomely": 20418, "Streets": 30398, "excused": 30460, "speak": 2465, "standpoint": 29421, "reddest": 13739, "Finished": 17879, "entities": 14994, "Hollywood": 6170, "09:14": 21185, "7,000": 25806, "NEPOOL": 21584, "Gracie": 28541, "Fallujah": 18591, "trickle": 7978, "Release": 24472, "constraint": 3750, "ungainly": 10048, "hundreds": 1021, "subform": 30224, "coach's": 18341, "goal": 7456, "Warwickshire": 26128, "copyrighted": 10800, "coastal": 2615, "amuse": 29485, "success": 4622, "Mick": 25623, "GIMP": 26614, "Osip": 30771, "awaited": 9270, "surounded": 27294, "WHAT": 21075, "Watergate": 14393, "balloons": 6271, "Equals": 7120, "generate": 2196, "AK47's": 20022, "answetred": 28689, "falling": 6005, "Øhavet's": 17253, "intake": 10233, "FLOOD": 11514, "ancestors": 16330, "415.621.8317": 23323, "works": 119, "supervision": 10262, "uin": 24900, "Vodka": 18411, "drama": 4110, "graveyards": 9112, "acidity": 16193, "opinons": 26888, "amy.cornell@compaq.com": 22139, "01:02": 23421, "people-smugglers": 31523, "Was": 6930, "Buyer": 23019, "enchiladas": 28497, "sorrows": 17985, "run-time": 30170, "beside": 4074, "shelter": 14267, "answered": 1993, "laudable": 19795, "workload": 7730, "Sign": 24664, "Commanders": 12872, "briefed": 19681, "evolved": 3717, "drill": 26922, "Bogaerts": 4940, "ribbon": 29828, "within": 368, "Emam": 16774, "Googlenut": 24495, "toiletries": 18152, "perils": 2164, "Maynard": 8255, "Dye": 1545, "ivory": 31286, "waht": 23909, "pesto": 15770, "713-853-3044": 23599, "texts": 10975, "Prideful": 17628, "clergy": 24686, "10:55": 11785, "help": 2074, "childish": 20435, "Strait": 15278, "endow": 1340, "basking": 24609, "eleven": 6224, "trunk": 32150, "reorganisation": 32560, "Beatty": 14133, "Broadband": 21113, "fear": 9411, "occurred": 941, "42.65": 1696, "yheggy": 24461, "pondered": 32802, "wired": 7908, "mom": 6948, "sauce": 16119, "buffer": 8508, "winking": 14806, "booster": 8861, "hoops": 18297, "111": 31534, "league's": 4827, "Jesus": 4993, "non-Arab": 20355, "Edwards": 14714, "term": 1825, "conundrum": 20213, "Cliffside": 16527, "Orwellian": 20464, "201-592-4699": 16588, "limit": 937, "Edge": 4167, "emitted": 32357, "T": 2057, "greeting": 17338, "pyrimidal": 20308, "ohm": 29285, "hampered": 2713, "Keywords": 2259, "E.g.": 15178, "won't": 6712, "predominantly": 20353, "Opus": 11279, "Gel": 23986, "S’": 9868, "bombings": 18498, "Warren": 19990, "venture": 15061, "hangout": 27569, "useing": 26760, "Till": 10139, "bumping": 20783, "turd": 30362, "remake": 6932, "Chihuahua": 5569, "Hawijah": 18528, "Ismat": 20761, "makeup": 15707, "descendant": 14371, "uhh": 16115, "Pike's": 24823, "rubbing": 27951, "rapporteurs": 31550, "Dow": 21850, "augment": 390, "van": 29886, "No-59": 31481, "ant’s": 15623, "booking": 13787, "Disabled": 10873, "load": 12005, "refreshment": 13420, "Fraser": 23373, "distinguishing": 8762, "detector": 20403, "chords": 25690, "cehf": 29779, "decide": 2296, "Xishan": 14876, "pitiful": 31046, "#currentevents": 7826, ".227": 4826, "Rove": 25898, "1656": 16816, "Texans": 14710, "Jr.": 4920, "SlimSkim": 26675, "Ne": 4048, "BURNT": 28186, "shoots": 8910, "Sheila": 23138, "Katrina": 24393, "Casnondelibreaten": 18091, "bystander": 18324, "02920": 24312, "questionnaire": 12952, "atrocity": 20508, "etter": 27604, "11:45": 22340, "responsibly": 8371, "comp.mail.maps": 24324, "bediener": 30561, "linguist": 3646, "exemption": 31435, "focusing": 93, "BRENNER": 22843, "Nearly": 14704, "270": 25949, "remained": 4293, "obliterating": 22095, "MOO": 28435, "Drizzle": 18375, "Fet": 18079, "PROGRAMS": 23029, "avenger": 25566, "Bye": 15791, "NAM": 24633, "bid": 19015, "MISTAKE": 28873, "Weekends": 28170, "brightness": 223, "comps.": 11728, "sandpit": 31222, "Instinct": 10578, "pan-democrats'": 12512, "Taiwan": 12891, "leading": 2129, "mongrel": 9599, "Would": 6683, "'nt": 13766, "Potters": 7766, "Subscribe": 15903, "narrowed": 20696, "standing": 2745, "apologised": 24564, "Fall": 14796, "CLUSTER": 23033, "scold": 27392, "definitions": 20156, "dividing": 17478, "ShakataGaNai": 10749, "whispering": 31086, "’72": 19231, "party": 7134, "departments": 495, "details": 1089, "carefully": 2992, "protected": 7481, "perspective": 3091, "partridge": 31616, "fresh-water": 31039, "organisations": 24442, "recited": 30773, "interested": 1357, "flawless": 9513, "raindrops": 31998, "Counsel": 7366, "EXPERIENCED": 29062, "conference": 3665, "press": 9353, "proposals": 2366, "#causalargument": 7827, "IT": 13992, "Office": 7540, "languages": 1749, "attraction": 16331, "²": 17322, "barrier": 27264, "sandwich": 8871, "Mukalla": 17168, "adjustable": 23290, "halted": 9966, "cologne": 31699, "starts": 6241, "non-human": 24877, "bare": 9508, "92101": 23890, "printing": 28384, "Rosebud": 6284, "rotten": 6675, "trimester": 16152, "conservationists": 25080, "irritable-looking": 32356, "orthographic": 26829, "illegals": 27270, "112th": 30298, "gaps": 8699, "wrath": 26433, "Believe": 25213, "labour": 12831, "Hikmetyar": 19678, "dualities": 23958, "annual": 557, "piano": 32548, "conduit": 19532, "Corey": 22106, "safeguard": 8096, "Before": 9686, "Liau": 29518, "Teach": 18101, "Montejo": 16970, "conjunction": 22795, "pipelines": 10444, "breaking": 1140, "Twelve": 6986, "knotted": 9089, "DSL's": 28199, "hailstorm": 28503, "readership": 10761, "abstain": 19790, "Margot": 31911, "developing": 2047, "forgo": 20989, "Earth’s": 14606, "forced": 5574, "invoicing": 21399, "landscape": 8285, "parents'": 9828, "scenic": 17210, "mcallister's": 26451, "trailor": 23897, "date": 519, "reestablished": 18937, "Corpus": 3825, "stature": 19916, "Itinerary": 27493, "thumpstar": 28353, "warmer": 16192, "station's": 31258, "couter-cultural": 20130, "dispersion": 1697, "carts": 32316, "collaboratively": 13979, "count": 6276, "smash": 4579, "cling": 25300, "forest": 10001, "concessions": 31380, "Nice": 7135, "pendulum": 19113, "business": 526, "Exploration": 24482, "Oxford": 29634, "world-wide": 31423, "Artist's": 11310, "remarked": 10513, "re": 21499, "forges": 32911, "claws": 10037, "Rangers": 26104, "ty": 26601, "norms": 7276, "Leung": 12403, "66": 17448, "transfers": 20690, "assumed": 4286, "cigarette-making": 31814, "came": 3136, "Icky": 11770, "Sinatra": 5536, "adorns": 4757, "Chathams": 16276, "OWN": 29701, "XSLT": 30101, "___________________________________________": 23200, "blindfolded": 18340, "environmentally": 28270, "Reuters": 21675, "writing": 2413, "Blogging": 24417, "Terrible": 25503, "educating": 19268, "Chittagong": 19621, "aspiring": 25260, "Wal": 25853, "sketchbook": 13748, "Hay": 18616, "Machine": 5475, "Rolls": 21138, "MEALS": 29655, "EEFTL": 21668, "dockworkers": 9133, "partnerships": 13985, "Tern": 17221, "redirect": 20206, "Sandra": 23149, "Comprehensive": 14248, "accession": 31362, "Ernst": 10119, "breasts": 31194, "Edmund": 14893, "anyting": 21287, "Continental": 3552, "Carter": 23754, "moist": 17736, "ASK": 28392, "tho": 29130, "stair": 6924, "else": 3972, "county's": 7584, "call": 5556, "safe": 8708, "pedicure": 28441, "Cool": 6196, "nights": 9549, "misrepresenting": 12833, "Cooperation": 13876, "providers": 22424, "Meeting": 17552, "sled": 6285, "urges": 13541, "Guard": 19186, "accessed": 16534, "Finnish": 31470, "ululating": 31831, "28,000": 13299, "lunatics": 25582, "crepey": 9529, "retake": 22676, "CFL": 2046, "Date": 16257, "crispy": 29995, "vegetation": 9998, "verified": 20250, "Uncannily": 30275, "dirtier": 26951, "Palestinian": 18885, "excited": 10595, "site's": 10753, "registration": 22485, "Parole": 20837, "archipelago": 17271, "reworded": 23479, "template": 30091, "passenger": 17426, "overlook": 20819, "1/2": 14413, "202.637.4781": 22808, "political": 471, "Korea": 12835, "navy": 12166, "passports": 16448, "refugees": 12127, "1611": 25396, "conglomerate": 20551, "Distraction": 7654, "stimulate": 1067, "forgotten": 6144, "panics": 26851, "cement": 25990, "staunch": 14364, "Lihaibi": 19340, "Ostrom": 730, "dances": 21243, "videoconference": 22344, "flowers": 9370, "Microsoft's": 12758, "TM": 22491, "propped": 32269, "forty-foot": 32773, ".xsd": 30120, "uncertainty": 757, "Jesuit": 4301, "zither": 14882, "Neighborhood": 24488, "special": 339, "separating": 16022, "scored": 4846, "draws": 7629, "TFs": 15853, "Cassandra": 12638, "Verdot": 16244, "libel": 20889, "teammate": 4860, "Supposedly": 30027, "twenty-mile": 31239, "drug": 8587, "Cloth": 26288, "hoeing": 11980, "wii": 26797, "FHS": 29454, "fifths": 7123, "chat": 7804, "blossoms": 9395, "chicks": 27136, "undertakings": 31531, "expulsion": 3836, "messed": 9640, "waging": 12706, "tripadvisor": 27406, "bachelor": 5637, "warlords": 14199, "symptom": 15800, "inclusion": 4829, "10:30": 21517, "violets": 32112, "wealthy": 3622, "Avoid": 5240, "75": 8185, "Qa'ida": 25961, "Cures": 24070, "postdigital": 3014, "explanation": 12978, "Swap": 21632, "pwople": 26456, "Devolution": 14516, "designer": 13373, "derivative": 7473, "finalizing": 14219, "supervised": 20651, "SMOS": 2573, "loaves": 9183, "Venice": 16756, "midmarket": 23510, "Other": 1556, "Σωφρόνιος": 4964, "stocky": 31908, "possession": 7572, "clothes": 9187, "Alike": 8542, "pour": 4058, "trailer": 27227, "San": 5706, "appliances": 2136, "bump": 30352, "palms": 12017, "glimpsed": 32847, "including": 361, "paintings": 99, "firm": 3612, "merge": 24615, "G&G": 29802, "PMID": 15245, "drinks": 6806, "adviser": 14461, "Ill": 23016, "disown": 32792, "forecast": 21303, "ask": 6209, "blackness": 9988, "facts": 15143, "Nov.": 18564, "essay": 5652, "resumption": 14739, "Aging": 8474, "pretense": 1246, "collaborative": 90, "genuine": 1205, "Plays": 17555, "interconnected": 17499, "distilled": 18024, "journalistic": 19206, "ihop": 26903, "theologian": 4970, "manuscript": 4010, "dispossesses": 11613, "degenerate": 20185, "daydreaming": 8018, "that's": 6193, "adds": 11114, "mossy": 32289, "kilometres": 19737, "conflicting": 3983, "Physios": 28320, "Van": 20756, "Rahman's": 20839, "One's": 4193, "vocalist": 5534, "$ome": 26752, "farmlands": 26189, "http://www.csmonitor.com/2006/0509/p02s01-ussc.html?s=t5": 20020, "valuation": 20907, "ROADHOUSE": 29654, "screenwriter": 5349, "Sociologists": 15520, "enjoyment": 22092, "SNAP": 19952, "evolving": 539, "jogs": 16259, "vacations": 5436, "Parsi": 7242, "Midtown": 17135, "investor": 24162, "overpriced": 28246, "sad-feeling": 31578, "pressure": 3283, "Previous": 241, "le": 3276, "rape": 19448, "neighbouring": 18661, "theocratic": 18921, "tolerating": 28657, "Gauls": 30989, "whoopsie": 20054, "unresolved": 14225, "Manzano": 19207, "virtuoso": 20547, "slices": 10641, "Coined": 24187, "McDermott": 21233, "destinies": 23960, "jaws": 27362, "mutation": 2252, "Golan": 18617, "gosh": 6318, "mega": 26216, "Yor-vik": 17538, "flavour": 18437, "Manuscript": 10660, "gifted": 19108, "OFF": 29658, "freely": 11601, "morocco": 31642, "Plans": 14512, "Child": 6838, "co-ordinated": 13148, "Forsyth": 31736, "sons": 18533, "becomes": 2819, "mocking": 11969, "Repeat": 17792, "SCIENTIST": 28747, "Xander": 4939, "impending": 3989, "sunken": 9448, "disobedience": 15037, "discounted": 28229, "Robsart": 25445, "Olivia's": 31557, "defensive": 4833, "girlie": 22078, "clambered": 9032, "masts": 9074, "fridge": 15778, ".292": 4905, "instructor": 13409, "Establish": 18325, "view": 589, "totalitarian": 23955, "proficient": 8475, "embarrassment": 15085, "THAI": 26241, "Fillmore's": 3732, "refuses": 23230, "lose": 8730, "Dekalb": 19964, "edmonton": 28097, "Easterners": 17078, "Hmmmmmm": 20100, "GREAT": 28069, "713-646-3393": 23504, "they’ve": 14821, "yield": 7930, "Hypnotizing": 17787, "excerpts": 18679, "private": 774, "decisively": 7447, "delay": 11718, "1956": 16820, "clings": 14045, "intrigue": 23670, "dozed": 31695, "‘": 1725, "alt.animals.dog": 24836, "hurtled": 9219, "intimately": 19670, "shirtsleeves": 27807, "furry": 31791, "peppery": 16224, "mess-room": 31259, "Montparnasse": 4068, "O.J.": 10740, "achievements": 4393, "answering": 11241, "łódź": 16881, "concession": 7641, "et.": 24268, "killies": 27854, "auxiliary": 1147, "shoes": 6401, "enclosing": 20823, "Style": 27115, "electromagnetic": 7924, "202.739.0134": 22800, "frustrating": 27538, "HND": 26121, "Sergey": 12224, "M62": 17573, "provoke": 3916, "Turks": 4338, "voice": 7805, "teens": 27481, "plugs": 28914, "notify": 16299, "kingston": 20048, "Glorious": 31702, "Mum's": 32175, "he": 3174, "KCNA": 12842, "mentioning": 15152, "T's": 28829, "debt": 7931, "Cavaliers": 16432, "SDG&E": 23725, "nigeria": 27533, "mannered": 24718, "Gram": 9504, "Ideally": 2903, "Vogel": 18082, "SUM-DISTINCT-Price": 30048, "BOTH": 27480, "energetic": 14386, "abyss": 25555, "headmaster": 32441, "delighted": 21744, "warped": 15544, "Gallup": 22704, "hirier": 26457, "peacetime": 14468, "aquarium": 26478, "services": 450, "guitar": 25689, "Alaskans": 7894, "pee": 16058, "venerable": 30934, "Belgian": 15898, "177": 16532, "back-and-forth": 30679, "sweety": 21861, "Riverside": 17425, "50,818": 12459, "OS": 24214, "Medal": 4483, "camels": 28942, "hawkish": 19102, "CityGate": 21437, "Hum.": 11732, "Exit": 26912, "masterminds": 20855, "mints": 32700, "TRYING": 11893, "Failure": 11060, "conscious": 7291, "creational": 11277, "Fairchild": 28703, "serviced": 16293, "spy": 18051, "foods": 8035, "deserts": 8161, "filming": 4199, "professional": 475, "Schwa": 6707, "16,000,000,000": 24370, "Uecomm": 22228, "depth": 8720, "relics": 9592, "pesky": 19358, "setup": 2872, "Genova": 13198, "dipped": 9082, "colonizers": 13988, "na-na-na-na-za-ba-da": 6799, "newsprint": 18142, "McMahon": 23150, "9:30": 22867, "issuing": 12963, "Enjambment": 945, "moaned": 9673, "matures": 17760, "coal": 24574, "grimness": 31088, "Liquidweb.com": 28879, "torrance": 26904, "logs": 8966, "b****": 28971, "Dazzling": 5469, "Finish": 18258, "subdue": 19044, "challenge": 3008, "hoisted": 31203, "resented": 14687, "passport": 12810, "cater": 27001, "Commissioners": 22862, "-s": 28228, "hill": 9250, "meditating": 10138, "pasted": 24849, "invasion": 18906, "Fancy": 29092, "paternalist": 31752, "based": 493, "anger": 17606, "tripped": 13165, "closed": 4414, "antennae": 31790, "Vladimir": 25889, "Chomsky's": 3690, "wound": 19768, "collateral": 4875, "liking": 8705, "Appeals": 24713, "bottoms": 18159, "Laundry": 29566, "outweigh": 744, "continually": 11128, "shares": 8244, "Lights": 10129, "Marval": 23198, "exposition": 30851, "Reagan": 18807, "969": 21067, "wikipedia": 20102, "diademed": 31997, "bridge": 4593, "Scenic": 16314, "NPR": 19811, "MSN": 17954, "Diary": 4442, "169": 17429, "Apollinaris": 5142, "Survey": 2115, "April": 3560, "wangs": 26724, "transformation": 13994, "like": 428, "YouTuber": 5334, "Understandably": 20752, "Wool": 26503, "subset": 30082, "Panting": 32144, "wine-growing": 31494, "philosophical": 5021, "hopes": 10592, "braced": 23693, "Admin": 20947, "alt.animals.lion": 24833, "Egg": 26348, "Grissom": 29741, "properly": 2868, "avoidance": 20560, "involving": 59, "Dietrich": 23518, "1872": 4601, "signs": 10457, "jealous": 21867, "liabilities": 21105, "Mackie": 31564, "rosette": 29482, "reachable": 28591, "attach": 21217, "milder": 17216, "Assignments": 22430, "persistency": 30743, "Authority": 12260, "someon": 28989, "presciently": 8356, "crawling": 9682, "60,008": 21044, "dump": 7921, "enclosed": 21433, "Poles": 31862, "WWII": 27254, "Titan": 32673, "GRRRRRRR": 21535, "Municipality": 13194, "open": 1827, "Automatic": 944, "duress": 18866, "acquire": 1590, "disruptive": 15098, "squadrons": 19192, "icy-wet": 31662, "lube": 10493, "trance": 30243, "Chickie": 26704, "contenders": 19662, "Obviously": 7294, "Excellent": 6288, "revert": 30066, "apologized": 30415, "Bunny": 5337, "lee": 16550, "salt": 9010, "cop": 13529, "BBQ": 27832, "blonde": 29862, "policies": 604, "nicety": 31279, "Freese": 24797, "resentment": 31757, "rivalry": 19639, "substantiation": 22576, "equalising": 13143, "cra.org/resources/taulbee-survey": 562, "Motion": 11023, "Lord": 7217, "Epstein": 25608, "oilskin": 32476, "1900": 4900, "administer": 13831, "Women": 17395, "Onomatopoeia": 18086, "actully": 24518, "subtle": 3469, "electrons": 18035, "outcomes": 2013, "portents": 32571, "jure": 19035, "staring": 9251, "Liars": 29367, "education": 2441, "SUCH": 27024, "CHS": 24658, "china": 32014, "mon": 4056, "Meidan": 16773, "solemnities": 31819, "sixteen": 6535, "chai": 15759, "executing": 19786, "Proposed": 23309, "Tks": 22063, "hooptie": 28698, "parachute": 18232, "glandular": 18719, "decompose": 25149, "christen": 32438, "beloved": 7376, "drunkest": 28988, "sketchy": 29873, "legionaries": 30990, "photograph": 7420, "Haram": 13184, "LOCUST": 29953, "compelling": 8766, "escape": 3139, "provocation": 10431, "sez": 22478, "untrained": 29555, "inspector": 11811, "sleeved": 17382, "plant's": 17765, "enrich": 31447, "airports": 16451, "tv": 18626, "accidents": 20390, "Shadow": 6931, "fatalities": 10231, "Santa": 1506, "experiences": 4329, "Obama": 10437, "schedules": 10659, "Refugee": 13045, "wasted": 8055, "600-480": 22408, "Russ": 23792, "talkshow": 21553, "scholar": 10387, "yellow-brown": 31937, "BOX": 26779, "summa": 5560, "set": 528, "Alan": 21556, "Separate": 4739, "aberrations": 25714, "grinned": 23682, "1100": 17036, "reservation": 26439, "populations": 15291, "bullfights": 28332, "Legal": 11442, "MEAT": 29656, "ratification": 31361, "Filippini": 261, "methodological": 2043, "never": 2186, "mantelpiece": 32208, "obliterated": 3910, "roofing": 28729, "applications": 2258, "initially": 5092, "originally": 2693, "crossbred": 27133, "long-nosed": 32136, "NAME": 24966, "mollifying": 18802, "meditative": 30917, "stances": 13719, "KS": 17431, "Pricing": 22359, "HAD": 29670, "Reps.": 23593, "Altho": 11469, "Miyuki": 15886, "Bible": 4978, "post-accident": 18687, "resolution": 2566, "Relevant": 8251, "NY": 22007, "Mudo": 28840, "aliases": 30191, "6.8": 15655, "Rangatira": 16291, "players": 6190, "Broek": 31480, "Permits": 26468, "dissenting": 19319, "shutter": 11695, "Coming": 27377, "Siberia": 30770, "strippers": 20093, "port": 16553, "marvelously": 27916, "Normally": 32750, "decidely": 21351, "Johnette": 29136, "rave": 18033, "persevere": 14394, "decorated": 27915, "interplanetary": 11331, "B&B": 29312, "Halston": 13374, "Pachomian": 5940, "FL": 24697, "Old": 5374, "architectural": 4477, "it’s": 7711, "Bearkadette": 21316, "HH": 29576, "likable": 8869, "transformational": 3692, "urinals": 19088, "m.": 5353, "Viva": 5371, "tab": 7684, "consortium": 20550, "Stellenbosch": 16214, "WA.": 28932, "Geekseekers": 13789, "managing": 3009, "bike": 9836, "deliver": 11051, "1980": 13501, "instructive": 22386, "Super": 12498, "05/02/2001": 22968, "DELL": 26316, "DISTINCT": 30047, "polls": 10511, "Jefferson": 30687, "reverted": 9976, "crystallize": 10917, "dishonest": 14699, "punching": 9597, "Descriptive": 5625, "clans": 10073, "Structuralism": 5627, "blink": 14813, "Click": 19203, "autonomous": 23959, "luncheons": 31846, "Syria's": 25825, "blew": 10135, "toasted": 31981, "attaches": 7607, "Vinita": 17439, "gap": 2500, "billionaire": 32708, "DSLR": 26398, "121": 7502, "discourse": 3027, "prayerfully": 14150, "Workshop": 22894, "inscrutable": 30977, "Strange": 13563, "cents": 7160, "hassle": 28378, "choosing": 2166, "Their": 3767, "talkie": 27935, "spacewalks": 24812, "illustrations": 10124, "Men's": 17369, "dispersing": 20586, "Close": 5740, "Remove": 17739, "古": 14906, "substantive": 7371, "uni": 27637, "defendants'": 7545, "way's": 17638, "21": 584, "Laura": 3784, "behalf": 3917, "pre-Columbian": 15366, "precision": 13947, "followers": 14063, "founding": 5577, "region": 1976, "cheat": 11275, "falls": 3330, "decking": 28118, "Entrepreneurs": 15075, "defenders": 14782, "accommodations": 17142, "professors": 10260, "anchored": 30809, "rescoped": 22604, "makes": 1741, "southwestern": 19981, "Naha": 26930, "butt-headed": 32360, "pan-democrat": 12384, "centerpiece": 12903, "roosters": 27284, "nutrition-wise": 16172, "$ervice": 26746, "acoustically": 10918, "breached": 24409, "80Y": 21112, "Aegean": 31663, "confiscation": 19595, "manure": 32108, "dominant": 14291, "Preparing": 30140, "Pakistan": 18742, "Server": 21363, "magic": 10316, "CAMPUS": 11853, "Water": 8945, "humane": 10793, "reviewed": 1331, "prisons": 24285, "adventures": 30434, "Ashkenazi": 30734, "superfine": 17861, "1832": 3880, "FORGOT": 29673, "extraordinary": 20705, "READ": 30004, "thirty": 1862, "rideable": 28015, "bewitched": 31285, "Scripture": 6647, "arte": 25453, "Exercise": 26424, "banks'": 20967, "fluorescent": 2161, "routine": 14999, "Papillon": 16632, "MHC": 23068, "minimums": 27080, "suppleness": 32654, "SMS": 24223, "Valverde's": 31512, "sees": 8842, "Leonia": 16528, "fi": 5798, "Sicilian": 28844, "2.8": 25994, "Comedy": 10149, "WORST": 32020, "idly": 10161, "instrumentation": 23639, "pancreatitis": 27595, "Soper": 24112, "sill": 31797, "closely": 2873, "contributes": 3016, "oriented": 2291, "modifiable": 8524, "Wakrah": 4508, "spare": 15102, "assured": 7836, "economical": 2108, "lethal": 20392, "Hassen": 13134, "costs": 736, "city": 2962, "sipping": 9132, "EXPENSIVE": 29239, "suppressive": 12812, "Uses": 15207, "55,7": 17316, "sell-out": 32572, "12:48": 23384, "manged": 29526, "provisional": 22155, "eastward": 9986, "Worthy": 23764, "REPORTED": 11846, "Royal": 3225, "cosplay": 8260, "Garibaldi's": 25532, "Mo": 12474, "Sending": 32179, "courage": 4057, "camel": 17175, "males": 10872, "wrong": 6808, "Gregory": 4222, "interviewers": 23366, "mid-evenings": 19846, "Actor": 4141, "erythema": 2202, "Dominica": 16482, "nursery": 13207, "coolly": 30868, "Following": 3608, "therapy": 15719, "gardened": 31608, "AWFUL": 30018, "03/09/2000": 22554, "248": 27549, "affection": 24674, "NOOK": 26677, "cutaneous": 20782, "contemporary": 3013, "button": 8682, "voided": 26165, "sources": 468, "puts": 7423, "outliers": 15661, "Riggins": 22142, "persue": 22925, "bicycles": 32877, "bd": 16667, "02-05-02.doc": 23577, "quantity": 2440, "Polio": 2395, "surroundings": 113, "they've": 6843, "Savage": 10485, "reiteration": 19040, "Miracle": 26287, "150,000": 13006, "sporting": 16618, "logo": 22487, "vegetarian": 15777, "WINNT": 30203, "p-": 6615, "toxins": 27073, "11/30/2000": 22049, "Trent": 7035, "ρ": 3322, "cascades": 26995, "commercially": 1356, "designers": 30010, "verifies": 27039, "matched": 8509, "classmate": 3351, "womanizer": 4638, "Every": 5443, "Hieronymus": 4962, "Aquileia": 5118, "BEST": 26244, "Nail": 27959, "SHIT": 28765, "preventing": 5914, "EQUALITY": 24650, "05": 24236, "Thai": 17365, "Cyprian's": 31888, "practised": 17339, "Parmigiana": 28302, "mistresses": 10719, "distracted": 7672, "GRAIL": 29638, "starfighter": 9218, "displeases": 20038, "4g": 26179, "overage": 29652, "'72": 19850, "insoluble": 11671, "Zealander": 12672, "Nonetheless": 2902, "Taj": 17144, "JK": 18283, "argued": 7948, "acidic": 16186, "contribute": 3099, "pumps": 23412, "visited": 3379, "Pink": 16066, "None": 22737, "present": 606, "Fest": 10354, "glass-fronted": 32427, "8:35": 22475, "Medici": 25501, "offend": 27633, "episode": 2952, "TOMORROW": 11887, "825": 17265, "detainees": 26072, "ears": 9268, "3067": 22240, "Sacks": 23548, "dining": 8751, "Apartments": 28588, "outermost": 30217, "Freud’s": 14953, "Andrzej": 16908, "conflicts": 1433, "shaking": 31956, "roast": 21968, "mistakes": 9212, "Petsmart": 27752, "wept": 30608, "23.6": 18443, "socialize": 13346, "Glad": 15982, "Take": 6245, "Scientology": 12284, "displacement": 2742, "jimmy": 29418, "intact": 9178, "illustration": 30075, "Valdes": 21041, "mass": 2774, "Butcher": 23069, "neuroscience": 15861, "alt.animals.rights.promotion": 24829, "DONATIONS": 24541, "noho": 7521, "parody": 10499, "Angeles": 5725, "displaced": 7052, "Unbelievably": 29074, "depart": 16470, "Google": 5265, "proclaimed": 17534, "sizes": 18167, "Saddam's": 20423, "Cantón": 960, "recorded": 15404, "Khaza'il": 19287, "Ghana": 1843, "merest": 30322, "Wax": 5705, "intellectually": 6888, "mortification": 15500, "Warhol's": 7416, "sub-Saharan": 1977, "super-human": 8306, "Mecca": 12249, "bravery": 15726, "GOD'S": 25604, "Shanks": 27148, "viable": 761, "spectral": 9367, "impulses": 15017, "upholstered": 25614, "bicuspid": 29918, "Pitre": 16658, "disagreement": 31346, "reflect": 879, "factors": 259, "Superfund": 25947, "informal": 1873, "township": 29946, "strings": 3272, "ignited": 14115, "refer": 16160, "detentions": 20677, "installing": 7136, "Centennial": 24486, "heartily": 6550, "10/20/2000": 21940, "trusts": 9565, "meats": 29494, "shining": 9548, "aghast": 32912, "EDT": 14592, "analysed": 13448, "Beethoven": 4112, "SOUTH": 11498, "practices": 5093, "Rajavis": 20080, "Ulysses": 11371, "Don": 19201, "Attn.": 22993, "runflat": 29738, "Eaton": 8466, "quit": 13232, "200,000": 16767, "Supernatural": 5700, "beavers": 25073, "half-embarrassed": 31840, "We've": 11815, "benign": 19983, "blundered": 31210, "Limit": 27454, "treat": 8805, "eight-inch": 31124, "Meteorites": 11351, "brainstorm": 11109, "nation-making": 30701, "sector": 2154, "Antiques": 28423, "payment": 7148, "habit": 7744, "Yay": 15789, "journeying": 4313, "expressive": 4490, "Electronic": 25421, "compromise": 20891, "distances": 11185, "'cuz": 11748, "gene": 20043, "mid-May": 25120, "voluntary": 14569, "Cambodia": 19580, "destination": 16471, "117th": 14339, "abomination": 23895, "Willie": 27275, "Naval": 9243, "abundantly": 19749, "obtained": 1685, "aerogel": 11356, "Praise": 20097, "Both": 3465, "Dunn's": 23680, "HDS": 29885, "uninterrupted": 25108, "seas": 9372, "Quilis’s": 1133, "representationalism": 14922, "Evans": 10315, "coughed": 32153, "swigs": 32531, "(country|region)": 30181, "Truffaut's": 5489, "anti": 25702, "Kwong": 12499, "randomly": 17618, "competitiveness": 14525, "???????????????": 21013, "freshness": 8024, "Couple": 8472, "candies": 18417, "airborne": 2598, "coverage": 8564, "inferior": 15464, "Press": 10542, "612-205-9814": 24024, "writhe": 31142, "gestalt": 6795, "Wesleyan": 11682, "700": 12143, "Feb": 21924, "Builders": 7130, "Abbudi": 19265, "highlighted": 242, "sovereign": 6651, "rename": 30067, "waited": 8893, "pronouncements": 6576, "peril": 25884, "http://www.environmentalchemistry.com/yogi/hazmat/articles/chernobyl1.html": 18696, "Valdiviesco": 25474, "park's": 25068, "drip": 29600, "DIY": 26539, "Kiara": 13406, "gonna": 6046, "Eid": 23107, "misfortune": 9579, "conciliation": 31538, "Sheik": 20674, "Thirty": 7019, "accessories": 28654, "socials": 15793, "09:46": 23806, "worthless": 27657, "flexible": 16296, "mid-1980s": 16389, "Greenspan": 21557, "Sinyavsky": 30775, "valise": 30786, "Shouldn't": 22337, "Aunt": 25230, "banning": 13009, "Tan": 19193, "destabilizing": 14398, "anwser": 21912, "appetizers": 26247, "Mary's": 15978, "cold": 6220, "postage": 11764, "campsites": 17152, "reconciled": 22614, "Motorola": 24192, "Pull": 6334, "updated": 14917, "Giap": 27733, "forth": 5665, "radiation": 2193, "criticised": 12164, "stethoscope": 32494, "multi-nation": 20344, "Bell": 3944, "coreligionists": 18938, "handcuffs": 19929, "mast": 30843, "hide": 18313, "breeding": 20374, "halt": 9865, "ca.": 1041, "Sometime": 5576, "Mirror": 19871, "Browncover": 23603, "10,000.00": 24917, "hire": 10691, "Firefox": 12775, "haphazard": 30330, "divine": 6598, "sect": 19984, "World's": 12779, "microtome": 10642, "shivering": 8909, "student": 4590, "Life": 3472, "eventually": 3716, "Shaykh": 18755, "Pentagon": 19914, "titer": 28007, "neurobiology": 13579, "provocative": 18808, "Prensky": 1610, "SST": 2629, "Hodge": 21936, "sigh": 27089, "MUST": 27380, "seizure": 26798, "pretends": 20522, "scratched": 26536, "Tsinghua": 3410, "abilities": 391, "ship's": 12824, "Hoog": 23422, "Although": 512, "Cup": 4514, "trials": 13830, "Meowing": 24851, "Defining": 15914, "Icon": 5920, "fabrications": 20436, "rescuers": 24396, "http://www.cruisecompete.com/specials/regions/world/1": 27232, "instrument": 2515, "prisoners": 26074, "ala": 20127, "annoying": 17915, "Heres": 27780, "two": 570, "incitement": 20377, "aperture": 26231, "luminous": 30881, "used": 297, "Um": 6482, "turning": 6919, "ink": 11177, "machine": 8302, "Gulbuddin": 19675, "crocodile": 16083, "Success": 25267, "yrs.": 23446, "rearranged": 32957, "factions": 3951, "pathalias": 24325, "flavorless": 29160, "justifying": 23703, "hashtag": 12209, "zip": 12296, "hairstyling": 28371, "713": 21081, "Tape": 18135, "charging": 19410, "Seville": 27522, "Westmoreland": 27705, "gay": 9446, "manhood": 13613, "questioningly": 17919, "340": 19220, "Destroy": 27706, "operation": 1833, "ouster": 19740, "competitions": 10896, "Illyrian": 5010, "censor": 20300, "Pursuing": 25278, "deeds": 6574, "Associate": 22346, "UVR": 2201, "http://www.restaurant.com": 26248, "http://www.mikegigi.com/castgobl.htm": 27314, "refugee": 12128, "KSM's": 20843, "Sandeep": 27425, "svce": 28676, "cinnabara": 17189, "predecessor": 31421, "Revocation": 20278, "us": 1853, "4-ever": 28846, "distinction": 7615, "operatives": 18756, "always": 6450, "16th": 15795, "8:15": 15742, "GTC's": 22314, "Morris": 29780, "Mostly": 17684, "7:35": 23444, "thoughtful": 30643, "Talmy": 3793, "choir": 6230, "Syrian": 5157, "crusade": 6842, "alludes": 3889, "Brin": 12225, "GUI": 8268, "rival": 12776, "fullest": 15834, "grandfather": 29375, "interpersonal": 23621, "invitees": 22861, "Bloom": 28514, "skirts": 17381, "unconnected": 19685, "uncanny": 30489, "Important": 20257, "kibbutz": 30803, "Prosecutor": 31776, "crushing": 9407, "Blakemore": 19890, "treats": 27394, "successes": 11077, "xray": 18723, "powerless": 31017, "announcement": 14800, "polling": 12518, "executives": 22890, "flourish": 17081, "Someone's": 32173, "Where's": 7118, "Danette": 32470, "abide": 14729, "Leigh": 13324, "dialing": 22410, "belt": 8622, "Batman": 6992, "inhalation": 7399, "GAVE": 29693, "Kong": 12362, "faxed": 21482, "unfinished": 14310, "questionable": 1412, "pluralistic": 867, "5.6": 14664, "sentence": 5685, "roof": 8925, "ubique": 5076, "merged": 17041, "Andaman": 19491, "excesses": 5924, "Archibald": 19805, "missiles": 10436, "cloudy": 16177, "grandson": 19862, "BA": 23197, "gentlemanly": 31311, "mansion": 14041, "LOC": 23530, "halter": 31332, "plutocracy": 7988, "realism": 14937, "anti-Bush": 19224, "strands": 31723, "Xiaoping": 3478, "Real": 11042, "infections": 26641, "administration's": 13837, "Inferno": 31231, "EPC": 21219, "thicker": 28686, "threw": 9088, "wonder": 14602, "oh": 6194, "acd": 19222, "mircles": 29786, "DAB": 12439, "starfish": 31741, "justify": 14396, "interview": 1702, "Tours": 17285, "torn": 9071, "inter-caste": 7230, "04:17": 21694, "girls": 3683, "SCAM": 24911, "founder": 5919, "dubious": 15169, "Turns": 29365, "paused": 8891, "Country": 5458, "midst": 9636, "Camp": 5565, "Markets": 22397, "sidelines": 19667, "Draft": 4859, "snippets": 10688, "Douglass": 724, "heavily": 1239, "Ramos": 1502, "briefly": 10757, "P.": 19422, "questionnaires": 8501, "1579": 21121, "gobbled": 19095, "vaguely": 8734, "Meydan": 16791, "luxury": 19345, "Cal": 22396, "SWG": 21411, "sagotra": 7232, "longing": 31016, "mummified": 31836, "17th": 96, "scare": 19158, "laws": 11549, "brakes": 26640, "1945": 3448, "sensor": 2640, "corn": 13484, "charts": 30088, "police": 3949, "holidaying": 27908, "Mandy": 4226, "Greenfield": 29649, "Mathematics": 3946, "Possessions": 18128, "Maria": 5372, "11:02": 21380, "skyline": 16517, "O'Connell": 22059, "yuor": 19467, "Wow-eee": 16124, "cleavage": 32626, "clubs": 27551, "forty-one": 32687, "low": 2497, "bmc...@patriot.net": 24700, "swatch": 16007, "03:00": 16610, "OTHER": 28741, "compatible": 13909, "beard": 25627, "linguistic": 1716, "Cookies": 29499, "durability": 12797, "Revell": 19399, "Observed": 25122, "CO2": 25148, "pelham": 26381, "relishes": 32720, "HATING": 27449, "1002`s": 21262, "destroyer": 25800, "Braysmith": 13388, "vehicles": 14660, "Adding": 22044, "Needless": 22077, "Cynthia": 13376, "Steve": 6955, "performing": 9276, "Sales": 29042, "Kedourie": 30661, "Clydesdales": 6419, "relevant": 1421, "CopyrightX": 14493, "Halloween": 16041, "pausing": 30324, "B.A.": 17465, "1-800-991-9019": 21695, "recruited": 3546, "Broadcasting's": 5727, "Agatha": 10933, "Sense": 14968, "misnamed": 19133, "McKenzie": 10986, "immune": 6771, "Implant": 29213, "Have": 6653, "Tuscany": 13214, "approached": 7161, "knock": 20515, "copy": 310, "rift": 19733, "Report": 8449, "balls": 12085, "Stress": 17802, "hiding": 9757, "H-0237/97": 31373, "Shield": 29406, "hard": 6226, "yellow": 6472, "isolated": 14037, "Policing": 14097, "else's": 14648, "http://en.wikipedia.org/wiki/Aerocom": 20104, "Rebecca's": 31992, "Spidey": 12607, "Saving": 30206, "Occupancy": 21253, "saying": 6469, "levels": 7198, "Oriental": 3464, "joke": 9860, "cashout": 21901, "broth": 18361, "inconsistency": 22591, "proviso": 23474, "assailant": 24142, "timed": 18267, "prime": 10891, "Mantia": 25487, "stock-still": 31648, "avocado": 15766, "Managers": 23458, "Postdoctoral": 8529, "village": 4244, "Parakeet": 27803, "Buñuel": 5508, "theaters": 20406, "Ham's": 28365, "Pathways": 14515, "lulling": 30366, "Comics": 4131, "Departments": 12111, "clinics": 15809, "Mesoamericans": 15309, "Forgotten": 6181, "CHESS": 25507, "RIP": 28364, "Sheikhs": 19320, "Johann": 3148, "d'Herbinville": 3959, "Pacheco": 22166, "recognizes": 22855, "rates": 448, "lawsuit": 23870, "Stipulation": 21481, "CEV": 24483, "temperance": 27185, "globe": 1785, "checks": 7178, "collaborator": 13675, "fishing": 17327, "residual": 23999, "busiest": 16989, "evacuees": 24420, "trainers": 27998, "in": 109, "fossil": 14200, "etings": 11436, "widespread": 1227, "unnecessary": 8188, "Tangipahoa": 19452, "Ifa": 29189, "efforts": 354, "Cotillion": 21317, "armature": 26267, "Tiffany's": 32652, "glanced": 9235, "anthropologist": 10067, "sunshine": 11488, "bathed": 24627, "silver-nailed": 31962, "jaw": 24126, "orchestras": 30862, "COFFEE": 28182, "suspiciously": 32092, "l'eau": 16679, "101": 15816, "Authorities": 19349, "themselves": 4361, "revolutionizing": 10374, "Greenland": 25172, "lexicographic": 3805, "knowingly": 19431, "reorg": 21111, "Agip": 23395, "eve": 32921, "waking": 15006, "spectacle": 31839, "No-49": 31526, "Agnostics": 13252, "frighten": 24117, "improv": 13674, "pole": 12663, "832.676.1329": 21460, "lay": 4723, "multitude": 10903, "publicly": 11644, "dwell": 14042, "blunder": 19324, "alacrity": 31204, "haddock": 25163, "downward": 18242, "wing": 3127, "Luv": 11915, "ROMAN": 11923, "everybody": 6275, "invent": 11267, "avail": 24577, "shatter": 25872, "manually": 22625, "evenly": 18406, "Seed": 26594, "Download": 25332, "HealthSpace": 16419, "absolutely": 10721, "classroom": 1596, "admits": 26070, "Lee": 12412, "Cage": 26474, "Things": 9793, "stoats": 17230, "thread": 3061, "MY": 11872, "challenged": 27711, "Makes": 16023, "tenure": 334, "KDP": 19294, "Jr": 21819, "http://www.ebay.co.uk/itm/250927098564?var=550057729382&ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1438.l2649#ht_2079wt_893": 26861, "written": 156, "Watching": 15875, "excellently": 23334, "STANDING": 29682, "Leahy's": 20886, "linguistics": 3702, "bedrooms": 15122, "inserts": 29560, "toilets": 24400, "Perhaps": 6554, "Pahl": 19935, "wriggled": 8939, "CAP": 31490, "contrast": 986, "attacked": 12305, "gel": 13750, "sophomore": 4830, "graceful": 26657, "iPad": 26680, "constant": 3325, "fumarase": 20046, "Haiti": 27501, "here": 1091, "Metro.us": 10575, "Babies": 22267, "objections": 13715, "modalities": 14562, "easier": 10714, "Clothing": 10685, "Booth": 23135, "Festivals": 17546, "Donald": 12070, "45": 11384, "Belzer": 30525, "insist": 11443, "UNMIK": 13925, "taxis": 9710, "Sara": 20943, "searching": 10272, "Scordia": 28838, "execution": 897, "amplified": 20385, "Products": 22558, "Patel@ENRON": 22032, "Joel": 4910, "Ugh": 9788, "362416": 21390, "Surely": 30270, "overproduction": 31465, "CFTC": 22178, "reflecting": 19718, "10/27/2000": 22367, "airholes": 27367, "Guaranty": 23565, "STORY": 29754, "Guy": 27987, "lowers": 17806, "punk": 28955, "band": 2600, "dictatorship": 18774, "mutual": 14243, "763736": 21406, "+1": 22009, "sinister": 9404, "Trustee's": 23827, "Rationalist": 13250, "McMuffin": 26349, "Joint": 13032, "tree": 8688, "study’s": 2382, "MARRIAGE": 24649, "Victors": 5523, "Built": 16798, "01/12/2001": 22755, "flatfish": 25167, "Hearing": 27216, "poorly": 25691, "Early": 3128, "supremacy": 20542, "<3": 28094, "formaldehyde": 10618, "Maw": 21873, "-%": 31520, "signoff": 22578, "inattentive": 32442, "pro": 10410, "welded": 30880, "solemnity": 25561, "Cover": 17735, "Protect": 20405, "proclaiming": 25631, "eye": 143, "Kukulkan": 15359, "this'll": 6431, "Forbidden": 16097, "Carly": 13344, "tints": 28111, "mid-season": 8087, "reconstruction": 16568, "vanity": 31887, "Louise": 21716, "agreement": 2616, "kido": 26401, "writer's": 13656, "bio": 13974, "wasp": 28269, "Joux": 19584, "PJC": 28161, "affair": 3890, "548": 21896, "1904": 24143, "wintering": 28031, "mein": 29844, "Gotta": 22000, "amending": 30858, "puppet": 1995, "proposing": 1124, "County": 302, "croissants": 29328, "accounting": 22596, "texture": 222, "Newark": 16537, "Powell": 19097, "hijacker": 20780, "sponsors": 20548, "toilet": 18153, "Quick": 23254, "smirk": 25235, "dabbling": 32615, "shells": 12853, "says": 6723, "Berez": 2486, "dryer": 18460, "Erik": 19030, "NGO's": 20482, "encabalgamiento": 1109, "database": 1613, "devilishly": 32445, "mathematician": 3109, "commended": 13867, "672,000": 16907, "interconnect": 23569, "equality": 787, "regretted": 24387, "flux": 11378, "makke": 12040, "irate": 29452, "Analysis": 2923, "stiffly": 31883, "Tralee": 32821, "Tajiks": 19725, "Wycliffe": 5566, "Hopkinson@ENRON_DEVELOPMENT": 23186, "differed": 2841, "Fundamentals": 22879, "RBI": 4907, "setback": 20588, "temperate": 16747, "Ceron": 25494, "lined": 5055, "Hey": 6956, "evidence": 1062, "wheel": 9866, "palace": 16776, "Regular": 16467, "Jaffa": 30863, "http://www.mikegigi.com/castgobl.htm#LGGOBPROJ": 26413, "fleshed": 13671, "trumpet": 30760, "conduits": 19613, "belongings": 7592, "grandly": 31967, "jeans": 21259, "countersignature": 22042, "Extremely": 28046, "422,000": 13215, "injury": 4873, "unpopular": 18986, "excuses": 28700, "palpitating": 9945, "10/26/2000": 21950, "contrary": 6617, "Fortune": 32365, "deleted": 15867, "DISCO": 22796, "13th": 308, "exceedingly": 413, "3889": 23502, "penetrate": 18490, "Esfahan": 16726, "introduced": 2315, "Los": 5724, "ba.consumers": 25725, "experts": 1203, "nightmare": 24839, "Undersecretary": 13229, "oozing": 24284, "cupcakes": 17839, "Poitiers'": 5110, "857-771": 22411, "shoving": 18010, "15:11": 12738, "undocking": 24815, "turtle": 11289, "Always": 5864, "collided": 31809, "dwarfed": 16543, "Shall": 20299, "Witness": 5739, "SDGs": 13981, "instrumental": 19687, "accessibility": 21682, "carters": 10040, "pain": 1219, "period": 1077, "Gómez": 1103, "initiated": 1828, "thorny": 22562, "Century": 97, "Chomsky": 10368, "Bitmap": 21074, "docs": 23232, "she'd": 6695, "RusAmArts@aol.com": 23430, "signalling": 1808, "favorably": 12038, "Taxpayers": 24267, "gravy": 26647, "tofu": 28480, "Pursuit": 22094, "Haug": 31508, "Seconds": 32245, "nightcase": 32453, "6:23": 15564, "adenium": 17194, "Father": 10128, "peddles": 28898, "Margaret": 12539, "moaning": 9681, "one": 58, "descendants": 16361, "grid": 17454, "vets": 19760, "ting": 12434, "tuna": 27676, "tends": 28372, "PEREZ'": 25417, "a.m.beresford@durham.ac.uk": 24, "Academia": 3422, "brase": 27588, "This": 87, "plausible": 7735, "snitch": 18310, "lights": 2215, "Exchange": 21674, "indescriminately": 20111, "donations": 10783, "87": 2121, "inherent": 8446, "gentlemen": 14507, "issue": 459, "they’d": 7929, "quicker": 10172, "CD": 10283, "tags": 30090, "Originally": 4416, "warrenty": 26166, "Tosui": 4634, "Massoud": 20073, "carrier": 9264, "throws": 4816, "incubation": 15074, "Eurasia": 24587, "Congressman": 19834, "photos": 7334, "occasionally": 11118, "sandbox": 9613, "audience": 300, "gentel": 28618, "magazines": 7514, "lax": 908, "AND": 1937, "girls'": 3682, "pythons": 27338, "pluralist": 822, "walking": 2754, "recall": 8713, "forbidden": 19632, "Underwriting": 20912, "mopped": 32305, "Shepherd": 2953, "oz.": 21751, "84": 31529, "unpleasant": 9789, "smelly": 32062, "troughs": 9068, "fixable": 28042, "that'll": 27344, "locusts": 9255, "cube": 26830, "inscribed": 16852, "Campos": 8424, "elects": 12462, "crease": 9822, "kaplan@iepa.com": 22366, "credit": 7444, "Qualified": 22519, "Arby": 28011, "complexes": 24074, "Trenerry": 22236, "Breakthrough": 24004, "Mishkenot": 30621, "format": 1910, "costly": 9211, "Peru": 18352, "But": 537, "bundling": 26039, "Optimization": 29810, "biodefense": 20710, "Judging": 26687, "Foreman": 5521, "hangman's": 32267, "proposal": 19066, "Wonderful": 28856, "get": 6085, "informally": 22339, "Remedies": 23496, "polluter": 25945, "Restaurants": 29906, "distinctiveness": 4722, "PRESIDENT": 14594, "turismo@merida.gob.mx": 17007, "palces": 28389, "activates": 30789, "vice-president": 24374, "partner": 5715, "Birds": 2810, "endemic": 17185, "blown-up": 31875, "besocked": 32500, "worldview": 17600, "tsar": 26052, "Wyoming": 15997, "mitigating": 7644, "McDonald's": 22494, "Qalansia": 17173, "shippers": 22423, "Skittles": 18410, "Paralympics": 10835, "Sarhid": 18532, "Arabiya": 19282, "voluptuous": 30259, "resembling": 31062, "morphology": 2822, "maybe": 6116, "France's": 13013, "Civilization": 20378, "ceramic": 18025, "nurse": 4234, "recommended": 11328, "Brokerage": 22647, "Gold": 4482, "assegais": 31321, "bail": 12294, "chemistries": 27879, "Contributions": 1498, "Morphology": 5624, "Krumbholz": 10204, "cider": 15828, "mat": 17948, "Apostles": 5043, "viciously": 32069, "ROBERT": 22834, "Okay": 6175, "fours": 9683, "17,500": 11566, "popcorn": 28205, "injustice": 14117, "Vicsandra": 21092, "preacher": 18471, "rehearing": 22751, "Sean": 11124, "vulnerabilities": 12790, "dogwood": 32653, "universities": 1449, "correspondances": 3628, "exiled": 5982, "moreover": 18850, "050901.doc": 22357, "airlift": 24391, "Willow": 28642, "Mistake": 11233, "BU": 29460, "displeased": 32893, "Kethlan": 9204, "mishandling": 18148, "firstborn": 30524, "ekrapels@esaibos.com": 21568, "implicit": 25873, "oozed": 9160, "pl": 28310, "conformity": 23738, "Kirriemuir": 1607, "Nutcrackers": 8662, "shortage": 7939, "Chandrika": 18996, "intensive": 17072, "premonition": 31647, "Guesthouse": 27402, "devise": 13990, "worshipped": 15354, "JetBlue": 17115, "Dentist": 28857, "Mueller": 20760, "them": 1128, "If": 813, "Austen": 10928, "PETSMART": 26427, "clawing": 27463, "introductions": 29929, "BIRTHDAY": 32021, "exclaimed": 3931, "Consulate": 16462, "Thought": 22112, "Stinebower": 11404, "LIST": 24935, "Whom": 23122, "astonished": 21576, "skillsets": 386, "applies": 20384, "throw": 9259, "lighten": 20991, "Opera": 4499, "Saikaku": 4721, "348": 5988, "Mirroring": 15170, "renovation": 28455, "tragedy": 14213, "gale": 30850, "tended": 499, "valueless": 30341, "RUTH": 11793, "antivaxxers": 13820, "0.05": 1689, "asymptotic": 11258, "roles": 3711, "premiums": 29187, "satisfying": 8521, "oppress": 15716, "thrusting": 31823, "don’t": 7813, "localities": 10676, "Windows": 10466, "K.C.": 13311, "HAND": 28755, "protection": 7462, "rewind": 7109, "Grace": 25960, "televising": 31400, "bikes": 27568, "mid-cities": 26545, "Boleyn": 25588, "U.K.": 22514, "drafted": 4855, "Renaissance": 27094, "adjacent": 16317, "78": 25953, "lamentation": 30758, "racing": 8408, "Hydrodynamica": 3130, "Susan's": 22757, "SSS": 2589, "inhuman": 20427, "Decide": 27465, "goggle": 30542, "BONES": 29659, "Holocaust-esque": 24862, "Wheeler": 13746, "nipped": 8996, "broiled": 32518, "Des": 21444, "lobby": 12340, "fps": 28872, "experimentally": 2894, "escapades": 5030, "glaze": 8551, "approves": 28973, "boxes": 8974, "detailing": 671, "crossroads": 16875, "Saturday's": 29381, "candidate’s": 19245, "Prince": 7417, "jumping": 15713, "dongle": 26309, "overstatements": 29983, "placid": 9383, "slight": 1836, "Linkages": 15552, "banking": 22682, "buckling": 32432, "-ECT-KEDNE": 21498, "WestJet": 17119, "beseech": 24380, "grandchildren": 20762, "self-esteem": 32594, "English": 1723, "debated": 6540, "untalented": 25688, "SUT": 2268, "reserves": 8164, "sections": 677, "20:00": 17022, "barriers": 24412, "hypnotised": 32671, "prisoner": 3579, "Counseling": 5210, "Wrecking": 5286, "unaware": 10756, "Wall": 20666, "monkey": 10335, "bucket": 21831, "**********": 23834, "yearly": 545, "ethink@enron.com": 21559, "http://www.railroadredux.com/tag/northwest-shortline/": 26845, "enjambment": 994, "technologies": 2270, "compared": 2216, "non-stop": 18571, "Novgorod": 13066, "berthage": 16303, "boasted": 16414, "Kay": 3745, "Blogshares": 20090, "norm": 17092, "sitting": 7806, "Amelia": 23239, "expedited": 27472, "bevelled": 32890, "Came": 11007, "wiffle": 18329, "assembling": 497, "resurrection": 10152, "encourages": 1318, "Skinner": 10328, "effect": 1171, "Strain": 18439, "59": 4842, "implying": 19164, "unite": 13982, "harmless": 22713, "caps": 19995, "remodel": 7195, "20,000,000": 21606, "opponents": 4024, "Erasmus": 6516, "moveable": 4385, "wake": 9028, "sag": 15627, "velvet-draped": 31816, "Topic": 22461, "film": 4086, "soon": 4307, "oppressive": 20293, "Richards": 21134, "Empress": 4761, "nineteen": 3960, "Guide": 8331, "provide": 565, "indicator": 10743, "fuels": 14201, "hero": 10084, "Maori": 16271, "veins": 17717, "buffeting": 32007, "grasp": 14021, "sommelier": 28965, "Visit": 24989, "T-": 6511, "neighborhoods": 17098, "Easy": 13259, "slime": 31139, "N.O.": 23236, "OPPOSE": 24742, "notebook.url": 21781, "Murillo's": 25573, "EB": 21097, "Thirteen": 6987, "Tianjin": 3339, "Petit": 16243, "transparent": 7977, "ENA's": 21341, "S1": 2391, "islamist": 20610, "lifeboats": 26919, "Identity": 8289, "preachers": 20476, "tasks": 380, "Yugoslavia": 19138, "release": 3879, "global": 2555, "Brethren": 10192, "coordinating": 23551, "pixies’": 9754, "Gallop": 28017, "luggage": 13163, "convoys": 18592, "Transaction": 21663, "beg": 26505, "untitled": 30938, "straps": 17363, "Station": 10679, "districts": 18488, "ALITO": 24745, "Cast": 24551, "looting": 18585, "Sectarian": 19298, "Kim's": 29077, "tubing": 32726, "ok": 21419, "Coffeyville": 17430, "licks": 26648, "plotters": 20722, "Lange": 29394, "gaiety": 31872, "chemical": 10610, "Slovakia": 16489, "trephena": 30577, "box-like": 32862, "01:50": 22497, "doll": 8620, "fetched": 18228, "02:28": 22884, "ANSI": 30031, "overslept": 10175, "PaineWebber": 20978, "EES": 21365, "versa": 17475, "uncenturied": 32589, "harvesting": 8198, "enshrined": 13875, "relationships": 2785, "favours": 27373, "703.729.2710": 22802, "Meadowrun": 28590, "bounding": 32195, "richard": 23618, "program": 8220, "Christensen": 15097, "compare": 20950, "http://www.ukrainianweb.com/chernobyl_ukraine.htm": 18700, "neuroimaging": 13587, "Johnson": 3787, "rewinding": 30475, "for-profit": 10775, "More": 1358, "great": 2218, "assorted": 7705, "spoilage": 26651, "pressing": 30692, "Michael": 5779, "exotic": 25538, "longitudinally": 644, "TO": 11511, "Whie": 20317, "EnronOnline": 22127, "Parkway": 23177, "matrix": 23997, "Permanent": 7883, "phonology": 1877, "275": 17854, "Montalvo": 12289, "clearer": 15196, "Rothko": 21158, "fortunes": 16895, "nailed": 22739, "canoes": 24131, "PIECES": 26334, "V.": 24953, "Fifty": 9242, "shyness": 30465, "Andrews": 13631, "ironically": 20894, "gunmen": 18534, "Wholes": 27981, "symbols": 5658, "toi": 6706, "waist": 8623, "metascience": 2437, "Whitman": 11034, "contributions": 1529, "airlifted": 24133, "alone": 636, "hub": 14524, "carpenter": 6670, "sympathizers": 18752, "budgeted": 26027, "Chrysler": 23848, "amazingly": 29506, "subfolders": 30205, "Converting": 30184, "Owner": 28012, "Union's": 31343, "tarmac": 31679, "Save": 7816, "blues": 9042, "tonne": 19879, "reinterred": 4419, "A4-0072/97": 31339, "Challenger": 23932, "Jonathan": 6715, "reaped": 24504, "poisonous": 32285, "Metroplex": 25216, "Buchanan": 23597, "W's": 20253, "breaks": 2187, "sailors": 9093, "stubbornness": 32610, "kaffee": 26966, "trouble": 1886, "0832": 25423, "cooker": 18397, "grapple": 24643, "insomnia": 24071, "pedestal": 29587, "center": 6605, "pledges": 14033, "Sylvia": 32959, "yahoos": 24220, "bizarre": 10112, "eternal": 10014, "Eurasia's": 24592, "Giorgio": 25544, "Cunard's": 32562, "poured": 10573, "really": 1997, "option": 7246, "Hero": 25548, "TCA": 22353, "tomatos": 27440, "Padalecki's": 5826, "love": 3468, "Ineos": 22207, "Maguire": 4223, "inquiries": 20583, "Terror": 19365, "zodiac": 12912, "lora.sullivan@enron.com": 22830, "dates": 17517, "wars": 4336, "actors": 775, "202.456.1414": 24350, "witnessing": 5962, "premature": 25940, "airbase": 19736, "shall": 6447, "glowsticks": 18059, "implement": 7955, "1950": 4471, "3801A": 22257, "interfere": 14439, "Archives": 3632, "18": 511, "AA's": 22634, "newer": 12763, "slowest": 19792, "loops": 30107, "wider": 1076, "+++++": 21687, "supporter": 18851, "Indeed": 2468, "Majoos": 19304, "absence": 4382, "accelerated": 13843, "shrieks": 32292, "evolutionary": 2899, "andrillae": 10670, "Coast": 10889, "fot": 28869, "prospective": 5675, "okay": 6280, "rabbit": 27277, "Rosa": 15038, "competition": 11011, "SUPPOSEDLY": 30005, "Story": 5506, "purgatory": 6544, "Marco": 8013, "Tonto": 22084, "Arbitration": 23850, "seams": 32523, "nowhere": 9627, "Survivors": 19948, "4.98": 21926, "79,000": 22731, "Numbers": 2026, "Underground": 10925, "faces": 5883, "auspices": 20372, "Vince": 19396, "vomit": 27593, "Why": 6969, "semiautomatic": 26944, "mess": 7015, "Joo-Ho": 13072, "strapped": 32723, "司空": 14868, "ltake": 29437, "weaklings": 9635, "ph": 26521, "coarsely": 32747, "pipeline": 692, "insensate": 32811, "alcalde": 14683, "Baie": 16692, "slammed": 8983, "extracurricular": 22667, "cats": 13575, "Cyd": 12466, "discriminatory": 24683, "Delainey": 21342, "push": 7762, "engineer's": 30782, "geometries": 2343, "Continent": 31069, "regime": 18936, "Din": 19339, "fellows": 20085, "criminals": 14320, "shuffled": 31155, "Islam": 18633, "Systematically": 1058, "Ideas": 14964, "cagey": 30855, "expressing": 15438, "Thais": 17333, "Istanbul": 13865, "Gels": 15942, "galore": 15704, "birth": 5851, "faith": 13168, "creaking": 9030, "agonizing": 24854, "kick": 13137, "rude": 15485, "desserts": 28451, "election": 5863, "pail": 31301, "veggies": 27281, "Muang": 19202, "blank": 22838, "Dando's": 31760, "loved": 6136, "Fantastic": 28090, "expressions": 16902, "1912": 4611, "Danish": 17204, "grades": 11807, "porky": 32053, "completing": 14424, "xeno": 15526, "Lucille": 5599, "dug": 5052, "estimate": 2690, "Olive": 18362, "fairs": 16898, "farther": 11819, "Once": 1366, "description": 1008, "Flores": 1102, "GRF": 2793, "Jesse": 13127, "stamped": 23925, "Chumley": 23745, "excellent": 11648, "Sub-cultures": 20320, "Basic": 1649, "siphoned": 19902, "Moves": 13048, "eat": 6688, "CIAC": 23570, "signalled": 31909, "UNITED": 24996, "fifteenth": 24384, "at": 35, "eclipse": 11228, "IN": 10090, "please": 2004, "MKM": 22783, "Fillmore": 3645, "streaks": 26590, "campsite": 29450, "registering": 2322, "accurate": 617, "McCombs": 7319, "arrears": 13217, "S.A.": 22261, "smiley": 18006, "wrinkles": 8552, "Julia": 22372, "cruelty": 4675, "Chi-fung": 12464, "Thanksgiv8ing": 21990, "Quantity": 21641, "scammers": 27015, "Bringing": 8210, "sciencem...@upi.com": 25097, "wild": 7991, "Mertens": 13101, "belts": 25253, "flavored": 17833, "citing": 25950, "sliced": 27324, "assemble": 611, "Iran's": 18922, "INDEPENDENCE": 32005, "entrance": 12927, "henequen": 16977, "Please": 6235, "chambermaid": 29971, "lady": 11520, "Adele": 3782, "Kansas": 15604, "Trinidadian": 29016, "Picasso": 21170, "Catedral": 16956, "publicized": 16499, "Had": 6026, "privacy": 12121, "howled": 9897, "drought": 15396, "massacre": 18561, "prettier": 16106, "Groom": 19817, "shoppers": 25852, "http://www.tecsoc.org/pubs/history/2002/apr26.htm": 18705, "utilize": 1216, "Jan": 19014, "salted": 8581, "contradict": 17634, "assistant": 5298, "meanings": 5656, "Court's": 7568, "Velvet": 13429, "Basis": 21442, "EACH": 24937, "highlighting": 1617, "Atlanta": 19962, "WHERE": 21077, "veggie": 29169, "mutilating": 18624, "Texas’s": 14750, "rediculous": 20319, "donning": 30441, "marked": 4716, "DH": 27888, "31": 1663, "secretly": 18493, "sends": 14180, "concluded": 7580, "grocers": 8223, "reaction": 2792, "circular": 16829, "clamouring": 32334, "Microsystems": 21546, "voicemail": 13594, "releases": 25147, "reproachfully": 31800, "tolerate": 4304, "Agence": 18971, "Brenda": 13625, "interminable": 30757, "sombre": 4306, "Jennifer": 4233, "erred": 7575, "progressively": 13862, "Animals": 24889, "Us": 6967, "Que.": 24110, "tides": 3251, "pan-democrats": 12503, "exceptional": 19238, "purchasing": 20715, "congress": 19975, "eczema": 32504, "adventurers": 30949, "lift": 18137, "flashpoints": 19159, "hav": 26206, "Britney": 11119, "whack": 27368, "coffeehouses": 11021, "cracked": 12175, "SPAR": 24868, "Justine": 9919, "eras": 12621, "bridal": 26901, "siege": 19778, "keep": 1489, "imposing": 800, "theatres": 29529, "squash": 15348, "Drop": 17734, "listeners": 20229, "packaged": 13786, "nevertheless": 18183, "ta'": 24091, "Mass": 15553, "Beauveria": 10221, "shades": 16070, "Pauvre": 11458, "eloquent": 25255, "homosexual": 25669, "Catholics": 27184, "honestly": 17920, "beware": 29105, "pants": 8606, "productivity": 535, "Nicole": 5176, "art": 37, "Tyneside": 17577, "circle": 10831, "husk": 30385, "pursuers": 9260, "tossed": 24172, "box": 6974, "moors": 26180, "ad": 10694, "ray": 11591, "Socialist": 10377, "retraced": 30293, "defiled": 18642, "Motivated": 15203, "202.429.1700": 22812, "Chart": 30153, "going": 6072, "then": 816, "Kinder": 2936, "bulging": 32120, "page's": 30060, "Jacoby@ECT": 21231, "missive": 20846, "UNCARING": 29917, "Swifties": 19248, "Scholarship": 3347, "undergrowth": 31716, "Photo": 7830, "aforementioned": 2213, "burdensome": 23424, "changer": 7999, "so's": 10745, "Hens": 17818, "broomsticks": 18321, "rightholders": 31441, "osteos": 28322, "swimming": 8943, "L.A.": 12341, "crouches": 8849, "Crickets": 27755, "latte": 15760, "opinon": 29232, "beliefs": 237, "ranger": 25095, "Labour's": 12991, "BABA": 19822, "marshmallow": 31982, "dealer": 8588, "accomplices": 20382, "Manifesto": 10944, "loses": 7621, "pleaure": 30453, "actually": 306, "palm": 9912, "Williams": 2527, "till": 6350, "hay-carts": 32767, "WORKERS": 29681, "across": 454, "Breslau": 22041, "Prior": 13508, "Conclusion": 2034, "blurred": 21957, "SMART": 28745, "preening": 17821, "boxer": 20517, "SMAP": 2583, "Dozen": 5749, "setting": 6528, "30.00": 29850, "slacken": 32524, "profoundly": 14145, "saving": 14268, "713-654-0365": 20980, "signature": 20830, "warranties": 23499, "Claim": 5729, "DISHES": 28793, "planted": 17071, "concentrations": 10304, "Saviour": 5559, "sips": 16237, "reprisal": 25751, "Filter": 18429, "bugless": 26174, "conditioning": 29847, "mate": 27042, "Mouhamad": 20437, "SAMUEL": 24744, "servants": 14693, "hip": 2761, "Anbar": 19323, "horizon": 9967, "tissues": 29296, "Bludgers": 18345, "WHOLESALE": 23434, "strange": 9386, "longs": 19281, "corners": 12534, "economic": 718, "induces": 2710, "diocese": 5927, "writers'": 13673, "JR": 22833, "sacramental": 7229, "TDS": 27881, "homeland": 19548, "therein": 9438, "Mosques": 16794, "gelatos": 26969, "movements": 209, "infectious": 13809, "memorial": 4012, "chaos": 14202, "Chehel": 16824, "Cafe": 27548, "spaced": 17745, "cleaners": 15009, "Will": 4931, "Anyone": 10334, "retrospect": 10823, "minted": 25879, "TELEPHONE": 11505, "wartime": 12868, "woodpeckers": 26661, "Lambala-speaking": 31779, "piers": 32549, "citizens": 939, "Shoo": 9719, "pariah": 24567, "Analytique": 3248, "Tower": 14638, "councillors": 12423, "copper-brown": 30785, "Experience": 10339, "baby": 14848, "novels": 5331, "Fluorescent": 2093, "Plan": 3516, "pro-Beijing": 12375, "Bik": 16695, "heyday": 16949, "320": 17858, "blanco": 21427, "Mweta": 31569, "elaborated": 5651, "evaluations": 22841, "donated": 13262, "podiobooks.com": 10969, "splish": 6243, "Explorer": 12757, "Dynamite": 30867, "UNESCO’s": 14497, "alroot": 6200, "Market": 16595, "''": 20068, "though": 2002, "professionals": 1419, "forget": 2977, "Liechtenstein": 16484, "Josalyn": 26449, "pre-meeting": 21569, "Indicators": 29811, "downstairs": 28583, "Hjalmar": 31727, "Touchez": 5401, "carbonate": 18040, "mortars": 18574, "Rome": 4990, "fees": 13231, "COMMUNICATIONS": 21183, "newsgroup": 12747, "sound": 797, "jobs": 4619, "fashioned": 6133, "SS-N-22": 25792, "filter": 18440, "specify": 23358, "MGr...@usa.pipeline.com": 25424, "blossom": 17908, "unproductive": 18260, "squirm": 29623, "surgical": 26076, "Gustafon": 13334, "Weed": 17758, "perfume": 9462, "kc": 29126, "gather": 1184, "Nickinator": 10269, "comparing": 681, "Monsoon": 17095, "B-": 11723, "evident": 14395, "Husain": 18517, "surgeons": 26633, "inn": 28975, "Grog-blossom": 32534, "raspberry": 8933, "Escola": 1614, "IFN": 16762, "divided": 1659, "Mullah": 19672, "Proceedings": 25107, "SEO": 29807, "Mace": 30766, "likeness": 4756, "Kuwaiti": 21513, "sea-reach": 30877, "ensemble": 29457, "remuneration": 31456, "athlete's": 32508, "generation": 2071, "orginals": 28728, "Provided": 19489, "Pag": 9596, "would've": 6445, "WHICH": 27775, "Sweden's": 13093, "permit": 11562, "Texas": 4776, "anybody": 6343, "loving": 11524, "VAN": 28762, "balcony": 21862, "hosted": 18734, "Floor": 14093, "shopping": 16582, "teaspoon": 17849, "what": 884, "Vincent": 16493, "guided": 13903, "newfound": 12240, "16.379": 24470, "realm": 25858, "fellow": 4357, "Electoral": 18542, "Beall": 1404, "Saudis": 11225, "1-800-238-5355": 24944, "unconvincing": 17809, "twelve": 6174, "ReportML": 30122, "U.S": 10402, "comic": 13743, "Beatles": 17979, "scan": 197, "truly": 9465, "detective": 12323, "guard": 18305, "earnestly": 31131, "bust": 4255, "rocked": 28429, "Six": 6310, "Robot": 12065, "raisers": 26101, "audit": 21938, "medial": 4874, "severly": 27614, "latitudes": 25115, "strangled": 19936, "Horton": 22920, "slumber": 14043, "disagreements": 814, "scarf": 6962, "breathtaking": 16516, "mediocre": 28600, "Gulliver's": 24215, "10.6": 27887, "platted": 17485, "annoy": 17912, "flakes": 10525, "Raymond": 12428, "impartial": 784, "Nazareth": 20178, "transformative": 7422, "Annoying": 5279, "Susan": 20234, "(d)": 2508, "Skylab": 2597, "Mindset": 15054, "cigars": 30315, "IQR": 15660, "vulnerability": 17597, "alcoholism": 13533, "essentially": 1813, "attributed": 2767, "interactive": 16096, "classic": 7472, "06:00:56": 21236, "moral": 4987, "Lockhart": 32348, "tin": 12010, "spills": 29760, "allegedly": 8421, "Two": 3233, "conducive": 11620, "embodying": 14058, "referrals": 23376, "Hub": 22686, "Pig": 27432, "side": 3542, "differentiate": 1176, "sonny": 24204, "arrests": 11218, "exmearden": 20268, "Smart": 13971, "sun-yellowed": 31724, "Iran’s": 19730, "Topics": 5309, "isolating": 18779, "webpage": 24501, "heed": 29620, "Gosh": 6467, "specializing": 11411, "interns": 23365, "INS": 25969, "Too": 16016, "1.78": 4809, "Claus": 8544, "Saintly": 29899, "fishermen": 12142, "Suwayrah": 18504, "Emmy": 4185, "HCC's": 28311, "MTLE": 21676, "Gliders": 10988, "relativist": 15515, "Mayes": 23751, "Congo": 14207, "suspicious": 6619, "40,500": 15691, "shuffling": 6019, "dodge": 18331, "LEAST": 28799, "insidious": 23923, "tying": 3164, "brush": 32309, "250,000": 14619, "peaking": 17215, "Thames": 25641, "governments": 841, "along": 4909, "Tamil": 18979, "SEP": 12034, "females": 24030, "fervor": 20411, "absorption": 23989, "decision": 64, "Boulevard": 16787, "reform": 7225, "~": 26390, "charred": 9163, "minimal": 17607, "Bailey's": 10571, "northbound": 17561, "enculturation": 14831, "prison": 3865, "Mt": 24759, "dependable": 28610, "92,000": 12970, "Dispatch": 23021, "Alexandra": 30529, "tupperwear": 27366, "limelight": 14931, "slum": 18584, "nerd": 28870, "Ride": 5330, "speakers": 21558, "Forum": 21798, "Clairmont": 4198, "deployment": 9263, "uneasiness": 25661, "condensed": 25637, "Darmanin": 13016, "limits": 18462, "depths": 11031, "1307": 21136, "MIRACLE": 22956, "Chitonga": 2030, "timelessness": 32586, "Wajda's": 16909, "Appraisal": 25157, "twice": 9021, "sullen": 9444, "SPECIAL": 28801, "greenery": 16570, "Hobbes'": 25378, "WSI": 21581, "1687": 4368, "Jann": 13352, "hormone": 17752, "negotiations": 13871, "Malardians": 13757, "humiliate": 19941, "dysentery": 24086, "decades": 2647, "Tons": 25944, "happened": 6329, "pursuit": 14570, "pillowcases": 15709, "barnacles": 9057, "sewers": 11631, "zealot": 25895, "overload": 12730, "airtight": 17775, "president’s": 19214, "dregs": 24289, "individual": 118, "obstacle": 15083, "Yet": 1384, "honorable": 7517, "Kaufman@ECT": 21381, "pester": 27343, "dictating": 7583, "average": 2947, "CFLs": 2171, "rice": 13452, "Yiu": 12513, "j-": 6918, "splashed": 8995, "reconnaissance": 20422, "05/25/2001": 23540, "realized": 9790, "orders": 21001, "THREE": 24967, "neon-lit": 32882, "formality": 21272, "righteousness": 20099, "---->===}*{===<----": 25193, "thirty-six": 32782, "vowel": 18117, "AR": 22648, "THINK": 28757, "Gratton": 1554, "liberated": 4489, "clones": 10672, "barrack-like": 31170, "meticulous": 24719, "Nevis": 16491, "Shebaa": 18897, "Commitment": 710, "Hackers": 12682, "contamination": 18452, "airliner": 19462, "successfully": 2613, "Mayors": 26020, "tacos": 29761, "heritage": 11666, "DONE": 28176, "Later": 2298, "Gets": 8462, "reimbursable": 23568, "produces": 1884, "tender": 9607, "implied": 15786, "forefinger": 9851, "analyze": 21056, "detractors": 25203, "basics": 17660, "annotated": 3826, "creatures": 24858, "ensuing": 8323, "Policemen": 24265, "Touching": 24639, "Alireza": 12089, "Yasushi": 19058, "permeated": 7623, "gait": 31151, "disseminate": 13302, "Sleep": 29595, "1600s": 16753, "liberties": 20496, "glimmering": 31925, "unfavourable": 26089, "pop": 5324, "Reminder": 22253, "Dispute": 23842, "intercompany": 22589, "baldness": 29782, "Iraqiyah": 18625, "perspiration": 15255, "Clearly": 23937, "disasters": 8154, "ultimate": 11028, "Inc.": 20979, "earn": 13677, "previews": 29528, "Null": 30159, "Klenk": 15194, "Lottery": 24973, "carton": 21256, "weapon": 10434, "pledged": 19664, "stimulant": 31599, "Frank": 5535, "surprises": 11268, "Cornell": 3350, "weaponize": 20656, "ORDERS": 28804, "Ozark": 17408, "Yo": 21237, "splendidly": 31303, "Shit": 6104, "expand": 10412, "beefing": 10420, "Drove": 28469, "upper": 4518, "Sec.": 24969, "mantra": 17995, "Terry": 11136, ".....": 23252, "its": 81, "critic": 12741, "depress": 11659, "wai": 17336, "Barzanti": 31445, "Do@ENRON_DEVELOPMENT": 23119, "existing": 765, "Socotra": 17137, "Monopoly": 7852, "Matter": 14120, "sixth": 15563, "Ikea": 28195, "Congress": 2248, "aggressively": 19743, "335": 17038, "a": 56, "response": 575, "Lihabi": 19336, "Tokyo's": 4694, "models": 2669, "contorted": 31140, "coordination": 14473, "freckled": 31700, "childbirth": 24040, "outlandish": 15084, "ammunition": 19579, "Taikoo": 12519, "slaveholders": 14694, "finances": 8476, "wisecracks": 30604, ".203": 4925, "GILDEROY": 32344, "forceful": 20553, "Stravinsky": 31619, "Don't": 4063, "codes": 20854, "convertible": 11602, "screeching": 31308, "infantry": 19842, "undesirable": 26135, "Charlotte": 27004, "yoyo": 30466, "240": 21254, "Post": 12026, "FBI's": 19992, "succeed": 11168, "Mathematical": 3227, "Collection": 13305, "secrets": 9442, "Don'ts": 17992, "tabs": 21473, "Ka-chun": 12510, "Naples": 30808, "Uzbekistan": 16481, "dick": 13610, "Shanlyn": 7561, "prized": 19135, "Vegas": 10345, "Spec.": 20953, "Pete’s": 9879, "nightmares": 31147, "harbours": 16298, "correlates": 2829, "hutch": 27278, "HAVE": 19483, "falsehoods": 29834, "potpourri": 29542, "chief": 3243, "commonsense": 19310, "exploit": 19370, "accuracies": 2727, "Ninth": 7612, "seating": 27930, "incremental": 7239, "12-20-2000": 23314, "Nuremberg": 5098, "substantial": 2482, "threaten": 23688, "Alley": 16091, "genes": 10667, "Maximilien": 4040, "farriers": 6405, "Dos": 17965, "advancements": 25284, "enhance": 8019, "insure": 30096, "structuring": 21730, "beings": 11235, "Shared": 31385, "Uh-oh": 6466, "Brendan": 11771, "72,000": 15686, "ride": 6068, "grimace-smile": 31966, "supposition": 25512, "constituencies'": 12368, "Tet": 27703, "unfolded": 14204, "wings": 28206, "humor": 3467, "Vanves": 26607, "bouquet": 7296, "roll": 479, "stray": 9553, "Israel's": 11229, "ECCL": 22051, "pattern": 8480, "944-6800": 16563, "knowledge": 919, "Orson": 5500, "Erin": 21359, "infertility": 29325, "undecided": 20215, "Satellite": 4173, "antipasti": 28893, "90": 4568, "wisconsin": 29402, "Wila": 11704, "script": 12019, "encouraging": 3859, "1934": 10116, "buzzy": 8859, "ive": 24886, "Presciently": 7964, "differ": 5676, "perfected": 15387, "Biologists": 17784, "sleep": 7741, "springer": 23900, "Wishes": 24993, "Self/less": 4152, "Lomas": 31363, "cars": 11751, "LOPEZ": 25437, "Patterson": 5332, "provided": 146, "IT'S": 29912, "celebrations'll": 31593, "unwonted": 9380, "SJ": 21409, "ducked": 9671, "Suleiman": 12261, "stability": 1679, "criminal": 12972, "Wazed": 19499, "Province": 16728, "cram": 18130, "blogosphere": 20091, "seperate": 19314, "Oct": 21947, "jointly": 21952, "LOGIN": 23037, "combs": 27152, "Uneasiness": 31247, "alt.animals.felines.diseases": 24835, "M-mm": 6661, "spattering": 8907, "LIMIT": 30049, "Zion": 30623, "Developing": 8369, "biz": 21601, "Phuket": 19581, "Pro-Beijing": 12438, "connect": 4632, "cycle": 101, "starving": 6159, "intercepted": 3676, "complaining": 4342, "teacher": 10064, "markedly": 2779, "emulate": 14571, "Remarkably": 21230, "Wolves": 25079, "Portugal": 22507, "startup": 10695, "county": 19836, "simpler": 17160, "Jack-s": 28227, "warmed": 28075, "drawer": 29892, "01:57": 23219, "Cynagon": 26172, "Jafari": 12231, "River": 16397, "Davio's": 26556, "Borgias": 32405, "cargo": 23472, "nested": 30133, "Significantly": 14773, "Reply": 24766, "11:35": 21375, "budgies": 27784, "Conroy": 12553, "maximum": 15694, "Baba": 19816, "traveling": 5932, "jurisdictions": 13983, "buds": 15822, "divined": 20788, "Marcie": 11706, "707-885-2508": 22453, "savings": 20908, "wholesale": 20474, "radiometry": 2601, "legendary": 3390, "screens": 9356, "fragrance": 26291, "lacking": 8718, "lowered": 1429, "guaranteed": 17835, "Family": 7832, "impression": 1319, "jongg": 9135, "Recruiting": 22347, "acknowledging": 7639, "copies": 11405, "Org": 12287, "ceased": 9961, "compressor": 22728, "epitome": 28983, "10:25": 23810, "manipulation": 1475, "reintroduced": 24656, "Millennium": 13886, "transforming": 14480, "Morton's": 26566, "Cheapest": 26636, "swearing": 14349, "lavatories": 31690, "Tristram": 9841, "non-representative": 124, "led": 4844, "smug": 17602, "foundation": 7492, "trunks": 10273, "reins": 26383, "express": 11259, "Educación": 965, "guy": 6036, "Khomeini": 18925, "Burger": 10327, "Matt": 28379, "ethical": 8441, "Spencer": 8828, "proven": 15081, "capitals": 19564, "Khaled": 12269, "eclipses": 15319, "posture": 2736, "imaginary": 8765, "payers'": 24507, "Lynda": 28062, "goers": 13435, "Fellowship": 5382, "soak": 8653, "Norma": 22763, "institution": 793, "Australasian": 18656, "devolving": 862, "Chudnov": 4322, "authoritarian": 18861, "mumbo": 25231, "Messiah's": 30759, "colonial": 927, "certified": 18229, "Recommended": 28677, "Oops": 27984, "94720-1900": 22449, "papers": 3269, "tons": 12009, "transparency": 13721, "Hasidic": 30579, "Dilworth": 14447, "solid": 6239, "moisturizing": 15922, "impassively": 30316, "SAYS": 11909, "puke": 25248, "Seizures": 27072, "http://www.quantcast.com/wikihow.com": 10828, "respects": 10771, "consists": 12067, "guessing": 6293, "rictus-like": 32902, "annoyances": 17646, "Rueda": 1564, "crimes": 19364, "administrative": 20949, "ECS": 22706, ";": 194, "Larbalestier’s": 9920, "stay-at-home": 30971, "hourly": 7155, "10:57:32": 25425, "pre-screened": 29319, "cussing": 29960, "meaningfully": 5690, "Skies": 25941, "hemispheres": 31054, "bridles": 30641, "quarrels": 31256, "Ponce": 2058, "AP": 22649, "fluted": 30471, "co-founder": 4532, "x54667": 23147, "editor": 10773, "Holden": 12505, "trailers": 27222, "deliberately": 1240, "become": 2591, "session": 1909, "orientation": 2787, "Goal": 14482, "caters": 17635, "kilometers": 17223, "sea": 2588, "helped": 6720, "tongues": 24278, "Decisions": 24733, "Thi": 26515, "Alpharetta": 28285, "Moscow": 4266, "prosecution's": 19414, "dime": 26021, "proposed": 1193, "weird": 8771, "Watchmen": 4128, "obeys": 6632, "Jay": 7864, "3.7": 25936, "Galaxy": 11322, "unbound": 30211, "#argument": 7657, "Freighters": 16290, "bluff": 19090, "decreasing": 13459, "anyway": 6074, "Diatribe": 6531, "generalizations": 25077, "Net": 10577, "Theirs": 23582, "heaven": 8692, "sectarian": 19301, "Helsinki": 10205, "screech": 31127, "Marlow": 30909, "Fund": 7884, "Under": 2267, "mid-shaft": 2823, "restrictive": 7264, "COALITION": 24648, "1504": 22143, "Smoker": 29100, "LINE": 29261, "Line": 16258, "lifeboat": 26923, "COULD": 28746, "Degree": 19630, "Yang's": 24803, "tidal": 9978, "PUT": 24933, "Plonsky": 2418, "pupil": 4563, "recreate": 20568, "discretionary": 7697, "pocket": 8630, "Aquarium": 29210, "ruddy": 32307, "honorary": 3777, "executed": 14791, "+1602275-4958": 17105, "southeastern": 18508, "tilt": 22716, "advertisers": 10803, "08/01/2001": 21914, "sonnets": 1040, "Psalmist's": 5059, "datasheets": 30076, "romance": 4195, "metropolis": 930, "tours": 16712, "Mitch": 24179, "geometrically": 24978, "Don’t": 7772, "modernization": 25780, "strength": 8719, "Molly's": 32306, "ratepayer": 22420, "Points": 23127, "concerted": 23674, "proved": 19726, "march": 7998, "Catarina": 1651, "Space": 2576, "non-fixed": 10701, "Imaginary": 20138, "defeats": 23065, "desires": 27532, "lable": 20321, "ACIA": 25153, "unanimously": 14400, "sustenance": 15294, "bouild": 26757, "Kivu": 14192, "vintage": 16194, "muni": 23425, "'CAUSE": 11875, "crop": 8070, "5.30": 23129, "Welch": 21544, "paragraphs": 25914, "guessed": 8648, "begs": 20044, "walked": 6165, "Vancouver": 28277, "huh": 1792, "grapes": 16210, "romantic": 3894, "Incredible": 29798, "sued": 23783, "leverage": 1337, "saltimboca": 28817, "Movie": 4099, "USI's": 13273, "Lamarque's": 4041, "cathedral": 17516, "waaaaaaaaaaaaay": 20155, "erosion": 25058, "MULES": 11988, "Sort": 30421, "Ah": 6289, "utility": 680, "base": 1308, "pressures": 1460, "shower": 15740, "Mourey": 5177, "faculties": 11460, "Atta's": 20580, "kaoshikii": 24029, "nationalism": 19140, "reigned": 3527, "Gonna": 6414, "3:29": 18818, "11:16:58": 22892, "Elena's": 18643, "polarized": 2622, "Fortunately": 8176, "definitely": 12945, "warrior": 25980, "Ltd.": 21633, "idleness": 31111, "nagging": 8173, "farmers": 8088, "cellular": 24503, "wholeheartedly": 28823, "royalist": 3950, "refusals": 13206, "bees": 28268, "skulls": 32249, "Commander": 24731, "ND": 8264, "specified": 27376, "lithograph": 21151, "Chapel": 13337, "Nutley": 1578, "should": 1126, "economics": 26775, "Amerithrax": 20753, "brave": 10142, "archive": 9245, "Felipe": 14768, "peeling": 29298, "Abramoff": 25901, "Dog": 9798, "Based": 2111, "Castillo": 15398, "AV": 3049, "pleasurable": 7718, "Investors": 23651, "reverse": 7470, "Impacts": 25123, "aromatic": 16203, "outlet": 27174, "Lopez": 11144, "bats": 4814, "tumbledown": 32189, "11/01/01": 21860, "Donations": 24552, "Amid": 24397, "stored": 3827, "flirted": 27971, "bricks": 30387, "locker": 29857, "Ferguson": 29910, "920": 22250, "Farmer": 28081, "Felix": 17170, "HUGE": 11337, "jurisdiction": 7576, "pound": 25087, "vacature": 7591, "alike": 6211, "arrogant": 17591, "actionable": 19703, "3/10/00": 22571, "drank": 15843, "ENRON": 22309, "Taft": 12036, "fl": 18435, "glances": 31810, "bathtub’s": 9731, "pekin": 27127, "jet-black": 32055, "claimants": 13011, "aversion": 11661, "Resting": 5342, "M5S": 13202, "revised": 21480, "theology": 6539, "leakage": 29270, "pragmatics": 3739, "Shipping": 32540, "smorgasbord": 29541, "Lukaku": 13097, "established": 173, "groceries": 12043, "Iraqi's": 20793, "pigeon": 26593, "hamsters": 26483, "sprung": 31996, "festivities": 27814, "illustrates": 8357, "ginger": 15840, "Petunia": 32025, "Hearts": 20862, "bold": 14079, "suffered": 4654, "XVII": 12702, "total": 2151, "Active": 2653, "fantastic": 6877, "herd": 8792, "Jana": 23451, "mixes": 18438, "D.C.": 3513, "Jezebel": 10574, "Film": 4142, "signatory": 13885, "puff": 26370, "unusually": 17709, "flowery": 18004, "Nobel": 720, "leaving": 2498, "Dr.": 7214, "recognizing": 7446, "10:40": 23866, "Landing": 24768, "artist": 4547, "th": 29849, "parks": 6149, "formations": 32941, "squawking": 17793, "tearing": 6451, "collects": 1625, "speck": 30386, "Zurbarán": 98, "These": 826, "irrigated": 17073, "sounds": 1744, "Eureka": 10340, "×": 15663, "1871": 17033, "meets": 1787, "Al": 4507, "amount": 2456, "Kathy": 6654, "Der": 25735, "co$t": 26747, "NSA": 24332, "opinions": 1311, "Snacks": 29977, "straining": 30418, "politisized": 30683, "patronized": 19124, "dill": 31656, "Mysteries": 4218, "applaud": 14572, "flares": 32599, "obtain": 2293, "defaults": 22047, "Shaw's": 5477, "Inspiration": 12078, "Uhhh": 8829, "toying": 25646, "flight": 9262, "EIGHT": 10091, "Nacogdoches": 14718, "demand": 2127, "urban": 7289, "risks": 17811, "Kadai": 1846, "Englishman": 31595, "redeploying": 27719, "SIAM": 22893, "Tagebuch": 4434, "cursor": 24985, "healthcare": 24513, "flee": 27645, "Unfinished": 30420, "illusions": 20511, "stove": 27305, "controlled": 12106, "bobber": 27857, "withered": 32241, "representatives": 723, "depends": 2078, "pitches": 8042, "Fair": 8232, "Malaysia's": 12169, "t3i": 26388, "Honduras": 15385, "Analysis_0712": 22360, "hypothesis": 1918, "tangible": 19060, "busybodies": 19089, "Mathematica": 3263, "coin": 18338, "mining": 25924, "Nevertheless": 4626, "vacuum": 15064, "seperates": 29030, "practicing": 15902, "Row": 22940, "sculpting": 26406, "centre": 4493, "understan-": 6793, "capsule": 11300, "marginal": 11636, "odds": 7437, "Career": 3392, "excuse": 3214, "s": 2681, "tract": 26806, "fireworks": 16519, "Buddhists": 7245, "Ferte": 30765, "retreated": 8984, "giant": 1326, "Agents": 1200, "commonwealths": 30958, "density": 3326, "www.weathereffects.com": 21571, "satin-wood": 31560, "suites": 29896, "brightest": 32569, "Wolens": 22858, "capelin": 25171, "Services.doc": 23100, "starless": 9992, "seeded": 13298, "colony": 6107, "Namath": 6186, "decreased": 2751, "beast": 17938, "DSL": 26528, "Founders": 24218, "trotters": 28034, "appropriately": 15490, "hopeless": 25290, "Mystery": 17554, "President": 3776, "grammarian": 5022, "transcripts": 22822, "67": 4845, "Elevators": 17910, "Benefits": 24051, "extensive": 301, "goalkeeper": 13132, "Koinonia": 5935, "@": 11299, "cabins": 27236, "deserted": 6639, "purposely": 30022, "coconut": 15921, "77415-0027": 21824, "rag": 31122, "malaria": 31951, "Uneasy": 30865, "halal": 27326, "Various": 12541, "Pashtuns": 19750, "Household": 2112, "Switzerland": 3146, "..": 11278, "tank": 17361, "Combined": 2657, "founded": 10599, "FUCKING": 28732, "glaciers": 15275, "Wild": 11302, "Ripple": 25049, "F'ers": 29936, "flopping": 27589, "hissed": 27689, "JAZZ": 29265, "Sadat": 20815, "petrified": 32440, "manicure": 28290, "Dallas": 10349, "interior": 13014, "Filet": 26346, "Wessex": 28774, "oclock": 11953, "vacationed": 25217, "coins": 3623, "Tue.": 22190, "Vajpayee": 19148, "HEAVEN": 28781, "AMAZE": 28791, "Korea's": 12840, "caused": 2496, "Everett": 21799, "Carolina": 3584, "There’d": 16078, "metaethical": 15142, "buffs": 16343, "R": 2056, "actress": 5184, "6871082#": 21697, "Antichrist": 25626, "nationwide": 13896, "Anneal": 10070, "Engels": 10942, "popular": 3752, "greeter": 29379, "non-Muslim": 12246, "Bolivia": 10247, "controversy": 1414, "condemned": 11809, "Greetings": 22370, "Copeland": 21756, "offered": 3643, "southwest": 22476, "SNY": 11093, "easily": 6290, "golfing": 21291, "Manhattan": 9704, "JULY": 14584, "red-eyed": 31212, "STEALING": 30008, "fieldwork": 3417, "eSpeak": 21542, "sobriety": 30404, "germinate": 17732, "composition": 422, "Nissan": 29052, "distraction": 7698, "preparation": 9012, "ADVANTAGE": 11891, "Page": 23629, "Dad": 6357, "earnings": 7895, "aqueducts": 15346, "Gov.": 18823, "armour": 26009, "comes": 5260, "ld2d-#69345-1.DOC": 22433, "agent": 3708, "clothing": 15331, "dads": 26110, "affirmed": 19266, "emotions": 1587, "Jewish": 5167, "Bastien": 5840, "procedures": 2379, "Door": 29133, "0308.doc": 22251, "conjectures": 11262, "hogtied": 18775, "counseling": 28929, "CONV_050815c_03.10": 1849, "54": 13362, "prudent": 23351, "redlined": 22358, "Lodge": 3637, "grasps": 9522, "awkwardness": 17969, "temptation": 12024, "Annesley": 20925, "lengths": 2802, "prudish": 26551, "cough": 27665, "File": 7646, "Dean": 5736, "assistance": 13895, "sentiments": 8041, "1.8": 23614, "protestants": 27194, "beardies": 26359, "addressing": 14152, "She": 4458, "CSAs": 8238, "Parkhill": 20954, "darkest": 9041, "Biography": 5921, "Climate": 13456, "Stone": 13355, "M&M": 8806, "infuse": 18418, "Platter": 28438, "war-paint": 32628, "paradise": 20670, "dumbfounded": 31273, "Sheer": 8135, "supplies": 10447, "let’s": 14359, "twitched": 9669, "0.6": 2631, "rage": 18960, "nudging": 9022, "Itza": 15392, "1746": 14946, "calories": 8145, "motorways": 17558, "patch": 9065, "Dharmadeva": 24026, "While": 114, "cognition": 1514, "We'll": 6990, "weapons": 10416, "optogenetics": 8363, "humility": 14067, "Internal": 24382, "misinterpreted": 30137, "killer": 3985, "smarter": 27159, "spring": 16014, "buildup": 19612, "shadows": 30247, "pressed-down": 31636, "select": 15214, "expelling": 20556, "static": 26527, "unplaced": 9466, "Weathermen": 18482, "Deseret": 12208, "dos": 29303, "Deng": 3477, "enquiries": 22600, "subcontractor's": 7203, "outshone": 29094, "cover": 2368, "limitations": 1932, "Preparedness": 25859, "objectives": 778, "filth": 10558, "cleanest": 21600, "portable": 21772, "calculations": 30160, "deffenitly": 29012, "conclave": 11965, "K-": 6147, "Hagrid": 32291, "Hasina": 19498, "Assistant": 8532, "TGPL": 21921, "storefront": 29081, "Gliding": 30671, "offended": 6642, "libraries": 30192, "1699": 4265, "imperative": 5672, "offworlders": 10068, "Collins": 5859, "physiology": 14955, "scanned": 2606, "novelists": 13763, "imitated": 32546, "confirming": 13085, "1683": 4354, "monarch": 4538, "mousse": 28818, "appalled": 25197, "payable": 21638, "weary": 31146, "NECESSARY": 21529, "cloaca": 32529, "quick": 5062, "implements": 18359, "http://im.yahoo.com/": 22083, "659,000": 15677, "Basse": 16637, "Siddiqui": 20742, "architecturally": 30908, "squire": 30437, "ops": 8578, "opposition": 5641, "absorbed": 14854, "Roman": 4289, "Nazarenes": 5173, "dilute": 27144, "Braden": 17471, "Hickory": 29883, "comparative": 3026, "addicted": 13531, "Networks": 21124, "heartening": 31431, "utilising": 22624, "03:48": 22401, "sails": 9072, "Englishwoman": 31639, "sweating": 9269, "mates": 27399, "lunchboxes": 17891, "counterparties": 22062, "pickle": 15837, "Condominiums": 28968, "Guiness": 29356, "record-player": 32480, "Hawaiian": 17114, "contractors": 7190, "senselessly": 14143, "Vigie": 16683, "Sikong": 14866, "Detect": 17587, "learn": 5162, "file-persistent": 30055, "make-up": 31347, "luminol's": 18028, "cornerstones": 14504, "shelves": 25855, "Cons": 29172, "Zubayda": 18753, "Scheffer": 10443, "ONLY": 11839, "khaki": 9815, "Btwn": 28238, "glinted": 32739, "emitting": 2105, "Welcome": 9780, "AIR": 28464, "buzzer": 30406, "realities": 8246, "implanted": 8301, "Antonioni": 5497, "thrive": 20431, "member's": 29039, "Degenerate": 20191, "princess": 28415, "steaks": 28608, "furnace": 27293, "prelude": 24566, "380": 23241, "Alter": 16585, "pederasty": 5094, "essays": 30236, "withdrew": 18890, "Native": 17058, "Baudelaire": 20301, "SEC": 26035, "NYE": 29293, "Consequently": 4381, "lately": 9610, "silvered": 32016, "McInnis": 29032, "main": 722, "bettas": 26709, "FAR": 29276, "X33098": 23589, "Executives": 14164, "antibiotics": 7029, "angle": 15728, "Against": 8270, "writes": 6541, "smsll": 11448, "hotels": 15104, "mirrored": 32865, "tiling": 16733, "hysteria": 24072, "mac": 15847, "discarded": 2723, "communications": 7783, "Daschle": 20797, "amounted": 31635, "Leite": 22296, "Matilda": 4208, "Nabil": 13145, "segregationists": 14365, "Hino": 28882, "impatiently": 29581, "added": 4727, "sorrowstricken": 14053, "corps": 18751, "canal": 17061, "train-tracks": 32318, "frisked": 30511, "1778": 3563, "often": 389, "reassurance": 19657, "seared": 28450, "propensity": 15091, "Tampa": 4934, "EXTRA": 26332, "signaling": 19160, "FIFA": 4513, "online": 635, "squeeze": 15598, "Chances": 18271, "10/29/2000": 22384, "Agriculture": 8051, "varie$": 26748, "up-river": 31266, "sampling": 16715, "fitfully": 32753, "QE2": 32559, "Throw": 16117, "ostensibly": 1257, "undo": 7047, "Twain": 10946, "Kill": 20109, "Painting": 3537, "crushed": 9338, "Na": 7027, "soundless": 30455, "Maaloul": 13146, "Mexicans": 14698, "Batawi": 18531, "oilfield": 24569, "THEIR": 28740, "Thuy": 26516, "cured": 24060, "sourness": 18457, "Spores": 20703, "Studio": 11162, "ancient": 3371, "Complex": 8254, "funniest": 13687, "4:50": 29734, "Sullivan's": 20936, "pro-India": 19496, "Kopinga": 16285, "preschool": 1562, "Hajj": 4522, "Spider": 12604, "aiding": 25891, "two-hours-and-a-bit": 31580, "Skirts": 32370, "chattels": 7611, "lik": 26362, "chase": 19593, "deduct": 7154, "slim": 32648, "Left": 4778, "225": 17263, "apologize": 20303, "Legend": 32582, "hospitalize": 6765, "feild": 22926, "rent": 5218, "adverb": 1146, "Cans": 7434, "mediated": 10894, "brats": 23913, "intercom": 30407, "augmented": 8385, "spending": 5435, "Hampshire": 25219, "partnered": 5880, "question": 1594, "tuck": 16142, "Entreat": 18188, "prediction": 6025, "paradigm": 20115, "trot": 25239, "overcast": 15972, "?": 38, "sa-": 6524, "semantics": 3663, "weeds": 11955, "rom": 26173, "mujahidin": 18768, "Understand": 15541, "famed": 4696, "PDF": 13758, "clearing": 28032, "ceremonious": 7773, "injuries": 12880, "Dictatorship": 24738, "gaunt": 32900, "spoken": 1762, "Gleason": 11996, "commonest": 30822, "league": 4890, "rap": 2960, "feeding": 8148, "posited": 1916, "Corey's": 22090, "Shreveport": 21196, "simul": 5078, "banana": 5278, "'LL": 28923, "sold": 5891, "DeVries": 21299, "featureless": 31087, "theropods": 2808, "intriguing": 10609, "insult": 17653, "Learner": 15204, "spice": 17708, "doctor": 3307, "disappointed": 6640, "monks": 5963, "dysfunctional": 20367, "assets": 19998, "envelope": 24938, "240,000": 12901, "Benefit": 24525, "mini-MMPI": 10729, "ledger": 13940, "Anse": 16681, "operating": 2135, "does": 231, "the": 70, "Bones": 26033, "grimaced": 32927, "mark": 1892, "participation": 651, "welcome": 7558, "TNA": 18980, "800/711-8000": 23080, "generalize": 17598, "sheisters": 29415, "CI.taiwan.gov.tw": 13963, "lopez": 25502, "Englishwoman's": 31650, "2.0": 8265, "77030-2707": 23627, "Seattle": 22954, "Rosencreutz": 10088, "eerie": 19251, "treasures": 16349, "postpone": 21190, "973-3634": 23307, "demands": 14747, "wink": 14817, "Fannin": 23626, "tires": 28224, "inherently": 17632, "fliers": 24811, "renting": 13712, "CITY": 29944, "ant": 10211, "Dominion": 21470, "King": 3523, "colonists": 31023, "Which": 39, "elementary": 1570, "Detection": 946, "Tunisia": 13064, "Chambers": 2493, "heap": 9180, "hints": 11816, "1555": 25478, "flooring": 26860, "PAT": 28085, "Dries": 13100, "serrated": 8685, "Jazeera": 18605, "pompously": 31252, "08:58": 22177, "rural": 15481, "STATEMENTS": 14586, "HOWEVER": 27077, "localized": 25131, "announces": 14803, "calling": 5448, "performed": 1122, "touches": 8324, "convicts": 24272, "dress": 9122, "mater": 5345, "overnight": 17097, "naval": 19554, "Puttino": 25471, "submits": 9524, "interjections": 1791, "thanx": 26905, "Kingerski": 23330, "wedge": 32414, "dizzy": 32367, "anticipating": 10632, "liq": 22325, "Loose": 20021, "x365": 20982, "bloodletting": 15313, "did": 1998, "Zealand's": 12655, "preached": 5933, "thir": 7083, "Point": 4106, "immense": 7971, "timid": 14380, "09/16/99": 23187, "redwings": 25188, "UNTRUE": 29064, "sprites": 9778, "2.9": 5272, "sodden": 9854, "Luján": 1013, "se": 12037, "Russia's": 24579, "operas": 20455, "nature": 1794, "pics": 27129, "Wunderbar": 28947, "Brewery": 29344, "individual's": 12979, "Minnesota": 8531, "buttered": 27341, "exchanging": 31696, "petty": 11777, "dutifully": 8856, "co-stars": 5857, "suspect": 10560, "Birmingham": 4250, "clean": 6375, "travel": 8568, "loosen": 17666, "Spier": 16245, "Beards": 27145, "WINDOWS": 11859, "IPS": 19010, "hairpin": 32147, "clothes-careless": 32498, "methodology": 2012, "manifests": 14864, "replies": 22659, "exists": 11151, "ideals": 14015, "Hm-m": 6491, "suitable": 10666, "convincing": 12316, "Winter's": 23701, "marketers": 22422, "Flexibility": 25250, "dispatch": 20450, "vengeance": 24890, "re-election": 26100, "controllers": 19896, "Broome": 24955, "curtains": 28900, "thwarted": 14195, "Lina": 16112, "bombers": 18483, "Wednesday's": 19870, "utilities'": 23707, "Hawk": 25746, "condos": 28275, "tentative": 23931, "electronically": 2605, "canada": 26738, "Meghalaya": 19626, "lifetimes": 12301, "offices": 4032, "Kline": 21159, "Moroz": 8673, "aged": 1652, "n’t": 4586, "undernourishment": 13470, "MYSTICS": 22949, "Englewood": 16525, "southeast": 5156, "erratic": 19775, "winger": 20888, "sway": 8168, "shallows": 9499, "gloomy": 15744, "Filtering": 30145, "About": 2120, "workable": 7226, "reassigns": 20036, "Copy": 8674, "Radio": 2659, "ample": 17668, "teenagers": 12060, "spirit": 8703, "Metals": 22575, "Yesterday": 12197, "ending": 14034, "dart": 8919, "Employees": 28243, "consistent": 2735, "Andre": 20903, "carriers": 25878, "king": 10168, "30th": 11784, "off": 626, "fast": 6807, "Sa-": 6440, "Guruswamy": 7215, "surpassed": 29392, "Taco": 29766, "2011": 267, "child": 1274, "Call": 20997, "Remarks": 14579, "territory": 12105, "femoral": 2749, "suits": 15215, "Fri": 16606, "YUMMY": 28767, "courtroom": 7564, "distance": 9623, "tow": 21835, "Smartwolves": 20335, "Deb's": 21449, "Witchcraft": 32036, "Walls": 24408, "milk": 6250, "showed": 2768, "needed": 1965, "innermost": 24044, "Edwin": 19421, "attest": 30001, "expenses": 11688, "Baby": 6827, "componential": 5635, "ivy": 16080, "triplets": 22269, "dishes": 9760, "Potter": 3001, "audiobooks": 10919, "prevalence": 10554, "proficiency": 19237, "Scottish": 4269, "non-Hodgkin": 24545, "teachings": 4986, "Bacon": 5283, "CASH": 24979, "troublesome": 25781, "nephew": 3151, "Changpei": 3428, "Beginning": 29382, "trimmers": 29222, "Thanks": 6480, "keystone": 25045, "foolish": 9156, "totaling": 25830, "Cho": 27561, "boasts": 16337, "Jen": 13800, "Wispy": 8913, "Bienvenue": 26606, "quite": 1750, "12,000": 12964, "alt": 7683, "however": 409, "Pomodoro": 15864, "Salafi": 18946, "harvest": 8122, "Ra-Ra": 32661, "debtors": 22583, "Bissen": 7538, "Consistantly": 28638, "Convert": 30063, "exception": 1755, "restrict": 7363, "dupes": 3936, "got": 4650, "court": 3532, "Jito": 6782, "it's": 6100, "#advice": 7662, "assignment": 22912, "You'll": 10955, "faithfully": 22110, "disputed": 6534, "sealed": 24940, "Smartwolf": 20175, "Calvin": 6610, "resonates": 14544, "carport": 7387, "Operational": 23619, "UPS": 11761, "documents": 553, "Sept.": 19128, "Privet": 32022, "solving": 1619, "shifting": 6022, "nutritional": 8193, "privileged": 14535, "picky": 6489, "groped": 27956, "hears": 29206, "aggression": 10398, "guaranty": 22292, "carbons": 11406, "stooped": 30361, "Padalecki": 5696, "roared": 32161, "Offensive": 12582, "determining": 341, "Channel": 5742, "NET": 21474, "Jolla": 28865, "Greenwich": 30947, "combined": 11623, "Joe": 6185, "end": 1114, "light-inflected": 32759, "unpredictable": 25323, "provocations": 18795, "BURGER": 28572, "Ranjit": 18990, "allot": 26444, "recommend": 10581, "Voivodship": 16861, "Musk": 8338, "clumps": 20702, "Auguste": 3872, "Photographs": 13303, "CHILD": 29145, "conditional": 30109, "Jihad": 18487, "endlessly": 14995, "http://www.mikegigi.com/firehole.htm": 27318, "Vitas": 13368, "establishments": 17376, "broom": 18289, "traffic": 11150, "mattered": 29280, "inseparable": 20172, "horrendous": 28683, "spheres": 9316, "Guantanamo's": 26081, "Teruya": 7543, "parcel": 11763, "Numbered": 17477, "concerned": 5268, "nite": 11725, "allies": 14614, "salty": 15845, "Prove": 27346, "Coventry": 26127, "Ashton": 16030, "36": 12852, "normative": 15200, "MURPH": 19843, "schoolrooms": 30751, "defines": 8432, "acres": 17070, "Castling": 25479, "fluent": 18102, "areas": 2324, "3,200": 25766, "reception": 21788, "letters": 3892, "accelerator": 11394, "intimacy": 25405, "Metro": 12529, "familiar": 3051, "33": 2724, "chutes": 18189, "reconsider": 19753, "Karate": 7094, "Daniel's": 3169, "succeeding": 14065, "pilot's": 30810, "Thu": 24865, "fatally": 18209, "Thursday": 5231, "Outdated": 29013, "lolled": 32097, "deadbolt": 7389, "decouple": 2706, "advance": 9291, "ChatGPT": 13692, "chilliness": 32681, "steam": 6207, "[...]": 13467, "shaved": 30241, "Meier": 22382, "involved": 1322, "await": 14020, "merits": 3768, "Roll": 16402, "loafing": 31047, "pose": 12608, "fax": 16674, "Mod": 26164, "disinfectant": 32454, "season": 2949, "financing": 11627, "credibility": 15283, "Querelle": 5515, "M300": 21776, "streak": 19783, "modulate": 21353, "Honestly": 27795, "arranged": 3249, "Buckley": 5418, "namely": 326, "attorneys": 21514, "arnt": 26364, "Wood's": 23341, "smile": 26402, "hotmail": 24168, "location": 2328, "2012": 1567, "aloe": 15948, "parties'": 23824, "legally": 8426, "students": 1472, "addictive": 19774, "+4588304520": 17304, "69,000": 15688, "worthy": 14174, "three-legged": 30962, "Leave": 7757, "greet": 24256, "NEWS": 24982, "unlimited": 16900, "Code": 7227, "breyers": 26821, "ashes": 11750, "http://www.nea.fr/html/rp/chernobyl/conclusions5.html": 18710, "shivered": 10031, "polite": 2006, "centralize": 21130, "approx": 17853, "rouge": 9138, "slow": 1485, "magician": 10320, "1.75": 18422, "hall": 9721, "281-435-0295": 20986, "Cap": 21501, "As": 365, "abnormality": 15666, "pointed": 3234, "killing": 11238, "plagues": 2485, "denial": 12745, "Lebanese": 18891, "dg": 23099, "crucial": 430, "decisions": 895, "anti-ship": 25783, "Trial": 5502, "spoke": 3369, "middle": 4676, "Salt": 16144, "rubbed": 16026, "VisaCuba": 16465, "adopts": 820, "theatre's": 5460, "Levis": 21257, "Gaming": 24251, "ULGG": 24258, "proposes": 25481, "than": 1174, "Mohamed": 12189, "precautions": 27302, "fighting": 5792, "Sancho": 25518, "primitive": 11315, "playstation": 26795, "intertexts": 2987, "Nightmare": 29866, "started": 3818, "dwarf": 15596, "Leeds": 17570, "Gentle's": 21311, "do": 32, "tourists": 9808, "Extensible": 30098, "impress": 19865, "Proposal": 21033, "Moving": 18020, "download": 10972, "Robbi": 22214, "Dumbest": 29935, "profiles": 10738, "insecurities": 8743, "headlines": 11116, "Jaime": 21871, "drink": 6805, "percent": 2122, "Mweta's": 31583, "extinctions": 25132, "HELP": 26114, "insides": 18431, "Fereder": 18078, "spreadsheet-like": 30124, "1535": 25395, "Sen.": 23667, "Tulsa": 17401, "SPRDOPT": 22693, "Gallery": 13320, "enchladas": 28527, "figurehead": 31939, "Wishing": 26702, "men's": 31970, "job-with-prospects": 32576, "rapids": 31164, "occupying": 7578, "toga": 31005, "record": 523, "Motive": 20575, "countertop": 29749, "Ay": 25524, "diving": 8687, "Grimy": 29422, "Salazar": 27352, "climaxed": 8926, "craving": 29514, "taxied": 9359, "radical": 18863, "bureau": 29752, "broadcasters": 10895, "Cannistaro": 19397, "vehicle": 5392, "contexts": 10875, "treasurer": 13313, "pacify": 27704, "comforted": 30369, "11/09/2000": 21374, "darkening": 30440, "scared": 6379, "won’t": 9520, "Planet": 24994, "FAST": 28077, "flavor(s)": 18433, "Hindu": 7220, "apologies": 29601, "mathematicians": 3112, "MTV's": 5806, "seizures": 9622, "Columbine": 20110, "RP": 26293, "crumbles": 30498, "coffins": 26000, "north": 11468, "Benner": 15134, "04:11": 21708, "reimbursed": 24977, "Laurel": 21631, "ruining": 27450, "Heathrow": 30519, "horse-faced": 32051, "wizard": 32035, "zipped": 21874, "樋口": 4599, "Mumbai": 19171, "riders": 17514, "✉": 17261, "314": 5906, "10:00": 16182, "undergraduate": 23363, "succulent": 30002, "exercise": 1618, "arsenal": 14667, "Friscos": 26558, "WHITE": 27622, "numero": 24820, "frozen": 8011, "Stove": 18365, "Used": 26377, "depressed": 26277, "annexed": 18900, "outlining": 3993, "dysfunction": 14289, "realists": 15155, "hyperbolic": 29985, "ironic": 11030, "Tiger's": 23231, "returned": 3215, "useability": 22592, "Spring": 20596, "MEH-risk": 21946, "Strathmann": 23838, "bravely": 24305, "muscles": 10646, "Animated": 12554, "forger": 25609, "MXN": 16454, "NICE": 28788, "unreal": 31293, "bow-ties": 32118, "renowned": 16418, "Cervantes": 30443, "smithy": 32413, "Rs": 27400, "etcetera": 11196, "blacklined": 21619, "Seven": 5366, "flesh": 9467, "Thurs.": 11717, "range": 1310, "wildland": 25075, "probabilities": 30388, "anywhere": 6406, "aided": 17396, "Tropez": 22187, "polish": 9741, "artworks": 42, "risked": 19771, "Get": 6492, "erupts": 14802, "detachment": 32697, "1777": 3551, "nags": 30640, "tellers": 31042, "Previously": 3480, "Equivalence": 5632, "Friar": 25678, "Saltford": 28926, "slamming": 30458, "assessed": 1234, "Kwok": 12396, "brokerage": 22285, "benefactor": 4399, "raiding": 11968, "aspirations": 12134, "authored": 20196, "balancing": 7425, "Gakuru": 14474, "4.319": 24477, "grabbing": 8846, "CW": 5801, "quickening": 30380, "growled": 32303, "blak": 26618, "dazed": 32385, "snatches": 18319, "Nicklaus": 13371, "stained": 10645, "H2O-esque": 16076, "assessing": 1423, "Alvarado": 2232, "competing": 8416, "dumb": 11818, "WAY": 29398, "requiring": 22621, "housewife": 14370, "fritters": 28816, "lie": 7676, "Nedwick": 1962, "podcast": 5303, "hesitations": 28690, "1480": 5082, "60": 2945, "KPA": 12854, "didnt": 27599, "cuddly": 26817, "inquires": 28239, "mail": 8502, "character": 3867, "literally": 4701, "Camps": 16352, "demotion": 5974, "IMPORTANT": 24926, "handicap": 27643, "2:300": 21570, "translation": 3241, "anti-Indian": 19615, "defective": 26008, "songs": 22088, "FLDS": 19988, "Dwarf": 26414, "modify": 13245, "ship": 9081, "Athena": 13518, "impacts": 8143, "!!!?": 26115, "Infernale": 5476, "Mérida": 16954, "28/10/2004": 19181, "Kuei": 3430, "devote": 5135, "Demis": 32933, "evictees": 29743, "status": 7269, "remodeled": 29253, "equinox": 9765, "undersung": 8044, "5,000": 7916, "intellect": 24712, "'RE": 11883, "2000s": 5701, "vastly": 24728, "numerical": 22889, "shouted": 9664, "patches": 15703, "Baathists": 18489, "connoisseur": 29020, "CPA": 29869, "Homeopath": 23975, "Professors": 22668, "funded": 7194, "hilltops": 17212, "4.7": 25991, "Nicki": 23445, "intrusion": 24559, "flatter": 31028, "Stella": 32368, "visually": 75, "Cox's": 19602, "26.1": 7326, "ALONG": 21527, "disclosure": 22126, "secession": 19081, "uhm": 15856, "hospitalized": 27618, "nonprofit": 7483, "energy-intensive": 31434, "13011": 20267, "Dale": 5546, "SCE": 23724, "urine": 26572, "creatively": 7689, "Bad": 13695, "foie": 29489, "undersigned": 11677, "Amy": 7313, "bronchitis": 6738, "deadbolted": 7406, "springs": 16062, "NPR's": 19812, "starred": 4132, "cross-examination": 19407, "consider": 1967, "7484": 20928, "Travel": 16412, "approximation": 2673, "cosmopolitan": 4988, "window": 7165, "Arrangements": 29091, "Hibbs": 12032, "Saleh": 19652, "Discovery": 4196, "3-5297": 23793, "TWO": 24965, "Seas": 27492, "Motors": 16307, "crossings": 13002, "non-personal": 16464, "mei": 14865, "taught": 3409, "refinement": 2536, "smiles": 8795, "perception": 61, "poked": 9738, "THAT": 11906, "12:03": 22969, "tai": 12392, "mandatory": 6363, "Creel": 24437, "canan": 26394, "stratagems": 30351, "observing": 2626, "Britain": 17529, "Argentina’s": 923, "comm-": 6883, "grove": 31233, "leash": 8315, "tendrils": 8911, "bombarding": 12722, "Queen's": 30942, "Steffes'": 22823, "huddled": 32637, "hurled": 24429, "6/4/11": 29041, "populist": 18951, "Sages": 30612, "Whoever": 14662, "artesian": 11948, "Finkelstein": 13364, "heaven’s": 8691, "mosaic": 8641, "ey": 11978, "Stationery": 29424, "erroneous": 2332, "themes": 135, "1963": 3694, "momentum": 7747, "banging": 20327, "Acriflaven": 27900, "moderates": 19734, "vibe": 13590, "alot": 27586, "fountain": 10178, "UCC": 23497, "retailers": 16619, "max": 15695, "crouched": 31234, "presses": 30615, "Singh": 19167, "angeles": 19469, "officer's": 21211, "Arlington": 12229, "muster": 13756, "Heard": 22290, "regenerate": 25322, "Playhouse": 16417, "principally": 25741, "clashes": 19053, "implies": 10598, "pit": 26141, "Poland": 4279, "According": 3727, "she’s": 8809, "determination": 2705, "monster": 30424, "Abba": 5908, "financials": 21110, "Ghanaians": 31863, "confidante": 20657, "floated": 8982, "exterminated": 25006, "Pond": 312, "Rye": 9332, "border": 4975, "2254": 14214, "AKA": 15776, "retrofitting": 20716, "thanked": 21344, "Memorial": 12895, "Ro-": 7173, "04:37": 22760, "overlap": 2352, "countdown": 5325, "shaken": 10572, "cakes": 17829, "7th": 15871, "grrrrrrrreeeaaat": 29548, "Choice": 4096, "Desperation": 20421, "pancake": 26485, "channel": 5185, "MK": 22749, "fancy": 16004, "aims": 1889, "o'clock": 4027, "Nature": 13455, "}": 25373, "witch": 6821, "disclosures": 7325, "tremendous": 10796, "honeymoon": 21747, "percell@swbell.net": 22891, "Tiffany": 7315, "ravine": 31225, "Moi": 6705, "Forever": 6993, "bypassing": 20061, "trophy": 17654, "potent": 20389, "maritime": 12834, "12.48": 22276, "humble": 4746, "PAQ": 24152, "snorkeling": 26771, "Tokyo": 4745, "Durham": 25, "drunk": 8889, "remarks": 9877, "racism": 14139, "ASAP": 21019, "1600": 632, "Willett": 9702, "medalled": 31830, "Solomita": 5306, "incorporated": 16916, "Grandmother": 32381, "Ozymandias": 4124, "Luan": 23118, "witting": 1231, "current": 1057, "http://www.nea.fr/html/rp/chernobyl/c05.html": 18712, "lands": 2357, "----------------------------------------------------------------------": 25341, "custom": 26160, "Fire": 26683, "Trio's": 29295, "it’ll": 8373, "finch": 27774, "Ashraf": 20069, "abolish": 23697, "hearing": 1809, "GitHub": 13958, "Intellectual": 14555, "penalizing": 805, "circulates": 15807, "Hezbollah": 20549, "catfish": 29173, "algorithms": 9633, "resisting": 31209, "female": 4996, "hired": 13659, "pet": 15457, "mauled": 24111, "extrapolate": 10311, "authorization": 22765, "crew": 19601, "Devil": 6623, "optimistic": 11582, "obtuse": 27727, "liver": 24088, "LIKED": 27484, "Research": 550, "diverse": 8447, "estuary": 30902, "7.22": 26047, "Kevalam": 24619, "imperfection": 17613, "dropped": 9398, "biting": 7180, "check": 7124, "http://www.ebay.co.uk/itm/130589513308?var=430034792128&ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1438.l2648#ht_1500wt_660": 26862, "commonion": 11753, "outstanding": 4562, "miracles": 29787, "Lamont": 12213, "notoriously": 25899, "schooling": 3181, "pimply": 30541, "grammar": 1878, "guardians": 13883, "Kids": 23893, "bronze": 10990, "veterinarian": 27620, "contentedly": 31073, "Carl": 5520, "documenting": 6902, "Mountains": 17183, "what's": 7485, "Raging": 29765, "workmen": 31825, "monopoly": 20336, "unbeatable": 28125, "hi": 15701, "perimeter": 31804, "haha": 15750, "inversions": 32949, "1990": 2602, "trial": 7341, "myth": 6873, "superstition": 32489, "Consideration": 12645, "Adds": 24067, "guilt": 5037, "painful": 3309, "gulping": 8841, "ballistic": 14280, "hunger": 7781, "ex": 880, "Gibbs": 23789, "MTM": 21108, "Cavern": 25670, "existed": 10395, "gaily": 9724, "beans": 15334, "awarded": 3257, "1970": 16385, "yogurt": 16598, "filmmaker": 19225, "hospitable": 28985, "complement": 388, "June": 3489, "authorities": 16459, "Fee": 22545, "scattering": 32197, "THANK": 26337, "Young": 5757, "professionalized": 5295, "Definition": 10974, "Amusing": 30642, "fight": 6772, "log": 21989, "constituency": 12381, "refrigerator": 17772, "Portsmouth": 18, "disenfranchised": 19321, "01": 21407, "Northern": 12571, "Equant": 22028, "width": 23013, "viewer": 200, "colonized": 15469, "Kai": 12893, "Safety": 26921, "Carrol": 11271, "glasses": 9189, "Idea": 12093, "prestigious": 4476, "trapped": 24357, "Since": 1233, "Revolution": 3589, "government's": 12644, "11:34": 23772, "hippy": 27266, "1722": 16736, "al": 4521, "Hell": 5063, "crucially": 3722, "tenacious": 32362, "egregious": 1262, "fifty": 6118, "lame": 6380, "flipping": 22327, "qualities": 14958, "pumping": 9267, "spore": 20701, "weak-eyed": 31216, "meander": 16320, "rebuilt": 16755, "Whence": 30707, "Tiger": 19054, "ash": 32228, "respected": 887, "morbidity": 18688, "r-": 6328, "delis": 16625, "threats": 12796, "cheeks": 27983, "exploring": 76, "ml": 17841, "manhunt": 20755, "GRANT": 30045, "moderately": 18231, "disorientation": 15477, "Davies": 23143, "double-chinned": 31941, "Aw": 6479, "Francis": 14943, "junctions": 17584, "worht": 29002, "dispatched": 12874, "couch": 7383, "views": 1314, "confidential": 20754, "Proposes": 23294, "Amneh": 12230, "Asiaweek": 19577, "develope": 20322, "brain’s": 14998, "addict": 24296, "driveway": 8863, "con": 30818, "lyrical": 31902, "Starroute": 20145, "Energyphiles": 23867, "Robbie's": 6959, "abaut": 11452, "rampart": 4386, "previous": 2039, "loads": 2818, "phonies": 20179, "Dublin": 27827, "route": 9630, "Hiller": 18827, "signifcant": 2831, "emulating": 14561, "framework": 674, "Fisht": 13094, "bred": 15350, "Leahy": 20693, "waned": 3845, "perlite": 17728, "honourable": 31477, "persists": 31680, "shared": 1807, "orchestral": 2963, "1700": 3106, "347": 4967, "clods": 6387, "Linking": 30059, "1846": 14705, "regulations": 13502, "Stokes": 29197, "Checa": 1565, "Rabin": 30736, "Prototypes": 15015, "batting": 4825, "Disasters": 18667, "Franc": 16241, "Kano": 31678, "vary": 453, "address": 1802, "spur": 26198, "failing": 5971, "http://www.the-dslr-photographer.com/2009/11/which-dslr-to-buy/": 26400, "cooling": 2134, "spectacular": 4569, "Wiggle": 17788, "putting": 7394, "snake": 17941, "7:30": 22943, "re-type": 24984, "undercurrents": 19661, "Santo": 13211, "guinea": 15444, "uncertain": 11385, "remedies": 23829, "begins": 2499, "whiff": 31290, "Reagan's": 25983, "daughter": 3493, "rained": 8880, "Couldn't": 30593, "prevail": 14331, "puttagenius": 26136, "clarification": 2546, "well-healed": 32712, "Devil's": 25589, "cushion": 30905, "Pubs": 26695, "years": 279, "bartender": 10528, "halfway": 8610, "H-0002/99": 31476, "modeling": 22886, "formatting": 23096, "Parenteau": 24122, "Pope": 4983, "05:07": 21987, "SARS-CoV-2": 13807, "Vinod": 24210, "pediatric": 1287, "Abraham": 16212, "jackets": 27831, "holds": 2412, "1.65": 23459, "brooding": 30895, "speaking": 2036, "vampire": 32371, "niches": 16830, "Waiters": 30820, "navy's": 19521, "deregulate": 22471, "http://en.wikipedia.org/wiki/John_Balance": 20217, "granted": 12112, "prize": 3256, "jumped": 10077, "interestingness": 83, "treaties": 13882, "lowering": 17349, "syrup": 17896, "revival": 10456, "Colbert": 11138, "Ashfaq": 19711, "whispered": 9423, "neocons": 20177, "KSM": 20589, "Plt": 23009, "lidocaine": 9535, "PROTECT": 11854, "Rogers": 17434, "conspiracy": 5310, "1550": 25473, "peremptory": 7328, "assassination": 18539, "extrcurricular": 22678, "redefine": 23944, "clattering": 30457, "politics": 932, "upsetting": 29750, "fins": 26710, "id": 22335, "resumed": 14735, "volunteering": 27466, "Anime": 8249, "CONGRESSIONAL": 14295, "Tanglewood": 28587, "lease": 21977, "Rockies": 25043, "poor": 1999, "Hill": 12214, "nest": 10256, "IEP": 22371, "FrontPage": 30143, "without": 462, "spawned": 2954, "DOG": 28753, "AMES": 28773, "changed": 4308, "fusca": 10200, "meeting": 11444, "anticipate": 11369, "Fan": 2924, "249": 23708, "Writers": 11117, "disabilities": 14127, "http://www.ucei.berkeley.edu/ucei": 22454, "Ron's": 32139, "entreaty": 23736, "ailments": 25955, "upbringing": 27012, "Sardines": 32602, "Folly": 25729, "sparks": 30473, "reef": 9453, "citizen": 3452, "let": 3769, "coldn't": 28357, "proximity": 16872, "half-dressed": 31850, "SNAP's": 19955, "burnings": 31781, "roses": 32102, "542": 12859, "Infocus": 20731, "gallivanting": 17335, "4153030": 23082, "refurb": 28160, "Laboratorio": 2233, "Celsius": 25098, "SUV": 29730, "capes": 18344, "breyer": 26820, "branches": 6884, "jostling": 32343, "tear": 9634, "Bassam": 31107, "Oakley": 13400, "renigged": 29922, "growers": 8117, "scooped": 9700, "unlocked": 14429, "unsociable": 22606, "Guernica": 27526, "uncapped": 30411, "Pinch": 17750, "intelligence": 1569, "FX": 20904, "Hi": 7058, "flyers": 28124, "Objectively": 18217, "calculated": 15657, "Contemporary": 28425, "due": 415, "mountainous": 16640, "glide": 30973, "Academic": 11720, "ECU": 31352, "Cooking": 18364, "stems": 8902, "stirring": 10010, "Sanskrit": 24041, "conversos": 25434, "Functional": 5633, "sixteenth": 11462, "resorts": 29467, "Msaccess.exe": 30200, "Mooney": 23547, "Davison": 11742, "reign": 13854, "Seis": 6313, "stately": 17419, "Strong": 19371, "Tatars": 4339, "http://www.guardian.co.uk/obituaries/story/0,3604,1371372,00.html": 20218, "Now": 2140, "PEANUTS": 29665, "NRC": 24490, "nutrient": 15931, "Erie": 16368, "Care": 23112, "gyrations": 31885, "reproductive": 14959, "Dragon": 25339, "taxi": 16554, "doled": 7693, "DAY": 10160, "1598": 16735, "Compared": 31549, "___________": 21766, "offshore": 2717, "invading": 27695, "Caffe": 28293, "Translators": 5580, "Transatlantic": 27242, "IP": 18577, "Worms": 27846, "conveyor": 26935, "questi": 11987, "manufacture": 13946, "knights-errant": 30939, "Wizardry": 32037, "Hit": 4794, "1801": 3630, "asymmetrical": 18884, "militarize": 24281, "aerosol": 16077, "evaluation": 1083, "propaganda": 9645, "Theseus": 9573, "Xenocentrism": 15524, "pick": 3384, "slipping": 12770, "Relativism": 15424, "5107": 24016, "1997": 2397, "Bellevue": 28931, "Dulaym": 19330, "Mute": 31654, "soldiers": 8045, "puzzling": 30705, "grassroots": 13780, "abandon": 3871, "renewable": 22479, "rascally": 31206, "Fiona": 29505, "dark-green": 31090, "rogue": 19411, "alliance": 10396, "moths": 31607, "aptly": 8328, "NVQ": 26119, "cease": 9425, "Maroni": 13234, "Memoirs": 30652, "apartment": 5214, "C-": 6744, "Sweden": 4278, "talk": 1885, "dempsey": 26326, "Defense": 7361, "unzipped": 24124, "Shandy": 9842, "wildly": 26800, "aprons": 31670, "Dux": 27648, "temperature": 2620, "mango": 29474, "Hamas's": 18789, "PROD": 23034, "blown": 10136, "Witsel": 13122, "dimensional": 1973, "Scholars": 5712, "biding": 30365, "questioned": 9455, "brutalizing": 31905, "Maui": 7539, "``": 11221, "concentric": 20471, "CONGRATULATIONS": 22265, "chineze": 29131, "noticed": 3758, "activated": 7405, "lymphoma": 24546, "harder": 6773, "another": 1483, "Only.doc": 22905, "perked": 30459, "burp": 6809, "kills": 13832, "harmonize": 13847, "Sorta": 7206, "terminal": 18221, "criticism": 12115, "hostility": 12118, "required": 633, "Torneby": 23175, "inside": 2195, "smoother": 29358, "hurried": 9176, "SACRAMENTO": 23664, "germ": 18381, "itemized": 29228, "expert": 1250, "http://www.rawstory.com/news/2006/US_outsourcing_special_operations_intelligence_gathering_0413.html": 20063, "STARZZ": 22948, "puncturing": 3285, "Wade": 5782, "Preview": 14581, "lisp": 20124, "anxious": 16151, "amusing": 19283, "enfiladed": 30530, "credential": 1455, "pre-owned": 29268, "·": 24000, "Ave": 16602, "manufactured": 8753, "Level": 30034, "gathered": 3823, "Banks’": 8346, "squeak": 9735, "resistless": 9384, "loomed": 9248, "DoD": 15225, "Naturalisation": 25968, "object's": 30209, "responsibilities": 14054, "Maple": 26352, "Simultaneously": 19109, "judging": 15448, "Jiuquan": 24791, "50's": 18718, "Ph.": 22241, "unneccesary": 29056, "firsthand": 13629, "prophecy": 30854, "Rays": 4936, "Greendale": 20864, "varies": 10696, "Alzheimer’s": 9517, "alarmingly": 32770, "Cérebro": 1615, "blindness": 27748, "focus": 44, "72": 23014, "survivor": 14792, "trashy": 29614, "illustrious": 32556, "arisen": 13834, "intimate": 15571, "Allier": 5441, "Athens": 31660, "millennium": 20778, "kimberwick": 26376, "mia": 8850, "Silkie": 27132, "Courtney": 21377, "425-922-0475": 23182, "sluts": 27641, "Creek": 17054, "1830": 14732, "womanish": 25656, "erased": 31643, "eyes": 4415, "replica": 26827, "Essex'": 25430, "hackable": 8383, "cunning": 32084, "Entartete": 20189, "BEN": 27084, "patient": 3709, "Ray": 23304, "tweezers": 27678, "fancies": 27634, "Dancing": 4166, "dominate": 3757, "traditionally": 19719, "grants": 6595, "laptops": 21775, "ready": 7566, "indices": 24330, "Health": 1390, "elsewise": 21969, "QuikTrip": 28140, "untrue": 7182, "intention": 14778, "Pastorino": 13205, "whelped": 32377, "Pronounced": 16857, "seeker": 18315, "resist": 15175, "interruption": 7790, "ferry": 11048, "Coarse": 15946, "11/28/2000": 23733, "helium": 13414, "Aerocom": 19904, "tweeted": 12234, "Conan": 13660, "860": 16260, "kitty": 7072, "Lindh": 23271, "Floating": 21636, "customise": 27238, "Pisces": 25316, "Either": 21962, "01/11/2001": 22743, "Rates": 23312, "screem": 27797, "chalked": 27996, "Afghanistan's": 12076, "Flying": 11425, "for": 248, "Teddie": 4210, "bagh": 27413, "paint": 3572, "gangs": 13001, "labelled": 12686, "Fernando": 12426, "know": 1214, "opened": 4688, "02:39:27": 24866, "Putting": 13678, "razor": 6548, "counterparts": 8175, "clock": 8203, "He'll": 10731, "orphans": 26511, "Concern": 23123, "wasn't": 6810, "redeeming": 31281, "Weston": 21152, "brocade": 9125, "bosom": 30567, "knocked": 15765, "Tend": 6664, "Teotihuacan": 15368, "advertising": 10700, "noses": 11208, "reassured": 21868, "optinal": 26713, "O'Reilly": 10963, "misunderstood": 31651, "Tårs": 17243, "Vermeer's": 30249, "Troy": 10531, "Pirker": 31358, "impacted": 7011, "upends": 7448, "EI": 21099, "pen": 4602, "sus": 20338, "646-5847": 23075, "submarines": 25769, "berry": 25074, "Knowing": 9256, "JA": 7500, "workday": 13647, "5/1/01": 23542, "Melancon": 4917, "CAN": 19478, "Lessig's": 10916, "Wigner": 24902, "ghosts": 8459, "intrudes": 17620, "scenery": 16664, "amnesties": 27922, "aroused": 31686, "related": 1166, "Responses": 2925, "dwells": 11215, "bludger": 18300, "pronoun": 1152, "hours": 625, "blueprint": 32714, "joining": 3659, "Tupperware": 32460, "doom": 9336, "hits": 7339, "ousting": 19738, "cause": 2169, "mistaken": 20706, "sort": 6747, "citral": 17711, "philanthropic": 31224, "tommorow": 21232, "chops": 13665, "forecasts": 21586, "impunity": 31403, "E.": 10677, "motorized": 16580, "heartbroken": 27986, "endeavour": 14075, "Zora": 12052, "Sha'lan": 19274, "Probably": 6452, "False": 30222, "Circuit": 7426, "shocking": 9480, "09:56": 23820, "perpendicular": 2799, "Woud": 26525, "receiving": 3685, "Tenet": 20594, "Planning": 12515, "Alekseyevna": 4380, "Voldemort's": 32061, "cash": 11538, "interweave": 2303, "CEI": 13236, "Hitler": 16921, "tsunami": 19516, "generating": 2256, "regretting": 9826, "Shah": 16751, "seeming": 9324, "jermeier@earthlink.net": 22383, "doors": 11244, "Customizing": 30081, "outlook": 15218, "Pirates'": 4866, "phoneering": 11949, "Brovej": 17258, "researching": 10250, "pertinent": 23214, "Commission's": 23317, "burners": 6391, "Karen": 14112, "Driftwood": 21844, "supplement": 23390, "second-class": 31919, "supper": 32116, "1739": 4459, "SAME": 28637, "Bottom": 26896, "scientists": 406, "clog": 17375, "optimize": 14574, "nonmaterial": 15507, "bathrooms": 16074, "Hu": 3353, "gon": 6047, "Osler": 23167, "Battle": 4321, "Garage": 28619, "Kyoto": 3684, "Asahe": 31896, "darn": 26686, "Cruz": 3733, "doorknobs": 30402, "ageless": 11200, "viveurs": 32466, "ices": 11481, "depictions": 1974, "11:07": 21951, "saws": 26834, "Unless": 11823, "Sheet": 22631, "Extract": 1814, "mama`s": 21252, "Fri.": 22184, "Apparently": 3874, "kung": 29839, "capitalizing": 16944, "Dealt": 27994, "Katherinator": 12616, "Settlements": 23536, "budget": 10266, "journalists": 19263, "coquette": 3935, "Squeege": 28101, "Masonic": 25534, "mid-afternoon": 29829, "seasonally": 16277, "winded": 32033, "facet": 7308, "mistake": 9302, "Store": 16604, "Zahav": 29984, "lou": 22770, "genotype": 9584, "industrial": 16395, "nothing": 6573, "posed": 3088, "Lindsay": 2430, "stay": 5116, "multiplier": 8102, "join": 10405, "units": 1048, "smithjones@ev1.net": 22932, "balaclava": 32384, "Oilskin": 32701, "combatants": 25770, "obstinate": 31747, "Friedrichstrasse": 13191, "draped": 19940, "Surprisingly": 7940, "Ensure": 14483, "regionally": 10885, "cretins": 23898, "south": 5433, "OVERALL": 27485, "hail": 24249, "Inclusive": 824, "aromas": 16188, "Snowdon": 4180, "cinema": 25682, "mɔʁo": 5362, "JAMES": 11494, "triumph": 9154, "pea": 27155, "podium": 25198, "foil": 18408, "immobility": 17805, "PLEASE": 24928, "anyone's": 27771, "incorporate": 783, "donor": 13275, "Aesthetics": 28722, "selection": 1218, "sugary": 18420, "resumes": 26461, "Insert": 32259, "implicate": 19456, "startlingly": 31278, "dinosaurs": 2740, "petition": 13254, "200": 12145, "transnational": 8104, "shaper": 30697, "wondering": 6203, "Dewhurst": 21787, "Honey": 15882, "interacting": 13667, "CHURCH": 24450, "mustn't": 30572, "https://osf.io": 2422, "Cross-clause": 1149, "Pools": 8929, "spears": 31320, "345-3436": 22334, "exalted": 6620, "Regardless": 18314, "secessionist": 19531, "Agra": 27396, "GPL": 10816, "50,000th": 10752, "lesion": 18720, "half-a-crown": 31811, "substituting": 17897, "Guadeloupe's": 16714, "cousin": 3920, "Marriott’s": 15111, "lo9nger": 27988, "column": 10484, "storm": 12255, "grammatical": 5693, "safety": 2103, "dollar": 6102, "Fallon": 13646, "Chaos": 3473, "Hannah": 22275, "universals": 15425, "therapies": 28021, "locked": 7061, "rested": 23699, "Sha'ananim": 30622, "DA": 23721, "crocheting": 9196, "swear": 11957, "wht": 26214, "244": 17457, "215,000": 25828, "physician": 3394, "Hospital": 12943, "attending": 5445, "Perry@ENRON_DEVELOPMENT": 23463, "Mussolini-jaw": 31901, "conquests": 30945, "Tha": 32435, "roughhouse": 27693, "LA.": 23216, "S65": 14298, "PRESS": 10103, "Warnings": 18235, "Nepool": 21589, "Interestingly": 2830, "Compounding": 25834, "Installing": 30166, "mixture": 10492, "Belle": 4150, "incredible": 15184, "Oslo": 18887, "2300": 29887, "implications": 164, "nieces": 31622, "Emma": 15125, "incurred": 22730, "Mohaqeq": 19728, "price": 2168, "phrase": 985, "CSS": 30092, "edited": 4430, "anniversary": 13309, "enthusiastic": 23844, "Springfield": 28279, "tugs": 30811, "Argument": 7551, "Regarding": 10512, "Heaven": 20413, "SO": 27948, "Finn": 4158, "referencing": 10241, "Mansoor": 23633, "yacks": 9903, "Smokers": 29099, "Piccadilly": 25590, "fewest": 30686, "symphony": 30861, "quadrant": 7343, "commercialish": 10977, "Blessings": 24751, "Michele": 20165, "Britannia": 17531, "testing": 1980, "earthquakes": 9777, "tractor": 21858, "landing": 18225, "http://lllreptile.com/store/catalog/reptile-supplies/uvb-fluorescent-lights-mercury-vapor-bulbs/-/zoo-med-24-repti-sun-100-fluorescent-bulb/": 27751, "divans": 31873, "cere": 27793, "UVA": 27736, "innkeepers": 29968, "Catholicism": 5431, "crafted": 15328, "D.": 3976, "There’s": 7833, "3:15": 29597, "remoras": 32647, "riches": 16406, "RUY": 25446, "unloaded": 30814, "Nationwide": 26012, "Africans": 30600, "1989": 2394, "onto": 4005, "Rees": 21755, "2013": 263, "sub-categories": 3085, "Happen": 9794, "emails": 11293, "(a)": 2455, "Balasingham": 19028, "Electric": 22860, "23.8": 26086, "Comfortable": 29329, "combo": 29837, "laude": 5562, "Swedish": 13086, "accelerating": 14499, "Located": 16818, ":P": 27805, "catalogue": 28518, "encompassing": 485, "Fung": 12417, "Sidenote": 26559, "cloyingly": 31710, "CLASS": 28688, "1660": 4323, "charcoal": 8989, "salsa": 16671, "Cats": 13577, "Horizon": 19585, "Direct": 22129, "inappropriately": 27461, "Tsar": 4284, "1836": 14772, "Oliveira": 5525, "item": 1793, "metabolome": 10625, "Mac": 16063, "attainable": 14540, "List": 16853, "reprimands": 5954, "sonic": 28388, "Pueblo": 15421, "Fries": 26333, "archeologist": 30335, "Dictator": 24735, "1572": 25490, "dandy": 25539, "mounds": 26188, "irrespective": 22642, "stepped": 8646, "Drake": 30937, "thermometer": 27770, "refreshed": 30688, "Terre": 16638, "angered": 30928, "likened": 11158, "possess": 6629, "salads": 28348, "approachable": 28935, "hurrying": 32638, "altitude": 5573, "infiltrate": 27718, "sock": 18311, "madea": 23916, "via": 10829, "water-men": 32536, "southward": 15285, "turns": 8876, "badly": 7936, "performer": 13676, "Case": 703, "belittling": 29859, "academics": 1420, "incipient": 32619, "Lewis": 11270, "HAS": 21263, "properties": 217, "innovations": 13986, "riding": 9069, "less": 1172, "o-": 6792, "prickly": 26367, "ALLOWANCE": 27030, "caucasians": 27260, "womenfolk": 30573, "overcome": 7407, "prodigious": 9947, "jog": 26201, "Dude": 28832, "authorized": 19419, "survival": 7835, "cosy": 31871, "alerts": 7793, "TroubleFunk": 20280, "link": 1398, "doctorate": 3686, "remedy": 31398, "laughter": 28678, "Simpson": 10741, "charter": 5578, "Bats": 4777, "references": 2388, "Satisfied": 21547, "VC": 27710, "OMG": 29000, "268": 24484, "Justified": 15180, "Quidditch": 18282, "cockatiel's": 26811, "petri": 10306, "Fury": 30710, "Ballet": 17655, "stricken": 25215, "giddy": 23930, "Causey": 21331, "seconds": 4025, "ladder": 9347, "Bowie": 14785, "Khalid": 18754, "Skilling": 23153, "SUNY": 8535, "czar": 13839, "b/t": 23872, "mangroves": 31141, "appeared": 3761, "Labadee": 27500, "laurels": 22431, "element": 2791, "dracaena": 17188, "wildcard": 30038, "searchability": 13742, "Unity": 14519, "Antonio": 5707, "there's": 6332, "recalculation": 22623, "Sir": 24354, "Peking": 29231, "Transition": 21049, "explored": 2993, "freshman": 4821, "Ridiculousness": 5289, "serving": 14270, "Theyre": 26373, "coupon": 28244, "CNN": 18822, "ROM": 26168, "Paris": 3166, "organised": 28211, "Cindy": 20914, "171": 4790, "trademark": 4665, "4A": 4823, "night": 2077, "witness": 7166, "disgrace": 27767, "aunte": 29121, "LFTD": 28082, "lexicon": 3819, "Nano": 26676, "cookbook": 28867, "convention": 12527, "4.1.": 1935, "chandelier": 19855, "crawled": 13821, "Judy": 6423, "CHERNOBYL": 18658, "malls": 16962, "22,600": 26023, "championship": 4926, "shrouds": 9111, "Even": 6575, "nearby": 15567, "Testing": 2227, "IF": 11829, "appease": 5038, "internal": 12709, "spew": 30448, "captained": 11003, "geometry": 2310, "stream": 9379, "reactionaries": 30597, "ideological": 13240, "televisions": 17148, "goals": 214, "Confirmed": 21561, "Seventeen": 9558, "googled": 28533, "Adorn": 28151, "Mexico": 5570, "107's": 7452, "rim": 9477, "outs": 15939, "ENA": 21210, ">:(": 27359, "brinkmanship": 18865, "leaderships": 19315, "Bryant": 20714, "molding": 26411, "righty": 6814, "undersecretary": 13227, "n'": 5282, "Antigua": 16473, "Excuse": 6767, "textile": 16739, "iron": 6394, "exporting": 30110, "contrasted": 19285, "departing": 16452, "Hee-Chan's": 13089, "aquarist's": 27891, "ATM": 16500, "homeowners": 11530, "wanted": 3186, "stone": 6849, "repaid": 11543, "frustrated": 19061, "metastasis": 25643, "analyzes": 3068, "arthritis": 21271, "uncle's": 20769, "cons": 26147, "flecked": 9044, "hotter": 6223, "objectivity": 15149, "`": 19430, "situation": 2214, "captured": 11381, "bloodying": 27675, "Sighing": 32588, "awful": 15803, "distractors": 1593, "slang": 24205, "Generals": 4436, "Packard": 24171, "sufficient": 1054, "infrequently": 30804, "expectation": 10600, "L2": 2387, "emerging": 2991, "Lynn": 19425, "tress": 23961, "previous-version": 30064, "1596": 16788, "wax": 5195, "Leonardo": 6182, "convert": 7901, "raided": 12712, "ingredient": 20434, "rifles": 19599, "patiently": 31037, "Khincasnonbever": 18092, "theater": 7479, "wields": 18934, "popularity": 5969, "National": 2584, "inappropriate": 17385, "suffrage": 7995, "prequel": 4202, "anti-American": 18878, "cigarettes": 30313, "Outcome": 30208, "methodical": 28726, "mountaintop": 25943, "steering": 30024, "0491": 21892, "strengthening": 13914, "efficiently": 19773, "biolab": 20786, "Public": 1389, "lurks": 7682, "effective": 399, "financed": 11641, "invitation": 3481, "sauces": 29495, "conducted": 434, "Restructuring": 22415, "Voice": 10713, "Mum": 11758, "either": 3909, "we’ve": 8433, "shaky": 28312, "96": 4715, "toys'": 5318, "vitality": 31117, "T1": 22128, "safely": 13000, "double": 987, "irene": 26139, "DEALER": 29273, "chasms": 25174, ".265": 4785, "break": 1127, "Lakoff": 3746, "Grove": 24951, "carrot": 26758, "Oh": 6145, "deals": 13058, "haste": 24723, "containers": 17725, "amiable": 30552, "affords": 22492, "wherein": 18731, "Whats": 26535, "-----------------------------------------------------------------------": 25344, "reckless": 12850, "spines": 26356, "charm": 16950, "painless": 29178, "highly": 934, "WISE": 2651, "accomplishment": 22429, "self-transformation": 32830, "Silent": 5738, "jihadist": 20663, "Testament": 5586, "Harvesting": 17702, "water-coloured": 31942, "bedlam": 25186, "Soren": 13926, "303-294-4499": 23862, "FOOD": 26242, "glowstick": 18009, "dashboard": 32182, "Long": 275, "Frick": 30248, "Mayan": 15402, "There're": 32002, "worried": 6741, "rapporteur": 31377, "violate": 23690, "Mandel": 16669, "lawmakers": 20019, "doorbell": 16010, "inconclusive": 31041, "kennels": 28847, "Chao": 3344, "stylistic": 983, "NEA": 24512, "Nights": 5369, "elevator": 12562, "Aakrosh": 19636, "noiseless": 26431, "1-877-331-6867": 22407, "enlace": 1180, "unpaid": 19857, "Forge": 3570, "overcoming": 18249, "tick": 26197, "returns": 15529, "lightning": 17096, "Duke": 13336, "Jaffna": 18988, "surf": 31092, "instantly": 19149, "White": 4950, "nomenclature": 20465, "dueled": 21836, "debutants": 13062, "944-3737": 16559, "hairstylist": 29008, "ensure": 796, "06:05": 22061, "Geofence": 2326, "Rolled": 23004, "Calif": 27273, "absent": 14315, "XML-like": 30089, "Anthony": 4230, "rebuttal": 7331, "woollens": 32382, "plaintiffs'": 7534, "divinely": 6603, "Fox": 5726, "Essentially": 1850, "mare": 27979, "Kurtz": 31269, "shocked": 3062, "shortened": 18326, "segments": 27240, "Dostoyevsky": 10926, "Galleon": 32324, "Gigaloader": 12721, "traightening": 12023, "commendable": 11606, "immortal": 17981, "big": 6418, "6.2.1": 23477, "plover": 25190, "1.12": 1658, "incite": 20539, "advisor": 4283, "reassemble": 18162, "SPLOID.com": 20086, "Cullen": 21477, "ruler": 26836, "switches": 9352, "Vignieri": 2474, "notified": 4045, "mmmm": 29472, "Fei": 24787, "1729": 14895, "Hannibal": 11203, "exuberant": 12630, "Faaborg": 17239, "educate": 10897, "NT": 28184, "meantime": 13057, "Broke": 21131, "LW": 22108, "saber-toothed": 32200, "uno": 24821, "pitfalls": 29563, "shoved": 32325, "Faithful": 25547, "bitterly": 32063, "Invictus": 6566, "temporary": 3211, "VIII": 25584, "API": 23406, "Bohai": 2720, "laced": 10226, "Bass": 14113, "Several": 4664, "chimed": 8660, "Indonesians": 26088, "translated": 1132, "Armenia": 12096, "Jeanne's": 5452, "crawls": 27673, "Barnes": 7820, "ResearchGate": 452, "1775": 22826, "sessions": 7750, "Gray": 21080, "Coronas": 26917, "journeys": 30331, "flick": 9018, "effectiveness": 648, "68.4": 25908, "Motor": 21828, "smooth": 7771, "completed": 130, "BRING": 29674, "Has": 8695, "execute": 7589, "Attachment": 23302, "Foreigner's": 26438, "201-224-7900": 16603, "rails": 17505, "33,000": 15683, "improvements": 1708, "Learn": 17624, "Huge": 20469, "Hu's": 3403, "quitted": 31630, "curve": 4488, "Ispat": 22259, "went": 3205, "symphonies": 32858, "sexuality": 8486, "Website": 21671, "Virginia": 21148, "416-865-3704": 21301, "bulge": 32903, "covariation": 13472, "POSSIBLE": 29277, "EIR": 19635, "obsession": 12716, "mend": 31009, "writer": 4613, "1561": 25450, "punctuation": 14832, "empiricists": 14942, "recap": 16238, "seems": 2081, "Months": 32408, "turista": 16441, "Indian": 9991, "chimney": 9035, "LOVED": 28776, "Architects": 4484, "Otago": 27661, "pinch": 8157, "church's": 12807, "links": 13761, "Soldiers": 20332, "Messina": 11013, "tubes": 3302, "pucker": 10538, "Income": 19484, "skimmer": 26670, "25th": 15635, "Contains": 16854, "Armenians": 16754, "Lots": 9872, "Surrealist": 10117, "3750": 1039, "Passcode": 23081, "Updating": 22548, "Bigger": 24008, "http://www.country-couples.co.uk/datingtips/basic-travel-allowance-bta-dating-scam/": 27016, "WAS": 27717, "prescient": 8271, "anew": 14046, "Hams": 28362, "eggs": 17830, "DONT": 28183, "Luca": 13204, "according": 4410, "tale": 13606, "gyroscope": 30487, "manager": 5299, "Customer": 15118, "collage": 27514, "'": 3299, "boy": 5765, "stretches": 32807, "Hannon": 22935, "frontiersman": 14786, "Sunnis": 18803, "emergencies": 27940, "Lee's": 16581, "refilled": 31786, "co-signing": 22066, "Sullivan": 22824, "permitted": 7228, "endless": 15016, "sounding": 15796, "people": 33, "rightfully": 16394, "liter": 18023, "neo-Nazi": 20010, "deny": 7258, "Monroe": 17982, "251": 12861, "heroes": 14147, "buy": 3726, "newspapers": 3405, "virtually": 4375, "Verch": 8014, "Pace": 13289, "Mustansiriyah": 18519, "contributing": 11107, "Vengeance": 4220, "Lipids": 27848, "shuddering": 32664, "aspect": 2290, "whirred": 32478, "mitigate": 22715, "crab": 10032, "creature": 10033, "cradled": 15308, "jobsite": 23166, "whasssup": 22750, "uncomfortable": 30742, "Menzies": 4359, "Forces": 9244, "spinoff": 12690, "drops": 8204, "claims": 1065, "typology": 1187, "Well-formed": 30128, "Signature": 16209, "Rt": 28191, "Service": 13504, "Buddhist": 3681, "microscopically": 11303, "spinach": 27773, "bisquits": 32755, "dangling": 30474, "Syntactic": 1094, "soapy": 32095, "re-purposing": 14503, "assembly": 24816, "Fish": 25036, "Sequences": 1854, "camera": 5539, "donation": 13307, "GIS": 2276, "soaked": 17747, "law": 3320, "46": 13485, "detonated": 18507, "Response": 18769, "1669": 16839, "Meurtres": 5393, "Pashtun": 19695, "neighbourly": 13917, "panel": 5899, "avoided": 10229, "Tejanos": 14775, "Del": 26557, "reve-": 7159, "iterations": 30108, "Mirandela": 6564, "FRENCH": 11895, "Bin": 18738, "delvery": 21438, "Amore": 28811, "LME": 21660, "谿山": 14878, "scheme": 13012, "here’s": 7982, "silkies": 27128, "Indians": 4888, "generous": 9803, "Gandhi": 15044, "http://www.infoukes.com/history/chornobyl/elg/": 18708, "MP3": 24600, "Rabbits": 27288, "reposted": 12207, "grandmas": 26270, "Taylor": 3274, "substances": 18032, "sexy": 17994, "prayers": 10125, "champion": 4795, "tent": 17308, "RAC": 22702, "grilles": 32017, "Italian": 3306, "fives": 25508, "longer": 2835, "worlds": 11264, "Spiritual": 23623, "ConEd": 22254, "broadband": 26315, "Abstract": 2068, "cluttered": 30423, "Tauris": 18967, "consistency": 5694, "Still": 8906, "scramblers": 9571, "slighter": 31921, "IMU": 13220, "dinasaurs": 26144, "Private": 22681, "Abdul": 18629, "Hwy": 17461, "surrender": 3581, "Haley": 24432, "overwhelming": 11527, "Bugs": 29731, "Janis": 5543, "nicely": 6525, "tells": 6427, "Nails": 27961, "Lennon's": 25600, "hut": 31275, "coded": 3677, "climbing": 8954, "Briefing": 14580, "phase": 3693, "Odd": 31076, "1970s": 2596, "remarkable": 7966, "06": 25340, "Dunno": 30468, "forefront": 13689, "found": 1861, "conditioner": 14640, "beef": 19006, "intrusted": 31323, "devoted": 4992, "Word": 23090, "re-secured": 24365, "Spinner": 26423, "sponsored": 11545, "Quetzalcoatl": 15358, "epistemic": 1212, "Consultation": 14767, "chemistry": 10622, "Detective": 30393, "photographers": 12948, "memoirs": 3253, "specialists": 13764, "reading": 1026, "Tour": 10850, "Then": 1081, "jump": 13680, "paved": 17500, "downhill": 21352, "Sana'a": 17167, "713/853-6197": 22959, "http://loveallpeople.org/usconstitutiona.txt": 24710, "1540s": 16966, "reeks": 29108, "Phrase": 1137, "Universidad": 962, "legend": 4003, "RE": 21783, "meteorological": 13962, "spree": 18586, "quest": 1604, "rating": 24494, "refineries": 25242, "liquidweb.com": 28880, "unexplained": 32434, "amusement": 15590, "Flyers": 29413, "should've": 14655, "yet": 294, "wheeler": 21899, "Preseason": 22942, "info": 7724, "defiance": 9606, "pilgrimages": 12283, "withdrawing": 24606, "Morgan": 2522, "10.1": 18445, "florescent": 10635, "Dorothy": 32606, "Oddy": 31475, "Scot": 28087, "they're": 6217, "PROCEED": 23035, "diagrams": 15601, "Michael.McDermott@spectrongroup.com": 21234, "orthodontist": 24114, "hesitation": 11064, "cliffy": 16651, "Rosenberg": 30849, "brown-pink": 32642, "Ramon": 9761, "RETURNED": 29855, "play": 338, "european": 26574, "Payne": 23172, "Suffolk": 5205, "pictured": 28517, "Barger": 15493, "202": 11506, "www.kaffeeeis.co.nz": 26970, "gruffly": 32297, "Weatherspoon": 13329, "...": 5368, "solely": 1454, "Scientologist": 12692, "Industry’s": 15135, "Dennis": 5772, "kidnapped": 18501, "fluff": 18386, "Rugova": 19137, "exile": 30999, "aired": 32502, "Anna": 5471, "desirability": 3236, "Dudley": 24668, "family’s": 15033, "The": 53, "hilarious": 9152, "Brooklyn": 10507, "seaman's": 30798, "upland": 25189, "cenobitic": 5915, "marketed": 6845, "modus": 8311, "Swede": 31149, "1679": 4353, "promptly": 28068, "landlord": 11997, "1791": 3517, "particles": 11335, "Legislative": 12460, "Quinto": 13367, "Martínez": 959, "Gillies": 29219, "B.": 7530, "coffee": 8752, "grounds": 11947, "Got": 6507, "alarming": 14236, "Versailles": 22191, "rosy": 25180, "HOME": 29672, "waits": 12756, "automated": 11342, "Companies": 21127, "promote": 786, "Television": 4172, "Quaddaffi": 19409, "anxiety": 9231, "powder": 17848, "How's": 22120, "storeys": 32191, "BROKERS": 28911, "ARES": 11347, "arched": 9402, "Shorts": 17383, "gloriously": 31060, "Gothic": 32491, "critics": 4749, "FTU's": 12406, "CIA": 19277, "betrayed": 14051, "04:50": 23256, "carnival": 27486, "distally": 2875, "rainbow": 18421, "cottages": 31577, "KB": 28076, "Wyatt": 4796, "CA": 11877, "uniformity": 14950, "Stai-": 6462, "Beaumarchais": 3549, "collaborated": 3426, "portrait": 3573, "Sonnets": 949, "OBL": 20665, "cutter": 26049, "Maclaurin": 3255, "plurals": 18074, "CONFIDENTIAL": 24344, "good-naturedly": 31999, "conflict": 1459, "ENOUGH": 29663, "presumed": 1790, "Jew": 5165, "perfectionism": 32955, "Finley": 4157, "friend": 3202, "molded": 17869, "Much": 3937, "crap": 11822, "conquest": 20534, "insensitive": 15189, "sank": 9349, "http://www.21stcenturysciencetech.com/articles/chernobyl.html": 18717, "Worker": 19825, "emit": 27744, "prawns": 27920, "Pred": 7040, "idk": 27003, "simulated": 32834, "elite": 509, "http://www.cic.gc.ca/english/immigrate/index.asp": 27375, "maintenance": 10703, "Hermeticism": 20221, "criteria": 1053, "experimenting": 6901, "fathers": 11175, "ebullient": 18120, "mailed": 20834, "PEREZ": 25394, "ringing": 30226, "airplane": 3126, "charity": 7953, "needless": 11656, "tougher": 31368, "liberalize": 30662, "Henderson's": 23083, "prices": 11635, "mod": 26170, "Solicitor": 7281, "Nixon's": 19832, "Brit": 4505, "discussing": 13688, "Nam": 24618, "Spencer’s": 8827, "unarguable": 27191, "t": 1682, "gpa": 26304, "slenderness": 30490, "205": 26061, "indifferent": 23723, "Domenico": 5083, "peoples": 10072, "BT": 29775, "Brazil": 12580, "convening": 14220, "Origination": 21709, "pre-season": 8069, "swell": 10011, "credentialing": 1447, "badges": 31673, "RDBMS": 24201, "transferred": 12817, "Binalshibh": 20640, "muffin": 17867, "bares": 9527, "nosy": 17626, "08:50:01": 22963, "8": 503, "prevents": 10620, "Barbour": 24433, "Grande": 14723, "pursuing": 20807, "node": 19366, "composed": 16646, "payments": 7853, "prop": 26882, "proceedings": 23786, "redvepco.doc": 21720, "lips": 9422, "predictions": 25156, "GROUPS": 24983, "speaks": 1286, "nurses": 28336, "Poverty": 20012, "1200": 15339, "Extensive": 28204, "Deal": 23555, "unnecessarily": 11609, "Biewener": 2840, "Operators": 2226, "hastily": 12873, "École": 3837, "paws": 27701, "further": 2516, "unimaginative": 30735, "stinking": 9498, "GMAT": 22674, "paedophilia": 25710, "Alma": 5344, "regulation": 1585, "consulting": 22898, "unreachable": 12736, "independence": 14730, "monument": 12664, "Denver": 17498, "Kandahar": 19642, "Europeans": 31965, "pills": 9188, "Muggle": 18281, "A&K": 23826, "wikiHow": 10747, "You've": 25307, "newest": 12787, "communicating": 22847, "interpretative": 7238, "shortstop": 4798, "Foreign": 4417, "Mobilising": 24438, "Marsden": 2416, "systems": 1444, "lifehood": 12353, "openly": 5953, "radiometer": 2609, "grip": 15964, "sleepless": 31036, "activate": 31394, "Vogelaviatiolap": 18071, "evolution": 2863, "taste": 12355, "regimes": 2789, "patients'": 3297, "Crisp": 16247, "Galvin": 24193, "Mohammed": 4519, "------------------------------------------------------------------": 25562, "Bea": 28484, "CSA": 22224, "grayish-whitish": 31096, "620-294-4000": 24014, "forty-eight": 31948, "yoga": 9772, "minors": 4889, "Vaughn's": 4200, "thunderous": 8927, "toast": 16167, "momentous": 14426, "now": 1409, "FREE": 28339, "vine": 31495, "PS4": 26785, "Marly": 22483, "wed": 25296, "Minority": 8448, "Qasim": 4544, "parties": 11788, "rolling": 17412, "Centres": 26029, "unknown": 4019, "Ballerina": 28233, "prep": 11889, "clippings": 3974, "Fellow": 3224, "-----": 24322, "Testimony": 24746, "150": 15106, "comprised": 16509, "completion": 11423, "exaggerated": 4006, "politicians": 12360, "adjective": 1144, "Rachel": 9799, "crowded": 12892, "Ontario": 12598, "declare": 13717, "certain": 6555, "divy": 21900, "Farms": 18898, "vented": 22776, "shoulder": 6372, "Cheaper": 5748, "circulate": 21935, "McAuliffe": 19227, "penned": 13643, "takes": 73, "propping": 26886, "Massachusetts": 3492, "Colton": 5850, "03/28/2001": 23060, "burrow": 10668, "Fuad": 12148, "bush's": 20259, "Banshee": 32349, "entertain": 32778, "31,000": 25084, "cache": 19880, "Alford": 23766, "psu": 2617, "boundaries": 14071, "schtick": 25237, "Accident": 18090, "Pettigrews": 31988, "09:45": 22481, "infused": 7511, "hare": 17331, "signal": 14957, "Thailand's": 12181, "tablet": 26685, "unjustified": 15190, "Cost": 10055, "cannon": 27203, "HARRIS’": 14357, "21.0": 2123, "reach": 3864, "Muslim": 7243, "sunrise": 17100, "fully": 295, "first-class": 31310, "mourir": 4059, "HAMSTERS": 26567, "investigate": 314, "AVOID": 29229, "Estonia": 12133, "respect": 898, "0417": 22248, "retiring": 19423, "hairnets": 31688, "Thamir": 19332, "produced": 2209, "reviewing": 14531, "coupling": 32728, "inferences": 2892, "relies": 11306, "sunflower": 17863, "Microbiologist": 20744, "pediatrician": 6764, "lover": 28442, "Tomb": 30400, "regress": 1221, "instance": 456, "Immortal": 5505, "England": 4327, "Harari": 20348, "thankful": 21741, "pawing": 27691, "llo": 18108, "Auchintoul": 4456, "synodis": 5115, "EPA": 25935, "accenting": 32694, "paradoxically": 27818, "halls": 12619, "ew": 6829, "Tear": 24705, "Manmohan": 19166, "sadness": 14175, "Englishman's": 31591, "hurt": 7014, ";-)": 27467, "communicator": 29815, "ambitions": 20541, "palaces": 16814, "pro-establishment": 12408, "jeopardy": 31268, "SAT": 15648, "doubt": 7115, "From": 1713, "Mid": 23531, "bumfluff": 32935, "LATER": 11934, "Confidential": 23275, "FrameNet": 3796, "Do": 46, "Nesf": 16730, "resourceful": 32436, "Guards": 18918, "supervisor": 19969, "thus": 514, "Stars": 28131, "3.4": 14805, "U.S.": 3515, "forthcoming": 13056, "ecology": 25046, "procreating": 23899, "PlayStation": 12557, "carcass": 31174, "Sport": 5209, "conferences": 12647, "science": 411, "hosting": 12697, "iceberg": 8437, "lions": 25085, "birthright": 7952, "collective": 13964, "łodzianie": 16886, "Inferior": 17532, "ethnicity": 10864, "chnages": 23559, "4chan": 12691, "supports": 5873, "shed": 529, "probabition": 11721, "#writinglife": 7664, "cenote": 17004, "1st": 4178, "Linguistic": 3382, "battle": 5903, "factory": 10462, "trek": 17287, "Peters": 21279, "crum": 11730, "Frozen": 8004, "male": 5638, "adequately": 11640, "astride": 25775, "Truffaut": 5413, "someone’s": 2076, "Ichiyo": 4652, "possibilities": 12007, "basso": 30461, "thought-nourishing": 30611, "apart": 6006, "Dog’s": 9797, "donate": 10785, "HR": 21370, "burgers": 23244, "producing": 10802, "Syracuse": 11683, "homogeneous": 14933, "cascade": 8748, "explosion": 17927, "My": 3381, "arts": 246, "U.N.": 12228, "guiltily": 30583, "MARK": 24781, "Nava": 4952, "9.95": 21923, "Strzalka": 29913, "flowered": 25117, "neoconservative": 18882, "Deer": 17131, "queries": 29311, "’re": 7760, "duplicate": 22608, "shipyard": 19609, "inception": 3047, "virulent": 13810, "plus": 6041, "Customs": 11183, "precious": 29624, "1087": 15242, "swirling": 9400, "biceps": 9512, "pantheons": 15356, "co-ordination": 22620, "Fill": 17726, "massive": 12798, "Mart": 25854, "shaker": 30696, "relieved": 5067, "Electrical": 2059, "FY04": 24473, "Framework": 2421, "fame": 3615, "touching": 5257, "Scorpio": 25297, "Seince": 27603, "delayed": 7396, "reccommend": 28360, "peppers": 15774, "discount": 1435, "Sailing": 25807, "Deixis": 3735, "Levantine": 30730, "directed": 5407, "emotion": 67, "recognizable": 15042, "Immigration": 19348, "stub": 20103, "snarl": 30828, "Set": 16316, "Europass": 27531, "becca": 26357, "http://www.amazon.ca/exec/obidos/ASIN/0915765381/701-3377456-8181939": 19389, "narrow": 14082, "resistance": 13186, "Awsat": 18557, "MMPI": 10734, "Sahaf": 19290, "Expansion": 21048, "n": 1662, "EDGE": 10576, "draft": 11446, "adults": 8485, "admins": 10772, "best": 3728, "elsewhere": 7613, "Browns": 16433, "Discount": 28895, "drawing": 12069, "Stephanie": 22987, "TOWNSHIP": 29955, "inordinate": 30741, "He’s": 8696, "genders": 18076, "expectations": 10904, "Granger": 29911, "scoring": 13075, "Fifteen": 18677, "fabulous": 26906, "warning": 4946, "Lisa": 23756, "trap": 26255, "Third": 7357, "soya": 32829, "Breeding": 27839, "Dumb": 28612, "fro": 8941, "Stendhal's": 30764, "suburb": 10995, "communicative": 29882, "compel": 18895, "Tim": 6995, "affected": 2361, "Champs": 16981, "inks": 18942, "Nordau": 20195, "O'Toole": 5817, "shameful": 24681, "irons": 27585, "Plate": 23005, "bounce": 20995, "christian": 20314, "assembled": 520, "Goldmann": 22302, "feeble": 25711, "1932": 4529, "Hope": 12130, "historical": 1726, "limbo": 29895, "glaring": 19506, "interception": 19592, "OOTD": 15749, "tried": 3280, "Scott": 7542, "non-nylon": 32512, "BC": 22537, "Offers": 23280, "whiteboard": 27933, "unworthy": 14062, "leaders": 4039, "Associates": 22836, "Machines": 14196, "foresee": 19495, "09:52": 23863, "wan": 6366, "Kenneth": 7842, "town": 4070, "impressed": 4943, "emailed": 10909, "Workmanship": 29963, "penines": 26181, "Bing": 10552, "batches": 8222, "Inad": 19326, "military": 3510, "corridors": 13906, "Malbec": 16242, "@W.a.b.b.y": 27647, "Corell": 25154, "applause": 30607, "followup": 28338, "Hermitage": 16215, "seeking": 4365, "prehistoric": 30338, "CEO": 13044, "84838389593": 27553, "Monday": 11106, "Trust": 28230, "Mulberry": 28771, "PivotTable": 30069, "freight": 23018, "mozzarella": 17771, "Johnnie": 12550, "vast": 629, "imagined": 8640, "AMAZINGLY": 28766, "waiter": 27507, "PhD": 555, "Turkmenistan": 16496, "asshole": 8547, "L.": 3790, "Seller's": 23020, "Cyrus": 5285, "Yeoncheon": 12882, "Kingston": 29257, "adaptation": 2957, "Bethesda": 29425, "***": 19297, "_______": 22979, "Overhead": 9990, "Delivery": 11944, "Joan": 5837, "La": 5474, "hubs": 12934, "Berkeley's": 3660, "3611": 21886, "hardness": 27880, "accepting": 17616, "be": 281, "sweater": 6483, "hoodie": 27430, "peat": 17730, "soaking": 26412, "advantages": 10776, "fecal": 10494, "civet": 24872, "Noise": 26416, "Ironically": 17630, "Zero": 7127, "funds": 5869, "Petronios": 5990, "defamation": 20559, "biking": 27555, "keeps": 9552, "1574": 25492, "justified": 20531, "variety": 2966, "Billy": 22966, "Peace": 11174, "apartments": 28775, "attempting": 2003, "dressers": 17353, "built": 112, "worse": 6753, "Newport": 24798, "soared": 16891, "Danly": 4708, "counties": 12924, "household": 2085, "centered": 5492, "Lines": 17449, "Drive": 22186, "graduated": 4818, "mathematical": 3229, "ought": 14973, "carters’": 10039, "stuffs": 28247, "unhappily": 14072, "Outer": 17567, "happiness": 24632, "Madison": 30254, "occupy": 7582, "stole": 29726, "Foulkesstraat": 24958, "playful": 17983, "cancelled": 11490, "reproduced": 2463, "04:18": 21207, "Levi`s": 21261, "colour": 221, "HECS": 2116, "today": 2146, "over-simplifying": 27118, "Waste": 8048, "unresponsive": 26250, "recovered": 3578, "sneak": 18172, "Lotus": 24178, "Cay": 27498, "crate": 27537, "angrily": 31985, "Stepsister": 4089, "domestication": 15293, "1.": 1774, "Bard": 13693, "beams": 15546, "trilby": 32634, "fixations": 205, "888.916.7184": 23321, "Bumrungrad": 26644, "conclude": 1714, "Nation’s": 14334, "Wolfowitz": 25975, "transcend": 8439, "|": 22018, "mastery": 8479, "hypnotized": 17794, "Far": 10023, "Certeau’s": 3093, "rough": 2667, "100,000": 13511, "Scallops": 29487, "liberty": 3593, "contact": 7167, "Chan": 12402, "Westfield": 28190, "www.veraakulov.com": 28937, "calculus": 3150, "cultivating": 13276, "salesperson": 28561, "reassure": 26498, "proceeding": 7554, "Angels": 17547, "62nd": 13080, "drawstring": 17675, "coherence": 32596, "realms": 8180, "delivers": 28963, "retailing": 31750, "helpful": 1061, "hearings": 11574, "respond": 2009, "catch": 4945, "Justifies": 6596, "SSRIs": 13582, "Sinica": 3423, "nodes": 13942, "Phillip": 14495, "Perseverance": 15240, "highlands": 15365, "14th": 16888, "nut": 17900, "repeatable": 22615, "Cambridge": 3491, "Targets": 26092, "gracious": 24373, "3,202.61": 23812, "Bottle": 6820, "Agent": 10913, "Mail": 12700, "Guadeloupe": 16627, "713/345-7942": 22297, "Parisians": 27006, "Cards": 29433, "indolence": 32929, "rooting": 19295, "Cypriots": 31355, "ESSG": 22148, "affects": 8497, "professionalism": 28073, "how": 52, "Trader": 29200, "Wolstein": 16435, "Xmas": 21999, "rob": 4947, "Blair": 9341, "legato": 11283, "Kaufman": 21385, "Ummmm": 27977, "References": 30193, "women": 4719, "IRIS": 2409, "settle": 19549, "herein": 10111, "ornithology": 17220, "resurrect": 23718, "bearded": 26354, "Blank": 31446, "reorganization": 2864, "mission": 4335, "Southern": 5584, "#logos": 7822, "Betty’s": 8639, "teaspoons": 17847, "caches": 19575, "96/23": 31366, "16.3": 26981, "queue": 10656, "Buying": 26399, "haphazardly": 32018, "boyfriend's": 29517, "grand": 12331, "humiliation": 18639, "Freemasonry": 3633, "ceremoniously": 12898, "Basing": 18124, "fused": 29070, "conservatives": 7845, "outcast": 20414, "To": 1175, "bilateral": 13898, "submovements": 30282, "gently": 8777, "theories": 3701, "2,000": 13935, "Preamble": 25191, "prepayment": 23615, "Ruth": 11806, "Learning": 14988, "OR": 11848, "Problems": 30678, "snooty": 27090, "ld2d-#69366-1.DOC": 22432, "consequence": 3328, "gangster's": 5399, "state's": 20014, "dance": 5254, "posters": 12704, "King's": 4203, "morbidly": 32943, "Supporters": 24663, "http://www.laweekly.com/general/features/satan-loves-you/13454/": 20092, "Naji": 19264, "Janell's": 23588, "Hohokam": 17060, "replications": 2512, "Approx": 29848, "somebody": 6352, "Fostering": 27448, "Coffman": 23767, "Rover": 28107, "lecture": 6367, "moisture": 2572, "Trouble": 19507, "Strategic": 25760, "dings": 27867, "incrustation": 10016, "Severin": 11457, "Valeska": 12803, "chromatograph": 23640, "edging": 32125, "months": 3904, "striving": 14013, "Désiré": 5424, "Ono": 25630, "lectures": 5610, "skater": 20514, "uncontaminated": 18732, "catcher": 4805, "wounded": 3574, "probability": 3119, "’": 236, "thru": 21443, "wave": 2682, "our": 166, "sice": 29132, "Park": 4938, "0.2": 2630, "moonlight": 9485, "Camille": 25127, "pretending": 14975, "temperatures": 2628, "Sussexs": 27140, "Stan's": 22936, "Netflix": 4181, "segregation": 15039, "attempts": 1443, "touristy": 16665, "Wash": 17773, "Trivial": 22093, "Shady": 29059, "Poet": 11015, "Sausage": 26350, "Killifish": 27840, "swindles": 30732, "bowed": 32121, "excluding": 20901, "musculature": 2866, "Kushnick": 23381, "Heidelberg": 3195, "Woo": 6266, "dudes": 21879, "anticipation": 31685, "Regards": 21091, "Cortese's": 5845, "García": 990, "Akashi": 19059, "willingly": 18514, "manifest": 25701, "lemons": 16205, "ski": 20490, "SOFTware": 24189, "tugged": 9063, "energetics": 2917, "dah": 6338, "agony": 14123, "wife": 3486, "Eric": 3942, "midterm": 26097, "grinning": 32166, "WNBA": 22937, "inhaler": 8855, "contacted": 7168, "clanged": 32246, "consequently": 2804, "forests": 30993, "510-642-5145": 22452, "trading": 16292, "doldrums": 8269, "LIFE": 11907, "Moriori": 16255, "wantons": 28877, "uniformed": 30559, "shop-window": 31064, "gripped": 20159, "Banczak": 21726, "Factors": 26096, "Tattoo": 28058, "semicolon": 23476, "patrol": 25784, "Considered": 19807, "rip": 13769, "tarjeta": 16439, "Hanrahan": 4911, "Joy": 21800, "uniforms": 18535, "loopy": 16086, "enigma": 31081, "ruined": 27178, "recurring": 1523, "Pygmalion": 5478, "muddying": 1281, "Sci": 8280, "humanity": 8353, "you've": 6029, "?!?!?": 20023, "armatures": 26266, "WEEKS": 27955, "Kelley": 22072, "rightly": 7270, "dec": 7647, "panorama": 16720, "mysterious": 25334, "Automotives": 30020, "Regional": 4850, "pillar": 13159, "Community": 14477, "virtue": 14844, "PRC": 21027, "matching": 21817, "sogged": 30345, "haze": 30890, "logically": 31442, "(countries|regions)": 30182, "storyworld": 2943, "ALSO": 11900, "medicine": 3190, "Tam": 12492, "Clear": 15945, "489": 26044, "psychoanalysis": 11274, "swiffer": 26280, "Demosisto's": 12457, "floating": 6258, "See": 3619, "conditions": 788, "Reine": 4015, "gigantic": 9456, "tart": 15846, "postseason": 4930, "Mécanique": 3247, "Hume": 14947, "Anwar": 20814, "belief": 8894, "brigade": 20494, "facility": 12535, "dissolve": 18454, "to's": 26701, "Today's": 7553, "Lugli": 12345, "traffickers": 14197, "Publishing": 8284, "juvenile": 27739, "BRIEF": 14913, "innocent": 9216, "Sent": 7038, "deterioration": 18683, "conceivably": 25824, "PRICES": 29660, "galloped": 9045, "configurations": 993, "palps": 10052, "haemorrhage": 25599, "clear": 2021, "DF": 22721, "dissipation": 25698, "shanties": 31949, "camps": 16284, "drills": 26835, "Perkins": 13407, "Hard": 8001, "correct": 2155, "56A": 17027, "varietal": 28964, "slid": 32152, "veritable": 25065, "Interview": 10365, "Civilized": 20433, "harangue": 30852, "Yahoo!": 10553, "El": 12226, "Nepalese": 19502, "Tiananmen": 16778, "Guaranties": 22303, "theoretically": 3820, "shavings": 16231, "Disease": 20824, "geometric": 2801, "Annex": 22230, "offering": 3019, "postdoctoral": 10238, "snotty": 31932, "---------------------------": 24672, "GA": 22459, "3-1663": 21283, "SMOKE": 28756, "Salon": 29243, "gateway": 16450, "brigades": 20669, "---------------------------------------------------------------------": 25392, "non-violent": 29746, "streetlamps": 32879, "rings": 7796, "11/08/2000": 21379, "post-war": 18909, "forethought": 8029, "PHILLY": 29945, "facilitated": 19705, "Touch": 29584, "Gawker.com": 12696, "delivered": 3736, "Securities": 22520, "sheer": 25285, "capital": 3514, "gatherings": 29224, "buyers": 25226, "public": 612, "unanimity": 31510, "reports": 11820, "Globalflash": 21312, "Quality": 8166, "style": 6553, "RASER": 11794, "Pottstown": 29947, "endeavors": 15059, "makers": 5479, "logical": 8067, "depot": 17122, "79": 19600, "retrieved": 22839, "77042-2016": 22901, "surge": 12784, "dependent": 19560, "20's": 27626, "sad": 8764, "clung": 9931, "Malaysia": 1477, "NC": 8263, "Bio": 13972, "Astronomy": 24459, "interventions": 1627, "Cincinnati": 3598, "Front": 14301, "interruptions": 4751, "lantern": 12900, "confronting": 18855, "junk": 6140, "glands": 24052, "Chester": 28265, "dispose": 11647, "Kindopp": 24591, "Signac": 21149, "ENRONONLINE": 23032, "traumas": 25662, "lounge": 29345, "Leopold": 4260, "culinary": 8112, "nipping": 8574, "20515": 11590, "located": 5199, "spirits": 10179, "stables": 26822, "Lounge": 28643, "observer": 215, "agenda": 14276, "Theodore": 5909, "migration": 13008, "clicking": 21060, "same": 255, "Method": 17705, "Cannon": 11589, "coursed": 9678, "group": 370, "previously": 1028, "troop": 14261, "returning": 21748, "final": 818, "Bascom": 29198, "coincidentally": 15186, "advice": 3876, "realtion": 26759, "hisses": 27690, "Midas": 29583, "transplants": 16510, "promulgate": 10547, "Nairobi": 14560, "natural": 1728, "Deteriorating": 19523, "Condoleeza": 24377, "youngsteers": 29742, "inequity": 11657, "pixel": 26217, "1975": 3737, "Staff": 20593, "Spock": 6728, "minimizing": 23286, "recount": 10529, "advising": 29901, "2.00": 24463, "prospects": 11547, "hush": 32729, "scoreboard": 13105, "encompasses": 15001, "Birdman": 11096, "highway": 17238, "add": 1406, "nicer": 27631, "souvenirs": 27556, "onpeak": 21590, "Tryst": 13998, "1,426": 13178, "prevailed": 14324, "belonging": 19335, "@Hatmanone": 27652, "furniture": 3620, "sub-par": 27991, "ADA": 29599, "Readers": 3038, "practiced": 5997, "Imitation": 4151, "Gruen": 11376, "Syntax": 5620, "interferences": 14223, "Humvees": 14659, "Senators": 14354, "challenges": 1601, "plains": 17415, "Ph.D.": 3358, "Secret": 10912, "battered": 9748, "Colette": 13463, "homepage": 12723, "Owing": 16865, "tuned": 20454, "Ouija": 7003, "Otherwise": 6691, "sustains": 8066, "Rathke": 12183, "treatise": 5114, "plurality": 13997, "alchemy": 32591, "cruising": 30873, "Core": 11821, "Cucumber": 17198, "hammie": 26762, "Cremona": 25498, "arsenals": 25832, "BRAY": 31691, "Nie": 24789, "expanse": 31099, "overthrow": 4537, "WE": 11882, "MILNET": 25774, "forever": 5972, "surpassing": 25870, "Arrogance": 17595, "night's": 31717, "Amrullah": 19651, "recipe": 17832, "Chavez": 19372, "spacious": 26489, "Records": 23686, "Epistemic": 1198, "Didn't": 6644, "country's": 12843, "frequencies": 2694, "resume": 21285, "smoothing": 32251, "FRS": 3102, "mash": 26653, "presenting": 13024, "Munafò": 2438, "cent": 13891, "Noir": 16198, "uninhabited": 16653, "nonjudgmental": 28936, "occurring": 1872, "heating": 2133, "trained": 6722, "soil": 2571, "dwibbling": 6822, "affirming": 14423, "singing": 8706, "indigenous": 13950, "feathery": 26853, "outdated": 29014, "transported": 19622, "Miller": 1572, "Latter": 19986, "dislocated": 18237, "edged": 8686, "civilisation": 16264, "milliliters": 18022, "Cuthbert": 5777, "wherever": 6063, "a.k.a.": 25469, "curiously": 31842, "Gerulaitis": 13369, "species'": 25129, "scheduled": 11418, "Mazda": 29835, "pas": 4050, "Kos": 20258, "specifically": 1557, "Hungarians": 31864, "indication": 2385, "sponsered": 25529, "Nguyen": 26510, "woken": 29449, "Tagesspiegel": 25736, "theoretical": 2670, "uploads": 5229, "Disinformation": 20439, "carnations": 32400, "Haut": 16647, "squish": 6941, "xxx": 11757, "winning": 7475, "Yards": 29343, "TRUE": 29755, "rnb": 16705, "division": 14335, "LaGuardia": 16538, "IE": 12767, "mushrooms": 18403, "Microsoft": 8267, "BUT": 11905, "Lists": 24931, "Who": 5376, "camp": 12367, "ticks": 27192, "gratefully": 25016, "lives": 4991, "attractions": 16425, "info@travelheels.dk": 17305, "aficionados": 27488, "Hadibo": 17143, "dogs": 5320, "counts": 14459, "bans": 25477, "seen": 6128, "missile": 10429, "advancement": 25280, "stout": 31299, "08:55": 23191, "DI": 24255, "module": 24810, "privately": 3193, "very": 282, "commemorate": 16363, "eg.": 21036, "Lucius": 32311, "underdog": 9651, "Remember": 7340, "Colonel": 4424, "Talkboys": 6982, "stick": 6395, "Listing": 2307, "amoung": 24245, "goes": 2190, "thyroid": 18673, "demo": 11390, "Congressional": 14131, "pumped": 27295, "Pennysaver": 28245, "i.e.": 2719, "democrats": 20818, "Lafayette": 3555, "ABBY": 24534, "expositions": 25619, "levy": 31101, "C4-0497/98-98/0126": 31459, "pan": 6206, "schizophrenic": 25616, "Laurie": 5775, "overshadowed": 11029, "overtime": 25258, "cemetery": 4013, "bottom": 4953, "biomed.taiwan": 13973, "XML": 10982, "calibration": 9234, "fears": 8413, "you’d": 9914, ".???": 26238, "FDI": 913, "OSCE": 13911, "Dawa": 25742, "bases": 4848, "Dragging": 31701, "brushing": 32298, "tradition": 1107, "Cross": 2399, "PivotChart": 30080, "??": 22135, "SOMEthing": 11828, "Psychology": 5207, "HIGH": 25720, "building": 8445, "1930": 15048, "emperors": 25514, "director": 4237, "that’s": 7726, "mousey": 29863, "bale": 6686, "Confused": 20214, "fond": 28367, "death": 3179, "recklessness": 32537, "In": 136, "vineyards": 9197, "motivating": 3742, "16's": 26946, "Viognier": 16250, "entity": 8322, "Fishman": 23679, "We’ll": 11132, "refine": 15028, "Mickey": 12615, "dinging": 17921, "colada": 29471, "ballast": 30846, "Kind": 13623, "ban": 12116, "described": 995, "preach": 5956, "Untied": 12163, "Metal": 21673, "perfumes": 9436, "Giuliana": 16122, "Norway": 22511, "NOW": 24923, "Christmas": 5813, "triangular": 4666, "morality": 14837, "sight": 8905, "plural": 16887, "salvation": 6587, "1.25": 25221, "DURER": 25357, "tooling": 27300, "Ghazaliyah": 18486, "Statue": 16356, "reps": 23489, "Jalalabad": 19643, "Sound": 20835, "ot": 27799, "Zimbalist": 20881, "dry": 9169, "Visa": 16438, "pinpointed": 15568, "indicative": 9950, "signatories": 22418, "GLAD": 29519, "ufc": 28542, "1779": 3561, "spurned": 8172, "Orr's": 29448, "meaningful": 14918, "Lichtenstein": 21153, "predators": 5791, "reacts": 21228, "debris": 9164, "inhaled": 13713, "salons": 16597, "P.M": 11786, "1400": 22810, "arrival": 2019, "sending": 14650, "chef": 26624, "utterance": 3740, "culprit": 23349, "drug-out": 32507, "force": 2444, "Figures": 13003, "Capitalize": 23480, "Ring": 5743, "Gospels": 4980, "Apple": 24145, "untamed": 16654, "bewildered": 9516, "calmly": 14801, "ohh": 26109, "skydivers": 18206, "wandered": 6161, "unfathomable": 32587, "Amazing": 15951, "Suicide": 20388, "DPC's": 23788, "signals": 1830, "Wok": 28154, "palate": 16191, "action": 872, "relying": 8030, "Zoomed's": 27749, "resulted": 1959, "non-essential": 24427, "lighthouse": 30961, "crossword": 9706, "omelets": 29476, "1696": 4383, "launches": 24775, "lingering": 15797, "Pablo": 950, "sightseeing": 16871, "candles": 5901, "proceeds": 7882, "Duckworth": 15230, "1.4": 14752, "PG&E": 21634, "Nah": 7121, "managers": 11672, "Exact": 26876, "colourful": 27842, "biosphere": 25103, "620-294-1909": 24025, "Traditionally": 17352, "genitals": 24846, "Queso": 28492, "digital": 178, "amounts": 1059, "barbershops": 28145, "Nephew": 19845, "cardinal": 1922, "prosecute": 18554, "incoherent": 25618, "Affordable": 28065, "implicated": 7488, "perceives": 14972, "population": 845, "conversations": 1874, "1635": 4262, "m.nordstrom@pecorp.com": 21939, "overcoat": 30320, "dreading": 19253, "Empirical": 25133, "strategic": 10432, "George": 3567, "teaches": 8221, "pledge": 10423, "Edward": 4711, "appropriateness": 31509, "Mathematician": 3994, "late": 2595, "Flip": 17372, "settlement’s": 15369, "elaborate": 20544, "Peter": 3508, "Shelby": 8802, "Haden": 14713, "Priest": 17127, "kittens": 27287, "mins.": 29324, "sharply": 30885, "Summers": 17414, "Census": 16386, "information": 202, "Trier": 5105, "eats": 10213, "bounced": 8897, "ye": 6643, "Peres": 11173, "Miami": 19344, "Skilled": 27078, "unfortunate": 1278, "frontier": 11447, "Steinberg": 23876, "finish": 6252, "Bout's": 19906, "mid-80s": 27271, "replaced": 11180, "Mom's": 18157, "brilliance": 30919, "photo": 6508, "ignoring": 14816, "2075": 17307, "surgically": 20530, "UCAN's": 23879, "QUIETEST": 27778, "vista": 32742, "FURY": 25382, "church": 4397, "stardom": 25602, "Transmedia": 2994, "chicken's": 17796, "Rosario": 22147, "Died": 5341, "Ahmaud": 14141, "temples": 15323, "crypts": 5050, "Churches": 16758, "eco": 17140, "Poisson": 3831, "mandate": 14187, "foreground": 11431, "fragments": 5170, "Tyrannius": 5107, "Salikh": 18521, "GenCon": 13777, "morose": 31150, "End": 5519, "warned": 19717, "ABOUREZK": 11495, "UV": 2099, "incomplete": 4428, "Haedicke": 22175, "Columns": 16845, "Cognitive": 1494, "Curl": 15913, "staggered": 11088, "STUDY": 11830, "Ferrari": 28996, "glitch": 29188, "aristocratic": 3564, "alter": 2639, "bloke": 27990, "change": 1900, "bosses": 10049, "noticing": 15821, "Rathbun": 12292, "Greeks": 13512, "Hong’s": 14874, "problematic": 15188, "Secretive": 24778, "crieth": 32484, "pf-": 6846, "Acquisition": 21114, "wilt": 20152, "Groups": 24338, "imbalances": 27616, "shovelling": 32528, "landings": 18236, "unwitting": 1232, "CS5": 26628, "noticeably": 10758, "tending": 20798, "dealerships": 28551, "panes": 28369, "war": 3580, "staircase": 4577, "continents": 1763, "black": 5073, "alongside": 5396, "Completely": 7158, "Auschwitz": 31977, "Warner": 29478, "username": 17971, "metaphors": 20324, "measured": 1676, "captain": 3557, "BackWeb": 21369, "sympathize": 13604, "cows": 15445, "Budweiser": 13092, "smell": 9159, "prepared": 11057, "spill": 18792, "Mitchell's": 7208, "revisit": 11009, "Crazy": 11736, "prematurely": 25135, "paraded": 27196, "Amendments": 20272, "protein": 15351, "visualization": 1671, "hoaxes": 18008, "Encyclopedia": 32851, "Instituto": 13187, "imprint": 14066, "moving": 3316, "Ordered": 14743, "queenly": 31878, "Bake": 17874, "crackpot": 18766, "Y!A": 28023, "Victrola": 24194, "cupboard": 31792, "ultrasonic": 11367, "Fax": 20983, "stickies": 17680, "stepping": 19967, "encompass": 7509, "M": 1654, "vexation": 4348, "Kinneret": 11249, "Searcher": 12959, "Zombie": 9348, "Chat": 17956, "Reliant": 23340, "Młyn": 16878, "alreet": 6199, "chirping": 16081, "grindstone": 25288, "Movies": 8282, "Corporate": 21094, "w/out": 23356, "escaping": 10285, "Herbalist": 23976, "ports": 16336, "crash": 12732, "TRACTOR": 21526, "Pheasant": 17330, "Chernobyl": 18645, "corssing": 27249, "WINGS": 29688, "Pinching": 17764, "Salama": 20627, "greatly": 2777, "ASIAN": 26243, "Pure": 28156, "Jeff": 10337, "monasteries": 5959, "swing": 15523, "Bangkok": 17391, "speedily": 9975, "Conf.": 23077, "kb": 28263, "Mate": 24230, "varnished": 30888, "philly": 26700, "Street’s": 15173, "bucks": 6134, "withdraw": 18896, "docking": 24814, "intra-day": 22690, "femur": 2744, "chosen": 9814, "kike": 30714, "min": 15693, "Stephenville": 4819, "heady": 9172, "Wan": 12398, "collectively": 6117, "holiest": 12275, "caribou": 15505, "films": 4102, "blessed": 16365, "wooded": 30925, "ecosystems": 25076, "Invalides": 26609, "Welling's": 5755, "coincided": 13308, "chlorine": 27868, "sucked": 29205, "mall": 8796, "two-hundred-year": 30724, "programmer": 2285, "better": 1574, "cock": 25185, "styled": 29289, "Thomas": 5815, "dose": 13581, "fleet": 25790, "Prevent": 26472, "counter-measures": 13235, "bakers": 27322, "card": 6075, "peeled": 9066, "deleting": 27167, "Arena": 12572, "desolate": 9983, "lexical": 1052, "Clambake": 12743, "tendons": 6371, "symptomatic": 15808, "mere": 1795, "Smith's": 23719, ".4": 18041, "courthouse": 7563, "Doug": 21907, "breakthrough": 4090, "25": 1401, "indeed": 10892, "Moab": 30796, "fort": 14763, "lessons": 14839, "rains": 11483, "Stu": 7170, "Huston": 19427, "baskets": 31185, "where": 743, "Social": 7910, "locations": 3710, "enlarge": 12281, "1974": 7868, "interpretation": 157, "UP": 11911, "edition": 4448, "inventor": 4565, "Charter": 13872, "most": 1867, "Newsday.com": 23927, "88": 25956, "spans": 17437, "hammer": 29821, "fugitives": 20746, "Text": 17966, "Dec": 21906, "Stow": 25385, "BMW": 29269, "holocausts": 30833, "Panza": 30436, "tablespoons": 17864, "<-": 21247, "Navy": 12077, "brevet": 3591, "Lo": 11146, "contented": 31784, "713-853-3989": 23503, "vivid": 7751, "chomping": 13770, "prospect": 19785, "concurrently": 4663, "damned": 9299, "à": 4060, "aquasafe": 26715, "scapular": 30536, "http://gimpedblog.blogspot.com/2011/09/how-to-use-gimp-for-beginners-lesson-4.html": 26625, "suicide": 5877, "Spodsbjerg": 17242, "------------------------------------------------------": 25577, "assign": 11111, "takeover": 18842, "TECHNOLOGY": 24451, "innings": 30507, "marriage": 3407, "needlework": 4617, "tore": 31238, "Sandy": 28306, "succumbing": 18691, "Kathleen": 21707, "cancellations": 29900, "desecrated": 14329, "South": 3583, "heading": 1153, "hugging": 6854, "O'Connor": 3760, "Personally": 13782, "Hillegonds": 23519, "paler": 32945, "Christ": 5558, "WOULD": 27776, "Rocky": 25035, "Multicultural": 17553, "ascended": 32836, "contracting": 22564, "acuity": 3391, "seats": 12370, "Booz": 30656, "babies": 6770, "stumbled": 11746, "Qwest": 28198, "adventure": 4366, "Dawn": 21293, "Descriptions": 24748, "Berkeley": 3460, "tycoons": 16903, "try": 1488, "Promised": 16910, "twenty-two": 31634, "P.O.": 24309, "misstatements": 22612, "Aires": 21746, "casualties": 12264, "innovating": 2221, "Progress": 32577, "'09": 29714, "HOSTESS": 29679, "comparison": 1760, "1893": 4685, "subcommission": 11445, "Dante’s": 10146, "Souffleur": 16687, "avert": 14293, "fabulously": 28286, "E-meter": 12322, "cheekbones": 31725, "cropped": 32019, "sawdust": 32474, "quality": 2458, "Middlebrooks": 4932, "reason": 1434, "youll": 11067, "maize": 13453, "25.00": 24915, "Heavy": 8895, "wailing": 8797, "entrenched": 31428, ">": 21062, "bilked": 29411, "appartment": 21996, "computers": 12713, "lisenced": 29038, "U.C.": 22446, "they": 43, "Seeds": 17700, "CEM": 22458, "Quit": 29982, "Adamson": 31568, "Hadith": 20871, "Haight": 27256, "riddle": 32612, "invitations": 29434, "ORACLE": 24195, "GDP": 14663, "riverboatmen": 9109, "Dee": 21615, "everyday": 3096, "Guthe": 11450, "Administrator": 14597, "undisclosed": 7333, "declaration": 19417, "Edmark": 28104, "Caitlin": 13035, "Lay": 17946, "interrupt": 32894, "actual": 1832, "tortured": 8721, "pronounced": 1173, "Jan.": 11679, "breeze": 18263, "uninspired": 29978, "breakers": 10009, "y": 14749, "contributor": 19634, "Everybody": 6301, "condemning": 1291, "salon": 5221, "molecules": 6336, "Smyth’s": 8594, "Nation": 14057, "aspiration": 13856, "civilians": 14257, "banishing": 32856, "centralized": 823, "VR": 12558, "Allow": 7254, "Men": 3945, "enjoyable": 10113, "moment": 2878, "Fazlur": 19099, "ambassador": 25965, "estate": 4273, "Ponchatoula": 19445, "confused": 6299, "site": 1158, "sadistically": 11169, "UBS": 21456, "funeral": 4034, "and": 3, "unanticipated": 15488, "requirements": 16280, "Def": 28483, "offing": 30879, "enraged": 17608, "hmmmm": 20122, "Paradise": 20873, "Qinkuang": 14877, "splitter": 26519, "caged": 25029, "Degeneration": 20197, "cottonwoods": 25071, "nano": 26664, "Let": 2479, "Arkansas": 10342, "AMAZING": 28641, "allergic": 32505, "digging": 13699, "Contact": 22907, "undershirt": 8604, "Coalition": 19256, "Three": 5394, "standings": 25220, "punchlines": 13670, "smoked": 29626, "24.8": 15618, "affirm": 15144, "Judaism": 20379, "sleeveless": 17384, "Apatow": 13642, "respectable": 8247, "finalize": 23324, "score": 1684, "losers": 24841, "forsyth": 29477, "picking": 8549, "leftist": 30727, "captive": 11154, "coursing": 15763, "Alex": 8545, "Bashers": 25196, "fallout": 18647, "Bandar": 25964, "reunify": 2356, "launching": 14528, "overwhelmed": 7673, "anti-army": 19702, "steady": 9228, "Amman": 18945, "Ruona": 28924, "Finding": 9155, "cellphones": 29527, "Adorama": 26537, "Bright": 28064, "Galileo": 11370, "Basin": 15303, "unattended": 7601, "rely": 641, "www.flag.govt.nz": 12659, "Copying": 4111, "mother's": 4242, "hugged": 32071, "thes": 26945, "filling": 18061, "grimace": 32845, "Allawi": 19260, "migrated": 14671, "wanna": 6365, "crime": 12342, "NJ": 16505, "distribution": 13493, "founders": 3772, "detestable": 31015, "enter": 11194, "814014": 21394, "Providence": 8239, "50,000": 12585, "BOTHER": 28185, "repositioning": 16864, "Our": 188, "states": 7261, "poke": 9907, "bloodworms": 27052, "sure": 1902, "gold": 2470, "marketers'": 23650, "kaplan": 22369, "envy": 25282, "mayonnaise": 21245, "Magnum": 21827, "Doliver": 22900, "UC": 3666, "grandure": 29118, "International": 3816, "713/646-6505": 22978, "ext": 23378, "accurately": 3977, "synch": 23963, "Kia": 28779, "School": 1497, "agreements": 12998, "spellbooks": 32039, "optical": 26218, "Glase": 31387, "muggle": 18317, "design": 672, "opted": 5942, "Hopelessly": 14780, "staggering": 8190, "ICI": 13219, "programming": 2278, "jerk": 20302, "Negligence": 25951, "315-460-3344": 22306, "parked": 29237, "listless": 10069, "favorable": 11998, "160.00": 29410, "Commons": 8539, "Chander": 19074, "Branch": 24729, "cut": 1121, "righ...@sonic.net": 24828, "Shows": 27502, "Speech": 14094, "Beatle": 25610, "Newsweek": 19780, "Mansour": 18606, "frequented": 16710, "Cannot": 28174, "05:37": 22524, "burglar": 25576, "baldish": 31726, "Sardica": 5016, "Mabruk": 20628, "gasp": 20899, "honeydew": 10215, "Strip": 18902, "gazed": 8985, "Masjed-e": 16809, "extremists": 19663, "05/31/2001": 23524, "drifted": 31928, "dwelling": 4691, "asses": 10727, "Cox": 31438, "ninety-nine": 6984, "untouchable": 19915, "paying": 7876, "Fundamentalist": 19985, "Something": 9618, "deliciously": 27918, "Mares": 27975, "Ansel": 13391, "hoof": 6373, "CROWLEY": 10097, "Mechaincs": 28995, "0590258046": 16699, "disquiet": 14194, "Shackleton": 21616, "Cope": 18178, "pointless": 20552, "Distancia": 966, "Gamers": 13795, "Doors": 10467, "Tub": 29567, "grace": 6571, "Patrons": 21255, "cashier": 8794, "pictographs": 18125, "suite": 21979, "invasive": 26257, "underscore": 20817, "hostile": 10407, "attackers": 9605, "Sunak": 12955, "PLACE": 26245, "powers": 18286, "hight": 27188, "memo": 20667, "farmer's": 20237, "unlocking": 32078, "Kronos": 32678, "avant": 5486, "Alps": 11204, "Sufficient": 25141, "Ho": 12410, "witches": 32060, "dude": 27339, "recoils": 30571, "Shucks": 21875, "loans": 11542, "rests": 14022, "liters": 18423, "gusts": 30273, "Ball": 3158, "ruled": 6023, "watermelon": 6112, "AK47s": 19872, "Mary.Ellenberger@enron.com": 21915, "Arthur": 311, "wheezing": 8853, "busy": 8701, "tribe": 15508, "convergence": 2893, "Ollie": 19394, "celebrity": 12537, "Elon": 8337, "Children": 5359, "secretary’s": 8666, "416-865-3703": 21300, "cropdusters": 20584, "brunch": 26898, "writers": 3048, "midlife": 7932, "come": 1458, "Discussion": 1904, "Arm": 26258, "#": 12781, "overfed": 31262, "funneled": 18956, "crappy": 27952, "How'd": 16127, "Locate": 15266, "soft": 6385, "Trento": 11255, "utilities": 22427, "influences": 10326, "Laurent": 21020, "slumped": 31687, "whole": 187, "registrar": 31808, "salmon": 28607, "whelmed": 7725, "Suttle": 22218, "indoors": 17720, "conspirator": 20642, "Fraiser's": 28647, "dad": 6981, "paramount": 14165, "Philosophiae": 3260, "measurements": 2567, "Takekurabe": 4700, "Manipal": 19179, "Gino": 6791, "resell": 29854, "Hostel": 29336, "Politics": 19404, "Elizabeth": 4480, "games": 1511, "wierd": 21994, "rejected": 12986, "And": 6060, "snowshoe": 15498, "ventilator": 29924, "Emery": 20976, "shuttles": 23935, "placed": 8504, "constitutionally": 7599, "M5J": 21296, "Va.": 24818, "Neoplatonic": 25337, "virility": 25659, "bleary": 31658, "an-": 7028, "tournament": 10998, "ignoramus": 26552, "lapse": 14156, "del": 16440, "Traveler": 26495, "Forster@ENRON": 22156, "gentrified": 24294, "star": 5194, "cloudless": 8885, "monocot": 13482, "divest": 19107, "WORLD": 28796, "Glock": 8586, "dwellers": 16883, "researchers": 350, "advocates": 22421, "FLOOR": 29666, "individualized": 15034, "pseudonym": 5179, "predict": 10469, "TED": 14985, "t...@sonic.net": 24864, "arising": 21805, "mcclelland": 28216, "spontaneity": 30283, "nondescript": 28646, "surname": 5261, "gels": 15952, "fundamentalists": 18941, "winker": 14823, "ligament": 4876, "LIGHTS": 11842, "feverishly": 28459, "Chamberlain": 29256, "isda": 21602, "tactics": 3077, "Betty": 8546, "Names": 12661, "cant": 26480, "N-": 6316, "1/8": 11535, "squeezed": 28780, "illuminated": 3741, "hypnosis": 17785, "releasing": 13791, "Clough": 31854, "1530": 25459, "Ciao": 16110, "User": 22654, "pump": 9304, "http://en.wikipedia.org/wiki/Degenerate_art": 20192, "basin": 30451, "Bayleys": 31852, "Bath": 15831, "marquee": 31867, "photographer": 12027, "puree": 17778, "Coke": 6938, "lowest": 22277, "****": 27088, "Needed": 15127, "Simple": 23979, "travellers": 17557, "advanced": 3842, "Allah": 16803, "surrendered": 14764, "Refrigerate": 18441, "12.46": 22274, "murderers": 20393, "..........": 24922, "Fleet": 30830, "rents": 10697, "discontinued": 5809, "preview": 13760, "Breeze": 24696, "constituent": 5622, "exit": 7397, "chatterbox": 17641, "dictionary": 3809, "Tensions": 14233, "Lack": 18204, "surgery": 1293, "facto": 6010, "operates": 14845, "management": 7585, "Creative": 8538, "NYC": 20654, "satisfactory": 21034, "earrings": 29534, "caring": 24530, "60th": 10392, "symmetry": 11260, "Cone": 23251, "Any": 7045, "sworn": 14366, "birdie": 22080, "Mach": 25795, "committees": 13881, "2.15": 15667, "aircraft": 3310, "tread": 8372, "immediately": 4942, "purveyed": 10559, "signed": 15743, "gestured": 30422, "smaller": 1316, "chain": 7375, "states'": 11227, "Rafik": 25822, "fetch": 27539, "Imperium": 9293, "nutty": 18377, "Property": 705, "penance": 5153, "optionally": 30113, "frequently": 667, "sunscreen": 17056, "net": 8106, "Canon": 15980, "842": 16811, "Karol": 27414, "allocated": 7569, "Yazid": 20645, "FRANCE": 28769, "Export": 22356, "Years": 5350, "rug": 27171, "medication": 27459, "Marina": 17314, "usual": 10126, "2051": 8317, "CFC": 21140, "Hegemony": 10379, "Engineer": 22004, "Contract": 22726, "Think": 6113, "Sunjay": 23132, "DBE": 4464, "momori": 16328, "Mediawiki": 10769, "Firstly": 14919, "dunderheads": 6556, "excessive": 2860, "residential": 2128, "accepted": 2636, "L'Americano": 16666, "Borders": 16611, "brainwashed": 20113, "mud-flat": 30964, "cuban": 29470, "vegetables": 8057, "165.9": 23607, "coil": 32266, "Allton": 13408, "stabilize": 15817, "periodically": 13880, "PONCHATOULA": 19442, "neuter": 29400, "Yale": 17469, "aloud": 32339, "she`s": 21265, "books": 2959, "mercenaries": 19779, "NOMINATION": 24743, "furnaces": 24853, "34": 15131, "MONARCHS": 22950, "Jamarat": 13157, "flush": 27354, "phonne": 22786, "TYPE": 28580, "Technologies": 20732, "A.": 5549, "anymore": 7093, "Debbie": 7350, "HAVING": 11884, "milieu": 20443, "managed": 3948, "entie": 28502, "foreigners": 17326, "Fine": 18158, "forgiven": 11564, "pressured": 29203, "Diego": 5894, "hands": 4413, "Manson's": 20106, "board": 1430, "advertise": 10707, "hickies": 21866, "Antique": 28416, "Andrew": 22, "tunnels": 32320, "garments": 25517, "tranced": 32670, "1724": 3208, "Hellenic": 13523, "ac-": 6876, "mortgage": 11526, "GlobalSecurity.org": 24819, "spooky": 26656, "Braman": 29045, "pencil": 16230, "waters": 9046, "metal": 9221, "slash": 16049, "lion": 10177, "Robertson": 1573, "mouse": 23046, "Neiman": 6142, "misconception": 10687, "Orlando": 16057, "folds": 8903, "succumbed": 24302, "spoilt": 26153, "vertical": 2747, "store": 4690, "Moda": 28834, "primarily": 320, "confidentiality": 21220, "polluting": 24573, "Cape": 29860, "MUCH": 11880, "open-necked": 32709, "persuaded": 7871, "commanders": 18744, "Chinoise": 3441, "Darfur": 11236, "twe-": 6049, "track": 335, "sparkling": 9123, "homosexuality": 10489, "definite": 17895, "di": 28813, "Expeditionary": 25809, "currents": 9385, "shafts": 5066, "sensational": 4944, "dusted": 25017, "GILBERGD@sullcrom.com": 22124, "bedroom": 5213, "boarder": 27182, "Words": 5626, "Paglino": 9576, "War": 3541, "Ya'll": 23148, "cruiseline": 27511, "hosts": 5323, "reuse": 13439, "pathways": 8950, "Manipur": 19527, "corpse": 31291, "superbly": 29095, "damning": 12994, "Certainly": 18798, "harboring": 20745, "gastroenteritis": 27591, "Job": 21024, "Miert": 31467, "f": 22305, "wonders": 27849, "Videoconference": 22345, "1906": 15453, "Melissa": 22393, "Anyways": 15767, "gibberish": 18122, "relentless": 9495, "Stanford": 3658, "Studying": 8492, "Birla": 27417, "flopped": 19761, "dyspepsia": 24085, "realist": 5839, "dicot": 13479, "confusion": 7489, "#food": 8010, "Ronald": 725, "discover": 3152, "thirteenth": 11466, "protest": 9344, "POST": 24981, "09:48": 23259, "styling": 15910, "august": 13852, "aren’t": 11184, "scripted": 11164, "LANDING": 24448, "Sue": 3802, "spiritual": 5911, "plants": 10005, "8274": 24310, "background": 4671, "wheeled": 31661, "Rhino's": 31922, "catalog": 6968, "BEWARE": 29247, "next": 1888, "tonnage": 22581, "fermented": 9171, "admitted": 8763, "S.": 17497, "Valentine": 29503, "grocery": 15010, "Squares": 16768, "Qadoos": 20739, "Ohio": 3653, "yam": 28208, "lightness": 8702, "Lotte": 26577, "Rouault": 21166, "chess": 20518, "cancers": 18680, "egos": 20323, "colors": 11961, "Lewiston": 29321, "Spence": 1547, "GW": 16577, "Labour": 12415, "11/03": 21870, "explode": 20402, "X": 7067, "CAJUNISH": 28574, "consolidated": 837, "dehydration": 32815, "efficiency": 2158, "Ayad": 19259, "abruptly": 19011, "saccades": 211, "violently": 3869, "garde": 5487, "saber": 19151, "Administrative": 21126, "Meat": 30138, "INS's": 25970, "capable": 621, "schools": 1527, "calibrated": 1799, "Bahai": 16805, "Hochrenaissance": 27114, "birds": 2809, "AROUND": 28761, "considerably": 13720, "Macao": 31422, "affectionately": 30896, "wo": 9521, "Arabia's": 12259, "offset": 25893, "paling": 32682, "hackers": 8308, "Bernard": 4557, "Li": 1537, "she'll": 29507, "beautiful": 4668, "UVB": 27743, "Wai-ching": 12480, "Russell": 3378, "Shames": 23882, "jaunty": 32355, "substance": 13538, "Moslem": 20354, "exceptions": 29974, "edge": 6887, "merchandise": 2969, "V02": 21420, "c.": 4966, "532-3836": 22902, "eck": 11699, "denunciation": 18931, "providing": 637, "Dynamic": 5631, "s/he": 16533, "bankroll": 18940, "traders": 19884, "71st": 17483, "hunters": 27754, "guards": 14653, "Øhavsstien": 17272, "Kool": 13423, "fans’": 3058, "wil": 26856, "Darwinian": 14986, "unlike": 7438, "oval": 9315, "artists": 6153, "Flipped": 28716, "Consortium": 30102, "Atta": 20771, "indulged": 5033, "assuming": 7252, "ascent": 32806, "Grenada": 16483, "Europol": 31360, "constantly": 6018, "HATED": 28783, "immigrate": 27372, "Zealand": 12641, "Energy": 2113, "fourteenth": 5800, "city's": 16880, "windsurf": 16677, "10th": 11166, "TRY": 21208, "Organisation": 31497, "Jove's": 32366, "Liberal": 31408, "10:51": 23453, "impressions": 240, "Grass": 21848, "grills": 28251, "drollery": 31129, "que": 28615, "smart": 11685, "STEPS": 23027, "spectrophotometer": 10300, "snapshot": 538, "Threatened": 25911, "detectable": 25142, "conquistadors": 16965, "soybean": 13454, "i": 7086, "10.9": 26031, "slit": 29820, "infrequent": 17814, "Microwave": 21273, "LLP": 21488, "Sithamparanathan": 19071, "NEED": 11835, "Romeo": 29574, "SAY": 29951, "cabbage": 28481, "Looked": 28018, "historian": 4971, "Worth": 4775, "pork": 27325, "fly": 15550, "Dramatic": 4254, "10:52": 22050, "BUILDING": 11504, "Why're": 32091, "marches": 27193, "crickets": 27740, "LA": 12335, "haves": 28164, "seamstresses": 30011, "secretary": 8667, "arch-enemy": 32081, "fundamental": 1521, "tiny": 4572, "burner": 21177, "varieties": 15475, "questioning": 1397, "desirable": 7736, "Branco": 2488, "category": 12755, "returnees": 20810, "mingling": 30629, "apparent": 8493, "communism": 16932, "holder": 11087, "Ahmed": 12188, "isolation": 13550, "Transforming": 14514, "trustworthiness": 30900, "2102": 21895, "Jason.Leopold@dowjones.com": 23865, "Leon": 21087, "directories": 494, "noble": 4275, "Throws": 4779, "infection": 6950, "Brent's": 21329, "g": 17845, "sow": 18358, "Infinity": 21829, "Communists": 27713, "length": 2401, "historic": 13249, "fuse": 29586, "carven": 9403, "Back": 6426, "misdirection": 19911, "alla": 28300, "instructions": 7362, "crashed": 30792, "projections": 13466, "phones": 21909, "breeeding": 27050, "explanatory": 15172, "haul": 20316, "1809": 32541, "Rector": 24660, "glisten": 31095, "violation": 7393, "other’s": 14244, "sickest": 23965, "Finance": 7544, "estates": 31572, "I've": 6127, "mention": 10876, "potential": 163, "slightest": 17603, "industry's": 24445, "furrowed": 32919, "rose": 3291, "circumvention": 31506, "Angela": 15229, "phoney": 20117, "Trieste": 11412, "astounding": 14624, "Dose": 16034, "scenarios": 13461, "requesting": 4750, "domesticated": 15315, "You're": 5236, "countrymen": 19546, "Catherine": 25500, "souvlaki": 32926, "plucked": 8908, "blotched": 10051, "invoice": 21400, "Poll": 21268, "Lepage": 5841, "foodshed": 8113, "user's": 30172, "inference": 2038, "hamburger": 30307, "agricultural": 15295, "VALENTIN": 10094, "Some": 470, "BY-SA": 7669, "dinner": 6697, "cruise": 11383, "Hoa": 19199, "945": 21565, "lunar": 24485, "image": 7510, "En": 3484, "#reportinginformation": 7821, "S": 2054, "Quetta": 19751, "Fredonia": 14720, "H": 22803, "Economy": 25835, "dust": 11334, "heartbreaks": 14183, "controlling": 18187, "So-o-o": 31154, "DJ's": 29391, "minus": 7078, "attention": 62, "concrete": 10280, "accessible": 12657, "smartphone": 15593, "Saxby's": 15751, "Sicily": 28839, "was": 151, "figured": 6300, "Comics'": 4130, "hotel": 4592, "infallible": 6601, "workmanship": 28242, "I'll": 6096, "denomination": 13510, "names": 3957, "Leonhard": 3203, "rub": 9786, "mysteries": 6435, ".15": 28335, "Move": 17790, "implementing": 829, "weekly": 5302, "Q1": 22645, "EARTHQUAKE": 25383, "purge": 18750, "gator": 16082, "organized": 472, "domain": 2275, "physically": 12278, "Santer": 31504, "extract": 17852, "Isaac": 3258, "vague": 26386, "116th": 30396, "assed": 13603, "185": 16561, "hang": 26672, "nodded": 32205, "ranged": 13130, "displayed": 5196, "perennial": 17715, "reduced": 899, "overdone": 11141, "Clean": 13498, "ironing": 32177, "spurs": 25984, "hassles": 29047, "ideologue": 19064, "whomever": 21960, "WADE": 19814, "Online": 19083, "42": 17303, "codices": 15406, "cluster": 18612, "interpreter": 3377, "peritonitis": 4030, "shins": 8725, "Miley": 5284, "ranchers": 25014, "Spain": 967, "surpluses": 25845, "blowing": 9062, "lɑ̃fɑ̃": 3505, "Gwenzi's": 31766, "relatives": 4076, "neglects": 25176, "Evernote": 15057, "mutilated": 20453, "turmoil": 19415, "hangar": 22922, "idiots": 20058, "Maids": 28410, "HDTV": 8645, "http://www.euci.com/pdf/trans_expn.pdf": 21061, "http://www.oneworld.org/index_oc/issue196/byckau.html": 18698, "Govt": 23485, "constrained": 1811, "accustomed": 2022, "metering": 23578, "provincial": 16985, "obliquely": 31220, "Red": 3042, "disagreeable": 30582, "forked": 31312, "mayors": 14444, "harsher": 17650, "Species": 10298, "IDs": 23124, "outcasts": 9577, "consent": 6558, "sh*t": 26151, "deli": 16613, "machinery": 16924, "Satisfactory": 21029, "plenipotentiary": 30702, "fitness": 14956, "grandmothers": 9130, "Collective": 13968, "Ghost": 6998, "defeating": 12420, "Tempest": 4225, "unsuccessful": 12999, "ther": 27055, "1958": 4539, "Øhavets": 17256, "today’s": 7958, "naive": 20415, "Approved": 23045, "toughies": 30636, "Dugway": 20708, "mine": 6101, "homes": 2142, "family's": 20767, "50000": 10759, "Mine": 9580, "lotos": 9394, "Posts": 12740, "preferences": 8514, "backs": 9654, "persecuted": 4295, "soccer": 18349, "Markus": 11379, "minded": 13405, "Rouse": 3157, "remodels": 7196, "Taipei": 12890, "anti-Semite": 20447, "flag": 12642, "introductory": 17295, "leadoff": 4933, "Embedded": 21072, "CURSED": 25719, "comprehensive": 418, "choices": 8139, "geopolitical": 14292, "infested": 20483, "Pickle": 22174, "Sin": 25594, "McMurdo": 10678, "overbearing": 25679, "frames": 578, "ARE": 28395, "extra": 7032, "fiji": 26665, "Counterparty": 21669, "Pistorius": 8402, "Tom's": 23413, "stand-offish": 31314, "Citizens": 16472, "09:27": 22573, "Hang": 6988, "Crayola": 26260, "volume": 2975, "sports": 10870, "Malfoy's": 32174, "enroute": 20339, "http://www.ibrae.ac.ru/IBRAE/eng/chernobyl/nat_rep/nat_repe.htm#24": 18694, "70.85": 24446, "Loads": 26971, "distributors": 8128, "Seller": 23017, "disproportionate": 11615, "69th": 13113, "bigger": 7862, "PAID": 29149, "liberal": 4527, "Burning": 4136, "Fax.": 22245, "Hau": 12896, "Trident": 32539, "Howrah": 26435, "orienting": 2837, "mindedness": 14083, "barren": 20140, "swallowing": 9327, "Nance": 11778, "amateur": 4235, "fixation": 20883, "Armogida": 22287, "Bulgaria": 25211, "unhunh": 6463, "facial": 9314, "sum": 7494, "B": 9631, "patting": 32352, "steals": 7713, "file": 10201, "Cheung": 12427, "costumer": 29762, "scarlet": 9994, "Marcus": 13068, "Galbraith": 7843, "Audio": 13286, "Events": 23493, "salute": 14130, "displacements": 14232, "Louvre": 3536, "Worker's": 7212, "Felice": 13366, "unceasing": 30936, "nostrils": 9461, "Floyd's": 14122, "reuptake": 13584, "philologists": 5642, "Manoel": 5524, "Benioff": 3036, "nice": 6921, "Biotaling": 7024, "Industries’": 8216, "reaffirmation": 20292, "Board": 20350, "Paseo": 17025, "animos": 5077, "Riedell": 7531, "boy's": 12191, "03/16/2001": 21728, "packets": 23988, "1966": 1010, "Flyer": 26693, "Bavelier": 1540, "Explore": 27489, "simplification": 31418, "recovering": 2317, "switch": 12899, "Nicholas'": 17556, "exclaim": 17939, "Zaman": 18467, "introducing": 2264, "Everyday": 25326, "re-looking": 21169, "wits": 4346, "spruce": 25412, "trajectory": 11332, "Sydney": 12827, "Immigrant": 27381, "car's": 28596, "619-696-6966": 23891, "skipping": 26550, "describes": 89, "discoveries": 1490, "pines": 24414, "UH": 27389, "orchestrated": 30431, "class": 3841, "Daugherty": 23622, "obsessive": 13570, "convicted": 20049, "BRIDGET": 25359, "passively": 15213, "dirt": 6388, "intersections": 16547, "Karzai’s": 19741, "trophies": 31322, "neckhole": 8609, "Singapore": 16488, "pressed": 8990, "dominance": 10550, "Moore": 4227, "sovereignty": 18797, "additions": 21199, "hear": 7110, "leafy": 10993, "Nedre": 23748, "Holy": 4405, "Accustomed": 14679, "01:32:35": 21929, "whale": 9048, "Wallen": 28127, "WeatherTrade": 22543, "Zeus's": 32415, "comets": 32570, "Avignon": 5454, "graduands": 14557, "greenish": 10050, "1930’s": 10459, "responsiveness": 29139, "Cole": 5544, "vowed": 25194, "b.": 4209, "triumphant": 31249, "Sickles": 32323, "1993": 5601, "burns": 7377, "MMC": 23432, "judiciary": 798, "reali-": 13682, "Friend": 26055, "tastical": 8208, "indoor": 29386, "Rehe": 16358, "Palatine": 28143, "roasted": 15773, "overheard": 18587, "environments": 401, "directing": 8099, "repays": 11558, "harem": 16842, "Cass": 22998, "militias": 18911, "cocoa": 17856, "Glendale": 17045, "1961": 3650, "decoding": 5677, "Minister's": 13053, "gown": 30006, "gaping": 32762, "knowledgeable": 28136, "strayed": 14064, "remove": 12008, "disdainful": 30975, "GROUP": 19978, "groan": 10169, "stockholders": 26060, "Tsars": 4396, "01:35": 21628, "posted": 4838, "NTU": 12942, "bears": 13602, "Futurism": 20184, "smock": 18015, "neighborly": 19080, "geared": 12786, "priests": 20503, "260,000": 14437, "317": 17451, "flaw": 24726, "significant": 1532, "rigged": 29419, "hankering": 31055, "drift": 16993, "surrounds": 24613, "Mellencamp": 23757, "diurnal": 27741, "eyeballs": 31116, "Calling": 5541, "booming": 9053, "Jamie": 27160, "exterior": 18382, "Gare": 29331, "share": 11616, "Essen": 31542, "counters": 20404, "EXCELLENT": 28789, "skush@swbell.net": 23382, "3/9/00": 22569, "effeminate": 25657, "compliments": 18001, "#sharedvalues": 7661, "3.8": 25946, "disinclined": 32796, "motive": 1388, "ISDA": 21622, "agree": 7856, "Kitchen": 21717, "STONER": 28748, "Hayat": 20845, "communistic": 25212, "greying": 32496, "mizzen-mast": 30912, "snappy": 11105, "title": 5803, "Ashcroft": 20759, "forties": 30653, "RETAIL": 23435, "312-666-2372": 26916, "unobstructed": 14605, "ineffective": 23740, "watcher": 30368, "northeastern": 17407, "16/11/2004": 19084, "eagle": 3602, "following": 912, "Gnosticism": 20222, "tool": 6896, "phantom": 6923, "Lynch's": 22466, "lbs": 22271, "lab": 6368, "mounted": 10643, "cabinet": 13991, "toe": 24093, "lifespans": 26801, "sponsorship": 20707, "postures": 2778, "08/03/2000": 22489, "wana": 26789, "odd": 9755, "ongoing": 7504, "inactive": 21106, "Physiotherapists": 28317, "Leninism": 30685, "Labor": 10455, "limestone": 17179, "1,8": 17325, "...?!!!": 22527, "park": 12902, "VOM": 22696, "09/17/99": 23255, "cobbled": 32331, "allocating": 11633, "backpacks": 28860, "prefects": 32338, "lathered": 30500, "stooges": 20341, "±": 1657, "consumerism": 6915, "fits": 8483, "tragically": 14124, "emissivity": 2641, "away": 773, "venues": 26931, "resolving": 3237, "neutered": 27687, "darkly": 32277, "flights": 16283, "floral": 16834, "CTRL–C": 30157, "Expressionist": 20188, "paradigms": 2271, "Acrylics": 22208, "we’re": 8444, "Naturally": 31354, "temper": 19776, "investigators": 26006, "1647": 16846, "Taasinge": 17283, "Belarus": 18682, "build-outs": 10698, "Stout": 29350, "flocked": 19519, "hemistichs": 1116, "engineers": 23928, "MI": 28028, "Française": 5388, "Salmagundi": 29540, "ozone": 13444, "slide": 7352, "renegotiation": 22639, "confuse": 29185, "lesson": 13437, "XBOX": 26791, "juicy": 20051, "ruminate": 25019, "Weasley's": 32202, "Ryan's": 32948, "Optional": 18363, "sales": 11612, "M306": 21770, "Iain": 8345, "adoption": 449, "PUK": 19293, "Goebbels": 20466, "resupply": 25877, "Hopless": 28309, "Marks": 1983, "skirmish": 12705, "dating": 11148, "flooded": 24395, "after": 1634, "submicron": 11392, "Traders": 21015, "Tempura": 28535, "ISIS": 14642, "they'd": 6058, "1570": 25484, "Chun": 12500, "Jakov": 30739, "deities": 13505, "TSM": 2677, "USD": 16455, "TWIG": 19391, "invoking": 20289, "openings": 25457, "crossed": 11773, "Lake": 5823, "basis": 10417, "sequencing": 13825, "brain": 6762, "antennæ": 10038, "Brandeis": 20749, "Clelia's": 32853, "te": 28173, "unequal": 925, "OSSOFF": 14352, "parted": 31587, "Vegan": 17824, "scores": 1675, "increases": 3329, "redeem": 14005, "pending": 13919, "Gather": 18287, "volumes": 21424, "Polansky": 25613, "'em": 29124, "Castamere": 3035, "rumored": 20884, "inhabited": 16906, "organs": 24605, "hook": 18193, "Challenge": 12064, "3,300,000": 23469, "oth-": 6176, "Very": 6052, "panted": 9676, "cream": 10583, "501": 21258, "hangs": 9530, "lashed": 24130, "Church": 4294, "carolina": 26271, "chooses": 11559, "remodeling": 29254, "cosmos": 14615, "Grinning": 32138, "hundred": 6070, "inventorying": 6898, "Karl": 10941, "squarely": 25777, "limited": 515, "Kant": 14898, "washer": 13573, "H.": 2231, "clerics": 18596, "03/01/2001": 21627, "secularist": 13244, "OBJECTIVES": 15536, "beforehand": 30435, "Honolulu": 7636, "visions": 9307, "addictions": 13537, "Birth": 20373, "glare": 30967, "repent": 24724, "Reference": 23010, "canned": 26649, "elevators": 17928, "exhausted": 15804, "deOccupy": 7635, "brown": 9177, "Senior": 19716, "Pre": 17281, "Short": 2523, "Capricorn": 25306, "courageous": 12057, "1911": 17065, "advocated": 14160, "b": 21620, "Bangladeshis": 12155, "Heavily": 24424, "punitive": 7593, "he'd": 6965, "experience": 36, "pronunciation": 3103, "laughs": 10540, "silly": 30837, "familiarity": 5026, "gnarled": 9047, "affectation": 25407, "Shi'ite": 18595, "68": 25917, "Eagle": 20853, "Évariste": 4016, "drifters": 2557, "posterior": 2741, "chessboard": 32702, "tabletop": 2967, "1327": 25356, "winces": 9539, "part": 313, "Hogsmeade": 16089, "INTERNATIONAL": 24997, "kid": 6498, "believed": 8187, "radar": 8359, "HOLY": 29637, "DISTRACT": 7808, "covered": 2691, "Buenos": 21745, "distinctions": 120, "nickname": 11095, "isles": 32843, "They've": 10726, "militarily": 12887, "interrogators": 20718, "Goldman": 21577, "Everybody's": 30485, "poignant": 22089, "sayings": 6641, "spreadsheet": 21440, "seaman": 30780, "temporal": 2564, "hometown": 5846, "zombie": 9666, "Beatles'": 25615, "It’ll": 8675, "Laden": 18739, "staple": 15431, "pinkie": 17676, "d'Orleans": 26604, "towards": 1911, "approved": 13835, "Peoria": 17046, "residency": 27079, "Ivy": 15232, "replace": 11210, "rest": 844, "mammals": 2765, "Todd": 21038, "eminent": 25491, "molesters": 28621, "Overcooked": 29174, "annually": 11651, "exclaiming": 30522, "Republic": 10465, "organizers": 13280, "Bas": 16648, "Berry": 4862, "Texan's": 19840, "!!!!!!!!!!!!!": 26338, "Entering": 30527, "juddering": 32751, "mutants": 2257, "47,500": 21023, "Essie": 21068, "Weehawken": 16535, "acupuncture": 28020, "gal": 17953, "Gish": 10361, "Nichols": 19367, "Moscoso": 21333, "mats": 31319, "timber": 25923, "plant": 15473, "tacky": 16060, "botn": 21995, "intestines": 27610, "dense": 15932, "Rhythm": 943, "squinting": 32234, "aluminum": 18407, "warp": 15614, "genitalia": 5256, "negative": 7082, "barn": 6672, "Cuba": 16437, "difficulties": 10614, "fain": 9454, "uses": 687, "mile": 11453, "characters": 4725, "reply": 9880, "Madagascar": 14205, "periods": 11382, "sur": 3438, "http://washington.hyatt.com/wasgh/index.html": 22809, "BBC": 4217, "outdoor": 16584, "successively": 3216, "we'll": 6218, "FINALLY": 29938, "mixing": 17882, "rollbacks": 25925, "PetSmart": 27766, "mistakenly": 4422, "36647": 21814, "weakest": 1924, "captivated": 15486, "if": 834, "rang": 16011, "1,183": 23586, "informing": 29878, "props": 10363, "Sumner": 15452, "reball": 28342, "Sundays": 5040, "Tussey": 29026, "summed": 8742, "VHF": 17318, "Kean": 21373 } ================================================ FILE: harper-brill/src/lib.rs ================================================ use std::num::NonZero; use std::rc::Rc; use std::sync::{Arc, LazyLock}; pub use harper_pos_utils::{ BrillChunker, BrillTagger, BurnChunkerCpu, CachedChunker, Chunker, FreqDict, Tagger, UPOS, }; const BRILL_TAGGER_SOURCE: &str = include_str!("../trained_tagger_model.json"); static BRILL_TAGGER: LazyLock>> = LazyLock::new(|| Arc::new(uncached_brill_tagger())); fn uncached_brill_tagger() -> BrillTagger { serde_json::from_str(BRILL_TAGGER_SOURCE).unwrap() } /// Get a copy of a shared, lazily-initialized [`BrillTagger`]. There will be only one instance /// per-process. pub fn brill_tagger() -> Arc> { (*BRILL_TAGGER).clone() } const BRILL_CHUNKER_SOURCE: &str = include_str!("../trained_chunker_model.json"); static BRILL_CHUNKER: LazyLock> = LazyLock::new(|| Arc::new(uncached_brill_chunker())); fn uncached_brill_chunker() -> BrillChunker { serde_json::from_str(BRILL_CHUNKER_SOURCE).unwrap() } /// Get a copy of a shared, lazily-initialized [`BrillChunker`]. There will be only one instance /// per-process. pub fn brill_chunker() -> Arc { (*BRILL_CHUNKER).clone() } const BURN_CHUNKER_VOCAB: &[u8; 627993] = include_bytes!("../finished_chunker/vocab.json"); const BURN_CHUNKER_BIN: &[u8; 806312] = include_bytes!("../finished_chunker/model.mpk"); thread_local! { static BURN_CHUNKER: Rc> = Rc::new(uncached_burn_chunker()); } fn uncached_burn_chunker() -> CachedChunker { CachedChunker::new( BurnChunkerCpu::load_from_bytes_cpu(BURN_CHUNKER_BIN, BURN_CHUNKER_VOCAB, 6, 0.3), NonZero::new(10000).unwrap(), ) } /// Get a copy of a shared, lazily-initialized [`BurnChunkerCpu`]. There will be only one instance /// per-process. Since neural net inference is extremely expensive, this chunker is memoized as /// well. pub fn burn_chunker() -> Rc> { (BURN_CHUNKER).with(|c| c.clone()) } ================================================ FILE: harper-brill/trained_chunker_model.json ================================================ { "base": { "counts": { "ADP": -40685, "VERB": -47220, "CCONJ": -14576, "PROPN": 17155, "ADJ": -8207, "SCONJ": -7841, "NOUN": 33927, "DET": 175, "SYM": -905, "INTJ": -2658, "PART": -11757, "AUX": -26039, "PUNCT": -55964, "NUM": -4445, "PRON": 36959, "ADV": -22237 } }, "patches": [ { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "DET" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "." } }, "b": { "NounPhraseAt": { "is_np": true, "relative": -1 } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "." } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "any" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 5, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "and" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 2 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "them" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "ADP" } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "them" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "them" } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "a" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "AUX" } } } } }, { "from": false, "criteria": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "PRON" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "a" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "," } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "ADJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "." } }, "b": { "NounPhraseAt": { "is_np": true, "relative": -1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "-" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "or" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "CCONJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "-" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "-" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "DET" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "them" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "AUX" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "for" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "NOUN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "." } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "NUM" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "I" } }, "b": { "WordIs": { "relative": -2, "word": "I" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "DET" } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PUNCT", "post_word_tagged": "ADP" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "they" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PUNCT" } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "ADP" } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "?" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": -1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "no" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "SCONJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PRON" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "new" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "PART" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "of" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "CCONJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "an" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "their" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PUNCT" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "and" } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 1 } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "many" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "." } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 2 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "." } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 2 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "some" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "two" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "ADP" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "that" } }, "b": { "WordIs": { "relative": -2, "word": "that" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "A" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "PART" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "(" } }, "b": { "WordIsTaggedWith": { "relative": 3, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "you" } }, "b": { "WordIs": { "relative": -3, "word": "you" } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADV", "post_word_tagged": "ADP" } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "other" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "any" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "their" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "them" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "the" } }, "b": { "WordIs": { "relative": -3, "word": "The" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "The" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "DET" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "any" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "NOUN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "his" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "last" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "." } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 2 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "any" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "ADV" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "and" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PART" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "PUNCT" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "few" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": true, "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "SYM" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "it" } }, "b": { "WordIs": { "relative": -1, "word": "it" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "that" } }, "b": { "WordIs": { "relative": -2, "word": "that" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "," } }, "b": { "WordIsTaggedWith": { "relative": 3, "is_tagged": "CCONJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "," } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "PROPN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "them" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "the" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "them" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "of" } }, "b": { "WordIs": { "relative": 0, "word": "their" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "-" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "DET" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "an" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "my" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "and" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "," } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "AUX" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "and" } }, "b": { "NounPhraseAt": { "is_np": true, "relative": -1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "them" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PROPN", "post_word_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "any" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADV", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "(" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "all" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "DET" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "those" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "this" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "NOUN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "other" } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 1 } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PART", "post_word_tagged": "NOUN" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "we" } }, "b": { "WordIs": { "relative": -2, "word": "we" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "what" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "their" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "ADV" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "their" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADV" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "(" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 5, "is_tagged": "ADJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "NUM" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "," } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "it" } }, "b": { "WordIs": { "relative": -2, "word": "all" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "is" } }, "b": { "WordIs": { "relative": -2, "word": "I" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "DET" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "their" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADV" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "their" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "no" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "-" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "DET" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "\"" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "he" } }, "b": { "WordIs": { "relative": -3, "word": "he" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "them" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "SYM" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "the" } }, "b": { "WordIs": { "relative": -2, "word": "the" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "-" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "," } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "it's" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "CCONJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "and" } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 1 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "(" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "PROPN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "PROPN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "PUNCT" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "\"" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "in" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "SCONJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "AUX" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "." } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "VERB" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "they" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "DET" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "is" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "it" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "or" } }, "b": { "WordIs": { "relative": 0, "word": "an" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "they" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "PART" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "," } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 3 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "what" } }, "b": { "WordIs": { "relative": -1, "word": "what" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "was" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "ADJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "-" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PRON" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "your" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "are" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "\"" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "DET" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "all" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PROPN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "and" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PROPN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "(" } }, "b": { "WordIs": { "relative": 3, "word": "," } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "." } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PUNCT", "post_word_tagged": "CCONJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "no" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PART" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "no" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "AUX" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "them" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "an" } }, "b": { "WordIs": { "relative": 2, "word": "his" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "a" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "NUM" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "a" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "you" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "at" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "with" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "with" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PROPN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "it's" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "is" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "was" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "PUNCT" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "and" } }, "b": { "WordIs": { "relative": 2, "word": "your" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "or" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "SYM" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "in" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "VERB" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "-" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "NUM" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "an" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PROPN" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "is" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "SCONJ", "post_word_tagged": "ADP" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "on" } }, "b": { "WordIs": { "relative": 2, "word": "one" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "on" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "SCONJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "-" } }, "b": { "WordIs": { "relative": 1, "word": "," } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "her" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "is" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "you" } }, "b": { "WordIs": { "relative": -2, "word": "you" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "." } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "it's" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "PRON" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "SYM" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "it's" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "CCONJ" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "." } }, "b": { "NounPhraseAt": { "is_np": false, "relative": 3 } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -3, "word": "is" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "what" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "AUX" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "are" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "SCONJ", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "something" } }, "b": { "WordIs": { "relative": -2, "word": "the" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "for" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "(" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PROPN", "post_word_tagged": "NUM" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "The" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "PRON" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "." } }, "b": { "WordIsTaggedWith": { "relative": 3, "is_tagged": "ADV" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "," } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 3, "word": "," } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "PUNCT" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "that" } }, "b": { "WordIs": { "relative": -3, "word": "that" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "any" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "ADV" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "people" } }, "b": { "WordIs": { "relative": -1, "word": "people" } } } } }, { "from": true, "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "SCONJ", "post_word_tagged": "CCONJ" } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "," } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADJ" } } } } }, { "from": true, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "their" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "ADV" } } } } }, { "from": false, "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "them" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 1, "is_tagged": "PRON" } } } } } ] } ================================================ FILE: harper-brill/trained_tagger_model.json ================================================ { "base": { "mapping": { "dame": "PROPN", "associate": "NOUN", "obscurity": "NOUN", "ivan": "PROPN", "pangs": "NOUN", "camels": "NOUN", "genre": "NOUN", "electronically": "ADV", "ignored": "VERB", "migration": "NOUN", "boil": "NOUN", "well-formed": "ADJ", "forthcoming": "ADJ", "addresses": "NOUN", "cruises": "NOUN", "lasping": "VERB", "zacarias": "PROPN", "exhibits": "NOUN", "geri": "PROPN", "weight": "NOUN", "endevour": "VERB", "penn": "PROPN", "sh-": "INTJ", "attorney": "NOUN", "touted": "VERB", "hoorah": "INTJ", "debi": "PROPN", "soften": "VERB", "pediatrician": "NOUN", "hits": "VERB", "requested": "VERB", "charcoal": "NOUN", "essex": "PROPN", ".5": "NUM", "09:40": "NUM", "instances": "NOUN", "salted": "VERB", "freemason": "PROPN", "speedily": "ADV", "multilateral": "ADJ", "jolts": "VERB", "apps": "NOUN", "sacrificed": "VERB", "typo": "NOUN", "j.": "PROPN", "behaviors": "NOUN", "attention": "NOUN", "consulted": "VERB", "combative": "ADJ", "routes": "NOUN", "choice": "NOUN", "who's": "PRON", "36.2": "NUM", "kimberwick": "NOUN", "influencing": "VERB", "aquavit": "NOUN", "heebee": "NOUN", "image": "NOUN", "majoos": "PROPN", "airless": "ADJ", "wholes": "NOUN", "transit": "NOUN", "fried": "VERB", "sacrifices": "NOUN", "instrument": "NOUN", "peeled": "VERB", "surgical": "ADJ", "icicles": "NOUN", "tiring": "ADJ", "roadworthiness": "NOUN", "lording": "VERB", "shelia": "PROPN", "mentally": "ADV", "geometry": "NOUN", "competing": "VERB", "infertility": "NOUN", "airlines": "PROPN", "cradled": "VERB", "lowly": "ADJ", "shied": "VERB", "allegheny": "PROPN", "greens": "NOUN", "indispensable": "ADJ", "nrc": "PROPN", "lam": "PROPN", "hing": "PROPN", "robogee": "PROPN", "tokyo": "PROPN", "zeroes": "NOUN", "holding": "VERB", "concerned": "ADJ", "bakery": "NOUN", "designated": "VERB", "statistical": "ADJ", "rugger-square": "NOUN", "pharmacy": "NOUN", "arteries": "NOUN", "mozzarella": "NOUN", "shura": "NOUN", "pge": "PROPN", "mortal": "ADJ", "appreciation": "NOUN", "rearranged": "VERB", "flights": "NOUN", "defend": "VERB", "burnt": "ADJ", "deed": "NOUN", "hamper": "VERB", "i/c": "NOUN", "verdot": "PROPN", "behaviours": "NOUN", "51,516": "NUM", "forgiveness": "NOUN", "palaces": "NOUN", "deluded": "VERB", "bangs": "PROPN", "re-schedule": "VERB", "11/7/08": "NUM", "married": "VERB", "humanity": "NOUN", "displeased": "VERB", "run": "VERB", "1669": "NUM", "dire": "ADJ", "pashtuns": "PROPN", "finnish": "NOUN", "iq": "NOUN", "assigning": "VERB", "slum": "NOUN", "directives": "NOUN", "oppress": "VERB", "houseman": "PROPN", "sassanid": "PROPN", "knitting": "NOUN", "0nside": "ADJ", "der": "PROPN", "relativism": "NOUN", "actors": "NOUN", "reducing": "VERB", "hypothesis": "NOUN", "ootd": "INTJ", "crab": "NOUN", "pediatricians": "NOUN", "catastrophe": "NOUN", "found": "VERB", "mark.carr...@chron.com": "PROPN", "anymore": "ADV", "lansing": "PROPN", "katsof": "PROPN", "model": "NOUN", "complications": "NOUN", "01:47": "NUM", "bafta": "PROPN", "proviso": "NOUN", "domínguez": "PROPN", "brown": "ADJ", "greco": "PROPN", "saga": "NOUN", "stow": "PROPN", "slovenia": "PROPN", "rooms": "NOUN", "shins": "NOUN", "cuisines": "NOUN", "core": "NOUN", "coffeyville": "PROPN", "land": "NOUN", "murfreesboro": "PROPN", "38,000": "NUM", "undeterred": "ADJ", "rein": "NOUN", "3.2": "NUM", "churning": "VERB", "pa": "PROPN", "chick": "NOUN", "sending": "VERB", "view": "NOUN", "#pathos": "PROPN", "upholstered": "ADJ", "cliffs": "PROPN", "21,600": "NUM", "uptown": "ADV", "refreshment": "NOUN", "take": "VERB", "appetizing": "ADJ", "veterans": "NOUN", "causes": "NOUN", "bundy": "PROPN", "capability": "NOUN", "derrick": "PROPN", "plant": "NOUN", "rips": "NOUN", "instructed": "VERB", "licenses": "NOUN", "indemnity": "PROPN", "suspicious": "ADJ", "sandeep": "PROPN", "evacuated": "VERB", "plotted": "VERB", "photos": "NOUN", "cic": "PROPN", "democratic": "ADJ", "hysterical": "ADJ", "defunct": "ADJ", "concentrates": "VERB", "hopes": "NOUN", "milekic": "PROPN", "picasso": "PROPN", "coupon": "NOUN", "maintain": "VERB", "fontainbleu": "PROPN", "switches": "NOUN", "gloucestershire": "PROPN", "colonized": "VERB", "gun-oil": "NOUN", "providers": "NOUN", "selah": "PROPN", "darkling": "NOUN", "inscription": "NOUN", "patronized": "VERB", "releases": "NOUN", "equilon": "PROPN", "bout": "PROPN", "mytouch": "PROPN", "robbi": "PROPN", "tzu": "NOUN", "stai-": "INTJ", "downside": "NOUN", "contributes": "VERB", "deer": "NOUN", "asian": "ADJ", "determining": "VERB", "summers": "NOUN", "bags": "NOUN", "savages": "NOUN", "arsenal": "NOUN", "solved": "VERB", "jito": "PROPN", "marymegan": "PROPN", "6.1": "NUM", "cotton": "NOUN", "routine": "NOUN", "experimenter": "NOUN", "correct": "ADJ", "zenghelis": "PROPN", "blasphemies": "NOUN", "market": "NOUN", "svce": "NOUN", "marilyn": "PROPN", "grandchild": "NOUN", "epistemic": "ADJ", "speculators": "NOUN", "vassar": "PROPN", "custom-house": "NOUN", "take-out": "VERB", "ingredient": "NOUN", "available": "ADJ", "recieved": "VERB", "galantino": "PROPN", "prayers": "NOUN", "stench": "NOUN", "profited": "VERB", "circa": "ADP", "amr": "PROPN", "merchandise": "NOUN", "counselor": "NOUN", "loi": "NOUN", "swarming": "VERB", "airbox": "PROPN", "unconsumables": "NOUN", "visualization": "NOUN", "dispossesses": "VERB", "seasonal": "ADJ", "sketchbook": "NOUN", "dutchman": "PROPN", "examining": "VERB", "fragrant": "ADJ", "u.": "PROPN", "timed": "VERB", "missouri": "PROPN", "avenger": "NOUN", "poneh": "NOUN", "doldrums": "NOUN", "eremites": "NOUN", "functioning": "NOUN", "hong": "PROPN", "pure": "ADJ", "destinations": "NOUN", "services.doc": "NOUN", "hysteria": "NOUN", "landlord": "NOUN", "patriots": "NOUN", "eather": "ADV", "using": "VERB", "kingdom": "PROPN", "segueway": "VERB", "files": "NOUN", "www.kaffeeeis.co.nz": "PROPN", "reminisced": "VERB", "stirred": "VERB", "lusty": "ADJ", "pruned": "VERB", "shouting": "NOUN", "wrinkles": "NOUN", "moldovan": "ADJ", "open-necked": "ADJ", "logging": "NOUN", "spite": "NOUN", "monthly": "ADJ", "visited": "VERB", "oversite": "NOUN", "v02": "NOUN", "constantine": "PROPN", "gentrified": "VERB", "ba'athists": "PROPN", "jill": "PROPN", "back-and-forth": "ADV", "term": "NOUN", "legend": "NOUN", "envoy": "NOUN", "anti-pyongyang": "ADJ", "230,500": "NUM", "brethren": "NOUN", "could": "AUX", "victoria": "PROPN", "oakley": "PROPN", "spring": "NOUN", "administer": "VERB", "planted": "VERB", "caught": "VERB", "prisoner": "NOUN", "mountains": "NOUN", "workshop": "NOUN", "ministries": "NOUN", "expecting": "VERB", "olbina": "PROPN", "awesome": "ADJ", "study": "NOUN", "secularist": "NOUN", "aberrations": "NOUN", "clamoring": "NOUN", "stroll": "VERB", "pennsylvania": "PROPN", "http://i.imgur.com/t2zff.jpg": "PROPN", "stokes": "PROPN", "refute": "VERB", "nice": "ADJ", "accept": "VERB", "09:22": "NUM", "vomiting": "VERB", "holidaying": "NOUN", "tripura": "PROPN", "equator": "NOUN", "coke": "PROPN", "hatfill": "PROPN", "ghassemlou": "PROPN", "impressive": "ADJ", "qinkuang": "PROPN", "explanatorily": "ADV", "khan": "PROPN", "visit": "VERB", "smile": "NOUN", "darn": "NOUN", "atop": "ADP", "arthritis": "NOUN", "professional": "ADJ", "get-a-free-house.com": "PROPN", "partially": "ADV", "kings": "NOUN", "dresser": "NOUN", "olson": "PROPN", "aware": "ADJ", "smiled": "VERB", "chathams": "PROPN", "inexpensive": "ADJ", "manifesto": "PROPN", "cloud": "NOUN", "harbours": "NOUN", "slim": "ADJ", "pun": "NOUN", "decision": "NOUN", "auchleuchries": "PROPN", "controversially": "ADV", "great-grandfather": "NOUN", "lewis": "PROPN", "strengths": "NOUN", "westmoreland": "PROPN", "levis": "PROPN", "disturbed": "VERB", "agency": "NOUN", "broadcasts": "NOUN", "trick": "NOUN", ".432": "NUM", "off": "ADP", "shakataganai": "PROPN", "ought": "AUX", "thread": "NOUN", "hammocks": "NOUN", "hassle": "NOUN", "fluff": "VERB", "doi:10.1037/0022-3514.92.6.1087": "PROPN", "posing": "VERB", "loving": "ADJ", "inequalities": "NOUN", "courses": "NOUN", "exodus": "NOUN", "loudspeakers": "NOUN", "ignoramus": "NOUN", "messy": "ADJ", "one's": "NOUN", "unemployment": "NOUN", "ass": "NOUN", "troubles": "NOUN", "centered": "VERB", "protections": "NOUN", "2.0": "NUM", "unending": "ADJ", "impostor": "NOUN", "illustrator": "NOUN", "hotline": "NOUN", "laird": "PROPN", "devised": "VERB", "exempt": "VERB", "spruce": "ADJ", "rector": "NOUN", "uploaded": "VERB", "citygate": "PROPN", "gw": "PROPN", "ci.taiwan.gov.tw": "PROPN", "appointment": "NOUN", "aerial": "ADJ", "1528": "NUM", "mathematically": "ADV", "wearies": "VERB", "mounting": "VERB", "pepper": "NOUN", "anti-israeli": "ADJ", "trailers": "NOUN", "livable": "ADJ", "uncomfortable": "ADJ", "provinces": "NOUN", "malaysian": "ADJ", "bustling": "ADJ", "academia": "NOUN", "avoiding": "VERB", "nowadays": "ADV", "o.j.": "PROPN", "translucent": "ADJ", "laundromats": "NOUN", "cross-sectoral": "ADJ", "glendale": "PROPN", "cohen": "PROPN", "apologised": "VERB", "thrones": "PROPN", "not": "PART", "accommodate": "VERB", "commerce": "NOUN", "seminal": "ADJ", "refuge": "NOUN", "veranda": "NOUN", "grateful": "ADJ", "associates": "NOUN", "over-simplifying": "VERB", "co-creators": "NOUN", "buffeting": "NOUN", "02:39:27": "NUM", "aerosol": "NOUN", "obliterated": "VERB", "claus": "PROPN", "clock": "NOUN", "frs": "PROPN", "severe": "ADJ", "tasks": "NOUN", "giverny": "PROPN", "relaxed": "ADJ", "fallujah": "PROPN", "splashy": "ADJ", "perennial": "ADJ", "aeroméxico": "PROPN", "parade": "NOUN", "la": "PROPN", "advocated": "VERB", "agility": "NOUN", "realtime": "ADJ", "nj": "PROPN", "clerks": "NOUN", "feebly": "ADV", "glitz": "NOUN", "scaring": "VERB", "origami": "NOUN", "squared": "VERB", "midget": "NOUN", "dried": "VERB", "fabric": "NOUN", "goyish": "ADJ", "galaxy": "NOUN", "raids": "NOUN", "fear": "NOUN", "convert": "VERB", "attitudes": "NOUN", "91": "NUM", "novelty": "NOUN", "ibrahim": "PROPN", "penetrates": "VERB", "holes": "NOUN", "surface": "NOUN", "screener": "NOUN", "lovable": "ADJ", "parliament": "NOUN", "cooked": "VERB", "126": "NUM", "convicts": "NOUN", "dwellings": "NOUN", "nonmaterial": "ADJ", "tulips": "NOUN", "moisture": "NOUN", "cummings": "PROPN", "occupancy": "NOUN", "chapters": "NOUN", "deadbolted": "VERB", "spoiled": "ADJ", "apostles": "NOUN", "surrendered": "VERB", "09/20/2000": "NUM", "non-compete": "NOUN", "ri": "PROPN", "exercised": "VERB", "judging": "VERB", "georges": "PROPN", "vegetation": "NOUN", "anything": "PRON", "bastard": "NOUN", "281-518-9526": "NUM", "policemen": "NOUN", "aloha": "INTJ", "forty": "NUM", "bizarre": "ADJ", "towel": "NOUN", "4chan": "PROPN", "skimmer": "NOUN", "deserves": "VERB", "great": "ADJ", "mma": "PROPN", "agence": "PROPN", "juddering": "ADJ", "nicobar": "PROPN", "runflats": "NOUN", "streams": "NOUN", "stormy": "ADJ", "grossly": "ADV", "bounding": "VERB", "bbq": "NOUN", "sc.": "NOUN", "thumpstar": "PROPN", "levels": "NOUN", "precisely": "ADV", "require": "VERB", "administration": "NOUN", "george": "PROPN", "baldness": "NOUN", "width": "NOUN", "johnelle": "PROPN", "appellees": "NOUN", "coils": "NOUN", "deeply": "ADV", "fdi": "NOUN", "astros": "PROPN", "kido": "NOUN", "sins": "NOUN", "teachers": "NOUN", "lawsuit": "NOUN", "interpreter": "NOUN", "scare": "VERB", "utensil": "NOUN", "railroad": "NOUN", "deepen": "VERB", "binalshibh": "PROPN", "ben": "PROPN", "dungeon": "NOUN", "sex": "NOUN", "beloved": "ADJ", "mr.": "PROPN", "approx.": "ADV", "established": "VERB", "fenders": "NOUN", "utterly": "ADV", "leading": "VERB", "tested": "VERB", "allawi": "PROPN", "grant": "NOUN", "1809": "NUM", "symphony": "NOUN", "enough": "ADV", "spoilers": "NOUN", "sum": "NOUN", "train": "NOUN", "shahid": "PROPN", "tearing": "VERB", "deathlike": "ADJ", "telegram": "NOUN", "sentry": "NOUN", "fakes": "NOUN", "anti-fraud": "PROPN", "screem": "VERB", "hubbard": "PROPN", "aphids": "NOUN", "heels": "NOUN", "571-9571": "NUM", "mangold": "PROPN", "nella": "PROPN", "precision": "NOUN", "announcement": "NOUN", "alright": "INTJ", "turk": "PROPN", "blak": "ADJ", "guadeloupean": "ADJ", "doubling": "VERB", "personality": "NOUN", "disadvantages": "NOUN", "yekaterinburg": "PROPN", "ceremoniously": "ADV", "jog": "NOUN", "minkin": "PROPN", "ensuring": "VERB", "edited": "VERB", "alreet": "INTJ", "ulgg": "PROPN", "finley": "PROPN", "flattened": "VERB", "05:37": "NUM", "roaches": "NOUN", "rook": "PROPN", "pelosi": "PROPN", "pamplona": "PROPN", "na": "PART", "gustavo": "PROPN", "serve": "VERB", "insanely": "ADV", "photographed": "VERB", "antique": "ADJ", "standup": "NOUN", "correspondence": "NOUN", "trading-post": "NOUN", "cutaneous": "ADJ", "trapped": "VERB", "conventions": "NOUN", "swirling": "VERB", "tent": "NOUN", "queries": "NOUN", "machinery": "NOUN", "syracuse": "PROPN", "fell": "VERB", "11.5": "NUM", "color": "NOUN", "expanded": "VERB", "correspondents": "NOUN", "1-800-991-9019": "NUM", "illumination": "NOUN", "mosques": "NOUN", "cbs": "PROPN", "vs.": "ADP", "motors": "PROPN", "08:22": "NUM", "reagan": "PROPN", "thierry": "PROPN", "backlog": "NOUN", "deficiency": "NOUN", "ice-creams": "NOUN", "regroup": "VERB", "burrow": "VERB", "landowners": "NOUN", "horizontally": "ADV", "worsening": "VERB", "100,000,000,000": "NUM", "reilly": "PROPN", "1-877-331-6867": "NUM", "poem": "NOUN", "wolf": "NOUN", "troublesome": "ADJ", "betrayed": "VERB", "1950": "NUM", "warfare": "NOUN", "harpoon": "PROPN", "winked": "VERB", "step": "NOUN", "cease": "VERB", "nbc": "PROPN", "i-": "INTJ", "streamlined": "VERB", "twenty-year": "NOUN", "01:57": "NUM", "m&m": "PROPN", "revival": "NOUN", "memories": "NOUN", "13th": "ADJ", "30": "NUM", "pillowcase": "NOUN", "distance": "NOUN", "employees": "NOUN", "abdomen": "NOUN", "flirtatious": "ADJ", "amassed": "VERB", "adversity": "NOUN", "chadli": "PROPN", "gare": "PROPN", "phased": "VERB", "calif": "PROPN", "11/8/2000": "NUM", "prompt": "ADJ", "equaling": "VERB", "sexuality": "NOUN", "widely": "ADV", "probable": "ADJ", "samoa": "PROPN", "retain": "VERB", "reclamation": "NOUN", "formal": "ADJ", "evacuate": "VERB", "copied": "VERB", "gee": "NOUN", "letter": "NOUN", "politeness": "NOUN", "stout": "PROPN", "breakers": "NOUN", "thematically": "ADV", "dilute": "ADJ", "ii": "NUM", "rebirth": "NOUN", "virgo": "PROPN", "outreach": "NOUN", "undisputed": "ADJ", "dth": "ADJ", "crocodilians": "NOUN", "waterfall": "NOUN", "01/19/01": "NUM", "ported": "ADJ", "estate": "NOUN", "vitalized": "VERB", "shrunken": "ADJ", "argue": "VERB", "renew": "VERB", "nets": "NOUN", "baleful": "ADJ", "abilities": "NOUN", "zurbarán": "PROPN", "affirms": "VERB", "86m": "NOUN", "damning": "ADJ", "dishwasher": "NOUN", "truer": "ADJ", "maine": "PROPN", "yrs": "NOUN", "summarized": "VERB", "migrant": "NOUN", "shelf": "NOUN", "newman": "PROPN", "marine": "ADJ", "coding": "NOUN", "laffa": "NOUN", "hub": "NOUN", "terrestrial": "ADJ", "76": "NUM", "splattered": "VERB", "resubstantiation": "NOUN", "minorities": "NOUN", "bechtolsheim": "PROPN", "caffe": "PROPN", "applause": "NOUN", "gaps": "NOUN", "tends": "VERB", "wanderer": "NOUN", "non-social": "ADJ", "defending": "VERB", "liberalize": "VERB", "psycho-spiritual": "ADJ", "boutiques": "NOUN", "enemies": "NOUN", "compensation": "NOUN", "credential": "VERB", "digs": "VERB", "mysterious": "ADJ", "spaciously": "ADV", "duel": "NOUN", "targetting": "VERB", "2;30": "NUM", "mutants": "NOUN", "metcalfe": "PROPN", "modulated": "VERB", "jeering": "ADJ", "likable": "ADJ", "contradict": "VERB", "x-37097": "NOUN", "catches": "VERB", "psychology": "NOUN", "alto": "PROPN", "dearly": "ADV", "hard": "ADJ", "self-esteem": "NOUN", "9866": "NUM", "longed": "VERB", "saleable": "ADJ", "ortiz": "PROPN", "emulate": "VERB", "1699": "NUM", "lisp": "NOUN", "requests": "NOUN", "cozy": "ADJ", "unavailable": "ADJ", "daughters": "NOUN", "womenfolk": "NOUN", "sut": "NOUN", "frothy": "ADJ", "endorsed": "VERB", "budgies": "NOUN", "pabloruizfabo@gmail.com": "PROPN", "remington": "PROPN", "breyer": "NOUN", "ozark": "PROPN", "http://www.the-dslr-photographer.com/2009/11/which-dslr-to-buy/": "PROPN", "retrieved": "VERB", "hazardous": "ADJ", "09/11/99": "NUM", "chatnam": "PROPN", "app": "NOUN", "interpreted": "VERB", "kinsler": "PROPN", "rampart": "NOUN", "dialing": "VERB", "assertion": "NOUN", "forcing": "VERB", "acceptable": "ADJ", "nukes": "NOUN", "denmark": "PROPN", "ecological": "ADJ", "dostoyevsky": "PROPN", "hero": "NOUN", "impress": "VERB", "helicopters": "NOUN", "belarus": "PROPN", "zahav": "PROPN", "mtps": "PROPN", "sponge-bag": "NOUN", "famed": "ADJ", "cruisecompete": "PROPN", "joker": "PROPN", "inscrutable": "ADJ", "indefinite": "ADJ", "comfort": "NOUN", "fi": "NOUN", "compensate": "VERB", "sliver": "NOUN", "destinies": "NOUN", "kibbutz": "NOUN", "seed": "NOUN", "navigation": "NOUN", "textile": "NOUN", "strzalka": "PROPN", "wear": "VERB", "neglect": "NOUN", "adventure": "NOUN", "http://www.euci.com/pdf/trans_expn.pdf": "PROPN", "absorbed": "VERB", "tiffany": "PROPN", "provoked": "VERB", "20.00": "NUM", "converting": "VERB", "clusters": "NOUN", "addictions": "NOUN", "quickly": "ADV", "occasionally": "ADV", "gearing": "VERB", "ignore": "VERB", "casing": "VERB", "superfund": "PROPN", "justify": "VERB", "desperate": "ADJ", "occur": "VERB", "propensity": "NOUN", "363-0555": "NUM", "cheaper": "ADJ", "resumed": "VERB", "4:30": "NUM", "singularity": "NOUN", "shelling": "VERB", "anxious": "ADJ", "shinza": "PROPN", "composing": "VERB", "trooper": "NOUN", "http://www.thekcrachannel.com/news/4503872/detail.html": "PROPN", "convicted": "VERB", "helped": "VERB", "rich": "ADJ", "martyr": "NOUN", "blindfolded": "VERB", "weaklings": "NOUN", "rubber": "NOUN", "chambers": "NOUN", "fino": "NOUN", "snotty": "ADJ", "gambit": "NOUN", "hesitant": "ADJ", "ssa": "PROPN", "two-day": "NOUN", "35,000": "NUM", "migrations": "NOUN", "foisted": "VERB", "'ve": "AUX", "undersecretary": "NOUN", "lapping": "VERB", "compressor": "NOUN", "jug": "NOUN", "reposted": "VERB", "premium": "NOUN", "specifies": "VERB", "enrollment": "NOUN", "ultimate": "ADJ", "whips": "NOUN", "artworld": "NOUN", "dozens": "NOUN", "gauge": "VERB", "renton": "PROPN", "freezer": "NOUN", "wikipedia": "PROPN", "robinson": "PROPN", "expense": "NOUN", "uk": "PROPN", "curl": "PROPN", "l.p": "NOUN", "lifelong": "ADJ", "alena": "PROPN", "aura": "NOUN", "coupling": "NOUN", "timothy": "PROPN", "sur": "PROPN", "bootham": "PROPN", "d'herbinville": "PROPN", "paraíso": "PROPN", "cooperated": "VERB", "http://www.justcages.co.uk/ferret-cages/ferplast-furet-plus-ferret-cage#v_431": "PROPN", "mary.ellenberger@enron.com": "PROPN", "mcbride": "PROPN", "drumming": "VERB", "crisis": "NOUN", "luo": "PROPN", "fake": "ADJ", "utensils": "NOUN", "interrogative": "ADJ", "pulled": "VERB", "ta": "PART", "sticker": "NOUN", "multi-compartment": "ADJ", "armatho": "PROPN", "paraded": "NOUN", "agrees": "VERB", "broom": "NOUN", "79,000": "NUM", "maritime": "ADJ", "flame": "NOUN", "gesticulating": "VERB", "restrain": "VERB", "pitiless": "ADJ", "deafening": "VERB", "jiangsu": "PROPN", "worth": "ADJ", "11,000": "NUM", "questi": "VERB", "happenstance": "NOUN", "showing": "VERB", "dome": "NOUN", "showgirl": "NOUN", "superstars": "NOUN", "trust": "VERB", "sophisticated": "ADJ", "px": "PROPN", "helpers": "NOUN", "officials": "NOUN", "circling": "VERB", "damnation": "NOUN", "innovator": "NOUN", "way": "NOUN", "http://www.bullatomsci.org/issues/1993/s93/s93marples.html": "PROPN", "eye": "NOUN", "aaaaaggghhhhhh": "INTJ", "disabilities": "NOUN", "quarry": "NOUN", "fearing": "VERB", "pr-": "INTJ", "87": "NUM", "loading": "NOUN", "angels": "NOUN", "tenure": "NOUN", "phonologie": "PROPN", "hopeless": "ADJ", "memphis": "PROPN", "distracting": "ADJ", "coolly": "ADV", "uhm": "INTJ", "zoomed": "PROPN", "mitigate": "VERB", "funds": "NOUN", "believed": "VERB", "cardinals": "PROPN", "inventor": "NOUN", "cpim": "NOUN", "joan": "PROPN", "defensive": "ADJ", "1715": "NUM", "scene": "NOUN", "placed": "VERB", "perpetrated": "VERB", "postmaster": "PROPN", "esai": "PROPN", "banking": "NOUN", "lieutenants": "NOUN", "university": "PROPN", "representative": "NOUN", "refers": "VERB", "unify": "VERB", "prohibited": "VERB", "sunk": "VERB", "huver": "PROPN", "pandemic": "NOUN", "nix": "PROPN", "phenophases": "NOUN", "heed": "NOUN", "signage": "NOUN", "returns": "VERB", "showdown": "NOUN", "high-speed": "NOUN", "clyst": "PROPN", "smartwolves": "PROPN", "directive": "NOUN", "intent": "NOUN", "computer": "NOUN", "inventorying": "VERB", "hills": "NOUN", "paranormal": "ADJ", "congresswoman": "PROPN", "percentages": "NOUN", ".???": "PUNCT", "god-forsaken": "ADJ", "bergère": "PROPN", "jacob": "PROPN", "skull": "NOUN", "bless": "VERB", "presented": "VERB", "56a": "SYM", "downtrodden": "ADJ", "750,000": "NUM", "316": "NUM", "ominous": "ADJ", "aromas": "NOUN", "punching": "VERB", "wells": "PROPN", "chocolate": "NOUN", "swallowing": "VERB", "thanksgiv8ing": "PROPN", "mujahedeen": "PROPN", "fy04": "NOUN", "saaaaaam": "PROPN", "hydraulica": "PROPN", "offing": "NOUN", "nodded": "VERB", "bursts": "NOUN", "distribute": "VERB", "fermented": "VERB", "stabilize": "VERB", "red-haired": "ADJ", "aaa": "PROPN", "shaw": "PROPN", "luminol": "NOUN", "boyles": "PROPN", "abstraction": "NOUN", "epitome": "NOUN", "deterrent": "NOUN", "xml-based": "ADJ", "glaciers": "NOUN", "quinoa": "NOUN", "mimmy": "PROPN", "darkly": "ADV", "quinn": "PROPN", "footpaths": "NOUN", "swim": "VERB", "isda": "NOUN", "rehearing": "NOUN", "berkeley": "PROPN", "values": "NOUN", "joel": "PROPN", "non-violent": "ADJ", "shrink": "NOUN", "arun": "PROPN", "recognises": "VERB", "copying": "VERB", "alarcos": "PROPN", "saints": "NOUN", "someday": "ADV", "hedge": "NOUN", "magistrate": "NOUN", "minh": "PROPN", "tend": "VERB", "touched": "VERB", "closely": "ADV", "holga": "PROPN", "horace": "PROPN", "185": "NUM", "1647": "NUM", "majestically": "ADV", "detailed": "ADJ", "%": "SYM", "713-790-2605": "NUM", "scholastic": "ADJ", "basket": "NOUN", "rounded": "VERB", "basing": "VERB", "commanding": "ADJ", "1": "NUM", "o'connell": "PROPN", "pd": "PROPN", "nabil": "PROPN", "http://www.blueoakstables.com/breyerhorsebarns_barn003.asp": "PROPN", "arch-enemy": "NOUN", "affected": "VERB", "36647": "NUM", "heil": "PROPN", "retardation": "NOUN", "month": "NOUN", "sideways": "ADV", "practical": "ADJ", "feverishly": "ADV", "progressively": "ADV", "1225": "NUM", "ansi-92": "PROPN", "circulated": "VERB", "analgesic": "ADJ", "fitfully": "ADV", "beaver": "NOUN", "workable": "ADJ", "drunkest": "ADJ", "mailto:mayur...@yahoo.com": "PROPN", "03:33": "NUM", "chevron": "PROPN", "turned-up": "ADJ", "restraint": "NOUN", "sunnis": "PROPN", "charging": "VERB", "obtaining": "VERB", "antiquated": "ADJ", "christians": "PROPN", "hold": "VERB", "funen": "PROPN", "saddamites": "PROPN", "odd": "ADJ", "spotted": "VERB", "mike": "PROPN", "poterin": "PROPN", "conrad": "PROPN", "liars": "NOUN", "tees": "NOUN", "bart": "PROPN", "took": "VERB", "tempting": "ADJ", "asshole": "NOUN", "periodically": "ADV", "http://www.disinfo.com/archive/pages/dossier/id334/pg1/": "PROPN", "reopened": "VERB", "nourishing": "ADJ", "cons": "NOUN", "glorious": "ADJ", "mine": "PRON", "lombardy": "PROPN", "spence": "PROPN", "equally": "ADV", "ringed": "ADJ", "whence": "ADV", "circumstances": "NOUN", "bulk": "NOUN", "underage": "ADJ", "later": "ADV", "privy": "NOUN", "essg": "PROPN", "1967": "NUM", "resisted": "VERB", "feature": "NOUN", "lund": "PROPN", "manually": "ADV", "dongle": "NOUN", "hartpury": "PROPN", "bottoms": "NOUN", "precaution": "NOUN", "socialization": "NOUN", "descends": "VERB", "weathered": "ADJ", "unavoidable": "ADJ", "differ": "VERB", "8": "NUM", "lap": "NOUN", "0.70": "NUM", "keeps": "VERB", "rioted": "VERB", "unity": "NOUN", "columbia": "PROPN", "availed": "VERB", "nicks": "NOUN", "unfinished": "ADJ", "skinny": "ADJ", "thieves": "NOUN", "humiliation": "NOUN", "so-called": "VERB", "indoors": "ADV", "jumbo": "NOUN", "!": "PUNCT", "printers": "NOUN", "planned": "VERB", "chapel": "NOUN", "turntable": "NOUN", "pov": "NOUN", "cousin": "NOUN", "if": "SCONJ", "induces": "VERB", "rocking": "VERB", "alludes": "VERB", "hnd": "NOUN", "ideation": "NOUN", "sections": "NOUN", "viva": "PROPN", "factors": "NOUN", "sights": "NOUN", "baking": "NOUN", "productively": "ADV", "artists": "NOUN", "hook": "NOUN", "slipstream": "NOUN", "territory": "NOUN", "calvin": "PROPN", "tna": "PROPN", "bringing": "VERB", "voluptuous": "ADJ", "tempura": "NOUN", "worshipers": "NOUN", "04/16/2001": "NUM", "petruck": "PROPN", "reza": "PROPN", "aficionados": "NOUN", "downstream": "ADJ", "flowers": "NOUN", "convergence": "NOUN", "mouthpiece": "NOUN", "24,000": "NUM", "spreadingsantorum.com": "PROPN", "honeymoon": "NOUN", "5249025": "NUM", "flakes": "NOUN", "insisted": "VERB", "joint": "ADJ", "trade": "NOUN", "dismiss": "VERB", "mines": "NOUN", "splashed": "VERB", "chaman": "PROPN", "vegetarians": "NOUN", "adults": "NOUN", "marcie": "PROPN", "interprets": "VERB", "styles": "NOUN", "briefcase": "NOUN", "pavements": "NOUN", "yemenia": "PROPN", "higuchi": "PROPN", "insets": "NOUN", "cester": "PROPN", "contemporaries": "NOUN", "spotlights": "NOUN", "grades": "NOUN", "proto-language": "NOUN", "crowleyan": "ADJ", "bassam": "PROPN", "zafra": "PROPN", "psychedelic": "ADJ", "ld2d-#69381-1.doc": "NOUN", "acoustic": "ADJ", "saxon": "ADJ", "embodying": "VERB", "settings": "NOUN", "venetia": "PROPN", "caloy": "PROPN", "maids": "NOUN", "unknowns": "NOUN", "fumarase": "NOUN", "noted": "VERB", "influenza": "NOUN", "prerequisite": "NOUN", "moral": "ADJ", "09:37": "NUM", "56": "NUM", "caribou": "NOUN", "query": "NOUN", "marsha": "PROPN", "polish": "ADJ", "riches": "NOUN", "stables": "NOUN", "saws": "NOUN", "henley": "PROPN", "flickering": "VERB", "angrily": "ADV", "robot": "NOUN", "misty": "ADJ", "suburb": "NOUN", "weeping": "NOUN", "on": "ADP", "regretting": "VERB", "surge": "NOUN", "admonished": "VERB", "incumbent": "ADJ", "knees": "NOUN", "pullers": "NOUN", "12-20-00.doc": "NOUN", "*****": "PUNCT", "908": "NUM", "to's": "NOUN", "resolution": "NOUN", "accounted": "VERB", "jungwook": "PROPN", "governing": "VERB", "sizable": "ADJ", "34": "NUM", "hauling": "VERB", "cisco": "PROPN", "spread": "VERB", "567.77": "NUM", "lawn": "NOUN", "hurled": "VERB", "pyramids": "NOUN", "cimartinez@flog.uned.es": "PROPN", "reformer": "NOUN", "literature": "NOUN", "stereotype": "NOUN", "steers": "NOUN", "chicken": "NOUN", "circled": "VERB", "starfighters": "NOUN", "warlords": "NOUN", "pre-cut": "VERB", "estonian": "ADJ", "doubt": "NOUN", "\"\"": "PUNCT", "should": "AUX", "sancho": "PROPN", "excessive": "ADJ", "even": "ADV", "parmesan": "PROPN", "diversification": "NOUN", "sergey": "PROPN", "marauders": "PROPN", "wakare": "PROPN", "diligent": "ADJ", "troughs": "NOUN", "c.i.a.": "PROPN", "grocery": "NOUN", "416-865-3700": "NUM", "toe": "NOUN", "parakeet": "NOUN", "liberia": "PROPN", "warned": "VERB", "harmonious": "ADJ", "metro": "PROPN", "emperor": "NOUN", "ds": "PROPN", "spokesperson": "NOUN", "answered": "VERB", "disintegration": "NOUN", "shires": "PROPN", "uniformed": "ADJ", "dwarfs": "NOUN", "163": "NUM", "toledo": "PROPN", "populace": "NOUN", "liberal": "ADJ", "counteracts": "VERB", "biting": "VERB", "asia": "PROPN", "wording": "NOUN", "instinctively": "ADV", "threw": "VERB", "urine": "NOUN", "holderness": "PROPN", "uofh": "PROPN", "pins": "NOUN", "mumbling": "VERB", "hanks": "NOUN", "postponed": "VERB", "typologies": "NOUN", "whhich": "PRON", "present": "ADJ", "coordination": "NOUN", "muster": "NOUN", "763736": "NUM", "madrid": "PROPN", "calm": "ADJ", "04:17": "NUM", "shipment": "NOUN", "harshly": "ADV", "antiwar": "ADJ", "cole": "PROPN", "disrespect": "NOUN", "emam": "PROPN", "statues": "NOUN", "newer": "ADJ", "proposes": "VERB", "hesitated": "VERB", "passes": "VERB", "especially": "ADV", "d": "PROPN", "britain": "PROPN", "graydon": "PROPN", "timber": "NOUN", "ipa": "NOUN", "piaget": "PROPN", "hating": "VERB", "seaweed": "NOUN", "uncaring": "ADJ", "woods": "NOUN", "scores": "NOUN", "milling": "NOUN", "jamaican": "ADJ", "sinking": "VERB", "proceeds": "NOUN", "amazes": "VERB", "sailor": "NOUN", "squeal": "NOUN", "analyzing": "VERB", "rulers": "NOUN", ".324": "NUM", "indifferent": "ADJ", "alchemical": "ADJ", "begged": "VERB", "wookie": "PROPN", "arranged": "VERB", "braverman": "PROPN", "structural": "ADJ", "individually": "ADV", "relaxing": "ADJ", "kendrick": "PROPN", "lecture": "NOUN", "madea": "VERB", "astonishment": "NOUN", "brainstorm": "VERB", "gansu": "PROPN", "penman": "PROPN", "90s": "NOUN", "waning": "VERB", "osler": "PROPN", "signalled": "VERB", "01:09:32": "NUM", "palps": "NOUN", "adjust": "VERB", "gazette": "PROPN", "asleep": "ADJ", "devices": "NOUN", "dunny": "NOUN", "nyc": "PROPN", "assistance": "NOUN", "replication": "NOUN", "master": "NOUN", "inalienable": "ADJ", "teen": "PROPN", "dwarf": "ADJ", "guaranty": "NOUN", "mutually": "ADV", "there": "PRON", "passive": "ADJ", "thrilled": "ADJ", "denied": "VERB", "sempra": "PROPN", "halter": "NOUN", "preferably": "ADV", "reassigns": "VERB", "galaxies": "NOUN", "compromise": "NOUN", "yasushi": "PROPN", "groove": "NOUN", "evaluations": "NOUN", "overflowed": "VERB", "intelligibility": "NOUN", "subsidies": "NOUN", "bunk": "NOUN", "avoided": "VERB", "claws": "NOUN", "tighten": "VERB", "chichen": "PROPN", "vacature": "NOUN", "broadly": "ADV", "silly": "ADJ", "replica": "NOUN", "ourselves": "PRON", "10:39:03": "NUM", "thinks": "VERB", "cpa": "NOUN", "ba'athist": "PROPN", "activated": "VERB", "benengali": "PROPN", "bu": "PROPN", "honka": "PROPN", "kusal": "PROPN", "monster": "NOUN", "provide": "VERB", "balconies": "NOUN", "80": "NUM", "tandem": "NOUN", "splendidly": "ADV", "heritage": "PROPN", "ration": "NOUN", "ironing": "VERB", "mukalla": "PROPN", "nonconventional": "ADJ", "polygamy": "NOUN", "experiments": "NOUN", "inferred": "VERB", "jerk": "NOUN", "consistent": "ADJ", "thick": "ADJ", "http://www.dailykos.com/story/2006/5/12/232746/857": "PROPN", "sounding": "VERB", "orchestra": "NOUN", "defanged": "VERB", "l-": "INTJ", "aghast": "ADJ", "rumpled": "ADJ", "forefront": "NOUN", "recreational": "ADJ", "innkeepers": "NOUN", "born": "VERB", "visualisations": "NOUN", "curse": "NOUN", "blower": "NOUN", "miracles": "NOUN", "guides": "NOUN", "metaphysical": "ADJ", "specially": "ADV", "ahmaud": "PROPN", "99": "NUM", "dario": "PROPN", "liberation": "PROPN", "prevented": "VERB", "affectation": "NOUN", "increase": "NOUN", "still": "ADV", "copper-brown": "ADJ", "stratagems": "NOUN", "doublethink": "NOUN", "guts": "NOUN", "florida": "PROPN", "lover": "NOUN", "semicolon": "NOUN", "glowing": "VERB", "separate": "ADJ", "screams": "NOUN", "appreciative": "ADJ", "enron.xls": "NOUN", "cast": "VERB", "phantom": "NOUN", "talked": "VERB", "receipt": "NOUN", "eluded": "VERB", "lagrange": "PROPN", "remembers": "VERB", "pros": "NOUN", "ecc": "PROPN", "rowling": "PROPN", "weakened": "VERB", "imperil": "VERB", "deadline": "NOUN", "postage": "NOUN", "o'clock": "ADV", "reccomend": "VERB", "governments": "NOUN", "tints": "NOUN", "nautical": "ADJ", "unilaterally": "ADV", "aimlessly": "ADV", "bartending": "VERB", "reactionary": "ADJ", "mongolian": "ADJ", "trainable": "ADJ", "trades": "NOUN", "lengthening": "VERB", "distracted": "VERB", "attendees": "NOUN", "aristocrat": "NOUN", "excellently": "ADV", "memon": "PROPN", "liquidweb": "PROPN", "jackie": "PROPN", "drafts": "NOUN", "tempe": "PROPN", "bicuspid": "ADJ", "provider": "NOUN", "312-666-2372": "NUM", "namaskar": "INTJ", "media": "NOUN", "dusted": "VERB", "liberated": "VERB", "digress": "VERB", "crumpled": "ADJ", "miscalculation": "NOUN", "specimens": "NOUN", "portugal": "PROPN", "unlocking": "VERB", "gpa": "NOUN", "lengths": "NOUN", "beak": "NOUN", "craziest": "ADJ", "vault": "NOUN", "pills": "NOUN", "skeptical": "ADJ", "d'ettorre": "PROPN", "equilibrium": "NOUN", "claude": "PROPN", "gal": "NOUN", "blazed": "VERB", "pall": "NOUN", "eliminating": "VERB", "hillocks": "NOUN", "adjudicated": "VERB", "terrex": "PROPN", "stakes": "NOUN", "movements": "NOUN", "unemployable": "ADJ", "standstill": "NOUN", "freedom": "NOUN", "obsession": "NOUN", "cleared": "VERB", "pledged": "VERB", "steadfast": "ADJ", "shrieked": "VERB", "diary": "PROPN", "charge": "VERB", "money": "NOUN", "conglomerate": "NOUN", "honest": "ADJ", "conduit": "NOUN", "antwerp": "PROPN", "chelan": "PROPN", "staircases": "NOUN", "league": "PROPN", "meek": "ADJ", "fbi": "PROPN", "collapsed": "VERB", "lynley": "PROPN", "sank": "VERB", "equitable": "ADJ", "jann": "PROPN", "eyelids": "NOUN", "hissy": "NOUN", "attraction": "NOUN", "tart": "ADJ", "longitudinal": "ADJ", "abstain": "VERB", "steered": "VERB", "embroidered": "ADJ", "motorist": "NOUN", "impose": "VERB", "p.m": "NOUN", "gregg": "PROPN", "extradition": "NOUN", "dingle": "PROPN", "became": "VERB", "persue": "VERB", "undergoing": "VERB", "morton": "PROPN", "philipe": "PROPN", "sponsered": "VERB", "heave": "VERB", "insist": "VERB", "positively": "ADV", "formulate": "VERB", "348": "NUM", "suez": "PROPN", "continent": "NOUN", "rhoderunner": "PROPN", "void": "NOUN", "spongy": "ADJ", "shower": "NOUN", "depicts": "VERB", "1520": "NUM", "cross": "PROPN", "refreshing": "VERB", "hereby": "ADV", "rollbacks": "NOUN", "baluchistan": "PROPN", "capes": "NOUN", "smithjones@ev1.net": "PROPN", "kilometers": "NOUN", "basya": "PROPN", "conditioned": "VERB", "usage": "NOUN", "une": "DET", "cabinets": "NOUN", "vi": "NUM", "section": "NOUN", "molten": "ADJ", "outlets": "NOUN", "u.k.": "PROPN", "competence": "NOUN", "kibbutznik": "NOUN", "nagged": "VERB", "bath": "NOUN", "terror": "NOUN", "politisized": "VERB", "challenger": "PROPN", "hjalmar": "PROPN", "signatory": "NOUN", "cowered": "VERB", "socialists": "PROPN", "flour": "NOUN", "clump": "NOUN", "trading": "NOUN", "hm-m": "INTJ", "intensity": "NOUN", "travelers": "NOUN", "alone": "ADV", "imperceptible": "ADJ", "extremely": "ADV", "16.2": "NUM", "often": "ADV", "marvelously": "ADV", "confident": "ADJ", "overalls": "NOUN", "peekaboo": "PROPN", "links": "NOUN", "ontario": "PROPN", "lutheran": "ADJ", "petition": "NOUN", "ports": "NOUN", "hazards": "NOUN", "vaulted": "VERB", "stand-ins": "NOUN", "enronr~1.doc": "NOUN", "unequal": "ADJ", "netflix": "PROPN", "proclaimed": "VERB", "barcodes": "NOUN", "um": "INTJ", "03/04/2001": "NUM", "aloud": "ADV", "fantasies": "NOUN", "calendars": "NOUN", "existed": "VERB", "aliases": "NOUN", "smelled": "VERB", "contemplate": "VERB", "woking": "PROPN", "engineer": "NOUN", "meadowlarks": "NOUN", "3.75": "NUM", "irresistible": "ADJ", "lava": "NOUN", "modern": "ADJ", "disturb": "VERB", "sofas": "NOUN", "editor": "NOUN", "pamphlets": "NOUN", "suppose": "VERB", "twisting": "ADJ", "democrat": "ADJ", "eesi": "NOUN", "unrealistic": "ADJ", "latin": "ADJ", "solent": "PROPN", "topographic": "ADJ", "sandi": "PROPN", "pyjamas": "NOUN", "supper": "NOUN", "sandbags": "NOUN", "handlebar": "NOUN", "professionalism": "NOUN", "frederick": "PROPN", "am": "AUX", "unsightly": "ADJ", "seeming": "ADJ", "rearing": "NOUN", "ethink": "PROPN", "detectable": "ADJ", "displace": "VERB", "disconnect": "VERB", "tristram": "PROPN", "cocktails": "NOUN", "manipal": "PROPN", "cuddly": "ADJ", "congratulated": "VERB", "hobbes": "PROPN", "outlook": "NOUN", "plunderers": "NOUN", "metabolism": "NOUN", "socially": "ADV", "principia": "PROPN", "sufficient": "ADJ", "customizing": "VERB", "937,000": "NUM", "choosing": "VERB", "tozzini": "PROPN", "sounds": "VERB", "k.c.": "PROPN", "jamming": "VERB", "unmediated": "ADJ", "panamal": "PROPN", "departments": "NOUN", "barrel": "NOUN", "climaxed": "VERB", "jan": "PROPN", "grammar": "NOUN", "muskogee": "PROPN", "apologize": "VERB", "arterials": "NOUN", "renegotiate": "VERB", "thai": "ADJ", "neon-lit": "ADJ", "hecs": "PROPN", "calcutta": "PROPN", "suit": "NOUN", "salesman": "NOUN", "irritates": "VERB", "shines": "VERB", "clapping": "VERB", "paradigms": "NOUN", "http://www.antifraudcentre-centreantifraude.ca/english/home-eng.html": "PROPN", "fischer": "PROPN", "drifters": "NOUN", "tournament": "NOUN", "luxembourg": "PROPN", "username": "NOUN", "priorities": "NOUN", "bahamas": "PROPN", "hav": "VERB", "reports": "NOUN", "22s": "NOUN", "launched": "VERB", "killer": "NOUN", "thinner": "ADJ", "stéphanie": "PROPN", "moist": "ADJ", "meaningless": "ADJ", "moved": "VERB", "implications": "NOUN", "billiards": "NOUN", "added": "VERB", "readership": "NOUN", "ncfa": "PROPN", "debaathification": "PROPN", "veg": "NOUN", "active": "ADJ", "hats": "NOUN", "scammer": "NOUN", "pushing": "VERB", "absent": "ADJ", "trees": "NOUN", "mission": "NOUN", "obstruction": "NOUN", "ce": "NOUN", "frantic": "ADJ", "businessmen": "NOUN", "muck": "PROPN", "royal": "ADJ", "43": "NUM", "westjet": "PROPN", "volunteered": "VERB", "responsibilities": "NOUN", "stall": "VERB", "missive": "NOUN", "stomped": "VERB", "went": "VERB", "jimmy": "PROPN", "topped": "VERB", "04:50": "NUM", "stretch": "NOUN", "slightest": "ADJ", "grapefruit": "NOUN", "slips": "VERB", "unpleasantly": "ADV", "ackles": "PROPN", "gore": "PROPN", "methodius": "PROPN", "heartedly": "ADV", "handsomely": "ADV", "1561": "NUM", "chicago": "PROPN", "mandros": "PROPN", "news": "NOUN", "wud": "AUX", "decide": "VERB", "panda": "PROPN", "huh": "INTJ", "anticipation": "NOUN", "boats": "NOUN", "fecundity": "NOUN", "aeromexico": "PROPN", "2014": "NUM", ".?": "PUNCT", "dependent": "ADJ", "pension": "NOUN", "senate": "PROPN", "abolished": "VERB", "pf-": "INTJ", "nested": "ADJ", "202.785.0786": "NUM", "chosen": "VERB", "scallops": "NOUN", "lihaibi": "PROPN", "sh*t": "NOUN", "tenn": "PROPN", "deworming": "NOUN", "elongate": "VERB", "tall": "ADJ", "tool": "NOUN", "fax.": "NOUN", "encircle": "VERB", "fallen": "VERB", "re-elected": "VERB", "nutrient": "NOUN", "orleans": "PROPN", "righ-": "NOUN", "skilled": "ADJ", "___________": "PUNCT", "campsite": "NOUN", "indistinguishable": "ADJ", "http://www.restaurant.com": "PROPN", "gracee": "PROPN", "demanded": "VERB", "paradigm": "NOUN", "robber": "NOUN", "by-sa": "PROPN", "ventilated": "VERB", "look": "VERB", "mantar": "PROPN", "holidays": "NOUN", "yaay": "INTJ", "non-functional": "ADJ", "oyster": "NOUN", "trophies": "NOUN", "witsel": "PROPN", "lipstick": "NOUN", "jaime": "PROPN", "dslr": "NOUN", "min-woo": "PROPN", "1492": "NUM", "singles": "NOUN", "xxx": "NOUN", "greenhouse": "NOUN", "flaw": "NOUN", "atrocities": "NOUN", "problematic": "ADJ", "canapés": "NOUN", "unmarried": "ADJ", "polat": "PROPN", "freighter": "NOUN", "zones": "NOUN", "2000s": "NOUN", "womanizer": "NOUN", "°": "NOUN", "lasted": "VERB", "filipino": "ADJ", "recover": "VERB", "housemother": "NOUN", "reprimand": "NOUN", "polo": "NOUN", "colors": "NOUN", "horomona": "PROPN", "dominant": "ADJ", "postural": "ADJ", "loops": "NOUN", "newcomers": "NOUN", "wood": "NOUN", "andorra": "PROPN", "beginning": "NOUN", "terrorism": "NOUN", "no-8": "NUM", "obstacles": "NOUN", "brought": "VERB", "persistent": "ADJ", "electron": "NOUN", "gnosticism": "PROPN", "charter": "PROPN", "hurting": "VERB", "atm": "ADV", "adult": "NOUN", "mid": "NOUN", "thamir": "PROPN", "sheer": "ADJ", "x34703": "NOUN", "sensation": "NOUN", "was": "AUX", "describes": "VERB", "ursula": "PROPN", "prologue": "NOUN", "sucks": "VERB", "ivory": "NOUN", "llm": "NOUN", "plausible": "ADJ", "cycles": "NOUN", "laguardia": "PROPN", "impossible": "ADJ", "madness": "NOUN", "willows": "NOUN", "usurp": "VERB", "siphoned": "VERB", "shared": "VERB", "pueblo": "PROPN", "wage": "NOUN", "scott": "PROPN", "conditons": "NOUN", "distinguishing": "ADJ", "moines": "PROPN", "prop": "VERB", "erase": "VERB", "santa": "PROPN", "clockwork": "PROPN", "calzolari": "PROPN", "ideally": "ADV", "whipped": "VERB", "beads": "NOUN", "reversal": "NOUN", "inscriptions": "NOUN", "epm": "NOUN", "saffavid": "PROPN", "holocaust": "PROPN", "ar": "AUX", "1200": "NUM", "yer": "PRON", "11.30": "NUM", "ring": "NOUN", "psychiatry": "PROPN", "tianjin": "PROPN", "turgid": "ADJ", "readability": "NOUN", "scruff": "NOUN", "ḥadīd": "PROPN", "yelped": "VERB", "sausages": "NOUN", "=)": "SYM", "armenian": "ADJ", "appear": "VERB", "smartest": "ADJ", "patrick": "PROPN", "kinds": "NOUN", "traffic": "NOUN", "managers": "NOUN", "claimed": "VERB", "04/30/2001": "NUM", "negating": "VERB", "pathalias": "NOUN", "mentioning": "VERB", "resond": "VERB", "maid": "NOUN", "conflagration": "NOUN", "examines": "VERB", "friday": "PROPN", "intial": "ADJ", "phx": "PROPN", "equips": "VERB", "assault": "NOUN", "14": "NUM", "purple": "ADJ", "hotter": "ADJ", "tantalising": "VERB", "mid-july": "PROPN", "destruction": "NOUN", "suspicion": "NOUN", "prostitute": "NOUN", "hometown": "NOUN", "admitting": "VERB", "rating": "NOUN", "iterations": "NOUN", "grandchildren": "NOUN", "dysfunctional": "ADJ", "haunt": "VERB", "extraterrestrial": "ADJ", "iw": "PRON", "affectionately": "ADV", "grissom": "PROPN", "thresholds": "NOUN", "per": "ADP", "phenological": "ADJ", "phyllis": "PROPN", "tighter": "ADJ", "refrigerators": "NOUN", "conundrum": "NOUN", "erie": "PROPN", "summary": "NOUN", "11:34": "NUM", "predecessor": "NOUN", "paperclips": "NOUN", "sellafield": "PROPN", "scratched": "VERB", "d.c.": "PROPN", "coahuila": "PROPN", "possession": "NOUN", "ware": "PROPN", "technological": "ADJ", "police": "NOUN", "labour": "PROPN", "neighborhood": "NOUN", "ozone": "NOUN", "ispat": "PROPN", "advises": "VERB", "mayur": "PROPN", "unwonted": "ADJ", "poster": "NOUN", "comps.": "NOUN", "activist": "NOUN", "explore": "VERB", "uniforms": "NOUN", "wrinkled": "ADJ", "dressing": "NOUN", "girlie": "ADJ", "kosher-beef": "NOUN", "catedral": "PROPN", "entire": "ADJ", "spurt": "NOUN", "gestures": "NOUN", "claire": "PROPN", "struck": "VERB", "pitiful": "ADJ", "facility": "NOUN", "fuzzy": "ADJ", "bloodying": "VERB", "laundry": "NOUN", "cozumel": "PROPN", "........": "PUNCT", "renaissance": "PROPN", "tapering": "VERB", "sharif": "PROPN", "chest": "NOUN", "mcmasters": "PROPN", "caucasian": "ADJ", "joined": "VERB", "entartete": "PROPN", "canape's": "NOUN", "packs": "NOUN", "memoir": "NOUN", "beware": "VERB", "place": "NOUN", "handle": "VERB", "sms": "NOUN", "violence": "NOUN", "sessions": "NOUN", "retreat": "NOUN", "fussy": "ADJ", "270": "NUM", "team": "NOUN", "sham": "NOUN", "a.m": "NOUN", "http://www.loveallpeople.org": "PROPN", "etc": "NOUN", "tooted": "VERB", "surf": "NOUN", "regards": "NOUN", "breath": "NOUN", "saving": "VERB", "stealing": "VERB", "trephena": "NOUN", "outraged": "ADJ", "safavid": "PROPN", "taj": "PROPN", "tongue": "NOUN", "nestling": "VERB", "explicit": "ADJ", "causing": "VERB", "feild": "NOUN", "single": "ADJ", "those": "DET", "gemma": "PROPN", "reine": "PROPN", "heeded": "VERB", "unimaginative": "ADJ", "overlooked": "VERB", "alps": "PROPN", "hack": "VERB", "suttle": "PROPN", "rfi": "NOUN", "typifies": "VERB", "international": "ADJ", "groups": "NOUN", "able": "ADJ", "leaned": "VERB", "wrote": "VERB", "soaked": "VERB", "changing": "VERB", "wonderfully": "ADV", "adorned": "VERB", "th-thank": "VERB", "only": "ADV", "201-592-4699": "NUM", "censor": "VERB", "champagne": "NOUN", "321": "NUM", "usefulness": "NOUN", "fellow": "ADJ", "proximity": "NOUN", "dialect": "NOUN", "sleeves": "NOUN", "exquisite": "ADJ", "socky": "PROPN", "marae": "PROPN", "jurisdiction": "NOUN", "taylors": "PROPN", "1738": "NUM", "cintra": "PROPN", "minnesota": "PROPN", "society": "NOUN", "macrocosm": "NOUN", "gonzaga": "PROPN", "stumps": "NOUN", "apathy": "NOUN", "albanian": "ADJ", "tranquillity": "NOUN", "scheme": "NOUN", "3,800": "NUM", "regenesis": "PROPN", "materials": "NOUN", "jāmé": "PROPN", "crashes": "VERB", "extensively": "ADV", "sen.": "PROPN", "consensus": "NOUN", "puzzles": "NOUN", "resign": "VERB", "waiver": "NOUN", "will": "AUX", "ashton": "PROPN", "stored": "VERB", "46c1": "PROPN", "undermining": "VERB", "reorg": "NOUN", "confirm": "VERB", "cicada": "NOUN", "inflate": "VERB", "scandal": "NOUN", "lowering": "VERB", "spike": "VERB", "luis": "PROPN", "pre-meeting": "ADJ", "reliable": "ADJ", "breakaway": "NOUN", "childlike": "ADJ", "slinking": "NOUN", "lies": "VERB", "barbecue": "NOUN", "shyness": "NOUN", "ã³l": "ADJ", "admittedly": "ADV", "weehawken": "PROPN", "inconvenienced": "VERB", "reinforces": "VERB", "christian": "ADJ", "scientist": "NOUN", "lung": "NOUN", "invading": "VERB", "tens": "NOUN", "cart": "NOUN", "envelopes": "NOUN", "victories": "NOUN", "grasped": "VERB", "grin": "NOUN", "nairobi": "PROPN", "appointed": "VERB", "peachstate": "PROPN", "walrus": "PROPN", "va": "PROPN", "vo": "PROPN", "posterior": "ADJ", "mug": "NOUN", "#technology": "PROPN", "demanding": "VERB", "dealer": "NOUN", "clan": "NOUN", "stevens": "PROPN", "definitions": "NOUN", "225": "NUM", "pacifying": "VERB", "scrap": "NOUN", "honesty": "NOUN", "halts": "NOUN", "jake": "PROPN", "uncut": "ADJ", "criterion": "NOUN", "criticized": "VERB", "dab": "PROPN", "assistant": "NOUN", "liquidweb.com": "PROPN", "fabulously": "ADV", "po": "NOUN", "postpone": "VERB", "ceo": "NOUN", "appeal": "NOUN", "trimmed": "VERB", "chairs": "NOUN", "62": "NUM", "12": "NUM", "anouilh": "PROPN", "you're": "PRON", "sasquatch": "PROPN", "manson": "PROPN", "neo-conservatives": "NOUN", "saddened": "VERB", "penetrate": "VERB", "coincidence": "NOUN", "12/27": "NUM", "fawn": "PROPN", "talmy": "PROPN", "ici": "PROPN", "smiling": "VERB", "undersized": "ADJ", "kenya": "PROPN", "emminence": "PROPN", "include": "VERB", "arrogantly": "ADV", "impenetrable": "ADJ", "http://www.binkyswoodworking.com/horsestable.php": "PROPN", "jellies": "NOUN", "fiftyfive": "NUM", "unpacking": "VERB", "arrange": "VERB", "overweight": "ADJ", "creations": "NOUN", "so": "ADV", "anti-semitism": "NOUN", "burial": "NOUN", "presume": "VERB", "vital": "ADJ", "gesturing": "VERB", "lucille": "PROPN", "clergy": "NOUN", "fernandez": "PROPN", "frayed": "ADJ", "06:02": "NUM", "1.6": "NUM", "harari": "PROPN", "mirth": "NOUN", "superintendant": "NOUN", "hence": "ADV", "transcend": "VERB", "contractual": "ADJ", "41": "NUM", "intertextualities": "NOUN", "cross-border": "ADJ", "cus": "SCONJ", "1/2": "NUM", "leasing": "PROPN", "7.15": "NUM", "neighbourly": "ADJ", "ocd": "PROPN", "mechanism": "NOUN", "accused": "VERB", "recitals": "NOUN", "incas": "PROPN", "formatted": "VERB", "dramatically": "ADV", "starve": "VERB", "del": "PROPN", "robbie": "PROPN", "ti": "PRON", "uncommitted": "ADJ", "tanning": "NOUN", "noninteractive": "ADJ", "smell": "NOUN", "montmartre": "PROPN", "glinted": "VERB", "pumping": "VERB", "aged": "ADJ", "expectancy": "NOUN", "bond": "NOUN", "nighstand": "NOUN", "declarations": "NOUN", "piotrkowska": "PROPN", "product": "NOUN", "scrambled": "VERB", "21,000": "NUM", "harp": "NOUN", "suburbs": "NOUN", "instructors": "NOUN", "vietnamese": "ADJ", "3,000": "NUM", "1932": "NUM", "conversational": "ADJ", "merseybeat": "NOUN", "leitmotivs": "NOUN", "lik": "ADP", "despite": "ADP", "nutrients": "NOUN", "til": "ADP", "dixam": "PROPN", "190": "NUM", "1930’s": "PROPN", "discriminatory": "ADJ", "detectives": "NOUN", "1614": "NUM", "inky": "ADJ", "louvre": "PROPN", "imbued": "VERB", "neither": "CCONJ", "defeat": "VERB", "handwritten": "ADJ", "edu": "PROPN", "confidence": "NOUN", "dismissed": "VERB", "drifted": "VERB", "....": "PUNCT", "neil": "PROPN", "wreck": "NOUN", "pmid": "PROPN", "packages": "NOUN", "ch-": "INTJ", "segregationists": "NOUN", "robust": "ADJ", "breakdown": "NOUN", "presto": "PROPN", "theory": "NOUN", "lacks": "VERB", "clerics": "NOUN", "paganism": "PROPN", "1579": "NUM", "placid": "ADJ", "ny": "PROPN", "gerry": "PROPN", "monetary": "ADJ", "forecast": "VERB", "582": "NUM", "wal": "PROPN", "bombast": "NOUN", "vindication": "NOUN", "sisal": "NOUN", "gnarled": "ADJ", "aye": "INTJ", "giannini": "PROPN", "basils": "NOUN", "adolescents": "NOUN", "guilty": "ADJ", "hoss": "NOUN", "louis": "PROPN", "paradox": "NOUN", "backbiting": "VERB", "damascus": "PROPN", "baileys": "PROPN", "taunts": "NOUN", "graze": "VERB", "journey": "NOUN", "properly": "ADV", "reused": "VERB", "intelligible": "ADJ", "prevention": "NOUN", "www.risk-conferences.com/risk2001aus": "PROPN", "walks": "VERB", "glue": "NOUN", "cop": "NOUN", "patiently": "ADV", "montavano": "PROPN", "voices": "NOUN", "fandom": "NOUN", "aunt": "NOUN", "prudential": "ADJ", "older": "ADJ", "pleaure": "NOUN", "deceptive": "ADJ", "colonialism": "NOUN", "dental": "ADJ", "meps": "NOUN", "barbershops": "NOUN", "artless": "ADJ", "context": "NOUN", "exterminated": "VERB", "clamps": "NOUN", "http://lllreptile.com/store/catalog/reptile-supplies/uvb-fluorescent-lights-mercury-vapor-bulbs/-/zoo-med-24-repti-sun-100-fluorescent-bulb/": "PROPN", "cheek": "NOUN", "fill": "VERB", "pesky": "ADJ", "outlived": "VERB", "overcrowded": "ADJ", "iraqiyah": "PROPN", "equality": "NOUN", "croft": "PROPN", "shortness": "NOUN", "#food": "PROPN", "prohibition": "NOUN", "assailant": "NOUN", "death": "NOUN", "explanatory": "ADJ", "389,950": "NUM", "mobile": "ADJ", "laborers": "NOUN", "drift": "VERB", "oysters": "NOUN", "helps": "VERB", "pancreatitis": "NOUN", "recruited": "VERB", "anybody": "PRON", "lucrative": "ADJ", "promises": "NOUN", "avian": "ADJ", "anti-establishment": "ADJ", "2.3": "NUM", "masterpieces": "NOUN", "faxed": "VERB", "endeavour": "NOUN", "1.888.509.3736": "NUM", "held": "VERB", "hopless": "ADJ", "falsehoods": "NOUN", "partisan": "ADJ", "scriptural": "ADJ", "masterminds": "NOUN", "fulfilled": "VERB", "dull": "ADJ", "adriatic": "ADJ", "milf": "PROPN", "heedless": "ADJ", "futuristic": "ADJ", "e.g.": "ADV", "sullivan": "PROPN", "pool": "NOUN", "rents": "NOUN", "hailstorm": "NOUN", "navel": "NOUN", "intelligent": "ADJ", "caustic": "ADJ", "armored": "ADJ", "acting": "VERB", "therapist": "NOUN", "hurrying": "VERB", "surounded": "VERB", "spoon": "NOUN", "snow-white": "ADJ", "buns": "NOUN", "relations": "NOUN", "appetizers": "NOUN", "ie9": "PROPN", "piccadilla": "PROPN", "hdtv": "NOUN", "lucia": "PROPN", "aphorisms": "NOUN", "u.t.": "PROPN", "yearning": "VERB", "separately": "ADV", "thingy": "NOUN", "welcomes": "VERB", "10,000.00": "NUM", "euler": "PROPN", "calibrated": "VERB", "trend": "NOUN", "headaches": "NOUN", "pls": "INTJ", "ak": "PROPN", "alt.animals.felines.snowleopards": "NOUN", "owned": "VERB", "obligations": "NOUN", "nerds": "NOUN", "confronting": "VERB", "moss": "NOUN", "socks": "NOUN", "pre-season": "NOUN", "destined": "ADJ", "summarised": "VERB", "1.3": "NUM", "anti-army": "ADJ", "sickness": "NOUN", "criticised": "VERB", "chs": "PROPN", "quilis": "PROPN", "abusing": "VERB", "microscopic": "ADJ", "samchawk@aol.com": "PROPN", "penitentiary": "NOUN", "login": "NOUN", "valverde": "PROPN", "aggregation": "NOUN", "sonny": "NOUN", "paperback": "PROPN", "rosenberg": "PROPN", "phenology": "NOUN", "gnocchi": "NOUN", "contemporary": "ADJ", "creek": "PROPN", "apostle": "PROPN", "climb": "VERB", "neighbour": "NOUN", "concepts": "NOUN", "microsoft": "PROPN", "etiquette": "NOUN", "1933": "NUM", "touching": "VERB", "touches": "NOUN", "family": "NOUN", "dobby": "PROPN", "automatic": "ADJ", "angeles": "PROPN", "heartily": "ADV", "fifty": "NUM", "09/16/99": "NUM", "visions": "NOUN", "instantly": "ADV", "writer": "NOUN", "fatal": "ADJ", "followers": "NOUN", "tickled": "VERB", "11/29/00": "NUM", "ft": "NOUN", "ascendance": "NOUN", "youtuber": "PROPN", "polluter": "NOUN", "deserts": "NOUN", "10/26/2000": "NUM", "groaned": "VERB", "canal": "NOUN", "toxins": "NOUN", "birdy": "NOUN", "normalcy": "NOUN", "gauls": "NOUN", "anticipating": "VERB", "sophomore": "NOUN", "accuracies": "NOUN", "deposited": "VERB", "rhino": "NOUN", "elsewise": "ADV", "insignias": "NOUN", "flourishing": "VERB", "thanking": "VERB", "phoenix": "PROPN", "cleric": "NOUN", "intervention": "NOUN", "struggled": "VERB", "voluntarily": "ADV", "yr": "NOUN", "performer": "NOUN", "emmy": "PROPN", "useless": "ADJ", "colette": "PROPN", "ul": "PROPN", "collar": "NOUN", "carpet": "NOUN", "iran": "PROPN", "bay": "PROPN", "décor": "NOUN", "what": "PRON", "nascent": "ADJ", "pagen": "ADJ", "admissions": "NOUN", "yonhap": "PROPN", "impression": "NOUN", "alaska": "PROPN", "prepaid": "VERB", "hilltops": "NOUN", "fancied": "VERB", "100,000": "NUM", "harmonize": "VERB", "touting": "VERB", "driver": "NOUN", "balsa": "NOUN", "studio": "NOUN", "emphasizes": "VERB", "350": "NUM", "vapor": "NOUN", "definitive": "ADJ", "wheeled": "VERB", "moxon": "PROPN", "#causalargument": "PROPN", "constructivist": "ADJ", "sombre": "ADJ", "militant": "ADJ", "cookie": "NOUN", "outfitting": "VERB", "rests": "VERB", "shepherd": "NOUN", "indifference": "NOUN", "creaks": "VERB", "4,700": "NUM", "protecting": "VERB", "genitals": "NOUN", "wednesday": "PROPN", "providence": "PROPN", "connection": "NOUN", "staunch": "ADJ", "creational": "ADJ", "witnessed": "VERB", "preachers": "NOUN", "grille": "PROPN", "bitching": "VERB", "dyed": "ADJ", "glimpse": "NOUN", "stressed": "VERB", "clambered": "VERB", "tsinghua": "PROPN", "94720-5180": "NUM", "town": "NOUN", "dessert": "NOUN", "10,000": "NUM", "resting": "NOUN", "shoo": "VERB", "drama": "NOUN", "inland": "ADV", "dear": "ADJ", "fax": "NOUN", "mistake": "NOUN", "sinhalese": "ADJ", "taft": "PROPN", "panting": "VERB", "usual": "ADJ", "padalecki": "PROPN", "localities": "NOUN", "longest": "ADJ", "mozart": "PROPN", "57": "NUM", "cei": "PROPN", "expose": "VERB", "bienvenue": "PROPN", "82": "NUM", "hebrew": "ADJ", "snatches": "VERB", "abolish": "VERB", "hams": "NOUN", "pinkerton": "PROPN", "hibernation": "NOUN", "mcginnis": "PROPN", "javascript": "NOUN", "puns": "NOUN", "malfoy": "PROPN", "6th": "NOUN", "snapping": "VERB", "dropped": "VERB", "bonosus": "PROPN", "palatine": "PROPN", "seared": "VERB", "slacked": "VERB", "ambulances": "NOUN", "ml": "NOUN", "hai": "PROPN", "brunch": "NOUN", "infantry": "NOUN", "cotillion": "PROPN", "beginners": "NOUN", "425-415-3098": "NUM", "jawaharlal": "PROPN", "swallows": "NOUN", "avail": "NOUN", "walkway": "NOUN", "delight": "NOUN", "elaborated": "VERB", "warship": "NOUN", "csas": "NOUN", "notified": "VERB", "nostrils": "NOUN", "yale": "PROPN", "77.92": "NUM", "metrics": "NOUN", "correspondent": "NOUN", "confluence": "NOUN", "9th": "NOUN", "hindered": "VERB", "triumph": "NOUN", "1782": "NUM", "distract": "VERB", "manner": "NOUN", "01:50": "NUM", "goods": "NOUN", "version": "NOUN", "motley": "ADJ", "glided": "VERB", "220": "NUM", "dollar": "NOUN", "attitude": "NOUN", "sandwiches": "NOUN", "magnum": "PROPN", "reproductive": "ADJ", "89": "NUM", "bogaerts": "PROPN", "4600": "NUM", "pep": "NOUN", "lovin'": "NOUN", "70,000": "NUM", "structuralism": "PROPN", "leash": "NOUN", "binding": "NOUN", "satin-wood": "NOUN", "kindle": "PROPN", "engineers": "PROPN", "siege": "NOUN", "tape": "NOUN", "downfalls": "NOUN", "unclipped": "VERB", "adorable": "ADJ", "dragons": "NOUN", "finishing": "VERB", "learned": "VERB", "hat": "NOUN", "02": "NUM", "honorable": "ADJ", "ripe": "ADJ", "fizzle": "VERB", "liturgy": "NOUN", "bicycles": "NOUN", "vestry": "PROPN", "garnered": "VERB", "incur": "VERB", "chineese": "ADJ", "by": "ADP", "overwhelmingly": "ADV", "programme": "NOUN", "matt": "PROPN", "hurtling": "VERB", "undiscovered": "ADJ", "moslem": "ADJ", "loyal": "ADJ", "purchases": "NOUN", "quitted": "VERB", "completion": "NOUN", "kukulkan": "PROPN", "cause": "SCONJ", "renewed": "VERB", "regulate": "VERB", "heresy": "NOUN", "desperation": "NOUN", "souls": "NOUN", "jui": "PROPN", "merry": "ADJ", "susceptibility": "NOUN", "graphic": "ADJ", "crack": "NOUN", "twenty-mile": "NOUN", "mishap": "NOUN", "regency": "PROPN", "idly": "ADV", "durable": "ADJ", "saw": "VERB", "noticeable": "ADJ", "indicators": "NOUN", "marble": "NOUN", "endowments": "NOUN", "employable": "ADJ", "blossoms": "NOUN", "dope": "NOUN", "changecoordsys": "PROPN", "exporter": "NOUN", "radical": "ADJ", "processed": "VERB", "smail": "NOUN", "pines": "NOUN", "yucky": "ADJ", "towards": "ADP", "rueda": "PROPN", "activists": "NOUN", "zahā": "PROPN", "brazillian": "ADJ", "themes": "NOUN", "vigorously": "ADV", "spitting": "ADV", "discreet": "ADJ", "telling": "VERB", "acknowledging": "VERB", "name": "NOUN", "compson": "PROPN", "2020": "NUM", "enrique": "PROPN", "conv_050815c_03.10": "PROPN", "champion": "NOUN", "friedrich": "PROPN", "blogger": "NOUN", "swap": "NOUN", "basin": "NOUN", "gómez": "PROPN", "rearrange": "VERB", "traitress": "NOUN", "underwater": "NOUN", "emphasis": "NOUN", "averse": "ADJ", "chickie": "PROPN", "affluent": "ADJ", "taxed": "VERB", "flirted": "VERB", "boxer": "NOUN", "hispanic": "ADJ", "814014": "NUM", "coffman": "PROPN", "cue": "NOUN", "cremona": "PROPN", "mosquito": "NOUN", "citizenship": "NOUN", "moreso": "ADV", "strength": "NOUN", "tikrit": "PROPN", "!!!!!!!!!!": "PUNCT", "ck": "VERB", "facebook": "PROPN", "fro": "ADP", "00:20": "NUM", "constraints": "NOUN", "pasejo": "PROPN", "unemployed": "ADJ", "2,300": "NUM", "scooping": "VERB", "equip": "VERB", "annexed": "VERB", "cftc": "PROPN", "hmmmmmm": "INTJ", "launches": "VERB", "lax": "ADJ", "crawled": "VERB", "conservatory": "NOUN", "gilbert": "PROPN", "vince": "PROPN", "mertens": "PROPN", "very": "ADV", "raina": "PROPN", "intrigued": "VERB", "greensboro": "PROPN", "lip": "NOUN", "enforcement": "NOUN", "hush": "NOUN", "dodgy": "ADJ", "leak": "NOUN", "corns": "NOUN", "remarkably": "ADV", "thursday": "PROPN", "unused": "ADJ", "non-life-threatening": "ADJ", "expert": "NOUN", "puffy": "ADJ", "paling": "VERB", "5,000": "NUM", "national-level": "NOUN", "bricks": "NOUN", "dark": "ADJ", "facilities": "NOUN", "cordially": "ADV", "solicit": "VERB", "andreas": "PROPN", "483": "NUM", "adjustments": "NOUN", "b&b": "NOUN", "depend": "VERB", "compost": "NOUN", "m1": "PROPN", "grave": "NOUN", "highline": "NOUN", "yugoslavia": "PROPN", "pilots": "NOUN", "http://www.infoukes.com/history/chornobyl/elg/": "PROPN", "fostering": "VERB", "shitty": "ADJ", "lucas": "PROPN", "henry": "PROPN", "scattering": "VERB", "c.v": "PROPN", "mightily": "ADV", "lymphoma": "NOUN", "faces": "NOUN", "eve.": "NOUN", "means": "VERB", "takes": "VERB", "03:58": "NUM", "mouse": "NOUN", "meteorological": "ADJ", "playstation": "PROPN", "uncanny": "ADJ", "bruise": "NOUN", "unprocessed": "ADJ", "ext": "NOUN", "competitive": "ADJ", "runs": "VERB", "kuei": "PROPN", "94": "NUM", "a-": "INTJ", "aeroplane": "NOUN", "7th": "ADJ", "kaoshikii": "NOUN", "stoner": "NOUN", "dominique": "PROPN", "wonder": "VERB", "freaked": "VERB", "goofy": "ADJ", "dials": "NOUN", "gasped": "VERB", "anthrax": "NOUN", "ballot": "NOUN", "thur.": "PROPN", "uncapped": "ADJ", "genetics": "NOUN", "04:06:52": "NUM", "aiming": "VERB", "aceh": "PROPN", "picnics": "NOUN", "began": "VERB", "shawntas": "PROPN", "roads": "NOUN", "1920": "NUM", "mandatory": "ADJ", "devote": "VERB", "dulaym": "PROPN", "resource": "NOUN", "winning": "VERB", "charger": "VERB", "tomipilates": "PROPN", "mlle.": "PROPN", "fugitives": "NOUN", "opponent": "NOUN", "worship": "NOUN", "mercenaries": "NOUN", "silent": "ADJ", "afghanistan": "PROPN", "glowstick": "NOUN", "no-46": "NUM", "motherland": "NOUN", "glandular": "ADJ", "speadsheet": "NOUN", "tibco": "NOUN", "underneath": "ADV", "blinked": "VERB", "eavesdrop": "VERB", "deaths": "NOUN", "watergate": "PROPN", "thrace": "PROPN", "flat": "ADJ", "=": "SYM", "admiring": "VERB", "rachels": "PROPN", "66": "NUM", "sub-categories": "NOUN", "lurid": "ADJ", "posited": "VERB", "ideologue": "NOUN", "rim": "NOUN", "realistic": "ADJ", "mak": "PROPN", "iguazu": "PROPN", "anastasia": "PROPN", "bombarding": "VERB", "burning": "VERB", "truth": "NOUN", "hostel": "NOUN", "zouk": "NOUN", "ingram": "PROPN", "glob": "NOUN", "'72": "NUM", "limb": "NOUN", "tgif": "PROPN", "snug": "ADJ", "infected": "VERB", "detractors": "NOUN", "skill": "NOUN", "silk": "NOUN", "feared": "VERB", "pens": "NOUN", "lesson": "NOUN", "cavern": "PROPN", "chain": "NOUN", "gazed": "VERB", "hermitage": "PROPN", "exmearden": "PROPN", "excuse": "NOUN", "components": "NOUN", "canvas": "NOUN", "tear": "VERB", "coats": "NOUN", "mtle": "NOUN", "risotto": "NOUN", "heady": "ADJ", "medication": "NOUN", "equalising": "VERB", "overcome": "VERB", "acrimony": "NOUN", "shrii": "PROPN", "760,000": "NUM", "shucks": "INTJ", "acupuncturist": "NOUN", "greeter": "NOUN", "layman": "NOUN", "smuggling": "NOUN", "ferte": "PROPN", "ancestors": "NOUN", "lookout": "NOUN", "meditating": "VERB", "promised": "VERB", "incidentally": "ADV", "dod": "PROPN", "discomfiture": "NOUN", "hello": "INTJ", "lieutenant": "NOUN", "x3-9890": "NOUN", "03:51": "NUM", "thereafter": "ADV", "provoking": "ADJ", "commercialize": "VERB", "spy": "NOUN", "detrick": "PROPN", "repercussions": "NOUN", "tibia": "NOUN", "araujo": "PROPN", "hz": "NOUN", "process's": "NOUN", "http://www.ontario.ca/en/information_bundle/birthcertificates/119274.html": "PROPN", "ipn": "PROPN", "curiosity": "NOUN", "cutting": "VERB", "character": "NOUN", "philippine": "ADJ", "mate": "VERB", "amalgamation": "NOUN", "roam": "VERB", "staircase": "NOUN", "unmistakable": "ADJ", "discarded": "ADJ", "placate": "VERB", "report": "NOUN", "culture": "NOUN", "yamwhatiyam": "PROPN", "biogeochemistry": "NOUN", "fat": "ADJ", "futurity": "NOUN", "despondently": "ADV", "cheapest": "ADJ", "disgruntled": "ADJ", "eerie": "ADJ", "deleting": "VERB", "temperament": "NOUN", "darren": "PROPN", "rolled": "VERB", "yucatan": "PROPN", "gifts": "NOUN", "generalized": "ADJ", "shanks": "NOUN", "shivered": "VERB", "connectedness": "NOUN", "invented": "VERB", "nabbed": "VERB", "boisterous": "ADJ", "removal": "NOUN", "stamp": "NOUN", "productivity": "NOUN", "reps.": "NOUN", "extinct": "ADJ", "acrid": "ADJ", "calculating": "VERB", "expertly": "ADV", "relied": "VERB", "ulysses": "PROPN", "h-0045/99": "NUM", "centilli": "PROPN", "windscreen": "NOUN", "topic": "NOUN", "eisenhower": "PROPN", "yellow": "ADJ", "deceit": "NOUN", "cretins": "NOUN", "legitimate": "ADJ", "03/28/2001": "NUM", "800.713.8600": "NUM", "assumptions": "NOUN", "macro": "ADJ", "carters": "NOUN", "=(": "SYM", "footage": "NOUN", "59": "NUM", "aperture": "NOUN", "dismal": "ADJ", "hydrodynamica": "PROPN", "prc": "NOUN", "snaking": "VERB", "gentel": "ADJ", "jumbled": "VERB", "realize": "VERB", "mortification": "NOUN", "lagged": "VERB", "yassin": "PROPN", "scottsdale": "PROPN", "discounted": "VERB", "onomatopoeia": "NOUN", "30.00": "NUM", "exemptions": "NOUN", "advanced": "ADJ", "springer": "PROPN", "ie": "PROPN", "k/psu": "NOUN", "queenly": "ADJ", "diversion": "NOUN", "uhhh": "INTJ", "diesel": "NOUN", "4.99": "NUM", "beasts": "NOUN", "wa-": "INTJ", "riiight": "INTJ", "morality": "NOUN", "advice": "NOUN", "trafalgar": "PROPN", "syrupy": "ADJ", "constituent": "NOUN", "skater": "NOUN", "permitted": "VERB", "microphone": "NOUN", "gushing": "VERB", "complaints": "NOUN", "used": "VERB", "greek": "ADJ", "consulate": "PROPN", "measly": "ADJ", "kosas": "NOUN", "midtown": "PROPN", "chudnov": "PROPN", "340": "NUM", "co-operate": "VERB", "simmer": "VERB", "che": "PROPN", "shooting": "VERB", "napier": "PROPN", "enclosing": "VERB", "modest": "ADJ", "pos": "NOUN", "marginal": "ADJ", "co-parenting": "VERB", "eei": "NOUN", "ink": "NOUN", "levi`s": "PROPN", "knots": "NOUN", "straightening": "VERB", "screeching": "VERB", "boards": "NOUN", "forged": "VERB", "repubblica": "PROPN", "proposing": "VERB", "pace": "NOUN", "incessant": "ADJ", "gliders": "PROPN", "fees": "NOUN", "mɔʁo": "PROPN", "da": "PROPN", "smelly": "ADJ", "rippled": "VERB", "figuring": "VERB", "yam": "PROPN", "sake": "NOUN", "duality": "NOUN", "kinematics": "NOUN", "ronn": "PROPN", "evacuees": "NOUN", "120,000": "NUM", "dungarees": "NOUN", "logan": "PROPN", "sumatra": "PROPN", "network": "NOUN", "dictionary": "NOUN", "merging": "VERB", "jose": "PROPN", "logistical": "ADJ", "digimon": "PROPN", "phosphorous": "ADJ", "lara": "PROPN", "philology": "PROPN", "chris.germany@enron.com": "PROPN", "blurring": "VERB", "corrected": "VERB", "thrive": "VERB", "366": "NUM", "ample": "ADJ", "elections": "NOUN", "missions": "NOUN", "affirmed": "VERB", "01:35": "NUM", "cedar": "PROPN", "bohlin": "PROPN", "weasley": "PROPN", "7/16": "NUM", "conveyed": "VERB", "pursuant": "ADV", "08/03/2000": "NUM", "raisers": "NOUN", "slipped": "VERB", "freshly": "ADV", "invention": "NOUN", "linking": "VERB", "broadway": "PROPN", "http://herp-info.webs.com/beardeddragon.htm": "PROPN", "specialist": "NOUN", "farther": "ADV", "shout": "VERB", "furnished": "VERB", "1570": "NUM", "fraying": "VERB", "motorcycle": "NOUN", "guatemala": "PROPN", "vinyl": "ADJ", "fixing": "VERB", "frisbee": "NOUN", "unstained": "ADJ", "confidence-building": "NOUN", "lessons": "NOUN", "1984": "NUM", "injuries": "NOUN", "stickhandle": "VERB", "re-read": "VERB", "enabling": "VERB", "tiger": "PROPN", "unravelling": "VERB", "strangled": "VERB", "absenting": "VERB", "jugular": "NOUN", "continents": "NOUN", "1777": "NUM", "bean": "NOUN", "rico": "PROPN", "couter-cultural": "ADJ", "volgograd": "PROPN", "particlular": "ADJ", "anyone": "PRON", "oer": "PROPN", "felt": "VERB", "relativity": "NOUN", "sodium": "NOUN", "oppositon": "NOUN", "proliferation": "NOUN", "skydivers": "NOUN", "egg": "NOUN", "encompasses": "VERB", "shreveport": "PROPN", "8th": "NOUN", "modified": "VERB", "feb": "PROPN", "commissions": "NOUN", "progressive": "ADJ", "info@travelheels.dk": "PROPN", "yikes": "INTJ", "manure": "NOUN", "excite": "VERB", "policy": "NOUN", "gel-": "INTJ", "haphazard": "ADJ", "agent": "NOUN", "continuity": "NOUN", "solely": "ADV", "fears": "NOUN", "øhavets": "PROPN", "hissing": "ADJ", "observers": "NOUN", "dec.": "PROPN", "appearances": "NOUN", "botany": "NOUN", "chris": "PROPN", "manipulation": "NOUN", "calgary": "PROPN", "homo": "NOUN", "magnesium": "NOUN", "authoritative": "ADJ", "dignitaries": "NOUN", "disbanded": "VERB", "ebs": "PROPN", "livelihoods": "NOUN", "cheeks": "NOUN", "carnations": "NOUN", "repetition": "NOUN", "www.standfor.co.nz": "PROPN", "hatzidakis": "PROPN", "loudly": "ADV", "displays": "VERB", "karl": "PROPN", "bush": "PROPN", "shine": "NOUN", "search": "NOUN", "retiree": "NOUN", "rdbms": "PROPN", "display": "NOUN", "l2": "NOUN", "psychologist": "NOUN", "blueprint": "NOUN", "dominance": "NOUN", "attributed": "VERB", "greeks": "NOUN", "curbing": "VERB", "ichiyō": "PROPN", "convenient": "ADJ", "shit": "INTJ", "mohaqeq": "PROPN", "morne": "PROPN", "faded": "VERB", "tatters": "NOUN", "shirt": "NOUN", "countertop": "NOUN", "failure": "NOUN", "recurring": "VERB", "hugo": "PROPN", "definitely": "ADV", "experience": "NOUN", "thaks": "NOUN", "commanders": "NOUN", "meticulous": "ADJ", "gospel": "PROPN", "beau": "PROPN", "answetred": "VERB", "top": "NOUN", "happen": "VERB", "childish": "ADJ", "recklessness": "NOUN", "connected": "VERB", "ro-": "INTJ", "sec": "PROPN", "poring": "VERB", "trento": "PROPN", "droughts": "NOUN", "changes": "NOUN", "fact": "NOUN", "preamble": "NOUN", "ene": "PROPN", "duckworth": "PROPN", "photojournalism": "NOUN", "johann": "PROPN", "rainbow": "NOUN", "strings": "NOUN", "asparagus": "NOUN", "exponentially": "ADV", "maintains": "VERB", "wilt": "AUX", "herodian": "ADJ", "limit": "VERB", "participated": "VERB", "reason": "NOUN", "mediated": "VERB", "hoops": "NOUN", "healing": "VERB", "resolved": "VERB", "eunice": "PROPN", "pressure": "NOUN", "baltimore": "PROPN", "dart": "VERB", "idaho": "PROPN", "d’alesandro": "PROPN", "ancestry": "NOUN", "dandy": "NOUN", "shawna": "PROPN", "rounds": "NOUN", "unprofessional": "ADJ", "reserved": "ADJ", "reminder": "NOUN", "thirst": "NOUN", "shift": "NOUN", "influenced": "VERB", "sailors": "NOUN", "eats": "VERB", "tyrannius": "PROPN", "vacant": "ADJ", "olsens": "PROPN", "1945": "NUM", "conferred": "VERB", "prominent": "ADJ", "socials": "NOUN", "fee": "NOUN", "rotation": "NOUN", "distemper": "NOUN", "barred": "VERB", "inexhaustible": "ADJ", "joby": "PROPN", "met": "VERB", "alt.animals.lion": "NOUN", "fe": "PROPN", "woollens": "NOUN", "concentrated": "VERB", "vertically": "ADV", "athwart": "ADV", "removed": "VERB", "imagine": "VERB", "06:30": "NUM", "proceeded": "VERB", "sevil": "PROPN", "gullibility": "NOUN", "rescinded": "VERB", "smoker": "NOUN", "eighteen": "NUM", "swigs": "NOUN", "4:00": "NUM", "cancellations": "NOUN", "recreate": "VERB", "illustrious": "ADJ", "answer": "NOUN", "rays": "NOUN", "12.48": "NUM", "f": "PROPN", "notification": "NOUN", "www": "NOUN", "hassen": "PROPN", "waiing": "VERB", "panama": "PROPN", "high-carrying": "VERB", "coolness": "NOUN", "eden": "PROPN", "spectrophotometer": "NOUN", "posters": "NOUN", "hourly": "ADJ", "saintes": "PROPN", "gauzy": "ADJ", "ins": "PROPN", "wolves": "NOUN", "asymmetric": "ADJ", "toned": "VERB", "survival": "NOUN", "sullen": "ADJ", "shorty": "PROPN", "supplied": "VERB", "blackness": "NOUN", "periodizing": "NOUN", "perils": "NOUN", "kenny": "PROPN", "parochial": "ADJ", "gmat": "PROPN", "approving": "VERB", "arbitration": "PROPN", "doc": "NOUN", "nessasary": "ADJ", "debuted": "VERB", "malle": "PROPN", "3801a": "NOUN", "wore": "VERB", "fain": "ADV", "khymberly": "PROPN", "horton": "PROPN", "restocked": "VERB", "douglass": "PROPN", "morph": "VERB", "leverage": "NOUN", "gi": "NOUN", "membrane": "NOUN", "started": "VERB", "been": "AUX", "metastasis": "NOUN", "comments": "NOUN", "indulgences": "NOUN", "abnormality": "NOUN", "hagghier": "PROPN", "ignorance": "NOUN", "orbit": "NOUN", "cuts": "NOUN", "contract": "NOUN", "house-elves": "NOUN", "thankfully": "ADV", "ereader": "NOUN", "lazy": "ADJ", "860": "NUM", "mcauliffe": "PROPN", "admiration": "NOUN", "inaugural": "ADJ", "addressed": "VERB", ":-)": "SYM", "spidey": "PROPN", "cleanest": "ADJ", "6:30": "NUM", "amid": "ADP", "gale": "NOUN", "cross-functional": "ADJ", "delivers": "VERB", "whoo-hoo": "INTJ", "crispy": "ADJ", "instep": "PROPN", "alia": "PROPN", "09/17/99": "NUM", "713-853-3098": "NUM", "alla": "NOUN", "make-shift": "NOUN", "hoog": "PROPN", "vicki": "PROPN", "bowes": "PROPN", "+4550981306": "NUM", "w/o": "ADP", "horseshoe": "NOUN", "cows": "NOUN", "twice": "ADV", "wars": "PROPN", "o-": "INTJ", "llms": "NOUN", "stayed": "VERB", "plume": "NOUN", "currents": "NOUN", "prospect": "NOUN", "cloud9": "PROPN", "waiter": "NOUN", "06:16": "NUM", "alamo": "PROPN", "collects": "VERB", "10.0": "NUM", "125": "NUM", "shetland": "PROPN", "ogden": "PROPN", "re-interviewed": "VERB", "fixed": "VERB", "litigation": "NOUN", "tosui": "PROPN", "semi": "ADV", "prudish": "ADJ", "aftermath": "NOUN", "suggested": "VERB", "discretion": "NOUN", "quimba": "PROPN", "watcher": "NOUN", "dealship": "NOUN", "neonatal": "ADJ", "vacationed": "VERB", "mice": "NOUN", "blade": "NOUN", "!!!!!!!!!!!!!!": "PUNCT", "podium": "NOUN", "bitch": "NOUN", "mistresses": "NOUN", "illuminated": "VERB", "stellenbosch": "PROPN", "landmine": "NOUN", "presidential": "ADJ", "remnants": "NOUN", "something": "PRON", "survey": "NOUN", "fei": "PROPN", "immobility": "NOUN", "i.=": "ADJ", "05:17": "NUM", "whereabouts": "NOUN", "parama": "NOUN", "3:29": "NUM", "hookless": "ADJ", "being": "AUX", "gened": "VERB", "saucey": "PROPN", "hurt": "VERB", "flipped": "VERB", "bludgers": "NOUN", "proliferated": "VERB", "marstal": "PROPN", "gratified": "ADJ", "chicken-processing": "ADJ", "weedy": "ADJ", "ypf": "PROPN", "harmony": "NOUN", "smaller": "ADJ", "46th": "ADJ", "gospels": "PROPN", "pocket": "NOUN", "1,922,000": "NUM", "valerie": "PROPN", "saleh": "PROPN", "journalists": "NOUN", "ranges": "NOUN", "remote": "ADJ", "pillowcases": "NOUN", "assemble": "VERB", "burnell": "PROPN", "demonstration": "NOUN", "dissatisfaction": "NOUN", "provincial": "ADJ", "reiteration": "NOUN", "shipyard": "NOUN", "billion": "NUM", "motel": "NOUN", "430": "NUM", "shrewdness": "NOUN", "hooking": "VERB", "barzanti": "PROPN", "legislative": "ADJ", "edmund": "PROPN", "argentine": "ADJ", "basel": "PROPN", "hooves": "NOUN", "out": "ADP", "ton": "NOUN", "stressful": "ADJ", "vaults": "NOUN", "lest": "SCONJ", "vaunted": "ADJ", "autofiltering": "VERB", "inspected": "VERB", "fit": "VERB", "stinging": "VERB", "zawahiri": "PROPN", "cheerfully": "ADV", "sump": "NOUN", "**": "PUNCT", "s’pose": "VERB", "taiwan": "PROPN", "simultaneously": "ADV", "frequency": "NOUN", "royale": "ADJ", "safari": "PROPN", "nacional": "PROPN", "insane": "ADJ", "thou-": "INTJ", "hight": "NOUN", "hvae": "AUX", "peninsula": "NOUN", "04:41": "NUM", "honolulu": "PROPN", "tolerance": "NOUN", "straightened": "VERB", "daschle": "PROPN", "marriages": "NOUN", "diagnostic": "ADJ", "worldview": "NOUN", "please": "INTJ", "simpler": "ADJ", "pervez": "PROPN", "but": "CCONJ", "olsen": "PROPN", "oddy": "PROPN", "understandable": "ADJ", "rabid": "ADJ", "incompetence": "NOUN", "mess-room": "NOUN", "hens": "NOUN", "jane": "PROPN", "former": "ADJ", "cere": "NOUN", "puttagenius": "PROPN", "brianp@aiglincoln.com": "PROPN", "pico": "PROPN", "good-naturedly": "ADV", "ph.": "NOUN", "northwest": "NOUN", "marriage": "NOUN", "cross-examination": "NOUN", "grotesque": "ADJ", "shortage": "NOUN", "brock": "PROPN", "intertwined": "ADJ", "wunderbar": "PROPN", "1/31": "NUM", "cynical": "ADJ", "fresh-faced": "ADJ", "develops": "VERB", "nationalism": "NOUN", "bunioned": "VERB", "spicy": "ADJ", "webber": "PROPN", "ets": "NOUN", "07/17/2000": "NUM", "deutsche": "PROPN", "roly": "PROPN", "egm": "PROPN", "19": "NUM", "cayuga": "PROPN", "u.s.a": "PROPN", "repairs": "NOUN", "1946": "NUM", "split": "VERB", "moments": "NOUN", "styling": "NOUN", "touts": "VERB", "rains": "PROPN", "industry": "NOUN", "circles": "NOUN", "frowned": "VERB", "mid-february": "PROPN", "vanguard": "PROPN", "neural": "ADJ", "materializes": "VERB", "strayed": "VERB", "others": "NOUN", "slung": "VERB", "superstores": "NOUN", "shoots": "NOUN", "hcc": "PROPN", "waist": "NOUN", "538": "NUM", "orientation": "NOUN", "words": "NOUN", "improv": "NOUN", "walking": "VERB", "hoeing": "NOUN", "twe-": "INTJ", "budgeted": "VERB", "stipulation": "NOUN", "ovr": "ADV", "wig": "NOUN", "disarming": "NOUN", "reopening": "NOUN", "exposing": "VERB", "sense": "NOUN", "empirically": "ADV", "instructions": "NOUN", "chewy": "ADJ", "decompose": "VERB", "interactions": "NOUN", "heineken": "PROPN", "insufficient": "ADJ", "pole": "NOUN", "ousting": "NOUN", "[...]": "PUNCT", "pounded": "VERB", "connoisseur": "NOUN", "courteous": "ADJ", "paralegal": "NOUN", "800-553-3119": "NUM", "co-starred": "VERB", "recalled": "VERB", "eatting": "VERB", "cleaners": "NOUN", "muffin": "NOUN", "slit": "VERB", "fled": "VERB", "dispute": "NOUN", "ours": "PRON", "rumor": "NOUN", "break": "NOUN", "papeluna": "PROPN", "smsu": "PROPN", "theoretically": "ADV", "applicable": "ADJ", "methodical": "ADJ", "21/03/2001": "NUM", "lamont": "PROPN", "untreated": "ADJ", "charmaz": "PROPN", "trinity": "NOUN", "certified": "ADJ", "noodling": "VERB", "overnight": "ADV", "hasht": "PROPN", "exposed": "VERB", "cared": "VERB", "purveyed": "VERB", "epilepsy": "NOUN", "plunge": "NOUN", "fists": "NOUN", "superheroes": "NOUN", "empowerment": "NOUN", "54th": "ADJ", "extra": "ADJ", "contradicts": "VERB", "7/26/08": "NUM", "wafer": "NOUN", "mediocre": "ADJ", "tubing": "NOUN", "mustapha": "PROPN", "gargling": "VERB", "further": "ADV", "concentration": "NOUN", "asserted": "VERB", "aspen": "NOUN", "trans-european": "ADJ", "stil": "ADV", "withdrawn": "VERB", "flowerbeds": "NOUN", "roomates": "NOUN", "ordeal": "NOUN", "fur": "NOUN", "harold": "PROPN", "imported": "VERB", "ks": "PROPN", "tsunami": "NOUN", "pennysaver": "PROPN", "unthinkable": "ADJ", "beside": "ADP", "non-hodgkin": "ADJ", "impacts": "NOUN", "zora": "PROPN", "candy": "NOUN", "spokesman": "NOUN", "made": "VERB", "devon": "PROPN", "offline": "ADV", "approximately": "ADV", "cappelletto": "PROPN", "morphology": "NOUN", "sutcliffe": "PROPN", "unproductive": "ADJ", "q": "PROPN", "mind": "NOUN", "establishment": "NOUN", "excused": "VERB", "implied": "VERB", "transport": "NOUN", "wrecking": "PROPN", "actresses": "NOUN", "quarter": "NOUN", "1.4": "NUM", "waters": "NOUN", "lynx": "PROPN", "synonymous": "ADJ", "eras": "NOUN", "caterers": "NOUN", "1971": "NUM", "gathered": "VERB", "exhaust": "NOUN", "mildew": "NOUN", "base": "NOUN", "gdp": "NOUN", "mimosas": "NOUN", "deserted": "VERB", "sa": "PROPN", "throes": "NOUN", "pad": "NOUN", "wow": "INTJ", "outwards": "ADV", "pinkies": "NOUN", "20:00": "NUM", "symbolizes": "VERB", "tundra": "NOUN", "eight": "NUM", "brigadier": "NOUN", "terre": "PROPN", "tax": "NOUN", "divert": "VERB", "cake-like": "ADJ", "apply": "VERB", "injected": "VERB", "roland": "PROPN", "illusions": "NOUN", "diaphanous": "ADJ", "strolling": "VERB", "vibrating": "VERB", "swear": "VERB", "hands": "NOUN", "nam": "NOUN", "carnival": "PROPN", "presses": "VERB", "decoration": "NOUN", "arnold": "PROPN", "fahim": "PROPN", "tenants": "NOUN", "installing": "VERB", "carrying": "VERB", "herrick": "PROPN", "brovej": "PROPN", "turn": "VERB", "lifeboat": "NOUN", "encountered": "VERB", "sneaked": "VERB", "twentieth": "ADJ", "movie": "NOUN", "emirate": "NOUN", "scoff": "VERB", "memoirs": "NOUN", "sandbox": "NOUN", "hunks": "NOUN", "1327": "NUM", "2.7": "NUM", "maturity": "NOUN", "1849": "NUM", "messed": "VERB", "arthur": "PROPN", "infamous": "ADJ", "triangular": "ADJ", "honro": "VERB", "successfully": "ADV", "iranians": "PROPN", "oxygen": "NOUN", "09:14": "NUM", "alice": "PROPN", "scold": "VERB", "ruiz": "PROPN", "education": "NOUN", "dealership": "NOUN", "dinging": "VERB", "fight": "VERB", "tells": "VERB", "morocco": "PROPN", "gazing": "VERB", "unwillingness": "NOUN", "writing": "VERB", "incensed": "VERB", "thinnest": "ADJ", "freeman": "PROPN", "lash": "NOUN", "202.637.4781": "NUM", "flicker": "NOUN", "11:45": "NUM", "delivered": "VERB", "trio": "PROPN", "otters": "PROPN", "philosopher": "NOUN", "filthy": "ADJ", "temecula": "PROPN", "hazara": "PROPN", "student": "NOUN", "contexts": "NOUN", "adherent": "NOUN", "wake": "VERB", "impressed": "ADJ", "obedience": "NOUN", "roughly": "ADV", "ornithology": "NOUN", "bypassing": "VERB", "volley": "NOUN", "censuses": "NOUN", "criteria": "NOUN", "emergency": "NOUN", "security": "NOUN", "recentchangescamp": "PROPN", "mopped": "VERB", "mysteries": "NOUN", "attractions": "NOUN", "mansour": "PROPN", "buttering": "VERB", "gyanendra": "PROPN", "planeloads": "NOUN", "tuck": "VERB", "attic": "NOUN", "agar": "NOUN", "1355": "NUM", "object": "NOUN", "1307": "NUM", "80's": "NOUN", "kamen": "PROPN", "inclusion": "NOUN", ";-)": "SYM", "answers": "NOUN", "sexing": "VERB", "pressured": "ADJ", "salute": "VERB", "apologetically": "ADV", "tore": "VERB", "reflection": "NOUN", "2030": "NUM", "appartment": "NOUN", "pediatric": "ADJ", "liberals": "NOUN", "alford": "PROPN", "peregrino": "PROPN", "desirability": "NOUN", "documentation": "NOUN", "scipio": "PROPN", "increases": "VERB", "mauer": "PROPN", "tackle": "VERB", "crim": "PROPN", "deregulation": "NOUN", "southeastern": "ADJ", "ramos": "PROPN", "hosts": "NOUN", "huge": "ADJ", "olgletree": "PROPN", "chanting": "VERB", "familia": "NOUN", "decided": "VERB", "modus": "NOUN", "performance": "NOUN", "chapter": "NOUN", "cartoony": "ADJ", "normative": "ADJ", "mick": "PROPN", "frosts": "NOUN", "bony": "ADJ", "modestly": "ADV", "hanging": "VERB", "spm": "PROPN", "they": "PRON", "ethiopia": "PROPN", "abruptly": "ADV", "capsule": "NOUN", "deliverance": "NOUN", "antibiotics": "NOUN", "clear": "ADJ", "offworlder": "NOUN", "cape": "NOUN", "deadliest": "ADJ", "self-definition": "NOUN", "duck": "NOUN", "grey-bearded": "ADJ", "x940": "PROPN", "endlessly": "ADV", "clawing": "VERB", "concur": "VERB", "cracking": "NOUN", "requires": "VERB", "hail": "VERB", "femora": "NOUN", "sufferings": "NOUN", "hugging": "VERB", "michael": "PROPN", "tat": "PROPN", "magnitude": "NOUN", "friendly": "ADJ", "12.99": "NUM", "trace": "NOUN", "tikal": "PROPN", "unloaded": "ADJ", "praise": "NOUN", "maría": "PROPN", "08/17/2000": "NUM", "variety": "NOUN", "cimarron": "PROPN", "pictographs": "NOUN", "walk": "VERB", "ōtsugomori": "PROPN", "fingernails": "NOUN", "reign": "VERB", "overslept": "VERB", "mixer": "NOUN", "presence": "NOUN", "ashraf": "PROPN", "doing": "VERB", "intrepid": "PROPN", "sinyavsky": "PROPN", "dramatization": "NOUN", "loopy": "ADJ", "flee": "VERB", "stethoscope": "NOUN", "planeful": "NOUN", "enclosure": "NOUN", "burners": "NOUN", "strikes": "NOUN", "dined": "VERB", "swifties": "PROPN", "grusendorf": "PROPN", "senabre": "PROPN", "enver": "PROPN", "bedding": "NOUN", "tags": "NOUN", "braced": "VERB", "pro-palestinian": "ADJ", "stationery": "NOUN", "nurture": "VERB", "graham": "PROPN", "parrot": "NOUN", "malls": "NOUN", "footing": "NOUN", "magnifying": "VERB", "mutilation": "NOUN", "lolled": "VERB", "paid": "VERB", "heavier": "ADJ", "ashamed": "ADJ", "cvts": "PROPN", "truman": "PROPN", "strambler": "PROPN", "examined": "VERB", "ruona": "PROPN", "19/11/2004": "NUM", "edison": "PROPN", "shebaa": "PROPN", "1%p701!.doc": "SYM", "cardiac": "ADJ", "cottonwoods": "NOUN", "plying": "VERB", "modeling": "NOUN", "strategy": "NOUN", "husk": "NOUN", "12:01": "NUM", "relocate": "VERB", "curtains": "NOUN", "expect": "VERB", "copies": "NOUN", "egyptian": "ADJ", "monetize": "VERB", "justin": "PROPN", "cuttings": "NOUN", "terrace": "PROPN", "2.4": "NUM", "prejudice": "PROPN", "02:10": "NUM", "mash": "VERB", "certeau": "PROPN", "expositions": "NOUN", "ruse": "PROPN", "staple": "NOUN", "safety": "NOUN", "aortic": "ADJ", "pillow": "NOUN", "1790": "NUM", "mic": "NOUN", "2,500": "NUM", "convening": "VERB", "athena": "PROPN", "owns": "VERB", "temperature": "NOUN", "johnnie": "PROPN", "50": "NUM", "consenting": "VERB", "burrito": "PROPN", "minors": "NOUN", "mi": "PROPN", "argued": "VERB", "descendant": "NOUN", "secessionists": "NOUN", "jason.leopold@dowjones.com": "PROPN", "dehydrated": "ADJ", "smugness": "NOUN", "significant": "ADJ", "ironic": "ADJ", "rod": "PROPN", "luther": "PROPN", "cologne": "NOUN", "p.m.": "NOUN", "http://www.caribbean-cruising.net": "PROPN", "everybody": "PRON", "sagittarius": "PROPN", "poetry": "NOUN", "supervisory": "ADJ", "multiplex": "NOUN", "nigger": "NOUN", "particularized": "ADJ", "exotic": "ADJ", "intuitive": "ADJ", "dinosaurs": "NOUN", "sucked": "VERB", "www.caem.org": "PROPN", "buzzwords": "NOUN", "sharayu": "PROPN", "run-time": "NOUN", "646-8420": "NUM", "ammonium": "NOUN", "metal": "NOUN", "whoopsie": "NOUN", "920": "NUM", "staggered": "VERB", "bugless": "ADJ", "loan": "NOUN", "devotional": "ADJ", "619-231-9449": "NUM", "jeanne": "PROPN", "1.78": "NUM", "uw": "PROPN", "masks": "NOUN", "speck": "NOUN", "skinned": "ADJ", "subtle": "ADJ", "amore": "PROPN", "whipping": "VERB", "enjoying": "VERB", "non-interference": "NOUN", "shakspere": "PROPN", "alexandria": "PROPN", "loot": "NOUN", "yourself": "PRON", "fringe": "NOUN", "ceasefire": "NOUN", "cinema": "NOUN", "appears": "VERB", "10:16": "NUM", "non-smokers": "NOUN", "mutated": "VERB", "pray": "VERB", "laurel": "PROPN", "nite": "NOUN", "barbados": "PROPN", "amalgam": "NOUN", "lurch": "VERB", "xp": "PROPN", "1979": "NUM", "dogwood": "NOUN", "mosaic": "NOUN", "harass": "VERB", "stabilise": "VERB", "rosemary": "NOUN", "chutes": "NOUN", "yuor": "PRON", "annual": "ADJ", "eelam": "PROPN", "within": "ADP", "witnesses": "NOUN", "muslin": "NOUN", "incorporate": "VERB", "gb": "PROPN", "plotter": "NOUN", "eloquent": "ADJ", "overlook": "VERB", "aloft": "ADP", "clippings": "NOUN", "design": "NOUN", "suella": "PROPN", "following": "VERB", "renegotiation": "NOUN", "ruinin'": "VERB", "wycliffe": "PROPN", "casually": "ADV", "dip": "NOUN", "entertained": "ADJ", "threshold": "NOUN", "11/30/2000": "NUM", "rewrite": "VERB", "acne": "NOUN", "string": "NOUN", "miscellaneous": "ADJ", "williams": "PROPN", "museums": "NOUN", "expertise": "NOUN", "brussels": "PROPN", "annexation": "NOUN", "reaffirmation": "NOUN", "killifish": "NOUN", "co.": "NOUN", "clarification": "NOUN", "collins": "PROPN", "o’clock": "ADV", "annoyances": "NOUN", "1100": "NUM", "stifled": "VERB", "bees'": "NOUN", "rice": "NOUN", "mesoamericans": "PROPN", "commented": "VERB", "ross": "PROPN", "broad": "ADJ", "ministry": "PROPN", "outlier": "NOUN", "stromboli": "PROPN", "hannah": "PROPN", "oversees": "VERB", "military": "ADJ", "mid-evenings": "NOUN", "laughing": "VERB", "mach": "NOUN", "org": "PROPN", "stefania": "PROPN", "bunnell": "PROPN", "wooh": "INTJ", "casinos": "NOUN", "yep": "INTJ", "evanston": "PROPN", "valuing": "VERB", "related": "ADJ", "temperance": "NOUN", "titts": "NOUN", "activism": "NOUN", "realised": "VERB", "3.5": "NUM", "caption": "NOUN", "taffy": "PROPN", "artery": "NOUN", "technical": "ADJ", "signac": "PROPN", "magical": "ADJ", "postal": "ADJ", "max": "PROPN", "amphitheatre": "NOUN", "decides": "VERB", "bronchitis": "NOUN", "evernote": "PROPN", "softly": "ADV", "03:20": "NUM", "caron": "PROPN", "cent": "NOUN", "cec": "NOUN", "situated": "VERB", "emphasizing": "VERB", "legionaries": "NOUN", "reymont": "PROPN", "inches": "NOUN", "maniac": "NOUN", "1829": "NUM", "airport": "NOUN", "12:35": "NUM", "filing": "NOUN", "inconsiderate": "ADJ", "folies": "PROPN", "appartently": "ADV", "disconnected": "VERB", "salikh": "PROPN", "miley": "PROPN", "lone": "ADJ", "multicultural": "ADJ", "dancer": "NOUN", "oceans": "NOUN", "cauliflower": "NOUN", "accelerator": "NOUN", "uranus": "PROPN", "1914": "NUM", "hung": "VERB", "up": "ADP", "hoodie": "NOUN", "stirs": "VERB", "cockles": "NOUN", "paranoid": "ADJ", "throbbing": "VERB", "corruption": "NOUN", "mainly": "ADV", "summarising": "VERB", "dependance": "NOUN", "provisional": "ADJ", "blowout": "NOUN", "pip": "PROPN", "intellectually": "ADV", "squeak": "NOUN", "apparent": "ADJ", "clinics": "NOUN", "cider": "NOUN", "commemorated": "VERB", "nation-making": "ADJ", "renowned": "ADJ", "mcnealy": "PROPN", "straining": "VERB", "bloodletting": "NOUN", "legally": "ADV", "actully": "ADV", "fool": "VERB", "legislature": "NOUN", "explosion": "NOUN", "dears": "NOUN", "nodding": "VERB", "matter": "NOUN", "1,000": "NUM", "prepared": "VERB", "details": "NOUN", "flavors": "NOUN", "humpty": "PROPN", "presentation": "NOUN", "newest": "ADJ", "outline": "NOUN", "krumbholz": "PROPN", "cross-cultural": "ADJ", "glances": "NOUN", "eritrea": "PROPN", "unbelievable": "ADJ", "organs": "NOUN", "halston": "PROPN", "simpson": "PROPN", "roaming": "VERB", "ordination": "NOUN", "methodist": "ADJ", "northfield": "PROPN", "parched": "ADJ", "hallway": "NOUN", "anthony": "PROPN", "harmful": "ADJ", "merchant": "NOUN", "naturally": "ADV", "diagram": "NOUN", "phrases": "NOUN", "executed": "VERB", "chills": "NOUN", "oct": "PROPN", "post-chavez": "ADJ", "to": "PART", "serpent": "NOUN", "!!!!!!!!!!!!!!!!!!": "PUNCT", "album": "NOUN", "łódź": "PROPN", "keeney": "PROPN", "1665": "NUM", "spectacle": "NOUN", "undocking": "NOUN", "hoston": "PROPN", "two-hundred-year": "NOUN", "distinction": "NOUN", "leonardo": "PROPN", "average": "ADJ", "tolerant": "ADJ", "42.65": "NUM", "fraught": "ADJ", "18:32": "NUM", "killies": "NOUN", "nationalists": "NOUN", "taxied": "VERB", "jellicoh": "PROPN", "delegation": "NOUN", "simulating": "VERB", "04:28": "NUM", "scordia": "PROPN", "que": "NOUN", "destabilizing": "VERB", "quartered": "VERB", "tankmates": "NOUN", "stooges": "NOUN", "performers": "NOUN", "childbirth": "NOUN", "machina": "PROPN", "reputed": "VERB", "sociologist": "NOUN", "boutique": "NOUN", "universals": "NOUN", "crane": "NOUN", "republican": "ADJ", "smelling": "VERB", "aimed": "VERB", "redwings": "NOUN", "near": "ADP", "well-healed": "ADJ", "neighborhoods": "NOUN", "immense": "ADJ", "correlation": "NOUN", "diademed": "ADJ", "identity": "NOUN", "multiplied": "VERB", "biking": "VERB", "legitimacy": "NOUN", "42,000": "NUM", "elephants": "NOUN", "psychic": "ADJ", "exploited": "VERB", "animated": "ADJ", "plots": "NOUN", "barely": "ADV", "platforms": "NOUN", "departs": "VERB", "comprise": "VERB", "’s": "PART", "shouted": "VERB", "jurek": "PROPN", "creaking": "NOUN", "demo": "NOUN", "agrarian": "ADJ", "towering": "VERB", "shaper": "NOUN", "configures": "VERB", "cracker": "NOUN", "cannistaro": "PROPN", "27.doc": "NOUN", "starvation": "NOUN", "budget": "NOUN", "degu": "NOUN", "guss": "VERB", "watt": "NOUN", "objectively": "ADV", "towing": "PROPN", "pagefilename.bak.htm": "NOUN", "deceive": "VERB", "7.5": "NUM", "demonstrated": "VERB", "catch": "VERB", "short": "ADJ", "uneducated": "ADJ", "bogliasco": "PROPN", "latitudes": "NOUN", "golfers": "NOUN", "harrowing": "ADV", "centre": "NOUN", "bus": "NOUN", "january": "PROPN", "pleasantness": "NOUN", "inhabitants": "NOUN", "arrests": "NOUN", "sorcerer": "NOUN", "band": "NOUN", "sporadic": "ADJ", "investigate": "VERB", "optogenetics": "NOUN", "nonbondad": "PROPN", "33": "NUM", "medici": "PROPN", "send": "VERB", "neck": "NOUN", "braised": "ADJ", "resale": "NOUN", "moors": "NOUN", "reggie": "PROPN", "croissants": "NOUN", "500": "NUM", "horatio": "PROPN", "knowing": "VERB", "bite": "VERB", "ultra": "ADV", "guidelines": "NOUN", "sometimes": "ADV", "ok'd": "VERB", "screenwriter": "NOUN", "insecure": "ADJ", "peanutjake": "PROPN", "wizards": "NOUN", "righteousness": "NOUN", "deportation": "NOUN", "rye": "PROPN", "barbeque": "VERB", "hose": "NOUN", "generalizations": "NOUN", "incorporated": "VERB", "workers": "NOUN", "liabilities": "NOUN", "assassin": "NOUN", "pack": "VERB", "refinery": "NOUN", "chapelle": "PROPN", "crawling": "VERB", "preside": "VERB", "warp": "VERB", "repaid": "VERB", "11:16:58": "NUM", "andrea": "PROPN", "sled": "NOUN", "negligence": "NOUN", "surfing": "NOUN", "neroli": "NOUN", "divined": "VERB", "genetic": "ADJ", "wizarding": "ADJ", "amending": "VERB", "hoarse": "ADJ", "a4-0072/97": "NUM", "fragrance": "NOUN", "jiabao": "PROPN", "cathy": "PROPN", "skinner": "PROPN", "film": "NOUN", "uncontroversial": "ADJ", "investments": "NOUN", "bluff": "NOUN", "1,426": "NUM", "selling": "VERB", "spontaneously": "ADV", "durer": "PROPN", "year": "NOUN", "mauling": "VERB", "groceries": "NOUN", "foreigners": "NOUN", "solve": "VERB", "bet": "NOUN", "d2": "NOUN", "sova": "PROPN", "principally": "ADV", "purchasing": "VERB", "npr": "PROPN", "bound": "VERB", "curb": "NOUN", "sprayed": "VERB", "screech": "NOUN", "squawk": "NOUN", "mailto:galent@nepco.com": "PROPN", "gomez": "PROPN", "kyoto": "PROPN", "unc": "PROPN", "inconclusive": "ADJ", "eyeballs": "NOUN", "julia": "PROPN", "zuckerberg": "PROPN", "heavenly": "ADJ", "method": "NOUN", "above": "ADP", "naughty": "ADJ", "tutorial": "NOUN", "derived": "VERB", "reaffirm": "VERB", "apologized": "VERB", "visitors": "NOUN", "archeologist": "NOUN", "customise": "VERB", "lukaku": "PROPN", "air": "NOUN", "842": "NUM", "lepore": "PROPN", "walt": "PROPN", "davison": "PROPN", "ministers": "NOUN", "joseph": "PROPN", "smiley": "ADJ", "redefine": "VERB", "pebble": "NOUN", "inhuman": "ADJ", "11201": "NUM", "gaining": "VERB", "stumble": "VERB", "mailings": "NOUN", "entrepreneurial": "ADJ", "fountain": "NOUN", "weekends": "NOUN", "424": "NUM", "someone": "PRON", "acriflaven": "PROPN", "upright": "ADV", "aircraft": "NOUN", "awaiting": "VERB", "selections": "NOUN", "'akkab": "PROPN", "kathryn": "PROPN", "http://www.country-couples.co.uk/datingtips/basic-travel-allowance-bta-dating-scam/": "PROPN", "comets": "NOUN", "rnb": "NOUN", "evaluate": "VERB", "pricey": "ADJ", "demis": "PROPN", "chloride": "NOUN", "huguenots": "PROPN", "care": "NOUN", "reported": "VERB", "appellants": "NOUN", "unfolding": "VERB", "simplifies": "VERB", "20's": "NOUN", "wyndham": "PROPN", "http://gimpedblog.blogspot.com/2011/09/gimp-video-tutorial-how-to-convert.html": "PROPN", "intruder": "NOUN", "h.": "PROPN", "farewell": "NOUN", "conveyor": "NOUN", "telephony": "NOUN", "mormonism": "PROPN", "cross-clause": "ADJ", "well": "ADV", "subsidiary": "NOUN", "leaped": "VERB", "combines": "VERB", "sci": "NOUN", "surroundings": "NOUN", "nymex": "PROPN", "occupy": "VERB", "blues": "NOUN", "accountant": "NOUN", "jacques": "PROPN", "stick": "NOUN", "remodelling": "NOUN", "pearl": "PROPN", "bakers": "NOUN", "bremen": "PROPN", "macadamia": "NOUN", "1686": "NUM", "vivid": "ADJ", "incomprehensible": "ADJ", "messages": "NOUN", "registration": "NOUN", "aging": "NOUN", "bosom": "NOUN", "banished": "VERB", "invoice": "NOUN", "a1m": "PROPN", "exits": "NOUN", "nasser": "PROPN", "yawning": "VERB", "237": "NUM", "company": "NOUN", "kueck": "PROPN", "relics": "NOUN", "pleasantries": "NOUN", "equal": "ADJ", "limbo": "NOUN", "grit": "NOUN", "goal": "NOUN", "achievements": "NOUN", "complying": "VERB", "disney": "PROPN", "gutters": "NOUN", "signoff": "NOUN", "honorary": "ADJ", "sun.": "PROPN", "klimberg": "PROPN", "cautioned": "VERB", "reflects": "VERB", "patent": "NOUN", "opinion": "NOUN", "11:26": "NUM", "spurs": "NOUN", "bridles": "NOUN", "http://www.speedtest.net/result/1155244347.png": "PROPN", "bystander": "NOUN", "anse": "PROPN", "districts": "NOUN", "ask": "VERB", "acquainted": "ADJ", "trampled": "VERB", "1832": "NUM", "humanitarian": "ADJ", "budgie": "NOUN", "also": "ADV", "imagination": "NOUN", "unnecessary": "ADJ", "upcoming": "ADJ", "blackouts": "NOUN", "quilling": "NOUN", "harbor": "PROPN", "exaggerated": "VERB", "donation": "NOUN", "magic": "NOUN", "non-representative": "ADJ", "manuscripts": "NOUN", "coating": "NOUN", "flatfish": "NOUN", "kind": "NOUN", "numb": "ADJ", "usa": "PROPN", "makke": "VERB", "saddam": "PROPN", "pitney": "PROPN", "activates": "VERB", "kashmir": "PROPN", "rogers": "PROPN", "meiji": "PROPN", "disappear": "VERB", "contributed": "VERB", "putin": "PROPN", "corporation": "PROPN", "crossroads": "NOUN", "rampaged": "VERB", "giraffe": "NOUN", "tarmac": "NOUN", "deathly": "ADJ", "beatty": "PROPN", "mints": "NOUN", "fascinated": "VERB", "mon.": "PROPN", "usda": "PROPN", "disrupted": "VERB", "broadcasting": "NOUN", "beaumarchais": "PROPN", "indescriminately": "ADV", "artifact": "NOUN", "officiate": "VERB", "sd": "PROPN", "mollified": "VERB", "lectures": "NOUN", "kosa": "NOUN", "filipinos": "PROPN", "nz": "PROPN", "flank": "NOUN", "farmer": "NOUN", "redownload": "VERB", "sheeting": "VERB", "http://www.cic.gc.ca/english/immigrate/skilled/assess/index.asp": "PROPN", "angst": "NOUN", "croall": "PROPN", "buchanan": "PROPN", "ono": "PROPN", "blood-stained": "ADJ", "1896": "NUM", "beatingsup": "NOUN", "elucidate": "VERB", "knows": "VERB", "populist": "ADJ", "713/345-7942": "NUM", "resigned": "VERB", "whim": "NOUN", "probably": "ADV", "montana": "PROPN", "electronic": "ADJ", "precise": "ADJ", "brin": "PROPN", "i.b.": "PROPN", "crouched": "VERB", "geometric": "ADJ", "absent-mindedly": "ADV", "scriptures": "PROPN", "surgeons": "NOUN", "instituto": "PROPN", "diplomatic": "ADJ", "beliefs": "NOUN", "salah": "PROPN", "arrears": "NOUN", "wed.": "PROPN", "salty": "ADJ", "switch": "NOUN", "historian": "NOUN", "vanves": "PROPN", "catalogue": "NOUN", "copan": "PROPN", "dujail": "PROPN", "round": "ADP", "iata": "PROPN", "walkie": "NOUN", "transnational": "ADJ", "281-435-0295": "NUM", "sarcastically": "ADV", "superiority": "NOUN", "ve": "AUX", "safe": "ADJ", "backgrounds": "NOUN", "oaths": "NOUN", "excitedly": "ADV", "conclusion": "NOUN", "chandelier": "NOUN", "connect": "VERB", "smoothing": "VERB", "rhinoceros": "NOUN", "free": "ADJ", "proponents": "NOUN", "giovanni": "PROPN", "dumbstruck": "ADJ", "entity": "NOUN", "bloody": "ADJ", "classified": "VERB", "insides": "NOUN", "won": "VERB", "logo": "NOUN", "payments": "NOUN", "completly": "ADV", "spoken": "VERB", "04:18": "NUM", "archipelago": "NOUN", "sommelier": "NOUN", "historic": "ADJ", "2300": "NUM", "magickal": "ADJ", "lo9nger": "ADV", "hybrids": "NOUN", "formica": "PROPN", "autograph": "NOUN", "directorate": "PROPN", "agreeing": "VERB", "yellow-brown": "ADJ", "kitten": "NOUN", "steaks": "NOUN", "aa": "NOUN", "extraction": "NOUN", "650": "NUM", "nutrition-wise": "ADV", "thanksgiving": "PROPN", "98011": "NUM", "±": "CCONJ", "dispatch": "NOUN", "spain": "PROPN", "info@vagabondtours.dk": "PROPN", "bid": "NOUN", "supplement": "NOUN", "costumer": "NOUN", "controller": "PROPN", "rome": "PROPN", "triumphant": "ADJ", "discouraging": "VERB", "component": "NOUN", "trance": "NOUN", "cunning": "ADJ", "tastes": "VERB", "ticket": "NOUN", "nea": "PROPN", "dominion": "PROPN", "marched": "VERB", "completed": "VERB", "accuracy": "NOUN", "wilderness": "NOUN", "cupboard": "NOUN", "qaim": "PROPN", "fairest": "ADJ", "movies": "NOUN", "gaping": "VERB", "daytime": "NOUN", "faster": "ADJ", "steals": "VERB", "s.": "PROPN", "andover": "PROPN", "communicated": "VERB", "1739": "NUM", "martin": "PROPN", "heckuvalot": "NOUN", "temporarily": "ADV", "line": "NOUN", "convenience": "NOUN", "comparing": "VERB", "bankruptcy": "NOUN", "travis": "PROPN", "joy": "PROPN", "nerd": "NOUN", "ta'": "INTJ", "nicco": "PROPN", "would": "AUX", "succumbed": "VERB", "crew-cut": "ADJ", "http://www.rawstory.com/news/2006/us_outsourcing_special_operations_intelligence_gathering_0413.html": "PROPN", "surrounding": "VERB", "oneself": "PRON", "israel": "PROPN", "repeatedly": "ADV", "receiving": "VERB", "exemplified": "VERB", "howrah": "PROPN", "guerilla": "NOUN", "kindly": "ADJ", "lamarque": "PROPN", "initially": "ADV", "u$": "PROPN", "meira": "PROPN", "03:13:58": "NUM", "markus": "PROPN", "summarily": "ADV", "bee-keeping": "NOUN", "july": "PROPN", "fabulous": "ADJ", "nourished": "PROPN", "1943": "NUM", "reproachfully": "ADV", "bothell": "PROPN", "taller": "ADJ", "vessel": "NOUN", "interiors": "PROPN", "intended": "VERB", "afghan": "ADJ", "diverse": "ADJ", "accenting": "VERB", "vandergrift": "PROPN", "unwilling": "ADJ", "tee": "ADJ", "damage": "NOUN", "houson": "PROPN", "ashore": "ADV", "road": "NOUN", "edge": "NOUN", "isles": "NOUN", "4,489,109": "NUM", "spectacular": "ADJ", "rope": "NOUN", "aerogel": "NOUN", "sadistic": "ADJ", "tycoons": "NOUN", "11030": "NUM", "rosy": "ADJ", "chnages": "NOUN", "shortcut": "NOUN", "provocation": "NOUN", "abou": "ADP", "serenely": "ADV", "colored": "VERB", "noctivagant": "ADJ", "stipend": "NOUN", "corridors": "NOUN", "majority": "NOUN", "molesters": "NOUN", "ensuing": "VERB", "million": "NUM", "cass": "PROPN", "bottomless": "ADJ", "executable": "ADJ", "mohammed": "PROPN", "armchair": "NOUN", "shelter": "NOUN", "stuttering": "VERB", "registry": "NOUN", "04:31": "NUM", "tourists": "NOUN", "pressurized": "VERB", "dempseys": "NOUN", "honeydew": "NOUN", "hardware": "NOUN", "burma": "PROPN", "temporary": "ADJ", "e-commerce": "NOUN", "7,000": "NUM", "humming": "VERB", "mirroring": "VERB", "phlox": "NOUN", "spills": "VERB", "appropriate": "ADJ", "twilight": "NOUN", "sdgs": "PROPN", "centralize": "VERB", "gentile": "ADJ", "job": "NOUN", "skeleton": "NOUN", "refuse": "VERB", "pudding": "NOUN", "wailing": "VERB", "viewpoints": "NOUN", "stripes": "NOUN", ";": "PUNCT", "carry": "VERB", "finery": "NOUN", "treasures": "NOUN", "christina": "PROPN", "330": "NUM", "recommendations": "NOUN", "l/c": "NOUN", "otago": "PROPN", "spacious": "ADJ", "mildly": "ADV", "fanatic": "ADJ", "wisecracks": "NOUN", "kowloon": "PROPN", "communicating": "VERB", "tajiks": "PROPN", "vietnam": "PROPN", "philadelphia": "PROPN", "cheuk": "PROPN", "soups": "NOUN", "incoherent": "ADJ", "painted": "VERB", "probability": "NOUN", "gravy": "NOUN", "rutgers": "PROPN", "toxic": "ADJ", "95": "NUM", "failed": "VERB", "anywere": "ADV", "dug": "VERB", "liver": "NOUN", "tanganyika": "PROPN", "agreements": "NOUN", "facilitating": "VERB", "jerry": "PROPN", "guesthouse": "PROPN", "comedians": "NOUN", "treasure": "NOUN", "takeover": "NOUN", "whenever": "ADV", "buzzy": "ADJ", "gamers": "NOUN", "tune": "NOUN", "trained": "VERB", "category": "NOUN", "agassiz": "PROPN", "erect": "ADJ", "overheard": "VERB", "inform": "VERB", "checkout": "NOUN", "programmes": "NOUN", "acquiesce": "VERB", "conjecture": "NOUN", "delivery": "NOUN", "record-player": "NOUN", "u.s": "PROPN", "this": "DET", "feathery": "ADJ", "uncertainly": "ADV", "believer": "NOUN", "soup": "NOUN", "simplifications": "NOUN", "falls": "PROPN", "489": "NUM", "down": "ADV", "13279": "NUM", "acronym": "NOUN", "denunciation": "NOUN", "berths": "NOUN", "ted": "PROPN", "badly": "ADV", "decisive": "ADJ", "permanently": "ADV", "prejudices": "NOUN", "cents": "NOUN", "courtesy": "NOUN", "01/13/2001": "NUM", "mh": "INTJ", "60.23": "NUM", "solemnity": "NOUN", "yard": "NOUN", "iss": "PROPN", "kwok": "PROPN", "abundance": "NOUN", "responded": "VERB", "testimony": "NOUN", "of": "ADP", "desserts": "NOUN", "parisian": "ADJ", "meat": "NOUN", "conscientious": "ADJ", "1974": "NUM", "weekly": "ADJ", "teaspoon": "NOUN", "spore": "NOUN", "magi": "PROPN", "pablo": "PROPN", "permissions": "NOUN", "20006": "NUM", "microsystems": "PROPN", "leant": "VERB", "http://www.flickr.com/photos/adamtolle/6094960940/in/set-72157627535453128/": "PROPN", "declare": "VERB", "chinoise": "PROPN", "tuscany": "PROPN", "pictures": "NOUN", "hash": "NOUN", "full": "ADJ", "purposely": "ADV", "fifteenth": "NOUN", "violent": "ADJ", "celebrity": "NOUN", "looming": "VERB", "preservation": "NOUN", "vera": "NOUN", "upholding": "VERB", "cellphones": "NOUN", "popcorn": "NOUN", "insular": "ADJ", "2.5": "NUM", "wootch": "PROPN", "grandpa": "NOUN", "1934": "NUM", "strapped": "VERB", "huffington": "PROPN", "13339": "NUM", "mild": "ADJ", "ski": "VERB", "omg": "INTJ", "dressage": "NOUN", "field": "NOUN", "hospitalized": "VERB", "accommodated": "VERB", "emptier": "ADJ", "corpses": "NOUN", "atlantic": "ADJ", "inn": "PROPN", "stories": "NOUN", "watchfully": "ADV", "e500's": "NOUN", "fazlur": "PROPN", "gandhi": "PROPN", "jazeera": "PROPN", "dunes": "NOUN", "likely": "ADJ", "authorised": "ADJ", "cousins": "NOUN", "washing-up": "NOUN", "____________________________________________________": "SYM", "endeavors": "NOUN", "reserve": "NOUN", "nah": "INTJ", "tschumi": "PROPN", "fry": "NOUN", "yelled": "VERB", "agricultural": "ADJ", "clothes-careless": "ADJ", "transparent": "ADJ", "rinse": "VERB", "conducive": "ADJ", "severly": "ADJ", "stimulant": "NOUN", "hackers": "NOUN", "serves": "VERB", "teenager": "NOUN", "º": "NOUN", "'02": "NUM", "boothbay": "PROPN", "pencil": "NOUN", "filo": "PROPN", "accessing": "VERB", "wolności": "PROPN", "2050": "NUM", "wrath": "NOUN", "fox": "NOUN", "levine": "PROPN", "osce": "PROPN", "112th": "ADJ", "tread": "VERB", "tuesday": "PROPN", "traffickers": "NOUN", "label": "NOUN", "instead": "ADV", "bans": "VERB", "http://www.natureandtech.com/?page_id=2200": "PROPN", "contrasted": "VERB", "hasina": "PROPN", "white-blond": "ADJ", "unacceptable": "ADJ", "allegation": "NOUN", "truly": "ADV", "entering": "VERB", "baby": "NOUN", "messaging": "NOUN", "perpetual": "ADJ", "amount": "NOUN", "coauthor": "NOUN", "automotive": "ADJ", "effectively": "ADV", "lathered": "VERB", "1696": "NUM", "gap": "NOUN", "remoras": "NOUN", "studies": "NOUN", "methodology": "NOUN", "analogy": "NOUN", "944-3737": "NUM", "father": "NOUN", "crystallize": "VERB", "cutoff": "NOUN", "35620": "NUM", "salt": "NOUN", "libeled": "VERB", "coming": "VERB", "timetable": "NOUN", "pointing": "VERB", "solving": "NOUN", "hermeticism": "PROPN", "gilbergd@sullcrom.com": "PROPN", "touristy": "ADJ", "tsar": "PROPN", "moritz": "PROPN", "lanky": "ADJ", "debated": "VERB", "stamping": "VERB", "evidently": "ADV", "networking": "NOUN", "zebra": "NOUN", "disperse": "VERB", "abbot": "PROPN", "gwen": "PROPN", "semi-automatic": "ADJ", "implement": "VERB", "clicker": "NOUN", "largest": "ADJ", "insulted": "VERB", "throws": "VERB", "mansions": "NOUN", "foxes": "NOUN", "lc": "NOUN", "tracy": "PROPN", "role": "NOUN", "unalterable": "ADJ", "row": "NOUN", "iraqi": "ADJ", "parking": "NOUN", "@w.a.b.b.y": "PROPN", "dating": "NOUN", "conclude": "VERB", "1937": "NUM", "circulation": "NOUN", "valued": "VERB", "reasonably": "ADV", "mini-mmpi": "PROPN", "enfiladed": "VERB", "assessment": "NOUN", "mac": "PROPN", "shoving": "VERB", "headache": "NOUN", "brute": "ADJ", "piping": "NOUN", "dings": "NOUN", "crawler": "NOUN", "consolidated": "VERB", "petit": "PROPN", "tots": "PROPN", "scammers": "NOUN", "herewith": "ADV", "deep-rooted": "ADJ", "11/10/2000": "NUM", "shrill": "ADJ", "breyers": "NOUN", "newsletter": "NOUN", "smeared": "VERB", "niklaus": "PROPN", "twenties": "NOUN", "wolens": "PROPN", "adjusting": "VERB", "quickest": "ADJ", "sumner": "PROPN", "goodness": "NOUN", "buy": "VERB", "longing": "VERB", "manhunt": "NOUN", "p.o.": "NOUN", "briggs": "PROPN", "sonia": "PROPN", "passionate": "ADJ", "eleventh": "ADJ", "classes": "NOUN", "dirtier": "ADJ", "e": "PROPN", "grimness": "NOUN", "pisces": "PROPN", "viewership": "NOUN", "hotels": "NOUN", "onesie": "NOUN", "post": "NOUN", "light": "NOUN", "metabolome": "NOUN", "length": "NOUN", "null": "NOUN", "unsociable": "ADJ", "teaspoons": "NOUN", "resided": "VERB", "density": "NOUN", "thrusting": "VERB", "slavery": "NOUN", "tajik": "PROPN", "educación": "PROPN", "pee": "VERB", "blimey": "INTJ", "http://isc.enron.com/site": "PROPN", "schemes": "NOUN", "plagiarized": "VERB", "vanishing": "VERB", "72": "NUM", "outcome": "NOUN", "sanctuary": "NOUN", "initial": "ADJ", "cellar": "NOUN", "distraction": "NOUN", "urban": "ADJ", "buckled": "VERB", "parts": "NOUN", "countryside": "NOUN", "sustain": "VERB", "ethics": "NOUN", "rib": "NOUN", "mischief": "NOUN", "spa": "NOUN", "schools": "NOUN", "04:49": "NUM", "sit": "VERB", "detonation": "NOUN", "redirect": "VERB", "realist": "NOUN", "cosmic": "ADJ", "cover": "VERB", "shahshahan": "PROPN", "swindles": "NOUN", "controversial": "ADJ", "transforms": "VERB", "passion": "NOUN", "madrasas": "NOUN", "tennessee": "PROPN", "locks": "NOUN", "bilked": "VERB", "encroaches": "VERB", "uterine": "NOUN", "sorted": "VERB", "1860s": "NOUN", "713": "NUM", "hirsch": "PROPN", "whi-": "INTJ", "clarify": "VERB", "us": "PRON", "tripping": "VERB", "diaper": "NOUN", "chardonnay": "PROPN", "athletes": "NOUN", "policeman": "NOUN", "waiters": "NOUN", "cord": "NOUN", "mid-80s": "NOUN", "lugli": "PROPN", "haifa": "PROPN", "confidentiality": "NOUN", "storing": "VERB", "garibaldi": "PROPN", "died": "VERB", "jumble": "NOUN", "appearing": "VERB", "mink": "NOUN", "heathrow": "PROPN", "http://www.ebay.co.uk/itm/250927098564?var=550057729382&sspagename=strk:mewax:it&_trksid=p3984.m1438.l2649#ht_": "PROPN", "walsingham": "PROPN", "biosphere": "NOUN", "x37047": "NOUN", "autonomous": "ADJ", "departures": "NOUN", "1957": "NUM", "beg": "VERB", "scenario": "NOUN", "edwin": "PROPN", "geneva": "PROPN", "thunder": "PROPN", "£": "SYM", "entie": "ADJ", "fixable": "ADJ", "painter": "NOUN", "bce": "NOUN", "bold": "ADJ", "maw": "NOUN", "antennae": "NOUN", "adelphi": "PROPN", "misstatements": "NOUN", "grog": "NOUN", "meal": "NOUN", "exulting": "VERB", "12.45": "NUM", "belong": "VERB", "befuddled": "VERB", "diagnosed": "VERB", "extinction": "NOUN", "roles": "NOUN", "hooting": "ADJ", "97": "NUM", "patron": "NOUN", "challenge": "NOUN", "reassurance": "NOUN", "ceremonious": "ADJ", "writings": "NOUN", "youths": "NOUN", "apache": "PROPN", "bmil": "PROPN", "barcelona": "PROPN", "jordan": "PROPN", "graves": "NOUN", "demise": "NOUN", "acknowledges": "VERB", "swiftly": "ADV", "#proposal": "PROPN", "reaping": "VERB", "simone": "PROPN", "haha": "INTJ", "gangly": "ADJ", "colder": "ADJ", "defining": "VERB", "kinsman": "NOUN", "cabalah": "NOUN", "estar": "PROPN", "filet": "PROPN", "9:30": "NUM", "lawyer": "NOUN", "permission": "NOUN", "glamour": "NOUN", "strap": "NOUN", "heartless": "ADJ", "marly": "PROPN", "sydney": "PROPN", "panted": "VERB", "pry": "NOUN", "reactions": "NOUN", "temple": "NOUN", "575,000": "NUM", "respectable": "ADJ", "surrounds": "VERB", "groom": "PROPN", "nickinator": "PROPN", "updating": "VERB", "knives": "NOUN", "mahesh": "PROPN", "paintings": "NOUN", "aggressive": "ADJ", "lifeboats": "NOUN", "tue.": "PROPN", "weather": "NOUN", "deeper": "ADJ", "alberta": "PROPN", "doris": "PROPN", "dominica": "PROPN", ":)": "SYM", "rentals": "NOUN", "honey": "NOUN", "qua": "ADP", "sprinting": "VERB", "trainer": "NOUN", "610": "NUM", ">": "PUNCT", "injection": "NOUN", "roderigo": "PROPN", "qtr3": "NOUN", "9": "NUM", "shadow": "NOUN", "b/t": "ADP", "satire": "NOUN", "shameful": "ADJ", "auditioned": "VERB", "pretending": "VERB", "sara": "PROPN", "offsets": "NOUN", "rigger": "NOUN", "browse": "VERB", "kind-faced": "ADJ", "obliquely": "ADV", "segments": "NOUN", "incident": "NOUN", "meier": "PROPN", "attain": "VERB", "extensible": "ADJ", "asylee": "NOUN", "robin": "PROPN", "marquis": "PROPN", "cultural": "ADJ", "panorama": "NOUN", "robotic": "ADJ", "lusted": "VERB", "beckons": "VERB", "suspects": "VERB", "cross-breeded": "VERB", "h-0209/99": "NUM", "searcher": "PROPN", "drafted": "VERB", "affairs": "NOUN", "non-veg": "ADJ", "extraordinarily": "ADV", "maize1_1017013": "PROPN", "trends": "NOUN", "cone": "PROPN", "homeowners": "NOUN", "quickenloans": "PROPN", "hospitable": "ADJ", "copyright": "NOUN", "sin": "NOUN", "compiling": "VERB", "smash": "VERB", "developed": "VERB", "pan-democrats": "NOUN", "81p/wild": "PROPN", "snow": "NOUN", "hyperlink": "PROPN", "fixations": "NOUN", "youngsteers": "NOUN", "bulbous": "ADJ", "wai-keung": "PROPN", "engine": "NOUN", "lion": "NOUN", "sweety": "NOUN", "fruitless": "ADJ", "1991": "NUM", "part": "NOUN", "ending": "VERB", "socal": "PROPN", "turns": "VERB", "spies": "NOUN", "ruby": "NOUN", "committees": "NOUN", "applying": "VERB", "neurology": "NOUN", "hickenlooper": "PROPN", "snarl": "NOUN", "bruna": "PROPN", "notably": "ADV", "sixth": "ADJ", "mysteriously": "ADV", "udorn": "PROPN", "resourceful": "ADJ", "myth": "NOUN", "bouncy": "ADJ", "ruts": "NOUN", "progression": "NOUN", "0590258046": "NUM", "exeter": "PROPN", "earlier": "ADV", "diminish": "VERB", "jude": "PROPN", "rhythmically": "ADV", "bounds": "NOUN", "replications": "NOUN", "protection": "NOUN", "referring": "VERB", "bake": "VERB", "snored": "VERB", "manakau": "PROPN", "windsor": "PROPN", "personable": "ADJ", "virulent": "ADJ", "sabine": "PROPN", "pixels": "NOUN", "sr": "ADJ", "flops": "VERB", "anatole": "PROPN", "scale": "NOUN", "nadu": "PROPN", "airholes": "NOUN", "deplorable": "ADJ", "fws": "PROPN", "curves": "NOUN", "uninterrupted": "ADJ", "launder": "VERB", "wooden": "ADJ", "211": "NUM", "assertions": "NOUN", "suspension": "NOUN", "speckled": "VERB", "durability": "NOUN", "25.1": "NUM", "unknowledgeable": "ADJ", "lucio": "PROPN", "1605": "NUM", "pacify": "VERB", "impact": "NOUN", "jet-black": "ADJ", "non-profit": "ADJ", "addition": "NOUN", "japanese": "ADJ", "incapacitated": "VERB", "112": "NUM", "thebaid": "PROPN", "exceeds": "VERB", "oriental": "ADJ", "no": "DET", "danette": "PROPN", "winging": "VERB", "tower": "NOUN", "manipulating": "VERB", "hopping": "ADJ", "hateful": "ADJ", "plated": "VERB", "yak": "PROPN", "cavalcade": "PROPN", "immutability": "NOUN", "plural": "ADJ", "militarily": "ADV", "stopping": "VERB", "realities": "NOUN", "amnesty": "PROPN", "garrison": "NOUN", "symbol": "NOUN", "requirements": "NOUN", "favourite": "ADJ", "accessible": "ADJ", "obscured": "VERB", "slumped": "VERB", "satisfying": "VERB", "nichols": "PROPN", "valuation": "NOUN", "matthew": "PROPN", "domain": "NOUN", "prosecutors": "NOUN", "attend": "VERB", "abundant": "ADJ", "ballast": "NOUN", "reef": "NOUN", "disagreement": "NOUN", "austria": "PROPN", "parma": "PROPN", "exclusive": "ADJ", "anon": "PROPN", "shutters": "NOUN", "gardening": "NOUN", "volumes": "NOUN", "resignation": "NOUN", "gaunt": "NOUN", "fairchild": "PROPN", "67": "NUM", "affirming": "VERB", "html": "PROPN", "chi-fung": "PROPN", "appointees": "NOUN", "disastrous": "ADJ", "filter": "NOUN", "11:36": "NUM", "conspirator": "NOUN", "basement": "NOUN", "libby": "PROPN", "moslems": "PROPN", "ballads": "NOUN", "857-771": "NUM", "4641": "NUM", "booz": "PROPN", "welfare": "NOUN", "pockets": "NOUN", "featurelessness": "NOUN", "moves": "NOUN", "stylistic": "ADJ", "rout": "NOUN", "blame": "VERB", "animals": "NOUN", "pro-beijing": "ADJ", "ensure": "VERB", "signature": "NOUN", "’": "PART", "editors": "NOUN", "exocets": "PROPN", "targeted": "VERB", "bankrupt": "ADJ", "climates": "NOUN", "disobedience": "NOUN", "cuyahoga": "PROPN", "dillards": "PROPN", "scholar": "NOUN", "thigh": "NOUN", "castration": "NOUN", "ruminate": "VERB", "keepers": "NOUN", "iraq": "PROPN", "hangar": "NOUN", "packer": "NOUN", "trembled": "VERB", "normal": "ADJ", "mole": "NOUN", "happens": "VERB", "solicitous": "ADJ", "bts": "PROPN", "banks": "NOUN", "coed": "ADJ", "vc": "PROPN", "carved": "VERB", "cycled": "VERB", "ipanema": "PROPN", "chem": "NOUN", "wade": "PROPN", "rosemont": "PROPN", "innovators": "NOUN", "anxieties": "NOUN", "instincts": "NOUN", "welcoming": "ADJ", "woken": "VERB", "tsm": "PROPN", "http://www.mikegigi.com/techspec.htm#selctemp": "PROPN", "smack": "PROPN", "wave": "NOUN", "bos": "PROPN", "14:00": "NUM", "exploiting": "VERB", "bumped": "VERB", "hurtled": "VERB", "transformations": "NOUN", "viscosity": "NOUN", "soil": "NOUN", "intense": "ADJ", "ascetics": "NOUN", "hear": "VERB", "usally": "ADV", "ruhollah": "PROPN", "professionals": "NOUN", "sheltering": "VERB", "double-chinned": "ADJ", "is": "AUX", "kreyol": "PROPN", "incrementally": "ADV", "freeze": "VERB", "curled": "VERB", "najib": "PROPN", "needle": "NOUN", "lysa": "PROPN", "reflibpaths": "NOUN", "payer": "NOUN", "via": "ADP", "grimm": "PROPN", "dangerou-": "ADJ", "`s": "AUX", "unsolved": "ADJ", "with": "ADP", "raindrops": "NOUN", "relevance": "NOUN", "africa": "PROPN", "crucial": "ADJ", "limp": "ADJ", "gasp": "NOUN", "refrig.": "NOUN", "jefferson": "PROPN", "sleep": "NOUN", "defense": "NOUN", "campenni": "PROPN", "suited": "ADJ", "drags": "VERB", "sickles": "NOUN", "islands": "NOUN", "csa": "NOUN", "harness": "NOUN", "drawn": "VERB", "crimes": "NOUN", "correctly": "ADV", "situations": "NOUN", "autofilter": "NOUN", "disband": "VERB", "pig": "NOUN", "underdog": "NOUN", "peas": "NOUN", "10:30": "NUM", "life": "NOUN", "i.s.c.": "NOUN", "felicia": "PROPN", "it's": "PRON", "preposterous": "ADJ", "compare": "VERB", "planting": "VERB", "anachronistic": "ADJ", "charts": "NOUN", "dispersal": "NOUN", "inch": "NOUN", "stampedes": "NOUN", "copyrightx": "PROPN", "kirk": "PROPN", "non-commercial": "ADJ", "atrophy": "NOUN", "argument": "NOUN", "eat-e": "VERB", "yanhee": "PROPN", "jetty": "NOUN", "speaks": "VERB", "subterfuge": "NOUN", "overt": "ADJ", "giap": "PROPN", "reticence": "NOUN", "transferred": "VERB", "thirds": "NOUN", "revoke": "PROPN", "proposed": "VERB", "28,000": "NUM", "shoved": "VERB", "whitish": "ADJ", "vast": "ADJ", "resounding": "ADJ", "wildland": "NOUN", "totalitarian": "ADJ", "lives": "NOUN", "mahal": "PROPN", "11:23": "NUM", "accommodations": "NOUN", "uth's": "NOUN", "triggered": "VERB", "jk": "PROPN", "mountainous": "ADJ", "outlining": "VERB", "dissent": "NOUN", "property": "NOUN", "morelias": "NOUN", "colorado": "PROPN", "flaxen": "ADJ", "focusing": "VERB", "lobster": "NOUN", "pettigrew": "PROPN", "'ye": "PRON", "magnificent": "ADJ", "timeframe": "NOUN", "cauldron": "NOUN", "go-": "INTJ", "264": "NUM", "discussed": "VERB", "tibet": "PROPN", "crafter": "NOUN", "apatow": "PROPN", "cinsault": "PROPN", "stunk": "VERB", "revert": "VERB", "shivering": "VERB", "sony": "PROPN", "cashout": "NOUN", "governorates": "NOUN", "dangled": "VERB", "pertinent": "ADJ", "outshone": "VERB", "frightening": "ADJ", "mentor": "NOUN", "conversion": "NOUN", "8:30": "NUM", "mumbo": "NOUN", "11/29/2000": "NUM", "travelling": "VERB", "cascade": "NOUN", "defendants": "NOUN", "blogs": "NOUN", "liberalisation": "NOUN", "stature": "NOUN", "nut": "NOUN", "medium": "ADJ", "stalls": "NOUN", "starchy": "ADJ", "shrubs": "NOUN", "desired": "VERB", "instrumentation": "NOUN", "heagle": "PROPN", "traditionally": "ADV", "holdup": "NOUN", "clairmont": "PROPN", "outrageously": "ADV", "cupcake": "NOUN", "enrich": "VERB", "h2o-esque": "ADJ", "pot": "NOUN", "dividing": "VERB", "subdued": "ADJ", "acer": "PROPN", "november": "PROPN", "snorkeling": "NOUN", "hundredths": "NOUN", "screwing": "VERB", "enculturation": "NOUN", "brawler": "PROPN", "russ": "PROPN", "overland": "ADJ", "alcoholism": "NOUN", "strengthening": "VERB", "delays": "NOUN", "decay": "PROPN", "setups": "NOUN", "perfectionism": "NOUN", "pen": "NOUN", "axial": "ADJ", "nordstrom": "PROPN", "prising": "VERB", "interact": "VERB", "hajj": "PROPN", "popes": "NOUN", "nylons": "NOUN", "albatross": "PROPN", "communists": "PROPN", "conjunctions": "NOUN", "wagin": "VERB", "sauvignon": "PROPN", "marc": "PROPN", "fundamentally": "ADV", "limestone": "NOUN", "voyage": "NOUN", "identification": "NOUN", "workplace": "NOUN", "wondering": "VERB", "texting": "NOUN", "lindsey": "PROPN", "sus": "ADJ", "spaghetti": "NOUN", "240": "NUM", "pomodoro": "PROPN", "clarified": "VERB", "batteries": "NOUN", "wall": "NOUN", "ulistic": "PROPN", "ibm": "PROPN", "apple": "NOUN", "premier": "ADJ", "gryffindor": "PROPN", "secondary": "ADJ", "removes": "VERB", "supports": "VERB", "work": "NOUN", "socialising": "VERB", "waste": "NOUN", "disorderly": "ADJ", "goode": "PROPN", "1214": "NUM", "engineering": "NOUN", "readers": "NOUN", "gem": "NOUN", "bonus": "NOUN", "especial": "ADJ", "carafe": "NOUN", "gulfport": "PROPN", "serivce": "NOUN", "thames": "PROPN", "goonewardena": "PROPN", "had": "AUX", "decor": "NOUN", "anti-essentialist": "ADJ", "fulfil": "VERB", "halt": "NOUN", "ranger": "NOUN", "pirates": "PROPN", "em": "PRON", "comp.": "NOUN", "co-founded": "VERB", "touchez": "PROPN", "nord": "PROPN", "implementing": "VERB", "clothing": "NOUN", "expands": "VERB", "alternated": "VERB", "solids": "NOUN", "rbis": "NOUN", "cave": "NOUN", "fluids": "NOUN", "assisting": "VERB", "prosecutor": "NOUN", "adaptive": "ADJ", "shopping": "NOUN", "faulkner": "PROPN", "embarrassment": "NOUN", "factor": "NOUN", "mineral": "NOUN", "protein": "NOUN", "1381": "NUM", "nightlife": "NOUN", "tricky": "ADJ", "impressionist": "ADJ", "guadeloupe": "PROPN", "stewardesses": "NOUN", "s65": "SYM", "opera": "PROPN", "allen": "PROPN", "cages": "NOUN", "embraced": "VERB", "loud": "ADJ", "walloch": "PROPN", "hegemonic": "ADJ", "intersect": "VERB", "lebanese": "ADJ", "fleets": "NOUN", "capita": "NOUN", "crying": "VERB", "lankan": "ADJ", "decipher": "VERB", "barrack-like": "ADJ", "causation": "NOUN", "opinions": "NOUN", "norway": "PROPN", "votes": "NOUN", "bowen": "PROPN", "worms": "NOUN", "unapologetic": "ADJ", "verdict": "NOUN", "modicum": "NOUN", "h-": "INTJ", "su": "PROPN", "muggle": "NOUN", "strongid": "PROPN", "combining": "VERB", "disposition": "NOUN", "runtime": "NOUN", "toasting": "VERB", "indefinitely": "ADV", "synge": "PROPN", "refurb": "NOUN", "arabs": "PROPN", "visa": "NOUN", "washington": "PROPN", "http://www.netpetshop.co.uk/p-19500-savic-chichi-2-chinchilla-rat-degu-ferret-cage.aspx": "PROPN", "meidan": "PROPN", "conceived": "VERB", "’72": "NUM", "congress": "PROPN", "immovable": "ADJ", "hacker": "NOUN", "predatory": "ADJ", "compress": "VERB", "grace": "NOUN", "stupidity": "NOUN", "brainwashed": "VERB", "sulfur": "NOUN", "suites": "NOUN", "saviour": "NOUN", "dividends": "NOUN", "2301": "NUM", "minarets": "NOUN", "collaborate": "VERB", "entered": "VERB", "specified": "VERB", "riddled": "ADJ", "wasted": "VERB", "warwickshire": "PROPN", "catacomb": "NOUN", "sentiments": "NOUN", "naji": "PROPN", "roger": "PROPN", "assert": "VERB", "coworkers": "NOUN", "secular": "ADJ", "paula": "PROPN", "baba": "PROPN", "displacing": "VERB", "daddy": "NOUN", "nieces": "NOUN", "dorm": "NOUN", "frequent": "ADJ", "gda": "NOUN", "labat": "PROPN", "baathist": "ADJ", "services": "NOUN", "renovated": "VERB", "poorly": "ADV", "younis": "PROPN", "stone": "NOUN", "fold": "NOUN", "locker": "NOUN", "rae": "PROPN", "glove": "NOUN", "underpin": "VERB", "negative": "ADJ", "chops": "NOUN", "curious": "ADJ", "creeping": "VERB", "assegais": "NOUN", "25": "NUM", "flexion": "NOUN", "festus": "PROPN", "10/20/2000": "NUM", "wears": "VERB", "pilgrams": "NOUN", "constitutional": "ADJ", "races": "NOUN", "maldives": "PROPN", "industries": "NOUN", "tight": "ADJ", "ruled": "VERB", "neighbors": "NOUN", "1835": "NUM", "nobler": "ADJ", "brokers": "NOUN", "mugs": "NOUN", "queer": "ADJ", "888.916.7184": "NUM", "chemically": "ADV", "presciently": "ADV", "x33907": "NOUN", "physical": "ADJ", "digest": "VERB", "phenomenon": "NOUN", "lunar": "ADJ", "stl": "NOUN", "****": "PUNCT", "inconvenient": "ADJ", "cfl": "NOUN", "limited": "ADJ", "lamb": "NOUN", "lull": "NOUN", "wish": "VERB", "orwell": "PROPN", "meditate": "VERB", "thane": "PROPN", "850": "NUM", "private": "ADJ", "hiking": "NOUN", "deffner": "PROPN", "louder": "ADJ", "colourful": "ADJ", "09": "NUM", "mounds": "NOUN", "instruction": "NOUN", "abba": "PROPN", "25/01/2001": "NUM", "island": "NOUN", "hillside": "NOUN", "offended": "VERB", "feedback": "NOUN", "principle": "NOUN", "bourgeois": "ADJ", "snags": "NOUN", "addicted": "ADJ", "throwing": "VERB", "kong": "PROPN", "palatial": "ADJ", "gai-hinnom": "PROPN", "flavored": "VERB", "winner": "NOUN", "leaks": "NOUN", "ridiculing": "VERB", "outage": "NOUN", "mcgrath": "PROPN", "ld2d-#69345-1.doc": "NOUN", "justifies": "VERB", "apr": "PROPN", "sholids": "NOUN", "·": "PUNCT", "nuisance": "NOUN", "dangerous": "ADJ", "tonto": "PROPN", "inwardness": "NOUN", "lucky": "ADJ", "concede": "VERB", "diocese": "NOUN", "observe": "VERB", "fly": "VERB", "practices": "NOUN", "???": "PUNCT", "happily": "ADV", "shifting": "NOUN", "males": "NOUN", "whatnot": "NOUN", "sir": "NOUN", "buxton": "PROPN", "pears": "NOUN", "arby": "PROPN", "ksm": "PROPN", "insanity": "NOUN", "sample": "NOUN", "woud": "AUX", "accelerate": "VERB", "departing": "VERB", "d.": "PROPN", "re-looking": "VERB", "ecology": "NOUN", "resort": "NOUN", "recoils": "VERB", "southwest": "PROPN", "bras": "NOUN", "sighed": "VERB", "consequence": "NOUN", "specialists": "NOUN", "jafar": "PROPN", "david": "PROPN", "danny": "PROPN", "emotional": "ADJ", "77415-0027": "NUM", "customer": "NOUN", "clara": "PROPN", "witchcraft": "NOUN", "spur": "NOUN", "decreased": "VERB", "teeth": "NOUN", "stir": "VERB", "kolonaki": "PROPN", "spencer": "PROPN", "ferries": "NOUN", "rohatgi": "PROPN", "steeped": "VERB", "lipsticks": "NOUN", "bored": "ADJ", "sleek": "ADJ", "records": "NOUN", "choramine": "NOUN", "invasion": "NOUN", "alphabetical": "ADJ", "amen": "INTJ", "mr": "NOUN", "proceeding": "NOUN", "inherent": "ADJ", "infiltrate": "VERB", "co-ordinated": "VERB", "plenty": "NOUN", "urinary": "ADJ", "jwvs": "PROPN", "prongs": "NOUN", "skydiving": "NOUN", "irrigated": "ADJ", "cruze": "PROPN", "06/01/2001": "NUM", "advertisers": "NOUN", "initiatives": "NOUN", "pacific": "PROPN", "collaborators": "NOUN", "impediment": "NOUN", "faint": "ADJ", "candles": "NOUN", "routinely": "ADV", "bird": "NOUN", "damp": "ADJ", "management": "NOUN", "risen": "VERB", "enterprise": "NOUN", "deceiving": "VERB", "northward": "ADV", "hitting": "VERB", "c.dtf": "NOUN", "workpapers": "NOUN", "abraham": "PROPN", "gruen": "PROPN", "bna": "PROPN", "assets": "NOUN", "onto": "ADP", "bare": "ADJ", "animation": "NOUN", "a.k.a": "ADV", "rescue": "NOUN", "alienating": "VERB", "maui": "PROPN", "cassandra": "PROPN", "between": "ADP", "rights": "NOUN", "privatisation": "NOUN", "historically": "ADV", "minerals": "NOUN", "10th": "ADJ", "modes": "NOUN", "tours": "NOUN", "contingencies": "NOUN", "obliterating": "VERB", "subdue": "VERB", "recorder": "NOUN", "crayola": "PROPN", "snitches": "NOUN", "lined": "VERB", "ding": "INTJ", "montgomery": "PROPN", "09:52": "NUM", "managed": "VERB", "hitler": "PROPN", "neglects": "VERB", "koinonia": "PROPN", "mechaincs": "NOUN", "currant": "NOUN", "powers": "NOUN", "flats": "NOUN", "416-865-3704": "NUM", "silkies": "NOUN", "parishioners": "NOUN", "pipette": "NOUN", "fiancé": "NOUN", "socialize": "VERB", "taught": "VERB", "pigsty": "NOUN", "executions": "NOUN", "incomplete": "ADV", "april": "PROPN", "reversing": "VERB", "seal": "NOUN", "symptoms": "NOUN", "tupperware": "NOUN", "stalemated": "VERB", "surv": "VERB", "plurals": "NOUN", "processes": "NOUN", "skating": "VERB", "rgds": "NOUN", "socialist": "ADJ", "motherwell": "PROPN", "glistening": "VERB", "abiding": "ADJ", "joinery": "NOUN", "reopen": "VERB", "regent": "PROPN", "economy": "NOUN", "arbitrators": "NOUN", "activities": "NOUN", "expanding": "VERB", "mainstream": "ADJ", "laced": "VERB", "kenyatta": "PROPN", "hairpins": "NOUN", "gorgeous": "ADJ", "viewing": "VERB", "fitzsimons": "PROPN", "bumrungrad": "PROPN", "predefined": "ADJ", "hypnotize": "VERB", "justified": "ADJ", "coventry": "PROPN", "sampling": "NOUN", "sing": "VERB", "herbert": "PROPN", "unfamiliar": "ADJ", "programs": "NOUN", "drinks": "NOUN", "civilizations": "NOUN", "colonial": "ADJ", "http://pageturnpro2.com.s3-website-us-east-1.amazonaws.com/publications/201803/15/83956/pdf/131668002208352000_cpbj033018web.pdf": "PROPN", "shunted": "VERB", "prearranged": "VERB", "shek": "PROPN", "metaphors": "NOUN", "nazi": "PROPN", "redeem": "VERB", "midas": "PROPN", "eurostar": "PROPN", "9:46": "NUM", "alternate": "ADJ", "web": "NOUN", "hospitality": "NOUN", "pittsburgh": "PROPN", "919819602175": "NUM", "hidden": "VERB", "tugs": "NOUN", "stocky": "ADJ", "spines": "NOUN", "terminals": "NOUN", "hyperion": "PROPN", "know": "VERB", "titer": "NOUN", "unofficial": "ADJ", "arizona": "PROPN", "m.": "PROPN", "andrill": "PROPN", "terrell": "PROPN", "mill": "NOUN", "czech": "ADJ", "mazirat": "PROPN", "mxn": "NOUN", "ramsay": "PROPN", "galore": "ADV", "commission": "NOUN", "overheated": "ADJ", "perturbation": "NOUN", "973-3634": "NUM", "divinely": "ADV", "poitiers": "PROPN", "fam": "NOUN", "privatized": "VERB", "compaq": "PROPN", "jay": "PROPN", "predictions": "NOUN", "disclosed": "VERB", "radiometer": "NOUN", "eeftl": "PROPN", "sorrrow": "NOUN", "miami": "PROPN", "sour": "ADJ", "highway": "NOUN", "firmament": "NOUN", "gives": "VERB", "insists": "VERB", "tenth": "NOUN", "slowest": "ADJ", "casual": "ADJ", "spiked": "ADJ", "canned": "VERB", "stoop": "VERB", "trap": "NOUN", "militias": "NOUN", "lace": "NOUN", "nineteen-forties": "NOUN", "texts": "NOUN", "becomes": "VERB", "dark-panelled": "ADJ", "jelly": "NOUN", "borderline": "ADJ", "mouthful": "NOUN", "undershirt": "NOUN", "over": "ADP", "brown-pink": "ADJ", "suite": "NOUN", "38": "NUM", "pretzel": "NOUN", "conjectures": "NOUN", "u.n.": "PROPN", "11:02": "NUM", "late": "ADJ", "15:11": "NUM", "affiliates": "NOUN", "ranking": "ADJ", "upsetting": "ADJ", "kindy": "PROPN", "rican": "ADJ", "dimension": "NOUN", "dash": "VERB", "okinawa": "PROPN", "perceives": "VERB", "juvenile": "NOUN", "andrei": "PROPN", "kick": "NOUN", "wellshaped": "ADJ", "acpeds": "PROPN", "statuette": "NOUN", "germinate": "VERB", "engraved": "VERB", "fevers": "NOUN", "usamriid": "PROPN", "paschal": "PROPN", "non-philosophers": "NOUN", "retaliation": "NOUN", "escola": "PROPN", "generalizability": "NOUN", "macaulay": "PROPN", "gossip": "NOUN", "preparedness": "NOUN", "see": "VERB", "americas": "PROPN", "signaled": "VERB", "vigilantly": "ADV", "collaboratively": "ADV", "sacristy": "NOUN", "us$": "NOUN", "obscure": "ADJ", "peat": "NOUN", "starship": "PROPN", "luxurious": "ADJ", "rejected": "VERB", "blow": "VERB", "anesthetic": "NOUN", "giovannini": "PROPN", "manged": "VERB", "lackluster": "ADJ", "skytrain": "NOUN", "turned": "VERB", "ymsgr:sendim?mayursha&__hi+mayur...": "PROPN", "extend": "VERB", "winton": "PROPN", "scramble": "NOUN", "lng": "PROPN", "04:37": "NUM", "chung": "PROPN", "tenacious": "ADJ", "gillies": "PROPN", "alroot": "INTJ", "scenic": "ADJ", "functional": "ADJ", "annuals": "NOUN", "traders": "NOUN", "mountaineering": "NOUN", "cpuc": "PROPN", "winds": "NOUN", "•": "PUNCT", "press": "NOUN", "utilization": "NOUN", "ostensibly": "ADV", "bits": "NOUN", "christen": "VERB", "flicked": "VERB", "jason": "PROPN", "barclay": "PROPN", "testament": "NOUN", "reserves": "NOUN", "vanilla": "NOUN", "alabama": "PROPN", "debutans": "NOUN", "cakes": "NOUN", "braque": "PROPN", "swings": "VERB", "mabruk": "PROPN", "<<": "PUNCT", "writers": "NOUN", "seized": "VERB", "residual": "ADJ", "1.1": "NUM", "flags": "NOUN", "judy": "PROPN", "infrequent": "ADJ", "marriott": "PROPN", "lends": "VERB", "outsiders": "NOUN", "peak": "NOUN", "shakespeare": "PROPN", "posted": "VERB", "charged": "VERB", "wok": "NOUN", "nicktendo64": "PROPN", "bass": "PROPN", "shemin": "PROPN", "medusa": "PROPN", "crust": "NOUN", "extension": "NOUN", "scripts": "NOUN", "05/25/2001": "NUM", "prayed": "VERB", "'nt": "ADV", "sonnet": "NOUN", "b.": "VERB", "semi-pelagianism": "NOUN", "vienna": "PROPN", "drop": "NOUN", "kiosks": "NOUN", "count": "VERB", "fx": "NOUN", "mobiles": "NOUN", "feng": "PROPN", "cautiously": "ADV", "targeting": "VERB", "lightbulb": "NOUN", "cruising": "ADJ", "pipeline": "NOUN", "ctrl–c": "PROPN", "accepts": "VERB", "akropolis": "PROPN", "toilets": "NOUN", "needles": "NOUN", "hagrid": "PROPN", "wetter": "ADJ", "pjɛʁ": "PROPN", "1687": "NUM", "2470": "NUM", "reviewing": "VERB", "shall": "AUX", "mosquitoes": "NOUN", "nigh": "ADP", "confidently": "ADV", "instructing": "VERB", "informally": "ADV", "certainly": "ADV", "authority": "NOUN", "sacred": "ADJ", "amongst": "ADP", "terrified": "ADJ", "gibberish": "NOUN", "pardon": "VERB", "prompted": "VERB", "solis": "PROPN", "tourism": "NOUN", "arosa": "PROPN", "brides": "NOUN", "egos": "NOUN", "efficient": "ADJ", "k.": "PROPN", "initials": "NOUN", "flirt": "VERB", "loch": "PROPN", "payoff": "NOUN", "signed": "VERB", "leonia": "PROPN", "transferring": "VERB", "tooling": "NOUN", "karachi": "PROPN", "vial": "NOUN", "shaykh": "PROPN", "54,000": "NUM", "intact": "ADJ", "meager": "ADJ", "channing": "PROPN", "england": "PROPN", "registering": "VERB", "47th": "ADJ", "dharma": "PROPN", "cge": "NOUN", "sne": "PROPN", "encompassing": "VERB", "flooding": "NOUN", "sightseeing": "NOUN", "holland": "PROPN", "cosmetic": "ADJ", "halos": "NOUN", "rapists": "NOUN", "oz": "NOUN", "andrews": "PROPN", "chehel": "PROPN", "compliant": "ADJ", "jūsan'ya": "PROPN", "margot": "PROPN", "formations": "NOUN", "dislocated": "VERB", "ting": "PROPN", "oasis": "PROPN", "z1": "PROPN", "7.64": "NUM", "grew": "VERB", "figuratively": "ADV", "bistro": "PROPN", "crowns": "NOUN", "soft-looking": "ADJ", "boarders": "NOUN", "nailed": "VERB", "spouting": "VERB", "flagship": "NOUN", "ruddy": "ADJ", "bobbed": "VERB", "zealand": "PROPN", "olds": "NOUN", "straight": "ADJ", "vaccines": "NOUN", "bediener": "NOUN", "sharon": "PROPN", "abnormal": "ADJ", "amneh": "PROPN", "somewhat": "ADV", "muddy": "ADJ", "1:00": "NUM", "kramer": "PROPN", "hummus": "NOUN", "adelle": "PROPN", "1990": "NUM", "necessity": "NOUN", "refurbish": "VERB", "costumes": "NOUN", "sanded": "VERB", "romelu": "PROPN", "ntu": "PROPN", "mall": "NOUN", "street": "NOUN", "warrants": "NOUN", "manufacturers": "NOUN", "patents": "NOUN", "smoke": "NOUN", "were": "AUX", "excels": "VERB", "timbers": "NOUN", "purged": "VERB", "beto": "PROPN", "dupes": "NOUN", "ofra": "PROPN", "dykman": "PROPN", "sheik": "NOUN", "306": "NUM", "graduands": "NOUN", "2007": "NUM", "attractive": "ADJ", "hyper": "ADJ", "yeah": "INTJ", "dye": "PROPN", "existent": "ADJ", "chernobyl": "PROPN", "reflect": "VERB", "muscle": "NOUN", "kiln": "NOUN", "oldham": "PROPN", "pacifically": "ADV", "allegedly": "ADV", "rape": "NOUN", "indivero": "PROPN", "707-885-2508": "NUM", "ngoc": "PROPN", "chiefs": "NOUN", "montparnasse": "PROPN", "ghirlandaio": "PROPN", "raced": "VERB", "put": "VERB", "overarching": "ADJ", "grease": "NOUN", "obsessive": "ADJ", "books": "NOUN", "misinformation": "NOUN", "casting": "NOUN", "rocked": "VERB", "undoubtedly": "ADV", "sentences": "NOUN", "reclusive": "ADJ", "onpeak": "ADV", "indirect": "ADJ", "laodicea": "PROPN", "vivien": "PROPN", "embarked": "VERB", "mexico": "PROPN", "website": "NOUN", "transmit": "VERB", "imposingly": "ADV", "supposed": "VERB", "dursleys": "PROPN", "revolve": "VERB", "re-wiring": "NOUN", "rabbits": "NOUN", "populated": "VERB", "ignorant": "ADJ", "connaught": "PROPN", "smug": "ADJ", "ribbon": "NOUN", "immensely": "ADV", "ideological": "ADJ", "fleming": "PROPN", "tms": "NOUN", "slumbered": "VERB", "1.00": "NUM", "flu": "NOUN", "evening": "NOUN", "aka": "ADV", "ka-chun": "PROPN", "accomplishment": "NOUN", "firing": "VERB", "filters": "NOUN", "clients": "NOUN", "functionality": "NOUN", "bathing": "ADJ", "beds": "NOUN", "1423": "NUM", "aroused": "VERB", "surveillance": "NOUN", "sweet": "ADJ", "unattended": "ADJ", "based": "VERB", "intra-day": "ADJ", "50's": "NOUN", "pity": "NOUN", "pillagings": "NOUN", "jemaah": "PROPN", "nowheresville": "PROPN", "winker": "NOUN", "ss": "NOUN", "wine": "NOUN", "11:57": "NUM", "resources": "NOUN", "pride": "NOUN", "accomodating": "ADJ", "dreading": "VERB", "encouragingly": "ADV", "cigarette": "NOUN", "racketeers": "NOUN", "lynn": "PROPN", "slandered": "VERB", "dotted": "VERB", "homeopath": "NOUN", "assimilate": "VERB", "suits": "VERB", "uh": "INTJ", "boardroom": "NOUN", "hoover": "PROPN", "kowalke": "PROPN", "??????": "PUNCT", "1,700": "NUM", "deception": "NOUN", "moto": "NOUN", "meadowrun": "PROPN", "helping": "VERB", "ceramic": "ADJ", "passcode": "NOUN", "toiletries": "NOUN", "miss": "VERB", "collateral": "NOUN", "rivers": "PROPN", "combination": "NOUN", "ego": "NOUN", "kennels": "NOUN", "climbed": "VERB", "makes": "VERB", "8.3": "NUM", "competed": "VERB", "glibness": "NOUN", "capacities": "NOUN", "345-9945": "NUM", "negotiate": "VERB", "prints": "NOUN", "tankers": "NOUN", "literalist": "NOUN", "coeur": "PROPN", "stategy": "NOUN", "ontogeny": "NOUN", "repeating": "VERB", "cornelissen": "PROPN", "nonviolent": "ADJ", "poll": "NOUN", "entery": "NOUN", "assam": "PROPN", "carly": "PROPN", "aditya": "PROPN", "clattering": "VERB", "draws": "VERB", "clarity": "NOUN", "aquasafe": "NOUN", "raw-potato": "NOUN", "interacting": "VERB", "3143c": "PROPN", "crest": "NOUN", "$ometime$": "ADV", "baptized": "VERB", "campaigning": "NOUN", "gatherings": "NOUN", "feasible": "ADJ", "necessarily": "ADV", "laden": "PROPN", "variables": "NOUN", "confine": "VERB", "microns": "NOUN", "utters": "VERB", "funkhouser": "PROPN", "already": "ADV", "similar": "ADJ", "camper": "NOUN", "thanked": "VERB", "mcmurdo": "PROPN", "648": "NUM", "marvellous": "ADJ", "taliban": "PROPN", "coughed": "VERB", "obsess": "VERB", "fish": "NOUN", "exposition": "NOUN", "m.s.": "PROPN", "mandir": "PROPN", "santo": "PROPN", "laura": "PROPN", "level": "NOUN", "assumes": "VERB", "gastric": "ADJ", "chairpersons": "NOUN", "3.7": "NUM", "guesswork": "NOUN", "collage": "NOUN", "rightly": "ADV", "reaches": "VERB", "reestablish": "VERB", "mazda": "PROPN", "pauvre": "PROPN", "imperative": "ADJ", "mcgowan": "PROPN", "1834": "NUM", "rudolf": "PROPN", "subconsciously": "ADV", "newsgroup": "NOUN", "cloyingly": "ADV", "framed": "VERB", "fiscal": "ADJ", "harsh": "ADJ", "illnesses": "NOUN", "1e": "NOUN", "2.8": "NUM", "favors": "VERB", "epstein": "PROPN", "ridge": "PROPN", "fierce": "ADJ", "fighters": "NOUN", "otc": "NOUN", "prefere": "VERB", "utilities": "NOUN", ".292": "NUM", "here": "ADV", "narrowed": "VERB", "successes": "NOUN", "drinkers": "NOUN", "lifespan": "NOUN", "wins": "VERB", "sinatra": "PROPN", "tending": "VERB", "transpired": "VERB", "roadside": "NOUN", "virgil": "PROPN", "director-general": "NOUN", "nicaragua": "PROPN", "towed": "VERB", "travelled": "VERB", "wo": "AUX", "insolence": "NOUN", "spider": "NOUN", "“": "PUNCT", "rekohu": "PROPN", "fragmentary": "ADJ", "foresaw": "VERB", "12:42": "NUM", "lexus": "PROPN", "henderson": "PROPN", "700": "NUM", "munafò": "PROPN", "seated": "VERB", "birthday": "NOUN", "reproducibility": "NOUN", "booths": "NOUN", "evelyn": "PROPN", "covers": "NOUN", "wilson": "PROPN", "bender": "PROPN", "violating": "VERB", "flocked": "VERB", "soybean": "NOUN", "exclusively": "ADV", "paw": "NOUN", "stainless": "ADJ", "713/871-5119": "NUM", "halloween": "PROPN", "funnels": "NOUN", "paedophilia": "NOUN", "warped": "VERB", "nonjudgmental": "ADJ", "supervisor": "NOUN", "5,500,000": "NUM", "withdraw": "VERB", "monopoly": "NOUN", "access": "NOUN", "nosy": "ADJ", "dillard": "PROPN", "conceivable": "ADJ", "televising": "VERB", "ringing": "ADJ", "boots": "NOUN", "chaharbagh": "PROPN", "arid": "ADJ", "tenured": "ADJ", "legislators": "NOUN", "bowl": "NOUN", "cognitively": "ADV", "contorted": "ADJ", "posselt": "PROPN", "mingle": "VERB", "oven": "NOUN", "annoy": "VERB", "chooses": "VERB", "leninism": "NOUN", "sao": "PROPN", "sips": "NOUN", "choir": "NOUN", "copy": "NOUN", "plaudits": "NOUN", "earnings": "NOUN", "remind": "VERB", "weasleys": "PROPN", "commendable": "ADJ", "athlete": "NOUN", "deepest": "ADJ", "buses": "NOUN", "gross": "ADJ", "strenuous": "ADJ", "peacekeepers": "NOUN", "innermost": "ADJ", "bow": "NOUN", "enjambed": "VERB", "marrying": "VERB", "divorcing": "VERB", "mackie": "PROPN", "backyard": "NOUN", "fingernail": "NOUN", "restaurants": "NOUN", "diego": "PROPN", "kyle.jones@ra": "PROPN", "italian": "ADJ", "hideous": "ADJ", "incorporates": "VERB", "bubbles": "NOUN", "sogged": "ADJ", "junctions": "NOUN", "sprites": "NOUN", "1877": "NUM", "mellon": "PROPN", "thinker": "NOUN", "vilt": "PROPN", "garbage": "NOUN", "nesting": "VERB", "reprinted": "VERB", "abusers": "NOUN", "motorway": "NOUN", "kaplan": "PROPN", "armholes": "NOUN", "whitened": "VERB", "bias": "NOUN", "poetic": "ADJ", "strictures": "NOUN", "ecosystem": "NOUN", "domestically": "ADV", "hawijah": "PROPN", "convoys": "NOUN", "1982": "NUM", "erupts": "VERB", "succession": "NOUN", "tab": "NOUN", "decline": "NOUN", "bisexual": "ADJ", "capitalizing": "VERB", "guests": "NOUN", "trips": "NOUN", "covering": "VERB", "watermelon": "NOUN", "gelceuticals": "NOUN", "interpretative": "ADJ", "alr-": "ADV", "inauguration": "NOUN", "fraternity": "NOUN", "thompson": "PROPN", "giggling": "VERB", "restaurant": "NOUN", "mean": "VERB", "volunteers": "NOUN", "leered": "VERB", "rebellion": "NOUN", "libya": "PROPN", "cst": "PROPN", "directionless": "ADJ", "fertile": "ADJ", "timelessness": "NOUN", "distaste": "NOUN", "lift": "VERB", "created": "VERB", "unexpected": "ADJ", "yarn": "NOUN", "f%#king": "ADJ", "given": "VERB", "shores": "NOUN", "dregs": "NOUN", "twenty": "NUM", "eater": "NOUN", "badr": "PROPN", "smart": "ADJ", "solidarity": "NOUN", "daniels": "PROPN", "sugared": "ADJ", "picasa": "PROPN", "wise": "ADJ", "preserving": "VERB", "140": "NUM", "sear's": "PROPN", "methylene": "PROPN", "angles": "NOUN", "pass": "VERB", "barese": "NOUN", "strips": "VERB", "amsterdam": "PROPN", "fires": "NOUN", "innkeeper": "NOUN", "destroyer": "NOUN", "irrigate": "VERB", "noam": "PROPN", "abbotsford": "PROPN", "exalted": "ADJ", "capitol": "PROPN", "12,000": "NUM", "codifies": "VERB", "timely": "ADJ", "discomfort": "NOUN", "crimson": "ADJ", "organisations": "NOUN", "manifests": "VERB", "upstage": "VERB", "luncheon": "NOUN", "starfish": "NOUN", "wonderful": "ADJ", "sars": "PROPN", "pythons": "NOUN", "69th": "ADJ", "....................": "PUNCT", "xmas": "PROPN", "hermit": "NOUN", "pleasurable": "ADJ", "flipping": "VERB", "grenades": "NOUN", "nationality": "NOUN", "his": "PRON", "savannah": "PROPN", "famous": "ADJ", "co-workers": "NOUN", "environmentalists": "NOUN", "products": "NOUN", "midway": "ADV", "tongues": "NOUN", "braden": "PROPN", "ultrasonic": "PROPN", "2002": "NUM", "try": "VERB", "gaily": "ADV", "ratify": "VERB", "slides": "NOUN", "http://en.wikipedia.org/wiki/john_balance": "PROPN", "september": "PROPN", "garten": "PROPN", "coffee": "NOUN", "718-780-0276": "NUM", "http://www.radianz.com": "PROPN", "structured": "VERB", "strut": "VERB", "gianna": "PROPN", "guacamole": "NOUN", "customers": "NOUN", "oatmeal": "NOUN", "liq": "NOUN", "historians": "NOUN", "overwhelming": "ADJ", "sainte": "PROPN", "trillions": "NOUN", "potato": "NOUN", "thrashing": "VERB", "brazosport": "PROPN", "reconcilable": "ADJ", "nn": "NUM", "fuse": "NOUN", "home": "NOUN", "winces": "VERB", "donkey": "NOUN", "googlescholar": "PROPN", "1881": "NUM", "adam": "PROPN", "prominence": "NOUN", "cube": "NOUN", "aromatic": "ADJ", "winding": "ADJ", "radiographs": "NOUN", "conclusions": "NOUN", "halted": "VERB", "montague": "PROPN", "ling": "ADV", "intestines": "NOUN", "arbitrary": "ADJ", "ruling": "NOUN", "bourdain": "PROPN", "austen": "PROPN", "builder": "NOUN", "cockroaches": "NOUN", "supernatural": "PROPN", "mistakenly": "ADV", "elves": "NOUN", "undergrowth": "NOUN", "ron.com": "PROPN", "engineered": "VERB", "ken": "PROPN", "paused": "VERB", "arrangements": "NOUN", "1683": "NUM", "trademarks": "VERB", "jihadis": "NOUN", "ecp": "PROPN", "modernization": "NOUN", "lotos": "NOUN", "http://www.world-nuclear.org/info/chernobyl/inf07.htm": "PROPN", "saber": "NOUN", "li": "PROPN", "processor": "NOUN", "unbelievably": "ADV", "kosovo": "PROPN", "urination": "NOUN", "issue": "NOUN", "neighborly": "ADJ", "diversity": "NOUN", "clinton": "PROPN", "marlow": "PROPN", "slaveholders": "NOUN", "safely": "ADV", "315": "NUM", "counterfeit": "ADJ", "blogosphere": "NOUN", "astounding": "ADJ", "surrounded": "VERB", "pacquiao": "PROPN", "saluted": "VERB", "donate": "VERB", "s...@sonic.net": "PROPN", "noyce": "PROPN", "1594": "NUM", "romatic": "ADJ", "power": "NOUN", "veronica": "PROPN", "climber": "NOUN", "uaar": "PROPN", "faithless": "ADJ", "aftershocks": "NOUN", "dubious": "ADJ", "plazas": "NOUN", "underground": "ADJ", "backdated": "VERB", "adapt": "VERB", "gen.": "PROPN", "remedy": "NOUN", "turd": "NOUN", "yeo": "PROPN", "ans": "CCONJ", "cardboard": "NOUN", "practise": "VERB", "electrolyte": "NOUN", "posed": "VERB", "eugene": "PROPN", "melded": "VERB", "recalls": "VERB", "berlin": "PROPN", "tap": "NOUN", "watson": "PROPN", "milan": "PROPN", "blew": "VERB", "secretary": "PROPN", "appeared": "VERB", "information": "NOUN", "uninhabited": "ADJ", "death-speckled": "ADJ", "disquiet": "NOUN", "conferees": "NOUN", "comcast": "PROPN", "beige": "ADJ", "arbery": "PROPN", "senator": "PROPN", "à": "PROPN", "t2i": "NOUN", "ethnic": "ADJ", "satay": "NOUN", "lawmakers": "NOUN", "unwrap": "VERB", "defendant": "NOUN", "misrepresent": "VERB", "diwaniya": "PROPN", "ability": "NOUN", "cortese": "PROPN", "wings": "NOUN", "winnt": "PROPN", "buddy": "NOUN", "spice": "NOUN", "transcendent": "ADJ", "benin": "PROPN", "payed": "VERB", "use": "VERB", "cleaner": "NOUN", "charlie": "PROPN", "onboard": "ADV", "settlement": "NOUN", "polls": "NOUN", "obstinate": "ADJ", "each": "DET", "hamas": "PROPN", "banked-over": "ADJ", "fewest": "ADJ", "skulking": "VERB", "belch": "NOUN", "strategic": "ADJ", "equivalence": "NOUN", "kano": "PROPN", "janeiro": "PROPN", "księży": "PROPN", "celsius": "PROPN", "gallon": "NOUN", "ooze": "NOUN", "gabonese": "ADJ", "evaluation": "NOUN", "ρ": "NOUN", "antonio": "PROPN", "half-embarrassed": "VERB", "behavioral": "ADJ", "invoke": "VERB", "yet": "ADV", "sorrows": "NOUN", "endorsements": "NOUN", "paste": "VERB", "metascience": "NOUN", "firefox": "PROPN", "platter": "NOUN", "resembles": "VERB", "homework": "NOUN", "attacked": "VERB", "attaches": "VERB", "nagaski": "PROPN", "ps.": "NOUN", "migrates": "VERB", "contrasts": "NOUN", "balochistan": "PROPN", "fatigue": "NOUN", "offshore": "ADJ", "weeks": "NOUN", "implicated": "VERB", "spang": "PROPN", "berthage": "NOUN", "monarch": "NOUN", "aims": "VERB", "spears": "PROPN", "yack": "PROPN", "howard": "PROPN", "gather": "VERB", "panel": "NOUN", "non-realism": "NOUN", "warranty": "NOUN", "encyclopedia": "PROPN", "omelettes": "NOUN", "adventurers": "NOUN", "side-locks": "NOUN", "hitch": "NOUN", "topless": "ADJ", "mature": "ADJ", "equine": "ADJ", "inwood": "PROPN", "sq": "ADJ", "guantanamo": "PROPN", "subtract": "VERB", "ribbons": "NOUN", "congested": "ADJ", "advertising": "NOUN", "10/29/2000": "NUM", "quesadillas": "NOUN", "alt.animals": "NOUN", "apparatus": "NOUN", "rooting": "VERB", "brilliant": "ADJ", "elastic": "NOUN", "irritation": "NOUN", "websphere": "PROPN", "imports": "NOUN", "amanda": "PROPN", "f&am": "PROPN", "5.3": "NUM", "publish": "VERB", "qualification": "NOUN", "weary": "ADJ", "bile-coloured": "ADJ", "ld2d-#69397-1.doc": "NOUN", "brad": "PROPN", "equating": "VERB", "attach": "VERB", "crawford": "PROPN", "alcoholics": "NOUN", "satisfactory": "ADJ", "p&l": "NOUN", "drooling": "VERB", "possible": "ADJ", "ghanaians": "NOUN", "ppm": "NOUN", "salon": "NOUN", "violators": "NOUN", "racked": "VERB", "proven": "VERB", "tremor": "NOUN", "grasping": "VERB", "hanged": "VERB", "suffices": "VERB", "sprung": "VERB", "shea": "PROPN", "investor": "NOUN", "representing": "VERB", "councillors": "NOUN", "julien": "PROPN", "!!!!!!!!!!!!!!!!!!!!!": "PUNCT", "ciac": "NOUN", "stoning": "NOUN", "vr": "PROPN", "misunderstanding": "NOUN", "---------": "PUNCT", "2015": "NUM", "joo-ho": "PROPN", "gosh": "INTJ", "fortunately": "ADV", "book": "NOUN", "interviewing": "VERB", "execute": "VERB", "carefully": "ADV", "play": "VERB", "1540s": "NOUN", "xovetic": "PROPN", "catagory": "NOUN", "centro": "PROPN", "earl": "PROPN", "flourished": "VERB", "interesting": "ADJ", "heartbroken": "ADJ", "illustrating": "VERB", "v": "NOUN", "1977": "NUM", "rambunctious": "ADJ", "doorknobs": "NOUN", "abby": "PROPN", "nutrition": "NOUN", "issuing": "VERB", "learn": "VERB", "crow": "NOUN", "recommend": "VERB", "mainland": "NOUN", "birthdate": "NOUN", "approaches": "NOUN", "led": "VERB", "assertive": "ADJ", "mastery": "NOUN", "03:15": "NUM", "###": "SYM", "called": "VERB", "polluted": "VERB", "doubles": "NOUN", "illness": "NOUN", "controls": "NOUN", "foodshed": "NOUN", "08:00": "NUM", "contracting": "NOUN", "lanterns": "NOUN", "credence": "NOUN", "1689": "NUM", "gabriel": "PROPN", "dakota": "PROPN", "rewinding": "VERB", "pakistan": "PROPN", "instilling": "VERB", "moniker": "NOUN", "eating": "VERB", "no-6": "NUM", "bugs": "NOUN", "macao": "PROPN", "___________________________________________": "SYM", "satisfied": "ADJ", "award": "NOUN", "dicot": "NOUN", "emerges": "VERB", "balloting": "NOUN", "coco": "PROPN", "calvinist": "ADJ", "descend": "VERB", "logically": "ADV", "4.98": "NUM", "evansville": "PROPN", "volunteer": "NOUN", "+++": "SYM", "ph.d.": "NOUN", "arrangement": "NOUN", "edinburgh": "PROPN", "advertised": "VERB", "joe_lardy@cargill.com": "PROPN", "resorts": "NOUN", "machine": "NOUN", "boob": "NOUN", "transporting": "VERB", "anyways": "ADV", "symmetries": "NOUN", "badge": "NOUN", "references": "NOUN", "kumar": "PROPN", "basse": "PROPN", "ye$": "INTJ", "encourages": "VERB", "carpets": "NOUN", "wessex": "PROPN", "deposit": "NOUN", "pennies": "NOUN", "11/8/00": "NUM", "measurements": "NOUN", "danced": "VERB", "silently": "ADV", "dynamic": "ADJ", "advising": "VERB", "higher": "ADJ", "ankles": "NOUN", "threadbare": "ADJ", "chai": "NOUN", "gentlemanly": "ADJ", "endured": "VERB", "d'alembert": "PROPN", "startled": "ADJ", "forearm": "NOUN", "misfortune": "NOUN", "52": "NUM", "saltford": "PROPN", "50000": "NUM", "downwelling": "VERB", "appearance": "NOUN", "public-relations": "ADJ", "anacapa": "PROPN", "favorably": "ADV", "sheltered": "VERB", "consulting": "NOUN", "zoom": "NOUN", "diplomacy": "NOUN", "stuff": "NOUN", "caleb": "PROPN", "pie": "NOUN", "berg": "PROPN", "ecosystems": "NOUN", "tattoed": "VERB", "thuy": "PROPN", "brendler": "PROPN", "frequented": "VERB", "bernoulli": "PROPN", "entrenched": "VERB", "jérôme": "PROPN", "practicing": "VERB", "pro-establishment": "ADJ", "atithi": "PROPN", "specials": "NOUN", "coconut": "NOUN", "guffaw": "NOUN", "reprisal": "NOUN", "chemical": "ADJ", "potentially": "ADV", "turquoise": "NOUN", "713/853-5984": "NUM", "evenly": "ADV", "kool": "PROPN", "relative": "ADJ", "conduits": "NOUN", "lessen": "VERB", "instruments": "NOUN", "wajda": "PROPN", "watered": "VERB", "sow": "VERB", "attributable": "ADJ", "firstly": "ADV", "potent": "ADJ", "mailer": "NOUN", "powerless": "ADJ", "artistically": "ADV", "elude": "VERB", "trunk": "NOUN", "chronic": "ADJ", "tanned": "ADJ", "processing": "NOUN", "eyebrows": "NOUN", "dynamically": "ADV", "attack": "NOUN", "datamanager": "NOUN", "decook": "PROPN", "asylum": "NOUN", "engage": "VERB", "emptiness": "NOUN", "accident": "NOUN", "scavenging": "ADJ", "hurry": "NOUN", "padmasana": "NOUN", "republicans": "PROPN", "springs": "PROPN", "defended": "VERB", "rinsed": "VERB", "sailing": "VERB", "nirmal": "PROPN", "reportedly": "ADV", "feat": "NOUN", "funnel": "NOUN", "bernard": "PROPN", "sleepless": "ADJ", "termination": "NOUN", "hoping": "VERB", "fairness": "NOUN", "tortured": "VERB", "indignation": "NOUN", "dkk": "SYM", "iguaçu": "PROPN", "-----------------------------------------------------------------------": "PUNCT", "reinstein": "PROPN", "perv": "NOUN", "yahoo": "PROPN", "assign": "VERB", "componential": "ADJ", "attaching": "VERB", "earnestly": "ADV", "trey": "PROPN", "flanks": "NOUN", "films": "NOUN", "1958": "NUM", "renewing": "VERB", "rumors": "NOUN", "congressman": "NOUN", "bryer": "NOUN", "9221": "NUM", "retroactive": "ADJ", "crystal-clear": "ADJ", "defibrillator": "NOUN", "traditional": "ADJ", "fisheries": "NOUN", "orderd": "VERB", "signifies": "VERB", "liberty": "PROPN", "spires": "NOUN", "reacted": "VERB", "hmc": "PROPN", "expanse": "NOUN", "vegetarianism": "PROPN", "collasped": "VERB", "ingrown": "ADJ", "mircles": "NOUN", "episcopal": "PROPN", "petrified": "ADJ", "nmanne@susmangodfrey.com": "PROPN", "detainees": "NOUN", "tana.jones@en": "PROPN", "side": "NOUN", "/": "SYM", "w/": "ADP", "fluorescent": "ADJ", "anytime": "ADV", "advisor": "NOUN", "hera": "PROPN", "condemned": "VERB", "2,210": "NUM", "888-422-7132": "NUM", "boasts": "VERB", "expressive": "ADJ", "honors": "NOUN", "branch": "NOUN", "restful": "ADJ", "philip": "PROPN", "sister": "NOUN", "remission": "NOUN", "lower": "ADJ", "adn": "CCONJ", "prankster": "NOUN", "unplaced": "ADJ", "contemptuously": "ADV", "self-righteously": "ADV", "mud": "NOUN", "gouging": "NOUN", "riso": "NOUN", "!!!": "PUNCT", "drowning": "VERB", "congratulations": "NOUN", "clough": "PROPN", "saturdays": "NOUN", "imu": "PROPN", "idle": "ADJ", "diameter": "NOUN", "purportedly": "ADV", "grande": "PROPN", "03/02/2001": "NUM", "glamorous": "ADJ", "strengthen": "VERB", "gakuru": "PROPN", "widest": "ADJ", "yr.": "NOUN", "conned": "VERB", "grocerys": "NOUN", "bestiality": "NOUN", "grazing": "VERB", "leads": "VERB", "disguise": "NOUN", "butterfly": "NOUN", "daydreams": "NOUN", "lifted": "VERB", "nineteen": "NUM", "presenter": "NOUN", "startling": "ADJ", "shallow": "ADJ", "movimento": "PROPN", "scissored": "ADJ", "202": "NUM", "makers": "NOUN", "goebbels": "PROPN", "resultant": "ADJ", "premiums": "NOUN", "massachusetts": "PROPN", "determine": "VERB", "tin-billy": "NOUN", "black": "ADJ", "lbs": "NOUN", "teresa": "PROPN", "quadrant": "NOUN", "26th": "NOUN", "17,500": "NUM", "532-3836": "NUM", "syntactic": "ADJ", "turkish": "ADJ", "andes": "PROPN", "brotherhood": "PROPN", "monkey": "NOUN", "buckley": "PROPN", "revolution": "NOUN", "pachomius": "PROPN", "helium": "NOUN", "downsizing": "NOUN", "expected": "VERB", "drowned": "VERB", "wahhabis": "PROPN", "07:55": "NUM", "scary": "ADJ", "repugnant": "ADJ", "reporter": "NOUN", "branford": "PROPN", "12:12": "NUM", "bondad": "PROPN", "dozed": "VERB", "nothing": "PRON", "precipitation": "NOUN", "regretted": "VERB", "honour": "NOUN", "vistas": "NOUN", "buildup": "NOUN", "confirmations": "NOUN", "sordid": "ADJ", "8.00": "NUM", "canan": "PROPN", "pasta": "NOUN", "handily": "ADV", "euros": "NOUN", "quantity": "NOUN", "non-indians": "PROPN", "leather": "NOUN", "relaxation": "NOUN", "s@p": "NOUN", "glenn": "PROPN", "guitar": "NOUN", "graduation": "NOUN", "case": "NOUN", "nobel": "PROPN", "stand-offish": "ADJ", "inhaler": "NOUN", "squeezed": "VERB", "øhav": "PROPN", "reckon": "VERB", "aiding": "VERB", "difficulties": "NOUN", "starched": "VERB", "sciri": "PROPN", "ikhbariya": "PROPN", "https://www.nytimes.com/2017/04/16/technology/inside-the-hotel-industrys-plan-to-combat-airbnb.html": "PROPN", "80y": "NOUN", "keys": "NOUN", "ambiguity": "NOUN", "disruption": "NOUN", "lemell": "PROPN", "december": "PROPN", "offerings": "NOUN", "718-780-0046": "NUM", "mommy": "NOUN", "deteriorating": "VERB", "middlebrooks": "PROPN", "texan": "ADJ", "1989": "NUM", "geofence": "NOUN", "implemented": "VERB", "napa": "PROPN", "drills": "NOUN", "sieve": "NOUN", "des": "PROPN", "fascination": "NOUN", "misleading": "ADJ", "enormous": "ADJ", "surrealist": "ADJ", "downtown": "NOUN", "fleck": "PROPN", "nags": "NOUN", "bothered": "VERB", "boxwood": "NOUN", "horseshoes": "NOUN", "hmmmm": "INTJ", "edgar": "PROPN", "package": "NOUN", "incompetent": "ADJ", "dubbed": "VERB", "liquidations": "NOUN", "8274": "NUM", "abdullah": "PROPN", "busiest": "ADJ", "unchanged": "ADJ", "fancies": "VERB", "maguire": "PROPN", "perks": "NOUN", "punk": "NOUN", "expire": "VERB", "refinement": "NOUN", "opposite": "ADJ", "&": "CCONJ", "julie": "PROPN", "lists": "NOUN", "marbles": "PROPN", "reduce": "VERB", "recrudescence": "NOUN", "pasture": "NOUN", "ʻōlelo": "PROPN", "introspection": "NOUN", "spreadsheet-like": "ADJ", "freight": "NOUN", "nebulous": "ADJ", "kidnapped": "VERB", "mantia": "PROPN", "interjection": "NOUN", "percentile": "NOUN", "eta_revision0307.doc": "NOUN", "ossoff": "PROPN", "’d": "AUX", "e-mailed": "VERB", "dramatic": "ADJ", "y": "PROPN", "uin": "NOUN", "furry": "ADJ", "replete": "ADJ", "karol": "PROPN", "punches": "NOUN", "leftist": "NOUN", "sand": "NOUN", "delicately": "ADV", "alibek": "PROPN", "claudio": "PROPN", "caverns": "NOUN", "hassan": "PROPN", "motions": "NOUN", "boggles": "VERB", "hyperbole": "NOUN", "recite": "VERB", "spar": "PROPN", "gang": "NOUN", "andres": "PROPN", "eggs": "NOUN", "booked": "VERB", "flower": "NOUN", "predetermined": "VERB", "mediation": "NOUN", "aptly": "ADV", "mater": "NOUN", "embryo": "NOUN", "potpourri": "NOUN", "noel": "PROPN", ".265": "NUM", "editing": "NOUN", "cup": "NOUN", "sunglasses": "NOUN", "richest": "ADJ", "figured": "VERB", "mention": "VERB", "brothers": "NOUN", "laughter": "NOUN", "winking": "VERB", "manoeuvring": "NOUN", "checked": "VERB", "seriousness": "NOUN", "habitation": "NOUN", "underwrite": "VERB", "harbour": "NOUN", "sadat": "PROPN", "135th": "ADV", "contacting": "VERB", "fracture": "NOUN", "enveloping": "VERB", "immigrant": "NOUN", "bully": "NOUN", "sneak": "VERB", "rouge": "NOUN", "tension": "NOUN", "mold": "NOUN", "napkin": "NOUN", "crossword": "NOUN", "1871": "NUM", "sworn": "VERB", "incomes": "NOUN", "lifestyle": "NOUN", "withdrawal": "NOUN", "miners": "NOUN", "plagued": "VERB", "dispossesed": "ADJ", "theodorus": "PROPN", "shin-wook": "PROPN", "applications": "NOUN", "multiplying": "VERB", "prize": "NOUN", "usd": "SYM", "spay": "NOUN", "ticks": "VERB", "convict": "NOUN", "collectively": "ADV", "attracted": "VERB", "translation": "NOUN", "depredations": "NOUN", "sonoran": "PROPN", "faced": "VERB", "fucked": "VERB", "******************************************************************": "PUNCT", "fresh": "ADJ", "tattoo": "NOUN", "notepad": "NOUN", "102": "NUM", "calmness": "NOUN", "0491": "NUM", "rufinus": "PROPN", "exact": "ADJ", "naha": "PROPN", "suffrage": "NOUN", "girl": "NOUN", "esports": "PROPN", "lbj": "PROPN", "subscribe": "VERB", "seperates": "VERB", "vent": "NOUN", "interweave": "VERB", "iceberg": "NOUN", "vested": "ADJ", "unfreeze": "VERB", "leering": "VERB", "citizen": "NOUN", "$2,000": "NUM", "doled": "VERB", "mess": "NOUN", "highlight": "NOUN", "smirk": "NOUN", "flooring": "NOUN", "baggio": "PROPN", "’73": "NUM", "angel": "NOUN", "5000": "NUM", "apricot": "NOUN", "consultants": "NOUN", "pediatrics": "PROPN", "smudge": "VERB", "dealerships": "NOUN", "gatorade": "PROPN", "inks": "NOUN", "divorced": "ADJ", "challenged": "VERB", "confusing": "ADJ", "retraced": "VERB", "mile": "NOUN", "optionality": "NOUN", "sources": "NOUN", "smirking": "VERB", "22,600": "NUM", "endangering": "VERB", "forefinger": "NOUN", "compelled": "VERB", "revolutionizing": "VERB", "explored": "VERB", "protect": "VERB", "benioff": "PROPN", "recall": "VERB", "onshore": "ADV", "refreshed": "VERB", "post-season": "ADJ", "wai'd": "VERB", "worlds": "NOUN", "elevated": "VERB", "erythema": "NOUN", "sithamparanathan": "PROPN", "liking": "VERB", "establishing": "VERB", "rummy": "PROPN", "stripe": "NOUN", "10:34": "NUM", "indoor": "ADJ", "subscribers": "NOUN", "perfect": "ADJ", "crypto": "NOUN", "reuptake": "NOUN", "m18": "PROPN", "easing": "VERB", "transported": "VERB", "scorn": "NOUN", "days": "NOUN", "stools": "NOUN", "microscope": "NOUN", "iris": "PROPN", "peter": "PROPN", "detained": "VERB", "pr": "NOUN", "reconstruction": "NOUN", "troops": "NOUN", "7:00": "NUM", "cursed": "VERB", "ofos": "NOUN", "true": "ADJ", "occurred": "VERB", "end": "NOUN", "sunroom": "NOUN", "lol": "INTJ", "diglipur": "PROPN", "icecream": "NOUN", "belle": "PROPN", "melt": "VERB", "sate": "VERB", "newbies": "NOUN", "grouping": "NOUN", "grisbi": "PROPN", "loom": "VERB", "1831": "NUM", "caching": "VERB", "embassy": "NOUN", "imaginations": "NOUN", "etudes": "PROPN", "veterinary": "ADJ", "drooped": "VERB", "tronicus": "PROPN", "inc.": "PROPN", "easiest": "ADJ", "pressing": "ADJ", "wheel": "NOUN", "generals": "NOUN", "unheard": "ADJ", "begun": "VERB", "doyon": "PROPN", "spool": "NOUN", "vomit": "VERB", "intriguing": "VERB", "presid...@whitehouse.gov": "PROPN", "criminologist": "NOUN", "forming": "VERB", "cj": "PROPN", "objection": "NOUN", "breeeding": "NOUN", "origins": "NOUN", "'s": "PART", "spared": "VERB", "415": "NUM", "repurposed": "VERB", "site": "NOUN", "detector": "NOUN", "saponins": "NOUN", "boundaries": "NOUN", "flies": "NOUN", "openly": "ADV", "stating": "VERB", "angeliki": "PROPN", "remotely": "ADV", "different": "ADJ", "california": "PROPN", "isis": "PROPN", "pixel": "NOUN", "vengeance": "NOUN", "retracted": "VERB", "10030": "NUM", "commissioned": "VERB", "chinese": "ADJ", "finalizing": "VERB", "annie": "PROPN", "smiles": "VERB", "where": "ADV", "studying": "VERB", "ninth": "ADJ", "fateful": "ADJ", "neglected": "VERB", "http://www.romancescam.com/forum/viewtopic.php?t=7231": "PROPN", "generate": "VERB", "sons": "NOUN", "inc": "PROPN", "portable": "ADJ", "extracurricular": "ADJ", "people-smugglers": "NOUN", "concentrate": "VERB", "grog-blossom": "NOUN", "easily": "ADV", "freese": "PROPN", "fourteenth": "ADJ", "aswering": "VERB", "opening": "VERB", "yay": "INTJ", "until": "SCONJ", "bartenders": "NOUN", "commonly": "ADV", "comet": "NOUN", "consciousness": "NOUN", "broccoli": "NOUN", "cohesive": "ADJ", "'70's": "NOUN", "arabic": "PROPN", "king": "NOUN", "crystal": "NOUN", "binary": "NOUN", "d7000": "NOUN", "page": "NOUN", "salatim": "NOUN", "chats": "NOUN", "radiometry": "NOUN", "festival": "PROPN", "predator": "NOUN", "swing": "NOUN", "perishable": "ADJ", "pools": "NOUN", "gpl": "PROPN", "beings": "NOUN", "westerners": "NOUN", "vere": "PROPN", "zip": "NOUN", "bosses": "NOUN", "eliminated": "VERB", "201-224-7900": "NUM", "brumation": "NOUN", "hilary": "PROPN", "furthering": "VERB", "milky": "ADJ", "urinals": "NOUN", "familiar": "ADJ", "consented": "VERB", "belt": "NOUN", "prevail": "VERB", "wanting": "VERB", "caucus": "PROPN", "balazick": "PROPN", "shackleton": "PROPN", "physics": "NOUN", "202-466-9142": "NUM", "intimately": "ADV", "lyrics": "NOUN", "twirl": "VERB", "flaws": "NOUN", "televisions": "NOUN", "whites": "NOUN", "panics": "VERB", "enhancement": "NOUN", "ap": "NOUN", "war": "NOUN", "omfg": "INTJ", "islamiah": "PROPN", "ric": "PROPN", "genetically": "ADV", "warrior": "NOUN", "bureaucratic": "ADJ", "irregularities": "NOUN", "prizes": "NOUN", "win": "VERB", "handy": "ADJ", "gud": "ADJ", "jennifer": "PROPN", "own": "ADJ", "worked": "VERB", "greet": "VERB", "re": "ADP", "post-production": "NOUN", "chill": "VERB", "limerick": "PROPN", "202.456.1111": "NUM", "pound": "NOUN", "unpalatable": "ADJ", "proverbial": "ADJ", "rocket": "NOUN", "moo": "NOUN", "ranja": "PROPN", "clark": "PROPN", "rathke": "PROPN", "worry": "VERB", "funded": "VERB", "ftw": "ADV", "subscription": "NOUN", "hooked": "ADJ", "drain": "NOUN", "justly": "ADV", "iconic": "ADJ", "sensitive": "ADJ", "indicated": "VERB", "outsider": "NOUN", "de'": "PROPN", "classiest": "ADJ", "infielder": "NOUN", "purgatory": "NOUN", "baths": "NOUN", "nails": "NOUN", "license": "NOUN", "abbas": "PROPN", "clustered": "VERB", "traveling": "VERB", "maaloul": "PROPN", "surley": "ADJ", "_": "ADP", "siam": "PROPN", "enlisted": "VERB", "burroughs": "PROPN", "deadly": "ADJ", "officially": "ADV", "non-avian": "ADJ", "bankman": "PROPN", "portends": "VERB", "05:07": "NUM", "oomen-ruijten": "PROPN", "absoulutely": "ADV", "cough": "NOUN", "kelley": "PROPN", "drought": "NOUN", "incurred": "VERB", "helsinki": "PROPN", "embarrass": "VERB", "pear": "NOUN", "gon": "VERB", "bombings": "NOUN", "brooklyn": "PROPN", "host": "NOUN", "liturgical": "ADJ", "fraser": "PROPN", "979": "NUM", "smashed": "VERB", "3:00": "NUM", "melissa": "PROPN", "fragile": "ADJ", "cambridge": "PROPN", "walmart": "PROPN", "locomotor": "ADJ", "cell": "NOUN", "seo": "NOUN", "hamburger": "NOUN", "387,000": "NUM", "bosnian": "ADJ", "55,7": "NUM", "account": "NOUN", "delegates": "NOUN", "steep": "ADJ", "priests": "NOUN", "lepage": "PROPN", "mediterranean": "PROPN", "bateman": "PROPN", "rained": "VERB", ".....": "PUNCT", "darius": "PROPN", "third": "ADJ", "top-of-the-range": "ADJ", "piccadilly": "PROPN", "prepare": "VERB", "talkshow": "NOUN", "boyhood": "NOUN", "tc": "NOUN", "archeological": "ADJ", "http://www.bumrungrad.com/en/patient-services/clinics-and-centers/plastic-surgery-thailand-bangkok/breast-augmentation-ba": "PROPN", "fri.": "PROPN", "hehe": "INTJ", "http://www.unitaryexecutive.net": "PROPN", "msaccess.exe": "PROPN", "alcala": "PROPN", "lilac-coloured": "ADJ", "thrives": "VERB", "room": "NOUN", "interjections": "NOUN", "unset": "ADJ", "morose": "ADJ", "scant": "ADJ", "severin": "PROPN", "28th": "NOUN", "comply": "VERB", "weiss": "PROPN", "tracked": "VERB", "claimants": "NOUN", "speculated": "VERB", "instigate": "VERB", "./": "PUNCT", "simplification": "NOUN", "expropriation": "NOUN", "print": "VERB", "1911": "NUM", "hammond": "PROPN", "betty": "PROPN", "http://www.sonic.net/~fsjob/tragicore-thecivetcat.mp3": "PROPN", "literate": "ADJ", "fernando": "PROPN", "merson": "PROPN", "intermarrying": "VERB", "suppressive": "ADJ", "sanitary": "ADJ", "interracial": "ADJ", "@": "ADP", "abolition": "NOUN", "conroy": "PROPN", "unwatched": "ADJ", "gop": "PROPN", "enjambment": "NOUN", "injured": "VERB", "undecided": "ADJ", "delainey": "PROPN", "ounce": "NOUN", "doses": "NOUN", "items": "NOUN", "germs": "NOUN", "occurring": "VERB", "perfumes": "NOUN", "rendered": "VERB", "http://im.yahoo.com/": "PROPN", "oir": "PROPN", "1600": "NUM", "oth-": "INTJ", "junk": "NOUN", "nullified": "VERB", "snipers": "NOUN", "coughing": "VERB", "sp": "NOUN", "sommer": "PROPN", "http://www.chernobyl.info/en": "PROPN", "awaited": "VERB", "carols": "PROPN", "halibut": "NOUN", "donating": "VERB", "tul": "PROPN", "1980s": "NOUN", "proficient": "ADJ", "cranston": "PROPN", "nondescript": "ADJ", "outro": "NOUN", "databases": "NOUN", "suggest": "VERB", "europe": "PROPN", "exponential": "ADJ", "clearly": "ADV", "19:14": "NUM", "melodramatic": "ADJ", "byproduct": "NOUN", "centuries": "NOUN", "sooo": "ADV", "filming": "NOUN", "philippines": "PROPN", "aunte": "NOUN", "gooseberry": "NOUN", "davies": "PROPN", "fetch": "VERB", "push": "VERB", "derivative": "ADJ", "afshari": "PROPN", "amidst": "ADP", "years": "NOUN", "phillip": "PROPN", "downgrade": "VERB", "mourning": "VERB", "thumb": "NOUN", "23rd": "NOUN", "l.l.c": "NOUN", "forida": "PROPN", "imbecile": "ADJ", "pre-columbian": "ADJ", "microwave": "NOUN", "polly": "NOUN", "alerts": "NOUN", "bays": "NOUN", "primarily": "ADV", "grimace-smile": "NOUN", "alt": "NOUN", "offworlders": "NOUN", "nina": "PROPN", "hired": "VERB", "maximum": "ADJ", "minor": "ADJ", "mae": "PROPN", "westfield": "PROPN", "whil": "SCONJ", "floridian": "PROPN", "superb": "ADJ", "http://www.nsrl.ttu.edu/chernobyl/wildlifepreserve.htm": "PROPN", "other": "ADJ", "caracas": "PROPN", "modernity": "NOUN", "wow-eee": "INTJ", "linkages": "NOUN", "stink": "NOUN", "look-out": "NOUN", "emeritus": "ADJ", "rest": "NOUN", "robbery": "NOUN", "communicative": "ADJ", "herring": "NOUN", "allowadditions": "NOUN", "unite": "VERB", "devocht": "PROPN", "farrier": "NOUN", "publishes": "VERB", "justification": "NOUN", "condor": "NOUN", "aerated": "VERB", "strides": "NOUN", "trailer": "NOUN", "buddhist": "ADJ", "harvard": "PROPN", "brenda": "PROPN", "ep": "NOUN", "waaaaaaaaaaaaay": "ADV", "weirder": "ADJ", "tycoon": "NOUN", "finalists": "NOUN", "pam": "PROPN", "reminded": "VERB", "windy": "ADJ", "trier": "PROPN", "uncompleted": "ADJ", "marketing": "NOUN", "stamped": "VERB", "hide-out": "NOUN", "seidensticker": "PROPN", "telugu": "PROPN", "stooped": "VERB", "race": "NOUN", "wa.": "PROPN", "wai-ching": "PROPN", "environmentally": "ADV", "taulbee": "PROPN", "fade": "VERB", "differential": "NOUN", "horizon": "NOUN", "evolutionary": "ADJ", "shown": "VERB", "economic": "ADJ", "passengers": "NOUN", "communist": "ADJ", "monsoon": "NOUN", "attempt": "NOUN", "produced": "VERB", "mp3": "NOUN", "knot": "NOUN", "shield": "PROPN", "assed": "ADJ", "approachable": "ADJ", "theropod": "NOUN", "irish": "ADJ", "dazzlingly": "ADV", "iraqiya": "PROPN", "jury": "NOUN", "overtaking": "VERB", "jeremy": "PROPN", "volition": "NOUN", "pectoral": "ADJ", "realises": "VERB", "re-evaluate": "VERB", "burnings": "NOUN", "architects": "PROPN", "zodiac": "NOUN", "option": "NOUN", "idols": "NOUN", "url": "NOUN", "cheques": "NOUN", "nightmares": "NOUN", "omnimax": "PROPN", "shame": "NOUN", "touchdown": "NOUN", "611": "NUM", "appointments": "NOUN", "burrowed": "VERB", "pitre": "PROPN", "ratings": "NOUN", "mccullough": "PROPN", "registrar": "NOUN", "everland": "PROPN", "credentialing": "VERB", "current": "ADJ", "official": "ADJ", "seth": "PROPN", "waugh": "PROPN", "mortality": "NOUN", "luminous": "ADJ", "cocteau": "PROPN", "pwople": "NOUN", "monastery": "NOUN", "gullible": "ADJ", "shrouds": "NOUN", "shattered": "ADJ", "queerly": "ADV", "eid": "NOUN", "committee": "NOUN", "04:52": "NUM", "dampen": "VERB", "moroz": "PROPN", "absorption": "NOUN", "unturned": "ADJ", "hugh": "PROPN", "4": "NUM", "~": "PUNCT", "specifications": "NOUN", "content": "NOUN", "unscreened": "ADJ", "90": "NUM", "circumcision": "NOUN", "iis": "AUX", "kinesiologist": "NOUN", "combined": "VERB", "seaboard": "PROPN", "biz": "NOUN", "1678": "NUM", "iep": "PROPN", "suck": "VERB", "dominated": "VERB", "closest": "ADJ", "justices": "NOUN", "man-about-town": "NOUN", "feed": "VERB", "recoil": "NOUN", "sinuses": "NOUN", "hand": "NOUN", "abdul": "PROPN", "domains": "NOUN", "newsgroups": "NOUN", "drivers": "NOUN", "chalabi": "PROPN", "unaffected": "ADJ", "empires": "NOUN", "tractor": "NOUN", "gloated": "VERB", "'n": "CCONJ", "thorny": "ADJ", "02:21": "NUM", "memorializes": "VERB", "swish": "NOUN", "18:11": "NUM", "payment": "NOUN", "versions": "NOUN", "nierman": "PROPN", "thirty-eight": "NUM", "entertaining": "ADJ", "walker": "PROPN", "medical": "ADJ", "yan": "PROPN", "selective": "ADJ", "imitated": "VERB", "stimulating": "VERB", "responsibly": "ADV", "chairman": "NOUN", "portrait": "NOUN", "a64": "PROPN", "zaha": "PROPN", "atahualpa": "PROPN", "http://haas.berkeley.edu/~borenste": "PROPN", "forestry": "NOUN", "trigger": "VERB", "elevation": "NOUN", "nausea": "NOUN", "reuse": "NOUN", "antiques": "NOUN", "cools": "VERB", "stuck": "VERB", "analyzes": "VERB", "persecuted": "VERB", "laughed": "VERB", "ufos": "NOUN", "jeffs": "PROPN", "slope": "NOUN", "healthier": "ADJ", "spirit": "NOUN", "australasian": "PROPN", "swede": "NOUN", "freak": "VERB", "negotiation": "NOUN", "deployments": "NOUN", "post–revolutionary": "PROPN", "t-": "INTJ", "textures": "NOUN", "apologies": "NOUN", "eat": "VERB", "change": "NOUN", "weaponize": "VERB", "perseverance": "NOUN", "ears": "NOUN", "interlopers": "NOUN", "ex": "PROPN", "thugs": "NOUN", "guinea": "NOUN", "aristocratic": "ADJ", "emma": "PROPN", "extractive": "ADJ", "recognizes": "VERB", "panga": "NOUN", "limits": "NOUN", "replacing": "VERB", "fifths": "NOUN", "nobody": "PRON", "eng": "PROPN", "goldman": "PROPN", "n": "PROPN", "recieve": "VERB", "brains": "NOUN", "candidates": "NOUN", "disrepair": "NOUN", "resembled": "VERB", "secondly": "ADV", "downhill": "ADV", "cases": "NOUN", "bugle": "VERB", "cities": "NOUN", "instagram": "PROPN", "boom": "NOUN", "blonde": "NOUN", "matches": "VERB", "vegan": "ADJ", "gripped": "VERB", "dally": "VERB", "breasts": "NOUN", "donated": "VERB", "qa'ida": "PROPN", "karzai": "PROPN", "raided": "VERB", "campsites": "NOUN", "sulphur": "NOUN", "ghostly": "ADJ", "tang": "PROPN", "crepe": "NOUN", "selfie": "NOUN", "motives": "NOUN", "afar": "ADV", "concerning": "VERB", "kyle.jones@radianz.com": "PROPN", "watching": "VERB", "sigma": "NOUN", "gatineau": "PROPN", "pheasant": "NOUN", "san": "PROPN", "armies": "NOUN", "script": "NOUN", "r&d": "NOUN", "chants": "NOUN", "apprised": "VERB", "important": "ADJ", "don'ts": "NOUN", "hmm": "INTJ", "departure": "NOUN", "futile": "ADJ", "katherine": "PROPN", "rehabilitate": "VERB", "centres": "NOUN", "a1": "PROPN", "flows": "VERB", "interceptor": "NOUN", "recap": "NOUN", "obeying": "VERB", "raspberry": "NOUN", "façades": "NOUN", "radio": "NOUN", "plaster": "NOUN", "ala": "ADP", "e.t.": "PROPN", "rain": "NOUN", "billionaire": "NOUN", "solomita": "PROPN", "theeth": "NOUN", "recovery": "NOUN", "propaganda": "NOUN", "scribbles": "NOUN", "bodies": "NOUN", "camille": "PROPN", "patio": "NOUN", "partnership": "NOUN", "curve": "NOUN", "ludicrous": "ADJ", "bale": "VERB", "solemnly": "ADV", "horsiesios": "PROPN", "bellow": "NOUN", "predisposed": "ADJ", "tights": "NOUN", "reputation": "NOUN", "baghdad": "PROPN", "550": "NUM", "wandered": "VERB", "bernoullis": "PROPN", "andaman": "PROPN", "#review": "PROPN", "metabolically": "ADV", "bruha": "PROPN", "rec.": "ADJ", "irrelevant": "ADJ", "hair": "NOUN", "envy": "NOUN", "16,900": "NUM", "menu": "NOUN", "pre": "ADV", "grenadines": "PROPN", "inordinate": "ADJ", "mouez": "PROPN", "brack": "NOUN", "seamstresses": "NOUN", "05:59": "NUM", "sweep": "NOUN", "brandee": "PROPN", "linked": "VERB", "amoung": "ADP", "math": "NOUN", "wolfowitz": "PROPN", "1.12": "NUM", "devout": "ADJ", "florescent": "ADJ", "concentrating": "VERB", "insults": "NOUN", "believing": "VERB", "khattab": "PROPN", "horrendous": "ADJ", "mecca": "PROPN", "itty": "ADJ", "nordic": "ADJ", "un-ruly": "ADJ", "treat": "VERB", "factory": "NOUN", "importantly": "ADV", "landa": "PROPN", "hopper": "PROPN", "revenue-raising": "ADJ", "listings": "NOUN", "gtc": "NOUN", "tasteless": "ADJ", "atef": "PROPN", "dogma": "NOUN", "patty": "PROPN", "comedian": "NOUN", "508": "NUM", "box": "NOUN", "packaging": "NOUN", "responding": "VERB", "shocking": "ADJ", "verification": "NOUN", "concentric": "ADJ", "misinterpreted": "VERB", "consume": "VERB", "415.621.8317": "NUM", "supposedly": "ADV", "traitors": "NOUN", "storyworld": "NOUN", "adversaries": "NOUN", "electrostatic": "ADJ", "ghana": "PROPN", "taxpayers": "NOUN", "screaming": "VERB", "alexandra": "PROPN", "http://judiciary.senate.gov/testimony.cfm?id=1725&wit_id=4905": "PROPN", "undergo": "VERB", "conf.": "NOUN", "espeakers": "NOUN", "herb": "NOUN", "1.50": "NUM", "marek": "PROPN", "penny": "NOUN", "barons": "NOUN", "kuwait": "PROPN", "diminished": "VERB", "lords": "PROPN", "hunts": "NOUN", "mueller": "PROPN", "spooky": "ADJ", "growth": "NOUN", "conquering": "VERB", "viii": "NUM", "diplomats": "NOUN", "sedentary": "ADJ", "clods": "NOUN", "motivations": "NOUN", "ouse": "PROPN", "#currentevents": "PROPN", "22nd": "NOUN", "dmetcalfe@cullenanddykman.com": "PROPN", "grammatical": "ADJ", "tossed": "VERB", "involved": "VERB", "tijuana": "PROPN", "bettering": "VERB", "fever": "NOUN", "countdown": "PROPN", "1910": "NUM", "flexibiltiy": "NOUN", "challenges": "NOUN", "distinguish": "VERB", "pax": "PROPN", "brag": "VERB", "numero": "NOUN", "adversary": "NOUN", "impart": "VERB", "motivating": "VERB", "crash": "NOUN", "cindy": "PROPN", "lab": "NOUN", "duplicate": "NOUN", "christine": "PROPN", "differed": "VERB", "almanac": "PROPN", "chair": "NOUN", "tolls": "NOUN", "surely": "ADV", "modernizing": "VERB", "calculater": "NOUN", "ceremony": "NOUN", "migrants": "NOUN", "wooing": "VERB", "fate": "NOUN", "balasingham": "PROPN", "quadra": "NOUN", "bye": "INTJ", "class": "NOUN", "shikibu": "PROPN", "marines": "PROPN", "meowing": "VERB", "shalev": "PROPN", "airports": "NOUN", "minimizing": "VERB", "sea-going": "ADJ", "reeks": "VERB", "02:49": "NUM", "interested": "ADJ", "triumphs": "NOUN", "thirteen": "NUM", "featuring": "VERB", "sizzle": "VERB", "bolstered": "VERB", "digi": "PROPN", "pounds": "NOUN", "hollywood": "PROPN", "rbi": "NOUN", "blair": "PROPN", "sly": "ADJ", "broomsticks": "NOUN", "sector": "NOUN", "alike": "ADV", "carriers": "NOUN", "70": "NUM", "guarantees": "VERB", "niche": "NOUN", "intoxicating": "ADJ", "conservative": "ADJ", "elderly": "ADJ", "delirious": "ADJ", "stain": "NOUN", "emperors": "NOUN", "montrouge": "PROPN", "leap": "NOUN", "pinch": "VERB", "1930s": "NOUN", "apron": "NOUN", "photograph": "NOUN", "invested": "VERB", "verge": "NOUN", "7.3": "NUM", "umm": "INTJ", "freeport": "PROPN", "penance": "NOUN", "holds": "VERB", "nepalese": "ADJ", "retrospect": "NOUN", "olympics": "PROPN", "saltillo": "PROPN", "mirror": "NOUN", "ličen": "PROPN", "visibility": "NOUN", "realized": "VERB", "displacement": "NOUN", "speculation": "NOUN", "punishments": "NOUN", "cheney": "PROPN", "pioneer": "NOUN", "whore": "NOUN", "numbing": "VERB", "sorry": "ADJ", "siriusxm": "PROPN", "1,650,000": "NUM", "seeker": "NOUN", "******": "PUNCT", "among": "ADP", "extrapolate": "VERB", "afterwards": "ADV", "stadium": "NOUN", "64.75": "NUM", "celebrated": "VERB", "fireplace": "NOUN", "vintaged": "VERB", "likened": "VERB", "http://www.adorama.com/blcbs.html": "PROPN", "particle": "NOUN", "1584": "NUM", "burglars": "NOUN", "nie": "PROPN", "marcia": "PROPN", "1661": "NUM", "tended": "VERB", "#finances": "PROPN", "oh": "INTJ", "disappeared": "VERB", "has": "AUX", "renovation": "NOUN", "geofences": "NOUN", "tatars": "PROPN", "47": "NUM", "césar": "PROPN", "inference": "NOUN", "http://www.physics.isu.edu/radinf/chern.htm": "PROPN", "drove": "VERB", "senior": "ADJ", "e-visit": "NOUN", "2:30": "NUM", "eggshells": "NOUN", "5.87": "NUM", "infectious": "ADJ", "writhe": "VERB", "exercises": "NOUN", "yours": "PRON", "384": "NUM", "skittish": "ADJ", "rosebud": "PROPN", "j": "PROPN", "spreadsheet": "NOUN", "kicking": "VERB", "884": "NUM", "denoted": "VERB", "cockpit": "NOUN", "cancel": "VERB", "crazy": "ADJ", "09/03/99": "NUM", "veto": "VERB", "nicer": "ADJ", "dresses": "NOUN", "arrive": "VERB", "pickles": "NOUN", "prefects": "NOUN", "subcommittee": "PROPN", "rephrasing": "VERB", "spawned": "VERB", "gstrathmann@mediaone.net": "PROPN", "unworthy": "ADJ", "roommate": "NOUN", "operative": "NOUN", "endemic": "ADJ", "seizures": "NOUN", "disc": "NOUN", "j-": "INTJ", "conquer": "VERB", "questioned": "VERB", "match": "NOUN", "dumbly": "ADV", "m.p.": "NOUN", "a.k.a.": "ADV", "crouches": "VERB", "scar": "NOUN", "contrast": "NOUN", "fundraising": "NOUN", "kebabs": "NOUN", "mute": "ADJ", "papa": "PROPN", "msnbc": "PROPN", "forums": "NOUN", "succeeded": "VERB", "theme": "NOUN", "unexpectedly": "ADV", "greater": "ADJ", "uh-oh": "INTJ", "1.2": "NUM", "110": "NUM", "steadied": "VERB", "taxes": "NOUN", "xiaoping": "PROPN", "11/27/2000": "NUM", "ace": "PROPN", "june": "PROPN", "tomatos": "NOUN", "exploded": "VERB", "adopted": "VERB", "seeping": "VERB", "spices": "NOUN", "loafing": "VERB", "deteriorate": "VERB", "percent": "NOUN", "paramount": "ADJ", "unconstrained": "ADJ", "disclaimer": "NOUN", "sic": "ADV", "chubby": "ADJ", "416-865-3703": "NUM", "reigning": "VERB", "detected": "VERB", "system": "NOUN", "bearkadette": "PROPN", "combine": "VERB", "moderates": "NOUN", "battery": "NOUN", "**********": "PUNCT", "sentencing": "NOUN", "decades": "NOUN", "281-518-1081": "NUM", "covered": "VERB", "docking": "NOUN", "financing": "NOUN", "jenks": "PROPN", "beadwork": "NOUN", "ppl": "NOUN", "dated": "VERB", "earned": "VERB", "meets": "VERB", "histories": "NOUN", "expeditionary": "ADJ", "chalmers": "PROPN", "hospital": "NOUN", "hotel": "NOUN", "1660": "NUM", "netmeeting": "PROPN", "cambodia": "PROPN", "jumped": "VERB", "stay-at-home": "ADJ", "bonanza": "PROPN", "uc": "PROPN", "aligned": "VERB", "fred": "PROPN", "streaked": "VERB", "pitches": "NOUN", "balances": "NOUN", "===================================================": "SYM", "db": "PROPN", "solution": "NOUN", "mmc": "NOUN", "describing": "VERB", "mystic": "PROPN", "fishes": "NOUN", "rumanian": "ADJ", "allies": "NOUN", "16's": "NOUN", "melanie.gray@weil.com": "PROPN", "jazz": "NOUN", "rehe": "PROPN", "turnpike": "PROPN", "singing": "VERB", "lets": "VERB", "toccafondi": "PROPN", "alt.consumers": "NOUN", "wavy": "ADJ", "politically": "ADV", "stardust": "PROPN", "checked-cloth": "NOUN", "bail": "NOUN", "moonshine": "NOUN", "dentists": "NOUN", "royalist": "ADJ", "remaining": "VERB", "onions": "NOUN", "converter": "NOUN", "ahmad": "PROPN", "answering": "VERB", "belts": "NOUN", "proclaiming": "VERB", "despotism": "NOUN", "flooded": "VERB", "ew": "INTJ", "accessibility": "NOUN", "creases": "NOUN", "kubler": "PROPN", "11:32": "NUM", "wand": "NOUN", "unhealthy": "ADJ", "identify": "VERB", "destabilize": "VERB", "ahali": "PROPN", "fringed": "VERB", "ryan": "PROPN", "lungs": "NOUN", "female": "NOUN", "hind": "PROPN", "pro-india": "ADJ", "honestly": "ADV", "dirty": "ADJ", "formatting": "NOUN", "kingston": "PROPN", "critically": "ADV", "shanna": "PROPN", "influence": "NOUN", "irresistibly": "ADV", "beginner": "NOUN", "gyrations": "NOUN", "crashing": "VERB", "disrepute": "NOUN", "gobbled": "VERB", "stockholders": "NOUN", "co-stars": "NOUN", "subpoenas": "NOUN", "perspiration": "NOUN", "cure": "NOUN", "unstaunched": "ADJ", "followed": "VERB", "simulation": "NOUN", "october": "PROPN", "manicure": "NOUN", "pho": "NOUN", "abymes": "PROPN", "insurance": "NOUN", "caitlin": "PROPN", "sprays": "NOUN", "cia": "PROPN", "bpa": "PROPN", "kidding": "VERB", "heartbreaking": "ADJ", "brightness": "NOUN", "exuberant": "ADJ", "swivel": "NOUN", "desparate": "ADJ", "john": "PROPN", "perlite": "NOUN", "carbet": "PROPN", "d'": "AUX", "kriste": "PROPN", "precipitous": "ADJ", "catalytic": "ADJ", "recovering": "VERB", "muffs": "NOUN", "n.y.": "PROPN", "route": "NOUN", "stuart": "PROPN", "niagara": "PROPN", "cloudy": "ADJ", "stewart": "PROPN", "2018": "NUM", "1955": "NUM", "eager": "ADJ", "immigration": "NOUN", "ferc": "PROPN", "milnet": "PROPN", "façade": "NOUN", "feathers": "NOUN", "donohue": "PROPN", "circumvention": "NOUN", "kitty": "NOUN", "crescent": "PROPN", "pinot": "PROPN", "lovers": "NOUN", "murderous": "ADJ", "formaldehyde": "NOUN", "entrance": "NOUN", "away": "ADV", "cross-sectional": "ADJ", "scoured": "VERB", "stalked": "ADJ", "partial": "ADJ", "scatter": "VERB", "injure": "VERB", "kevalam": "NOUN", "smugglers": "NOUN", "troubling": "ADJ", "improperly": "ADV", "initiative": "NOUN", "phrase": "NOUN", "humane": "ADJ", "quivered": "VERB", "gwenzi": "PROPN", "smacking": "VERB", "#research": "PROPN", "drives": "NOUN", "for-profit": "ADJ", "skilling": "PROPN", "enhanced": "VERB", "kenneth": "PROPN", "lichtenstein": "PROPN", "desert": "NOUN", "folds": "NOUN", "pupil": "NOUN", "realisation": "NOUN", "authorized": "VERB", "????": "PUNCT", "undeclared": "ADJ", "bd": "PROPN", "g&g": "PROPN", "erected": "VERB", "render": "VERB", "attracting": "VERB", "perceptions": "NOUN", "ei": "PROPN", "participatory": "ADJ", "strawberry": "NOUN", "epidemic": "NOUN", "crawl": "VERB", "concentrations": "NOUN", "truths": "NOUN", "pickup": "NOUN", "diana": "PROPN", "sixty": "NUM", "soak": "VERB", "balding": "ADJ", "arrow": "PROPN", "phone": "NOUN", "modem": "NOUN", "unheeded": "ADJ", "08/01/2001": "NUM", "1348": "NUM", "boris": "PROPN", "compulsive": "ADJ", "salaries": "NOUN", "http://farm3.static.flickr.com/2406/2527255596_db23df940f.jpg": "PROPN", "pastures": "NOUN", "competent": "ADJ", "tide": "NOUN", "madame": "PROPN", "niece": "NOUN", "scientology.org": "PROPN", "cairo": "PROPN", "3926": "NUM", "co2": "NOUN", "gladdened": "VERB", "arakan": "ADJ", "locusts": "NOUN", "giraffes": "NOUN", "teenagers": "NOUN", "shankman": "PROPN", "confounded": "ADJ", "pre-made": "VERB", "reproduced": "VERB", "splish": "VERB", "seaman": "NOUN", "organizing": "VERB", "plaskitt": "PROPN", "perceiving": "VERB", "my": "PRON", "exceptionally": "ADV", "cat": "NOUN", "marval": "PROPN", "local": "ADJ", "shrewd": "ADJ", "posada": "PROPN", "0832": "NUM", "marin": "PROPN", "remembered": "VERB", "granting": "NOUN", "garganta": "PROPN", "84838389593": "NUM", "kingel": "PROPN", "gus": "PROPN", "jesuit": "ADJ", "peaked": "ADJ", "watchmen": "PROPN", "potter": "PROPN", "gallows": "PROPN", "401.3": "NUM", "frighten": "VERB", "2029": "NUM", "conseguences": "PROPN", "rid": "ADJ", "receptions": "NOUN", "roman": "ADJ", "along": "ADP", "quinto": "PROPN", "mountain": "NOUN", "cuthbert": "PROPN", "1572": "NUM", "forgot": "VERB", "popularity": "NOUN", "heap": "NOUN", "severed": "ADJ", "fall": "NOUN", "maam": "NOUN", "purge": "VERB", "molded": "VERB", "^_^": "SYM", "colony": "NOUN", "flick": "NOUN", "signers": "NOUN", "chases": "NOUN", "proliferate": "VERB", "evaluating": "VERB", "6:00": "NUM", "dilated": "ADJ", "curved": "ADJ", "president": "PROPN", "jaqamofino": "PROPN", "insoles": "NOUN", "cory": "NOUN", "debris": "NOUN", "desiring": "VERB", "lieu": "NOUN", "hunger": "NOUN", "patriot": "NOUN", "accordingly": "ADV", "deliverd": "VERB", "atrophied": "VERB", "284": "NUM", "delta": "PROPN", "reformulated": "VERB", "crucially": "ADV", "latter": "ADJ", "select": "VERB", "boleyn": "PROPN", "kristof": "PROPN", "drainage-pipes": "NOUN", ".203": "NUM", "real": "ADJ", "extreme": "ADJ", "dulaim": "PROPN", "retest": "VERB", "finally": "ADV", "23": "NUM", "curator": "NOUN", "switched": "VERB", "showed": "VERB", "dimly": "ADV", "explanation": "NOUN", "excel": "PROPN", "wifi": "NOUN", "makkai": "PROPN", "cuban": "ADJ", "restoration": "NOUN", "turkey": "PROPN", "wines": "NOUN", "fortunes": "NOUN", "expressionist": "NOUN", "independence": "NOUN", "gameplay": "NOUN", "berkman": "PROPN", "kinga": "PROPN", "mandelstam": "PROPN", "sabotaging": "VERB", "mining": "NOUN", "maniacs": "NOUN", "voided": "VERB", "enclosed": "VERB", "5.10": "NUM", "arabiya": "PROPN", "degree": "NOUN", "jubilee": "PROPN", "moon": "NOUN", "eaters": "NOUN", "tried": "VERB", "fins": "NOUN", "b-": "INTJ", "stances": "NOUN", "tempers": "NOUN", "miyuki": "PROPN", "tanabe": "PROPN", "acrylics": "PROPN", "wildwood": "PROPN", "ferguson": "PROPN", "profiles": "NOUN", "1525": "NUM", "revalue": "VERB", "bat": "NOUN", "norms": "NOUN", "ahmadinejad": "PROPN", "roofing": "NOUN", "humanistic": "ADJ", "click": "VERB", "enchilada": "NOUN", "dissertation": "NOUN", "likeness": "NOUN", "intentions": "NOUN", "tides": "NOUN", "hospitals": "NOUN", "semi-empirical": "ADJ", "just": "ADV", "ices": "NOUN", "strain": "NOUN", "simon": "PROPN", "hundreds": "NOUN", "coursing": "VERB", "stubborn": "ADJ", "tulsa": "PROPN", "kandahar": "PROPN", "kohoutek": "PROPN", "useful": "ADJ", "travels": "VERB", "farouk": "PROPN", "cuba": "PROPN", "jointly": "ADV", "resented": "VERB", "retiring": "VERB", "croatia": "PROPN", "artful": "ADJ", "vij": "PROPN", "appeals": "NOUN", "galveston": "PROPN", "potters": "NOUN", "shop": "NOUN", "librivox": "PROPN", "2023": "NUM", "1970s": "NOUN", "transaction": "NOUN", "responsible": "ADJ", "squarely": "ADV", "conceptual": "ADJ", "demographic": "ADJ", "intimacy": "NOUN", "unknown": "ADJ", "08/16/2000": "NUM", "abc": "PROPN", "proceed": "VERB", "tranquilize": "VERB", "outright": "ADV", "regrettable": "ADJ", "blisters": "NOUN", "bucket": "NOUN", "photoshop": "PROPN", "0.3": "NUM", "shave": "NOUN", "developmental": "ADJ", "05:51": "NUM", "an-": "INTJ", "condoleeza": "PROPN", "booming": "ADJ", "discrepancy": "NOUN", "lay": "VERB", "tactic": "NOUN", "patties": "NOUN", "reportml": "PROPN", "differently": "ADV", "fallon": "PROPN", "menaces": "NOUN", "paradero": "PROPN", "crunchy": "ADJ", "penetration": "NOUN", "immacolata": "PROPN", "stereo": "NOUN", "jfk": "PROPN", "variants": "NOUN", "somber": "ADJ", "theraphy": "NOUN", "islami": "PROPN", "300,000": "NUM", "executive": "ADJ", "lord": "NOUN", "rajavis": "PROPN", "anti-ship": "ADJ", "transferable": "ADJ", "ba": "PROPN", "spikes": "NOUN", "checa": "PROPN", "marina": "PROPN", "lloyd": "PROPN", "av": "PROPN", "11/09/2000": "NUM", "anti-christ": "NOUN", "hypothetically": "ADV", "flatter": "ADJ", "appropriators": "NOUN", "sapped": "VERB", "readings": "NOUN", "succulent": "ADJ", "hairstylist": "NOUN", "henequen": "NOUN", "extremism": "NOUN", "cd": "PROPN", "incentive": "NOUN", "retreats": "NOUN", "treated": "VERB", "artworks": "NOUN", "continental": "ADJ", "hyperbolic": "ADJ", "heavyweight": "NOUN", "parish": "PROPN", "mammals": "NOUN", "tubes": "NOUN", "retraction": "NOUN", "patently": "ADV", "legality": "NOUN", "adopting": "VERB", "regenerate": "VERB", "seleznov": "PROPN", "mohamed": "PROPN", "fanfics": "NOUN", "collector": "NOUN", "proclaimers": "NOUN", "startup": "NOUN", "unloading": "VERB", "shee": "PROPN", "find": "VERB", "dissembling": "VERB", "robsart": "PROPN", "returned": "VERB", "#sharedvalues": "PROPN", "mah": "NOUN", "hastened": "VERB", "mere": "ADJ", "calendar": "NOUN", "dodge": "NOUN", "conquests": "NOUN", "fireworks": "NOUN", "amphibious": "ADJ", "anemone": "NOUN", "soles": "NOUN", "kennebunkport": "PROPN", "carreau": "PROPN", "woo-": "INTJ", "osip": "PROPN", "battleground": "NOUN", "maharishi": "PROPN", "shaken": "VERB", "hock": "NOUN", "boarding": "NOUN", "jamarat": "PROPN", "sdg&e": "PROPN", "install": "VERB", "1302": "NUM", "obudu": "PROPN", "waves": "NOUN", "nap": "NOUN", "savagery": "NOUN", "veils": "NOUN", "manikins": "NOUN", "booster": "NOUN", "bmw": "PROPN", "conditioner": "NOUN", "assorted": "ADJ", "socialism": "NOUN", "prevalence": "NOUN", "constituencies": "NOUN", "20,000,000": "NUM", "things": "NOUN", "explain": "VERB", "scratch": "NOUN", "advantages": "NOUN", "interrupt": "VERB", "beams": "NOUN", "retail": "NOUN", "mark": "PROPN", "49": "NUM", "boarder": "NOUN", "bac": "NOUN", "exchanging": "VERB", "seasoned": "ADJ", "augmentation": "NOUN", "pesto": "NOUN", "ward": "VERB", "b.a.": "PROPN", "installed": "VERB", "sholder": "NOUN", "falters": "VERB", "waitress": "NOUN", "sole": "ADJ", "jantar": "PROPN", "counteractions": "NOUN", "stints": "NOUN", "earthhhhhhh": "PROPN", "1480": "NUM", "occupying": "VERB", "transfer": "NOUN", "tentatively": "ADV", "16th": "ADJ", "lantern": "NOUN", "optionally": "ADV", "overage": "NOUN", "connotation": "NOUN", "tamil": "ADJ", "malaria": "NOUN", "boundless": "ADJ", "breakfast": "NOUN", "centerpiece": "NOUN", "greed": "NOUN", "1775": "NUM", "sana'a": "PROPN", "poisson": "PROPN", "votaw": "PROPN", "rhetorical": "ADJ", "naming": "VERB", "meantime": "NOUN", "covariation": "NOUN", "privately": "ADV", "campos": "PROPN", "1779": "NUM", "highlighted": "VERB", "toy": "NOUN", "acupuncture": "NOUN", "smash-up": "NOUN", "-----------------------------------------------": "PUNCT", "w2": "SYM", "shelves": "NOUN", "peppers": "NOUN", "pahl": "PROPN", "walters": "PROPN", "afresh": "ADV", "vanished": "VERB", "farm": "NOUN", "payable": "ADJ", "likes": "VERB", "segregation": "NOUN", "daring": "VERB", "paramilitary": "ADJ", "activity": "NOUN", "stickies": "NOUN", "large": "ADJ", "five": "NUM", "twenty-thousand-dollar": "NOUN", "ssris": "NOUN", "centers": "NOUN", "cemetery": "NOUN", "deciding": "VERB", "squirelled": "VERB", "chatham": "PROPN", "comforted": "VERB", "gro": "PROPN", "larger": "ADJ", "material": "NOUN", "lambs": "NOUN", "dealers": "NOUN", "concerts": "NOUN", "gear": "NOUN", "1778": "NUM", "toolbar": "NOUN", "wavelength": "NOUN", "devolving": "VERB", "litgation": "NOUN", "deleted": "VERB", "midwest": "PROPN", "17:32": "NUM", "arisen": "VERB", "spilled": "VERB", "constantly": "ADV", "ceremonies": "NOUN", "muuuuuum": "INTJ", "faltered": "VERB", "urges": "NOUN", "girlfriends": "NOUN", "shrimp": "NOUN", "preventive": "ADJ", "beghe": "PROPN", "that": "PRON", "honourable": "ADJ", "angle": "NOUN", "sticky": "ADJ", "rusamarts@aol.com": "PROPN", "invitaion": "NOUN", "embrace": "VERB", "anneal": "PROPN", "100": "NUM", "game": "NOUN", "cache": "NOUN", "namely": "ADV", "4101": "NUM", "involve": "VERB", "funeral": "NOUN", "inspire": "VERB", "manipulated": "VERB", "heald": "PROPN", "opiate": "ADJ", "fog": "NOUN", "outgrowth": "NOUN", "crickets": "NOUN", "corrugated": "ADJ", "intention": "NOUN", "107th": "ADJ", "supreme": "ADJ", "barbaric": "ADJ", "mackenzie": "PROPN", "knit": "VERB", "pester": "VERB", "greatest": "ADJ", "revised": "VERB", "gtcs": "NOUN", "unlikely": "ADJ", "circularisation": "NOUN", "sheila": "PROPN", "reddish": "ADJ", "mshames@ucan.org": "PROPN", "does": "AUX", "interacts": "VERB", "snack": "NOUN", "inquiring": "VERB", "http://v2.cache7.c.bigcache.googleapis.com/static.panoramio.com/photos/original/42661265.jpg?redirect_counter=2": "PROPN", "dreary": "ADJ", "coping": "NOUN", "steam": "NOUN", "ftu": "PROPN", "unreported": "VERB", "jawaharal": "PROPN", "cockatiel": "NOUN", "start": "VERB", "landfall": "PROPN", "features": "NOUN", "12/22/2000": "NUM", "mcguire": "PROPN", "bloodied": "VERB", "systematic": "ADJ", "relentlessly": "ADV", "44th": "PROPN", "morale": "NOUN", "impasse": "NOUN", "questionable": "ADJ", "reassignment": "NOUN", "literally": "ADV", "sweden": "PROPN", "cage": "NOUN", "allocating": "VERB", "custody": "NOUN", "-------------------": "PUNCT", "pair": "NOUN", "procedures": "NOUN", "convictions": "NOUN", "mantelpiece": "NOUN", "glittering-eyed": "ADJ", "trivia": "NOUN", "purporting": "VERB", "formalism": "NOUN", "bernie": "PROPN", "banana": "NOUN", "winston": "PROPN", "praised": "VERB", "lihabi": "PROPN", "wing": "NOUN", "mit": "PROPN", "procure": "VERB", "non-essential": "ADJ", "liquor": "NOUN", "sensing": "NOUN", "therein": "ADV", "courtyard": "NOUN", "hilton": "PROPN", "warnings": "NOUN", "mumbled": "VERB", "crossing": "VERB", "mid-ocean": "NOUN", "clarke": "PROPN", "captured": "VERB", "megawatt": "NOUN", "rifles": "NOUN", "passport": "NOUN", "crowds": "NOUN", "laughs": "VERB", "tethered": "VERB", "sevenyear-old": "ADJ", "corresponding": "ADJ", "cara": "PROPN", "confession": "NOUN", "compliance": "NOUN", "smooth": "ADJ", "vehicle": "NOUN", "spores": "NOUN", "discourse": "NOUN", "body": "NOUN", "bacteriologist": "NOUN", "16,000,000,000": "NUM", "peacefully": "ADV", "eyed": "ADJ", "grangers": "PROPN", "mourvèdre": "PROPN", "outcasts": "NOUN", "helpful": "ADJ", "infiltrators": "NOUN", "---------------------------": "PUNCT", "laptop": "NOUN", "findings": "NOUN", "jongg": "NOUN", "additional": "ADJ", "gestalt": "ADJ", "tour": "NOUN", "emphasized": "VERB", "gastroenteritis": "NOUN", "posts": "NOUN", "pleased": "ADJ", "fruits": "NOUN", "miniseries": "NOUN", "physicians": "NOUN", "pyramid": "NOUN", "luncheons": "NOUN", "sj": "PROPN", "relevant": "ADJ", "everett": "PROPN", "creepy": "ADJ", "mutilating": "VERB", "foliage": "NOUN", "sce": "PROPN", "threatens": "VERB", "3.30": "NUM", "give": "VERB", "breathing": "VERB", "extermination": "NOUN", "razor": "NOUN", "0800": "NUM", "filler": "NOUN", "ululating": "ADJ", "brumbley": "PROPN", "equant": "PROPN", "zeitgeist": "NOUN", "guarantee": "VERB", "twinkies": "NOUN", "mixed": "VERB", "u.k": "PROPN", "lit": "VERB", "represented": "VERB", "05/02/2001": "NUM", "alchemy": "NOUN", "prey": "NOUN", "illwill": "NOUN", "aided": "VERB", "judged": "VERB", "......": "PUNCT", "recommendation": "NOUN", "populaire": "PROPN", "hullo": "INTJ", "verch": "PROPN", "gator": "NOUN", "innocent": "ADJ", "condone": "VERB", "pettigrews": "PROPN", "anticipated": "VERB", "warred": "VERB", "l": "PROPN", "natsu": "PROPN", "rhythm": "NOUN", "framework": "NOUN", "snub": "NOUN", "poverty": "NOUN", "weaken": "VERB", "1997": "NUM", "reaaaally": "ADV", "sore": "ADJ", "harder": "ADJ", "killed": "VERB", "googol": "PROPN", "meaningfully": "ADV", "released": "VERB", "tgpl": "PROPN", "tastical": "ADJ", "karaite": "ADJ", "02920": "NUM", "replicate": "VERB", "polygamous": "ADJ", "burdens": "NOUN", "foreign": "ADJ", "restoring": "VERB", "blush": "NOUN", "cream": "NOUN", "http://www.mikegigi.com/meltmetl.htm": "PROPN", "airbase": "NOUN", "alpharetta": "PROPN", "spectator": "NOUN", "defect": "NOUN", "handed": "VERB", "youngest": "ADJ", "changzhou": "PROPN", "sinnel": "NOUN", "freckle-faced": "ADJ", "crews": "NOUN", "7.22": "NUM", "illustration": "NOUN", "ideate": "VERB", "blur": "NOUN", "melancon": "PROPN", "advisory": "ADJ", "inappropriately": "ADV", "claim": "NOUN", "spoilt": "VERB", "forester": "PROPN", "http://i.imgur.com/xytex.jpg": "PROPN", "defects": "NOUN", "kadai": "PROPN", "viola": "PROPN", "blowback": "NOUN", "database": "NOUN", "anti-india": "ADJ", "according": "VERB", "pisa": "PROPN", "pinto": "PROPN", "guessing": "VERB", "slow": "ADJ", "uphill": "ADV", "enfurates": "VERB", "statewide": "ADJ", "twitched": "VERB", "tablespoons": "NOUN", "contouring": "VERB", "goldsmith": "PROPN", "bert": "PROPN", "eastbound": "ADJ", "hoof": "NOUN", "paradigmatic": "ADJ", "rouault": "PROPN", "hottest": "ADJ", "pompey": "PROPN", "nuclear": "ADJ", "balloons": "NOUN", "shah": "PROPN", "squinting": "VERB", "croucher": "PROPN", "somebody": "PRON", "binds": "NOUN", "lionel": "PROPN", "kinda": "ADV", "spoilage": "NOUN", "brett": "PROPN", "lexicon": "NOUN", "technologies": "NOUN", "absalom": "PROPN", "closing-down": "NOUN", "repeat": "VERB", "steamboats": "NOUN", "castillo": "PROPN", "charms": "NOUN", "genes": "NOUN", "barger": "PROPN", "blanco": "PROPN", "aggregate": "NOUN", "hunches": "VERB", "jakov": "PROPN", "accepted": "VERB", "productive": "ADJ", "gracious": "ADJ", "f-": "INTJ", "iowa": "PROPN", "succeed": "VERB", "10:56": "NUM", "satellite": "NOUN", "another": "DET", "drinking": "VERB", "hyatt": "PROPN", "jules": "PROPN", "millionth": "NOUN", "runners": "NOUN", "wheelchair": "NOUN", "think-": "VERB", "apathetic": "ADJ", "contacted": "VERB", "cracked": "VERB", "lot": "NOUN", "lowers": "VERB", "abbudi": "PROPN", "barometers": "NOUN", "heaven": "NOUN", "huston": "PROPN", "renewable": "ADJ", "http://travel.state.gov/travel/cis_pa_tw/cis/cis_1052.html": "PROPN", "fatalities": "NOUN", "weights": "NOUN", "ethicities": "NOUN", "litzmannstadt": "PROPN", "benefiting": "VERB", "interpret": "VERB", "straits": "PROPN", "treatment": "NOUN", "deliciousness": "NOUN", "wsi": "NOUN", "guiness": "PROPN", "designers": "NOUN", "least": "ADJ", "dupont": "PROPN", "sheds": "NOUN", "303-294-4499": "NUM", "prioritised": "VERB", "dialogue": "NOUN", "tryed": "VERB", "1733": "NUM", "nature": "NOUN", "immediately": "ADV", "mothy": "ADJ", "disseminate": "VERB", "pc": "PROPN", "fourteen": "NUM", "check": "VERB", "clean": "ADJ", "wmds": "NOUN", "mingled": "VERB", "sensors": "NOUN", "wizardry": "NOUN", "rose": "VERB", "guide": "NOUN", "chet": "PROPN", "blowing": "VERB", "clip": "NOUN", "handcuffed": "VERB", "barges": "NOUN", "stanislavsky": "PROPN", "curdle": "VERB", "thoughtful": "ADJ", "sharjah": "PROPN", "withdrew": "VERB", "899-4425": "NUM", "asansol": "PROPN", "comment": "NOUN", "cavaliers": "PROPN", "shortly": "ADV", "anglican": "ADJ", "nervous": "ADJ", "surprises": "NOUN", "privilege": "NOUN", "resell": "VERB", "600": "NUM", "03:31": "NUM", "celebrates": "VERB", "chewing": "VERB", "http://www.compaq.com/products/notebooks/index.html": "PROPN", "headley": "PROPN", "curate": "NOUN", "elaine": "PROPN", "lighthouse": "NOUN", "doll": "NOUN", "setting": "NOUN", "fallout": "NOUN", "thi$": "DET", "bering": "PROPN", "antichrist": "PROPN", "worldwide": "ADV", "ani": "PROPN", "neckhole": "NOUN", "figurehead": "NOUN", "blundered": "VERB", "tunnel": "NOUN", "plaza": "PROPN", "re-purposing": "NOUN", "dumbest": "ADJ", "hon": "NOUN", "gérald": "PROPN", "70th": "ADJ", "audiences": "NOUN", "alpine": "PROPN", "externals": "ADJ", "gardeners": "NOUN", "française": "PROPN", "grinder": "NOUN", "conceptualizing": "VERB", "admins": "NOUN", "dealing": "VERB", "150301": "NUM", "anti-semite": "NOUN", "athene": "PROPN", "worker": "NOUN", "unlawful": "ADJ", "proper": "ADJ", "chatillon": "PROPN", "iranian": "ADJ", "industrial": "ADJ", "connectionstring": "PROPN", "kelowna": "PROPN", "alex": "PROPN", "xu": "PROPN", "1533": "NUM", "rictus-like": "ADJ", "pemex": "PROPN", "iqr": "PROPN", "conscious": "ADJ", "utah": "PROPN", "06/01/2000": "NUM", "shopped": "VERB", "widen": "VERB", "commuting": "VERB", "adhear": "VERB", "mercy": "NOUN", "cranium": "NOUN", "chandrika": "PROPN", "latte": "NOUN", "talley": "PROPN", "transformative": "ADJ", "floors": "NOUN", "calculated": "VERB", "retrieve": "VERB", "puzzling": "ADJ", "evened": "VERB", "quixotic": "ADJ", "appealing": "ADJ", "loved": "VERB", "roomful": "NOUN", "goats": "NOUN", "prudent": "ADJ", "lopsided": "ADJ", "chilliness": "NOUN", "policymaking": "NOUN", "inversions": "NOUN", "anti-indian": "ADJ", "sunak": "PROPN", "regime": "NOUN", "therapy": "NOUN", "alta": "PROPN", "scarlet": "NOUN", "botero": "PROPN", "premadasa": "PROPN", "popularly": "ADV", "attest": "VERB", "jeans": "NOUN", "crypts": "NOUN", "humour": "NOUN", "1976": "NUM", "thinset": "NOUN", "non-fiction": "NOUN", "biases": "NOUN", "anasazi": "PROPN", "mowed": "VERB", "05/31/2001": "NUM", "roussos": "PROPN", "remerged": "VERB", "pains": "NOUN", "subtlety": "NOUN", "yellow-pale-yellow-yellow": "ADJ", "saem_aero": "PROPN", "creole": "NOUN", "secession": "NOUN", "kerosene": "NOUN", "ruined": "VERB", "deceleration": "NOUN", "beaten": "VERB", "rhodes": "PROPN", "formidable": "ADJ", "yawned": "VERB", "c-": "INTJ", "civilian": "ADJ", "watched": "VERB", "charmed": "VERB", "corp": "PROPN", "victrola": "PROPN", "representationalism": "NOUN", "declines": "NOUN", "pumped": "VERB", "firm": "NOUN", "fundamentalists": "NOUN", "glisten": "VERB", "barbour": "PROPN", "startlingly": "ADV", "windsheild": "NOUN", "gcp": "NOUN", "pian": "PROPN", "vhf": "NOUN", "unusually": "ADV", "buck": "NOUN", "symbiosis": "NOUN", "envelope": "NOUN", "turkistan": "NOUN", "headed": "VERB", "nightcase": "NOUN", "agel": "PROPN", "fewer": "ADJ", "informal": "ADJ", "indian": "ADJ", "steps": "NOUN", "invoices": "NOUN", "vpp": "NOUN", "_______": "PUNCT", "bourret": "PROPN", "whipple": "PROPN", "o'reilly": "PROPN", "infused": "VERB", "sovereignty": "NOUN", "empire": "PROPN", "demons": "NOUN", "stigma": "NOUN", "montalvo": "PROPN", "ballet": "NOUN", "brewery": "NOUN", "maureen": "PROPN", "barrier": "NOUN", "division": "NOUN", "uss": "PROPN", "plutocracy": "NOUN", "cleavage": "NOUN", "slap": "NOUN", "alleged": "VERB", "unfolds": "VERB", "conscience": "NOUN", "massage": "NOUN", "pond": "PROPN", "afp": "PROPN", "rivalry": "NOUN", "doorbell": "NOUN", "comprehend": "VERB", "barros": "PROPN", "criticism": "NOUN", "churchy": "ADJ", "bundled": "VERB", "embracing": "VERB", "communication": "NOUN", "feasts": "NOUN", "denial": "NOUN", "verified": "VERB", "slime": "NOUN", "complimented": "VERB", "sentence": "NOUN", "trident": "PROPN", "semi-sketchiness": "NOUN", "protest": "NOUN", "evan": "PROPN", "signaling": "VERB", "floor": "NOUN", "predecessors": "NOUN", "theologian": "NOUN", "crap": "NOUN", "rto": "PROPN", "enrononline": "PROPN", "inadvertently": "ADV", "flexibility": "NOUN", "84,121": "NUM", "hours": "NOUN", "reporters": "NOUN", "particles": "NOUN", "swollen": "ADJ", "fabrications": "NOUN", "barno": "PROPN", "osage": "PROPN", "castling": "NOUN", "izakaya": "NOUN", "decade": "NOUN", "localized": "VERB", "butcher": "PROPN", "proceedings": "NOUN", "weblogic": "PROPN", "attendant": "NOUN", "chiro": "NOUN", "milliliters": "NOUN", "mountaintop": "NOUN", "jpl": "PROPN", "maria": "PROPN", "haircut": "NOUN", "edges": "NOUN", "romance": "NOUN", "mcmahon": "PROPN", "mailed": "VERB", "plat": "NOUN", "whack": "VERB", "ceron": "PROPN", "ana": "PROPN", "capitalize": "VERB", "llc": "PROPN", "77042-2016": "NUM", "tb": "PROPN", "distant": "ADJ", "bowtie": "PROPN", ";p": "SYM", "raffles": "NOUN", "inevitable": "ADJ", "t...@sonic.net": "PROPN", "mythical": "ADJ", "wolstein": "PROPN", "cra": "PROPN", "flips": "NOUN", "libido": "NOUN", "justifying": "VERB", "ritual": "NOUN", "sign": "NOUN", "first": "ADJ", "godsend": "NOUN", "milkshakes": "NOUN", "locomotory": "ADJ", "paniotis": "PROPN", "obeyed": "VERB", "conditioning": "NOUN", "avert": "VERB", "retired": "VERB", "warranted": "VERB", "raft": "NOUN", "de": "PROPN", "fruit-cake": "NOUN", "says": "VERB", "stu": "PROPN", "coreligionists": "NOUN", "wreathed": "VERB", "johnson": "PROPN", "amaze": "VERB", "malone": "PROPN", "stations": "NOUN", "215,000": "NUM", "ambush": "NOUN", "awkwardness": "NOUN", "barre": "NOUN", "smsll": "ADJ", "lou": "PROPN", "goldmann": "PROPN", "10:44": "NUM", "world": "NOUN", "confiscation": "NOUN", "ultraefficient": "ADJ", "descended": "VERB", "concerns": "NOUN", "gender": "NOUN", "coordinating": "VERB", "authentic": "ADJ", "rowdy": "ADJ", "coast": "NOUN", "dove": "NOUN", "constructs": "NOUN", "openings": "NOUN", "internally": "ADV", "vigie": "PROPN", "kb": "NOUN", "accounting": "NOUN", "passages": "NOUN", "misha": "PROPN", "parole": "NOUN", "03:48": "NUM", "appropriated": "VERB", "dasovich": "PROPN", "napkins": "NOUN", "licks": "VERB", "spotlight": "NOUN", "eastgardens": "PROPN", "sheep": "NOUN", "senatorial": "ADJ", "geopolitics": "NOUN", "originate": "VERB", "canopy": "NOUN", "gordon": "PROPN", "mein": "NOUN", "approximates": "VERB", "revocation": "NOUN", "unfrightened": "VERB", "713-793-2000": "NUM", "06:05": "NUM", "seperate": "ADJ", "puzzled": "VERB", "rockjumbled": "ADJ", "second-hand": "ADJ", "whistle": "VERB", "universidade": "PROPN", "guessed": "VERB", "wakrah": "PROPN", "bemused": "ADJ", "cloaca": "NOUN", "navigate": "VERB", "ringleader": "NOUN", "hermione": "PROPN", "mass": "NOUN", "forbade": "VERB", "melts": "VERB", "wept": "VERB", "hearings": "NOUN", "subsequently": "ADV", "persists": "VERB", "overstatements": "NOUN", "beeline": "PROPN", "nd": "PROPN", "suilen": "PROPN", "warps": "VERB", "trickle": "NOUN", "3889": "NUM", "http://www.mikegigi.com/castgobl.htm": "PROPN", "seriograph": "NOUN", "madhlum": "PROPN", "cannon": "PROPN", "undertakes": "VERB", "hasid": "NOUN", "fair": "ADJ", "toowoomba": "PROPN", "forsyth": "PROPN", "ads": "NOUN", ",,": "PUNCT", "nonexistent": "ADJ", "awkward": "ADJ", "drank": "VERB", "t&d": "NOUN", "barcoding": "NOUN", "neuter": "NOUN", "elevator": "NOUN", "goggle": "VERB", "totes": "NOUN", "haddo": "PROPN", "ho": "PROPN", "bridget": "PROPN", "untrue": "ADJ", "headquarters": "NOUN", "sera": "PROPN", "echoing": "VERB", "literary": "ADJ", "1551": "NUM", "30,858": "NUM", "advertise": "VERB", "previous": "ADJ", "abolishing": "VERB", "sanctions": "NOUN", "theirs": "PRON", "taxi-driver": "NOUN", "beseech": "VERB", "bandwidth": "NOUN", "conditions": "NOUN", "hatred": "NOUN", "commonplace": "ADJ", "metres": "NOUN", "favour": "NOUN", "med": "NOUN", "dashed": "VERB", "bruce": "PROPN", "shrines": "NOUN", "merge": "VERB", "delinquent": "ADJ", "hughes": "PROPN", "lightly": "ADV", "plan": "NOUN", "dust": "NOUN", "gregory": "PROPN", "operated": "VERB", "train-tracks": "NOUN", "metis": "PROPN", "earning": "VERB", "relatives": "NOUN", "invitees": "NOUN", "unspecified": "ADJ", "eleanor": "PROPN", "opec": "PROPN", "sell-out": "NOUN", "reminds": "VERB", "mirandela": "PROPN", "twins": "NOUN", "multimillions": "NOUN", "luggage": "NOUN", "resumes": "NOUN", "ppi": "NOUN", "sincere": "ADJ", "abstaining": "VERB", "fisherman": "NOUN", "beatle": "PROPN", "fries": "NOUN", "yummy": "ADJ", "gino": "PROPN", "geometries": "NOUN", "dhin": "INTJ", "humanities": "NOUN", "ecumenical": "ADJ", "counter-strike": "PROPN", "kethlan": "PROPN", "donatus": "PROPN", "insurers": "NOUN", "geographical": "ADJ", "realm": "NOUN", "denny": "PROPN", "sri": "PROPN", "lftd": "PROPN", "containers": "NOUN", "selectiveness": "NOUN", "fiji": "NOUN", "asexually": "ADV", "www.veraakulov.com": "PROPN", "observer": "NOUN", "academics": "NOUN", "mason": "PROPN", "unto": "ADP", "summer": "NOUN", "...........": "PUNCT", "reefs": "NOUN", "bounces": "VERB", "treacherous": "ADJ", "influential": "ADJ", "datasheet": "NOUN", "bexar": "PROPN", "celebrate": "VERB", "southwestern": "ADJ", "11-20-2000": "NUM", "uno": "NOUN", "masts": "NOUN", "hoa": "PROPN", "optical": "ADJ", "08:27:46": "NUM", "asi": "PROPN", "viciously": "ADV", "deputies": "NOUN", "wield": "VERB", "unequipped": "ADJ", "frightened": "VERB", "contributing": "VERB", "emitted": "VERB", "parties": "NOUN", "hormel": "PROPN", "------------------------------------------------------": "PUNCT", "distribution": "NOUN", "longer": "ADV", "employ": "VERB", "1959": "NUM", "campaign": "NOUN", "http://tong.visitkorea.or.kr/cms/resource/81/188181_image2_1.jpg": "PROPN", "inoperable": "ADJ", "yelp": "PROPN", "hindering": "VERB", "discrimination": "NOUN", "consecutive": "ADJ", "infections": "NOUN", "festivities": "NOUN", "recordings": "NOUN", "bursting": "ADJ", "paperweight": "NOUN", "prep": "NOUN", "vladimir": "PROPN", "eg.": "ADV", "beutel": "PROPN", "beta": "NOUN", "ethnicity": "NOUN", "teheran": "PROPN", "grill": "NOUN", "belongs": "VERB", "waterproof": "ADJ", "mergers": "NOUN", "twos": "NOUN", "maori": "ADJ", "backside": "NOUN", "embodies": "VERB", "haut": "PROPN", "minds": "NOUN", "http://www.mikegigi.com/castgobl.htm#lggobproj": "PROPN", "paler": "ADJ", "revell": "PROPN", "metrical": "ADJ", "pat": "PROPN", "scled": "NOUN", "gary": "PROPN", "unnatural": "ADJ", "brief": "ADJ", "varieties": "NOUN", "fluently": "ADV", "re-run": "NOUN", "5.1": "NUM", "chaos": "NOUN", "pre-rinsed": "ADJ", "girdle": "NOUN", "fdr": "PROPN", "a.m.beresford@durham.ac.uk": "PROPN", "date": "NOUN", "emailed": "VERB", "tears": "NOUN", "inquiries": "NOUN", "picnickers": "NOUN", "12th": "NOUN", "experienced": "VERB", "mermaids": "NOUN", "mellow": "ADJ", "diachronic": "ADJ", "killers": "NOUN", "thwart": "VERB", "bryant": "PROPN", "publishers": "NOUN", "kuwaiti": "ADJ", "observing": "VERB", "enable": "VERB", "untidy": "ADJ", "hover": "VERB", "interestingness": "NOUN", "eviction": "NOUN", "rem": "PROPN", "india": "PROPN", "mend": "VERB", "ut": "PROPN", "713-546-5000": "NUM", "megapixel": "NOUN", "efforts": "NOUN", "distress": "NOUN", "80th": "ADJ", "exiled": "VERB", "these": "DET", "pioneering": "VERB", "filner": "PROPN", "define": "VERB", "rer": "PROPN", "ruy": "PROPN", "hosanna": "PROPN", "delvery": "NOUN", "dollars": "NOUN", "tremendous": "ADJ", "illuminating": "VERB", "shipped": "VERB", "pasted": "VERB", "earth": "NOUN", "http://www.sploid.com/news/2006/05/evil_priest_gui.php": "PROPN", "extensive": "ADJ", "communications": "NOUN", "washer": "NOUN", "pleasure": "NOUN", "kinetic": "ADJ", "glad": "ADJ", "weaknesses": "NOUN", "44": "NUM", "symptomatic": "ADJ", "s.hernandez@udc.es": "PROPN", "ichor": "NOUN", "discoverer": "NOUN", "muslims": "PROPN", "youngspiration": "PROPN", "fairway": "PROPN", "shell": "PROPN", "post-modern": "ADJ", "promptly": "ADV", "969": "NUM", "2003": "NUM", "visualizations": "NOUN", "courtney": "PROPN", "appropriately": "ADV", "developing": "VERB", "deals": "NOUN", "pitfalls": "NOUN", "text": "NOUN", "earthquake": "NOUN", "goers": "NOUN", "intel": "PROPN", "boys": "NOUN", "beneficiary": "NOUN", "mystics": "PROPN", "immigeration": "NOUN", "blah": "INTJ", "organic": "ADJ", "hegelian": "ADJ", "preview": "VERB", "ummmm": "INTJ", "posterity": "NOUN", "tatty": "ADJ", "post-saddam": "ADJ", "'60s": "NOUN", "relates": "VERB", "479,000": "NUM", "export": "VERB", "-----": "PUNCT", "merchanting": "PROPN", "garage": "NOUN", "hannon": "PROPN", "nine": "NUM", "statement": "NOUN", "results": "NOUN", "smith": "PROPN", "privileges": "NOUN", "philosophies": "NOUN", "dialogical": "ADJ", "gps": "NOUN", "securely": "ADV", "undesirable": "ADJ", "maati": "PROPN", "moderate": "ADJ", "sardica": "PROPN", "mussels": "NOUN", "gebo": "PROPN", "messing": "VERB", "fl": "ADJ", "salutatory": "ADJ", "softened": "ADJ", "formation": "NOUN", "84": "NUM", "cereal": "NOUN", "superiors": "NOUN", "reiterate": "VERB", "neuroimaging": "NOUN", "inherently": "ADV", "ungainly": "ADJ", "chewed": "VERB", "lisa": "PROPN", "granqvist": "PROPN", "goes": "VERB", "crazed": "VERB", "atta": "PROPN", "dawn": "NOUN", "dripping": "VERB", "colonization": "NOUN", "92": "NUM", "accomplishes": "VERB", "strippers": "NOUN", "sought": "VERB", "arguably": "ADV", "bieber": "PROPN", "disdain": "NOUN", "propped": "VERB", "groped": "VERB", "breeder": "NOUN", "1704": "NUM", "publicity": "NOUN", "demonstrates": "VERB", "lions": "NOUN", "non-prototypical": "ADJ", "buttressed": "VERB", "kurds": "PROPN", "chat": "VERB", "nottingham": "PROPN", "gtc's": "NOUN", "neon": "NOUN", "rent": "NOUN", "zeus": "PROPN", "proposal.xls": "NOUN", "shrine": "NOUN", "successively": "ADV", "brain": "NOUN", "transact": "VERB", "enovate": "NOUN", "morbidly": "ADV", "measures": "NOUN", "neo-colonialism": "NOUN", "gumball": "NOUN", "wait": "VERB", "craving": "NOUN", "doubled": "VERB", "github": "PROPN", "becca": "PROPN", "187": "NUM", "afghans": "PROPN", "disgustingly": "ADV", "201": "NUM", "included": "VERB", "creativity": "NOUN", "uneasy": "ADJ", "windermere": "PROPN", "9.3": "NUM", "reconciled": "VERB", "drving": "VERB", ".227": "NUM", "treasurer": "NOUN", "internet": "PROPN", "granddaughters": "NOUN", "kids": "NOUN", "swamp": "NOUN", "fenway": "PROPN", "yogurt": "NOUN", "riders": "NOUN", "1527": "NUM", "manmohan": "PROPN", "vegetable": "NOUN", "destiny": "NOUN", "rabbi": "NOUN", "bronzy": "ADJ", "compound": "ADJ", "constitutionally": "ADV", "baseman": "NOUN", "01/24/2001": "NUM", "crucify": "VERB", "dwelling": "NOUN", "extensions": "NOUN", "felipe": "PROPN", "piled": "VERB", "musician": "NOUN", "restrict": "VERB", "declares": "VERB", "tougher": "ADJ", "crocheting": "VERB", "plum": "NOUN", "21.0": "NUM", "boi": "PROPN", "weathermen": "PROPN", "peru": "PROPN", "elements": "NOUN", "reform": "NOUN", "aesthetics": "NOUN", "pottery": "NOUN", "hutch": "NOUN", "furs": "NOUN", "mccombs": "PROPN", "pekin": "NOUN", "crumples": "VERB", "ballistic": "ADJ", "file-persistent": "ADJ", "owen": "PROPN", "crime": "NOUN", "blackline": "VERB", "incentives": "NOUN", "braining": "VERB", "concern": "NOUN", "hesitantly": "ADV", "spatial": "ADJ", "gelato": "NOUN", "fanaticism": "NOUN", "control": "NOUN", "rabbit": "NOUN", "nonsense": "NOUN", "incompletely": "ADV", "socio-political": "ADJ", "alito": "PROPN", "considerations": "NOUN", "spinner": "PROPN", "territorial": "ADJ", "investigating": "VERB", "maryam": "PROPN", "recognition": "NOUN", "recomend": "VERB", "sub-cultures": "NOUN", "translators": "PROPN", "nsu": "PROPN", "mins.": "NOUN", "barber": "NOUN", "executing": "VERB", "pederasty": "NOUN", "crocodile": "NOUN", "competitiveness": "NOUN", "comers": "NOUN", "maitra": "PROPN", "inject": "VERB", "rishi": "PROPN", "04:34": "NUM", "347": "NUM", "newport": "PROPN", "starter": "NOUN", "260": "NUM", "heisenberg": "PROPN", "ownership": "NOUN", "directed": "VERB", "alot": "ADV", "plac": "PROPN", "wrap": "VERB", "phat": "ADJ", "budweiser": "PROPN", "reclaimed": "VERB", "moore": "PROPN", "nelson": "PROPN", "apollo": "PROPN", "steamed": "VERB", "researchgate": "PROPN", "5107": "NUM", "manual": "NOUN", "20,000": "NUM", "donaldson": "PROPN", "spanish": "ADJ", "teddie": "PROPN", "inequity": "NOUN", "exploration": "NOUN", "goddesses": "NOUN", "feathering": "NOUN", "dissolve": "VERB", "***********************************": "PUNCT", "exceptional": "ADJ", "attempting": "VERB", "notional": "ADJ", "nba": "PROPN", "frowning": "VERB", "achievement": "NOUN", "inverted": "VERB", "demotion": "NOUN", "eight-inch": "ADJ", "sardines": "NOUN", "acceptance": "NOUN", "loc": "NOUN", "smallest": "ADJ", "10:52": "NUM", "chemistries": "NOUN", "dimensional": "ADJ", "throats": "NOUN", "baie": "PROPN", "expressed": "VERB", "mislabeled": "VERB", "cater": "NOUN", "linguist": "NOUN", "escalator": "NOUN", "18:20": "NUM", "specification": "NOUN", "prodigious": "ADJ", "initiate": "VERB", "existing": "VERB", "xray": "NOUN", "t": "NOUN", "eastward": "ADV", "bangladeshi": "ADJ", "moussaoui": "PROPN", "surpassed": "VERB", "boat": "NOUN", "goggled": "VERB", "<-": "SYM", "strong": "ADJ", "branches": "NOUN", "wonders": "NOUN", "insatiable": "ADJ", "arrested": "VERB", "lora": "PROPN", "enmities": "NOUN", "estimated": "VERB", "nile": "PROPN", "tensions": "NOUN", "rodents": "NOUN", "taub": "PROPN", "editorship": "NOUN", "pentagon": "PROPN", "cheers": "NOUN", "b2b": "NOUN", "troy": "PROPN", "postdigital": "ADJ", "fixture": "NOUN", "warlord": "NOUN", "seclusion": "NOUN", "attempted": "VERB", "capitalism": "NOUN", "youngish": "ADJ", "tech": "NOUN", "endless": "ADJ", "elliott": "PROPN", "operation": "NOUN", "kippers": "NOUN", "drugs": "NOUN", "para": "NOUN", "several": "ADJ", "khaza'il": "PROPN", "spinning": "VERB", "lorie": "PROPN", "extras": "NOUN", "females": "NOUN", "food": "NOUN", "junius": "PROPN", "debut": "NOUN", "hookers": "NOUN", "agreeable": "ADJ", "impacted": "VERB", "wallet": "NOUN", "covert": "ADJ", "conspiracy": "NOUN", "tallith": "NOUN", "h-0237/97": "NUM", "colorful": "ADJ", "potentiality": "NOUN", "analyses": "NOUN", "meteorites": "NOUN", "sidewalk": "NOUN", "tomatoes": "NOUN", "earn": "VERB", "lynch": "PROPN", "labelled": "VERB", "328": "NUM", "6/14": "NUM", "phillips": "PROPN", "deported": "VERB", "mathematicians": "NOUN", "rivalries": "NOUN", "blacklined": "VERB", "knew": "VERB", "coup": "NOUN", "60": "NUM", "gay": "ADJ", "smartly": "ADV", "x": "NOUN", "wearing": "VERB", "divy": "VERB", "geese": "NOUN", "hayat": "PROPN", "1640": "NUM", "signals": "VERB", "cursor": "NOUN", "peddle": "NOUN", "1949": "NUM", "corp.": "PROPN", "podiobooks.com": "PROPN", "pjc": "PROPN", "noir": "PROPN", "adsl": "NOUN", "happier": "ADJ", "sikkim": "PROPN", "blender": "NOUN", "hypnotic": "ADJ", "sub-division": "NOUN", "bombing": "NOUN", "deflated": "VERB", "insects": "NOUN", "11/13/2000": "NUM", "#systemanalysis": "PROPN", "erroneous": "ADJ", "5:00": "NUM", "compliments": "NOUN", "muttering": "VERB", "greasy": "ADJ", "1920s": "NOUN", "saudis": "PROPN", "citizens": "NOUN", "0.6": "NUM", "19.5": "NUM", "idiot": "NOUN", "broadline": "ADJ", "recessive": "ADJ", "bourbon": "NOUN", "murillo": "PROPN", "02/13/2001": "NUM", "friar": "PROPN", "wenders": "PROPN", "snowscape": "NOUN", "rushing": "VERB", "featureless": "ADJ", "allowdeletions": "NOUN", "wordlessly": "ADV", "shedload": "NOUN", "dreaming": "NOUN", "aside": "ADV", "audio": "NOUN", "646-5847": "NUM", "70's": "NOUN", "positioned": "VERB", "garner": "VERB", "fleeing": "VERB", "cesar": "PROPN", "l.i.t": "PROPN", "seductive": "ADJ", "hospitalize": "VERB", "e-mails": "NOUN", "tarpaulin": "NOUN", "+1918584-4428": "NUM", "940": "NUM", "flashest": "ADJ", "massacred": "ADJ", "week": "NOUN", "bengal": "PROPN", "fellows": "NOUN", "herding": "NOUN", "invade": "VERB", "!!!!!!!!!!?": "PUNCT", "phbow": "PROPN", "swapped": "VERB", "09:45": "NUM", "*~*~*~*~*~*~*~*~*~*": "SYM", "l'americano": "PROPN", "subduing": "VERB", "robert": "PROPN", "whom": "PRON", "contentedly": "ADV", "dark-green": "ADJ", "olympic": "ADJ", "connectionfile": "NOUN", "substitute": "NOUN", "bravery": "NOUN", "schoolgirls": "NOUN", "aeron": "PROPN", "linguistic": "ADJ", "golden": "ADJ", "without": "ADP", "self-contained": "VERB", "originated": "VERB", "considerably": "ADV", "dylan": "PROPN", "homeless": "ADJ", "operations": "NOUN", "goodwyn": "PROPN", "92842": "NUM", "clh": "PROPN", "tranquil": "ADJ", "10:46": "NUM", "illyrian": "ADJ", "lighthearted": "ADJ", "enhance": "VERB", "music": "NOUN", "together": "ADV", "wi940": "PROPN", "swinging": "VERB", "morbidity": "NOUN", "infrequently": "ADV", "confined": "VERB", "commons": "PROPN", "fulfilment": "NOUN", "glance": "NOUN", "désiré": "PROPN", "affective": "ADJ", "pelts": "NOUN", "ecologist": "NOUN", "dissecting": "VERB", "illegal": "ADJ", "feelings": "NOUN", "causal": "ADJ", "bitterness": "NOUN", "5th": "ADJ", "practiced": "VERB", "shaking": "VERB", "mid-2003": "NOUN", "innovation": "NOUN", "raw": "ADJ", "pop...@spinach.eat": "PROPN", "experimenting": "VERB", "numerical": "ADJ", "taking": "VERB", "nagging": "VERB", "assisted": "VERB", "advisors": "NOUN", "disenfranchisement": "NOUN", "bullseye": "NOUN", "coincidentally": "ADV", "woodland": "NOUN", "tragedies": "NOUN", "southampton": "PROPN", "learns": "VERB", "bundle": "NOUN", "youtube": "PROPN", "admin": "ADJ", "si": "NOUN", "badgers": "NOUN", "28/10/2004": "NUM", "sang": "VERB", "invasive": "ADJ", "seventeen": "NUM", "scud": "PROPN", "☏": "SYM", "landlocked": "ADJ", "grass": "NOUN", "gerulaitis": "PROPN", "2545": "NUM", "essays": "NOUN", "vice": "PROPN", "pots": "NOUN", "bitterly": "ADV", "everyone": "PRON", "genuinely": "ADV", "o": "ADP", "impending": "ADJ", ":p": "SYM", "arkham": "PROPN", "practice": "NOUN", "caster": "NOUN", "rhinegold": "NOUN", "persian": "PROPN", "murderer": "NOUN", "disagreeable": "ADJ", "resolutions": "NOUN", "probabition": "NOUN", "hegemony": "PROPN", "submerged": "VERB", "1894": "NUM", "ll": "AUX", "swamped": "VERB", "combo": "NOUN", "conflicting": "VERB", "scrubby": "ADJ", "gran'": "ADJ", "symbols": "NOUN", "colossal": "ADJ", "saturday": "PROPN", "branson": "PROPN", "thawed": "VERB", "wedge": "NOUN", "pronunciation": "NOUN", "poisons": "NOUN", "¢": "SYM", "british": "ADJ", "phantome": "PROPN", "dewhurst": "PROPN", "remove": "VERB", "wrestle": "VERB", "untied": "VERB", "wielding": "VERB", "davio": "PROPN", "cork": "NOUN", "permeate": "VERB", "miriam": "PROPN", "hype": "NOUN", "persisting": "VERB", "recognizable": "ADJ", "acquaintance": "NOUN", "togas": "NOUN", "yeung": "PROPN", "municipality": "NOUN", "sinus": "NOUN", "checking": "VERB", "populations": "NOUN", "cling": "VERB", "seti": "PROPN", "5.6": "NUM", "lately": "ADV", "halal": "ADJ", "shahar": "PROPN", "levantine": "ADJ", "ag": "NOUN", "mohieddin": "PROPN", "embowered": "VERB", "wife": "NOUN", "bikes": "NOUN", "rightfully": "ADV", "cbd": "PROPN", "hang": "VERB", "packet": "NOUN", "felice": "PROPN", "silliest": "ADJ", "benefited": "VERB", "club": "NOUN", "dry": "ADJ", "transmitted": "VERB", "pigeons": "NOUN", "valet": "NOUN", "marvelled": "VERB", "adaptation": "NOUN", "eaten": "VERB", "beckoning": "VERB", "katherinator": "PROPN", "optimal": "ADJ", "escapades": "NOUN", "ford": "PROPN", "catcher": "NOUN", "assassinated": "VERB", "widespread": "ADJ", "jeju": "PROPN", "bed": "NOUN", "executives": "NOUN", "defective": "ADJ", "opportune": "ADJ", "weil": "PROPN", "hh": "NOUN", "rolling": "VERB", "22": "NUM", "cured": "VERB", "enjoyable": "ADJ", "capelin": "NOUN", "bottled": "ADJ", "notes": "NOUN", "commandant": "NOUN", "expenses": "NOUN", "hwang": "PROPN", "fortnight": "NOUN", "noggins": "NOUN", "behave": "VERB", "booze": "NOUN", "beringia": "PROPN", "kumaratunga": "PROPN", "gears": "NOUN", "scapes": "NOUN", "allow": "VERB", "julian": "PROPN", "yoyo": "NOUN", "defeated": "VERB", "phy": "NOUN", "narrator": "NOUN", "brittany": "PROPN", "stray": "ADJ", "precautions": "NOUN", "fernandina": "PROPN", "wrapping": "NOUN", "counterparties": "NOUN", "abyss": "NOUN", ":": "PUNCT", "roosters": "NOUN", "unfunny": "ADJ", "lyrical": "ADJ", "trusts": "VERB", "artificially": "ADV", "01/19/2001": "NUM", "remuneration": "NOUN", "ever": "ADV", "relating": "VERB", "picannins": "NOUN", "window": "NOUN", "borenste@haas.berkeley.edu": "PROPN", "aguilar": "PROPN", "monotony": "NOUN", "skip": "VERB", "envied": "VERB", "forster": "PROPN", "shavings": "NOUN", "endo": "PROPN", "house": "NOUN", "perked": "VERB", "merely": "ADV", "memorial": "NOUN", "drunker": "ADJ", "michelangelo": "PROPN", "him": "PRON", "baffled": "VERB", "purported": "VERB", "mckenzie": "PROPN", "sat": "VERB", "auchintoul": "PROPN", "saucepan": "NOUN", "duty": "NOUN", "26": "NUM", "temperment": "NOUN", "laces": "NOUN", "one": "NUM", "elinor": "PROPN", "frisked": "VERB", "67.70": "NUM", "service": "NOUN", "arranging": "VERB", "terminal": "PROPN", "42,008": "NUM", "shabby-looking": "ADJ", "beverage": "NOUN", "survivors": "NOUN", "reflected": "VERB", "enrongss.xls": "NOUN", "outback": "PROPN", "deadness": "NOUN", "barton": "PROPN", "rigged": "VERB", "planet": "NOUN", "inaccurate": "ADJ", "thrown": "VERB", "accents": "NOUN", "majeure": "NOUN", "macs": "NOUN", "grants": "NOUN", "playful": "ADJ", "asahe": "PROPN", "nutcrackers": "NOUN", "mauritania": "PROPN", "phylogenetic": "ADJ", "filled": "VERB", "stooping": "ADJ", "pebbles": "NOUN", "pitch": "NOUN", "crowded": "ADJ", "factions": "NOUN", "part-session": "NOUN", "aspirational": "ADJ", "patient": "NOUN", "okay": "INTJ", "assurance": "NOUN", "breezes": "NOUN", "entities": "NOUN", "concrete": "NOUN", "charlotte": "PROPN", "hammy": "NOUN", "recipients": "NOUN", "incubating": "VERB", "mcmuffin": "PROPN", "tagesthemen": "PROPN", "alfaro": "PROPN", "schmidt": "PROPN", "anal": "ADJ", "chasms": "NOUN", "razaq": "PROPN", "atheists": "NOUN", "sobriquet": "NOUN", "distortions": "NOUN", "hike": "VERB", "rumbling": "VERB", "suspect": "VERB", "vol.": "NOUN", "bowls": "NOUN", "sociologists": "NOUN", "brieber": "PROPN", "condiments": "NOUN", "chihuahua": "PROPN", "cornell": "PROPN", "superseding": "VERB", "drafting": "VERB", "stash": "VERB", "2008": "NUM", "dictate": "VERB", "plunder": "VERB", "offend": "VERB", "que.": "PROPN", "storybooks": "NOUN", "lichen": "NOUN", "holocaust-esque": "ADJ", "uzbekistan": "PROPN", "mode": "NOUN", "batches": "NOUN", "mccutchan": "PROPN", "cnn": "PROPN", "imperfection": "NOUN", "marker": "NOUN", "versa": "ADV", "endowment": "NOUN", "ramon": "PROPN", "compounded": "VERB", "operational": "ADJ", "spectral": "ADJ", "produces": "VERB", "chopping": "VERB", "bell": "NOUN", "stolen": "VERB", "member": "NOUN", "uecomm": "PROPN", "nationalities": "NOUN", "faithful": "ADJ", "task": "NOUN", "315-460-3344": "NUM", "intersected": "VERB", "observes": "VERB", "complexities": "NOUN", "photographing": "VERB", "mask": "NOUN", "sharers": "NOUN", "trafficking": "NOUN", "bodice": "NOUN", "rename": "VERB", "revealed": "VERB", "breaks": "NOUN", "ultimately": "ADV", "displaced": "VERB", "schedulers": "NOUN", "peoples": "NOUN", "11831": "NUM", "cc": "PROPN", "universidad": "PROPN", "convincing": "ADJ", "2:300": "NUM", "vans": "NOUN", "pathogens": "NOUN", "doom": "NOUN", "kalikhola": "PROPN", "inhibitors": "NOUN", "acts": "NOUN", "govind": "PROPN", "http://www.laweekly.com/general/features/satan-loves-you/13454/": "PROPN", "mechanics": "NOUN", "vernon": "PROPN", "shames": "PROPN", "prophecy": "NOUN", "1868": "NUM", "kittens": "NOUN", "unjustified": "ADJ", "11/01/01": "NUM", "ten": "NUM", "auspices": "NOUN", "radianz": "PROPN", "bloodworms": "NOUN", "soap": "NOUN", "threat": "NOUN", "stylesheet": "NOUN", "reckless": "ADJ", "reading": "VERB", "mathematical": "ADJ", "fights": "NOUN", "guiltily": "ADV", "committed": "VERB", "carburetor": "NOUN", "crinkly": "ADJ", "invent": "VERB", "regard": "NOUN", "folders": "NOUN", "behind": "ADP", "thais": "PROPN", "sycamore": "NOUN", "separatists": "NOUN", "embedding": "VERB", "neuro": "NOUN", "47's": "NOUN", "conjunction": "NOUN", "welded": "VERB", "jihad": "PROPN", "circulating": "VERB", "terrorists": "NOUN", "oilfield": "NOUN", "shaft": "NOUN", "range": "NOUN", "provocations": "NOUN", "whale": "NOUN", "uncertainty": "NOUN", "backpacks": "NOUN", "retarded": "ADJ", "taasinge": "PROPN", "implements": "NOUN", "3,500": "NUM", "changeable": "ADJ", "samples": "NOUN", "attn.": "NOUN", "judgment": "NOUN", "players": "NOUN", "swaps": "NOUN", "quixote": "PROPN", "committing": "VERB", "http://news.bbc.co.uk/2/hi/programmes/this_world/4446342.stm": "PROPN", "pleasantly": "ADV", "foremost": "ADJ", "upraised": "VERB", "indeed": "ADV", "niches": "NOUN", "aakrosh": "PROPN", "xenocentrism": "NOUN", "starters": "NOUN", "nationalist": "ADJ", "despair": "NOUN", "playhouse": "PROPN", "moustache": "NOUN", "silvered": "ADJ", "andre": "PROPN", "amerithrax": "PROPN", "kelly": "PROPN", "trashed": "VERB", "unheeding": "ADJ", "tissue": "NOUN", "came": "VERB", "flow": "NOUN", "362416": "NUM", "recipient": "NOUN", "stellar": "ADJ", "researcher": "NOUN", "lingard": "PROPN", "poseidon": "PROPN", "heidelberg": "PROPN", "flynn": "PROPN", "parvovirus": "PROPN", "client": "NOUN", "harmless": "ADJ", "wildernest": "PROPN", "nutley": "PROPN", "jessica": "PROPN", "poach": "VERB", "bipedal": "ADJ", "sleeps": "VERB", "harshest": "ADJ", "visiting": "VERB", "jackets": "NOUN", "kansas": "PROPN", "interviews": "NOUN", "flinched": "VERB", "disrupt": "VERB", "overcharges": "NOUN", "two-hours-and-a-bit": "NOUN", "e-reader": "NOUN", "bureaucratically": "ADV", "trader": "NOUN", "mahady": "PROPN", "enchantment": "NOUN", "totally": "ADV", "morse": "PROPN", "agony": "NOUN", "acquiring": "VERB", "britney": "PROPN", "fassbinder": "PROPN", "sdot": "PROPN", "frontline": "NOUN", "psychoanalysis": "NOUN", "sifted": "VERB", "10:25": "NUM", "--": "PUNCT", "94720-1900": "NUM", "organism": "NOUN", "cut": "VERB", "assignment": "NOUN", "musk": "NOUN", "palate": "NOUN", "narratives": "NOUN", "flip": "VERB", "stiffening": "VERB", "jagger": "PROPN", "obliged": "VERB", "schenectady": "PROPN", "13": "NUM", "breathless": "ADJ", "mistook": "VERB", "swam": "VERB", "bad": "ADJ", "commitee": "NOUN", "(collapsible|expandable)": "ADJ", "rational": "ADJ", "grieving": "VERB", "rp": "NOUN", "ai": "NOUN", "sized": "ADJ", "romanick": "PROPN", "environment-friendly": "ADJ", "exemption": "NOUN", "kurdistan": "PROPN", "implicit": "ADJ", "mediawiki": "PROPN", "evidentary": "ADJ", "compelling": "ADJ", "degus": "NOUN", "immigrants": "NOUN", "beneficent": "ADJ", "shiite": "ADJ", "dividend": "NOUN", "flight": "NOUN", "10:05": "NUM", "people": "NOUN", "wmd": "PROPN", "ur": "PRON", "bones": "NOUN", "elie": "PROPN", "pizzerias": "NOUN", "menacingly": "ADV", "dishonest": "ADJ", "oozing": "VERB", "wider": "ADJ", "corners": "NOUN", "serpentine": "ADJ", "@jasthenurse": "PROPN", "hillegonds": "PROPN", "pull": "VERB", "dictatorship": "NOUN", "enquiry": "NOUN", "rugs": "NOUN", "ct": "NOUN", "golf": "NOUN", "safeguards": "NOUN", "overcooked": "ADJ", "mmbtu": "NOUN", "circulates": "VERB", "flustered": "ADJ", "equivalant": "ADJ", "hemisphere": "PROPN", "such": "ADJ", "satirical": "ADJ", "mommies": "NOUN", "recruits": "NOUN", "coffeehouses": "NOUN", "rescheduled": "VERB", "customarily": "ADV", "delayed": "VERB", "#reportinginformation": "PROPN", "proponent": "NOUN", "fluttered": "VERB", "levitated": "VERB", "----": "PUNCT", "upheaval": "NOUN", "asthmatic": "ADJ", "scap-22-368": "PROPN", "living-room": "NOUN", "rte": "PROPN", "marco": "PROPN", "hideouts": "NOUN", "peroxide": "NOUN", "pic": "NOUN", "portal": "NOUN", "allows": "VERB", "v-legged": "ADJ", "congressmen": "PROPN", "standpoint": "NOUN", "shirts": "NOUN", "reneged": "VERB", "hd": "NOUN", "torrey": "PROPN", "approached": "VERB", "heart": "NOUN", "abstract": "ADJ", "slippers": "NOUN", "woven": "VERB", "demonstrating": "VERB", "1535": "NUM", "exercitationes": "PROPN", "overtures": "NOUN", "occupies": "VERB", "dante": "PROPN", "person": "NOUN", "dangers": "NOUN", "shoreless": "ADJ", "car": "NOUN", "pastor": "NOUN", "nimr": "PROPN", "ikea": "PROPN", "750": "NUM", "median": "NOUN", "mexican": "ADJ", "communion": "PROPN", "entrails": "NOUN", "circulatory": "ADJ", "immortalized": "VERB", "plot": "NOUN", "phenomenal": "ADJ", "constituency": "NOUN", "17,100": "NUM", "crappy": "ADJ", "milligan": "PROPN", "spirituality": "NOUN", "buddakan": "PROPN", ".2": "NUM", "geekseekers": "PROPN", "alt.animals.cat": "NOUN", "organize": "VERB", "complication": "NOUN", "thru": "ADP", "regulators": "NOUN", "career": "NOUN", "roughhouse": "NOUN", "modifiable": "ADJ", "interconnect": "NOUN", "hoisted": "VERB", "et": "PROPN", "mcnamara": "PROPN", "50,000": "NUM", "42,000.00": "NUM", "rude": "ADJ", "sulky": "ADJ", "capabilities": "NOUN", "purchased": "VERB", "energy": "NOUN", "09:27": "NUM", "semantic": "ADJ", "unceasing": "ADJ", "bouquet": "NOUN", "distributing": "VERB", "bushy": "ADJ", "totalling": "VERB", "peanut-butter": "NOUN", "biology": "NOUN", "carolyn": "PROPN", "receiver": "NOUN", "tormented": "VERB", "tooth": "NOUN", "75": "NUM", "hardship": "NOUN", "earthy": "ADJ", "'m": "AUX", "breadth": "NOUN", "10/23/2000": "NUM", "furrowed": "VERB", "ngo's": "NOUN", "34.6": "NUM", "212": "NUM", "preening": "NOUN", "blossom": "NOUN", "starving": "VERB", "8000": "NUM", "69": "NUM", "spier": "PROPN", "counter-conference": "NOUN", "clair": "PROPN", "expects": "VERB", "blessed": "VERB", "shorthanded": "ADJ", "graduates": "NOUN", "deteriorated": "VERB", "puct": "PROPN", "mud-flat": "NOUN", "transplant": "VERB", "hee-chan": "PROPN", "lube": "NOUN", "295870": "NUM", "playfully": "ADV", "pimply": "ADJ", "enfranchising": "VERB", "deduce": "VERB", "unclenched": "VERB", "geographer": "NOUN", "uprush": "NOUN", "29": "NUM", "425-922-0475": "NUM", "deductions": "NOUN", "mrs": "NOUN", "behalf": "NOUN", "elbow": "NOUN", "mailto:amy.cornell@compaq.com": "PROPN", "awarded": "VERB", "enroute": "ADV", "cheated": "ADJ", "aimless": "ADJ", "donald": "PROPN", "haddock": "NOUN", "bewitched": "VERB", "venta": "PROPN", "shock": "NOUN", "’ve": "AUX", "knacks": "NOUN", "quebecker": "PROPN", "surgeon": "NOUN", "sean": "PROPN", "sophia": "PROPN", "3:30": "NUM", "hiring": "VERB", "haemorrhage": "NOUN", "belief": "NOUN", "reynolds": "PROPN", "insensate": "ADJ", "spots": "NOUN", "mehraban": "PROPN", "umbilical": "ADJ", "magicians": "NOUN", "lightest": "ADJ", "stint": "NOUN", "drastic": "ADJ", "lan": "PROPN", "wesleyan": "PROPN", "ratty": "ADJ", "mister": "PROPN", "itself": "PRON", "barnacles": "NOUN", "619-696-6966": "NUM", "mama": "NOUN", "bore": "VERB", "moloch": "PROPN", "locution": "NOUN", "xiii": "NUM", "sheesh": "INTJ", "caveat": "NOUN", "putting": "VERB", "face": "NOUN", "aelius": "PROPN", "354": "NUM", "resolving": "VERB", "101": "NUM", "compromising": "VERB", "scheffer": "PROPN", "re-secured": "VERB", "persuasive": "ADJ", "1746": "NUM", "administrator": "NOUN", "spartan": "ADJ", "draining": "VERB", "crises": "NOUN", "spurned": "VERB", "osama": "PROPN", "#argument": "PROPN", "1593": "NUM", "77": "NUM", "10:07": "NUM", "about": "ADP", "0590854959": "NUM", "horror": "NOUN", "mmmm": "INTJ", "comes": "VERB", "theocratic": "ADJ", "deem": "VERB", "taxis": "NOUN", "blvd": "PROPN", "physios": "NOUN", "hamburg": "PROPN", "mimed": "VERB", "targets": "NOUN", "overawing": "ADJ", "catarin": "PROPN", "olivia": "PROPN", "blacksmithing": "NOUN", "dialague": "NOUN", "arsenic": "NOUN", "markup": "NOUN", "tuna": "NOUN", "fitted": "ADJ", "germ": "NOUN", "permit": "VERB", "dumbledore": "PROPN", "haug": "PROPN", "festoons": "NOUN", "f*ck": "NOUN", "bumrungard": "PROPN", "83": "NUM", "boasting": "VERB", "visacuba": "PROPN", "expensive": "ADJ", "mormons": "PROPN", "shakespearean": "ADJ", "0400": "NUM", "steffes": "PROPN", "hood": "NOUN", "lengthy": "ADJ", "bearers": "NOUN", "reconvene": "VERB", "inversion": "NOUN", "yiu-chung": "PROPN", "armada": "PROPN", "operas": "NOUN", "1791": "NUM", "herpes": "NOUN", "expostulation": "NOUN", "watery": "ADJ", "permutations": "NOUN", "inevitably": "ADV", "chu": "PROPN", "bazaar": "NOUN", "scheduler": "NOUN", "enormously": "ADV", "roar": "NOUN", "googlenut": "PROPN", "twisted": "VERB", "lithos": "NOUN", "4632": "NUM", "traightening": "VERB", "salmon-pink": "ADJ", "saved": "VERB", "pedestrian": "NOUN", "categorizing": "VERB", "enduring": "VERB", "haishen": "PROPN", "nearby": "ADV", "spying": "NOUN", "flowered": "ADJ", "du": "PROPN", "overtook": "VERB", "cope": "VERB", "linens": "NOUN", "msa": "PROPN", "vercellotti": "PROPN", "soundtrack": "NOUN", "odihr": "PROPN", "wheat": "NOUN", "1891": "NUM", "defeating": "VERB", "subway": "NOUN", "desisted": "ADJ", "petersburg": "PROPN", "unsteady": "ADJ", "clans": "NOUN", "stunt": "NOUN", "http://www.adventurehobbycraft.com/products/hobby_craft_supplies.html#metal": "PROPN", "http://washington.hyatt.com/wasgh/index.html": "PROPN", "straightforward": "ADJ", "4861": "NUM", "thuma": "PROPN", "southeast": "PROPN", "guest": "NOUN", "fung": "PROPN", "whoooooo": "PRON", "qualitative": "ADJ", "domestic": "ADJ", "dog": "NOUN", "mid-september": "PROPN", "axel": "PROPN", "russia": "PROPN", "utterance": "NOUN", "tanya": "PROPN", "ready": "ADJ", "wiggle": "NOUN", "mollifying": "VERB", "hirier": "VERB", "councillor": "NOUN", "points": "NOUN", "historical": "ADJ", "glyphs": "NOUN", "rove": "PROPN", "3-1663": "NUM", "consists": "VERB", "200,987.33": "NUM", "skincare": "NOUN", "examine": "VERB", "arise": "VERB", "dentist": "NOUN", "acclaimed": "ADJ", "doorstep": "NOUN", "listing": "PROPN", "boyfriend": "NOUN", "coincided": "VERB", "mclean": "PROPN", "malfunctioned": "VERB", "s&s": "NOUN", "ventilator": "NOUN", "hickies": "NOUN", "videoconference": "NOUN", "protects": "VERB", "engaged": "VERB", "scenes": "NOUN", "doubts": "NOUN", "anyway": "ADV", "pastries": "NOUN", "y-": "INTJ", "kazan": "PROPN", "slightly": "ADV", "viognier": "PROPN", "prescott": "PROPN", "podcasters": "NOUN", "magnification": "NOUN", "gibbs": "PROPN", "novella": "NOUN", "jolfa": "PROPN", "bing": "PROPN", "abstractedly": "ADV", "water-melon": "NOUN", "marketed": "VERB", "dismembered": "VERB", "x33098": "NOUN", "strait": "PROPN", "cooled": "VERB", "babylon": "PROPN", "denominator": "NOUN", "setup": "NOUN", "colonies": "NOUN", "11/22/2000": "NUM", "forest": "NOUN", "tonight": "NOUN", "puc": "NOUN", "corn": "NOUN", "muscular": "ADJ", "notch": "NOUN", "wounding": "VERB", "county": "PROPN", "tying": "VERB", "certainty": "NOUN", "equation": "NOUN", "conforms": "VERB", "tanker": "NOUN", "prickly": "ADJ", "got": "VERB", "greenfield": "PROPN", "kerry": "PROPN", "blvd.": "PROPN", "intend": "VERB", "24.8": "NUM", "hers": "PRON", "locking": "VERB", "451": "NUM", "i-nick": "PROPN", "respectfully": "ADV", "inferiority": "NOUN", "sky": "NOUN", "partying": "VERB", "shrinking": "ADJ", "???????????????": "PUNCT", "rave": "NOUN", "grindstone": "NOUN", "advocate": "NOUN", "ld2d-#69336-1.xls": "NOUN", "crushed": "VERB", "2004": "NUM", "sculptures": "NOUN", "personnel": "NOUN", "d:": "SYM", "cis": "PROPN", "sweeper": "NOUN", "day": "NOUN", "necessities": "NOUN", "californians": "PROPN", "jiuquan": "PROPN", "mid-cities": "NOUN", "war-paint": "ADJ", "bremmer": "PROPN", "hasidim": "NOUN", "lensey": "PROPN", "cm": "NOUN", "trespass": "NOUN", "slip": "VERB", "securities": "PROPN", "cufflinks": "NOUN", "pint": "NOUN", "qfs": "NOUN", "westchester": "PROPN", "coincidental": "ADJ", "sinks": "NOUN", "don": "PROPN", "overplayed": "VERB", "replies": "NOUN", "ripping": "VERB", "rom": "NOUN", "overlap": "NOUN", "organizers": "NOUN", "damasus": "PROPN", "suspected": "VERB", "aisle": "NOUN", "ulster": "PROPN", "ouster": "NOUN", "peasants": "NOUN", "arabia": "PROPN", "taunting": "VERB", "martinis": "PROPN", "taom": "PROPN", "epithet": "NOUN", "outbid": "VERB", "jigsaw": "NOUN", "ard": "PROPN", "counterattacked": "VERB", "salons": "NOUN", "valid": "ADJ", "resurrection": "NOUN", "01:02": "NUM", "chute": "NOUN", "seemed": "VERB", "running": "VERB", "appendix": "NOUN", "genius": "NOUN", "voldemort": "PROPN", "conveniently": "ADV", "achieving": "VERB", "sailed": "VERB", "tha": "DET", "premise": "NOUN", "bradley": "PROPN", "peg": "VERB", "crockett": "PROPN", "gaza": "PROPN", "belive": "VERB", "jogs": "VERB", "1962": "NUM", "volaris": "PROPN", "openness": "NOUN", "dancers": "NOUN", "manoel": "PROPN", "kitchens": "NOUN", "bramen": "PROPN", "grapes": "NOUN", "add": "VERB", "isdas": "PROPN", "rejuvenating": "ADJ", "veterinarian": "NOUN", "g.": "PROPN", "legato": "ADJ", "endow": "VERB", "pissed": "VERB", "sweared": "VERB", "regarding": "VERB", "markers": "NOUN", "medieval": "ADJ", "avoidance": "NOUN", "sketch": "NOUN", "smells": "VERB", "consolidation": "NOUN", "12:36": "NUM", "signified": "VERB", "detail": "NOUN", "neurological": "ADJ", "ubs": "NOUN", "wooded": "ADJ", "imam": "PROPN", "constructions": "PROPN", "becky": "PROPN", "declining": "VERB", "riddle": "NOUN", "football": "NOUN", "oxley": "PROPN", "11:42": "NUM", "grandure": "NOUN", "stress": "NOUN", "titled": "VERB", "rina": "PROPN", "feeding": "VERB", "dagger": "PROPN", "03/09/2000": "NUM", "thought": "VERB", "contempt": "VERB", "pt": "NOUN", "mound": "NOUN", "1780": "NUM", "evalu-": "VERB", "inherited": "VERB", "valueless": "ADJ", "militants": "NOUN", "delicous": "ADJ", "missiles": "NOUN", "birthdays": "NOUN", "observed": "VERB", "gingerbread": "NOUN", "transports": "VERB", "haas": "PROPN", "abandon": "VERB", "contemplates": "VERB", "evade": "VERB", "nylon": "NOUN", "appreciable": "ADJ", "pushy": "ADJ", "basketball": "NOUN", "2102": "NUM", "honor": "NOUN", "introduction": "NOUN", "keyword": "NOUN", "dilly": "VERB", "symbolized": "VERB", "projecting": "VERB", "jeremiah": "PROPN", "ev": "PRON", "percentage": "NOUN", "dorothy": "PROPN", "squish": "NOUN", "platt": "PROPN", "camp": "NOUN", "fadel": "PROPN", "fray": "NOUN", "refold": "VERB", "unlike": "ADP", "terminate": "VERB", "last": "ADJ", "non-nylon": "NOUN", "retriever": "NOUN", "parthenon": "PROPN", "plucker": "PROPN", "forwards": "ADV", "kaplan@iepa.com": "PROPN", "messiah": "PROPN", "sprague": "PROPN", "motivation": "NOUN", "genesis": "PROPN", "potash": "NOUN", "seafood": "NOUN", "crystallizes": "VERB", "t'": "PART", "fort": "PROPN", "attributing": "VERB", "rosa": "PROPN", "-s": "PART", "andy": "PROPN", "p.a.": "PROPN", "cupcakes": "NOUN", "eminent": "ADJ", "solomon": "PROPN", "survived": "VERB", "roof": "NOUN", "1611": "NUM", "grilles": "NOUN", "whiteboard": "NOUN", "ladies": "NOUN", "generators": "NOUN", "daughter": "NOUN", "wong": "PROPN", "ga": "PROPN", "buyers": "NOUN", "1721": "NUM", "cards": "NOUN", "cruel": "ADJ", "scripted": "VERB", "federal": "ADJ", "radiators": "NOUN", "enter": "VERB", "ramshackle": "ADJ", "genuine": "ADJ", "tm": "NOUN", "distributor": "NOUN", "bladder": "NOUN", "sexual": "ADJ", "staples": "NOUN", "bragging": "VERB", "redeploying": "VERB", "aggression": "NOUN", "compares": "VERB", "aid": "NOUN", "buffer": "VERB", "scotsman": "PROPN", "office": "NOUN", "gimp": "PROPN", "stormtroopers": "NOUN", "traveller": "PROPN", "artist": "NOUN", "politely": "ADV", "oppressed": "VERB", "title": "NOUN", "aztec": "PROPN", "minuscule": "ADJ", "polishing": "VERB", "ghetto": "NOUN", "flock": "NOUN", "refer": "VERB", "unpopular": "ADJ", "jurisdictions": "NOUN", "tasting": "NOUN", "rob": "PROPN", "alfa": "PROPN", "marcus": "PROPN", "threaten": "VERB", "now": "ADV", "campus": "NOUN", "dissipation": "NOUN", "destination": "NOUN", "compounding": "VERB", "stair": "NOUN", "spill": "VERB", "trent": "PROPN", "dorsey": "PROPN", "boston": "PROPN", "forge": "PROPN", "detection": "NOUN", "tamils": "PROPN", "homosexual": "ADJ", "fingerprints": "NOUN", "moll": "NOUN", "hellada": "PROPN", "sadr": "PROPN", "bludger": "NOUN", "zaman": "PROPN", "frothing": "VERB", "magician": "NOUN", "comforts": "NOUN", "tips": "NOUN", "multitude": "NOUN", "lv.": "VERB", "curiously": "ADV", "acted": "VERB", "stojic": "PROPN", "frolicking": "VERB", "sees": "VERB", "suppliers": "NOUN", "waits": "VERB", "mcmanus": "PROPN", "ha": "INTJ", "placing": "VERB", "shinning": "VERB", "preserves": "VERB", "nephew": "NOUN", "bray": "PROPN", "horrors": "NOUN", "editorial": "ADJ", "realtion": "NOUN", "dead": "ADJ", "clydesdales": "PROPN", "em-enro2.doc": "NOUN", "movement": "NOUN", "transformed": "VERB", "gel": "NOUN", "coarsely": "ADV", "male": "NOUN", "http://www.guardian.co.uk/obituaries/story/0,3604,1371372,00.html": "PROPN", "banned": "VERB", "accord": "NOUN", "columbine": "PROPN", "audit": "NOUN", "brighton": "PROPN", "4.7": "NUM", "inhabited": "VERB", "weekend": "NOUN", "lindsay": "PROPN", "locked": "VERB", "mostly": "ADV", "primetime": "PROPN", "charleston": "PROPN", "deliver": "VERB", "unsettling": "ADJ", "adpl": "PROPN", "encircled": "VERB", "unnecessarily": "ADV", "bradford": "PROPN", "operates": "VERB", "detentions": "NOUN", "regalia": "NOUN", "poses": "NOUN", "fce": "PROPN", "tug": "NOUN", "runflat": "NOUN", "requiring": "VERB", "exquisitely": "ADV", "cancelled": "VERB", "lemonade": "NOUN", "panera": "PROPN", "synopsis": "PROPN", "bargain": "VERB", "rapids": "NOUN", "sequel": "NOUN", "grapples": "VERB", "nano": "NOUN", "freeways": "NOUN", "lines": "NOUN", "manogue": "PROPN", "chilling": "VERB", "rcommended": "VERB", "olive": "NOUN", "souvlaki": "NOUN", "irritated": "VERB", "chase": "NOUN", "basters": "NOUN", "flogging": "VERB", "unorganized": "ADJ", "sympathy": "NOUN", "polarization": "NOUN", "boss": "NOUN", "rated": "VERB", "cayman": "PROPN", "specialty": "NOUN", "torn": "ADJ", "harming": "VERB", "stained": "VERB", "combinations": "NOUN", "mcallister": "PROPN", "blinks": "VERB", "derailing": "NOUN", "loathing": "NOUN", "fearless": "ADJ", "bleeding": "VERB", "ninevah": "PROPN", "novelists": "NOUN", "rhee": "PROPN", "sez": "VERB", "blames": "VERB", "deliberately": "ADV", "sustains": "VERB", "ice": "NOUN", "nasim": "PROPN", "nx3": "NOUN", "repainted": "VERB", "whomever": "PRON", "terminated": "VERB", "hazy": "ADJ", "consistantly": "ADV", "banquet": "NOUN", "joke": "NOUN", "learner": "NOUN", "waterway": "NOUN", "subpar": "ADJ", "mouth": "NOUN", "24": "NUM", "breed": "NOUN", "specks": "NOUN", "biochemical": "ADJ", "participate": "VERB", "failing": "VERB", "prerogative": "NOUN", "understaffing": "NOUN", "marketplaces": "NOUN", "peppery": "ADJ", "appellation": "NOUN", "rebuilt": "VERB", "northeast": "PROPN", "flash": "NOUN", "idiomaticity": "PROPN", "embarrassing": "ADJ", "adventures": "NOUN", "reflector": "NOUN", "blackmail": "NOUN", "prussia": "PROPN", "beaters": "NOUN", "makos": "PROPN", "monastic": "ADJ", "offered": "VERB", "isaac": "PROPN", "http://www.goldentriangleindia.com/delhi/hotels-in-delhi.html": "PROPN", "dawson": "PROPN", "interests": "NOUN", "sequences": "NOUN", "indentured": "VERB", "cacao": "NOUN", "misalette": "PROPN", "rrly": "ADV", "mount": "PROPN", "forensic": "PROPN", "eggnog": "NOUN", "endure": "VERB", "ames": "PROPN", "always": "ADV", "lawman": "NOUN", "dadaniela@gmail.com": "PROPN", "emission": "NOUN", "tout": "NOUN", "unhappiness": "NOUN", "ali": "PROPN", "charming": "ADJ", "border": "NOUN", "substitutes": "NOUN", "giving": "VERB", "terry": "PROPN", "characterize": "VERB", "germany": "PROPN", "questioning": "VERB", "affect": "VERB", "lust": "NOUN", "hafijj": "PROPN", "ended": "VERB", "terraces": "NOUN", "clings": "VERB", "carbonyl": "NOUN", "len": "PROPN", "chrysler": "PROPN", "triple": "ADJ", "refrigerate": "VERB", "renal": "ADJ", "bill": "NOUN", "sleeveless": "ADJ", "baksheesh": "NOUN", "doorknob": "NOUN", "neptune": "PROPN", "1.800.233.1234": "NUM", "alekseyevna": "PROPN", "toying": "VERB", "extremist": "NOUN", "altering": "VERB", "stephenville": "PROPN", "northbound": "ADJ", "entreat": "VERB", "picket": "VERB", "eau": "PROPN", "11:30": "NUM", "contested": "VERB", "tori": "PROPN", "esimien@nisource.com": "PROPN", "device": "NOUN", "checks": "NOUN", "chunked": "VERB", "palk": "PROPN", "emigration": "NOUN", "alaskan": "ADJ", "bidding": "VERB", "auditorium": "PROPN", "collaboration": "NOUN", "preserved": "VERB", "microscopically": "ADV", "browns": "PROPN", "accouterments": "NOUN", "ideologized": "ADJ", "shenzhou": "PROPN", "popularize": "VERB", "flag-pole": "NOUN", "assuage": "VERB", "hobbit": "PROPN", "result": "NOUN", "lau": "PROPN", "dprk": "PROPN", "reps": "NOUN", "emily": "PROPN", "jammu": "PROPN", "3rd": "ADJ", "environment": "NOUN", "id": "NOUN", "glaze": "NOUN", "bombed": "VERB", "westphal": "PROPN", "dusk": "NOUN", "dwibbling": "VERB", "co-founder": "NOUN", "240,000": "NUM", "'d": "AUX", "hop": "VERB", "standard": "ADJ", "nurses": "NOUN", "times": "NOUN", "retrofitting": "VERB", "surprising": "ADJ", "opals": "NOUN", "sundry": "ADJ", "klingberg": "PROPN", "attorneys": "NOUN", "warming": "NOUN", "tempted": "VERB", "chimes": "PROPN", "sherrar": "PROPN", "prayerfully": "ADV", "wicked": "ADJ", "kai": "PROPN", "danger": "NOUN", "sell": "VERB", "aloe": "NOUN", "knitters": "NOUN", "stillmans": "PROPN", "forkfuls": "NOUN", "ouija": "PROPN", "sap": "NOUN", "interrupting": "VERB", "brass": "NOUN", "methodically": "ADV", "superlative": "ADJ", "richards": "PROPN", "gradually": "ADV", "clues": "NOUN", "complicit": "ADJ", "coiled": "ADJ", "lettuce": "NOUN", "leaf": "NOUN", "stuffed": "ADJ", "herd": "NOUN", "subdomains": "NOUN", "shop-window": "NOUN", "interaction": "NOUN", "kent": "PROPN", "looking": "VERB", "ottley": "PROPN", "midterm": "NOUN", "danly": "PROPN", "unemployent": "NOUN", "glittering": "VERB", "dough": "NOUN", "fed": "VERB", "tca": "NOUN", "open": "ADJ", "potatoes": "NOUN", "point": "NOUN", "spirito": "PROPN", "through": "ADP", "liability": "NOUN", "orderly": "ADJ", "objectless": "ADJ", "trademarking": "NOUN", "drying": "NOUN", "malevich": "PROPN", "vacation": "NOUN", "aspiration": "NOUN", "untalented": "ADJ", "holistic": "ADJ", "scenery": "NOUN", "2051": "NUM", "iroq": "PROPN", "beirut": "PROPN", "declivity": "NOUN", "-%": "NOUN", "dʒəˈroʊm": "PROPN", "laurie.ellis@enron.com": "PROPN", "nedre": "PROPN", "ridiculous": "ADJ", "phonology": "NOUN", "reject": "VERB", "astonished": "ADJ", "organisation": "NOUN", "wentz": "PROPN", "sushi": "NOUN", "lame": "ADJ", "haden": "PROPN", "debts": "NOUN", "decent": "ADJ", "smosh": "PROPN", "geno": "PROPN", "kamala": "PROPN", "schoolrooms": "NOUN", "thy": "PRON", "expiration": "NOUN", "impolite": "ADJ", "dutton": "PROPN", "chittagong": "PROPN", "blunder": "NOUN", "handicap": "NOUN", "decrease": "NOUN", "detached": "VERB", "suicide": "NOUN", "transferability": "NOUN", "cardenas": "PROPN", "clubhouse": "NOUN", "complements": "VERB", "nests": "NOUN", "mutual": "ADJ", "irony": "NOUN", "janet": "PROPN", "perimeter": "NOUN", "pays": "VERB", "propping": "VERB", "guarentee": "NOUN", "regulated": "VERB", "co$t": "VERB", "pals": "NOUN", "multi-national": "ADJ", "hierarchical": "ADJ", "reduced": "VERB", "thurber": "PROPN", "yheggy": "PROPN", "staring": "VERB", "lethal": "ADJ", ".348": "NUM", "dumb": "ADJ", "tolerate": "VERB", "at": "ADP", "ants": "NOUN", "necks": "NOUN", "history": "NOUN", "wats": "NOUN", "motto": "NOUN", "tin": "NOUN", "blinds": "NOUN", "flowed": "VERB", "scaling": "NOUN", "1968": "NUM", "pub": "NOUN", "eh": "INTJ", "relatedly": "ADV", "cca-15": "PROPN", "deity": "NOUN", "1.024": "NUM", "goodwill": "PROPN", "recount": "NOUN", "orissa": "PROPN", "enhancements": "NOUN", "trios": "NOUN", "jumps": "VERB", "abuses": "NOUN", "bottles": "NOUN", "poetically": "ADV", "due": "ADJ", "unnamed": "ADJ", "borders": "NOUN", "39938": "NUM", "samuel": "PROPN", "gnaw": "VERB", "w-": "INTJ", "fluted": "ADJ", "16:29": "NUM", "tobacco": "NOUN", "moda": "PROPN", "mercury": "NOUN", "marvels": "NOUN", "gibson": "PROPN", "workshops": "NOUN", "trackless": "ADJ", "damn": "ADV", "unimpeded": "ADJ", "fury": "NOUN", "burke": "PROPN", "analytique": "PROPN", "bowel": "NOUN", "rapacious": "ADJ", "language": "NOUN", "livorno": "PROPN", "disorders": "NOUN", "attackers": "NOUN", "deliteful": "ADJ", "taut": "ADJ", "conservatoire": "PROPN", "havelock": "PROPN", "broaden": "VERB", "hds": "PROPN", "toronto": "PROPN", "maroni": "PROPN", "romantic": "ADJ", "swallow": "VERB", "occasioned": "VERB", "worht": "ADJ", "compassion": "NOUN", "leainne": "PROPN", "steichen": "PROPN", "streaks": "NOUN", "quartile": "NOUN", "knickers": "NOUN", "twenty-four": "NUM", "merits": "NOUN", "moderator": "NOUN", "knowledgable": "ADJ", "brilliance": "NOUN", "impulse": "NOUN", "cliff": "NOUN", "partnerships": "NOUN", "trousers": "NOUN", "tickets": "NOUN", "mlb": "PROPN", "wonderland": "NOUN", "158,000": "NUM", "1940": "NUM", "bending": "VERB", "migrains": "NOUN", "constitute": "VERB", "06:00:56": "NUM", "inscribed": "VERB", "turbine": "NOUN", "heidenreich": "PROPN", "instant": "ADJ", "cfc": "NOUN", "electrical": "ADJ", "muscovy": "PROPN", "islamophobia": "NOUN", "minchah": "PROPN", "ingested": "VERB", "actor": "NOUN", "bavelier": "PROPN", "oslo": "PROPN", "deploy": "VERB", "keen": "ADJ", "ja": "PROPN", "bathed": "VERB", "ominously": "ADV", "waggled": "VERB", "ansi": "PROPN", "160.00": "NUM", "kpa": "PROPN", "translating": "VERB", ".........": "PUNCT", "best": "ADJ", "lying": "VERB", "03:11": "NUM", "http://www-formal.stanford.edu/jmc/progress/chernobyl.html": "PROPN", "chilly": "ADJ", "katie": "PROPN", "voltage": "PROPN", "misconception": "NOUN", "61": "NUM", "glen": "PROPN", "crossings": "NOUN", "greece": "PROPN", "roll": "NOUN", "abd": "PROPN", "religiously": "ADV", "informed": "VERB", "spirits": "NOUN", "oval": "ADJ", "1504": "NUM", "weakening": "VERB", "recreation": "NOUN", "epic": "ADJ", "memorized": "VERB", "matte": "ADJ", "inexperienced": "ADJ", "overcoat": "NOUN", "4434": "NUM", "emercom": "PROPN", "chelsea": "PROPN", "loans": "NOUN", "pagodas": "NOUN", "colombo": "PROPN", "yacks": "VERB", "xsd": "PROPN", "odds": "NOUN", "anastacio": "PROPN", "1,8": "NUM", "fishing": "NOUN", "gown": "NOUN", "conferences": "NOUN", "roomers": "NOUN", "regimes": "NOUN", "begs": "VERB", "refused": "VERB", "alt.religion.scientology": "NOUN", "vacuous": "ADJ", "hemispheres": "NOUN", "naturalis": "PROPN", "charity": "NOUN", "projected": "VERB", "garden": "NOUN", "shatter": "VERB", "104": "NUM", "leahy": "PROPN", "undergraduate": "ADJ", "battlefield": "NOUN", "polaroids": "NOUN", "ascent": "NOUN", "ucas": "PROPN", "acidic": "ADJ", "woody": "PROPN", "reassured": "VERB", "i": "PRON", "kilinochchi": "PROPN", "chatted": "VERB", "disentangle": "VERB", "1002`s": "NOUN", "allocation": "NOUN", "dabbling": "VERB", "merger": "NOUN", "1.8": "NUM", "civic": "ADJ", "expunging": "VERB", "suppressed": "VERB", "relaxes": "VERB", "bozos": "NOUN", "quest": "NOUN", "theater": "NOUN", "introduce": "VERB", "captains": "NOUN", "04/28/2000": "NUM", "epi": "PROPN", "mormon": "ADJ", "---------------------------------------------------------------------": "PUNCT", "lifestyles": "NOUN", "robots": "NOUN", "div.": "VERB", "vests": "NOUN", "trying": "VERB", "jermeier@earthlink.net": "PROPN", "brakes": "NOUN", "platform": "NOUN", "512": "NUM", "reffered": "VERB", "outlined": "VERB", "cutter": "NOUN", "whiff": "NOUN", "bomb": "NOUN", "nonprofit": "ADJ", "approved": "VERB", "buster": "NOUN", "buddha": "PROPN", "cyprian": "PROPN", "artistic": "ADJ", "floyd": "PROPN", "receipts": "NOUN", "tissues": "NOUN", "oregon": "PROPN", "reworded": "VERB", "yourselves": "PRON", "force": "NOUN", "insured": "VERB", "disorientation": "NOUN", "linna": "PROPN", "common": "ADJ", "aztecs": "PROPN", "15071": "NUM", "folly": "NOUN", "amuse": "NOUN", "ammunition": "NOUN", "same": "ADJ", "categorization": "NOUN", "moreau": "PROPN", "jai": "PROPN", "finals": "NOUN", "conservationists": "NOUN", "four": "NUM", "as": "ADP", "caroline": "PROPN", "tacos": "NOUN", "rangers": "NOUN", "ulterior": "ADJ", "ventures": "NOUN", "specializing": "VERB", "psychologists": "NOUN", "verify": "VERB", "northeastern": "ADJ", "defenders": "NOUN", "grandmother": "NOUN", "birthright": "NOUN", "salinity": "NOUN", "inquires": "NOUN", "guaranties": "NOUN", "steady": "ADJ", "coupons": "NOUN", "blacks": "NOUN", "contours": "NOUN", "industrialist": "NOUN", "author": "NOUN", "towels": "NOUN", "strongest": "ADJ", "borrowed": "VERB", "exceptions": "NOUN", "rachel": "PROPN", "continuous": "ADJ", "jenkins": "PROPN", "roast": "ADJ", "unmatched": "ADJ", "unspoken": "ADJ", "gossipy": "ADJ", "sociology": "NOUN", "scroll": "VERB", "reedy": "ADJ", "predicting": "VERB", "exception": "NOUN", "karma": "NOUN", "cashier": "NOUN", "pretext": "NOUN", "apologetic": "ADJ", "tray": "NOUN", "traditions": "NOUN", "massages": "NOUN", "nidd": "PROPN", "14th": "ADJ", "attendants": "NOUN", "payne": "PROPN", "safer": "ADJ", "bar": "NOUN", "kiwi": "PROPN", "actively": "ADV", "serotonin": "NOUN", "evict": "VERB", "personified": "VERB", "14.2": "NUM", "inappropriate": "ADJ", "wa": "PROPN", "deadbolt": "NOUN", "homogeneous": "ADJ", "preached": "VERB", "frl3@pge.com": "PROPN", "detect": "VERB", "founding": "VERB", "2d": "ADJ", "moriori": "PROPN", "brainwashing": "NOUN", "dislikes": "NOUN", "hijackers": "NOUN", "forced": "VERB", "holden": "PROPN", "analysed": "VERB", "blankets": "NOUN", "delegations": "NOUN", "http://nigeria.usembassy.gov/scams.html": "PROPN", "twines": "NOUN", "every": "DET", "hariri": "PROPN", "half-hesitant": "ADJ", "mvb": "NOUN", "myself": "PRON", "windfall": "NOUN", "quietest": "ADJ", "alter": "VERB", "recipe": "NOUN", "cp": "NOUN", "equations": "NOUN", "struggles": "NOUN", "tarsia": "PROPN", "magazine": "NOUN", "amiable": "ADJ", "proprietors": "NOUN", "allard": "PROPN", "deal": "NOUN", "drool": "VERB", "armenians": "PROPN", "overview": "NOUN", "defaults": "NOUN", "miharris": "PROPN", "dwellers": "NOUN", "costs": "NOUN", "505-625-8031": "NUM", "legacy": "NOUN", "technician": "NOUN", "controversy": "NOUN", "rotorua": "PROPN", "autos": "PROPN", "sidewalks": "NOUN", "distributors": "NOUN", "skittled": "VERB", "musical": "ADJ", "left": "VERB", "garnishes": "NOUN", "besocked": "ADJ", "agra": "PROPN", "firsthand": "ADV", "pre-screened": "VERB", "eighth": "ADV", "lowered": "VERB", "allot": "VERB", "fantasy": "NOUN", "ramp": "VERB", "kittie": "PROPN", "unexercised": "ADJ", "karen": "PROPN", "tiers": "NOUN", "laureate": "NOUN", "fast": "ADJ", "accountabilities": "NOUN", "weighed": "VERB", "capers": "NOUN", "swirl": "VERB", "mideast": "PROPN", "pathways": "NOUN", "summit": "NOUN", "barbara": "PROPN", "clapped": "VERB", "2:00": "NUM", "inconsistency": "NOUN", "unveiled": "VERB", "wikilove": "NOUN", "starroute": "PROPN", "geyser": "NOUN", "infection": "NOUN", "chefs": "NOUN", "benedict": "NOUN", "blount": "PROPN", "smutney": "PROPN", "relies": "VERB", "fault": "NOUN", "laboratory": "PROPN", "congolese": "ADJ", "enamel": "NOUN", "yards": "NOUN", "assassinate": "VERB", "brigade": "NOUN", "commate": "NOUN", "streaming": "VERB", "non-art": "NOUN", "babe": "NOUN", "copyrighted": "VERB", "cigarettes": "NOUN", "tire": "NOUN", "architectural": "ADJ", "gcp_london": "PROPN", "haul": "NOUN", "hôpital": "PROPN", "astronomical": "ADJ", "trumpets": "NOUN", "mayko": "PROPN", "advancements": "NOUN", "imagined": "VERB", "mainstreamed": "ADJ", "petard": "NOUN", "directors": "NOUN", "walls": "NOUN", "libertarian": "ADJ", "board": "NOUN", "flames": "NOUN", "airtight": "ADJ", "styler": "NOUN", "economics": "NOUN", "philosophers": "NOUN", "unilevel": "NOUN", "previous-version": "NOUN", "waitangi": "PROPN", "parachutes": "NOUN", "restaurateur": "NOUN", "ra-ra": "PROPN", "afore": "ADJ", "sentiment": "NOUN", "massacring": "VERB", "988,000": "NUM", "radicals": "NOUN", "unlocked": "ADJ", "kumon": "PROPN", "economical": "ADJ", "ginny": "PROPN", "icu": "NOUN", "non-approved": "ADJ", "broken": "VERB", "intrusted": "VERB", "investigations": "NOUN", "mahault": "PROPN", "hydrogen": "NOUN", "supersonic": "ADJ", "innovative": "ADJ", "emit": "VERB", "gardneri": "NOUN", "arbitrariness": "NOUN", "announces": "VERB", "welles": "PROPN", "mid-1980s": "NOUN", "713-853-3989": "NUM", "reinforcements": "NOUN", "connolly": "PROPN", "partition": "NOUN", "agnostics": "PROPN", "likewise": "ADV", "good-hearted": "ADJ", "dare": "VERB", "certificated": "VERB", "tendency": "NOUN", "oppose": "VERB", "indignity": "NOUN", "twitter": "PROPN", "complement": "VERB", "blended": "VERB", "barriers": "NOUN", "desirer": "NOUN", "bullet": "NOUN", "prayer": "NOUN", "contrary": "NOUN", "concludes": "VERB", "outgrow": "VERB", "poignant": "ADJ", "overflow": "NOUN", "supplier": "NOUN", "whistling": "ADJ", "mustache": "NOUN", "condemnations": "NOUN", "housed": "VERB", "advantage": "NOUN", "creation": "NOUN", "dysphoria": "NOUN", "television": "NOUN", "mitch": "PROPN", "rss": "PROPN", "i'd": "SCONJ", "irs": "PROPN", "respective": "ADJ", "maarten": "PROPN", "silence": "NOUN", "monk": "NOUN", "and": "CCONJ", "nhs": "PROPN", "fridge": "NOUN", "h": "NOUN", "proves": "VERB", "lasting": "ADJ", "therapies": "NOUN", "allier": "PROPN", "promoting": "VERB", "http://www.ebay.co.uk/itm/130589513308?var=430034792128&sspagename=strk:mewax:it&_trksid=p3984.m1438.l2648#ht_1500wt_660": "PROPN", "corridor": "NOUN", "22301": "NUM", "statistically": "ADV", "flora": "NOUN", "fingers": "NOUN", "bergen": "PROPN", "outlandish": "ADJ", "finances": "NOUN", "raymond": "PROPN", "277": "NUM", "successful": "ADJ", "carotid": "NOUN", "thrifty": "ADJ", "viability": "NOUN", "fridays": "PROPN", "917": "NUM", "comprehension": "NOUN", "jealousy": "NOUN", "christianity": "PROPN", "415.782.7822": "NUM", "michelle": "PROPN", "equinox": "NOUN", "listless": "ADJ", "carbonate": "NOUN", "sun": "NOUN", "flood": "NOUN", "leonhard": "PROPN", "fuckwad": "NOUN", "chandeliers": "NOUN", "neighboring": "VERB", "brokered": "VERB", "changpei": "PROPN", "cross-section": "NOUN", "swimming": "VERB", "swg": "PROPN", "courageous": "ADJ", "uncontrolled": "ADJ", "parentheses": "NOUN", "grabbing": "VERB", "dismissing": "VERB", "deacon": "NOUN", "sighs": "VERB", "figure": "PROPN", "feeder": "NOUN", "www.norcalfightingalliance.com": "PROPN", "epa": "PROPN", "toenail": "NOUN", "relearned": "VERB", "billions": "NOUN", "01:09": "NUM", "frightens": "VERB", "repulsive": "ADJ", "l'eau": "PROPN", "non-mediterranean": "ADJ", "float": "VERB", "capote": "PROPN", "dump": "VERB", "skyrocketing": "VERB", "squash": "NOUN", "google": "PROPN", "tonic": "ADJ", "stirring": "VERB", "blotched": "VERB", "shreds": "NOUN", "turismo@merida.gob.mx": "PROPN", "---------------------------------------------------------------------------": "PUNCT", "communalism": "NOUN", "kinder": "PROPN", "vista": "NOUN", "lexical": "ADJ", "airborne": "ADJ", "considered": "VERB", "operate": "VERB", "sorts": "NOUN", "neighbourhoods": "NOUN", "combating": "VERB", "flesh": "NOUN", "awarding": "NOUN", "backcloth": "NOUN", "overthrow": "NOUN", "relay": "VERB", "benzie": "PROPN", "gasps": "VERB", "✉": "SYM", "fucking": "INTJ", "unfortunalty": "ADV", "babies": "NOUN", "spiritual": "ADJ", "lolling": "ADJ", "flap": "NOUN", "reinvestment": "PROPN", "populous": "ADJ", "lesion": "NOUN", "marshmallow": "NOUN", "dime": "NOUN", "monarchs": "PROPN", "duran": "PROPN", "warner": "PROPN", "yannick": "PROPN", "case-sensitive": "ADJ", "chimney": "NOUN", "spectrum": "NOUN", "oily": "ADJ", "bareback": "ADV", "08:50": "NUM", "plunged": "VERB", "definable": "ADJ", "comp.sources.d": "NOUN", "hormones": "NOUN", "baring": "VERB", "innocents": "NOUN", "leave": "VERB", "hoaxes": "NOUN", "plummet": "VERB", "hardest": "ADJ", "fleshing": "VERB", "holocausts": "NOUN", "wyoming": "PROPN", "untamed": "ADJ", "trivial": "ADJ", "prevents": "VERB", "national": "ADJ", "gravesend": "PROPN", "cal": "PROPN", "aversions": "NOUN", "shuttle": "NOUN", "permissible": "ADJ", "horrifying": "ADJ", "yarns": "NOUN", "godiva": "PROPN", "slurped": "VERB", "waitstaff": "NOUN", "shotgun": "NOUN", "phoebe": "NOUN", "victory": "NOUN", "talal": "PROPN", "caves": "NOUN", "hannibal": "PROPN", "spouse(s)": "NOUN", "kathleen": "PROPN", "itemized": "VERB", "programmatically": "ADV", "described": "VERB", "murdering": "NOUN", "deliciously": "ADV", "sprang": "VERB", "grips": "NOUN", "pipelines": "NOUN", "diarheya": "NOUN", "unawares": "ADV", "10.9": "NUM", "06:07": "NUM", "amelia": "PROPN", "constituted": "VERB", "prolific": "ADJ", "oriented": "VERB", "birmingham": "PROPN", "hubristic": "ADJ", "did": "AUX", "wat": "PROPN", "elevators": "NOUN", "wisconsin": "PROPN", "grape": "NOUN", "allowing": "VERB", "sappy": "ADJ", "ailment": "NOUN", "abaut": "ADV", "150": "NUM", "07/14/2000": "NUM", "pannonia": "PROPN", "isi": "PROPN", "vowel": "NOUN", "latitude": "NOUN", "kill": "VERB", ".......": "PUNCT", "endangered": "ADJ", "coin": "NOUN", "owning": "VERB", "biden": "PROPN", "humiliate": "VERB", "perkins": "PROPN", "nava": "PROPN", "rittenhouse": "PROPN", "preston": "PROPN", "lengthens": "VERB", "expressionless": "ADJ", "evidenced": "VERB", "diligence": "NOUN", "unconvincing": "ADJ", "smoking": "NOUN", "schtick": "NOUN", ":o": "SYM", "fathom": "VERB", "wordy": "ADJ", "titles": "NOUN", "offensive": "ADJ", "hippy": "NOUN", "theatre": "NOUN", "sophronius": "PROPN", "abide": "VERB", "dressing-case": "NOUN", "alain": "PROPN", "setback": "NOUN", "funneled": "VERB", "seemingly": "ADV", "sensitivity": "NOUN", "module": "NOUN", "tejanos": "PROPN", "supervised": "VERB", "invitations": "NOUN", "dunn": "PROPN", "lighter": "ADJ", "buckaroo": "NOUN", "virtuoso": "ADJ", "teaching": "NOUN", "a&e": "PROPN", "sox": "PROPN", "out-house": "NOUN", "broek": "PROPN", "neckless": "ADJ", "15th": "NOUN", "rolls": "NOUN", "kicked": "VERB", "tea": "NOUN", "unfair": "ADJ", "discharged": "VERB", "culinary": "ADJ", "kane": "PROPN", "conditionting": "NOUN", "friedman": "PROPN", "reneging": "VERB", "foolhardy": "ADJ", "cavies": "NOUN", "depression": "NOUN", "sciencem...@upi.com": "PROPN", "-ll": "AUX", "ndi": "PROPN", "eccentricity": "NOUN", "mkm": "PROPN", "embarrassed": "ADJ", "dynamite": "NOUN", "sr.": "ADJ", "feel": "VERB", "upwards": "ADV", "1655": "NUM", "hardness": "NOUN", "mentality": "NOUN", "libraries": "NOUN", "loves": "VERB", "faltering": "VERB", "motorized": "VERB", "bull": "NOUN", "persistently": "ADV", "khomeini": "PROPN", "nacogdoches": "PROPN", "sick": "ADJ", "øhavet": "PROPN", "peril": "NOUN", "entree": "NOUN", "determination": "NOUN", "vicsandra": "PROPN", "europeans": "NOUN", "to-": "INTJ", "jam": "NOUN", "nathaniel": "PROPN", "probing": "ADJ", "valuable": "ADJ", "blackworms": "NOUN", "11:25": "NUM", "imo": "ADV", "choate": "PROPN", "autism": "NOUN", "hips": "NOUN", "pour": "VERB", "behold": "INTJ", "english": "PROPN", "gist": "NOUN", "abstinence": "NOUN", "christchurch": "PROPN", "debbie": "PROPN", "gelatos": "PROPN", "touristic": "ADJ", "estates": "NOUN", "brainer": "NOUN", "denomination": "NOUN", "baathists": "PROPN", "notte": "PROPN", "petitions": "NOUN", "daily": "ADJ", "journal": "NOUN", "adorn": "PROPN", "slabs": "NOUN", "swiss": "ADJ", "wu": "PROPN", "sooners": "PROPN", "twister": "NOUN", "make": "VERB", "thelema": "PROPN", "perspectives": "NOUN", "quartiles": "NOUN", "excited": "ADJ", "ka-ki": "PROPN", "labyrinth": "NOUN", "mystery": "NOUN", "raphael": "PROPN", "christ": "PROPN", "(country|region)": "NOUN", "ivy": "NOUN", "bdr": "NOUN", "wodges": "NOUN", "bounded": "VERB", "barbers": "NOUN", "irr": "SYM", "monitored": "VERB", "jade": "NOUN", "troupe": "NOUN", "spaceflight": "NOUN", "onsi": "PROPN", "altar": "NOUN", "depth": "NOUN", "88": "NUM", "recourse": "NOUN", "http://www.nea.fr/html/rp/chernobyl/conclusions5.html": "PROPN", "upload": "VERB", "sciences": "PROPN", "randomly": "ADV", "unhappily": "ADV", "creative": "ADJ", "nepco": "PROPN", "censored": "VERB", "pin": "NOUN", "hydrated": "ADJ", "advise": "VERB", "hellish": "ADJ", "umoregi": "PROPN", "convince": "VERB", "omission": "NOUN", "handles": "VERB", "rapporteur": "NOUN", "guz": "VERB", "characteristics": "NOUN", "rusting": "VERB", "amendment": "NOUN", "legislation": "NOUN", "twists": "NOUN", "global": "ADJ", "eligibility": "NOUN", "breeze": "NOUN", "bohai": "PROPN", "nc": "PROPN", "vincent": "PROPN", "impatient": "ADJ", "hermann": "PROPN", "fabiani": "PROPN", "graceful": "ADJ", "abandoning": "VERB", "escaping": "VERB", "conservatives": "NOUN", "prodded": "VERB", "félicie": "PROPN", "opener": "NOUN", "indicates": "VERB", "shapiro": "PROPN", "abourezk": "PROPN", "airways": "PROPN", "snbehnke": "PROPN", "chalcis": "PROPN", "pre-owned": "ADJ", "distributed": "VERB", "deviating": "VERB", "1978": "NUM", "ranging": "VERB", "capacity": "NOUN", "dismisses": "VERB", "directories": "NOUN", "ifa": "PROPN", "exfoliating": "VERB", "jamie": "PROPN", "btw": "ADV", "brats": "NOUN", "sweets": "NOUN", "shorts": "NOUN", "nursery": "NOUN", "perhaps": "ADV", "mingling": "NOUN", "www.juancole.com": "PROPN", "functionally": "ADV", "units": "NOUN", "buds": "NOUN", "curtis": "PROPN", "cyprus": "PROPN", "hawaiian": "PROPN", "societies": "NOUN", "worshiped": "VERB", "adams": "PROPN", "tired": "ADJ", "laying": "VERB", "ninety": "NUM", "declared": "VERB", "jessen": "PROPN", "smuggled": "VERB", "ensemble": "NOUN", "excellant": "ADJ", "sword": "NOUN", "screwed": "VERB", "bockius": "PROPN", "hwy": "PROPN", "450": "NUM", "altogether": "ADV", "2019": "NUM", "15,000": "NUM", "anchorage": "NOUN", "1926": "NUM", "374": "NUM", "ceases": "VERB", "normale": "PROPN", "officer": "NOUN", "regret": "VERB", "useability": "NOUN", "voting": "NOUN", "remains": "VERB", "educating": "VERB", "wednesday's": "PROPN", "hypnotizing": "VERB", "http://www.equinecaninefeline.com/catalog/mamble-hamster-narrow-100cm-cage-p-12642.html": "PROPN", "entourage": "NOUN", "60622": "NUM", "radius": "NOUN", "ball": "NOUN", "merrist": "PROPN", "critics": "NOUN", "accessories": "NOUN", "facial": "ADJ", "protesting": "VERB", "meals": "NOUN", "bogus": "ADJ", "successive": "ADJ", "actions": "NOUN", "guthe": "PROPN", "unwieldy": "ADJ", "(": "PUNCT", "utterances": "NOUN", "guardsmen": "NOUN", "driftwood": "NOUN", "im": "NOUN", "transitional": "ADJ", "1922": "NUM", "superficial": "ADJ", "http://www.calguard.ca.gov/ia/chernobyl-15%20years.htm": "PROPN", "lakes": "PROPN", "ld2d-#69366-1.doc": "NOUN", "exploring": "VERB", "authorization": "NOUN", "dando": "PROPN", "flaring": "VERB", "u": "PRON", "tenpound": "NOUN", "vinita": "PROPN", "metroplex": "NOUN", "excursions": "NOUN", "procrastinator": "NOUN", "operatives": "NOUN", "liquid": "NOUN", "apartment": "NOUN", "pairing": "VERB", "sourcing": "NOUN", "schwa": "PROPN", "pencils": "NOUN", "nang": "PROPN", "horse-faced": "ADJ", "fans": "NOUN", "x36709": "NOUN", "ratchet": "VERB", "haze": "NOUN", "simons": "PROPN", "younger": "ADJ", "gigaloader": "PROPN", "wiped": "VERB", "620-294-3000": "NUM", "calvary": "PROPN", "azzaman": "PROPN", "maize": "NOUN", "uniformity": "NOUN", "disclosure": "NOUN", "pedicure": "NOUN", "cay": "PROPN", "citic": "PROPN", "35": "NUM", "observations": "NOUN", "tarred": "VERB", "mournful": "ADJ", "elected": "VERB", "potty": "NOUN", "co-op": "NOUN", "masquerade": "NOUN", "farce": "NOUN", "focal": "ADJ", "225-5185": "NUM", "oct.": "PROPN", "explorers": "NOUN", "978-376-9004": "NUM", "realists": "NOUN", "deterring": "VERB", "juan": "PROPN", "pro-same": "ADJ", "rubble": "NOUN", "isfahan": "PROPN", "fischler": "PROPN", "approach": "NOUN", "ares": "PROPN", "assembly": "PROPN", "gleaned": "VERB", "cooking": "VERB", "finding": "VERB", "ravenna": "PROPN", "noori": "PROPN", "conf": "NOUN", "advantaged": "ADJ", "kidney": "NOUN", "collection": "NOUN", "singer": "NOUN", "dubai": "PROPN", "armour": "NOUN", "divides": "VERB", "dashboard": "NOUN", "sept": "PROPN", "vitality": "NOUN", "alma": "NOUN", "from": "ADP", "shaggy": "ADJ", "undo": "VERB", "jasmine": "PROPN", "sniffed": "VERB", "order": "NOUN", "muhammad": "PROPN", "vulgate": "PROPN", "algarve": "PROPN", "111": "NUM", "hovers": "VERB", "hairy": "ADJ", "chennai": "PROPN", "bud": "PROPN", "slices": "NOUN", "fails": "VERB", "hesitate": "VERB", "estimate": "VERB", "spelling": "NOUN", "dangling": "VERB", "commercially": "ADV", "milking": "VERB", "deleterious": "ADJ", "esp.": "ADV", "forbidden": "VERB", "hundred": "NUM", "numerous": "ADJ", "plotters": "NOUN", "banczak": "PROPN", "freedoms": "NOUN", "stubbornness": "NOUN", "codices": "NOUN", "dialog": "NOUN", "crieth": "VERB", "'cuz": "SCONJ", "slice": "NOUN", "threats": "NOUN", "dreamed": "VERB", "coded": "VERB", "gymnasiums": "NOUN", "consumerism": "NOUN", "roy": "PROPN", "sheriff": "PROPN", "accommodation": "NOUN", "sincerely": "ADV", "72nd": "ADJ", "changed": "VERB", "seize": "VERB", "menacing": "VERB", "myopic": "ADJ", "swift": "PROPN", "pairs": "NOUN", "some": "DET", "balochi": "ADJ", "politics": "NOUN", "30th": "NOUN", "zócalo": "PROPN", "carrier": "NOUN", "wild": "ADJ", "abused": "VERB", "bright": "ADJ", "muang": "PROPN", "inferiors": "NOUN", "particular": "ADJ", "reveal": "VERB", "lewiston": "PROPN", "colonizers": "NOUN", "stabilization": "NOUN", "stephen": "PROPN", "intentional": "ADJ", "belittling": "ADJ", "designed": "VERB", "piano": "NOUN", "siesta": "NOUN", "pureed": "VERB", "simien": "PROPN", "chef": "NOUN", "concertina": "NOUN", "mop": "NOUN", "trendy": "ADJ", "trek": "PROPN", "1992": "NUM", "kernel": "NOUN", "teterboro": "PROPN", "prensky": "PROPN", "whie": "SCONJ", "majesty": "NOUN", "menus": "NOUN", "ecs": "PROPN", "worst": "ADJ", "manipulations": "NOUN", "w": "PROPN", "singers": "NOUN", "portsmouth": "PROPN", "sonic": "PROPN", "participant": "NOUN", "triviality": "NOUN", "conquistadors": "NOUN", "foothills": "NOUN", "o'rourke": "PROPN", "sculpting": "NOUN", "utter": "ADJ", "danelia": "PROPN", "discipline": "NOUN", "categories": "NOUN", "innate": "ADJ", "bhatia": "PROPN", "primitive": "ADJ", "shimon": "PROPN", "mimicking": "VERB", "pieces": "NOUN", "au": "PROPN", "river-beds": "NOUN", "resume": "NOUN", "musicians": "NOUN", "i.e.": "ADV", "1774": "NUM", "sued": "VERB", "dock": "NOUN", "strynø": "PROPN", "dwarfed": "VERB", "kazimir": "PROPN", "quantcast": "PROPN", "unitary": "ADJ", "subsection": "NOUN", "elviña": "PROPN", "friend": "NOUN", "hermes": "PROPN", "picks": "NOUN", "fastest": "ADJ", "noticed": "VERB", "pilgrimages": "NOUN", "donning": "VERB", "shannon": "PROPN", "motive": "NOUN", "grab": "VERB", "experimentally": "ADV", "bandera": "PROPN", "blanc": "PROPN", "verizon": "PROPN", "responsive": "ADJ", "deffenitly": "ADV", "+852": "NUM", "regardless": "ADV", "perle": "PROPN", "ft.": "PROPN", "501": "NUM", "picky": "ADJ", "michigan": "PROPN", "rick": "PROPN", "leach": "PROPN", "chamberlain": "PROPN", "august": "PROPN", "forever": "ADV", "resembling": "VERB", "1993": "NUM", "toni": "PROPN", "hairs": "NOUN", "enterprises": "NOUN", "1990s": "NOUN", "ahmed": "PROPN", "ole": "ADJ", "brutality": "NOUN", "ubisoft": "PROPN", "firewalls": "NOUN", "meetings": "NOUN", "guided": "VERB", "algorithms": "NOUN", "printed": "VERB", "visitor": "NOUN", "secret": "ADJ", "frequently": "ADV", "cdg": "PROPN", "ext.": "NOUN", "discontinued": "VERB", "outbreak": "NOUN", "col.": "PROPN", "enroneauction": "PROPN", "downfall": "NOUN", "glands": "NOUN", "slide": "NOUN", "plied": "VERB", "14,000": "NUM", "acd": "PROPN", "1796": "NUM", "roosevelt": "PROPN", "blown-up": "ADJ", "parted": "VERB", "regularly": "ADV", "leaves": "NOUN", "frick": "PROPN", "treaty": "PROPN", "sits": "VERB", "sw": "PROPN", "patronage": "NOUN", "banshee": "NOUN", "snappy": "ADJ", "rearview": "NOUN", "bonded": "VERB", "regulars": "NOUN", "nicest": "ADJ", "toddler": "NOUN", "blip": "NOUN", "mathematician": "NOUN", "columbus": "PROPN", "calf": "NOUN", "hadith": "PROPN", "right": "ADJ", "honda": "PROPN", "317": "NUM", "rockin": "PROPN", "contraptions": "NOUN", "169": "NUM", "lintels": "NOUN", "velupillai": "PROPN", "pegged": "VERB", "thesis": "NOUN", "students": "NOUN", "pik-wan": "PROPN", "misrepresenting": "VERB", "divine": "ADJ", "loomed": "VERB", "tyler": "PROPN", "xf": "PROPN", "vetri": "PROPN", "completes": "VERB", "bjerrebyvej": "PROPN", "parra": "PROPN", "mistakes": "NOUN", "redundant": "ADJ", "kean": "PROPN", "opposition": "NOUN", "3/4": "NUM", "01:04": "NUM", "greyhound": "PROPN", "absurdity": "NOUN", "wholegrains": "NOUN", "vlogger": "NOUN", "progresses": "VERB", "islamist": "PROPN", "quizzing": "VERB", "inspection": "NOUN", "payout": "NOUN", "cutlery": "NOUN", "cellfone": "NOUN", "marianne": "PROPN", "coins": "NOUN", "mosul": "PROPN", "march": "PROPN", "pursuing": "VERB", "newsday.com": "PROPN", "dockworkers": "NOUN", "dong": "PROPN", "sirloin": "NOUN", "friedrichstrasse": "PROPN", "neoformalism": "NOUN", "empathized": "VERB", "skylight": "NOUN", "looks": "VERB", "drawings": "NOUN", "livid": "ADJ", "boils": "VERB", "tuesday's": "PROPN", "onwards": "ADV", "spiritually": "ADV", "metering": "NOUN", "reassemble": "VERB", "outfielder": "NOUN", "modulate": "VERB", "1000.00": "NUM", "unanimous": "ADJ", "jenna": "PROPN", "disk": "NOUN", "ted.bockius@ivita.com": "PROPN", "palms": "NOUN", "although": "SCONJ", "flag": "NOUN", "hustle": "NOUN", "recommended": "VERB", "norm": "NOUN", "abu": "PROPN", "g": "NOUN", "obeys": "VERB", "exceeded": "VERB", "nematocysts": "NOUN", "10:38": "NUM", "province": "PROPN", "drug": "NOUN", "☎": "SYM", "clamped": "VERB", "conversos": "NOUN", "est": "PROPN", "busy": "ADJ", "suffer": "VERB", "tarahumara": "ADJ", "sam": "PROPN", "http://www.playatmcd.com/en-us/main/gameboard": "PROPN", "resemblance": "NOUN", "joyfully": "ADV", "holders": "NOUN", "rocks": "NOUN", "needed": "VERB", "leafy": "ADJ", "someplace": "ADV", "spacecraft": "NOUN", "lifehood": "NOUN", "joyce": "PROPN", "unstable": "ADJ", "electronics": "NOUN", "...?!!!": "PUNCT", "bosco": "PROPN", "icdc": "PROPN", "highest": "ADJ", "tombstone": "NOUN", "heavily": "ADV", "yu": "PROPN", "lightness": "NOUN", "rathbun": "PROPN", "comp.sources.unix": "NOUN", "obtain": "VERB", "jackson": "PROPN", "mantra": "NOUN", "violets": "NOUN", "rear": "ADJ", "#langu": "PROPN", "violates": "VERB", "remembering": "VERB", "sanders": "PROPN", "bagh": "PROPN", "cookies": "NOUN", "45": "NUM", "homemade": "ADJ", "walked": "VERB", "amrullah": "PROPN", "accounts": "NOUN", "popup": "NOUN", "polytheistic": "ADJ", "want": "VERB", "augmented": "VERB", "unlimited": "ADJ", "sympathetic": "ADJ", "continued": "VERB", "lisbon": "PROPN", "hearing": "NOUN", "dreaded": "VERB", "worried": "ADJ", "bridal": "ADJ", "11/1/01": "NUM", "prepares": "VERB", "grimaced": "VERB", "stocking": "NOUN", "abandonment": "NOUN", "contribute": "VERB", "bypass": "VERB", "unobstructed": "ADJ", "besides": "ADP", "nuanced": "ADJ", "n’t": "PART", "etc.": "NOUN", "shampoo": "NOUN", "05/30/2001": "NUM", "!!!!!!!!!!!": "PUNCT", "rodaba": "PROPN", "hormonal": "ADJ", "goggling": "VERB", "metropolitan": "ADJ", "deduct": "VERB", "cypriots": "NOUN", "376-9004": "NUM", "unawareness": "NOUN", "reaffirmed": "VERB", "fruit": "NOUN", "replace": "VERB", "3/8/00": "NUM", "ridiculed": "VERB", "tail": "NOUN", "grammarian": "NOUN", "extrudes": "VERB", "indomitable": "ADJ", "191": "NUM", "african": "ADJ", "11": "NUM", "darkness": "NOUN", "1.25": "NUM", "jana": "PROPN", "lakoff": "PROPN", "jumper": "NOUN", "reverse": "VERB", "anne": "PROPN", "shady": "PROPN", "non-scientific": "ADJ", "',": "AUX", "unix": "PROPN", "cuisine": "NOUN", "sums": "NOUN", "mechanical": "ADJ", "170": "NUM", "fyi": "ADV", "pluralistic": "ADJ", "bungling": "NOUN", "batawi": "PROPN", "friendship": "NOUN", "gamaa": "PROPN", "economizing": "VERB", "http://gimpedblog.blogspot.com/2011/09/how-to-use-gimp-for-beginners-lesson-4.html": "PROPN", "brimming": "VERB", "said": "VERB", "poison": "NOUN", "publishing": "NOUN", "penetrated": "VERB", "hedgehog": "NOUN", "boy": "NOUN", "disputes": "NOUN", "ghazaliyah": "PROPN", "multipolar": "ADJ", "timing": "NOUN", "vendor": "NOUN", "1-800-238-5355": "NUM", "nowhere": "ADV", "ehow": "PROPN", "1:30": "NUM", "expulsion": "NOUN", "scampi": "NOUN", "needing": "VERB", "regional": "ADJ", "stoker": "PROPN", "foam": "NOUN", "networks": "NOUN", "paving": "NOUN", "maintained": "VERB", "oxford": "PROPN", "hernan": "PROPN", "grenade": "NOUN", "presumed": "VERB", "thief": "NOUN", "batted": "VERB", "christie": "PROPN", "forges": "VERB", "rewind": "VERB", "6.3": "NUM", "untouchable": "ADJ", "menstruation": "NOUN", "environments": "NOUN", "jensen": "PROPN", "normality": "NOUN", "downloads": "NOUN", "cascades": "NOUN", "favoring": "VERB", "talkie": "NOUN", "demosisto": "PROPN", "indexed": "VERB", "caem": "PROPN", "influx": "NOUN", "flunking": "VERB", "salads": "NOUN", "keep": "VERB", "mozilla": "PROPN", "860-665-2368": "NUM", "nestled": "VERB", "numbers": "NOUN", "cuticles": "NOUN", "1972": "NUM", "medicine": "NOUN", "hunh": "INTJ", "janice": "PROPN", "psalms": "PROPN", "patricia": "PROPN", "sitcom": "NOUN", "passed": "VERB", "conversations": "NOUN", "cherished": "VERB", "enoch": "PROPN", "swabs": "VERB", "venture": "NOUN", "no.": "NOUN", "dads": "NOUN", "46093": "NUM", "sherry": "PROPN", "ansems": "PROPN", "when": "ADV", "salafi": "PROPN", "pervaiz": "PROPN", "disenfranchised": "VERB", "meurtres": "PROPN", "230": "NUM", "pics": "NOUN", "exams": "NOUN", "meatball": "NOUN", "chose": "VERB", "yoga": "NOUN", "investigative": "ADJ", "yeoncheon": "PROPN", "defund": "VERB", "gf": "NOUN", "vinod": "PROPN", "driest": "ADJ", "basically": "ADV", "cowboys": "PROPN", "albert": "PROPN", "alt.animals.dog": "NOUN", "2/7/2005": "NUM", "like": "ADP", "trash": "NOUN", "rowing": "VERB", "lanes": "NOUN", "ye": "PRON", "levitt": "PROPN", "659,000": "NUM", "timeframes": "NOUN", "deemed": "VERB", "tuning": "NOUN", "nibble": "VERB", "steak": "NOUN", "referral": "NOUN", "deffly": "ADV", "debutants": "NOUN", "arises": "VERB", "nutritious": "ADJ", "bleak": "ADJ", "inspired": "VERB", "rabble": "NOUN", "elizabeth": "PROPN", "static": "NOUN", "letters": "NOUN", "sandalled": "ADJ", "proudly": "ADV", "rt": "PROPN", "advance": "NOUN", "missing": "VERB", "inspiration": "NOUN", "decentralized": "VERB", "fills": "VERB", "mayan": "ADJ", "forwarded": "VERB", "hip": "NOUN", "landscape": "NOUN", "perfectionist": "NOUN", "claque": "NOUN", "transportation": "NOUN", "circumference": "NOUN", "unfolded": "VERB", "till": "ADP", "realise": "VERB", "countersignature": "NOUN", "jeopardy": "PROPN", "wholesale": "ADJ", "andrzej": "PROPN", "fancy": "ADJ", "planes": "NOUN", "utility": "NOUN", "commit": "VERB", "lived": "VERB", "worksheet": "NOUN", "27th": "NOUN", "maclaurin": "PROPN", "kendel": "PROPN", "411507": "NUM", "friendliness": "NOUN", "builds": "VERB", "letting": "VERB", "promoted": "VERB", "dutifully": "ADV", "92,000": "NUM", "335": "NUM", "cannes": "PROPN", "achieved": "VERB", "bath-stool": "NOUN", "mdgs": "PROPN", "bs": "NOUN", "considers": "VERB", "attainable": "ADJ", "promotional": "ADJ", "pp": "NOUN", "stems": "NOUN", "cloudless": "ADJ", "pst": "PROPN", "adhered": "VERB", "professors": "NOUN", "u-haul": "PROPN", "cures": "VERB", "visual": "ADJ", "masjid": "PROPN", "egress": "NOUN", "deformity": "NOUN", "winfrey": "PROPN", "kinect": "PROPN", "slenderness": "NOUN", "nevertheless": "ADV", "flinching": "VERB", "throughout": "ADP", "1975": "NUM", "surprise": "NOUN", "peres": "PROPN", "unpack": "ADJ", "months": "NOUN", "uncover": "VERB", "grandsons": "NOUN", "heartwarming": "ADJ", "christmas": "PROPN", "contained": "VERB", "stylist": "NOUN", "mérida": "PROPN", "thematic": "ADJ", "spawning": "VERB", "`": "PUNCT", "economies": "NOUN", "tipped": "VERB", "unpleasant": "ADJ", "misrepresentations": "NOUN", "boozy": "ADJ", "leonard": "PROPN", "crop": "NOUN", "!.": "PUNCT", "donut": "NOUN", "annoyed": "ADJ", "pioneers": "PROPN", "isle": "PROPN", "dispersing": "VERB", "agencies": "NOUN", "spew": "VERB", "averaging": "NOUN", "reverence": "NOUN", "vichy": "PROPN", "diffuse": "VERB", "predictable": "ADJ", "summertime": "NOUN", "informative": "ADJ", "assailants": "NOUN", "joux": "PROPN", "savage": "PROPN", "11:07": "NUM", "majestic": "ADJ", "altman": "PROPN", "adopt": "VERB", "foreground": "NOUN", "lands": "NOUN", "ass't.": "NOUN", "obtained": "VERB", "juggling": "NOUN", "dharmad...@gmail.com": "PROPN", "desperately": "ADV", "proxy": "NOUN", "dream": "NOUN", "entirely": "ADV", "shamanism": "PROPN", "superstition": "NOUN", "dow": "PROPN", "emerged": "VERB", "delights": "NOUN", "sep": "PROPN", "bouild": "VERB", "abbassi": "PROPN", "queues": "NOUN", "park": "NOUN", "quicker": "ADJ", "whitman": "PROPN", "accelerating": "VERB", "starting": "VERB", "02:34": "NUM", "scuffling": "VERB", "however": "ADV", "venice": "PROPN", "ceiling": "NOUN", "concurrently": "ADV", "incorrect": "ADJ", "townhouse": "NOUN", "58,825": "NUM", "restructuring": "NOUN", "stomachs": "NOUN", "11222": "NUM", "bug": "NOUN", "goodies": "NOUN", "franklin": "PROPN", "remember": "VERB", "strolled": "VERB", "ashkenazi": "PROPN", "geometrically": "ADV", "251": "NUM", "overcharged": "VERB", "biloxi": "PROPN", "random": "ADJ", "liberties": "NOUN", "groaning": "VERB", "gibbering": "VERB", "regading": "VERB", "bat-like": "ADJ", "pantheons": "NOUN", "hernia": "NOUN", "code": "NOUN", "clinging": "VERB", "gliding": "VERB", "420072": "NUM", "coruña": "PROPN", "baked": "VERB", "overall": "ADJ", "premature": "ADJ", "chomping": "VERB", "routines": "NOUN", "teachings": "NOUN", "clue": "NOUN", "non-arab": "ADJ", "16": "NUM", "kalkat": "PROPN", "demante": "PROPN", "grudging": "VERB", "indonesian": "ADJ", "ohio": "PROPN", "brush": "NOUN", "10.6": "NUM", "resulted": "VERB", "shredded": "ADJ", "op": "INTJ", "istanbul": "PROPN", "balls": "NOUN", "masjed-e": "PROPN", "corporations": "NOUN", "hassles": "NOUN", "1951": "NUM", "ones": "NOUN", "tradition": "NOUN", "howled": "VERB", "singh": "PROPN", "empiricists": "NOUN", "pedagogical": "ADJ", "altho": "SCONJ", "poisonous": "ADJ", "marketers": "NOUN", "vagabond": "PROPN", "alumni": "NOUN", "gianutto": "PROPN", "exporting": "VERB", "jaquier": "PROPN", "adjacent": "ADJ", "circumscribed": "ADJ", "attentive": "ADJ", "budd": "PROPN", "genitalia": "NOUN", "once": "ADV", "fire": "NOUN", "baseline": "NOUN", "battling": "VERB", "ucsb": "PROPN", "prawns": "NOUN", "lamonica": "PROPN", "developer": "NOUN", "250,000": "NUM", "lush": "ADJ", "mid-october": "PROPN", "flatness": "NOUN", "patches": "NOUN", "distractors": "NOUN", "beard": "NOUN", "distresses": "NOUN", "sensory": "ADJ", "spot": "NOUN", "variable": "ADJ", "pluralist": "ADJ", "ellis": "PROPN", "owes": "VERB", "republic": "PROPN", "eaiser": "ADJ", "tate": "PROPN", "queue": "NOUN", "edmark": "PROPN", "glories": "NOUN", "aviation": "NOUN", "stupid": "ADJ", "declined": "VERB", "discourteous": "ADJ", "heater": "NOUN", "o'connor": "PROPN", "layer": "NOUN", "longitudinally": "ADV", "recycling": "NOUN", "lomas": "PROPN", "----------------------------------------------------------------": "PUNCT", "livestock": "NOUN", "tactical": "ADJ", "harangue": "NOUN", "tomorrow": "NOUN", "enquirer": "PROPN", "diatribe": "PROPN", "founders": "NOUN", "contracts": "NOUN", "maurer": "PROPN", "infringing": "VERB", "credited": "VERB", "passively": "ADV", "extravagant": "ADJ", "challenging": "ADJ", "persons": "NOUN", "------------------------------------------------------------------": "PUNCT", "marshall": "PROPN", "koolhaas": "PROPN", "268": "NUM", "localist": "ADJ", "skipper": "NOUN", "vegas": "PROPN", "diagnose": "VERB", "bands": "NOUN", "traveled": "VERB", "zoning": "PROPN", "reasoned": "VERB", "-------------------------------------------------------------------": "PUNCT", "www.designofashion.com": "PROPN", "mould": "NOUN", "vancouver": "PROPN", "relapse": "NOUN", "motorola": "PROPN", "vaguer": "ADJ", "05/03/2001": "NUM", "m": "NUM", "trustworthiness": "NOUN", "clem": "PROPN", "kennedy": "PROPN", "r-": "INTJ", "believable": "ADJ", "mam": "PROPN", "promise": "NOUN", "silverware": "NOUN", "touch": "VERB", "warren": "PROPN", "christopher": "PROPN", "cyanide": "NOUN", "congestion": "NOUN", "rebecca": "PROPN", "vexation": "NOUN", "kioka": "PROPN", "fascist": "ADJ", "piers": "NOUN", "hydrocele": "NOUN", "jolla": "PROPN", "karim": "PROPN", "hamma": "PROPN", "disco": "PROPN", "2012": "NUM", "1961": "NUM", "families": "NOUN", "stacey": "PROPN", "80,000": "NUM", "gray": "ADJ", "caspian": "PROPN", "9.95": "NUM", "happiest": "ADJ", "wellington": "PROPN", "share": "VERB", "bypasses": "NOUN", "cropping": "VERB", "cares": "VERB", "mid-nineties": "NOUN", "ena": "PROPN", "pimple": "NOUN", "toil": "NOUN", "raise": "VERB", "edit": "NOUN", "sponsorship": "NOUN", "#'s": "NOUN", "controlled": "VERB", "halfway": "ADV", "diner": "NOUN", "signoffs": "NOUN", "seaward": "ADV", "clearing": "VERB", "brim": "NOUN", "cancer": "NOUN", "unequally": "ADV", "envisioned": "VERB", "veronique": "PROPN", "heel": "NOUN", "handkerchief": "NOUN", "oblivious": "ADJ", "percentiles": "NOUN", "linchpin": "NOUN", "parkway": "PROPN", "bench": "NOUN", "60,008": "NUM", "sizes": "NOUN", "hutcheson": "PROPN", "referrals": "NOUN", "vehicles": "NOUN", "toughies": "NOUN", "psycholical": "ADJ", "forceful": "ADJ", "frequencies": "NOUN", "header": "NOUN", "dharmadeva": "PROPN", "husayn": "PROPN", "thi": "INTJ", "seeded": "VERB", "italy": "PROPN", "nalapat": "PROPN", "f.o.b.": "PROPN", "recognize": "VERB", "x54667": "NOUN", "grow": "VERB", "cattle": "NOUN", "individual": "ADJ", "stylers": "NOUN", "17h": "NOUN", "assessed": "VERB", "asus": "PROPN", "clayton": "PROPN", "ralph": "PROPN", "fellowship": "PROPN", "greying": "VERB", "contribution": "NOUN", "heather": "PROPN", "escaped": "VERB", "damned": "ADJ", "otherwise": "ADV", "ah": "INTJ", "loaves": "NOUN", "troublefunk": "PROPN", "fedayeen": "NOUN", "gu'ud": "PROPN", "sheisters": "NOUN", "apprenticed": "VERB", "camps": "NOUN", "gratitude": "NOUN", "statute": "NOUN", "behesht": "PROPN", "tds": "NOUN", "mcclelland": "PROPN", "marx": "PROPN", "flex": "VERB", "strands": "NOUN", "takekurabe": "PROPN", "grapple": "VERB", "kaffee": "PROPN", "49th": "ADJ", "quasi": "ADJ", "elsevier": "PROPN", "hosting": "VERB", "malardians": "PROPN", "stack": "NOUN", "ghostbusters": "PROPN", "bedrooms": "NOUN", "blotts": "PROPN", "hamster": "NOUN", "souvenirs": "NOUN", "frazzled": "ADJ", "ascending": "VERB", "produce": "VERB", "ugh": "INTJ", "predicated": "VERB", "gathers": "VERB", "laudable": "ADJ", "reliance": "NOUN", "imposition": "NOUN", "?????": "PUNCT", "comforter": "NOUN", "doj": "PROPN", "mimicked": "VERB", "complaint": "NOUN", "wind": "NOUN", "endemics": "NOUN", "trip": "NOUN", "wikimedia": "PROPN", "really": "ADV", "priscilla": "PROPN", "saxons": "PROPN", "slots": "NOUN", "sail": "VERB", "stark": "PROPN", "sanskrit": "PROPN", "three-legged": "ADJ", "candies": "NOUN", "paris": "PROPN", "overtime": "ADV", "aphid": "NOUN", "luest": "PROPN", "repent": "VERB", "cigarette-making": "ADJ", "followings": "NOUN", "alignment": "NOUN", "kaminski": "PROPN", "major": "ADJ", "companion": "NOUN", "persia": "PROPN", "hug": "NOUN", "alexander": "PROPN", "rationally": "ADV", "assassination": "NOUN", "effects": "NOUN", "gall": "NOUN", "skyscrapers": "NOUN", "copper": "NOUN", "waved": "VERB", "tiktoks": "PROPN", "at&t": "PROPN", "hahahaahh": "INTJ", "shopwindow": "NOUN", "forked": "ADJ", "itinerary": "NOUN", "feathered": "ADJ", "władysław": "PROPN", "1722": "NUM", "icq": "NOUN", "since": "SCONJ", "sewn": "VERB", "endorse": "VERB", "comfy": "ADJ", "searching": "VERB", "toda": "NOUN", "regions": "NOUN", "intermediary": "ADJ", "stronger": "ADJ", "involvement": "NOUN", "121": "NUM", "zither": "NOUN", "cognition": "NOUN", "reservation": "NOUN", "pleasant": "ADJ", "continue": "VERB", "population": "NOUN", "cochin": "PROPN", "joking": "VERB", "assembling": "VERB", "huddled": "VERB", "rumsfeld": "PROPN", "6:23": "NUM", "abb": "PROPN", "defrosted": "VERB", "mitchell": "PROPN", "flavorless": "ADJ", "2.11": "NUM", "previously": "ADV", "interpersonal": "ADJ", "11:05": "NUM", "relate": "VERB", "wagon": "NOUN", "4,000": "NUM", "stole": "VERB", "interactivity": "NOUN", "encased": "VERB", "stepsister": "PROPN", "scanned": "VERB", "expectations": "NOUN", "millet": "NOUN", "audience": "NOUN", "pesticides": "NOUN", "benign": "ADJ", "siegel": "PROPN", "distancia": "PROPN", "adox": "PROPN", "sobriety": "NOUN", "seldom": "ADV", "thyroid": "NOUN", "fps": "NOUN", "haves": "VERB", "flexed": "VERB", "transcriptome": "NOUN", "operator": "NOUN", "surveying": "PROPN", "shep": "PROPN", "appliance": "NOUN", "marching": "VERB", "showcase": "VERB", "electioneering": "VERB", "intertexts": "NOUN", "aprons": "NOUN", "banishes": "VERB", "obtuse": "ADJ", "smap": "PROPN", "punctuated": "VERB", "consuming": "VERB", "puree": "VERB", "nikon": "PROPN", "minister": "NOUN", "voicing": "VERB", "measurement": "NOUN", "blinking": "VERB", "addictive": "ADJ", "belly": "NOUN", "games": "NOUN", "armchairs": "NOUN", "flirts": "NOUN", "fieldwork": "NOUN", "uneasiness": "NOUN", "padilla": "PROPN", "china": "PROPN", "entrée": "NOUN", "political": "ADJ", "fashionable": "ADJ", "jove": "PROPN", "thump": "NOUN", "baltic": "ADJ", "ostrom": "PROPN", "assessing": "VERB", "cartoons": "NOUN", "toyota": "PROPN", "may": "AUX", "aesar": "PROPN", "bankroll": "VERB", "teacher": "NOUN", "bushes": "NOUN", "skin": "NOUN", "notre": "PROPN", "silver": "NOUN", "tempests": "NOUN", "cancers": "NOUN", "collapsing": "VERB", "202-828-3372": "NUM", "dragon": "NOUN", "fresh-water": "NOUN", "qwest": "PROPN", "ambiguous": "ADJ", "+1602275-4958": "NUM", "disagreements": "NOUN", "sadly": "ADV", "winded": "ADJ", "skype": "PROPN", "spaniard": "PROPN", "19th": "ADJ", "rediculous": "ADJ", "advised": "VERB", "doug": "PROPN", "ruler": "NOUN", "petting": "NOUN", "antiquities": "NOUN", "memos": "NOUN", "elbows": "NOUN", "palette": "NOUN", "spraying": "NOUN", "bit": "NOUN", "implying": "VERB", "counter-measures": "NOUN", "channels": "NOUN", "nicknamed": "VERB", "washed": "VERB", "butt-headed": "ADJ", "outfit": "NOUN", "ineos": "PROPN", "pharmaceutical": "ADJ", "dualities": "NOUN", "attaining": "VERB", "chemistry": "NOUN", "invoked": "VERB", "21": "NUM", "reconfigured": "VERB", "cock": "VERB", "counted": "VERB", "lie": "VERB", "dances": "NOUN", "borough": "NOUN", "monies": "NOUN", "bp": "PROPN", "songs": "NOUN", "foundations": "NOUN", "lo": "INTJ", "cleansing": "VERB", "g-": "INTJ", "thailand": "PROPN", "fallibility": "NOUN", "psychiatrists": "NOUN", "deepening": "ADJ", "directing": "VERB", "rebuilding": "VERB", "reach": "VERB", "demagogues": "NOUN", "bangkok": "PROPN", "donor": "NOUN", "moro": "PROPN", "cyber": "ADJ", "upward": "ADV", "brothel": "NOUN", "roms": "NOUN", "chevalier": "PROPN", "cranmore": "PROPN", "manhattan": "PROPN", "chores": "NOUN", "motifs": "NOUN", "close": "ADJ", "meanings": "NOUN", "providing": "VERB", "suspiciously": "ADV", "smos": "PROPN", "unravel": "VERB", "britani": "PROPN", "vodka": "NOUN", "dinginess": "NOUN", "bomber": "NOUN", "rainy": "ADJ", "fits": "VERB", "linen": "NOUN", "listeners": "NOUN", "tempest": "NOUN", "sorta": "ADV", "sound": "NOUN", "theorized": "VERB", "gulf": "PROPN", "superboys": "NOUN", "willed": "VERB", "bottleneck": "NOUN", "allege": "VERB", "domenico": "PROPN", "groomed": "VERB", "whispered": "VERB", "interplanetary": "ADJ", "searches": "VERB", "waffle": "NOUN", "dior": "NOUN", "muscles": "NOUN", "850-748-0740": "NUM", "twenty-five": "NUM", "shoot": "VERB", "justine": "PROPN", "enhancing": "VERB", "wrong": "ADJ", "adapted": "VERB", "fanfuckingtastic": "ADJ", "tho": "PROPN", "1925": "NUM", "blindness": "NOUN", "procrastinating": "VERB", "freckled": "ADJ", "melon": "PROPN", "arms": "NOUN", "strictly": "ADV", "upsizing": "VERB", "snake": "NOUN", "bj": "PROPN", "mathematics": "NOUN", "located": "VERB", "estimation": "NOUN", "jezebel": "PROPN", "jeep": "PROPN", "otto": "PROPN", "bights": "NOUN", "grad": "NOUN", "shallows": "NOUN", "brick": "NOUN", "ya": "PRON", "majors": "NOUN", "rewarded": "VERB", "aires": "PROPN", "feb.": "PROPN", "adjustment": "NOUN", "orwellian": "ADJ", "minimums": "NOUN", "innings": "NOUN", "loose": "ADJ", "behaves": "VERB", "constructed": "VERB", "reputable": "ADJ", "known": "VERB", "12:03": "NUM", "indicate": "VERB", "confirmed": "VERB", "fuad": "PROPN", "koran": "PROPN", "backtracked": "VERB", "sanctioned": "VERB", "grocers": "NOUN", "hesitating": "ADJ", "ago": "ADV", "jejudo": "PROPN", "judd": "PROPN", "23.8": "NUM", "hutt": "PROPN", "haggle": "VERB", "suitcase": "NOUN", "writes": "VERB", "sugary": "ADJ", "pavement": "NOUN", "shortages": "NOUN", "trenchant": "ADJ", "cincinnati": "PROPN", "alphabet": "NOUN", "many": "ADJ", "==": "SYM", "appropriating": "VERB", "outrages": "NOUN", "belidve": "VERB", "adnan": "PROPN", "clientelage": "NOUN", "remodels": "NOUN", "jean": "PROPN", "midwesterners": "NOUN", "drink": "NOUN", "suitable": "ADJ", "swatch": "VERB", "30s": "NOUN", "andamans": "PROPN", "long-nosed": "ADJ", "26.1": "NUM", "raped": "VERB", "cameras": "NOUN", "llp": "PROPN", "dimensions": "NOUN", "toll": "NOUN", "predominantly": "ADV", "ponies": "NOUN", "cabbage": "NOUN", "red-eyed": "ADJ", "scents": "NOUN", "68.4": "NUM", "reprimands": "NOUN", "rising": "VERB", "238": "NUM", "coated": "VERB", "complicated": "ADJ", "luxerious": "ADJ", "rosario.gonzales@compaq.com": "PROPN", "moaned": "VERB", "albergo": "PROPN", "offers": "VERB", "coastline": "NOUN", "masculinity": "NOUN", "listlessness": "NOUN", "phillies": "PROPN", "ninety-nine": "NUM", "booleanpolygonconstraint": "PROPN", "diminishing": "VERB", "excess": "ADJ", "saber-toothed": "ADJ", "gristle-studded": "ADJ", "trophy": "NOUN", "rubbing": "VERB", "pomper": "PROPN", "hunt": "NOUN", "incrustation": "NOUN", "modify": "VERB", "---->===}*{===<----": "SYM", "4-5": "NUM", "icecreams": "NOUN", "grasses": "NOUN", "gestured": "VERB", "innovating": "VERB", "egregious": "ADJ", "carribbean": "PROPN", "honking": "VERB", "humanpixel": "PROPN", "humans": "NOUN", "merseyside-egypt": "PROPN", "dranove": "PROPN", "telescope": "NOUN", "essay": "NOUN", "tralee": "NUM", "toiling": "VERB", "condemns": "VERB", "foe": "NOUN", "bases": "NOUN", "saccades": "NOUN", "transfers": "NOUN", "bailey": "PROPN", "incredible": "ADJ", "classmates": "NOUN", "distain": "NOUN", "paramus": "PROPN", "kills": "VERB", "kidnapping": "VERB", "combatants": "NOUN", "opus": "PROPN", "młyn": "PROPN", "malfunction": "VERB", "drop-down": "ADJ", "respects": "NOUN", "iraqis": "PROPN", "geographically": "ADV", "normall": "ADJ", "anthropologist": "NOUN", "fairs": "NOUN", "mobilising": "NOUN", "tails": "NOUN", "essentially": "ADV", "brutal": "ADJ", "vampires": "NOUN", "quill": "NOUN", "420": "NUM", "darunta": "PROPN", "airliners": "NOUN", "husseiniyas": "PROPN", "safeguard": "NOUN", "plantation": "PROPN", "asks": "VERB", "frock": "NOUN", "knight": "NOUN", "oak": "NOUN", "daimler": "PROPN", "sochi": "PROPN", "mover": "NOUN", "charles": "PROPN", "colleagues": "NOUN", "balancing": "NOUN", "subjects": "NOUN", "10,694": "NUM", "hijacker": "NOUN", "striking": "VERB", "cottages": "NOUN", "picnic": "NOUN", "furnishings": "NOUN", "computing": "NOUN", "crackpot": "NOUN", "rations": "NOUN", "aquarist": "NOUN", "dressed": "VERB", "coincides": "VERB", "cannibals": "NOUN", "expressing": "VERB", "adopts": "VERB", "earthquakes": "NOUN", "characters": "NOUN", "humanatarian": "ADJ", "mullah": "PROPN", "inequality": "NOUN", "expeditions": "NOUN", "arm": "NOUN", "distantly": "ADV", "defined": "VERB", "themselves": "PRON", "evaporate": "VERB", "desolate": "ADJ", "meghalaya": "PROPN", "newspaper": "NOUN", "plantains": "NOUN", "utilise": "VERB", "upon": "ADP", "industrialized": "ADJ", "renewal": "NOUN", "vegetarian": "ADJ", "ethnocentrism": "NOUN", "contraction": "NOUN", "teenage": "ADJ", "rough": "ADJ", "commonwealths": "NOUN", "flavoring": "NOUN", "cliffy": "ADJ", "mackey": "PROPN", "assured": "VERB", "united": "VERB", "sheepdog": "PROPN", "professionalized": "VERB", "have": "VERB", "tweed": "NOUN", "users": "NOUN", "reproducing": "VERB", "cycling": "VERB", "dilapidation": "NOUN", "novellas": "NOUN", "demand": "NOUN", "goddess": "NOUN", "alaskans": "PROPN", "deducting": "VERB", "listed": "VERB", "soft": "ADJ", "superdome": "PROPN", "orchestrated": "VERB", "hotspots": "NOUN", "truely": "ADV", "m5s": "PROPN", "nesbitt": "PROPN", "millennium": "PROPN", "setoff": "NOUN", "quotes": "NOUN", "rely": "VERB", "antipasto": "NOUN", "counting": "VERB", "guarantor": "NOUN", "haiti": "PROPN", "neighbourhood": "NOUN", "password": "NOUN", "forms": "NOUN", "academy": "PROPN", "continuation": "NOUN", "postings": "NOUN", "disruptive": "ADJ", "luck": "NOUN", "confided": "VERB", "divisions": "NOUN", "alternatively": "ADV", "mid-season": "NOUN", "stumping": "VERB", "meddlesome": "ADJ", "tress": "NOUN", "headlines": "NOUN", "n'": "CCONJ", "leung": "PROPN", "94.40": "NUM", "0000108806": "NUM", "coastal": "ADJ", "expectedly": "ADV", "keck": "PROPN", "repays": "VERB", "seamen": "NOUN", "qanooni": "PROPN", "zipped": "ADJ", "jenny": "PROPN", "mansion": "NOUN", "blindfolds": "NOUN", "compass": "NOUN", "sigh": "INTJ", "medial": "ADJ", "esna": "PROPN", "landed": "VERB", "draw": "VERB", "browsers": "NOUN", "quaid": "PROPN", "fascinating": "ADJ", "stumbled": "VERB", "etter": "ADV", "comprehensive": "ADJ", "resides": "VERB", "revolutionaries": "NOUN", "171": "NUM", "solana": "PROPN", "yesterday": "NOUN", "guernica": "PROPN", "safest": "ADJ", "artesian": "ADJ", "fashion": "NOUN", "matrix": "NOUN", "appologized": "VERB", "crashed": "VERB", "nonessential": "ADJ", "preceded": "VERB", "impede": "VERB", "high": "ADJ", "cpi": "NOUN", "unconsciously": "ADV", "jamaica": "PROPN", "mooney": "PROPN", "human": "ADJ", "eneedle": "NOUN", "rotted": "VERB", "orient": "PROPN", "spiel": "NOUN", "slanted": "ADJ", "ld2d-#69396-1.doc": "NOUN", "sashimi": "NOUN", "converted": "VERB", "2254": "NUM", "user": "NOUN", "paradises": "PROPN", "sufficiently": "ADV", "thx": "NOUN", "photo": "NOUN", "jester": "NOUN", "outside": "ADV", "cluttered": "VERB", "microtome": "NOUN", "04:03": "NUM", "6.25": "NUM", "bedlam": "NOUN", "animators": "NOUN", "ak47's": "NOUN", "doomed": "VERB", "hormone": "NOUN", "soda": "NOUN", "punishment": "NOUN", "forgetting": "VERB", "landing": "NOUN", "5,600": "NUM", "shortstop": "NOUN", "statehood": "NOUN", "galante": "PROPN", "wedged": "VERB", "\"": "PUNCT", "knocked": "VERB", "colour": "NOUN", "duo": "PROPN", "filippini": "PROPN", "carport": "NOUN", "hungry": "ADJ", "ajay": "PROPN", "pregnant": "ADJ", "rov": "NOUN", "outperformed": "VERB", "newsprint": "NOUN", "node": "NOUN", "formerly": "ADV", "placement": "NOUN", "345-8702": "NUM", "redvepco.doc": "NOUN", "all-night": "ADV", "tricks": "NOUN", "http://en.wikipedia.org/wiki/aerocom": "PROPN", "denounced": "VERB", "intercept": "NOUN", "confess": "VERB", "provocative": "ADJ", "woo": "INTJ", "reclaim": "VERB", "courtois": "PROPN", "scholarship": "NOUN", "newsweek": "PROPN", "fabolous": "ADJ", "succint": "ADJ", "sails": "NOUN", "competitions": "NOUN", "foresee": "VERB", "looters": "NOUN", "slumber": "NOUN", "https://osf.io": "PROPN", "persevere": "VERB", "fan": "NOUN", "ebb": "NOUN", "sanitation": "NOUN", "beatles": "PROPN", "lemons": "NOUN", "hobbies": "NOUN", "uniquely": "ADV", "quidditch": "PROPN", "hostile": "ADJ", "cynthia": "PROPN", "ossendrecht": "PROPN", "credit": "NOUN", "78": "NUM", "mid-august": "PROPN", "wheezing": "VERB", "lacerating": "ADJ", "1789": "NUM", "two": "NUM", "because": "SCONJ", "entrepreneurs": "NOUN", "#analysis": "PROPN", "abuse": "NOUN", "dymoke": "PROPN", "kitchen": "NOUN", "rnr": "NOUN", "makel": "PROPN", "haste": "NOUN", "softener": "NOUN", "rallying": "NOUN", "jkthom": "NOUN", "enigma": "NOUN", "m-m": "INTJ", "lose": "VERB", "sequential": "ADJ", "employers": "NOUN", "commanded": "VERB", "esa": "NOUN", "referendum": "NOUN", "shore": "NOUN", "emotions": "NOUN", "loudspeaker": "NOUN", "stiffly": "ADV", "nicely": "ADV", "mileage": "NOUN", "mesh": "NOUN", "inclined": "ADJ", "cenote": "NOUN", "faculties": "NOUN", "starved": "VERB", "mandated": "VERB", "grail": "NOUN", "harkat": "PROPN", "opponents": "NOUN", "chew": "VERB", "racking": "VERB", "nickelodean": "PROPN", "16/10/2004": "NUM", "pinkie": "NOUN", "corpus": "NOUN", "absence": "NOUN", "cpys": "NOUN", "sites": "NOUN", "housing": "NOUN", "sandbanks": "NOUN", "freemasonry": "PROPN", "dusting": "NOUN", "thickened": "VERB", "poems": "NOUN", "whisky": "NOUN", "gamble": "VERB", "jolly": "ADJ", "syrup": "NOUN", "riggins": "PROPN", "val": "PROPN", "shitting": "VERB", "rsjacobs@encoreacq.com": "PROPN", "oil": "NOUN", "grissini": "NOUN", "meticulously": "ADV", "opossums": "NOUN", "mixing": "VERB", "jgerma5@aol.com": "PROPN", "bartlesville": "PROPN", "streetlamps": "NOUN", "forwarding": "VERB", "10:40": "NUM", "storeys": "NOUN", "seive": "NOUN", "nervously": "ADV", "frankness": "NOUN", "penalizing": "VERB", "leigh": "PROPN", ">>>": "SYM", "treatments": "NOUN", "disciplines": "NOUN", "enlist": "VERB", "roofs": "NOUN", "speaking": "VERB", "assumed": "VERB", "surveyed": "VERB", "spodsbjerg": "PROPN", "warping": "NOUN", "homosexuality": "NOUN", "clinic": "NOUN", "bee": "NOUN", "warnock": "PROPN", "witches": "NOUN", "non-violence": "NOUN", "gains": "NOUN", "austin": "PROPN", "prompting": "VERB", "foundational": "ADJ", "mills": "NOUN", "5:30": "NUM", "nutritional": "ADJ", "nutty": "ADJ", "interspersed": "VERB", "seem": "VERB", "96/23": "NUM", "445": "NUM", "plain": "ADJ", "07:48:44": "NUM", "pickling": "VERB", "mpg": "NOUN", "area": "NOUN", "self-questioning": "ADJ", "kurdish": "ADJ", "drizzle": "VERB", "sidestepped": "VERB", "owner": "NOUN", "beckett": "PROPN", "hiatus": "NOUN", "secessionist": "ADJ", "wicca": "PROPN", "cs5": "PROPN", "$": "SYM", "medicating": "VERB", "balm": "NOUN", "array": "NOUN", "expression": "NOUN", "educators": "NOUN", "dung": "NOUN", "possibilities": "NOUN", "54": "NUM", "significantly": "ADV", "briefing": "NOUN", "hotly": "ADV", "ridiculously": "ADV", "pag": "PROPN", "public": "ADJ", "defiance": "NOUN", "zimbalist": "PROPN", "cómbita": "PROPN", "union": "PROPN", "numbered": "ADJ", "tricycles": "NOUN", "consumption": "NOUN", "hygiene": "NOUN", "paddled": "VERB", "1280": "NUM", "musharraf": "PROPN", "staffs": "NOUN", "vanguards": "PROPN", "prettier": "ADJ", "4.0": "NUM", "theodore": "PROPN", "reaped": "VERB", "upside": "ADV", "locations": "NOUN", "automatically": "ADV", "cunard": "PROPN", "tracking": "NOUN", "adolf": "PROPN", "healthspace": "PROPN", "lidocaine": "NOUN", "11/08/2000": "NUM", "jams": "NOUN", "sieze": "VERB", "backed": "VERB", "exert": "VERB", "205": "NUM", "scramblers": "NOUN", "pluto": "PROPN", "photography": "NOUN", "<3": "VERB", "plastic": "NOUN", "lb.": "NOUN", "–": "PUNCT", "roadways": "NOUN", "episodes": "NOUN", "stands": "VERB", "railway": "NOUN", "illustrated": "VERB", "ingredients": "NOUN", "ripples": "NOUN", "young": "ADJ", "giant": "ADJ", "finest": "ADJ", "c'm": "VERB", "tidal": "ADJ", "5:55": "NUM", "calming": "ADJ", "sloping": "VERB", "nauseous": "ADJ", "tonnes": "NOUN", "satisfy": "VERB", "#": "SYM", "manage": "VERB", "http://dianacamera.com": "PROPN", "noble": "ADJ", "143": "NUM", "judicial": "ADJ", "wardrobes": "NOUN", "aisles": "NOUN", "recreated": "VERB", "wakes": "VERB", "chanley": "PROPN", "astronomy": "NOUN", "borgias": "PROPN", "sway": "VERB", "doliver": "PROPN", "supermarkets": "NOUN", "skirts": "NOUN", "elk": "NOUN", "pets": "NOUN", "adaptations": "NOUN", "strawberries": "NOUN", "lottery": "NOUN", "nutritive": "ADJ", "ide": "PROPN", "dual": "ADJ", "radios": "NOUN", "relying": "VERB", "insensitive": "ADJ", "recovered": "VERB", "predominated": "VERB", "unorthodox": "ADJ", "downs": "NOUN", "disinfectant": "NOUN", "couch": "NOUN", "asbestos": "NOUN", "gloom": "NOUN", "mosque": "NOUN", "kdp": "PROPN", "geared": "VERB", "vermiculite": "NOUN", "pressuring": "VERB", "sirae": "PROPN", "landgraf": "PROPN", "conferenced": "VERB", "soothing": "ADJ", "crate": "NOUN", "pipefitters": "NOUN", "brittan": "PROPN", "chomsky": "PROPN", "stonework": "NOUN", "deco": "PROPN", "individualized": "ADJ", "mirrors": "NOUN", "bulgaria": "PROPN", "salmagundi": "PROPN", "4193": "NUM", "dining": "NOUN", "plays": "VERB", "diver": "NOUN", "brochure": "NOUN", "civilized": "ADJ", "salesperson": "NOUN", "friend(s)": "NOUN", "authored": "VERB", "mistress": "NOUN", "reciprocate": "VERB", "question": "NOUN", "confirms": "NOUN", "captive": "ADJ", "gravel": "NOUN", "rats": "NOUN", "declaring": "VERB", "named": "VERB", "increasingly": "ADV", "connects": "VERB", "anwser": "NOUN", "ageless": "ADJ", "breakthrough": "NOUN", "chevrolet": "PROPN", "http://www.loveallpeople.org/theonereasonwhy.html": "PROPN", "181": "NUM", "carl": "PROPN", "sharpest": "ADJ", "connecting": "VERB", "mix": "VERB", "courthouse": "NOUN", "poorest": "ADJ", "madison": "PROPN", "lw": "PROPN", "dish": "NOUN", "institutional": "ADJ", "contributor": "NOUN", "250": "NUM", "moderately": "ADV", "resentful": "ADJ", "automotives": "PROPN", "mid-thirties": "NOUN", "plague": "NOUN", "terribly": "ADV", "darwinian": "ADJ", "vof": "PROPN", "incubation": "NOUN", "pilot": "NOUN", "4th": "ADJ", "meetups": "NOUN", "morrell": "PROPN", "needy": "ADJ", "general": "ADJ", "forties": "NOUN", "perform": "VERB", "scenarios": "NOUN", "genova": "PROPN", "inhaled": "VERB", "ocean": "NOUN", "anime": "NOUN", "antyscience": "PROPN", "existence": "NOUN", "obs-": "INTJ", "johar": "PROPN", "informing": "VERB", "pdf": "NOUN", "borenstein": "PROPN", "marches": "NOUN", "nullvalues": "NOUN", "region": "NOUN", "struggle": "NOUN", "lady": "NOUN", "disruptions": "NOUN", "unbound": "ADJ", "alarming": "ADJ", "non-bondad": "PROPN", "tyranny": "NOUN", "aquatic": "ADJ", "a": "DET", ".xsd": "NOUN", "fot": "ADP", "illustrations": "NOUN", "pigmy": "NOUN", "surveys": "NOUN", "biographers": "NOUN", "evolved": "VERB", "bitty": "ADJ", "widow": "PROPN", "revealing": "ADJ", "kinnock": "PROPN", "headspace": "NOUN", "canon": "PROPN", "let": "VERB", "corps": "PROPN", "dux": "PROPN", "barack": "PROPN", "wide": "ADJ", "arrogant": "ADJ", "ad": "NOUN", "cosmopolitan": "ADJ", "radiant": "ADJ", "ensconced": "VERB", "exports": "NOUN", "greenwalt": "PROPN", "matisse": "PROPN", "reply": "NOUN", "spiral": "ADJ", "preliminary": "ADJ", "explorer": "PROPN", "operandi": "NOUN", "yoyos": "NOUN", "silver-mounted": "ADJ", "classic": "ADJ", "whose": "PRON", "03/10/2000": "NUM", "tyburn": "PROPN", "antioch": "PROPN", "london": "PROPN", "commercialish": "ADJ", "styrofoam": "NOUN", "klingon": "PROPN", "michi": "PROPN", "sub": "ADV", "brightest": "ADJ", "fuss": "NOUN", "horizontal": "ADJ", "absolute": "ADJ", "itchy": "ADJ", "idea": "NOUN", "1994": "NUM", "constructing": "VERB", "midnight": "NOUN", "department": "NOUN", "tracks": "NOUN", "beaches": "NOUN", "368": "NUM", "fortier": "PROPN", "137": "NUM", "scallop": "NOUN", "forgotten": "VERB", "eurasia": "PROPN", "outsourcing": "VERB", "chanel": "PROPN", "tires": "NOUN", "benches": "NOUN", "homey": "ADJ", "poles": "NOUN", "tulsans": "PROPN", "cafasso": "PROPN", "shells": "NOUN", "technically": "ADV", "warrenty": "NOUN", "kar": "PROPN", "planks": "NOUN", "guangzhou": "PROPN", "bats": "VERB", "reversed": "VERB", "1950s": "NOUN", "83n": "NOUN", "owe": "VERB", "customize": "VERB", "1783": "NUM", "headlong": "ADJ", "snacks": "NOUN", "sticking": "VERB", "africans": "NOUN", "cooker": "NOUN", "iaea": "PROPN", "713-853-4743": "NUM", "whirl": "NOUN", "profitable": "ADJ", "nickname": "NOUN", "balanga": "PROPN", "schoolboy": "NOUN", "prefer": "VERB", "+44": "NUM", "lee": "PROPN", "ther": "DET", "percell@swbell.net": "PROPN", "pulling": "VERB", "alternating": "VERB", "central": "ADJ", "jpy": "NOUN", "σωφρόνιος": "PROPN", "oliver": "PROPN", "husain": "PROPN", "alondra": "PROPN", "reap": "VERB", "conducting": "VERB", "writhing": "NOUN", "unesco": "PROPN", "liverpool": "PROPN", "humus": "NOUN", "captain": "NOUN", "rebelling": "VERB", "polygons": "NOUN", "disdainful": "ADJ", "second-class": "NOUN", "inciting": "VERB", "couple": "NOUN", "marionettes": "NOUN", "6:13": "NUM", "grilled": "VERB", "memorable": "ADJ", "extent": "NOUN", "reproduce": "VERB", "horses": "NOUN", "peremptory": "ADJ", "flux": "NOUN", "furze": "NOUN", "missed": "VERB", "juncture": "NOUN", "establishes": "VERB", "bantu": "ADJ", "claudia": "PROPN", "servers": "NOUN", "overshadowed": "VERB", "handbag": "NOUN", "22:30": "NUM", "worshipped": "VERB", "audibly": "ADV", "condominium": "NOUN", "tues.": "PROPN", "65": "NUM", "hooser": "PROPN", "filtered": "VERB", "accumulation": "NOUN", "owl": "NOUN", "meanest": "ADJ", "armenia": "PROPN", "cenobitic": "ADJ", "beared": "VERB", "kale": "NOUN", "post-war": "ADJ", "paying": "VERB", "asher": "PROPN", "nigel": "PROPN", "melted": "VERB", "preparations": "NOUN", "attendance": "NOUN", "traceable": "ADJ", "ambassadors": "NOUN", "q1": "NOUN", "listening": "VERB", "temperatures": "NOUN", "&apos;": "NOUN", "crustaceans": "NOUN", "nuts": "NOUN", "hacienda": "PROPN", "unveiling": "NOUN", "sesame": "NOUN", "well-to-do": "ADJ", "osu": "PROPN", "ismail": "PROPN", "fine": "ADJ", "klain": "PROPN", "adjoining": "VERB", "horsetail": "NOUN", "cans": "NOUN", "fund": "NOUN", "sills": "NOUN", "suarez": "PROPN", "inter-caste": "ADJ", "fragments": "NOUN", "twin": "NOUN", "shandy": "PROPN", "figures": "NOUN", "chattels": "NOUN", "occupied": "ADJ", "evangelical": "PROPN", "aired": "VERB", "detention": "NOUN", "co-owned": "VERB", "voted": "VERB", "brunt": "NOUN", "restructure": "VERB", "profile": "NOUN", "gaiety": "NOUN", "sapulpa": "PROPN", "granted": "VERB", "measured": "VERB", "trump": "PROPN", "equipped": "VERB", "olympus": "PROPN", "orla": "PROPN", "picturesque": "ADJ", "gabin": "PROPN", "inhospitable": "ADJ", "grounds": "NOUN", "3d": "ADJ", "trailhead": "NOUN", "meiring": "PROPN", "perfected": "VERB", "blackberry": "NOUN", "disclose": "VERB", "gandalf": "PROPN", "think": "VERB", "adjective": "NOUN", "davy": "PROPN", "tarawa": "PROPN", "youngstown": "PROPN", "district": "PROPN", "forward": "ADV", "mathematica": "PROPN", "medicate": "VERB", "blind": "ADJ", "pillar": "NOUN", "laboring": "VERB", "civilize": "VERB", "fist": "NOUN", "income": "NOUN", "inactive": "ADJ", "homepage": "NOUN", "illustrates": "VERB", "t1": "NOUN", "nipped": "VERB", "correcting": "VERB", "pas": "ADV", "century": "NOUN", "mangroves": "NOUN", "slimy": "ADJ", "paves": "VERB", "gateway": "NOUN", "calculation": "NOUN", "sixteen": "NUM", "illusionless": "ADJ", "manoeuvre": "NOUN", "secure": "VERB", "empowering": "ADJ", "lulling": "VERB", "wigner": "PROPN", "chocked": "VERB", "good": "ADJ", "dandenong": "PROPN", "08/07/2001": "NUM", "bind": "VERB", "rediscover": "VERB", "suwayrah": "PROPN", "enchanting": "ADJ", "cab": "NOUN", "strict": "ADJ", "knock": "VERB", "faculty": "NOUN", "knowledgeable": "ADJ", "tortoise": "NOUN", "ultraviolet": "ADJ", "beginnings": "NOUN", "everyday": "ADJ", "tobin": "PROPN", "personaly": "ADV", "jmb": "PROPN", "concluding": "VERB", "contemplated": "VERB", "working": "VERB", "oil-fired": "ADJ", "thankful": "ADJ", "disorder": "NOUN", "overtopped": "VERB", "financially": "ADV", "pretends": "VERB", "carribean": "ADJ", "12:21": "NUM", "isoza": "PROPN", "arose": "VERB", "peer": "NOUN", "notoriously": "ADV", "’m": "AUX", "kingerski": "PROPN", "van": "PROPN", "interactive": "ADJ", "03/21/2001": "NUM", "shovel": "NOUN", "nicety": "NOUN", "pygmalion": "PROPN", "squire": "NOUN", "parks": "NOUN", "eos": "NOUN", "overbearing": "ADJ", "wila": "PROPN", "flowery": "ADJ", "thinness": "NOUN", "expressway": "PROPN", "crops": "NOUN", "staccato": "ADJ", "move": "VERB", "skewer": "NOUN", "self/less": "PROPN", "turtle": "NOUN", "benedetti": "PROPN", "marketplace": "NOUN", "explanations": "NOUN", "eccl": "PROPN", "!!!!": "PUNCT", "washes": "NOUN", "tumbling": "VERB", "inspector": "NOUN", "weatherspoon": "PROPN", "watering": "VERB", "300": "NUM", "beschta": "PROPN", "comp.mail.maps": "NOUN", "ya'll": "PRON", "ne": "ADV", "recently": "ADV", "anywhere": "ADV", "ellon": "PROPN", "intrusion": "NOUN", "receptionist": "NOUN", "ca-": "INTJ", "discharge": "NOUN", "signatures": "NOUN", "props": "NOUN", "sha": "AUX", "preserve": "VERB", "varying": "VERB", "cheap": "ADJ", "submicron": "NOUN", "ballroom": "NOUN", "assume": "VERB", "willett": "PROPN", "heavens": "NOUN", "decorated": "VERB", "pirate": "NOUN", "psychological": "ADJ", "‘": "PUNCT", "pit": "NOUN", "eaves": "NOUN", "qualities": "NOUN", "show": "VERB", "australia": "PROPN", "cocoa": "NOUN", "support": "NOUN", "browning": "PROPN", "06/04/01": "NUM", "nicki": "PROPN", "all": "DET", "l.a.": "PROPN", "delivering": "VERB", "beauty": "NOUN", "fantoni": "PROPN", "sorghum": "NOUN", "suffix": "NOUN", "dirt": "NOUN", "fistfights": "NOUN", "segmented": "VERB", "y'": "PRON", "producing": "VERB", "urgently": "ADV", "wagner": "PROPN", "facets": "NOUN", "laugh": "VERB", "lapped": "VERB", "captions": "NOUN", "consistency": "NOUN", "berth": "NOUN", "tamed": "VERB", "markets": "NOUN", "perched": "VERB", "modifying": "VERB", "consent": "VERB", "ordinarily": "ADV", "submovements": "NOUN", "past": "ADJ", "malbec": "PROPN", "dwindled": "VERB", "scratchy": "ADJ", "blankly": "ADV", "alt.animals.horses.breeding": "NOUN", "cement": "NOUN", "sympathised": "VERB", "whatever": "PRON", "punish": "VERB", "during": "ADP", "plates": "NOUN", "legs": "NOUN", "storage": "NOUN", "gapinski": "PROPN", "reclining": "VERB", "funerals": "NOUN", "dwells": "VERB", "floating": "VERB", "cynagon": "PROPN", "slave": "NOUN", "formula": "NOUN", "genres": "NOUN", "½": "NUM", "cleopatra": "PROPN", "10:45": "NUM", "snap": "PROPN", "crossbred": "VERB", "transwestern": "PROPN", "personal": "ADJ", "scanning": "VERB", "kenneth.lay@enron.com": "PROPN", "travel": "NOUN", "http://www.irisdatabase.org": "PROPN", "balance": "NOUN", "objectives": "NOUN", "interestingly": "ADV", "murdered": "VERB", "1985": "NUM", "louisianna": "PROPN", "subjected": "VERB", "turning": "VERB", "03/01/2001": "NUM", "profound": "ADJ", "mid-shaft": "ADJ", "syrian": "ADJ", "confer.": "NOUN", "briefly": "ADV", "mayur...@yahoo.com": "PROPN", "pledges": "NOUN", "unstirred": "VERB", "liters": "NOUN", "wrongful": "ADJ", "seventh": "ADJ", "craftsmanship": "NOUN", "tussauds": "PROPN", "bik": "PROPN", "verifies": "VERB", "surrey": "PROPN", "popped": "VERB", "infrastructures": "NOUN", "emotion": "NOUN", "overseas": "ADV", "ornaments": "NOUN", "bɛʁˈnʊli": "PROPN", "moonlit": "ADJ", "project": "NOUN", "vision": "NOUN", "convinced": "VERB", "asking": "VERB", "comparable": "ADJ", "?!?!?": "PUNCT", "115": "NUM", "hein": "PROPN", "mortgage": "NOUN", "boyish": "ADJ", "restricted": "VERB", "hundredth": "NUM", "feagan": "PROPN", "selecting": "VERB", "meal-times": "NOUN", "naive": "ADJ", "sensible": "ADJ", "walter": "PROPN", "haley": "PROPN", "stock": "NOUN", "domestication": "NOUN", "repressed": "VERB", "hatched": "VERB", "negates": "VERB", "emitting": "VERB", "bayley": "PROPN", "airwaves": "NOUN", "trail": "NOUN", "seven": "NUM", "prelude": "NOUN", "dissenting": "VERB", "discount": "NOUN", "poibeau": "PROPN", "featured": "VERB", "re(a)d": "ADJ", "tendencies": "NOUN", "5.5": "NUM", "saying": "VERB", "olmec": "PROPN", "vaughn": "PROPN", "facing": "VERB", "afterward": "ADV", "closing": "VERB", "kinkade": "PROPN", "837": "NUM", "salad": "NOUN", "shona": "PROPN", "artificial": "ADJ", "17,000": "NUM", "dialects": "NOUN", "colbert": "PROPN", "topline": "NOUN", "superfine": "ADJ", "os": "NOUN", "09/15/99": "NUM", "corporate": "ADJ", "hikes": "NOUN", "onward": "ADV", "orbiting": "VERB", "davidson": "PROPN", "toph": "PROPN", "expulse": "VERB", "accomplishing": "VERB", "steve": "PROPN", "biotaling": "VERB", "luxury": "NOUN", "graduate": "NOUN", "lecturing": "VERB", "unneccesary": "ADJ", "reuters": "PROPN", "lean": "ADJ", "buffalo": "PROPN", "29th": "ADJ", "wiffle": "NOUN", "chinatown": "PROPN", "k-": "INTJ", "senselessly": "ADV", "pete": "PROPN", "dr.": "PROPN", "refine": "VERB", "lifetime": "NOUN", "applicants": "NOUN", "stoats": "NOUN", "evasion": "NOUN", "get": "VERB", "lucius": "PROPN", "residency": "NOUN", "alongside": "ADP", "jealous": "ADJ", "treating": "VERB", "civil": "ADJ", "respected": "ADJ", "401": "NUM", "unsuccessful": "ADJ", "kut": "PROPN", "scheuer": "PROPN", "info@smakkecenter.dk": "PROPN", "focuses": "VERB", "specialized": "ADJ", "blizzard": "PROPN", "kensington": "PROPN", "billiard": "NOUN", "rangoon": "NOUN", "imi": "PROPN", "1928": "NUM", "dwell": "VERB", "nov.": "PROPN", "retention": "NOUN", "palestinians": "PROPN", "margins": "NOUN", "boosted": "VERB", "gigantic": "ADJ", "sundaes": "NOUN", "boost": "NOUN", "nazareth": "PROPN", "workout": "NOUN", "scorpio": "PROPN", "consumes": "VERB", "athletic": "ADJ", "buying": "VERB", "trilby": "NOUN", "colonials": "NOUN", "sacramento": "PROPN", "wenner": "PROPN", "vain": "ADJ", "guaranteeing": "VERB", "guider": "NOUN", "easterners": "NOUN", "mgr...@usa.pipeline.com": "PROPN", "pandorans": "PROPN", "scoreboard": "NOUN", "heifers": "NOUN", "emachines": "PROPN", "incorrectly": "ADV", "camera": "NOUN", "age": "NOUN", "valve": "NOUN", "represents": "VERB", "hawker": "PROPN", "feisty": "ADJ", "flowing": "VERB", "dedicated": "ADJ", "m.d.": "PROPN", "1662": "NUM", "theological": "ADJ", "uhh": "INTJ", "gracie": "PROPN", "deterioration": "NOUN", "leagues": "NOUN", "upper": "ADJ", "companie$": "NOUN", "bunny": "PROPN", "breast": "NOUN", "secured": "VERB", "govern": "VERB", "englishman": "NOUN", "lounge": "NOUN", "locomotion": "NOUN", "973-2776": "NUM", "insert": "VERB", "grid": "NOUN", "defector": "NOUN", "bowie": "PROPN", "roared": "VERB", "amend": "VERB", "tunnels": "NOUN", "hottie": "NOUN", "intractable": "ADJ", "prosperity": "NOUN", "gulbuddin": "PROPN", "greenwich": "PROPN", "spell": "VERB", "shag": "PROPN", "yazid": "PROPN", "compliment": "NOUN", "man": "NOUN", "'scopes": "NOUN", "guantánamo": "PROPN", "margin": "NOUN", "upbringing": "NOUN", "religion": "NOUN", "flattered": "VERB", "guns": "NOUN", "resident": "NOUN", "snitch": "NOUN", "explaining": "VERB", "asymmetrical": "ADJ", "brent": "PROPN", "emerge": "VERB", "favorable": "ADJ", "monde": "PROPN", "sice": "SCONJ", "birkholm": "PROPN", "bewildering": "VERB", "clanged": "VERB", "relieved": "VERB", "thunderous": "ADJ", "slats": "NOUN", "fundamentalist": "ADJ", "1590's": "NOUN", "forgo": "VERB", "brase": "NOUN", "dine": "VERB", "mweta": "PROPN", "splash": "NOUN", "serving": "VERB", "stimuli": "NOUN", "assuring": "VERB", "quite": "ADV", "supermechanized": "VERB", "wilbur": "PROPN", "interpretation": "NOUN", "belongings": "NOUN", "conn.": "PROPN", "reinforcing": "VERB", "tow": "NOUN", "plumber": "NOUN", "calico": "NOUN", "maddening": "VERB", "mentions": "VERB", "5/1/01": "NUM", "coffins": "NOUN", "telephones": "NOUN", "creates": "VERB", "'ll": "AUX", "zealander": "NOUN", "sender": "NOUN", "separating": "VERB", "intermediate": "ADJ", "utc": "PROPN", "braman": "PROPN", "byron": "PROPN", "ingenuity": "NOUN", "conjointly": "ADV", "wit": "NOUN", "tweezers": "NOUN", "familiarity": "NOUN", "in": "ADP", "bandage": "NOUN", "w.": "PROPN", "phase": "NOUN", "lawlessness": "NOUN", "maps": "NOUN", "mizzen-mast": "NOUN", "trinidadian": "ADJ", "desultorily": "ADV", "harbouring": "VERB", "overs": "NOUN", "1987": "NUM", "masters": "NOUN", "150,000": "NUM", "medalist": "NOUN", "contemplating": "VERB", "distinctiveness": "NOUN", "snooty": "ADJ", "gallop": "PROPN", "pursuit": "NOUN", "nagaland": "PROPN", "miniature": "NOUN", "junlong": "PROPN", "vols": "NOUN", "undisclosed": "ADJ", "verbal": "ADJ", "successors": "NOUN", "hunter": "PROPN", "clumsy": "ADJ", "dialed": "VERB", "speed": "NOUN", "mitten": "PROPN", "warpspeed": "PROPN", "procurement": "NOUN", "pony": "NOUN", "floo": "NOUN", "stage": "NOUN", "ozymandias": "PROPN", "gillman": "PROPN", "chun": "PROPN", "bonnard": "PROPN", "shorthand": "NOUN", "be-all": "NOUN", "lina": "PROPN", "thirteenth": "ADJ", "jong": "PROPN", "laws": "NOUN", "ambassador": "PROPN", "interconnected": "ADJ", "weaker": "ADJ", "orientations": "NOUN", "mob.": "NOUN", "polio": "PROPN", "qaeda": "PROPN", "steven": "PROPN", "pratt": "PROPN", "swearing": "NOUN", "elimination": "NOUN", "1995": "NUM", "hibbs": "PROPN", "shandao": "PROPN", "mcfarlane": "PROPN", "integrated": "VERB", "tries": "VERB", "parallel": "ADJ", "1490s": "NOUN", "ridiculousness": "PROPN", "mail": "NOUN", "consulates": "NOUN", "bodyguards": "NOUN", "solemn": "ADJ", "program": "NOUN", "1851": "NUM", "05/01/2001": "NUM", "docs": "NOUN", "notion": "NOUN", "identifying": "VERB", "4153030": "NUM", "favorite": "ADJ", "1st": "ADJ", "frosting": "NOUN", "cucumber": "PROPN", "nonenforcement": "NOUN", "idol": "NOUN", "imperial": "ADJ", "corrupt": "ADJ", "eta": "NOUN", "inning": "NOUN", "frenzy": "NOUN", "swords": "NOUN", "ensures": "VERB", "comma": "NOUN", "wager": "NOUN", "resonate": "VERB", "singmaster": "PROPN", "translations": "NOUN", "shih": "PROPN", "hitched": "VERB", "dill": "NOUN", "11/03": "NUM", "bleary": "ADJ", "6/1/01": "NUM", "acquire": "VERB", "announced": "VERB", "prosthetic": "ADJ", "subvert": "VERB", "abandoned": "VERB", "stateless": "ADJ", "ferjani": "PROPN", "slate": "PROPN", "fixes": "NOUN", "crowd": "NOUN", "pi": "PROPN", "scorpion": "NOUN", "aquarius": "PROPN", "pants": "NOUN", "longitude": "NOUN", "extradited": "VERB", "alexandre": "PROPN", "mailto:galen.torneby@nepco.com": "PROPN", "wanted": "VERB", "publicly": "ADV", "kin": "PROPN", "diving": "NOUN", "sandy": "PROPN", "condemnation": "NOUN", "wherever": "ADV", "art.": "NOUN", "truffaut": "PROPN", "avoid": "VERB", "settlers": "NOUN", "gloves": "NOUN", "sierra": "PROPN", "taint": "NOUN", "nsa": "PROPN", "chalked": "VERB", "mid-town": "NOUN", "intellectual": "ADJ", "antigua": "PROPN", "goals": "NOUN", "3.1": "NUM", "exhausted": "ADJ", "genevieve": "PROPN", "encampment": "NOUN", "lorry": "NOUN", "brampton": "PROPN", "programmer": "NOUN", "crisp": "ADJ", "orchestras": "NOUN", "vincenti": "PROPN", "rust": "ADJ", "by-and-by": "ADV", "detachment": "NOUN", "soo": "ADV", "observable": "ADJ", "plants": "NOUN", "arrives": "VERB", "arp": "PROPN", "krueger": "PROPN", "drunken": "ADJ", "brandy": "NOUN", "yearly": "ADJ", "debit": "NOUN", "sentimental": "ADJ", "cascading": "VERB", "reasons": "NOUN", "reverent": "ADJ", "barns": "NOUN", "scent": "NOUN", "wanton": "ADJ", "'re": "AUX", ".....................": "PUNCT", "reduction": "NOUN", "sunless": "ADJ", "respondents": "NOUN", "defamation": "NOUN", "pausing": "VERB", "compete": "VERB", "margaritas": "NOUN", "blatantly": "ADV", "945": "NUM", "bigger": "ADJ", "crushing": "VERB", "praying": "VERB", "destroyed": "VERB", ":(": "SYM", "breakthroughs": "NOUN", "geologists": "NOUN", "bulb": "NOUN", "genealogy": "NOUN", "lobbyist": "NOUN", "arguments": "NOUN", "103": "NUM", "svendborg": "PROPN", "repsitun": "PROPN", "civility": "NOUN", "walkin": "VERB", "pilgrims": "NOUN", "vicious": "ADJ", "pursue": "VERB", "1560": "NUM", "lane": "NOUN", "ponce": "PROPN", "km": "NOUN", "anger": "NOUN", "catholicism": "NOUN", "framenet": "PROPN", "confer": "ADJ", "platted": "VERB", "whir": "VERB", "marquez": "PROPN", "indication": "NOUN", "jemison": "PROPN", "faithfully": "ADV", "petronios": "PROPN", "dugway": "PROPN", "issac": "PROPN", "seen": "VERB", "countries": "NOUN", "strode": "VERB", "spacetoday.net": "PROPN", "uninteresting": "ADJ", "sandra": "PROPN", "pewter": "NOUN", "fathers": "NOUN", "p": "NOUN", "greeting": "NOUN", "varietal": "NOUN", "profession": "NOUN", "reparcelling": "NOUN", "ventilation": "NOUN", "guiding": "VERB", "highness": "NOUN", "ruin": "VERB", "sage": "ADJ", "preconceptions": "NOUN", "vaisseau": "PROPN", "arkansas": "PROPN", "nope": "INTJ", "buffet": "NOUN", "address": "NOUN", "tx": "PROPN", "16s": "NOUN", "discrediting": "NOUN", "delighted": "ADJ", "addiction": "NOUN", "yogi": "PROPN", "ld2d-#69334-1.doc": "NOUN", "sunday": "PROPN", "concession": "NOUN", "bakeries": "NOUN", "curveball": "PROPN", "1:45": "NUM", "thomas": "PROPN", "humankind": "NOUN", "v.": "PROPN", "64.2": "NUM", "t'ho": "PROPN", "biked": "VERB", "plucked": "VERB", "http://www.21stcenturysciencetech.com/articles/chernobyl.html": "PROPN", "2017": "NUM", "gipsy": "NOUN", "tavern": "NOUN", "hal": "PROPN", "troubled": "ADJ", "venues": "NOUN", "vintage": "NOUN", "lindh": "PROPN", "spawn": "VERB", "catacombs": "NOUN", "reeds": "NOUN", "crude": "NOUN", "demurrage": "NOUN", "bodyless": "ADJ", "glass-fronted": "ADJ", "curated": "VERB", "summed": "VERB", "appalled": "VERB", "where-ever": "ADV", "microcomputer": "NOUN", "345-3436": "NUM", "los": "PROPN", "kid": "NOUN", "application": "NOUN", "canibal": "PROPN", "retaliate": "VERB", "5/18": "NUM", "maviglio": "PROPN", "nameless": "ADJ", "brushes": "NOUN", "puk": "PROPN", "mudo": "PROPN", "onion": "PROPN", "exists": "VERB", "superhero": "NOUN", "d'etat": "NOUN", "scissors": "NOUN", "hopefuls": "NOUN", "eventually": "ADV", "hooptie": "NOUN", "cleanup": "NOUN", "signatories": "NOUN", "daphnia": "NOUN", "election": "NOUN", "offs": "NOUN", "raging": "VERB", "stand": "VERB", "output": "NOUN", "vom": "NOUN", "adjusted": "VERB", "ordinary": "ADJ", "axe": "NOUN", "9:00": "NUM", "puppet": "NOUN", "aids": "NOUN", "cooperation": "NOUN", "(countries|regions)": "NOUN", "arts": "NOUN", "crapfest": "NOUN", "jokes": "NOUN", "ed.": "NOUN", "1930": "NUM", "households": "NOUN", "rohingya": "PROPN", "growing": "VERB", "joe": "PROPN", "10": "NUM", "publications": "NOUN", "position": "NOUN", "passionately": "ADV", "rapporteurs": "NOUN", "statutory": "ADJ", "nurse": "NOUN", "smarter": "ADJ", "subject": "NOUN", "draping": "VERB", "713/853-6197": "NUM", "lighten": "VERB", "fannin": "PROPN", "germans": "NOUN", "glitter": "NOUN", "manne": "PROPN", "noun": "NOUN", "10.1": "NUM", "off-": "NOUN", "vossen": "PROPN", "holiday": "NOUN", "collaged": "ADJ", "accurate": "ADJ", "permissive": "ADJ", "blades": "NOUN", "swarthy": "ADJ", "arvn": "PROPN", "cookin'": "VERB", "paseo": "PROPN", "evolve": "VERB", "radar": "NOUN", "disagreed": "VERB", "owwww": "INTJ", "te": "PROPN", "left-over": "ADJ", "lautrec": "PROPN", "imposters": "NOUN", "leopold": "PROPN", "dietrich": "PROPN", "1300": "NUM", "minded": "ADJ", "rut": "NOUN", "easthampton": "PROPN", "45,756": "NUM", "siméon": "PROPN", "ebola": "PROPN", "catholic": "ADJ", "fouling": "VERB", "warrant": "VERB", "reluctantly": "ADV", "seriously": "ADV", "odaras": "PROPN", "accidental": "ADJ", "amiriya": "PROPN", "coordinate": "NOUN", "fuel": "NOUN", "tana": "PROPN", "yiddish": "NOUN", "misogyny": "NOUN", "impeccable": "ADJ", "hiroshima": "PROPN", "inheritance": "NOUN", "redeems": "VERB", "popularized": "VERB", "astride": "ADP", "states": "PROPN", "dislocate": "VERB", "adele": "PROPN", "specifically": "ADV", "community": "NOUN", "storms": "NOUN", "recorded": "VERB", "corrections": "NOUN", "synch": "NOUN", "amateur": "NOUN", "billing": "NOUN", "grandeur": "NOUN", "fitful": "ADJ", "zombie": "NOUN", "seats": "NOUN", "programming": "NOUN", "jubur": "PROPN", "#advice": "PROPN", "amy.cornell@compaq.com": "PROPN", "systemic": "ADJ", "http://digon_va.tripod.com/chernobyl.htm": "PROPN", "complacent": "ADJ", "big": "ADJ", "citral": "NOUN", "obsf": "NOUN", "ache": "NOUN", "concert": "NOUN", "kits": "NOUN", "1.428,000": "NUM", "server": "NOUN", "programmed": "VERB", "prefers": "VERB", "judgement": "NOUN", "managing": "VERB", "axis": "NOUN", "withdrawing": "VERB", "having": "VERB", "bodyworker": "NOUN", "florist": "NOUN", "hairdresser": "NOUN", "manifestations": "NOUN", "pathological": "ADJ", "ablest": "ADJ", "cruelty": "NOUN", "keystone": "NOUN", "explained": "VERB", "jeez": "INTJ", "mighty": "ADJ", "studios": "NOUN", "furnace": "NOUN", "fellas": "NOUN", "lisenced": "ADJ", "plo-": "INTJ", "generally": "ADV", "11:00": "NUM", "stranded": "VERB", "perfume": "NOUN", "suerat": "PROPN", "dejesús": "PROPN", "residing": "VERB", "imprint": "NOUN", "stretched": "VERB", "nazis": "NOUN", "elpaso": "PROPN", "amounts": "NOUN", "quieter": "ADJ", "foundation": "PROPN", "intensive": "ADJ", "unearthed": "VERB", "guv": "NOUN", "posture": "NOUN", "puke": "VERB", "views": "NOUN", "stonily": "ADV", "any1": "PRON", "assembled": "VERB", "elena": "PROPN", "feeds": "VERB", "1q": "NOUN", "cropped": "VERB", "someon": "PRON", "nodes": "NOUN", "file": "NOUN", "plugs": "NOUN", "dunderheads": "NOUN", "apocalyptic": "ADJ", "rider": "NOUN", "cooler": "ADJ", "maoists": "PROPN", "rossi": "PROPN", "strikingly": "ADV", "trustee": "NOUN", "dursley": "PROPN", "nicholas": "PROPN", "devoid": "ADJ", "tfs": "NOUN", "grenada": "PROPN", "recognized": "VERB", "offering": "VERB", "freud": "PROPN", "manipur": "PROPN", "fernández": "PROPN", "mistaken": "ADJ", "7037686710": "NUM", "socio-economic": "ADJ", "driving": "VERB", "unfixed": "ADJ", "cropduster": "NOUN", "realty": "PROPN", "webpage": "NOUN", "hawaiʻi": "PROPN", "quaffle": "NOUN", "admit": "VERB", "n-": "INTJ", "supposition": "NOUN", "fiona": "PROPN", "preferences": "NOUN", "quarterly": "ADJ", "journalism": "NOUN", "talkboys": "PROPN", "hardcore": "ADJ", "jewels": "NOUN", "waned": "VERB", "injury": "NOUN", "1530": "NUM", "eatin": "VERB", "muni": "PROPN", "remain": "VERB", "jet": "NOUN", "momentous": "ADJ", "buckling": "VERB", "tks": "NOUN", "fireplaces": "NOUN", "ph": "NOUN", "producer": "NOUN", "spree": "NOUN", "macho": "ADJ", "peculiar": "ADJ", "worthwhile": "ADJ", "encouraging": "VERB", "launcher": "PROPN", "contend": "VERB", "miserable": "ADJ", "architect": "NOUN", "feeling": "VERB", "...": "PUNCT", "flawless": "ADJ", "anti-americanism": "NOUN", "downpour": "NOUN", "nedwick": "PROPN", "navigated": "VERB", "preference": "NOUN", "e-mail": "NOUN", "wel": "INTJ", "elegance": "NOUN", "high-octave": "NOUN", "autumn": "NOUN", "knotted": "VERB", "reassure": "VERB", "extremes": "NOUN", "airplane": "NOUN", "hosted": "VERB", "havoc": "NOUN", "hollyłódź": "PROPN", "developers": "NOUN", "2.9": "NUM", "resturant": "NOUN", "up-river": "NOUN", "institute": "PROPN", "development": "NOUN", "strangely": "ADV", "twenty-two": "NUM", "honorific": "ADJ", "receives": "VERB", "bullfights": "NOUN", "fervent": "ADJ", "plentiful": "ADJ", "back": "ADV", "exciting": "ADJ", "calmest": "ADJ", "obvious": "ADJ", "mek": "PROPN", "unhappy": "ADJ", "sickest": "ADJ", "chili": "NOUN", "penalty": "NOUN", "unruly": "ADJ", "homage": "NOUN", "50,000th": "ADJ", "stale": "ADJ", "location": "NOUN", "gloriously": "ADV", "arterial": "ADJ", "utmost": "ADJ", "disciplined": "ADJ", "sprdopt": "NOUN", "lessig": "PROPN", "dropout": "NOUN", "laboratorio": "PROPN", "scrummy": "ADJ", "valeska": "PROPN", "lots": "NOUN", "city": "NOUN", "parasite": "NOUN", "1865": "NUM", "uncongenial": "ADJ", "childhood": "NOUN", "sensational": "ADJ", "emigrated": "VERB", "korea": "PROPN", "conflict": "NOUN", "clashes": "NOUN", "guardian": "NOUN", "shutter": "NOUN", "avignon": "PROPN", "kraków": "PROPN", "baggy": "ADJ", "example": "NOUN", "requisite": "NOUN", "crucible": "NOUN", "twig": "PROPN", "ci": "PROPN", "tosses": "VERB", "hostilities": "NOUN", "mechanic": "NOUN", "cross-legged": "ADJ", "duncan": "PROPN", "re-embarking": "VERB", "tag": "NOUN", "amy": "PROPN", "bombs": "NOUN", "thriving": "ADJ", "thirty": "NUM", "java": "PROPN", "success": "NOUN", "rochester": "PROPN", "revelations": "NOUN", "panko": "NOUN", "crooked": "ADJ", "doorway": "NOUN", "salary": "NOUN", "slowly": "ADV", "proposals": "NOUN", "sadness": "NOUN", "advancing": "VERB", "biased": "ADJ", "448-9499": "NUM", "monarchies": "NOUN", "deficit": "NOUN", "translate": "VERB", "dan": "PROPN", "rental": "NOUN", "bashing": "NOUN", "parkhill": "PROPN", "1101": "NUM", "consumer": "NOUN", "imperiled": "VERB", "nuria_r_ibarra@calpx.com": "PROPN", "worse": "ADJ", "gui": "NOUN", "hated": "VERB", "spine": "NOUN", "mid-20s": "NOUN", "structure": "NOUN", "joystick": "NOUN", "crabs": "PROPN", "lime": "NOUN", "mantids": "NOUN", "hostility": "NOUN", "lawsuits": "NOUN", "insisting": "VERB", "muddle": "VERB", "equipment": "NOUN", "edged": "ADJ", "zealot": "NOUN", "coherence": "NOUN", "mart": "PROPN", "issues": "NOUN", "lanka": "PROPN", "ailments": "NOUN", "doctorow": "PROPN", "effected": "VERB", "story": "NOUN", "salvation": "NOUN", "chemist": "NOUN", "height": "NOUN", "leaderships": "NOUN", "loretta": "PROPN", "http://www.cic.gc.ca/english/index.asp": "PROPN", "pinkness": "NOUN", "prepayments": "NOUN", "fairly": "ADV", "bridge": "NOUN", "marino": "PROPN", "lope": "VERB", "favor": "NOUN", "ironically": "ADV", "implants": "NOUN", "largely": "ADV", "motoko": "PROPN", "rauschenberg": "PROPN", "contagious": "ADJ", "leapt": "VERB", "trashy": "ADJ", "emphatically": "ADV", "soul": "NOUN", "spin": "NOUN", "fingered": "VERB", "neal": "PROPN", "configurations": "NOUN", "lasts": "VERB", "http://www.mikegigi.com/firehole.htm": "PROPN", "ligaments": "NOUN", "tiberias": "PROPN", "microcosm": "NOUN", "explicitly": "ADV", "adverse": "ADJ", "cherokee": "PROPN", "whether": "SCONJ", "noses": "NOUN", "marvelous": "ADJ", "12/26/2000": "NUM", "deli": "NOUN", "bruised": "VERB", "championship": "NOUN", "dodging": "VERB", "leaps": "NOUN", "uvb": "NOUN", "tales": "NOUN", "bisquits": "NOUN", "dispose": "VERB", "oscar": "PROPN", "wrocław": "PROPN", "supervision": "NOUN", "detestable": "ADJ", "fame": "NOUN", "condos": "NOUN", "burdensome": "ADJ", "shovelling": "VERB", "caramel": "NOUN", "evenings": "NOUN", "fighting": "VERB", "poured": "VERB", "aggregators": "NOUN", "willing": "ADJ", "ma": "NOUN", "bonds": "NOUN", "sponsors": "VERB", "sizing": "VERB", "rubbish": "NOUN", "25,000": "NUM", "nuremberg": "PROPN", "twist": "NOUN", "destructive": "ADJ", "annually": "ADV", "purpose": "NOUN", "coppergate": "PROPN", "forethought": "NOUN", "1.65": "NUM", "daunting": "ADJ", "tonne": "NOUN", "1520s": "NOUN", "eol": "PROPN", "tasked": "VERB", "leaning": "VERB", "defiled": "VERB", "113": "NUM", "delusions": "NOUN", "'em": "PRON", "defender": "NOUN", "fuelcell": "PROPN", "signalling": "NOUN", "sudan": "PROPN", "correction": "NOUN", "confuse": "VERB", "understood": "VERB", "lawyers": "NOUN", "grunt": "NOUN", "american": "ADJ", "jokingly": "ADV", "landmines": "NOUN", "guerrillas": "NOUN", "grows": "VERB", "1966": "NUM", "galway": "PROPN", "banishing": "NOUN", "slapped": "VERB", "revenge": "NOUN", "curtain": "NOUN", ">----------------------------------------------------------------------------|": "PUNCT", "345": "NUM", "tussock": "NOUN", "neocons": "NOUN", "hell": "NOUN", "engaging": "VERB", "rage": "NOUN", "combs": "NOUN", "frankfurt": "PROPN", "leon.branom@enron.com": "PROPN", "shrapnel": "NOUN", "hamill": "PROPN", "communities": "NOUN", "wop": "NOUN", "diode": "NOUN", "infinite": "ADJ", "pies": "NOUN", "quiktrip": "PROPN", "zach": "PROPN", "dies": "VERB", "scholarly": "ADJ", "sunni": "ADJ", "5:19": "NUM", "purposefully": "ADV", "invite": "VERB", "itza": "PROPN", "hill": "NOUN", "gallie": "PROPN", "mad": "ADJ", "intends": "VERB", "collaborations": "NOUN", "optimization": "NOUN", "risky": "ADJ", "relocating": "VERB", "calaria": "PROPN", "scam": "NOUN", "74419": "NUM", "atmosphere": "NOUN", "poisoning": "NOUN", "spayed": "VERB", "portland": "PROPN", "ryder": "PROPN", "luckily": "ADV", "anasthesia": "NOUN", "totaling": "VERB", "defied": "VERB", "overcharge": "VERB", "thinned": "VERB", "woollies": "NOUN", "phnoum": "PROPN", "marvel": "PROPN", "singular": "ADJ", "1904": "NUM", "referee": "NOUN", "wands": "NOUN", "polykron": "PROPN", "genome": "NOUN", "photoscape": "PROPN", "strasse": "PROPN", "sustained": "ADJ", "jets": "NOUN", "footwear": "NOUN", "windmills": "NOUN", "chao": "PROPN", "rusted": "VERB", "slacken": "VERB", "kazakhstan": "PROPN", "assess": "VERB", "marshes": "NOUN", "hemistichs": "NOUN", "processional": "ADJ", "cooling": "NOUN", "clap": "VERB", "renata": "PROPN", "uv": "NOUN", "complain": "VERB", "seventy": "NUM", "bbc": "PROPN", "trillion": "NUM", "milton": "PROPN", "corssing": "NOUN", "red": "ADJ", "werner": "PROPN", "persuade": "VERB", "ollie": "PROPN", "annex": "NOUN", "extinctions": "NOUN", "ladder": "NOUN", "fulfill": "VERB", "risked": "VERB", "flimsy": "ADJ", "unhooked": "VERB", "immanuel": "PROPN", "valley": "NOUN", "silicone": "NOUN", "x35172": "NOUN", "dumbfounded": "ADJ", "warmth": "NOUN", "system32": "NOUN", "marked": "VERB", "mishandling": "NOUN", "mid-2004": "NOUN", "beguiled": "VERB", "tie": "NOUN", "moses": "PROPN", "southward": "ADV", "distinguished": "ADJ", "qalansia": "PROPN", "definition": "NOUN", "felix": "PROPN", "arafat": "PROPN", "batter": "NOUN", "?!?": "PUNCT", "baffin": "PROPN", "flopped": "VERB", "steadily": "ADV", "pan-democratic": "ADJ", "reads": "VERB", "ray": "PROPN", "crew": "NOUN", "antarctica": "PROPN", "emphasize": "VERB", "mod": "PROPN", "punch": "NOUN", "distinctions": "NOUN", "gaming": "NOUN", "resumption": "NOUN", "educated": "VERB", "03": "NUM", "lunch": "NOUN", "palpitating": "VERB", "04": "NUM", "bdsm": "NOUN", "performed": "VERB", "supporters": "NOUN", "grounded": "VERB", "sausage": "NOUN", "peels": "NOUN", "dunno": "VERB", "scooped": "VERB", "bustle": "NOUN", "attending": "VERB", "paralyzed": "VERB", "polk": "PROPN", "cruden": "PROPN", "indexing": "VERB", "absurd": "ADJ", "matilda": "PROPN", "sussex": "NOUN", "operating": "VERB", "turks": "PROPN", "emona": "PROPN", "venturing": "VERB", "intake": "NOUN", "2.2": "NUM", "juste": "PROPN", "flea": "NOUN", "clones": "NOUN", "rubbed": "VERB", "devries": "PROPN", "duration": "NOUN", "privacy": "NOUN", "appliances": "NOUN", "erased": "ADJ", "pendulum": "NOUN", "hulk": "NOUN", "formalized": "VERB", "fitting": "ADJ", "http://loveallpeople.org/usconstitutiona.txt": "PROPN", "com": "NOUN", "accomplices": "NOUN", "salmon": "NOUN", "900": "NUM", "atoms": "NOUN", "udcs": "NOUN", "naked": "ADJ", "lipton": "PROPN", "interfere": "VERB", "scientific": "ADJ", "ideas": "NOUN", "pistorius": "PROPN", "derivatives": "NOUN", "might": "AUX", "problems": "NOUN", "specimen": "NOUN", "mesmerized": "VERB", "bernardini": "PROPN", "acidity": "NOUN", "preparing": "VERB", "baling": "VERB", "boxing": "NOUN", "sanctified": "PROPN", "min": "NOUN", "suspense": "NOUN", "authorities": "NOUN", "fluffy": "ADJ", "co": "PROPN", "including": "VERB", "chromosome": "NOUN", "disappointed": "ADJ", "'": "PUNCT", "persistency": "NOUN", "uncoiled": "ADJ", "gels": "NOUN", "roundtable": "NOUN", "imitation": "NOUN", "gloomy": "ADJ", "3": "NUM", "nb": "PROPN", "curfew": "NOUN", "complained": "VERB", "regimen": "NOUN", "confronted": "VERB", "government": "NOUN", "tarantula": "NOUN", "finns": "NOUN", "misstated": "VERB", "earthworms": "NOUN", "number": "NOUN", "mouthing": "ADJ", "laborer": "NOUN", "audiobooks": "NOUN", "referencing": "VERB", "wtc": "PROPN", "leader": "NOUN", "antifreeze": "NOUN", "mapplethorpe": "PROPN", "grayish-whitish": "ADJ", "sandalwood": "NOUN", "tributaries": "NOUN", "slush": "NOUN", "archibald": "PROPN", "manned": "ADJ", "intolerance": "NOUN", "1872": "NUM", "hierarchies": "NOUN", "palestinian": "ADJ", "problem": "NOUN", "whittle": "VERB", "mandil": "PROPN", "destroy": "VERB", "demands": "NOUN", "presenting": "VERB", "plus": "CCONJ", "dusty": "ADJ", "institution": "NOUN", "gratefully": "ADV", "indicator": "NOUN", "desk": "NOUN", "openai": "PROPN", "spanning": "VERB", "threatened": "VERB", "cherry": "PROPN", "chin": "PROPN", "depressed": "ADJ", "8.25": "NUM", "lemony": "ADJ", "omnibus": "NOUN", "scandals": "NOUN", "botanicals": "NOUN", "atmospheric": "ADJ", "tests": "NOUN", "implication": "NOUN", "ristorante": "PROPN", "borrowings": "NOUN", "children": "NOUN", "scottish": "ADJ", "revenues": "NOUN", "ctrl–v": "PROPN", "pgt": "NOUN", "st.": "PROPN", "genders": "NOUN", "conformity": "NOUN", "dueled": "VERB", "rip": "NOUN", "ss-n-22": "PROPN", "east": "PROPN", "excerpts": "NOUN", "chart": "NOUN", "oglethorpe": "PROPN", "ranged": "VERB", "pressed": "VERB", "snowboard": "NOUN", "chemicals": "NOUN", "faretta": "PROPN", "doubtless": "ADV", "bumping": "VERB", "solar": "ADJ", "decking": "NOUN", "77030-2707": "NUM", "dammit": "INTJ", "silkie": "NOUN", "franc": "PROPN", "punctuation": "NOUN", "pjm": "PROPN", "http://news.yahoo.com/nestl-purina-releases-commercial-aimed-dogs-183443091.html": "PROPN", "somewhere": "ADV", "muttered": "VERB", "eighties": "NOUN", "rebels": "NOUN", "04:13": "NUM", "fossil": "NOUN", "galileo": "PROPN", "contaminated": "VERB", "mist": "NOUN", "hoecker": "PROPN", "scaly": "ADJ", "awash": "ADJ", "peaks": "NOUN", "formalin": "NOUN", "kidnappings": "NOUN", "chatter": "NOUN", "×": "SYM", "integrates": "VERB", "emissions": "NOUN", "shuffling": "ADJ", "orginals": "NOUN", "sauces": "NOUN", "misunderstood": "VERB", "leite": "PROPN", "redeeming": "ADJ", "full-length": "ADJ", "palestine": "PROPN", "shorter": "ADJ", "resupply": "NOUN", "non-european": "ADJ", "waging": "VERB", "1965": "NUM", "somethin": "PRON", "principles": "NOUN", "http://youtube.com/watch?v=d46_ctqdmi4": "PROPN", "broomstick": "NOUN", "biblical": "ADJ", "polka": "NOUN", "metro.us": "PROPN", "postive": "ADJ", "disarm": "VERB", "12:45": "NUM", "interface": "NOUN", "tone": "NOUN", "employer": "NOUN", "severely": "ADV", "202.739.0134": "NUM", "armogida": "PROPN", "delusion": "NOUN", "wai": "NOUN", "baskets": "NOUN", "moorland": "NOUN", "bearing": "VERB", "explode": "VERB", "fraction": "NOUN", "husband": "NOUN", "05/17/99": "NUM", "503/464-7927": "NUM", "main": "ADJ", "mcneally": "PROPN", "kiddies": "NOUN", "stricken": "ADJ", "punchline": "NOUN", "vigor": "NOUN", "shoppers": "NOUN", "escape": "VERB", "9000": "NUM", "bust": "VERB", "observant": "ADJ", "350,000": "NUM", "appropriations": "NOUN", "brinkmanship": "NOUN", "teco": "PROPN", "finches": "NOUN", "biologically": "ADV", "tabennese": "PROPN", "coup-d'etat": "NOUN", "fuels": "NOUN", "excavations": "NOUN", "filmmaker": "NOUN", "capsules": "NOUN", "brilliantly": "ADV", "checkerspot": "NOUN", "01:39:56": "NUM", "partnered": "VERB", "net": "NOUN", "fehl": "PROPN", "mcinnis": "PROPN", "trifurcation": "NOUN", "novel": "NOUN", "s-": "INTJ", "lavan": "PROPN", "1936": "NUM", "mumbai": "PROPN", "parents": "NOUN", "2710": "NUM", "settled": "VERB", "crazier": "ADJ", "pricing": "NOUN", "mary": "PROPN", "meiko": "PROPN", "siwu": "PROPN", "overcoming": "VERB", "hazim": "PROPN", "highlands": "NOUN", "submersion": "NOUN", "kindergarten": "NOUN", "blows": "VERB", "substantially": "ADV", "applies": "VERB", "1400": "NUM", "16/11/2004": "NUM", "covid": "PROPN", "visualize": "VERB", ":/": "SYM", "swiffer": "PROPN", "calligraphic": "ADJ", "apparently": "ADV", "omnipotent": "ADJ", "flavorful": "ADJ", "comex": "PROPN", "stunning": "ADJ", "genotype": "NOUN", "conservation": "NOUN", "half": "NOUN", "morris": "PROPN", "shrodinger": "PROPN", "pixar": "PROPN", "backward": "ADV", "mandelstams": "PROPN", "boast": "VERB", "dumas": "PROPN", "glacier": "PROPN", "picked": "VERB", "femoral": "ADJ", "predestined": "VERB", "canoeing": "VERB", "antecedent": "NOUN", "indirectly": "ADV", "outs": "NOUN", "vacuum": "NOUN", "sepulchres": "NOUN", "refund": "NOUN", "a19": "PROPN", "machine-like": "ADJ", "decoupled": "VERB", "realms": "NOUN", "snails": "NOUN", "basking": "NOUN", "virility": "NOUN", "snapshot": "NOUN", "impunity": "NOUN", "rssc.com": "PROPN", "islam": "PROPN", "midst": "NOUN", "litten": "VERB", "originally": "ADV", "assigned": "VERB", "dinner": "NOUN", "efficiency": "NOUN", "anchor": "NOUN", "worn": "VERB", "#logos": "PROPN", "presently": "ADV", "sands": "PROPN", "republics": "NOUN", "petco": "PROPN", "atal": "PROPN", "stubley": "PROPN", "affirmative": "ADJ", "scripture": "PROPN", "femur": "NOUN", "padded": "ADJ", "expired": "ADJ", "fullest": "ADJ", "minster": "PROPN", "circular": "ADJ", "http://www.wyndham.com/washington_dc/default.cfm": "PROPN", "45r.p.m.": "NOUN", "generative": "ADJ", "adequate": "ADJ", "greenery": "NOUN", "procreating": "VERB", "dolomite": "NOUN", "authoring": "ADJ", "draft": "NOUN", "caesarea": "PROPN", "surprisingly": "ADV", "dublin": "PROPN", "snowdon": "PROPN", "hayek": "PROPN", "beast": "PROPN", "roots": "NOUN", "erin": "PROPN", "bataan": "PROPN", "non-personal": "ADJ", "1836": "NUM", "substituting": "VERB", "sstaff": "NOUN", "flapping": "VERB", "prematurely": "ADV", "interns": "NOUN", "315-460-3349": "NUM", "returning": "VERB", "capitalization": "NOUN", "136": "NUM", "hiv": "PROPN", "outermost": "ADJ", "aqueducts": "NOUN", "invoking": "VERB", "dthat": "DET", "whasssup": "INTJ", "atkins": "PROPN", "shadows": "NOUN", "generations": "NOUN", "envelops": "VERB", "barrels": "NOUN", "chatting": "VERB", "ideals": "NOUN", "biographical": "ADJ", "collusion": "NOUN", "biomed.taiwan": "PROPN", "submitted": "VERB", "poised": "VERB", "restrictions": "NOUN", "played": "VERB", "un": "PROPN", "ill-placed": "ADJ", "--------------------------------------------------": "PUNCT", "contain": "VERB", "sahaf": "PROPN", "rub": "VERB", "focus": "NOUN", "are": "AUX", "boring": "ADJ", "twelve": "NUM", "3067": "NUM", "deep": "ADJ", ":.": "PUNCT", "crimea": "PROPN", "edition": "NOUN", "1588": "NUM", "alacrity": "NOUN", "clifford": "PROPN", "confessed": "VERB", "hurdles": "NOUN", "harley": "PROPN", "knowledge": "NOUN", "debate": "NOUN", "sliced": "VERB", "surrender": "NOUN", "quitting": "VERB", "shake": "VERB", "obligation": "NOUN", "dude": "NOUN", "4.5": "NUM", "dvd": "NOUN", "oracle": "PROPN", "collars": "NOUN", "digital": "ADJ", "beyond": "ADP", "sunscreen": "NOUN", "underlined": "VERB", "pilgrimage": "NOUN", "mukhabarat": "PROPN", "fleshy": "ADJ", "grasp": "VERB", "airing": "VERB", "dos": "NOUN", "sabeer": "PROPN", "deputy": "NOUN", "magnet": "NOUN", "virtues": "NOUN", "713/646-6505": "NUM", "refiners": "NOUN", "witting": "ADJ", "permanent": "ADJ", "wallowing": "VERB", "97th": "ADJ", "chains": "NOUN", "myriad": "ADJ", "8:35": "NUM", "ἱερώνυμος": "PROPN", "overlooking": "VERB", "react": "VERB", "stretchy": "ADJ", "investigator": "NOUN", "allowance": "PROPN", "boulevards": "NOUN", "dawa": "PROPN", "growled": "VERB", "illustrate": "VERB", "starless": "ADJ", "detour": "NOUN", "ps": "NOUN", "victims": "NOUN", "scored": "VERB", "stated": "VERB", "how": "ADV", "suggestion": "NOUN", "obama": "PROPN", "darkening": "VERB", "outcrops": "NOUN", "lacking": "VERB", "eboracum": "PROPN", "vic": "PROPN", "santos": "PROPN", "asterisk": "NOUN", "sussman": "PROPN", "sweetser": "PROPN", "liz": "PROPN", "multi-millionnaires": "NOUN", "willingness": "NOUN", "daydreaming": "VERB", "solitude": "NOUN", "2.": "NUM", "refugees": "NOUN", "lao": "PROPN", "plurality": "NOUN", "empress": "PROPN", "course": "NOUN", "burden": "NOUN", "most": "ADV", "hates": "VERB", "api": "NOUN", "bechtel": "PROPN", "manifold": "NOUN", "spalding": "PROPN", "savings": "NOUN", "geopolitical": "ADJ", "classical": "ADJ", "constitutes": "VERB", "tables": "NOUN", "addicts": "NOUN", "rumours": "NOUN", "flabby": "ADJ", "gleaming": "VERB", "eureka": "PROPN", "unmanned": "ADJ", "ponder": "VERB", "sympathize": "VERB", "painless": "ADJ", "consciously": "ADV", "dems": "PROPN", "afford": "VERB", "tailor": "NOUN", "burrowing": "VERB", "elder": "ADJ", "justice": "NOUN", "aplo.": "NOUN", "lodging": "NOUN", "01:14": "NUM", "illusion": "NOUN", "depths": "NOUN", "sergeant": "NOUN", "litely": "ADV", "reich": "PROPN", "ronald": "PROPN", "ach": "INTJ", "properties": "NOUN", "festivals": "NOUN", "frowns": "NOUN", "ram": "PROPN", "joyous": "ADJ", "prayerful": "ADJ", "chanukah": "PROPN", "icc": "NOUN", "delicate": "ADJ", "mhm": "INTJ", "mistrust": "NOUN", "lsd": "NOUN", "gonzales": "PROPN", "tatum": "PROPN", "chimed": "VERB", "punitive": "ADJ", "den": "PROPN", "scowl": "NOUN", "kawashima": "PROPN", "invovled": "VERB", "humvees": "PROPN", "gulliver": "PROPN", "precedence": "NOUN", "amnesties": "NOUN", "enjoyment": "NOUN", "620-294-4000": "NUM", "traits": "NOUN", "reactive": "ADJ", "1787": "NUM", "projects": "NOUN", "separated": "VERB", "nail": "NOUN", "philipinos": "PROPN", "brit": "PROPN", "ncrc4me": "PROPN", "wired": "VERB", "exclaimed": "VERB", "nordau": "PROPN", "hbs": "PROPN", "trundling": "VERB", "diane": "PROPN", "!?": "PUNCT", "snippets": "NOUN", "tse": "PROPN", "spit": "NOUN", "twigs": "NOUN", "alzheimer": "PROPN", "adoption": "NOUN", "terrorist": "ADJ", "tame": "VERB", "vile": "ADJ", "gate": "NOUN", "inhalation": "NOUN", "counties": "NOUN", "sternly": "ADV", "kit": "NOUN", "unlce": "NOUN", "gods": "NOUN", "libel": "NOUN", "03:00": "NUM", "associated": "VERB", "nose": "NOUN", "hogtied": "VERB", "seller": "NOUN", "wintering": "VERB", "qualifications": "NOUN", "stuffs": "NOUN", "be": "AUX", "!!!!!!!!!!!!": "PUNCT", "barbuda": "PROPN", "establish": "VERB", "tenet": "NOUN", "laplace": "PROPN", "handcraft": "NOUN", "bob": "PROPN", "tract": "NOUN", "evans": "PROPN", "23.6": "NUM", "aner": "PROPN", "pawn": "VERB", "ripple": "PROPN", "4350": "NUM", "puffing": "NOUN", "connections": "NOUN", "houses": "NOUN", "stadiums": "NOUN", "n.d.": "NOUN", "translates": "VERB", "shackled": "VERB", "inad": "PROPN", "atrocity": "NOUN", "revenue": "NOUN", "teaches": "VERB", "ineos.xls": "NOUN", "texture": "NOUN", "ramtanu": "PROPN", "hugs": "NOUN", "applied": "VERB", "momentum": "NOUN", "uncommon": "ADJ", "finn": "PROPN", "stolmy": "PROPN", "rover": "PROPN", "labs": "NOUN", "trireme": "NOUN", "easy": "ADJ", "warehouse": "NOUN", "breeds": "NOUN", "celebrities": "NOUN", "outing": "NOUN", "grizzly": "ADJ", "hypnosis": "NOUN", "sexually": "ADV", "disintegrate": "VERB", "unprecedented": "ADJ", "steering": "NOUN", "deliveries": "NOUN", "somehow": "ADV", "832.676.1329": "NUM", "summoned": "VERB", "litter": "NOUN", "old-maid": "NOUN", "opportunities": "NOUN", "levico": "PROPN", "gerbil": "NOUN", "wheels": "NOUN", "plywood": "NOUN", "miles": "NOUN", "additions": "NOUN", "terms": "NOUN", "puncturing": "VERB", "transform": "VERB", "rusty": "ADJ", "seventeenth": "ADJ", "mogadishu": "PROPN", "squirm": "VERB", "charm": "NOUN", "reachable": "ADJ", "exercising": "NOUN", "parakeets": "NOUN", "trams": "NOUN", "h=guys": "NOUN", "alastair": "PROPN", "cold": "ADJ", "torsional": "ADJ", "repeated": "VERB", "orienting": "VERB", "worldly": "ADJ", "bordered": "VERB", "chi-wai": "PROPN", "bruyne": "PROPN", "kicks": "VERB", "insistent": "ADJ", "styled": "VERB", "three": "NUM", "pleasing": "ADJ", "pedestal": "NOUN", "renigged": "VERB", "dredge": "VERB", "galleryfurniture.com": "PROPN", "backwards": "ADV", "reminding": "VERB", "symbolism": "NOUN", "rams": "PROPN", "built-in": "ADJ", "doctorate": "NOUN", "sparkling": "ADJ", "unsuspecting": "ADJ", "20th": "ADJ", "quick": "ADJ", "raining": "VERB", "vulnerabilities": "NOUN", "meander": "VERB", "compatible": "ADJ", "woke": "VERB", "aug.": "PROPN", ".322": "NUM", "scented": "ADJ", "democratically": "ADV", "forecasts": "NOUN", "forthwith": "ADV", "apartments": "NOUN", "screw": "NOUN", "febuary": "PROPN", "compositionally": "ADV", "freezing": "VERB", "ok": "ADJ", "somalia": "PROPN", "disabled": "ADJ", "shocked": "ADJ", "wipe": "VERB", "hot": "ADJ", "ripped": "VERB", "pulse": "NOUN", "peddles": "NOUN", "spacetime": "NOUN", "post-call": "ADV", "scope": "NOUN", "fashioned": "ADJ", "reapply": "VERB", "giddy": "ADJ", "kwa": "PROPN", "244": "NUM", "citadel": "NOUN", "dense": "ADJ", "finds": "VERB", "trait": "NOUN", "macgyver": "PROPN", "celery": "NOUN", "urethra": "NOUN", "shone": "VERB", "pinning": "VERB", "weekday": "NOUN", "daugherty": "PROPN", "price": "NOUN", "simply": "ADV", "delightfully": "ADV", "heian": "PROPN", "courage": "NOUN", "horse": "NOUN", "holinshed": "PROPN", "precedent": "NOUN", "ufc": "PROPN", "fields": "NOUN", "bland": "ADJ", "kline": "PROPN", "contradicting": "VERB", "salsa": "NOUN", "hip-bath": "NOUN", "events": "NOUN", "measurable": "ADJ", "fortress": "NOUN", "pecking": "VERB", "invoiced": "VERB", "opossum": "NOUN", "preservatives": "NOUN", "hooded": "ADJ", "ps4": "NOUN", "stampede": "NOUN", "situation": "NOUN", "fliers": "NOUN", "overdue": "ADJ", "10/31/2000": "NUM", "saratoga": "PROPN", "idk": "VERB", "technology": "NOUN", "blooming": "VERB", "baja": "NOUN", "outbreaks": "NOUN", "log": "VERB", "banner": "NOUN", "1179": "NUM", "catalog": "NOUN", "terrific": "ADJ", "cottage": "PROPN", "institutions": "NOUN", "sol": "PROPN", "usb": "NOUN", "blogshares": "PROPN", "center": "NOUN", "committment": "NOUN", "²": "ADJ", "mechanisms": "NOUN", "ichiyo": "PROPN", "organised": "ADJ", "ballad": "PROPN", "clarkson": "PROPN", "élysées": "PROPN", "crusty": "ADJ", "onerous": "ADJ", "jahan": "PROPN", "visits": "NOUN", "ac-": "INTJ", "chi": "PROPN", "pointer": "NOUN", "winger": "NOUN", "cyborg": "NOUN", "splitter": "NOUN", "astr": "PROPN", "2.975": "NUM", "pledge": "NOUN", "nigorie": "PROPN", "ducked": "VERB", "puerto": "PROPN", "supply": "NOUN", "composed": "VERB", "20s": "NOUN", "astrophysics": "NOUN", "mutate": "VERB", "obligated": "VERB", "recitation": "NOUN", "fitters": "NOUN", "measuring": "VERB", "carts": "NOUN", "dice": "NOUN", "qualify": "VERB", "world-wide": "ADV", "weigh": "VERB", "ploughing": "VERB", "shapes": "NOUN", "flop": "NOUN", "ridden": "VERB", "immune": "NOUN", "parachute": "NOUN", "commercial": "ADJ", "collective": "ADJ", "iqa": "PROPN", "considering": "VERB", "launching": "VERB", "geez": "INTJ", "maternal": "ADJ", "mum": "NOUN", "duster": "NOUN", "nissan": "PROPN", "degrees": "NOUN", "yields": "NOUN", "dom.": "ADJ", "depersonalizing": "VERB", "reader": "NOUN", "pho-nomenal": "ADJ", "53": "NUM", "kevin": "PROPN", "awkwardly": "ADV", "daycare": "NOUN", "experts": "NOUN", "slacks": "NOUN", "grip": "NOUN", "doers": "NOUN", "pet": "NOUN", "booth": "NOUN", "thibaut": "PROPN", "gifted": "VERB", "brings": "VERB", "motionless": "ADJ", "embolden": "VERB", "diy": "ADJ", "remark": "NOUN", "ahab": "PROPN", "liau": "PROPN", "toss": "VERB", "cheer": "VERB", "anaheim": "PROPN", "unprofessionalism": "NOUN", "mutant": "ADJ", "exam": "NOUN", "recession": "NOUN", "makeup": "NOUN", "brother": "NOUN", "freelance": "ADJ", "sampler": "NOUN", "rags": "NOUN", "thu": "PROPN", "sumo": "NOUN", "wildcard": "NOUN", "harry": "PROPN", "belgian": "ADJ", "wash": "VERB", "documenting": "VERB", "sheet": "NOUN", "hambali": "PROPN", "municipalities": "NOUN", "variation": "NOUN", "studied": "VERB", "spiders": "NOUN", "addendum": "NOUN", "health": "NOUN", "2013": "NUM", "canes": "NOUN", "tor": "PROPN", "capable": "ADJ", "ltd.": "PROPN", "manager": "NOUN", "vlog": "NOUN", "neighbours": "NOUN", "packard": "PROPN", "dell": "PROPN", "enables": "VERB", "orchestral": "ADJ", "angela": "PROPN", "ayman": "PROPN", "71st": "PROPN", "mezza": "NOUN", "darker": "ADJ", "yorker": "PROPN", "paradoxically": "ADV", "sings": "VERB", "useing": "VERB", "sandpit": "NOUN", "lgbtq": "ADJ", "chrome": "NOUN", "#valuesbased": "PROPN", "earls": "PROPN", "bottle": "NOUN", "discontent": "NOUN", "natalie": "PROPN", "hebrews": "PROPN", "harvest": "NOUN", "hum.": "PROPN", "instructor": "NOUN", "2000": "NUM", "1893": "NUM", "guidebook": "NOUN", "profits": "NOUN", "incipient": "ADJ", "ilk": "NOUN", "pre-war": "ADJ", "handicapped": "ADJ", "12/21/2000": "NUM", "gave": "VERB", "harvesting": "VERB", "exclamation": "NOUN", "video": "NOUN", "peers": "NOUN", "slighter": "ADJ", "quote": "NOUN", "videos": "NOUN", "eldest": "ADJ", "equity": "NOUN", "catfish": "NOUN", "nwp": "NOUN", "ran": "VERB", "limitations": "NOUN", "wenatchee": "PROPN", "reflective": "ADJ", "ligament": "NOUN", "ammount": "NOUN", "ty": "INTJ", "preschool": "NOUN", "coerce": "VERB", "dyspepsia": "NOUN", "middle": "ADJ", "roberto": "PROPN", "delete": "VERB", "emergencies": "NOUN", "surgery": "NOUN", "seekers": "NOUN", "depots": "NOUN", "gait": "NOUN", "violations": "NOUN", "g0v": "PROPN", "ill": "ADJ", "hikmetyar": "PROPN", "shewing": "VERB", "bounced": "VERB", "bag": "NOUN", "pal": "NOUN", "braid": "NOUN", "serviced": "VERB", "stirling": "PROPN", "parked": "VERB", "dilemmas": "NOUN", "occupation": "NOUN", "pouch": "NOUN", "agenda": "NOUN", "rightholders": "NOUN", "fcking": "ADV", "—": "PUNCT", "attentions": "NOUN", "purchace": "VERB", "gsp": "PROPN", "edifices": "NOUN", "stretches": "NOUN", "converts": "VERB", "enraged": "VERB", "refundable": "ADJ", "pro-zionist": "ADJ", "welling": "PROPN", "ragamuffin": "NOUN", "well-mannered": "ADJ", "1341": "NUM", "1:1:19": "NUM", "malfunctions": "VERB", "latino": "ADJ", "le": "PROPN", "french": "ADJ", "substantiating": "VERB", "decidely": "ADV", "cheung": "PROPN", "basalt": "NOUN", "languages": "NOUN", "dixie": "PROPN", "channelled": "VERB", "1810": "NUM", "area's": "NOUN", "micromega": "PROPN", "polution": "NOUN", "absolutely": "ADV", "release": "NOUN", "expectation": "NOUN", "pizza": "NOUN", "topack": "PROPN", "les": "PROPN", "possess": "VERB", "so-o-o": "INTJ", "hate": "VERB", "hornet": "NOUN", "investigated": "VERB", "outdoors": "ADV", "searchability": "NOUN", "violet": "NOUN", "tendons": "NOUN", "heard": "VERB", "dictating": "VERB", "researchers": "NOUN", "116th": "ADJ", "373": "NUM", "strange": "ADJ", "powersports": "PROPN", "significance": "NOUN", "fart": "NOUN", "lorenzo": "PROPN", "withstanding": "VERB", "teruya": "PROPN", "outweigh": "VERB", "20": "NUM", "mtm": "PROPN", "taurus": "PROPN", "frisco": "PROPN", "junkie": "NOUN", "accumulating": "VERB", "received": "VERB", "strathmann": "PROPN", "58": "NUM", "mccafe": "PROPN", "wilted": "ADJ", "leadoff": "ADV", "intellectuals": "NOUN", "positing": "NOUN", "rise": "NOUN", "3/10/00": "NUM", "minority": "NOUN", "contingent": "NOUN", "importance": "NOUN", "miseries": "NOUN", "notable": "ADJ", "multi-nation": "ADJ", "sandwich": "NOUN", "radiantly": "ADV", "telephone": "NOUN", "bring": "VERB", "hollering": "VERB", "bonn": "PROPN", "seconds": "NOUN", "ineffective": "ADJ", "disinformation": "NOUN", "command": "NOUN", "racial": "ADJ", "excepted": "VERB", "cenotaph": "NOUN", "sheets": "NOUN", "ernst": "PROPN", "simplified": "VERB", "!!": "PUNCT", "telecommunications": "NOUN", "outer": "ADJ", "di": "NOUN", "workforce": "NOUN", "adidas": "PROPN", "mom": "NOUN", "physically": "ADV", "normally": "ADV", "68": "NUM", "turner": "PROPN", "indicating": "VERB", "californian": "PROPN", "analytics": "PROPN", "vampire": "NOUN", "viewer": "NOUN", "cancun": "PROPN", "flutter": "NOUN", "unwittingly": "ADV", "a1237": "PROPN", "belgium": "PROPN", "texans": "PROPN", "pope": "PROPN", "yawl": "NOUN", "re-routed": "VERB", "lennon": "PROPN", "squashed": "VERB", "leroy": "PROPN", "representation": "NOUN", "pierre": "PROPN", "cheaply": "ADV", "forget-me-not": "NOUN", "uvr": "NOUN", "laurent": "PROPN", "cherry-": "NOUN", "provoke": "VERB", "realizing": "VERB", "strive": "VERB", "phones": "NOUN", "andreae": "PROPN", "tactics": "NOUN", "goddard": "PROPN", "mm": "INTJ", "namibia": "PROPN", "railway-truck": "NOUN", "steal": "VERB", "neutered": "VERB", "akin": "ADJ", "reptile": "NOUN", "icing": "NOUN", "poa": "NOUN", "decks": "NOUN", "staind": "VERB", "believes": "VERB", "nonna!": "PROPN", "anti-trust": "ADJ", "collaborative": "ADJ", "item": "NOUN", "marking": "VERB", "rushed": "VERB", "thus": "ADV", "britannia": "PROPN", "fluent": "ADJ", "effeminate": "ADJ", "accommodating": "VERB", "kike": "NOUN", "1929": "NUM", "marquee": "NOUN", "pivottable": "NOUN", "benefactor": "NOUN", "brooding": "VERB", "clutching": "VERB", "jalapeno": "NOUN", "meanwhile": "ADV", "prototypes": "NOUN", "chickens": "NOUN", "reverie": "NOUN", "sinh": "PROPN", "aggrieved": "ADJ", "hodge": "PROPN", "albeit": "SCONJ", "bashers": "NOUN", "peanutjak...@usa.com": "PROPN", "cleverly": "ADV", "coupled": "VERB", "reintroduced": "VERB", "passing": "VERB", "longevity": "NOUN", "experiance": "NOUN", "aquiriums": "NOUN", "join": "VERB", "202.429.1700": "NUM", "fervor": "NOUN", "mickey": "PROPN", "implanted": "VERB", "sunset": "NOUN", "rock": "NOUN", "danish": "ADJ", "preferred": "VERB", "92101": "NUM", "overseeing": "VERB", "preaching": "VERB", "priced": "VERB", "averted": "VERB", "remarkable": "ADJ", "dingy": "ADJ", "39": "NUM", "|": "PUNCT", "slowed": "VERB", "esp": "ADV", "sonus": "NOUN", "0": "NUM", "281-514-3183": "NUM", "arrayed": "VERB", "tommy": "PROPN", "blamed": "VERB", "665": "NUM", "protective": "ADJ", "consider": "VERB", "edible": "ADJ", "rhodesia": "PROPN", "stretching": "VERB", "school": "NOUN", "write": "VERB", "showered": "VERB", "steward": "NOUN", "whitmore": "PROPN", "after": "ADP", "settlements": "NOUN", "slash": "CCONJ", "mfm": "PROPN", "ees": "PROPN", "17th": "ADJ", "berries": "NOUN", "globalflash": "PROPN", "playing": "VERB", "racket": "NOUN", "valdes": "PROPN", "optimize": "VERB", "uprising": "NOUN", "glow": "NOUN", "whole": "ADJ", "hashtag": "NOUN", "quality": "NOUN", "logic": "NOUN", "exercise": "NOUN", "quarters": "NOUN", "flatbread": "NOUN", "agip": "PROPN", "cocaine": "PROPN", "today": "NOUN", "characteristic": "NOUN", "ban": "NOUN", "dustin": "PROPN", "sluts": "NOUN", "miri": "PROPN", "berez": "PROPN", "neoconservative": "ADJ", "27": "NUM", "addressee": "NOUN", "conquistador": "NOUN", "counselors": "NOUN", "prideful": "ADJ", "looser": "NOUN", "beer": "NOUN", "phobia": "NOUN", "ex-cons": "NOUN", "glass": "NOUN", "presumably": "ADV", "cleaser": "NOUN", "interrogations": "NOUN", "substance": "NOUN", "turnout": "NOUN", "oral": "ADJ", "compounds": "NOUN", "men": "NOUN", "mentioned": "VERB", "comédie": "NOUN", "circulations": "NOUN", "metals": "PROPN", "distilleries": "NOUN", "chartered": "VERB", "adw": "PROPN", "rebel": "NOUN", "bc": "PROPN", "exterior": "ADJ", "quiz": "NOUN", "prior": "ADJ", "allergic": "ADJ", "apparition": "NOUN", "flares": "NOUN", "leadership": "NOUN", "willow": "NOUN", "referendums": "NOUN", "neo": "ADJ", "finish": "VERB", "hamsters": "NOUN", "supplies": "NOUN", "software": "NOUN", "suffocate": "VERB", "track": "NOUN", "ebert": "PROPN", "faction": "NOUN", "hisses": "VERB", "coined": "VERB", "specify": "VERB", "slack": "VERB", "glide": "VERB", "360": "NUM", "handled": "VERB", "''": "PUNCT", "organization": "NOUN", "bolted": "VERB", "whiting": "NOUN", "bodhi": "PROPN", "bucks": "NOUN", "recheck": "NOUN", "gloss": "NOUN", "skulls": "NOUN", "edgewater": "PROPN", "alt.animals.tiger": "NOUN", "alfred": "PROPN", "trails": "NOUN", "43228": "NUM", "misc.consumers": "NOUN", "http://www.adiccp.org/home/default.asp": "PROPN", "colin": "PROPN", "stomach": "NOUN", "pup": "NOUN", "castamere": "PROPN", "improve": "VERB", "deliberate": "ADJ", "2006": "NUM", "galbraith": "PROPN", "correctness": "NOUN", "ensign": "NOUN", "torture": "NOUN", "cunclude": "VERB", "'71": "NUM", "jorvik": "PROPN", "theatrical": "ADJ", "favourites": "NOUN", "cosmos": "NOUN", "typical": "ADJ", "interferences": "NOUN", "repeatable": "ADJ", "fixtures": "NOUN", "your": "PRON", "rehabilitation": "PROPN", "sudden": "ADJ", "naples": "PROPN", "hainan": "PROPN", "stinking": "ADJ", "redistribution": "NOUN", "hopeful": "ADJ", "steer": "NOUN", "islamic": "ADJ", "farming": "NOUN", "espeak": "PROPN", "m-": "INTJ", "meeting": "NOUN", "creekside": "PROPN", "dinasaurs": "NOUN", "devilishly": "ADV", "analysis": "NOUN", "founds": "VERB", "giants": "NOUN", "whirred": "VERB", "lai": "PROPN", "refilled": "VERB", "except": "ADP", "lafayette": "PROPN", "futures": "NOUN", "pumpkin": "NOUN", ")": "PUNCT", "traces": "NOUN", "612-205-9814": "NUM", "17": "NUM", "beards": "NOUN", "thou": "PRON", "choppy": "ADJ", "israeli": "ADJ", "diplomat": "NOUN", "stillness": "NOUN", "phd": "NOUN", "bullshit": "NOUN", "fossum": "PROPN", "bear": "NOUN", "auschwitz": "PROPN", "seeking": "VERB", "foie": "NOUN", "tolerating": "VERB", "ties": "NOUN", "572": "NUM", "appease": "VERB", "wool": "NOUN", "squeeze": "VERB", "bloom": "PROPN", "celebration": "NOUN", "falernian": "ADJ", "blank": "ADJ", "sweat": "NOUN", "colada": "NOUN", "achilles": "PROPN", "64,500": "NUM", "sss": "NOUN", "vastly": "ADV", "distort": "VERB", "713-654-0365": "NUM", "volunteering": "NOUN", "sourced": "VERB", "kente": "PROPN", "discussion": "NOUN", "never": "ADV", "beers": "NOUN", "mers": "PROPN", "regress": "NOUN", "repeal": "VERB", "religious": "ADJ", "personalized": "VERB", "squeaks": "NOUN", "vastness": "NOUN", "gencon": "PROPN", "!!!!!!": "PUNCT", "bleach": "NOUN", "baptist": "PROPN", "sunshield": "NOUN", "waked": "VERB", "mitigating": "NOUN", "golfing": "VERB", "tel": "NOUN", ">=": "SYM", "enemy": "NOUN", "vcu": "PROPN", "ridiculized": "VERB", "christened": "VERB", "jitsu": "NOUN", "amends": "VERB", "yonder": "DET", "seek": "VERB", "autobiography": "NOUN", "affiliate": "NOUN", "ginger": "NOUN", "angry": "ADJ", "pregnancy": "NOUN", "candid": "ADJ", "flickr": "PROPN", "crawls": "VERB", "pretense": "NOUN", "mustaches": "NOUN", "cantons": "NOUN", "gilderoy": "PROPN", "diners": "NOUN", "messenger": "PROPN", "misinterpretation": "NOUN", "muggles": "NOUN", "matters": "NOUN", "external": "ADJ", "chromatograph": "NOUN", "hickory": "PROPN", "revitalization": "NOUN", "portions": "NOUN", "disposable": "ADJ", "mischievous": "ADJ", "schizophrenic": "ADJ", "modification": "NOUN", "fond": "ADJ", "abstained": "VERB", "augment": "VERB", "yes": "INTJ", "interfaces": "NOUN", "funniest": "ADJ", "mia": "PROPN", "kate": "PROPN", "reactor": "NOUN", "hunters": "NOUN", "devastation": "NOUN", "ālī": "PROPN", "romania": "PROPN", "migrated": "VERB", "testified": "VERB", "variant": "NOUN", "canyon": "PROPN", "peoria": "PROPN", "undercurrents": "NOUN", "2016": "NUM", "seeks": "VERB", "reacts": "VERB", "tools": "NOUN", "pcs": "PROPN", "monument": "NOUN", "eczema": "NOUN", "non": "ADV", "unprepossessingly": "ADV", "proletariat": "PROPN", "whispering": "VERB", "jew": "NOUN", "http://i.imgur.com/s2md2.jpg": "PROPN", "unhygienic": "ADJ", "playoffs": "NOUN", "scrub": "VERB", "quitter": "NOUN", "unresolved": "ADJ", "dressing-table": "NOUN", "suspended": "VERB", "substances": "NOUN", "oprah": "PROPN", "attribution": "PROPN", "lead": "VERB", "dangerous-loiterer": "NOUN", "gass": "PROPN", "auxiliary": "ADJ", "biography": "NOUN", "ada": "NOUN", "vowels": "NOUN", "wedges": "NOUN", "profundity": "NOUN", "lizards": "NOUN", "meydan": "PROPN", "scientologist": "PROPN", "hu": "PROPN", "isolating": "VERB", "shuttles": "NOUN", "strongly": "ADV", "capricorn": "PROPN", "upgrade": "NOUN", "careers": "NOUN", "sacramental": "ADJ", "asked": "VERB", "deeping": "VERB", "crunched": "VERB", "superior": "ADJ", "oncoming": "ADJ", "understandably": "ADV", "wisteria": "PROPN", "sanborn": "PROPN", "journalistic": "ADJ", "fueled": "VERB", "caches": "NOUN", "kapor": "PROPN", "gis": "NOUN", "colton": "PROPN", "simplest": "ADJ", "surplus": "NOUN", "hackable": "ADJ", "hovered": "VERB", "intercourse": "NOUN", "orson": "PROPN", "defines": "VERB", "hewlett": "PROPN", "characterizing": "VERB", "wim": "PROPN", "1576": "NUM", "limelight": "NOUN", "ariel": "PROPN", "200": "NUM", "speech": "NOUN", "foz": "PROPN", "luan": "PROPN", "unselfish": "ADJ", "prognosis": "NOUN", "exit": "NOUN", "root": "NOUN", "tien": "PROPN", "green": "ADJ", "darmanin": "PROPN", "7484": "NUM", "handiwork": "NOUN", "s’": "AUX", "belgians": "PROPN", "vacancy": "NOUN", "nearest": "ADJ", "nitrogen": "NOUN", "toast": "NOUN", "default": "NOUN", "stride": "NOUN", "caring": "ADJ", "crepes": "PROPN", "gala": "NOUN", "simultaneous": "ADJ", "literal": "ADJ", "patrol": "NOUN", "williamson": "PROPN", "completing": "VERB", "windsurf": "NOUN", "pragmatics": "NOUN", "ercot": "PROPN", "questions": "NOUN", "carrots": "NOUN", "priory": "NOUN", "dictator": "NOUN", "matchsticks": "NOUN", "bottom": "NOUN", "tussey": "PROPN", "drones": "NOUN", "guard": "PROPN", "affirm": "VERB", "accompany": "VERB", "taiwanese": "ADJ", "origination": "NOUN", "queen": "NOUN", "prolonged": "ADJ", "cuckoo": "NOUN", "make-up": "NOUN", "preventing": "VERB", "hoot": "PROPN", "angelic": "ADJ", "488,800": "NUM", "974-6721": "NUM", "genteel": "ADJ", "jersey": "PROPN", "chip": "NOUN", "groan": "INTJ", "essen": "PROPN", "bitter": "ADJ", "08:55": "NUM", "buddhism": "PROPN", "decouple": "VERB", "hastag": "NOUN", "lovely": "ADJ", "addict": "NOUN", "grigorenko": "PROPN", "parent": "NOUN", "entertain": "VERB", "quantification": "NOUN", "th": "SCONJ", "inequities": "NOUN", "tug-boat": "NOUN", "towns": "NOUN", "alpha": "PROPN", "pl": "INTJ", "travellers": "NOUN", "keywords": "NOUN", "robbed": "VERB", "relentless": "ADJ", "massacre": "NOUN", "werewolf": "PROPN", "manifest": "ADJ", "horrific": "ADJ", "blackened": "VERB", "boasted": "VERB", "awful": "ADJ", "εὐσέβιος": "PROPN", "guess": "VERB", "mumble": "VERB", "beating": "VERB", "ambitiously": "ADV", "orally": "ADV", "amin": "PROPN", "me": "PRON", "ros": "PROPN", "owls": "NOUN", "boulders": "NOUN", "swung": "VERB", "whisked": "VERB", "voicemail": "NOUN", "pose": "VERB", "lifespans": "NOUN", "flatten": "VERB", "admirers": "NOUN", "nephews": "NOUN", "duplicity": "NOUN", "bojinka": "PROPN", "traveler": "NOUN", "brand": "NOUN", "cosmetics": "NOUN", "16.379": "NUM", "stubble": "NOUN", ".15": "NUM", "webb": "PROPN", "reigned": "VERB", "cite": "VERB", "guerra": "PROPN", "bites": "VERB", "wasting": "VERB", "grouped": "VERB", "puppy": "NOUN", "matching": "VERB", "monocot": "NOUN", "flecked": "VERB", "warm": "ADJ", "sequence": "NOUN", "firms": "NOUN", "mental": "ADJ", "save": "VERB", "computers": "NOUN", "slight": "ADJ", "encourage": "VERB", "immigrate": "VERB", "mubarak": "PROPN", "parliamentary": "ADJ", "naivety": "NOUN", "provides": "VERB", "thriller": "NOUN", "canever": "PROPN", "volume": "NOUN", "breaking": "VERB", "consortium": "NOUN", "compartmentalize": "VERB", "hong-kong": "PROPN", "devise": "VERB", "chattering": "ADJ", "crosstab": "NOUN", "call": "VERB", "escalation": "NOUN", "agriculture": "NOUN", "+++++": "PUNCT", "aziz": "PROPN", "1846": "NUM", "transmission": "NOUN", "cripple": "VERB", "patriotic": "ADJ", "aldo": "PROPN", "va.": "PROPN", "function": "NOUN", "asset": "NOUN", "bathtub": "NOUN", "complaining": "VERB", "lamentation": "NOUN", "clay": "NOUN", "preorder": "NOUN", "sacks": "PROPN", "wantons": "NOUN", "kobey": "PROPN", "excluded": "VERB", "formality": "NOUN", "cycle": "NOUN", "triage": "NOUN", "redwood": "NOUN", "kori": "PROPN", "knudsen": "PROPN", "ayad": "PROPN", "shiny": "ADJ", "butter-hearted": "ADJ", "commander": "NOUN", "surround": "VERB", "depress": "VERB", "headline": "NOUN", "adhamiya": "PROPN", "exurbs": "NOUN", "extraordinary": "ADJ", "caparrós": "PROPN", "1600s": "NOUN", "fincher": "PROPN", "98.7": "NUM", "conditional": "ADJ", "sorority": "NOUN", "cooperate": "VERB", "quarrel": "NOUN", "contractor": "NOUN", "bridges": "NOUN", "symbiote": "PROPN", "inspires": "VERB", "suleiman": "PROPN", "libra": "PROPN", "lent": "VERB", "cooperating": "VERB", "queueing": "VERB", "driveby": "ADJ", "savagely": "ADV", "hoped": "VERB", "las": "PROPN", "polmar": "PROPN", "awake": "ADJ", "homeland": "NOUN", "decisions": "NOUN", "odara": "PROPN", "ji": "PROPN", "sulfate": "NOUN", "10/31/00": "NUM", "examples": "NOUN", "periods": "NOUN", "douglas": "PROPN", "gloating": "VERB", "acquittal": "NOUN", "alliance": "NOUN", "charred": "VERB", "majorca": "PROPN", "uncovered": "VERB", "fidgeted": "VERB", "candle": "NOUN", "bron-": "INTJ", "technologically": "ADV", "introduces": "VERB", "involving": "VERB", "closet": "NOUN", "pollution": "NOUN", "oryana": "PROPN", "andrew": "PROPN", "interminable": "ADJ", "soviets": "PROPN", "detrimental": "ADJ", "commands": "NOUN", "vanity": "NOUN", "hairpin": "NOUN", "pizzas": "NOUN", "aquileia": "PROPN", "attempts": "NOUN", "rosalee": "PROPN", "shots": "NOUN", "systems": "NOUN", "producers": "NOUN", "lemoine": "PROPN", "genital": "NOUN", "mystical": "ADJ", "gleason": "PROPN", "pigeon": "NOUN", "crowley": "PROPN", "#cognitivebias": "PROPN", "ladakh": "PROPN", "theropods": "NOUN", "categorically": "ADV", "wary": "ADJ", "strasbourg": "PROPN", ":d": "SYM", "bulletin": "NOUN", "overthrough": "VERB", "voice": "NOUN", "pertains": "VERB", "ismat": "PROPN", "2100": "NUM", "kedourie": "PROPN", "``": "PUNCT", "mars": "PROPN", "shiraz": "PROPN", "rare": "ADJ", "tentative": "ADJ", "leaked": "VERB", "territories": "NOUN", "super-human": "ADJ", "busybodies": "NOUN", "determined": "VERB", "houston": "PROPN", "ms.": "PROPN", "dean": "PROPN", "owners": "NOUN", "nor": "CCONJ", "realy": "ADV", "jerusalem": "PROPN", "defuses": "VERB", "runaround": "NOUN", "widgets": "NOUN", "reliability": "NOUN", "soldier": "NOUN", "instrumental": "ADJ", "05:39": "NUM", "uni": "NOUN", "six": "NUM", "f'ers": "NOUN", "veiled": "VERB", "330i": "PROPN", "jerome": "PROPN", "gently": "ADV", "knights": "NOUN", "spinal": "ADJ", "perfecting": "VERB", "eric": "PROPN", "collaborator": "NOUN", "as400": "NOUN", "though": "SCONJ", "murders": "NOUN", "85": "NUM", "borgin": "PROPN", "http://bit.ly/kplaylists": "PROPN", "flashlight": "NOUN", "filed": "VERB", "chessboard": "NOUN", "unusual": "ADJ", "battles": "NOUN", "francisco.pinto.leite@enron.com": "PROPN", "concluded": "VERB", "gmt": "PROPN", "backpedalling": "VERB", "pause": "NOUN", "epistemology": "NOUN", "cult": "NOUN", "eyes": "NOUN", "exclusion": "NOUN", "carroll": "PROPN", "locust": "PROPN", "launchers": "NOUN", "§": "SYM", "bella": "ADJ", "gradual": "ADJ", "recognised": "VERB", "para.": "NOUN", "hindlimb": "NOUN", "pop": "NOUN", "soy": "NOUN", "rigid": "ADJ", "syntheses": "NOUN", "spanned": "VERB", "mtv": "PROPN", "ayatollah": "PROPN", "marbled": "VERB", "apa": "PROPN", "180.9": "NUM", "stroke": "NOUN", "153b09": "PROPN", "predators": "NOUN", "artwork": "NOUN", "mindful": "ADJ", "rudeness": "NOUN", "cantering": "VERB", "stanley": "PROPN", "concerted": "ADJ", "confront": "VERB", "lack": "NOUN", "luna": "NOUN", "bridgeline": "PROPN", "forty-foot": "NOUN", ">:(": "SYM", "asap": "ADV", "distinct": "ADJ", "glared": "VERB", "handsome": "ADJ", "statistics": "NOUN", "thereby": "ADV", "waitresses": "NOUN", "kindness": "NOUN", "descendants": "NOUN", "s1": "PROPN", "albania": "PROPN", "ocnversation": "NOUN", "gesture": "NOUN", "713-853-3044": "NUM", "accessed": "VERB", "reviewer": "NOUN", "implant": "NOUN", "scones": "NOUN", "ebay": "PROPN", "r": "AUX", "thes": "DET", "stepping": "VERB", "scathalos": "PROPN", "nudging": "NOUN", "racism": "NOUN", "options": "NOUN", "mhc": "PROPN", "wentzes": "PROPN", "masses": "NOUN", "hooray": "INTJ", "novelist": "NOUN", "remarks": "NOUN", "http://www.environmentalchemistry.com/yogi/hazmat/articles/chernobyl1.html": "PROPN", "shaky": "ADJ", "mulberry": "PROPN", "colleague": "NOUN", "layers": "NOUN", "khaled": "PROPN", "snatched": "VERB", "jaffa": "PROPN", "unsure": "ADJ", "1701": "NUM", "going": "VERB", "detectors": "NOUN", "kia": "PROPN", "st": "PROPN", "underlip": "NOUN", "completely": "ADV", "amendmnets": "NOUN", "rev.": "PROPN", "sponoring": "VERB", "natsuko": "PROPN", "hoffman": "PROPN", "stranger": "NOUN", "assure": "VERB", "songwriter": "NOUN", "larry": "PROPN", "reorganization": "NOUN", "re-use": "VERB", "spells": "NOUN", "novgorod": "PROPN", "data": "NOUN", "experimented": "VERB", "sneakers": "NOUN", "2539": "NUM", "polished": "ADJ", "alvin": "PROPN", "foster": "NOUN", "inferno": "NOUN", "venerable": "ADJ", "prison": "NOUN", "researching": "VERB", "anemones": "NOUN", "pea": "NOUN", "smithy": "NOUN", "ortega": "PROPN", "cuz": "SCONJ", "raid": "NOUN", "ie6": "PROPN", "attacking": "VERB", "mcdonald": "PROPN", "tagg": "NOUN", "presidency": "PROPN", "innovate": "VERB", "madly": "ADV", "uncomfortably": "ADV", "tribes": "NOUN", "sacrifice": "NOUN", "siu-lai": "PROPN", "rangatira": "PROPN", "email": "NOUN", "barstool": "PROPN", "owed": "VERB", "philosophiae": "PROPN", "christensen": "PROPN", "moyross": "PROPN", "restored": "VERB", "re-trained": "VERB", "witch": "NOUN", "farms": "NOUN", "photographer": "NOUN", "indices": "NOUN", "mast": "NOUN", "irritate": "VERB", "quantitative": "ADJ", "l'": "PROPN", "dragging": "VERB", "portrayed": "VERB", "tropical": "ADJ", "interquartile": "ADJ", "(:": "SYM", "moher": "PROPN", "agreed": "VERB", "valencia": "PROPN", "pescheux": "PROPN", "missionary": "NOUN", "creating": "VERB", "register": "VERB", "refusals": "NOUN", "blocked": "VERB", "simplistically": "ADV", "cleveland": "PROPN", "hackneyed": "ADJ", "medicinal": "ADJ", "dangerously": "ADV", "ben-gurion": "PROPN", "no-59": "NUM", "blaze": "NOUN", "cleaning": "VERB", "nashville": "PROPN", "zoo": "NOUN", "warn": "VERB", "pricy": "ADJ", "apostrophe": "NOUN", "graphics": "NOUN", "217": "NUM", "approve": "VERB", "kindopp": "PROPN", "cites": "VERB", "staff": "NOUN", "50th": "ADJ", "man-": "NOUN", "ozs": "NOUN", "clashing": "ADJ", "maple": "NOUN", "erith": "PROPN", "rag": "NOUN", "commissioner": "NOUN", "sometime": "ADV", "eatables": "NOUN", "preoccupied": "VERB", "amazingly": "ADV", "impatiently": "ADV", "hardly": "ADV", "mare": "NOUN", "mousey": "ADJ", "noiseless": "ADJ", "roaring": "VERB", "catering": "NOUN", "boiled": "VERB", "trimmer": "NOUN", "ruins": "NOUN", "martyrs": "NOUN", "examination": "NOUN", "leah": "PROPN", "forget": "VERB", "implies": "VERB", "headcount": "NOUN", "improvement": "NOUN", "differences": "NOUN", "counts": "NOUN", "96": "NUM", "tom": "PROPN", "process": "NOUN", "atwood": "PROPN", "persuasion": "NOUN", "bilmes": "PROPN", "milieu": "NOUN", "finance": "NOUN", "chow": "PROPN", "legislate": "VERB", "gentlemen": "NOUN", "disclosures": "NOUN", "test": "NOUN", "understands": "VERB", "martínez": "PROPN", "score": "NOUN", "rot": "NOUN", "d'enfer": "PROPN", "loyalty": "NOUN", "pastry": "NOUN", "59,339": "NUM", "birdman": "PROPN", "rac": "NOUN", "blandness": "NOUN", "riots": "NOUN", "multisite": "ADJ", "value": "NOUN", "crevices": "NOUN", "invariably": "ADV", "nhut": "PROPN", "18t": "NOUN", "losers": "NOUN", "foot": "NOUN", "earrings": "NOUN", "pronouncements": "NOUN", "1999": "NUM", "ojala": "PROPN", "governs": "VERB", "complex": "ADJ", "advances": "NOUN", "blanket": "NOUN", "fifteen": "NUM", "performances": "NOUN", "topple": "VERB", "ambitious": "ADJ", "karine": "PROPN", "recognizing": "VERB", "works": "NOUN", "wildest": "ADJ", "37": "NUM", "persians": "NOUN", "cheesecloth": "NOUN", "riedell": "PROPN", "remainder": "NOUN", "adverb": "NOUN", "bacon": "PROPN", "stable": "ADJ", "ernest": "PROPN", "glimpses": "NOUN", "281-735-5919": "NUM", "husbands": "NOUN", "01/12/2001": "NUM", "dissolves": "VERB", "pucker": "NOUN", "addicting": "ADJ", "explosive": "ADJ", "recording": "NOUN", "nonetheless": "ADV", "legion": "PROPN", "complexion": "NOUN", "detective": "NOUN", "h-0218/97": "NUM", "stemmed": "VERB", "irritable-looking": "ADJ", "europol": "PROPN", "okmulgee": "PROPN", "rejoice": "VERB", "wagged": "VERB", "allah": "PROPN", "mo": "PROPN", "township": "NOUN", "ekrapels@esaibos.com": "PROPN", "necklace": "NOUN", "fighter": "NOUN", "friedkin": "PROPN", "unscear": "PROPN", "ordered": "VERB", "desirable": "ADJ", "innovations": "NOUN", "jo-ann": "PROPN", "commonest": "ADJ", "ignited": "VERB", "considerable": "ADJ", "lost": "VERB", "academic": "ADJ", "notebook": "NOUN", "henga": "PROPN", "prod": "NOUN", "ambition": "NOUN", "queso": "NOUN", "soulless": "ADJ", "fatally": "ADV", "mb": "PROPN", "window-sill": "NOUN", "oozed": "VERB", "mc": "PROPN", "pastorino": "PROPN", "qāpū": "PROPN", "accountability": "NOUN", "continues": "VERB", "offspring": "NOUN", "actress": "NOUN", "brazilian": "ADJ", "byargeon": "PROPN", "verde": "NOUN", "wound": "VERB", "rosters": "NOUN", "shirtsleeves": "NOUN", "voiced": "VERB", "tyrants": "NOUN", "classmate": "NOUN", "t.": "PROPN", "carter": "PROPN", "emerging": "VERB", "youre": "PRON", "rural": "ADJ", "rack": "NOUN", "blaming": "VERB", "drawing": "VERB", "carven": "VERB", "distinguishes": "VERB", "conceptualize": "VERB", "visible": "ADJ", "freshman": "NOUN", "supported": "VERB", "manyema": "PROPN", "33,000": "NUM", "mankind": "NOUN", "crafting": "VERB", "hostess": "NOUN", "ip": "NOUN", "troop": "NOUN", "ashley": "PROPN", "commentary": "NOUN", "forces": "NOUN", "sown": "VERB", "become": "VERB", "tribal": "ADJ", "plaintiffs": "NOUN", "aspirations": "NOUN", "requesting": "VERB", "losing": "VERB", "scratches": "NOUN", "mmkay": "PROPN", "revived": "VERB", "pleaded": "VERB", "paq": "NOUN", "outnumbered": "VERB", "gallivanting": "VERB", "roughest": "ADJ", "tk": "PROPN", "reddest": "ADJ", "jehosaphat": "PROPN", "vitamins": "NOUN", "navarro": "PROPN", "pepperoni": "NOUN", "frankly": "ADV", "earnest": "NOUN", "drive": "VERB", "osteos": "NOUN", "'60's": "NOUN", "solheim": "PROPN", "prisons": "NOUN", "luca": "PROPN", "fun": "ADJ", "bilbray": "PROPN", "saltimboca": "NOUN", "friends": "NOUN", "audio-visual": "ADJ", "interval": "NOUN", "stars": "NOUN", "bald": "ADJ", "citation": "NOUN", "no-49": "NUM", "displayed": "VERB", "ca": "AUX", "reball": "NOUN", "gosier": "PROPN", "operators": "NOUN", "delicious": "ADJ", "prowess": "NOUN", "ramadi": "PROPN", "blindly": "ADV", "ferrous": "ADJ", "sort": "NOUN", "admired": "VERB", "soren": "PROPN", "deny": "VERB", "awards": "NOUN", "grain": "NOUN", "jangling": "VERB", "infinity": "NOUN", "enthusiastic": "ADJ", "come": "VERB", "pearls": "NOUN", "quantifying": "VERB", "01/11/2001": "NUM", "brendan": "PROPN", "do": "AUX", "muslim": "ADJ", "accusations": "NOUN", "causality": "NOUN", "relatedness": "NOUN", "shaved": "VERB", "formats": "NOUN", "mossy": "ADJ", "foil": "NOUN", "bartender": "NOUN", "703.729.2710": "NUM", "shoer": "NOUN", "workspace": "NOUN", "dentistry": "PROPN", "resolve": "VERB", "journalist": "NOUN", "enchladas": "NOUN", "disliked": "VERB", "bureau": "PROPN", "commended": "VERB", "dehydration": "NOUN", "claims": "NOUN", "deeds": "NOUN", "flyers": "NOUN", "navy": "NOUN", "pallor": "NOUN", "transcendental": "ADJ", "narcotic": "ADJ", "amusement": "NOUN", "arlington": "PROPN", "unpretentious": "ADJ", "broached": "VERB", "pay": "VERB", "banning": "VERB", "dignitary": "NOUN", "abundantly": "ADV", "admirals": "NOUN", "litterarum": "PROPN", "orr": "PROPN", "leisure": "NOUN", "roughened": "VERB", "buring": "VERB", "venality": "NOUN", "overflowing": "VERB", "booklist": "NOUN", "07": "NUM", "brocade": "NOUN", "sars-cov-2": "PROPN", "white": "ADJ", "mako": "PROPN", "munk": "PROPN", "robe": "NOUN", "shoddy": "ADJ", "408": "NUM", "meditative": "ADJ", "sturdy": "ADJ", "thanh": "PROPN", "1776": "NUM", "considerate": "ADJ", "1996-1997": "NUM", "http://www.time.com/time/daily/chernobyl/860901.accident.html": "PROPN", "unfavorable": "ADJ", "temples": "NOUN", "killings": "NOUN", "titan": "PROPN", "insult": "NOUN", "analyst": "NOUN", "nicklaus": "PROPN", "trenerry": "PROPN", "polansky": "PROPN", "aerocom": "PROPN", "11608": "NUM", "conciliation": "NOUN", "adorama": "PROPN", "rosewater": "NOUN", "whisk": "VERB", "repetitive": "ADJ", "cropdusters": "NOUN", "sassi": "PROPN", "instantaneously": "ADV", "2022": "NUM", "scots": "PROPN", "quat": "PROPN", "restore": "VERB", "t3i": "NOUN", "withhold": "VERB", "janis": "PROPN", "dumping": "NOUN", "petroleum": "NOUN", "steamer": "NOUN", "statistic": "NOUN", "swaying": "VERB", "nos": "NOUN", "norwegians": "PROPN", "montenegro": "PROPN", "frontier": "PROPN", "rods": "NOUN", "rotten": "ADJ", "raising": "VERB", "senseless": "ADJ", "elites": "NOUN", "modrian": "PROPN", "prophetic": "ADJ", "meters": "NOUN", "havens": "NOUN", "iain": "PROPN", "possessions": "NOUN", "keyboard": "NOUN", "6.2.1": "NUM", "poop": "NOUN", "sociable": "ADJ", "condo": "NOUN", "bellini": "PROPN", "authorizing": "VERB", "applaud": "VERB", "1,350": "NUM", "chineze": "ADJ", "sercvice": "NOUN", "enrolled": "VERB", "legendary": "ADJ", "objectivity": "NOUN", "nimbus": "PROPN", "lotus-flower": "NOUN", "blown": "VERB", "welch": "PROPN", "postacetabular": "ADJ", "inca": "PROPN", "unpaid": "ADJ", "arena": "NOUN", "culprit": "NOUN", "3.4": "NUM", "boycott": "NOUN", "haedicke": "PROPN", "murals": "NOUN", "unreachable": "ADJ", "embarrased": "ADJ", "unreal": "ADJ", "watchers": "NOUN", "risk": "NOUN", "paradise": "NOUN", "critic": "NOUN", "acquisition": "NOUN", "upstairs": "ADV", "crooks": "NOUN", "firepower": "NOUN", "trim": "VERB", "juggernaut": "PROPN", "containing": "VERB", "rainer": "PROPN", "likelihood": "NOUN", "refugee": "NOUN", "patience": "NOUN", "polarized": "VERB", "inked": "VERB", "248": "NUM", "galloping": "VERB", "0.8": "NUM", "vibe": "NOUN", "malignant": "ADJ", "divide": "VERB", "depending": "VERB", "burglar": "NOUN", "straw": "NOUN", "brazen": "ADJ", "stewardship": "NOUN", "sleepy": "ADJ", "ips": "PROPN", "grim": "ADJ", "eliminate": "VERB", "apprentice": "NOUN", "repay": "VERB", "dates": "NOUN", "03/16/2001": "NUM", "insipid": "ADJ", "sock": "NOUN", "dew": "PROPN", "crete": "PROPN", "bolting": "VERB", "désirade": "PROPN", "scarf": "NOUN", "chipped": "VERB", "sidelines": "NOUN", "backbone": "NOUN", "adapts": "VERB", "tiziano": "PROPN", "hamdullah": "PROPN", "citrus": "ADJ", "trunks": "NOUN", "joints": "NOUN", "keeping": "VERB", "mmm": "INTJ", "greenspan": "PROPN", "72,000": "NUM", "reforms": "NOUN", "authoritarian": "ADJ", "compatibility": "NOUN", "http://www.droidforums.net/forum/droid-news/181335-ereader-tablet-comparison-b-n-nook-tablet-b-n-nook-color-kindle-fire-htc-flyer.html": "PROPN", "behaviour": "NOUN", "instructive": "ADJ", "kerrigan": "PROPN", "stared": "VERB", "professor": "PROPN", "mini-serial": "NOUN", "l.": "PROPN", "lifeguard": "NOUN", "odette": "PROPN", "sages": "NOUN", "say": "VERB", "inadequate": "ADJ", "scraps": "NOUN", "http://www.consumerreports.org/health/healthy-living/beauty-personal-care/hair-loss-10-08/hair-loss.htm": "PROPN", "regina": "PROPN", "immersed": "VERB", "tintman": "PROPN", "funny": "ADJ", "affords": "VERB", "intensified": "VERB", "icky": "ADJ", "convertible": "ADJ", "confessions": "PROPN", "labels": "NOUN", "manages": "VERB", "succinctly": "ADV", "debates": "NOUN", "medina": "PROPN", "relation": "NOUN", "switching": "VERB", "thinking": "VERB", "augustine": "PROPN", "mansoor": "PROPN", "ildefonso": "PROPN", "glare": "NOUN", "crumbles": "VERB", "cod": "NOUN", "vip": "NOUN", "anderson": "PROPN", "skiatook": "PROPN", "valentin": "PROPN", "midwife": "NOUN", "marcelo": "PROPN", "refrigerator": "NOUN", "faintly": "ADV", "circle": "NOUN", "stylists": "NOUN", "maynard": "PROPN", "latest": "ADJ", "spattering": "NOUN", "error": "NOUN", "uth": "NOUN", "exposures": "NOUN", "sleeve": "NOUN", "secretly": "ADV", "http://www.beardeddragon.org/articles/caresheet/?page=1": "PROPN", "groupings": "NOUN", "expo": "PROPN", "hurts": "VERB", "adriana": "PROPN", "teens": "NOUN", "sub-saharan": "ADJ", "preach": "VERB", "vehemently": "ADV", "irrespective": "ADV", "bone": "NOUN", "popo": "PROPN", "fineally": "ADV", "carbs": "NOUN", "ambitions": "NOUN", "fujairah": "PROPN", "agreement": "NOUN", "nehru": "PROPN", "photographic": "ADJ", "small": "ADJ", "discuss": "VERB", "sst": "NOUN", "topics": "NOUN", "rangott": "PROPN", "blacked": "VERB", "lethargy": "NOUN", "phuket": "PROPN", "jaws": "NOUN", "upland": "NOUN", "skewering": "VERB", "merry-minded": "ADJ", "rayburn": "PROPN", "awe": "NOUN", "dryer": "NOUN", "measure": "NOUN", "sea": "NOUN", "mortars": "NOUN", "responsibility": "NOUN", "lockhart": "PROPN", "electric": "ADJ", "whelped": "VERB", "baker": "PROPN", "sprits": "NOUN", "antivaxxers": "NOUN", "breathtaking": "ADJ", "haphazardly": "ADV", "orlando": "PROPN", "protestant": "ADJ", "licking": "VERB", "grimy": "ADJ", "sanwiches": "NOUN", "omitted": "VERB", "braysmith": "PROPN", "cramped": "ADJ", "mirrored": "ADJ", "municipal": "ADJ", "or": "CCONJ", "carrot": "NOUN", "autonomy": "NOUN", "grief": "NOUN", "hydor": "PROPN", "efrem": "PROPN", "vitas": "PROPN", "gruffly": "ADV", "poke": "VERB", "…": "PUNCT", "mekong": "PROPN", "correspond": "VERB", "acphillips": "PROPN", "perold": "PROPN", "leno": "PROPN", "rewriting": "VERB", "graveyard": "NOUN", "gangland": "NOUN", "published": "VERB", "view-only": "ADJ", "integrity": "NOUN", "deseret": "PROPN", "strasburgh": "PROPN", "layout": "NOUN", "preferable": "ADJ", "deck": "NOUN", "natives": "NOUN", "acapulco": "PROPN", "focused": "VERB", "rum": "NOUN", "france": "PROPN", "ihop": "PROPN", "objections": "NOUN", "recent": "ADJ", "merged": "VERB", "859-7187": "NUM", "disinclined": "ADJ", "secunia.com": "PROPN", "build": "VERB", "membership": "NOUN", "philipines": "PROPN", "papers": "NOUN", "believers": "NOUN", "uninsured": "ADJ", "c&ic": "PROPN", "casualty": "NOUN", "ashtrays": "NOUN", "lock": "NOUN", "powder": "NOUN", "x365": "NOUN", "sploid.com": "PROPN", "merlot": "PROPN", "manners": "NOUN", "http://www.ebay.co.uk/itm/250927098564?var=550057729382&sspagename=strk:mewax:it&_trksid=p3984.m1438.l2649#ht_2079wt_893": "PROPN", "broome": "PROPN", "grandparents": "NOUN", "dale": "PROPN", "beneficial": "ADJ", "din": "PROPN", "wished": "VERB", "rubell": "PROPN", "spock": "PROPN", "curly": "ADJ", "its": "PRON", "repository": "NOUN", "recited": "VERB", "http://www.csmonitor.com/2006/0509/p02s01-ussc.html?s=t5": "PROPN", "curving": "NOUN", "molecules": "NOUN", "avenue": "PROPN", "collapsible": "ADJ", "crusader": "NOUN", "functionalism": "NOUN", "rooming": "VERB", "thirty-six": "NUM", "hey": "INTJ", "virtue": "NOUN", "baath": "PROPN", "either": "CCONJ", "jacks": "NOUN", "viveurs": "NOUN", "unless": "SCONJ", "bluntly": "ADV", "watch": "VERB", "deregulate": "VERB", "guruswamy": "PROPN", "co-ordination": "NOUN", "kiyani": "PROPN", "pm": "NOUN", "5.8": "NUM", "sterile": "ADJ", "chasers": "NOUN", "algebra": "NOUN", "insoluble": "ADJ", "duchatelet": "PROPN", "herzegovina": "PROPN", "prototype": "NOUN", "dartmouth": "PROPN", "instigated": "VERB", "fuck": "VERB", "embers": "NOUN", "overload": "VERB", "touch-ups": "NOUN", "succeeding": "VERB", "muddying": "VERB", "carvings": "NOUN", "causey": "PROPN", "inspiring": "ADJ", "reptiles": "NOUN", "appy": "NOUN", "allton": "PROPN", "blending": "VERB", "hue": "PROPN", "screen": "NOUN", "archives": "NOUN", "condominiums": "PROPN", "marks": "NOUN", "intersection": "NOUN", "donors": "NOUN", "cynangon": "PROPN", "omelets": "NOUN", "mapping": "NOUN", "‘’": "PUNCT", "opened": "VERB", "fired": "VERB", "cushion": "NOUN", "vitamin": "NOUN", "deoccupy": "PROPN", "160": "NUM", "biding": "VERB", "culminating": "ADJ", "rosé": "NOUN", "breakout": "ADJ", "notices": "VERB", "425-415-3052": "NUM", "leslie": "PROPN", "richmond": "PROPN", "opt": "NOUN", "0590854950": "NUM", "compression": "PROPN", "outdoor": "ADJ", "taste": "NOUN", "]": "PUNCT", "brevet": "NOUN", "well-kept": "ADJ", "stardom": "NOUN", "xml": "PROPN", "seasonally": "ADV", "aquarium": "NOUN", "cassation": "PROPN", "jbennett@gmssr.com": "PROPN", "raser": "PROPN", "1981": "NUM", "bolder": "ADJ", "correspondences": "NOUN", "rvs": "NOUN", "go": "VERB", "maiden": "NOUN", "georgia": "PROPN", "valentine": "PROPN", "noons": "NOUN", "admission": "NOUN", "wether": "SCONJ", "impartial": "ADJ", "credibility": "NOUN", "kohne": "PROPN", "clearwater": "PROPN", "riding": "NOUN", "ireland": "PROPN", "truck": "NOUN", "ranks": "NOUN", "too": "ADV", "alternates": "NOUN", "relax": "VERB", "loins": "NOUN", "banknote": "NOUN", "qe2": "PROPN", "competition": "NOUN", "paint": "NOUN", "rides": "NOUN", "drill": "NOUN", "bayleys": "PROPN", "warmed": "VERB", "toured": "VERB", "1906": "NUM", "retaliated": "VERB", "taxi": "NOUN", "moonlight": "NOUN", "torrance": "PROPN", "200,000": "NUM", "wolfson": "PROPN", "ids": "NOUN", "slid": "VERB", "simple": "ADJ", "companies": "NOUN", "cleaned": "VERB", "plonsky": "PROPN", "affects": "VERB", "clearer": "ADJ", "peaceful": "ADJ", "inducted": "VERB", "path": "NOUN", "paul": "PROPN", "sheffield": "PROPN", "nerve": "NOUN", "jasny": "PROPN", "uttermost": "ADJ", "fidelity": "PROPN", "119th": "ADJ", "appreciated": "VERB", "designer": "NOUN", "sweaters": "NOUN", "again": "ADV", "veggie": "NOUN", "predictors": "NOUN", "hezbollah": "PROPN", "lavatory": "NOUN", "allocated": "VERB", "spirited": "VERB", "0417": "NUM", "sotoun": "PROPN", "cells": "NOUN", "tårs": "PROPN", "sent": "VERB", "1960": "NUM", "detain": "VERB", "weakest": "ADJ", "chamber": "PROPN", "cognitive": "ADJ", "wavered": "VERB", "talbott": "PROPN", "francis": "PROPN", "geologist": "NOUN", "kaufman": "PROPN", "mayor": "NOUN", "britannica": "PROPN", "source": "NOUN", "tortilla": "NOUN", "nearly": "ADV", "biologist": "NOUN", "avenues": "NOUN", "dinosaur": "NOUN", "mannered": "ADJ", "empty": "ADJ", "holy": "ADJ", "bun": "NOUN", "wheezed": "VERB", "notions": "NOUN", "greatly": "ADV", "guardians": "NOUN", "rafik": "PROPN", "mesa": "PROPN", "tribulation": "NOUN", "http://www.cic.gc.ca/english/contacts/index.asp": "PROPN", "herman": "PROPN", "gothic": "ADJ", "stoollala": "PROPN", "teams": "NOUN", "tasty": "ADJ", "skipped": "VERB", "sulphuric": "ADJ", "slfmr": "PROPN", "yau": "PROPN", "bookshop": "NOUN", "peeing": "VERB", "molly": "PROPN", "predestination": "NOUN", "outstanding": "ADJ", "re-writing": "VERB", "obl": "PROPN", "yoko": "PROPN", "tasteful": "ADJ", "eyewitnesses": "NOUN", "much": "ADV", "acres": "NOUN", "alias": "NOUN", "6.00": "NUM", "sorrowstricken": "ADJ", "mitigated": "VERB", "consist": "VERB", "rakau": "NOUN", "ponchatoula": "PROPN", "monstrous": "ADJ", "^": "PUNCT", "footlight": "NOUN", "standing": "VERB", "battled": "VERB", "deadlines": "NOUN", "abhorrent": "ADJ", "checkups": "NOUN", "blasted": "VERB", "miui": "PROPN", "essence": "NOUN", "unforgivable": "ADJ", "audible": "ADJ", "reve-": "INTJ", "withered": "ADJ", "advisable": "ADJ", "her": "PRON", "celebrating": "VERB", "b": "NUM", "anna": "PROPN", "6400": "NUM", "ann": "PROPN", "fang": "PROPN", "picking": "VERB", "p&i": "NOUN", "insure": "VERB", "link": "NOUN", "dave": "PROPN", "bio": "NOUN", "flirting": "NOUN", "exchanges": "VERB", "accelerations": "NOUN", "aluminum": "NOUN", "reaching": "VERB", "ranong": "PROPN", "dread": "VERB", "380": "NUM", "postponement": "NOUN", "locate": "VERB", "controlling": "VERB", "sold": "VERB", "statements": "NOUN", "tranced": "ADJ", "counsel": "NOUN", "talk": "VERB", "??": "PUNCT", "whiskered": "ADJ", "mujahidin": "NOUN", "chips": "NOUN", "thing": "NOUN", "exclaiming": "VERB", "clubs": "NOUN", "cried": "VERB", "necessary": "ADJ", "varies": "VERB", "nomenclature": "NOUN", "ramifications": "NOUN", "lease": "NOUN", "inquire": "VERB", "hieronymus": "PROPN", "concessions": "NOUN", "pivotal": "ADJ", "biological": "ADJ", "multiply": "VERB", "allocate": "VERB", "non-moslem": "ADJ", "posthumously": "ADV", "unexplained": "ADJ", "crosses": "VERB", "folder": "NOUN", "dr": "PROPN", "symbolic": "ADJ", "singapore": "PROPN", "bidders": "NOUN", "azov": "PROPN", "non-crumbly": "ADJ", "toes": "NOUN", "inclusive": "ADJ", "sunbathing": "NOUN", "liked": "VERB", "gant": "ADJ", "jen": "PROPN", "boldness": "NOUN", "hogsmeade": "PROPN", "delightedly": "ADV", "hi": "INTJ", "migrate": "VERB", "shrek": "PROPN", "rudest": "ADJ", "solemnities": "NOUN", "electromagnetic": "ADJ", "daly": "PROPN", "alternately": "ADV", "estonia": "PROPN", "homes": "NOUN", "cruiseline": "NOUN", "stitch": "NOUN", "scratching": "VERB", "sizzling": "VERB", "represent.com": "PROPN", "feet": "NOUN", "confrontation": "NOUN", "total": "ADJ", "teach": "VERB", "gorbachev": "PROPN", "plt": "NOUN", "carytown": "PROPN", "waziristan": "PROPN", "bourg": "PROPN", "wta": "PROPN", "schema": "NOUN", "jalalabad": "PROPN", "aim": "NOUN", "forty-eight": "NUM", "caution": "NOUN", "unresponsive": "ADJ", "degenerate": "ADJ", "confidants": "NOUN", "easter": "PROPN", "lacked": "VERB", "sputnik": "PROPN", "gingerly": "ADV", "businesslike": "ADJ", "dishes": "NOUN", "expansion": "NOUN", "administrations": "NOUN", "bestowed": "VERB", "alarms": "NOUN", "evident": "ADJ", "tweet": "NOUN", "plight": "NOUN", "pipes": "NOUN", "pirker": "PROPN", "6565": "NUM", "cardinal": "ADJ", "container": "NOUN", "12:48": "NUM", "ltte": "PROPN", "….": "PUNCT", "institutionally": "ADV", "navigator": "PROPN", "faceless": "ADJ", "crippled": "ADJ", "stop": "VERB", "tacoma": "PROPN", "organizations": "NOUN", "underwriting": "NOUN", "old-fashioned": "ADJ", "manipulate": "VERB", "bowed": "VERB", "dalmatia": "PROPN", "tis": "PROPN", "francs": "NOUN", "dance": "NOUN", "cliffside": "PROPN", "2.00": "NUM", "velvet": "NOUN", "erik": "PROPN", "balkans": "PROPN", "zinc": "NOUN", "starring": "VERB", "xml-like": "ADJ", "robotically": "ADV", "3:15": "NUM", "purus'a": "NOUN", "suggestions": "NOUN", "porpoise": "PROPN", "smoothly": "ADV", "8:00": "NUM", "knocking": "VERB", "aggressively": "ADV", "firstborn": "ADJ", "zionist": "ADJ", "sledge": "NOUN", "blurred": "VERB", "attachments": "NOUN", "parenthetically": "ADV", "waited": "VERB", "uncomprehendingly": "ADV", "compel": "VERB", "coquette": "NOUN", "jeffrey": "PROPN", "retained": "VERB", "fruity": "ADJ", "ei.london": "PROPN", "tiananmen": "PROPN", "judaism": "PROPN", "interruptions": "NOUN", "convulsed": "VERB", "generates": "VERB", "unexplored": "ADJ", "sba": "PROPN", "achieve": "VERB", "handing": "VERB", "camping": "VERB", "studymate": "NOUN", "1729": "NUM", "vespers": "PROPN", "rapid": "ADJ", "chalk": "NOUN", "relationships": "NOUN", "il": "PROPN", "courtroom": "NOUN", "secretaries": "NOUN", "ferry": "NOUN", "drilling": "NOUN", "formally": "ADV", "tale": "NOUN", "1562": "NUM", "constrained": "VERB", "contented": "ADJ", "overdone": "VERB", "craig": "PROPN", "announce": "VERB", "blog": "NOUN", "eichelberger": "PROPN", "1635": "NUM", "simplicity": "NOUN", "enriched": "VERB", "jumping": "VERB", "celebrations": "NOUN", "lakefront": "NOUN", "commemorate": "VERB", "jeopardised": "VERB", "audiotape": "NOUN", "counterweight": "NOUN", "vs": "ADP", "presidents": "NOUN", "202.582.1234": "NUM", "ge": "PROPN", "moriaty": "PROPN", "federation": "NOUN", "sewers": "NOUN", "interrupted": "VERB", "disclaim": "VERB", "enjoys": "VERB", "mashhad": "PROPN", "fore-and-aft": "ADV", "31,000": "NUM", "nearsightedness": "NOUN", "equals": "VERB", "becoming": "VERB", "chasing": "VERB", "literaly": "ADV", "encouragement": "NOUN", "tuned": "VERB", "caters": "VERB", "series": "NOUN", "key": "ADJ", "euro": "PROPN", "enw_gcp": "PROPN", "pronoun": "NOUN", "unmarked": "ADJ", "fredonia": "PROPN", "michael.mcdermott@spectrongroup.com": "PROPN", "wounds": "NOUN", "callum": "PROPN", "infant": "NOUN", "amazed": "VERB", "languid": "ADJ", "naw": "INTJ", "geography": "NOUN", "kwik": "PROPN", "26/09/2000": "NUM", "taylor": "PROPN", "obsidian": "NOUN", "cosy": "ADJ", "effectually": "ADV", "silver-nailed": "ADJ", "influences": "NOUN", "gunpowder": "NOUN", "warning": "NOUN", "k": "NUM", "affectionate": "ADJ", "stroked": "VERB", "self-pity": "NOUN", "shukrijumah": "PROPN", "collecting": "VERB", "ß": "SYM", "tariff": "NOUN", "hindu": "ADJ", "garret": "NOUN", "spark": "NOUN", "1000": "NUM", "dept": "NOUN", "edmonton": "PROPN", "python": "NOUN", "inventory": "NOUN", "contentious": "ADJ", "invaded": "VERB", "cabin": "NOUN", "subscribed": "VERB", "historicism": "NOUN", "blood": "NOUN", "response": "NOUN", "milestone": "NOUN", "chorion": "NOUN", "research": "NOUN", "ship": "NOUN", "hit": "VERB", "dsl": "NOUN", "resistless": "ADJ", "underpinned": "VERB", "developments": "NOUN", "fools": "NOUN", "a'nandamu'rti": "PROPN", "ops": "NOUN", "intelligencer": "PROPN", "181,000": "NUM", "lb": "NOUN", "datasheets": "NOUN", "booking": "VERB", "hearts": "NOUN", "yousef": "PROPN", "bmc...@patriot.net": "PROPN", "phobic": "ADJ", "+4533330040": "NUM", "stirrups": "NOUN", "projectile": "NOUN", "quadruplets": "NOUN", "choose": "VERB", "provisions": "NOUN", "recuperation": "PROPN", "buried": "VERB", "kunst": "PROPN", "paternalist": "ADJ", "stops": "VERB", "midmarket": "ADJ", "63": "NUM", "thickness": "NOUN", "sect": "NOUN", "swivels": "VERB", "disease": "NOUN", "leavenworth": "PROPN", "anesthesia": "NOUN", "confessor": "NOUN", "spray": "NOUN", "pump": "NOUN", "originality": "NOUN", "building": "NOUN", "neighbor": "NOUN", "seeds": "NOUN", "reliant": "PROPN", "worthless": "ADJ", "hybrid": "NOUN", "antarctic": "ADJ", "intervals": "NOUN", "interfering": "VERB", "licensed": "VERB", "bevelled": "ADJ", "forbidding": "VERB", "civet": "NOUN", "readily": "ADV", "custom": "ADJ", "skies": "NOUN", "cubist": "ADJ", "sourness": "NOUN", "unmik": "PROPN", "revise": "VERB", "nx1": "NOUN", "olfactory": "ADJ", "steppers": "NOUN", "style": "NOUN", "counteract": "VERB", "mailto:rosario.gonzales@compaq.com": "PROPN", "thumbs": "NOUN", "lousy": "ADJ", "sitting": "VERB", "vessels": "NOUN", "thir": "INTJ", "manliness": "NOUN", "slaughter": "VERB", "vacations": "NOUN", "experice": "NOUN", "auguste": "PROPN", "estuary": "NOUN", "ancestral": "ADJ", "verbs": "NOUN", "tangipahoa": "PROPN", "timings": "NOUN", "slobber": "NOUN", "2500": "NUM", "embassies": "NOUN", "polytheism": "NOUN", "1980": "NUM", "courts": "NOUN", "spacewalks": "NOUN", "e-meter": "PROPN", "climbing": "VERB", "robotics": "NOUN", "energetics": "NOUN", "quickening": "VERB", "intercompany": "ADJ", "buttons": "NOUN", "eb": "PROPN", "flds": "PROPN", "licensing": "NOUN", "budge": "VERB", "blocks": "NOUN", "chunk": "NOUN", "lifetimes": "NOUN", "philonise": "PROPN", "amused": "ADJ", "0.4": "NUM", "obviously": "ADV", "mécanique": "PROPN", "09:56": "NUM", "adulterated": "VERB", "parcel": "NOUN", "msu": "PROPN", "underfoot": "ADV", "inspecting": "VERB", "terme": "PROPN", "er": "NOUN", "reside": "VERB", "gravity": "NOUN", "alternative": "ADJ", "bike": "NOUN", "acute": "ADJ", "weiner": "PROPN", "unease": "NOUN", "infocus": "PROPN", "frigidity": "NOUN", "anthropology": "NOUN", "skipping": "VERB", "shove": "VERB", "acoustically": "ADV", "raiding": "VERB", "21st": "ADJ", "02:28": "NUM", "disturbing": "ADJ", "need": "VERB", ".!": "PUNCT", "crafted": "VERB", "hoists": "VERB", "ernie": "PROPN", "++++++": "PUNCT", "stones": "NOUN", "hole": "NOUN", "lora.sullivan@enron.com": "PROPN", "1969": "NUM", "grassroots": "NOUN", "bends": "VERB", "murray": "PROPN", "moreton": "PROPN", "eikon": "NOUN", "counter-terrorism": "NOUN", "cem": "PROPN", "cries": "VERB", "10.99": "NUM", "cross-linguistic": "ADJ", "interference": "NOUN", "monitor": "VERB", "talks": "NOUN", "guideline": "NOUN", "progress": "NOUN", "suburban": "ADJ", "aplocheilus": "PROPN", "unvocal": "ADJ", "langeland": "PROPN", "rusk": "PROPN", "consequential": "ADJ", ".04": "NUM", "strip": "VERB", "identities": "NOUN", "o'toole": "PROPN", "bankruptcies": "NOUN", "align": "VERB", "economists": "NOUN", "youthful": "ADJ", "semantics": "NOUN", "infested": "VERB", "gunmen": "NOUN", "aleksei": "PROPN", "footsteps": "NOUN", "their": "PRON", "sun-yellowed": "ADJ", "dreamworks": "PROPN", "asses": "NOUN", "blowdry": "NOUN", "sparks": "NOUN", "dipping": "VERB", "pattern": "NOUN", "pick": "VERB", "serious": "ADJ", "weed": "NOUN", "policies": "NOUN", "persecution": "NOUN", "distilled": "VERB", "station": "NOUN", "ascertain": "VERB", "inspectors": "NOUN", "contractors": "NOUN", "favourable": "ADJ", "satan": "PROPN", "exclude": "VERB", "richardson": "PROPN", "effort": "NOUN", "limes": "NOUN", "analyzed": "VERB", "coz": "SCONJ", "criminal": "ADJ", "denote": "VERB", "fitness": "NOUN", "hapupu": "PROPN", "insignia": "NOUN", "loosen": "VERB", "relativist": "ADJ", "jars": "NOUN", "sublime": "ADJ", "hormuz": "PROPN", "tripped": "VERB", "nipping": "VERB", "sporting": "VERB", "o.k.": "ADJ", "awareness": "NOUN", "remodeled": "VERB", "sue": "PROPN", "aaron": "PROPN", "aubrey": "PROPN", "battle": "NOUN", "brook": "PROPN", "genocide": "NOUN", "places": "NOUN", "double": "ADJ", "lotte": "PROPN", "restfully": "ADV", "capital": "NOUN", "attributes": "NOUN", "akashi": "PROPN", "freely": "ADV", "cults": "NOUN", "revolutions": "NOUN", "vocalist": "NOUN", "37th": "ADJ", "banging": "VERB", "crossed": "VERB", "commentators": "NOUN", "confusion": "NOUN", "creators": "NOUN", "northern": "ADJ", "foreman": "PROPN", "lme": "PROPN", "monti": "PROPN", "roughhousing": "NOUN", "urging": "NOUN", "larbalestier": "PROPN", "vignieri": "PROPN", "hangs": "VERB", "rail": "NOUN", "tell": "VERB", "rees": "PROPN", "[": "PUNCT", "navtej": "PROPN", "dbe": "PROPN", "potted": "ADJ", "paralympic": "ADJ", "mindset": "NOUN", "offset": "VERB", "fireflies": "PROPN", "mutation": "NOUN", "obese": "ADJ", "grains": "NOUN", "monotonous": "ADJ", "contenders": "NOUN", "census": "NOUN", "opens": "VERB", "transvestite": "NOUN", "lihaib": "PROPN", "disown": "VERB", "cargo": "NOUN", "plug": "NOUN", "belonged": "VERB", "unconscious": "ADJ", "catherine": "PROPN", "2010": "NUM", "traded": "VERB", "csis": "PROPN", "empathy": "NOUN", "insulting": "ADJ", "wwii": "PROPN", "33a": "SYM", "peanut": "NOUN", "february": "PROPN", "ongoing": "ADJ", "beijing": "PROPN", "obstacle": "NOUN", "fetched": "ADJ", "healthiest": "ADJ", "carcinoma": "NOUN", "runway": "NOUN", "miert": "PROPN", "melanie": "PROPN", "ghosts": "NOUN", "smorgasbord": "NOUN", "leg": "NOUN", "risking": "VERB", "kiev": "PROPN", "convey": "VERB", "satellites": "NOUN", "thanks": "NOUN", "journeying": "VERB", "foolish": "ADJ", "abbey": "PROPN", "backs": "NOUN", "resulting": "VERB", "legit": "ADJ", "hinges": "NOUN", "patients": "NOUN", "abrasive": "ADJ", "extremity": "NOUN", "prevalent": "ADJ", "groningen": "PROPN", "wine-growing": "VERB", "continuing": "VERB", "controllers": "NOUN", "slant": "ADJ", "clauses": "NOUN", "splendour": "NOUN", "insomnia": "NOUN", "brushed": "VERB", "vigilant": "ADJ", "2,000": "NUM", "hissed": "VERB", "opposed": "VERB", "unrelated": "ADJ", "ebbed": "VERB", "remilitarization": "NOUN", "aryan": "ADJ", "giuliana": "PROPN", "713-654-1281": "NUM", "blinding": "ADJ", "nations": "PROPN", "mongolia": "PROPN", "ʒan": "PROPN", "feast": "NOUN", "shippers": "NOUN", "man-of-war": "NOUN", "bible": "PROPN", "eberhard": "PROPN", "depends": "VERB", "she": "PRON", "kronos": "PROPN", "pinpointed": "VERB", "nineteenth": "ADJ", "stridon": "PROPN", "rang": "VERB", "whelmed": "ADJ", "artillery": "NOUN", "tanglewood": "PROPN", "chain-gang": "NOUN", "expelling": "VERB", "07:50": "NUM", "disputed": "VERB", "kingsman": "PROPN", "cookbook": "NOUN", "calculator": "NOUN", "rawalpindi": "PROPN", "losses": "NOUN", "tofu": "NOUN", "rattled": "VERB", "1758": "NUM", "vocal": "ADJ", "qatar": "PROPN", "cabinet": "NOUN", "mid-air": "NOUN", "around": "ADP", "shook": "VERB", "somberness": "NOUN", "allotted": "VERB", "satanic": "ADJ", "c.l.h.warwick@durham.ac.uk": "PROPN", "emergent": "ADJ", "modell": "PROPN", "spinach": "NOUN", "harboring": "VERB", "hay": "NOUN", "epis.": "ADJ", "arched": "ADJ", "temperate": "ADJ", "divans": "NOUN", "efficacy": "NOUN", "promote": "VERB", "involves": "VERB", "nclan": "PROPN", "skills": "NOUN", "http://www.ukrainianweb.com/chernobyl_ukraine.htm": "PROPN", "grandly": "ADV", "span": "NOUN", "throat": "NOUN", "towers": "NOUN", "nudes": "NOUN", "chavez": "PROPN", "cruz": "PROPN", "snakes": "NOUN", "-": "PUNCT", "rightholder": "NOUN", "passports": "NOUN", "condition": "NOUN", "briefed": "VERB", "rationale": "NOUN", "starfighter": "NOUN", "pantry": "NOUN", "quetta": "PROPN", "sept.": "PROPN", "loosing": "VERB", "fairer": "ADJ", "wastes": "NOUN", "north": "PROPN", "micro": "PROPN", "potential": "ADJ", "absorb": "VERB", "gusts": "NOUN", "besieged": "VERB", "immaculately": "ADV", "objects": "NOUN", "aswered": "VERB", "bonacci": "PROPN", "me$$age": "NOUN", "ethnically": "ADV", "consequently": "ADV", "protested": "VERB", "1800s": "NOUN", "shrugging": "VERB", "predict": "VERB", "dissolved": "VERB", "homosexuals": "NOUN", "bookstands": "NOUN", "leaflets": "NOUN", "'05": "NUM", "markings": "NOUN", "amended": "VERB", "facts": "NOUN", "tutor": "NOUN", "injurious": "ADJ", "impassively": "ADV", "nonsensical": "ADJ", "colonialists": "NOUN", "landmark": "NOUN", "tucked": "VERB", ";)": "SYM", "leicester": "PROPN", "eulogic": "PROPN", "comparative": "ADJ", "tucson": "PROPN", "weird": "ADJ", "adviser": "NOUN", "bali": "PROPN", "stores": "NOUN", "narcotics": "NOUN", "awol": "ADJ", "definite": "ADJ", "ohh": "INTJ", "accomdating": "ADJ", "leporjj@selectenergy.com": "PROPN", "inhabits": "VERB", "thorell": "PROPN", "––": "PUNCT", "http://www.collectinghistory.net/chernobyl/": "PROPN", "vibrated": "VERB", "notify": "VERB", "includes": "VERB", "pointless": "ADJ", "marionette": "NOUN", "anti-democratic": "ADJ", "tehran": "PROPN", "2005": "NUM", "broadcast": "VERB", "disagree": "VERB", "fastened": "VERB", "spent": "VERB", "schedules": "NOUN", "picture": "NOUN", "stub": "NOUN", "1750": "NUM", "pork": "NOUN", "aching": "VERB", "bears": "NOUN", "portrayal": "NOUN", "disregard": "NOUN", "meant": "VERB", "any": "DET", "wholly": "ADV", "anemic": "ADJ", "behaving": "VERB", "outrunners": "NOUN", "shoulders": "NOUN", "appealed": "VERB", "timer": "NOUN", "santer": "PROPN", "half-a-crown": "NOUN", "wil": "AUX", "signs": "NOUN", "callon": "PROPN", "hoax": "NOUN", "quart": "NOUN", "alireza": "PROPN", "collections": "NOUN", "55,008": "NUM", "sicilian": "ADJ", "populate": "VERB", "horribly": "ADV", "gentilz": "PROPN", "voivodship": "PROPN", "painting": "NOUN", "bitmap": "NOUN", "scarne": "PROPN", "flashlights": "NOUN", "ranjit": "PROPN", "independents": "NOUN", "grabs": "VERB", "sa-": "INTJ", "phases": "NOUN", "target": "NOUN", "tugging": "VERB", "over-priced": "ADJ", "non-human": "ADJ", "careful": "ADJ", "nagin": "PROPN", "ratepayer": "NOUN", "anti-bush": "ADJ", "foods": "NOUN", "11.8": "NUM", "prudence": "NOUN", "finch": "NOUN", "narrative": "ADJ", "02:02": "NUM", "skittle": "PROPN", "west": "PROPN", "microbiologist": "NOUN", "advocates": "NOUN", "coursed": "VERB", "forelimb": "NOUN", "ease": "NOUN", "hangout": "NOUN", "greys": "NOUN", "inter-animation": "NOUN", "02:42": "NUM", "beefing": "VERB", "rhodesians": "NOUN", "princeton": "PROPN", "depiction": "NOUN", "demonstrations": "NOUN", "hears": "VERB", "brunaanastacio@hotmail.com": "PROPN", "issued": "VERB", "stilted": "ADJ", "imbalances": "NOUN", "strobe": "NOUN", "unconnected": "ADJ", "prague": "PROPN", "broke": "VERB", "inwards": "ADV", "birds": "NOUN", "analysts": "NOUN", "intimate": "ADJ", "hardliners": "NOUN", "sean.cooper@elpaso.com": "PROPN", "czechoslovakia": "PROPN", "respect": "NOUN", "sale": "NOUN", "hui": "PROPN", "fattening": "VERB", "turkmenistan": "PROPN", "seizure": "NOUN", "residential": "ADJ", "paraphernalia": "NOUN", "rationalist": "PROPN", "ʃɑʁl": "PROPN", "owing": "VERB", "padlocked": "VERB", "virus": "NOUN", "pimentel": "PROPN", "thirty-five": "NUM", "birla": "PROPN", "enron": "PROPN", "1940s": "NOUN", "photographers": "NOUN", "front": "NOUN", "resorted": "VERB", "petersen": "PROPN", "cinematic": "ADJ", "ankle": "NOUN", "jarrold": "PROPN", "spitfire": "PROPN", "independent": "ADJ", "http://www.ucei.berkeley.edu/ucei": "PROPN", "speculator": "NOUN", "759933": "NUM", "irene": "PROPN", "relief": "NOUN", "usmani": "PROPN", "hotheads": "NOUN", "newark": "PROPN", "carlo": "PROPN", "house-elf": "NOUN", "sawdust": "NOUN", "podcasts": "NOUN", "optimized": "VERB", "machines": "NOUN", "resisting": "VERB", "typically": "ADV", "petri": "PROPN", "doors": "NOUN", "direction": "NOUN", "philanthropic": "ADJ", "l'instant": "PROPN", "invitation": "NOUN", "chad": "PROPN", "07/18/2000": "NUM", "transforming": "VERB", "evangelicals": "PROPN", "sofa": "NOUN", "cheekbones": "NOUN", "initiated": "VERB", "confidential": "ADJ", "specifics": "NOUN", "575": "NUM", "bumfluff": "NOUN", "uncontaminated": "ADJ", "projectlondonmovie.com": "PROPN", "08": "NUM", "actionable": "ADJ", "422,000": "NUM", "hesitations": "NOUN", "cosplay": "NOUN", "dee": "PROPN", "braunsberg": "PROPN", "gin": "NOUN", "non-lexical": "ADJ", "7034": "NUM", "96/96/ec": "NUM", "lure": "NOUN", "psalmist": "PROPN", "aspire": "VERB", "slaves": "NOUN", "crosse": "PROPN", "wondered": "VERB", "aspirin": "NOUN", "glasses": "NOUN", "subforms": "NOUN", "unsustainable": "ADJ", "massive": "ADJ", "trainers": "NOUN", "brooded": "VERB", "beardies": "NOUN", "sends": "VERB", "jihadist": "NOUN", "initiation": "NOUN", "killie": "NOUN", "investigación": "PROPN", "heating": "NOUN", "striving": "NOUN", "chaser": "NOUN", "747": "NUM", "fishman": "PROPN", "inconsiderable": "ADJ", "monitoring": "NOUN", "savier": "PROPN", "versailles": "NOUN", "islamabad": "PROPN", "blasting": "NOUN", "grade": "NOUN", "62nd": "ADJ", "flannel": "NOUN", "sisters": "NOUN", "intercom": "NOUN", "sighing": "VERB", "volcanic": "ADJ", "none": "PRON", "shedding": "VERB", "palace": "NOUN", "architecturally": "ADV", "eu": "PROPN", "separation": "NOUN", "procedure": "NOUN", "grueling": "ADJ", "accomplished": "VERB", "nigeria": "PROPN", "disatisfied": "ADJ", "basic": "ADJ", "voters": "NOUN", "robertson": "PROPN", "willl": "AUX", "peacetime": "NOUN", "misto": "NOUN", "pink": "ADJ", "wherein": "ADV", "stan": "PROPN", "feminism": "NOUN", "crusade": "NOUN", "apogee": "NOUN", "premised": "VERB", "beans": "NOUN", "roadshows": "NOUN", "self": "NOUN", "mourey": "PROPN", "coals": "NOUN", "tonnage": "NOUN", "drew": "VERB", "aggravation": "NOUN", "gleams": "NOUN", "multiple": "ADJ", "scapular": "NOUN", "packets": "NOUN", "sunlight": "NOUN", "juicy": "ADJ", "paratexts": "NOUN", "reluctant": "ADJ", "overheats": "VERB", "evzone": "ADJ", "aeronautics": "PROPN", "armaments": "NOUN", "1602": "NUM", "visas": "NOUN", "ravines": "NOUN", "inattentive": "ADJ", "ceased": "VERB", "potatos": "NOUN", "threatening": "VERB", "distances": "NOUN", "anglo": "ADJ", "commentaries": "NOUN", "thanx": "NOUN", "commence": "VERB", "reconcile": "VERB", "wayne": "PROPN", "rond": "PROPN", "anti-luther": "ADJ", "fulfilling": "VERB", "spiraled": "VERB", "'cause": "SCONJ", "done": "VERB", "ashfaq": "PROPN", "universe": "NOUN", "getting": "VERB", "retailing": "VERB", "untitled": "VERB", "lightning": "NOUN", "hunkering": "VERB", "bark": "NOUN", "standards": "NOUN", "soccer": "NOUN", "interpolated": "VERB", "1988": "NUM", "increasing": "VERB", "transcripts": "NOUN", "rescued": "VERB", "carpenter": "NOUN", "raiser": "NOUN", "coogan": "PROPN", "resurrect": "VERB", "speak": "VERB", "peterson": "PROPN", "panes": "NOUN", "earthly": "ADJ", "syria": "PROPN", "1830s": "NOUN", "hankering": "VERB", "6/4/11": "NUM", "iotm": "PROPN", "experiencing": "VERB", "slimskim": "PROPN", "mesoamerica": "PROPN", "dressers": "NOUN", "mt": "NOUN", "denton": "PROPN", "dekalb": "PROPN", "nunzio": "PROPN", "nva": "PROPN", "tyneside": "PROPN", "eclipses": "NOUN", "alarmingly": "ADV", "gas": "NOUN", "questionnaires": "NOUN", "varnished": "ADJ", "denise": "PROPN", "unconcious": "ADJ", "lawful": "ADJ", "projections": "NOUN", "jeff": "PROPN", "uninspired": "ADJ", "cluster": "NOUN", "dna": "NOUN", "thousand": "NUM", "investigators": "NOUN", "minutes": "NOUN", "flush": "NOUN", "s": "PART", "lunchboxes": "NOUN", "wriggle": "NOUN", "brideshead": "PROPN", "proposal": "NOUN", "procrastination": "NOUN", "ave.": "PROPN", "eradicate": "VERB", "levi": "PROPN", "bared": "VERB", "540,000": "NUM", "differentiate": "VERB", "ragga": "NOUN", "science": "NOUN", "torrents": "NOUN", "naturalistic": "ADJ", "shuddering": "NOUN", "carrano": "PROPN", "buddies": "NOUN", "wii": "PROPN", "nazarenes": "PROPN", "seeing": "VERB", "re-purpose": "VERB", "coal": "NOUN", "m.nordstrom@pecorp.com": "PROPN", "directly": "ADV", "cullen": "PROPN", "exploitation": "NOUN", "winter": "NOUN", "inuit": "ADJ", "d-": "INTJ", "velocity": "NOUN", "bookkeeping": "NOUN", "barren": "ADJ", "rs": "SYM", "arrv.": "VERB", "brian": "PROPN", "disappearance": "NOUN", "1.": "NUM", "rockies": "PROPN", "saves": "VERB", "theravada": "PROPN", "collages": "NOUN", "unfavourable": "ADJ", "dismay": "NOUN", "watchful": "ADJ", "panza": "PROPN", "cyd": "PROPN", "866": "NUM", "rabin": "PROPN", "uncle": "NOUN", "glaring": "ADJ", "revolutionary": "ADJ", "lindqvist": "PROPN", "finkelstein": "PROPN", "129": "NUM", "&": "CCONJ", "10016": "NUM", "exploding": "VERB", "gm": "PROPN", "clouds": "NOUN", "couches": "NOUN", "transformational": "ADJ", "ham": "NOUN", "thorough": "ADJ", "exactly": "ADV", "insecurities": "NOUN", "carbons": "NOUN", "eleuthra": "PROPN", "afternoon": "NOUN", "cloak": "NOUN", "differing": "VERB", "corey": "PROPN", "certain": "ADJ", "serried": "ADJ", "veer": "VERB", "foodies": "NOUN", "rosette": "NOUN", "unfaithful": "ADJ", "manchester": "PROPN", "biochemist": "NOUN", "hacked": "VERB", "learning": "NOUN", "m300": "PROPN", "breathe": "VERB", "revolves": "VERB", "par": "ADJ", "khosla": "PROPN", "13389": "NUM", "constant": "ADJ", "dazzling": "ADJ", "commissioners": "NOUN", "intuition": "NOUN", "trial": "NOUN", "drenched": "VERB", "yucatán": "PROPN", "energetic": "ADJ", "stockings": "NOUN", "criminals": "NOUN", "future": "NOUN", "neoplatonic": "ADJ", "yea": "INTJ", ".": "PUNCT", "unmolested": "ADJ", "returnees": "NOUN", "lobbed": "VERB", "tennis": "NOUN", "lick": "VERB", "gulping": "VERB", "chan": "PROPN", "tolerable": "ADJ", "displacements": "NOUN", "iv": "NOUN", "benefits": "NOUN", "juno": "PROPN", "next": "ADJ", "respectively": "ADV", "hibernate": "VERB", "betray": "VERB", "stockpiles": "NOUN", "haircuts": "NOUN", "extrcurricular": "ADJ", "boxes": "NOUN", "buildings": "NOUN", "pain": "NOUN", "echo": "VERB", "riverside": "PROPN", "non-muslim": "ADJ", "arguing": "VERB", "siddiqui": "PROPN", "downstairs": "ADV", "percy": "PROPN", "tre": "PROPN", "evolution": "NOUN", "bruises": "NOUN", "lebanon": "PROPN", "inquiry": "NOUN", "cheered": "VERB", "poor": "ADJ", "veritable": "ADJ", "noone": "PRON", "stony": "ADJ", "surgically": "ADV", "bernhard": "PROPN", "mocking": "NOUN", "alphabets": "NOUN", "pill": "NOUN", "ncaa": "PROPN", "churchyards": "NOUN", "righ...@sonic.net": "PROPN", "querelle": "PROPN", "bazar": "PROPN", "chiropractric": "NOUN", "h-0002/99": "NUM", "windows": "NOUN", "wangs": "NOUN", "hopelessness": "NOUN", "heartbreaks": "NOUN", "binderman": "PROPN", "heck": "NOUN", "blend": "NOUN", "bta": "PROPN", "massoud": "PROPN", "whdh": "PROPN", "effortful": "ADJ", "knee": "NOUN", "improving": "VERB", "207": "NUM", "7:35": "NUM", "analytical": "ADJ", "frontiersman": "NOUN", "eng.": "ADJ", "proprietary": "ADJ", "====================================================": "SYM", "bissen": "PROPN", "embedded": "VERB", "saplings": "NOUN", "flopping": "NOUN", "detract": "VERB", "season": "NOUN", "12/14/2000": "NUM", "bettas": "NOUN", "paper": "NOUN", "canceling": "VERB", "nightclubs": "NOUN", "algae": "NOUN", "jonathan": "PROPN", "talking": "VERB", "clothes": "NOUN", "dynegy": "PROPN", "jolt": "VERB", "carrasco": "PROPN", "petrarch": "PROPN", "bearded": "ADJ", "marry": "VERB", "sped": "VERB", "roadhouse": "PROPN", "teh": "DET", "f.r.s.": "PROPN", "cybernetic": "ADJ", "529999204044": "NUM", "lauded": "VERB", "rate": "NOUN", "conquerors": "NOUN", "vying": "VERB", "countless": "ADJ", "claire.bailey-ross@port.ac.uk": "PROPN", "foul": "ADJ", "miller": "PROPN", "sneaks": "VERB", "|--------+----------------------->": "PUNCT", "okabayashi": "PROPN", "wholesome": "ADJ", "abomination": "NOUN", "direct": "ADJ", "832.676.3177": "NUM", "penultimate": "ADJ", "micron": "NOUN", "n.o.": "PROPN", "reorganisation": "NOUN", "corbyn": "PROPN", "delay": "NOUN", "saxby": "PROPN", "lemelpe@nu.com": "PROPN", "insecticide": "NOUN", "mornings": "NOUN", "unwitting": "ADJ", "replied": "VERB", "dress": "NOUN", "pail": "NOUN", "grove": "NOUN", "tsarevna": "PROPN", "phoney": "ADJ", "hurricane": "PROPN", "tomb": "NOUN", "33rd": "ADJ", "clips": "NOUN", "cheese": "NOUN", "dallas": "PROPN", "raises": "VERB", "60's": "NOUN", "51": "NUM", "type": "NOUN", "bday": "NOUN", "tome": "NOUN", "mohammad": "PROPN", "prepayment": "NOUN", "toilet": "NOUN", "atty": "NOUN", "porte": "PROPN", "levers": "NOUN", "despective": "ADJ", "6500": "NUM", "no-44": "NUM", "comfortable": "ADJ", "sixteenth": "ADJ", "happy": "ADJ", "panicking": "VERB", "strutting": "VERB", "cyanogen": "PROPN", "systematically": "ADV", "sprouts": "NOUN", "#istandwithahmed": "PROPN", "talent": "NOUN", "mid-size": "ADJ", "pixie": "NOUN", "ups": "NOUN", "clelia": "PROPN", "chitonga": "PROPN", "neighbouring": "VERB", "crown": "NOUN", "spending": "VERB", "sunburn": "PROPN", "tbh": "ADV", "than": "ADP", "moi": "PROPN", "hydration": "NOUN", "court": "PROPN", "hedwig": "PROPN", "rothko": "PROPN", "minute": "NOUN", "c": "PROPN", "sleigh": "NOUN", "chronicler": "NOUN", "$$": "SYM", "ordained": "VERB", "civilians": "NOUN", "deities": "NOUN", "forcefully": "ADV", "auckland": "PROPN", "1s9": "NOUN", "northwestern": "PROPN", "alvarado": "PROPN", "time": "NOUN", "iguana": "NOUN", "hr": "NOUN", "re-election": "NOUN", "chant": "VERB", "manuscript": "NOUN", "critters": "NOUN", "pretended": "VERB", "lauding": "VERB", "wields": "VERB", "behavior": "NOUN", "retake": "VERB", "!!!?": "PUNCT", ",?": "PUNCT", "grimace": "NOUN", "pinching": "VERB", "consumed": "VERB", "airline": "NOUN", "rotating": "VERB", "sophie": "PROPN", "precious": "ADJ", "soon": "ADV", "maya": "PROPN", "z": "NOUN", "turmoil": "NOUN", "comfortably": "ADV", "nadereh": "PROPN", "sf": "PROPN", "torneby": "PROPN", "laid": "VERB", "utilize": "VERB", "independently": "ADV", "mandy": "PROPN", "estimates": "NOUN", "cocked": "ADJ", "energyphiles": "NOUN", "eleven": "NUM", "ba.consumers": "NOUN", "subform": "NOUN", "09:01": "NUM", "couples": "NOUN", "canadian": "ADJ", "carlos": "PROPN", "luv": "NOUN", "intervening": "VERB", "farmland": "NOUN", "aft": "ADV", "stately": "ADJ", "karlgren": "PROPN", "oklahoma": "PROPN", "occupations": "NOUN", "peacekeeping": "NOUN", "hypnotized": "VERB", "1939": "NUM", "palm": "NOUN", "quietly": "ADV", "ushering": "VERB", "brokerage": "NOUN", "murderers": "NOUN", "http://www.oneworld.org/index_oc/issue196/byckau.html": "PROPN", "viable": "ADJ", "cuc": "NOUN", "1,095,000": "NUM", "retailers": "NOUN", "tank": "NOUN", "laptops": "NOUN", "overwhelm": "VERB", "1575": "NUM", "hawk": "PROPN", "audacity": "NOUN", "249": "NUM", "liechtenstein": "PROPN", "tip": "NOUN", "auto": "NOUN", "deutsched": "PROPN", "carol.st.clair@enron.com": "PROPN", "tan": "PROPN", "cataloging": "VERB", "http://www.amazon.ca/exec/obidos/asin/0915765381/701-3377456-8181939": "PROPN", "can": "AUX", "restless": "ADJ", "effective": "ADJ", "bathe": "VERB", "soaring": "VERB", "revisited": "VERB", "1892": "NUM", "reborn": "ADJ", "ex-husband": "NOUN", "dogs": "NOUN", "scoop": "NOUN", "sad": "ADJ", "insofar": "SCONJ", "consult": "VERB", "moreover": "ADV", "disgusting": "ADJ", "exacerbated": "VERB", "brink": "NOUN", "-------------------------------------------------------------": "PUNCT", "paragraph": "NOUN", "engendered": "VERB", "evaluated": "VERB", "17547490": "NUM", "piles": "NOUN", "sufaat": "PROPN", "phonne": "NOUN", "portugese": "ADJ", "breeded": "VERB", "leaving": "VERB", "semifreddo": "NOUN", "prescient": "ADJ", "australian": "ADJ", "60,760": "NUM", "sink": "NOUN", "seasonings": "NOUN", "seville": "PROPN", "chartering": "VERB", "soared": "VERB", "training": "NOUN", "punishing": "VERB", "qasim": "PROPN", "comparison": "NOUN", "heated": "VERB", "happiness": "NOUN", "prosperous": "ADJ", "highlights": "NOUN", "tv": "NOUN", "approves": "VERB", "unwanted": "ADJ", "enforcing": "VERB", "spreading": "VERB", "linda": "PROPN", "cautionary": "ADJ", "hobby": "NOUN", "mullahs": "NOUN", "c.": "ADV", "189": "NUM", "a.m.": "NOUN", "unquantified": "ADJ", "slick": "ADJ", "tugged": "VERB", "exceed": "VERB", "tacky": "ADJ", "yo": "PRON", "korean": "ADJ", "10:51": "NUM", "9/11": "NUM", "beachcrofts": "PROPN", "govt": "NOUN", "pan-democrat": "NOUN", "excitement": "NOUN", "denying": "VERB", "closs": "PROPN", "leon": "PROPN", "hm": "INTJ", "regain": "VERB", "astronomer": "NOUN", "tangible": "ADJ", "dynamics": "NOUN", "xvii": "NUM", "pre-organised": "VERB", "satanists": "PROPN", "hardened": "VERB", "no-15": "NUM", "sharq": "PROPN", "decreasing": "VERB", "08:23": "NUM", "al": "PROPN", "symmetry": "NOUN", "07/19/2001": "NUM", "which": "PRON", "columns": "NOUN", "pigs": "NOUN", "undertake": "VERB", "quarrels": "NOUN", "margaret": "PROPN", "missile": "NOUN", "calmly": "ADV", "explosions": "NOUN", "enjoyed": "VERB", "hasidic": "ADJ", "bastien": "PROPN", "havana": "PROPN", "distally": "ADV", "soot": "NOUN", "kos": "PROPN", "laser": "NOUN", "james": "PROPN", "prs": "NOUN", "designation": "NOUN", "dissolving": "VERB", "unformatted": "ADJ", "sheikh": "PROPN", "pile": "NOUN", "slang": "NOUN", "conventional": "ADJ", "unilateral": "ADJ", "calling": "VERB", "reviewed": "VERB", "premiering": "VERB", "http://www.canadavisa.com/canadian-immigration-faq-skilled-workers.html": "PROPN", "anxiously": "ADV", "9800": "NUM", "recommends": "VERB", "size": "NOUN", "perfectly": "ADV", "shaker": "NOUN", "postseason": "NOUN", "difference": "NOUN", "guilt": "NOUN", "breslau": "PROPN", "exterminator": "NOUN", "growers": "NOUN", "sydfynske": "PROPN", "biodefense": "NOUN", "wintertime": "NOUN", "css": "PROPN", "marsden": "PROPN", "hesitation": "NOUN", "labadee": "PROPN", "trauma": "NOUN", "poulenc": "PROPN", "upi": "PROPN", "tasking": "NOUN", "codes": "NOUN", "bump": "NOUN", "7": "NUM", "scraped": "VERB", "pact": "NOUN", "mid-day": "NOUN", "three-day": "ADJ", "zero": "NUM", "erasmus": "PROPN", "1/4": "NUM", "tholt": "PROPN", "streamside": "ADJ", "amazing": "ADJ", "psychotherapist": "NOUN", "funding": "NOUN", "24.7": "NUM", "regular": "ADJ", "sha'lan": "PROPN", "servant": "NOUN", "goldbach": "PROPN", "act": "NOUN", "1380": "NUM", "fo": "ADP", "puff": "VERB", "bought": "VERB", "ebor": "PROPN", "http://www.cruisecompete.com/specials/regions/world/1": "PROPN", "exacting": "ADJ", "petunia": "PROPN", "paje": "PROPN", "treats": "NOUN", "yang": "PROPN", "drawstring": "NOUN", "televised": "VERB", "stamps": "NOUN", "clinical": "ADJ", "worm": "NOUN", "cashion": "PROPN", "comm": "NOUN", "cfls": "NOUN", "clung": "VERB", "la.": "PROPN", "burgers": "NOUN", "bard": "PROPN", "puts": "VERB", "broadcasters": "NOUN", "misc.consumers.frugal-living": "NOUN", "hackles": "NOUN", "confirmation": "NOUN", "ghost": "PROPN", "oregano": "NOUN", "antonioni": "PROPN", "archive": "NOUN", "peking": "PROPN", "hotmail": "PROPN", "tigers": "PROPN", "making": "VERB", "unde$tood": "VERB", "revision": "NOUN", "underlying": "ADJ", "he": "PRON", "cafeteria": "NOUN", "densely": "ADV", "investigation": "NOUN", "proteins": "NOUN", "toby": "PROPN", "1251": "NUM", "wikinews": "PROPN", "twain": "PROPN", "86th": "ADJ", "snowshoe": "NOUN", "tempered": "VERB", "---": "PUNCT", "hire": "VERB", "goddamn": "ADJ", "hedging": "NOUN", "chronicle": "PROPN", "centralized": "ADJ", "sat.": "PROPN", "..": "PUNCT", "rumored": "VERB", "boundary": "NOUN", "weston": "PROPN", "clad": "ADJ", "unique": "ADJ", "tampa": "PROPN", "grappling": "VERB", "saikaku": "PROPN", "1,613": "NUM", "hagiography": "NOUN", "braver": "ADJ", "workmen": "NOUN", "munching": "VERB", "ps3": "NOUN", "sharply": "ADV", "491,667": "NUM", "http://www.squidoo.com/nook-tablet": "PROPN", "blessings": "NOUN", "associations": "NOUN", "1555": "NUM", "generosity": "NOUN", "mutt": "NOUN", "sistani": "PROPN", "coat": "NOUN", "boot": "VERB", "strife": "NOUN", "incandescent": "ADJ", "farmlands": "NOUN", "prescriptive": "ADJ", "interpreting": "NOUN", "danny_jones%enron@eott.com": "PROPN", "lowest": "ADJ", "272,000": "NUM", "venezuela": "PROPN", "adhering": "VERB", "dot": "NOUN", "noting": "VERB", "ould": "AUX", "intensely": "ADV", "discovery": "NOUN", "condemning": "VERB", "closed": "VERB", "busted": "VERB", "rhonda": "PROPN", "polaroid": "PROPN", "psp": "PROPN", "engagement": "NOUN", "re-record": "VERB", "sexy": "ADJ", "child": "NOUN", "interruption": "NOUN", "bascom": "PROPN", "forgiven": "VERB", "spends": "VERB", "depot": "PROPN", "commandment": "NOUN", "globalsecurity.org": "PROPN", "sectarian": "ADJ", "chateaux": "PROPN", "reckoning": "NOUN", "everbody": "PRON", "production": "NOUN", "species": "NOUN", "dilworth": "PROPN", "randy": "PROPN", "arctic": "ADJ", "1500": "NUM", "cantón": "PROPN", "thievery": "NOUN", "austere": "ADJ", "laidlaw": "PROPN", "odense": "PROPN", "wontons": "NOUN", "understan-": "VERB", "stamina": "NOUN", "opinon": "NOUN", "bunker": "VERB", "aboard": "ADV", "lighted": "VERB", "valise": "NOUN", "oberst": "PROPN", "02:17": "NUM", "caused": "VERB", "supplementary": "ADJ", "possibly": "ADV", "107": "NUM", "scenicly": "ADV", "eir": "PROPN", "motivated": "VERB", "dishonors": "VERB", "companions": "NOUN", "collect": "VERB", "dandelions": "NOUN", "lavatories": "NOUN", "shade": "NOUN", "peggy": "PROPN", "philly": "PROPN", "compaq.com": "NOUN", "oja": "PROPN", "scribners": "PROPN", "clumps": "NOUN", "evergreen": "PROPN", "guys": "NOUN", "nye": "PROPN", "condemn": "VERB", "rift": "NOUN", "rallied": "VERB", "serenity": "NOUN", "tradename": "NOUN", "word": "NOUN", "admits": "VERB", "card": "NOUN", "quoted": "VERB", "riverboatmen": "NOUN", "mat": "DET", "instinct": "NOUN", "piteous": "ADJ", "maybe": "ADV", "congratulate": "VERB", "pointed": "VERB", "fayetteville": "PROPN", "nesf": "PROPN", "passenger": "NOUN", "pullback": "NOUN", "77541": "NUM", "bosnia": "PROPN", "commonion": "NOUN", "dominate": "ADJ", "loosely": "ADV", "simulates": "VERB", "trotting": "VERB", "unrestrained": "ADJ", "becuse": "SCONJ", "hide": "VERB", "far": "ADV", "cups": "NOUN", "emulating": "VERB", "multiplier": "NOUN", "badder": "ADJ", "1656": "NUM", "crux": "NOUN", "hauled": "VERB", "phenomena": "NOUN", "contra": "PROPN", "calls": "NOUN", "tiles": "NOUN", "eligible": "ADJ", "+": "SYM", "goblin-driven": "ADJ", "preparation": "NOUN", "snows": "NOUN", "museum": "NOUN", "mistreatment": "NOUN", "channeled": "VERB", "swallowed": "VERB", "fives": "NOUN", "temporal": "ADJ", "nightly": "ADJ", "retirement": "NOUN", "moveable": "ADJ", "submarine": "NOUN", "indigenous": "ADJ", "forehead": "NOUN", "reflecting": "VERB", "naturalisation": "PROPN", "crackling": "NOUN", "mails": "NOUN", "convention": "NOUN", "build-outs": "NOUN", "elsewhere": "ADV", "chestney": "PROPN", "hippies": "NOUN", "backweb": "PROPN", "hau": "PROPN", "misdirection": "NOUN", "offsite": "NOUN", "carton": "NOUN", "re-enlist": "VERB", "hammie": "NOUN", "churches": "NOUN", "guilds": "NOUN", "irregardles": "ADV", "polar": "ADJ", "soya": "ADV", "bolshevik": "ADJ", "rates": "NOUN", "testing": "NOUN", "protestants": "PROPN", "disciples": "NOUN", "lavorato": "PROPN", "solo": "ADJ", "downloaded": "VERB", "likley": "ADV", "francisco": "PROPN", "hellenic": "ADJ", "river": "NOUN", "tube": "NOUN", "newspapers": "NOUN", "gnp": "NOUN", "sicily": "PROPN", "ravine": "NOUN", "biceps": "NOUN", "swirls": "VERB", "ouiji": "PROPN", "doves": "NOUN", "scared": "ADJ", "melting": "NOUN", "cc-by": "PROPN", "kahneman": "PROPN", "sooner": "ADV", "commend": "VERB", "60,000": "NUM", "1600's": "NOUN", "ramzi": "PROPN", "correspondances": "NOUN", "03/08/2000": "NUM", "reviewers": "NOUN", "supporter": "NOUN", "protected": "VERB", "mariner": "PROPN", "weyl": "PROPN", "briskly": "ADV", "pinkish": "ADJ", "map": "NOUN", "exhaustion": "NOUN", "flying": "VERB", "cowpland": "PROPN", "kermie": "PROPN", "npp": "PROPN", "discouraged": "VERB", "jewish": "ADJ", "redefined": "VERB", "viruses": "NOUN", "helmut": "PROPN", "they're": "PRON", "weapon": "NOUN", "calculate": "VERB", "vowed": "VERB", "oppression": "NOUN", "wading": "NOUN", "matthews": "PROPN", "inquisitive": "ADJ", "sugar": "NOUN", "herein": "ADV", "militaries": "NOUN", "transmedia": "NOUN", "whoa": "INTJ", "arrival": "NOUN", "cocktail": "NOUN", "gallup": "PROPN", "interest": "NOUN", "kr": "NOUN", "notice": "VERB", "fulfils": "VERB", "we": "PRON", "09:24": "NUM", "devlin": "PROPN", "positioning": "NOUN", "jewelry": "NOUN", "prisoners": "NOUN", "electronic-warfare": "NOUN", "holt": "PROPN", "radiation": "NOUN", "thin": "ADJ", "centimetre": "NOUN", "haram": "PROPN", "conveys": "VERB", "a&k": "PROPN", "squeaky": "ADJ", "invited": "VERB", "non-locals": "NOUN", "parchment": "NOUN", "lashed": "VERB", "ploys": "NOUN", "planing": "VERB", "09:46": "NUM", "primary": "ADJ", "abdel": "PROPN", "handfuls": "NOUN", "tombed": "ADJ", "elementary": "ADJ", "73": "NUM", "extends": "VERB", "friendships": "NOUN", "keenly": "ADV", "ethink@enron.com": "PROPN", "spheres": "NOUN", "yvan": "PROPN", "domesticated": "VERB", "whereby": "ADV", "administrative": "ADJ", "petsmart": "PROPN", "t.v.": "NOUN", "sight": "NOUN", "reasonable": "ADJ", "prof.": "PROPN", "believe": "VERB", "palces": "NOUN", "co-signing": "VERB", "bin": "PROPN", "barn": "NOUN", "temptations": "NOUN", "deposed": "VERB", "1574": "NUM", "vaguely": "ADV", "comic": "PROPN", "warranties": "NOUN", "fabio": "PROPN", "tease": "VERB", "eck": "INTJ", "conflating": "VERB", "katy": "PROPN", "downton": "PROPN", "brick-dust": "NOUN", "crepey": "ADJ", "tsetse": "NOUN", "http://www.nea.fr/html/rp/chernobyl/c05.html": "PROPN", "outcomes": "NOUN", "schedule": "NOUN", "fritters": "NOUN", "secretions": "NOUN", "relishes": "NOUN", "epc": "NOUN", "aw": "INTJ", "frost": "NOUN", "annoying": "ADJ", "goalkeeper": "NOUN", "prevenient": "ADJ", "gras": "NOUN", "01": "NUM", "grifter": "NOUN", "staffed": "VERB", "minimal": "ADJ", "ways": "NOUN", "extract": "NOUN", "____________________________________________________________": "SYM", "megumi": "PROPN", "urgent": "ADJ", "galloped": "VERB", "generated": "VERB", "shindand": "PROPN", "dolls": "NOUN", "pyrenees": "PROPN", "dick": "PROPN", "dim": "ADJ", "paternal": "ADJ", "nation": "NOUN", "clinched": "VERB", "1960s": "NOUN", "eis": "PROPN", "relinquish": "VERB", "forgive": "VERB", "incite": "VERB", "gases": "NOUN", "filigree": "NOUN", "bang": "NOUN", "portion": "NOUN", "tourist": "NOUN", "tryst": "NOUN", "polluters": "NOUN", "denis": "PROPN", "holley": "PROPN", "solid": "ADJ", "mussolini-jaw": "NOUN", "throw": "VERB", "patel": "PROPN", "agonizing": "ADJ", "squirrels": "PROPN", "permeated": "VERB", "afraid": "ADJ", "apprehensive": "ADJ", "yacht": "NOUN", "bangladeshis": "PROPN", "namath": "PROPN", "cram": "VERB", "neatly": "ADV", "varied": "ADJ", "balard": "PROPN", "672,000": "NUM", "vba": "PROPN", "diurnal": "ADJ", "chiara": "PROPN", "redesign": "VERB", "maximilien": "PROPN", "rule": "NOUN", "rascally": "ADJ", "tabletop": "NOUN", "6871082#": "NUM", "breached": "VERB", "sunshine": "NOUN", "orthodontist": "NOUN", "barrett": "PROPN", "drums": "NOUN", "regularity": "NOUN", "stacked": "VERB", "gwb": "PROPN", "leprechauns": "NOUN", "skittles": "PROPN", "tw": "PROPN", "sunrise": "NOUN", "miserably": "ADV", "acknowledged": "VERB", "1717": "NUM", "shelters": "NOUN", "posting": "NOUN", "1754": "NUM", "retrieval": "NOUN", "jr": "PROPN", "served": "VERB", "puttino": "PROPN", "fluttering": "VERB", "unfold": "VERB", "rewrote": "VERB", "treatise": "NOUN", "kristin": "PROPN", "unsweetened": "ADJ", "camel": "NOUN", "credible": "ADJ", "jintao": "PROPN", "sikong": "PROPN", "similarly": "ADV", "mvp": "NOUN", "firmly": "ADV", "superbly": "ADV", "mummified": "ADJ", "obsessed": "ADJ", "woman": "NOUN", "debating": "VERB", "loss": "NOUN", "gilmore": "PROPN", "-_-": "SYM", "shard": "NOUN", "manor": "NOUN", "alternatives": "NOUN", "ak47s": "NOUN", "uses": "VERB", "buyer": "NOUN", "cho": "PROPN", "prosecute": "VERB", "janell": "PROPN", "kettner": "PROPN", "prevent": "VERB", "household": "NOUN", "hacking": "VERB", "introductory": "ADJ", "approx": "ADV", "jail": "NOUN", "lids": "NOUN", "treaties": "NOUN", "racing": "NOUN", "wandering": "VERB", "fungus": "NOUN", "tindi": "PROPN", "mexicana": "PROPN", "indulged": "VERB", "leakage": "NOUN", "signing": "VERB", "removing": "VERB", "dubia": "PROPN", "pilates": "NOUN", "walnut": "NOUN", "publication": "NOUN", "daniel": "PROPN", "rested": "VERB", "augustin": "PROPN", "richard": "PROPN", "erosion": "NOUN", "schoolchildren": "NOUN", "tim": "PROPN", "employee": "NOUN", "construction": "NOUN", "dissemination": "NOUN", "shaded": "ADJ", "partridge": "NOUN", "uncertain": "ADJ", "blue": "ADJ", "novotel": "PROPN", "ends": "NOUN", "fleshed": "VERB", "wildflowers": "NOUN", "colonists": "NOUN", "alleyway": "NOUN", "gemini": "PROPN", "toys": "NOUN", "orthographic": "ADJ", "boiler": "NOUN", "live": "VERB", "promotion": "NOUN", "sports": "NOUN", "bank": "NOUN", "hilarious": "ADJ", "warhol": "PROPN", "stewardess": "NOUN", "kristen": "PROPN", "bonafide": "PROPN", "energy-intensive": "ADJ", "milks": "NOUN", "gorse": "NOUN", "murmured": "VERB", "characterized": "VERB", "twiddled": "VERB", "costly": "ADJ", "mongrel": "NOUN", "restricting": "VERB", "law": "NOUN", "hatch": "VERB", "grammars": "NOUN", "crafts": "NOUN", "nightwing": "PROPN", "elapsed": "VERB", "utilitarianism": "NOUN", "7.2": "NUM", "extending": "VERB", "insulation": "NOUN", "tablet": "PROPN", "slowing": "NOUN", "1983": "NUM", "ethical": "ADJ", "radiative": "ADJ", "713-853-1696": "NUM", "mates": "NOUN", "transatlantic": "ADJ", "waving": "VERB", "veggies": "NOUN", "ict": "PROPN", "metropolis": "NOUN", "bas": "PROPN", "sunjay": "PROPN", "commodity": "NOUN", "p-": "INTJ", "expand": "VERB", "lipa": "NOUN", "advancement": "NOUN", "organizational": "ADJ", "smyth": "PROPN", "tripartite": "ADJ", "objective": "ADJ", "injustice": "NOUN", "diverted": "VERB", "unleavened": "ADJ", "memo": "NOUN", "indonesians": "PROPN", "moscoso": "PROPN", "202.456.1414": "NUM", "beth": "PROPN", "twelfth": "ADJ", "habits": "NOUN", "egalitarian": "ADJ", "formless": "ADJ", "bundling": "VERB", "iván": "PROPN", "brave": "ADJ", "crunch": "NOUN", "afterlife": "NOUN", "antiquity": "NOUN", "nest": "NOUN", "gunfire": "NOUN", "sewage": "NOUN", "circuit": "PROPN", "starr": "PROPN", "alan": "PROPN", "dependable": "ADJ", "adage": "NOUN", "sprawled": "VERB", "forty-one": "NUM", "oldest": "ADJ", "rivertrail": "PROPN", "lagesse": "PROPN", "unweaponized": "ADJ", "4g": "PROPN", "governance": "NOUN", "shaped": "VERB", "viewers": "NOUN", "represent": "VERB", "galleon": "NOUN", "japan": "PROPN", "thoughts": "NOUN", "yoshiwara": "PROPN", "reporting": "VERB", "thermometer": "NOUN", "toga": "NOUN", "postcard": "NOUN", "homer": "NOUN", "60th": "ADJ", "hurtle": "VERB", "40": "NUM", "educate": "VERB", "nationals": "NOUN", "reali-": "VERB", "ascetic": "ADJ", "corner": "NOUN", "tam": "PROPN", "th-": "INTJ", "yielded": "VERB", "coal-hole": "NOUN", "wierd": "ADJ", "evil-looking": "ADJ", "mounted": "VERB", "birth": "NOUN", "greenish": "ADJ", "structuring": "NOUN", "internship": "NOUN", "garment": "NOUN", "glowed": "VERB", "second": "ADJ", "chess": "NOUN", "encounter": "NOUN", "reactionaries": "NOUN", "occasions": "NOUN", "favoured": "VERB", "nathan": "PROPN", "silky": "ADJ", "tropez": "PROPN", "theology": "NOUN", "wiltshire": "PROPN", "nakarai": "PROPN", "harm": "NOUN", "uniform": "ADJ", "murphy": "PROPN", "pompously": "ADV", "04:11": "NUM", "stability": "NOUN", "senators": "PROPN", "soper": "PROPN", "micro-fiber": "ADJ", "04/04/2001": "NUM", "copenhagen": "PROPN", "thought-nourishing": "VERB", "1964": "NUM", "scheduling": "NOUN", "483.00": "NUM", "islamiya": "PROPN", "thouhgt": "VERB", "aries": "PROPN", "wile": "NOUN", "self-will": "NOUN", "06": "NUM", "uncivil": "ADJ", "article": "NOUN", "topical": "ADJ", "105": "NUM", "cate": "PROPN", "fusionretail": "PROPN", "grills": "VERB", "admire": "VERB", "apollinaris": "PROPN", "nadler": "PROPN", "invoicing": "VERB", "priority": "NOUN", "wendy": "PROPN", "assh@%$e": "NOUN", "bronze": "NOUN", "execution": "NOUN", "misery": "NOUN", "comparisons": "NOUN", "scrubbed": "ADJ", "weirdness": "NOUN", "buzzing": "NOUN", "appendices": "NOUN", "rapacity": "NOUN", "secrets": "NOUN", "mustansiriyah": "PROPN", "preconditions": "NOUN", "participants": "NOUN", "waht": "PRON", "port": "NOUN", "faaborg": "PROPN", "burn": "VERB", "earmuffs": "NOUN", "nostromo": "PROPN", "i/s": "NOUN", "persistence": "NOUN", "madagascar": "PROPN", "appreciate": "VERB", "hid": "VERB", "commenced": "VERB", "pinky": "NOUN", "flung": "VERB", "1830": "NUM", "bpd": "NOUN", "essential": "ADJ", "geologically": "ADV", "lights": "NOUN", "the": "DET", "additionally": "ADV", "airlift": "NOUN", "panamanian": "ADJ", "rendering": "NOUN", "church": "PROPN", "legalised": "VERB", "introducing": "VERB", "ostrich": "NOUN", "mothers": "NOUN", "1.877.999.3223": "NUM", "brutalizing": "VERB", "light-inflected": "ADJ", "breakfasts": "NOUN", "3.29": "NUM", "usenet": "PROPN", "crease": "NOUN", "pelham": "NOUN", "whilst": "SCONJ", "kaho": "PROPN", "manifested": "VERB", "prized": "VERB", "mattered": "VERB", "kurtz": "PROPN", "inviting": "VERB", "heyday": "NOUN", "undertakings": "NOUN", "sonya": "PROPN", "delis": "NOUN", "downgrading": "VERB", "against": "ADP", "wight": "NOUN", "tendrils": "NOUN", "unsurprising": "ADJ", "physiology": "NOUN", "panels": "NOUN", "ucan": "PROPN", "trademark": "NOUN", "carrol": "PROPN", "nancy": "PROPN", "settler": "NOUN", "peace": "NOUN", "iron": "NOUN", "josalyn": "PROPN", "unanimously": "ADV", "optional": "ADJ", "rattling": "VERB", "replaced": "VERB", "introduced": "VERB", "repoire": "NOUN", "strainer": "NOUN", "responses": "NOUN", "saithe": "NOUN", "overwhelmed": "VERB", "accepting": "VERB", "interferometers": "NOUN", "cob": "NOUN", "stock-still": "ADV", "reaction": "NOUN", "reality": "NOUN", "antigone": "PROPN", "discounts": "NOUN", "tribe": "NOUN", "preferring": "VERB", "tumbledown": "ADJ", "wagging": "VERB", "correlates": "NOUN", "refunds": "NOUN", "lapses": "NOUN", "liquefied": "VERB", "murph": "PROPN", "responds": "VERB", "jingū": "PROPN", "functionaries": "NOUN", "haven": "NOUN", "shanties": "NOUN", "sugarcane": "NOUN", "sehar": "PROPN", "jordanians": "NOUN", "group": "NOUN", "rickenbacker": "PROPN", "residences": "NOUN", "ranked": "VERB", "548": "NUM", "devils": "NOUN", "springfield": "PROPN", "seattle": "PROPN", "mouthed": "ADJ", "02/27/2001": "NUM", "lattice": "PROPN", "delhi": "PROPN", "englewood": "PROPN", "streamed": "VERB", "scrutiny": "NOUN", "physicist": "NOUN", "cresson": "PROPN", "landings": "NOUN", "badges": "NOUN", "overrun": "VERB", "50,818": "NUM", "vacated": "VERB", "gov.": "PROPN", "aerospace": "NOUN", "hooks": "NOUN", "kopinga": "PROPN", "flag-stones": "NOUN", "stacks": "NOUN", "cev": "PROPN", "sonnets": "NOUN", "compassionate": "ADJ", "cigars": "NOUN", "verticalization": "NOUN", "jostling": "VERB", "irc": "PROPN", "moisturizing": "ADJ", "confirmit": "PROPN", "willingly": "ADV", "sauce": "NOUN", "assortment": "NOUN", "midlife": "NOUN", "pyrimidal": "ADJ", "overloaded": "VERB", "trotters": "NOUN", "questionnaire": "NOUN", "swelling": "VERB", "wholeheartedly": "ADV", "chester": "PROPN", "creditors": "NOUN", "imprisoned": "VERB", "1,537,058": "NUM", "14721": "NUM", "0448": "NUM", "marie": "PROPN", "phonies": "NOUN", "newcomer": "PROPN", "400": "NUM", "monks": "NOUN", "chirping": "NOUN", "ipad": "PROPN", "comedy": "NOUN", "healthy": "ADJ", "verbally": "ADV", "nashua": "PROPN", "06:28": "NUM", "stopped": "VERB", "215": "NUM", "insidious": "ADJ", "reestablished": "VERB", "sealed": "VERB", "elf": "NOUN", "frame": "NOUN", "vice-president": "NOUN", "ventured": "VERB", "reward": "NOUN", "reappropriation": "NOUN", "2/3": "NUM", "uva": "NOUN", "water-coloured": "ADJ", "spouses": "NOUN", "manufactured": "VERB", "fixation": "NOUN", "542": "NUM", "2021": "NUM", "120": "NUM", "disgrace": "NOUN", "belize": "PROPN", "beats": "VERB", "w/out": "SCONJ", "plateau": "NOUN", "3750": "NUM", "centrally": "ADV", "extradite": "VERB", "http://www.ibrae.ac.ru/ibrae/eng/chernobyl/nat_rep/nat_repe.htm#24": "PROPN", "salazar": "PROPN", "tau": "NOUN", "subsides": "VERB", "wpo": "PROPN", "drunk": "ADJ", "pred": "PROPN", "wikihow": "PROPN", "lips": "NOUN", "08:15": "NUM", "usually": "ADV", "arc": "NOUN", "cichlid": "NOUN", "america": "PROPN", "experiment": "NOUN", "detonated": "VERB", "bien": "PROPN", "winery": "NOUN", "leisurely": "ADJ", "analyze": "VERB", "mistruth": "NOUN", "omar": "PROPN", "blooded": "VERB", "darkened": "VERB", "kermit": "PROPN", "submit": "VERB", "penalties": "NOUN", "devil": "PROPN", "bait": "NOUN", "servants": "NOUN", "bodytalk": "NOUN", "memory": "NOUN", "predicted": "VERB", "cawing": "VERB", "distrusted": "VERB", "postcards": "NOUN", "pedantry": "NOUN", "irons": "NOUN", "260,000": "NUM", "mid-january": "PROPN", "constitutions": "NOUN", "diablo": "PROPN", "clog": "NOUN", "seinfeld": "PROPN", "travelguides": "NOUN", "postures": "NOUN", "flavour": "NOUN", "apprehension": "NOUN", "mayonnaise": "NOUN", "ærø": "PROPN", "referenced": "VERB", "prom": "PROPN", "nida": "PROPN", "before": "SCONJ", "catarina": "PROPN", "nepal": "PROPN", "centennial": "PROPN", "lineatus": "NOUN", "plans": "NOUN", "stupidly": "ADV", "jews": "NOUN", "monday's": "PROPN", "respectful": "ADJ", "subcommission": "NOUN", "145th": "PROPN", "vegetables": "NOUN", "balanced": "VERB", "}": "PUNCT", "clutches": "NOUN", "gagged": "VERB", "recommending": "VERB", "1679": "NUM", "inferior": "ADJ", "longs": "VERB", "triplets": "NOUN", "floods": "NOUN", "gérard": "PROPN", "read": "VERB", "muqrin": "PROPN", "zubayda": "PROPN", "capture": "VERB", "http://www.loveallpeople.org/theonereasonwhy.txt": "PROPN", "theo": "PROPN", "noon": "NOUN", "saltiness": "NOUN", "auster": "PROPN", "interviewed": "VERB", "ironies": "NOUN", "proof": "NOUN", "catastrophic": "ADJ", "jan.": "PROPN", "contents": "NOUN", "submission": "NOUN", "fluid": "NOUN", "englishwoman": "NOUN", "grassy": "ADJ", "paralympics": "PROPN", "thierry.poibeau@ens.fr": "PROPN", "burst": "VERB", "norwegian": "ADJ", "directions": "NOUN", "archival": "ADJ", "dipped": "VERB", "heights": "NOUN", "it": "PRON", "feeble": "ADJ", "expedited": "VERB", "bobber": "NOUN", "consideration": "NOUN", "ideology": "NOUN", "religions": "NOUN", "yielding": "VERB", "eddie": "PROPN", "unfortunate": "ADJ", "shu": "NOUN", "kuykendall": "PROPN", "divided": "VERB", "restrained": "VERB", "impressions": "NOUN", "unambiguously": "ADV", "orange": "ADJ", "rigorous": "ADJ", "glowsticks": "NOUN", "06:15": "NUM", "ruth": "PROPN", "jacobs": "PROPN", "quartet": "NOUN", "abroad": "ADV", "conced-": "NOUN", "director": "NOUN", "breonna": "PROPN", "mohib": "PROPN", "required": "VERB", "elephant": "NOUN", "entry": "NOUN", "martial": "ADJ", "blink": "VERB", "strategically": "ADV", "finesse": "VERB", "tabs": "NOUN", "optimistic": "ADJ", "journals": "NOUN", "anyting": "NOUN", "62,500": "NUM", "italiano": "PROPN", "crum": "INTJ", "tiling": "NOUN", "scientists": "NOUN", "campaigner": "NOUN", "1947": "NUM", "finalize": "VERB", "sympathizers": "NOUN", "reschedule": "VERB", "plowed": "VERB", "compose": "VERB", "abt": "ADP", "mauled": "VERB", "angered": "VERB", "adoptive": "ADJ", "!!!!!": "PUNCT", "armed": "ADJ", "coloured": "ADJ", "parody": "NOUN", "untouched": "ADJ", "unhunh": "INTJ", "ammonia": "NOUN", "youngster": "NOUN", "mmpi": "PROPN", "kenyans": "PROPN", "interrogated": "VERB", "shorten": "VERB", "pressed-down": "ADJ", "extant": "ADJ", "fours": "NOUN", "basso": "NOUN", "bishop": "PROPN", "council": "PROPN", "rejuvenate": "VERB", "wd": "PROPN", "refining": "VERB", "door": "NOUN", "bravest": "ADJ", "11.25": "NUM", "invalides": "PROPN", "broader": "ADJ", "sarhid": "PROPN", "pre-killed": "ADJ", "yahoo!": "PROPN", "asserting": "VERB", "dizzy": "ADJ", "forbes": "PROPN", "shortened": "VERB", "update": "NOUN", "grown": "VERB", "intersections": "NOUN", "trumpet": "NOUN", "hairnets": "NOUN", "validity": "NOUN", "tupperwear": "NOUN", "buffs": "NOUN", "expires": "VERB", "liner": "NOUN", "btwn": "ADP", "offense": "NOUN", "avant": "NOUN", "fhs": "PROPN", "outward": "ADJ", "28": "NUM", "allegations": "NOUN", "everywhere": "ADV", "neologism": "NOUN", "whisper": "VERB", "space": "NOUN", "saboteurs": "NOUN", "plate": "NOUN", "creep": "NOUN", "statutes": "NOUN", "bubble": "NOUN", "citing": "VERB", "320": "NUM", "labrador": "NOUN", "sealing-wax": "NOUN", "demonstrate": "VERB", "deviation": "NOUN", "sniffling": "VERB", "practised": "VERB", "non-proliferation": "NOUN", "maker": "NOUN", "accumulated": "VERB", "grained": "ADJ", "1483": "NUM", "vendors": "NOUN", "columnist": "NOUN", "drag": "VERB", "testifying": "VERB", "rules": "NOUN", "locally": "ADV", "pma": "PROPN", "velvet-draped": "ADJ", "grumble": "VERB", "l'espalier": "PROPN", "pre-fabricated": "ADJ", "shoe": "NOUN", "trouble": "NOUN", "antennæ": "NOUN", "conquered": "VERB", "woodsmoke": "NOUN", "honduras": "PROPN", "radison": "PROPN", "speakers": "NOUN", "dilemma": "NOUN", "resentment": "NOUN", "clare": "PROPN", "condescending": "ADJ", "mob": "NOUN", "cosplayer": "NOUN", "stifle": "NOUN", "tiptoe": "NOUN", "floral": "ADJ", "preseason": "NOUN", "desks": "NOUN", "carbon": "NOUN", "chapman": "PROPN", "monuments": "NOUN", "1952": "NUM", "rehab": "NOUN", "pressures": "NOUN", "trusty": "ADJ", "flavor(s)": "NOUN", "ex-pat": "NOUN", "cornerstones": "NOUN", "gasping": "VERB", "23,000": "NUM", "gone": "VERB", "czar": "NOUN", "laity": "PROPN", "180": "NUM", "defeats": "VERB", "overproduction": "NOUN", "cussing": "NOUN", "stranglehold": "NOUN", "universally": "ADV", "pdt": "NOUN", "voluntary": "ADJ", "hino": "PROPN", "amants": "PROPN", "vindebyørevej": "PROPN", "calcium": "NOUN", "intelligence": "NOUN", "feather": "NOUN", "aafia": "PROPN", "reputations": "NOUN", "soviet": "PROPN", "headset": "NOUN", "rented": "VERB", "lotfollah": "PROPN", "positive": "ADJ", "grams": "NOUN", "needless": "ADJ", "carried": "VERB", "tina": "PROPN", "attract": "VERB", "hypnotised": "VERB", "affordable": "ADJ", "deixis": "PROPN", "deployment": "NOUN", "uppercasing": "NOUN", "synodis": "PROPN", "comfyy": "ADJ", "sad-feeling": "ADJ", "yeaa": "INTJ", "unlisted": "ADJ", "theta": "NOUN", "packing": "VERB", "internal": "ADJ", "70s": "NOUN", "altered": "VERB", "undertook": "VERB", "mouths": "NOUN", "frontiers": "PROPN", "shed": "NOUN", "remarked": "VERB", "greyness": "NOUN", "conform": "VERB", "indolence": "NOUN", "kyle": "PROPN", "presents": "NOUN", "shape": "NOUN", "endanger": "VERB", "461-1776": "NUM", "dusters": "NOUN", "generation": "NOUN", "seating": "NOUN", "interplay": "NOUN", "morphological": "ADJ", "319": "NUM", "2543": "NUM", "water": "NOUN", "invest": "VERB", "mausoleum": "NOUN", "202.456.2461": "NUM", "uncannily": "ADV", "elisha": "PROPN", "jobs": "NOUN", "luna's": "NOUN", "nationwide": "ADJ", "partly": "ADV", "yelling": "VERB", "mango": "NOUN", "ditch": "VERB", "regrets": "NOUN", "glase": "PROPN", "nixon": "PROPN", "25th": "ADJ", "plotting": "VERB", "916": "NUM", "deter": "VERB", "lamps": "NOUN", "overdose": "NOUN", "shining": "VERB", "incredulity": "NOUN", "irving": "PROPN", "accurately": "ADV", "@hatmanone": "PROPN", "165.9": "NUM", "lt.": "PROPN", "beaten-up": "ADJ", "bilateral": "ADJ", "harms": "VERB", "teng": "PROPN", "pantomine": "NOUN", "opportunity": "NOUN", "baldish": "ADJ", "pony's": "NOUN", "politicians": "NOUN", "indians": "PROPN", "floated": "VERB", "post-accident": "ADJ", "bipartisan": "ADJ", "79": "NUM", "streett": "PROPN", "ash": "PROPN", "globe": "NOUN", "apology": "NOUN", "divergent": "ADJ", "prevailed": "VERB", "hammered": "VERB", "wolak": "PROPN", "drifting": "VERB", "ras": "PROPN", "orphans": "NOUN", "caked": "VERB", "alley": "PROPN", "confused": "ADJ", "simulated": "VERB", "potidea": "PROPN", "remodeling": "NOUN", "http://www.solutions.com/jump.jsp?itemid=1361&itemtype=product&path=1%2c3%2c477&iproductid=1361": "PROPN", "compact": "ADJ", "integration": "NOUN", "duties": "NOUN", "simulate": "VERB", "acquired": "VERB", "60s": "NOUN", "winters": "NOUN", "sleepers": "NOUN", "suggesting": "VERB", "thirties": "NOUN", "smacked": "VERB", "nov": "PROPN", "birdie": "NOUN", "01810": "NUM", "bertrand": "PROPN", "snaffle": "NOUN", "canada": "PROPN", "bhutan": "PROPN", "3s": "NOUN", "enters": "VERB", "guy": "NOUN", "signal": "NOUN", "intersects": "NOUN", "sided": "ADJ", "!!!!!!!!!!!!!": "PUNCT", "splitting": "VERB", "judges": "NOUN", "08:50:01": "NUM", "exceedingly": "ADV", "uploads": "VERB", "chiang": "PROPN", "11:48": "NUM", "wiki": "NOUN", "furthermore": "ADV", "regulatory": "ADJ", "cars": "NOUN", "lancashire": "PROPN", "ombre": "PROPN", "36,000,000,000": "NUM", "fumes": "NOUN", "sunken": "VERB", "busier": "ADJ", "re-type": "VERB", "restrictive": "ADJ", "desires": "VERB", "510-642-3689": "NUM", "three–day": "ADJ", "approvals": "NOUN", "eternal": "ADJ", "graduating": "VERB", "excellent": "ADJ", "paved": "ADJ", "barrister": "NOUN", "collected": "VERB", "aud": "NOUN", "circulate": "VERB", "acquaintances": "NOUN", "sovereign": "ADJ", "remained": "VERB", "versus": "ADP", "chicks": "NOUN", "yor-vik": "PROPN", "underscore": "VERB", "carol": "PROPN", "?!": "PUNCT", "spans": "VERB", "oaks": "NOUN", "exile": "PROPN", "tightly": "ADV", "consisted": "VERB", "sponsoring": "VERB", "lightning-shaped": "ADJ", "prestige": "NOUN", "sql": "PROPN", "177": "NUM", "vermeer": "PROPN", "dose": "PROPN", "hut": "NOUN", "stepped": "VERB", "beat": "VERB", "moored": "VERB", "clicking": "VERB", "glimpsed": "VERB", "recognise": "VERB", "suddenly": "ADV", "displeases": "VERB", "seoul": "PROPN", "stealthy": "ADJ", "strike": "NOUN", "virginia": "PROPN", "winchester": "PROPN", "exploit": "VERB", "theseus": "PROPN", "chechnya": "PROPN", "metallic": "ADJ", "larson": "PROPN", "distorted": "VERB", "bulrush": "NOUN", "1960's": "NOUN", "batman": "PROPN", "cylinders": "NOUN", "repair": "NOUN", "upends": "VERB", "eg": "ADV", "a/73/pv.6": "PROPN", "worrying": "VERB", "peanuts": "NOUN", "enviably": "ADV", "eternally": "ADV", "dominoes": "NOUN", "xander": "PROPN", "optinal": "ADJ", "htc": "PROPN", "observation": "NOUN", "tanks": "NOUN", "smokers": "NOUN", "chatgpt": "PROPN", "giorgio": "PROPN", "thurs.": "PROPN", "faith": "NOUN", "subreports": "NOUN", "chap": "NOUN", "hindi": "PROPN", "fusion": "NOUN", "driven": "VERB", "rally": "NOUN", "loaded": "VERB", "baron": "PROPN", "imparting": "VERB", "plaque": "NOUN", "channel": "NOUN", "harsher": "ADJ", "rarely": "ADV", "grabbed": "VERB", "cemented": "VERB", "numbness": "NOUN", "chiros": "NOUN", "alarmed": "ADJ", "philosophy": "NOUN", "louisiana": "PROPN", "joys": "PROPN", "evidence": "NOUN", "amendments": "NOUN", "devolution": "NOUN", "electricity": "NOUN", "career-wise": "ADV", "starzz": "PROPN", "rescuers": "NOUN", "approximate": "ADJ", "5c": "PROPN", "improves": "VERB", "painful": "ADJ", "kadhim": "PROPN", "prime": "ADJ", "veteran": "ADJ", "maintaining": "VERB", "requirement": "NOUN", "kirriemuir": "PROPN", "recalculation": "NOUN", "immensity": "NOUN", "begins": "VERB", "depraved": "ADJ", "phoned": "VERB", "shares": "NOUN", "interventions": "NOUN", "beautiful": "ADJ", "bares": "VERB", "banners": "NOUN", "must": "AUX", "sally": "PROPN", "sculpted": "VERB", "temp": "NOUN", "period": "NOUN", "6,000": "NUM", "final": "ADJ", "1970": "NUM", "observatories": "NOUN", "motor": "NOUN", "monarchy": "NOUN", "tern": "PROPN", "downright": "ADV", "policing": "PROPN", "flew": "VERB", "workload": "NOUN", "beall": "PROPN", "coroner": "NOUN", "nachos": "NOUN", "queries-views": "NOUN", "glasgow": "PROPN", "various": "ADJ", "alt.animals.felines.diseases": "NOUN", "planets": "NOUN", "fail": "VERB", "tropic": "PROPN", "weakness": "NOUN", "lid": "NOUN", "smartwolf": "PROPN", "enacted": "VERB", "barking": "NOUN", "outlines": "NOUN", "naturalist": "NOUN", "cry": "VERB", "syntax": "NOUN", "counseling": "NOUN", "taco": "PROPN", "shane": "PROPN", "template": "NOUN", "monet": "PROPN", "kiss": "VERB", "traumas": "NOUN", "durations": "NOUN", "sketchy": "ADJ", "fagan": "PROPN", "natural": "ADJ", "mermaid": "NOUN", "balloon": "NOUN", "smoother": "ADJ", "applicant": "NOUN", "undernourishment": "NOUN", "turbines": "NOUN", "vineyards": "NOUN", "ministered": "VERB", "greedy": "ADJ", "fleece": "NOUN", "fifa": "PROPN", "freshness": "NOUN", "contributions": "NOUN", "love": "VERB", "granddaughter": "NOUN", "unthinking": "ADJ", "coach": "NOUN", "wives": "NOUN", "romans": "NOUN", "lil": "ADJ", "oddly": "ADV", "representations": "NOUN", "miraculous": "ADJ", "draco": "PROPN", "commonsense": "ADJ", "uphi-": "ADJ", "sure": "ADJ", "scientology": "PROPN", "529,000": "NUM", "deducted": "VERB", "cheng": "PROPN", "asceticism": "NOUN", "3,200": "NUM", "ranchers": "NOUN", "watches": "NOUN", "stood": "VERB", "rendy": "PROPN", "broadband": "NOUN", "biologists": "NOUN", "sweater": "NOUN", "inquiringly": "ADV", "terrors": "NOUN", "175": "NUM", "booker": "PROPN", "seething": "VERB", "tense": "ADJ", "warsaw": "PROPN", "drawers": "NOUN", "lynne": "PROPN", "sipping": "VERB", "brigades": "NOUN", "survive": "VERB", "ansel": "PROPN", "southern": "ADJ", "weak": "ADJ", "consistently": "ADV", "plenipotentiary": "NOUN", "intruders": "NOUN", "brushing": "VERB", "cap": "NOUN", "goodbye": "NOUN", "devotion": "NOUN", "nw": "PROPN", "03/15/2001": "NUM", "yadavaran": "PROPN", "integral": "ADJ", "hilgert": "PROPN", "chance": "NOUN", "deployed": "VERB", "laos": "PROPN", "inserted": "VERB", "fetishism": "NOUN", "adequately": "ADV", "lunatics": "NOUN", "plover": "NOUN", "preacher": "NOUN", "fruitcake": "NOUN", "thermal": "ADJ", "mets": "PROPN", "divorce": "NOUN", "highly": "ADV", "connecticut": "PROPN", "decisively": "ADV", "fran": "PROPN", "leithead": "PROPN", "certificate": "NOUN", "locals": "NOUN", "killing": "VERB", "star": "NOUN", "instance": "NOUN", "errol": "PROPN", "summaries": "NOUN", "colleges": "NOUN", "zagros": "PROPN", "cheveux": "PROPN", "hopelessly": "ADV", "46": "NUM", "galvin": "PROPN", "reached": "VERB", "sag": "NOUN", "raised": "VERB", "magnetic": "ADJ", "hohokam": "PROPN", "s.d.": "PROPN", "mathias": "PROPN", "solstices": "NOUN", "comb": "NOUN", "warmonger": "NOUN", "shot": "NOUN", "counterintelligence": "NOUN", "ashcroft": "PROPN", "dc": "PROPN", "forks": "NOUN", "cajunish": "ADJ", "animal": "NOUN", "alhaznawi": "PROPN", "paulo": "PROPN", "approval": "NOUN", "standardized": "VERB", "terrain": "NOUN", "probabilities": "NOUN", "meter": "NOUN", "kc": "PROPN", "concerto": "NOUN", "coverage": "NOUN", "collapse": "NOUN", "halliburton": "PROPN", "encouraged": "VERB", "preconception": "NOUN", "reintroduction": "NOUN", "galois": "PROPN", "shawnta": "PROPN", "crumbling": "ADJ", "mommism": "NOUN", "grandson": "NOUN", "bereaved": "ADJ", "buenos": "PROPN", "http://en.wikipedia.org/wiki/degenerate_art": "PROPN", "fiercely": "ADV", "symphonies": "NOUN", "ruthless": "ADJ", "disproportionate": "ADJ", "exchange": "NOUN", "senses": "NOUN", "paths": "NOUN", "attracts": "VERB", "jacobsen": "PROPN", "folded": "VERB", "why": "ADV", "crunching": "ADJ", "dh": "NOUN", "lithograph": "NOUN", "algerians": "PROPN", "personally": "ADV", "buckeye": "PROPN", "umbrella": "NOUN", "a59": "PROPN", "licked": "VERB", "ukrops": "PROPN", "leaky": "ADJ", "281-443-3744": "NUM", "stream": "NOUN", "nacer": "PROPN", "founded": "VERB", "aspect": "NOUN", "shocks": "NOUN", "critical": "ADJ", "zion": "PROPN", "packaged": "VERB", "madam": "NOUN", "sill": "NOUN", "penned": "VERB", "1986": "NUM", "listen": "VERB", "craves": "VERB", "understand": "VERB", "prehistoric": "ADJ", "anti-shipping": "ADJ", "dudley": "PROPN", "discovered": "VERB", "stabros": "NOUN", "steel": "NOUN", "fend": "VERB", "thors": "PROPN", "parenteau": "PROPN", "knights-errant": "NOUN", "symptom": "NOUN", "chock": "ADV", "implicate": "VERB", "indiscriminately": "ADV", "speeding": "VERB", "airbnb": "PROPN", "mrs.": "PROPN", "devraj": "PROPN", "newfound": "ADJ", "archosaur": "NOUN", "petunias": "PROPN", "nick": "PROPN", "e@tg": "PROPN", "squadrons": "NOUN", "recurrent": "ADJ", "peach": "NOUN", "knowingly": "ADV", "shrug": "NOUN", "captained": "VERB", "brightly": "ADV", "fix": "VERB", "airlifted": "VERB", "unaware": "ADJ", "61,000,000,000": "NUM", "hypothesized": "VERB", "hussein": "PROPN", "horizons": "NOUN", "recruit": "VERB", "sussexs": "NOUN", "reconvened": "VERB", "katrina": "PROPN", "’’": "PUNCT", "bunch": "NOUN", "detach": "VERB", "argumentative": "ADJ", "loop": "NOUN", "solicitor": "PROPN", "meraux": "PROPN", "ground": "NOUN", "frozen": "VERB", "caffasso": "PROPN", "clinking": "VERB", "inertia": "NOUN", "hopefully": "ADV", "gene": "NOUN", "athens": "PROPN", "selected": "VERB", "vertical": "ADJ", "lasciviousness": "NOUN", "unpriced": "ADJ", "darkest": "ADJ", "barb": "PROPN", "wisdom": "NOUN", "democracy": "NOUN", "dischord": "NOUN", "substituted": "VERB", "dismantled": "ADJ", "baghdadis": "PROPN", "calibration": "NOUN", "sibley": "PROPN", "holly": "PROPN", "1598": "NUM", "cadres": "NOUN", "powerful": "ADJ", "logs": "NOUN", "die": "VERB", "dazed": "ADJ", "confirming": "VERB", "frames": "NOUN", "perceive": "VERB", "unimportant": "ADJ", "disasters": "NOUN", "lesser": "ADJ", "pan": "NOUN", "pickle": "NOUN", "reread": "VERB", "railways": "NOUN", "biggest": "ADJ", "bitters": "NOUN", "auction": "NOUN", "oz.": "NOUN", "puppies": "NOUN", "original": "ADJ", "pew": "PROPN", "banquets": "NOUN", "underway": "ADJ", "sliding": "VERB", "chloe": "PROPN", "printing": "NOUN", "899-4310": "NUM", "driveway": "NOUN", "flores": "PROPN", "prevailing": "VERB", "burger": "NOUN", "ugliness": "NOUN", "évariste": "PROPN", "compulsion": "NOUN", "argues": "VERB", "liter": "NOUN", "03:43": "NUM", "michaelis": "PROPN", "carriles": "PROPN", "sympathizer": "NOUN", "lind": "PROPN", "collided": "VERB", "pluralism": "NOUN", "suitcases": "NOUN", "#ethos": "PROPN", "sells": "PROPN", "premises": "NOUN", "alarm": "NOUN", "fork": "NOUN", "1/30/10": "NUM", "plains": "PROPN", "labeled": "VERB", "blotted": "VERB", "zooming": "VERB", "intoxication": "NOUN", "cornflakes": "NOUN", "await": "VERB", "wriggled": "VERB", "blumenfeld": "PROPN", "<": "PUNCT", "releasing": "VERB", "tombs": "NOUN", "grudge": "NOUN", "mk": "PROPN", "helicopter": "NOUN", "rarefied": "ADJ", "314": "NUM", "http://www.tecsoc.org/pubs/history/2002/apr26.htm": "PROPN", "heavy": "ADJ", "texas": "PROPN", "survivor": "NOUN", "wartime": "NOUN", "yield": "VERB", "rekindle": "VERB", "http://www.arps.org.au/chernobyl.htm": "PROPN", "conceivably": "ADV", "renamed": "VERB", "upset": "ADJ", "triggering": "VERB", "townies": "NOUN", "stanford": "PROPN", "habitat": "NOUN", "guerrilla": "NOUN", "refuses": "VERB", "bk": "PROPN", "generic": "ADJ", "virtually": "ADV", "corell": "PROPN", "burrows": "PROPN", "employs": "VERB", "sundays": "PROPN", "huskers": "PROPN", "participating": "VERB", "abate": "VERB", "creatively": "ADV", "ansi-89": "PROPN", "http://www.infoukes.com/history/chornobyl/gregorovich/index.html": "PROPN", "shoes": "NOUN", "poker": "NOUN", "highlighting": "VERB", "living": "VERB", "nvq": "NOUN", "murder": "NOUN", "millions": "NOUN", "mules": "PROPN", "molding": "NOUN", "reference": "NOUN", "jingle": "NOUN", "beforehand": "ADV", "dory": "PROPN", "quaddaffi": "PROPN", "paperwork": "NOUN", "selection": "NOUN", "publicized": "VERB", "essie": "PROPN", "crests": "NOUN", "mapped": "VERB", "parmigiana": "NOUN", "stuffing": "VERB", "enshrined": "VERB", "kusanagi": "PROPN", "vanish": "VERB", "stooge": "NOUN", "terrible": "ADJ", "clogs": "NOUN", "blobs": "NOUN", "artifacts": "NOUN", "grist": "NOUN", "importing": "VERB", "revisit": "VERB", "02/22/2001": "NUM", "713-646-3393": "NUM", "promising": "VERB", "breeding": "NOUN", "pashtun": "ADJ", "aggravated": "VERB", "counter-propaganda": "NOUN", "cactus": "NOUN", "vvedenskoye": "PROPN", "both": "CCONJ", "followup": "NOUN", "11th": "ADJ", "amorphous": "ADJ", "1220": "NUM", "mid-afternoon": "NOUN", "load": "NOUN", "streets": "NOUN", "swedish": "ADJ", "incarceration": "NOUN", "x.x": "SYM", "planning": "VERB", "synthetic": "ADJ", "lagoon": "NOUN", "crush": "NOUN", "proved": "VERB", "administered": "VERB", "holiest": "ADJ", "perpetuates": "VERB", "struggling": "VERB", "oilskin": "NOUN", "paws": "NOUN", "recollected": "VERB", "analyse": "VERB", "woodpeckers": "NOUN", "awhile": "ADV", "ate": "VERB", "catbird": "PROPN", "matched": "VERB", "13381": "NUM", "enlightenment": "NOUN", "bt": "PROPN", "comprised": "VERB", "katan": "NOUN", "politician": "NOUN", "meagan": "PROPN", "0.10": "NUM", "taken": "VERB", "nook": "PROPN", "gilded": "ADJ", "brand-new": "ADJ", "cruse": "PROPN", "58369": "NUM", "chaps": "NOUN", "2009": "NUM", "worshippers": "NOUN", "manhood": "NOUN", "diapers": "NOUN", "menace": "NOUN", "stringing": "VERB", "beam": "NOUN", "basic­ally": "ADV", "nasa": "PROPN", "con": "NOUN", "18": "NUM", "cpcg": "PROPN", "fortune": "NOUN", "anbar": "PROPN", "assad": "PROPN", "solutions": "NOUN", "batting": "NOUN", "m306": "PROPN", "aksa": "PROPN", "jump": "VERB", "co-ownership": "NOUN", "gates": "PROPN", "srd": "PROPN", "fillmore": "PROPN", "tuberculosis": "NOUN", "hare": "NOUN", "http://www.ontario.ca/en/information_bundle/birthcertificates/119275.html": "PROPN", "tons": "NOUN", "filmed": "VERB", "greenland": "PROPN", "buttery": "ADJ", "action": "NOUN", "caps": "NOUN", "availability": "NOUN", "electrons": "NOUN", "flavor": "NOUN", "creature": "NOUN", "07:35": "NUM", "biewener": "PROPN", "71": "NUM", "accomplish": "VERB", "graveyards": "NOUN", "porky": "ADJ", "pager": "NOUN", "frustrating": "ADJ", "repaired": "VERB", "library": "NOUN", "hafs": "PROPN", "jacket": "NOUN", "junior": "ADJ", "windier": "ADJ", "craft": "NOUN", "amoxi": "PROPN", "hyundai": "PROPN", "wrapped": "VERB", "tragic": "ADJ", "poland": "PROPN", "bon": "ADJ", "cafe": "NOUN", "pakistanis": "PROPN", "garcía": "PROPN", "defence": "PROPN", "stella": "PROPN", "agree": "VERB", "calender": "NOUN", "usi": "PROPN", "vulnerability": "NOUN", "recognising": "VERB", "battleships": "NOUN", "hooligans": "NOUN", "disposal": "NOUN", "faulty": "ADJ", "rums": "NOUN", "routed": "VERB", "tough": "ADJ", "lego": "PROPN", "novels": "NOUN", "peeling": "VERB", "indefensible": "ADJ", "finished": "VERB", "enabled": "VERB", "business": "NOUN", "contracted": "VERB", "enthusiastically": "ADV", "humid": "ADJ", "individuals": "NOUN", "incitement": "NOUN", "balcony": "NOUN", "1907": "NUM", "switchboard": "NOUN", "installation": "NOUN", "sensed": "VERB", "01/25/2002": "NUM", "universal": "ADJ", "reduces": "VERB", "enslaved": "VERB", "unwooded": "ADJ", "backing": "VERB", "zealous": "ADJ", "straps": "NOUN", "2001": "NUM", "leeds": "PROPN", "smartphone": "NOUN", "excluding": "VERB", "identical": "ADJ", "mini": "ADJ", "surfaced": "VERB", "davis": "PROPN", "accelerated": "VERB", "jar": "NOUN", "recruiting": "NOUN", "looked": "VERB", "armament": "NOUN", "cultures": "NOUN", "victor": "PROPN", "unanticipated": "ADJ", "ubiquitousness": "NOUN", "412": "NUM", "carless": "ADJ", "www.flag.govt.nz": "PROPN", "hirsohima": "PROPN", "pipe": "NOUN", "debt": "NOUN", "filling": "VERB", "opposites": "NOUN", "69,000": "NUM", "masonic": "ADJ", "squares": "NOUN", "*": "PUNCT", "cds": "NOUN", "interpretations": "NOUN", "determiner": "NOUN", "scrape": "VERB", "threads": "NOUN", "obesity": "NOUN", "lofts": "NOUN", "http://www.wikihow.com/wikihow:carbon-neutral": "PROPN", "antiseptic": "NOUN", "nepool": "PROPN", "wht": "PRON", "lamp": "NOUN", "4:50": "NUM", "handcuffs": "NOUN", "provision": "NOUN", "interception": "NOUN", "blouses": "NOUN", "yoshida": "PROPN", "hudson": "PROPN", "0590883899": "NUM", "renegade": "ADJ", "legitimated": "VERB", "governor": "NOUN", "illegals": "NOUN", "wharf": "NOUN", "wajiha": "PROPN", "hierarchy": "NOUN", "duct": "PROPN", "perp": "NOUN", "tenacity": "NOUN", "bestseller": "NOUN", "lopez": "PROPN", "postdoctoral": "ADJ", "ruining": "VERB", "10:57:32": "NUM", "netherlands": "PROPN", "oils": "NOUN", "belittle": "VERB", "night": "NOUN", "cervantes": "PROPN", "principal": "ADJ", "grandfather": "NOUN", "composition": "NOUN", "aspiring": "VERB", "hephaestus": "PROPN", "meds": "NOUN", "frontpage": "PROPN", "adds": "VERB", "almost": "ADV", "rescoped": "VERB", "reigon": "NOUN", "resistance": "NOUN", "hume": "PROPN", "teammate": "NOUN", "mann": "PROPN", "collaborated": "VERB", "lens": "NOUN", "starts": "VERB", "mcgovern": "PROPN", "purposes": "NOUN", "attacks": "NOUN", "fundamental": "ADJ", "gravitational": "ADJ", "mandel": "PROPN", "3,202.61": "NUM", "frontal": "ADV", "jack": "PROPN", "eu/us": "PROPN", "perfection": "NOUN", "moths": "NOUN", "standings": "NOUN", "pointe": "PROPN", "lighting": "NOUN", "repositioning": "VERB", "m.sc.": "PROPN", "propane": "NOUN", "buwei": "PROPN", "porch": "NOUN", "arsenals": "NOUN", ",": "PUNCT", "mindedness": "NOUN", "arising": "VERB", "internalised": "VERB", "bredders": "NOUN", "joule": "PROPN", "5": "NUM", "gimmicky": "ADJ", "contest": "NOUN", "parker": "PROPN", "bradenton": "PROPN", "shaikh": "PROPN", "images": "NOUN", "1797": "NUM", "dj's": "NOUN", "dpa": "PROPN", "block": "NOUN", "heroes": "NOUN", "36": "NUM", "guitars": "NOUN", "unpredictable": "ADJ", "40,000": "NUM", "phenotypic": "ADJ", "belzer": "NOUN", "daisy": "NOUN", "spontaneity": "NOUN", "falling": "VERB", "paglino": "PROPN", "accumulate": "VERB", "jorge": "PROPN", "ages": "NOUN", "fairy": "NOUN", "akma": "PROPN", "newborn": "ADJ", "galen": "PROPN", "12:33": "NUM", "leavy": "PROPN", "lolland": "PROPN", "sample.doc": "NOUN", "archilochus": "PROPN", "hikmetar": "PROPN", "punctual": "ADJ", "nationally": "ADV", "hurried": "VERB", "coned": "PROPN", "’re": "AUX", "bravely": "ADV", "names": "NOUN", "primaries": "NOUN", "grand": "ADJ", "expressions": "NOUN", "pleadings": "NOUN", "gustafon": "PROPN", "quashed": "VERB", "wardrobe": "NOUN", "emails": "NOUN", "coordinator's": "NOUN", "engels": "PROPN", "pests": "NOUN", "waxman": "PROPN", "twante": "PROPN", "matures": "VERB", "lawless": "ADJ", "store": "NOUN", "withheld": "VERB", "trials": "NOUN", "multiethnic": "ADJ", "neeeeeeeeeverrrr": "ADV", "hiss": "VERB", "positions": "NOUN", "hubs": "NOUN", "brooms": "NOUN", "dhaka": "PROPN", "faris": "PROPN", "certification": "NOUN", "ranch": "NOUN", "re-code": "VERB", "delegate": "NOUN", "__________________________________________________": "SYM", "mock": "ADJ", "conducted": "VERB", "karla": "PROPN", "dislike": "VERB", "eco": "NOUN", "interviewer": "NOUN", "bethesda": "PROPN", "wiring": "NOUN", "kilometres": "NOUN", "distortion": "NOUN", "partners": "NOUN", "futurism": "NOUN", "mecole": "PROPN", "pronounced": "VERB", "stocks": "NOUN", "muzzles": "NOUN", "shortest": "ADJ", "defectors": "NOUN", "powerhead": "NOUN", "vary": "VERB", "dropping": "VERB", "basis": "NOUN", "ltake": "VERB", "knick": "NOUN", "laminated": "VERB", "duh": "INTJ", "discoveries": "NOUN", "lazily": "ADV", "then": "ADV", "trays": "NOUN", "canoes": "NOUN", "armstrong": "PROPN", "expansive": "ADJ", "bars": "NOUN", "juice": "NOUN", "democrats": "PROPN", "continuously": "ADV", "desecrated": "VERB", "heat": "NOUN", "impotent": "ADJ", "wen": "PROPN", "computational": "ADJ", "snorted": "VERB", "trajectory": "NOUN", "grinning": "VERB", "deploying": "VERB", "hurrah": "INTJ", "navigating": "VERB", "speeds": "NOUN", "suprematist": "NOUN", "nfl": "PROPN", "irrigation": "NOUN", "43.6": "NUM", "blogging": "VERB", "vinegar": "NOUN", "unclear": "ADJ", "unzipped": "VERB", "incited": "VERB", "legalizing": "VERB", "representatives": "NOUN", "divinity": "NOUN", "bioweaponeer": "NOUN", "shy": "ADJ", "68,500": "NUM", "militarize": "VERB", "sidenote": "NOUN", "levy": "VERB", "accent": "NOUN", "dragged": "VERB", "qadoos": "PROPN", "monday": "PROPN", "belonging": "VERB", "looting": "NOUN", "fainting": "NOUN", "prescribe": "VERB", "mimic": "VERB", "smoked": "VERB", "clerk": "NOUN", "garlic": "NOUN", "pancake": "NOUN", "alcoholic": "NOUN", "5.30": "NUM", "durham": "PROPN", "nevis": "PROPN", "scalzo": "PROPN", "benefit": "NOUN", "tidbit": "NOUN", "salem": "PROPN", "cw": "PROPN", "501st": "ADJ", "poked": "VERB", "khalid": "PROPN", "tristan": "PROPN", "soaking": "VERB", "actually": "ADV", "lazers": "NOUN", "undue": "ADJ", "steinberg": "PROPN", "scotland": "PROPN", "guild": "PROPN", "dozen": "NUM", "russian": "ADJ", "wishing": "VERB", "noticing": "VERB", "bulge": "VERB", "creator": "NOUN", "simpering": "ADJ", "rocky": "ADJ", "interviewers": "NOUN", "11/2": "NUM", "mechanicly": "ADV", "jobsite": "NOUN", "idiots": "NOUN", "guards": "NOUN", "reimbursed": "VERB", "mcveigh": "PROPN", "agglomeration": "NOUN", "tet": "PROPN", "nawaz": "PROPN", "nat": "ADJ", "uneven": "ADJ", "mimicry": "NOUN", "dreams": "NOUN", "monasteries": "NOUN", "1710": "NUM", "prolong": "VERB", "satanism": "PROPN", "nivine": "PROPN", "propelled": "VERB", "razak": "PROPN", "639,000": "NUM", "jewel": "NOUN", "surest": "ADJ", "pollutants": "NOUN", "nicole": "PROPN", "revisions": "NOUN", "emissivity": "NOUN", "christiane": "PROPN", "violation": "NOUN", "ratification": "NOUN", "unhesitantly": "ADV", "builders": "PROPN", "+1": "NUM", "skush@swbell.net": "PROPN", "storefronts": "NOUN", "kg": "NOUN", "1996": "NUM", "altitude": "NOUN", "grether": "PROPN", "authors": "NOUN", "bend": "PROPN", "choices": "NOUN", "state": "NOUN", "peaking": "VERB", "longshoreman": "NOUN", "tåsinge": "PROPN", "azerbaijan": "PROPN", "dioxide": "NOUN", "barry": "PROPN", "transplants": "NOUN", "http://www.un.org/ha/chernobyl/": "PROPN", "markedly": "ADV", "richly": "ADV", "humility": "NOUN", "09819602175": "NUM", "liquidation": "NOUN", "yowled": "VERB", "arco": "PROPN", "capped": "VERB", "ascended": "VERB", "reception": "NOUN", "relleno": "NOUN", "scraping": "VERB", "submarines": "NOUN", "prince": "PROPN", "sjöstedt": "PROPN", "quiet": "ADJ", "moment": "NOUN", "erupted": "VERB", "clink": "NOUN", "'09": "NUM", "meaning": "NOUN", "944-6800": "NUM", "pickups": "NOUN", "eclipse": "NOUN", "confidante": "NOUN", "macadam": "NOUN", "receptive": "ADJ", "childcare": "NOUN", "storm": "NOUN", "folding": "VERB", "responders": "NOUN", "catholics": "PROPN", "elon": "PROPN", "kissed": "VERB", "drops": "NOUN", "sylvia": "PROPN", "miranda": "PROPN", "donuts": "NOUN", "forum": "NOUN", "cloth": "NOUN", "creams": "NOUN", "hindrance": "NOUN", "bro": "NOUN", "trusted": "VERB", "youth": "NOUN", "hauls": "VERB", "inflating": "VERB", "bohéme": "NOUN", "shields": "NOUN", "classroom": "NOUN", "clause": "NOUN", "halls": "NOUN", "caged": "VERB", "lonely": "ADJ", "indiana": "PROPN", "farriers": "NOUN", "lump": "NOUN", "litterbox": "NOUN", "cheerful": "ADJ", "hamid": "PROPN", "emblem": "NOUN", "neutral": "ADJ", "cited": "VERB", "drivel": "NOUN", "grandma": "NOUN", "episode": "NOUN", "bisected": "VERB", "caprese": "PROPN", "intercepted": "VERB", "conveniences": "NOUN", "cucumbers": "NOUN", "della": "PROPN", "1918": "NUM", "patterns": "NOUN", "peters": "PROPN", "weeds": "NOUN", "anticipates": "VERB", "company's": "NOUN", "conference": "NOUN", "twenty-six": "NUM", "p.": "NOUN", "hastily": "ADV", "cartoon": "NOUN", "ensured": "VERB", "depopulated": "VERB", "prospective": "ADJ", "virile": "ADJ", "glimmering": "VERB", "lotus": "NOUN", "grandmothers": "NOUN", "horrible": "ADJ", "petite": "PROPN", "foreigner": "NOUN", "inferences": "NOUN", "special": "ADJ", "gringotts": "PROPN", "ca.": "ADV", "gathering": "VERB", "toward": "ADP", "shipping": "NOUN", "textbook": "NOUN", "design-time": "NOUN", "conan": "PROPN", "compared": "VERB", "skyline": "NOUN", "7:40": "NUM", "47,500": "NUM", "coordinated": "VERB", "?": "PUNCT", "mba": "NOUN", "semiautomatic": "ADJ", "square": "ADJ", "neiman": "PROPN", "developmentally": "ADV", "processors": "NOUN", "jafari": "PROPN", "pitcher": "NOUN", "alcohol": "NOUN", "captivated": "ADJ", "over-generalizations": "NOUN", "muff": "NOUN", "lemon": "NOUN", "deptford": "PROPN", "oppressive": "ADJ", "gained": "VERB", "preparatory": "ADJ", "bahai": "PROPN", "respecting": "VERB", "googled": "VERB", "amazon": "PROPN", "emotionally": "ADV", "papacy": "PROPN", "screens": "NOUN", "models": "NOUN", "varie$": "VERB", "congo": "PROPN", "drum": "VERB", "fy05": "NOUN", "diminishes": "VERB", "deb": "PROPN", "sacre": "PROPN", "epistemologies": "NOUN", "judge": "NOUN", "discussions": "NOUN", "charities": "NOUN", "washing": "VERB", "panjsheri": "ADJ", "farmers": "NOUN", "low": "ADJ", "newton": "PROPN", "pawtucket": "PROPN", "unarguable": "ADV", "predisposition": "NOUN", "prefect": "NOUN", "intolerant": "ADJ", "malaysia": "PROPN", "spaced": "VERB", "11:35": "NUM", "rebuttal": "NOUN", "forbid": "VERB", "11/28/2000": "NUM", "fading": "VERB", "dennis": "PROPN", "namsan": "PROPN", "actualy": "ADV", "masking": "NOUN", "scba": "PROPN", "fiction": "NOUN", "comparability": "NOUN", "song": "NOUN", "princess": "NOUN", "naval": "ADJ", "hitwise": "PROPN", "sac-d": "PROPN", "johnette": "PROPN", "hugged": "VERB", "ed": "PROPN", "multiplayer": "NOUN", "hindsight": "NOUN", "electoral": "ADJ", "1.5": "NUM", "pelvic": "ADJ", "podcast": "NOUN", "seems": "VERB", "waterfront": "NOUN", "thundering": "VERB", "imperialism": "NOUN", "bobby": "PROPN", "dah": "INTJ", "gash": "NOUN", "rio": "PROPN", "feels": "VERB", "http://www.equinecaninefeline.com/catalog/savic-freddy-cage-free-delivery-p-6750.html": "PROPN", "understanding": "NOUN", "appel": "PROPN", "unquestionably": "ADV", "shrunk": "VERB", "spoke": "VERB", "dealbench": "PROPN", "insight": "NOUN", "outfits": "NOUN", "chevy": "PROPN", "cable": "NOUN", "costumed": "VERB", "nellie": "PROPN", "purely": "ADV", "lugubrious": "ADJ", "gallery": "NOUN", "caribbean": "PROPN", "retreated": "VERB", "foulkesstraat": "PROPN", "displaying": "VERB", "semester": "NOUN", "tile": "NOUN", "construe": "VERB", "”": "PUNCT", "spel": "VERB", "bedroom": "NOUN", "discusses": "VERB", "hogwarts": "PROPN", "jaunty": "ADJ", "civilization": "NOUN", "chaotic": "ADJ", "decaying": "ADJ", "supercuts": "PROPN", "telegraphic": "ADJ", "http://www.thetruthseeker.co.uk/article.asp?id=4503": "PROPN", "jim": "PROPN", "stove": "NOUN", "epistemological": "ADJ", "tha-": "INTJ", "ebullient": "ADJ", "noisy": "ADJ", "kat": "PROPN", "florence": "PROPN", "bogging": "VERB", "rival": "NOUN", "qualified": "ADJ", "bonaire": "PROPN", "extracts": "PROPN", "1859": "NUM", "dispersion": "NOUN", "typology": "NOUN", "1890": "NUM", "1801": "NUM", "sabunji": "PROPN", "realization": "NOUN", "elite": "ADJ", "khaki": "NOUN", "raffle": "NOUN", "indicative": "ADJ", "monologue": "NOUN", "ottle-": "ADJ", "index": "NOUN", "biolab": "NOUN", "haim": "PROPN", "technique": "NOUN", "noise": "NOUN", "fabo": "PROPN", "adjustable": "ADJ", "knocks": "NOUN", "eusebius": "PROPN", "spinoff": "NOUN", "dinghies": "PROPN", "kroeker": "PROPN", "payers": "NOUN", "soldiers": "NOUN", "decoud": "PROPN", "clamouring": "VERB", "edward": "PROPN", "eastern": "ADJ", "cellular": "ADJ", "financial": "ADJ", "spaces": "NOUN", "pandolfi": "PROPN", "whereas": "SCONJ", "transformation": "NOUN", "reluctance": "NOUN", "unenlightened": "ADJ", "workmanship": "NOUN", "1973": "NUM", "descriptive": "ADJ", "grrrrrrrreeeaaat": "ADJ", "bonino": "PROPN", "wet": "ADJ", "inside": "ADV", "clash": "VERB", "kitts": "PROPN", "criticising": "VERB", "shrugged": "VERB", "financed": "VERB", "console": "NOUN", "scheduled": "VERB", "notifications": "NOUN", "shish": "NOUN", "enlargement": "NOUN", "highrise": "ADJ", "oblivion": "PROPN", "dancing": "VERB", "quad": "NOUN", "16.3": "NUM", "similarities": "NOUN", "minimum": "NOUN", "slammed": "VERB", "evil-smelling": "ADJ", "self-transformation": "NOUN", "damaged": "VERB", "saudi": "ADJ", "1,183": "NUM", "cayenne": "NOUN", "colours": "NOUN", "joachim": "PROPN", "perpendicular": "ADJ", "proportion": "NOUN", "affronted": "VERB", "institutionalism": "NOUN", "red-headed": "ADJ", "negligent": "ADJ", "weak-eyed": "ADJ", "puffs": "NOUN", "chong": "PROPN", "chop": "NOUN", "procession": "NOUN", "merit": "NOUN", "favours": "NOUN", "erebus": "PROPN", "degeneration": "PROPN", "motion": "NOUN", "streamline": "VERB", "fused": "VERB", "maritain": "PROPN", "lambala-speaking": "ADJ", "nguyen": "PROPN", "asymptotic": "ADJ", "93": "NUM", "scan": "NOUN", "polluting": "VERB", "trademarked": "VERB", "isolation": "NOUN", "beetles": "NOUN", "anticipate": "VERB", "iceland": "PROPN", "boulder": "PROPN", "south": "PROPN", "susan": "PROPN", "powell": "PROPN", "vulnerable": "ADJ", "jiu": "NOUN", "loses": "VERB", "therefore": "ADV", "mellencamp": "PROPN", "disgust": "NOUN", "budgets": "NOUN", "fusions": "NOUN", "transmutation": "NOUN", "witness": "VERB", "proving": "VERB", "facilitated": "VERB", "beverly": "PROPN", "mindlessness": "NOUN", "vp": "NOUN", "fascinates": "VERB", "codex": "NOUN", "anniversary": "NOUN", "translator": "NOUN", "combed": "VERB", "undeniable": "ADJ", "false": "ADJ", "distorts": "VERB", "messina": "PROPN", "comm-": "INTJ", "borritos": "NOUN", "garcia": "PROPN", "bachelor": "NOUN", "affection": "NOUN", "chumley": "PROPN", "businessperson": "NOUN", "mixes": "VERB", "calculus": "NOUN", "apologizing": "VERB", "murungi": "PROPN", "0.2": "NUM", "1596": "NUM", "theft": "NOUN", "suffering": "VERB", "habit": "NOUN", "sleeved": "ADJ", "stenosis": "NOUN", "oh-ho": "INTJ", "description": "NOUN", "fuji": "PROPN", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!": "PUNCT", "sharp": "ADJ", "buzzer": "NOUN", "bicycle": "NOUN", "stay": "VERB", "hampshire": "PROPN", "distal": "ADJ", "russell": "PROPN", "ethnocentric": "ADJ", "3/03": "NUM", "trieste": "PROPN", "@potus": "PROPN", "momentary": "ADJ", "one-sided": "ADJ", "1956": "NUM", "http://www.internetchurchofchrist.org": "PROPN", "lapse": "VERB", "10:00": "NUM", "saloon": "PROPN", "happened": "VERB", "reccommend": "VERB", "cafes": "NOUN", "shiu": "PROPN", "immediate": "ADJ", "chander": "PROPN", "foraging": "NOUN", "miscreants": "NOUN", "mikhail": "PROPN", "stillman": "PROPN", "digging": "VERB", "earliest": "ADJ", "swell": "NOUN", "counterparty": "NOUN", "synthesis": "NOUN", "shoulder": "NOUN", "wire": "NOUN", "victim": "NOUN", "slipping": "VERB", "bookings": "NOUN", "chrisssake": "NOUN", "iot": "PROPN", "prove": "VERB", "enjoy": "VERB", "messengers": "NOUN", "cyrus": "PROPN", "info.": "NOUN", "youtubers": "PROPN", "rankings": "NOUN", "actins": "NOUN", "edt": "PROPN", "ifn": "PROPN", "wounded": "VERB", "bea": "PROPN", "botn": "VERB", "campbell": "PROPN", "dpc": "PROPN", "puny": "ADJ", "nonna": "PROPN", "contacts": "NOUN", "additive": "NOUN", "mushrooms": "NOUN", "laurie": "PROPN", "woodinville": "PROPN", "ssd": "NOUN", "branom": "PROPN", "newly": "ADV", "20001": "NUM", "01/26/2001": "NUM", "silhouette": "NOUN", "mar": "PROPN", "nigiri": "NOUN", "roses": "NOUN", "cats": "NOUN", "fraiser": "PROPN", "ledger": "NOUN", "oops": "INTJ", "feith": "PROPN", "document": "NOUN", "lobby": "NOUN", "resonates": "VERB", "kimberly": "PROPN", "airliner": "NOUN", "amputated": "ADJ", "muse": "NOUN", "slopes": "NOUN", "art": "NOUN", "nonpartisan": "ADJ", "practically": "ADV", "declaration": "NOUN", "buttered": "ADJ", "civilisation": "NOUN", "registered": "VERB", "blossoming": "NOUN", "denver": "PROPN", "attachment": "NOUN", "alerted": "VERB", "excesses": "NOUN", "freewinds": "PROPN", "biodiversity": "NOUN", "jetblue": "PROPN", "worries": "NOUN", "befriend": "VERB", "mccallum": "PROPN", "encyclopedic": "ADJ", "form": "NOUN", "improvements": "NOUN", "housewife": "NOUN", "ordering": "VERB", "cigar": "NOUN", "herbs": "NOUN", "popular": "ADJ", "augmentations": "NOUN", "filtering": "VERB", "dissipated": "VERB", "shows": "VERB", "anarchy": "NOUN", "arriving": "VERB", "clement": "PROPN", "exchanged": "VERB", "beef": "NOUN", "tommorow": "NOUN", "appreciates": "VERB", "herald": "PROPN", "reservations": "NOUN", "facet": "NOUN", "vote": "NOUN", "summons": "NOUN", "aster": "PROPN", "negro": "ADJ", "torso": "NOUN", "accustomed": "VERB", "seince": "SCONJ", "praises": "NOUN", "forth": "ADV", "sustenance": "NOUN", "scoring": "NOUN", "fringes": "NOUN", "bonde": "PROPN", "chandler": "PROPN", "substantiation": "NOUN", "patchwork": "NOUN", "tsars": "PROPN", "corking": "NOUN", "rejects": "VERB", "creditor": "NOUN", "re-": "INTJ", "proud": "ADJ", "revolt": "NOUN", "mcdonalds": "PROPN", "kung": "NOUN", "sculpture": "NOUN", "arancini": "NOUN", "observatory": "PROPN", "infallible": "ADJ", "leaders": "NOUN", "invictus": "PROPN", "beheshti": "PROPN", "bade": "VERB", "3611": "NUM", "sticks": "NOUN", "6.8": "NUM", "grey": "ADJ", "s&m": "NOUN", "hizb": "PROPN", "docks": "NOUN", "baudelaire": "PROPN", "fri": "PROPN", "skidmore": "PROPN", "stare": "NOUN", "darkroom": "NOUN", "succintly": "ADV", "canister": "NOUN", "colonel": "NOUN", "anatomical": "ADJ", "misfortunes": "NOUN", "native": "ADJ", "regreted": "VERB", "1825": "NUM", "thei": "PRON", "torturing": "VERB", "jiffy": "NOUN", "labor": "NOUN", "insights": "NOUN", "3/9/00": "NUM", "plane": "NOUN", "glitch": "NOUN", "pupils": "NOUN", "teotihuacan": "PROPN", "meats": "NOUN", "residence": "NOUN", "sport": "NOUN", "long": "ADJ", "theatres": "NOUN", "pre-fab": "ADJ", "117th": "ADJ", "maddened": "VERB", "rudely": "ADV", "refineries": "NOUN", "omnipotence": "NOUN", "corpse": "NOUN", "leotard": "NOUN", "appointing": "VERB", "uncharacteristically": "ADV", "trove": "NOUN", "antisocialism": "NOUN", "nizhny": "PROPN", "preheat": "VERB", "cost": "NOUN", "champs": "PROPN", "innocently": "ADV", "walton": "PROPN", "eagle": "NOUN", "alluded": "VERB", "sounded": "VERB", "exhausted-looking": "ADJ", "villages": "NOUN", "chief": "ADJ", "rosencreutz": "PROPN", "impugned": "VERB", "candidate": "NOUN", "nearer": "ADV", "amounted": "VERB", "bobbing": "VERB", "bloke": "NOUN", "pulls": "VERB", "pg&e": "PROPN", "soprano": "NOUN", "sum-distinct-price": "PROPN", "strengthened": "VERB", "hamilton": "PROPN", "vocabulary": "NOUN", "tallulah": "PROPN", "soleil": "PROPN", "nurtured": "VERB", "oliveira": "PROPN", "patterson": "PROPN", "staying": "VERB", "wealthy": "ADJ", "accented": "ADJ", "welcomed": "VERB", "payroll": "NOUN", "persuading": "VERB", "protégé": "NOUN", "capitals": "NOUN", "2011": "NUM", "attainment": "NOUN", "l'enfant": "PROPN", "stages": "NOUN", "buys": "ADJ", "apothecary": "NOUN", "fallujan": "ADJ", "purchase": "NOUN", "conceding": "VERB", "bathrooms": "NOUN", "rulan": "PROPN", "enlarging": "VERB", "pivotchart": "NOUN", "barnes": "PROPN", "congressional": "ADJ", "nightdress": "NOUN", "pasquallie": "PROPN", "dived": "VERB", "beethoven": "PROPN", "cowboy": "NOUN", "occasion": "NOUN", "scrambling": "VERB", "resilience": "NOUN", "hotpot": "VERB", "azzam": "PROPN", "trot": "NOUN", "carnegie": "PROPN", "parisians": "PROPN", "stinebower": "PROPN", "fundamentals": "PROPN", "suggests": "VERB", "aforementioned": "ADJ", "tilt": "ADV", "opted": "VERB", "inspirational": "ADJ", "ihara": "PROPN", "message": "NOUN", "surpassing": "VERB", "lively": "ADJ", "ucc": "NOUN", "immortal": "ADJ", "gtee": "NOUN", "crumbs": "NOUN", "arresting": "VERB", "humor": "NOUN", "conciliatory": "ADJ", "shiites": "PROPN", "black-red": "ADJ", "methods": "NOUN", "uncenturied": "ADJ", "20005": "NUM", "sharing": "VERB", "0.05": "NUM", "kushnick": "PROPN", "matchup": "NOUN", "sarah": "PROPN", "harrison": "PROPN", "reprioritised": "VERB", "bulging": "ADJ", "temptation": "NOUN", "unanimity": "NOUN", "inflated": "VERB", "flotsam": "NOUN", "peopled": "VERB", "italia": "PROPN", "hmmm": "INTJ", "msn": "PROPN", "mouhamad": "PROPN", "collectors": "NOUN", "goose": "PROPN", "80435": "NUM", "pillars": "NOUN", "internationally": "ADV", "members": "NOUN", "perception": "NOUN", "stationed": "VERB", "narrowly": "ADV", "mon": "PROPN", "sales": "NOUN", "inner": "ADJ", "07/30/2001": "NUM", "eyedropper": "NOUN", "generous": "ADJ", ".4": "NUM", "diet": "NOUN", "galleries": "NOUN", "louise": "PROPN", "carcass": "NOUN", "exhibit": "NOUN", "leo": "PROPN", "better": "ADJ", "planners": "NOUN", "old": "ADJ", "download": "VERB", "village": "NOUN", "weapons": "NOUN", "713-819-2784": "NUM", "finland": "PROPN", "doctors": "NOUN", "wink": "NOUN", "sahhaf": "PROPN", "sub-par": "ADJ", "divest": "VERB", "stimulate": "VERB", "governmental": "ADJ", "shelby": "PROPN", "mailing": "NOUN", "hungarians": "NOUN", "country": "NOUN", "680": "NUM", "detroit": "PROPN", "07:24": "NUM", "footprints": "NOUN", "80s": "NOUN", "jaffna": "PROPN", "crept": "VERB", "reverted": "VERB", "neuendorffer": "PROPN", "vine": "NOUN", "his.": "NOUN", "secluded": "ADJ", "meadows": "NOUN", "gated": "ADJ", "victors": "PROPN", "annesley": "PROPN", "tmobile": "PROPN", "ukraine": "PROPN", "1833": "NUM", "help": "VERB", "politest": "ADJ", "mishkenot": "PROPN", "risks": "NOUN", "currency": "NOUN", "rifle": "NOUN", "constitution": "NOUN", "rigor": "NOUN", "stagger": "VERB", "beresford": "PROPN", "aha": "INTJ", "rosario": "PROPN", "joining": "VERB", "13.9": "NUM", "ornament": "NOUN", "parental": "ADJ", "dries": "PROPN", "roberts": "PROPN", "beach": "NOUN", "pellegrino": "PROPN", "told": "VERB", "establishments": "NOUN", "devoted": "VERB", "magazines": "NOUN", "intimidating": "ADJ", "chipotle": "PROPN", "packed": "VERB", "04:44": "NUM", "crapload": "NOUN", "social": "ADJ", "saint": "ADJ", "pedicures": "NOUN", "3.8": "NUM", "sinister": "ADJ", "copeland": "PROPN", "event": "NOUN", "sequencing": "NOUN", "école": "PROPN", "zakaria": "PROPN", "judiciary": "PROPN", "stouter": "ADJ", "intrudes": "VERB", "500.00": "NUM", "sinyavskys": "PROPN", "midden": "NOUN", "sweatshirts": "NOUN", "button": "NOUN", "improved": "VERB", "gun": "NOUN", "pitched": "ADJ", "overhead": "NOUN", "loads": "NOUN", "canopied": "VERB", "01:58": "NUM", "granadilla": "NOUN", "appropriateness": "NOUN", "v-": "INTJ", "dulaymi": "PROPN", "trailor": "NOUN", "encrusted": "VERB", "geographic": "ADJ", "unproven": "ADJ", "hunting": "VERB", "designing": "VERB", "communism": "NOUN", "bewildered": "VERB", "tellers": "NOUN", "rorschach": "PROPN", "underpinning": "VERB", "serbia": "PROPN", "violently": "ADV", "cargill": "PROPN", "communicator": "NOUN", "militarism": "NOUN", "effect": "NOUN", "coil": "PROPN", "sponge": "NOUN", "flashpoints": "NOUN", "updates": "NOUN", "mcnuggets": "PROPN", "n't": "PART", "substrate": "NOUN", "helmets": "NOUN", "allowed": "VERB", "..........": "PUNCT", "sickly": "ADJ", "handlers": "NOUN", "punished": "VERB", "u.s.": "PROPN", "2.15": "NUM", "shrieks": "NOUN", "creatures": "NOUN", "dinners": "NOUN", "imposing": "VERB", "misnamed": "VERB", "wilkins": "PROPN", "supplements": "VERB", "spec.": "NOUN", "calculations": "NOUN", "talented": "ADJ", "sheraton": "PROPN", "compeltly": "ADV", "mandate": "NOUN", "http://www.petsathome.com/shop/combi-1-dwarf-hamster-cage-by-ferplast-15986": "PROPN", "technlogy": "PROPN", "1?!?!?": "PUNCT", "steamboat": "PROPN", "***": "PUNCT", "undertaken": "VERB", "irate": "ADJ", "jr.": "PROPN", "10/27/2000": "NUM", "complexes": "NOUN", "gearbox": "NOUN", "halves": "NOUN", "super": "ADV", "rises": "NOUN", "college": "NOUN", "rejection": "NOUN", "tender": "ADJ", "wishes": "NOUN", "exist": "VERB", "unbroken": "ADJ", "4-ever": "ADV", "easier": "ADJ", "annotated": "VERB", "guidance": "NOUN", "y!a": "PROPN", "€": "SYM", "meritocratically": "ADV", "visually": "ADV", "economically": "ADV", "anxiety": "NOUN", "romaine": "NOUN", "russians": "PROPN", "flashy": "ADJ", "farcical": "ADJ", "polling": "NOUN", "extremists": "NOUN", "stem": "NOUN", "daniel.smith2@durham.ac.uk": "PROPN", "vented": "VERB", "hoods": "NOUN", "disappointment": "NOUN", "overly": "ADV", "snyder": "PROPN", "eighteenth": "ADJ", "exhausting": "ADJ", "800": "NUM", "12.46": "NUM", "panic": "NOUN", "ships": "NOUN", "cehf": "NOUN", "regulations": "NOUN", "hoop": "NOUN", "continually": "ADV", "2nd": "ADJ", "shaganon": "PROPN", "engulfed": "VERB", "formalisms": "NOUN", "wiser": "ADJ", "aught": "NOUN", "advisers": "NOUN", "doctor": "NOUN", "boiling": "ADJ", "rows": "NOUN", "betta": "NOUN", "entitled": "VERB", "drained": "VERB", "gorman": "PROPN", "sixties": "NOUN", "rugova": "PROPN", "fades": "VERB", "qld": "PROPN", "grasps": "VERB", "ld2d-#69377-1.xls": "NOUN", "occurs": "VERB", "ron": "PROPN", "evil": "ADJ", "tied": "VERB", "needs": "VERB", "surpluses": "NOUN", "paired": "VERB", "intrigue": "NOUN", "gamut": "NOUN", "lipids": "NOUN", "bred": "VERB", "jungle": "NOUN", "caucasians": "PROPN", "incremental": "ADJ", "harmonisation": "NOUN", "ex-members": "NOUN", "percell": "PROPN", "dedication": "NOUN", "02:19": "NUM", "1724": "NUM", "list": "NOUN", "coarse": "ADJ", "instability": "NOUN", "association": "PROPN", "coase": "PROPN", "accession": "NOUN", "ugly": "ADJ", "wages": "NOUN", "mid-may": "PROPN", "r.i": "PROPN", "emery": "PROPN", "se": "AUX", "stabbed": "VERB", "wavenumber": "NOUN", "violate": "VERB", "yung": "PROPN", "indivisible": "ADJ", "tunisia": "PROPN", "imperium": "PROPN", "1/8": "NUM", "piloting": "NOUN", "while": "SCONJ", "approximation": "NOUN", "exhibition": "NOUN", "psu": "NOUN", "benner": "PROPN", "puppets": "NOUN", "tastings": "NOUN", "indianapolis": "PROPN", "formed": "VERB", "screamed": "VERB", "difficulty": "NOUN", "metaphysics": "NOUN", "macedonia": "PROPN", "b****": "NOUN", "designs": "NOUN", "themed": "ADJ", "gym": "NOUN", "fence": "NOUN", "godspeed": "PROPN", "impersonal": "ADJ", "privatly": "ADV", "dih": "INTJ", "bangladesh": "PROPN", "accidentally": "ADV", "phet": "PROPN", "20515": "NUM", "william": "PROPN", "performing": "VERB", "tops": "NOUN", "erred": "VERB", "admitted": "VERB", "reinterred": "VERB", "sherri": "PROPN", "tablets": "NOUN", "tagesspiegel": "PROPN", "castle": "NOUN", "changer": "NOUN", "martha": "PROPN", "whitehouse.gov": "PROPN", "200,000,000,000": "NUM", "womanish": "ADJ", "http://www.wikihow.com/wikihow:right-to-fork": "PROPN", "jargon": "NOUN", "sandals": "NOUN", "malacca": "PROPN", "+4588304520": "NUM", "gangs": "NOUN", "neuralink": "PROPN", "infield": "NOUN", "fifth": "ADJ", "3,300,000": "NUM", "parsi": "ADJ", "preschoolers": "NOUN", "whither": "ADV", "moab": "PROPN", "wang": "NOUN", "114,950": "NUM", "titanic": "PROPN", "hypocrisy": "NOUN", "patting": "VERB", "overcast": "ADJ", "episcopalian": "PROPN", "quoting": "VERB", "urge": "VERB", "cool": "ADJ", "astonishing": "VERB", "kathy": "PROPN", "ranasinghe": "PROPN", "dari": "PROPN", "wants": "VERB", "architecture": "NOUN", "quit": "VERB", "gladly": "ADV", "cruise": "NOUN", "hostages": "NOUN", "re-enactments": "NOUN", "appraisal": "NOUN", "15": "NUM", "hawaii": "PROPN", "sensations": "NOUN", "mins": "NOUN", "plagues": "VERB", "mixture": "NOUN", "acquistion": "NOUN", "828-296-8466": "NUM", "smacks": "VERB", "wildly": "ADV", "mccartney": "PROPN", "proficiency": "NOUN", "learners": "NOUN", "http://www.nea.fr/html/rp/chernobyl/c01.html": "PROPN", "zone": "NOUN", "supremacy": "NOUN", "cagey": "ADJ", "kept": "VERB", "commitment": "NOUN", "generalize": "VERB", "contact": "NOUN", "experimentation": "NOUN", "romeo": "PROPN", "michele": "PROPN", "anahuac": "PROPN", "boulevard": "NOUN", "http://www.bigeye.com/111003.htm": "PROPN", "bees": "NOUN", "spadework": "NOUN", "environmental": "ADJ", "furious": "ADJ", "renee": "PROPN", "orders": "NOUN", "tick": "VERB", "illinois": "PROPN", "contamination": "NOUN", "bulbs": "NOUN", "begin": "VERB", "prophet": "PROPN", "request": "NOUN", "hanrahan": "PROPN", "!?!": "PUNCT", "algeria": "PROPN", "iso": "PROPN", "waking": "VERB", "encounters": "NOUN", "famously": "ADV", "anton": "PROPN", "invisible": "ADJ", "plump": "ADJ", "can-teen": "NOUN", "succumbing": "VERB", "catapult": "NOUN", "!!!.": "PUNCT", "1691": "NUM", "lucy": "PROPN", "indonesia": "PROPN", "buñuel": "PROPN", "finger": "NOUN", "greendale": "PROPN", "gambling": "NOUN", "lever": "NOUN", "generating": "VERB", "segment": "NOUN", "salvage": "NOUN", "jehad": "PROPN", "negotiated": "VERB", "socotra": "PROPN", "thank": "VERB", "karate": "PROPN", "goldberg": "PROPN", "little": "ADJ", "turnover": "NOUN", "intellect": "NOUN", "exocet": "PROPN", "1853": "NUM", "soundless": "ADJ", "creel": "PROPN", "review": "NOUN", "pale": "ADJ", "fearsome": "ADJ", "48": "NUM", "remnant": "NOUN", "7:15": "NUM", "chimichangas": "NOUN", "offices": "NOUN", "kinneret": "PROPN", "patch": "NOUN", "girls": "NOUN", "nun": "NOUN", "ian": "PROPN", "wikis": "NOUN", "drug-out": "VERB", "seas": "PROPN", "privet": "PROPN", "rahman": "PROPN", "hippie": "ADJ", "slovenian": "ADJ", "metaethical": "ADJ", "slanting": "VERB", "thousands": "NOUN", "americans": "PROPN", "icy-wet": "ADJ", "30,0": "NUM", "engines": "NOUN", "*ss": "NOUN", "fisht": "PROPN", "coalition": "PROPN", "subdivide": "VERB", "perspective": "NOUN", "r.": "PROPN", "moving": "VERB", "comeback": "NOUN", "volcano": "NOUN", "shallac": "NOUN", "arch-murderer": "NOUN", "satisfaction": "NOUN", "10:55": "NUM", "obligates": "VERB", "airfare": "NOUN", "limbs": "NOUN", "manufacturer": "NOUN", "structures": "NOUN", "manufacturing": "NOUN", "laurels": "NOUN", "sentimentality": "NOUN", "integrate": "VERB", "irrational": "ADJ", "propose": "VERB", "exaggeration": "NOUN", "enthusiasts": "NOUN", "determines": "VERB", "caraibes": "PROPN", "yorkedness": "NOUN", "jonesy": "PROPN", "clicked": "VERB", "golan": "PROPN", "elliotts": "PROPN", "knockturn": "PROPN", "oats": "PROPN", "piece": "NOUN", "06:20": "NUM", "reprisals": "NOUN", "liwei": "PROPN", "broth": "NOUN", "reconfirm": "VERB", "1900": "NUM", "torch": "NOUN", "moans": "NOUN", "thessaloniki": "PROPN", "unparalleled": "ADJ", "casualties": "NOUN", "freed": "VERB", "favorites": "NOUN", "rep": "NOUN", "charitable": "ADJ", "accuses": "VERB", "sets": "VERB", "butterflies": "NOUN", "aphrodite": "PROPN", "elects": "NOUN", "vajpayee": "PROPN", "virtual": "ADJ", "mace": "PROPN", "era": "NOUN", "negotiations": "NOUN", "patrons": "NOUN", "lingua": "NOUN", "accusing": "VERB", "reveals": "VERB", "warmly": "ADV", "sustainable": "ADJ", "gentle": "ADJ", "york": "PROPN", "chuck": "PROPN", "hadibo": "PROPN", "1505": "NUM", "michaels": "PROPN", "initiator": "NOUN", "interrogators": "NOUN", "kiara": "PROPN", "dzida": "PROPN", "gerald": "PROPN", "utilising": "VERB", "helmet": "NOUN", "garments": "NOUN", "billy": "PROPN", "cheryl": "PROPN", "grinned": "VERB", "draped": "VERB", "shi'ite": "ADJ", "dreadful": "ADJ", "reunify": "VERB", "ay": "INTJ", "efficiently": "ADV", "delectable": "ADJ", "wireless": "ADJ", "questioningly": "ADV", "exclaim": "VERB", "jordanian": "ADJ", "1700": "NUM", "women": "NOUN", "disrupting": "VERB", "surviving": "VERB", "polite": "ADJ", "rotting": "VERB", "intents": "NOUN", "ratio": "NOUN", "concept": "NOUN", "diagon": "PROPN", "wobblers": "NOUN", "undersigned": "ADJ", "bother": "VERB", "smakkecenter": "NOUN", "anonymous": "ADJ", "conflicts": "NOUN", "rap": "NOUN", "haight": "PROPN", "statue": "NOUN", "http://www.utrechtart.com/craft-supplies/woodworking%20supplies/": "PROPN", "stephen.dyer@bakerbotts.com": "PROPN", "jitney": "NOUN", "divorces": "NOUN", "condensed": "ADJ", "vomited": "VERB", "rinascimento": "PROPN", "pinotage": "PROPN", "melbourne": "PROPN", "wander": "VERB", "jodud...@aol.com": "PROPN", "set": "VERB", "conquest": "PROPN", "cake": "NOUN", "outliers": "NOUN", "gain": "VERB", "hostesses": "NOUN", "el": "PROPN", "visibly": "ADV", "identifies": "VERB", "miracle": "NOUN", "job-with-prospects": "NOUN", "wisely": "ADV", "supporting": "VERB", "milder": "ADJ", "bilboa": "PROPN", "outdated": "ADJ", "redlined": "ADJ", "stronghold": "NOUN", "tragedy": "NOUN", "myanmar": "PROPN", "bolivia": "PROPN", "persuaded": "VERB", "late-": "ADV", "shankbone": "PROPN", "surrendering": "VERB", "zhou": "PROPN", "ghaza": "PROPN", "smock": "NOUN", "discussing": "VERB", "terrifying": "ADJ", "bendings": "NOUN", "6.5": "NUM", "#1": "NUM", "angie": "PROPN", "glock": "PROPN", "coop": "NOUN", "pursuers": "NOUN", "ride": "NOUN", "idleness": "NOUN", "o&m": "PROPN", "searched": "VERB", "indefinable": "ADJ", "lauralee": "PROPN", "conversation": "NOUN", "veined": "VERB", "describe": "VERB", "tai": "PROPN", "equivalent": "ADJ", "possesses": "VERB", "fernandel": "PROPN", "1.75": "NUM", "dignity": "NOUN", "curry": "NOUN", "magistrates": "NOUN", "suffolk": "PROPN", "14:14": "NUM", "downloading": "NOUN", "12/28": "NUM", "citations": "NOUN", "fresco": "NOUN", "identified": "VERB", "extended": "VERB", "unfriendly": "ADJ", "snowy": "ADJ", "mood": "NOUN", "pitt": "PROPN", "gnu": "NOUN", "cap-": "INTJ", "oversight": "NOUN", "devour": "VERB", "prestigious": "ADJ", "weals": "NOUN", "olives": "NOUN", "effaced": "VERB", "e.": "PROPN", "info": "NOUN", "induced": "VERB", "u2": "PROPN", "counterparts": "NOUN", "roughness": "NOUN", "heartening": "VERB", "df": "PROPN", "transactions": "NOUN", "’ll": "AUX", "substantive": "ADJ", "greatness": "NOUN", "upscale": "ADJ", "retrial": "NOUN", "http://www.wikihow.com/wikihow:contributions-to-charity": "PROPN", "rails": "NOUN", "adamson": "PROPN", "xishan": "PROPN", "pachomian": "ADJ", "avocado": "NOUN", "1938": "NUM", "remake": "NOUN", "articulating": "VERB", "affinity": "NOUN", "scatters": "NOUN", "32": "NUM", "1912": "NUM", "bandar": "PROPN", "adding": "VERB", "waterfalls": "NOUN", "burkes": "PROPN", "blakemore": "PROPN", "overrides": "VERB", "unbeatable": "ADJ", "soapy": "ADJ", "xbox": "PROPN", "fisher": "PROPN", "alert": "NOUN", "across": "ADP", "lake": "PROPN", "thurday": "PROPN", "litttle": "ADJ", "insurgents": "NOUN", "written": "VERB", "paine": "PROPN", "wb": "PROPN", "refusal": "NOUN", "journeys": "NOUN", "pelt": "NOUN", "hizbullah": "PROPN", "2": "NUM", "negotiator": "NOUN", "geertz": "PROPN", "infidels": "NOUN", "inquired": "VERB", "inserts": "NOUN", "patrizia": "PROPN", "‘cuz": "SCONJ", "mayes": "PROPN", "flown": "VERB", "blast": "NOUN", "craftsmen": "NOUN", "alt.animals.rights.promotion": "NOUN", "trimmers": "NOUN", "farthest": "ADJ", "structurally": "ADV", "morning": "NOUN", "sodden": "ADJ", "mother": "NOUN", "yellowstone": "PROPN", "distractions": "NOUN", "perceived": "VERB", "allegory": "NOUN", "climate": "NOUN", "conduct": "VERB", "))": "PUNCT", "browser": "NOUN", "urged": "VERB", "combat": "NOUN", "sweating": "VERB", "łódzkie": "PROPN", "dots": "NOUN", "origin": "NOUN", "relatively": "ADV", "gelatin": "NOUN", "retaking": "VERB", "revive": "VERB", "pike": "PROPN", "occurrence": "NOUN", "2:25": "NUM", "ant": "NOUN", "follows": "VERB", "anatomy": "NOUN", "buckingham": "PROPN", "viral": "ADJ", "kenyan": "ADJ", "knife": "NOUN", "http://www.quantcast.com/wikihow.com": "PROPN", "bwana": "NOUN", "jumpy": "ADJ", "subset": "NOUN", "else": "ADV", "overstay": "VERB", "slithers": "VERB", "253": "NUM", "descriptions": "NOUN", "#health": "PROPN", "parry": "PROPN", "cabbages": "NOUN", "argentina": "PROPN", "hints": "NOUN", "vague": "ADJ", "manic": "PROPN", "roadway": "NOUN", "ecommerce": "NOUN", "713-793-1429": "NUM", "tauris": "PROPN", "bellevue": "PROPN", "spend": "VERB", "roasted": "VERB", "rebuild": "VERB", "expresses": "VERB", "lexicographic": "ADJ", "http://www.newsday.com/news/opinion/ny-vpnasa054135614feb05,0,5979821.story?coll=ny-editorials-headlines": "PROPN", "experiences": "NOUN", "houseware": "NOUN", "smuggle": "VERB", "under": "ADP", "_report.xml": "PROPN", "tco": "PROPN", "rotarua": "PROPN", "11:15:11": "NUM", "darla": "PROPN", "3.": "NUM", "corpora": "NOUN", "more": "ADV", "ave": "PROPN", "stairs": "NOUN", "substantial": "ADJ", "http://www.ibiblio.org/expo/soviet.exhibit/chernobyl.html": "PROPN", "weathertrade": "PROPN", "gut": "NOUN", "cox": "PROPN", "penines": "PROPN", "tremble": "VERB", "lange": "PROPN", "moretti": "PROPN", "trimester": "NOUN", "dysfunction": "NOUN", "entertainment": "NOUN", "'07": "NUM", "tattoos": "NOUN", "hawkish": "ADJ", "partner": "NOUN", "donations": "NOUN", "monumental": "ADJ", "convience": "NOUN", "complete": "ADJ", "kcna": "PROPN", "nemec": "PROPN", "workday": "NOUN", "978": "NUM", "1590": "NUM", "ahead": "ADV", "freaky": "ADJ", "few": "ADJ", "comfty": "ADJ", "jared": "PROPN", "unbeaten": "ADJ", "naqsh-e": "PROPN", "universities": "NOUN", "profanity": "NOUN", "privileged": "ADJ", "forger": "NOUN", "maeena": "PROPN", "purple-faced": "ADJ", "non-fixed": "ADJ", "half-dressed": "VERB", "overfed": "ADJ", "08:58": "NUM", "auerbach": "PROPN", "cinnamon": "NOUN", "campaigns": "NOUN", "credentials": "NOUN", "salama": "PROPN", "cheating": "NOUN", "f*ed": "VERB", "constraint": "NOUN", "sponsored": "VERB", "moaning": "VERB", "keeper": "NOUN", "underwear": "NOUN", "ambiance": "NOUN", "qapu": "PROPN", "midterms": "NOUN", "crawfish": "NOUN", "recruitment": "NOUN", "sociodemographic": "ADJ", "bounce": "NOUN", "thrashed": "VERB", "dial": "VERB", "ambulance": "NOUN", "#descriptive": "PROPN", "quo": "NOUN", "detailing": "VERB", "happening": "VERB", "pagan": "ADJ", "monroe": "PROPN", "scattered": "VERB", "pin-heads": "NOUN", "holdings": "NOUN", "functions": "NOUN", "deserve": "VERB", "grecian": "ADJ", "over-rated": "ADJ", "becouse": "SCONJ", "dpr": "NOUN", "françois": "PROPN", "encompass": "VERB", "disaster": "NOUN", "bolivar": "ADJ", "atlanta": "PROPN", "types": "NOUN", "financials": "NOUN", "battered": "VERB", "constructive": "ADJ", "surname": "NOUN", "mahatma": "PROPN", "theoretical": "ADJ", "an": "DET", "kickstarter": "PROPN", "ear": "NOUN", "sarcastic": "ADJ", "nato": "PROPN", "tree": "NOUN", "sea-reach": "NOUN", "uncredited": "ADJ", "staves": "NOUN", "ressam": "PROPN", "attended": "VERB", "difficult": "ADJ", "inhaling": "NOUN", "guaranteed": "VERB", "breathed": "VERB", "seat": "NOUN", "teething": "VERB", "manufacture": "VERB", "gentleman": "NOUN", "shorn": "VERB", "tiny": "ADJ", "himself": "PRON", "lawrence": "PROPN", "sides": "NOUN", "brickell": "PROPN", "built": "VERB", "skillsets": "NOUN", "barclays": "PROPN", "claiming": "VERB", "co-star": "NOUN", "yams": "NOUN", "elaborately": "ADV", "cheque": "NOUN", "pursed": "VERB", "vet": "NOUN", "frustration": "NOUN", "musculature": "NOUN", "vm": "PROPN", "profit": "NOUN", "unfortunately": "ADV", "saintly": "ADJ", "cabins": "NOUN", "moor": "NOUN", "275": "NUM", "customs": "NOUN", "holder": "NOUN", "water-men": "NOUN", "exper-": "VERB", "1963": "NUM", "unbearable": "ADJ", "classics": "NOUN", "08:30": "NUM", "menzies": "PROPN", "anchored": "VERB", "rouse": "PROPN", "tearful": "ADJ", "less": "ADV", "800/711-8000": "NUM", "hour": "NOUN", "judgments": "NOUN", "pseudonym": "NOUN", "hadid": "PROPN", "casper": "PROPN", "mooring": "NOUN", "revolted": "VERB", "handful": "NOUN", "emancipate": "VERB", "620-294-1909": "NUM", "...............": "PUNCT", "tackling": "VERB", "warms": "VERB", "securing": "VERB", "pages": "NOUN", "gaul": "PROPN", "manzano": "PROPN", "devastating": "ADJ", "carries": "VERB", "investors": "NOUN", "medal": "NOUN", "replacement": "NOUN", "intuitively": "ADV", "merest": "ADJ", "varanasi": "PROPN", "sorting": "VERB", "who": "PRON", "mega": "NOUN", "bread": "NOUN", "dairy": "NOUN", "pranks": "NOUN", "branco": "PROPN", "glut": "NOUN", "reviews": "NOUN", "calories": "NOUN", "develop": "VERB", "islamists": "NOUN", "strangers": "NOUN", "definately": "ADV", "reins": "NOUN", "seaports": "NOUN", "gram": "PROPN", "stipes": "NOUN", "certificates": "NOUN", "moscow": "PROPN", "pollutant": "NOUN", "kwong": "PROPN", "05": "NUM", "wazed": "PROPN", "videotape": "NOUN", "communistic": "ADJ", "ami": "PROPN", "early": "ADJ", "ale": "NOUN", "wax": "NOUN", "outlet": "NOUN", "chords": "NOUN", "cobbled": "ADJ", "spare": "ADJ", "column": "NOUN", "bn": "NUM", "stalled": "VERB", "sny": "PROPN", "warmer": "ADJ", "ballerina": "NOUN", "comforting": "ADJ", "incompatible": "ADJ", "party": "NOUN", "noises": "NOUN", "vaccine": "NOUN", "disposed": "VERB", "opinons": "NOUN", "schonwetter": "PROPN", "exporters": "NOUN", "fla.": "PROPN", "petrol": "NOUN", "rode": "VERB", "honored": "ADJ", "probation": "NOUN", "speeches": "NOUN", "winks": "NOUN", "pondered": "VERB", "discovers": "VERB", "datos": "PROPN", "headboard": "NOUN", "crows": "NOUN", "overpriced": "ADJ", "altoona": "PROPN", "hairstyling": "NOUN", "gangster": "NOUN", "twencen": "PROPN", "servings": "NOUN", "delicacy": "NOUN", "mousse": "NOUN", "anyhow": "ADV", "regarded": "VERB", "immortals": "PROPN", "pre-arrest": "ADJ", "buddhists": "PROPN", "burp": "NOUN", "perez": "PROPN", "receive": "VERB", "maintenance": "NOUN", "1550": "NUM", "1694": "NUM", "willis": "PROPN", "suzanne": "PROPN", "tumor": "NOUN", "revved": "VERB", "subjective": "ADJ", "northumberland": "PROPN", "educational": "ADJ", "enthusiasm": "NOUN", "solas": "PROPN", "areas": "NOUN", "interior": "ADJ", "frank": "PROPN", "drollery": "NOUN", "reservoirs": "NOUN", "linguists": "NOUN", "yell": "VERB", "jupiter": "PROPN", "holofernes": "PROPN", "uncultured": "ADJ", "misinform": "VERB", "acuity": "NOUN", "cute": "ADJ", "absorbing": "VERB", "reproduction": "NOUN", "sleeping": "VERB", "minicab": "NOUN", "flirty": "ADJ", "methodological": "ADJ", "stowed": "VERB", "punchlines": "NOUN", "sadistically": "ADV", "insect": "NOUN", "online?u=mayursha&m=g&t=1": "PROPN", "bicycling": "NOUN", "greetings": "NOUN", "flourish": "VERB", "aberdeenshire": "PROPN", "elaborate": "ADJ", "regulation": "NOUN", "yorkshire": "PROPN", "spellbooks": "NOUN", "rooftops": "NOUN", "suny": "PROPN", "murasaki": "PROPN", "renting": "VERB", "storefront": "NOUN", "herbalist": "NOUN", "signifcant": "ADJ", "sinica": "PROPN", "protests": "NOUN", "burner": "NOUN", "yiu": "PROPN", "titman": "PROPN", "cravings": "NOUN", "dying": "VERB", "emigrate": "VERB", "siberia": "PROPN", "#44": "NUM", "limitless": "ADJ", "gourmet": "NOUN", "wallen": "PROPN", "lurks": "VERB", "narrow": "ADJ", "pamphlet": "NOUN", "updo": "NOUN", "coronavirus": "NOUN", "rhodesian": "ADJ", "bowlders": "NOUN", "techniques": "NOUN", "hull": "NOUN", "ot": "PART", "freighters": "NOUN", "butter": "NOUN", "cdec": "PROPN", "nasty": "ADJ", "mackinaw": "PROPN", "vlogs": "NOUN", "complementary": "ADJ", "medalled": "ADJ", "sweeping": "VERB", "théâtre": "PROPN", "grrrrrrr": "INTJ", "mysterys": "NOUN", "circus": "PROPN", "granger": "PROPN", "background": "NOUN", "offsetting": "VERB", "pawing": "VERB", "deng": "PROPN", "transparency": "NOUN", "outcast": "ADJ", "snoozing": "VERB", "ancient": "ADJ", "hubble": "PROPN", "nerf": "NOUN", "enlarge": "VERB", "sinners": "PROPN", "rush": "VERB", "chased": "VERB", "follow": "VERB", "vividly": "ADV", "529999420000": "NUM", "elegant": "ADJ", "bitmaps": "NOUN", "confines": "NOUN", "skirmish": "NOUN", "premonition": "NOUN", "officers": "NOUN", "nightmare": "NOUN", "dat": "DET", "enpower": "PROPN", "consequences": "NOUN", "510-642-5145": "NUM", "curr": "PROPN", "pritzker": "PROPN", "transactional": "ADJ", "prices": "NOUN", "remodel": "NOUN", "crackdown": "NOUN", "valiant": "ADJ", "acknowledge": "VERB", "herself": "PRON", "variability": "NOUN", "islamism": "PROPN", "create": "VERB", "admiral": "ADJ", "stravinsky": "PROPN", "kosher": "ADJ", "aww": "INTJ", "kant": "PROPN", "empirical": "ADJ", "01:00:51": "NUM", "sha'ananim": "PROPN", "nk": "PROPN", "pretend": "VERB", "cooper": "PROPN", "shark": "NOUN", "rectangle": "NOUN", "disjoint": "ADJ", "youngsters": "NOUN", "algonquin": "PROPN", "validate": "VERB", "thrilling": "VERB", "perfumed": "ADJ", "starbucks": "PROPN", "venue": "NOUN", "pottstown": "PROPN", "shut": "VERB", "dec": "PROPN", "chances": "NOUN", "investment": "NOUN", "antipasti": "NOUN", "sec.": "NOUN", "humanists": "NOUN", "translated": "VERB", "photographs": "NOUN", "rockers": "PROPN", "drake": "PROPN", "7:30": "NUM", "taikoo": "PROPN", "you": "PRON", "burns": "NOUN", "atomic": "ADJ", "insider": "NOUN", "strangle": "VERB", "$ervice": "NOUN", "biblically": "ADV", "archaeological": "ADJ", "imaginary": "ADJ", "benjamin": "PROPN", "huber": "PROPN", "25.00": "NUM", "curating": "VERB", "mingo": "PROPN", "theories": "NOUN", "quebec": "PROPN", "infernale": "PROPN", "biasing": "VERB", "reconsider": "VERB", "coordinator": "NOUN", "frustrated": "ADJ", "prabhakaran": "PROPN", "islets": "NOUN", "shanlyn": "PROPN", "quantitatively": "ADV", "tranekær": "PROPN", "arabian": "ADJ", "marginalized": "VERB", "yvette": "PROPN", "scream": "NOUN", "ohm": "PROPN", "gardens": "NOUN", "dad": "NOUN", "rewards": "NOUN", "http://www.chernobyl.org.uk/page2.htm": "PROPN", "effectiveness": "NOUN", "inhabiting": "VERB", "god": "PROPN", "greeted": "VERB", "eaton": "PROPN", "tanins": "NOUN", "possessed": "VERB", "herat": "PROPN", "avenging": "ADJ", "caffeine": "NOUN", "rocca": "PROPN", "steakhouse": "NOUN", "starred": "VERB", "harris": "PROPN", "byrne": "PROPN", "handling": "VERB", "diagrams": "NOUN", "baggage": "NOUN", "speaker": "NOUN", "conceded": "VERB", "hiller": "PROPN", "tragically": "ADV", "desire": "NOUN", "menger": "PROPN", "wealth": "NOUN", "80119": "NUM", "relinquished": "VERB", "lorne": "PROPN", "reimbursable": "ADJ", "sniffing": "VERB", "spoil": "VERB", "erratic": "ADJ", "shades": "NOUN", "glazed": "VERB", "shafts": "NOUN", "cramp": "NOUN", "mississippi": "PROPN", "hoarier": "ADJ", "543": "NUM", "gratton": "PROPN", "lifting": "VERB", "hilltop": "NOUN", "fragment": "NOUN", "90th": "ADJ", "undervalued": "VERB", "felicity": "NOUN", "western": "ADJ", "rafael": "PROPN", "daniela": "PROPN", "depart": "VERB", "mayors": "NOUN", "eve": "PROPN", "nance": "PROPN", "unreliable": "ADJ", "turano": "PROPN", "physiotherapists": "NOUN", "illegally": "ADV", "tweeted": "VERB", "disarmament": "NOUN", "dependency": "NOUN", "cérebro": "PROPN", "charges": "NOUN", "stoa": "PROPN", "predicts": "VERB", "closer": "ADJ", "box-like": "ADJ", "activate": "VERB", "jones": "PROPN", "aspects": "NOUN", "arrest": "NOUN", "40,500": "NUM", "vets": "NOUN", "stratosphere": "NOUN", "folks": "NOUN", "bouts": "NOUN", "assignments": "NOUN", "submits": "VERB", "professionally": "ADV", "modalities": "NOUN", "confiscated": "VERB", "cockpits": "NOUN", "pakistani": "ADJ", "express": "VERB", "squawking": "VERB", "canadians": "PROPN", "welcome": "INTJ", "connotations": "NOUN", "deprecating": "ADJ", "tobias": "PROPN", "carolina": "PROPN", "diseases": "NOUN", "ornamented": "VERB", "oath": "NOUN", "pince-nez": "NOUN", "explosives": "NOUN", "comics": "NOUN", "doctrine": "NOUN", "gratification": "PROPN", "communicate": "VERB", "libyan": "ADJ", "55": "NUM", "mush": "NOUN", "1542": "NUM", "kay": "PROPN", "borrow": "VERB", "staggering": "ADJ", "timid": "ADJ", "experimental": "ADJ", "08:38": "NUM", "mangers": "NOUN", "needlework": "NOUN", "gals": "NOUN", "effacing": "VERB", "misanthropy": "NOUN", "subfolders": "NOUN", "agatha": "PROPN", "gish": "PROPN", "european": "ADJ", "bent": "VERB", "motorways": "NOUN", "wee": "ADJ", "gehenna": "PROPN", "amusing": "ADJ", "mobilised": "VERB", "1087": "NUM", "stutenberg": "PROPN", "shops": "NOUN", "evolving": "VERB", "berry": "PROPN", "ally": "NOUN", "accomplishments": "NOUN", "p.s.": "NOUN", "16.4": "NUM", "gotten": "VERB", "hom": "PROPN", "fulltime": "ADV", "flickered": "VERB", "immunity": "NOUN", "rather": "ADV", "1580": "NUM", "18th": "ADJ", "infuse": "VERB", "runner": "NOUN", "senegal": "PROPN", "4.319": "NUM", "mwh": "NOUN", "input": "NOUN", "topological": "ADJ", "glanced": "VERB", "enrichment": "NOUN", "sitara": "PROPN", "neurobiology": "NOUN", "broker": "NOUN", "subsume": "VERB", "hazard": "PROPN", "rectified": "VERB", "macbook": "PROPN", "alternations": "NOUN", "horn": "NOUN", "http://www.equinecaninefeline.com/catalog/abode-large-metal-cage-liberta-free-delivery-p-6679.html": "PROPN", "peregrinate": "ADJ", "son": "NOUN", "taipei": "PROPN", "===>": "PUNCT", "cabernet": "PROPN", "tablespoon": "NOUN", "passage": "NOUN", "1711": "NUM", "livingston": "PROPN", "separates": "VERB", "army": "NOUN", "explains": "VERB", "despairingly": "ADV", "milk": "NOUN", "assaulted": "VERB", "physician": "NOUN", "testify": "VERB", "behari": "PROPN", "attached": "VERB", "buzzers": "NOUN", "stelle": "PROPN", "undermines": "VERB", "drawer": "NOUN", "gawker.com": "PROPN", "excuses": "NOUN", "note": "NOUN", "freakin": "ADJ", "poet": "NOUN", "fought": "VERB", "yampa": "PROPN", "boswell": "PROPN", "31": "NUM", "counter": "NOUN", "viking": "PROPN", "graffitied": "ADJ", "profilers": "NOUN", "enviroment": "NOUN", "butt": "NOUN", "merchants": "NOUN", "willie": "PROPN", "gardened": "VERB", "assuming": "VERB", "montejo": "PROPN", "scot": "PROPN", "imperfections": "NOUN", "tripadvisor": "PROPN", "ingesting": "VERB", "armadilla": "NOUN", "equalise": "VERB", "franchise": "NOUN", "http://en.wikipedia.org/wiki/bullfighting": "PROPN", "thicker": "ADJ", "mentoring": "NOUN", "resist": "VERB", "negotiating": "VERB", "na-na-na-na-za-ba-da": "INTJ", "provided": "VERB", "sacking": "NOUN", "pubs": "NOUN", "rat": "NOUN", "gets": "VERB", "01:32:35": "NUM", "mohandas": "PROPN", "gnawed": "VERB", "unruffled": "ADJ", "naturalism": "NOUN", "rug": "NOUN", "bathroom": "NOUN", "sporadically": "ADV", "suffers": "VERB", "starry": "PROPN", "economist": "PROPN", "unable": "ADJ", "evictees": "NOUN", "bw": "PROPN", "1,200": "NUM", "congregation": "NOUN", "for": "ADP", "baseball": "NOUN", "fraud": "NOUN", "publisher": "NOUN", "subcontinent": "NOUN", "promulgate": "VERB", "fernley": "PROPN", "appetite": "NOUN", "2075": "NUM", "oozes": "VERB", "chlorination": "NOUN", "footer": "NOUN", "hint": "NOUN", "hangman": "NOUN", "bombers": "NOUN", "coax": "VERB", "re-invest": "VERB", "wyatt": "PROPN", "furnaces": "NOUN", "comp": "NOUN", "tu": "PROPN", "glancing": "VERB", "portents": "NOUN", "mohawk": "PROPN", "->": "SYM", "adventurous": "ADJ", "norma": "PROPN", "mutilated": "VERB", "sunny": "ADJ", "tax-gatherer": "NOUN", "----------------------------------------------------------------------": "PUNCT", "fest": "PROPN", "eee": "INTJ", "trains": "NOUN", "imprisonment": "NOUN", "nerves": "NOUN", "toasted": "ADJ", "invincible": "ADJ", "luminescence": "NOUN", "lied": "VERB", "batch": "NOUN", "aways": "NOUN", "dancewear": "NOUN", "6": "NUM", "diarrhea": "NOUN", "seals": "NOUN", "hectic": "ADJ", "fortunate": "ADJ", "u.c.": "PROPN", "vergil": "PROPN", "pollutes": "VERB", "dysentery": "NOUN", "businesses": "NOUN", "faq": "NOUN", "m5j": "NOUN", "alterations": "NOUN", "en": "ADP", "bills": "NOUN", "infrastructure": "NOUN", "armature": "NOUN", "cathedral": "NOUN", "anew": "ADV", "filth": "NOUN", "aegean": "PROPN", "0590920648": "NUM", "browsing": "VERB", "recreating": "VERB", "europass": "PROPN", "lv": "PROPN", "screening": "VERB", "permits": "VERB", "respond": "VERB", "seams": "NOUN", "apart": "ADV", "whosoever": "PRON", "virtuous": "ADJ", "adjusts": "VERB", "prequel": "NOUN", "guthrie": "PROPN", "envelop": "VERB", "outnumber": "VERB", "arrogance": "NOUN", "coronas": "PROPN", "equivalents": "NOUN", "suffered": "VERB", "fourth": "ADJ", "3-5297": "NUM", "goo": "NOUN", "secretive": "ADJ", "oija": "PROPN", "incredibly": "ADV", "obstructions": "NOUN", "croke": "PROPN", "arya": "PROPN", "dictators": "NOUN", "discretionary": "ADJ", "pictured": "VERB", "non-stop": "ADV", "s.a.": "PROPN", "ashes": "NOUN", "fully": "ADV", "implementation": "NOUN", "emits": "VERB", "logical": "ADJ", "tollis": "PROPN", "collingswood": "PROPN", "chatterbox": "NOUN", "witnessing": "VERB", "our": "PRON", "incarcerated": "ADJ", "130": "NUM", "prosecution": "NOUN", "questar": "PROPN", "affecting": "VERB", "lodge": "PROPN", "residents": "NOUN", "klenk": "PROPN", "8:15": "NUM", "fullness": "NOUN", "stays": "NOUN", "kabul": "PROPN", "online": "ADJ", "pretty": "ADV", "glory": "NOUN", "tele": "NOUN", "m62": "PROPN", "comprising": "VERB", "healthcare": "NOUN", "dais": "NOUN", "prospects": "NOUN", "yemen": "PROPN", "scrumptious": "ADJ", "!!!!!!!": "PUNCT", "nightclub": "NOUN", "hiding": "VERB", "isolated": "VERB", "aesthetic": "ADJ", "prediction": "NOUN", "cnrs": "PROPN", "carve": "VERB", "first-class": "ADJ", "jaw": "NOUN", "fantastic": "ADJ", "sensor": "NOUN", "possibility": "NOUN", "untrained": "ADJ", "pending": "VERB", "730": "NUM", "alive": "ADJ", "sayings": "NOUN", "tapping": "VERB", "societal": "ADJ", "subcontractor": "NOUN", "participation": "NOUN", "repition": "NOUN", "nwsc": "PROPN", "babinos": "NOUN", "mysticism": "NOUN", "todd": "PROPN", "discover": "VERB", "fleet": "NOUN", "excellence": "NOUN", "playground": "NOUN", "specific": "ADJ", "decoding": "NOUN", "interstellar": "ADJ", "cash": "NOUN", "pierce": "VERB", "cheat": "VERB", "remedies": "NOUN", "meet": "VERB", "death-knell": "NOUN", "screws": "NOUN", "hall": "NOUN", "http://www.wikihow.com/wikihow:statistics": "PROPN", "pursued": "VERB", "temper": "NOUN", "julfa": "PROPN", "wildlife": "NOUN", "settle": "VERB", "kim": "PROPN", "rideable": "ADJ", "acutely": "ADV", "kayani": "PROPN", "#kairos": "PROPN", "thoroughly": "ADV", "element": "NOUN", "beavers": "NOUN", "protocol": "NOUN", "cook": "VERB", "santorum": "PROPN", "picketing": "NOUN", "seasons": "NOUN", "hope": "VERB", "ecu": "NOUN", "valdiviesco": "PROPN", "dealt": "VERB", "charlatans": "NOUN", "meditation": "NOUN", "failures": "NOUN", "offer": "VERB", "doltish": "ADJ", "robes": "NOUN", "burned": "VERB", "proposition": "NOUN", "clang": "NOUN", "righter": "PROPN", "brazil": "PROPN", "fated": "ADJ", "shia": "PROPN", "dispatched": "VERB", "orthodox": "ADJ", "delightful": "ADJ", "fiance": "NOUN", "consumers": "NOUN", "intifada": "NOUN", "neo-nazi": "ADJ", "tumbled": "VERB", "m-mm": "INTJ", "fauna": "NOUN", "95,000": "NUM", "nominated": "VERB", "reconciliation": "NOUN", "errands": "NOUN", "peculiarly": "ADV", "saddle": "NOUN", "exposure": "NOUN", "egypt": "PROPN", "essentials": "NOUN", "scholars": "NOUN", "arab": "ADJ", "phoneering": "NOUN", "increments": "NOUN", "bow-ties": "NOUN", "sweated": "VERB", "evoke": "VERB", "realism": "NOUN", "ignoring": "VERB", "screened": "VERB", "announcing": "VERB", "advert": "NOUN", "giggled": "VERB", "nights": "NOUN", "pao": "NOUN", "furniture": "NOUN", "petshoppe": "NOUN", "rampant": "ADJ", "damaging": "ADJ", "salespeople": "NOUN", "counters": "NOUN", "snowstorm": "NOUN", "rescheduling": "VERB", "lexicography": "NOUN", "ferrari": "PROPN", "documented": "VERB", "albums": "NOUN", "documents": "NOUN", "peritonitis": "NOUN", "revising": "VERB", "mesoamerican": "ADJ", "minimunm": "NOUN", "hurling": "VERB", "meen": "PROPN", "ellison": "PROPN", "unspeakably": "ADV", "prolly": "ADV", "panicked": "ADJ", "waiting": "VERB", "new": "ADJ", "whistleblowing": "NOUN", "addressing": "VERB", "burckhardt": "PROPN", "asthma": "NOUN", "touchstones": "NOUN", "employed": "VERB", "interview": "NOUN", "increased": "VERB", "squeege": "PROPN", "turgenev": "PROPN", "netting": "NOUN", "into": "ADP", "realer": "ADJ", "irreconcilable": "ADJ", "lɑ̃fɑ̃": "PROPN", "5.37": "NUM", "fedexed": "VERB", "morgan": "PROPN", "successor": "NOUN", "biomed": "PROPN", "graduated": "VERB", "www.weathereffects.com": "PROPN", "penne": "NOUN", "sunflower": "NOUN", "skylab": "PROPN", "alt.animals.ethics.vegetarian": "NOUN", "probe": "NOUN", "relationship": "NOUN", "night-owl": "NOUN", "gout": "NOUN", "hbo": "PROPN", "nomination": "NOUN", "crra": "PROPN", "mcdermott": "PROPN", "girlfriend": "NOUN", "kivu": "PROPN", "impulses": "NOUN", "linguistics": "NOUN", "rapidly": "ADV", "winckelmann": "PROPN", "venezuelan": "ADJ", "trembling": "VERB", "slovakia": "PROPN", "swept": "VERB", "lynda": "PROPN", "enchiladas": "NOUN", "medals": "NOUN", "malformed": "ADJ", "aversion": "NOUN", "volatilities": "NOUN", "entitlement": "NOUN", "affair": "NOUN", "http://3.bp.blogspot.com/-x_e2uwt6wpw/tkj_7uvtw6i/aaaaaaaaags/e_hicadypyi/s1600/lotte_world_from_high_up.jpg": "PROPN", "http://www.railroadredux.com/tag/northwest-shortline/": "PROPN", "detoured": "VERB", "flashing": "VERB", "covey": "PROPN", "supportive": "ADJ", "tasted": "VERB", "pragmatic": "ADJ", "eva": "PROPN", "chorus": "PROPN", "back-to-nature": "NOUN", "conviction": "NOUN", "buoys": "NOUN", "yoke": "NOUN", "disability": "NOUN", "maximized": "VERB", "priest": "NOUN", "typos": "NOUN", "sinhala": "ADJ", "webcomic": "NOUN", "853-7557": "NUM", "over-prescriptive": "ADJ", "quietness": "NOUN", "elia": "PROPN", "righty": "NOUN", "hammer": "NOUN", "inability": "NOUN", "beautifully": "ADV", "wails": "VERB", "shrouded": "VERB", "corel": "PROPN", "depictions": "NOUN", "ebic": "PROPN", "vapour": "NOUN", "anti-american": "ADJ", "royally": "ADV", "acia": "PROPN", "browncover": "NOUN", "pouring": "VERB", "put-on": "NOUN", "errors": "NOUN", "enquiries": "NOUN", "downward": "ADV", "stalk": "NOUN", "transcendence": "NOUN", "head": "NOUN", "luncheonette": "NOUN", "jesse": "PROPN", "12:30": "NUM", "reconnaissance": "NOUN", "brandeis": "PROPN", "fecal": "ADJ", "warwick": "PROPN", "subparagraph": "NOUN", "bolt": "ADV", "825": "NUM", "return": "VERB", "jungles": "NOUN", "frying": "ADJ", "yankee": "PROPN", "philosophical": "ADJ", "jesus": "PROPN", "whatsoever": "ADV", "microwaved": "VERB", "reservoir": "NOUN", "beneath": "ADP", "veins": "NOUN", "wan": "VERB", "fiasco": "NOUN", "interferes": "VERB", "abramoff": "PROPN", "thwarted": "VERB", "potable": "ADJ", "!!!!!!!!!!!!!!!": "PUNCT", "painewebber": "PROPN", "ect": "PROPN", "assumption": "NOUN", "deduction": "NOUN", "refusing": "VERB", "11:08": "NUM", "fahrenheit": "PROPN", "wires": "NOUN", "actual": "ADJ", "aldrich": "PROPN", "collisions": "NOUN", "subsequent": "ADJ", "intranet": "NOUN", "balaclava": "NOUN", "col": "NOUN", "gillette": "PROPN", "cautious": "ADJ", "maulana": "PROPN", "skiing": "ADJ", "traced": "VERB", "prune": "VERB", "{": "PUNCT", "09:48": "NUM", "gaze": "VERB", "broiled": "VERB", "founder": "NOUN", "toothache": "NOUN", "blond": "ADJ", "pushed": "VERB", "switzerland": "PROPN", "currently": "ADV", "israelis": "NOUN", "noticeably": "ADV", "astronomers": "NOUN", "$ome": "DET", "amman": "PROPN", "nosedive": "NOUN", "yrs.": "NOUN", "pixies": "NOUN", "diety": "NOUN", "introductions": "NOUN", "tong": "PROPN", "thereabouts": "ADV", "vikings": "PROPN", "chambermaid": "NOUN", "icon": "NOUN", "worthy": "ADJ", "committments": "NOUN", "profoundly": "ADV", "wasp": "NOUN", "reaffirms": "VERB", "selectively": "ADV", "german": "ADJ", "launch": "NOUN", "occasional": "ADJ", "dependant": "ADJ", "gold": "NOUN", "sun-dial": "NOUN", "mats": "NOUN", "einstein": "PROPN", "edging": "VERB", "purse": "NOUN", "angostura": "PROPN", "jihadi": "ADJ", "disembarking": "ADJ", "meaningful": "ADJ", "4a": "PROPN", "ribs": "NOUN", "stephanie": "PROPN", "rings": "NOUN", "talbot": "PROPN", "commitments": "NOUN", "inseparable": "ADJ", "countrymen": "NOUN", "strategies": "NOUN", "01/25/2001": "NUM", "swayed": "VERB", "backup": "NOUN", "lotf": "PROPN", "#writinglife": "PROPN", "arrived": "VERB", "rites": "NOUN", "inhalable": "ADJ", "hershey": "PROPN", "go's": "NOUN", "pacheco": "PROPN", "serrated": "VERB", "a.": "PROPN", "stiglitz": "PROPN", "governed": "VERB", "asiaweek": "PROPN", "irritable": "ADJ", "itching": "NOUN", "391,000": "NUM", "conclave": "NOUN", "esfahan": "PROPN", "ltd": "PROPN", "jerks": "NOUN", "blindman": "NOUN", "nt": "PART", "whoever": "PRON", "gotschal": "PROPN", "youngblood": "PROPN", "hay-carts": "NOUN", "unit": "NOUN", "sectors": "NOUN", "lable": "NOUN", "def": "ADV", "obina": "PROPN", "wed": "VERB", "babalon": "PROPN", "philologists": "NOUN", "acrylic": "ADJ", "minted": "VERB", "duke": "PROPN", "procedural": "ADJ", "record": "NOUN", "session": "NOUN", "cra.org/resources/taulbee-survey": "PROPN", "quaint": "ADJ", "c4-0497/98-98/0126": "NUM", "lyons": "PROPN", "75th": "ADJ", "asians": "PROPN", "02:18": "NUM", "them": "PRON", "cherries": "NOUN", "wizard": "NOUN", "dig": "VERB", "assist": "VERB", "websites": "NOUN", "allowedits": "NOUN", "showroom": "NOUN", "slamming": "VERB", "sugarbowl": "PROPN", "monaco": "PROPN", "chimneys": "NOUN", "astronauts": "NOUN", "antony": "PROPN", "schooling": "NOUN", "petty": "ADJ", "rectify": "VERB", "everything": "PRON", "volleyball": "NOUN", "gibraltar": "PROPN", "flyer": "NOUN", "streak": "NOUN", "ibn": "PROPN", "particularly": "ADV", "entreaty": "NOUN", "sneeze": "VERB", "blond-haired": "ADJ", "endeavor": "NOUN", "stendhal": "PROPN", "70.85": "NUM", "lingering": "ADJ", "caper": "NOUN", "suppleness": "NOUN", "duress": "NOUN", "descent": "NOUN", "althea": "PROPN", "edwards": "PROPN", "inflammatory": "ADJ", "sidelocks": "NOUN", "automated": "ADJ", "yahoos": "NOUN", "hehehe": "INTJ", "junction": "NOUN", "1998": "NUM", "wheeler": "PROPN", "friendlier": "ADJ", "fodder": "NOUN", "shop-cum-post-office": "NOUN", "@ryan": "PROPN", "13011": "NUM", "exhibited": "VERB", "redesigning": "VERB", "evolves": "VERB", "basil": "NOUN", "insurgency": "NOUN", "intending": "VERB", ">>": "PUNCT", "copyrights": "NOUN", "basics": "NOUN", "neuroscience": "NOUN", "sanzio": "PROPN", "drilled": "VERB", "envision": "VERB", "awsat": "PROPN", "slower": "ADJ", "flexible": "ADJ", "consultation": "PROPN", "pariah": "NOUN", "dudes": "NOUN", "pyjama": "NOUN", "bagels": "NOUN", "hockey": "NOUN", "drip": "NOUN", "pans": "NOUN", "schott": "PROPN", "xferring": "VERB", "accompanied": "VERB", "snobbery": "NOUN", "ffff": "PROPN", "amplified": "VERB", "600-480": "NUM", "practitioners": "NOUN", "heading": "VERB", "undersung": "ADJ", "organized": "VERB", "superpower": "NOUN", "heightened": "VERB", "hakim": "PROPN", "unfathomable": "ADJ", "fixeded": "VERB", "clambake": "PROPN", "paragraphs": "NOUN", "parameters": "NOUN", "drumsticks": "NOUN", "++++": "SYM", "5.2": "NUM", "vibrant": "ADJ", "deposition": "NOUN", "liu": "PROPN", "1954": "NUM", "sprinkle": "VERB", "hampered": "VERB", "rep.": "PROPN", "vocals": "NOUN", "learnt": "VERB", "healed": "ADJ", "stanza": "NOUN", "chauvinisms": "NOUN", "facilitate": "VERB", "rank": "NOUN", "adorns": "VERB", "articles": "NOUN", "appropriation": "NOUN", "i.e": "ADV", "fare": "NOUN", "wedding": "NOUN", "42": "NUM", "brainwash": "VERB", "humble": "ADJ", "eyewitness": "NOUN", "contains": "VERB", "status": "NOUN", "ideal": "ADJ", "regionally": "ADV", "buis": "PROPN", "http://www.cic.gc.ca/english/immigrate/index.asp": "PROPN", "grf": "NOUN", "verb": "NOUN", "luján": "PROPN", "monetized": "VERB", "oclock": "NOUN", "dempsey": "NOUN", "minus": "CCONJ", "sheikhs": "NOUN", "slapping": "VERB", "mexicans": "PROPN", "format": "NOUN", "pre-existing": "VERB", "inflation": "NOUN", "raleigh": "PROPN", "ra": "PROPN", "borne": "VERB", "uphold": "VERB", "wispy": "ADJ", "pumps": "VERB", "cultivating": "VERB", "xv": "NUM", "donned": "VERB", "babington": "PROPN", "updated": "VERB", "shuffled": "VERB", "player": "NOUN", "dissatisfied": "ADJ", "dominos": "PROPN", "agents": "NOUN", "gift": "NOUN", "quetzalcoatl": "PROPN", "kayak": "NOUN", "siri": "PROPN", "listened": "VERB", "myths": "NOUN", "accidents": "NOUN", "forests": "NOUN", "aberdeen": "PROPN", "wase": "AUX", "armatures": "NOUN", "thyme": "NOUN", "undermine": "VERB", "transition": "NOUN", "thirdly": "ADV", "iii": "NUM", "gyroscope": "NOUN", "tub": "PROPN", "slept": "VERB", "neat": "ADJ", "congrats": "NOUN", "breakneck": "ADJ", "legal": "ADJ", "suv": "NOUN", "harem": "NOUN", "debtors": "NOUN", "below": "ADV", "anwar": "PROPN", "employment": "NOUN", "uncrowded": "ADJ", "guitarist": "NOUN", "develope": "VERB", "underestimate": "VERB", "forgave": "VERB", "reconciling": "NOUN", "interim": "ADJ", ".:": "PUNCT", "smackers": "NOUN", "s/he": "PRON", "michel": "PROPN", "theaters": "NOUN", "table": "NOUN", "spacefaring": "ADJ", "referred": "VERB", "wnba": "PROPN", "airway": "NOUN", "responsiveness": "NOUN", "1908": "NUM", "chlorine": "NOUN", "brighter": "ADJ", "culturally": "ADV", "cdt": "PROPN", "rogue": "NOUN", "heads": "NOUN", "headmaster": "NOUN", "inception": "NOUN", "testosterone": "NOUN", "zeros": "NOUN", "bows": "NOUN", "12:00": "NUM", "fishermen": "NOUN", "surprised": "VERB", "darfur": "PROPN", "sodomise": "VERB", "dismantle": "VERB", "fleeting": "ADJ", "viewed": "VERB", "previews": "NOUN" } }, "patches": [ { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "DET" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "VERB" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "AUX" } } }, { "from": "PART", "to": "ADP", "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PROPN" } } }, { "from": "PART", "to": "ADP", "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PRON" } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "there" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "PRON" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "PART" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PRON" } } } } }, { "from": "VERB", "to": "AUX", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "have" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "AUX" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "had" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "DET" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "VERB" } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "do" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "PART" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "this" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PUNCT" } } } } }, { "from": "VERB", "to": "AUX", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "have" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "VERB" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADV" } } } } }, { "from": "PRON", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "there" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PUNCT" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "DET" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "has" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "DET" } } } } }, { "from": "PRON", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "NOUN" } } } } }, { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADJ" } } } } }, { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "NUM" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "DET" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PRON" } } } } }, { "from": "NUM", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "DET" } } } } }, { "from": "ADP", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PART" } } } } }, { "from": "ADV", "to": "ADJ", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "NOUN" } } }, { "from": "ADV", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "more" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "NOUN" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "do" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "AUX" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "SCONJ" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "as" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADJ" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "had" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "NOUN" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "this" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADP" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "about" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "NUM" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "of" } }, "b": { "WordIsTaggedWith": { "relative": 0, "is_tagged": "SCONJ" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "PUNCT" } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "DET" } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "PRON" } } } } }, { "from": "SCONJ", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "NOUN" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "NOUN" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "PUNCT" } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PUNCT" } } } } }, { "from": "SCONJ", "to": "ADV", "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PUNCT" } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "AUX" } } }, { "from": "ADP", "to": "INTJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PUNCT", "post_word_tagged": "PUNCT" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "PRON" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADV", "post_word_tagged": "DET" } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } }, { "from": "NUM", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "AUX" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "SCONJ" } } } } }, { "from": "AUX", "to": "NOUN", "criteria": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "NUM" } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "PRON" } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "AUX" } } } } }, { "from": "ADJ", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "AUX" } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "VERB" } } } } }, { "from": "ADV", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "DET" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "CCONJ", "post_word_tagged": "DET" } } }, { "from": "PRON", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADJ" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "ADJ" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PRON" } } } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "PRON" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "VERB" } } } } }, { "from": "PART", "to": "AUX", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "ADV" } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PROPN" } } } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "SCONJ", "post_word_tagged": "VERB" } } }, { "from": "AUX", "to": "PROPN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NUM" } } }, { "from": "ADV", "to": "ADJ", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } }, { "from": "PART", "to": "AUX", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "ADJ" } } }, { "from": "VERB", "to": "AUX", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "had" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "VERB" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "had" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADP" } } } } }, { "from": "ADJ", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "DET" } } } } }, { "from": "NOUN", "to": "PROPN", "criteria": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PROPN" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "PROPN" } } } } }, { "from": "ADP", "to": "PART", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "VERB" } } } } }, { "from": "PRON", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "AUX" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADV", "post_word_tagged": "PUNCT" } } } } }, { "from": "DET", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "AUX" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "PART" } } } } }, { "from": "PROPN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "out" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADP" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "DET" } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "PROPN" } } } } }, { "from": "ADP", "to": "INTJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADV" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "AUX" } } }, { "from": "ADJ", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "all" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "ADJ" } } } } }, { "from": "PART", "to": "AUX", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "DET" } } }, { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "CCONJ" } } } } }, { "from": "PRON", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "NUM" } } } } }, { "from": "PRON", "to": "PROPN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "DET" } } } } }, { "from": "ADJ", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "DET" } } }, { "from": "ADJ", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "PRON" } } } } }, { "from": "NUM", "to": "AUX", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "PRON" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "CCONJ", "post_word_tagged": "PUNCT" } } }, { "from": "ADJ", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": "DET", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "NOUN" } } } } }, { "from": "ADP", "to": "PART", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "VERB" } } } } }, { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "ADP" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADV", "post_word_tagged": "PRON" } } }, { "from": "ADP", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "PRON" } } } } }, { "from": "ADV", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "out" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "DET" } } } } }, { "from": "ADV", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "SCONJ" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "to" } }, "b": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PART" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "PUNCT" } } } } } } }, { "from": "ADJ", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "PART" } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "out" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADV" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "up" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "SCONJ" } } } } }, { "from": "ADV", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "PRON" } } } } }, { "from": "NOUN", "to": "NUM", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "NOUN" } } } } }, { "from": "PART", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "for" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "ADV" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "for" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PART" } } } } }, { "from": "VERB", "to": "AUX", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "have" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "ADV" } } } } }, { "from": "ADV", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "NOUN" } } } } }, { "from": "SCONJ", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "as" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "DET" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "CCONJ" } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "ADP" } } } } }, { "from": "ADP", "to": "INTJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "NUM" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "SCONJ", "post_word_tagged": "ADP" } } } } }, { "from": "PART", "to": "AUX", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "PART" } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "INTJ", "post_word_tagged": "DET" } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "NOUN" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 4, "is_tagged": "VERB" } } } } }, { "from": "ADV", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PUNCT", "post_word_tagged": "SCONJ" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "AUX" } } } } }, { "from": "NOUN", "to": "PROPN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "NUM" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PART", "post_word_tagged": "DET" } } }, { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PUNCT" } } } } }, { "from": "ADV", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "all" } }, "b": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PUNCT" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "ADP" } } } } } } }, { "from": "ADV", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "in" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "DET" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "that" } }, "b": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "ADP" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "NOUN" } } } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "in" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "ADP" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "VERB" } } }, { "from": "ADV", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "out" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PROPN" } } } } }, { "from": "ADJ", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "ADP" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "PUNCT" } } }, { "from": "DET", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "all" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "ADP" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "like" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "PUNCT" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "out" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "AUX" } } } } }, { "from": "NOUN", "to": "PROPN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PROPN", "post_word_tagged": "PROPN" } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "AUX" } } } } }, { "from": "ADJ", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PUNCT", "post_word_tagged": "PRON" } } }, { "from": "VERB", "to": "AUX", "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "as" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "AUX" } } } } }, { "from": "PART", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "that" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "VERB" } } } } }, { "from": "ADV", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "NOUN" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "one" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "ADP" } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "PUNCT" } } }, { "from": "NOUN", "to": "PROPN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PROPN", "post_word_tagged": "NOUN" } } } } }, { "from": "ADP", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "as" } }, "b": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "VERB" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "DET" } } } } } } }, { "from": "DET", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "WordIsTaggedWith": { "relative": -1, "is_tagged": "ADJ" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "VERB" } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "VERB" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "DET" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "SCONJ" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "up" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "ADP" } } } } }, { "from": "ADJ", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "CCONJ" } } }, { "from": "ADP", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "ADP" } } }, { "from": "AUX", "to": "PROPN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PUNCT", "post_word_tagged": "NUM" } } }, { "from": "NUM", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "PUNCT" } } } } }, { "from": "PART", "to": "ADP", "criteria": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "SYM" } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "in" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "ADP" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PUNCT" } } } } }, { "from": "SCONJ", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "ADJ" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "ADV" } } } } }, { "from": "SCONJ", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "out" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "SCONJ" } } } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "PART" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "all" } }, "b": { "WordIsTaggedWith": { "relative": -4, "is_tagged": "AUX" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "out" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "ADV" } } } } }, { "from": "ADJ", "to": "ADV", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "ADV" } } }, { "from": "AUX", "to": "PART", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "VERB" } } } } }, { "from": "DET", "to": "ADV", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "NOUN", "post_word_tagged": "ADV" } } }, { "from": "ADV", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "ADJ" } } } } }, { "from": "PART", "to": "AUX", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "NOUN" } } }, { "from": "NOUN", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "to" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "NUM" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "PART" } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "as" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "SCONJ" } } } } }, { "from": "NUM", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "one" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "ADJ" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "had" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "AUX" } } } } }, { "from": "PRON", "to": "SCONJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "that" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "PRON" } } } } }, { "from": "ADJ", "to": "NOUN", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "AUX" } } }, { "from": "VERB", "to": "AUX", "criteria": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "AUX" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "PUNCT" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "in" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "ADV" } } } } }, { "from": "ADJ", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "VERB" } } } } }, { "from": "NOUN", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "AUX", "post_word_tagged": "ADP" } } } } }, { "from": "ADP", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "like" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "SCONJ" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PROPN", "post_word_tagged": "DET" } } }, { "from": "CCONJ", "to": "DET", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "one" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "NOUN" } } } } }, { "from": "ADJ", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "in" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "PRON", "post_word_tagged": "VERB" } } } } }, { "from": "VERB", "to": "ADJ", "criteria": { "Combined": { "a": { "WordIs": { "relative": 2, "word": "of" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "PROPN" } } } } }, { "from": "SCONJ", "to": "PRON", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "SCONJ", "post_word_tagged": "ADV" } } }, { "from": "NOUN", "to": "VERB", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "PART", "post_word_tagged": "PRON" } } }, { "from": "NUM", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADJ", "post_word_tagged": "PUNCT" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "for" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "PRON" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "for" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "VERB", "post_word_tagged": "VERB" } } } } }, { "from": "PRON", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "there" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 3, "is_tagged": "ADP" } } } } }, { "from": "SCONJ", "to": "ADP", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "as" } }, "b": { "WordIsTaggedWith": { "relative": 2, "is_tagged": "CCONJ" } } } } }, { "from": "NOUN", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "one" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "DET", "post_word_tagged": "VERB" } } } } }, { "from": "AUX", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "have" } }, "b": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PART" } } } } }, { "from": "VERB", "to": "NOUN", "criteria": { "Combined": { "a": { "WordIs": { "relative": -2, "word": "for" } }, "b": { "Combined": { "a": { "WordIsTaggedWith": { "relative": 1, "is_tagged": "PUNCT" } }, "b": { "WordIsTaggedWith": { "relative": -2, "is_tagged": "ADP" } } } } } } }, { "from": "ADP", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "for" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -1, "is_tagged": "AUX" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "CCONJ" } } }, { "from": "PRON", "to": "PROPN", "criteria": { "Combined": { "a": { "WordIs": { "relative": 0, "word": "US" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": -2, "is_tagged": "DET" } } } } }, { "from": "DET", "to": "PRON", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "to" } }, "b": { "SandwichTaggedWith": { "prev_word_tagged": "ADP", "post_word_tagged": "PRON" } } } } }, { "from": "ADJ", "to": "ADV", "criteria": { "Combined": { "a": { "WordIs": { "relative": 1, "word": "of" } }, "b": { "AnyWordIsTaggedWith": { "max_relative": 2, "is_tagged": "VERB" } } } } }, { "from": "NOUN", "to": "VERB", "criteria": { "Combined": { "a": { "WordIs": { "relative": -1, "word": "you" } }, "b": { "WordIs": { "relative": 0, "word": "plan" } } } } } ] } ================================================ FILE: harper-cli/Cargo.toml ================================================ [package] name = "harper-cli" version = "0.1.0" edition = "2024" publish = false repository = "https://github.com/automattic/harper" [dependencies] anyhow = "1.0.102" ariadne = "0.6.0" clap = { version = "4.6.0", features = ["derive", "std", "string"], default-features = false } clap_complete = "4.6.0" harper-stats = { path = "../harper-stats", version = "1.0.0" } dirs = "6.0.0" harper-literate-haskell = { path = "../harper-literate-haskell", version = "1.0.0" } harper-python = { path = "../harper-python", version = "1.0.0" } harper-asciidoc = { path = "../harper-asciidoc", version = "1.0.0" } harper-core = { path = "../harper-core", version = "1.0.0" } harper-pos-utils = { path = "../harper-pos-utils", version = "1.0.0", features = [] } harper-comments = { path = "../harper-comments", version = "1.0.0" } harper-tex = { path = "../harper-tex", version = "1.0.0" } harper-typst = { path = "../harper-typst", version = "1.0.0" } hashbrown = "0.16.1" rayon = "1.11.0" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" strum = "0.28.0" strum_macros = "0.28.0" harper-ink = { version = "1.0.0", path = "../harper-ink" } enum_dispatch = "0.3.13" yansi = "1.0.1" [dev-dependencies] tempfile = "3" [features] default = [] training = ["harper-pos-utils/training"] ================================================ FILE: harper-cli/README.md ================================================ # `harper-cli` ## What? `harper-cli` is a small, experimental frontend for Harper. It can be used in any situation where you might need to check a large number of files automatically (like in continuous integration). Right now it is quite feature barren, mainly because an external use-case has not been defined yet. If you have any thoughts, feel free to reach out. ## Possible Future Features - On-disk caching - Custom dictionaries (maybe use the same ones as `harper-ls`?) - Machine-readable output ================================================ FILE: harper-cli/src/annotate.rs ================================================ use std::{borrow::Cow, ops::Range}; use ariadne::{Color, Label, Report, ReportKind}; use clap::ValueEnum; use harper_core::{Document, Span, TokenKind, TokenStringExt}; use strum::IntoEnumIterator; /// Represents an annotation. pub(super) struct Annotation { /// The range the annotation covers in the source. For instance, this might be a single word. span: Span, /// The message displayed by the annotation. annotation_text: String, /// The color of the annotation. color: Color, } impl Annotation { /// Converts the annotation into an [`ariadne::Label`]. #[must_use] pub(super) fn into_label( self, input_identifier: &str, ) -> Label<(&str, std::ops::Range)> { Label::new((input_identifier, self.span.into())) .with_message(self.annotation_text) .with_color(self.color) } /// Gets an iterator of annotation `Label` from the given document. /// /// This is similar to [`Self::iter_from_document`], but this additionally converts /// the [`Annotation`] into [`ariadne::Label`] for convenience. pub(super) fn iter_labels_from_document<'inpt_id>( annotation_type: AnnotationType, document: &Document, input_identifier: &'inpt_id str, ) -> impl Iterator)>> { Self::iter_from_document(annotation_type, document) .map(|annotation| annotation.into_label(input_identifier)) } /// Gets an iterator of [`Annotation`] for a given document. The annotations will be based on /// `annotation_type`. fn iter_from_document( annotation_type: AnnotationType, document: &Document, ) -> Box + '_> { match annotation_type { AnnotationType::Upos => Box::new({ document.tokens().filter_map(|token| { let span = token.span; if let TokenKind::Word(Some(metadata)) = &token.kind { // Only annotate words (with dict word metadata) for `AnnotationType::Upos`. let pos_tag = metadata.pos_tag; Some(Self { span, annotation_text: pos_tag .map_or("NONE".to_owned(), |upos| upos.to_string()), color: pos_tag.map_or(Color::Red, get_color_for_enum_variant), }) } else { // Not a word, or a word with no metadata. None } }) }), AnnotationType::Chunks => Box::new( document .iter_chunks() .zip(RandomColorIter::new()) .enumerate() .map(|(i, (chunk, color))| Self { span: chunk.span().unwrap(), annotation_text: i.to_string(), color, }), ), } } } /// Represents how the tokens should be annotated. #[derive(Debug, Clone, Copy, ValueEnum)] pub(super) enum AnnotationType { /// UPOS (part of speech) Upos, Chunks, } impl AnnotationType { /// Build a [`Report`] from the provided [`Document`], `input_identifier`, and `report_title`. pub(super) fn build_report<'input_id>( &self, doc: &Document, input_identifier: &'input_id str, report_title: &'input_id str, ) -> Report<'input_id, (&'input_id str, Range)> { Report::build( ReportKind::Custom(report_title, Color::Blue), (input_identifier, 0..0), ) .with_labels(Annotation::iter_labels_from_document( *self, doc, input_identifier, )) .finish() } /// The title that should be used for the printed output. pub(super) fn get_title(&self) -> &'static str { match self { AnnotationType::Upos => "UPOS Tags", AnnotationType::Chunks => "Chunks", } } /// The title that should be used for the printed output, with added tags. /// /// The tags are used to provide additional information about the output. pub(super) fn get_title_with_tags(&self, tags: &[&str]) -> Cow<'static, str> { if tags.is_empty() { self.get_title().into() } else { let tags = tags.join(", "); (self.get_title().to_owned() + &format!(" ({tags})")).into() } } } /// An infinite iterator that produces random colors. This uses a fixed seed, so all instances of /// this iterator will produce colors in the same order. struct RandomColorIter { color_gen: ariadne::ColorGenerator, } impl RandomColorIter { fn new() -> Self { Self { // Using a lower than default `min_brightness` to hopefully create more distinguishable colors. color_gen: ariadne::ColorGenerator::from_state([31715, 3528, 21854], 0.2), } } } impl Iterator for RandomColorIter { type Item = Color; fn next(&mut self) -> Option { Some(self.color_gen.next()) } } /// Gets a random `Color` for an enum variant. /// /// A given enum variant's color is consistent, meaning it will not change throughout multiple /// calls of this function or multiple runs of the application. #[must_use] fn get_color_for_enum_variant(variant_to_color: T) -> Color { get_color_for_index( T::iter() .position(|variant| variant == variant_to_color) .unwrap(), ) } /// Gets the nth random `Color` for a numeric index. /// /// A given index's color is consistent, meaning it will not change throughout multiple calls of /// this function or multiple runs of the application. #[must_use] fn get_color_for_index(idx_to_color: usize) -> Color { RandomColorIter::new().nth(idx_to_color).unwrap() } ================================================ FILE: harper-cli/src/input/multi_input.rs ================================================ use std::{borrow::Cow, path::PathBuf}; use enum_dispatch::enum_dispatch; use strum_macros::EnumTryAs; use crate::input::single_input::{FileInput, SingleInput}; use super::InputTrait; #[enum_dispatch] pub(crate) trait MultiInputTrait: InputTrait { /// Get an iterator of [`SingleInput`] from this `MultiInput`. /// /// For instance, if this is a directory input, the returned inputs might correspond to the /// files inside that directory. #[allow(dead_code)] fn iter_inputs(&self) -> anyhow::Result>; } #[derive(Clone, EnumTryAs)] #[enum_dispatch(MultiInputTrait, InputTrait)] pub(crate) enum MultiInput { /// A directory. Dir(DirInput), } impl MultiInput { /// Try to parse a `MultiInput` from the provided string. This might fail if the provided /// string cannot be parsed as a supported `MultiInput`. pub(crate) fn try_parse_string(input_string: &str) -> anyhow::Result { let metadata = std::fs::metadata(input_string); if metadata?.is_dir() { // Input is a valid directory path. Ok(Self::Dir(DirInput { path: input_string.into(), })) } else { anyhow::bail!( "Unsupported input '{}' for {}", input_string, std::any::type_name::() ) } } } /// A directory. #[derive(Clone)] pub(crate) struct DirInput { /// The path pointing to the directory. path: PathBuf, } impl DirInput { /// An iterator of the files inside the directory, as [`FileInput`]. pub(crate) fn iter_files(&self) -> anyhow::Result> { Ok(std::fs::read_dir(&self.path)?.filter_map(|dir_entry| { if let Ok(dir_entry) = dir_entry && let Ok(file) = FileInput::try_from_path(&dir_entry.path()) { Some(file) } else { None } })) } } impl MultiInputTrait for DirInput { fn iter_inputs(&self) -> anyhow::Result> { Ok(self.iter_files()?.map(|file| file.into())) } } impl InputTrait for DirInput { fn get_identifier(&self) -> Cow<'_, str> { self.path .file_name() .map_or(Cow::from(""), |dir_name| dir_name.to_string_lossy()) } } ================================================ FILE: harper-cli/src/input/single_input.rs ================================================ use std::path::Path; use std::{borrow::Cow, io::Read, path::PathBuf}; use enum_dispatch::enum_dispatch; use strum_macros::EnumTryAs; use harper_asciidoc::AsciidocParser; use harper_comments::CommentParser; use harper_core::parsers::{Markdown, OrgMode, Parser}; use harper_core::spell::Dictionary; use harper_core::{ Document, parsers::{MarkdownOptions, PlainEnglish}, }; use harper_ink::InkParser; use harper_literate_haskell::LiterateHaskellParser; use harper_python::PythonParser; use super::InputTrait; /// An input of a single source. This would not include a directory for instance, which may have /// multiple (file) sources. #[enum_dispatch] pub(crate) trait SingleInputTrait: InputTrait { /// Loads the contained file/string into a conventional format. Returns a `Result` containing /// a tuple of a `Document` and its corresponding source text as a string. fn load( &self, markdown_options: MarkdownOptions, dictionary: &dyn Dictionary, ) -> anyhow::Result<(Document, Cow<'_, str>)> { self.load_with_parser(&self.get_parser(markdown_options), dictionary) } /// Loads the contained file/string into a conventional format using the provided /// parser. Returns a `Result` containing a tuple of a `Document` and its corresponding source /// text as a string. fn load_with_parser( &self, parser: &dyn Parser, dictionary: &dyn Dictionary, ) -> anyhow::Result<(Document, Cow<'_, str>)> { let text = self.get_content()?; Ok((Document::new(&text, &parser, &dictionary), text)) } /// The parser that should be used to parse this input. fn get_parser(&self, _markdown_options: MarkdownOptions) -> Box { Box::new(PlainEnglish) } /// Get/load the raw content of this input. fn get_content(&self) -> anyhow::Result>; } #[derive(Clone, EnumTryAs)] #[enum_dispatch(SingleInputTrait, InputTrait)] pub(crate) enum SingleInput { /// Read from a file. File(FileInput), /// Direct text input via the command line. Text(TextInput), /// Read from standard input. Stdin(StdinInput), } impl SingleInput { /// Parse a string into a [`SingleInput`], trying to automatically detect the input /// type based on its contents. /// /// For instance, an `input_string` that corresponds to a valid filepath will be parsed as /// a [`SingleInput::File`]. pub(crate) fn parse_string(input_string: &str) -> Self { if let Ok(file) = FileInput::try_from_path(Path::new(input_string)) { // Input is a valid filepath. Self::File(file) } else { // Input is not a valid filepath, we assume it's intended to be a string. Self::Text(TextInput { text: input_string.to_owned(), }) } } } pub trait SingleInputOptionExt { /// Returns the contained [`Some`] value if some, otherwise returns [`SingleInput::Stdin`]. fn unwrap_or_read_from_stdin(self) -> SingleInput; } impl SingleInputOptionExt for Option { fn unwrap_or_read_from_stdin(self) -> SingleInput { self.unwrap_or_else(|| StdinInput.into()) } } /// File (path) input. #[derive(Clone)] pub(crate) struct FileInput { path: PathBuf, } impl FileInput { /// The path of the file. pub(crate) fn path(&self) -> &PathBuf { &self.path } /// Try to create a `FileInput` from the given path. If the path does not point to a valid /// file, this will fail. pub(crate) fn try_from_path(path: &Path) -> anyhow::Result { let metadata = std::fs::metadata(path); if metadata?.is_file() { Ok(Self::from_path_unchecked(path)) } else { anyhow::bail!( "Failed to parse '{}' as {}", path.to_string_lossy(), std::any::type_name::() ) } } /// Create a file input from the given path, without checking if that path points to a valid /// file. pub(crate) fn from_path_unchecked(path: &Path) -> Self { Self { path: path.to_owned(), } } } impl SingleInputTrait for FileInput { /// Read content from the file. fn get_content(&self) -> anyhow::Result> { Ok(std::fs::read_to_string(&self.path)?.into()) } /// Detect the parser that should be used for the given file. fn get_parser(&self, _markdown_options: MarkdownOptions) -> Box { match self.path.extension().map(|ext| ext.to_str().unwrap()) { Some("md" | "markdown" | "mkd" | "mdwn" | "mdown" | "mdtxt" | "mdtext") => { Box::new(Markdown::default()) } Some("ink") => Box::new(InkParser::default()), Some("lhs") => Box::new(LiterateHaskellParser::new_markdown( MarkdownOptions::default(), )), Some("org") => Box::new(OrgMode), Some("tex" | "latex" | "sty" | "cls" | "dtx") => Box::new(harper_tex::TeX::default()), Some("typ") => Box::new(harper_typst::Typst), Some("py") | Some("pyi") => Box::new(PythonParser::default()), Some("adoc") | Some("asciidoc") => Box::new(AsciidocParser::default()), Some("txt") => Box::new(PlainEnglish), _ => { if let Some(comment_parser) = CommentParser::new_from_filename(&self.path, _markdown_options) { Box::new(comment_parser) } else { eprintln!( "{}: Warning: Could not detect language ID; falling back to PlainEnglish parser.", self.get_identifier() ); Box::new(PlainEnglish) } } } } } impl InputTrait for FileInput { fn get_identifier(&self) -> Cow<'_, str> { self.path .file_name() .map_or(Cow::from(""), |file_name| file_name.to_string_lossy()) } } /// Direct text input via the command line. #[derive(Clone)] pub(crate) struct TextInput { text: String, } impl SingleInputTrait for TextInput { fn get_content(&self) -> anyhow::Result> { Ok(Cow::from(&self.text)) } } impl InputTrait for TextInput { fn get_identifier(&self) -> Cow<'_, str> { Cow::from("") } } /// Standard input (stdin). #[derive(Clone)] pub(crate) struct StdinInput; impl SingleInputTrait for StdinInput { fn get_content(&self) -> anyhow::Result> { let mut buf = String::new(); std::io::stdin().lock().read_to_string(&mut buf)?; Ok(Cow::from(buf)) } } impl InputTrait for StdinInput { fn get_identifier(&self) -> Cow<'_, str> { Cow::from("") } } ================================================ FILE: harper-cli/src/input.rs ================================================ use std::borrow::Cow; use enum_dispatch::enum_dispatch; use strum_macros::EnumTryAs; pub mod single_input; use single_input::SingleInput; pub mod multi_input; use multi_input::MultiInput; /// The general trait implemented by all input types. #[enum_dispatch] pub(crate) trait InputTrait { /// Gets a human-readable identifier for the input. For example, this can be a filename, or /// simply the string `""`. fn get_identifier(&self) -> Cow<'_, str>; } /// Represents an input/source passed via the command line. For example, this can be a file, /// a directory, or text passed via the command line directly. #[enum_dispatch(InputTrait)] #[derive(Clone, EnumTryAs)] pub(crate) enum AnyInput { /// An input of a single source. For instance, a specific file, or input from standard input. Single(SingleInput), /// An input of multiple sources. For instance, a path to a directory. Multi(MultiInput), } // This allows this type to be directly used with clap as an argument. // https://docs.rs/clap/latest/clap/macro.value_parser.html impl From for AnyInput { /// Converts the given string into an `Input` by trying to detect the input type. fn from(input_string: String) -> Self { if let Ok(multi_input) = MultiInput::try_parse_string(&input_string) { Self::Multi(multi_input) } else { Self::Single(SingleInput::parse_string(&input_string)) } } } // This allows this type to be directly used with clap as an argument. // It can be used in place of AnyInput if the command should only accept single-inputs // (e.g. a file). impl From for SingleInput { fn from(input_string: String) -> Self { SingleInput::parse_string(&input_string) } } // This allows this type to be directly used with clap as an argument. // It can be used in place of AnyInput if the command should only accept multi-inputs, // (e.g. directories). impl From for MultiInput { fn from(input_string: String) -> Self { MultiInput::try_parse_string(&input_string).unwrap() } } ================================================ FILE: harper-cli/src/lint.rs ================================================ use std::borrow::Cow; use std::collections::BTreeMap; use std::path::{Component, Path, PathBuf}; use std::sync::Arc; use std::{fs, process}; use anyhow::Context; use ariadne::{Color, Fmt, Label, Report, ReportKind, Source}; use hashbrown::HashMap; use rayon::prelude::*; use serde::Serialize; use harper_core::{ linting::{Lint, LintGroup, LintGroupConfig, LintKind}, parsers::MarkdownOptions, spell::{Dictionary, MergedDictionary, MutableDictionary}, weirpack::Weirpack, {Dialect, DictWordMetadata, Document, Token, TokenKind, remove_overlaps_map}, }; use crate::input::{ AnyInput, InputTrait, multi_input::MultiInput, single_input::{SingleInput, SingleInputTrait, StdinInput}, }; /// Sync version of harper-ls/src/dictionary_io@load_dict fn load_dict(path: &Path) -> anyhow::Result { let str = fs::read_to_string(path)?; let mut dict = MutableDictionary::new(); dict.extend_words( str.lines() .map(|l| (l.chars().collect::>(), DictWordMetadata::default())), ); Ok(dict) } fn load_weirpacks(inputs: &[SingleInput]) -> anyhow::Result> { let mut packs = Vec::new(); for input in inputs { let Some(file) = input.try_as_file_ref() else { anyhow::bail!( "Weirpack inputs must be files, got {}", input.get_identifier() ); }; let path = file.path(); let bytes = fs::read(path) .with_context(|| format!("Failed to read weirpack {}", path.display()))?; let pack = Weirpack::from_bytes(&bytes) .with_context(|| format!("Failed to load weirpack {}", path.display()))?; packs.push(pack); } Ok(packs) } /// Path version of harper-ls/src/dictionary_io@file_dict_name fn file_dict_name(path: &Path) -> PathBuf { let mut rewritten = String::new(); for seg in path.components() { if !matches!(seg, Component::RootDir) { rewritten.push_str(&seg.as_os_str().to_string_lossy()); rewritten.push('%'); } } rewritten.into() } /// Output format for lint results. #[derive(Debug, Clone, Copy, clap::ValueEnum, Default, PartialEq)] pub enum OutputFormat { /// Rich output with source context (Ariadne reports). #[default] Default, /// Structured JSON output. Json, /// One line per lint, no source context. Compact, } pub struct LintOptions { pub count: bool, pub ignore: Option>, pub only: Option>, pub keep_overlapping_lints: bool, pub dialect: Dialect, pub weirpack_inputs: Vec, pub color: bool, pub format: OutputFormat, } enum ReportStyle { FullAriadne, BriefCountsOnly, Json, Compact, } #[derive(Serialize)] struct JsonFileResult { file: String, lint_count: usize, lints: Vec, #[serde(skip_serializing_if = "Option::is_none")] error: Option, } #[derive(Serialize)] struct JsonLint { rule: String, kind: String, span: JsonSpan, line: usize, column: usize, message: String, priority: u8, suggestions: Vec, matched_text: String, } /// Span offsets in characters (not bytes). #[derive(Serialize)] struct JsonSpan { char_start: usize, char_end: usize, } /// Convert a character index into a 1-based (line, column) pair. fn char_index_to_line_col(source: &[char], index: usize) -> (usize, usize) { let before = &source[..index.min(source.len())]; let line = before.iter().filter(|&&c| c == '\n').count() + 1; let col = before.iter().rev().take_while(|&&c| c != '\n').count() + 1; (line, col) } struct InputInfo<'a> { parent_input_id: &'a str, input: &'a AnyInput, color: bool, } struct InputJob { batch_mode: bool, parent_input_id: String, input: AnyInput, } impl InputInfo<'_> { /// Path without ANSI escapes, for machine-readable output. fn plain_path(&self) -> String { let child = self.input.get_identifier(); if self.parent_input_id.is_empty() { child.into_owned() } else { format!("{}/{}", self.parent_input_id, child) } } fn format_path(&self) -> String { if self.color { let child = self.input.get_identifier(); if self.parent_input_id.is_empty() { child.into_owned() } else { format!("\x1b[33m{}/\x1b[0m{}", self.parent_input_id, child) } } else { self.plain_path() } } } pub fn lint( markdown_options: MarkdownOptions, curated_dictionary: Arc, mut inputs: Vec, mut lint_options: LintOptions, user_dict_path: PathBuf, // TODO workspace_dict_path? file_dict_path: PathBuf, ) -> anyhow::Result<()> { let LintOptions { count, ref mut ignore, ref mut only, dialect, ref weirpack_inputs, .. } = lint_options; // Zero or more inputs, default to stdin if not provided if inputs.is_empty() { inputs.push(SingleInput::from(StdinInput).into()); } let weirpacks = load_weirpacks(weirpack_inputs)?; // Filter out any rules from ignore/only lists that don't exist in the current config // Uses a cached config to avoid expensive linter initialization let mut config = LintGroupConfig::new_curated(); for pack in &weirpacks { for rule in pack.rules.keys() { config.set_rule_enabled(rule, true); } } if let Some(only) = only { only.retain(|rule| { if !config.has_rule(rule) { eprintln!("Warning: Cannot enable unknown rule '{}'.", rule); return false; } true }); } if let Some(ignore) = ignore { ignore.retain(|rule| { if !config.has_rule(rule) { eprintln!("Warning: Cannot disable unknown rule '{}'.", rule); return false; } true }); } // Create merged dictionary with base dictionary let mut curated_plus_user_dict = MergedDictionary::new(); curated_plus_user_dict.add_dictionary(Arc::new(curated_dictionary)); let user_dict_msg = match load_dict(&user_dict_path) { Ok(user_dict) => { curated_plus_user_dict.add_dictionary(Arc::new(user_dict)); "Using" } Err(_) => "There is no", }; eprintln!( "Note: {user_dict_msg} user dictionary at {}", user_dict_path.display() ); // The lint stats for all files let mut all_lint_kinds: HashMap = HashMap::new(); let mut all_rules: HashMap = HashMap::new(); let mut all_lint_kind_rule_pairs: HashMap<(LintKind, String), usize> = HashMap::new(); let mut all_spellos: HashMap = HashMap::new(); // Derive the report style from --format and --count let report_mode = match (lint_options.format, count) { (OutputFormat::Json, _) => ReportStyle::Json, (OutputFormat::Compact, _) => ReportStyle::Compact, (OutputFormat::Default, true) => ReportStyle::BriefCountsOnly, (OutputFormat::Default, false) => ReportStyle::FullAriadne, }; let mut input_jobs = Vec::new(); for user_input in inputs { if let Some(dir_input) = user_input .try_as_multi_ref() .and_then(MultiInput::try_as_dir_ref) { let mut file_entries: Vec<_> = dir_input.iter_files()?.collect(); file_entries.sort_by(|a, b| a.path().file_name().cmp(&b.path().file_name())); for entry in file_entries.into_iter().map(SingleInput::from) { input_jobs.push(InputJob { batch_mode: true, parent_input_id: user_input.get_identifier().to_string(), input: entry.into(), }); } } else { input_jobs.push(InputJob { batch_mode: false, parent_input_id: String::new(), input: user_input.clone(), }); } } let per_input_results = { let run_job = |job: InputJob| { let InputJob { batch_mode, parent_input_id, input, } = job; lint_one_input( // Common properties of harper-cli markdown_options, &curated_plus_user_dict, // Passed from the user for the `lint` subcommand &report_mode, &lint_options, &weirpacks, &file_dict_path, // Are we linting multiple inputs inside a directory? batch_mode, // The current input to be linted InputInfo { parent_input_id: parent_input_id.as_str(), input: &input, color: lint_options.color, }, ) }; if input_jobs.len() > 1 { input_jobs.into_par_iter().map(run_job).collect::>() } else { input_jobs.into_iter().map(run_job).collect::>() } }; let mut json_results: Vec = Vec::new(); for lint_results in per_input_results { let lint_results = lint_results?; // Update the global stats for (kind, count) in lint_results.lint_kinds { *all_lint_kinds.entry(kind).or_insert(0) += count; } for (rule, count) in lint_results.lint_rules { *all_rules.entry(rule).or_insert(0) += count; } for ((kind, rule), count) in lint_results.lint_kind_rule_pairs { *all_lint_kind_rule_pairs.entry((kind, rule)).or_insert(0) += count; } for (word, count) in lint_results.spellos { *all_spellos.entry(word).or_insert(0) += count; } if let Some(json) = lint_results.json { json_results.push(json); } } match report_mode { ReportStyle::Json => { println!("{}", serde_json::to_string_pretty(&json_results)?); } ReportStyle::Compact => {} _ => { final_report( dialect, true, all_lint_kinds, all_rules, all_lint_kind_rule_pairs, all_spellos, lint_options.color, ); } } process::exit(1); } struct LintOneResult { lint_kinds: HashMap, lint_rules: HashMap, lint_kind_rule_pairs: HashMap<(LintKind, String), usize>, spellos: HashMap, json: Option, } struct FullInputInfo<'a> { input: InputInfo<'a>, doc: Document, source: Cow<'a, str>, } #[allow(clippy::too_many_arguments)] fn lint_one_input( // Common properties of harper-cli markdown_options: MarkdownOptions, curated_plus_user_dict: &MergedDictionary, report_mode: &ReportStyle, // Options passed from the user specific to the `lint` subcommand lint_options: &LintOptions, weirpacks: &[Weirpack], file_dict_path: &Path, // Are we linting multiple inputs? batch_mode: bool, // For the current input current: InputInfo, ) -> anyhow::Result { let LintOptions { count: _, ignore, only, keep_overlapping_lints, dialect, weirpack_inputs: _, color: _, format: _, } = lint_options; let mut lint_kinds: HashMap = HashMap::new(); let mut lint_rules: HashMap = HashMap::new(); let mut lint_kind_rule_pairs: HashMap<(LintKind, String), usize> = HashMap::new(); let mut spellos: HashMap = HashMap::new(); let mut json: Option = None; if let Some(single_input) = current.input.try_as_single_ref() { // Create a new merged dictionary for this input. let mut merged_dictionary = curated_plus_user_dict.clone(); // If processing a file, try to load its per-file dictionary if let Some(file) = single_input.try_as_file_ref() { let dict_path = file_dict_path.join(file_dict_name(file.path())); if let Ok(file_dictionary) = load_dict(&dict_path) { merged_dictionary.add_dictionary(Arc::new(file_dictionary)); eprintln!( "{}: Note: Using per-file dictionary: {}", current.format_path(), dict_path.display() ); } } match single_input.load(markdown_options, &merged_dictionary) { Err(err) => { eprintln!("{}", err); if matches!(report_mode, ReportStyle::Json) { json = Some(JsonFileResult { file: current.plain_path(), lint_count: 0, lints: vec![], error: Some(err.to_string()), }); } } Ok((doc, source)) => { // Create the Lint Group from which we will lint this input, using the combined dictionary and the specified dialect let mut lint_group = LintGroup::new_curated(merged_dictionary.into(), *dialect); for pack in weirpacks { let mut pack_group = pack.to_lint_group()?; lint_group.merge_from(&mut pack_group); } // Turn specified rules on or off configure_lint_group(&mut lint_group, only, ignore); // Run the linter, getting back a map of rule name -> lints let mut named_lints = lint_group.organized_lints(&doc); // Lint counts, for brief reporting let lint_count_before = named_lints.values().map(|v| v.len()).sum::(); if !keep_overlapping_lints { remove_overlaps_map(&mut named_lints); } let lint_count_after = named_lints.values().map(|v| v.len()).sum::(); // Extract the lint kinds and rules etc. for reporting (lint_kinds, lint_rules) = count_lint_kinds_and_rules(&named_lints); lint_kind_rule_pairs = collect_lint_kind_rule_pairs(&named_lints); spellos = collect_spellos(&named_lints, doc.get_source()); // Build JSON result if in JSON mode if matches!(report_mode, ReportStyle::Json) { let file = current.plain_path(); let source_chars = doc.get_source(); let mut lints = Vec::new(); for (rule_name, rule_lints) in &named_lints { for lint in rule_lints { let (line, column) = char_index_to_line_col(source_chars, lint.span.start); let matched_text = lint.span.get_content_string(source_chars); let suggestions: Vec = lint.suggestions.iter().map(|s| format!("{s}")).collect(); lints.push(JsonLint { rule: rule_name.clone(), kind: lint.lint_kind.to_string(), span: JsonSpan { char_start: lint.span.start, char_end: lint.span.end, }, line, column, message: lint.message.clone(), priority: lint.priority, suggestions, matched_text, }); } } json = Some(JsonFileResult { file, lint_count: lint_count_after, lints, error: None, }); } single_input_report( &FullInputInfo { input: InputInfo { parent_input_id: current.parent_input_id, input: current.input, color: current.color, }, doc, source, }, // Linting results of this input &named_lints, (lint_count_before, lint_count_after), &lint_kinds, &lint_rules, // Reporting arguments batch_mode, report_mode, ); } } } Ok(LintOneResult { lint_kinds, lint_rules, lint_kind_rule_pairs, spellos, json, }) } fn configure_lint_group( lint_group: &mut LintGroup, only: &Option>, ignore: &Option>, ) { if let Some(rules) = only { lint_group.set_all_rules_to(Some(false)); rules .iter() .for_each(|rule| lint_group.config.set_rule_enabled(rule, true)); } if let Some(rules) = ignore { rules .iter() .for_each(|rule| lint_group.config.set_rule_enabled(rule, false)); } // Have all rules been disabled somehow? if !lint_group .iter_keys() .any(|rule| lint_group.config.is_rule_enabled(rule)) { eprintln!("Warning: No rules are enabled."); } } fn count_lint_kinds_and_rules( named_lints: &BTreeMap>, ) -> (HashMap, HashMap) { let mut kinds = HashMap::new(); let mut rules = HashMap::new(); for (rule_name, lints) in named_lints { lints .iter() .for_each(|lint| *kinds.entry(lint.lint_kind).or_insert(0) += 1); if !lints.is_empty() { *rules.entry(rule_name.to_string()).or_insert(0) += lints.len(); } } (kinds, rules) } fn collect_lint_kind_rule_pairs( named_lints: &BTreeMap>, ) -> HashMap<(LintKind, String), usize> { let mut pairs = HashMap::new(); for (rule_name, lints) in named_lints { for lint in lints { pairs .entry((lint.lint_kind, rule_name.to_string())) .and_modify(|count| *count += 1) .or_insert(1); } } pairs } fn collect_spellos( named_lints: &BTreeMap>, source: &[char], ) -> HashMap { named_lints .get("SpellCheck") .into_iter() .flatten() .map(|lint| lint.span.get_content_string(source)) .fold(HashMap::new(), |mut acc, spello| { *acc.entry(spello).or_insert(0) += 1; acc }) } fn single_input_report( // Properties of the current input input_info: &FullInputInfo, // Linting results of this input named_lints: &BTreeMap>, lint_count: (usize, usize), lint_kinds: &HashMap, lint_rules: &HashMap, // Reporting parameters batch_mode: bool, // If true, we are processing multiple files, which affects how we report report_mode: &ReportStyle, ) { // JSON mode: all output is handled by the caller after collecting results if matches!(report_mode, ReportStyle::Json) { return; } let FullInputInfo { input, doc, source } = input_info; let (lint_count_before, lint_count_after) = lint_count; // Compact mode: one line per lint, GCC/grep-style if matches!(report_mode, ReportStyle::Compact) { let source_chars = doc.get_source(); for (rule_name, lints) in named_lints { for lint in lints { let (line, col) = char_index_to_line_col(source_chars, lint.span.start); println!( "{}:{}:{}: {}::{}: {}", input.plain_path(), line, col, lint.lint_kind, rule_name, lint.message ); } } return; } // The Ariadne report works poorly for files with very long lines, so suppress it unless only processing one file const MAX_LINE_LEN: usize = 150; let mut report_mode = report_mode; let longest = find_longest_doc_line(doc.get_tokens()); if batch_mode && longest > MAX_LINE_LEN && matches!(report_mode, ReportStyle::FullAriadne) { report_mode = &ReportStyle::BriefCountsOnly; println!( "{}: Longest line: {longest} exceeds max line length: {MAX_LINE_LEN}", input.format_path() ); } // Report the number of lints no matter what report mode we are in println!( "{}: {}", input.format_path(), match (lint_count_before, lint_count_after) { (0, _) => "No lints found".to_string(), (before, after) if before != after => format!("{before} lints before overlap removal, {after} after"), (before, _) => format!("{before} lints"), } ); // If we are in Ariadne mode, print the report if matches!(report_mode, ReportStyle::FullAriadne) { let primary_color = Color::Magenta; let input_identifier = input.input.get_identifier(); if lint_count_after != 0 { let mut report_builder = Report::build(ReportKind::Advice, (&input_identifier, 0..0)); for (rule_name, lints) in named_lints { for lint in lints { let (r, g, b) = rgb_for_lint_kind(Some(&lint.lint_kind)); report_builder = report_builder.with_label( Label::new((&input_identifier, lint.span.into())) .with_message(format!( "{} {}: {}", format_args!("[{}::{}]", lint.lint_kind, rule_name) .fg(ariadne::Color::Rgb(r, g, b)), format_args!("(pri {})", lint.priority).fg(ariadne::Color::Rgb( (r as f32 * 0.66) as u8, (g as f32 * 0.66) as u8, (b as f32 * 0.66) as u8 )), lint.message )) .with_color(primary_color), ); } } let report = report_builder.finish(); report.print((&input_identifier, Source::from(source))).ok(); } } // Print the more detailed counts for the lint kinds and then for the rules if !lint_kinds.is_empty() { let mut lint_kinds_vec: Vec<_> = lint_kinds.iter().collect(); lint_kinds_vec.sort_by_key(|(lk, count)| (std::cmp::Reverse(**count), lk.to_string())); let lk_vec: Vec<(Option, String)> = lint_kinds_vec .into_iter() .map(|(lk, c)| { let (r, g, b) = rgb_for_lint_kind(Some(lk)); ( Some(format!("\x1b[38;2;{r};{g};{b}m")), format!("[{lk}: {c}]"), ) }) .collect(); println!("lint kinds:"); print_formatted_items(lk_vec, input.color); } if !lint_rules.is_empty() { let mut rules_vec: Vec<_> = lint_rules.iter().collect(); rules_vec.sort_by_key(|(rn, count)| (std::cmp::Reverse(**count), rn.to_string())); let r_vec: Vec<(Option, String)> = rules_vec .into_iter() .map(|(rn, c)| (None, format!("<{rn}: {c}>"))) .collect(); println!("rules:"); print_formatted_items(r_vec, input.color); } } fn find_longest_doc_line(toks: &[Token]) -> usize { let mut longest_len_chars = 0; let mut curr_len_chars = 0; let mut current_line_start_tok_idx = 0; for (idx, tok) in toks.iter().enumerate() { if matches!(tok.kind, TokenKind::Newline(_)) || matches!(tok.kind, TokenKind::ParagraphBreak) { if curr_len_chars > longest_len_chars { longest_len_chars = curr_len_chars; } curr_len_chars = 0; current_line_start_tok_idx = idx + 1; } else if matches!(tok.kind, TokenKind::Unlintable) { // TODO would be more accurate to scan for \n in the tok.span.get_content(src) } else { curr_len_chars += tok.span.len(); } } if curr_len_chars > longest_len_chars && !toks.is_empty() && current_line_start_tok_idx < toks.len() { longest_len_chars = curr_len_chars; } longest_len_chars } fn final_report( dialect: Dialect, batch_mode: bool, all_lint_kinds: HashMap, all_rules: HashMap, all_lint_kind_rule_pairs: HashMap<(LintKind, String), usize>, all_spellos: HashMap, color: bool, ) { // The stats summary of all inputs that we only do when there are multiple inputs. if batch_mode { let mut all_files_lint_kind_counts_vec: Vec<(LintKind, _)> = all_lint_kinds.into_iter().collect(); all_files_lint_kind_counts_vec .sort_by_key(|(lk, count)| (std::cmp::Reverse(*count), lk.to_string())); let lint_kind_counts: Vec<(Option, String)> = all_files_lint_kind_counts_vec .into_iter() .map(|(lint_kind, c)| { let (r, g, b) = rgb_for_lint_kind(Some(&lint_kind)); ( Some(format!("\x1b[38;2;{r};{g};{b}m")), format!("[{lint_kind}: {c}]"), ) }) .collect(); if !lint_kind_counts.is_empty() { println!("All files lint kinds:"); print_formatted_items(lint_kind_counts, color); } let mut all_files_rule_name_counts_vec: Vec<_> = all_rules.into_iter().collect(); all_files_rule_name_counts_vec .sort_by_key(|(rule_name, count)| (std::cmp::Reverse(*count), rule_name.to_string())); let rule_name_counts: Vec<(Option, String)> = all_files_rule_name_counts_vec .into_iter() .map(|(rule_name, count)| (None, format!("({rule_name}: {count})"))) .collect(); if !rule_name_counts.is_empty() { println!("All files rule names:"); print_formatted_items(rule_name_counts, color); } } // The stats summary of all pairs of lint kind + rule name, whether there is only one input or multiple. let mut lint_kind_rule_pairs: Vec<_> = all_lint_kind_rule_pairs.into_iter().collect(); lint_kind_rule_pairs.sort_by(|a, b| { let (a, b) = ((&a.0, &a.1), (&b.0, &b.1)); b.1.cmp(a.1) .then_with(|| a.0.0.to_string().cmp(&b.0.0.to_string())) .then_with(|| a.0.1.cmp(&b.0.1)) }); // Format them using their colours let formatted_lint_kind_rule_pairs: Vec<(Option, String)> = lint_kind_rule_pairs .into_iter() .map(|ele| { let (r, g, b) = rgb_for_lint_kind(Some(&ele.0.0)); let ansi_prefix = format!("\x1b[38;2;{r};{g};{b}m"); ( Some(ansi_prefix), format!("«« {} {}·{} »»", ele.1, ele.0.0, ele.0.1), ) }) .collect(); if !formatted_lint_kind_rule_pairs.is_empty() { // Print them with line wrapping print_formatted_items(formatted_lint_kind_rule_pairs, color); } if !all_spellos.is_empty() { // Group by lowercase spelling while preserving original case and counts let mut grouped: HashMap> = HashMap::new(); for (spelling, count) in all_spellos { grouped .entry(spelling.to_lowercase()) .or_default() .push((spelling, count)); } // Create a vector of (lowercase_spelling, variants, total_count) let mut grouped_vec: Vec<_> = grouped .into_iter() .map(|(lower, variants)| { let total: usize = variants.iter().map(|(_, c)| c).sum(); (lower, variants, total) }) .collect(); // Sort by total count (descending), then by lowercase spelling grouped_vec.sort_by(|a, b| b.2.cmp(&a.2).then_with(|| a.0.cmp(&b.0))); // Flatten the variants back out, but keep track of the group index for coloring let spelling_vec: Vec<(Option, String)> = grouped_vec .into_iter() .enumerate() .flat_map(|(i, (_, variants, _))| { // Sort variants by count (descending) then by original spelling let mut variants = variants; variants.sort_by(|a, b| b.1.cmp(&a.1).then_with(|| a.0.cmp(&b.0))); // Choose colour based on group index (rotating through three colours) let (r, g, b) = match i % 3 { 0 => (180, 90, 150), // Magenta 1 => (90, 180, 90), // Green _ => (90, 150, 180), // Cyan }; let ansi_color = format!("\x1b[38;2;{};{};{}m", r, g, b); variants.into_iter().map(move |(spelling, c)| { ( Some(ansi_color.clone()), format!("(\u{201c}{spelling}\u{201d}: {c})"), ) }) }) .collect(); println!("All files Spelling::SpellCheck (For dialect: {})", dialect); print_formatted_items(spelling_vec, color); } } // Note: This must be kept synchronized with: // packages/lint-framework/src/lint/lintKindColor.ts // packages/web/src/lib/lintKindColor.ts // This can be removed when issue #1991 is resolved. fn lint_kind_to_rgb() -> &'static [(LintKind, (u8, u8, u8))] { &[ (LintKind::Agreement, (0x22, 0x8B, 0x22)), (LintKind::BoundaryError, (0x8B, 0x45, 0x13)), (LintKind::Capitalization, (0x54, 0x0D, 0x6E)), (LintKind::Eggcorn, (0xFF, 0x8C, 0x00)), (LintKind::Enhancement, (0x0E, 0xAD, 0x69)), (LintKind::Formatting, (0x7D, 0x3C, 0x98)), (LintKind::Grammar, (0x9B, 0x59, 0xB6)), (LintKind::Malapropism, (0xC7, 0x15, 0x85)), (LintKind::Miscellaneous, (0x3B, 0xCE, 0xAC)), (LintKind::Nonstandard, (0x00, 0x8B, 0x8B)), (LintKind::Punctuation, (0xD4, 0x85, 0x0F)), (LintKind::Readability, (0x2E, 0x8B, 0x57)), (LintKind::Redundancy, (0x46, 0x82, 0xB4)), (LintKind::Regionalism, (0xC0, 0x61, 0xCB)), (LintKind::Repetition, (0x00, 0xA6, 0x7C)), (LintKind::Spelling, (0xEE, 0x42, 0x66)), (LintKind::Style, (0xFF, 0xD2, 0x3F)), (LintKind::Typo, (0xFF, 0x6B, 0x35)), (LintKind::Usage, (0x1E, 0x90, 0xFF)), (LintKind::WordChoice, (0x22, 0x8B, 0x22)), ] } fn rgb_for_lint_kind(olk: Option<&LintKind>) -> (u8, u8, u8) { olk.and_then(|lk| { lint_kind_to_rgb() .iter() .find(|(k, _)| k == lk) .map(|(_, color)| *color) }) .unwrap_or((0, 0, 0)) } fn print_formatted_items(items: impl IntoIterator, String)>, color: bool) { let mut first_on_line = true; let mut len_so_far = 0; for (ansi, text) in items { let text_len = text.len(); let mut len_to_add = !first_on_line as usize + text_len; let mut before = ""; if len_so_far + len_to_add > 120 { before = "\n"; len_to_add -= 1; // no space before the first item len_so_far = 0; } else if !first_on_line { before = " "; } let (set, reset): (&str, &str) = if color { if let Some(prefix) = ansi.as_ref() { (prefix.as_str(), "\x1b[0m") } else { ("", "") } } else { ("", "") }; print!("{}{}{}{}", before, set, text, reset); len_so_far += len_to_add; first_on_line = false; } println!(); } ================================================ FILE: harper-cli/src/main.rs ================================================ #![doc = include_str!("../README.md")] use harper_core::spell::{Dictionary, FstDictionary, MutableDictionary, WordId}; use hashbrown::HashMap; use std::collections::BTreeMap; use std::fs::File; use std::io::{self, BufReader}; use std::path::PathBuf; // use std::sync::Arc; use std::{fs, process}; use anyhow::anyhow; use ariadne::{Color, Label, Report, ReportKind, Source}; use clap::{CommandFactory, Parser, ValueHint}; use clap_complete::{Shell, generate}; use dirs::{config_dir, data_local_dir}; use harper_core::linting::LintGroup; use harper_core::parsers::{IsolateEnglish, MarkdownOptions}; use harper_core::weir::WeirLinter; use harper_core::{ CharStringExt, Dialect, DictWordMetadata, OrthFlags, Span, TokenKind, TokenStringExt, }; #[cfg(feature = "training")] use harper_pos_utils::{BrillChunker, BrillTagger, BurnChunkerCpu}; use harper_stats::Stats; use serde::Serialize; use serde_json::Value; mod input; use input::{ AnyInput, InputTrait, single_input::{SingleInput, SingleInputOptionExt, SingleInputTrait}, }; mod annotate; use annotate::AnnotationType; mod lint; use crate::lint::{OutputFormat, lint}; use lint::LintOptions; /// A debugging tool for the Harper grammar checker. #[derive(Parser)] #[command(version, about)] struct Cli { /// Disable colored output. #[arg(long, global = true)] no_color: bool, #[command(subcommand)] command: Args, } #[derive(clap::Subcommand)] enum Args { /// Lint provided documents. Lint { /// The text or file you wish to grammar check. If not provided, it will be read from /// standard input. inputs: Vec, /// Whether to merely print out the number of errors encountered, /// without further details. Only valid with the default output format. #[arg(short, long, conflicts_with = "format")] count: bool, /// Restrict linting to only a specific set of rules. /// If omitted, `harper-cli` will run every rule. #[arg(long, value_delimiter = ',')] ignore: Option>, /// Restrict linting to only a specific set of rules. /// If omitted, `harper-cli` will run every rule. #[arg(long, value_delimiter = ',')] only: Option>, /// Overlapping lints are removed by default. This option disables that behavior. #[arg(short = 'o', long)] keep_overlapping_lints: bool, /// Specify the dialect. Common synonyms, abbreviations, and codes are supported. #[arg(short, long, default_value = "us")] dialect: String, /// Path to the user dictionary. #[arg(short, long, default_value = config_dir().unwrap().join("harper-ls/dictionary.txt").into_os_string(), value_hint = ValueHint::FilePath)] user_dict_path: PathBuf, /// Path to the directory for file-local dictionaries. #[arg(short, long, default_value = data_local_dir().unwrap().join("harper-ls/file_dictionaries/").into_os_string(), value_hint = ValueHint::FilePath)] file_dict_path: PathBuf, /// Path to a Weirpack file to load. May be supplied multiple times. #[arg(long, value_name = "WEIRPACK")] weirpacks: Vec, /// Output format for lint results. #[arg(long, value_enum, default_value_t = OutputFormat::Default)] format: OutputFormat, }, /// Parse a provided document and print the detected symbols. Parse { /// The text or file you wish to parse. If not provided, it will be read from standard /// input. input: Option, }, /// Parse a provided document and show the spans of the detected tokens. Spans { /// The file or text for which you wish to display the spans. If not provided, it will be /// read from standard input. input: Option, /// Include newlines in the output #[arg(short, long)] include_newlines: bool, }, /// Parse and annotate a provided document. Annotate { /// The text or file you wish to parse. If not provided, it will be read from standard /// input. input: Option, /// How the document should be annotated. #[arg(short, long, value_enum, default_value_t = AnnotationType::Upos)] annotation_type: AnnotationType, /// Attempt to detect and ignore non-English spans of text. #[arg(short, long)] isolate_english: bool, }, /// Get the metadata associated with one or more words. Metadata { words: Vec, /// Only show the part-of-speech flags and emojis, not the full JSON #[arg(short, long)] brief: bool, }, /// Get all the forms of a word using the affixes. Forms { line: String }, /// Emit a decompressed, line-separated list of the words in Harper's dictionary. Words, /// Summarize a lint record SummarizeLintRecord { #[arg(value_hint = ValueHint::FilePath)] file: PathBuf, }, /// Print the default config with descriptions. Config, /// Print a list of all the words in a document, sorted by frequency. MineWords { /// The document to mine words from. input: Option, }, #[cfg(feature = "training")] TrainBrillTagger { #[arg(short, long, default_value = "1.0")] candidate_selection_chance: f32, /// The path to write the final JSON model file to. output: PathBuf, /// The number of epochs (and patch rules) to train. epochs: usize, /// Path to a `.conllu` dataset to train on. #[arg(num_args = 1..)] datasets: Vec, }, #[cfg(feature = "training")] TrainBrillChunker { #[arg(short, long, default_value = "1.0")] candidate_selection_chance: f32, /// The path to write the final JSON model file to. output: PathBuf, /// The number of epochs (and patch rules) to train. epochs: usize, /// Path to a `.conllu` dataset to train on. #[arg(num_args = 1..)] datasets: Vec, }, #[cfg(feature = "training")] TrainBurnChunker { #[arg(short, long)] lr: f64, // The number of embedding dimensions #[arg(long)] dim: usize, /// The path to write the final model file to. #[arg(short, long, value_hint = ValueHint::FilePath)] output: PathBuf, /// The number of epochs to train. #[arg(short, long)] epochs: usize, /// The dropout probability #[arg(long)] dropout: f32, #[arg(short, long)] test_file: PathBuf, #[arg(num_args = 1..)] datasets: Vec, }, /// Print harper-core version. CoreVersion, /// Rename a flag in the dictionary and affixes. RenameFlag { /// The old flag. old: String, /// The new flag. new: String, #[arg(value_hint = ValueHint::DirPath)] /// The directory containing the dictionary and affixes. dir: PathBuf, }, /// Audit the `dictionary.dict` file. AuditDictionary { /// The directory containing the dictionary and affixes. #[arg(value_hint = ValueHint::DirPath)] dir: PathBuf, }, /// Emit a decompressed, line-separated list of the compounds in Harper's dictionary. /// As long as there's either an open or hyphenated spelling. Compounds, /// Emit a decompressed, line-separated list of the words in Harper's dictionary /// which occur in more than one lettercase variant. CaseVariants, /// Emit a list of each noun phrase contained within the input NominalPhrases { /// The text or file to analyze. If not provided, it will be read from standard input. input: Option, }, /// Run the tests contained within a Weir file. Test { /// The location of the Weir file to test #[arg(value_hint = ValueHint::FilePath)] input: PathBuf, }, /// Generate shell completions. #[command(hide = true)] Completion { /// Generate completions for this shell. shell: Shell, }, } fn main() -> anyhow::Result<()> { let cli = Cli::parse(); let color = !cli.no_color && std::env::var("NO_COLOR").is_err(); if !color { yansi::disable(); } let markdown_options = MarkdownOptions::default(); let curated_dictionary = FstDictionary::curated(); match cli.command { Args::Lint { inputs, count, ignore, only, keep_overlapping_lints, dialect: dialect_str, user_dict_path, file_dict_path, weirpacks, format, } => { let dialect = parse_dialect(&dialect_str) .map_err(|e| anyhow!("Invalid dialect '{}': {}", dialect_str, e))?; lint( markdown_options, curated_dictionary, inputs, LintOptions { count, ignore, only, keep_overlapping_lints, dialect, weirpack_inputs: weirpacks, color, format, }, user_dict_path, // TODO workspace_dict_path? file_dict_path, ) } Args::Parse { input } => { // Try to read from standard input if `input` was not provided. let input = input.unwrap_or_read_from_stdin(); // Load the file/text. let (doc, _) = input.load(markdown_options, &curated_dictionary)?; for token in doc.tokens() { let json = serde_json::to_string(&token)?; println!("{json}"); } Ok(()) } Args::Spans { input, include_newlines, } => { // Try to read from standard input if `input` was not provided. let input = input.unwrap_or_read_from_stdin(); // Load the file/text. let (doc, source) = input.load(markdown_options, &curated_dictionary)?; let primary_color = Color::Blue; let secondary_color = Color::Magenta; let unlintable_color = Color::Red; let input_identifier = input.get_identifier(); let mut report_builder = Report::build( ReportKind::Custom("Spans", primary_color), (&input_identifier, 0..0), ); let mut color = primary_color; for token in doc.tokens().filter(|t| { include_newlines || !matches!(t.kind, TokenKind::Newline(_) | TokenKind::ParagraphBreak) }) { report_builder = report_builder.with_label( Label::new((&input_identifier, token.span.into())) .with_message(format!("[{}, {})", token.span.start, token.span.end)) .with_color(if matches!(token.kind, TokenKind::Unlintable) { unlintable_color } else { color }), ); // Alternate colors so spans are clear color = if color == primary_color { secondary_color } else { primary_color }; } let report = report_builder.finish(); report.print((&input_identifier, Source::from(source)))?; Ok(()) } Args::Annotate { input, annotation_type, isolate_english, } => { // Try to read from standard input if `input` was not provided. let input = input.unwrap_or_read_from_stdin(); let parser = if isolate_english { Box::new(IsolateEnglish::new( input.get_parser(markdown_options), &curated_dictionary, )) } else { input.get_parser(markdown_options) }; // Load the file/text. let (doc, source) = input.load_with_parser(&parser, &curated_dictionary)?; let input_identifier = input.get_identifier(); annotation_type .build_report( &doc, &input_identifier, &annotation_type.get_title_with_tags(if isolate_english { &["Isolate english"] } else { &[] }), ) .print((&*input_identifier, Source::from(source)))?; Ok(()) } Args::Words => { let mut word_str = String::new(); for word in curated_dictionary.words_iter() { word_str.clear(); word_str.extend(word); println!("{word_str:?}"); } Ok(()) } Args::Metadata { words, brief } => { type PosPredicate = fn(&DictWordMetadata) -> bool; const POS: &[(&str, PosPredicate)] = &[ ("N📦", |m| m.is_noun() && !m.is_proper_noun()), ("O📛", DictWordMetadata::is_proper_noun), ("V🏃", DictWordMetadata::is_verb), ("J🌈", DictWordMetadata::is_adjective), ("R🤷", DictWordMetadata::is_adverb), ("C🔗", DictWordMetadata::is_conjunction), ("D👉", DictWordMetadata::is_determiner), ("P📥", |m| m.preposition), ("I👤", DictWordMetadata::is_pronoun), ]; for word in words { let meta = curated_dictionary.get_word_metadata_str(&word); let (flags, emojis) = meta.as_ref().map_or_else( || (String::new(), String::new()), |md| { POS.iter() .filter(|&(_, pred)| pred(md)) .map(|(syms, _)| { let mut ch = syms.chars(); (ch.next().unwrap(), ch.next().unwrap()) }) .unzip() }, ); let json = brief.then(String::new).unwrap_or_else(|| { format!("\n{}", serde_json::to_string_pretty(&meta).unwrap()) }); println!("{}: {} {}{}", word, flags, emojis, json); } Ok(()) } Args::SummarizeLintRecord { file } => { let file = File::open(file)?; let mut reader = BufReader::new(file); let stats = Stats::read(&mut reader)?; let summary = stats.summarize(); println!("{summary}"); Ok(()) } Args::Forms { line } => { let (word, annot) = line_to_parts(&line); let curated_word_list = include_str!("../../harper-core/dictionary.dict"); let dict_lines = curated_word_list.split('\n'); let mut entry_in_dict = None; // Check if the word is contained in the list. for dict_line in dict_lines { let (dict_word, dict_annot) = line_to_parts(dict_line); if dict_word == word { entry_in_dict = Some((dict_word, dict_annot)); break; } } let summary = match &entry_in_dict { Some((dict_word, dict_annot)) => { let mut status_summary = if dict_annot.is_empty() { format!("'{dict_word}' is already in the dictionary but not annotated.") } else { format!( "'{dict_word}' is already in the dictionary with annotation `{dict_annot}`." ) }; if !annot.is_empty() { if annot.as_str() != dict_annot.as_str() { status_summary .push_str("\n Your annotations differ from the dictionary.\n"); } else { status_summary .push_str("\n Your annotations are the same as the dictionary.\n"); } } status_summary } None => format!("'{word}' is not in the dictionary yet."), }; println!("{summary}"); if let Some((dict_word, dict_annot)) = &entry_in_dict { println!("Old, from the dictionary:"); print_word_derivations(dict_word, dict_annot, &FstDictionary::curated()); }; if !annot.is_empty() { let rune_words = format!("1\n{line}"); let dict = MutableDictionary::from_rune_files( &rune_words, include_str!("../../harper-core/annotations.json"), )?; println!("New, from you:"); print_word_derivations(&word, &annot, &dict); } Ok(()) } Args::Config => { #[derive(Serialize)] struct Config { default_value: bool, description: String, } let linter = LintGroup::new_curated(curated_dictionary, Dialect::American); let default_config: HashMap = serde_json::from_str(&serde_json::to_string(&linter.config).unwrap()).unwrap(); // Use `BTreeMap` so output is sorted by keys. let mut configs = BTreeMap::new(); for (key, desc) in linter.all_descriptions() { configs.insert( key.to_owned(), Config { default_value: default_config[key], description: desc.to_owned(), }, ); } println!("{}", serde_json::to_string_pretty(&configs).unwrap()); Ok(()) } Args::MineWords { input } => { let input = input.unwrap_or_read_from_stdin(); let (doc, _source) = input.load(MarkdownOptions::default(), &curated_dictionary)?; let mut words = HashMap::new(); for word in doc.iter_words() { let chars = doc.get_span_content(&word.span); words .entry(chars.to_lower()) .and_modify(|v| *v += 1) .or_insert(1); } let mut words_ordered: Vec<(String, usize)> = words .into_iter() .map(|(key, value)| (key.to_string(), value)) .collect(); words_ordered.sort_by_key(|v| v.1); for (word, _) in words_ordered { println!("{word}"); } Ok(()) } Args::CoreVersion => { println!("harper-core v{}", harper_core::core_version()); Ok(()) } #[cfg(feature = "training")] Args::TrainBrillTagger { datasets: dataset, epochs, output, candidate_selection_chance, } => { let tagger = BrillTagger::train(&dataset, epochs, candidate_selection_chance); fs::write(output, serde_json::to_string_pretty(&tagger)?)?; Ok(()) } #[cfg(feature = "training")] Args::TrainBrillChunker { datasets, epochs, output, candidate_selection_chance, } => { let chunker = BrillChunker::train(&datasets, epochs, candidate_selection_chance); fs::write(output, serde_json::to_string_pretty(&chunker)?)?; Ok(()) } #[cfg(feature = "training")] Args::TrainBurnChunker { datasets, test_file, epochs, dropout, output, lr, dim: embed_dim, } => { let chunker = BurnChunkerCpu::train_cpu(&datasets, &test_file, embed_dim, dropout, epochs, lr); chunker.save_to(output); Ok(()) } Args::RenameFlag { old, new, dir } => { let dict_path = dir.join("dictionary.dict"); let affixes_path = dir.join("annotations.json"); // Validate old and new flags are exactly one Unicode code point (Rust char) // And not characters used for the dictionary format const BAD_CHARS: [char; 3] = ['/', '#', ' ']; // Then use it like this: if old.chars().count() != 1 || BAD_CHARS.iter().any(|&c| old.contains(c)) { return Err(anyhow!( "Flags must be one Unicode code point, not / or # or space. Old flag '{old}' is {}", old.chars().count() )); } if new.chars().count() != 1 || BAD_CHARS.iter().any(|&c| new.contains(c)) { return Err(anyhow!( "Flags must be one Unicode code point, not / or # or space. New flag '{new}' is {}", new.chars().count() )); } // Load and parse affixes let affixes_string = fs::read_to_string(&affixes_path) .map_err(|e| anyhow!("Failed to read annotations.json: {e}"))?; let affixes_json: Value = serde_json::from_str(&affixes_string) .map_err(|e| anyhow!("Failed to parse annotations.json: {e}"))?; // Get the nested "affixes" object let affixes_obj = &affixes_json .get("affixes") .and_then(Value::as_object) .ok_or_else(|| anyhow!("annotations.json does not contain 'affixes' object"))?; let properties_obj = &affixes_json .get("properties") .and_then(Value::as_object) .ok_or_else(|| anyhow!("annotations.json does not contain 'properties' object"))?; // Validate old flag exists and get its description let old_entry = affixes_obj .get(&old) .or_else(|| properties_obj.get(&old)) .ok_or_else(|| anyhow!("Flag '{old}' not found in annotations.json"))?; let description = old_entry .get("#") .and_then(Value::as_str) .unwrap_or("(no description)"); println!("Renaming flag '{old}' ({description})"); // Validate new flag doesn't exist if let Some(new_entry) = affixes_obj.get(&new).or_else(|| properties_obj.get(&new)) { let new_desc = new_entry .get("#") .and_then(Value::as_str) .unwrap_or("(no description)"); return Err(anyhow!( "Cannot rename to '{new}': flag already exists and is used for: {new_desc}" )); } // Create backups let backup_dict = format!("{}.bak", dict_path.display()); let backup_affixes = format!("{}.bak", affixes_path.display()); fs::copy(&dict_path, &backup_dict) .map_err(|e| anyhow!("Failed to create dictionary backup: {e}"))?; fs::copy(&affixes_path, &backup_affixes) .map_err(|e| anyhow!("Failed to create affixes backup: {e}"))?; // Update dictionary with proper comment and whitespace handling let dict_content = fs::read_to_string(&dict_path) .map_err(|e| anyhow!("Failed to read dictionary: {e}"))?; let updated_dict = dict_content .lines() .map(|line| { if line.is_empty() || line.starts_with('#') { return line.to_string(); } let hash_pos = line.find('#').unwrap_or(line.len()); let (entry_part, comment_part) = line.split_at(hash_pos); let slash_pos = entry_part.find('/').unwrap_or(entry_part.len()); let (lexeme, annotation) = entry_part.split_at(slash_pos); format!( "{}{}{}", lexeme, annotation.replace(&old, &new), comment_part ) }) .collect::>() .join("\n"); // Update affixes (text-based replacement with context awareness) let updated_affixes_string = affixes_string.replace(&format!("\"{}\":", &old), &format!("\"{}\":", &new)); // Verify that the updated affixes string is valid JSON serde_json::from_str::(&updated_affixes_string) .map_err(|e| anyhow!("Failed to parse updated annotations.json: {e}"))?; // Write changes fs::write(&dict_path, updated_dict) .map_err(|e| anyhow!("Failed to write updated dictionary: {e}"))?; fs::write(&affixes_path, updated_affixes_string) .map_err(|e| anyhow!("Failed to write updated affixes: {e}"))?; println!("Successfully renamed flag '{old}' to '{new}'"); println!(" Description: {description}"); println!(" Backups created at:\n {backup_dict}\n {backup_affixes}"); Ok(()) } Args::AuditDictionary { dir } => { let annotations_path = dir.join("annotations.json"); let annotations_content = fs::read_to_string(&annotations_path) .map_err(|e| anyhow!("Failed to read annotations: {e}"))?; let annotations_json: Value = serde_json::from_str(&annotations_content) .map_err(|e| anyhow!("Failed to parse annotations.json: {e}"))?; let annotations = annotations_json .as_object() .ok_or_else(|| anyhow!("annotations.json is not an object"))?; let (affixes, properties) = ["affixes", "properties"] .iter() .map(|key| { annotations .get(*key) .and_then(Value::as_object) .ok_or_else(|| { anyhow!("Missing or invalid '{key}' key in annotations.json") }) }) .collect::, _>>() .map(|v| (v[0], v[1]))?; let all_keys = affixes.keys().chain(properties.keys()).collect::>(); let mut annotation_flag_count: HashMap = all_keys .iter() .filter_map(|key| key.chars().next()) // Get first char of each key .map(|c| (c, 0)) .collect(); // let mut duplicate_flag_total = 0; let mut duplicate_flags = std::collections::HashMap::new(); let mut unknown_flags = std::collections::HashMap::new(); let mut unused_flag_total = 0; let dict_path = dir.join("dictionary.dict"); let dict_content = fs::read_to_string(&dict_path) .map_err(|e| anyhow!("Failed to read dictionary: {e}"))?; for (line_num, line) in dict_content.lines().enumerate() { if line.is_empty() || line.starts_with('#') || line.chars().all(|c| c.is_ascii_digit()) { continue; } let (entry_part, _comment_part) = line.split_once('#').map_or((line, ""), |(e, c)| (e, c)); if let Some((lexeme, rest)) = entry_part.split_once('/') { let (annotation, _whitespace) = match rest.split_once([' ', '\t']) { Some((a, _)) => (a, &rest[a.len()..]), None => (rest, ""), }; let mut seen_flags = hashbrown::HashSet::new(); for flag in annotation.chars() { if !seen_flags.insert(flag) { eprintln!( "Warning: Line {}: Duplicate annotation flag '{}' in entry: {}/{}", line_num + 1, flag, lexeme, annotation ); // duplicate_flag_total += 1; *duplicate_flags.entry(flag).or_insert(0) += 1; } if !annotation_flag_count.contains_key(&flag) { eprintln!( "Warning: Line {}: Unknown annotation flag '{}' in entry: {}/{}", line_num + 1, flag, lexeme, annotation ); *unknown_flags.entry(flag).or_insert(0) += 1; } else { *annotation_flag_count.get_mut(&flag).unwrap() += 1; } } } } for (flag, count) in annotation_flag_count { if count == 0 { eprintln!("Warning: Unused annotation flag '{}'", flag); unused_flag_total += 1; } } let duplicate_flag_total = duplicate_flags.values().sum::(); let unknown_flag_total = unknown_flags.values().sum::(); if duplicate_flag_total > 0 || unknown_flag_total > 0 || unused_flag_total > 0 { eprintln!("\nAudit found issues:"); if duplicate_flag_total > 0 { eprintln!( " - {} duplicate flags found in {} entries", duplicate_flags.len(), duplicate_flag_total ); } if !unknown_flags.is_empty() { let total_unknown = unknown_flags.values().sum::(); eprintln!( " - {} unknown flags found in {} entries", unknown_flags.len(), total_unknown ); } if unused_flag_total > 0 { eprintln!(" - {} unused flags found", unused_flag_total); } std::process::exit(1); } Ok(()) } Args::Compounds => { let mut compound_map: HashMap> = HashMap::new(); // First pass: process open and hyphenated compounds for word in curated_dictionary.words_iter() { if !word.contains(&' ') && !word.contains(&'-') { continue; } let normalized_key: String = word .iter() .filter(|&&c| c != ' ' && c != '-') .collect::() .to_lowercase(); let word_str = word.iter().collect::(); compound_map .entry(normalized_key) .or_default() .push(word_str); } // Second pass: process closed compounds for word in curated_dictionary.words_iter() { if word.contains(&' ') || word.contains(&'-') { continue; } let normalized_key: String = word.iter().collect::().to_lowercase(); if let Some(variants) = compound_map.get_mut(&normalized_key) { variants.push(word.iter().collect()); } } // Process and print results let mut results: Vec<_> = compound_map .into_iter() .filter(|(_, v)| v.len() > 1) .collect(); results.sort_by_key(|(k, _)| k.clone()); // Instead of moving `results` into the for loop, iterate over a reference to it for (normalized, originals) in &results { println!("\nVariants for '{normalized}':"); for original in originals { println!(" - {original}"); } } println!("\nFound {} compound word groups", results.len()); Ok(()) } Args::CaseVariants => { let case_bitmask = OrthFlags::LOWERCASE | OrthFlags::TITLECASE | OrthFlags::ALLCAPS | OrthFlags::LOWER_CAMEL | OrthFlags::UPPER_CAMEL; let mut processed_words = HashMap::new(); let mut longest_word = 0; for word in curated_dictionary.words_iter() { if let Some(metadata) = curated_dictionary.get_word_metadata(word) { let orth = metadata.orth_info; let bits = orth.bits() & case_bitmask.bits(); if bits.count_ones() > 1 { longest_word = longest_word.max(word.len()); // Mask out all bits except the case-related ones before printing processed_words.insert( word.to_string(), OrthFlags::from_bits_truncate(orth.bits() & case_bitmask.bits()), ); } } } let mut processed_words: Vec<_> = processed_words.into_iter().collect(); processed_words.sort_by_key(|(word, _)| word.clone()); let longest_num = (processed_words.len() - 1).to_string().len(); for (i, (word, orth)) in processed_words.iter().enumerate() { println!("{i:>longest_num$} {word: { // Get input from either file or direct text let (doc, _) = input .unwrap_or_read_from_stdin() .load(MarkdownOptions::default(), &curated_dictionary)?; let phrases: Vec<_> = doc .iter_nominal_phrases() .map(|toks| { ( toks.first().unwrap().span.start, toks.last().unwrap().span.end, ) }) .collect(); let mut last_end = 0; for (start, end) in phrases { // Plain text between nominal phrases if start > last_end { let span = Span::new(last_end, start); let txt = doc.get_span_content_str(&span); if !txt.trim().is_empty() { print!("{}", txt); } } // Highlighted nominal phrase let span = Span::new(start, end); let txt = doc.get_span_content_str(&span); if color { print!("\x1b[33m{}\x1b[0m", txt); } else { print!("{}", txt); } last_end = end; } // Plain text after the last nominal phrase, if any let doc_len = doc.get_full_content().len(); if last_end < doc_len { let span = Span::new(last_end, doc_len); let txt = doc.get_span_content_str(&span); if !txt.trim().is_empty() { print!("{}", txt); } } println!(); Ok(()) } Args::Test { input } => { let weir_file = fs::read_to_string(input)?; let mut linter = WeirLinter::new(&weir_file)?; let failing_tests = linter.run_tests(); if failing_tests.is_empty() { eprintln!("All tests pass!"); Ok(()) } else { eprintln!("{:?}", failing_tests); process::exit(1); } } Args::Completion { shell } => { generate( shell, &mut Cli::command(), env!("CARGO_BIN_NAME"), &mut io::stdout(), ); Ok(()) } } } /// Parse a dialect string into a Dialect enum value. /// Supports common synonyms, abbreviations, and codes. fn parse_dialect(dialect: &str) -> anyhow::Result { match dialect.to_lowercase().as_str() { "us" | "usa" | "america" | "american" | "en-us" | "en_us" => Ok(Dialect::American), "uk" | "gb" | "british" | "britain" | "en-gb" | "en_gb" => Ok(Dialect::British), "au" | "aus" | "australia" | "australian" | "en-au" | "en_au" => Ok(Dialect::Australian), "in" | "india" | "indian" | "bharat" | "en-in" | "en_in" => Ok(Dialect::Indian), "ca" | "canada" | "canadian" | "en-ca" | "en_ca" => Ok(Dialect::Canadian), _ => Err(anyhow!("Unknown dialect: {}", dialect)), } } /// Split a dictionary line into its word and annotation segments fn line_to_parts(line: &str) -> (String, String) { if let Some((word, annot)) = line.split_once('/') { (word.to_owned(), annot.to_string()) } else { (line.to_owned(), String::new()) } } fn print_word_derivations(word: &str, annot: &str, dictionary: &impl Dictionary) { println!("{word}/{annot}"); let id = WordId::from_word_str(word); let children = dictionary .words_iter() .filter(|e| dictionary.get_word_metadata(e).unwrap().derived_from == Some(id)); println!(" - {word}"); for child in children { let child_str: String = child.iter().collect(); println!(" - {child_str}"); } } ================================================ FILE: harper-cli/tests/no_color.rs ================================================ use std::process::Command; fn harper_cli() -> Command { Command::new(env!("CARGO_BIN_EXE_harper-cli")) } /// Input that triggers at least one lint ("an test" → AnA rule). const BAD_INPUT: &str = "This is an test."; fn has_ansi(bytes: &[u8]) -> bool { bytes.contains(&0x1b) } #[test] fn default_output_contains_ansi() { let output = harper_cli() .args(["lint", BAD_INPUT]) .env_remove("NO_COLOR") .output() .unwrap(); let combined = [&output.stdout[..], &output.stderr[..]].concat(); assert!( has_ansi(&combined), "default output should contain ANSI escape codes" ); } #[test] fn no_color_flag_strips_ansi() { let output = harper_cli() .args(["--no-color", "lint", BAD_INPUT]) .env_remove("NO_COLOR") .output() .unwrap(); let combined = [&output.stdout[..], &output.stderr[..]].concat(); assert!( !has_ansi(&combined), "--no-color output should not contain ANSI escape codes" ); } #[test] fn no_color_env_strips_ansi() { let output = harper_cli() .env("NO_COLOR", "1") .args(["lint", BAD_INPUT]) .output() .unwrap(); let combined = [&output.stdout[..], &output.stderr[..]].concat(); assert!( !has_ansi(&combined), "NO_COLOR=1 output should not contain ANSI escape codes" ); } ================================================ FILE: harper-cli/tests/output_format.rs ================================================ use std::io::Write; use std::process::Command; fn harper_cli() -> Command { Command::new(env!("CARGO_BIN_EXE_harper-cli")) } /// Input that triggers at least one lint ("an test" → AnA rule). const BAD_INPUT: &str = "This is an test."; #[test] fn json_format_is_valid_json() { let output = harper_cli() .args(["--no-color", "lint", "--format", "json", BAD_INPUT]) .output() .unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); let parsed: serde_json::Value = serde_json::from_str(&stdout) .unwrap_or_else(|e| panic!("invalid JSON output: {e}\nstdout: {stdout}")); let arr = parsed.as_array().expect("top-level should be an array"); assert_eq!(arr.len(), 1, "single input should produce one result"); let first = &arr[0]; assert!( first.get("file").is_some(), "result should have a 'file' field" ); assert!( first.get("lint_count").is_some(), "result should have a 'lint_count' field" ); assert!( first.get("lints").is_some(), "result should have a 'lints' field" ); let lints = first["lints"].as_array().unwrap(); assert!(!lints.is_empty(), "should have at least one lint"); let lint = &lints[0]; assert!(lint.get("rule").is_some()); assert!(lint.get("kind").is_some()); assert!(lint.get("line").is_some()); assert!(lint.get("column").is_some()); assert!(lint.get("message").is_some()); assert!(lint.get("suggestions").is_some()); } #[test] fn json_format_no_ansi() { let output = harper_cli() .args(["lint", "--format", "json", BAD_INPUT]) .env_remove("NO_COLOR") .output() .unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); // Check raw bytes for ESC assert!( !output.stdout.contains(&0x1b), "JSON output should never contain raw ANSI escape bytes" ); // Also check for escaped ANSI in JSON string values (e.g. \\u001b) assert!( !stdout.contains("\\u001b") && !stdout.contains("\\x1b"), "JSON output should not contain escaped ANSI sequences in values" ); } /// Regression test: directory inputs with color enabled must not leak /// ANSI escapes into JSON `file` fields or compact output paths. #[test] fn json_directory_paths_no_ansi() { let dir = tempfile::tempdir().unwrap(); let file_path = dir.path().join("bad.md"); { let mut f = std::fs::File::create(&file_path).unwrap(); write!(f, "{BAD_INPUT}").unwrap(); } // Run with color explicitly enabled (no --no-color, NO_COLOR removed) let output = harper_cli() .args(["lint", "--format", "json", dir.path().to_str().unwrap()]) .env_remove("NO_COLOR") .output() .unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); let parsed: serde_json::Value = serde_json::from_str(&stdout) .unwrap_or_else(|e| panic!("invalid JSON from directory lint: {e}\nstdout: {stdout}")); let arr = parsed.as_array().expect("top-level should be an array"); assert!(!arr.is_empty(), "should have at least one file result"); for entry in arr { let file_val = entry["file"].as_str().expect("file should be a string"); assert!( !file_val.contains('\x1b'), "JSON file field must not contain ANSI escapes, got: {file_val:?}" ); } } #[test] fn compact_directory_paths_no_ansi() { let dir = tempfile::tempdir().unwrap(); let file_path = dir.path().join("bad.md"); { let mut f = std::fs::File::create(&file_path).unwrap(); write!(f, "{BAD_INPUT}").unwrap(); } // Run with color explicitly enabled let output = harper_cli() .args(["lint", "--format", "compact", dir.path().to_str().unwrap()]) .env_remove("NO_COLOR") .output() .unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); assert!( !stdout.contains('\x1b'), "compact output must not contain ANSI escapes in paths" ); } #[test] fn compact_format_one_line_per_lint() { let output = harper_cli() .args(["--no-color", "lint", "--format", "compact", BAD_INPUT]) .output() .unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); let lines: Vec<&str> = stdout.lines().collect(); assert!( !lines.is_empty(), "compact output should have at least one line" ); for line in &lines { // Each line should match the pattern: source:line:col: Kind::Rule: message let parts: Vec<&str> = line.splitn(4, ':').collect(); assert!( parts.len() >= 4, "compact line should have at least 4 colon-separated parts: {line}" ); } } #[test] fn default_format_unchanged() { let output = harper_cli() .args(["--no-color", "lint", "--format", "default", BAD_INPUT]) .output() .unwrap(); let stdout = String::from_utf8_lossy(&output.stdout); // Default format should include the Ariadne report header and lint count assert!( stdout.contains("lints") || stdout.contains("No lints found"), "default format should include lint count summary" ); } ================================================ FILE: harper-comments/Cargo.toml ================================================ [package] name = "harper-comments" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" readme = "README.md" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-html = { path = "../harper-html", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } itertools = "0.14.0" tree-sitter = "0.25.10" tree-sitter-bash = "0.25.1" tree-sitter-c = "0.24.1" tree-sitter-cmake = "0.7.1" tree-sitter-cpp = "0.23.4" tree-sitter-c-sharp = "0.23.1" tree-sitter-go = "0.25.0" tree-sitter-groovy = "0.1.2" tree-sitter-haskell = "0.23.1" tree-sitter-java = "0.23.5" tree-sitter-javascript = "0.25.0" tree-sitter-kotlin-ng = "1.1.0" tree-sitter-lua = "0.5.0" tree-sitter-nix = "0.3.0" tree-sitter-php = "0.24.2" tree-sitter-powershell = "0.26.3" tree-sitter-ruby = "0.23.1" tree-sitter-rust = "0.24.0" tree-sitter-scala = "0.24.0" tree-sitter-solidity = "1.2.13" tree-sitter-swift = "0.7.1" tree-sitter-toml-ng = "0.7.0" tree-sitter-typescript = "0.23.2" harper-tree-sitter-dart = "0.0.5" tree-sitter-clojure = "0.1.0" tree-sitter-zig = "1.1.2" [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-comments/README.md ================================================ # `harper-comments` This crate holds a number of functions, but it is primarily a wrapper around `tree-sitter` that allows Harper to locate the comments of a wide variety of programming languages. It also has purpose-built parsers for the structured comments of a number of languages, including Go. These additional parsers are available through the `CommentParser` and are enabled automatically through there. ================================================ FILE: harper-comments/src/comment_parser.rs ================================================ use std::path::Path; use crate::comment_parsers; use comment_parsers::{Go, JavaDoc, JsDoc, Lua, Solidity, Unit}; use harper_core::Token; use harper_core::parsers::{self, MarkdownOptions, Parser}; use harper_core::spell::MutableDictionary; use tree_sitter::Node; use crate::masker::CommentMasker; pub struct CommentParser { inner: parsers::Mask>, } impl CommentParser { pub fn create_ident_dict(&self, source: &[char]) -> Option { self.inner.masker.create_ident_dict(source) } pub fn new_from_language_id( language_id: &str, markdown_options: MarkdownOptions, ) -> Option { let language = match language_id { "c" => tree_sitter_c::LANGUAGE, "clojure" => tree_sitter_clojure::LANGUAGE, "cmake" => tree_sitter_cmake::LANGUAGE, "cpp" => tree_sitter_cpp::LANGUAGE, "csharp" => tree_sitter_c_sharp::LANGUAGE, "dart" => harper_tree_sitter_dart::LANGUAGE, "go" => tree_sitter_go::LANGUAGE, "groovy" => tree_sitter_groovy::LANGUAGE, "haskell" => tree_sitter_haskell::LANGUAGE, "daml" => tree_sitter_haskell::LANGUAGE, "java" => tree_sitter_java::LANGUAGE, "javascript" => tree_sitter_javascript::LANGUAGE, "javascriptreact" => tree_sitter_typescript::LANGUAGE_TSX, "kotlin" => tree_sitter_kotlin_ng::LANGUAGE, "lua" => tree_sitter_lua::LANGUAGE, "nix" => tree_sitter_nix::LANGUAGE, "php" => tree_sitter_php::LANGUAGE_PHP, "powershell" => tree_sitter_powershell::LANGUAGE, "ruby" => tree_sitter_ruby::LANGUAGE, "rust" => tree_sitter_rust::LANGUAGE, "scala" => tree_sitter_scala::LANGUAGE, "shellscript" => tree_sitter_bash::LANGUAGE, "solidity" => tree_sitter_solidity::LANGUAGE, "swift" => tree_sitter_swift::LANGUAGE, "toml" => tree_sitter_toml_ng::LANGUAGE, "typescript" => tree_sitter_typescript::LANGUAGE_TYPESCRIPT, "typescriptreact" => tree_sitter_typescript::LANGUAGE_TSX, "zig" => tree_sitter_zig::LANGUAGE, _ => return None, }; let comment_parser: Box = match language_id { "go" => Box::new(Go::new_markdown(markdown_options)), "java" => Box::new(JavaDoc::default()), "javascript" | "javascriptreact" | "typescript" | "typescriptreact" => { Box::new(JsDoc::new_markdown(markdown_options)) } "lua" => Box::new(Lua::new_markdown(markdown_options)), "solidity" => Box::new(Solidity::new_markdown(markdown_options)), _ => Box::new(Unit::new_markdown(markdown_options)), }; Some(Self { inner: parsers::Mask::new( CommentMasker::new(language.into(), Self::node_condition), comment_parser, ), }) } /// Infer the programming language from a provided filename. pub fn new_from_filename(filename: &Path, markdown_options: MarkdownOptions) -> Option { Self::new_from_language_id(Self::filename_to_filetype(filename)?, markdown_options) } /// Convert a provided path to a corresponding Language Server Protocol file /// type. /// /// Note to contributors: try to keep this in sync with /// [`Self::new_from_language_id`] fn filename_to_filetype(path: &Path) -> Option<&'static str> { Some(match path.extension()?.to_str()? { "c" => "c", "bb" | "cljc" | "cljd" | "clj" | "cljs" => "clojure", "cmake" => "cmake", "cpp" | "h" => "cpp", "cs" => "csharp", "dart" => "dart", "go" => "go", "groovy" | "gradle" => "groovy", "hs" => "haskell", "daml" => "daml", "java" => "java", "js" => "javascript", "jsx" => "javascriptreact", "kt" | "kts" => "kotlin", "lua" => "lua", "nix" => "nix", "php" => "php", "ps1" | "psd1" | "psm1" => "powershell", "rb" => "ruby", "rs" => "rust", "sbt" | "sc" | "scala" | "mill" => "scala", "bash" | "sh" => "shellscript", "sol" => "solidity", "swift" => "swift", "toml" => "toml", "ts" => "typescript", "tsx" => "typescriptreact", "zig" => "zig", _ => return None, }) } fn node_condition(n: &Node) -> bool { n.kind().contains("comment") } } impl Parser for CommentParser { fn parse(&self, source: &[char]) -> Vec { self.inner.parse(source) } } #[cfg(test)] mod tests { use super::CommentParser; use harper_core::parsers::{MarkdownOptions, StrParser}; #[test] fn hang() { use std::sync::mpsc::channel; use std::thread; use std::time::Duration; let (tx, rx) = channel::<()>(); let handle = thread::spawn(move || { let opts = MarkdownOptions::default(); let parser = CommentParser::new_from_language_id("java", opts).unwrap(); let _res = parser.parse_str("//{@j"); tx.send(()).expect("send failed"); }); rx.recv_timeout(Duration::from_secs(10)).expect("timed out"); handle.join().expect("failed to join"); } } ================================================ FILE: harper-comments/src/comment_parsers/go.rs ================================================ use harper_core::Lrc; use harper_core::Token; use harper_core::parsers::{Markdown, MarkdownOptions, Parser}; use super::without_initiators; #[derive(Clone)] pub struct Go { inner: Lrc, } impl Go { pub fn new(parser: Lrc) -> Self { Self { inner: parser } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self::new(Lrc::new(Markdown::new(markdown_options))) } } impl Parser for Go { fn parse(&self, source: &[char]) -> Vec { let mut actual = without_initiators(source); let mut actual_source = actual.get_content(source); if matches!(actual_source, ['g', 'o', ':', ..]) { let Some(terminator) = source.iter().position(|c| *c == '\n') else { return Vec::new(); }; actual.start += terminator; let Some(new_source) = actual.try_get_content(actual_source) else { return Vec::new(); }; actual_source = new_source } let mut new_tokens = self.inner.parse(actual_source); new_tokens .iter_mut() .for_each(|t| t.span.push_by(actual.start)); new_tokens } } ================================================ FILE: harper-comments/src/comment_parsers/javadoc.rs ================================================ use std::collections::VecDeque; use harper_core::parsers::Parser; use harper_core::{Punctuation, Token, TokenKind, VecExt}; use harper_html::HtmlParser; use super::without_initiators; #[derive(Default)] pub struct JavaDoc { html_parser: HtmlParser, } impl Parser for JavaDoc { fn parse(&self, source: &[char]) -> Vec { let actual = without_initiators(source); let actual_source = actual.get_content(source); let mut tokens = self.html_parser.parse(actual_source); // We need to remove leading spaces and stars from the block of tokens. let mut remove_these: VecDeque = VecDeque::new(); let mut cursor = 0; while cursor < tokens.len() { let maybe_newline = &tokens[cursor]; if let TokenKind::Newline(_) = maybe_newline.kind { cursor += 1; loop { if cursor >= tokens.len() { break; } let maybe_removable = &tokens[cursor]; if matches!( maybe_removable.kind, TokenKind::Punctuation(Punctuation::Star) | TokenKind::Space(_) ) { remove_these.push_back(cursor); cursor += 1; } else { break; } } } else { cursor += 1; } } tokens.remove_indices(remove_these); for token in tokens.iter_mut() { token.span.push_by(actual.start); } super::jsdoc::mark_inline_tags(&mut tokens); // Mark @tags as unlintable for i in 3..tokens.len() { let a = &tokens[i - 3]; let b = &tokens[i - 2]; let c = &tokens[i - 1]; let d = &tokens[i]; if a.kind.is_at() && b.kind.is_word() && c.kind.is_space() && d.kind.is_word() { tokens[i - 3].kind = TokenKind::Unlintable; tokens[i - 2].kind = TokenKind::Unlintable; tokens[i - 1].kind = TokenKind::Unlintable; tokens[i].kind = TokenKind::Unlintable; } } tokens } } ================================================ FILE: harper-comments/src/comment_parsers/jsdoc.rs ================================================ use harper_core::Lrc; use harper_core::parsers::{Markdown, MarkdownOptions, Parser}; use harper_core::{Punctuation, Span, Token, TokenKind}; use itertools::Itertools; use super::without_initiators; #[derive(Clone)] pub struct JsDoc { inner: Lrc, } impl JsDoc { pub fn new(parser: Lrc) -> Self { Self { inner: parser } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self::new(Lrc::new(Markdown::new(markdown_options))) } } impl Parser for JsDoc { fn parse(&self, source: &[char]) -> Vec { let mut tokens = Vec::new(); let mut chars_traversed = 0; for line in source.split(|c| *c == '\n') { let mut new_tokens = parse_line(line, self.inner.clone()); if chars_traversed + line.len() < source.len() { new_tokens.push(Token::new( Span::new_with_len(line.len(), 1), harper_core::TokenKind::Newline(1), )); } new_tokens .iter_mut() .for_each(|t| t.span.push_by(chars_traversed)); chars_traversed += line.len() + 1; tokens.append(&mut new_tokens); } tokens } } fn parse_line(source: &[char], parser: Lrc) -> Vec { let actual_line = without_initiators(source); if actual_line.is_empty() { return vec![]; } let source_line = actual_line.get_content(source); let mut new_tokens = parser.parse(source_line); // Handle inline tags mark_inline_tags(&mut new_tokens); // Handle the block tag, if it exists on the current line. if let Some(tag_start) = new_tokens.iter().tuple_windows().position(|(a, b)| { matches!( (a, b), ( Token { kind: TokenKind::Punctuation(Punctuation::At), .. }, Token { kind: TokenKind::Word(..), .. } ) ) }) { for token in &mut new_tokens[tag_start..] { token.kind = TokenKind::Unlintable; } } for token in new_tokens.iter_mut() { token.span.push_by(actual_line.start); } new_tokens } /// Locate all inline tags (i.e. `{@tag ..}`) and mark them as unlintable pub(super) fn mark_inline_tags(tokens: &mut [Token]) { let mut cursor = 0; loop { if cursor >= tokens.len() { break; } if let Some(new_cursor) = &tokens[cursor..] .iter() .position(|t| t.kind == TokenKind::Punctuation(Punctuation::OpenCurly)) .map(|i| i + cursor) { cursor = *new_cursor; } else { break; } if let Some(p) = parse_inline_tag(&tokens[cursor..]) { for tok in &mut tokens[cursor..cursor + p] { tok.kind = TokenKind::Unlintable; } cursor += p; continue; } cursor += 1; } } /// Checks if the provided token slice begins with an inline tag, returning its /// end if so. fn parse_inline_tag(tokens: &[Token]) -> Option { if !matches!( tokens, [ Token { kind: TokenKind::Punctuation(Punctuation::OpenCurly), .. }, Token { kind: TokenKind::Punctuation(Punctuation::At), .. }, Token { kind: TokenKind::Word(..), .. }, .., ] ) { return None; } if tokens.len() <= 3 { return None; } let mut cursor = 3; while cursor < tokens.len() && !matches!( tokens.get(cursor), Some(Token { kind: TokenKind::Punctuation(Punctuation::CloseCurly), .. }) ) { cursor += 1; } Some(cursor + 1) } #[cfg(test)] mod tests { use harper_core::{Document, Punctuation, TokenKind, parsers::MarkdownOptions}; use crate::CommentParser; #[test] fn escapes_loop() { let source = "/** This should _not_cause an infinite loop: {@ */"; let parser = CommentParser::new_from_language_id("javascript", MarkdownOptions::default()).unwrap(); Document::new_curated(source, &parser); } #[test] fn handles_inline_link() { let source = "/** See {@link MyClass} and [MyClass's foo property]{@link MyClass#foo}. */"; let parser = CommentParser::new_from_language_id("javascript", MarkdownOptions::default()).unwrap(); let document = Document::new_curated(source, &parser); assert!(matches!( document .tokens() .map(|t| t.kind.clone()) .collect::>() .as_slice(), &[ TokenKind::Word(..), TokenKind::Space(1), TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Space(1), TokenKind::Word(..), TokenKind::Space(1), TokenKind::Punctuation(Punctuation::OpenSquare), TokenKind::Word(..), TokenKind::Space(1), TokenKind::Word(..), TokenKind::Space(1), TokenKind::Word(..), TokenKind::Punctuation(Punctuation::CloseSquare), TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Unlintable, TokenKind::Punctuation(Punctuation::Period), ] )); } #[test] fn handles_class() { let source = "/** @class Circle representing a circle. */"; let parser = CommentParser::new_from_language_id("javascript", MarkdownOptions::default()).unwrap(); let document = Document::new_curated(source, &parser); assert!( document.tokens().all(|t| t.kind.is_unlintable() || t.kind.is_newline() || t.kind.is_paragraph_break()) ); } } ================================================ FILE: harper-comments/src/comment_parsers/lua.rs ================================================ use harper_core::Lrc; use harper_core::Span; use harper_core::Token; use harper_core::parsers::{Markdown, MarkdownOptions, Parser}; use super::without_initiators; #[derive(Clone)] pub struct Lua { inner: Lrc, } impl Lua { pub fn new(parser: Lrc) -> Self { Self { inner: parser } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self::new(Lrc::new(Markdown::new(markdown_options))) } } impl Parser for Lua { fn parse(&self, source: &[char]) -> Vec { let mut tokens = Vec::new(); let mut chars_traversed = 0; for line in source.split(|c| *c == '\n') { if starts_with_prefix(line) { tokens.push(Token::new( Span::empty(chars_traversed), harper_core::TokenKind::Newline(2), )); chars_traversed += line.len() + 1; continue; } let mut new_tokens = parse_line(line, self.inner.clone()); if chars_traversed + line.len() < source.len() { new_tokens.push(Token::new( Span::new_with_len(line.len(), 1), harper_core::TokenKind::Newline(1), )); } new_tokens .iter_mut() .for_each(|t| t.span.push_by(chars_traversed)); chars_traversed += line.len() + 1; tokens.append(&mut new_tokens); } tokens } } fn starts_with_prefix(source: &[char]) -> bool { let actual = without_initiators(source); let actual_chars = actual.get_content(source); matches!(actual_chars, ['@', ..]) } fn parse_line(source: &[char], parser: Lrc) -> Vec { let actual = without_initiators(source); if actual.is_empty() { return Vec::new(); } let source = actual.get_content(source); let mut new_tokens = parser.parse(source); new_tokens .iter_mut() .for_each(|t| t.span.push_by(actual.start)); new_tokens } ================================================ FILE: harper-comments/src/comment_parsers/mod.rs ================================================ mod go; mod javadoc; mod jsdoc; mod lua; mod solidity; mod unit; pub use go::Go; use harper_core::Span; pub use javadoc::JavaDoc; pub use jsdoc::JsDoc; pub use lua::Lua; pub use solidity::Solidity; pub use unit::Unit; /// Get the span of a tree-sitter-produced comment that doesn't include the /// comment openers and closers. fn without_initiators(source: &[char]) -> Span { // Skip over the comment start characters let actual_start = source .iter() .position(|c| !is_comment_character(*c) && !c.is_whitespace()) .unwrap_or(source.len()); // Chop off the end let actual_end = source.len() - source .iter() .rev() .position(|c| !is_comment_character(*c) && !c.is_whitespace()) .unwrap_or(0); Span::new(actual_start, actual_end) } fn is_comment_character(c: char) -> bool { matches!(c, '#' | '-' | '/' | '*' | '!') } #[cfg(test)] mod tests { use super::without_initiators; #[test] fn cleans_empty_comment() { let source: Vec<_> = "///".chars().collect(); assert_eq!(without_initiators(&source).len(), 0); } #[test] fn cleans_empty_comment_with_whitespace() { let source: Vec<_> = "/// ".chars().collect(); assert_eq!(without_initiators(&source).len(), 0); } } ================================================ FILE: harper-comments/src/comment_parsers/solidity.rs ================================================ use harper_core::Lrc; use harper_core::Span; use harper_core::Token; use harper_core::parsers::{MarkdownOptions, Parser}; use super::jsdoc::JsDoc; use super::without_initiators; #[derive(Clone)] pub struct Solidity { inner: Lrc, } impl Solidity { pub fn new(parser: Lrc) -> Self { Self { inner: parser } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self::new(Lrc::new(JsDoc::new_markdown(markdown_options))) } } impl Parser for Solidity { fn parse(&self, source: &[char]) -> Vec { let mut tokens = Vec::new(); let mut chars_traversed = 0; for line in source.split(|c| *c == '\n') { let mut new_tokens = parse_line(line, self.inner.clone()); if chars_traversed + line.len() < source.len() { new_tokens.push(Token::new( Span::new_with_len(line.len(), 1), harper_core::TokenKind::Newline(1), )); } new_tokens .iter_mut() .for_each(|t| t.span.push_by(chars_traversed)); chars_traversed += line.len() + 1; tokens.append(&mut new_tokens); } tokens } } fn parse_line(source: &[char], parser: Lrc) -> Vec { let mut actual = without_initiators(source); if actual.is_empty() { return Vec::new(); } let mut actual_source = actual.get_content(source); // ignore the special SPDX-License-Identifier comment if actual_source.starts_with(&['S', 'P', 'D', 'X', '-']) { let Some(terminator) = source.iter().position(|c| *c == '\n') else { return Vec::new(); }; actual.start += terminator; let Some(new_source) = actual.try_get_content(actual_source) else { return Vec::new(); }; actual_source = new_source } let mut new_tokens = parser.parse(actual_source); new_tokens .iter_mut() .for_each(|t| t.span.push_by(actual.start)); new_tokens } ================================================ FILE: harper-comments/src/comment_parsers/unit.rs ================================================ use harper_core::Lrc; use harper_core::parsers::{Markdown, MarkdownOptions, Parser}; use harper_core::{Span, Token}; use super::without_initiators; /// A comment parser that strips starting `/` and `*` characters. /// /// It is meant to cover _most_ cases in _most_ programming languages. /// /// It assumes it is being provided a single line of comment at a time, /// including the comment initiation characters. #[derive(Clone)] pub struct Unit { inner: Lrc, } impl Unit { pub fn new(parser: Lrc) -> Self { Self { inner: parser } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self::new(Lrc::new(Markdown::new(markdown_options))) } } impl Parser for Unit { fn parse(&self, source: &[char]) -> Vec { let mut tokens = Vec::new(); let mut chars_traversed = 0; let mut in_code_fence = false; for line in source.split(|c| *c == '\n') { if line_is_code_fence(line) { in_code_fence = !in_code_fence; } if in_code_fence { chars_traversed += line.len() + 1; continue; } let mut new_tokens = parse_line(line, self.inner.clone()); if chars_traversed + line.len() < source.len() { new_tokens.push(Token::new( Span::new_with_len(line.len(), 1), harper_core::TokenKind::Newline(1), )); } new_tokens .iter_mut() .for_each(|t| t.span.push_by(chars_traversed)); chars_traversed += line.len() + 1; tokens.append(&mut new_tokens); } tokens } } fn parse_line(source: &[char], parser: Lrc) -> Vec { let actual = without_initiators(source); if actual.is_empty() { return Vec::new(); } let source = actual.get_content(source); let mut new_tokens = parser.parse(source); new_tokens .iter_mut() .for_each(|t| t.span.push_by(actual.start)); new_tokens } fn line_is_code_fence(source: &[char]) -> bool { let actual = without_initiators(source); let actual_chars = actual.get_content(source); matches!(actual_chars, ['`', '`', '`', ..]) } ================================================ FILE: harper-comments/src/lib.rs ================================================ #![doc = include_str!("../README.md")] mod comment_parser; mod comment_parsers; mod masker; pub use comment_parser::CommentParser; ================================================ FILE: harper-comments/src/masker.rs ================================================ use harper_core::Masker; use harper_core::spell::MutableDictionary; use harper_tree_sitter::TreeSitterMasker; pub struct CommentMasker { inner: TreeSitterMasker, ignore_condition: Box bool + Send + Sync>, } impl CommentMasker { pub fn create_ident_dict(&self, source: &[char]) -> Option { self.inner.create_ident_dict(source) } pub fn new( language: tree_sitter::Language, ts_node_condition: fn(&tree_sitter::Node) -> bool, ) -> Self { Self::new_with_ignore_condition( language, ts_node_condition, Box::new(|text| { text.contains("spellchecker:ignore") || text.contains("spellchecker: ignore") || text.contains("spell-checker:ignore") || text.contains("spell-checker: ignore") || text.contains("spellcheck:ignore") || text.contains("spellcheck: ignore") || text.contains("harper:ignore") || text.contains("harper: ignore") || text.starts_with("#!") }), ) } pub fn new_with_ignore_condition( language: tree_sitter::Language, ts_node_condition: fn(&tree_sitter::Node) -> bool, ignore_condition: Box bool + Send + Sync>, ) -> Self { Self { inner: TreeSitterMasker::new(language, ts_node_condition), ignore_condition, } } } impl Masker for CommentMasker { fn create_mask(&self, source: &[char]) -> harper_core::Mask { self.inner .create_mask(source) .iter_allowed(source) .map(|(span, chars)| (span, chars.iter().collect::())) .filter(|(_, text)| !(self.ignore_condition)(text)) .map(|(span, _)| span) .collect() } } ================================================ FILE: harper-comments/tests/language_support.rs ================================================ use std::path::Path; use harper_comments::CommentParser; use harper_core::linting::{LintGroup, Linter}; use harper_core::parsers::MarkdownOptions; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; /// Creates a unit test checking that the linting of a source file in /// `language_support_sources` produces the expected number of lints. macro_rules! create_test { ($filename:ident.$ext:ident, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let filename = concat!(stringify!($filename), ".", stringify!($ext)); let source = include_str!( concat!( "./language_support_sources/", concat!( stringify!($filename), ".", stringify!($ext)) ) ); let parser = CommentParser::new_from_filename(Path::new(filename), MarkdownOptions::default()).unwrap(); let dict = FstDictionary::curated(); let document = Document::new(&source, &parser, &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(multiline_comments.cpp, 4); create_test!(multiline_comments.ts, 4); create_test!(multiline_comments.sol, 4); create_test!(clean.lua, 0); create_test!(dirty.lua, 1); create_test!(clean.rs, 0); create_test!(clean.sol, 0); create_test!(clean.ps1, 0); create_test!(jsdoc.ts, 4); create_test!(issue_96.lua, 0); create_test!(merged_lines.ts, 1); create_test!(javadoc_clean_simple.java, 0); create_test!(javadoc_complex.java, 5); create_test!(issue_132.rs, 1); create_test!(laravel_app.php, 2); create_test!(ignore_shebang_1.sh, 0); create_test!(ignore_shebang_2.sh, 0); create_test!(ignore_shebang_3.sh, 0); create_test!(ignore_shebang_4.sh, 1); create_test!(common.mill, 1); create_test!(basic_kotlin.kt, 0); create_test!(basic_groovy.groovy, 1); create_test!(complex_groovy_block_comments.groovy, 1); create_test!(complex_gradle_build.gradle, 1); create_test!(complex_groovy_strings_regex.groovy, 1); create_test!(issue_1097.lua, 0); create_test!(basic.clj, 12); // Checks that some comments are masked out create_test!(ignore_comments.rs, 1); create_test!(ignore_comments.c, 1); create_test!(ignore_comments.sol, 1); create_test!(ignore_comments.ps1, 1); // Zig tests - covering //, ///, and //! comments create_test!(clean.zig, 0); create_test!(dirty.zig, 5); // These are to make sure nothing crashes. create_test!(empty.js, 0); create_test!(issue_229.js, 0); create_test!(issue_229.c, 0); create_test!(issue_229.cs, 0); create_test!(eof.rs, 0); ================================================ FILE: harper-comments/tests/language_support_sources/basic.clj ================================================ (ns clean "It is actually possible to document a ns. It's a nice place to describe the purpose of the namespace and maybe even the overall conventions used. Note how _not_ indenting the docstring makes it easier for tooling to display it correctly.") ;;;; Section Comment/Heading ;;; Foo... ;;; Bar... ;;; Baz... ;; good (defn foo "This funtion doesn't do much." [] nil) ;; bad (defn bar ^{:doc "This function doesn't do much."} [] nil) ;; good (defn qzuf-number "Computes the [Qzuf number](https://wikipedia.org/qzuf) of the `coll`. Supported options in `opts`: | key | description | | --------------|-------------| | `:finite-uni?`| Assume finite universe; default: `false` | `:complex?` | If OK to return a [complex number](https://en.wikipedia.org/wiki/Complex_number); default: `false` | `:timeout` | Throw an exception if the computation doesn't finish within `:timeout` milliseconds; default: `nil` Example: ```clojure (when (neg? (qzuf-number [1 2 3] {:finite-uni? true})) (throw (RuntimeException. \"Error in the Universe!\"))) ```" [coll opts] nil) (defprotocol MyProtocol "MyProtocol docstring" (foo [this x y z] "foo docstring") (bar [this] "bar docstring")) ;; good (defn some-fun [] ;; FIXME: This has crashed occasionally since v1.2.3. It may ;; be related to the BarBazUtil upgrade. (xz 13-1-31) #_(baz)) ;;;; Frob Grovel ;;; This section of the code has some important implications: ;;; 1. Foo. ;;; 2. Bar. ;;; 3. Baz. (defn fnord [zarquon] ;; If zob, then veeblefitz. (quux zot mumble ; Zibblefrotz. frotz)) (defn foo [x] x ; I'm a line/code fragment comment. ) ;;; I'm a top-level comment. ;;; I live outside any definition. (defn foo []) (def ^{:deprecated "0.5"} foo "Use `bar` instead." 42) ================================================ FILE: harper-comments/tests/language_support_sources/basic_groovy.groovy ================================================ // This commment has one typo. def greeting = "hello" ================================================ FILE: harper-comments/tests/language_support_sources/basic_kotlin.kt ================================================ // ************************************************************************************************* // A diminutive but fully-formed demonstration of idiomatic Kotlin. // // 1. Defines a sealed algebraic hierarchy to represent the discrete states of a task // transmogrifying through a rudimentary scheduler. // 2. Employs a type-safe builder DSL to assemble a cohort of Task objects succinctly. // 3. Utilizes coroutines and the structured-concurrency discipline to execute tasks // concomitantly while preserving deterministic shutdown semantics. // ************************************************************************************************* // ---------- Domain model ------------------------------------------------------------------------- /** Immutable value holder representing a unit of executable labor. */ data class Task( val id: Int, val description: String, val action: suspend () -> Unit, ) /** Exhaustive taxonomy of execution outcomes; the `sealed` modifier ensures compiler‐enforced totality. */ sealed interface TaskResult { /** Successful completion carrying an optional payload. */ data class Success(val id: Int, val elapsedMillis: Long) : TaskResult /** Recoverable misadventure accompanied by the causal `Throwable`. */ data class Failure(val id: Int, val cause: Throwable) : TaskResult /** Voluntary cessation initiated by the caller before execution. */ data class Cancelled(val id: Int) : TaskResult } // ---------- DSL for declarative task construction ----------------------------------------------- /** Fluent builder furnishing a terse, expressive syntax for batch task definition. */ @DslMarker annotation class TaskDsl @TaskDsl class TaskBatchBuilder { private val tasks = mutableListOf() /** Registers a new task whose body is expressed as a suspending lambda. */ fun task(description: String, block: suspend () -> Unit) { tasks += Task(tasks.size + 1, description, block) } internal fun build(): List = tasks.toList() } /** Conveniences the client with type inference and inline lambda to craft a task batch. */ fun taskBatch(init: TaskBatchBuilder.() -> Unit): List = TaskBatchBuilder().apply(init).build() // ---------- Scheduler implementation ------------------------------------------------------------- import kotlinx.coroutines.* import kotlin.system.* /** Executes all tasks concurrently, returning a conglomerate of `TaskResult` artifacts. */ suspend fun runTasks(tasks: List): List = coroutineScope { val startEpoch = System.currentTimeMillis() // Launch each task within its own child coroutine; Deferred encapsulates the eventual result. val futures: List> = tasks.map { task -> async { val elapsed = measureTimeMillis { try { task.action() } catch (t: CancellationException) { // Propagate structured-concurrency cancellation upward; annotate as `Cancelled`. return@async TaskResult.Cancelled(task.id) } catch (t: Throwable) { // Swallow domain-level exception, encapsulate in Failure result. return@async TaskResult.Failure(task.id, t) } } // If the lambda returns normally, the endeavor is deemed triumphant. TaskResult.Success(task.id, elapsed) } } // Await completion of the entire cohort, preserving result order by task identifier. futures.awaitAll().sortedBy { result -> when (result) { is TaskResult.Success -> result.id is TaskResult.Failure -> result.id is TaskResult.Cancelled -> result.id } } } // ---------- Demonstration entry-point ------------------------------------------------------------ fun main() = runBlocking { // Compose an eclectic suite of tasks via the DSL. val tasks = taskBatch { task("Inconsequential delay") { delay(250) println("Task A executed on thread ${Thread.currentThread().name}") } task("Spurious exception") { delay(100) error("Intentional kaboom") } task("CPU-bound Fibonacci") { val n = 25 val fib = generateSequence(0 to 1) { it.second to it.first + it.second } .take(n + 1).last().first println("fib($n) = $fib") } } println("Launching ${tasks.size} tasks concurrently…\n") // Drive the scheduler and acquire the final ledger. val ledger = runTasks(tasks) // Expository epilogue. println("\n────────── Execution Ledger ──────────") ledger.forEach { result -> when (result) { is TaskResult.Success -> println("✔︎ Task ${result.id} succeeded in ${result.elapsedMillis} ms") is TaskResult.Failure -> println("✘ Task ${result.id} failed with ${result.cause::class.simpleName}: ${result.cause.message}") is TaskResult.Cancelled -> println("⚑ Task ${result.id} was cancelled before commencement") } } } ================================================ FILE: harper-comments/tests/language_support_sources/clean.lua ================================================ ---@meta ---@alias MyCustomType integer ---Calculate a value using [my custom type](lua://MyCustomType) ---@param x MyCustomType function calculate(x) end ================================================ FILE: harper-comments/tests/language_support_sources/clean.ps1 ================================================ # This is an example PowerShell file with clean comments. <# This block comment should also lint cleanly. It includes multiple lines of text. #> function Invoke-Demo { # This function has no lint issues in its comments. Write-Output "Hello from Harper" } ================================================ FILE: harper-comments/tests/language_support_sources/clean.rs ================================================ /// This is an example Rust file that should produce no Harper lints. struct TestStruct {} impl TestStruct { /// This is a test function. /// It has a [link](https://example.com) embedded inside fn test_function() {} /// This is another test function. /// It has another [link](https://example.com) embedded inside fn test_function() {} /// This is some gibberish to try to trigger a lint for the sentences that continue for too long /// /// This is some gibberish to try to trigger a lint for the sentences that continue for too long /// /// This is some gibberish to try to trigger a lint for the sentences that continue for too long /// /// This is some gibberish to try to trigger a lint for the sentences that continue for too long /// /// This is some gibberish to try to trigger a lint for the sentences that continue for too long } ================================================ FILE: harper-comments/tests/language_support_sources/clean.sol ================================================ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; /// This is an example Solidity file that should produce no Harper lints. contract TestContract { /// This is a test function. /// It has a [link](https://example.com) embedded inside function testFunction() external {} /** * @notice This is another test function. * @dev It has another [link](https://example.com) embedded inside * @param p This is a parameter */ function testFunction2(uint256 p) external {} // This is some gibberish to try to trigger a lint for the sentences that continue for too long // // This is some gibberish to try to trigger a lint for the sentences that continue for too long // // This is some gibberish to try to trigger a lint for the sentences that continue for too long // // This is some gibberish to try to trigger a lint for the sentences that continue for too long // // This is some gibberish to try to trigger a lint for the sentences that continue for too long } ================================================ FILE: harper-comments/tests/language_support_sources/clean.zig ================================================ //! Top-level module documentation. /// Main entry point. pub fn main() void { // Regular comment. const x: i32 = 42; _ = x; } /// A simple struct. pub const MyStruct = struct { /// A field. value: i32, }; ================================================ FILE: harper-comments/tests/language_support_sources/common.mill ================================================ import mill._, scalalib._ object hello extends ScalaModule { def scalaVersion = "2.13.8" // Define third-party dependencies def ivyDeps = Agg( ivy"com.lihaoyi::scalatags:0.9.4", // for HTML generation ivy"com.lihaoyi::mainargs:0.6.2" // for CLI argument parsing ) // Define an test submodule using a test framework. object test extends ScalaTests { def testFramework = "utest.runner.Framework" def ivyDeps = Agg( ivy"com.lihaoyi::utest:0.7.10" ) } } ================================================ FILE: harper-comments/tests/language_support_sources/complex_gradle_build.gradle ================================================ plugins { id 'java-library' } repositories { mavenCentral() } dependencies { implementation 'org.slf4j:slf4j-api:2.0.13' } tasks.register('printConfig') { doLast { // This commment appears in a Gradle task body with interpolation-like syntax. def mode = project.findProperty('mode') ?: 'dev' println "mode=${mode}" } } ================================================ FILE: harper-comments/tests/language_support_sources/complex_groovy_block_comments.groovy ================================================ /* * This module-level commment sits above imports and class declarations. * It intentionally includes punctuation, symbols, and numbers: [x-12], 42, and release tags. */ package demo.comments import groovy.transform.CompileStatic @CompileStatic class CommentHeavyService { /** * Parses payloads and normalizes options. * The implementation is intentionally straightforward. */ Map parse(Map payload) { // This inline comment should be parsed normally. Map normalized = [:] normalized.putAll(payload) return normalized } } ================================================ FILE: harper-comments/tests/language_support_sources/complex_groovy_strings_regex.groovy ================================================ class ParserLikeExample { static void main(String[] args) { String url = "https://example.com/path?foo=bar//baz" String slashy = /https?:\/\/[a-z0-9\.-]+\/.*/ // This commment should be linted, but string and regex contents should not. if (url ==~ slashy) { println "matched" } } } ================================================ FILE: harper-comments/tests/language_support_sources/dirty.lua ================================================ ---@meta ---@alias MyCustomType integer ---Calculate a value using [my custom type](lua://MyCustomType) --- --- This calcumalates stuff ---@param x MyCustomType function calculate(x) end ================================================ FILE: harper-comments/tests/language_support_sources/dirty.zig ================================================ //! This module demonstrates various comment types. /// This doc comment has a mispelling: teh quick brown fox. pub fn main() void { // This regular comment has a speling error here const x: i32 = 42; _ = x; } ================================================ FILE: harper-comments/tests/language_support_sources/empty.js ================================================ // This is an empty file, apart from this comment. ================================================ FILE: harper-comments/tests/language_support_sources/eof.rs ================================================ fn main() {} // This is a test to ensure Harper doesn't crash on comments at the end of files. ================================================ FILE: harper-comments/tests/language_support_sources/ignore_comments.c ================================================ // This comment is spellcheckd int main() { // spellchecker:ignore Thear be code in here } ================================================ FILE: harper-comments/tests/language_support_sources/ignore_comments.ps1 ================================================ # spellcheck:ignore splling error # Ths applies to this entire comment block. $foo = 1 # spellchecker: ignore ths varible isnt done yt $bar = 2 # Ths comment block is checked. function Invoke-Check { Write-Output "Testing" } ================================================ FILE: harper-comments/tests/language_support_sources/ignore_comments.rs ================================================ /// spellcheck:ignore splling error /// This applies to the entire comment block #[derive(Debug)] /// Ths comment block is checked pub struct Testing { // spellchecker: ignore ths struct isnt done yt } ================================================ FILE: harper-comments/tests/language_support_sources/ignore_comments.sol ================================================ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; /// spellcheck:ignore splling error /// Ths applies to the entire comment block contract Testing { // spellchecker: ignore ths contrat isnt done yt uint256 internal foo; /// Ths comment block is checked function test() external {} } ================================================ FILE: harper-comments/tests/language_support_sources/ignore_shebang_1.sh ================================================ #!/bin/sh # This is a test to make sure that we don't lint shebang lines. ================================================ FILE: harper-comments/tests/language_support_sources/ignore_shebang_2.sh ================================================ #! /usr/bin/env sh # This is a test to make sure that we don't lint shebang lines. ================================================ FILE: harper-comments/tests/language_support_sources/ignore_shebang_3.sh ================================================ #!/usr/bin/python3 # This is a test to make sure that we don't lint shebang lines. ================================================ FILE: harper-comments/tests/language_support_sources/ignore_shebang_4.sh ================================================ #/bin/sh # This is a test to make sure that we don't ignore invalid shebang lines. ================================================ FILE: harper-comments/tests/language_support_sources/issue_1097.lua ================================================ ---Starting with something capitalized, but without dot at the end ---@type table local f = {} -- ending with a dot. ================================================ FILE: harper-comments/tests/language_support_sources/issue_132.rs ================================================ /// ``` /// println!("Test"); /// ``` /// /// This shoud get checked. fn main() { println!("Hello, world!"); } ================================================ FILE: harper-comments/tests/language_support_sources/issue_229.c ================================================ // ================================================ FILE: harper-comments/tests/language_support_sources/issue_229.cs ================================================ // ================================================ FILE: harper-comments/tests/language_support_sources/issue_229.js ================================================ // ================================================ FILE: harper-comments/tests/language_support_sources/issue_96.lua ================================================ -- Below, we have a situation where the line terminates and should end the sentence. local alphabet = { [1] = "a", -- This is a test [2] = "b", -- This is a test [3] = "c", -- This is a test [4] = "d", -- This is a test [5] = "e", -- This is a test [6] = "f", -- This is a test [7] = "g", -- This is a test [8] = "h", -- This is a test [9] = "i", -- This is a test [10] = "j", -- This is a test [11] = "k", -- This is a test } ================================================ FILE: harper-comments/tests/language_support_sources/issue_96.rb ================================================ # Below, we have a situation where the line terminates and should end the sentence. alphabet = [ "a", # This is a test "b", # This is a test "c", # This is a test "d", # This is a test "e", # This is a test "f", # This is a test "g", # This is a test "h", # This is a test "i", # This is a test "j", # This is a test "k", # This is a test ] ================================================ FILE: harper-comments/tests/language_support_sources/javadoc_clean_simple.java ================================================ class TestClass { /** * This is a JavaDoc without any of the fancy frills that come with it. */ public static void main(String[] args) { System.out.println("Hello world."); } } ================================================ FILE: harper-comments/tests/language_support_sources/javadoc_complex.java ================================================ class TestClass { /** * This is a JavaDoc with many of the fancy frills that come with it. * *

* Notably, the allowed use of HTML inline to format the text. *

* * Also, the allowed use of the various metadata tags we can attach to methods * and classes. * * @param args these are the arguents passed to the program from the command * lin. */ public static void main(String[] args) { greet("world"); } /** * This doc has a link in it: {@link this sould b ignor} but not tis * * @param name this is anoher test. */ public static void greet(String name) { System.out.println("Hello " + name + "."); } } ================================================ FILE: harper-comments/tests/language_support_sources/jsdoc.ts ================================================ /** This is a doc comment. * Since there are no keywords it _sould_ be checked. */ function test(){} /** This is also a doc comment. * @class this sould be unchecked. */ class Clazz { } /** Here is another example: {@link this sould also b unchecked}. But this _sould_ be.*/ /** However, tis should be checked, while {@link tis should not} */ /** * The following examples should be ignored by Harper. * * @param {string} n - ignor * @param {string} [o] - ignor * @param {string} [d=DefaultValue] - ignor * @return {string} ignor * * This should not be ignor */ function foo(n, o, d) { return n } ================================================ FILE: harper-comments/tests/language_support_sources/laravel_app.php ================================================ env('APP_NAME', 'Laravel'), /* |-------------------------------------------------------------------------- | Application Environment |-------------------------------------------------------------------------- | | This value determines the "environment" your application is currently | running in. This may determine how you prefer to configure various | services the application utilizes. Set this in your ".env" file. | */ 'env' => env('APP_ENV', 'production'), /* |-------------------------------------------------------------------------- | Application Debug Mode |-------------------------------------------------------------------------- | | When your application is in debug mode, detailed error messages with | stacktraces will be shown on every error that occurs within your | application. If disabled, a simple generic error page is shown. | */ 'debug' => (bool) env('APP_DEBUG', false), /* |-------------------------------------------------------------------------- | Application URL |-------------------------------------------------------------------------- | | This URL is used by the console to properly generate URLs when using | the Artisan command line tool. You should set this to the root of | the application so that it's available within Artisan commands. | */ 'url' => env('APP_URL', 'http://localhost'), /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. The timezone | is set to "UTC" by default as it is suitable for most use cases. | */ 'timezone' => env('APP_TIMEZONE', 'UTC'), /* |-------------------------------------------------------------------------- | Application Locale Configuration |-------------------------------------------------------------------------- | | The application locale determines the default locale that will be used | by Laravel's translation / localization methods. This option can be | set to any locale for which you plan to have translation strings. | */ 'locale' => env('APP_LOCALE', 'en'), 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), /* |-------------------------------------------------------------------------- | Encryption Key |-------------------------------------------------------------------------- | | This key is utilized by Laravel's encryption services and should be set | to a random, 32 character string to ensure that all encrypted values | are secure. You should do this prior to deploying the application. | */ 'cipher' => 'AES-256-CBC', 'key' => env('APP_KEY'), 'previous_keys' => [ ...array_filter( explode(',', env('APP_PREVIOUS_KEYS', '')) ), ], /* |-------------------------------------------------------------------------- | Maintenance Mode Driver |-------------------------------------------------------------------------- | | These configuration options determine the driver used to determine and | manage Laravel's "maintenance mode" status. The "cache" driver will | allow maintenance mode to be controlled across multiple machines. | | Supported drivers: "file", "cache" | */ 'maintenance' => [ 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), 'store' => env('APP_MAINTENANCE_STORE', 'database'), ], ]; ================================================ FILE: harper-comments/tests/language_support_sources/merged_lines.ts ================================================ // This is a test to make sure we don't split up paragraphs on newlines. // This should be the same sentence, // this should be the same sentence, // this should be the same sentence, // this should be the same sentence, // this should be the same sentence, // this should be the same sentence, // this should be the same sentence, // this should be the same sentence, // // And this should be a new sentence. ================================================ FILE: harper-comments/tests/language_support_sources/multiline_comments.cpp ================================================ /// This is an example of an problematic comment. /// It should produce one error. int test() {} /*** * This is an example of a possible error: * these subsequent lines should not be considered a new sentence and should * produce no errors. */ int arbitrary() {} /// Let's aadd a cuple spelling errors for good measure. ================================================ FILE: harper-comments/tests/language_support_sources/multiline_comments.sol ================================================ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; /// This is an example of an problematic comment. /// It should produce one error. contract Test {} /** * This is an example of a possible error: * these subsequent lines should not be considered a new sentence and should * produce no errors. */ library FooBar {} /// Let's aadd a cuple spelling errors for good measure. ================================================ FILE: harper-comments/tests/language_support_sources/multiline_comments.ts ================================================ // This is an example of an problematic comment // It should produce one error function test() {} /*** * This is an example of a possible error: * these subsequent lines should not be considered a new sentence and should * produce no errors. */ function arbitrary() {} // Let's aadd a cuple spelling errors for good measure. ================================================ FILE: harper-core/Cargo.toml ================================================ [package] name = "harper-core" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" readme = "README.md" repository = "https://github.com/automattic/harper" [dependencies] blanket = "0.4.0" fst = "0.4.7" hashbrown = { version = "0.16.1", features = ["serde"] } is-macro = "0.3.6" itertools = "0.14.0" ordered-float = { version = "5.1.0", features = ["serde"] } paste = "1.0.14" pulldown-cmark = "0.13.1" serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" smallvec = { version = "1.15.1", features = ["serde"] } thiserror = "2.0.18" unicode-blocks = "0.1.9" unicode-script = "0.5.8" unicode-width = "0.2.2" levenshtein_automata = { version = "0.2.1", features = ["fst_automaton"] } cached = "0.56.0" lru = "0.16.3" foldhash = "0.2.0" strum_macros = "0.28.0" strum = "0.28.0" ammonia = "4.1.2" harper-brill = { path = "../harper-brill", version = "1.0.0" } harper-thesaurus = { path = "../harper-thesaurus", version = "1.4.1", optional = true } bitflags = { version = "2.11.0", features = ["serde"] } trie-rs = "0.4.2" zip = { version = "8.1.0", default-features = false, features = ["deflate"] } regex = "1.12.3" [dev-dependencies] criterion = { version = "0.8.2", default-features = false } rand = "0.10.0" quickcheck = "1.1.0" quickcheck_macros = "1.2.0" rayon = "1.11.0" [[bench]] name = "parse_essay" harness = false [features] default = ["thesaurus"] concurrent = [] thesaurus = ["dep:harper-thesaurus"] ================================================ FILE: harper-core/README.md ================================================ # `harper-core` `harper-core` is the fundamental engine behind [Harper](https://writewithharper.com), the private grammar checker. `harper-core` is [available on `crates.io`](https://crates.io/crates/harper-core) to enable Rust engineers to integrate high-quality grammar checking directly into their apps and workflows. Feel free to use `harper-core` in your projects. If you run into problems with the code, open an issue or, even better, create a pull request. We are also happy to chat with you on [Discord](https://discord.com/invite/JBqcAaKrzQ). [The documentation for `harper-core` is available online.](https://docs.rs/harper-core/latest/harper_core/) If you would prefer to run Harper from inside a JavaScript runtime, [we have a package for that as well.](https://www.npmjs.com/package/harper.js) ## Example Here's what a full end-to-end linting pipeline could look like using `harper-core`. ```rust use harper_core::linting::{LintGroup, Linter}; use harper_core::parsers::PlainEnglish; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; let text = "This is an test."; let parser = PlainEnglish; let document = Document::new_curated(text, &parser); let dict = FstDictionary::curated(); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); for lint in lints { println!("{:?}", lint); } ``` ## Features `concurrent`: Whether to use thread-safe primitives (`Arc` vs `Rc`). Disabled by default. It is not recommended unless you need thread safety (i.e. you want to use something like `tokio`). ## Other Relevant Packages - [`harper-ls`](https://crates.io/crates/harper-ls) - [`harper-tree-sitter`](https://crates.io/crates/harper-tree-sitter) ================================================ FILE: harper-core/annotations.json ================================================ { "affixes": { "K": { "#": "'pro-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "pro", "condition": "." } ], "target": [], "base_metadata": {}, "rename_ok": true }, "L": { "#": "'-ment' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "ment", "condition": "." } ], "target": [], "base_metadata": {}, "rename_ok": true }, "E": { "#": "'dis-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "dis", "condition": "." } ], "target": [], "base_metadata": {}, "rename_ok": true }, "Y": { "#": "'-ly' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "ly", "condition": "." } ], "target": [ { "metadata": { "adverb": { "is_manner": true } } } ], "base_metadata": { "adjective": {} } }, "U": { "#": "'un-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "un", "condition": "." } ], "target": [], "base_metadata": {} }, "H": { "#": "'-ieth' suffix", "kind": "suffix", "cross_product": false, "replacements": [ { "remove": "y", "add": "ieth", "condition": "y" }, { "remove": "", "add": "th", "condition": "[^y]" } ], "target": [], "base_metadata": {} }, "^": { "#": "'-(i)est' superlative suffix", "//": "mnemonic: the topmost is the best. see also 'u' which marks a superlative form", "kind": "suffix", "cross_product": false, "replacements": [ { "remove": "", "add": "st", "condition": "e" }, { "remove": "y", "add": "iest", "condition": "[^aeiou]y" }, { "remove": "", "add": "est", "condition": "[aeiou]y" }, { "remove": "", "add": "est", "condition": "[^ey]" } ], "target": [ { "if_base": { "adjective": {} }, "metadata": { "adjective": { "degree": "Superlative" } } } ], "base_metadata": {} }, ">": { "#": "'-(i)er' comparative suffix; agent suffix. see also 'c' which marks a comparative form", "//": "mnemonic: greater than is better; singular of 'Z'", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "r", "condition": "e" }, { "remove": "y", "add": "ier", "condition": "[^aeiou]y" }, { "remove": "", "add": "er", "condition": "[aeiou]y" }, { "remove": "", "add": "er", "condition": "[^ey]" } ], "target": [ { "if_base": { "adjective": {} }, "metadata": { "adjective": { "degree": "Comparative" } } }, { "if_base": { "verb": {} }, "metadata": { "noun": { "//": "TODO: agent noun: run -> runner" } } } ], "base_metadata": {} }, "e": { "#": "'de-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "de", "condition": "." } ], "target": [], "base_metadata": {} }, "v": { "#": "'-ive' suffix", "kind": "suffix", "cross_product": false, "replacements": [ { "remove": "e", "add": "ive", "condition": "e" }, { "remove": "", "add": "ive", "condition": "[^e]" } ], "target": [], "base_metadata": {} }, "n": { "#": "nominalization suffixes: -ion, -ication, -en", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "e", "add": "ion", "condition": "e" }, { "remove": "y", "add": "ication", "condition": "y" }, { "remove": "", "add": "en", "condition": "[^ey]" } ], "target": [], "base_metadata": {} }, "r": { "#": "'re-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "re", "condition": "." } ], "target": [], "base_metadata": {} }, "Z": { "#": "'-(i)(e)rs' suffix", "//": "plural of '>' agent noun suffix '-(i)(e)r'", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "rs", "condition": "e" }, { "remove": "y", "add": "iers", "condition": "[^aeiou]y" }, { "remove": "", "add": "ers", "condition": "[aeiou]y" }, { "remove": "", "add": "ers", "condition": "[^ey]" } ], "target": [], "base_metadata": {}, "rename_ok": true }, "p": { "#": "'-(i)ness' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "y", "add": "iness", "condition": "[^aeiou]y" }, { "remove": "", "add": "ness", "condition": "[aeiou]y" }, { "remove": "", "add": "ness", "condition": "[^y]" } ], "target": [], "base_metadata": {}, "rename_ok": true }, "g": { "#": "-'s possessive suffix; contraction of 'has' and 'is", "//": "mnemonic: 'genitive' is a similar concept to 'possessive'", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "'s", "condition": "." } ], "target": [ { "metadata": { "noun": { "is_possessive": true } } } ], "base_metadata": { "noun": {} } }, "W": { "#": "'con-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "con", "condition": "." } ], "target": [], "base_metadata": {}, "rename_ok": true }, "B": { "#": "'-able' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "able", "condition": "[^aeiou]" }, { "remove": "", "add": "able", "condition": "ee" }, { "remove": "e", "add": "able", "condition": "[^aeiou]e" } ], "target": [ { "if_base": { "verb": {} }, "metadata": { "adjective": { "degree": "Positive" } } } ], "base_metadata": {} }, "S": { "#": "'-(i)(e)s' plural suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "y", "add": "ies", "condition": "[^aeiou]y" }, { "remove": "", "add": "s", "condition": "[aeiou]y" }, { "remove": "", "add": "es", "condition": "[sxzh]" }, { "remove": "", "add": "s", "condition": "[^sxzhy]" } ], "target": [ { "if_base": { "noun": {} }, "metadata": { "noun": { "is_plural": true } } }, { "if_base": { "verb": {} }, "metadata": { "verb": { "verb_form": "THIRD_PERSON_SINGULAR" } } } ], "base_metadata": {} }, "d": { "#": "'-(e)d' suffix; verb past", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "d", "condition": "e" }, { "remove": "y", "add": "ied", "condition": "[^aeiou]y" }, { "remove": "", "add": "ed", "condition": "[^ey]" }, { "remove": "", "add": "ed", "condition": "[aeiou]y" } ], "target": [ { "metadata": { "adjective": { "degree": "Positive" } } }, { "if_base": { "verb": {} }, "metadata": { "verb": { "verb_form": "PAST" } } } ], "base_metadata": {} }, "G": { "#": "'-ing' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "e", "add": "ing", "condition": "e" }, { "remove": "", "add": "ing", "condition": "[^e]" } ], "target": [ { "metadata": { "verb": { "verb_form": "PROGRESSIVE" }, "noun": { "is_mass": true }, "adjective": {} } } ], "base_metadata": {} }, "Q": { "#": "'-ally' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "ally", "condition": "." } ], "target": [ { "metadata": { "adverb": {} } } ], "base_metadata": {}, "rename_ok": true }, "f": { "#": "'-ful' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "ful", "condition": "." } ], "target": [], "base_metadata": {} }, "i": { "#": "'in-' prefix", "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "in", "condition": "." } ], "target": [], "base_metadata": {} }, "X": { "#": "'-ions', '-ications', '-ens' suffixes", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "e", "add": "ions", "condition": "e" }, { "remove": "y", "add": "ications", "condition": "y" }, { "remove": "", "add": "ens", "condition": "[^ey]" } ], "target": [], "base_metadata": {}, "rename_ok": true }, "z": { "#": "'-ings' suffix", "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "e", "add": "ings", "condition": "e" }, { "remove": "", "add": "ings", "condition": "[^e]" } ], "target": [], "base_metadata": {}, "rename_ok": true } }, "properties": { "N": { "#": "noun property", "metadata": { "noun": {} } }, "O": { "#": "proper noun property", "propagate": true, "metadata": { "noun": { "is_proper": true } } }, "l": { "#": "linking verb property", "//": "see also A: auxiliary verb property", "metadata": { "verb": { "is_linking": true } } }, "V": { "#": "verb property", "metadata": { "verb": {} } }, "j": { "#": "verb past property", "metadata": { "verb": { "verb_form": "PAST" } } }, "J": { "#": "adjective property", "metadata": { "adjective": {} } }, "x": { "#": "swear word property", "//": "'xxx' used to be a placeholder for swear words", "propagate": true, "metadata": { "swear": true } }, "C": { "#": "conjunction property", "metadata": { "conjunction": {} } }, "I": { "#": "pronoun property", "metadata": { "pronoun": {} } }, "0": { "#": "singular noun property", "//": "mnemonic: the closest digit to single '1' that's not used for grammatical person", "metadata": { "noun": { "is_singular": true } } }, "9": { "#": "plural noun property", "//": "mnemonic: the biggest, most plural digit", "metadata": { "noun": { "is_plural": true } } }, "~": { "#": "common word property", "metadata": { "common": true }, "rename_ok": true, "propagate": true }, "P": { "#": "preposition property", "metadata": { "preposition": true } }, "D": { "#": "determiner property", "metadata": { "determiner": {} } }, "q": { "#": "quantifier property", "metadata": { "determiner": { "is_quantifier": true } } }, "R": { "#": "adverb property", "metadata": { "adverb": {} } }, "s": { "#": "subject case property", "metadata": { "pronoun": { "is_subject": true } } }, "o": { "#": "object case property", "metadata": { "pronoun": { "is_object": true } } }, "1": { "#": "first-person property", "metadata": { "pronoun": { "person": "First" } } }, "2": { "#": "second-person property", "metadata": { "pronoun": { "person": "Second" } } }, "3": { "#": "third-person property", "metadata": { "pronoun": { "person": "Third" } } }, "c": { "#": "comparative property", "//": "see also '>' which derives a comparative form", "metadata": { "adjective": { "degree": "Comparative" } } }, "u": { "#": "superlative property", "//": "see also '^' which derives a superlative form", "metadata": { "adjective": { "degree": "Superlative" } } }, "*": { "#": "singular third-person subject pronoun property", "//": "so we can do verb agreement", "metadata": { "pronoun": { "is_singular": true, "person": "Third" } } }, ".": { "#": "singular pronoun property", "//": "mnemonic: one dot", "metadata": { "pronoun": { "is_singular": true } } }, ":": { "#": "plural pronoun property", "//": "mnemonic: multiple dots", "metadata": { "pronoun": { "is_plural": true } } }, "A": { "#": "auxiliary verb property", "//": "see also l: linking verb property", "metadata": { "verb": { "is_auxiliary": true } } }, "<": { "#": "American property", "propagate": true, "metadata": { "dialects": "AMERICAN" }, "rename_ok": true }, "!": { "#": "GB property", "propagate": true, "metadata": { "dialects": "BRITISH" }, "rename_ok": true }, "@": { "#": "CA property", "//": "mnemonic: at symbol resembles an 'a' inside a 'C'", "propagate": true, "metadata": { "dialects": "CANADIAN" } }, "_": { "#": "AU property", "//": "mnemonic: down under", "propagate": true, "metadata": { "dialects": "AUSTRALIAN" } }, "₹": { "#": "IN property", "//": "mnemonic: rupee symbol", "propagate": true, "metadata": { "dialects": "INDIAN" } }, "F": { "#": "reflexive property", "metadata": { "pronoun": { "is_reflexive": true } } }, "M": { "#": "demonstrative determiner property", "metadata": { "determiner": { "is_demonstrative": true } } }, "5": { "#": "possessive determiner property", "//": "mnemonic: 5 looks like an 's'", "metadata": { "determiner": { "is_possessive": true } } }, "a": { "#": "personal pronoun property", "//": "'personal' means 'grammatical person', not 'human'", "metadata": { "pronoun": { "is_personal": true } } }, "m": { "#": "mass noun (only) property", "metadata": { "noun": { "is_mass": true } } }, "w": { "#": "mass + countable noun property", "metadata": { "noun": { "is_countable": true, "is_mass": true } } }, "b": { "#": "verb lemma form property", "//": "mnemonic: 'b' for 'base form'", "metadata": { "verb": { "verb_form": "LEMMA" } } }, "t": { "#": "verb preterite / simple past form property", "metadata": { "verb": { "verb_form": "PRETERITE" } } }, "T": { "#": "verb past participle form property", "metadata": { "verb": { "verb_form": "PAST_PARTICIPLE" } } }, "6": { "#": "verb progressive form property", "//": "mnemonic: '6' looks like 'g' in 'ing'", "metadata": { "verb": { "verb_form": "PROGRESSIVE" } } }, "h": { "#": "verb third person singular present form property", "metadata": { "verb": { "verb_form": "THIRD_PERSON_SINGULAR" } } }, "y": { "#": "adverb of manner property", "//": "mnemonic: 'y' looks like 'ly'", "metadata": { "adverb": { "is_manner": true } } }, "8": { "#": "adverb of frequency property", "//": "mnemonic: '8' looks like '♾️'", "metadata": { "adverb": { "is_frequency": true } } }, "%": { "#": "adverb of degree property", "//": "mnemonic: '%' reminds of '°'", "metadata": { "adverb": { "is_degree": true } } }, "♂": { "#": "masculine property", "metadata": { "//": "not yet implemented" } }, "♀": { "#": "feminine property", "metadata": { "//": "not yet implemented" } }, "ª": { "#": "animate property", "metadata": { "//": "not yet implemented" } }, "(": { "#": "prefix property", "metadata": { "affix": { "is_prefix": true } } }, "/": { "#": "phrasal verb property", "metadata": { "verb": { "is_phrasal": true } } }, "☁": { "#": "abstract noun property", "//": "mnemonic: cloud = intangible", "metadata": { "noun": { "is_abstract": true } } } } } ================================================ FILE: harper-core/benches/essay.md ================================================ The question of why we do anything at all is one of those profound, irritatingly unanswerable riddles that philosophers and late-night overthinkers have wrestled with for centuries. If we take a purely biological perspective, we do things to survive, to propagate the species, to eat, drink, and stave off the cold. But that answer is profoundly unsatisfying because it ignores the sheer peculiarity of human behavior. Why do we build cathedrals, write novels, or argue endlessly on the internet about whether a hot dog is a sandwich? What compels someone to paint a canvas or compose a symphony when neither is necessary for survival? The siplest answer is that we are creatures of pattern and meaning, constantly searching for order in chaos. Take language, for instance—our ceaseless need to name, categorize, and label everything around us, as if pinning a word to an object somehow grants us mastery over it. This extends even to the grammar of our thoughts. The way we construct sentences, form arguments, and recognize the structure of a well-crafted joke reveals something fundamental about our cognition. A joke, after all, is just a bait-and-switch for the brain, an elegant dance of expectations and subversions. Similarly, the way we tell stories, build relationships, and pass on knowledge relies on our ability to perceive and manipulate patterns, making communication a fundamental pillar of human experience. But where des that leave us in the grander scheme of things? Humans have an insatiable need to create, even in the face of an indifferent universe. The pyramids were built by civilizations that no longer exist, their original intentions obscured by the shifting sands of history. And yet, there they stand, testaments to some long-forgotten ambition. We are driven to leave something behind, whether it be a physical monument, a digital footprint, or simply a story whispered from one generation to the next. Even now, we etch our thoughts into the collective consciousness of humanity through books, blogs, tweets, and videos, trying to make some mark that will outlive us, even if just for a moment. Speaking of stories, fiction is perhaps the most peculiar human invention of all. Other animals communicate, solve problems, even display emotions—but they do not tell each other elaborate lies for entertainment. Fiction allows us to live infinite lives, to explore the what-ifs of existence without ever leaving our chair. And yet, fiction is paradoxically one of the best ways to understand reality. If you want to grasp the true horrors of war, a history book will tell you the facts, but a novel will make you feel them. Our brains, those ancient, pattern-seeking machines, respond more to narratives than to raw data. This is why memoirs and personal accounts carry such emotional weight, why a well-told anecdote can shape political movements, and why some of the most effective leaders in history were, above all, masterful storytellers. This is why histry, for all its pretense of objectivity, is really just a collection of competing narratives. Every empire, every ideology, every revolution is shaped by the stories people choose to tell about them. A civilization may fall not because of military defeat but because its foundational myth loses its grip on the collective imagination. Think about the fall of Rome—not a singular event but a slow unraveling, a loss of confidence in the structures that once held everything together. Perhaps all civilizations eventually reach this point, where the grand story that justified their existence is no longer compelling enough to sustain them. Perhaps the same is true for individuals as well, where personal reinvention is not merely an option but an inevitability. But then again, collapse is just another word for transformation. New stories take root in the ashes of the old. The medieval world gave way to the Renaissance because someone, somewhere, decided that maybe the past was worth revisiting. This is how ideas work: they lie dormant until the right moment, waiting for someone to rediscover them. You see this in science, in philosophy, in technology. The invention of the printing press wasn’t just a mechanical breakthrough—it was a revolution in the way ideas could spread, a prototype for the internet centuries before its time. The cyclical nature of innovation means that old ideas often become new again, reinterpreted through different lenses as human society evolves. And the internet, of couse, is its own beast entirely. A swirling, chaotic cauldron of human thought, filled with brilliance and stupidity in equal measure. We are more connected than ever before, and yet lonelier than ever, drowning in a sea of information without a clear way to separate signal from noise. What does it mean to be truly informed in an era where every piece of knowledge is instantly available but where misinformation spreads just as quickly? The ancient Greeks worried about the written word weakening our memory; what would they think of a world where no one remembers anything because Google is always a click away? What would they make of a world where artificial intelligence now plays a role in shaping narratives, in predicting trends, in subtly altering the way we perceive reality itself? Perhaps the next great hman challenge is not discovering new information but learning how to curate it—how to distinguish the meaningful from the meaningless. The ability to think critically, to recognize bias, to resist the lure of easy, comfortable falsehoods—these may become the most valuable skills of the future. But even as we wrestle with these challenges, we will still find time to argue about trivial things. Are video games art? Is pineapple on pizza a culinary abomination or a stroke of genius? These questions, absurd as they may seem, are part of what makes us human. We care about things that don’t matter because, in a way, they do matter. They give us something to latch onto, something to discuss, something to shape the narrative of our lives around. These seemingly frivolous debates become markers of cultural identity, of generational shifts, of the ever-changing nature of taste and perception. And so, we continue. Building, arguing, dreaming, and storytelling. Not because we have to, but because, for some reason, we can’t seem to stop. And maybe that’s the most human thing of all. Maybe the true mark of being human is not merely the ability to think, but the compulsion to share those thoughts with others, to seek meaning in the vast expanse of uncertainty, to create narratives that outlive us, if only for a fleeting moment in time. The nature of progress is one of the most fascinating and contentious debates in human history. Is progress an inevitable force, a gradual accumulation of knowledge and refinement of ideas, or is it a chaotic series of fits and starts, a process governed as much by accident and serendipity as by deliberate effort? The answer, as with most things, is probably boh. Consider the way technological advancements unfold. The wheel, fire, writing, the printing press, the steam engine, electricity, the internet—these milestones are often presented as stepping stones on a linear path toward a more advanced civilization. And yet, history is littered with examples of knowledge lost, rediscovered, or arriving before its time. The Antikythera Mechanism, a sophisticated analog computer from ancient Greece, was forgotten for centuries before we had machines of similar complexity. The steam engine existed in rudimentary form in Hellenistic Alexandria, but it would take over a thousand years for the Industrial Revolution to harness its true potential. This pattern of innovation, stagnation, and rediscovery suggests that human progress is not a smooth arc but a jagged line. Ideas often arrive before society is ready for them, only to be shelved until conditions align for their widespread adoption. The internet, for example, could have theoretically existed decades earlier had the right economic and political structures been in place. Similarly, artificial intelligence was theorized long before computational power made it feasible. But what drives progress? Some argue that necessity is the mother of invention, that crises and hardships push humanity to innovate. War, for instance, has been a catalyst for numerous technological breakthroughs, from radar to nclear energy to modern computing. Others argue that curiosity and creativity, independent of immediate needs, are the true engines of discovery. The Renaissance was not born out of desperation but out of an insatiable hunger for knowledge and artistic expression. Economic structures also play a crucial role. Capitalism, with its relentless drive for efficiency and profit, has undoubtedly accelerated technological progress. But it has also created perverse incentives—planned obsolescence, environmental degradation, and the prioritization of profit over long-term sustainability. Would a different system, one not beholden to market forces, produce a different kind of progress? Could we achieve breakthroughs in medicine, energy, or space travel faster if research were not so often dictated by financial viability? Culture, too, influences how progress unfolds. Some societies embrace innovation and risk, while others are more conservative, preferring stability over disruption. The spread of ideas often depends on networks of communication and openness to external influences. China, for example, was the world's most advanced civilization for centuries, yet political isolation slowed its technological dominance. Conversely, Europe's patchwork of competing states fostered a dynamic intellectual environment where ideas could cross borders, merge, and evolve. There is also the question of unintended consequences. Every major technological leap comes with unforeseen effects. The printing press democratized knowledge but also spread misinformation and propaganda. The industrial revolution improved living standards but also led to mass pollution and worker exploitation. The internet has connected billions but has also given rise to surveillance, misinformation, and algorithmic manipulation. Are we progressing toward a better world, or are we merely exchanging one set of problems for another? Looking to the future, the acceleration of artificial intelligence, biotechnology, and space eploration presents us with ethical and existential dilemmas unlike any faced before. Will AI surpass human intelligence in a way that is beneficial or catastrophic? Will genetic modification lead to the eradication of disease or the rise of designer babies and genetic inequality? Will humanity colonize space, or will we become trapped in the gravity of our own short-term thinking? Ultimately, progress is a double-edged sword. It is neither inherently good nor bad, but it is relentless. We push forward because we can, because curiosity compels us, because the alternative—stagnation—is untenable. The challenge is not merely to advance but to do so wisely, ensuring that our creations serve us rather than enslave us. In that sense, progress is not just about technology, but about wisdom—the wisdom to recognize the costs, to weigh the trade-offs, and to steer our collective trajectory toward a future that is not just more advanced, but more humane. ================================================ FILE: harper-core/benches/parse_essay.rs ================================================ use criterion::{Criterion, criterion_group, criterion_main}; use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use std::hint::black_box; static ESSAY: &str = include_str!("./essay.md"); fn parse_essay(c: &mut Criterion) { c.bench_function("parse_essay", |b| { b.iter(|| Document::new_markdown_default_curated(black_box(ESSAY))); }); } fn lint_essay(c: &mut Criterion) { let dictionary = FstDictionary::curated(); let mut lint_set = LintGroup::new_curated(dictionary, Dialect::American); let document = Document::new_markdown_default_curated(black_box(ESSAY)); c.bench_function("lint_essay", |b| { b.iter(|| lint_set.lint(&document)); }); } fn lint_essay_uncached(c: &mut Criterion) { c.bench_function("lint_essay_uncached", |b| { b.iter(|| { let dictionary = FstDictionary::curated(); let mut lint_set = LintGroup::new_curated(dictionary.clone(), Dialect::American); let document = Document::new_markdown_default(black_box(ESSAY), &dictionary); lint_set.lint(&document) }) }); } pub fn criterion_benchmark(c: &mut Criterion) { parse_essay(c); lint_essay(c); lint_essay_uncached(c); } criterion_group!(benches, criterion_benchmark); criterion_main!(benches); ================================================ FILE: harper-core/build.rs ================================================ use std::{env, fs, path::PathBuf}; fn main() { let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); let weir_rule_dir = manifest_dir.join("./src/linting/weir_rules"); let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); let dest = out_dir.join("weir_rules_generated_list.rs"); let mut files: Vec = fs::read_dir(&weir_rule_dir) .unwrap() .filter_map(Result::ok) .filter(|e| e.file_type().unwrap().is_file()) .map(|e| e.path().to_path_buf()) .collect(); files.sort(); let mut code = String::new(); code.push_str("generate_boilerplate!{["); for file in files { if file .file_name() .unwrap() .to_string_lossy() .ends_with(".weir") { code.push_str(&format!( "{},\n", file.file_stem().unwrap().to_str().unwrap() )); } } code.push_str("]}"); fs::write(&dest, code).unwrap(); println!("cargo:rerun-if-changed={}", weir_rule_dir.display()); println!("cargo:rerun-if-changed=build.rs"); println!("cargo:rustc-env=WEIR_RULE_DIR={}", weir_rule_dir.display()); println!("cargo:rustc-env=WEIR_RULE_LIST={}", dest.display()); } ================================================ FILE: harper-core/clippy.toml ================================================ disallowed-types = ["std::collections::HashMap", "std::collections::HashSet"] ================================================ FILE: harper-core/dictionary.dict ================================================ 54500 # Start of original dictionary import # combined with dialect spelling dictionary import. # This section is sorted alphabetically # and contains general-purpose English words. # This section includes words that are spelled differently # in US English vs UK, Canadian, and Australian English etc. AA/NOgJV AAA/NO AB/ONgJ ABA/ON ABC/NOSgJ ABI/NgS # application binary interface, cf. API ABM/ONSg ABS/NO AC/NOgJ ACL/NgS # anterior cruciate ligament ACLU/Og ACT/ON ACTH/Ng AD/NOgJ ADC/N ADD/N ADHD/N # attention deficit hyperactivity disorder ADM/NO ADP/Ng AES/N # advanced encryption standard AF/NJ AFAIK/ # as far as I know AFB/N AFC/ONg AFDC/O AFN/ON AFT/O AI/NOwSg # artificial intelligence AIDS/NgJ # disease AK/ON # US state (Alaska) AKP/Og # political party AL/NO # US state (Alabama) AM/ONgJ AMA/ON AMD/NOg AMG/NOSg # car brand AND gate/NgS ANSI/OS # text encoding ANZUS/Og # alliance AOL/Og # old internet company AP/NOgJ APB/N # all-points bulletin APC/NOJ API/NSg # application programming interface, cf. ABI APO/N APR/N AR/JNO # US state (Arkansas) ARC/NOJ ASAP/ # as soon as possible ASCII/OgS ASIO/Og # agency ASL/Og # American Sign Language ASML/Og # company ASPCA/O AST/NgS # abstract syntax tree ATM/NgS # automated teller machine ATP/ONg ATV/ON # all-terrain vehicle ATX/Ng # old motherboard std AV/JNO AVI/O # media format AWACS/Ng AWOL/JNg # absent without leave AWS/ONg AZ/Og # US state (Arizona) AZT/Ng # drug Aachen/Og Aaliyah/Og Aaron/ONg Abarth/OgS Abbas/Og Abbasid/NgJ Abbott/Og Abby/ONg Abdul/Og Abe/ONg Abel/Og Abelard/Og Abelson/Og Aberdeen/ONg Abernathy/Og Abidjan/Og Abigail/Og Abilene/OgJ Abner/Og Aborigine/NgS Abraham/ONg Abram/ONSgJ Abrams/Og Absalom/Og Abuja/Og Abyssinia/OgJ Abyssinian/JNOg Ac/ # Actinium Acadia/Og Acapulco/Og Accenture/g Accra/Og Acevedo/Og Achaean/NgJ Achebe/Og Achernar/Og Acheson/Og Achilles/Og Aconcagua/Og Acosta/Og Acropolis/O Acrux/Og Actaeon/ONgV Acton/Og Acts/ONg Acuff/Og Acura/NOSg Ada/OgS Adam/OgS Adams/ONg Adan/g Adana/Og Adar/Og Addams/Og Adderley/Og Addie/ONg Addison/Og Adela/Og Adelaide/Og Adele/Og Adeline/Og Aden/Og Adenauer/g Adhara/Og Adidas/ONg Adirondack/NOSg Adirondacks/NOg Adkins/Og Adler/Og Adm/N Admiralty/O Adolf/Og Adolfo/g Adolph/Og Adonis/ONSg Adrenalin/Sg Adrian/OgJ Adriana/Og Adriatic/JOg Adrienne/Og Advent/OgS Adventist/NgSJ Advil/Og Aegean/JOg Aelfric/g Aeneas/Og Aeneid/Og Aeolus/Og Aeroflot/Og Aeschylus/Og Aesculapius/Og Aesop/Og Afghan/NOSgJ Afghani/NgJ Afghanistan/Og Afr Africa/Og African/JNSg Afrikaans/ONgJ Afrikaner/NSg Afro/NSg Afrocentric/J Afrocentrism/Ng Afrofuturism/Ng Ag/ # Silver Agamemnon/Og Agana/O Agassi/Og Agassiz/Og Agatha/Og Aggie/ONg Aglaia/Og Agnes/Og Agnew/Og # spiro - Agni/Og Agra/Og Agricola/g Agrippa/Og Agrippina/Og Aguadilla/Og Aguascalientes/O Aguilar/Og Aguinaldo/g Aguirre/Og Agustin/Og Ahab/Og Ahmad/Og Ahmadabad/Og Ahmadinejad/Og Ahmed/Og Ahriman/Og Aida/Og Aiken/Og Aileen/Og Aimee/Og Ainu/NOmgJ # ethnicity, language Airedale/ONSg Aires/g Aisha/Og Ajax/Og # should we also include AJAX? Akbar/Og Akhmatova/g Akihito/g Akira/OgS Akita/ONg Akiva/Og Akkad/Og Akron/Og Al/Og # aluminium, aluminum; given name Ala/NOS Alabama/NOg Alabaman/JNgS Alabamian/JNSg Aladdin/Og Alamo/Og Alamogordo/Og Alan/ONg Alana/Og Alar/Ng Alaric/Og Alaska/ONg Alaskan/JNgS Alawite/NSg Alba/Og Albania/Og Albanian/JNOSg Albany/Og Albee/Og Alberio/g Albert/ONg Alberta/Og Albertan/JNO Alberto/g Albigensian/JNg Albion/Og Albireo/Og Albuquerque/Og Albury/Og Alcatraz/Og Alcestis/g Alcibiades/Og Alcindor/Og Alcmena/Og Alcoa/g Alcott/Og Alcuin/Og Alcyone/Og Aldan/g Aldebaran/Og Alden/Og Alderamin/Og Aldo/Og Aldrin/Og Alec/Og Aleichem/g Alejandra/g Alejandro/Og Alembert/g Aleppo/Og Aleut/JNOSg Aleutian/JNSg Alex/Og Alexander/ONSg Alexandra/Og Alexandria/Og Alexandrian/JN Alexei/Og Alexis/Og Alfonso/Og Alfonzo/Og Alford/Og Alfred/Og Alfreda/Og Alfredo/Ng Algenib/Og Alger/Og Algeria/Og Algerian/NSgJ Algieba/Og Algiers/Og Algol/Og Algonquian/JNSg Algonquin/NOSg Alhambra/ONg Alhena/Og Ali/Og Alice/Og Alicia/Og Alighieri/g Aline/Og Alioth/Og Alisa/Og Alisha/Og Alison/Og Alissa/Og Alistair/Og Alkaid/Og Allah/Og Allahabad/Og Allan/Og Alleghenies/Og Allegheny/OgS Allegra/Og Allen/ONg Allende/Og Allentown/Og Allhallows/Og Allie/OgS Allison/Og Allstate/g Allyson/Og Alma/Og Almach/Og Almaty/Og Almighty/Og Almohad/Jg Almoravid/Ng Alnilam/Og Alnitak/Og Alonzo/Og Alpert/Og Alphard/Og Alphecca/Og Alpheratz/Og Alphonse/Og Alphonso/ONg Alpine/JOg Alpo/g Alps/Og Alsace/Og Alsatian/JNOSg Alsop/Og Alston/Og Alta/Og Altaba/g Altai/ONg Altaic/Jg Altair/Og Altamira/Og Althea/Og Altiplano/Og Altman/Og Altoids/g Alton/Og Altoona/Og Aludra/Og Alva/Og Alvarado/Og Alvarez/Og Alvaro/g Alvin/Og Alyce/g Alyson/Og Alyssa/Og Alzheimer/Ng Am/ # Americium Amadeus/Og Amado/Og Amalia/Og Amanda/Og Amarillo/Og Amaru/Og Amaterasu/Og Amati/Ng Amazon/NOSgV Amazonian/JON Amber/Og Amdahl/Og # As in Amdahl's law Amelia/Og Amen/Og Amenhotep/g Amerasian/NgJ America/OgS American/NOSgJ Americana/Ng Americanisation/NgS!_₹ Americanise/VGdS!_₹ Americanism/NwgS Americanization/NgS Americanize/VGdS Amerind/NSgJ Amerindian/JNgS Ames/Og Ameslan/Og Amgen/g Amharic/Og Amherst/ONg Amie/Og Amiga/g Amish/NgJ Amman/Og Amoco/g Amos/Og Amparo/g Ampere/g Amritsar/Og Amsterdam/Og Amstrad/NOSg Amtrak/Og Amundsen/Og Amur/Og Amway/g Amy/Og Ana/ONg Anabaptist/NgJ Anabel/Og Anacin/g Anacreon/Og Anaheim/ONg Analects/Og Ananias/Og Anasazi/Ng Anastasia/Og Anatole/Og Anatolia/Og Anatolian/JNOSg Anaxagoras/Og Anchorage/Og Andalusia/Og Andalusian/JNOg Andaman/Jg Andean/JNg Anders/Og Andersen/Og Anderson/Og Andes/Og Andorra/Og Andorran/NSgJ Andre/OgS Andrea/Og Andreas/Og Andrei/Og Andres/Og Andretti/ONg Andrew/OgS Andrews/Og Andrianampoinimerina/g Android/ONg Andromache/Og Andromeda/Og Andropov/g Andy/ONg Angara/Og Angel/NOg Angela/Og Angeles/Og Angelia/g Angelica/Og Angelico/g Angelina/ONg Angeline/Og Angelique/Og Angelita/g Angelo/Og Angelou/g Angevin/JNg Angie/Og Angkor/Og Angle/NgS Angleton/Og Anglia/Og Anglican/JNSg Anglicanism/NgS Anglicism/NgS Anglicization/N Anglicize/VGdS Anglo/Ng Anglophile/NgJ Anglophobe/N Anglosphere/Ng Angola/ONg Angolan/JNgS Angora/NOSg Angstrom/Ng Anguilla/Og Angus/Og Anhui/Og Aniakchak/g Anibal/g Anita/Og Ankara/ONg Ann/ONgJ Anna/Og Annabel/Og Annabelle/Og Annam/Og Annapolis/Og Annapurna/Og Anne/Og Annette/Og Annie/Og Anniston/Og Annmarie/g Annunciation/OgS Anouilh/g Anselm/Og Anselmo/Og Anshan/Og Antaeus/Og Antalya/Og Antananarivo/Og Antarctic/JOg Antarctica/Og Antares/Og Anthony/Og Anthropocene/Og # geological period Antichrist/OgS Antietam/Og Antifa/ONg Antigone/Og Antigua/Og Antillean/JN Antilles/Og Antioch/Og Antipas/Og Antipodes/O Antofagasta/Og Antoine/Og Antoinette/Og Anton/Og Antone/Og Antonia/Og Antoninus/g Antonio/Og Antonius/Og Antony/Og Antwan/Og Antwerp/Og Anubis/Og Anzac/ONg Apache/ONSg Apalachicola/Og Apatosaurus/O Apennines/Og Aphrodite/Og Apia/Og Apocalypse/Og Apocrypha/Og Apollinaire/g Apollo/ONSg Apollonian/JNg Apostle/NOg Appalachia/Og Appalachian/JNOSg Appalachians/ONg Appaloosa/NSg Apple/ONg Appleseed/g Appleton/Og Appomattox/Og Apr/Og April/OgS Apuleius/Og Aquafresh/g Aquarian/JN Aquarius/ONSg Aquila/Og Aquinas/Og Aquino/Og Aquitaine/Og Ar/ # Argon Ara/Og Arab/JNSg Arabia/Og Arabian/JNgS Arabic/JONg Arabist/NgSJ Araby/Og Araceli/Og Arafat/Og Aragon/O Araguaya/g Aral/Og Aramaic/ONgJ Aramco/g Arapaho/NOS09g Arapahoes/N9 Ararat/Og Araucanian/NOgJ Arawak/NOgJ Arawakan/Jg Arbitron/g Arcadia/ONg Arcadian/NgJ Archean/JOg Archibald/Og Archie/ONg Archimedes/Og Arctic/JONg Arcturus/Og Ardabil/O Arden/Og Arduino/g Arecibo/Og Arequipa/Og Ares/Og Argentina/Og Argentine/JNOSg Argentinean/JN Argentinian/NgSJ Argo/OgS Argonaut/ONSg Argonne/Og Argos/Og Argus/ONg Ariadne/Og Arianism/Nmg Ariel/Og Aries/ONSg Ariosto/g Aristarchus/Og Aristides/Og Aristophanes/Og Aristotelian/NgJ Aristotle/Og Arius/Og Ariz/O Arizona/Og Arizonan/JNSg Arizonian/JNgS Arjuna/Og Ark/Og Arkansan/JNgS Arkansas/Og Arkhangelsk/Og Arkwright/Og Arlene/Og Arline/Og Arlington/Og Armageddon/OgS Armagnac/ONg Armand/Og Armando/Og Armani/ONg Armenia/Og Armenian/JNOSg Arminius/Og Armonk/g Armour/Og Armstrong/ONg Arneb/Og Arnhem/Og Arno/Og Arnold/Og Arnulfo/g Aron/Og Arrhenius/Og Arron/Og Art/Og Artaxerxes/Og Artemis/Og Arthur/ONg Arthurian/Jg Artie/Og Arturo/g Aruba/Og Aryan/NOSgJ As/ # Arsenic Asahi/Og Asama/g Ascella/Og Ascension/Og Asgard/Og Ashanti/NOg Ashcroft/Og Ashe/Og Asheville/Og Ashgabat/O Ashikaga/Og Ashkenazim/N9g Ashkhabad/Og Ashlee/Og Ashley/Og Ashmolean/JOg Ashurbanipal/g Asia/Og Asiago/O Asian/NgSJ Asiatic/JNSg Asimov/Og Asmara/Og Asoka/Og Aspell/g Aspen/Og Asperger/ONg Aspidiske/Og Asquith/Og Assad/Og Assam/ONg Assamese/JONg Assembly/O Assisi/Og Assyria/Og Assyrian/NOSgJ Astaire/Og Astana/Og Astarte/Og Aston/ONg Astor/Og Astoria/Og Astrakhan/ONg AstroTurf/Ng Asturias/Og Asunción/Og Asuncion/Og Aswan/Og Atacama/Og Atahualpa/g Atalanta/Og Atari/Ng Atascadero/Og Ataturk/g Athabasca/Og Athabaskan/JONSg Athanasius/O Athena/ONg Athene/Og Athenian/NSgJ Athens/Og Atkins/Og Atkinson/Og Atlanta/Og Atlantes Atlantic/ONgJ Atlanticism/Ng Atlanticist/NSg Atlantis/Og Atlas/ONSg Atman/Ng Atonement Atreus/Og Atria/g Atropos/Og Attic/JOg Attica/Og Attila/Og Attlee/Og Attn Attucks/g Atwood/Og Au/ # Gold Aubrey/Og Auburn/Og Auckland/Og Auden/Og Audi/ONg Audion/g Audra/Og Audrey/Og Audubon/Og Aug/Og Augean/Jg Augsburg/Og August/OgS Augusta/Og Augustan/Jg Augustine/ONg Augustinian/JNgS Augustus/Og Aurangzeb/Og Aurelia/Og Aurelio/g Aurelius/Og Aureomycin/g Auriga/Og Aurora/Og Auschwitz/Og Aussie/NOSgJ Austen/Og Austerlitz/Og Austin/OgSJ Australasia/Og Australasian/JN Australia/Og Australian/NOSgJ Australoid/Ng Australopithecus/ONg Austria/Og Austrian/JNSg Austronesian/JNg Autumn/Og Av/Og Ava/Og Avalon/Og Ave/Ng Aventine/JNOg Avernus/Og Averroes/Og Avery/Og Avesta/OgJ Avicenna/Og Avignon/Og Avila/Og Avior/g Avis/Og Avogadro/Og Avon/Og Avondale/Og Axis/O Axum/Og Ayala/Og Ayers/Og Aymara/NOg Ayrshire/ONg Ayurveda/NwgS Ayutthaya/Og Ayyubid/JNg Azana/g Azania/Og Azazel/Og Azerbaijan/Og Azerbaijani/NOSgJ Azores/Og Azov/Og Aztec/NOSgJ # ancient civilization Aztecan/JNg Aztlan/Og B/ # Boron B-52/NgS BA/NOgJ BASIC/OgS BB/NOg BBB/ONg BBC/ONg BBQ/NV BBS/N BBSes/N BC/ONgJ BFF/N BIA/O BIOS/N BITNET/O BJJ/Ng BLT/NSg BM/NOgV BMW/ONSgV BMX/NgS BO/NOV BP/ONgJ BPOE/O BR/NO BRICS/Og BS/ONgV BSA/NO BSD/ONSg BTU/N BTW/ BYOB/ Ba/ # Barium Baal/OgS Baath/Og Baathist/JNg Babbage/Og Babbitt/ONg Babel/ONSg Babylon/OgS Babylonia/Og Babylonian/JNOSg Bacall/Og Bacardi/g Bacchanalia/Ng Bacchic/J Bacchus/Og Bach/Og Backus/Og Bacon/Og Bactria/Og Baden/Og Badlands/Og Baedeker/ONSg Baez/Og Baffin/Og Baggies/NOg Baghdad/Og Baguio/Og Baha'i/NgJ Baha'ullah/Og Bahama/JNSg Bahamanian/JNgS Bahamas/Og Bahamian/JNgS Bahia/Og Bahrain/Og Baidu/OgV Baikal/Og Bailey/ONg Baird/Og Bakelite/Nmg Baker/ONg Bakersfield/Og Baku/Og Bakunin/g Balanchine/g Balaton/Og Balboa/Og Balder/Og Baldwin/ONSg Balearic/JOg Balfour/Og Bali/Og Balinese/JNg Balkan/JOgS Balkans/Og Balkhash/g Ball/Og Ballard/Og Balthazar/ONg Baltic/JOg Baltics/O9 Baltimore/ONg Baluchistan/Og Balzac/Og Bamako/Og Bambi/Og Banach/JOg Bancroft/Og Bandung/Og Bangalore/ONgV Bangkok/Og Bangla/Og Bangladesh/Og Bangladeshi/NSgJ Bangor/Og Bangui/Og Banjarmasin/Og Banjul/Og Banks/Og Banneker/g Bannister/Og Bannon/OgS Banting/Og Bantu/NgS Baotou/Og Baptist/NSgJ Baptiste/Og Barabbas/Og Barack/OgJ Barbadian/NSgJ Barbados/Og Barbara/Og Barbarella/g Barbarossa/Og Barbary/Og Barber/Og Barbie/ONg Barbour/Og Barbra/Og Barbuda/Og Barcelona/Og Barceloneta/g Barclay/OgS Barclays/Og Bardeen/Og Barents/Og Barker/Og Barkley/Og Barlow/ONg Barnabas/Og Barnaby/NOg Barnard/Og Barnaul/Og Barnes/Og Barnett/Og Barney/Og Barnum/Og Baroda/Og Barquisimeto/g Barr/Og Barranquilla/Og Barrera/Og Barrett/Og Barrie/Og Barron/Og Barry/Og Barrymore/Og Bart/NOg Barth/OgS Bartholdi/g Bartholomew/Og Bartlett/ONg Bartok/Og Barton/Og Baruch/Og Baryshnikov/g Basel/Og Basho/g Basie/g Basil/Og Basque/NOSgJ Basra/Og Bass/Og Basseterre/Og Bastille/Og Basutoland/Og Bataan/Og Bates/Og Bathsheba/Og Batista/Og Batman/OgV Battle/Og Batu/Og Batumi/Og Baudelaire/g Baudouin/g Baudrillard/g Bauer/Og Bauhaus/Og Baum/Og Bavaria/Og Bavarian/JNOg Baxter/Og Bayamon Bayer/Og Bayes/Og Bayesian/JNg Bayeux/Og Baylor/Og Bayonne/Og Bayreuth/Og Baywatch/g Be/ # Beryllium Beach/Og Beadle/Og Beamer/NgS # nickname for BMW Bean/Og Beard/Og Beardmore/Og Beardsley/Og Bearnaise/g Beasley/Og Beatlemania/Ng Beatles/ONg Beatrice/Og Beatrix/Og Beatriz/g Beatty/Og Beau/Og Beaufort/ONg Beaujolais/Ng Beaumarchais/g Beaumont/Og Beauregard/ONg Beauvoir/g Bechtel/Og Beck/Og> Becker/Og Becket/g Beckett/Og Beckley/Og Beckman/O Becky/ONg Becquerel/g Bede/Og Bedouin/NSg Beebe/Og Beecher/Og Beefaroni/g Beelzebub/Og Beerbohm/g Beethoven/Og Beeton/Og Begin/g Behan/Og Behring/g Beiderbecke/g Beijing/Og Beirut/Og Bekesy/g Bela/Og Belarus/Og Belarusian/JN Belau/g Belem/Og Belfast/Og Belg Belgian/NOSgJ Belgium/Og Belgrade/Og Belinda/Og Belize/Og Bell/ONg Bella/Og Bellamy/Og Bellatrix/Og Belleek/ONg Bellingham/Og Bellini/ONg Bellow/Og Belmont/Og Belmopan/Og Beloit/Og Belorussian/JNOSg Belshazzar/ONg Beltane/Og Belushi/g Ben/ONg Benacerraf/g Benchley/g Bend/Og> Bender/Og Bendictus Bendix/g Benedict/Og Benedictine/NgSJ Benelux/Og Benet/g Benetton/g Bengal/ONSg Bengali/JNg Bengaluru/Og Benghazi/Og Benin/Og Beninese/JNg Benita/g Benito/Og Benjamin/ONg Bennett/Og Bennie/Og Benny/ONg Benson/Og Bentham/Og Bentley/ONSg Benton/Og Benz/ONg Benzedrine/g Beowulf/Og Berber/NOSgJ Berenice/Og Beretta/Ng Berg/Og>n Bergen/Og Berger/Og Bergerac/Og Bergman/Og Bergson/Og Beria/Og Bering/Og Berkeley/Og Berkshire/ONSg Berkshires/NOg Berle/g Berlin/ONSg>Z Berliner/Ng Berlioz/Og Berlitz/Og Bermuda/ONSg Bermudan/NSgJ Bermudian/JNSg Bern/Og Bernadette/Og Bernadine/Og Bernanke/g Bernard/Og Bernardo/g Bernays/Og Bernbach/g Bernese/JN Bernhardt/Og Bernice/Og Bernie/Og Bernini/g Bernoulli/Og Bernstein/Og Berra/Og Berry/Og Bert/Og Berta/OgJ Bertelsmann/g Bertha/Og Bertie/Og Bertillon/g Bertram/Og Bertrand/Og Berwick/Og Beryl/Og Berzelius/g Bess/Og Bessel/Og Bessemer/ONg Bessie/Og Best/Og Betelgeuse/Og Beth/Og Bethany/Og Bethe/Og Bethesda/ONg Bethlehem/ONg Bethune/Og Betsy/Og Bette/Og Bettie/Og Betty/ONg Bettye/g Beulah/Og Beveridge/O Beverley/Og Beverly/Og Beyer/Og Bézier curve/NgS Bharat/Og₹ Bhopal/Og Bhutan/Og Bhutanese/JONg Bhutto/Og Bi/ # Bismuth Bialystok/Og Bianca/Og Bib Bible/ONSg Bic/ONg Biddle/Og Biden/OgS Bierce/Og BigQuery/g Bigfoot/ONgV Biggles/g Biko/Og Bilbao/Og Bilbo/Og Bill/Ogz Billie/Og Billings/Og Billy/Og Bimini/Og Binghamton/Og Biogen/g Bioko/Og Bird/Og Birdseye/g Birkenstock/g Birmingham/Og Biro/Og Biscay/Og Biscayne/JOg Bishkek/Og Bishop/ONg Bismarck/ONg Bismark/g Bisquick/Ng Bissau/Og BitTorrent/Og Bizet/Ng Bjerknes/g Bjork/Og Bk/ # Berkelium BlackBerry/NgV Blackbeard/Og Blackburn/Og Blackfeet/9g Blackfoot/NOg Blackpool/Og Blacksburg/Og Blackshirt/Ng Blackstone/Og Blackwell/Og Blaine/Og Blair/Og Blake/Og Blanca/g Blanchard/Og Blanche/Og Blankenship/Og Blantyre/Og Blatz/Og Blavatsky/Og Blenheim/ONg Blevins/Og Bligh/Og Bloch/Og Blockbuster/g Bloemfontein/Og Blondel/g Blondie/g Bloom/Og> Bloomberg/Og Bloomer/Og Bloomfield/Og Bloomingdale/Og Bloomington/Og Bloomsburg/Og Bloomsbury/Og Blu Blucher/ONg Bluebeard/ONg Bluetooth/OgV Blumenthal/Og Blvd Blythe/Og Boadicea/O Boas/ONg Bob/ONg Bobbi/Og Bobbie/Og Bobbitt/Og Bobby/Og Boccaccio/Og Bodhidharma/g Bodhisattva/g Bodleian/JO Boeing/ONg Boeotia/Og Boeotian/JNOg Boer/NOSg Boethius/Og Bogart/Og Bogotá/Og Bogota/Og Bohemia/ONg Bohemian/NOSgJ Bohr/Og Boise/Og Bojangles/g Boleyn/Og Bolivar/ONg Bolivia/Og Bolivian/NgSJ Bollywood/Og Bologna/Og Bolshevik/NSg Bolsheviki/N Bolshevism/Ng Bolshevist/Ng Bolshoi/g Bolton/Og Boltzmann/Og Bombay/ONg Bonaparte/Og Bonaventure/Og Bond/Og Bondi/OgS Bondo/Og Bonhoeffer/g Boniface/Og Bonita/Og Bonn/Og> Bonner/ONg Bonneville/Og Bonnie/Og Bono/Og Booker/Og Boole/Og Boolean/JNgS Boone/Og Bootes/g Booth/Og Bordeaux/ONg Borden/ONg Bordon/Og Boreas/Og Borg/ONSgV Borges/Og Borgia/Og Borglum/g Boris/Og Bork/OgV Borlaug/g Born/Og Borneo/Og Borobudur/Og Borodin/g Boru/g Bosch/Og Bose/Og Bosnia/Og Bosnian/JN Bosporus/Og Boston/ONSg Bostonian/NgJ Boswell/ONg Botha/O Botox/OV Botswana/Og Botticelli/Og Boulder/Og Boulez/g Bourbaki/g Bourbon/OgS Bournemouth/Og Bovary/g Bowditch/Og Bowell/Og Bowen/Og Bowers/Og Bowery/OgJ Bowie/ONg # david - Bowman/Og Boyd/Og Boyer/Og Boyle/Og Br/ # Bromine Brad/OgY Bradbury/ONg # ray = Braddock/Og Bradenton/Og Bradford/ONg Bradley/Og Bradly/Og Bradshaw/ONg Bradstreet/Og Brady/Og Bragg/Og Brahe/Og Brahma/ONSg Brahmagupta/Og Brahman/NOSg Brahmani/N Brahmanism/OgSw Brahmaputra/ONg Brahms/Jg Braille/ONSgJ Brain/Og Brampton/Og Bran/Og Branch/Og Brandeis/Og Branden/Og Brandenburg/ONg Brandi/Og Brandie/Og Brando/g Brandon/Og Brandt/Og Brandy/Og Brant/Og Braque/g Brasilia/Og Bratislava/Og Brattain/Og Bray/Og Brazil/Og Brazilian/NgSJ Brazos/Og Brazzaville/Og Breakspear/g Breathalyzer Brecht/g Breckenridge/Og Bremen/Og Bremerton/Og Brenda/Og Brendan/Og Brennan/Og Brenner/Og Brent/Og Brenton/Og Bresenham/Og Brest/Og Bret/Og Breton/NOgJ Brett/ONg Bretton Woods/Og Brewer/NOg Brewster/Og Brexit/OV Brezhnev/Og Brian/Og Briana/Og Brianna/Og Brice/Og Bridalveil/g Bridgehampton/Og Bridgeport/Og Bridger/Og Bridges/Og Bridget/ONg Bridgetown/Og Bridgett/Og Bridgette/g Bridgman/Og Brie/ONSwg Brigadoon/Ng Briggs/Og Brigham/Og Bright/Og Brighton/Og Brigid/Og Brigitte/g Brillo/g Brillouin Brinkley/Og Brisbane/Og Bristol/ONg Brit/NOSgJ Britain/ONgJ Britannia/Og Britannic/Jg Britannica/Og Briticism/NSg British/NOgJ>Z Britisher/NgJ₹ Britney/ONg Briton/NgS Britt/Ogn Brittany/ONSg Britten/Og Brittney/Og Brno/Og Broadway/ONSgJ Brobdingnag/Og Brobdingnagian/JNg Brock/Og Brokaw/Og Bronson/Og Bronte/Og Brontosaurus/O Bronx/ONg Brooke/OgS Brooklyn/Og Brooks/Og Bros/O Brown/ONgJG Browne/Og Brownian/Jg Brownie/NOS Browning/ONg Brownshirt/Ng Brownsville/Og Brubeck/g Bruce/Og Bruckner/Og Bruegel Brummel/Og Brunei/Og Bruneian/NgSJ Brunelleschi/g Brunhilde/Og Bruno/Og Brunswick/Og Brussels/ONg Brut/g Brutalism/Ng Brutalist/NgSJ Brutus/ONg Bryan/Og Bryant/Og Bryce/Og Brynner/g Bryon/Og Brzezinski/Og Buber/g Buchanan/Og Bucharest/Og Buchenwald/Og Buchwald/Og Buck/Og Buckingham/Og Buckley/Og Buckner/Og Bud/Og Budapest/Og Buddha/ONSg Buddhism/NSg Buddhist/JNSg Buddy/Og Budweiser/ONg Buffalo/Og Buffet/OgS Buffett/OgS Buffy/Og Buford/Og Bugatti/ONg Bugzilla/Og Buick/ONSg Bujumbura/Og Bukhara/Og Bukharin/Og Bulawayo/Og Bulfinch/g Bulganin/g Bulgar/NOgJ Bulgari/g Bulgaria/Og Bulgarian/JNSg Bullock/Og Bullwinkle/g Bultmann/g Bumppo/g Bunche/g Bundesbank/g Bundestag/Og Bunin/g Bunker/Og Bunsen/ONg Bunuel/g Bunyan/Og Burbank/ONg Burberry/Og Burch/Og Burger/Ng Burgess/Og Burgoyne/Og Burgundian/NOgJ Burgundy/ONSg Burke/Og Burks/Og Burl/Og Burlington/Og Burma/Og # old name of Myanmar Burmese/JNOg Burnett/Og Burns/Og Burnside/Og Burr/Og Burris/Og Burroughs/Og Bursa/Og Burt/Og Burton/Og Burundi/Og Burundian/NgSJ Busan/Og Busch/Og Bush/Og Bushido/g Bushnell/Og Butler/Og Butterfingers/g Buxtehude/g Byblos/Og Byers/Og Byrd/Og Byron/Og Byronic/Jg Byzantine/JNgS Byzantium/ONg C/NOg # Carbon CA/ON # US state (California) CAD/Ng # computer-aided design; canadian dollar CAI/NO CAM/NO CAP/NO CARE CATV/N CB/NOJ # citizen's band (radio) CBC/ONgJ CBS/ONg # media company CCP/Og # political party CCTV/NO # closed-circuit television CCU/N CD/NSgV CD-ROM/NgS CDC/ON CDMX/Og # Mexico City, see also DF CDT/N CEO/NgS # chief executive officer CF/NOJ CFC/ONg CFO/NO # financial officer CGI/NOV # computer graphics interface; common gateway interface CIA/ONgJ # agency CID/NO CIS/Og # commonwealth of independent states CLI/NgS # command line interface CNBC/Og CNC/NgV # computer numerical control CNC'd/VtT # past CNCing/NV6 # present, gerund CNN/ONSg # media company; convolutional neural network CNS/Ng CO/ONgV # US state (Colorado) COBOL/OgS # programming language COD/ON COFF/ONg # common object file format COL/ON COLA/NO COVID/N # virus CO₂/N CPA/Ng CPI/NOg CPO/N CPR/NOg # cardiac pulmonary resuscitation CPU/NgS CRT/NSg # cathode ray tube CSS/NOg CST/ONg CSV/Ng # data file format CT/ONgVJ # US state (Connecticut) CUDA/ONg # computing architecture CV/NOSJ # curriculum vitae CVS/NOg # version control CZ/N Ca/ # Calcium Cabernet/g Cabot/Og Cabral/g Cabrera/Og Cabrini/g Cadette Cadillac/ONSgJ # car company Cadiz/Og Caedmon/Og Caerphilly/Og Caesar/ONSg Cage/Og Cagney/Og Cahokia/Og Caiaphas/Og Cain/OgS Cairo/Og Caitlin/Og Cajun/NgSJ Cal/Og Calais/Og Calcutta/Og Calder/Og Calderon/Og Caldwell/Og Caleb/Og Caledonia/Og Calexico/Og Calgary/Og Calhoun/Og Cali/Og Caliban/ONg Calif/O California/Og Californian/JNSg Caligula/Og Callaghan/Og Callahan/Og Callao/Og Callas/g Callie/Og Calliope/Og Callisto/Og Caloocan/Og Calvary/Og Calvert/Og Calvin/Og Calvinism/NwgS Calvinist/NgSJ Calvinistic/J Camacho/Og Camarillo/Og Camaro/NOSg Cambodia/Og Cambodian/JNSg Cambrian/JNOSg Cambridge/Og Camden/Og Camel/ONg Camelopardalis/Og Camelot/OgS Camembert/ONSwg Cameron/Og Cameronian/NgS Cameroon/ONSg Cameroonian/JNgS Camilla/Og Camille/Og Camoens/Og Campanella/g Campbell/ONg Campinas/Og Campos/g Camry/g Camus/Og Can/Og Canaan/Og Canaanite/ONSgJ Canad Canada/ONg Canadian/JNOSg Canadianism/Nmg Canaletto/g Canaries/Og Canaveral/Og Canberra/Og Cancer/ONSg Cancun/Og Candace/ONg Candice/Og Candide/Og Candy/Og Cannes/Og Cannon/Og Canon/ONg Canopus/ONg Cantabrigian/JNg Canterbury/Og Canton/Og Cantonese/JNmg Cantor/Og Cantrell/Og Cantu/Og Canute/Og Capablanca/g Capek/Og Capella/Og Capet/g Capetian/JNg Capetown/Og Caph/Og Capistrano/Og Capitol/OgS Capitoline/OgJ Capone/Og Capote/Og Capra/Og Capri/Og Capricorn/ONSg Capt/N Capuchin/Ng Capulet/Ng Cara/Og Caracalla/Og Caracas/Og Caravaggio/Og Carboloy/Ng Carbondale/Og Carboniferous/JOg Carborundum/Ng Cardenas/Og Cardiff/Og Cardin/Og Cardozo/Og Carey/Og Carib/NOSg Caribbean/JNOSg Carina/Og Carissa/Og Carl/ONg Carla/Og Carlene/Og Carlin/Og Carlo/OgS Carlos/Og Carlsbad/Og Carlson/Og Carlton/Og Carly/Og Carlyle/Og Carmela/g Carmella/g Carmelo/g Carmen/Og Carmichael/Og Carmine/Og Carnap/Og Carnation/g Carnegie/Og Carney/ONg Carnot/Og Carol/Og Carole/Og Carolina/Og Caroline/JNOg Carolingian/JNg Carolinian/JNOg Carolyn/Og Carpathian/JNSg Carpathians/Og Carpenter/Og Carr/Og Carranza/Og Carrera/OgS Carrie/Og> Carrier/Og Carrillo/Og Carroll/Og Carson/Og Carter/Og Cartersville/Og Cartesian/JNg Carthage/Og Carthaginian/JNgS Cartier/Og Cartwright/Og Caruso/Og Carver/Og Cary/Og Casablanca/Og Casals/Og Casandra/g Casanova/NOSg Cascades/Og Case/NOg Casey/Og Cash/Og Casio/g Caspar/Og Casper/ONg Caspian/JNg Cassandra/ONSg Cassatt/g Cassidy/Og Cassie/Og Cassiopeia/Og Cassius/Og Castaneda/Og Castilian/ONJ Castillo/Og Castlereagh/g Castor/Og Castries/Og Castro/Og Catalan/NOSgJ Catalina/ONg Catalonia/Og Catawba/NOg Caterpillar/g Cathay/Og Cather/Og Catherine/Og Cathleen/Og Catholic/JNgS Catholicism/NgS Cathryn/Og Cathy/Og Catiline/ONg Cato/Og Catskill/OgSJ Catskills/Og Catt/Og Catullus/Og Caucasian/JNgS Caucasoid/JN Caucasus/Og Cauchy/OgJ Cavendish/ONg Cavour/g Caxton/ONg Cayenne/Og Cayman/JOg Cayuga/NOSg Cayuse/N Cb/ Cd/ # Cadmium Ce/ # Cerium Ceausescu/g Cebu/Og Cebuano/OgJ Cecelia/Og Cecil/Og Cecile/Og Cecilia/Og Cecily/Og Cedric/Og Celeste/Og Celgene/g Celia/Og Celina/Og Cellini/Og Celsius/Jg Celt/NSgJ Celtic/OgSJ Cenozoic/JOg Centaurus/Og Centigrade Central/O Centronics/O Cepheid/Ng Cepheus/Og Cerberus/Og Cerenkov/g Ceres/Og Cerf/Og Cervantes/Og Cesar/Og Cesarean/JNg Cessna/Og Cetus/Og Ceylon/ONg # old name of Sri Lanka Ceylonese/JN Cezanne/g Cf/ # Californium Ch'in/Og Chablis/ONg Chad/ONg Chadian/JNgS Chadwick/Og Chagall/NOg Chagas disease/Nmg Chaitanya/g Chaitin/g Chaldea/O Chaldean/JNOg Challenger/ONg Chalmers/O Chamberlain/Og Chambers/Og Chambersburg/Og Champaign/Og Champlain/Og Champollion/g Chan/ONg Chance/Og Chancellorsville/Og Chandigarh/Og Chandler/ONg Chandon/g Chandra/Og Chandragupta/g Chandrasekhar/g Chanel/ONg Chaney/Og Chang/Og Changchun/Og Changsha/Og Chantilly/ONg Chaplin/Og Chaplinesque/J Chapman/Og Chappaquiddick/Og Chapultepec/g Charbray/g Chardonnay/Ng Charity/Og Charlemagne/Og Charlene/Og Charles/Og Charleston/ONSg Charley/ONg Charlie/NOg Charlotte/ONg Charlottesville/Og Charlottetown/Og Charmaine/Og Charmin/Og Charolais/Ng Charon/ONg Chartism/Og Chartres/Og Charybdis/Og Chase/Og Chasity/g Chateaubriand/g Chattahoochee/Og Chattanooga/Og Chatterley/Og Chatterton/Og Chattogram/Og Chaucer/Og Chauncey/Og Chautauqua/ONg Chavez/Og Chayefsky/g Che/g Chechen/NOgJ Chechnya/Og Cheddar/ONg Cheer/g Cheerios/ONg Cheetos/Ng Cheever/Og Chekhov/Og Chekhovian/J Chelsea/Og Chelyabinsk/Og Chen/ONg Cheney/Og Chengdu/Og Chennai/Og Cheops/Og Cheri/Og Cherie/Og Chernenko/g Chernobyl/ONg Chernomyrdin/g Cherokee/NOSg09 # singular and plural, but also has plural in -s Cherry/ONg Cheryl/Og Chesapeake/NOg Cheshire/Og Chester/ONg Chesterfield/ONg Chesterton/Og Chev/NOSg Chevalier/g Cheviot/Ng Chevrolet/NOSg Chevron/Og Chevy/ONg Chevys/9 Cheyenne/NOSg Chi/ONg Chianti/NgS Chiba/Og Chibcha/Ng Chicago/Og Chicagoan/JNg Chicana/Ng Chicano/JNg Chickasaw/NOSg Chiclets/g Chico/Og Chihuahua/ONSg Chile/Og Chilean/JNgS Chimborazo/Og Chimera/OgS Chimu/g Chin/Og China/ONg Chinatown/NOg Chinese/JONmg Chinook/ONSg Chipewyan/NOg Chippendale/Og Chippewa/NOSg Chiquita/g Chirico/Og Chiron/Og Chisholm/Og Chișinău/Og Chisinau/Og Chittagong/Og # old name of Chattogram Chivas/g Chloe/Og Choctaw/ONSgJ Chomsky/Og Chomskyite/NgSJ Chongqing/Og Chopin/Og Chopra/Og Chou/Og Chretien/Og Chris/Og Christ/ONSg Christa/Og Christchurch/Og Christendom/NgS Christensen/Og Christi/g Christian/NOSgJ Christianise/V!_₹ Christianity/OgS Christianize/V Christie/Og Christina/Og Christine/Og Christlike/J Christmas/ONSgJV Christmastide/NgS Christmastime/NgS Christoper/g Christopher/Og Chromebook/NgS Chronicles/O Chrysler/ONSg Chrysostom/Og Chrystal/Og Chuck/ONg Chukchi/JNOg Chumash/ONg Chung/Og Church/Og Churchill/Og Churchillian/J Churriguera/g Chuvash/JNOg Ci/g Cicero/Og Cid/g Cimabue/g Cincinnati/ONg Cinderella/ONSg Cindy/Og CinemaScope/Ng Cinerama/Ng Cipro/g Circe/Og Cisco/Og Citibank/Og Citigroup/Og Citroen/Og Cl/ # Chlorine Claiborne/Og Clair/Og Claire/Og Clairol/g Clancy/Og Clapeyron/g Clapton/Og Clara/Og Clare/ONg Clarence/Og Clarendon/Og Clarice/Og Clarissa/ONg Clark/Og Clarke/Og Clarkson/OgS Clarksville/Og Claude/Og Claudette/g Claudia/Og Claudine/g Claudio/g Claudius/Og Claus/Og Clausewitz/Og Clausius/g Clay/Og Clayton/Og Clearasil/g Clem/OgX Clemenceau/Og Clemens/Og Clement/OgS Clementine/JOg Clements/Og Clemons/Og Clemson/OgV Cleo/Og Cleopatra/ONg Cleveland/Og Cliburn/Og Cliff/Og Clifford/Og Clifton/Og Cline/Og Clint/Og Clinton/OgS Clio/Og Clive/Og Clojure/Og Clorets/g Clorox/NgV Closure/g Clotho/Og Clouseau/Og Clovis/Og Clyde/Og Clydesdale/NOg Clytemnestra/Og Cm/ # Curium Cmdr/N Co/ # Cobalt Cobain/Og Cobb/Og Cochabamba/Og Cochin/NOg Cochise/g Cochran/Og Cockney/JNOg Cocteau/g Cod Cody/Og Coffey/Og Cognac/Og Cohan/Og Cohen/Og Coimbatore/Og Cointreau/ONg Coke/NOSg Col/Og Colbert/Og Colby/ONg Cole/Og Coleen/Og Coleman/Og Coleridge/Og Colette/g Colfax/Og Colgate/ONg Colin/Og Colleen/Og Collier/Og Collin/OgS Collins/ONg Colo/O Cologne/Og Colombia/Og Colombian/NgSJ Colombo/Og Colon/Og Coloradan/NSgJ Colorado/Og Coloradoan/NJ Colosseum/Og Colt/ONg Coltrane/Og Columbia/Og Columbine/ONg Columbus/ONgV Com Comanche/NOSg09J # singular and plural, but also has plural in -s Combs/Og Comdr Comintern/Og Commandment/N Commodore/OgS Commons/Og Commonwealth/O Communion/OgS Communism/Nmg Communist/NSgJ Como/Og # laku Comoran/JN Comoros/Og # country Compaq/g Compton/Og # company CompuServe/g Comte/g Conakry/Og # capital of Guinea Conan/Og Concepcion/Og Concetta/g Concord/OgS Concorde/Og Condillac/g Condorcet/g Conestoga/ONg Confederacy/Og Confederate/JNgS Confucian/JNSg Confucianism/Nmg Confucianist/NgS Confucius/Og Cong/Og Congo/ONg Congolese/NgJ Congregational/J Congregationalist/NgS Congress/ONSg Congressional/J Congreve/ONg Conley/Og Conn/>g Connecticut/Og Connellsville/Og Connemara/ONg Conner/Og Connery/Og Connie/ONg Connolly/Og Connors/Og Conrad/Og Conrail/g Conroe/Og Conservative/N Constable/Og Constance/Og Constantine/Og Constantinople/Og Constitution/O Consuelo/g Continent/ONg Continental/JNg Contreras/g Conway/Og Cook/Og Cooke/Og Cooley/Og Coolidge/Og Cooper/Og Cooperstown/Og Coors/Og Copacabana/Og Copeland/Og Copenhagen/ONg Copernican/JNOg Copernicus/Og Copland/Og Copley/Og Copperfield/Og Coppertone/g Coppola/Og Coptic/JNg Cora/ONg Cordelia/Og Cordilleras/g Cordoba/Og Corey/Og Corfu/Og Corg/ONg # company Corina/Og Corine/g Corinne/Og Corinth/Og Corinthian/JNgS Corinthians/ONg Coriolanus/g Coriolis/g Cork/O Corleone/g Cormack/Og Corneille/g Cornelia/Og Cornelius/Og Cornell/Og Corniche/NgS Corning/Og Cornish/JNOSg Cornwall/Og Cornwallis/Og Coronado/Og Corot/g Corp/O Correggio/g Corrine/Og Corsica/Og Corsican/JNOg Cortes/OgS Cortland/Og Corvallis/Og Corvette/Ng Corvus/Og Cory/Og Cosby/Og CosmosDB/g Cossack/Ng Costco/g Costello/Og Costner/Og Cote/Og Cotonou/Og Cotopaxi/g Cotswold/JNOg Cotton/Og Coulomb/Og Coulter/Og Countach/OgS Couperin/g Courbet/g Courtney/Og Cousteau/g Coventry/OgS Covington/Og Coward/Og Cowell/Og Cowley/Og Cowper/Og Cox/Og Coy/Og Coyle/Og Cozumel/Og Cpl/N Cr/ # Chromium Crabbe/Og Craft/Og Craig/Og Cranach/g Crane/Og Cranmer/Og Crater/Og Crawford/Og Cray/Og Crayola/Og Creation/g Creator/Og Crecy/Og Cree/ONSg09d # singular and plural, but also has plural in -s Creek/NOSgJ Creighton/Og Creole/NOSgJ Creon/Og Cressida/Og Crest/Og Cretaceous/Og Cretan/JNOSg Crete/ONg Crichton/Og Crick/Og Crimea/Og Crimean/JNOg Criollo/ONg Crisco/Og Cristina/g Croat/NSgJ Croatia/Og Croatian/JNOSg Croce/Og Crockett/Og Croesus/ONg Cromwell/Og Cromwellian/JNg Cronin/Og Cronkite/Og Cronus/Og Crookes/Og Crosby/Og Cross/Og Crow/NOSg Crowley/Og Crucifixion/OgS Cruikshank/Og Cruise/Og Crusades's Crusoe/Og Crux/Og Cruz/Og Cryptozoic/Og Crystal/Og Csonka/g Ct/N Ctesiphon/Og Cthulhu/Og Cu/ # Copper Cuba/Og Cuban/NSgJ Cuchulain/g Cuisinart/g Culbertson/Og Cullen/Og Cumberland/Og Cummings/Og Cunard/Og Cunningham/Og Cupertino/Og Cupid/Og Curaçao/Og Curacao/Og Curie/Og Curitiba/Og Currier/Og Curry/Og> Curt/Og Curtis/Og Custer/Og Cuvier/g Cuzco/Og Cybele/Og Cyclades/Og Cyclopes/Og Cyclops/Og Cygnus/Og Cymbeline/Og Cynthia/Og Cyprian/NgJ Cypriot/ONSgJ Cyprus/ONg Cyrano/g Cyril/Og Cyrillic/JOg Cyrus/Og Czech/JNOg Czechia/Og Czechoslovak/NJ Czechoslovakia/Og Czechoslovakian/JNSg Czechs/N Czerny/g D/NOgJ DA/NOgJV DAR/O DARPA/Og DAT/Ng DBMS/Ng DC/ONgJV # US District of Columbia DD/NOgJ DDS/Ng DDT/NS DE/ON # US state (Delaware) DEA/ON DEC/NOSd DF/Og # Distrito Federal, see also CDMX DH/NO DHS/O DI/N DIY/J DJ/NOV DMA/Ng # direct memory access DMCA/OV DMD/Ng DMV/Ng DMZ/N # demilitarized zone DNA/NOgV DOA/J # dead on arrival DOB/NO DOD/N DOE/NO # department of energy DOJ/Og # department of justice DOS/NOg # disk operating system DOT/ON DP/NOSgV DPRK/Og # north korea DPT/N DSP/NgS # digital signal processor DST/N DTP/N DUI/N DVD/NS DVR/NSgV DWI/NV Dacca/Og # old spelling of Dhaka Dachau/Og Dacron/NSg Dada/Ng Dadaism/Ng Daedalus/Og Dagestan/Og Daguerre/g Dagwood/Ng Dahomey/Og Daimler/ONg Daisy/ONg Dakar/Og Dakota/ONSg Dakotan/JNOg Dalai Dale/Og Daley/ONg Dali/Og Dalian/OgJ Dallas/Og Dalmatia/Og Dalmatian/JNOSg Dalton/ONg Damascus/Og Dame/Ngn Damian/Og Damien/Og Damion/g Damocles/Og Damon/Og Dan/ONg Dana/Og Danae/Og Danbury/Og Dane/NOSg Danelaw/Og Dangerfield/Og Danial/Og Daniel/ONSg Danielle/Og Daniels/Og Danish/ONmgJ Dannie/Og Danny/Og Danone/g Dante/Og Danton/g Danube/Og Danubian/JNg Danville/Og Daphne/Og Darby/Og Darcy/Og Dardanelles/Og Dare/Og Daren/Og Darfur/Og Darin/Og Dario/Og Darius/Og Darjeeling/ONg Darla/Og Darlene/Og Darling/Og Darnell/Og Darrel/g Darrell/Og Darren/ONg Darrin/Og Darrow/Og Darryl/Og Darth/Og Dartmoor/ONg Dartmouth/Og Darvon/g Darwin/Og Darwinian/JNg Darwinism/NwSg Darwinist/N Daryl/Og Datamation Datsun/OgS Daugherty/Og Daumier/g Davao/Og Dave/Og Davenport/Og David/OgS Davidson/Og Davies/ONg Davis/Og Davos/Og Davy/ONSg Dawes/Og Dawkins/O Dawn/Og Dawson/Og Day/Og Dayan/O Dayton/Og Daytona/Og DeGeneres/Og DeKalb/Og DeLorean/OgS # car brand DeSoto/NOSg # car brand Deadhead/Ng Dean/Og Deana/g Deandre/Og Deann/g Deanna/Og Deanne/g Death/Og Debbie/Og Debby/Og Debian/g Debora/Og Deborah/Og Debouillet/g Debra/Og Debs/Og Debussy/g Dec/Og Decalogue/ONg Decatur/Og Decca/Og Deccan/Og December/OgS Decker/Og Dedekind/Og Dee/ONg Deena/Og Deere/ONg Defoe/Og Degas/g Deidre/g Deimos/Og Deirdre/Og Deity Dejesus/Og Del/ONg Delacroix/g Delacruz/Og Delaney/Og Delano/Og Delaware/ONSg Delawarean/JNSg Delbert/g Deleon/Og Delgado/Og Delhi/Og Delia/Og Delibes/g Delicious/g Delilah/ONg Delilahs/N Delius/g Dell/Og Della/Og Delmar/Og Delmarva/Og Delmer/g Delmonico/Ng Delores/Og Deloris/g Delphi/Og Delphic/Jg Delphinus/Og Delta/NOg Deltona/Og Dem/NG Demavend/g Demerol/Og Demeter/Og Demetrius/Og Deming/Og Democrat/NSgJ Democratic/J Democritus/Og Demosthenes/Og Dempsey/Og Dena/Og Denali/O Deneb/Og Denebola/Og Deng/Og Denis/Og Denise/Og Denmark/Og Dennis/Og Denny/Og Denton/Og Denver/Og Deon/Og Depp/Og Derby/ONg Derek/Og Derick/Og Dermot/Og Derrick/Og Derrida/Og Descartes/Og Desdemona/Og Desiree/Og Desmond/Og Detroit/Og Deuteronomy/Og Devanagari/JOg Devi/Og Devin/Og Devon/ONg Devonian/JNOg Dewar/ONg Dewayne/g Dewey/Og Dewitt/OgV Dexedrine/g Dexter/ONg Dhaka/Og Dhaulagiri/g Di/OgS DiCaprio/Og DiMaggio/g Diablo/NgS # car model Diaghilev/g Dial/Og Diana/ONg Diane/Og Diann/Og Dianna/Og Dianne/Og Dias Diaspora/OgS Dick/OgX Dickens/Og Dickensian/JN Dickerson/Og Dickinson/Og Dickson/Og Dictaphone/Sg Diderot/g Dido/Og Didrikson/g Diefenbaker/g Diego/ONg Diem/Og Dietrich/Og Dijkstra/g Dijon/Og Dilbert/Sg Dillard/Og Dillinger/Og Dillon/Og Dina/Og Dinah/Og Dino/Og Diocletian/OgJ Diogenes/Og Dion/Og Dionne/Og Dionysian/JNg Dionysus/Og Diophantine/Jg Dior/g Dipper/ONg Dir Dirac/Og Dirichlet/Og Dirk/Og Dis/Og Disney/Og Disneyland/ONg Disraeli/Og Divine/OgJ Diwali/Og Dix/Og Dixie/Og Dixiecrat/Ng Dixieland/ONSg Dixon/Og Django/g Djibouti/Og Dmitri/Og Dnepropetrovsk/Og Dniester/Og Dobbin/Og Doberman/Ng Dobro/Ng Doctor/N Doctorow/g Dodge/Og Dodgson/Og Dodoma/Og Dodson/Og Doe/Og Doha/Og Dolby/Og Dole/Og Dollie/g Dolly/ONg Dolores/Og Domesday/Og Domingo/g Dominguez/Og Dominic/Og Dominica/Og Dominican/NgSJ Dominick/Og Dominion/O Dominique/NOg Domitian/g Don/OgS Dona/Og Donahue/Og Donald/Og Donaldson/Og Donatello/Og Donetsk/Og Donizetti/g Donn/Og> Donna/Og Donne/Og Donnell/Og Donner/Og Donnie/Og Donny/Og Donovan/ONg Dooley/Og Doolittle/Og Doonesbury/g Doppler/ONg Dora/Og Dorcas/ONgV Doreen/Og Dorian/JNOg Doric/JOg Doris/ONgJ Doritos/Ng Dorothea/Og Dorothy/Og Dorset/Og Dorsey/Og Dorthy/g Dortmund/Og Dostoevsky/Og Dot/Og Dothan/Og Dotson/Og Douala/Og Douay/Og Doubleday/Og Doug/Og Douglas/Og Douglass/Og Douro/Og Dover/Og Dow/Og Downs/Og Downy/g Doyle/ONg Dr/N Draco/Og Draconian/Jg Dracula/ONg Drake/Og Dramamine/Sg Drambuie/Ng Drano/g Dravidian/ONgJ Dreiser/Og Dremel/Og Dresden/ONg Drew/Og Dreyfus/Og Dristan/g Dropbox/g Drudge/g Drupal/g Dryden/Og Dschubba/Og Du DuPont/Og Duane/Og Dubai/Og Dubcek/g Dubhe/Og Dublin/Og Dubliner/NgS Dubrovnik/Og Dubuque/Og Ducati/OgS Duchamp/Og Dudley/ONg Duffy/Og Duisburg/Og Duke/NOg Dulles/Og Duluth/Og Dumas/Og Dumbledore/g Dumbo/Og Dunant/g Dunbar/Og Duncan/Og Dundee/O Dunedin/Og Dunkirk/Og Dunlap/Og Dunn/Og Dunne/Og Duracell/NOg Duran/Og Durant/Og Durante/g Durban/Og Durer/g Durex/ONg Durham/ONSg Durkheim/g Duroc/Ng Durocher/Og Duse/g Dushanbe/Og Dusseldorf/Og Dustbuster/g Dustin/Og Dusty/Og Dutch/JONmgV Dutchman/NOg Dutchmen/9g Dutchwoman/N Dutton/OgS Duvalier/g Dvina/g Dvorak/OgJ Dwayne/Og Dwight/Og Dy/ # Dysprosium Dyer/Og Dylan/Og DynamoDB/g Dyson/ONg Dzerzhinsky/Og Dzungaria/Og E/NOSg EC/NO ECG/Ng # electrocardiogram, cf. EKG ECM/NgS ECMAScript/Og # programming language, cf. JavaScript, TypeScript EDM/Nmg # electronic dance music EDP/NOg EDT/ON EEC/ONg EEG/Ng # electroencephalogram EEO/N EEOC/O EFL/NO EFT/NO EKG/Ng # cf. ECG ELF/NOg # file format EM/NJ EMT/N ENE/NgJ EOE/N EPA/ONg # agency EPROM/NSg # electrically erasable programmable read-only memory ER/ON ERA/NO # equal rights amendment ESE/NgJ ESL/N ESP/Nmg # extra-sensory perception ESPN/Og # media company ESR/N EST/ONg ET/N ETA/ONV # estimated time of arrival ETD/N EU/Og EULA/NgS # end-user license agreement EUR/Nmg # currency symbol for Euros EUV/N # extreme ultraviolet Eakins/Og Earhart/Og Earl/NOg Earle/Og Earlene/Og Earline/Og Earnest/Og Earnestine/g Earnhardt/Og Earp/Og East/OgS>Z Easter/NOgV Eastern/J> Eastman/Og Eastwood/ONgV Eaton/Og Eben/Og Ebeneezer/g Ebert/Og Ebola/ONg Ebonics/Og Ebony/Og Ebro/Og Ecclesiastes/Og Eco/g Ecstasy/N Ecuador/Og Ecuadoran/NSgJ Ecuadorean/NJ Ecuadorian/NSgJ Ed/OgnX Edam/ONSwg Edda/Og Eddie/ONg Eddington/Og Eddy/Og Eden/ONg Edgar/ONg Edgardo/g Edinburgh/Og Edison/Og Edith/Og Edmond/Og Edmonton/Og Edmund/Og Edna/Og Edsel/ONg Eduardo/g Edward/ONSg Edwardian/JNg Edwardo/g Edwards/ONg Edwin/Og Edwina/Og Eeyore/Ng Effie/ONg Efrain/Og Efren/Og Eggo/g Egypt/Og Egyptian/JNOSg Egyptology/Ng Ehrenberg/Og Ehrlich/Og EiB # exbibyte Eichmann/Ng Eid/OgS # festival Eiffel/Og Eileen/Og Einstein/ONSg Eire/Og Eisenhower/Og Eisenstein/Og Eisner/Og Elaine/Og Elam/Og Elanor/g Elasticsearch/g Elastoplast/Og Elba/Og Elbe/Og Elbert/Og Elbrus/Og Eldersburg/g Eldon/Og Eleanor/Og Eleazar/Og Electra/Og Electrolux/OgS Elena/Og Elgar/Og Eli/ONg Elias/Og Elijah/Og Elinor/Og Eliot/Og Elisa/g Elisabeth/Og Elise/Og Eliseo/g Elisha/Og Eliza/Og Elizabeth/Og Elizabethan/JNSg Elizabethtown/Og Elkhart/Og Ella/Og Ellen/Og Ellesmere/Og Ellie/Og Ellington/Og Elliot/Og Elliott/Og Ellis/Og Ellison/Og Elma/Og Elmer/ONg Elmira/Og Elmo/Og Elnath/Og Elnora/g Elohim/Og Eloise/Og Eloy/Og Elroy/Og Elsa/Og Elsie/Og Elsinore/Og Eltanin/Og Elton/Og Elul/Og Elva/g Elvia/g Elvin/Og Elvira/Og Elvis/ONg Elway/g Elwood/Og Elyria/Og Elysee/g Elysian/ONgJ Elysium/OgSJ Emacs/Og Emanuel/Og Emerson/Og Emery/Og Emil/Og Emile/Og Emilia/Og Emilio/g Emily/Og Eminem/Ng Eminence/O Emma/Og Emmanuel/Og Emmett/Og Emmy/ONg Emory/Og Encarta/g Endymion/Og Eng/g Engels/Og England/Og English/J>NOwSgV Englishman/Ng Englishmen/9g Englishwoman/Ng Englishwomen/9g Enid/Og Enif/Og Eniwetok/Og Enkidu/Og Enoch/Og Enos/Og Enrico/Og Enrique/g Enron/Ng Enterprise/Og Eocene/JOg # geological period Epcot/Og Ephesian/JNgS Ephesus/Og Ephraim/Og Epictetus/Og Epicurean/JNg Epicurus/Og Epimethius/g Epiphany/NOSg Episcopal/JN Episcopalian/NgSJ Epistle/N Epsom/Og Epson/g Epstein/OgV Equuleus/Og Er/ # Erbium Erasmus/ONg Erato/Og Eratosthenes/Og Erdogan/Og Erebus/Og Erector/g Erewhon/g Erhard/g Eric/Og Erica/Og Erich/Og Erick/Og Ericka/Og Erickson/Og Eridanus/Og Erie/NOg Erik/Og Erika/Og Erin/Og Eris/OgS Eritrea/Og Eritrean/JNSg Erlang/Og Erlenmeyer/Og Erma/Og Erna/g Ernest/Og Ernestine/OgJ Ernesto/Og Ernie/Og Ernst/Og Eros/OgS Errol/Og Erse/NgJ ErvIn/g Erwin/Og Esau/Og Escher/Og Escherichia/Og Escondido/O Eskimo/ONSgJ Esmeralda/Og Esperanto/Og Esperanza/Og Espinoza/g Esq/Ng Esquire/Sg Essen/Og Essene/Ng Essequibo/Og Essex/Og Essie/Og Establishment/N Esteban/Og Estela/g Estella/Og Estelle/Og Ester/Og Esterhazy/Jg Estes/Og Esther/Og Estonia/Og Estonian/JNSg Estrada/Og Eswatini/Og Ethan/Og Ethel/Og Ethelred/Og Ethernet/ONg Ethiopia/Og Ethiopian/NSgJ Etna/Og Eton/Og Etruria/Og Etruscan/JNOg Etta/Og Eu/ # Europium Eucharist/NgS Eucharistic/J Euclid/Og Eudaimonia/Ng Eugene/Og Eugenia/Og Eugenie/Og Eugenio/g Eula/Og Euler/Og Eulerian/J Eumenides/Ng Eunice/Og Euphrates/Og Eur/JO Eurasia/Og Eurasian/JNgS Euripides/Og Eurocentrist/NgS Eurodollar/NSg Europa/Og Europe/Og European/JNgS Europeanism/Nmg Eurotrash/Ng Eurozone/Og Eurydice/Og Eustachian/Jg Eustis/Og Euterpe/Og Eva/Og Evan/OgS Evangelical/J Evangelina/Og Evangeline/Og Evangelist/Ng Evans/Og Evansville/Og Eve/Og Evelyn/Og Evenki/ONg EverReady/g Everdeen/g Everest/OgV Everett/Og Everette/Og Everglades/Og Evert/Og Evian/g Evita/Og Ewing/Og Excalibur/Og Excedrin/g Excellency/NSg Exchequer/O Exercycle/g Exocet/Ng Exodus/Og Exxon/Og Eyck/g Eyre/Og Eysenck/g Ezekiel/Og Ezra/Og F/ # Fluorine F1/9g FAA/O FAQ/NSg FBI/ONg FCC/ONJ FD/N FDA/O FDIC/Og FDR/ONg FEMA/Og FFT/NgS # fast Fourier transform FHA/Og FICA/Og FIFO/N FL/NO # US state (Florida) FLOSS/ONV # free libre open source software FM/NSg FNMA/Og FOFL FORTRAN/Og FOSS/ONV # free open source software FPO/N FSF/Og FSLIC/O FTC/O FUD/NS FWD/N FWIW/ FY/N FYI/ Faberge/g Fabian/JNOSg FaceTime/NOV Facebook/ONgV Faeroe/Og Fafnir/Og Fagin/Ng Fahd/g Fahrenheit/Jg Fairbanks/Og Fairchild/Og # surname, electronics Fairfield/Og Fairhope/g Faisal/Og Faisalabad/Og Faith/Og Fajardo/Og Falasha/Og Falkland/OgS Falklands/Og Fallopian/Jg Falstaff/Ng Falwell/Og Fannie/Og Fanny/Og Faraday/Og Farage/Og Fargo/Og Farley/Og Farmer/Og Farmington/Og Farragut/g Farrakhan/g Farrell/Og Farrow/Og Farsi/NgJ Fassbinder/g Fatah/Og Fates/Og Father/ONSg Fatima/Og Fatimid/Ng Faulkner/Og Faulknerian/Jg Fauntleroy/Og Faust/Og Faustian/Jg Faustino/g Faustus/g Fawkes/Og Fay/Og Faye/Og Fayetteville/Og Fe/ # Iron Feb/Og February/OgS Fed/OgS FedEx/OgV Federal/NgS Federalist/g Federico/Og Feds/g Felecia/g Felice/g Felicia/Og Felicity/Og Felipe/g Felix/Og Fellini/g Fenian/Ng Ferber/Og Ferdinand/Og Fergus/Og Ferguson/Og Ferlinghetti/Og Fermat/Og Fermi/Og Fern/Og Fernandez/Og Fernando/Og Ferrari/ONSg Ferraro/g Ferrell/Og Ferris/Og Feynman/Og Fez/Og Fiat/Ng Fiberglas/g Fibonacci/Og Fichte/g Fichtinger/Og Fidel/Og Fido/Og Fielding/Og Fields/Og Figaro/ONg Figueroa/Og Fiji/Og Fijian/NOSgJ Filipino/NOSgJ Fillmore/Og Filofax/Ng Finch/Og Finland/Og Finlay/Og Finley/Og Finn/NOSg Finnbogadottir/g Finnegan/Og Finnish/JNg Fiona/Og Firebase/g Firefox/Og Firestone/Og Fischer/Og Fisher/Og Fisk/Og Fitch/Og Fitchburg/Og Fitzgerald/Og Fitzpatrick/Og Fitzroy/Og Fizeau/g Fla/O Flagstaff/Og Flanagan/Og Flanders/Og Flathead/NO Flatt/Og Flaubert/Og Fleischer/Og Fleming/NOg Flemish/JOg Fletcher/Og Flint/Og Flintstones/g Flo/Og Flora/Og Florence/ONg Florentine/JNg Flores/Og Florida/Og Floridan/JNg Floridian/JNSg Florine/g Florsheim/g Flory/Og Flossie/Og Flowers/Og Floyd/Og Flynn/Og Fm/ # Fermium Foch/ONg Fokker/ONg Foley/Og Folgers/g Folsom/Og Fomalhaut/Og Fonda/Og Foosball/g Forbes/Og Ford/ONSg Foreman/Og Forest/Og> Forester/Og Formica/OgS Formosa/Og Formosan/JNg Forrest/Og Forster/Og Fortaleza/Og Fortran/Og Fosse/Og Foster/Og Fotomat/g Foucault/Og Fourier/Og Fourneyron/g Fourth/O Fowler/Og Fox/NOSg Fr/ # Francium Fragonard/g Fran/Og France/OgS Frances/Og Francesca/Og Francine/Og Francis/Og Francisca/g Franciscan/NgSJ Francisco/Og Franck/g Franco/ONg Francois/Og Francoise/g Francophile/NJ Franglais/Og Frank/NOSg Frankel/Og Frankenstein/ONgV Frankfort/Og Frankfurt/Og> Frankfurter/Ng Frankie/Og Frankish/JO Franklin/ONg Franks/NOg Franny/Og Franz/Og Fraser/Og Frau/Ngn Fraulein/N Frazier/Og Fred/ONg Freda/Og Freddie/ONg Freddy/Og Frederic/Og Frederick/Og Fredericksburg/Og Fredericton/Og Fredric/g Fredrick/Og Freeman/Og Freemason/NSg Freemasonry/OgS Freetown/Og Freida/g Fremont/Og French/ONSwgJV # there shouldn't be a plural but `S` works on both verbs and nouns Frenchman/Ng Frenchmen/9g Frenchwoman/Ng Frenchwomen/9g Freon/Ng Fresnel/Og Fresno/Og Freud/Og Freudian/JNg Frey/Og Freya/Og Fri/Ng Friday/NSg Fridman/Og Frieda/Og Friedan/g Friedman/Og Friedmann/Og Friend/NOSg Frigga/Og Frigidaire/g Frisbee/ONgV Frisco/Og Frisian/ONSgJ Frito/Ng Fritz/NOg Frobisher/Og Frodo/Og Froissart/g Fromm/Og Fronde/g Frontenac/Og Frost/Og Frostbelt/g Frunze/Og Fry/Og Frye/Og Fuchs/Og Fuentes/Og Fugger/g Fuji/Og Fujian/OgJ Fujitsu/g # Disinhibited Fujiwara/Og Fujiyama/Og Fukuoka/Og Fukuyama/Og # francis - Fukuyaman/J Fulani/Og Fulbright/Og Fuller/Og Fullerton/Og Fulton/Og Funafuti/Og Fundy/Og Furies/Og Furman/Og Furtwangler/g Fushun/Og Fuzhou/Og Fuzzbuster/g G/Ng>nB GA/ON # US state (Georgia) GAO/O GATT/Og GB/NOg GCC/Og GDP/Ng # gross domestic product GDPR/O # General Data Protection Regulation GE/ONgJ GED/N GFC/Ng # global financial crisis GHQ/Ng GHz/ GI/JNV GIF/NSg # file format GIGO/ GM/NOgVJ # car company GMAT/O # global GMO/NJ GMT/ONg GNP/Ng GNU/Og GOP/ONg # political party GP/NOgJ GPA/N # grade point average GPO/ON GPS/ONV # global positioning system GPU/NSg GSA/ON GST/Ng # goods and services tax GT/NgS # grand touring/tourer GT R/N GT-R/NgS GTE/Og GTO/NSg GTR/NgS GTS/NSg GU/N GUI/ONgS Ga/ # Gallium Gable/Og Gabon/Og Gabonese/NgJ Gaborone/Og Gabriel/Og Gabriela/Og Gabrielle/Og Gacrux/Og Gadsden/Og Gaea/Og Gael/NOSg Gaelic/ONgJ Gagarin/Og Gage/Og Gaia/Og Gail/Og Gaiman/Og Gaines/Og Gainesville/Og Gainsborough/ONg Galahad/ONSg Galapagos/Og Galatea/Og Galatia/Og Galatians/ONg Galaxy/O Galbraith/Og Gale/Og Galen/Og Galibi/Og Galician/JNwgS Galilean/JNOSg Galilee/Og Galileo/Og Gall/Og Gallagher/Og Gallegos/Og Gallic/Jg Gallicism/NSg Gallipoli/Og Gallo/Og Galloway/ONg Gallup/Og Galois/Og Galsworthy/Og Galvani/Og Galveston/Og Gama/O Gamay/Ng Gambia/Og Gambian/JNSg Gamble/Og Game Boy/OgS Gamow/g Gandalf/Og Gandhi/ONg Gandhian/Jg Ganesha/ONg Ganges/Og Gangnam/Og Gangtok/Og Gansu/Og Gantry/g Ganymede/ONg Gap/Og Garbo/g Garcia/Og Gardner/Og Gareth/ONg Garfield/Og Garfunkel/Og Gargantua/g Garibaldi/Og Garland/Og Garner/Og Garrett/Og Garrick/Og Garrison/Og Garry/Og Garth/Og Garvey/Og Gary/ONg Garza/Og Gascony/Og Gasser/Og Gastonia/Og Gastroenterology Gates/Og Gatling/Ng Gatorade/ONgV Gatsby/Og Gatun/Og Gauguin/Og Gaul/ONSg Gaulish/JO Gauss/Og Gaussian/JNg Gautama/Og Gautier/g Gavin/Og Gawain/Og Gay/Og Gayle/Og Gaza/Og Gazan/JOgS Gaziantep/Og Gd/ # Gadolinium Gdańsk/Og Gdansk/Og Ge/ # Germanium Geffen/Og Gehenna/Og Gehrig/Og Geiger/Og Gelbvieh/Ng Geller/Og Gemini/ONSg Gen/ONg Gena/Og Genaro/g Gene/Og Genesis/Og Genet/Og Geneva/ONg Genevieve/Og Genghis/Og Genoa/ONSg Gentoo/NOg Gentry/Og Geo/g Geoffrey/Og George/NOSg Georgetown/Og Georgette/Og Georgia/Og Georgian/NgSJ Georgina/Og Ger/Ng Gerald/Og Geraldine/OgJ Gerard/Og Gerardo/g Gerber/Og Gere/Og Geritol/g German/NOwSgJ Germanic/ONgJ Germany/Og Geronimo/Og Gerry/Og Gershwin/Og Gertrude/Og Gestapo/OgS Gethsemane/Og Getty/Og Gettysburg/Og Gewurztraminer/g Ghana/Og Ghanaian/JN Ghats/Og Ghazvanid/g Ghent/Og Ghibelline/Ng GiB # gibibyte Giacometti/g Giannini/Og Giauque/g Gibbon/Og Gibbs/Og Gibraltar/ONSg Gibson/ONg Gide/g Gideon/ONg Gielgud/Og Gienah/Og Gil/Og Gila/ONg Gilbert/Og Gilberto/g Gilchrist/Og Gilda/Og Gilead/Og Giles/Og Gilgamesh/Og Gill/ONg Gillespie/Og Gillette/Og Gilliam/Og Gillian/Og Gilligan/Og Gilman/O Gilmore/Og Gilroy/Og Gina/Og Ginger/Og Gingrich/Og Ginny/Og Gino/g Ginsberg/Og Ginsburg/Og Ginsu/Ng Giorgione/g Giotto/g Giovanni/Og Giraudoux/g Giselle/Og Gish/Og GitHub/Og Giuliani/Og Giuseppe/g Giza/Og Gk/O Gladstone/ONSg Gladys/Og Glaser/Og Glasgow/Og Glass/Og Glastonbury/Og Glaswegian/JNSg Glaxo/g Gleason/Og Glen/ONg Glenda/Og Glendale/O Glenlivet/Ng Glenn/Og Glenna/Og Gloria/Og Gloucester/ONg Glover/NOg Gnostic/JNg Gnosticism/Ng GnuPG Goa/ONg Gobi/Og God/ONg Godard/Og Goddard/Og Gödel/Og Godel/Og Godfrey/Ng Godhead/Og Godiva/Og Godot/Og Godspeed/NSg Godthaab/g Godunov/g Godzilla/ONg Goebbels/Og Goering/Og Goethals/g Goethe/Og Goff/Og Gog/ONg Gogol/Og Goiania/g Golan/Og Golconda/ONg Golda/Og Goldberg/Og Golden/ONg Goldie/Og Goldilocks/Og Golding/Og Goldman/Og Goldsboro/Og Goldsmith/Og Goldwater/Og Goldwyn/Og Golgi/Ng Golgotha/ONg Goliath/ONg Gomez/Og Gomorrah/Og Gompers/Og Gomulka/g Gondwanaland/Og Gonzales/Og Gonzalez/Og Gonzalo/Og Good/Og Goodall/Og Goode/Og Goodman/Og Goodrich/Og Goodwill/NOg Goodwin/Og Goodyear/Og Google/OgV Googler/NSg Goolagong/g Gopher/O Gorbachev/Og Gordian/JOg Gordimer/g Gordon/ONg Gore/Og Goren/Og Gorey/Og Gorgas/Og Gorgon/Og Gorgonzola/Og Gorky/Og Gospel/NgS Goteborg/g Goth/NOgJ Gotham/Og Gothic/ONSgJ Goths/N Gouda/ONSg Gould/Og Gounod/g Governor/N Goya/Og Gr/B Grable/Og Gracchus/Og Grace/Og Graceland/g Gracie/Og Graciela/g Grady/Og Graffias/Og Grafton/Og Graham/Og Grahame/Og Grail/g Grammy/Ng Grampians/Og Granada/Og Grand Prix/O0g Grands Prix/O9 Grant/ONg Grass/Og Graves/Og Gray/Og Grayslake/g Grecian/JNg Greco-Roman/J Greece/Og Greek/JONSgV Greeley/Og Green/ONSgJ Greene/Og Greenland/Og Greenlander/NgS Greenlandic/JO Greenlandish/NgJ Greenpeace/Og Greensboro/Og Greensleeves/g Greenspan/Og Greenville/Og Greenwich/Og Greer/Og Greg/Og Gregg/Og Gregorian/JNg Gregorio/Og Gregory/ONg Grenada/Og Grenadian/NgSJ Grenadines/Og Grendel/Og Grenoble/Og Gresham/Og Greta/Og Gretchen/Og Gretel/Og Gretzky/ONg Grey/ONg Grieg/g Grier/Og Griffin/Og Griffith/Og Grimes/Og Grimm/Og Grinch/g Gris/g Gromyko/g Gropius/g Gross/Og Grosz/Og Grotius/g Grover/Og Grozny/O Grumman/g Grundy/Og Grunewald/Og Grus/Og Gruyère/ONSwg Gruyere/ONSwg Guadalajara/Og Guadalcanal/Og Guadalquivir/Og Guadalupe/Og Guadeloupe/Og Guallatiri/g Guam/Og Guamanian/NJ Guangdong/Og Guangzhou/Og Guantanamo/Og Guarani/Og Guarnieri/Og Guatemala/Og Guatemalan/NgSJ Guayama/Og Guayaquil/Og Gucci/JONg Guelph/NOg Guernsey/ONSg Guerra/Og Guerrero/Og Guevara/Og Guggenheim/Og Guiana/Og Guido/ON Guillermo/g Guinea/Og Guinean/JNgS Guinevere/Og Guinness/ONg Guiyang/Og Guizhou/Og Guizot/g Gujarat/Og Gujarati/ONgJ Gujranwala/Og Gulfport/Og Gullah/ONgJ Gulliver/Og Gumbel/g Gunther/Og Guofeng/g Gupta/Og Gurkha/NgJ Gus/Og Gustav/Og Gustavo/g Gustavus/Og Gutenberg/Og Guthrie/Og Gutierrez/Og Guy/ONg Guyana/Og Guyanese/NgJ Guzman/Og Gwalior/Og Gwen/Og Gwendoline/Og Gwendolyn/Og Gwyn/Og Gypsy/NOSgJ H-1B/NgS HBO/Og HBase/g HDD/N HDMI/O HDTV/N HF/NgJ HHS/ON HI/ON # US state (Hawaii) HIMARS/N HIV/Ng HM/NO HMO/Ng HMS/N HOV/N HP/ONg HPV/N HQ/NOgJ HR/N HRH/N HS/NOJ HSBC/Og HST/NO HT/NO HTML/Og HTTP/Ng HTTPS/Ng HUD/NOSg HVAC/Ng Ha/NOg Haas/Og Habakkuk/Og Haber/Og Hadar/Og Hades/Og Hadoop/g Hadrian/Og Hafiz/Og Hagar/Og Hagerstown/Og Haggai/Og Hagiographa/Og Hague/Og Hahn/Og Haida/NOSg Haifa/Og Hainan/Og Haiphong/Og Haiti/Og Haitian/NOSgJ Hakka/JNOg Hakluyt/Og Hal/OgS Haldane/Og Hale/Og Haleakala/Og Haley/Og Halifax/Og Hall/ONg Halley/Og Halliburton/Og Hallie/Og Hallmark/Og Halloween/OgS Hallstatt/Og Halon/g Hals/Og Halsey/Og Ham/Og Haman/Og Hamas/Og Hamburg/ONSg Hamhung/Og Hamilcar/Og Hamill/Og Hamilton/ONg Hamiltonian/JNg Hamish/Og Hamitic/JOg Hamlet/Og Hamlin/Og Hammarskjold/g Hammerstein/g Hammett/Og Hammond/ONg Hammurabi/Og Hampshire/ONg Hampton/Og Hamsun/Og Han/OgS Hancock/Og Handel/Og Handy/Og Haney/Og Hanford/Og Hangul/Ng Hangzhou/Og Hank/Og Hanna/Og Hannah/ONg Hannibal/Og Hannity/Og Hanoi/Og Hanover/Og Hanoverian/JNg Hans/ONgn Hansel/Og Hansen/Og Hanson/Og Hanuka/O Hanukkah/Og Hanukkahs/O Hanzi/N09g Hapsburg/ONg Harare/Og Harbin/Og Hardin/Og Harding/Og Hardy/Og Hargreaves/Og Harlan/Og Harlem/Og Harlequin/Og Harley/ONg Harlingen/Og Harlow/Og Harmon/Og Harold/Og Harper/Og Harpy/Sg Harrell/Og Harriet/Og Harriett/g Harrington/ONg Harris/Og Harrisburg/Og Harrison/Og Harrisonburg/Og Harrods/Og Harry/Og Hart/Og Harte/Og Hartford/Og Hartline/Og Hartman/Og Harvard/Og Harvey/Og Hasbro/g Hasidim/N9g Haskell/Og Hastings/Og Hatfield/Og Hathaway/Og Hatsheput/g Hatteras/Og Hattie/Og Hattiesburg/Og Hauptmann/g Hausa/NOg Hausdorff/Jg Havana/ONSg Havarti/Ng Havel/Og Havoline/g Haw/O Hawaii/Og Hawaiian/JNOSg Hawking/Og Hawkins/Og Hawks/O Hawthorne/Og Hay/OgS Hayden/Og Haydn/Og Hayek/Og Hayes/Og Haynes/Og Hays/Og Hayward/ONg Haywood/Og Hayworth/Og Hazel/Og Hazleton/Og Hazlitt/g He/Ia3Og # Helium; I~pronoun a~personal 3~person .~singular s~subject / Og~proper noun+possessive Head/Og Healey/Og Healy/Og Hearst/Og Heath/Og> Heather/Og Heathrow/Og Heaviside/Og Heb Hebe/ONg Hebei/Og Hebert/Og Hebraic/Jg Hebraism/NSg Hebrew/JNgS Hebrews/ONg Hebrides/Og Hecate/Og Hecatoncheires/Ng Hector/Og Hecuba/Og Heep/Og Hefner/Og Hegel/Og Hegelian/JNg Hegira/Og Heidegger/Og Heidelberg/Og Heidi/Og Heifetz/g Heilongjiang/Og Heimlich/ONgV Heine/Og Heineken/ONg Heinlein/Og Heinrich/Og Heinz/ONg Heisenberg/Og Heisman/g Helen/ONg Helena/Og Helene/Og Helga/Og Helicobacter/O Helicon/Og Heliopolis/Og Helios/Og Hellene/NSg Hellenic/JOg Hellenisation/Ng!_₹ Hellenise/V!_₹ Hellenism/NwgS Hellenist/N Hellenistic/Jg Hellenization/Ng Hellenize/Vg Heller/Og Hellespont/Og Hellman/Og Helmholtz/Og Heloise/Og Helsinki/Og Helvetian/JN Helvetius/g Hemet/Og Hemingway/OgV Henan/Og Hench/Og Henderson/Og Hendrick/OgS Hendricks/Og Hendrix/Og Henley/Og Hennessy/Og Henri/Og Henrietta/Og Henrik/g Henry/ONg Hensley/Og Henson/Og Hepburn/Og Hephaestus/Og Hepplewhite/Og Hera/Og Heracles/Og Heraclitus/Og Herakles/Og Herbart/Og Herbert/Og Herculaneum/Og Herculean/J Hercules/ONg Herder/g Hereford/ONSg Herero/NOg Heriberto/g Herman/Og Hermaphroditus/Og Hermes/ONg Herminia/g Hermitage/ONg Hermite/g Hermosillo/Og Hernandez/Og Herod/Og Herodotus/Og Heroku/g Herr/ONgG Herrera/Og Herrick/Og Herring/Og Herschel/ONg Hersey/Og Hershel/Og Hershey/Og Hertz/ONg Hertzsprung/Og Herz/Og # company Herzegovina/Og Herzl/Og Heshvan/Og Hesiod/Og Hesperia/Og Hesperus/Og Hess/Og Hesse/Og Hessian/JNOg Hester/Og Heston/Og Hettie/Og Hewitt/Og Hewlett/Og Heyerdahl/g Heywood/Og Hezbollah/Og Hezekiah/Og Hf/ # Hafnium Hg/ # Mercury Hialeah/Og Hiawatha/Og Hibernia/Og Hibernian/JN Hickman/ONg Hickok/Og Hickory/g Hicks/Og Hieronymus/Og Higashiosaka/O Higgins/Og Highlander/NOSg Highlands/O Highness/Ng Hightstown/g Hilario/Og Hilary/ONg Hilbert/Og Hilda/Og Hildebrand/Og Hilfiger/g Hill/Og Hillary/Og Hillel/Og Hilton/Og Himalaya/OgS Himalayan/JN Himalayas/Og Himmler/g Hinayana/Og Hindemith/g Hindenburg/Og Hindi/OgJ Hindu/JNSg Hinduism/OgS Hindustan/Og Hindustani/JNOSg Hines/Og Hinesville/Og Hinton/Og Hipparchus/Og Hippocrates/Og Hippocratic/Jg Hiram/Og Hirobumi/g Hirohito/g Hiroshima/ONg Hispanic/JNSg Hispaniola/Og Hiss/g Hitachi/ONg Hitchcock/Og Hitler/ONSg Hittite/NOSgJ Hmong/NOgJ Ho/O # Holmium; Ho Chi Minh Hobart/Og Hobbes/Og Hobbs/Og Hockney/Og Hodge/OgS Hodges/Og Hodgkin/Og Hoff/Og Hoffa/Og Hoffman/Og Hofstadter/Og Hogan/Og Hogarth/ONg Hogwarts/Og Hohenlohe/g Hohenstaufen/Og Hohenzollern/ONgJ Hohhot/Og Hohokam/Og Hokkaido/ONg Hokkien/ONmg Hokusai/g Holbein/g Holcomb/Og Holden/ONSg Holder/Og Holiday/Og Holiness/N Holland/OgS>Z Hollander/NOg Hollerith/Og Holley/Og Hollie/Og Hollis/Og Holloway/Og Holly/Og Hollywood/ONgJV Holman/Og Holmes/Og Holocaust/OgV Holocene/JOg # geological period Holst/g Holstein/ONSg Holt/Og Homer/Og Homeric/Jg Hon/J Honda/OgS # company Honduran/NgSJ Honduras/Og Honecker/g Honeywell/Og Hong/O Honiara/Og # capital of Vanuatu Honolulu/Og Honorable/J Honshu/Og # island Hood/Og Hooke/Og> Hooker/Og Hooper/Og Hoosier/NgSJ Hooters/g Hoover/ONSgV Hope/Og Hopewell/Og Hopi/NOSg09 # singular and plural, but also has plural in -s Hopkins/Og Hopper/Og Horace/Og Horacio/g Horatio/Og Hormel/g Hormuz/Og Horn/Og Hornblower/Og Horne/Og Horowitz/ONg Horthy/g Horton/Og Horus/Og Hosea/Og Host/Sg Hotpoint/g Hottentot/NOSg Houdini/ONgV Houma/NOg House/Og Housman/Og Houston/Og Houthi/NgS Houyhnhnm/Ng Hovhaness/g Howard/Og Howe/Og Howell/OgS Howells/Og Howrah/O Hoyle/Og Hrothgar/Og Hts/N Huang/Og Huawei/Og Hubbard/Og Hubble/ONg Hubei/Og Huber/Og Hubert/Og Huck/Og Huddersfield/O Hudson/ONg Huerta/Og Huey/ONg Huff/Og Huffman/Og Huggins/Og Hugh/OgS Hughes/Og Hugo/ONg Huguenot/NgSJ Hui/NOg Huitzilopotchli/g Hull/Og Humberto/g Humboldt/Og Hume/Og Hummel/g Hummer/NOg Humphrey/OgS Humpty Dumpty/Og Humvee/Ng Hun/NOSg Hunan/Og Hung/Og Hungarian/JNSg Hungary/Og Hunspell/g Hunt/Og> Hunter/Og Huntington/Og Huntley/Og Huntsville/Og Huracán/OgS Huracan/OgS Hurd/Og Hurley/Og Huron/NOg Hurst/Og Hus/Og Hussein/Og Husserl/g Hussite/Ng Huston/Og Hutchinson/Og Hutton/Og Hutu/Ng Huxley/Og Huygens/Og Hyades/Og Hyde/Og Hyderabad/Og Hydra/Og Hymen/Og Hyperion/Og Hyundai/Ng Hz/g I/~Ia1s. # Iodone; I~pronoun a~personal 1~person .~singular s~subject I'd/~ I'd've/ I'll/~ I'm/~ I've/~ IA/ON # US state (Iowa) IBM/ONg IC/NgS # integrated circuit ICBM/NSg ICC/O # International Criminal Court ICQ/ONV # chat protocol ICU/NO # Unicode library ID/NOSgVJ # US state (Idaho) IDE/N IDF/Og # Israel's military IE/ONJ IED/N # improvised explosive device IEEE/O # standards organization IIRC # If I recall correctly IKEA/Og # furniture company IL/NO # US state (Illinois) IMF/Og # International Monetary Fund IMHO/ IMNSHO/ IMO/NO IN/ON # US state (Indiana) ING/g INRI INS/NO IO # input output IOU/Ng IP/JNOSg # J: intraperitoneal, N: "intellectual poperty", O: "Internet Protocol" IPA/ON # phonetic alphabet IPO/NgSV IQ/NgS IRA/ONSg IRC/ONV # chat protocol IRS/ONg ISBN/NgS ISDN/Ng # telephone standard ISIS/O ISO/ONgP # standards organization ISP/N ISS/NO IT/N # removed `5`. nouns can qualify nouns. makes `it` an adjective which interferes with heuristics IUD/N IV/JNSg IVF/N Iaccoca/g Iago/Og Ian/Og Iapetus/Og Ibadan/Og Iberia/Og Iberian/JNOg Ibiza/Og Iblis/Og Ibo/ONg Ibrahim/Og Ibsen/Og Icahn/g Icarus/Og Ice/O Iceland/Og>Z Icelander/Ng Icelandic/ONgJ Ida/Og Idaho/ONSg Idahoan/JNgS Idahoes Idlib/Og Ieyasu/g Ignacio/Og Ignatius/Og Igor/ONg Iguassu/g Ijsselmeer/g Ike/ONg Ikhnaton/g Ila/g Ilene/Og Iliad/ONSg Ill Illinois/ONg Illinoisan/JNgS Illuminati/Ng Ilyushin/g Imelda/Og Imhotep/Og Imodium/g Imogene/Og Imus/Og In/ # Indium Ina/Og Inc/J Inca/NSg Inchon/Og Incorporated Ind/O Independence/Og India/NOg Indian/JNOSg Indiana/Og Indianan/NSgJ Indianapolis/Og Indianian/N Indies/Og Indio/Og Indira/Og Indochina/Og Indochinese/Jg Indonesia/Og Indonesian/JNSg Indore/Og Indra/Og Indus/Og Indy/OgS Ines/g Inez/Og Inge/Og Inglewood/O Ingram/Og Ingres/g Ingrid/Og Ingush/NOSgJ Ingushetia/Og Innocent/Og Innsbruck/O Inonu/g Inquisition/Og Inst Instagram/ONgV Instamatic/Ng Intel/Og Intelsat/g Internationale/Og Internet/Ogm Interpol/Og Inuit/NOSgJ Inuktitut/Og Invar/g Io/Og Ionesco/g Ionian/JNOSg Ionic/JONSg Iowa/ONSg Iowan/JNgS Iphigenia/Og Ipswich/O Iqaluit/Og Iqbal/Og Iquitos/Og Ir/ # Iridium Ira/Og Iran/Og Iranian/NOSgJ Iraq/Og Iraqi/NgSJ Ireland/Og Irene/Og Iris/Og Irish/ONgJ> Irishman/Ng Irishmen/9g Irishwoman/Ng Irishwomen/9g Irkutsk/Og Irma/Og Iroquoian/JNSg Iroquois/NOg09 # singular and plural Irrawaddy/Og Irtish/g Irvin/Og Irvine/Og Irving/Og Irwin/Og Isaac/Og Isabel/Og Isabela/Og Isabella/ONg Isabelle/Og Isaiah/Og Iscariot/ONg Isfahan/Og Isherwood/Og Ishim/NOg Ishmael/ONg Ishtar/Og Isiah/Og Isidro/g Isis/Og Islam/OgS Islamabad/Og Islamic/JNg Islamism/Ng Islamist/NgSJ Islamophobia/N Islamophobic/J Ismael/Og Ismail/Og Isolde/Og Ispell/g Israel/OgS Israeli/NOSgJ Israelite/NgJ Issac/Og Issachar/Og Istanbul/Og Istanbulite/NgSJ Isuzu/ONg # car brand It/ON Itaipu/Og Ital/N Italian/JNwSg Italianate/JV Italy/Og Itasca/Og Ithaca/Og Ithacan/JNg Ito/Og Iva/Og Ivan/Og Ivanhoe/Og Ives/Og Ivorian/NJ Ivory/Og Ivy/ONg Iyar/Og Izaak/g Izanagi/Og Izanami/Og Izhevsk/Og Izmir/Og Izod/g Izvestia/g J/NOgd JCS/O JD/NO JDM JFK/ONgV JIT/NgSVdG # cf. jit JP/NO JPEG/ONV JV/N Jack/ONg Jackie/Og Jacklyn/Og Jackson/OgS Jacksonian/NgJ Jacksonville/Og Jacky/ONg Jaclyn/Og Jacob/ONSg Jacobean/JNg Jacobi/Og Jacobin/NgJ Jacobite/Ng Jacobs/ONg Jacobson/Og Jacquard/Og Jacqueline/Og Jacquelyn/Og Jacques/Og Jacuzzi/NOgV Jagger/Og Jagiellon/g Jaguar/ONg Jahangir/g Jaime/Og Jain/JNOg Jainism/Ogm Jaipur/Og Jakarta/Og Jake/Og Jamaal/g Jamaica/Og Jamaican/NSgJ Jamal/Og Jamar/Og Jame/Sg Jamel/g James/Og Jamestown/Og Jami/g Jamie/Og Jan/Og Jana/Og Janacek/g Jane/ONg Janell/g Janelle/Og Janesville/Og Janet/Og Janette/Og Janice/Og Janie/Og Janine/Og Janis/Og Janissary/g Janjaweed/Og Janna/Og Jannie/g Jansen/Og Jansenist/JNg January/OgS Janus/Og Jap/ONSgJV Japan/Og Japanese/JNOwSg Japura/g Jared/Og Jarlsberg/ONg Jarred/Og Jarrett/Og Jarrod/Og Jarvis/Og Jasmine/Og Jason/Og Jasper/Og Jataka/g Java/ONSg Javanese/NOg Javier/g Jaxartes/Og Jay/ONg Jayapura/Og Jayawardene/g Jaycee/NgS Jaycees/Ng Jayne/Og Jayson/Og Jean/Og Jeanette/Og Jeanie/Og Jeanine/g Jeanne/Og Jeannette/Og Jeannie/Og Jeannine/Og Jed/Og Jeddah/Og Jedi/Ng Jeep/Ng Jeeves/Og Jeff/Og Jefferey/Og Jefferson/ONg Jeffersonian/JNg Jeffery/Og Jeffrey/Og Jeffry/Og Jehoshaphat/Og Jehovah/ONg Jekyll/Og Jenga/Og Jenifer/Og Jenkins/ONg Jenna/Og Jenner/Og Jennie/Og Jennifer/Og Jennings/Og Jenny/ONg Jensen/Og Jephthah/Og Jerald/Og Jeremiah/ONg Jeremiahs/N Jeremy/Og Jeri/Og Jericho/ONg Jermaine/Og Jeroboam/ONg Jerold/g Jerome/Og Jerri/Og Jerrod/g Jerrold/Og Jerry/ONg Jersey/ONSg Jerusalem/Og Jess/Og Jesse/ONg Jessica/Og Jessie/ONg Jesuit/NgSJ Jesus/ONgV Jetway/g Jew/NOSgJV Jewel/Og Jewell/Og Jewess/NgS Jewish/JpNOg Jewry/Ng Jezebel/ONSg Jiangsu/Og Jiangxi/Og Jidda/Og Jilin/Og Jill/ONg Jillian/Og Jim/Og Jimenez/Og Jimmie/Og Jimmy/ONg Jinan/Og Jinnah/Og Jinny/Og Jinping/Og Jivaro/Ng Jo/Og Joan/ONg Joann/Og Joanna/Og Joanne/Og Joaquin/Og Job/ONSg Jobs/ONg Jocasta/Og Jocelyn/Og Jock/ONg Jockey/g Jodi/Og Jodie/Og Jody/ONg Joe/ONg Joel/Og Joey/Og Jogjakarta/g # city Johann/Og Johanna/Og Johannes/NOg Johannesburg/Og John/ONSg Johnathan/Og Johnathon/Og Johnie/g Johnnie/Og Johnny/ONg Johns/ONg Johnson/ONg Johnston/Og Johnstown/Og Jolene/Og Jolson/Og Jon/Og Jonah/ONg Jonahs/N Jonas/Og Jonathan/ONg Jonathon/Og Jones/Og Jonesboro/Og Jong-Un/Og Joni/Og Jonson/Og Joplin/Og Jordan/Og Jordanian/NgSJ Jorge/Og Jose/Og Josef/g Josefa/g Josefina/g Joseph/ONg Josephine/OgJ Josephs/N Josephson/Og Josephus/Og Josh/Og Joshua/ONg Josiah/Og Josie/Og Josue/Og Joule/Og Jove/Og Jovian/JNOg Joy/Og Joyce/Og Joycean/JNg Joyner/Og Jpn Jr/Jg Juan/Og Juana/Og Juanita/Og Juarez/Og Jubal/Og Judaeo Judah/Og Judaic/J Judaical/J Judaism/OgS Judas/ONSg Judd/Og Jude/Og Judea/Og Judges/O Judith/Og Judson/Og Judy/ONg Juggernaut/Og Jul/O Jules/Og Julia/Og Julian/OgJ Juliana/Og Julianne/Og Julie/Og Juliet/NOg Juliette/Og Julio/g Julius/Og Julliard/Og July/OgS Jun/Og June/OgS Juneau/Og Jung/Og Jungfrau/Og # mountain Jungian/JNg Junior/OgS Junker/NSg Juno/Og Jupiter/ONg Jurassic/JOg # geological period Jurua/g Justice/NOg Justin/Og Justine/Og Justinian/OgJ Jutland/Og Juvenal/Og K/ # Potassium KB/NOg # kilobyte, cf. Kb KC/ON KFC/Og # company KGB/Og # Soviet intelligence agency KIA/NJ # killed in action KKK/Og KO/NgV KP/N KS/ONV # US state (Kansas) KY/O # US state (Kentucky) Kaaba/Og Kabul/Og Kafka/Og # franz - Kafkaesque/Jg Kagoshima/Og # city Kahlua/Ng Kahului/Og Kaifeng/Og Kailua/g Kaiser/NOSg Kaitlin/Og Kalahari/Og # desert Kalamazoo/ONg Kalashnikov/Og Kalb/g Kalevala/Og Kalgoorlie/Og # city Kali/Og Kaliningrad/Og Kalmyk/JNOg # ethnicity Kama/Og Kama Sutra # prefEtymonline, Longman, OED (also: Chambers) Kamasutra # American Heritage, Chambers Kamchatka/Og Kamehameha/Og Kampala/Og Kampuchea/Og # old name of Cambodia Kan/OgS Kanchenjunga/Og Kandahar/Og Kandinsky/g Kane/Og Kaneohe/Og Kankakee/Og Kannada/Omg # language Kano/Og Kanpur/Og Kansai/Og Kansan/JNgS Kansas/Og Kant/Og # immanuel - Kantian/JNg Kaohsiung/Og Kaposi/Og Kara/Og Karachi/Og Karaganda/Og Karakorum/Og Karamazov/g Kardashian/OgS Kareem/Og Karen/ONg Karenina/g Kari/Og Karin/Og Karina/Og Karl/Og Karla/Og Karloff/g # boris - Karo/NOg Karol/g Karroo/Og Karyn/Og Kasai/g Kasey/Og Kashmir/ONSg # region Kasparov/Og # gary - Kate/Og Katelyn/Og Katharine/Og Katherine/Og Katheryn/Og Kathiawar/Og Kathie/Og Kathleen/Og Kathmandu/Og Kathrine/g Kathryn/Og Kathy/Og Katie/Og Katina/g Katmai/g Katniss/g Katowice/Og Katrina/Og Katy/ONg Kauai/Og # island Kaufman/Og Kaunas/Og Kaunda/g Kawabata/g # author Kawasaki/OgS # company Kay/ONg Kaye/Og Kayla/Og Kazakh/NOgJ Kazakhs/9 Kazakhstan/Og Kazan/Og Kazantzakis/g Kb/Ng # kilobit, cf. KB Keaton/Og Keats/Og Keck/Og Keenan/Og Keewatin/g Keillor/Og Keisha/Og Keith/Og Keller/Og Kelley/Og Kelli/Og Kellie/Og Kellogg/Og Kelly/Og Kelsey/Og Kelvin/ONg Kemalism/Og Kemalist/NgS Kemerovo/Og Kemp/Og Kempis/g Ken/Og Kendall/Og Kendra/Og Kendrick/Og Kenmore/g Kennan/Og Kennedy/Og Kenneth/Og Kennewick/Og Kennith/g Kenny/Og Kenosha/Og Kensington/Og Kent/Og Kenton/Og Kentuckian/JNgS Kentucky/Og Kenworth/NOSg Kenya/Og Kenyan/NSgJ Kenyatta/g Kenyon/Og Keogh/Og Keokuk/Og Kepler/Og Kerensky/g Keri/Og Kermit/Og Kern/Og Kerouac/Og Kerr/Og Kerri/Og Kerry/ONg Kettering/Og Keven/g Kevin/Og Kevlar/Ng Kevorkian/Og Kewpie/g Key/Og Keynes/Og Keynesian/JNg Keynesianism/Nmg Khabarovsk/Og Khachaturian/Og Khalid/Og Khan/Og Kharkiv/Og Kharkov/Og # old name of Kharkiv Khartoum/Og Khayyam/g Khazar/NOgJ Khmer/ONgJ Khoikhoi/NOg Khoisan/ONg Khomeini/Og Khorana/g Khrushchev/Og Khufu/Og Khulna/Og Khwarizmi/g Khyber/Og KiB # kibibyte Kickapoo/NOg Kidd/Og Kiel/Og Kierkegaard/Og Kieth/g Kiev/ONg # old name of Kyiv Kigali/Og Kikuyu/NOg Kilauea/Og Kilimanjaro/Og Killeen/Og Kilroy/Og Kim/Og Kimberley/Og Kimberly/Og King/NOg Kingsport/Og Kingston/Og Kingstown/Og Kinko's Kinney/Og Kinsey/ONg Kinshasa/Og Kiowa/NOSg09 # singular and plural, but also has plural in -s Kip/Og Kipling/Og Kirby/Og Kirchhoff/Og Kirchner/Og Kirghistan/g Kirghiz/NOgJ Kirghizia/g Kiribati/Og Kirinyaga/g Kirk/Og Kirkland/Og Kirkpatrick/Og Kirov/Og Kirsten/Og Kisangani/Og Kishinev/Og Kislev/Og Kissimmee/Og Kissinger/Og Kit/Og Kitakyushu/Og Kitchener/Og Kitty/Og Kiwanis/Ng Klan/Og Klansman/Ng Klaus/Og Klee/g Kleenex/NgS Klein/Og Klimt/g Kline/Og Klingon/ONg Klondike/ONSg Kmart/g Knapp/Og Knesset/Og Kngwarreye/g Knickerbocker/Ng Knievel/g Knight/Og Knopf/Og Knossos/Og Knowles/Og Knox/ONg Knoxville/Og Knudsen/Og Knuth/Og Knuths/O Kobe/Og Koch/Og Kochab/Og Kochi/Og Kodachrome/Og Kodak/g Kodaly/g Kodiak/NOg Koestler/Og Kohinoor/Og Kohl/Og Koizumi/Og Kojak/g Kokomo/Og Kolkata/Og Kolyma/Og Kommunizma/g Konami/Og Kong/Og Kongo/OgJ Königsberg/Og # old name of Kaliningrad Konigsberg/Og Konrad/g Koontz/Og Koppel/g Koran/NOSg Koranic/J Korea/Og Korean/JONSwg Kornberg/g Kory/Og Korzybski/g Kosciusko/Og Kosovo/Og Kossuth/Og Kosygin/g Kotlin/Og Koufax/g Kowloon/Og Kr/ # Krypton Kraft/Og Krakatoa/Og Kraken/OgS Krakow/Og Kramer/OgV Krasnodar/Og Krasnoyarsk/Og Krebs/Og Kremlin/Og Kremlinologist/N Kremlinology/N Kresge/Og Kringle/g Kris/Og Krishna/Og Krishnamurti/Og Krista/Og Kristen/Og Kristi/Og Kristie/Og Kristin/Og Kristina/Og Kristine/Og Kristopher/Og Kristy/Og Kroc/Og Kroger/Og Kronecker/Og Kropotkin/g Kruger/Og Krugerrand/Ng Krupp/Og Krystal/Og Kshatriya/Ng Kublai/g Kubrick/Og Kuhn/Og Kuibyshev/g Kulthumm/g Kunming/Og Kuomintang/Og Kurd/NgS Kurdish/JNg Kurdistan/Og Kurosawa/Og Kurt/Og Kurtis/Og Kusch/g Kutuzov/Og Kuwait/Og Kuwaiti/NSgJ Kuznets/Og Kuznetsk/Og Kwakiutl/Ng Kwan/Og Kwangju/Og Kwanzaa/OgS Ky/NOgH Kyiv/Og Kyle/Og Kyoto/Og Kyrgyzstan/Og Kyushu/Og L/NgJn L'Amour/g L'Enfant L'Oreal/g L'Ouverture/g LA/NO # US state (Louisiana) LAN/Ng LBJ/NOg LC/NJ LCD/Ng LCM LDC/N LED/NgS LG/NOg LGB/JN LGBT/JN LGBTQ/JN LGPL/NO # GNU Lesser General Public License LIFO/J LL/NJ LLB/Ng LLC/NgS # limited liability company LLD/g LNG/N LOGO LP/NOg LPG/N LPN/NSg LSAT LSD/Ng LVN/N La/ # Lanthanum Lab/NO Laban/Og Labor/Og_ # the australian political party doesn't use the normal australian spelling of 'labour' Labour/Og!₹ # the uk political party does use the normal british spelling of 'labour' Labrador/ONSg Labradorean/JN Lacey/Og Lachesis/ONg Lactobacillus/O Lacy/Og Lada/NOSg Ladakh/Og Ladoga/Og Ladonna/g Lady/NOg Ladyship/Sg Lafayette/Og Lafitte/Og Lagos/Og Lagrange/Og Lagrangian/JNg Lahore/Og Laius/Og Lajos/g Lakeisha/Og Lakeland/Og Lakewood/O Lakisha/Og Lakota/NOg Lakshmi/Og Lamaism/NSg Lamar/Og Lamarck/Og Lamaze/Ng Lamb/ONg Lambert/Og Lambo/ONSg Lamborghini/ONSg Lambrusco/Ng Lamentations/O Lamont/Og Lana/Og Lanai/Og Lancashire/ONg Lancaster/Og Lance/Og Lancelot/Og Land/Og Landon/Og Landry/Og Landsat/Ng Landsteiner/g Lane/Og Lang/Og Langerhans/g Langland/Og Langley/Og Langmuir/Og Lanka/Og Lankan/JNg Lanny/Og Lansing/Og Lanzhou/Og Lao/NOSgJ Laocoon/g Laos/ONg Laotian/NOSgJ Laplace/Og Laplacian/JN Lapland/Og> Lapp/NOSgJ Lara/Og Laramie/Og Lardner/Og Laredo/Og Larousse/g Larry/Og Lars/Ogn Larsen/Og Larson/Og Lascaux/Og Lassa/Og Lassen/Og Lassie/Og Lat/g Latasha/g Lateran/Og Latham/Og Latin/J>ONSg Latina/NOJ Latino/JNSg Latinx/JN Latisha/Og Latonya/Og Latoya/Og Latrobe/Og Latvia/Og Latvian/JNgS Laud/Og> Lauder/Og Laue/Og Laundromat/g Laura/Og Laurasia/Og Laurel/NOg Lauren/Og Laurence/Og Laurent/Og Lauri/Og Laurie/Og Laval/Og Lavern/Og Laverne/Og Lavoisier/g Lavonne/g Lawanda/Og Lawrence/Og Lawson/Og Lawton/Og Layamon/g Layla/Og Layton/Og Lazaro/g Lazarus/ONgV Le/OgS Lea/Og Leach/Og Leadbelly/g Leah/Og Leakey/Og Lean/Og Leander/Og Leann/Og Leanna/Og Leanne/Og Lear/Og Learjet/g Leary/Og Leatherman/Og Leavenworth/Og Lebanese/JNg Lebanon/Og Lebesgue/g Leblanc/Og Leda/Og Lederberg/g Lee/Og Leeds/Og Leesburg/Og Leeuwenhoek/g Leeward/g Left/O Legendre/Og Leger/Og Leghorn/ONg Lego/Ng # see also LEGO Legree/Og Lehman/Og Leibniz/Og Leicester/ONSg Leiden/Og Leif/g Leigh/Og Leila/Og Leipzig/Og Lela/Og Leland/Og Lelia/Og Lemaitre/Og Lemuel/Og Lemuria/Og Len/Og Lena/Og Lenard/Og Lenin/Og Leningrad/Og # old name of St. Petersburg Leninism/Nmg Leninist/JNg Lennon/Og Lenny/Og Leno/Og Lenoir/Og Lenora/Og Lenore/Og Lent/NOSgn Lenten/Jg Leo/ONSg Leola/Og Leominster/Og Leon/Og Leona/Og Leonard/Og Leonardo/ONg Leoncavallo/g Leonel/g Leonid/NOg Leonidas/Og Leonor/g Leopold/Og Leopoldo/g Lepidus/g Lepke/g Lepus/Og Lerner/g Leroy/Og Les/Og Lesa/g Lesley/Og Leslie/Og Lesotho/Og Lesseps/Og Lessie/g Lester/Og Lestrade/g Leta/g Letha/g Lethe/Og Leticia/g Letitia/Og Leto/Og Letterman/Og Levant/ONg Levesque/Og Levi/OgS Leviathan/Ng Levine/Og Leviticus/Og Levitt/Og Levy/Og Lew/Og Lewinsky/ONgV Lewis/Og Lewiston/Og Lewisville/Og Lexan/Og Lexington/Og Lexus/ONSg Lhasa/OgS Lhotse/Og Li/ # Lithium Liam/Og Liaoning/Og Libby/Og Liberace/g Liberal/NOJ Liberia/Og Liberian/NSgJ Libra/ONSg LibreOffice/g Libreville/Og Librium/Nmg Libya/Og Libyan/JNOSg Lichtenstein/Og Lidia/Og Lie/Og Lieberman/Og Liebfraumilch/Ng Liechtenstein/OgJ>Z Liechtensteiner/Ng Liege/Og Lieut/N Lila/Og Lilia/Og Lilian/Og Liliana/Og Lilith/Og Liliuokalani/g Lille/Og Lillian/Og Lillie/Og Lilliput/Og Lilliputian/NgSJ Lilly/ONg Lilongwe/Og Lily/Og Lima/NOg Limbaugh/Og Limbo/N Limburger/Ng Limoges/Og Limousin/ONg Limpopo/Og Lin/Og Lina/Og Lincoln/ONSg Lind/Og Linda/Og Lindbergh/Og Lindsay/Og Lindsey/Og Lindy/ONg Linnaeus/Og Linotype/g Linton/Og Linus/Og Linux/OgS Linwood/Og Lionel/Og Lipizzaner/Ng Lippi/g Lippmann/Og Lipscomb/Og Lipton/Og Lisa/ONg Lisbon/ONg Lissajous/Og Lister/Og Listerine/Og Liston/Og Liszt/Og Lithuania/Og Lithuanian/JNgS Little/Og Litton/Og Livermore/Og Liverpool/ONg Liverpudlian/JNSg Livia/Og Livingston/Og Livingstone/Og Livonia/Og Livy/Og Liz/Og Liza/Og Lizzie/Og Lizzy/Og Ljubljana/Og Llewellyn/Og Lloyd/Og Ln/N Loafer/Sg Lobachevsky/g Lochinvar/Og Locke/Og Lockean/JNg Lockheed/g Lockwood/Og Lodge/Og Lodi/Og Lodz/Og Loewe/Og Loewi/g Loews/g Logan/Og Lohengrin/g Loire/Og Lois/Og Loki/Og Lola/Og Lolita/ONg Lollard/Ng Lollobrigida/Og Lombard/NOgJ Lombardi/Og Lombardy/Og Lomé/Og Lome/Og Lompoc/Og Lon/Og London/Og>Z Londoner/Ng Long/Og Longfellow/Og Longmont/Og Longstreet/Og Longueuil/O Longview/Og Lonnie/Og Lopez/Og Lora/Og Lorain/Og Loraine/g Lord/ONSg Lordship/Sg Lorelei/Og Loren/Og Lorena/Og Lorene/Og Lorentz/Og Lorentzian/J Lorenz/ONg Lorenzo/Og Loretta/Og Lori/Og Lorie/Og Lorna/Og Lorraine/Og Lorre/g Lorrie/g Los Lot/Og Lothario/NSg Lott/Og Lottie/Og Lou/Og Louella/Og Louie/Og Louis/ONg Louisa/Og Louise/Og Louisiana/Og Louisianan/JNgS Louisianian/JNgS Louisville/Og Lourdes/Og Louvre/Og Love/NOg Lovecraft/Og Lovelace/ONg Lowe/OgV Lowell/Og Lowenbrau/g Lowery/Og Lowlands/O Loyang/Og Loyd/Og Loyola/Og Lr/ # Lawrencium Lt/N Ltd/JN Lu/ # Lutetium Luanda/Og Luann/Og Lubavitcher/NgJ Lubbock/Og Lubumbashi/Og Lucas/OgV Luce/Og Lucia/Og Lucian/Og Luciano/Og Lucien/g Lucifer/Og Lucile/Og Lucille/Og Lucinda/Og Lucio/g Lucite/OgSm Lucius/Og Lucknow/Og Lucretia/Og Lucretius/Og Lucy/Og Luddite/NgS Ludhiana/Og Ludwig/Og Luella/Og Lufthansa/Og Luftwaffe/Og Lugansk/Og # old name of Luhansk Luger/ONg Lugosi/g Luhansk/Og Luigi/Og Luis/Og Luisa/g Luke/Og Lula/Og Lully/g Lulu/Og Lumiere/g Luna/ONg Lupe/Og Lupercalia/Og Lupus/Og Luria/Og Lusaka/Og Lusitania/Og Luther/Og Lutheran/JNSg Lutheranism/NwgS Luvs/g Luxembourg/Og>Z Luxembourger/Ng Luxembourgian/NJ Luz/Og Luzon/Og Lviv/Og Lvov/Og LyX/Og # GUI document processor based on LaTeX Lyallpur/O Lycra/Ng Lycurgus/Og Lydia/Og Lydian/NOSgJ Lyell/Og Lyle/Og Lyly/g Lyman/Og Lyme/ONg Lynch/Og Lynchburg/Og Lynda/Og Lyndon/Og Lynette/Og Lynn/Og Lynne/Og Lynnette/Og Lyon/OgS Lyons/Og Lyra/Og Lysenko/Og Lysistrata/ONg Lysol/Og M/NOSgJGB MA/JNOg # US state (Massachusetts) MASH/N MB/NOgV MBA/Ng MC/NOV MCI/ONg MD/ONgJ # US state (Maryland) MD5/Ng MDF/Ng # medium-density fiberboard MDT/NO ME/ON # US state (Maine) MEGO/S MFA/ONg MGM/ONg # movie company MHz/ MI/ONg # US state (Michigan) MI6/Og # agency MIA/JNO # missing in action MIDI/ONg MIPS/NO # cpu MIRV/N MIT/Og # a university MLK/Og # Martin Luther King MM/NO MMA/Ng # mixed martial arts MMU/NgS # memory management unit MN/ON # US state (Minnesota) MO/ONJ # US state (Missouri) MOOC/N MOSFET/NgS # transistor MP/NOgJ # military police; member of parliament MP3/NSg # audio format MP4/NSg # audio/video format MPEG/ON MRI/NgV # magnetic resonance imaging MS/NOg # US state (Mississippi) MSG/NOg # flavour enhancer MSRP/NSg MST/ONgV MSW/N MT/JNOg # US state (Montana) MTV/Og MVP/Ng # most valuable player MW/NO Maalox/g Mabel/Og Mable/Og Mac/NOg MacArthur/Og MacBride/g MacDonald/Og MacGuffin/NOSg MacLeish/g Macao/Og Macaulay/Og Macbeth/Og Maccabees/ON Maccabeus/g Mace/Og Macedon/Og Macedonia/Og Macedonian/JNSg Mach/ONg Machiavelli/ONg Machiavellian/JNg Macias/g Macintosh/ONSg Mack/ONg Mackenzie/ONg Mackinac/g Mackinaw/g Macmillan/ONg Macon/ONg Macumba/g Macy/Og Madagascan/NSgJ Madagascar/ONg Madam/N Madden/Og Maddie/Og Maddox/Og Madeira/ONSg Madeleine/Og Madeline/Og Madelyn/Og Madera/Og Madge/Og Madison/ONg Madonna/ONSg Madras/ONg Madrid/Og Madurai/Og Mae/Og Maeterlinck/g Mafia/OgS Mafioso/Ng Magdalena/Og Magdalene/ONg Magellan/Og Magellanic/Jg Maggie/Og Maghreb/Og Magi/O Maginot/g Magnificat/O Magnitogorsk/Og Magog/Og Magoo/g Magritte/g Magsaysay/Og Magus/Ng Magyar/ONSgJ Mahabharata/Og Maharashtra/Og Mahavira/g Mahayana/Og Mahayanist/Ng Mahdi/Og Maher/OgS Mahfouz/g Mahican/NSg Mahler/Og Mai/Og Maia/Og Maidenform/g Maigret/g Mailer/Og Maillol/g Maiman/g Maimonides/Og Maine/Og>Z Mainer/NOg Maisie/Og Maitreya/Og Maj/N Majesty/I Major/ONg Majorca/Og Majuro/Og Makarios/g Maker/Og Malabar/ONg Malabo/Og Malacca/ONg # old spelling of Melaka Malachi/Og Malaga/Og Malagasy/NgJ Malamud/Og Malaprop/g Malawi/Og Malawian/NSgJ Malay/JNOwSg Malaya/Og Malayalam/Og Malayan/NOSgJ Malaysia/Og Malaysian/JNOSg Malcolm/Og Maldive/Sg Maldives/O9g Maldivian/NgSJ Maldonado/Og Malé/Og Male/Og Mali/ONg Malian/NSgJ Malibu/Og Malinda/Og Malinowski/Og Mallarme/g Mallomars/g Mallory/Og Malone/Og Malory/g Malplaquet/g Malraux/g Malta/Og Maltese/JNOg Malthus/Og Malthusian/JNSg Mameluke/Ng Mamet/Og Mamie/Og Mamore/g Man/Og Managua/Og Manama/Og Manasseh/Og Manchester/Og Manchu/NOSgJ Manchuria/Og Manchurian/JNg Mancini/Og Mancunian/JNOSg Mandalay/Og Mandarin/Ng Mandela/Og Mandelbrot/ONg Mandeville/Og Mandingo/ONg Mandrell/Og Mandy/Og Manet/Og Manfred/Og Manhattan/ONSg Mani/ONg Manichean/NgJ Manila/ONSg Manitoba/Og Manitoulin/g Mankato/Og Manley/Og Mann/ONgG Mannheim/Og Manning/Og Mansfield/Og Manson/Og Manteca/Og Mantegna/g Mantle/Og Manuel/Og Manuela/Og Manx/JNOg Mao/Og Maoism/NSg Maoist/JNSg Maori/NOSgJ Mapplethorpe/g Maputo/Og Mar/ONSg Mar-a-Lago/Og Mara/ONg Maracaibo/Og Marat/g Maratha/NOg Marathi/ONgJ Marathon/NOg Marc/Og Marceau/Og Marcel/Og Marcelino/g Marcella/Og Marcelo/g March/OgS Marci/Og Marcia/Og Marciano/Og Marcie/Og Marco/OgS Marconi/Og Marcos/Og Marcus/Og Marcuse Marcy/Og Marduk/Og Margaret/Og Margarita/Og Margarito/Og Marge/Og Margery/Og Margie/Og Margo/Og Margot/O Margret/g Margrethe/g Marguerite/Og Mari/ONSg Maria/Og MariaDB/g Marian/ONgJ Mariana/OgS Marianas/Og Marianne/Og Mariano/g Maribel/g Maricela/g Marie/Og Marietta/Og Marilyn/ONg Marin/Og Marina/Og Marine/JNSg Mario/ONg Marion/Og Maris/Og Marisa/Og Marisol/g Marissa/Og Maritain/g Maritza/Og Mariupol/O Marius/Og Marjorie/Og Marjory/Og Mark/ONSg Markab/Og Markdown/NOg Markham/Og Markov/Og Marks/Og Marla/Og Marlboro/ONg Marlborough/Og Marlene/Og Marley/Og Marlin/Og Marlon/Og Marlowe/Og Marmara/Og Marne/Og Maronite/JNg Marple/Og Marquesas/Ng Marquette/Og Marquez/Og Marquis/Og Marquita/g Marrakesh/Og Marriott/Og Mars/ONSg Marsala/ONg Marseillaise/OgS Marseilles/ONg Marsh/Og Marsha/Og Marshall/Og Marta/Og Martel/Og Martha/ONg Martial/ONgJ Martian/JNOSg Martin/Og Martina/Og Martinez/Og Martinique/Og Marty/Og Marva/g Marvell/g Marvin/Og Marx/Og Marxian/JN Marxism/NSg Marxist/JNSg Mary/Og Maryann/Og Maryanne/Og Maryellen/g Maryland/Og> Marylander/Ng Marylou/Og Marysville/Og Masada/g Masai/NOg Masaryk/g Mascagni/g Masefield/Og Maserati/ONg Maseru/Og Mashhad/Og Mason/ONSg Masonic/Jg Masonite/Nmg Mass/NOSg Massachusetts/Og Massasoit/g Massenet/g Massey/Og Master/NOS MasterCard/Ng Masters/NOg Mather/Og Matheson/Og Mathew/OgS Mathews/Og Mathewson/Og Mathias/Og Mathis/Og Matilda/ONg Matisse/g Matlab/g Matt/Og Mattel/Og Matterhorn/Og Matthew/OgS Matthews/Og Matthias/Og Mattie/Og Maud/Og Maude/Og Maugham/Og Maui/Og Mauldin/Og Maupassant/g Maura/Og Maureen/Og Mauriac/Og Maurice/Og Mauricio/g Maurine/g Mauritania/Og Mauritanian/NSgJ Mauritian/JNOSg Mauritius/Og Mauro/g Maurois/g Mauryan/JNg Mauser/Ng Mavis/Og Max/Og Maximilian/Og Maxine/Og Maxwell/Og May/OgS> Maya/NOSg Mayan/JNOSg Mayer/Og Mayfair/Og Mayflower/Og Maynard/Og Mayo/ONg Maypole Mayra/g Mays/NOg Maytag/ONg Mazama/g Mazarin/Og Mazatlan/g Mazda/ONg Mazola/g Mazzini/g Mb/g Mbabane/Og Mbini/Og McAdam/Og McAllen/Og McBride/Og McCain/Og McCall/Og McCarthy/Og McCarthyism/NOg McCartney/Og McCarty/Og McClain/Og McClellan/Og McClure/Og McConnell/Og McCormack/Og McCormick/Og McCoy/ONg McCray/Og McCullough/Og McDaniel/Og McDonald/Og McDonnell/Og McDowell/Og McEnroe/Og McFadden/Og McFarland/Og McGee/Og McGovern/Og McGowan/Og McGregor/Og McGuffey/Og McGuire/Og McHenry/Og McIntosh/ONg McIntyre/Og McJob/N McKay/Og McKee/Og McKenna/ONg McKenzie/ONg McKinley/Og McKinney/Og McKnight/Og McLaren/NOSg McLaughlin/Og McLean/Og McLeod/ONg McLuhan/Og McMahon/Og McMansion/NgS McMillan/Og McNamara/Og McNaughton/Og McNeil/Og McPherson/Og McQueen/Og McVeigh/Og Md/ # Mendelevium Me/NOI Mead/Og Meade/Og Meadows/Og Meagan/Og Meany/Og Mecca/ONSg Medan/Og Medea/Og Medellin/Og Medford/Og Media/Og Medicaid/OgS Medicare/OgS Medici/Og Medina/Og Mediterranean/JONSg Medjugorje/Og Medusa/Og Meg/ONg Megan/Og Meghan/Og Meier/Og Meighen/g Meiji/Jg Meir/Og Mejia/Og Mekong/Og Mel/Og Melaka/Og Melanesia/Og Melanesian/JNg Melania/Og Melanie/Og Melba/Og Melbourne/Og Melchior/NOg Melchizedek/ONg Melendez/Og Melinda/Og Melisa/g Melisande/g Melissa/Og Mellon/Og Melody/Og Melpomene/Og Melton/Og Melva/Og Melville/Og Melvin/Og Memcached/g Memling/g Memphis/Og Menander/g Mencius/Og Mencken/Og Mendel/Og Mendeleev/Og Mendelian/Jg Mendelssohn/Og Mendez/Og Mendocino/Og Mendoza/Og Menelaus/Og Menelik/g Menes/Og Mengzi/O Menifee/Og Menkalinan/Og Menkar/Og Menkent/g Mennen/g Mennonite/NgSJ Menominee/NOg Menotti/g Mensa/Og Mentholatum/g Menuhin/g Menzies/Og Mephisto/O Mephistopheles/ONg Merak/Og Mercado/Og Mercator/Ng Merced/Og Mercedes/ONg Mercedes-Benz/Og Mercer/Og Mercia/Og Merck/Og Mercurochrome/g Mercury/ONSg Meredith/Og Merino/NOg Merkel/Og Merle/Og Merlin/Og Merlot/Ng Merovingian/NgJ Merriam/Og Merrick/Og Merrill/Og Merrimack/Og Merritt/Og Merthiolate/g Merton/Og Mervin/Og Mesa/Og Mesabi/g Mesmer/Og Mesolithic/JNg Mesopotamia/Og Mesopotamian/NJ Mesozoic/JOg Messerschmidt/Og Messiaen/g Messiah/Og Messiahs Messianic/JN Messieurs/N Metallica/g Metamucil/g Methodism/NSg Methodist/NSgJ Methuselah/ONg Metternich/g Meuse/Og Mex/ON Mexicali/Og Mexican/NgSJ Mexico/Og Meyer/OgS Meyerbeer/g Meyers/Og Mfume/g Mg/ # Magnesium Mgr MiB # mebibyte MiG/Ng Mia/Og Miami/ONSg Miaplacidus/Og Micah/Og Micawber/NgV Mich/Og Michael/Og Michaela/Og Michaelmas/OgS Micheal/Og Michel/Og Michelangelo/Og Michele/Og Michelin/Og Michelle/Og Michelob/Og Michelson/Og Michigan/ONg Michigander/NgS Michiganite/N Mick/ONg Mickey/NOg Mickie/Og Micky/ONg Micmac/NSg Micronesia/Og Micronesian/NgJ Microsoft/ONgV Midas/ONg Middleton/Og Middletown/Og Mideast/O Mideastern/J Midland/OgSJ Midway/Og Midwest/Og Midwestern/J>g Miguel/Og Mike/NOg Mikhail/Og Mikoyan/Og Milagros/g Milan/Og Milanese/JNO Mildred/Og Miles/Og Milford/Og Milken/g Mill/OgS> Millard/Og Millay/Og Miller/Og Millet/Og Millicent/Og Millie/Og Millikan/Og Mills/Og Milne/Og Milo/Og Milosevic/Og Milquetoast/JNg Miltiades/Og Milton/Og Miltonian/J Miltonic/Jg Miltown/ONg Milwaukee/Og Mimi/Og Mimosa/Og Min/Og Minamoto/g Mindanao/Og Mindoro/Og Mindy/Og Minerva/Og Ming/ONg Mingus/Og Minn Minneapolis/Og Minnelli/g Minnesota/Og Minnesotan/JNSg Minnie/Og Minoan/JNOSg Minolta/g Minos/Og Minot/Og Minotaur/Og Minsk/Og Minsky/Og Mintaka/Og Minuit/g Minuteman/g Miocene/JOg # geological period Mir/Og Mira/Og Mirabeau/g Mirach/Og Miranda/OgV Mirfak/Og Miriam/Og Miro/g Mirzam/Og Miskito/JNOg Miss/N Mississauga/NOg Mississippi/ONg Mississippian/JONSg Missoula/Og Missouri/Og Missourian/JNgS Missy/Og Mistassini/NOg Mister/N Mistress/N Misty/Og Mitch/Og Mitchel/Og Mitchell/Og Mitford/Og Mithra/Og Mithridates/Og Mitsubishi/NgS # car company Mitterrand/g # president Mitty/g Mitzi/Og Mixtec/NOgJ # ethnicity Mizar/Og Mk/N Mlle/N Mme/NS Mn/ # Manganese Mnemosyne/Og Mo/ # Molybdenum Mobil/Og Mobile/Og Mobutu/g Modesto/Og Modigliani/g Moe/Og Moet/g Mogadishu/Og # capital of Somalia Mogul/NOSg Mohacs/g Mohamed/Og Mohammad/Og Mohammedan/NSgJ Mohammedanism/OgSw Mohave/NOSg Mohawk/NOSg Mohegan/NO Moho/Og Mohorovicic/Og Moira/Og Moises/Og Moiseyev/g Mojave/NOSg Moldavia/Og Moldavian/NOJ Moldova/Og Moldovan/NOJ Moliere/g Molina/Og Moll/Og Mollie/Og Molly/ONg Molnar/Og Moloch/Og Molokai/Og Molotov/ONgV # minister Moluccas/Og Mombasa/Og Mon/NOSg # city Mona/Og Monacan/JN Monaco/Og Mondale/g # surname Monday/NSg Mondrian/g Monegasque/NSgJ Monera/Og Monessen/Og Monet/Og MongoDB/g # trademark Mongol/NOSgJ Mongolia/Og Mongolian/JNwSg Mongolic/OgJ Mongoloid/N Monica/Og Monique/Og Monk/Og Monmouth/Og Monongahela/ONg Monroe/Og Monrovia/Og Monsanto/Og Monsieur/Ng Monsignor/NSg Mont/Og Montague/Og Montaigne/Og Montana/Og Montanan/JNSg Montcalm/Og Monte/Og Montenegrin/JNg Montenegro/Og Monterey/OgJ Monterrey/Og Montesquieu/g Montessori/Jg Monteverdi/g Montevideo/Og Montezuma/Og Montgolfier/ONg Montgomery/Og Monticello/Og Montoya/Og Montpelier/Og Montrachet/Ng Montreal/Og Montserrat/Og Monty/Og Moody/Og Moog/ONg # company Moon/Og Mooney/Og Moor/NOSg Moore/Og Moorish/Jg Mopar/OgS Morales/Og Moran/Og Moravia/Og Moravian/JNg Mordred/Og More/Og Moreno/Og Morgan/ONSg Morgantown/Og Moriarty/Og Morin/Og Morison/Og Morita/Og Morley/Og Mormon/ONSgJ Mormonism/OgSw Moro/ONg Moroccan/NSgJ Morocco/Og Moroni/Og Morpheus/Og Morphy/g Morris/Og Morrison/Og Morristown/Og Morrow/Og Morse/ONgV Mort/Og Mortimer/Og Morton/Og Mosaic/Jg Moscow/Og Moseley/Og Moselle/ONg Moses/Og Mosley/Og Moss/Og Mosul/Og Motorola/Og # company Motown/ONg Motrin/g Mott/Og Moulton/Og Mount/Og Mountbatten/Og Mountie/NgS Moussorgsky/g Mouthe/g Mouton/Og Mowgli/g Mozambican/JNSg Mozambique/ONg Mozart/NOg Mozilla/g # company Mr/NSg Ms/NS Msgr Mt/ # Meitnerium Muawiya/g Mubarak/Og # president Mueller/Og Muenster/Sg Mugabe/Og # president Muhammad/Og Muhammadan/NgSJ Muhammadanism/OgSw Muir/Og Mujib/Og Mulder/Og Mullen/Og Muller/Og Mulligan/Og Mullikan/g Mullins/Og Mulroney/Og Multan/Og Multics/O Mumbai/Og # city Mumford/Og Munch/Og Munchhausen/g Muncie/Og Munich/Og Munoz/Og Munro/ONg Munster/Og Muppet/Ng Murasaki/Og Murat/Og Murchison/Og Murcia/O Murdoch/Og Murfreesboro/Og Muriel/Og Murillo/g Murine/g Murmansk/Og # city Murphy/ONgV Murray/Og Murrieta/Og Murrow/Og Murrumbidgee/Og Muscat/Og Muscovite/NgJ Muscovy/Og Muse/NOg Musharraf/Og Musial/Og Muskegon/Og Muskogee/NOg Muslim/NgSJ Mussolini/OgJ Mussorgsky/g Mustafa/Og Mutsuhito/g Muzak/ONgV # trademark MySQL/g MySpace/Ng # social media Myanmar/Og Mycenae/Og Mycenaean/JNOg # ancient civilization Myers/Og Mylar/OgS Myles/Og Myra/Og Myrdal/Og Myrna/Og Myron/Og Myrtle/Og Mysore/Og # old name of karnataka state and mysuru city Myst/g Mysuru/Og N/ # Nitrogen N'Djamena/O # capital of Chad NAACP/Og NAFTA/Og # trade agreement NAND gate/NgS NASA/Og # space agency NASCAR/Og NASDAQ/Og # stock exchange NATO/Og # North Atlantic Treaty Organization NB/JNO NBA/Og # sports organization NBC/ONgJ NBS NC/ONJ # US state (North Carolina) NCAA/Og NCO/N ND/ONJ # US state (North Dakota) NDA/NSg # non-disclosure agreement NE/ONgJ # US state (Nebraska) NEC/Og # electronics company NEH/O NES/Ng # game console NF/ONJ NFC/ON # near-field communication NFL/ONg # sports organization NGO/NgS # non-government organization NH/ONVJ # US state (New Hampshire) NHL/NOg # sports organization NIH/OJ # National Institutes of Health NIMBY/NJ # not in my backyard NJ/OJ # US state (New Jersey) NLRB/O NM/ONJV # US state (New Mexico) NOR gate/NgS NORAD/Og NP/ON NPC/NSg # non-player character NPR/ONg # National Public Radio NR/JNO NRA/O # National Rifle Association NRC/ONJ NS/ONJ NSA/JONg # FIXME! elsewhere we have N.S.A. NSC/ON NSF/ON NSFW/J # not safe for work NSW/Og # New South Wales NSX/Ng # car NT/ON NTFS/Ng # file system NTSC/Ng # television standard NV/ONJ # US state (Nevada) NVIDIA/g # FIXME! elsewhere we have Nvidia NVMe/O NW/ONg NWT/O NY/O # US state (New York) NYC/O NYSE/O # stock exchange NZ/Og # New Zealand Na/ # Sodium Nabisco/g # company Nabokov/g Nader/Og Nadia/Og Nadine/Og Nagasaki/Og Nagoya/Og Nagpur/Og Nagy/Og Nahuatl/NOSg Nahum/Og Naipaul/Og Nair/NOg Nairobi/Og Naismith/Og Nam/Og Namath/g Namibia/Og Namibian/JNgS Nampa/Og Nan/NOg Nanak/g Nanchang/Og Nancy/Og Nanette/Og Nanjing/Og Nannie/Og Nanook/g Nansen/Og Nantes/Og Nantucket/Og Naomi/Og Napa/Og Naphtali/Og Napier/Og Naples/Og Napoleon/ONSg Napoleonic/Jg Napster/Ng # old music sharing service Narcissus/Og Narmada/Og Narnia/Og Narraganset/N Narragansett/NOg Nash/ONg Nashua/NOg Nashville/ONg Nassau/ONg Nasser/Og Nat/ONg Natalia/Og Natalie/Og Natasha/Og Natchez/NOg Nate/Ogn Nathan/ONSg Nathaniel/Og Nathans/Og Nation/Og Nationwide/g Nativity/Og Naugahyde/Ng Nauru/Og Nautilus/g Navajo/NOSg09 # singular and plural, but also has plural in -s Navajoes/N9 Navarre/Og Navarro/Og Navratilova/g Navy Nazarene/JNOg Nazareth/Og Nazca/Og Nazi/NOSgJ Nazism/NgS Nb/ # Niobium Nd/ # Neodymium Ndjamena/g Ne/ # Neon Neal/Og Neanderthal/JNSg Neapolitan/JNOg Neb/O Nebr/O Nebraska/Og Nebraskan/JNgS Nebuchadnezzar/ONg Necronomicon/Og Ned/Og Nefertiti/Og Negev/Og Negress/NgS Negritude Negro/N0gS Negroes/N9 Negroid/NSg Negros/Og Nehemiah/Og Nehru/Og Neil/Og Nelda/Og Nell/Og Nellie/Og Nelly/Og Nelsen/Og Nelson/Og Nembutal/g Nemesis/Og Neogene/JOg Neolithic/ONJ Nepal/Og Nepalese/JONg Nepali/JNOSg Neptune/Og Nereid/Og Nerf/g # brand Nero/ONg Neruda/g Nescafe/Og # brand Nesselrode/Og Nestle/Og # company Nestor/ONg Nestorius/g Netanyahu/Og # surname, Israeli politician Netflix/Vg # media company Netherlander/NSg Netherlands/ONgJ Netscape/g # old browser & company Nettie/Og Netzahualcoyotl/g Nev/Og Neva/Og Nevada/Og Nevadan/NSgJ Nevadian/JN Neville/Og Nevis/Og Nevsky/g Newark/Og Newburgh/Og Newcastle/Og Newfoundland/ONSg Newfoundlander/NSg Newman/Og Newport/Og Newsweek/g Newton/Og Newtonian/JNg Nexis/g Ngaliema/g Nguyen/Og Ni/ # Nickel Niagara/ONg Niamey/Og Nibelung/Ng Nicaea/Og Nicaragua/Og Nicaraguan/JNSg Niccolo/g Nice/Og Nicene/JNg Nichiren/Og Nicholas/Og Nichole/Og Nichols/Og Nicholson/Og Nick/Og Nickelodeon/Ng # media company Nicklaus/g Nickolas/Og Nicobar/JNg Nicodemus/OgV Nicola/OgS Nicolas/Og Nicole/Og Nicosia/Og # capital of Cyprus Niebuhr/Og Nielsen/Og Nietzsche/Og Nieves/Og Nigel/ONg Niger/Og # country Nigeria/Og Nigerian/NgSJ Nigerien/NgJ Nightingale/Og Nijinsky/g Nike/ONg # company Nikita/Og Nikkei/NgJ # stock market index Nikki/Og Nikolai/Og Nikon/g # company Nile/Og # river Nimitz/Og Nimrod/ONg Nina/ONg Nineveh/Og # ancient city Nintendo/ONg # company Niobe/ONg Nippon/Og Nipponese/JONg Nirenberg/g Nirvana/g Nisan/Og Nisei/Ng Nissan/NOSg # company Nita/g Nivea/g Nixon/ONg Nkrumah/g No/ # Nobelium NoDoz/g # trademark Noah/ONg Nobel/ONg # prize Nobelist/NgS Noble/Og Noe/Og Noel/OgS Noelle/Og Noemi/Og Nokia/ONg # company Nola/Og Nolan/Og Nome/Og Nona/Og Nootka/NOg Nora/Og Norbert/Og Norberto/Og Nordic/JNgS Noreen/Og Norfolk/ONg Noriega/Og Norma/Og Normal/g Norman/NOSgJ Normand/Ng Normandy/Og Norplant/Ng Norris/Og Norse/JNOg Norseman/NOg Norsemen/9g North/Og Northampton/Og Northeast/OgS Northerner/Ng Northrop/Og Northrup/Og Norths/O Northwest/Sg Norton/ONSg Norw Norway/ONg Norwegian/NwSgJ Norwich/Og Nosferatu/Ng Nostradamus/ONg Nottingham/Og Nouakchott/Og Nouméa/Og Noumea/Og Nov/Og Nova/ONg Novartis/g November/NOSg Novgorod/Og Novocain/NgS Novocaine/Ogm Novokuznetsk/Og Novosibirsk/Og Noxzema/g Noyce/Og Noyes/Og Np/ # Neptunium Nubia/Og Nubian/NgJ Nukualofa/Og Nukuʻalofa/Og # capital of Tonga Numbers/Og Nunavut/Og Nunez/Og Nunki/Og Nürburgring/Og Nuremberg/Og # city Nureyev/Og # rudolf - NutraSweet/g # trademark NyQuil/g # trademark Nyasa/g Nyerere/Og O/NOSgPJ # Oxygen O'Brien/Og O'Casey/Og O'Connell/Og O'Connor/Og O'Donnell/Og O'Hara/Og O'Higgins/Og O'Keeffe/Og O'Neil/Og O'Neill/Og O'Rourke/Og O'Toole/Og OAS/NOg OB/NJ OBD/NgS # on-board diagnostics OCR/ONV # optical character recognition OD/NSgV OE/ONJV OECD/Og # organization OED/O # dictionary OEM/JNgS # original equipment manufacturer OH/ON # US state (Ohio) OHSA/g # law OJ/NJ OK/NOSgVdGJ # US state (Oklahoma) OLED/Ng # organic light-emitting diode OMB/Og OMG # exclamation OPEC/Og # organization OR/CNO # Oregon OR gate/NgS OS/Ng # removed `O` proper noun and `J` adjective flags OS X/Og # before macOS OSHA/Og # agency OSS/ONV # open source software OSes/N9 OT/NOJ OTB/J OTC/JNO # over the counter OTOH/ # on the other hand Oahu/Og # island Oakland/Og Oakley/Og Oates/Og Oaxaca/ONg # city, state Ob/Og # obamium Obadiah/Og Obama/Og # president Obamacare/O Oberlin/Og Oberon/Og Ocala/Og Ocaml/g # programming language Occam/Og # -'s razor Occident/O Occidental/OgSJ Oceania/Og Oceanside/O Oceanus/Og Ochoa/Og Oct/Og Octavia/Og Octavian/Og Octavio/g October/ONSgV Odell/Og Oder/Og Odesa/Og Odessa/Og # old spelling of Odesa Odets/g Odia/ONg # language, previously Oriya Odin/Og Odis/g Odom/Og Odysseus/Og Odyssey/Og Oedipal/Jg Oedipus/Og Oersted/g Ofelia/g Offenbach/g OfficeMax/g Ogbomosho/Og Ogden/Og Ogilvy/Og Oglethorpe/Og Ohio/OgJ Ohioan/NSgJ Oise/Og Ojibwa/Og9S0 # singular and plural, but also has plural in -s Okayama/O Okeechobee/Og Okefenokee/Og Okhotsk/Og # city Okinawa/Og # island, prefecture Okinawan/JNO Okla/O Oklahoma/Og Oklahoman/NgSJ Oktoberfest/Ng Ola/Og Olaf/Og Olajuwon/g Olav/g Old World/Og Oldenburg/ONg Oldfield/Og Oldsmobile/ONSg Olduvai/Og Olen/g Olenek/Og Olga/Og Oligocene/JOg # geological period Olin/Og Olive/Og> Oliver/OgJ Olivetti/g # computer company Olivia/Og Olivier/g Ollie/Og Olmec/Ng # ancient civilization Olmsted/Og Olsen/Og Olson/Og Olympia/OgS Olympiad/NgS Olympian/JNgS Olympic/JNSg Olympics/ONg Olympus/Og Omaha/NOSg # city Oman/Og Omani/NgSJ Omar/Og Omayyad/JNg Omdurman/Og Omnipotent/O Omsk/Og # city Onassis/g Oneal/g Onega/Og Onegin/g # eugene - Oneida/NOSg Onion/Ng # media company Ono/Og # yoko - Onondaga/NOSg Onsager/g Ont/O Ontarian/JN Ontario/Og Oort/Og Opal/Og Opel/g # car company OpenOffice/g # product Ophelia/Og Ophiuchus/Og Oppenheimer/ONg Opposition Oprah/OgV Ora/Og Oracle/Og # company Oran/Og Orange/OgJ Oranjestad/Og Orban/Og Orbison/Og Ordovician/JOg Ore/On Oreg/O Oregon/Og Oregonian/NSgJ Orem/Og Oreo/Ng Orestes/Og Orient/ONg Oriental/JNgS Orientalism/N Orin/ONg Orinoco/Og Orion/Og Oriya/ONg # old name of odiya language Orizaba/Og Orkney/Og # island Orlando/Og Orleans/ONg Orlon/NgS Orly/Og Orpheus/Og Orphic/JNg Orr/Og Ortega/Og Orthodox/JN Ortiz/OgS Orval/g Orville/Og Orwell/Og Orwellian/Jg Os/ # Osmium Osage/OgS Osaka/Og # city Osbert/g Osborn/Og Osborne/Og Oscar/NOSg Osceola/Og Osgood/Og Oshawa/Og Oshkosh/Og Osiris/Og Oslo/Og Osman/Og Ostrogoth/Ng Ostwald/g Osvaldo/g Oswald/Og Othello/Og Otis/Og Ottawa/ONSg Otto/Og Ottoman/NgJ Ottomanism/Nmg Ouagadougou/Og Ouija/NgS Ouranos/g Overton/Og Ovid/Og Owen/OgS Owens/Og Owensboro/Og Oxford/ONSg Oxnard/Og Oxonian/JNg Oxus/Og Oxycontin/g Oz/ONg Ozark/ONSg Ozarks/NOg Ozymandias/Ng Ozzie/ONgJ P/ # Phosphorus P.P.S. # post-postscript P.S. # postscript PA/ONgJ # US state (Pennsylvania) PAC/NOg # political action committee PARC/S # xerox PASCAL # cf. pascal, Pascal PB/NgS # personal best; peanut butter PBS/NOg # organization PBX/N PC/JNOSgV PCB/NgS # printed circuit board PCI/NgS # expansion slot standard PCM/Ng PCMCIA/O # standard PCP/Ng # drug PD/NO PDA/NwSg # personal digital assistant; public display of affection PDF/NS # document format PDQ/ PDT/ON PE/ON PED/NgS # performance-enhancing drug PET/NOg # early computer PFC/N PG/JNO PGP/NO # encryption PHP/NOg # programming language PIN/N # personal identification number PJ's PLA/Og # china's army PLC/NgS # public limited company; programmable logic controller PLO/ONg # organization PM/NSgVdG # prime minister; private message PMS/NOgVJ PNG/Og # Papua New Guinea; image format PO/NJ POS/Ng # part-of-speech POV/NSg # point of view POW/NgS # prisoner of war PP/NO PPE/Ng # personal protective equipment PPS/N # post-postscript; other meanings? PR/NgS # public relations; pull request; Puerto Rico PRC/ONg # mainland China PRO/N PS/ONgJ # postscript; multiple meanings as implied by the attributes? PST/ONg PSU/Sg # power supply unit PT/NOJ PTA/NgV PTO/ON PVC/Ng # plastic PW/ON PX/N Pa/ # Protactinium Paar/Og Pablo/Og Pablum/Og Pabst/Og Pace/Og Pacheco/Og Pacific/ONgJ Pacino/Og # al - Packard/Og # old car company Padang/O Paderewski/Og Padilla/Og Paganini/Ng Page/Og Paglia/g Pahlavi/Og Paige/Og Paine/Og Paiute/NSg Pakistan/Og Pakistani/NSgJ Palembang/Og Paleocene/JOg # geological period Paleogene/JOg Paleolithic/OgJ # geological period Paleozoic/JOg # geological period Palermo/Og # city Palestine/Og Palestinian/JNSg Palestrina/g Paley/Og Palikir/Og Palisades/Og Palladio/g Palmdale/Og Palmer/Og Palmerston/Og Palmolive/g Palmyra/Og Palomar/Og Pam/Og Pamela/Og Pamirs/Ng Pampers/Ng Pan/ONg Pan Am/Ng # old airline Panama/ONSg Panamanian/NgSJ Panasonic/Og # company Pandora/Og Pangaea/Og Pankhurst/Og Panmunjom/Og Pansy/Og Pantagruel/g Pantaloon/g Pantheon/Og Panza/Og Paracelsus/Og Paraclete/Og Paradise/O Paraguay/Og Paraguayan/NgSJ Paralympic/JS Paramaribo/Og Paramount/Og Parana/g Parcheesi/g Pareto/Og Paris/Og Parisian/NgSJ Park/OgS> Parker/ONg Parkersburg/Og Parkinson/Og Parkinsonism/Nmg Parkman/Og Parks/Og Parliament/Og Parmenides/O Parmesan/JNwgS Parnassus/OgS Parnell/Og Parr/Og Parrish/Og Parsifal/g Parsons/Og Parthenon/Og Parthia/Og Pasadena/Og Pascagoula/Og Pascal/OgS # cf. pascal, PASCAL Pascal case/Nmg Pasco/Og Pasquale/Og Passion/OgS Passover/OgS Pasternak/Og Pasteur/Og Pat/ONg Patagonia/Og Patagonian/JNg Pate/Og Patel/Og Paterson/Og Patna/Og Patrica/g Patrice/Og Patricia/Og Patrick/Og Patsy/Og Patterson/Og Patti/Og Patton/Og Patty/Og Paul/Og Paula/Og Paulette/Og Pauli/Og Paulina/Og Pauline/OgJ Pauling/ONg Pavarotti/g Pavlov/OgV Pavlova/ONg Pavlovian/Jg Pawnee/ONSgJ Pax Americana/Og PayPal/ONgV # company Payne/Og Pb/ # Lead Pd/ # Palladium Peabody/Og Peace/ONg Peale/Og Pearl/Og Pearlie/g Pearson/Og Peary/Og Pechora/Og Peck/Og Peckinpah/Og Pecos/Og Pedro/NOg Peel/Og Peg/Og Pegasus/ONSg Peggy/Og Pei/Og Peiping/Og Peking/OgS Pekingese/ONSgJ Pele/Og Pelee/Og Peloponnese/Og Pembroke/Og Pen/Og Pena/Og Penang/Og Penderecki/g Penelope/Og Penn/Og Penna/O Penney/Og Pennington/Og Pennsylvania/Og Pennsylvanian/NgSJ Penny/Og Pennzoil/g Pensacola/ONg Pentagon/Og Pentateuch/Og # part of the Old Testament Pentax/g # camera company Pentecost/OgS Pentecostal/JNgS Pentecostalism/N Pentium/NSg # cpu brand Peoria/ONg Pepin/Og Pepsi/ONg # drink brand Pepys/Og Pequot/NOg Percheron/Ng Percival/Og Percy/Og Perelman/Og Perez/Og Periclean/Jg Pericles/Og Perkins/Og Perl/OgS Perm/Og Permalloy/g Permian/NOgJ Pernod/Ng Peron/Og Peronism/Nmg Peronist/JNgS Perot/Og Perrier/Og Perry/Og> Perseid/Ng Persephone/Og Persepolis/Og Perseus/Og Pershing/Og Persia/Og Persian/NSgJ Perth/Og Peru/Og Peruvian/NgSJ Peshawar/Og Petain/g Petaluma/Og Pete/Og>Z Peter/NOg Peters/Ogn Petersen/Og Peterson/Og Petra/Og Petrarch/Og Petri dish/NgS Petrograd/Og # old name of St. Petersburg, cf. Leningrad Petty/Og Peugeot/ONg # car company Pfc Pfizer/Og PhD/NgS # degree Phaedra/Og Phaethon/Og Phanerozoic/JOg Pharaoh/ONg Pharaohs/NO Pharisaic/J Pharisaical Pharisee/NgS Phekda/g Phelps/Og Phidias/g Phil/ONgJY Philadelphia/Og Philby/g Philemon/Og Philip/OgS Philippe/g Philippians/ONg Philippine/JSg Philippines/Og Philips/Og Philistine/NgJ Phillip/OgS Phillipa/Og Phillips/ONg Philly/Og Phipps/Og Phobos/Og Phoebe/Og Phoenicia/Og Phoenician/JONSg Phoenix/Og Photostat/Sg Photostatted Photostatting Phrygia/Og Phyllis/Og PiB # pebibyte Piaf/Og # Edith - Piaget/Og Pianola/g Picasso/Og # Pablo - Piccadilly/Og Pickering/Og Pickett/Og Pickford/Og Pickwick/Og Pict/Ng # ancient culture Piedmont/Og Pierce/Og Pierre/Og Pierrot/Og Pikachu/OgS Pike/ONg Pilate/OgS # Pontius - Pilates/Ng # exercise Pilcomayo/Og Pilgrim/NOSg Pillsbury/Og Pinatubo/g Pincus/Og Pindar/Og Pinkerton/ONg Pinocchio/ONg Pinochet/Og # General - Pinter/Og Pinterest/ONg # social media Pinyin/ON # romanization Pippin/Og Piraeus/Og Pirandello/g Pirelli/NOSg # surname, tyres Pisa/Og # city Pisces/ONg Pisistratus/Og Pissaro/g Pitcairn/Og Pitt/OgS Pittman/Og Pitts/Og Pittsburgh/Og Pittsfield/Og Pius/g # pope Pizarro/Og Pkwy/N Pl/ # platinum Planck/ONg Plano/O Plantagenet/NOg Plasticine/Ng Plataea/Og Plath/Og Plato/Og Platonic/JNQ Platonism/Ogm Platonist/Ng Platte/Og Plautus/Og PlayStation/NgV # game console Playboy/ONgJ # company Playtex/g Pleiades/Og Pleistocene/JOg # geological period Plexiglas/OgS Pliny/Og Pliocene/JOgS # geological period Plutarch/ONg Pluto/Og Plymouth/ONg Plymouths/9 Pm/ # Promethium Po/ # Polonium Pocahontas/ONg Pocatello/Og Pocono/Sg Poconos/Og Podgorica/Og Podhoretz/g Podunk/Og Poe/Og Pogo/g Poincare/Og Poiret/g Poirot/Og Poisson/Ng Poitier/Og Pokémon/Ng Pol/Yg Poland/Og Polanski/Og Polaris/Og Polaroid/NgS Pole/NOSg Polish/JNg Politburo/Og Polk/Og Pollard/Og Pollock/ONg Pollux/Og Polly/Og Pollyanna/ONg Polo/Og Poltava/Og Polyhymnia/Og Polynesia/Og Polynesian/JNOSg Polyphemus/Og Pomerania/Og Pomeranian/JNOg Pomona/Og Pompadour/g Pompeian/JN Pompeii/Og Pompey/Og Ponce/Og Pondicherry/Og # old name of Puducherry Pontchartrain/g Pontiac/ONSg Pontianak/Og Pontic/JOg Ponzi/OgS Pooh/Og Poole/Og Poona/Og # old name of Pune Pope/ONg Popeye/Og Popocatepetl/Og Popper/Og Poppins/g Popsicle/Ng Porfirio/g Porrima/Og Porsche/ONSg Port/Og> Porter/Og Porterville/Og Portia/Og Portland/Og Porto/ONg Portsmouth/Og Portugal/ONg Portuguese/JNOg Poseidon/Og Post/Og PostgreSQL/g Potemkin/Og Potomac/Og Potsdam/Og Pottawatomie/Og Potter/NOg Potts/Og Pottstown/g Poughkeepsie/Og Pound/Og Poussin/g Powell/Og PowerPC/g PowerPoint/ONgV Powers/NOg Powhatan/NOg Poznan/Og Prada/g Prado/Og Praetorian/Ng Prague/Og Praia/Og Prakrit/Og Pratchett/Og Pratt/Og Pravda/ONg Praxiteles/Og Preakness/g Precambrian/JOg Preminger/g Premyslid/Ng Prensa/g Prentice/Og Pres/JN Presbyterian/JNSg Presbyterianism/NwgS Prescott/Og Presley/Og Preston/Og Pretoria/Og Priam/Og Pribilof/g Price/Og Priceline/g Priestley/Og Prince/NOg Princeton/Og Principe/Og Priscilla/Og Pristina/Og # capital of Kosovo Prius/NgS Private/N Procrustean/Jg Procrustes/Og Procter/Og Procyon/Og Prof/N Prohibition/O Prokofiev/Og Promethean/JNg Prometheus/Og Prophets/O Proserpina/Og Proserpine/Og Protagoras/Og Proterozoic/JOg Protestant/NgSJ Protestantism/NSg Proteus/Og Proudhon/g Proust/Og # Marcel - Provencal/OgS Provence/Og Proverbs/O Providence/OgS Provo/ONg Prozac/OgS # drug Prudence/Og Prudential/g Pruitt/Og Prussia/Og Prussian/JONSg Prut/g Pryor/Og Psalms/Og Psalter/Sg Psyche/Og Pt/ # Platinum Ptah/Og Ptolemaic/Jg Ptolemy/OgS Pu/ # Plutonium Puccini/Og Puck/Og Puckett/Og Puducherry/Og Puebla/Og Pueblo/Og Puerto/O Puget/Og # - Sound Pugh/Og Pulaski/Og Pulitzer/NOg Pullman/NOSg Punch/ONg Pune/Og Punic/JNOg Punjab/Og Punjabi/JONwg Purana/Og Purcell/Og Purdue/Og Purim/OgS Purina/g Puritan/NgJ Puritanism/Nmg Purus/g Pusan/Og # old spelling of Busan Pusey/Og Pushkin/Og Pushtu/Og Putin/Og Putinism/Nmg Putinist/NgS Putnam/Og Puzo/g Pvt Pygmalion/ONg Pygmy/Sg Pyle/Og Pym/Og Pynchon/Og # Thomas - Pyongyang/Og Pyotr/Og Pyrenees/Og Pyrex/ONSg # trademark Pyrrhic/Jg Pythagoras/Og Pythagorean/NgJ Pythias/Ng Python/ONg # programming language Pythonic/J Q/NO Q&A/Ng QA/N QB/NO QC/ON QED/N QLD/Og # Queensland QM/N QWERTY/NJ Qaddafi/Og Qantas/Og # airline Qatar/Og Qatari/NgSJ QiB # quebibyte Qingdao/Og Qinghai/Og Qiqihar/Og Qom/Og Quaalude/ONg # drug Quaker/NgS Quakerism/NSg Qualcomm/g Quaoar/Og Quasimodo/Ng Quaternary/Og Quayle/Og Que/O Quebec/NOg Quebecois/JNOg Quechua/NOg Queen/NOSg Queens/ONg Queensland/Og Quentin/Og Quetzalcoatl/Og Quezon/Og Quincy/ONg Quinn/Og Quintilian/Og Quinton/Og Quirinal/JOg Quisling/Ng Quito/Og Quixote/Ng Quixotism/Ng Qumran/Og Quonset/Ng Quran/O Quranic/J R/NOgJ RAF/Og RAM/NOSg RBI/NO RC/ONVJ RCA/NOg RCMP/O RD/N RDA/ON RDS/Ng REIT/N REM/NSg RF/NO RFC/ONS RFD/JNO RGB # colour model RI/ON # US state (Rhode Island) RIF/NV RIFA/Og RIP/ON RISC/N RN/NOg RNA/Ng RNG/NgS # random number generator ROFL/V ROM/NSg # read-only memory ROTC/Og RP/NOV RPM/NgS RR/NOV RSA/Ng # encryption standard RSFSR/O RSI/N RSS/NOV # Really Simple Syndication RSV/ON RSVP/NOV RSVP'd/VtT RSVPed/VtT RTFM/ RV/ONSgV Ra/ # Radium Rabat/Og Rabelais/Og Rabelaisian/Jg Rabin/Og Rachael/Og Rachel/Og Rachelle/Og Rachmaninoff/Og Racine/Og Radcliff/Og Radcliffe/Og Rae/Og Rafael/Og Raffles/Og Ragnarok/Og Rainier/ONg Raleigh/Og Ralph/Og Rama/Og Ramada/g Ramadan/OgS Ramakrishna/g Ramanujan/Og Ramayana/Og Rambo/ONg Ramirez/Og Ramiro/g Rammstein/Og # band Ramon/g Ramona/Og Ramos/Og Ramsay/Og Ramses/Og Ramsey/Og Ramstein/Og # air base Rand/NOg Randal/Og Randall/Og Randell/Og Randi/g Randolph/Og Randy/Og Rangoon/Og # old name of Yangon Rankin/Og Rankine/Og Raoul/g Raphael/Og Rappaport/Og Rapunzel/Og Raquel/Og Rasalgethi/Og Rasalhague/Og Rasmussen/Og Rasputin/Og Rasta/ON Rastaban/Og Rastafarian/NgSJ Rastafarianism/Ogm Rather/Og Ratliff/Og Raul/Og Ravel/Og Rawalpindi/Og Ray/Og RayBan/g Rayburn/ONg Rayleigh/Og Raymond/Og Raymundo/g Rb/ # Rubidium Rd Re/ # Rhenium Reading/Og Reagan/Og Reaganomics/Ng Reasoner/Og Reba/Og Rebecca/Og Rebekah/Og Recife/Og Reconstruction/Og Redding/Og Redeemer/Og Redford/Og Redgrave/Og Redis/g Redmond/Og Redshift/g Reebok/g Reed/Og Reese/Og Reeves/Og Reformation/OgS Refugio/Og Reggie/Og Regina/Og Reginae/g Reginald/Og Regor/g Regulus/Og Rehnquist/Og Reich/NOg Reichstag's Reid/Og Reilly/Og Reinaldo/g Reinhardt/Og Reinhold/g Remarque/g Rembrandt/ONg Remington/ONg Remus/Og Rena/Og Renaissance/ONSgJ Renascence/O Renault/Og Rene/Og Renee/Og Reno/Og Renoir/NOg Rep/N Representative Republican/JNSg Republicanism/Nmg Requiem/Sg Resistance Restoration/Og Resurrection/Og Reuben/ONg Reunion/Og Reuters/Og Reuther/Og Rev/O Reva/g Revelation/OgS Revelations/Og Revere/Og Reverend/Ng Revlon/Og Rex/Og Reyes/Og Reykjavík/Og Reykjavik/Og Reyna/g Reynaldo/g Reynolds/Og Rf/ # Rutherfordium Rhea/Og Rhee/Og Rheingau/g Rhenish/JNg Rhiannon/Og Rhine/Og Rhineland/Og Rhoda/Og Rhode/OS Rhodes/Og Rhodesia/Og Rhodesian/JN Rhonda/Og Rhone/Og RiB # robibyte Ribbentrop/g Ricardo/Og Rice/Og Rich/Og Richard/OgS Richards/Og Richardson/Og Richelieu/Og Richie/Og Richmond/Og Richter/ONg Richthofen/g Rick/Og Rickenbacker/Og Rickey/ONg Rickie/Og Rickover/Og Ricky/Og Rico/Og Riddle/Og Ride/g Riefenstahl/g Riel/Og Riemann/Jg Riesling/NgS Riga/Og Rigel/Og Riggs/Og Right/O Rigoberto/g Rigoletto/g Riley/Og Rilke/Og Rimbaud/Og Ringling/Og Ringo/Og Rio/OgS Rios/Og Ripley/Og Risorgimento/Og Rita/Og Ritalin/Og Ritz/Og Rivas/Og Rivera/Og Rivers/Og Riverside/Og Riviera/OgS Riyadh/Og Rizal/Og Rn/ # Radon Roach/Og Roanoke/Og Rob/Og Robbie/Og Robbin/OgS Robbins/Og Robby/Og Roberson/Og Robert/OgS Roberta/Og Roberto/g Roberts/Og Robertson/Og Robeson/Og Robespierre/Og Robin/ONg Robinson/Og Robitussin/Og Robles/Og Robson/Og Robt/g Robyn/Og Rocco/Og Rocha/Og Rochambeau/g Roche/Og Rochelle/Og Rochester/Og Rock/Og Rockefeller/OgS Rockford/Og Rockhampton/Og Rockies/ONg Rockne/g Rockwell/Og Rocky/OgS Rod/Og Roddenberry/Og Roderick/Og Rodger/OgS Rodgers/Og Rodin/g Rodney/Og Rodolfo/g Rodrick/Og Rodrigo/g Rodriguez/Og Rodriquez/Og Roeg/g Roentgen/O Rogan/NgS Rogelio/g Roger/NOSg Rogers/Og Roget/OgV Rojas/Og Roku/g Rolaids/g Roland/Og Rolando/g Rolex/Ng Rolland/Og Rollerblade/g Rollins/Og Rolodex/NgV Rolvaag/g Roman/JNOSg Romanesque/JSg Romania/Og Romanian/JNgS Romano/g Romanov/Og Romans/ONg Romansh/Og Romanticism/O Romany/NOSgJ Rome/OgS Romeo/NOg Romero/Og Rommel/Og Romney/ONg Romulus/Og Ron/Og Ronald/Og Ronda/Og Ronnie/Og Ronny/Og Ronstadt/Og Rontgen Rooney/Og Roosevelt/Og Root/Og Roquefort/NSg Rorschach/Ng Rory/Og Rosa/Og Rosales/Og Rosalie/Og Rosalind/Og Rosalinda/g Rosalyn/Og Rosanna/Og Rosanne/Og Rosario/Og Roscoe/Og Rose/ONg Roseann/g Roseau/Og Rosecrans/Og Rosella/g Rosemarie/Og Rosemary/Og Rosenberg/Og Rosendo/Og Rosenthal/OgS Rosenzweig/Og Rosetta/Og Rosicrucian/NgJ Rosie/ONg Roslyn/Og Ross/Og Rossetti/g Rossini/g Rostand/g Rostov/Og Rostropovich/g Roswell/Og Rotarian/Ng Roth/Og Rothko/g Rothschild/ONg Rotterdam/Og Rottweiler/Ng Rouault/g Rourke/Og Rousseau/Og Rove/>g Rover/NOg Rowe/Og Rowena/Og Rowland/Og Rowling/Og Roxanne/Og Roxie/Og Roxy/ONg Roy/Og Royal/ONgJ Royce/Og Rozelle/Og Rte Ru/ # Ruthenium Rubaiyat/g Rubbermaid/g Ruben/OgS Rubenesque/J Rubens/Og Rubicon/ONSg Rubik/Og Rubin/Og Rubinstein/Og Rubio/OgS Ruby/ONg Ruchbah/Og Rudolf/Og Rudolph/Og Rudy/ONg Rudyard/Og Rufus/Og Ruhr/Og Ruiz/Og Rukeyser/g Rumpelstiltskin/Og Rumsfeld/Og Runnymede/Og Runyon/Og Rupert/ONg Rush/Og Rushdie/Og Rushmore/Og Ruskin/Og Russ/ONgJ Russel/Og Russell/Og Russia/ONg Russian/JNSgV Russification/Ng Russo/Og Rustbelt/Og Rusty/Og Rutan/Og Rutgers/Og Ruth/Og Rutherford/Og Ruthie/Og Rutledge/Og Rwanda/OgS Rwandan/NOSgJ Rwy Rx/N Ry Ryan/Og Rydberg/Og Ryder/Og Ryukyu/Og SA/JNOV SAC/NO SALT/Og SAM/ONg SAP/ONg SAR/N # special administrative region SARS/NOg # disease SASE/N SAT/NgS SATA/Ng # computing standard SBA/NO SC/JNOg # US state (South Carolina) SCSI/Og # computing standard SCOTUS/Og # Supreme Court Of The United States SD/ON # US state (San Diego) SDI/NO # strategic defense initiative SE/NOgJ SEATO/O SEC/ONg # security and exchange commisson SEO/Ng # search engine optimization SF/NOJ # san francisco SGI/Og # computer company SGML/Og # mark-up language SIDS/NOg # syndrome SIM # ~ card SJ/ON SJW/N SK/VNO SLR/N # single-lens reflex; self-loading rifle SNES/NgS # game console SO/NgSI # N=significan other; I=someone SOB/Ng SOP/ONg # sum-of-parts SOS/Ng SOSes/N SPCA/O SPF/NOJ SQL/N # database query language SQLite/g SRAM/Ng SRO/N SS/NOJ SSA/ONJ SSD/NSg # solid-state drive SSE/NOgJ SSS/ON SST/NO SSW/NgJ ST/NOV STD/JNgS # sexually transmitted disease; cf. STI, VD STI/Ng # sexually transmitted infection; cf. STD, VD STOL/N SUSE/g SUV/NgS # vehicle type SVN/Og # version control SW/ONgJV SWAK/ SWAT/N SaaS/Ng # software as a service Saab/ONg # car brand Saar/Og Saarinen/g Saatchi/Og Sabbath/Ng Sabbaths/N Sabik/Og Sabin/Og Sabina/Og Sabine/NOg Sabre/g Sabrina/Og Sacajawea/Og Sacco/g Sachs/Og Sacramento/Og Sadat/Og Saddam/Og Sadducee/Ng Sade/g Sadie/Og Sadr/Og Safavid/JNg Safeway/g Sagan/ONg Saginaw/Og Sagittarius/ONSg Sahara/Og Saharan/JNg Sahel/Og Saigon/Og Saiph/Og Sakai/NOg Sakha/NOg Sakhalin/Og Sakharov/Og Saki/Og Saks/g Sal/OgY Saladin/Og Salado/Ng Salamis/Og Salas/Og Salazar/Og Salem/Og Salerno/Og Salesforce/g Salinas/Og Salinger/Og Salisbury/Og Salish/NOgJ Salk/Og Sallie/Og Sallust/g Sally/ONg Salome/Og Salonika/Og Salton/g Salvador/Og Salvadoran/NSgJ Salvadorean/JNgS Salvadorian/NgSJ Salvatore/Og Salween/Og Salyut/Ng Sam/Og Samaritan/NOSgJ Samarkand/Og Sammie/NOg Sammy/NOg Samoa/ONg Samoan/NSgJ Samoset/g Samoyed/Ng Sampson/Og Samson/Og Samsonite/Og Samsung/ONg Samuel/Og Samuelson/Og San/NOg San'a Sana/Og Sanchez/Og Sancho/Og Sand/Zg Sandburg/g Sanders/Og Sandinista/Ng Sandoval/Og Sandra/Og Sandringham/Og Sandy/ONg Sanford/Og Sanforized/g Sang/Og> Sanger/Og Sanhedrin/Ng Sanka/Ng Sankara/Og Sanskrit/NgJ Santa/ONg Santana/Og Santayana/g Santeria/g Santiago/Og Santos/Og Sappho/Og Sapporo/Og Sara/Og Saracen/NgS Saragossa/Og Sarah/Og Sarajevo/Og Saran/Og Sarasota/Og Saratov/Og Sarawak/Og Sardinia/Og Sargasso/ONg Sargent/Og Sargon/Og Sarnoff/g Saroyan/Og Sarto/g Sartre/g Sasha/Og Sask/O Saskatchewan/Og Saskatoon/Og Sasquatch/NgS Sassanian/JNg Sassoon/Og Sat/Ng Satan/ONg Satanism/Nmg Satanist/Ng Saturday/NgSV Saturn/ONg Saturnalia/Og Saudi/NOSgJ Saul/Og Saunders/Og Saundra/g Saussure/Og Sauternes/ON Savage/Og Savannah/ONg Savior/Og Savonarola/g Savoy/ONg Savoyard/NOg Sawyer/Og Saxon/NOSgJ Saxony/ONg Sayers/Og Sb/ # Antimony Sc/ # Scandium Scala/Og Scan Scandinavia/Og Scandinavian/NgSJ Scania/ONSg Scaramouch/ONg Scarborough/Og Scarlatti/g Scheat/Og Schedar/Og Scheherazade/Og Schelling/Og Schenectady/Og Schengen/Og Schiaparelli/Og Schick/Og Schiller/Og Schindler/Og Schlesinger/Og Schliemann/g Schlitz/ONg Schloss/Og Schmidt/ONg Schnabel/NOg Schnauzer/g Schneider/Og Schoenberg/Og Schopenhauer/Og Schrieffer/g Schrödinger/Og Schroeder/Og Schubert/Og Schultz/Og Schulz/Og Schumann/Og Schumpeter/Og Schuyler/Og Schuylkill/Og Schwartz/Og Schwarzenegger/ONg Schwarzkopf/Og Schweitzer/Og Schweppes/Og Schwinger/g Schwinn/Og Scientologist/NSg Scientology/Og Scipio/Og Scopes/g Scorpio/ONSg Scorpius/Og Scorsese/g Scot/NOSg Scotch/ONSgJ Scotchman/NOg Scotchmen/9g Scotchwoman/Ng Scotchwomen/9g Scotia/Og Scotland/Og Scotsman/Ng Scotsmen/9g Scotswoman/Ng Scotswomen/9g Scott/ONg Scottie/ONSg Scottish/JNg Scottsdale/Og Scotty/Og Scrabble/OgS Scranton/Og Scriabin/g Scribner/Og Scripture/NSg Scrooge/Og Scruggs/Og Scud/Og Sculley/Og Scylla/Og Scythia/Og Scythian/JNOg Se/ # Selenium Seaborg/Og Seagate/Og # hard drive company Seagram/Og Sean/Og Sears/Og Seaside/Og Seattle/Og Sebastian/Og Sebring/Og Sec Seconal/Ng Secretariat/g Secretary/O Seder/OgS Sedna/Og Seebeck/Og Seeger/Og Sega/ONg Segovia/Og Segre/g Segundo/Og Segway/NSV Seiko/Og Seine/Og Seinfeld/g Sejong/Og Selassie/g Selectric/g Selena/Og Seleucid/JNg Seleucus/Og Selim/Og Seljuk/ONgJ Selkirk/Og Sellers/Og Selma/ONg Selznick/g Semarang/Og Semele/Og Seminole/NOSg Semiramis/Og Semite/NgS Semitic/JOgS Semtex/g Senate/OgS Sendai/Og Seneca/ONSg Senegal/Og Senegalese/JNg Senghor/g Senior/Og Sennacherib/Og Sennett/Og Sensurround/Og Seoul/Og Sep/O Sephardi/Ng Sepoy/g Sept/Og September/OgS Septuagint/OgS Sequoya/g Serb/NSgJ Serbia/Og Serbian/JNgS Serena/Og Serengeti/Og Sergei/Og Sergey/Og Sergio/g Serpens/Og Serra/Og Serrano/Og Set/Og Seth/Og Seton/Og Seurat/g Seuss/Og Sevastopol/Og Severn/Og Severus/Og Seville/Og Sevres/g Seward/Og Sextans/Og Sexton/Og Seychelles/O9g Seyfert/Og Seymour/Og Sgt/N Shaanxi/Og Shabbat/Og Shackleton/Og Shaffer/Og Shah/Og Shaka/g Shaker/NOJ Shakespeare/ONgV Shakespearean/JNg Shana/Og Shandong/Og Shane/Og Shang/OgS Shanghai/ONg Shankara/g Shanna/Og Shannon/Og Shantung/Og Shanxi/Og Shapiro/Og SharePoint/g Shari/Og Shari'a/Ng Sharif/Og Sharlene/Og Sharon/ONg Sharp/Og Sharpe/Og Sharron/Og Shasta/ONg Shaula/Og Shaun/Og Shauna/Og Shavian/JNg Shavuot/Og Shaw/Og Shawn/Og Shawna/Og Shawnee/NOSgJ Shcharansky/g Shea/Og Sheba/ONg Shebeli/g Sheboygan/Og Sheena/Og Sheetrock/NgV Sheffield/Og Sheila/Og Shelby/Og Sheldon/Og Shelia/g Shell/Og Shelley/Og Shelly/Og Shelton/Og Shenandoah/Og Shenyang/Og Shenzhen/Og Sheol/Og Shepard/Og Shepherd/Og Sheppard/Og Sheratan/Og Sheraton/Og Sheree/Og Sheri/Og Sheridan/Og Sherlock/OgV Sherman/ONg Sherpa/NOSg # ethnicity, language, surname Sherri/Og Sherrie/g Sherry/Og Sherwood/Og Sheryl/Og Shetland/ONSg Shetlands/ONg Shevardnadze/Og Shevat/Og Shi'ite/JNg Shields/Og Shiite/JNgS Shijiazhuang/Og Shikoku/ONg Shillong/Og Shiloh/Og Shinto/OgSJ Shintoism/OgS Shintoist/NgSJ Shiraz/ONg Shirley/Og Shiva/Og Shockley/Og Short/Og Shorthorn/g Shoshone/ONSg Shostakovitch/g Shrek/Ng Shreveport/Og Shriner/Ng Shropshire/ONg Shula/Og Shylock/ONg Shylockian/g Si/ # Silicon Siam/Og # old name of Thailand Siamese/JONg Sibelius/g Siberia/ONg Siberian/JNgS Sibyl/Og Sichuan/Og Sicilian/JONSg Sicily/Og Sid/Og Siddhartha/Og Sidney/Og Siegfried/Og Siemens/Og Sierpinski/Og Sierras Sigismund/g Sigmund/Og Sigurd/Og Sihanouk/g Sikh/NgJ Sikhism/O Sikhs/N Sikkim/Og Sikkimese/JONg Sikorsky/g Silas/Og Silesia/Og Silurian/JNOSg Silva/Og Silverstone/Og Silvia/Og Simenon/g Simmental/ONg Simmons/Og Simon/ONg Simone/Og Simpson/OgS Simpsons/Og Simpsonville/Og Sims/ONg Sinai/Og Sinatra/Og Sinbad/Og Sinclair/Og Sindbad/Og Sindhi/JNOg Singapore/Og Singaporean/JNSg Singer/ONg Singh/Og Singleton/Og Sinhalese/JNg Sinkiang/Og Sioux/Og90 # singular and plural Sir/NOSg Sirius/Og Sistine/Jg Sisyphean/Jg Sisyphus/Og Siva/Og Sivan/Og Sjaelland/g Skinner/Og Skippy/Og Skopje/Og Skye/ONg Skylab/Og Skype/OgV Slackware/g Slashdot/g Slater/Og Slav/NSgJ Slavic/JNg Slavoj/Og # given name; - Zizek Slavonic/OgJ Slidell/Og Slinky/Ng Sloan/Og Sloane/ONg Slocum/Og Slovak/JNSg Slovakia/Og Slovakian/JN Slovene/JNOSg Slovenia/Og Slovenian/JNgS Slurpee/Ng Sm/ # Samarium Small/Og Smetana/Og Smirnoff/ONg Smith/Og Smithson/Og Smithsonian/JOg Smokey/ONg Smolensk/Og Smollett/Og Smuts/g Smyrna/O Sn/ # Tin Snake/Og Snapple/g Snead/Og Snell/Og Snickers/Ng Snider/ONg Snoopy/Og Snow/Og Snowbelt/g Snyder/Og Soave/Og Soc/N Socastee/g Socorro/Og Socrates/Og Socratic/JNg Soddy/Og Sodom/ONg Sofia/Og Soho/Og Sol/ONg Solis/Og Solomon/ONg Solon/Og Solzhenitsyn/g Somali/NSgJ Somalia/Og Somalian/JNgS Somme/Og Somoza/Og Son/Og Sondheim/Og Sondra/Og Songhai/ONg Songhua/Og Sonia/Og Sonja/Og Sonny/Og Sonora/Og Sontag/Og Sony/ONg Sonya/Og Sophia/ONg Sophie/ONg Sophoclean/Jg Sophocles/Og Sopwith/Og Sorbonne/Og Sosa/Og Soto/Og Souphanouvong/g Sourceforge/g Sousa/Og South/Og Southampton/Og Southeast/Sg Southerner/NSg Southey/Og Souths/O Southwest/OgS Soviet/NgJ Soweto/Og Soyinka/Og Soyuz/Ng Sp/N Spaatz/g Spackle/Og Spahn/Og Spain/Og Spam/Og Span/O Spanglish/O Spaniard/NSg Spanish/JONmg Sparks/Og Sparta/Og Spartacus/Og Spartan/NgSJ Spartanburg/Og Spears/Og Spectrum/NgS Speer/Og Spence/Og> Spencer/Og Spencerian/Jg Spengler/Og Spenglerian/Jg Spenser/Og Spenserian/JNg Sperry/Og Spetsnaz/9 # plural only Sphinx/Og Spica/Og Spider-Man/Og Spielberg/Og Spillane/Og Spinoza/Og Spinx/g Spiro/Og Spirograph/Ng Spitsbergen/Og Spitz/g Spock/ONgV Spokane/NOg Springdale/Og Springfield/Og Springsteen/Og Sprint/g Sprite/Og Sputnik/NOg Sq Squanto/g Squibb/Og Sr/ # Strontium Srinagar/Og Srivijaya/g St/N Sta/NO Stacey/Og Staci/Og Stacie/Og Stack Exchange/Og Stack Overflow/Og Stacy/ONg Stael/g Stafford/ONg StairMaster/g Stalin/Og Stalingrad/Og # old name of Volgograd Stalinism/Nmg Stalinist/JNg Stallone/Og Stamford/Og Stan/ONg Standish/Og Stanford/Og Stanislav/Og Stanislavsky/g Stanley/Og Stanton/Og Staples/Og Starbucks/ONg Stark/ONg Starkey/Og Starmer/Og Starr/Og Staten/Og States/ON Staubach/Og Staunton/Og Ste/N Steadicam/Ng Steele/Og Stefan/Og Stefanie/Og Stein/Og> Steinbeck/Og Steinem/g Steiner/Og Steinmetz/Og Steinway/Ng Stella/ONg Stendhal/g Stengel/Og Stephan/Og Stephanie/Og Stephen/OgS Stephens/Og Stephenson/Og Sterling/Og Stern/Og Sterne/Og Sterno/Ng Stetson/ONg Steuben/Og Steubenville/Og Steve/ONg Steven/OgS Stevens/Og Stevenson/Og Stevie/Og Stewart/Og Stieglitz/Og Stilton/ONSmg Stimson/Og Stine/g Stirling/Og Stockhausen/Og Stockholm/OgV Stockton/Og Stoic/JNSg Stoicism/Sg Stokes/Og Stolichnaya/Ng Stolypin/g Stone/Og Stonehenge/Og Stoppard/Og Stout/Og Stowe/Og Strabo/Og Stradivari Stradivarius/Ng Strasbourg/Og Strauss/Og Stravinsky/Og Streisand/g Strickland/Og Strindberg/g Stromboli/Og Strong/Og Stu/Og Stuart/OgS Studebaker/Og Stuttgart/ONg Stuyvesant/g Stygian/JNg Styron/Og Styx/Og Suarez/Og Subaru/OgS Subsahara/Og Sucre/Og Sucrets/g Sudan/Og Sudanese/JNg Sudbury/Og Sudetenland/Og Sudoku/g Sudra/Ng Sue/ONg Suetonius/g Suez/Og Suffolk/Og Sufi/Ng Sufism/Ng Suharto/g Sui/ONgJ Sukarno/g Sukkot/O Sulawesi/Og Suleiman/Og Sulla/g Sullivan/Og Sumatra/ONg Sumatran/JNSg Sumeria/Og Sumerian/JNOSg Summer/OgS Summers/Og Sumner/Og Sumter/Og Sun/ONSg Sunbeam/Og Sunbelt/Ng Sundanese/NOgJ Sundas/Og Sunday/NgSV Sung/Og Sunkist/g Sunni/JNOSg Sunnite/JNgS Sunnyvale/Og Superbowl/Og Superfund/Ng Superglue/g Superior/Og Superman/ONg Supra/NgS # car model Supt Surabaya/Og Surat/ONg Suriname/Og Surinamese/NJ Surya/Og Susan/ONgJ Susana/g Susanna/Og Susanne/Og Susie/Og Susquehanna/Og Sussex/ONg Sutherland/Og Sutton/Og Suva/Og Suwanee/g Suzanne/Og Suzette/g Suzhou/Og Suzuki/OgS Suzy/Og Svalbard/Og Sven/g Svengali/Ng Sverdlovsk/O Swahili/ONSg Swammerdam/g Swanee/g Swansea/Og Swanson/Og Swazi/NOSgJ Swaziland/Og Swed/On Swede/NSg Sweden/Og Swedenborg/Og Swedish/OgJm Sweeney/Og Sweet/Og Swift/Og Swinburne/Og Swiss/JNOSg Swissair/g Switz/O Switzerland/ONg Sybil/NOg Sydney/Og Sykes/Og Sylvester/Og Sylvia/Og Sylvie/Og Synge/Og Syracuse/ONg Syria/Og Syriac/ONgJ Syrian/JNgS Szilard/Og Szymborska/g T/JNOgdG T'ang/Og TA/ONVJ TARP/O TB/ONg TBA/N TD/N TDD/N TEFL/N TELNET/S TELNETTed TELNETTing TESL/N TESOL/N TGIF/N THC/N TKO/ONg TLC/NOg TLS/NO TM/N TN/ON # US state (Tennessee) TNT/NOg TOC/NgS # table of contents TOEFL/N TQM/N TTL TV/NSg TVA/O TVR/NOSg # car company TWA/ONg TWX/O TX/ONV # US state (Texas) Ta/ # Tantalum Tabasco/ONSg Tabatha/Og Tabernacle/Sg Tabitha/Og Tabriz/OgS Tacitus/Og Tacoma/Og Tad/Og Tadzhik/JNOg Taegu/Og Taejon/g Taft/Og Tagalog/ONSgJ Tagore/Og Tagus/Og Tahiti/Og Tahitian/NOSgJ Tahoe/Og Taichung/Og Tailwind CSS/ONg # framework Tainan/O Taine/g Taipei/Og Taiping/ONg Taiwan/Og Taiwanese/JNOg Taiyuan/Og Tajikistan/Og Taklamakan/Og Talbot/Og Taliban/ONg Taliesin/Og Talladega/Og Tallahassee/Og Tallchief/g Talley/Og Talleyrand/g Tallinn/Og Talmud/OgS Talmudic/J Talmudist/N Tamagotchi/OgS Tamara/Og Tameka/Og Tamera/Og Tamerlane/Og Tami/Og Tamika/Og Tamil/JNgS Tammany/Og Tammi/Og Tammie/Og Tammuz/Og Tammy/Og Tampa/Og Tampax/g Tamra/Og Tamworth/ONg Tancred/Og Taney/Og Tanganyika/Og Tangier/OgS Tangshan/Og Tania/Og Tanisha/Og Tanner/Og Tannhauser/g Tantalus/Og Tanya/Og Tanzania/Og Tanzanian/NSgJ Tao/ONg Taoism/OgS Taoist/JNgS Tara/Og Tarantino/NOg Tarawa/Og Tarazed/Og Tarbell/Og Target/g Tarim/Og Tarkenton/g Tarkington/Og Tartary/Og Tartuffe/g Tarzan/ONg Tasha/Og Tashkent/Og Tasman/Og Tasmania/Og Tasmanian/JNg Tass/Og Tatar/ONSgJ Tate/OgS Tatum/Og Taurus/ONSg Tavares/Og Tawney/Og Taylor/Og Tb/ # Terbium Tbilisi/Og Tc/ # Technetium Tchaikovsky/Og Teasdale/Og Technicolor/NgJ Tecumseh/Og Ted/ONg Teddy/Og Teflon/ONSgJ Tegucigalpa/Og Tehran/O TelePrompter/g Telemachus/Og Telemann/g Teletype Tell/Og> Teller/Og Telugu/ONg Temecula/Og Tempe/O Templar/NgS Temple/Og Tenn/g Tennessean/JNSg Tennessee/ONg Tennyson/Og Tennysonian/J Tenochtitlan/Og TensorFlow/g # free software Teotihuacan/Og # archaeological site Terence/Og Teresa/Og Tereshkova/g Teri/Og Terkel/Og Terpsichore/Og Terr/g Terra/Og Terran/JNOg Terrance/Og Terrell/Og Terrence/Og Terri/Og Terrie/Og Terry/Og Tertiary/JOg Tesla/ONSg # surname, car company Tess/Og Tessa/Og Tessie/Og Testarossa/ONSg # car model Tet/ONg Tethys/Og Tetons/NOg Tetris/Og Teuton/NgSJ Teutonic/JNg Tevet/Og Tex/Og # Man's name - must come before TeX! Texaco/g # company Texan/JNgS Texarkana/Og Texas/Og Th/ # Thorium Thackeray/Og Thad/Og Thaddeus/Og Thai/JNwSg Thailand/Og Thales/Og Thalia/Og Thames/Og Thanh/g Thanksgiving/OgS Thant/g Thar/Og Tharp/Og Thatcher/Og Thatcherism/Ng Thea/Og Thebes/Og Theia/Og Theiler/Og Thelma/Og Themistocles/g Theocritus/g Theodora/Og Theodore/ONg Theodoric/Og Theodosius/Og Theosophy/Nmg Theravada/ONg Theresa/Og Therese/g Thermopylae/Og Thermos/O # trademark Theron/Og Theseus/Og Thespian/NgJ Thespis/g Thessalonian/JNSg Thessaloniki/Og # city Thessaly/Og Thiel/Og Thieu/g Thimbu/ONg # capital of bhutan Thimphu/O # capital of bhutan Thiruvananthapuram/Og Thomas/NOg Thomism/Ng Thomistic/Jg Thompson/ONg Thomson/Og Thor/Og Thorazine/Ng # medicine Thoreau/Og Thornton/Og Thoroughbred/Ng Thorpe/Og Thoth/Og Thrace/Og Thracian/JNOg Thu/NO Thucydides/Og Thule/Og Thunderbird/NOSg # car model Thur/NS Thurber/Og Thurman/Og Thurmond/Og Thursday/NSg Thutmose/Og Ti/ # Titanium TiB # tebibyte Tia/Og Tianjin/Og Tiber/Og Tiberius/Og Tibet/Og Tibetan/JNgS Ticketmaster/g # company Ticonderoga/Og Tide/g Tienanmen/Og Tiffany/ONg Tiflis/Og # old name of Tbilisi Tigris/Og Tijuana/Og # city Tillich/g Tillman/Og Tilsit/Ng Tim/ONg Timbuktu/Og # city Timex/g # company Timmy/Og Timon/Og Timor/Og Timothy/Og Timur/Og Timurid/NgJ Tina/ONg Ting/Og Tinkerbell/Ng Tinkertoy/g Tinseltown/ONg Tintoretto/g Tippecanoe/Og Tipperary/Og Tirane Tiresias/Og Tirol/Og Tirolean/JN Tisha/Og Tishri/Og Titan/NOSg Titania/Og Titanic/JONg Titian/Og # painter Titicaca/Og # lake Tito/Og # president Titograd/Og # old name of Podgorica Titus/Og Titusville/Og Tl/ # Thallium Tlaloc/Og Tlingit/NOgJ Tm/ # Thulium Tobago/Og Tobit/ONg Toby/ONg Tocantins/Og Tocqueville/Og Tod/Og Todd/Og Togo/Og Togolese/JNg Tojo/ONg # general Tokay/g Tokugawa/Og # period Tokyo/Og Tokyoite/JN Toledo/OgS Tolkien/Og # author Tolstoy/Og # author Toltec/Ng # ancient civilization Tolyatti/Og Tom/ONg Tomas/g Tombaugh/g Tomlin/Og Tommie/ONg Tommy/ONg Tompkins/Og Tomsk/Og # city Tonga/Og Tongan/NgSJ Toni/Og Tonia/Og Tonto/ONg Tony/ONg Tonya/Og Topeka/Og Topsy/Ng Torah/ONg Torahs/N Toronto/Og Torquemada/g Torrance/Og Torrens/Og Torres/Og Torricelli/Og Tórshavn/Og # capital of the Faroe Islands Tortola/Og Tortuga/Og Torvalds/Og # linus - Tory/NOSgJ # party Tosca/Ng Toscanini/g Toshiba/Ng # company Toto/NOg Toulouse/Og Townes/Og Townsend/Og Townsville/Og # city Toynbee/g Toyoda/Og Toyota/ONSg # car company Tracey/Og Traci/Og Tracie/Og Tracy/Og Trafalgar/Og Trailways/g Trajan/Og # emperor Tran/Og # surname Transcaucasia/Og # region Transvaal/Og Transylvania/Og # region Transylvanian/JNg Trappist/NSgJ Travis/Og Travolta/Og # john - Treasury/ONSg Treblinka/Og Trekkie/Ng Trent/Og Trenton/Og Trev/Og # short for Trevor Trevelyan/Og Trevino/Og Trevor/Og Trey/Og Triangulum/Og Triassic/JOg # geologic period Tricia/Og Trident/Og Trieste/Og Trimurti/Og Trina/Og Trinidad/Og Trinidadian/NgSJ Trinity/OgS Tripitaka/Ng Tripoli/Og Trippe/Og Trisha/Og Tristan/Og Triton/Og Trivandrum/Og # old name of Thiruvananthapuram Trobriand/Jg Troilus/Og Trojan/NgSJ Trollope/Og Trondheim/Og Tropicana/g Trotsky/Og # leon - Troy/Og Troyes/O Truckee/Og Trudeau/Og Trudy/Og Truffaut/g Trujillo/Og Truman/Og Trumbull/Og Trump/OgS Trumper/NgS Trumpian/JNgS Trumpism/Og Trumpist/NSgJ Trumpy/NSJ>^p Truth/g Tsimshian/NOg Tsiolkovsky/Og Tsitsihar/Og Tsongkhapa/g Tswana/NOg Tu/NOg # former symbol for thulium, now Tm Tuamotu/Jg Tuareg/NOg Tubman/Og Tucker/Og Tucson/Og Tucuman/g Tudor/NSgJ # period Tue/NOS Tues/Ng Tuesday/NgS Tulane/g Tull/Og Tulsa/Og Tulsidas/g Tums/g Tungus/NOg Tunguska/g Tunis/Og Tunisia/Og Tunisian/NgSJ Tunney/Og Tupi/NOg Tupperware/Nwg # company Tupungato/Og Turanism/Nmg Turgenev/g Turin/Og # city Turing/Og Turk/NOSgJ Turkestan/Og Turkey/ONgJ Turkic/JOgS Turkish/OgJ Türkiye/Og # english name of Turkey since 2021 Turkmenistan/Og Turlock/Og Turnbull/Og Turner/ONg Turpin/Og Tuscaloosa/Og Tuscan/JNg Tuscany/Og Tuscarora/NOSg Tuscon/g Tuskegee/ONg Tussaud/g # madame - Tut/Og Tutankhamen/Og Tutsi/Ng # ethnicity Tutu/Og Tuvalu/Og Tuvaluan/NOJ Twain/Og # mark - Tweed/Og Tweedledee/g Tweedledum/g Twila/Og Twinkies/Ng Twitter/ONgV # company, now x Twizzlers/Ng Twp Ty/Og Tycho/Og # -brae Tylenol/ONg # medicine Tyler/Og Tyndale/Og Tyndall/Og TypeScript/NgSV # programming language Tyre/Og Tyree/Og Tyrolean/JN Tyrone/ONg Tyson/Og U/ # Uranium; removed `1`noun `5`adj. `2`proper noun `+`prep., was interfering with linter heuristics. I only know this as an abbreviation for university U-turn/NgSVdG U.K./Og U.S./Og # United States UAE/Og # United Arab Emirates UAR/O UART/NgS # electronics UAW/O UBS/Og UCLA/Og # university UFC/Og # combat sport promotion UFO/NSg UHF/NOgJ # frequency band UI/NSg UK/Og UL/NOVJ UN/Og UNESCO/Og # organization UNICEF/Og # organization UNIX/Og UPC/N UPI/ONg UPS/NOgV URL/NSg US/Og USA/Og USAF/Og USAID/Og # agency USB/ONSg USCG/O USCIS/O # immigration agency USD/Nmg # currency symbol for US dollars USDA/Og USIA/O USMC/O USN/ON USO/NO USP/ONJ USPS/O USS/NO USSR/Og UT/ONg # US state (Utah) UTC/O UTF-16/Ng UTF-32/Ng UTF-8/Ng UV/JNg Ubangi/Og Uber/Og Ubuntu/g Ucayali/Og Uccello/g Udall/Og Ufa/Og Uganda/Og Ugandan/NgSJ Uighur/ONgJ Ujungpandang/g Ukraine/Og Ukrainian/JNOSg Ulaanbaatar/Og Ulster/ONg Ultrasuede/Ng Uluru/Og Ulyanovsk/Og Ulysses/Og Umbriel/Og Underwood/NOg Ungava/Og Unicode/ONmg Unilever/g Union/NOSg Unionist Uniontown/Og Uniroyal/g Unitarian/NgSJ Unitarianism/NOwSg Unitas/g Unix/ONS Unukalhai/g Upanishads/Ng Updike/Og Upjohn/Og Upton/Og Ur/Og Ural/OgS Urals/Og Urania/Og Uranus/Og Urban/Og Urdu/OgJ Urey/Og Uriah/Og Uriel/Og Uris/g Urquhart/Og Ursa/Og Ursula/Og Ursuline/Ng Uruguay/Og Uruguayan/NgSJ Urumqi/Og Usenet/OgS Ustinov/Og Ut Utah/Og Utahan/NgSJ Ute/ONSg Utica/Og Utopia/NSg Utopian/NOSg Utrecht/Og Utrillo/g Uzbek/NOgJ Uzbekistan/Og Uzi/NSg V/ # Canadium V10/NgS V12/NgS V6/NgS V8/NOSg VA/ONJ # US state (Virginia) VAT/Ng # tax VAX # old computer VAXes VBA/Og VCR/Ng VD/Ng # venereal disease; cf. STD, STI VDT/N # video display terminal VDU/N # visual display unit VF/NJ VFW/Og VG/JN VGA/ON # computing standard VHF/JNg # frequency band VHS/N # video tape VI/NOg VIN/NgS VIP/NSg VISTA VJ/NOV VLF/Ng VM/NgS # virtual machine VMS/g # operating system VOA/ON # voice of america VP/NO # vice president VRAM/Ng # video memory VT/ONJV # US state (Vermont) VTOL/N # vertical takeoff and landing VW/OgS # car brand; cf. Volkswagen Vacaville/Og Vader/g Vaduz/Og Vail/Og Val/NOg Valarie/Og Valdez/Og Valdosta/Og Valencia/ONSg Valenti/Og Valentin/g Valentine/ONg Valentino/ONg Valenzuela/Og Valeria/Og Valerian/Og Valerie/ONg Valery/Og Valhalla/ONg Valium/NwgS Valkyrie/NSg Vallejo/Og Valletta/Og Valois/Og Valparaiso/Og Valvoline/g Van/ONg Vance/Og Vancouver/Og Vandal/NOSgJ Vanderbilt/Og Vandyke/Ng Vanessa/Og Vang/Og Vanuatu/Og Vanzetti/g Varanasi/Og Varese/Og Vargas/Og Vaseline/NSg Vasquez/Og Vassar/Og Vatican/OgJ Vauban/g Vaughan/Og Vaughn/Og Vauxhall/OgS Vazquez/Og Veblen/Og Veda/OgS Vedanta/Og Vedic/J Vega/ONSg Vegas/ONg Vegemite/Ogm Vela/Og Velasquez/Og Velazquez/Og Velcro/OgSV Velez/Og Velma/Og Velveeta/g Venetian/JNOSg Venezuela/Og Venezuelan/NSgJ Venice/Og Venn/Og Ventolin/g Venus/ONSg Venusian/NOgJ Vera/Og Veracruz/Og Verde/OgJ Verdi/Og Verdun/Og Verizon/g Verlaine/g Vermeer/Og Vermont/Og>Z Vermonter/NgS Vern/Og Verna/Og Verne/Og Vernon/Og Verona/Og Veronese/JNg Veronica/Og Versailles/Og Vesalius/g Vespasian/Og Vespucci/g Vesta/Og Vesuvius/ONg Viacom/Og Viagra/Og Vic/ONg Vicente/g Vichy/ONg Vicki/Og Vickie/Og Vicksburg/Og Vicky/Og Victor/NOg Victoria/ONg Victorian/JNgS Victorianism/Nmg Victorville/Og Victrola/Ng Vidal/Og Vienna/Og Viennese/JNg Vientiane/Og Vietcong/ONg Vietminh/Og Vietnam/ONg Vietnamese/JNOw09g Vijayanagar/Og Vijayawada/Og Viking/NOSg Vila/Og Villa/OgS Villarreal/Og Villas/g Villon/Og Vilma/g Vilnius/Og Vilyui/Og Vince/Og Vincent/Og Vindemiatrix/Og Vineland/g Vinnitsa/Og # old name of Vinnytsia Vinnytsia/Og Vinson/Og Viola/Og Violet/Og Virgie/Og Virgil/Og Virginia/Og Virginian/JNSg Virgo/ONSg Visa/ONg Visalia/Og Visayans/Ng Vishnu/Og Visigoth/Ng Visigoths/N Vistula/Og Vitim/Og Vito/g Vitus/Og Vivaldi/Og Vivekananda/g Vivian/Og Vivienne/Og Vlad/Og Vladimir/Og Vladislav/Og Vladivostok/Og Vlaminck/g Vlasic/g VoIP/O Vogue/Og Volcker/g Voldemort/NgV Volga/ONg Volgograd/Og Volkswagen/ONSg Volodymyr/Og Volstead/Og Volta/Og Voltaire/Og Volvo/ONg Vonda/Og Vonnegut/Og Voronezh/Og Voronoi/Og Vorster/Og Voyager/g Vuitton/Og Vulcan/ONg Vulg Vulgate/OgS W12/NSg WA/ON # US state (Washington) WAC/ON WASP/Ng WATS/Ng WC/N WHO/Og WI/O # US state (Wisconsin) WMD/N WNW/NgJ WP/ON WSW/NgJ WTF/NS WTO/O WV/O # US state (West Virginia) WW/NO WWI/O WWII/O WWW/Og WY/O # US state (Wyoming) WYSIWYG/N Wabash/Og Wac/N Waco/ONg Wade/Og Wagner/Og Wagnerian/JNg Wahhabi/NgJ Waikiki/Og Waite/Og Wakayama/Og Wake/Og Waksman/g Wald/gn Waldemar/Og Walden/Og Waldensian/JNg Waldheim/Og Waldo/Og Waldorf/NOg Wales/Og Walesa/g Walgreen/Sg Walgreens/g Walker/ONg Walkman/ONg Wall/OgS> Wall Streeter/NgS Wallace/Og Wallenstein/g Waller/Og Wallis/Og Walloon/ONgJ Walls/Og Walmart/Vg Walpole/Og Walpurgisnacht/Ng Walsh/Og Walt/ONg>Z Walter/Og Walters/Og Walton/Og Wanamaker/Og Wanda/Og Wang/Og Wankel/g Ward/Og Ware/OgG Warhol/Ng Waring/Og Warner/Og Warren/Og Warsaw/Og Warwick/Og Wasatch/Og Wash/Og Washington/ONg Washingtonian/JNgS Wassermann/Og Waterbury/Og Waterford/Og Watergate/OgV Waterloo/ONSg Waters/Og Watertown/Og Watkins/Og Watson/Og Watsonville/Og Watt/OgS Watteau/Og Watts/Og Watusi/Ng Waugh/Og Wausau/Og Wave Wayback Machine/Og Wayland/Og Wayne/Og Waynesboro/Og Weaver/Og Web/Og> Webb/Og Weber/Og Webern/g Webster/OgS Wed/Ng Weddell/Og Wedgwood/Og Wednesday/NOSg Weeks/Og Wehrmacht/Og Wei/Og Weierstrass/Og Weill/g Weinberg/Og Weinstein/OgS Weirton/Og Weiss/Og Weissmuller/g Weizmann/g Weldon/Og Welland/Og Weller/Og Welles/Og Wellington/ONSg Wells/Og Welsh/JNOg Welshman/Ng Welshmen/9g Welshwoman/N Wenatchee/Og Wendell/Og Wendi/Og Wendy/Og Wesak/Og Wesley/Og Wesleyan/JNOg Wessex/Og Wesson/Og West/OgS Western/J>NOSg Westinghouse/Og Westminster/Og Weston/Og Westphalia/Og Weyden/g Wezen/Og Wharton/Og Wheaties/Og Wheatstone/Og Wheeler/Og Wheeling/Og Whig/NSg Whipple/ONg Whirlpool/g Whistler/Og Whitaker/Og White/ONSwgJ Whitefield/Og Whitehall/Og Whitehead/ONg Whitehorse/Og Whiteley/Og Whitfield/Og Whitley/Og Whitman/Og Whitney/Og Whitsunday/NOSg Whittier/Og Wi-Fi/Ng Wicca/Og Wichita/NOg Wiemar/g Wiesel/Og Wiesenthal/g Wiggins/Og Wigner/Og Wii/Ng Wikileaks/O Wikipedia/ONgV Wiktionary/OgS Wilberforce/Og Wilbert/Og Wilbur/Og Wilburn/Og Wilcox/Og Wilda/g Wilde/Og> Wilder/Og Wiles/Og Wiley/Og Wilford/Og Wilfred/Og Wilfredo/g Wilhelm/Og Wilhelmina/Og Wilkerson/Og Wilkes/Og Wilkins/Og Wilkinson/Og Will/ONg Willa/Og Willamette/Og Willard/Og Willemstad/Og William/NOSg Williams/Og Williamsburg/Og Williamson/Og Williamsport/Og Willie/Og Willis/Og Willy/Og Wilma/Og Wilmer/Og Wilmington/Og Wilson/Og Wilsonian/Jg Wilton/ONg Wimbledon/Og Wimsey/g Winchell/Og Winchester/ONSg Windbreaker/g Windex/NgV Windhoek/Og Windows/Og Windsor/OgS Windward/g Winesap/Ng Winfred/Og Winfrey/Og Winifred/Og Winkle/Og Winnebago/NOg Winnie/Og Winnipeg/Og Winston/Og Winters/Og Winthrop/Og Wis/O Wisc/O Wisconsin/Og Wisconsinite/JNgS Wise/Og Witt/Og Wittgenstein/Og Witwatersrand/Og Wm/g Wobegon/g Wodehouse/Og Wolf/Og Wolfe/Og Wolfenstein/Og Wolff/Og Wolfgang/Og Wollongong/Og Wollstonecraft/g Wolsey/Og Wolverhampton/O Wonder/Ng Wonderbra/Ng Wong/Og Wood/OgS Woodard/Og Woodhull/Og Woodland/Og Woodrow/Og Woods/Og Woodstock/Og Woodward/Og Woolf/Og Woolite/g Woolongong/g Woolworth/g Wooster/Og Wooten/Og Worcester/ONSg Worcestershire/ONg WordPress/ONg Wordsworth/Og Workman/Og Worms/Og Wotan/Og Wovoka/Og Wozniak/Og Wozzeck/g Wrangell/Og Wren/ONg Wright/Og Wrigley/Og Wroclaw/Og Wu/Og Wuhan/Og Wurlitzer/ONg Wyatt/Og Wycherley/Og Wycliffe/Og Wyeth/Og Wylie/Og Wynn/Og Wyo Wyoming/Og Wyomingite/JNSg X/ONgJ X-ray/NgSVdG XEmacs/g XL/NgJ XML/O XMPP/ONV # chat protocol XS/NJ XXL/NJ Xamarin/g Xanadu/ONg Xanthippe/Ng Xavier/Og Xe/ # Xenon Xenakis/Og Xenia/Og Xenophon/Og Xerox/NgSV Xerxes/Og Xhosa/Ng Xi'an/Og Xian/ONSgJ Xiaomi/Og Xiaoping/g Ximenes/g Xingu/ONg Xinjiang/Og Xiongnu/Ng Xizang/Og Xmas/OgSV Xochipilli/g Xuzhou/Og Y/ # Yttrium YMCA/ONg YMHA/O YMMV/ YT/ON YWCA/Og YWHA/O Yacc/g Yahoo/NgV Yahtzee/ONg Yahweh/Og Yahya/Og Yakima/NOg Yakut/NOg Yakutsk/Og Yale/Og Yalow/g Yalta/Og Yalu/Og Yamagata/Og Yamaha/ONg Yamoussoukro/Og Yang/Og Yangon/Og Yangtze/Og Yank/NSg Yankee/NSgV Yaobang/g Yaoundé/Og Yaounde/Og Yaqui/NOg Yaren/O Yaroslavl/Og Yataro/g Yates/Og Yauco/Og Yb/ # Ytterbium Yeager/Og Yeats/Og Yekaterinburg/Og Yellowknife/Og Yellowstone/Og Yeltsin/Og Yemen/Og Yemeni/JNSg Yemenite/N Yenisei/Og Yerevan/Og Yerkes/Og Yesenia/g Yevtushenko/g Yggdrasil/Og YiB # yobibyte Yiddish/JOg Ymir/Og Yoda/Og Yoknapatawpha/g Yoko/Og Yokohama/Og Yolanda/Og Yong/Og Yonkers/Og York/Og Yorkie/Ng Yorkshire/ONSg Yorktown/Og Yoruba/NOg Yosemite/Og Yossarian/g YouTube/ONgVG YouTuber/NSg Young/Og Youngstown/Og Ypres/Og Ypsilanti/Og Yuan/Og Yucatan/Og Yugo/Og Yugoslav/JNOSg Yugoslavia/Og Yugoslavian/JNSg Yukon/ONg Yule/OgS Yuletide/NgS Yuma/ONSg Yunnan/Og Yuri/Og Yves/g Yvette/ONg Yvonne/Og Z/NSg^nX Z80/NOSg Zachariah/Og Zachary/Og Zachery/Og Zagreb/Og Zaire/Og Zairian/N Zambezi/Og Zambia/Og Zambian/NSgJ Zamboni/Ng Zamenhof/Og Zamora/Og Zane/Og Zanuck/g Zanzibar/Og Zapata/Og Zaporizhzhia/Og Zaporozhye/Og # old name of Zaporizhzhia Zapotec/NOgJ # ethnicity Zappa/Og Zara/Og Zarathustra/Og Zealand/Og> Zebedee/Og Zechariah/Og Zedekiah/Og Zedong/g # mao - Zeffirelli/g Zeke/Og Zelenskyy/Og # president Zelig/Ng Zelma/Og Zen/ONgJ Zenger/Og Zeno/OgJ Zephaniah/Og Zephyrhills/g Zephyrus/Og Zest/g Zeus/Og Zhdanov/O Zhejiang/Og Zhengzhou/Og Zhivago/Og # dr - Zhukov/Og ZiB # zebibyte Zibo/Og Ziegfeld/g Ziegler/Og Ziggy/Og Zika/ON # virus Zilog/Og # semiconductor company Zimbabwe/Og Zimbabwean/NSgJ Zimmerman/Og Zinfandel/g Zion/OgS Zionism/NwSg Zionist/NSgJ Ziploc/Ng # trademark Žižek/Og # slavoj - Zn/ # Zinc Zoë/Og Zoe/Og Zola/Og Zollverein/Ng Zoloft/Og Zomba/g Zorn/Og Zoroaster/Og Zoroastrian/NgSJ Zoroastrianism/OgSw Zorro/ONg Zosma/Og Zr/ # Zirconium Zsigmondy/g Zubenelgenubi/Og Zubeneschamali/Og Zukor/Og Zulu/NOSgJ Zululand/O Zuni/JNOSg09 Zurich/Og Zwingli/Og Zworykin/g Zyrtec/g Zyuganov/g Zzz a/~DP( a lot a.m./ aah/NV aardvark/~NSg ab/~NSVdPY aback/N abacus/NgS abaft/P abalone/NSg abandon/~VdGSNL abandonment/~Ng abandonware/Nmg abase/VGdSL abasement/Ng abash/VGdSL abashed/JYVU abashment/Ng abate/~VGdSNL abated/VtTJU abatement/Ng abattoir/NgS abbe/~NSg abbess/~NgS abbey/~NgS abbot/~NgS abbr/~N abbrev/NS abbreviate/VdGSJNnX abbreviation/~NwgS abdicate/~VGdSnX abdication/~Ng abdomen/~NSg abdominal/~JN abduct/VdSG abductee/NgS abduction/~NwSg abductor/NgS abeam/JP aberrant/JN aberration/~NgS aberrational/J abet/VSN abetted/VtT abetter/NSg!_₹ abetting/V6N abettor/NSg abeyance/Ng abhor/VS abhorred/VtTJ abhorrence/Ng abhorrent/JY abhorring/NV6 abidance/Ng abide/~VGSd abiding/~JYV6N ability/~NwgSiE abject/JYpNV abjection/Nmg abjectness/Nmg abjuration/NSg abjuratory/J abjure/VGd>SZ abjurer/Ng ablate/VGdSXnv ablation/~Ng ablative/JNgS ablaze/~J able/~J^VNU abler/Jc abloom/J ablution/NSg abnegate/VGdSn abnegation/Ng abnormal/~JYN abnormality/~NSg aboard/~P abode/~NgSV abolish/~VGdS abolition/~Ng abolitionism/Nmg abolitionist/~JNSg abominable/J abominably/Ry abominate/JVdSGnX abomination/Ng aboriginal/~JNgS aborigine/NSg aborning/J abort/~NSVGdv abortion/~NgS abortionist/NgS abortive/~JYN abound/~VdSG about/~PJ above/~PJNg aboveboard/J abracadabra/Ng abrade/VGdS abrasion/NgS abrasive/~JYpNgS abrasiveness/Ng abreast/JP abridge/VdSG abridgement/NgS!@_₹ abridgment/NgS abroad/~NPJ abrogate/VGdSJXn abrogation/Ng abrogator/NgS abrupt/~J^Y>pVN abruptness/Nmg abs/~JNgV abscess/NgSVdG abscissa/NSg abscission/Ng abscond/VGSd>Z absconder/NgS abseil/VdGSNg absence/~NwSg absent/~JYNSPVdG absentee/~NgSJ absenteeism/Nmg absentminded/JYp absentmindedness/Nmg absinth/Nmg!@_₹ absinthe/Nmg absolute/~J^pNgSn absolutely/R% absoluteness/Nmg absolution/Ng absolutism/~Nmg absolutist/NgSJ absolve/VdSG absorb/~VGdSr absorbance/~Nmg absorbency/Nmg absorbent/JNSg absorber/NSg absorbing/~JYV absorption/~Nmg absorptive/JN abstain/~Vd>GSZ abstainer/Ng abstemious/JYp abstemiousness/Ng abstention/~NgS abstinence/Ng abstinent/JN abstract/~NSgJYpVGd abstracted/JYpVtT abstractedness/Ng abstraction/~NwSg abstractness/NmgS abstruse/JYp abstruseness/Ng absurd/~J^>YpN absurdist/NgSJ absurdity/~NSg absurdness/Ng abundance/~NSg abundant/~JY abuse/~NwSVGdEv abuse's abuser/NgS abusive/~JYp abusiveness/Ng abut/VSL abutment/NgS abutted/VtT abutting/~JV6N abuzz/J abysmal/JY abyss/~NgS abyssal/J ac/~NJ acacia/~NgS academe/Ng academia/~Ng academic/~JNSg academical/~JYN academician/~NgS academy/~NSg acanthus/NgS accede/~VGdS accelerate/~VGdSJnX acceleration/~Ng accelerationism/Nmg accelerationist/NSg accelerator/~NSg accelerometer/NSg accent/~NgSVdG accented/~VJU accentual/J accentuate/VGdSn accentuation/Nmg accept/~VdGSJNB acceptability/Nmg acceptableness/Nmg acceptably/RyU acceptance/~NwSg acceptation/NgS accepted/~VtTJU access/~NwgSVdG accessibility/~Nmgi accessible/~Ji accessibly/Ryi accession/~NwgSVdG accessor/NgS accessorise/VdSG!_₹ accessorize/VdSG accessory/~JNSg accident/~NgSJ accidental/~JYNSg acclaim/~VdGSNg acclamation/~Ng acclimate/VdSGn acclimation/Nmg acclimatisation/Nmg!_₹ acclimatise/VdSG!_₹ acclimatization/Ng acclimatize/VdSG acclivity/NSg accolade/~NSgV accommodate/~VGdSJXn accommodating/~JYV6 accommodation/~Ng accompanied/~VtTJU accompaniment/~NgS accompanist/NSg accompany/~VdSG accomplice/~NSg accomplish/~VdSGL accomplished/~JVtTU accomplishment/~NwgS accord/~NgSVGd accordance/~Nmg accordant/J according/~VJY accordion/~NgSV accordionist/NgS accost/VGdSNg account/~NgSVdGB accountability/~Nmg accountable/~JU accountancy/~Nmg accountant/~NgSJ accounted/~VtTU accounting/~V6Ng accouter/VSGd accouterments/N9g accoutre/VdSG!@_₹ accoutrements/N9g!@_₹ accredit/VSGd accreditation/~NwgS accredited/~VJU accretion/~NgS accrual/NgS accrue/VGdSN acct/N acculturate/VdSGn acculturation/Ng accumulate/~VGdSJXnv accumulation/~Ng accumulator/~NgS accuracy/~NwgSi accurate/~JYi accurateness/Ng accursed/JpV accursedness/Ng accusation/~NwgS accusative/~JNgS accusatory/J accuse/~VGd>SNZ accuser/Ng accusing/~VJYN accustom/VdGSN accustomed/~JVU ace/~NSgVdGJ acerbate/JVdSG acerbic/J acerbically/Ry acerbity/Ng acetaminophen/Ng acetate/~NgS acetic/~J acetone/Ng acetonic/J acetyl/~N acetylene/~Ng ache/VdGSNg achene/NgS achievable/~JU achieve/~VGd>SBLZ achievement/~NwSg achiever/Ng aching/V6JYN achoo/NgV achromatic/J achy/J^> acid/~JYNwSg acidic/~J acidification/Nmg acidify/VGdS acidity/~Nmg acidosis/Ng acidulous/J acknowledge/~VdSG acknowledged/~JVtTU acknowledgement/NwgS!@_₹ acknowledgment/~NwSg< acme/NSg acne/Nmg acolyte/NgS aconite/NgS acorn/~NgS acoustic/~JNS acoustical/~JY acoustics/~Nmg acquaint/VGSdJr acquaintance/~NSg acquaintanceship/Ng acquainted/~JVtTU acquiesce/VdSG acquiescence/Nmg acquiescent/JY acquire/~VGd>SZBL acquirement/Ng acquisition/~NgS acquisitive/JYp acquisitiveness/Ng acquit/VS acquittal/~NgS acquitted/~VtTJ acquitting/V6 acre/~NSg acreage/~NwgS acrid/J^>Yp acridity/Nmg acridness/Nmg acrimonious/JYp acrimoniousness/Nmg acrimony/Nmg acrobat/~NgSV acrobatic/~JS acrobatically/Ry acrobatics/Nmg acronym/~NgSV acrophobia/Nmg acropolis/~NgS across/~PN acrostic/NSgJ acrylamide/Nmg acrylic/~JNgS act/~NSVdGrv act's acting/~JVNmg actinium/Nmg action/~NwSgJVr actionable/~JN actioner/NgS activate/~VGSdiern activation/~NwgSier activator/NgS active/~JYNiK active's activeness/Nmg actives/N9 activism/~Nmg activist/~NgSJ activities/~N9 activity/~Ngi actor/~NgSr actress/~NgS actual/~JYN actualisation/Ng!_₹ actualise/VGdS!_₹ actuality/~NSg actualization/Nmg actualize/VGdS actuarial/J actuary/NSg actuate/VGdSn actuation/Nmg actuator/NSg acuity/~Nmg acumen/~Nmg acupressure/Nmg acupuncture/NgV acupuncturist/NSg acute/~JY^>pNgSV acuteness/Nmg acyclic/J acyclovir/Nmg acyl/N ad/~NSgP ad-free/J ad nauseam/R adage/NgS adagio/NgSJ adamant/~JYNg adapt/~VGd>SJBZv adaptability/Nmg adaptation/~NgS adapter/~Ng adaption/~NS adaptor/NgS!_₹ adblocker/NgS add/~Vd>GSNBZ add-on/NgS addend/NgSV addenda/N9 addendum/N0g adder/~Ng addict/~NgSVGdv addiction/~NwSg addition/~NSg additional/~JYN additive/~JNSg addle/VGdSJN address/~NSVGdr address's addressable/J addressed/~JVtTU addressee/~NSg adduce/VGdS adenine/Nmg adenocarcinoma/N adenoid/JNSg adenoidal/J adenosine/Ng adept/~JYpNgS adeptness/Ng adequacy/Ngi adequate/~JYVi adequateness/Ng adhere/~VGdS adherence/~Ng adherent/~JNSg adhesion/~Ng adhesive/~JpNwSg adhesiveness/Ng adiabatic/~JN adieu/NgS adios/NV adipose/~JN adj/~N adjacency/~Ng adjacent/~JYNP adjectival/JYN adjective/~NgSJV adjoin/VGdS adjourn/VdGSL adjournment/NSg adjudge/VGdS adjudicate/VGdSnvX adjudication/Ng adjudicator/NSg adjudicatory/J adjunct/~NgSJV adjuration/NgS adjure/VGdS adjust/~VGdSrL adjustability/Nmg adjustable/~JN adjuster/NSg adjustment/~NgSr adjutant/~NSgJ adman/Ng admen/N admin/~NwSgV administer/~VdGS administrate/VdSGXnv administration/~Ng administrational/J administrative/~JY administrator/~NgS admirably/Ry admiral/~NgS admiralty/~Ng admiration/~Ng admire/~VGd>SBZ admirer/~Ng admiring/JYV6N admissibility/Nmgi admissible/~Ji admissibly/Ry admission/~Ngr admissions/~N admit/~VSr admittance/~Ng admitted/~VtTY admitting/~V6Nr admix/VGdSN admixture/~NSg admonish/VdSGL admonishment/NgS admonition/NgS admonitory/J ado/~Ng adobe/~NgS adolescence/~NSg adolescent/~JNSg adopt/~VGdSrv adoptable/JN adopter/NgS adoption/~NwSg adorableness/Nmg adorably/Ry adoration/~Nmg adore/VGd>SBZ adorer/NgS adoring/VJYN adorn/VGdSNJL adorned/~VtTJU adornment/NwgS adposition/NgS adrenal/~JNgS adrenalin's adrenaline/~Nmg adrenergic/JN adrift/~J adroit/JYp adroitness/Ng adsorb/VSdG adsorbent/JNgS adsorption/~NSg adulate/VdSGn adulation/Ng adulator/NgS adulatory/J adult/~NgSJV adulterant/NgS adulterate/JVGdSn adulterated/JVtTU adulteration/Ng adulterer/NSg adulteress/NgS adulterous/J adultery/~NSg adulthood/~Nmg adumbrate/VGdSn adumbration/Ng adv/~N advance/~VdGSNgJL advancement/~NSg advantage/~NwSgVdGE advantageous/~JYE advent/~NSgV adventitious/JY adventure/~NwSgVd>GZ adventurer/~Ng adventuresome/J adventuress/NgS adventurism/Nmg adventurist/NS adventurous/~JYp adventurousness/Nmg adverb/NSgV adverbial/JYNSg adversarial/~J adversary/~NSg adverse/~J>Y^p adverseness/Ng adversity/~NSg adversive/J advert/~NSgVdG advertise/~VGd>SLZ advertised/~VtTU advertisement/~NgS advertiser/~Ng advertising/~NmgV advertorial/NSg advice/~Nmg advisability/Nmgi advisable/Ji advisably/Ry advise/~Vd>GSNLZB advised/~JYVtTU advisement/Ng adviser/~Ng advisor/~NSg advisory/~JNSg advocacy/~Ng advocate/~NgSVGd advt/N adware/Nmg adze/NSgV aegis/~Ng aeon/NSg!_₹ aerate/VdSGn aeration/Ng aerator/NSg aerial/~JYNSg aerialist/NgS aerie/NgS aerobatic/~JS aerobatics/Ng aerobic/~JS aerobically/Ry aerobics/Ng aerodrome/~NgS aerodynamic/~JS aerodynamically/Ry aerodynamics/~Nmg aerofoil/NSg!_₹ aerogram/NS aeronautic/JS aeronautical/~J aeronautics/~Nmg aeroplane/NSgV!_₹ aerosol/~NwgSV aerospace/~NgJ aery/NJ aesthete/NgS aesthetic/~JNSQ aestheticism/Nmg aesthetics/~Nmg æther/Nmg aether/Nmg aetiology/Nmg!_₹ afar/~ affability/Nmg affable/J affably/Ry affair/~NgS affect/~VGdSNE affect's affectation/NSg affected/~JYNVtT affecting/~JYV affection/~Nm0gE affectionate/~JYV affections/~N9V afferent/JN affiance/VGdSN affidavit/~NSgV affiliate/~NSVGdEn affiliate's affiliated/~JVtTU affiliation/~N0gE affiliations/~N9 affine/~JNV affinity/~NwSg affirm/~VGdSr affirmation/~NgSr affirmative/~JYNgS affix/NgSVGd affixation/Nmg afflatus/Ng afflict/VGdS affliction/~NwSg affluence/Nmg affluent/~NJY afford/~VGdSB affordability/NmgU affordably/Ry affordance/NSg afforest/VGSdE afforestation/Ng affray/VSNg affricate/NSg affront/VGdSNg afghan/~NgS aficionado/NgS afield/~ afire/J aflame/J afloat/~JP aflutter/J afoot/J afore/RPC aforementioned/~JN aforesaid/J aforethought/J afoul/ afraid/~JU afresh/ aft/~NJZ after/~P afterbirth/Nw0g afterbirths/N9 afterburner/NgS aftercare/Nmg aftereffect/NgS afterglow/NwSg afterimage/NgS afterlife/~N0wg afterlives/N9 aftermarket/~NgSV aftermath/~N0g aftermaths/N9 afternoon/~NwgS aftershave/NwSg aftershock/NSg aftertaste/NwSg afterthought/NSgV afterward/~R< afterwards/R!@_₹ afterword/NgS again/~P against/~PC agape/JNg agar/~Ng agate/NgS agave/~Ng age/~NwSgVdGz ageing/VSNgJ!_₹ ageism/Nmg ageist/JNSg ageless/JYp agelessness/Nmg agency/~NwSg agenda/~NSg agenesis/N agent/~NgSr agentic/JQ ageratum/Ng agglomerate/JNSgVdGnX agglomeration/~NwSg agglutinate/JVdGSNXn agglutination/Nmg agglutinative/J aggrandise/VGdSL!_₹ aggrandisement/Ng!_₹ aggrandize/VGdSL aggrandizement/Ng aggravate/VGdSnX aggravating/V6JY aggravation/Nmg aggregate/~NgSJVGdnX aggregation/~NwSg aggregator/~NSg aggression/~NgwS aggressive/~JYpN aggressiveness/Nmg aggressor/~NSg aggrieve/VdSG aggro/NJV aghast/J agile/~JYN agility/~Nmg aging/~V6NgJ<@ agitate/VGdSXn agitation/~Nmg agitator/NgS agitprop/NgV agleam/J aglitter/J aglow/J agnostic/~JNgS agnosticism/Ng ago/~JP agog/J agonise/VGdS!_₹ agonising/JYVN!_₹ agonist/~NS agonize/VGdS agonizing/JYVN agony/~NwSg agoraphobia/Nmg agoraphobic/NgSJ agrarian/~JNgS agrarianism/Nmg agree/~VdSEBL agreeableness/NgE agreeably/RyE agreeance/Nmg agreeing/~V6NE agreement/~NwSgE agribusiness/NwgS agricultural/~JYN agriculturalist/NgS agriculture/~Nmg agriculturist/NgSJ agroclimate/NwgS agronomic/J agronomist/NgS agronomy/Nmg aground/~J aguardiente/Nmg ague/~NgV ah/~NVI aha/~ ahchoo/ ahead/~R ahem/V ahoy/VN aid/~NwSgVdG aide/~NSg aided/~VtTU aigrette/NgS ail/VdGSNJL aileron/NSg ailment/~NSg aim/~NSgVdG aimless/JYp aimlessness/Ng ain't/VA air/~NwSgVdGz air-conditioned/J air-cooled/J airbag/~NgS airbase/~NSg airbed/NS airboard/NSg airborne/~JN airbox/NSg airbrush/NgSVdG airbus/~NgS aircon/Nmg aircraft/~N09g # singular and plural aircraftman/N0 aircraftmen/N9 aircrew/~NS airdrome/NS airdrop/NSgV airdropped/VtTJ airdropping/V6 airfare/NwSg airfield/~NSg airflow/~Nmg airfoil/NSg airframe/NSg airfreight/NmgV airguns/N9 airhead/NSg airily/Ry airiness/Nmg airing/~VNmg airless/Jp airlessness/Nmg airletters/N airlift/~NSgVGd airline/~NSg>Z airliner/~NgS airlock/NSg airmail/~NSgVGd airman/~N0g airmen/~N9 airplane/~NgSV airplay/~Nmg airport/~NSg airship/~NSgV airshow/~NS airsick/Jp airsickness/Ng airspace/~Ng airspeed/~NwgS airstrike/NgSV airstrip/~NSg airtight/J airtime/~Nmg airwaves/~9g airway/~NgS airwoman/N0 airwomen/N9 airworthiness/Ng airworthy/Jp airy/~J^>p aisle/~NgS aitch/NgS ajar/JV aka/~NP akimbo/J akin/~J alabaster/~NmgJ alack/ alacrity/Nmg alarm/~NwgSVGd alarming/~VJY alarmism/Nmg alarmist/NSgJ alas/~N alb/~NSg albacore/NSg albatross/~NgS albeit/~C albinism/Nmg albino/~JNgS album/~NgSn albumen/Nmg albumin/~Ng albuminous/J alchemist/~NSg alchemy/~Nmg alcohol/~NwSg alcoholic/~NgSJQ alcoholism/~Nmg alcove/NgS alder/~NgS alderman/~N0g aldermen/~N9 alderwoman/N0g alderwomen/N9 ale/~NwSgv aleatory/J alehouse/NSg alembic/NSg alert/~JYpNgSVGd alertness/~Nmg alewife/N0g alewives/N9 alfalfa/Ng alfresco/J alga/Ng algae/~N9S algal/~JN algebra/~NwSg algebraic/~JQ algorithm/~NSg algorithmic/JQ alias/~NgSVGd alibi/~NgSVGd alien/~NgSJVGdB alienable/JiU alienate/JNSVdGn alienation/~Nmg alienator/NgS alienist/NSg alight/~VGdSJ align/~VGdSrL aligned/~VtTJU aligner/NgS alignment/~NwgSr alike/~JU aliment/NgSVdG alimentary/J alimony/Nmg alive/J aliveness/Nmg aliyah/~N0gV aliyahs/N9 alkali/~N0wg alkalies/N9 alkaline/~JNwgS alkalinity/Nmg alkalise/VdSG!_₹ alkalize/VdSG alkaloid/NSgJ alkyd/NgS all/~INgCJDq all-new/J all-nighter/NgS all-rounder/NgS all-woman/J allative/NSg allay/VGdSN allegation/~NwgS allege/~VGdS alleged/~VtTJY allegiance/~NgS allegoric/J allegorical/~JY allegorist/NgS allegory/~NwSg allegretto/NgS allegro/~NgSJ allele/~NgS alleluia/NSgV allergen/NSg allergenic/J allergic/~JNQ allergist/NSg allergy/~NSg alleviate/~VdSGn alleviation/Ng alley/~NgS alleyway/NSg alliance/~NwSgV alligator/~NgSV alliterate/VdSGXnv alliteration/Nmg alliterative/JY allocate/~VdSGYrneB allocation/~N0wgr allocations/~N9 allocator/NSge allophone/NSg allot/VSNL allotment/~NwSg allotted/~VtT allotting/V6 allover/JN allow/~VGdSE allowable/~JNU allowably/Ry allowance/~NwSgV alloy/~NgSVGd alloyed/JVU allspice/Nmg allude/~VGdS allure/NgSVGdL allurement/NgS alluring/JYNV allusion/~NSg allusive/JYp allusiveness/Nmg alluvial/~JNg alluvium/NSg ally/~VGdSNg alma mater/Ng almanac/~NSg almighty/~J almond/~NwgSJ almoner/NSg almost/~R alms/~Ng almshouse/NgS aloe/NwSg aloft/~ aloha/~NgS alone/~J along/~P alongshore/J alongside/~P aloof/~JYpP aloofness/Ng aloud/~J alp/~NSg alpaca/NgS alpha/~NgSJ alphabet/~NSgV alphabetic/~JN alphabetical/~JY alphabetisation/NwSg!_₹ alphabetise/VGd>SZ!_₹ alphabetiser/Ng!_₹ alphabetization/NwSg alphabetize/VGd>SZ alphabetizer/Ng alphanumeric/~JN alphanumerical/JYN alpine/~JNS already/~R alright/~J alrighty also/~RC alt/~NSJ altar/~NgS altarpiece/~NSg alter/~VGdSNB alterable/JNU alteration/~NwgS altercation/~NSg altered/~VtTNJU alternate/~JYNSgVdGnvX alternation/~Ng alternative/~JYNgS alternator/NSg although/~C altimeter/~NgS altitude/~NgS alto/~NSg altogether/~N altruism/Ng altruist/NSg altruistic/JQ alum/~NSgV alumina/Ng aluminium/Nmg!_₹ aluminum/~Nmg@< alumna/Ng alumnae/9 alumni/~9 alumnus/~Ng alveolar/~JNS alveoli/N9 alveolus/N0g always/~R8 am/~Vln # 1st person singular present of 'be' amalgam/~NwSgV amalgamate/~VGdSJNXn amalgamation/~NwSg amanuenses/N9 amanuensis/N0g amaranth/N0g amaranths/N9 amaretto/Ng amaryllis/~NgS amass/~VGdSN amateur/~NSgJ amateurish/JYp amateurishness/Nmg amateurism/Nmg amatory/J amaze/VGdSNgL amazement/Nmg amazing/~VJY amazon/~NgS amazonian/~J ambassador/~NSg ambassadorial/J ambassadorship/NgS ambassadress/NgS amber/~NmgJV ambergris/Nmg ambiance/NmgS ambidexterity/Ng ambidextrous/JY ambience/NmgS!@_₹ ambient/~JN ambiguity/~NSg ambiguous/~JYU ambit/N ambition/~NwgSV ambitious/~JYp ambitiousness/Nmg ambivalence/Nmg ambivalent/~JY amble/NgSVGd>Z ambler/~Ng ambrosia/~Nmg ambrosial/J ambulance/~NgSV ambulanceman/N ambulancemen/9 ambulancewoman/N ambulancewomen/9 ambulant/JN ambulate/VdSGXn ambulation/Ng ambulatory/~JNSg ambuscade/NgSVGd ambush/~NgSVGd ameliorate/VGdSnv amelioration/Nmg amen/~NVB amenability/Nmg amenably/Ry amend/~VGdSNBL amendment/~NSg amenity/~NSg amerce/VGdSL amercement/NSg americano/NwgS americium/Nmg amethyst/NSgJ amiability/Nmg amiable/J amiably/Ry amicability/Nmg amicable/~J amicably/~Ry amid/~PN amide/NgS amidship/S amidst/~P amigo/NgS amine/~NS amino/~JN amiss/JN amitriptyline/N amity/Ng ammeter/NSg ammo/~NmgV ammonia/~Nmg ammonium/~N ammunition/~NmgV amnesia/~Ng amnesiac/NgS amnesic/JNSg amnesty/~NSgVGd amniocenteses/N amniocentesis/Ng amnion/NgS amniotic/J amoeba/~NgS amoebae/N amoebic/J amok/NV among/~P amongst/~P amontillado/NSg amoral/JY amorality/Ng amorous/~JYp amorousness/Ng amorphous/~JYp amorphousness/Ng amortisation/NgS!_₹ amortise/VdSGB!_₹ amortization/NSg amortize/VdSGB amount/~NgSVGd amour/~NgS amoxicillin/N amp/~NSgVY amperage/Ng ampere/NgS ampersand/NgSV amphetamine/~NSg amphibian/~JNgS amphibious/~JY amphitheater/~NSg amphitheatre/NSg!@_₹ amphora/~N0g amphorae/N9 ampicillin/Nmg ample/~J^> amplification/~Ng amplifier/~NgS amplify/Vd>SGnXZ amplitude/~NSg ampule/NgS amputate/VGdSnX amputation/~NwgS amputee/~NgS amt/~N amulet/~NgS amuse/~VGdSL amusement/~NgS amusing/~VJY amygdala/Ng amylase/Ng amyloid/NJ an/~DPSe # removed `7` conjunction: archaic anabolism/Ng anachronism/NwSg anachronistic/JQ anaconda/NOSg anaemia/Ng!_₹ anæmic/JN anaemic/JN!_₹ anaemically/Ry!_₹ anaerobe/NSg anaerobic/~JQ anaesthesia/Ng!@_₹ anaesthesiologist/NSg!_₹ anaesthesiology/Ng!_₹ anaesthetic/JNgS!@_₹ anaesthetisation/Ng!_₹ anaesthetise/VGdS!_₹ anaesthetist/NgS!@_₹ anaesthetization/Ng@ anaesthetize/VGdS@ anagram/NgSV anal/~JYNmV analgesia/Nmg analgesic/~NSgJ analog/~JNgS analogical/JY analogise/VGdS!_₹ analogize/VGdS analogous/~JYp analogousness/Ng analogue/~JNSg analogy/~NwSg analysable/J!_₹ analysand/NgS analyse/VdSGr!_₹ analyser/NSg!_₹ analyses/~N9Vhr analysis/~N0wgr analyst/~NSg analytic/~JS analytical/~JY analyzable/J analyze/~VdSGr analyzer/~NSg anamorphic/J anapest/NSg anapestic/JNgS anaphylactic/J anaphylaxis/~Ng anarchic/JQ anarchism/~Nmg anarchist/~NgSJ anarchistic/J anarcho-punk/NgSJ anarchy/~Nmg anathema/NSg anathematise/VdSG!_₹ anathematize/VdSG anatomic/J anatomical/~JY anatomise/VdSG!_₹ anatomist/NSg anatomize/VdSG anatomy/~NSg ancestor/~NSgV ancestral/~JYN ancestress/NgS ancestry/~NSg anchor/~NgSVdG anchorage/~NgS anchorite/NgS anchorman/N0g anchormen/N9 anchorpeople/N9 anchorperson/NSg anchorwoman/N0g anchorwomen/N9 anchovy/NSg ancient/~J>Y^pNSg ancientness/Nmg ancillary/~JNSg and/~CV andante/NSgJ andiron/NSg androgen/~Nmg androgenic/J androgynous/J androgyny/Nmg android/~NSgJ anecdotal/~JY anecdote/~NgSV anemia/~NmgS anemic/JNQ anemometer/NSg anemone/~NSg anent/P anesthesia/~Nmg anesthesiologist/NSg anesthesiology/Ng anesthetic/JNSg anesthetist/NgS anesthetization/Nmg anesthetize/VGdS aneurysm/~NSg anew/~ angel/~NgSV angelfish/N09gS # singular and plural, also has a plural in -s angelic/~J angelica/~Ng angelical/JY anger/~Nm☁gSVGd angina/~Nmg angiomyolipoma/NSg angioplasty/NSg angiosperm/NSg angle/~NgSVGd>Z angler/NgS angleworm/NgS anglicise/VGdS!_₹ anglicism/NS anglicize/VGdS angling/~VNg anglophile/NS anglophone/~JNS angora/NgS angostura/N angrily/~Ry angry/~J^>V angst/~NgV angstrom/NgS angsty/J>^ anguish/~NmgSVGd angular/~JN angularity/NSg angulation/N anhydrous/~J aniline/Ng anilingus/N animadversion/NgS animadvert/VGSd animal/~NgSJ animalcule/NSg animalistic/J animate/~JVdSGrn animated/~JYVtT animation/~N0wgr animations/~N9 animator/~NgS anime/~NgS animism/Nmg animist/NSg animistic/J animosity/~NwSg animus/Ng anion/~NgS anionic/JN anise/Nmg aniseed/Nmg anisette/Ng ankh/~N0g ankhs/N9 ankle/~NgSV anklebone/NgS anklet/NgS annalist/NSg annals/~N9 anneal/VGdSN annelid/NgSJ annex/~NgSVGd annexation/~NgS annihilate/VdSGn annihilation/~Nmg annihilator/NSg anniversary/~NSg annotate/VdSGXnv annotation/~NwgS annotator/NgS announce/~Vd>SGLZ announced/~JVtTU announcement/~NgS announcer/~NgS annoy/VGdSN annoyance/~NwgS annoying/~JYVN annual/~JYNgS annualised/VtT!_₹ annualized/JVtT annuitant/NSg annuity/~NSg annul/VSL annular/J annulled/~JVtT annulling/V6N annulment/~NwSg annulus/N annunciation/~NSg anode/~NgS anodise/VGdS!_₹ anodize/VGdS anodyne/JNgS anoint/VGdSL anointment/Nmg anomalous/~JY anomaly/~NSg anon/~NSJ anonymity/~Ng anonymization/Nmg anonymize/Vd anonymous/~JY anopheles/Ng anorak/NgS anorectic/JNSg anorexia/Nmg anorexic/JNgS another/~ID ansatz/NSg ansatze/9 ansible/NgS answer/~NgSVdGB answerable/JU answered/~JVtT answerphone/NS ant/~NSgVd antacid/NwSgJ antagonise/VdSG!_₹ antagonism/~NmSg antagonist/~NSg antagonistic/~JQ antagonize/VdSG antarctic/~J ante/~NSgV( anteater/NgS antebellum/~J antecedence/Nmg antecedent/~JNSg antechamber/NSg antedate/VGdSN antediluvian/JN anteing/V antelope/~NgS antenatal/J antenna/~NSg antennae/~N antepenultimate/JNgS anterior/~J anteroom/NgS anthem/~NgSV anther/NgS anthill/NSg anthologise/VdSG!_₹ anthologist/NSg anthologize/VdSG anthology/~NSg anthracite/Nmg anthrax/~Nmg anthropocentric/J anthropogenic/J anthropoid/JNgS anthropological/~JY anthropologist/~NSg anthropology/~Nmg anthropomorphic/~JQ anthropomorphise/V!_₹d anthropomorphism/Nmg anthropomorphize/Vd anthropomorphous/J anti/~JNSgP( anti-Semite/NgS anti-Semitic/J anti-Semitism/Ng anti-piracy/J anti-vaccine/J anti-vax/J anti-vaxxer/NgS antiabortion/J antiabortionist/NgS antiaircraft/JN antibacterial/JNwgS antiballistic/J antibiotic/~NwgSJ antibody/~NSg antic/JNgSV anticancer/J anticipate/~VGdSnX anticipated/~JVtTU anticipation/~Nmg anticipatory/J anticked/VtT anticking/V6 anticlerical/JN anticlimactic/JQ anticlimax/NgS anticline/NSg anticlockwise/J anticoagulant/NwgSJ anticolonial/JNgS anticommunism/Nmg anticommunist/JNSg anticyclone/NSg anticyclonic/J antidemocratic/J antidepressant/NwgSJ antidote/~NgSV antifascist/JNgS antiferromagnetic/J antifreeze/Nmg antigen/~NSg antigenic/J antigenicity/Ng antihero/N0g antiheroes/N9 antihistamine/NwSg antiknock/JNg antilabor/J antilabour/J!@_₹ antilogarithm/NSg antimacassar/NgS antimalarial/NJ antimatter/~Nmg antimicrobial/~JN antimissile/JN antimony/~Nmg antineutrino/NSg antineutron/NgS antinuclear/J antioxidant/~NwgSJ antiparticle/NSg antipasti/N antipasto/NgS antipathetic/J antipathy/NmSg antipersonnel/J antiperspirant/NwSg antiphon/NSg antiphonal/NgSJY antipodal/JNS antipodean/JNgS antipodes/Ng antipollution/NJ antipoverty/J antiproton/NgS antiquarian/~JNSg antiquarianism/Nmg antiquary/~NSgJ antiquate/VGdS antique/~JNSgVdG antiquity/~NSg antirrhinum/NS antiscience/JN antiseizure/J antisemitic/~J antisemitism/~Nmg antisepsis/Nmg antiseptic/JNSgQ antiserum/NgS antislavery/J antisocial/JYN antispasmodic/JNgS antisubmarine/J antitank/J antitheses/N9 antithesis/~N0g antithetic/JN antithetical/JY antitoxin/NwgS antitrust/~J antivenin/NwgS antivenom/Nm antiviral/~JNwgS antivirus/NgS antivivisectionist/NgSJ antiwar/J antler/NgSd antonym/NSg antonymous/J antrum/N antsy/J^> anus/~NgS anvil/~NgSV anxiety/~NwSg anxious/~JYp anxiousness/Nmg any/~IRDq # removed `5` adjective. it's determiner/pronoun/adverb only anybody/~ISg anyhow/~J anymore/~ anyone/~Ig anyplace/ anything/~INSgV anytime/~J anyway/~R anyways/R<@ anywhere/~IN anywise/ aorta/NgS aortic/~J apace/ apart/~J # removed `1` noun, probably imported from Wiktionary's misspelling sense! apartheid/~NgV apartment/~NgS apathetic/JQ apathy/Nmg apatite/Ng ape/~NSgVdGJ apelike/J aperitif/NgS aperture/~NSg apeshit/Jx apex/~NgS aphasia/Nmg aphasic/JNgS aphelia/N aphelion/NSg aphid/NgS aphorism/NgSV aphoristic/JQ aphrodisiac/JNSg apiarist/NSg apiary/NSg apical/~JYN apiece/~ apish/JY aplenty/J aplomb/Nmg apocalypse/~NSg apocalyptic/~JN apocrypha/Nmg apocryphal/~JY apogee/~NgS apolitical/JYN apologetic/~JUQ apologia/NSg apologise/VGdS!_₹ apologist/~NgS apologize/~VGdS apology/~NwSg apoplectic/JN apoplexy/NSg apoptosis/~N apoptotic/~J apostasy/~NSg apostate/~JNSg apostatise/VGdS!_₹ apostatize/VGdS apostle/~NgS apostleship/Ng apostolic/~J apostrophe/~NgS apothecary/NSg apothegm/NSg apotheoses/N9V apotheosis/N0g app/~NSg appal/VS!_₹ appall/VGdS appaloosa/NgS apparatchik/NS apparatus/~NgS apparel/~NgSVdG apparelled/VtT!@_₹ apparelling/V6N!@_₹ apparent/~JY apparition/~NSg appeal/~NgSVGd appealing/~JYV6NU appear/~VSdGrE appearance/~NgSEr appease/~VGd>SLZ appeasement/~NSg appeaser/Ng appellant/JNSg appellate/~JXn appellation/~Ng append/VGdSN appendage/~NSg appendectomy/NSg appendices/9 appendicitis/Ng appendix/~NgS appertain/VGdS appetiser/NgS!_₹ appetising/JYV!_₹ appetite/~NSg appetizer/NgS appetizing/JYNV applaud/NSVbGd>Z applauder/Ng applause/~Nmg apple/~NwgS applejack/Ng applesauce/Nmg applet/NgS appliance/~NSg applicability/~Nmg applicable/~Ji applicably/Ry applicant/~NSg application/~NgSr applicator/NSg applier/NgS applique/NSgVd appliqueing/V apply/~VGdSJrnX appoint/~VSGdrELv appointee/~NSg appointment/~NSgE appointment's/r apportion/VGdSrL apportionment/Ngr appose/VGdS apposite/JYpNnv appositeness/Nmg apposition/NgS appositive/JNSg appraisal/~NgSr appraise/VdSGr appraiser/NgS appreciable/Ji appreciably/R%i appreciate/~VdSGXnv appreciated/~VtTJU appreciation/~Nmg appreciative/~JY appreciator/NgS appreciatory/J apprehend/VGdS apprehension/~NmgS apprehensive/JYpN apprehensiveness/Ng apprentice/~NSgVdG apprenticeship/~NgS apprise/VGdS apprize/VGdS approach/~VGdSNwgB approachability/Nmg approachable/JUi approbation/~NgE approbations/N appropriate/~JYpVGdSnX appropriated/~VtTJU appropriateness/~Ngi appropriation/~Ng appropriative/J appropriator/NSg approval/~N0wgE approvals/N9 approve/~VGdSE approved/~JVtTU approvement/g approving/~JYVE approx/~J approximant/NSg approximate/~JYVdSGXn approximation/~Nwg appurtenance/NSg appurtenant/JN apricot/NwgSJ apron/~NgSV apropos/JPN apse/~NSg apt/~JY^pNi apter/Jc aptitude/~NSg aptness/Ngi aqua/~NwSgJ aquaculture/~Nmg aqualung/NgSV aquamarine/~NSgJ aquanaut/NgS aquaplane/NgSVGd aquarium/~NgS aquatic/~JNSgQ aquatics/~Ng aquatint/NSV aquavit/Ng aqueduct/~NgS aqueous/~J aquifer/~NSg aquiline/J arabesque/~NgS arability/Ng arachnid/NgS arachnophobia/N arbiter/~NSgV arbitrage/NgSVGd>Z arbitrager/Ng arbitrageur/NSg arbitrament/NSg arbitrarily/~Ry arbitrariness/Ng arbitrary/~JpN arbitrate/VGdSn arbitration/~Ng arbitrator/~NgS arbor/~NgS arboreal/~JN arboretum/~NSg arborvitae/NSg arbour/NgS!@_₹ arbutus/NgS arc/~NSgVdG arcade/~NgSV arcane/~J arch/~NgSVGd>J^Yp(Zv archaeological/~JY archaeologist/~NSg archaeology/~Nmg archaic/~NJQ archaism/NgS archaist/NgS archangel/~NgS archbishop/~NSg archbishopric/~NSg archdeacon/~NSg archdiocesan/J archdiocese/~NgS archduchess/~NgS archduke/~NgS archenemy/NSg archer/~NgJ archery/~Nmg archetypal/~J archetype/~NgSV archfiend/NgS archiepiscopal/J archipelago/~NgSV architect/~NSgVdG architectonic/JNS architectonics/Nmg architectural/~JY architecture/~NwgSr architrave/NSg archival/~JNm archive/~NSgVdG archiver/NgS archivist/~NgS archness/Ng archway/NSg arctic/~JNgS ardent/~JY ardor/NgS ardour/NwgS!@_₹ arduous/~JYp arduousness/Ng are/~VlS # 2nd person singular & plural / 1st & 3rd person plural present of 'be' area/~NwSg areal/J aren't/V arena/~NgS argent/~NmgJ arginine/~N argon/~Nmg argosy/NSg argot/NwgS arguable/JiU arguably/~RyU argue/~VGd>SZr arguer/Ng argument/~NwgSV argumentation/~Nmg argumentative/JYp argumentativeness/Ng argyle/~NgS aria/~NSg arid/~JY aridity/Nmg aright/V arise/~VbGSN arisen/~VT aristocracy/~NwSg aristocrat/~NSg aristocratic/~JQ arithmetic/~NmgJ arithmetical/JYN arithmetician/NgS arity/NwgS ark/~NSg arm/~NSVGdJEr arm's armada/~NgS armadillo/NSg armament/~N0wgrE armaments/~N9 armature/NgSV armband/NgS armchair/~NgSJV armed/~JVtTU armful/NgS armhole/NSg armistice/~NOwSg armlet/NgS armload/NS armlock/NgSVdG armoire/NgS armor/~NgSVGd>Z armored/~JVtTU armorer/Ng armorial/~JN armory/~NSg armour/NgSVd>GZ!@_₹ armoured/VJU!@_₹ armourer/Ng!@_₹ armoury/NSg!@_₹ armpit/NgS armrest/NSg army/~NSg aroma/~NgS aromatherapist/NgS aromatherapy/Ng aromatic/~JNgSQ arose/~Vt around/~PJ arousal/~Nmg arouse/VGdS arpeggio/NgSV arr/~NV arraign/VdGSNL arraignment/NSg arrange/~VdGSNrEL arrangement/~NSgr arrangement's/E arranger/~NSg arrant/J arras/~NgS array/~NgSVGdE arrears/Ng arrest/~NwgSVGdr arrhythmia/~Nmg arrhythmic/J arrhythmical/J arrival/~NwgS arrive/~VGdS arrogance/~Nmg arrogant/~JY arrogate/VGdSn arrogation/Ng arrow/~NgSV arrowhead/~NgS arrowroot/Nmg arroyo/~NgS arse/NSgVdG!@₹x_ arsed/VJ arsehole/NSg!@₹x_ arsenal/~NgS arsenic/~NmgJ arsing/V arson/~NmgV arsonist/NSg art/~NwSgV artefact/NgS!_₹ arterial/~JN arteriole/NgS arteriosclerosis/Ng artery/~NSg artful/~JYp artfulness/Nmg arthritic/JNgS arthritis/~Nmg arthropod/~NgS arthroscope/NSg arthroscopic/J arthroscopy/N artichoke/NwSg article/~NgSVd articulacy/Ni articular/~J articulate/~JYpNSVGdnX articulateness/Ngi articulation/~Nmg artifact/~NSg artifice/NwSgV>Z artificer/Ng artificial/~JY artificiality/Ng artillery/~Ng artilleryman/Ng artillerymen/9 artiness/Ng artisan/~NgSJ artisanal/J artist/~NgSJ artiste/NgS artistic/~JiQ artistry/~Nmg artless/JYp artlessness/Ng artsy/J^>N artwork/~NgS arty/~J^>pN arugula/N arum/NSg as/~RCP asap/ asbestos/~NmgV ascend/~VGdSr ascendance/Ng ascendancy/~Ng ascendant/JNSg ascension/~NgS ascent/~NgS ascertain/~VGdSBL ascertainment/Ng ascetic/~JNgSQ asceticism/Nmg ascot/~NgS ascribe/VGdSB ascription/Ng aseptic/JNQ asexual/~JYN asexuality/Nmg ash/~NwgSVdG ashamed/~JYU ashcan/NgSVJ ashen/J ashlar/~NgS ashore/~ ashram/~NgS ashtray/NSgV ashy/J^> aside/~JNgS asinine/JY asininity/NSg ask/~VdGSN askance/JV asked/~VtTJU askew/~J aslant/JP asleep/~J asocial/JN asp/~NSgnX asparagus/Nmg aspartame/Nmg aspect/~NwgSV aspen/~JNg asperity/NSg aspersion/NgS asphalt/~NmgSVdG asphodel/NSg asphyxia/Ng asphyxiate/VdSGXn asphyxiation/Ng aspic/~NwgSJ aspidistra/NgS aspirant/NgSJ aspirate/NgSVGdJnX aspiration/~Nmg aspirational/JY aspirator/NSg aspire/~VGdS aspirin/~NgS ass/~NwgSJx assail/VGdSB assailable/JU assailant/~NSgJ assassin/~NSgV assassinate/~VGdSNnX assassination/~Ng assault/~NgSVd>G assay/~NgSVGd>Z assayer/Ng assemblage/~NSg assemble/~VGSdrE assembler/~NgS assemblies/~N assembly/~Ngr assemblyman/~Ng assemblymen/9 assemblywoman/Ng assemblywomen/9 assent/~VGdSNg assert/~VGdSNrv assertion/~Ngr assertions/~N assertive/~JYp assertiveness/Ng assess/~VGdSrL assessment/~NSgr assessor/NgS asset/~NgS asseverate/VdSGn asseveration/Ng asshole/NgSx assiduity/Ng assiduous/JYp assiduousness/Ng assign/~VGdSNrL assign's assignable/J assignation/NgS assigned/~JVtTU assignee/NgS assigner/NgS assignment/~NgSr assignor/NgS assimilate/~VdGSNn assimilated/~VtTU assimilation/~Nmg assimilationist/NgS assist/~VGdSNgv assistance/~Nmg assistant/~JNSg assisted/~VtTU assize/NgSV assn/N assoc/~N associate/~JNSVdGEnv associate's/N association/~Nw0gE associations/~N9 associativity/Nm assonance/Nmg assonant/JNgS assort/VGdSL assortative/J assortment/~NgS asst/N assuage/VGdS assume/~VGdSB assumption/~NwSg assumptive/J assurance/~NwSgr assure/~VGdSr assured/~VtTSJYNg astatine/Ng aster/~NgSE asterisk/~NgSVGd astern/J asteroid/~NgS asthma/~Ng asthmatic/JNSgQ astigmatic/JN astigmatism/NSg astir/J astonish/VdSGL astonishing/~JYV astonishment/Nmg astound/VGdSJ astounding/~V6JY astraddle/P astrakhan/Ng astral/~JN astray/~ astride/P astringency/Ng astringent/NSgJY astrolabe/NSg astrologer/~NSg astrological/~JY astrologist/NgS astrology/~Nmg astronaut/~NgS astronautic/JS astronautical/J astronautics/~Ng astronomer/~NSg astronomic/J astronomical/~JY astronomy/~Nmg astrophysical/~J astrophysicist/~NgS astrophysics/~Ng astute/~JY^>p astuteness/Nmg asunder/R asylum/~NwSg asymmetric/~J asymmetrical/~JY asymmetry/~NwSg asymptomatic/~JN asymptote/NgS asymptotic/~JQ async/J # abbreviation of "asynchronous" asynchronicity/Nmg asynchronous/~JY asynchrony/Nmg at/~PN # removed `V` and `I` obscure verb and obsolete dialectal pronoun atavism/Nmg atavist/NSg atavistic/J ataxia/~Ng ataxic/JNgS ate/~VtN atelier/~NSg atheism/~Nmg atheist/~NgSJV atheistic/~J atherosclerosis/Nmg atherosclerotic/J athirst/J athleisure/Nmg athlete/~NgS athletic/~JNSQ athleticism/Nmg athletics/~Ng athwart/P atilt/JP atishoo/N atlas/~NgS atmosphere/~NwgS atmospheric/~JSQ atmospherics/Ng atoll/~NgS atom/~NSg atomic/~JNQ atomicity/Nmg atomics/Nm # like 'physics' looks plural but is a mass noun atomisation/NwgS!_₹ atomise/VGd>SZ!_₹ atomiser/NgS!_₹ atomistic/J atomization/NwgS!_₹ atomize/VGd>SZ atomizer/NgS atonal/JY atonality/Nmg atone/VGdSL atonement/~Nmg atop/~P atria/N9 atrial/~J atrioventricular/J atrium/~N0g atrocious/JYp atrociousness/Ng atrocity/NSg atrophy/~NmSgVdG atropine/Nmg attach/~VGdSrL attache/NgB attached/~VtTJU attachment/~Ngr attachments/~N attack/~NgSVGd>JZ attacker/~Ng attain/~VGdSr attainability/Nmg attainable/JNU attainder/Ng attainment/~NSg attaint/VSdG attar/Ng attempt/~VdGSNr attempt's attend/~VSd>GZ attendance/~NSg attendant/~NSgJ attended/~VtTJU attendee/NSg attention/~N0gi attentional/J attentions/N9 attentive/JYpi attentiveness/Ngi attenuate/VdSGJn attenuation/~Ng attest/~VSdG attestation/NSg attested/~VtTJU attic/~NSg attire/~NSgVdG attitude/~NSgV attitudinal/JN attitudinise/VGdS!_₹ attitudinize/VGdS attn/N attorney/~NgSV attract/~VSGdvB attractant/NgS attraction/~NwgS attractive/~JYU attractiveness/~Nmg attractor/NgS attribute/~NSgVdGnvBX attributed/~VtTJU attribution/~Nmg attributive/JYNgS attrition/~NmgV attune/VdSG atty/N atwitter/J atypical/~JYN aubergine/NwgS auburn/~NgJ auction/~NgSVdG auctioneer/NSgV audacious/JYp audaciousness/Ng audacity/Nmg audibility/Nmgi audible/~JVSNg audibly/Ryi audience/~NgS audio/~JNgS audiobook/~NSg audiological/J audiologist/NSg audiology/Ng audiometer/NSg audiophile/NSgJ audiotape/NwSgV audiovisual/~JS audiovisuals/Ng audit/~NgSVGd audition/~NSgVdG auditor/~NgS auditoria/N9 auditorium/~NSg auditory/~JN auger/~NgSV aught/INgSV augment/~Vd>GSNZ augmentation/~NwgS augmentative/JN augmenter/Ng augur/NgSVGd augury/NSg august/~J^Y>pVN augustness/Ng auk/~NSg aunt/~NSg auntie/~NSgV aura/~NgS aural/JY aureole/NSgV aureus/~N auricle/NSg auricular/JN aurochs/Ng aurora/~NSg auscultate/VGdSnX auscultation/~Ng auspice/NSgV auspicious/~JYi auspiciousness/Ng austere/~J>Y^ austerity/~NSg austral/~JN auteur/NgS auth/NV authentic/~JiU authentically/Ry authenticate/VGdSJXnr authenticated/VtTU authentication/~Nmg authenticator/Sg authenticity/~Ng author/~NSgVdG authoress/NgS authorial/J authorisation/NwSg!_₹ authorise/VGdS!_₹ authorised/JVtT!_₹ authoritarian/~JNgS authoritarianism/Nmg authoritative/~JYp authoritativeness/Nmg authority/~NwSg authorization/~NwgS authorize/~VGdSr authorized/~JVtT authorship/~Nmg autism/~Nmg autistic/~JN auto/~JNgSV( autobahn/~NSg autobiographer/NSg autobiographic/J autobiographical/~JY autobiography/~NwSg autoclave/NgSVJ autocomplete/VSNmg autocompletion/NwgS autocorrect/VGdSNmg autocracy/NSg autocrat/NSg autocratic/~JQ autocross/NV autodetection/Nmg autodidact/NSg autofocus/NmgSVGd autofocussed/VtT autofocusses/Vh autofocussing/V6 autogenerate/VSGd autograph/~N0gJVbdG autographs/N9Vh autoimmune/~J autoimmunity/NwgS autoload/VSdG automagical/JY automaker/~NSg automata/~N9Sg automate/VGdSn automatic/~JNSgQ automation/~NwgS automatise/VGdS!_₹ automatism/Nmg automatize/VGdS automaton/~N0Sg automobile/~NSgVdGJ automobilia/Nmg automotive/~JN autonomic/~J autonomous/~JY autonomy/~Nmg autophagic/J autopilot/NSgV autoplay/NSgVdG autopsy/~NSgVGd autoregressive/J autorun/NgVG autoselect/VGdS autostereogram/NgS autosuggestion/N autotagging/NmgS autothysis/Nmg autoworker/NgS autumn/~NwSgV autumnal/J aux/~J auxiliary/~JNSg auxin/Ng av/~J>NVZ avail/~VGdSNgJB availability/~NmgU available/~JU avalanche/~NSgV avant-garde/NgJ avarice/Nmg avaricious/JY avast/ avatar/~NgS avaunt/NV avdp/N ave/~N avenge/~VGd>SNZ avenger/~Ng avenue/~NgS average/~NgSJYVGd averred/VtT averring/V6 averse/JVXn aversion/~Ng avert/~VGdS avg/~N avian/~JN aviary/~NSg aviate/VdGSN aviation/~Ng aviator/~NgS aviatrices/N9 aviatrix/NgS avid/~JY avidity/Ng avionic/JS avionics/~N9wg avitaminosis/Nmg avocado/NSgJ avocation/NgS avocational/J avoid/~VSdGB avoidable/JNU avoidably/RyU avoidance/~Nmg avoidant/JN avoirdupois/Ng avouch/VdGSN avow/VdGSNE avowal/NSgE avowed/~VtTJY avuncular/JY aw/~N await/~VGdSN awake/~JVGS awaken/~VGdSr awakening/~JNSgV6 award/~NgSVGd awardee/NS aware/~JpVU awareness/~NmgU awash/J away/~JV awe/~Nm☁SgVdG aweigh/J awesome/~JYpN awesomeness/Nmg awestruck/J awful/~JYp awfuller/Jc awfullest/Ju awfulness/Nmg awhile/ awkward/~J>Y^pN awkwardness/Nmg awl/NSg awn/NSgGz awning/NgS awoke/~Vt awoken/VT awry/~J ax/~NgSVdG< axe/NSgVdG!₹ axial/~JYN axiom/~NSg axiomatic/JQ axis/~Ng axle/~NgS axletree/NSg axolotl/NSg axon/~NgS ayah/Ng ayahs/N ayatollah/~N0g ayatollahs/N9 aye/~NSg azalea/NSg azimuth/~N0g azimuths/N9 azure/~NSgJV b/~J^VdK baa/~NSgVdG babble/VGd>SNmgZ babbler/~Ng babe/~NSg babel/~NgS baboon/~NgS babushka/NSg baby/~NSgJ^>VGd babyhood/Nmg babyish/J babysat/Vt babysit/VbS babysitter/NgS babysitting/V6Nmg baccalaureate/~NSg baccarat/Nmg bacchanal/JNgS bacchanalia/Ng bacchanalian/JNgS baccy/N bachelor/~NSg bachelorette/NSg bachelorhood/Nmg bacillary/J bacilli/N9 bacillus/~N0g back/~J>NSgVGdzZ back door/NgSVGd back off/V/ back to back/R back-to-back/J back up/V/ backache/NgS backbench/JNS backbit/V backbite/VG>SNZ backbiter/Ng backbitten/V backboard/NSgV backbone/~NwgS backbreaking/J backchat/NV backcloth/N0 backcloths/N9 backcomb/VdGSN backcountry/Ng backdate/VGdSN backdrop/~NgSV backer/~NgJ backfield/NSg backfill/Sg backfire/VGdSNg backflip/VSNg backflipped/VtT backflipping/V6NgJ backgammon/NmgV background/~J>NgSVZ backgrounder/Ng backhand/NgSVd>GJZ backhanded/JYV backhander/Ng backhoe/NgSV backing/~NmgJVtT backlash/~NgSV backless/J backlight/NgSVG backlit/VJ backlog/~NgSV backlogged/VtTJ backlogging/V6 backpack/~NgSVGd>Z backpacker/NgS backpacking/VNmg backpedal/VdGSN backpedalled/VtT!@_₹ backpedalling/V6N!@_₹ backplane/NSg backport/VdGSNg backpressure/Nmg backpropagate/VdGS backpropagation/NmSg backrest/NSg backronym/NSg backroom/NSgJ backscratching/VNg backseat/NSgV backside/NSgJ backslapper/NSg backslapping/V6Nmg backslash/~NgSV backslid/V backslide/V>GSNZ backslider/Ng backspace/NSgVdG backspin/NgV backsplash/NgSVdG backstabber/NgS backstabbing/V6N backstage/~JNg backstair/JNS backstop/NSgV backstopped/VtT backstopping/V6 backstory/~NS backstreet/~JNS backstretch/NgS backstroke/~NgSVGd backtalk/NgV backtick/NgS backtrace/NgSVdG backtrack/NSVdG backup/~NgSJ backward/~JYpNS backwardness/Nmg backwash/NmgV backwater/NSgV backway/NgS backwoods/NgJ backwoodsman/N0g backwoodsmen/N9 backyard/~NSg bacon/~Nmg bacteria/~N9g bacterial/~J bactericidal/JYN bactericide/NwSg bacteriologic/J bacteriological/J bacteriologist/NSg bacteriology/Ng bacterium/~N0g bad/~JYpNgV badass/NgSJ badder/Jc baddest/Ju baddie/NgS bade/~Vt badge/~NgSV>Z badger/~NgVGd badinage/NgV badlands/~Ng badman/N0g badmen/N9 badminton/~Nmg badmouth/VGd badmouths/Vh badness/Nmg baffle/VGd>SNgZL bafflement/Nmg baffler/Ng bafflingly/Ry% bag/~NSgV bagatelle/NSgV bagel/NgSV bagful/NgS baggage/~Nmg bagged/VtTJ baggie/Ng baggily/Ry bagginess/Nmg bagging/V6N baggy/J^>pNS bagpipe/NgSV>Z bagpiper/Ng baguette/NgS bah/~N baht/~NSg09P # singular and plural, also has a plural in -s bail/~NSgVGdB bailey/~NS bailiff/~NS bailiwick/NgS bailment/NgS bailout/~NSg bailsman/N0g bailsmen/N9 bairn/NgSV bait/~NwSgVGdJ baize/NgV bake/~Vd>GSNgZ baked/~VtTJU baker/~NgS bakery/~NSg bakeshop/NgS baklava/Nmg baksheesh/NgV balaclava/NgS balalaika/NgS balance/~NwSVdGU balance's balancer/Sg balboa/~NSg balcony/~NSg bald/~J^Y>pNSVGd balderdash/NmgV baldfaced/J baldness/Nmg baldric/NSg baldy/~NS bale/~NSgVd>GZ baleen/Nmg baleful/JYp balefulness/Nmg baler/Ng balk/NSgVGd balky/J>^ ball/~NSgVGd ballad/~NSgV balladeer/NgSV balladry/Nmg ballast/~NwSgVGd ballcock/NgS baller/NgS ballerina/~NSg ballet/~NwSgV balletic/J ballgame/NgS ballgirl/NS ballgown/NSV ballistic/~JSQ ballistics/Ng balloon/~NSgVGd balloonist/NgS ballot/~NSgVdG ballpark/~NgSJVdG ballplayer/NgS ballpoint/NgS ballroom/~NgSV balls/~N9SVdG ballsy/J>^ bally/JN ballyhoo/NSgVdG balm/NwSgV balminess/Ng balmy/J>^p baloney/~Ng balsa/~NwgS balsam/~NwSgV balsamic/JN balter/VSGd baluster/NSg balustrade/~NgS bamboo/~NwSgJV bamboozle/VdGSN ban/~VSNg banal/JY banality/NSg banana/~NwSg band/~NSVGdE band's bandage/NSgVdG bandana/NSg@ bandanna/NgS bandbox/NgS bandeau/Ng bandeaux/N bandit/~NSgV banditry/Nmg bandleader/~NS bandmaster/NSg bandmate/NSg bandoleer/NSg bandsman/N0g bandsmen/N9 bandstand/~NSg bandwagon/NSg bandwidth/~N bandwidths/N bandy/~Vd>GSJ^N bane/~NSgV baneful/J bang/~NSgVGd> bangle/NSgV bani/~N banish/VGdSL banishment/~Ng banister/NSgV banjo/~NgSV banjoist/NSg bank/~NSgVGd>ZB bankbook/NSg bankcard/NSg banker/~Ng banking/~NmgV banknote/~NSg bankroll/NSgVGd bankrupt/~JVGdSNg bankruptcy/~NwSg banned/~VtTJ banner/~NSgJV banning/~V6N bannock/NgS banns/Ng banquet/~NgSVGd>Z banqueter/Ng banquette/NSg banshee/NgS bantam/~NSgJ bantamweight/~NwSg banter/NSgVGd bantering/NVJY banyan/NSg banzai/~JNSgV baobab/NSg bap/NSV baptise/VGd>SZ!_₹ baptised/VtTJU!_₹ baptism/~NwgS baptismal/~JN baptist/~NS baptistery/NSg baptize/VGd>SZ baptized/~VtTJU baptizer/Ng bar/~NSVP^EeU bar's barb/~NSgVGd>Z barbacoa/N barbarian/~JNSg barbarianism/NwgS barbaric/~JQ barbarise/VdSG!_₹ barbarism/NwSg barbarity/NSg barbarize/VdSG barbarous/JY barbecue/~NwSgVdG barbel/NSg barbell/NgS barber/~NgVGd barberry/NSg barbershop/~NgSV barbie/~NS barbiturate/NSg barbwire/Ng barcarole/NSg barcode/NgS bard/~NSgV bardic/~JN bare/~JY>pNSVdG bareback/JVdN barefaced/JY barefoot/~Jd barehanded/J bareheaded/J barelegged/J bareness/Ng barf/NSgVGdY barfly/NSg bargain/~NgSVd>GZ bargainer/Ng barge/~NgSVGd bargeman/Ng bargemen/N9 barhop/VS barhopped/VtT barhopping/V6Nm barista/NgSV baritone/~NgS barium/~Nmg bark/~VGdSNwe bark's barkeep/NgSV>Z barkeeper/NgS barker/~NSg barley/~Nmg barmaid/NgS barman/~N0g barmen/N9 barmy/J>^N barn/~NSgV barn find/NgS barnacle/~NgSVd barney/~NSJV barnstorm/Vd>GSNZ barnstormer/NgS barnyard/NSgJ barometer/~NgS barometric/~JQ baron/~NgS baronage/NgS baroness/~NgS baronet/~NgS baronetcy/~NSg baronial/J barony/~NSg baroque/~JNg barque/NSg!@_₹ barrack/~NgSVdG barracuda/~NSg barrage/~NgSVGd barre/~NgSVGdz barred/~VtTJUEe barrel/~NSgVGd barrelled/VtTJ!@_₹ barrelling/V6N!@_₹ barren/~J^>pNSg barrenness/Ng barrette/NSgV barricade/~NgSVGd barrier/~NgSV barring/~V6NPEeU barrio/~NSg barrister/~NgS barroom/NgS barrow/~NSg bartender/~NSg barter/~NSgVGd>Z barterer/Ng baryon/NSg basal/~JYN basalt/~Nmg basaltic/J base/~NSVdGJ^eL base's baseball/~NSg baseboard/NgS baseless/JY baseline/~NgSV basely/Ry baseman/~N0g basemen/~N9 basement/~NgSe baseness/Ng baser/Jc bash/~VGdSNg bashful/JYp bashfulness/Nmg bashing/~VSNg basic/~JNgSQ basil/~NgV basilica/~NgS basilisk/NgSJ basin/~NgSV basinful/NgS basis/~Ng bask/~VGdSN basket/~NSgV basketball/~NwgSV basketry/Nmg basketwork/Nmg basmati/Ng basque/~NS bass/~JNgSV basset/~NSgV bassinet/NgS bassist/~NgS basso/~NgS bassoon/~NgSV bassoonist/NSg basswood/NgS bast/NgJ bastard/~NgSJV bastardisation/NwgS!_₹ bastardise/VGdS!_₹ bastardization/NwgS bastardize/VGdS bastardy/Ng baste/VGd>SNZnX baster/Ng bastion/~NgV bat/~NSgV batch/~NgSVdGJ bate/VGdSNKre bath/~NgSVGd>Z bathe/VNg bather/Ng bathetic/J bathhouse/NgS bathing/~NgV bathmat/NgS bathos/Ng bathrobe/NSg bathroom/~NSgV baths/~NV bathtub/~NgS bathwater/Nm bathyscaphe/NSg bathysphere/NgS batik/NwgSV batiste/Ng batman/~NgV batmen/9 baton/~NgSV batshit/NgJx batsman/~N0g batsmen/~N9 battalion/~NSgV batted/~JVtT batten/VGdSJNg batter/~VGd>SNwgzZ batterer/Ng battery/~NSg batting/~NgV6 battle/~NSgVdGJLZ battleaxe/NgS battledore/NSg battledress/N battlefield/~NgS battlefront/NgS battleground/~NgS battlement/NSg battler/NgS battleship/~NSg batty/J>^N bauble/NSg baud/NSg baulk/NgSVdG!_₹ bauxite/~Nmg bawd/NSgJV bawdily/Ry bawdiness/Nmg bawdy/J>^p bawl/VGdSNg bay/~NSgVdGJ bayberry/NSg bayonet/~NSgVdG bayou/~NgS bazaar/~NSg bazillion/NS bazooka/NSgV bbl/N bdrm/N be/~NAVbl beach/~NgSVdG beachcomber/NSg beachfront/JN beachgoer/NgS beachhead/~NgS beachside/NgSJ beachwear/Nmg beacon/~NSgV bead/~NSgVGd beading/VNg beadle/NSg beady/J>^ beagle/~NSgV beak/~NSgVd>Z beaker/~Ng beam/~NSgVGd bean/~NSgVGd beanbag/NgS beanfeast/NS beanie/NSg beanpole/NgS beansprout/NS beanstalk/~NgS bear/~NSgVG>JZBz bearable/JU bearably/RyU beard/~NgSVdG beardless/J bearer/~Ng bearing/~VJNg bearish/JYp bearishness/Ng bearlike/J bearskin/NgS beast/~NgSVJ beastie/NgS beastliness/Nmg beastly/J^>pg beat/~NwSgVG>JZBnz beatable/JU beatdown/NgS beaten/~JVU beater/Ng beatific/JQ beatification/~Ng beatify/VGdSXn beating/~NgV beatitude/NSg beatnik/NgS beau/~NSgV beaut/NgSJ beauteous/JY beautician/NSg beautification/~Ng beautifier/Ng beautiful/~JYN beautify/Vd>SGnZ beauty/~NwSgJV beaver/~NSgVGd bebop/~NgSV becalm/VGSd became/~Vt because/~CP beck/~NSgV beck and call/N beckon/VGdSN becloud/VGdS become/~VbTS becoming/~V6NJYU becquerel/NS bed/~NSgVb bedaub/VGSd bedazzle/VGdSL bedazzlement/Ng bedbug/NSg bedchamber/NS bedclothes/Nmg bedded/JVtT bedder/N bedding/NmgV6 bedeck/VGSd bedevil/VGdSL bedevilled/VtT!@_₹ bedevilling/V6N!@_₹ bedevilment/Ng bedfellow/NSg bedhead/NS bedim/VS bedimmed/VtT bedimming/V6 bedizen/VGdS bedlam/NwSg bedpan/NSg bedpost/NSg bedraggle/VGdS bedridden/J bedrock/~NwSgV bedroll/NSg bedroom/~NSg bedside/~NSg bedsit/NS bedsitter/NS bedsore/NSg bedspread/NSg bedstead/NSg bedtime/~NwSg bee/~NSgV>GZz beebread/Ng beech/~NgS beechnut/NgS beef/~NwSgVGdJ beefburger/NSg beefcake/NgS beefiness/Ng beefsteak/NwgS beefy/J>^p beehive/~NgSV beekeeper/NgS beekeeping/Nmg beeline/NgSV been/~VlTN beep/NSgVGd>Z beeper/Ng beer/~NwgV beery/J^> beeswax/NmgV beet/~NSgV beetle/~NgSVGdJ beetroot/~NwSV beeves/9 befall/VGSNn befell/V befit/VS befitted/VtT befitting/V6JY befog/VS befogged/JVtT befogging/V6 before/~PC beforehand/~J befoul/VdGS befriend/VSGd befuddle/VGdSL befuddlement/Ng beg/~VSN began/~Vt begat/VtN beget/VS begetter/NS begetting/V6N beggar/~NgSVdGY beggary/NgJ begged/~VtT begging/~NV6 begin/~VbSN beginner/~NSg beginning/~NgSV6J begone/V begonia/NSg begot/Vt begotten/VTJ begrime/VdSG begrudge/VdSG begrudging/VJY beguile/Vd>SGZL beguilement/Ng beguiler/Ng beguiling/VNJY beguine/NSg begum/~VSNg begun/~VT behalf/~Ng behalves/9 behave/~VGdS behavior/~NwSg< behavioral/~JY< behaviorism/Ng< behaviorist/NgS< behaviour/NwSg!@_₹ behavioural/JY!@_₹ behaviourism/Ng!@_₹ behaviourist/NSg!@_₹ behead/VdS beheading/NgS beheld/V behemoth/Ng behemoths/N behest/~NgSV behind/~PJNgS behindhand/J behold/~V>GSnZ beholder/Ng behoove/VdSG behove/VGdS!_₹ beige/~NmgJ being/~Vl6NwgC bejewel/VSdG bejewelled/VtTJ!@_₹ bejewelling/V6!@_₹ belabor/VSdG belabour/VGSd!@_₹ belated/VJY belay/VGdSN belch/VGdSNg beleaguer/VGSd belfry/~NSg belie/VdS belief/~Nw0gEU beliefs/~N9 believability/Nmg believable/~JU believably/RyU believe/~Vd>SGEZ believer/~NgSEU believing/~VNmU belittle/VdSGL belittlement/Ng bell/~NSgVGd bell-pull/NgS belladonna/~Ng bellboy/~NSg belle/~NgS belled/JVtTr belletrist/NgS belletristic/J bellhop/NSgV bellicose/J bellicosity/Nmg belligerence/Nmg belligerency/Nmg belligerent/~JYNgS belling/NV6r bellman/N0g bellmen/N9 bellow/~NgSVdG bellwether/NgS belly/~NSgVGd bellyache/NgSVGd bellybutton/NSg bellyful/NgS belong/~VdGSPz belonging/~NwgSV6 beloved/~JNSgV below/~P belt/~NSgVGd beltway/~NSg beluga/NgS belying/V bemire/VGdS bemoan/VdGS bemuse/VGdSL bemused/VtTJY bemusement/Nmg bench/~NgSVGd bench-warmer/NgS benchmark/~NgSVGd bend/~VbG>SNgBZ bendability/Nmg bender/~Ng bendy/J^>N # bene # prefixes that are not also words in their own right don't belong in the dictionary beneath/~P benedictine/~ benediction/NwSg benedictory/J benefaction/NwSg benefactive/NSgJ benefactor/~NgS benefactress/NgS benefice/NSgV beneficence/Ng beneficent/JY beneficial/~JYN beneficiary/~NSgJ benefit/~NSgVdG benevolence/~NSg benevolent/~JY benighted/JYV benign/~JY benignant/J benignity/Ng bent/~VtTSJNg bentonite/Nmg bentwood/Ng benumb/VdSG benzene/~Nmg benzine/Nmg benzyl/N bequeath/VdG bequeaths/V bequest/~NgSV berate/VGdS berberine/Nmg bereave/VdSGL bereavement/~NwgS bereft/VJ beret/~NgS berg/~NSg beriberi/Nmg berk/~NS berkelium/Nmg berm/NSgV berry/~NwSgVGd berrylike/J berserk/NJV berth/~N0gVGd berths/~N9V beryl/~NgSJ beryllium/~Nmg beseech/VbGSNZ beseecher/NgS beseeching/V6NmY beseem/VdSG beset/~VS besetting/V6NJ beside/~P besides/PR besiege/VGd>SZ besieger/Ng besmear/VdSG besmirch/VGdS besom/NgSV besot/VS besotted/VtTJ besotting/V6 besought/V bespangle/VdSG bespatter/VGSd bespeak/VGSN bespectacled/J bespoke/~JV bespoken/VJ best/~JuNSgVGdA bestial/JYN bestiality/Ng bestiary/NSg bestie/NSg bestir/VS bestirred/VtT bestirring/V6 bestow/VdGSN bestowal/NSg bestrew/VSdG bestrewn/V bestridden/V bestride/VSG bestrode/V bestseller/~NgS bestselling/~J bet/~NSgVP beta/~NSgJV betaine/NgS betake/VGS betaken/V betcha/ betel/Ng bethink/VSG bethought/JV betide/VGdS betimes/ betoken/VGdS betook/V betray/~Vd>GSZ betrayal/~NSg betrayer/Ng betroth/VdG betrothal/~NSg betrothed/~VJNg betroths/V better/~JcNgSVdGAL betterment/Ng betting/~JV6N bettor/NgS between/~PN betwixt/P bevel/NgSVGdJ bevelled/VtTJ!@_₹ bevelling/V6SN!@_₹ beverage/~NSg bevvy/NSV bevy/NSg bewail/VdGS beware/~VGdS bewhiskered/J bewigged/J bewilder/VSGdL bewildering/JYNV bewilderment/Ng bewitch/VGdSL bewitching/NJY bewitchment/Ng bey/~NSg beyond/~PN bezel/NgS bezier/NgS bf/~N bhaji/N bi/~J>NSg(Z biannual/JYN bias/~NgS☁VGdJ biased/~JVtTU biathlon/~NSg bib/NSgV bible/~NgS biblical/~J bibliographer/NgS bibliographic/~J bibliographical/~JY bibliography/~NSg bibliophile/NSg bibulous/J bicameral/~J bicameralism/Ng bicarb/NgS bicarbonate/~NgS bicentenary/NSg bicentennial/~JNSg bicep/Ng0 # biceps is the standard/traditional singular but bicep has become accepted biceps/N09g # singular and plural bicker/Vd>GSNgZ bickerer/Ng biconcave/J biconvex/J bicuspid/JNgS bicycle/~NSgVd>GZ bicycler/Ng bicyclist/NSg bid/~VbtTGSNg biddable/J bidden/VTU bidder/~NgS bidding/~V6Ng biddy/NSg bide/VS bidet/NgS bidirectional/JYN biennial/~JYNgS biennium/NgS bier/Ng biff/NSVGd bifocal/JS bifocals/N9g bifurcate/VdSGJXn bifurcation/Nwg big/~JpN bigamist/NSg bigamous/J bigamy/~Nmg bigger/~Jc biggest/~Ju biggie/~NgS biggish/J biggy/NSg bighead/NSg bighearted/Jp bigheartedness/Nmg bighorn/~NSg bight/~NgSV bigmouth/N0gJ bigmouths/N9 bigness/Nmg bigot/~NgSd bigotry/~NSg bigram/NSg bigwig/NgS bijou/NgJ bijoux/N bike/~NSgVd>GZ biker/~Ng bikini/~NgS bilabial/JNgS bilateral/~JYNgS bilberry/NS bile/~NmgV bilge/NgSV bilingual/~JYNSg bilingualism/~Nmg bilious/Jp biliousness/Nmg bilirubin/Nmg bilk/NSVGd>Z bilker/NgS bill/~NSgVGdBz billabong/NgS billboard/~NgSV billet/NgSVGd billfold/NSg billhook/NSV billiard/~NS billiards/~Ng billing/~V6Ng billingsgate/NgV billion/~SgH billionaire/~NSg billionth/JNg billionths/N billow/NgSVGd billowy/J billy/~NSg billycan/NS bimbo/NgS bimetallic/JNSg bimetallism/Ng bimodal/J bimonthly/~JNSg bin/~NSgV binary/~JNwSg binaural/~J bind/~VbGSNrUB bind's binder/~NgS bindery/NSg binding/~JNgSV bindweed/Ng binge/~NgSVd bingo/~NgJV binman/N binmen/9 binnacle/NSg binned/VtTJ binning/V6N binocular/JNgS binomial/~JNSg bio/~NSgJ biochemical/~JYNSg biochemist/~NgS biochemistry/~Nmg biodegradability/Nmg biodegrade/VdSGB biodiversity/~Nmg bioethics/~Nmg biofeedback/Nmg biofilm/NgS biog/N biographer/~NSg biographic/J biographical/~JY biography/~NwSgV biohazard/NgS bioinformatics/Nmg biol/N biologic/JN biological/~JYN biologist/~NgS biology/~NwgS biomarker/NgS biomass/~Nmg biome/NgS biomedical/~JYN biometric/J biometrics/N bionic/~JSQ bionics/Nmg biophysical/J biophysicist/NgS biophysics/~Nmg biopic/~NgS biopsy/~NSgVGd bioreactor/NS biorhythm/NgS bioscience/NgS biosensor/NSg biosphere/~NSg biosynthesis/~Nmg biosynthetic/J biotech/~Nmg biotechnological/J biotechnology/~Nmg biotin/~Nmg bioweapon/NgS bipartisan/~J bipartisanship/Ng bipartite/~J biped/NgS bipedal/J biplane/~JNgSV bipolar/~JN bipolarity/Nmg biracial/JN birch/~NgSVGd bird/~NSgVGd>JZ birdbath/N0g birdbaths/N9 birdbrain/NSgd birdcage/NS birder/Ng birdhouse/NgS birdie/~NgSVd birdieing/V birdlike/J birdlime/NgV birdseed/Ng birdshit/Nx birdsong/Nmg birdwatcher/NSg birdying/V biretta/NSg birth/~NgJ>VGdZ birthday/~NgSV birther/NgV birthmark/NgS birthplace/~NgS birthrate/NgS birthright/~NgS births/~Nr birthstone/NSg biscuit/~NSg bisect/VdGSN bisection/NwgS bisector/NSg bisexual/~JYNgS bisexuality/Ng bishop/~NgSV bishopric/~NSg bismuth/~Ng bison/~Ng09 # singular and plural bisque/NgJV bistable/J bistro/NgSV bit/~NSgVtGe bit shift/NgSVGd bitangent/NSg bitch/~NgSVGd bitchily/Ry bitchiness/Ng bitchy/J>^p bitcoin/ONSwg bite/~Vb>SNgZ biter/NgS biting/~V6NJY bitmap/NgS bitplane/NgS bitrate/NgS bitstream/Sg bitten/~VT bitter/~JY^>pNgSV bittern/~NSg bitterness/~Nmg bitters/NgV bittersweet/~JNgS bitty/J^>N bitumen/NmgV bituminous/JN bitwise/J bivalent/JN bivalve/NSg bivouac/NgSV bivouacked/VtT bivouacking/V6 biweekly/~JNSg biyearly/J biz/~Ng bizarre/~JY bizarro/NJ bk/~N bl/~dG blab/VSNg blabbed/VtT blabber/VdGSN blabbermouth/Ng blabbermouths/N blabbing/V6N black/~J^Y>pNwgSVGdXn black magic/Ng black out/V/ blackamoor/NgS blackball/NSgVGd blackberry/~NwSgVG blackbird/~NSgV blackboard/NgSV blackcurrant/NS blacken/VdG blackface/N blackguard/NSgV blackhead/NgS blacking/VNg blackish/J blackjack/~NgSVdG blackleg/NSV blacklist/NgSVdG blackmail/~NmgSVd>GZ blackmailer/Ng blackness/~Ng blackout/~NSgV blacksmith/~NgSVG blacksnake/NSgV blackthorn/NSg blacktop/NSgV blacktopped/VtT blacktopping/V6 bladder/~NgSV blade/~NgSVd blag/NSVJ blagged/VtT blagging/NV6 blah/~NgJV blahs/NgV blame/~NgSVGd>JB blameable/J!@_₹ blameless/JYp blamelessness/Ng blameworthiness/Ng blameworthy/Jp blammo/ blanch/VGdS blancmange/NgS bland/~J^Y>pVN blandish/VdSGL blandishment/NSg blandness/Ng blank/~J^Y>pNgSVGd blanket/~NgSJVGd blankness/Ng blare/VGdSNg blaringly/Ry blarney/NSgVdG blasé/J blase/J blaspheme/VGd>SNZ blasphemer/NgS blasphemous/~JY blasphemy/~NSg blast/~NgSVGd>Z blast off/V/ blaster/NgS blastoff/NgS blat/VSN blatancy/NSg blatant/~JY blather/VdGSNg blaze/~NgSVGd>Z blazer/~NgS blazing/JY blazon/~NgSVdG bldg/N # POS: abbreviation for building bleach/~J>VdGSNgZ bleached/~JVtTU bleacher/NgS bleacherly/Ry bleak/~J^>YpN bleakness/Nmg blear/JV blearily/Ry bleariness/Nmg bleary/J>^p bleat/NgSVGd bleed/~VG>SNZ bleeder/NgS bleeding/~V6JNg bleep/NgSVGd>Z bleeper/NgS blemish/NgSVGd blemished/VJU blench/VdGSN blend/~NgSVGd>Z blender/NgV bless/~VbGdSz blessed/~JYpVtT blessedness/Ng blessing/~NwgSV6 bletch/VN blew/~VtNJ blight/~NgSVGd>Z blimey/ blimp/~NgSV blimpish/J blind/~J^Y>pNgSVGdZ blinder/JcNgV blindfold/NSgJVdG blinding/~V6JYN blindness/~Ng blindside/NSVdG blind spot/NgS blini/NgS blink/~VGd>SNgZ blinker/NgVdG blintz/NgS blintze/Ng blip/NSgV bliss/~Ng blissful/JYp blissfulness/Ng blister/~NgSVGd blistering/VJYN blistery/J blithe/JY^>p blitheness/Ng blither/VGNJ blithesome/J blitter/NgS blitz/~NgSVGd blitzkrieg/NgS blivet/NS blizzard/~NSgV bloat/VGdSNJZ bloater/NgS bloatware/Nmg blob/~NSgV blobbed/VtT blobbing/V6N blobby/J bloc/~NSg block/~NSVGdU block's blockade/~NgSVGd>Z blockader/Ng blockage/~NwgS blockbuster/~NSg blockbusting/NgJ blockchain/NgS blocker/~NgS blockhead/~NSgV blockhouse/NgS blocklist/NgSVdG blocky/J blog/~NSgV blogged/VtT blogger/~NgS blogging/~NmV6 blogosphere/NgS bloke/NgS blokish/J blond/~J^>pNgSV blonde/~NgSJV blondish/J blondness/Nmg blood/~NmgSVGd bloodbath/N0g bloodbaths/N9 bloodcurdling/J bloodhound/NSg bloodily/Ry bloodiness/Ng bloodless/JYp bloodlessness/Nmg bloodletting/NgV6 bloodline/~NSg bloodmobile/NgS bloodshed/~Nmg bloodshot/J bloodstain/NSgd bloodstock/Ng bloodstream/NSg bloodsucker/NSg bloodsucking/JN bloodthirstily/Ry bloodthirstiness/Nmg bloodthirsty/J>^p bloody/~J^>pVGdSN bloom/~NgSVGd>Z bloomer/Ng bloop/VGd>SNgZ blooper/Ng blossom/~NgSVGd blossomy/J blot/~NSgV blotch/NgSVGd blotchy/J^> blotted/JVtT blotter/NgS blotting/V6N blotto/JNV blouse/~NgSVGd bloviate/VSdG blow/~VG>SNgJZ blow up/V/ blow-up/JNgS blowback/~Nmg blower/~Ng blowfly/NSg blowgun/NgS blowhard/NgS blowhole/NSV blowjob/NSg blowlamp/NS blown/~JVT blowout/NSg blowpipe/NSgV blowsy/J>^!@_₹ blowtorch/NgSV blowup/NgS blowy/J^>N blowzy/J>^ blubber/NwSgVGd blubbery/J bludgeon/NgSVdG blue/~J^>pNwSgVdG blue-blooded/J blue-collar/J bluebell/~NgS blueberry/~NwSgJV bluebird/~NgS bluebonnet/NSg bluebottle/NSg bluefish/N09gS # singular and plural, also has a plural in -s bluegill/NgS bluegrass/~Ng blueish/J bluejacket/NSg bluejeans/Ng blueness/Ng bluenose/NgS bluepoint/NgS blueprint/~NgSVdG blueshifted/J bluestocking/NSg bluesy/J>^ bluet/NgS bluey/NgVJ bluff/~NgSVGd>J^YpZ bluffer/NgJ bluffness/Ng bluing/VNg bluish/~J blunder/~NgSVd>GZ blunderbuss/NgSV blunderer/Ng blunt/~J^Y>pNSVGd bluntness/Ng blur/~VSNgJ blurb/~NgSV blurred/~JVtT blurriness/Ng blurring/~V6N blurry/J^>p blurt/VGdSN blush/NgSVGd>Z blusher/Ng bluster/NgSVd>GZ blusterer/Ng blusterous/J blustery/J blvd/~N boa/~NSg boar/~NSg board/~NwgSVGd>Z boarder/Ng boarding/~V6Ng boardinghouse/NgS boardroom/NgS boardwalk/~NgSV boast/~NgSVGd>Z boaster/Ng boastful/JYp boastfulness/Ng boat/~NSgVGd>Z boater/Ng boathouse/~NgS boating/~NgV6 boatload/NS boatman/N0g boatmen/~N9 boatswain/NSg boatyard/NS bob/~VSNg bobbed/JVtT bobbin/NgS bobbing/V6N bobble/NgSVGd bobblehead/NgS bobby/~NSg bobbysoxer/NSg bobcat/~NgS bobolink/NSg bobsled/NSgVb bobsledded/VtT bobsledder/NgS bobsledding/NV6 bobsleigh/~NgV bobsleighs/N bobtail/NSgV bobwhite/NgS boccie/Ng bock/~Ng bod/~NSgdG bodacious/J bode/~VSN bodega/NgS bodge/VGdSNJ bodgery/NgS bodice/NgS bodily/~J bodkin/NgS body/~NSgVd bodybuilder/~NSg bodybuilding/~Ng bodyguard/~NgSV bodysuit/NSg bodywork/~Ng boffin/NS boffo/JN bog/~NSgVJ boga/N bogey/NgSVGd bogeyman/Ng bogeymen/9 bogged/~VtTJ bogging/V6J boggle/VGdSN boggy/J^> bogie/~NgS bogon/N bogosity/N bogus/~JN bogyman/Ng bogymen/9 bohemian/~NSgJ bohemianism/Nmg boil/~NSgVGd>zZ boiler/~Ng boilermaker/NSg boilerplate/NwgSJV boing/~NgSVdG boink/VGdSN boisterous/JYp boisterousness/Ng bola/NSg bold/~J^Y>pVdGSN boldface/~NgVdJ boldness/Ng bole/NSg bolero/NgSV bolivar/~NgS bolivares/N boll/NSgV bollard/NS bollix/VGdSNg bollocking/NS bollocks/NV bologna/~Ng bolshie/NJ bolster/~NgSVGd bolt/~NSVGdU bolt's bolter/NgSVdG bolthole/NS bolus/NgSV bomb/~NSgVd>JzZ bombard/NSVGdL bombardier/~NgS bombardment/~NSg bombast/NgVJ bombastic/JQ bomber/~NSg bombing/NSgVJ bombproof/JNV bombshell/NSg bombsite/NS bona fide/RJ bonanza/~NgS bonbon/NgS bonce/NS bond/~NSgVGdJ bondage/~Ng bondholder/NgS bonding/~VNg bondman/Ng bondmen/9 bondsman/Ng bondsmen/9 bondwoman/Ng bondwomen/9 bone/~NwSgJ>VdGZ bonehead/NSgd boneless/J boner/Ng boneshaker/NS boneyard/N bonfire/~NgSV bong/~NSgVGd bongo/~NgSV bonhomie/Ng boniness/Ng bonito/NgS bonk/VGdSNZ bonnet/~NgSV bonny/J^>N bonobo/NgS bonsai/N09wSgV bonus/~NgSV bony/~J^>p boo/~NSgVdGH boo-boo/NgS boob/NSgVGd booby/~NSgVJ boodle/NgSV booger/NS boogeyman/Ng boogeymen/N9 boogie/~NgSVd boogieing/V boogieman/Ng boohoo/VGdSNg book/~NSgVGdBz bookbinder/NSg bookbindery/NSg bookbinding/Ng bookcase/NgS bookend/NgSV bookie/NgS booking/~V6Nwg bookish/J bookkeeper/NgS bookkeeping/NgV booklet/~NgS bookmaker/NSg bookmaking/Ng bookmark/NSgVdG bookmobile/NSg bookplate/NgSV bookseller/~NgS bookshelf/N0g bookshelves/N9V bookshop/~NSg bookstall/NS bookstore/~NgS bookworm/NSg bool/NgS boolean/~JNgS boom/~VGd>SNgZ boombox/NgS boomerang/~NgSVdG boon/~NSgJ boondocks/Ng boondoggle/NgSVGd>Z boondoggler/Ng boonies/Ng boor/NSg boorish/JYp boorishness/NmgS boost/~NgSVGd>Z booster/~NgV boot/~NSVGdr boot camp/Nmg boot loader/NgS boot up/V/ boot's bootable/J bootblack/NSgV bootee/NgS booth/~Ng booths/~N bootlace/NS bootleg/~VSNgJ bootlegged/VtT bootlegger/NgS bootlegging/NgV6 bootless/J bootlicker/NSg bootstrap/NgSV bootstrapped/VtT bootstrapper/NgS bootstrapping/V6N bootup/NgS booty/~NSg booze/NmgSVGd>Z boozer/Ng boozy/J^> bop/~NSgV bopped/VtT bopping/V6 borax/NgV bordello/NgS border/~NgSVGd borderland/NgS borderless/J borderline/~JNgSV bore/~Vbtd>GSNgZ boredom/~Ng borehole/NSV borer/Ng borescope/NgS boring/~NVJY born/~VJNirU borne/~VJ boron/Nmg borough/~Ng boroughs/~N borrow/~Vd>GSNZz borrower/~Ng borrowing/~VNg borscht/~Nmg borstal/NS borzoi/NSg bosh/NgV bosom/NSJVU bosom's bosomy/J boss/~NSgVdGJ bossily/Ry bossiness/Ng bossism/Ng bossy/J>^pN bot/~NSV botanic/~JN botanical/~JYN botanist/~NSg botany/~Ng botch/Vd>GSNgZ botcher/Ng both/~ICDq bother/~VdGSNmg botheration/N bothered/~JVtTU botherer/NgS bothersome/J botlike/J botnet/NSg bottle/~NSgVd>GZ bottleneck/~NgSVdG bottler/Ng bottom/~NSgVdGJ bottomless/J botulinum/N botulism/Nmg boudoir/NSg bouffant/JNSg bougainvillea/NgS bough/~N0g boughs/N9 bought/~VtTN bouillabaisse/NSg bouillon/NgS boulder/~NSgV boules/N boulevard/~NSg bounce/~Vd>GSNwgZ bounceback/NSg bouncer/~NgS bouncily/Ry bounciness/Nmg bouncy/~J>^p bound/~VtTGdSJNgr boundary/~NSg bounden/JV bounder/NSg boundless/~JYp boundlessness/Ng bounteous/JYp bounteousness/Ng bountiful/JYp bountifulness/Ng bounty/~NSgV bouquet/NSg bourbon/~NSg bourgeois/~JNgV bourgeoisie/~Ng bourgeoisification/Ng boustrophedon/JN bout/~NgSVP boutique/~NSg boutonniere/NgS bouzouki/NgS bovine/~JNSg bovver/NV bow/~NSgVGd>Z bowdlerisation/NgS!_₹ bowdlerise/VdSG!_₹ bowdlerization/NgS bowdlerize/VdSG bowed/~VtTJU bowel/~NSgV bower/~NgV bowl/~NgSVd>GZ bowleg/NSg bowlegged/J bowler/~Ng bowlful/NSg bowline/NSg bowling/~VNg bowman/~Ng bowmen/N9 bowsprit/NSg bowstring/NSgV bowwow/NSgV box/~NgSVGd>Zn boxcar/~NSgV boxer/~Ng boxing/~VNg boxlike/J boxroom/NS boxwood/Ng boxy/J>^ boy/~NSgV boycott/~VGdSNg boyfriend/~NgS boyhood/~Nmg boyish/JYp boyishness/Ng boysenberry/NwSgJ bozo/NgS bpm/~N bps/N bra/~NSg brace/~NgSVGd>Z bracelet/~NgSV bracer/Ng bracero/NgS bracingly/Ry bracken/~Nmg bracket/~NgSVGd bracketry/Ng brackish/~Jp brackishness/Ng bract/NgS brad/~NSgV bradawl/NS bradycardia/N brae/NSg brag/NSgVJ braggadocio/NSg braggadocious/J braggart/NSgJ bragged/VtT bragger/NgSJ bragging/NV6 braid/~VGdSNgJ braiding/V6Ng braille/~NgVJ brain/~NwgSVGd brainchild/~NgV brainchildren/9g braininess/Ng brainless/JY brainpower/Nmg brainstorm/~VdGSNg brainstorming/NgV6 brainteaser/NSg brainwash/NSVdG brainwashing/~NmgV brainwave/NS brainworm/NSg brainy/J^>p braise/NSVGd brake/~NgSVGd brakeman/Ng brakemen/N9 bramble/NgSV brambly/J bran/~Ng branch/~NgSVGd branchlike/J brand/~NgSVGd>Zr branded/~JVtTU brander/NgV brandish/VdGSN brandy/~NSgVGd brash/~J^Y>pNV brashness/Nmg brass/~NwgSJV brasserie/NgS brassiere/NgS brassily/Ry brassiness/Ng brassy/J^>pN brat/~NSgVJ bratty/J>^N bratwurst/NSg bravado/NgV brave/~JY^>pNgSVGd braveness/Ng bravery/~Ng bravo/~NSgV bravura/NSgJ brawl/~NSgVd>GZ brawler/Ng brawn/NmgV brawniness/Ng brawny/J>^p bray/~VdGSNg braze/Vd>GSNZ brazen/~JYpVSdG brazenness/Ng brazer/Ng brazier/~NSg breach/~NgSVGd bread/~NwgSVGdH breadbasket/NSg breadboard/NSgV breadbox/NgS breadcrumb/NgSV breadfruit/NwSg breadline/NgS breadth/~Ng breadths/N breadwinner/NSg break/~VbG>SNgBZ break out/V break up/V/ breakable/JNgS breakage/Nmg breakaway/~JNgS breakdown/~NgS breaker/~Ng breakfast/~NwgSVdG breakfront/NgS breakneck/JN breakout/~NgSJ breakpoint/NSg breaks out/V breakthrough/~JN0g breakthroughs/N9 breakup/~NSg breakwater/~NSg bream/NgSV breast/~NSgVdG breastbone/NgS breastfed/VtT breastfeed/VGSN breastplate/NSg breaststroke/~NSgV breastwork/NgS breath/~Nw0gSJ>VdGZB breathalyse/VGd>SZ!_₹ breathalyser/NS@ breathalyze/VGd>SZ breathe/~V breather/Ng breathing/~NgV6 breathless/JYp breathlessness/Nmg breaths/N9 breathtaking/JY breathy/J>^ bred/~VtTNi breech/~NgSJV breed/~V>GSNgZ breeder/~Ng breeding/~NgJVi breeze/~NSgVdG breezeway/NSg breezily/Ry breeziness/Ng breezy/J>^pN brethren/~NJ breve/NSg brevet/~NSgV brevetted/JVtT brevetting/V6 breviary/NSg brevity/~Ng brew/~Vd>GSNgZ brewer/~Ng brewery/~NSg brewpub/NSg briar/NSg!_₹ bribe/~NSgVd>GZ briber/Ng bribery/~Nmg brick/~NwSgJVdG brickbat/NSgV brickie/NgS bricklayer/NgS bricklaying/Nmg brickwork/~Nmg brickyard/~NgS bricolage/Nmg bridal/~NSgJ bride/~NSgV bridegroom/~NSg bridesmaid/NgSV bridge/~NwSgVdG bridgeable/JU bridgehead/~NSg bridgework/Nmg bridle/~NSgVdG bridled/VJU bridleway/NS brie/~NwgS>Z brief/~J^NSVdGez brief's briefcase/NSg briefer/NJ briefing/~NSgVe briefly/~R # adverb of duration briefness/Nmg brier/~Ng brig/~NgSV brigade/~NSgV brigadier/~NgS brigand/NSg brigandage/Ng brigantine/~NgS bright/~JY^>pNSVnX brighten/Vd>GZ brightener/NwgS brightness/~Nmg brights/Ng brill/~NJ brilliance/~Nmg brilliancy/NwgS brilliant/~JYNgS brilliantine/NgV brim/~NgSVJ brimful/JN brimless/J brimmed/JVtT brimming/V6J brimstone/Nmg brindle/NgJVd brine/~NmgV bring/~VbS>GZ bringer/Ng brininess/Ng brinjal/NwgS₹ brink/~NSg brinkmanship/~Nmg briny/J>^pN brioche/NSg briquette/NgSV brisk/~JY^>pVSdG brisket/NSg briskness/Nmg bristle/~NSgVdG bristly/J^> britches/N9g brittle/~J^>pNgV brittleness/Nmg bro/~NSgIH broach/NgSVdG broad/~J>Y^pNSgnX broad bean/NgS broadband/~NmgJ broadcast/~JNgSVGr broadcaster/~NgS broadcasting/~JNgV broadcloth/Ng broaden/~VdG broadloom/NgJ broadminded/J broadness/Nmg broadsheet/~NSgJ broadside/~NgSVGd broadsword/NSgV brocade/NSgVdG broccoli/~Nmg brochette/NSg brochure/~NgS brogan/NSg brogue/NSgV broil/Vd>GSNgZ broiler/Ng broke/~VtJN broken/~VTJYp brokenhearted/JY brokenness/Nmg broker/~JNSgVdG brokerage/~NwgS broligarchy/Nmg brolly/NS bromance/NwgS bromide/~NwSg bromidic/J bromine/~Nmg bronc/NSg bronchi/N9 bronchial/J bronchitic/JN bronchitis/Ng bronchus/N0g bronco/~NSg broncobuster/NSg brontosaur/NgS brontosaurus/NgS bronze/~NwSgJVdG brooch/NgSV brood/~NSgJ>VdGZ brooder/Ng broodily/Ry brooding/~JYVNg broodmare/NgS broody/NgJ>^p brook/~VdGSNg brooklet/NSg broom/~NSgV broomstick/NgSV broth/~N0wg>Z brothel/~NgS brother/~NSgVY brotherhood/~NgS brotherliness/Nmg broths/N9 brougham/~NSg brought/~VtT brouhaha/NSg brow/~NgSV browbeat/VSGn brown/~NwSgJ^>pVdG brownfield/NJ brownie/NwgS brownish/~J brownness/Nmg brownout/NSg brownstone/~NgS browsable/J browse/~Vd>GSNgZ browser/~NgS brr/ bruin/NSg bruise/Vd>GSNgZ bruiser/NgS bruising/~VJNg bruit/NSVdG brunch/NgSVdG brunet/JNSg brunette/~JNgS brunt/~NgV brush/~NgSVdG brushoff/NSg brushstroke/NS brushwood/Ng brushwork/Ng brusque/JY^>pV brusqueness/Ng brutal/~JY brutalisation/Ng!_₹ brutalise/VGdS!_₹ brutalism/Nmg brutalist/NgSJ brutality/~Nmg brutalization/Ng brutalize/VGdS brute/~JNSgV brute force/NwgSVdG brutish/JYp brutishness/Nmg brutus/ bu/~N bub/NSgV bubble/~NSgVdG> bubble tea/NwgS bubblegum/~NmgJ bubbly/J>^Nmg bubo/N0g buboes/N9 bubonic/J buccaneer/~NSgVGd buck/~NgSVdG buckaroo/NSg buckboard/NgS bucket/~NSgVGd bucketful/NgS buckeye/~NgS buckle/~NSVdGU buckle's buckler/NgSV buckram/NgV bucksaw/NgS buckshot/Ng buckskin/NgSJ buckteeth/N9 bucktooth/N0gd buckwheat/~Nmg buckyball/NSg bucolic/JNgSQ bud/~NwSgV budded/VtTJ budding/~JNSV6 buddy/~NSgIVJ budge/~VdGSNJ budgerigar/NgS budget/~NSgJVGd budgetary/~J budgie/NSg buff/~NgSJVdGr buffalo/~Ng09VbdG # singular and plural, also has a plural in -s below buffaloes/~N9Vh buffer/~NSgJVdG buffet/~NSgVdGz buffoon/NSgV buffoonery/Nmg buffoonish/Jp bug/~NSVe bug's bugaboo/NSg bugbear/NSgV bugfix/NgS bugged/VtTJe bugger/NSgVdG buggery/Nm bugging/V6Ne buggy/~NSgJ>^p bugle/~NSgVd>GJZ bugler/Ng build/~V>GSNgZzrB builder/~Ng building/~NwgSV buildout/NwgS buildup/~NSg built/~JVtTri built-in/NgSJ built-up/J builtin/JN bulb/~NgSV bulbous/J bulge/~NSgVdG bulgy/J>^ bulimarexia/Ng bulimia/Nmg bulimic/JNSg bulk/~NgSJVdG bulkhead/NgS bulkiness/Nmg bulky/~J>^p bull/~NgSJVdG bulldog/~NSgV bulldogged/VtT bulldogging/V6 bulldoze/VGd>SZ bulldozer/NgV bullet/~NSgVd bulletin/~NgSVdG bulletproof/~JVSdG bullfight/NSg>GZ bullfighter/Ng bullfighting/Ng bullfinch/NgS bullfrog/~NgS bullhead/NgSd bullheaded/JYp bullheadedness/Ng bullhorn/NgS bullion/~Ng bullish/JYp bullishness/Ng bullock/~NSgV bullpen/~NSg bullring/NgS bullseye/~N bullshit/~NgSJVx bullshitted/VtTx bullshitter/NSgx bullshittery/Ngx bullshitting/V6x bullwhip/NSV bully/~NSgVdGJ bulrush/NgS bulwark/NgSV bum/~NSgVJ bumbag/NS bumble/NSVd>GZ bumblebee/~NSg bumbler/Ng bumf/N bummed/VtTJ bummer/NSgJc bummest/Ju bumming/V6 bump/~NgSVd>GZ bumper/~NgJV bumph/N bumpiness/Nmg bumpkin/NgS bumptious/JYp bumptiousness/Ng bumpy/~J>^p bun/~NSgV bunch/~NgSVdG bunchy/J>^ bunco/NSgVdG bundle/~NSgVdG bundler/NgS bung/NgSVdGJ bungalow/~NgS bungee/NSgV bunghole/NgSV bungle/Vd>GSNgZ bungler/Ng bunion/NSg bunk/NSVdGJe bunk's bunker/~NSgV bunkhouse/NSg bunkum/Nmg bunny/~NSgJ bunt/~NgSVdGz bunting/~NgV bunyip/NgS # Australian mythological creature buoy/~NgSVdG buoyancy/~Ng buoyant/JY bur/~NSgY burble/NSgVdG burbs/Ng burden/~NSVGdU burden's burdensome/J burdock/Ng bureau/~NSg bureaucracy/~NSg bureaucrat/~NgS bureaucratic/~JQ bureaucratisation/Ng!_₹ bureaucratise/VGdS!_₹ bureaucratization/Ng bureaucratize/VGdS burg/~NgS>Z burgeon/NSVdG burger/~NgS burgh/~Ng>Z burgher/Ng burghs/~N burglar/~NgSV burglarise/VGdS!_₹ burglarize/VGdS burglarproof/J burglary/~NSg burgle/VdSG burgomaster/NSg burgundy/~NSgJ burial/~NSgr burka/NSg burl/~NgSVd burlap/NgV burlesque/~JNgSVGd burliness/Nmg burly/J>^p burn/~NgSVd>GZB burnable/JNSg burner/~Ng burnish/VGd>SNgZ burnisher/Ng burnoose/NgS burnout/NgS burnt/~VJU burp/NgSVdG burqa/NSg!@_₹ burr/~NgSVdG burrito/NgSV burro/NSg burrow/~NSgVd>GZ burrower/Ng bursa/~Ng bursae/9 bursar/NSg bursary/NSg bursitis/Ng burst/~VG>SNg bury/~VdGSNr bus/~NgSVr busboy/NSg busby/~NSg bused/VtT busgirl/NgS bush/~NwgSVdGJz bushcraft/NwgS bushel/NSgVGd bushelled/VtT!@_₹ bushelling/V6SN!@_₹ bushfire/NgS_ bushiness/Ng bushing/NgV bushman/Ng bushmaster/NSg bushmen/9 bushwhack/Vd>SGZ bushwhacker/Ng bushy/~J>^pN busily/Ry business/~NwgSJ businesslike/J businessman/~N0g businessmen/~N9 businessperson/N0Sg businesswoman/~N0g businesswomen/N9 busing/VNg busk/Vd>GSNZ buskin/NSg busload/NS buss/NgSVdG bussing/V6Ng!_₹ bust/~Vd>GSNgJZ buster/~Ng bustle/NSgVdG busty/J>^Z busy/~J^>pNSVdG busybody/NSgV busyness/Ng busywork/Ng but/~PCNSre # removed `4` verb: archaic butane/Ng butch/~J>NgSVZ butcher/~NgVdGJ butchery/NwSg butler/~NSgV butt/~NgSVd>GZ butte/~NSg butted/VtTJr butter/~NgVdG butterball/NgS buttercream/Nmg buttercup/NSg butterfat/Nmg butterfingered/J butterfingers/Ng butterfly/~NSgVGd buttermilk/Nmg butternut/NSg butterscotch/NgJ buttery/J^>NSg butting/V6Nr buttock/NSg button/~NSVdGU button's buttonhole/NSgVdG buttonwood/NgS buttress/NgSVdG butty/NSVJ buxom/J buy/~VG>SNgZ buy back/V/ buy out/V/ buyback/NSg buyer/~Ng buyout/~NSg buzz/~NgSVd>GZ buzzard/~NgS buzzcut/NgS buzzer/Ng buzzkill/NSg buzzword/NSg bx/~N bxs/N by/~PNg # removed adjective sense bye/~NSgJP bygone/JNSg bylaw/NSg byline/NSgV bypass/~NgSVGdB bypath/Ng bypaths/N byplay/Ng byproduct/~NgS byre/NS byroad/NSg bystander/NgS byte/~NgS bytecode/NwgS byway/~NSg byword/NSg byzantine/~JN c/~NSViE ca/P cab/~NSgV>Z cabal/~NgSV cabala's caballero/~NgS cabana/~NSg cabaret/~NSg cabbage/~NwgSV cabbed/VtT cabbing/V6N cabby/NSg cabdriver/NSg cabin/~NgSV cabinet/~NSg cabinetmaker/NgS cabinetmaking/Ng cabinetry/Ng cabinetwork/Ng cable/~NwgSVGd cablecast/NgSVGJ cablegram/NgSV cabochon/NSg caboodle/Ng caboose/NSg cabriolet/NSg cabstand/NSg cacao/NgS cache/~NgSVGd cacheable/J cachepot/NSg cachet/NgSV cackle/NgSVGd>Z cackler/Ng cacophonous/J cacophony/NwSg cacti/~N9 cactus/~N0wgJ cad/~NSg cadaver/NSg cadaverous/J caddie/NgSVd caddish/JYp caddishness/Nmg caddy/NSg caddying/V cadence/~NwSgVd cadenza/NSg cadet/~NgS cadge/NSVGd>Z cadger/Ng cadmium/~Nmg cadre/~NgS caducei/N9 caduceus/N0g caesium/Nmg!_₹ caesura/NSg café/NSg cafe/~NSg cafeteria/~NgS cafetiere/NS caff/NSe caffeinated/JV caffeine/~Nwg caftan/NgS cage/~NSgVdG cagey/J cagier/Jc cagiest/Ju cagily/Ry caginess/Ng cagoule/NS cahoot/NgSV caiman/~NgS cairn/~NgS caisson/~NSg caitiff/NSgJ cajole/VGd>SNZL cajolement/Ng cajoler/Ng cajolery/Ng cake/~NwSgVdG cakewalk/NSgV cal/~N calabash/NgS calaboose/NSg calamari/NSg calamine/NgV calamitous/JY calamity/~NSg calcareous/~J calciferous/J calcification/Ng calcify/VGdSn calcimine/NSgVdG calcine/VdGSN calcite/Nmg calcium/~Nmg calculable/Ji calculate/~VGdSrnvX calculated/~VtTJY calculating/~V6JY calculation/~Ngr calculator/~NSg calculi/N calculus/~Ng caldera/~NSg calendar/~NgSVdG calf/~Ng calfskin/Ng caliber/~NSg< calibrate/VGdSnXr calibration/~Ngr calibrator/NSg calibre/NSg!@_₹ calico/N0gJ calicoes/N9 californium/Nmg caliper/NSgVGd caliph/~N0g caliphate/~NgS caliphs/N9 calisthenic/JS calisthenics/Nmg calk/NSgVGd call/~VGdSNgr call stack/NgS calla/NgS callable/JN callback/NgS called/~VtTJU callee/NgS caller/~NgS calligrapher/~NSg calligraphic/J calligraphist/NgS calligraphy/~Nmg calling/~V6SNg calliope/~NgS callisthenic/JS!_₹ callosity/NSg callous/~JYpNSVGd callousness/Nmg callout/NgS # Cambridge (also), Websters call out/V/ # Cambridge, Collins, Websters, Longman, Oxford call-out/NgS # American Heritage, Cambridge, Longman, OED, Oxford callow/J>^pN callowness/Ng callus/NgSVdG calm/~J^Y>pNSgVGd calmness/Nmg caloric/JN calorie/NgS calorific/J calque/NSgVdG calumet/~NgS calumniate/VGdSn calumniation/Ng calumniator/NgS calumnious/J calumny/NSgV calve/VGdS calypso/~NgSV calyx/NgS cam/~NSgV camaraderie/Ng camber/~NgSVdG cambial/J cambium/NwSg cambric/Ng camcorder/NSgV came/~VtPN camel/~NgSJ camel case/Nmg camelhair/N camellia/NgS cameo/~NgSV camera/~NgS cameraman/~N0g cameramen/N9 camerapeople/N9 cameraperson/N0 camerawoman/N0g camerawomen/N9 camerawork/Nmg camiknickers/N camisole/NSgV camouflage/~NgSVGd>Z camouflager/Ng camp/~NSVGdJe camp's campaign/~NSgVd>GZ campaigner/~Ng campanile/NSg campanologist/NgS campanology/Nmg camper/NgSJ campfire/~NSg campground/~NSg camphor/Nmg camping/~VNmg campsite/~NSg campus/~NgSV campy/J^> camshaft/~NSg can/~NSgAd>GZ can't/~VA canal/~NgSV canalisation/Nmg!_₹ canalise/VGdS!_₹ canalization/Nmg canalize/VGdS canape/NgS canard/NgS canary/~NSgJV canasta/Nmg cancan/NgSV cancel/~Vd>GSNZ canceler/NgS cancellable/J cancellation/~NwSg cancelled/VtTJ!@_₹ canceller/NSg!@_₹ cancelling/V6!@_₹ cancellous/J!@_₹ cancelous cancer/~NwgSJ cancerous/~J candelabra/N9Sg candelabrum/N0g candid/~JYpN candida/N candidacy/~NwSg candidate/~NgSV candidature/NSg candidness/Nmg candle/~NgSVGd>Z candlelight/Nmg candlelit/J candlepower/Nmg candler/Ng candlestick/~NgSV candlewick/NSg candor/Nmg candour/Ng!@_₹ candy/~NwSgVGd candyfloss/N cane/~NwSgV canebrake/NgS caner/Ng canine/~JNgS canister/NSgV canker/NgSVGd cankerous/J cannabinoid/NSg cannabis/~NgS canned/~JVtT cannelloni/Ng cannery/~NSg cannibal/~NSg cannibalisation/Ng!_₹ cannibalise/VGdS!_₹ cannibalism/~Ng cannibalistic/J cannibalization/Ng cannibalize/VGdS cannily/RyU canniness/Ng canning/~V6N cannon/~NgS09VGdJ # singular and plural, also has a plural in -s cannonade/NgSVGd cannonball/~NSgV cannot/~VAN canny/J^>U canoe/~NgSVd canoeing/~NV6 canoeist/NSg canola/Ng canon/~NgSJ canonical/~JYN canonicalise/VGdS!_₹ canonicalize/VGdS canonisation/NgS!_₹ canonise/VdSG!_₹ canonization/~NSg canonize/VdSG canoodle/VdGSN canopy/~NSgVGd canst/V cant/~NSV>dGJeZ cant's cantabile/NJ cantaloupe/NSg cantankerous/JYp cantankerousness/Ng cantata/~NgS canteen/~NgS canter/NgVe cantered/VtT cantering/V6N canticle/NgS cantilever/~NgSVdG canto/~NgS canton/~NgSVL cantonal/~J cantonment/~NgS cantor/~NgS cantrail/NgS canvas/~NgSVGd canvasback/NSg canvass/Vd>GSNgZ canvasser/Ng canyon/~NgSVG cap/~NSgVd>BZ capabilities/~N9 capability/~N0wgi capable/~Ji capably/Ryi capacious/JYp capaciousness/Nmg capacitance/~Nmg capacities/~9 capacitive/JY capacitor/~NSg capacity/~NwgJi caparison/NgSVdG cape/~NSgV caper/~NgVGd capeskin/Nwg capillarity/Ng capillary/~JNSg capital/~NwgSJY capitalisation/Ng!_₹ capitalise/VdSGr!_₹ capitalism/~Nmg capitalist/~JNSg capitalistic/JQ capitalization/~Nmg capitalize/~VdSGr capitation/NSge capitol/~NSg capitulate/VdSGrXn capitulation/~Nmgr caplet/NgS capo/~NSg capoeira/Nmg capon/NgSV capped/~JVtTUr capping/V6NUr cappuccino/NwSg caprice/NSg capricious/JYp capriciousness/Nmg capsicum/NwSg_ # term for bell/red/green pepper in Australian English capsize/VdGSN capstan/NSg capstone/NgSV capsular/J capsule/~NSgVdG capsulise/VdSG!_₹ capsulize/VdSG capt/~NV captain/~NSgVdG captaincy/~NSg caption/~NSgVdG captious/JYp captiousness/Ng captivate/VdSGJn captivation/Ng captivator/NSg captive/~NSgJV captivity/~NwSg captor/NgS capture/~NwSgVdGr car/~NSg #d>ZG car bomb/NgS car-bomb/V carafe/NgS caramel/~NwSgJV caramelise/VdSG!_₹ caramelize/VdSG carapace/NSg carat/NgS caravan/~NSgV caravansary/NSg caravel/NSg caraway/NSg carb/NSg carbide/~NSg carbine/~NSg carbohydrate/~NSg carbolic/JN carbon/~NmgSV carbon-intensive/J carbonaceous/J carbonate/~NwgSVGdn carbonation/Ng carboniferous/~J carbonise/VGdS!_₹ carbonize/VGdS carborundum/Ng carboy/NgSV carbuncle/NSg carbuncular/J carburet/VSd carburetor/~NSg< carburetted/V carburettor/NgS!@_₹ carby/NgS carcass/~NgS carcinogen/~NSg carcinogenic/~JNgS carcinogenicity/Ng carcinoma/~NgS card/~NwSgVGdE cardamom/Nmg cardamon/Nmg cardboard/~NmgJ carder/NgS cardholder/NSg cardiac/~JN cardiae/N!@_₹ cardie/NS cardies/N!@_₹ cardigan/~NSg cardinal/~JYNSg cardinality/Nmg cardio/JNmg cardiogram/NSg cardiograph/N0g cardiographs/N9 cardiologist/NgS cardiology/Nmg cardiomyopathy/~Nmg cardiopulmonary/J cardiovascular/~J cardsharp/NgS>Z cardsharper/Ng care/~NwSgV>GZ # not using '/d' since it marsk the past form as an adjective cared/VtT careen/VdGSN career/~NgSVdGJ careerism/N careerist/NSgJ carefree/J careful/~JYp carefuller/Jc carefullest/Ju carefulness/Nmg caregiver/NSg careless/~JYp carelessness/Nmg carer/Ng caress/NgSVdG caret/NgS caretaker/~NgSJ careworn/J carfare/NwgS cargo/~N0gV cargoes/~N9 carhop/NgSV caribou/~NSg caricature/~NgSJVGd caricaturisation/NgS caricaturist/NSg caries/~NgV carillon/~NSgV caring/~JVNg carious/J carjack/VSd>GzZ carjacker/Ng carjacking/VNg carload/NSg carmaker/NS carmine/~NSgJ carnage/~Ng carnal/~JY carnality/Ng carnation/NgSJi carnelian/NgS carnival/~NgSV carnivora carnivore/NSg carnivorous/~JYp carnivorousness/Nmg carny/NSgV carob/NgS carol/~NgSVGd>Z caroler/Ng carolled/VtT!@_₹ caroller/NgS!@_₹ carolling/V6N!@_₹ carom/NgSVGd carotene/Ng carotid/NSgJ carousal/NSg carouse/Vd>GSNgZ carousel/~NSgV carouser/Ng carp/~NSg09VGd>Z # singular and plural, also has a plural in -s carpal/NgSJ carpel/NgS carpenter/~NgSVdG carpentry/~Ng carper/Ng carpet/~NgSVdG carpetbag/NgSVJ carpetbagged/VtT carpetbagger/NgS carpetbagging/V6 carpeting/~NgV carpi/~N carpool/NSgVdG carport/NSg carpus/Ng carrel/NgS carriage/~NSg carriageway/~NS carrier/~Ng carrion/~NgJ carrot/~NwgSV carroty/J carry/~VGd>SNgZ carry out/V/ carryall/NSg carrycot/NS carryout/N carryover/NgS carsick/Jp carsickness/Ng cart/~NSgVGd>Z cartage/Ng carte blanche/Nmg cartel/~NgS carter/~Ng carthorse/NSg cartilage/~NwSg cartilaginous/J cartload/NSg cartographer/~NSg cartographic/~J cartography/~Nmg carton/NgSV cartoon/~NSgVdG cartoonish/JY cartoonist/~NgS cartridge/~NgS cartwheel/NgSVGd carve/~VGd>SNzZ carver/~Ng carvery/NS carving/~NgV caryatid/NgS casaba/NgS cascade/~NSgVdG cascara/NSg case/~NwSgVdGLz # removed `5` adj. rare poker sense only casebook/~NSJ cased/VtTJU caseharden/VdGS casein/Nmg caseload/NgS casement/NgS casework/Ng>Z caseworker/Ng cash/~NmgSVGdJ cash flow/NgS cash-strapped/J cashback/Ng cashbook/NgS cashew/NwgS cashier/VGdSNg cashless/J cashmere/~Nmg casing/~NgV casino/~NgS cask/~NSgV casket/~NwgSV cassava/~NSg casserole/NwSgVdG cassette/~NgSV cassia/~NgS cassock/NSg cassowary/NSg cast/~VGSNgJr castanet/NgS castaway/JNgS caste/~NgS>zZ castellated/J caster/~NgV castigate/VdSGn castigation/Nmg castigator/NSg casting/~VSNwgr castle/~NgSVGd castoff/NSgJ castor/~NgS castrate/NSVGdnX castration/Ng casual/~JYpNgS casualness/Nmg casualty/~NSg casuist/NSg casuistic/J casuistry/Nmg cat/~NSgVJ cataclysm/~NgS cataclysmal/J cataclysmic/J catacomb/NSg catafalque/NgS catalepsy/Nmg cataleptic/JNgS catalog/~NSgVGd>Z cataloger/Ng catalogue/NSgVd>GZ!@_₹ catalogued/JVtTU!@_₹ cataloguer/Ng!@_₹ catalpa/NSg catalyse/VbGdS!_₹ catalyses/NVh catalysis/~Nmg catalyst/~NgS catalytic/~J catalyze/VGdS catamaran/NSg catapult/~NgSVGd cataract/~NgS catarrh/Ng catastrophe/~NgS catastrophic/~JQ catastrophize/VdSG catatonia/Ng catatonic/JNSg catbird/~NSg catboat/NSg catcall/NSgVGd catch/~NgSVG>ZzL catchall/NgS catcher/~Ng catchment/~NgSV catchpenny/N catchphrase/~NSg catchword/NgS catchy/~J>^ catechise/VdSG!_₹ catechism/~NSg catechist/NSg catechize/VdSG categorical/~JYN categorisation/NSg!_₹ categorise/VGdS!_₹ categorization/~NgS categorize/~VGdS category/~NSg cater/~VGd>SNZz catercorner/J caterer/Ng caterpillar/~NgSV caterwaul/VdGSNg catfish/~N09gSV # singular and plural, also has a plural in -s catgut/Ng catharses/N9 catharsis/Nm0g cathartic/JNSg cathedral/~JNOSg catheter/NSg catheterise/VdSG!_₹ catheterize/VdSG cathode/~NSg cathodic/J catholic/~J catholicity/Ng cation/~NgS catkin/NgS catlike/J catnap/NgSV catnapped/VtT catnapping/NV6 catnip/Nmg catsuit/NSg cattail/NSg catted/VtT cattery/NS cattily/Ry cattiness/Ng catting/V6 cattle/~NmgV cattleman/Ng cattlemen/N9 catty/J^>pN catwalk/NSg caucus/~NgSVdG caudal/~JYN caught/~JVtTU cauldron/~NgS cauliflower/~NwSgV caulk/NgSVGd>Z caulker/Ng causal/~JYN causality/~Nmg causation/~Nmg causative/~JN cause/~NwgSVGd>CZ causeless/J causer/NgS causerie/NSg causeway/~NSgV caustic/~JNSgQ causticity/Ng cauterisation/Nmg!_₹ cauterise/VGdS!_₹ cauterization/Nmg cauterize/VGdS caution/~NwSgVdG cautionary/~J cautious/~JYi cautiousness/Nmg cavalcade/NgSV cavalier/~JYNSgV cavalry/~NSg cavalryman/N0g cavalrymen/~N9 cave/~NSgVd>GZ caveat/NgSV caveman/N0g cavemen/N9 cavern/~NgSV cavernous/JY caviar/Nmg cavil/VGd>SNgZz@ caviler/Ng cavilled/VtT!@_₹ caviller/NgS!@_₹ cavilling/V6SN!@_₹ caving/NgV cavitation/N cavity/~NSgW cavort/VdGS caw/NSgVdG cay/~NSge cayenne/~Ng cayuse/NgS cc/~NV cease/~VGdSNge ceasefire/~NgS ceaseless/JYp ceaselessness/Nmg ceca/N cecal/J cecum/Ng cedar/~NwgS cede/~VGSdWr ceder/NgS cedilla/NSg ceilidh/NV ceilidhs/NV ceiling/~NgSV celandine/Ng celeb/NgS celebrant/NSg celebrate/~VdSGnX celebration/~NwgS celebrator/NSg celebratory/~J celebrity/~NwSg celeriac/N celerity/Ng celery/~Nmg celesta/NgS celestial/~JYN celibacy/Nmg celibate/JNgSV cell/~NSgVd cellar/~NgSV cellist/~NSg cellmate/NSg cello/~NgS cellophane/NmgV cellphone/~NgSV cellular/~JNSg cellulite/Nmg cellulitis/Nm celluloid/Nmg cellulose/~NmgJ cement/~NwgSVd>GZ cementer/Ng cementum/Ng cemetery/~NSg cenobite/NgS cenobitic/J cenotaph/~Ng cenotaphs/N censer/NgS censor/~NgSVdG censored/~JVtTU censorial/J censorious/JYp censoriousness/Ng censorship/~Ng censure/~NSgVd>GBZ censurer/Ng census/~NgSVdG cent/~NSg>Z centaur/~NSg centavo/NSg centenarian/NgSJ centenary/~JNSgV centennial/~JYNgS center/~NgJVdG< centerboard/NSg< centerfold/NgS< centerpiece/~NgS< # centi # prefixes that are not also words in their own right don't belong in the dictionary centigrade/JN centigram/NSg centiliter/NgS< centilitre/NgS!@_₹ centime/NSg centimeter/NgS< centimetre/NgS!@_₹ centipede/NSg central/~JYNSg centralisation/Nge!_₹ centralise/VGdSe!_₹ centraliser/NgS!_₹ centralism/N centralist/NJ centrality/Ng centralization/Nge centralize/VGdSe centralizer/NgS centre/NgSVGd!@_₹ centre-left/NgS!@_₹ centre-left/J!@_₹ centre-right/NgS!@_₹ centre-right/J!@_₹ centreboard/NSg!@_₹ centrefold/NSg!@_₹ centrepiece/NSg!@_₹ centric/~J centrifugal/~JYN centrifuge/~NSgVdG centripetal/JY centrism/Ng centrist/~JNgS centroid/NgS centurion/~NSg century/~NSg cephalic/J ceramic/~JNSg ceramicist/NSg ceramics/~Ng ceramist/NgS cereal/~NwgS cerebellar/J cerebellum/~NSg cerebra/N cerebral/~J cerebrate/VGdSn cerebration/Ng cerebrovascular/J cerebrum/NgS cerement/NgS ceremonial/~JYNSg ceremonious/JYU ceremoniousness/Ng ceremony/~NwSg cerise/NgJ cerium/Nmg cermet/Ng cert/~JNS certain/~JIU certainly/R # adverb of probability/certainty; modal adverb certainty/~NSgU certifiable/JN certifiably/Ry certificate/~NgSVGdnX certification/~Ng certify/~VdSG certitude/Ngi certitudes/N cerulean/NgJ cervical/~JN cervices/N9 cervix/N0g cesarean/JNgS cesium/Nmg cessation/~NgS cession/NSgKrW cesspit/NSg cesspool/NgS cetacean/JNgS ceteris cf/~V cg/~ chad/~NS chafe/NSVGd chaff/NgSVGd chaffinch/NgS chagrin/~NSgVGdJ chain/~NwSVGdU chain's chainable/J chainsaw/~NgSVdG chair/~NgSVGd chairlift/NgS chairman/~N0gV chairmanship/~NwSg chairmen/~N9 chairperson/~N0Sg chairwoman/~N0g chairwomen/N9 chaise/NgS chalcedony/Ng chalet/~NgS chalice/~NSg chalk/~NmgSVGd chalkboard/NSgV chalkiness/Nmg chalky/J>^p challenge/~NwSgVd>GZ challenged/~JVtTU challenger/~NgS challis/Ng chamber/~NSgVdG chamberlain/~NgS chambermaid/NgS chambray/Nmg chameleon/~NSgJ chamfer/NgSVdG chamois/NmgJV chamomile/NwgS champ/~NgSVGdZ champagne/~NwgSJV champion/~NgSJVGd championship/~NgS chance/~NgSJVGd chancel/~NSg chancellery/~NSg chancellor/~NgS chancellorship/Ng chancery/~NSg chanciness/Ng chancre/NSg chancy/J>^p chandelier/~NSg chandler/~NgS change/~VGd>SNwgZ changeability/Nmg changeable/Jp changeableness/Nmg changeably/Ry changed/~JVtTU changeless/JY changeling/~NSgJ changelog/Sg changeover/NSg changer/~Ng changing/~V6NU channel/~NSgVGd channelisation/Ng!_₹ channelise/VdSG!_₹ channelization/Ng channelize/VdSG channelled/JVtT!@_₹ channelling/V6N!@_₹ chanson/NSg chant/~VGd>SNgZ chanter/Ng chanteuse/NgS chantey/NSg chanticleer/NgSV chaos/~Nm☁g chaotic/~JNQ chap/~NSgV chaparral/~NSg chapati/NS chapatti/NS chapbook/NgS chapeau/NSg chapel/~NgSJV chaperon/NgSVdG chaperonage/Ng chaperone/NSgVdG!@_₹ chaperoned/JVtTU chaplain/~NgS chaplaincy/NSg chaplet/NSg chapped/JVtT chapping/V6 chappy/NSJ chapstick/NgS chapter/~NSgVdG char/~VSNg charabanc/NgSV character/~NwgSV characterful/J characterisation/NwSg!_₹ characterise/VdSG!_₹ characteristic/~JNSg characteristically/~RyU characterization/~NwgS characterize/~VdSG characterless/J charade/~NSgV charbroil/VGdS charcoal/~NwgSJV chard/~Ng chardonnay/NSg charge/~NwSgVdGrE chargeable/Jr charged/~VtTJU charger/~NSg charily/Ry chariness/Ng chariot/~NSgV charioteer/NgSV charisma/~Ng charismatic/~JNgSQ charitable/~Jp charitableness/Ng charitably/RyU charity/~NSg charlady/NS charlatan/NSg charlatanism/Nmg charlatanry/Ng charlie/~NS charm/~NwgSVGd>Z charmer/Ng charming/~JYVN charmless/J charred/VtTJ charring/V6N chart/~NgSVGd charted/~JVtTU charter/~NSJVGdr charter's charterer/NgS chartreuse/NgJ charwoman/N0g charwomen/N9 chary/J^>p chase/~NgVGd>Z chaser/~NgS chases/~Vh chasm/NgS chassis/~Ng09 # singular and plural chaste/JY^>p chasten/VdGS chasteness/Nmg chastise/Vd>SGZL chastisement/NSg chastiser/Ng chastity/~Nmg chasuble/NSg chat/~VSNwg chatbot/NSg chateau/~N0Sg chateaux/N9 chatelaine/NSg chatline/NSg chatroom/NgS chatted/VtT chattel/NgS chatter/NgSVd>GZ chatterbox/NgS chatterer/Ng chattily/Ry chattiness/Nmg chatting/V6N chatty/J^>pN chauffeur/~NgSVGd chauvinism/Nmg chauvinist/JNSg chauvinistic/JQ cheap/~NJ^Y>pVXn cheapen/VdG cheapness/Ng cheapo/JN cheapskate/NgS cheat/~VGd>SNgZ cheat sheet/NgS cheater/NgS check/~NgSVGdJr check in/V/ check out/V/ checkbook/NSg checkbox/NS checked/~JVtTU checker/~NgSVdG checkerboard/NSgV checkers/~NgV checklist/~NgSV checkmate/NgSVGd checkoff/NSg checkout/~NSg checkpoint/~NSgVdG checkroom/NgS checksum/NgSVdG checkup/NgS cheddar/NwSgV cheek/~NgSVGd cheekbone/NSg cheekily/Ry cheekiness/Nmg cheeky/J^>p cheep/VGdSNg cheer/~NgSVGd>Z cheerer/Ng cheerful/~JYp cheerfuller/Jc cheerfullest/Ju cheerfulness/Nmg cheerily/Ry cheeriness/Nmg cheerio/NgS cheerleader/~NSg cheerleading/~V cheerless/JYp cheerlessness/Nmg cheery/J^>p cheese/~NwgSVGd cheeseboard/NS cheeseburger/NSg cheesecake/NSg cheesecloth/Ng cheeseparing/VJNg cheesiness/Ng cheesy/~J^>p cheetah/~Ng cheetahs/N chef/~NSgV chem/~NJ chemical/~JYNSg cheminformatics/Nmg chemise/NgS chemist/~NgS chemistry/~Nmg chemo/NmgV chemotherapeutic/JN chemotherapy/~Ng chemurgy/Ng chenille/Ng cheque/NgSJ>GdZ!@_₹ chequebook/NgS!@_₹ chequer/NgVdG!_₹ chequerboard/NgSV!@_₹ chequers/Nmg!_₹ cherish/VdSG cheroot/NgS cherry/~NwSgJ chert/Ng cherub/N0gS cherubic/J cherubim/N9 chervil/Ng chess/~Nmg chessboard/NgS chessman/Ng chessmen/9 chest/~NgSVd chesterfield/~NSg chestful/NSg chestnut/~NSgJ chesty/J^> chevalier/~NSg cheviot/~Ng chevron/~NgSV chew/~VGd>SNgZ chewer/Ng chewiness/Ng chewy/J^>pN chg/N chge/N chi/~NSg chiaroscuro/NgJ chic/~J^>pNg chicane/NgSV chicanery/NSg chichi/JNgS chick/~NgSVXn chickadee/NSg chicken/~NwgJVdG chickenfeed/Ng chickenhearted/J chickenpox/Ng chickenshit/JNSx chickpea/NSg chickweed/Ng chicle/Ng chiclet/NgS chicness/Ng chicory/NSg chide/VGdS chiding/V6NJY chief/~NgSJ^Y>V chiefdom/Ng chieftain/~NgS chieftainship/NSg chiffon/Ng chiffonier/NgS chigger/NgS chignon/NgS chihuahua/~NSg chilblain/NSg child/~NgV childbearing/NgJ childbirth/~Nmg childbirths/N childcare/Nmg childhood/~NSg childish/~JYp childishness/Nmg childless/~Jp childlessness/Nmg childlike/~J childminder/NSg childminding/NV childproof/JVGSd children/~9g chili/~N0wg chilies/N9 chill/~NwgSJ^>pVGdzZ chiller/NgJc chilli/Nmg^>p!_₹ chilliness/Nmg chilling/~JYV6N chillness/Nmg chilly/~J^>pN chime/~NgSVGd>Z chimer/NgS chimera/NgS chimeric/J chimerical/J chimney/~NgSV chimp/~NgSV chimpanzee/~NSg chin/~NSgV china/~Nmg chinaware/Nwg chinchilla/NgS chine/NgSV chink/NgSVGd chinless/J chinned/VtTJ chinning/V6 chino/~NgS chinstrap/NgS chintz/Ng chintzy/J>^ chinwag/NSV chip/~NSgV chipboard/N chipmaker/NgS chipmaking/Ng chipmunk/NSgV chipolata/NS chipped/VtTJ chipper/JNgSV chippie/N chipping/~V6SN chippy/NSJV chipset/NgS chirography/Nmg chiropodist/NgS chiropody/Ng chiropractic/NSgJ chiropractor/NSg chirp/NgSVGd chirpily/Ry chirpy/J^>pN chirrup/VGdSNg chisel/~NgSVGd>Z chiseler/Ng chiselled/VtTJ!@_₹ chiseller/NgS!@_₹ chiselling/V6N!@_₹ chit/~NSgV chitchat/NSgV chitchatted/VtT chitchatting/V6 chitin/Nmg chitinous/J chitosan/N chitterlings/Ng chivalrous/JYp chivalrousness/Ng chivalry/~Nmg chive/NgSV chivy/NSVGd chlamydia/Nw0gS chlamydiae/N9 chloral/Ng chlordane/Ng chloride/~NwgS chlorinate/VGdSn chlorination/~Nmg chlorine/~Nmg chlorofluorocarbon/NSg chloroform/NSgVGd chlorophyll/~Nmg chloroplast/NgS chm/~ choc/NS chock/NgSVGd chockablock/J chocoholic/NSgJ chocolate/~NwgSJV chocolatey/J!@_₹ chocolaty/J choice/~NwgSJ^> choir/~NgSV choirboy/NgS choirmaster/NSg choke/~VGd>SNgZ chokecherry/NSg chokepoint/NSg choker/NgS cholecystectomy/N cholecystitis/N choler/Ng cholera/~Nmg choleric/JN cholesterol/~Nmg chomp/NgSVGd>Z chook/NwSg choose/~VG>SCNZ chooser/NgS choosiness/Nmg choosy/J^>p chop/~NSgV chophouse/NSg chopped/~JVtT chopper/~NgSVdG choppily/Ry choppiness/Ng chopping/V6NJ choppy/J^>p chopstick/NSgV choral/~JYNgS chorale/~NgS chord/~NgSV chordal/~J chordate/NSgJ chore/NgSV chorea/~Ng choreograph/Vd>GZ choreographer/~Ng choreographic/JQ choreographs/Vh choreography/~Nmg chorister/NSg chorizo/Nmg choroid/JNgS chortle/NgSVGd>Z chortler/Ng chorus/~NgSVGd chose/~VtN chosen/~VTJNm chow/~NSgVGd chowder/NwgSV chrism/Ng christen/VSGdr christening/NgSV6 christian/~NJU christology chroma/~Ng chromatic/~JQ chromatin/~Ng chromatography/~Nmg chrome/~NmgSVGd chromium/~Nmg chromoly/Nmg chromosomal/~J chromosome/~NgS chronic/~JNQ chronicle/~NSgVd>GZ chronicler/~NgS chronograph/~N0gV chronographs/~N9 chronological/~JY chronologist/NgS chronology/~NSg chronometer/NSg chrysalis/~NgSV chrysanthemum/NgS chub/~NSgV chubbiness/Ng chubby/~J^>pN chuck/~NgSVGd chuckhole/NSg chuckle/NgSVGdJ chuffed/VtTJ chug/NSgV chugged/VtT chugging/V6N chukka/NgS chum/~NSgV chummed/VtT chummily/Ry chumminess/Ng chumming/V6N chummy/J^>pN chump/NgSV chunder/NwSVGd chunk/~NgSVGd chunker/NgS chunkiness/Nmg chunky/J^>pN chunter/VdGS church/~NwgSV churchgoer/NSg churchgoing/JNg churchman/~Ng churchmen/N9 churchwarden/NgS churchwoman/N churchwomen/N9 churchyard/~NSg churl/NgS churlish/JYp churlishness/Ng churn/VGd>SNgZ churner/Ng chute/~NgSV chutney/NwgS chutzpah/Nmg chyme/Ng chyron/NgSV ciabatta/NwSg ciao/NS cicada/NgS cicatrice/NSg@ cicatrices/9 cicatrix/Ng cicerone/NSgV ciceroni/N cider/~NwS cider's cigar/~NgS cigarette/~NgSV cigarillo/NgS cilantro/Nmg cilia/N9 cilium/N0g cinch/NgSVGd cinchona/NSg cincture/NSgV cinder/~NgSVGd cine/~N cinema/~NwgS cinematic/~JN cinematographer/~NgS cinematographic/J cinematography/~Nmg cinnabar/NmgJ cinnamon/~NmgJ cipher/~NSgVGde ciphertext/~NgS cir/~ circa/~P circadian/J circle/~NgSVGd circlet/NgS circlip/NgS circuit/~NgSVdG circuital/J circuitous/JYp circuitousness/Nmg circuitry/~Nmg circuity/Ng circular/~JYNSgV circularise/VdSG!_₹ circularity/Nmg circularize/VdSG circulate/~VdSGr circulation/~NSgr circulatory/JN # circum # prefixes that are not also words in their own right don't belong in the dictionary circumcise/VdSGXn circumcised/JVtTNU circumcision/~Ng circumference/~NgSV circumferential/J circumflex/NgSJV circumlocution/NwgS circumlocutory/J circumnavigate/VGdSXn circumnavigation/~Ng circumpolar/~J circumscribe/VGdS circumscription/NwgS circumspect/JY circumspection/Nmg circumstance/~NgSVGd circumstantial/~JYN circumvent/~VdSG circumvention/Ng circus/~NgSV cirque/~NgS cirrhosis/Ng cirrhotic/JNSg cirri/N cirrus/~Ng cis/~J cisgender/~JN cistern/~NgS cit/~N citadel/~NgS citation/~NgSr cite/~VGdSNir cite's citified/VJ citizen/~NgS citizenry/~Nmg citizenship/~NwSg citric/~J citron/NgSJ citronella/Nmg citrus/~NgSJ city/~NSg cityscape/NSg citywide/~JN civet/NgS civic/~JSQ civics/~Nmg civil/~JYU civilian/~NgSJ civilisation/NSg!_₹ civilise/VGdS!_₹ civilised/VJU!_₹ civility/~Nmgi civilization/~NOwSg civilizational/J civilize/VGdS civilized/~JVU civvies/Ng ck/~ cl/~ clack/NgSVGd clad/~VJU cladding/~NmgV6 clade/~NV claim/~NSVGdeKEr claim's claimable/JNr claimant/~NgS claimed/~VtTU claimer/NSgEe clairvoyance/Ng clairvoyant/JNgS clam/~NSgVJ clambake/NgSJV clamber/VGd>SNgZ clamberer/Ng clammed/VtT clammily/Ry clamminess/Ng clamming/V6J clammy/J^>p clamor/NgSVGd clamorous/J clamour/NgSVGd!@_₹ clamp/~NgSVGd clampdown/NgS clamshell/NgS clan/~NSg clandestine/~JY clang/NgSVGd>Z clangor/NgV clangorous/JY clangour/NgV!@_₹ clank/~NgSVGd clannish/Jp clannishness/Nmg clansman/N0g clansmen/N9 clanswoman/N0 clanswomen/N9 clap/~NSgV clapboard/NgSVdG clapped/VtTJ clapper/~NgSV clapperboard/NSV clapping/V6Nmg claptrap/Nmg claque/NgS claret/NmgSJV clarification/~Nmg clarifier/NgS clarify/~VdSGXn clarinet/~NSg clarinetist/~NSg clarinettist/NgS!_₹ clarion/~NgSJVdG clarity/~Nmg clash/~NgSVGd clasp/~NSVGdU clasp's class/~NwgSVGdJ classic/~JNg classical/~JYNg classicism/~Nmg classicist/~NgS classics/Nw9 classifiable/J classification/~N0wger classifications/~N9 classified/~VtTJNU classified's classifieds/N classifier/NgS classify/~VSdGren classiness/Nmg classism/Nmg classless/Jp classman/N0g classmate/~NgS classmen/N9 classroom/~NgS classwork/Nmg classy/J^>p clatter/VGdSNg clausal/J clause/~NgSV claustrophobia/Nmg claustrophobic/JN clavichord/NSg clavicle/NgS clavier/NgS claw/~NSVGde claw's clay/~NmgV clayey/J clayier/Jc clayiest/Ju claymation/Nmg clean/~J^Y>pNSVGdBzZ clean up/V/ cleaner/~NgJ cleaning/~V6Ng cleanliness/~NmgU cleanly/J^>pRyU cleanness/NgU cleanse/VGd>SNZ cleanser/Ng cleanup/~NgS clear/~J^Y>pVGdSNgz # clearly is also a sentence adverb clear-sighted/J clearance/~NSg clearheaded/J clearing/~V6Nwg clearinghouse/~NSg clearness/Ng clearway/NS cleat/NgSV cleavage/~NgS cleave/~VGd>SNZ cleaver/Ng clef/~NSg cleft/~NgSVJ clematis/NgS clemency/~Nmgi clement/~JY clementine/NS clench/VGdSNg clerestory/NSg clergy/~NSg clergyman/~Ng clergymen/~9 clergywoman/Ng clergywomen/9 cleric/~NgSJ clerical/~JYN clericalism/Ng clerk/~NgSVGd clerkship/Ng clever/~J^>Yp cleverness/Ng clevis/NgS clew/NSgVGd cliché/~NgSVG cliche/NgSVdG clichéd/VJ click/~NgSVGd>BZ click-through/NwgS clickbait/NV clicker/Ng clickjack/VSGd clicky/J>^ client/~NgS clientele/~NgS clientelism/Nmg cliff/~NgS cliffhanger/~NSg cliffhanging/VJ clifftop/NSg clii climacteric/JNg climactic/~J climate/~NwSgV climatic/~JQ climatologist/NSg climatology/Nmg climax/~NgSVdG climb/~Vd>GSNgZB climbdown/NgS climber/~NgV climbing/~NgVJ clime/NSgV clinch/~Vd>GSNgZ clincher/Ng cling/~NSgV>GZ clinger/Ng clingfilm/N clingy/J>^ clinic/~NSg clinical/~JYN clinician/NSg clink/NSgVd>GZ clinker/NgV cliometric/JS cliometrician/NgS cliometrics/Ng clip/~VSNg clipboard/NgSV clippable/J clipped/~VtTJ clipper/~NSgV clipping/~V6SNwgJ clique/~NSgV cliquey/J cliquish/JYp cliquishness/Ng clit/NSgV clitic/NSg clitoral/J clitorides/N clitoris/NgS clix cloaca/N0g cloacae/N9 cloak/~NSVdGU cloak's cloakroom/NgS clobber/VdGSNg cloche/NSg clock/~NSgVdG clockwise/~J clockwork/~NmgJ clod/NgSV cloddish/J clodhopper/NgS clog/~NSVU clog's clogged/VtTJU clogging/V6NU cloisonne/Ng cloister/~NSgVdG cloistral/J clomp/NSVdG clonal/J clone/~NSgVdGB clonidine/N clonk/NSgVdG clop/NgSV clopped/VtT clopping/V6N close/~Vd>GSNgJY^pz closed circuit/NgS closed-circuit/J closefisted/J closemouthed/J closeness/~Ng closeout/NgS closer/~JNS closet/~NSgJVdG closeup/NSg closing/~NgJV closure/~NSgVE clot/~NgSV cloth/~NgS clothe/VdSGU clotheshorse/NgS clothesline/NSgV clothespin/NSgV clothier/NgS clothing/~VNmg cloths/~N clotted/VtTJ clotting/V6N cloture/NSgV cloud/~NwSgVdG cloudburst/NSg clouded/JVtTU cloudiness/Nmg cloudless/J cloudy/~J>^p clout/NSgVdG clove/NSgV>Z cloven/VJ clover/~Ng cloverleaf/~JNSgV cloverleaves/N clown/~NSgVdG clownish/JYp clownishness/Nmg cloy/VdGS cloying/VJY club/~NgSV clubbable/J clubbed/VtTJ clubber/NS clubbing/V6N clubfeet/9 clubfoot/Ngd clubhouse/~NSg clubland/N cluck/NSgVdG clue/~NgSVGd clueless/J clump/NSgVdG clumpy/J^> clumsily/Ry clumsiness/Ng clumsy/~J^>pN clung/VJ clunk/NSgVd>GZ clunker/Ng clunky/J^>p cluster/~NgSVdG clutch/~VGdSNgJ clutter/~NSVdGU clutter's clvi clvii clxi clxii clxiv clxix clxvi clxvii cm/~ cnidarian/NgS co/~NSI(dE coach/~NgSVdG coachload/NS coachman/N0g coachmen/N9 coachwork/Nm coadjutor/~NgS coagulant/JNgS coagulate/VGdSJNn coagulation/Ng coagulator/NgS coal/~NwgSVdGJ coalesce/VGdS coalescence/Ng coalescent/JN coalface/NgS coalfield/~NS coalition/~NgS coalitionist/NgSJ coalmine/NS coarse/~J>Y^p coarsen/VSdG coarseness/Ng coast/~NSgVd>GZ coastal/~J coaster/~Ng coastguard/NS coastline/~NgS coat/~NgSVdGz coating/~NmSgV coatroom/NS coattail/NSgV coauthor/~NgSVdG coax/Vd>GSNmJZ coaxer/Ng coaxial/~JYN coaxing/V6NJY cob/NSgV cobalt/~mg cobber/NS cobble/NSgVd>GZ cobbler/~Ng cobblestone/NSg cobnut/NS cobra/~NSg cobweb/NSg cobwebbed/J cobwebby/J>^ coca/~Ng cocaine/~Nmg cocci/NS coccus/Ng coccyges/N coccyx/Ng cochineal/NgJ cochlea/NSg cochleae/9 cochlear/~J cock/~NOSgVdG cockade/NSg cockamamie/NJ cockatiel/NgS cockatoo/NSg cockatrice/NSg cockchafer/NS cockcrow/NSg cockerel/NSg cockeyed/J cockfight/NgSVG cockfighting/NgV cockily/Ry cockiness/Ng cockle/NSgV cockleshell/NSg cockney/~NOSgJ cockpit/~NSg cockroach/NgS cockscomb/NSg cocksucker/NgSx cocksure/J cocktail/~NgSJV cocky/J^>pNV coco/~NgS cocoa/~NwSgJ coconut/~NwSg cocoon/~NSgVdG cod/~NSg09JV # singular and plural, also has a plural in -s coda/~NgS codded/VtT codding/V6J coddle/VdGSN code/~NwSVGd>eZ code name/NgS code point/NSg # Unicode code point code's codebase/NgS codec/NgS codefendant/NSg codeine/Nmg codependency/NwgS codependent/JNSg coder/NgSe codex/~Ng codfish/NgS09 # singular and plural, also has a plural in -s codger/NSg codices/9 codicil/NSgV codification/~Ng codifier/Ng codify/Vd>SGXnZ codon/NS codpiece/NgS codswallop/N coed/~JNgS coeducation/Ng coeducational/~J coefficient/~JNgS coelenterate/NgS coenobite/NSg!_₹ coenobitic/J!_₹ coenzyme/N coequal/JYNgS coerce/Vd>SGZnv coercer/Ng coercion/~Ng coeval/JYNSg coexist/~VdG coexistence/~Ng coexistent/JN coexists/V coextensive/J coffee/~NwSgJV coffeecake/NwSg coffeehouse/~NgS coffeemaker/NSg coffeepot/NgS coffer/NSgV cofferdam/NgS coffin/~NSgVdG cofounder/NSg co-founder/NSg cog/~NSgV cogency/Ng cogent/JY cogitate/VdSGXnv cogitation/Ng cogitator/NgS cognac/NwSg cognate/~JNgS cognisable/J!_₹ cognisance/Ngr!_₹ cognisant/J!_₹ cognition/~Ngr cognitional/J cognitive/~JYN cognizable/J cognizance/Ngr cognizant/J cognomen/NSg cognoscente/Ng cognoscenti/N cogwheel/NSg cohabit/VSGd cohabitant/NgS cohabitation/Ng coheir/NSg cohere/VdSG coherence/~Ngi coherency/Ng coherent/~JYi cohesion/~Ng cohesive/~JYpN cohesiveness/Ng coho/NgS cohort/~NSgV coif/NgSV coiffed/VtT coiffing/V6 coiffure/NSgVdG coil/~NSVdGUr coil's/r coilover/NgS coin/~NgSVd>GZ coinage/~NwSg coincide/~VdSG coincidence/~NwgS coincident/JN coincidental/JY coiner/Ng coinsurance/Nmg coir/N coital/J coitus/Ng coke/~NwgSVGd col/~NS cola/~NwgS colander/NSg cold/~J>Y^pNgS coldblooded/J coldness/Ng coleslaw/Nmg coleus/NgS coley/NS colic/NgJ colicky/J coliseum/~NgS colitis/Ng coll/~V collab/NgS collaborate/~VdSGXnv collaboration/~Nwg collaborationist/N collaborative/~JYN collaborator/~NgS collage/~NwSgV collagen/~Nmg collapse/~VGdSNwg collapsible/~JN collar/~NSgVdG collarbone/NSg collard/NSg collarless/J collate/VdSGXn collateral/~JYNmg collateralise/V!_₹ collateralization/Ng collateralize/V collation/~NwgS collator/NgS colleague/~NgSV collect/~VGdSJNrv collect's collectable/JNgS!_₹ collected/~JVU collectedly/Ry collectible/~JNSg collection/~NwgSr collective/~JYNgS collectivisation/Nmg!_₹ collectivise/VdSG!_₹ collectivism/Ng collectivist/JNSg collectivization/~Nmg collectivize/VdSG collector/~NgS colleen/~NSg college/~NSg collegiality/Ng collegian/NgSJ collegiate/~JN collide/~Vd>SGZ collie/NSg>Z collier/~Ng colliery/~NSg collision/~NSg collisional/J collisionless/J collocate/VGdSNgJnX collocation/NwgS colloid/JNSg colloidal/J colloq/NJ colloquial/~JYN colloquialism/NSg colloquies/NV colloquium/NgS colloquy/NgV collude/VdSG collusion/~Ng collusive/J cologne/~NSg colon/~NSg colonel/~NSgV colonelcy/Ng colones/N colonial/~JYNSg colonialism/~Ng colonialist/JNgS colonisation/Ngre!_₹ colonise/VGSder!_₹ coloniser/NgS!_₹ colonist/~NSg colonization/~Ngre colonize/~VGSder colonizer/NgS colonnade/~NgSd colonoscopy/NSg colony/~NSgV colophon/NSg color/~NwSJVGdrE< color code/NgSVdG< color coded/J< color's/< colorable/J< colorant/NSg< coloration/~NgE< coloratura/NgSJ< colorblind/Jp< colorblindness/Ng< colorburst/Ng< colored/~JNVU< colored's/< coloreds/N< colorfast/Jp< colorfastness/Ng< colorful/~JYp< colorfulness/Ng< coloring's/< colorist/NS< colorization/Ng< colorize/VdSG< colorless/~JYp< colorlessness/Ng< colorway/NS colossal/~JY colossi/N colossus/~Ng colostomy/NSg colostrum/Ng colour/~NwSJVGdrE!@_₹ colour code/NgSVdG!@_₹ colour coded/J!@_₹ colourable/J!@_₹ colourant/NSg!@_₹ colouration/NgE!_₹ colourblind/Jp!@_₹ colourblindness/Ng!@_₹ colourburst/Ng!@_₹ coloured/JNVU!@_₹ coloureds/N!@_₹ colourfast/Jp!@_₹ colourfastness/Ng!@_₹ colourful/JYp!@_₹ colourfulness/Ng!@_₹ colourisation/Ng!_₹ colourise/VdSG!_₹ colourist/NS!@_₹ colourization/Ng@ colourize/VdSG@ colourless/JYp!@_₹ colourlessness/Ng!@_₹ colourway/NS!@_₹ colt/~NgSV coltish/J columbine/~NSgJ column/~NSgd columnar/J columnist/~NSg com/~NJzL coma/~NgS comaker/NSg comatose/~JV comb/~NgSVd>GZz combat/~NwSgVdGv combatant/~NSgJ combativeness/Nmg combed/JVU comber/Ng combinable/J combination/~NwSg combinator/NgS combinatorial/J combinatoric/J combinatorics/Nm combine/~VdGSNr combine's combined/~JVNU combiner/NgS combings/Ng combo/~NSgV combust/VGdSJNv combustibility/Nmg combustible/~JNgS combustion/~Nmg come/~VbTG>SNgPiZ come back/V/ comeback/~NgSV comedian/~NgS comedic/~J comedienne/NgS comedown/NgS comedy/~NwSg comeliness/Ng comely/J^>p comer's comestible/JNSg comet/~NSg comeuppance/NSg comfit/NSVE comfit's comfort/~NwSgVdGE comfortable/~JpN comfortableness/Ng comfortably/~RyU comforter/NgS comforting/~JYV6N comfortless/J comfy/J>^ comic/~JNSg comical/~JY comicality/Ng coming/~V6NgJ comity/Ng comm/~N comma/~NSgV command/~NSgVd>GLZ command line/NgS commandant/~NgS commandeer/VGdS commander/~NgS commandment/~NgS commando/~NSg commemorate/~VGdSXnv commemoration/~NwgS commemorator/NgS commence/~VdSGrL commencement/~N0gr commencements/N9 commend/VdGSNrB commendably/Ry commendation/~NwgSr commendatory/JN commensurable/J commensurate/JYVi comment/~NSgVGd commentariat/NSg commentary/~NwSg commentate/VdSG commentator/~NSg commenter/NSg commerce/~NmgV commercial/~NSgJY commercialisation/Ng!_₹ commercialise/VGdS!_₹ commercialism/Nmg commercialization/~Nmg commercialize/VGdS commie/NSgJ commingle/VdSG commiserate/JVGdSnvX commiseration/NgS commissar/~NSg commissariat/~NSg commissary/~NSg commission/~NwSVGdre commission's commissionaire/NS commissioner/~NSg commit/~VSNr commitment/~NwgS committal/NSgJ committed/~VtTJrU committee/~NSg committeeman/N0g committeemen/N9 committeewoman/N0g committeewomen/N9 committer/NSg committing/~V6Nr commode/NSEi commode's commodification/NwSg commodify/VdSG commodious/JY commoditize/VdSG commodity/~NSg commodore/~NSg common/~JY^>pNVU common's commonality/NwgS commonalty/Ng commoner/~JNgS commonness/NmgU commonplace/~JNgSV commons/~NV commonsense/JN commonweal/NgH commonwealth/~Ng commonwealths/N commotion/~NwSg communal/~JY commune/~NSgVdGXn communicability/Ng communicable/Ji communicably/Ry communicant/NgSJ communicate/~VGdSnvX communication/~NwSg communicative/JU communicator/~NSg communion/~Nmg communique/NSg communism/~Nmg communist/~JNSg communistic/J community/~NwSg commutation/NgS commutative/~J commutativity/Nmg commutator/NSg commute/~Vd>GSNgBZ commuter/~NgS comorbidity/NSg comp/~JYNgSVdG compact/~NSgVGd>J^Yp compaction/Nmg compactness/Nmg compactor/NSg companion/~NSgVB companionably/Ry companionship/~Ng companionway/NgS company/~NwSg company-wide # in Cambridge and OED dictionaries companywide/J # in Wiktionary and https://seeds.sproutsocial.com/writing/grammar-and-mechanics/ comparability/Nmg comparable/~JNi comparably/Ry%i comparative/~JYNgS compare/~VdGSNB comparison/~NgS compartment/~NSgV compartmental/J compartmentalisation/Nmg!_₹ compartmentalise/VdSG!_₹ compartmentalization/Nmg compartmentalize/VdSG compass/~NgSVGd compassion/~NmgV compassionate/~JYV compatibility/~NmgSi compatible/~JNgSi compatibly/Ryi compatriot/~NgSJ compeer/NSgV compel/~VS compelled/~JVtT compelling/~V6JYN compendious/J compendium/~NSg compensate/~VdSGXn compensated/~JVtTU compensation/~Nwg compensatory/~J compere/NSVdG compete/~VdSG competence/~N0wgi competences/N9 competencies/~N competency/~Ngi competent/~JYi competition/~NwSg competitive/~JYp competitiveness/~Ng competitor/~NSg compilation/~NwSg compile/~Vd>GSNZB compiler/~Ng complacence/Ng complacency/Ng complacent/JY complain/~Vd>GSZ complainant/NgS complainer/Ng complaint/~NSg complaisance/Ng complaisant/JY complected/VJ complement/~NSgVGd complementary/~JN complete/~VGd>SJ^pNnX completed/~VJU completely/R% completeness/~Ngi completion/~Ng completionist/JNgS complex/~JYNgSV complexion/~NgSVd complexional/J complexity/~NSg compliance/~Nmg compliant/~JY complicate/~VGdSJ complicated/~JYV complication/~NwgS complicit/~J complicity/~Nmg compliment/~NgSVdG complimentary/JU comply/~VdSGnX compo/~NS component/~NSgJ comport/VGdSNL comportment/Nmg composability/Nmg compose/~VGSdrEeB composedly/Ry composer/~NgS composite/~JYNwgSVGdnX composition/~Nge compositional/~J compositor/NSg compost/NSgVGd composure/NmgE compote/NSg compound/~NwgSJVGdB compounded/~JVtTU comprehend/~VSdG comprehensibility/Ngi comprehensible/Ji comprehensibly/Ryi comprehension/~Ngi comprehensions/N comprehensive/~JYpNgS comprehensiveness/Ng compress/~VGdSNev compress's compressed/~JVtTU compressible/J compression/~Nge compressor/~NSge comprise/~VGdS compromise/~NgSVGd comptroller/~NgS compulsion/~NgS compulsive/~JYpN compulsiveness/Ng compulsorily/Ry compulsory/~JNSg compunction/NSg computability/Nmg computable/J computation/~NSg computational/~JY compute/~VdGSNr computer/~NgS computerate/J computerisation/Ng!_₹ computerise/VGdS!_₹ computerization/Ng computerize/VGdS computing/~NmgV6 comrade/~NSgVY comradeship/Ng con/~VGSNgJ concatenate/VdSGJXn concatenation/~Ng concave/~JYpNV concaveness/Ng conceal/~VSd>GZBL concealed/~VtTJU concealer/Nwg concealment/Nmg conceit/~NSgVd conceited/JYpV conceitedness/Ng conceivable/~Ji conceivably/~Ryi conceive/~VdSGB concentrate/~VdGSNgnX concentration/~Ng concentric/~JQ concept/~NSgV conception/~NwSg conceptional/J conceptual/~JY conceptualisation/NSg!_₹ conceptualise/VdSG!_₹ conceptualization/NgSr conceptualize/VdSGr concern/~Nw0gVdU concerned/~JYVtTU concerning/~JPV6N concerns/~N9Vh concert/~VdGSNE concert's concerted/~VJY concertgoer/NS concertina/NSgVGd concertise/VdSG!_₹ concertize/VdSG concertmaster/~NgS concerto/~NSg concessionaire/NgS concessional/J concessionary/NJ conch/NgV conchie/NS conchs/N concierge/NgS conciliary/JQ conciliate/VdSGn conciliation/Ngr conciliator/NSg conciliatoriness/Ng conciliatory/J concise/~JY^pVn conciseness/Ng concision/Ng conclave/~NSg conclude/~VdSG conclusion/~NgS conclusive/~JYpi conclusiveness/Ngi concoct/VdGSNJ concoction/NgS concomitant/JYNgS concord/~NgV concordance/~NSgV concordant/J concordat/~NSg concourse/~NSg concrete/~JYpNwSgVdGnX concreteness/Ng concretion/Ng concubinage/Ng concubine/~NgS concupiscence/Ng concupiscent/J concur/~VS concurred/~VtT concurrence/~NSg concurrency/~NwSg concurring/~V6 concuss/Vv concussion/~NwSg condemn/~VSd>GZ condemnation/~NwgS condemnatory/J condemner/Ng condensate/~NgSVJnX condensation/~Ng condense/Vd>SGJZ condenser/~Ng condescending/JYV condescension/Ng condign/J condiment/NwgSV condition/~NwSVGdr condition's conditional/~JYNSg conditionality/N conditioned/~VJU conditioner/NwSg conditioning/~NgV condo/NSg condolence/NSg condom/NSg condominium/~NgS condone/VdSG condor/~NSg conduce/VdSGv conduct/~NgVdGv conductance/~Ng conductibility/Ng conductible/J conduction/~Nmg conductivity/~Ng conductor/~NgS conductress/NgS conduit/~NSg cone/~NgV coneys/N confab/NSgV confabbed/VtT confabbing/V6 confabulate/VdSGXn confabulation/Ng confection/NwSgV>Z confectioner/Ng confectionery/~NSg confederacy/~NSg confederate/~NgJV confer/~VS conferee/NSg conference/~NgSVG conferrable/J conferral/Ng conferred/~VtT conferrer/NgS conferring/~V6N confessed/~VtTJY confession/~NwSg confessional/~JNSg confessor/~NgS confetti/NgV confidant/~NgS confidante/NSg confide/Vd>SGZ confidence/~NmSg confident/~JYN confidential/~JY confidentiality/~Ng confider/Ng confiding/V6JYN configurability/Ngm configuration/~NwgS configure/~VBr confined/~VtTJU confinement/~NwgS confirm/~VSdGr confirmation/~NwSgr confirmatory/J confirmed/~VtTJU confiscate/VdSGJnX confiscation/~Nmg confiscator/NSg confiscatory/J conflagration/NwgS conflate/VdGSJNXn conflation/Nmg conflict/~NwSgVGd conflictive/J confluence/~NgS confluent/JN conform/~VZB conformable/JU conformal/~J conformance/~Nmg conformism/Nmg conformist/~NSgJ conformity/~Nmg confrere/NgS confrontation/~NwSg confrontational/~J confusable/JNSg confuse/~V>Z confused/~VJY confusing/~JYV confutation/Nmg confute/VdSG conga/NSgVdG congeal/VSdGL congealment/Ng conger/NSg congeries/Ng congest/NSVdGv congestion/~Nmg conglomerate/~NSgJVdGXn conglomeration/Ng congrats/Ng congratulate/VGdSXn congratulation/Ng congratulatory/J congregant/NgS congregate/JVGdSnX congregation/~Ng congregational/~J congregationalism/Ng congregationalist/~JNgS congress/~NgSV congressional/~JY congressman/~N0g congressmen/~N9 congresspeople/N9 congressperson/N0gS congresswoman/~Ng congresswomen/9 congruence/~Ng congruent/~JY congruity/NSgi congruous/J conic/~JNSg conical/~JYN conifer/~NSg coniferous/~J conjectural/JYN conjecture/~NgSVGd conjoint/J conjugal/JY conjugate/~VdGSNJXn conjugation/~NwgS conjunct/NgSJv conjunctiva/~NSg conjunctive/JNSg conjunctivitis/Ng conjuration/NgS conjure/Vd>GSNZ conjurer/Ng conk/NgVd>Z conlang/NSgVG>d # conlang (n/v) < "constructed language", plu. 'conlangs', regular verb; also "conlanging" for the activity conman/N conmen/9 connect/~VdGSNrEv connectable/J connected/~JVU connection/~NwgSE connective/~JNgS connectivity/~Ng connector/~NgS conned/VtT conning/V6N conniption/NgS connivance/Ng connive/Vd>SGZ conniver/Ng connoisseur/NSg connotative/J connubial/J conquer/~VSdGr conquerable/JU conquered/~VU conqueror/~NgS conquest/~NgVr conquistador/~NSg conrod/NgS cons/~N9SVhdG consanguineous/J consanguinity/Nmg conscienceless/J conscientious/~JYp conscientiousness/Ng conscious/~JYpNU consciousness/~N0mgU consciousnesses/N9 conscription/~Nmg consecrate/VdSGJrn consecrated/~VU consecration/~N0gr consecrations/N9 consecutive/~JYN consensual/~J consensus/~NgSV consent/~VdGSNwg consequence/~NSgV consequent/~JYN consequential/JYi conservancy/~NSg conservation/~Ng conservationism/Nmg conservationist/~NSg conservatism/~Nmg conservative/~NgSJY conservatoire/~NS conservator/NSg conservatory/~JNSg consider/~VGSdr considerable/~JNi considerably/~R% considerate/JYpVin considerateness/Nmgi consideration/~Nw0gri considerations/~N9 considered/~VJU consign/VSdGr consignee/NgS consignment/NgS consist/~VdGSN consistence/NgS consistency/~NSgi consistent/~JYNi consistory/~NSg consolable/Ji consolation/~NgS consolatory/JN consolidate/~VdSGJXn consolidated/~JVU consolidation/~Ng consolidator/NgS consoling/JYVN consomme/Ng consonance/NwSg consonant/~NSgJY consortia/N consortium/~Ng conspectus/NgS conspicuous/~JYpi conspicuousness/Ngi conspiracism/Ng conspiracist/NgS conspiracy/~NwSgV conspirator/~NgS conspiratorial/JY conspire/~VGd const/~NgSJ constable/~NSgV constabulary/~JNSg constancy/Ngi constant/~JYNgS constellation/~NSg consternation/~Ng constipate/VGdSn constipation/~Ng constituency/~NSg constituent/~JNSg constitute/~VdGSNrnv constitution/~Ngr constitutional/~JYNgS constitutionalism/N constitutionality/~NgU constitutions/~N constrained/~VJU constraint/~NSg constrict/VGSdv constriction/NwSg constrictor/NSg construable/J construct/~NSVdGerv construct's construction/~NwgSer constructional/J constructionist/JNSe constructionist's constructive/~JYpU constructiveness/Ng constructor/~NgS construe/NSVGd consul/~NSgK consular/~JNK consulate/~NSg consulship/~Ng consult/~NSVGd consultancy/~NSg consultant/~NgS consultation/~NgS consultative/~J consumable/JNSg consume/~Vd>SGBZ consumed/~JVtTU consumer/~NgS consumerism/Nmg consumerist/JNgS consummate/JYVGdSnX consummated/~VU consumption/~Nmg consumptive/JNSg cont/~JV contact/~NwSVdGr contactable/J contactless/JN contactor/NSg contagion/NwgS contagious/~JYp contagiousness/Nmg contain/~VSd>GBLZ container/~NgS containerisation/Nmg!_₹ containerise/VdSG!_₹ containerization/Nmg containerize/VdSG containment/~Nmg contaminant/~NSg contaminate/VdSGre contaminated/~VJU contamination/~Nmge contaminator/NSg contd/J contemn/VSdG contemplate/~VdSGnv contemplation/~Nmg contemplative/~JYNSg contemporaneity/Ng contemporaneous/~JY contempt/~Nmg contemptible/J contemptibly/Ry contemptuous/JYp contemptuousness/Nmg contender/~NgS content/~JNwSgVdGEL contented/VtTJYE contentedness/Nmg contention/~NwSg contentious/~JYpU contentiousness/Nmg contently/Ry contentment/NmgE conterminous/JY contest/NwgSVdG contestable/Ji contestant/~NgS contested/~JVtTU context/NwgS contextualisation/Nmg!_₹ contextualise/VdSG!_₹ contextualization/Nmg contextualize/VdSG contiguity/Nmg contiguous/~JY continence/Ngi continent/~NSgJ continental/~JNSg contingency/~NSg contingent/~NSgJY continua/N9 continual/~JY continuance/~NgSE continuation/~NgSE continue/~VGdSNE continuity/~NSgE continuous/~JYE continuum/~N0g contort/VGd contortion/NgS contortionist/NSg contra/~PNV contraband/~NgJV contrabassoon/NS contraception/~Nmg contraceptive/~JNSg contract/~NgJVdG contractible/J contractile/J contractility/N contraction/~NwgS contractionary/J contractual/~JYN contradict/~VSdG contradiction/~NwSg contradictory/~JN contradistinction/NgS contraflow/NS contrail/NgSV contraindicate/VGdSnX contraindication/Ng contralto/~NSg contrapositive/NSg contraption/NSg contrapuntal/JY contrarian/NSgJ contrarianism/Nmg contrariety/Ng contrarily/Ry contrariness/Ng contrariwise/ contrary/~JpNSgV contrast/~NgSVdG contrastive/J contravene/VGdS contravention/NSg contretemps/Ng contribute/~VGdXn contribution/~NgS contributor/~NgS contributory/JN contrition/Nmg contrivance/NwgS contrive/VGd>SZ contriver/Ng control/~VSNwe control flow/Nmg control's controllable/JNU controlled/~JVtTUe controller/~NgS controlling/~JV6Ne controversial/~JYN controversy/~NwSg controvert/VdSG controvertible/Ji contumacious/JY contumacy/Ng contumelious/J contumely/NSg contuse/VdSGXn contusion/NgS conundrum/~NSg conurbation/~NgS convalesce/VdSG convalescence/NwgS convalescent/JNSg convection/~Nmg convectional/J convective/J convector/NS convene/~VdSGr convener/NgS convenience/~NwgSVi convenient/~JYi convent/~NSgV conventicle/NgSV convention/~NwSg conventional/~JYNU conventionalise/VGdS!_₹ conventionality/NmgU conventionalize/VGdS conventioneer/NS convergence/~NwgS convergent/~JYN conversant/JN conversation/~NwgSV conversational/~JY conversationalist/NSg converse/~VNJY convert/~VGdSNr convert's converted/~JVU converter/~NSg convertibility/Ng convertible/~JNSg convex/~JYNV convexity/Ng convey/~VSdGB conveyance/~NgSVG conveyor/~NgS convict/~VGdSNg conviction/~NwgS convince/~VGdS convinced/~JVU convincing/~JYVNU convivial/JY conviviality/Ng convo/NgS convoke/VdSG convoluted/~JV convolution/~NgS convolutional/J convoy/~NSgVdG convulse/VGdSnvX convulsion/Ng convulsive/JY cony/Ng coo/~NSgVGdJ cook/~NSVdGr cook's cookbook/~NgS cooked/~JVtTU cooker/NSg cookery/~NSg cookhouse/NS cookie/~NSgV cooking/~NmgJV6 cookout/NSg cooktop/NSg cookware/Nmg cool/~JY^>pNgSVdGZ coolant/~NwSg cooldown/NSg cool down/V/ cooler/~NgSJ coolie/NSg coolish/J coolness/Ng coon/~NgSV!_₹ coonskin/NgS coop/~NgSVd>GZ cooper/~NgVdG cooperage/Ng cooperate/~VdSGnv cooperation/~Nmg cooperative/~JYpNgS cooperativeness/Ng cooperator/NSg coordinate/~JYNSgVdGn coordinated/~JVU coordination/~Ng coordinator/~NgS coot/~NgS cootie/NSg cop/~VGdSNgz copacetic/J copay/VNg cope/~VSNg copier/NSg copilot/NSgV coping/~NgV copious/~JYp copiousness/Ng copium/Nmg copped/VtTJ copper/~NwSgJV copperhead/~NSg copperplate/NgV coppery/J copping/V6 copra/Ng copse/NSgV copter/NSgV copula/NSg copulate/VGdSJnv copulation/Ng copulative/JNSg copy/~NSVdGr copy's copybook/NSg copycat/NgSJV copycatted/VtT copycatting/V6 copyist/NgS copyleft/NV copyright/~NSgVGd copywrite/VSG copywriter/NgS copywritten/VT copywrote/Vt coquetry/NSg coquette/NSgVdGJ coquettish/JY cor/~N coracle/NSg coral/~NwSgJ corbel/NSgV cord/~NSgVGdr cordage/Ng cordial/~JYNSg cordiality/Nmg cordillera/~NgS cordite/Nmg cordless/JN cordon/~NSgVdG cordovan/NgJ corduroy/NwgSJV corduroys/N9g core/~NgSJ>VGdZ coreligionist/NS corer/NgS corespondent/NgS corgi/NSg coriander/Nmg cork/~NSVdGJU cork's corkage/Nmg corker/~NSg corkscrew/NSgJVdG corky/J corm/NgS cormorant/~NSgJ corn/~NwgSVd>GZ cornball/NgSJ cornbread/Nmg corncob/NgSV corncrake/NS cornea/~NSg corneal/~J corner/~NgSVGd cornerstone/~NSg cornet/~NSg cornfield/NS cornflakes/N9g cornflour/Nmg cornflower/NSgJ cornice/~NgSV corniche/NgS cornily/Ry corniness/Nmg cornmeal/Nmg cornrow/NgSVdG cornstalk/NSg cornstarch/Nmg cornucopia/NgS corny/J>^p corolla/~NgS corollary/NSgJ corona/~NSgV coronal/JNgS coronary/~JNSg coronation/~NSg coronavirus/~NgS coroner/~NgS coronet/~NgS coroutine/~NgS corp/~N corpora/N9 corporal/~JNSg corporate/~JYNVXn corporation/~Ngi corporatism/Nmg corporeal/JY corporeality/Ng corps/~NgS corpse/~NgV corpsman/N0g corpsmen/N9 corpulence/Ng corpulent/J corpus/~N0g corpuscle/NgS corpuscular/J corr/~N corral/~NSgV corralled/VtT corralling/V6 correct/~JY^>pNSVdGvB corrected/~VtTU correction/~NSg correctional/~J corrective/~JNSg correctness/~Ngi corrector/NgS correlate/~VdGSNgXnv correlated/~VtTJU correlation/~NwgS correlational/J correlative/JNgS correspond/~VSdG correspondence/~NSge correspondent/~JNSg corresponding/~VNJY corridor/~NSg corrie/NS corroborate/VGdSnvX corroborated/~JVU corroboration/Nmg corroborator/NSg corroboratory/J corrode/VGdS corrosion/~Nmg corrosive/~JYNSg corrugate/VGdSJnX corrugation/NwgS corrupt/~JY^>pVdSG corruptibility/Ngi corruptible/JNi corruption/~NwgS corruptness/Nmg corsage/NgS corsair/~NgS corset/NSgVGd cortege/NgS cortex/~NgS cortical/~J cortices/9 cortisol/Nmg cortisone/Nmg corundum/Nmg coruscate/VGdSn coruscation/Ng corvette/~NSg cos/~NgCI cosh/NSVdGJ cosign/VGd>SNZ cosignatory/NSgJ cosigner/NgS cosily/Ry!_₹ cosine/~NSg cosiness/Nmg!_₹ cosmetic/~JNSgQ cosmetician/NgS cosmetologist/NgS cosmetology/Nmg cosmic/~JQ cosmogonist/NSg cosmogony/NSg cosmological/~J cosmologist/NSg cosmology/~NSg cosmonaut/~NSg cosmopolitan/~JNgS cosmopolitanism/Nmg cosmos/~NgS cosplay/NgSVdG> cosponsor/NSgVGd cosset/VGdSN cossetted/VtT cossetting/V6 cost/~VbtTdGSNwgYz cost cutting/Nmg cost-effective/J costar/NSgVb costarred/VtT costarring/V6 costliness/Ng costly/~J^>p costume/~NgSVGd>Z costumer/Ng costumier/NS costumiers/N!@_₹ cosy/J^>pNSgVGdU!_₹ cot/~NSg cotangent/NgS cote/~NgSV coterie/NgS coterminous/~J cotillion/NSgV cottage/~NgSVG>Z cottager/Ng cottar/NSg cotter/~NSgV cotter pin/NgS cotton/~NwSgJVGd cottonmouth/Ng cottonmouths/N cottonseed/NwgS cottontail/NgS cottonwood/~NSg cottony/J cotyledon/NgS couch/~NgSVdG couchette/NS cougar/~NSg cough/~VdGNg coughs/NV could/~NA could've/V couldn't/~VA coulee/NSg coulis/N coulomb/~NgS council/~NgS councillor/NSg!@_₹ councilman/~Ng councilmen/9 councilor/~NgS councilperson/N0Sg councilwoman/N0g councilwomen/N9 counsel/~NgSVdGz counselled/VtT!@_₹ counselling/NV6!@_₹ counsellor/NSg!@_₹ counselor/~NgS count/~VdGSNgEr countability/Nmg countable/~JNU countably/Ry countdown/~NgSV counted/~VU countenance/NSVGdE countenance's counter/~NgSVJE counteract/~NSVGdv counteraction/NgS counterargument/NS counterattack/~NgSVGd counterbalance/NgSVGd counterblast/NS counterclaim/NSgVGd counterclockwise/~J countercultural/JY counterculture/~NSg countered/~V counterespionage/Ng counterexample/NS counterfactual/JNS counterfeit/~J>NgSVGdZ counterfeiter/Ng counterfoil/NgS countering/~V counterinsurgency/NSg counterintelligence/~Nmg counterintuitive/Y counterintuitively/Ry counterman/Ng countermand/VGdSNg countermeasure/NSg countermelody/NwgS countermen/N9 countermove/NSV counternarrative/NgS counteroffensive/~NSgJ counteroffer/NSgV counterpane/NSg counterpart/~NSgV counterparty/NSg counterpetition/NV counterpoint/~NgSVdG counterpoise/NgSVGd counterproductive/~J counterprotest/NgSVdG counterrevolution/NSg counterrevolutionary/JNSg countersign/NSgVGd countersignature/NgS countersink/NSgVG counterspy/NSgV counterstrike/NSgVG counterstroke/NSg counterstruck/V countersunk/VJ countertenor/NgS counterterrorism/Ng counterterrorist/NSg countertop/NgS countervail/VGSd counterweight/NgSV countess/~NgS countless/~J countrified/JV country/~NSgJ countryman/~Ng countrymen/~9 countryside/~NgS countrywide/J countrywoman/Ng countrywomen/9 county/~NSgJ countywide/J coup/~NSVr coup's coupe/~NSg couple/~NSJVGdUe couple's couplet/NgS coupling/~NSgV coupon/~NSgV courage/~NgV courageous/~JYp courageousness/Nmg courgette/NgS courier/~NgSVdG course/~NgSVdGE coursebook/NgS courser/~NgS courseware/Nmg coursework/~Nmg court/~NwSgVdGY courteous/~JYE courteousness/Ng courtesan/NSg courtesy/~NSgVJE courthouse/~NgS courtier/~NSg courtliness/Nmg courtly/~J>^p courtroom/~NgS courtship/~NgS courtyard/~NgS couscous/Nmg cousin/~NSgV couture/~Ng couturier/NgS covalent/J covariance/Nmg covariant/JNgS cove/~NgSV coven/~NSg covenant/~NgSVdG cover/~NwSJVGdrEUB cover's coverage/~Nmg coverall/NgS coverglass/Ng covering/NwgS coverlet/NgS covert/~JYpNSg covertness/Nmg covet/VSdG covetous/JYp covetousness/Nmg covey/NSgV covid/~NgS cow/~NSgVGd>Z coward/~NSgJYV cowardice/~Nmg cowardliness/Nmg cowbell/NgS cowbird/NgS cowboy/~NSgV cowcatcher/NgS cower/VdG cowgirl/NgSV cowhand/NgS cowherd/NgS cowhide/NgSV cowl/NgSVGJz cowlick/NgS cowling/NgV cowman/N0g cowmen/N9 coworker/NgS cowpat/NS cowpoke/NgS cowpox/Nmg cowpuncher/NSg cowrie/NSg cowshed/NgS cowslip/NSg cox/~NSVGd coxcomb/NgS coxswain/NgSV coy/~J^Y>pVN coyness/Nmg coyote/~NSgV coypu/NSg cozen/VSdG cozenage/Ng cozily/Ry coziness/Ng cozy/J^>pNSgVGdU cpd/~N cpl/~N cps/~N crab/~NgSV crabbed/JVtT crabber/NSg crabbily/Ry crabbiness/Nmg crabbing/V6N crabby/J>^p crabgrass/Nmg crablike/J crabwise/J crack/~Vd>GSNwgJYZz crackdown/~NgS cracker/~NgS crackerjack/JNgS crackhead/NgS crackle/NSgVdGz crackling/NmgJV crackpot/NgSJ crackup/NSg cradle/~NSgVdG craft/~NwSgVdG> craftily/Ry craftiness/Nmg craftsman/~N0g craftsmanship/~Nmg craftsmen/~N9 craftspeople/N9 craftswoman/N0g craftswomen/N9 crafty/~J>^p crag/~NgS cragginess/Nmg craggy/J>^p cram/~VSN crammed/VtT crammer/NS cramming/V6N cramp/NSgVdGJ cramping/VNg crampon/NSgV cranberry/~NwSgJ crane/~NSgVdG cranial/~J craniotomy/NSg cranium/NSg crank/~JNSgVdG crankcase/NSg crankily/Ry crankiness/Ng crankshaft/~NgSV cranky/J>^p cranny/NSgVd crap/~NmgSVJ crape/NSgV crapped/VtT crapper/NSJ crappie/NSg>^ crapping/V6 crappy/J craps/NgVh crapshooter/NgS crash/~NgSJVdG crass/J>Y^p crassness/Ng crate/~NSgVd>GZ crater/~NgVdG cravat/NSgV crave/~VdGSNz craven/~JYpNSgV cravenness/Ng craving/~NgV craw/NgSV crawdad/NSg crawfish/NgS09 # singular and plural, also has a plural in -s crawl/~Vd>GSNgZ crawlable/J crawler/~Ng crawlspace/NSg crawly/J^>Sg cray/~NSJ crayfish/~NgS09V # singular and plural, also has a plural in -s crayola/S crayon/~NwSgVGd craze/~NSgVdG crazily/Ry craziness/Nmg crazy/~J>^pNSg creak/NSgVdG creakily/Ry creakiness/Nmg creaky/J>^p cream/~NwSgJ>VdGZ creamer/Ng creamery/NSg creamily/Ry creaminess/Ng creamy/~J>^pN crease/~NgSVGdie create/~VdSGJKrnv creatine/Ng creation/~NSgr creation's/K creationism/~NwSg creationist/NSgJ creative/~JYpNSg creativeness/Ng creativity/~Ng creator/~NgS creature/~NSg creche/NSg cred/N credence/~NmgV credential/JNSgVGd credentialism/Ng credenza/NSg credibility/~Nmgi credible/~Ji credibly/Ryi credit/~VGdSNgEB creditably/RyE creditor/~NSg creditworthy/Jp credo/~NSg credulity/Ngi credulous/JYi credulousness/Nmg creed/~NSgV creek/~NSg creel/NSgV creep/~Vb>GSNgZ creeper/~NgS creepily/Ry creepiness/Nmg creepy/~J^>p cremains/Ng cremate/VGdSnX cremation/~Ng crematoria/N9 crematorium/~N0gS crematory/JNSg creme/~JNSgV crenelate/VGdSXn crenelation/Ng crenellate/VdSGnX!@_₹ crenellation/Ng!@_₹ creole/~NSg creosote/NgSVGd crêpe/NSgV crepe/NSgV crept/VtT crepuscular/J crescendo/NSgVe crescent/~NgSJV cress/Nmg crest/~NSgVdG crestfallen/J crestless/J cretaceous/~J cretin/NSg cretinism/Nmg cretinous/J cretonne/Ng crevasse/NSgV crevice/NgSV crew/~NgSVdG crewel/NgV crewelwork/Ng crewman/Ng crewmen/~N9 crib/~NgSV cribbage/Nmg cribbed/VtTJ cribber/NgS cribbing/V6N crick/~NSgVdG cricket/~NwgSV>GZ cricketer/~Ng crier/Ng crikey/ crime/~Nw☁SgV criminal/~JYNgS criminalisation/Nmg!_₹ criminalise/VGdSe!_₹ criminality/Ng criminalization/Nmg criminalize/VGdSe criminologist/NgS criminology/~Ng crimp/JNSgVdG crimson/~NSgJVdG cringe/VdGSNgJ crinkle/VdGSNg crinkly/J>^N crinoline/NwSg cripes/ cripple/~J>NSgVdGZ crippler/Ng crippleware/Nmg crippling/~V6JYN crises/~N9 crisis/~N0g crisp/~JY^>pNSgVdG crispbread/NS crispiness/Nmg crispness/Nmg crispy/~J>^pN crisscross/VGdSNgJ criteria/~N9 criterion/~N0g critic/~NSgV critical/~JYNU criticality/Nm criticise/VGd>SZ!_₹ criticiser/Ng!_₹ criticism/~NwgS criticize/~VGd>SZ criticizer/Ng critique/~NgSVGd critter/NSg croak/NSgVdG croaky/J>^ crochet/NSgVd>GZ crocheter/Ng crocheting/VNg crock/NSgVd crockery/Nmg crocodile/~NSgV crocodilian/NSgJ crocus/~NgS croft/~NSV>GZ croissant/NgS crone/NSg crony/NSg cronyism/Nmg crook/~NSgVdGJ crooked/~V>J^Yp crookedness/Ng crookneck/NSg croon/Vd>GSNgZ crooner/NgS crop/~NgSV cropland/NwSg cropped/~VtTJ cropper/NgS cropping/V6N croquet/NgSVdG croquette/NSg crore/NgS₹ crosier/NgS cross/~NSJ^PVGdrU cross-border/JR cross section/NgS cross-threaded/J cross's crossbar/NSgV crossbeam/NgS crossbencher/NgS crossbones/~N9g crossbow/~NSg crossbowman/N0g crossbowmen/N9 crossbred/JNVtT crossbreed/VbGSNg crosscheck/NSgVdG crosscurrent/NgS crosscut/NSgV crosscutting/V6N crosser/NJ crossfade/VdSGNg crossfire/~NgS crosshair/NSg crosshatch/NSVGd crossing/~NSgJV6 crossly/Ry crossmember/NgS crossness/Ng crossover/~NgSJ crosspatch/NgS crosspiece/NSg crossroad/NgS crossroads/~Ng crosstown/J crosswalk/NgSV crosswind/NgS crosswise/J crossword/NgS crotch/NgSV crotchet/NSgV crotchety/J crouch/~VGdSNg croup/~NgV croupier/Ng croupy/J^>Z crouton/NgS crow/~NwgSJVdG crowbar/NgSV crowd/~VdGSNg crowded/~JVtTU crowdfund/VSdG crowdsource/VSdG crowfeet/N9 crowfoot/NSg crown/~NSgJVdG crowned/~VtTJU crozier/NgS!@_₹ crucial/~JY crucible/~NSg crucifix/~NgS crucifixion/~NSg cruciform/JNSg crucify/VdSG crud/NgV cruddy/J^> crude/~J>Y^pNg crudeness/Ng crudites/Ng crudity/NSg cruel/~JY^>pVN crueller/Jc!@_₹ cruellest/Ju!@_₹ cruelness/Nmg cruelty/~NwSg cruet/NSg cruft/~NmgSVd crufty/J cruise/~NSgVd>GZ cruiser/~Ng cruller/NgS crumb/NSgVdGY crumble/VGdSNwg crumbliness/Ng crumbly/J^>pN crumby/J^> crumminess/Nmg crummy/J^>pN crumpet/NgS crumple/NgSVGd crunch/~VGd>SNg cruncher/NgS crunchiness/Nmg crunchy/~J^>pN crupper/NgSV crusade/~NgSVGd>Z crusader/~Ng cruse/NSg crush/~NgSVd>GZ crusher/~NgS crushing/~V6JYN crust/~NwSgVdG crustacean/~NSg crustal/J crustily/Ry crustiness/Nmg crusty/J^>pN crutch/NgSV crux/NgS cry/~VGd>SNgZz crybaby/NSgV cryogenic/~JSQ cryogenics/Nmg cryonics/Nm cryosurgery/NwgS crypt/~NSg cryptanalysis/~Nm cryptic/~JNQ crypto/~NmSg cryptocurrency/NwSg cryptogram/NSg cryptographer/NSg cryptographic/JQ cryptography/~Nmg crystal/~NwSgJ crystalline/~JN crystallisation/NwgS!_₹ crystallise/VdSGr!_₹ crystallization/~NwgS crystallize/VdSGr crystallographic/~J crystallography/~Nmg ct/~N ctn/N ctr/N cu/~ cub/~NSgVGd>Z cubby/NgS cubbyhole/NgSV cube/~NgSVJ cuber/Ng cubic/~JN cubical/J cubicle/NgS cubism/~Nmg cubist/JNSg cubit/NSg cuboid/~JNS cuck/NSgVdG cuckold/NgSVdG cuckoldry/Nmg cuckoo/~NSgVJ cucumber/~NwSg cud/NSgV cuddle/NSgVdG cuddly/J^> cudgel/NSgVGdz cudgelled/VtT!@_₹ cudgelling/V6SN!@_₹ cue/~NSgVdG cuff/~NgSVdG cuisine/~NwSg cul-de-sac/NgS culinary/~J cull/VdGSNg culminate/VdSGJXn culmination/~Ng culotte/NSg culpability/Nmg culpable/Ji culpably/Ry culprit/~NSg culs-de-sac/9 cult/~NgSJ cultish/J cultishness/Nmg cultism/Nmg cultist/NgS cultivable/J cultivar/~NSg cultivate/~VdSGBn cultivated/~VJU cultivation/~Nmg cultivator/NgS cultural/~JY culture/~NwgSVGd cultured/~JVU culty/J culvert/~NgSV cum/~PNwSgVJ cumber/VdGSN cumbersome/~Jp cumbersomeness/Nmg cumbrous/J cumin/Nmg cummerbund/NgS cumming/~V6 cumulate/VSdG cumulative/~JY cumuli/N cumulonimbi/N cumulonimbus/Ng cumulus/~Ng cuneiform/~JNg cunnilingus/Nmg cunning/~J>Y^Ng cunt/NgSVJx cup/~NSgV cupboard/~NSgV cupcake/NwgSV cupful/NSg cupid/~NSg cupidity/Nmg cupola/~NSgd cuppa/~NS cupped/JVtT cupping/NV6 cupric/J cur/~NSgY curability/Ng curacao/N curacy/NSg curare/Ng curate/~NSgVdGv curation/NgS curative/~JNgS curator/~NgSK curatorial/J curb/~NgSVdG curbing/VNg curbside/~JN curbstone/NSg curd/~NgSV curdle/VdSG cure/~NSVGd>KZB cure's cured/~VtTU curer/NgK curettage/Ng curfew/~NSg curia/~Ng curiae/~N curie/~NSg curio/NSg curiosity/~NSg curious/~JYp curiousness/Ng curium/Nmg curl/~NSVdGU curl's curler/~NSg curlew/~NSg curlicue/NSgVdG curliness/Ng curling/~NgV curly/~J>^pN curmudgeon/NgSY currant/NgS currency/~NSg current/~NJYWr current's currents/~N curricula/~9 curricular/~J curriculum/~NgS curry/~NSgVdG currycomb/NSgVGd curse/~NSgVdGv cursed/~JYV cursive/~JYNEr cursive's cursor/~NSgV cursorily/Ry cursoriness/Ng cursory/Jp curt/~JY^>pV curtail/~VGdSNL curtailment/NSg curtain/~NgSVGd curtness/Ng curtsy/NSgVGd curvaceous/Jp curvaceousness/Ng curvature/~NSg curve/~JNSgVdG curveball/NSg curvy/J>^ cushion/~NgSVdG cushy/J>^ cusp/~NgSV cuspid/NSg cuspidor/NSg cuss/VGdSNWE cuss's cussed/VtTJYp custard/~NwgS custodial/~J custodian/~NgS custodianship/Nmg custody/~Nmg custom/~NSgJVZ custom-built/J custom-made/J customarily/~R8 customary/~JNU customer/~NgS customhouse/NSg customisation/NwgS!_₹ customise/VdSG!_₹ customizability/Nmg customizable/J customization/~NwgS customize/VdSG cut/~VbtT>SJ^Ng cut back/V/ cut off/V/ cut over/V/ cut scene/NgS cutaneous/~J cutaway/JNgS cutback/NgS cute/~JYp cuteness/~Nmg cutesy/J^> cutey/NS cuticle/NgS cutie/NSg cutlass/NgSV cutler/~NSg cutlery/~Nmg cutlet/NSg cutoff/~NSgJ cutout/NSg cutter/~NSg cutthroat/~NSgJ cutting/~NgSJYV6 cutting edge/Ng cutting-edge/J cuttlefish/N09gS # singular and plural, also has a plural in -s cutup/NSg cutworm/NgS cw/~ cwt/N cyan/~NmgJ cyanide/~NmgV cyanobacteria/~N cyanosis/Nmg cyber/~J cyberattack/NSgVdG cyberbully/NSgVG cybercafe/NS cybernetic/JS cybernetics/Nmg cyberphysical/JY cyberpunk/NSg cybersecurity/g cybersex/NmgV cyberspace/~NgS cyberstalk/VSdG cyborg/~NSgV cyclamen/NgS cycle/~NSgVdGr cyclic/~JN cyclical/~JYN cyclist/~NgS cyclometer/NgS cyclone/~NgSV cyclonic/J cyclopedia/NgS cyclopes/N9 cyclops/~N0g cyclotron/~NgS cygnet/NgS cylinder/~NgSV cylindrical/~J cymbal/NgS cymbalist/NgS cynic/NSgJ cynical/~JY cynicism/~Ng cynosure/NgS cypress/~NgS cyst/~NgS cystic/~J cystitis/N cytokines/~N cytologist/NSg cytology/Ng cytoplasm/~Nmg cytoplasmic/~J cytosine/Nmg czar/~NgS czarina/NSg czarism/N czarist/NSg d/JGnXz d'Arezzo/g d'Estaing/g dB/ dab/~VSNgJ dabbed/VtT dabber/NgS dabbing/V6N dabble/VGd>SNZ dabbler/Ng dace/NSg dacha/NgS dachshund/NgS dactyl/NgS dactylic/JNgS dad/~NSgV dadaism/Ng dadaist/NgSJ daddy/~NSgVJ dado/~N0gV dadoes/N9V daemon/~NgS daemonic/J daffiness/Ng daffodil/~NSgJ daffy/~J^>pN daft/~J^>Yp daftness/Ng dag/~NSV dagger/~NgSV dago/N0S dagoes/N9 daguerreotype/NSgVdG dahlia/NgS dailiness/Ng daily/~JpNSgVR8 daintily/Ry daintiness/Nmg dainty/J>^pNSg daiquiri/NwgS dairy/~NSgJG dairying/Ng dairymaid/NgS dairyman/Ng dairymen/9 dairywoman/Ng dairywomen/9 dais/~NgS daisy/~NSg dale/~NSg dalliance/NgS dallier/Ng dally/~VGd>SNZ dalmatian/~NgS dam/~NSgVJ damage/~NwgSVGd damageable/J damaged/~VtTJU damages/~VN9g damask/NgSJVdG dame/~NSgV dammed/~VtT damming/~V6N dammit/N damn/~VGdSJNgB damnably/Ry damnation/~Nmg damned/~J^VtT damp/~J^Y>pNmSgVGdXZn dampen/VGd>Z dampener/NgS damper/NgSJc dampness/Nmg damsel/NgS damselfly/NSg damson/NgSJ dance/~NwgSVGd>ZB dancer/~Ng dancing/~NgV dandelion/NSgJ dander/NgV dandify/VGdS dandle/VGdSN dandruff/NmgV dandy/~NSgJ^> dang/~VGd>SJNZ danger/~NwgSV dangerous/~JYp dangle/VGd>SNZ dangler/NgS danish/~NgS dank/J^Y>pNV dankness/Nmg danseuse/NgS dapper/J^> dapple/NgSJVGd dare/~NSgAd>GZ daredevil/~NgSJV daredevilry/Nmg darer/Ng daresay/V daring/~VJYNg dark/~J^Y>pNgVXn darken/~VGd>Z darkener/Ng darkie/NS darkness/~Nmg darkroom/NgS darling/~NgSJ darn/~J>VGdSNgZ darned/VtT>J^ darner/Ng dart/~NSgVGd>Z # deca # prefixes that are not also words in their own right don't belong in the dictionary dartboard/NgS darter/Ng dash/~NgSVGd>Z dashboard/~NSgV dasher/Ng dashiki/NgS dashing/~JYVN dastard/NgSJYV dastardliness/Ng data/~Nw9g data center/NgS!@_₹ data centre/NgS< data point/NgS database/~NSgV dataset/~NgS datasheet/NgS datasource/NgS datatype/N date/~NwSgVd>GZv datebook/NS dated/~JVU dateless/J dateline/NgSVGd dater/Ng dateset dative/JNgS datum/~N0gV daub/NSgVGd>Z dauber/NgS daughter/~NSg daughterboard/NgS daughterly/J daunt/VGdS daunting/~JYNV dauntless/~JYp dauntlessness/Nmg dauphin/~NgS davenport/~NgS davit/NgS dawdle/VGd>SNZ dawdler/NgS dawn/~VGdSNwg day/~NwSg day-to-day/JR daybed/NgS daybreak/~Nwg daycare/Nmg daydream/NgSVd>GZ daydreamer/NgS daylight/~NwgSV daylights/N9g daylong/J daytime/~NmgJ daze/~NSgVdG dazed/JYV dazzle/VGd>SNgZ dazzler/NgS dazzling/~V6JYN db/~ dbl/N dc/~N dd/~NSdG dded/K dding/K # de # prefixes that are not also words in their own right don't belong in the dictionary de de-extinct/VGd de-extinction/NwgS de facto/JNg de jure/RJ de minimis/J deacon/~NgSV deaconess/NgS dead/~J^Y>NgVXn deadbeat/NgSJ deadbolt/NSgV deaden/VGd> deadhead/NSVdG deadline/~NSgV deadliness/Ng deadlock/~NSgVGd deadly/~J^>p deadpan/JNgSV deadpanned/VtT deadpanning/V6 deadwood/Ng deaf/~J^>pNVXn deafen/VbGd deafening/JYV6N deafness/~Ng deal/~NSgVG>JzZ dealbreaker/NgS // Cambridge, Collins, Longman (MW also) deal-breaker/NgS // Merriam-Webster, Oxford Learners deal breaker/NgS // OED (MW, Longman also) dealer/~Ng dealership/~NSg dealing/~NgV dealmaker/NgS dealt/~V dean/~NgV deanery/~NSg deanship/Ng dear/~J^Y>pNSgVH dearest/~JuNS dearness/Ng dearth/N0gV dearths/N9 deary/NSg death/~Nw☁gS death knell/NgS deathbed/~NSg deathblow/NgS deathless/JY deathlike/J deathly/JRy deaths/~N9 deathtrap/NgS deathwatch/NgS deaves deb/~NSg debacle/~NgS debank/VdGS debarkation/Ng debarment/Ng debate/~NwgV>BZ debater/Ng debating/~V6Ng debauch/NgSVdG debauchee/NgS debauchery/NSg debenture/NgS debilitate/VdSGn debilitation/Nmg debility/NSg debit/NVdJ debonair/JYpN debonairness/Ng debouch/NSVGd debounce/VdSG debridement/N debris/~Nmg debt/~NwSg debtor/~NgS debugger/NSg debut/~NgVGd debutante/NSg decade/~NgS decadence/~Nmg decadency/Nmg decadent/~JYNgS decaf/JNwgS decaffeinate/VdSG decagon/NgS decal/NgSV decampment/Ng decap/VS decapitate/VGdSXn decapitator/NgS decapped/VtTJ decapping/V6N decarbonize/VdSG decathlete/NS decathlon/NSg decay/~NVGd deceased/~JNg decedent/NgSJ deceit/~NgS deceitful/JYp deceitfulness/Ng deceive/~VGdSU deceiver/NgS deceiving/~V6NY decelerate/VGdSn deceleration/Ng decelerator/NSg decency/~NSgi decennial/NSgJ decent/~JYi deception/~NwgS deceptive/~JYp deceptiveness/Ng decibel/NgS decidable/JU decide/~VGd>SBZ decided/~VtTJYN deciduous/~J deciliter/NgS< decilitre/NgS!@_₹ decimal/~NwSgJV decimalisation/N!_₹ decimalization/N decimate/VdGSNn decimation/Ng decimeter/NgS< decimetre/NgS!@_₹ decipherable/JUi decision/~N0gVi decisions/~N9V decisive/~JYpi decisiveness/Ngi deck/~NSgVGd deckchair/NgS deckhand/NSgV deckle/NSV declamation/NgS declamatory/J declaration/~NgS declarative/~JYN declarator/NgS declaratory/J declare/~Vd>SGZB declared/~VJU declarer/Ng declension/~NwSg declination/Ng decline/~NSgVd>GZ decliner/Ng declivity/NSg declutter/VGdS decoherence/Nmg decolletage/NSg decollete/J decompilation/NwgS decompile/VSdG decompiler/NgS decongestant/NwgS deconstructionism/Nmg decor/NgS decorate/~VGdSrnv decorating/~V6Ng decoration/~Nwgr decorations/~N decorative/~JYN decorator/~NgS decorous/JYi decorousness/Ng decorum/~Nmg decoupage/NSgVdG decoy/~NgSVGd decreasing/~VNY decree/~NgSVd decreeing/V6N decrement/NSVGd decrepit/J decrepitude/Ng decriminalisation/Nmg!_₹ decriminalization/Nmg decry/VGdS decrypt/VGdS decryption/Nmg dedicate/~VbGdSJNr dedication/~NwSg dedicator/NSg dedicatory/JN dedollarization/Nmg dedollarize/VSdG deduce/~VGdS deducible/J deduct/VGdv deductible/JNSg deduction/~NwSg deductive/JY deduplicate/VdSG deduplication/Nmg deed/~NVGd deejay/NgSV deem/VGdSNr deep/~J^>YpNSgXn deepen/~VGd deepfake/NSgV deepness/Ng deer/~Ng09 # singular and plural deerskin/Ng deerstalker/NS def/~NJZ defacement/Ng defacer/NSg defalcate/VdSGXn defalcation/Ng defamation/~Ng defamatory/~J defame/VGd>SJZ # removed `N`, noun senses now rare defamer/Ng defang/VdGS defaulter/NSg defeat/~Vd>GSNwgZ defeated/~JVU defeater/NgS defeatism/Nmg defeatist/JNgS defecate/VGdSJn defecation/Nmg defect/~NgSVdGv defection/~NwgS defective/~JYpNgS defectiveness/Nmg defector/NgS defence/NwSg!@_₹ defenceless/JYp!@_₹ defencelessness/Nmg!@_₹ defendant/~JNSg defended/~JVU defenestrate/VdGS defenestration/NS defense/~NwSgVdGv< defenseless/JYp< defenselessness/Nmg< defensible/Ji defensibly/Ryi defensive/~JYpNg defensiveness/Nmg defer/VS deference/~Nmg deferential/JY deferral/NgS deferred/~VtTJN deferring/V6N deffer/Jc deffest/Ju defiant/~JYN defibrillation/N defibrillator/NS deficiency/~NSg deficient/~JN deficit/~NSg defilement/Ng definable/JiU define/~VGdSNr defined/~JVU definer/NgS definite/~JpNiv definitely/R # adverb of probability/certainty/affirmation; modal adverb definiteness/Ngi definition/~NgrQ definitions/~N definitive/~JYN deflate/VGdSn deflation/Ng deflationary/J deflect/~VdGSv deflection/~NwgS deflector/NSg defogger/NSg defoliant/NSg defoliate/VdSGJn defoliation/Ng defoliator/NgS deformable/J deformity/~NSg defraud/~Vd>GSZ defrauder/Ng defrayal/Ng defrock/VdG defroster/NgS deft/J^>Yp deftness/Ng defunct/~JVN defund/VdGS defy/~VGdSN deg/NV degeneracy/Ng degenerate/~JNgVv degrade/~VB degrease/VGdS> degree/~NgS dehydrator/NSg dehydrogenase/~N deicer/NgS deification/Ng deify/VGdSn deign/VGdS deist/JNgS deistic/J deity/~NSg déjà vu/Nmg deja vu/Nmg deject/VGdSN dejected/JYV dejection/Nmg delay/~NVd>Z delectable/JN delectably/Ry delectation/Ng delegate/~NVbGd delete/~VGdSNXn deleterious/~J deletion/~Ng delft/~Ng delftware/Nmg deli/~NSg deliberate/~JYpVXv deliberateness/Ng delicacy/~NSgi delicate/~JYNi delicateness/Ng delicatessen/NSg delicious/~JYp deliciousness/Ng delighted/~JYV delightful/~JY deliminator delineate/VGdSnX delineation/Ng delinquency/~NSg delinquent/~JYNSg deliquesce/VdSG deliquescent/J delirious/~JYp deliriousness/Ng delirium/~NSg deliver/~VdGSJr deliverable/JNS deliverance/~Ng delivered/~VJU deliverer/NSg dell/~NSg delphinium/NwgS delta/~NgSV delude/VGdS deluge/~NgSVGd delusion/~NgS delusional/JYN delusive/JY deluxe/~JN delve/VGd>SNZ delver/NgS demagogic/JQ demagogue/NSgV demagoguery/Nmg demagogy/Nmg demand/~NwgSVGd demanding/~JVU demarcate/VdSGnX demarcation/~Ng demean/VGdSN demeanor/~Ng demeanour/Ng!@_₹ demented/JYV dementia/~Ng demesne/NgS demigod/NgS demigoddess/NgS demijohn/NSg demimondaine/NSg demimonde/Ng demise/~NgSVGd demitasse/NgS demo/~NgSVGd # only wiktionary calls this an adjective. doing so messes with 'adj of a' lint democracy/~NSg democrat/~NgS democratic/~JNUQ democratisation/Ng!_₹ democratise/VGdS!_₹ democratization/~Ng democratize/VGdS demode demographer/NSg demographic/~JNSgQ demographics/~Nmg demography/~Nmg demolish/~VdSG demolition/~NgS demon/~NgS demonetisation/Ng!_₹ demonetization/Ng demoniac/JN demoniacal/JY demonic/~JQ demonise/VGdS!_₹ demonize/VGdS demonology/NmSg demonstrability/Nmg demonstrable/JNi demonstrably/Ry demonstrate/~VGdSXnv demonstration/~NwgS demonstrative/~JYpNgS demonstrativeness/Ng demonstrator/~NgS demote/VGd demotic/JN demount/V demulcent/JNSg demur/V>SNg^ demure/JYpV demureness/Ng demurral/NSg demurred/VtT demurrer/NSg demurring/V6JN den/~NgV denationalisation/N!_₹ denationalization/N denaturation/N denature/VdG dendrite/NSg dengue/Nmg deniability/Nm deniable/~JU denial/~NwgS denier/~Ng denigrate/VbdSGn denigration/Nmg denim/~NwgS denitrification/N denizen/NgSV denominational/~J denormalization/Nmg denormalize/VGdS denotation/NSgQ denotative/J denouement/NgS denounce/~VdSGL denouncement/NSg dense/~JY^>pN denseness/Nmg densification/Nmg density/~NwSg dent/~NSgVGdi dental/~JYN dentifrice/NSg dentin/Nmg<@ dentine/Nmg!@_₹ dentist/~NgS dentistry/~Nmg dentition/~Nmg denture/NgSi denuclearise/VGdS!_₹ denuclearize/VGdS denudation/Ng denude/VGdS denunciation/NSg deny/~VGd>SZ deodorant/NSgJ deodorisation/Ng!_₹ deodorise/Vd>SGZ!_₹ deodoriser/Ng!_₹ deodorization/Ng deodorize/Vd>SGZ deodorizer/Ng deorbit/VGdS departed/~VtTJNg department/~NgS departmental/~JY departmentalisation/Ng!_₹ departmentalise/VGdS!_₹ departmentalization/Ng departmentalize/VGdS departure/~NSg dependability/Ng dependable/~JNU dependably/Ry dependence/~Nmgi dependency/~NSg dependent/~JYNgSi depict/~VGdSJ depiction/~NwgS depilatory/JNSg deplete/VGdSn depletion/~Ng deplorably/Ry deplore/VGdSB deploy/~VGdSNrL deployable/J deployment/~N0gr deployments/~N9 deponent/JNgS deportable/J deportation/~NgS deportee/NgS deporter/NgS deportment/Ng deposit/~NgSVGdr depositor/NgS depository/~NSg deprave/VGdS depravity/NSg deprecate/VGdSn deprecating/VJY deprecation/Ng deprecatory/J depreciate/VdSGn depreciation/~Ng depredation/NSg depressant/NSgJ depressing/JYV6 depression/~NSg depressive/~JNSg depressor/NgS depressurisation/N!_₹ depressurization/N deprive/~VGdS deprogramming/V6Nm depth/~N0wg depths/~N9 deputation/NgS depute/VdGSN deputise/VdSG!_₹ deputize/VdSG deputy/~NSgV derailleur/NSg derailment/~NSg derangement/Ng derby/~NSg dereference/~NgSVGd derelict/~JNgSV dereliction/NwSg deride/VGdS derision/Nwg derisive/JYpN derisiveness/Nmg derisory/J derivation/~NgSQ derivative/~JNgS derive/~VB dermal/~JN dermatitis/~Nmg dermatological/JN dermatologist/NSg dermatology/~Ng dermis/~Ng derogate/VdSGJn derogation/NgS derogatorily/Ry derogatory/~JN derrick/~NSgV derriere/NSg derringer/NSg derv/N dervish/NgS desalinate/VGdSn desalination/Ng desalinisation/Ng!_₹ desalinise/VGdS!_₹ desalinization/Ng desalinize/VGdS descant/NgV descend/~VGdSNW descendant/~JNgS descendent/JN!@_₹ descender/NgS describable/Ji describe/~VGdS>BZ describer/NgS description/~NwSg descriptive/~JYpN descriptiveness/Ng descriptor/~NgS descry/VGdS desecrate/VdSGJn desecration/Nmg deselection/Ng deserialization/NgS deserialize/VSGd desert/~NwSgJ>VdGZ deserter/NgS desertification/Nmg desertion/~NwSg deserved/~JYVU deserving/~JNVU desi/NgS₹ desiccant/NSgJ desiccate/VdGSJNn desiccation/Ng desiccator/NSg desiderata/N desideratum/Ng design/~NwSVdGr designate/~JVdSGnX designation/~Ng designator/NSg desirability/~NgU desirableness/Ng desirably/RyU desire/~VNwB desired/~VJU desirous/J desist/~VSdG desk/~NSgV deskill/VG desktop/~NSgJ desolate/~JYpVdSGn desolateness/Ng desolation/Ng desolder/VSGd despair/~VdGSNg despairing/JYVN desperado/~N0g desperadoes/N9 desperate/~JYpNn desperateness/Nmg desperation/~Nmg despicable/JN despicably/Ry despise/~VdSG despite/~PNV despoilment/Nmg despondence/Nmg despondency/Nmg despondent/JY despotic/JQ despotism/Ng dessert/~NwSg dessertspoon/NgS dessertspoonful/NgS destabilisation/Nm!_₹ destination/~NSg destine/VdSG destiny/~NwSg destitute/~JVn destitution/Nmg destroy/~VSGd>Z destroyer/~NgS destruct/~VGdSvg destructibility/Nmgi destructible/Ji destruction/~Nmg destructive/~JYp destructiveness/Nmg destructor/NgS destructure/VSdG desuetude/Ng desultorily/Ry desultory/J detach/~VGdSBL detachment/~NwgS detail/NwgS detailer/NgS detain/VGdSL detainee/~NgS detainment/Nmg detect/~VSdGvB detectable/~JU detected/~JVU detection/~NwgS detective/~NSgJ detector/~NSg detente/NSgnX detention/~Nmg deter/~VSL detergent/~NwSgJ deteriorate/~VdSGn deterioration/~Nmg determent/Ng determinable/JNi determinant/~NSgJ determinate/JNV determine/~VGdSr determined/~JVU determinedly/Ry determiner/NSg determinism/~Nmg deterministic/~JQ deterred/VtTU deterrence/~Nwg deterrent/~JNgS deterrer/NgS deterring/V6 detestably/Ry detestation/Nmg dethrone/VdSGL dethronement/Nmg detonate/~VGdSnX detonation/~NwgS detonator/NSg detox/NgSVdG detoxification/Ng detoxify/VdSGn detract/~VGd detriment/~NSgV detrimental/~JYN detritus/~Nmg deuce/~NSg deuterium/~Ng dev/~NgS devaluate/VdSGn devastate/VGdSn devastating/~JYV devastation/~Ng devastator/NgS develop/~VSGdrL developed/~JVU developer/~NSg development/~NwSgr developmental/~JYN developmentalism/Nmg developmentalist/NgS deviance/Ng deviancy/Ng deviant/~JNSg deviate/~VdGSNgJnX deviating/V6U deviation/~Ng devil/~ONSgVdGL devilish/JYp devilishness/Ng devilled/VtTJ!@_₹ devilling/V6N!@_₹ devilment/Ng devilry/NSg deviltry/NSg devious/JYp deviousness/Ng devoid/~JV devolution/~Ng devolve/VdSG devote/VbdSG devoted/~VtTJY devotee/~NSg devotion/~NgS devotional/~NSgJ devour/VSdG devout/~J>Y^pN devoutness/Ng dew/~NwgV dewberry/NSg dewclaw/NSg dewdrop/NSg dewiness/Ng dewlap/NSg dewy/J>^p dexterity/~Ng dexterous/JYp dexterousness/Ng dextrose/Nmg dharma/~NwgS dhoti/NSg dhow/NgS # di # prefixes that are not also words in their own right don't belong in the dictionary diabetes/~Nmg diabetic/~JNSg diabolic/J diabolical/JY diacritic/~JNgS diacritical/JN diadem/~NSgV diaereses/N9 diaeresis/N0g diagnose/~VdSG diagnosis/~NgV diagnostic/~JNgSQ diagnostician/NSg diagonal/~JYNSg diagram/~NSgV diagrammatic/JQ diagrammed/VtT diagramming/V6 dial/~NgSVdGr dialect/~NSg dialectal/~J dialectic/~NSgJ dialectical/~J dialectics/Ng dialing/~VSN dialled/VtTr!_₹ dialling/V6SN!_₹ dialog/~NwSgV dialogic/J dialogue/~NwSgV dialyses/N dialysis/~Ng dialyzes/V diam/N diamagnetic/JN diamagnetism/N diamante/NJ diameter/~NSg diametric/J diametrical/JY diamond/~NwSgJV diamondback/NgS diapason/NSg diaper/NSgVdG diaphanous/J diaphragm/~NSgV diaphragmatic/J diarist/~NSg diarrhea/~Ng diarrhoea/Ng!_₹ diary/~NSgVJ diaspora/~NSg diastase/Ng diastole/Ng diastolic/JN diathermy/Ng diatom/NSg diatomic/JN diatonic/~J diatribe/NSg diazepam/N dibble/~NSgVdG dibs/NgV dice/~N9SVGd dices/V9i dicey/J dichotomous/J dichotomy/~NSg dicier/Jc diciest/Ju dick/~NgSV>XZx dicker/VdGN dickey/~NSgJ dickhead/NSx dickybird/S dicotyledon/NgS dicotyledonous/J dict/~N dicta/N dictate/~NSgVdGnX dictation/Ng dictator/~NSg dictatorial/~JY dictatorship/~NSg diction/Nmg dictionary/~NSgV dictum/Ng did/~VAtrU didactic/~JNQ diddle/NSVd>GZ diddler/Ng diddly/N diddlysquat/N diddums/ didgeridoo/NSV didn't/~VAt dido/~N0g didoes/N9 didst/V die/~VdSN0g die hard/V diehard/NgSJ dielectric/~NgSJ diereses/N9 dieresis/N0g diesel/~NwSgVdG diet/~NwgSJ>VdGZ dietary/~JNSg dieter/~NgS dietetic/JS dietetics/Ng dietitian/NgS diff/~NOSVd>GJZ differ/~VdGN difference/~N0wgVi differences/~N9V different/~JYNi differentiability/Ng differentiable/~J differential/~JNSg differentiate/~VdGSNn differentiated/~VJU differentiation/~Nmg differentiator/NgS difficult/~JYV difficulty/~NwSg diffidence/Nmg diffident/JY diffract/VGSd diffraction/~Nmg diffuse/~VdSGJYpnv diffuseness/Nmg diffuser/NgS diffusion/~Ng diffusivity/N dig/~VSNg digerati/Ng digest/~VdGSNgv digested/VU digestibility/Ng digestible/Ji digestion/~Nw0gi digestions/N9 digestive/~JNS digger/NSg digging/~NSV6 diggings/Ng digicam/NSg digit/~NSgV digital/~JYN digitalis/Ng digitisation/N!_₹ digitise/VGdS!_₹ digitization/N digitize/VGdS digitizer/NgS dignified/~JVU dignify/VdSG dignitary/NSgJ dignity/~NSgi digraph/~N0g digraphs/N9 digress/VGdSv digression/NgS dike/~NgSVGd diktat/NS dilapidated/~VJ dilapidation/Nmg dilatation/Ng dilate/VdSGn dilation/Nmg dilator/NSg dilatory/J dildo/NSV dilemma/~NgS dilettante/NSgJ dilettantish/J dilettantism/Nmg diligence/~Nmg diligent/~JY dill/~NgSV dilly/JNSg dillydally/VdSG diluent/NJ dilute/~VdGSJNnX diluted/~VtTJU dilution/Nmg dim/~JY>pNSV dime/~NgSV dimension/~NSgVdG dimensional/~J dimensionality/Nmg dimensionless/~J diminish/~VGdS diminished/~VtTJU diminuendo/NSgJ diminution/NSg diminutive/~JNSg dimity/Ng dimmed/VtTU dimmer/NSgJc dimmest/Ju dimming/~V6N dimness/Nmg dimple/NSgVdG dimply/J dimwit/NSg dimwitted/J din/~NSgVGd>Z dinar/~NSg dine/~VSN diner/~NgS dinette/NgS ding/~NgVdG dingbat/NgS dinghy/NSgV dingily/Ry dinginess/Nmg dingle/~NSgJ dingleberry/NgS dingo/N0gV dingoes/N9V dingus/NgS dingy/J^>pNV dink/NV>J dinky/J>^NSg dinned/VtT dinner/~NwSgVdG dinnertime/Ng dinnerware/Nmg dinning/V6N dinosaur/~NSg dint/NgV diocesan/~JNgS diocese/~NgS diode/~NSg diorama/NSg dioxide/~NwSg dioxin/NwSg dip/~NSgV diphtheria/~Nmg diphthong/NSg diploid/JNSg diploma/~NSg diplomacy/~Nmg diplomat/~NgS diplomata/N diplomatic/~JNUQ diplomatist/NgS diplopia/N dipole/~NSg dipped/~VtTJ dipper/NSg dipping/~V6N dippy/J>^ dipshit/NSgx dipso/NS dipsomania/Nmg dipsomaniac/NgS dipstick/NSgV dipterous/J diptych/N0g diptychs/N9 dire/~JY^> dire wolf/Ng dire wolves/9 direct/~J^VSdGrv direction/~Nw0gi directional/~JYNgS directionality/Nmg directionless/J directions/~N9 directive/~JNSg directly/~CRy directness/Ngi director/~NgS directorate/~NSg directorial/~J directorship/~NSg directory/~NSgJ direful/J dirge/NSgV dirigible/NgSJ dirk/~NgSV dirndl/NSg dirt/~NmgV dirtbag/NgS dirtball/NS dirtily/Ry dirtiness/Nmg dirty/~J^>pVdSG dis/~VNgI( disable/~VdSGJL disablement/Ng disambiguate/~VSdGn disappointing/~JYV6 disarming/JYV disassembler/NgS disassembly/NwgS disastrous/~JY disbandment/~Ng disbarment/Ng disbelieving/VJY disbursal/Nmg disburse/VdSGL disbursement/NwgS disc/~NgV discern/~VSdGL discernible/~Ji discernibly/Ry discerning/V6JYN discernment/Nmg discharged/~VtTU disciple/~NSgV discipleship/~Ng disciplinarian/NSgJ disciplinary/~JN discipline/~NSgVdG disciplined/~JVtTU disclose/~VdGSN disclosed/~VtTJU disco/~NwgVG discography/~NSg discoloration/NwS discolouration/NwS!_₹ discombobulate/VdSGn discombobulation/Nmg discomfit/VdGJ discomfiture/Ng discommode/VdG disconcerting/JY disconnected/~VJYp disconnectedness/Nmg disconsolate/JYN discord/Nmg discordance/Nmg discordant/JY discotheque/NSg discourage/~VGdSNL discouragement/NwSg discouraging/V6JYN discover/~VSdGr discoverability/Ng discoverable/J discovered/~VU discoverer/~NgS discovery/~NwSgr discreet/~J>Y^p discreetness/Nmg discrepancy/~NSg discrepant/JN discrete/~JYpn discreteness/Nmg discretion/~Ngi discretionarily/Ry discretionary/~J discretisation/Ng!_₹ discretization/Ng discriminant/NJ discriminate/~VGdSJYn discriminating/~JVU discrimination/~Nmg discriminator/NgS discriminatory/~J discursiveness/Ng discus/~NgS discussant/NSg discussion/~NwSg disdain/~NmSgVdG disdainful/JY disease/NwSg disembowel/VSdGL disembowelled/VtT!@_₹ disembowelling/V6N!@_₹ disembowelment/Ng disequilibrate/VSdG disfigurement/NwSg disfranchisement/Nmg disgorgement/Nmg disgruntle/VGdSL disgruntlement/Nmg disguise/~NwSVGd disguised/~VJU disgust/NmgSVdG disgustedly/Ry disgustingly/Ry dish/~NgSVdG dishabille/Ng disharmonious/J dishcloth/N0g dishcloths/N9 disheartening/JYV dishevel/VdGSL dishevelled/JVtT!@_₹ dishevelling/V6!@_₹ dishevelment/Ng dishpan/NSg dishrag/NSg dishtowel/NgS dishware/Nmg dishwasher/NgS dishwater/Ng dishy/JN disillusion/VGdNL disillusionment/~Nmg disinfectant/JNgS disinfection/Nmg disinform/VSdG disinhibit/VSdG disinterested/~JYp disinterestedness/Nmg disjointed/~JYp disjointedness/Nmg disjunctive/JN disjuncture/N disk/~NgSV diskette/NgS dislodge/~VGdS dismal/~JYN dismantlement/Nmg dismay/~VdGSNg dismayed/~VJU dismember/VGdL dismemberment/~Nmg dismissive/~JY dismissiveness/Nmg disorder/~NmVY disorganisation/Nmg!_₹ disorganization/Nmg disparage/NSVdGL disparagement/Nmg disparaging/~JYV6N disparate/~JYN dispatcher/~NgS dispel/VSN dispelled/VtT dispelling/V6 dispensary/~NSg dispensation/~NwgS dispense/~VGd>SNBZ dispenser/NgS dispersal/~NwgS disperse/~VGdSJn dispersion/~Nwg dispirit/VGdS displeasure/~NgV disposable/~NSgJ disposal/~NwSg disposed/~VJi disposition/~NSgVi dispositionally/Ry dispossession/Ng disproof/NSg disproportional/J disprove/~VB disputable/Ji disputably/Ryi disputant/NgSJ disputation/~NSg disputatious/JY dispute/~NSgVd>GZB disputed/~JVU disputer/Ng disquiet/NmSgJVGd disquisition/NgS disregardful/J disrepair/~NmgV disrepute/NmgVB disrupt/~VGSdJv disruption/~NwSg disruptive/~JY dissect/VSdG dissed/VtT dissemblance/Ng dissemble/VGd>SZ dissembler/Ng disseminate/~VGdSn dissemination/~Ng dissension/NSg dissent/~Vd>GSNgZ dissenter/Ng dissertation/~NSg disses/NVh dissidence/Nmg dissident/~JNgS dissimilar/~JN dissimilitude/NS dissing/V6N dissipate/~VbGdSn dissipation/~Ng dissociate/~VbGdSnv dissociation/~Ng dissoluble/Ji dissolute/JYpNn dissoluteness/Ng dissolve/~VGdSNr dissolved/~JVtTU dissonance/NwSg dissonant/J dissuade/~VGdS dissuasive/JN dist/~N distaff/NSgJ distal/~JY distance/~NwSgVdG distant/~JY distaste/~NSgV distemper/NgV distention/NSg distil/VS!_₹ distill/VS< distillate/NSgnX distillation/~NwgS distilled/VtTJ distillery/~NSg distilling/V6JNm distinct/~JY^pViv distincter/Jc distinction/~NwSg distinctive/~JYpN distinctiveness/Ng distinctness/Ngi distinguish/~VGdSB distinguishable/~Ji distinguished/~JVtTU distort/~VGd>J distortion/~NgS distract/~VdGJ distracted/~JYVtT distraction/~NwgS distrait/J distraught/~J distress/~NmVdG distressful/J distressing/JYV6 distribute/~VGdSrnv distributed/~VJU distribution/~N0gr distributional/J distributions/~N9 distributive/~JYN distributor/~NSr distributor's distributorship/NS district/~NSVJr district's distro/NgS disturb/~VGd>SNZ disturbance/~NwSg disturbed/~JVtTU disturber/Ng disturbing/~JYV6 disunion/Ng disyllabic/JN ditch/~NgSVdG dither/Vd>GSNgZ ditherer/Ng ditransitive/JN ditsy/J ditto/~NSgVdG ditty/NSgV ditz/NgS diuretic/JNgS diurnal/~JYN div/~NV diva/~NgS divalent/JN divan/~NSg dive/~VGd>SNg^Z diver/~NgS diverge/~VdSG divergence/~NwgS divergent/~J diverse/~JYpXn diverseness/Nmg diversification/~Nmg diversify/~VGdSn diversion/~NwgS diversionary/J diversity/~NmSg divert/~VSdG diverticulitis/Nmg divest/~VSdGL divestiture/NgS divestment/Nmg divide/~Vd>GSNgZB divided/~VJU dividend/~NgSV divider/NgS divination/~Nmg divine/~JY^>NSgVdGZ diviner/NgJ diving/~VNgJ divinity/~NSg divisibility/Ngi divisible/~JNi division/~NgS divisional/~JN divisive/~JYp divisiveness/Ng divisor/~NSg divorce/~NSgVdGL divorcee/NgS divorcement/NgS divot/NSgV divulge/VGdS divvy/NSgVdGJ dixieland/~g dizzily/Ry dizziness/~Nmg dizzy/~J^>pVdGSN djellaba/NgS do/~VA>GzHZ do-gooder/NgS doability/Nmg doable/JNU dob/VSN dobbed/VtT dobbin/NSg dobbing/V6 doberman/Sg dobro/~N doc/~NSg docent/JNSg docile/JY docility/Nmg dock/~NgSVd>GZ docket/NSgVdG dockland/NS dockside/N dockworker/NgS dockyard/~NgS doctor/~NSgVdG doctoral/~J doctorate/~NgSV doctrinaire/NgSJ doctrinal/~JYN doctrine/~NgS docudrama/~NSg document/~NgSVGd documentarian/NgS documentary/~JNSg documentation/~Nmg documented/~VU dodder/VdGSNg doddery/J doddle/NV dodge/~Vd>GSNgJZ dodgem/NS dodger/~Ng dodgy/J>^ dodo/~NgS doe/~NSg doer/Ng does/~VAhrU doeskin/NgS doesn't/~VAh doff/VdGS dog/~NSgVJ dogcart/NSg dogcatcher/NSg doge/~NgS dogeared/JV dogfight/NSgV dogfish/NgS09 # singular and plural, also has a plural in -s dogfood/NgSVdG dogged/~VtTJYp doggedness/Ng doggerel/JNg dogging/NV6 doggone/J^>VGS doggy/NSgJ>^ doghouse/NSg dogie/NSg dogleg/NSgV doglegged/VtT doglegging/V6 doglike/J dogma/~NSg dogmatic/~JNQ dogmatism/Nmg dogmatist/NSg dognapper/NgS dogpile/NgS dogsbody/NSV dogsled/NSgV dogtrot/NgSVJ dogtrotted/VtT dogtrotting/V6 dogwood/~NgS doily/NSg doing/~V6SNgU dojo/NgS doldrums/N9g dole/~VGdSNW dole's doleful/JYp dolefulness/Nmg doll/~NgSdG dollar/~NSg dollarization/Ng dollarize/VdSG dollhouse/NSg dollop/NSgVGd dolly/~NSgVJ dolmen/NSg dolomite/~Ng dolor/Ng dolorous/JY dolour/Ng!@_₹ dolphin/~NgS dolt/NgSV doltish/JYp doltishness/Nmg domain/~NSg dome/~NgSVGd domestic/~JNSgQ domesticate/VdGSNn domesticated/~VtTJU domestication/~NwgS domesticity/Nmg domicile/NSgVdG domiciliary/NJ dominance/~Nmg dominant/~NSgJY dominate/~VdGSJNn domination/~NwgS dominatrices/N9 dominatrix/NgV domineer/VSGd domineering/V6JYN dominion/~NSg domino/~N0gV dominoes/N9 don/~NSgV don't/~VbA dona/~Sg donate/~VdSGXn donation/~NwgS done/~JVTNWrU dong/~NgS09VdG # singular and plural, currency plural is dong or dongs dongle/NSg donkey/~NSg donned/~VtT donning/V6 donnish/J donnybrook/NgSJ donor/~NSg donut/NSg doodad/NSg doodah/N0 doodahs/N9 doodle/~NSgVd>GZ doodlebug/NSg doodler/Ng doohickey/NSg doolally/J doom/~NwgSVdG doomer/NgS doomsayer/NgS doomsday/~NgJ doomster/NS doona/NgS_ door/~NSVi door to door/R door-to-door/S door's doorbell/NgSV doorjamb/NS doorkeeper/NgS doorknob/NgS doorknocker/NS doorman/~N0g doormat/NSg doormen/N9 doorplate/NSg doorpost/NgS doorstep/NgSV doorstepped/VtT doorstepping/V6N doorstop/NgS doorway/~NSg dooryard/NgS doozy/NgS dopa/Ng dopamine/~Nmg dope/~NwgSVGd>JZ doper/NgJ dopey/J dopier/Jc dopiest/Ju dopiness/Nmg doping/~VNg doppelgänger/NS dork/NgSV dorky/J>^ dorm/~NgSV>Z dormancy/Ng dormant/~JN dormer/Ng dormice/9 dormitory/~NSg dormouse/Ng dorsal/~JYN dory/~NSgJ dos/N9 dosage/~NSg dose/~NgSVGd dosh/N dosimeter/NSg doss/Vd>GSNJZ dosshouse/NS dossier/~NgS dost/~V # archaic 2nd person singular present of 'do' dot/~NSgVGd>PZ dotage/Nmg dotard/NSg dotcom/NSgV dote/VSN doter/Ng doth/Vh doting/VJYN dotted/~VtTJ dotting/V6N dotty/J>^N double/~JNSVdGr double-decker/J double's doubleheader/~NgS doublespeak/Ng doublet/NgS doubloon/NSg doubly/~R% doubt/~Vd>GSNwgZ doubter/Ng doubtful/~JYpN doubtfulness/Nmg doubting/~V6NJY doubtless/JY douche/NSgVdG douchebag/NSg dough/~NwgV doughnut/NSgV doughty/~J>^N doughy/J^>N dour/J>Y^p dourness/Ng douse/VdGSN dove/~NgSV dovecot/NS dovecote/NSg dovetail/NgSVdG dovish/J dowager/~NgS dowdily/Ry dowdiness/Ng dowdy/J^>pNSV dowel/~NSgVdG dowelled/VtT!@_₹ dowelling/V6N!@_₹ dower/~NSgVdG down/~PJ>VdGSNwgZ downbeat/NSgJ downcast/JNV downdraft/N0gS downdrafts/N9!_₹ downdraught/NgS!_₹ downer/Ng downfall/~NSgVn downfield/J downforce/Nmg downgrade/NSgVdG downhearted/JYp downheartedness/Ng downhill/~JNgSV download/~NgSVdGB downloader/NgS downmarket/JV downplay/VdSG downpour/NgSV downrange/J downrank/VSdG downright/~J downriver/~J downsample/SGg downscale/JVSdG downshift/NSVGd downside/~NgS downsize/VGdS downsizing/VNg downspout/NgS downstage/JNV downstairs/~JNg downstate/NgJ downstream/~JV downswing/NgS downtempo/NJ downtime/NgS downtown/~JNg downtrend/NgSV downtrodden/JV downturn/~NgSV downvote/NgSVdG downward/~JR downwards/R downwind/ downy/J>^N dowry/~NSgV dowse/Vd>GSNZ dowser/Ng doxology/NSg doxx/VdSG doyen/NSg doyenne/NgS doz/NSGdXn doze/VNg dozen/~NgH dozily/Ry dozy/J>^p dpi/N dpt drab/~NgSJYpV drabber/NJc drabbest/Ju drabness/Ng drachma/NgS draconian/J draft/~NSVdGJr draft's draftee/NSg drafter/NSg draftily/Ry draftiness/Ng drafting/~V6Ng draftsman/~Ng draftsmanship/Nmg draftsmen/9 draftswoman/N0g draftswomen/N9 drafty/J>^p drag/~NwgSVb dragged/~VtT dragging/~JNV6 draggy/J^>N dragnet/NSgV dragon/~NSg dragonfly/~NSg dragoon/~NSgVdG dragster/NS drain/~NSgVd>GZ drainage/~Nmg drainboard/NSg drainer/NgS drainpipe/NgS drake/~NSg dram/~NgSV drama/~NwSg dramatic/~JSQ dramatics/Ng dramatisation/NwgS!_₹ dramatise/VdSG!_₹ dramatist/~NSg dramatization/~NwSg dramatize/VdSG drank/~NVt drape/NSgVd>GZ draper/~Ng drapery/NwSg drastic/~JNQ drat/V dratted/VtTJ draught/NSgJV!_₹ draughtboard/NS draughtily/Ry!_₹ draughtiness/Ng!_₹ draughtsman/N0g!_₹ draughtsmanship/Nmg!_₹ draughtsmen/N9!_₹ draughtswoman/N0g!_₹ draughtswomen/N9!_₹ draughty/J>^p!_₹ draw/~V>GSNgZz drawback/~NgS drawbridge/~NgS drawer/~NgS drawing/~VSNwg drawl/VdGSNg drawn/~VTJr drawstring/NgS dray/NgS dread/~VdGSNwgJ dreadful/~JYpN dreadfulness/Nmg dreadlocks/Nm9gV dreadnought/~NgS dream/~NSgVd>GJZ dreamboat/NgS dreamed/~VtTU<@_ dreamer/~NgS dreamily/Ry dreaminess/Nmg dreamland/~Nmg dreamless/J dreamlike/J dreamt/VtT!@_₹ dreamworld/NSg dreamy/J>^p drear/JN drearily/Ry dreariness/Nmg dreary/J>^p dredge/~NSgVd>GZ dredger/Ng dregs/Nm9g drench/NSVGd dress/~VGdSNgrU dressage/~Nmg dresser/~NgS dressiness/Ng dressing/~NSgV6 dressmaker/NSg dressmaking/Nmg dressy/J^>p drew/~Vtr dribble/VGd>SNmgZ dribbler/Ng driblet/NgS drier/~NgJ drift/~NSgVd>GZ drifter/~Ng driftnet/NSV driftwood/~Nmg drill/~Vd>GSNgZ driller/Ng drillmaster/NSg drily/Ry!_₹ drink/~V>GSNgBzZ drinkable/JNU drinker/~NgS drip/~VSNg dripped/VtT dripper/NgS dripping/~NSgV6 drippy/J^> drivability/Nmg drivable/JU drive/~Vb>GSNwgZ drivel/NmSgVGd>Z driveler/Ng drivelled/VtT!@_₹ driveller/NSg!@_₹ drivelling/V6NJ!@_₹ driven/~VTJ driver/~NgS driverless/J driveshaft/NSg drivetrain/NgS driveway/NgS drizzle/VGdSNwg # normally a mass noun but "a drizzle" means it's also a countable noun drizzly/J drogue/NSgV droid/NSg droll/J^>pNV drollery/NSg drollness/Ng drolly/Ry dromedary/NSg drone/~NSgVdG drool/VdGSNg droop/VGdSNgJ droopiness/Nmg droopy/J^>p drop/~NgSV drop in/V drop-in/NgSJ dropbox/NgS dropdown/NSgJ dropkick/~NgSV droplet/NSg dropout/NSg dropped/~VtTJ dropper/NSg dropping/~V6SN droppings/N9g dropsical/J dropsy/Ng dross/NgV drought/~NSg drove/~NSgVt>Z drover/NgS drown/~VGSdz drowning/~VSNwg drowse/VGdSNg drowsily/Ry drowsiness/Nmg drowsy/J>^p drub/NSV drubbed/VtT drubber/NSg drubbing/V6SNg drudge/NgSVGd drudgery/Nmg drug/~NgSV drugged/~VtTJ druggie/NSg drugging/V6N druggist/NSg druggy/NJ drugstore/~NgS druid/~NSg druidism/Ng drum/~NgSV drumbeat/NSg drumlin/NSg drummed/VtT drummer/~NSg drumming/~NV6 drumstick/NSg drunk/~J^>NSgVTn drunkard/NgS drunken/~VJYp drunkenness/~Nmg drupe/NSg druthers/Ng dry/~J^Y>NSgVGdZ dryad/NSg dryer/~NSgJ dryness/Nmg drys/N drywall/NgV dual/~JNV dualism/~Nmg duality/~Nmg dub/~VSNg dubbed/~JVtT dubber/NSg dubbin/NgV dubbing/~NmV6 dubiety/Ng dubious/~JYp dubiousness/Nmg dubstep/Nmg ducal/~J ducat/NSg duchess/~NgSV duchy/~NSg duck/~VdGSNg duckbill/NSg duckboards/N duckling/~NSg duckpins/Ng duckweed/Nmg ducky/J^>NSg duct/~NSVeKiW duct's/K ductile/J ductility/Nmg ducting/VN ductless/J dud/NSgJGd dude/~NgSV dudgeon/Nmg due/~JNSg duel/~NgSVd>GzZ dueler/Ng duelist/NSg duelled/VtT!@_₹ dueller/NSg!@_₹ duelling/V6SN!@_₹ duellist/NSg!@_₹ duenna/NgS duet/~NgSV duff/~NgSJ>VdGZ duffer/JcNg dug/~VN dugout/~NgS duh/~ duke/~NgSV dukedom/~NSg dulcet/J dulcimer/~NgS dull/~J^>pVdGS dullard/NSg dullness/Nmg dully/Ry duly/~RyU dumb/~JY^>pV dumbass/NSgx dumbbell/~NSg dumbfound/VSdG dumbness/Nmg dumbo/NgS dumbstruck/J dumbwaiter/NSg dumdum/NgS dummy/~NSgV dump/~NgSVd>GZ dumpiness/Nmg dumpling/~NSg dumpsite/NgS dumpster/NSg dumpy/J^>pN dun/~NSgJV dunce/NSg dunderhead/NgS dune/~NgS dung/~NmgSVdG dungaree/NgS dungeon/~NSgV dunghill/NgS dunk/~VdGSNg dunned/VtT dunner/Jc dunnest/Ju dunning/~V6N dunno/N duo/~NSg duodecimal/JN duodena/N duodenal/J duodenum/Ng duopoly/~NS dupe/NgSVGd>Z duper/Ng duple/J duplex/~JNgSVG duplicate/~JVGdSNrn duplicate's duplication/~Ngr duplicator/NgS duplicitous/J duplicity/Nmg durability/~Nmg durable/~JN durably/Ry durance/Ng duration/~NwgS duress/~NgV during/~PV durometer/NgS durst/V durum/Ng dusk/~JNmgV duskiness/Nmg dusky/~J>^pN dust/~NmgSVd>GZ dustbin/NSg dustcart/NS duster/NgS dustiness/Nmg dustless/J dustman/N0 dustmen/N9 dustpan/NSg dustsheet/NS dusty/~J>^pN dutch/~NV duteous/JY dutiable/JN dutiful/JYp dutifulness/Nmg duty/~NwSg duvet/NSg!₹ dwarf/~NSgJVGd dwarfish/J dwarfism/Nmg dwarves/N9 dweeb/NSg dwell/~NSVG>zZ dwelled/VtT<@_ dweller/NgS dwelling/~NwgSV6 dwelt/VtTi!@_₹ dwindle/VdSG dyadic/~JN dybbuk/N0Sg dybbukim/N9 dye/~NwSgVd>GZ dyeing/~V6Nr dyer/~Ng dyestuff/Nmg dying/~JNgV6 dyke/~NgSV dynamic/~JNgS dynamical/~JY dynamics/~N0g dynamism/~Nmg dynamite/~NwgSVGd>Z dynamiter/Ng dynamo/~NSg dynastic/~J dynasty/~NSg dyno/NSg # dys # prefixes that are not also words in their own right don't belong in the dictionary dysania/Nmg dysentery/~Nmg dysfunction/~Nwg dysfunctional/~J dyslectic/JNSg dyslexia/Nmg dyslexic/JNSg dyspepsia/Nmg dyspeptic/JNgS dysphagia/Nmg dysphoria/Nmg dysphoric/JN dysprosium/Ng dystonia/~N dystopi dystopia/NwgS dystopian/~J dz/NV e/~NSId^W e-book/NgS e-commerce/Nmg e'en/ e'er/ e.g./~N eBay/OgV eMusic/g eSIM/NgS ea/~N each/~Dq each other/I eager/~J^Y>pVN eagerness/Ng eagle/~NgSV eaglet/NgS ear/~NSgVdY earache/NSg earbud/NSg eardrum/NSg earful/NSg earl/~NgS earldom/~NSg earliness/Ng earlobe/NSg early/~J>^pN earmark/VdGSNg earmuff/NSg earn/~Vd>GSN^Zz earned/~VU earner/Ng earnest/~NSgVJYp earnestness/Ng earnings/~9 earphone/NgS earpiece/NS earplug/NSgV earring/NSg earshot/Ng earsplitting/J earth/~ONmVdGU earth's earthbound/J earthen/~JV earthenware/Nmg earthiness/Nmg earthling/NgS earthly/~J>^NgSRy earthquake/~NSgV earths/~NVU earthshaking/J earthward/JS earthwork/~NgS earthworm/NgS earthy/J>^p earwax/Nmg earwig/NSgV earworm/NgS ease/~NmSgVd easel/NSg easement/NSg easily/~RyU easiness/NgU easing/~VN east/~NgJ eastbound/~J easterly/~NSgJ eastern/~J>Z easterner/Ng easternmost/~J eastward/~NSJ easy/~J^>pNVU easy peasy/J easygoing/J eat/~VGS>ZBn eatable/JNSg eaten/~VTJU eater/~Ng eatery/NSg eave/NgS eavesdrop/VSN eavesdropped/VtT eavesdropper/NSg eavesdropping/~NV6 ebb/~NSgJVdG ebony/~NwSgJ ebullience/Ng ebullient/JY ebullition/Ng eccentric/~JNSgQ eccentricity/~NSg eccl ecclesial/J ecclesiastic/JNSg ecclesiastical/~JY echelon/~NSgVJ echidna/N echinoderm/NSg echo/~N0VdGr echo's echoes/~N9Vr echoic/J echolocation/Nmg echos/N9 eclair/NSg eclat/Ng eclectic/~JNSgQ eclecticism/Ng eclipse/~NSgVdG ecliptic/~NgJ eclogue/NSg eco-friendly/J ecocide/Nmg ecol/N ecologic/J ecological/~JY ecologist/~NgS ecology/~Nmg econ/NJ econometric/~JS economic/~JS economical/~JYU economics/~Nmg economise/Vd>SGZ!_₹ economiser/Ng!_₹ economist/~NSg economize/Vd>SGZ economizer/Ng economy/~NwSgJ ecosphere/NgS ecosystem/~NgS ecotourism/~Nmg ecotourist/NgS ecru/NgJ ecstasy/~NSgV ecstatic/~JNQ ectoplasm/Nwg # used with indefinite article in The Great Gatsby ecu/NS ecumenical/~JY ecumenicism/Ng ecumenism/Nmg eczema/Nwg ed/~NSgre edamame/N eddy/~NSgVdG edelweiss/Ng edema/~NSg edge/~NgSVGd>Zz edger/Ng edgewise/J edgily/Ry edginess/Nmg edging/~VNg edgy/J>^p edibility/Ng edible/~JpNSg edibleness/Ng edict/~NSg edification/Nmg edifice/~NSg edifier/Ng edify/Vd>SGZn edifying/JVNU edit/~NSVdGr edit's editable/J edited/~VtTJU edition/~NgS editor/~NSg editor in chief/N editorial/~JYNSg editorialise/VdSG!_₹ editorialize/VdSG editorship/~Ng educ educability/Ng educable/JNi educate/~VdSGrnv educated/~JVtTU education/~N0gr educational/~JYN educationalist/NS educationist/~NS educations/N9 educator/~NgS educe/VdGSNB edutainment/Nmg eek/~VN eel/~NSgV eerie/~J>^N eerily/Ry eeriness/Ng eff/~VGdSN efface/VdSGL effacement/Ng effect/~NSgVdGv effective/~JYpNi effectiveness/~Ngi effectual/JYi effectuate/VdSG effeminacy/Ng effeminate/~JYVN effendi/NSg efferent/JN effervesce/VGdS effervescence/Nmg effervescent/JY effete/JYp effeteness/Ng efficacious/JY efficacy/~Ngi efficiency/~NwSgi efficient/~JYNi effigy/~NSg efflorescence/Ng efflorescent/J effluence/Nmg effluent/~JNwgS effluvia/N9 effluvium/Nw0g efflux/NwV effort/~NwSgV effortful/J effortless/JYp effortlessness/Nmg effrontery/Ng effulgence/Nmg effulgent/J effuse/JVdGSNnvX effusion/Ng effusive/JYp effusiveness/Ng egad/ egalitarian/~JNSg egalitarianism/Nmg egg/~NwSgVGd eggbeater/NgS eggcorn/NgS eggcup/NSg egghead/NSg eggnog/Ng eggplant/NgS eggshell/NSgJ eggy/J^S eglantine/NSg ego/~NSg egocentric/JNgSQ egocentricity/Ng egoism/Ng egoist/NSg egoistic/J egoistical/JY egomania/Ng egomaniac/NgS egotism/Ng egotist/NSg egotistic/J egotistical/JY egregious/~JYp egregiousness/Ng egress/~NgSV egret/~NSg eh/~VJ eider/NSg eiderdown/NgS eigenvalue/~NS eigenvector/NS eight/~NSgJ eighteen/~SgH eighteenth/~JNg eighteenths/N eighth/~JNgV eighths/NV eightieth/JNg eightieths/N eighty/~SgH einsteinium/Nmg eisteddfod/~NS either/~IC ejaculate/VGdSNnX ejaculation/~Ng ejaculatory/~J eject/~VdGSN ejection/~NgS ejector/~NSg eke/NSVdG elaborate/~JYpVGdSnX elaborateness/Ng elaboration/~Nmg elan/Ng eland/~NSg elapse/VdSG elastic/~JNgSQ elasticated/J elasticise/VdSG!_₹ elasticity/~Nmg elasticize/VdSG elate/VdSGJn elated/JYV elation/NwgS elbow/~NSgVdG elbowroom/Ng elder/~JYNSgV elderberry/NwSg eldercare/Ng eldest/~JuN eldritch/~J elect/~NSVGJv elect's electable/JN elected/VtTSJNg election/~NgSr electioneer/VdGS elective/~JNgS elector/~NgS electoral/~JY electorate/~NgS electric/~JNS electrical/~JYN electrician/NgS electricity/~Nmg electrification/~Nmg electrifier/Ng electrify/Vbd>SZn electrifying/JYV6N electrocardiogram/NgS electrocardiograph/N0g electrocardiographs/N9 electrocardiography/Nmg electrocute/VdSGXn electrocution/NwgS electrode/~NSg electrodynamics/~N electroencephalogram/NgS electroencephalograph/N0g electroencephalographic/J electroencephalographs/N9 electroencephalography/Nmg electrologist/NSg electrolysis/~Ng electrolyte/~NgS electrolytic/JN electromagnet/NgS electromagnetic/~JQ electromagnetism/~Nmg electromechanical/J electromotive/J electron/~NgS electronic/~JS electronica/~Nmg electronically/~Ry electronics/~Nmg electroplate/VdGSN electroscope/NSg electroscopic/J electroshock/NgV electrostatic/~JS electrostatics/Ng electrotype/NgSV electroweak/~J eleemosynary/JN elegance/~Ngi elegant/~JYNi elegiac/JNgS elegiacal/J elegy/~NSg elem/N element/~NgSV elemental/~JYNgS elementary/~JN elephant/~NSg elephantiasis/Ng elephantine/J elev elevate/~VdSGJXn elevation/~Nwg elevator/~NgSV eleven/~NSgH elevens/NS eleventh/~JNg elevenths/N elf/~NgV elfin/NJ elfish/J elicit/~VSdGJ elicitation/Nwg elide/VdSG eligibility/~Ngi eligible/~JN eliminate/~VdSGXn elimination/~Nwg eliminator/~NgS elision/NwgS elite/~JNSg elitism/Nmg elitist/~JNgS elixir/NSg elk/~NSg09 # singular and plural, also has a plural in -s ell/~NSg ellipse/~NgSV ellipsis/N0g ellipsoid/NSgJ ellipsoidal/J elliptic/~JN elliptical/~JYN elm/~NwSg elocution/Nmg elocutionary/J elocutionist/NSg elodea/NSg elongate/JVdSGnX elongation/Nmg elope/VdSGL elopement/NgS eloquence/~Nmg eloquent/~JYi else/~JCg elsewhere/~N elucidate/VdSGJnX elucidation/Nmg elude/VdSG elusive/~JYp elusiveness/Ng elver/NSg elves/~N9 elvish/J em/~NSI em's emaciate/VGdSJn emaciation/Nmg email/~NwSgVdG emanate/VdSGXn emanation/NwgS emancipate/VdSGJn emancipation/~Ng emancipator/NgS emancipatory/J emasculate/VGdSJn emasculation/Nmg embalm/VSGd>Z embalmer/NgS embank/VSGdL embankment/~NSg embargo/~N0gVdG embargoes/N9V embark/~VGdSrE embarkation/N0gE embarkations/N9 embarrass/VGdSL embarrassed/~JVtTU embarrassing/~V6NJY embarrassment/~NwSg embassy/~NSg embattled/JV embed/~VSN embeddable/J embedded/~VtTJ embedder/NgS embedding/~NSgV6 embellish/VGdS>L embellishment/NSg ember/~NSgJ embezzle/VGd>SZL embezzlement/~Ng embezzler/Ng embitter/VGdSL embitterment/Ng emblazon/VGdSL emblazonment/Ng emblem/~NSgV emblematic/~JQ embodiment/~NgE embody/~VGSdrE embolden/VdGS embolisation/N!_₹ embolism/~NgS embolization/N emboss/Vd>GSNZ embosser/Ng embouchure/Ng embower/VSGd embrace/~VdGSNg embraceable/J embrasure/NgS embrocation/NgS embroider/VSd>GZ embroiderer/Ng embroidery/~NwSg embroil/VdGSNL embroilment/Nmg embryo/~NSg embryological/J embryologist/NgS embryology/Nmg embryonic/~J emcee/NSgVd emceeing/V6 emend/VSdG emendation/NgS emerald/~NwgSJV emerge/~VdGSNr emergence/~Nmgr emergency/~NwSg emergent/~JNg emerita/JN9 emeritus/~JN0 emery/~NgV emetic/JNSg emf/NS emigrant/~NSg emigrate/~VdSGXn emigration/~Ng emigre/NSg eminence/~NgS eminent/~JY emir/~NgS emirate/~NgS emissary/~NSg emission/~NSg emit/~VbS emitted/~VtT emitter/~NgS emitting/~V6 emo/~NSgJ emoji/~NwSg09 # singular and plural, also has a plural in -s emollient/NgSJ emolument/NgS emote/VdGSNXnv emoticon/NSg emotion/~NwgS emotional/~JYNU emotionalise/VGdS!_₹ emotionalism/Nmg emotionalize/VGdS emotionless/J emotive/JYN empanel/VSN@ empanelled/VtT@ empanelling/V6@ empathetic/JQ empathise/VdSG!_₹ empathize/VdSG empathy/~Nmg emperor/~NgS emphases/N9 emphasis/~N0g emphasise/VGdSr!_₹ emphasize/~VGdSre emphatic/~JNUQ emphysema/~Ng empire/~NSgJ empiric/JN empirical/~JYN empiricism/Nmg empiricist/NSg emplacement/NSg employ/~VdGSNrL employ's employable/JNU employee/~NSg employer/~NSg employment/~N0wgUr employments/N9 emporium/NSg empower/~VSdGL empowerment/~Ng empress/~NgSV emptily/Ry emptiness/Nmg empty/~J^>pVGdSNg empyrean/NgJ emu/~NSg emulate/~VdSGJnvX emulation/~NwgS emulator/~NSg emulsification/Nmg emulsifier/~NgS emulsify/Vd>SGnZ emulsion/~NwgSV en/NSgPI( en masse enable/~Vd>SGZ enabler/NgS enact/~VSdGrL enactment/~NSgr enamel/~NwSgVGd>zZ enameler/NgS enamelled/JVtT!@_₹ enameller/NSg!@_₹ enamelling/V6SN!@_₹ enamelware/Nmg enamor/VSGd enamour/VdGS!@_₹ enc/N encamp/VSGdL encampment/~NgS encapsulate/VGdSXn encapsulation/Nwg encase/VdSGL encasement/Ng encephalitic/J encephalitis/~Ng enchain/VdGS enchant/VdGSNEL enchanter/NgS enchanting/V6JYN enchantment/~NwSgE enchantments/N enchantress/~NgS enchilada/NSg encipher/VSGd encircle/VdSGL encirclement/~Ng encl/N # Wiktionary says abbreviation of encyclopedia enclave/~NgSV enclose/~VGdS enclosed/~JVtTU enclosure/~NSg encode/~Vd>SNZ encoder/~Ng encoding/NwgS encomium/NgS encompass/~VGdS encore/~NSgVdG encounter/~VGdSNg encourage/~VdSGL encouragement/~NSg encouraging/~JYV6N encroach/VGdSNL encroachment/~NSg encrust/VdGS encrustation/NSg encrypt/VdGS encryption/~NwgS encumber/VGSdE encumbered/JVU encumbrance/NgSV encyclical/~NSgJ encyclopaedia/NSg!_₹ encyclopaedic/J!_₹ encyclopedia/~NgS encyclopedic/~J encyst/VSGdL encystment/Ng end/~NSgVGdvz end user/NgS endanger/~VSGdL endangerment/Ng endear/VSGdL endearing/JYNV endearment/NSg endeavor/~NSgVGd endeavour/NgSVdG!@_₹ endemic/~JNgSQ endgame/~NSJ endian/NSg endianness/Ng ending/~NgV endive/NSg endless/~JYp endlessness/Ng endmost/J endocarditis/Nmg endocrine/~JNgS endocrinologist/NgS endocrinology/Ng endogenous/~JY endometrial/J endometriosis/Nmg endometrium/N endonym/NSg endorphin/NgS endorse/~VGd>SNLZ endorsement/~NgS endorser/NgS endoscope/NgS endoscopic/J endoscopy/NgS endoskeleton/NgS endothelial/~J endothermic/J endotracheal/J endow/VSdGL endowment/~NgS endpoint/~NSgV endue/VdSG endurable/JU endurance/~Nmg endure/~VdSGB endways/ enema/NSg enemy/~NSgV energetic/~JNQ energise/VGd>SZ!_₹ energiser/Ng!_₹ energize/VGd>SZ energizer/Ng energy/~NwSg energy-efficient/J enervate/VGdSJn enervation/Ng enfeeble/VGdSL enfeeblement/Ng enfilade/NSgVdG enfold/VSGd enforce/~VGd>SLZ enforceable/JU enforced/~VtTU enforcement/~NwgS enforcer/~NgS enfranchise/VGdSEL enfranchisement/NgE engage/~VdSGEr engagement/~NgSE engagingly/Ry engender/VSGd engine/~NSgV engineer/~NgSVdG engineering/~VNmg engorge/VGdSL engorgement/Nmg engram/NSg engrave/VGd>SZz engraver/~NgS engraving/~NwgV engross/VGdSL engrossment/Nmg engulf/VSGdL engulfment/Ng enhance/~VGd>SLZ enhancement/~NSg enigma/~NSg enigmatic/~JQ enjambment/NSg enjoin/VSGd enjoy/~VGSdBL enjoyably/Ry enjoyer/NSg enjoyment/~NwSg enlarge/~VGd>SLZ enlargeable/J enlargement/~NgS enlarger/Ng enlighten/VSGdL enlightened/~JNVU enlightenment/~Nwg enlist/~VdGSNrL enlistee/NSg enlistment/~Ngr enlistments/N9 enliven/VSdGL enlivenment/Ng enmesh/VdSGL enmeshment/Ng enmity/~NSg ennoble/VdSGL ennoblement/Ng ennui/NmgV enormity/NSg enormous/~JYp enormousness/Ng enough/~INg enplane/VdSG enqueue/VdS enquire/Vd>SGZ!_₹ enquirer/~NS enquiring/V6NJY!_₹ enquiringly/Ry enquiry/NSg!_₹ enrage/VGdS enrapture/VdSG enrich/~VdSGL enrichment/~Ng enrol/VSL!@_₹ enroll/~VdSGL enrolled/VtT enrolling/V6N enrollment/~NgS enrolment/NSg!@_₹ ensconce/VdSG ensemble/~NSgV enshrine/VGdSL enshrinement/Ng enshroud/VdGS ensign/~NgSV ensilage/NgV enslave/~VdSGL enslavement/~Ng ensnare/VdSGL ensnarement/Ng ensue/VdSG ensure/~VGd>SZ ensurer/Ng entail/~VdGSNL entailment/Ng entangle/VdSGEL entanglement/~N0gE entanglements/N9 entente/~NSg enter/~VGdSNr enteral/J enteric/J enteritis/Ng enterprise/~NwgSVG enterprising/~JYVN entertain/~VGd>SNZL entertainer/~Ng entertaining/~JYVNg entertainment/~NwgS enthral/VSL!_₹ enthrall/VGdSL enthralled/JVtT!_₹ enthralling/JV6!_₹ enthrallment/Ng enthralment/Ng!_₹ enthrone/VGdSL enthronement/~NSg enthuse/VdSG enthusiasm/~NgS enthusiast/~NgS enthusiastic/~JUQ entice/VbGdSL enticement/NgS enticing/JYV6N entire/~JN entirely/R% entirety/~Ng entitle/VdSGL entitlement/~NSg entity/~NSg entomb/VdSGL entombment/Ng entomological/~J entomologist/~NgS entomology/~Ng entourage/~NSg entr'acte/N entrails/N9g entrained/V entrance/~NSgVdGL entrancement/Ng entrancing/VJY entrant/~NSg entrap/VSL entrapment/NwgS entrapped/VtT entrapping/V6 entreat/VGdSN entreating/VNY entreaty/NSg entree/NgS entrench/VdSGL entrenchment/NgS entrepreneur/~NSg entrepreneurial/~J entrepreneurship/~N entropy/~Ng entrust/VSGd entry/~NSgr entryphone/NS entryway/NgS entwine/VdSG enum/NSg enumerable/J enumerate/VdSGnX enumeration/~Nwg enumerator/NSg enunciate/VdSGn enunciation/Nwg enuresis/Ng envelop/VSd>GLZ envelope/~NSgV enveloper/Ng envelopment/Ng envenom/VSdG enviable/JU enviably/Ry envious/JYp enviousness/Ng environment/~NwgS environmental/~JYN environmentalism/~Ng environmentalist/~NSgJ environs/~NgV envisage/VGdS envision/VdGS envoy/~NSg envy/~Nm☁SgVdG envying/VNY enzymatic/~J enzyme/~NSg eolian/J eon/~NSg eosinophil/NSJ eosinophilic/J epaulet/NSg epaulette/NgS!@_₹ epee/NgS epentheses/N9 epenthesis/N0w epenthetic/JQ ephedrine/Ng ephemera/Ng ephemeral/~NJY epic/~NgSJ epicenter/~NgSV epicentre/NgSV!@_₹ epicure/NSg epicurean/~JNgS epidemic/~NSgJQ epidemiological/~J epidemiologist/NSg epidemiology/~Ng epidermal/J epidermic/J epidermis/~NgS epidural/JNS epigenome/NgS epiglottis/NgS epigram/NSg epigrammatic/J epigraph/N0gV epigraphs/N9 epigraphy/Nmg epilepsy/~Nmg epileptic/~JNSg epilogue/~NgSV epinephrine/Nmg epiphany/~NSg epiphenomena/N9 epiphenomenon/N0g episcopacy/Ng episcopal/~J episcopate/~NgV episode/~NSg episodic/~JQ epistemic/JQ epistemological/~J epistemologist/NSg epistemology/~Nmg epistle/~NSgV epistolary/JN epitaph/~N0gV epitaphs/N9V epithelial/~J epithelium/~Ng epithet/~NSgV epitomal/J epitome/~NSg epitomise/VGdS!_₹ epitomize/VGdS epoch/~N0gV epochal/J epochs/N9 eponymous/~J epoxy/~JNSgVdG epsilon/~NSg equability/Ng equable/J equably/Ry equal/~JYVdGSNg equalisation/Ng!_₹ equalise/VGd>SZ!_₹ equaliser/NgS!_₹ equality/~Nmgi equalization/Ng equalize/VGd>SZ equalizer/~NgS equalled/VtTJU!@_₹ equalling/V6!@_₹ equanimity/Nmg equate/~VdGSNnBX equation/~NgS equator/~NSg equatorial/~JN equerry/NSg equestrian/~JNSg equestrianism/Nmg equestrienne/NSg equidistant/JY equilateral/~JNSg equilibrium/~NmgE equine/~JNSg equinoctial/JN equinox/~NgS equip/~VSNr equipage/NgSV equipment/~Nmg equipoise/NgV equipped/~JVtTUr equipping/~V6Nr equirectangular/J equitable/~Ji equitably/Ryi equitation/Ng equity/~NSgi equiv/N equivalence/~NgSV equivalency/NSg equivalent/~JYNgSV equivocal/JYNU equivocalness/Nmg equivocate/VGdSnX equivocation/Nmg equivocator/NSg er/VNe era/~NSg eradicable/Ji eradicate/~VdSGn eradication/~Ng eradicator/NgS erase/~Vd>GSNBZ eraser/NgS erasure/~NSg erbium/Nmg ere/~PCN erect/~JYpVSGd erectile/J erection/~NSg erectness/Nmg erector/NgS erelong/ eremite/NgS erg/~NSgV ergo/~CN ergonomic/~JSQ ergonomics/~Ng ergosterol/Ng ergot/~Ng ermine/~NSgJV erode/~VdSG erodible/J erogenous/J erosion/~Nmg erosive/J erotic/~JNS erotica/~Ng erotically/Ry eroticism/Nmg err/~VGSd errand/NSgV errant/JNi errata/~NSg erratic/~JNQ erratum/Ng erroneous/~JY error/~NSgVdG ersatz/JNgS erst/J erstwhile/~J eruct/VSdG eructation/NSg erudite/JYNn erudition/Ng erupt/VSdGv eruption/~NgS erysipelas/Ng erythrocyte/NSg erythromycin/Nm escalade/NSgVdG escalate/~VdSGen escalation/~N0wge escalations/N9 escalator/~NgSV escalatory/J escallop/NSgVGd escalope/NS escapade/NgS escape/~VGdSNwgL escapee/NgS escapement/~NSg escapism/Nmg escapist/JNgS escapologist/NS escapology/N escargot/NgS escarole/NgS escarpment/~NgS eschatological/~JQ eschatology/~Nmg eschew/VSdG escort/~NSgVdG escritoire/NgS escrow/NSgV escudo/NSg escutcheon/~NSg esky/NgS_ # Australian genericised brand name of a cooler esophageal/~J esophagi/N9 esophagus/~N0g esoteric/~JNQ esp/~ esp./~ # abbreviation for "especially" espadrille/NgS espalier/NgSVdG especial/JY espionage/~Nmg esplanade/~NgS espousal/Ng espouse/VGdS espresso/NwgS esprit/~Ng espy/~VdGSN esquire/~NSgV essay/~NSgVd>GZ essayer/Ng essayist/~NSg essence/~NwSg essential/~JNgSi essentially/~R% establish/~VSdGrEL establishment/~N0grE establishmentarianism/Nmg establishments/~N9 estate/~NSgJV esteem/~NmSgVdGE ester/~NSg estimable/Ji estimate/~NgSVGdnX estimation/~Nmg estimator/~NSg estoppel/N estradiol/N estrange/VdSGL estrangement/NgS estrogen/~NwgS estrous/J estrus/NgS estuary/~NSg et al./~ eta/~NSg etc./~ # most dictionary only list it with the final dot etch/Vd>GSNZz etcher/Ng etching/~NgV eternal/~JYpN eternalness/Nmg eternity/~NwSg ethane/Ng ethanol/~Nmg ether/~NmgV ethereal/~JYN ethic/~JNSg ethical/~JYNU ethics/~Nmg ethmoid/NJ ethnic/~JNSgQ ethnicity/~NgS ethnocentric/J ethnocentrism/Nmg ethnocultural/J ethnographer/NSg ethnographic/~JQ ethnography/~Nmg ethnological/JY ethnologist/NSg ethnology/~Nmg ethnonationalism/Ng ethological/J ethologist/NgS ethology/Nmg ethos/~Nmg ethyl/~Nmg ethylene/~Nmg etiolated/JV etiologic/J etiological/J etiologies/N9!_₹ etiology/N0Sg etiquette/~Ng etude/NSg etymological/~JY etymologist/NSg etymology/~NwSg # eu # prefixes that are not also words in their own right don't belong in the dictionary eucalypti/N9 eucalyptus/~N0gS euchre/NSgVdG euclidean/~J eugenic/JSQ eugenicist/NgS eugenics/~Nmg eukaryote/NSg eukaryotic/~JN eulogise/VGd>SZ!_₹ eulogist/NgS eulogistic/J eulogize/VGd>SZ eulogizer/Ng eulogy/~NSg eunuch/~N0gV eunuchs/~N9 euphemism/~NwSg euphemistic/JQ euphonious/JY euphony/Nmg euphoria/Nmg euphoric/JNQ eureka/~N euro/~NgS europium/Nmg eutectic/~JN euthanasia/~Nmg euthanize/VdSG euthenics/Ng eutrophication/N evacuate/~VdSGXn evacuation/~NwgS evacuee/NgS evade/~Vd>SGZ evader/Ng eval/NSgVdG evalled/VtT!@_₹ evalling/V6!@_₹ evaluate/~VGdSrnvX evaluation/~NwSgr evaluative/J evaluator/NS evanescence/Nmg evanescent/J evangelic/JN evangelical/~JYNSg evangelicalism/Nmg evangelise/VGdS!_₹ evangelism/~Nmg evangelist/~NgS evangelistic/J evangelize/VGdS evaporate/VGdSn evaporation/~Ng evaporative/J evaporator/NSg evasion/~NSg evasive/JYp evasiveness/Ng eve/~NSgr even/~JY^>pVdGSRNgz even-numbered/J evenhanded/JY evening/~NwgSV evenness/NgU evensong/Ng event/~NSgV eventful/JYU eventfulness/Nmg eventide/Ng eventual/~JY eventuality/NSg eventuate/VGdS ever/~RJ ever-present/J everglade/NSg evergreen/~JNSgV everlasting/~JYNgS evermore/~ every/~Dq everybody/~Ig everyday/~JN everyone/~Ig everyplace/ everything/~IVg everywhere/~RNm evict/VSdG eviction/~NwgS evidence/~NmgSVGd evident/~JY evidential/Nwg # used in linguistics as a count noun; e.g. "a system of evidentials" evil/~J>Y^pNmgS evildoer/NSg evildoing/Nmg eviller/Jc evillest/Ju evilness/Nmg evince/VdSG eviscerate/VdSGn evisceration/Nmg evocation/NgS evocative/~JY evoke/~VdSG evolution/~NwgS evolutionary/~J evolutionist/NSg evolve/~VdSG ewe/~NSg>Z ewer/Ng ex/~NgSVJ( ex-friend/NgS exabyte/NgS exacerbate/VGdSn exacerbation/Nwg exact/~JY^>pVbSdG exacting/JYV6 exaction/Ng exactitude/Nmg exactness/Nmgi exaggerate/VdSGJXn exaggerated/~JYVtT exaggeration/~NmgS exaggerator/NgS exajoule/NS exalt/VSdG exaltation/NwgS exam/~NgSV examination/~NwgSr examine/~VGdSNr examiner/~NgS example/~NgSVGd exampled/VU exasperate/VdSGJn exasperated/~VJY exasperating/VJY exasperation/Ng excavate/VGdSNnX excavation/~Ng excavator/NSg exceed/~VGSd exceeding/~V6JYN excel/~VS excelled/~VtT excellence/~Ng excellency/~NSg excellent/~JY excelling/V6 excelsior/~JNg except/~VGSdPC exception/~NwSgB exceptionable/JU exceptional/~JYNU exceptionalism/Nmg excerpt/~NgSVdG excess/~NgSJVv excessive/~JY exchange/~NSgVdG> exchangeable/JN exchequer/~NSgV excise/~NSgVdGXn excision/~Ng excitability/Nmg excitably/Ry excitation/~Nmg excite/~Vd>SGBLZ excited/~JYVtT excitement/~NSg exciter/Ng exciting/~V6JYN exciton/N excl/P exclaim/VdGSN exclamation/~NSg exclamatory/J exclave/~NgS exclude/~VGdS exclusion/~NgS exclusionary/J exclusive/~JYpNgS exclusiveness/Nmg exclusivity/~Nmg excommunicate/JNSVGdnX excommunication/~Ng excoriate/VdSGnX excoriation/Ng excrement/Nmg excremental/J excrescence/NgS excrescent/NJ excreta/Ng excrete/VGdSXn excretion/~NgS excretory/JN excruciating/JY exculpate/VdSGn exculpation/Ng exculpatory/J excursion/~NgSV excursionist/NgS excursive/JYp excursiveness/Ng excusable/Ji excusably/Ryi excuse/~VdGSNgB excused/~VtTU exec/~NgSV execrable/J execrably/Ry execrate/VdSGn execration/Ng executable/JNgS execute/~VGdSBXnv execution/~NwgS>Z executioner/~NgS executive/~JNSg executor/~NgS executrices/N9 executrix/N0g exegeses/N9 exegesis/~N0g exegetic/J exegetical/~J exemplar/NSgJ exemplary/~JN exemplification/Nmg exemplify/~VGdSXn exempt/~JNSVGd exemption/~NSg exercise/~NwSgVd>GZ exerciser/Ng exert/~VSdG exertion/NwgS exeunt/NV exfoliate/VGdSn exhalation/NwgS exhale/VdGSN exhaust/~VGdSNgJv exhaustible/Ji exhaustion/~Ng exhaustive/~JYp exhaustiveness/Ng exhibit/~VGdSNg exhibition/~NgS exhibitionism/Nmg exhibitionist/NgSJ exhibitor/NSg exhilarate/VdSGn exhilaration/Ng exhort/VSdG exhortation/~NgS exhumation/NgS exhume/VdSG exigence/NwgS exigency/NSg exigent/JN exiguity/Ng exiguous/J exile/~NSgVdG exilic/J exist/~VSdG existence/~NgS existent/~JN existential/~JYN existentialism/Ng existentialist/~NgSJ exit/~NgSVdG exobiology/Ng exodus/~NgSV exogenous/~J exon/NgS exonerate/VGdSJn exoneration/Ng exoplanet/~NgS exorbitance/Ng exorbitant/~JY exorcise/VdSG exorcism/NSg exorcist/~NSg exoskeleton/~NSg exosphere/NSg exothermic/J exotic/~JNSg exotica/NQ exoticism/Ng exp/~ expand/~VGSdB expandability/Nmg expander/NgS expanse/~NgSXnv expansible/J expansion/~Nmg expansionary/J expansionism/Nmg expansionist/~JNgS expansive/~JYp expansiveness/Nmg expat/NgS expatiate/VGdSn expatiation/Ng expatriate/~JNSgVdGn expatriation/Ng expect/~VGSd expectancy/~Nmg expectant/JYN expectation/~NwSg expected/JYpNU expectedness/NgU expectorant/NSgJ expectorate/VdSGn expectoration/Ng expedience/N0gi expediences/N9 expediencies/N9 expediency/N0gi expedient/JYNSg expedite/Vd>SGJZnX expediter/Ng expedition/~NwSgV expeditionary/~JN expeditious/JYp expeditiousness/Nmg expel/~VS expelled/~VtT expelling/~V6N expend/VGSdB expendable/~JNSg expenditure/~NwSg expense/~NwgSV expensive/~JYpi expensiveness/Nmgi experience/~Nw0gVd experiences/~N9Vh experiencing/~V6N experiential/~J experiment/~NgSVd>GZ experimental/~JYN experimentalist/NgS experimentation/~Nmg experimenter/NgS expert/~JYpNSg expertise/~NmgV expertness/Nmg expiate/VGdSn expiation/Nmg expiatory/J expiration/~NwgS expire/~VdSG expired/~VtTJU expiry/~Nmg explain/~VdGSr explainability/Nmg explainable/J explained/~VtTU explainer/NgS explanation/~NwgS explanatory/~J expletive/JNgS explicable/Ji explicate/VGdSJXn explication/Ng explicit/~JYpN explicitness/Nmg explode/~VGdS exploder/NgS exploit/~NgSVGd>ZB exploitability/Nmg exploitation/~Nmg exploitative/~J exploited/~VU exploiter/NgV exploration/~NwgS exploratory/~JN explore/~VGd>SNZ explored/~jU explorer/~Ng explosion/~NSg explosive/~JYpNSgw explosiveness/Nmg expo/~NgS exponent/~NgS exponential/~JYNgS exponentiate/VGdSXn export/~J>NwSgVGdBZ exportation/Ng exporter/~Ng expose/~VdSGg exposed/~JVU exposition/~NwSg expositor/NSg expository/~J expostulate/VGdSnX expostulation/Ng exposure/~NgS expound/VGd>SZ expounder/Ng express/~JYNgSVGdv expressed/~VtTJU expressible/Ji expression/~NwSg expressionism/~Nmg expressionist/~JNSg expressionistic/J expressionless/JY expressive/~JYpN expressiveness/Nmg expressway/~NSg expropriate/VGdSnX expropriation/~Ng expropriator/NSg expulsion/~NgS expunge/VGdS expurgate/VdSGnX expurgated/VJU expurgation/Ng exquisite/~JYpN exquisiteness/Ng ext/~N extant/~J extemporaneous/JYp extemporaneousness/NmSg extempore/JN extemporisation/Ng!_₹ extemporise/VGdS!_₹ extemporization/Nmg extemporize/VGdS extend/~VGd>SNZB extender/NgS extensibility/N extensible/~J extension/~NSg extensional/J extensive/~JYp extensiveness/Nmg extent/~NSgJ extenuate/VdSGJn extenuation/Ng exterior/~JNgS exterminate/~VdSGXn extermination/~Ng exterminator/NgS external/~JYNgS externalisation/NgS!_₹ externalise/VdSG!_₹ externalization/NSg externalize/VdSG extinct/~JVGdSN extinction/~NwgS extinguish/~VGd>SZB extinguishable/Ji extinguisher/Ng extirpate/VGdSn extirpation/Ng extol/VS extolled/VtT extolling/V6 extort/VSGdJ extortion/~Ng>Z extortionate/JY extortioner/Ng extortionist/NgS extra/~JNSg( extracellular/~J extract/~NgSVdGv extraction/~NwSg extractor/NgS extracurricular/~JNgS extradite/VGdSnBX extradition/~Ng extrajudicial/~J extralegal/J extramarital/J extramural/J extraneous/JY extraordinaire/JN extraordinarily/~Ry extraordinary/~JpN extrapolate/VGdSXn extrapolation/~Nwg extrasensory/J extraterrestrial/~JNgS extraterritorial/J extraterritoriality/Ng extravagance/~NwgS extravagant/~JY extravaganza/NgS extravehicular/J extrema/N9 extreme/~JY^>pNgS extremeness/Nmg extremism/~Nmg extremist/~NgSJ extremity/~NSg extremum/N0Sg extricable/Ji extricate/VGdSn extrication/Nmg extrinsic/~JNQ extroversion/Ng extrovert/NSgJVd extrude/VGdS extrusion/NSg extrusive/JN exuberance/Ng exuberant/JY exudation/Ng exude/VdSG exult/VSdG exultant/JY exultation/Ng exurb/NSg exurban/J exurbanite/NSg exurbia/Ng eye/~NSgVd eye candy/Nmg eyeball/NgSVGd eyebrow/~NSgV eyedropper/NSg eyeful/NSgJ eyeglass/NgS eyeing/V eyelash/NgS eyeless/J eyelet/NSgV eyelid/~NSg eyeliner/NwgS eyeopener/NgS eyeopening/J eyepiece/NgS eyesight/~Nmg eyesore/NgS eyestrain/Ng eyeteeth/N9 eyetooth/N0g eyewash/NgV eyewear/Nmg eyewitness/~NgSV #f/~N^>eirv # N:noun ^:fest >:fer e:def i:inf r:ref v:five fMRI/N fa/~NgP fab/~JNgSV fable/~NSgVd fabric/~NwSgV fabricate/VdSGnX fabrication/~Nmg fabricator/NSg fabulous/~JY facade/~NSg face/~NSVdGre face off/V face-off/NgS face's facecloth/N0g facecloths/N9 faceless/J facelift/NgSVdG facepalm/NSVdG facet/~NSgVdG facetious/JYp facetiousness/Ng facial/~JYNSg facile/JY facilitate/~VGdSn facilitation/~Nmg facilitator/NgS facility/~NSg facing/~JNSgV facsimile/~NSgVd facsimileing/V fact/~NgS fact check/NS fact-check/VSdG fact-checking/Ng faction/~NSg factional/~J factionalism/Nmg factious/J factitious/J factoid/NSg factor/~NSVdGr factor's factorial/~NgSJ factorisation/NwS!_₹ factorise/VGdS!_₹ factorization/~NwS factorize/VGdS factory/~NSgJ factotum/NSg factual/~JYN factuality/Ng faculty/~NSg fad/~NSgGd faddish/Jp faddist/NgS faddy/Jp fade/~JNgSV fading/~VNU faecal/J!_₹ faeces/Ng!_₹ faerie/~NSg faff/NSVdG fag/NSgV fagged/VtT fagging/V6N faggot/NSgV fagot/NSgVG faience/Ng fail/~VdGSNJz fail over/V/ fail-safe/NgSJ failing/~VNgP faille/Ng failure/~NwSg fain/J^>V faint/~JY^>pNSgVdG fainthearted/J faintness/Ng fair/~JY^>pNgSVGz fairground/~NgS fairing/NgV fairness/~NmgU fairway/NSg fairy/~NSgJ fairyland/NSgJ faith/~N0w☁g faithful/~JYpN0U faithful's faithfulness/~NmgU faithfuls/N9 faithless/JYp faithlessness/Nmg faiths/~N9 fajita/N0Sg fajitas/N9g fake/~J>NgSVGdZ faker/NgJ fakir/~NSg falcon/~NSgV>Z falconer/~Ng falconry/Nmg fall/~VbGSNwg fall back/V/ fallacious/JY fallacy/~NSg fallback/NgSJV fallen/VTJ fallibility/Nmgi fallible/Jp fallibleness/Nmg fallibly/Ryi falloff/NSg fallout/~Nmg fallow/NSgJVdG false/~JY^>pVN false positive/NgS falsehood/~NwSg falseness/Nmg falsetto/NSgV falsie/NSg falsifiable/J falsification/~NwgS falsifier/Ng falsify/Vd>SGZnX falsity/NSg falter/NSgVGdz faltering/JYVN fame/~NwVd fame's familial/~J familiar/~JYNgS familiarisation/Nmg!_₹ familiarise/VGdS!_₹ familiarity/~NgU familiarization/Nmg familiarize/VGdS family/~NwSgJ famine/~NwSg famish/VdSG famous/~JYVi fan/~NSgV fanatic/~JNSg fanatical/JY fanaticism/Nmg fanboy/NSgVdG fanciable/J fancier/NgJ fanciful/~JYp fancifulness/Nmg fancily/Ry fanciness/Nmg fancy/~NSgJ^>pVdGZU fancywork/Ng fandango/~NgSV fandom/~N fanfare/~NwSgV fang/~NgSVd fanlight/NSg fanmade/J fanned/VtT fanning/~V6N fanny/~NSg fantail/NgS fantasia/~NSg fantasise/VGdS!_₹ fantasist/NS fantasize/VGdS fantastic/~JN fantastical/~JYN fantasy/~NwSgVdG fanzine/~NgS far/~JVN far right/NgS far-right/J farad/NSg faradize/VdG faraway/~JN farce/~NwSgV farcical/JY fare/~NwgSVGd farewell/~NSgJV farina/~Ng farinaceous/J farm/~NgSVd>GZz farmer/~NgS farmhand/NSg farmhouse/~NSg farming/~NmgJV6 farmland/~NwgS farmstead/~NgS farmyard/NgS faro/Ng farrago/N0g farragoes/N9 farrier/NgSV farrow/NSgVdGJ farseeing/J farsighted/Jp farsightedness/Ng fart/VdGSNgx farther/~JcV farthermost/J farthest/~Ju farthing/NSg fascia/~NSg fascicle/NSg fascinate/VGdSnX fascinating/~JYV6 fascination/~Ng fascism/~Nmg fascist/~JNgS fascistic/J fashion/~NwgSVGd>ZB fashionable/~JNU fashionably/RyU fashioner/Ng fashionista/NgS fast/~J^>pNgSVdGRy fast track/NgSVdG fastback/NSg fastball/NSg fasten/VGdSUr fastener/NSg fastening/VSNg fastidious/JYp fastidiousness/Ng fastness/NgS fat/~JpNwSgVGd fatal/~JYN fatalism/~Ng fatalist/NSg fatalistic/JQ fatality/~NSg fatback/Ng fate/~NgSV fateful/~JYp fatefulness/Ng fathead/NgSd father/~NSgVGd fatherhood/Ng fatherland/~NgS fatherless/J fatherly/JR fathom/NSgVdGB fathomable/JU fathomless/J fatigue/~NgSVdG fatigues/NgV fatness/Ng fatso/NS fatten/VSdG fatter/Jc fattest/Ju fattiness/Nmg fatty/~J>^pNSg fatuity/Ng fatuous/JYp fatuousness/Ng fatwa/~NSgV faucet/NSg fault/~NSgVdGe faultfinder/NSg faultfinding/NgJ faultily/Ry faultiness/Ng faultless/JYp faultlessness/Ng faulty/~J>^p faun/NgS fauna/~NwSg fauvism/Ng fauvist/JNSg faux/~J fava bean/NgS fave/JNSV favicon/~NSg favor/~NwSgVdGE< favorability/NgU< favorable/~JU< favorably/~RyU< favorite/~JNSgV< favoritism/Nmg< favour/NwSgVdGE!@_₹ favourability/NgU!@_₹ favourable/JNU!@_₹ favourably/RyU!@_₹ favourite/JNgSV!@_₹ favouritism/Nmg!@_₹ fawn/NgSJ>VdGZ fawner/NgS fax/~NgSVGd fay/~V>SJ^Ng fayre/JN!@_₹ faze/VGdS fazed/JVtTU fealty/Nmg fear/~NwgSVdG # removed 5 adjective flag since it's rare and dialectal fearful/~JYp fearfulness/Nmg fearless/~JYp fearlessness/Nmg fearmonger/NgSVdG fearsome/~J feasibility/~Nmg feasible/~JiU feasibly/Ry feast/~NSgVd>GZ feaster/NgS feat/~NgSJV feather/~NSgVGd featherbedding/V6Ng featherbrained/J featherless/J featherweight/~NwgS feathery/J^>N feature/~NSgVdG feature-length/J featureful/J featureless/J featurette/NgS febrile/J fecal/~J feces/~Ng feckless/JYp fecund/J fecundate/VGdSn fecundation/Ng fecundity/Ng fed/~NSgV federal/~JYNSg federalisation/Ng!_₹ federalise/VGdS!_₹ federalism/~Ng federalist/~NgSJ federalization/Ng federalize/VGdS federate/JNSVdGWXn federation/~NgJW fedora/NSg fee/~NSgV feeble/~J^>pV feebleness/Nmg feebly/Ry feed/~V>GSNgZz feedback/~NmgV^ feedbag/NSg feeder/~Ng feeding/~VNg feedlot/NSg feedstock/Ng feel/~V>GSNgIZz feeler/Ng feelgood/J feeling/~JYNwSgV feet/~9 feign/VSdG feigned/JVU feint/NSgVdGJ feisty/J^> feldspar/~Ng felicitate/VGdSJnX felicitation/Ng felicitous/JY felicity/~NSgi feline/~JNSg fell/~Vtd>GSNgJ^Z fella/NS fellatio/Ng fellow/~NSg fellowman/Ng fellowmen/9 fellowship/~NwgSV felon/JNSg felonious/J felony/~NSg felt/~NwgSVtTdGJ fem/~NJ female/~JpNSg femaleness/Ng feminine/~JYNSg femininity/~Nmg feminise/VdSG!_₹ feminism/~Nmg feminist/~JNSg feminize/VdSG femme/NgS femoral/~J femur/~NSg fen/~NSg fence/~NSgVd>GZ fencer/~NgS fencing/~VNmg fend/~Vd>GSNeZ fender/~NgVe fenestration/Ng fennel/Nmg fentanyl/Nmg feral/~JN ferment/~VSNgWe fermentation/~NwSg fermented/~V6J^ fermenting/V6 fermion/NgS fermium/Nmg fern/~NgS ferny/J>^ ferocious/~JYp ferociousness/Nmg ferocity/Nmg ferret/~NSgVGd ferric/J ferromagnetic/J ferromagnetism/N ferrous/~J ferrule/NgSV ferry/~VdGSNg ferryboat/NSg ferryman/Ng ferrymen/9 fertile/~Ji fertilisation/Ng!_₹ fertilise/Vd>SGZ!_₹ fertilised/VU!_₹ fertiliser/Ng!_₹ fertility/~Ngi fertilization/~Ng fertilize/Vd>SGZ fertilized/~VU fertilizer/~Ng ferule/NSgV fervency/Ng fervent/~JY fervid/JY fervor/Ng fervour/Ng!@_₹ fess/~VGdSNJWK fest/~NgS>Zv festal/J fester/NgVGd festival/~JNSg festive/~JYp festiveness/Nmg festivity/NSg festoon/NgSVGd feta/Ng fetal/~J fetch/~Vd>GSNZ fetcher/Ng fetching/JYVN fete/NgSVGd fetid/JpN fetidness/Ng fetish/~NgS fetishism/~Ng fetishist/NSg fetishistic/J fetishization/Ng fetishize/VdSG fetlock/~NgS fetter/NSVGdU fetter's fettle/NgSVdG fettuccine/Ng fetus/~NgS feud/~NgSVdG feudal/~J feudalism/~Ng feudalistic/J fever/~NSgVd feverish/JYp feverishness/Ng few/~IDq^pg fewer/Dqc fewness/Ng fey/~JN fez/~Ng fezzes/N ff/~V fiance/NgVe fiancee/NgS fiances/N fiasco/~Ng fiascoes/N0 fiat/~N9gSV fib/NSgV>Z fibbed/VtT fibber/NSg fibbing/V6N fiber/~NwgS fiberboard/Nmg fiberfill/Ng fiberglass/~NmgV fibre/NwSg!@_₹ fibreboard/Nmg!@_₹ fibrefill/Ng!@_₹ fibreglass/NmgVb!@_₹ fibril/NSg fibrillate/VGdSn fibrillation/~Nmg fibrin/NgV fibroid/N fibrosis/~Ng fibrous/~J fibula/~N0g fibulae/N9 fibular/J fiche/NSg fichu/NSg fickle/J^>pV fickleness/Ng fiction/~NmgS fictional/~JY fictionalisation/NwSg!_₹ fictionalise/VdSG!_₹ fictionalization/NSg fictionalize/VdSG fictitious/~JY fictive/JN ficus/Ng fiddle/~NSgVd>GZ fiddler/~NgS fiddlesticks/N fiddly/J^> fidelity/~Ngi fidget/VGdSNg fidgety/J fiduciary/~JNSg fie/ fief/~NgS fiefdom/NgS field/~NSgV>iZ fielded/~VtT fielder/~Ngi fielding/~V6N fieldsman/N fieldsmen/9 fieldwork/~Ng>Z fieldworker/Ng fiend/~NSgV fiendish/JY fierce/~J>Y^p fierceness/Ng fieriness/Ng fiery/~J>^p fiesta/~NSgV fife/~NgSV>Z fifer/Ng fifteen/~NgSH fifteenth/~JNg fifteenths/N fifth/~JYNgV fifths/~N fiftieth/~JNg fiftieths/N fifty/~NSgH fig/~NSgVL fight/~V>GSNgZ fight back/V/ fightback/N fighter/~NgSi fighting/~JVNgi figment/NgS figuration/NgW figurative/~JY figure/~NSVGdWE figure's figurehead/~NSg figurine/NgS filament/~NgS filamentous/J filbert/NgS filch/VdGSN file/~NSVGderK file sharing/Nmg file size/NgS file's/Ke filename/~NS filer/NSge filet/NV filetype/NSgVGd filial/~J filibuster/NgSVd>GZ filibusterer/Ng filigree/NSgVd filigreeing/V6 filing's filings/~N fill/~VdGSNri fill's fillable/J filled/~JVtTU filler/~NgS fillet/NgSVdG filling/~V6SJNwg fillip/NgSVdG filly/~NSg film/~NwgSVdG filminess/NgM filmmaker/~NSg filmmaking/NgM filmstrip/NgS filmy/J^>p filo/N filter/~NgSVd>GBZ filtered/~JVU filterer/Ng filth/~Ng filthily/Ry filthiness/Ng filthy/~J^>pV filtrate/NSVGdin filtrate's filtration/~NwSgi fin/~NSgV> finagle/Vd>SGZ finagler/Ng final/~NSgJYV finale/~NgS finalisation/Nmg!_₹ finalise/VdSG!_₹ finalist/~NSg finality/Ng finalization/Nmg finalize/~VdSG finance/~NwSVdGr finance's financial/~JY financialization/Ng financialize/VdSG financials/9 financier/~NgSV financing/~NgV6 finch/~NgSV find/~V>GSNgzZ finder/~Ng finding/~NgV6 findings/~Ng fine/~J^NSVGderW fine-tune/VSdG fine's/W finely/~Ry fineness/Ng finery/Ngr finespun/J finesse/~NSgVdG finger/~NgSVdGz fingerboard/NSg fingering/NgV fingerling/NSg fingermark/NS fingernail/NSg fingerprint/NSgVGd fingertip/NgSV finial/NgS finical/J finickiness/Ng finicky/J>^p finis/NgS finish/~NSVdGr finish's finished/~JVtTU finisher/~NgS finite/~JYNi fink/~NgSVdG finless/J finned/~JVtT finny/J fintech/Ng fir/~NSgGd>ZzH firable/J fire/~NwgSJV firearm/~NSg fireball/~NgSJV firebird/~NSg firebomb/NgSVdGz firebox/~NgS firebrand/NSg firebreak/NSg firebrick/NSg firebug/NSg firecracker/NSg firedamp/Ng firefight/NgSV>GZ firefighter/~Ng firefighting/~Ng firefly/~NSg fireguard/NS firehouse/~NSg firelight/Ng>Z fireman/~N0g firemen/~N9 fireplace/~NSg fireplug/NgS firepower/~Nmg fireproof/JVdSG firer/Ng firescreen/NS fireside/NgS firestorm/NgS firetrap/NgS firetruck/NgS firewall/~NgSV firewater/Ng firewood/~Nmg firework/NSg firm/~NgSJY^>pVdG firmament/NSg firmness/Nmg firmware/~Nmg first/~JYNSg first-hand/R first person/Ng first-person/J first time/NgS first-time/J firstborn/~NSgJ firsthand/~JR firth/~Ng firths/N fiscal/~JYNgS fish/~Nw09gSVd>GZ # singular and plural, also has a plural in -s fishbowl/~NSg fishcake/NSg fisher/~Ng fisherman/~Ng fishermen/~9 fishery/~NSg fisheye/NSg fishhook/NSgV fishily/Ry fishiness/Nmg fishing/~NgV fishmonger/NgS fishnet/NSg fishpond/NgS fishtail/NSVdG fishwife/Ng fishwives/9 fishy/J^>pN fissile/~J fission/~NmgVB fissure/~NSgV fist/~NgSV fistfight/NgSV fistful/NSg fisticuffs/Nmg fistula/NSg fistulous/Jg fit/~JVbtTSNgKr fitful/JYp fitfulness/Ng fitly/Ry fitment/NS fitness/~NmgU fitted/~VtTJNUr fitter/NgSJc fittest/JuV fitting/~V6SJYNg five/~NgS>Z fix/~VGd>SNgZBz fix up/V/ fixate/VGdSnvX fixation/~Ng fixative/NgSJ fixed/~VJY fixer/~Ng fixings/Ng fixity/Ng fixture/~NgSV fizz/NgSVdG fizzle/VdGSNg fizzy/J>^N fjord/~NSg fl/JdGz flab/Ng flabbergast/VGdSN flabbily/Ry flabbiness/Ng flabby/J>^p flaccid/JY flaccidity/Ng flack/VSNg flag/~NgSV flagella/~N flagellant/NSJ flagellate/VGdSJNn flagellation/Ng flagellum/Ng flagged/~VtTJ flagging/V6JNU flagman/Ng flagmen/9 flagon/NgS flagpole/~NSgV flagrance/Ng flagrancy/Ng flagrant/JY flagship/~NSgV flagstaff/~NgS flagstone/NgS flail/NSgVGd flair/~NSgV flak/~Nmg flake/~NSgVdG flakiness/Nmg flaky/J^>p flamage/N flambe/JNgSV flambeed/VtT flambeing/V6 flamboyance/Nmg flamboyancy/Nmg flamboyant/~JYN flame/~NSgJ>VdGzZ flamenco/~NgSV flameproof/JVdGS flamethrower/NSg flamingo/~NgSJ flamingoes/N9 flammability/Ngi flammable/~JNSg flan/NgSV flange/NgSV flank/~VGd>SNgJZ flanker/NgV flannel/NSgJVGd flannelette/Nmg flannelled/J!@_₹ flannelling/V!@_₹ flap/~NgSV flapjack/NgS flapped/VtTJ flapper/NSg flapping/JNV6 flappy/J flare/~NSgVdG flareup/NSg flash/~VGd>SNgJ^ZB flash point/NgS flashback/~NSgV flashbulb/NSg flashcard/NSg flashcube/NSg flasher/Ng flashgun/NSg flashily/Ry flashiness/Ng flashing/~NgV flashlight/NgSV flashy/J>^p flask/NSgV flat/~JYpNgSV flatbed/NSgJV flatboat/NSg flatbread/Nmg flatcar/NSg flatfeet/9 flatfish/N09gS # singular and plural, also has a plural in -s flatfoot/NSgVd flathead/~NSg flatiron/NSgJ flatland/Ng flatlet/NS flatline/NgSVdG flatmate/NS flatness/Ng flatted/VtT flatten/VSdG flatter/~Jc>VdGSNZ flatterer/Ng flattering/JYV6N flattery/Ng flattest/Ju flatting/NV6 flattish/J flattop/NSg flatulence/Ng flatulent/J flatus/Ng flatware/Nmg flatworm/NSg flaunt/VdGSNg flaunting/V6JYN flautist/NSg!@_₹ flavor/~NwgSVdGz< flavored/~JVtTU< flavorful/J< flavoring/NgV6< flavorless/J< flavorsome/J< flavour/NwSgVdGz!@_₹ flavoured/JVtTU!@_₹ flavourful/J!@_₹ flavouring/NgV6!@_₹ flavourless/J!@_₹ flavoursome/J!@_₹ flaw/~NgSVdG flawless/JYp flawlessness/Ng flax/~Ngn flay/VdGSN flea/~NgSV fleabag/NSg fleabite/NS fleapit/NS fleck/~NSgVGd fledged/~JVU fledgling/~JNgS flee/~VS fleece/~NgSVGd>Z fleecer/Ng fleeciness/Ng fleecy/J>^p fleeing/~V6N fleet/~NSgVGd>J^Yp fleetingly/Ryg fleetingness/Ng fleetness/Ng flesh/~NwgSVGdY fleshly/J^> fleshpot/NgS fleshy/~J>^ flew/~VtNJ flex/~NgSVr flexed/V flexibility/~Ngi flexible/~JNi flexibly/Ryi flexing/VN flexion/N flextime/Ng flibbertigibbet/NSg flick/~NSgVGd>Z flicker/~NgVGd flier/JcNgV flight/~NwgSJV flightiness/Nmg flightless/~J flighty/J^>p flimflam/NSgV flimflammed/VtT flimflamming/V6 flimsily/Ry flimsiness/Nmg flimsy/J^>pN flinch/NgSVGd fling/NgVG flint/~NwSgV flintlock/NSg flinty/J^> flip/~NgSVJ flippancy/Nmg flippant/JY flipped/~VtT flipper/NgSJc flippest/Ju flipping/~V6JN flippy/JNS flirt/NSgVGdJ flirtation/NgS flirtatious/JYp flirtatiousness/Ng flirty/J flit/NgSVJ flitted/VtT flitting/NV6J float/~Vd>GSNgZ floater/Ng floaty/NgSJ>^ flock/~NSgVdG flocking/VNg floe/NgS flog/VSN flogged/VtT flogger/NSg flogging/~NgSV6 flood/~NSgVd>G floodgate/NgS floodlight/NgSVdG floodlit/JV floodplain/~NgS floodwater/NgS floor/~NSgVdG floorboard/NgSV flooring/~NmgV floorwalker/NSg floozy/NSg flop/~VSNg flophouse/NgSV flopped/VtT floppily/Ry floppiness/Ng flopping/V6N floppy/~J>^pNSg flora/~NwSg floral/~JN florescence/Ngi florescent/Ji floret/NSg florid/JYp floridness/Nmg florin/~NSg florist/NSg floss/NgSVdG flossy/J>^ flotation/NSg flotilla/~NgS flotsam/Nmg flounce/VdGSNg flouncy/J flounder/NgSVdG flour/~NSgVdG flourish/~VGdSNg floury/J flout/Vd>GSNgZ flouter/Ng flow/~NgSVdG flowchart/NSg flower/~NSVdGe flower's flowerbed/NgS floweriness/Ng flowering/~V6SNJ flowerless/J flowerpot/NgS flowery/J^>p flown/~VTJ flt/N flu/~Ng flub/NgSV flubbed/VtT flubbing/V6 fluctuate/VGdSnX fluctuation/Ng flue/~NgSJ fluency/~Nmg fluent/~JYN fluff/~NwSgVdG fluffiness/Nmg fluffy/~J>^pN fluid/~NwSgJY fluidity/~Ng fluke/NSgV fluky/J>^ flume/NSgV flummox/VdSG flung/~V flunk/VSdGg flunky/NSg fluoresce/VdSG fluorescence/~Ng fluorescent/~JN fluoridate/VGdSn fluoridation/~Ng fluoride/~NSg fluorine/~Ng fluorite/Ng fluorocarbon/NgS fluoroscope/NSgV fluoroscopic/J fluoxetine/N flurry/~NSgVGd flush/~NgSVd>GJ^ fluster/VdGSNg flute/~NSgVdG fluting/VJNg flutist/NgS flutter/VdGSNg fluttery/J fluvial/~J flux/~NwgSVJi fluxed/VtT fluxing/V6 fly/~NSgVGd>J^ZB flyaway/JN flyblown/J flyby/N0g flybys/N9 flycatcher/~NgS flyer/NSgVJ!@_₹ flying/~JVNg flyleaf/Ng flyleaves/N flyover/~NgS flypaper/NwSgV flypast/NS flysheet/NS flyspeck/NgSVGd flyswatter/NgS flytrap/NS flyway/NSg flyweight/~NwSg flywheel/~NgS foal/~NgSVdG foam/~NwgSVdG foaminess/Nmg foamy/J>^pN fob/NSgVJ fobbed/VtT fobbing/V6 focal/~JYN focus/~Nw0SVdGr focus's focused/~JVU fodder/~NmSgV foe/~JNSg fog/~NwSVe fog's fogbound/J fogey/NSg!@_₹ fogged/VtTe foggily/Ry fogginess/Nmg fogging/V6Ne foggy/~J>^p foghorn/NgSV fogy/NSg fogyish/J foible/NSgJ foil/~NwgSVdG foist/VdGSNJ fol/~ fold/~VGdSNrUB fold's foldaway/JN folder/~NSg foldout/NgSJ foliage/~Nmg folic/J folio/~NSgV folk/~NgSJ folklore/~Nmg folkloric/~J folklorist/~NgS folksiness/Nmg folksinger/NSg folksinging/Nmg folksy/J^>p folktale/NgS folkway/NgS foll/J follicle/~NgS follow/~Vd>GSNZz follower/~NgS following/~JPNwgSV followup/NgS folly/~NSgV foment/VGdSN fomentation/Nmg fond/~JY^>pVN fondant/NgS fondle/VdGSN fondness/~Nmg fondue/NSgV font/~NgSV fontanel/NgS fontanelle/NgS!@_₹ foo/N foobar/N food/~NgS foodie/NSg foodstuff/NSg fool/~NgSVdGJ foolery/NSg foolhardily/Ry foolhardiness/Ng foolhardy/J^>pN foolish/~JYp foolishness/Ng foolproof/JV foolscap/~Ng foot/~NgSVd>GZz footage/~Ng football/~NgSV>GZ footballer/~Ng footbridge/~NSg footfall/NgS foothill/~NgS foothold/~NgS footie/N footing/~NgV footless/J footlights/N9g footling/JVSNg footlocker/NSg footloose/J footman/N0g footmen/N9 footnote/~NgSVGd footpath/~Ng footpaths/~N footplate/NSV footprint/~NSg footrace/NgS footrest/NgS footsie/NSg footslogging/V footsore/J footstep/NgS footstool/NSg footwear/~Nmg footwell/NgS footwork/~Nmg footy/NwgSJ fop/NSg foppery/Nmg foppish/Jp foppishness/Nmg for/~CPRH fora/~N9 forage/~NSgVd>GZ forager/NgS foray/~NSgVdG forbade/~Vt forbear/VGSNg forbearance/Nmg forbid/~VbS forbidden/~JVT forbidding/~JYV6SN forbore/V forborne/V force/~NwSgVdG forced/~VtTJU forceful/~JYp forcefulness/Nmg forceps/N09g forcible/~J forcibly/~Ry ford/~NgSVdGB fore/~JNgS( forearm/~NSgVGd forebear/NgSV forebode/VGdSNz foreboding/NgJV forecast/~V>GdSNgZ forecaster/Ng forecastle/NgS foreclose/VdSG foreclosure/NgS forecourt/~NSg foredoom/NSVdG forefather/NgS forefeet/9 forefinger/NSg forefoot/NgV forefront/~NSgV foregather/VGdS!@_₹ forego/VG foregoes/Vh foregone/VTJ foreground/~NgSVGd forehand/~NgSJV forehead/~NgS foreign/~JpNZ foreigner/~Ng foreignness/Ng foreknew/V foreknow/VGS foreknowledge/Ng foreknown/VJ foreleg/NSg forelimb/NgS forelock/NgSV foreman/~Ng foremast/NgS foremen/9 foremost/~J forename/NgSVd forenoon/NgS forensic/~JSgQ forensics/~Ng foreordain/VGSd forepart/NgS forepaw/NgS foreperson/NSg foreplay/NgV forequarter/NgS forerunner/~NgS foresail/NgS foresaw/V foresee/V>SBZ foreseeable/~JU foreseeing/V6N foreseen/VU foreseer/Ng foreshadow/VGdS foreshore/~NgS foreshorten/VdSG foresight/Nmgd foresightedness/Nmg foreskin/NgSV forest/~NSVGdre forest's forestall/VGdSN forestation/Ngre forester/~NgS forestland/Ng forestry/~Nmg foretaste/NSgVdG foretell/VGS forethought/NgJV foretold/VtT forever/~NgJ forevermore/ forewarn/VdSG forewent/Vt forewoman/N0g forewomen/N9 foreword/~NgS forex/Ng forfeit/~NSgVGdJ forfeiture/~NSg forgather/VSdG forgave/V forge/~NSgVd>GZvz forger/~Ng forgery/~NSg forget/~VbS forgetful/JYp forgetfulness/Ng forgettable/JU forgetting/~V6N forging/~V6Ng forgivable/JU forgive/~V>SGBZp forgiven/~V forgiveness/~Nmg forgiver/NgS forgiving/JV6NU forgo/~V>GZ forgoer/Ng forgoes/V forgone/V forgot/~Vt forgotten/~JVTNU fork/~NgSVdG forkful/NSg forklift/NgSV forlorn/JYNV form/~NwSVdGeriW form's formal/~JYNSg formaldehyde/Ng formalin/Nmg formalisation/NwSg!_₹ formalise/VGdS!_₹ formalism/~NwgS formalist/NgSJ formalities/N9 formality/~N0gi formalization/Nmg formalize/VGdS format/~NSgVv formation/~NwSgeWr formatted/~VtTJr formatter/NgS formatting/~NgV6 formed/~VtTU former/~JNgWir formerly/~R # also an adverb of time formfitting/J formic/J formidable/~J formidably/Ry formless/JYp formlessness/Ng formula/~N0gS formulae/~N9 formulaic/J formulate/~VdSGrnX formulated/~VtTU formulation/~NwSgr formulator/NSg formwork/Ng fornicate/JVGdSn fornication/Nmg fornicator/NgS forsake/VbGS forsaken/JVT forsook/Vt forsooth/ forswear/VSG forswore/Vt forsworn/JVT forsythia/NSg fort/~NgSV forte/~NSgJ forth/R forthcoming/~JNgV forthright/JYpN forthrightness/Nmg forthwith/R fortieth/JN0g fortieths/N9 fortification/~NwgS fortified/~VNJU fortifier/NgS fortify/~Vd>SGnZX fortissimo/N fortitude/~Nmg fortnight/~NgSY fortress/~NgSV fortuitous/JYp fortuitousness/Nmg fortuity/Nmg fortunate/~JYU fortune/~NgSV fortuneteller/NSg fortunetelling/NgV forty/~NSgJH forum/~NSg forward/~JY^>pVdGSNgZ forward-thinking/J forwarder/NgJ forwardness/Ng forwent/Vt fossa/~N fossil/~NSg fossilisation/Ng!_₹ fossilise/VGdS!_₹ fossilization/Ng fossilize/VGdS foster/~JNSVGd fought/~V foul/~JY^>pVdGSNg foulard/Ng foulmouthed/J foulness/Ng found/~VtTdGSNW foundation/~NSg foundational/~J founded/~VtTJU founder/~NgSVGd foundling/NSg foundry/~NSg fount/NSg fountain/~NSgV fountainhead/NgS four/~NgSH four-speed/NgS fourfold/JVN fourposter/NSg fourscore/Ng foursome/NSg foursquare/JN fourteen/~SgH fourteenth/~JN0g fourteenths/N9 fourth/~JYNgV fourths/~N fowl/~NgSVdGJ fox/~NgSVGd foxfire/Ng foxglove/NSg foxhole/NgSV foxhound/NSg foxhunt/NSVG foxily/Ry foxiness/Nmg foxtrot/NgSV foxtrotted/VtT foxtrotting/V6 foxy/NJ>^p foyer/~NSg fps/~N fr/JNV fracas/NgS frack/VSdGJ fractal/~NSgJ fraction/~NSgVi fractional/~JYN fractious/JYp fractiousness/Ng fractoluminescence/Ng fractoluminescent/J fracture/~NgSVGd frag/NSV fragile/~J>^YN fragility/NmgS fragment/~NgSVGd fragmentary/~Jg fragmentation/~Nmg fragrance/~NgSV fragrant/~JY frail/~JY^>pNV frailness/Nmg frailty/NSg frame/~Vd>GSNgZ frame rate/NgS framed/~VU framer/Ng framework/~NSg franc/~NSg franchise/~NSVdGE franchise's franchisee/NSg franchiser/NSg francium/Nmg francophone/~JN frangibility/Nmg frangible/JN frank/~JY^>pNSgVdG frankfurter/~NgS frankincense/Ng frankness/Ng frantic/~JNQ frappe/NSg frat/NgS fraternal/~JYN fraternisation/Ng!_₹ fraternise/VGd>SZ!_₹ fraterniser/Ng!_₹ fraternity/~NSgW fraternization/Ng fraternize/VGd>SZ fraternizer/Ng fratricidal/J fratricide/NwgS fraud/~NwSV fraud's fraudster/NS fraudulence/Nmg fraudulent/~JY fraught/NVJ fray/~VdGSNe fray's frazzle/VGdSNg freak/~NSgVdGJ freakish/JYp freakishness/Nmg freaky/~J>^ freckle/NSgVdG freckly/J free/~JY^>VdSN free-form/NJ freeball/NgSVdG freebase/NgSVGd freebie/NSg freebooter/NSg freeborn/J freedman/~Ng freedmen/~9 freedom/~NwSg freefall/Nmg freehand/JV freehold/~J>NgSVZ freeholder/NgS freeing/~V6NJ freelance/~NSgJ>VdGZ freelancer/NgS freeload/VSd>GZ freeloader/NgS freeman/~N0g freemasonry/~Nmg freemen/N9 freephone/NV freerun/NgS freesia/NS freestanding/J freestone/NSg freestyle/~NSgVdG freethinker/NSg freethinking/Nmg freeware/~Nmg freeway/~NgS freewheel/NSVdG freewill/JN freezable/JN freeze/~VGSNUr freeze's freezer/~NgS freezing's freight/~NgSVd>GJZ freighter/~NgS french/~VdSG frenemy/NgS frenetic/JNQ frenzied/JY frenzy/~NSgJVd freq/N frequencies/~N frequency/~Ngi frequent/~JY^>VdSGZ frequented/~VU frequenter/NgJ fresco/~N0gV frescoes/~N9 fresh/~JY^>pNVnXZ freshen/VGd>Z freshener/Ng freshet/NgS freshman/~Ng freshmen/~9 freshness/Ng freshwater/~JNg fret/~VSNg fretful/JYp fretfulness/Ng fretsaw/NgSV fretted/VtTJ fretting/V6N fretwork/Nmg friable/J friar/~NSg friary/~NSgJ fricassee/NSgVd fricasseeing/V6 fricative/~NSgJ friction/~NwSg frictional/~J frictionless/JY fridge/NSgV friedcake/NgS friend/~NSVGdYU friend's friendless/J friendlies/~N9 friendliness/NmgU friendly/~J^>pN0U friendly's friendship/~NwgS frieze/~NSgV frig/VSN frigate/~NgS frigged/VtT frigging/V6NJ fright/~NSgVGdJXn frighten/VdG frightening/~JYV6 frightful/JYp frightfulness/Nmg frigid/JYp frigidity/Nmg frigidness/Nmg frill/NSgVd frilly/J^> fringe/~NSJVdGi fringe's frippery/NSg frisbee/NgS frisk/JNSVdG friskily/Ry friskiness/Nmg frisky/J^>p frisson/NS fritter/NgSVdG fritz/~NgV frivolity/NSg frivolous/~JYp frivolousness/Ng frizz/VdGSNgY frizzle/VGdSNg frizzy/J^>N fro/~PN frock/NSVeU frock's frog/~NgSV frogging/NSV6 frogman/Ng frogmarch/VGdSN frogmen/9 frogspawn/N frolic/JVSNg frolicked/VtT frolicker/NSg frolicking/V6N frolicsome/J from/~P frond/NSg front/~NSJVdGW front-line/J front man/Ng front wheel/NgSJ front's/J frontage/~NgS frontal/~JYN frontbench/NS>Z frontier/~NgSV frontiersman/N0g frontiersmen/N9 frontierswoman/N0 frontierswomen/N9 frontispiece/NgSV frontline/NSg frontside/J frontward/JS frosh/NgV frost/~NwSVdGe frost's frostbit/Vt frostbite/NmgSVG frostbitten/JT frostily/Ry frostiness/Nmg frosting/NSgV frosty/J^>p froth/NmgVdG frothiness/Ng froths/V frothy/J^>pN froufrou/NgJ frown/NSgVdG frowzily/Ry frowziness/Ng frowzy/J^>p froze/~VrU frozen/~JVUr fructify/VdSG fructose/~Ng frugal/JY frugality/Ng fruit/~NwSgVdG fruitcake/NwgS fruiterer/NS fruitful/~JYp fruitfulness/Ng fruitiness/Nmg fruition/~Nmg fruitless/JYp fruitlessness/Nmg fruity/J^>pN frump/NSgV frumpish/J frumpy/J^> frunk/NgS frustrate/VGdSJnX frustrating/~JYV6 frustration/~NwgS frustum/NgS fry/~VGdSNg fryer/~NSg ft/~NV ftp/~JNOSVGZ fuchsia/NwgSJ fuck/~VGd>SNgZx fucker/NgSx fuckhead/NSgx fuckwit/NSgx fuddle/VdGSNg fudge/~NwSgVdG fuehrer/NgS fuel/~NwSVdGr fuel's fuelled/VtTr!@_₹ fuelling/V6Nr!@_₹ fug/NV fugal/J fuggy/J fugitive/~NgSJV fugue/~NSgV fuhrer/NSg fulcrum/NgS fulfil/VSL!_@₹ fulfill/~VdGSL<@ fulfilled/~VtTJU fulfilling/~JV6NU fulfillment/~Ng fulfilment/Ng!_₹ full/~J^>pNgSVdGZ full on/JR full-on/JR full-scale/J full screen/J full-stack/J full-time/JR fullback/~NgS fuller/~JNgV fullness/Nmg fulltext/NwgS fully/~R% # removed obscure verb POS fulminate/VdGSNXn fulmination/Nmg fulsome/JYp fulsomeness/Nmg fum/VSN fumble/~Vd>GSNgZ fumbler/NgS fumbling/VNY fume/NgSVGd fumigant/NgS fumigate/VGdSn fumigation/NwSg fumigator/NSg fumy/J>^ fun/~NmgJVU function/~NwgSVdG functional/~JYN functionalism/Nmg functionalist/NSJ functionality/~NwS functionary/NSg functor/~NgS fund/~NgSVdGr fundamental/~NSgJY fundamentalism/~Nmg fundamentalist/~NSg funded/~VJU funder/NgS funding/~VNmg fundraise/VSdG fundraiser/~NgS funeral/~NgSJ funerary/~J funereal/JY funfair/NS fungal/~J fungi/~N9 fungible/JNgS fungicidal/JN fungicide/~NwgS fungoid/JN fungous/J fungus/~Nm0g funicular/~JNSg funk/~NmgSVdG funkiness/Nmg funky/~J>^p funnel/~NgSVdG funnelled/VtTJ!@_₹ funnelling/V6N!@_₹ funner/Jc funnest/Ju funnily/Ry funniness/Nmg funny/~J^>pNSg funnyman/N0g funnymen/N9 fur/~NwSgVCP furbelow/NgV furbish/VdSGr furious/~JY furl/VdGSU furl's furlong/~NSg furlough/NgVGd furloughs/NV furn/NJ furnace/~NSgV furnish/NSVdGr furnished/~VtTJU furnishings/~N9g furniture/~Nmg furor/NSg furore/NgS!_₹ furosemide/N furred/VtTJ furrier/NgJ furriness/Ng furring/V6Ng furrow/NgSVdG furry/~J^>pNZ further/~VSGdJc furtherance/Nmg furthermore/~J furthermost/J furthest/~Ju furtive/JYp furtiveness/Nmg fury/~NwSg furze/Ng fuse/~NSVGderiW fuse's/r fusee/NSg fuselage/~NSg fusibility/Ng fusible/JN fusilier/NSg fusillade/NgSV fusion/~NwSgViWK fuss/NwgSVdG fussbudget/NgS fussily/Ry fussiness/Nmg fusspot/NSgV fussy/J^>p fustian/NgJ fustiness/Ng fusty/J^>p fut/~N futile/~JY futility/~Ng futon/NSg future/~NgSJ futurism/~Ng futurist/~NgSJ futuristic/~J futurity/~NSg futurologist/NgS futurology/Nmg futz/NSVdG fuzz/~NwgSVdG fuzzball/NS fuzzer/NSg fuzzily/Ry fuzziness/Ng fuzzy/~J^>pNS fwd/~JNV fwy/N g/~NSnXvB gab/~NSgV gabardine/NSg gabbed/VtT gabbiness/Ng gabbing/V6 gabble/VdGSNg gabby/~J>^p gaberdine/NSg gabfest/NgS gable/~NSgd gad/~VSN gadabout/NSg gadded/VtT gadder/NSg gadding/V6N gadfly/~NSg gadget/~NSg gadgetry/Nmg gadolinium/Nmg gaff/~NgSVd>GZ gaffe/NSg gaffer/Ng gag/~NSgV gaga/~JN gagged/VtT gagging/V6N gaggle/NSgV gaiety/~Ng gaily/Ry gain/~VdGSNwPJr gain's gainer/NSg gainful/JY gainsaid/V gainsay/VG>SZ gainsayer/Ng gait/~NgSV>Z gaiter/NgV gal/~NSg gala/~JNgS galactic/~J galaxy/~NSgV gale/~VSNr gale's galena/~Ng gall/~NgSVdG gallant/~JYNSgV gallantry/~Ng gallbladder/NgS galleon/NSg galleria/~NgS gallery/~NSgV galley/~NSg gallimaufry/NSg gallium/~Nmg gallivant/VGSd gallon/~NSg gallop/NSgVdG gallows/~NgV gallstone/NgS galoot/NSg galore/JN galosh/NgSV galumph/VdG galumphs/V galvanic/JQ galvanisation/Ng!_₹ galvanise/VdSG!_₹ galvanism/Nmg galvanization/Ng galvanize/VdSG galvanometer/NgS gambit/~NSgV gamble/~NSgVd>GZ gambler/~Ng gambling/~VNmg gambol/VdGSNg gambolled/VtT!@_₹ gambolling/V6N!@_₹ game/~NgSJY^pVGd gamechanger/NgS gamecock/NgS gamekeeper/NgS gameness/Ng gamepad/NgS gameplay/~Nmg gamer/~NSg gamesmanship/Nmg gamester/NgS gamete/NSg gametic/J gamey/J^S gamify/Vd gamin/NSg gamine/NSgJ gaminess/Nmg gaming/~VNg gamma/~NSg gammon/NgVJ gammy/JN gamut/NSg gamy/J>^p gander/~NSgV gang/~VdGSNg gangbusters/NgJ gangland/~Nmg ganglia/~N gangling/JN ganglion/~Ng ganglionic/J gangplank/NSg gangrene/NmSgVdG gangrenous/J gangsta/~NSJ gangster/~NSgVJ gangsterism/Nmg gangway/NgSV ganja/~N gannet/NSgV gantlet/NgS gantry/~NSg gap/~NSgVGd gape/VSNg gapped/VtTJ gapping/V6N gar/~NSgVL garage/~NSgVdG garb/~NgSVdG garbage/~NmgVJ garbageman/N0 garbagemen/N9 garbagey/J garbanzo/NSg garble/VdGSN garcon/NSg garden/~NSgVGd>J gardener/~NgS gardenia/NgS gardening/~NgV garfish/N09gS # singular and plural, also has a plural in -s gargantuan/J gargle/VdGSNg gargoyle/NSg garish/JYp garishness/Ng garland/~NgSVdG garlic/~NmgV garlicky/J garment/~NgSV garner/~NSVGd garnet/~NSgJV garnish/VGdSNgL garnishee/NSgVd garnisheeing/V6 garnishment/NSg garret/~NSg garrison/~NgSVdG garrote/NgSVGd>Z garroter/Ng garrulity/Nmg garrulous/JYp garrulousness/Ng garter/~NSgV gas/~NSVJe gas's gasbag/NSgV gaseous/~J gash/NgSJVdG gasholder/NS gasket/NSgV gaslight/NgSVdG gaslighter/NgS gasman/N0 gasmen/N9 gasohol/Ng gasoline/~Nmg # Wiktionary says it's also an adjective but other dictionaries don't gasometer/NS gasp/VdGSNg gassed/JVtTe gasses/NVh gassing/V6Ne gassy/J>^ gastric/~J gastritis/Ng gastroenteritis/Ng gastrointestinal/~J gastronome/NS gastronomic/J gastronomical/JY gastronomy/Ng gastropod/~NSg gasworks/Ng gate/~NgSVGd gateau/N gateaux/N gatecrash/Vd>GSNZ gatecrasher/Ng gatehouse/~NSg gatekeep/VSG gatekeeper/NgS gatekept/VtT gatepost/NgS gateway/~NgSV gather/~VGd>SNgzZ gatherer/~Ng gathering/~NgV6J gator/~NSg gauche/J>Y^p gaucheness/Nmg gaucherie/Ng gaucho/NSg gaudily/Ry gaudiness/Nmg gaudy/J>^pN gauge/~NSgVdG gaunt/J>^p gauntlet/~NgS gauntness/Nmg gauze/NmgV gauziness/Nmg gauzy/J>^p gave/~Vt gavel/NSgV gavotte/NgSV gawd/N gawk/NSVdG gawkily/Ry gawkiness/Ng gawky/J>^pN gawp/VdGSN gay/~J^>pNSgV gayness/Ng gaze/~VGd>SNgZ gazebo/~NSg gazelle/~NgS gazer/Ng gazette/~NgSVGd gazetteer/~NgSV gazillion/NS gazpacho/~Nmg gazump/VdGSN gear/~NwgSVdGJ gearbox/~NgS gearing/~NwSgV gearshift/NgSV gearwheel/NSg gecko/~NSgV geddit/ gee/~VdSN geeing/V6 geek/~NgSVdG geeky/J>^ geese/~N9 geezer/NgS geisha/~Ng09S # singular and plural, also has a plural in -s gel/~NwSgV gelatin/~Nmg gelatinous/~J gelcap/Ng geld/NSVdGz gelding/NgV gelid/J gelignite/Ng gelled/VtTJ gelling/~V6 gem/~NSgV gemmology/Ng!_₹ gemological/J gemologist/NgS gemology/Ng gemstone/~NgS gendarme/NgS gender/~NwgSVdJ gene/~N0gS genealogical/~JY genealogist/NgS genealogy/~NSg genera/~N9 general/~JYNSgV generalisation/NgS!_₹ generalise/VGdS!_₹ generaliser/NgS!_₹ generalissimo/NgS generalist/NgS generality/~NSg generalization/~NgS generalize/~VGdSB generalizer/NgS generalship/Ng generate/~VGSdervn generation/~Ngre generational/~JY generations/~N9 generator/~NSg generic/~JNSgQ generosity/~NSg generous/~JYp generousness/Ng genes/~N9 geneses/N9 genesis/~N0g genetic/~JSQ geneticist/~NgS genetics/~Nmg genial/JYW geniality/NgW geniculate/JV genie/~N0Sg genii/N9 genital/~JYN0W genitalia/~Nmg genitals/~N9g genitive/~JNgS genitourinary/J genius/~NwgSJp genlock/NgSVdG genned/VtT genning/V6 genocidal/~J genocide/~NwgSV genome/~NgS genomic/~NS genre/~NSgV gent/~NgSJr genteel/JYp genteelness/Ng gentian/NSg gentile/~JNSg gentility/Ng gentle/~J^>pVGdSN gentlefolk/NgS gentlefolks/Ng gentleman/~N0g♂Y gentlemanly/JU gentlemen/~N9g♂ gentleness/Ng gentlewoman/N0g♀ gentlewomen/N9♀ gently/~Ry gentrification/~Nmg gentrify/VdSGn gentry/~NSg genuflect/VdGS genuflection/~NgS genuine/~JYp genuineness/Nmg genus/~N0g geocache/NSVdG geocentric/JQ geochemistry/Nmg geocode/VGdSNg geode/NSg geodesic/NSgJ geodesy/Ng geodetic/~J geoeconomics/Nmg geoengineering/Nmg geog/N geographer/~NSg geographic/~J geographical/~JYN geography/~NwSg geolocation/NwgS geologic/~J geological/~JY geologist/~NgS geology/~NSg geom/N geomagnetic/J geomagnetism/Nmg geometer/N geometric/~J geometrical/~JY geometry/~NwSg geophysical/~J geophysicist/NSg geophysics/~Nmg geopolitical/~VY geopolitics/Nmg geoscientist/NSg geostationary/J geostrategic/J geosynchronous/J geosyncline/NgS geothermal/~J geothermic/J geranium/NgSJ gerbil/NgSV geriatric/JNS geriatrician/NS geriatrics/Nmg germ/~NgSV germane/JN germanium/Nmg germicidal/J germicide/NwgS germinal/~Jg germinate/~VGdSn germination/~NwSg germophobe/NgS germophobia/Nmg gerontocracy/NwgS gerontological/J gerontologist/NgS gerontology/Nmg gerrymander/VGdSNg gerrymandering/NgV gerund/NgS gestalt/NS gestapo/~Sg gestate/VGdSn gestation/~Nmg gestational/~J gesticulate/VdSGnX gesticulation/Ng gestural/J gesture/~NgSVGd gesundheit/ get/~VbSN getaway/~NSgJ getter/NSg getting/~V6Ng # `M` for getting's contraction getup/Ng gewgaw/NSgJ geyser/NSgV ghastliness/Nmg ghastly/J^>p ghat/~NgS ghee/Nmg gherkin/NgS ghetto/~NSgJV ghettoise/VGdS!_₹ ghettoize/VGdS ghost/~NSgVdGY ghostliness/Nmg ghostly/~J>^p ghostwrite/VG>SZ ghostwriter/NgS ghostwritten/J ghostwrote/V ghoul/NSg ghoulish/JYp ghoulishness/Ng giant/~NSgJ giantess/NgS gibber/NSVGd gibberish/NgJ gibbet/NgSVGd gibbon/~NgS gibbous/J gibe/NgSVGd giblet/NSg giddily/Ry giddiness/Nmg giddy/J^>pNV gift/~NgSVdG gig/~NSgV gigabit/~NSg gigabyte/NgS gigaflop/NgS gigagram/NS gigahertz/Ng gigajoule/NS gigameter/NS< gigametre/NS!@_₹ gigantic/~JQ gigapascal/NS gigapixel/NgS gigawatt/NSg gigged/VtT gigging/NV6 giggle/Vd>GSNgZ giggler/Ng giggly/J>^ gigolo/~NSg gild/Vd>GSNgZ gilder/Ng gilding/VNg gill/~NgSV gillie/NSV gillion/NS gilt/~NgSJV gimbal/NgS gimbap/Nwg gimcrack/JNSgV gimcrackery/Ng gimlet/NSgVGd gimme/~NSg gimmick/~NgSV gimmickry/Ng gimmicky/J gimp/NgSVdGJ gimpy/J gin/~NwSgVC ginger/~NwSgJYVGd gingerbread/~Nmg gingersnap/NSg gingery/J gingham/Ng gingivitis/Ng ginkgo/N0g ginkgoes/N9 ginned/VtTJ ginning/V6N ginormous/J ginseng/Nmg giraffe/NgS gird/Vd>GSNZ girder/~NgS girdle/~NSgVdG girl/~NgSV girlfriend/~NgS girlhood/NwSg girlish/JYp girlishness/Nmg girly/JN giro/~NSV girt/NgSVdGJ girth/NwgSV girths/N GIS/N # Geographic Information System gist/NgSV git/~NOSV gite/NS give/~VG>SNZz giveaway/NgSJ giveback/NgS given/~VTSPNgJp # "Givenness" is a technical word in the branch of philosophy called Phenomenology giver/~Ng gizmo/NSg gizzard/NgS glace/S glaceed glaceing glacial/~JYN glaciate/VGdSXn glaciation/~Ng glacier/~NgS glad/~JYpVSNg gladden/VGdS gladder/Jc gladdest/Ju glade/~NSg gladiator/~NSgV gladiatorial/J gladiola/NSg gladioli/N gladiolus/Ng gladness/Ng gladsome/J glam/~NJV glamorisation/Ng!_₹ glamorise/VdSG!_₹ glamorization/Ng glamorize/VdSG glamorous/~JYU glamour/~NgSVGd glance/~VdGSNg gland/~NSg glandes/N9 glandular/JN glans/N0g glare/~NSgVdGJ glaring/JYV6N glasnost/Ng glass/~NwgSVdG glassblower/NgS glassblowing/~Ng glassful/NSg glasshouse/NS glassily/Ry glassiness/Nmg glassware/~Nmg glassy/J>^pN glaucoma/Ng glaze/NSgVdG glazier/NSgJ glazing/~VNg gleam/NSgVdGz glean/Vd>GSNZz gleaner/Ng gleanings/Ng glee/~NmgV gleeful/JYp gleefulness/Nmg glen/~NgS glenohumeral/J glenoid/NJ glib/JYpVN glibber/Jc glibbest/Ju glibness/Nmg glide/~Vd>GSNgZ glider/~Ng gliding/~NgVJ glimmer/NgSVdGz glimmering/V6Ng glimpse/~VGdSNg glint/NSgJVdG glissandi/N9 glissando/N0gV glisten/VdGSNg glister/VdGSN glitch/NgSVGd glitchy/J glitter/~NgSVdG glitterati/Nmg glittery/J glitz/Nmg glitzy/J^> gloaming/NSgV gloat/VdGSNg gloating/V6NY glob/~NgSVdG global/~JYNSg globalisation/Nmg!_₹ globalise/VGdS!_₹ globalism/Ng globalist/JNgS globalization/~Nmg globalize/VGdS globbed/VtT globbing/V6N globe/~NSgV globetrotter/NgS globetrotting/VN globular/~JN globule/NgS globulin/Ng glockenspiel/NSg glom/VS glommed/VtT glomming/V6N gloom/NmgV gloomily/Ry gloominess/Nmg gloomy/~J^>pN glop/VNg gloppy/J glorification/Nmg glorify/VGdSn glorious/~JYi glory/~NSgVdG gloss/~NgSVdG glossary/~NSg glossily/Ry glossiness/Nmg glossolalia/Nmg glossy/~J^>pNSg glottal/~JN glottis/NgS glove/~NSgVdG glow/~Vd>GSNgZ glower/VGdNg glowing/~V6NJY glowworm/NgS glucagon/N glucose/~Ng glue/~NwgSVbGd glued/~VtTU gluey/J gluier/Jc gluiest/Ju glum/JYpVN glummer/Jc glummest/Ju glumness/Ng gluon/NS glut/~NgSVn gluten/Ng glutenous/J glutinous/JY glutted/VtT glutting/V6N glutton/JNgSV gluttonous/JY gluttony/Nmg glycemic/J glycerin/Nmg glycerine/Nmg!@_₹ glycerol/~Nmg glycogen/~Nmg glycol/~N glyph/N0 glyphs/N9 gm/~N gnarl/NSgVdGJ gnarly/J^> gnash/VdGSNg gnat/NgS gnaw/VdGSN gnawing/NwV6 gneiss/Ng gnocchi/Nmg gnome/~NSg gnomic/~J gnomish/J gnomist/NgS gnu/~NSg go/~Vb>GN0gJzHZ go around/V go-around/NgS goad/NgSVdG goal/~NgSV goalie/~NSgV goalkeeper/~NgS goalkeeping/~NgV goalless/J goalmouth/N0 goalmouths/N9 goalpost/NgS goalscorer/~NgS goaltender/~NgS goat/~NgSV goatee/NSg goatherd/NgS goatskin/NgS gob/NSgV gobbed/VtT gobbet/NSgV gobbing/V6N gobble/Vd>GSNgZ gobbledegook/Ng!_₹ gobbledygook/Ng gobbler/Ng goblet/~NSg goblin/~NSg gobsmacked/J gobstopper/NS god/~NOSgV godawful/J godchild/Ng godchildren/9g goddammit/ goddamn/JNd goddaughter/NgS goddess/~NgS godfather/~NSgV godforsaken/J godhead/Ng godhood/Nmg godless/JYp godlessness/Ng godlike/J godliness/NmgU godly/J>^pU godmother/~NSgV godparent/NSg godsend/NSg godson/NSg godspeed/N goer/Ng goes/~VhN9 gofer/NSg goggle/VdGSNg goggles/N9gV going/~V6NgJ goiter/NSg< goitre/NSg!@_₹ gold/~NmgSJVn gold-plated/J goldbrick/NSgVGd>Z goldbricker/Ng golden/~J^>NV goldenrod/~NgJ goldfield/NS goldfinch/NgS goldfish/~NgS09 # singular and plural, also has a plural in -s goldmine/NSg goldsmith/~Ng goldsmiths/~N golem/NSg golf/~NgSVd>GZ golfer/~Ng golliwog/NS golly/NSgV gonad/NSg gonadal/J gondola/~NgSV gondolier/NSg gone/~VT>JPZ goner/Ng gong/~NgSVdG gonk/NSV gonna/~V gonorrhea/Ng gonorrheal/J gonorrhoea/Ng!_₹ gonorrhoeal/J!_₹ gonzo/~JN goo/~NmgV goober/NSgV good/~JYpNgSV goodbye/~NgSV goodhearted/J goodish/J goodly/J^> goodness/~NgS goodnight/~NV goods/~NgV goodwill/~Ng goody/~NSgJ gooey/J goof/NgSVdG goofball/NSgJ goofiness/Ng goofy/~J>^pN google/~VdGSNg googly/NSJ gooier/Jc gooiest/Ju gook/NgS goon/~NgSV goop/NmgV goose/~NSgVdG goose-step/VS goose-stepped/VtT goose-stepping/V6 gooseberry/NwSg goosebumps/N9g gooseneck/NgS goosy/JNgS gopher/~NSg gore/~NgSVGd gorge/~NSVdGJE gorge's gorgeous/~JYp gorgeousness/Nmg gorgon/NSgJ gorilla/~NgS gorily/Ry goriness/Nmg gormandise/Vd>SGZ!_₹ gormandiser/NgS!_₹ gormandize/Vd>SGZ gormandizer/NgS gormless/J gorp/NgS gorse/Ng gory/~J>^p gosh/ goshawk/NgS gosling/~NSg gospel/~NgSV gossamer/NgJ gossip/~NwgSVd>GZ gossiper/Ng gossipy/J got/~VtT gotcha/NS goths/~N gotta/~V gotten/~VTJ gouache/NSV gouge/NSgVd>GZ gouger/Ng goulash/NgS gourd/~NSg gourde/NgS gourmand/NSg gourmet/~JNSg gout/NgV gouty/J^> gov/~N govern/~VdGSNBL governability/NgU governable/JU governance/~Nmg governed/~VtTU governess/NgSV government/~NwgS governmental/~J governmentwide/J governor/~NSg governorship/~Nmg govt/~N gown/~NgSVdG gr/~N grab/~VSNg grabbed/~VtT grabber/NgS grabbing/~V6N grabby/J^>N grace/~Nw☁SgVdGE graceful/~JYpE gracefulness/NgE graceless/JYp gracelessness/Nmg gracious/~JYU graciousness/Nmg grackle/NgS grad/~NgS>ZB gradate/VGdSXn gradation/NgVe grade/~NSVdGer grade's graded/~VJU grader/Ng gradient/~NgSJ gradual/~JYpN gradualism/Nmg gradualness/Nmg graduate/~NgSJVGdXn graduation/~NwgS graffiti/~N9mV graffito/N0g graft/~NwSgVd>GZ grafter/NgS graham/~NS grail/~NgS grain/~NwSgVdi graininess/Nmg grainy/J^>p gram/~NOSgVK grammar/~NwgSV grammarian/~NSg grammatical/~JYU gramophone/~NgS grampus/~NgS gran/~NS granary/NSg grand/~J>Y^pNSg grandam/NgS grandaunt/NgS grandchild/~N0g grandchildren/~N9g granddad/NSg granddaddy/NSg granddaughter/~NSg grandee/NgS grandeur/~Nmg grandfather/~NgSVGdY grandiloquence/Ng grandiloquent/J grandiose/~JY grandiosity/Ng grandkid/NgS grandma/~NgSV grandmaster/~NSg grandmother/~NgSY grandnephew/NgS grandness/Nmg grandniece/NgS grandpa/~NgS grandparent/NgSV grandson/~NgS grandstand/~NSgVGd granduncle/NSg grange/~NSg granite/~Nmg granitic/~J granny/~NSgJV granola/NmgJ grant/~Vd>GSNgZ grantee/NgS granter/Ng grantsmanship/Nmg granular/~J granularity/Nmg granulate/VGdSJn granulation/Nmg granule/NgS grape/~NwSgJV grapefruit/NwgS grapeshot/Nmg grapevine/~NSgV graph/~N0gVdG grapheme/NSg graphic/~JNgS graphical/~JY graphics/N09 graphite/~NwgV graphologist/NgS graphology/Nmg graphs/~N9V grapnel/NgSV grapple/VGdSNg grappler/NgS grasp/~VdGSNgB grass/~NwgSVdG grasshopper/~NgSV grassland/~NwgS grassroots/~J grassy/~J^>N grate/NSgVd>GJZz grateful/~JYpU gratefulness/NmgU grater/NgS gratification/Nmg gratify/VGdSnX gratifying/V6JY gratin/NS grating/~JYNgV gratis/J gratitude/~Ngi gratuitous/~JYp gratuitousness/Ng gratuity/NSg gravamen/NgS grave/~NSgVd>GJY^p gravedigger/NSg gravel/~NmSgVGdY gravelled/VtTJ!@_₹ gravelling/NV6!@_₹ graven/VJ graveness/Ng graveside/NgS gravestone/~NSg graveyard/~NgS gravid/J gravimeter/NgS gravitas/N gravitate/VGdSn gravitation/~Nmg gravitational/~J gravity/~Ng gravy/~NwSgV gray/~J^>pVdGSNwg< gray wolf/Ng< gray wolves/9< graybeard/NSg< grayish/J< grayness/Ng< grayscale/NgJ< graze/NSgVd>GZ grazer/Ng grease/~NwSgVd>GZ greasepaint/NwSg greasily/Ry greasiness/Ng greasy/~J^>p great/~J>Y^pNSg greatcoat/NSg greathearted/J greatness/~Ng grebe/~NSg greed/~NgV greedily/Ry greediness/Ng greedy/~J^>p green/~JY^>pNwSgVGd greenback/NgS greenbelt/NgS greenery/Ng greenfield/~NJ greenfly/NS greengage/NgS greengrocer/NSg greenhorn/NSg greenhouse/~NSgV greenish/~J greenmail/NgSVdG greenness/Nmg greenroom/NSg greenstone/N greensward/Ng greenwood/~Ng greet/~VGd>SJNZz greeter/NgS greeting/~NgV gregarious/~JYp gregariousness/Nmg gremlin/NSg grenade/~NSgV grenadier/~NgS grenadine/Nmg grep/OSV grepped/VtT grepping/V6 grew/~Vtr grey/J^>pVdGSNwg!@_₹ grey wolf/Ng!@_₹ grey wolves/9!@_₹ greyhound/~NSgV greyish/J!@_₹ greyness/Ng!@_₹ greyscale/NgJ!@_₹ gribble/NSJ grid/~NgSV grid line/NgS # Two-word spelling is in Collins and Merriam-Webster griddle/NSgV griddlecake/NSg gridiron/~NSgV gridlock/~NwSgVd grief/~Nm☁SgV grievance/NgS grieve/~VGd>SNZ griever/Ng grievous/JYp grievousness/Ng griffin/~NSg griffon/NSg grift/NwSgVGd> grifter/NgS grill/~NSgVGdJz grille/~NgS grim/~JYpVdGN grimace/NSgVdG grime/~NSgV griminess/Nmg grimmer/Jc grimmest/Ju grimness/Nmg grimy/J^>p grin/NgSV grind/~VG>SNgZz grinder/~NgS grindhouse/NwgS grindstone/NgS gringo/NgS grinned/VtT grinning/V6N grip/~Vd>GSNwgZ gripe/VSNg griper/Ng grippe/NgGd>Z gripper/NgS grippy/J grisliness/Nmg grisly/J>^pN grist/~NmgVY gristle/Nmg gristmill/NgS grit/~NwgSV grits/N9gV gritted/VtT gritter/NSg grittiness/Nmg gritting/V6N gritty/~J>^p grizzle/NSJVdG grizzly/~J^>NSg groan/NSgVGd groat/NSg grocer/~NgSV grocery/~NSgV grog/NmgV groggily/Ry grogginess/Ng groggy/J>^p groin/~NSgV grok/VS grokked/VtT grokking/V6 grommet/NSgV groom/~NSgVGd>Z groomer/Ng grooming/~VNg groomsman/Ng groomsmen/9 groove/~NgSVGd groovy/J>^N grope/Vd>GSNgZ groper/Ng grosbeak/NgS grosgrain/Ng gross/~J^Y>pNgSVGd grossness/Nmg grotesque/~JYpNSg grotesqueness/Ng grotto/~N0g grottoes/N9 grotty/J^> grouch/NgSVGd grouchily/Ry grouchiness/Nmg grouchy/J>^p ground/~NwgSVGdJZz ground-based/J groundbreaking/~JNgS groundcloth/N0 groundcloths/N9 grounder/NgS groundhog/NgS grounding/~NwgSV6 groundless/JY groundnut/NgS groundsheet/NS groundskeeper/NS groundsman/N groundsmen/9 groundswell/NSg groundwater/~Ng groundwork/~Ng group/~NSgVGd>zZ grouper/Ng groupie/NgS grouping/~VNg groupware/Nmg grouse/~NgSVGd>JZ grouser/Ng grout/NSgVGd grove/~NSgV grovel/VGd>SZ groveler/Ng grovelled/VtT groveller/NSg!@_₹ grovelling/V6Nm grow/~VSGrH growable/J grower/NgS growing/~VNi growl/~NSgVGd>Z growler/Ng grown/~VJri grownup/NgSJ growth/~Nw0gr growths/N9 groyne/NgS!@_₹ grub/~NwgSV grubbed/VtT grubber/NgS grubbily/Ry grubbiness/Nmg grubbing/V6N grubby/J^>pN grubstake/NgV grudge/~NgSVGd grudging/JYVN grue/~VSNJ gruel/NgVGz grueling/JYNV gruelling/JYNSV6!@_₹ gruesome/~J>Y^p gruesomeness/Nmg gruff/J^Y>pVN gruffness/Nmg grumble/NSgVd>GZz grumbler/NgS grumbly/J grump/NSgV grumpily/Ry grumpiness/Nmg grumpy/J>^pN grunge/~NwgS grungy/J>^ grunion/NSg grunt/NSgVGd gt/~N guacamole/Ng guanine/Ng guano/Ng guarani/NgS guarantee/~NgSVd guaranteeing/~V6 guarantor/NgS guaranty/NSgVGd guard/~NSgVGd>Z guarded/~VJY guarder/Ng guardhouse/NSg guardian/~NSg guardianship/~Ng guardrail/NSg guardroom/NSg guardsman/~Ng guardsmen/9 guava/NSg gubbins/9 gubernatorial/~J guerrilla/~NSgJ guess/~VbGd>SNgZB guesser/Ng guesstimate/NSgVdG guesswork/Ng guest/~NSgVGd guestbook/NSg guesthouse/NS guestroom/NS guff/NgV guffaw/NgSVdG guidance/~Nmg guide/~NSgVd>GZ guidebook/~NSg guided/~VtTJU guideline/~NSg guidepost/NSg guider/Ng guild/~NSg>Z guilder/Ng guildhall/~NgS guile/~NgV guileful/J guileless/JYp guilelessness/Ng guillemot/NS guillotine/~NSgVdG guilt/~NgSVdG guiltily/Ry guiltiness/Nmg guiltless/J guilty/~J>^pN guinea/~NgS guise/~NSgV guitar/~NgSV guitarist/~NSg gulag/~NSgV gulch/~VSNg gulden/~NgS gulf/~NgSV gull/~NgSVdG gullet/NgS gullibility/Nmg gullible/JN gully/~NSgV gulp/NgSVd>GZ gulper/Ng gum/~NwSgV gumball/NS gumbo/NmSg gumboil/NSg gumboot/NS gumdrop/NSg gummed/VtT gumming/V6N gummy/J^>N gumption/Nmg gumshoe/NgSVd gumshoeing/V gun/~NSgV gunboat/~NSg gunfight/~NgSV>Z gunfighter/Ng gunfire/~Ng gung ho/J gunge/NV gungy/J gunk/NgSVdG gunky/J gunman/~Ng gunmen/~9 gunmetal/Ng gunned/VtTJ gunnel/NgS gunner/~NgS gunnery/~Ng gunning/V6N gunny/Ng gunnysack/NgS gunpoint/~Ng gunpowder/~NmgV gunrunner/NgS gunrunning/Ng gunship/NgS gunshot/~NgS gunslinger/~NSg gunsmith/Ng gunsmiths/N gunsmoke/Nmg gunwale/NgS guppy/NSg gurgle/VGdSNg gurn/NSgVGd gurney/~NgS guru/~NgSV gush/~NgSVd>GZ gusher/Ng gushing/JYNV6 gushy/J^> gusset/NgSVdG gussy/VdGSN gust/~NgSVdG gustatory/J gustily/Ry gusto/~Ng gusty/J>^ gut/~NwSgVJ gutless/Jp gutlessness/Ng gutsy/J>^ gutted/~JVtT gutter/~NSgVdG guttersnipe/NgS gutting/V6NJ guttural/JNgS gutty/J>^N guv/NS guvnor/NS guy/~NSgVGd guzzle/Vd>GSNZ guzzler/Ng gybe/VGdSNg!@_₹ gym/~NSgV gymkhana/NgS gymnasium/~NgS gymnast/~NgS gymnastic/~JNSQ gymnastics/~Ng gymnosperm/NSg gymslip/NS gynaecologic/J!@_₹ gynaecological/J!_₹ gynaecologist/NSg!_₹ gynaecology/Nmg!_₹ gynecologic/J gynecological/J gynecologist/NSg gynecology/Ng gyp/NSgV gypped/VtT gypper/NSg gypping/V6 gypster/NSg gypsum/Nwg gypsy/~NSgJV gyrate/VdSGJnX gyration/Ng gyrator/NSg gyrfalcon/NgS gyro/~NgS gyrofrequency/NgS gyroscope/NgS gyroscopic/J gyve/NgSVGd h/~NJGnXZvz # removed `>` 'her' is not comparative of 'h' h'm/ ha/~ habeas corpus/N haberdasher/NSg haberdashery/NSg habiliment/NSg habit/~NSViB habit's habitability/Ng habitat/~NSg habitation/~NgS habitual/~JYpN habitualness/Ng habituate/VGdSn habituation/Ng habitue/NSg hacienda/~NSg hack/~Vd>GSNgZB hackathon/NSg hacker/~NgV hackery/Ng hacking/~JVNg hackish/J hackle/NgSV hackney/~NSgJVdG hacksaw/NSgV hacktivist/NgS hackwork/Nmg hacky/J>^ had/~VtT haddock/NwSg hadith/~N hadn't/Vt hadst/V haem/N!@_₹ haematite/Ng!_₹ haematologic/J!_₹ haematological/J!_₹ haematologist/NgS!_₹ haematology/Nmg!_₹ haemoglobin/Nmg!_₹ haemophilia/Nmg!_₹ haemophiliac/NgS!_₹ haemorrhage/NgSVGd!_₹ haemorrhoid/NS!_₹ hafnium/Nmg haft/NgSV hag/NSgV haggard/~JYpN haggardness/Nmg haggis/NwgS haggish/J haggle/VGd>SgZ haggler/Ng hagiographer/NSg hagiographic/J hagiography/NwSg hahnium/Nmg haiku/~NgS hail/~NgSVdGJ hailstone/NgS hailstorm/NgS hair/~NwgSVd hairball/NgS hairband/NS hairbreadth/Ng hairbreadths/N hairbrush/NgSV haircloth/Ng haircut/~NSgV hairdo/NgS hairdresser/~NSg hairdressing/NgV6 hairdryer/NgS hairgrip/NS hairiness/Ng hairless/JN hairlike/J hairline/NSgJ hairnet/NSg hairpiece/NgS hairpin/~NSg hairsbreadth/Ng hairsbreadths/N hairsplitter/NSg hairsplitting/NgV hairspray/NwSV hairspring/NgS hairstyle/~NgS hairstylist/NSg hairy/~J^>p haj/~N hajj/~Ng hajjes/N hajji/NSg hake/NgSV halal/~JVg halberd/NSg halcyon/~NJ hale/~J^>NSVGdi half/~N0wgJP half cent/NgS half-cocked/J half court/Ng half-life/Ng half-lives/9 halfback/~NSgV halfcourt/ halfhearted/JYp halfheartedness/Ng halfpence/N halfpenny/NSgJ halftime/~NgSJ halftone/NgSV halfway/~J halfwit/NSg halibut/NSg halite/Ng halitosis/Ng hall/~NgS hallelujah/~N0gVb hallelujahs/N9Vh hallmark/~NgSVGd halloo/NgSVG hallow/NSVdGJ hallowed/JVtTU hallucinate/VGdSnX hallucination/~Ng hallucinatory/J hallucinogen/NSg hallucinogenic/JNSg hallway/~NSg halo/~NgSVdG halogen/~NSg halon/N halophile/NSg halt/~Vd>GSNgJZ halter/NgVGd halterneck/NS halting/~JYVN halve/VdSG halyard/NgS ham/~NwSgV ham-fisted/J hamburg/~NSgV>Z hamburger/~NwgSV hamlet/~NgS hammed/VtTJ hammer/~NgSVd>GzZ hammerer/Ng hammerhead/NSg hammerlock/NSg hammertoe/NgS hamming/V6 hammock/~NSgV hammy/J^>N hamper/NgSVGd hampered/~VJU hamster/~NgSV hamstring/~NSgVG hamstrung/JV hand/~NSVdGU hand-drawn/J hand-me-down/JNgS hand-off/NwSg hand out/V/ hand's handbag/NSgV handball/~NwgSV handbarrow/NSg handbasket/NgS handbill/NgS handbook/~NgS handbrake/~NSV handbuilt/J handcar/NSg handcart/NgSV handclasp/NgS handcraft/NSgVdG handcuff/NgSVdG handed/~JpVtT handedly/Ry handful/~NSg handgun/~NSg handheld/~JNgS handhold/NgSV handicap/~NgSV handicapped/~VtTJN handicapper/NgS handicapping/V6N handicraft/~NwgS handily/Ry handiness/Nmg handiwork/Nmg handkerchief/~NgS handle/~NgSVGd>Z handlebar/NgS handler/~NgS handmade/~JN handmaid/NgSXn handmaiden/Ng handoff/NSg # some dictionaries say 'handoff' is US, 'handover' is Commonwealth handout/NSgJ handover/~NSg # some dictionaries say 'handover' is Commonwealth, 'handoff' is US handpick/VGdS handpiece/NgS handprint/NSg handrail/NgS hands-off/J handsaw/NSg handset/~NSgV handshake/~NgSVGz handsome/~JY^>pV handsomeness/Nmg handspring/NgS handstand/NSgV handsy/J>^N handwash/NgS handwave/NgSVdG handwavy/J handwork/NgV handwoven/J handwriting/~NmgV handwritten/~JV handy/~J^>NU handyman/N0g♂ handymen/N9♂ handywork/Nmg hang/~Vd>GSNgzZ hang out/V/ hangar/~NgSV hangdog/NJV hanger/Ng hanging/~VJNg hangman/~N0g♂ hangmen/N9♂ hangnail/NgS hangout/NSg hangover/~NgS hangup/NgS hank/~NgSV>Z hanker/VGdz hankering/V6Ng hankie/NgS hanky/NSg!@_₹ hansom/NgS hap/NgVY haphazard/JYpN haphazardness/Nmg hapless/~JYp haplessness/Nmg haploid/JNgS happen/~VSdGz happening/~V6SJNwg happenstance/NSg happily/~RyU happiness/~NmgU happy/~J^>pNVU happy-go-lucky/J haptic/J harangue/NgSVGd harass/~VGd>SNLZ harasser/NgS harassment/~Ng harbinger/NSgV harbor/~NgSVGd< harbormaster/NS< harbour/NgSVGd!@_₹ harbourmaster/NS!@_₹ hard/~J>Y^pNwRynX # removed `V` verb sense is obsolete hard code/VSdG hard-pressed/J hard right/Ng hard-right/J hard-wire/VSdG hardback/~NgSJ hardball/NgJV hardboard/NgV hardbound/J hardcore/~JN hardcover/~NSgJ harden/~VGd>NZ hardened/~VJU hardener/Ng hardhat/NgS hardheaded/JYp hardheadedness/Ng hardhearted/JYp hardheartedness/Ng hardihood/Ng hardily/Ry hardiness/~Ng hardline/NgSJ> hardness/~Ng hardscrabble/J hardship/~NSgV hardstand/NSg hardtack/~Ng hardtop/~NSg hardware/~Nmg hardwired/JV hardwood/~NSgJ hardworking/~J hardy/~J^>pN hare/~NgSVGdJ harebell/NgS harebrained/J harelip/NSgV harelipped/J harem/~NSg haricot/NS hark/VdGSN harlequin/~NSgJV harlot/NSgVJ harlotry/Nmg harm/~NwgSVdG harmed/~VU harmful/~JYp harmfulness/Nmg harmless/~JYp harmlessness/Ng harmonic/~JNSgQ harmonica/~NgS harmonies/~N9 harmonious/~JYp harmoniousness/Ng harmonisation/Ng!_₹ harmonise/VGd>SZ!_₹ harmoniser/Ng!_₹ harmonium/NgS harmonization/Ng harmonize/VGd>SZ harmonizer/Ng harmony/~N0wgE harness/~NSVdGU harness's harp/~NgSVdG harpist/NSg harpoon/NSgVGd>Z harpooner/Ng harpsichord/~NgS harpsichordist/NSg harpy/NSg harridan/NgS harrier/~Ng harrow/~NSgVdG harrumph/NVGd harrumphs/NV harry/~Vd>GSNZ harsh/~JY^>pVSdG harshness/Ng hart/~NgS harvest/~NSgVd>GZ harvested/~VU harvester/~Ng has/~Vh hash/~NgSVdGr hashish/Ng hashtag/NSgV hasn't/Vh hasp/NgSV hassle/NSgVdGJ hassock/NSg hast/VdGnX haste/~NSgV hasten/VdG hastily/~Ry hastiness/Nmg hasty/~J>^p hat/~NSgVGd>Z hatband/NS hatbox/NgS hatch/~NgSVdG hatchback/~NgS hatcheck/NSg hatched/~VtTU hatchery/~NSg hatchet/~NSgV hatching/~NgV6 hatchway/NSg hate/~NwgSV hateful/JYp hatefulness/Nmg hatemonger/NgS hater/Ng hath/V hatpin/NS hatred/~Nm☁Sg hatstand/NSJ hatted/JVtT hatter/NSgV hatting/NV6 hauberk/NSg haughtily/Ry haughtiness/Ng haughty/J>^p haul/~Vd>GSNgZ haulage/Ng hauler/Ng haulier/NS haunch/NgSV haunt/~Vd>GSNgZ haunter/Ng haunting/~VJYN hauteur/Ng have/~NgAG haven/~NSgV haven't/VA haversack/NSg haves/N9 havoc/~NmgV haw/~VGdSNg hawk/~NgSVd>GZ hawker/~NgS hawkish/Jp hawkishness/Nmg hawser/NSg hawthorn/~NwgS hay/~NmSgVGd haycock/NSg hayloft/NSg haymaker/NS haymaking/N haymow/NSg hayrick/NgS hayride/NgS hayseed/NgSJ haystack/NSg haywire/NJ hazard/~NSgVdG hazardous/~JY haze/~NwgSVGd>Zz hazel/~NSgJ hazelnut/NwgS hazer/Ng hazily/Ry haziness/Ng hazing/~NgV hazmat/~N hazy/J>^pN hdqrs/N he/~Ia3s* # I~pronoun a~personal 3~person .~singular s~subject *:3pers-sing-subj he'd/ he'll/ he's/~ head/~NgSJ>VdGZz head-scratcher/NgS head unit/NgS headache/~NgS headband/NgS headbang/VSdG headbanger/NS headbanging/NmVJ headboard/NSg headbolt/NgS headbutt/NSVdG headcase/NS headcheese/Nmg headcount/NgS headdress/~NgS header/~NgSV headfirst/J headgear/~Ng headhunt/Vd>SGZ headhunter/Ng headhunting/NmgV headily/Ry headiness/Nmg heading/~VSNwg headlamp/NgS headland/~NgS headless/~J headlight/NgS headline/~NgSVGd>Z headliner/NgS headlock/NgSV headlong/JV headman/N0g headmaster/~NSg headmen/N9 headmistress/~NgS headphone/NgS headpiece/NgS headpin/NSg headquarter/~VSdG headquarters/~Ng headrest/NgS headroom/Ng headscarf/N headscarves/N headset/NSg headship/NSg headshrinker/NSg headsman/Ng headsmen/9 headstall/NSg headstand/NSg headstone/~NSg headstrong/J headteacher/NS headwaiter/NSg headwaters/~Ng headway/~Nmg headwind/NSgV headword/NSg heady/J>^p heal/~Vd>GSNHZ healed/~VU healer/~Ng health/~Nmg healthcare/~Nm healthful/JYp healthfulness/Nmg healthily/RyU healthiness/NmgU healthwise/R healthy/~J^>pU heap/~NgSVdG hear/~VbGSrHz heard/~VtTJrU hearer/NSg hearing/~JNgVr hearken/VSGd hearsay/Ng hearse/NSVr hearse's heart/~NwSgV heartache/NwgS heartbeat/~NgS heartbreak/~NSg heartbreaking/JY heartbroken/~J heartburn/~Ng hearten/VSGdE heartfelt/~J hearth/~Ng hearthrug/NS hearths/~N hearthstone/NSgV heartily/Ry heartiness/Ng heartland/~NgS heartless/JYp heartlessness/Ng heartrending/JY heartsick/Jp heartsickness/Ng heartstopping/J heartstrings/Ng heartthrob/NgS heartwarming/J heartwood/~Ng hearty/J>^pNSg heat/~NmSVdGr heat-resistant/J heat's heated/~VtTJU heatedly/Ry heater/~NSg heath/~Ng>nX heathen/~JNg heathendom/Ng heathenish/J heathenism/Nmg heather/~NmgJ heaths/N heating/~NmgJV6 heatproof/JV heatstroke/Ng heatwave/~NS heave/Vd>GSNgZ heaven/~NSgVY heavenly/~J^>Ry heavens/~NgV heavenward/JS heaver/Ng heavily/~Ry heaviness/Ng heavy/~J^>pNSgV heavy-duty/J heavy-handed/J heavyhearted/J heavyset/J heavyweight/~NgSJ heck/~NgV heckle/Vd>GSNgZ heckler/~Ng heckling/VNmg hectare/~NSg hectic/JNQ hectogram/NSg hectometer/NgS< hectometre/NgS!@_₹ hector/~NSgVdG hedge/~NSgVd>GZ hedgehog/~NgSV hedgehop/VS hedgehopped/VtT hedgehopping/V6N hedger/Ng hedgerow/NSg hedonism/Nmg hedonist/NgS hedonistic/JQ heed/~NgSVdG heeded/VU heedful/JY heedless/JYp heedlessness/Nmg heehaw/NSgVdG heel/~NgSVdG heelless/J heft/NmgSVdG heftily/Ry heftiness/Nmg hefty/~J>^p hegemonic/~J hegemony/~Nmg hegira/NSg heifer/NSg height/~NwSgXn heighten/VdG heightwise/JR heinous/JYp heinousness/Nmg heir/~NgSV heiress/~NgS heirloom/NSg heist/~NSgVdG held/~VtT helical/~J helices/9 helicopter/~NSgVGd heliocentric/J heliosphere/NSg heliotrope/NSgJ helipad/NS heliport/~NgS helium/~Nmg helix/~NgV hell/~ONgV hellbent/J hellcat/NgS hellebore/Ng hellfire/~NJ hellhole/NgS hellion/NgSJ hellish/JYp hellishness/Ng hello/~NSgV hellscape/NSg helluva/J helm/~NgSV helmet/~NSgVd helmsman/Ng helmsmen/9 helot/NSg help/~NgSVd>GZz helper/~NgS helpful/~JYU helpfulness/Nmg helping/~NgV helpless/~JYp helplessness/Nmg helpline/NSg helpmate/NSg helve/NSgV hem/~NSgVI hematite/Ng hematologic/J hematological/J hematologist/NgS hematology/Ng heme/~Ng hemi/NgS hemiplegia/N hemisphere/~NSg hemispheric/J hemispherical/J hemline/NSg hemlock/~NwSg hemmed/VtT hemmer/NSg hemming/V6N hemoglobin/Nmg hemophilia/Nmg hemophiliac/NgS hemorrhage/~NgSVGd hemorrhagic/~J hemorrhoid/NgS hemostat/NgS hemp/~Nmgn hemstitch/NgSVdG hen/~NgV hence/~V henceforth/~ henceforward/ henchman/~Ng henchmen/~9 henna/NSgJVdG henpeck/VGdSN hentai/NgS hep/~NJV heparin/Ng hepatic/~JN hepatitis/~Ng hepatocyte/NS hepper/Jc heppest/Ju heptagon/NgS heptagonal/J heptathlon/NSg her/~D5Ia3o. # I~pronoun a~personal 3~person .~singular o~object / D5=determiner+possessive herald/~NSgVdG heralded/~VU heraldic/~J heraldry/~Ng herb/~NgS herbaceous/~J herbage/Nmg herbal/~JNS herbalist/NgS herbicidal/J herbicide/NwgS herbivore/~NSg herbivorous/~J herculean/J herd/~NgSVd>GZ herder/~NgS herdsman/N9g herdsmen/N9 here/~JR # removed `N` marginal noun sense complicates linting here's hereabout/S hereafter/~NSgJ hereby/~R hereditary/~JN heredity/~Nmg herein/R hereinafter/ hereof/ hereon/ heresy/~NSg heretic/~NSgJ heretical/~J hereto/ heretofore/ hereunder/ hereunto/R hereupon/ herewith/ heritable/Ji heritage/~NwgS hermaphrodite/~NSgJ hermaphroditic/J hermetic/J hermetical/JY hermit/~NSg hermitage/~NgS hermitian/~J hernia/NSg hernial/J herniate/VGdSn herniation/NwSg hero/~N0g heroes/~N9 heroic/~JNSQ heroics/Ng heroin/~NwSg heroine/~NSgJ heroism/~Ng heron/~NSg herpes/~Ng herpetologist/NSg herpetology/Ng herring/~NwgS herringbone/NgV hers/~I* herself/~Ia3F. # I~pronoun a~personal 3~person .~singular F~reflexive hertz/~Ng hesitance/Nmg hesitancy/Nmg hesitant/~JY hesitate/~VdSGnX hesitating/VNYU hesitation/~Ng hessian/~N hetero/~JNSg( heterodox/J heterodoxy/Nmg heterogeneity/Ng heterogeneous/~JY heteronormative/J heterosexual/~JYNgS heterosexuality/Nmg heuristic/JNgSQ heuristics/Ng hew/VGd>SNZ hewn/JT # past participle of "hew" hewer/Ng hex/~VGdSNwg hexadecimal/NwSJ hexagon/~NgS hexagonal/~J hexagram/NSg hexameter/NSg hey/~N heyday/~NSg hf/~ hgt/N hgwy/N hi/~NJd hi-tech/NJ hiatus/~NgS hibachi/NgS hibernate/VGdSn hibernation/~Ng hibernator/NgS hibiscus/~NgS hiccough/N0VdG hiccoughs/N9 hiccup/NSgVGd hick/NgSV hickey/~NSg hickory/~NSgJ hid/~V hidden/~VJ hide/~VGd>SNgZz hideaway/NSgJ hidebound/J hideous/~JYp hideousness/Ng hideout/~NgS hider/Ng hiding/~VNg hie/~VS hieing/V hierarchic/J hierarchical/~JY hierarchy/~NSg hieroglyph/N0gV hieroglyphic/~NgSJ hieroglyphs/~N9V high/~JY^>pNgVRyZ high definition/Ng high frequency/NgS high-frequency/J high-grade/J high-level/J high-paying/J high-pitched/J high-profile/J high-quality/J high-ranking/J high-res/J high-rise/NgS high-speed/J high tech/Ng highball/NSgV highborn/J highboy/NgS highbrow/JNSg highchair/NgS higher-up/NgS highfalutin/JN highhanded/JYp highhandedness/Ng highland/~NgS>Z highlander/~Ng highlight/~NSgVd>GZ highlighter/Ng highly/R% highness/~Ng highroad/NgS highs/~N9V hightail/VdSG highway/~NgSV highwayman/~Ng highwaymen/~9 hijab/~NSg hijack/~VGd>SNgzZ hijacker/~Ng hijacking/~V6Nwg hike/~NgSVGd>Z hiker/Ng hiking/~V6Nmg hilarious/~JYp hilariousness/Nmg hilarity/Ng hill/~NgSV hillbilly/~NSgV hilliness/Nmg hillock/NgS hillside/~NSg hilltop/~NgS hilly/~J>^p hilt/~NgSV him/~Ia3o. # I~pronoun a~personal 3~person .~singular o~object himself/~Ia3F. # I~pronoun a~personal 3~person .~singular F~reflexive hind/~J>NgSZ hinder/~VGdJN hindered/~VU hindmost/J hindquarter/NgS hindrance/~NSg hindsight/~Ng hinge/~NSVdGU hinge's hint/~NgSVd>GZ hinter/Ng hinterland/~NSg hip/~NSgVJp hipbath/N0 hipbaths/N9 hipbone/NgS hiphuggers/N9 hipness/Ng hipped/JVtT hipper/NJc hippest/Ju hippie/~NSgJ hipping/V6 hippo/~NSg hippocampus/~N hippodrome/~NSgV hippopotamus/NgS hippy/NJ hipster/NgSV hiragana/~N hire/~NSVdr hire's hireling/NgS hiring/NgSVJ hirsute/JpN hirsuteness/Ng his/~D5* hiss/~NgSVdG hissy/J>^ hissy fit/NgS hist/~NV histamine/NgS histogram/NgSV histologist/NSg histology/~Nmg histopathology/Nmg historian/~NgS historic/~JN historical/~JYN historicity/~Nmg historiographer/NgS historiography/~Nmg history/~NwSg # removed `4` verb sense is obsolte and interferes with heuristics histrionic/JSQ histrionics/Nmg hit/~VbtTSNgJ # removed `8` pronoun sense is dialectal and interferes with heuristics hitch/~NSVdGU hitch's hitcher/NgS hitchhike/Vd>GSNgZ hitchhiker/NgS hither/J hitherto/~RJ hitmaker/NgS hitman/~N0g♂ hitmen/N9g♂ hitter/~NSg hitting/~NV6 hive/~NgSVGd hivemind/NSg hiya/ hmm/~V ho/~NSgVd>YZ hoagie/NgS hoard/~NSgVGd>Zz hoarder/Ng hoarding/NgV hoarfrost/Ng hoariness/Ng hoarse/JY^>pVN hoarseness/Ng hoary/~J^>p hoax/~Vd>GSNgZ hoaxer/Ng hob/~NSgV hobbit/~NSg hobble/NgSVGd>Z hobbler/Ng hobby/~NSg hobbyhorse/NgS hobbyist/NSg hobgoblin/NgS hobnail/NSgVGd hobnob/NSVJ hobnobbed/VtT hobnobbing/V6N hobo/NgSV hoc/~ hock/~NgSVdG hockey/~Nmg hockshop/NgS hod/~VSNg hodgepodge/NSgV hoe/~NSgV hoecake/NSg hoedown/NSgV hoeing/VN hoer/Ng hog/~NSgV hogan/~NSg hogback/NSg hogged/VtTJ hogging/V6NJ hoggish/JY hogshead/NSg hogtie/VdSN hogtying/V hogwash/Ng hoick/NSVGd hoist/~VGdSNg hoke/NSVGd hokey/J hokier/Jc hokiest/Ju hokum/Ng hold/~V>GSNgJzZ holdall/NS holder/~Ng holding/~NgV holdout/NSg holdover/NSg holdup/NgS hole/~NgSVGd holey/J holiday/~NSgVdG holidaymaker/NS holiness/~NmgU holism/~N holistic/~JQ holler/NgSVdGJ hollow/~NgSVd>GJY^p hollowness/Ng holly/~NSg hollyhock/NgS holmium/Nmg holocaust/~NSgV hologram/NgS hologrammatic/JQ holograph/N0gV holographic/~J holographs/N9 holography/Nmg hols/N holster/NSgVdG holy/~J>^pNU holy moley holy moly homage/~NwgSV hombre/~NgS homburg/~NSg home/~NgSVGd>JYZ home-grown/J home school/NgSVdG homebody/NSg homeboy/NSgI homebrew/NwSgVdG homebuilt/J homecoming/~NSg homecooked/J homegrown/~JNgS homeland/~NgS homeless/~JpNg homelessness/~Nmg homelike/J homeliness/Nmg homely/J>^p homemade/~J homemaker/NSg homemaking/Nmg homeopath/N0g homeopathic/JN homeopaths/N9 homeopathy/Ng homeostasis/Ng homeostatic/J homeowner/~NgS homepage/~NgS homer/~NgVGd homeroom/NgS homeschooling/Nmg homesick/Jp homesickness/Ng homespun/JNg homestead/~NSgVd>GZ homesteader/Ng homestretch/NgS hometown/~NgS homeward/JS homework/~Ng>GZ homewrecker/NSg homey/NSgJp homeyness/Ng homicidal/J homicide/~NwgS homie/NgS homier/Jc homiest/Ju homiletic/J homily/~NSg hominid/NSgJ hominoid/NS hominy/Ng homo/~NgSJ( homoerotic/J homogeneity/Ng homogeneous/~JY homogenisation/Ng!_₹ homogenise/VdSG!_₹ homogenization/Ng homogenize/VdSG homograph/Ng homographs/N homologous/~J homology/~N homonym/NSg homophobia/~Ng homophobic/~JN homophone/NgS homosexual/~JNSg homosexuality/~Ng hon/~NSg^Gd>Z honcho/NgSV hone/~NgSV honer/NgV honest/~JY^VE honester/Jc honesty/~NmgE honey/~NwSgJVGd honeybee/NSg honeycomb/~NwgSVdG honeydew/NSgJ honeylocust/Ng honeymoon/~NgSVGd>Z honeymooner/Ng honeypot/NS honeysuckle/NSg honk/Vd>GSNgZ honker/Ng honky/~NSg honor/~Nw☁SgVGdEB< honorableness/Ng< honorably/RyE< honorarily/Ry honorarium/NgS honorary/~JN honoree/NSg< honorer/NSg< honorific/~NgSJQ honour/NwgSVdGEB!@_₹ honourableness/Ng!@_₹ honourably/RyE!@_₹ honouree/NSg!@_₹ honourer/NSg!@_₹ hooch/Nwg hood/~NgSVdGJ hoodie/NgS hoodlum/NSg hoodoo/~NgSVdG hoodwink/VdGSN hooey/Ng hoof/~NgSVd>GZ hook/~NSVdGU hook up/V/ hook's hookah/Ng hookahs/N hooker/~NgS hookup/NgS hookworm/NgS hooky/NgJ hooligan/~NgS hooliganism/Nmg hoop/~NgSVdG hoopla/Ng hooray/NV hoosegow/NSg hoot/NgSVd>GZ hootenanny/NSg hooter/Ng hoover/~NSVdG hooves/V9 hop/~NSgVGd hope/~VSNwg hopeful/~JYpNSg hopefulness/Ng hopeless/~JYp hopelessness/Ng hopped/VtTJ hopper/~NgS hopping/~NV6J hopscotch/NgSVdG hora/~NgS horde/~NSgVdG horehound/NSg horizon/~NSg horizontal/~JYNSg hormonal/~J hormone/~NSgV horn/~NgSVd hornbeam/N hornblende/Ng hornet/~NgS hornless/J hornlike/J hornpipe/NgSV horny/J^> horologic/J horological/J horologist/NgS horology/Ng horoscope/NSg horrendous/JY horrible/~NJp horribleness/Ng horribly/~Ry horrid/JY horrific/~JQ horrify/VdSG horrifying/V6JY horror/~NwgS horse/~NSVdGU horse's horseback/~Nmg horsebox/NS horseflesh/NmgJ horsefly/NSg horsehair/Ng horsehide/Nmg horselaugh/N0g horselaughs/N9 horseless/J horseman/~N0g horsemanship/Nmg horsemen/~N9 horseplay/NgV horsepower/~Ng horseradish/NwgS horseshit/Nx horseshoe/~NSgVd horseshoeing/V horsetail/NSg horsetrading/NV horsewhip/NSgV horsewhipped/VtT horsewhipping/V6N horsewoman/N0g horsewomen/N9 horsey/JN horsier/Jc horsiest/Ju hortatory/JN horticultural/~J horticulturalist/NgS horticulture/~Nmg horticulturist/NgS hosanna/NSgV hose/~NgSVGd hosepipe/NSV hosier/NgS hosiery/~Nmg hosp/N hospholipase hospice/~NwgS hospitable/Ji hospitably/Ryi hospital/~NSgJ hospitalisation/NSg!_₹ hospitalise/VdSG!_₹ hospitality/~Nmg hospitalization/~NwSg hospitalize/VdSG host/~NgSVdG hostable/J hostage/~NgSV hostel/~NgSVGd>Z hosteler/Ng hostelry/NSg hostess/~NgSVdG hostile/~JYNgS hostilities/~N9g hostility/~N0wSg hostler/NgS hot/~JYpVSN hotbed/NgS hotblooded/J hotbox/NgSV hotcake/NSg hotel/~NSg hotelier/NgS hotfoot/NgSJVdG hothead/NSgd hotheaded/JYp hotheadedness/Nmg hothouse/NSgV hotkey/NSV hotline/NSg hotlink/NS hotness/Nmg hotplate/NSg hotpot/NwgS hots/NgVh hotshot/JNgSV hotspot/NgS hotted/VtT hotter/~JcNV hottest/~Ju hottie/NgS hotting/NV6 hound/~NSgVGd hour/~NgS hourglass/~NgS houri/NSg hourly/JR8 house/~NSVdGr house's houseboat/NSg housebound/J houseboy/NSg♂ housebreak/V>SGZ housebreaker/Ng housebreaking/NgV housebroke/V housebroken/J houseclean/VdSG housecleaning/NgV housecoat/NSg housefly/NSg houseful/NSg household/~NSgJ>Z householder/~NgS househusband/NSg housekeeper/~NgS housekeeping/~Nmg houselights/N9g housemaid/~NSgV houseman/N0g♂ housemaster/NS housemate/NSg housemen/N9♂ housemistress/NS♀ housemother/NSg♀ houseparent/NSg houseplant/NgS houseproud/J houseroom/N housetop/NSg housewares/Ng housewarming/NSg housewife/~N0g♀VY housewives/~N9♀ housework/Ng housing/~NwgSV hove/~V hovel/NSgV hover/~VGdSN hoverboard/NgSV hovercraft/NgS09 # singular and plural, also has a plural in -s how/~CNSg how come/R how'd/ how're/ howbeit/C howdah/Ng howdahs/N howdy/VN however/~C howitzer/~NSgV howl/NgSVd>GZ howler/Ng howsoever/ hoyden/NgSJV hoydenish/J hp/~N ht/~N huarache/NSg hub/~NOSg hubbub/NSgV hubby/NSgJ hubcap/NSg hubless/J hubris/Nmg huckleberry/~NwSgV huckster/NSgVGd hucksterism/Nmg huddle/NSgVdGJ hue/~NwSgd huff/~NgSVdG huffily/Ry huffiness/Nmg huffy/J>^p hug/~NSgV>^ huge/~JYp hugeness/Nmg hugged/VtT hugging/V6N huh/~ hula/~NgSV hulk/~NgSVG hull/~NgSVd>GZ hullabaloo/NSgV huller/Ng hum/~NSgV human/~JY^>pNSgV humane/~JYp humaneness/Nmg humanhood/Nmg humanisation/Nge!_₹ humanise/VdSGe!_₹ humaniser/NSg!_₹ humanism/~Nmg humanist/~NSgJ humanistic/~J humanitarian/~JNgS humanitarianism/Nmg humanities/~Ng humanity/~NSgi humanization/Nge humanize/VdSGe humanizer/NSg humankind/~Nmg humanness/Nmg humanoid/~JNSg humble/~J^>pNSVdGZz humbleness/Nmg humbler/NgJ humbly/Ry humbug/~NSgV humbugged/VtT humbugging/NV6 humdinger/NgS humdrum/JNg humeral/JN humeri/N humerus/~Ng humid/~JY humidification/Ng humidifier/Nge humidify/VGd>SeZ humidity/~Ng humidor/NSg humiliate/VdSGnX humiliating/~JYVN humiliation/~Ng humility/~Ng hummed/VtT hummer/~NSg humming/V6JN hummingbird/~NSg hummock/NSg hummocky/J hummus/~Ng humongous/J humor/~Nw☁SgVdG< humoresque/N humorist/~NgS< humorless/JYp< humorlessly/Ry< humorlessness/Ng< humorous/~JYp humorousness/Ng humour/Nw☁SgVGd!@_₹ humourist/NSg!@_₹ humourless/JYp!@_₹ humourlessly/Ry!@_₹ humourlessness/Ng!@_₹ hump/~NgSVdG humpback/NgSVd humph/VdG humphs/V humus/Nwg hunch/NgSVdG hunchback/NSgd hundred/~NSgH hundredfold/JV hundredth/~JN0g hundredths/N9 hundredweight/NSg hung/~VtTJ hunger/~NmSgVdG hungover/J hungrily/Ry hungriness/Nmg hungry/~J>^p hunk/NgS>Z hunker/VdGN hunky/J>^N hunt/~Vd>GSNgZ hunter/~Ng hunting/~NmgV huntress/NgS huntsman/~Ng huntsmen/9 hurdle/~NSgVd>GZ hurdler/Ng hurdling/NgV hurl/Vd>GSNgZ hurler/~Ng hurling/~NgV hurrah/NgVGd hurrahs/NV hurray/NgSVGd hurricane/~NgSV hurried/JYVU hurry/~NSgVdG hurt/~VbtTGSJNg hurtful/JYp hurtfulness/Nmg hurtle/VdGSN husband/~NgSVGd husbandman/Ng husbandmen/9 husbandry/~Nmg hush/~VdGSNg husk/NgSVd>GZ~ husker/Ng huskily/Ry huskiness/Ng husky/~J>^pNSg hussar/NSg hussy/NSg hustings/Ng hustle/~Vd>GSNgZ hustler/~Ng hut/~NSgV hutch/NgSV huzzah/NgVdG huzzahs/N hwy/~N hyacinth/Ng hyacinths/N hybrid/~NSgJ hybridisation/NwSg!_₹ hybridise/VdSG!_₹ hybridism/Ng hybridization/~Ng hybridize/VdSG hydra/~NSg hydrangea/NSg hydrant/~NgS hydrate/NSVGden hydrate's hydration/Nge hydraulic/~JVSQ hydraulics/Ng hydro/~JNg hydrocarbon/~NgS hydrocephalus/Ng hydrochloride/N hydrocortisone/N hydrodynamic/JS hydrodynamics/Ng hydroelectric/~JQ hydroelectricity/Ng hydrofoil/NgSV hydrogen/~Nmg hydrogenate/VGdSe hydrogenation/Ng hydrogenous/J hydrolock/NgSVGd hydrologist/NgS hydrology/~Ng hydrolyse/VdSG!_₹ hydrolyses/N9V hydrolysis/~N0g hydrolyze/VdSG hydrometer/NSg hydrometry/Ng hydrophilic/J hydrophobia/Nmg hydrophobic/~J hydrophone/NSg hydroplane/VGdSNg hydroponic/JSQ hydroponics/Ng hydropower/~Nmg hydrosphere/Ng hydrotherapy/Ng hydrothermal/J hydrous/J hydroxide/~NSg hyena/NSg hygiene/~Ng hygienic/JUQ hygienist/NgS hygrometer/NSg hying/VN hymen/~NSg hymeneal/JN hymn/~NgSVdG hymnal/~NgSJ hymnbook/NSg hype/~NmgSVGd>J # hyper # prefixes that are not also words in their own right don't belong in the dictionary hyperactive/J hyperactivity/~Ng hyperaggressive/J hyperbola/NSg hyperbolæ/N9 hyperbolae/N9 hyperbole/~N0g hyperbolic/~JQ hypercar/NgS hyperconservative/J hypercorrect/JVSGd hypercorrection/NwgS hypercorrectness/Nm hypercritical/JY hypercube/NgS hyperfast/J hyperfixation/Nmg hyperglycemia/Ng hyperinflate/VGdSNn hyperlink/NSgVGd hypermarket/NgS hypermedia/Nmg hypernetwork/NSg hyperparameter/NgS hyperparathyroidism/N hyperplane/N hyperscale/J hypersensitive/Jp hypersensitiveness/Ng hypersensitivity/~NSg hypersexualise/VSdG!_₹ hypersexualize/VSdG hyperspace/NmSV hypertension/~Ng hypertensive/JNSg hypertext/Ng hyperthyroid/Jg hyperthyroidism/Ng hypertrophic/J hypertrophy/NSgVdG hyperventilate/VGdSn hyperventilation/Ng hypervigilant/J hypervisor/NgS hyphen/~NgSVdGC hyphenate/VdGSNgXn hyphenation/Ng hypnagogic/J hypnoses/N hypnosis/~Ng hypnotherapist/NS hypnotherapy/Ng hypnotic/JNSgQ hypnotise/VGdS!_₹ hypnotism/Ng hypnotist/NgS hypnotize/VGdS hypo/NgSV hypoallergenic/J hypochondria/Nmg hypochondriac/JNSg hypocrisy/~NSg hypocrite/NgS hypocritical/JY hypodermic/JNgS hypoglycemia/Ng hypoglycemic/JNSg hypomanic/J hypotenuse/NgS hypothalami/N hypothalamus/~Ng hypothermia/~Ng hypotheses/~N9 hypothesis/~N0g hypothesise/V!_₹ hypothesize/VdSG hypothetical/~JYNS hypothyroid/Jg hypothyroidism/Ng hyssop/Ng hysterectomy/NSg hysteresis/N hysteria/~Ng hysteric/JNSg hysterical/~JY hysterics/Ng i/~ i.e./~ iMac/NgS iOS/Og iPad/NgS iPhone/NgS iPod/NgS iTunes/Ng iamb/NgS iambi/N iambic/JNSg iambus/NgS ibex/NgS ibid/~ ibidem ibis/~NgS ibuprofen/NgV ice/~NwSVdGe ice cream/NmgS ice's iceberg/NSg iceboat/NSgV icebound/J icebox/NgSJ icebreaker/~NSg icecap/NSg iceman/~N0g icemen/N9 ichthyologist/NgS ichthyology/Ng icicle/NSg icily/Ry iciness/Ng icing/~NSgV icky/J>^ icon/~NgS iconic/~J iconicity/Nmg iconoclasm/Ng iconoclast/~NSg iconoclastic/J iconography/~Nwg ictus/Ng icy/~J^>p id/~NSgIY idea/~NgS ideal/~JYNSg idealisation/NwSg!_₹ idealise/VdSG!_₹ idealism/~Nmg idealist/NSg idealistic/~JQ idealization/NgS idealize/VdSG idealogue/NgS ideate/VdSGn idem/~I idempotency/Nmg idempotent/JN identical/~JYN identifiable/~JU identification/~Nmg identified/~VU identify/~VGd>SZnX identikit/NSJ identity/~NSg ideogram/NSg ideograph/N0g ideographs/N9 ideological/~JY ideologist/NSg ideologue/NgS ideology/~NwSg ides/~Ng idiocy/NwSg idiom/~NwSg idiomatic/JNUQ idiopathic/~J idiosyncrasy/NwSg idiosyncratic/~JQ idiot/~NSgJ idiotic/JQ idle/~J^>pVGdSNgZ idleness/Nmg idler/~NgJ idol/~NgS idolater/NSg idolatress/NgS idolatrous/J idolatry/~Nmg idolisation/Ng!_₹ idolise/VGdS!_₹ idolization/Nmg idolize/VGdS idyll/NSg idyllic/~JNQ if/~CNSg iffiness/Nmg iffy/J>^p igloo/NSg igneous/~J ignitable/J ignite/~VGdSr ignition/~NwgS ignoble/JV ignobly/Ry ignominious/JY ignominy/NSg ignoramus/NgSV ignorance/~Ng ignorant/~JYN ignore/~VGdS iguana/~NgS ii/~ iii/~ # il # prefixes that are not also words in their own right don't belong in the dictionary ilea/N ileitis/Ng ileum/Ng ilia/~N9 ilium/N0gS ilk/JNSg ill/~JpNSgV illegal/~JYNgS illegality/NSg illegibility/Ng illegible/J illegibly/Ry illegitimacy/~Nmg illegitimate/~JYNV illiberal/JYN illiberalism/Nmg illiberality/Nmg illicit/~JYpN illicitness/Nmg illimitable/J illiquid/J illiteracy/Nmg illiterate/~JYNgS illness/~NgS illogical/JY illogicality/Nmg illuminate/~VGdSNJnX illuminating/~JYV illumination/~Nmg illumine/VdSGB illus/~v illusion/~NwgSE illusionist/NSg illusory/~J illustrate/~VGdSnvX illustration/~NwSg illustrative/~JY illustrator/~NSg illustrious/~JYp illustriousness/Nmg # im # prefixes that are not also words in their own right don't belong in the dictionary image/~NwSgVdG imager/NgS imagery/~Nmg imaginable/JU imaginably/RyU imaginal/J imaginary/~JN imagination/~NgS imaginative/~JYU imagine/~VdGSNBzr imago/~N0g imagoes/N9 imam/~NgS imbalance/~NSgd imbecile/NgSJ imbecilic/J imbecility/NSg imbibe/VGd>SZ imbiber/Ng imbrication/Ng imbroglio/NSg imbue/VdSG imitable/Ji imitate/~VdSGnvX imitation/~NwSg imitative/JYp imitativeness/Ng imitator/NSg immaculate/~JYp immaculateness/Ng immanence/Ng immanency/Ng immanent/JY immaterial/JYpN immateriality/Ng immaterialness/Ng immature/~JYN immaturity/Ng immeasurable/JN immeasurably/Ry% immediacies/Ng immediacy/NSg immediate/~JYp immediateness/Ng immemorial/JY immense/~JYN immensity/NSg immerse/VdSGJXnv immersible/J immersion/~Ng immigrant/~NSgJ immigrate/VdSGn immigration/~NgS imminence/Ng imminent/~JY immobile/~JN immobilisation/Ng!_₹ immobilise/VGd>SZ!_₹ immobility/Ng immobilization/Ng immobilize/VGd>SZ immoderate/JY immodest/JY immodesty/Nmg immolate/VdSGn immolation/Nmg immoral/~JY immorality/~NSg immortal/~JYNgS immortalise/VdSG!_₹ immortality/~Ng immortalize/VdSG immovability/Ng immovable/JN immovably/Ry immune/~JNV immunisation/NgS!_₹ immunise/VGdS!_₹ immunity/~NwgS immunization/NSg immunize/VGdS immunodeficiency/Ng immunodeficient/J immunoglobulin/NS immunologic/J immunological/JN immunologist/NgS immunology/~Ng immure/VdGSN immutability/Nmg immutable/~JN immutably/Ry imp/~V>SNg impact/~NSgVdGf impair/VdGSJNL impaired/~JVNU impairment/~NgS impala/~NSg impale/VdSGL impalement/Ng impalpable/J impalpably/Ry impanel/VSdG impanelled/VtT!_₹ impanelling/V6N!_₹ impart/~VSdG impartial/~JY impartiality/Ng impassably/Ry impasse/NSgBv impassibility/Ng impassible/J impassibly/Ry impassioned/J impassive/JYp impassiveness/Nmg impassivity/Ng impasto/NgV impatience/NmgS impatiens/Ng impatient/~JY impeach/VGd>SZBL impeachable/JU impeacher/Ng impeachment/~NwSg impeccability/Ng impeccable/J impeccably/Ry impecunious/JYp impecuniousness/Ng impedance/~Ng impede/~VdSG impeded/~VtTU impediment/~NSg impedimenta/Ng impel/VS impelled/VtT impeller/NgS impelling/V6 impend/VSdG impenetrability/Ng impenetrable/JN impenetrably/Ry impenitence/Ng impenitent/JYN imperative/~JYNSg imperceptibility/Ng imperceptible/J imperceptibly/Ry imperceptive/J imperf/JN imperfect/~JYpNSgV imperfection/NwgS imperfective/NSgJ imperfectness/Ng imperial/~JYNgS imperialism/~Ng imperialist/~JNSg imperialistic/JQ imperil/VGSdL imperilled/VtT!@_₹ imperilling/V6N!@_₹ imperilment/Ng imperious/JYp imperiousness/Ng imperishable/JN imperishably/Ry impermanence/Ng impermanent/JY impermeability/Ng impermeable/J impermeably/Ry impermissible/J impersonal/JYN impersonate/VGdSnX impersonation/~NgS impersonator/~NSg impertinence/NgS impertinent/JYN imperturbability/Nmg imperturbable/J imperturbably/Ry impervious/JY impetigo/Ng impetuosity/Nmg impetuous/JYp impetuousness/Nmg impetus/~NgS impiety/NSg impinge/VdSGL impingement/Ng impious/JYp impiousness/Nmg impish/JYp impishness/Nmg implacability/Nmg implacable/J implacably/Ry implant/~VGdSNgB implantation/Ng implausibility/NSg implausible/~J implausibly/Ry implement/~VGd>SNgBr implementable/JU implementation/~NwSg implemented/~VtTU implicate/VdGSN implication/~NwgS implicit/~JYp implicitness/Nmg implode/VdSG imploration/Nmg implore/VdGSN imploring/V6NY implosion/~NgS implosive/JN imply/~VdSGXn impolite/JYp impoliteness/NmgS impolitic/J imponderable/JNgS import/~NwSgVGd>ZB importance/~Nmg important/~JY importation/~NwgS importer/~NgS importunate/JYV importune/VGdSJ importunity/Ng impose/~VdGSNr imposer/NgS imposing/~VJU imposingly/Ry imposition/~NgS impossibility/~NSg impossible/~JNS impossibly/Ry impost/NSg imposter/Ng@ impostor/~NSg imposture/NgS impotence/Nmg impotency/Nmg impotent/JYN impound/VdGSN impoundment/NSg impoverish/VdSGL impoverishment/Ng impracticability/N impracticable/JN impracticably/Ry impractical/~JY impracticality/Ng imprecate/VdSGXn imprecation/Ng imprecise/JYpn impreciseness/Ng imprecision/Ng impregnability/Ng impregnable/J impregnably/Ry impregnate/VGdSn impregnation/Ng impresario/~NSg impress/~VdGSNgv impressed/~JVtTU impressibility/Ng impressible/J impression/~NSgVB impressionability/Ng impressionism/~Nmg impressionist/~NSg impressionistic/J impressive/~JYp impressiveness/Nmg imprimatur/NSg imprint/~NgSVd>GZ imprinter/Ng imprison/VSdGL imprisonment/~NSg improbability/NSg improbable/~J improbably/Ry impromptu/~JNSg improper/~JYV impropriety/NSg improve/~VGdSBL improved/~JVU improvement/~NwgS improvidence/Nmg improvident/JY improvisation/~NwSg improvisational/~J improvise/~VGd>SZ improviser/NgS imprudence/Nmg imprudent/JY impudence/Nmg impudent/JY impugn/VGSd>Z impugner/Ng impulse/~NgSVGdnv impulsion/Ng impulsive/~JYpN impulsiveness/Ng impulsivity/N impunity/~Nmg impure/~JY^>V impurity/~NSg imputation/NSg impute/VdSGB in/~PJR(rg # removed `4`, verb senses are obsolete, `NS`, noun sense is marginal in addition # dictionaries don't list this with a POS, or use 'phrase' in addition to/P in-depth/J in-memory/J in personam/J in situ/JR inaccuracy/NwgS inaction/~Nmg inadequacy/NS inadvertence/Ng inadvertent/JY inalienability/Ng inalienably/Ry inamorata/NSg inane/J>Y^N inanimate/~JYpNV inanimateness/Ng inanity/NSg inappropriate/~JY inarticulate/JYN inasmuch/ inaudible/J inaugural/~JNSg inaugurate/VGdSJXn inauguration/~Ng inboard/JNgSV inbound/~JVN inbox/NgSV inbreed/VS inc/~J^NVGd incalculably/Ry incandescence/Nmg incandescent/~JYN incantation/NSg incapacitate/VGdSn incarcerate/VdSGJXn incarceration/~Nmg incarnadine/JNSVdG incarnate/~JVGdSrXn incarnation/~Ngr incel/NgS incendiary/~JNSg incense/~NwgSVGd incentive/~NwgSE incentivization/NwSg incentivize/VGdSE inception/~NwSg incessant/~JY incest/~NmgV incestuous/~JYp incestuousness/Nmg inch/~NgSVdGJ inchoate/JNV inchworm/NSgV incidence/~NSg incident/~NSgJ incidental/~JYNgS incinerate/VdSGJn incineration/Ng incinerator/NgS incipience/Ng incipient/JYN incise/VGdSXnv incision/~Ng incisive/JYp incisiveness/Ng incisor/~NgS incitement/NgS inciter/NgS incl/~P inclement/J inclination/~N0wgE inclinations/~N9 incline/~VGdSNE incline's include/~VGdSN inclusion/~NgS inclusive/~JYp inclusiveness/Nmg inclusivity/NgS incognito/~JNgS incombustible/JN income/NwgS incommode/VGdJN incommodious/J incommunicado/J incompatibility/~NwS incompetent/~JNgS incomplete/~JYN inconceivability/Ng incongruous/JYp incongruousness/Ng inconsequence/Nmg inconsolably/Ry inconstant/JY incontestability/Nmg incontestably/Ry incontinent/JN incontrovertibly/Ry inconvenience/NVGd incorporate/~VdSGJrn incorporated/~JVtTU incorporation/~Ngr incorporeal/J incorrect/~JYN incorrigibility/Nmg incorrigible/JN incorrigibly/Ry incorruptibly/Ry increasing/~JYV6N increasingly/R increment/~NSgVdG incremental/~JY incrementalism/N incrementalist/NSg incriminate/VGdSn incrimination/Ng incriminatory/J incrustation/NSg incubate/VGdSn incubation/~Ng incubator/~NSg incubus/~NgS inculcate/VdSGn inculcation/Ng inculpate/VdSG inculpatory/J incumbency/NSg incumbent/~JNSg incunabula/N incunabulum/Ng incur/~VSB incurable/JNgS incurably/Ry incurious/J incurred/~VtT incurring/V6 incursion/~NgS ind/~ indebted/~VJp indebtedness/Ng indeed/~R% # also an adverb of affirmation, emphasis, and degree indefatigable/J indefatigably/Ry indefeasible/J indefeasibly/Ry indefinably/Ry indefinitely/Ry indelible/J indelibly/Ry indemnification/Ng indemnify/VGdSXn indemnity/~NSg indentation/~NgS indention/Ng indenture/NVdG indescribably/Ry indestructibly/Ry indeterminably/Ry indeterminacy/Ng indeterminate/~JYN index/~NgSVGd>Z indexation/NSg indexer/Ng indicate/~VdSGXnv indication/~Ng indicative/~JYNSg indicator/~NgS indict/VGdSBL indictment/~NSg indie/~JNS indigence/Nmg indigenous/~J indigent/JYNSg indignance/Ng indignant/JY indignation/~Ng indigo/~NgJ indirect/~JYNV # noun senses: 1) type of const in finace; 2) type of radiator indiscipline/N indiscreet/JY indiscretion/NS indiscriminate/~JY indispensability/Ng indispensable/~JNgS indispensably/Ry indissolubility/N indissolubly/Ry indistinguishably/Ry indite/VGdSN indium/Nmg individual/~NgSJY individualisation/Ng!_₹ individualise/VGdS!_₹ individualism/~Ng individualist/NgS individualistic/JQ individuality/~Ng individualization/Ng individualize/VGdS individuate/VdSGJn individuation/Ng indivisibly/Ry indoctrinate/VGdSn indoctrination/Ng indolence/Ng indolent/JY indomitable/~J indomitably/Ry indubitable/JN indubitably/R # adverb of certainty/opinion aka modal adverb induce/~Vd>SGZL inducement/NSg inducer/Ng induct/VdGv inductance/~Ng inductee/~NSg induction/~NwgS inductive/~JY inductor/NgS indulge/~VdSG indulgence/~NwSgV indulgent/JY industrial/~JYN industrialisation/Ng!_₹ industrialise/VdSG!_₹ industrialism/Ng industrialist/~NSg industrialization/~Nge industrialize/VdSGr industrious/~JYp industriousness/Nmg industry/~NwSg indwell/VSG inebriate/NgSVGdJn inebriation/Nmg inedible/JN ineffability/Ng ineffable/J ineffably/Ry inelastic/~J ineligible/~JNgS ineligibly/Ry ineluctable/J ineluctably/Ry inept/~JYp ineptitude/Ng ineptness/Ng inequality/~NS inert/~JYpNV inertia/~Ng inertial/~J inertness/Ng inescapable/J inescapably/Ry inestimably/Ry inevitability/NgS inevitable/~JNg inevitably/~Ry inexact/JY inexhaustibly/Ry inexorability/N inexorable/J inexorably/Ry inexpedient/J inexperience/Nmg inexpert/JYN inexpiable/J inexplicably/~Ry inexpressibly/Ry inexpressive/J inextricably/Ry inf/~ infallible/~NJ infamy/NSg infancy/~Ng infant/~NgSV infanticide/NwgS infantile/~J infantilize/VdSG infantry/~NwSg infantryman/~N0g infantrymen/~N9 infarct/NgS infarction/~NwgS infatuate/VdGSJNXn infatuation/~NwgS infect/~VSdGJrE infected/~VJNU infection/~NwSgr infectious/~JYp infectiousness/Nmg infelicitous/J infer/VdSG inference/~NSg inferencing/Nmg inferential/J inferior/~JNgS inferiority/Ng infernal/~JYN inferno/~NgS inferred/~VtT inferring/V6N infest/VGdSJN infestation/~NgS infidel/JNgS infidelity/~NS infiltrator/NSg infinite/~JNgv infinitesimal/~JYNSg infinitival/J infinitive/~NgSJ infinitude/Ng infinity/~NwSg infirm/~JV infirmary/~NSg infirmity/NwSg infix/VGdSNg inflame/VdSG inflammable/JN inflammation/~NwSg inflammatory/~JN inflatable/~JNSg inflate/VdSGr inflation/~NmgE inflationary/J inflect/VSdG inflection/NwgS inflectional/J inflexion/NSg!_₹ inflict/~VSdGv infliction/Nmg inflow/~NSgV influence/~NwgSVGd influenced/~VJU influencer/NSg influential/~JYN influenza/~Nmg info/~Nmg infographic/NSgJ infomercial/NSg inform/~VJZ informal/~JY informant/~NSg informatics/~Nm information/~NmgE informational/~J informative/~JYp informativeness/Nmg informed/~VJU infotainment/Nmg infra/~N infrared/~NmgJ infrasonic/J infrastructural/J infrastructure/~Nmg infrequence/Ng infrequent/~JY infringement/~NwgS infuriate/VGdSJ infuriating/JYV6 infuser/NSg ingenious/~JYp ingeniousness/Nmg ingenue/NSg ingenuity/~Nmg ingenuous/JYE ingenuousness/Nmg ingest/VdGSN ingestion/~NwgS inglenook/NSg ingot/NSgV ingrain/VGJN ingrate/JNSg ingratiate/VGdSn ingratiating/JYV ingratiation/Ng ingredient/~NgS ingress/~NgSV inguinal/J inhabit/~VdG inhabitable/JU inhabitant/~NSgJ inhabited/~JpVtTU inhalant/JNSg inhalation/~NgS inhalator/NgS inhaler/NSg inharmonious/J inhere/VdSG inherent/~JY inherit/~VGSdE inheritance/~NgE inheritances/N inheritor/NSg inhibit/~VGSd inhibition/~NSwgE inhibitor/~NSg inhibitory/~J inhomogeneous/J inhuman/~JY inhumane/JY inimical/JY inimitably/Ry iniquitous/JY iniquity/NSg init/VS initial/~JYNSgVGd initialisation/NgS!_₹ initialise/VdSG!_₹ initialised/VrU!_₹ initialism/~NgS initialization/~NgS initialize/VdSG initialized/VrU initialled/VtT!@_₹ initialling/V6!@_₹ initiate/~NgSVGdJXnv initiated/~VU initiation/~Ng initiative/~JNSg initiator/~NgS initiatory/JN initio inject/~VSdGB injection/~NSg injector/NSg injunctive/NJ injure/~Vd>SGZ injured/~VtTU injurer/Ng injurious/J injury/NwSg ink/~NwSgVd inkblot/NSg inkiness/Ng inkjet/Ng inkling/NSgV inkstand/NSg inkwell/NgS inky/J>^p inland/~JNg inline/~JVdGSNg inmate/~NSg inmost/JN inn/~NSgVG>z innards/Ng innate/~JYpV innateness/Ng innermost/~JN innersole/NSg innerspring/J innervate/VGdSn innervation/Ng inning/~NgV6 innit/ innkeeper/NgS innocence/~Ng innocent/~JYNgS innocuous/~JYp innocuousness/Nmg innovate/VdSGXnv innovation/~NwgS innovator/~NgS innovatory/J innuendo/NwSgV innumerably/Ry innumerate/JN inoculate/VGdSNr inoculation/~NgS inoperability/NgS inoperative/J inordinate/JY inorganic/~JN inositol/N input/NwgSV inputting/V6 inquire/~VGd>Z inquirer/~Ng inquiring/V6NJY inquiry/~NSg inquisition/~NgSV inquisitional/J inquisitive/JYp inquisitiveness/Ng inquisitor/~NSg inquisitorial/J inrush/NgSV insane/~J^ insatiability/Ng insatiably/Ry inscribe/VGd>Z inscriber/Ng inscription/~NgS inscrutability/Ng inscrutable/JpN inscrutableness/Ng inscrutably/Ry inseam/NSgV insecticidal/J insecticide/NwgS insectivore/NgS insectivorous/~J insectoid/JNgS insecure/~JY inseminate/VdSGn insemination/Nmg insensate/JNV insensible/J insensitive/~JY inseparable/~JNgS insert/~VGdSNr insert's insertion/~Nw0Sgr insertions/~N9 insetting/V6 inshallah inshore/~J inside/~NSgJ>PZ insider/~NgS insidious/JYp insidiousness/Nmg insight/~NwgS insightful/J insignia/~NgS insinuate/VGdSnvX insinuation/NwSg insinuator/NSg insipid/JYp insipidity/Nmg insist/~VSGd insistence/~Nmg insistent/JY insisting/~VY insofar/~R insole/NSgV insolence/NmgV insolent/JYN insoluble/~JN insolubly/Ry insolvency/~NwgS insomnia/~Nmg insomniac/~NSgJ insomuch/R insouciance/Ng insouciant/J inspect/~VGdSr inspection/~NwSg inspector/~NgS inspectorate/NgS inspiration/~NwgS inspirational/~JN inspiratory/J inspire/VdSG inspired/~JVU inspiring/~JVNU inst/~N instability/~NS install/~V>dGSNUBZ installation/~NwgS installer/NgSU installment/~NSg instalment/NgS!@_₹ instance/~NVGd instant/~NgSJY>V instantaneous/~JY instantiate/VdSGnX instar/~NV instate/VGdSr instead/~R instigate/VdSGn instigation/~Ngm instigator/NgS instil/VS!_₹ instillation/Ngm instinct/~NgSJv instinctive/JY instinctual/J institute/~NgSVGd>JXZn instituter/Ng institution/~Ng institutional/~JYN institutionalisation/Ng!_₹ institutionalise/VdSG!_₹ institutionalist/JNgS institutionalization/Ng institutionalize/VdSG instr/N instruct/~VdGSNJv instructed/~VtTU instruction/~NwgS instructional/~JN instructive/JYN instructor/~NgS instrument/~NgSVdG instrumental/~JYNgS instrumentalist/~NSg instrumentality/Ng instrumentation/~Ng insubordinate/JN insufferable/J insufferably/Ry insula/N insular/~JN insularity/Ng insulate/VGdSn insulation/~Ng insulator/~NgS insulin/~Ng insult/~VdGSNg insulting/~JYVN insuperable/J insuperably/Ry insurance/~NwSg insure/Vd>SGZB insured/~JNSgV insurer/~NgS insurgence/NwSg insurgency/~NSg insurgent/~JNgS insurmountably/Ry insurrection/~NwSg insurrectionist/NSgJ int/~JNV intact/~J intaglio/NgSV integer/~NgS integral/~JYNSg integrate/~VGSdrEvn integration/~NwgSEr integrator/NSg integrity/~Nmg integument/NSg intel/~Nmg intellect/~NgS intellectual/~JYNgS intellectualise/VGdS!_₹ intellectualism/Nmg intellectualize/VGdS intelligence/~NwSg intelligent/~JYN intelligentsia/~Nmg intelligibility/Nmg intelligible/~JU intelligibly/RyU intended/~JNSgV intense/~JY^>v intensification/Nmg intensifier/NgS intensify/Vd>SGZn intensity/~NmgS intensive/~JYpNgS intensiveness/Nmg intent/~NSgJYp intention/~NgSV intentional/~JYNU intentionality/Nmg # From Phenomenology intentness/Ng inter/~VS(EL inter alia/R interact/~VGdSNv interaction/~NwSg interactive/~JYN interactivity/Nmg interbred/V interbreed/VGS intercede/VGdS intercept/~VGdSNg interception/~NwgS interceptor/~NSg intercession/~NSg intercessor/NgS intercessory/J interchange/~VdGSNg interchangeability/N interchangeable/~JN interchangeably/~Ry intercity/~JN intercollegiate/~JN intercom/NSgV intercommunicate/VdSGn intercommunication/Nmg interconnect/~VGdSN interconnectedness/Nmg interconnection/~NwSg intercontinental/~J intercooler/NgS intercourse/~NmgV intercultural/~J interdenominational/J interdepartmental/J interdependence/Ng interdependent/JY interdict/~NgSVGd interdiction/~Nwg interdimensional/J interdisciplinary/~J interest/~NwSgVdE interested/~JVtTU interesting/~JYV6 interface/~NgSVGd interfaith/~J interfere/~VGdS interference/~NgSV interferon/Nmg interfile/VGdS intergalactic/J intergenerational/JY intergovernmental/~J interim/~JNg interior/~JNSg interj/N interject/VGdS interjection/NwSg interlace/NSVGd interlard/VdGS interleaf/Ng interleave/VdGSN interleukin/Ng interline/JVGdSz interlinear/JN interlining/NgV interlink/VdGSN interlock/VGdSNg interlocutor/NSg interlocutory/JN interlope/VGd>SZ interloper/Ng interlude/~NgSVGd intermarriage/~NwSg intermarry/VGdS intermediary/~JNSg intermediate/~JYNgSV intermediation/Nmg interment/~N0gE interments/N9 intermezzi/N9 intermezzo/N0gS interminably/Ry intermingle/VdSG intermission/NwSg intermittence/N intermittency/N intermittent/~JYN intermix/VGdSN intern/~NVGdJL internal/~JYS internalisation/Nmg!_₹ internalise/VGdS!_₹ internalization/Nmg internalize/VGdS international/~JYNSg internationalisation/Nm!_₹ internationalise/VdSG!_₹ internationalism/Nmg internationalist/~JNSg internationalization/Nm internationalize/VdSG internecine/J internee/NSg internet/~ONV internetwork/NgSVdG internist/NgS internment/~Ng internship/~NgS interoffice/JV interoperability/~N interoperable/J interoperate/VS interpenetrate/VdSGnX interpersonal/~J interplanetary/~J interplay/~NgV interpolate/VdSGXn interpolation/~Ng interpose/VGdS interposition/Ng interpret/~VGdSrvB interpretation/~NwgSr interpretative/J interpreted/~VJU interpreter/~NgS interprocess/J interprovincial/J interracial/~J interred/~JVtTE interregnum/~NSg interrelate/VdSGXn interrelation/Ng interrelationship/JNgS interring/V6NE interrogate/VdSGnvX interrogation/~Ng interrogative/JYNgS interrogator/NSg interrogatory/NSgJ interrupt/~VGd>SNgZ interrupter/Ng interruption/~NwgS interscholastic/~J intersect/~VGdS intersection/~NwSg intersectional/J intersectionality/N intersession/JNSg intersex/~JNV intersperse/VGdSn interspersion/Ng interstate/~JNgS interstellar/~J interstice/NgS interstitial/~JN intertwine/VGdS interurban/~JN interval/~NSg intervene/~VGdS intervention/~NSg interventionism/Nmg interventionist/JNSg interview/~NgSVGd>Z interviewee/NgS interviewer/~Ng intervocalic/JQ interwar/~J interweave/VGS interwove/V interwoven/~V intestacy/Ng intestate/~JN intestinal/~J intestine/~NgSJ intifada/~N intimacy/~NmSg intimate/~JYNgSVGdnX intimation/Ng intimidate/~VGdSn intimidating/~VJYU intimidation/~Ng intimidator/NgS intonation/~NSg intoxicant/NSgJ intoxicate/VdSGJn intoxication/~Ng # intra # prefixes that are not also words in their own right don't belong in the dictionary intracranial/~J intramural/~JN intramuscular/J intranet/NgS intransigence/Nmg intransigent/JYNgS intrastate/JN intrauterine/~J intravenous/~JYNgS intrepid/~JY intrepidity/Ng intricacy/NSg intricate/~JYV intrigue/~NwSgVd>GZ intriguer/Ng intriguing/~JYV6N intrinsic/~JNgS intrinsically/~Ry intro/~NSgV( introduce/~VGdSr introduction/~N0gr introductions/~N9 introductory/~J introit/NSg introspect/VGdSv introspection/~Nmg introspective/JY introversion/Ng introvert/NgSJVd intrude/Vd>SGZ intruder/~Ng intrusion/~NSg intrusive/~JYpN intrusiveness/Nmg intuit/VSdGv intuition/~NS intuitive/~JYpN intuitiveness/Nmg inundate/VdSGXn inundation/Ng inure/VdSG invade/~Vd>SGZr invader/~Ng invalid/~JYNgSVGd invalidism/Ng invaluable/~J invaluably/Ry invariant/~JNS invasion/~NgS invasive/~JN invective/NgJ inveigh/VGd inveighs/V inveigle/VGd>SZ inveigler/Ng invent/~VSGdrv invention/~NwgSr inventive/~JYp inventiveness/Ng inventor/~NgS inventory/~NSgVdG inverse/~JYNSgV invert/~Vd>GSNgJZ inverter/Ng invest/~VdGSNrLB investigate/~VdSGnvX investigation/~NwgS investigator/~NSg investigatory/J investing/~g investiture/~NgS investment/~NwgrE investor/~NSg inveteracy/Ng inveterate/JV invidious/JYp invidiousness/Ng invigilate/VGdSn invigilator/NS invigorate/VdSGr invigorating/VJY invigoration/Ng invincibility/Ng invincibly/Ry inviolability/Ng inviolably/Ry inviolate/J invitation/~NSg invitational/~JNSg invite/~VbdGSNg invited/~VtTJNU invitee/NSg inviting/~JYV6N invocable/J invoke/~VdSG involuntariness/Nmg involuntary/~Jp involution/~Ng involve/~VdSGL involved/~JVtTU involvement/~NwSg inward/~JYNS ioctl iodide/~NwSg iodine/~NgV iodise/VdSG!_₹ iodize/VdSG ion/~NSgU ionic/~J ionisation/NgU!_₹ ionise/VdSGU!_₹ ionization/~NgU ionize/VdSGU ionizer/NgS ionosphere/NgS ionospheric/J iota/~NgS ipecac/NSg ipso facto/RJ irascibility/Ng irascible/J irascibly/Ry irate/~JYp irateness/Ng ire/~NgV ireful/J irenic/J irides/N iridescence/Ng iridescent/JY iridium/~Ng iris/~NgSV irk/VSGd irksome/JYp irksomeness/Ng iron/~NwgSJVdG ironclad/~JNgS ironic/~J ironical/JY ironing/VNg ironmonger/NS ironmongery/N ironstone/Ng ironware/Nmg ironwood/NgS ironwork/Ng irony/~NSgJ irradiate/JVdSGn irradiation/~NwSg irrational/~JYNSg irrationality/Ng irreclaimable/J irreconcilability/Ng irreconcilable/JN irreconcilably/Ry irrecoverable/J irrecoverably/Ry irredeemable/JN irredeemably/Ry irreducible/~JN irreducibly/Ry irrefutable/J irrefutably/Ry irregular/~JYNgS irregularity/~NSg irrelevance/NgS irrelevancy/NgS irrelevant/~JY irreligion/N irreligious/J irremediable/J irremediably/Ry irremovable/J irreparable/J irreparably/Ry irreplaceable/~J irrepressible/J irrepressibly/Ry irreproachable/J irreproachably/Ry irresistible/~J irresistibly/Ry irresolute/JYpnv irresoluteness/Ng irresolution/Ng irrespective/~J irresponsibility/Ng irresponsible/~JN irresponsibly/Ry irretrievable/J irretrievably/Ry irreverence/Ng irreverent/~JY irreversible/~J irreversibly/Ry irrevocable/J irrevocably/Ry irrigable/J irrigate/VdSGn irrigation/~Ng irritability/Ng irritable/J irritably/Ry irritant/JNSg irritate/VdSGXn irritating/JYV irritation/~Ng irrupt/VdGSv irruption/NSg is/~Vlh # 3rd person singular present of 'be' ischaemia/N!_₹ ischaemic/J!_₹ ischemia/~N ischemic/~J isinglass/Ng isl/~N island/~NSgV>Z islander/~Ng isle/~NgS islet/~NSg ism/~Nge isms/N isn't/~VAhN isobar/NgS isobaric/J isochronous/J isolate/~VdGSNgJn isolation/~Nmg isolationism/Nmg isolationist/JNSg isolator/NgS isoline/NgS isomer/~NgS isomeric/J isomerism/Ng isometric/~JNSQ isometrics/Ng isomorphic/~J isomorphism/~N isopropyl/NgS isosceles/~J isotherm/NSg isothermal/J isotope/~NSgV isotopic/~J isotropic/~J isotropy/Ng issuance/~NgS issue/~NSgVdGr issuer/~NgS isthmian/~JN isthmus/~NgS it/~Ia3so* # I~pronoun a~personal 3~person .~singular s~subject o~object *~3pers-sing-subj it'd/ it'll/ it's/~ ital/~NJ italic/~JNSg italicisation/Ng!_₹ italicise/VGdS!_₹ italicization/Ng italicize/VGdS italics/~Ng itch/~NgSVdG itchiness/Nmg itchy/J>^p item/~NgSV itemisation/Nmg!_₹ itemise/VGdS!_₹ itemization/Nmg itemize/VGdS iterable/JNgS iterate/VGdSNJrXnv iteration/~NwSgr iteratively/Ry iterator/NS itinerant/~JNSg itinerary/~NSgJ its/~ID5* itself/~Ia3F. # I~pronoun a~personal 3~person .~singular F~reflexive iv/~U ivory/~NwSgJ ivy/~NSgd ix/~ j/~NW jab/NSgV jabbed/VtTJ jabber/Vd>GSNgZ jabberer/Ng jabbing/V6N jabot/NSg jacaranda/NgS jack/~NgSVdGJ jackal/~NSgV jackass/NgSV jackboot/NSgVd jackdaw/NgS jacket/~NSgVd jackhammer/NgSV jackknife/NgSVGd jackknives/9 jackpot/~NOSgV jackrabbit/NgSV jackstraw/NgSJ jacquard/Ng jade/~NwgSJVGd jaded/JYpVtT jadedness/Ng jadeite/Ng jag/~NSgV jagged/~J^Y>pVtT jaggedness/Ng jaggies/N9 jaguar/~NSg jail/~NwgSVd>GZ jailbird/NSg jailbreak/NSgVG jailbroken/VJ jailer/Ng jailhouse/~NS jalapeno/NgS jalopy/NSg jalousie/NgS jam/~NwSgV jamb/NgSV jambalaya/Nmg jamboree/~NgS jammed/~JVtT jammer/NgS jamming/~V6NJ jammy/J>^N jangle/Vd>GSNgZ jangler/Ng janitor/~NSg janitorial/J jank/Nmg jankiness/Nmg janky/J^> japan/~NSgV japanned/VtT japanning/NV6 jape/NgSVGd jar/~NSgV jardiniere/NSg jarful/NgS jargon/~NmgV jarred/VtTJ jarring/JYNV6 jasmine/~NwSg jasper/~NgV jato/NgS jaundice/NmSgVdG jaunt/NSgVGd jauntily/Ry jauntiness/Ng jaunty/J>^pN java/~Ng javelin/~NSgV jaw/~NSgVGdJ jaw-droppingly/J jawbone/NSgVdG jawbreaker/NgS jawline/NS jay/~NSg jaybird/NSg jaywalk/Vd>SGZ jaywalker/Ng jaywalking/NmgV jazz/~NgSVdG jazzy/~J^> jct/~N jealous/~JYV jealousy/~NSg jean/~NgS jeans/~Ng jeep/~JNgSV jeer/NgSVdG jeering/VNgY jeez/ jejuna/N jejune/J jejunum/Ng jell/NSVdG jello/NS jelly/~NSgVGdJ jellybean/NgSJ jellyfish/N09gS # singular and plural, also has a plural in -s jellylike/J jellyroll/NSg jemmy/NSVGdJ jennet/NgS jenny/~NSgV jeopardise/VGdS!_₹ jeopardize/VGdS jeopardy/~NgV jeremiad/NgS jerk/~NgSVdG jerkily/Ry jerkin/NgS jerkiness/Ng jerkwater/NJ jerky/J^>pNgV jeroboam/NS jerrybuilt/J jerrycan/NS jersey/~NgS jest/NgSVbd>GZ jester/~Ng jesting/NJYV6 jet/~NSgVJ jetliner/NSg jetport/NgS jetsam/Nmg jetted/VtT jetting/V6N jettison/NgSVdG jetty/~NSgVJ jewel/~NSgVGd>Z jeweler/Ng jewelled/JVtT!@_₹ jeweller/NgS!@_₹ jewellery/Nmg!@_₹ jewelling/V6!@_₹ jewelries/NV!@_₹ jewelry/~NmSgV jg/~ jib/~NSgVGd jibbed/VtT jibbing/NV6 jibe/NgSV jiff/NgSV jiffy/NSg jig/~NSVr jig's jigged/VtTr jigger/NSVdGr jigger's jigging/V6Nr jiggle/NSgVdG jiggly/J jigsaw/~NSgVdG jihad/~NSgV jihadi/NgS jihadist/NSgJ jilt/NgSVdG jimmy/~NSgVdG jimsonweed/Ng jingle/~NSgVdG jingly/J jingoism/Ng jingoist/NSgJ jingoistic/J jink/NSVdG jinn/N jinni/Ng jinrikisha/NSg jinx/NgSVdG jit/VS jitney/~NSg jitted/VtT jitter/NgSVdG jitterbug/NgSV jitterbugged/VtT jitterbugger/Ng jitterbugging/V6 jitters/NgV jittery/J>^ jitting/V6 jive/~VGdSNg job/~NSgV jobbed/VtT jobber/NSg jobbing/V6NJ jobholder/NgS jobless/Jp joblessness/Ng jobseeker/NgS jobshare/NSV jobsworth/N jobsworths/N jock/~NgSV jockey/~NSgVGd jockstrap/NgS jocose/JYp jocoseness/Ng jocosity/Ng jocular/JY jocularity/Ng jocund/JY jocundity/Ng jodhpurs/Ng joey/~NS jog/NSgV jogged/VtT jogger/VSNg jogging/~NmgV6 joggle/VdGSNg john/~NgS johnny/~NSg johnnycake/NgS join/~VdGSNrW join's joiner/NgSW joinery/Ng joint/~JNSVGdE joint's jointly/~RyW joist/NSgV jojoba/~N joke/~NgSVGd>Z joker/~Ng jokey/J jokier/Jc jokiest/Ju joking/~VNY jollification/NSg jollily/Ry jolliness/Nmg jollity/Ng jolly/~J^>pNSgVGd jolt/Vd>GSNgZ jolter/Ng jones/NSVdG jonquil/NSg josh/~NgSVd>GZ josher/Ng jostle/VGdSNg jot/NSgV jotted/VtT jotter/NgS jotting/V6SNwg joule/NSg jounce/VGdSNg jouncy/J journal/~NgSVJ journalese/Nmg journaling/Sg journalism/~Nmg journalist/~NSg journalistic/~J journey/~NgSVGd>Z journeyer/Ng journeyman/~N0g journeymen/N9 journo/NS joust/NSgVGd>Z jouster/Ng jousting/NgV jovial/JY joviality/Ng jowl/NgSV jowly/J^> joy/~Nw☁SgVGd joyful/~JYp joyfuller/Jc joyfullest/Ju joyfulness/Ng joyless/JYp joylessness/Ng joyous/~JYp joyousness/Ng joypad/NgS joyridden/V joyride/NSgV>GZ joyrider/Ng joyriding/VNg joyrode/V joystick/~NSgV jr/~J jubilant/JY jubilate/VGdS jubilation/Ng jubilee/~NSg judder/NSVGd judge/~NSVdGr judge's judgement/NSg!_₹ judgemental/J!_₹ judgeship/Ng judgment/~NSg judgmental/JY judgmentally/Ry!_₹ judicatory/JNSg judicature/~Ng judicial/~JYN judiciary/~NSgJ judicious/JYpi judiciousness/Nmgi judo/~Ng jug/~NSgV jugful/NgS jugged/JVtT juggernaut/NSg jugging/V6N juggle/VGd>SNgZ juggler/Ng jugglery/Ng jugular/JNSg juice/~NwSgVd>GJZ juicer/Ng juicily/Ry juiciness/Ng juicy/~J^>p jujitsu/NgV jujube/NgS jukebox/~NgSV julep/NSg julienne/NV jumble/VGdSNg jumbo/~JNSg jump/~Vd>GNgJZ jumper/~NgV jumpily/Ry jumpiness/Ng jumps/~V jumpsuit/NgS jumpy/J^>p jun/~N junco/~NSg junction/~NSgVWi juncture/NgSW jungle/~NgSJ junior/~JNgSV juniper/~NSg junk/~NwgSVd>GZ junker/Ng junket/NgSVdG junketeer/NgSV junkie/~NgS^> junky/J junkyard/~NgS junta/~NSg juridic/J juridical/JY jurisdiction/~NwSg jurisdictional/J jurisprudence/~Nmg jurisprudential/J jurist/~NgS juristic/J juror/NSg jury/~NSgVJi jury-rig/VS jury-rigged/VtT jury-rigging/V6 juryman/N0g jurymen/N9 jurywoman/N0g jurywomen/N9 just/~JY^>pR # removed `1` noun. archaic and interferes with linter heuristics justice/~NwgSi justifiable/~JU justifiably/RyU justification/~NwSg justified/~JVU justify/~VGdSXn justifyingly/Ry justness/Nmg jut/VSNg jute/~Nmg jutted/VtT jutting/V6N juvenile/~JNSg juxtapose/VdSG juxtaposition/~NSgV k/NSiW kHz/ kW/ kWh/ kabbalah/~N kaboom/N kabuki/~Ng kaddish/~NgS kaffeeklatch/NgS kaffeeklatsch/NgS kaftan/NgS!_₹ kahuna/NS kaiser/~NgS kale/Ng kaleidoscope/NgSV kaleidoscopic/JQ kamikaze/~NgSVJ kana/~NV kangaroo/~NgSVJ kanji/~N09S # singular and plural, also has a plural in -s kaolin/Nwg kapok/Ng kappa/~NSg kaput/J karakul/Ng karaoke/~NgSV karat/NSg karate/~NgV karma/~Ng karmic/J kart/~NgSV katakana/~N katydid/NSg kayak/NSgVdG kayaker/NgS kayaking/~NgV kayo/NgSVdG kazoo/NSgV kc/~N kebab/NSgV kedgeree/N keel/~NgSVdG keelhaul/VdGS keen/~JY^>pVdGSNg keenness/Ng keep/~V>GSNgZ keeper/~Ng keeping/~NgV6 keepsake/NgS kefir/Nmg keg/NSgV kegel/NgS kelp/NgV kelvin/~NSg ken/~VSNg kendo/Nmg # martial art kenned/VtT kennel/~NSgVGd kennelled/VtT!@_₹ kennelling/V6!@_₹ kenning/NV6 keno/Ng kepi/NgS kept/~VtT keratin/Ng keratitis/Nmg kerb/NgSVdG!_₹ kerbside/N kerchief/NSgV kerfuffle/NSV kernel/~NSgV kerosene/~Ng kestrel/~NgS ketamine/Ng ketch/NgSV ketchup/NgV keto/NJ ketogenic/J ketone/~NS kettle/~NSgV kettledrum/NSg key/~NSgJVGd key binding/NgS keyboard/~NSgVGd>Z keyboarder/Ng keyboardist/~NSg keycap/NSg keychain/NgS keyframe/NgS keygen/NgS keyhole/~NgSV keymap/NSg keynote/~NgSVGd>Z keynoter/Ng keypad/NSg keypoint/NgS keypress/NSg keypunch/NgSVGd>Z keypuncher/Ng keyring/NgS keystone/~NgSV keystroke/NSgV keyway/NSg keyword/~NgSV kg/~ khaki/~NSgJ khan/~NgS kibble/VdGSNg kibbutz/~N0gS kibbutzim/N9 kibitz/VGd>SZ kibitzer/Ng kibosh/NgV kick/~Vd>GSNgZ kick start/VSdG kick-starter/NgS kickback/~NSg kickball/Ng kickbox/VGdS kickboxer/NgS kicker/~Ng kickoff/~NgS kickstand/NgS kicky/J>^ kid/~NSgV kidded/VtT kidder/NSg kiddie/~NSg kidding/V6N kiddish/JN kiddo/NSg kidnap/~VSN kidnapped/~VtTJ kidnapper/NgS kidnapping/~V6SNg kidney/~NSg kidskin/Ng kielbasa/NgS kielbasi/N kike/NSV kill/~Vd>GSNgzZB killdeer/NSg killer/~NgJ killing/~JNgV6 killjoy/NSg kiln/~NgSVdG kilo/~NgS( kilobit/NSg kilobyte/NSg kilocoulomb/S kilocycle/NSg kilogram/~NSg kilohertz/Ng kilojoule/NS kiloliter/NgS< kilolitre/NgS!@_₹ kilometer/~NgS< kilometre/NgS!@_₹ kilonewton/NS kilopascal/NS kiloton/NSg kilovolt/NS kilowatt/NSg kilt/Vd>SNg kilter/Ng kimchi/Nmg kimono/~NgS kin/~NgJV kinase/~N kind/~N0J>Y^pU kind's kinda/~RN kindergarten/~NgS kindergartener/Ng!_₹ kindergartner/NSg kindhearted/JYp kindheartedness/Nmg kindle/~VGdSNJr kindliness/Nmg kindling/NmgJV kindly/~J>^RyU kindness/~N0wgU kindnesses/N9 kindred/~NgJ kinds/~N9 kine/NS kinematic/JS kinematics/Nmg kinetic/~JS kinetically/Ry kinetics/~Ng kinfolk/NSg kinfolks/Ng king/~NgSVY kingdom/~NSg kingfisher/~NSg kingly/J>^ kingmaker/NS kingpin/~NSg kingship/~Ng kink/VdGSNg kinkily/Ry kinkiness/Ng kinky/J^>p kinsfolk/Ng kinship/~Ng kinsman/~Ng kinsmen/9 kinswoman/Ng kinswomen/9 kiosk/~NSg kip/~NSg09V # in the currency sense, singular and plural, also has a plural in -s kipped/VtT kipper/NgSVdGJ kipping/V6 kirsch/NgS kismet/Ng kiss/~Vd>GSNgBZ kisser/Ng kissoff/NSg kissogram/NS kit/~NSgVGd kitchen/~NSgV kitchenette/NgS kitchenware/Nmg kite/~NgSV kith/Ng kitsch/NgJ kitschy/J kitted/VtT kitten/~NgSV kittenish/J kitting/NV6 kitty/~NSg kiwi/~NgS kiwifruit/NwgS kl/~ klaxon/NSV kleptocracy/NgS kleptocratic/J kleptomania/Ng kleptomaniac/NSg kludge/NSVGd kludgy/J kluge/~NSVd klutz/NgS klutziness/Ng klutzy/J^>p km/~ kn/~ knack/~NSgV>Z knacker/NVGd knapsack/NgSV knave/NSg knavery/Ng knavish/JY knead/VGd>SNZ kneader/Ng knee/~NgSVd kneecap/NSgV kneecapped/VtT kneecapping/NV6 kneeing/V6N kneel/VSG knell/VGdSNg knelt/VtT knew/~Vt knicker/NS knickerbockers/Ng knickers/Ng knickknack/NgS knife/~NSgVdG knight/~NgSVdGY knighthood/~NwgS knightliness/Nmg knish/NgS knit/~VSNg knitted/JVtT knitter/NSg knitting/~V6Ng knitwear/Nmg knives/~N9Vh knob/~NgSV knobbly/J knobby/J^> knock/~NSgVGd>Z knock-on effect/NgS knock out/V/ knockabout/JN knockdown/NSgVJ knocker/Ng knockoff/NSg knockout/~NSgJ knockwurst/NSg knoll/~NSgV knot/~NgSV knothole/NSg knotted/JVtT knotting/V6N knotty/J^> know/~VbSB knowing/~JYPV6SNU knowledge/~Nmg knowledgeable/~JN knowledgeably/Ry known/~JVT # removed `N`, only a noun in the `unknown knows` sense knuckle/NSgVdG knuckleduster/NS knucklehead/NgS knurl/NSgVGd koala/NSg koan/NS kohl/~NV kohlrabi/Ng kohlrabies/N kola/NgS kook/NgS kookaburra/NSg kookiness/Nmg kooky/J^>pN kopeck/NgS korma/Nmg kosher/~JVdSG kowtow/VGdSNg kph/N kraal/NSgV kraut/NSgV!_₹ krill/Nmg krona/Ng krone/Ng> kronor/N kronur/N krypton/~Nmg kryptonite/Nmg kt/~N kuchen/NSg kudos/NgV kudzu/NwSg kumquat/NgS kung fu/Ng kvetch/VGd>SNgZ kvetcher/Ng kw/~ l/~NSd^GXz la/NgJ lab/~NSg label/~NSVdG>r label's labeled/~JVUr< labelled/JVtTUr!@_₹ labelless/J labelling/V6Nr!@_₹ labia/N9 labial/~JNSg labile/J lability/Ng labium/N0g labor/~NwSgVd>GZ< labor-intensive/J laboratory/~NSg laborer/~Ng< laborious/JYp laboriousness/Nmg laborsaving/J< labour/NwSgVGd>Z!@_₹ labour-intensive/J!@_₹ labourer/Ng!@_₹ laboursaving/J!@_₹ laburnum/NgS labyrinth/~NgV labyrinthine/J labyrinths/NV lac/~Ng lace/~NwSVGdU lace's lacerate/VdSGJnX laceration/NwgS lacewing/NSg lacework/Nmg lachrymal/JN lachrymose/J lack/~NgSVdG lackadaisical/JY lackey/NSgV lackluster/~JN lacklustre/JN!@_₹ laconic/JQ lacquer/~NwgSVGd lacrosse/~Nmg lactate/~VGdSNn lactation/~Nmg lacteal/JN lactic/~J lactose/~Nmg lacuna/N0g lacunae/N9 lacy/~J>^ lad/~NSgGdnz ladder/~NSgVGd laddie/NSg laddish/Jp lade/VSN laden/~JVU lading/NgV ladle/NSgVdG lady/~NSgV ladybird/NSg ladybug/NgS ladyfinger/NgS ladylike/JU ladylove/NgS ladyship/NgS laetrile/Ng lag/~J>NSgVZ lager/~NwgSV laggard/JYNgS lagged/~VtT lagging/JNgV6 laggy/J lagniappe/NSg lagoon/~NSg laid/~VtTJir laid-back/J lain/~VT lair/~NgSV laird/~NSgV laity/~Ng lake/~NgSV lakefront/JNS lakeside/~NJ lakh/N0g₹ lakhs/N9₹ lam/~VSNg lama/~NgS lamasery/NSg lamb/~NwgSVdG lambada/NgS lambaste/VGdS lambda/~NSg lambency/Ng lambent/JY lambkin/NSg lambskin/NwSg lambswool/Nmg lame/~JY^>pVGdSNgZ lamebrain/NgSd lameness/Nmg lament/~NSgVdGB lamentably/Ry lamentation/NgS lamina/~N0g laminae/N9 laminar/J laminate/VGdSNgJn lamination/Ng lammed/VtT lamming/V6N lamp/~NgSV lampblack/NmgV lamplight/Ng>Z lamplighter/Ng lampoon/~NSgVGd lamppost/NSg lamprey/NgS lampshade/NSgV lanai/NSg lance/~NSgVd>GZ lancer/~Ng lancet/~NSgV land/~NwgSVdGz landau/~NSg landbased/J lander/NgS landfall/~NgS landfill/~VSNg landholder/NSg landholding/NgS landing/~NgV landlady/~NSg landless/Jg landline/NgS landlocked/~J landlord/~NgS landlordism/NgS landlubber/NgS landmark/~NgSV landmass/~NgS landmine/NSV landowner/~NgS landownership/Nmg landowning/JNSg landscape/~NgSVGd>Z landscaper/Ng landslid/V landslide/~NgSVG landslip/NS landsman/N0g landsmen/N9 landward/JNS lane/~NgS laneway/NgS language/~NwgS languid/JYpN languidness/Nmg languish/VdSG languor/NSgV languorous/JY lank/JY^>pV lankiness/Nmg lankness/Nmg lanky/J>^p lanolin/NgV lantern/~NgSVJ lanthanum/Nmg lanyard/NgS lap/~NSgVJ laparoscopic/J laparoscopy/N laparotomy/N lapboard/NSg lapdog/NSg lapel/~NSg lapidary/NSgJ lapin/NSg lapped/VtTJ lappet/NSgV lapping/V6N lapse/~NgSVGdrK laptop/~NSgJ lapwing/~NgS larboard/NSg larcenist/NSg larcenous/J larceny/~NSg larch/NgS lard/~NgSVd>GZ larder/~Ng lardy/J>^N large/~J>Y^pNSg large-scale/J largehearted/J largeness/Nmg largess/Ng largish/J largo/~NSgJ lariat/NSgV lark/~NgSVdG larkspur/NSg larva/~Ng larvae/~9 larval/~J laryngeal/~JN larynges/N laryngitis/Ng larynx/~Ng lasagna/N0gS lasagne/N9gS!@_₹ lascivious/JYp lasciviousness/Ng lase/VGd>SZ laser/~NgV lash/~NgSVdGJz lashing/NgV6 lass/~NgS lassie/NSg lassitude/Ng lasso/NSgVdG last/~JYVdGSNg last-ditch/J last minute/NJ last-minute/J lasting/~JYVN lat/~NS latch/VdGSNU latch's latchkey/NSgJ late/~JY^>pN latecomer/NgS latency/~Ng lateness/Ng latent/~JYNgS lateral/~JYNgSVdG latest/~JNg latex/~Ng lath/NgSVd>GZ lathe/~VNg lather/NmgVGd lathery/J laths/N latices/9 latish/J latitude/~NgS latitudinal/J latitudinarian/JNgS latrine/NgS lattè/NwSg latte/NwSg latter/~JYg lattice/~NgSVd latticework/NwSg laud/NgSVdGB laudably/Ry laudanum/NgV laudatory/J laugh/~NgVdGB laughably/Ry laughing/~NgVY laughingstock/NSg laughs/~NV laughter/~Nmg launch/~VGdSNgr launcher/~NSg launchpad/NSg launder/NSVd>GZ launderer/NgS launderette/NSg laundress/NgSV laundromat/NgS laundry/~NwSg laundryman/N0g laundrymen/N9 laundrywoman/N0g laundrywomen/N9 laureate/~JNgSV laureateship/Ng laurel/~NSgV lav/NSGd lava/~Nmg lavage/NgV lavaliere/NSgJ lavatorial/J lavatory/NSgJ lave/VSNJ lavender/~NmSgJV lavish/~J^Y>pVGdSN lavishness/Ng law/~Nw☁SgV lawbreaker/NSg lawbreaking/JNg lawful/~JYpNU lawfulness/NmgU lawgiver/NgS lawless/~JYp lawlessness/Nmg lawmaker/NgS lawmaking/Ng lawman/N0g lawmen/N9 lawn/~NgSV lawnmower/NSg lawrencium/Nmg lawsuit/~NgS lawyer/~NSgVdG lax/~NJ^>Yp laxative/JNgS laxity/Nmg laxness/Nmg lay/~VbtGSNgJrie # "lay" is lemma with past "laid". Also simple past of "lie" lay out/V/ layabout/NS layaway/NgV layer/~NSgVbe layered/~JVtT layering/NgV6 layette/NgS layman/~N0g laymen/~N9 layoff/NSg layout/~NSg layover/NgS laypeople/N9 layperson/N0gS layup/NSg laywoman/N0g laywomen/N9 laze/VGdSNg lazily/Ry laziness/Nmg lazy/~J^>pVdGSN lazybones/Ng lb/~NS lbw/N lea/~NSg leach/~NSVdG lead/~NwgSVd>GJn lead off/NgV lead-up/NgS leaden/JV leader/~NgS leaderboard/NgS leaderless/J leadership/~NmSg leading/~VJNg leaf/~NgSVdG leafage/Ng leafless/J leaflet/~NgSVGd leafstalk/NgS leafy/J>^ league/~NSgVdG leak/~NgSVdG>J leakage/~NwgS leakiness/Ng leaky/~J>^p lean/~Vd>GSNgJ^pz leaning/~NgV leanness/Nmg leap/~Vd>GSNgJZ leaper/Ng leapfrog/NgSV leapfrogged/VtT leapfrogging/NmV6 leapt/V learn/~VGdSNrU learnability/N learnable/JN learnedly/Ry learner/~NgS learning's learnt/~V lease/~NSgVdGr leaseback/NSg leasehold/J>NgSZ leaseholder/Ng leaser/NSg leash/NSVdGU leash's least/~NgJDq leastwise/ leather/~NwgSJV leathercraft/Nwg leatherette/Ng leatherman/Ng leatherneck/NgS leathery/J leave/~Vd>GNgZz leaves/~V9h leave over/V leaven/NSgVGd leavened/VJU leavening/VNgJ leaver/Ng leavings/Ng lech/~NgSVd>GZ lecher/NgV lecherous/JYp lecherousness/Ng lechery/Ng lecithin/Ng lectern/NgS lecture/~NgSVGd>Z lecturer/~Ng lectureship/NSg led/~VtT ledge/~NSgV>Z ledger/~NgV lee/~NSgJ>Z leech/~NgSVdG leek/~NgS leer/~VdGNgJ leeriness/Ng leery/J>^p leeward/~JSg leeway/Ng left/~J^>NgSVtT left-hand/J left over/V left-wing/J leftism/Ng leftist/~NSgJ leftmost/J leftover/~JNSg leftward/JS lefty/~NSgJ leg/~NSgVJ legacy/~NSgJ legal/~JYNSg legalese/Nmg legalisation/Nmg!_₹ legalise/VGdS!_₹ legalism/NgS legalist/JNS legalistic/JQ legality/~NSg legalization/~Ng legalize/VGdS legalizer/NgS legate/~NgSVeXn legatee/NgS legation's/re legato/NSg legend/~NwSgV legendarily/Ry legendary/~JN legerdemain/Ng legged/~JNVtT legginess/Nmg legging/~NgSV6 leggy/J>^pN leghorn/NgS legibility/Nmg legible/J legibly/Ry legion/~JNSgV legionary/NSgJ legionnaire/NSg legislate/~VdSGnv legislation/~Ng legislative/~JYN legislator/~NgS legislature/~NSg legit/~NJ legitimacy/~Ng legitimate/~JYNSVdG legitimatise/VGdS!_₹ legitimatize/VGdS legitimisation/Ng!_₹ legitimise/VdSG!_₹ legitimization/Nge legitimize/~VdSGe legless/J legman/N0g♂ legmen/N9♂ legroom/NSg legume/~NgS leguminous/J legwarmer/NgS legwork/Nmg lei/~NSg leisure/~NmgdY leisureliness/Nmg leisurewear/Nmg leitmotif/NgS leitmotiv/NgS lemma/~N0S lemmata/N9 lemme/Gz # POS: contraction lemming/NgS lemon/~NwSgJV lemonade/~NwSg lemongrass/Nmg lemony/J lemur/~NSgª lend/~V>GSNZ lender/~NgS length/~NwgVnX lengthen/VGd lengthily/Ry lengthiness/Nmg lengths/~NV lengthwise/J lengthy/~J>^p lenience/Ng leniency/Ng lenient/~JYN lenition/Nmg # non-count lenitive/JN lens/~NgSV lensman/N0g♂ lensmen/N9♂ lent/~NV lentil/NgS lento/JN leonine/JN leopard/~NSgª leopardess/NgS leotard/NSg leper/NSgV leprechaun/NgSª leprosy/~Nmg leprous/J lepta/N lepton/~NgS lesbian/~JNSg♀V lesbianism/Nmg lesion/~NgSV less/~RPV>JCnX lessee/NgSV lessen/~VGdC lesser-known/J lesson/~VSNg lessor/NgS let/~VbtTSNgi let's # POS: contraction letdown/NSg lethal/~JYN lethality/Nmg lethargic/JQ lethargy/Nmg letter/~NgSVGd>Z letterbomb/NS letterbox/NSJV lettered/~JVtTU letterer/Ng letterhead/NgS lettering/~VNg letterpress/Ng letting/~V6SN lettuce/~NwgS letup/NSg leucine/N leucotomy/NS leukaemia/Nmg!_₹ leukemia/~Nmg leukemic/JNSg leukocyte/NgS levee/~NSgV level/~JY>pNSgVGdZ leveler/JcNg levelheaded/Jp levelheadedness/Ng levelled/VtT!@_₹ leveller/JcNSg!@_₹ levellest/Ju levelling/V6N!@_₹ levelness/Nmg lever/~NSgVGd leverage/~NmSVdGe leverage's leviathan/~NgSJ levier/Ng levitate/VdSGn levitation/Nmg levity/Nmg levy/~Vd>GSNgZ lewd/JY^>pNV lewdness/Nmg lex/~VdGSNg lexeme/NgS lexer/NSg lexical/~J lexicalise/Vd!_₹ lexicalize/Vd # lexicalized is an adjective lexicographer/NgS lexicographic/J lexicographical/J lexicography/Nmg lexicon/~NSgV lexis/~Nmg lg/~N liabilities/~N liability/~Ngr liable/~Jr liaise/VGdS liaison/~NgSV liar/~NgS lib/~NgV libation/NSg libber/NgS libel/~NSgVGd>Z libeler/Ng libelled/VtT!@_₹ libeller/NSg!@_₹ libelling/V6!@_₹ libellous/J!@_₹ libelous/J liberal/~JYpNgS liberalisation/NgS!_₹ liberalise/VGdS!_₹ liberalism/~Ng liberality/Ng liberalization/~NSg liberalize/VGdS liberalness/Ng liberate/~VdSGen liberation/~Nge liberator/~NgS libertarian/~NSgJ libertarianism/Nmg libertine/~NgSJ liberty/~NSg libidinal/J libidinous/J libido/NgS librarian/~NgS librarianship/N library/~NSg librettist/~NgS libretto/~NSg lice/~N9 licence/NgSV!@_₹ license/~NgSVGd licensed/~JVtTU licensee/~NgS licentiate/~NSg licentious/JYp licentiousness/Ng lichen/~NwgSV licit/JY lick/~VdGSNgz licking/~NgV6 licorice/NSg licorices/N!_₹ lid/~NSgV lidar/NgS lidded/VtTJ lidless/J lido/NgS lie/~VdSNg lied/~NgVtT> lief/J>^ liege/~NSgJ lien/~NgSV lieu/~Ng lieutenancy/Ng lieutenant/~NgSJ life/~NwgV>Z life cycle/NgS life science/NgS lifebelt/NS lifeblood/Nmg lifeboat/~NgSV lifebuoy/NgS lifeforms/N lifeguard/NSg lifeless/~JYp lifelessness/Ng lifelike/J lifeline/~NgS lifelong/~J lifer/Ng lifesaver/NSg lifesaving/JNg lifespan/~NS lifestyle/~NSg lifetime/~NgS lifework/NgS lift/~Vd>GSNgZ lifter/Ng liftoff/NSg ligament/~NgS ligate/VGdSn ligation/Ng ligature/NgSVGd light/~NwSVGdJ^er light gun/NgS light's/e lighted/~VtTJU lighten/~VSd>GZ lightener/Ng lighter/~NSgVJ lightface/Ngd lightheaded/J lighthearted/JYp lightheartedness/Ng lighthouse/~NgS lighting's lightly/~Ry lightness/~Nmg lightning/~NmJV lightproof/J lightsaber/NgS lightship/NgS lightweight/~NSgJV ligneous/J lignin/~N lignite/Nmg lii likability/Nmg likable/JpE likableness/Nmg like/~VGdSNgJCPE likeability/Ng!@_₹ likeable/Jp!@_₹ likeableness/Ng!@_₹ likelihood/~NmgU likelihoods/N likeliness/NmgU likely/~J>^pNU liken/VSGd likeness/~NgVU likenesses/N liker/NJ likewise/~R liking/~VNg lilac/~NwSgJ lilliputian/NJ lilo/~NS lilt/VdGSNg lily/~NSgJ limb/~NgSV limber/JVdGSNU limberness/Nmg limbless/J limbo/~NSgV lime/~NwgSVGdJ limeade/NwSg limelight/~NmgV limerick/~NSg limescale/Ng limestone/~Nmg limey/JNS liminal/J liminality/NgS limit/~NSJ>VGdeZ limit's limitation/~NwSge limitations/~N limited/~VJYNU limiter's limiting/~NSV limitless/JYp limitlessness/Ng limn/VdSG limo/NgS limousine/~NgS limp/~Vd>GSNgJY^p limpet/NgS limpid/JYp limpidity/Ng limpidness/Ng limpness/Ng limy/J>^ linage/Ng linchpin/NSgV linden/~JNgS line/~NgSVGd>Zz line break/NgS lineage/~NgS lineal/~JY lineament/NSg linear/~JYN linearity/Ng linearize/VdSG> linebacker/~NgS lined/~JVtTU linefeed/NgS lineman/~N0g linemen/N9 linen/~NwSgJ linens/Ng liner/~NgV linerless/J linesman/N0g linesmen/N9 lineup/~NgS ling/~Ng linger/VGd>SZz lingerer/Ng lingerie/~Ng lingering/~NVY lingo/N0g lingoes/N9 lingual/~JN linguine/Ng linguist/~NSg linguistic/~JSQ linguistics/~Nmg liniment/NSgV lining/~NgV link/~NgSVdGB linkage/~NgS linker/NgS linkman/N linkmen/9 linkup/NgS linnet/NgS lino/~N linoleum/Ng linseed/Ng lint/NVdGe lint's lintel/NgS linter/NSg lints/NV linty/J^> lion/~NgSJ lioness/NgS lionhearted/J lionisation/Ng!_₹ lionise/VGdS!_₹ lionization/Ng lionize/VGdS lip/~NSgV lip gloss/NwgS lipid/~NSg liposuction/NwSgV lipped/JVtT lippy/JN lipread/VG>S lipreader/Ng lipreading/NgV lipstick/~NwgSVdG liq/ liquefaction/~Nmg liquefy/VdSG liqueur/NwSgV liquid/~NwgSJ liquidate/VGdSJXn liquidation/~Nmg liquidator/NgS liquidise/VGd>SZ!_₹ liquidiser/Nwg!_₹ liquidity/~Nmg liquidize/VGd>SZ liquidizer/Nwg liquor/~NwgSVdG liquorice/Nmg!_₹ lira/~N0g lire/~N9 lisle/~Ng lisp/~NgSVd>GZ lisper/Ng lissom/J!_₹ lissome/J list/~NgSVdGnzX listed/~VJU listeme/NgS listen/~Vd>GNgBZ listener/~Ng lister/NgS listeria/N listing/~JVNg listless/JYp listlessness/Nmg lit/~VtT>JNZ litany/NSg litchi/NgS lite/~JNV liter/~Ng literacy/~Nmg literal/~JYpNSg literalness/Nmg literariness/Nmg literary/~Jp literate/~JYNSg literati/Ng literature/~Nmg lithe/JY^>pVN litheness/Nmg lithesome/J lithium/~Nmg lithograph/N0gVd>GZ lithographer/Ng lithographic/JQ lithographs/N9V lithography/~Nmg lithosphere/NSg litigant/NSgJ litigate/VdSG>nr litigation/~Nmg litigator/NgS litigious/Jp litigiousness/Nmg litmus/Nmg litotes/Ng litre/NSg!@_₹ litter/~NgSVd>GJZ litterateur/NgS litterbug/NgS litterer/Ng little/~J^>pINgDq littleness/Nmg littoral/~JNSg liturgical/~JY liturgist/NSg liturgy/~NwSg livability/Nmg livable/JU live/~VGdSJ^rB live action/Nmg liveable/J!_₹ livelihood/~NSg liveliness/Nmg livelong/JNS lively/~J>^pN liven/VSGd liveness/NwgS liver/~NwSJ liver's liveried/VJ liverish/J liverwort/NgS liverwurst/Nmg livery/~NSgVJe liveryman/Nge liverymen/9e livestock/~Nmg liveware/Nmg livid/JY living/~VSJNg lix/K lizard/~NgS ll/N llama/NSg llano/NSg lo/JN load/~NwSVGdrU load-bearing/J load's loadable/J loader/~NgS loading's loaf/~NgSVd>GZ loafer/NgV loam/NgVJ loamy/J^> loan/~NgSVd>GZ loaner/Ng loansharking/VNg loanword/NgS loath/J>VGdSzZ loathe/V loather/Ng loathing/~NmgV loathsome/JYp loathsomeness/Nmg loaves/N lob/VdSNg lobar/J lobbed/VtT lobber/NgS lobbing/V6 lobby/~NSgVGd lobbyist/~NgS lobe/~NgS lobotomise/VdSG!_₹ lobotomize/VdSG lobotomy/NSg lobster/~JNgSV lobstering/NgV lobsterman/Ng lobstermen/9g local/~JYNSg locale/~NgS localhost/NSg localisation/Nwg!_₹ localise/VdSG!_₹ localish/J localism/Nmg localist/JNgs locality/~NSg localization/~Nwg localize/VdSG> locate/~VGdSErn location/~NwSgE location's/r locative/NSgJ locator/~NgS locavore/NSg loci/~N lock/~NgSVd>GBZ lock down/V/ lock picking/Nmg lock screen/NgS lockdown/~NwgS locker/~Ng locket/NgS lockfile/NgS lockjaw/Ng lockout/~NgS locksmith/~Ng locksmiths/N lockstep/Ng lockup/NgS loco/~JNSV locomotion/~Ng locomotive/~NgSJ locoweed/NSg locum/NS locus/~Ng locust/~NSgV locution/NwgS lode/NgS lodestar/NgS lodestone/NgS lodge/~NSgVd>GzZ lodger/~Ng lodging/~NwgV lodgings/~Ng loft/~NgSVdGJ loftily/Ry loftiness/Nmg lofty/~J>^p log/~NSgV log in/V/ log off/V/ log on/V/ log out/V/ loganberry/NwSg logarithm/~NSg logarithmic/~J logbook/NSg loge/NgS logfile/NgS logged/~VtT logger/~NSg loggerhead/NSg loggia/~NSg logging/~V6Ng logic/~JNmgV logical/~JY logicality/Ng logician/NgS login/NSgV logistic/~JNS logistical/~JY logistician/NgS logistics/~Ng logit/NgS logjam/NSgV logo/~NgS logoff/NSg logographic/J logon/NSgV logotype/NSg logout/NSg logrolling/NgV logy/J>^N loin/~NgS loincloth/N0g loincloths/N9 loiter/VGd>SNZ loiterer/Ng loitering/V6Ng lolcat/NSg loll/VdSG lollipop/NSg lollop/VGSd lolly/NSJ lollygag/VSN lollygagged/VtT lollygagging/V6 lone/~JY>Z loneliness/~Nmg lonely/~J^>p loner/~Ng lonesome/~JYpN lonesomeness/Ng long/~J^NSVdGK long-term/J long's longboat/NgS longbow/NgS longer/~JcN longer-term/J> longevity/~Ng longform/J longhair/~NgSJ longhand/Nmg longhorn/NgS longhouse/NS longing/~VSNgY longish/J longitude/~NgS longitudinal/~JYN longnose/J longshoreman/N0g longshoremen/N9 longsighted/J longstanding/~J longsword/NSg longtime/~J longueur/NSg longways/ loo/~NV loofah/N0gV loofahs/N9V look/~Vd>GSNgZ look up/V/ lookalike/NgS looker/NgS lookout/~NgS lookup/~NSV loom/~NgSVdG loon/~NgS loonie/Ng loony/J>^NSg loop/~NgSVdG loopback/NwgS loophole/~NgSV loopy/J>^ loos/~N>nX loose/~VdGSJ^NU loosely/~Ry loosen/~VGSdU looseness/Nmg loosey-goosey/J loot/~NgSVd>GZ looter/Ng looting/~NmgV lop/~VSN lope/~VGdSNg lopped/VtT lopping/NV6 lopsided/JYp lopsidedness/Nmg loquacious/JYp loquaciousness/Nmg loquacity/Nmg lord/~NgSVdGY lordliness/Nmg lordly/J^>p lordship/~NSg lore/~NmgV lorebook/NgS lorgnette/NSg loris/NgS lorn/JV lorry/~NSgV lose/~VbG>SZz loser/~NgS losing/~VJNmg loss/~NwgSV lossless/~J lossy/J>^ lost/~VtTJ lot/~NSgV lotion/NSgV lottery/~NSg lotto/~Ng lotus/~NgS louche/JNV loud/~J>Y^pN loudhailer/NSg loudmouth/N0gd loudmouths/N9 loudness/Ng loudspeaker/~NgS lough/~N0 loughs/N9 lounge/~VGd>SNgZ lounger/Ng lour/VdGSN louse/Nw0SVdGe louse's lousily/Ry lousiness/Nmg lousy/J^>p lout/NgSV loutish/JYp louver/NgSd< louvre/NgSd!@_₹ lovableness/Nmg lovably/Ry love/~NwgSVGd>ZB lovebird/NSgV lovechild/Ng loved/~VtTJU loveless/J loveliness/Nmg lovelorn/JNm lovely/~J>^pNSg lovemaking/Nmg lover/~Ng lovesick/J lovey/NS loving/~NJYV6 low/~J^Y>pNSgVGdRyZ low-budget/J low-cost/J low-end/J low fidelity/J low-income/J low-level/J low-maintenance/J low-profile/J low-quality/J lowball/JNSgVGd lowborn/J lowboy/NgS lowbrow/JNSg lowdown/NgJ lower/~JVGd lower-income/J lowercase/~NwgSJVdG lowermost/J lowish/J lowland/~NSg>Z lowlander/Ng lowlife/JNSg lowliness/Nmg lowly/~J^>p lowness/Nmg lox/NgV loyal/~J^YE loyaler/Jc loyalism/Nmg loyalist/~NSg loyalties/~N9 loyalty/~N0wgE lozenge/~NSgV ltd/~J luau/NgS lubber/NgSY lube/NwgSVGdJ lubricant/~NSg lubricate/VdSGn lubrication/~Ng lubricator/NgS lubricious/JY lubricity/Ng lucid/~JYpN lucidity/Nmg lucidness/Nmg luck/~NgSVdG luckily/~RyU luckiness/NmgU luckless/J lucky/~J^>pNU lucrative/~JYp lucrativeness/Nmg lucre/Ng lucubrate/VGdSn lucubration/Nwg ludicrous/~JYp ludicrousness/Nmg ludo/N luff/NSVdG lug/~NSgV luge/~NSV luggage/~Nmg lugged/VtTJ lugger/NgS lugging/V6N lughole/NS lugsail/NSg lugubrious/JYp lugubriousness/Ng lukewarm/~JYp lukewarmness/Ng lull/~NgSVdG lullaby/~NSgV lulu/~NS luma/Ng lumbago/NgV lumbar/~JN lumber/~NmgSVd>GZ lumberer/Ng lumbering/~NgJ lumberjack/NSgV lumberman/Ng lumbermen/9 lumberyard/NSg lumen/~N luminary/NSg luminescence/Nmg luminescent/J luminosity/~Nmg luminous/~JY lummox/NgS lump/~NgSVdGn lumpectomy/NSg lumpenproletariat/N lumpiness/Ng lumpish/J lumpy/J^>p lunacy/NSg lunar/~JN lunatic/~NSgJ lunch/~NwgSVGd lunchbox/NSg luncheon/~NSgV luncheonette/NSg lunchroom/NgS lunchtime/~NwgS lung/~NgSdG lunge/NSgV lungfish/N09gS # singular and plural, also has a plural in -s lungful/NS lunkhead/NgS lupin/NSg!_₹ lupine/~JNgS lupus/~Ng lurch/NgSVGd lure/~NwgSVGd lurgy/N lurid/JYp luridness/Ng lurk/Vd>GSNZ luscious/JYp lusciousness/Nmg lush/~JY^>pNgSV lushness/Nmg lust/~NmgSVdG luster/NmgV< lusterless/J< lustful/JY lustily/Ry lustiness/Nmg lustre/NmgV!@_₹ lustreless/J!@_₹ lustrous/JY lusty/J^>p lutanist/NSg lute/~NgSV lutenist/NSg lutetium/Nmg luthier/NSg lux/~NV luxuriance/Ng luxuriant/JY luxuriate/VdSGn luxuriation/Ng luxurious/~JYp luxuriousness/Ng luxury/~Nw☁SgJ lvi lvii lxi lxii lxiv lxix lxvi lxvii lyceum/~NgS lychgate/NS lye/NmgVG lying/~VNgJ lymph/~Nmg lymphatic/~JNSg lymphocyte/NSg lymphoid/J lymphoma/~NSg lynch/~VGd>SNzZ lyncher/Ng lynching/~NgV lynx/~NgS lyre/~NgSV lyrebird/NgS lyric/~JNSg lyrical/~JY lyricism/Nmg lyricist/~NSg lysosomal/J lysosomes/N m/JNSVKr mRNA/Nmg mTOR # mammalian target of rapamycin ma/~NSgH ma'am/NV mac/~NSgGd macOS/OgS macabre/~J macadam/NgV macadamia/NSg macadamise/VGdS!_₹ macadamize/VGdS macaque/NgS macaroni/NwgSJ macaroon/NgS macaw/NSg mace/~NgSV macerate/VdGSNn maceration/Ng mach/~g machete/NSgV machinate/VGdSnX machination/NgS machine/~NSgVdGB machinery/~Nmg machinist/NgS machismo/Nmg macho/~JNg mackerel/~NwSg mackinaw/NSg mackintosh/~NgS macrame/NgV macro/~JNSg( macroaggregate/Ng macrobiotic/JS macrobiotics/Nwg macrocosm/NSg macroeconomic/~JS macroeconomics/Ng macrology/NS macron/~NgS macrophages/N macroscopic/~J mad/~JYpVSg madam/~NSgV madame/~Ng madcap/JNgS madden/~VdGS maddening/JYV madder/NgSJcV maddest/Ju madding/JV made/~VtTrU # removed `N`, noun is dialectal made up/V made-up/J mademoiselle/N0gSV madhouse/~NSg madman/~N0g madmen/N9 madness/~Nmg madras/~NgS madrasa/~NSg madrasah/Ng madrasahs/N madrassa/NSg madrigal/NSg madwoman/Ng madwomen/9 maelstrom/NSg maestro/~NSg mafia/~NSg mafiosi/N mafioso/NgS mag/~NSgV magazine/~NSg mage/~NgS magenta/~NmgJ maggot/~NgSVJ maggoty/J magi/~Ng magic/~NwSgJV magical/~JY magician/~NSg magicked/VtT magicking/V6 magisterial/JY magistracy/Nmg magistrate/~NSg magma/~Nmg magnanimity/Nmg magnanimous/JY magnate/~NSg magnesia/~Nmg magnesium/~Nmg magnet/~NgS magnetic/~JQ magnetisable/J!_₹ magnetisation/NwSge!_₹ magnetise/VGdSe!_₹ magnetism/~Nmg magnetite/Nmg magnetizable/J magnetization/NwSge magnetize/VGdSe magneto/~NSg magnetohydrodynamic/J magnetohydrodynamics/Nmg magnetometer/NSg magnetopause/NSg magnetosheath/NSg magnetosphere/N magnetostriction/Nmg magnetostrictive/J magnification/~Nmg magnificence/Nmg magnificent/~JY magnifier/NgS magnify/VGd>SZXn magniloquence/Ng magniloquent/J magnitude/~NwSg magnolia/~NgSJ magnon/N magnum/~NgS magpie/~NgSV magus/Ng maharajah/N0g maharajahs/N9 maharani/NSg maharishi/NSg mahatma/~NSg mahjong/Ng mahogany/~NwSgJ mahout/NgSV maid/~NgSnX maiden/~NgJY maidenhair/Nmg maidenhead/~NSg maidenhood/Nmg maidservant/NSg mail/~NwgSVd>GzZ mailbag/NSg mailbomb/NSVGd mailbox/~NgS mailer/~Ng mailing/~NwgV maillot/NSg mailman/N0g mailmen/N9 mailshot/NSV maim/VdGSN main/~JYVSNg mainboard/NSg mainframe/~NSg mainland/~NgS mainline/~JVGdSNg mainmast/NgS mainsail/NgS mainspring/NgS mainstay/~NgS mainstream/~JNSgVdG maintain/~VGdSB maintainability/Nmg maintainable/JU maintained/~JVU maintainer/NgS maintenance/~Nmg maintop/NSg maisonette/NgS maize/~Nmg majestic/~JQ majesty/~NwSg majolica/Ng major/~JYNSgVGd majordomo/NgS majorette/NgS majoritarian/JNSg majoritarianism/Nm majority/~NSg make/~VGSNUr make believe/V make-believe/NgSV make file/NgS make's/r makeover/~NgS maker/~NSg makeshift/~NSgJ makeup/~NwgSV makeweight/NS making/~NgSV6 makings/Ng malachite/NgJ maladjusted/VJ maladjustment/Ng maladministration/N maladroit/JYpN maladroitness/Ng malady/NSg malaise/Ng malamute/NgS malapropism/NSg malaria/~Nmg malarial/JN malarkey/Ng malathion/Ng malcontent/JNgSV male/~JpNgS malediction/NSg malefaction/Nmg malefactor/NSg malefic/JN maleficence/Ng maleficent/J maleness/Nmg malevolence/Ng malevolent/~JY malfeasance/Ng malfeasant/NgSJ malformation/NwSg malformed/J malfunction/~NwgSVdG malice/~NgV malicious/~JYp maliciousness/Nmg malign/JVdSG malignancy/NSg malignant/~JYN malignity/Ng malinger/VGSd>Z malingerer/Ng mall/~NgSV mallard/~NSg malleability/Nmg malleable/~J mallet/~NgSV mallow/NgS malnourished/JV malnutrition/~Ng malocclusion/Ng malodorous/J malpractice/NSg malt/~NwgSVdG malted/JNgSVtT maltose/~Nmg maltreat/VGdSL maltreatment/Nmg malty/J^> malware/~Nmg mam/~NS mama/~NgS mamba/~NSg mambo/~NSgVGd mamma/Ng mammal/~NgS mammalian/~JNgS mammary/JN mammogram/NgS mammography/Nmg mammon/Og mammoth/~N9gJ mammoths/~N0 mammy/NSg man/~NOSJYVU # removed `8` pronoun, dialectal & complicates lint heuristics man child/Ng man-made/J man's/~NOJIVW manacle/NSgVdG manage/~VGd>SNZL manageability/Nmg manageable/~JU management/~NwgS manager/~NgS manageress/NS managerial/~J manana/Ngm manatee/~NSg mandala/~NSg mandamus/NgSV mandarin/~NgSJ mandate/~NSgVdG mandatory/~JN mandible/~NgS mandibular/~J mandolin/~NgSV mandrake/NwgS mandrel/NSgV mandrill/NgS mane/~NgSd manege/Ng maneuver/~NgSVdGBz maneuverability/Ng manful/JY manga/~NwSg manganese/~Nmg mange/Nmgd>Z manger/Ng mangetout/NS manginess/Ng mangle/VGd>SNgZ mango/~Nw0gV mangoes/N9V mangrove/~NgS mangy/J^>p manhandle/VGdS manhole/NSg manhood/~Nmg manhunt/~NSg mania/~NwSg maniac/~NgS maniacal/JY manic/~JNSgQ manicure/NgSVGd manicurist/NgS manifest/~JYNgSVdG manifestation/~NwSg manifesto/~NSgV manifold/~JNgSVGd manikin/NSg manila/~JNg manilla/NgJ!_₹ manioc/NgS manipulable/J manipulate/~VGdSXnv manipulation/~NwgS manipulative/~JYN manipulator/NgS mankind/~Ng manky/J manlike/J manliness/Ng manly/~J^>U manna/Nmg manned/~JVtTU mannequin/NSg manner/~NgSd mannerism/NSg mannerly/JRyU manning/~V6U mannish/JYp mannishness/Ng manoeuvrability/Ng!@_₹ manoeuvre/NSgVdGBz!@_₹ manometer/NSg manor/~NSg manorial/J manosphere/Ng manpower/~Ng manque/J mansard/JNgS manscape/NgSVdG manse/~VSNgXn manservant/Ng mansion/~Ng manslaughter/~Ng manta/~NSg mantel/NgSV mantelpiece/NSg mantelshelf/N mantelshelves/N mantes/N mantilla/NSg mantis/~NgS mantissa/NSg mantle/~NSVGdE mantle's mantra/~NgS manual/~NgSJY manufacturability/Ng manufacture/~NSgVd>GZrB manufacturer/~Ng manufacturing/~NgJVr manumission/NSg manumit/VS manumitted/VtT manumitting/V6 manure/~VGdSNwg manuscript/~JNgS many/~IJDqg map/~NSVr map's maple/~NwSg mapmaker/NSg mapped/~VtTr mapper/NgS mapping/~NSV6 mar/~VSN marabou/NgS marabout/NSg maraca/NgS maraschino/NgS marathon/~NSgV>Z marathoner/Ng maraud/VGd>SZ marauder/~Ng marble/~NgSVGdJ marbleise/VGdS!_₹ marbleize/VGdS marbling/VNg march/~NgSVGd>Z marcher/NgS marchioness/NgS mare/~NgS margarine/Nmg margarita/~NwgS marge/~Nmg # short for "margarine" margin/~NgSV marginal/~JYNS marginalia/Nmg marginalisation/N!_₹ marginalise/VGdS!_₹ marginality/Ng marginalization/Ng marginalize/VGdS maria/~Ng mariachi/JNgS marigold/NgSJ marijuana/~Ng marimba/NSg marina/~NgS marinade/NSgVdG marinara/JNg marinate/VdSGn marination/Ng marine/~J>NgSVZ mariner/~Ng marionette/NgSV marital/~JY maritime/~J marjoram/Ng mark/~NgSVdGr marked/~JpVtTU # "Markedness" is a technical term in linguistics, so adding it here markedly/~Ry marker/~NgSV market/~NgSVd>GZB marketability/Nmg marketable/JU marketeer/NSg marketer/NgS marketing/~V6Nmg marketplace/~NSg marking/~NSgV6 markka/Ng markkaa/N marksman/~N0g marksmanship/~Nmg marksmen/N9 markup/~NwgS marl/NgV marlin/~NgS marlinespike/NSg marmalade/~NmgV marmoreal/J marmoset/NSg marmot/NgS maroon/~NmgSJVdG marque/~NgS marquee/~NSgJV marquess/~NgS marquetry/Nmg marquis/~NgS marquise/Ng marquisette/Ng marred/~JVtTU marriage/~NwSgr marriageability/Nmg marriageable/JN married/~JVSNg marring/V6N marrow/~NwgS marry/~VGdSr marsh/~NgS marshal/~NSgVdG marshalled/VtT!@_₹ marshalling/V6N!@_₹ marshland/~NSg marshmallow/~NSgV marshy/~J>^ marsupial/NgSJ mart/~NgSVnX marten/~Ng martensite/~N martial/~JYN martian/~JNS martin/~NgS martinet/NgS martingale/NgSV martini/~NSg martyr/~NgSVdG martyrdom/~Ng marvel/~NgSVdG marvelled/VtT!@_₹ marvelling/V6N!@_₹ marvellous/JY!@_₹ marvelous/~JY marzipan/NmgV masc/~JN mascara/NwgSVGd mascot/~NgSV masculine/~JNSg masculinity/~Ng masculinization/Ng masculinize/VdSG maser/NSg mash/~NmgSVd>GZ masher/NgS mashup/NgS mask/~NSVdGU mask's maskable/J masker/VSNg masochism/Ng masochist/NSg masochistic/JQ mason/~NSgV masonic/~J masonry/~Nmg masque/~NgSV masquerade/~NSgVd>GZ masquerader/Ng mass/~NwgSVdGJv massacre/~NgSVGd massage/~NSgVdG massager/NgS masseur/NSg masseuse/NgS massif/~NgS massive/~JYpN massiveness/Nmg mast/~NgSVd mastectomy/NSg master/~NSJVdGr master's/N masterclass/NS masterful/~JY masterly/J # removed archaic adverb POS mastermind/~NSgVGd masterpiece/~NgS masterstroke/NSg masterwork/NgS mastery/~Nmg masthead/~NgSV mastic/Nmg masticate/VGdSn mastication/Nmg mastiff/NSg mastitis/Nmg mastodon/NSg mastoid/JNSg masturbate/VGdSn masturbation/Nmg masturbatory/J mat/~NSgVGd>JZ matador/~NSg match/~NgSVr matcha/Nmg matchbook/NSg matchbox/NgS matched/~VNU matcher/NgS matching/~VJN matchless/J matchlock/NSg matchmaker/NgS matchmaking/NgV matchstick/NgS matchup/NgS matchwood/Ng mate/~NgSV material/~JYNwSgV materialisation/Ng!_₹ materialise/VdSG!_₹ materialism/~Ng materialist/~NSgJ materialistic/JQ materialization/Ng materialize/~VdSG materiel/~Ng maternal/~JYN maternity/~Ng matey/JNS mathematical/~JY mathematician/~NSg mathematics/~N0mg mathematisation/Ng!_₹ mathematise/VdSG!_₹ mathematization/Ng mathematize/VSdG maths/NV!_₹ matinee/NSgV mating/~JNgV6 matins/Ng matres/N!@_₹ matriarch/N0g matriarchal/J matriarchs/N9 matriarchy/NSg matrices/~N9 matricidal/J matricide/NwgS matriculate/VdGSNn matriculation/~Nmg matrimonial/~JN matrimony/Nmg matrix/~N0g matron/~NgSY matte/~NSgJdGZ matter/~NwSgVdG matting/NgV6 mattock/NSgV mattress/~NgSV maturate/VGdSn maturation/~Ng mature/~JY^>VGdS maturity/~NSg matzo/NSgH matzoh/Ng matzohs/N matzot/N maudlin/NJ maul/NgSVd>GZ mauler/Ng maunder/VdGSN mausoleum/~NSg mauve/NmgJ maven/NSg maverick/~JNSgV maw/~NSg mawkish/JYp mawkishness/Ng max/~JNgSVGd maxi/~JNgS maxilla/Ng maxillae/9 maxillary/~JN maxim/~NSg maxima/~N maximal/~JYN maximalism/Ng maximalist/NgSJ maximisation/Ng!_₹ maximise/VGdS!_₹ maximization/Ng maximize/~VGdS maximum/~NSgJ may/~NgA maybe/~JRNSg # adverb of probability/certainty/affirmation; modal adverb mayday/NgS mayflower/~NgS mayfly/NSg mayhem/~NmgV mayn't/VA mayo/~Nmg mayonnaise/NmgV mayor/~NSg mayoral/~JN mayoralty/Ng mayoress/NgS maypole/NSgV mayst/V maze/~NgSV mazurka/NgS mdse/N me/~Ia1o. # I~pronoun a~personal 1~person .~singular o~object mead/~Ng meadow/~NgSV meadowlark/NgS meager/~JYpV meagerness/Ng meagre/NJYpV!@_₹ meagreness/Ng!@_₹ meal/~NgSV mealiness/Ng mealtime/NSg mealy/J^>pN mealybug/NSg mealymouthed/J mean/~V>GSJY^pNgz meander/~NSgVdGz meanderings/Ng meanie/Ng meaning/~NwgVJ meaningful/~JYp meaningfulness/Nmg meaningless/~JYp meaninglessness/Nmg meanness/Nmg meant/~VtTU meantime/~Ng meanwhile/~Ng meany/NSg meas/V measles/~NmgV measly/J>^ measurable/~JN measurably/Ry measure/~NSVdGr measure's measured/~JVU measureless/J measurement/~NwgS meat/~NwgS meatball/NgS meathead/NgS meatiness/Nmg meatless/J meatloaf/N0g meatloaves/N9 meatpacking/Nmg meaty/J^>p mecca/~NSg mechanic/~JNgS mechanical/~JYNS mechanics/~Nm9g mechanisation/Nmg!_₹ mechanise/VdSG!_₹ mechanism/~NSg mechanistic/~J mechanistically/Ry mechanization/~Nmg mechanize/VdSG mechanoluminescence/Nmg mechanoluminescent/J mechatronics/Ng med/~NSg medal/~NSgV medalist/~NgS medallion/~NSgV medallist/NSg!@_₹ meddle/VGd>SZ meddler/Ng meddlesome/J media/~Nw09SgJ medial/~JYNr median/~NgSJ mediate/~VdSGJrn mediated/~VU mediation/~NwSgr mediator/~NgS medic/~JNSg medicaid/g medical/~JYNSg medicament/Ng medicare/~Ng medicate/VGdSnX medication/~Ng medicinal/~JYN medicine/~NwgSV medico/NgS medieval/~JN medievalist/NgS mediocre/~JN mediocrity/NSg meditate/VdSGnvX meditation/~Ng meditative/~JY medium/~NgSJ medley/~NgSV medulla/NSg medusa/~N medusae/9 meed/NgV meek/~JY^>pV meekness/Ng meerschaum/NSg meet/~VGSNgJz meet up/V/ meeting/~NwgSV meetinghouse/NSg meetup/NgS meg/~NSV mega/~JN( megabit/NSg megabucks/Ng megabyte/NgS megachurch/NgS megacycle/NSg megadeath/Ng megadeaths/N megagram/NS megahertz/Ng megajoule/NS megalith/N9g megalithic/~J megaliths/N9 megalomania/Ng megalomaniac/NSgJ megalomaniacal/J megalopolis/~NgS megameter/NS< megametre/NS!@_₹ megapascal/NS megaphone/NSgVdG megapixel/~NSgJ megastar/NS megaton/NSg megawatt/NgS meh/JN meiosis/~Ng meiotic/J melamine/~Ng melancholia/Ng melancholic/JNS melancholy/~NgJ melange/NgS melanin/Nmg melanoma/~NSg melatonin/Nmg meld/VdGSNg melee/~NSgVJ meliorate/VGdSnv melioration/Nmg mellifluous/JYp mellifluousness/Nmg mellow/~J^Y>pNSVGd mellowness/Nmg melodic/~JQ melodious/JYp melodiousness/Nmg melodrama/~NwgS melodramatic/JSQ melodramatics/Ng melody/~NwSg melon/~NwSgJ melt/~VdGSNr melt down/V/ melt's meltdown/~NSg member/~NSVEr member's membership/~NwSgV membrane/~NSg membranous/J meme/~NgSV memento/~NgS memo/~NgSV memoir/~NgS memoization/Nmg memoize/VGdS memorabilia/~Nmg memorability/Ng memorable/~JNU memorably/Ry memoranda/N9g memorandum/~N0gS memorial/~NSgJ memorialise/VdSG!_₹ memorialize/VdSG memorisation/Nmg!_₹ memorise/VdSG!_₹ memorization/Nmg memorize/VdSG memory/~NwSg memsahib/NS men/~N9g menace/~NgSVGd menacing/~JYV6N menage/NgS menagerie/~NgS mend/~Vd>GSNgZ mendacious/JY mendacity/Nmg mendelevium/Nmg mender/NgS mendicancy/Nmg mendicant/JNSg mending/V6Ng menfolk/N0gS menfolks/N9g menhaden/Ng menial/JYNgS meningeal/J meninges/N9 meningitis/~Nmg meninx/Ng menisci/N9 meniscus/N0g menopausal/J menopause/Nmg menorah/N0g menorahs/N9 mensch/~NgS menservants/N9 menses/Ng menstrual/~JN menstruate/VGdSJn menstruation/Ng mensurable/J mensuration/Ng menswear/Nmg mental/~JY # removed slang/Indian/rare noun senses mentalist/JNSg mentality/~NSg menthol/Ng mentholated/J mention/~NSgVGd mentioned/~VtTU mentor/~NgSVdG mentorship/N menu/~NgSVG meow/NgSVdG mercantile/~J mercantilism/Ng mercantilist/JNSg mercenary/~NSgJ mercer/~NgS mercerise/VGdS!_₹ mercerize/VGdS merch/Ng merchandise/~NgSVGd>Z merchandiser/Ng merchandising/~NgV merchant/~NgSVB merchantability/Ng merchantman/Ng merchantmen/9 merciful/~JYU merciless/JYp mercilessness/Ng mercurial/NJY mercuric/J mercury/~Ng mercy/~Nw☁SgV mere/~JY^NgSV meretricious/JYp meretriciousness/Ng merganser/~NgS merge/~Vd>GSNZ merger/~Ng meridian/~JNgSV meridional/JNgS meringue/NgSV merino/NgS merit/~NSgVe merited/~JVU meriting/V meritless/J meritocracy/NSg meritocratic/J meritorious/~JYp meritoriousness/Nmg mermaid/~NSg merman/Ng mermen/9 merrily/Ry merriment/Ng merriness/Nmg merry/~J^>pN merrymaker/NgS merrymaking/NmgV mesa/~NgS mescal/NgS mescalin/N mescaline/Ng mesdames/N9 mesdemoiselles/N9 mesh/~NgSVdG mesmeric/J mesmerise/VGd>SZ!_₹ mesmeriser/Ng!_₹ mesmerism/Ng mesmerize/VGd>SZ mesmerizer/Ng mesomorph/Ng mesomorphs/N meson/NSg mesosphere/NSg mesothelioma/Ng mesquite/NSg mess/~NgSVdG message/~NgSVGd messeigneurs/N messenger/~NSgV messiah/~Ng messiahs/N messianic/~J messieurs/N messily/Ry messiness/Nmg messmate/NSg messy/~J^>p mestizo/~NgS met/~VtT meta/~JN meta tag/NgS metabolic/~JN metabolically/Ry metabolise/VdSG!_₹ metabolism/~NwSg metabolite/~NSg metabolize/VdSG metacarpal/JNSg metacarpi/N metacarpus/Ng metacognition/Ng metadata/~Nm metal/~NwSgJVd metalanguage/NgS metalled/JVtT!@_₹ metallic/~JN metallize/VGd>SZ # ll vs l not clearly US/UK difference, few dictionaries include -ise spellings metallurgic/J metallurgical/~J metallurgist/NgS metallurgy/~Nmg metalwork/~Ng>GZ metalworker/NgS metalworking/~Ng metamorphic/JN metamorphism/Nmg metamorphose/VGdS metamorphosis/~Ng metaphor/~NgSV metaphoric/J metaphorical/~JY metaphysical/~JY metaphysics/~Ng metastases/9 metastasis/Ng metastasise/V!_₹ metastasize/VdSG metastatic/J metatarsal/JNgS metatarsi/N metatarsus/Ng metatheses/N9 metathesis/N0g metaverse/NgS mete/VGd>SNgJZ metempsychoses/N metempsychosis/Ng meteor/~NgSV meteoric/J meteorically/Ry meteorite/~NSg meteoroid/NSg meteorologic/JN meteorological/~J meteorologist/~NSg meteorology/~Ng meter/~NgVGd metformin/N meth/NSg methadone/Ng methamphetamine/NgS methane/~Ng methanol/~Ng methinks/ method/~NgSV methodical/~JYp methodicalness/Ng methodological/~JY methodology/~NSg methotrexate/N methought/V methyl/~Ng meticulous/~JYp meticulousness/Ng metier/NgS metre/NSgV!@_₹ metric/~JNSV metrical/~JY metricate/VGdSn metrication/Ng metricise/VGdS!_₹ metricize/VGdS metro/~NSgJ metronome/NgS metronomic/J metropolis/~NgS metropolitan/~NJ mettle/NgJ mettlesome/J mew/NSgVGd mewl/VdGSN mews/NgV mezzanine/~NgSJV mezzo/~NSg mfg/N mfr/NS mg/~ mgr/~N mi/~NgnX miaow/NSgVGd!_₹ miasma/NgS mic/~NSV mica/~Ng mice/~N9V mick/~NSJ mickey/~NgSV micro/~JNSgV( microaggression/NSg microarchitecture/NgS microbe/NgS microbial/~JN microbiological/J microbiologist/NgS microbiology/~Ng microbiome/NSg microblog/NgSV microblogged/VtT microblogging/NgV6 microbrewery/NSg microchip/NgSV microcircuit/NSg microcode/NmgV microcomputer/~NgS microcontroller/NgS microcosm/NgS microcosmic/J microdata/Nmg microdot/NSgV microeconomic/JSQ microelectronic/JNS microelectronics/~Nmg microfarad/NgS microfiber/NgS microfiche/NgV microfilm/~NgSVGd microfinance/Nmg microfloppies/N9 microgram/NgS microgroove/NSg microkernel/NgS microlight/NgS microloan/NgS micromanage/VGd>SZL micromanagement/Nmg micromanager/NgS micrometeorite/NSg micrometer/NgS< micrometre/NgS!@_₹ micron/~NgS microorganism/NgS micropayment/NwgS microphone/~NSgV microplastic/NwSg microplastics/N9 microprocessor/~NgS microscope/~NSgV microscopic/~J microscopical/JY microscopy/~Ng microsecond/NgS microservice/NSg microstate/NgS microsurgery/NwgS microtask/NgS microtransaction/NSg microvascular/J microwave/~NSgVdGB microwaveable/J mid/~JPN( midair/J midcentury/J midday/~Ng midden/NgS middle/~NgSJVG middle-sized/J middlebrow/JNSg middleman/NgV middlemen/9 middlemost/J middleware/~Nmg middleweight/~NgS middy/NSg midfield/~N>Z midge/~NSg midget/~NgS midi/~JNgS midland/~NgSJ midlife/JNg midmost/J midnight/~NgJ midpoint/~NgS midrib/NgS midriff/NgS midsection/NgS midshipman/~Ng midshipmen/9 midships/ midsize/JN midst/~NgP midstream/Ng midsummer/~NgJ midterm/JNgS midtown/~Ng midway/~NgSJ midweek/NgSJ midwife/~NgSVGd midwifery/~NSg midwinter/Ng midwives/NV midyear/NgS mien/Ng miff/NSVdG might/~NmgJA might've/V mightily/Ry mightiness/Ng mightn't/A mighty/~NJ^>p mignonette/NSgJ migraine/NgS migrant/~NgSJ migrate/~VGdSr migration/~NSg migratory/~J mikado/~NgS mike/~NgSVGd mil/~NSgJ>Z milady/NSgV milch/J mild/~J>Y^pNg mildew/NmSgVdG mildness/Ng mile/~NgS mileage/~NwSg milepost/NgSV miler/Ng milestone/~NgSV milf/NgS milieu/~NSg militancy/Ng militant/~JYNgS militarily/~Ry militarisation/Nge!_₹ militarise/VdSGe!_₹ militarism/~Ng militarist/NSg militaristic/J militarization/Nge militarize/VdSGe military/~JNg militate/VGdS militia/~NSg militiaman/Ng militiamen/~9 milk/~NwgSVd>GZ milker/Ng milkiness/Ng milkmaid/NgS milkman/Ng milkmen/9 milkshake/NSgV milksop/NgS milkweed/NSg milky/~J>^p mill/~NgSVd>GZz millage/Ng millennia/~N millennial/JNgS millennium/~NgS miller/~Ng millet/~Ng # milli # prefixes that are not also words in their own right don't belong in the dictionary milliamp/NgS milliard/Sg millibar/NgS milligram/NgS milliliter/NgS< millilitre/NgS!@_₹ millimeter/~NgS< millimetre/NgS!@_₹ milliner/NgSV millinery/Ng milling/~NgV6 million/~SHg millionaire/~NSg millionairess/NS millionth/JNg millionths/N millipede/NSg millisecond/NSg millpond/NSg millrace/NSg millstone/~NSg millstream/NgS millwright/NSg milometer/NS milquetoast/JNSg milt/~NgSVdG mime/~NgSVGd mimeograph/NgVGd mimeographs/NV mimetic/JN mimic/~VSNgJ mimicked/VtT mimicker/NSg mimicking/~NV mimicry/~NSg mimosa/~NSg min/~NJV minaret/~NgS minatory/J mince/NSgVd>GZ mincemeat/Ng mincer/Ng mind/~NSVd>GrZ mind-blowing/J mind-boggling/JY!@_₹ mind game/NgS mind's mindboggling/JY< minded/~JpV mindedness/Nmg # Wiktionary has an entry for this on its own mindfuck/NSgx mindful/~JYpN mindfulness/~Nmg mindless/JYp mindlessness/Nmg mindset/~NgS mine/~INgSVGd>ZnX minefield/NSg miner/~NgS mineral/~NgSJ mineralize/VGdS mineralogical/J mineralogist/NgS mineralogy/~Nmg minestrone/Nmg minesweeper/NSg mingle/VdGSN mingy/J mini/~JNgS( miniature/~NgSJV miniaturisation/Ng!_₹ miniaturise/VGdS!_₹ miniaturist/NgS miniaturization/Ng miniaturize/VGdS minibar/NS minibike/NSg minibus/~NgS minicab/NSV minicam/NgS minicomputer/~NSg minifloppies/N minify/VGdS minim/NSg minima/~N9 minimal/~JYN minimalism/Nmg minimalist/~JNgS minimalistic/J minimisation/Ng!_₹ minimise/VdSG!_₹ minimization/Nmg minimize/~VdSG minimum/~N0gSJ mining/~NmgV minion/NgJ miniseries/~NgS miniskirt/NgS minister/~NSgVGd ministerial/~JN ministership/NgS ministrant/NgSJ ministration/NgS ministry/~NSg minivan/NgSV mink/~NgS minnesinger/NgS minnow/NSgJV minor/~JYNSgVdG minority/~NSgJ minoxidil/Ng minster/~NgS minstrel/~NSgV minstrelsy/Ng mint/~NgSVd>GJZ mintage/Ng minter/Ng minterm/NgS minty/J>^p minuend/NgS minuet/~NSgV minus/~PNgSJV minuscule/~NgSJ minute/~NSgVd>GJY^p minuteman/~N0g minutemen/~N9 minuteness/Nmg minutia/N0g minutiae/N9 minx/NgSV miracle/~NgSV miraculous/~JY mirage/~NSgV mire/NgSVGd mirror/~NSgVGd mirth/Nmg mirthful/JYp mirthfulness/Nmg mirthless/JY miry/J>^ # mis # prefixes that are not also words in their own right don't belong in the dictionary misaddress/VdSG misadventure/NwgS misaligned/JV misalignment/Nmg misalliance/NgS misanthrope/NSg misanthropic/J misanthropically/Ry misanthropist/NgS misanthropy/Nmg misapplication/Nmg misapply/VdSGnX misapprehend/VGSd misapprehension/NwgS misappropriate/VdSGXn misappropriation/~Nmg misattribute/VGdS misbalance/VGdS misbegotten/JVN misbehave/VGdS misbehavior/Ng misbehaviour/Ng!@_₹ misc/~J miscalculate/VdSGXn miscalculation/NwSg miscall/VdGSN miscarriage/~NgS miscarry/VGdS miscast/VGSNJ miscegenation/Nmg miscellaneous/~JY miscellany/~NSg mischance/NSgV mischaracterisation/NgS!@_₹ mischaracterise/VGdS!@_₹ mischaracterization/NgS mischaracterize/VGdS mischief/~NgV mischievous/~JYp mischievousness/Ng miscibility/Ng miscible/J misclassified/V miscommunicate/VGdSnX misconceive/VGdS misconception/~NwSg misconduct/~NgSVdG misconfiguration/NwgS misconstruction/NgS misconstrue/VGdS miscount/VdGSNg miscreant/JNSg miscue/NSgVdG misdeal/VGSNg misdealt/V misdeed/NgS misdemeanor/~NgS misdemeanour/NgS!@_₹ misdiagnose/VGdS misdiagnosis/Ng misdid/Vt misdirect/VSdG misdirection/NwgS misdo/VGz misdoes/Vh misdoing/NgV misdone/VT miser/NSgY miserable/J miserableness/Nmg miserably/Ry miserliness/Nmg misery/~NwSg misfeasance/Ngm misfeature/NSg misfile/VGdS misfire/NgSVGd misfit/NSgV misfitted/VtT misfitting/V6 misfortune/~NSg misgiving/NgS misgovern/VSdGL misgovernment/Ng misguidance/Nmg misguide/VdSG misguided/~JYV mishandle/VdGSN mishap/~NSgV mishear/VGS misheard/V mishit/NSV mishitting/V6 mishmash/NgSV misidentify/VGdS misinform/VdGS misinformation/~Nmg misinterpret/VSGd misinterpretation/NwSg misjudge/VdSG misjudgement/NwSg!_₹ misjudgment/NwSg mislabel/VGSd mislabelled/VtT!@_₹ mislabelling/V6N!@_₹ mislaid/JVtT mislay/VbGS mislead/~VbGSN misleading/~JYV6N misled/~VtT mismanage/VGdSL mismanagement/~Ng mismatch/~VGdSNg mismeasure/VGdS misname/NSVGd misnomer/NgSV miso/Nmg misogamist/NgS misogamy/Nmg misogynist/NSgJ misogynistic/J misogynous/J misogyny/Nmg misperceive/VGdS misplace/VGdSL misplacement/Nmg misplay/VGdSNg misprint/NgSVGd misprision/Ng mispronounce/VdSG mispronunciation/NSg misquotation/NwgS misquote/VGdSNg misread/VGSNz misreading/VNg misremember/VGdS misreport/VdGSNg misrepresent/VGdS misrepresentation/~NwgS misrepresentative/J misrule/NgSVGd miss/~VdGSNEv miss's missal/~NSgE missed/~VtTU misshape/NSVGd misshapen/JV missile/~NgS missilery/Ng mission/~NgSVr missionary/~NSgJ missioner/NSg missive/NgSJ misspeak/VGS misspell/VGdSz misspelling/~NwgSV6 misspend/VGS misspent/JV misspoke/V misspoken/V misstate/VGdSL misstatement/NSg misstep/NgSV missus/NgS mist/~NwSVd>GeZ mist's mistakable/JU mistake/~VGSNgB mistaken/~VTJY mister's mistily/Ry mistime/VGdS mistiness/Nmg mistletoe/~Ng mistook/Vt mistral/~NgS mistranslated/VtT mistreat/VdGSL mistreatment/~Nmg mistress/~NgSV mistrial/NgS mistrust/NgSVdG mistrustful/JY mistune/NgSVdG misty/~J>^p mistype/VGSd misunderstand/VSGz misunderstanding/~NwgV misunderstood/~VJ misuse/~NSgVdG mite/~NgSV>Z miter/~VdGNg mitigate/~VdSGn mitigated/JVU mitigation/~NgS mitochondria/~Nmg mitochondrial/~J mitochondrion/N mitoses/N9 mitosis/N0g mitotic/J mitral/J mitre/NSgVdG!@_₹ mitt/~NgSnX mitten/NgV mitzvah/~N mix/~VGd>SNgZB mix-up/NgS mixed/~VJU mixer/~Ng mixture/~NwSg mizzen/NgSJ mizzenmast/NSg mkay/ mks/~N ml/~ mm/~N mnemonic/~JNgS mnemonically/Ry mo/~JNSKH # removed `C` de- prefix should only be for negation; breaks heuristics otherwise moan/NgSVd>GZ moaner/Ng moat/~NgSVd mob/~NSVe mob's mobbed/VtTJe mobbing/V6Ne mobile/~JNgS mobilisation/N0wge!_₹ mobilisations/N9!_₹ mobilise/VdSGe!_₹ mobiliser/NgS!_₹ mobility/~Nmg mobilization/~N0wge mobilizations/N9 mobilize/~VdSGe mobilizer/NSg mobster/~NSg moccasin/NSg mocha/NwSgJ mock/~NSVd>GJZ mock up/V mock-up/NgS mocker/NgS mockery/~NwSg mocking/~VNJY mockingbird/~NSg mod/~NSgVJ^ modal/~JNSg modality/~NwSg modded/VtT modding/V6Nm mode/~NgS model/~NSgJVGdZz modeler/NgS modeling/~VNg modelled/JVtTr!@_₹ modeller/NgS!@_₹ modelling/V6SNmg!@_₹ modem/~NSgV moderate/~JYpNgSVGdn moderateness/Nmg moderation/~Nmg moderator/~NSg modern/~JYpNgS modernisation/Ng!_₹ modernise/Vd>SGZ!_₹ moderniser/Ng!_₹ modernism/~Nmg modernist/~JNSg modernistic/J modernity/~Nmg modernization/~Ng modernize/~Vd>SGZ modernizer/NgS modernness/Nmg modest/~JY modesty/~Nmg modicum/NSg modifiable/J modification/~NwSg modified/~JVtTNU modifier/NgS modify/~Vd>SGXZn modish/JYp modishness/Ng modular/~JY modularisation/N!_₹ modularity/Nmg modularization/Nmg modulate/VGdSen modulation/~N0ge modulations/N9 modulator/NgS module/~NgS modulo/~PN0 modulus/~N9 moggie/N!@_₹ moggy/NgS mogul/~NSgV mohair/Nmg moi/~I moiety/NSg moil/VdGSNg moire/NSg moist/~J^Y>pNVXn moisten/Vd>GZ moistener/NgS moistness/Nmg moisture/~Nmg moisturise/VGd>SZ!_₹ moisturiser/Nwg!_₹ moisturize/VGd>SZ moisturizer/Nwg mojito/NwgS mojo/~Nmg molar/~NSgJ molasses/NmgV mold/~NwgSVd>GzZ moldboard/NSg molder/NgVGd moldiness/Nmg molding/~V6SNwg moldy/J^>p mole/~NgS molecular/~JN molecularity/Nmg molecule/~NSg molehill/NSg moleskin/NmgV molest/Vd>GSZ molestation/Nmg molested/VtTU molester/NgSV moll/~NgSJ mollification/Nmg mollify/VdSGn mollusc/NSg!@_₹ molluscan/JN mollusk/NSg molly/~NSgV mollycoddle/NSgVdG molt/Vd>GSNgnZ molten/JV!@_₹ molter/Ng molybdenum/Nmg mom/~NSgV<@ moment/~NgS momenta/N9 momentarily/R # adverb of time (duration) momentariness/Nmg momentary/Jp momentous/JYp momentousness/Nmg momentum/~N0gw mommy/~NSgVJ<@ monad/NgS monarch/~N0gS monarchic/J monarchical/J monarchism/Nmg monarchist/~NgS monarchistic/J monarchs/~N9 monarchy/~NSg monastery/~NSg monastic/~JNgS monastical/JY monasticism/Nmg monaural/J monetarily/Ry monetarism/Nmg monetarist/JNgS monetary/~J monetisation/Nmge!_₹ monetise/VGdSe!_₹ monetization/Nmge monetize/VGdSe money/~NwSgJd moneybag/NgS moneybox/NS moneylender/NSg moneymaker/NSg moneymaking/JNg monger/~NgSVdG mongol/~NS mongolism/Nmg mongoloid/NgS mongoose/NgS mongrel/NSgJ monies/~N moniker/~NSg monism/Nmg monist/NgS monition/NSg monitor/~NSgVdG monitory/JN monk/~NgSV monkey/~NgSVdG monkeyshine/NSg monkish/J monkshood/NSg mono/~NgJ( monochromatic/~J monochrome/~NgSJ monocle/NSgd monoclonal/JN monocotyledon/NSg monocotyledonous/J monocular/JN monoculture/NSg monodic/J monodist/NSg monody/NSg monogamist/NgS monogamous/~JY monogamy/~Nmg monogram/~NSgV monogrammed/VtT monogramming/V6 monograph/~NgV monographs/~N monolingual/~JNgS monolith/~NgV monolithic/~J monoliths/N monologist/NSg monologue/~NSgV monomania/Nmg monomaniac/NgSJ monomaniacal/J monomer/NSg mononucleosis/Nmg monophonic/J monoplane/JNSgV monopolisation/Nmg!_₹ monopolise/Vd>SGZ!_₹ monopoliser/NgS!_₹ monopolist/NSg monopolistic/J monopolization/Nmg monopolize/Vd>SGZ monopolizer/NgS monopoly/~NSg monorail/~NgS monorepo/NSg monospace/JVSdG monosyllabic/JN monosyllable/NgS monotheism/Nmg monotheist/NSg monotheistic/J monotone/~JNgSV monotonic/J monotonically/Ry monotonous/JYp monotonousness/Ng monotony/Nmg monounsaturated/J monoxide/~NgS monseigneur/Ng monsieur/~Ng monsignor/~NSg monsoon/~NSg monsoonal/J monster/~NSgJV monstrance/NSgr monstrosity/NSg monstrous/~JY montage/~NSgV month/~NgY monthly/~JNSgR8 months/~N9 monument/~NgSV monumental/~JY moo/~NSgVGd mooch/VGd>SNgZ moocher/Ng mood/~NwgS moodily/Ry moodiness/Nmg moody/~J^>p moon/~ONSgVdG moon landing/NgS moonbeam/NgS moonless/J moonlight/~NwSgVd>GZ moonlighter/NgS moonlighting/VNmg moonlit/J moonscape/NSg moonshine/~NmgSV>Z moonshiner/NgS moonshot/NgS moonstone/NgS moonstruck/J moonwalk/NgSV moor/~NgSVdGzU # add "unmoor" moorhen/~NS mooring/VSNwg moorland/~NgS moose/~Ng09 # singular and plural moot/~JNSVdG mop/~NSgVGd>Z mope/VSNg moped/VSJNg moper/Ng mopey/J mopier/Jc mopiest/Ju mopish/J mopped/VtTJ moppet/NgS mopping/V6SNwg moraine/~NSg moral/~JYNSgV morale/~Nmg moralisation/Nmge!_₹ moralise/VGdSe!_₹ moraliser/NgS!_₹ moralism/N moralist/NgS moralistic/JQ moralities/N9 morality/~N0mgU moralization/Nmge moralize/VGdSe moralizer/NgS morass/NgS moratorium/~NSg moray/~NSg morbid/~JYp morbidity/NwSg morbidness/Nmg mordancy/Ng mordant/JYNSgV more/~RIJNSDq moreish/J morel/~NSg moreover/~R mores/~NgV morgue/~NgS moribund/JN morn/NgSGz morning/~NwgS # as a part of the day it's uncountable morocco/~Ng moron/NSg moronic/JQ morose/JYp moroseness/Nmg morph/~N0VGd morpheme/~NgS morphemic/J morphia/Ng morphine/~Nmg morphing/VNg morphological/~J morphology/~Nmg morphosyntax/Nmg morphs/~N9V morrow/~NgSV morsel/NgSV mortal/~JYNgS mortality/~Nmg mortar/~NwgSVdG mortarboard/NSg mortgage/~NSVGdr mortgage's mortgagee/NgS mortgager/NgS mortgagor/NgS mortician/NgS mortification/Nmg mortify/VGdSn mortise/NSgVdG mortuary/~JNSg mosaic/~NgSJV mosey/VSGd mosfet/NgS mosh/VdGSN mosque/~NgS mosquito/~N0gV mosquitoes/~N9 moss/~NwgSV mossback/NSg mossy/J^>N most/~JYINgDqR mot/~NSg mote/NSVKeXvn mote's motel/~NSgV motet/NSg moth/~NgV mothball/NgSVGd mother/~NgSVdGY motherboard/~NSg motherfucker/NgSx motherfucking/Jx motherhood/~Nmg motherland/~NgS motherless/J motherliness/Nmg motherload/NgS mothership/NgS moths/~N9V motif/~NSg motile/JNS motility/~Ng motion/~NwgVKe motioned/V motioning/VN motionless/~JYp motionlessness/Ng motivate/~VdSGe motivated/~VJU motivation/~NwSg motivational/~JY motivator/NSg motive/~NgSVJ motiveless/J motley/~JNgS motlier/Jc motliest/Ju motocross/~NwgS motor/~NSgJVGd motor ship/NgS motorbike/~NgSVGd motorboat/NgSV motorcade/NgSV motorcar/NSg motorcycle/~NSgVdG motorcyclist/NgS motorisation/Ng!_₹ motorise/VdSG!_₹ motorist/NSg motorization/Ng motorize/VdSG motorman/N0g motormen/N9 motormouth/NgV motormouths/NV motorsport/NgS motorway/~NSg mottle/VGdSN motto/~N0gV mottoes/N9 moue/NgS mould/NwSgVGd>zZ!@_₹ moulder/VdGNg!@_₹ moulding/VNg!@_₹ mouldy/J^>!@_₹ moult/NSgVGd!@_₹ mound/~NSgVGd mount/~NSgVGdEr mountable/J mountain/~NSg mountaineer/~NSgVdG mountaineering/~Nmg mountainous/~J mountainside/NSg mountaintop/NSgJ mountebank/NgSV mounted/~JVtTU mounter/NgS mounting/~JV6SNwg mourn/~VGd>SNZ mourned/~VtTU mourner/NgS mournful/JYp mournfulness/Nmg mourning/~VNmg mouse/~NSgVd>GZ mouse wheel/NgS mouseless/J mouseover/NgS mouser/Ng mousetrap/NSgV mousetrapped/VtT mousetrapping/V6 mousiness/Nmg moussaka/NmgS mousse/NwgSVGd moustache/NSgd!@_₹ mousy/J^>pN mouth/~N0gVGd mouthfeel/Nmg mouthful/NgSJ mouthiness/Nmg mouthpart/NSg mouthpiece/~NgS mouths/~N9Vh mouthwash/NgS mouthwatering/J mouthy/J^>p mouton/~Ng movable/~JNSg move/~VGd>SNgrZB moved/~JVU movement/~NwSg mover/~Ngr movie/~NSg moviegoer/NSg moving/~JYVN mow/VGd>SNgZ mower/~NgS moxie/Nmg mozzarella/Nmg mp/~N mpg/ mph/~ mt/~JN mtg/N mtge/N mu/~NSg much/~JpIDqRg muchness/N mucilage/Nmg mucilaginous/J muck/NmgSVdG muckrake/NSVd>GZ muckraker/Ng mucky/J^> mucous/~J mucus/~Nmg mud/~NwgSV mudded/VtT muddily/Ry muddiness/Nmg mudding/V6 muddle/VGdSNg muddleheaded/J muddy/~J^>pVGdSN mudflap/NSg mudflat/NgS mudguard/NSg mudpack/NS mudroom/NgS mudslide/NgS mudslinger/NSg mudslinging/Ng muenster/Ng muesli/Nmg muezzin/NgS muff/NgSVdG muffin/NgSV muffle/NSVGd>Z muffler/Ng mufti/~NSg muftiate/NSg mug/~NSgVJ mugful/NgS mugged/VtT mugger/NgSJ mugginess/Nmg mugging/NgSV6 muggins/N muggle/NgSV muggy/J^>p mugshot/NgS mugwump/NgSV mujaheddin/N mukluk/NgS mulatto/N0g mulattoes/N9 mulberry/~NwSgJ mulch/NgSVGd mulct/NSgVGd mule/~NgSV muleskinner/NgS muleteer/NgS mulish/JYp mulishness/Nmg mull/~VdGSN mullah/N0gV mullahs/N9 mullein/Ng mullet/~NgS mulligan/~NSg mulligatawny/Ng mullion/NSgVd multi/~N( multi-platform/J multibillion/J multibyte/J multicellular/J multichannel/J multicolor/Nm< multicolored/J< multicolour/Nm!@_₹ multicoloured/J!@_₹ multicore/J multicultural/~J multiculturalism/~Nmg multicurrency/J multidevice/J multidimensional/J multidirectional/J multidisciplinary/~J multidomain/J multiethnic/J multifaceted/~JYp multifactor/J multifamily/JN multifarious/JYp multifariousness/Nmg multifocal/J multiform/JN multiformat/J multigenerational/J multigrain/J multilanguage/J multilateral/~JYN multilayer/Jd multilevel/J multiline/J multilingual/~JN multilingualism/Nmg multimedia/~NmgJ multimeter/NSg multimillionaire/NSg multimodal/J multinational/~JNSg multipage/J multiparadigm/J multipart/J multipartite multiparty/J multiphonics/Nmg multiplanetary/J multiplatform/J multiplayer/~JNg multiple/~JNgSDq multiple-choice/J multiplex/~J>NgSVGdZ multiplexer/NgS multiplicand/NgS multiplication/~Nmg multiplicative/~JN multiplicity/~NSg multiplier/~NgS multiply/~VGd>SNnZX multipolarity/Nmg multiprocessing/Nmg multiprocessor/NSg multipurpose/~J multiracial/JN multistage/J multistep/J multistory/JN multisystem/J multitab/J multitask/JVGS multitasking/VNg multithreading/Nmg multitude/~NSg multitudinous/J multiuser/J multivariate/JN multiverse/~NSg multivitamin/NgSJ multiyear/J mum/~NgSJV # "mother" sense is UK/AU, "silent" sense is universal mumble/~VGd>SNgZ mumbler/NgS mumbletypeg/Ng mummer/NgSV mummery/Ng mummification/Nmg mummify/VGdSn mummy/~NSgV # "mother" sense is UK/AU, "mummified" sense is universal mumps/NgV mun/~VNI munch/~VGdSN muncher/NgS munchie/N0S munchies/N9g munchkin/NSg mundane/~JYNS mundanity/Nmg mung/NSVdG municipal/~JYNSg municipality/~NSg munificence/Ng munificent/JY munition/NgSVdG mural/~NSgJV muralist/NSg murder/~NwgSVGd>Z murderer/~NgS murderess/NgS murderous/~JY murk/JNmgSV murkily/Ry murkiness/Nmg murky/J^>p murmur/NgSVGd>Zz murmurer/NgS murmuring/VNg murmurous/J murrain/NgJ muscat/~NwgS muscatel/NSg muscle/~NwgSVGd musclebound/J muscleman/N0 musclemen/N9 muscly/J muscular/~JY muscularity/Nmg musculature/NmgS musculoskeletal/J muse/~NgSVGdz musette/NgS museum/~NgSV mush/NgSVd>GZ mushiness/Nmg mushroom/~NwSgJVGd mushy/J^>p music/~NwSgVJ musical/~JYNgS musicale/NgS musicality/Nmg musician/~NSgY musicianship/Nmg musicological/J musicologist/~NgS musicology/~Nmg musing/V6SJYNwg musk/~NmgV muskeg/NgS muskellunge/NgS musket/~NgS musketeer/NgS musketry/Ng muskie/Ng muskiness/Nmg muskmelon/NSg muskox/Ngn muskrat/NgS musky/J^>pNS muslin/Ng muss/VdGSNg mussel/~NgS mussy/J^>N must/~VA>SNgZ must've/ mustache/~NgSd mustachio/NSgVd mustang/~NgSV mustard/~NmgJ muster/~NgVGd mustily/Ry mustiness/Nmg mustn't/VA musty/J^>pNV mutability/Nmg mutably/Ry mutagen/NgS mutagenic/J mutant/~NgSJ mutate/VGdSXnv mutation/~NwgS mutational/J mutatis mutandis/R mute/~JY^>pNgSVGdB mutedness/Nmg muteness/Nmg mutex/NgS mutilate/VdSGJnX mutilation/~NgS mutilator/NSg mutineer/NSgV mutinous/JY mutiny/~NSgVGd mutt/~NgS mutter/NgSVGd>Zz mutterer/NgS muttering/VNg mutton/~NmgJ muttonchops/N9 muttony/J mutual/~JYN mutuality/Ng muumuu/NgS muzak/NmgV muzzily/Ry muzzle/~NSgVdG muzzy/JpN my/~D5 mycologist/NSg mycology/Nmg myelitis/Nmg myna/NgS mynah/NgS!_₹ myocardial/~J myocardium/~N myologist/NSg myopia/Nmg myopic/JN myopically/Ry myriad/~NSgJ myrmidon/NgS myrrh/Nmg myrtle/~NSg myself/~Ia1F. # I~pronoun a~personal 1~person .~singular F~reflexive mysterious/~JYp mysteriousness/Nmg mystery/~NwSg mystic/~JNSg mystical/~JY mysticism/~Nmg mystification/Nmge mystify/VdSGen mystique/~Nmg myth/~Nw0g mythic/~J mythical/~J mythological/~J mythologise/VdSG!_₹ mythologist/NSg mythologize/VdSG mythology/~NwSg mythos/Nmg myths/~N9 myxomatosis/Nmg n/NJ^CiKH naan/NwS nab/VSN nabbed/VtT nabbing/V6 nabob/NSg nacelle/NSg nacho/NSg nacre/Ng nacreous/J nada nadir/NSgV nae naff/J>^ nag/~NSgV nagged/VtT nagger/NgS nagging/V6NJ nagware/Nmg nah/ naiad/NSg naif/JNgS nail/~NgSVdG nail biter/NgS nailbrush/NgSV naïve/~JN naive/~J>Y^N naivete/Nmg naivety/Nmg naked/~JYpV nakedness/Nmg namaste name/~NSVGdr name's nameable/JU named/~JVU nameless/~JYN namely/~ nameplate/~NgS namesake/~NSgV namespace/~NSgVGd nanny/~NSgV nano-farad/NgS nanobot/NSg nanocurie/NgS nanogram/NSg nanometer/NS< nanometre/NS!@_₹ nanoparticle/NgS nanoprocessor/NSg nanosecond/NSg nanotechnology/~Nmg nanotube/NgS nap/~VSNg napalm/~NmgSVdG nape/~NgSV naphtha/Nmg naphthalene/Nmg napkin/NgS napless/J napoleon/~NSg napped/VtT napper/NgS napping/V6SNw nappy/NSgV>J^ narc/NgSV narcissism/Nmg narcissist/NgS narcissistic/~JNQ narcissus/~Ng narcolepsy/Nmg narcoleptic/NgSJ narcoses/N9V narcosis/N0g narcotic/~NwSgJ narcotisation/Ng!_₹ narcotise/VGdS!_₹ narcotization/Ng narcotize/VGdS nark/NV narky/J narrate/VGdSnvX narration/~NwSg narrative/~JYNwSg narrator/~NSg narrow/~J^Y>pNgSVGd narrowness/Nmg narwhal/NgS nary/J nasal/~JYNSg nasalisation/NwSg!_₹ nasalise/VdSG!_₹ nasality/Nmg nasalization/NwSg nasalize/VdSG nascence/Ngr nascent/~Jr nastily/Ry nastiness/Nmg nasturtium/NSg nasty/~J^>pN natal/~J natalism/NmgK natalist/NSg natch/N nation/~NgS national/~JYNgS nationalisation/NSg!_₹ nationalise/VdSGe!_₹ nationalism/~Nmg nationalist/~JNSg nationalistic/~JQ nationality/~NSg nationalization/~Nmg nationalize/VdSGe nationhood/Nmg nationwide/~J native/~JYNgS nativism/Nmg nativist/JNSg nativity/~NSg natl/J natter/VGdSNmg nattily/Ry nattiness/Nmg natty/J^>pN natural/~JYpN0U natural's naturalisation/Ng!_₹ naturalise/VdSG!_₹ naturalism/~Nmg naturalist/~NSg naturalistic/~J naturalization/~Nmg naturalize/VdSG naturalness/NgU naturals/N9 nature/~NwSVe nature's naturism/Nmg naturist/NSgJ naught/INgS naughtily/Ry naughtiness/Nmg naughty/~J^>pV nausea/~Nmg nauseam # only used in the Latin phrase `ad nauseam` nauseate/VbGdS nauseating/JYV6 nauseous/JYp nauseousness/Nmg nautical/~JY nautilus/NgS naval/~J nave/~NgS navel/~NSgV navigability/Nmg navigable/~J navigate/~VdSGn navigation/~NwgS navigational/~J navigator/~NgS navvy/NSV navy/~NwSgJ nay/~NSgVJ naysayer/NgS ne'er/ neanderthal/~JNgS neap/NgSJV near/~JY^>pPVdGSN nearby/~JN nearness/Nmg nearshore/NV nearside/N nearsighted/JYp nearsightedness/Ng neat/~J>Y^pnX # removed `N` as in `the neats vs the scruffies` neaten/VGd neath/~P neatness/Ng nebula/~Ng nebulae/9 nebular/J nebulous/JYp nebulousness/Ng necessarily/~RyU necessary/~JNSg necessitate/VdSG necessitous/J necessity/~NSg neck/~NgSVdG neckband/NSV neckerchief/~NgS necking/V6Ng necklace/~NgSVGdz neckline/NgS necktie/NgS necrology/Nmg necromancer/NSg necromancy/Nmg necrophilia/Nmg necrophiliac/NS necropolis/~NgS necroses/N9V necrosis/~N0g necrotic/J nectar/~NmgV nectarine/NwgSJ nee/J need/~NwgSAdG needed/~JVU needful/JYN neediness/Nmg needle/~NgSVGd needlepoint/NmgV needless/~JYp needlessness/Nmg needlewoman/N0g needlewomen/N9 needlework/Nmg needn't/A needy/~J^>p nefarious/JYp nefariousness/Nmg neg/NJV negate/~VdSGnvX negation/~NwgS negative/~JYpNgSVGd negativeness/Nmg negativism/Nmg negativity/Nmg neglect/~VGdSNmg neglectful/JYp neglectfulness/Nmg negligee/NgS negligence/~Nmg negligent/~JY negligible/~J negligibly/Ry negotiability/Nmg negotiable/~JNr negotiate/~VdSGrn negotiation/~Nw0gr negotiations/~N9 negotiator/~NgS negritude/Ng negro/~JN negroid/JN neigh/N0gVbdG neighbor/~NSgVdGY< neighborhood/~NSg< neighborliness/Nmg< neighbour/NSgVGdY!@_₹ neighbourhood/NgS!@_₹ neighbourliness/Nmg!@_₹ neighs/N9Vh neither/~IC nelson/~NSg nematode/NSg nemeses/N9 nemesis/~N0g # neo # prefixes that are not also words in their own right don't belong in the dictionary neo-Nazi/NSgJ neo-Nazism/Ng neoclassic/J neoclassical/~JN neoclassicism/Nmg neoclassicist/JNgS neocolonial/J neocolonialism/Nmg neocolonialist/JNgS neocon/NSgJ neoconservatism/Ng neoconservative/~NSgJ neoconsolativism/Nmg neocortex/Ng neodymium/Nmg neofascist/JNgS neoliberal/JNSg neoliberalism/Nmg neolithic/~J neologism/~NwSg neon/~NmgJ neonatal/~J neonate/NgS neophilia/Nmg neophyte/NgS neoplasm/NgS neoplastic/J neoprene/Nmg neorealist/JNSg nepenthe/Ng nephew/~NSg nephrectomy/NgS nephrite/Ng nephritic/JN nephritis/Nmg nephropathy/~N nepotism/Nmg nepotist/NSg nepotistic/J neptunium/Nmg nerd/~NgS nerdy/J>^ nerve/~NSVdGU nerve's nerveless/JYp nervelessness/Nmg nerviness/Nmg nervous/~JYp nervousness/Nmg nervy/J^>p nest/~NgSVdG nestle/VGdSz nestling/NgV net/~NSgVJ netball/~NwSg netbook/NgS nether/~JVN nethermost/J netherworld/Ng netiquette/NS netizen/NgS netted/~VtT netter/NS netting/~NmgV6 nettle/NwgSVGd nettlesome/J network/~NSgVGd networking/~VNmg neural/~JY neuralgia/Nmg neuralgic/JN neurasthenia/Nmg neurasthenic/JNgS neuritic/JNgS neuritis/Nmg neurobiologist/NSg neurobiology/Nmg neurodegeneration/Nmg neurodivergent/J neurodiverse/J neurodiversity/Nmg neuroimaging/Nmg neurological/~JY neurologist/~NSg neurology/~Nmg neuron/~NgS neuronal/~J neurophysiology/Nmg neuroplasticity/Nmg neuropsychiatric/J neuroscience/~Nmg neuroscientist/~NSg neuroses/N9 neurosis/N0g neurosurgeon/NgS neurosurgery/NwgS neurosurgical/J neurotic/~JNgS neurotically/Ry neuroticism/Nmg neurotoxin/NwgS neurotransmitter/~NSg neut/J neuter/~JNgSVdG neutral/~JYNSg neutralisation/Nmg!_₹ neutralise/Vd>SGZ!_₹ neutraliser/Ng!_₹ neutralism/Nmg neutralist/JNSg neutrality/~Nmg neutralization/Nmg neutralize/~Vd>SGZ neutralizer/NgS neutrino/NSg neutron/~NSg never/~R8 # removed `V` verb sense is dialectal nevermore/~ nevertheless/~R nevi/N nevus/Ng new/~J^Y>pNSg newbie/~NgS newborn/~JNSg newcomer/~NSg newel/NSg newfangled/J newfound/~J newish/J newline/~NSg newlywed/NSgJ newness/Nmg news/~NmgV newsagent/NS newsboy/NSg newscast/~NSgV>Z newscaster/~NgS newsdealer/NSg newsfeed/NgS newsflash/NSg newsgirl/NSg newsgroup/~NgS newshound/NSg newsletter/~NgS newsman/N0g newsmen/N9 newspaper/~NwgSV newspaperman/N0g newspapermen/N9 newspaperwoman/N0g newspaperwomen/N9 newspeak/Nmg newsprint/~Nmg newsreader/NS newsreel/NgS newsroom/~NgS newsstand/~NSg newsweekly/NSg newswoman/N0g newswomen/N9 newsworthiness/Ng newsworthy/Jp newsy/J^>N newt/~NgS newton/~NgS next/~JPNg nexus/~NgS niacin/Nmg nib/NSgV nibble/VGd>SNgZ nibbler/Ng nice/~JY^>pN niceness/Nmg nicety/NSg niche/~NSgVdJ nick/~NgSVd>GZ nickel/~NgSJV nickelodeon/~NSg nicker/NgVdG nickle/NS nickname/~NSgVdG nicotine/Nwg niece/~NSg nifedipine/N niff/NV niffy/J nifty/J^>N nigga/NgSx niggard/JYNSgV niggardliness/Ng niggaz/Nx nigger/~NSgVx niggle/NgSVGd>Z niggler/Ng nigh/~J^>VP night/~NwSgV nightcap/NSgV nightclothes/Nmg nightclub/~NSgV nightclubbed/VtT nightclubbing/V6 nightdress/NgS nightfall/~Nmg nightgown/NSg nighthawk/~NSg nightie/NSg nightingale/~NSg nightlife/~Nmg nightlight/NS nightlong/J nightly/JR8 nightmare/~NSgV nightmarish/J nightshade/NwSg nightshirt/NSg nightspot/NgS nightstand/NSg nightstick/NSg nighttime/~NmgJ nightwatchman/N0 nightwatchmen/N9 nightwear/Nmg nihilism/Nmg nihilist/NgS nihilistic/J nil/~Ng nimbi/N nimble/J^>pV nimbleness/Nmg nimbly/Ry nimbus/Ng nimby/NJ nimrod/NgS nincompoop/NSg nine/~NgS ninepin/NgS ninepins/Ng nineteen/~SgH nineteenth/~JNg nineteenths/N ninetieth/JNg ninetieths/N ninety/~SHg ninja/~NSg09JV # singular and plural, also has a plural in -s ninny/NSg ninth/~JNgV ninths/N niobium/~Nmg nip/~VSNg nipped/VtT nipper/NgSV nippiness/Nmg nipping/V6N nipple/NgSV nippy/J^>p nirvana/~Ng nisei/Ng nit/~NSgV> niter/Ng nitpick/VSGd>Z nitpicker/Ng nitpicking/Ng nitrate/~NwSgVdGn nitration/Ng nitre/Ng!@_₹ nitric/~JN nitrification/Ng nitrite/NSg nitro/~NJ nitrocellulose/Ng nitrogen/~Nmg nitrogenous/J nitroglycerin/Nmg nitroglycerine/Nmg!@_₹ nitrous/~Ng nitwit/NgS nix/~NgSVGd no/~PNSgDq no-code/JNmg no-op/NgS # no operation nob/~NSVY nobble/VGdSN nobelium/Nmg nobility/~Ng noble/~NSgJ>^p nobleman/~Ng noblemen/~9 nobleness/Nmg noblewoman/~Ng noblewomen/9 nobody/~INSg nocturnal/~JYN nocturne/~NgS nod/~VSNg nodal/J nodded/VtT nodding/VtTNJ noddle/NgSV noddy/N node/~NgS nodular/J nodule/NgS noel/~NgS noes/N noggin/NgS nohow/ noise/~NwSgVdG noiseless/JYp noiselessness/Ng noisemaker/NgS noisily/Ry noisiness/Ng noisome/J noisy/~J^>p nomad/~NSgJ nomadic/~J nomenclature/~NgS nominal/~JYN nominalisation/Ng!_₹ nominalise/VSdG!_₹ nominalization/Ng nominalize/VSdG nominate/~VGdSJrenv nomination/~NSge nomination's/r nominative/~JNSg nominator/~NSge nominee/~NgS non/~N( non-Western/J nonabrasive/JN nonabsorbent/JSg nonacademic/JN nonacceptance/Ng nonacid/JN nonactive/JSg nonaddictive/J nonadhesive/J nonadjacent/J nonadjustable/J nonadministrative/J nonage/NgS nonagenarian/NgSJ nonaggression/Ng nonalcoholic/JN nonaligned/J nonalignment/Ng nonallergic/J nonappearance/NgS nonassignable/J nonathletic/J nonattendance/Ng nonautomotive/J nonavailability/Ng nonbasic/J nonbeliever/NgS nonbelligerent/JNgS nonbinding/J nonbreakable/JN nonburnable/J noncaloric/J noncancerous/J nonce/NgJ nonchalance/Nmg nonchalant/JY nonchargeable/J noncitizen/NgS nonclerical/JSg nonclinical/J noncollectable/J noncom/NgS noncombat/J noncombatant/NgS noncombustible/JN noncommercial/~JNgS noncommittal/JYN noncommunicable/J noncompeting/J noncompetitive/J noncompliance/Nmg noncomplying/JN noncomprehending/J nonconducting/J nonconductor/NgS nonconforming/J nonconformism/Nmg nonconformist/~NgSJ nonconformity/Nmg nonconsecutive/J nonconstructive/J noncontagious/J noncontinuous/J noncontributing/J noncontributory/J noncontroversial/J nonconvertible/J noncooperation/NgS noncorroding/J noncorrosive/J noncredit/J noncriminal/JNSg noncritical/J noncrystalline/J noncumulative/J noncustodial/J nondairy/J nondeductible/JNg nondelivery/NSg nondemocratic/J nondenominational/JN nondepartmental/J nondepreciating/J nondescript/JN nondestructive/J nondetachable/J nondeterminism/Nmg nondeterministic/J nondisciplinary/J nondisclosure/Ng nondiscrimination/Nmg nondiscriminatory/J nondramatic/J nondrinker/NgS nondrying/J none/~IN noneducational/J noneffective/JN nonelastic/J nonelectric/JN nonelectrical/JN nonempty/J nonenforceable/J nonentity/NSg nonequivalent/JSg nonessential/JN nonesuch/~NgS nonetheless/~R nonevent/NgS nonexchangeable/J nonexclusive/J nonexempt/JNg nonexistence/Ng nonexistent/~JN nonexplosive/JSg nonfactual/J nonfading/J nonfat/J nonfatal/JN nonfattening/J nonferrous/J nonfiction/~Nmg nonfictional/J nonflammable/JN nonflowering/J nonfluctuating/J nonflying/J nonfood/JNmg nonfreezing/J nonfunctional/J nongovernmental/J nongranular/J nonhazardous/J nonhereditary/J nonhuman/JN nonidentical/JN noninclusive/J nonindependent/J nonindustrial/J noninfectious/J noninfinite/JY noninflammatory/J noninflationary/J noninflected/J noninfringement/Nmg nonintellectual/JNgS noninteractive/J noninterchangeable/J noninterference/Ng nonintervention/Ng nonintoxicating/J noninvasive/J nonirritating/J nonissue/N nonjudgmental/J nonjudicial/J nonlegal/J nonlethal/JN nonlinear/~J nonliterary/J nonliving/Jg nonmagnetic/J nonmalignant/J nonmember/NgS nonmetal/NSg nonmetallic/J nonmigratory/J nonmilitant/JN nonmilitary/J nonmonetary/J nonnarcotic/JNSg nonnative/JNgS nonnegotiable/JN nonnuclear/J nonnumerical/J nonobjective/NJ nonobligatory/J nonobservance/Ng nonobservant/J nonobvious/J nonoccupational/J nonoccurence/N nonofficial/JN nonoperational/J nonoperative/JN nonparallel/JSg nonpareil/JNgS nonparticipant/JNgS nonparticipating/J nonpartisan/~JNSg nonpast/N nonpaying/J nonpayment/NwSg nonperformance/Nmg nonperforming/J nonperishable/JN nonperson/NgS nonphysical/JY nonplus/NSV nonplussed/JVtT nonplussing/V6J nonpoisonous/J nonpolitical/J nonpolluting/J nonporous/J nonpracticing/J nonprejudicial/J nonprescription/J nonproductive/J nonprofessional/JNSg nonprofit/~JNSgB nonproliferation/Nmg nonpublic/J nonpunishable/J nonracial/J nonradioactive/J nonrandom/J nonreactive/J nonreciprocal/JSg nonreciprocating/J nonrecognition/JNg nonrecoverable/J nonrecurring/J nonredeemable/J nonrefillable/J nonrefundable/J nonregulatory/J nonreligious/J nonrenewable/JN nonrepresentational/J nonresident/JNgS nonresidential/J nonresidual/Jg nonresistance/Ng nonresistant/JN nonrestrictive/J nonreturnable/JNgS nonrhythmic/J nonrigid/JN nonsalaried/J nonscheduled/J nonscientific/J nonscoring/J nonseasonal/J nonsectarian/JN nonsecular/J nonsegregated/J nonsense/~NmgVJ nonsensical/~JY nonsensitive/J nonsequential/JY nonsexist/JN nonsexual/J nonskid/J nonslip/J nonsmoker/NSg nonsmoking/J nonsocial/J nonspeaking/J nonspecialist/JNgS nonspecializing/J nonspecific/J nonspiritual/JSg nonstaining/J nonstandard/~JN nonstarter/NgS nonstick/J nonstop/~JN nonstrategic/J nonstriking/J nonstructural/J nonsubscriber/NgS nonsuccessive/J nonsupport/NgG nonsurgical/J nonsustaining/J nonsympathizer/NgS nontarnishable/J nontaxable/JN nontechnical/J nontenured/J nontheatrical/JN nonthinking/JN nonthreatening/J nontoxic/JN nontraditional/J nontransferable/J nontransparent/J nontrivial/J nontropical/J nonuniform/J nonunion/JN nonuser/NgS nonvenomous/J nonverbal/JN nonviable/J nonviolence/~Nmg nonviolent/~JY nonvirulent/J nonvocal/J nonvocational/J nonvolatile/J nonvoter/NgS nonvoting/J nonwestern/JNgS nonwhite/JNgS nonworking/J nonyielding/J nonzero/~JN noob/NgS noodle/~NmgSVGd nook/~NgSV nookie/N nooky/NJ noon/~NgV noonday/Ng noontide/Ng noontime/Ng noose/NSgV nootropic/NgSJ nope/NV nor/~CN nor'easter/N norm/~NgSV normal/~JYNgS normalcy/Ng normalisation/Ng!_₹ normalise/VdSG!_₹ normality/Ng normalization/~NOgr normalize/VdSGrn normative/~JYN normie/NSg north/~NgJ>VZ northbound/~J northeast/~NgJ>Z northeaster/NgY northeastern/~J northeastward/JS norther/~NgVJY northerly/~NSgJ northern/~J>NZ northerner/Ng northernmost/~J northward/~NSJ northwest/~NgJ>Z northwester/NgY northwestern/~JN northwestward/~JS nose/~NgSVGd nosebag/NgS nosebleed/NgS nosecone/NSg nosedive/NSgVdG nosegay/NSg nosh/NgSVd>GZ nosher/Ng nosily/Ry nosiness/Nmg nostalgia/~Nmg nostalgic/~JNQ nostril/NgS nostrum/NgS nosy/J^>pNV not/~RCN not-for-profit/JNgS notability/~NSg notable/~J notably/~R% # also focusing adverb notarial/J notarisation/N!_₹ notarise/VGdS!_₹ notarization/Ng notarize/VGdS notary/~NSg notate/VGdSJ notation/~NwSgWe notch/~NgSVGd notchback/NgS note/~NSVdGWe note's notebook/~NgS notelet/NS notepad/NgS notepaper/Nmg noteworthiness/Nmg noteworthy/~JpN nothing/~INSgJp nothingness/Nmg notice/~NgSVGd noticeable/~JU noticeably/~Ry noticeboard/~NgS noticed/~VU notifiable/J notification/~NwSg notifier/NgS notify/~Vd>SGnXZ notion/~NgS notional/JYN notoriety/~Nmg notorious/~JY notwithstanding/~CP nougat/NwgS nought/NgSJVRI!@_₹ noughties/9!_₹ noun/~NgSVK nourish/NSVdGL nourishment/~Nmg nous/~N nova/~NgS novae/9 novel/~JNSg novelette/~NSg novelisation/NwgS!_₹ novelise/VdSG!_₹ novelist/~NSg novelization/~NwgS novelize/VdSG novella/~NgS novelty/~NSgJ novena/~NgS novenae/N!@_₹ novene/J novice/~NgS novitiate/NgS now/~JCNgR nowadays/~g noway/S nowhere/~JNg nowise/ nowt/IN noxious/~J nozzle/~NgS nu/~NSgJ nuance/~NwgSVd nub/NSgV nubbin/NgS nubby/J^> nubile/JN nuclear/~JNK nucleate/JVdGSNn nucleation/NwgS nuclei/~N nucleic/~J nucleoli/N9 nucleolus/Ng nucleon/NSg nucleoside/N nucleotide/~N nucleus/~N0g nude/~J^>NgS nudge/NSgVGd nudism/Nmg nudist/NSgJ nudity/~Nmg nugatory/J nugget/~NSgV nuisance/~NgS nuke/~NgSVGd null/~NSJVdGB nullification/NwSg nullify/VdSGn nullity/Ng numb/~J^Y>pVGdSZ number/~NwSVdGJr number's numbered/~VU numberless/J numbing/JYV6 numbness/Nmg numbskull/NSg!@_₹ numerable/Ji numeracy/Ngi numeral/~NSgJ numerate/VGdSJXn numeration/Ng numerator/NgS numeric/~JN numerical/~JY numerologist/NgS numerology/Ng numerous/~JY numinous/J numismatic/~JS numismatics/~Ng numismatist/NSg numskull/NgS nun/~NSgI nuncio/~NSg nunnery/~NSg nuptial/~JSg nurse/~NgSVGd>Z nurselings/N nursemaid/NgSV nurser/Ng nursery/~NSg nurseryman/N0g nurserymen/N9 nursing/~JNmgV nursling/NSg nurture/~NSgVd>GZ nurturer/NgS nut/~NSgV nutbag/NgS nutcase/NS nutcracker/NgS nuthatch/NgS nuthouse/NgS nutmeat/NSg nutmeg/NwSgV nutpick/NSgV nutria/NSg nutrient/~NgSJ nutriment/NgS nutrition/~Nmg nutritional/~JY nutritionist/NSg nutritious/JYp nutritiousness/Nmg nutritive/JN nutsack/NgS nutshell/NgSV nutted/VtT nutter/NSg nuttiness/Nmg nutting/V6N nutty/~J>^p nuzzle/Vd>GSNgZ nuzzler/Ng nybble/NgS nylon/~NwgS nylons/N9g nymph/~N0gV nymphet/NgS nympho/NgS nymphomania/Nmg nymphomaniac/NSgJ nymphs/~N9V o'clock/R oaf/NSg oafish/JYp oafishness/Nmg oak/~NwSgJVn oakum/Ng oar/NSgVGd oarlock/NSg oarsman/N0g oarsmen/N9 oarswoman/N0g oarswomen/N9 oases/N9 oasis/~N0g oat/~N0Sgn oatcake/NwSg oath/~NgV oaths/~NV oatmeal/NgJ oats/~N9wg ob/NS obbligato/NgS obduracy/Ng obdurate/JYpV obdurateness/Ng obedience/~NmgE obedient/~JYNE obeisance/NSg obeisant/J obelisk/~NgSV obese/~JN obesity/~Nmg obey/~VdSGE obfuscate/VGdSJnX obfuscation/Nmg obi/~NSg obit/NgS obituary/~NSg obj/N object/~NSgVGdv object-oriented/J objectify/VGdSn objection/~NSgB objectionable/~JU objectionably/Ry objectivation/Ng objective/~JYpNSg objectiveness/Ng objectivism/~Nmg objectivity/~Nmg objectivization/Ng objectivize/VdSG objector/~NgS objurgate/VGdSXn objurgation/Ng oblast/~NSg oblate/NJVnX oblation/Ng obligate/VdSGJXn obligation/~NwgS obligatorily/Ry obligatory/~J oblige/VGdSE obliging/JYV6N obligor/NgS oblique/~JYpNSgV obliqueness/Nmg obliquity/Ng obliterate/VdSGJn obliteration/Ng oblivion/~NgV oblivious/~JYp obliviousness/Nmg oblong/~JNgSV obloquy/Ng obnoxious/~JYp obnoxiousness/Nmg oboe/~NgS oboist/NgS obscene/~JY^>V obscenity/~NwSg obscurantism/Nmg obscurantist/NSgJ obscure/~JY^>VdSG obscurity/~NmSg obsequies/N obsequious/JYp obsequiousness/Nmg obsequy/Ng observability/Nmg observable/JNgS observably/Ry observance/~NgS observant/~JY observation/~NwSg observational/~J observatory/~NSg observe/~Vd>GSNBZ observed/~VtTU observer/~NgS obsess/VdSGv obsession/~NSg obsessional/JY obsessive/~JYpNSg obsessiveness/Nmg obsidian/~NwgJ obsolesce/VdSG obsolescence/~Nmg obsolescent/J obsolete/~JVGdS obstacle/~NgS obstetric/JS obstetrical/J obstetrician/~NSg obstetrics/~Nmg obstinacy/Nmg obstinate/JY obstreperous/JYp obstreperousness/Ng obstruct/~VdGSv obstructed/~VU obstruction/~NwSg obstructionism/Nmg obstructionist/NgSJ obstructive/JYpN obstructiveness/Nmg obtain/~VdGSBL obtainable/JU obtainment/Nmg obtrude/VdSG obtrusion/NmgS obtrusive/JYpU obtrusiveness/NmgU obtuse/JY^>pV obtuseness/Nmg obverse/~JNSg obviate/VdGSNJn obviation/Nmg obvious/~JpU obviously/R # viewpoint or commenting adverb obviousness/Nmg ocarina/NgS occasion/~NgSVGd occasional/~JYN occidental/~JNSg occipital/~JNSg occlude/VGdS occlusion/~NSg occlusive/JN occult/~VJNg occultism/Ng occultist/~NSg occupancy/~Nwg occupant/~NSg occupation/~Nwgr occupational/~JY occupations/~N9 occupied/~JVU occupier/NSg occupy/~VdSGr occur/~VSr occurred/~VtTr occurrence/~NSg occurring/~V6NJr ocean/~NSg oceanfront/JNSg oceangoing/J oceanic/~Jg oceanographer/NSg oceanographic/~J oceanography/~Nmg oceanology/Ng ocelot/NgS och/~> ocher/NwgSJV< ochre/NwgSJV!@_₹ ocker/NSVJ octagon/~NgS octagonal/~J octal/NJ octane/~NwgS octave/~NgSVJ octavo/NgS octet/~NSg octogenarian/NSgJ octopus/~NwgSV ocular/~JNgS oculist/NSg oculomotor/J odalisque/NSg odd/~J^>YpNSL odd-numbered/J oddball/NSgJ oddity/NSg oddment/NSg oddness/Nmg odds/~N9g ode/~NSg odious/JYp odiousness/Nmg odium/~Nmg odometer/NgS odor/~NwgSd< odoriferous/J odorless/J< odorous/J odour/NwSgd!@_₹ odourless/J!@_₹ odyssey/~NgS oecus/N!@_₹ oedema/NgS!_₹ oedipal/J oenology/Ng oenophile/NSg oesophagi/N9!_₹ oesophagus/N0!@_₹ oestradiol/N!@_₹ oestrogen/NgS!_₹ oestrous/J!_₹ oestrus/NgS!_₹ oeuvre/~NgS of/~P of course/R off/~J>PVGdSNZz off-grid/J off-limits/J off-ramp/NgS off-road/NgS off-roader/NgS off-roading/Ng off-the-books/J offal/Nmg offbeat/~NgSJ offence/NwgS!@_₹ offend/~VGd>SZ offender/~NgS offense/~NwgS offensive/~JYpNi offensive's offensiveness/Nmgi offensives/~9 offer/~NgSVGdz offering/~NwgV offertory/NSg offhand/J offhanded/JYp offhandedness/Nmg office/~NgSV>Z officeholder/NSg officer/~NgSV official/~JYNgS officialdom/Nmg officialese/Nmg officialism/Ng officiant/NSg officiate/VdGSN officiation/Nwg officiator/NgS officious/JYp officiousness/Nmg offing/NgV6 offish/J offline/~JV offload/VdGSN offprint/NSgV offscreen/JR offset/~NgSVJ offsetting/V6Nm offshoot/~NgS offshore/~JVGN offside/JN offsite/JN offspring/~N09g offstage/~JVS offtrack/J oft/~ often/~R8^> # removed `J` adjective sense is archaic oftentimes/~ ofttimes/ ogle/~VGd>SNgZ ogler/NgS ogre/~NgS ogreish/J ogress/NgS oh/~NgSV ohm/NSg ohmmeter/NgS oho/ ohs/NV oi/~NI oik/NS oil/~NwSgVGd oilcan/NS oilcloth/N0wg oilcloths/N9 oiler/NgS oilfield/NS oiliness/Nmg oilman/N0g oilmen/9 oilskin/NwgS oily/J>^pN oink/NgSVdG ointment/~NwSg okapi/NSg okay/~NgSVGJ okayish/J okey-dokey/NgS okra/NgS old/~J^>pNgn old-fashioned/JN old-timey/J old-world/J oldie/NSg oldish/J oldness/Nmg oldster/NgS ole/~JSgv oleaginous/J oleander/NgS oleo/Ng oleomargarine/Ng olfactory/~JNSg oligarch/N0g oligarchic/J oligarchical/J oligarchs/N9 oligarchy/NSg oligonucleotide/NS oligopoly/NSg olive/~NwSgJ om/~NSgVnX ombudsman/~N0g ombudsmen/N9 omega/~NSgJ omelet/NwgS< omelette/NwgSV!@_₹ omen/~NgV omicron/~NgS ominous/~JYp ominousness/Nmg omission/~NwgS omit/~VS omitted/~VtT omitting/~VN6 # omni # prefixes that are not also words in their own right don't belong in the dictionary omnibus/~NgSJV omnidirectional/J omnipotence/Nmg omnipotent/JYN omnipresence/Nmg omnipresent/J omniscience/Nmg omniscient/JN omnivore/NgS omnivorous/~JYp omnivorousness/Nmg on/~JP # verb sense is nonstandard dialectal and interferes with linter heuristics on-off/J onboard/~JRVSdG once/~CNg once-in-a-lifetime/J oncogene/NSg oncologist/~NSg oncology/~Ng oncoming/~NJV one/~NSgIJpXn one another/Ig one-handed/J one-man/J one-off/J one shot/N one-shot/JNV one-sidedness/Nm one-tenth/N one-to-one/NJ one-way/J oneness/Ng onerous/JYp onerousness/Nmg oneself/~IF onetime/J onfield/J ongoing/~JNV onion/~NwgS onionskin/Nwg online/~JV onlooker/NSg onlooking/J only/~JR8C # also a focusing adverb onomatopoeia/Ng onomatopoeic/J onomatopoetic/J onrush/NgSVG onscreen/~J onset/~NgSV onshore/JVSdG onside/JN onsite/J onslaught/~NgS onstage/~J onto/~PJ ontogeny/Ng ontological/~J ontology/~Nwg onus/NgS onward/~JV onwards/R onyx/~NgSJ oodles/N9g ooh/NSVGd oolong/Nwg # tea oomph/NV oops/~NV oopsy/NgS ooze/NgSVGd oozy/J^> op/~NSgVdGJ opacity/Nwg opal/~NwgS opalescence/Nmg opalescent/J opaque/~JY^>pNSVGd opaqueness/Nmg opcode/NSg ope/~JVSN open/~J^Y>pVGdSNgZzB open source/Ng open-source/JVSdG opencast/J opened/~VJU opener/~NgS openhanded/JpV openhandedness/Nmg openhearted/J opening/~VSJNg openness/~Nmg openwork/Ng opera/~NgS operability/Nmg operable/Ji operand/NgS operate/~VdSGnvX operatic/~J operatically/Ry operation/~NwgS operational/~JY operationalize/VGdS operative/~JNSg operator/~NSg operetta/~NSg ophthalmic/~J ophthalmologist/~NSg ophthalmology/~Ng opiate/JNSgV opine/VGdSNnX opinion/~NwgS opinionated/VJ opioid/~NSg opium/~Nmg opossum/NgS opp/~PN opponent/~NSgJ opportune/JYi opportunism/Nmg opportunist/NSg opportunistic/~JQ opportunity/~NwSg oppose/~VdSG opposed/~JVtTU opposite/~JYNSgPnX opposition/~Nmg oppositional/J oppress/VbdSGv oppression/~Nmg oppressive/~JYp oppressiveness/Nmg oppressor/NgS opprobrious/JY opprobrium/Nmg opt/~VSGd opt in/V opt-in/J opt out/V opt-out/J optative/NSgJ optic/~JNgS optical/~JYNgS optician/NSg optics/~Ng optima/N9 optimal/~JYN optimisation/NwSg!_₹ optimise/Vd>SG!_₹ optimism/~NSg optimist/NSg optimistic/~JQ optimizable/J optimization/~NwgS optimize/~Vd>SG optimizer/NgS optimum/~NSgJ option/~NSgVdG optional/~JYN optionality/Nmg optometrist/NgS optometry/Ng opulence/Nmg opulent/JY opus/~NgS or/~CN # removed `5` adjective, rare heraldic usage; `+` preposition: archaic oracle/~NSgV oracular/J oral/~JYNgS orality/N orange/~NwSgJpV orangeade/NwgS orangery/NSg orangutan/NSg orate/VGdSJnX oration/~NwgV orator/~NSg oratorical/JY oratorio/~NgS oratory/~NSg orb/~NSgV orbicular/J orbit/~NgSVd>GZ orbital/~JNSg orbiter/~NgS orc/NSg orchard/~NSg orchestra/~NgS orchestral/~JN orchestrate/VdSGXn orchestration/~Ng orchestrator/NgS orchid/~NSgJ ordain/VSdGL ordainment/Nwg ordeal/~NSg order/~NwgSVdGEr order book/NgS ordered/~JVtTU orderings/~N9 orderliness/NmgE orderly/~JpNSg ordinal/~JNSg ordinance/~NSg ordinarily/~R8y ordinariness/Nmg ordinary/~NSgJp ordinate/~NgSVJnX ordination/~Nwg ordnance/~Ng ordure/Ng ore/~NSgP oregano/Nmg org/~NSg organ/~NgSV organdie/Ng!_₹ organdy/Ng organelle/NgS organic/~JRQi organisation/NwSgr!_₹ organisational/JY!_₹ organise/VSdGrE!_₹ organised/JVU!_₹ organiser/NgS!_₹ organism/~NgS organismic/J organist/~NgS organization/~NwSgr organizational/~JY organize/~VSdGrE organized/~JVU organizer/~NgS organoid/Sg organza/Ng orgasm/~NSgVdG orgasmic/J orgiastic/J orgy/NSg oriel/~NgS orient/~ONSJVdGrE orient's oriental/~JNgS orientalist/~NS orientate/VdSGEn orientation/~NwgrE orientations/~N orienteering/Ngm orifice/NgS orig/N origami/NgV origin/~NSg original/~JYNgS originality/~Nmg originate/~VdSGn origination/Ng originator/~NSg oriole/~NSg orison/NSg ormolu/NgJV ornament/~NSgVGd ornamental/~JN ornamentation/~NwSg ornate/~JYpV ornateness/Nmg orneriness/Nmg ornery/J>^p ornithological/~J ornithologist/~NgS ornithology/~Ng orotund/JN orotundity/NSg orphan/~NSgJVdG orphanage/~NgS orris/NgS orthodontia/Ng orthodontic/JS orthodontics/Ng orthodontist/NSg orthodox/~JU orthodoxy/~NSg orthogonal/~JN orthogonality/~N orthographic/~JQ orthography/~NwSgV orthopaedic/JS!@_₹ orthopaedics/Ng!@_₹ orthopaedist/NgS!@_₹ orthopedic/JS orthopedics/Ng orthopedist/NgS orzo/Ng oscillate/VGdSnX oscillation/~NgS oscillator/~NSg oscillatory/J oscilloscope/NgS osculate/VdSGJXn osculation/NgS osier/NgS osmium/Nmg osmosis/~Ng osmotic/J osprey/~NSg ossicles/N ossification/Ng ossify/VGdSn ostensible/J ostensibly/~Ry ostentation/Ng ostentatious/JY osteoarthritis/~Ng osteopath/NgS osteopathic/J osteopaths/N osteopathy/Ng osteoporosis/Ng ostler/NS ostracise/VGdS!_₹ ostracism/Ng ostracize/VGdS ostrich/~NgS other/~JpNgSV otherwise/~RJ otherworldly/J otiose/J otter/~NgS ottoman/~NgS oubliette/NgS ouch/NV ought/~INA oughtn't/A ounce/~NgS our/~D5 ours/~I ourself/Ia1F # I:pronoun a:personal 1:person .~singular F:reflexive (of the 'Royal We') ourselves/~Ia1F: # I:pronoun a:personal 1:person :~plural F:reflexive oust/~VGd>SZ ouster/~NgSV out/~PNSgVGd>JR(z out-and-out/J out of date outage/NSg outargue/VGdS outback/~NgSJV outbalance/VdSG outbid/VbtTS outbidding/V6 outboard/~JNgS outboast/VdSG outbound/~JN outbox/NgSV outbreak/~NgSV outbuilding/NgSV outburst/~VSNg outcast/~VSJNg outclass/VdSG outcome/~NgS outcrop/~NgSV outcropped/VtT outcropping/NSgV6 outcry/~NSgV outdated/~J outdid/V outdistance/VGdS outdo/VG outdoes/V outdone/V outdoor/~JVS outdoors/~NgV outdoorsman/NgS outdoorsmen/9 outdoorsy/J outdraw/VGS outdrawn/J outdrew/V outercourse/N outermost/~JN outerwear/Nmg outface/VGdS outfall/VSN outfield/~NSgV>Z outfielder/~NgS outfight/VSG outfit/~NSgV outfitted/~VtT outfitter/NgS outfitting/V6N outflank/VGSd outflow/~NgSV outfought/V outfox/VGdS outgo/VGNgz outgoes/V outgrew/V outgrow/VGSH outgrown/VT outgrowth/~N0g outgrowths/N9 outguess/VbGdS outgun/VS outgunned/VtTJ outgunning/V6 outhit/VbtTS outhitting/V6 outhouse/NSgV outing/~NgSV outlaid/V outland/JNgSVdG outlandish/JYpN outlandishness/Nmg outlast/VdSG outlaw/~NSgVGd outlay/NSgVG outlet/~NSg outlier/NS outline/~NgSVGd outlive/VGdS outlook/~NgSV outlying/~JN outmaneuver/VGdS outmanoeuvre/VdSG!@_₹ outmatch/VGdS outmoded/JV outnumber/VdG outnumbers/J outpace/VGdS outpaint/VGdS outpatient/~NgSJ outperform/VGSd outplace/VL outplacement/Ng outplay/VGdS outpoint/VdGSN outpost/~NgS outpouring/NgS outproduce/VdSG output/~NwSgVbtT outputted/VtT outputting/V6 outrace/VGdS outrage/~NgSVGd outrageous/~JY outran/Vt outrank/VGdS outre/J outreach/~NgSVdG outrider/NgS outrigger/NSg outright/~JV outro/NgS outrun/VbTSN outrunning/V6 outscore/VGdS outsell/VGS outset/~NSgV outshine/VGS outshone/V outshout/VGdS outside/~NmgSJ>PVZ outsider/~NgS outsize/JVSd outskirt/NgSV outsmart/VGdS outsold/V outsource/VdSG outsourcing/~VNg outspend/VSG outspent/VJ outspoken/~JYpV outspokenness/Nmg outspread/VGSJ outstanding/~VJY outstation/NgSJ outstay/VdGS outstretch/VdSG outstrip/VS outstripped/VtT outstripping/V6N outta/~P outtake/NgSVP outvote/VGdS outward/~JYVSN outwear/VGS outweigh/~VbGd outweighs/Vh outwit/VS outwith/P outwitted/VtT outwitting/V6 outwore/V outwork/Vd>GSNgZ outworn/VJ ouzo/NwgS ova/~N9P oval/~NgSJ ovarian/~J ovary/~NSg ovate/JNnX ovation/~NgV oven/~NgSV ovenbird/NSg ovenproof/J ovenware/Nmg over/~JYNgSP( overabundance/Ng overabundant/J overachieve/VGd>SZ overachiever/Ng overact/VGSdv overage/JVSNg overaggressive/J overall/~JNSg overalls/Ng overambitious/J overanalyze/VSdG overanxious/J overarching/~VJN overarm/JNSVGd overate/V overattentive/J overawe/VdSG overbalance/VGdSNg overbear/VGS overbearing/V6JY overbid/VSNg overbidding/V6N overbite/NgSV overblew/V overblow/VGS overblown/JV overboard/~JV overbold/J overbook/VdGS overbore/JV overborne/V overbought/J overbuild/VSG overbuilt/VJ overburden/VGdSN overbuy/VGS overcame/~V overcapacity/Ng overcapitalize/VdSG overcareful/J overcast/NgSJVG overcautious/J overcharge/VdGSNg overclock/VGdSN overcloud/VSGd overcoat/NgSV overcome/~VGS overcompensate/VdSGn overcompensation/Nmg overconfidence/Nmg overconfident/J overconscientious/J overcook/VdGS overcorrect/VGdS overcorrection/NwgS overcritical/J overcrowd/VSdG overcrowding/~VNg overdecorate/VdSG overdependent/J overdevelop/VSdG overdid/V overdo/VG overdoes/V overdone/JV overdose/~NgSVGd overdraft/NSgV overdraw/VGSN overdrawn/V overdress/VGdSNg overdrew/V overdrive/~VSNg overdriven/VJ overdub/VSNg overdubbed/VtT overdubbing/V6N overdue/~J overeager/J overeat/VGSn overemotional/J overemphasis/Ng overemphasise/V!_₹ overemphasize/VGdS overenthusiastic/J overestimate/VGdSNgn overestimation/Nmg overexaggerate/VGdS overexcite/VdSG overexercise/VGdSNm overexert/VSdG overexertion/Nmg overexplain/VGdS overexploit/VGdS overexpose/VGdS overexposure/Nmg overextend/VdGS overfed/JV overfeed/VGS overfill/VdGSN overfit/VS # one or two past forms? overfitted/VtTJ # is 'overfit' also a past form? overfitting/NgV6 overflew/V overflight/NgS overflow/~NgSVdG overflown/V overfly/VGS overfond/J overfull/JN overfund/VdGS overgeneralise/VdSG!_₹ overgeneralize/VdSG overgenerous/J overgraze/VdSG overgrew/V overground/~JNV overgrow/VSGH overgrown/~JV overgrowth/Nmg overgrowths/9 overhand/JNgSVd overhang/~VGSNg overhasty/J overhaul/~NgSVdG overhead/~JNgSP overhear/VSG overheard/~V overheat/VdGSN overhung/VtTJ overhype/VSGd overindulge/VGdS overindulgence/Ng overindulgent/J overinflate/VSdG overinvest/VGdSL overjoy/VGdSN overkill/~NgV overladen/JV overlaid/~V overlain/V overland/~JNV overlap/~VSNg overlapped/~VtT overlapping/~V6JN overlarge/J overlay/~VGdSNg overleaf/ overleveraged/J overlie/V overload/~VGdSNg overlong/J overlook/~NgSVGd overlord/~NgSV overly/~JSG overmanned/VtTJ overmanning/V6 overmaster/VSdG overmatch/VSdG overmodest/J overmuch/JNS overnice/J overnight/~JVdGSNg overoptimism/Ng overoptimistic/J overpaid/V overparticular/J overpass/~NgSV overpay/VGS overperform/VGdS overperformance/NgS overplay/VGdS overpopulate/VGdSn overpopulation/Ng overpower/~VSdG overpowering/VJYN overpraise/VdGSN overprecise/J overprepare/VGdS overprice/VdSG overprint/NSgVdG overproduce/VGdS overproduction/Nmg overpromise/VSGd overprotect/VSdGv overqualified/J overran/~V overrange/VGdSN overrate/VGdSN overreach/VGdSN overreact/VSdG overreaction/NwSg overread/JVSdG overrefined/VJ overregulate/VdSGn overreliance/Nmg overrepresent/VGdS overrepresentation/Nmg overridden/V override/~VGSNg overripe/Jg overrode/V overrule/VGdS overrun/~VSNg overrunning/V6 oversampling/VNmg oversaturate/VdSGn oversaw/~Vt oversea/JS overseas/JR oversee/~V>SZ overseeing/~V6 overseen/~VT overseer/~NgS oversell/VGS oversensitive/Jp oversensitiveness/Nmg oversexed/J overshadow/VdSG overshare/VdGSN overshoe/NgS overshoot/~NSVG overshot/VJN oversight/~NSgV oversimple/J oversimplification/NwgS oversimplify/VdSGnX oversize/JVdGSN oversized/J oversleep/VGS overslept/V oversold/J overspecialisation/Nmg!_₹ overspecialise/VGdS!_₹ overspecialization/Nmg overspecialize/VGdS overspend/VbGSN overspent/VJ overspill/NgSVdG overspray/NmSgVdG overspread/VGS overstaffed/VtT overstate/VdSGL overstatement/NgS overstay/VdGSN overstep/VSN overstepped/VtT overstepping/V6 overstimulate/VdSGnX overstock/VGdSN overstretch/VGdSN overstrict/J overstrung/J overstuffed/JVtT oversubscribe/VdSG oversubtle/J oversupply/VGdSNw oversuspicious/J overt/~JYN overtake/~VGSN overtaken/~VTJ overtax/VGdS overthink/VSG overthought/VtTN overthrew/~Vt overthrow/~VGSNg overthrown/~VT overtighten/VGdSN overtime/~NgSV overtire/VGdS overtone/NgSV overtook/~Vtg overture/~NgSVJ overturn/~VdGSN overuse/~VdGSNg overvaluation/NS overvalue/VdGSN overview/~NgSV overvolt/VdSG overvoltage/Ng overweening/JYNV overweight/~JNgV overwhelm/~VGdSN overwhelming/~V6JYN overwind/VGS overwinter/VSdGJ overwork/VGdSNg overwound/VtT/J overwrite/VGSN overwritten/VT overwrote/Vt overwrought/VJ overzealous/JY oviduct/NSg oviparous/J ovoid/JNgS ovular/JN ovulate/VdSGJn ovulation/~NwSg ovule/NgS ovum/Ng ow/~ owe/~VdSG owl/~NSgV owlet/NgS owlish/JY own/~JVGdSNE owner/~NgS ownership/~Nmg ox/~Ngn oxalate/~NV oxalis/NgS oxblood/NgJ oxbow/~NgS oxcart/NSg oxford/~NSg oxidant/NgS oxidase/~N oxidation/~Ng oxidative/~J oxide/~NgS oxidisation/Ng!_₹ oxidise/VGd>SZ!_₹ oxidiser/Ng!_₹ oxidization/Ng oxidize/VGd>SZ oxidizer/~Ng oxtail/NS oxyacetylene/NgJ oxycodone/Ng oxygen/~Nmg oxygenate/VdSGn oxygenation/Ng oxymora/N oxymoron/Ng oxymoronic/J oyster/~NSgJV oz/~N ozone/~NgV p/~PNV>G^nXz p.m./ pH/ pa/~NSgH pablum/Ng pabulum/Ng pace/~NgSJ>VGdPZ pacemaker/~NSg pacer/Ng pacesetter/NSg pacey/J pachyderm/NgS pachysandra/NgS pacific/~J pacifically/Ry pacification/Nmg pacifier/Ng pacifism/~Nmg pacifist/~NSgJ pacifistic/J pacify/VGd>SZn pack/~NSVGdrU pack's package/~NSVGdr package's packager/NSg packaging/~VNmg packer/~NgS packet/~NgSV packetize/VSdG packing's packinghouse/NSg packsaddle/NgS pact/~NgSV pacy/J>^ pad/~NSgV padded/~JVtT padding/~V6Ng paddle/~NgSVGd>Z paddler/Ng paddock/~NgSVdG paddy/~NSgJ padlock/NgSVdG padre/~NSg paean/NSgV paediatric/J!@_₹ paediatrician/NgS!@_₹ paediatrics/Nmg!@_₹ paedophile/NS!@_₹ paedophilia/Nm!@_₹ paella/NwgS pagan/~JNSg paganism/~Nmg page/~NgSVGd>Z pageant/~NgSV pageantry/Nmg pageboy/NSg pager/NgS paginate/VdSGn pagination/Nmg pagoda/~NgS pah/~N paid/~VtTJrU pail/NgS pailful/NSg pain/~NwgSVdG painful/~JYp painfuller/Jc painfullest/Ju painfulness/Nmg painkiller/NgS painkilling/J painless/JYp painlessness/Ng painstaking/JYNg paint/~NwSgVGd>Zz paintball/NV paintbox/NgS paintbrush/NgS painted/~VJU painter/~NgY painting/~VNwg paintless/J paintwork/Ng pair/~NgSVdGr paired/~VU pairing/~NSV pairwise/J paisley/~NSgJ pajama/NS pajamas/Ng pal/~NSgVY palace/~NgSV paladin/NSg palaeolithic/J!_₹ palaeontologist/NgS!_₹ palaeontology/Ng!_₹ palanquin/NSg palatable/JU palatal/~JNSg palatalisation/Ng!_₹ palatalise/VGdS!_₹ palatalization/Ng palatalize/VGdS palate/~NgSVB palatial/~JY palatinate/~NgSJ palatine/~JNgS palaver/NSgVGd palazzi/N9 palazzo/~N0 pale/~JY^>pVGdSNgz paleface/NgS paleness/Ng paleo/~N paleographer/NgS paleography/Nmg paleolithic/~J paleontologist/~NSg paleontology/~Ng palette/~NSg palfrey/NSg palimony/Ng palimpsest/NgSV palindrome/NgS palindromic/JN paling/VNg palisade/~NSgV palish/J pall/~NgSVdG palladium/~Ng pallbearer/NgS pallet/~NgSV palletize/VSdG palliate/VdSGJnv palliation/Ng palliative/JNSg pallid/JYp pallidness/Ng pallor/Ng palm/~NgSVdG palmate/NJ palmetto/NSg palmist/NSg palmistry/Nmg palmtop/NSg palmy/J^> palomino/NgS palpable/J palpably/Ry palpate/VdSGJn palpation/Ng palpitate/VGdSXn palpitation/Ng palsy/~NSgVGdJ paltriness/Nmg paltry/J>^p pampas/Ng pamper/VdGSN pamphlet/~NgSV pamphleteer/NgSV pan/~NSgVJ( panacea/NSg panache/Ng panama/~NgS panatella/NS pancake/~NSgVdG panchromatic/J pancreas/~NgS pancreatic/~J pancreatitis/~N panda/~NSg pandemic/~JNSg pandemonium/NwgS pander/NgSVd>GZ panderer/Ng pandimensional/J pane/~N0gVK panegyric/NSgJ panel/~NSgVGdz paneling/VNg panelist/~NgS panelled/JVtT!@_₹ panelling/NSgV6!@_₹ panellist/NSg!@_₹ panes/~N9 pang/~NgSV panhandle/~NSgVd>GZ panhandler/NgS panic/~JNwSgV panicked/VtTJ panicking/V6N panicky/J panned/~VtT pannier/NSg panning/~NV6 panoply/NSgV panorama/~NSg panoramic/~JN panpipes/Ng pansy/~NSgJV pant/~NgSVdG pantaloons/Ng pantechnicon/NS pantheism/Ng pantheist/NSgJ pantheistic/J pantheon/~NSg panther/~NgS pantie/NgS panto/NS pantomime/~NgSVGd pantomimic/J pantomimist/NSg pantry/~NSg pantsuit/NSg pantyhose/~Ng pantyliner/Ng pantywaist/JNSg pap/~NSgVJ papa/~NgS papacy/~NwSg papal/~J paparazzi/Nm9g paparazzo/N0 papaya/~NwgS paper/~NwSgJ>VGdZ paperback/~NSgJV paperbark/NwS paperboard/Nmg paperboy/NSg paperclip/NSV paperer/Ng papergirl/NSg paperhanger/NSg paperhanging/Ng paperless/J paperweight/NgS paperwork/~Nmg papery/J papilla/N0g papillae/~N9 papillary/~J papist/NgSJ papoose/NgS pappy/JNSg paprika/~NmgJ papyri/~N9 papyrus/~N0g par/~NSgJ>PVGdZBz para/~NgSJ( parable/~NgSVJ parabola/N0Sg parabolæ/N9 parabolae/N9 parabolic/~JN paracetamol/NS parachute/~NSgVdG parachutist/~NgS parade/~NgSVGd>Z parader/Ng paradigm/~NSg paradigmatic/JNQ paradisaical/J paradise/~NSgV paradox/~NgS paradoxical/JY paraffin/NwgV paragliding/~NV paragon/~NgSV paragraph/~NgVGd paragraphs/~N parakeet/~NSg paralegal/NgS parallax/~NgSV parallel/~JNSgVGd paralleled/~VtTU parallelisation/NwSg!_₹ parallelised/J!_₹ parallelism/NgS parallelization/NwSg parallelize/VdSGB parallelogram/~NSg paralyse/VdSG!_₹ paralyses/NV paralysing/JYV!_₹ paralysingly/Ry@ paralysis/~Nmg paralytic/NSgJ paralyze/VdSG paralyzing/JYV param/NgS paramagnetic/J paramecia/N9 paramecium/N0g paramedic/NgS paramedical/JNgS parameter/~NgS parameterisation/Nmg!_₹ parameterise/Vd!_₹ parameterization/Nmg parameterize/Vd parametric/~JN paramilitary/~NSgJ paramount/~JN paramountcy/N paramour/NSgV paranoia/~Nmg paranoiac/JNgS paranoid/~JNSg paranormal/~JN parapet/~NgS paraphernalia/~Ng paraphrase/~NSgVdG paraplegia/Ng paraplegic/JNSg paraprofessional/NgSJ parapsychologist/NgS parapsychology/Ng paraquat/Ng parasailing/NV parascending/N parasite/~NSgV parasitic/~JN parasitical/JY parasitism/Ng parasitize/VdSG parasitoid/NgS parasocial/J parasol/NgSV parasympathetic/~JNS parathion/Ng parathyroid/JNgS paratroop/NSV>Z paratrooper/Ng paratroops/NgV paratyphoid/JNg parboil/VdSG parcel/~NgSVGd parcelled/VtT!@_₹ parcelling/V6N!@_₹ parch/VGdSNL parchment/~NwSg pardner/NS pardon/~NgSVGd>ZB pardonable/JU pardonably/RyU pardoner/Ng pare/VS paregoric/NgJ paren/NgS # informal: parenthesis parent/~NgSVGd parentage/~Ng parental/~JN parentheses/~N9 parenthesis/N0g parenthesise/V!_₹ parenthesize/VdSG parenthetic/J parenthetical/JYN parenthood/Nmg parenting/~NgV6 parer/Ng pares/VhS paresis/Ng parfait/NgS pari passu/RJ pariah/N0g pariahs/N9 paribus parietal/~JN parimutuel/NgS paring/VNg parish/~NgSV parishioner/NgS parity/~NSgE park/~NgSVdG parka/NSg parking/~V6Ng parkland/~N parkour/NV parkway/~NgS parky/JN parlance/~Ng parlay/VGdSNg parley/NgSVGd parliament/~NwSg parliamentarian/~NSgJ parliamentary/~JN parlor/~NgS parlour/NgS!@_₹ parlous/J parmigiana/JN parochial/~JYN parochialism/Nmg parodist/NSg parody/~NwSgVGd parole/~NgSVGd parolee/NgS parotid/JN paroxysm/NSg paroxysmal/J parquet/NgSVdG parquetry/Ng parred/VtT parricidal/J parricide/NwgS parring/V6 parrot/~NgSVGd parry/~VGdSNg parsable/J parse/~Vd>GSN^ parsec/NgS parser/~NSg parsimonious/JY parsimony/Ng parsley/~NgV parsnip/NwgS parson/~NgS parsonage/~NgS part/~NSVdGJe part of speech/N0g part-time/J part's partake/~VG>SZ partaken/VT partaker/Ng parterre/NSg parthenogenesis/Nmg partial/~JYNgSV partiality/Nmg participant/~NSgJ participate/~VdSGJn participation/~Nmg participator/NgS participatory/~J participial/JNg participle/~NgS particle/~NSg particleboard/Nmg particular/~JYNSg particularisation/Ng!_₹ particularise/VdSG!_₹ particularity/NSg particularization/Ng particularize/VdSG particulate/~JNSg partier/NgS parting/~NwgSV partisan/~NSgJ partisanship/~Nmg partition/~NwgSVGd partitive/JNgS partly/~R% partner/~NgSVdG partnership/~NwgS partook/Vt partridge/~NSg parts of speech/N9 parturition/Nmg partway/ party/~NSgVGdJ parvenu/NgSJ pascal/~NgS # cf. Pascal, PASCAL paschal/~J pasha/~NSg pass/~VNg passably/Ry% passage/~NgSVJ passageway/~NgS passbook/NgS passe/~J>VdSGBXZnv passel/NgS passenger/~NSgV passer/~NgS passerby/N0g passersby/N9 passim/~RJ passing/~V6JYNg passion/~NmgVE passionate/~JYNVE passionflower/NSg passionless/J passivation/Nmg passive/~JYpNgS passiveness/Nmg passivisation/N!_₹ passivity/Nmg passivization/Nmg passivize/VdSG passkey/NgS passphrase/NgS passport/~NgSV password/~NgSV passwordless/J past/~NgSJPVr pasta/~NwSg paste/~NwSgVdG pasteboard/NwgSJ pastel/~NgS pastern/NgS pasteurisation/Nmg!_₹ pasteurise/VGd>SZ!_₹ pasteurised/VU!_₹ pasteuriser/NgS!_₹ pasteurization/Nmg pasteurize/VGd>SZ pasteurized/VU pasteurizer/NgS pastiche/~NgSV pastie/NgS pastille/NgS pastime/~NgSV pastiness/Nmg pastor/~NgSV pastoral/~JNgS pastorate/NgS pastrami/Nmg pastry/~NwSg pasturage/Nmg pasture/~NwSgVdG pastureland/Nmg pasty/J^>pNSg pat/~NSgVJ patch/~NgSVGdE patchily/Ry% patchiness/Nmg patchouli/N patchwork/~NwSgV patchy/J^>p pate/~NgS patella/N0gS patellae/N9 patent/~NgSVGdJY paterfamilias/NgS paternal/~JY paternalism/Nmg paternalist/JNgS paternalistic/J paternity/~Nmg paternoster/NgSV path/~N0gV pathetic/~J pathetically/Ry pathfinder/~NSg pathless/J pathname/NgS pathogen/~NSg pathogenic/~J pathological/~JY pathologist/~NSg pathology/~NgS pathos/~Nmg paths/~N9V pathway/~NgS patience/~Nm☁g patient/~J^NgSi patienter/Jc patiently/Ry patina/N0gSJ patinae/N9!@_₹ patine/NV patio/~N0Sg patisserie/NS patois/N9g patresfamilias/N patriarch/~N0g patriarchal/~J patriarchate/~NgS patriarchs/~N9 patriarchy/~NSg patrician/~NSgJ patricidal/J patricide/NwSg patrimonial/J patrimony/NSg patriot/~NSg patriotic/~JNU patriotically/Ry patriotism/~Nmg patrol/~NgSV patrolled/~JVtT patroller/NgS patrolling/~V6N patrolman/N0g patrolmen/N9 patrolwoman/Ng patrolwomen/9 patron/~NgSV patronage/~NgSV patroness/NgSV patronise/VGd>SZ!_₹ patroniser/Ng!_₹ patronising/JYV!_₹ patronize/VGd>SZ patronizer/Ng patronizing/JYV patronymic/~JNSgQ patroon/NSg patsy/~NSg patted/VtT patter/NgSVdG pattern/~NSgVdGJ patting/NV6 patty/~NSgJ paucal/NJ paucity/Ng paunch/NgSV paunchy/J>^ pauper/NgSV pauperise/VdSG!_₹ pauperism/Ng pauperize/VdSG pause/~VdGSNg pave/~VGdSr paved/~JVU pavement/~NgS pavilion/~NSgV paving/~VSNgJ pavlova/~NS paw/~NSgVGd pawl/NgSV pawn/~NgSVdG pawnbroker/NgS pawnbroking/Nmg pawnshop/NgS pawpaw/NwgS pay/~VGSNJrBL pay out/V/ pay's payback/NmSg paycheck/~NgS payday/NgS payed/V payee/NSg payer/NSg payload/~NSg paymaster/~NSg payment/~NwSgr payoff/~NgS payola/Nmg payout/~NgS payphone/NS payroll/~NSgVdG payslip/NSg paywall/NSgV payware/Nmg pct/~N pd/~ pea/~NSg peace/~Nw☁SgV peaceable/J peaceably/Ry peaceful/~JYpN peacefulness/Ng peacekeeper/NSg peacekeeping/~Ng peacemaker/~NgS peacemaking/~Ng peacetime/~Ng peach/~NwgSJV peachy/J^> peacock/~NgSV peafowl/NgS peahen/NgS peak/~NgSVdGJ peaky/J peal/~NgSVdGr peanut/~NgSV pear/~NgS pearl/~NSgVGd pearlescent/J pearly/NJ>^ peasant/~NSgJ peasantry/~NwgS peashooter/NSg peat/~Ng peaty/J^> pebble/~NgSVGd pebbly/J pecan/~NSg peccadillo/N0g peccadilloes/N9 peccary/NSg peck/~Vd>GSNgZ peckish/J pecs/N pectic/J pectin/Ng pectoral/~JNgS pectoralis/N peculate/VGdSn peculation/Ng peculator/NSg peculiar/~JYN peculiarity/NSg pecuniary/J pedagogic/J pedagogical/~JY pedagogue/~NSgV pedagogy/~Ng pedal/~NSgVGdJ pedalled/VtT!@_₹ pedalling/V6N!@_₹ pedalo/NS pedant/NgSJV pedantic/JQ pedantry/Ng peddle/VGd>SZ peddler/~Ng pederast/NgS pederasty/Ng pedestal/~NgSV pedestrian/~JNSg pedestrianisation/N!_₹ pedestrianise/VGdS!_₹ pedestrianization/N pedestrianize/VGdS pediatric/~J< pediatrician/NgS< pediatrics/~Nmg< pedicab/NSg pedicure/NgSVGd pedicurist/NgS pedigree/~NgSJVd pediment/~NgS pedlar/NgS!_₹ pedometer/NgS pedophile/NS< pedophilia/Nm< peduncle/NgS pee/~NmSgVd>Z peeing/V6 peek/~VdGSNg peekaboo/NgJV peel/~Vd>GSNwgzZ peeled/JVtTU peeler/Ng peeling/NgV6 peen/NgSV peep/~NgSVd>GZ peepbo/N peeper/Ng peephole/NgS peepshow/NgS peer/~VdGNg peer review/NgSdG peer-reviewed/J peerage/~NSg peeress/NgS peerless/~J peeve/NSgVdG peevish/JYp peevishness/Ng peewee/NgS peewit/NS peg/~NSgV pegboard/NgSV pegged/~VtTJ pegging/NV6 peignoir/NSg pejoration/Ng pejorative/~JYNSg peke/NgS pekineses pekingese/Sg pekoe/Ng pelagic/~JN pelf/Ng pelican/~NgS pellagra/Ng pellet/~NgSVGd pellucid/JN pelmet/NS peloton/NSg pelt/~NgSVdG pelvic/~JN pelvis/~NgS pemmican/Ng pen/~NgV pen test/NgS penal/~J penalisation/Ng!_₹ penalise/VdSG!_₹ penalization/Ng penalize/VdSG penalty/~NSg penance/~NgSV pence/~N9 penchant/~NSg pencil/~NgSVGdz pencilled/VtTJ!@_₹ pencilling/V6SN!@_₹ pend/VdGSNe pendant/~NgS pendent/~JNgS pendulous/J pendulum/~NgS penetrability/Nmg penetrable/J penetrant/NwSg penetrate/~VdSGnvX penetrating/~JYV penetration/~Nwg penfriend/NgS penguin/~NgS penicillin/~Nmg penile/J peninsula/~NSg peninsular/~JN penis/~NgS penitence/Nmg penitent/JYNSg penitential/JN penitentiary/~NSgJ penknife/N0gV penknives/N9 penlight/NSg penman/NgS penmanship/Nmg penmen/9 pennant/~NgS penned/~VtTJ penniless/J penning/~V6N pennon/NgS penny/~NSgV pennyweight/NgS pennyworth/N penologist/NgS penology/Ng pension/~NgSVGd>BZ pensioner/Ng pensive/JYp pensiveness/Nmg pent/NJV pentacle/NgS pentagon/~NgS pentagonal/~JN pentagram/~NSg pentameter/NSg pentathlete/NgS pentathlon/~NgS penthouse/~NSgV penuche/Ng penultimate/~JNSg penumbra/NgS penumbrae/9 penurious/JYp penuriousness/Ng penury/Ng peon/NgS peonage/Ng peony/NSg people/~N9gSVGd pep/~VSNg pepped/VtT pepper/~NwgSVGd peppercorn/NSg peppermint/~NwSg pepperoni/NwgS peppery/J peppiness/Ng pepping/V6 peppy/J^>pN pepsin/Ng peptic/JNgS peptide/~NS # per # prefixes that are not also words in their own right don't belong in the dictionary per annum per capita/JR per diem/JNgS per se/JR peradventure/Ng perambulate/VGdSXn perambulation/Nwg perambulator/NgS percale/NgS perceive/~VGdSB perceived/~JVtTU percent/~NgS percentage/~NwSg percentile/NSg perceptible/JN perceptibly/Ry perception/~NwSg perceptional/J perceptive/JYp perceptiveness/Ng perceptron/Sg perceptual/~JY perch/~NgSVGd perchance/ percipience/Ng percipient/JN percolate/VGdSNn percolation/Ng percolator/NSg percussion/~Ngr percussionist/~NgS percussive/JN perdition/Nmg perdurable/J peregrinate/VdSGJXn peregrination/Ng peregrine/~JNgS peremptorily/Ry peremptory/JN perennial/~JYNSg perestroika/~Nmg perfect/~J^Y>pNgSVGd perfecta/NgS perfectibility/Nmg perfectible/J perfection/~NwSgV perfectionism/Nmg perfectionist/NSgJ perfective/NSgJ perfectness/Nmg perfidious/JY perfidy/NSg perforate/VGdSJnX perforation/NwSg perforce/V perform/~VSd>GZ performance/~NwSg performant/J performative/JYN performed/~VtTU performer/~NgS perfume/~NwSgVd>GZ perfumer/NgS perfumery/NSg perfunctorily/Ry perfunctory/J perfusion/~N pergola/~NSg perhaps/~RN # adverb of probability/certainty/affirmation; modal adverb pericardia/N9 pericardial/J pericarditis/N pericardium/N0g perigee/NSg perihelia/N9 perihelion/N0g peril/~NwSgVGd perilled/VtT!@_₹ perilling/V6!@_₹ perilous/~JY perimeter/~NSg perinatal/J perinea/N9 perineum/N0g period/~NgSJV periodic/~J periodical/~NSgJY periodicity/Ng periodontal/~J periodontics/Nmg periodontist/NSg peripatetic/JNgS peripheral/~JYNgS periphery/~NSg periphrases/VN9 periphrasis/N0g periphrastic/J periscope/NSgV perish/~Vd>SGBZ perishable/JNgS peristalses/N9 peristalsis/N0g peristaltic/J peristyle/NSg peritoneal/J peritoneum/NgS peritonitis/Ng periwig/NSgV periwinkle/NSgJ perjure/Vd>GSNZ perjurer/NgW perjury/~NwSg perk/NgSVdGJ perkily/Ry perkiness/Nmg perky/~J^>pN perm/~NgSVdG permafrost/~Ng permanence/Nmg permanency/Nmg permanent/~JYNSg permeability/~Ng permeable/~J permeate/VGdSNn permeation/Ng permissible/~J permissibly/Ry permission/~NgSV permissive/~JYp permissiveness/Nmg permit/~VSNg permitted/~VtTJ permitting/~V6N permittivity/N permutation/~NSg permute/VdSG pernicious/JYp perniciousness/Nmg peroration/NgS peroxide/~NgSVGd perpendicular/~JYNSg perpendicularity/Ng perpetrate/VdSGn perpetration/Ng perpetrator/~NgS perpetual/~JYNSg perpetuate/~VdSGJn perpetuation/Ng perpetuity/~Ng perplex/VGdSJN perplexed/~JYV perplexing/JYV perplexity/NwSg perquisite/NSg persecute/VGdSnX persecution/~Nmg persecutor/NSg perseverance/~Nmg persevere/~VdSG persiflage/Ng persimmon/NwSg persist/~VSGd persistence/~Nmg persistency/Nmg # uncommon variant persistent/~JY persnickety/J person/~NgSVU persona/~N0Sg personable/J personae/N9 personage/NgS personal/~JYNgS personalisation/NwgS!_₹ personalise/VdSGe!_₹ personality/~NwSg personalization/NwgS personalize/VdSGe personalty/Nmg personification/~Nmg personify/VGdSnX personnel/~Nmg perspective/~NgSJ perspex/Nmg perspicacious/JY perspicacity/Nmg perspicuity/Ng perspicuous/J perspiration/Nmg perspire/VGdS persuade/~VGd>SBZ persuaded/~VU persuader/Ng persuasion/~NSg persuasive/~JYpN persuasiveness/Ng pert/~JY^>pVN pertain/~VGSd pertinacious/JY pertinacity/Ng pertinence/Ng pertinent/~NJY pertness/Ng perturb/VdGS perturbation/~NSg perturbed/~VJU pertussis/Ng peruke/NgS perusal/NgS peruse/VGdS>N perv/~NSV pervade/VdSG pervasive/~JYp pervasiveness/Ng perverse/~JYpNVXn perverseness/Ng perversion/Ng perversity/Ng pervert/NSgVGd pervs/N9Vh!@_₹ peseta/NgS peskily/Ry peskiness/Ng pesky/J^>p peso/~NgS pessary/NS pessimal/J pessimism/Nmg pessimist/NSg pessimistic/~J pessimistically/Ry pest/~NgS>Z pester/VGdN pesticide/~NwgS pestiferous/J pestilence/~NSg pestilent/J pestilential/J pestle/NgSVGd pesto/Ng pet/~NSgV>JZ petabyte/NgS petajoule/NS petal/NSgVd petalled/J!@_₹ petard/NgSV petawatt/NS petcock/NSg peter/~NgVGd petiole/NSg petite/~JNgS petition/~NgSVGd>Z petitionary/J petitioner/NgS petrel/~NgS petrifaction/Nmg petrify/VdSG petrochemical/~NSgJ petrodollar/NgS petrol/~NwgV petrolatum/Ng petroleum/~Nwg petrologist/NSg petrology/Nmg petted/VtT petticoat/~NgSVJ pettifog/VS pettifogged/VtT pettifogger/NSg pettifoggery/Ng pettifogging/V6N pettily/Ry pettiness/Nmg petting/V6Nmg pettish/JY petty/~J^>pN petty bourgeois/Ng petty bourgeoisie/Ng petulance/Nmg petulant/JY petunia/~NgSJ pew/~NSgV pewee/NSg pewit/NSg pewter/NgSJV peyote/Ng pf/~N pfennig/NgS pg/~ phaeton/NgS phage/~NS phagocyte/NSgV phalanger/NSg phalanges/N phalanx/~NgS phalli/N phallic/J phallocentric/J phallocentrism/N phallus/Ng phantasm/~NgS phantasmagoria/NgS phantasmagorical/J phantasmal/J phantom/~NSgJ pharaoh/~Ng pharaohs/~N pharisaic/J pharisee/Sg pharmaceutic/JSg pharmaceutical/~JNSg pharmaceutics/Ng pharmacist/~NgS pharmacologic/JN pharmacological/~J pharmacologist/NSg pharmacology/~Ng pharmacopoeia/NgS pharmacotherapy/N pharmacy/~NSg pharyngeal/~JN pharynges/N9 pharyngitis/Ng pharynx/~N0g phase/~NOSgVdG phaseout/NSg phaser/NgS phat/J pheasant/~NgS phenacetin/~Ng phenethylamine/Ng phenobarbital/Ng phenol/~Ng phenom/NgS phenomena/~N phenomenal/~JY phenomenological/~JY phenomenology/~N phenomenon/~NgS phenotype/~NV phenytoin/N pheromone/~NgS phew/ phi/~NSg phial/NSgV philander/NSVGd>Z philanderer/Ng philandering/VNg philanthropic/~J philanthropically/Ry philanthropist/~NgS philanthropy/~NSg philatelic/~J philatelist/NgS philately/Nmg philharmonic/~JNSg philippic/~NgS philistine/~NgSJ philistinism/Nmg philodendron/NSg philological/~J philologist/~NgS philology/~Nmg philosopher/~NgS philosophic/J philosophical/~JY philosophise/Vd>SGZ!_₹ philosophiser/NgS!_₹ philosophize/Vd>SGZ philosophizer/NgS philosophy/~NwSgV philter/NgSV< philtre/NgSV!@_₹ phish/~VGd>NZ phisher/Ng phlebitis/Nmg phlegm/Nmg phlegmatic/JNQ phloem/Nmg phlogiston/Nmg phlox/Ng phobia/NgS phobic/JNgS phoebe/~NgS phoenix/~NgSVdG phone/~NSgVdG phonecard/NgS phoneme/~NgS phonemic/~JQ phonetic/~JNSQ phonetician/NSg phonetics/~Nmg phoney/JNgSVGd!_₹ phoneyed/V phoneying/V phonic/JS phonically/Ry phonics/Nmg phonied/V!_₹ phonier/Jc!_₹ phoniest/Ju!_₹ phoniness/Nmg phonograph/~N0gV phonographic/J phonographs/N9 phonological/~JY phonologist/NgS phonology/~Nmg phonon/~N phonotactic/JQ phonotactics/Nm phony/J^>pNSgVGd phonying/V!_₹ phooey/N phosphate/~NwgSV phosphene/NSg phosphodiesterase/Nmg phosphor/~NgS phosphorescence/Nmg phosphorescent/JYN phosphoric/J phosphorous/JN phosphorus/~Nmg phosphorylation/~Nmg photo/~NSgVGd photobomb/NgSVdG photocell/NgS photocopier/NgS photocopy/NSgVd>GZ photoelectric/~JQ photoengrave/Vd>SGzZ photoengraver/NgS photoengraving/NgV photofinishing/Nmg photogenic/JQ photograph/~NgVd>GZ photographer/~NgS photographic/~JQ photographs/~NVr photography/~Nmg photojournalism/Ng photojournalist/~NSg photometer/NgSV photon/~NgS photopolymer/NSg photosensitive/J photoshop/VS photoshopped/VtT photoshopping/NmV6 photostat/NSgV photostatic/J photostatted/VtT photostatting/V6 photosynthesis/~Nmg photosynthesise/V!_₹ photosynthesize/VGdS photosynthetic/J phototropic/J phototropism/N phototypesetter/N phototypesetting/N photovoltaic/J phrasal/JN phrase/~NSVGdr phrase's phrasebook/NS phraseology/Ng phrasing/~VSNmg phreaking/NV phrenologist/NSg phrenology/Nmg phyla/N9 phylactery/NSg phylogeny/~Ng phylum/~N0g phys/~JNm physic/JNSgV physical/~JYNgS physicality/Nmg physician/~NSg physicist/~NSg physicked/V physicking/VN physics/~NgV physio/NwSg physiognomy/NwSg physiography/Nmg physiologic/~J physiological/~JY physiologist/~NgS physiology/~Ng physiotherapist/NgS physiotherapy/Ng physique/~NgS phytokarst/Ng phytoplankton/N pi/~NSgVd>GJHZ pianissimo/NSg pianist/~NgS piano/~NSgVJ pianoforte/NSg pianola/NS piaster/NgS piastre/NgS!@_₹ piazza/~NgS pibroch/Ng pibrochs/N pic/~NSg pica/~Ng picador/NgS picante picaresque/JN picayune/NJ piccalilli/Ng piccolo/~NgSJ piccy/NgS_! pick/~NgSVd>GzZ pick-me-up/NgS pick up/V/ pickax/NgSVGd picker/Ng pickerel/NgS picket/~NgSVGd>Z pickings/Ng pickle/~NgSVGd pickpocket/NSgV pickup/~NgS # removed `4` verb which applies to `pick up` picky/J^>pN picnic/~NgSV picnicked/VtT picnicker/NSg picnicking/V6N picot/NSgV pictogram/NS pictograph/N0g pictographs/N9 pictorial/~JYNgS picture/~NgSVGd picturesque/~JYp picturesqueness/Nmg piddle/NgSVGd piddly/J pidgin/~NgS pie/~NwSgV piebald/JNgS piece/~NSgVdG piecemeal/JVN piecework/Ng>Z pieceworker/Ng piecrust/NSg pieing/VN pier/~Ng pierce/~VGdSNz piercing/~VNgJY piety/~Ng piezo/J piezoelectric/JN piffle/NgVG pig/~NSgVL pigeon/~NgSV pigeonhole/NSgVdG pigged/VtT piggery/NS pigging/JV6N piggish/JYp piggishness/Ng piggy/~NSgJ^> piggyback/JVdGSNg pigheaded/JYp pigheadedness/Nmg piglet/NgS pigment/~NgSVd pigmentation/~NwgS pigpen/NgS pigskin/NgS pigsty/NSg pigswill/N pigtail/NgS pike/~NgSVGd>Z piker/Ng pikestaff/NSg pilaf/NSg pilaster/NgS pilchard/NgS pile/~NgSVGdz pileup/NgS pilfer/VGd>SZ pilferage/Nmg pilferer/NgS pilgrim/~NgSV pilgrimage/~NwgSV piling/~NgV pill/~NgSVdG pillage/VGd>SNwgZ pillager/Ng pillar/~NgSVd pillbox/NgS pillion/NgSV pillock/NS pillory/NSgVGd pillow/~NgSVGd pillowcase/NgS pillowslip/NgS pilot/~NSgJVdG pilothouse/NSg pimento/NwgS pimiento/NgS pimp/~NgSVGdJY pimpernel/NgS pimple/NSgVd pimply/J>^ pin/~NSgV pinafore/NgSV piñata/NgSV pinata/NgSV pinball/~NgV pincer/NgSV pinch/~VGdSNg pincushion/NgSV pine/~NSVGdr pine's pineapple/~NgS pinecone/NgS pinewood/~NS piney/~J pinfeather/NSg ping/~NgVGd pinhead/NSg pinhole/NSgV pinier/Jc piniest/Ju pinion/NSgVdG pink/~NwgSJ^>pVGd pinkeye/Ng pinkie/~NSg pinkish/~J pinkness/Nmg pinko/NgS pinky/~NgS pinnacle/~NSgV pinnate/J pinned/~VtTJU pinning/~V6NU pinny/NS pinochle/Ng pinon/NgS pinout/NgS pinpoint/NSgJVGd pinprick/NgSV pinsetter/NSg pinstripe/NSgd pint/NgS pinto/~NgSJ pinup/NgS pinwheel/~NSgVGd pinyin/~ONg pinyon/NSg pioneer/~NSgVGd pious/~JYp piousness/Ng pip/~NSgVGd>Z pipe/~NgSV pipeline/~NSgVGd piper/~Ng pipette/NSgV pipework/N piping/~VNgJ pipit/~NgS pipped/VtT pippin/~NSg pipping/V6 pipsqueak/NSg piquancy/Ng piquant/JY pique/VGdSNg piracy/~Ng piranha/NSg pirate/~NSgVdGJ piratical/JY pirogi/Ng piroshki/Ng pirouette/NSgVdG piscatorial/J pismire/NSg piss/NmgSVGd>Zx pissoir/NS pissy/Jx pistachio/NSg piste/NS pistil/NSg pistillate/J pistol/~NSgV piston/~NSgV pit/~NSgV pita/NgS pitapat/VSNg pitch/~NgSVd>GJZ pitchblende/Ng pitcher/~Ng pitchfork/~NgSVdG pitchman/Ng pitchmen/9 piteous/JYp piteousness/Nmg pitfall/NSg pith/NmgVJ pithead/NS pithily/Ry pithiness/Nmg pithy/J>^p pitiable/J pitiably/Ry pitiful/JY pitiless/JYp pitilessness/Ng piton/NgSV pitta/NS pittance/NgS pitted/~JVtT pitting/~NV6 pituitary/~JNSg pity/~NwSgVGd pitying/VNY pivot/~NgSVdG pivotal/~JY pix/~NgV pixel/~NgSV pixelate/VdSGn pixie/~NgS pizza/~NwgS pizzazz/Ng pizzeria/NSg pizzicati/N pizzicato/Ng pj's/N pk/~N pkg/N pkt/N pkwy/N pl/~JN placard/NSgVdG placate/VdSGn placation/Ng placatory/J place/~NwSVdGEL place's placebo/~NSg placed/~VtTU placeholder/NgS placekick/NgSVd>GZ placekicker/Ng placement/~NwSgEr placenta/~NSg placental/~JNS placer/~NSgJ placid/~JY placidity/Nmg placings/N placket/NSg plagiarise/Vd>SGZ!_₹ plagiariser/Ng!_₹ plagiarism/~NwSg plagiarist/NSg plagiaristic/J plagiarize/Vd>SGZ plagiarizer/Ng plagiary/NgJ plague/~NSgVdG plaice/N plaid/~NgSJV plain/~JY^>pNgSV plainchant/N plainclothes/JN plainclothesman/N0g plainclothesmen/N9 plainness/Ng plainsman/Ng plainsmen/9 plainsong/Ng plainspoken/J plaint/NSgv plaintext/~NgS plaintiff/~NSg plaintive/JY plait/NgSVdG plan/~NgSV>Z plan B/g planar/~J plane/~JNSVGde plane's planeload/NgS planer/JcNg planet/~NSg planetarium/~NSg planetary/~JN plangency/Ng plangent/J plank/~NgSVdG planking/NgV plankton/~Ng planned/~VtTJU planner/~NSg planning/~V6SN plant/~NgSVd>GZz plantain/NwSg plantar/J plantation/~NgS planter/~Ng planthopper/NgS # a couple of dictionary prefer 'plant hopper' planting/~NgV plantlike/J plaque/~NwSg plash/NgSVdG plasma/~NwSgV plasmon/N plaster/~NwSgVGd>Z plasterboard/NmgV plasterer/Ng plastic/~NwSgJ plasticise/VdSG!_₹ plasticity/~Ng plasticize/VdSG plasticked/J plasticky/J plastique/N plat/~NgSVGdJXn plate/~NgSV plateau/~NSgVdG plateful/NSg platelet/~NSg platen/Ng platform/~NSgVGd platformer/NgS plating/~VNg platinum/~NmgJV platitude/NSg platitudinous/J platonic/~J platoon/~NSgVGd platted/~VtT platter/NSg platting/V6N platy/JNg platypus/NgS platys/N plaudit/NSg plausibility/Nmg plausible/~J plausibly/Ry play/~VGdSNwgrE play-by-play/JNgS playability/Ng playable/~JNEU playact/VSGd playacting/NgV playback/~NgS playbill/~NgS playbook/NgS playboy/~NSg player/~NSg playfellow/NSg playful/~JYp playfulness/Ng playgirl/NgS playgoer/NgS playground/~NSg playgroup/NS playhouse/~NgS playlist/~NgSV playmate/~NgS playoff/~NSg playpen/NSg playroom/NSg playschool/NS plaything/NSgJ playtime/Ng playwright/~NSg plaza/~NgS plea/~NgSV plead/~Vd>GSZz pleader/Ng pleading/~NgV6JY pleasance/Ng pleasant/~J^YpNU pleasanter/Jc pleasantness/NgU pleasantry/NSg please/~VdSGE pleasing/~JYV6SN pleasurably/Ry pleasure/~NgSVGdB pleasureful/J pleat/NgSVdG pleb/NSJ plebby/J plebe/NgS plebeian/NgSJ plebiscite/~NgS plectra/N plectrum/NgS pledge/~VdGSNg plenary/~JNSg plenipotentiary/~NSgJ plenitude/NSg plenteous/J plentiful/~JY plenty/~NgIJ plenum/NS pleonasm/NgS plethora/~Ng pleura/Ng pleurae/9 pleurisy/Ng plexus/~NgS pliability/Ng pliable/J pliancy/Ng pliant/JY pliers/Ng plight/~NSgVdG plimsoll/NS plinth/Ng plinths/N plod/NSVb plodded/VtT plodder/NgS plodding/V6SJN plonk/NSVd>GZ plop/NgSV plopped/VtT plopping/V6N plosive/NSJ plot/~NgSV plotline/NSg plotted/~VtT plotter/NSgV plotting/~V6N plough/NgVdG!_₹ ploughman/Ng!@_₹ ploughmen/N!@_₹ ploughs/NV!_₹ ploughshare/NgS!@_₹ plover/~NSgV plow/~NgSVGd plowman/Ng plowmen/9 plowshare/NgS ploy/NSV ploy's pluck/~VdGSNg pluckily/Ry pluckiness/Ng plucky/J>^p plug/~NSVU plug in/V/ plug's pluggable/J plugged/~VtTU plugging/~V6NU plughole/NS plugin/NSg plum/~NwgSJVGd plumage/~Nmg plumb/~NgSJ>VdGZz plumbed/VU plumber/Ng plumbing/~Nmg plume/~NgSV plummet/NSgVGd plummy/J plump/JY^>pVdGSNg plumpness/Nmg plumy/J>^ plunder/~VGd>SNgZ plunderer/Ng plunge/~Vd>GSNgZ plunger/Ng plunk/VdGSNg pluperfect/JNSg plural/~JNSg pluralisation/Ng!_₹ pluralise/VGdS!_₹ pluralism/~Ng pluralist/NgSJ pluralistic/J plurality/~NwSg pluralization/Nmg pluralize/VGdS plus/~PCNgSJV plush/~J>Y^pNg plushness/Ng plushy/J>^ plutocracy/NSg plutocrat/NSg plutocratic/J plutonium/~Nmg pluvial/JN ply/~NSgVGdr plywood/~NmgV pm/~ pneumatic/~JNQ pneumococcal/J pneumococci/N9 pneumococcus/N0 pneumonia/~Ng poach/Vd>GSNZ poacher/~Ng poaching/~VNg pock/NgSVGd pocket/~NSgVdGJ pocketbook/NSg pocketful/NSg pocketknife/N0g pocketknives/N9 pockmark/NgSdG pod/~NSgV podcast/~NSgVG podcaster/NSg podded/JVtT podding/V6 podiatrist/NSg podiatry/Ng podium/~NSgV poem/~NgS poesy/NgV poet/~NgS poetaster/NgS poetess/NgS poetic/~JS poetical/~JY poetry/~Nwg pogrom/NSgV poi/~Ng poignance/Nmg poignancy/Nmg poignant/~JY poinciana/~NSg poinsettia/NSg point/~NgSVd>GZ pointblank/ pointed/~VtTJY pointer/~Ng pointillism/Ng pointillist/JNSg pointillistic/JQ pointless/~JYp pointlessness/Ng pointy/J^>N poise/NgSVGd poison/~NwSgVGd>zZ poisoner/Ng poisoning/~NgV6 poisonous/~JY poke/~VGd>SNgZ poker/~NgV pokey/~JNgS poky/NJ^> pol/~NSgGd polar/~JN polarisation/NwSge!_₹ polarise/VdSGe!_₹ polarity/~NwSg polarization/~NwSge polarize/VdSGe pole/~NgSV polearm/NSg poleaxe/NSVGd polecat/NgS polemic/~NgSJ polemical/~JYN polemicist/NSg polemics/Nmg polestar/NSg police/~NmSgVdG policeless/J policeman/~N0g policemen/~N9 policewoman/Ng policewomen/9 policy/~NwSgV policyholder/NgS policymaker/NS policymaking/Nmg polio/~NgS poliomyelitis/Ng polish/~NgSVGd>Z polished/~JVU polisher/Ng politburo/~NgS polite/~JY^>pV politeness/Nmg politesse/Ng politic/~JNSV political/~JYN politician/~NSg politicisation/Ng!_₹ politicise/VdSGe!_₹ politicization/Nger politicize/VdSGe politicking/NgV6 politico/~NSg politics/~NgV polity/~NSg polka/~NgSVdG poll/~NgSVGdJn pollack/~NgSV pollard/~NSV pollen/~NgV pollinate/VGdSJn pollination/~Ng pollinator/~NSg polling/~V6Ng polliwog/NSg pollster/NSg pollutant/NgS pollute/VGd>SJZn polluted/~JVtTU polluter/NgS pollution/~Nmg polo/~Nmg polonaise/NSgV polonium/Nmg poltergeist/~NgS poltroon/NSgJ poly/~NJV( polyacrylamide/N polyamory/NS polyandrous/J polyandry/Nmg polycarbonate/NwgS polyclinic/NSg polycystic/J polyester/~NwgSJ polyethylene/~Ng polyfill/VdSGNwg polygamist/NgS polygamous/~J polygamy/~Nmg polyglot/JNSg polygon/~NSg polygonal/~J polygraph/N0gVGd polygraphs/N9V polyhedral/~J polyhedron/~NSg polymath/~N0g polymaths/N9 polymer/~NwSg polymerase/~NwSg polymeric/~J polymerisation/Nmg!_₹ polymerise/VGdS!_₹ polymerization/~Nmg polymerize/VGdS polymorphic/J polymorphism/Nmg polymorphous/J polynomial/~NgSJ polyp/NgS polyphonic/~J polyphony/Nmg polypropylene/~Nmg polys/N polysemous/J polystyrene/~Nmg polysyllabic/JN polysyllable/NgS polytechnic/~JNgS polytheism/Nmg polytheist/NSg polytheistic/J polythene/Nmg polyunsaturate/NSJd polyurethane/NgSV polyvinyl/~JNm pom/~NS pomade/NSgVdG pomander/NSg pomegranate/~NwgSJ pommel/~NSgVGd pommelled/VtTJ!@_₹ pommelling/V6!@_₹ pommy/NSJ pomp/NgV pompadour/NSgVd pompano/NgS pompom/NSg pomposity/Ng pompous/~JYp pompousness/Ng ponce/~NSVGd poncho/NSg poncy/J pond/~NgSV ponder/VGd>SNZ ponderer/Ng ponderous/JYp ponderousness/Ng pone/NgS pong/~NSVGd pongee/Ng poniard/NgSV pontiff/~NSg pontifical/~JYN pontificate/~NSgVdG pontoon/~NSg pony/~NSgVGdJ ponytail/NgSV poo/NwSVGd pooch/NgSVdG poodle/NSg poof/VSNg poofter/NS pooh/~NgVGd poohs/V pool/~NgSVGd poolroom/NgS poolside/JNS poop/VGdSNwg poor/~J^Y>pNV poorboy/Ng poorhouse/NSg poorness/Ng pop/~NwSgVJ popcorn/~NwgV pope/~NgSV popgun/NSg popinjay/NgS poplar/~NSg poplin/Ng popover/NSg poppa/NgS poppadom/NS popped/~VtT popper/~NSg poppet/NS popping/~NV6 poppy/~NSgJ poppycock/Ng populace/~NgS popular/~JYN popularisation/Ng!_₹ popularise/VdSG!_₹ popularity/~NmgU popularization/~Ng popularize/~VdSG populate/~VGdSJre populated/~JVU population/~Nge populations/~N populism/~NgS populist/~NgSJ populous/~Jp populousness/Ng popup/NgS porcelain/~NwSgV porch/~NgS porcine/~J porcupine/~NSg pore/~NgSVGd porgy/NSg pork/~NwgV>Z porker/Ng porky/~J>^NSg porn/~Ng porno/~JNg pornographer/NgS pornographic/~JQ pornography/~Nmg porosity/~Ng porous/~Jp porousness/Ng porphyritic/J porphyry/~Ng porpoise/NgSVGd porridge/~Nmg porringer/NSg port/~NSJVGdeE port's/r portability/~Ng portable/~JNgS portage/~NSgVdG portal/~NSgJV portcullis/NgSV portend/VSGd portent/NSg portentous/JYp porter/~NSgVr porterhouse/NSg portfolio/~NgS porthole/NgS portico/~N0g porticoes/N9 portiere/NgS portion/~NSgVGdK portliness/Ng portly/J>^p portmanteau/~NgSJV portrait/~NgSVJ portraitist/NSg portraiture/~Ng portray/~VSGd portrayal/~NgS portulaca/Ng pose/~NSVGderKE pose's/r poser/NSgEK poseur/NSg posh/~J^>NV posit/~NSVdGv position/~NgSVeKE positional/~JNKE positioned/~JVtTK positioning/~V6NrK positive/~JYpNgS positiveness/Nmg positivism/~Nmg positivist/NSJ positivity/Nmg positron/~NgS poss/JV posse/~NgS possess/~VGSdrEv possession/~NwSgVr possessive/~JYpNSg possessiveness/Nmg possessor/NSg possibility/~NSg possible/~JNSg possibly/~R # adverb of probability/certainty/affirmation; modal adverb possum/~NSgV post/~NwgSVGd>P(Zz post-Covid/J post-Soviet/J post-truth/NmgV postage/~Nmg postal/~J postbag/NgS postbox/NgS postcard/~NSgV postcode/~NSV postcolonial/~JN postconsonantal/J postdate/VdGSJN postdoc/NgS postdoctoral/~JN poster/~NgVdG posterior/~JNSg posterity/~Nmg postgrad/NgSJ postgraduate/~NSgJ posthaste/N posthumous/~JY posthypnotic/J postie/NS postilion/NSg postindustrial/J posting/~VNg postlude/NSgV postman/~Ng postmark/NSgVdG postmaster/~NgS postmen/9 postmenopausal/J postmeridian/J postmistress/NgS postmodern/~JN postmodernism/~Nmg postmodernist/~JNgS postmortem/NSgJ postnasal/JN postnatal/J postoperative/JN postpaid/J postpartum/JN postpone/~VdSGL postponement/NwSg postposition/NSg postprandial/J postprocess/VGdS postscript/~NSgV postseason/~NSgJ poststructuralist/NSgJ postsynaptic/~J postulate/~NSgJVdGXn postulation/Ng postural/J posture/~NgSVGdz posturing/NgV postwar/~J postwoman/N postwomen/9 posy/NSg pot/~NwSgVe potability/Ng potable/~JNSg potash/NmgV potassium/~Nmg potato/~N0wgV potatoes/~N9 potbelly/NSgd potboiler/NSg potency/Nmg potent/~JYN potentate/NgSJ potential/~NwgSJY potentiality/NSg potentiate/VGdS potentiometer/NSg potful/NSg pothead/NSg pother/NSgVdG potherb/NSg potholder/NgS pothole/NSgd>GZ pothook/NSg potion/~NwSgV potluck/NgSV potpie/NSg potpourri/NwSg potsherd/NSg potshot/NgSV pottage/Ng potted/VtTJ potter/~NSgVGd pottery/~NwSg potting/V6N potty/NSgV>J^p pouch/~NgSVdG pouf/NSV pouffe/NSV poulterer/NgS poultice/NSgVdG poultry/~Nmg pounce/NSgVdG pound/~NSVdGK pound's poundage/NmgV pounder/~NgS pounding/VSNmgJ pour/~VGdSNz pout/VGd>SNgZ pouter/Ng poverty/~Nmg pow/~N powder/~NwSgVGd powdery/J power/~Nw☁gSVdGJ power line/NgS power-up/NgS powerboat/NgS powerful/~JY powerhouse/~NSg powerless/~JYp powerlessness/Ng powertrain/NgS powwow/NSgVGd pox/NgSV pp/~N ppm/~N ppr practicability/Ng practicably/Ry practical/~JYNSg practicality/~NSg practice/~NSgVdGB practiced/~JVU practicum/NSg practise/VdGSN!@_₹ practised/JVU!@_₹ practitioner/~NSg praetor/NSg praetorian/~JN pragma/NgS pragmatic/~JNgS pragmatical/JY pragmatism/~Ng pragmatist/NgSJ prairie/~NSg praise/~NSgVdGE praiseworthiness/Ng praiseworthy/Jp praline/NwSg pram/NgS prance/Vd>GSNgZ prancer/Ng prancing/V6JYN prang/NSVdG prank/~NgSVdGJ prankster/NSg praseodymium/Nmg prat/~NSJ prate/NgSVGd>Z prater/Ng pratfall/NSgV prattle/Vd>GSNgZ prattler/Ng pravity/N prawn/NgSVdG pray/~VGd>SZ prayer/~NmgS prayerful/JY pre-COVID/J preach/~Vd>GSNZL preacher/~Ng preachment/Ng preachy/J>^ preadolescence/NSg preadolescent/JN preamble/~NgSVGd preamplifier/NSg prearrange/VGdSL prearrangement/Ng preassigned/J prebuild/VGS prebuilt/J precalculate/VGdS precancel/VdGSNg precancerous/J precarious/~JYp precariousness/Ng precast/JNV precaution/~NgSV precautionary/~JN precautious/J precede/~VdGSN precedence/~Ng precedent/~NSgJVdG precept/NSgV preceptor/NSg precinct/~NgS preciosity/Ng precious/~JYpN preciousness/Ng precipice/NSg precipitant/JNgS precipitate/~VGdSJYNgXn precipitation/~Ng precipitous/JY precis/NgV precise/~JY^pVdSGn preciseness/Ng precision/~NgJ preclude/~VGdS preclusion/Ng precocious/~JYp precociousness/Ng precocity/Ng precognition/Ng precognitive/JN precolonial/JN precompile/VGdS precomputability/Ng precomputation/NgS precomputational/JY precompute/VGdSB preconceive/VGdS preconception/NwSgJ precondition/NgSVdG preconfigure/VGdS precook/VGSd precool/VGSd precursor/~NSgJ precursory/JN predate/~VdGSN predator/~NgS predatory/~J predawn/NJ predecease/NSVGd predecessor/~NSg predefined/~JV predesignate/JVGdS predestination/~Ng predestine/VdSG predetermination/Ng predetermine/VGd>SZ predeterminer/Ng predicable/JN predicament/~NgS predicate/~NgSJVGdnv predication/Nmg predicative/JYN predict/~VGdSNBv predictability/NmgU predictable/~JNU predictably/~RyU prediction/~NwSg predictive/J predictor/~NgS predigest/VGdS predilection/NSg predispose/VGdS predisposition/NgS prednisone/N predominance/Nmg predominant/~JYN predominate/~VGdSJY predone/J preemie/NSg preeminence/Nmg preeminent/~JY preempt/VGdSNv preemptible/J preemption/~Nmg preemptive/~JY preen/NSVdG preexist/VdGS preexistence/Nmg pref/~N prefab/JNSgV prefabbed/VtT prefabbing/V6 prefabricate/VdSGn prefabrication/Nmg preface/~NSgVdG prefatory/J prefect/~NSg prefecture/~NgS prefer/~VSBL preferably/~Ry preference/~NgSV preferential/~JY preferment/Ng preferred/~VtTJN preferring/~V6N prefigure/VGdSN prefix/~NgSVdG prefixation/Nmg preflight/JNgSVdG preform/NSVGd preformative/NJ!@_₹ prefrontal/JN pregame/~NSgJV pregnancy/~NwSg pregnant/~JN preheat/VGSd prehensile/J prehistorian/NS prehistoric/~J prehistorical/JY prehistory/~Nmg prehuman/JN preindustrial/J preinstallation/Nmg preinstalled/VtT prejudge/VGdS prejudgement/NgS!_₹ prejudgment/NSg prejudice/~NgS☁VGdJ prejudiced/~VtTJU prejudicial/J prekindergarten/JNSg prelacy/Ng prelate/~NSgV prelim/JNSg preliminarily preliminary/~JNSg preliterate/JN preload/VdSG prelude/~NgSV premarital/JN premature/~JYN premed/NSg premedical/J premeditate/VdSGn premeditated/~VJU premeditation/Ng premenstrual/J premier/~JNSgVGd premiere/~NgSV premiership/~NgS premise/~NSgVdG premium/~JNSg premix/NSVGd premolar/~NSgJ premonition/NgS premonitory/J prenatal/~JYN prenup/NSg prenuptial/JN preoccupation/~NSg preoccupy/VdSG preoperative/JN preordain/VGdS preowned/J prep/~NmgSV prepackage/VdSG prepacked/J prepaid/~VJN prepandemic/J preparation/~NwSg preparatory/~J prepare/~VGdS # remove `N` noun sense is obsolete prepared/~JpVtTU preparedness/~NgU preparer/NSg prepay/VGSL prepayment/NwgS prepend/VdSGN preponderance/NSg preponderant/JY preponderate/VGdS prepone/VdSG₹ preponement/NgS₹ preposition/NSgVd prepositional/JYN prepossess/VGdS prepossessing/JV6U prepossession/NSg preposterous/JY prepped/VtT prepping/V6Nm preppy/J^>NSg preprint/VdSGNg preprocess/VdSG preprocessor/NSg prepubescence/Ng prepubescent/JNSg prepuce/NgS prequantum/J prequel/~NgS prerecord/VGSd preregister/VSGd preregistration/NgJ prerelease/JNgS prerequisite/~JNgS prerogative/~NSgJ pres/~NV presage/NgSVGd presbyopia/Nmg presbyter/NSg presbytery/~NSg preschool/~J>NSgVZ preschooler/NgS prescience/Nmg prescient/JY prescribe/~VdSG prescript/NSgJdv prescription/~NwSgJ prescriptive/JY preseason/~NSgV preselct/VGdS presence/~NwSgV present/~JY>NgSVdGLZB presentably/Ry presentation/~NSgr presenter/~Ng presentiment/NSg presentment/NSg preservation/~Ng preservationist/NSg preservative/~NSgJ preserve/~NSgVd>GBZ preserver/Ng preset/~JVSN presetting/V6g preshrank/Vt preshrink/VbGS preshrunk/VT preside/~VGdS presidency/~NSg president/~NgSV # removed `5` adj. sense archaic, interferes with heuristics presidential/~J presidium/~Ng presort/VdGS press/~NSVbGdre press's pressed/~VtTJU presser/NgS pressie/NS pressing/~JYNSgV6 pressman/N0g pressmen/N9 pressure/~NwSgVdG pressurisation/Ng!_₹ pressurise/VGdSe!_₹ pressurization/Nmg pressurize/VGdSe pressurizer/NSg prestidigitation/Ng prestige/~NmgJV prestigious/~J presto/~NSg presumably/~Ry presume/~VGdSB presumption/~NwSg presumptive/~J presumptuous/JYp presumptuousness/Nmg presuppose/VdSG presupposition/NwgS pretax/JV preteen/JNgS pretence/NSg!_₹ pretend/~Vd>GSJNZ pretender/~NgV pretense/NSgXn pretension/NgSVdG pretentious/~JYU pretentiousness/Nmg preterit/NSgJ preterite/JNgS!@_₹ preterm/JN preternatural/JY pretest/JNSVdG pretext/~NgSV pretrain/VGdS pretrial/JNS prettify/VGdS prettily/Ry prettiness/Nmg pretty/~J^>pNSgVGdR pretzel/NgSV prev/J!@_₹ prevail/~VdGS prevalence/~Nmg prevalent/~J prevaricate/VdSGnX prevarication/Nmg prevaricator/NSg prevent/~VdSGBv preventable/JNU preventative/JNgS prevention/~Nmg preventive/~JNSg preview/~NgSVd>GZ previous/~JYN prevision/NgSV prewar/~J prey/~NgSVGd prezzie/NmgS priapic/J price/~NwSVGdr price's priceless/J pricey/J pricier/Jc priciest/Ju prick/NgSVd>GYZ pricker/NgS prickle/NgSVGd prickliness/Nmg prickly/J>^pN pride/~Nm☁gSVGd prideful/JY prier/Ng priest/~NSgVY priestess/~NgSV priesthood/~Nmg priestliness/Nmg priestly/~J>^p prig/NgSV priggish/Jp priggishness/Nmg prim/JY>pVGdNZ prima facie/RJ primacy/~Ng primal/~JNV primality/J primarily/~R # focusing/viewpoint/comment adverb primary/~JNSgVdG primate/~NgS prime/~JNgSV primer/~NgJ primeval/~J priming/NgV primitive/~NSgJYp primitiveness/Ng primmer/JcN primmest/Ju primness/Ng primogenitor/NSg primogeniture/~Ng primordial/~JYN primp/VdSG primrose/~NSgJV primula/NS prince/~NSgVY princedom/NSg princeliness/Ng princeling/NgS princely/~J>^p princess/~NgS principal/~JYNSg principality/~NmSg principle/~NwSgVd principled/JVU print/~JVdGSNwgr printable/JNU printer/~NgS printing/~NSgV printmaking/Nmg printout/NSg prion/NS prior/~JNgS prioress/NgS prioritisation/N!_₹ prioritise/VdSG!_₹ prioritization/N prioritize/~VdSGe priority/~NSg priory/~NSg prise/VGdSNr!_₹ prism/~NgS prismatic/~J prison/~NSgV>Z prisoner/~Ng prissily/Ry prissiness/Ng prissy/J^>pN pristine/~J prithee/ privacy/~Nmg private/~JY^>NgSVXn privateer/~NSgV privation/NSge privatisation/NSg!_₹ privatise/VdSG!_₹ privatization/~NSg privatize/VdSG privet/NSg privilege/~NSgVdG privileged/~VJU privily/Ry privy/~J>^NSg prize/~NgSVGdJ prized/~JVtTr prizefight/NSgG>Z prizefighter/Ng prizefighting/Ng prizewinner/NgS prizewinning/J pro/~NSgPJ( pro-democracy/J pro rata/R probabilistic/~J probability/~NSg probable/~JNSg probably/~R # adverb of probability/certainty; modal adverb probate/~NgVn probation/~Ng>Z probational/JY probationary/JN probationer/Ng probe/~NgSVGdBz probiotic/NSgJ probity/Nmg problem/~NgSJ problematic/~JNU problematical/JY probosces/N9 proboscis/N0gS procaine/Ng procedural/~JYN procedure/~NSg proceed/~VbGdSz proceeding/~V6Ng proceedings/N9 proceeds/~NgVh process/~NSVbGdr process's processable/JU processed/~JVtTU procession/~NVGd processional/JNgS processor/~NSg proclamation/~NgS proclivity/NSg procrastinate/VdSGn procrastination/Nmg procrastinator/NgS procreate/Vv proctor/~NgSVGd procurement/~NwgS prod/~VSNg prodigal/~JYNgS prodigality/Nmg prodigious/~JY prodigy/~NSg produce/~VGd>SNmrZ produce's producer/~Ngr producible/Jr production/~NwSgr productise/VdSGn!_₹ productive/~JYU productiveness/Nmg productivity/~Nmg productize/VdSGn prof/~NgS profanation/NgS profane/~JYpNSVGd profaneness/Nmg profanity/~NwSg professed/~JYVtT profession/~NSg professional/~NgSJY professionalisation/N!_₹ professionalise/VdSG!_₹ professionalism/~Nmg professionalization/Nmg professionalize/VdSG professor/~NSg professorial/JY professorship/~NSg proffer/NgSVGd proficiency/~Ng proficient/~JYNgS profiler/NSg profit/~NwVGdB profitability/~Nmg profitable/~JU profitably/RyU profiteer/NgSVdG profiteering/NgV profiterole/NSg profitless/J profligacy/Nmg profligate/JYNSgV proforma/JN profound/~JY^>pNV profoundness/Nmg profundity/NSg profuse/JYpV profuseness/Nmg progenitor/~NSg progeny/~Ng progesterone/Nmg progestin/NS prognathous/J prognoses/N9V prognosis/~N0g prognostic/JNgS prognosticate/VGdSXn prognostication/Ng prognosticator/NgS progovernment/J program/~NSVer programmable/~JNgS programmatic/JQ programme/NSgVd>GBzZ programme/!_₹ programmed/~VtTJre programmer/~NgS programming/~NmgV6 progress/~NmgSVdGv progression/~NgS progressive/~JYpNgS progressively/R progressiveness/Ng progressivism/Nmg prohibit/~VdGSv prohibition/~NwSg prohibitionist/NgS prohibitive/~JYN prohibitory/J project/~NgSVGd projectile/~NSgJ projection/~NwSg projectionist/NSg projector/~NgS prokaryote/NgS prokaryotic/J prole/NSV proletarian/~JNgS proletariat/~Ng proliferate/VdSGn proliferation/~Nmg prolific/~JQ prolix/JYV prolixity/Ng prologue/~NSgV prolongation/NSg prom/~NgS promenade/~NgSVGd promethium/Nmg prominence/~Nmg prominent/~JYN promiscuity/Nmg promiscuous/~JY promise/~NSgVdG promising/~JYV6N promissory/J promo/~NgV promontory/~NSg promote/~Vd>GZ promoter/~NgS promotional/~JN prompt/~JY^>pNSgVdGzZ prompted/~VU prompter/JcNgS prompting/~VNg promptitude/Nmg promptness/Nmg promulgate/VGdSn promulgation/~Nmg promulgator/NgS pronatalist/NgSJ prone/~JpV proneness/Nmg prong/~NgSVd pronghorn/NgS pronominal/JNg pronounce/~VdGSNL pronounceable/JU pronouncement/NSg pronto/ pronunciation/~NgS proof/~NwSgJVdGr proofread/V>GSNZ proofreader/Ng prop/~NgSV propaganda/~Nmg propagandise/VGdS!_₹ propagandist/~NgSJ propagandistic/JQ propagandize/VGdS propagate/~VdSGn propagation/~Nmg propagator/NSg propel/~VS propellant/~NwgSJ propelled/~VtT propeller/~NSg propelling/V6N propensity/~NSg proper/~J>Y^Ng property/~NSgVd prophecy/~NwSgV prophesier/Ng prophesy/Vd>GSNgZ prophet/~NSg prophetess/NgS prophetic/~J prophetical/JY prophylactic/NSgJ prophylaxes/N9 prophylaxis/N0g propinquity/Ng propitiate/VdSGn propitiation/Ng propitiatory/J propitious/JY proponent/~NSgJ proportion/~NSgVE proportional/~JYNS proportionality/~Nmg proportionate/JYVE proposal/~NgS propped/VtT propping/V6N propranolol/N proprietary/~JNSg proprieties/Ng proprietor/~NSg proprietorial/JY proprietorship/Ng proprietress/NgS propriety/~NSg proprioception/Nmg # medicine propulsion/~Nmg propulsive/J prorate/VdSG prorogation/Ng prorogue/VGd prosaic/JQ proscenium/~NSg prosciutto/Nmg proscribe/VdG proscription/NwgS prose/~NmgV prosecute/~VdSGXn prosecution/~NwgS prosecutor/~NgS prosecutorial/JQ proselyte/NSgVdG proselytise/Vd>SGZ!_₹ proselytiser/Ng!_₹ proselytism/Ng proselytize/Vd>SGZ proselytizer/Ng prosocial/J prosody/NwSg prospect/~NgSVdGv prospective/~JYN prospector/NSg prospectus/~NgS prosper/~VGSd prosperity/~Nmg prosperous/~JY prostate/~NgSJ prostheses/N9 prosthesis/~N0g prosthetic/~JNgSQ prostitute/~VGdSJNgn prostitution/~Nmg prostrate/JVGdSnX prostration/NgwS prosy/J>^ protactinium/Nmg protagonist/~NSg protean/JN protect/~VGSdv protectant/NSg protected/~JVU protection/~NwSg protectionism/~Nmg protectionist/JNgS protective/~JYpN protectiveness/Ng protector/~NgS protectorate/~NgS protege/NSg protegee/NS protein/~NwSg protest/NwgS protestant/~JNgS protestation/NwgS # proto # prefixes that are not also words in their own right don't belong in the dictionary protocol/~NwgSV protocolise/VGdS!_₹ protocolize/VGdS proton/~NSg protoplasm/Nmg protoplasmic/J prototype/~NgSVG prototyper/NgS prototypical/J protozoa/N protozoan/NgSJ protozoic/J protract/VGd protrude/VGdS protrusile/J protrusion/NgS protuberance/NgS protuberant/J proud/~J>Y^ prov/~nB provability/Nmg provably/R # adverb of modality/certainty/probability prove/~VGdSNEr proved/~VtU proven/~JVTUE provenance/~NSgV provender/NgV provenience/Ng proverbial/JYN provide/~Vd>SGZ provided/~CVtTU providence/~Ng provident/JY providential/JY provider/~NgS province/~NgS provincial/~JYNSg provincialism/Nmg provisional/~JYN proviso/~NSg provocateur/NgS provocative/~JYpN provocativeness/Nmg provoke/~Vd>SGZ provoked/~VU provoker/NgS provoking/~VJYN provolone/Ng provost/~NSgV prow/NgSJ prowess/~Nmg prowl/Vd>GSNgZ prowler/NgS proximal/~J proximate/JN proximity/~Nmg proxy/~JNSgVdG prude/NgSJ prudence/~Nmg prudent/~JY prudential/~JYN prudery/Ng prudish/JYp prudishness/Nmg prune/NgSVGd>Z pruner/NgS prurience/Nmg prurient/JY pry/~VGd>SNg^Z psalm/~NgSV psalmist/NSg psaltery/NSg psephologist/NS psephology/N pseud/NS pseudo/~NSJ( pseudocode/NmgG pseudonym/~NSg pseudonymous/~J pseudorandom/Jp pseudoscience/~NgS pseudoscientific/J pseudy/J pshaw/VSg psi/~NSg psittacosis/Ng psoriasis/Ng psst/V psych/NgSJVdG psyche/~NgV psychedelia/Nm psychedelic/~JNSgQ psychiatric/~JN psychiatrist/~NSg psychiatry/~Nmg psychic/~NgSJ psychical/JY psycho/~JNSg psychoactive/~JN psychoanalyse/VdSG!_₹ psychoanalyses/VN9 psychoanalysis/~N0g psychoanalyst/NSg psychoanalytic/~J psychoanalytical/JY psychoanalyze/VdSG psychobabble/NgV psychodrama/NgS psychogenic/J psychokinesis/Nmg psychokinetic/JN psycholinguistics/Ng psychological/~JY psychologist/~NgS psychology/~NwSg psychometric/J psychometrician/NSg psychoneuroses/N psychoneurosis/Ng psychopath/Ng psychopathic/JN psychopathology/N psychopaths/N9 psychopathy/Nmg psychopharmacology/N psychophysiology/N psychos/NS psychosis/~Ng psychosomatic/J psychotherapist/NgS psychotherapy/~NSg psychotic/~JNSgQ psychotropic/JNgS psychs/NV pt/~Ne ptarmigan/NgS pterodactyl/NgS ptomaine/NSg pub/~NSgV pubertal/J puberty/~Nmg pubes/Ng pubescence/Ng pubescent/JN pubic/J pubis/Ng public/~JNmgVr public key/NgS publican/NgSr publication/~NwSgr publicise/VGdS!_₹ publicist/~NgS publicity/~Nmg publicize/VGdS publicly/~Ry publish/~VGdSrU publishable/JU published/~VtTJU publisher/~NgS publishing/~NmgV6U puce/NgJ puck/~NgSV>Z pucker/VdGNg puckish/JYp puckishness/Nmg pud/NS pudding/~NwSg puddle/~NSgVdG puddling/NgV pudenda/N pudendum/Ng pudginess/Nmg pudgy/J>^p pueblo/~NSg puerile/J puerility/Nmg puerperal/J puff/~NgSVGd>Z puffball/~NSg puffer/Ng puffin/~NSg puffiness/Nmg puffy/~J>^p pug/~NSgV pugilism/Nmg pugilist/NSg pugilistic/J pugnacious/JYp pugnaciousness/Nmg pugnacity/Nmg puke/NgSVGd pukka/J pulchritude/Nmg pulchritudinous/J pule/NSVGd pull/~VGd>SNgZ pull down/V/ pullback/NgS pulldown/NgS puller/NgS pullet/NSg pulley/~NSgV pullout/NgS pullover/NSg pullup/NSg pulmonary/~J pulp/~NwgSVGdJ pulpiness/Nmg pulpit/~NSg pulpwood/Ng pulpy/J>^p pulsar/~NSg pulsate/VGdSXn pulsation/NwSg pulse/~NgSVGdr pulverisation/Ng!_₹ pulverise/VdSG!_₹ pulverization/Ng pulverize/VdSG puma/~NgS pumice/NSgV pummel/VGdSN pummelled/VtT!@_₹ pummelling/V6N!@_₹ pump/~NgSVGd>Z pumper/~Ng pumpernickel/Ng pumpkin/~NwgS pun/~VSNg punch/~NwgSVd>GZ punchbag/NS puncheon/NgS puncher/Ng punchline/NS punchy/J^> punctilio/Ng punctilious/JYp punctiliousness/Nmg punctual/JY punctuality/Nmg punctuate/VGdSJn punctuation/~Nmg puncture/NSgVdG pundit/~NSg punditry/Nmg pungency/Nmg pungent/~JY puniness/Ng punish/~VGdSBL punished/~VJU punishing/~JYNV punishment/~NwgS punitive/~JY punk/~NgSJ^>V punned/VtT punnet/NS punning/V6NJ punster/NSg punt/~NgSVGd>Z punter/~Ng puny/J^>pN pup/~NSgV pupa/~Ng pupae/~9 pupal/~J pupate/VdSG pupil/~NgS pupped/VtT puppet/~NgSV puppeteer/~NSgV puppetry/~Ng pupping/V6 puppy/~NSgV purblind/JNV purchase/~NSgVd>GZB purchaser/Ng purdah/Ng pure/~JY^>pVN purebred/JNSg puree/NgSVd pureeing/V6 pureness/Nmg purgative/JNSg purgatorial/J purgatory/~NSgJ purge/~VGd>SNgZ purger/NgS purification/~Nmg purifier/NgS purify/~Vd>SGnZ purine/NgS purism/Nmg purist/JNgS puristic/J puritan/~NSgJ puritanical/JYN puritanism/Nmg purity/~Nmg purl/NgSVGd purlieu/NSg purloin/VSGd purple/~NwgSJ^>V purplish/~J purport/VdGSNg purported/~JYV purpose/~NwSgVdGr purposed/JVr purposeful/JYp purposefulness/Nmg purposeless/JYp purposely/Ry purr/VGdSNg purse/~NgSVGd>Z purser/Ng pursuance/Ng pursuant/~J pursue/~VGd>SZ pursuer/Ng pursuit/~NSg purulence/Ng purulent/J purvey/VdSG purveyance/Ng purveyor/NSg purview/~Ng pus/NmgV push/~VGd>SNgZ push back/V/ pushback/Nmg pushbike/NSV pushcart/NSg pushchair/NS pusher/Ng pushily/Ry pushiness/Nmg pushover/NgS pushpin/~NSV pushy/J^>p pusillanimity/Ng pusillanimous/JY puss/~NgS pussy/~NSgJ^> pussycat/~NgS pussyfoot/VdGSN pustular/J pustule/NSg put/~VbtTSNg putative/~J putout/NgS putrefaction/Nmg putrefactive/J putrefy/VGdS putrescence/Ng putrescent/J putrid/J putsch/~NgS putt/~NgSVGd>Z putted/VtTi puttee/NgS putter/Vd>GNgZ putterer/Ng putting/~V6Ni putty/NwSgJVGd putz/NSV puzzle/~NgSVGd>ZL puzzlement/Ng puzzler/Ng pvt/~ pwn/VGdSN pyelonephritis/N pygmy/~NSgJ pyjama/NS!@_₹ pyjamas/Ng!@_₹ pylon/~NSg pylori/N pyloric/J pylorus/Ng pyorrhea/Ng pyorrhoea/Ng!_₹ pyramid/~NSgVGd pyramidal/~JN pyre/~NgS pyrimidine/NgS pyrite/NSg pyrites/Ng pyromania/~Ng pyromaniac/NSg pyrotechnic/JSQ pyrotechnical/J pyrotechnics/~Ng pyruvate/~N python/~NSg pyx/NgSV pzazz/N q/~N qr/~N qt/~NS qty/N qua/~P quack/~NgSVGdJ quackery/Ng quad/~NgSJV quadrangle/~NSg quadrangular/J quadrant/~NgS quadraphonic/J quadratic/~JNgSQ quadrature/N quadrennial/JN quadrennium/NgS quadriceps/NgS quadrilateral/~NSgJ quadrille/NgSVJXn quadrillion/NgS quadrillionth/J quadriplegia/Nmg quadriplegic/JNSg quadrivium/NgS quadruped/NgS quadrupedal/J quadruple/~JVGdSNg quadruplet/NgS quadruplicate/JNgSVGdn quadruplication/Ng quaff/VGdSNg quagmire/NSgV quahog/NgSV quail/~VGdSNwg quaint/J>Y^pN quaintness/Nmg quake/~NgSVGd quaky/JN qualification/~NwgSE qualified/~JVtTU qualifier/~NSg qualify/~VGdSNEXn qualitative/~JYN quality/~NwSgJ qualitywise/R qualm/NgSV qualmish/J quandary/NSg quango/NS quant/NgS # quantitative analyst quanta/~N9 quantifiable/JN quantification/~Ng quantifier/~Ng quantify/~Vd>SGnZ quantisation/NgS!_₹ quantise/V!_₹ quantitation/N quantitative/~JY quantity/~NwSg quantization/~NgS quantize/VSdG quantum/~N0gJ quarantine/~NOSgVGd quark/~NgS quarrel/~NSgVGd>Z quarreler/Ng quarrelled/VtT!@_₹ quarreller/NgS!@_₹ quarrelling/V6Nm!@_₹ quarrelsome/Jp quarrelsomeness/Nmg quarry/~NSgVdG quart/~NgSJV quarter/~NSgJYVGd quarterback/~NgSVGd quarterdeck/NgS quarterfinal/~NSg quarterly/~JNSg quartermaster/~NgSV quarterstaff/N0g quarterstaves/N9 quartet/~NSg quartile/NS quarto/~NgS quartz/~Nmg quasar/~NgS quash/VGdS quasi/~J quaternion/NgS quatrain/NgS quaver/NgSVdG quavery/J quay/~NgSVJ quayside/NS queasily/Ry queasiness/Ng queasy/J^>p queen/~NgSVGdY queenly/J>^ queer/~J^Y>pNgSVGd queerness/Ng quell/~VGdSN quench/VGd>SNZB quenchable/JU quencher/Ng quenchless/J quercetin/Ng # a flavonol querulous/JYp querulousness/Ng query/~NSgVdGB ques/N quesadilla/NgS quest/~NgSViWr quested/V questing/NV question/~NSgVd>GZBz questionable/~JU questionably/RyU questioned/~VtTU questioner/Ng questioning/~NgJYV6 questionnaire/~NSgV queue/~NSVde queue's queueing/V6N queuing/V6N quibble/NSgVd>GZ quibbler/Ng quiche/NSgJ quick/~JY^>pNgVnX quicken/VdGN quickfire/JN quickie/NSg quicklime/NmgV quickness/Ng quicksand/NgS quicksilver/~NgJV quickstart/NgS quickstep/NgSV quid/NgSV quid pro quo/Ng quiescence/Ng quiescent/JY quiet/~JY^>pVdGSNwgnX quieten/VdG quietism/N quietness/Nmg quietude/NgiE quietus/NgS quiff/NSV quill/~NSgV quilt/NSgVd>GZ quilter/Ng quilting/NgV quin/NS quince/NSg quine/~NSVJ quinidine/N quinine/NgV quinoa/N quinsy/Ng quint/~NSg quintessence/~NwSgV quintessential/JYN quintet/~NSg quintuple/JNgSVGd quintuplet/NgS quip/NgSV quipped/~VtT quipping/V6 quipster/NSg quire/NSVir quire's quirk/NSgVdG quirkiness/Ng quirky/~J>^p quirt/NSgV quisling/NSgV quit/~JVbtTSN quitclaim/VSNg quite/~R% quittance/NgV quitter/NSgV quitting/~V6N quiver/NSgJVdG quivery/J quixotic/JNQ quiz/~NgV quizzed/VtT quizzer/NSg quizzes/NVh quizzical/JY quizzing/V6N quo/~VNH quoin/NSgV quoit/NSgVdG quondam/J quorate/NJi quorum/~NSg #quot/B # !! is this due to HTML entity "? quota/~NSg quotability/Ng quotable/J quotation/~NSg quote/~NSVdGU quote unquote/JR quote's quotidian/JN quotient/~NSg qwerty/J # dictionaries prefer QWERTY rabbet/NgSVGd rabbi/~NSg rabbinate/Ng rabbinic/~J rabbinical/~J rabbit/~NgSVGd rabble/VSNmg rabid/JYpN rabidness/Nmg rabies/~Nmg raccoon/~NgS race/~NwgSVGd>Z racecourse/~NSg racegoer/NS racehorse/~NgS raceme/NgS racer/~Ng racetrack/~NgS raceway/~NgS racial/~JYN racialism/Nmg racialist/NgS racily/Ry raciness/Ng racing/~NgV racism/~Nmg racist/~NSgJ rack/~NgSVGd rack-mounted/J racket/~NSgVdG racketeer/NSgVdG racketeering/~NmgV raconteur/NSgV racquet/NSgV@ racquetball/NSg racy/J>^p rad/~JNSg radar/~NSgV radarscope/NSg raddled/J radial/~JYNSg radian/NS radiance/~Ng radiant/~JYN radiate/~VdGSJNnX radiation/~NwSg radiative/~J radiator/~NSg radical/~JYpNSg radicalisation/Ng!_₹ radicalise/VdSG!_₹ radicalism/~Ng radicalization/Nge radicalize/VdSGe radicchio/Ng radices/N9 radii/~N9 radio/~NwgSVdG radioactive/~JYN radioactivity/~Ng radiocarbon/~Ng radiogram/NgS radiographer/NSg radiography/Nmg radioisotope/NgS radiologist/NSg radiology/~Nmg radioman/N0g radiomen/N9 radiometer/NgS radiometric/J radiometry/Ng radiophone/NSg radioscopy/Ng radiosonde/NSg radiosurgery/NwgS radiotelegraph/N0gV radiotelegraphs/N9 radiotelegraphy/Nmg radiotelephone/NgSV radiotherapist/NgS radiotherapy/~Nwg radish/NwgS radium/~NmgV radius/~N0gV radix/N0gS radon/~Ng raffia/Ng raffish/JYp raffishness/Nmg raffle/NSgVdG raft/~NgSVGd>Z rafter/~NgV rafting/~VNmg rag/~NSgVGd raga/NgS ragamuffin/NgS ragbag/Ng rage/~NgSV ragga/N ragged/~JY^>pVtT raggedness/Nmg raggedy/~J>^ ragging/V6N raging/~VJYN raglan/~JNSg ragout/NSgV ragtag/JNS ragtime/~Ng ragweed/Nmg ragwort/Nmg rah/~NJ raid/~NgSVGd>Z raider/~Ng rail/~NwSVGde rail's railcard/NS railing/~JNSgV raillery/NSg railroad/~NSgVGd>Z railroader/Ng railroading/VNg railway/~NSg railwayman/Ng railwaymen/9 raiment/Ng rain/~NwgSVGd rainbow/~NSgJV raincoat/NSg raindrop/NSg rainfall/~NwSg rainforest/~Sg rainmaker/~NSg rainmaking/Ng rainproof/JV rainstorm/NgS rainwater/~Ng rainy/~J>^ raise/~VGd>SNgZ raiser/Ng raisin/~NSgV rajah/~N0g rajahs/N9 rake/~NgSVGd rakish/JYp rakishness/Ng rally/~NSgVdG ram/~NSgVJ ramble/NSgVd>GZz rambler/Ng rambunctious/JYp rambunctiousness/Ng rambutan/NgS ramekin/NSg ramen/Ng ramie/Ng ramification/~Ng ramify/VdSGXn ramjet/NSg rammed/~VtTJ ramming/V6Nw ramp/~NgSVGd rampage/~NSgVdG rampancy/Ng rampant/~JY rampart/~NSgV ramrod/NSgV ramrodded/VtT ramrodding/V6 ramshackle/JV ran/~VtNr ranch/~NgSVd>GZ rancher/~Ng ranching/~VNg rancid/Jp rancidity/Ng rancidness/Nmg rancor/Ng rancorous/JY rancour/Ng!@_₹ rand/~NgV randiness/Ng random/~NSJYpV randomisation/Ng!_₹ randomise/VdSG!_₹ randomization/Ng randomize/VdSG> randomness/NgS randy/~J>^pN ranee/NgS rang/~Vt>Z range/~NwSVGde range's rangefinder/~NS ranger/~NgV ranginess/Ng rangy/J>^p rank/~J^Y>pNgSVGdz ranking/~VJNwg rankle/VdGSN rankness/Nmg ransack/VGdSN ransom/~NwSgVGd>Z ransomer/Ng ransomware/Nmg rant/~VGd>SNgZz ranter/Ng rap/~NSgVGd>Z rapacious/JYp rapaciousness/Nmg rapacity/Ng rapamycin/Ng rape/~NgSV raper/Ng rapeseed/Ng rapid/~J>Y^pNgS rapidity/Ng rapidness/Nmg rapier/NSgJ rapine/NgV rapist/~NSg rapped/VtT rappel/NSgV rappelled/VtT rappelling/V6N rapper/~NSg rapping/~V6NJ rapport/~NgS rapporteur/~NS rapprochement/NSg rapscallion/NgSJ rapt/JYpVN raptness/Ng raptor/~NS rapture/~NgSV rapturous/JY rare/~JY^>pNSVGd rarebit/NgS rarefaction/Nmg rarefy/VGdS rareness/Ng rarity/~NSg rascal/NSgJY rash/~J^Y>pNgSVZ rasher/JcNgV rashness/Ng rasp/NgSVGd raspberry/~NwSgJV raspy/J>^ raster/~NV rasterisation/NwgS!_₹ rasterise/VSdG!_₹ rasterization/NwgS rasterize/VSdG rat/~NSgV ratatouille/Ng ratbag/NS ratchet/~NgSVGdJ rate/~NgSVGd>zXZn rate limit/NgS rated/~JVU ratepayer/NS rater/Ng rather/~JNVR rathskeller/NSg ratification/~Ng ratifier/Ng ratify/~Vd>SGnZ rating/~VNg ratio/~NgSV ratiocinate/VGdSn ratiocination/Ng ration/~NgVdG rational/~JYNSg rationale/~NgS rationalisation/NSg!_₹ rationalise/VdSG!_₹ rationalism/Ng rationalist/~NSg rationalistic/J rationality/~Nmg rationalization/NgS rationalize/VdSG ratlike/J ratline/NSg rattan/~NSgV ratted/VtTJ ratter/NSg ratting/V6N rattle/~Vd>GSNgZz rattlebrain/NSgd rattler/Ng rattlesnake/~NSg rattletrap/JNSg rattly/J rattrap/NSg ratty/J>^N raucous/JYp raucousness/Ng raunchily/Ry raunchiness/Ng raunchy/J^>p ravage/Vd>GSNgZ ravager/Ng ravages/~NgV rave/~NgSVGd>zZ ravel/VdGSNU ravel's raveling/V6SN ravelled/JVtTU!@_₹ ravelling/NSV6!@_₹ raven/~NgSJVdG ravenous/JY ravine/~NSg raving/V6NgJ ravioli/NSg ravish/Vd>SGZL ravisher/Ng ravishing/JYV6N ravishment/Ng raw/~J^>pNgV rawboned/J rawhide/NgV rawness/Ng ray/~NSgV ray casting/Nmg ray marcher/NgS ray marching/Nmg ray tracer/NgS ray tracing/Nmg rayon/Ng raze/VGdSN razor/~NgSV razorback/~NgS razz/NgSVGd razzmatazz/Ng rcpt/N rd/~N re/PNSg(vz re-enable/VdSG reach/~VdGSNgB reachable/~JNU reacquire/VdSG react/~VNv reactance/N reactant/NSg reactionary/~JNSg reactively/Ry reactivity/~N read/~VbtTG>SNgZBz read-only/J readability/~Nmg reader/~Ng readership/~NSg readily/~Ry readiness/~Ng reading/~V6Ng readme/NgS readmitted/VtT readout/NSg ready/~J^>pVdGSN reafforestation/Nm real/~J^>YpNgS real estate/Nmg real time/Ng real-time/J real world/Ng real-world/J realisation/NSg!_₹ realise/VdSGB!_₹ realised/VU!_₹ realism/~Nmg realist/~NSgJ realistic/~JUQ realities/~N9 reality/~Nw0gU realization/~NgS<@!_₹ realize/~VdSGBU<@!_₹ realized/~VU<@!_₹ reallocation/NwgS really/R% realm/~NgS realness/Nmg realpolitik/Nmg realtor/NgS realty/~Ng ream/NgSVGd>Z reamer/Ng reap/~VGd>SNZ reaper/~Ng reapprove/VSGd rear/~VGdSJNg rearguard/~NgS rearmost/J rearview/NSg rearward/NSJ reason/~NwSgVd>GZB reasonable/~JpU reasonableness/NgU reasonably/~RyU reasoner/Ng reasoning/~NgV reassuring/VJYN reauthorise/VS!_₹ reauthorized/V!_₹ reauthorizing/V!_₹ rebadge/VGdS rebalance/VSGd reballing/V6 rebar/NwSg rebarred/VtT rebarring/V6 rebase/VGdS rebate/~NgV rebel/~NgSV rebellion/~NwgS rebellious/~JYp rebelliousness/Nmg rebid/VSN rebidding/V6 rebirth/~NgV reboard/VGdS reboil/VSdG rebox/VSdG rebuckle/VSdG rebuild/~VGSN rebuke/NSgVdG rebuking/VNY rebush/VSdG rebuttal/~NgS rec/~NgVJ rec'd/J recalcitrance/Ng recalcitrant/JN recant/VSdG recantation/NSg recap/~VSNg recapitalisation/NwSg!_₹ recapitalization/NwSg recce/NSJV recd receipt/~NSgVdG receivables/Ng receive/~Vd>GSNZB receiver/~Ng receivership/~Ng recency/Nmg recent/~JYpN # removed comparative and superlative as marginal since only full OED includes it recentness/Ng receptacle/NSg reception/~NwgS receptionist/~NSg receptive/~JYp receptiveness/Ng receptivity/Ng receptor/~NSg recess/~NgSJVdGv recessional/JNSg recessionary/J recessive/~JNSg recherche/~J recidivism/Ng recidivist/NSg recipe/~NSg recipient/~NSgJ reciprocal/~JYNSg reciprocate/VGdSn reciprocation/Ng reciprocity/~Ng recital/~NSg recitalist/NgS recitative/NgSJ reciter/NSg reckless/~JYp recklessness/Ng reckon/VdGSNz reckoning/~VNg reclamation/~Ng recline/Vd>GSNZ recliner/Ng reclock/VdSG recluse/JNSgVv recognisable/JU!_₹ recognisably/RyU!_₹ recognise/Vd>SGB!_₹ recognised/JVtTU!_₹ recognizable/~JU recognizably/RyU recognize/~Vd>SGB recognized/~JVtTU recombination/~Nmg recommender/NgS recompense/NSgVdG recompilation/NwgS recompile/VGdSN recomputation/Nmg recon/~NSV reconcile/~VGdSB reconciler/NgS reconciliation/~NS recondite/JNSgV reconditioner/NgS reconfiguration/N reconfigure/VGdS reconnaissance/~NgS reconnoiter/VdGSN reconnoitre/VGdSN!@_₹ reconstruct/~Vv reconstructed/~VJU reconstructible/J recontest/VSdG recorded/~VJU recorder/~NgS recording/~V6NwgS recordkeeping/Ng recoup/VdG recourse/~NgV recoverability/Nmg recoverable/JNU recovery/~NwSg recreant/JNgS recreational/~J recriminate/VdSGnX recrimination/NwgS recriminatory/J recrudesce/VGdS recrudescence/Ng recrudescent/J recruit/~NSgVd>GLZ recruiter/Ng recruitment/~Ng rectal/JYN rectangle/~NgSJ rectangular/~J rectifiable/J rectification/Nmg rectifier/NgS rectify/Vd>SGXnZ rectilinear/J rectitude/Ng recto/NgS rector/~NSg rectory/~NSg rectum/NSg recumbent/JN recuperate/VGdSnv recuperation/Nmg recur/VS recurred/VtT recurrence/~NSg recurring/~V6JN recurse/VdSG recursion/~NS recuse/VdSG recut/VS recutting/V6 recycle/VSdG>B red/~JpNwSg red-eye/Ng red wolf/Ng red wolves/9 redact/VSdGU redaction/NwgS redactor/NSg redbird/NSg redbreast/NgS redbrick/JN redcap/NSg redcoat/NSgV redcurrant/NS redden/VSdG redder/Jc reddest/Ju reddish/~J redeclare/VSGd redeem/~V>ZB redeemer/~NgS redemption/~Nmg redemptive/J redhead/NSgd redialling/V6!_₹ redirection/Nmg redistribution/VGdSNg redistrict/VGd redivide/VGdS redline/NgVdG redneck/NSg redness/~Nmg redo/VGN redolence/Ng redolent/J redoubt/NSgVB redoubtably/Ry redound/VdGSN redox/Nmg # reduction and oxidation reaction redraw/VGSN redshifted/J redskin/NSg reduce/~Vd>SGZ reducer/Ng reducible/J reductase/Nmg reduction/~NwSg reductionist/JNmg reductive/~J redundancy/~NSg redundant/~JY redwood/~NwSg redye/VdS reediness/Nmg reedy/J>^p reef/~NgSVGd>JZ reefer/Ng reek/~NgSVGd reel/~NSVGdU reel's reelect/VdSG reentrant/J reeve/~NVG reexecute/VSdG reexport/VdGSN ref/~NSgVZ refabricate/VGdS refactor/NSVd refactorable/J refactoring/~NwgSV refashion/VdGS refection/Ng refectory/~NSg refer/~VNB referee/~NSgVd refereeing/V6N reference/~NgSVGd referenceable/J referendum/~NgS referent/NSg referential/~J referral/~NSg referred/~VtT referrer/~NSg referring/~V6N reffed/VtT reffing/V6 refill/NgVB refined/~VtTJNU refinement/~NSg refiner/NSg refinery/~NS refitting/V6N reflash/VdSGNg reflate/VdSGXn reflationary/J reflect/~VGSdv reflection/~NwgS reflective/~JYp reflectivity/~N reflector/~NgS reflexive/~JYNSg reflexivity/N reflexology/N refloat/VdGS reflow/VSGd reforge/VdSG reform/~NgVZ reformat/VdSG reformatory/JNSg reformatting/V6N reformed/~VJU reformist/~JNS refortify/VGdS refract/VSGdv refraction/~Nmg refractory/JNSg refrain/~VGdSNg reframe/NSdG refresh/~VGd>SNZL refresher/Ng refreshing/~JYNV refreshment/NSg refreshments/Ng refrigerant/NSgJ refrigerate/VdSGn refrigeration/~Ng refrigerator/~NgS refuge/~NSgV refugee/~NSgV refulgence/Ng refulgent/J refund/~VNB refurb/NgSVdG refurbishment/~NgS refusal/~NgS refutation/~NgS refute/~Vd>SGBZ refuter/Ng reg/~N regal/~JYNdG regalement/Ng regalia/~Ng regard/~NSgVdGE regardless/~JP regards/~NgV regather/VdGS regatta/~NSg regency/~NSg regeneracy/Ng regenerate/~VJNv regex/NgS regexp/NSg reggae/~Nmg reggaeton/Nmg regicidal/J regicide/~NwgS regime/~NSg regimen/~NSg regiment/~NgSVdG regimental/~J regimentation/Nmg region/~NSg regional/~JYN regionalism/NwgS register/~NgSVGd registered/~VtTJU registrant/~NgS registrar/~NgS registration/~NwSg registry/~NSg reglue/VSdG regnant/JN regolith/NSg regress/NmgSVdGv regression/~NwgS regret/~VSNwg regretful/JY regrettable/J regrettably/Ry regretted/~VtT regretting/V6N regrind/VGS reground/VtT regroup/NSVdG regular/~JYNgS regularisation/NwSg!_₹ regularise/VdSG!_₹ regularity/~NSg regularization/NwSg regularize/VdSG regulate/~VdSGenv regulated/~VJU regulation/~NwSgJe regulations/~N regulator/~NgS regulatory/~J regurgitate/VdGSNn regurgitation/Ng rehab/~NwgSV rehabbed/VtT rehabbing/V6 rehabilitate/~VGdSnv rehabilitation/~Ng rehang/VdGSN rehaul/VSdG rehears/VGd rehearsal/~NwgS rehearsed/~VtTJU rehi/ rehome/VdSG rehung/V reify/VdSGn reign/~NgSVdG reimagine/VSdG reimagined/VtTJ reimburse/VdSGBL reimbursement/NgS reimplementation/NmgS rein/~NVGd reindeer/~NgV reinforce/~VGdSL reinforcement/~NSg reinitialise/V!_₹ reinitialize/V reinstall/VdGN reinstatement/~Ng reinsurance/~Nmg reinvade/VdGS reiterate/VJNv reject/~VGdSNg rejection/~NwSg rejoice/~VGdSz rejoicing/VNg rejoinder/NSgV rejuvenate/VdSGn rejuvenation/Ng rel/~P relate/~V>SGBXZnv related/JYp relater/Ng relation/~Ng relational/~J relationship/~NgS relative/~JYNgS relativism/Nmg relativist/NgS relativistic/~J relativity/~Nmg relativize/VdSG> relax/~Vd>SGZ relaxant/NwgS relaxation/~Nmg relaxer/Ng relay/~NVd release/~NwSgVB released/~VtTU releaser/NgS relegate/VGdSNJn relent/NSVGdJ relentless/~JYp relentlessness/Nmg relevance/~Nmg relevancy/Nmg relevant/~JY reliability/~NmgU reliable/~JNU reliably/~RyU reliance/~Ng reliant/~J relic/~NgSVJ relief/~NSgJ relieve/~VGd>SZ reliever/~Ng religion/~NSgV religiosity/N religious/~JYpNg religiousness/Ng reline/VdGSN relink/VdSG relinquish/~VdSGL relinquishment/Ng reliquary/~NSg relish/NgSVGd relist/VSGd relive/VdSGB!_₹ reloader/NgS relocate/~VB reluctance/~Ng reluctant/~JY rely/~VGdS rem/NgJ remain/~NSVGd remainder/~NgSJVGd remand/~NSVGd remapping/V6N remark/~NV remarkable/J remarkableness/Ng remarkably/~Ry remarked/~VtTJU remediable/J remedy/~NSgVGd remember/~VdG remembered/~VtTU remembrance/~NgSV remilitarize/VGdS reminder/~Ng reminisce/VGdSN reminiscence/NgS reminiscent/~JYN remiss/JYp remissness/Ng remit/~VSN remittance/NSg remitted/VtT remitting/V6NU remix/~NSVdG remnant/~NgSJ remodel/~VGdSN remodelling/V6N!@_₹ remold/VSGd remonstrant/NSgJ remonstrate/VdSG remorse/~NgV remorseful/JY remorseless/JYp remorselessness/Ng remote/~JY^>pNSgV remoteness/~Ng remould/VSdG!@_₹ removal/~NSg remunerate/VGdSnvX remuneration/Ng renaissance/~NgS renal/~J renascence/NS rend/VGSN render/~VGdSNgz renderer/~NSg rendering/~NwgV rendezvous/~NgSVGd rendition/~NgSV renegade/~NSgVdGJ renege/Vd>SGZ reneger/Ng renew/~VdGSN renewable/~JNgS renewal/~NgS rennet/Ng rennin/Ng renounce/~NSVdGL renouncement/Ng renovate/~VdSGXn renovation/~Ng renovator/NgS renown/~NgVd rent/~NmgSVGd>JZ rental/~NSgJ renter/NgV rentier/NgS renunciation/~NwSg reopen/~VSdG reorg/NgSVdG reorientate/VGdSn rep/~NSgV repaint/VGdSN repair/~V>SNwBZ repairability/Nmg repairer/Ng repairman/N0g repairmen/N9 reparable/J reparation/N0gS reparations/~N9g reparse point/NgS repartee/NgV repartition/VSdG repatriate/NSgVdGXn repatriation/~Nmg repeat/~Vd>GSNgZB repeatability/Nmg repeatable/JU repeatably/Ry repeated/~VJY repeater/~Ng repeating/~VJNg repel/~VS repelled/~VtT repellent/JNSg repelling/~V6N repent/~VSdGJ repentance/~Ng repentant/JYN repercussion/NS repertoire/~NgS repertory/~NSg repetition/~NwgSV repetitious/JYp repetitiousness/Ng repetitive/~JYp repetitiveness/Ng rephotograph/VdG replace/VSdG replaceable/~JN replacer/NgS replan/VS replanned/VtT replanning/V6 replant/VGdSN replayable/J replenish/~VGdSL replenishment/~Ng replete/JpNSVdGn repleteness/Ng repletion/Ng replica/~NSg replicant/NgS replicate/~VdGSNJnX replication/~NwSg replicator/NS repo/~NSgV repoliticise/VdSG!_₹ repoliticize/VdSG repop/NgSV repopped/VtTd repopping/V6G report/NgSVdG> reportage/Ng reported/~VY reportorial/J reposeful/J reposition/VdGSN repository/~NSg repost/NgSVdG reprehend/VdGS reprehensibility/Ng reprehensible/JN reprehensibly/Ry reprehension/Ng represent/~VGdS representational/J representative/~JNgS represented/~VtTU repression/~NgS repressive/JYp reprieve/~VdGSNg reprimand/NSgVGd reprisal/~NSg reprise/~NSgVG reproach/NgSVGdB reproachful/JY reprobate/JNgSV reproductive/~JN reprogramming/V6Nmg reproving/VJYN reptile/~NSgJ reptilian/~JNgS republic/~NS republicanism/~Nmg repudiate/VGdSXn repudiation/~Ng repudiator/NgS repugnance/Ng repugnant/J repulsion/~Ng repulsive/~JYp repulsiveness/Ng repunch/VSdG repurchase/VGdSN repurposing/V6Ng reputability/Ng reputably/RyE reputation/~NgS reputational/J repute/NSgVdGB reputed/~VtTJY request/~VGdSN requester/NgS requiem/~NSg require/~VdGL requirement/~NgS requisite/~JNgSXn requisition/NgVGd requital/Ng requite/Vd>GSNZ requited/VU requiter/Ng reradicalize/VdSG rerank/VGdS reranking/NmgV6 reread/VbtTGSN rerecord/NSVGd rerelease/~NSgVGd rerunning/V6 resale/NgSB resample/VGdS resat/V rescale/VSdG rescind/VSdG rescission/Ng rescue/~Vd>GSNgZ reseal/VB research/NmgSVdG researcher/NgS resemble/~VbdSG resend/VbGdSN resent/~VbtTSdGL resentful/~JYp resentfulness/Nmg resentment/~NgS reserpine/Ng reservation/~NgS reserved/~VtTJYU reservedness/Nmg reservist/NSg reservoir/~NSgV resetting/V6N reshipping/V6N reshoot/NgSVG reshot/VtT residence/~NwSg residency/~NSg resident/~NgSJ residential/~JYN residua/N residual/~JNgS residue/~NSg residuum/Ng resignation/~NSg resigned/~JYVtT resilience/~Nmg resiliency/~Nmg resilient/~JY resinous/J resist/~Vd>GSNgZ resistance/~NwSg resistant/~NJU resistible/J resistive/J resistivity/N resistless/J resistor/~NgS resit/VSN resitting/NV6 resizable/J resizeable/J!₹ reskilling/V6 reskin/VSN reskinned/VtTJ reskinning/V6JN resold/V resole/VdSG resolute/~JYpN resoluteness/Nmg resolve/~V>NgB resolved/~VtTJU resonance/~NwSg resonant/~JYN resonate/VGdS resonator/~NSg resorption/Ng resound/VGdSN resounding/JYNV resourceful/JYp resourcefulness/Nmg resp/JNV respawn/VGdSNg respect/~NmSgVGdEv respectability/Nmg respectable/~JN respectably/Ry respecter/NgS!@_₹ respectful/~JYE respectfulness/Nmg respective/~JY respell/VSGd respin/NgSVGd respiration/~Nmg respirator/~NSg respiratory/~J respire/VdGN resplendence/Ng resplendent/JY respond/~VGdSNw respondent/NSgJ responder/NgS response/~NgS responsibility/~NwSg responsible/~JN responsibly/Ry responsive/~JYpU responsiveness/NmgU rest/~NgSVGdv restage/VSdG restamp/VGdS restate/VGdS restaurant/~NSg restaurateur/~NgS restful/JYp restfuller/Jc restfullest/Ju restfulness/Nmg restitution/~Ng restive/JYp restiveness/Nmg restless/~JYp restlessness/Ng restoration/~NwSg restorative/~JNSg restorer/NSg restrained/~JVtTU restraint/~NgS restrict/~VSdGJv restricted/~VtTJU restriction/~NwgS restrictive/~JYpN restrictiveness/Ng restrictor/NgS restring/VSG restroom/NSg restructuring/~V6SNg result/~VGdSNg resultant/~JNSg resumé/NSg résumé/NSg resume/~VdGSNg resumption/~NwgS resupply/~VdGSN resurgence/~NwgS resurgent/JN resurrect/~VGSd resurrection/~NwgS resuscitate/VGdSJn resuscitation/Ng resuscitator/NSg resveratrol/Nmg retail/Nmg retailer/~NgS retain/~Vd>GSNZ retainer/Ng retake/~VGN retaliate/VdSGnvX retaliation/~Ng retaliator/NgS retaliatory/J retap/VS retapped/VtT retapping/V6 retard/NSgVd>GZ retardant/JNSg retardation/Ng retarder/Ng retch/VdGSN reteach/VGS retention/~Ng retentive/JYpN retentiveness/Ng rethink/VGSNg rethought/V reticence/NgV reticent/JY reticulated/J reticulation/NgS reticulum/~N retina/~NSg retinal/~JN retinoblastoma/N retinue/~NSg retiree/NSg retirement/~NgS retort/NgVGd retrace/VGdSN retract/~VdGNB retractile/J retraction/~NwgS retrade/VSdG retrain/VdGSN retransmission/NwgS retread/VdSN retrenchment/NgS retribution/~NgS retributive/J retrieval/~NSg retrieve/~Vd>GSNgZB retriever/Ng retro/~JNmgS( retroactive/~JY retrofire/NSVGdJ retrofit/~VSNg retrofitted/~VtTJ retrofitting/V6N retroflex/JNSg retrograde/~JNSVdG retrogress/VGdSNv retrogression/Ng retronic/J retrorocket/NgS retrospect/~NgSVdGv retrospection/Nmg retrospective/~JYNgS retrovirus/NgS retsina/Ng returnable/JNSg returnee/NSg reusability/Nmg rev/~VNgZv revamping/NgV6 revanchist/JNSg reveal/~NSVGdz revealed/~JVtTU revealing/~JYV6N reveille/Ng revel/~NgSVd>GzZ revelation/~NSg revelatory/J reveler/Ng revelled/VtT!@_₹ reveller/NSg!@_₹ revelling/V6SN!@_₹ revelry/NSg revenge/~NgSVGd revenuer/NSg reverb/~NV reverberate/VdSGJnX reverberation/Ng revere/~VdGSN reverence/~NSgVdG reverend/~JNSg reverent/JY reverential/JY reverie/NgSV revers/Ng reversal/~NSgJ reverse/~JYNV reverser/NgS reversibility/Nmg reversible/~JN reversibly/Ry revert/~NSVGd revertible/J revetment/NSg revile/Vd>GSNLZ revilement/Ng reviler/Ng reviser/NgS revision/~NSgV revisionism/Nmg revisionist/~JNSg revival/~NgS revivalism/Ng revivalist/NSgJ revive/~VdSG revivification/Ng revocable/J revoke/~VdGSN revolt/~VGdN revolting/~V6NJY revolution/~NwSg revolutionarily/J revolutionary/~JNSg revolutionise/VdSG!_₹ revolutionist/NSg revolutionize/VdSG revolve/~VGd>SNBZ revolver/~Ng revote/NgSVdG revue/~NgS revulsion/Ng revved/VtT revving/V6N rewarded/~VtTU rewarding/~JV6U rewarm/VGSd rewash/NSVGd reweave/VGS rewedding/V6 rewind/~VNgB rewound/VtT rewrite/~NgSVG rhapsodic/J rhapsodical/J rhapsodise/VGdS!_₹ rhapsodize/VGdS rhapsody/~NSgV rhea/~NgS rhenium/Nmg rheostat/NSg rhesus/NgS rhetoric/~JNg rhetorical/~JYN rhetorician/NSg rheum/Ng rheumatic/~JNgSQ rheumatism/Ng rheumatoid/~JN rheumy/J rhinestone/NSgJV rhinitis/Ng rhino/~NgS rhinoceros/~NgS rhinoplasty/N rhinovirus/NgS rhizome/NgS rho/~NSg rhodium/Nmg rhododendron/~NSg rhomboid/NSgJ rhomboidal/J rhombus/NgS rhotic/NSgJ # linguistics rhubarb/NgSJV rhyme/~NgSVGd>Z rhymer/NgS rhymester/NgS rhythm/~NwSgV rhythmic/~J rhythmical/JY rial/NgS rib/~NSgV ribald/JN ribaldry/Nmg ribbed/~JVtT ribber/NSg ribbing/V6Nw ribbon/~NSgV riboflavin/~Nmg rice/~NwgSVGd>Z ricer/NgS rich/~J^Y>pNgSV richness/~Nmg rick/~NgSVGd rickets/NmgV rickety/J>^ rickrack/Ng rickshaw/NgSV ricochet/NgSVGd ricotta/Nmg rid/~VS # removed adj flag, too archaic riddance/Ng ridden/~VTJ ridding/V6 riddle/~NSgVdG ride/~VG>SNgZ rideable/J rider/~Ng riderless/J ridership/~Nmg ridge/~NgSVGd ridgepole/NSg ridgetop/NgS ridgy/J ridicule/~VGdSNmgJ ridiculous/~JYp ridiculousness/Nmg riding/~VNg rife/~J^> riff/~NgSVGd riffle/NSgVdG riffraff/Nmg rifle/~NgSVGd>Z rifleman/~N0g riflemen/~N9 rifler/Ng rifling/NgV6 rift/~NgSVGd rig/~NSgV rigatoni/Ng rigged/~JVtT rigger/NSg rigging/~NgV6 right/~JY^>pNgSVdG right-hand/J right-wing/J righteous/~JpVU righteously/Ry righteousness/~NmgU rightful/~JYp rightfulness/Nmg rightism/Ng rightist/NSgJ rightmost/J rightness/Nmg righto/ rightsize/VdSG rightward/JS rigid/~JYpN rigidity/~Ng rigidness/Nmg rigmarole/NgSJ rigor/~NgS rigorous/~JYp rigorousness/Nmg rigour/NSg!@_₹ rile/VGdS rill/~NgSV rim/~NSgVbGd rime/~NgSV rimless/J rimmed/~JVtT rimming/V6N rimstone/NgS rind/NgSV ring/~NgVGd>Zz ringer/~NgS ringgit/NgS09 # singular and plural, also has a plural in -s ringleader/NgS ringlet/NgSV ringlike/J ringmaster/NgSV ringside/~JNg ringtone/NSgV ringworm/NgS rink/~NgS rinse/VGd>SNg riot/~NgSVGd>Z rioter/NgS rioting/~V6Ng riotous/JYp rip/~V>SNg^Xn riparian/~JN ripcord/NgS ripe/~JYpNV ripen/VdG ripened/VtTU ripeness/Ng ripoff/NSg riposte/NgSVGd ripped/~VtTJ ripper/~NSgJ ripping/~V6JN ripple/~NSgVdG ripply/J ripsaw/NSgV riptide/NgS rise/~VG>SNgzZ risen/~VTJ riser/~Ng risibility/Ng risible/J rising/~V6NgJP risk/~NwgSVGd riskily/Ry riskiness/Ng risky/~J>^p risotto/NgS risque/JNV rissole/NSV rite/~NgSJ ritual/~JYNSg ritualised/VtT!_₹ ritualism/Ng ritualistic/JQ ritualized/VtTJ ritzy/J>^ riv/~>Zn rival/~NgSJVdG rivaled/VtTU rivalled/VtTU!@_₹ rivalling/V6!@_₹ rivalry/~NSg rive/~VGdSNe river/~NgV riverbank/~NSg riverbed/NgS riverboat/~NSg riverfront/~N riverside/~NgSJ rivet/NgSVd>GZ riveter/Ng riviera/~NS rivulet/NgS riyal/NgS rm/~NV roach/~NgSVGd road/~NwgSJi road map/NgS # standard in all dictionaries but overtaken by "roadmap" c. 2000 roadbed/NSg roadblock/NgSVdG roadhouse/NSg roadie/~NgSV roadkill/Ng roadrunner/~NSg roadshow/~NSgV roadside/~JNSg roadster/~NSg roadway/~NSg roadwork/NwSg roadworthy/J roam/~VGd>SNZ roamer/Ng roaming/~V6Ng roan/~JNgS roar/~VGd>SNgZ roarer/Ng roaring/~JV6Nmg roast/~VGd>SNwgJZz roaster/Ng roasting/~VJNwg rob/~VbSN robbed/~VtT robber/~NgS robbery/~NwSg robbing/~V6Nm robe/~NSVGdE robe's robin/~NgS robocall/NSgVGd robot/~NgS robotic/~JS robotics/~Ng robotise/VGdS!_₹ robotize/VGdS robust/~J>Y^p robustness/Ng rock/~NwgSVGd>Z rock face/NgS rockabilly/~Ng rockbound/J rocker/~Ng rockery/NS rocket/~NgSVdG rocketry/~Ng rockfall/NSg rockiness/Ng rockstar/NSg rockwool/Ng rocky/~J^>p rococo/~NgJ rod/~NSgV rodder/NgS rode/~VtN rodent/~NgSJ rodeo/~NgSV roe/~NSg roebuck/~NSg roentgen/NgS roger/~VGdSN rogue/~NSJVK rogue's roguery/Ng roguish/JYp roguishness/Nmg roil/VGdS roister/VGd>SNZ roisterer/Ng role/~NgS roleplay/VSdG roll/~Vd>GSNgZzr roll back/V/ roll out/V/ roll over/V/ rollback/~NSgV roller/~NgV rollerblading/NmV6 rollerskating/NmgV6 rollick/VSdG rollicking/V6NgJ rollmop/NS rolloff/NgS rollout/NgS rollover/~NSgV romaine/~NgS roman/~JNg romance/~NgSVGd>Z romancer/Ng romanisation/NSg!_₹ romanization/NSg romantic/~JNgSQ romanticise/VdSG!_₹ romanticism/~Nmg romanticist/NSg romanticize/VdSG romeo/~NgS romp/Vd>GSNgZ romper/NgV rondo/~NSg rood/~NgS roof/~NgSVd>GZ roofer/Ng roofing/~NmgV roofless/J rooftop/~NSg rook/~NgSVdG rookery/NSg rookie/~NSgJV room/~NwgSVd>GJZ roomer/Ng roomette/NSg roomful/NSgJ roominess/Nmg roommate/~NSg roomy/J>^pN roost/~NSgVd>GZ rooster/~Ng root/~NgSVd>GZ rooter/Ng rootkit/NSgV rootless/Jp rootlet/NSg rope/~NgSVGd>Z roper/~Ng ropy/J>^ rosary/~NSg rose/~NgSVtJ roseate/J rosebud/~NSg rosebush/NgS rosemary/~Ng rosette/~NSg rosewater/Ng rosewood/NgS rosily/Ry rosin/NSgVdG rosiness/Ng roster/~NSgV rostrum/NgS rosy/~J^>pVN rot/~VSNwg rota/~NS rotary/~JNSg rotate/~VdSGJnX rotation/~NwSg rotational/~JN rotationally/Ry rotatory/J rote/~NgJV rotgut/Nmg rotisserie/NSgV rotogravure/NgS rotor/~NSg rotoscope/NgSVdG rototiller/NgS rotted/JVtT rotten/~J^>Yp rottenness/Ng rotter/NS rotting/~V6Nm rottweiler/NS rotund/Jp rotunda/~NgS rotundity/Ng rotundness/Nmg rouble/NSg!@_₹ roue/NgS rouge/~JNwSgVdG rough/~J>^YpNgV6dGnX roughage/Ng roughcast/NVJ roughen/VGd roughhouse/NgSVGd roughneck/NgSVGd roughness/Ng roughs/N9Vh roughshod/J roulette/~NgV round/~JY^>pNSgPVdGZ roundabout/~JNSgV roundel/NS roundelay/NgS roundhouse/~NSgV roundish/J roundness/Ng roundup/~NgS roundworm/NSg rouse/~NSVdG roust/VdGSN roustabout/NSgV rout/~NgSV>Z route/~NSVdGrB route's routeing/V6N router/~NgV routine/~NgSJY routinise/VGdS!_₹ routinize/VGdS roux/~N rove/~VGd>SNZ rover/~Ng row/~NSgVGd>Z rowan/~NS rowboat/NgSV rowdily/Ry rowdiness/Ng rowdy/~J>^pNSg rowdyism/Ng rowel/NSgVdG rowelled/VtT!@_₹ rowelling/V6!@_₹ rower/~Ng rowing/~V6Nmg rowlock/NS royal/~JYNSg royalist/~JNSg royalties/~Ng royalty/~NSg rpm/~NO rps rt/~JN rte rub/~NSgV rubato/NSg rubbed/~VtTJ rubber/~NSgJV rubberise/VGdS!_₹ rubberize/VGdS rubberneck/NgSVd>GZ rubbernecker/Ng rubbery/J rubbing/~NSV6 rubbish/~NgSJVdG rubbishy/J rubble/~Ng rubblestone/Ng rubdown/NSg rube/~NgS rubella/Ng rubicund/J rubidium/~Ng ruble/NSg rubric/NSgJV ruby/~NwSgJ^>V ruched/JV ruck/NSVdG rucksack/NgS ruckus/NgS ructions/N rudder/NSg rudderless/J ruddiness/Ng ruddy/~J^>pNV rude/~JY^>p rudeness/Ng rudiment/NSgV rudimentary/~JN rue/~NSgVdG rueful/JYp ruefulness/Ng ruff/~NgSVdGJY ruffian/NgSVJY ruffle/NSgVdG ruffled/VtTJU rug/~NSgVJ rugby/~NgV rugged/~J^Y>pV ruggedization/NwSg ruggedize/VdSG ruggedness/Ng rugger/N rugosa/NgS rugrat/NSg ruin/~NgSVdG ruination/Nmg ruinous/JY rule/~NgSVGd>Zz rulebook/NgS ruler/~NgV ruling/~JNgV6 rum/~NwSgJ rumba/~NSgVdG rumble/~NSgVdGz rumbling/JNwSgV6 rumbustious/J ruminant/JNgS ruminate/VGdSJXnv rumination/Nmg ruminative/JY rummage/VdGSNg rummer/NJc rummest/Ju rummy/NgJ rumor/~Nw☁SgVdG< rumormonger/NSgV< rumour/Nw☁SgVdG!@_₹ rumourmonger/NSgV!@_₹ rump/~NgSVY rumple/VdGSNg rumpus/NgS run/~VbTSNgr # removed `5` adj. a bit marginal and interferes with linter heuristics run away/V/ run time/NwgS run-time/J run-up/NgS runabout/NgS runaround/NSg runaway/~NgSJ rundown/NSgJ rune/~NgS rung/~NgSVTJ runic/~J runlet/NSg runnable/J runnel/NSgV runner/~NSg running/~V6JNmgP runny/J>^ runoff/~NSg runout/NgS runt/NgS runtime/~JNgS runty/J>^ runway/~NSg rupee/~NSg rupiah/Ng09 # singular and plural, also has a plural in -s below rupiahs/N9 rupture/~NgSVGd rural/~JN ruralist/Ng ruse/~NgSV rush/~NgSVd>GJZ rusher/Ng rushy/J rusk/~NgS russet/NSgJV rust/~NmgSVdG rustic/~JNSgQ rusticate/VGdS rustication/Ng rusticity/Ng rustiness/Nmg rustle/NSgVd>GzZ rustler/Ng rustproof/JVSdG rusty/~J>^pNn rut/NSgV rutabaga/NSg ruthenium/Nmg rutherfordium/Nmg ruthless/~JYp ruthlessness/Nmg rutted/VtTJ rutting/V6N rutty/J>^N rye/~Nmg sabbath/~N0g sabbaths/N9 sabbatical/~JNSg saber/~NgSV sable/~NgSJ sabot/NgSV sabotage/~NwSgVdG saboteur/NSg sabra/NgS sabre/NgSV!@_₹ sac/~ONSgV saccharin/Nmg saccharine/JN sacerdotal/J sachem/NSg sachet/NSg sack/~NgSVGd>Zz sackcloth/Ng sacker/Ng sackful/NgSJ sacking/~NgV6 sacra/~N sacralize/VGdSre sacrament/~NgSV sacramental/~JN sacred/~JYpV sacredness/Ng sacrifice/~NSgVdG sacrificial/~JY sacrilege/NgS sacrilegious/JY sacristan/NgS sacristy/~NSg sacroiliac/JNgS sacrosanct/Jp sacrosanctness/Ng sacrum/Ng sad/~JYpVN sadden/VSdG sadder/Jc saddest/Ju saddle/~NSVdGU saddle's saddlebag/NgS saddler/NS saddlery/N sades/NV sadhu/~NS sadism/Nmg sadist/NSg sadistic/~JQ sadness/~Nmg sadomasochism/Nmg sadomasochist/NgSJ sadomasochistic/J safari/~NSgVGd safe/~JY^>pNgSV safeguard/~NSgVdG safekeeping/Ng safeness/Nmg safety/~NwSgVU safflower/NwgS saffron/~NwgSJV sag/~NSgV saga/~NgS sagacious/JY sagacity/Nmg sage/~JY^>NgSV sagebrush/Nmg sagged/VtTJ sagging/NJV6 saggy/J>^ sago/Nmg saguaro/NgS sahib/~NgS said/~VtTJU sail/~NgSVGdz sailboard/NgSV>GZ sailboarder/Ng sailboarding/Ng sailboat/~NgS sailcloth/Nmg sailfish/N09gS # singular and plural, also has a plural in -s below sailing/~V6JNmg sailor/~NSg sailplane/NgSV saint/~NgSVdY sainthood/Nmg saintlike/J saintliness/Nmg saintly/~J>^p saith/VN sake/~Ng saki/Ng!_₹ salaam/~NSgVdG salable/JNU salacious/JYp salaciousness/Nmg salacity/Ng salad/~NwgS salamander/~NSgV salami/NwSg salary/~NSgVdJ sale/~NgSrB saleable/JNU!@_₹ saleroom/NS salesclerk/NSg salesgirl/NSg saleslady/NSg salesman/~N0g salesmanship/Nmg salesmen/~N9 salespeople/N9g salesperson/N0gS salesroom/NS saleswoman/N0g saleswomen/N9 salience/Nmg salient/~JYNSg saline/~JNSg salinity/~Ng saliva/~Nmg salivary/~JN salivate/VGdSn salivation/Nmg sallow/J^>pVN sallowness/Nmg sally/~NSgVdG salmon/~NwSg09JV # singular and plural, also has a plural in -s below salmonella/N0g salmonellae/N9 salon/~NgS saloon/~NSg salsa/~NwgSV salt/~NwSJ^VGde salt's saltbox/NgS saltcellar/NSg salted/~JVtTU salter/~N saltine/NSg saltiness/Ng saltpeter/NgV saltpetre/NgV!@_₹ saltshaker/NSg saltwater/~NgJ salty/~J>^p salubrious/Ji salutary/J salutation/NgS salutatorian/NgS salutatory/JN salute/~NSgVdG salvage/~NSgVdG salvageable/JU salvation/~NgV salve/NgSVGd>Z salver/Ng salvo/~NgSV samara/~N0S samarae/N9 samarium/Nmg samba/~NgSVdG same/~JpIS same sex/Ng same-sex/J sameness/Ng samey/J samizdat/NS samosa/NS samovar/NSg sampan/NSg sample/~NSgVd>GZz sampler/~Ng sampling/~VtTNmg samurai/~NSg sanatorium/~NSg sanctification/~Ng sanctify/VGdSn sanctimonious/JYp sanctimoniousness/Ng sanctimony/Ng sanction/~NSgVGd sanctioned/~VtTU sanctity/~Ng sanctuary/~NSg sanctum/~NSg sand/~NgSJ>VGdZ sandal/~NSg sandalwood/Ng sandbag/NSgV sandbagged/VtT sandbagger/NSg sandbagging/V6N sandbank/NgS sandbar/NSg sandblast/VGd>SNgZ sandblaster/Ng sandbox/~NgSVdG sandcastle/NgS sander/~Ng sandhi/Nmg sandhog/NSgV sandiness/Ng sandlot/NSg sandlotter/NgS sandman/~N0g sandmen/N9 sandpaper/NmgSVGd sandpiper/~NgS sandpit/NS sandstone/~Nmg sandstorm/NSg sandwich/~NgSVdGJ sandy/~J>^pN sane/~JY^>i saneness/Nmg sang/~VtSN sangfroid/Nmg sangria/Nmg sanguinary/JN sanguine/JYNV sanitaria/N9 sanitarian/JNSg sanitarium/N0Sg sanitary/~JNiU sanitation/~Nmg sanitisation/Nmg sanitise/VGd>SZ!_₹ sanitization/Nmg< sanitize/VGd>SZ< sanity/~Nmgi sank/~Vt sans/~PJN sans serif/NgJ sanserif/NJ # dictionaries prefer: sans serif sap/~NSgV sapience/Nmg sapiens/~N sapient/JN sapless/J sapling/NgS sapped/VtT sapper/NSg sapphire/~NwSgJ sappiness/Ng sapping/V6N sappy/J>^p saprophyte/NSg saprophytic/J sapsucker/NSg sapwood/~Ng saran/Ng sarcasm/~NgS sarcastic/~JQ sarcoma/NgS sarcophagi/~N9 sarcophagus/~N0gV sardine/NgSVJ sardonic/JQ sarge/NgSV sari/~NgS sarky/J sarnie/NS sarong/NSg sarsaparilla/NgS sartorial/JY sash/~NgSV sashay/NSgVGd sass/NgSVGd sassafras/NgS sassy/~J>^ sat/~JVtTN satanic/~J satanical/JY satanism/~Nmg satanist/~NgS satay/~N satchel/NgS sate/~VGdSN sateen/Ng satellite/~NSgVdG satiable/Ji satiate/VGdSJn satiation/Nmg satiety/Nmg satin/~NmgJV satinwood/NSg satiny/J satire/~NSg satiric/J satirical/~JY satirise/VdSG!_₹ satirist/~NSg satirize/VdSG satisfaction/~N0mgE satisfactions/N9 satisfactorily/RyU satisfactory/~JNU satisfied/~VtTJU satisfy/~VdSGE satisfying/~JV6U satisfyingly/Ry satnav/NgS satori/Ng satrap/NSg satsuma/~NS saturate/VbdGSNJn saturated/~VtTJU saturation/~Ng saturnine/J satyr/NgS satyriasis/Ng satyric/J sauce/~NwgSVGd>Z saucepan/NSgV saucer/~NgV saucily/Ry sauciness/Ng saucy/J>^p sauerkraut/Nmg sauna/NgSVdG saunter/VdGSNg saurian/NJ sauropod/NSg sausage/~NwgSV saute/VSg sauteed/VtT sauteing/V6 savage/~JY^>pNSgVdG savageness/Nmg savagery/~NSg savanna/~NgS savant/NSg save/~VGd>SNgPCBzZ saved/~VtTJU saver/Ng saving/~NwgV6JP savings/~Nmg savior/~NSg< saviour/NgS!@_₹ savor/NgSVdG savoriness/Nmg< savory/J^>pNSg savour/NSgVGd!@_₹ savouriness/Nmg!@_₹ savoury/J^>pNSg!@_₹ savoy/~NgS savvy/~J^>VdGSNg saw/~NSgVtGd sawbones/Ng sawbuck/NgS sawdust/~NmgV sawfly/NSg sawhorse/NSg sawmill/~NgSV sawyer/~NSg sax/~NgSV saxifrage/NSg saxophone/~NgSV saxophonist/~NSg say/~VbGSNU say's saying/~V6SNwg scab/NgSV scabbard/~NgSV scabbed/VtTJ scabbiness/Nmg scabbing/V6 scabby/J^>p scabies/Nmg scabrous/J scad/NgS scaffold/~NSgVG scaffolding/~NgV6 scag/NSV scagged/VtT scalability/Nmg scalable/JU scalar/~JNgS scalawag/NgS scald/VdGSNgJ scale/~NwSVGde scale's scaleless/J scalene/JN scaliness/Ng scallion/NgS scallop/NSgVGd scalp/~NwgSVd>GZ scalpel/~NSg scalper/Ng scaly/~J>^pN scam/~NgSV scammed/VtT scammer/NS scamming/V6 scammy/J>^ scamp/~NgSV>Z scamper/NgVGd scampi/Ng scan/~VSNg scandal/~NwSgV scandalise/VdSG!_₹ scandalize/VdSG scandalmonger/NSg scandalous/~JY scandium/Nmg scanned/~JVtT scanner/~NSg scanning/~V6N scansion/NgV scant/~J^VdGSNe scanter/Jc scantily/Ry scantiness/Ng scantly/R% scantness/Ng scanty/J>^pS scapegoat/~NSgVGd scapegrace/NgS scapula/~Ng scapulae/9 scapular/NSgJ scar/~NgSVGd scarab/~NSg scarce/~J>Y^p scarceness/Ng scarcity/~NSg scare/~NgSVJ scarecrow/~NgSV scaremonger/NSgVG scarf/~N0gSVdG scarification/Ng scarify/VdSGn scarily/Ry scariness/Ng scarlatina/Ng scarlet/~NgJV scarp/~NgSVd>GZ scarper/VdG scarred/~VtTJ scarring/~V6N scarves/N9 scary/~J>^pN scat/NgSV scathing/~V6JY scatological/J scatology/Nmg scatted/VtT scatter/~VGdSNgz scatterbrain/NSgd scattering/~V6Ng scattershot/J scatting/V6N scatty/JN scavenge/VGd>SZ scavenger/NgV scenario/~NgS scenarist/NgS scene/~NgSV scenery/~Nmg scenic/~JNQ scenography/Nmg scent/~NwgSVe scented/~JVtTU scenting/V6N scentless/J scepter/NgSV sceptic/NgSJ!_₹ sceptical/JY!_₹ scepticism/Nmg!_₹ sceptre/NgSV!@_₹ sch/~N schadenfreude/Nmg schedule/~NSVbdGr schedule's scheduled/~VtTJNU scheduler/~NS schema/~N0gS schemata/N9 schematic/~JNSg schematically/Ry schematise/VGdS!_₹ schematize/VGdS scheme/~NSgVd>GZ schemer/Ng scherzo/~NgS schilling/~NgS schism/~NSg schismatic/JNSg schist/Ng schistosomiasis/N schizo/NSg schizoid/JNgS schizophrenia/~Nmg schizophrenic/JNSg schlemiel/NSg schlep/VSNg schlepped/VtT schlepping/V6 schlock/Nmg schlocky/J>^ schlong/NgSx schmaltz/Ng schmaltzy/J^> schmo/N0g schmoes/N9 schmooze/Vd>GSNZ schmuck/NgSV schmutz/Ng schnapps/Ng schnauzer/NSg schnitzel/NSg schnook/NgS schnoz/NgS schnozzle/NSg scholar/~NgSY scholarship/~NgSV scholastic/~NJ scholastically/Ry scholasticism/N school/~NwSgVGd schoolbag/NgS schoolbook/NSg schoolboy/~NgSJ schoolchild/Ng schoolchildren/~9g schooldays/N schooled/~VtTU schoolfellow/NSg schoolgirl/~NSgV schoolhouse/~NSg schooling/~NmgV6 schoolish/JY schoolkid/NS schoolmarm/NSgV schoolmarmish/J schoolmaster/~NgSV schoolmate/NSg schoolmistress/NgS schoolroom/NSg schoolteacher/~NgS schoolwork/Nmg schoolyard/NSg schooner/~NSg schuss/NgSVGd schussboomer/NgS schwa/NgSV sci/~N sci-fi/Ng sciatic/JN sciatica/Nmg science/~NwgSVW scientific/~JUQ scientism/Nmg scientist/~NSg scientistic/J scimitar/~NSgV scintilla/NgS scintillate/VdSGn scintillation/Ng scion/~NgS scissor/~NSVbGd scleroses/N9 sclerosis/~Nm0g sclerotic/JN scoff/NgSVd>GZ scoffer/Ng scofflaw/NgS scold/NgSVdGz scolding/NgV6 scoliosis/Ng sconce/NSgV scone/~NgSV scoop/~NgSVdG scoopful/NgS scoot/NSVd>GZ scooter/~NgV scope/~NgSVGd scorbutic/J scorch/NgSVd>GZ scorcher/Ng score/~NgSVGd>Z scoreboard/~NSg scorecard/~NgS scorekeeper/NgS scoreless/~J scoreline/NS scorer/~Ng scorn/Vd>GSNgZ scorner/Ng scornful/JY scorpion/~NgS scotch/~NgSVdGJ scotchs scoundrel/NgS scour/Vd>GSNZ scourer/Ng scourge/~NSgVdG scout/~NgSVd>GZ scouting/~Ng scoutmaster/NgS scow/~NgSV scowl/NgSVdG scrabble/~VGd>SNgZ scrabbler/Ng scrag/NgSV scraggly/J>^ scraggy/J^> scram/VSN scramble/~VGdSNU scramble's scrambler/NgS scrammed/VtT scramming/V6 scrap/~NgSVd>GZz scrapbook/NSgV scrape/VSNg scraper/Ng scrapheap/NSg scrapie/N scrapped/~VtT scrapper/NgS scrapping/~V6N scrappy/J^> scrapyard/NSg scratch/~VGdSNgJ scratchcard/NS scratched/~JVtTU scratcher/NgS scratchily/Ry scratchiness/Ng scratchpad/NS scratchy/J>^p scrawl/NSgVdG scrawly/J scrawniness/Ng scrawny/J^>p scream/~NSgVd>GZ screamer/Ng screaming/~V6JYN scree/NgSVd screech/NgSVGd screechy/J^> screed/NSVJ screen/~NSgVdGz screening/~NgV6 screenplay/~NSgV screensaver/NSg screenshot/~NSV screenwriter/~NSg screenwriting/~Ng screw/~NSVdGU screw's screwball/NgSJ screwdriver/NgS screwiness/Ng screwworm/NSg screwy/J>^p scribal/J scribble/VGd>SNgZ scribbler/Ng scribe/~NSVKi scribe's scrim/NgSV scrimmage/~NgSVGd scrimp/NSVdGJ scrimshaw/VdGSNwg scrip/NgS script/~NSgVdGWB scripted/~VtTJU scriptural/~J scripture/~NwgS scriptwriter/~NSg scrivener/NSg scrod/NgV scrofula/Ng scrofulous/J scrog/NS scroll/~NSgVGd scrollable/J scroller/NgS scrooge/~NgSV scrota/N9 scrotal/J scrotum/N0g scrounge/Vd>GSNZ scrounger/Ng scroungy/J^> scrub/~JNwgSV scrubbed/VtTJ scrubber/NSg scrubbing/V6N scrubby/J>^N scruff/~NSgV scruffily/Ry scruffiness/Nmg scruffy/J>^pN scrum/~NOSV scrumhalf/N0 scrumhalves/N9 scrummage/NSV scrummed/VtT scrumming/V6 scrump/NSVGd scrumptious/JY scrumpy/N scrunch/VdGSNg scrunchy/NSgJ scruple/NgSVGd scrupulosity/Ng scrupulous/JYpU scrupulousness/NgU scrutineer/NSV scrutinise/VGdS!_₹ scrutinize/VGdS scrutiny/~NgV scuba/~NwgSVdG scud/~JVSNg scudded/VtT scudding/V6NJ scuff/VdGSNg scuffle/~NgSVGd scull/NgSVd>GZ sculler/Ng scullery/NSg scullion/NSg sculpt/~VGdSN sculptor/~NSg sculptress/NgS sculptural/~J sculpture/~NwSgVdG scum/~NmgSV scumbag/NgS scumble/NSVGd scummed/VtT scumming/NmgV6 scummy/J^> scupper/NgSVdG scurf/Ng scurfy/J scurrility/Nmg scurrilous/JYp scurrilousness/Nmg scurry/VGdSNg scurvily/Ry scurvy/J^>Nmg scutcheon/NSg scuttle/NgSVGd scuttlebutt/NgV scuzziness/Ng scuzzy/J^> scythe/NSgVdG sea/~NSg sea lane/NgS seabed/~NSg seabird/~NgS seaboard/~NSg seaborne/J seacoast/NSg seafarer/NSg seafaring/JNgm seafloor/NSg seafood/~Ng seafront/NSg seagoing/~J seagull/~NgSV seahawk/NgS seahorse/NgS seal/~NSVdGrU seal's sealant/~NwgS sealer/NwSg sealskin/Nwg seam/~NgSVGdn seaman/~Ng seamanship/Nmg seamless/~JY seamount/NgS seamstress/NgS seamy/J>^ seance/NSgV seaplane/~NSg seaport/~NgS sear/JVGdSNg search/~NwgSVGd>Z searchable/~JNU searcher/Ngr searching/~V6JYNm searchlight/~NwgSV searing/JYNmV6 seascape/NSg seashell/NSgJ seashore/~NSg seasick/Jp seasickness/Nmg seaside/~NgSJ season/~NSgVGdBz seasonable/JU seasonably/RyU seasonal/~JYN seasonality/N seasoned/~VtTJU seasoning/~NwgV6 seastead/NgS seasteading/Ng seat/~NSVGdU seat belt/NgS seat's seating/~VNmg seatmate/NSg seawall/NgS seaward/JSg seawater/~NmgJ seaway/~NSg seaweed/~NwgS seaworthiness/Ng seaworthy/Jp sebaceous/~J seborrhea/Ng seborrhoea/Ng!_₹ sebum/N sec/~NSg sec'y/N secant/NSgJ secateurs/N9 secede/~VdSG secession/~Nmg secessionist/~NgSJ seclude/VGdS seclusion/~Nwg seclusive/JN second/~JY>NSgVGdLZ second-degree/J secondarily/R # ordinal/sentence adverb secondary/~JNSg seconder/Ng secondhand/JN secondment/NS secrecy/~Nmg secret/~NSgVGdJYv secretarial/J secretariat/~NgS secretary/~NSgV secretaryship/Ng secrete/~JVSXn secretion/~Ng secretive/~JYp secretiveness/Ng secretory/JN sect/~NgSi sectarian/~JNgS sectarianism/Nmg sectary/NSg section/~NSgVrE sectional/~JNgS sectionalism/Ng sectioned/VtTN sectioning/V6N sector/~NSgE sectoral/J sectored/J secular/~JN secularisation/Nmg!_₹ secularise/VdSG!_₹ secularism/~Nmg secularist/NSg secularization/Nmg secularize/VdSG secure/~JY^>VdSG secured/~VtTJU security/~NmSgi secy sedan/~NgS sedate/JY^>pVdSGnv sedateness/Nmg sedation/Nmg sedative/NSgJ sedentary/~JN sedge/~Nmg sedgy/J sediment/~NwgSV sedimentary/~JN sedimentation/Nmg sedition/~Nmg seditious/J seduce/~Vd>SGZ seducer/NgS seduction/~NwSg seductive/JYp seductiveness/Nmg seductress/NgS sedulous/JY see/~V>SNgZ seed/~NSVGdr seed's seedbed/NgS seedcase/NgS seeded/~JVtTU seeder/NSg seediness/Ng seedless/J seedling/~NgS seedpod/NgS seedy/J>^p seeing/~V6SJNC seek/~VG>SNZ seeker/~Ng seem/~VGdS seeming/~V6JYN seemliness/NgU seemly/J>^pU seen/~VTNU seep/VGdSN seepage/Nmg seer/~NgS seersucker/Ng seesaw/NSgVdGJ seethe/VdGSN segfault/NSV segment/~NSgVGd segmentation/Nmg segmented/~VtTJU segregate/JVdGSNen segregated/~VtTJU segregation/~Nmge segregationist/NgSJ segue/~VGdSNg segueing/V6 seigneur/~NSg seignior/NSg seine/~NgSVGd>Z seiner/Ng seismic/~JQ seismograph/N0g>Z seismographer/NgS seismographic/J seismographs/N9 seismography/Nmg seismologic/J seismological/J seismologist/NgS seismology/Nmg seize/~VGdSU seizure/~NgSV seldom/~R8 # removed `J` adjective sense is archaic select/~JVSGdev selection/~NwSg selective/~JY selectivity/Ng selectman/Ng selectmen/9 selectness/Ng selector/~NgS selenium/Nmg selenographer/NgS selenography/Nmg self/~INgVJ self-awareness/Nmg self-deception/Nmg self-driving/NgJ self-fund/VSdG self-hosted/J self-indulgent/J self-obsessed/J self-tapping/J selfie/NSgV selfish/~JYpU selfishness/NgU selfless/~JYp selflessness/Ng selfsame/JN sell/~VG>SNrZB sell's seller's selloff/NgS sellotape/NSVdG sellout/NgS seltzer/NgS selvage/NgSV selves/N semantic/~JNSQ semanticist/NgS semantics/~Ng semaphore/NSgVdG semblance/NSgr semen/~Nmg semester/~NSg semi/~NgS semiannual/JYN semiarid/J semiautomatic/JNgSQ semibreve/NS semicircle/NSgV semicircular/~J semicolon/NgS semiconducting/J semiconductor/~NgS semiconscious/J semidarkness/Ng semidetached/JN semidormant/J semifinal/~NSg semifinalist/NgS semigloss/JNS semimonthly/JNSg seminal/~JN seminar/~NgSV seminarian/NSg seminary/~NSgJ semiofficial/J semiotic/JS semiotics/~Nmg semipermeable/J semiprecious/J semiprivate/J semipro/JNS semiprofessional/JNSg semiquaver/NgS semiretired/J semiskilled/J semisolid/JN semistructured/J semisweet/J semitone/NSg semitrailer/NgS semitransparent/J semitropical/J semivowel/NSg semiweekly/JNSg semiyearly/J semolina/Nmg sempstress/NgS senate/~NSg senator/~NgS senatorial/~J send/~VG>SNZ sender/~Ng sendoff/NgS senes senescence/Ng senescent/J senile/JN senility/Nmg senior/~JNSg seniority/~Nmg senna/~Ng senor/NgS senora/NSg senorita/NSg sensation/~NgS sensational/~JY sensationalise/VGdS!_₹ sensationalism/Nmg sensationalist/JNgS sensationalize/VGdS sense/~NwgSVGd sensei/NgS senseless/JYp senselessness/Nmg sensemaking/Ng sensibilities/~N9 sensibility/~N0wgi sensible/~JpN sensibleness/Nmg sensibly/Ryi sensitisation/Nge!_₹ sensitise/VdSGe!_₹ sensitive/~JYpNSg sensitiveness/Nmg sensitivities/N sensitivity/~Nwgi sensitization/NwSge sensitize/VdSGe sensor/~NSg sensory/~JN sensual/~JY sensualist/NSg sensuality/Nmg sensuous/JYp sensuousness/Nmg sent/~VtTNWrU sentence/~NgSVGd sententious/JY sentience/Ngi sentient/~JNi sentiment/~NSg sentimental/~JY sentimentalisation/Ng!_₹ sentimentalise/VGdS!_₹ sentimentalism/Nmg sentimentalist/NgS sentimentality/Nmg sentimentalization/Ng sentimentalize/VGdS sentinel/~NgSV sentry/~NSg sepal/NgS separability/Nmgi separable/~J separably/Ryi separate/~JYpVGdSNgXnv separateness/Ng separation/~NwgS separatism/~Nmg separatist/~NgSJ separator/~NgS separatrices/9 separatrix/NgS sepia/NgJ sepsis/~Nmg septa/~N septal/J septet/NSg septic/~JN septicaemia/Nmg!_₹ septicaemic/J!_₹ septicemia/Nmg septicemic/J septuagenarian/NgSJ septum/~Ng sepulcher/NgSVGd sepulchral/J sepulchre/NgSVGd!@_₹ seq/~N sequel/~NSg sequence/~NgSVGd>Z sequencing/~V6Ng sequential/~JYW sequester/VdGSN sequestrate/VGdSJXn sequestration/Nmg sequin/NSgVd sequinned/JtT sequitur/N sequoia/~NgS seraglio/NgS serape/NSg seraph/N0g seraphic/J seraphs/N9 sere/J^>N serenade/~NgSVGd serendipitous/J serendipity/Nmg serene/~JY^>pVN sereneness/Nmg serenity/~Nmg serf/NgS serfdom/~Nmg serge/~NgV sergeant/~NgS serial/~JYNSgV serialisation/NwSg!_₹ serialise/VGdSB!_₹ serialization/NwSg serialize/VGdS>B series/~Ng09 # singular and plural serif/~NgSJ serigraph/N0g serigraphs/N9 serine/~N serious/~JYpU seriousness/~NmgU sermon/~NSgV sermonise/VGdS!_₹ sermonize/VGdS serology/Nmg serotonin/~Nmg serous/~J serpent/~NgSV serpentine/~JNgV serrate/JVdXn serration/Ng serried/VJ serum/~NwgS servant/~NgSV serve/~NSVGdWre serve's/rW server/~NSg serverless/J servery/NS service/~NgSVE serviceability/Nmg serviceable/~J serviced/~VtT serviceman/Ng servicemen/~9g servicewoman/Ng servicewomen/9 servicing/~V6N serviette/NgS servile/JN servility/Ng serving's servings/N servitor/NgS servitude/~Ng servlet/NgS servo/NgSV servomechanism/NSg servomotor/NgS sesame/~NwSg sesquicentennial/JNgS session/~NgSV set/~VbtTSNgJri set up/V/ setback/~NgS setscrew/NSg setsquare/S sett/NSVG>BzZ settee/NgS setter/NgV setting/~NwgSV6J settle/~VGdSNrU settle's settlement/~N0gr settlements/~N9 settler/~NSg setup/~NgS seven/~NgSH seventeen/~SgH seventeenth/~JN0g seventeenths/N9 seventh/~JN0g sevenths/N9 seventieth/JN0g seventieths/N9 seventy/~SgH sever/~VGdS^E several/~JYDq severance/NSg severe/~JY>p severeness/Ng severity/~NgS sew/~VbGdSNr sewage/~Ng sewer/~NgSV sewerage/~Ng sewing/~V6Ng sewn/~VTr sex/~NgSVGd sexagenarian/NSgJ sexily/Ry sexiness/Ng sexism/~Ng sexist/~JNgS sexless/J sexologist/NSg sexology/Ng sexpot/NgS sextant/NSg sextet/~NgS sexting/NmgV6 sexton/~NgS sextuplet/NSg sexual/~JYN sexuality/~Nmg sexualize/VGdS sexy/~J^>p sf/~N sh/~ shabbily/Ry shabbiness/Ng shabby/J^>pV shack/~NgSVdGJ shackle/NSVGdU shackle's shad/~NgSGdz shade/~NwgSV shader/NgS shadily/Ry shadiness/Ng shading/~V6Ng shadow/~NSgJVGd shadowban/NgSV shadowbanned/VtTJ shadowbanning/V6NJ shadowbox/NSVGd shadowy/~J>^ shady/~J>^p shaft/~NgSVdG shag/NgSVJ shagged/JVtT shagginess/Ng shagging/V6NJ shaggy/~J^>p shah/~Ng shahs/N shakable/J shake/~VG>SNgZ shakedown/NSgJ shaken/~VJNU shakeout/NgS shaker/~NgS shakeup/NgS shakily/Ry shakiness/Nmg shaky/~J>^p shale/~NmgV shall/~A shallot/NgS shallow/~J^Y>pNgSV shallowness/Nmg shalom/~NV shalt/V sham/~JNgSVGd shaman/~NSg shamanic/~J shamanism/~Nmg shamanistic/J shamble/VGdSNg shambles/NgV shambolic/J shame/~NwgSJV shamefaced/JY shameful/~JYp shamefulness/Ng shameless/~JYp shamelessness/Nmg shammed/VtT shamming/V6 shampoo/NwgSVGd>Z shampooer/Ng shamrock/~NwgS shan't/VA shandy/NSJ shanghai/~VdGSN shank/~NgSVdGJ shantung/Ng shanty/NSgJV shantytown/NSg shape/~NwSVGdr shape's shaped/~JVtTU shapeless/JYp shapelessness/Ng shapeliness/Ng shapely/J^>p shapeshift/VdSG shard/~NgSVGd share/~NgSVGd>Zr shareable/JN sharecrop/VS sharecropped/VtT sharecropper/NgS sharecropping/NV6 shareholder/~NSg shareholding/~JNS sharer/Ng shareware/Nmg sharia/~Ng shariah/N shark/~NgSVdG shark-infested/J sharkskin/Ng sharp/~JY^>pNgSVdGnXZ sharpen/VdGSr sharpener/NgS sharper/~JNg sharpie/NgS sharpish/J sharpness/~Ng sharpshooter/~NSg sharpshooting/NgV shatter/~VGdSNg shatteringly/Ry shatterproof/JV shave/~VGd>SNgZz shaven/JVU shaver/Ng shaving/~NgV6 shawl/~NgSV shay/~NgS she/~Ia3s* # I~pronoun a:personal 3:person .~singular s~subject *:3rd pers. sing. subj. she'd/ she'll/ she's/ sheaf/~NgV shear/~Vd>GSNgJZ shearer/~Ng sheath/~N0gVz sheathe/VGdSU sheathing/NgV sheaths/N9 sheave/NSgVdG shebang/NgS shebeen/NSV shed/~VtTSNg shedding/~V6N sheen/~JNgV sheeny/NJ^> sheep/~N09g # singular and plural sheepdog/NgSV sheepfold/NSg sheepherder/NgS sheepish/JYp sheepishness/Nmg sheepskin/NwgS sheer/~J^>pNgSVdG sheerness/Nmg sheet/~NgSVG sheeting/~NgV sheetlike/J sheetrock/Nmg sheik/N0gS@ sheikdom/NgS sheikh/~N0g sheikhs/N9 sheila/~NS shekel/NSg shelf/~N0g shell/~NwgSVd>G shellac/NwgSV shellacked/JtT shellacking/V6SNg shellfire/Ng shellfish/~N09gS # singular and plural, also has a plural in -s shelter/~NgSVGd shelve/VbGdS shelves/VhN9 shelving/JV6Nmg shenanigan/NSg shepherd/~NSgVdG shepherdess/NgS sherbet/NwSg sheriff/~NSgV sherry/~NwSg shew/VGdSN shewn/V shh/NV shiatsu/Nmg shibboleth/N0g shibboleths/N9 shield/~NgSVd shielding/NgV6 shift/~NgSVGd shifter/~NgS shiftily/Ry shiftiness/Nmg shiftless/JYp shiftlessness/Nmg shifty/J>^p shiitake/NwSg shill/NgSVGdz shillelagh/N0g shillelaghs/N9 shilling/~N0wgV6 shillings/N9g shim/NgSV shimmed/JVtT shimmer/VdGSNg shimmery/J shimming/V6N shimmy/~NSgVdG shin/~NgSVGd>Z shinbone/NSg shindig/NSg shine/~VSNwg shiner/~NgS shingle/~NSgVdG shinguard/NgS shininess/Nmg shinned/VtT shinning/V6 shinny/VdGSN shinsplints/N9g shiny/~J^>pN ship/~NSVrL ship's shipboard/JNgS shipbuilder/NSg shipbuilding/~Nmg shipload/NSg shipmate/NSg shipment/~N0gr shipments/~N9 shipowner/NgS shippable/J shipped/~JVtTr shipper/NSg shipping/~NmgV6 shipshape/J shipwreck/~NgSVGd shipwright/NgS shipyard/~NSg shire/~NgSV shirk/VGd>SNZ shirker/Ng shirr/VGdSNgz shirring/NgV6 shirt/~NgSVGd shirtfront/NSgV shirting/Ng shirtless/J shirtsleeve/NSg shirttail/NSg shirtwaist/NgS shirty/J shit/~NwSgJVx shitcoin/NgSx shite/NgSJVdGx!₹ shitfaced/Jx shitfest/NgSx shithead/NSx shitless/Jx shitload/NSx shitpost/NgSdGx shitted/VtTx shitting/NV6Jx shitty/J>^x shiv/~NgSV>Z shiver/VdGNg shivery/J shoal/~JNgSVGd shoat/NgS shock/~NwgS☁J>GdZ shocker/~Ng shocking/~JYV6N shockproof/JV shod/JVtTU shoddily/Ry shoddiness/Ng shoddy/J>^pNg shoe/~NgSV shoehorn/NgSVGd shoeing/V6N shoelace/~NgS shoemaker/~NSg shoeshine/NSg shoestring/NSgJV shoetree/NgS shogun/~NgS shogunate/~Ng shone/~V shonky/J shoo/VGdSI shook/~NVtJ shoot/~VG>SNgZz shooter/~NgS shooting/~V6NgJ shootout/~NgS shop/~NgSV shopaholic/NgS shopfitter/NS shopfitting/N shopfront/NS shophouse/NgS shopkeeper/NgS shoplift/NSVd>GZ shoplifter/NgS shoplifting/NmgV6 shoppe/NgSGd>Z shopper/Ng shopping/~V6Nmg shoptalk/Ng shopworn/J shore/~NgSVGd shorebird/NSg shoreline/~NgS shoreman/N0g shoremen/N9 shoring/V6Ng short/~J^Y>pNgSVGdPXn short circuit/NgSVdG short-circuit/lSdG short-lived/J short-term/JR shortage/~NgS shortboard/NgS shortbread/Ng shortcake/NgS shortchange/VdSG shortcoming/NgS shortcrust/J shortcut/~NgSVtTB shortcutting/NgV6 shorten/~VGdz shortener/NgS shortening/~NgV6 shortfall/NgS shorthand/~NgVd shorthorn/JNgS shortish/J shortlist/~NSVdG shortness/Ng shortsighted/JYp shortsightedness/Ng shortstop/~NgSV shortsword/NSg shortwave/~JNgS shorty/NSgI shot/~JNgSVtT shotgun/~NSgV shotgunned/VtT shotgunning/V6 should/~A should've/VA shoulder/~NgSVdG shoulder to shoulder/R shoulder-to-shoulder/R shouldn't/VA shout/~NgSVGd>Z shout-out/NS shouter/Ng shove/VGdSNg shovel/~NgSVdG shovelful/NSg shovelled/VtT!@_₹ shovelling/V6N!@_₹ shovelware/Nmg show/~VbGd>SNgzZ show off/V/ showbiz/~Ng showboat/NgSVdG showcase/~NgSVGd showdown/~NgS shower/~NgVdG showerproof/JV showery/J showgirl/NgS showground/NS showily/Ry showiness/Ng showing/~V6Ng showjumping/Ng showman/N0g showmanship/Ngm showmen/N9 shown/~VT showoff/NSg showpiece/NSg showplace/NSg showroom/~NgSV showrunner/NgS showstopper/NgS showstopping/J showtime/~Nmg showy/~J^>p shpt/N shrank/~VN shrapnel/~Ng shred/NgSVJ shredded/~VtTJ shredder/NgS shredding/NmV6 shrew/~NgSV shrewd/~J>Y^p shrewdness/Ng shrewish/J shriek/NgSVdG shrift/Ng shrike/~NgS shrill/J^>pVdGSN shrillness/Nmg shrilly/JRy shrimp/~NwgS09Vd>GZ # singular and plural, also has a plural in -s shrine/~NgSV shrink/~VGSNgB shrinkage/Nmg shrinker/NgS shrinkflation/Nmg shrive/VGdS shrivel/VbSGd shrivelled/JVtT!@_₹ shrivelling/V6N!@_₹ shriven/V shroud/~NgSVGd shrub/~NgSV shrubbery/NSg shrubby/J>^ shrug/NgSVb shrugged/VtT shrugging/V6N shrunk/~VJn shtick/NgS shuck/NgSVGd shucks/NSV shudder/VdGSNg shuffle/~NgSVGdr shuffleboard/NSg shuffler/NSg shun/~VS shunned/~VtT shunning/V6N shunt/VdGSNg shush/VdSG shut/~VbtTSJN shut down/V/ shut off/V/ shutdown/~NSg shuteye/Ng shutoff/NSg shutout/~NSg shutter/~NSgVdG shutterbug/NgS shutting/~V6N shuttle/~NSgVdG shuttlecock/NgSVGd shy/~J^Y>VGdSNg shyer/JcN shyest/Ju shyness/Ng shyster/NSgV sibilant/JNSg sibling/~NSg sibyl/NgS sibylline/JN sic/~VS sicced/VtT siccing/V6 sick/~J^Y>pNSVGdXn sickbay/NS sickbed/NSg sicken/VdG sickening/V6JYN sickie/NgS sickish/J sickle/~NgSVJ sickly/~J^>V sickness/~NwgS sicko/~NgSJ sickout/NSg sickroom/NgS side/~NSJVGdr side's sidearm/NSgV sidebar/~NSgV sideboard/NSgV sideburns/Ng sidecar/NSg sidekick/~NSg sidelight/NgS sideline/~NSgVdG sideload/VdGS sidelong/J sideman/~Ng sidemen/9 sidepiece/NgS sidereal/J sidesaddle/NgS sideshow/~NgS sidesplitting/J sidestep/NgSV sidestepped/VtT sidestepping/V6N sidestroke/NSgdG sideswipe/NSgVdG sidetrack/NSgVdG sidewalk/~NgS sidewall/NgS sideways/~NJ sidewinder/NSg siding/~NgSV6 sidle/VGdSNg siege/~NgSV sienna/NgJ sierra/~NgS siesta/NgSV sieve/NgSVGd sift/VGd>SNZ sifted/JVtTU sifter/Ng sigh/~VGdNg sighs/NVh sight/~NwgSVGdz sighting/~NgV6 sightless/J sightly/J^>U sightread/Vb sightseeing/~NgV6 sightseer/NgS sigma/~NgS sign/~NSVGdrWe sign in/V/ sign off/V/ sign on/V sign-on/NgS sign out/V/ sign up/V/ sign-up/NgS sign's/e signage/~Nmg signal/~NgSVd>GJYZ signaler/Ng signalisation/N!_₹ signalise/VGdS!_₹ signalization/Ng signalize/VGdS signalled/VtT!@_₹ signaller/NgS!@_₹ signalling/V6N!@_₹ signalman/Ng signalmen/9 signatory/~NSgJ signature/~NgSJ signboard/NgS signed/~JVtTU signer/~NgSe signet/~NgS significance/~Ngi significant/~JYNi signification/Ng signify/~VdSGXn signing's/e signings/~N9 signor/N0gSW signora/N0Sg signore/N9 signori/N9 signorina/N0gS signorine/N9 signpost/NSgVGd silage/NgV silence/~NSgVd>GZ silencer/Ng silent/~J>Y^NgS silhouette/~NSgVdG silica/~Ng silicate/~NgS siliceous/J silicon/~NSg silicone/~NgVJ silicosis/Ng silk/~NwgSVn silkily/Ry silkiness/Ng silkscreen/NSgVd # past form used re pcb's silkworm/~NgS silky/~J^>pN sill/~NgSJ silliness/Ng silly/~J^>pNSg silo/~NgSVdG silovik/NgS siloviki/9 silt/~NgSVGd silty/J^> silver/~NmgSJVGd silverfish/N09gS # singular and plural, also has a plural in -s silverish/J silversmith/Ng silversmiths/N silverware/~Nmg silvery/~J sim/~NSgV simian/JNgS similar/~JYN similarity/~NSgE simile/NgS similitude/NgE simmer/VGdSNg simonise/Vb!_₹ simonize/VbdSG simonized/VtT!_₹ simonizes/Vh!_₹ simonizing/V6!_₹ simony/Ng simp/NSgVdG simpatico/J simper/VbGdSNg simpering/JYV6N simple/~J^>pNV simpleminded/J simpleness/Ng simpleton/NSg simplex/~JN simplicity/~NwgS simplification/~NwSg simplify/~VdSGXn simplistic/~JQ simply/~Ry simulacra/N9 simulacrum/N0S simulate/~VdSGJEn simulation/~Nw0gE simulations/~N9 simulator/~NgSE simulcast/~NgSVGd simultaneity/Ng simultaneous/~JY sin/~NSgVr since/~PC sincere/~JY^i sincerer/Jc sincerity/~Nmgi sine/~NgS sinecure/NgSJV sinew/NwgSV sinewy/J sinful/~JYp sinfulness/Ng sing/~VbGd>SNgYBZ singalong/NSJ singe/VSNg singeing/V6N singer/~Ng singing/~NgJV6 single/~JpN0gSVGd single-handedly/Ry singleness/Ng singles/~JN9gVh singlet/NS singleton/~NSg singletree/NSg singsong/NSgJVdG singular/~JYNSg singularity/~NSg singulative/NSgJ sinister/~J sink/~VG>SNgBZ sinkable/JU sinker/Ng sinkhole/NSgV sinless/J sinned/VtT sinner/~NgS sinning/V6N sinology/N sinuosity/Ng sinuous/JY sinus/~NgS sinusitis/Ng sinusoidal/~JN sip/~NSgV siphon/~NgSVGd sipped/VtT sipper/NSg sipping/V6N sir/~NSgVXn sire/~NgSVGde siren/~NgVJ sirloin/NSg sirocco/NSg sirrah/N sirree/Ng sirtuin/NgS # enzyme sis/~NgSI sisal/Ng sissified/JV sissy/NSgJ^>V sister/~NSgVr sisterhood/~NgS sisterliness/Ng sisterly/Jp sit/~VbSN sitar/NSg sitarist/NgS sitcom/~NSg site/~NgSVGd sitemap/NSg sitewide/JR sitter/NSg sitting/~NSgV6J situ/~N situate/VdSGJXn situation/~Ng situational/~J six/~NgSH six-footer/NgS six-pack/NgS sixfold/J sixpence/NgS sixshooter/Ng sixteen/~SgH sixteenth/~JN0g sixteenths/N9 sixth/~JN0gV sixths/N9 sixtieth/JN0g sixtieths/N9 sixty/~SgH sizable/~J size/~NwSVGdr size's sizeable/J!_₹ sizer/N sizing/NgV6 sizzle/Vd>GSNgZ ska/~Nmg skate/~NgSVGd>JZ skateboard/~NgSVd>GZ skateboarder/Ng skateboarding/~VNmg skater/~Ng skating/~V6Ng skedaddle/VGdSNg skeet/NgV>Z skein/NgSV skeletal/~NJ skeleton/~NSgV skeptic/~NSgJ< skeptical/~JY< skepticism/~Nmg< sketch/~Vd>GSNgJZ sketchbook/NS sketcher/Ng sketchily/Ry sketchiness/Nmg sketchpad/NS sketchy/J>^p skew/~Vd>GSJNgZ skewbald/JNS skewer/NgVdGJ ski/~NSgVGd>Z skibob/NSV skid/~NgSV skidded/VtT skidding/V6N skidpan/NS skier/~Ng skiff/NSgV skiffle/N skiing/~V6Ng skilful/JYp!@_₹ skilfulness/Nmg!@_₹ skill/~Nw☁SJVde skill's skilled/~JV6U skillet/~NSgV skillful/~JYU skillfulness/Nmg skim/VSJNg skimmed/VtT skimmer/NSgV skimming/~V6N skimp/VdGSJN skimpily/Ry skimpiness/Ng skimpy/J>^pN skin/~NwgSV skincare/Ng skinflint/NgS skinful/N skinhead/NgS skinless/J skinned/~JVtT skinniness/Ng skinning/V6JN skinny/~J^>pNgV skint/J skintight/J skip/~VSNg skipjack/Ng skipped/~VtT skipper/~NSgVdG skipping/~V6N skirmish/~NgSVGd>Z skirt/~NSgVdG skit/~NgSV skitter/VGdSN skittish/JYp skittishness/Ng skittle/NSV skive/Vd>GSNZ skivvy/NSgVdG skoal/VSg skua/~NSV skulduggery/Ng skulk/NSVd>GZ skulker/Ng skull/~NSgV skullcap/NgS skunk/~NSgVdG sky/~NwSgVG skycap/NSg skydive/NSVbd>GZ skydiver/Ng skydiving/NgV6 skyjack/VbGd>SNzZ skyjacker/Ng skyjacking/V6Ng skylark/NSgVGd skylight/NgS skyline/~NSgV skyrocket/NSgVGd skyscraper/~NSg skyward/JS skywriter/NSg skywriting/Nmg slab/~NgSVJ slabbed/VtT slabbing/V6N slack/~NgSJ^Y>pVGdXZn slacken/VdG slacker/Ng slackness/Nmg slacks/N9gVh slag/NwgSV slagged/VtT slagging/V6 slagheap/NS slain/~VTN slake/VGdSN slalom/~NgSVdG slam/~VbSNg slammed/~VtTJ slammer/NSg slamming/V6JN slander/~NgSVGd>Z slanderer/Ng slanderous/J slang/~NmgV slangy/J>^ slant/~NgSVdGJ slanting/JYV6N slantwise/J slap/~NgSVJ slapdash/JV slaphappy/J slapped/~VtT slapper/NS slapping/~V6NJ slapstick/~Ng slash/~NgSVd>GCZ slasher/~Ng slat/NgSVdG slate/~NSgJV slather/VdGSN slatted/JVtT slattern/NSgY slaughter/~NgSVd>GZ slaughterer/Ng slaughterhouse/~NgS slave/~NSgVd>GZ slaveholder/NgS slaver/VdGNg slavery/~NgJ slavish/JYp slavishness/Ng slavocracy/NgS slaw/Nmg slay/~Vd>GSNZz slayer/~NgS slaying/~V6Ng sleaze/NSgV sleazebag/NS sleazeball/NS sleazily/Ry sleaziness/Ng sleazy/J>^p sled/~NgSVb sledded/VtT sledder/NSg sledding/V6N sledge/~NSgVdG sledgehammer/NSgVGdJ sleek/JY^>pVdGSN sleekness/Ng sleep/~V>GSNw☁gZ sleeper/~NgV sleepily/Ry sleepiness/Ng sleepless/~JYp sleeplessness/Ng sleepover/NSg sleepwalk/VGSd>Z sleepwalker/Ng sleepwalking/NgV6 sleepwear/Nmg sleepy/~J>^pN sleepyhead/NgS sleet/NmSgVdG sleety/J sleeve/~NSgVd sleeveless/J sleigh/~N0gVdGJ sleighs/N9Vh sleight/NSg slender/~J>^Yp slenderize/VdSG slenderness/Nmg slept/~VtT sleuth/~N0gVG sleuths/N9V slew/~NgSVtdG slice/~NSgVd>GJZ slicer/NgS slick/~JY^>pNSgVdGZ slicker/JcNgV slickness/Ng slid/~VtT slide/~V>GSNgZ slider/NgS slideshow/~NgS slight/~JY^>pVdGSNg slightness/Ng slim/~JpNSV slime/~NmgV sliminess/Nmg slimline/J slimmed/VtT slimmer/JcNS slimmest/Ju slimming/JV6Ng slimness/Nmg slimy/J>^pN sling/~VGSNg slingback/NS slingshot/~NSgV slink/VGSNJ slinky/J>^ slip/~VSNg slipcase/NgS slipcover/NgS slipknot/NgS slippage/NgS slipped/~JVtT slipper/NSgJV slipperiness/Ng slippery/~J>^p slipping/~V6N slippy/J slipshod/J slipstream/NSgV slipway/NSg slit/~NgSVJ slither/VGdSJNg slithery/J slitter/N slitting/V6N sliver/NSgVGd slob/NgSV slobbed/VtT slobber/NmgSVdG slobbery/JN slobbing/V6 sloe/NgS slog/NgSV slogan/~NSg sloganeering/VNm slogged/VtT slogging/V6N sloop/~NSg slop/NwgSVdG slope/~NSgVJ slopped/VtT sloppily/Ry sloppiness/Nmg slopping/V6N sloppy/~J^>p slops/NgVh slosh/VdGSN slot/~NgSV sloth/N0wgV slothful/JYp slothfulness/Ng sloths/N9 slotted/~JVtT slotting/V6N slouch/NgSVGd>Z sloucher/Ng slouchy/J^> slough/~N0gVGd sloughs/N9Vh sloven/NSgY slovenliness/Nmg slovenly/J^>p slow/~JY^>pVdGSN slow down/V/ slowcoach/NS slowdown/~NSg slowness/Nmg slowpoke/NSg sludge/~NwgV sludgy/J>^ slue/VGdSNg slug/~NgSV sluggard/NgS slugged/VtT slugger/~NSg slugging/~V6N sluggish/~JYp sluggishness/Nmg sluice/NSgVdG slum/~NgSV slumber/NmSgVGd slumberous/J slumdog/NSg slumlord/NgS slummed/VtT slummer/N slumming/V6N slummy/J>^ slump/~VdGSNg slung/VtT slunk/NV slur/~NgSV slurp/VdGSNg slurred/VtT slurring/V6N slurry/NSgVJ slush/NmgV slushiness/Nmg slushy/J>^pN slut/NgSV sluttish/J slutty/J>^ sly/~J^>Y slyer/Jc!@_₹ slyest/Ju!@_₹ slyness/Nmg smack/~NSgVd>GZ smacker/Ng small/~J^>pNSgV smallholder/NS smallholding/NS smallish/J smallness/Nmg smallpox/~Nmg smarmy/J>^ smart/~Vd>GSJY^pNgnX smarten/VdG smartness/Nmg smartphone/~NSg smarts/VhNg smartwatch/NgS smarty/NSg smartypants/Ng smash/~NgSVd>GZ smasher/Ng smashup/NSg smattering/NgSV smear/~VdGSNg smeary/J>^ smell/~NwSgVdG smelliness/Ng smelly/J>^pN smelt/NSgVd>GZ smelter/Ng smidge/NgS smidgen/NgS smilax/Ng smile/~NSgVdG smiley/~JNSg smiling/~JYNmV6 smirch/NgSVGd smirk/NSgVdGJ smite/VGSN smith/~N0gV smithereens/Ng smithery/NgS smiths/~N9V smithy/NSgV smitten/JV smock/NSgJVdG smocking/NmgV smog/NwgSV smoggy/J>^ smoke/~NwSgVd>GZ smokehouse/NgS smokeless/J smoker/~NgS smokescreen/NSg smokestack/NSg smokey/~JN smokiness/Nmg smoking/~VJNmg smoky/~J>^p smolder/VGdSNg smooch/NgSVdG smoochy/J smooth/~JY^>pNVdG smoothie/NwgS smoothness/Ng smooths/NVh smorgasbord/NSg smote/V smother/VGdSNg smoulder/VGdSNg!@_₹ smudge/NSgVdG smudgy/J^> smug/JYpVN smugger/Jc smuggest/Ju smuggle/~VGd>SZ smuggler/~Ng smuggling/~V6Ng smugness/Nmg smurf/NSV smut/NwgSV smuttiness/Nmg smutty/J^>pV snack/~NSgVdG snaffle/NSgVdG snafu/NSgV snag/NgSV snagged/VtTJ snagging/V6N snail/~NSgVdG snake/~NSgVdG snakebite/NgS snakelike/J snakeskin/NmJ snaky/J>^ snap/~NSVJU snap's snapdragon/NSg snapped/~VtTU snapper/~NgSV snappily/Ry snappiness/Nmg snapping/~V6NU snappish/JYp snappishness/Nmg snappy/J^>p snapshot/~NSgV snapshotted/VtT snapshotting/V6 snare/~NSgVdG snarf/VSdG snark/NSV snarky/J^> snarl/VdGSNU snarl's snarling/JYNV6 snarly/J^> snatch/~VGd>SNgZ snatcher/Ng snazzily/Ry snazzy/J^> sneak/~NSgVbd>GJZ sneaker/NgS sneakily/Ry sneakiness/Nmg sneaking/NJYV6 sneaky/~J^>pN sneer/VdGSNgz sneering/JYV6N sneeze/VdGSNg snick/Vd>GSNZ snicker/NgVdG snide/J>Y^N sniff/Vd>GSNgZ sniffable/NJ sniffer/Ng sniffle/VdGSNg sniffy/J>^ snifter/VSNg snip/Vd>GSNgZ snipe/~NSgV sniper/~NgS snipped/VtTJ snippet/NSgV snipping/V6N snippy/J>^ snips/NgVh snit/NgS snitch/VdGSNg snivel/Vd>GSNgZ sniveler/Ng snivelled/VtTJ!@_₹ sniveller/NSg!@_₹ snivelling/V6N!@_₹ snob/NgS snobbery/Nmg snobbish/JYp snobbishness/Nmg snobby/J>^ snog/VSN snogged/VtT snogging/V6 snood/NSgV snooker/~NmgSVdG snoop/~Vd>GSNgZ snooper/Ng snoopy/J^> snoot/NSgV snootily/Ry snootiness/Nmg snooty/J^>p snooze/VdGSNg snore/Vd>GSNgZ snorer/Ng snorkel/NgSVGd>Z snorkeler/Ng snorkeling/NgV6 snorkelled/VtT!@_₹ snorkelling/NV6!@_₹ snort/NSgVd>GZ snorter/Ng snot/NwgSV snottily/Ry snottiness/Nmg snotty/J^>pN snout/~NSgV snow/~NwgSVdG snowball/~NSgJVGd snowbank/NSg snowbird/NSg snowblower/NgS snowboard/~NgSVGd>Z snowboarder/Ng snowboarding/~NgV snowbound/J snowcat/NgS snowdrift/NSg snowdrop/NSgV snowfall/~NSg snowfield/NSg snowflake/~NSgV snowiness/Ng snowline/N snowmaking/Ng snowman/N0g snowmen/N9 snowmobile/NSgVdG snowplough/N0gV!_₹ snowploughs/N9Vh!_₹ snowplow/NSgVGd snowplowed/VtT!_₹ snowplowing/V6!_₹ snowshed/N snowshoe/~NSgV snowshoeing/V6Nmg snowstorm/NSg snowsuit/NSg snowy/~J>^pN snub/~JNgSV snubbed/VtT snubbing/V6N snuck/VtT snuff/~NSgVd>GYZ snuffbox/NgS snuffer/Ng snuffle/VGdSNg snug/JYpNgSV snugged/VtT snugger/NJc snuggest/Ju snugging/V6 snuggle/NgSVGd snugness/Ng so/~CR%JI # removed marginal noun sense so-called/J soak/VdGSNgz soaking/~V6NgJ soap/~NwgSVdG soapbox/~NgSV soapiness/Ng soapstone/NgV soapsuds/Ng soapy/J>^pN soar/~VdGSNg sob/NSgV sobbed/VtT sobbing/V6NJY sober/~JY^>pVSdG soberness/Nmg sobriety/Nmgi sobriquet/NSg soc/~N soccer/~NgV sociability/Nmg sociable/JNSg sociably/Ry social/~JYNSg socialisation/Nmg!_₹ socialise/VdSG!_₹ socialism/~Nmg socialist/~JNSg socialistic/J socialite/~NSg socialization/~Nmg socialize/VdSG societal/~J society/~NwSg socio-political/J sociocultural/J socioeconomic/~JQ sociological/~JY sociologist/~NSg sociology/~Nmg sociopath/Ng sociopathic/J sociopaths/N sociopathy/NwgS sociopolitical/J sock/~NgSVdGJ socket/~NSgVd sockeye/NSg sod/~NSgVJ soda/~NwgS sodded/VtT sodden/JYV sodding/V6J sodium/~Nmg sodomise/VGdS!_₹ sodomite/NgS sodomize/VGdS sodomy/~Nmg soever/ sofa/NgSV soft/~J>Y^pNnX softback/N softball/~NgS softbound/J softcover/~JN soften/~Vd>GZ softener/Ng softhearted/J softness/Ng software/~Nmg softwood/~NSg softy/NSg soggily/Ry sogginess/Ng soggy/~J>^p soigne/J soignee/J soil/~NwgSVdG soiled/VtTJU soiree/NSg sojourn/~NgSVGd>Z sojourner/Ng soju/NwgS sol/~NSg solace/~NSgVdG solar/~JN solaria/N9 solarium/N0g sold/~VtTN solder/NmSgVGd>Zr solderer/NgS soldier/~NgSVdGY soldiery/Nmg sole/~JNSgVdGW solecism/NwSg solely/~R% solemn/~J^>Yp solemness/Ng solemnify/VdSG solemnisation/Ng!_₹ solemnise/VdSG!_₹ solemnity/NSg solemnization/Ng solemnize/VdSG solemnness/Ng solenoid/NgS solicit/~VGdSN solicitation/NwSg solicited/~VtTU solicitor/~NSg solicitous/JYp solicitousness/Ng solicitude/Ng solid/~J>Y^pNSg solid-state/J solidarity/~Ng solidi/~N solidification/Ng solidify/~VdSGn solidity/Ng solidness/Ng solidus/~Ng soliloquies/N9V soliloquise/VdSG!_₹ soliloquize/VdSG soliloquy/N0gV solipsism/Ng solipsistic/J solitaire/~NgSJ solitariness/Ng solitary/~NSgJp solitude/~Ng solo/~NgSJVdG soloist/~NgS solstice/~NgS solubility/~Nmgi soluble/~JSg solute/JN0VrXn solute's solutes/N9 solution/~NwgS solution's/rE solvable/JiU solve/~VdGSNEr solved/~JVtTU solvency/Nmgi solvent/~NgSJi solver/NSg somatic/J somatosensory/J somber/~JYpV somberness/Nmg< sombre/JYpNV!@_₹ sombreness/Nmg!@_₹ sombrero/NgS some/~IRJDq somebody/~INSg someday/~ somehow/~R someone/~INgS someplace/N somersault/NgSVdG somerset/~NSgV # archaic word for somersault somersetted/VtT somersetting/V6 something/~IJNSg sometime/~J sometimes/R8 someway/ someways/R somewhat/~INSR somewhere/~N somnambulism/Nmg somnambulist/NSg somnolence/Nmg somnolent/J son/~NSgV sonar/~NSg sonata/~NSg sonatina/NSg song/~NwgS songbird/NSg songbook/~NSg songfest/NSg songster/NgS songstress/NgS songwriter/~NSg songwriting/~Nmg sonic/~J sonnet/~NSgV sonny/~NSg sonogram/NSgV sonoluminescence/Ng sonoluminescent/J sonority/Ng sonorous/JYp sonorousness/Ng sonsofbitches/N9 soon/~J>^R soonish/R soot/~NgV sooth/NgSJ>VdGZ soothe/V soother/NgV soothing/JYV6N soothsayer/NgS soothsaying/Ng sooty/~J^>V sop/~NSgV soph/N sophism/Ng sophist/~NgS sophistic/JN sophistical/J sophisticate/VdGSJNgn sophisticated/~JVU sophistication/~Ng sophistry/NwSg sophomore/~JNgS sophomoric/J soporific/NgSJQ sopped/VtT sopping/JV6N soppy/J>^ soprano/~NgSV sorbet/NwSg sorcerer/~NgS sorceress/NgS sorcery/~Ng sordid/JYp sordidness/Nmg sore/~JY^>pNgSV sorehead/NgS soreness/Nmg sorghum/~Nmg sorority/~NSg sorrel/~NwSgJ sorrily/Ry sorriness/Ng sorrow/~Nw☁SgVdG sorrowful/JYp sorrowfulness/Nmg sorry/~J^>pNV sort/~NSgVGdWr sorta/ # 'sort of' sortable/J sorted/~VtTJU sorter/NSg sortie/NSgVd sortieing/V6 sot/NSgVJ sottish/J sou/~NSgH sou'wester/N souffle/NwSgV sough/VdGNg soughs/V sought/~VtTU souk/NS soul/~NwgSV soulful/JYpN soulfulness/Nmg soulless/JYp soulmate/NSg sound/~JY^>pNwSgVdGzZ sound wave/NgS soundalike/NS soundbar/NS soundbite/NS soundboard/NgS soundcheck/NSV sounder/JcNg sounding/~NgJV6 soundless/JY soundness/NmgU soundproof/JVGdS soundproofing/~VNmg soundscape/NSgV soundtrack/~NSgV soup/~NwgSVdG soupcon/NgS soupy/J>^ sour/~JY^>pNgSVdG source/~NwSgVdGr source code/Nmg sourdough/Nw0g sourdoughs/N9 sourish/J sourness/Nmg sourpuss/NgS sousaphone/NgS souse/NSgVdG south/~NgJV southbound/~J southeast/~NgJ>Z southeaster/NgY southeastern/~J southeastward/JNS southerly/~NSgJ southern/~J>NSgZ southerner/Ng southernmost/~J southpaw/NSg southward/~NgSJ southwest/~NgJ>Z southwester/NgY southwestern/~J southwestward/JS souvenir/~NSgV sovereign/~JNSgV sovereignty/~Nmg soviet/~NSgJ sow/~NSVGdr sow's sower/~NSgJ sown/~VNr soy/~NmgJV soybean/~NgS sozzled/JVtT spa/~NSg space/~NwSgVd>GZ space bar/NgS spacecraft/~NgS09 # singular and plural, also has a plural in -s spaceflight/~NgS spaceman/N0g spacemen/N9 spaceport/~NSg spacer/Ng spaceship/~NSg spacesuit/NSg spacetime/~N spacewalk/~NSgVGd spacewoman/Ng spacewomen/9 spacey/J spacial/J spacier/Jc spaciest/Ju spaciness/Nmg spacing/~VNmgJ spacious/~JYp spaciousness/Ng spade/~NSgVdG spadeful/NgS spadework/Ng spadices/9 spadix/Ng spaghetti/~NmgV spake/JV spam/~NgSV spammed/VtT spammer/NSg spamming/~V6N span/~NgSV spandex/~Ng spangle/NSgVdG spangly/J spaniel/NSgV spank/VdGSNgz spanking/V6JNg spanned/~VtT spanner/NSgV spanning/~V6N spar/~NgSV spare/~JY^>pNSgVdG spareness/Ng spareribs/Ng sparing/JYV6NU spark/~NSgVdGY sparkle/~NSgVd>GZ sparkler/Ng sparky/~J>^N sparred/VtT sparring/V6N sparrow/~NSg sparrowhawk/NS sparse/~JY^>pV sparseness/Ng sparsity/Ng spartan/~J spasm/~NSgV spasmodic/JNQ spastic/JNSg spat/~VSNg spate/~NSgV spathe/NSg spatial/~JY spatted/JVtT spatter/VGdSNg spatting/V6 spatula/NSgV spavin/NgVd spawn/~VdGSNg spay/VdGSN speak/~V>GSNZz speakeasy/~NSg speaker/~Ng speakerphone/NS spear/~NSgVdGJ spearfish/N09gSVGd # singular and plural, also has a plural in -s speargun/N spearhead/~NgSVGd spearmint/Ng spec/~NgSV special/~JYpNSgV specialisation/NgS!_₹ specialise/VGdS!_₹ specialism/NS specialist/~JNgS speciality/NwSg!_₹ specialization/~NgS specialize/~VGdS specialty/~NwSg specie/NSg species/~Ng09 # singular and plural specif/ specifiable/J specific/~JNgSQ specification/~Ng specificity/~NgS specified/~JVtTU specify/~Vd>SGXnZ specimen/~NSg specious/JYp speciousness/Ng speck/NSgVdG speckle/NgSVGd specs/N9gV spectacle/~N0wSg spectacles/~N9g spectacular/~JYNgS spectate/VdSG spectator/~NSg specter/~NgSr spectra/~9 spectral/~J spectre/NgS!@_₹ spectrometer/~NgS spectroscope/NgS spectroscopic/~J spectroscopy/~Ng spectrum/~NgS speculate/~VdSGXnv speculation/~Nmg speculative/~JY speculator/NgS sped/VtTN speech/~NwgSV speechify/VdSG speechless/JYp speechlessness/Ng speechwriter/NS speed/~Nw☁SgV>GZ speedboat/NSgV speeder/Ng speedily/~Ry speediness/Ng speeding/~VJNg speedo/NgS speedometer/NgS speedrun/NgSV speedrunner/NgS speedrunning/NgV6 speedster/NSg speedup/NgS speedway/~NSg speedwell/Ng speedy/~J^>pV speleological/J speleologist/NgS speleology/Ng spell/~NSgVd>GzZ spell checker/NgS spellbind/VG>SZ spellbinder/Ng spellbound/J spellcheck/NgSVdG spelldown/NSg speller/Ng spelling/~V6Ng spelt/VN!_₹ spelunker/NgS spelunking/NgV spend/~V>GSNBZ spender/Ng spending/~NgV spendthrift/JNgS spent/~JVtTU sperm/~NSgV spermatozoa/N spermatozoon/Ng spermicidal/JN spermicide/NwgS spew/Vd>GSNmgZ spewer/Ng sphagnum/NgS sphere/~NSgV spherical/~JY spheroid/JNSg spheroidal/JN sphincter/NgS sphinx/~NgSV spic/NS spice/~NwSgVdG spicily/Ry spiciness/Ng spicule/NgS spicy/~J>^p spider/~NSgV spiderweb/NwgSV spidery/J spiel/NSgVdG spiff/JNSVdG spiffy/J^>N spigot/NSgV spike/~NSgVdG spikiness/Nmg spiky/J>^p spill/~VdGSNg spillage/NwgS spillover/NSg spillway/~NgS spilt/JV!_₹ spin/~VSNg spinach/~Ng spinal/~JYNSg spindle/~NgSVGd spindly/J^> spine/~NSg spineless/JYp spinet/NSg spinless/J spinnaker/NSgV spinner/~NgS spinneret/NSg spinney/NS spinning/~NgV6 spinny/J>^p spinster/NSg spinsterhood/Nmg spinsterish/J spiny/~J>^N spiracle/NSg spiraea/NgS!_₹ spiral/~NSgJYVGd spiralled/VtT!@_₹ spiralling/V6N!@_₹ spire/~NSViWr spire's spirea/NSg spirit/~NSVGdi spirit's spirited/~VJY spiritless/J spiritual/~JYNgS spiritualism/~Ng spiritualist/~NgSJ spiritualistic/J spirituality/~Nmg spirituous/J spirochaete/NSg!_₹ spirochete/NSg spiry/J spit/~NwgSVdG spitball/NSgV spite/~NSgVPr spiteful/JYp spitefuller/Jc spitefullest/Ju spitefulness/Ng spitfire/~NSg spitted/VtTJ spitting/~V6N spittle/NmgV spittoon/NgS spiv/NS splanchnic/J splash/~NgSVGd splash down/V/ splashdown/NgS splashily/Ry splashiness/Nmg splashy/J>^p splat/NSgV splatted/VtT splatter/NwSgVGd splatting/V6N splay/~VdGSJNg splayfeet/9 splayfoot/Ngd spleen/~NSgV splendid/~J>Y^ splendor/~NgS< splendorous/J splendour/NwSg!@_₹ splenectomy/N splenetic/JN splice/~NSgVd>GZ splicer/Ng spliff/NSV spline/NSV splint/NSgVGd>Z splinter/~NgVdG splintery/J split/~VSJNg splitting/~NgSJV6 splodge/NSV splosh/VdGSN splotch/NgSVdG splotchy/J^> splurge/VdGSNg splutter/NgSVGd spoil/~Vd>GSNeZ spoil's spoilage/Ng spoiled/~VJU spoiler/~NgVe spoilsport/NgSJ spoilt/JV!_₹ spoke/~NSgVt spoken/~JVTU spokesman/~N0g spokesmen/N9 spokespeople/N9 spokesperson/~N0gS spokeswoman/~Ng spokeswomen/9 spoliation/Nge sponge/~NwSgVd>GZ sponger/Ng sponginess/Ng spongy/J>^p sponsor/~NgSVdG sponsorship/~NgS spontaneity/~Ng spontaneous/~JY spoof/~NSgJVdG spook/~NSgVdG spookiness/Ng spooky/~J>^p spool/NSgVdG> spoon/~NSgVdG spoonbill/~NgS spoonerism/NgS spoonfed/VtTJ spoonfeed/VSG spoonful/NSg spoor/NSgVdG sporadic/~JQ spore/~NSgVdG sporran/NS sport/~NSgVdGv sportiness/Ng sporting/~VJYN sportive/JYN sportscast/NgS>GZ sportscaster/~Ng sportsman/~N0g sportsmanlike/JU sportsmanship/~Nmg sportsmen/~N9 sportspeople/~N9 sportsperson/N sportswear/~Nmg sportswoman/N0g sportswomen/N9 sportswriter/~NSg sporty/~J^>p spot/~NgSVJe spot on/J spotless/JYp spotlessness/Nmg spotlight/~NSgVGd spotlit/V spotted/~JVtT spotter/NgS spottily/Ry spottiness/Ng spotting/~V6N spotty/J^>pN spousal/JNgS spouse/~NSgV spout/~NSgVdG sprain/VGdSNg sprang/~V sprat/NSgV sprawl/VGdSNwg spray/~NwSVdGr spray's sprayer/NgS spread/~VbtTG>SNwgZB spreadeagled/V spreader/Ng spreadsheet/~NgSV spree/~NSgVd spreeing/V6 sprig/NSgV sprigged/VtT sprightliness/Ng sprightly/J>^p spring/~VbGSNwg spring-load/VSdG springboard/~NgSV springbok/NgS springily/Ry springiness/Ng springlike/J springtime/~Ng springy/J>^p sprinkle/Vd>GSNgzZ sprinkler/NgV sprinkling/V6Ng sprint/~NSgVGd>Z sprinter/~Ng sprite/~NSgV spritz/NgSVGd>Z spritzer/NwgS sprocket/~NgS sprog/NSV sprout/~NSgVGd spruce/~NSgJY^>pVdG spruceness/Ng sprung/~VJU spry/J>Y^ spryness/Nmg spud/NOSgV spudger/NgS spume/NSgVdG spumoni/Ng spumy/J spun/~V spunk/NSgV spunky/~J^> spur/~NgSV spurge/~NgSVdG spurious/~JYp spuriousness/Ng spurn/VdGSN spurred/~VtTJ spurring/V6N spurt/VdGSNg sputa/N sputnik/~NgS sputter/NgSVdG sputum/Ng spy/~NSgVGd spyglass/NgS spymaster/NS spyware/~Nmg sq/~J sqq squab/NSgVJ squabble/NgSVGd>Z squabbler/Ng squad/~NSgV squadron/~NgSV squalid/J^>YpN squalidness/Nmg squall/VGdSNg squally/J squalor/Ng squamous/J squander/VGdS square/~NSgJY^>pVdG squareness/Ng squarish/J squash/~NgSVGd squashy/J^> squat/~JpNSgV squatness/Nmg squatted/VtT squatter/NgSJc squattest/Ju squatting/NV6 squaw/NSg squawk/NSgVGd>Z squawker/Ng squeak/NSgVGd>Z squeaker/Ng squeakily/Ry squeakiness/Ng squeaky/J^>p squeal/NSgVGd>Z squealer/Ng squeamish/JYp squeamishness/Ng squeegee/NgSVd squeegeeing/V6 squeeze/~VGd>SNgBZ squeezebox/NS squeezer/Ng squeezy/J squelch/VGdSNg squelchy/J squib/NSgV squid/~NSg09V # singular and plural, also has a plural in -s squidgy/JN squiffy/J squiggle/NSgVdG squiggly/JNgS squint/VGd>SNgJ^ squire/~NSgVdG squirm/VGdSNg squirmy/J>^ squirrel/~NSgVGd squirrelled/VtT!@_₹ squirrelling/V6N!@_₹ squirt/NSgVGd squish/NgSVGd squishy/J>^N sriracha/N ssh/~VO st/~N stab/~NgSVJY stabbed/~VtT stabber/NgS stabbing/~JNgSV6 stabilisation/Ng!_₹ stabilise/VdSGe!_₹ stabiliser/NgS!_₹ stability/~Nmgi stabilization/~Nmge stabilize/~VdSGer stabilizer/NgS stable/~NSgVd>GJ^ stableman/Ng stablemate/NS stablemen/9 stably/NRyU staccato/NgSJ stack/~NSgVdGB stack overflow/NSg stadium/~NgS staff/~NwSVdGr staff's staffer/~NgS staffing/~V6Ng stag/~NgSVdGz stage/~NSgVdGU stagecoach/~NgSV stagecraft/Nmg stagehand/NgS stagestruck/J stagflation/NwSg stagger/NgSVdG staggering/~VJYN staging/~VNg stagnancy/Ng stagnant/~JY stagnate/VdSGJn stagnation/~NwSg stagy/J>^ staid/JY^>pV staidness/Ng stain/~NSgVdG stained/~JVU stainless/~JNg stair/~NSg staircase/~NgSV stairway/~NgS stairwell/~NSg stake/~NSgVdG stakeholder/~NgS stakeout/NSg stalactite/NgS stalagmite/NgS stale/~J^>pNSVdG stalemate/~NSgVdG staleness/Ng stalk/~NSgVd>GzZ stalker/~Ng stalking/~VNg stall/~NSVdG stall's stallholder/NS stallion/~NgS stalwart/~JYNgS stamen/NSg stamina/~N9g stammer/VGd>SNgZ stammerer/Ng stammering/NVY stamp/~NSgVd>Z stampede/~NgSVGd stamper/Ng stamping/NgS stance/~NSgVi stanch/J^>VGdSN stanchion/NSgV stand/~V>GSNgzZ stand down/V stand-down/NgS stand-in/NgS stand off/V/ stand out/V/ stand-up/JN standalone/~JN standard/~JNgS standard-bearer/NgS standardisation/Ng!_₹ standardise/VdSG!_₹ standardization/~NgS standardize/~VdSG standby/~N0g standbys/N9 standee/NgS stander/Ng standing/~VJNg standoff/~NgSJV standoffish/J standout/~JNgS standpipe/NSg standpoint/~NgS standstill/NgS stank/VJN stanza/~NSg staph/Ng staphylococcal/J staphylococci/N staphylococcus/~Ng staple/~NSgVd>GJZ stapler/Ng star/~NgSVd>GZ starboard/~NgV starburst/~NSV starch/~NgSVGdJ starchily/Ry starchiness/Nmg starchy/J^>p stardom/~Nmg stardust/~Nmg stare/~VSNg starer/Ng starfish/~N09gSV # singular and plural, also has a plural in -s starfruit/Nmg stargate/~NgS stargaze/Vd>SGZ stargazer/~NgS stark/~JY^>pVZ starkness/Nmg starless/J starlet/NgSJ starlight/~Ng starling/~NSg starlit/J starred/~VtTJ starring/~V6NJ starry/~J^> starship/NSg starstruck/J start/~NSgVdGr start up/V/ starter/~NwgS startingly/Ry startle/VbGdSN startling/~V6JYNm startup/~NgS starvation/~Nmg starve/~VdSGz starveling/NgSJ stash/NgSVbdG stasis/~Nmg stat/~JNgSV state/~NwSgVbd>GnLX statecraft/~Nmg stated/~VtTJU stateful/JYp statehood/~Nmg statehouse/NgS stateless/Jp statelessness/Nmg stateliness/Nmg stately/~J>^p statement/~NgSJVr statemented/JV statementing/NV stateroom/NgS stateside/~J statesman/~N0g statesmanlike/J statesmanship/Nmg statesmen/~N9 stateswoman/N0g stateswomen/N9 statewide/~JN static/~JNmSg statically/Ry station/~NgVd>GZ stationary/~JN stationer/Ng stationery/~NmgJ stationmaster/NS statism/Nmg statist/JNgs statistic/~JNgSV statistical/~JY statistician/~NSg statuary/NmgJ statue/~NSgV statuesque/J statuette/~NgS stature/~NgSd status/~NgS statute/~NgS statutorily/Ry statutory/~J staunch/~JY^>pVdGSN staunchness/Ng stave/~NSgVdG stay/~Vd>GSNgJZ stay behind/V stay-behind/NgS stead/~NSgV steadfast/~JYp steadfastness/Nmg steadily/~RyU steadiness/NmgU steady/~J^>pVGdSNg steak/~NwSgV steakhouse/NSg steal/~VGSNgH stealer/NgS stealth/~NgVJ stealthily/Ry stealthiness/Ng stealthy/J^>p steam/~NwSgVd>GJZ steamboat/~NgSV steamer/~NgV steamfitter/NSg steamfitting/Ng steaminess/Nmg steampunk/NV steamroll/VGd>SZ steamroller/NgVdG steamship/~NgS steamy/J^>p steed/~NSg steel/~NOwSgJVdG steeliness/Ng steelmaker/NS steelworker/NSg steelworks/~Ng steely/~J^>p steelyard/NSg steep/~JY^>pNSgVdGnX steepen/VGd steeple/~NgSV steeplechase/~NgSV steeplejack/NSg steepness/Ng steer/~VdGSNgB steerage/Ng steering/~V6Ng steersman/Ng steersmen/N9 steganography/Nmg stegosauri/N9 stegosaurus/N0gS stein/~NSg stellar/~J stem/~NgSV stemless/J stemmed/~JVtT stemming/~V6N stemware/Nmg stench/NwgSV stencil/~NgSVGd stencilled/VtTJ!@_₹ stencilling/V6N!@_₹ steno/NSg stenographer/NSg stenographic/J stenography/Nmg stenosis/~N stent/NSgV stentorian/J step/~NgSVi stepbrother/NSg stepchild/Ng stepchildren/9g stepdad/NgS stepdaughter/~NSg stepfather/~NSg stepladder/NgS stepmom/NgS stepmother/~NSg stepparent/NSg steppe/~NSgd>GZ stepper/Ng steppingstone/NSg stepsister/NgS stepson/~NgS stereo/~NSgJV stereogram/NgS stereophonic/J stereoscope/NgS stereoscopic/~J stereotype/~NSgVdG stereotypical/~J sterile/~J sterilisation/NgS!_₹ sterilise/Vd>SGZ!_₹ steriliser/Ng!_₹ sterility/Ng sterilization/NSg sterilize/Vd>SGZ sterilizer/Ng sterling/~NgJ stern/~JY^>pNSgV sternness/Ng sternum/NgS steroid/~NgS steroidal/J stertorous/J stet/NSV stethoscope/NgSV stetson/NgS stetted/VtT stetting/V6 stevedore/NSgV stew/~NwgSVdG steward/~NgSVGd stewardess/NgS stewardship/~Ng stick/~NSgV>GJZ sticker/~NgVdGJ stickily/Ry stickiness/Ng stickleback/NSg stickler/NgS stickpin/NgS stickup/NgS sticky/~J^>pNSgV stiff/~JY^>pNSgVdGnX stiffen/VGd>Z stiffener/Ng stiffening/NgV stiffness/~Ng stifle/~VdGSNz stifling/JYVN stigma/~NSg stigmata/N stigmatic/JN stigmatisation/Ng!_₹ stigmatise/VGdS!_₹ stigmatization/Nge stigmatize/VGdSe stile/NSgV stiletto/NSgV still/~J^RNSVGdi still's stillbirth/Ng stillbirths/N stillborn/~JN stilled/JVtTi!_₹ stiller/~JN stilling/V6Ni!_₹ stillness/Ng stilt/~NSgVd stilted/JYV stimulant/NSgJ stimulate/~VdSGnv stimulation/~Ng stimuli/~N9 stimulus/~N0g sting/~NSgVG>Z stinger/~Ng stingily/Ry stinginess/Ng stingray/~NSg stingy/J>^p stink/VG>SNmgJZ stinkbug/NSg stinker/Ng stinky/J>^N stint/~VGdSNg stipend/~NSgV stipendiary/JNS stipple/NSgVdG stippling/VNg stipulate/VdSGJXn stipulation/~Ng stir/~VSNg stirred/~VtT stirrer/NSg stirring/~JYV6SN stirrup/NSgJ stitch/~NSVdGr stitch's stitchery/Ng stitching/NgV stoat/NSg stochastic/~J stock/~NwSVGdJr stock's stockade/~NSgVdG stockbreeder/NgS stockbroker/NSg stockbroking/Nmg stockholder/NSg stockily/Ry stockiness/Ng stockinette/Ng stocking/~NSgV stockist/NS stockpile/~NgSVGd stockpot/NSg stockroom/NgS stocktaking/Ng stocky/J>^p stockyard/NgS stodge/VN stodgily/Ry stodginess/Ng stodgy/J>^p stogie/NgS stoic/~NSgJ stoical/JY stoicism/Ng stoke/~Vd>GSNZ stoker/Ng stole/~VtSNg stolen/~VTJN stolid/J>Y^p stolidity/Ng stolidness/Ng stolon/NgS stomach/~N0gVd>GZ stomachache/NSg stomacher/Ng stomachs/N9V stomp/~VGdSNg stone/~NwSg09Vd>GJZ # weight sense in UK is singular and plural stonemason/~NgS stoner/~Ng stonewall/~NSVGdJ stoneware/Nmg stonewashed/J stonework/~Ng stonily/Ry stoniness/Ng stonkered/VJ stonking/JV stony/~J^>p stood/~VtT stooge/NgSV stool/~NSgV stoop/NSgVGd stop/~NSgVU stop's stopcock/NSgV stopgap/NSgJV stoplight/NgS stopover/NgS stoppable/JU stoppage/~NwgS stopped/~VtTJU stopper/NSgVGd stopping/~V6NU stopple/NSgVdG stopwatch/NgS storage/~NmgV store/~NSVdGr store's storefront/~NgS storehouse/NgSV storekeeper/NSg storeroom/NSg storey/NgS!@_₹ stork/~NSg storm/~NSgVGd stormfront/NgS stormily/Ry storminess/Nmg stormtrooper/NSg stormy/~J>^p story/~NSgVd storyboard/~NgSV storybook/~NSgJ storylines/~NgS storyteller/~NgS storytelling/~Ng stoup/NSgV stout/~J^Y>pNSgV stouthearted/J stoutness/Ng stove/~NSgV stovepipe/NSgV stow/~NSVdG stowage/Ng stowaway/NgS straddle/Vd>GSNgZ straddler/Ng strafe/VGdSNg straggle/Vd>GSNZ straggler/Ng straggly/J^> straight/~J^Y>pNSgVRy%Xn straight away/R # see also `straightaway` n. & adj. straight up/R straight-up/J straightaway/NSgJ straightedge/JNSg straighten/VGd>Z straightener/Ng straightforward/~JYpS straightforwardness/Nmg straightness/Nmg straightway/N strain/~NwSVdGWr strain's strainer/NSgr strait/~JNgSVnX straiten/VGd straitjacket/NSgVGd straitlaced/J strand/~NgSVdG strange/~JY^>pVNZ strangeness/Nmg stranger/~JNgV strangle/VGd>SNZ stranglehold/NSgV strangler/NgS strangulate/VGdSn strangulation/~Ng strap/~NSVU strap's strapless/JNgS strapped/~VtTJU strapping/V6JNg strata/~N9 stratagem/NSg strategic/~JS strategical/JY strategics/Ng strategist/~NSg strategize/VdSG strategy/~NwSg strati/N stratification/~Nmg stratify/VdSGn stratosphere/NSg stratospheric/J stratum/~N0g stratus/N0g straw/~NwSgJVGd strawberry/~NwSgJV stray/~NSgVGdJ streak/~NgSVd>GZ streaker/Ng streaky/J^> stream/~NgSVd>GZ streamable/J streamer/~Ng streamline/~NSVdG street/~NgSJV streetcar/~NgS streetlamp/NS streetlight/NSg streetwalker/NSg streetwise/J strength/~Nw0gV strengthen/~VGdSr strengthener/NgS strengths/~N9V strenuous/~JYp strenuousness/Nmg strep/Nmg streptococcal/~J streptococci/N9 streptococcus/~N0g streptomycin/Ng stress/~NwgSVdG stressed/~VtTJU stressful/~JU stressors/N9 stretch/~VGd>SNwgBZ stretcher/~NgVdG stretchmarks/N9 stretchy/J^> strew/VGSdH strewn/V stria/N0g striae/N9 striated/JV striation/NgS stricken/~JV strict/~J>Y^p strictness/Nmg stricture/NSg stridden/V stride/~VGSNg stridency/Nmg strident/JYN strife/~Nmg strike/~VG>SNgZz strikebound/J strikebreaker/NSg strikebreaking/V6NJ strikeout/NgSV striker/~NgS striking/~JYV6N string/~NgSVd>GZ stringency/Nmg stringent/~JY stringer/~NgS stringification/Nmg stringify/VdSG stringiness/Ng stringy/J^>p strip/~NSgVdG stripdown/NgS stripe/~NgSV stripey/JN stripling/NgS stripped/~JVtT stripper/~NgS stripping/~V6Ng striptease/NgSVGd>Z stripteaser/Ng stripy/J strive/~VGSN striven/V strobe/~NgSV stroboscope/NgS stroboscopic/J strode/V stroke/~NgSVGd stroll/~NgSVd>GZ stroller/Ng strong/~J>Y^ strongbox/NgS stronghold/~NgS strongman/~Ng strongmen/9 strongroom/NS strontium/~Ng strop/NSgV strophe/NSg strophic/J stropped/VtT stroppily/Ry stropping/V6N stroppy/J^>p strove/~V struck/~V struct/NgS structural/~JYN structuralism/N structuralist/JNS structure/~NwSVGdr structure's structured/~JVU strudel/~NSg struggle/~NgSVGd strum/VSNg strummed/VtT strumming/V6N strumpet/NgSV strung/~VUr strut/~VSNgJ strutted/VtT strutting/V6N strychnine/Ng stub/~NgSV stubbed/VtTJ stubbing/V6N stubble/NmgV stubbly/J stubborn/~J>Y^pN stubbornness/Ng stubby/~J>^N stucco/~Nm0gVdG stuccoes/N9 stuck/~VJNU stud/~NgSVY studbook/NgS studded/~JVtT studding/V6Ng student/~NSg studentship/NS studied/~VtTJU studiedly/Ry studio/~NgS studious/JYp studiousness/Ng studly/J>^ study/~VGdSNr study's stuff/~NmSgVGdz stuffily/Ry stuffiness/Ng stuffing/V6Ng stuffy/J>^pN stultification/Ng stultify/VdSGn stumble/~NSgVd>GZ stumbler/Ng stump/~NSgVGd stumpy/J^>N stun/~VSN stung/~VT stunk/VT stunned/~JVtT stunner/NS stunning/~JYV6N stunt/~NSgVGd stuntman/~N stuntmen/9 stupa/~NgS stupefaction/Nmg stupefy/VdSG stupendous/JY stupid/~J^>YNgS stupidity/~NSg stupor/NgSV sturdily/Ry sturdiness/Ng sturdy/~J^>pN sturgeon/~NSg stutter/~Vd>GSNgZ stutterer/Ng sty/~NSgV style/~NSVdGr style's stylesheet/NSg styli/N stylisation/Sg!_₹ stylise/VdSG!_₹ stylish/~JYp stylishness/Nmg stylist/~NSg stylistic/~JSQ stylization/Sg stylize/VdSG stylus/~NgS stymie/NgSVd stymieing/V styptic/JNSg styrofoam/NmSg suasion/NgE suave/J>Y^pN suaveness/Ng suavity/Ng sub/~NSgVP( subaltern/JNgS subaqua/J subarctic/~ONJ subarea/NgS subarray/NgS subassembly/NgS subatomic/J subbasement/NSg subbed/VtT subbing/V6N subbranch/NgS subcategory/~NSg subclass/~NVG subcognitive/JYN subcommand/NSg subcommittee/~NSg subcompact/NSgJ subconscious/~JYpNg subconsciousness/Ng subcontinent/~NOSg subcontinental/JN subcontract/VdGSNg subcontractor/NgS subculture/~NgSV subcutaneous/~JY subdirectory/NgS subdivide/VGdS subdivision/~NSgV subdomain/NgS subdominant/N subdue/~VdSG subeditor/NS subfamily/~NSg subfield/NgS subflow/NSg subfolder/NgS subframe/NgS subfreezing/J subgroup/~NgSV subhead/NgSGz subheading/Ng subhuman/JNgS subj/N subject/~JNgSVGdv subjecthood/Nmg subjection/Nmg subjective/~JYN subjectivity/~Ng subjectivization/Ng subjoin/VGdSN subjugate/VGdSJn subjugation/~NwSg subjunctive/~JNSg sublease/NgSVGd sublet/VSNg subletting/V6N sublicense/NgSVdG sublieutenant/NS sublimate/VGdSNn sublimation/~Ng sublime/~VGd>SJY^N subliminal/~JYN sublimity/Ng sublingual/JN submachine/VSNg submarginal/J submarine/~J>NgSVZ submariner/Ng submerge/VGdS submergence/Nmg submerse/VGdSJn submersible/JNgS submersion/Ng submicroscopic/J submission/~NgSr submissive/~JYpN submissiveness/Ng submit/~VSr submitted/~jrVtT submitter/N submitting/~V6Nr submodule/NgS subnet/NgSV subnode/NSg subnormal/JN suboptimal/J suborbital/JN suborder/~NgSV subordinate/~JNSgVdGn subordination/~Ngi suborn/VSGd subornation/Ng subpage/NgS subpar/J subparagraph/NgSV subpart/N subplot/~NgSV subpoena/~NgSVGd subpolar/J subprime/JN subprocess/NgS subprofessional/JNSg subprogram/NSg subquery/NSVGd subroutine/NSg subscribe/~VSdGUr subscriber/~NgS subscript/NgSVdGJ subscription/~NwgS subsection/~NgSV subsequence/NgS subsequent/~JYN subservience/Ng subservient/JY subset/~NSgV subshell/NSg subside/VGdS subsidence/~Ng subsidiarity/N subsidiary/~JNSg subsidisation/Ng!_₹ subsidise/VGd>SZ!_₹ subsidiser/Ng!_₹ subsidization/Ng subsidize/VGd>SZ subsidizer/Ng subsidy/~NSg subsist/VSdG subsistence/~Ng subsoil/NgV subsonic/~JN subspace/~N subspecies/~Ng substance/~NSgV substandard/J substantial/~JYNi substantiate/~VGdSnX substantiated/~VU substantiation/NgW substantive/~JYNSgV substation/~NgS substituent/N substitute/~VGdSNgXn substitution/~Ng substrata/N substrate/~NgSVJ substratum/Ng substring/NSgV substructure/NSg subsume/VdSG subsumption/N subsurface/~NgJ subsystem/~NSg subtask/NSg subteen/JNSg subtenancy/Ng subtenant/NSgV subtend/VSdG subterfuge/NSg subterranean/~J subtext/NSgV subtitle/~NSgVdG subtle/~J^> subtlety/NSg subtly/~Ry subtopic/NSg subtotal/NSgVGdJ subtotalled/VtT!@_₹ subtotalling/V6!@_₹ subtract/VGSd subtraction/~NwSg subtrahend/NSg subtree/NSg subtropic/NS subtropical/~JN subtropics/N9g subtype/~NgS suburb/~NgS suburban/~JNSg suburbanite/NSg suburbia/Ng subvention/NSgV subversion/Ng subversive/~JYpNSg subversiveness/Ng subvert/~VdGSN subway/~NgSV subwoofer/NgS subzero/J succeed/~VGdS success/~NwgSv successful/~JYU succession/~NSg successive/~JY successor/~NSg succinct/J>Y^p succinctness/Nmg succor/NmSgVGd succotash/Ng succour/NgSVGd!@_₹ succubi/N9 succubus/N0g succulence/Nmg succulency/Nmg succulent/~JNSg succumb/~VGdS such/~IN suchlike/JIN suck/~NgSVd>GZ sucker/~NgVGd suckle/NSVdGz suckling/NgV sucky/J sucrose/~Nmg suction/~NwSgVdG sudden/~JYpN suddenness/Nmg suds/NgV sudsy/J^> sue/~VdSG suede/~NgJV suet/~Ng suety/J suffer/~Vd>GSZz sufferance/Ng sufferer/Ng suffering/~JNgV suffice/~VdSG sufficiency/~Ngi sufficient/~JYi suffix/~NgSVdG suffixation/Ng suffocate/VGdSJn suffocation/Ng suffragan/~NgS suffrage/~Ng suffragette/~NSg suffragist/~NgS suffuse/VdSGJn suffusion/Ng sugar/~NwSgVGd sugarcane/~Ng sugarcoat/VGdS sugarless/J sugarplum/NgS sugary/J>^ suggest/~VGSd>v suggestibility/Nmg suggestible/J suggestion/~NwSg suggestive/~JYp suggestiveness/Ng sui generis/JRN suicidal/~JN suicide/~NwSgV suit/~NgSVdGB suitability/~NmgU suitableness/Ng suitably/~RyU suitcase/~NSgV suite/~NSg suited/~JVU suiting/VNg suitor/~NgSV sukiyaki/Ng sulfa/JNg sulfate/~NSgV sulfide/~NSg sulfonamides/N sulfur/~NmgSJVdG sulfuric/~J sulfurous/J sulk/VdGSNg sulkily/Ry sulkiness/Ng sulky/J^>pNSg sullen/JY^>pNV sullenness/Ng sullied/JVU sully/~VGdSN sulphate/NwgSV!@_₹ sulphide/NgS!@_₹ sulphur/NmSgVdG!@_₹ sulphuric/J!@_₹ sulphurous/J!@_₹ sultan/~NgS sultana/~NSg sultanate/~NgS sultrily/Ry sultriness/Ng sultry/J>^p sum/~NSgV sumac/~NgV summarily/~Ry summarise/VGdS!_₹ summarization/NgS summarize/~VGdS summarizer/NgS summary/~JNSg summat/ summation/~NgSW summed/~VtT summer/~NwgSVdG summerhouse/NSg summertime/~Ng summery/JN summing/~V6N summit/~NgSVdG summitry/Ng summitted/VtT summitting/V6 summon/~Vd>GSNZ summoner/Ng summons/~NgSVGd sumo/~Ng sump/~NgSV sumptuous/JYp sumptuousness/Ng sun/~ONSgV sunbath/N0gSGd>Z sunbathe/VN sunbather/Ng sunbathing/NgV6 sunbaths/N9 sunbeam/~NSg sunbed/NS sunbelt/NSg sunblock/NgS sunbonnet/NSg sunburn/NSgVGd sunburst/NgS sundae/NgS sundeck/NS sunder/VdGSN sundial/~NSg sundown/~NSgV sundress/NS sundries/Ng sundry/JNSI sunfish/N09gSV # singular and plural, also has a plural in -s sunflower/~NgS sung/~VTU sunglasses/~N9g sunhat/NS sunk/~Vn sunken/JT sunlamp/NSg sunless/J sunlight/~NgV sunlit/J sunned/VtT sunniness/Nmg sunning/V6 sunny/~J^>pN sunrise/~NSgV sunroof/NSg sunscreen/NgS sunset/~NgSV sunshade/NgS sunshine/~NmgJ sunshiny/J sunspot/NSg sunstroke/Ng suntan/NgSV suntanned/JVtT suntanning/V6 suntrap/NS sunup/Ng sup/~V>SNgJZ super/~JNgV( superabundance/NwgS superabundant/J superannuate/VGdSn superannuation/Nmg superb/~J>Y^ supercar/~NSg supercargo/N0g supercargoes/N9 supercharge/VGd>SNZ supercharger/Ng supercilious/JYp superciliousness/Ng supercity/NSg supercluster/NgS supercomputer/~NgS superconducting/J superconductive/J superconductivity/Ng superconductor/NSg supercritical/J superego/NgS supererogation/Ng supererogatory/J superfast/JR superficial/~JYN superficiality/Nmg superfine/J superfluity/Ng superfluous/~JYp superfluousness/Ng superfood/NgS superfund/~NgS superglue/NV supergrass/NS superheat/VdSG superhero/~N0gS superheroes/~N9 superhighway/NSg superhuman/~JNY superimpose/VGdS superimposition/Ng superintelligence/NwSg superintend/VdSG superintendence/Ng superintendency/Ng superintendent/~NSgJ superior/~JNgS superiority/~Ng superlative/~NSgJY superlinear/JY supermajority/NgS superman/~Ng supermarket/~NSg supermassive/J supermen/9 supermodel/~NSg supermom/NgS supernal/J supernatural/~JYNS supernormal/J supernova/~NgS supernovae/~9 supernumerary/NSgJ superpose/VGdS superposition/~Ng superpower/~NSgV supersaturate/VGdSn supersaturation/Ng superscribe/VGdS superscript/NgSJV superscription/Ng supersede/VGdSN superset/NgSV supersetted/VtT supersetting/NV6J supersize/VGdSJ supersonic/~JN superspreader/NSg superstar/~NgS superstardom/N superstate/NS superstition/~NgS superstitious/JY superstore/NgS superstructure/~NgS supertanker/NgS superuser/NSg supervene/VGdS supervention/Ng supervise/~VGdSXn supervised/~VJU supervision/~Nmg supervisor/~NgS supervisory/~J superweapon/NgS superwoman/Ng superwomen/N9 supine/JYN supp/~Nd>GZ supper/~NgV suppertime/N suppl/N supplant/VSdG supple/J^>pVL supplement/~NgSVdG supplemental/~JN supplementary/~JN supplementation/~Nmg suppleness/Ng suppliant/JNSg supplicant/JNgS supplicate/VGdS supplication/Ng supplier/~Ng supply/~VGd>SNgZXn support/~Vd>GSNwgBZv supportable/JUi supported/~JVU supporter/~Ng suppose/~VGdS supposed/~VJY supposition/NgS suppository/NSg suppress/~VGdSv suppressant/NgS suppressible/J suppression/~NwgS suppressor/~NSg suppurate/VdSGn suppuration/Ng supra/~N suprachiasmatic/J supranational/JN supremacist/~JNgS supremacy/~Ng supreme/~JYVN supremo/NS supt/V # sur # prefixes that are not also words in their own right don't belong in the dictionary surcease/NSgVdG surcharge/NSgVdG surcingle/NSgV sure/~J^>p surefire/J surefooted/J surely/R # adverb of probability/certainty/affirmation; modal adverb sureness/Ng surety/NSg surf/~NmgSVd>GZ surface/~NSVGdr surface-to-air/J surface's surfboard/NgSVdG surfeit/JNgSVdG surfer/~NgS surfing/~V6Ng surge/~NSgVdG surgeon/~NgS surgery/~NwSg surgical/~JY surliness/Ng surly/J^>p surmise/NgSVGd surmount/VdGSB surmountable/Ji surname/~NgSV surpass/~VGdS surpassed/~VtTU surplice/NgS surplus/~NgSJV surplussed/VtT surplussing/V6 surprise/~NSg☁VdGz surprising/~VJYNU surreal/~JN surrealism/~Ng surrealist/~JNSg surrealistic/JQ surrender/~VdGSNg surreptitious/JYp surreptitiousness/Ng surrey/~NgS surrogacy/Ng surrogate/~NSgJV surround/~VGdSNz surrounding/~VNg surroundings/~Ng surtax/NgSVdG surtitle/NSV surveil/VGdS surveillance/~Ng survey/~NSVdGr survey's surveying/~NgV surveyor/~NSg survivability/Nmg survivable/J survival/~NSg survivalist/NSg survive/~VdSGB survivor/~NSg survivorship/NSg susceptibility/~NwSg susceptible/~JNi sushi/~Ng suspect/~VdGSNgJ suspected/~JVU suspend/~VSd>GZ suspender/Ng suspense/~NgJXn suspenseful/J suspension/~Ng suspicion/~NSgV suspicious/~JY suss/NSJVdG suss out/V sussed out/V susses out/V sussing out/V sustain/~VdGSNB sustainability/~Nmg sustainable/~JNU sustainably/Ry sustenance/Ng sutler/NgS suttee/N suture/~NgSVGd suzerain/NgS suzerainty/~Ng svelte/J^> swab/NgSV swabbed/VtT swabbing/V6N swaddle/VdGSN swag/VSNg swagged/VtT swagger/Vd>GSNgJ swagging/V6 swain/~NSg swallow/~VGdSNg swallowtail/NgS swam/~Vt swami/~NSg swamp/~NSgVGd swampland/NwgS swampy/~J>^ swan/~NgSV swank/J^>NSgVGd swankily/Ry swankiness/Nmg swanky/J>^pN swanned/VtT swanning/V6 swansong/NS swap/~VSNg swappable/J swapped/~VtT swapper/NgS swapping/~NV6J sward/NSgV swarf/Nmg swarm/~NSgVGd swarthy/J^>N swash/NgSVGdJ swashbuckler/NSg swashbuckling/Jg swastika/NSg swat/~VSNg swatch/NgSV swath/NgSGd< swathe/NgV!@_₹ swaths/N< swatted/VtT swatter/NSgVdG swatting/V6N sway/~NgSVdG swayback/Ngd swayed/~VJU swear/~VG>SNJZ swearer/Ng swearword/NgS sweat/~NwSgVGd>Z sweatband/NgS sweater/~NgV sweatpants/Ng sweats/NgV sweatshirt/NSg sweatshop/NgS sweatsuit/NS sweaty/J>^N swede/~NSgV sweep/~VG>SNgZz sweeper/Ng sweeping/~VNgJY sweepings/Ng sweepstake/Ng!_₹ sweepstakes/~Ng sweet/~J^Y>pNSgVXn sweetbread/NSg sweetbrier/NSg sweetcorn/N sweetened/~VJU sweetener/~NgS sweetening/NgV sweetgrass/NSg sweetheart/~NSg sweetie/NSg sweetish/J sweetmeat/NgS sweetness/~Ng swell/~VGd>SNgJ^z swellhead/NgSd swelling/~NgV6 swelter/VGdSNg swept/~JVtT sweptback/J swerve/VGdSNg swerving/JNVU swift/~J^>YpNSg swiftness/Ng swig/VSNg swigged/VtT swigging/V6 swill/NSgVGd swim/~VSNg swimmer/~NSg swimming/~NgV6 swimmingly/Ry swimsuit/NSg swimwear/~Nmg swindle/~Vd>GSNgZ swindler/Ng swine/~NSg swineherd/NSg swing/~VG>SNgZ swingeing/JV swinger/Ng swinish/J swipe/VdGSNg swirl/VGdSNg swirly/JN swish/J^>NgSVGd switch/~NgSVd>GJZB switchback/NgSV switchblade/NSgV switchboard/NSg switcher/Ng switchover/N swivel/NgSVdG swivelled/VtT!@_₹ swivelling/V6N!@_₹ swiz/N swizz/NV swizzle/NSVdG swollen/~JV swoon/NSgVGd swoop/VGdSNg swoosh/VdGSNg sword/~NSgV swordfish/~N09gSV # singular and plural, also has a plural in -s swordplay/Ng swordsman/~N0g swordsmanship/Nmg swordsmen/N9 swore/~V sworn/~VJ swot/VSN swotted/VtT swotting/V6 swum/VT swung/~VT sybarite/NSgJ sybaritic/J sycamore/~NgS sycophancy/Nmg sycophant/NSgV sycophantic/J syllabic/~JN syllabicate/VGdSn syllabication/Nmg syllabification/Nmg syllabify/VdSGn syllable/~NgSV syllabub/NS syllabus/~NgS syllogism/NgS syllogistic/J sylph/Ng sylphic/J sylphlike/J sylphs/N sylvan/~JN symbioses/N9V symbiosis/N0g symbiotic/~JNQ symbol/~NgSV symbolic/~J symbolical/JY symbolisation/Ng!_₹ symbolise/VdSG!_₹ symbolism/~Nmg symbolization/Ng symbolize/~VdSG symbology/Nmg symlink/NgSVdG symmetric/~J symmetrical/~JY symmetry/~NSg sympathetic/~JNUQ sympathies/~Ng sympathise/VGd>SZ!_₹ sympathiser/Ng!_₹ sympathize/~VGd>SZ sympathizer/Ng sympathy/~NSg symphonic/~J symphony/~NSg symplectic/J symposium/~NgS symptom/~NgS symptomatic/~JNQ syn/~JN synæsthesia/Nmg synaesthesia/Nmg synagogal/J synagogue/~NSg synapse/~NgSV synaptic/~J sync/~NmgSVdG synch/Nmg synchronicity/N synchronisation/NmgS!_₹ synchronise/VGdS!_₹eU synchronization/~NmSg synchronize/VGdSeU synchronous/~JY synchrony/N syncopate/VdSGn syncopation/Ng syncope/Ng syncretic/~J syncretism/Nmg syndicalism/N syndicalist/NS syndicate/~NSgVdGn syndication/~Ng syndrome/~NSg synergism/Ng synergistic/J synergize/VSdG synergy/~NSg synesthesia/Nmg synfuel/NgS synod/~NSg synonym/~NSg synonymous/~J synonymy/Ng synopses/N synopsis/~Ng synoptic/~J synovial/~J syntactic/~J syntactical/JY syntax/~Nmg synth/N0g synth-pop/Nmg syntheses/N9 synthesis/~N0wg synthesise/V!_₹ synthesize/~VGd>SZ synthesizer/~NgS synthetic/~JNSgQ synths/N9V syphilis/~Nmg syphilitic/JNSg syringe/NSgVdG syrup/~NwSgV syrupy/J sysadmin/NgS syscall/NgS sysop/~NgSV system/~NSg systematic/~JU systematical/JY systematisation/Nmg!_₹ systematise/VGdS!_₹ systematization/Nmg systematize/VGdS systemic/~JSgQ systemize/VGdS systemwide/J systole/NSg systolic/JN t/NSdGnXBz ta/~PN ta-da tab/~NSgV tabbed/JVtT tabbing/V6N tabbouleh/Nmg tabby/~NSgJV tabernacle/~NSgV tabla/NgS table/~NgSVGd tableau/~Ng tableaux/N tablecloth/N0g tablecloths/N9 tableland/NSg tablespoon/NSg tablespoonful/NSg tablet/~NSgV tabletop/~NgSJV tableware/Nmg tabloid/~NSgJ taboo/~NgSJVdG tabor/~NgSV tabular/JN tabulate/VdGSNJnX tabulation/NwSg tabulator/NSg tachograph/N0 tachographs/N9 tachometer/NSg tachycardia/~Ng tachyon/N tacit/~JYp tacitness/Nmg taciturn/JY taciturnity/Nmg tack/~NgSVGd>Z tacker/NgS tackiness/Nmg tackle/~NSgVd>GZ tackler/NgS tacky/J>^pN taco/~NgSV tact/~NgVW tactful/JYp tactfulness/Nmg tactic/~NSgJ tactical/~JYN tactician/NgS tactile/~J tactility/Nmg tactless/JYp tactlessness/Nmg tad/~NSg tadpole/NgS taekwondo/Nmg taffeta/Nmg taffrail/NSg taffy/NwSg tag/~NSgVB tagged/~JVtT tagger/NSg tagging/~V6N tagliatelle/Nmg tagline/~NgSV tai chi/Nmg taiga/~NgS tail/~NSgVdGJre tailback/NgS tailboard/NSg tailbone/NSg tailcoat/NgS tailgate/~NgSVGd>Z tailgater/NgS tailless/J taillight/NgS tailor/~NSgVGd tailoring/VNg tailpiece/~NSg tailpipe/NSgV tailspin/NSgV tailwind/NSgV taint/NgSVdG tainted/~JVtTU take/~VSNgri take down/V/ take-home/JNgS take off/V/ take out/V/ takeaway/JNwgS takedown/NSg taken/~JVTdr takeoff/~NgS takeout/JNwgS takeover/~NSgV taker/~NgS taking/~JNSgV6 takings/N9g talc/NwgV talcum/NgV tale/~NgSV talebearer/NgS talent/~NwSgd talented/~JU tali/N talisman/~NgSV talk/~VGd>SNwgZ talkative/JYp talkativeness/Nmg talker/NgS talkie/NSg>^ talky/J tall/~J^>pN tallboy/NgS tallier/Ng tallish/J tallness/Nmg tallow/NgV tallowy/J tally/~NSgVd>GZ tallyho/NgSVdG talon/~NgS talus/NgS tam/~NSg tamale/NSg tamarack/NgS tamarind/NgS tambourine/~NgSV tame/~JY^>pVGdSBZ tamed/JVtTU tameness/Nmg tamer/NgSJ tamoxifen/N tamp/VGd>SZ tamper/NVGd>Z tamperer/NgS tampon/NSgV tan/~NSgJV tanager/NgS tanbark/Nmg tandem/~NSgJV tandoor/NgS tandoori/JNg tang/~NgSV tangelo/NgS tangent/~NgSJ tangential/~JY tangerine/~NgSJ tangibility/Ngi tangible/~JNgSi tangibleness/Ng tangibly/Ryi tangle/~VdGSNU tangle's/VGd>SZ tango/~NgSVdG tangy/J>^ tank/~NgSVGd>Z tankard/NgS tanker/~NgV tankful/NgS tankie/NgS tankless/J tanned/JVtTU tanner/~NSgJc tannery/NSg tannest/Ju tannin/NwgS tanning/~V6Ng tansy/Ng tantalisation/Nmg!_₹ tantalise/VGd>SZ!_₹ tantaliser/NgS!_₹ tantalising/V6JYN!_₹ tantalization/Nmg tantalize/VGd>SZ tantalizer/NgS tantalizing/JYV6N tantalum/~NwgS # plural can be used for capacitors tantamount/JVN tantra/~Ng tantrum/NSgV tap/~NSgVGd>Z tapas/N9 tape/~NwgSV tapeline/NgS taper/~NgVdGJ tapestried/J tapestry/~NwSgV tapeworm/NgSV tapioca/Nmg tapir/NgS tapped/~VtTJU tapper/NgS tappet/NgS tapping/~NmV6 taproom/NSg taproot/NSg tar/~NwSgVGd taramasalata/N tarantella/NgS tarantula/NSg tarball/NSV tardily/Ry tardiness/Nmg tardy/J^>pNV tare/NgSV target/~NgSVdG tariff/~NgSVdG tarmac/NwgSV tarmacadam/NV tarmacked/V tarmacking/V tarn/~NgS tarnish/NgSVbGd tarnished/~VtTJU taro/~NgS tarot/~NgS tarp/NgSV tarpaulin/NgSV tarpit/NgS tarpon/NgS tarragon/NSg tarred/VtT tarring/V6N tarry/VGd>SNJ^ tarsal/JNgS tarsi/N9 tarsus/~N0g tart/~J^Y>pNgSVGd tartan/~NgSJV tartar/NwgS tartaric/J tartness/Nmg tarty/J^ taser/NgSVGd task/~NgSVGd taskbar/NgS taskmaster/NgS taskmistress/NgS tassel/NgSVdG tasselled/J!@_₹ tasselling/V6N!@_₹ taste/~NgSVGd>JzZ tasted/~VU tasteful/JYpE tastefulness/NmgE tasteless/~JYp tastelessness/Nmg taster/Ng tastily/Ry tastiness/Nmg tasting/~NgV tasty/~J^>pN tat/~NSV>Z tatami/N09gS tater/Ng tatted/VtTJ tatter/NgSVdG tatterdemalion/JNgS tattie/N tatting/NgV6 tattle/VGd>SNgZ tattler/Ng tattletale/JNgSV tattoo/~NgSVd>GZ tattooer/NgS tattooist/NSg tatty/NSJ^> tau/~NSg taught/~VtTUr taunt/VGd>SNgJZ taunter/Ng taunting/~V6NY taupe/NgJ taut/J^Y>pVXn tauten/VdG tautness/Nmg tautological/JY tautologous/J tautology/NwSg tavern/~NgS tawdrily/Ry tawdriness/Nmg tawdry/NJ>^p tawny/~J^>VNg tax/~NwgSVGd>BZ tax-exempt/J taxa/~N9 taxation/~NgS taxer/Ng taxi/~NgSVGd taxicab/NSgV taxidermist/NSg taxidermy/NgV taximeter/NgS taxiway/~NS taxman/~N9 taxmen/N9 taxon/~N0g taxonomic/~JQ taxonomist/NgS taxonomy/~NwSg taxpayer/~NgS taxpaying/J tb/~NS tbsp/N tea/~NwSgV teabag/NSV teacake/NSg teach/~VG>SNZBz teachable/JNU teacher/~NgSY teaching/~NwSgV6 teacup/NgSJ teacupful/NgS teak/NwgSJ teakettle/NSgV teal/~NwgSJ tealight/NgS team/~NgSVGd teammate/~NgS teamster/NgS teamwork/~Ng teapot/NgS tear/~VGdSNg tearaway/NS teardrop/~NSg tearful/JY teargas/NwgSV teargassed/VtT teargassing/V6 tearjerker/NgS tearoom/NSg teary/J^> tease/~VGd>SNgZ teasel/NgSV teaser/~NgS teasing/~V6NY teaspoon/NSgV teaspoonful/NSg teat/NgS teatime/NwgS tech/~N0mg tech-savvy/J techie/NSJ technetium/~Nmg technical/~JYN technicality/NSg technician/~NSg technicolor/~JNm technique/~NwSg techno/~Nmg technobabble/Nmg technocracy/NSg technocrat/NgS technocratic/J technological/~JY technologist/NgS technology/~NwSg technophobe/NgS techs/N9V tectonic/~JS tectonics/~Ng ted/~NSV teddy/~NS tedious/~JYp tediousness/Ng tedium/Nmg tee/~NSgVd teeing/V6 teem/VGdS teen/~NgSJV teenage/~J>NZ teenager/~Ng teeny/J^> teeny-tiny/J teenybopper/NgS teeter/VdGSNg teeth/N9 teethe/VGdS teething/NgV6 teetotal/J>NVZ teetotaler/Ng teetotalism/Ng teetotaller/NgS!@_₹ tektite/NSg tel/~N # tele # prefixes that are not also words in their own right don't belong in the dictionary telecast/~VG>SNgZ telecaster/Ng telecom/NgS telecommunication/~NgS telecommunications/~Nmg telecommute/VGd>SNZ telecommuter/NgS telecommuting/NmgV teleconference/NgSVGd teleconferencing/NmgV telegenic/J telegram/~NgSV telegraph/~N0gVd>GZ telegrapher/NgS telegraphese/Nmg telegraphic/JQ telegraphist/NSg telegraphs/N9Vh telegraphy/~Nmg telekinesis/Nmg telekinetic/JN telemarketer/NSg telemarketing/~Ng telemedicine/Sg telemeter/NSgV telemetry/NSg teleological/J teleology/N telepath/NgS telepathic/~JQ telepathy/Nmg telephone/~NSgVd>GZ telephoner/NgS telephonic/J telephonist/NS telephony/~Nmg telephoto/JNSgV telephotography/Nmg teleplay/~NgS teleport/~VdGSNg teleportation/~Nmg teleprinter/NgS teleprocessing/Nmg teleprompter/NSg telesales/Nmg telescope/~NSgVdG telescopic/~JQ teletext/NwgS telethon/~NgS teletype/NSV teletypewriter/NgS televangelism/Nmg televangelist/NgS televise/VGdSXn television/~NwgV teleworker/NgS teleworking/V telex/NgSVdG tell/~VbGSNr teller/~NSg telling/~V6JYN telltale/~NSgJ tellurium/Nmg telly/~NSgJ telnet/NV temblor/NgS temerity/Ng temp/~NgSJ^>VdGZ temper/~NgVdG tempera/NSgL temperament/~NgS temperamental/JY temperance/~Ngi temperate/~JYVi temperateness/Nmg temperature/~NSg tempest/~NSgV tempestuous/JYp tempestuousness/Nmg template/~NgSVdG template's temple/~NSgV tempo/~NwSg temporal/~JYN temporarily/~R # adverb of duration temporariness/Nmg temporary/~JNSgW temporise/VGd>SZ!_₹ temporiser/Ng!_₹ temporize/VGd>SZ temporizer/Ng tempt/VSd>GZ temptation/~NwgS tempter/NgS tempting/~JYV6N temptress/NgS tempura/Nmg ten/~NgBH tenability/Nmg tenable/JU tenably/RyU tenacious/~JYp tenaciousness/Ng tenacity/~Nmg tenancy/~NSg tenant/~NSgVdG tenanted/VU tenantry/Ng tench/N tend/~VbdGSiEW tended/~VtTU tendency/~NSg tendentious/JYp tendentiousness/Nmg tender/~JY^>pNSgVdG tenderfoot/NgS tenderhearted/Jp tenderheartedness/Ng tenderise/VGd>SZ!_₹ tenderiser/Ng!_₹ tenderize/VGd>SZ tenderizer/Ng tenderloin/NSg tenderness/~Nmg tendinitis/Ng tendon/~NwSg tendril/NSgJ tenement/~NSg tenet/~NSg tenfold/JV tenner/NS tennis/~NgV tenon/NSgVdG tenor/~NSgJ tenpin/NSg tenpins/Ng tense/~NSgVd>GJY^pnX tenseness/Nmg tensile/~J tension/~NwSgVE tensioner/NgS tensity/Ngi tensor/~NSgV tent/~NSgVdG tentacle/NSgVd tentative/~NJYp tentativeness/Nmg tenterhook/NgS tenth/~JYN0gV tenths/N9 tenuity/Ng tenuous/~JYp tenuousness/Nmg tenure/~NSgVdG tepee/NSg tepid/JYp tepidity/Ng tepidness/Ng tequila/NSg terabit/NSg terabyte/NgS teraflop/NgS terahertz/Ng terajoule/NS terapixel/NgS terawatt/NS terbium/Nmg tercentenary/NSgJ tercentennial/NSg teriyaki/N term/~NgSVdGJY termagant/NgSJ terminable/Jie terminal/~NgSJYV terminate/~VdSGJnX termination/~NSge terminative/JNgS terminator/~NSg terminatory/J termini/~N terminological/JY terminology/~NwSg terminus/~Ng termite/~NSgV tern/~NgSJi ternary/JNSg terr/~N terrace/~NSgVdG terracotta/~NgJ terrain/~NwSg terrapin/NgS terrarium/NSg terrazzo/NgS terrestrial/~NSgJY terrible/~Jp terribleness/Ng terribly/~Ry% terrier/~Ng terrific/~JQ terrify/VGdS terrifying/~JYV6 terrine/NS territorial/~JNgS territoriality/Nmg territory/~NwSg terror/~NwSg terrorise/VdSG!_₹ terrorism/~Nmg terrorist/~NSgJ terroristic/JQ terrorize/VdSG terry/~Ng>Z terrycloth/Ng terse/J>Y^p terseness/Nmg tertiary/~JN tessellate/JVdSGXn tessellation/NwgS tesseract/NgS test/~NSVdGrKe test's/rWK testability/Nmg testable/JeW testament/~NgSV testamentary/J testate/JNS testator/NgS testatrices/N9 testatrix/N0g tested/~VU tester/~NSgK testes/N9 testicle/NgS testicular/J testifier/Ng testify/~VGd>SZ testily/Ry testimonial/~NgSJ testimony/~NSg testiness/Ng testings/N testis/N0g testosterone/~Nmg testy/J>^p tetanus/Nmg tetchily/Ry tetchy/J>^p tether/NSgVdG tetra/NSg tetracycline/Ng tetrahedral/~J tetrahedron/~NgS tetrameter/NSg text/~NwgSVW textbased/J textbook/~NSgJ texted/VtT textile/~NwgSJ texting/V6Nm textual/~JYW textualization/NwgS textural/J texture/~NgSVGd thalami/N9 thalamus/N0g thalidomide/Nmg thallium/Nmg than/~CP thane/NSg thank/~NSVdG thankful/JYp thankfulness/Nmg thankless/JYp thanklessness/Nmg thanksgiving/~NSg that/~CIDMg that'd/ that'll/ thatch/NgSVd>GZ thatcher/~NgS thatching/NgV thaw/~VdGSNg the/~Dz # removed `+` preposition: archaic theater/~NwSg< theatergoer/NSg theatre/NwSg!@_₹ theatregoer/NgS!@_₹ theatrical/~JYNS theatricality/Nmg theatricals/Ng theatrics/N9g thee/~I2o theft/~NwSg their/~D5 theirs/~I theism/~Nmg theist/NSg theistic/~J them/~Ia3o:g # I~pronoun a~personal 3~person :~plural o~object (g=them's as in (one of) them is/has) thematic/~JNQ thematically/Ry theme/~NSgVdG themselves/~Ia3F: # I~pronoun a~personal 3~person :~plural F~reflexive then/~RJNgC thence/~ thenceforth/ thenceforward/ theobromide/Nmg theobromine/Nmg theocracy/NwSg theocratic/J theodolite/NgS theologian/~NSg theological/~JY theologist/NSg theology/~NSg theorem/~NgSV theoretic/~J theoretical/~JY theoretician/NSg theorise/VdSG!_₹ theorist/~NSg theorize/VdSG theory/~NwSg theosophic/J theosophical/~J theosophist/NSg theosophy/Nmg therapeutic/~JNSQ therapeutics/~Nmg therapist/~NSg therapy/~NwSgV there/~R there'd/ there'll/ there's/~ thereabout/RS thereafter/~N thereat/ thereby/~R therefor/R therefore/~R therefrom/ therein/~R theremin/NSg thereof/~R thereon/ thereto/ theretofore/ thereunder/ thereunto/ thereupon/~R therewith/ therm/NSgV thermal/~JYNgSV thermionic/J thermodynamic/~JS thermodynamics/~Nmg thermometer/NgS thermometric/J thermonuclear/~JN thermoplastic/JNSg thermos/NgS thermostat/NgS thermostatic/JQ thesauri/N9 thesaurus/N0gS these/~IDM theses/~N9 thesis/~N0g thespian/JNSg theta/~NSg thew/NgSV they/~Ia3s: # I~pronoun a~personal 3~person :~plural s:~subject they'd/ they'll/ they're/ they've/ thiamine/Nmg thick/~JY^>pNgVnX thicken/Vd>GzZ thickener/~NwSg thickening/~NgVJ thicket/~NgS thickheaded/Jg thickish/J thickness/~NgSV thicko/NS thickset/JN thief/~N0mg thieve/VdG thievery/Nmg thieves/N9 thieving/VJNg thievish/J thigh/~N0wg # `S` here results in the wrong `thighes` instead of `thighs` thighbone/NgS thighs/N9 thimble/NgSV thimbleful/NSg thin/~JYpNSV thine/I thing/~NSg thingamabob/NSg thingamajig/NSg thingumabob/NSg thingummy/NSg thingy/NSIJ think/~V>GSNgBZ # `M` for 's as in What do you think's going on? thinkable/JU thinker/~NgS thinking's thinned/VtT thinner/~JcNgS thinness/Nmg thinnest/Ju thinning/V6NJ third/~JYNSgV third-party/J thirst/~NmSgVGd thirstily/Ry thirstiness/Nmg thirsty/~J^>pN thirteen/~SgH thirteenth/~JNg thirteenths/N thirtieth/JNg thirtieths/N thirty/~NSgH this/~IDM thistle/~NgS thistledown/Ng thither/J tho/~DIC thole/VSNg thong/~NSg thoracic/~JN thorax/~NgS thorium/~Nmg thorn/~NSgV thorniness/Ng thorny/~J>^p thorough/~J>Y^pPN thoroughbred/~JNgS thoroughfare/~NmgS thoroughgoing/J thoroughness/Nmg those/~IDM thou/~I2s though/~C thought/~NwSgVtT thought out/V thought-out/J thought-provoking/J thoughtful/~JYp thoughtfulness/Nmg thoughtless/JYp thoughtlessness/Nmg thousand/~NgSH thousandfold/J thousandth/JNg thousandths/N thraldom/Ng!_₹ thrall/NSgJVdG thralldom/Ng thrash/~Vd>GSNgzZ thrasher/Ng thrashing/VNg thread/~NwSgVd>GZr threadbare/J threader/Ng threadlike/J thready/J^> threat/~NSgVnX threaten/~VdG threatening/~VJYN three/~NSg three-quarters/N threefold/~JNV threepence/Ng threescore/NgS threesome/NSg threnody/NSg thresh/Vd>SGgZ thresher/Ng threshold/~NSgG threw/~Vt thrice/~ thrift/~NSgV thriftily/Ry thriftiness/Ng thriftless/J thrifty/J^>p thrill/~Vd>GSNgZ thriller/~Ng thrilling/~V6JYN thrive/~VdSG throat/~NSgV throatily/Ry throatiness/Ng throaty/J>^p throb/VSNg throbbed/VtT throbbing/V6JN throe/NSgV thrombi/N thrombolytic/JN thromboses/N9V thrombosis/~N0g thrombotic/J thrombus/Ng throne/~NSV throne's throng/NSgVGdJ throttle/~NSgVd>GZ throttler/Ng through/~PJN throughout/~P throughput/~Ng throughway/NgS!@_₹ throw/~V>GSNgZ throw back/V/ throw up/V/ throwaway/JNSg throwback/NSg thrower/~Ng thrown/~VTJ thru/~P thrum/NSgVJ thrummed/VtTJ thrumming/V6N thrush/~NgS thrust/~NSgVG thruster/NgS thruway/~NgS thud/NgSV thudded/VtT thudding/V6N thug/~NgSV thuggery/Ng thuggish/J thulium/Nmg thumb/~NSgVdG thumbnail/~NSgVdG thumbprint/NSg thumbscrew/NSg thumbtack/NSgV thump/NSgVdG thumping/JNgV thunder/~NgSVGd>Z thunderbolt/~NSgV thunderclap/NSgV thundercloud/NgS thunderer/Ng thunderhead/NSg thunderous/JY thundershower/NSg thunderstorm/~NSg thunderstruck/J thundery/J thunk/VSN thus/~N thwack/VGd>SNgZ thwacker/Ng thwart/~JPVGdSNg thy/~D thyme/~Ng thymine/Ng thymus/NgS thyroid/~JNgS thyroidal/J thyself/IF ti/~Ng>Z tiara/~NSgV tibia/~Ng tibiae/9 tibial/JN tic/~NSgV tick/~NgSVd>GZ ticker/~Ng ticket/~NSgVGd ticking/NgV tickle/NSgVd>GJZ tickler/Ng ticklish/JYp ticklishness/Ng #ticktacktoe/Ng # tic-tac-toe ticktock/VSNg tidal/~JY tidbit/NSg tiddler/NSg tiddly/NJ tiddlywink/NSV tiddlywinks/NgV tide/~NgSVGdz tideland/NSg tidemark/NS tidewater/~NgS tideway/NgS tidily/RyU tidiness/NgU tidings/Ng tidy/~J^>pVdGSNg tie/~NSVdrU tie back/V/ tie's tieback/NgS tiebreak/NSV>GZ tiebreaker/~Ng tiepin/NS tier/~NgVd tiff/NgSVdG tiger/~NSg tigerish/J tight/~JY^>pVSnX tighten/~VGd>Z tightener/Ng tightfisted/J tightness/Ng tightrope/~NgSV tights/~Ng tightwad/NgS tigress/NgS til/~CPN tilapia/N tilde/NSg tile/~NwgSVGd>Z tiler/Ng tiling/~NgV till/~PCNSVd>GEZ till's tillable/J tillage/Ng tilled/VtTJE!_₹ tiller/NgVE tilling/V6NE!_₹ tilt/~VdGSNg timber/~NSgVdG timberland/NSg timberline/~NgS timbre/~NSg timbrel/NSgV time/~NwgSVGdYZz time-consuming/JY time frame/NgS time-honored/J< time-honoured/J!@_₹ time-share/NgSVdG time zone/NgS!₹ timekeeper/NgS timekeeping/NgV timeless/~JYpN timelessness/Ng timeline/~NgSV timeliness/NmgU timely/~J>^pU timeout/NSg timepiece/NgS timer/~NgS timescale/~NS timeserver/NSg timeserving/NgJ timeshare/NSg timesheet/NgS timestamp/NSgVd timestep/NSg timetable/~NSgVdG timeworn/J timezone/~NgS< timid/~J>Y^p timidity/Nmg timidness/Nmg timing/~NmgV6 timorous/JYp timorousness/Ng timothy/~Ng timpani/~Ng timpanist/NSg tin/~NwSgJV tincture/NwgSVGd tinder/NgV tinderbox/NgS tine/NgSJV tinfoil/NmgV ting/~NgVdGY tinge/NSgV tingeing/V tingle/VdGSNgz tingling/NgV tininess/Nmg tinker/~NSgVGd>Z tinkerer/Ng tinkle/VdGSNg tinned/VtTJ tinniness/Nmg tinning/V6N tinnitus/Nmg tinny/J>^pN tinplate/NgV tinpot/JN tinsel/NSgJVGd tinselled/VtT!@_₹ tinselling/V6!@_₹ tinsmith/NSg tinsmiths/N tint/~NgSVdG tintinnabulation/NgS tintype/NgSV tinware/Nmg tiny/~J>^pN tip/~NSgV tipped/~VtT tipper/NSg tippet/NSg tippex/VGdSN tipping/~NV6 tipple/NSgVd>GZ tippler/Ng tipsily/Ry tipsiness/Ng tipster/NgS tipsy/J>^p tiptoe/NSgJVd tiptoeing/V tiptop/NSg tirade/NSgV tiramisu/NgS tire/~VGdSNr tire's tired/~V>JY^p tiredness/Nmg tireless/~JYp tirelessness/Ng tiresome/JYp tiresomeness/Ng tissue/~NwSgV tit/~NSgVx tit for tat/N tit-for-tat/J titan/~NSg titanic/~J titanium/~Nmg titbit/NSg!_₹ titch/NSV titchy/J tithe/~NSgJ>VdGZ tither/Ng titian/~NgJ titillate/VdSGn titillating/VJY titillation/Ng titivate/VdSGn titivation/Ng title/~NSgVdG titled/~JVU titleholder/NgS titlist/NgS titmice/N9 titmouse/N0g titration/NgS titter/VGdSNg tittle/NSgV titty/NSx titular/~JN tizz/N tizzy/NSg tl;dr/ tn/~N tnpk/N to/~PiU to-do/NgS toad/~NgSV toadstool/NgS toady/NSgVdGJ toadyism/Nmg toast/~NwSgVd>GZ toaster/~NgS toastmaster/NSg toastmistress/NgS toasty/J^>NS tobacco/~NwgS tobacconist/NSg toboggan/NSgVGd>Z tobogganer/Ng tobogganing/VNmg toccata/NwgS tocopherol/N tocsin/NSg today/~NgJ toddle/Vd>GSNgZ toddler/~Ng toddy/NSg toe/~NSgVd toecap/NSg toehold/NgS toeing/V6N toenail/NgSV toerag/NS toff/NS toffee/NwSgV tofu/~Nwg tog/NSgV toga/NgSd together/~Jp togetherness/Nmg togged/JtT togging/V6 toggle/NSgVdGB togs/NgV toil/NgSVd>GZ toiler/Ng toilet/~NgSVdG toiletry/NSg toilette/Ng toilsome/J toke/NgSVGd token/~NSgJV tokenism/Nmg tokenization/Nmg tokenize/VdSG tokenizer/NgS told/~jtTrU tole/NgV tolerable/Ji tolerably/Ryi tolerance/~N0wgSVi tolerances/N9V tolerant/~JYi tolerate/~VGdSn toleration/~Ng toll/~NgSVdG tollbooth/Ng tollbooths/N tollgate/NSgV tollway/NSg toluene/NSg tom/~NSgV tom yam/Ng tomahawk/~NSgVGd tomato/~Nw0gV tomatoes/~N9 tomb/~NgSVdG tombola/NS tomboy/NgS tomboyish/J tombstone/~NgSV tomcat/~NgSV tome/~NgS tomfoolery/NSg tomographic/J tomography/~Nmg tomorrow/~NgS tomtit/NgS ton/~NSg tonal/~JYN tonality/~NwSgs tone/~NwSVGd>IiZ tone's tonearm/NSg toneless/JY toner/Nwgi tong/~NgSVdG tongue/~NwgSVGd tongueless/J tonic/~JNwSgV tonight/~Ng tonnage/~NSg tonne/~NSg tonogenesis/Nmg tonsil/NgS tonsillectomy/NSg tonsillitis/Ng tonsorial/J tonsure/VdGSNg tony/~J>^N too/~R% took/~Vtr tool/~NSVdGr tool's toolbar/~NSg toolbox/~NgS toolchain/NgS toolkit/~NgS toolless/J toolmaker/NgS toolset/NgS toolshed/NgS tooltip/NgS toot/NgSVd>GZ tooter/Ng tooth/~N0gVd toothache/NgS toothbrush/NgSV toothfish/NgS09 # singular and plural, also has a plural in -s toothily/Ry toothless/J toothpaste/NSg toothpick/NSgV toothsome/J toothy/J>^ tootle/VGdSN tootsie/NS top/~NSgVJ top-end/J topaz/~NwgSJ topcoat/NSgV topdressing/VSNg topee/NS topflight/J topi/N topiary/JNg topic/~JNSg topical/~JYN topicalisation/Nmg!_₹ topicalise/Vd>SGZ!_₹ topicality/Nmg topicalization/Nmg topicalize/Vd>SGZ topknot/NSg topless/~JN topline/NSgVdG topmast/NSg topmost/J topnotch/J topographer/NSg topographic/~J topographical/~JY topography/~NwSg topological/~JY topology/~N topped/~JVtT topper/~NgS topping/~V6SJNwg topple/VGdSN topsail/NSg topside/NwSgJ topsoil/NgV topspin/NgV toque/NSg tor/~NSgJ torch/~NgSVGd torchbearer/NgS torchlight/Nwg tore/~JVN toreador/NgS torment/~NwSgVdG tormenting/VJYN tormentor/NgS torn/~VJ tornado/~N0gV tornadoes/~N9 torpedo/~N0gVGd torpedoes/~N9V torpid/JYN torpidity/Nmg torpor/Nmg torque/~NmgSVGd torquey/J torrent/~NSgJV torrential/J torrid/JYp torridity/Nmg torridness/Nmg torsion/~Nwg torsional/J torso/~NSg tort/~NSJWEr tort's torte/NSg tortellini/Nmg tortilla/NgS tortoise/~NgS tortoiseshell/NSgJ tortoni/Ng tortuous/JYp tortuousness/Nmg torture/~NmSgVd>GZ torturer/Ng torturous/J torus/~N tosh/~NVJ toss/~NgSVd>GZ toss up/V/ tossup/NgS tot/~NSgVGd total/~NSgJVGd totalisator/NgS!@_₹ totalitarian/~JNSg totalitarianism/~Nmg totality/~NwSg totalizator/NSg totalize/VSdG totalled/VtTJ!@_₹ totalling/V6!@_₹ totally/R% tote/NgSV totem/~NSg totemic/J totted/VtT totter/VGd>SNgZ totterer/Ng totting/V6N toucan/NgS touch/~VGdSNwgr touchdown/~NSg touche/Bz touched/~JVtTU touchily/Ry touchiness/Nmg touching/~V6JYPN touchline/NS touchpad/NSg touchpaper/NS touchscreen/NgS touchstone/~NgS touchy/J>^p tough/~J^Y>pNgVGdXn toughen/VGd>Z toughener/Ng toughie/NSg toughness/~Ng toughs/N toupee/NgS tour/~NSgVGdeW tourism/~Nmg tourist/~NgSV touristed/J touristic/J touristy/J tourmaline/Ng tournament/~NSg tourney/NgSV tourniquet/NgSV tousle/VGdSN tout/~NgSVdG tow/~VGd>SNgZ toward/~PJ towards/~P towboat/NgS towel/~NSgVGdz towelette/NSg toweling/NgV6 towelled/JVtT!@_₹ towelling/NSgV6!@_₹ tower/~NgVGd towhead/NgSd towhee/NgS towline/NgS town/~NgS townee/NS townhome/NgS townhouse/~NgS townie/NgS townsfolk/Ng township/~NgS townsman/Ng townsmen/9 townspeople/~N9g townswoman/Ng townswomen/9 towpath/Ng towpaths/N towrope/NSg toxaemia/Ng!_₹ toxemia/Ng toxic/~J toxicity/~NSg toxicological/J toxicologist/NSg toxicology/~Ng toxin/~NSg toy/~NSgVGdJ toyboy/NS tr/~NJ trabecula/N trabeculae/N!@_₹ trabecular/J trabecule/N trace/~NSgVd>GzZ traceability/Nmg traceable/JU traceback/NgS tracer/~Ng tracery/NSg trachea/N0g tracheae/9 tracheal/J tracheotomy/NSg tracing/~NgV track/~NSgVGd>Z trackball/NSg tracker/~NgS trackless/J trackpad/NgS tracksuit/NS tract/~NSVeEKWr tract's tractability/Nmgi tractable/Ji tractably/Ryi traction/~NmgVEWreK tractor/~NgSVWeK trad/~JN trade/~NwSgVd>GJzZ trade in/V trade-in/NgS trademark/~NSgVGdJ tradeoff/NSg trader/~NgS tradesman/N0g tradesmen/N9 tradespeople/N9g tradeswoman/N0g tradeswomen/N9 tradie/NgS trading/~V6JNmg tradition/~NwgSV traditional/~JYN traditionalism/Ng traditionalist/~NSgJ traduce/Vd>SGZ traducer/Ng traffic/~NmSgVJ trafficked/JVtT trafficker/NSg trafficking/~V6Ng tragedian/NSg tragedienne/NgS tragedy/~NwSg tragic/~JN tragically/~Ry tragicomedy/NwSg tragicomic/J trail/~VGd>SNgZ trailblazer/NgS trailblazing/JV6g trailer/~NgSVdG train/~NSgVGd>ZB trained/~JVtTU trainee/~NSg trainer/~Ng training/~V6Nmg trainload/NgS trainman/N0g trainmen/N9g trainspotter/NSg trainspotting/~Nm traipse/VdGSNg trait/~NSg traitor/~NSgVJ traitorous/JY trajectory/~NSg tram/~NgSV tramcar/NS tramlines/N9V trammed/VtT trammel/NSgVGd trammeled/VtTU< trammelled/VtTU!@_₹ trammelling/V6N!@_₹ tramming/V6 tramp/~NSgVGd>Z tramper/Ng trample/Vd>GSNgZ trampler/Ng trampoline/NgSVGd tramway/~NS trance/~NgSV tranche/~NSV tranquil/~J>Y^ tranquility/~Ng tranquilize/VGd>SZ tranquilizer/Ng tranquillise/Vd>SGZ!_₹ tranquilliser/Ng!_₹ tranquillity/Ng!_₹ trans/~JNV(i transact/VdGS transaction/~NSg transactional/J transactionalism/Ng transactionalist/NSg transactor/NgS transatlantic/~J transaxle/NSg transceiver/NSg transcend/~VGSd transcendence/~Nmg transcendent/~JN transcendental/~NJY transcendentalism/Ng transcendentalist/NSg transcode/VGdSNg transcoder/NgS transcontinental/~JN transcribe/~VGd>SZ transcriber/Ng transcript/~NgSV transcription/~NwSg transducer/~NgS transduction/~Nmg transect/VdGSN transept/~NgS transfer/~VSNgB transferal/NgS transferee/NgS transference/Ng transferred/~VtT transferring/~V6N transfiguration/~Ng transfigure/VGdS transfinite/JN transfix/VdGSN transform/~VGd>SNgBZ transformation/~NSg transformational/~J transformative/~J transformer/~Ng transfuse/VdSGXn transfusion/Nwg transgender/~JNSV transgenic/JN transgress/VGdS transgression/~NSg transgressive/~NSg transgressor/NSg transhumanism/Nmg transhumanist/NgS transience/Ng transiency/Ng transient/~JYNSg transistor/~NSg transistorise/VdSG!_₹ transistorize/VdSG transit/~NSgVGd transition/~NSgVGd transitional/~JY transitive/~JYNSgi transitiveness/Ng transitivity/Ng transitory/J transl/~ translatable/JU translate/~VdGSNnBX translated/~VU translation/~NwgS translator/~NSg transliterate/VdSGnX transliteration/~NwgS translocation/Nmg translucence/Nmg translucency/~Nmg translucent/~JY transmigrate/VGdSn transmigration/NwSg transmissible/J transmission/~NwgS transmit/~VS transmittable/J transmittal/Ng transmittance/Nmg transmitted/~JVtT transmitter/~NSg transmitting/~V6N transmogrification/Nmg transmogrify/VdSGn transmutation/~NwSg transmute/VdSGB transnational/~JNgS transoceanic/J transom/NSg transpacific/J transparency/~NwSg transparent/~JYU transphobia/Nmg transphobic/J transpilation/NwgS transpile/VSdG transpiler/NgS transpiration/Nmg transpire/VdSG transplant/~VdGSNg transplantation/~Nmg transpolar/J transponder/NSg transport/~VGd>SNwgBZ transportation/~Nmg transporter/~Ng transpose/~VdGSJN transposition/~NgSV transsexual/JNSg transsexualism/Ng transship/VSL transshipment/Ng transshipped/VtT transshipping/V6N transubstantiation/Ng transversal/JN transverse/~JYNgSV transvestism/Ng transvestite/NgS trap/~NgSV trapdoor/~NgSV trapeze/NSgV trapezium/NSg trapezoid/~NSg trapezoidal/J trappable/J trapped/~JVtT trapper/~NSg trapping/~V6SNw trappings/~Nmg trapshooting/Ng trash/~NwgSVGd trashcan/NgS trashiness/Nmg trashy/J>^p trauma/~NwgS traumatic/~JNQ traumatise/VGdS!_₹ traumatize/VGdS travail/~NSgVGd travel/~Vd>GSNwgZz traveled/~JVtTU< traveler/~Ng< traveling/~V6NgJ< travelled/JVtT!@_₹ traveller/NSg!@_₹ travelling/V6SNgJ!@_₹ travelog/NgS< travelogue/~NgS traversal/NSg traverse/~NSgVdGJ travertine/~NSg travesty/NSgVGd trawl/NSgVGd>Z trawler/Ng tray/~NgSV treacherous/~JYp treacherousness/Nmg treachery/~NSg treacle/NmgV treacly/J tread/~VGSNgr treadle/NSgVdG treadmill/NgSV treas treason/~NgB treasonous/J treasure/~NwSgVd>GZ treasurer/~Ng treasury/~NSg treat/~VGdSNgr treatable/J treated/~VtTJU treatise/~NSg treatment/~NwgS treaty/~NSgV treble/~JNgSVGd tree/~NgSVd treeing/V6NJ treeless/J treelike/J treeline/N treetop/NSg trefoil/~NSg trek/~NgSV trekked/VtT trekker/NSg trekking/~V6N trellis/NgSVGd trematode/NgS tremble/VdGSNg tremendous/~JY tremolo/~NSg tremor/~NgSV tremulous/JYp tremulousness/Ng trench/~NSVdGr trench's trenchancy/Ng trenchant/JY trencher/NgS trencherman/Ng trenchermen/9 trend/~NSgVGd trendily/Ry trendiness/Nmg trendsetter/NS trendsetting/J trendy/~J>^pNSg trepidation/Nmg trespass/~NgSVd>GZ trespasser/Ng tress/NgSVE trestle/~NgS trews/N trey/~NgS # tri # prefixes that are not also words in their own right don't belong in the dictionary triad/~NSg triage/NmgVd triager/NSg trial/~NSgJVr trialed/V trialing/VN trialled/VtT!@_₹ trialling/V6N!@_₹ triangle/~NSg triangular/~JY triangulate/VGdSJn triangulation/~Nmg triathlete/NS triathlon/NSg tribal/~JN tribalism/Nmg tribalistic/J tribe/~NSgV tribesman/Ng tribesmen/~9 tribeswoman/Ng tribeswomen/9 triboluminescence/Ng triboluminescent/J tribulation/NSg tribunal/~NSg tribune/~NgS tributary/~NSgJ tribute/~NSVW tribute's trice/VNg tricentennial/NgSJ triceps/NgS triceratops/Ng09S # singular and plural, also has a plural in -s trichina/Ng trichinae/9 trichinosis/Ng trick/~NSgVGdJ trickery/Nmg trickily/Ry trickiness/Ng trickle/~NgSVGd trickster/~NSgV tricky/~J^>p tricolor/~JNSg tricolour/NgSJ!@_₹ tricycle/NSgV trident/~NgS tried/~JVU triennial/JYNgS trier/~NSg trifecta/NSg trifle/NgSVGd>Z trifler/Ng trifocals/Ng trig/~JNgV trigger/~NgSVdGJ triggerable/J triglyceride/NgS trigonometric/~J trigonometrical/J trigonometry/~Ng trike/NSgV trilateral/~JS trilby/NSg trill/NSgVGdJ trillion/~NSgH trillionaire/NSg trillionth/JNg trillionths/N trillium/Nmg trilobite/~NSg trilogy/~NSg trim/~VSNgJYp trimaran/NgS trimester/NSg trimmed/~VtTJU trimmer/JcNSg trimmest/JuV trimming/~NSgV6 trimmings/Ng trimness/Ng trimonthly/JN trinitrotoluene/Ng trinity/~NSg trinket/NSgV trio/~NgS triode/NgS trip/~NgSVJY tripartite/~J tripe/~Ng triple/~JNgSVGd triplet/~NSg triplex/JNgSV triplicate/JNgSVGd tripod/~NgSV tripodal/J tripos/N tripped/~VtT tripper/NSg tripping/~V6JN trippy/J^S triptych/~N0g triptychs/N9 tripwire/NSV trireme/NSg trisect/VSdG trisection/Ng trite/JY^pNW triteness/NgW triter/Jc tritium/~Nmg triumph/~N0wgVbGd triumphal/~JN triumphalism/N triumphalist/JN triumphant/~JY triumphs/~N9V6 triumvir/NgS triumvirate/~NSg trivalent/JN trivet/NgS trivia/~Nmg trivial/~JYN trivialisation/NwSg!_₹ trivialise/VGdS!_₹ triviality/NwSg trivialization/NwSg trivialize/VGdS trivium/Nmg trochaic/JN trochee/NSg trod/VtNrU trodden/JVTr troglodyte/NSg troika/NgS trojan/NgSVAdG troll/~NSgVGd trolley/~NSgV trolleybus/~NgS trollop/NSgV trombone/~NgSV trombonist/~NgS tromp/VGdSN tron/~NS troop/~NSgVGd>Z trooper/~NgV troopship/NgS trope/NSgV trophy/~NSgV tropic/~NgSJ tropical/~JYN tropicalization/Nmg tropicalize/VSdG tropics/~N9g tropism/NSg troposphere/NSg trot/~NgSV troth/NgV trotted/VtT trotter/~NSg trotting/~JNV6 troubadour/~NgS trouble/~NwSgVdG troubled/~JVtTU troublemaker/NgS troubleshoot/Vd>GSZ troubleshooter/Ng troubleshooting/NmgV6 troubleshot/VtT troublesome/~JY trough/~N0gV troughs/N9 trounce/Vd>GSNZ trouncer/Ng troupe/~NgSVGd>Z trouper/Ng trouser/~NSgV trousers/~N9g trousseau/Ng trousseaux/N trout/~NSg09V # singular and plural, also has a plural in -s trove/NSg trow/VdGSN trowel/NgSVdG trowelled/VtT!@_₹ trowelling/V6!@_₹ troy/~JS truancy/Ng truant/JNgSVGd truce/~NSg truck/~NSgVGd>Z trucker/~NgJ trucking/~NgV truckle/NgSVGd truckload/NSg truculence/Ng truculent/JY trudge/NgSVGd true/~J^>NgSVGd truelove/NSg truffle/NgS trug/NS truism/NgS truly/~JRy%U trump/~NSgVGd trumpery/NgJ trumpet/~NgSVGd>Z trumpeter/~NgS truncate/VGdSJn truncation/Nmg truncheon/NSgV trundle/NgSVGd>Z trundler/Ng trunk/~NSgVG truss/~NgSVGd trust/~Nw☁SgVGdJE trustee/~NgSV trusteeship/NwSg trustful/JYE trustfulness/Ng trusting/~VJY trustworthiness/Ng trustworthy/~J^>p trusty/J^>NSg truth/~N0w☁gV>Z truther/NgS truthful/~JYpU truthfulness/NmgU truthiness/Nm truths/~N9VU try/~VGdSNJr try out/V/ try's trying/~JYV6N tryout/~NSg tryptophan/N tryst/NSgVdG tsar/NgS!_₹ tsarists/N tsetse/NgS tsp/N tsunami/~NSg ttys tub/~NSgVGd>Z tuba/~NgS tubal/J tubbed/JVtT tubbing/NgV6J tubby/J^>N tube/~NgSV tubeless/Jg tuber/~Ng tubercle/NSg tubercular/JN tuberculin/Ng tuberculosis/~Ng tuberculous/J tuberose/JNg tuberous/J tubful/NgS tubing/~NgV6 tubular/~J tubule/NgS tuck/~Vd>GSNgZ tucker/~VdGNg tuft/NgSVd>GZ tufter/Ng tug/~VSNg tugboat/~NgS tugged/VtT tugging/V6N tuition/~Ngi tularaemia/N!_₹ tularemia/Ng tulip/NSg tulle/Ng tum/~NS tumble/NSgVd>GZ tumbledown/J tumbler/Ng tumbleweed/NSg tumbling/~V6Ng tumbrel/NSg tumbril/NSg!_₹ tumescence/Ng tumescent/J tumid/J tumidity/Ng tummy/NSg tumor/~NSg tumorous/J tumour/NSg!@_₹ tumult/NSgV tumultuous/~JY tun/~NSgVGd>Z tuna/~NwgS tundra/~NSg tune/~NgSV tune up/V/ tuneful/JYp tunefulness/Ng tuneless/JY tuner/~Ng tuneup/NSg tungsten/~Ng tunic/~NSg tunnel/~NSgVd>GzZ tunneler/Ng tunnelled/VtT!@_₹ tunneller/NSg!@_₹ tunnelling/V6SN!@_₹ tunny/NSg tuple/~NS tuppence/N tuppenny/JN tuque/NSg turban/~NSgVd turbid/J turbidity/Ng turbine/~NSg turbo/~NSgJV turbocharge/VGd>SZ turbocharger/Ng turbofan/NSg turbojet/NSg turboprop/~NSg turbot/NSg turbulence/~Ng turbulent/~JY turd/NgSVx turducken/NSg tureen/NSg turf/~NgSVdG turfy/J turgid/JY turgidity/Ng turkey/~NwSg turmeric/~NSg turmoil/~NgSV turn/~Vd>GSNgrZ turn about/V/ turn around/V/ turn off/V/ turn out/V/ turnabout/NSg turnaround/~NSg turnbuckle/NSg turncoat/NSgV turner/~Ngr turning/~NgSV6 turnip/~NSgV turnkey/JNgSV turnoff/NgS turnout/~NgS turnover/~NgSJ turnpike/~NgSV turnstile/NSg turntable/~NSgV turpentine/NgV turpitude/Ng turps/N turquoise/~NSgJ turret/~NSgd turtle/~NSgVdG turtledove/NSg turtleneck/NSgVdG tush/~NgSV tusk/~NgSVd tussle/NSgVdG tussock/NgS tussocky/J tut/VSNg tutelage/~Ng tutelary/JN tutor/~NSgVdG tutored/~VtTU tutorial/~JNSg tutorship/Ng tutted/VtT tutti/~JNSg tutting/V6N tutu/NgSV tux/NgS tuxedo/~NSg twaddle/NgSVGd>Z twaddler/Ng twain/~JNgV twang/NSgVdG twangy/J>^ twas/ twat/NSVx tweak/VdGSNg twee/JN tweed/~NSg tweeds/Ng tweedy/J>^ tween/NVJ tweet/NSVdGr tweet's tweeter/NSg tweezers/~Ng twelfth/~JN0g twelfths/N9 twelve/~NSg twelvemonth/Ng twelvemonths/N twentieth/~JN0g twentieths/N9 twenty/~NSgH twerk/NSVdG twerp/NSg twice/~R twiddle/VGdSNg twiddly/J twig/NgSV twigged/VtT twigging/V6 twiggy/~J^> twilight/~NmgJV twilit/VJ twill/NmgVd twin/~NgSVd>GJZ twine/NwSgV twiner/Ng twinge/VdGSNg twink/VSNY twinkle/~VGdSNgz twinkling/JV6SNwg twinned/~VtT6J^ twinning/~V6NJ twinset/NS twirl/NSgVd>GZ twirler/Ng twirly/JN twist/~NSVdGU twist's twister/~NgS twisty/J^>N twit/VSNg twitch/~NgSVGd twitchy/J>^ twitted/VtT twitter/~NgSVdG twittery/J twitting/V6N twixt/P two/~NSg two-door/JNgS two-thirds/N twofer/NSg twofold/~J twopence/NSg twopenny/JN twosome/JNSg twp/NJ tycoon/~NSg tying/~NVrU tyke/~NgS tympani/Ng tympanic/J tympanist/NgS tympanum/NSg type/~NSVGdr type-check/VSdG type checking/Ng type-in/NgS type's typeahead/Ng typecast/VGS typeface/~NgS typeform/NgS typeset/VSJ typesetter/NgS typesetting/NgV6 typewrite/V>SGZ typewriter/~Ng typewriting/NgV typewritten/JV typewrote/V typhoid/~JNmg typhoon/~NgSV typhus/~Nmg typical/~JYNU typicality/Nmg typification/Nmg typify/VGdSn typing/~NwgSV typist/NSg typo/~NgSV typographer/NSg typographic/J typographical/JY typography/~Nmg typological/JQ typology/~NwSg typosquat/NgSV typosquatted/VtT typosquatter/NgS typosquatting/V6 tyrannic/J tyrannical/JY tyrannicidal/J tyrannicide/NmS tyrannise/VGdS!_₹ tyrannize/VGdS tyrannosaur/NgS tyrannosaurus/NgS tyrannous/J tyranny/~NwSg tyrant/~NSgJV tyre/NgSV!_₹ tyro/NgS tyrosine/Nmg tzatziki/Nmg ubiquitous/~JY ubiquity/Nmg udder/NSg ufologist/NSg ufology/Nmg ugh/~ uglification/NwgS ugliness/Nmg ugly/~J^>pNV uh/~N uh-huh uh-oh uhf/~ ukase/NSg ukulele/~NSg ulcer/NSg ulcerate/JVdSGXn ulceration/~Ng ulcerous/J ulna/~N0g ulnae/N9 ulnar/~J ulster/~NgS ult/~N ulterior/J ultimate/~JYNgV ultimatum/~NgS ultimo/~JN ultra/~JNSg( ultraconservative/JNSg ultrahigh/J ultraist/NSg ultralight/~JNSg ultramarine/JNg ultramodern/J ultrasensitive/J ultrashort/JN ultrasonic/~JQ ultrasound/~NgSV ultraviolet/~JNg ululate/VdSGnX ululation/Ng um/~V umami/Nmg umbel/NSg umber/~NgJV umbilical/JNgS umbilici/N umbilicus/Ng umbra/NSg umbrage/NgV umbrella/~NSgV umiak/NSg umlaut/NgSV ump/NSgVGd umpire/~NgSVGd umpteen/H # un # prefixes that are not also words in their own right don't belong in the dictionary un-American/J unabridged/~JNgS unacceptability/Nmg unacceptable/~JN unaccommodating/J unaccountably/Ry unadventurous/J unaesthetic/J unaffected/J unaffordable/J unalive/NgSVdGJ unallocated/J unalterably/Ry unambitious/J unanimity/Ng unanimous/~JY unanswered/J unapparent/J unappetising/J!_₹ unappetizing/J unappreciative/J unary/JN unashamed/J unassertive/J unassimilable/J unassuming/JY unauthorised/J!_₹ unauthorized/J unavailing/JY unaware/~JS unban/VS unbanned/VtT unbanning/V6 unbeknown/J!_₹ unbeknownst/~ unbend/VSG unbent/VJ unbid/JV unbirth/NgS unblinking/JY unblushing/JYV unbosom/VdG unbound/~VdJ unbox/VGdS unbreakable/JN unbroken/~J uncanny/~J^N uncap/VS uncaring/JN uncatalogued/J uncategorized/J unceasing/JY unchangeable/JN uncharacteristic/J uncharitable/J unchaste/J>^ uncheck/Sg unchurched/J uncial/JNg uncle/~NSgV unclean/~J>^pd uncleanly/J^Ry unclear/~J^>Vd unclipped/JVtT unclipping/V6 uncomfortable/~J uncomment/VSdG uncommon/~J^ uncompelling/J uncomplaining/JY uncomplicated/VJ uncomprehending/JY uncompress/VGdS uncompromising/~JY unconditional/~JYN unconfigured/J uncongenial/J unconscionable/J unconscionably/Ry unconscious/~JNg unconstitutional/~JY uncontrollably/Ry uncontroversial/~J uncool/J uncooperative/J uncopyrightable/J uncorrupted/J uncouth/JY uncredited/J uncrewed/J uncrushable/J unction/~NSg unctuous/JYp unctuousness/Ng uncut/~J undaunted/JY undead/JN undecided/~JNSgV undefine/VGdS undemonstrative/JY undeniably/Ry under/~PJN( underachieve/VGd>SLZ underachiever/Ng underact/VSdG underage/~JN underappreciated/VtTJ underarm/NSgJV underbelly/~NSg underbid/VbtTdSN underbidding/V6 underbody/NgS underbrush/NgV undercarriage/NgS undercharge/VGdSNg underclass/NgS underclassman/Ng underclassmen/9 underclock/VSdG underclothes/Nmg underclothing/Nmg undercoat/NwSgVGdz undercoating/NgV undercount/NSVdG undercover/~JNV undercurrent/NSgV undercut/NSgVJ undercutting/V6N underdeliver/VSdG underdelivery/NgS underdeveloped/~JV underdevelopment/Nmg underdog/~NSg underdone/J underemployed/J underemployment/Ng underestimate/VdGSNgnX underestimation/Ng underexpose/VGdSJ underexposure/NgS underfed/JVtT underfeed/VGS underfloor/JN underflow/NV underfoot/JNV underfund/VSdG underfur/Ng undergarment/NSg undergird/VSdG undergo/~VG undergoes/~V undergone/~V undergrad/NS undergraduate/~NSgJ underground/~JNgSV undergrowth/Nmg underhand/JVN underhanded/JYpVN underhandedness/Ng underhood/J underinflated/V underinsured/J underinvest/VGdS underlaid/tT underlain/V underlay/VSGNg underlie/VS underline/~NgSVGdJ underling/NgS underlip/NSg underlying/~JNV6 undermanned/VtTJ undermentioned/J undermine/~VGdS undermost/J underneath/~PJNg underneaths/N undernourished/J undernourishment/Ng underpaid/J underpants/Ng underpart/VSNg underpass/~NgS underpay/VGSL underpayment/NwSg underperform/VGdS underperformance/Ng underperformer/NgS underpin/VS underpinned/VtT underpinning/V6SNg underplay/NSVdG underpopulated/J underpower/VSdG underprepared/J underprivileged/~JN underproduction/Nmg underrate/VGdSN underrepresent/VdGS underscore/NSgVdG undersea/~JS underseal/NSgdG undersecretary/~NSg undersell/VGS underserve/VdSG undersexed/J undershirt/NSg undershoot/VGSN undershorts/Ng undershot/VJN underside/~NgS undersign/VdGS undersigned/JNg undersized/J underskirt/NSg undersold/VtTdJ underspent/V understaff/VSdG understand/~VbSGBz understandably/~Ry understanding/~NwgJYV6 understate/VdSGL understatement/NSg understood/~JVtT understudy/~VGdSNg undertake/~VG>SNZz undertaken/~V undertaker/~NgS undertaking/~NgV underthings/Ng undertone/NgSV undertook/~V undertow/VSNg underused/JV underutilised/JV!_₹ underutilized/JV undervaluation/Ng undervalue/VdGSN underwater/~JNV underway/~N underwear/~Nmg underweight/JNgV underwent/~V underwhelm/VdGS underwire/NSVd underworld/~NgS underwrite/VG>SZ underwriter/Ng underwritten/V underwrote/V undesirable/~JNgS undiagnosed/J undies/NgV undirected/J undiscouraged/J undisputedly/Ry undo/~VNJ undoubted/J undoubtedly/R # adverb of certainty aka viewpoint/sentence adverb undramatic/J undue/~J undulant/J undulate/VdSGJXn undulation/Ng undying/JV unearthliness/Ng unease/NgV uneasy/~J^ uneatable/J uneconomic/J uneditable/J unelected/J unemployed/~Jg unencrypted/J unending/J unenterprising/J unequal/~JYNd unerase/VSdG unerring/JY unessential/J unevacuated/J unevaluated/J uneven/~JYV unexceptionably/R # viewpoint/stance adverb aka comment/sentence adverb unexcited/J unexciting/J unexpanded/J unexpected/~JYpN unexpectedness/Ng unexplainable/J unexploded/J unfailing/JY unfair/~J^Y>pV unfaltering/J unfamiliar/~JN unfathomably/Ry% unfed/JN unfeeling/JY unfeminine/J unfit/~JVS unfitting/J unfix/VGdSB unflagging/JY unflappability/Nmg unflappable/J unflappably/Ry unflattering/JV unflinching/JY unfollow/VSdG unforgettably/R%y unforgivably/R% unforgiven/JN unfortunate/~JNgS unfree/J unfriendly/J^N unfrock/VdG unfruitful/J unfunny/J ungainliness/Nmg ungainly/J>^pN ungenerous/J ungentle/J ungodly/J^ ungraceful/JY ungrounded/J ungrudging/JY unguarded/J unguent/NSgJ ungulate/JNgS unhandled/J unhandy/J^ unhappy/~J^NV unhealthful/J unhealthy/~J^ unhistorical/J unholy/~J^ unhurt/J # uni # prefixes that are not also words in their own right don't belong in the dictionary unibody/NSg unicameral/~J unicellular/JN unicorn/~NSgVJ unicycle/NSgV unidirectional/JN unification/~NwSgr unifier/NgS uniform/~NSgJYVdG uniformity/~Nmg unify/~VGdSrn unignorable/J unilateral/~JY unilateralism/Nm unimportant/~J unimpressive/J uninflected/J uninformative/J uninhibited/JY uninstallation/NSg uninsurable/J uninsured/JN unintelligent/J unintended/~J uninteresting/J uninterrupted/~JY uninterruptible/J unintuitive/~JYpN uninvested/J uninviting/J union/~NSgVJr unionism/Nmg unionist/~JNgS unique/~JY^>pN uniqueness/~Nmg unironic/JQ unisex/JNg unison/~Ng unit/~NSg unitary/~JN unite/~VGdSNrE unitedly/Ry unities/N unitise/VdSG!_₹ unitize/VdSG unity/~NmgE univalent/JN univalve/JNSg universal/~JYNgS universalise/VdSG!_₹ universalism/~N universalist/~JN universality/Nmg universalize/VdSG universe/~ONSg university/~NSg univocal/JN unjust/~JY unkempt/J unkillable/J unkind/J^ unkindly/J^ unknowable/JNg unknown/~JNSgV unleaded/JVNg unless/~C unlicense/VGdS unlike/~JpPNVB unlikely/~J^N unlink/NgSVdG unlit/J unlivable/J!_₹ unlock/~VdGSN unlockable/J unlovable/J unlovely/J^>N unloving/JV unlucky/~J^ unmagnetised/J!_₹ unmagnetized/J unmanly/J^ unmarried/~JN unmeaning/JN unmedicated/J unmentionable/JNgS unmentionables/Ng unmerged/J unmet/J unmindful/J unmissable/J unmistakably/Ry unmoral/J unmount/VdSG unmovable/J unmusical/J unmute/VSGd unnecessary/~J unnerving/VJY unnest/VSGd unobservant/J unobtanium/Nmg unoffensive/J unofficial/~JY unopen/J unoptimized/VJ unoriginal/JN unpause/VdSG unpayable/J unpeople/V9 unperceptive/J unpersuasive/J unpick/VGdS unpin/VS unpleasing/J unpolitical/J unpolymerised/J!_₹ unpolymerized/J unpopular/~J unpowered/J unpractical/J unprecedented/~JY unpredicted/J unprofessional/JYN unpromising/JV unpropitious/J unprosperous/J unprovokedly/Ry unquestioning/JY unquiet/J^>V unravelling/V6N!@_₹ unread/JVNB unready/J unreal/~J unreasoning/J unreflectively/Ry unregenerate/J unrelated/~J unrelenting/JY unrelieved/JY unremarkable/~J unremitting/JY unrepairable/J unrepentant/J unreported/J unrepresentative/J unrest/~Nmg unrestfully/Ry unrestored/J unrevealing/J unripe/J^> unroll/VGdS unromantic/J unruliness/Nmg unruly/~J>^p unsafe/~JY^>V unsalable/NJ!@_₹ unsaleable/JN unsavory/J< unsavoury/J!@_₹ unscathed/J unsee/VS unseeing/JY unseemly/J^ unseen/~JVNg unselect/VGdS unsentimental/J unset/JV unsettlingly/R unshakable/J unshakably/Ry unshakeable/J!_₹ unshapely/J unshockable/J unshorn/J unsightliness/Ng unsightly/J^p unskillful/JY!@_₹ unskippable/J unsmiling/J unsociable/JN unsocial/J unsold/~J unsound/J>Y^p unspeakable/JN unspeakably/Ry unspecific/J unspectacular/J unsporting/J unstable/~JV unstage/VdSG unsteady/J^>pV unstick/VSG unstinting/JY unstoppably/Ry unstrapping/V6 unstuck/VtT unsubscriber/NgS unsubstantial/J unsubtle/J unsuitable/~J unsure/~J unsuspecting/~JY unsustainable/JY unsymmetrical/J untactful/J untagged/JVtT untagging/V6 untar/VbS untarred/VtT untarring/V6 untaxed/J unterminated/J unthinkably/R% unthinking/JYV unthoughtful/J untidy/J^>pV until/~PC untimely/~J^ untiring/JY untouchable/JNgS untoward/J untracked/J untraveled/J!@_₹ untrue/~J>^ untrusted/J untrustworthy/J untruth/NwgS untyped/J unusually/R unutterable/JN unutterably/R% unvaccinated/J unwarrantable/J unwary/J^ unwavering/J unwed/JNV unwelcome/~JVG unwell/J unwieldiness/Ng unwieldy/~J^>p unwinder/NSg unwise/J>Y^ unworried/J unworthy/~J^N unwound/V unwrapping/V6N unyielding/J up/~PJNSV up front/JR upbeat/~JNgS upbraid/VGdSN upbringing/~NgS upchuck/NSVGd upcoming/~JNV upcountry/JNg update/~NgSVGd> updation/NgS₹ updraft/~NgS updraught/NSg!_₹ upend/VSGd upfront/JNV upgradable/J upgrade/~NgSVGd upheaval/~NgS upheld/~V uphill/~JNgS uphold/~VG>SZ upholder/Ng upholster/VGdSNr upholsterer/NgS upholstery/~Ng upkeep/~NgV upland/~NgSJ uplift/~VdGSNgz uplink/NgSVdG upload/~VdGSN uploader/NgS upmarket/~JV upmost/J upon/~P upped/VtT upper/~JNSg uppercase/JNgSVdG upperclassman/Ng upperclassmen/9 upperclasswoman/N upperclasswomen/9 uppercut/NgSV uppercutting/V6 uppermost/~J upping/V6N uppish/J uppity/J upraise/VdSG uprate/VdSG uprear/VGSd upright/~JYpNgSV uprightness/Ng uprising/~NSgV upriver/~J uproar/~NSgV uproarious/JY uproot/VGdSN upsample/SGg upscale/~JVSdG upscaler/NgS upset/~JNSgV upsetting/~V6NJ upshot/NSg upside/~NSgP upsilon/~NgS upskill/VdSG upstage/NSJVGd upstairs/~JN upstanding/JV upstart/~NgSJVdG upstate/~NgJ upstream/~JVN upstroke/NSg upsurge/NgSVGd upswing/NgSV uptake/~NSgV uptempo/J upthrust/NSgVG uptick/NSg uptight/JN uptown/~NgJ uptrend/NV upturn/NSgVGd upvote/NgSVdG upward/~NSJY upwind/JV uracil/Ng uraemia/Ng!_₹ uraemic/J!_₹ uranium/~Nmg urban/~J urbane/J>Y^ urbanisation/Ng!_₹ urbanise/VdSG!_₹ urbanism/~Nmg urbanite/NgS urbanity/Ng urbanization/~Nwg urbanize/VdSG urbanologist/NgS urbanology/Ng urchin/NSg urea/~Ng uremia/Ng uremic/J ureter/NSg urethane/Ng urethra/Ng urethrae/9 urethral/J urge/~NgSVGd urgency/~Ng urgent/~JY uric/J urinal/NSgJ urinalyses/N urinalysis/Ng urinary/~JN urinate/VGdSn urination/Ng urine/~NmgV urn/~NSgV urogenital/J urological/J urologist/NgS urology/Nmg ursine/JN urticaria/Ng us/~Ia1o: # I~pronoun a~personal 1~person :~plural o~object usability/~Nmg usable/~JUr usage/~NwSg use/~NwSgVbdGrE use case/NgS used/~VtTJU useful/~JYp usefulness/~Nmg useless/~JYp uselessness/Nmg user/~NgS user-friendly/J userland/NgS username/~NgS usher/~NSgVdG usherette/NSg usu/~J usual/~JNU usually/R8 usual's usurer/NSg usurious/J usurp/VSd>GZ usurpation/Ng usurper/~NgS usury/~Nmg ute/NSg_ # Australian pickup truck utensil/NSg uteri/N9 uterine/~JN uterus/~N0g util/NgS utilisation/Ng!_₹ utilise/VGdSB!_₹ utilitarian/~JNgS utilitarianism/~Nmg utility/~NwSgJ utilization/~Ng utilize/~VGdSB utmost/~JNg utopia/~NSg utopian/~J utter/~JYVSdG utterance/~NSg uttermost/JNg uveitis/N uvula/NSg uvular/JNgS uxorious/J v/NSPr vac/NSV vacancy/~NwSg vacant/~JY vacate/~VdSG vacation/~NgSVGd>Z vacationer/Ng vacationist/NSg vaccinate/VGdSnX vaccination/~Ng vaccine/~JNwSgV vacillate/VGdSXn vacillation/Ng vacuity/Ng vacuole/NgS vacuous/JYp vacuousness/Ng vacuum/~NSgVGd vagabond/NSgVdGJ vagabondage/Ng vagarious/J vagary/NSg vagina/~NSg vaginae/9 vaginal/~JY vaginitis/N vagrancy/Ng vagrant/~NgSJ vague/~JY^>pNV vagueness/Ng vagus/N vain/~JY^>V vainglorious/JY vainglory/NgV val/~N valance/~NgS vale/~NgS valediction/NmgS valedictorian/NSg valedictory/JNSg valence/~NgS valency/NSg valentine/~NSg valet/~NSgVdG valetudinarian/JNgS valetudinarianism/Nmg valiance/Ng valiant/~JYN valid/~JY validate/~VGdSin validation/~NwSgi validations/N validator/NgS validity/~Ngi validness/Ng valine/NgS valise/NSg valley/~NSgV valor/~Nmg< valorous/JY valour/Nmg!@_₹ valuable/~JNgS valuate/VdSG valuation/~NgSer value/~NwSVGder value's valueless/J valuer/NSg valve/~NSgVdG valveless/J valvular/J vamoose/VdSG vamp/NgSVdGr vampire/~NSgV vampiric/J van/~NSgV vanadium/~Ng vandal/~NSg vandalise/VbdSG!_₹ vandalism/~Ng vandalization/Ng vandalize/VbdSG vane/~NgS vanguard/~NgS vanilla/~NSgJ vanish/~VdGSNz vanity/~NSg vanned/VtT vanning/V6N vanquish/VGd>SZ vanquisher/Ng vantage/~NSgV vape/NSVGd vapid/JYp vapidity/Nmg vapidness/Nmg vapor/~NwSgV vaporisation/Ng!_₹ vaporise/Vd>SGZ!_₹ vaporiser/NgS!_₹ vaporization/Nmg vaporize/Vd>SGZ vaporizer/NgS vaporous/J vaporware/Nmg< vapory/J< vapour/NmgSV!@_₹ vapoury/J!@_₹ vaquero/NgS var/~NS variability/~Nmgi variable/~JNSgi variably/Ryi variadic/JNgS variance/~NSg variant/~JNgS variate/NVnX variation/~NwgS varicolored/J< varicoloured/J!@_₹ varicose/J varied/~VtTJU variegate/VdSGJn variegation/Ng varietal/JNSg variety/~NwSg various/~JY varlet/NSg varmint/NgS varnish/NwgSVGd varnished/VtTJU varsity/~NSg vary/~VdGSN varying/~V6NU vascular/~J vascularize/VdSG vase/~NgSV vasectomy/NSg vasoconstriction/Nmg vasomotor/J vassal/~NSgJV vassalage/Ng vast/~J>Y^pNgS vastness/Ng vat/~NSgVJ vatted/VtT vatting/V6 vaudeville/~Ng vaudevillian/NgSJ vault/~NSgVd>GZ vaulter/Ng vaulting/NgVJ vaunt/VdGSNg vb/~N veal/NmgV vector/~NSgVGd vectorization/Nmg vectorize/VdSG> veejay/NSgV veep/NgS veer/~VdGSNg veg/JNmgV vegan/~JNSg veganism/Nmg vegeburger/NS veges/NV vegetable/~NSgJ vegetarian/~NSgJ vegetarianism/~Nmg vegetate/VGdSnv vegetation/~Nmg vegged/VtT vegges/Vh veggie/NSgJ veggieburger/NS vegging/V6 vehemence/Nmg vehemency/Nmg vehement/JY vehicle/~NgSV vehicular/~J veil/~NSVdGU veil's vein/~NgSVdG vela/~N velar/~JNSg veld/NgS vellum/Nmg velocipede/NgSV velocity/~NwSg velodrome/~NS velour/NgS velum/Nmg velvet/~NmgVJ velveteen/Nmg velvety/J venal/JY venality/Nmg venation/Ng vend/VdGSN vendetta/~NSg vendible/JN vendor/~NgSVdG veneer/NgSVdG venerability/Ng venerable/~J venerate/VdSGn veneration/~Ng venereal/J vengeance/~Ng vengeful/~JYr venial/J venireman/Ng veniremen/9 venison/Ng venom/~NgVJ venomous/~JY venous/~J vent/~NSVdG vent's ventilate/VGdSn ventilation/~Ng ventilator/NSg ventilatory/J ventral/~JN ventricle/~NSg ventricular/~J ventriloquism/Ng ventriloquist/NSg ventriloquy/Ng venture/~NSgVdG venturesome/JYp venturesomeness/Ng venturous/JYp venturousness/Ng venue/~NSgr veracious/JY veracity/~Nmg veranda/NSg!@<₹ verandah/NSg_ verapamil/N verb/~NgSVK verbal/~JYNgSV verbalisation/NwSg!_₹ verbalise/VGdS!_₹ verbalization/NwSg verbalize/VGdS verbatim/~JN verbena/NSg verbiage/NgS verbose/~JY verbosity/Nmg verboten/J verdant/JY verdict/~NSg verdigris/NgSVGd verdure/NmgV verge/~NSVdGW verge's verger/NgS verifiable/~JU verifiably/RyU verification/~NwgS verified/~VtTJNU verifier/NgS verify/~VdSGn verily/R # adverb of affirmation/certainty; modal adverb verisimilitude/Ng veritable/~J veritably/Ry verity/~NSg vermicelli/Nmg vermiculite/Ng vermiform/J vermilion/~NmgJV vermin/Nmg verminous/J vermouth/NwgS vernacular/~NwgSJ vernal/J vernier/NSg veronica/~NgV verruca/N0Sg verrucae/9 versa/~ versatile/~J versatility/~Nmg verse/~NgSVGdrWnX versed/~JVtTU versification/Nmg versifier/Ng versify/VGd>SZn version/~NgSVrWi versioned/JVtT versioning/~NmgV6 verso/~NSg versus/~PV vert/~NJVr vertebra/~N0g vertebrae/~N9 vertebral/~JN vertebrate/~JNgSi vertex/~N0gS vertical/~JYNgS vertices/~N9 vertiginous/J vertigo/~Nmg verve/~Ng very/~R%J>^ # very is an adverb of debree but not an adverb of manner vesicle/~NSg vesicular/J vesiculate/VJ vesiculopapular/J vesper/NgSJ vessel/~NgSV vest/~NSVdGiL vest's vestal/~JNgS vestibular/J vestibule/NgSV vestige/NSg vestigial/~JYN vesting/NgV vestment/NgSi vestry/~NSg vestryman/Ng vestrymen/9 vet/~NSgV vetch/NgS veteran/~NSgJ veterinarian/~NgSJ veterinary/~JNSg veto/~N0gVdG vetoes/N9V vetted/VtTJ vetting/~V6N vex/VGdSN vexation/NSg vexatious/JY vhf/~ vi/~N via/~NP viability/~Nmg viable/~JNU viably/Ry viaduct/~NSg vial/NgSV viand/NSg vibe/~NgSVdG vibe-code/VSdG # as used by Collins vibe coder/NgS # as used by Collins vibe coding/Nmg # as used by Collins and Merriam-Webster vibraharp/NSg vibrancy/Nmg vibrant/~JYN vibraphone/~NgS vibraphonist/NgS vibrate/VGdSNnX vibration/~Ng vibrational/J vibrato/~NgS vibrator/NSg vibratory/J viburnum/NSg vicar/~NSg vicarage/~NSg vicarious/JYp vicariousness/Ng vice/~NgSVJP(e viced/JVtT vicegerent/NSgJ vicennial/JN viceregal/~JN viceroy/~NgS vichyssoise/Ng vicing/V6 vicinity/~Ng vicious/~JYp viciousness/Ng vicissitude/NSg victim/~NgSV victimisation/Nmg!_₹ victimise/VGdS!_₹ victimization/Nmg victimize/VGdS victimless/J victor/~NgS victorious/~JY victory/~NwSgV victual/NSgVdG victualled/VtT!@_₹ victualling/V6N!@_₹ vicuña/NgS vicuna/NgS videlicet/ video/~NwSgVGd video game/NgS videocassette/NSg videoconferencing/VNmg videodisc/NgS videophone/NgS videotape/~NwSgVdG videotex/Nmg vie/~VdSN view/~NgSVd>GrZ viewable/J viewer/~NgSr viewership/~Nmg viewfinder/~NSg viewing/~V6SNwgJ viewpoint/~NgS viewport/NSgV vigesimal/JN vigil/~NSgV vigilance/~Ng vigilant/~JY vigilante/~NSg vigilantism/Ng vigilantist/Jg vignette/~NSgVdG vignettist/NgS vigor/~Ng vigorous/~JY vigour/Ng!@_₹ vii/~N viii/~ viking/~NgS vile/~JY^>p vileness/Ng vilification/Ng vilify/VdSGn villa/~NSg village/~NSg>Z villager/Ng villain/~NSgV villainize/VGdS villainous/~J villainy/NSgJ villein/NSg villeinage/Ng villi/N villus/Ng vim/Ng vinaigrette/Ng vincible/Ji vindicate/VdSGXn vindication/Ng vindicator/NgS vindictive/JYp vindictiveness/Ng vine/~NgS vinegar/~NgV vinegary/J vineyard/~NgS vino/Ng vinous/J vintage/~NgSJV vintner/NgS vinyl/~NSgJ viol/~NgSVB viola/~NSg violable/Ji violate/~VGdSnX violation/~Ng violative/J violator/NSg violence/~NmgV violent/~JYVN violet/~NgSJ violin/~NgSV violincello/NS violinist/~NSg violist/NgS violoncellist/NSg violoncello/NgS viper/~NSg viperous/J virago/N0g viragoes/N9 viral/~JN vireo/~NSg virgin/~NgSJ virginal/JNSg virginity/~Ng virgule/NgS virile/J virility/Nmg virologist/NSg virology/~Ng virtual/~JYN virtualisation/NwSg!_₹ virtualise/VdSG!_₹ virtualization/~NwSg virtualize/VdSG virtue/~NSg virtuosity/Ng virtuoso/~NgJ virtuous/~JYp virtuousness/Ng virulence/~Ng virulent/~JY virus/~NgSV vis-à-vis/P visa/~NgSVdG visage/NgS viscera/N visceral/~JY viscid/J viscose/Ng viscosity/~Ng viscount/~NSg viscountcy/NSg viscountess/NgS viscous/~J viscus/Ng vise/NgSVGdre visibility/~Nmgi visible/~Ji visibly/~Ryi vision/~NwSgVGdK visionary/~JNSg visit/~VGdSNr visit's visitant/NgSJ visitation/~NgS visitor/~NgS visor/NSgV vista/~NSgV visual/~JYNSg visualisation/NSg!_₹ visualise/Vd>SGZ!_₹ visualiser/Ng!_₹ visualization/~NSg visualize/~Vd>SGZ visualizer/Ng vita/~Ng vitae/~9 vital/~JYS vitalisation/Ngr!_₹ vitalise/VGSder!_₹ vitality/~Nmg vitalization/Ngr vitalize/VGSder vitals/Ng vitamin/~NgSV vitiate/VGdSn vitiation/Ng viticulture/~Nmg viticulturist/NgS vitreous/JN vitrifaction/Nmg vitrification/Nmg vitrify/VGdSn vitrine/NSg vitriol/NgV vitriolic/JQ vittles/NgV vituperate/VGdSJnv vituperation/Ng viva/~VSNg vivace/JN vivacious/JYp vivaciousness/Ng vivacity/Ng vivaria/N9 vivarium/N0Sg vivid/~J>Y^pN vividness/Ng vivify/VdSGr viviparous/J vivisect/VdGS vivisection/Nmg vivisectional/J vivisectionist/NSg vixen/~NSg vixenish/JY viz/~JVN vizier/~NSg vlf vlog/NSgVbn vlogged/VtT vlogger/NgS vlogging/V6Nmg vocab/N vocable/NgSJ vocabulary/~NSg vocal/~JYNSg vocalic/J vocalisation/NSg!_₹ vocalise/VdGSN!_₹ vocalist/~NSg vocalization/NgS vocalize/VdSG vocation/~NSgWiKr vocational/~JY vocative/JNgS vociferate/VdSGn vociferation/Ng vociferous/JYp vociferousness/Ng vocoder/NgS vodka/~NwSg vogue/~NSgV voguish/J voice/~NSgVdGi voice-over/NgS voiced/~VtTJU voiceless/~JYp voicelessness/Ng voicemail/~NSgV void/~JNgSVdGB voilà voila/ voile/Ng vol/~NS volatile/~JN volatilise/VdSG!_₹ volatility/~Ng volatilize/VdSG volcanic/~JN volcanism/~Nmg volcano/~N0gV volcanoes/~N9 vole/~NgSV volition/~Nmg volitional/JN volley/~NSgVGd volleyball/~NgS volt/~NgSr voltage/~NgS voltaic/J voltmeter/NSg volubility/Ng voluble/J volubly/Ry volume/~NwSgV volumetric/J voluminous/JYp voluminousness/Ng voluntarily/~Ryi voluntarism/Ng voluntary/~JNSg volunteer/~NSgVGd volunteerism/Ng voluptuary/NSgJ voluptuous/JYp voluptuousness/Ng volute/NSgJ vomit/VdGSNmg von Neumann/O voodoo/~NSgVGd voodooism/Ng voracious/JYp voraciousness/Ng voracity/Ng vortex/~NgSV vortices/9 votary/JNSg vote/~NSVGdv vote's voter/~NSg vouch/Vd>GSNZ voucher/NgV vouchsafe/VdSG vow/~NSgVGd vowel/~NSgV voxel/NSg voyage/~NgSVGd>Z voyager/~Ng voyageur/NSg voyeur/NgS voyeurism/Ng voyeuristic/J vs./~ # versus vtable/NgS vulcanisation/Ng!_₹ vulcanise/VGdS!_₹ vulcanization/Nmg vulcanize/VGdS vulgar/~J>Y^N vulgarian/NgSJ vulgarisation/Ng!_₹ vulgarise/VGd>SZ!_₹ vulgariser/Ng!_₹ vulgarism/NgS vulgarity/NSg vulgarization/Ng vulgarize/VGd>SZ vulgarizer/Ng vulnerabilities/~N9 vulnerability/~N0wgi vulnerable/~Ji vulnerably/Ryi vulpine/JN vulture/~NSgVJ vulturous/J vulva/Ng vulvae/9 vuvuzela/NgS vying/V6N wabbit/JNS wack/J>^NgS wackiness/Ng wacko/JNSg wacky/~J>^pN wad/NSgVGd>Z wadded/VtT wadding/~NgV6 waddle/NSgVdG wade/~VSNg wader/Ng waders/Ng wadge/NS wadi/~NgS wafer/~NSgV waffle/NgSVGd>Z waffler/Ng waft/VdGSNg wag/~VGd>SNgZ wage/~NgSV waged/~VtTU wager/~NgVGd>Z wagerer/Ng wagged/VtT waggery/NSg wagging/V6N waggish/JYp waggishness/Nmg waggle/VGdSNg wagon/~NSgV>Z wagoner/Ng wagtail/~NSg waif/NgSV wail/Vd>GSNgZ wailer/Ng wailing/NgV wain/NgSV wainscot/NSgVdGz wainscoting/NmgV6 wainscotted/JVtT@ wainscotting/NgSV6@ wainwright/~NgS waist/~NSg waistband/NgS waistcoat/NgS waistline/NgS wait/~VdGSNg waiter/~NgV waiting/~V6Ng waitperson/N0gS waitress/~NgSV waitstaff/Nmg waivable/J waive/~Vd>GSNZ waiver/~NgV wake/~VGdSNgz wakeful/JYp wakefulness/Ng waken/VGSd wakeup/NgS waldo/~N0S waldoes/N9 wale/NgSVGd walk/~Vbd>GSNgZ walk out/V/ walk through/V walk-through/J walkable/J walkabout/~NS walkaway/NgS walker/~Ng walkie-talkie/NgS walkies/N walking/~VJNg walkout/NSgV walkover/NgS walkthrough/N0g walkthroughs/N9 walkway/~NSg wall/~NgSVdG wallaby/~NSg wallah/N wallahs/N wallboard/Ng wallet/~NgS walleye/NSgd wallflower/NgSV wallop/NgSVdGz walloping/JNgV wallow/VdGSNgJ wallowy/J wallpaper/~NwSgVdG wally/~NSJV walnut/~NwgSJ walrus/~NgSV waltz/~NgSVGd>Z waltzer/NgS wampum/Ng wan/~JYpNVGd wand/~NgSV wander/~Vd>GSNzZ wanderer/~NgS wanderings/NSg wanderlust/NSgV wane/~NgSV wangle/VGd>SNgZ wangler/Ng wank/Vd>GSNZx wanky/Jx wanna/~ wannabe/NSg wannabee/NS wanner/Jc wanness/Ng wannest/Ju want/~VdGSNg wanted/~JVtTU wanton/~JYpNgSVdG wantonness/Nmg wapiti/NgS war/~NwSgV war game/NgS warble/VGd>SNgZ warbler/~NgS warbonnet/NSg warcraft/Nmg ward/~NgSVdGr warden/~NgSV warder/NgS wardress/NgS wardrobe/~NSgV wardroom/NSg ware/~JNwgSV warehouse/~NSgVdG warez/NV warfare/~NmgV warfarin/Nmg warhead/~NgS warhorse/NSg warily/RyU wariness/NgU warlike/~J warlock/~NgS warlord/~NgS warm/~JY^>pVdGSNHZ warm up/V/ warm-up/NgS warmblooded/J warmer/~JNg warmhearted/Jp warmheartedness/Ng warmish/J warmness/Nmg warmonger/NSgVG warmongering/VNg warmth/~Nmg warn/~VdGSz warning/~V6SNwg warp/~NgSVdG warpage/Nmg warpaint/N warpath/N0g warpaths/N9 warplane/NgS warrant/~NgSVGd warranted/~VJU warranty/NSgVdG warred/VtT warren/~NgS warring/~JNV6 warrior/~NSg warship/~NSg wart/NgS warthog/NSg wartime/~Ng warty/J^> wary/~J^>pVU was/~Vlt wasabi/Nmg wash/~Vd>GSNgBzZ wash out/V/ washable/JNSg washbasin/NSg washboard/NSgV washbowl/NSg washcloth/N0g washcloths/N9 washed/~VtTJU washer/~NgSV washerwoman/N0g washerwomen/N9 washing/~NgV6 washout/NgS washrag/NgS washroom/NgS washstand/NSg washtub/NgS washy/J^>N wasn't/~Vt wasp/~NgSV waspish/JYp waspishness/Ng wassail/NSgVdG wast/VN wastage/Ng waste/~NSgJ>VdGZ wastebasket/NgSV wasteful/~JYp wastefulness/Nmg wastegate/NgS wasteland/~NwSg wasteman/N0g wastemen/N9 wastepaper/Nmg waster/NgS wastewater/~N wastrel/NSg wat/~NSg watch/~NgSVGd>BZr watchable/JNU watchband/NgS watchdog/~NSgV watcher/~NgS watchful/JYp watchfulness/Ng watchmaker/NgS watchmaking/Nmg watchman/~N0g watchmen/~N9 watchstrap/NgS watchtower/~NSg watchword/NgS water/~NwSgVGd> waterbed/NgS waterbird/NSg waterboard/NgSVdGz waterboarding/NgV6 waterborne/J watercolor/NgSJ watercolour/NgSJV!@_₹ watercourse/~NSg watercraft/~Ng09S # singular and plural, also has a plural in -s watercress/Ng waterfall/~NSgV waterfowl/~NSg waterfront/~NgS waterhole/NSg wateriness/Ng waterlily/NSg waterline/NgS waterlogged/JV watermark/NgSVdG watermelon/~NwSg watermill/~NgS waterproof/~JVdGSNg waterproofing/VNg waters/~NgV watershed/~NgSJ waterside/NgSJ waterspout/NSg watertight/J waterway/~NgS waterwheel/~NSg waterworks/~Ng watery/~J^>p watt/~NgS wattage/Ng wattle/~NgSVGd wave/~VGd>SNgZ waveband/NS waveform/~N wavefront/NSg wavelength/~Ng wavelengths/~N wavelet/NSg wavelike/J wavenumber/NgS waver/VGd>NgZ waverer/Ng wavering/JYNV wavetable/NgS waviness/Ng wavy/~J>^pN wax/~NwgSJVGdn waxiness/Nmg waxwing/NSg waxwork/NwSg waxy/J>^pN way/~NSgJ waybill/NSgV wayfarer/NgS wayfaring/JNSgV waylaid/V waylay/V>SGZ waylayer/Ng waypoint/NgS wayside/NSgJ wayward/~JYp waywardness/Nmg wazoo/NSg we/~Ia1s: # I~pronoun a~personal 1~person :~plural s~subject we'd/ we'll/ we're/~ we've/ weak/~J>Y^pnX weaken/~Vd>GZ weakener/Ng weakfish/N09gS # singular and plural, also has a plural in -s weakish/J weakling/NSgJ weakness/~NwgS weal/NgSVH wealth/~Nwg wealthiness/Ng wealthy/~J^>pN wean/VdGSN weapon/~NgSV weaponization/Nmg weaponize/VGdS weaponless/J weaponry/~Nmg weapons-grade/J wear/~V>GSNgBzZ wearable/JNgSU wearer/~NgS wearied/VU wearily/Ry weariness/Nmg wearisome/JY weary/~J^>pVGdS weasel/~NgSVdGY weaselled/VtT!_₹ weaselling/V6!_₹ weather/~NmSgJVdG weather-beaten/J weatherboard/~NSVG weathercock/NgSV weathering/~NgV weatherise/VdSG!_₹ weatherization/Ng weatherize/VdSG weatherman/N0g weathermen/N9 weatherperson/N0gS weatherproof/JVGSd weatherstrip/NSV weatherstripped/VtT weatherstripping/NgV6 weave/~Vbd>GSNgZ weaver/~Ng weaving/~NgV6 web/~NOSgV web API/NgS web app/NgS web dev/NgS web page/~NSg web server/NgS webbed/~JVtT webbing/~NgV6 webcam/~NgSV webcast/NSgVG webfeet/9 webfoot/Ng webhook/NgS webinar/NSg webisode/NgS weblog/NgS webmaster/NSg webmistress/NgS website/~NSg webstore/NgS wed/~VSr wedded/JVtTr wedder/N wedding/~V6SNg wedge/~NSgVdG wedgie/NgSV wedlock/~Nmg wee/~J^>NSgVI weed/~NwgSVd>GZ weeder/Ng weedkiller/NwgS weedless/J weedy/J^> weeing/V6 week/~NgSY weekday/~NSg weekend/~NSgVGd>JZ weekly/~JNSg weeknight/~NSg ween/NSVdG weenie/NgS^> weensy/J>^ weeny/JN weep/~V>GSNgzZ weeper/Ng weepie/N weepy/J^>NSg weevil/~NgS weft/NgS weigh/~VGdNr weigh's weighbridge/NS weighs/~Vr weight/~NwgSVdGz weighted/~VtTJU weightily/Ry weightiness/Ng weightless/JYp weightlessness/Ng weightlifter/~NgS weightlifting/~Ng weighty/J^>p weir/~NgS weird/~J^Y>pNV weirdie/NgS weirdness/Nmg weirdo/NgS welch plug/NSg welcome/~JNgSVGd weld/~NgSVd>GBZ welder/Ng welfare/~NmgV welkin/Ng well/~JpNgSVdGRy well-adjusted/J well-balanced/J well-being/Nmg well-established/J well-known/J well-made/J well-received/J well-respected/J well-timed/J well-trodden/J well-used/J wellhead/NSg wellie/N wellington/~NgS wellness/~Nmg wellspring/NgS welly/NS welsh/~VGd>SZ welsher/Ng welt/~Vd>GSNgZ welter/NgVGdJ welterweight/~JNSg wen/~NgCI wench/NgSV wend/VdGSN went/~VtN wept/V were/~VltN weren't/Vt werewolf/~N0g werewolves/N9 west/~NgJV westbound/~J westerly/~JNSg western/~J>NSgZ westerner/Ng westernisation/Ng!_₹ westernise/VGdS!_₹ westernism/Nmg westernization/Ng westernize/VGdS westernmost/~J westward/~JNS wet/~JYpNSgVtT wetback/NSg wetland/~NSg wetness/Nmg wetter/~JcNSg wettest/~JuV wetting/V6NJ wetware/Nmg whack/NSgVGd>JzZ whacker/Ng whale/~NSgVd>GZ whaleboat/NgS whalebone/Ng whaler/Ng whaling/~NgV wham/~NgSV whammed/VtT whamming/V6 whammy/NSg wharf/~NgV wharves/~N what/~INS what'll/ what's/ whataboutism/Ng whatchamacallit/NgS whatever/~IJNg whatnot/NgS whatshername/I whatshisname/N whatsit/NS whatsoever/~I wheal/NSgV wheat/~NgJn wheatgerm/N wheatmeal/N whee/V wheedle/Vd>GSNZ wheedler/Ng wheel/~NSgVdG wheelbarrow/NSgV wheelbase/~NSg wheelchair/~NSg wheeler/NgS wheelhouse/NgS wheelie/NSgVJ wheelwright/NgS wheeze/VdGSNg wheezily/Ry wheeziness/Ng wheezy/J>^p whelk/NSgd whelm/VdGSN whelp/NSgVdG when/~CINgS whence/~C whenever/~C whensoever/ where/~CNSgR where'd/ whereabouts/~Ng whereas/~CN whereat/C whereby/~ wherefore/CNgS wherein/~C whereof/C whereon/ wheresoever/C whereto/ whereupon/~C wherever/~C wherewith/N wherewithal/Ng wherry/NSgV whet/VSN whether/~CI whetstone/NSgV whetted/JVtT whetting/V6N whew/V whey/Ng which/~CI whichever/~I whiff/NSgVdGJ whiffletree/NgS while/~NSgCPVdG whilom/JC whilst/~C whim/~NgSV whimper/NgSVdG whimsical/~JY whimsicality/Nmg whimsy/NSgVJ whine/NSgVd>GZ whiner/Ng whinge/Vd>GSNZ!_₹ whingeing/VN!_₹ whinny/NSgVGd whiny/J>^ whip/~NgSV whipcord/Ng whiplash/~NgSV whipped/~JVtT whipper/NgS whippersnapper/NgS whippet/NgS whipping/~NSgV6 whippletree/NSg whippoorwill/NgS whipsaw/NgSVdGJ whir/NgSV whirl/VdGSNg whirligig/NgS whirlpool/~NgSV whirlwind/~NgSJ whirlybird/NSg whirr/VdGSNg!_₹ whirred/VtT whirring/NV6J whisk/NSgVd>GZ whisker/NgSd whiskery/JN whiskey/~NwgS whisky/N0wSg!@_₹ whiskys/N9g whisper/~NgSVd>GZ whisperer/NgS whispering/NwgS whist/NgVJ whistle/~NgSVGd>Z whistleblower/~NgS whistler/~Ng whit/~NgSPd>^GnXz white/~JpNwSgV white out/V/ white paper/NgS whitebait/NV whiteboard/NSV whitecap/NSg whitefish/~N09gSV # singular and plural, also has a plural in -s whitehead/~NgS whitelist/NSVGd whiten/VGd>Zz whitener/Ng whiteness/Nmg whitening/VNg whiteout/NSg whitetail/NgS whitewall/JNSg whitewash/~NgSVdG whitewater/~Ng whitey/~JNSg whither/NV whiting/~N09wgSV whitish/~J whittle/~NSVGd>Z whittler/Ng whiz/VNgP whizkid/Ng whizz/NgSVdG!_₹ whizzbang/NgS whizzed/VtT whizzes/NVh whizzing/V6NJ who/~Ig who'd/ who'll/ who're/ who've/ whoa/V whodunit/NgS whoever/~I whoever's whole/~JpNSg wholefood/NS wholegrain/Nm wholehearted/JYp wholeheartedness/Nmg wholemeal/JNm wholeness/Nmg wholesale/~NgSJ>VGdZ wholesaler/~NSg wholesome/~JpU wholesomely/Ry wholesomeness/NmgU wholewheat/J wholly/~Ry whom/~I whomever/I whomsoever/I whoop/NSgVd>GZ whoopee/VS whooper/Ng whoopsie/NgS whoosh/NgSVdG whop/VSN whopped/VtT whopper/NSg whopping/JV6N whore/~NSgVGx whorehouse/NgS whoreish/J whorish/J whorl/NSgVd whose/~I whoso/I whosoever/I whup/VS whupped/VtT whupping/V6N why/~NgV why'd/ whys/N wick/~NgSVd>JZ wicked/~J^Y>pV wickedness/~Nmg wicker/~NgJ wickerwork/Nmg wicket/~NSg wide/~JY^>pN widebody/NgS widemouthed/J widen/~VSd>GZ widener/NSg wideness/Nmg widescale/J widescreen/~NgSJ widespread/~J widget/NS widow/~NSgVd>GZ widower/~Ng widowhood/~Nmg width/~Nwg widths/~N wield/~Vd>GSNZ wielder/Ng wiener/~NSg wienie/NSg wife/~NgVY wifeless/J wig/~NSgV wigeon/Ng wigged/VtTJ wigging/V6N wiggle/~Vd>GSNgZ wiggler/Ng wiggly/J^> wight/~NSgJ wiglet/NSg wigwag/NSgVb wigwagged/VtT wigwagging/V6 wigwam/NSgV wiki/~NgSV wild/~JY^>pNgSV wildcard/~NgSV wildcat/~NgSJV wildcatted/VtT wildcatter/NgS wildcatting/V6 wildebeest/NgS wilderness/~NgS wildfire/~NgS wildflower/NSg wildfowl/~NgV wildlife/~Nmg wildness/Ng wilds/~NgV wile/~NgSVGd wilful/JYp!@_₹ wilfulness/Ng!@_₹ wiliness/Ng will/~NgSAd willful/JYp willfulness/Ng willies/Ng willing/~JYpNV6U willingness/~NgU williwaw/NgS willow/~NwSgV willowy/J willpower/Ng willy/~JNSV wilt/~VdGSNg wily/J>^p wimp/NgSVdGJ wimpish/J wimple/NSgVdG wimpy/J>^ win/~VbGdSNg win-win/NJ wince/NSgVdG winch/~NgSVdG wind/~NwSVGUr wind's windage/Ng windbag/NSgV windblown/J windbreak/NSg>Z windbreaker/Ng windburn/Ngd windcheater/NS windchill/Ng winded/VtTJ winder/~NSgV windfall/NgS windflower/NgS windily/Ry windiness/Nmg winding's windjammer/NSg windlass/NgSV windless/JN windmill/~NgSVdG window/~NSgVdG windowless/J windowpane/NSg windowsill/NSg windpipe/NgS windproof/JV windrow/NSgV windscreen/~NSgV windshield/~NSgV windsock/NgS windstorm/NgS windsurf/VGd>SNZ windsurfer/Ng windsurfing/~NgV windswept/J windup/NSgJ windward/~JNg windy/~J>^pN wine/~NwgSV wineglass/NgS winegrower/NgS winemaker/NgS winery/~NSg wing/~NgSVd>GZ wingding/NgS wingless/J winglike/J wingman/Ng wingmen/9 wingnut/NSg wingspan/~NgS wingspread/NSg wingtip/NSg wink/~Vd>GSNgZ winker/~NgS winkle/~NSgVdG winnable/JU winner/~NSg winning/~V6SJYNg winnow/VGd>SNZ winnower/NgS wino/NgS winsome/JY^>p winsomeness/Ng winter/~NwSgVGd wintergreen/Ng winterise/VGdS!_₹ winterize/VGdS wintertime/Nmg wintry/J^> winy/J>^ wipe/~VGd>SNgZ wipe out/V/ wipeout/NgS wiper/Ng wire/~NwSVGdr wire's wired/~JVtT wirehair/NgS wireless/~JYNgSV wiretap/NgSV wiretapped/VtTJ wiretapper/NSg wiretapping/NgV6 wiriness/Nmg wiring/~VNg wiry/J>^p wisdom/~Nmg wise/~JY^>VGdSNg wiseacre/NSgV wisecrack/NgSVdG wiseguy/NS wish/~NgSVd>GZ wishbone/~NSgV wisher/Ng wishful/JY wishlist's wishy-washy/J wisp/NgSV wispy/J>^ wist/V wisteria/NSg wistful/JYp wistfulness/Nmg wit/~Nw☁SgVP witch/~NgSVdG witchcraft/~Nmg witchery/Nmg with/~P withal/P withdraw/~VGSN withdrawal/~NwgS withdrawn/~JV withdrew/~V withe/NSgVd>GZ wither/VGdNz withering/JYV6N withers/~NgVh withheld/~VtTJ withhold/~VbGSN withholding/~V6SNg within/~PJg without/~PC withstand/~VbGS withstood/~VtT witless/JYp witlessness/Ng witness/~NgSVdG wits/~Ng witted/~JVtT witter/VSGdJ witticism/NSg wittily/Ry wittiness/Ng witting/NJYV6U witty/~J>^p wive/VGdS wiz/~NVP wizard/~NSgJYV wizardry/~Nmg wizened/VJ wk/NY woad/NgV wobble/NgSVGd> wobbliness/Ng wobbly/J>^pN wodge/NS woe/~NSgJ woebegone/J woeful/JYp woefuller/Jc woefullest/Ju woefulness/Nmg wog/NSV wok/NSgVn woke/~JpNV wold/NgSJ wolf/~NgSVdG wolfhound/NSg wolfish/J wolfram/~Ng wolverine/~NSg wolves/~N9V woman/~N0gV womanhood/Nmg womanise/Vd>SGZ!_₹ womaniser/NgS!_₹ womanish/JV womanize/Vd>SGZ womanizer/NgS womankind/Nmg womanlike/Jg womanliness/Ng womanly/J>^p womb/~NgSV wombat/NgS womble/NSV women/~N9g womenfolk/N9Sg womenfolks/9g won/~VtTNg09 # singular and plural won't/VA wonder/~NwgSVdGL wonderful/~JYp wonderfulness/Nmg wondering/~VNJY wonderland/~NgS wonderment/Nmg wondrous/JY wonk/NgS wonky/J^>N wont/NgJVd wonted/JU woo/~VGd>SJNZ wood/~NwgSVdGJn woodbine/~Ng woodblock/NgS woodcarver/NgS woodcarving/NSg woodchuck/NgS woodcock/~NSg woodcraft/NwgV woodcut/~NSg woodcutter/NSg woodcutting/Nwg wooden/~J>Y^p woodenness/Nmg woodiness/Nmg woodland/~JNSg woodlice/N9 woodlot/NSg woodlouse/N0 woodman/~N0g woodmen/N9 woodpecker/~NgS woodpile/NSg woods/~NgV woodshed/NSgV woodsiness/Ng woodsman/N0g woodsmen/N9 woodsy/J>^p woodwind/NgS woodwork/~NgV>GZ woodworker/Ng woodworking/~NgV woodworm/NS woody/~J^>pNSg wooer/Ng woof/NgSVd>GZ woofer/Ng woohoo wool/~NwgnX woolen/~JNg woolgathering/Nmg wooliness/Nmg woollen/JNSg!@_₹ woolliness/Nmg woolly/~J>^pNSg woozily/Ry wooziness/Nmg woozy/J^>p wop/~NSV!_₹ word/~NSVdGr word's wordage/Nmg wordbook/NSg wordily/Ry wordiness/Nmg wording/~NwSgV6 wordless/JY wordlist/NgS wordplay/Nmg wordsmith/N0Vb wordsmiths/N9Vh wordy/J^>p wore/~Vt work/~NwSVdGrz work around/V/ work out/V/ work's workable/~JU workaday/JN workaholic/NSgJ workaround/NS workbasket/NS workbench/NgS workbook/NgS workday/NSgJ worker/~NgS workfare/Nmg workflow/NgS workforce/~NgS workgroup/NSg workhorse/NSg workhouse/~NSgV working-class/NgSJ working's workingman/N0g workingmen/N9 workings/~N9g workingwoman/N0g workingwomen/N9 workload/~NgS workman/~N0g workmanlike/J workmanship/Nmg workmate/NgS workmen/~N9 workout/~NSg workplace/~NgS workroom/NgS works/~NgV worksheet/NgSV workshop/~NgSV workshopper/NgS workshy/J worksite/NS workspace/NgS workstation/~NgS worktable/NgS worktop/NS workup/NgS workweek/NSg world/~NSgV world-class/J worldlier/Jc worldliness/NmgU worldly/~J^pU worldview/~NSg worldwide/~J worm/~NgSVdG wormhole/~NgSV wormwood/Nmg wormy/J^> worn/~JVTU worried/~JYVtT worrier/Ng worriment/Ng worrisome/J worry/~VGd>SNw☁gZz worrying/~JYV6N worrywart/NSg worse/~JcNgV worsen/~VdSG worship/~NSgVGd>Z worshiper/Ng worshipful/~JN worshipped/VtT!@_₹ worshipper/NgS!@_₹ worshipping/V6N!@_₹ worst/~JuVGd # removed noun sense worsted/NgVJ wort/~Ng worth/~JNgV worthies/N worthily/RyU worthiness/NmgU worthless/~JYp worthlessness/Nmg worthwhile/~J worthy/~J^>pNVU worthy's wot/VI wotcha/ would/~A # removed `NS` noun and plural seem very marginal would-be/J would've/ wouldn't/A wouldst/V wound/~NSgVtTGd> wove/VtJr woven/~JNVTrU wow/~VGdSNg wpm/N wrack/NSgVGd wraith/N0g wraiths/N9 wrangle/Vd>GSNgZz wrangler/~NgS wrap/~VSNwUr wrap's wraparound/JNSg wrapped/~VtTJU wrapper/~NSg wrapping/~NwgSV6 wrasse/NgS wrath/~NmgVJ wrathful/JY wreak/VGdSN wreath/~N0gSVdG wreathe/V wreaths/N9V wreck/~NSgVGd>Z wreckage/~Nmg wrecker/Ng wren/~NgS wrench/~NgSVdG wrest/~VGdSNg wrestle/~NgSVGd>Z wrestler/~Ng wrestling/~V6Nmg wretch/NgSV wretched/~J^>Yp wretchedness/Nmg wriggle/VGd>SNgZ wriggler/NgS wriggly/J wright/~NgSV wring/V6G>SNgZ wringer/Ng wrinkle/NgSVGd wrinkled/~JVtTU wrinkly/J^>NSg wrist/~NSgV wristband/NgS wristwatch/NgS writ/~NgSV>GBzZ write/~VSN write off/V write-off/NgS write-up/NgS writer/~NSg writhe/VGdSNg writing/~NgSV6 written/~JVTrU wrong/~J^Y>pNSgVGdRy wrongdoer/NSg wrongdoing/~NSgV wrongful/~JYp wrongfulness/Nmg wrongheaded/JYp wrongheadedness/Ng wrongness/Ng wrote/~Vtr wroth/J wrought/~JV wrung/V wry/~JYVN wryer/Jc wryest/Ju wryness/Nmg wt/PI wunderkind/NS wurst/NSg wuss/NgSV wussy/J>^NSg x/~ # removed `5` and `7` adjective and `conjunction` x-axis/Ng x64/Ng x86/~Ng xci xcii xciv xcix xcvi xcvii xenohormesis/Nmg xenomorph/NgS xenon/~Nmg xenophobe/NgS xenophobia/Ng xenophobic/~JN xerographic/J xerography/Nmg xerox/~NgSVdG xi/~NSg xii/~ xiii/~ xiv/~ xix/~ xor/~NC xref/S xterm/g xv/~ xvi/~ xvii/~ xviii/~ xx/~ xxi/~ xxii/~ xxiii/~ xxiv/~ xxix xxv/~ xxvi/~ xxvii xxviii/~ xxx/~N xxxi/~ xxxii xxxiii xxxiv xxxix xxxv xxxvi xxxvii xxxviii xylem/Ng xylene/N xylophone/NSgV xylophonist/NgS y y-axis/Ng y'all/IV ya/~IN yacht/~NSgVdG yachting/~V6Ng yachtsman/Ng yachtsmen/9 yachtswoman/Ng yachtswomen/9 yahoo/~NSgV yak/~NSgV yakked/VtT yakking/V6 yakuza/NgS09 # singular and plural, also has a plural in -s yam/~NSgV yammer/VGd>SNgZ yammerer/NgS yang/~NgV yank/~NgSVdG yap/~NSgV yapped/VtTJ yapping/V6N yard/~NgSV yardage/~NgS yardarm/NgS yardman/Ng yardmaster/NgS yardmen/9 yardstick/NgS yarmulke/NSg yarn/~NgSV yarrow/~Ng yashmak/NS yaw/~NSgVGd yawl/NgSV yawn/Vd>GSNgZ yawner/Ng yaws/NgV yay yd/~N ye/~IDNS>^ yea/~CNSg yeah/~Ng yeahs/N year/~NgS year-over-year/J yearbook/~NgS yearling/NgS yearlong/J yearly/~JRySg yearn/VGdSNz yearning/NgV yeast/~NSgV yeasty/J>^ yegg/NgSV yell/~VdGSNgJ yellow/~J^>pNgSVdG yellowhammer/NS yellowish/~J yellowness/Ng yellowy/J yelp/NgSVdG yen/~NSg09V # singular and plural, currency plural is yen, desire plural is yens yeoman/~Ng yeomanry/~Ng yeomen/~9 yep/NSg yes/~NgSVb yeshiva/~NSg yessed/VtT yessing/V6 yesterday/~NgS yesteryear/Ng yet/~CVN yeti/NgS yew/~NSgJI yid/NS yield/~VGdSNgz yikes/ yin/~Ng yip/~NSgV yipe/ yipped/VtT yippee/ yipping/V6N yo/~INV yob/NS yobbo/NS yodel/Vd>GSNgZ yodeler/Ng yodelled/VtT!@_₹ yodeller/NgS!@_₹ yodelling/V6N!@_₹ yoga/~Ng yoghurt/NwgS!_₹ yogi/~NgSV yogic/J yogourt/NwgS@ yogurt/~NwSg yoke/~NSVGdU yoke's yokel/NSg yolk/NwgSVd yon/~I yonder/~JN yonks/N yore/Ng you/~Ia2so.: # I~pronoun a~personal 2~person :~plural s:~subject o~object you'd/ you'll/ you're/~ you've/ young/~J^>NgV youngish/J youngster/~NgS your/~D5 yours/~I yourself/~Ia2F. # I~pronoun a~personal 2~person F~reflexive yourselves/~Ia2F: # I~pronoun a~personal 2~person :~plural F~reflexive youth/~Ng youthful/~JYp youthfulness/Ng youths/~9 yow/N yowie/NgS # Australian mythological creature yowl/NgSVdG yr/~NS ytterbium/Nmg yttrium/Nmg yuan/~Ng09S # singular and plural, also has a plural in -s yucca/~NwSg yuck/NV yucky/J^> yuk/~NSgV yukked/VtT yukking/V6 yukky/J yule/~Ng yuletide/Ng yum/JO yummy/J^>N yup/NSg yuppie/NgS yuppify/VGdS yurt/NgS z/d^GnXz z-axis/Ng zaniness/Nmg zany/J^>pNSgV zap/~NSgV zapped/VtT zapper/NgS zapping/V6N zappy/J zeal/~Nmg zealot/NgS zealotry/Nmg zealous/~JYp zealousness/Nmg zebra/~NSg zebu/NgS zed/~NSgV zeitgeist/~NSg zenith/~N0g zeniths/N9 zenned zeolite/NS zephyr/~NgSV zeppelin/~NgS zero/~N0gSJVdGH zeroes/N9Vh zest/~NwgSV zestful/JYp zestfulness/Ng zesty/J>^ zeta/~NgS zigzag/NSgJV zigzagged/VtT zigzagging/V6JN zilch/NgJV zillion/NgS zinc/~NgSV zincked/VtT zincking/V6 zine/~NS zinfandel/Ng zing/NgVd>GZ zinger/NgS zingy/J>^ zinnia/NgS zip/~NSVU zip's zipped/VtTJU zipper/~NgSVdG zipping/V6U zippy/J^> zircon/NgS zirconium/~Ng zit/NSg zither/NgSV zloty/NSg zlotys/N zodiac/~NgS zodiacal/J zombie/~NgS zonal/~JY zone/~NSVGdr zone's zoning/~V6Ng zonked/J zoo/~NSg zookeeper/NSg zoological/~JY zoologist/~NSg zoology/~Nmg zoom/~NgSVdG zoomer/NgS zoophyte/NSg zoophytic/J zooplankton/N zorch/VN zoster/~N zounds/ zucchini/NgS zwieback/Ng zydeco/Ng zygote/NSg zygotic/~J zymurgy/Ng # End of original dictionary imports # Words below this point are now also sorted alphabetically, case-sensitive # This section contains mostly programming and technical terms # Some words may be very domain-specific, proprietary, or trademarked 0s/~9 # not sure how well "words" starting with numbers are handled 1Password/Og # password manager 1s/~9 # not sure how well "words" starting with numbers are handled 3D/J # not sure how well "words" starting with numbers are handled AAC/Ng # audio format AArch64/Og # see also ARM64 ACM/Ng ADT/NgS # abstract data type, algebraic data type AGI/Sg # artificial general intelligence AMC/NOSg # old car brand #ANN/Ng # artificial neural network !! TODO causes "Ann" to be flagged by `SpellCheck AOC/Og # US politician Alexandria Ocasio-Cortez APFS/Og # Apple file system ARM64/Og # see also AArch64 ASLR/Ng # Address Space Layout Randomization ASM/N # assembly language - should "asm" be included as well/instead? ASMR/Nmg # "Autonomous Sensory Meridian Response" ASUS/Og ATF/Ng # automatic transmission fluid AVC/Ng # H.264 video format AVL tree/NgS # data structure Afroasiatic/OmgJ. # linguistics Airbnb/ONSg Akismet/Og Alexa/Og # voice assistant Alexandre/OgS AliExpress/Og Alibaba/Og AlphaFold/Og # Google DeepMind project Ambien/NSg # insomnia treatment AngularJS/Og Anker/Sg Anki/Og # flashcard app Anthropic/Og # AI company AppKit/Og # macOS framework Archytas/Sg # !! please check and comment !! we also have archytas Atlassian/Og # Company behind Jira, Confluence, Bitbucket AutoGPT/Og Automattic/Og # WordPress company Automattician/Sg B&B/Ng B2B/J # business-to-business BCD/Ng # binary coded decimal BCPL/Ng # old programming language BERT/Og # Bidirectional Encoder Representations from Transformers BLM/Ng BOM/NSg # Byte Order Mark BPE/NgS # Byte Pair Encoding BRICS/ # intergovernmental organization BSON/Ng # binary JSON BSP/NSg # data structure BYD/OgS # Chinese automobile manufacturer Bachiyski/Sg BadgerDB/Og # key-value database Bezos/O # Surname, Amazon founder Binance/Og Bing/Og # Microsoft product BitKeeper/Og # version control Bitbucket/Og # GitHub alternative Bitwarden/Og # password manager BlasterHacks/Sg Bluesky/Og Boxster/NOSg # car model Brembo/OgS # brake company Btrfs/Ng # file system BurpSuite/ONSg C++/OgS # programming language CAPTCHA/NgS CCP/OS # Chinese Communist Party CDMA/NSg CDN/NSg # content delivery network CEO/NSg # chief executive officer CERN/Og # intergovernmental organization CI/NSg # continuous integration CISC/Ng # cpu architecture CLR/Og # common language runtime CMOS/N # microchip process CMS/NSg # content management system CMYK # colour model CMake/Sg # build tool CORS # web: cross-origin resource sharing CPython/Og # Python implementation CQL/N CRC/NgS # cyclic redundancy check CRDT/NSg CRM/NOSg CSON/Ng # CoffeeScript Object Notation (JSON like format) CTE/NS CTF/NSg # capture the flag CVE/NSg # Common Vulnerabilities and Exposures ChatGPT/Og # OpenAI product ClickHouse/Og CloudFront/Og # CDN service Cloudflare/Og CockroachDB/Og # distributed database Codeberg/Og # GitHub alternative Colemak/NgJ CommonMark/g CompUSA # retailer Conda/Og # package manager for Python and R Corretto/Sg CouchDB/Og # NoSQL database Couchbase/Og # NoSQL database Coursera/Og Crowdsignal/Og Cypher/ONg DATETIME/NgS # dictionaries prefer: datetime DBMS/NOSg # database management system DBus/Og # message bus system DCT/NgS # discrete cosine transform DDoS/Ng DEI DFA/NgS DKIM/NSg DLL/NgS # dynamic link library DM/NSgVb DM'd/V # direct message DMed/VtT DMing/V6 DNS/OgS # domain name system DOM/NSg # document object model DRM/Ng # digital rights management DSL/NSg # domain-specific language DX/Ng # developer experience Dashlane/Og # password manager DataDog/Og # monitoring service DeepMind/Og DeepSeek/Og # AI company Deno/Og DevOps/Sg DirectX/Og Docker/Og Dockerfile/NgS Dreamcast/OgS # game console DuckDuckGo/Og # search engine Duolingo/Og # language app EBITDA/N # earnings before interest, taxes, depreciation, and amortization ECMA/Og # European Computer Manufacturers Association EEA/O # European Economic Area EFI/Og # Extensible Firmware Interface EGR/ # exhaust gas recirculation ELIZA/Og EMR/NOSg EOF/NgS # end of file EPUB/NOSg # e-book format ESLint/Og # JavaScript linter ESP32/Og # microcontroller family ESP8266/Og # microcontroller family EV/NSg # electric vehicle EXIF # metadata ElasticSearch/Sg Electron/Og # web-tech framework for desktop apps Elon/Og Erdoğan/Og # surname, Turkish politician Ethereum/Og # digital currency Evo/OgS # car model Expedia/Og Exynos/OgJ # Samsung SoC series. FAANG/NSg # Facebook, Amazon, Apple, Netflix, Google FAT32/Ng # file system FFI/Ng # foreign function interface - see also interop FFmpeg/Og FIBA/Ng # international basketball federation FIDO/NOSg FIFA/Ng # football/soccer association FOSDEM/Og # Free and Open source Software Developers' European Meeting FOSS/Og # free and open-source software FOV/Ng # field of view FPGA/NSg # field-programmable gate array FPM/Sg FSB/Og # Russian intelligence agency FSD/Ng # full self-driving Famicom/NOSg # game console Figma/Og FireWire/Sg # trademark Firestore/Og Foddy/Sg Forgejo/Og # programming forge / git host Frankl/Sg FreeBSD/Og # operating system FreeType/ONg # typography library GAN/NgS # generative adversarial network GLFW/Og GPG/Og # GNU Privacy Guard GPIO/Ng # general purpose input/output GPL/Og # GNU General Public License GPLv1/Og GPLv2/Og GPLv3/Og GPT/NSg # generative pre-trained transformer GPU/NS # graphics processing unit GRU/Og # Russian intelligence agency GRUB/Og # Grand Unified Bootloader GSM/OJ # Global System for Mobile Communications GTK/O # GIMP Toolkit GUID/Og # globally unique identifier Ganeti/Sg Gateron/Sg GeForce/Og GeoJSON/Og # geographic data format (JSON based) Gerber/Ng # file format Ghidra/Og # reverse engineering GitLab/Sg # GitHub alternative Gmail/ONSgV Golang/Sg # programming language Goleman/Sg Gradle/Sg # build tool Grafana/Sg Grammarly/Og # grammar checker Grandey/Sg GraphQL/Og Graphviz/Sg Gravatar/Og H.265/ONSg # High Efficiency Video Coding HAProxy/Og # high availability proxy HDR/J # high dynamic range HEIC/ONSg # High Efficiency Image Container HEIF/ONSg # High Efficiency Image Format HEVC/ONSg # High Efficiency Video Coding HMAC/Ng # Hash-based Message Authentication Code HQL/N HTML5 Hasan/OgS # surname, given name HashiCorp/Og # software company: Consul, Terraform, Vault, etc. Hiera/Sg Hmong-Mien/Omg # linguistics Holmdel/Sg Hugging Face/Og IBAN/NgS # International Bank Account Number ICMP/Og # internet control message protocol ID3 # audio metadata IDA/Og # reverse engineering software IFRS/Og # International Financial Reporting Standards IIFE/NgS # immediately-invoked function expression IMAP/Sg # internet message access protocol IME/NgS # input method editor IMSI/N # international mobile subscriber identity IPC/Ng # interprocess communication IPCC/Og IPS/J # in-plane switching (screen technology) IPv4/OgS IPv6/OgS ISA/NOSg # instruction set architecture; industry standard architecture Indo-Aryan/OmgSJ # linguistics Indo-European/OmSgJ # linguistics Indo-Iranian/NmgJ # linguistics IntelliJ/Sg IntelliSense/Og IoT/Ng # internet of things JNI/Og # Java Native Interface JS/Ng # JavaScript JSDoc/Sg JSON/Og # data format JSONP/Og JVM/Sg # Java virtual machine JWT/Ng # JSON Web Token Jacoco/Sg Japonic/OmgJ # linguistics JavaDoc/Sg JavaScript/ONSg # programming language JetBrains/Og Jetpack/Og Jira/Og # issue tracker Joomla/Sg Jupyter/Og KDE/Og # K Desktop Environment KSQL/N KVM/NSg # keyboard-video-mouse Kagi/Sg Kahneman/Sg KanBan/Ng Kartvelian/OmgJ # linguistics KiCad/Og # software Kia/ONSg # automobile brand Kra-Dai/OmgJ # linguistics Kubernetes/OgS LADAR LDAP/Og # Lightweight Directory Access Protocol LEGO/NSg # official trademark form of Lego LFG/Omg # Lexical Functional Grammar LIBOR/N # London Interbank Offered Rate LIDAR/N # FIXME! elsewhere we have LiDAR LLM/NgS # large language model LLVM/Ng # compiler system LOC/9 # source lines of code LRU # least recently used LSB/NOgS # least significant bit/byte; Linux Standard Base LSP/NgS # language server protocol LSTM/NgS # long short-term memory LTE/NOJ # long-term evolution LTS/NSg LUT/NgS # lookup table LVM/Sg LaTeX/Og # Typesetting system, based on TeX engine Labriola/OgS LanguageTool/g # grammar checker Laravel/g Lato/ONg LeetCode/Og # programming contest Lenovo/Og # computer manufacturer Levenshtein/g # surname, mathematician LiDAR/N # FIXME! elsewhere we have LIDAR LinkedIn/Og LoRA/NwSg # low-rank adaptation Loctite/Ogm # product Logotherapy/Sg Longreads/Og Lua/Og # programming language LuaTeX/Og # TeX-based typesetting engine MAGA/ONwgS MCP/Ng # model context protocol MMO/NgS # massively multiplayer online MMX/Ng # multimedia extension MPC/ONg MQTT/Og # messaging protocol MRU # most recently used MSB/NgS # most significant bit/byte MSE/NgS # mean squared error MSNBC/Og # media company MSVC # Microsoft Visual C++ MTA/NSg MVC # model-view-controller MacBook/OgS # Apple product Manilas/N Manilla/Og MapReduce/N Marchus/Sg Mbps # megabits per second MediaWiki/Og # the software Wikimedia runs on #Metal/Og # 3D graphics API - not working yet due to canonical spelling bug Metasploit/ONSg Minecraft/Og Minhaj/OgS Minix/Og # old hobby operating system Mockito/Sg Molex/NOSg # Molex connector Mullenweg/g Munin/Sg Murcielago/OgS N.S.A./OgS # FIXME! elsewhere we have NSA N1/Og N2/Og N3/Og N4/Og N5/Og NAT/Ng # network address translation/translator NFA/NgS NLP/g NMI/NgS # non-maskable interrupt NPC/Sg NPM/Sg NTP/N # network time protocol NYTimes/Sg NYU/Og NaN/NgS Neo4J/ONg Neovim/g # code editor NetBSD/Og # operating system Netlify/Og # cloud Next.js/ONg # framework Nikolay/Sg Nilotic/OmgJ # linguistics NixOS/Og NoSQL/N Node.js/Og # official spelling has dot NumPy/ONg Nvidia/Og # FIXME! elsewhere we have NVIDIA O'Reilly/OgS OAuth/g # open authentication OCaml/Og # programming language OG/NgS OOP/Nmg ORM/NOS # object-relational mapping OSINT/Nmg Obsidian/Og # note-taking app Ollama/Og # AI tool OpenAI/Og OpenBSD/Og # operating system OpenCV/Og OpenGL/Sg # open graphics library OpenID/Og OpenMetrics/Sg OpenPGP/Sg OpenSearch/Sg OpenZFS/Ng # file system P2/Sg P2P/ONg PCH/Og # highway PDP/NSg # old computer PII/NSg PIO/NgS # programmed I/O PKCS/Sg POP3/OgS2x POSIX/Og # unix standard PRQL/N PTSD/NSg # post-traumatic stress disorder PWA/ONSg Pandoc/Ng # FIXME! elsewhere we have pandoc Parth/Sg Patreon/OgS Polldaddy/Og Polymarket/Og Postfix/Sg Postgres/Og PowerShell/Sg # Microsoft product Prolog/Og # old programming language PromQL/Sg PyPI/Og # Python Package Index PyTorch/Og # framework Q1 Q2 Q3 Q4 QQ/NSg # instant messaging app QUERTY/Sg # !! mistake for QWERTY? !! QUIC/OgS Qin/OgS QoL/Nmg # quality of life QoS/Nmg # quality of service QuickLook/Og # Apple product Quora/Og # Q&A platform RAII # resource acquisition is initialization RDBMS/NOSg # relational database management system REPL/NgS # read evaluate print loop RFID/ONg # radio frequency identification RISC/Ng # cpu architecture RJ45/Ng # ethernet connector RL/Nmg # reinforcement learning RNN/NgS # recurrent neural network RPC/ONSg # remote procedure call RPG/NgS # role-playing game RTX/NSg Raytheon/Og React Native/Og # framework ReactJS/Og Red Hat/Og Reddit/Og ReLU/NwgS # rectifier linear unit Rivian/Sg # ev company Roblox/Og # game Roumania/Og # pre-WWII spelling RustConf/Og # conference Ryzen/ONgS SCM/Ng # source code management SDK/NSg # software development kit SDL/Og # Simple DirectMedia Layer SGD/Nmg # stochastic gradient descent SHA/ONg # Secure Hash Algorithm SIGINT/Nmg # signals intelligence SIMD/NSg # single instruction, multiple data SLA/NSg SLOC/9 # source lines of code SMS/N0gVb SMSed/VtT SMSes/N9Vh SMSing/V6 SMTP # Simple Mail Transfer Protocol SNL/Og # Saturday Night Live SQLAlchemy/N SSID/NgS SSL/Og # Secure Sockets Layer SVG/ONs # scalable vector graphics SVGA/N # super VGA Sharman/OgS Shellsort/NgS # algorithm Shibuya/Og Shinjuku/Og Shopify/Og # company Simplenote/Og Sino-Tibetan/NmgJ # linguistics Sioyek/Ng Siri/Og # voice assistant Skia/Og # 2d graphics library Snapchat/Sg SolidJS/Og # ui lib Soros/Og # financier George Soros SpaceX/Og Spotify/Og Stellantis/Og # car company Substack/Og Subversion/Og # version control Svelte/Og # js framework SwiftUI/Og # Apple framework Systemd/Sg # Linux system software TARGET2/O # RTGS system for the Eurozone TCP/JOgS # internet protocol TEU/O # Treaty on the European Union TFEU/O # Treaty on the Functioning of the European Union TL;DR # internet slang TLS/Og # Transport Layer Security TODO # FIXME! elsewhere in Harper we refer to Todo and to-do TOML/Ng # configuration file format TOS/N9 # Terms of Service - also spelled "ToS" TOTP/Ng # time-based one-time password TSMC/Og # Taiwanese Semiconductor Manufacturing Company TSR/NgS # terminate and stay resident TTS/Ng # text-to-speech TUI/NOSg # text user interface Tandy/Og # surname, given name, old computer company Tauri/Og # web-tech framework for desktop apps TeX/Og # Typesetting engine; must come after Tex! TeXes TechCrunch/g Tencent/Og TensorFlow/Og TextMate/Og # text editor and syntax highlighting standard ThinkPad/OgS # pc brand TikTok/Sg ToS/N9 # Terms of Service - also spelled "TOS" Todo # FIXME! elsewhere in Harper we refer to TODO and to-do Topcoder/Og # programming contest Toronado/OgS # car brand Tree-sitter/Og # parsing Trinitron/NOSg # CRT Trocla/Sg TrueNAS/Sg Tumblr/Og Typst/Sg UAC # User Account Control (Windows) UDP/NOSg # internet protocol UEFI/Og # Unified Extensible Firmware Interface UIKit/Og # Apple framework ULA/NgS # uncommitted logic array URI/NSg # uniform resource identifier UUID/NgS # universal unique identifier UX/Ng # user experience UpCloud/Og # cloud service provider VAG/Og # car company VARCHAR/NgS VCS/Ng # version control system VFD/NgS # vacuum fluorescent display VMware/ONSg VPN/NSg # virtual private network VR/Og VS Code/Og Vaadin/Sg VaultPress/Og Vercel/Og # cloud VideoPress/Og Viktor/Sg Vimeo/Og # video platform VirtualBox/ONSg Vite/Sg Vue/Og # framework Vulkan/Og # 3D graphics API WAL/ONSg WASI/Sg WASM/Sg # see WebAssembly WD40/Ng WIP/Ng # work in progress WPA/Og WPA2/Og WSL/Og # windows subsystem for linux Waymo/Og WeChat/Og WebAssembly/g # see WASM WebDAV/Og WebGL/Og WebGPU/Sg WebKit/Og WebRTC/Og WebSocket/Sg Westphalian/J # political science and international relations WhatsApp/NOgVG # messaging app Wikilink/NSg # !! please check and comment !! elsewhere we have wikilink Wikimedia/Og # foundation that runs Wikipedia etc. WireGuard/Sg WooCommerce/Og XFS/Ng # file system XLR/Ng # connector XPath/Og # XML path language Xbox/NOSg Xcode/Og # Apple IDE XeTeX/Og # TeX typesetting engine Xorg/ONSg Y2K/g # year 2000 YAML/OgS # markup language Yazi/ONSg Yoast/Og # seo YubiKey/Sg ZFS/Ng # file system Zettelkasten/Ng Zig/Og # programming language Zigbee/Og # wireless protocol Zuckerberg/OgS # surname, Facebook founder a11n/N a12s/9 a8c/Sg ambitransitive/J # verb which is both transitive and intransitive antimalware/Nmg arXiv/Og # research archive archytas/Sg # !! please check and comment !! we also have Archytas autoconfig/Ng autoconfiguration/Ng autoconfigure/VSdG autodifferentiation/Nmg autoencoder/NgS autoregression/Nmg autoprefixer/NgS autosave/VSdGNg awk/Og # *nix tool backend/NSg # dictionaries prefer: back end backoff/NsG backtest/NgSVdG baz/~ # cf. foo, bar bitfield/NgS # in this section since it's not in Cambridge, Collins, Longman, OED, Oxford, or Websters blogpost/NgS # !! blog post is many times more popular; both appear in some dictionaries chroot/NgS clickstream/NgS concat/VSdG config/NSgV # not marked as a verb since "configed" and "configing" look wrong configurator/NgS corpo/NgS cronjob/NgS datagram/NgS datetime/NgS decomp/NgSVdG # decompile/decompilation dedup/Ng # not well covered by dictionaries. wiktionary has only singular noun. cf. dedupe dedupe/NSgVdG # not well covered by dictionaries. wiktionary has noun and verb. cf. dedup diahcronic/JQ # linguistics diarization/NmgS # used in voice recognition docstring/NSg doomerism/Nmg doomscrolling/V6NJ dotfile/~NSg # not well covered by dictionaries. eVTOL/NgS enshittify/VSdG enshittification/Nmg ext2/Ng # file system ext3/Ng # file system ext4/Ng # file system failable/J failover/NwgS falsy/J feedforward/NmJ filepath/NgS filesystem/~Sg # dictionaries prefer: file system freemium/J frontend/NSg # dictionaries prefer: front end fuser/NgS gRPC/OgS # framework gcd/Ng # greatest common divisor gen AI/Ng geodata/Nwg geofence/NgSVdG glymph/Sg # !! please check and comment !! gzip/VS # GNU compression utility gzipped/VtT gzipping/V6 hardcode/VGdS # dictionaries prefer: hard code hashmap/NgS # data structure heapsort hoster/NgS hostname/NSg hotwire/VGB # dictionaries prefer: hot-wire i18n/Nm # internationalization iPadOS/Og iTerm2/Og # macOS terminal emulator idiolect/NSg # linguistics iframe/NgS infosec/NmG # information security inpaint/VGdS interop/NmgS # interoperability - see also FFI interpretability/Nmg invokable/J # not in most dictionaries, used in computing jQuery/Og keybind/NgS # key binding keyserver/NgS labriola/Sg # !! please check and comment !! - should be uppercase surname? lingua franca/NSg linguæ francæ/N9g linguae francae/N9g linkification/Nmg manip/NgS # gamer slang manipulation megatron/NgS memecoin/NgS mergesort microframework/NgS multicast/JVSdG nonmutating/J npm/Og # node package manager nullish/J olds/~ # common in phrasing such as "twenty year olds" pandoc/Sg # !! please check and comment !! elsewhere we have Pandoc pastebin/NgS pdfTeX/Og # Program, extension for TeX engine pentest/VSdG pentester/NSg # penetration tester pentesting/NmgV6 plist/NgS # Apple property list polysyntheses/N9 # linguistics polysynthesis/Nw0g # linguistics polysynthetic/J. # linguistics postfix/NgSVdG pre/~PNV( # !! please check and comment !! dictionaries only list prefix pre- preshared/J quadtree/NgS # data structure quicksort/NgSVdG # algo raytracer/N # dictionaries prefer: ray tracer rearchitect/VdGS redump/VdGS remux/VdGS reranker/NgS roadmap/NgS # overtook "road map" c. 2000 but not in dictionaries yet roguelike/NgS royale/~NSgJ # !! please check and comment !! dictionaries only list noun sense type of custard runahead/NgS s.t./~ # !! please check and comment !! sRGB/Og # colour space scatterplot/NSgVG # dictionaries prefer: scatter plot screencast/VdSG scrollbar/NSg # dictionaries prefer: scroll bar sed/Og # *nix tool / language sigil/NgS singleplayer/J sioyek/Sg # !! please check and comment !! sociolect/NSg stacktrace/NSg # dictionaries prefer: stack trace standup/Sg # dictionaries prefer: stand-up std/~ # doesn't really behave like any normal POS but more like an affix that's not attached stdio/Og # behaves like a proper noun despite lowercase since not normally used with 'a' or pluralized. But can be used with 'the' stdlib/Og # behaves like a proper noun despite lowercase since not normally used with 'a' or pluralized. But can be used with 'the' strat/NgS # gamer slang strategy subchannel/NgS subkey/NgS subreddit/NgS # see Reddit supersequence/NgS synchronic/JQ # linguistics tagset/NgS terraform/VGdS timespan/NgS tmux/Og # terminal multiplexer, uncapitalized proper noun trie/NgS # data structure truthy/J unicast/JVSdG unlintable/J upsert/VdSGNg # database operation: update or insert upsertion/NgS # database operation: update or insert uptime/NwgS vid/NgS # video volitive/NSgJ waitlist/NgS watchOS/Og webpack/Og whitespace/~NSg # dictionaries prefer: white space wikilink/~NSg # !! please check and comment !! elsewhere we have Wikilink z-buffer/NgS # New entries may be added below this line # If you're not confident in using the affix annotations, add missing words here # And they will be reviewed # Words added using the `just addnoun` command will be added here agnatic/J # Most often in the phrase "agnatic primogeniture" APAC/gO # Acronym for Asia-Pacific archipelagic/J # As found in the phrase "Archipelagic state" in the "United Nations Convention on the Law of the Sea" chorded/J # music: As refers to "chorded instruments" cognatic/J # As with "agnatic" comital/J # Adjective version of the noble rank "count/countess/earl" Compline/NO # Final prayer of the day in the Christian Daily Office and/or Liturgy of the Hours covenantal/JQ cupbearer/NSg DACH/gO # Acronym for Deutschland, Austria, Switzerland EMEA/gO # Acronym for Europe, the Middle East and Africa exocentric/JQ fae/Nmg # fantasy alternative for "fey" iaido/Nmg # martial art kalimba/NSg licensor/NSg menarche/Nmg # medicine micronutrient/NSg monolatrous/J monolatry/Nmg offeror/NSg omnipredicativity/N0 orthopractic/J orthopraxy/Nwg piebaldism/Nmg # medicine praxis/Nmg queenship/Nwg resolutive/J sortition/Nmg # Political science: a method of appointment to office by random draw subvocalization/Nwg # phonetics supervenience/Nmg # From emergentist ontology trimeter/NgS # poetry trimetre/NgS!@_₹ # poetry trimetric/J unminted/J vicomital/J # Adjective version of "viscount/viscountess" vicontiel/J # As above, alternative version viscomital/J # As above, alternative version WordCamp/Og worldbuild/V>G ================================================ FILE: harper-core/irregular_nouns.json ================================================ [ "// comments can appear in the line before an entry", "// or in place of an entry", ["addendum", "addenda"], ["aircraft", "aircraft"], ["aircraftman", "aircraftmen"], ["aircraftwoman", "aircraftwomen"], ["airman", "airmen"], ["alderman", "aldermen"], ["alga", "algae"], ["alveolus", "alveoli"], ["anchorman", "anchormen"], ["anchorwoman", "anchorwomen"], ["atrium", "atria"], ["axis", "axes"], ["bacillus", "bacilli"], ["bacterium", "bacteria"], ["bandsman", "bandsmen"], ["bargeman", "bargemen"], ["bellman", "bellmen"], ["biceps", "biceps"], ["boatman", "boatmen"], ["bronchus", "bronchi"], ["businesswoman", "businesswomen"], ["cactus", "cacti"], ["cameraperson", "camerapeople"], ["candelabrum", "candelabra"], ["catharsis", "catharses"], ["chairman", "chairmen"], ["chairwoman", "chairwomen"], ["child", "children"], ["churchwoman", "churchwomen"], ["clansman", "clansmen"], ["clanswoman", "clanswomen"], ["committeeman", "committeemen"], ["committeewoman", "committeewomen"], ["continuum", "continua"], ["corpus", "corpora"], ["craftsman", "craftsmen"], ["craftswoman", "craftswomen"], ["crisis", "crises"], ["cyclops", "cyclopes"], ["datum", "data"], ["deer", "deer"], ["diaeresis", "diaereses"], ["diagnosis", "diagnoses"], ["dominatrix", "dominatrices"], ["draughtsman", "draughtsmen"], ["draughtswoman", "draughtswomen"], ["effluvium", "effluvia"], ["emphasis", "emphases"], ["esophagus", "esophagi"], ["extremum", "extrema"], ["fish", "fish"], ["foot", "feet"], ["footman", "footmen"], ["formula", "formulae"], ["forum", "fora"], ["freeman", "freemen"], ["frontiersman", "frontiersmen"], ["frontierswoman", "frontierswomen"], ["garbageman", "garbagemen"], ["genesis", "geneses"], ["genie", "genii"], ["genius", "genii"], ["genus", "genera"], ["glissando", "glissandi"], ["goose", "geese"], ["graffito", "graffiti"], ["grandchild", "grandchildren"], ["handyman", "handymen"], ["hitman", "hitmen"], ["houseman", "housemen"], ["iceman", "icemen"], ["ilium", "ilia"], ["index", "indices"], ["intermezzo", "intermezzi"], ["journeyman", "journeymen"], ["labium", "labia"], ["lamina", "laminae"], ["laundrywoman", "laundrywomen"], ["laywoman", "laywomen"], ["linesman", "linesmen"], ["lira", " lire"], ["longshoreman", "longshoremen"], ["louse", "lice"], ["madman", "madmen"], ["mailman", "mailmen"], ["man", "men"], ["memorandum", "memoranda"], ["metathesis", "metatheses"], ["minimum", "minima"], ["mitosis", "mitoses"], ["motorman", "motormen"], ["mouse", "mice"], ["muscleman", "musclemen"], ["nemesis", "nemeses"], ["nightwatchman", "nightwatchmen"], ["oarsman", "oarsmen"], ["oarswoman", "oarswomen"], ["oasis", "oases"], ["ombudsman", "ombudsmen"], ["optimum", "optima"], ["ox", "oxen"], ["palazzo", "palazzi"], ["papyrus", "papyri"], ["parenthesis", "parentheses"], ["patina", "patinae"], ["patrolman", "patrolmen"], ["pericardium", "pericardia"], ["periphrasis", "periphrases"], ["person", "people"], ["pharynx", "pharynges"], ["phenomenon", "phenomena"], ["plainclothesman", "plainclothesmen"], ["pneumococcus", "pneumococci"], ["pressman", "pressmen"], ["prosthesis", "protheses"], ["quantum", "quanta"], ["radius", "radii"], ["radix", "radices"], ["repairman", "repairmen"], ["salesman", "salesmen"], ["saleswoman", "saleswomen"], ["sandman", "sandmen"], ["schema", "schemata"], ["seraph", "seraphim"], ["sheep", "sheep"], ["shoreman", "shoremen"], ["signore", "signori"], ["simulacrum", "simulacra"], ["solarium", "solaria"], ["species", "species"], ["spokesman", "spokesmen"], ["spokesperson", "spokespeople"], ["spokeswoman", "spokeswomen"], ["statesman", "statesmen"], ["stateswoman", "stateswomen"], ["steersman", "steersmen"], ["stratum", "strata"], ["streptococcus", "streptococci"], ["succubus", "succubi"], ["symbiosis", "symbioses"], ["tarsus", "tarsi"], ["taxon", "taxa"], ["testatrix", "testatrices"], ["testis", "testes"], ["thesis", "theses"], ["thrombosis", "thromboses"], ["tooth", "teeth"], ["townsman", "townsmen"], ["townswoman", "townswomen"], ["tradesman", "tradesmen"], ["tradeswoman", "tradeswomen"], ["uterus", "uteri"], ["vertebra", "vertebrae"], ["vertex", "vertices"], ["vivarium", "vivaria"], ["washerwoman", "washerwomen"], ["woman", "women"], ["woodlouse", "woodlice"], ["workingwoman", "workingwomen"], ["workman", "workmen"] ] ================================================ FILE: harper-core/irregular_verbs.json ================================================ [ "// comments can appear in the line before an entry", "// or in place of an entry", ["arise", "arose", "arisen"], ["awake", "awoke", "awoken"], "// be/am/are/is -- was/were -- been", ["bear", "bore", "born"], ["become", "became", "become"], ["begin", "began", "begun"], ["bend", "bent", "bent"], ["bet", "bet", "bet"], ["bid", "bade", "bidden"], ["bind", "bound", "bound"], ["bite", "bit", "bitten"], ["bleed", "bled", "bled"], ["blow", "blew", "blown"], ["break", "broke", "broken"], ["breed", "bred", "bred"], ["bring", "brought", "brought"], ["build", "built", "built"], ["burst", "burst", "burst"], ["buy", "bought", "bought"], ["catch", "caught", "caught"], ["choose", "chose", "chosen"], ["come", "came", "come"], ["cost", "cost", "cost"], ["cut", "cut", "cut"], ["dive", "dove", "dove"], ["do", "did", "done"], ["drink", "drank", "drunk"], ["drive", "drove", "driven"], ["eat", "ate", "eaten"], ["fall", "fell", "fallen"], ["feed", "fed", "fed"], ["feel", "felt", "felt"], ["fight", "fought", "fought"], ["find", "found", "found"], ["fly", "flew", "flown"], ["forget", "forgot", "forgotten"], ["forgo", "forwent", "forgone"], ["freeze", "froze", "frozen"], "// get -- got -- gotten", ["get", "got", "got"], ["give", "gave", "given"], ["go", "went", "gone"], ["grow", "grew", "grown"], ["have", "had", "had"], ["hear", "heard", "heard"], ["hit", "hit", "hit"], ["hold", "held", "held"], ["hurt", "hurt", "hurt"], ["input", "input", "input"], ["keep", "kept", "kept"], ["kneel", "knelt", "knelt"], ["know", "knew", "known"], "// lay -- laid -- lain", ["lay", "laid", "laid"], ["lead", "led", "led"], ["leave", "left", "left"], ["lend", "lent", "lent"], ["let", "let", "let"], ["lie", "lay", "lain"], ["light", "lit", "lit"], ["lose", "lost", "lost"], ["make", "made", "made"], ["mean", "meant", "meant"], ["meet", "met", "met"], ["mistake", "mistook", "mistaken"], ["output", "output", "output"], ["overtake", "overtook", "overtaken"], ["overthrow", "overthrew", "overthrown"], ["overwind", "overwound", "overwound"], ["overwrite", "overwrote", "overwritten"], ["partake", "partook", "partaken"], ["pay", "paid", "paid"], "// prove -- proved -- proven/proved", ["put", "put", "put"], ["read", "read", "read"], ["redo", "redid", "redone"], ["remake", "remade", "remade"], ["reread", "reread", "reread"], ["reset", "reset", "reset"], ["ride", "rode", "ridden"], ["ring", "rang", "rung"], ["rise", "rose", "risen"], ["run", "ran", "run"], ["see", "saw", "seen"], ["sell", "sold", "sold"], ["send", "sent", "sent"], ["set", "set", "set"], ["sew", "sewed", "sewn"], ["shake", "shook", "shaken"], ["shed", "shed", "shed"], ["shine", "shone", "shone"], ["shoe", "shod", "shod"], ["shoot", "shot", "shot"], ["show", "showed", "shown"], ["shrink", "shrank", "shrunk"], ["shut", "shut", "shut"], ["sing", "sang", "sung"], "// sink -- sank -- sunken??", ["sink", "sank", "sunk"], ["sit", "sat", "sat"], ["slay", "slew", "slain"], ["sleep", "slept", "slept"], ["slide", "slid", "slid"], ["slit", "slit", "slit"], "// sneak -- sneaked/snuck -- sneaked/snuck", ["speak", "spoke", "spoken"], ["spend", "spent", "spent"], ["spin", "spun", "spun"], ["spit", "spat", "spat"], ["split", "split", "split"], ["spread", "spread", "spread"], ["spring", "sprang", "sprung"], ["stand", "stood", "stood"], ["steal", "stole", "stolen"], ["stick", "stuck", "stuck"], ["sting", "stung", "stung"], ["stink", "stank", "stunk"], ["stride", "strode", "stridden"], ["strike", "struck", "stricken"], ["string", "strung", "strung"], ["swear", "swore", "sworn"], ["sweep", "swept", "swept"], ["swell", "swelled", "swollen"], ["swim", "swam", "swum"], ["swing", "swung", "swung"], ["take", "took", "taken"], ["teach", "taught", "taught"], ["tear", "tore", "torn"], ["think", "thought", "thought"], ["throw", "threw", "thrown"], ["tread", "trod", "trodden"], ["undo", "undid", "undone"], ["wake", "woke", "woken"], ["wear", "wore", "worn"], ["weave", "wove", "woven"], ["weep", "wept", "wept"], "// wet -- wetted -- wetted", ["wet", "wet", "wet"], ["win", "won", "won"], ["wind", "wound", "wound"], ["write", "wrote", "written"] ] ================================================ FILE: harper-core/proper_noun_rules.json ================================================ { "Americas": { "canonical": ["South America", "North America", "Central America"], "description": "When referring to North, Central, and South America, make sure to treat them as a proper noun." }, "Australia": { "canonical": [ "Australian Capital Territory", "New South Wales", "Northern Territory", "South Australia", "Western Australia", "Alice Springs", "Gold Coast", "Sunshine Coast" ], "description": "When referring to states, territories, and cities in Australia, make sure to treat them as a proper noun." }, "OceansAndSeas": { "canonical": [ "Atlantic Ocean", "Pacific Ocean", "Indian Ocean", "Southern Ocean", "Arctic Ocean", "Mediterranean Sea", "Caribbean Sea", "Baltic Sea", "Red Sea", "Black Sea", "Caspian Sea", "Coral Sea", "Bering Sea", "North Sea", "South China Sea" ], "description": "When referring to the world's oceans and seas, ensure they are treated as proper nouns." }, "Canada": { "canonical": [ "British Columbia", "New Brunswick", "Northwest Territories", "Nova Scotia", "Prince Edward Island", "Quebec City" ], "description": "When referring to provinces, territories, and cities in Canada, make sure to treat them as a proper noun." }, "Laos": { "canonical": ["La Mam", "Luang Namtha", "Luang Prabang", "Xam Neua"], "description": "When referring to provinces and cities in Laos, make sure to treat them as a proper noun." }, "Malaysia": { "canonical": [ "Alor Setar", "George Town", "Johor Bahru", "Kota Bahru", "Kota Kinabalu", "Kuala Lumpur", "Kuala Terengganu", "Negeri Sembilan", "Shah Alam" ], "description": "When referring to the states of Malaysia and their capitals, make sure to treat them as a proper noun." }, "Countries": { "canonical": [ "Equatorial Guinea", "Papua New Guinea", "Cayman Islands", "Falkland Islands", "Marshall Islands", "Solomon Islands", "British Virgin Islands", "United States Virgin Islands", "Northern Mariana Islands", "New Caledonia", "New Zealand", "Northern Cyprus", "Northern Ireland", "Central African Republic", "Czech Republic", "Dominican Republic", "Saint Helena", "Saint Lucia", "Saint Martin", "South Africa", "South Ossetia", "South Sudan", "American Samoa", "Antigua and Barbuda", "Bosnia and Herzegovina", "Burkina Faso", "Cape Verde", "Costa Rica", "Democratic Republic of the Congo", "East Timor", "El Salvador", "French Polynesia", "Guinea-Bissau", "Isle of Man", "Ivory Coast", "North Macedonia", "Puerto Rico", "São Tomé and Príncipe", "Saudi Arabia", "Sierra Leone", "Sint Maarten", "Sri Lanka", "Trinidad and Tobago", "Western Sahara" ], "description": "When referring to Countries, make sure to treat it as a proper noun." }, "NationalCapitals": { "canonical": [ "Abu Dhabi", "Addis Ababa", "Andorra la Vella", "Bandar Seri Begawan", "Belize City", "Buenos Aires", "Cape Town", "Dar es Salaam", "Diego Garcia", "George Town", "Guatemala City", "Ho Chi Minh City", "Kuwait City", "La Paz", "Mexico City", "New Delhi", "Pago Pago", "Panama City", "Phnom Penh", "Port-au-Prince", "Port Louis", "Port Moresby", "Port of Spain", "Port Vila", "Porto-Novo", "Saint Kitts and Nevis", "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines", "San José", "San Juan", "San Marino", "San Salvador", "Santo Domingo", "São Tomé", "The Bahamas", "The Hague", "Vatican City" ], "description": "When referring to national capitals, make sure to treat it as a proper noun." }, "ChineseCommunistParty": { "canonical": ["Chinese Communist Party"], "description": "When referring to the political party, make sure to treat them as a proper noun." }, "UnitedOrganizations": { "canonical": [ "United Nations", "United States", "United Kingdom", "United Airlines", "United Arab Emirates" ], "description": "When referring to national or international organizations, make sure to treat them as a proper noun." }, "Holidays": { "canonical": [ "Absolution Day", "Admission Day", "Alaska Day", "Anzac Day", "Arbor Day", "Armistice Day", "Ascension Day", "Australia Day", "Bastille Day", "Boxing Day", "Canada Day", "Christmas Day", "Columbus Day", "Commonwealth Day", "Darwin Day", "Discovery Day", "Dominion Day", "Earth Day", "Easter Day", "Election Day", "Emancipation Day", "Empire Day", "Father's Day", "Flag Day", "Freedom Day", "Galentine's Day", "Groundhog Day", "Halloween", "Independence Day", "Jamhuri Day", "Jubilee Day", "Kamehameha Day", "Kenyatta Day", "Labor Day", "Labour Day", "Madaraka Day", "Mashujaa Day", "May Day", "Memorial Day", "Merdeka Day", "Mother's Day", "National Freedom Day", "New Year's Day", "Patrick's Day", "Presidents' Day", "Remembrance Day", "Republic Day", "Rizal Day", "Thanksgiving Day", "Ulster Day", "Valentine's Day", "Veterans Day", "Victoria Day", "Victory Day", "Waitangi Day", "Wattle Day", "Year's Day", "Youth Day", "Black Friday", "Cyber Monday" ], "description": "When referring to holidays, make sure to treat them as a proper noun." }, "Koreas": { "canonical": ["South Korea", "North Korea"], "description": "When referring to the nations, make sure to treat them as a proper noun." }, "AmazonNames": { "canonical": [ "Amazon Shopping", "Amazon Web Services", "Amazon Lambda", "Amazon RDS", "Amazon DynamoDB", "Amazon SageMaker", "Amazon Rekognition", "Amazon CloudFront", "Amazon ECS", "Amazon EKS", "Amazon CloudWatch", "Amazon IAM", "Amazon Prime", "Amazon Kindle" ], "description": "When referring to the various products of Amazon.com, make sure to treat them as a proper noun." }, "GoogleNames": { "canonical": [ "Google Search", "Google Cloud", "Google Maps", "Google Docs", "Google Sheets", "Google Slides", "Google Drive", "Google Meet", "Google Gmail", "Google Calendar", "Google Chrome", "Google ChromeOS", "Google Android", "Google Play", "Google Bard", "Google Gemini", "Google YouTube", "Google Photos", "Google Analytics", "Google AdSense", "Google Pixel", "Google Nest", "Google Workspace", "Chrome Web Store", "Google Chrome Web Store" ], "description": "When referring to Google products and services, make sure to treat them as proper nouns." }, "AzureNames": { "canonical": [ "Azure DevOps", "Azure Functions", "Azure Cosmos DB", "Azure SQL Database", "Azure Kubernetes Service", "Azure Virtual Machines", "Azure Monitor", "Azure Storage", "Azure Active Directory", "Azure App Service", "Azure Key Vault", "Azure Cognitive Services", "Azure Service Bus", "Azure Event Hub" ], "description": "When referring to Azure cloud services, make sure to treat them as proper nouns." }, "MicrosoftNames": { "canonical": [ "Microsoft Bing", "Microsoft Dynamics", "Microsoft Edge", "Microsoft Excel", "Microsoft Office", "Microsoft OneDrive", "Microsoft Outlook", "Microsoft PowerPoint", "Microsoft SharePoint", "Microsoft Surface", "Microsoft Teams", "Microsoft Visual Studio", "Microsoft Windows", "Microsoft Word", "Microsoft Xbox", "VS Code" ], "description": "When referring to Microsoft products and services, make sure to treat them as proper nouns." }, "AppleNames": { "canonical": [ "Apple iPhone", "Apple iPad", "Apple iMac", "Apple MacBook", "Apple Watch", "Apple TV", "Apple Music", "Apple Arcade", "Apple iCloud", "Apple Safari", "Apple HomeKit", "Apple CarPlay", "Apple MacBook Pro", "Apple MacBook Air", "Apple Mac Pro", "Apple Mac Mini", "Apple AirPods", "Apple AirPods Pro", "Apple AirPods Max", "Apple Vision Pro" ], "description": "When referring to Apple products and services, make sure to treat them as proper nouns." }, "MetaNames": { "canonical": [ "Meta Oculus", "Meta Portals", "Meta Quest", "Meta Gaming", "Meta Horizon", "Meta Reality Labs" ], "description": "When referring to Meta products and services, make sure to treat them as proper nouns." }, "JetpackNames": { "canonical": [ "Jetpack VaultPress Backup", "Jetpack VaultPress", "Jetpack Scan", "Jetpack Akismet Anti-spam", "Jetpack Stats", "Jetpack Social", "Jetpack Blaze", "Jetpack AI Assistant", "Jetpack Site Search", "Jetpack Boost", "Jetpack VideoPress", "Jetpack For Agencies", "Jetpack CRM" ], "description": "Ensure proper capitalization of Jetpack-related terms." }, "TumblrNames": { "canonical": [ "Tumblr Blaze", "Tumblr Pro", "Tumblr Live", "Tumblr Ads", "Tumblr Communities", "Tumblr Shop", "Tumblr Dashboard" ], "description": "Ensure proper capitalization of Tumblr-related terms." }, "PocketCastsNames": { "canonical": ["Pocket Casts", "Pocket Casts Plus"], "description": "Ensure proper capitalization of Pocket Casts and Pocket Casts Plus as brand names." }, "DayOneNames": { "canonical": ["Day One", "Day One Premium"], "description": "Ensure proper capitalization of Day One and Day One Premium as brand names." }, "USUniversities": { "canonical": [ "Harvard University", "Stanford University", "Massachusetts Institute of Technology", "California Institute of Technology", "Princeton University", "Yale University", "Columbia University", "University of Chicago", "University of Pennsylvania", "Johns Hopkins University", "Duke University", "Northwestern University", "University of California", "University of Michigan", "University of Virginia", "University of North Carolina", "University of Wisconsin", "University of Texas", "University of Florida", "University of Washington", "University of Southern California", "New York University", "Cornell University", "Brown University", "Dartmouth College", "Carnegie Mellon University", "Georgetown University", "Rice University", "Vanderbilt University", "Washington University", "Emory University", "University of Notre Dame", "Boston University", "Boston College", "University of Miami", "University of Illinois", "Ohio State University", "Pennsylvania State University", "Purdue University", "Texas A&M University", "Georgia Institute of Technology", "University of Minnesota", "Michigan State University", "Indiana University", "University of Colorado", "University of Arizona", "University of Pittsburgh", "University of Maryland", "Rutgers University", "University of Rochester", "University of Connecticut", "University of Georgia", "University of Iowa", "University of Kansas", "University of Kentucky", "University of Missouri", "University of Nebraska", "University of Tennessee", "University of Utah", "University of Oklahoma", "University of Oregon", "University of South Carolina", "University of Alabama", "University of Central Florida", "University of Houston", "University of Delaware", "University of Mississippi", "University of Arkansas", "Florida State University", "Arizona State University", "Colorado State University", "North Carolina State University", "Iowa State University", "Kansas State University", "Louisiana State University", "Oregon State University", "South Carolina State University", "Virginia Tech", "Auburn University", "Temple University", "University of Massachusetts", "Baylor University", "Southern Methodist University", "Wake Forest University", "George Washington University", "American University", "Villanova University", "Marquette University", "Pepperdine University", "Loyola Marymount University", "Santa Clara University", "Fordham University", "DePaul University", "Syracuse University", "Rensselaer Polytechnic Institute", "Stevens Institute of Technology", "Illinois Institute of Technology", "Clark University", "Tufts University", "Brandeis University", "Case Western Reserve University", "Drexel University", "Lehigh University", "Howard University", "Spelman College", "Morehouse College", "Hampton University", "Xavier University of Louisiana", "Tuskegee University", "Florida A&M University", "Colorado School of Mines" ], "description": "Ensure proper capitalization of major universities in the United States." }, "NotablePlaces": { "canonical": [ "Big Sur", "Bretton Woods", "Coney Island", "Darien Gap", "Des Moines", "El Paso", "Hong Kong", "Las Palmas", "Las Vegas", "Los Angeles", "New York", "New York City", "Niagara Falls", "Novi Sad", "Panama Canal", "Rio de Janeiro", "San Francisco" ], "description": "Ensure proper capitalization of notable places that are significant regional centers, travel destinations, or have international importance." }, "ProperNouns": { "canonical": ["Bhagavad Gita", "Gilded Age", "Pax Americana"], "description": "Ensure proper capitalization of proper nouns." }, "CompaniesProductsAndTrademarks": { "canonical": ["Stack Exchange", "Stack Overflow"], "description": "Ensure proper capitalization of companies, products, and trademarks." } } ================================================ FILE: harper-core/src/case.rs ================================================ use std::borrow::Borrow; use smallvec::SmallVec; use crate::{CharString, char_string::CHAR_STRING_INLINE_SIZE}; /// Apply the casing of `template` to `target`. /// /// If `template` is shorter than `target`, the casing of the last character of `template` will be reused for /// the rest of the string. /// /// If `template` is empty, all characters will be lowercased. #[must_use] pub fn copy_casing( template: impl IntoIterator>, target: impl IntoIterator>, ) -> CharString { target .into_iter() .scan( (template.into_iter().get_casing(), Case::Lower), |(template, prev_case), c| { // Skip non-alphabetic characters in `target` without advancing `template`. if c.borrow().is_alphabetic() && let Some(template_case) = template.next() { *prev_case = template_case; }; Some(prev_case.apply_to(*c.borrow())) }, ) .flatten() .collect() } /// Represents the casing of a character. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Case { Upper, Lower, } impl Case { /// Apply the casing to a provided character. /// /// This essentially calls [`char::to_uppercase()`] or [`char::to_lowercase()`] depending on /// the state of `self`. Similarly to those functions, it returns an iterator of the resulting /// character(s). pub fn apply_to(&self, char: char) -> impl Iterator + use<> { match self { Self::Upper => char.to_uppercase().collect::>(), Self::Lower => char.to_lowercase().collect::>(), } .into_iter() } } impl TryFrom for Case { type Error = (); /// Try to get the casing from the given character. /// /// This fails if the character is neither uppercase nor lowercase. fn try_from(value: char) -> Result { if value.is_uppercase() { Ok(Self::Upper) } else if value.is_lowercase() { Ok(Self::Lower) } else { Err(()) } } } // TODO: maybe move this functionality to CharStringExt if and when CharStringExt can be // generalized to work with char iterators. pub trait CaseIterExt { fn get_casing(self) -> impl Iterator; fn get_casing_unfiltered(self) -> SmallVec<[Option; CHAR_STRING_INLINE_SIZE]>; } impl, T: Borrow> CaseIterExt for I { /// Get an iterator of [`Case`] from a collection of characters. Note that this will not /// include cases for characters that are neither uppercase nor lowercase. fn get_casing(self) -> impl Iterator { self.into_iter() .filter_map(|char| (*char.borrow()).try_into().ok()) } /// Get casing for the provided string. Unlike [`Self::get_casing`], the output will always /// be the same length as the input string. If a character is neither uppercase nor lowercase, /// its corresponding case will be `None`. fn get_casing_unfiltered(self) -> SmallVec<[Option; CHAR_STRING_INLINE_SIZE]> { self.into_iter() .map(|c| Case::try_from(*c.borrow()).ok()) .collect() } } ================================================ FILE: harper-core/src/char_ext.rs ================================================ use unicode_script::{Script, UnicodeScript}; use unicode_width::UnicodeWidthChar; use crate::Punctuation; mod private { pub trait Sealed {} impl Sealed for char {} } pub trait CharExt: private::Sealed { fn is_cjk(&self) -> bool; /// Whether a character can be a component of an English word. fn is_english_lingual(&self) -> bool; fn is_emoji(&self) -> bool; fn is_punctuation(&self) -> bool; /// Whether the character is an (English) vowel. /// /// Checks whether the character is in the set (A, E, I, O, U); case-insensitive. fn is_vowel(&self) -> bool; fn normalized(&self) -> Self; } impl CharExt for char { fn is_english_lingual(&self) -> bool { !self.is_whitespace() && !self.is_numeric() && !self.is_emoji() && matches!(self.width(), Some(1..)) && !self.is_punctuation() && self.is_alphabetic() && !self.is_cjk() && self.script() == Script::Latin } fn normalized(&self) -> Self { match self { '\u{2018}' | '\u{2019}' | '\u{02BC}' | '\u{FF07}' => '\'', '\u{201C}' | '\u{201D}' | '\u{FF02}' => '"', '\u{2013}' | '\u{2014}' | '\u{2212}' | '\u{FF0D}' => '-', _ => *self, } } fn is_emoji(&self) -> bool { let Some(block) = unicode_blocks::find_unicode_block(*self) else { return false; }; let blocks = [ unicode_blocks::SPECIALS, unicode_blocks::EMOTICONS, unicode_blocks::MISCELLANEOUS_SYMBOLS, unicode_blocks::VARIATION_SELECTORS, unicode_blocks::SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS, ]; blocks.contains(&block) } fn is_cjk(&self) -> bool { let Some(block) = unicode_blocks::find_unicode_block(*self) else { return false; }; let blocks = [ unicode_blocks::CJK_UNIFIED_IDEOGRAPHS, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_H, unicode_blocks::CJK_UNIFIED_IDEOGRAPHS_EXTENSION_I, unicode_blocks::HANGUL_JAMO, unicode_blocks::HANGUL_SYLLABLES, unicode_blocks::HANGUL_JAMO_EXTENDED_A, unicode_blocks::HANGUL_JAMO_EXTENDED_B, unicode_blocks::HANGUL_COMPATIBILITY_JAMO, unicode_blocks::CJK_SYMBOLS_AND_PUNCTUATION, unicode_blocks::CJK_STROKES, unicode_blocks::CJK_COMPATIBILITY, unicode_blocks::CJK_COMPATIBILITY_FORMS, unicode_blocks::CJK_COMPATIBILITY_IDEOGRAPHS, unicode_blocks::CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT, unicode_blocks::CJK_RADICALS_SUPPLEMENT, unicode_blocks::ENCLOSED_CJK_LETTERS_AND_MONTHS, unicode_blocks::HIRAGANA, ]; blocks.contains(&block) } fn is_punctuation(&self) -> bool { Punctuation::from_char(*self).is_some() } fn is_vowel(&self) -> bool { matches!(self.to_ascii_lowercase(), 'a' | 'e' | 'i' | 'o' | 'u') } } #[cfg(test)] mod tests { use super::CharExt; #[test] fn cjk_is_not_english_lingual() { assert!(!'世'.is_english_lingual()) } } ================================================ FILE: harper-core/src/char_string.rs ================================================ use crate::char_ext::CharExt; use std::borrow::Cow; use smallvec::SmallVec; // TODO: remove this when `SmallVec` allows retrieving this value in a const context. pub(crate) const CHAR_STRING_INLINE_SIZE: usize = 16; /// A char sequence that improves cache locality. /// Most English words are fewer than 12 characters. pub type CharString = SmallVec<[char; CHAR_STRING_INLINE_SIZE]>; mod private { pub trait Sealed {} impl Sealed for [char] {} } /// Extensions to character sequences that make them easier to wrangle. pub trait CharStringExt: private::Sealed { /// Convert all characters to lowercase, returning a new owned vector if any changes were made. fn to_lower(&'_ self) -> Cow<'_, [char]>; /// Normalize the character sequence according to the dictionary's standard character set. fn normalized(&'_ self) -> Cow<'_, [char]>; /// Convert the character sequence to a String. fn to_string(&self) -> String; /// Case-insensitive comparison with a character slice, assuming the right-hand side is lowercase ASCII. /// Only normalizes the left side to lowercase and avoids allocations. fn eq_ignore_ascii_case_chars(&self, other: &[char]) -> bool; /// Case-insensitive comparison with a string slice, assuming the right-hand side is lowercase ASCII. /// Only normalizes the left side to lowercase and avoids allocations. fn eq_ignore_ascii_case_str(&self, other: &str) -> bool; /// Case-insensitive comparison with any of a list of string slices, assuming the right-hand side is lowercase ASCII. /// Only normalizes the left side to lowercase and avoids allocations. fn eq_any_ignore_ascii_case_str(&self, others: &[&str]) -> bool; /// Case-insensitive comparison with any of a list of character slices, assuming the right-hand side is lowercase ASCII. /// Only normalizes the left side to lowercase and avoids allocations. fn eq_any_ignore_ascii_case_chars(&self, others: &[&[char]]) -> bool; /// Case-insensitive check if the string starts with the given ASCII prefix. /// The prefix is assumed to be lowercase. fn starts_with_ignore_ascii_case_str(&self, prefix: &str) -> bool; /// Case-insensitive check if the string starts with any of the given ASCII prefixes. /// The prefixes are assumed to be lowercase. fn starts_with_any_ignore_ascii_case_str(&self, prefixes: &[&str]) -> bool; /// Case-insensitive check if the string ends with the given ASCII suffix. /// The suffix is assumed to be lowercase. fn ends_with_ignore_ascii_case_chars(&self, suffix: &[char]) -> bool; /// Case-insensitive check if the string ends with the given ASCII suffix. /// The suffix is assumed to be lowercase. fn ends_with_ignore_ascii_case_str(&self, suffix: &str) -> bool; /// Case-insensitive check if the string ends with any of the given ASCII suffixes. /// The suffixes are assumed to be lowercase. fn ends_with_any_ignore_ascii_case_chars(&self, suffixes: &[&[char]]) -> bool; /// Check if the string contains any vowels fn contains_vowel(&self) -> bool; } impl CharStringExt for [char] { fn to_lower(&'_ self) -> Cow<'_, [char]> { if self.iter().all(|c| c.is_lowercase()) { return Cow::Borrowed(self); } let mut out = CharString::with_capacity(self.len()); out.extend(self.iter().flat_map(|v| v.to_lowercase())); Cow::Owned(out.to_vec()) } fn to_string(&self) -> String { self.iter().collect() } /// Convert a given character sequence to the standard character set /// the dictionary is in. fn normalized(&'_ self) -> Cow<'_, [char]> { if self.as_ref().iter().any(|c| c.normalized() != *c) { Cow::Owned( self.as_ref() .iter() .copied() .map(|c| c.normalized()) .collect(), ) } else { Cow::Borrowed(self) } } fn eq_ignore_ascii_case_str(&self, other: &str) -> bool { let mut chit = self.iter(); let mut strit = other.chars(); loop { let (c, s) = (chit.next(), strit.next()); match (c, s) { (Some(c), Some(s)) => { if c.to_ascii_lowercase() != s { return false; } } (None, None) => return true, _ => return false, } } } fn eq_ignore_ascii_case_chars(&self, other: &[char]) -> bool { self.len() == other.len() && self .iter() .zip(other.iter()) .all(|(a, b)| a.to_ascii_lowercase() == *b) } fn eq_any_ignore_ascii_case_str(&self, others: &[&str]) -> bool { others.iter().any(|str| self.eq_ignore_ascii_case_str(str)) } fn eq_any_ignore_ascii_case_chars(&self, others: &[&[char]]) -> bool { others .iter() .any(|chars| self.eq_ignore_ascii_case_chars(chars)) } fn starts_with_ignore_ascii_case_str(&self, prefix: &str) -> bool { let prefix_len = prefix.chars().count(); if self.len() < prefix_len { return false; } self.iter() .take(prefix_len) .zip(prefix.chars()) .all(|(a, b)| a.to_ascii_lowercase() == b) } fn starts_with_any_ignore_ascii_case_str(&self, prefixes: &[&str]) -> bool { prefixes .iter() .any(|prefix| self.starts_with_ignore_ascii_case_str(prefix)) } fn ends_with_ignore_ascii_case_str(&self, suffix: &str) -> bool { let suffix_len = suffix.chars().count(); if self.len() < suffix_len { return false; } self.iter() .rev() .take(suffix_len) .rev() .zip(suffix.chars()) .all(|(a, b)| a.to_ascii_lowercase() == b) } fn ends_with_ignore_ascii_case_chars(&self, suffix: &[char]) -> bool { let suffix_len = suffix.len(); if self.len() < suffix_len { return false; } self.iter() .rev() .take(suffix_len) .rev() .zip(suffix.iter()) .all(|(a, b)| a.to_ascii_lowercase() == *b) } fn ends_with_any_ignore_ascii_case_chars(&self, suffixes: &[&[char]]) -> bool { suffixes .iter() .any(|suffix| self.ends_with_ignore_ascii_case_chars(suffix)) } fn contains_vowel(&self) -> bool { self.iter().any(|c| c.is_vowel()) } } macro_rules! char_string { ($string:literal) => {{ use crate::char_string::CharString; $string.chars().collect::() }}; } pub(crate) use char_string; #[cfg(test)] mod tests { use super::CharStringExt; #[test] fn eq_ignore_ascii_case_chars_matches_lowercase() { assert!(['H', 'e', 'l', 'l', 'o'].eq_ignore_ascii_case_chars(&['h', 'e', 'l', 'l', 'o'])); } #[test] fn eq_ignore_ascii_case_chars_does_not_match_different_word() { assert!(!['H', 'e', 'l', 'l', 'o'].eq_ignore_ascii_case_chars(&['w', 'o', 'r', 'l', 'd'])); } #[test] fn eq_ignore_ascii_case_str_matches_lowercase() { assert!(['H', 'e', 'l', 'l', 'o'].eq_ignore_ascii_case_str("hello")); } #[test] fn eq_ignore_ascii_case_str_does_not_match_different_word() { assert!(!['H', 'e', 'l', 'l', 'o'].eq_ignore_ascii_case_str("world")); } #[test] fn ends_with_ignore_ascii_case_chars_matches_suffix() { assert!(['H', 'e', 'l', 'l', 'o'].ends_with_ignore_ascii_case_chars(&['l', 'o'])); } #[test] fn ends_with_ignore_ascii_case_chars_does_not_match_different_suffix() { assert!( !['H', 'e', 'l', 'l', 'o'] .ends_with_ignore_ascii_case_chars(&['w', 'o', 'r', 'l', 'd']) ); } #[test] fn ends_with_ignore_ascii_case_str_matches_suffix() { assert!(['H', 'e', 'l', 'l', 'o'].ends_with_ignore_ascii_case_str("lo")); } #[test] fn ends_with_ignore_ascii_case_str_does_not_match_different_suffix() { assert!(!['H', 'e', 'l', 'l', 'o'].ends_with_ignore_ascii_case_str("world")); } #[test] fn differs_only_by_length_1() { assert!(!['b', 'b'].eq_ignore_ascii_case_str("b")); } #[test] fn differs_only_by_length_2() { assert!(!['c'].eq_ignore_ascii_case_str("cc")); } } ================================================ FILE: harper-core/src/currency.rs ================================================ use is_macro::Is; use serde::{Deserialize, Serialize}; use crate::Number; /// A national or international currency #[derive(Debug, Is, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Hash)] pub enum Currency { // $ Dollar, // ¢ Cent, // € Euro, // ₽ Ruble, // ₺ Lira, // £ Pound, // ¥ Yen, // ฿ Baht, // ₩ Won, // ₭, Kip, // ₹ Rupee, } impl Currency { pub fn from_char(c: char) -> Option { let cur = match c { '$' => Self::Dollar, '¢' => Self::Cent, '€' => Self::Euro, '₽' => Self::Ruble, '₺' => Self::Lira, '£' => Self::Pound, '¥' => Self::Yen, '฿' => Self::Baht, '₩' => Self::Won, '₭' => Self::Kip, '₹' => Self::Rupee, _ => return None, }; Some(cur) } pub fn to_char(&self) -> char { match self { Self::Dollar => '$', Self::Cent => '¢', Self::Euro => '€', Self::Ruble => '₽', Self::Lira => '₺', Self::Pound => '£', Self::Yen => '¥', Self::Baht => '฿', Self::Won => '₩', Self::Kip => '₭', Self::Rupee => '₹', } } /// Format an amount of the specific currency. pub fn format_amount(&self, amount: &Number) -> String { let c = self.to_char(); let amount = amount.to_string(); match self { Currency::Dollar => format!("{c}{amount}"), Currency::Cent => format!("{amount}{c}"), Currency::Euro => format!("{c}{amount}"), Currency::Ruble => format!("{amount} {c}"), Currency::Lira => format!("{amount} {c}"), Currency::Pound => format!("{c}{amount}"), Currency::Yen => format!("{c} {amount}"), Currency::Baht => format!("{amount} {c}"), Currency::Won => format!("{c} {amount}"), Currency::Kip => format!("{c}{amount}"), Currency::Rupee => format!("{c}{amount}"), } } } ================================================ FILE: harper-core/src/dict_word_metadata.rs ================================================ use harper_brill::UPOS; use is_macro::Is; use itertools::Itertools; use paste::paste; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; use strum::{EnumCount as _, VariantArray as _}; use strum_macros::{Display, EnumCount, EnumIter, EnumString, VariantArray}; use std::convert::TryFrom; use crate::dict_word_metadata_orthography::OrthFlags; use crate::spell::WordId; use crate::{Document, TokenKind, TokenStringExt}; /// This represents a "lexeme" or "headword" which is case-folded but affix-expanded. /// So not only lemmata but also inflected forms are stored here, with "horn" and "horns" each /// having their own lexeme, but "Ivy" and "ivy" sharing the same lexeme. #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Hash)] pub struct DictWordMetadata { /// The main parts of speech which have extra data. pub noun: Option, pub pronoun: Option, pub verb: Option, pub adjective: Option, pub adverb: Option, pub conjunction: Option, pub determiner: Option, pub affix: Option, /// Parts of speech which don't have extra data. /// Whether the word is a [preposition](https://www.merriam-webster.com/dictionary/preposition). #[serde(default = "default_false")] pub preposition: bool, /// Whether the word is an offensive word. pub swear: Option, /// The dialects this word belongs to. /// If no dialects are defined, it can be assumed that the word is /// valid in all dialects of English. #[serde(default = "default_default")] pub dialects: DialectFlags, /// Orthographic information: letter case, spaces, hyphens, etc. #[serde(default = "OrthFlags::empty")] pub orth_info: OrthFlags, /// Whether the word is considered especially common. #[serde(default = "default_false")] pub common: bool, #[serde(default = "default_none")] pub derived_from: Option, /// Generated by a chunker. Declares whether the word is a member of a nominal phrase. Using /// this should be preferred over the similarly named `Pattern`. /// /// For more details, see [the announcement blog post](https://elijahpotter.dev/articles/training_a_chunker_with_burn). pub np_member: Option, /// Generated by a POS tagger. Declares what it inferred the word's part of speech to be. pub pos_tag: Option, } /// Needed for `serde` fn default_false() -> bool { false } /// Needed for `serde` fn default_none() -> Option { None } /// Needed for `serde` fn default_default() -> T { T::default() } macro_rules! generate_metadata_queries { ($($category:ident has $($sub:ident),*).*) => { paste! { pub fn is_likely_homograph(&self) -> bool { [self.is_determiner(), self.preposition, $( self.[< is_ $category >](), )*].iter().map(|b| *b as u8).sum::() > 1 } /// How different is this word from another? pub fn difference(&self, other: &Self) -> u32 { [ $( Self::[< is_ $category >], $( Self::[< is_ $sub _ $category >], Self::[< is_non_ $sub _ $category >], )* )* ] .iter() .fold(0, |acc, func| acc + (func(self) ^ func(other)) as u32) } $( #[doc = concat!("Checks if the word is definitely a ", stringify!($category), ".")] pub fn [< is_ $category >](&self) -> bool { self.$category.is_some() } $( #[doc = concat!("Checks if the word is definitely a ", stringify!($category), " and more specifically is labeled as (a) ", stringify!($sub), ".")] pub fn [< is_ $sub _ $category >](&self) -> bool { matches!( self.$category, Some([< $category:camel Data >]{ [< is_ $sub >]: Some(true), .. }) ) } #[doc = concat!("Checks if the word is definitely a ", stringify!($category), " and more specifically is labeled as __not__ (a) ", stringify!($sub), ".")] pub fn [< is_non_ $sub _ $category >](&self) -> bool { matches!( self.$category, Some([< $category:camel Data >]{ [< is_ $sub >]: None | Some(false), .. }) ) } )* )* } }; } impl DictWordMetadata { /// If there is only one possible interpretation of the metadata, infer its UPOS tag. pub fn infer_pos_tag(&self) -> Option { // If an explicit POS tag exists, return it immediately. if let Some(pos) = self.pos_tag { return Some(pos); } // Collect all possible POS tags from metadata let mut candidates = SmallVec::<[UPOS; 14]>::with_capacity(14); if self.is_proper_noun() { candidates.push(UPOS::PROPN); } if self.is_pronoun() { candidates.push(UPOS::PRON); } if self.is_noun() { candidates.push(UPOS::NOUN); } if self.is_verb() { // Distinguish auxiliary verbs if let Some(data) = &self.verb { if data.is_auxiliary == Some(true) { candidates.push(UPOS::AUX); } else { candidates.push(UPOS::VERB); } } else { candidates.push(UPOS::VERB); } } if self.is_adjective() { candidates.push(UPOS::ADJ); } if self.is_adverb() { candidates.push(UPOS::ADV); } if self.is_conjunction() { candidates.push(UPOS::CCONJ); } if self.is_determiner() { candidates.push(UPOS::DET); } if self.preposition { candidates.push(UPOS::ADP); } // Remove duplicates candidates.sort(); candidates.dedup(); candidates.into_iter().exactly_one().ok() } /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, other: &Self) -> Self { let mut clone = self.clone(); clone.merge(other); clone } /// Given a UPOS tag, discard any metadata that would disagree with the given POS tag. /// For example, if the metadata suggests a word could either be a noun or an adjective, and we /// provide a [`UPOS::NOUN`], this function will remove the adjective data. /// /// Additionally, if the metadata does not currently declare the potential of the word to be /// the specific POS, it becomes so. That means if we provide a [`UPOS::ADJ`] to the function /// for a metadata whose `Self::adjective = None`, it will become `Some`. pub fn enforce_pos_exclusivity(&mut self, pos: &UPOS) { use UPOS::*; match pos { NOUN => { if let Some(noun) = self.noun { self.noun = Some(NounData { is_proper: Some(false), ..noun }) } else { self.noun = Some(NounData { is_proper: Some(false), is_singular: None, is_plural: None, is_countable: None, is_mass: None, is_possessive: None, }) } self.pronoun = None; self.verb = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } PROPN => { if let Some(noun) = self.noun { self.noun = Some(NounData { is_proper: Some(true), ..noun }) } else { self.noun = Some(NounData { is_proper: Some(true), is_singular: None, is_plural: None, is_countable: None, is_mass: None, is_possessive: None, }) } self.pronoun = None; self.verb = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } PRON => { if self.pronoun.is_none() { self.pronoun = Some(PronounData::default()) } self.noun = None; self.verb = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } VERB => { if let Some(verb) = self.verb { self.verb = Some(VerbData { is_auxiliary: Some(false), ..verb }) } else { self.verb = Some(VerbData { is_auxiliary: Some(false), ..Default::default() }) } self.noun = None; self.pronoun = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } AUX => { if let Some(verb) = self.verb { self.verb = Some(VerbData { is_auxiliary: Some(true), ..verb }) } else { self.verb = Some(VerbData { is_auxiliary: Some(true), ..Default::default() }) } self.noun = None; self.pronoun = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } ADJ => { if self.adjective.is_none() { self.adjective = Some(AdjectiveData::default()) } self.noun = None; self.pronoun = None; self.verb = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } ADV => { if self.adverb.is_none() { self.adverb = Some(AdverbData::default()) } self.noun = None; self.pronoun = None; self.verb = None; self.adjective = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = false; } ADP => { self.noun = None; self.pronoun = None; self.verb = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.determiner = None; self.affix = None; self.preposition = true; } DET => { self.noun = None; self.pronoun = None; self.verb = None; self.adjective = None; self.adverb = None; self.conjunction = None; self.affix = None; self.preposition = false; self.determiner = Some(DeterminerData::default()); } CCONJ | SCONJ => { if self.conjunction.is_none() { self.conjunction = Some(ConjunctionData::default()) } self.noun = None; self.pronoun = None; self.verb = None; self.adjective = None; self.adverb = None; self.determiner = None; self.affix = None; self.preposition = false; } _ => {} } } generate_metadata_queries!( // Singular and countable default to true, so their metadata queries are not generated. noun has proper, plural, mass, possessive. pronoun has personal, singular, plural, possessive, reflexive, subject, object. determiner has demonstrative, possessive, quantifier. verb has linking, auxiliary. conjunction has. adjective has. adverb has manner, frequency, degree ); // Manual metadata queries // Pronoun metadata queries pub fn get_person(&self) -> Option { self.pronoun.as_ref().and_then(|p| p.person) } pub fn is_first_person_plural_pronoun(&self) -> bool { matches!( self.pronoun, Some(PronounData { person: Some(Person::First), is_plural: Some(true), .. }) ) } pub fn is_first_person_singular_pronoun(&self) -> bool { matches!( self.pronoun, Some(PronounData { person: Some(Person::First), is_singular: Some(true), .. }) ) } pub fn is_third_person_plural_pronoun(&self) -> bool { matches!( self.pronoun, Some(PronounData { person: Some(Person::Third), is_plural: Some(true), .. }) ) } pub fn is_third_person_singular_pronoun(&self) -> bool { matches!( self.pronoun, Some(PronounData { person: Some(Person::Third), is_singular: Some(true), .. }) ) } pub fn is_third_person_pronoun(&self) -> bool { matches!( self.pronoun, Some(PronounData { person: Some(Person::Third), .. }) ) } pub fn is_second_person_pronoun(&self) -> bool { matches!( self.pronoun, Some(PronounData { person: Some(Person::Second), .. }) ) } // Lemma is default if no verb form is specified in the dictionary pub fn is_verb_lemma(&self) -> bool { if let Some(verb) = self.verb { if let Some(forms) = verb.verb_forms { return forms.is_empty() || forms.contains(VerbFormFlags::LEMMA); } else { return true; } } false } pub fn is_verb_past_form(&self) -> bool { self.verb.is_some_and(|v| { v.verb_forms .is_some_and(|vf| vf.contains(VerbFormFlags::PAST)) }) } pub fn is_verb_simple_past_form(&self) -> bool { self.verb.is_some_and(|v| { v.verb_forms .is_some_and(|vf| vf.contains(VerbFormFlags::PRETERITE)) }) } pub fn is_verb_past_participle_form(&self) -> bool { self.verb.is_some_and(|v| { v.verb_forms .is_some_and(|vf| vf.contains(VerbFormFlags::PAST_PARTICIPLE)) }) } pub fn is_verb_progressive_form(&self) -> bool { self.verb.is_some_and(|v| { v.verb_forms .is_some_and(|vf| vf.contains(VerbFormFlags::PROGRESSIVE)) }) } pub fn is_verb_third_person_singular_present_form(&self) -> bool { self.verb.is_some_and(|v| { v.verb_forms .is_some_and(|vf| vf.contains(VerbFormFlags::THIRD_PERSON_SINGULAR)) }) } // Noun metadata queries // Singular is default if number is not marked in the dictionary. pub fn is_singular_noun(&self) -> bool { if let Some(noun) = self.noun { matches!( (noun.is_singular, noun.is_plural), (Some(true), _) | (None | Some(false), None | Some(false)) ) } else { false } } pub fn is_non_singular_noun(&self) -> bool { if let Some(noun) = self.noun { !matches!( (noun.is_singular, noun.is_plural), (Some(true), _) | (None | Some(false), None | Some(false)) ) } else { false } } // Countable is default if countability is not marked in the dictionary. pub fn is_countable_noun(&self) -> bool { if let Some(noun) = self.noun { matches!( (noun.is_countable, noun.is_mass), (Some(true), _) | (None | Some(false), None | Some(false)) ) } else { false } } pub fn is_non_countable_noun(&self) -> bool { if let Some(noun) = self.noun { !matches!( (noun.is_countable, noun.is_mass), (Some(true), _) | (None | Some(false), None | Some(false)) ) } else { false } } // Most mass nouns also have countable senses. Match those that are only mass nouns. pub fn is_mass_noun_only(&self) -> bool { if let Some(noun) = self.noun { matches!( (noun.is_countable, noun.is_mass), (None | Some(false), Some(true)) ) } else { false } } // Nominal metadata queries (noun + pronoun) /// Checks if the word is definitely nominal. pub fn is_nominal(&self) -> bool { self.is_noun() || self.is_pronoun() } /// Checks if the word is definitely a nominal and more specifically is labeled as (a) singular. pub fn is_singular_nominal(&self) -> bool { self.is_singular_noun() || self.is_singular_pronoun() } /// Checks if the word is definitely a nominal and more specifically is labeled as (a) plural. pub fn is_plural_nominal(&self) -> bool { self.is_plural_noun() || self.is_plural_pronoun() } /// Checks if the word is definitely a nominal and more specifically is labeled as (a) possessive. /// NOTE: `possessive pronoun`s are not qualifiers, but words like `mine`, `yours`, etc. /// The terminology of `possessive noun`, `possessive pronoun` and `possessive determiner` only /// tends to reinforce this confusion. pub fn is_possessive_nominal(&self) -> bool { self.is_possessive_noun() || self.is_possessive_determiner() } /// Checks if the word is definitely a nominal and more specifically is labeled as __not__ (a) singular. pub fn is_non_singular_nominal(&self) -> bool { self.is_non_singular_noun() || self.is_non_singular_pronoun() } /// Checks if the word is definitely a nominal and more specifically is labeled as __not__ (a) plural. pub fn is_non_plural_nominal(&self) -> bool { self.is_non_plural_noun() || self.is_non_plural_pronoun() } // Adjective metadata queries pub fn get_degree(&self) -> Option { self.adjective.as_ref().and_then(|a| a.degree) } pub fn is_comparative_adjective(&self) -> bool { matches!( self.adjective, Some(AdjectiveData { degree: Some(Degree::Comparative) }) ) } pub fn is_superlative_adjective(&self) -> bool { matches!( self.adjective, Some(AdjectiveData { degree: Some(Degree::Superlative) }) ) } // Degree::Positive is the default if degree is not marked in the dictionary. pub fn is_positive_adjective(&self) -> bool { match self.adjective { Some(AdjectiveData { degree: Some(Degree::Positive), }) => true, Some(AdjectiveData { degree: None }) => true, Some(AdjectiveData { degree: Some(degree), }) => !matches!(degree, Degree::Comparative | Degree::Superlative), _ => false, } } // Determiner metadata queries // Checks if the word is definitely a determiner and more specifically is labeled as (a) quantifier. pub fn is_quantifier(&self) -> bool { self.is_quantifier_determiner() } // Non-POS queries /// Checks whether a word is _definitely_ a swear. pub fn is_swear(&self) -> bool { matches!(self.swear, Some(true)) } // Orthographic queries /// Does the metadata for this word cover an all-lowercase variant? (e.g., "hello") /// /// This returns true if all letters in the word are lowercase. Words containing /// non-letter characters (like numbers or symbols) are only considered if all /// letter characters are lowercase. pub fn is_lowercase(&self) -> bool { self.orth_info.contains(OrthFlags::LOWERCASE) } /// Does the metadata for this word cover a titlecase variant? (e.g., "Hello") /// /// This returns true if the word is in titlecase form, which means: /// - The first letter is uppercase /// - All other letters are lowercase /// - The word is at least 2 characters long /// /// Examples: "Hello", "World" /// /// Note: Words with internal capital letters (like "McDonald") or apostrophes (like "O'Reilly") /// are not considered titlecase - they are classified as UPPER_CAMEL instead. pub fn is_titlecase(&self) -> bool { self.orth_info.contains(OrthFlags::TITLECASE) } /// Does the metadata for this word cover an all-uppercase variant? (e.g., "HELLO") /// /// This returns true if all letters in the word are uppercase. Words containing /// non-letter characters (like numbers or symbols) are only considered if all /// letter characters are uppercase. /// /// Examples: "HELLO", "NASA", "I" pub fn is_allcaps(&self) -> bool { self.orth_info.contains(OrthFlags::ALLCAPS) } /// Does the metadata for this word cover a lower camel case variant? (e.g., "helloWorld") /// /// This returns true if the word is in lower camel case, which means: /// - The first letter is lowercase /// - There is at least one uppercase letter after the first character /// - The word must be at least 2 characters long /// /// Examples: "helloWorld", "getHTTPResponse", "eBay" /// /// Note: Single words that are all lowercase will return false. /// Words starting with an uppercase letter will return false (those would be UpperCamel). pub fn is_lower_camel(&self) -> bool { self.orth_info.contains(OrthFlags::LOWER_CAMEL) } /// Does the metadata for this word cover an upper camel case / pascal case variant? (e.g., "HelloWorld") /// /// This returns true if the word is in upper camel case (also known as Pascal case), which means: /// - The first letter is uppercase /// - There is at least one other uppercase letter after the first character /// - There is at least one lowercase letter after the first uppercase letter /// - The word must be at least 3 characters long /// /// Examples: /// - "HelloWorld" (standard Pascal case) /// - "McDonald" (name with internal caps) /// - "O'Reilly" (name with apostrophe and internal caps) /// - "HttpRequest" (initialism followed by word) /// /// Note: Single words that are titlecase (like "Hello") will return false. /// Words that are all uppercase (like "NASA") will also return false. pub fn is_upper_camel(&self) -> bool { self.orth_info.contains(OrthFlags::UPPER_CAMEL) } /// Does the metadata for this word cover an apostrophized variant? (e.g., "doesn't") pub fn is_apostrophized(&self) -> bool { self.orth_info.contains(OrthFlags::APOSTROPHE) } pub fn is_roman_numerals(&self) -> bool { self.orth_info.contains(OrthFlags::ROMAN_NUMERALS) } /// Same thing as [`Self::or`], except in-place rather than a clone. pub fn merge(&mut self, other: &Self) -> &mut Self { macro_rules! merge { ($a:expr, $b:expr) => { match ($a, $b) { (Some(a), Some(b)) => Some(a.or(&b)), (Some(a), None) => Some(a), (None, Some(b)) => Some(b), (None, None) => None, } }; } self.noun = merge!(self.noun, other.noun); self.pronoun = merge!(self.pronoun, other.pronoun); self.verb = merge!(self.verb, other.verb); self.adjective = merge!(self.adjective, other.adjective); self.adverb = merge!(self.adverb, other.adverb); self.conjunction = merge!(self.conjunction, other.conjunction); self.determiner = merge!(self.determiner, other.determiner); self.affix = merge!(self.affix, other.affix); self.preposition |= other.preposition; self.dialects |= other.dialects; self.orth_info |= other.orth_info; self.swear = self.swear.or(other.swear); self.common |= other.common; self.derived_from = self.derived_from.or(other.derived_from); self.pos_tag = self.pos_tag.or(other.pos_tag); self.np_member = self.np_member.or(other.np_member); self } } // These verb forms are morphological variations, distinct from TAM (Tense-Aspect-Mood) // Each form can be used in various TAM combinations: // - Lemma form (infinitive, citation form, dictionary form) // Used in infinitives (e.g., "to sleep"), imperatives (e.g., "sleep!"), and with modals (e.g., "will sleep") // - Past form (past participle and simple past) // Used as verbs (e.g., "slept") or adjectives (e.g., "closed door") // - Progressive form (present participle and gerund) // Used as verbs (e.g., "sleeping"), nouns (e.g., "sleeping is important"), or adjectives (e.g., "sleeping dog") // - Third person singular present (-s/-es) // Used for third person singular subjects (e.g., "he sleeps", "she reads") // // Important notes: // 1. English expresses time through auxiliary verbs, not verb form alone // 2. Irregular verbs can have different forms for past participle and simple past // 3. Future is always expressed through auxiliary verbs (e.g., "will sleep", "going to sleep") #[repr(u32)] pub enum VerbForm { /// The uninflected verb form: "walk", "eat" LemmaForm = 1 << 0, /// The past form for regular verbs: "walked" PastForm = 1 << 1, /// The simple past/preterite form for irregular verbs: "ate" SimplePastForm = 1 << 2, /// The past participle form for irregular verbs: "eaten" PastParticipleForm = 1 << 3, /// The progressive/continuous/gerund/present participle form: "walking", "eating" ProgressiveForm = 1 << 4, /// The third person singular present form: "walks", "eats" ThirdPersonSingularPresentForm = 1 << 5, } /// The underlying type used for verb form flags. pub type VerbFormFlagsUnderlyingType = u32; bitflags::bitflags! { /// A collection of bit flags used to represent verb forms. /// /// This allows a word to be tagged with multiple verb forms when applicable. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] #[serde(transparent)] pub struct VerbFormFlags: VerbFormFlagsUnderlyingType { const LEMMA = VerbForm::LemmaForm as VerbFormFlagsUnderlyingType; const PAST = VerbForm::PastForm as VerbFormFlagsUnderlyingType; const PRETERITE = VerbForm::SimplePastForm as VerbFormFlagsUnderlyingType; const PAST_PARTICIPLE = VerbForm::PastParticipleForm as VerbFormFlagsUnderlyingType; const PROGRESSIVE = VerbForm::ProgressiveForm as VerbFormFlagsUnderlyingType; const THIRD_PERSON_SINGULAR = VerbForm::ThirdPersonSingularPresentForm as VerbFormFlagsUnderlyingType; } } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct VerbData { pub is_linking: Option, pub is_auxiliary: Option, #[serde(rename = "verb_form", default)] pub verb_forms: Option, } impl VerbData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, other: &Self) -> Self { let verb_forms = match (self.verb_forms, other.verb_forms) { (Some(self_verb_forms), Some(other_verb_forms)) => { Some(self_verb_forms | other_verb_forms) } (Some(self_verb_forms), None) => Some(self_verb_forms), (None, Some(other_verb_forms)) => Some(other_verb_forms), (None, None) => None, }; Self { is_linking: self.is_linking.or(other.is_linking), is_auxiliary: self.is_auxiliary.or(other.is_auxiliary), verb_forms, } } } // nouns can be both singular and plural: "aircraft", "biceps", "fish", "sheep" // TODO other noun properties may be worth adding: abstract #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct NounData { pub is_proper: Option, pub is_singular: Option, pub is_plural: Option, pub is_countable: Option, pub is_mass: Option, pub is_possessive: Option, } impl NounData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, other: &Self) -> Self { Self { is_proper: self.is_proper.or(other.is_proper), is_singular: self.is_singular.or(other.is_singular), is_plural: self.is_plural.or(other.is_plural), is_countable: self.is_countable.or(other.is_countable), is_mass: self.is_mass.or(other.is_mass), is_possessive: self.is_possessive.or(other.is_possessive), } } } // Person is a property of pronouns; the verb 'be', plus all verbs reflect 3rd person singular with -s #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Is, Hash)] pub enum Person { First, Second, Third, } // TODO for now focused on personal pronouns? #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct PronounData { pub is_personal: Option, pub is_singular: Option, pub is_plural: Option, pub is_possessive: Option, pub is_reflexive: Option, pub person: Option, pub is_subject: Option, pub is_object: Option, } impl PronounData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, other: &Self) -> Self { Self { is_personal: self.is_personal.or(other.is_personal), is_singular: self.is_singular.or(other.is_singular), is_plural: self.is_plural.or(other.is_plural), is_possessive: self.is_possessive.or(other.is_possessive), is_reflexive: self.is_reflexive.or(other.is_reflexive), person: self.person.or(other.person), is_subject: self.is_subject.or(other.is_subject), is_object: self.is_object.or(other.is_object), } } } /// Additional metadata for determiners #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct DeterminerData { pub is_demonstrative: Option, pub is_possessive: Option, pub is_quantifier: Option, } impl DeterminerData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, other: &Self) -> Self { Self { is_demonstrative: self.is_demonstrative.or(other.is_demonstrative), is_possessive: self.is_possessive.or(other.is_possessive), is_quantifier: self.is_quantifier.or(other.is_quantifier), } } } /// Degree is a property of adjectives: positive is not inflected /// Comparative is inflected with -er or comes after the word "more" /// Superlative is inflected with -est or comes after the word "most" #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Is, Hash)] pub enum Degree { Positive, Comparative, Superlative, } /// Some adjectives are not comparable so don't have -er or -est forms and can't be used with "more" or "most". /// Some adjectives can only be used "attributively" (before a noun); some only predicatively (after "is" etc.). /// In old grammars words like the articles and determiners are classified as adjectives but behave differently. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct AdjectiveData { pub degree: Option, } impl AdjectiveData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, other: &Self) -> Self { Self { degree: self.degree.or(other.degree), } } } /// Adverb can be a "junk drawer" category for words which don't fit the other major categories. /// The typical adverbs are "adverbs of manner", those derived from adjectives in -ly /// other adverbs (time, place, etc) should probably not be considered adverbs for Harper's purposes #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct AdverbData { pub is_manner: Option, pub is_frequency: Option, pub is_degree: Option, } impl AdverbData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, _other: &Self) -> Self { Self { is_manner: self.is_manner.or(_other.is_manner), is_frequency: self.is_frequency.or(_other.is_frequency), is_degree: self.is_degree.or(_other.is_degree), } } } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct ConjunctionData {} impl ConjunctionData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, _other: &Self) -> Self { Self {} } } #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, Default)] pub struct AffixData { pub is_prefix: Option, pub is_suffix: Option, } impl AffixData { /// Produce a copy of `self` with the known properties of `other` set. pub fn or(&self, _other: &Self) -> Self { Self { is_prefix: self.is_prefix.or(_other.is_prefix), is_suffix: self.is_suffix.or(_other.is_suffix), } } } /// A regional dialect. /// /// Note: these have bit-shifted values so that they can ergonomically integrate with /// `DialectFlags`. Each value here must have a unique bit index inside /// `DialectsUnderlyingType`. #[derive( Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash, EnumCount, EnumString, EnumIter, Display, VariantArray, )] pub enum Dialect { American = 1 << 0, Canadian = 1 << 1, Australian = 1 << 2, British = 1 << 3, Indian = 1 << 4, } impl Dialect { /// Tries to guess the dialect used in the document by finding which dialect is used the most. /// Returns `None` if it fails to find a single dialect that is used the most. #[must_use] pub fn try_guess_from_document(document: &Document) -> Option { Self::try_from(DialectFlags::get_most_used_dialects_from_document(document)).ok() } /// Tries to get a dialect from its abbreviation. Returns `None` if the abbreviation is not /// recognized. /// /// # Examples /// /// ``` /// use harper_core::Dialect; /// /// let abbrs = ["US", "CA", "AU", "GB", "IN"]; /// let mut dialects = abbrs.iter().map(|abbr| Dialect::try_from_abbr(abbr)); /// /// assert_eq!(Some(Dialect::American), dialects.next().unwrap()); // US /// assert_eq!(Some(Dialect::Canadian), dialects.next().unwrap()); // CA /// assert_eq!(Some(Dialect::Australian), dialects.next().unwrap()); // AU /// assert_eq!(Some(Dialect::British), dialects.next().unwrap()); // GB /// assert_eq!(Some(Dialect::Indian), dialects.next().unwrap()); // IN /// ``` #[must_use] pub fn try_from_abbr(abbr: &str) -> Option { match abbr { "US" => Some(Self::American), "CA" => Some(Self::Canadian), "AU" => Some(Self::Australian), "GB" => Some(Self::British), "IN" => Some(Self::Indian), _ => None, } } } impl TryFrom for Dialect { type Error = (); /// Attempts to convert `DialectFlags` to a single `Dialect`. /// /// # Errors /// /// Will return `Err` if more than one dialect is enabled or if an undefined dialect is /// enabled. fn try_from(dialect_flags: DialectFlags) -> Result { // Ensure only one dialect is enabled before converting. if dialect_flags.bits().count_ones() == 1 { match dialect_flags { df if df.is_dialect_enabled_strict(Dialect::American) => Ok(Dialect::American), df if df.is_dialect_enabled_strict(Dialect::Canadian) => Ok(Dialect::Canadian), df if df.is_dialect_enabled_strict(Dialect::Australian) => Ok(Dialect::Australian), df if df.is_dialect_enabled_strict(Dialect::British) => Ok(Dialect::British), df if df.is_dialect_enabled_strict(Dialect::Indian) => Ok(Dialect::Indian), _ => Err(()), } } else { // More than one dialect enabled; can't soundly convert. Err(()) } } } // The underlying type used for DialectFlags. // At the time of writing, this is currently a `u8`. If we want to define more than 8 dialects in // the future, we will need to switch this to a larger type. type DialectFlagsUnderlyingType = u8; bitflags::bitflags! { /// A collection of bit flags used to represent enabled dialects. /// /// This is generally used to allow a word (or similar) to be tagged with multiple dialects. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, PartialOrd, Eq, Hash)] #[serde(transparent)] pub struct DialectFlags: DialectFlagsUnderlyingType { const AMERICAN = Dialect::American as DialectFlagsUnderlyingType; const CANADIAN = Dialect::Canadian as DialectFlagsUnderlyingType; const AUSTRALIAN = Dialect::Australian as DialectFlagsUnderlyingType; const BRITISH = Dialect::British as DialectFlagsUnderlyingType; const INDIAN = Dialect::Indian as DialectFlagsUnderlyingType; } } impl DialectFlags { /// Checks if the provided dialect is enabled. /// If no dialect is explicitly enabled, it is assumed that all dialects are enabled. #[must_use] pub fn is_dialect_enabled(self, dialect: Dialect) -> bool { self.is_empty() || self.intersects(Self::from_dialect(dialect)) } /// Checks if the provided dialect is ***explicitly*** enabled. /// /// Unlike `is_dialect_enabled`, this will return false when no dialects are explicitly /// enabled. #[must_use] pub fn is_dialect_enabled_strict(self, dialect: Dialect) -> bool { self.intersects(Self::from_dialect(dialect)) } /// Constructs a `DialectFlags` from the provided `Dialect`, with only that dialect being /// enabled. /// /// # Panics /// /// This will panic if `dialect` represents a dialect that is not defined in /// `DialectFlags`. #[must_use] pub fn from_dialect(dialect: Dialect) -> Self { let Some(out) = Self::from_bits(dialect as DialectFlagsUnderlyingType) else { panic!("The '{dialect}' dialect isn't defined in DialectFlags!"); }; out } /// Gets the most commonly used dialect(s) in the document. /// /// If multiple dialects are used equally often, they will all be enabled in the returned /// `DialectFlags`. On the other hand, if there is a single dialect that is used the most, it /// will be the only one enabled. #[must_use] pub fn get_most_used_dialects_from_document(document: &Document) -> Self { // Initialize counters. let mut dialect_counters: [(Dialect, usize); Dialect::COUNT] = Dialect::VARIANTS .iter() .map(|d| (*d, 0)) .collect_array() .unwrap(); // Count word dialects. document.iter_words().for_each(|w| { if let TokenKind::Word(Some(lexeme_metadata)) = &w.kind { // If the token is a word, iterate though the dialects in `dialect_counters` and // increment those counters where the word has the respective dialect enabled. dialect_counters.iter_mut().for_each(|(dialect, count)| { if lexeme_metadata.dialects.is_dialect_enabled(*dialect) { *count += 1; } }); } }); // Find max counter. let max_counter = dialect_counters .iter() .map(|(_, count)| count) .max() .unwrap(); // Get and convert the collection of most used dialects into a `DialectFlags`. dialect_counters .into_iter() .filter(|(_, count)| count == max_counter) .fold(DialectFlags::empty(), |acc, dialect| { // Fold most used dialects into `DialectFlags` via bitwise or. acc | Self::from_dialect(dialect.0) }) } } impl Default for DialectFlags { /// A default value with no dialects explicitly enabled. /// Implicitly, this state corresponds to all dialects being enabled. fn default() -> Self { Self::empty() } } #[cfg(test)] pub mod tests { use crate::DictWordMetadata; use crate::spell::{Dictionary, FstDictionary}; // Helper function to get metadata from the curated dictionary pub fn md(word: &str) -> DictWordMetadata { FstDictionary::curated() .get_word_metadata_str(word) .unwrap_or_else(|| panic!("Word '{word}' not found in dictionary")) .into_owned() } mod dialect { use super::super::{Dialect, DialectFlags}; use crate::Document; #[test] fn guess_british_dialect() { let document = Document::new_plain_english_curated("Aluminium was used."); let df = DialectFlags::get_most_used_dialects_from_document(&document); assert!( df.is_dialect_enabled_strict(Dialect::British) && !df.is_dialect_enabled_strict(Dialect::American) ); } #[test] fn guess_american_dialect() { let document = Document::new_plain_english_curated("Aluminum was used."); let df = DialectFlags::get_most_used_dialects_from_document(&document); assert!( df.is_dialect_enabled_strict(Dialect::American) && !df.is_dialect_enabled_strict(Dialect::British) ); } } mod noun { use crate::dict_word_metadata::tests::md; #[test] fn puppy_is_noun() { assert!(md("puppy").is_noun()); } #[test] fn prepare_is_not_noun() { assert!(!md("prepare").is_noun()); } #[test] fn paris_is_proper_noun() { assert!(md("Paris").is_proper_noun()); } #[test] fn permit_is_non_proper_noun() { assert!(md("lapdog").is_non_proper_noun()); } #[test] fn hound_is_singular_noun() { assert!(md("hound").is_singular_noun()); } #[test] fn pooches_is_non_singular_noun() { assert!(md("pooches").is_non_singular_noun()); } // Make sure is_non_xxx_noun methods don't behave like is_not_xxx_noun. // In other words, make sure they don't return true for words that are not nouns. // They must only pass for words that are nouns but not singular etc. #[test] fn loyal_doesnt_pass_is_non_singular_noun() { assert!(!md("loyal").is_non_singular_noun()); } #[test] fn hounds_is_plural_noun() { assert!(md("hounds").is_plural_noun()); } #[test] fn pooch_is_non_plural_noun() { assert!(md("pooch").is_non_plural_noun()); } #[test] fn fish_is_singular_noun() { assert!(md("fish").is_singular_noun()); } #[test] fn fish_is_plural_noun() { assert!(md("fish").is_plural_noun()); } #[test] fn fishes_is_plural_noun() { assert!(md("fishes").is_plural_noun()); } #[test] fn sheep_is_singular_noun() { assert!(md("sheep").is_singular_noun()); } #[test] fn sheep_is_plural_noun() { assert!(md("sheep").is_plural_noun()); } #[test] #[should_panic] fn sheeps_is_not_word() { md("sheeps"); } #[test] fn bicep_is_singular_noun() { assert!(md("bicep").is_singular_noun()); } #[test] fn biceps_is_singular_noun() { assert!(md("biceps").is_singular_noun()); } #[test] fn biceps_is_plural_noun() { assert!(md("biceps").is_plural_noun()); } #[test] fn aircraft_is_singular_noun() { assert!(md("aircraft").is_singular_noun()); } #[test] fn aircraft_is_plural_noun() { assert!(md("aircraft").is_plural_noun()); } #[test] #[should_panic] fn aircrafts_is_not_word() { md("aircrafts"); } #[test] fn dog_apostrophe_s_is_possessive_noun() { assert!(md("dog's").is_possessive_noun()); } #[test] fn dogs_is_non_possessive_noun() { assert!(md("dogs").is_non_possessive_noun()); } // noun countability #[test] fn dog_is_countable() { assert!(md("dog").is_countable_noun()); } #[test] fn dog_is_non_mass_noun() { assert!(md("dog").is_non_mass_noun()); } #[test] fn furniture_is_mass_noun() { assert!(md("furniture").is_mass_noun()); } #[test] fn furniture_is_non_countable_noun() { assert!(md("furniture").is_non_countable_noun()); } #[test] fn equipment_is_mass_noun() { assert!(md("equipment").is_mass_noun()); } #[test] fn equipment_is_non_countable_noun() { assert!(md("equipment").is_non_countable_noun()); } #[test] fn beer_is_countable_noun() { assert!(md("beer").is_countable_noun()); } #[test] fn beer_is_mass_noun() { assert!(md("beer").is_mass_noun()); } } mod pronoun { use crate::dict_word_metadata::tests::md; mod i_me_myself { use crate::dict_word_metadata::tests::md; #[test] fn i_is_pronoun() { assert!(md("I").is_pronoun()); } #[test] fn i_is_personal_pronoun() { assert!(md("I").is_personal_pronoun()); } #[test] fn i_is_singular_pronoun() { assert!(md("I").is_singular_pronoun()); } #[test] fn i_is_subject_pronoun() { assert!(md("I").is_subject_pronoun()); } #[test] fn me_is_pronoun() { assert!(md("me").is_pronoun()); } #[test] fn me_is_personal_pronoun() { assert!(md("me").is_personal_pronoun()); } #[test] fn me_is_singular_pronoun() { assert!(md("me").is_singular_pronoun()); } #[test] fn me_is_object_pronoun() { assert!(md("me").is_object_pronoun()); } #[test] fn myself_is_pronoun() { assert!(md("myself").is_pronoun()); } #[test] fn myself_is_personal_pronoun() { assert!(md("myself").is_personal_pronoun()); } #[test] fn myself_is_singular_pronoun() { assert!(md("myself").is_singular_pronoun()); } #[test] fn myself_is_reflexive_pronoun() { assert!(md("myself").is_reflexive_pronoun()); } } mod we_us_ourselves { use crate::dict_word_metadata::tests::md; #[test] fn we_is_pronoun() { assert!(md("we").is_pronoun()); } #[test] fn we_is_personal_pronoun() { assert!(md("we").is_personal_pronoun()); } #[test] fn we_is_plural_pronoun() { assert!(md("we").is_plural_pronoun()); } #[test] fn we_is_subject_pronoun() { assert!(md("we").is_subject_pronoun()); } #[test] fn us_is_pronoun() { assert!(md("us").is_pronoun()); } #[test] fn us_is_personal_pronoun() { assert!(md("us").is_personal_pronoun()); } #[test] fn us_is_plural_pronoun() { assert!(md("us").is_plural_pronoun()); } #[test] fn us_is_object_pronoun() { assert!(md("us").is_object_pronoun()); } #[test] fn ourselves_is_pronoun() { assert!(md("ourselves").is_pronoun()); } #[test] fn ourselves_is_personal_pronoun() { assert!(md("ourselves").is_personal_pronoun()); } #[test] fn ourselves_is_plural_pronoun() { assert!(md("ourselves").is_plural_pronoun()); } #[test] fn ourselves_is_reflexive_pronoun() { assert!(md("ourselves").is_reflexive_pronoun()); } } mod you_yourself { use crate::dict_word_metadata::tests::md; #[test] fn you_is_pronoun() { assert!(md("you").is_pronoun()); } #[test] fn you_is_personal_pronoun() { assert!(md("you").is_personal_pronoun()); } #[test] fn you_is_singular_pronoun() { assert!(md("you").is_singular_pronoun()); } #[test] fn you_is_plural_pronoun() { assert!(md("you").is_plural_pronoun()); } #[test] fn you_is_subject_pronoun() { assert!(md("you").is_subject_pronoun()); } #[test] fn you_is_object_pronoun() { assert!(md("you").is_object_pronoun()); } #[test] fn yourself_is_pronoun() { assert!(md("yourself").is_pronoun()); } #[test] fn yourself_is_personal_pronoun() { assert!(md("yourself").is_personal_pronoun()); } #[test] fn yourself_is_singular_pronoun() { assert!(md("yourself").is_singular_pronoun()); } #[test] fn yourself_is_reflexive_pronoun() { assert!(md("yourself").is_reflexive_pronoun()); } } mod he_him_himself { use crate::dict_word_metadata::tests::md; #[test] fn he_is_pronoun() { assert!(md("he").is_pronoun()); } #[test] fn he_is_personal_pronoun() { assert!(md("he").is_personal_pronoun()); } #[test] fn he_is_singular_pronoun() { assert!(md("he").is_singular_pronoun()); } #[test] fn he_is_subject_pronoun() { assert!(md("he").is_subject_pronoun()); } #[test] fn him_is_pronoun() { assert!(md("him").is_pronoun()); } #[test] fn him_is_personal_pronoun() { assert!(md("him").is_personal_pronoun()); } #[test] fn him_is_singular_pronoun() { assert!(md("him").is_singular_pronoun()); } #[test] fn him_is_object_pronoun() { assert!(md("him").is_object_pronoun()); } #[test] fn himself_is_pronoun() { assert!(md("himself").is_pronoun()); } #[test] fn himself_is_personal_pronoun() { assert!(md("himself").is_personal_pronoun()); } #[test] fn himself_is_singular_pronoun() { assert!(md("himself").is_singular_pronoun()); } #[test] fn himself_is_reflexive_pronoun() { assert!(md("himself").is_reflexive_pronoun()); } } mod she_her_herself { use crate::dict_word_metadata::tests::md; #[test] fn she_is_pronoun() { assert!(md("she").is_pronoun()); } #[test] fn she_is_personal_pronoun() { assert!(md("she").is_personal_pronoun()); } #[test] fn she_is_singular_pronoun() { assert!(md("she").is_singular_pronoun()); } #[test] fn she_is_subject_pronoun() { assert!(md("she").is_subject_pronoun()); } #[test] fn her_is_pronoun() { assert!(md("her").is_pronoun()); } #[test] fn her_is_personal_pronoun() { assert!(md("her").is_personal_pronoun()); } #[test] fn her_is_singular_pronoun() { assert!(md("her").is_singular_pronoun()); } #[test] fn her_is_object_pronoun() { assert!(md("her").is_object_pronoun()); } #[test] fn herself_is_pronoun() { assert!(md("herself").is_pronoun()); } #[test] fn herself_is_personal_pronoun() { assert!(md("herself").is_personal_pronoun()); } #[test] fn herself_is_singular_pronoun() { assert!(md("herself").is_singular_pronoun()); } #[test] fn herself_is_reflexive_pronoun() { assert!(md("herself").is_reflexive_pronoun()); } } mod it_itself { use crate::dict_word_metadata::tests::md; #[test] fn it_is_pronoun() { assert!(md("it").is_pronoun()); } #[test] fn it_is_personal_pronoun() { assert!(md("it").is_personal_pronoun()); } #[test] fn it_is_singular_pronoun() { assert!(md("it").is_singular_pronoun()); } #[test] fn it_is_subject_pronoun() { assert!(md("it").is_subject_pronoun()); } #[test] fn it_is_object_pronoun() { assert!(md("it").is_object_pronoun()); } #[test] fn itself_is_pronoun() { assert!(md("itself").is_pronoun()); } #[test] fn itself_is_personal_pronoun() { assert!(md("itself").is_personal_pronoun()); } #[test] fn itself_is_singular_pronoun() { assert!(md("itself").is_singular_pronoun()); } #[test] fn itself_is_reflexive_pronoun() { assert!(md("itself").is_reflexive_pronoun()); } } mod they_them_themselves { use crate::dict_word_metadata::tests::md; #[test] fn they_is_pronoun() { assert!(md("they").is_pronoun()); } #[test] fn they_is_personal_pronoun() { assert!(md("they").is_personal_pronoun()); } #[test] fn they_is_plural_pronoun() { assert!(md("they").is_plural_pronoun()); } #[test] fn they_is_subject_pronoun() { assert!(md("they").is_subject_pronoun()); } #[test] fn them_is_pronoun() { assert!(md("them").is_pronoun()); } #[test] fn them_is_personal_pronoun() { assert!(md("them").is_personal_pronoun()); } #[test] fn them_is_plural_pronoun() { assert!(md("them").is_plural_pronoun()); } #[test] fn them_is_object_pronoun() { assert!(md("them").is_object_pronoun()); } #[test] fn themselves_is_pronoun() { assert!(md("themselves").is_pronoun()); } #[test] fn themselves_is_personal_pronoun() { assert!(md("themselves").is_personal_pronoun()); } #[test] fn themselves_is_plural_pronoun() { assert!(md("themselves").is_plural_pronoun()); } #[test] fn themselves_is_reflexive_pronoun() { assert!(md("themselves").is_reflexive_pronoun()); } } // Possessive pronouns (not to be confused with possessive adjectives/determiners) #[test] fn mine_is_pronoun() { assert!(md("mine").is_pronoun()); } #[test] fn ours_is_pronoun() { assert!(md("ours").is_pronoun()); } #[test] fn yours_is_pronoun() { assert!(md("yours").is_pronoun()); } #[test] fn his_is_pronoun() { assert!(md("his").is_pronoun()); } #[test] fn hers_is_pronoun() { assert!(md("hers").is_pronoun()); } #[test] fn its_is_pronoun() { assert!(md("its").is_pronoun()); } #[test] fn theirs_is_pronoun() { assert!(md("theirs").is_pronoun()); } // archaic pronouns #[test] fn archaic_pronouns() { assert!(md("thou").is_pronoun()); assert!(md("thee").is_pronoun()); assert!(md("thyself").is_pronoun()); assert!(md("thine").is_pronoun()); } // generic pronouns #[test] fn generic_pronouns() { assert!(md("one").is_pronoun()); assert!(md("oneself").is_pronoun()); } // relative and interrogative pronouns #[test] fn relative_and_interrogative_pronouns() { assert!(md("who").is_pronoun()); assert!(md("whom").is_pronoun()); assert!(md("whose").is_pronoun()); assert!(md("which").is_pronoun()); assert!(md("what").is_pronoun()); } // nonstandard pronouns #[test] #[ignore = "not in dictionary"] fn nonstandard_pronouns() { assert!(md("themself").pronoun.is_some()); assert!(md("y'all'").pronoun.is_some()); } } mod nominal { use crate::dict_word_metadata::tests::md; #[test] fn my_is_possessive_nominal() { assert!(md("my").is_possessive_nominal()); } #[test] fn mine_is_not_possessive_nominal() { assert!(!md("mine").is_possessive_nominal()); } #[test] fn freds_is_possessive_nominal() { assert!(md("Fred's").is_possessive_nominal()); } #[test] fn fred_is_not_possessive_nominal() { assert!(!md("Fred").is_possessive_nominal()); } #[test] fn dogs_is_possessive_nominal() { assert!(md("dog's").is_possessive_nominal()); } #[test] fn microsofts_is_possessive_nominal() { assert!(md("Microsoft's").is_possessive_nominal()); } } mod adjective { use crate::{Degree, dict_word_metadata::tests::md}; // Getting degrees #[test] #[ignore = "not marked yet because it might not be reliable"] fn big_is_positive() { assert_eq!(md("big").get_degree(), Some(Degree::Positive)); } #[test] fn bigger_is_comparative() { assert_eq!(md("bigger").get_degree(), Some(Degree::Comparative)); } #[test] fn biggest_is_superlative() { assert_eq!(md("biggest").get_degree(), Some(Degree::Superlative)); } #[test] #[should_panic(expected = "Word 'bigly' not found in dictionary")] fn bigly_is_not_an_adjective_form_we_track() { assert_eq!(md("bigly").get_degree(), None); } // Calling is_ methods // TODO: positive degree not implemented #[test] fn bigger_is_comparative_adjective() { assert!(md("bigger").is_comparative_adjective()); } #[test] fn biggest_is_superlative_adjective() { assert!(md("biggest").is_superlative_adjective()); } } #[test] fn the_is_determiner() { assert!(md("the").is_determiner()); } #[test] fn this_is_demonstrative_determiner() { assert!(md("this").is_demonstrative_determiner()); } #[test] fn your_is_possessive_determiner() { assert!(md("your").is_possessive_determiner()); } #[test] fn every_is_quantifier() { assert!(md("every").is_quantifier()); } #[test] fn the_isnt_quantifier() { assert!(!md("the").is_quantifier()); } #[test] fn equipment_is_mass_noun() { assert!(md("equipment").is_mass_noun()); } #[test] fn equipment_is_non_countable_noun() { assert!(md("equipment").is_non_countable_noun()); } #[test] fn equipment_isnt_countable_noun() { assert!(!md("equipment").is_countable_noun()); } mod verb { use crate::dict_word_metadata::tests::md; #[test] fn lemma_walk() { let md = md("walk"); assert!(md.is_verb_lemma()) } #[test] fn lemma_fix() { let md = md("fix"); assert!(md.is_verb_lemma()) } #[test] fn progressive_walking() { let md = md("walking"); assert!(md.is_verb_progressive_form()) } #[test] fn past_walked() { let md = md("walked"); assert!(md.is_verb_past_form()) } #[test] fn simple_past_ate() { let md = md("ate"); assert!(md.is_verb_simple_past_form()) } #[test] fn past_participle_eaten() { let md = md("eaten"); assert!(md.is_verb_past_participle_form()) } #[test] fn third_pers_sing_walks() { let md = md("walks"); assert!(md.is_verb_third_person_singular_present_form()) } } } ================================================ FILE: harper-core/src/dict_word_metadata_orthography.rs ================================================ use crate::CharStringExt; use crate::char_ext::CharExt; use serde::{Deserialize, Serialize}; /// Orthography information. pub enum Orthography { /// Every char that is a letter is lowercase. Lowercase = 1 << 0, /// First char is uppercase, the rest is lowercase (but multi-word?) Titlecase = 1 << 1, /// Every char that is a letter is uppercase (including single-letter uppercase) AllCaps = 1 << 2, /// Starts with a lowercase letter but also contains uppercase letters. LowerCamel = 1 << 3, /// Starts with an uppercase letter but also contains lowercase letters. (Superset of Titlecase.) UpperCamel = 1 << 4, /// Contains at least one space. Multiword = 1 << 5, /// Contains at least one hyphen. Hyphenated = 1 << 6, /// Contains an apostrophe, so it's a possessive or a contraction. Apostrophe = 1 << 7, /// Could be Roman numerals. RomanNumerals = 1 << 8, } /// The underlying type used for OrthographyFlags. /// At the time of writing, this is currently a `u8`. If we want to define more than 8 orthographic /// properties in the future, we will need to switch this to a larger type. type OrthographyFlagsUnderlyingType = u16; bitflags::bitflags! { /// A collection of bit flags used to represent orthographic properties of a word. /// /// This is generally used to allow a word (or similar) to be tagged with multiple orthographic /// properties. #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, PartialOrd, Serialize)] pub struct OrthFlags: OrthographyFlagsUnderlyingType { const LOWERCASE = Orthography::Lowercase as OrthographyFlagsUnderlyingType; const TITLECASE = Orthography::Titlecase as OrthographyFlagsUnderlyingType; const ALLCAPS = Orthography::AllCaps as OrthographyFlagsUnderlyingType; const LOWER_CAMEL = Orthography::LowerCamel as OrthographyFlagsUnderlyingType; const UPPER_CAMEL = Orthography::UpperCamel as OrthographyFlagsUnderlyingType; const MULTIWORD = Orthography::Multiword as OrthographyFlagsUnderlyingType; const HYPHENATED = Orthography::Hyphenated as OrthographyFlagsUnderlyingType; const APOSTROPHE = Orthography::Apostrophe as OrthographyFlagsUnderlyingType; const ROMAN_NUMERALS = Orthography::RomanNumerals as OrthographyFlagsUnderlyingType; } } impl Default for OrthFlags { fn default() -> Self { Self::empty() } } impl OrthFlags { /// Construct orthography flags for a given sequence of letters. pub fn from_letters(letters: &[char]) -> Self { let mut ortho_flags = Self::default(); let mut all_lower = true; let mut all_upper = true; let mut first_is_upper = false; let mut first_is_lower = false; let mut saw_upper_after_first = false; let mut saw_lower_after_first = false; let mut is_first_char = true; let mut upper_to_lower = false; let mut lower_to_upper = false; let letter_count = letters.iter().filter(|c| c.is_english_lingual()).count(); for &c in letters { if c == ' ' { ortho_flags |= Self::MULTIWORD; continue; } if c == '-' { ortho_flags |= Self::HYPHENATED; continue; } if c.normalized() == '\'' { ortho_flags |= Self::APOSTROPHE; continue; } if !c.is_english_lingual() { continue; } if c.is_lowercase() { all_upper = false; if is_first_char { first_is_lower = true; } else { saw_lower_after_first = true; if upper_to_lower { lower_to_upper = true; } upper_to_lower = true; } } else if c.is_uppercase() { all_lower = false; if is_first_char { first_is_upper = true; } else { saw_upper_after_first = true; if lower_to_upper { upper_to_lower = true; } lower_to_upper = true; } } else { first_is_upper = false; first_is_lower = false; upper_to_lower = false; lower_to_upper = false; } is_first_char = false; } if letter_count > 0 { if all_lower { ortho_flags |= Self::LOWERCASE; } if all_upper { ortho_flags |= Self::ALLCAPS; } if letter_count > 1 && first_is_upper && !saw_upper_after_first { ortho_flags |= Self::TITLECASE; } if first_is_lower && saw_upper_after_first { ortho_flags |= Self::LOWER_CAMEL; } if first_is_upper && saw_lower_after_first && saw_upper_after_first { ortho_flags |= Self::UPPER_CAMEL; } } if looks_like_roman_numerals(letters) && is_really_roman_numerals(&letters.to_lower()) { ortho_flags |= Self::ROMAN_NUMERALS; } ortho_flags } } fn looks_like_roman_numerals(word: &[char]) -> bool { let mut is_roman = false; let first_char_upper; if let Some((&first, rest)) = word.split_first() && "mdclxvi".contains(first.to_ascii_lowercase()) { first_char_upper = first.is_uppercase(); for &c in rest { if !"mdclxvi".contains(c.to_ascii_lowercase()) || c.is_uppercase() != first_char_upper { return false; } } is_roman = true; } is_roman } fn is_really_roman_numerals(word: &[char]) -> bool { let s: String = word.iter().collect(); let mut chars = s.chars().peekable(); let mut m_count = 0; while m_count < 4 && chars.peek() == Some(&'m') { chars.next(); m_count += 1; } if !check_roman_group(&mut chars, 'c', 'd', 'm') { return false; } if !check_roman_group(&mut chars, 'x', 'l', 'c') { return false; } if !check_roman_group(&mut chars, 'i', 'v', 'x') { return false; } if chars.next().is_some() { return false; } true } fn check_roman_group>( chars: &mut std::iter::Peekable, one: char, five: char, ten: char, ) -> bool { match chars.peek() { Some(&c) if c == one => { chars.next(); match chars.peek() { Some(&next) if next == ten || next == five => { chars.next(); true } _ => { let mut count = 0; while count < 2 && chars.peek() == Some(&one) { chars.next(); count += 1; } true } } } Some(&c) if c == five => { chars.next(); let mut count = 0; while count < 3 && chars.peek() == Some(&one) { chars.next(); count += 1; } true } _ => true, } } #[cfg(test)] mod tests { use crate::CharString; use crate::dict_word_metadata::tests::md; use crate::dict_word_metadata_orthography::OrthFlags; fn orth_flags(s: &str) -> OrthFlags { let letters: CharString = s.chars().collect(); OrthFlags::from_letters(&letters) } #[test] fn test_lowercase_flags() { let flags = orth_flags("hello"); assert!(flags.contains(OrthFlags::LOWERCASE)); assert!(!flags.contains(OrthFlags::TITLECASE)); assert!(!flags.contains(OrthFlags::ALLCAPS)); assert!(!flags.contains(OrthFlags::LOWER_CAMEL)); assert!(!flags.contains(OrthFlags::UPPER_CAMEL)); let flags = orth_flags("hello123"); assert!(flags.contains(OrthFlags::LOWERCASE)); } #[test] fn test_titlecase_flags() { let flags = orth_flags("Hello"); assert!(!flags.contains(OrthFlags::LOWERCASE)); assert!(flags.contains(OrthFlags::TITLECASE)); assert!(!flags.contains(OrthFlags::ALLCAPS)); assert!(!flags.contains(OrthFlags::LOWER_CAMEL)); assert!(!flags.contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("World").contains(OrthFlags::TITLECASE)); assert!(orth_flags("Something").contains(OrthFlags::TITLECASE)); assert!(!orth_flags("McDonald").contains(OrthFlags::TITLECASE)); assert!(!orth_flags("O'Reilly").contains(OrthFlags::TITLECASE)); assert!(!orth_flags("A").contains(OrthFlags::TITLECASE)); } #[test] fn test_allcaps_flags() { let flags = orth_flags("HELLO"); assert!(!flags.contains(OrthFlags::LOWERCASE)); assert!(!flags.contains(OrthFlags::TITLECASE)); assert!(flags.contains(OrthFlags::ALLCAPS)); assert!(!flags.contains(OrthFlags::LOWER_CAMEL)); assert!(!flags.contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("NASA").contains(OrthFlags::ALLCAPS)); assert!(orth_flags("I").contains(OrthFlags::ALLCAPS)); } #[test] fn test_lower_camel_flags() { let flags = orth_flags("helloWorld"); assert!(!flags.contains(OrthFlags::LOWERCASE)); assert!(!flags.contains(OrthFlags::TITLECASE)); assert!(!flags.contains(OrthFlags::ALLCAPS)); assert!(flags.contains(OrthFlags::LOWER_CAMEL)); assert!(!flags.contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("getHTTPResponse").contains(OrthFlags::LOWER_CAMEL)); assert!(orth_flags("eBay").contains(OrthFlags::LOWER_CAMEL)); assert!(!orth_flags("hello").contains(OrthFlags::LOWER_CAMEL)); assert!(!orth_flags("HelloWorld").contains(OrthFlags::LOWER_CAMEL)); } #[test] fn test_upper_camel_flags() { let flags = orth_flags("HelloWorld"); assert!(!flags.contains(OrthFlags::LOWERCASE)); assert!(!flags.contains(OrthFlags::TITLECASE)); assert!(!flags.contains(OrthFlags::ALLCAPS)); assert!(!flags.contains(OrthFlags::LOWER_CAMEL)); assert!(flags.contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("HttpRequest").contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("McDonald").contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("O'Reilly").contains(OrthFlags::UPPER_CAMEL)); assert!(orth_flags("XMLHttpRequest").contains(OrthFlags::UPPER_CAMEL)); assert!(!orth_flags("Hello").contains(OrthFlags::UPPER_CAMEL)); assert!(!orth_flags("NASA").contains(OrthFlags::UPPER_CAMEL)); assert!(!orth_flags("Hi").contains(OrthFlags::UPPER_CAMEL)); } #[test] fn test_roman_numeral_flags() { assert!(orth_flags("MCMXCIV").contains(OrthFlags::ROMAN_NUMERALS)); assert!(orth_flags("mdccclxxi").contains(OrthFlags::ROMAN_NUMERALS)); assert!(orth_flags("MMXXI").contains(OrthFlags::ROMAN_NUMERALS)); assert!(orth_flags("mcmxciv").contains(OrthFlags::ROMAN_NUMERALS)); assert!(orth_flags("MCMXCIV").contains(OrthFlags::ROMAN_NUMERALS)); assert!(orth_flags("MMI").contains(OrthFlags::ROMAN_NUMERALS)); assert!(orth_flags("MMXXV").contains(OrthFlags::ROMAN_NUMERALS)); } #[test] fn test_single_roman_numeral_flags() { assert!(orth_flags("i").contains(OrthFlags::ROMAN_NUMERALS)); } #[test] fn empty_string_is_not_roman_numeral() { assert!(!orth_flags("").contains(OrthFlags::ROMAN_NUMERALS)); } #[test] fn dont_allow_mixed_case_roman_numerals() { assert!(!orth_flags("MCMlxxxVIII").contains(OrthFlags::ROMAN_NUMERALS)); } #[test] fn dont_allow_looks_like_but_isnt_roman_numeral() { assert!(!orth_flags("mdxlivx").contains(OrthFlags::ROMAN_NUMERALS)); assert!(!orth_flags("XIXIVV").contains(OrthFlags::ROMAN_NUMERALS)); } #[test] fn australia_lexeme_is_titlecase_even_when_word_is_lowercase() { assert!(md("australia").orth_info.contains(OrthFlags::TITLECASE)); } #[test] fn australia_lexeme_is_titlecase_even_when_word_is_all_caps() { assert!(md("AUSTRALIA").orth_info.contains(OrthFlags::TITLECASE)); } #[test] fn australia_lexeme_is_titlecase_even_when_word_is_mixed_case() { assert!(md("AuStrAlIA").orth_info.contains(OrthFlags::TITLECASE)); } #[test] fn db_and_kw_symbols_are_lower_camel_case() { // dB, kW assert!(md("db").orth_info.contains(OrthFlags::LOWER_CAMEL)); } #[test] fn am_is_lowercase_and_titlecase_and_all_caps() { // am, Am, AM let metadata = md("am"); assert!(metadata.orth_info.contains(OrthFlags::LOWERCASE)); assert!(metadata.orth_info.contains(OrthFlags::TITLECASE)); assert!(metadata.orth_info.contains(OrthFlags::ALLCAPS)); } #[test] fn reading_is_both_lowercase_and_titlecase() { // Reading is a town in England let metadata = md("reading"); assert!(metadata.orth_info.contains(OrthFlags::LOWERCASE)); assert!(metadata.orth_info.contains(OrthFlags::TITLECASE)); } #[test] fn ebay_and_esim_are_lower_camel() { // eBay eSIM let md1 = md("ebay"); assert!(md1.orth_info.contains(OrthFlags::LOWER_CAMEL)); let md2 = md("esim"); assert!(md2.orth_info.contains(OrthFlags::LOWER_CAMEL)); } } ================================================ FILE: harper-core/src/document.rs ================================================ use std::cmp::Ordering; use std::collections::VecDeque; use std::fmt::Display; use harper_brill::{Chunker, Tagger, brill_tagger, burn_chunker}; use itertools::Itertools; use paste::paste; use crate::expr::{Expr, ExprExt, FirstMatchOf, Repeating, SequenceExpr}; use crate::parsers::{Markdown, MarkdownOptions, Parser, PlainEnglish}; use crate::punctuation::Punctuation; use crate::spell::{Dictionary, FstDictionary}; use crate::vec_ext::VecExt; use crate::{CharStringExt, FatStringToken, FatToken, Lrc, Token, TokenKind, TokenStringExt}; use crate::{OrdinalSuffix, Span}; /// A document containing some amount of lexed and parsed English text. #[derive(Debug, Clone)] pub struct Document { source: Lrc>, tokens: Vec, } impl Default for Document { fn default() -> Self { Self::new("", &PlainEnglish, &FstDictionary::curated()) } } impl Document { /// Locate all the tokens that intersect a provided span. /// /// Desperately needs optimization. pub fn token_indices_intersecting(&self, span: Span) -> Vec { self.tokens() .enumerate() .filter_map(|(idx, tok)| tok.span.overlaps_with(span).then_some(idx)) .collect() } /// Locate all the tokens that intersect a provided span and convert them to [`FatToken`]s. /// /// Desperately needs optimization. pub fn fat_tokens_intersecting(&self, span: Span) -> Vec { let indices = self.token_indices_intersecting(span); indices .into_iter() .map(|i| self.tokens[i].to_fat(&self.source)) .collect() } /// Lexes and parses text to produce a document using a provided language /// parser and dictionary. pub fn new(text: &str, parser: &impl Parser, dictionary: &impl Dictionary) -> Self { let source: Vec<_> = text.chars().collect(); Self::new_from_vec(Lrc::new(source), parser, dictionary) } /// Lexes and parses text to produce a document using a provided language /// parser and the included curated dictionary. pub fn new_curated(text: &str, parser: &impl Parser) -> Self { let source: Vec<_> = text.chars().collect(); Self::new_from_vec(Lrc::new(source), parser, &FstDictionary::curated()) } /// Lexes and parses text to produce a document using a provided language /// parser and dictionary. pub fn new_from_vec( source: Lrc>, parser: &impl Parser, dictionary: &impl Dictionary, ) -> Self { let tokens = parser.parse(&source); let mut document = Self { source, tokens }; document.parse(dictionary); document } /// Create a new document from character data using the built-in [`PlainEnglish`] /// parser and curated dictionary. This avoids string-to-char conversions. pub fn new_plain_english_curated_chars(source: &[char]) -> Self { Self::new_from_vec( Lrc::new(source.to_vec()), &PlainEnglish, &FstDictionary::curated(), ) } /// Parse text to produce a document using the built-in [`PlainEnglish`] /// parser and curated dictionary. pub fn new_plain_english_curated(text: &str) -> Self { Self::new(text, &PlainEnglish, &FstDictionary::curated()) } /// Create a new document simply by tokenizing the provided input and applying fix-ups. The /// contained words will not contain any metadata. /// /// This avoids running potentially expensive metadata generation code, so this is more /// efficient if you don't need that information. pub(crate) fn new_basic_tokenize(text: &str, parser: &impl Parser) -> Self { let source = Lrc::new(text.chars().collect_vec()); let tokens = parser.parse(&source); let mut document = Self { source, tokens }; document.apply_fixups(); document } /// Parse text to produce a document using the built-in [`PlainEnglish`] /// parser and a provided dictionary. pub fn new_plain_english(text: &str, dictionary: &impl Dictionary) -> Self { Self::new(text, &PlainEnglish, dictionary) } /// Parse text to produce a document using the built-in [`Markdown`] parser /// and curated dictionary. pub fn new_markdown_curated(text: &str, markdown_options: MarkdownOptions) -> Self { Self::new( text, &Markdown::new(markdown_options), &FstDictionary::curated(), ) } /// Create a new document from character data using the built-in [`Markdown`] parser /// and curated dictionary. This avoids string-to-char conversions. pub fn new_markdown_default_curated_chars(chars: &[char]) -> Self { Self::new_from_vec( chars.to_vec().into(), &Markdown::default(), &FstDictionary::curated(), ) } /// Parse text to produce a document using the built-in [`Markdown`] parser /// and curated dictionary with the default Markdown configuration. pub fn new_markdown_default_curated(text: &str) -> Self { Self::new_markdown_curated(text, MarkdownOptions::default()) } /// Parse text to produce a document using the built-in [`PlainEnglish`] /// parser and the curated dictionary. pub fn new_markdown( text: &str, markdown_options: MarkdownOptions, dictionary: &impl Dictionary, ) -> Self { Self::new(text, &Markdown::new(markdown_options), dictionary) } /// Parse text to produce a document using the built-in [`PlainEnglish`] /// parser and the curated dictionary with the default Markdown configuration. pub fn new_markdown_default(text: &str, dictionary: &impl Dictionary) -> Self { Self::new_markdown(text, MarkdownOptions::default(), dictionary) } fn apply_fixups(&mut self) { self.condense_spaces(); self.condense_newlines(); self.newlines_to_breaks(); self.condense_dotted_initialisms(); self.condense_number_suffixes(); self.condense_ellipsis(); self.condense_dotted_truncations(); self.condense_common_top_level_domains(); self.condense_filename_extensions(); self.condense_tldr(); self.condense_ampersand_pairs(); self.condense_slash_pairs(); self.match_quotes(); } /// Re-parse important language constructs. /// /// Should be run after every change to the underlying [`Self::source`]. fn parse(&mut self, dictionary: &impl Dictionary) { self.apply_fixups(); let chunker = burn_chunker(); let tagger = brill_tagger(); for sent in self.tokens.iter_sentences_mut() { let token_strings: Vec<_> = sent .iter() .filter(|t| !t.kind.is_whitespace()) .map(|t| t.span.get_content_string(&self.source)) .collect(); let token_tags = tagger.tag_sentence(&token_strings); let np_flags = chunker.chunk_sentence(&token_strings, &token_tags); let mut i = 0; // Annotate DictWord metadata for token in sent.iter_mut() { if let TokenKind::Word(meta) = &mut token.kind { let word_source = token.span.get_content(&self.source); let mut found_meta = dictionary .get_word_metadata(word_source) .map(|c| c.into_owned()); if let Some(inner) = &mut found_meta { inner.pos_tag = token_tags[i].or_else(|| inner.infer_pos_tag()); inner.np_member = Some(np_flags[i]); } *meta = found_meta; i += 1; } else if !token.kind.is_whitespace() { i += 1; } } } } /// Convert all sets of newlines greater than 2 to paragraph breaks. fn newlines_to_breaks(&mut self) { for token in &mut self.tokens { if let TokenKind::Newline(n) = token.kind && n >= 2 { token.kind = TokenKind::ParagraphBreak; } } } /// Given a list of indices, this function removes the subsequent /// `stretch_len - 1` elements after each index. /// /// Will extend token spans to include removed elements. /// Assumes condensed tokens are contiguous in source text. fn condense_indices(&mut self, indices: &[usize], stretch_len: usize) { // Update spans for idx in indices { let end_tok = self.tokens[idx + stretch_len - 1].clone(); let start_tok = &mut self.tokens[*idx]; start_tok.span.end = end_tok.span.end; } // Trim let old = self.tokens.clone(); self.tokens.clear(); // Keep first chunk. self.tokens .extend_from_slice(&old[0..indices.first().copied().unwrap_or(indices.len())]); let mut iter = indices.iter().peekable(); while let (Some(a_idx), b) = (iter.next(), iter.peek()) { self.tokens.push(old[*a_idx].clone()); if let Some(b_idx) = b { self.tokens .extend_from_slice(&old[a_idx + stretch_len..**b_idx]); } } // Keep last chunk. self.tokens.extend_from_slice( &old[indices .last() .map(|v| v + stretch_len) .unwrap_or(indices.len())..], ); } pub fn get_token_at_char_index(&self, char_index: usize) -> Option<&Token> { let index = self .tokens .binary_search_by(|t| { if t.span.overlaps_with(Span::new_with_len(char_index, 1)) { Ordering::Equal } else { t.span.start.cmp(&char_index) } }) .ok()?; Some(&self.tokens[index]) } /// Defensively attempt to grab a specific token. pub fn get_token(&self, index: usize) -> Option<&Token> { self.tokens.get(index) } /// Get a token at a signed offset from a base index, or None if out of bounds. pub fn get_token_offset(&self, base: usize, offset: isize) -> Option<&Token> { match base.checked_add_signed(offset) { None => None, Some(idx) => self.get_token(idx), } } /// Get an iterator over all the tokens contained in the document. pub fn tokens(&self) -> impl Iterator + '_ { self.tokens.iter() } pub fn iter_nominal_phrases(&self) -> impl Iterator { fn is_np_member(t: &Token) -> bool { t.kind .as_word() .and_then(|x| x.as_ref()) .and_then(|w| w.np_member) .unwrap_or(false) } fn trim(slice: &[Token]) -> &[Token] { let mut start = 0; let mut end = slice.len(); while start < end && slice[start].kind.is_whitespace() { start += 1; } while end > start && slice[end - 1].kind.is_whitespace() { end -= 1; } &slice[start..end] } self.tokens .as_slice() .split(|t| !(is_np_member(t) || t.kind.is_whitespace())) .filter_map(|s| { let s = trim(s); if s.iter().any(is_np_member) { Some(s) } else { None } }) } /// Get an iterator over all the tokens contained in the document. pub fn fat_tokens(&self) -> impl Iterator + '_ { self.tokens().map(|token| token.to_fat(&self.source)) } /// Get the next or previous word token relative to a base index, if separated by whitespace. /// Returns None if the next/previous token is not a word or does not exist. pub fn get_next_word_from_offset(&self, base: usize, offset: isize) -> Option<&Token> { // Look for whitespace at the expected offset if !self.get_token_offset(base, offset)?.kind.is_whitespace() { return None; } // Now look beyond the whitespace for a word token let word_token = self.get_token_offset(base, offset + offset.signum()); let word_token = word_token?; word_token.kind.is_word().then_some(word_token) } /// Get an iterator over all the tokens contained in the document. pub fn fat_string_tokens(&self) -> impl Iterator + '_ { self.fat_tokens().map(|t| t.into()) } pub fn get_span_content(&self, span: &Span) -> &[char] { span.get_content(&self.source) } pub fn get_span_content_str(&self, span: &Span) -> String { String::from_iter(self.get_span_content(span)) } pub fn get_full_string(&self) -> String { self.get_span_content_str(&Span::new(0, self.source.len())) } pub fn get_full_content(&self) -> &[char] { &self.source } pub fn get_source(&self) -> &[char] { &self.source } pub fn get_tokens(&self) -> &[Token] { &self.tokens } /// Searches for quotation marks and fills the /// [`Punctuation::Quote::twin_loc`] field. This is on a best-effort /// basis. /// /// Current algorithm is based on https://leancrew.com/all-this/2025/03/a-mac-smart-quote-curiosity fn match_quotes(&mut self) { let mut pg_indices: Vec<_> = vec![0]; pg_indices.extend(self.iter_paragraph_break_indices()); pg_indices.push(self.tokens.len()); // Avoid allocation in loop let mut quote_indices = Vec::new(); let mut open_quote_indices = Vec::new(); for (start, end) in pg_indices.into_iter().tuple_windows() { let pg = &mut self.tokens[start..end]; quote_indices.clear(); quote_indices.extend(pg.iter_quote_indices()); open_quote_indices.clear(); // Find open quotes first. for quote in "e_indices { let is_open = *quote == 0 || pg[0..*quote].iter_word_likes().next().is_none() || pg[quote - 1].kind.is_whitespace() || matches!( pg[quote - 1].kind.as_punctuation(), Some(Punctuation::LessThan) | Some(Punctuation::OpenRound) | Some(Punctuation::OpenSquare) | Some(Punctuation::OpenCurly) | Some(Punctuation::Apostrophe) ); if is_open { open_quote_indices.push(*quote); } } while let Some(open_idx) = open_quote_indices.pop() { let Some(close_idx) = pg[open_idx + 1..].iter_quote_indices().next() else { continue; }; if pg[close_idx + open_idx + 1] .kind .as_quote() .unwrap() .twin_loc .is_some() { continue; } pg[open_idx].kind.as_mut_quote().unwrap().twin_loc = Some(close_idx + open_idx + start + 1); pg[close_idx + open_idx + 1] .kind .as_mut_quote() .unwrap() .twin_loc = Some(open_idx + start); } } } /// Searches for number suffixes and condenses them down into single tokens fn condense_number_suffixes(&mut self) { if self.tokens.len() < 2 { return; } let mut replace_starts = Vec::new(); for idx in 0..self.tokens.len() - 1 { let b = &self.tokens[idx + 1]; let a = &self.tokens[idx]; // TODO: Allow spaces between `a` and `b` if let (TokenKind::Number(..), TokenKind::Word(..)) = (&a.kind, &b.kind) && let Some(found_suffix) = OrdinalSuffix::from_chars(self.get_span_content(&b.span)) { self.tokens[idx].kind.as_mut_number().unwrap().suffix = Some(found_suffix); replace_starts.push(idx); } } self.condense_indices(&replace_starts, 2); } /// Searches for multiple sequential space tokens and condenses them down /// into one. fn condense_spaces(&mut self) { let mut cursor = 0; let copy = self.tokens.clone(); let mut remove_these = VecDeque::new(); while cursor < self.tokens.len() { // Locate a stretch of one or more newline tokens. let start_tok = &mut self.tokens[cursor]; if let TokenKind::Space(start_count) = &mut start_tok.kind { loop { cursor += 1; if cursor >= copy.len() { break; } let child_tok = ©[cursor]; // Only condense adjacent spans if start_tok.span.end != child_tok.span.start { break; } if let TokenKind::Space(n) = child_tok.kind { *start_count += n; start_tok.span.end = child_tok.span.end; remove_these.push_back(cursor); cursor += 1; } else { break; }; } } cursor += 1; } self.tokens.remove_indices(remove_these); } thread_local! { static DOTTED_TRUNCATION_EXPR: Lrc = Document::uncached_dotted_truncation_expr(); } fn uncached_dotted_truncation_expr() -> Lrc { Lrc::new(FirstMatchOf::new(vec![ Box::new(SequenceExpr::word_set(&["esp", "etc", "vs"]).then_period()), Box::new( SequenceExpr::aco("et") .then_whitespace() .t_aco("al") .then_period(), ), ])) } /// Assumes that the first matched token is the canonical one to be condensed into. /// Takes a callback that can be used to retroactively edit the canonical token afterwards. fn condense_expr(&mut self, expr: &impl Expr, edit: F) where F: Fn(&mut Token), { let matches = expr.iter_matches_in_doc(self).collect::>(); let mut remove_indices = VecDeque::with_capacity(matches.len()); for m in matches { remove_indices.extend(m.start + 1..m.end); self.tokens[m.start].span = self.tokens[m.into_iter()].span().unwrap(); edit(&mut self.tokens[m.start]); } self.tokens.remove_indices(remove_indices); } fn condense_dotted_truncations(&mut self) { self.condense_expr(&Self::DOTTED_TRUNCATION_EXPR.with(|v| v.clone()), |_| {}) } /// Searches for multiple sequential newline tokens and condenses them down /// into one. fn condense_newlines(&mut self) { let mut cursor = 0; let copy = self.tokens.clone(); let mut remove_these = VecDeque::new(); while cursor < self.tokens.len() { // Locate a stretch of one or more newline tokens. let start_tok = &mut self.tokens[cursor]; if let TokenKind::Newline(start_count) = &mut start_tok.kind { loop { cursor += 1; if cursor >= copy.len() { break; } let child_tok = ©[cursor]; if let TokenKind::Newline(n) = child_tok.kind { *start_count += n; start_tok.span.end = child_tok.span.end; remove_these.push_back(cursor); cursor += 1; } else { break; }; } } cursor += 1; } self.tokens.remove_indices(remove_these); } /// Condenses words like "i.e.", "e.g." and "N.S.A." down to single words /// using a state machine. fn condense_dotted_initialisms(&mut self) { if self.tokens.len() < 2 { return; } let mut to_remove = VecDeque::new(); let mut cursor = 1; let mut initialism_start = None; loop { let a = &self.tokens[cursor - 1]; let b = &self.tokens[cursor]; let is_initialism_chunk = a.kind.is_word() && a.span.len() == 1 && b.kind.is_period(); if is_initialism_chunk { if initialism_start.is_none() { initialism_start = Some(cursor - 1); } else { to_remove.push_back(cursor - 1); } to_remove.push_back(cursor); cursor += 1; } else { if let Some(start) = initialism_start { let end = self.tokens[cursor - 2].span.end; let start_tok: &mut Token = &mut self.tokens[start]; start_tok.span.end = end; } initialism_start = None; } cursor += 1; if cursor >= self.tokens.len() - 1 { break; } } self.tokens.remove_indices(to_remove); } /// Condenses likely filename extensions down to single tokens. fn condense_filename_extensions(&mut self) { if self.tokens.len() < 2 { return; } let mut to_remove = VecDeque::new(); let mut cursor = 1; let mut ext_start = None; loop { // left context, dot, extension, right context let l = self.get_token_offset(cursor, -2); let d = &self.tokens[cursor - 1]; let x = &self.tokens[cursor]; let r = self.get_token_offset(cursor, 1); let is_ext_chunk = d.kind.is_period() && x.kind.is_word() && x.span.len() <= 3 && ((l.is_none_or(|t| t.kind.is_whitespace()) && r.is_none_or(|t| t.kind.is_whitespace())) || (l.is_some_and(|t| t.kind.is_open_round()) && r.is_some_and(|t| t.kind.is_close_round()))) && { let ext_chars = x.span.get_content(&self.source); ext_chars.iter().all(|c| c.is_ascii_lowercase()) || ext_chars.iter().all(|c| c.is_ascii_uppercase()) }; if is_ext_chunk { if ext_start.is_none() { ext_start = Some(cursor - 1); self.tokens[cursor - 1].kind = TokenKind::Unlintable; } else { to_remove.push_back(cursor - 1); } to_remove.push_back(cursor); cursor += 1; } else { if let Some(start) = ext_start { let end = self.tokens[cursor - 2].span.end; let start_tok: &mut Token = &mut self.tokens[start]; start_tok.span.end = end; } ext_start = None; } cursor += 1; if cursor >= self.tokens.len() { break; } } self.tokens.remove_indices(to_remove); } /// Condenses common top-level domains (for example: `.blog`, `.com`) down to single tokens. fn condense_common_top_level_domains(&mut self) { const COMMON_TOP_LEVEL_DOMAINS: &[&str; 106] = &[ "ai", "app", "blog", "co", "com", "dev", "edu", "gov", "info", "io", "me", "mil", "net", "org", "shop", "tech", "uk", "us", "xyz", "jp", "de", "fr", "br", "it", "ru", "es", "pl", "ca", "au", "cn", "in", "nl", "eu", "ch", "id", "at", "kr", "cz", "mx", "be", "tv", "se", "tr", "tw", "al", "ua", "ir", "vn", "cl", "sk", "ly", "cc", "to", "no", "fi", "pt", "dk", "ar", "hu", "tk", "gr", "il", "news", "ro", "my", "biz", "ie", "za", "nz", "sg", "ee", "th", "pe", "bg", "hk", "rs", "lt", "link", "ph", "club", "si", "site", "mobi", "by", "cat", "wiki", "la", "ga", "xxx", "cf", "hr", "ng", "jobs", "online", "kz", "ug", "gq", "ae", "is", "lv", "pro", "fm", "tips", "ms", "sa", "int", ]; if self.tokens.len() < 2 { return; } let mut to_remove = VecDeque::new(); for cursor in 1..self.tokens.len() { // left context, dot, tld, right context let l = self.get_token_offset(cursor, -2); let d = &self.tokens[cursor - 1]; let tld = &self.tokens[cursor]; let r = self.get_token_offset(cursor, 1); let is_tld_chunk = d.kind.is_period() && tld.kind.is_word() && tld .span .get_content(&self.source) .iter() .all(|c| c.is_ascii_alphabetic()) && tld .span .get_content(&self.source) .eq_any_ignore_ascii_case_str(COMMON_TOP_LEVEL_DOMAINS) && ((l.is_none_or(|t| t.kind.is_whitespace()) && r.is_none_or(|t| t.kind.is_whitespace())) || (l.is_some_and(|t| t.kind.is_open_round()) && r.is_some_and(|t| t.kind.is_close_round()))); if is_tld_chunk { self.tokens[cursor - 1].kind = TokenKind::Unlintable; self.tokens[cursor - 1].span.end = self.tokens[cursor].span.end; to_remove.push_back(cursor); } } self.tokens.remove_indices(to_remove); } /// Condenses "tl;dr" down to a single word token. fn condense_tldr(&mut self) { if self.tokens.len() < 3 { return; } let mut to_remove = VecDeque::new(); let mut cursor = 2; loop { let tl = &self.tokens[cursor - 2]; let simicolon = &self.tokens[cursor - 1]; let dr = &self.tokens[cursor]; let is_tldr_chunk = tl.kind.is_word() && tl.span.len() == 2 && tl .span .get_content(&self.source) .eq_ignore_ascii_case_chars(&['t', 'l']) && simicolon.kind.is_semicolon() && dr.kind.is_word() && dr.span.len() >= 2 && dr.span.len() <= 3 && dr .span .get_content(&self.source) .eq_any_ignore_ascii_case_chars(&[&['d', 'r'], &['d', 'r', 's']]); if is_tldr_chunk { // Update the first token to be the full "tl;dr" as a word self.tokens[cursor - 2].span = Span::new( self.tokens[cursor - 2].span.start, self.tokens[cursor].span.end, ); // Mark the semicolon and "dr" tokens for removal to_remove.push_back(cursor - 1); to_remove.push_back(cursor); } // Skip ahead since we've processed these tokens cursor += 1; if cursor >= self.tokens.len() { break; } } // Remove the marked tokens in reverse order to maintain correct indices self.tokens.remove_indices(to_remove); } /// Allows condensing of delimited pairs of tokens into a single token. /// /// # Arguments /// /// * `is_delimiter` - A function that returns `true` if the token is a delimiter. /// * `valid_pairs` - A slice of tuples representing the valid pairs of tokens to condense. /// fn condense_delimited_pairs(&mut self, is_delimiter: F, valid_pairs: &[(char, char)]) where F: Fn(&TokenKind) -> bool, { if self.tokens.len() < 3 { return; } let mut to_remove = VecDeque::new(); let mut cursor = 2; loop { let l1 = &self.tokens[cursor - 2]; let delim = &self.tokens[cursor - 1]; let l2 = &self.tokens[cursor]; let is_delimited_chunk = l1.kind.is_word() && l1.span.len() == 1 && is_delimiter(&delim.kind) && l2.kind.is_word() && l2.span.len() == 1; if is_delimited_chunk { let (l1, l2) = ( l1.span.get_content(&self.source).first(), l2.span.get_content(&self.source).first(), ); let is_valid_pair = match (l1, l2) { (Some(l1), Some(l2)) => { let pair = (l1.to_ascii_lowercase(), l2.to_ascii_lowercase()); valid_pairs.contains(&pair) } _ => false, }; if is_valid_pair { self.tokens[cursor - 2].span = Span::new( self.tokens[cursor - 2].span.start, self.tokens[cursor].span.end, ); to_remove.push_back(cursor - 1); to_remove.push_back(cursor); } } cursor += 1; if cursor >= self.tokens.len() { break; } } self.tokens.remove_indices(to_remove); } // Condenses "ampersand pairs" such as "R&D" or "Q&A" into single tokens. fn condense_ampersand_pairs(&mut self) { self.condense_delimited_pairs( |kind| kind.is_ampersand(), &[ ('b', 'b'), // bed & breakfast ('b', 'w'), // black & white ('g', 't'), // gin & tonic ('k', 'r'), // Kernighan & Ritchie ('q', 'a'), // question & answer ('r', 'b'), // rhythm & blues ('r', 'd'), // research & development ('r', 'r'), // rest & relaxation ('s', 'p'), // Standard & Poor's ], ); } // Condenses "slash pairs" such as "I/O" into single tokens. fn condense_slash_pairs(&mut self) { self.condense_delimited_pairs( |kind| kind.is_slash(), &[ ('a', 'c'), // aircon; alternating current ('b', 'w'), // black and white ('c', 'o'), // care of ('d', 'c'), // direct current ('d', 'l'), // download ('i', 'o'), // input/output ('j', 'k'), // just kidding ('n', 'a'), // not applicable ('r', 'c'), // radio control ('s', 'n'), // serial number ('y', 'n'), // yes/no ('y', 'o'), // years old ], ); } fn uncached_ellipsis_pattern() -> Lrc { let period = SequenceExpr::default().then_period(); Lrc::new(Repeating::new(Box::new(period), 2)) } thread_local! { static ELLIPSIS_EXPR: Lrc = Document::uncached_ellipsis_pattern(); } fn condense_ellipsis(&mut self) { let expr = Self::ELLIPSIS_EXPR.with(|v| v.clone()); self.condense_expr(&expr, |tok| { tok.kind = TokenKind::Punctuation(Punctuation::Ellipsis) }); } } /// Creates functions necessary to implement [`TokenStringExt]` on a document. macro_rules! create_fns_on_doc { ($thing:ident) => { paste! { fn [< first_ $thing >](&self) -> Option<&Token> { self.tokens.[< first_ $thing >]() } fn [< last_ $thing >](&self) -> Option<&Token> { self.tokens.[< last_ $thing >]() } fn [< last_ $thing _index>](&self) -> Option { self.tokens.[< last_ $thing _index >]() } fn [](&self) -> impl DoubleEndedIterator + '_ { self.tokens.[< iter_ $thing _indices >]() } fn [](&self) -> impl Iterator + '_ { self.tokens.[< iter_ $thing s >]() } } }; } impl TokenStringExt for Document { create_fns_on_doc!(adjective); create_fns_on_doc!(apostrophe); create_fns_on_doc!(at); create_fns_on_doc!(chunk_terminator); create_fns_on_doc!(comma); create_fns_on_doc!(conjunction); create_fns_on_doc!(currency); create_fns_on_doc!(ellipsis); create_fns_on_doc!(hostname); create_fns_on_doc!(likely_homograph); create_fns_on_doc!(noun); create_fns_on_doc!(number); create_fns_on_doc!(paragraph_break); create_fns_on_doc!(pipe); create_fns_on_doc!(preposition); create_fns_on_doc!(punctuation); create_fns_on_doc!(quote); create_fns_on_doc!(sentence_terminator); create_fns_on_doc!(space); create_fns_on_doc!(unlintable); create_fns_on_doc!(verb); create_fns_on_doc!(word); create_fns_on_doc!(word_like); create_fns_on_doc!(heading_start); fn first_sentence_word(&self) -> Option<&Token> { self.tokens.first_sentence_word() } fn first_non_whitespace(&self) -> Option<&Token> { self.tokens.first_non_whitespace() } fn span(&self) -> Option> { self.tokens.span() } fn iter_linking_verb_indices(&self) -> impl Iterator + '_ { self.tokens.iter_linking_verb_indices() } fn iter_linking_verbs(&self) -> impl Iterator + '_ { self.tokens.iter_linking_verbs() } fn iter_chunks(&self) -> impl Iterator + '_ { self.tokens.iter_chunks() } fn iter_paragraphs(&self) -> impl Iterator + '_ { self.tokens.iter_paragraphs() } fn iter_headings(&self) -> impl Iterator + '_ { self.tokens.iter_headings() } fn iter_sentences(&self) -> impl Iterator + '_ { self.tokens.iter_sentences() } fn iter_sentences_mut(&mut self) -> impl Iterator + '_ { self.tokens.iter_sentences_mut() } } impl Display for Document { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { for token in &self.tokens { write!(f, "{}", self.get_span_content_str(&token.span))?; } Ok(()) } } #[cfg(test)] mod tests { use itertools::Itertools; use super::Document; use crate::TokenStringExt; use crate::{Span, parsers::MarkdownOptions}; fn assert_condensed_contractions(text: &str, final_tok_count: usize) { let document = Document::new_plain_english_curated(text); assert_eq!(document.tokens.len(), final_tok_count); let document = Document::new_markdown_curated(text, MarkdownOptions::default()); assert_eq!(document.tokens.len(), final_tok_count); } #[test] fn simple_contraction() { assert_condensed_contractions("isn't", 1); } #[test] fn simple_contraction2() { assert_condensed_contractions("wasn't", 1); } #[test] fn simple_contraction3() { assert_condensed_contractions("There's", 1); } #[test] fn simple_contraction4() { assert_condensed_contractions("doesn't", 1); } #[test] fn medium_contraction() { assert_condensed_contractions("isn't wasn't", 3); } #[test] fn medium_contraction2() { assert_condensed_contractions("There's no way", 5); } #[test] fn selects_token_at_char_index() { let text = "There were three little pigs. They built three little homes."; let document = Document::new_plain_english_curated(text); let got = document.get_token_at_char_index(19).unwrap(); assert!(got.kind.is_word()); assert_eq!(got.span, Span::new(17, 23)); } fn assert_token_count(source: &str, count: usize) { let document = Document::new_plain_english_curated(source); dbg!(document.tokens().map(|t| t.kind.clone()).collect_vec()); assert_eq!(document.tokens.len(), count); } #[test] fn condenses_number_suffixes() { assert_token_count("1st", 1); assert_token_count("This is the 2nd test", 9); assert_token_count("This is the 3rd test", 9); assert_token_count( "It works even with weird capitalization like this: 600nD", 18, ); } #[test] fn condenses_ie() { assert_token_count("There is a thing (i.e. that one)", 15); assert_token_count("We are trying to condense \"i.e.\"", 13); assert_token_count(r#"Condenses words like "i.e.", "e.g." and "N.S.A.""#, 20); } #[test] fn condenses_eg() { assert_token_count("We are trying to condense \"e.g.\"", 13); assert_token_count(r#"Condenses words like "i.e.", "e.g." and "N.S.A.""#, 20); } #[test] fn condenses_nsa() { assert_token_count(r#"Condenses words like "i.e.", "e.g." and "N.S.A.""#, 20); } #[test] fn parses_ellipsis() { assert_token_count("...", 1); } #[test] fn parses_long_ellipsis() { assert_token_count(".....", 1); } #[test] fn parses_short_ellipsis() { assert_token_count("..", 1); } #[test] fn selects_token_at_offset() { let doc = Document::new_plain_english_curated("Foo bar baz"); let tok = doc.get_token_offset(1, -1).unwrap(); assert_eq!(tok.span, Span::new(0, 3)); } #[test] fn cant_select_token_before_start() { let doc = Document::new_plain_english_curated("Foo bar baz"); let tok = doc.get_token_offset(0, -1); assert!(tok.is_none()); } #[test] fn select_next_word_pos_offset() { let doc = Document::new_plain_english_curated("Foo bar baz"); let bar = doc.get_next_word_from_offset(0, 1).unwrap(); let bar = doc.get_span_content(&bar.span); assert_eq!(bar, ['b', 'a', 'r']); } #[test] fn select_next_word_neg_offset() { let doc = Document::new_plain_english_curated("Foo bar baz"); let bar = doc.get_next_word_from_offset(2, -1).unwrap(); let bar = doc.get_span_content(&bar.span); assert_eq!(bar, ['F', 'o', 'o']); } #[test] fn cant_select_next_word_not_from_whitespace() { let doc = Document::new_plain_english_curated("Foo bar baz"); let tok = doc.get_next_word_from_offset(0, 2); assert!(tok.is_none()); } #[test] fn cant_select_next_word_before_start() { let doc = Document::new_plain_english_curated("Foo bar baz"); let tok = doc.get_next_word_from_offset(0, -1); assert!(tok.is_none()); } #[test] fn cant_select_next_word_with_punctuation_instead_of_whitespace() { let doc = Document::new_plain_english_curated("Foo, bar, baz"); let tok = doc.get_next_word_from_offset(0, 1); assert!(tok.is_none()); } #[test] fn cant_select_next_word_with_punctuation_after_whitespace() { let doc = Document::new_plain_english_curated("Foo \"bar\", baz"); let tok = doc.get_next_word_from_offset(0, 1); assert!(tok.is_none()); } #[test] fn condenses_filename_extensions() { let doc = Document::new_plain_english_curated(".c and .exe and .js"); assert!(doc.tokens[0].kind.is_unlintable()); assert!(doc.tokens[4].kind.is_unlintable()); assert!(doc.tokens[8].kind.is_unlintable()); } #[test] fn condense_filename_extension_ok_at_start_and_end() { let doc = Document::new_plain_english_curated(".c and .EXE"); assert!(doc.tokens.len() == 5); assert!(doc.tokens[0].kind.is_unlintable()); assert!(doc.tokens[4].kind.is_unlintable()); } #[test] fn doesnt_condense_filename_extensions_with_mixed_case() { let doc = Document::new_plain_english_curated(".c and .Exe"); assert!(doc.tokens.len() == 6); assert!(doc.tokens[0].kind.is_unlintable()); assert!(doc.tokens[4].kind.is_punctuation()); assert!(doc.tokens[5].kind.is_word()); } #[test] fn doesnt_condense_filename_extensions_with_non_letters() { let doc = Document::new_plain_english_curated(".COM and .C0M"); assert!(doc.tokens.len() == 6); assert!(doc.tokens[0].kind.is_unlintable()); assert!(doc.tokens[4].kind.is_punctuation()); assert!(doc.tokens[5].kind.is_word()); } #[test] fn doesnt_condense_filename_extensions_longer_than_three() { let doc = Document::new_plain_english_curated(".dll and .dlls"); assert!(doc.tokens.len() == 6); assert!(doc.tokens[0].kind.is_unlintable()); assert!(doc.tokens[4].kind.is_punctuation()); assert!(doc.tokens[5].kind.is_word()); } #[test] fn condense_filename_extension_in_parens() { let doc = Document::new_plain_english_curated( "true for the manual installation when trying to run the executable(.exe) after a manual download", ); assert!(doc.tokens.len() > 23); assert!(doc.tokens[21].kind.is_open_round()); assert!(doc.tokens[22].kind.is_unlintable()); assert!(doc.tokens[23].kind.is_close_round()); } #[test] fn condense_tldr_uppercase() { let doc = Document::new_plain_english_curated("TL;DR"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); assert!(doc.tokens[0].span.len() == 5); } #[test] fn condense_tldr_lowercase() { let doc = Document::new_plain_english_curated("tl;dr"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn condense_tldr_mixed_case_1() { let doc = Document::new_plain_english_curated("tl;DR"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn condense_tldr_mixed_case_2() { let doc = Document::new_plain_english_curated("TL;Dr"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn condense_tldr_pural() { let doc = Document::new_plain_english_curated( "managing the flow between components to produce relevant TL;DRs of current news articles", ); // no token is a punctuation token - only words with whitespace between assert!( doc.tokens .iter() .all(|t| t.kind.is_word() || t.kind.is_whitespace()) ); // one of the word tokens contains a ';' character let tldrs = doc .tokens .iter() .filter(|t| t.span.get_content(&doc.source).contains(&';')) .collect_vec(); assert!(tldrs.len() == 1); assert!(tldrs[0].span.get_content_string(&doc.source) == "TL;DRs"); } #[test] fn condense_common_top_level_domains() { let doc = Document::new_plain_english_curated(".blog and .com and .NET"); assert!(doc.tokens.len() == 9); assert!(doc.tokens[0].kind.is_unlintable()); assert!(doc.tokens[4].kind.is_unlintable()); assert!(doc.tokens[8].kind.is_unlintable()); } #[test] fn condense_common_top_level_domains_in_parens() { let doc = Document::new_plain_english_curated("(.blog)"); assert!(doc.tokens.len() == 3); assert!(doc.tokens[0].kind.is_open_round()); assert!(doc.tokens[1].kind.is_unlintable()); assert!(doc.tokens[2].kind.is_close_round()); } #[test] fn doesnt_condense_unknown_top_level_domains() { let doc = Document::new_plain_english_curated(".harper"); assert!(doc.tokens.len() == 2); assert!(doc.tokens[0].kind.is_punctuation()); assert!(doc.tokens[1].kind.is_word()); } #[test] fn condense_r_and_d_caps() { let doc = Document::new_plain_english_curated("R&D"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn condense_r_and_d_mixed_case() { let doc = Document::new_plain_english_curated("R&d"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn condense_r_and_d_lowercase() { let doc = Document::new_plain_english_curated("r&d"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn dont_condense_r_and_d_with_spaces() { let doc = Document::new_plain_english_curated("R & D"); assert!(doc.tokens.len() == 5); assert!(doc.tokens[0].kind.is_word()); assert!(doc.tokens[1].kind.is_whitespace()); assert!(doc.tokens[2].kind.is_ampersand()); assert!(doc.tokens[3].kind.is_whitespace()); assert!(doc.tokens[4].kind.is_word()); } #[test] fn condense_q_and_a() { let doc = Document::new_plain_english_curated("A Q&A platform software for teams at any scales."); assert!(doc.tokens.len() >= 3); assert!(doc.tokens[2].kind.is_word()); assert!(doc.tokens[2].span.get_content_string(&doc.source) == "Q&A"); } #[test] fn dont_allow_mixed_r_and_d_with_q_and_a() { let doc = Document::new_plain_english_curated("R&A or Q&D"); assert!(doc.tokens.len() == 9); assert!(doc.tokens[1].kind.is_ampersand() || doc.tokens[7].kind.is_ampersand()); } #[test] fn condense_io() { let doc = Document::new_plain_english_curated("I/O"); assert!(doc.tokens.len() == 1); assert!(doc.tokens[0].kind.is_word()); } #[test] fn finds_unmatched_quotes_in_document() { let raw = r#" This is a paragraph with a single word "quoted." This is a second paragraph with no quotes. This is a third paragraph with a single erroneous "quote. This is a final paragraph with a weird "quote and a not-weird "quote". "#; let doc = Document::new_markdown_default_curated(raw); let quote_twins: Vec<_> = doc .iter_quotes() .map(|t| t.kind.as_quote().unwrap().twin_loc) .collect(); assert_eq!( quote_twins, vec![Some(19), Some(16), None, None, Some(89), Some(87)] ) } #[test] fn issue_1901() { let raw = r#" "A quoted line" "A quote without a closing mark "Another quoted lined" "The last quoted line" "#; let doc = Document::new_markdown_default_curated(raw); let quote_twins: Vec<_> = doc .iter_quotes() .map(|t| t.kind.as_quote().unwrap().twin_loc) .collect(); assert_eq!( quote_twins, vec![ Some(6), Some(0), None, Some(27), Some(21), Some(37), Some(29) ] ) } } ================================================ FILE: harper-core/src/edit_distance.rs ================================================ // Computes the Levenshtein edit distance between two patterns. // This is accomplished via a memory-optimized Wagner-Fischer algorithm // // This variant avoids allocation if you already have buffers. #[inline] pub fn edit_distance_min_alloc( source: &[char], target: &[char], previous_row: &mut Vec, current_row: &mut Vec, ) -> u8 { if cfg!(debug_assertions) { assert!(source.len() <= 255 && target.len() <= 255); } let row_width = source.len(); let col_height = target.len(); previous_row.clear(); previous_row.extend(0u8..=row_width as u8); // Alright if not zeroed, since we overwrite it anyway. current_row.resize(row_width + 1, 0); for j in 1..=col_height { current_row[0] = j as u8; for i in 1..=row_width { let cost = if source[i - 1] == target[j - 1] { 0 } else { 1 }; current_row[i] = (previous_row[i] + 1) .min(current_row[i - 1] + 1) .min(previous_row[i - 1] + cost); } std::mem::swap(previous_row, current_row); } previous_row[row_width] } pub fn edit_distance(source: &[char], target: &[char]) -> u8 { edit_distance_min_alloc(source, target, &mut Vec::new(), &mut Vec::new()) } #[cfg(test)] mod tests { use super::edit_distance; fn assert_edit_dist(source: &str, target: &str, expected: u8) { let source: Vec<_> = source.chars().collect(); let target: Vec<_> = target.chars().collect(); let dist = edit_distance(&source, &target); assert_eq!(dist, expected) } #[test] fn simple_edit_distance_1() { assert_edit_dist("kitten", "sitting", 3) } #[test] fn simple_edit_distance_2() { assert_edit_dist("saturday", "sunday", 3) } #[test] fn one_edit_distance() { let source: Vec<_> = "hello".chars().collect(); let target: Vec<_> = "hellos".chars().collect(); assert_eq!(edit_distance(&source, &target), 1); let target: Vec<_> = "hell".chars().collect(); assert_eq!(edit_distance(&source, &target), 1); let target: Vec<_> = "hell".chars().collect(); assert_eq!(edit_distance(&source, &target), 1); let target: Vec<_> = "hvllo".chars().collect(); assert_eq!(edit_distance(&source, &target), 1); let target: Vec<_> = "Hello".chars().collect(); assert_eq!(edit_distance(&source, &target), 1); } #[test] fn zero_edit_distance() { let source: Vec<_> = "hello".chars().collect(); let target: Vec<_> = "hello".chars().collect(); assert_eq!(edit_distance(&source, &target), 0); } } ================================================ FILE: harper-core/src/expr/all.rs ================================================ use crate::{Span, Token, expr::Expr}; /// An [`Expr`] that matches against tokens if and only if all of its children do. /// This can be useful for situations where you have multiple expressions that represent a grammatical /// error, but you need _all_ of them to match to be certain. /// /// It will return the position of the farthest window. #[derive(Default)] pub struct All { children: Vec>, } impl All { pub fn new(children: Vec>) -> Self { Self { children } } pub fn add(&mut self, e: impl Expr + 'static) { self.children.push(Box::new(e)); } } impl Expr for All { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let mut longest: Option> = None; for expr in self.children.iter() { let window = expr.run(cursor, tokens, source)?; if let Some(longest_window) = longest { if window.len() > longest_window.len() { longest = Some(window); } } else { longest = Some(window); } } longest } } ================================================ FILE: harper-core/src/expr/anchor_end.rs ================================================ use crate::Token; use super::Step; /// A [`Step`] which will match only if the cursor is over the last non-whitespace character in stream. /// It will return that token. /// /// For example, if you built `SequenceExpr::default().t_aco("word").then(AnchorEnd)` and ran it on `This is a word`, the resulting `Span` would only cover the final word token. pub struct AnchorEnd; impl Step for AnchorEnd { fn step(&self, tokens: &[Token], cursor: usize, _source: &[char]) -> Option { if tokens .iter() .enumerate() .rev() .filter(|(_, t)| !t.kind.is_whitespace()) .map(|(i, _)| i) .next() == Some(cursor) { Some(0) } else { None } } } #[cfg(test)] mod tests { use crate::expr::ExprExt; use crate::{Document, Span}; use super::AnchorEnd; #[test] fn matches_period() { let document = Document::new_markdown_default_curated("This is a test."); let matches: Vec<_> = AnchorEnd.iter_matches_in_doc(&document).collect(); assert_eq!(matches, vec![Span::new(7, 7)]) } #[test] fn does_not_match_empty() { let document = Document::new_markdown_default_curated(""); let matches: Vec<_> = AnchorEnd.iter_matches_in_doc(&document).collect(); assert_eq!(matches, vec![]) } } ================================================ FILE: harper-core/src/expr/anchor_start.rs ================================================ use crate::{Token, TokenStringExt}; use super::Step; /// A [`Step`] which will match only if the cursor is over the first word-like of a token stream. /// It will return that token. pub struct AnchorStart; impl Step for AnchorStart { fn step(&self, tokens: &[Token], cursor: usize, _source: &[char]) -> Option { if tokens.iter_word_like_indices().next() == Some(cursor) { Some(0) } else { None } } } #[cfg(test)] mod tests { use crate::expr::ExprExt; use crate::{Document, Span}; use super::AnchorStart; #[test] fn matches_first_word() { let document = Document::new_markdown_default_curated("This is a test."); let matches: Vec<_> = AnchorStart.iter_matches_in_doc(&document).collect(); assert_eq!(matches, vec![Span::new(0, 0)]) } #[test] fn does_not_match_empty() { let document = Document::new_markdown_default_curated(""); let matches: Vec<_> = AnchorStart.iter_matches_in_doc(&document).collect(); assert_eq!(matches, vec![]) } } ================================================ FILE: harper-core/src/expr/duration_expr.rs ================================================ use crate::patterns::{IndefiniteArticle, WordSet}; use crate::{Span, Token}; use super::{Expr, SequenceExpr, SpelledNumberExpr}; #[derive(Default)] pub struct DurationExpr; impl Expr for DurationExpr { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { if tokens.is_empty() { return None; } let units = WordSet::new(&[ "minute", "minutes", "hour", "hours", "day", "days", "week", "weeks", "month", "months", "year", "years", ]); let expr = SequenceExpr::longest_of(vec![ Box::new(SpelledNumberExpr), Box::new(SequenceExpr::default().then_number()), Box::new(IndefiniteArticle::default()), ]) .then_whitespace() .then(units); expr.run(cursor, tokens, source) } } #[cfg(test)] pub mod tests { use super::DurationExpr; use crate::Document; use crate::expr::ExprExt; use crate::linting::tests::SpanVecExt; #[test] fn detect_10_days() { let doc = Document::new_markdown_default_curated("Is 10 days a long time?"); let matches = DurationExpr.iter_matches_in_doc(&doc).collect::>(); assert_eq!(matches.to_strings(&doc), vec!["10 days"]); } #[test] fn detect_ten_days() { let doc = Document::new_markdown_default_curated("I think ten days is a long time."); let matches = DurationExpr.iter_matches_in_doc(&doc).collect::>(); assert_eq!(matches.to_strings(&doc), vec!["ten days"]); } } ================================================ FILE: harper-core/src/expr/expr_map.rs ================================================ use crate::LSend; use crate::Span; use crate::Token; use super::Expr; /// A map from an [`Expr`] to arbitrary data. /// /// It has been a common pattern for rule authors to build a list of expressions that match a /// grammatical error. /// Then, depending on which expression was matched, a suggestion is chosen from another list. /// /// The [`ExprMap`] unifies these two lists into one. /// /// When used as a [`Expr`] in and of itself, it simply iterates through /// all contained expressions, returning the first match found. /// You should not assume this search is deterministic. pub struct ExprMap where T: LSend, { rows: Vec>, } struct Row where T: LSend, { pub key: Box, pub element: T, } impl Default for ExprMap where T: LSend, { fn default() -> Self { Self { rows: Default::default(), } } } impl ExprMap where T: LSend, { pub fn insert(&mut self, expr: impl Expr + 'static, value: T) { self.rows.push(Row { key: Box::new(expr), element: value, }); } /// Look up the corresponding value for the given map. pub fn lookup(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option<&T> { self.rows .iter() .find(|row| row.key.run(cursor, tokens, source).is_some()) .map(|row| &row.element) } } impl Expr for ExprMap where T: LSend, { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.rows .iter() .find_map(|row| row.key.run(cursor, tokens, source)) } } ================================================ FILE: harper-core/src/expr/filter.rs ================================================ use crate::{Span, Token}; use super::Expr; /// An expression that wraps other expressions to build a filter-line pipeline. /// /// For example, let's say you wanted to build an expression that matches the spaces between two /// specific words. /// To do this, you could start with expression A that detects the pattern ` `. That is, /// a word, followed by a space, followed by a second word. You could then build Expression B, that /// simply matches the space. By combining these using a filter, you end up building an expression /// that matches expression A first, then narrows the result further to only match the resulting /// space. /// /// ``` rust /// use harper_core::patterns::WhitespacePattern; /// use harper_core::expr::{SequenceExpr, Filter, ExprExt}; /// use harper_core::{Span, Document}; /// /// let a = SequenceExpr::aco("chock").t_ws().t_aco("full"); /// let b = WhitespacePattern; /// /// let filter = Filter::new(vec![Box::new(a), Box::new(b)]); /// let doc = Document::new_markdown_default_curated("This test is chock full of insights."); /// /// let matches: Vec<_> = filter.iter_matches_in_doc(&doc).collect(); /// assert_eq!(vec![Span::new(7, 8)], matches) /// ``` pub struct Filter { steps: Vec>, } impl Filter { pub fn new(steps: Vec>) -> Self { Self { steps } } } impl Expr for Filter { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let mut result = self.steps.first()?.run(cursor, tokens, source)?; for step in self.steps.iter().skip(1) { let mut found = false; for i in 0..result.len() { let step_res = step.run(i, result.get_content(tokens), source); if let Some(step) = step_res { result = step.pushed_by(result.start); found = true; break; } } if !found { return None; } } Some(result) } } ================================================ FILE: harper-core/src/expr/first_match_of.rs ================================================ use super::Expr; use crate::{Span, Token}; /// A naive expr collection that naively iterates through a list of patterns, /// returning the first one that matches. /// /// Compare to [`LongestMatchOf`](super::LongestMatchOf), which returns the longest match. #[derive(Default)] pub struct FirstMatchOf { exprs: Vec>, } impl FirstMatchOf { pub fn new(exprs: Vec>) -> Self { Self { exprs } } pub fn add(&mut self, expr: impl Expr + 'static) { self.exprs.push(Box::new(expr)); } pub fn add_boxed(&mut self, expr: Box) { self.exprs.push(Box::new(expr)); } } impl Expr for FirstMatchOf { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.exprs .iter() .find_map(|p| p.run(cursor, tokens, source)) } } ================================================ FILE: harper-core/src/expr/fixed_phrase.rs ================================================ use crate::parsers::PlainEnglish; use crate::patterns::Word; use crate::{Document, Span, Token, TokenKind}; use super::{Expr, SequenceExpr}; /// Matches a fixed sequence of tokens as they appear in the input. /// Case-insensitive for words but maintains exact matching for other token types. /// /// # Example /// /// ```rust /// use harper_core::expr::{FixedPhrase, Expr}; /// use harper_core::Document; /// /// let doc = Document::new_plain_english_curated("Hello, world!"); /// let phrase = FixedPhrase::from_phrase("Hello, world!"); /// assert!(phrase.run(0, doc.get_tokens(), doc.get_source()).is_some()); /// ``` pub struct FixedPhrase { inner: SequenceExpr, } impl FixedPhrase { /// Creates a [`FixedPhrase`] from a plaintext string. /// Uses plain English tokenization rules. pub fn from_phrase(text: &str) -> Self { let document = Document::new_basic_tokenize(text, &PlainEnglish); Self::from_document(&document) } /// Creates a [`FixedPhrase`] from a pre-tokenized document. /// Allows custom tokenization by creating a `Document` first. pub fn from_document(doc: &Document) -> Self { let mut phrase = SequenceExpr::default(); for token in doc.fat_tokens() { match token.kind { TokenKind::Word(_lexeme_metadata) => { phrase = phrase.then(Word::from_chars(token.content.as_slice())); } TokenKind::Space(_) => { phrase = phrase.then_whitespace(); } TokenKind::Punctuation(p) => { phrase = phrase .then_kind_where(move |kind| kind.as_punctuation().cloned() == Some(p)); } TokenKind::ParagraphBreak => { phrase = phrase.then_whitespace(); } TokenKind::Number(_) => phrase = phrase.then_kind_where(|kind| kind.is_number()), _ => panic!("Fell out of expected document formats."), } } Self { inner: phrase } } } impl Expr for FixedPhrase { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.inner.run(cursor, tokens, source) } } #[cfg(test)] mod tests { use super::FixedPhrase; use crate::expr::Expr; use crate::{Document, Span}; #[test] fn test_not_case_sensitive() { let doc_lower = Document::new_plain_english_curated("hello world"); let doc_upper = Document::new_plain_english_curated("HELLO WORLD"); let doc_title = Document::new_plain_english_curated("Hello World"); let phrase = FixedPhrase::from_document(&doc_lower); assert_eq!( phrase.run(0, doc_lower.get_tokens(), doc_title.get_source()), Some(Span::new(0, 3)) ); assert_eq!( phrase.run(0, doc_lower.get_tokens(), doc_upper.get_source()), Some(Span::new(0, 3)) ); assert_eq!( phrase.run(0, doc_title.get_tokens(), doc_lower.get_source()), Some(Span::new(0, 3)) ); assert_eq!( phrase.run(0, doc_title.get_tokens(), doc_upper.get_source()), Some(Span::new(0, 3)) ); assert_eq!( phrase.run(0, doc_upper.get_tokens(), doc_lower.get_source()), Some(Span::new(0, 3)) ); assert_eq!( phrase.run(0, doc_upper.get_tokens(), doc_title.get_source()), Some(Span::new(0, 3)) ); } } ================================================ FILE: harper-core/src/expr/longest_match_of.rs ================================================ use crate::{Span, Token, expr::Expr}; /// An [`Expr`] that returns the farthest offset of the longest match in a list of expressions. #[derive(Default)] pub struct LongestMatchOf { exprs: Vec>, } impl LongestMatchOf { pub fn new(exprs: Vec>) -> Self { Self { exprs } } pub fn add(&mut self, expr: impl Expr + 'static) { self.exprs.push(Box::new(expr)); } } impl Expr for LongestMatchOf { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.exprs .iter() .filter_map(|expr| expr.run(cursor, tokens, source)) .max_by_key(Span::len) } } ================================================ FILE: harper-core/src/expr/mergeable_words.rs ================================================ use std::sync::Arc; use super::{Expr, SequenceExpr}; use crate::spell::{Dictionary, FstDictionary}; use crate::{CharString, DictWordMetadata, Span, Token}; type PredicateFn = dyn Fn(Option<&DictWordMetadata>, Option<&DictWordMetadata>) -> bool + Send + Sync; /// An [`Expr`] that identifies adjacent words that could potentially be merged into a single word. /// /// This checks if two adjacent words could form a valid compound word, but first verifies /// that the two words aren't already a valid entry in the dictionary (like "straight away"). pub struct MergeableWords { inner: SequenceExpr, dict: Arc, predicate: Box, } impl MergeableWords { pub fn new( predicate: impl Fn(Option<&DictWordMetadata>, Option<&DictWordMetadata>) -> bool + Send + Sync + 'static, ) -> Self { Self { inner: SequenceExpr::any_word().t_ws_h().then_any_word(), dict: FstDictionary::curated(), predicate: Box::new(predicate), } } /// Get the merged word from the dictionary if these words can be merged. /// Returns None if the words should remain separate (according to the predicate). pub fn get_merged_word( &self, word_a: &Token, word_b: &Token, source: &[char], ) -> Option { let a_chars: CharString = word_a.span.get_content(source).into(); let b_chars: CharString = word_b.span.get_content(source).into(); // First check if the open compound exists in the dictionary let mut compound = a_chars.clone(); compound.push(' '); compound.extend_from_slice(&b_chars); let meta_open = self.dict.get_word_metadata(&compound); // Then check if the closed compound exists in the dictionary compound.remove(a_chars.len()); let meta_closed = self.dict.get_word_metadata(&compound); if (self.predicate)(meta_closed.as_deref(), meta_open.as_deref()) { return Some(compound); } None } } impl Expr for MergeableWords { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let inner_match = self.inner.run(cursor, tokens, source)?; if inner_match.len() != 3 { return None; } if self .get_merged_word(&tokens[cursor], &tokens[cursor + 2], source) .is_some() { return Some(inner_match); } None } } #[cfg(test)] mod tests { use super::MergeableWords; use crate::{DictWordMetadata, Document}; fn predicate( meta_closed: Option<&DictWordMetadata>, meta_open: Option<&DictWordMetadata>, ) -> bool { meta_open.is_none() && meta_closed.is_some_and(|m| m.is_noun() && !m.is_proper_noun()) } #[test] fn merges_open_compound_not_in_dict() { // note book is not in the dictionary, but notebook is let doc = Document::new_plain_english_curated("note book"); let a = doc.tokens().next().unwrap(); let b = doc.tokens().nth(2).unwrap(); let merged = MergeableWords::new(predicate).get_merged_word(a, b, doc.get_source()); assert_eq!(merged, Some("notebook".chars().collect())); } #[test] fn does_not_merge_open_compound_in_dict() { // straight away is in the dictionary, and straightaway is let doc = Document::new_plain_english_curated("straight away"); let a = doc.tokens().next().unwrap(); let b = doc.tokens().nth(2).unwrap(); let merged = MergeableWords::new(predicate).get_merged_word(a, b, doc.get_source()); assert_eq!(merged, None); } #[test] fn does_not_merge_invalid_compound() { // neither quick for nor quickfox are in the dictionary let doc = Document::new_plain_english_curated("quick fox"); let a = doc.tokens().next().unwrap(); let b = doc.tokens().nth(2).unwrap(); let merged = MergeableWords::new(predicate).get_merged_word(a, b, doc.get_source()); assert_eq!(merged, None); } #[test] fn merges_open_compound() { // Dictionary has "frontline" but not "front line" let doc = Document::new_plain_english_curated("front line"); let a = doc.tokens().next().unwrap(); let b = doc.tokens().nth(2).unwrap(); let merged = MergeableWords::new(predicate).get_merged_word(a, b, doc.get_source()); assert_eq!(merged, Some("frontline".chars().collect())); } #[test] fn merges_hyphenated_compound() { // Doesn't check for "front-line" in the dictionary but matches it and "frontline" is in the dictionary let doc = Document::new_plain_english_curated("front-line"); let a = doc.tokens().next().unwrap(); let b = doc.tokens().nth(2).unwrap(); let merged = MergeableWords::new(predicate).get_merged_word(a, b, doc.get_source()); assert_eq!(merged, Some("frontline".chars().collect())); } } ================================================ FILE: harper-core/src/expr/mod.rs ================================================ //! An `Expr` is a declarative way to express whether a certain set of tokens fulfill a criteria. //! //! For example, if we want to look for the word "that" followed by an adjective, we could build an //! expression to do so. //! //! The actual searching is done by another system (usually a part of the [lint framework](crate::linting::ExprLinter)). //! It iterates through a document, checking if each index matches the criteria. //! //! When supplied a specific position in a token stream, the technical job of an `Expr` is to determine the window of tokens (including the cursor itself) that fulfills whatever criteria the author desires. //! //! The goal of the `Expr` initiative is to make rules easier to _read_ as well as to write. //! Gone are the days of trying to manually parse the logic of another man's Rust code. //! //! See also: [`SequenceExpr`]. mod all; mod anchor_end; mod anchor_start; mod duration_expr; mod expr_map; mod filter; mod first_match_of; mod fixed_phrase; mod longest_match_of; mod mergeable_words; mod optional; mod reflexive_pronoun; mod repeating; mod sequence_expr; mod similar_to_phrase; mod space_or_hyphen; mod spelled_number_expr; mod step; mod time_unit_expr; mod unless_step; mod word_expr_group; #[cfg(not(feature = "concurrent"))] use std::rc::Rc; use std::sync::Arc; pub use all::All; pub use anchor_end::AnchorEnd; pub use anchor_start::AnchorStart; pub use duration_expr::DurationExpr; pub use expr_map::ExprMap; pub use filter::Filter; pub use first_match_of::FirstMatchOf; pub use fixed_phrase::FixedPhrase; pub use longest_match_of::LongestMatchOf; pub use mergeable_words::MergeableWords; pub use optional::Optional; pub use reflexive_pronoun::ReflexivePronoun; pub use repeating::Repeating; pub use sequence_expr::SequenceExpr; pub use similar_to_phrase::SimilarToPhrase; pub use space_or_hyphen::SpaceOrHyphen; pub use spelled_number_expr::SpelledNumberExpr; pub use step::Step; pub use time_unit_expr::TimeUnitExpr; pub use unless_step::UnlessStep; pub use word_expr_group::WordExprGroup; use crate::{Document, LSend, Span, Token}; pub trait Expr: LSend { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option>; } impl Expr for S where S: Step + ?Sized, { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.step(tokens, cursor, source).map(|s| { if s >= 0 { Span::new_with_len(cursor, s as usize) } else { Span::new(add(cursor, s).unwrap(), cursor) } }) } } impl Expr for Arc where E: Expr, { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.as_ref().run(cursor, tokens, source) } } impl Expr for Box { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.as_ref().run(cursor, tokens, source) } } #[cfg(not(feature = "concurrent"))] impl Expr for Rc where E: Expr, { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { self.as_ref().run(cursor, tokens, source) } } fn add(u: usize, i: isize) -> Option { if i.is_negative() { u.checked_sub(i.wrapping_abs() as u32 as usize) } else { u.checked_add(i as usize) } } pub trait ExprExt { /// Iterate over all matches of this expression in the document, automatically filtering out /// overlapping matches, preferring the first. fn iter_matches<'a>( &'a self, tokens: &'a [Token], source: &'a [char], ) -> Box> + 'a>; fn iter_matches_in_doc<'a>( &'a self, doc: &'a Document, ) -> Box> + 'a>; } impl ExprExt for E where E: Expr, { fn iter_matches<'a>( &'a self, tokens: &'a [Token], source: &'a [char], ) -> Box> + 'a> { let mut last_end = 0usize; Box::new((0..tokens.len()).filter_map(move |i| { let span = self.run(i, tokens, source)?; if span.start >= last_end { last_end = span.end; Some(span) } else { None } })) } fn iter_matches_in_doc<'a>( &'a self, doc: &'a Document, ) -> Box> + 'a> { Box::new(self.iter_matches(doc.get_tokens(), doc.get_source())) } } pub trait OwnedExprExt { fn or(self, other: impl Expr + 'static) -> FirstMatchOf; fn and(self, other: impl Expr + 'static) -> All; fn and_not(self, other: impl Expr + 'static) -> All; fn or_longest(self, other: impl Expr + 'static) -> LongestMatchOf; } impl OwnedExprExt for E where E: Expr + 'static, { /// Returns an expression that matches either the current one or the expression contained in `other`. fn or(self, other: impl Expr + 'static) -> FirstMatchOf { FirstMatchOf::new(vec![Box::new(self), Box::new(other)]) } /// Returns an expression that matches only if both the current one and the expression contained in `other` do. fn and(self, other: impl Expr + 'static) -> All { All::new(vec![Box::new(self), Box::new(other)]) } /// Returns an expression that matches only if the current one matches and the expression contained in `other` does not. fn and_not(self, other: impl Expr + 'static) -> All { self.and(UnlessStep::new(other, |_tok: &Token, _src: &[char]| true)) } /// Returns an expression that matches the longest of the current one or the expression contained in `other`. /// /// If you don't need the longest match, prefer using the short-circuiting [`Self::or()`] instead. fn or_longest(self, other: impl Expr + 'static) -> LongestMatchOf { LongestMatchOf::new(vec![Box::new(self), Box::new(other)]) } } ================================================ FILE: harper-core/src/expr/optional.rs ================================================ use crate::{Span, Token}; use super::Expr; /// An optional expression. /// Forces the optional expression to always return Some by transmuting `None` into /// `Some(cursor..cursor)`. pub struct Optional { inner: Box, } impl Optional { pub fn new(inner: impl Expr + 'static) -> Self { Self { inner: Box::new(inner), } } } impl Expr for Optional { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let res = self.inner.run(cursor, tokens, source); if res.is_none() { Some(Span::empty(cursor)) } else { res } } } ================================================ FILE: harper-core/src/expr/reflexive_pronoun.rs ================================================ use crate::{ Span, Token, expr::{Expr, FirstMatchOf}, patterns::WordSet, }; // These are considered ungrammatical, or are at least not in `dictionary.dict` but are commonly used anyway. // The tests below check if this changes so we can update this `Expr` const BAD_REFLEXIVE_PRONOUNS: &[&str] = &[ "hisself", "oneselves", "theirself", "theirselves", "themself", ]; /// Matches reflexive pronouns with configurable strictness. /// /// By default, only matches standard English reflexive pronouns. Use `with_common_errors()` to include /// frequently encountered non-standard forms like "hisself" or "theirself". pub struct ReflexivePronoun { include_common_errors: bool, } impl Default for ReflexivePronoun { fn default() -> Self { Self::standard() } } impl ReflexivePronoun { /// Creates a matcher for standard English reflexive pronouns. /// /// Matches only the correct forms: "myself", "yourself", "himself", "herself", "itself", /// "ourselves", "yourselves", and "themselves". pub fn standard() -> Self { Self { include_common_errors: false, } } /// Creates a matcher that includes non-standard but commonly used reflexive pronouns. /// /// In addition to standard forms, matches common errors like "hisself", "theirself", /// and other non-standard forms that are frequently seen in user-generated content. pub fn with_common_errors() -> Self { Self { include_common_errors: true, } } } impl Expr for ReflexivePronoun { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let good_pronouns = |token: &Token, _: &[char]| token.kind.is_reflexive_pronoun(); let mut expr = FirstMatchOf::new(vec![Box::new(good_pronouns)]); if self.include_common_errors { expr.add(WordSet::new(BAD_REFLEXIVE_PRONOUNS)); } expr.run(cursor, tokens, source) } } #[cfg(test)] mod tests { use crate::{ Document, TokenKind, expr::{ExprExt, ReflexivePronoun, reflexive_pronoun::BAD_REFLEXIVE_PRONOUNS}, }; // These are considered grammatically correct, or are at least in `dictionary.dict`. // The tests below check if this changes so we can update this `Expr` const GOOD_REFLEXIVE_PRONOUNS: &[&str] = &[ "herself", "himself", "itself", "myself", "oneself", "ourself", "ourselves", "themselves", "thyself", "yourself", "yourselves", ]; fn test_pronoun(word: &str) { let doc = Document::new_plain_english_curated(word); let token = doc.tokens().next().expect("No tokens in document"); let is_good_pron = GOOD_REFLEXIVE_PRONOUNS.contains(&word); let is_bad_pron = BAD_REFLEXIVE_PRONOUNS.contains(&word); match (is_good_pron, is_bad_pron, &token.kind) { (true, false, TokenKind::Word(Some(md))) => { assert!(md.is_pronoun()); assert!(md.is_reflexive_pronoun()); } (true, false, TokenKind::Word(None)) => { panic!("Widely accepted pronoun '{word}' has gone missing from the dictionary!") } (false, true, TokenKind::Word(Some(_))) => panic!( "Unaccepted pronoun '{word}' that's used in bad English is now in the dictionary!" ), (false, true, TokenKind::Word(None)) => {} (false, false, TokenKind::Word(Some(_))) => panic!( "non-pronoun '{word}' is made up just for testing but is now in the dictionary!" ), (false, false, TokenKind::Word(None)) => {} (true, true, _) => panic!("'{word}' is in both good and bad lists"), _ => panic!("'{word}' doesn't match any expected case"), } } #[test] fn test_good_reflexive_pronouns() { for word in GOOD_REFLEXIVE_PRONOUNS { test_pronoun(word); } } #[test] fn test_bad_reflexive_pronouns() { for word in BAD_REFLEXIVE_PRONOUNS { test_pronoun(word); } } // It's expected that nobody uses these words even in bad English. #[test] fn test_non_pronouns() { test_pronoun("myselves"); test_pronoun("weselves"); test_pronoun("usself"); test_pronoun("usselves"); } #[test] fn ensure_standard_ctor_includes_myself() { let doc = Document::new_plain_english_curated("If you want something done, do it yourself."); let rp = ReflexivePronoun::standard(); let matches = rp.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 1); } #[test] fn ensure_default_ctor_includes_myself() { let doc = Document::new_plain_english_curated( "I wanted a reflexive pronoun module, so I wrote one myself.", ); let rp = ReflexivePronoun::default(); let matches = rp.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 1); } #[test] fn ensure_with_common_errors_includes_hisself() { let doc = Document::new_plain_english_curated("He teached hisself English."); let rp = ReflexivePronoun::with_common_errors(); let matches = rp.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 1); } #[test] fn ensure_standard_ctor_excludes_hisself() { let doc = Document::new_plain_english_curated("Was he pleased with hisself?"); let rp = ReflexivePronoun::standard(); let matches = rp.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 0); } #[test] fn ensure_default_ctor_excludes_theirself() { let doc = Document::new_plain_english_curated("They look at theirself in the mirror."); let rp = ReflexivePronoun::default(); let matches = rp.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 0); } } ================================================ FILE: harper-core/src/expr/repeating.rs ================================================ use super::Expr; use crate::{Span, Token}; /// An expression that will match one or more repetitions of the same expression. /// /// Somewhat reminiscent of the `+*` operator in Regex. pub struct Repeating { inner: Box, required_repetitions: usize, } impl Repeating { pub fn new(expr: Box, required_repetitions: usize) -> Self { Self { inner: expr, required_repetitions, } } } impl Expr for Repeating { fn run(&self, mut cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let mut window = Span::empty(cursor); let mut repetition = 0; loop { let res = self.inner.run(cursor, tokens, source); if let Some(res) = res { window.expand_to_include(res.start); window.expand_to_include(res.end - 1); if res.start < cursor { cursor = res.start; } else { cursor = res.end; } if res.is_empty() { return Some(window); } repetition += 1; } else if repetition >= self.required_repetitions { return Some(window); } else { return None; } } } } #[cfg(test)] mod tests { use super::Repeating; use crate::expr::{ExprExt, SequenceExpr}; use crate::patterns::AnyPattern; use crate::{Document, Span}; #[test] fn matches_anything() { let doc = Document::new_plain_english_curated( "This matcher will match the entirety of any document!", ); let pat = Repeating::new(Box::new(SequenceExpr::from(AnyPattern)), 0); assert_eq!( pat.iter_matches(doc.get_tokens(), doc.get_source()).next(), Some(Span::new(0, doc.get_tokens().len())) ) } #[test] fn does_not_match_short() { let doc = Document::new_plain_english_curated("No match"); let pat = Repeating::new(Box::new(SequenceExpr::from(AnyPattern)), 4); assert_eq!( pat.iter_matches(doc.get_tokens(), doc.get_source()).next(), None ) } } ================================================ FILE: harper-core/src/expr/sequence_expr.rs ================================================ use paste::paste; use crate::{ CharStringExt, Lrc, Span, Token, TokenKind, expr::{FirstMatchOf, FixedPhrase, LongestMatchOf}, patterns::{AnyPattern, IndefiniteArticle, WhitespacePattern, Word, WordSet}, }; use super::{Expr, Optional, OwnedExprExt, Repeating, Step, UnlessStep}; #[derive(Default)] pub struct SequenceExpr { exprs: Vec>, } /// Generate a `then_*` method from an available `is_*` function on [`TokenKind`]. macro_rules! gen_then_from_is { ($quality:ident) => { paste! { #[doc = concat!("Adds a step matching a token where [`TokenKind::is_", stringify!($quality), "()`] returns true.")] pub fn [< then_$quality >] (self) -> Self{ self.then_kind_where(|kind| { kind.[< is_$quality >]() }) } #[doc = concat!("Adds an optional step matching a token where [`TokenKind::is_", stringify!($quality), "()`] returns true.")] pub fn [< then_optional_$quality >] (self) -> Self{ self.then_optional(|tok: &Token, _source: &[char]| { tok.kind.[< is_$quality >]() }) } #[doc = concat!("Adds a step matching one or more consecutive tokens where [`TokenKind::is_", stringify!($quality), "()`] returns true.")] pub fn [< then_one_or_more_$quality s >] (self) -> Self{ self.then_one_or_more(Box::new(|tok: &Token, _source: &[char]| { tok.kind.[< is_$quality >]() })) } #[doc = concat!("Adds a step matching a token where [`TokenKind::is_", stringify!($quality), "()`] returns false.")] pub fn [< then_anything_but_$quality >] (self) -> Self{ self.then_kind_where(|kind| { !kind.[< is_$quality >]() }) } } }; } impl Expr for SequenceExpr { /// Run the expression starting at an index, returning the total matched window. /// /// If any step returns `None`, the entire expression does as well. fn run(&self, mut cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let mut window = Span::empty(cursor); for cur_expr in &self.exprs { let out = cur_expr.run(cursor, tokens, source)?; // Only expand the window if the match actually covers some tokens if out.end > out.start { window.expand_to_include(out.start); window.expand_to_include(out.end.checked_sub(1).unwrap_or(out.start)); } // Only advance cursor if we actually matched something if out.end > cursor { cursor = out.end; } else if out.start < cursor { cursor = out.start; } // If both start and end are equal to cursor, don't move the cursor } Some(window) } } impl SequenceExpr { // Constructor methods // Match an [expression](Expr). pub fn with(expr: impl Expr + 'static) -> Self { Self::default().then(expr) } // Single token methods /// Construct a new sequence with an [`AnyPattern`] at the beginning of the operation list. pub fn anything() -> Self { Self::default().then_anything() } // Single word token methods /// Construct a new sequence with a [`Word`] at the beginning of the operation list. pub fn any_capitalization_of(word: &'static str) -> Self { Self::default().then_any_capitalization_of(word) } /// Shorthand for [`Self::any_capitalization_of`]. pub fn aco(word: &'static str) -> Self { Self::any_capitalization_of(word) } /// Match any word from the given set of words, case-insensitive. pub fn word_set(words: &'static [&'static str]) -> Self { Self::default().then_word_set(words) } /// Match any word. pub fn any_word() -> Self { Self::default().then_any_word() } // Expressions of more than one token /// Optionally match an expression. pub fn optional(expr: impl Expr + 'static) -> Self { Self::default().then_optional(expr) } /// Match a fixed phrase. pub fn fixed_phrase(phrase: &'static str) -> Self { Self::default().then_fixed_phrase(phrase) } // Multiple expressions /// Match the first of multiple expressions. pub fn any_of(exprs: Vec>) -> Self { Self::default().then_any_of(exprs) } /// Match the longest of multiple expressions. pub fn longest_of(exprs: Vec>) -> Self { Self::default().then_longest_of(exprs) } pub fn whitespace() -> Self { Self::default().then_whitespace() } /// Will be accepted unless the condition matches. pub fn unless(condition: impl Expr + 'static) -> Self { Self::default().then_unless(condition) } // Builder methods /// Push an [expression](Expr) to the operation list. pub fn then(mut self, expr: impl Expr + 'static) -> Self { self.exprs.push(Box::new(expr)); self } /// Push an already-boxed [expression](Expr) to the operation list. pub fn then_boxed(mut self, expr: Box) -> Self { self.exprs.push(expr); self } /// Pushes an expression that could move the cursor to the sequence, but does not require it. pub fn then_optional(mut self, expr: impl Expr + 'static) -> Self { self.exprs.push(Box::new(Optional::new(expr))); self } /// Pushes an expression that will match any of the provided expressions. /// /// If more than one of the provided expressions match, this function provides no guarantee /// as to which match will end up being used. If you need to get the longest of multiple /// matches, use [`Self::then_longest_of()`] instead. pub fn then_any_of(mut self, exprs: Vec>) -> Self { self.exprs.push(Box::new(FirstMatchOf::new(exprs))); self } /// Pushes an expression that will match the longest of the provided expressions. /// /// If you don't need the longest match, prefer using the short-circuiting /// [`Self::then_any_of()`] instead. pub fn then_longest_of(mut self, exprs: Vec>) -> Self { self.exprs.push(Box::new(LongestMatchOf::new(exprs))); self } /// Appends the steps in `other` onto the end of `self`. /// This is more efficient than [`Self::then`] because it avoids pointer redirection. pub fn then_seq(mut self, mut other: Self) -> Self { self.exprs.append(&mut other.exprs); self } /// Pushes an expression that will match any word from the given set of words, case-insensitive. pub fn then_word_set(self, words: &'static [&'static str]) -> Self { self.then(WordSet::new(words)) } /// Shorthand for [`Self::then_word_set`]. pub fn t_set(self, words: &'static [&'static str]) -> Self { self.then_word_set(words) } /// Match against one or more whitespace tokens. pub fn then_whitespace(self) -> Self { self.then(WhitespacePattern) } /// Shorthand for [`Self::then_whitespace`]. pub fn t_ws(self) -> Self { self.then_whitespace() } /// Match against one or more whitespace tokens. pub fn then_whitespace_or_hyphen(self) -> Self { self.then(WhitespacePattern.or(|tok: &Token, _: &[char]| tok.kind.is_hyphen())) } /// Shorthand for [`Self::then_whitespace_or_hyphen`]. pub fn t_ws_h(self) -> Self { self.then_whitespace_or_hyphen() } /// Match against zero or more occurrences of the given expression. Like `*` in regex. pub fn then_zero_or_more(self, expr: impl Expr + 'static) -> Self { self.then(Repeating::new(Box::new(expr), 0)) } /// Match against one or more occurrences of the given expression. Like `+` in regex. pub fn then_one_or_more(self, expr: impl Expr + 'static) -> Self { self.then(Repeating::new(Box::new(expr), 1)) } /// Match against zero or more whitespace-separated occurrences of the given expression. pub fn then_zero_or_more_spaced(self, expr: impl Expr + 'static) -> Self { let expr = Lrc::new(expr); self.then(SequenceExpr::with(expr.clone()).then(Repeating::new( Box::new(SequenceExpr::default().t_ws().then(expr)), 0, ))) } /// Create a new condition that will step one token forward if met. /// If the condition is _not_ met, the whole expression returns `None`. /// /// This can be used to build out exceptions to other rules. /// /// See [`UnlessStep`] for more info. pub fn then_unless(self, condition: impl Expr + 'static) -> Self { self.then(UnlessStep::new(condition, |_tok: &Token, _src: &[char]| { true })) } /// Match any single token. /// /// See [`AnyPattern`] for more info. pub fn then_anything(self) -> Self { self.then(AnyPattern) } /// Match any single token. /// /// Shorthand for [`Self::then_anything`]. pub fn t_any(self) -> Self { self.then_anything() } // Word matching methods /// Matches any word. pub fn then_any_word(self) -> Self { self.then_kind_where(|kind| kind.is_word()) } /// Match examples of `word` that have any capitalization. pub fn then_any_capitalization_of(self, word: &'static str) -> Self { self.then(Word::new(word)) } /// Shorthand for [`Self::then_any_capitalization_of`]. pub fn t_aco(self, word: &'static str) -> Self { self.then_any_capitalization_of(word) } /// Match examples of `word` case-sensitively. pub fn then_exact_word(self, word: &'static str) -> Self { self.then(Word::new_exact(word)) } /// Match a fixed phrase. pub fn then_fixed_phrase(self, phrase: &'static str) -> Self { self.then(FixedPhrase::from_phrase(phrase)) } /// Match any word except the ones in `words`. pub fn then_word_except(self, words: &'static [&'static str]) -> Self { self.then(move |tok: &Token, src: &[char]| { !tok.kind.is_word() || !words .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } // Token kind/predicate matching methods // One kind /// Matches any token whose `Kind` exactly matches. pub fn then_kind(self, kind: TokenKind) -> Self { self.then_kind_where(move |k| kind == *k) } /// Matches a token where the provided closure returns true for the token's kind. pub fn then_kind_where(mut self, predicate: F) -> Self where F: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.exprs .push(Box::new(move |tok: &Token, _source: &[char]| { predicate(&tok.kind) })); self } /// Match a token of a given kind which is not in the list of words. pub fn then_kind_except(self, pred_is: F, ex: &'static [&'static str]) -> Self where F: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then(move |tok: &Token, src: &[char]| { pred_is(&tok.kind) && !ex .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } // Two kinds /// Match a token where both token kind predicates return true. /// For instance, a word that can be both noun and verb. pub fn then_kind_both(self, pred_is_1: F1, pred_is_2: F2) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| pred_is_1(k) && pred_is_2(k)) } /// Match a token where either of the two token kind predicates returns true. /// For instance, an adjective or an adverb. pub fn then_kind_either(self, pred_is_1: F1, pred_is_2: F2) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| pred_is_1(k) || pred_is_2(k)) } /// Match a token where neither of the two token kind predicates returns true. /// For instance, a word that can't be a verb or a noun. pub fn then_kind_neither(self, pred_isnt_1: F1, pred_isnt_2: F2) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| !pred_isnt_1(k) && !pred_isnt_2(k)) } /// Match a token where the first token kind predicate returns true and the second returns false. /// For instance, a word that can be a noun but cannot be a verb. pub fn then_kind_is_but_is_not(self, pred_is: F1, pred_not: F2) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| pred_is(k) && !pred_not(k)) } /// Match a token where the first token kind predicate returns true and the second returns false, /// and the token is not in the list of exceptions. pub fn then_kind_is_but_is_not_except( self, pred_is: F1, pred_not: F2, ex: &'static [&'static str], ) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then(move |tok: &Token, src: &[char]| { pred_is(&tok.kind) && !pred_not(&tok.kind) && !ex .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } /// Match a token where the first token kind predicate returns true and all of the second return false. /// For instance, a word that can be a verb but not a noun or an adjective. pub fn then_kind_is_but_isnt_any_of( self, pred_is: F1, preds_isnt: &'static [F2], ) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| pred_is(k) && !preds_isnt.iter().any(|pred| pred(k))) } /// Match a token where the first token kind predicate returns true and all of the second return false, /// and the token is not in the list of exceptions. /// For instance, an adjective that isn't also a verb or adverb or the word "likely". pub fn then_kind_is_but_isnt_any_of_except( self, pred_is: F1, preds_isnt: &'static [F2], ex: &'static [&'static str], ) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then(move |tok: &Token, src: &[char]| { pred_is(&tok.kind) && !preds_isnt.iter().any(|pred| pred(&tok.kind)) && !ex .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } // More than two kinds /// Match a token where both of the first two token kind predicates return true, /// and the third returns false. /// For instance, a word that must be both noun and verb, but not adjective. pub fn then_kind_both_but_not( self, (pred_is_1, pred_is_2): (F1, F2), pred_not: F3, ) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, F3: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| pred_is_1(k) && pred_is_2(k) && !pred_not(k)) } /// Match a token where any of the token kind predicates returns true. /// Like `then_kind_either` but for more than two predicates. pub fn then_kind_any(self, preds_is: &'static [F]) -> Self where F: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| preds_is.iter().any(|pred| pred(k))) } /// Match a token where none of the token kind predicates returns true. /// Like `then_kind_neither` but for more than two predicates. pub fn then_kind_none_of(self, preds_isnt: &'static [F]) -> Self where F: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then_kind_where(move |k| preds_isnt.iter().all(|pred| !pred(k))) } /// Match a token where any of the token kind predicates returns true, /// and the word is not in the list of exceptions. pub fn then_kind_any_except( self, preds_is: &'static [F], ex: &'static [&'static str], ) -> Self where F: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then(move |tok: &Token, src: &[char]| { preds_is.iter().any(|pred| pred(&tok.kind)) && !ex .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } /// Match a token where any of the token kind predicates returns true, /// or the token is in the list of words. pub fn then_kind_any_or_words( self, preds: &'static [F], words: &'static [&'static str], ) -> Self where F: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then(move |tok: &Token, src: &[char]| { preds.iter().any(|pred| pred(&tok.kind)) || words .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } /// Match a token where any of the first token kind predicates returns true, /// the second returns false, and the token is not in the list of exceptions. pub fn then_kind_any_but_not_except( self, preds_is: &'static [F1], pred_not: F2, ex: &'static [&'static str], ) -> Self where F1: Fn(&TokenKind) -> bool + Send + Sync + 'static, F2: Fn(&TokenKind) -> bool + Send + Sync + 'static, { self.then(move |tok: &Token, src: &[char]| { preds_is.iter().any(|pred| pred(&tok.kind)) && !pred_not(&tok.kind) && !ex .iter() .any(|&word| tok.span.get_content(src).eq_ignore_ascii_case_str(word)) }) } // Word property matching methods // Out-of-vocabulary word. (Words not in the dictionary) gen_then_from_is!(oov); gen_then_from_is!(swear); // Part-of-speech matching methods // Nominals (nouns and pronouns) gen_then_from_is!(nominal); gen_then_from_is!(plural_nominal); gen_then_from_is!(non_plural_nominal); gen_then_from_is!(possessive_nominal); // Nouns gen_then_from_is!(noun); gen_then_from_is!(proper_noun); gen_then_from_is!(plural_noun); gen_then_from_is!(singular_noun); gen_then_from_is!(mass_noun_only); // Pronouns gen_then_from_is!(pronoun); gen_then_from_is!(personal_pronoun); gen_then_from_is!(first_person_singular_pronoun); gen_then_from_is!(first_person_plural_pronoun); gen_then_from_is!(second_person_pronoun); gen_then_from_is!(third_person_pronoun); gen_then_from_is!(third_person_singular_pronoun); gen_then_from_is!(third_person_plural_pronoun); gen_then_from_is!(subject_pronoun); gen_then_from_is!(object_pronoun); // Verbs gen_then_from_is!(verb); gen_then_from_is!(auxiliary_verb); gen_then_from_is!(linking_verb); gen_then_from_is!(verb_lemma); gen_then_from_is!(verb_simple_past_form); gen_then_from_is!(verb_past_participle_form); gen_then_from_is!(verb_progressive_form); gen_then_from_is!(verb_third_person_singular_present_form); // Adjectives gen_then_from_is!(adjective); gen_then_from_is!(positive_adjective); gen_then_from_is!(comparative_adjective); gen_then_from_is!(superlative_adjective); // Adverbs gen_then_from_is!(adverb); gen_then_from_is!(frequency_adverb); gen_then_from_is!(degree_adverb); // Determiners gen_then_from_is!(determiner); gen_then_from_is!(demonstrative_determiner); gen_then_from_is!(possessive_determiner); gen_then_from_is!(quantifier); gen_then_from_is!(non_quantifier_determiner); gen_then_from_is!(non_demonstrative_determiner); /// Push an [`IndefiniteArticle`] to the end of the operation list. pub fn then_indefinite_article(self) -> Self { self.then(IndefiniteArticle::default()) } // Other parts of speech gen_then_from_is!(conjunction); gen_then_from_is!(preposition); // Numbers gen_then_from_is!(number); gen_then_from_is!(cardinal_number); gen_then_from_is!(ordinal_number); // Punctuation gen_then_from_is!(punctuation); gen_then_from_is!(apostrophe); gen_then_from_is!(comma); gen_then_from_is!(hyphen); gen_then_from_is!(period); gen_then_from_is!(semicolon); gen_then_from_is!(acute); gen_then_from_is!(quote); gen_then_from_is!(backslash); gen_then_from_is!(slash); gen_then_from_is!(percent); // Other gen_then_from_is!(case_separator); gen_then_from_is!(likely_homograph); gen_then_from_is!(sentence_terminator); } impl From for SequenceExpr where S: Step + 'static, { fn from(step: S) -> Self { Self { exprs: vec![Box::new(step)], } } } #[cfg(test)] mod tests { use crate::{ Document, TokenKind, expr::{ExprExt, SequenceExpr}, linting::tests::SpanVecExt, }; #[test] fn test_kind_both() { let noun_and_verb = SequenceExpr::default().then_kind_both(TokenKind::is_noun, TokenKind::is_verb); let doc = Document::new_plain_english_curated("Use a good example."); let matches = noun_and_verb.iter_matches_in_doc(&doc).collect::>(); assert_eq!(matches.to_strings(&doc), vec!["Use", "good", "example"]); } #[test] fn test_adjective_or_determiner() { let expr = SequenceExpr::default() .then_kind_either(TokenKind::is_adjective, TokenKind::is_determiner); let doc = Document::new_plain_english_curated("Use a good example."); let matches = expr.iter_matches_in_doc(&doc).collect::>(); assert_eq!(matches.to_strings(&doc), vec!["a", "good"]); } #[test] fn test_noun_but_not_adjective() { let expr = SequenceExpr::default() .then_kind_is_but_is_not(TokenKind::is_noun, TokenKind::is_adjective); let doc = Document::new_plain_english_curated("Use a good example."); let matches = expr.iter_matches_in_doc(&doc).collect::>(); assert_eq!(matches.to_strings(&doc), vec!["Use", "example"]); } } ================================================ FILE: harper-core/src/expr/similar_to_phrase.rs ================================================ use crate::patterns::{WithinEditDistance, Word}; use crate::{Document, Span, Token, TokenKind}; use super::{Expr, SequenceExpr}; pub struct SimilarToPhrase { phrase: SequenceExpr, fuzzy_phrase: SequenceExpr, } impl SimilarToPhrase { /// Create an error-tolerant SequenceExpr that looks for phrases similar to (but not the same as) that contained /// in the provided text. /// /// This is an expensive operation, so try to only do it at startup and in tests. /// /// It will panic if your document is too complex, so only run this with curated phrases. pub fn from_phrase(text: &str, max_edit_dist: u8) -> Self { let document = Document::new_plain_english_curated(text); Self::from_doc(&document, max_edit_dist) } /// Create an error-tolerant SequenceExpr that looks for phrases similar to (but not the same as) that contained /// in the provided document. /// /// This is an expensive operation, so try to only do it at startup and in tests. /// /// It will panic if your document contains certain token types, so only run this with curated phrases. pub fn from_doc(document: &Document, max_edit_dist: u8) -> Self { let mut phrase = SequenceExpr::default(); let mut fuzzy_phrase = SequenceExpr::default(); for token in document.fat_tokens() { match token.kind { TokenKind::Word(_lexeme_metadata) => { phrase = phrase.then(Word::from_chars(token.content.as_slice())); fuzzy_phrase = fuzzy_phrase .then(WithinEditDistance::new(token.content.into(), max_edit_dist)); } TokenKind::Space(_) => { fuzzy_phrase = fuzzy_phrase.then_whitespace(); phrase = phrase.then_whitespace(); } TokenKind::ParagraphBreak => { fuzzy_phrase = fuzzy_phrase.then_whitespace(); phrase = phrase.then_whitespace(); } _ => panic!("Fell out of expected document formats."), } } Self { phrase, fuzzy_phrase, } } } impl Expr for SimilarToPhrase { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { if self.phrase.run(cursor, tokens, source).is_some() { return None; } self.fuzzy_phrase.run(cursor, tokens, source) } } ================================================ FILE: harper-core/src/expr/space_or_hyphen.rs ================================================ use crate::expr::FirstMatchOf; use crate::patterns::WhitespacePattern; use crate::{Span, Token}; use super::Expr; /// Matches either a space or a hyphen, useful for matching compound words. #[derive(Default)] pub struct SpaceOrHyphen; impl Expr for SpaceOrHyphen { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { FirstMatchOf::new(vec![ Box::new(WhitespacePattern), Box::new(|tok: &Token, _source: &[char]| tok.kind.is_hyphen()), ]) .run(cursor, tokens, source) } } ================================================ FILE: harper-core/src/expr/spelled_number_expr.rs ================================================ use crate::expr::LongestMatchOf; use crate::patterns::{WhitespacePattern, WordSet}; use crate::{Span, Token}; use super::{Expr, SequenceExpr}; /// Matches spelled-out numbers from one to ninety-nine #[derive(Default)] pub struct SpelledNumberExpr; impl Expr for SpelledNumberExpr { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { if tokens.is_empty() { return None; } // The numbers that can be in the 2nd position of a compound number. // A subset of the standalone numbers since we can't say "twenty zero" or "twenty eleven" // "Zero" and "ten" don't belong: twenty-one ✅ twenty-zero ❌ twenty-ten ❌ let units = &[ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", ]; // These can't make a compound with `tens` but they can stand alone let teens = &[ "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", ]; // These can make a compound with the part_2 standalones above. // "Ten" and "hundred" don't belong: twenty-one ✅ ten-one ❌ hundred-one ❌ let tens = &[ "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", ]; let single_words = WordSet::new( &units .iter() .chain(teens.iter()) .chain(tens.iter()) .copied() .chain(std::iter::once("zero")) .collect::>(), ); let tens_units_compounds = SequenceExpr::word_set(tens) .then_any_of(vec![ Box::new(|t: &Token, _s: &[char]| t.kind.is_hyphen()), Box::new(WhitespacePattern), ]) .then_word_set(units); let expr = LongestMatchOf::new(vec![Box::new(single_words), Box::new(tens_units_compounds)]); expr.run(cursor, tokens, source) } } #[cfg(test)] mod tests { use super::SpelledNumberExpr; use crate::Document; use crate::expr::ExprExt; use crate::linting::tests::SpanVecExt; #[test] fn matches_single_digit() { let doc = Document::new_markdown_default_curated("one two three"); let matches = SpelledNumberExpr.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 3); } #[test] fn matches_teens() { let doc = Document::new_markdown_default_curated("ten eleven twelve"); let matches = SpelledNumberExpr.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 3); } #[test] fn matches_tens() { let doc = Document::new_markdown_default_curated("twenty thirty forty"); let matches = SpelledNumberExpr.iter_matches_in_doc(&doc); assert_eq!(matches.count(), 3); } #[test] fn matches_compound_numbers() { let doc = Document::new_markdown_default_curated("twenty-one thirty-two"); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); // Debug output println!("Found {} matches:", matches.len()); for m in &matches { let text: String = doc.get_tokens()[m.start..m.end] .iter() .map(|t| doc.get_span_content_str(&t.span)) .collect(); println!("- '{text}' (span: {m:?})"); } assert_eq!(matches.len(), 2); } #[test] fn deep_thought() { let doc = Document::new_markdown_default_curated( "the answer to the ultimate question of life, the universe, and everything is forty-two", ); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); dbg!(&matches); dbg!(matches.to_strings(&doc)); assert_eq!(matches.to_strings(&doc), vec!["forty-two"]); } #[test] fn jacksons() { let doc = Document::new_markdown_default_curated( "A, B, C It's easy as one, two, three. Or simple as Do-Re-Mi", ); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); assert_eq!(matches.to_strings(&doc), vec!["one", "two", "three"]); } #[test] fn orwell() { let doc = Document::new_markdown_default_curated("Nineteen Eighty-Four"); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); assert_eq!(matches.to_strings(&doc), vec!["Nineteen", "Eighty-Four"]); } #[test] fn get_smart() { let doc = Document::new_markdown_default_curated( "Maxwell Smart was Agent Eighty-Six, but who was Agent Ninety-Nine?", ); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); assert_eq!(matches.to_strings(&doc), vec!["Eighty-Six", "Ninety-Nine"]); } #[test] fn hyphens_or_spaces() { let doc = Document::new_markdown_default_curated( "twenty-one, thirty two, forty-three, fifty four, sixty-five, seventy six, eighty-seven, ninety eight", ); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); assert_eq!( matches.to_strings(&doc), vec![ "twenty-one", "thirty two", "forty-three", "fifty four", "sixty-five", "seventy six", "eighty-seven", "ninety eight", ] ); } #[test] fn waiting_since() { let doc = Document::new_markdown_default_curated("I have been waiting since two hours."); let matches = SpelledNumberExpr .iter_matches_in_doc(&doc) .collect::>(); assert_eq!(matches.to_strings(&doc), vec!["two"]); } } ================================================ FILE: harper-core/src/expr/step.rs ================================================ use crate::{LSend, Token, patterns::Pattern}; /// An atomic step within a larger expression. /// /// Its principle job is to identify (if any) the next position of the cursor. /// When cursor is moved, all tokens between the current cursor and the target position will be /// added to the match group. pub trait Step: LSend { fn step(&self, tokens: &[Token], cursor: usize, source: &[char]) -> Option; } impl

Step for P where P: Pattern, { fn step(&self, tokens: &[Token], cursor: usize, source: &[char]) -> Option { self.matches(&tokens[cursor..], source).map(|i| i as isize) } } ================================================ FILE: harper-core/src/expr/time_unit_expr.rs ================================================ use crate::expr::LongestMatchOf; use crate::patterns::WordSet; use crate::{Span, Token}; use super::Expr; /// Matches a time unit. /// /// Matches standard units from microsecond to decade. /// Matches other 'units' such as moment, night, weekend. /// Matches singular and plural forms. /// Matches possessive forms (which are also common misspellings for the plurals). /// Matches abbreviations. #[derive(Default)] pub struct TimeUnitExpr; impl Expr for TimeUnitExpr { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { if tokens.is_empty() { return None; } let units_definite_singular = WordSet::new(&[ "microsecond", "millisecond", "second", "minute", "hour", "day", "week", "month", "year", "decade", ]); let units_definite_plural = WordSet::new(&[ "microseconds", "milliseconds", "seconds", "minutes", "hours", "days", "weeks", "months", "years", "decades", ]); let units_definite_apos = WordSet::new(&[ "microsecond's", "millisecond's", "second's", "minute's", "hour's", "day's", "week's", "month's", "year's", "decade's", ]); // ms let units_definite_abbrev = WordSet::new(&["ms"]); let units_other_singular = WordSet::new(&["moment", "night", "weekend"]); let units_other_plural = WordSet::new(&["moments", "nights", "weekends"]); let units_other_apos = WordSet::new(&["moment's", "night's", "weekend's"]); let units = LongestMatchOf::new(vec![ Box::new(units_definite_singular), Box::new(units_definite_plural), Box::new(units_other_singular), Box::new(units_other_plural), Box::new(units_definite_abbrev), Box::new(units_definite_apos), Box::new(units_other_apos), ]); units.run(cursor, tokens, source) } } ================================================ FILE: harper-core/src/expr/unless_step.rs ================================================ use crate::{Token, expr::Expr}; use super::Step; /// Provides the ability to use an expression as a condition. /// If the condition does __not match__, it will return the result of the provided step. pub struct UnlessStep { condition: E, step: S, } impl UnlessStep where E: Expr, S: Step, { pub fn new(condition: E, step: S) -> Self { Self { condition, step } } } impl Step for UnlessStep { fn step(&self, tokens: &[Token], cursor: usize, source: &[char]) -> Option { if self.condition.run(cursor, tokens, source).is_none() { self.step.step(tokens, cursor, source) } else { None } } } ================================================ FILE: harper-core/src/expr/word_expr_group.rs ================================================ use hashbrown::HashMap; use super::first_match_of::FirstMatchOf; use super::{Expr, SequenceExpr}; use crate::{CharString, Span, Token}; /// An expression collection to look for expressions that start with a specific /// word. /// /// The benefit of using this struct over other methods increases for larger collections. #[derive(Default)] pub struct WordExprGroup where E: Expr, { exprs: HashMap, } impl WordExprGroup { pub fn add(&mut self, word: &str, expr: impl Expr + 'static) { let chars = word.chars().collect(); if let Some(group) = self.exprs.get_mut(&chars) { group.add(expr); } else { let mut group = FirstMatchOf::default(); group.add(expr); self.exprs.insert(chars, group); } } /// Add a pattern that matches just a word on its own, without anything else required to match. pub fn add_word(&mut self, word: &'static str) { self.add(word, SequenceExpr::default().then_exact_word(word)); } } impl Expr for WordExprGroup where E: Expr, { fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option> { let first = tokens.get(cursor)?; if !first.kind.is_word() { return None; } let word_chars = first.span.get_content(source); let inner_pattern = self.exprs.get(word_chars)?; inner_pattern.run(cursor, tokens, source) } } ================================================ FILE: harper-core/src/fat_token.rs ================================================ use serde::{Deserialize, Serialize}; use crate::{CharStringExt, TokenKind}; /// A [`Token`](crate::Token) that holds its content as a fat [`Vec`] rather than as a /// [`Span`](crate::Span). #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, PartialOrd, Hash, Eq)] pub struct FatToken { pub content: Vec, pub kind: TokenKind, } impl From for FatToken { fn from(value: FatStringToken) -> Self { Self { content: value.content.chars().collect(), kind: value.kind, } } } /// Similar to a [`FatToken`], but uses a [`String`] as the underlying store. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, PartialOrd, Hash, Eq)] pub struct FatStringToken { pub content: String, pub kind: TokenKind, } impl From for FatStringToken { fn from(value: FatToken) -> Self { Self { content: value.content.to_string(), kind: value.kind, } } } ================================================ FILE: harper-core/src/ignored_lints/lint_context.rs ================================================ use std::hash::{DefaultHasher, Hash, Hasher}; use serde::{Deserialize, Serialize}; use crate::{ Document, FatToken, linting::{Lint, LintKind, Suggestion}, }; /// A location-agnostic structure that attempts to captures the context and content that a [`Lint`] /// occurred. #[derive(Debug, Hash, Serialize, Deserialize)] pub struct LintContext { pub lint_kind: LintKind, pub suggestions: Vec, pub message: String, pub priority: u8, pub tokens: Vec, } impl LintContext { pub fn from_lint(lint: &Lint, document: &Document) -> Self { let Lint { lint_kind, suggestions, message, priority, .. } = lint.clone(); let problem_tokens = document.token_indices_intersecting(lint.span); let prequel_tokens = lint .span .with_len(2) .pulled_by(2) .map(|v| document.token_indices_intersecting(v)) .unwrap_or_default(); let sequel_tokens = document.token_indices_intersecting(lint.span.with_len(2).pushed_by(2)); let tokens = prequel_tokens .into_iter() .chain(problem_tokens) .chain(sequel_tokens) .flat_map(|idx| document.get_token(idx)) .map(|t| t.to_fat(document.get_source())) .collect(); Self { lint_kind, suggestions, message, priority, tokens, } } pub fn default_hash(&self) -> u64 { let mut hasher = DefaultHasher::default(); self.hash(&mut hasher); hasher.finish() } } ================================================ FILE: harper-core/src/ignored_lints/mod.rs ================================================ mod lint_context; use hashbrown::HashSet; pub use lint_context::LintContext; use serde::{Deserialize, Serialize}; use crate::{Document, linting::Lint}; /// A structure that keeps track of lints that have been ignored by users. /// /// To use this structure, apply [`Self::remove_ignored`] on the output of a /// [`Linter`](crate::linting::Linter). #[derive(Debug, Default, Serialize, Deserialize)] pub struct IgnoredLints { context_hashes: HashSet, } impl IgnoredLints { pub fn new() -> Self { Self::default() } /// Move entries from another instance to this one. pub fn append(&mut self, other: Self) { self.context_hashes.extend(other.context_hashes) } /// Add a lint to the list. pub fn ignore_lint(&mut self, lint: &Lint, document: &Document) { let context = LintContext::from_lint(lint, document); let context_hash = context.default_hash(); self.ignore_hash(context_hash); } /// Add a context hash to the list of ignored lints. pub fn ignore_hash(&mut self, hash: u64) { self.context_hashes.insert(hash); } pub fn is_ignored(&self, lint: &Lint, document: &Document) -> bool { let context = LintContext::from_lint(lint, document); let hash = context.default_hash(); self.context_hashes.contains(&hash) } /// Remove ignored Lints from a [`Vec`]. pub fn remove_ignored(&self, lints: &mut Vec, document: &Document) { if self.context_hashes.is_empty() { return; } lints.retain(|lint| !self.is_ignored(lint, document)); } } #[cfg(test)] mod tests { use quickcheck::TestResult; use quickcheck_macros::quickcheck; use super::IgnoredLints; use crate::spell::FstDictionary; use crate::{ Dialect, Document, linting::{LintGroup, Linter}, }; #[quickcheck] fn can_ignore_all(text: String) -> bool { let document = Document::new_markdown_default_curated(&text); let mut lints = LintGroup::new_curated(FstDictionary::curated(), Dialect::American).lint(&document); let mut ignored = IgnoredLints::new(); for lint in &lints { ignored.ignore_lint(lint, &document); } ignored.remove_ignored(&mut lints, &document); lints.is_empty() } #[quickcheck] fn can_ignore_first(text: String) -> TestResult { let document = Document::new_markdown_default_curated(&text); let mut lints = LintGroup::new_curated(FstDictionary::curated(), Dialect::American).lint(&document); let Some(first) = lints.first().cloned() else { return TestResult::discard(); }; let mut ignored = IgnoredLints::new(); ignored.ignore_lint(&first, &document); ignored.remove_ignored(&mut lints, &document); TestResult::from_bool(!lints.contains(&first)) } // Check that ignoring the nth lint found in source text actually removes it (and no others). fn assert_ignore_lint_reduction(source: &str, nth_lint: usize) { let document = Document::new_markdown_default_curated(source); let mut lints = LintGroup::new_curated(FstDictionary::curated(), Dialect::American).lint(&document); let nth = lints.get(nth_lint).cloned().unwrap_or_else(|| { panic!("If ignoring the lint at {nth_lint}, make sure there are enough problems.") }); let mut ignored = IgnoredLints::new(); ignored.ignore_lint(&nth, &document); let prev_count = lints.len(); ignored.remove_ignored(&mut lints, &document); assert_eq!(prev_count, lints.len() + 1); assert!(!lints.contains(&nth)); } #[test] fn an_a() { let source = "There is an problem in this text. Here is an second one."; assert_ignore_lint_reduction(source, 0); assert_ignore_lint_reduction(source, 1); } #[test] fn spelling() { let source = "There is a problm in this text. Here is a scond one."; assert_ignore_lint_reduction(source, 0); assert_ignore_lint_reduction(source, 1); } } ================================================ FILE: harper-core/src/indefinite_article.rs ================================================ use std::borrow::Cow; use itertools::Itertools; use crate::case::Case::Upper; use crate::char_ext::CharExt; use crate::{CaseIterExt, Dialect}; #[derive(PartialEq)] pub enum InitialSound { Vowel, Consonant, Either, // for SQL } /// Checks whether a provided word begins with a vowel _sound_. Returns `None` if `word` is empty. /// /// It was produced through trial and error. /// Matches with 99.71% and 99.77% of vowels and non-vowels in the /// Carnegie-Mellon University word -> pronunciation dataset. pub fn starts_with_vowel(word: &[char], dialect: Dialect) -> Option { if word.is_empty() { return None; } if matches!(word, ['S', 'Q', 'L'] | ['L', 'E', 'D']) { return Some(InitialSound::Either); } // Try to get the first chunk of a word that appears to be a partial initialism. // For example: // - `RFL` from `RFLink` // - `m` from `mDNS` let word = { let word_casing = word.get_casing_unfiltered(); match word_casing.as_slice() { // Lower-upper or upper-upper, possibly a (partial) initialism. [Some(first_char_case), Some(Upper), ..] => { &word[0..word_casing .iter() .position(|c| *c != Some(*first_char_case)) .unwrap_or(word.len())] } // Lower-lower or upper-lower, unlikely to be a partial initialism. _ => word, } }; let is_likely_initialism = word.iter().all(|c| !c.is_alphabetic() || c.is_uppercase()); if word.len() == 1 || (is_likely_initialism && !is_likely_acronym(word)) { return Some( if matches!( word[0].to_ascii_uppercase(), 'A' | 'E' | 'F' | 'H' | 'I' | 'L' | 'M' | 'N' | 'O' | 'R' | 'S' | 'X' ) { InitialSound::Vowel } else { InitialSound::Consonant }, ); } let word = to_lower_word(word); let word = word.as_ref(); if matches!(word, ['u', 'b', 'i', ..]) { return Some(InitialSound::Either); } if matches!(word, ['e', 'u', 'l', 'e', ..]) { return Some(InitialSound::Vowel); } if matches!( word, ['u', 'k', ..] | ['u', 'd', 'e', ..] // for 'udev' | ['e', 'u', 'p', 'h', ..] | ['e', 'u', 'g' | 'l' | 'c', ..] | ['o', 'n', 'e', ..] | ['o', 'n', 'c', 'e'] ) { return Some(InitialSound::Consonant); } if matches!( word, ['h', 'o', 'u', 'r', ..] | ['u', 'n', 'i', 'n' | 'm', ..] | ['u', 'n', 'a' | 'u', ..] | ['u', 'r', 'b', ..] | ['i', 'n', 't', ..] ) { return Some(InitialSound::Vowel); } if matches!(word, ['h', 'e', 'r', 'b', ..] if dialect == Dialect::American || dialect == Dialect::Canadian) { return Some(InitialSound::Vowel); } if matches!(word, ['u', 'n' | 's', 'i' | 'a' | 'u', ..]) { return Some(InitialSound::Consonant); } if matches!(word, ['u', 'n', ..]) { return Some(InitialSound::Vowel); } if matches!(word, ['u', 'r', 'g', ..]) { return Some(InitialSound::Vowel); } if matches!(word, ['u', 't', 't', ..]) { return Some(InitialSound::Vowel); } if matches!( word, ['u', 't' | 'r' | 'n', ..] | ['e', 'u', 'r', ..] | ['u', 'w', ..] | ['u', 's', 'e', ..] ) { return Some(InitialSound::Consonant); } if matches!(word, ['o', 'n', 'e', 'a' | 'e' | 'i' | 'u', 'l' | 'd', ..]) { return Some(InitialSound::Vowel); } if matches!(word, ['o', 'n', 'e', 'a' | 'e' | 'i' | 'u' | '-' | 's', ..]) { return Some(InitialSound::Consonant); } if matches!( word, ['s', 'o', 's'] | ['r', 'z', ..] | ['n', 'g', ..] | ['n', 'v', ..] | ['x', 'b', 'o', 'x'] | ['h', 'e', 'i', 'r', ..] | ['h', 'o', 'n', 'o', 'r', ..] | ['h', 'o', 'n', 'e', 's', ..] ) { return Some(InitialSound::Vowel); } if matches!( word, ['j', 'u' | 'o', 'n', ..] | ['j', 'u', 'r', 'a' | 'i' | 'o', ..] ) { return Some(InitialSound::Consonant); } if matches!(word, ['x', '-' | '\'' | '.' | 'o' | 's', ..]) { return Some(InitialSound::Vowel); } if word[0].is_vowel() { return Some(InitialSound::Vowel); } Some(InitialSound::Consonant) } fn to_lower_word(word: &[char]) -> Cow<'_, [char]> { if word.iter().any(|c| c.is_uppercase()) { Cow::Owned( word.iter() .flat_map(|c| c.to_lowercase()) .collect::>(), ) } else { Cow::Borrowed(word) } } fn is_likely_acronym(word: &[char]) -> bool { /// Does the word contain any sequences that might indicate it's not an acronym? fn word_contains_false_positive_sequence(word: &[char]) -> bool { let likely_false_positive_sequences = [['V', 'C']]; for fp_sequence in likely_false_positive_sequences { if word .windows(fp_sequence.len()) .any(|subslice| subslice == fp_sequence) { return true; } } false } // If the initialism is shorter than this, skip it. const MIN_LEN: usize = 3; if let Some(first_chars) = word.get(..MIN_LEN) // Unlikely to be an acronym if it contains non-alphabetic characters. && first_chars.iter().copied().all(char::is_alphabetic) && !word_contains_false_positive_sequence(word) { let vowel_map = first_chars .iter() .map(CharExt::is_vowel) .collect_array::() .unwrap(); matches!(vowel_map, [false, true, false] | [false, true, true]) } else { false } } ================================================ FILE: harper-core/src/irregular_nouns.rs ================================================ use serde::Deserialize; use std::sync::{Arc, LazyLock}; type Noun = (String, String); #[derive(Debug, Deserialize)] pub struct IrregularNouns { nouns: Vec, } /// The uncached function that is used to produce the original copy of the /// irregular noun table. fn uncached_inner_new() -> Arc { IrregularNouns::from_json_file(include_str!("../irregular_nouns.json")) .map(Arc::new) .unwrap_or_else(|e| panic!("Failed to load irregular noun table: {}", e)) } static NOUNS: LazyLock> = LazyLock::new(uncached_inner_new); impl IrregularNouns { pub fn new() -> Self { Self { nouns: vec![] } } pub fn from_json_file(json: &str) -> Result { // Deserialize into Vec to handle mixed types let values: Vec = serde_json::from_str(json).expect("Failed to parse irregular nouns JSON"); let mut nouns = Vec::new(); for value in values { match value { serde_json::Value::Array(arr) if arr.len() == 2 => { // Handle array of 2 strings if let (Some(singular), Some(plural)) = (arr[0].as_str(), arr[1].as_str()) { nouns.push((singular.to_string(), plural.to_string())); } } // Strings are used for comments to guide contributors editing the file serde_json::Value::String(_) => {} _ => {} } } Ok(Self { nouns }) } pub fn curated() -> Arc { (*NOUNS).clone() } pub fn get_plural_for_singular(&self, singular: &str) -> Option<&str> { self.nouns .iter() .find(|(sg, _)| sg.eq_ignore_ascii_case(singular)) .map(|(_, pl)| pl.as_str()) } pub fn get_singular_for_plural(&self, plural: &str) -> Option<&str> { self.nouns .iter() .find(|(_, pl)| pl.eq_ignore_ascii_case(plural)) .map(|(sg, _)| sg.as_str()) } } impl Default for IrregularNouns { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::*; #[test] fn can_find_irregular_plural_for_singular_lowercase() { assert_eq!( IrregularNouns::curated().get_plural_for_singular("man"), Some("men") ); } #[test] fn can_find_irregular_plural_for_singular_uppercase() { assert_eq!( IrregularNouns::curated().get_plural_for_singular("WOMAN"), Some("women") ); } #[test] fn can_find_singular_for_irregular_plural() { assert_eq!( IrregularNouns::curated().get_singular_for_plural("children"), Some("child") ); } #[test] fn cant_find_regular_plural() { assert_eq!( IrregularNouns::curated().get_plural_for_singular("car"), None ); } #[test] fn cant_find_non_noun() { assert_eq!( IrregularNouns::curated().get_plural_for_singular("the"), None ); } } ================================================ FILE: harper-core/src/irregular_verbs.rs ================================================ use serde::Deserialize; use std::sync::{Arc, LazyLock}; type Verb = (String, String, String); #[derive(Debug, Deserialize)] pub struct IrregularVerbs { verbs: Vec, } /// The uncached function that is used to produce the original copy of the /// irregular verb table. fn uncached_inner_new() -> Arc { IrregularVerbs::from_json_file(include_str!("../irregular_verbs.json")) .map(Arc::new) .unwrap_or_else(|e| panic!("Failed to load irregular verb table: {}", e)) } static VERBS: LazyLock> = LazyLock::new(uncached_inner_new); impl IrregularVerbs { pub fn new() -> Self { Self { verbs: vec![] } } pub fn from_json_file(json: &str) -> Result { // Deserialize into Vec to handle mixed types let values: Vec = serde_json::from_str(json).expect("Failed to parse irregular verbs JSON"); let mut verbs = Vec::new(); for value in values { match value { serde_json::Value::Array(arr) if arr.len() == 3 => { // Handle array of 3 strings if let (Some(lemma), Some(preterite), Some(past_participle)) = (arr[0].as_str(), arr[1].as_str(), arr[2].as_str()) { verbs.push(( lemma.to_string(), preterite.to_string(), past_participle.to_string(), )); } } // Strings are used for comments to guide contributors editing the file serde_json::Value::String(_) => {} _ => {} } } Ok(Self { verbs }) } pub fn curated() -> Arc { (*VERBS).clone() } pub fn get_past_participle_for_preterite(&self, preterite: &str) -> Option<&str> { self.verbs .iter() .find(|(_, pt, _)| pt.eq_ignore_ascii_case(preterite)) .map(|(_, _, pp)| pp.as_str()) } pub fn get_lemma_for_preterite(&self, preterite: &str) -> Option<&str> { self.verbs .iter() .find(|(_, pt, _)| pt.eq_ignore_ascii_case(preterite)) .map(|(lemma, _, _)| lemma.as_str()) } pub fn get_pasts_for_lemma(&self, lemma: &str) -> Option<(&str, &str)> { self.verbs .iter() .find(|(l, _, _)| l.eq_ignore_ascii_case(lemma)) .map(|(_, pt, pp)| (pt.as_str(), pp.as_str())) } } impl Default for IrregularVerbs { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::*; #[test] fn can_find_irregular_past_participle_for_preterite_lowercase() { assert_eq!( IrregularVerbs::curated().get_past_participle_for_preterite("arose"), Some("arisen") ); } #[test] fn can_find_irregular_past_participle_for_preterite_uppercase() { assert_eq!( IrregularVerbs::curated().get_past_participle_for_preterite("WENT"), Some("gone") ); } #[test] fn can_find_irregular_past_participle_same_as_past_tense() { assert_eq!( IrregularVerbs::curated().get_past_participle_for_preterite("taught"), Some("taught") ); } #[test] fn cant_find_regular_past_participle() { assert_eq!( IrregularVerbs::curated().get_past_participle_for_preterite("walked"), None ); } #[test] fn cant_find_non_verb() { assert_eq!( IrregularVerbs::curated().get_past_participle_for_preterite("the"), None ); } } ================================================ FILE: harper-core/src/language_detection.rs ================================================ //! This module implements rudimentary, dictionary-based English language detection. use crate::spell::Dictionary; use crate::{Document, Token, TokenKind}; /// Check if the contents of the document are likely intended to represent /// English. pub fn is_doc_likely_english(doc: &Document, dict: &impl Dictionary) -> bool { is_likely_english(doc.get_tokens(), doc.get_source(), dict) } /// Check if given tokens are likely intended to represent English. pub fn is_likely_english(toks: &[Token], source: &[char], dict: &impl Dictionary) -> bool { let mut total_words = 0; let mut valid_words = 0; let mut punctuation = 0; let mut unlintable = 0; for token in toks { match token.kind { TokenKind::Word(_) => { total_words += 1; let word_content = token.span.get_content(source); if dict.contains_word(word_content) { valid_words += 1; } } TokenKind::Punctuation(_) => punctuation += 1, TokenKind::Unlintable => unlintable += 1, _ => (), } } if total_words <= 7 && total_words - valid_words > 0 { return false; } if unlintable > valid_words { return false; } if (punctuation as f32 * 1.25) > valid_words as f32 { return false; } if (valid_words as f64 / total_words as f64) < 0.7 { return false; } true } #[cfg(test)] mod tests { use super::is_doc_likely_english; use crate::Document; use crate::spell::FstDictionary; fn assert_not_english(source: &'static str) { let dict = FstDictionary::curated(); let doc = Document::new_plain_english(source, &dict); let is_likely_english = is_doc_likely_english(&doc, &dict); dbg!(source); assert!(!is_likely_english); } fn assert_english(source: &'static str) { let dict = FstDictionary::curated(); let doc = Document::new_plain_english(source, &dict); let is_likely_english = is_doc_likely_english(&doc, &dict); dbg!(source); assert!(is_likely_english); } #[test] fn detects_spanish() { assert_not_english("Esto es español. Harper no debería marcarlo como inglés."); } #[test] fn detects_french() { assert_not_english( "C'est du français. Il ne devrait pas être marqué comme anglais par Harper.", ); } #[test] fn detects_shebang() { assert_not_english("#! /bin/bash"); assert_not_english("#! /usr/bin/fish"); } #[test] fn detects_short_english() { assert_english("This is English!"); } #[test] fn detects_english() { assert_english("This is perfectly valid English, evn if it has a cople typos.") } #[test] fn detects_expressive_english() { assert_english("Look above! That is real English! So is this: bippity bop!") } /// Useful for detecting commented-out code. #[test] fn detects_python_fib() { assert_not_english( r" def fibIter(n): if n < 2: return n fibPrev = 1 fib = 1 for _ in range(2, n): fibPrev, fib = fib, fib + fibPrev return fib ", ); } #[test] fn mixed_french_english_park() { assert_not_english("Je voudrais promener au the park a huit heures with ma voisine"); } #[test] fn mixed_french_english_drunk() { assert_not_english("Je ne suis pas drunk, je suis only ivre by you"); } #[test] fn mixed_french_english_dress() { assert_not_english( "Je buy une robe nouveau chaque Tuesday, mais aujourd'hui, je don't have temps", ); } #[test] fn english_motto() { assert_english("I have a simple motto in life"); } } ================================================ FILE: harper-core/src/lexing/email_address.rs ================================================ use itertools::Itertools; use super::FoundToken; use super::hostname::lex_hostname; use crate::TokenKind; /// The maximum length of an email address, in characters. pub(crate) const MAX_EMAIL_LEN: usize = 254; pub fn lex_email_address(source: &[char]) -> Option { let source = &source[..usize::min(source.len(), MAX_EMAIL_LEN)]; // Location of the @ sign let at_loc = { let mut iter = source.iter().enumerate(); // Assuming we don't start lexing in the middle of a local-part, i.e. we start unquoted. let mut in_quote = false; // Loop until we find an acceptable '@' or a reason to early-exit. loop { match iter.next()? { (_, '"') => in_quote = !in_quote, // Unquoted space; can't be a valid local-part. (_, ' ') if !in_quote => return None, (i, '@') if !in_quote => break i, _ => {} } } }; let local_part = &source[0..at_loc]; if !validate_local_part(local_part) { return None; } let domain_part_len = lex_hostname(&source[at_loc + 1..])?; if domain_part_len == 0 { return None; } Some(FoundToken { next_index: at_loc + 1 + domain_part_len, token: TokenKind::EmailAddress, }) } /// Check to see if a given slice is a valid local part of an email address. fn validate_local_part(mut local_part: &[char]) -> bool { if local_part.len() > 64 || local_part.is_empty() { return false; } let is_quoted = local_part.first().cloned() == Some('"') && local_part.last().cloned() == Some('"'); if is_quoted && local_part.len() < 2 { return false; } if is_quoted { local_part = &local_part[1..local_part.len() - 1]; } if !is_quoted { if !local_part.iter().cloned().all(valid_unquoted_character) { return false; } if local_part.first().cloned().unwrap() == '.' || local_part.last().cloned().unwrap() == '.' { return false; } for (c, n) in local_part.iter().tuple_windows() { if *c == '.' && *n == '.' { return false; } } } else { let mut iter = local_part.iter().cloned(); while let Some(c) = iter.next() { if c == '\\' { iter.next(); continue; } let also_valid = ['(', ')', ',', ':', ';', '<', '>', '@', '[', ']', ' ']; if !valid_unquoted_character(c) && !also_valid.contains(&c) { return false; } } } true } /// Check if a given character is valid in an unquoted local part of an address fn valid_unquoted_character(c: char) -> bool { if matches!(c, 'A'..='Z' | 'a'..='z' | '0'..='9' ) { return true; } if c > '\u{007F}' { return true; } let others = [ '!', '#', '$', '%', '&', '\'', '*', '+', '-', '/', '=', '?', '^', '_', '`', '{', '|', '}', '~', '.', ]; if others.contains(&c) { return true; } false } #[cfg(test)] mod tests { use rand::RngExt; use super::super::hostname::tests::example_domain_parts; use super::{lex_email_address, validate_local_part}; fn example_local_parts() -> impl Iterator> { [ r"simple", r"very.common", r"x", r"long.email-address-with-hyphens", r"user.name+tag+sorting", r"name/surname", r"admin", r"example", r#"" ""#, r#""john..doe""#, r"mailhost!username", r#""very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual""#, r"user%example.com", r"user-", r"postmaster", r"postmaster", r"_test", ] .into_iter() .map(|s| s.chars().collect()) } #[test] fn example_local_parts_pass_validation() { for local in example_local_parts() { dbg!(local.iter().collect::()); assert!(validate_local_part(&local)); } } #[test] fn test_many_example_email_addresses() { for local in example_local_parts() { for mut domain in example_domain_parts() { // Generate email address let mut address = local.clone(); address.push('@'); address.append(&mut domain); dbg!(address.iter().collect::()); let found = lex_email_address(&address).unwrap(); assert_eq!(found.next_index, address.len()); } } } #[test] fn does_not_allow_empty_domain() { for local in example_local_parts() { // Generate invalid email address let mut address = local.clone(); address.push('@'); address.push(' '); assert!(lex_email_address(&address).is_none()); } } /// Tests that the email parser will not throw a panic under some random /// situations. #[test] fn survives_random_chars() { let mut rng = rand::rng(); let mut buf = [' '; 128]; for _ in 0..1 << 16 { buf.fill_with(|| rng.random()); lex_email_address(&buf); } } } ================================================ FILE: harper-core/src/lexing/hostname.rs ================================================ use crate::TokenKind; use super::FoundToken; /// Lex a hostname token. pub fn lex_hostname_token(source: &[char]) -> Option { let len = lex_hostname(source)?; // Might be word, just skip it. if len <= 1 { return None; } if !source.get(1..len - 1)?.contains(&'.') { return None; } if source.get(len - 1) == Some(&'.') { return None; } // For the sake of semantics and downstream grammar checking. if !ends_with_common_tld(&source[0..len]) { return None; } Some(FoundToken { next_index: len, token: TokenKind::Hostname, }) } pub fn lex_hostname(source: &[char]) -> Option { let mut passed_chars = 0; // The beginning has different requirements from the rest of the hostname. let first = source.first()?; if !matches!(first, 'A'..='Z' | 'a'..='z' | '0'..='9' ) { return None; } for label in source.split(|c| *c == '.') { for c in label { passed_chars += 1; if !matches!(c, 'A'..='Z' | 'a'..='z' | '0'..='9' | '-') { return Some(passed_chars - 1); } } passed_chars += 1; } if passed_chars == 0 { None } else { Some(passed_chars - 1) } } const COMMON_TLDS: &[&[char]] = &[ &['c', 'o', 'm'], &['n', 'e', 't'], &['o', 'r', 'g'], &['e', 'd', 'u'], &['g', 'o', 'v'], &['m', 'i', 'l'], &['t', 'x', 't'], &['i', 'o'], &['c', 'o'], &['u', 's'], &['u', 'k'], &['d', 'e'], &['c', 'a'], &['a', 'u'], &['j', 'p'], ]; fn ends_with_common_tld(input: &[char]) -> bool { for tld in COMMON_TLDS { let n = tld.len(); if input.len() >= n && &input[input.len() - n..] == *tld { return true; } } false } #[cfg(test)] pub mod tests { use super::lex_hostname; pub fn example_domain_parts() -> impl Iterator> { [ r"example.com", r"example.com", r"example.com", r"and.subdomains.example.com", r"example.com", r"example.com", r"example", r"s.example", r"example.org", r"example.org", r"example.org", r"strange.example.com", r"example.org", r"example.org", ] .into_iter() .map(|s| s.chars().collect()) } #[test] fn can_parse_example_hostnames() { for domain in example_domain_parts() { dbg!(domain.iter().collect::()); assert_eq!(lex_hostname(&domain), Some(domain.len())); } } #[test] fn hyphen_cannot_open_hostname() { let host: Vec<_> = "-something.com".chars().collect(); assert!(lex_hostname(&host).is_none()) } } ================================================ FILE: harper-core/src/lexing/mod.rs ================================================ mod email_address; mod hostname; mod url; use hostname::lex_hostname_token; use ordered_float::OrderedFloat; use url::lex_url; use self::email_address::lex_email_address; use crate::char_ext::CharExt; use crate::punctuation::{Punctuation, Quote}; use crate::{Number, Span, Token, TokenKind}; #[derive(Debug, Eq, PartialEq)] pub struct FoundToken { /// The index of the character __after__ the lexed token pub next_index: usize, /// Token lexed pub token: TokenKind, } /// Lex `source` with the provided `lex_fn`. /// /// `lex_fn` should be a function that takes a subslice of the source, and returns the first found /// token. pub fn lex_with(source: &[char], lex_fn: fn(&[char]) -> FoundToken) -> Vec { let mut cursor = 0; let mut tokens = Vec::new(); loop { if cursor >= source.len() { return tokens; } let FoundToken { token, next_index } = lex_fn(&source[cursor..]); tokens.push(Token { span: Span::new(cursor, cursor + next_index), kind: token, }); cursor += next_index; } } pub fn lex_weir_token(source: &[char]) -> FoundToken { [ lex_punctuation, lex_tabs, lex_spaces, lex_newlines, lex_plural_digit, // Before lex_number, which would match the initial digit lex_hex_number, // Before lex_number, which would match the initial 0 lex_long_decade, // Before lex_number, which would match the digits up to the -s lex_number, lex_url, lex_email_address, lex_hostname_token, lex_word, ] .into_iter() .find_map(|lexer| lexer(source)) .unwrap_or_else(lex_catch) } pub fn lex_english_token(source: &[char]) -> FoundToken { [ lex_regexish, lex_punctuation, lex_tabs, lex_spaces, lex_newlines, lex_plural_digit, // Before lex_number, which would match the initial digit lex_hex_number, // Before lex_number, which would match the initial 0 lex_long_decade, // Before lex_number, which would match the digits up to the -s lex_number, lex_url, lex_email_address, lex_hostname_token, lex_word, ] .into_iter() .find_map(|lexer| lexer(source)) .unwrap_or_else(lex_catch) } fn lex_word(source: &[char]) -> Option { let is_tack = |c: char| lex_punctuation(&[c]).is_some_and(|t| t.token.is_apostrophe()); let mut end = source .iter() .position(|c| !c.is_english_lingual() && !c.is_ascii_digit() && !is_tack(*c)) .unwrap_or(source.len()); while end >= 1 && is_tack(source[end - 1]) { end -= 1; } if end == 0 { None } else { Some(FoundToken { next_index: end, token: TokenKind::Word(None), }) } } fn lex_number(source: &[char]) -> Option { if source.is_empty() { return None; } if !source[0].is_numeric() { return None; } let end = source .iter() .enumerate() .rev() .find_map(|(i, v)| v.is_ascii_digit().then_some(i))?; let mut s: String = source[0..end + 1].iter().collect(); // Find the longest possible valid number while !s.is_empty() { if let Ok(n) = s.parse::() { let precision = s.chars().rev().position(|c| c == '.').unwrap_or_default(); if !s.ends_with('.') { return Some(FoundToken { token: TokenKind::Number(Number { value: n.into(), suffix: None, radix: 10, precision, }), next_index: s.len(), }); } } s.pop(); } None } // Often in comments we mention partial- or pseudo- regexes. Here's an example from Ghidra: // ([a-z0-9]+ only) - We previously flagged just the z0 in the middle of it. fn lex_regexish(src: &[char]) -> Option { let l = src.len(); let mut i = 0; if i >= l || src[i] != '[' { return None; } i += 1; loop { if i >= l || !src[i].is_alphanumeric() { return None; } i += 1; if i < l && src[i] == '-' { i += 1; if i >= l || !src[i].is_alphanumeric() { return None; } i += 1; } if i >= l || src[i] != ']' { continue; } break; } Some(FoundToken { token: TokenKind::Regexish, next_index: i + 1, }) } fn lex_hex_number(source: &[char]) -> Option { // < 3 to avoid accepting 0x alone if source.len() < 3 || source[0] != '0' || source[1] != 'x' || !source[2].is_ascii_hexdigit() { return None; } let mut i = 2; let len = source.len(); while i < len { let next = source[i]; if !next.is_ascii_hexdigit() { if !next.is_alphanumeric() { break; } else { return None; } } i += 1; } let s: String = source[2..i].iter().collect(); // Should always succeed unless the logic above is broken if let Ok(n) = u64::from_str_radix(&s, 16) { return Some(FoundToken { token: TokenKind::Number(Number { value: OrderedFloat(n as f64), suffix: None, radix: 16, precision: 0, }), next_index: s.len() + 2, }); } None } fn lex_long_decade(source: &[char]) -> Option { // lex 4-digit decades in their plural such as: 1980s 1990s 2000s 2020s if source.len() < 5 { return None; } if source[0] != '1' && source[0] != '2' { return None; } if !source[1].is_ascii_digit() { return None; } if !source[2].is_ascii_digit() { return None; } if source[3] != '0' { return None; } if source[4] != 's' { return None; } Some(FoundToken { token: TokenKind::Decade, next_index: 5, }) } fn lex_plural_digit(src: &[char]) -> Option { // Issue #774 let l = src.len(); let mut i = 0; if src.is_empty() || !src[i].is_ascii_alphanumeric() { return None; } i += 1; if l > i && src[i] == '\'' { i += 1; } if l > i && src[i] == 's' { i += 1; if l == i || !src[i].is_ascii_alphanumeric() { return Some(FoundToken { token: TokenKind::Word(None), next_index: i, }); } } None } fn lex_newlines(source: &[char]) -> Option { let count = source.iter().take_while(|c| **c == '\n').count(); if count > 0 { Some(FoundToken { token: TokenKind::Newline(count), next_index: count, }) } else { None } } fn lex_tabs(source: &[char]) -> Option { let count = source.iter().take_while(|c| **c == '\t').count(); if count > 0 { Some(FoundToken { token: TokenKind::Space(count * 2), next_index: count, }) } else { None } } fn lex_spaces(source: &[char]) -> Option { let count = source.iter().take_while(|c| **c == ' ').count(); if count > 0 { Some(FoundToken { token: TokenKind::Space(count), next_index: count, }) } else { None } } fn lex_punctuation(source: &[char]) -> Option { if let Some(found) = lex_quote(source) { return Some(found); } let c = source.first()?; let punct = Punctuation::from_char(*c)?; Some(FoundToken { next_index: 1, token: TokenKind::Punctuation(punct), }) } fn lex_quote(source: &[char]) -> Option { let c = *source.first()?; if c == '\"' || c == '“' || c == '”' { Some(FoundToken { next_index: 1, token: TokenKind::Punctuation(Punctuation::Quote(Quote { twin_loc: None })), }) } else { None } } /// Covers cases not covered by the other lints. fn lex_catch() -> FoundToken { FoundToken { next_index: 1, token: TokenKind::Unlintable, } } #[cfg(test)] mod tests { use crate::Punctuation; use crate::char_string::char_string; use crate::lexing::lex_plural_digit; use super::lex_english_token; use super::lex_hex_number; use super::lex_long_decade; use super::lex_number; use super::lex_word; use super::{FoundToken, TokenKind}; // test various kinds of number #[test] fn lexes_0() { let source: Vec<_> = "0".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_0_point_0() { let source: Vec<_> = "0.0".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_00() { let source: Vec<_> = "00".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[ignore = "Negative numbers are not yet supported"] fn lexes_negative_1() { let source: Vec<_> = "-1".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[ignore = "Positive numbers with a leading + are not supported"] fn lexes_positive_1() { let source: Vec<_> = "+1".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_pi() { let source: Vec<_> = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_speed_of_light() { let source: Vec<_> = "3.00e8".chars().collect(); assert!(matches!( lex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn doesnt_lex_cjk_numeral() { let source: Vec<_> = "二".chars().collect(); assert!(lex_number(&source).is_none()); } #[test] fn doesnt_lex_thai_digit() { let source: Vec<_> = "๑".chars().collect(); assert!(lex_number(&source).is_none()); } #[test] fn lexes_cjk_as_unlintable() { let source: Vec<_> = "世".chars().collect(); assert!(lex_word(&source).is_none()); } #[test] fn lexes_youtube_as_hostname() { let source: Vec<_> = "youtube.com".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Hostname, next_index: source.len() } ); } #[test] fn doesnt_lex_regex_mini_range() { let source: Vec<_> = "[]".chars().collect(); assert!(!matches!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 2 } )) } #[test] fn lexes_regex_one_letter() { let source: Vec<_> = "[a]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 3 } ); } #[test] fn lexes_regex_two_letters() { let source: Vec<_> = "[az]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 4 } ); } #[test] fn lexes_regex_digits() { let source: Vec<_> = "[123]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 5 } ); } #[test] fn lexes_regex_two_alphanumeric() { let source: Vec<_> = "[a0b1c2]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 8 } ); } #[test] fn lexes_regex_one_range() { let source: Vec<_> = "[a-z]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 5 } ); } #[test] fn lexes_regex_letter_plus_range() { let source: Vec<_> = "[ax-z]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 6 } ); } #[test] fn lexes_regex_range_plus_letter() { let source: Vec<_> = "[a-cz]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 6 } ); } #[test] fn lexes_regex_two_ranges() { let source: Vec<_> = "[a-cx-z]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, next_index: 8 } ); } #[test] fn doesnt_lex_regex_broken_two_ranges() { // You can't end a range and start a range with a single letter let source: Vec<_> = "[a-x-z]".chars().collect(); assert_eq!( lex_english_token(&source), FoundToken { token: TokenKind::Punctuation(Punctuation::OpenSquare), next_index: 1 } ); } #[test] fn doesnt_lex_regex_hyphen_at_start() { let source: Vec<_> = "[a-]".chars().collect(); assert!(!matches!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, .. } )); } #[test] fn doesnt_lex_regex_hyphen_at_end() { let source: Vec<_> = "[-z]".chars().collect(); assert!(!matches!( lex_english_token(&source), FoundToken { token: TokenKind::Regexish, .. } )); } #[test] fn lexes_good_hex_numeric() { let source: Vec<_> = "0x0".chars().collect(); assert!(matches!( lex_hex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_good_hex_lowercase() { let source: Vec<_> = "0xa".chars().collect(); assert!(matches!( lex_hex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_good_hex_uppercase() { let source: Vec<_> = "0xF".chars().collect(); assert!(matches!( lex_hex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_good_hex_mixed_case() { let source: Vec<_> = "0xaF".chars().collect(); assert!(matches!( lex_hex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_good_hex_lowercase_long() { let source: Vec<_> = "0x0123456789abcdef".chars().collect(); assert!(matches!( lex_hex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn lexes_good_hex_uppercase_long() { let source: Vec<_> = "0x0123456789ABCDEF".chars().collect(); assert!(matches!( lex_hex_number(&source), Some(FoundToken { token: TokenKind::Number(_), .. }) )); } #[test] fn does_not_lex_prefix_only() { let source: Vec<_> = "0x".chars().collect(); assert!(lex_hex_number(&source).is_none()); } #[test] fn does_not_lex_bad_alphabetic() { let source: Vec<_> = "0xg".chars().collect(); assert!(lex_hex_number(&source).is_none()); } #[test] fn does_not_lex_bad_after_good() { let source: Vec<_> = "0x123g".chars().collect(); assert!(lex_hex_number(&source).is_none()); } #[test] fn does_not_lex_uppercase_prefix() { let source: Vec<_> = "0Xf00d".chars().collect(); assert!(lex_hex_number(&source).is_none()); } #[test] fn lexes_0s() { let source: Vec<_> = "0s".chars().collect(); assert!(matches!( // lex_token(&source), lex_plural_digit(&source), Some(FoundToken { token: TokenKind::Word(_), .. }) )); } #[test] fn lexes_1_apostrophe_s() { let source: Vec<_> = "1's".chars().collect(); assert!(matches!( // lex_token(&source), lex_plural_digit(&source), Some(FoundToken { token: TokenKind::Word(_), .. }) )); } #[test] fn lexes_0s_and_1s() { let source: Vec<_> = "0s and 1s".chars().collect(); assert!(matches!( // lex_token(&source), lex_plural_digit(&source), Some(FoundToken { token: TokenKind::Word(_), .. }) )); } #[test] fn lexes_1s_and_0s_apostrophes() { let source: Vec<_> = "1's and 0's".chars().collect(); assert!(matches!( // lex_token(&source), lex_plural_digit(&source), Some(FoundToken { token: TokenKind::Word(_), .. }) )); } #[test] fn doesnt_lex_0s_joined_letter() { let source: Vec<_> = "0ss".chars().collect(); assert!(lex_plural_digit(&source).is_none()); } #[test] fn doesnt_lex_1s_apostrophe_joined_number() { let source: Vec<_> = "1's1".chars().collect(); assert!(lex_plural_digit(&source).is_none()); } #[test] fn lexes_20c_decade() { let source: Vec<_> = "1980s".chars().collect(); assert!(matches!( lex_long_decade(&source), Some(FoundToken { token: TokenKind::Decade, .. }) )); } #[test] fn lexes_21c_decade() { let source: Vec<_> = "2020s".chars().collect(); assert!(matches!( lex_long_decade(&source), Some(FoundToken { token: TokenKind::Decade, .. }) )); } #[test] fn lexes_ancient_decade() { let source: Vec<_> = "1010s".chars().collect(); assert!(matches!( lex_long_decade(&source), Some(FoundToken { token: TokenKind::Decade, .. }) )); } #[test] fn lexes_word_before_decade() { let source: Vec<_> = "late 1980s".chars().collect(); assert!(matches!( lex_english_token(&source), FoundToken { token: TokenKind::Word(_), .. } )); } #[test] fn lexes_word_after_decade() { let source: Vec<_> = "1980s and".chars().collect(); assert!(matches!( lex_english_token(&source), FoundToken { token: TokenKind::Decade, .. } )); } #[test] fn doesnt_lex_far_future_decade() { let source: Vec<_> = "3190s".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_too_ancient_decade() { let source: Vec<_> = "100s".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_0_prefixed_decade() { let source: Vec<_> = "0100s".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_uppercase_decade() { let source: Vec<_> = "2000S".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_overlong_decade() { let source: Vec<_> = "20000s".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_apostrophe_long_decade() { let source: Vec<_> = "2020's".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_bad_apostrophe_short_decade() { let source: Vec<_> = "80's".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn doesnt_lex_good_apostrophe_short_decade() { let source: Vec<_> = "'90s".chars().collect(); assert!(lex_long_decade(&source).is_none()); } #[test] fn accepts_sentence_with_decade() { let sentence: Vec<_> = "To the early 1990s there were a lot of Movies where the bad guys were former Russian intelligence agents.".chars().collect(); let expected_tokens = [ TokenKind::Word(None), TokenKind::Space(1), TokenKind::Word(None), TokenKind::Space(1), TokenKind::Word(None), TokenKind::Space(1), TokenKind::Decade, ]; let mut next_index = 0; for expected_token in expected_tokens.iter() { if next_index >= sentence.len() { break; // Exit if we've processed the entire source } let token = lex_english_token(&sentence[next_index..]); assert_eq!(token.token, *expected_token); next_index += token.next_index; } } #[test] fn rejects_sentence_with_number() { let sentence: Vec<_> = "To the early 1990s there were a lot of Movies where the bad guys were former Russian intelligence agents.".chars().collect(); let expected_tokens = [ TokenKind::Word(None), TokenKind::Space(1), TokenKind::Word(None), TokenKind::Space(1), TokenKind::Word(None), TokenKind::Space(1), TokenKind::Number(Default::default()), ]; let mut next_index = 0; for (i, expected_token) in expected_tokens.iter().enumerate() { if next_index >= sentence.len() { break; // Exit if we've processed the entire source } let token = lex_english_token(&sentence[next_index..]); if i < 6 { assert_eq!(token.token, *expected_token); } else { assert_ne!(token.token, *expected_token); } next_index += token.next_index; } } #[test] fn issue_1010() { let source = char_string!("3."); let tok = lex_number(&source).unwrap(); assert_eq!(tok.next_index, 1); } #[test] fn lexes_full_number() { let source = char_string!("3.0"); let tok = lex_number(&source).unwrap(); assert_eq!(tok.next_index, 3); } } ================================================ FILE: harper-core/src/lexing/url.rs ================================================ /// This module implements parsing of URIs. /// See RFC 1738 for more information. use super::{FoundToken, hostname::lex_hostname}; use crate::TokenKind; pub fn lex_url(source: &[char]) -> Option { let sep = { let mut iter = source.iter().enumerate(); loop { match iter.next()? { // Must begin with an alphabetic character. (0, c) if !c.is_ascii_alphabetic() => return None, // This check must happen before the `valid_scheme_char` check. (i, ':') => break i, (_, c) if !valid_scheme_char(*c) => return None, _ => {} } } }; let url_end = lex_ip_schemepart(&source[sep + 1..])?; Some(FoundToken { next_index: url_end + sep + 1, token: TokenKind::Url, }) } fn lex_ip_schemepart(source: &[char]) -> Option { if !matches!(source, ['/', '/', ..]) { return None; } let rest = &source[2..]; let login_end = lex_login(rest).unwrap_or(0); let mut cursor = login_end; // Parse endpoint path while cursor != rest.len() { if rest[cursor] != '/' { break; } cursor += 1; let next_idx = lex_xchar_string(&rest[cursor..]); if next_idx == 0 { break; } cursor += next_idx; } Some(cursor + 2) } fn lex_login(source: &[char]) -> Option { let hostport_start = if let Some(cred_end) = source.iter().position(|c| *c == '@') { if let Some(pass_beg) = source[0..cred_end].iter().position(|c| *c == ':') && !is_uchar_plus_string(&source[pass_beg + 1..cred_end]) { return None; } // Check username if !is_uchar_plus_string(&source[0..cred_end]) { return None; } cred_end + 1 } else { 0 }; let hostport_source = &source[hostport_start..]; let hostport_end = lex_hostport(hostport_source)?; Some(hostport_start + hostport_end) } fn lex_hostport(source: &[char]) -> Option { let hostname_end = lex_hostname(source)?; if source.get(hostname_end) == Some(&':') { Some( source .iter() .enumerate() .find(|(_, c)| !{ let c = **c; c.is_ascii_digit() }) .map(|(i, _)| i) .unwrap_or(source.len()), ) } else { Some(hostname_end) } } fn valid_scheme_char(c: char) -> bool { c.is_ascii_alphabetic() || c.is_ascii_digit() || matches!(c, '.' | '-' | '+') } fn is_reserved(c: char) -> bool { matches!(c, ';' | '/' | '?' | ':' | '@' | '&' | '=' | '#') } fn is_safe(c: char) -> bool { matches!(c, '$' | '-' | '_' | '.' | '+') } fn is_extra(c: char) -> bool { matches!(c, '!' | '*' | '\'' | '(' | ')' | ',') } fn is_unreserved(c: char) -> bool { c.is_ascii_alphabetic() || c.is_ascii_digit() || is_safe(c) || is_extra(c) } fn is_hex(c: char) -> bool { c.is_ascii_hexdigit() } /// Lex an escaped hex code, returning the subsequent index fn lex_escaped(source: &[char]) -> Option { if source.len() < 3 { return None; } if source[0] == '%' && is_hex(source[1]) && is_hex(source[2]) { Some(3) } else { None } } fn lex_xchar_string(source: &[char]) -> usize { let mut cursor = 0; while cursor != source.len() { let Some(next) = lex_xchar(&source[cursor..]) else { break; }; cursor += next; } cursor } fn is_xchar_string(source: &[char]) -> bool { lex_xchar_string(source) == source.len() } /// Used for passwords and usernames fn is_uchar_plus_string(source: &[char]) -> bool { let mut cursor = 0; while cursor != source.len() { if matches!(source[cursor], ';' | '?' | '&' | '=') { cursor += 1; continue; } let Some(next) = lex_uchar(&source[cursor..]) else { return false; }; cursor += next; } true } fn lex_xchar(source: &[char]) -> Option { if is_reserved(source[0]) { return Some(1); } lex_uchar(source) } fn lex_uchar(source: &[char]) -> Option { if is_unreserved(source[0]) { return Some(1); } lex_escaped(source) } #[cfg(test)] mod tests { use rand::RngExt; use super::lex_url; fn assert_consumes_full(url: &str) { assert_consumes_part(url, url.len()); } fn assert_consumes_part(url: &str, len: usize) { let url = url.chars().collect::>(); assert_eq!(lex_url(&url).unwrap().next_index, len); } #[test] fn consumes_google() { assert_consumes_full("https://google.com") } #[test] fn consumes_wikipedia() { assert_consumes_full("https://wikipedia.com") } #[test] fn consumes_youtube() { assert_consumes_full("https://youtube.com") } #[test] fn consumes_youtube_not_garbage() { assert_consumes_part("https://youtube.com aklsjdha", 19); } #[test] fn consumes_with_path() { assert_consumes_full("https://elijahpotter.dev/articles/quantifying_hope_on_a_global_scale") } #[test] fn consumes_issue_142() { assert_consumes_full("https://github.com/nodesource/distributions#debinstall") } /// Tests that the URL parser will not throw a panic under some random /// situations. #[test] fn survives_random_chars() { let mut rng = rand::rng(); let mut buf = [' '; 128]; for _ in 0..1 << 16 { buf.fill_with(|| rng.random()); lex_url(&buf); } } } ================================================ FILE: harper-core/src/lib.rs ================================================ #![doc = include_str!("../README.md")] #![allow(dead_code)] mod case; mod char_ext; mod char_string; mod currency; mod dict_word_metadata; mod dict_word_metadata_orthography; mod document; mod edit_distance; pub mod expr; mod fat_token; mod ignored_lints; mod indefinite_article; mod irregular_nouns; mod irregular_verbs; pub mod language_detection; mod lexing; pub mod linting; mod mask; mod number; mod offsets; pub mod parsers; pub mod patterns; mod punctuation; mod render_markdown; mod span; pub mod spell; mod sync; mod thesaurus_helper; mod title_case; mod token; mod token_kind; mod token_string_ext; mod vec_ext; pub mod weir; pub mod weirpack; use render_markdown::render_markdown; use std::collections::{BTreeMap, VecDeque}; pub use case::{Case, CaseIterExt}; pub use char_string::{CharString, CharStringExt}; pub use currency::Currency; pub use dict_word_metadata::{ AdverbData, ConjunctionData, Degree, DeterminerData, Dialect, DialectFlags, DictWordMetadata, NounData, PronounData, VerbData, VerbForm, VerbFormFlags, }; pub use dict_word_metadata_orthography::{OrthFlags, Orthography}; pub use document::Document; pub use fat_token::{FatStringToken, FatToken}; pub use ignored_lints::{IgnoredLints, LintContext}; pub use indefinite_article::{InitialSound, starts_with_vowel}; pub use irregular_nouns::IrregularNouns; pub use irregular_verbs::IrregularVerbs; use linting::Lint; pub use mask::{Mask, Masker, RegexMasker}; pub use number::{Number, OrdinalSuffix}; pub use punctuation::{Punctuation, Quote}; pub use span::Span; pub use sync::{LSend, Lrc}; pub use title_case::{make_title_case, make_title_case_str}; pub use token::Token; pub use token_kind::TokenKind; pub use token_string_ext::TokenStringExt; pub use vec_ext::VecExt; /// Return `harper-core` version pub fn core_version() -> &'static str { env!("CARGO_PKG_VERSION") } /// A utility function that removes overlapping lints in a vector, /// keeping the more important ones. /// /// Note: this function will change the ordering of the lints. pub fn remove_overlaps(lints: &mut Vec) { if lints.len() < 2 { return; } let mut remove_indices = VecDeque::new(); lints.sort_by_key(|l| l.priority); lints.sort_by_key(|l| (l.span.start, !0 - l.span.end)); let mut cur = 0; for (i, lint) in lints.iter().enumerate() { if lint.span.start < cur { remove_indices.push_back(i); continue; } cur = lint.span.end; } lints.remove_indices(remove_indices); } /// Remove overlapping lints from a map keyed by rule name, similar to [`remove_overlaps`]. /// /// The map is treated as if all contained lints were in a single flat collection, ensuring the /// same lint would be kept regardless of whether it originated from `lint` or `organized_lints`. pub fn remove_overlaps_map(lint_map: &mut BTreeMap>) { let total: usize = lint_map.values().map(Vec::len).sum(); if total < 2 { return; } struct IndexedSpan { rule_idx: usize, lint_idx: usize, priority: u8, start: usize, end: usize, } let mut removal_flags: Vec> = lint_map .values() .map(|lints| vec![false; lints.len()]) .collect(); let mut spans = Vec::with_capacity(total); for (rule_idx, (_, lints)) in lint_map.iter().enumerate() { for (lint_idx, lint) in lints.iter().enumerate() { spans.push(IndexedSpan { priority: lint.priority, rule_idx, lint_idx, start: lint.span.start, end: lint.span.end, }); } } spans.sort_by_key(|span| span.priority); spans.sort_by_key(|span| (span.start, usize::MAX - span.end)); let mut cur = 0; for span in spans { if span.start < cur { removal_flags[span.rule_idx][span.lint_idx] = true; } else { cur = span.end; } } for (rule_idx, (_, lints)) in lint_map.iter_mut().enumerate() { if removal_flags[rule_idx].iter().all(|flag| !*flag) { continue; } let mut idx = 0; lints.retain(|_| { let remove = removal_flags[rule_idx][idx]; idx += 1; !remove }); } } #[cfg(test)] mod tests { use std::hash::DefaultHasher; use std::hash::{Hash, Hasher}; use itertools::Itertools; use quickcheck_macros::quickcheck; use crate::linting::Lint; use crate::remove_overlaps_map; use crate::spell::FstDictionary; use crate::{ Dialect, Document, linting::{LintGroup, Linter}, remove_overlaps, }; #[test] fn keeps_space_lint() { let doc = Document::new_plain_english_curated("Ths tet"); let mut linter = LintGroup::new_curated(FstDictionary::curated(), Dialect::American); let mut lints = linter.lint(&doc); dbg!(&lints); remove_overlaps(&mut lints); dbg!(&lints); assert_eq!(lints.len(), 3); } #[quickcheck] fn overlap_removals_have_equivalent_behavior(s: String) { let doc = Document::new_plain_english_curated(&s); let mut linter = LintGroup::new_curated(FstDictionary::curated(), Dialect::American); let mut lint_map = linter.organized_lints(&doc); let mut lint_flat: Vec<_> = lint_map.values().flatten().cloned().collect(); remove_overlaps_map(&mut lint_map); remove_overlaps(&mut lint_flat); let post_removal_flat: Vec<_> = lint_map.values().flatten().cloned().collect(); fn hash_lint(lint: &Lint) -> u64 { let mut hasher = DefaultHasher::new(); lint.hash(&mut hasher); hasher.finish() } // We want to ignore ordering, so let us hash these first and sort them. let lint_flat_hashes: Vec<_> = lint_flat.iter().map(hash_lint).sorted().collect(); let post_removal_flat_hashes: Vec<_> = post_removal_flat.iter().map(hash_lint).sorted().collect(); assert_eq!(post_removal_flat_hashes, lint_flat_hashes); } } ================================================ FILE: harper-core/src/linting/a_part.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::FixedPhrase; use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct APart { expr: FirstMatchOf, } impl Default for APart { fn default() -> Self { let pattern = FirstMatchOf::new(vec![ Box::new(FixedPhrase::from_phrase("a part from")), Box::new(FixedPhrase::from_phrase("apart of")), Box::new(FixedPhrase::from_phrase("fall a part")), Box::new(FixedPhrase::from_phrase("far a part")), ]); Self { expr: pattern } } } impl ExprLinter for APart { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let text: String = span.get_content(source).iter().collect(); let text_lower = text.to_lowercase(); let (suggestions, message) = match text_lower.as_str() { // Not always a mistake: // I ordered a part from an online store "a part from" => ( vec![ Suggestion::ReplaceWith("apart from".chars().collect()), Suggestion::ReplaceWith("a part of".chars().collect()), ], "If you mean 'except for', use 'apart from'. If you mean 'a piece belonging to', use 'a part of'. Keep it this way if referring to the origin of a piece.", ), "apart of" => ( vec![ Suggestion::ReplaceWith("a part of".chars().collect()), Suggestion::ReplaceWith("apart from".chars().collect()), ], "Did you mean 'a part of' (a piece belonging to) or 'apart from' (except for)?", ), // Not necessarily always a mistake: // How would you detect how far a part is from another part? // Any one else amazed with how far a part will travel if you accidentally drop a little model piece? // ... how far a part of the value of the relevant step is attributable to the overseas part of the tax ... // // If the previous word before "far" is "how" or "so", it's still ambiguous // But could the next word after "part" help us understand if it's a mistake? "far a part" => ( vec![Suggestion::ReplaceWith("far apart".chars().collect())], "If you mean 'separated by a distance', use 'far apart'. If referring to the distance of a piece, keep it this way.", ), "fall a part" => ( vec![Suggestion::ReplaceWith("fall apart".chars().collect())], "'Fall apart' meaning 'collapse into pieces' or 'stop functioning' is written as two words.", ), _ => return None, }; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions, message: message.to_owned(), priority: 50, }) } fn description(&self) -> &'static str { "Finds and corrects common mistakes between 'a part' and 'apart'" } } #[cfg(test)] mod tests { use super::APart; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn allow_normal_use_of_a_part() { assert_lint_count( "That's not the whole truth, it's just a part.", APart::default(), 0, ); } #[test] fn allow_normal_use_of_apart() { assert_lint_count("You shouldn't have taken it apart.", APart::default(), 0); } #[test] fn allow_normal_use_of_a_part_of() { assert_lint_count("The elbow is a part of the arm.", APart::default(), 0); } #[test] fn allow_normal_use_of_apart_from() { assert_lint_count("Apart from one error, the code works.", APart::default(), 0); } #[test] fn allow_normal_us_of_fall_apart() { assert_lint_count("The roof fell apart.", APart::default(), 0); } #[test] fn allow_normal_use_of_far_apart() { assert_lint_count("Okinawa and Hokkaido are far apart.", APart::default(), 0); } #[test] fn corrects_a_part_from_to_apart_from_format() { assert_suggestion_result( "Is it correct that the output file seems to be the same of the input file a part from the format (input: jpg, output: png)?", APart::default(), "Is it correct that the output file seems to be the same of the input file apart from the format (input: jpg, output: png)?", ); } #[test] fn corrects_a_part_from_to_apart_from_english() { assert_suggestion_result( "Do you know there are more languages out there a part from English right?", APart::default(), "Do you know there are more languages out there apart from English right?", ) } #[test] fn corrects_a_part_from_to_a_part_of() { assert_suggestion_result( "An easy tool to generate backdoor with msfvenom (a part from metasploit framework).", APart::default(), "An easy tool to generate backdoor with msfvenom (a part of metasploit framework).", ) } #[test] fn corrects_apart_of_to_apart_from_cflinuxfs() { assert_suggestion_result( "Doesn't work with any stacks apart of cflinuxfs2 and cflinuxfs3", APart::default(), "Doesn't work with any stacks apart from cflinuxfs2 and cflinuxfs3", ) } #[test] fn corrects_apart_of_to_apart_from_using() { assert_suggestion_result( "apart of using filter, i can't find it in the documentation", APart::default(), "apart from using filter, i can't find it in the documentation", ) } #[test] fn corrects_apart_of_to_a_part_of_openai() { assert_suggestion_result( "export 'Usage' class as apart of openai.types", APart::default(), "export 'Usage' class as a part of openai.types", ) } #[test] fn corrects_apart_of_to_a_part_of_formly() { assert_suggestion_result( "FormlyDatepickerTypeComponent is not listed as apart of the Formly Public API", APart::default(), "FormlyDatepickerTypeComponent is not listed as a part of the Formly Public API", ) } #[test] fn corrects_far_a_part() { assert_suggestion_result( "That leaves you only the other hand on the keyboard and you don't want the keys to be that far a part.", APart::default(), "That leaves you only the other hand on the keyboard and you don't want the keys to be that far apart.", ) } #[test] fn corrects_so_far_a_part_from_being_taken() { assert_suggestion_result( "I can't see in the code what is done really with this session_timeout so far a part from being taken from the conf if defined there or setup ...", APart::default(), "I can't see in the code what is done really with this session_timeout so far apart from being taken from the conf if defined there or setup ...", ) } #[test] fn corrects_so_far_a_part_from_version_upgrade() { assert_suggestion_result( "Any workaround so far a part from the version upgrade?", APart::default(), "Any workaround so far apart from the version upgrade?", ) } #[test] fn corrects_fall_a_part() { assert_suggestion_result( "When I set up a script I set up card priority based on my frontline but sometimes a servant dies which sometimes causes things to fall a part.", APart::default(), "When I set up a script I set up card priority based on my frontline but sometimes a servant dies which sometimes causes things to fall apart.", ) } // Sentences from GitHub I can't understand so can't suggest a fix // Use Reanimated to create Animated Map Components and provide as **a part from** library. // I'm trying to add tokens to the bucket **apart of** the time so this can help to have distributed rate-limiting so that // Slice **apart of** slice apart breaks after slightest change to sliced model // Docker image running as different user **apart of** multiple groups // Diamond Checker is a cookie checker **apart of** the DIamond Software // fetchParent() doesn't work properly with foreign key referencing just a part from a composed primary key } ================================================ FILE: harper-core/src/linting/a_while.rs ================================================ use harper_brill::UPOS; use crate::char_string::char_string; use crate::expr::{Expr, ExprMap, SequenceExpr}; use crate::patterns::UPOSSet; use crate::{CharString, Token, TokenStringExt}; use super::expr_linter::Chunk; use super::{ExprLinter, Lint, LintKind, Suggestion}; pub struct AWhile { expr: ExprMap<(CharString, &'static str)>, } impl Default for AWhile { fn default() -> Self { let mut map = ExprMap::default(); let a = SequenceExpr::with(UPOSSet::new(&[UPOS::VERB])) .t_ws() .t_aco("a") .t_ws() .t_aco("while"); map.insert( a, ( char_string!("awhile"), "Use the single word `awhile` when it follows a verb.", ), ); let b = SequenceExpr::unless(UPOSSet::new(&[UPOS::VERB])) .t_ws() .t_aco("awhile"); map.insert( b, ( char_string!("a while"), "When not used after a verb, spell this duration as `a while`.", ), ); Self { expr: map } } } impl ExprLinter for AWhile { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let &(ref suggestion, message) = self.expr.lookup(0, matched_tokens, source)?; let span = matched_tokens[2..].span()?; let suggestion = Suggestion::replace_with_match_case(suggestion.to_vec(), span.get_content(source)); Some(Lint { span, lint_kind: LintKind::Typo, suggestions: vec![suggestion], message: message.to_owned(), ..Default::default() }) } fn description(&self) -> &'static str { "Enforces `awhile` after verbs and `a while` everywhere else." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::AWhile; #[test] fn allow_issue_2144() { assert_no_lints( "After thinking awhile, I decided to foo a bar.", AWhile::default(), ); assert_no_lints( "After thinking for a while, I decided to foo a bar.", AWhile::default(), ); } #[test] fn fix_issue_2144() { assert_suggestion_result( "After thinking a while, I decided to foo a bar.", AWhile::default(), "After thinking awhile, I decided to foo a bar.", ); } #[test] fn correct_in_quite_a_while() { assert_suggestion_result( "I haven't seen him in quite awhile.", AWhile::default(), "I haven't seen him in quite a while.", ); } #[test] fn correct_in_a_while() { assert_suggestion_result( "I haven't checked in awhile.", AWhile::default(), "I haven't checked in a while.", ); } #[test] fn correct_for_awhile() { assert_suggestion_result( "Video Element Error: MEDA_ERR_DECODE when chrome is left open for awhile", AWhile::default(), "Video Element Error: MEDA_ERR_DECODE when chrome is left open for a while", ); } #[test] fn correct_after_awhile() { assert_suggestion_result( "Links on portal stop working after awhile, requiring page refresh.", AWhile::default(), "Links on portal stop working after a while, requiring page refresh.", ); } } ================================================ FILE: harper-core/src/linting/addicting.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{All, AnchorEnd, Expr, FirstMatchOf, LongestMatchOf, ReflexivePronoun, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct Addicting { expr: LongestMatchOf, } impl Default for Addicting { fn default() -> Self { Self { expr: LongestMatchOf::new(vec![ // matches `addicting` without anything after Box::new(SequenceExpr::aco("addicting").then(AnchorEnd)), // matches `addicting` [ any word but not a reflexive pronoun or object pronoun ] Box::new( SequenceExpr::aco("addicting") .then_whitespace() .then(All::new(vec![ // positive - any word Box::new(SequenceExpr::any_word()), // negative - reflexive pronoun or object pronoun Box::new(SequenceExpr::unless(FirstMatchOf::new(vec![ Box::new(ReflexivePronoun::with_common_errors()), Box::new(SequenceExpr::default().then_object_pronoun()), ]))), ])), ), ]), } } } impl ExprLinter for Addicting { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let tok = toks.first()?; Some(Lint { span: tok.span, lint_kind: LintKind::Style, suggestions: vec![Suggestion::replace_with_match_case( "addictive".chars().collect(), tok.span.get_content(src), )], message: "When used as an adjective, `addictive` is the traditional and more f form." .to_owned(), ..Default::default() }) } fn description(&self) -> &str { "Replaces `addicting` with `addictive` when used as an adjective." } } #[cfg(test)] mod tests { use super::Addicting; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fix_addicting() { assert_suggestion_result( "It is addicting like heroin.", Addicting::default(), "It is addictive like heroin.", ); } #[test] fn dont_flag_addicting_object_pronoun() { assert_lint_count("It is addicting me.", Addicting::default(), 0); } #[test] fn dont_flag_addicting_reflexive_pronoun() { assert_lint_count("He is addicting himself.", Addicting::default(), 0); } #[test] fn fix_yet_highly_addicting() { assert_suggestion_result( "The objective of the game is simple yet highly addicting, you start out with the four basic elements.", Addicting::default(), "The objective of the game is simple yet highly addictive, you start out with the four basic elements.", ); } #[test] fn dont_flag_addicting_them_on() { assert_no_lints( "Helping humans on their daily tasks instead of addicting them on social networks of all sorts.", Addicting::default(), ); } #[test] #[ignore = "False positive since `myself` is not an object pronoun in this construction"] fn fix_find_things_addicting_myself() { assert_suggestion_result( "Yeah, I find taking the functional approach for these kinds of problems rather addicting myself :)", Addicting::default(), "Yeah, I find taking the functional approach for these kinds of problems rather addictive myself :)", ); } #[test] fn dont_fix_coerced_into_addicting_themselves() { assert_no_lints( "The British, in another display of gunboat diplomacy, coerced countless innocent people into addicting themselves to opium.", Addicting::default(), ); } } ================================================ FILE: harper-core/src/linting/adjective_double_degree.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct AdjectiveDoubleDegree { expr: SequenceExpr, } impl Default for AdjectiveDoubleDegree { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["more", "most"]) .t_ws() .then_kind_where(|kind| { kind.is_comparative_adjective() || kind.is_superlative_adjective() }), } } } impl ExprLinter for AdjectiveDoubleDegree { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let phrase_span = toks.span()?; let phrase_chars = phrase_span.get_content(src); let adj_chars = toks.last()?.span.get_content(src); let (lint_kind, message, suggestions) = match ( &toks.first()?.span.get_content(src).to_lower().as_ref(), toks.last()?.kind.is_comparative_adjective(), toks.last()?.kind.is_superlative_adjective(), ) { (['m', 'o', 'r', 'e'], true, false) => ( LintKind::Redundancy, "Using `more` and the comparative form of the adjective together is redundant." .to_string(), vec![Suggestion::replace_with_match_case( adj_chars.to_vec(), phrase_chars, )], ), (['m', 'o', 's', 't'], false, true) => ( LintKind::Redundancy, "Using `most` and the superlative form of the adjective together is redundant." .to_string(), vec![Suggestion::replace_with_match_case( adj_chars.to_vec(), phrase_chars, )], ), _ => { let other_adj_degree = match adj_chars { &['b', 'e', 't', 't', 'e', 'r'] => vec!['b', 'e', 's', 't'], &['b', 'e', 's', 't'] => vec!['b', 'e', 't', 't', 'e', 'r'], &['w', 'o', 'r', 's', 'e'] => vec!['w', 'o', 'r', 's', 't'], &['w', 'o', 'r', 's', 't'] => vec!['w', 'o', 'r', 's', 'e'], adj_chars if adj_chars.ends_with(&['r']) => { let len = adj_chars.len() + 1; let mut other = vec!['\0'; len]; other[..len - 2].copy_from_slice(&adj_chars[..len - 2]); other[len - 2] = 's'; other[len - 1] = 't'; other } adj_chars if adj_chars.ends_with(&['s', 't']) => { let len = adj_chars.len() - 1; let mut other = vec!['\0'; len]; other[..len - 1].copy_from_slice(&adj_chars[..len - 1]); other[len - 1] = 'r'; other } _ => return None, }; ( LintKind::WordChoice, "The degree of the adverb conflicts with the degree of the adjective." .to_string(), vec![ Suggestion::replace_with_match_case(adj_chars.to_vec(), phrase_chars), Suggestion::replace_with_match_case(other_adj_degree, phrase_chars), ], ) } }; Some(Lint { span: phrase_span, lint_kind, message, suggestions, priority: 126, }) } fn description(&self) -> &'static str { "Finds adjectives that are used as double degrees (e.g. `more prettier`)." } } #[cfg(test)] mod tests { use super::AdjectiveDoubleDegree; use crate::linting::tests::{assert_good_and_bad_suggestions, assert_suggestion_result}; #[test] fn fix_double_regular_superlative() { assert_suggestion_result( "The most easiest to use, self-service open BI reporting and BI dashboard and BI monitor screen platform.", AdjectiveDoubleDegree::default(), "The easiest to use, self-service open BI reporting and BI dashboard and BI monitor screen platform.", ); } #[test] fn fix_double_regular_comparative() { assert_suggestion_result( "how can make docx gennerate more faster?", AdjectiveDoubleDegree::default(), "how can make docx gennerate faster?", ); } #[test] fn fix_double_irregular_comparative() { assert_suggestion_result( "Find alternative product name more better than age .", AdjectiveDoubleDegree::default(), "Find alternative product name better than age .", ); } #[test] fn fix_double_irregular_superlative() { assert_suggestion_result( "how can i get a most best quality file", AdjectiveDoubleDegree::default(), "how can i get a best quality file", ); } #[test] fn conflicting_moster_offers_two_suggestions() { assert_good_and_bad_suggestions( "application which students to learn most faster in efficient way.", AdjectiveDoubleDegree::default(), &[ "application which students to learn faster in efficient way.", "application which students to learn fastest in efficient way.", ], &[], ); } #[test] fn conflicting_morest_offers_two_suggestions() { assert_good_and_bad_suggestions( "I suggest migrating to vite that more flexible and more fastest.", AdjectiveDoubleDegree::default(), &[ "I suggest migrating to vite that more flexible and faster.", "I suggest migrating to vite that more flexible and fastest.", ], &[], ); } #[test] fn conflicting_most_better_offers_two_suggestions() { assert_good_and_bad_suggestions( "But first logo is most better for me.", AdjectiveDoubleDegree::default(), &[ "But first logo is better for me.", "But first logo is best for me.", ], &[], ); } #[test] fn conflicting_most_worse_offers_two_suggestions() { assert_good_and_bad_suggestions( "We also see the need of a generic solution built-in in Pimcore, but currently it's probably the most worse time to implement a new solution.", AdjectiveDoubleDegree::default(), &[ // TODO: special-case after "the" since that implies a superlative "We also see the need of a generic solution built-in in Pimcore, but currently it's probably the worse time to implement a new solution.", "We also see the need of a generic solution built-in in Pimcore, but currently it's probably the worst time to implement a new solution.", ], &[], ); } } ================================================ FILE: harper-core/src/linting/adjective_of_a.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::{Document, Span, TokenStringExt}; /// Detect sequences of words of the form "adjective of a". #[derive(Debug, Clone, Copy, Default)] pub struct AdjectiveOfA; const ADJECTIVE_WHITELIST: &[&str] = &["bad", "big", "good", "large", "long", "vague"]; const CONTEXT_WORDS: &[&str] = &[ "as", "how", // but "how much of a" "that", "this", "too", ]; const ADJECTIVE_BLACKLIST: &[&str] = &["much", "part"]; fn has_context_word(document: &Document, adj_idx: usize) -> bool { if adj_idx < 2 { // Need at least 2 tokens before the adjective (word + space) return false; } // Get the token before the adjective (should be a space) if let Some(space_token) = document.get_token(adj_idx - 1) { if !space_token.kind.is_whitespace() { return false; } // Get the token before the space (should be our context word) if let Some(word_token) = document.get_token(adj_idx - 2) { if !word_token.kind.is_word() { return false; } let word = document.get_span_content_str(&word_token.span); return CONTEXT_WORDS.iter().any(|&w| w.eq_ignore_ascii_case(&word)); } } false } fn is_good_adjective(word: &str) -> bool { ADJECTIVE_WHITELIST .iter() .any(|&adj| word.eq_ignore_ascii_case(adj)) } fn is_bad_adjective(word: &str) -> bool { ADJECTIVE_BLACKLIST .iter() .any(|&adj| word.eq_ignore_ascii_case(adj)) } impl Linter for AdjectiveOfA { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for i in document.iter_adjective_indices() { let adjective = document.get_token(i).unwrap(); let space_1 = document.get_token(i + 1); let word_of = document.get_token(i + 2); let space_2 = document.get_token(i + 3); let a_or_an = document.get_token(i + 4); let adj_str = document .get_span_content_str(&adjective.span) .to_lowercase(); // Only flag adjectives known to use this construction // Unless we have a clearer context if !is_good_adjective(&adj_str) && !has_context_word(document, i) { continue; } // Some adjectives still create false positives even with the extra context if is_bad_adjective(&adj_str) { continue; } // Rule out comparatives and superlatives. // Pros: // "for the better of a day" // "might not be the best of a given run" // "Which brings me to my best of a bad situation." // // Cons: // "see if you can give us a little better of an answer" // "hopefully it won't be too much worse of a problem" // "seems far worse of a result to me" if adj_str.ends_with("er") || adj_str.ends_with("st") { continue; } // Rule out present participles (e.g. "beginning of a") // The -ing form of a verb acts as an adjective called a present participle // and also acts as a noun called a gerund. if adj_str.ends_with("ing") && (adjective.kind.is_noun() || adjective.kind.is_verb()) { continue; } if space_1.is_none() || word_of.is_none() || space_2.is_none() || a_or_an.is_none() { continue; } let space_1 = space_1.unwrap(); if !space_1.kind.is_whitespace() { continue; } let word_of = word_of.unwrap(); if !word_of.kind.is_word() { continue; } let word_of = document.get_span_content_str(&word_of.span).to_lowercase(); if word_of != "of" { continue; } let space_2 = space_2.unwrap(); if !space_2.kind.is_whitespace() { continue; } let a_or_an = a_or_an.unwrap(); if !a_or_an.kind.is_word() { continue; } let a_or_an_str = document.get_span_content_str(&a_or_an.span).to_lowercase(); if a_or_an_str != "a" && a_or_an_str != "an" { continue; } // Whitespace may differ, add the other replacement if so let mut sugg_1 = Vec::new(); sugg_1.extend_from_slice(document.get_span_content(&adjective.span)); sugg_1.extend_from_slice(document.get_span_content(&space_1.span)); sugg_1.extend_from_slice(document.get_span_content(&a_or_an.span)); let mut sugg_2 = Vec::new(); sugg_2.extend_from_slice(document.get_span_content(&adjective.span)); sugg_2.extend_from_slice(document.get_span_content(&space_2.span)); sugg_2.extend_from_slice(document.get_span_content(&a_or_an.span)); let mut suggestions = vec![Suggestion::ReplaceWith(sugg_1.clone())]; if sugg_1 != sugg_2 { suggestions.push(Suggestion::ReplaceWith(sugg_2)); } lints.push(Lint { span: Span::new(adjective.span.start, a_or_an.span.end), lint_kind: LintKind::Style, suggestions, message: "The word `of` is not needed here.".to_string(), priority: 63, }); } lints } fn description(&self) -> &str { "This rule looks for sequences of words of the form `adjective of a`." } } #[cfg(test)] mod tests { use super::AdjectiveOfA; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn correct_large_of_a() { assert_suggestion_result( "Yeah I'm using as large of a batch size as I can on this machine", AdjectiveOfA, "Yeah I'm using as large a batch size as I can on this machine", ) } #[test] fn correct_bad_of_an() { assert_suggestion_result( "- If forking is really that bad of an option, let's first decide where to put this.", AdjectiveOfA, "- If forking is really that bad an option, let's first decide where to put this.", ); } #[test] fn dont_flag_comparative() { assert_lint_count( "I only worked with custom composer installers for the better of a day, so please excuse me if I missed a thing.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_superlative() { assert_lint_count( "I am trying to use composites to visualize the worst of a set of metrics.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_kind() { // Adjective as in "a kind person" vs noun as in "A kind of person" assert_lint_count( "Log.txt file automatic creation in PWD is kind of an anti-feature", AdjectiveOfA, 0, ); } #[test] fn dont_flag_part() { // Can be an adjective in e.g. "He is just part owner" assert_lint_count( "cannot delete a food that is no longer part of a recipe", AdjectiveOfA, 0, ); } #[test] fn dont_flag_much() { // "much of" is correct idiomatic usage assert_lint_count( "How much of a performance impact when switching from rails to rails-api ?", AdjectiveOfA, 0, ); } #[test] fn dont_flag_part_uppercase() { // Can be an adjective in e.g. "Part man, part machine" assert_lint_count( "Quarkus Extension as Part of a Project inside a Monorepo?", AdjectiveOfA, 0, ); } #[test] fn dont_flag_all_of() { // "all of" is correct idiomatic usage assert_lint_count( "This repository is deprecated. All of its content and history has been moved.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_inside() { // "inside of" is idiomatic usage assert_lint_count( "Michael and Brock sat inside of a diner in Brandon", AdjectiveOfA, 0, ); } #[test] fn dont_flag_out() { // "out of" is correct idiomatic usage assert_lint_count( "not only would he potentially be out of a job and back to sort of poverty", AdjectiveOfA, 0, ); } #[test] fn dont_flag_full() { // "full of" is correct idiomatic usage assert_lint_count( "fortunately I happen to have this Tupperware full of an unceremoniously disassembled LED Mac Mini", AdjectiveOfA, 0, ); } #[test] fn dont_flag_something() { // Can be a noun in e.g. "a certain something" assert_lint_count( "Well its popularity seems to be taking something of a dip right now.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_short() { // Can be a noun in e.g. "use a multimeter to find the short" assert_lint_count( "I found one Youtube short of an indonesian girl.", AdjectiveOfA, 0, ) } #[test] fn dont_flag_bottom() { // Can be an adjective in e.g. "bottom bunk" assert_lint_count( "When leaves are just like coming out individually from the bottom of a fruit.", AdjectiveOfA, 0, ) } #[test] fn dont_flag_left() { // Can be an adjective in e.g. "left hand" assert_lint_count("and what is left of a 12vt coil", AdjectiveOfA, 0) } #[test] fn dont_flag_full_uppercase() { assert_lint_count("Full of a bunch varnish like we get.", AdjectiveOfA, 0); } #[test] fn dont_flag_head() { // Can be an adjective in e.g. "the head cook" assert_lint_count( "You need to get out if you're the head of an education department and you're not using AI", AdjectiveOfA, 0, ); } #[test] fn dont_flag_middle() { // Can be an adjective in e.g. "middle child" assert_lint_count( "just to get to that part in the middle of a blizzard", AdjectiveOfA, 0, ); } #[test] fn dont_flag_chance() { // Can be an adjective in e.g. "a chance encounter" assert_lint_count( "products that you overpay for because there are subtle details in the terms and conditions that reduce the size or chance of a payout.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_potential() { // Can be an adjective in e.g. "a potential candidate" assert_lint_count( "People that are happy to accept it for the potential of a reward.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_sound() { // Can be an adjective in e.g. "sound advice" assert_lint_count("the sound of an approaching Krampus", AdjectiveOfA, 0); } #[test] fn dont_flag_rid() { // I removed the `5` flag from `rid` in `dictionary.dict` // because dictionaries say the sense is archaic. assert_lint_count("I need to get rid of a problem", AdjectiveOfA, 0); } #[test] fn dont_flag_precision() { // Can be an adjective in e.g. "a precision instrument" assert_lint_count( "a man whose crew cut has the precision of a targeted drone strike", AdjectiveOfA, 0, ); } #[test] fn dont_flag_back() { // Can be an adjective in e.g. "back door" assert_lint_count( "a man whose crew cut has the back of a targeted drone strike", AdjectiveOfA, 0, ); } #[test] fn dont_flag_emblematic() { // "emblematic of" is correct idiomatic usage assert_lint_count( "... situation was emblematic of a publication that ...", AdjectiveOfA, 0, ); } #[test] fn dont_flag_half() { // Can be an adjective in e.g. "half man, half machine" assert_lint_count("And now I only have half of a CyberTruck", AdjectiveOfA, 0); } #[test] fn dont_flag_bit() { // Technically also an adj as in "that guy's bit - he'll turn into a zombie" assert_lint_count("we ran into a bit of an issue", AdjectiveOfA, 0); } #[test] fn dont_flag_dream() { // Can be an adjective in e.g. "we built our dream house" assert_lint_count("When the dream of a united Europe began", AdjectiveOfA, 0); } #[test] fn dont_flag_beginning() { // Present participles have properties of adjectives, nouns, and verbs assert_lint_count("That's the beginning of a conversation.", AdjectiveOfA, 0); } #[test] fn dont_flag_side() { // Can be an adjective in e.g. "via a side door" assert_lint_count( "it hit the barrier on the side of a highway", AdjectiveOfA, 0, ); } #[test] fn dont_flag_derivative() { // Adj: "a derivative story", Noun: "stocks and derivatives" assert_lint_count( "Techniques for evaluating the *partial derivative of a function", AdjectiveOfA, 0, ) } #[test] fn dont_flag_equivalent() { assert_lint_count( "Rust's equivalent of a switch statement is a match expression", AdjectiveOfA, 0, ); } #[test] fn dont_flag_up() { assert_lint_count( "Yeah gas is made up of a bunch of teenytiny particles all moving around.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_eighth() { assert_lint_count( "It's about an eighth of an inch or whatever", AdjectiveOfA, 0, ); } #[test] fn dont_flag_shy() { assert_lint_count( "... or just shy of a third of the country's total trade deficit.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_fun() { assert_lint_count( "Remember that $4,000 Hermes horse bag I was making fun of a little while ago.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_off() { // Can be an adjective in e.g. "The TV is off". // This should be in a different lint that handles based on/off/off of. assert_lint_count( "can't identify a person based off of an IP from 10 years ago", AdjectiveOfA, 0, ); } #[test] fn dont_flag_borderline_of() { assert_lint_count( "it's very very on the borderline of a rock pop ballad", AdjectiveOfA, 0, ); } #[test] fn dont_flag_light() { assert_lint_count("The light of a star.", AdjectiveOfA, 0); } #[test] fn dont_flag_multiple() { assert_lint_count( "The image needs to be a multiple of a certain size.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_red() { assert_lint_count("The red of a drop of blood.", AdjectiveOfA, 0); } #[test] fn dont_flag_top() { assert_lint_count("The top of a hill.", AdjectiveOfA, 0); } #[test] fn dont_flag_slack() { assert_lint_count( "They've been picking up the slack of a federal government mostly dominated by whatever this is.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_illustrative() { assert_lint_count( "Yet, the fact that they clearly give a one-sided account of most of their case studies is illustrative of a bias.", AdjectiveOfA, 0, ); } #[test] fn dont_flag_perspective() { assert_lint_count( "I always assess software by looking at it from the perspective of a new user.", AdjectiveOfA, 0, ); } #[test] fn correct_too_large_of_a() { assert_suggestion_result( "Warn users if setting too large of a session object", AdjectiveOfA, "Warn users if setting too large a session object", ) } #[test] fn correct_too_long_of_a() { assert_suggestion_result( "An Org Role with Too Long of a Name Hides Delete Option", AdjectiveOfA, "An Org Role with Too Long a Name Hides Delete Option", ) } #[test] fn correct_too_big_of_a() { assert_suggestion_result( "StepButton has too big of a space to click", AdjectiveOfA, "StepButton has too big a space to click", ) } #[test] fn correct_too_vague_of_a() { assert_suggestion_result( "\"No Speech provider is registered.\" is too vague of an error", AdjectiveOfA, "\"No Speech provider is registered.\" is too vague an error", ) } #[test] fn correct_too_dumb_of_a() { assert_suggestion_result( "Hopefully this isn't too dumb of a question.", AdjectiveOfA, "Hopefully this isn't too dumb a question.", ) } #[test] fn correct_how_important_of_a() { assert_suggestion_result( "This should tell us how important of a use case that is and how often writing a type literal in a case is deliberate.", AdjectiveOfA, "This should tell us how important a use case that is and how often writing a type literal in a case is deliberate.", ) } #[test] fn correct_that_rare_of_an() { assert_suggestion_result( "so making changes isn't that rare of an occurrence for me.", AdjectiveOfA, "so making changes isn't that rare an occurrence for me.", ) } #[test] fn correct_as_important_of_a() { assert_suggestion_result( "Might be nice to have it draggable from other places as well, but not as important of a bug anymore.", AdjectiveOfA, "Might be nice to have it draggable from other places as well, but not as important a bug anymore.", ) } #[test] fn correct_too_short_of_a() { assert_suggestion_result( "I login infrequently as well and 6 months is too short of a time.", AdjectiveOfA, "I login infrequently as well and 6 months is too short a time.", ) } #[test] fn correct_that_common_of_a() { assert_suggestion_result( "that common of a name for a cluster role its hard to rule out", AdjectiveOfA, "that common a name for a cluster role its hard to rule out", ) } #[test] fn correct_as_great_of_an() { assert_suggestion_result( "the w factor into the u factor to as great of an extent as possible.", AdjectiveOfA, "the w factor into the u factor to as great an extent as possible.", ) } #[test] fn correct_too_uncommon_of_a() { assert_suggestion_result( "but this is probably too uncommon of a practice to be the default", AdjectiveOfA, "but this is probably too uncommon a practice to be the default", ) } } ================================================ FILE: harper-core/src/linting/after_later.rs ================================================ use crate::Token; use crate::expr::{DurationExpr, Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::token_string_ext::TokenStringExt; pub struct AfterLater { expr: SequenceExpr, } impl Default for AfterLater { fn default() -> Self { Self { expr: SequenceExpr::aco("after") .t_ws() .then_optional( SequenceExpr::word_set(&[ "about", "almost", "approximately", "around", "circa", "exactly", "just", "maybe", "nearly", "only", "perhaps", "precisely", "probably", "roughly", ]) .t_ws(), ) .then(DurationExpr) .t_ws() .t_aco("later"), } } } impl ExprLinter for AfterLater { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let without_after: Vec = toks[2..].span()?.get_content(src).to_vec(); let without_later: Vec = toks[..toks.len() - 2].span()?.get_content(src).to_vec(); let template_chars = toks.span()?.get_content(src); Some(Lint { span: toks.span()?, lint_kind: LintKind::Redundancy, message: "Don't use `later` following `after [a period of time]`".to_string(), suggestions: vec![ Suggestion::replace_with_match_case(without_after, template_chars), Suggestion::replace_with_match_case(without_later, template_chars), ], ..Default::default() }) } fn description(&self) -> &str { "Checks for the word `later` following `after [a period of time]`." } } #[cfg(test)] mod tests { use super::AfterLater; use crate::linting::tests::assert_suggestion_result; #[test] fn after_90_days_later() { assert_suggestion_result( "Try to rename your organization after 90 days later because of GitHub official documentation it said.", AfterLater::default(), "Try to rename your organization after 90 days because of GitHub official documentation it said.", ); } #[test] fn after_about_30_minutes_later() { assert_suggestion_result( "It plays like 1 minute of the song and then stops, and after about 30 minutes later, the bot disconnects an throws DisTubeError", AfterLater::default(), "It plays like 1 minute of the song and then stops, and about 30 minutes later, the bot disconnects an throws DisTubeError", ); } #[test] fn after_14_days_later() { assert_suggestion_result( "After 14 days later, the cache expired.", AfterLater::default(), "After 14 days, the cache expired.", ); } #[test] fn after_exactly_5_minutes_later() { assert_suggestion_result( "After exactly 5 minutes later, they try again and the cluster is formed then.", AfterLater::default(), "Exactly 5 minutes later, they try again and the cluster is formed then.", ); } #[test] fn after_22_years_later_1() { assert_suggestion_result( "Completed YR campaign for 2nd time after 22 years later.", AfterLater::default(), "Completed YR campaign for 2nd time after 22 years.", ); } #[test] fn after_almost_2_years_later() { assert_suggestion_result( "This buyer contacted me after almost 2 years later.", AfterLater::default(), "This buyer contacted me almost 2 years later.", ); } #[test] fn after_2_years_later() { assert_suggestion_result( "Is Jedi Survivor better now after 2 years later?", AfterLater::default(), "Is Jedi Survivor better now after 2 years?", ); } #[test] fn after_a_year_later() { assert_suggestion_result( "Even after a year later, I don’t know how to get my self-love back.", AfterLater::default(), "Even a year later, I don’t know how to get my self-love back.", ); } #[test] fn after_22_years_later_2() { assert_suggestion_result( "After 22 years later, my top 1 game was Zeroed", AfterLater::default(), "After 22 years, my top 1 game was Zeroed", ); } } ================================================ FILE: harper-core/src/linting/all_hell_break_loose.rs ================================================ use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct AllHellBreakLoose { expr: SequenceExpr, } impl Default for AllHellBreakLoose { fn default() -> Self { Self { expr: SequenceExpr::aco("all") .t_ws() .t_aco("hell") .t_ws() .then_word_set(&["break", "breaking", "breaks", "broke", "broken"]) .t_ws() .t_aco("out"), } } } impl ExprLinter for AllHellBreakLoose { type Unit = Chunk; fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let outtok = toks.last()?; let outspan = outtok.span; let outchars = outspan.get_content(src); Some(Lint { lint_kind: LintKind::Eggcorn, span: outspan, suggestions: vec![Suggestion::replace_with_match_case_str("loose", outchars)], message: "The correct idiom is `all hell breaks loose`.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Corrects forms of `all hell breaks out` to `all hell breaks loose`." } fn expr(&self) -> &dyn Expr { &self.expr } } #[cfg(test)] mod tests { use super::AllHellBreakLoose; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_break() { assert_suggestion_result( "Just run around planting satchels charges while you're alive and let all hell break out when you die.", AllHellBreakLoose::default(), "Just run around planting satchels charges while you're alive and let all hell break loose when you die.", ); } #[test] fn fix_breaks() { assert_suggestion_result( "we upgraded 2 months ago, and now we upgrade prod and all hell breaks out", AllHellBreakLoose::default(), "we upgraded 2 months ago, and now we upgrade prod and all hell breaks loose", ); } #[test] fn fix_breaking() { assert_suggestion_result( "Next scene, all hell breaking out!", AllHellBreakLoose::default(), "Next scene, all hell breaking loose!", ); } #[test] fn fix_broke() { assert_suggestion_result( "this time going from 1.3.4 to 1.4.2 and all hell broke out", AllHellBreakLoose::default(), "this time going from 1.3.4 to 1.4.2 and all hell broke loose", ); } #[test] fn fix_broken() { assert_suggestion_result( "I’m using silenced weapons but as soon as I fire it’s all hell broken out.", AllHellBreakLoose::default(), "I’m using silenced weapons but as soon as I fire it’s all hell broken loose.", ); } } ================================================ FILE: harper-core/src/linting/all_intents_and_purposes.rs ================================================ use crate::Token; use crate::char_string::CharStringExt; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::token_string_ext::TokenStringExt; pub struct AllIntentsAndPurposes { expr: SequenceExpr, } impl Default for AllIntentsAndPurposes { fn default() -> Self { Self { expr: SequenceExpr::default() .then_preposition() // Only "for" or "to" are OK .t_ws() .t_aco("all") .t_ws() .then_any_of(vec![ Box::new( SequenceExpr::word_set(&[ "intents", // Correct, as long as it follows "for" or "to" "extents", "intense", // Incorrect, no matter the preposition ]) .t_ws() .t_aco("and"), ), Box::new(SequenceExpr::word_set(&[ "intended", "intense", "intensive", "intrinsic", ])), ]) .t_ws() .t_aco("purposes"), } } } impl ExprLinter for AllIntentsAndPurposes { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let whole_span = toks.span()?; let whole_str = whole_span.get_content_string(src); // "for" is first since "to" is listed as a UK variant in some dictionaries const LEGIT: [&str; 2] = [ "for all intents and purposes", "to all intents and purposes", ]; if LEGIT.iter().any(|s| s.eq_ignore_ascii_case(&whole_str)) { return None; } let prep_text = toks.first().unwrap().span.get_content(src); let mut suggs = LEGIT.to_vec(); // Suggest "to" first if the text uses "to", otherwise "for" first if prep_text.eq_ignore_ascii_case_chars(&['t', 'o']) { suggs.swap(0, 1); } let suggs = suggs .into_iter() .map(|s| Suggestion::replace_with_match_case_str(s, whole_span.get_content(src))) .collect::>(); let message = format!( "The correct form is '{} all intents and purposes'.", prep_text.iter().collect::().to_ascii_lowercase() ); Some(Lint { span: whole_span, lint_kind: LintKind::Nonstandard, suggestions: suggs, message, priority: 50, }) } fn description(&self) -> &'static str { "Finds and corrects common wrong forms of the phrase 'for all intents and purposes' / 'to all intents and purposes'." } } #[cfg(test)] mod tests { use super::AllIntentsAndPurposes; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // Adjectives without "and" #[test] fn fix_for_intended() { assert_suggestion_result( "The details tag should be treated like a div for all intended purposes, but unsure where in the selection logic", AllIntentsAndPurposes::default(), "The details tag should be treated like a div for all intents and purposes, but unsure where in the selection logic", ); } #[test] fn fix_for_intense() { assert_suggestion_result( "For all intense purposes, I thought your code was really well written", AllIntentsAndPurposes::default(), "For all intents and purposes, I thought your code was really well written", ); } #[test] fn fix_for_intensive() { assert_suggestion_result( "MultiNode could be for all intensive purposes, the same as Node sans the way it creates the command line arguments for the process.", AllIntentsAndPurposes::default(), "MultiNode could be for all intents and purposes, the same as Node sans the way it creates the command line arguments for the process.", ); } #[test] fn fix_for_intrinsic_purposes() { assert_suggestion_result( "For all intrinsic purposes I think you are wrong.", AllIntentsAndPurposes::default(), "For all intents and purposes I think you are wrong.", ); } #[test] fn fix_in_intense_purposes() { assert_suggestion_result( "the solution has some rules than in all intense purposes is not necessarily database driven", AllIntentsAndPurposes::default(), "the solution has some rules than for all intents and purposes is not necessarily database driven", ); } #[test] fn fix_to_intensive_purposes() { assert_suggestion_result( "To all intensive purposes, for the consumer, a view is a table", AllIntentsAndPurposes::default(), "To all intents and purposes, for the consumer, a view is a table", ); } // Nouns with "and" #[test] fn fix_at_intents_and() { assert_suggestion_result( "can be thought of, at all intents and purposes, as a controlled cache", AllIntentsAndPurposes::default(), "can be thought of, for all intents and purposes, as a controlled cache", ); } #[test] fn fix_by_intents_and() { assert_suggestion_result( "so by all intents and purposes one is not nested into another", AllIntentsAndPurposes::default(), "so for all intents and purposes one is not nested into another", ); } #[test] fn fix_for_extents_and() { assert_suggestion_result( "#include, for all extents and purposes (if you take the preprocessor out) just copies the file", AllIntentsAndPurposes::default(), "#include, for all intents and purposes (if you take the preprocessor out) just copies the file", ); } #[test] fn dont_flag_for_intents_and() { assert_no_lints( "with the previous previous setting still present and for all intents and purposes seems enabled", AllIntentsAndPurposes::default(), ); } #[test] fn fix_from_intents_and() { assert_suggestion_result( "act as a full archive node from all intents and purposes", AllIntentsAndPurposes::default(), "act as a full archive node for all intents and purposes", ); } #[test] fn fix_in_intents_and() { assert_suggestion_result( "I posted #20493 asking about, in all intents and purposes, deno info", AllIntentsAndPurposes::default(), "I posted #20493 asking about, for all intents and purposes, deno info", ); } #[test] fn fix_on_intents_and() { assert_suggestion_result( "It depends on all intents and purposes what you want to do.", AllIntentsAndPurposes::default(), "It depends for all intents and purposes what you want to do.", ); } #[test] fn fix_through_intents_and() { assert_suggestion_result( "While, I know through all intents and purposes it is an ugly url to look at", AllIntentsAndPurposes::default(), "While, I know for all intents and purposes it is an ugly url to look at", ); } #[test] fn fix_to_extents_and() { assert_suggestion_result( "and they were trying to find out how that would also affect the the personnel to all extents and purposes.", AllIntentsAndPurposes::default(), "and they were trying to find out how that would also affect the the personnel to all intents and purposes.", ); } #[test] fn dont_flag_to_intents_and() { assert_no_lints( "and they were trying to find out how that would also affect the the personnel to all intents and purposes.", AllIntentsAndPurposes::default(), ); } #[test] fn fix_with_intents_and() { assert_suggestion_result( "With all intents and purposes the array should be As String since all values I'll be dealing with will be strings.", AllIntentsAndPurposes::default(), "For all intents and purposes the array should be As String since all values I'll be dealing with will be strings.", ); } // Adjectives with "and"! #[test] fn fix_by_intensive_purposes() { assert_suggestion_result( "By all intensive purposes this should be working", AllIntentsAndPurposes::default(), "For all intents and purposes this should be working", ); } #[test] fn fix_for_intense_and() { assert_suggestion_result( "to test my site, which for all intense and purposes works", AllIntentsAndPurposes::default(), "to test my site, which for all intents and purposes works", ); } #[test] fn fix_in_intensive_purposes() { assert_suggestion_result( "it should in all intensive purposes keep running", AllIntentsAndPurposes::default(), "it should for all intents and purposes keep running", ); } #[test] fn fix_to_intense_and() { assert_suggestion_result( "The other type, is to all intense and purposes a submit button to the browser", AllIntentsAndPurposes::default(), "The other type, is to all intents and purposes a submit button to the browser", ); } // Doesn't try to deal with qualified "all" #[test] fn dont_flag_for_basically_all_intents_and_purposes() { assert_no_lints( "For basically all intents and purposes, this works fine.", AllIntentsAndPurposes::default(), ); } #[test] fn dont_flag_for_nearly_all_intents_and_purposes() { assert_no_lints( "but for nearly all intents and purposes this should be negligable", AllIntentsAndPurposes::default(), ); } #[test] fn dont_flag_for_pretty_much_all_intents_and_purposes() { assert_no_lints( "or for pretty much all intents and purposes, between Android devices", AllIntentsAndPurposes::default(), ); } // Strange false positives #[test] #[ignore = "Rare and unusual false positive"] fn false_positive_for_99_percent_of_all_intents_and_purposes() { assert_no_lints( "But for 99% of all intents and purposes they can be treated as lists.", AllIntentsAndPurposes::default(), ); } // US Constitution false positive #[test] fn false_positive_for_us_constitution_space() { assert_no_lints( "Amendments, which, in either Case, shall be valid to all Intents and Purposes, as Part of this Constitution", AllIntentsAndPurposes::default(), ); } #[test] #[ignore = "The linefeed should be treated as a space!"] fn false_positive_for_us_constitution_line_break() { assert_no_lints( "Amendments, which, in either Case, shall be valid to all Intents and\nPurposes, as Part of this Constitution", AllIntentsAndPurposes::default(), ); } } ================================================ FILE: harper-core/src/linting/allow_to.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind}; use crate::token::Token; use crate::token_string_ext::TokenStringExt; pub struct AllowTo { exp: SequenceExpr, } impl Default for AllowTo { fn default() -> Self { Self { // Note: Does not include "allowed to", which is a legitimate usage in its own right. exp: SequenceExpr::word_set(&["allow", "allowing", "allows"]) .t_ws() .t_aco("to") .then_optional(SequenceExpr::default().t_ws().then_adverb()) .t_ws() .then_any_word(), } } } impl ExprLinter for AllowTo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.exp } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { let span = toks.span()?; let first = toks.first()?; let allow = first.span.get_content_string(_src); let message = format!( "For correct usage, either add a subject between `{allow}` and `to` (e.g., `{allow} someone to do`) or use the present participle (e.g., `{allow} doing`)." ); Some(Lint { span, lint_kind: LintKind::Grammar, suggestions: vec![], message, ..Default::default() }) } fn description(&self) -> &'static str { "Flags erroneous usage of `allow to` without a subject." } } #[cfg(test)] mod tests { use super::AllowTo; use crate::linting::tests::{assert_lint_count, assert_no_lints}; #[test] fn flag_allow_to() { assert_lint_count( "Allow to change approval policy during running task # 4394.", AllowTo::default(), 1, ); } #[test] fn flag_allowing_to() { assert_lint_count( "Allowing to have multiple views with different filtering # 952.", AllowTo::default(), 1, ); } #[test] fn flag_allows_to() { assert_lint_count( "It is easily doable for classic IHostBuilder, because its extension allows to pass configure action", AllowTo::default(), 1, ); } #[test] fn dont_flag_allowed_to() { assert_no_lints( "In C and C++ aliasing has to do with what expression types we are allowed to access stored values through.", AllowTo::default(), ); } #[test] fn dont_flag_allow_pronoun_to() { assert_no_lints( "It would be really great to allow me to enter body data using multipart form", AllowTo::default(), ); } #[test] fn dont_flag_allow_noun_to() { assert_no_lints( "Allows users to export SMART statistics from any connected hard drive", AllowTo::default(), ); } #[test] fn dont_flag_allow_np_to() { assert_no_lints( "This vulnerability allows an authenticated attacker to infer data from the database by measuring response times", AllowTo::default(), ); } } ================================================ FILE: harper-core/src/linting/am_in_the_morning.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Span, Token, TokenStringExt, expr::{Expr, FixedPhrase, LongestMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct AmInTheMorning { expr: SequenceExpr, } impl Default for AmInTheMorning { fn default() -> Self { let am = WordSet::new(&["am", "a.m."]); let pm = WordSet::new(&["pm", "p.m."]); let maybe_ws_am = LongestMatchOf::new(vec![ Box::new(SequenceExpr::with(am.clone())), Box::new(SequenceExpr::whitespace().then(am)), ]); let maybe_ws_pm = LongestMatchOf::new(vec![ Box::new(SequenceExpr::with(pm.clone())), Box::new(SequenceExpr::whitespace().then(pm)), ]); let ws_in_periods = SequenceExpr::fixed_phrase(" in the ").then_word_set(&[ "morning", "afternoon", "evening", "night", ]); let ws_at_periods = FixedPhrase::from_phrase(" at night"); let expr = SequenceExpr::any_of(vec![Box::new(maybe_ws_am), Box::new(maybe_ws_pm)]) .then_any_of(vec![Box::new(ws_in_periods), Box::new(ws_at_periods)]); Self { expr } } } impl ExprLinter for AmInTheMorning { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let all_after_number_span = toks[0..].span()?; let am_pm_idx = if toks[0].kind.is_whitespace() { 1 } else { 0 }; let maybe_ws_am_pm_span = Span::new(toks[0].span.start, toks[am_pm_idx].span.end); let sugg_am_pm_only = Suggestion::ReplaceWith(maybe_ws_am_pm_span.get_content(src).to_vec()); let ws_prep_period = Span::new(toks[am_pm_idx + 1].span.start, all_after_number_span.end); let sugg_prep_period_only = Suggestion::ReplaceWith(ws_prep_period.get_content(src).to_vec()); Some(Lint { span: all_after_number_span, lint_kind: LintKind::Redundancy, suggestions: vec![sugg_am_pm_only, sugg_prep_period_only], message: "The time period is redundant because it repeats what's already specified by the AM/PM indicator.".to_owned(), priority: 50, }) } fn description(&self) -> &'static str { "Finds redundant am/pm indicators used together with time periods such as 'in the morning' or 'at night'." } } #[cfg(test)] mod tests { use super::AmInTheMorning; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn flag_at_4am_in_the_morning() { assert_lint_count("At 4am in the morning", AmInTheMorning::default(), 1); } #[test] fn fix_at_4am_in_the_morning() { assert_suggestion_result("At 4am in the morning", AmInTheMorning::default(), "At 4am"); } #[test] fn flag_at_4_am_in_the_morning() { assert_lint_count("At 4 am in the morning", AmInTheMorning::default(), 1); } #[test] fn fix_at_4_am_in_the_morning() { assert_suggestion_result( "At 4 am in the morning", AmInTheMorning::default(), "At 4 am", ); } #[test] fn flag_at_4am_in_the_morning_caps() { assert_lint_count("At 4AM in the morning", AmInTheMorning::default(), 1); } #[test] fn fix_at_4am_in_the_morning_caps() { assert_suggestion_result("At 4AM in the morning", AmInTheMorning::default(), "At 4AM"); } #[test] fn flag_at_4_am_in_the_morning_caps() { assert_lint_count("At 4 AM in the morning", AmInTheMorning::default(), 1); } #[test] fn fix_at_4_am_in_the_morning_caps() { assert_suggestion_result( "At 4 AM in the morning", AmInTheMorning::default(), "At 4 AM", ); } #[test] fn at_4_a_dot_m_dot_in_the_morning() { assert_lint_count("At 4 a.m. in the morning", AmInTheMorning::default(), 1) } #[test] fn fix_at_4_a_dot_m_dot_in_the_morning() { assert_suggestion_result( "At 4 a.m. in the morning", AmInTheMorning::default(), "At 4 a.m.", ); } // real-world examples #[test] fn fix_real_world_1_am_in_the_morning() { assert_suggestion_result( "I wrote this whole program as a joke, at 1 AM in the morning. Nothing else to say.", AmInTheMorning::default(), "I wrote this whole program as a joke, at 1 AM. Nothing else to say.", ); assert_suggestion_result( "I wrote this whole program as a joke, at 1 AM in the morning. Nothing else to say.", AmInTheMorning::default(), "I wrote this whole program as a joke, at 1 in the morning. Nothing else to say.", ); } #[test] fn fix_real_world_3am_in_the_morning() { assert_suggestion_result( "Luckily I was at home, but it was not fun at 3am in the morning.", AmInTheMorning::default(), "Luckily I was at home, but it was not fun at 3am.", ); assert_suggestion_result( "Luckily I was at home, but it was not fun at 3am in the morning.", AmInTheMorning::default(), "Luckily I was at home, but it was not fun at 3 in the morning.", ); } #[test] fn fix_real_world_3am_at_night() { assert_suggestion_result( "If I want to run my script or some cron job at 3am at night, it seems to be not possible after macOS is in sleep mode.", AmInTheMorning::default(), "If I want to run my script or some cron job at 3am, it seems to be not possible after macOS is in sleep mode.", ); assert_suggestion_result( "If I want to run my script or some cron job at 3am at night, it seems to be not possible after macOS is in sleep mode.", AmInTheMorning::default(), "If I want to run my script or some cron job at 3 at night, it seems to be not possible after macOS is in sleep mode.", ); } #[test] fn fix_real_world_9pm_at_night() { assert_suggestion_result( "The servers stop at 9PM at night and starts again at 9AM.", AmInTheMorning::default(), "The servers stop at 9PM and starts again at 9AM.", ); assert_suggestion_result( "The servers stop at 9PM at night and starts again at 9AM.", AmInTheMorning::default(), "The servers stop at 9 at night and starts again at 9AM.", ); } #[test] fn fix_real_world_3_30_am_in_the_morning() { assert_suggestion_result( "Hello I can't believe my neighbor had the nerve to knock on my door at 3:30 AM in the morning.", AmInTheMorning::default(), "Hello I can't believe my neighbor had the nerve to knock on my door at 3:30 AM.", ); assert_suggestion_result( "Hello I can't believe my neighbor had the nerve to knock on my door at 3:30 AM in the morning.", AmInTheMorning::default(), "Hello I can't believe my neighbor had the nerve to knock on my door at 3:30 in the morning.", ); } #[test] fn fix_real_world_5_pm_in_the_afternoon_caps_dots() { assert_suggestion_result( "Style issues get a blue marker: It's 5 P.M. in the afternoon.", AmInTheMorning::default(), "Style issues get a blue marker: It's 5 P.M..", ); assert_suggestion_result( "Style issues get a blue marker: It's 5 P.M. in the afternoon.", AmInTheMorning::default(), "Style issues get a blue marker: It's 5 in the afternoon.", ); } #[test] fn fix_real_world_5_pm_in_the_afternoon_caps() { assert_suggestion_result( "Its a impressively versatile tool if youd like to tell a colleague from over sea's about at 5 PM in the afternoon on Monday, 27 May 2007.", AmInTheMorning::default(), "Its a impressively versatile tool if youd like to tell a colleague from over sea's about at 5 PM on Monday, 27 May 2007.", ); assert_suggestion_result( "Its a impressively versatile tool if youd like to tell a colleague from over sea's about at 5 PM in the afternoon on Monday, 27 May 2007.", AmInTheMorning::default(), "Its a impressively versatile tool if youd like to tell a colleague from over sea's about at 5 in the afternoon on Monday, 27 May 2007.", ); } #[test] fn fix_real_world_6_pm_in_the_evening() { assert_suggestion_result( "I am in China and it is six pm in the evening.", AmInTheMorning::default(), "I am in China and it is six pm.", ); assert_suggestion_result( "I am in China and it is six pm in the evening.", AmInTheMorning::default(), "I am in China and it is six in the evening.", ); } #[test] fn fix_real_world_4_am_in_the_morning() { assert_suggestion_result( "On the second application, we normally have the 503 between 1am and 4 am in the morning, almost every day.", AmInTheMorning::default(), "On the second application, we normally have the 503 between 1am and 4 am, almost every day.", ); assert_suggestion_result( "On the second application, we normally have the 503 between 1am and 4 am in the morning, almost every day.", AmInTheMorning::default(), "On the second application, we normally have the 503 between 1am and 4 in the morning, almost every day.", ); } } ================================================ FILE: harper-core/src/linting/amounts_for.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt, patterns::WordSet}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct AmountsFor { expr: FirstMatchOf, } impl Default for AmountsFor { fn default() -> Self { let singular_context = WordSet::new(&["that", "which", "it", "this"]); let singular_pattern = SequenceExpr::with(singular_context) .then_whitespace() .then_fixed_phrase("amounts for"); let singular_context = WordSet::new(&[ "they", "can", "could", "may", "might", "must", "should", "will", "would", ]); let plural_pattern = SequenceExpr::with(singular_context) .then_whitespace() .then_fixed_phrase("amount for"); Self { expr: FirstMatchOf::new(vec![Box::new(singular_pattern), Box::new(plural_pattern)]), } } } impl ExprLinter for AmountsFor { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let content = toks.span()?.get_content_string(src).to_lowercase(); if content.ends_with("amounts for") { let span = toks[2..5].span()?; return Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case( "amounts to".chars().collect(), span.get_content(src), ), Suggestion::replace_with_match_case( "accounts for".chars().collect(), span.get_content(src), ), ], message: "`amounts for` is not idiomatic English. You probably meant `amounts to` or `accounts for`.".to_owned(), priority: 63, }); } if content.ends_with("amount for") { let span = toks[2..5].span()?; return Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case( "amount to".chars().collect(), span.get_content(src), ), Suggestion::replace_with_match_case( "account for".chars().collect(), span.get_content(src), ), ], message: "`amounts for` is not idiomatic English. You probably meant `amounts to` or `accounts for`.".to_owned(), priority: 63, }); } None } fn description(&self) -> &str { "Corrects `amounts for` to either `amounts to` or `accounts for`" } } #[cfg(test)] mod tests { use super::AmountsFor; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_that_amounts_for_to_amounts_to_entire_value() { assert_suggestion_result( "Skyler stated the car wash is worth close to $800k, that amounts for the entire value of the company", AmountsFor::default(), "Skyler stated the car wash is worth close to $800k, that amounts to the entire value of the company", ); } #[test] fn corrects_that_amounts_for_to_amounts_to_percent() { assert_suggestion_result( "Together, that amounts for 1157 calls or 60% of the failures.", AmountsFor::default(), "Together, that amounts to 1157 calls or 60% of the failures.", ); } #[test] fn corrects_that_amounts_for_to_accounts_for_setting_up() { assert_suggestion_result( "One solution to this would be to have separate controllers but the amount of code that amounts for setting up, processing and calling", AmountsFor::default(), "One solution to this would be to have separate controllers but the amount of code that accounts for setting up, processing and calling", ); } #[test] fn corrects_which_amounts_for_to_accounts_for_16k() { assert_suggestion_result( "It has an offset of 0xC000 which amounts for the 16k.", AmountsFor::default(), "It has an offset of 0xC000 which accounts for the 16k.", ); } #[test] fn corrects_this_amounts_for_to_accounts_for_large_part() { assert_suggestion_result( "I'm pretty sure that this amounts for a large part of the speed I gained when typing, in addition to touch-typing.", AmountsFor::default(), "I'm pretty sure that this accounts for a large part of the speed I gained when typing, in addition to touch-typing.", ); } #[test] fn corrects_they_amount_for_to_amount_to_16kb() { assert_suggestion_result( "it is obvious that the messages are being held \"somewhere\" until they amount for 16kB and then the whole lot come at once.", AmountsFor::default(), "it is obvious that the messages are being held \"somewhere\" until they amount to 16kB and then the whole lot come at once.", ); } #[test] fn corrects_which_amounts_for_to_amounts_to_10_minutes() { assert_suggestion_result( "set a small TTL for your hostname (like 600 which amounts for 10 minutes).", AmountsFor::default(), "set a small TTL for your hostname (like 600 which amounts to 10 minutes).", ); } #[test] fn corrects_it_amounts_for_to_amounts_to_redefinition() { assert_suggestion_result( "included for convenience to get a Lorentz invariant result (it amounts for a redefinition of ap).", AmountsFor::default(), "included for convenience to get a Lorentz invariant result (it amounts to a redefinition of ap).", ); } #[test] fn corrects_they_amount_for_to_amount_to_nothing() { assert_suggestion_result( "Matter and antimatter are spread throughout the Universe, and in total, they amount for nothing", AmountsFor::default(), "Matter and antimatter are spread throughout the Universe, and in total, they amount to nothing", ); } #[test] fn would_amount_for_to_amount_to_api_requests() { assert_suggestion_result( "10% of 6,782,091 would amount for 678,209 API requests", AmountsFor::default(), "10% of 6,782,091 would amount to 678,209 API requests", ); } #[test] fn will_amount_for_to_amount_to_relationships() { assert_suggestion_result( "Consider this statistic from Gartner, that artificial intelligence will amount for 85% of customer relationships by 2020.", AmountsFor::default(), "Consider this statistic from Gartner, that artificial intelligence will amount to 85% of customer relationships by 2020.", ); } #[test] fn should_amount_for_to_amount_to_half_pack() { assert_suggestion_result( "It doesn't seem realistic that this single elite should amount for half the pack", AmountsFor::default(), "It doesn't seem realistic that this single elite should amount to half the pack", ); } #[test] fn can_amount_for_to_amount_to_draw_calls() { assert_suggestion_result( "That can amount for a lot of draw calls and work for the engine to cull. ", AmountsFor::default(), "That can amount to a lot of draw calls and work for the engine to cull. ", ); } } ================================================ FILE: harper-core/src/linting/an_a.rs ================================================ use itertools::Itertools; use crate::indefinite_article::{InitialSound, starts_with_vowel}; use crate::linting::{Lint, LintKind, Linter, Suggestion}; use crate::{Dialect, Document, TokenStringExt}; #[derive(Debug)] pub struct AnA { dialect: Dialect, } impl AnA { pub fn new(dialect: Dialect) -> Self { Self { dialect } } } impl Linter for AnA { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for chunk in document.iter_chunks() { for (first_idx, second_idx) in chunk.iter_word_indices().tuple_windows() { // [`TokenKind::Unlintable`] might have semantic meaning. if chunk[first_idx..second_idx].iter_unlintables().count() > 0 || chunk[first_idx + 1..second_idx] .iter_word_like_indices() .count() > 0 { continue; } let first = &chunk[first_idx]; let second = &chunk[second_idx]; let chars_first = document.get_span_content(&first.span); let chars_second = document.get_span_content(&second.span); // Break the second word on hyphens for this lint. // Example: "An ML-based" is an acceptable noun phrase. let chars_second = chars_second .split(|c| !c.is_alphanumeric()) .next() .unwrap_or(chars_second); let is_a_an = match chars_first { ['a'] => Some(true), ['A'] => Some(true), ['a', 'n'] => Some(false), ['A', 'n'] => Some(false), _ => None, }; let Some(a_an) = is_a_an else { continue; }; let should_be_a_an = match starts_with_vowel(chars_second, self.dialect) .expect("No empty word tokens") { InitialSound::Vowel => false, InitialSound::Consonant => true, InitialSound::Either => return lints, }; if a_an != should_be_a_an { let replacement = match a_an { true => vec!['a', 'n'], false => vec!['a'], }; lints.push(Lint { span: first.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( replacement, chars_first, )], message: "Incorrect indefinite article.".to_string(), priority: 31, }) } } } lints } fn description(&self) -> &'static str { "A rule that looks for incorrect indefinite articles. For example, `this is an mule` would be flagged as incorrect." } } #[cfg(test)] mod tests { use super::AnA; use crate::Dialect; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn detects_html_as_vowel() { assert_lint_count("Here is a HTML document.", AnA::new(Dialect::American), 1); } #[test] fn detects_llm_as_vowel() { assert_lint_count("Here is a LLM document.", AnA::new(Dialect::American), 1); } #[test] fn detects_llm_hyphen_as_vowel() { assert_lint_count( "Here is a LLM-based system.", AnA::new(Dialect::American), 1, ); } #[test] fn detects_euler_as_vowel() { assert_lint_count("This is an Euler brick.", AnA::new(Dialect::American), 0); assert_lint_count( "The graph has an Eulerian tour.", AnA::new(Dialect::American), 0, ); } #[test] fn capitalized_fourier() { assert_lint_count( "Then, perform a Fourier transform.", AnA::new(Dialect::American), 0, ); } #[test] fn once_over() { assert_lint_count("give this a once-over.", AnA::new(Dialect::American), 0); } #[test] fn issue_196() { assert_lint_count( "This is formatted as an `ext4` file system.", AnA::new(Dialect::American), 0, ); } #[test] fn allows_lowercase_vowels() { assert_lint_count("not an error", AnA::new(Dialect::American), 0); } #[test] fn allows_lowercase_consonants() { assert_lint_count("not a crash", AnA::new(Dialect::American), 0); } #[test] fn disallows_lowercase_vowels() { assert_lint_count("not a error", AnA::new(Dialect::American), 1); } #[test] fn disallows_lowercase_consonants() { assert_lint_count("not an crash", AnA::new(Dialect::American), 1); } #[test] fn allows_uppercase_vowels() { assert_lint_count("not an Error", AnA::new(Dialect::American), 0); } #[test] fn allows_uppercase_consonants() { assert_lint_count("not a Crash", AnA::new(Dialect::American), 0); } #[test] fn disallows_uppercase_vowels() { assert_lint_count("not a Error", AnA::new(Dialect::American), 1); } #[test] fn disallows_uppercase_consonants() { assert_lint_count("not an Crash", AnA::new(Dialect::American), 1); } #[test] fn disallows_a_interface() { assert_lint_count( "A interface for an object that can perform linting actions.", AnA::new(Dialect::American), 1, ); } #[test] fn allow_issue_751() { assert_lint_count( "He got a 52% approval rating.", AnA::new(Dialect::American), 0, ); } #[test] fn allow_an_mp_and_an_mp3() { assert_lint_count("an MP and an MP3?", AnA::new(Dialect::American), 0); } #[test] fn disallow_a_mp_and_a_mp3() { assert_lint_count("a MP and a MP3?", AnA::new(Dialect::American), 2); } #[test] fn recognize_acronyms() { // a assert_lint_count("using a MAC address", AnA::new(Dialect::American), 0); assert_lint_count("a NASA spacecraft", AnA::new(Dialect::American), 0); assert_lint_count("a NAT", AnA::new(Dialect::American), 0); assert_lint_count("a REST API", AnA::new(Dialect::American), 0); assert_lint_count("a LIBERO", AnA::new(Dialect::American), 0); assert_lint_count("a README", AnA::new(Dialect::American), 0); assert_lint_count("a LAN", AnA::new(Dialect::American), 0); // an assert_lint_count("an RA message", AnA::new(Dialect::American), 0); assert_lint_count("an SI unit", AnA::new(Dialect::American), 0); assert_lint_count( "he is an MA of both Oxford and Cambridge", AnA::new(Dialect::American), 0, ); assert_lint_count( "in an FA Cup 6th Round match", AnA::new(Dialect::American), 0, ); assert_lint_count("a AM transmitter", AnA::new(Dialect::American), 1); } #[test] fn dont_misrecognize_as_acronym() { assert_lint_count("a UPD connection", AnA::new(Dialect::American), 0); assert_lint_count("a UPB device", AnA::new(Dialect::American), 0); assert_lint_count("a UPS or power device", AnA::new(Dialect::American), 0); assert_lint_count("a USB 2.0 port", AnA::new(Dialect::American), 0); assert_lint_count("an HEVC HLS stream", AnA::new(Dialect::American), 0); } #[test] fn a_udev() { assert_lint_count("a udev rule", AnA::new(Dialect::American), 0); } #[test] fn an_mdns() { assert_lint_count("an mDNS tool", AnA::new(Dialect::American), 0); } #[test] fn an_rflink() { assert_lint_count("an RFLink device", AnA::new(Dialect::American), 0); } #[test] fn an_ffmpeg() { assert_lint_count( "an FFmpeg-compatible input file", AnA::new(Dialect::American), 0, ); } #[test] fn a_honey() { assert_lint_count("a Honeywell alarm panel", AnA::new(Dialect::American), 0); } #[test] fn an_onedrive() { assert_lint_count("a OneDrive folder", AnA::new(Dialect::American), 0); } #[test] fn a_ubiquiti() { assert_lint_count( "a Ubiquiti UniFi Network application", AnA::new(Dialect::American), 0, ); } #[test] fn an_honest() { assert_lint_count("an honest mistake", AnA::new(Dialect::American), 0); } #[test] fn dont_flag_an_herb_for_american() { assert_lint_count("an herb", AnA::new(Dialect::American), 0); } #[test] fn dont_flag_a_herb_for_british() { assert_lint_count("a herb", AnA::new(Dialect::British), 0); } #[test] fn correct_an_herb_for_australian() { assert_suggestion_result("an herb", AnA::new(Dialect::Australian), "a herb"); } #[test] fn correct_a_herb_for_canadian() { assert_suggestion_result("a herb", AnA::new(Dialect::Canadian), "an herb"); } #[test] fn dont_flag_a_sql() { assert_lint_count("a SQL query", AnA::new(Dialect::American), 0); } #[test] fn dont_flag_an_sql() { assert_lint_count("an SQL query", AnA::new(Dialect::Australian), 0); } #[test] fn allow_an_and_a_for_led_2550() { assert_lint_count("an LED", AnA::new(Dialect::American), 0); assert_lint_count("a LED", AnA::new(Dialect::American), 0); } } ================================================ FILE: harper-core/src/linting/and_in.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; pub struct AndIn { expr: SequenceExpr, } impl Default for AndIn { fn default() -> Self { Self { expr: SequenceExpr::fixed_phrase("an in").then_optional_hyphen(), } } } impl ExprLinter for AndIn { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() != 3 { return None; } Some(Lint { span: toks[0].span, lint_kind: LintKind::Typo, message: "Did you mean `and in`?".to_string(), suggestions: vec![Suggestion::replace_with_match_case( ['a', 'n', 'd'].to_vec(), toks[2].span.get_content(src), )], ..Default::default() }) } fn description(&self) -> &str { "Fixes the incorrect phrase `an in` to `and in` for proper conjunction usage." } } #[cfg(test)] mod tests { use super::AndIn; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn dont_flag_an_in_house() { assert_no_lints( "for several years as an in-house engine, used to ...", AndIn::default(), ); } #[test] fn dont_flag_an_in_memory() { assert_no_lints( "including an in-memory real-time Vector Index,", AndIn::default(), ); } #[test] fn dont_flag_an_in_the_moment() { assert_no_lints( "His words serve as an in-the-moment explanation for what had happened.", AndIn::default(), ); } #[test] fn fix_an_in_to_and_in() { assert_suggestion_result( "This is an expensive operation, so try to only do it at startup an in tests.", AndIn::default(), "This is an expensive operation, so try to only do it at startup and in tests.", ); } #[test] #[ignore = "This is a known false positive - `an in` can be valid in some contexts"] fn dont_flag_an_in_with_company() { assert_no_lints( "His parents got him an in with the company.", AndIn::default(), ); } } ================================================ FILE: harper-core/src/linting/and_the_like.rs ================================================ use crate::expr::{All, Expr, FixedPhrase, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, LintKind, Suggestion}; use crate::patterns::WordSet; use crate::token_string_ext::TokenStringExt; use crate::{Lint, Token}; pub struct AndTheLike { expr: All, } impl Default for AndTheLike { fn default() -> Self { Self { expr: All::new(vec![ Box::new( // All known variants seen in the wild, good and bad SequenceExpr::word_set(&["and", "or", "an"]) .t_ws() .then_optional(SequenceExpr::aco("the").t_ws()) .then_word_set(&["alike", "alikes", "like", "likes"]), ), Box::new(SequenceExpr::unless( SequenceExpr::word_set(&["and", "or"]) .t_ws() .then_any_of(vec![ // But not the correct variants Box::new(FixedPhrase::from_phrase("the like")), // And not the phrases that were coincidentally caught in the net Box::new(WordSet::new(&["like", "likes"])), ]), )), ]), } } } impl ExprLinter for AndTheLike { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let (conj, ws) = (&toks[0], &toks[1]); let conj = if conj.span.get_content(src)[0] == 'a' { "and" } else { "or" }; let corrected = format!("{}{}the like", conj, ws.span.get_content_string(src)); Some(Lint { span: toks.span()?, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( corrected.chars().collect(), toks.span()?.get_content(src), )], message: "If you intended the idiom meaning `similar things`, the correct form is with `the like`.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Corrects mistakes in `and the like` and `or the like`." } } #[cfg(test)] mod tests { use super::AndTheLike; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn dont_flag_and_the_like() { assert_no_lints( "The color of brackets and the like appears to be incorrect ...", AndTheLike::default(), ); } #[test] fn dont_flag_or_the_like() { assert_no_lints( "Does WCAG apply only to English (or the like), or does it aim to cover all languages?", AndTheLike::default(), ); } #[test] fn flag_an_the_likes() { assert_suggestion_result( "Allow jsSourceDir (an the likes) to refer to the project root. #5", AndTheLike::default(), "Allow jsSourceDir (and the like) to refer to the project root. #5", ); } #[test] fn flag_and_alike() { assert_suggestion_result( "Latest release breaks FilePicker and alike", AndTheLike::default(), "Latest release breaks FilePicker and the like", ); } #[test] fn flag_and_alikes() { assert_suggestion_result( "Compiled functions (and alikes) need to keep references for their module objects", AndTheLike::default(), "Compiled functions (and the like) need to keep references for their module objects", ); } #[test] fn flag_and_the_alike() { assert_suggestion_result( "Suggestions, comments and the alike are welcome on http://waa.ai/4xtC", AndTheLike::default(), "Suggestions, comments and the like are welcome on http://waa.ai/4xtC", ); } #[test] fn flag_and_the_likes() { assert_suggestion_result( "Don't report \"expected semicolon or line break\", \"expected comma\" and the likes at every token boundary", AndTheLike::default(), "Don't report \"expected semicolon or line break\", \"expected comma\" and the like at every token boundary", ); } #[test] fn flag_or_alike() { assert_suggestion_result( "enable biome extension to \"monitor or alike\" the workspace.", AndTheLike::default(), "enable biome extension to \"monitor or the like\" the workspace.", ); } #[test] fn flag_or_alikes() { assert_suggestion_result( "Persistent Compiler Caching with ccache or alikes", AndTheLike::default(), "Persistent Compiler Caching with ccache or the like", ); } #[test] fn flag_or_the_likes() { assert_suggestion_result( "Description of the problem: Implement aria2c or the likes to resume partial downloads.", AndTheLike::default(), "Description of the problem: Implement aria2c or the like to resume partial downloads.", ); } } ================================================ FILE: harper-core/src/linting/another_thing_coming.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; /// Both `another thing coming` and `another think coming` are correct, but `another think coming` is more common. pub struct AnotherThingComing { expr: SequenceExpr, } impl Default for AnotherThingComing { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["had", "has", "have", "got"]) .then_fixed_phrase(" another think coming"), } } } impl ExprLinter for AnotherThingComing { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { Some(Lint { span: toks[2..].span()?, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "another thing coming", toks.span()?.get_content(src), )], message: "Corrects `another think coming` to `another thing coming`".to_string(), priority: 63, }) } fn description(&self) -> &str { "Though `another think coming` is the original phrase, `another thing coming` is now more common." } } #[cfg(test)] pub mod tests { use super::AnotherThingComing; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_have_another_think_coming() { assert_suggestion_result( "If you think that, you have another think coming, English.", AnotherThingComing::default(), "If you think that, you have another thing coming, English.", ); } #[test] fn fix_has_another_think_coming() { assert_suggestion_result( "If the wage earner thinks that he will obtain anything from either of the old parties he has another think coming.", AnotherThingComing::default(), "If the wage earner thinks that he will obtain anything from either of the old parties he has another thing coming.", ); } #[test] #[ignore = "A lettercase bug results in 'another thiNG COMing.'"] fn fix_got_another_think_coming() { assert_suggestion_result( "The correct phrase is, “You've got another THINK coming.”", AnotherThingComing::default(), "The correct phrase is, “You've got another THING coming.”", ); } #[test] fn fix_had_another_think_coming() { assert_suggestion_result( "Guess I had another think coming.", AnotherThingComing::default(), "Guess I had another thing coming.", ); } } ================================================ FILE: harper-core/src/linting/another_think_coming.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; /// Both `another thing coming` and `another think coming` are correct, but `another think coming` is the original. pub struct AnotherThinkComing { expr: SequenceExpr, } impl Default for AnotherThinkComing { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["had", "has", "have", "got"]) .then_fixed_phrase(" another thing coming"), } } } impl ExprLinter for AnotherThinkComing { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { Some(Lint { span: toks[2..].span()?, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "another think coming", toks.span()?.get_content(src), )], message: "Corrects `another thing coming` to `another think coming`".to_string(), priority: 63, }) } fn description(&self) -> &str { "Though `another thing coming` is now more common, `another think coming` is the original phrase." } } #[cfg(test)] pub mod tests { use super::AnotherThinkComing; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_got_another_thing_coming() { assert_suggestion_result( "If Microsoft thinks my Team and I are going to REINSTALL Windows fresh on over 1500 PC's they've got another thing coming!!", AnotherThinkComing::default(), "If Microsoft thinks my Team and I are going to REINSTALL Windows fresh on over 1500 PC's they've got another think coming!!", ); } #[test] fn fix_has_another_thing_coming() { assert_suggestion_result( "Anyone who thinks it's easy to raise a child has another thing coming.", AnotherThinkComing::default(), "Anyone who thinks it's easy to raise a child has another think coming.", ); } #[test] fn fix_have_another_thing_coming() { assert_suggestion_result( "And if you think they're predictable, you have another thing coming still.", AnotherThinkComing::default(), "And if you think they're predictable, you have another think coming still.", ); } #[test] fn fix_had_another_thing_coming() { assert_suggestion_result( "And wouldn't you know it I had another thing coming.", AnotherThinkComing::default(), "And wouldn't you know it I had another think coming.", ); } } ================================================ FILE: harper-core/src/linting/apart_from.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use super::{ExprLinter, Lint, LintKind, Suggestion}; pub struct ApartFrom { expr: SequenceExpr, } impl Default for ApartFrom { fn default() -> Self { let expr = SequenceExpr::any_capitalization_of("apart") .t_ws() .then_any_capitalization_of("form"); Self { expr } } } impl ExprLinter for ApartFrom { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.last()?.span; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "from", span.get_content(source), )], message: "Use `from` to spell `apart from`.".to_owned(), priority: 50, }) } fn description(&self) -> &'static str { "Flags the misspelling `apart form` and suggests `apart from`." } } #[cfg(test)] mod tests { use super::ApartFrom; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_basic_typo() { assert_suggestion_result( "Christianity was set apart form other religions.", ApartFrom::default(), "Christianity was set apart from other religions.", ); } #[test] fn corrects_title_case() { assert_suggestion_result( "Apart Form these files, everything uploaded fine.", ApartFrom::default(), "Apart From these files, everything uploaded fine.", ); } #[test] fn corrects_all_caps() { assert_suggestion_result( "APART FORM THE REST OF THE FIELD.", ApartFrom::default(), "APART FROM THE REST OF THE FIELD.", ); } #[test] fn corrects_with_comma() { assert_suggestion_result( "It was apart form, not apart from, the original plan.", ApartFrom::default(), "It was apart from, not apart from, the original plan.", ); } #[test] fn corrects_with_newline() { assert_suggestion_result( "They stood apart\nform everyone else at the rally.", ApartFrom::default(), "They stood apart\nfrom everyone else at the rally.", ); } #[test] fn corrects_extra_spacing() { assert_suggestion_result( "We keep the archive apart form public assets.", ApartFrom::default(), "We keep the archive apart from public assets.", ); } #[test] fn allows_correct_phrase() { assert_lint_count( "Lebanon's freedoms set it apart from other Arab states.", ApartFrom::default(), 0, ); } #[test] fn ignores_hyphenated() { assert_lint_count( "Their apart-form design wasn’t what we needed.", ApartFrom::default(), 0, ); } #[test] fn ignores_split_by_comma() { assert_lint_count( "They stood apart, form lines when asked.", ApartFrom::default(), 0, ); } #[test] fn ignores_unrelated_form_usage() { assert_lint_count( "The form was kept apart to dry after printing.", ApartFrom::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/ask_no_preposition.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Span, Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct AskNoPreposition { expr: SequenceExpr, } impl Default for AskNoPreposition { fn default() -> Self { let verbs = WordSet::new(&[ "ask", "asks", "asked", "asking", "tell", "tells", "told", "telling", ]); let objs = WordSet::new(&["me", "you", "him", "her", "it", "us", "them", "one"]); let pattern = SequenceExpr::with(verbs) .then_whitespace() .t_aco("to") .then_whitespace() .then(objs); Self { expr: pattern } } } impl ExprLinter for AskNoPreposition { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() < 5 { return None; } let verb = toks[0].span.get_content_string(src).to_lowercase(); let span = Span::new(toks[2].span.start, toks[3].span.end); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(Vec::new())], message: format!( "The verb `to {verb} someone` should not be preceded by the preposition `to`." ), priority: 63, }) } fn description(&self) -> &str { "Identifies sequences like `ask to us` or `tell to him` and recommends removing the superfluous “to”." } } #[cfg(test)] mod tests { use super::AskNoPreposition; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn flags_ask() { assert_suggestion_result( "Nora asked to us about the concert lineup.", AskNoPreposition::default(), "Nora asked us about the concert lineup.", ); } #[test] fn flags_ask_all_caps() { assert_suggestion_result( "NORA ASKED TO US ABOUT THE CONCERT LINEUP.", AskNoPreposition::default(), "NORA ASKED US ABOUT THE CONCERT LINEUP.", ); } #[test] fn flags_tell() { assert_suggestion_result( "Please tell to him the results promptly.", AskNoPreposition::default(), "Please tell him the results promptly.", ); } #[test] fn ignores_correct_usage() { assert_lint_count( "She asked her mentor a difficult question.", AskNoPreposition::default(), 0, ); } #[test] fn flags_ask_us() { assert_suggestion_result( "Can you ask to us for directions?", AskNoPreposition::default(), "Can you ask us for directions?", ); } #[test] fn flags_asks_him() { assert_suggestion_result( "Julia asks to him every morning about the report.", AskNoPreposition::default(), "Julia asks him every morning about the report.", ); } #[test] fn flags_asked_me() { assert_suggestion_result( "They asked to me why I left early.", AskNoPreposition::default(), "They asked me why I left early.", ); } #[test] fn flags_told_one() { assert_suggestion_result( "The guide told to one the secret path.", AskNoPreposition::default(), "The guide told one the secret path.", ); } #[test] fn flags_telling_it() { assert_suggestion_result( "She is telling to it with gentle words.", AskNoPreposition::default(), "She is telling it with gentle words.", ); } #[test] fn flags_tells_them() { assert_suggestion_result( "He tells to them stories at night.", AskNoPreposition::default(), "He tells them stories at night.", ); } #[test] fn flags_telling_him() { assert_suggestion_result( "I was telling to him the latest news.", AskNoPreposition::default(), "I was telling him the latest news.", ); } #[test] fn flags_asking_you() { assert_suggestion_result( "Someone is asking to you for help.", AskNoPreposition::default(), "Someone is asking you for help.", ); } #[test] fn ignores_ask_question() { assert_lint_count( "Ask her the question directly.", AskNoPreposition::default(), 0, ); } #[test] fn ignores_told_to_leave() { assert_lint_count( "He was told to leave immediately.", AskNoPreposition::default(), 0, ); } #[test] fn ignores_tell_us() { assert_lint_count("Please tell us your name.", AskNoPreposition::default(), 0); } #[test] fn ignores_ask_about() { assert_lint_count( "They asked about the schedule.", AskNoPreposition::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/avoid_curses.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::{LintKind, Suggestion}; use super::{ExprLinter, Lint}; use crate::linting::expr_linter::Chunk; pub struct AvoidCurses { expr: SequenceExpr, } impl Default for AvoidCurses { fn default() -> Self { Self { expr: SequenceExpr::default().then_swear(), } } } impl ExprLinter for AvoidCurses { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() != 1 { return None; } let tok = &toks[0]; let span = tok.span; let bad_word_chars = span.get_content(src); let bad_word_str = span.get_content_string(src); let bad_word_norm = bad_word_str.to_lowercase(); // Define offensive morphemes which are common parts of multiple words // Each entry maps a morpheme to an optional censored version. const MORPHEMES: &[(&str, Option<&str>)] = &[ ("arse", None), ("ass", Some("a**")), ("cock", Some("c**k")), ("cunt", Some("c**t")), ("dick", Some("d**k")), ("fuck", Some("f**k")), ("piss", Some("p**s")), ("shit", Some("sh*t")), ("wank", Some("w**k")), ]; // Define offensive words and their possible replacements const WORDS: &[(&str, &[&str])] = &[ ("apeshit", &["crazy", "mad", "insane", "wild"]), ( "arse", &["bum", "buttocks", "backside", "bottom", "rump", "posterior"], ), ( "arses", &[ "bums", "buttocks", "backsides", "bottoms", "rumps", "posteriors", ], ), ("arsed", &["bothered"]), ("arsehole", &["bumhole"]), ( "ass", &[ "butt", "buttocks", "backside", "bottom", "rump", "posterior", "tuchus", "tush", ], ), ( "asses", &[ "butts", "buttocks", "backsides", "bottoms", "rumps", "posteriors", "tuchuses", "tushes", ], ), ("asshole", &["butthole"]), // batshit // birdshit ("bullshit", &["bullcrap", "bulldust", "lie", "lies"]), ("bullshitted", &["bullcrapped", "lied"]), ("bullshitting", &["bullcrapping", "lying"]), ("bullshitter", &["liar"]), // bullshittery ("chickenshit", &["gutless", "cowardly"]), ("cock", &["pee-pee", "willy", "penis", "phallus", "member"]), ( "cocks", &["pee-pees", "willies", "penises", "phalluses", "members"], ), // cocksucker ("cunt", &["vagina"]), ("cunts", &["vaginas"]), ("dick", &["pee-pee", "penis"]), ("dicks", &["pee-pees", "penises"]), ("dickhead", &["jerk", "idiot"]), ("dichheads", &["jerks", "idiots"]), // dipshit ("dumbass", &["idiot", "fool"]), ("dumbasses", &["idiots", "fools"]), ("fart", &["gas", "wind", "break wind"]), ("farts", &["gas", "wind", "breaks wind"]), ("farted", &["broke wind", "broken wind"]), ("farting", &["breaking wind"]), ("fuck", &["fudge", "screw", "damn", "hoot"]), ("fucks", &["screws"]), ("fucked", &["screwed"]), ("fucking", &["screwing"]), ("fucker", &["jerk"]), ("fuckers", &["jerks"]), // fuckhead ("horseshit", &["nonsense"]), // mindfuck // motherfucker // nigga // nigger ("piss", &["pee", "urine", "urinate"]), ("pisses", &["pees", "urinates"]), ("pissed", &["peed", "urinated"]), ("pissing", &["peeing", "urinating"]), ("pisser", &["toilet", "bathroom", "restroom", "washroom"]), // pissy ( "shit", &["crap", "poo", "poop", "feces", "dung", "damn", "hoot"], ), ("shits", &["craps", "poos", "poops"]), ("shitted", &["crapped", "pooed", "pooped"]), ("shitting", &["crapping", "pooing", "pooping"]), // shitcoin // shitfaced // shitfest // shithead ("shitless", &["witless"]), ( "shitload", &["crapload", "shedload", "shirtload", "load", "tons", "pile"], ), ( "shitloads", &[ "craploads", "shedloads", "shirtloads", "loads", "tons", "piles", ], ), // shitpost ("shitty", &["shirty", "crappy", "inferior"]), ("shittier", &["crappier", "shirtier"]), ("shittiest", &["crappiest", "shirtiest"]), ("tit", &["boob", "breast"]), ("tits", &["boobs", "breasts"]), ("titty", &["boob", "breast"]), ("titties", &["boobs", "breasts"]), ("turd", &["poo", "poop", "feces", "dung"]), ("turds", &["poos", "poops", "feces", "dung"]), ("twat", &["vagina"]), // wank ("wanker", &["jerk"]), // wanky ("whore", &["prostitute"]), ]; // Replace common morphemes with both specific censored versions and all-asterisk versions let morpheme_replacements: Vec = MORPHEMES .iter() .filter(|(m, _)| bad_word_norm.contains(m)) .flat_map(|(m, censored)| { let mut replacements = Vec::new(); // Add all-asterisk version for the censored morpheme only let asterisked = "*".repeat(m.len()); let asterisked_word = bad_word_norm.replace(m, &asterisked); replacements.push(asterisked_word); // Add specific censored version if it exists if let Some(c) = censored { let censored_word = bad_word_norm.replace(m, c); replacements.push(censored_word); } replacements }) .collect(); // Find all replacement suggestions for the bad word let word_replacements: Vec<&str> = WORDS .iter() .filter(|(bad, _)| *bad == bad_word_norm) .flat_map(|(_, suggestions)| suggestions.iter().copied()) .collect(); if morpheme_replacements.is_empty() && word_replacements.is_empty() { return None; } let m_suggestions: Vec = morpheme_replacements .into_iter() .map(|replacement| { Suggestion::replace_with_match_case(replacement.chars().collect(), bad_word_chars) }) .collect(); let w_suggestions: Vec = word_replacements .into_iter() .map(|replacement| { Suggestion::replace_with_match_case(replacement.chars().collect(), bad_word_chars) }) .collect(); let suggestions = m_suggestions.into_iter().chain(w_suggestions).collect(); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions, message: "Try to avoid offensive language.".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Flags offensive language and offers various ways to censor or replace with euphemisms." } } #[cfg(test)] mod tests { use super::AvoidCurses; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn detects_shit() { assert_lint_count( "He ate shit when he fell off the bike.", AvoidCurses::default(), 1, ); } #[test] fn fix_shit() { assert_suggestion_result("shit", AvoidCurses::default(), "crap") } #[test] fn fix_shit_titlecase() { assert_suggestion_result("Shit", AvoidCurses::default(), "Crap") } #[test] fn fix_shit_allcaps() { assert_suggestion_result("SHIT", AvoidCurses::default(), "CRAP") } #[test] fn fix_f_word_to_all_asterisks() { assert_suggestion_result( "fuck those fucking fuckers", AvoidCurses::default(), "**** those ****ing ****ers", ) } #[test] fn fix_shit_with_single_asterisk() { assert_suggestion_result("shit", AvoidCurses::default(), "sh*t") } #[test] fn fix_shite_all_caps_with_single_asterisk() { assert_suggestion_result("SHIT", AvoidCurses::default(), "SH*T") } } ================================================ FILE: harper-core/src/linting/back_in_the_day.rs ================================================ use crate::expr::Expr; use crate::expr::FixedPhrase; use crate::expr::LongestMatchOf; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::{ Lrc, Token, TokenStringExt, patterns::{Pattern, WordSet}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct BackInTheDay { expr: LongestMatchOf, // The trailing words that should tell us to ignore the rule. exceptions: Lrc, } impl Default for BackInTheDay { fn default() -> Self { let exceptions = Lrc::new(WordSet::new(&["before", "of", "when"])); let phrase = Lrc::new(FixedPhrase::from_phrase("back in the days")); let pattern = SequenceExpr::with(phrase.clone()) .then_whitespace() .then(exceptions.clone()) .or_longest(phrase); Self { expr: pattern, exceptions, } } } impl ExprLinter for BackInTheDay { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { if let Some(tail) = matched_tokens.get(8..) && self.exceptions.matches(tail, source).is_some() { return None; } let span = matched_tokens.span()?; let chars = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "back in the day".chars().collect(), chars, )], message: "Use the more idiomatic version of this phrase.".to_owned(), priority: 127, }) } fn description(&self) -> &'static str { "This linter flags instances of the nonstandard phrase `back in the days`. The correct, more accepted form is `back in the day`" } } #[cfg(test)] mod tests { use super::BackInTheDay; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn detects_gem_update_case() { assert_suggestion_result( "... has been resolved through a gem update back in the days", BackInTheDay::default(), "... has been resolved through a gem update back in the day", ); } #[test] fn detects_install_case() { assert_suggestion_result( "Back in the days we're used to install it directly from ...", BackInTheDay::default(), "Back in the day we're used to install it directly from ...", ); } #[test] fn detects_composer_json_case() { assert_suggestion_result( "Back in the days there was only composer.json and ...", BackInTheDay::default(), "Back in the day there was only composer.json and ...", ); } #[test] fn detects_version_release_case() { assert_suggestion_result( "... should have been released back in the days in a version 11", BackInTheDay::default(), "... should have been released back in the day in a version 11", ); } #[test] fn avoids_false_positive_springfox() { assert_lint_count( "Back in the days of SpringFox, there were several requests to ...", BackInTheDay::default(), 0, ); } #[test] fn avoids_false_positive_ie() { assert_lint_count( "Back in the days of IE, Powershell used to ...", BackInTheDay::default(), 0, ); } #[test] fn avoids_false_positive_code_usage() { assert_lint_count( "Back in the days when I had 100% of my code in ...", BackInTheDay::default(), 0, ); } #[test] fn catches_uppercase() { assert_lint_count( "Back in the days, we went for a walk.", BackInTheDay::default(), 1, ); } #[test] fn catches_lowercase() { assert_lint_count( "We used to go for walks back in the days.", BackInTheDay::default(), 1, ); } #[test] fn doesnt_catch_false_positive_of() { assert_lint_count( "Back in the days of CRTs, computers were expensive.", BackInTheDay::default(), 0, ); } #[test] fn doesnt_catch_false_positive_when() { assert_lint_count( "Back in the days when videogame arcades were popular.", BackInTheDay::default(), 0, ); } #[test] fn catches_comma_when() { assert_lint_count( "Back in the days, when we were children, we played outside.", BackInTheDay::default(), 1, ); } #[test] fn doesnt_catch_false_positive_before() { assert_lint_count( "Back in the days before laptops we had \"luggables\".", BackInTheDay::default(), 0, ); } #[test] fn catches_comma_before() { assert_lint_count( "Back in the days, before laptops.", BackInTheDay::default(), 1, ); } #[test] fn doesnt_catch_qualified_days() { assert_lint_count( "Back in the old days we did this by hand.", BackInTheDay::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/be_allowed.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct BeAllowed { expr: ExprMap, } impl Default for BeAllowed { fn default() -> Self { let mut map = ExprMap::default(); map.insert( SequenceExpr::default() .t_aco("will") .t_ws() .then_word_set(&["not"]) .t_ws() .t_aco("allowed") .t_ws() .t_aco("to") .t_ws() .then_verb(), 4, ); map.insert( SequenceExpr::default() .t_aco("won't") .t_ws() .t_aco("allowed") .t_ws() .t_aco("to") .t_ws() .then_verb(), 2, ); Self { expr: map } } } impl ExprLinter for BeAllowed { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let allowed_index = *self.expr.lookup(0, matched_tokens, source)?; let allowed_token = matched_tokens.get(allowed_index)?; let span = allowed_token.span; let template = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::replace_with_match_case( "be allowed".chars().collect(), template, )], message: "Add `be` so this reads `be allowed`.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Ensures the passive form uses `be allowed` after future negatives." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::BeAllowed; #[test] fn corrects_basic_sentence() { assert_suggestion_result( "You will not allowed to enter the lab.", BeAllowed::default(), "You will not be allowed to enter the lab.", ); } #[test] fn corrects_first_person_subject() { assert_suggestion_result( "I will not allowed to go tonight.", BeAllowed::default(), "I will not be allowed to go tonight.", ); } #[test] fn corrects_plural_subject() { assert_suggestion_result( "Students will not allowed to submit late work.", BeAllowed::default(), "Students will not be allowed to submit late work.", ); } #[test] fn corrects_with_intro_clause() { assert_suggestion_result( "Because of policy, workers will not allowed to take photos.", BeAllowed::default(), "Because of policy, workers will not be allowed to take photos.", ); } #[test] fn corrects_contracted_form() { assert_suggestion_result( "They won't allowed to park here during events.", BeAllowed::default(), "They won't be allowed to park here during events.", ); } #[test] fn corrects_all_caps() { assert_suggestion_result( "THEY WILL NOT ALLOWED TO ENTER.", BeAllowed::default(), "THEY WILL NOT BE ALLOWED TO ENTER.", ); } #[test] fn corrects_with_trailing_clause() { assert_suggestion_result( "Without a permit, guests will not allowed to stay overnight at the cabin.", BeAllowed::default(), "Without a permit, guests will not be allowed to stay overnight at the cabin.", ); } #[test] fn corrects_with_modal_context() { assert_suggestion_result( "Even with approval, contractors will not allowed to access production.", BeAllowed::default(), "Even with approval, contractors will not be allowed to access production.", ); } #[test] fn leaves_correct_phrase_untouched() { assert_suggestion_result( "They will not be allowed to park here during events.", BeAllowed::default(), "They will not be allowed to park here during events.", ); } #[test] fn leaves_other_verbs_alone() { assert_lint_count( "We will not allow visitors after nine.", BeAllowed::default(), 0, ); } #[test] fn leaves_similar_sequence_without_to() { assert_lint_count( "They won't be allowed to park here during events.", BeAllowed::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/be_worried.rs ================================================ use crate::{ CharStringExt, Token, expr::{All, Expr, OwnedExprExt, SequenceExpr}, linting::{ ExprLinter, Lint, LintKind, Suggestion, expr_linter::{Chunk, followed_by_hyphen, followed_by_word}, }, patterns::{Word, WordSet}, }; pub struct BeWorried { expr: All, } impl Default for BeWorried { fn default() -> Self { Self { expr: SequenceExpr::default() .then_any_of(vec![ Box::new( SequenceExpr::default() .then_subject_pronoun() .t_ws() .t_set(&["am", "are", "is", "was", "were"]), ), Box::new(WordSet::new(&[ "i'm", "we're", "you're", "he's", "she's", "they're", ])), ]) .t_ws() .t_aco("worry") .and_not(Word::new("it")), } } } impl ExprLinter for BeWorried { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let wtok = toks.last()?; if followed_by_hyphen(ctx) || followed_by_word(ctx, |w| { w.span .get_content(src) .eq_any_ignore_ascii_case_str(&["free", "warts"]) }) { return None; } Some(Lint { span: wtok.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "worried", wtok.span.get_content(src), )], message: "Use 'worried' instead of 'worry'.".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Detects incorrect use of 'be worry' instead of `be worried`." } } #[cfg(test)] mod tests { use crate::linting::tests::{ assert_good_and_bad_suggestions, assert_no_lints, assert_suggestion_result, }; use super::BeWorried; #[test] fn he_is() { assert_suggestion_result( "I guess he is worry about \" * user * \" tag.", BeWorried::default(), "I guess he is worried about \" * user * \" tag.", ); } #[test] fn he_was() { assert_suggestion_result( "So he was worry about her. Especially, when he got no response by calling her on her phone nor ranging her doorbell.", BeWorried::default(), "So he was worried about her. Especially, when he got no response by calling her on her phone nor ranging her doorbell.", ); } #[test] fn i_am() { assert_suggestion_result( "I didn't see any section dedicated to this so I am worry about:", BeWorried::default(), "I didn't see any section dedicated to this so I am worried about:", ); } #[test] fn i_was() { assert_suggestion_result( "So that's why I was worry.", BeWorried::default(), "So that's why I was worried.", ); } #[test] fn i_were() { assert_suggestion_result( "The only things that I were worry about is the data that could be lost using this deletion.", BeWorried::default(), "The only things that I were worried about is the data that could be lost using this deletion.", ); } #[test] fn they_are() { assert_suggestion_result( "at the same time they are worry about the price for the upgrade each 3 years", BeWorried::default(), "at the same time they are worried about the price for the upgrade each 3 years", ); } #[test] fn theyre_worry() { assert_suggestion_result( "Because they're worry this link is spam or they scare have to pay more money.", BeWorried::default(), "Because they're worried this link is spam or they scare have to pay more money.", ); } #[test] fn we_are() { assert_suggestion_result( "We are analised this and we are worry because when our platform go to market", BeWorried::default(), "We are analised this and we are worried because when our platform go to market", ); } #[test] fn were() { assert_suggestion_result( "We're worry about all kinds of minority representation in TV.", BeWorried::default(), "We're worried about all kinds of minority representation in TV.", ); } #[test] fn you_are() { assert_suggestion_result( "You are worry because we are not annotating view interface itself, right?", BeWorried::default(), "You are worried because we are not annotating view interface itself, right?", ); } #[test] fn youre() { assert_suggestion_result( "You're worry about memory usage and wanna be sure that a Sequence-class won't hold your activity against GC — declare this class as static", BeWorried::default(), "You're worried about memory usage and wanna be sure that a Sequence-class won't hold your activity against GC — declare this class as static", ); } #[test] fn dont_flag_it_is() { assert_no_lints( "Part of it is worry that my bosses will get angry and fire me.", BeWorried::default(), ); } #[test] fn dont_flag_it_was() { assert_no_lints( "Because what followed wasn't indifference, it was worry.", BeWorried::default(), ); } #[test] fn dont_flag_she_was_worry_free() { assert_no_lints("textFinally, she was worry-free.", BeWorried::default()); } #[test] fn dont_flag_theyre_worry_free() { assert_no_lints( "They don't pretend they're worry-free.", BeWorried::default(), ); } #[test] fn dont_flag_worry_warts() { assert_no_lints( "Thanks to jQuery, we're worry warts from browser compatibility.", BeWorried::default(), ); } #[test] fn dont_flag_were_worry_space_free() { assert_no_lints( "Thanks to jQuery, we're worry free from browser compatibility.", BeWorried::default(), ); } #[test] #[ignore = "edge case not yet handled"] fn cant_fix_edge_case_yet() { assert_good_and_bad_suggestions( "Myself along with others are using it on an iPad successfully, so it is worry to hear that is broken for you.", BeWorried::default(), &[ "Myself along with others are using it on an iPad successfully, so it is worrying to hear that is broken for you.", "Myself along with others are using it on an iPad successfully, so it is a worry to hear that is broken for you.", ], &[], ); } } ================================================ FILE: harper-core/src/linting/behind_the_scenes.rs ================================================ use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct BehindTheScenes { expr: SequenceExpr, } impl Default for BehindTheScenes { fn default() -> Self { Self { expr: SequenceExpr::aco("behind") .t_ws_h() .t_aco("the") .t_ws_h() .t_aco("scene"), } } } impl ExprLinter for BehindTheScenes { type Unit = Chunk; fn description(&self) -> &str { "Corrects `behind the scene` to `behind the scenes`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if let Some((before, _)) = ctx && before.last().is_some_and(|t| t.kind.is_hyphen()) { return None; } let span = toks.last()?.span; Some(Lint { span, lint_kind: LintKind::Usage, suggestions: [Suggestion::replace_with_match_case_str( "scenes", span.get_content(src), )] .to_vec(), message: "This idiom uses the plural `scenes`.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use crate::linting::{ behind_the_scenes::BehindTheScenes, tests::{assert_no_lints, assert_suggestion_result}, }; #[test] fn pluralize_work_bts() { assert_suggestion_result( "How does this tool work behind the scene.", BehindTheScenes::default(), "How does this tool work behind the scenes.", ); } #[test] #[ignore = "Correcting hyphenation is not yet implemented."] fn pluralize_and_hyphenate() { assert_suggestion_result( "So, to open the 'real' behind the scene menu i need to do these steps:", BehindTheScenes::default(), "So, to open the 'real' behind-the-scenes menu i need to do these steps:", ); } #[test] fn dont_flag_when_hyphenated_to_previous_word() { assert_no_lints( "Contribute to techking11/react-behind-the-scene development by creating an account on GitHub.", BehindTheScenes::default(), ); } #[test] fn pluralize_bts_processing() { assert_suggestion_result( "Behind-the-scene processing details are printed in the Log window.", BehindTheScenes::default(), "Behind-the-scenes processing details are printed in the Log window.", ); } } ================================================ FILE: harper-core/src/linting/best_of_all_time.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Sentence}; pub struct BestOfAllTime { expr: SequenceExpr, } impl Default for BestOfAllTime { fn default() -> Self { // Best, Biggest let inflection_superlative = SequenceExpr::default().then_superlative_adjective(); // Most interesting let most_superlative = SequenceExpr::default() .t_aco("most") .t_ws() .then_positive_adjective(); // Some resources call 'favourite' an 'absolute adjective', some consider it a superlative. let fave_or_top = SequenceExpr::word_set(&["favorite", "favourite", "top"]); // We can't use the noun phrase Expr because it allows determiners before the nouns and "best the thing" wouldn't be right let expr = SequenceExpr::any_of(vec![ Box::new(inflection_superlative), Box::new(most_superlative), Box::new(fave_or_top), ]) // There is no non-greedy `Repeating` in Harper, so we have to do match non-noun-oov tokens // rather than matching arbitrary tokens. // We include OOV because novel words not in the dictionary tend to be nouns. .then_zero_or_more(|tok: &Token, _: &[char]| !tok.kind.is_noun() && !tok.kind.is_oov()) .then_kind_where(|kind| kind.is_noun() || kind.is_oov()) .then_zero_or_more( SequenceExpr::default() .t_ws() .then_kind_where(|kind| kind.is_noun() || kind.is_oov()), ) .then_fixed_phrase(" of all times"); Self { expr } } } impl ExprLinter for BestOfAllTime { type Unit = Sentence; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let times_span = toks.last()?.span; if let Some((_, time_singular)) = times_span.get_content(src).split_last() { return Some(Lint { span: times_span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(time_singular.to_vec())], message: "This expression uses singular `time`".to_string(), ..Default::default() }); } None } fn description(&self) -> &'static str { "Checks for nonstandard `of all times` in superlatives instead of singular `time`" } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::BestOfAllTime; #[test] fn dont_flag_list_of_all_times() { assert_lint_count( "Provides a formatted list of all times that SDO was non-nominal", BestOfAllTime::default(), 0, ); } #[test] fn fix_after_best() { assert_suggestion_result( "And also in the best IDE of all times Visual Studio", BestOfAllTime::default(), "And also in the best IDE of all time Visual Studio", ); } #[test] fn fix_after_greatest() { assert_suggestion_result( "This app shows you why Sachin Tendulkar is the greatest cricket of all times, by using interactive stories.", BestOfAllTime::default(), "This app shows you why Sachin Tendulkar is the greatest cricket of all time, by using interactive stories.", ); } #[test] fn fix_after_biggest() { assert_suggestion_result( "THIS IS THE BIGGEST QUESTIONS OF ALL TIMES...", BestOfAllTime::default(), "THIS IS THE BIGGEST QUESTIONS OF ALL TIME...", ); } #[test] fn fix_after_most_influential() { assert_suggestion_result( "It is an open source project that aggregates multiple lists of \"the best/most influential games of all times\"", BestOfAllTime::default(), "It is an open source project that aggregates multiple lists of \"the best/most influential games of all time\"", ); } #[test] fn dont_flag_sum_of_all_times() { assert_lint_count( "The original TotalTime seems not be the sum of all times", BestOfAllTime::default(), 0, ); } #[test] fn dont_flag_history_stacks_of_all_times() { assert_lint_count( "Didn't this imply all history stacks of all times, which itself implied all those saved.", BestOfAllTime::default(), 0, ); } #[test] fn fix_after_favorite() { assert_suggestion_result( "Red Dead Redemption 2 is my nr 1 favorite game of all times", BestOfAllTime::default(), "Red Dead Redemption 2 is my nr 1 favorite game of all time", ); } #[test] fn fix_after_favourite() { assert_suggestion_result( "Just made this website to show you my favourite movies of all times.", BestOfAllTime::default(), "Just made this website to show you my favourite movies of all time.", ); } #[test] fn fix_top_out_of_vocabulary() { assert_suggestion_result( "Can I Play the Top 10 Basslines of All Times?", BestOfAllTime::default(), "Can I Play the Top 10 Basslines of All Time?", ); } #[test] fn fix_compound_noun() { assert_suggestion_result( "Is he the best bass guitarist of all times?", BestOfAllTime::default(), "Is he the best bass guitarist of all time?", ); } #[test] fn fix_containing_commas() { assert_suggestion_result( "I am the biggest, best, and most humble of all times", BestOfAllTime::default(), "I am the biggest, best, and most humble of all time", ); } } ================================================ FILE: harper-core/src/linting/boring_words.rs ================================================ use itertools::Itertools; use crate::expr::{Expr, FirstMatchOf, WordExprGroup}; use crate::thesaurus_helper; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind}; use crate::linting::expr_linter::Chunk; pub struct BoringWords { expr: WordExprGroup, } impl Default for BoringWords { fn default() -> Self { let mut expr = WordExprGroup::default(); expr.add_word("very"); expr.add_word("interesting"); expr.add_word("several"); expr.add_word("most"); expr.add_word("many"); Self { expr } } } impl ExprLinter for BoringWords { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let matched_word = matched_tokens.span()?.get_content_string(source); Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Enhancement, suggestions: thesaurus_helper::get_synonym_replacement_suggestions( &matched_word, &matched_tokens[0].kind, ) .take(5) .collect_vec(), message: format!( "“{matched_word}” is a boring word. Try something a little more exotic." ), priority: 127, }) } fn description(&self) -> &'static str { "This rule looks for particularly boring or overused words. Using varied language is an easy way to keep a reader's attention." } } ================================================ FILE: harper-core/src/linting/bought.rs ================================================ use super::{ExprLinter, Lint, LintKind}; use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; pub struct Bought { expr: SequenceExpr, } impl Default for Bought { fn default() -> Self { let subject = SequenceExpr::with(Self::is_subject_pronoun_like) .t_ws() .then_optional(SequenceExpr::default().then_adverb().t_ws()) .then_optional(SequenceExpr::default().then_auxiliary_verb().t_ws()) .then_optional(SequenceExpr::default().then_adverb().t_ws()) .then_any_capitalization_of("bough"); Self { expr: subject } } } impl ExprLinter for Bought { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let typo = matched_tokens.last()?; Some(Lint { span: typo.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "bought".chars().collect(), typo.span.get_content(source), )], message: "Prefer the past-tense form `bought` here.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Replaces the incorrect past-tense spelling `bough` with `bought` after subject pronouns." } } impl Bought { fn is_subject_pronoun_like(token: &Token, source: &[char]) -> bool { if token.kind.is_subject_pronoun() { return true; } if !token.kind.is_word() || !token.kind.is_apostrophized() { return false; } let text = token.span.get_content_string(source); let lower = text.to_ascii_lowercase(); let Some((stem, suffix)) = lower.split_once('\'') else { return false; }; let is_subject_stem = matches!(stem, "i" | "you" | "we" | "they" | "he" | "she" | "it"); let is_supported_suffix = matches!(suffix, "d" | "ve"); is_subject_stem && is_supported_suffix } } #[cfg(test)] mod tests { use super::Bought; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn corrects_he_bough() { assert_suggestion_result( "He bough a laptop yesterday.", Bought::default(), "He bought a laptop yesterday.", ); } #[test] fn corrects_she_never_bough() { assert_suggestion_result( "She never bough fresh herbs there.", Bought::default(), "She never bought fresh herbs there.", ); } #[test] fn corrects_they_already_bough() { assert_suggestion_result( "They already bough the train tickets.", Bought::default(), "They already bought the train tickets.", ); } #[test] fn corrects_we_have_bough() { assert_suggestion_result( "We have bough extra paint.", Bought::default(), "We have bought extra paint.", ); } #[test] fn corrects_they_have_never_bough() { assert_suggestion_result( "They have never bough theatre seats online.", Bought::default(), "They have never bought theatre seats online.", ); } #[test] fn corrects_ive_bough() { assert_suggestion_result( "I've bough the ingredients already.", Bought::default(), "I've bought the ingredients already.", ); } #[test] fn corrects_wed_bough() { assert_suggestion_result( "We'd bough snacks before the film.", Bought::default(), "We'd bought snacks before the film.", ); } #[test] fn no_lint_for_tree_bough() { assert_no_lints("The heavy bough cracked under the snow.", Bought::default()); } #[test] fn no_lint_for_he_bought() { assert_no_lints("He bought a laptop yesterday.", Bought::default()); } #[test] fn no_lint_for_plural_boughs() { assert_no_lints("Boughs swayed in the evening breeze.", Bought::default()); } } ================================================ FILE: harper-core/src/linting/brand_brandish.rs ================================================ use crate::{ Lint, Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct BrandBrandish { expr: SequenceExpr, } impl Default for BrandBrandish { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["brandish", "brandished", "brandishes", "brandishing"]) .t_ws() // "her" is also a possessive determiner as in "she brandished her sword" // "it" and "them" can refer to objects as in "draw your sword(s) and brandish it/them" .then_kind_except(TokenKind::is_object_pronoun, &["her", "it", "them"]), } } } impl ExprLinter for BrandBrandish { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let verb_span = toks.first()?.span; let verb_chars = verb_span.get_content(src); enum Form { Base, Past, ThirdPerson, Ing, } let infl = match verb_chars.last().map(|c| c.to_ascii_lowercase()) { Some('h') => Form::Base, Some('d') => Form::Past, Some('s') => Form::ThirdPerson, Some('g') => Form::Ing, _ => return None, }; Some(Lint { span: verb_span, lint_kind: LintKind::Malapropism, suggestions: vec![Suggestion::replace_with_match_case_str( match infl { Form::Base => "brand", Form::Past => "branded", Form::ThirdPerson => "brands", Form::Ing => "branding", }, verb_chars, )], message: "`Brandish` means to wield a weapon. You probably mean `brand`.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Looks for `brandish` wrongly used when `brand` is intended." } } #[cfg(test)] mod tests { use crate::linting::{brand_brandish::BrandBrandish, tests::assert_suggestion_result}; #[test] fn correct_brandish_a_traitor() { assert_suggestion_result( "Unretire Gretzky's sweater . Brandish him a traitor.", BrandBrandish::default(), "Unretire Gretzky's sweater . Brand him a traitor.", ); } #[test] fn correct_brandish_a_criminal() { assert_suggestion_result( "lied to stop kuma's ideology from taking root and to brandish him a criminal that they could arrest", BrandBrandish::default(), "lied to stop kuma's ideology from taking root and to brand him a criminal that they could arrest", ); } #[test] fn correct_brandish_as_a() { assert_suggestion_result( "he was so afraid his thoughts could brandish him as a paedophile", BrandBrandish::default(), "he was so afraid his thoughts could brand him as a paedophile", ); } #[test] fn correct_brandish_an_offender() { assert_suggestion_result( "Chanel Oberlin's reason for purposely leading on Pete Martinez in order to humiliate him and brandish him a registered sex offender", BrandBrandish::default(), "Chanel Oberlin's reason for purposely leading on Pete Martinez in order to humiliate him and brand him a registered sex offender", ); } #[test] fn correct_brandish_with_nicknames() { assert_suggestion_result( "?? spoke out over the move by Kenyans to continuously brandish him with nicknames even after ...", BrandBrandish::default(), "?? spoke out over the move by Kenyans to continuously brand him with nicknames even after ...", ); } #[test] fn correct_brandish_as_a_aymbol() { assert_suggestion_result( "brandish him as an acclaimed symbol of humility, integrity and incorruptibility in the face of today's corrupt economic and political elite1", BrandBrandish::default(), "brand him as an acclaimed symbol of humility, integrity and incorruptibility in the face of today's corrupt economic and political elite1", ); } #[test] fn correct_brandish_as_illegal() { assert_suggestion_result( "To attempt to brandish him as an “illegal immigrant” is absolutely ridiculous and warrants an immediate retraction and apology.", BrandBrandish::default(), "To attempt to brand him as an “illegal immigrant” is absolutely ridiculous and warrants an immediate retraction and apology.", ); } #[test] fn correct_brandish_with_nickname() { assert_suggestion_result( "The small minded townsfolk brandish him with the nickname \"Genepool\" due to his physical and cognitive shortcomings.", BrandBrandish::default(), "The small minded townsfolk brand him with the nickname \"Genepool\" due to his physical and cognitive shortcomings.", ); } #[test] fn correct_brandish_with_label() { assert_suggestion_result( "One such reason that critics brandish him with this label is due to Peterson's opposition to Canada's Bill C-16", BrandBrandish::default(), "One such reason that critics brand him with this label is due to Peterson's opposition to Canada's Bill C-16", ); } #[test] fn correct_brandished_us() { assert_suggestion_result( "The mark they brandished us with will fade to dust when we finally meet our end.", BrandBrandish::default(), "The mark they branded us with will fade to dust when we finally meet our end.", ) } #[test] fn correct_brandishing_him() { assert_suggestion_result( "he said some words trying to hit back at the center for brandishing him as a Pakistani at an NRC rally", BrandBrandish::default(), "he said some words trying to hit back at the center for branding him as a Pakistani at an NRC rally", ) } #[test] fn correct_brandish_us() { assert_suggestion_result( "Our resolute determination for the ultimate quality and all-inclusive directory of food commodities brandish us as a flawless associate in B2B", BrandBrandish::default(), "Our resolute determination for the ultimate quality and all-inclusive directory of food commodities brand us as a flawless associate in B2B", ) } #[test] fn correct_brandished_him() { assert_suggestion_result( "Frank discovers Myra brandished him with the letter 'R', for rapist.", BrandBrandish::default(), "Frank discovers Myra branded him with the letter 'R', for rapist.", ) } #[test] fn correct_brandishes_him() { assert_suggestion_result( "Whether one turns a blind eye to Tim's wrongs or brandishes him a traitor will plant audiences in their own personal line in the sand.", BrandBrandish::default(), "Whether one turns a blind eye to Tim's wrongs or brands him a traitor will plant audiences in their own personal line in the sand.", ) } } ================================================ FILE: harper-core/src/linting/by_accident.rs ================================================ /* let message "Did you mean `by accident`?" let description "Incorrect preposition: `by accident` is the idiomatic expression." */ use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct ByAccident { expr: SequenceExpr, } impl Default for ByAccident { fn default() -> Self { Self { expr: SequenceExpr::aco("on") .t_ws() .then_optional( SequenceExpr::word_set(&[ "complete", "happy", "literal", "mere", "pure", "sheer", "total", ]) .t_ws(), ) .t_aco("accident"), } } } impl ExprLinter for ByAccident { type Unit = Chunk; fn description(&self) -> &str { "Incorrect preposition: `by accident` is the idiomatic expression." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let span = toks.first()?.span; let suggestions = vec![Suggestion::replace_with_match_case_str( "by", span.get_content(src), )]; Some(Lint { span, lint_kind: LintKind::Usage, suggestions, message: "Did you mean `by accident`?".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::ByAccident; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_on_accident() { assert_suggestion_result( "Snapshot revert feature is unintuitive and easy to use on accident.", ByAccident::default(), "Snapshot revert feature is unintuitive and easy to use by accident.", ); } #[test] fn fix_on_complete_accident() { assert_suggestion_result( "I Came across this comment on complete accident, however, I did notice the same thing with a slowdown in chrome for android", ByAccident::default(), "I Came across this comment by complete accident, however, I did notice the same thing with a slowdown in chrome for android", ); } #[test] fn fix_on_happy_accident() { assert_suggestion_result( "Just did this on happy accident the other day with my partner.", ByAccident::default(), "Just did this by happy accident the other day with my partner.", ); } #[test] fn fix_on_literal_accident() { assert_suggestion_result( "I did this on literal accident, trying to prove someone wrong that its not that easy.", ByAccident::default(), "I did this by literal accident, trying to prove someone wrong that its not that easy.", ); } #[test] fn fix_on_mere_accident() { assert_suggestion_result( "I hated this challenge and nope I don't I completed it on mere accident.", ByAccident::default(), "I hated this challenge and nope I don't I completed it by mere accident.", ); } #[test] fn fix_on_pure_accident() { assert_suggestion_result( "I got this on pure accident after forgetting to enable WebGL on LibreWolf", ByAccident::default(), "I got this by pure accident after forgetting to enable WebGL on LibreWolf", ); } #[test] fn fix_on_sheer_accident() { assert_suggestion_result( "I more of think of things that got discovered on sheer accident, something no normal human would just do and expect results.", ByAccident::default(), "I more of think of things that got discovered by sheer accident, something no normal human would just do and expect results.", ); } #[test] fn fix_on_total_accident() { assert_suggestion_result( "On Total Accident, I Found Out Yona's True Title.", ByAccident::default(), "By Total Accident, I Found Out Yona's True Title.", ); } } ================================================ FILE: harper-core/src/linting/call_them.rs ================================================ use std::{ops::Range, sync::Arc}; use crate::expr::{Expr, ExprMap, SequenceExpr}; use crate::patterns::DerivedFrom; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct CallThem { expr: ExprMap>, } impl Default for CallThem { fn default() -> Self { let mut map = ExprMap::default(); let post_exception = Arc::new(SequenceExpr::default().t_ws().then_word_set(&["if", "it"])); map.insert( SequenceExpr::with(DerivedFrom::new_from_str("call")) .t_ws() .then_pronoun() .t_ws() .t_aco("as") .then_unless(post_exception.clone()), 3..5, ); map.insert( SequenceExpr::with(DerivedFrom::new_from_str("call")) .t_ws() .t_aco("as") .t_ws() .then_pronoun() .then_unless(post_exception.clone()), 1..3, ); Self { expr: map } } } impl ExprLinter for CallThem { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let removal_range = self.expr.lookup(0, matched_tokens, source)?.clone(); let offending_tokens = matched_tokens.get(removal_range)?; Some(Lint { span: offending_tokens.span()?, lint_kind: LintKind::Redundancy, suggestions: vec![Suggestion::Remove], message: "`as` is redundant in this context.".to_owned(), ..Default::default() }) } fn description(&self) -> &'static str { "Addresses the non-idiomatic phrases `call them as`." } } #[cfg(test)] mod tests { #[allow(unused_imports)] use crate::Document; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::CallThem; #[test] fn prefer_plug_and_receptacle() { assert_suggestion_result( r#"I prefer to call them as Plug (male) and Receptacle (female). Receptacles are seen in laptops, mobile phones etc.."#, CallThem::default(), r#"I prefer to call them Plug (male) and Receptacle (female). Receptacles are seen in laptops, mobile phones etc.."#, ); } #[test] fn builtins_id() { assert_suggestion_result( r#"I’d categorically ignore *id* as a builtin, and when you do need it in a module, make it super explicit and `import builtins` and call it as `builtins.id`."#, CallThem::default(), r#"I’d categorically ignore *id* as a builtin, and when you do need it in a module, make it super explicit and `import builtins` and call it `builtins.id`."#, ); } #[test] fn non_modal_dialogue() { assert_suggestion_result( r#"We usually call it as non-modal dialogue e.g. when hit Gmail compose button, a nonmodal dialogue opens."#, CallThem::default(), r#"We usually call it non-modal dialogue e.g. when hit Gmail compose button, a nonmodal dialogue opens."#, ); } #[test] fn prefer_to_call_them() { assert_suggestion_result( r#"So, how do you typically prefer to call them as?"#, CallThem::default(), r#"So, how do you typically prefer to call them?"#, ); } #[test] fn called_them_allies() { assert_suggestion_result( r#"Yes as tribes or nomads you called them as allies but you didn’t get their levies as your own."#, CallThem::default(), r#"Yes as tribes or nomads you called them allies but you didn’t get their levies as your own."#, ); } #[test] fn character_development() { assert_suggestion_result( r#"I call this as character development."#, CallThem::default(), r#"I call this character development."#, ); } #[test] fn fate_or_time() { assert_suggestion_result( r#"Should I Call It As Fate Or Time"#, CallThem::default(), r#"Should I Call It Fate Or Time"#, ); } #[test] fn abstract_latte_art() { assert_suggestion_result( r#"Can we just call it as abstract latte art."#, CallThem::default(), r#"Can we just call it abstract latte art."#, ); } #[test] fn sounding_boards() { assert_suggestion_result( r#"I call them as my ‘sounding boards’"#, CallThem::default(), r#"I call them my ‘sounding boards’"#, ); } #[test] fn calling_them_disaster() { assert_suggestion_result( r#"I totally disagree with your point listed and calling them as disaster."#, CallThem::default(), r#"I totally disagree with your point listed and calling them disaster."#, ); } #[test] fn battle_of_boxes() { assert_suggestion_result( r#"Windows Sandbox and VirtualBox or I would like to call this as “Battle of Boxes.”"#, CallThem::default(), r#"Windows Sandbox and VirtualBox or I would like to call this “Battle of Boxes.”"#, ); } #[test] fn called_her_shinnasan() { assert_suggestion_result( r#"Nice meeting a follower from reddit I called her as Shinna-san, welcome again to Toram!!"#, CallThem::default(), r#"Nice meeting a follower from reddit I called her Shinna-san, welcome again to Toram!!"#, ); } #[test] fn calling_it_otp() { assert_suggestion_result( r#"Calling it as OTP in this case misleading"#, CallThem::default(), r#"Calling it OTP in this case misleading"#, ); } #[test] fn call_it_procrastination() { assert_suggestion_result( r#"To summarise it in just one word I would call it as procrastination."#, CallThem::default(), r#"To summarise it in just one word I would call it procrastination."#, ); } #[test] fn call_her_important() { assert_suggestion_result( r#"Liked the article overall but to call her as important to rap as Jay or Dre is a bold overstatement."#, CallThem::default(), r#"Liked the article overall but to call her important to rap as Jay or Dre is a bold overstatement."#, ); } #[test] fn call_him_kindles() { assert_suggestion_result( r#"The days when I had my first best friend, I would rather call him as human version of kindle audiobook, who keeps on talking about everything under the umbrella."#, CallThem::default(), r#"The days when I had my first best friend, I would rather call him human version of kindle audiobook, who keeps on talking about everything under the umbrella."#, ); } #[test] fn call_them_defenders() { assert_suggestion_result( r#"Declaring war challenging land of a vassal should call them as defenders!"#, CallThem::default(), r#"Declaring war challenging land of a vassal should call them defenders!"#, ); } #[test] fn call_it_magical() { assert_suggestion_result( r#"I would like to call it as magical."#, CallThem::default(), r#"I would like to call it magical."#, ); } #[test] fn forward_lateral() { assert_suggestion_result( r#"Surprised the refs didn’t call this as a forward lateral."#, CallThem::default(), r#"Surprised the refs didn’t call this a forward lateral."#, ); } #[test] fn calling_best_friend() { assert_suggestion_result( r#"Meet my buddy! I love calling him as my best friend, because he never failed to bring some cheer in me!"#, CallThem::default(), r#"Meet my buddy! I love calling him my best friend, because he never failed to bring some cheer in me!"#, ); } #[test] fn calling_everyone_titles() { assert_suggestion_result( r#"Currently, I’m teaching in Asia and the students have the local custom of calling everyone as Mr. Givenname or Miss Givenname"#, CallThem::default(), r#"Currently, I’m teaching in Asia and the students have the local custom of calling everyone Mr. Givenname or Miss Givenname"#, ); } #[test] fn called_as_he() { assert_suggestion_result( r#"I prefer to be called as he when referred in 3rd person and I’m sure that everyone would be ok to call me as he."#, CallThem::default(), r#"I prefer to be called he when referred in 3rd person and I’m sure that everyone would be ok to call me he."#, ); } #[test] fn calls_him_bob() { assert_suggestion_result( r#"In Twelve Monkeys, Cole hears someone who calls him as “Bob”"#, CallThem::default(), r#"In Twelve Monkeys, Cole hears someone who calls him “Bob”"#, ); } #[test] fn pliny_called_it() { assert_suggestion_result( r#"Pliny the Elder called it as lake of Gennesaret or Taricheae in his encyclopedia, Natural History."#, CallThem::default(), r#"Pliny the Elder called it lake of Gennesaret or Taricheae in his encyclopedia, Natural History."#, ); } #[test] fn students_call_you() { assert_suggestion_result( r#"In the same way your students will call you as ~先生 even after they graduated/move to higher education."#, CallThem::default(), r#"In the same way your students will call you ~先生 even after they graduated/move to higher education."#, ); } #[test] fn paradoxical_reaction() { assert_suggestion_result( r#"We can call it as Paradoxical Reaction which means a medicine which is used to reduce pain increases the pain when it is"#, CallThem::default(), r#"We can call it Paradoxical Reaction which means a medicine which is used to reduce pain increases the pain when it is"#, ); } #[test] fn rust_module() { assert_no_lints( "I want to call them as if they were just another Rust module", CallThem::default(), ); } #[test] fn want_to_do() { assert_no_lints( "however its a design choice to not call it as it does things I don't want to do.", CallThem::default(), ); } } ================================================ FILE: harper-core/src/linting/cant.rs ================================================ use super::{ExprLinter, Suggestion}; use crate::Lint; use crate::expr::{Expr, LongestMatchOf, SequenceExpr}; use crate::linting::LintKind; use crate::linting::expr_linter::Chunk; use crate::linting::expr_linter::find_the_only_token_matching; use crate::{CharStringExt, Token}; pub struct Cant { expr: LongestMatchOf, } impl Default for Cant { fn default() -> Self { let nom_cant = SequenceExpr::default() .then_kind_except(|kind| kind.is_nominal(), &["or"]) .t_ws() .t_aco("cant"); let cant_pron = SequenceExpr::aco("cant").t_ws().then_personal_pronoun(); let cant_verb = SequenceExpr::aco("cant") .t_ws() .then_kind_is_but_is_not(|kind| kind.is_verb_lemma(), |kind| kind.is_noun()); Self { expr: LongestMatchOf::new(vec![ Box::new(nom_cant), Box::new(cant_pron), Box::new(cant_verb), ]), } } } impl ExprLinter for Cant { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let token = find_the_only_token_matching(toks, src, |tok, src| { tok.span .get_content(src) .eq_ignore_ascii_case_chars(&['c', 'a', 'n', 't']) })?; let jargon = token.span.get_content(src); let cannot = "can't"; Some(Lint { span: token.span, lint_kind: LintKind::Enhancement, suggestions: vec![Suggestion::replace_with_match_case_str(cannot, jargon)], message: "`Cant` is secret language or jargon. If that's not what you mean you should use `can't` here.".to_string(), priority: 127, }) } fn description(&self) -> &'static str { "Suggests correcting `cant` to `can't`." } } #[cfg(test)] mod tests { use super::Cant; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_pronoun_cant() { assert_suggestion_result( "I cant go to the store.", Cant::default(), "I can't go to the store.", ); } #[test] fn corrects_proper_noun_cant() { assert_suggestion_result( "Bob cant go to the store.", Cant::default(), "Bob can't go to the store.", ); } #[test] fn corrects_common_noun_cant() { // "dog" and "cat" are assert_suggestion_result( "A horse cant drink bottled water.", Cant::default(), "A horse can't drink bottled water.", ); } #[test] fn corrects_cant_pronoun() { assert_suggestion_result( "Cant you go to the store?", Cant::default(), "Can't you go to the store?", ); } #[test] fn dont_flag_if_cant_is_part_of_noun_phrase() { assert_lint_count("Cant cant be the same as jargon.", Cant::default(), 0); } #[test] fn dont_flag_cant_project() { assert_lint_count( "The CANT project is designed to allow people to screw around with CAN easily at layers 1/2.", Cant::default(), 0, ); } #[test] #[ignore = "'Convert' is also a noun, so a 'cant convert' could be a person who switched to speaking jargon"] fn corrects_cant_verb() { assert_suggestion_result( "Cant convert widget to input", Cant::default(), "Can't convert widget to input", ); } #[test] fn dont_flag_legit_noun_sense() { assert_lint_count( "CB Slang Dictionary is the distinctive anti-language, argot or cant which developed amongst users of citizens' band radio (CB), especially truck drivers", Cant::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/capitalize_personal_pronouns.rs ================================================ use crate::TokenStringExt; use super::{Lint, LintKind, Linter, Suggestion}; /// A linter that makes sure you capitalize "I" and its contractions. #[derive(Default)] pub struct CapitalizePersonalPronouns; impl Linter for CapitalizePersonalPronouns { fn lint(&mut self, document: &crate::Document) -> Vec { document .iter_words() .filter_map(|tok| { let span_content = document.get_span_content(&tok.span); if matches!( span_content, ['i'] | ['i', '\'', 'd'] | ['i', '\'', 'd', '\'', 'v', 'e'] | ['i', '\'', 'l', 'l'] | ['i', '\'', 'm'] | ['i', '\'', 'v', 'e'] ) { let mut replacement = span_content.to_vec(); replacement[0] = 'I'; Some(Lint { span: tok.span, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith(replacement)], message: "The first-person singular subject pronoun must be capitalized." .to_string(), priority: 31, }) } else { None } }) .collect() } fn description(&self) -> &'static str { "Forgetting to capitalize personal pronouns, like \"I\" or \"I'm\" is one of the most common errors. This rule helps with that." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::CapitalizePersonalPronouns; #[test] fn start() { assert_suggestion_result("i am hungry", CapitalizePersonalPronouns, "I am hungry"); } #[test] fn end() { assert_suggestion_result( "There is no one stronger than i", CapitalizePersonalPronouns, "There is no one stronger than I", ); } #[test] fn middle() { assert_suggestion_result( "First of all, i am not happy with this.", CapitalizePersonalPronouns, "First of all, I am not happy with this.", ); } #[test] fn issue_365() { assert_lint_count( "access will succeed, unlike with UDEREF/i386.", CapitalizePersonalPronouns, 0, ); } #[test] fn corrects_id() { assert_suggestion_result("i'd", CapitalizePersonalPronouns, "I'd"); } #[test] fn correct_real_world_id() { assert_suggestion_result( "Personal Homebrew tap with tools i'd like to use", CapitalizePersonalPronouns, "Personal Homebrew tap with tools I'd like to use", ) } #[test] fn corrects_idve() { assert_suggestion_result("i'd've", CapitalizePersonalPronouns, "I'd've"); } #[test] fn correct_real_world_idve() { assert_suggestion_result( "... i'd've loved this even more twice length , but let not get greedy", CapitalizePersonalPronouns, "... I'd've loved this even more twice length , but let not get greedy", ) } #[test] fn corrects_ill() { assert_suggestion_result("i'll", CapitalizePersonalPronouns, "I'll"); } #[test] fn correct_real_world_ill() { assert_suggestion_result( "Hey i deploy my contract it give me error and i'll match with the script file both are same if someone have idea how i slove this please ...", CapitalizePersonalPronouns, "Hey I deploy my contract it give me error and I'll match with the script file both are same if someone have idea how I slove this please ...", ) } #[test] fn corrects_im() { assert_suggestion_result("i'm", CapitalizePersonalPronouns, "I'm"); } #[test] fn correct_real_world_im() { assert_suggestion_result( "Grid view not working, i'm not using any template", CapitalizePersonalPronouns, "Grid view not working, I'm not using any template", ) } #[test] fn corrects_ive() { assert_suggestion_result("i've", CapitalizePersonalPronouns, "I've"); } #[test] fn correct_real_world_ive() { assert_suggestion_result( "Can't use Github Pro although i've verified for student pack", CapitalizePersonalPronouns, "Can't use Github Pro although I've verified for student pack", ) } } ================================================ FILE: harper-core/src/linting/cautionary_tale.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; /// Corrects the homophone confusion between "tale" (story) and "tail" (appendage) /// in common phrases like "cautionary tale" and "inspirational tale". pub struct CautionaryTale { expr: SequenceExpr, } impl Default for CautionaryTale { fn default() -> Self { let adjectives = WordSet::new(&["cautionary", "inspirational"]); let pattern = SequenceExpr::with(adjectives).t_ws().t_aco("tail"); Self { expr: pattern } } } impl ExprLinter for CautionaryTale { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let tail_span = toks.last()?.span; let tail_text = tail_span.get_content(src); Some(Lint { span: tail_span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( ['t', 'a', 'l', 'e'].to_vec(), tail_text, )], message: "Did you mean `tale` (story)?".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Corrects confusion between `tale` (story) and `tail` (appendage) in common phrases." } } #[cfg(test)] mod tests { use super::CautionaryTale; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn catches_cautionary_tail() { assert_suggestion_result( "It serves as a cautionary tail.", CautionaryTale::default(), "It serves as a cautionary tale.", ); } #[test] fn catches_inspirational_tail() { assert_suggestion_result( "Her journey is an inspirational tail of perseverance.", CautionaryTale::default(), "Her journey is an inspirational tale of perseverance.", ); } #[test] fn catches_capitalized_cautionary_tail() { assert_suggestion_result( "The article discusses a Cautionary Tail about privacy.", CautionaryTale::default(), "The article discusses a Cautionary Tale about privacy.", ); } #[test] fn catches_uppercase_cautionary_tail() { assert_suggestion_result( "THE STORY IS A CAUTIONARY TAIL.", CautionaryTale::default(), "THE STORY IS A CAUTIONARY TALE.", ); } #[test] fn catches_mixed_case() { assert_suggestion_result( "This serves as an inspirational Tail for all.", CautionaryTale::default(), "This serves as an inspirational Tale for all.", ); } #[test] fn allows_actual_tail() { assert_lint_count( "The dog wagged its tail happily.", CautionaryTale::default(), 0, ); } #[test] fn allows_different_adjective_with_tail() { assert_lint_count("The cat has a long tail.", CautionaryTale::default(), 0); } #[test] fn allows_correct_tale() { assert_lint_count( "It serves as a cautionary tale.", CautionaryTale::default(), 0, ); } #[test] fn allows_inspirational_tale() { assert_lint_count( "Her story is an inspirational tale.", CautionaryTale::default(), 0, ); } #[test] fn catches_in_longer_text() { assert_suggestion_result( "The movie presents a cautionary tail about the dangers of AI. It's really scary.", CautionaryTale::default(), "The movie presents a cautionary tale about the dangers of AI. It's really scary.", ); } #[test] fn catches_multiple_occurrences() { assert_lint_count( "This cautionary tail is also an inspirational tail about overcoming adversity.", CautionaryTale::default(), 2, ); } #[test] fn allows_tail_in_different_context() { assert_lint_count( "The inspirational speaker told the tale of a dog's tail.", CautionaryTale::default(), 0, ); } #[test] fn catches_at_start_of_sentence() { assert_suggestion_result( "Cautionary tail: don't trust strangers.", CautionaryTale::default(), "Cautionary tale: don't trust strangers.", ); } } ================================================ FILE: harper-core/src/linting/change_tack.rs ================================================ use crate::{ Token, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, patterns::Word, }; pub struct ChangeTack { expr: FirstMatchOf, } impl Default for ChangeTack { fn default() -> Self { let verb_forms = &["change", "changes", "changing", "changed"]; let noun_forms = &verb_forms[..3]; let eggcorns = &["tact", "tacks", "tacts"]; Self { expr: FirstMatchOf::new(vec![ Box::new( SequenceExpr::longest_of(vec![ Box::new(SequenceExpr::word_set(verb_forms).then_optional( SequenceExpr::default().t_ws().then_any_of(vec![ Box::new(SequenceExpr::default().then_possessive_determiner()), Box::new(Word::new("it's")), ]), )), Box::new(SequenceExpr::word_set(noun_forms).t_ws().t_aco("of")), ]) .t_ws() .then_word_set(eggcorns), ), Box::new(SequenceExpr::aco("different").t_ws().t_aco("tact")), ]), } } } impl ExprLinter for ChangeTack { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let tact_tok = toks.last()?; let tact_span = tact_tok.span; let tact_chars = tact_span.get_content(src); Some(Lint { span: tact_span, lint_kind: LintKind::Eggcorn, suggestions: vec![Suggestion::replace_with_match_case( ['t', 'a', 'c', 'k'].to_vec(), tact_chars, )], message: "A change in direction or approach is a change of `tack`. Not `tact` (or `tacks` or `tacts`).".to_owned(), priority: 32, }) } fn description(&self) -> &'static str { "Locates errors in the idioms `to change tack` and `change of tack` to convey the correct meaning of altering one's course or strategy." } } #[cfg(test)] mod tests { use super::ChangeTack; use crate::linting::tests::assert_suggestion_result; // Verbs: change tack #[test] fn change_tact_atomic() { assert_suggestion_result("change tact", ChangeTack::default(), "change tack"); } #[test] fn changed_tacks_atomic() { assert_suggestion_result("changed tacks", ChangeTack::default(), "changed tack"); } #[test] fn changes_tacts_atomic() { assert_suggestion_result("changes tacts", ChangeTack::default(), "changes tack"); } #[test] fn changing_tact_atomic() { assert_suggestion_result("changing tact", ChangeTack::default(), "changing tack"); } // Nouns: change of tack #[test] fn change_of_tacks_atomic() { assert_suggestion_result("change of tacks", ChangeTack::default(), "change of tack"); } #[test] fn change_of_tact_real_world() { assert_suggestion_result( "Change of tact : come give your concerns - Death Knight", ChangeTack::default(), "Change of tack : come give your concerns - Death Knight", ); } #[test] fn change_of_tacts_real_world() { assert_suggestion_result( "2013.08.15 - A Change of Tacts | Hero MUX Wiki | Fandom", ChangeTack::default(), "2013.08.15 - A Change of Tack | Hero MUX Wiki | Fandom", ); } #[test] fn changing_of_tacks_real_world() { assert_suggestion_result( "Duffy's changing of tacks hidden in her poetry collection ...", ChangeTack::default(), "Duffy's changing of tack hidden in her poetry collection ...", ); } #[test] fn changes_of_tact_real_world() { assert_suggestion_result( "While the notes and the changes of tact started to ...", ChangeTack::default(), "While the notes and the changes of tack started to ...", ); } // With possessive determiners #[test] fn changed_my_tact() { assert_suggestion_result( "I have changed my tact this year, and have two second dates in the next week.", ChangeTack::default(), "I have changed my tack this year, and have two second dates in the next week.", ); } #[test] fn changed_our_tact() { assert_suggestion_result( "That being said we have changed our tact slightly and gone for making all UI elements lazy.", ChangeTack::default(), "That being said we have changed our tack slightly and gone for making all UI elements lazy.", ); } #[test] fn change_your_tact() { assert_suggestion_result( "If you've ever heard the phrase “you've got to change your tact”, this is probably where it comes from.", ChangeTack::default(), "If you've ever heard the phrase “you've got to change your tack”, this is probably where it comes from.", ); } #[test] fn change_his_tact() { assert_suggestion_result( "Why did Sephiroth change his tact with Cloud midway through the game?", ChangeTack::default(), "Why did Sephiroth change his tack with Cloud midway through the game?", ); } #[test] fn changed_her_tact() { assert_suggestion_result( "Only the last commitment ceremony I think she changed her tact and went on about George needing to be the real George.", ChangeTack::default(), "Only the last commitment ceremony I think she changed her tack and went on about George needing to be the real George.", ); } #[test] fn change_its_tact() { assert_suggestion_result( "The show seems to change its tact depending on the episode.", ChangeTack::default(), "The show seems to change its tack depending on the episode.", ); } #[test] fn changing_its_tact_apostrophe() { assert_suggestion_result( "FYI, USL is changing it's tact internally about MLS II teams.", ChangeTack::default(), "FYI, USL is changing it's tack internally about MLS II teams.", ); } #[test] fn changes_their_tact() { assert_suggestion_result( "As we become inoculated to attention grifts, the grifter changes their tact.", ChangeTack::default(), "As we become inoculated to attention grifts, the grifter changes their tack.", ); } #[test] fn different_tact() { assert_suggestion_result( "So, I recently took a different tact: I put all my models etc. in a single folder.", ChangeTack::default(), "So, I recently took a different tack: I put all my models etc. in a single folder.", ); } } ================================================ FILE: harper-core/src/linting/chock_full.rs ================================================ use crate::expr::Expr; use crate::weir::weir_expr_to_expr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ChockFull { expr: Box, } impl Default for ChockFull { fn default() -> Self { Self { expr: weir_expr_to_expr("[chalk, choke][( ), -]full").unwrap(), } } } impl ExprLinter for ChockFull { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_toks: &[Token], source: &[char]) -> Option { let span = matched_toks.span()?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "chock-full", span.get_content(source), )], message: format!( "The standard term is \"chock-full\"{}.", if matched_toks[1].kind.is_whitespace() { ", and it should be hyphenated" } else { "" } ), priority: 126, }) } fn description(&self) -> &'static str { "Flags common soundalikes of \"chock-full\" and makes sure they're hyphenated." } } #[cfg(test)] mod tests { use super::ChockFull; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn allows_correct_form() { assert_lint_count( "'Chalk full', 'chalk-full', 'choke full', and 'choke-full' are nonstandard forms of 'chock-full'.", ChockFull::default(), 4, ); } #[test] fn lower_space_chalk() { assert_suggestion_result( "The codebase is chalk full of errors that we need to address.", ChockFull::default(), "The codebase is chock-full of errors that we need to address.", ); } #[test] fn lower_space_choke() { assert_suggestion_result( "The project is choke full of questionable decisions that we need to revisit.", ChockFull::default(), "The project is chock-full of questionable decisions that we need to revisit.", ); } #[test] fn upper_space_chalk() { assert_suggestion_result( "Chalk full of deprecated methods; we should refactor.", ChockFull::default(), "Chock-full of deprecated methods; we should refactor.", ); } #[test] fn upper_space_choke() { assert_suggestion_result( "Choke full of unnecessary complexity; simplify it.", ChockFull::default(), "Chock-full of unnecessary complexity; simplify it.", ); } #[test] fn lower_hyphen_chalk() { assert_suggestion_result( "The code is chalk-full of bugs; we need to debug before release.", ChockFull::default(), "The code is chock-full of bugs; we need to debug before release.", ); } #[test] fn lower_hyphen_choke() { assert_suggestion_result( "The project is choke-full of warnings; we should address them.", ChockFull::default(), "The project is chock-full of warnings; we should address them.", ); } #[test] fn upper_hyphen_chalk() { assert_suggestion_result( "Chalk-full of features, but we only need a few.", ChockFull::default(), "Chock-full of features, but we only need a few.", ); } #[test] fn upper_hyphen_choke() { assert_suggestion_result( "Choke-full of pitfalls; let's consider alternatives.", ChockFull::default(), "Chock-full of pitfalls; let's consider alternatives.", ); } } ================================================ FILE: harper-core/src/linting/closed_compounds.rs ================================================ use crate::linting::LintGroup; use super::MapPhraseLinter; pub fn lint_group() -> LintGroup { let mut group = LintGroup::empty(); macro_rules! add_compound_mappings { ($group:expr, { $($name:expr => ($bad:expr, $good:expr)),+ $(,)? }) => { $( $group.add( $name, Box::new(MapPhraseLinter::new_closed_compound($bad, $good)), ); )+ }; } // These are compound words that should be condensed. // The first column is the name of the rule (which shows up in settings). // The second column is the incorrect form of the word and the third column is the correct // form. add_compound_mappings!(group, { "Anybody" => ("any body", "anybody"), "Anyhow" => ("any how", "anyhow"), "Anywhere" => ("any where", "anywhere"), "Backplane" => ("back plane", "backplane"), "Bypass" => ("by pass", "bypass"), "Chalkboard" => ("chalk board", "chalkboard"), "Deadlift" => ("dead lift", "deadlift"), "Desktop" => ("desk top", "desktop"), "Devops" => ("dev ops", "devops"), "Everybody" => ("every body", "everybody"), "Everyone" => ("every one", "everyone"), "Everywhere" => ("every where", "everywhere"), "Furthermore" => ("further more", "furthermore"), "Henceforth" => ("hence forth", "henceforth"), "However" => ("how ever", "however"), "Insofar" => ("in so far", "insofar"), "Instead" => ("in stead", "instead"), "Intact" => ("in tact", "intact"), "Itself" => ("it self", "itself"), "Keystroke" => ("key stoke", "keystroke"), "Keystrokes" => ("key stokes", "keystrokes"), "Laptop" => ("lap top", "laptop"), "Middleware" => ("middle ware", "middleware"), "Misunderstand" => ("miss understand", "misunderstand"), "Misunderstood" => ("miss understood", "misunderstood"), "Misuse" => ("miss use", "misuse"), "Misused" => ("miss used", "misused"), "Multicore" => ("multi core", "multicore"), "Multimedia" => ("multi media", "multimedia"), "Multithreading" => ("multi threading", "multithreading"), "Myself" => ("my self", "myself"), "Nonetheless" => ("none the less", "nonetheless"), "Nowhere" => ("no where", "nowhere"), "Nothing" => ("no thing", "nothing"), "Notwithstanding" => ("not with standing", "notwithstanding"), "Overall" => ("over all", "overall"), "Overclocking" => ("over clocking", "overclocking"), "Overload" => ("over load", "overload"), "Overnight" => ("over night", "overnight"), "Postpone" => ("post pone", "postpone"), "Proofread" => ("proof read", "proofread"), "Regardless" => ("regard less", "regardless"), "Shortcoming" => ("short coming", "shortcoming"), "Shortcomings" => ("short comings", "shortcomings"), "Somebody" => ("some body", "somebody"), "Somehow" => ("some how", "somehow"), "Someone" => ("some one", "someone"), "Somewhere" => ("some where", "somewhere"), "There" => ("the re", "there"), "Therefore" => ("there fore", "therefore"), "Thereupon" => ("there upon", "thereupon"), "Underclock" => ("under clock", "underclock"), "Upset" => ("up set", "upset"), "Upward" => ("up ward", "upward"), "Whereupon" => ("where upon", "whereupon"), "Widespread" => ("wide spread", "widespread"), "Without" => ("with out", "without"), "Worldwide" => ("world wide", "worldwide"), }); group.set_all_rules_to(Some(true)); group } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::lint_group; #[test] fn it_self() { let test_sentence = "The project, it self, was quite challenging."; let expected = "The project, itself, was quite challenging."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn my_self() { let test_sentence = "He treated my self with respect."; let expected = "He treated myself with respect."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn there_fore() { let test_sentence = "This is the reason; there fore, this is true."; let expected = "This is the reason; therefore, this is true."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn mis_understood() { let test_sentence = "She miss understood the instructions."; let expected = "She misunderstood the instructions."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn mis_use() { let test_sentence = "He tends to miss use the tool."; let expected = "He tends to misuse the tool."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn mis_used() { let test_sentence = "The software was miss used."; let expected = "The software was misused."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn world_wide() { let test_sentence = "The world wide impact was significant."; let expected = "The worldwide impact was significant."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn over_all() { let test_sentence = "The over all performance was good."; let expected = "The overall performance was good."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn how_ever() { let test_sentence = "This is true, how ever, details matter."; let expected = "This is true, however, details matter."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn wide_spread() { let test_sentence = "The news was wide spread throughout the region."; let expected = "The news was widespread throughout the region."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn not_with_standing() { let test_sentence = "They decided to proceed not with standing any further delay."; let expected = "They decided to proceed notwithstanding any further delay."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn any_how() { let test_sentence = "She solved the problem any how, even under pressure."; let expected = "She solved the problem anyhow, even under pressure."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn none_the_less() { let test_sentence = "The results were disappointing, none the less, they continued."; let expected = "The results were disappointing, nonetheless, they continued."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn there_upon() { let test_sentence = "A decision was made there upon reviewing the data."; let expected = "A decision was made thereupon reviewing the data."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn in_so_far() { let test_sentence = "This rule applies in so far as it covers all cases."; let expected = "This rule applies insofar as it covers all cases."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn where_upon() { let test_sentence = "They acted where upon the circumstances allowed."; let expected = "They acted whereupon the circumstances allowed."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn up_ward() { let test_sentence = "The temperature moved up ward during the afternoon."; let expected = "The temperature moved upward during the afternoon."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn hence_forth() { let test_sentence = "All new policies apply hence forth immediately."; let expected = "All new policies apply henceforth immediately."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn regard_less() { let test_sentence = "The decision was made, regard less of the opposition."; let expected = "The decision was made, regardless of the opposition."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn over_night() { let test_sentence = "They set off on their journey over night."; let expected = "They set off on their journey overnight."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn by_pass() { let test_sentence = "Please by pass this check for now."; let expected = "Please bypass this check for now."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn dead_lift() { let test_sentence = "I can dead lift 200 kg."; let expected = "I can deadlift 200 kg."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn chalk_board() { let test_sentence = "The teacher wrote the equation on the chalk board."; let expected = "The teacher wrote the equation on the chalkboard."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn key_stoke() { let test_sentence = "Use this key stoke to open search."; let expected = "Use this keystroke to open search."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn in_tact() { let test_sentence = "The code remains in tact after the merge."; let expected = "The code remains intact after the merge."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn intact_is_allowed() { assert_no_lints("The data set remains intact.", lint_group()); } #[test] fn key_stokes() { let test_sentence = "These key stokes are hard to memorize."; let expected = "These keystrokes are hard to memorize."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn with_out() { let test_sentence = "We left with out a map."; let expected = "We left without a map."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn the_re() { let test_sentence = "The re are too many popups on this page."; let expected = "There are too many popups on this page."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn short_coming() { let test_sentence = "That bug is a short coming in the current release."; let expected = "That bug is a shortcoming in the current release."; assert_suggestion_result(test_sentence, lint_group(), expected); } #[test] fn short_comings() { let test_sentence = "We listed three short comings in the postmortem."; let expected = "We listed three shortcomings in the postmortem."; assert_suggestion_result(test_sentence, lint_group(), expected); } } ================================================ FILE: harper-core/src/linting/comma_fixes.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::{ Span, TokenKind::{Space, Unlintable, Word}, TokenStringExt, }; const MSG_SPACE_BEFORE: &str = "Don't use a space before a comma."; const MSG_AVOID_ASIAN: &str = "Avoid East Asian commas in English contexts."; const MSG_SPACE_AFTER: &str = "Use a space after a comma."; /// A linter that fixes common comma errors: /// No space after. /// Inappropriate space before. /// Asian commas instead of English commas. /// This linter only Asian commas anywhere, and wrong spacing of commas between words. /// Commas between numbers are used differently in different contexts and these are not checked: /// Lists of numbers: 1, 2, 3 /// Thousands separators: 1,000,000 /// Decimal points used mistakenly by Europeans: 3,14159 #[derive(Debug, Default)] pub struct CommaFixes; impl Linter for CommaFixes { fn lint(&mut self, document: &crate::Document) -> Vec { let mut lints = Vec::new(); let source = document.get_source(); for ci in document.iter_comma_indices() { let mut toks = (None, None, document.get_token(ci).unwrap(), None, None); toks.0 = (ci >= 2).then(|| document.get_token(ci - 2).unwrap()); toks.1 = (ci >= 1).then(|| document.get_token(ci - 1).unwrap()); toks.3 = document.get_token(ci + 1); toks.4 = document.get_token(ci + 2); let kinds = ( toks.0.map(|t| &t.kind), toks.1.map(|t| &t.kind), *toks.2.span.get_content(source).first().unwrap(), toks.3.map(|t| &t.kind), toks.4.map(|t| &t.kind), ); let (span, suggestion, message) = match kinds { (_, Some(Word(_)), '、' | ',', Some(Space(_)), Some(Word(_))) => ( toks.2.span, Suggestion::ReplaceWith(vec![',']), vec![MSG_AVOID_ASIAN], ), (Some(Word(_)), Some(Space(_)), ',', Some(Space(_)), Some(Word(_))) => ( toks.1.unwrap().span, Suggestion::Remove, vec![MSG_SPACE_BEFORE], ), (Some(Word(_)), Some(Space(_)), '、' | ',', Some(Space(_)), Some(Word(_))) => ( Span::new(toks.1.unwrap().span.start, toks.2.span.end), Suggestion::ReplaceWith(vec![',']), vec![MSG_SPACE_BEFORE, MSG_AVOID_ASIAN], ), (_, Some(Word(_)), ',', Some(Word(_)), _) => ( toks.2.span, Suggestion::InsertAfter(vec![' ']), vec![MSG_SPACE_AFTER], ), (_, Some(Word(_)), '、' | ',', Some(Word(_)), _) => ( toks.2.span, Suggestion::ReplaceWith(vec![',', ' ']), vec![MSG_AVOID_ASIAN, MSG_SPACE_AFTER], ), (Some(Word(_)), Some(Space(_)), ',', Some(Word(_)), _) => ( Span::new(toks.1.unwrap().span.start, toks.2.span.end), Suggestion::ReplaceWith(vec![',', ' ']), vec![MSG_SPACE_BEFORE, MSG_SPACE_AFTER], ), (Some(Word(_)), Some(Space(_)), '、' | ',', Some(Word(_)), _) => ( Span::new(toks.1.unwrap().span.start, toks.2.span.end), Suggestion::ReplaceWith(vec![',', ' ']), vec![MSG_SPACE_BEFORE, MSG_AVOID_ASIAN, MSG_SPACE_AFTER], ), // Handles Asian commas in all other contexts // Unlintable is used for non-English tokens to prevent changing commas in CJK text (_, Some(Unlintable), '、' | ',', _, _) => continue, (_, _, '、' | ',', Some(Unlintable), _) => continue, (_, _, '、' | ',', _, _) => ( toks.2.span, Suggestion::ReplaceWith(vec![',']), vec![MSG_AVOID_ASIAN], ), _ => continue, }; lints.push(Lint { span, lint_kind: LintKind::Punctuation, suggestions: vec![suggestion], message: message.join(" "), priority: 32, }); } lints } fn description(&self) -> &'static str { "Fix common comma errors such as no space after, erroneous space before, etc., Asian commas instead of English commas, etc." } } #[cfg(test)] mod tests { use super::CommaFixes; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn allows_english_comma_atomic() { assert_lint_count(",", CommaFixes, 0); } #[test] fn flags_fullwidth_comma_atomic() { assert_lint_count(",", CommaFixes, 1); } #[test] fn flags_ideographic_comma_atomic() { assert_lint_count("、", CommaFixes, 1); } #[test] fn corrects_fullwidth_comma_real_world() { assert_suggestion_result( "higher 2 bits of the number of nodes, whether abandoned or not decided by .index section", CommaFixes, "higher 2 bits of the number of nodes, whether abandoned or not decided by .index section", ); } #[test] fn corrects_ideographic_comma_real_world() { assert_suggestion_result("cout、endl、string", CommaFixes, "cout, endl, string") } #[test] fn doesnt_flag_comma_space_between_words() { assert_lint_count("foo, bar", CommaFixes, 0); } #[test] fn flags_fullwidth_comma_space_between_words() { assert_lint_count("foo, bar", CommaFixes, 1); } #[test] fn flags_ideographic_comma_space_between_words() { assert_lint_count("foo、 bar", CommaFixes, 1); } #[test] fn doesnt_flag_semicolon_space_between_words() { assert_lint_count("foo; bar", CommaFixes, 0); } #[test] fn corrects_comma_between_words_with_no_space() { assert_suggestion_result("foo,bar", CommaFixes, "foo, bar") } #[test] fn corrects_asian_comma_between_words_with_no_space() { assert_suggestion_result("foo,bar", CommaFixes, "foo, bar") } #[test] fn corrects_space_on_wrong_side_of_comma_between_words() { assert_suggestion_result("foo ,bar", CommaFixes, "foo, bar") } #[test] fn corrects_comma_on_wrong_side_of_asian_comma_between_words() { assert_suggestion_result("foo ,bar", CommaFixes, "foo, bar") } #[test] fn corrects_comma_between_words_with_space_on_both_sides() { assert_suggestion_result("foo , bar", CommaFixes, "foo, bar") } #[test] fn corrects_asian_comma_between_words_with_space_on_both_sides() { assert_suggestion_result("foo 、 bar", CommaFixes, "foo, bar") } #[test] fn doesnt_correct_comma_between_non_english_tokens() { assert_lint_count("严禁采摘花、 果、叶,挖掘树根、草药!", CommaFixes, 0); } #[test] fn issue_2233() { assert_no_lints( "In foobar, apple is a fruit, and \"beer\" is not a fruit.", CommaFixes, ); } } ================================================ FILE: harper-core/src/linting/compound_nouns/compound_noun_after_det_adj.rs ================================================ use crate::expr::All; use crate::expr::Expr; use crate::expr::MergeableWords; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::patterns::InflectionOfBe; use crate::{CharStringExt, TokenStringExt, linting::ExprLinter}; use super::{Lint, LintKind, Suggestion, is_content_word, predicate}; use crate::linting::expr_linter::Chunk; use crate::{Lrc, Token}; /// Two adjacent words separated by whitespace that if joined would be a valid noun. pub struct CompoundNounAfterDetAdj { expr: Box, split_expr: Lrc, } // This heuristic identifies potential compound nouns by: // 1. Looking for a determiner or adjective (e.g., "a", "big", "red") // 2. Followed by two content words (not determiners, adverbs, or prepositions) // 3. Finally, checking if the combination forms a noun in the dictionary // that is not also an adjective impl Default for CompoundNounAfterDetAdj { fn default() -> Self { let context_expr = SequenceExpr::with(|tok: &Token, src: &[char]| { tok.kind.is_determiner() || (tok.kind.is_adjective() && *tok.span.get_content(src).to_lower() != ['g', 'o']) }) .t_ws() .then(is_content_word) .t_ws() .then(is_content_word.and_not(InflectionOfBe::default())); let split_expr = Lrc::new(MergeableWords::new(|meta_closed, meta_open| { predicate(meta_closed, meta_open) })); let mut expr = All::default(); expr.add(context_expr); expr.add(SequenceExpr::anything().t_any().then(split_expr.clone())); Self { expr: Box::new(expr), split_expr, } } } impl ExprLinter for CompoundNounAfterDetAdj { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { if matched_tokens .first()? .span .get_content(source) .eq_ignore_ascii_case_str("that") { return None; } let span = matched_tokens[2..].span()?; let orig = span.get_content(source); // If the pattern matched, this will not return `None`. let word = self.split_expr .get_merged_word(&matched_tokens[2], &matched_tokens[4], source)?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case(word.to_vec(), orig)], message: format!( "Did you mean the closed compound noun “{}”?", word.to_string() ), priority: 63, }) } fn description(&self) -> &str { "Detects compound nouns split by a space and suggests merging them when both parts form a valid noun. Has checks to avoid erroneous cases." } } ================================================ FILE: harper-core/src/linting/compound_nouns/compound_noun_after_possessive.rs ================================================ use crate::expr::All; use crate::expr::Expr; use crate::expr::MergeableWords; use crate::expr::SequenceExpr; use crate::{CharStringExt, Lrc, TokenStringExt, linting::ExprLinter}; use super::{Lint, LintKind, Suggestion, is_content_word, predicate}; use crate::linting::expr_linter::Chunk; use crate::Token; /// Looks for closed compound nouns which can be condensed due to their position after a /// possessive noun (which implies ownership). /// See also: /// harper-core/src/linting/lets_confusion/mod.rs /// harper-core/src/linting/lets_confusion/let_us_redundancy.rs /// harper-core/src/linting/lets_confusion/no_contraction_with_verb.rs /// harper-core/src/linting/pronoun_contraction/should_contract.rs pub struct CompoundNounAfterPossessive { expr: Box, split_pattern: Lrc, } impl Default for CompoundNounAfterPossessive { fn default() -> Self { let context_pattern = SequenceExpr::default() .then_possessive_nominal() .t_ws() .then(is_content_word) .t_ws() .then(is_content_word); let split_pattern = Lrc::new(MergeableWords::new(|meta_closed, meta_open| { predicate(meta_closed, meta_open) })); let mut pattern = All::default(); pattern.add(context_pattern); pattern.add(SequenceExpr::anything().t_any().then(split_pattern.clone())); Self { expr: Box::new(pattern), split_pattern, } } } impl ExprLinter for CompoundNounAfterPossessive { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { // "Let's" can technically be a possessive noun (of a lease, or a let in tennis, etc.) // but in practice it's almost always a contraction of "let us" before a verb // or a mistake for "lets", the 3rd person singular present form of "to let". let word_apostrophe_s = matched_tokens[0] .span .get_content_string(source) .to_lowercase() .replace('’', "'"); if word_apostrophe_s == "let's" || word_apostrophe_s == "that's" { return None; } let span = matched_tokens[2..].span()?; // If the pattern matched, this will not return `None`. let word = self.split_pattern .get_merged_word(&matched_tokens[2], &matched_tokens[4], source)?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(word.to_vec())], message: format!( "The possessive noun implies ownership of the closed compound noun “{}”.", word.to_string() ), priority: 63, }) } fn description(&self) -> &str { "Detects split compound nouns following a possessive noun and suggests merging them." } } #[cfg(test)] mod tests { use super::CompoundNounAfterPossessive; use crate::linting::tests::assert_lint_count; #[test] fn lets_is_not_possessive() { assert_lint_count( "Let's check out this article.", CompoundNounAfterPossessive::default(), 0, ); } #[test] fn lets_is_not_possessive_typographic_apostrophe() { assert_lint_count( "“Let’s go on with the game,” the Queen said to Alice;", CompoundNounAfterPossessive::default(), 0, ) } #[test] fn thats_is_not_possessive() { assert_lint_count( "And you might not be thinking that that's a very big issue, but ...", CompoundNounAfterPossessive::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/compound_nouns/compound_noun_before_aux_verb.rs ================================================ use crate::expr::All; use crate::expr::Expr; use crate::expr::MergeableWords; use crate::expr::SequenceExpr; use crate::{CharStringExt, Lrc, TokenStringExt, linting::ExprLinter}; use super::{Lint, LintKind, Suggestion, is_content_word, predicate}; use crate::Token; use crate::linting::expr_linter::Chunk; /// Two adjacent words separated by whitespace that if joined would be a valid noun. pub struct CompoundNounBeforeAuxVerb { expr: Box, split_pattern: Lrc, } impl Default for CompoundNounBeforeAuxVerb { fn default() -> Self { let context_pattern = SequenceExpr::with(is_content_word) .t_ws() .then(is_content_word) .then_auxiliary_verb(); let split_pattern = Lrc::new(MergeableWords::new(|meta_closed, meta_open| { predicate(meta_closed, meta_open) })); let mut expr = All::default(); expr.add(context_pattern); expr.add(SequenceExpr::with(split_pattern.clone()).t_any().t_any()); Self { expr: Box::new(expr), split_pattern, } } } impl ExprLinter for CompoundNounBeforeAuxVerb { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens[0..3].span()?; let orig = span.get_content(source); // If the pattern matched, this will not return `None`. let word = self.split_pattern .get_merged_word(&matched_tokens[0], &matched_tokens[2], source)?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case(word.to_vec(), orig)], message: format!( "The auxiliary verb “{}” implies the existence of the closed compound noun “{}”.", matched_tokens[4].span.get_content(source).to_string(), word.to_string() ), priority: 63, }) } fn description(&self) -> &str { "Detects split compound nouns preceding an action and suggests merging them." } } ================================================ FILE: harper-core/src/linting/compound_nouns/mod.rs ================================================ mod compound_noun_after_det_adj; mod compound_noun_after_possessive; mod compound_noun_before_aux_verb; use super::{Lint, LintKind, Suggestion, merge_linters::merge_linters}; use crate::{CharStringExt, DictWordMetadata, Token}; // Helper function to check if a token is a content word (not a function word) pub(crate) fn is_content_word(tok: &Token, src: &[char]) -> bool { let Some(Some(meta)) = tok.kind.as_word() else { return false; }; tok.span.len() > 1 && (meta.is_noun() || meta.is_adjective() || meta.is_verb() || meta.is_adverb()) && !(meta.is_determiner() || meta.is_conjunction()) && (!meta.preposition || tok.span.get_content(src).eq_ignore_ascii_case_str("bar")) } pub(crate) fn predicate( closed: Option<&DictWordMetadata>, open: Option<&DictWordMetadata>, ) -> bool { open.is_none() && closed.is_some_and(|m| m.is_noun() && !m.is_proper_noun()) } use compound_noun_after_det_adj::CompoundNounAfterDetAdj; use compound_noun_after_possessive::CompoundNounAfterPossessive; use compound_noun_before_aux_verb::CompoundNounBeforeAuxVerb; merge_linters!(CompoundNouns => CompoundNounAfterDetAdj, CompoundNounBeforeAuxVerb, CompoundNounAfterPossessive => "Detects compound nouns split by a space and suggests merging them when both parts form a valid noun." ); #[cfg(test)] mod tests { use super::CompoundNouns; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn web_cam() { let test_sentence = "The web cam captured a stunning image."; let expected = "The webcam captured a stunning image."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn note_book() { let test_sentence = "She always carries a note book to jot down ideas."; let expected = "She always carries a notebook to jot down ideas."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn mother_board() { let test_sentence = "After the upgrade, the mother board was replaced."; let expected = "After the upgrade, the motherboard was replaced."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn smart_phone() { let test_sentence = "He bought a new smart phone last week."; let expected = "He bought a new smartphone last week."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn firm_ware() { let test_sentence = "The device's firm ware was updated overnight."; let expected = "The device's firmware was updated overnight."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn back_plane() { let test_sentence = "A reliable back plane is essential for high-speed data transfer."; let expected = "A reliable backplane is essential for high-speed data transfer."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn spread_sheet() { let test_sentence = "The accountant reviewed the spread sheet carefully."; let expected = "The accountant reviewed the spreadsheet carefully."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn side_bar() { let test_sentence = "The website's side bar offers quick navigation links."; let expected = "The website's sidebar offers quick navigation links."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn back_pack() { let test_sentence = "I packed my books in my back pack before leaving."; let expected = "I packed my books in my backpack before leaving."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn cup_board() { let test_sentence = "She stored the dishes in the old cup board."; let expected = "She stored the dishes in the old cupboard."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn key_board() { let test_sentence = "My key board stopped working during the meeting."; let expected = "My keyboard stopped working during the meeting."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn touch_screen() { let test_sentence = "The device features a responsive touch screen."; let expected = "The device features a responsive touchscreen."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn head_set() { let test_sentence = "He bought a new head set for his workouts."; let expected = "He bought a new headset for his workouts."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn frame_work() { let test_sentence = "The frame work of the app was built with care."; let expected = "The framework of the app was built with care."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn touch_pad() { let test_sentence = "The touch pad on my laptop is very sensitive."; let expected = "The touchpad on my laptop is very sensitive."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn micro_processor() { let test_sentence = "This micro processor is among the fastest available."; let expected = "This microprocessor is among the fastest available."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn head_phone() { let test_sentence = "I lost my head phone at the gym."; let expected = "I lost my headphone at the gym."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn micro_services() { let test_sentence = "Our architecture now relies on micro services."; let expected = "Our architecture now relies on microservices."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn dash_board() { let test_sentence = "The dash board shows real-time analytics."; let expected = "The dashboard shows real-time analytics."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn site_map() { let test_sentence = "A site map is provided at the footer of the website."; let expected = "A sitemap is provided at the footer of the website."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn fire_wall() { let test_sentence = "A robust fire wall is essential for network security."; let expected = "A robust firewall is essential for network security."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn bit_stream() { let test_sentence = "The bit stream was interrupted during transmission."; let expected = "The bitstream was interrupted during transmission."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn block_chain() { let test_sentence = "The block chain is revolutionizing the financial sector."; let expected = "The blockchain is revolutionizing the financial sector."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn thumb_nail() { let test_sentence = "I saved the image as a thumb nail."; let expected = "I saved the image as a thumbnail."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn bath_room() { let test_sentence = "They remodeled the bath room entirely."; let expected = "They remodeled the bathroom entirely."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] #[ignore = "\"everyone\" is not a valid compound noun, it's a pronoun"] fn every_one() { let test_sentence = "Every one should have access to quality education."; let expected = "Everyone should have access to quality education."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn play_ground() { let test_sentence = "The kids spent the afternoon at the play ground."; let expected = "The kids spent the afternoon at the playground."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn run_way() { let test_sentence = "The airplane taxied along the run way."; let expected = "The airplane taxied along the runway."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn cyber_space() { let test_sentence = "Hackers roam the cyber space freely."; let expected = "Hackers roam the cyberspace freely."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn cyber_attack() { let test_sentence = "The network was hit by a cyber attack."; let expected = "The network was hit by a cyberattack."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn web_socket() { let test_sentence = "Real-time updates are sent via a web socket."; let expected = "Real-time updates are sent via a websocket."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn finger_print() { let test_sentence = "The detective collected a finger print as evidence."; let expected = "The detective collected a fingerprint as evidence."; assert_suggestion_result(test_sentence, CompoundNouns::default(), expected); } #[test] fn got_is_not_possessive() { assert_lint_count("I got here by car...", CompoundNouns::default(), 0); } #[test] fn allow_issue_662() { assert_lint_count( "They are as old as *modern* computers ", CompoundNouns::default(), 0, ); } #[test] fn allow_issue_661() { assert_lint_count("I may be wrong.", CompoundNouns::default(), 0); } #[test] fn allow_issue_704() { assert_lint_count( "Here are some ways to do that:", CompoundNouns::default(), 0, ); } #[test] fn allows_issue_721() { assert_lint_count( "So if you adjust any one of these adjusters that can have a negative or a positive effect.", CompoundNouns::default(), 0, ); } #[test] fn allows_678() { assert_lint_count( "they can't catch all the bugs.", CompoundNouns::default(), 0, ); } #[test] fn ina_not_suggested() { assert_lint_count( "past mistakes or a character in a looping reality facing personal challenges.", CompoundNouns::default(), 0, ); } #[test] fn allow_suppress_or() { assert_lint_count( "He must decide whether to suppress or coexist with his doppelgänger.", CompoundNouns::default(), 0, ); } #[test] fn allow_an_arm_and_a_leg() { assert_lint_count( "I have to pay an arm and a leg get a worker to come and be my assistant baker.", CompoundNouns::default(), 0, ); } #[test] fn allow_well_and_723() { assert_lint_count( "I understood very well and decided to go.", CompoundNouns::default(), 0, ); } #[test] fn allow_can_not() { assert_lint_count("Size can not be determined.", CompoundNouns::default(), 0); } #[test] fn dont_flag_lot_to() { assert_lint_count( "but you'd have to raise taxes a lot to do it.", CompoundNouns::default(), 0, ); } #[test] fn dont_flag_to_me() { assert_lint_count( "There's no massive damage to the rockers or anything that to me would indicate that like the whole front of the car was off", CompoundNouns::default(), 0, ); } #[test] fn allow_issue_1553() { assert_no_lints( "I'm not sure if there's anyone else that may be interested in more fine-grained control, but as it stands, having the domain level toggle is sufficient for me.", CompoundNouns::default(), ); } #[test] fn allow_issue_1496() { assert_no_lints( "I am not able to respond to messages.", CompoundNouns::default(), ); } #[test] fn allow_issue_1298() { assert_no_lints( "A series of tests that cover all possible cases.", CompoundNouns::default(), ); } #[test] fn dont_flag_project_or() { assert_no_lints( "You can star or watch this project or follow author to get release notifications in time.", CompoundNouns::default(), ); } } ================================================ FILE: harper-core/src/linting/compound_subject_i.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, expr::{AnchorStart, Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; const POSSESSIVE_DETERMINERS: &[&str] = &["my", "your", "her", "his", "their", "our"]; pub struct CompoundSubjectI { expr: SequenceExpr, } impl Default for CompoundSubjectI { fn default() -> Self { let expr = SequenceExpr::with(AnchorStart) .then_optional( SequenceExpr::default() .then_quote() .then_optional(SequenceExpr::default().t_ws()), ) .then_optional( SequenceExpr::default() .then_punctuation() .then_optional(SequenceExpr::default().t_ws()), ) .then_word_set(POSSESSIVE_DETERMINERS) .t_ws() .then_nominal() .t_ws() .t_aco("and") .t_ws() .t_aco("me") .t_ws() .then_kind_either(TokenKind::is_verb, TokenKind::is_auxiliary_verb); Self { expr } } } impl ExprLinter for CompoundSubjectI { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let pronoun = matched_tokens.iter().find(|tok| { tok.kind.is_word() && tok .span .get_content_string(source) .eq_ignore_ascii_case("me") })?; Some(Lint { span: pronoun.span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::ReplaceWith("I".chars().collect())], message: "Use `I` when this pronoun is part of a compound subject.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Promotes `I` in compound subjects headed by a possessive determiner." } } #[cfg(test)] mod tests { use super::CompoundSubjectI; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_my_mother_and_me() { assert_suggestion_result( "My mother and me went to California.", CompoundSubjectI::default(), "My mother and I went to California.", ); } #[test] fn corrects_my_brother_and_me() { assert_suggestion_result( "My brother and me would often go to the cinema.", CompoundSubjectI::default(), "My brother and I would often go to the cinema.", ); } #[test] fn corrects_your_friend_and_me() { assert_suggestion_result( "Your friend and me are heading out.", CompoundSubjectI::default(), "Your friend and I are heading out.", ); } #[test] fn corrects_her_manager_and_me() { assert_suggestion_result( "Her manager and me have talked about it.", CompoundSubjectI::default(), "Her manager and I have talked about it.", ); } #[test] fn corrects_his_cat_and_me() { assert_suggestion_result( "His cat and me were inseparable.", CompoundSubjectI::default(), "His cat and I were inseparable.", ); } #[test] fn corrects_their_kids_and_me() { assert_suggestion_result( "Their kids and me will play outside.", CompoundSubjectI::default(), "Their kids and I will play outside.", ); } #[test] fn corrects_our_neighbor_and_me() { assert_suggestion_result( "Our neighbor and me can help tomorrow.", CompoundSubjectI::default(), "Our neighbor and I can help tomorrow.", ); } #[test] fn corrects_with_quote_prefix() { assert_suggestion_result( "\"My mother and me went to California,\" she said.", CompoundSubjectI::default(), "\"My mother and I went to California,\" she said.", ); } #[test] fn corrects_all_caps() { assert_suggestion_result( "MY BROTHER AND ME WILL HANDLE IT.", CompoundSubjectI::default(), "MY BROTHER AND I WILL HANDLE IT.", ); } #[test] fn ignores_between_you_and_me() { assert_lint_count( "Between you and me, this stays here.", CompoundSubjectI::default(), 0, ); } #[test] fn ignores_comma_after_me() { assert_lint_count( "My mother and me, as usual, went to the park.", CompoundSubjectI::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/confident.rs ================================================ use crate::expr::Expr; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{Token, patterns::Word}; use super::{ExprLinter, Lint, LintKind, Suggestion}; pub struct Confident { expr: SequenceExpr, } impl Default for Confident { fn default() -> Self { let pattern = SequenceExpr::with( SequenceExpr::from(|tok: &Token, _source: &[char]| { tok.kind.is_verb() || tok.kind.is_determiner() }) .or(Word::new("very")), ) .then_whitespace() .t_aco("confidant"); Self { expr: pattern } } } impl ExprLinter for Confident { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let span = matched_tokens.last()?.span; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith("confident".chars().collect())], message: "Use the adjective.".to_owned(), priority: 127, }) } fn description(&self) -> &'static str { "This linter detects instances where the noun `confidant` is incorrectly used in place of the adjective `confident`. `Confidant` refers to a trusted person, whereas `confident` describes certainty or self-assurance. The rule suggests replacing `confidant` with `confident` when used in an adjectival context." } } #[cfg(test)] mod tests { use super::Confident; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn describing_person_incorrect() { assert_suggestion_result( "She felt confidant about her presentation.", Confident::default(), "She felt confident about her presentation.", ); } #[test] fn describing_person_correct() { assert_lint_count( "She felt confident about her presentation.", Confident::default(), 0, ); } #[test] fn certainty_incorrect() { assert_suggestion_result( "I am confidant the test results are accurate.", Confident::default(), "I am confident the test results are accurate.", ); } #[test] fn certainty_correct() { assert_lint_count( "I am confident the test results are accurate.", Confident::default(), 0, ); } #[test] fn demeanor_incorrect() { assert_suggestion_result( "He walked to the stage with a confidant stride.", Confident::default(), "He walked to the stage with a confident stride.", ); } #[test] fn demeanor_correct() { assert_lint_count( "He walked to the stage with a confident stride.", Confident::default(), 0, ); } #[test] fn professional_incorrect() { assert_suggestion_result( "You should sound confidant during job interviews.", Confident::default(), "You should sound confident during job interviews.", ); } #[test] fn professional_correct() { assert_lint_count( "You should sound confident during job interviews.", Confident::default(), 0, ); } #[test] fn assured_tone_incorrect() { assert_suggestion_result( "Present your argument in a confidant, persuasive manner.", Confident::default(), "Present your argument in a confident, persuasive manner.", ); } #[test] fn assured_tone_correct() { assert_lint_count( "Present your argument in a confident, persuasive manner.", Confident::default(), 0, ); } #[test] fn extra_text_between() { assert_suggestion_result( "She felt very confidant about her presentation.", Confident::default(), "She felt very confident about her presentation.", ); } #[test] fn linking_verb_was_confidant() { assert_suggestion_result( "She was confidant about her presentation.", Confident::default(), "She was confident about her presentation.", ); } } ================================================ FILE: harper-core/src/linting/correct_number_suffix.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::{Document, OrdinalSuffix, Span, TokenKind}; use crate::{Number, TokenStringExt}; /// Detect incorrect number suffix (e.g. "2st"). #[derive(Debug, Clone, Copy, Default)] pub struct CorrectNumberSuffix; impl Linter for CorrectNumberSuffix { fn lint(&mut self, document: &Document) -> Vec { let mut output = Vec::new(); for number_tok in document.iter_numbers() { let Some(suffix_span) = Span::new_with_len(number_tok.span.end, 2).pulled_by(2) else { continue; }; if let TokenKind::Number(Number { value, suffix: Some(suffix), .. }) = number_tok.kind && let Some(correct_suffix) = OrdinalSuffix::correct_suffix_for(value) && suffix != correct_suffix { output.push(Lint { span: suffix_span, lint_kind: LintKind::Miscellaneous, message: "This number needs a different suffix to sound right.".to_string(), suggestions: vec![Suggestion::ReplaceWith(correct_suffix.to_chars().to_vec())], ..Default::default() }) } } output } fn description(&self) -> &'static str { "When making quick edits, it is common for authors to change the value of a number without changing its suffix. This rule looks for these cases, for example: `2st`." } } #[cfg(test)] mod tests { use super::CorrectNumberSuffix; use crate::linting::tests::assert_lint_count; #[test] fn passes_correct_cases() { assert_lint_count("2nd", CorrectNumberSuffix, 0); assert_lint_count("101st", CorrectNumberSuffix, 0); assert_lint_count("1012th", CorrectNumberSuffix, 0); } #[test] fn detects_incorrect_cases() { assert_lint_count("2st", CorrectNumberSuffix, 1); assert_lint_count("101nd", CorrectNumberSuffix, 1); assert_lint_count("1012rd", CorrectNumberSuffix, 1); } } ================================================ FILE: harper-core/src/linting/criteria_phenomena.rs ================================================ use super::Suggestion; use super::expr_linter::ExprLinter; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::LintKind; use crate::linting::expr_linter::Chunk; use crate::patterns::WordSet; use crate::{Lint, Lrc, Token, TokenStringExt}; /// Linter that checks if 'criteria' or 'phenomena' is used as singular. pub struct CriteriaPhenomena { expr: SequenceExpr, plural_words: Lrc, singular_modifiers: Lrc, } impl CriteriaPhenomena { fn new() -> Self { let plural_words = Lrc::new(WordSet::new(&["criteria", "phenomena"])); let singular_modifiers = Lrc::new(WordSet::new(&["this", "that", "a", "one"])); Self { expr: SequenceExpr::with(singular_modifiers.clone()) .then_whitespace() .then(plural_words.clone()), plural_words, singular_modifiers, } } } impl ExprLinter for CriteriaPhenomena { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let mut second_word: String = matched_tokens[2] .span .get_content(source) .iter() .copied() .collect(); second_word.make_ascii_lowercase(); let suggestions = match second_word.as_str() { "criteria" => vec![Suggestion::ReplaceWith("criterion".chars().collect())], "phenomena" => vec![Suggestion::ReplaceWith("phenomenon".chars().collect())], _ => panic!("Don't know what to say about '{second_word}'!"), }; Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Repetition, message: "You used a plural noun as singular.".to_owned(), priority: 63, suggestions, }) } fn description(&self) -> &'static str { "The words “criteria” and “phenomena” are the plurals of “criterion” and “phenomenon”, respectively. They are often incorrectly used as singular." } } impl Default for CriteriaPhenomena { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::CriteriaPhenomena; use crate::linting::tests::assert_lint_count; #[test] fn can_detect_incorrect_criteria() { assert_lint_count( "...One criteria is essential...", CriteriaPhenomena::new(), 1, ) } #[test] fn can_detect_incorrect_phenomena() { assert_lint_count( "...I would like to see that phenomena.", CriteriaPhenomena::new(), 1, ) } #[test] fn allows_correct_criteria() { assert_lint_count( "...She disagrees with those criteria.", CriteriaPhenomena::new(), 0, ) } #[test] fn allows_correct_phenomena() { assert_lint_count( "...Many phenomena were on display.", CriteriaPhenomena::new(), 0, ) } } ================================================ FILE: harper-core/src/linting/cure_for.rs ================================================ use crate::{ Span, Token, expr::{Expr, SequenceExpr}, linting::expr_linter::Chunk, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::DerivedFrom, }; pub struct CureFor { expr: SequenceExpr, } impl Default for CureFor { fn default() -> Self { let expr = SequenceExpr::with(DerivedFrom::new_from_str("cure")) .t_ws() .t_aco("against"); Self { expr } } } impl ExprLinter for CureFor { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let against = matched_tokens.last()?; let template: Vec = against.span.get_content(source).to_vec(); let suggestion = Suggestion::replace_with_match_case_str("for", &template); Some(Lint { span: Span::new(against.span.start, against.span.end), lint_kind: LintKind::Usage, suggestions: vec![suggestion], message: "Prefer `cure for` when describing a treatment target.".to_owned(), priority: 31, }) } fn description(&self) -> &str { "Flags `cure against` and prefers the standard `cure for` pairing." } } #[cfg(test)] mod tests { use super::CureFor; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_simple_cure_against() { assert_suggestion_result( "Researchers sought a cure against the stubborn illness.", CureFor::default(), "Researchers sought a cure for the stubborn illness.", ); } #[test] fn corrects_plural_cures_against() { assert_suggestion_result( "Doctors insist this serum cures against the new variant.", CureFor::default(), "Doctors insist this serum cures for the new variant.", ); } #[test] fn corrects_past_participle_cured_against() { assert_suggestion_result( "The remedy was cured against the infection last spring.", CureFor::default(), "The remedy was cured for the infection last spring.", ); } #[test] fn corrects_uppercase_against() { assert_suggestion_result( "We still trust the cure AGAINST the dreaded plague.", CureFor::default(), "We still trust the cure FOR the dreaded plague.", ); } #[test] fn corrects_at_sentence_start() { assert_suggestion_result( "Cure against that condition became the rallying cry.", CureFor::default(), "Cure for that condition became the rallying cry.", ); } #[test] fn does_not_flag_cure_for() { assert_lint_count( "They finally found a cure for the fever.", CureFor::default(), 0, ); } #[test] fn does_not_flag_cure_from() { assert_lint_count( "A cure from this rare herb is on the horizon.", CureFor::default(), 0, ); } #[test] fn does_not_flag_with_comma() { assert_lint_count( "A cure, against all odds, appeared in the files.", CureFor::default(), 0, ); } #[test] fn does_not_flag_unrelated_against() { assert_lint_count( "Travelers stand against the roaring wind on the cliffs.", CureFor::default(), 0, ); } #[test] fn does_not_flag_secure_against() { assert_lint_count( "The fortress stayed secure against the invaders.", CureFor::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/currency_placement.rs ================================================ use itertools::Itertools; use crate::{Document, Span, Token, TokenStringExt, remove_overlaps}; use super::{Lint, LintKind, Linter, Suggestion}; #[derive(Debug, Default)] pub struct CurrencyPlacement {} impl Linter for CurrencyPlacement { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for chunk in document.iter_chunks() { for (a, b) in chunk.iter().tuple_windows() { lints.extend(generate_lint_for_tokens(a, b, document)); } for (p, a, b, c) in chunk.iter().tuple_windows() { if !b.kind.is_whitespace() || p.kind.is_currency() { continue; } lints.extend(generate_lint_for_tokens(a, c, document)); } } remove_overlaps(&mut lints); lints } fn description(&self) -> &str { "The location of currency symbols varies by country. The rule looks for and corrects improper positioning." } } // Given two tokens that may have an error, check if they do and create a [`Lint`]. fn generate_lint_for_tokens(a: &Token, b: &Token, document: &Document) -> Option { let punct = a.kind.as_punctuation().or(b.kind.as_punctuation())?; let currency = punct.as_currency()?; let number = a.kind.as_number().or(b.kind.as_number())?; let span = Span::new(a.span.start, b.span.end); let correct: Vec<_> = currency.format_amount(number).chars().collect(); let actual = document.get_span_content(&span); if correct != actual { Some(Lint { span, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::ReplaceWith(correct)], message: "The position of the currency symbol matters.".to_string(), priority: 63, }) } else { None } } #[cfg(test)] mod tests { use crate::linting::tests::{ assert_lint_count, assert_markdown_suggestion_result, assert_suggestion_result, }; use super::CurrencyPlacement; #[test] fn eof() { assert_suggestion_result( "It was my last bill worth more than 4$.", CurrencyPlacement::default(), "It was my last bill worth more than $4.", ); } #[test] fn blog_title_allows_correct() { assert_lint_count("The Best $25 I Ever Spent", CurrencyPlacement::default(), 0); } #[test] fn blog_title() { assert_suggestion_result( "The Best 25$ I Ever Spent", CurrencyPlacement::default(), "The Best $25 I Ever Spent", ); } #[test] fn blog_title_cents() { assert_suggestion_result( "The Best ¢25 I Ever Spent", CurrencyPlacement::default(), "The Best 25¢ I Ever Spent", ); } #[test] fn blog_title_with_space() { assert_suggestion_result( "The Best 25 $ I Ever Spent", CurrencyPlacement::default(), "The Best $25 I Ever Spent", ); } #[test] fn multiple_dollar_markdown() { assert_markdown_suggestion_result( "They were either 25\\$ 24\\$ or 23\\$.", CurrencyPlacement::default(), "They were either $25 $24 or $23.", ); } #[test] fn multiple_dollar_plain_english() { assert_suggestion_result( "They were either 25$ 24$ or 23$.", CurrencyPlacement::default(), "They were either $25 $24 or $23.", ); } #[test] fn multiple_pound() { assert_suggestion_result( "They were either 25£ 24£ or 23£.", CurrencyPlacement::default(), "They were either £25 £24 or £23.", ); } #[test] fn suffix() { assert_suggestion_result( "It was my 20th$.", CurrencyPlacement::default(), "It was my $20th.", ); } #[test] fn seven_even_two_decimal_clean() { assert_lint_count("$7.00", CurrencyPlacement::default(), 0); } } ================================================ FILE: harper-core/src/linting/damages.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Sentence}, }; static KEYWORDS: &[&str] = &[ "case", "cases", "claim", "claims", "judgment", "judgments", "liabilities", "liability", "liable", "settlement", "settlements", "warranty", ]; pub struct Damages { expr: SequenceExpr, } impl Default for Damages { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["damages", "damage"]), } } } impl ExprLinter for Damages { type Unit = Sentence; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let (pretoks, postoks) = ctx?; let damage_idx = 0; let damage_tok = &toks[damage_idx]; let damage_span = damage_tok.span; let damage_chars = damage_span.get_content(src); // Singular noun/verb lemma is not an error but during development we'll print uses of it // to observe its context. if damage_chars.eq_ignore_ascii_case_chars(&['d', 'a', 'm', 'a', 'g', 'e']) { return None; } // If the word after "damages" is a noun or object pronoun, it's the object and "damages" is a verb. let next_word_tok = match (postoks.first(), postoks.get(1)) { (Some(sp), Some(w)) if sp.kind.is_whitespace() && w.kind.is_word() => Some(w), _ => None, }; if next_word_tok.is_some_and(|nwt| nwt.kind.is_object_pronoun() || nwt.kind.is_noun()) { return None; } // The word before "damages" may help us narrow down whether it's a noun or verb. let prev_word_tok = match (pretoks.get(pretoks.len() - 2), pretoks.last()) { (Some(w), Some(sp)) if sp.kind.is_whitespace() && w.kind.is_word() => Some(w), _ => None, }; #[derive(PartialEq)] enum CanPrecede { Unknown, NeitherNounNorVerb, Noun, Verb, EitherNounOrVerb, } // Try to disambiguate whether "damages" is a noun or verb. let can_precede = prev_word_tok.map_or(CanPrecede::Unknown, |prev_word| { let mut can: CanPrecede = CanPrecede::Unknown; if (prev_word.kind.is_adjective() || prev_word.kind.is_determiner() || prev_word.kind.is_preposition()) && !prev_word .span .get_content(src) .eq_ignore_ascii_case_chars(&['t', 'o']) { can = CanPrecede::Noun; } if prev_word.kind.is_auxiliary_verb() { can = if can == CanPrecede::Noun { CanPrecede::EitherNounOrVerb } else { CanPrecede::Verb }; } can }); if can_precede == CanPrecede::Verb { return None; } // We now know "damages" isn't unambiguously a verb, but it could still be an ambiguous verb-noun. // Or it could be a noun. Or it could still be unknown. // Check if it's the object of the verb "to pay" let pay_det = SequenceExpr::word_set(&["paid", "pay", "paying", "pays"]) .then_optional(SequenceExpr::default().t_ws().then_determiner()) .t_ws(); if pretoks .windows(2) .enumerate() .rev() .take_while(|(i, _)| pay_det.run(*i, pretoks, src).is_none()) .count() < pretoks.len() / 2 { return None; } // Check all the tokens for words that are used in the legal compesation context // TODO: this fails when "damages" is misuses in a diclaimer: // 1. "If you encounter any issues, errors, or damages resulting from the use of these templates, // the repository author assumes no responsibility or liability." // 2. "The author will not be liable for any losses and/or damages in connection with the use of our website" if pretoks.iter().any(|t| { t.span .get_content(src) .eq_any_ignore_ascii_case_str(KEYWORDS) }) || postoks.iter().any(|t| { t.span .get_content(src) .eq_any_ignore_ascii_case_str(KEYWORDS) }) { return None; } Some(Lint { span: damage_span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( damage_chars[..6].to_vec(), damage_chars, )], message: "Singular `damage` is correct when not refering to a court case.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Checks for plural `damages` not in the context of a court case." } } #[cfg(test)] mod tests { use super::Damages; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // Examples of the error from GitHub: #[test] fn fix_robust_against_damages_by_prev_preposition() { assert_suggestion_result( "Flow networks robust against damages are simple model networks described in a series of publications by Kaluza et al.", Damages::default(), "Flow networks robust against damage are simple model networks described in a series of publications by Kaluza et al.", ); } #[test] fn fix_vehicle_damages_on_a_car_by_fall_through() { assert_suggestion_result( "POC to select vehicle damages on a car and mark the severity - sudheeshcm/vehicle-damage-selector.", Damages::default(), "POC to select vehicle damage on a car and mark the severity - sudheeshcm/vehicle-damage-selector.", ); } #[test] fn fix_damages_on_mangoes() { assert_suggestion_result( "This is a web application that detects damages on mangoes using a TensorFlow model with Django as the frontend framework", Damages::default(), "This is a web application that detects damage on mangoes using a TensorFlow model with Django as the frontend framework", ); } #[test] fn fix_types_of_damages_of_roads() { assert_suggestion_result( "Detecting different types of damages of roads like cracks and potholes for the given image/video of the road.", Damages::default(), "Detecting different types of damage of roads like cracks and potholes for the given image/video of the road.", ); } // Examples from GitHub where it seems to be used correctly in regard to financial compensation: // TODO: would the word "calculate" before "damages" be a good heuristic? #[test] fn ignore_damages_in_lost_chance_cases() { assert_no_lints( "Code used for calculating damages in lost chance cases.", Damages::default(), ); } #[test] fn ignore_claim_for_damages() { assert_no_lints( "Where the dispute involves a claim for damages in respect of a motor accident for cost of rental of a replacement vehicle", Damages::default(), ); } #[test] fn ignore_pay_damages() { assert_no_lints( "Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.", Damages::default(), ); } // Examples from GitHub where it's not an error but a verb: #[test] fn ignore_damages_them() { assert_no_lints( "Profiles pb's and damages them when their runtime goes over a set value - sirhamsteralot/HaE-PBLimiter.", Damages::default(), ); } #[test] fn ignore_damages_firefox() { assert_no_lints( "Opening Wayland-native terminal damages Firefox", Damages::default(), ); } #[test] fn ignore_damages_underlaying_windows() { assert_no_lints( "Open File Requester damages underlaying windows when moved", Damages::default(), ); } // Examples from GitHub that are too hard to call - maybe they are talking about financial compensation? #[test] #[ignore = "too close to call for now"] fn ignore_estimate_the_damages_and_the_damages_result() { assert_no_lints( "The goal is to estimate the damages of each link in the Graph object using the Damages result (estimating the damages for each segment of a Network).", Damages::default(), ); } // https://github.com › dpasmat › cartel-damages-inference #[test] #[ignore = "too close to call for now"] fn ignore_damages_inference() { assert_no_lints( "This repository contains code to conduct statistical inference in cartel damages estimation. It will be updated to include a Stata .do file which approximates the standard error of total damages from a fixed effects panel data model, using the delta method.", Damages::default(), ); } #[test] #[ignore = "too close to call for now"] fn ignore_received_errors() { assert_no_lints( "Financial damages caused by received errors $$$$.", Damages::default(), ); } #[test] #[ignore = "too close to call for now"] fn ignore_asset_level_damages() { assert_no_lints( "It would be useful to be able to see asset-level damages after running FDA 2.0.", Damages::default(), ); } } ================================================ FILE: harper-core/src/linting/dashes.rs ================================================ use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; const EN_DASH: char = '–'; const EM_DASH: char = '—'; pub struct Dashes { expr: LongestMatchOf, } impl Default for Dashes { fn default() -> Self { let en_dash = SequenceExpr::default().then_hyphen().then_hyphen(); let em_dash_or_longer = SequenceExpr::default() .then_hyphen() .then_hyphen() .then_one_or_more_hyphens(); let pattern = LongestMatchOf::new(vec![Box::new(em_dash_or_longer), Box::new(en_dash)]); Self { expr: pattern } } } impl ExprLinter for Dashes { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let span = matched_tokens.span()?; let lint_kind = LintKind::Formatting; match matched_tokens.len() { 2 => Some(Lint { span, lint_kind, suggestions: vec![Suggestion::ReplaceWith(vec![EN_DASH])], message: "Replace these two hyphens with an en dash (–).".to_owned(), priority: 63, }), 3 => Some(Lint { span, lint_kind, suggestions: vec![Suggestion::ReplaceWith(vec![EM_DASH])], message: "Replace these three hyphens with an em dash (—).".to_owned(), priority: 63, }), 4.. => None, // Ignore longer hyphen sequences. _ => panic!("Received unexpected number of tokens."), } } fn description(&self) -> &'static str { "Writers often type `--` or `---` expecting their editor to convert them into proper dashes. Replace these sequences with the correct characters: use an en dash (–) for ranges or connections and an em dash (—) for a break in thought." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_suggestion_count, assert_suggestion_result}; use super::Dashes; use super::{EM_DASH, EN_DASH}; #[test] fn catches_en_dash() { assert_suggestion_result( "pre--Industrial Revolution", Dashes::default(), &format!("pre{EN_DASH}Industrial Revolution"), ); } #[test] fn catches_em_dash() { assert_suggestion_result( "'There is no box' --- Scott", Dashes::default(), &format!("'There is no box' {EM_DASH} Scott"), ); } #[test] fn no_overlaps() { assert_suggestion_count("'There is no box' --- Scott", Dashes::default(), 1); } #[test] fn no_lint_for_long_hyphen_sequences() { assert_suggestion_count("'There is no box' ------ Scott", Dashes::default(), 0); } } ================================================ FILE: harper-core/src/linting/day_and_age.rs ================================================ use crate::{ CharStringExt, Lint, Span, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct DayAndAge { expr: SequenceExpr, } impl Default for DayAndAge { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["this", "these"]) .t_ws() .then_word_set(&["day", "days"]) .t_ws() .then_word_set(&["and", "in", "an", "on"]) .t_ws() .then_word_set(&["age", "ages"]), } } } impl ExprLinter for DayAndAge { type Unit = Chunk; fn description(&self) -> &str { "Fixes wrong variants of the idiom `in this day and age`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, main_toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let before = ctx?.0; let prep_span = if let (Some(penult), Some(last)) = (before.get_rel(-2), before.get_rel(-1)) && last.kind.is_whitespace() && (penult.kind.is_preposition() || penult .span .get_content(src) .eq_any_ignore_ascii_case_chars(&[&['i', 's'], &['i', 't']])) { Some(penult.span) } else { None }; let prep_chars = prep_span.map(|span| span.get_content(src)); let main_span = main_toks.span()?; let toks = main_toks.iter().step_by(2).collect::>(); let spans = toks.iter().map(|t| t.span).collect::>(); let chars = spans.iter().map(|s| s.get_content(src)).collect::>(); let good: &[&[char]] = &[ &['t', 'h', 'i', 's'], &['d', 'a', 'y'], &['a', 'n', 'd'], &['a', 'g', 'e'], ]; let bads: Vec = chars .iter() .zip(good.iter()) .map(|(actual, &good)| !actual.eq_ignore_ascii_case_chars(good)) .collect(); let good_main = !bads.iter().any(|&b| b); let (span, replacement): (Span, &str) = if prep_chars .is_some_and(|p| p.eq_ignore_ascii_case_chars(&['s', 'i', 'n', 'c', 'e'])) { // "since" is a preposition but it's also a conjunction, so keep it but add "in" after it (main_span, "in this day and age") } else { match (prep_chars, good_main) { // We have a preposition and the idiom is correct (Some(prep_chars), true) => { // If the preposition is "in" or "for" there's nothing to fix if prep_chars.eq_any_ignore_ascii_case_chars(&[&['i', 'n'], &['f', 'o', 'r']]) { return None; } // Otherwise replace the preposition (prep_span.unwrap(), "in") } // We have a preposition but the idiom is wrong (Some(_), false) => ( Span::new(prep_span.unwrap().start, main_span.end), "in this day and age", ), // We only need to insert "in" but since we have common Suggestion logic we'll replace the whole thing (None, true) => (main_span, "in this day and age"), // The preposition is missing and the idiom is wrong, replace the whole thing (None, false) => (main_span, "in this day and age"), } }; Some(Lint { span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( replacement.chars().collect(), span.get_content(src), )], message: "The correct idiom is `in this day and age`.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::DayAndAge; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // True negatives #[test] fn allow_in_this_day_and_age() { assert_no_lints( "I do belive in this day and age with the amount of printer on the market ", DayAndAge::default(), ); } #[test] fn for_this_day_and_age_seems_to_be_acceptable() { assert_no_lints( "As for my specs, I understand that my PC is quite underpowered for this day and age, but I'd say it's still within the hardware combos that ...", DayAndAge::default(), ); } // True positives #[test] fn at_this_day_and_age() { assert_suggestion_result( "How would one add diagnostics to the compiler at this day and age?", DayAndAge::default(), "How would one add diagnostics to the compiler in this day and age?", ); } #[test] fn by_this_day_in_age() { assert_suggestion_result( "Don't most people by this day in age, just have a spare laptop in their kitchens", DayAndAge::default(), "Don't most people in this day and age, just have a spare laptop in their kitchens", ); } #[test] fn in_these_day_and_age() { assert_suggestion_result( "still don't come with load sharing components built in these day and age.", DayAndAge::default(), "still don't come with load sharing components built in this day and age.", ); } #[test] fn in_these_days_and_age() { assert_suggestion_result( "But in these days and age floppies are replaced by USB flash drives.", DayAndAge::default(), "But in this day and age floppies are replaced by USB flash drives.", ); } #[test] fn in_these_days_in_age() { assert_suggestion_result( "In these days in age, this is considered as 'heresy'.", DayAndAge::default(), "In this day and age, this is considered as 'heresy'.", ); } #[test] fn in_this_day_an_age() { assert_suggestion_result( "but in this day an age things progressed a tad so might it be the time for increasing it?", DayAndAge::default(), "but in this day and age things progressed a tad so might it be the time for increasing it?", ); } #[test] fn in_this_day_and_ages() { assert_suggestion_result( "or at least it should be in this day and ages", DayAndAge::default(), "or at least it should be in this day and age", ); } #[test] fn in_this_day_in_age() { assert_suggestion_result( "or anything else that in this day in age is useful to have a reminder about", DayAndAge::default(), "or anything else that in this day and age is useful to have a reminder about", ); } #[test] fn in_this_days_and_age() { assert_suggestion_result( "We as a whole realize that in this days and age being on social networking has got a sort of ...", DayAndAge::default(), "We as a whole realize that in this day and age being on social networking has got a sort of ...", ); } #[test] fn is_this_day_and_age_typo() { assert_suggestion_result( "Agreed, dark mode is a necessity is this day and age.", DayAndAge::default(), "Agreed, dark mode is a necessity in this day and age.", ); } #[test] fn it_this_day_and_age_typo() { assert_suggestion_result( "And it this day and age you really shouldn't but asking people to download random files", DayAndAge::default(), "And in this day and age you really shouldn't but asking people to download random files", ); } #[test] fn of_this_day_and_age() { assert_suggestion_result( "it is completely incompatible with Juice Shop of this day and age", DayAndAge::default(), "it is completely incompatible with Juice Shop in this day and age", ); } #[test] fn to_this_day_and_age() { assert_suggestion_result( "Still can't believe this has to be done in Safari to this day and age with responsive images", DayAndAge::default(), "Still can't believe this has to be done in Safari in this day and age with responsive images", ); } #[test] fn no_prep_this_day_in_age() { assert_suggestion_result( "if that is how gpu programming is still done this day in age then id have a very hard time seeing valhalla ever run on a gpu", DayAndAge::default(), "if that is how gpu programming is still done in this day and age then id have a very hard time seeing valhalla ever run on a gpu", ); } #[test] fn no_prep_these_days_and_ages() { assert_suggestion_result( "Btw I think you should write React the React Hooks way these days and ages, where you'll never see this keyword` again", DayAndAge::default(), "Btw I think you should write React the React Hooks way in this day and age, where you'll never see this keyword` again", ); } #[test] fn since_is_a_preposition_but_also_a_conjunction() { assert_suggestion_result( "and since these days and age storage is usually not a problem, I usually play it safe and just don't bother", DayAndAge::default(), "and since in this day and age storage is usually not a problem, I usually play it safe and just don't bother", ); } } ================================================ FILE: harper-core/src/linting/despite_it_is.rs ================================================ //! Linter for correcting "despite" used with incorrect verb forms. //! //! Handles cases like "despite it is" -> "despite it being" or "despite its being" use crate::{ CharStringExt, Token, TokenStringExt, dict_word_metadata::Person, expr::{Expr, SequenceExpr}, linting::{ ExprLinter, Lint, LintKind, Suggestion, expr_linter::{Chunk, followed_by_word}, }, patterns::WordSet, }; /// Linter that corrects incorrect verb forms after "despite". /// /// For example: /// - "despite it is" -> "despite it being" or "despite its being" /// - "despite I am" -> "despite me being" or "despite my being" pub struct DespiteItIs { expr: SequenceExpr, } impl Default for DespiteItIs { fn default() -> Self { let subj = SequenceExpr::default().then_subject_pronoun(); let be = WordSet::new(&["am", "are", "is", "was", "were"]); let expr = SequenceExpr::aco("despite") .t_ws() .then(subj) .t_ws() .then(be); Self { expr } } } impl ExprLinter for DespiteItIs { type Unit = Chunk; fn description(&self) -> &'static str { "Corrects `despite` being used with the wrong form of `is`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let next_is_ing = followed_by_word(ctx, |nw| nw.kind.is_verb_progressive_form()); let subj = toks.get(2)?; let be = toks.get(4)?; let subj_kind = &subj.kind; // Only handle personal subject pronouns if !(subj_kind.is_personal_pronoun() && subj_kind.is_subject_pronoun()) { return None; } let subj_chars = subj.span.get_content(src); let be_chars = be.span.get_content(src); let pron_be_toks = &toks[2..5]; let subj_pers = subj_kind.get_pronoun_person()?; // BUT BUT BUT // despite I am happy -> me/my being happy // despite I am eating -> me/my eating // despite it is big -> being // -> it/its being big // despite it is running -> it running // -> it/its running let (obj, poss) = match ( subj_pers, subj_kind.is_singular_pronoun(), subj_kind.is_plural_pronoun(), ) { (Person::First, true, false) => ("me", "my"), (Person::First, false, true) => ("us", "our"), (Person::Second, true, true) => ("you", "your"), (Person::Third, false, true) => ("them", "their"), (Person::Third, true, false) => match subj_chars { chs if chs.eq_ignore_ascii_case_chars(&['h', 'e']) => ("him", "his"), chs if chs.eq_ignore_ascii_case_chars(&['s', 'h', 'e']) => ("her", "her"), chs if chs.eq_ignore_ascii_case_chars(&['i', 't']) => ("it", "its"), _ => return None, }, _ => return None, }; let mut suggestions = Vec::with_capacity(3); // Special case for "it" which can also be omitted if subj_chars.eq_any_ignore_ascii_case_str(&["it", "they"]) { suggestions.push(Suggestion::replace_with_match_case_str("being", be_chars)); } let [obj_vec, poss_vec] = [obj, poss].map(|pron| { if !next_is_ing { format!("{} being", pron).chars().collect() } else { pron.chars().collect() } }); suggestions.push(Suggestion::replace_with_match_case(obj_vec, be_chars)); suggestions.push(Suggestion::replace_with_match_case(poss_vec, be_chars)); if suggestions.is_empty() { return None; } let span_to_replace = pron_be_toks.span()?; Some(Lint { span: span_to_replace, lint_kind: LintKind::Grammar, suggestions, message: "Use the gerund form of the verb after `despite`.".into(), ..Lint::default() }) } } #[cfg(test)] mod tests { use super::DespiteItIs; use crate::linting::tests::{assert_good_and_bad_suggestions, assert_no_lints}; #[test] fn despite_i_am() { assert_good_and_bad_suggestions( "Cronicle shuts down randomly despite I am running simple Python scripts via \"Test Plugin\"", DespiteItIs::default(), &[ "Cronicle shuts down randomly despite me running simple Python scripts via \"Test Plugin\"", "Cronicle shuts down randomly despite my running simple Python scripts via \"Test Plugin\"", ], &[], ); } #[test] fn despite_it_is_available() { assert_good_and_bad_suggestions( "Actual behavior Extension not installed despite it is available in PECL", DespiteItIs::default(), &[ "Actual behavior Extension not installed despite being available in PECL", "Actual behavior Extension not installed despite it being available in PECL", "Actual behavior Extension not installed despite its being available in PECL", ], &[], ); } #[test] fn despite_it_is_detected() { assert_good_and_bad_suggestions( "FP2 not detected despite it is detected - split brain?", DespiteItIs::default(), &[ "FP2 not detected despite being detected - split brain?", "FP2 not detected despite it being detected - split brain?", "FP2 not detected despite its being detected - split brain?", ], &[], ); } #[test] fn despite_i_am_in() { assert_good_and_bad_suggestions( "My application was rejected due to location basis despite I am in the same city as my campus.", DespiteItIs::default(), &[ "My application was rejected due to location basis despite me being in the same city as my campus.", "My application was rejected due to location basis despite my being in the same city as my campus.", ], &[], ); } #[test] #[ignore = "negatives are not handled yet"] fn despite_it_was_not() { assert_good_and_bad_suggestions( "despite it was not able to fulfill desired ordering with these modules", DespiteItIs::default(), &[ "despite it not being able to fulfill desired ordering with these modules", "despite its not being able to fulfill desired ordering with these modules", "despite not being able to fulfill desired ordering with these modules", ], &[], ); } #[test] fn despite_we_are_using() { assert_good_and_bad_suggestions( "However, GFW still can decode the content despite we are using overlapped ip fragmentation.", DespiteItIs::default(), &[ "However, GFW still can decode the content despite us using overlapped ip fragmentation.", "However, GFW still can decode the content despite our using overlapped ip fragmentation.", ], &[], ); } #[test] fn despite_they_are_already() { assert_good_and_bad_suggestions( "v5.7.2 keeps adding temperature commands on start_gcode despite they are already present", DespiteItIs::default(), &[ "v5.7.2 keeps adding temperature commands on start_gcode despite them being already present", "v5.7.2 keeps adding temperature commands on start_gcode despite their being already present", ], &[], ); } #[test] fn despite_it_was_removed() { assert_good_and_bad_suggestions( "Freshwater Research Station is selectable as starting location despite it was removed by Dark Days of the Dead mod", DespiteItIs::default(), &[ "Freshwater Research Station is selectable as starting location despite being removed by Dark Days of the Dead mod", // TODO: Freshwater Research Station is selectable as starting location despite having been removed by Dark Days of the Dead mod "Freshwater Research Station is selectable as starting location despite it being removed by Dark Days of the Dead mod", // TODO: Freshwater Research Station is selectable as starting location despite it having been removed by Dark Days of the Dead mod "Freshwater Research Station is selectable as starting location despite its being removed by Dark Days of the Dead mod", // TODO: Freshwater Research Station is selectable as starting location despite its having been removed by Dark Days of the Dead mod ], &[], ); } #[test] fn ignore_despite_they_shouldnt() { assert_no_lints( "Some tools and gears have attack damage values despite they shouldn't", DespiteItIs::default(), ); } #[test] fn ignore_despite_i_was_playing() { assert_good_and_bad_suggestions( "it showed me Maria despite I was playing someone else", DespiteItIs::default(), &[ "it showed me Maria despite me playing someone else", "it showed me Maria despite my playing someone else", ], &[], ); } #[test] fn ignore_despite_they_were_valid() { assert_good_and_bad_suggestions( "You'll get pages that becomes invalid with time despite they were valid before", DespiteItIs::default(), &[ "You'll get pages that becomes invalid with time despite being valid before", "You'll get pages that becomes invalid with time despite them being valid before", "You'll get pages that becomes invalid with time despite their being valid before", ], &[], ); } } ================================================ FILE: harper-core/src/linting/despite_of.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct DespiteOf { expr: SequenceExpr, } impl Default for DespiteOf { fn default() -> Self { let pattern = SequenceExpr::aco("despite") .then_whitespace() .then_exact_word("of"); Self { expr: pattern } } } impl ExprLinter for DespiteOf { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched: &[Token], source: &[char]) -> Option { let span = matched.span()?; let matched = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case_str("despite", matched), Suggestion::replace_with_match_case_str("in spite of", matched) ], message: "The phrase “despite of” is incorrect. Please use either “despite” or “in spite of” instead.".to_string(), priority: 126, }) } fn description(&self) -> &'static str { "Corrects the misuse of `despite of` and suggests the proper alternatives `despite` or `in spite of`." } } #[cfg(test)] mod tests { use super::DespiteOf; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn catches_lowercase() { assert_suggestion_result( "The team performed well, despite of the difficulties they faced.", DespiteOf::default(), "The team performed well, despite the difficulties they faced.", ); } #[test] fn catches_different_cases() { assert_lint_count( "Despite of the rain, we went for a walk.", DespiteOf::default(), 1, ); } #[test] fn likes_correction() { assert_lint_count( "The team performed well, despite the difficulties they faced. In spite of the rain, we went for a walk.", DespiteOf::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/determiner_without_noun.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct DeterminerWithoutNoun { expr: SequenceExpr, } impl Default for DeterminerWithoutNoun { fn default() -> Self { let expr = SequenceExpr::default() .then_kind_where(|kind| kind.is_determiner()) .t_ws() .then_conjunction(); Self { expr } } } impl ExprLinter for DeterminerWithoutNoun { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let span = matched_tokens.span()?; Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: Vec::::new(), message: "A determiner should not be immediately followed by a conjunction." .to_string(), priority: 32, }) } fn description(&self) -> &'static str { "Flags sequences where a determiner (`a`, `an`, `the`, etc.) is directly followed by a coordinating or subordinating conjunction (`and`, `or`, `but`, `because`, etc.), indicating a missing noun." } } #[cfg(test)] mod tests { use super::DeterminerWithoutNoun; use crate::linting::tests::assert_lint_count; #[test] fn flags_determiner_followed_by_conjunction() { assert_lint_count( "The and other options were ignored.", DeterminerWithoutNoun::default(), 1, ); } #[test] fn flags_indefinite_article_followed_by_conjunction() { assert_lint_count("A because I said so.", DeterminerWithoutNoun::default(), 1); assert_lint_count("An because I said so.", DeterminerWithoutNoun::default(), 1); } #[test] fn allows_correct_use_with_noun() { assert_lint_count("The dog barked.", DeterminerWithoutNoun::default(), 0); } #[test] fn allows_determiner_noun_then_conjunction() { assert_lint_count( "The dog and the cat played.", DeterminerWithoutNoun::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/did_past.rs ================================================ use crate::{ CharStringExt, Lint, Token, char_ext::CharExt, expr::{Expr, FixedPhrase, SequenceExpr}, irregular_verbs::IrregularVerbs, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::WordSet, spell::Dictionary, }; pub struct DidPast { expr: SequenceExpr, dict: D, } impl DidPast where D: Dictionary, { pub fn new(dict: D) -> Self { Self { expr: SequenceExpr::longest_of(vec![ Box::new(WordSet::new(&["did", "didn't", "didnt"])), Box::new(FixedPhrase::from_phrase("did not")), ]) .then_optional(SequenceExpr::default().t_ws().then_subject_pronoun()) .t_ws() // Note that 'simple past forms' may apply only to irregular verbs // Note and that 'past forms' applies to regular verbs where preterite and participle share a form .then_kind_where(|k| { (k.is_verb_simple_past_form() || k.is_verb_past_form()) && !k.is_verb_lemma() }), dict, } } fn keep_suggestion_if_lemma(&self, suggs: &mut Vec>, candidate: &[char]) { if self .dict .get_word_metadata(candidate) .is_some_and(|md| md.is_verb_lemma()) { suggs.push(candidate.to_vec()); } } } impl ExprLinter for DidPast where D: Dictionary, { type Unit = Chunk; fn description(&self) -> &str { "Corrects past forms of verbs to their base form, when used together with \"did\"." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let vspan = toks.last()?.span; let vchars = vspan.get_content(src); let vstr = vspan.get_content_string(src); let mut suggs = vec![]; // Chop -d/-ed off regular verbs if vchars.ends_with_ignore_ascii_case_chars(&['d']) { let without_d = &vchars[..vchars.len() - 1]; if without_d.ends_with_ignore_ascii_case_chars(&['e']) { let without_ed = &without_d[..without_d.len() - 1]; self.keep_suggestion_if_lemma(&mut suggs, without_ed); // If the stem without -ed now ends in -i, try changing that to -y to find the lemma if without_ed.ends_with_ignore_ascii_case_chars(&['i']) { let mut with_final_y = without_ed[..without_ed.len() - 1].to_vec(); with_final_y.push('y'); self.keep_suggestion_if_lemma(&mut suggs, &with_final_y); } // If the stem without -ed ends in a doubled consonant, try with just a single one if without_ed.last().is_some_and(|c| !c.is_vowel()) { let without_doubled_consonant = without_ed[..without_ed.len() - 1].to_vec(); self.keep_suggestion_if_lemma(&mut suggs, &without_doubled_consonant); } } self.keep_suggestion_if_lemma(&mut suggs, without_d); } // Look up irregular verbs if let Some(lemma) = IrregularVerbs::curated().get_lemma_for_preterite(&vstr) { suggs.push(lemma.chars().collect()); } if !suggs.is_empty() { Some(Lint { span: vspan, lint_kind: LintKind::Redundancy, suggestions: suggs .into_iter() .map(|s| Suggestion::replace_with_match_case(s, vchars)) .collect(), message: "Use the base form of the verb with \"did\".".to_string(), ..Default::default() }) } else { None } } } #[cfg(test)] mod tests { use super::DidPast; use crate::{ linting::tests::{assert_no_lints, assert_suggestion_result}, spell::FstDictionary, }; // Test basic 'true positive' regular verb cases // Regular verb where past is lemma+ed #[test] fn ed_did_forked() { assert_suggestion_result( "Did they forked the repo?", DidPast::new(FstDictionary::curated()), "Did they fork the repo?", ); } // Regular verb where past is lemma+d #[test] fn d_did_used() { assert_suggestion_result( "It didn't used a macro.", DidPast::new(FstDictionary::curated()), "It didn't use a macro.", ); } // Regular verb where past is lemma -y +ied #[test] fn y_did_fried() { assert_suggestion_result( "I hope that didn't fried any chips!", DidPast::new(FstDictionary::curated()), "I hope that didn't fry any chips!", ); } // Regular verb where past doubled the final consonant #[test] fn doubed_consonant_logged() { assert_suggestion_result( "There was a segfault but it did logged the error.", DidPast::new(FstDictionary::curated()), "There was a segfault but it did log the error.", ); } // Test basic 'true positive' irregular verb cases #[test] fn did_past() { assert_suggestion_result("Did went", DidPast::new(FstDictionary::curated()), "Did go"); } #[test] fn did_past_with_apostrophe() { assert_suggestion_result( "Didn't saw", DidPast::new(FstDictionary::curated()), "Didn't see", ); } #[test] fn didnt_past_no_apostrophe() { assert_suggestion_result( "Didnt had", DidPast::new(FstDictionary::curated()), "Didnt have", ); } #[test] fn did_i_heard() { assert_suggestion_result( "Did I heard", DidPast::new(FstDictionary::curated()), "Did I hear", ); } #[test] fn did_i_heard_with_apostrophe() { assert_suggestion_result( "Didn't we heard", DidPast::new(FstDictionary::curated()), "Didn't we hear", ); } #[test] fn didnt_i_forgot_no_apostrophe() { assert_suggestion_result( "Didnt he forgot", DidPast::new(FstDictionary::curated()), "Didnt he forget", ); } // Test basic 'true negative' cases - verb is valid as both lemma and simple past #[test] fn ignore_lemma_same_as_past_tense() { assert_no_lints("Did read", DidPast::new(FstDictionary::curated())); } // Real-world examples #[test] fn fix_did_you_cmae() { assert_suggestion_result( "How did you came to this", DidPast::new(FstDictionary::curated()), "How did you come to this", ); } #[test] fn fix_did_you_wrote() { assert_suggestion_result( "I'm very interested in the script, if you did wrote it.", DidPast::new(FstDictionary::curated()), "I'm very interested in the script, if you did write it.", ); } #[test] fn fix_didnt_had() { assert_suggestion_result( "and i DO know that i didnt had any Terracota", DidPast::new(FstDictionary::curated()), "and i DO know that i didnt have any Terracota", ); } #[test] fn did_you_went() { assert_suggestion_result( "Did you went out of memory maybe?", DidPast::new(FstDictionary::curated()), "Did you go out of memory maybe?", ); } #[test] fn fix_did_needed() { assert_suggestion_result( "since our CI was broken this did needed to be done", DidPast::new(FstDictionary::curated()), "since our CI was broken this did need to be done", ); } #[test] fn fix_did_thought() { assert_suggestion_result( "I did thought of adding it as a tooltip on hover", DidPast::new(FstDictionary::curated()), "I did think of adding it as a tooltip on hover", ); } #[test] fn fix_did_wanted() { assert_suggestion_result( "I did wanted catch all errors in my previous example.", DidPast::new(FstDictionary::curated()), "I did want catch all errors in my previous example.", ); } #[test] fn fix_did_not_changed() { assert_suggestion_result( "freeing space and reboot frequently did not changed anything", DidPast::new(FstDictionary::curated()), "freeing space and reboot frequently did not change anything", ); } #[test] fn ignore_did_you_read() { assert_no_lints( "Did You Read the Instructions?", DidPast::new(FstDictionary::curated()), ); } } ================================================ FILE: harper-core/src/linting/didnt.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; pub struct Didnt { expr: SequenceExpr, } impl Default for Didnt { fn default() -> Self { let pattern = SequenceExpr::default() .then_subject_pronoun() .t_ws() .t_aco("dint"); Self { expr: pattern } } } impl ExprLinter for Didnt { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let suspect = toks.last()?; Some(Lint { span: suspect.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "didn't", suspect.span.get_content(src), )], message: "Consider using `didn't` here.".to_string(), priority: 63, }) } fn description(&self) -> &str { "Corrects `dint` to `didn't` after subject pronouns." } } #[cfg(test)] mod tests { use super::Didnt; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn corrects_i_dint() { assert_suggestion_result( "I dint lock the gate.", Didnt::default(), "I didn't lock the gate.", ); } #[test] fn corrects_you_dint() { assert_suggestion_result( "You dint look this way.", Didnt::default(), "You didn't look this way.", ); } #[test] fn corrects_he_dint() { assert_suggestion_result( "He dint see the sign.", Didnt::default(), "He didn't see the sign.", ); } #[test] fn corrects_she_dint() { assert_suggestion_result( "She dint call me back.", Didnt::default(), "She didn't call me back.", ); } #[test] fn corrects_we_dint() { assert_suggestion_result( "We dint sleep much.", Didnt::default(), "We didn't sleep much.", ); } #[test] fn corrects_they_dint() { assert_suggestion_result( "They dint enjoy the show.", Didnt::default(), "They didn't enjoy the show.", ); } #[test] fn corrects_it_dint() { assert_suggestion_result( "It dint rain today.", Didnt::default(), "It didn't rain today.", ); } #[test] fn does_not_flag_dint_noun() { assert_no_lints("The blow left a small dint in the metal.", Didnt::default()); } #[test] fn does_not_flag_quoted_dint() { assert_no_lints("He muttered 'dint' under his breath.", Didnt::default()); } #[test] fn does_not_flag_past_tense_with_not() { assert_lint_count("I did not lock the gate.", Didnt::default(), 0); } } ================================================ FILE: harper-core/src/linting/discourse_markers.rs ================================================ use harper_brill::UPOS; use crate::expr::{Expr, FirstMatchOf, FixedPhrase, SequenceExpr}; use crate::patterns::UPOSSet; use crate::{Document, Token, TokenStringExt}; use super::{Lint, LintKind, Linter, Suggestion}; pub struct DiscourseMarkers { expr: SequenceExpr, } impl DiscourseMarkers { pub fn new() -> Self { let phrases = &[ "however", "therefore", "meanwhile", "furthermore", "nevertheless", "consequently", "thus", "instead", "moreover", "honestly", "alternatively", "frankly", "additionally", "subsequently", "accordingly", "otherwise", "incidentally", "conversely", "notwithstanding", "hence", "indeed", "for example", "on the other hand", ]; let phrases_expr = FirstMatchOf::new( phrases .iter() .map(|text: &&str| Box::new(FixedPhrase::from_phrase(text)) as Box) .collect(), ); Self { expr: SequenceExpr::with(phrases_expr) .t_ws() .then_unless(UPOSSet::new(&[ UPOS::ADJ, UPOS::ADV, UPOS::ADP, UPOS::CCONJ, ])), } } fn lint_sentence(&self, sent: &[Token], source: &[char]) -> Option { let first_word_idx = sent.iter_word_indices().next()?; if let Some(matched_phrase) = self.expr.run(first_word_idx, sent, source) { Some(Lint { span: sent[matched_phrase.start..matched_phrase.end - 2].span()?, lint_kind: LintKind::Punctuation, suggestions: vec![Suggestion::InsertAfter(vec![','])], message: "Discourse markers at the beginning of a sentence should be followed by a comma.".into(), priority: 31, }) } else { None } } } impl Default for DiscourseMarkers { fn default() -> Self { Self::new() } } impl Linter for DiscourseMarkers { fn lint(&mut self, document: &Document) -> Vec { document .iter_sentences() .flat_map(|sent| self.lint_sentence(sent, document.get_source())) .collect() } fn description(&self) -> &str { "Flags sentences that begin with a discourse marker but omit the required following comma." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::DiscourseMarkers; #[test] fn corrects_frankly() { assert_suggestion_result( "Frankly I think he is wrong.", DiscourseMarkers::default(), "Frankly, I think he is wrong.", ); } #[test] fn corrects_however() { assert_suggestion_result( "However I disagree with your conclusion.", DiscourseMarkers::default(), "However, I disagree with your conclusion.", ); } #[test] fn corrects_therefore() { assert_suggestion_result( "Therefore we must act now.", DiscourseMarkers::default(), "Therefore, we must act now.", ); } #[test] fn corrects_meanwhile() { assert_suggestion_result( "Meanwhile preparations continued in the background.", DiscourseMarkers::default(), "Meanwhile, preparations continued in the background.", ); } #[test] fn corrects_furthermore() { assert_suggestion_result( "Furthermore this approach reduces complexity.", DiscourseMarkers::default(), "Furthermore, this approach reduces complexity.", ); } #[test] fn corrects_nevertheless() { assert_suggestion_result( "Nevertheless we persevered despite the odds.", DiscourseMarkers::default(), "Nevertheless, we persevered despite the odds.", ); } #[test] fn corrects_consequently() { assert_suggestion_result( "Consequently the system halted unexpectedly.", DiscourseMarkers::default(), "Consequently, the system halted unexpectedly.", ); } #[test] fn corrects_thus() { assert_suggestion_result( "Thus we arrive at the final verdict.", DiscourseMarkers::default(), "Thus, we arrive at the final verdict.", ); } #[test] fn allows_thus_far() { assert_no_lints( "Thus far there have been no problems.", DiscourseMarkers::default(), ); } #[test] fn corrects_instead() { assert_suggestion_result( "Instead he chose a different path.", DiscourseMarkers::default(), "Instead, he chose a different path.", ); } #[test] fn corrects_moreover() { assert_suggestion_result( "Moreover this solution is more efficient.", DiscourseMarkers::default(), "Moreover, this solution is more efficient.", ); } #[test] fn corrects_alternatively() { assert_suggestion_result( "Alternatively we could defer the decision.", DiscourseMarkers::default(), "Alternatively, we could defer the decision.", ); } #[test] fn no_suggestion_if_comma_present() { assert_no_lints( "However, I disagree with your point.", DiscourseMarkers::default(), ); } #[test] fn no_lint_for_mid_sentence_marker() { assert_no_lints( "I said however I would consider it.", DiscourseMarkers::default(), ); } #[test] fn preserves_whitespace() { assert_suggestion_result( "However I disagree.", DiscourseMarkers::default(), "However, I disagree.", ); } #[test] fn corrects_semicolon_case() { assert_suggestion_result( "However I disagree.", DiscourseMarkers::default(), "However, I disagree.", ); } #[test] fn corrects_multiple_sentences() { assert_suggestion_result( "However I disagree. Therefore I propose an alternative.", DiscourseMarkers::default(), "However, I disagree. Therefore, I propose an alternative.", ); } #[test] fn allows_single_word_sentence() { assert_no_lints("Thus", DiscourseMarkers::default()); } #[test] fn corrects_for_example() { assert_suggestion_result( "For example I recommend updating the configuration.", DiscourseMarkers::default(), "For example, I recommend updating the configuration.", ); } #[test] fn no_suggestion_if_comma_after_for_example() { assert_no_lints( "For example, I recommend updating the configuration.", DiscourseMarkers::default(), ); } #[test] fn preserves_whitespace_for_example() { assert_suggestion_result( "For example the outcome was unexpected.", DiscourseMarkers::default(), "For example, the outcome was unexpected.", ); } #[test] fn corrects_on_the_other_hand() { assert_suggestion_result( "On the other hand we could delay the deployment.", DiscourseMarkers::default(), "On the other hand, we could delay the deployment.", ); } #[test] fn no_lint_for_mid_sentence_on_the_other_hand() { assert_no_lints( "We might postpone, on the other hand this introduces risk.", DiscourseMarkers::default(), ); } #[test] fn check_2966_is_avoided() { assert_no_lints( "Honestly and graciously convince someone of something.", DiscourseMarkers::default(), ); } } ================================================ FILE: harper-core/src/linting/disjoint_prefixes.rs ================================================ use crate::{ Lint, Token, TokenKind, TokenStringExt, expr::{All, Expr, OwnedExprExt, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, }; pub struct DisjointPrefixes { expr: All, dict: D, } // Known false positives not to join to these prefixes: const OUT_EXCEPTIONS: &[&str] = &["boxes", "facing", "live", "numbers", "playing"]; const OVER_EXCEPTIONS: &[&str] = &["all", "joy", "long", "night", "reading", "steps", "time"]; const UNDER_EXCEPTIONS: &[&str] = &["development", "mine"]; const UP_EXCEPTIONS: &[&str] = &["loading", "right", "state", "time", "trend"]; impl DisjointPrefixes where D: Dictionary, { pub fn new(dict: D) -> Self { Self { expr: SequenceExpr::word_set(&[ // These prefixes rarely cause false positives "anti", "auto", "bi", "counter", "de", "dis", "extra", "fore", "hyper", "il", "im", "inter", "ir", "macro", "mal", "micro", "mid", "mini", "mis", "mono", "multi", "non", "omni", "post", "pre", "pro", "re", "semi", "sub", "super", "trans", "tri", "ultra", "un", "uni", // "co" has one very common false positive: co-op != coop "co", // These prefixes are all also words in their own right, which leads to more false positives. "out", "over", "under", "up", // These prefixes are commented out due to too many false positives // or incorrect transformations: // "a": a live -> alive // "in": in C -> inc; in action -> inaction ]) .t_ws_h() .then_kind_either(TokenKind::is_verb, TokenKind::is_noun) .then_optional_hyphen() .and_not(SequenceExpr::any_of(vec![ // No trailing hyphen. Ex: Custom patterns take precedence over built-in patterns -> overbuilt Box::new(SequenceExpr::anything().t_any().t_any().then_hyphen()), // Don't merge "co op" whether separated by space or hyphen. Box::new(SequenceExpr::aco("co").t_any().t_set(&["op", "ops"])), // Merge these if they're separated by hyphen, but not space. Box::new(SequenceExpr::aco("out").t_ws().t_set(OUT_EXCEPTIONS)), Box::new(SequenceExpr::aco("over").t_ws().t_set(OVER_EXCEPTIONS)), Box::new(SequenceExpr::aco("under").t_ws().t_set(UNDER_EXCEPTIONS)), Box::new(SequenceExpr::aco("up").t_ws().t_set(UP_EXCEPTIONS)), ])), dict, } } } impl ExprLinter for DisjointPrefixes where D: Dictionary, { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let toks_span = toks.span()?; let (pre, _) = ctx?; // Cloud Native Pub-Sub System at Pinterest -> subsystem if pre.last().is_some_and(|p| p.kind.is_hyphen()) { return None; } // Avoid including text from unlintable sections between tokens // that could result from naively using toks.span()?.get_content_string(src) let original = format!( "{}{}{}", toks[0].span.get_content_string(src), if toks[1].kind.is_hyphen() { '-' } else { ' ' }, toks[2].span.get_content_string(src) ); // If the original form is in the dictionary, return None if self.dict.contains_word_str(&original) { return None; } let mut hyphenated = None; if !toks[1].kind.is_hyphen() { hyphenated = Some(format!( "{}-{}", toks[0].span.get_content_string(src), toks[2].span.get_content_string(src) )); } let joined = Some(format!( "{}{}", toks[0].span.get_content_string(src), toks[2].span.get_content_string(src) )); // Check if either joined or hyphenated form is in the dictionary let joined_valid = joined .as_ref() .is_some_and(|j| self.dict.contains_word_str(j)); let hyphenated_valid = hyphenated .as_ref() .is_some_and(|h| self.dict.contains_word_str(h)); if !joined_valid && !hyphenated_valid { return None; } // Joining with a hyphen when original is separated by space is more likely correct // if hyphenated form is in the dictionary. So add first if verified. // Joining when separated by a space is more common but also has more false positives, so add them second. let suggestions = [(&hyphenated, hyphenated_valid), (&joined, joined_valid)] .into_iter() .filter_map(|(word, is_valid)| word.as_ref().filter(|_| is_valid)) .collect::>(); let suggestions = suggestions .iter() .map(|s| { Suggestion::replace_with_match_case(s.chars().collect(), toks_span.get_content(src)) }) .collect(); Some(Lint { span: toks_span, lint_kind: LintKind::Spelling, suggestions, message: "This looks like a prefix that can be joined with the rest of the word." .to_string(), ..Default::default() }) } fn description(&self) -> &str { "Looks for words with their prefixes written with a space or hyphen between instead of joined." } } #[cfg(test)] mod tests { use super::DisjointPrefixes; use crate::{ linting::tests::{assert_no_lints, assert_suggestion_result}, spell::FstDictionary, }; #[test] fn fix_hyphenated_to_joined() { assert_suggestion_result( "Download pre-built binaries or build from source.", DisjointPrefixes::new(FstDictionary::curated()), "Download prebuilt binaries or build from source.", ); } #[test] fn fix_open_to_joined() { assert_suggestion_result( "Advanced Nginx configuration available for super users", DisjointPrefixes::new(FstDictionary::curated()), "Advanced Nginx configuration available for superusers", ); } #[test] fn dont_join_open_co_op() { assert_no_lints( "They are cheaper at the co op.", DisjointPrefixes::new(FstDictionary::curated()), ); } #[test] fn dont_join_hyphenated_co_op() { assert_no_lints( "Almost everything is cheaper at the co-op.", DisjointPrefixes::new(FstDictionary::curated()), ); } #[test] fn fix_open_to_hyphenated() { assert_suggestion_result( "My hobby is de extinction of the dinosaurs.", DisjointPrefixes::new(FstDictionary::curated()), "My hobby is de-extinction of the dinosaurs.", ); } } ================================================ FILE: harper-core/src/linting/do_mistake.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, FixedPhrase, SequenceExpr}, linting::{ ExprLinter, LintKind, Suggestion, expr_linter::{Chunk, followed_by_word}, }, patterns::WordSet, }; pub struct DoMistake { expr: Box, } impl Default for DoMistake { fn default() -> Self { Self { expr: Box::new( SequenceExpr::word_set(&["do", "did", "does", "doing", "done"]) .t_ws() .then_longest_of(vec![ Box::new(WordSet::new(&[ "a", "an", "the", "that", "these", "this", "those", "another", "many", "several", "some", "my", "our", "your", "his", "her", "its", "their", ])), Box::new(FixedPhrase::from_phrase("a lot of")), Box::new(FixedPhrase::from_phrase("lots of")), Box::new(FixedPhrase::from_phrase("that kind of")), Box::new(FixedPhrase::from_phrase("these kinds of")), Box::new(FixedPhrase::from_phrase("this kind of")), Box::new(FixedPhrase::from_phrase("those kinds of")), Box::new(FixedPhrase::from_phrase("so many")), Box::new(FixedPhrase::from_phrase("too many")), Box::new(FixedPhrase::from_phrase("tons of")), Box::new(FixedPhrase::from_phrase("tonnes of")), ]) .t_ws() .then_word_set(&["mistake", "mistakes"]), ), } } } impl ExprLinter for DoMistake { type Unit = Chunk; fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let tok = toks.first()?; let span = tok.span; let chars = span.get_content(src); if followed_by_word(ctx, |nw| { nw.kind.is_verb() && !nw.kind.is_verb_progressive_form() }) { return None; } let make = if chars.eq_ignore_ascii_case_str("do") { "make" } else if chars.eq_ignore_ascii_case_str("did") || chars.eq_ignore_ascii_case_str("done") { "made" } else if chars.eq_ignore_ascii_case_str("does") { "makes" } else if chars.eq_ignore_ascii_case_str("doing") { "making" } else { return None; } .chars() .collect(); Some(Lint { span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case(make, chars)], message: "In English we `make` mistakes, not `do` them".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Corrects `do a mistake` to `make a mistake`." } fn expr(&self) -> &dyn Expr { &*self.expr } } #[cfg(test)] mod tests { use super::DoMistake; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn did_a_mistake() { assert_suggestion_result( "Hi, I did a mistake in my NGINX config file and so once the container is launched, it logs the error...", DoMistake::default(), "Hi, I made a mistake in my NGINX config file and so once the container is launched, it logs the error...", ); } #[test] fn did_my_mistakes() { assert_suggestion_result( "Where i did my mistakes?", DoMistake::default(), "Where i made my mistakes?", ); } #[test] fn did_several_mistakes() { assert_suggestion_result( "Maybe I did several mistakes, but I can only find a message about one?", DoMistake::default(), "Maybe I made several mistakes, but I can only find a message about one?", ); } #[test] fn did_some_mistakes() { assert_suggestion_result( "I made this program to learn goto use. but did some mistakes somewhere", DoMistake::default(), "I made this program to learn goto use. but made some mistakes somewhere", ); } #[test] fn did_that_mistake() { assert_suggestion_result( "and believe me, I did that mistake too", DoMistake::default(), "and believe me, I made that mistake too", ); } #[test] fn did_the_mistake() { assert_suggestion_result( "The issue describe is the person who did the mistake in the past & that same person is NOW correcting other people", DoMistake::default(), "The issue describe is the person who made the mistake in the past & that same person is NOW correcting other people", ); } #[test] fn did_this_mistake() { assert_suggestion_result( "Are there famous mathematicians who did this mistake?", DoMistake::default(), "Are there famous mathematicians who made this mistake?", ); } #[test] fn do_many_mistakes() { assert_suggestion_result( "I observed that my coworkers do many mistakes using the field calculator", DoMistake::default(), "I observed that my coworkers make many mistakes using the field calculator", ); } #[test] fn do_mistake() { assert_suggestion_result( "If you do a mistake that causes alot of problems, please use the command to redo", DoMistake::default(), "If you make a mistake that causes alot of problems, please use the command to redo", ); } #[test] fn do_some_mistakes() { assert_suggestion_result( "so probably if my colleagues do some mistakes I tend to learn them as well", DoMistake::default(), "so probably if my colleagues make some mistakes I tend to learn them as well", ); } #[test] fn do_the_mistake() { assert_suggestion_result( "do I need to explicitly mention that I did not do the mistake to do not lose the point?", DoMistake::default(), "do I need to explicitly mention that I did not make the mistake to do not lose the point?", ); } #[test] fn do_this_mistake() { assert_suggestion_result( "I barely remember any frontend developer that wouldn't do this mistake at least once.", DoMistake::default(), "I barely remember any frontend developer that wouldn't make this mistake at least once.", ); } #[test] fn do_this_mistakes() { assert_suggestion_result( "I do this mistakes to check the command detekt with type resolution", DoMistake::default(), "I make this mistakes to check the command detekt with type resolution", ); } #[test] fn do_those_mistakes() { assert_suggestion_result( "An experienced developer could do those mistakes as well", DoMistake::default(), "An experienced developer could make those mistakes as well", ); } #[test] fn doing_a_mistake() { assert_suggestion_result( "Here at work, a colleague asked if we were doing a mistake by using the ReactDOM.renderToStaticMarkup on the client side.", DoMistake::default(), "Here at work, a colleague asked if we were making a mistake by using the ReactDOM.renderToStaticMarkup on the client side.", ); } #[test] fn doing_several_mistakes() { assert_suggestion_result( "I realized I was doing several mistakes", DoMistake::default(), "I realized I was making several mistakes", ); } #[test] fn doing_the_mistkae() { assert_suggestion_result( "where am i doing the mistake?", DoMistake::default(), "where am i making the mistake?", ); } #[test] fn done_some_mistake() { assert_suggestion_result( "Might be I have done some mistake, that I do not know.", DoMistake::default(), "Might be I have made some mistake, that I do not know.", ); } #[test] fn done_this_mistake() { assert_suggestion_result( "how many more users have done this mistake?", DoMistake::default(), "how many more users have made this mistake?", ); } // False positives #[test] fn dont_flag_when_does_a_mistake() { assert_no_lints( "When does a mistake become standard usage? ", DoMistake::default(), ); } #[test] fn dont_flag_did_that_mistake_verb() { assert_no_lints( "Did that mistake occurred before or after the day 2 backup?", DoMistake::default(), ); } #[test] fn dont_flag_does_this_mistake_verb() { assert_no_lints( "Does this mistake invalidate your thesis?", DoMistake::default(), ); } #[test] fn dont_flag_does_the_mistake_verb() { assert_no_lints( "Does the mistake change the meaning of the quotation?", DoMistake::default(), ); } } ================================================ FILE: harper-core/src/linting/dot_initialisms.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::SequenceExpr; use crate::expr::WordExprGroup; use hashbrown::HashMap; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; use crate::{Token, TokenStringExt}; pub struct DotInitialisms { expr: WordExprGroup, corrections: HashMap<&'static str, &'static str>, } impl Default for DotInitialisms { fn default() -> Self { let mut patterns = WordExprGroup::default(); let mut corrections = HashMap::new(); corrections.insert("ie", "i.e."); corrections.insert("eg", "e.g."); for target in corrections.keys() { let pattern = SequenceExpr::default() .then_exact_word(target) .then_punctuation(); patterns.add(target, pattern); } Self { expr: patterns, corrections, } } } impl ExprLinter for DotInitialisms { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let found_word_tok = matched_tokens.first()?; let found_word = found_word_tok.span.get_content_string(source); let correction = self.corrections.get(found_word.as_str())?; Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::ReplaceWith(correction.chars().collect())], message: "Initialisms should have dot-separated letters.".to_owned(), priority: 63, }) } fn description(&self) -> &'static str { "Ensures common initialisms (like \"i.e.\") are properly dot-separated." } } #[cfg(test)] mod tests { use super::DotInitialisms; use crate::linting::tests::assert_suggestion_result; #[test] fn matches_eg() { assert_suggestion_result( "Some text here (eg. more text).", DotInitialisms::default(), "Some text here (e.g. more text).", ) } } ================================================ FILE: harper-core/src/linting/double_click.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, TokenStringExt, expr::{Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct DoubleClick { expr: ExprMap, } impl DoubleClick { fn double_click_sequence() -> SequenceExpr { SequenceExpr::default() .t_aco("double") .t_ws() .then_word_set(&["click", "clicked", "clicking", "clicks"]) } } impl Default for DoubleClick { fn default() -> Self { let mut map = ExprMap::default(); map.insert( SequenceExpr::default() .then_seq(Self::double_click_sequence()) .t_ws() .then_any_word(), 0, ); map.insert( SequenceExpr::default() .then_seq(Self::double_click_sequence()) .then_punctuation(), 0, ); map.insert( SequenceExpr::default() .then_seq(Self::double_click_sequence()) .t_ws() .then_kind_is_but_is_not(TokenKind::is_word, TokenKind::is_verb), 0, ); Self { expr: map } } } impl ExprLinter for DoubleClick { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let double_idx = *self.expr.lookup(0, matched_tokens, source)?; let click_idx = 2; let span = matched_tokens.get(double_idx..=click_idx)?.span()?; let template = span.get_content(source); let double_word = matched_tokens.get(double_idx)?.span.get_content(source); let click_word = matched_tokens.get(click_idx)?.span.get_content(source); let replacement: Vec = double_word .iter() .copied() .chain(['-']) .chain(click_word.iter().copied()) .collect(); Some(Lint { span, lint_kind: LintKind::Punctuation, suggestions: vec![Suggestion::replace_with_match_case(replacement, template)], message: "Add a hyphen to this command.".to_owned(), priority: 40, }) } fn description(&self) -> &'static str { "Encourages hyphenating `double-click` and its inflections." } } #[cfg(test)] mod tests { use super::DoubleClick; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_basic_command() { assert_suggestion_result( "Double click the icon.", DoubleClick::default(), "Double-click the icon.", ); } #[test] fn corrects_with_preposition() { assert_suggestion_result( "Please double click on the link.", DoubleClick::default(), "Please double-click on the link.", ); } #[test] fn corrects_with_pronoun() { assert_suggestion_result( "You should double click it to open.", DoubleClick::default(), "You should double-click it to open.", ); } #[test] fn corrects_plural_form() { assert_suggestion_result( "Double clicks are recorded in the log.", DoubleClick::default(), "Double-clicks are recorded in the log.", ); } #[test] fn corrects_past_tense() { assert_suggestion_result( "They double clicked the submit button.", DoubleClick::default(), "They double-clicked the submit button.", ); } #[test] fn corrects_gerund() { assert_suggestion_result( "Double clicking the item highlights it.", DoubleClick::default(), "Double-clicking the item highlights it.", ); } #[test] fn corrects_with_caps() { assert_suggestion_result( "He DOUBLE CLICKED the file.", DoubleClick::default(), "He DOUBLE-CLICKED the file.", ); } #[test] fn corrects_multiline() { assert_suggestion_result( "Double\nclick the checkbox.", DoubleClick::default(), "Double-click the checkbox.", ); } #[test] fn corrects_at_sentence_end() { assert_suggestion_result( "Just double click.", DoubleClick::default(), "Just double-click.", ); } #[test] fn allows_hyphenated_form() { assert_lint_count("Double-click the icon.", DoubleClick::default(), 0); } #[test] fn ignores_other_double_words() { assert_lint_count( "She said the double rainbow was beautiful.", DoubleClick::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/double_modal.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::patterns::ModalVerb; use crate::{Token, TokenStringExt}; use super::Suggestion; use super::{ExprLinter, Lint, LintKind}; use crate::linting::expr_linter::Chunk; pub struct DoubleModal { expr: SequenceExpr, } impl Default for DoubleModal { fn default() -> Self { let expr = SequenceExpr::with(ModalVerb::default()) .t_ws() .then(ModalVerb::default()); Self { expr } } } impl ExprLinter for DoubleModal { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let first_chars = matched_tokens.first()?.span.get_content(source); let second_chars = matched_tokens.last()?.span.get_content(source); Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Miscellaneous, suggestions: vec![ Suggestion::ReplaceWith(first_chars.into()), Suggestion::ReplaceWith(second_chars.into()), ], message: "Two modal verbs in a row are rarely grammatical; remove one.".to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Two modal verbs in a row are rarely grammatical; remove one of them." } } #[cfg(test)] mod tests { use super::DoubleModal; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn detects_might_could() { assert_lint_count( "They might could finish the project by Friday.", DoubleModal::default(), 1, ); } #[test] fn detects_should_ought() { assert_lint_count("You should ought to apologize.", DoubleModal::default(), 1); } #[test] fn allows_single_modal() { assert_lint_count("She must leave early.", DoubleModal::default(), 0); } #[test] fn detects_two_double_modals() { assert_lint_count( "He may can join us, and you might could too.", DoubleModal::default(), 2, ); } #[test] fn suggests_removing_second_modal_keeps_first() { assert_suggestion_result( "They might could finish the project by Friday.", DoubleModal::default(), "They might finish the project by Friday.", ); } #[test] fn suggests_removing_second_modal_keeps_first_variant_order() { assert_suggestion_result( "You could might want to double-check that.", DoubleModal::default(), "You could want to double-check that.", ); } #[test] fn suggests_removing_second_modal_keeps_first_capitalised() { assert_suggestion_result( "We Must Should be consistent.", DoubleModal::default(), "We Must be consistent.", ); } #[test] fn allows_will_need() { assert_no_lints( "You will need administrator or editor level access", DoubleModal::default(), ); } } ================================================ FILE: harper-core/src/linting/ellipsis_length.rs ================================================ use itertools::Itertools; use super::{Lint, LintKind, Linter, Suggestion}; use crate::TokenStringExt; /// A linter that checks that an ellipsis doesn't contain too many periods (or /// too few). #[derive(Debug, Default)] pub struct EllipsisLength; impl Linter for EllipsisLength { fn lint(&mut self, document: &crate::Document) -> Vec { let mut lints = Vec::new(); for tok in document.iter_ellipsiss() { let tok_content = document.get_span_content(&tok.span); if tok_content.is_empty() { continue; } if tok_content.first().cloned() == Some('.') && tok_content.iter().all_equal() && tok_content.len() != 3 { lints.push(Lint { span: tok.span, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::ReplaceWith(vec!['.', '.', '.'])], message: "Horizontal ellipsis must have 3 dots.".to_string(), priority: 31, }) } } lints } fn description(&self) -> &'static str { "Make sure you have the correct number of dots in your ellipsis." } } #[cfg(test)] mod tests { use super::EllipsisLength; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn allows_correct_ellipsis() { assert_lint_count("...", EllipsisLength, 0); } #[test] fn corrects_long_ellipsis() { assert_lint_count(".....", EllipsisLength, 1); assert_suggestion_result(".....", EllipsisLength, "..."); } #[test] fn corrects_short_ellipsis() { assert_lint_count("..", EllipsisLength, 1); assert_suggestion_result("..", EllipsisLength, "..."); } } ================================================ FILE: harper-core/src/linting/else_possessive.rs ================================================ use crate::expr::Expr; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct ElsePossessive { expr: SequenceExpr, } impl Default for ElsePossessive { fn default() -> Self { let pronouns = WordSet::new(&[ "somebody", "someone", "anybody", "anyone", "everybody", "everyone", "nobody", ]) .or(SequenceExpr::aco("no").then_whitespace().t_aco("one")); let pattern = SequenceExpr::with(pronouns) .then_whitespace() .t_aco("elses"); Self { expr: pattern } } } impl ExprLinter for ElsePossessive { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { let offender = toks.last()?; Some(Lint { span: offender.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith("else's".chars().collect())], message: "Add the missing possessive apostrophe: use `else’s`.".to_owned(), priority: 60, }) } fn description(&self) -> &str { "Detects missing apostrophes in phrases like `someone elses book` and suggests the correct possessive form `else’s`." } } #[cfg(test)] mod tests { use super::ElsePossessive; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fixes_no_one_elses() { assert_suggestion_result( "It's no one elses problem.", ElsePossessive::default(), "It's no one else's problem.", ); } #[test] fn fixes_someone_elses() { assert_suggestion_result( "It's someone elses problem.", ElsePossessive::default(), "It's someone else's problem.", ); } #[test] fn fixes_anybody_elses() { assert_suggestion_result( "Was that anybody elses idea?", ElsePossessive::default(), "Was that anybody else's idea?", ); } #[test] fn fixes_everyone_elses() { assert_suggestion_result( "He echoed everyone elses concerns.", ElsePossessive::default(), "He echoed everyone else's concerns.", ); } #[test] fn ignores_correct_form() { assert_lint_count( "She borrowed someone else's notes.", ElsePossessive::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/ever_every.rs ================================================ use crate::{ Lint, Token, expr::{All, Expr, OwnedExprExt, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::{ModalVerb, WordSet}, }; pub struct EverEvery { expr: All, } impl Default for EverEvery { fn default() -> Self { Self { expr: SequenceExpr::any_of(vec![ Box::new(WordSet::new(&[ "are", "aren't", "arent", "did", "didn't", "didnt", "do", "does", "doesn't", "doesnt", "dont", "don't", "had", "hadn't", "hadnt", "has", "hasn't", "hasnt", "have", "haven't", "havent", "is", "isn't", "isnt", "was", "wasn't", "wasnt", "were", "weren't", "werent", ])), Box::new(ModalVerb::with_common_errors()), ]) .t_ws() .then_subject_pronoun() .t_ws() .t_aco("every") .and_not(SequenceExpr::anything().t_any().t_aco("it")), } } } impl ExprLinter for EverEvery { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let span = toks[4].span; let content = span.get_content(src); Some(Lint { span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case( content[..content.len() - 1].to_vec(), content, )], message: "Is this `every` a typo that should be `ever`?".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Tries to correct typos of `every` instead of `ever`." } } #[cfg(test)] mod tests { use super::EverEvery; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn fix_can_i_every() { assert_suggestion_result( "Odd, how can i every become negative in that case?", EverEvery::default(), "Odd, how can i ever become negative in that case?", ); } #[test] fn fix_can_they_every() { assert_suggestion_result( "if each component has its own instance of NameService, how can they every share state?", EverEvery::default(), "if each component has its own instance of NameService, how can they ever share state?", ) } #[test] fn fix_can_we_every() { assert_suggestion_result( "can we every have a good dev UX?", EverEvery::default(), "can we ever have a good dev UX?", ); } #[test] fn fix_did_we_every() { assert_suggestion_result( "Did we every fix that?", EverEvery::default(), "Did we ever fix that?", ) } #[test] fn fix_did_you_every() { assert_suggestion_result( "Did you every get vtsls working properly?", EverEvery::default(), "Did you ever get vtsls working properly?", ) } #[test] fn fix_do_i_every() { assert_suggestion_result( "Rarely do I every look forward to the new ui.", EverEvery::default(), "Rarely do I ever look forward to the new ui.", ) } #[test] fn fix_do_we_every() { assert_suggestion_result( "do we every stop learning new things?", EverEvery::default(), "do we ever stop learning new things?", ) } #[test] fn fix_do_you_every() { assert_suggestion_result( "Do you every faced the issue or have any idea why this could happen?", EverEvery::default(), "Do you ever faced the issue or have any idea why this could happen?", ) } #[test] fn fix_dont_i_every() { assert_suggestion_result( "WHY DONT I EVERY SEE OR HEAR ABOUT THINGS HAPPENING IN SOUTHPORT?", EverEvery::default(), "WHY DONT I EVER SEE OR HEAR ABOUT THINGS HAPPENING IN SOUTHPORT?", ) } #[test] fn fix_dont_they_every() { assert_suggestion_result( "And why dont they every smile first?", EverEvery::default(), "And why dont they ever smile first?", ) } #[test] fn fix_dont_you_every() { assert_suggestion_result( "Dont you every forget this and believe nothing else.", EverEvery::default(), "Dont you ever forget this and believe nothing else.", ) } #[test] fn fix_have_you_every() { assert_suggestion_result( "Have you every wanted to generate geometric structures from data.frames", EverEvery::default(), "Have you ever wanted to generate geometric structures from data.frames", ) } #[test] fn fix_should_i_every() { assert_suggestion_result( "I.e. why would I every use deepcopy ?", EverEvery::default(), "I.e. why would I ever use deepcopy ?", ) } #[test] fn fix_should_we_every() { assert_suggestion_result( "Should we every meet, I'll get you a beverage of your choosing!", EverEvery::default(), "Should we ever meet, I'll get you a beverage of your choosing!", ) } #[test] fn fix_should_you_every() { assert_suggestion_result( "but you will always have a place in his home should you every truly desire it", EverEvery::default(), "but you will always have a place in his home should you ever truly desire it", ) } #[test] fn fix_would_i_every() { assert_suggestion_result( "Why would I every do that?", EverEvery::default(), "Why would I ever do that?", ) } #[test] fn fix_would_they_every() { assert_suggestion_result( "Would they every be installed together?", EverEvery::default(), "Would they ever be installed together?", ) } // known false positive - future contributors: please feel free to tackle this! #[test] #[ignore = "unusual but not wrong position of time phrase, maybe should have commas?"] fn dont_flag_should_we_every() { assert_no_lints( "MM: should we every month or two have a roundup of what's been happening in WGSL", EverEvery::default(), ) } } ================================================ FILE: harper-core/src/linting/everyday.rs ================================================ use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::expr::All; use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{Lrc, Punctuation, Token, TokenKind, TokenStringExt, patterns::Word}; pub struct Everyday { expr: LongestMatchOf, } impl Default for Everyday { fn default() -> Self { let everyday = Word::new("everyday"); let every_day = Lrc::new(SequenceExpr::aco("every").t_ws().t_aco("day")); let everyday_bad_after = All::new(vec![ Box::new(SequenceExpr::with(everyday.clone()).t_ws().then_any_word()), Box::new(SequenceExpr::anything().t_any().then_kind_where(|kind| { !kind.is_noun() && !kind.is_oov() && !kind.is_verb_progressive_form() })), ]); let bad_before_every_day = All::new(vec![ Box::new(SequenceExpr::any_word().t_ws().then(every_day.clone())), Box::new(|tok: &Token, _src: &[char]| { // "this" and "that" are both determiners and pronouns tok.kind.is_determiner() && !tok.kind.is_pronoun() }), ]); // (why does) everyday feel the (same ?) let everyday_ambiverb_after_then_noun = All::new(vec![ Box::new( SequenceExpr::with(everyday.clone()) .t_ws() .then_any_word() .t_ws() .then_any_word(), ), Box::new( SequenceExpr::anything() .t_any() .then_kind_both(TokenKind::is_noun, TokenKind::is_verb) .t_any() .then_determiner(), ), ]); // (Do you actually improve if you draw) everyday? let everyday_punctuation_after = All::new(vec![ Box::new(SequenceExpr::with(everyday.clone()).then_punctuation()), Box::new(SequenceExpr::anything().then_kind_where(|kind| { matches!( kind, TokenKind::Punctuation( Punctuation::Question | Punctuation::Comma | Punctuation::Period ) ) })), ]); // (However, the message goes far beyond) every day things. let every_day_noun_after_then_punctuation = All::new(vec![ Box::new( SequenceExpr::with(every_day.clone()) .t_ws() .then_plural_noun() .then_punctuation(), ), Box::new( SequenceExpr::anything() .t_any() .t_any() .t_any() .t_any() .then_kind_where(|kind| { matches!( kind, TokenKind::Punctuation( Punctuation::Question | Punctuation::Comma | Punctuation::Period ) ) }), ), ]); // Can we detect all mistakes with just one token before or after? // ❌ after adjective ✅ after adverb // $ (end of chunk) // ✅ after adjective ❌ after adverb // singular count noun: "An everyday task" // ✅ after adjective ✅ after adverb - can't disambiguate! // plural noun: "Everyday tasks are boring." vs "Every day tasks get completed." // mass noun: "Everyday information" vs "Every day information gets processed." // ❌ before adjective ✅ before adverb // none found yet // ✅ before adjective ❌ before adverb // none found yet // ✅ before adjective ✅ before adverb - can't disambiguate! // "some": "some everyday tasks" / "Do some every day" // verb, past form: "I coded every day" / "I learned everyday phrases" Self { expr: LongestMatchOf::new(vec![ Box::new(everyday_bad_after), Box::new(bad_before_every_day), Box::new(everyday_ambiverb_after_then_noun), Box::new(everyday_punctuation_after), Box::new(every_day_noun_after_then_punctuation), ]), } } } impl ExprLinter for Everyday { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { // Helper functions make the match tables more compact and readable. let norm = |i: usize| toks[i].span.get_content_string(src).to_lowercase(); let isws = |i: usize| toks[i].kind.is_whitespace(); let tokspan = |i: usize| toks[i].span; let slicespan = |i: usize| toks[i..i + 3].span().unwrap(); let (span, replacement, pos) = match toks.len() { 2 => match (norm(0).as_str(), norm(1).as_str()) { ("everyday", _) => Some((tokspan(0), "every day", "adverb")), _ => None, }, 3 => match (norm(0).as_str(), norm(2).as_str()) { ("everyday", _) if isws(1) => Some((tokspan(0), "every day", "adverb")), (_, "everyday") if isws(1) => Some((tokspan(2), "every day", "adverb")), _ => None, }, 5 => match (norm(0).as_str(), norm(2).as_str(), norm(4).as_str()) { ("every", "day", _) if isws(1) && isws(3) => { Some((slicespan(0), "everyday", "adjective")) } (_, "every", "day") if isws(1) && isws(3) => { Some((slicespan(2), "everyday", "adjective")) } ("everyday", _, _) if isws(1) && isws(3) => { Some((tokspan(0), "every day", "adverb")) } _ => None, }, 6 => match ( norm(0).as_str(), norm(2).as_str(), norm(4).as_str(), norm(5).as_str(), ) { ("every", "day", _, _) if isws(1) && isws(3) => { Some((slicespan(0), "everyday", "adjective")) } _ => None, }, _ => None, }?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( replacement, span.get_content(src), )], message: format!("You probably mean the {pos} `{replacement}` here."), priority: 31, }) } fn description(&self) -> &str { "This rule tries to sort out confusing the adjective `everyday` and the adverb `every day`." } } #[cfg(test)] mod tests { use super::Everyday; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn dont_flag_lone_adjective() { assert_lint_count("everyday", Everyday::default(), 0); } #[test] fn dont_flag_lone_adverb() { assert_lint_count("every day", Everyday::default(), 0); } #[test] fn correct_adjective_at_end_of_chunk() { assert_suggestion_result( "This is something I do everyday.", Everyday::default(), "This is something I do every day.", ); } #[test] fn correct_adverb_after_article_before_noun() { assert_suggestion_result( "It's nothing special, just an every day thing.", Everyday::default(), "It's nothing special, just an everyday thing.", ); } #[test] #[ignore = "Can't yet match end-of-chunk after it. Adjective before is legit for both adjective and adverb."] fn correct_adjective_without_following_noun() { assert_suggestion_result( "Some git commands used everyday", Everyday::default(), "Some git commands used every day", ); } #[test] fn dont_flag_everyday_adjective_before_dev() { assert_lint_count( "At everyday dev, engineering isn't just a job - it's our passion.", Everyday::default(), 0, ); } #[test] fn dont_flag_everyday_adjective_before_present_participle() { assert_lint_count("Everyday coding projects.", Everyday::default(), 0); } #[test] fn dont_flag_everyday_adjective_before_plural_noun() { assert_lint_count( "Exploring Everyday Things with R and Ruby", Everyday::default(), 0, ); } #[test] fn correct_everyday_at_end_of_sentence_after_past_verb() { assert_suggestion_result( "Trying to write about what I learned everyday.", Everyday::default(), "Trying to write about what I learned every day.", ); } #[test] fn dont_flag_every_day_at_start_of_sentence_before_comma() { assert_lint_count( "Every day, a new concept or improvement will be shared", Everyday::default(), 0, ); } #[test] fn dont_flag_every_day_at_start_of_sentence_before_copula() { assert_lint_count("Every day is worth remembering...", Everyday::default(), 0); } #[test] fn dont_flag_every_day_at_end_of_sentence_after_noun() { assert_lint_count("You learn new stuff every day.", Everyday::default(), 0); } #[test] fn dont_flag_every_day_after_noun_before_conjunction() { assert_lint_count( "Pick a different test item every day and confirm it is present.", Everyday::default(), 0, ); } #[test] #[ignore = "replace_with_match_case_str converts to EveryDay instead of Everyday"] fn correct_every_day_after_article() { assert_suggestion_result( "The Every Day Calendar with Dark Mode", Everyday::default(), "The Everyday Calendar with Dark Mode", ); } #[test] fn dont_flag_everyday_before_unknown_word() { assert_lint_count( "It's just a normal everyday splorg.", Everyday::default(), 0, ); } #[test] fn dont_flag_every_day_at_end_of_chunk_after_adverb() { assert_lint_count( "I use the same amount of energy basically every day", Everyday::default(), 0, ); } #[test] fn dont_flag_every_day_after_verb_before_if() { assert_lint_count( "This would happen every day if left alone.", Everyday::default(), 0, ); } #[test] fn dont_flag_every_day_after_noun_before_preposition() { assert_lint_count( "An animal can do training and inference every day of its existence until the day of its death.", Everyday::default(), 0, ); } #[test] fn dont_flag_every_day_after_time() { assert_lint_count( "Can I take a picture at 12:00 every day?", Everyday::default(), 0, ); } #[test] fn dont_flag_every_day_at_start_of_chunk_before_np() { assert_lint_count( "Every day the application crashes several times on macOS Sequoia version 15.3", Everyday::default(), 0, ); } #[test] fn fix_everyday_and_every_day_used_wrongly() { assert_suggestion_result( "Each and everyday you ought to strive to learn something that is not an every day thing.", Everyday::default(), "Each and every day you ought to strive to learn something that is not an everyday thing.", ); } #[test] fn fix_reddit_why_does_everyday() { assert_suggestion_result( "Why does everyday feel the same?", Everyday::default(), "Why does every day feel the same?", ); } #[test] fn fix_reddit_everyday_is_going_to() { assert_suggestion_result( "... everyday is going to be a good day that's just the way it is!", Everyday::default(), "... every day is going to be a good day that's just the way it is!", ); } #[test] fn fix_reddit_draw_everyday() { assert_suggestion_result( "Do you actually improve if you draw everyday?", Everyday::default(), "Do you actually improve if you draw every day?", ); } #[test] fn fix_reddit_two_bad_out_of_three() { assert_suggestion_result( "Yes you can jog everyday, not a personal best every day, but a steady pace run everyday.", Everyday::default(), "Yes you can jog every day, not a personal best every day, but a steady pace run every day.", ); } #[test] fn fix_reddit_every_day_routine() { assert_suggestion_result( "Habit stacking - stacking the small skill with something that's already worked into my every day routine.", Everyday::default(), "Habit stacking - stacking the small skill with something that's already worked into my everyday routine.", ); } #[test] fn fix_stackoverflow_every_day_things() { assert_suggestion_result( "However, the message goes far beyond every day things.", Everyday::default(), "However, the message goes far beyond everyday things.", ); } #[test] fn fix_reddit_everyday_is_same() { assert_suggestion_result( "Everyday is exactly the same", Everyday::default(), "Every day is exactly the same", ); } #[test] #[ignore = "doesn't work yet because title case demands 'Every Day' but we get 'Every day'"] fn fix_medium_little_bit_everyday() { assert_suggestion_result( "Does Learning A Little Bit Everyday Actually Work?", Everyday::default(), "Does Learning A Little Bit Every Day Actually Work?", ); } #[test] fn fix_stackexchange_use_everyday() { assert_suggestion_result( "We use this everyday without noticing, but we hate it when ...", Everyday::default(), "We use this every day without noticing, but we hate it when ...", ); } #[test] fn fix_github_what_i_learned_everyday() { assert_suggestion_result( "Trying to write about what I learned everyday.", Everyday::default(), "Trying to write about what I learned every day.", ); } #[test] fn fix_medium_one_bad_out_of_three() { assert_suggestion_result( "Even inside a routine, everyday we adapt to changes and challenges ... We are not the same person every day, but every day we are ourselves…", Everyday::default(), "Even inside a routine, every day we adapt to changes and challenges ... We are not the same person every day, but every day we are ourselves…", ); } #[test] fn fix_medium_doing_something_everyday() { assert_suggestion_result( "There was nothing wrong with my braincells processing the concepts of doing something everyday and ...", Everyday::default(), "There was nothing wrong with my braincells processing the concepts of doing something every day and ...", ); } #[test] fn fix_medium_all_caps() { assert_suggestion_result( "MEET SOMEONE NEW EVERYDAY.", Everyday::default(), "MEET SOMEONE NEW EVERY DAY.", ); } #[test] fn dont_flag_every_day_singular_noun_2020() { assert_no_lints("50 requests per day, every day free.", Everyday::default()); } } ================================================ FILE: harper-core/src/linting/expand_memory_shorthands.rs ================================================ use std::sync::Arc; use super::{ExprLinter, Lint, LintKind}; use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::patterns::{ImpliesQuantity, WordSet}; pub struct ExpandMemoryShorthands { expr: SequenceExpr, } impl ExpandMemoryShorthands { pub fn new() -> Self { let hotwords = Arc::new(WordSet::new(&[ "B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", "RB", "QB", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB", ])); Self { expr: SequenceExpr::with(ImpliesQuantity).then_longest_of(vec![ Box::new(SequenceExpr::with(hotwords.clone())), Box::new(SequenceExpr::default().t_ws_h().then(hotwords.clone())), ]), } } fn get_replacement(abbreviation: &str, plural: Option) -> Option<&'static str> { let is_plural = plural.unwrap_or(abbreviation.ends_with('s')); match abbreviation { "B" => Some(if is_plural { "bytes" } else { "byte" }), "kB" => Some(if is_plural { "kilobytes" } else { "kilobyte" }), "MB" => Some(if is_plural { "megabytes" } else { "megabyte" }), "GB" => Some(if is_plural { "gigabytes" } else { "gigabyte" }), "TB" => Some(if is_plural { "terabytes" } else { "terabyte" }), "PB" => Some(if is_plural { "petabytes" } else { "petabyte" }), "EB" => Some(if is_plural { "exabytes" } else { "exabyte" }), "ZB" => Some(if is_plural { "zettabytes" } else { "zettabyte" }), "YB" => Some(if is_plural { "yottabytes" } else { "yottabyte" }), "RB" => Some(if is_plural { "ronnabytes" } else { "ronnabyte" }), "QB" => Some(if is_plural { "quettabytes" } else { "quettabyte" }), "KiB" => Some(if is_plural { "kibibytes" } else { "kibibyte" }), "MiB" => Some(if is_plural { "mebibytes" } else { "mebibyte" }), "GiB" => Some(if is_plural { "gibibytes" } else { "gibibyte" }), "TiB" => Some(if is_plural { "tebibytes" } else { "tebibyte" }), "PiB" => Some(if is_plural { "pebibytes" } else { "pebibyte" }), "EiB" => Some(if is_plural { "exbibytes" } else { "exbibyte" }), "ZiB" => Some(if is_plural { "zebibytes" } else { "zebibyte" }), "YiB" => Some(if is_plural { "yobibytes" } else { "yobibyte" }), "RiB" => Some(if is_plural { "robibytes" } else { "robibyte" }), "QiB" => Some(if is_plural { "quebibytes" } else { "quebibyte" }), _ => None, } } } impl Default for ExpandMemoryShorthands { fn default() -> Self { Self::new() } } impl ExprLinter for ExpandMemoryShorthands { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_span = matched_tokens.last()?.span; let implies_plural = ImpliesQuantity::implies_plurality(matched_tokens.first()?, source); let offending_text = offending_span.get_content(source); let replacement = Self::get_replacement(&offending_text.iter().collect::(), implies_plural)?; let mut replacement_chars = Vec::new(); // If there isn't spacing, insert a space if matched_tokens.len() == 2 { replacement_chars.push(' '); } replacement_chars.extend(replacement.chars()); if replacement_chars == offending_text { return None; } Some(Lint { span: offending_span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(replacement_chars)], message: format!("Did you mean `{replacement}`?"), priority: 31, }) } fn description(&self) -> &str { "Expands memory-related abbreviations (`B`, `kB`, `MB`, `GB`, `TB`, `PB`, `KiB`, `MiB`, `GiB`, `TiB`, `PiB`, etc.) to their full forms (`byte`, `kilobyte`, `megabyte`, `gigabyte`, `terabyte`, `petabyte`, `kibibyte`, `mebibyte`, `gibibyte`, `tebibyte`, `pebibyte`, etc.)." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::ExpandMemoryShorthands; #[test] fn detects_bytes() { assert_suggestion_result("5 B", ExpandMemoryShorthands::new(), "5 bytes"); } #[test] fn detects_kilobytes() { assert_suggestion_result("10 kB", ExpandMemoryShorthands::new(), "10 kilobytes"); } #[test] fn detects_megabytes() { assert_suggestion_result("30 MB", ExpandMemoryShorthands::new(), "30 megabytes"); } #[test] fn detects_gigabytes() { assert_suggestion_result("16 GB", ExpandMemoryShorthands::new(), "16 gigabytes"); } #[test] fn detects_terabytes() { assert_suggestion_result("2 TB", ExpandMemoryShorthands::new(), "2 terabytes"); } #[test] fn detects_kibibytes() { assert_suggestion_result("1024 KiB", ExpandMemoryShorthands::new(), "1024 kibibytes"); } #[test] fn detects_mebibytes() { assert_suggestion_result("2048 MiB", ExpandMemoryShorthands::new(), "2048 mebibytes"); } #[test] fn detects_gibibytes() { assert_suggestion_result("4 GiB", ExpandMemoryShorthands::new(), "4 gibibytes"); } #[test] fn detects_tebibytes() { assert_suggestion_result("8 TiB", ExpandMemoryShorthands::new(), "8 tebibytes"); } #[test] fn detects_petabytes() { assert_suggestion_result("1 PB", ExpandMemoryShorthands::new(), "1 petabyte"); } #[test] fn detects_exabytes() { assert_suggestion_result("1 EB", ExpandMemoryShorthands::new(), "1 exabyte"); } #[test] fn detects_zettabytes() { assert_suggestion_result("1 ZB", ExpandMemoryShorthands::new(), "1 zettabyte"); } #[test] fn detects_yottabytes() { assert_suggestion_result("1 YB", ExpandMemoryShorthands::new(), "1 yottabyte"); } #[test] fn detects_quettabytes() { assert_suggestion_result("1 QB", ExpandMemoryShorthands::new(), "1 quettabyte"); } #[test] fn detects_pebibytes() { assert_suggestion_result("1 PiB", ExpandMemoryShorthands::new(), "1 pebibyte"); } #[test] fn detects_exbibytes() { assert_suggestion_result("1 EiB", ExpandMemoryShorthands::new(), "1 exbibyte"); } #[test] fn detects_zebibytes() { assert_suggestion_result("1 ZiB", ExpandMemoryShorthands::new(), "1 zebibyte"); } #[test] fn detects_yobibytes() { assert_suggestion_result("1 YiB", ExpandMemoryShorthands::new(), "1 yobibyte"); } #[test] fn detects_robibytes() { assert_suggestion_result("1 RiB", ExpandMemoryShorthands::new(), "1 robibyte"); } #[test] fn detects_quebibytes() { assert_suggestion_result("1 QiB", ExpandMemoryShorthands::new(), "1 quebibyte"); } #[test] fn handles_punctuation() { assert_suggestion_result("8 GB.", ExpandMemoryShorthands::new(), "8 gigabytes."); } #[test] fn handles_adjacent_number() { assert_suggestion_result("16GB", ExpandMemoryShorthands::new(), "16 gigabytes"); } #[test] fn handles_hyphen_separated() { assert_suggestion_result("32-GB", ExpandMemoryShorthands::new(), "32-gigabytes"); } #[test] fn doesnt_handle_wrong_kb_cases() { assert_lint_count( "48kb and 64 KB were common in the 8-bit era.", ExpandMemoryShorthands::new(), 0, ); } } ================================================ FILE: harper-core/src/linting/expand_time_shorthands.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use std::sync::Arc; use super::{ExprLinter, Lint, LintKind}; use crate::Token; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::patterns::{ImpliesQuantity, WordSet}; pub struct ExpandTimeShorthands { expr: SequenceExpr, } impl ExpandTimeShorthands { pub fn new() -> Self { let hotwords = Arc::new(WordSet::new(&[ "hr", "hrs", "min", "mins", "sec", "secs", "ms", "msec", "msecs", ])); Self { expr: SequenceExpr::with(ImpliesQuantity).then_longest_of(vec![ Box::new(SequenceExpr::with(hotwords.clone())), Box::new(SequenceExpr::default().t_ws_h().then(hotwords.clone())), ]), } } fn get_replacement(abbreviation: &str, plural: Option) -> Option<&'static str> { let is_plural = plural.unwrap_or(matches!(abbreviation, "hrs" | "mins" | "secs" | "msecs")); match abbreviation { "hr" | "hrs" => Some(if is_plural { "hours" } else { "hour" }), "min" | "mins" => Some(if is_plural { "minutes" } else { "minute" }), "sec" | "secs" => Some(if is_plural { "seconds" } else { "second" }), "ms" | "msec" | "msecs" => Some(if is_plural { "milliseconds" } else { "millisecond" }), _ => None, } } } impl Default for ExpandTimeShorthands { fn default() -> Self { Self::new() } } impl ExprLinter for ExpandTimeShorthands { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_span = matched_tokens.last()?.span; let implies_plural = ImpliesQuantity::implies_plurality(matched_tokens.first()?, source); let offending_text = offending_span.get_content(source); let replacement = Self::get_replacement(&offending_text.iter().collect::(), implies_plural)?; let mut replacement_chars = Vec::new(); // If there isn't spacing, insert a space if matched_tokens.len() == 2 { replacement_chars.push(' '); } replacement_chars.extend(replacement.chars()); if replacement_chars == offending_text { return None; } Some(Lint { span: offending_span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(replacement_chars)], message: format!("Did you mean `{replacement}`?"), priority: 31, }) } fn description(&self) -> &str { "Expands time-related abbreviations (`hr`, `hrs`, `min`, `mins`, `sec`, `secs`, `ms`, `msec`, `msecs`) to their full forms (`hour`, `hours`, `minute`, `minutes`, `second`, `seconds`, `millisecond`, `milliseconds`)." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::ExpandTimeShorthands; #[test] fn detects_singular_hour() { assert_suggestion_result("5 hr", ExpandTimeShorthands::new(), "5 hours"); } #[test] fn detects_singular_minute() { assert_suggestion_result("10 min", ExpandTimeShorthands::new(), "10 minutes"); } #[test] fn detects_singular_second() { assert_suggestion_result("30 sec", ExpandTimeShorthands::new(), "30 seconds"); } #[test] fn detects_plural_hours() { assert_suggestion_result("5 hrs", ExpandTimeShorthands::new(), "5 hours"); } #[test] fn detects_plural_minutes() { assert_suggestion_result("10 mins", ExpandTimeShorthands::new(), "10 minutes"); } #[test] fn detects_plural_seconds() { assert_suggestion_result("30 secs", ExpandTimeShorthands::new(), "30 seconds"); } #[test] fn detects_millisecond() { assert_suggestion_result("5 ms", ExpandTimeShorthands::new(), "5 milliseconds"); } #[test] fn detects_milliseconds() { assert_suggestion_result("10 msecs", ExpandTimeShorthands::new(), "10 milliseconds"); } #[test] fn handles_punctuation_hour() { assert_suggestion_result("5 hr.", ExpandTimeShorthands::new(), "5 hours."); } #[test] fn handles_punctuation_minute() { assert_suggestion_result("10 min,", ExpandTimeShorthands::new(), "10 minutes,"); } #[test] fn handles_punctuation_second() { assert_suggestion_result("30 sec!", ExpandTimeShorthands::new(), "30 seconds!"); } #[test] fn handles_adjacent_number_hour() { assert_suggestion_result("5hr", ExpandTimeShorthands::new(), "5 hours"); } #[test] fn handles_adjacent_number_minute() { assert_suggestion_result("10-min", ExpandTimeShorthands::new(), "10-minutes"); } #[test] fn handles_adjacent_number_second() { assert_suggestion_result("30sec", ExpandTimeShorthands::new(), "30 seconds"); } } ================================================ FILE: harper-core/src/linting/expr_linter.rs ================================================ use crate::expr::{Expr, ExprExt}; use blanket::blanket; use crate::{Document, LSend, Token, TokenStringExt}; use super::{Lint, Linter}; pub trait DocumentIterator { type Unit; fn iter_units<'a>(document: &'a Document) -> Box + 'a>; } /// Process text in chunks (clauses between commas) pub struct Chunk; /// Process text in full sentences pub struct Sentence; impl DocumentIterator for Chunk { type Unit = Chunk; fn iter_units<'a>(document: &'a Document) -> Box + 'a> { Box::new(document.iter_chunks()) } } impl DocumentIterator for Sentence { type Unit = Sentence; fn iter_units<'a>(document: &'a Document) -> Box + 'a> { Box::new(document.iter_sentences()) } } /// A trait that searches for tokens that fulfil [`Expr`]s in a [`Document`]. /// /// Makes use of [`TokenStringExt::iter_chunks`] by default, or [`TokenStringExt::iter_sentences`] to process either /// a chunk (clause) or a sentence at a time. #[blanket(derive(Box))] pub trait ExprLinter: LSend { type Unit: DocumentIterator; /// A simple getter for the expression you want Harper to search for. fn expr(&self) -> &dyn Expr; /// If any portions of a [`Document`] match [`Self::expr`], they are passed through [`ExprLinter::match_to_lint`] /// or [`ExprLinter::match_to_lint_with_context`] to be transformed into a [`Lint`] for editor consumption. /// /// Transform matched tokens into a [`Lint`] for editor consumption. /// /// This is the simple version that only sees the matched tokens. For context-aware linting, /// implement `match_to_lint_with_context` instead. /// /// Return `None` to skip producing a lint for this match. fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { self.match_to_lint_with_context(matched_tokens, source, None) } /// Transform matched tokens into a [`Lint`] with access to surrounding context. /// /// The context provides access to tokens before and after the match. When implementing /// this method, you can call `self.match_to_lint()` as a fallback if the context isn't needed. /// /// Return `None` to skip producing a lint for this match. fn match_to_lint_with_context( &self, matched_tokens: &[Token], source: &[char], _context: Option<(&[Token], &[Token])>, ) -> Option { // Default implementation falls back to the simple version self.match_to_lint(matched_tokens, source) } /// A user-facing description of what kinds of grammatical errors this rule looks for. /// It is usually shown in settings menus. fn description(&self) -> &str; } /// Helper function to find the only occurrence of a token matching a predicate /// /// Returns `Some(token)` if exactly one token matches the predicate, `None` otherwise. /// TODO: This can be used in the [`ThenThan`] linter when #1819 is merged. pub fn find_the_only_token_matching<'a, F>( tokens: &'a [Token], source: &[char], predicate: F, ) -> Option<&'a Token> where F: Fn(&Token, &[char]) -> bool, { let mut matches = tokens.iter().filter(|&tok| predicate(tok, source)); match (matches.next(), matches.next()) { (Some(tok), None) => Some(tok), _ => None, } } impl Linter for L where L: ExprLinter, U: DocumentIterator, { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); let source = document.get_source(); for unit in U::iter_units(document) { lints.extend(run_on_chunk(self, unit, source)); } lints } fn description(&self) -> &str { self.description() } } pub fn run_on_chunk<'a>( linter: &'a impl ExprLinter, unit: &'a [Token], source: &'a [char], ) -> impl Iterator + 'a { linter .expr() .iter_matches(unit, source) .filter_map(|match_span| { linter.match_to_lint_with_context( &unit[match_span.start..match_span.end], source, Some((&unit[..match_span.start], &unit[match_span.end..])), ) }) } /// Check for sentence continuation after a matched span. /// /// Validates that the "after" context starts with whitespace followed by a word token, /// allowing flexible inspection of that word's properties (POS tags, etc.) via the predicate. /// The predicate can be used to confirm matches, suppress false positives, or apply conditional logic. /// /// Returns `false` if context is `None`, missing tokens, or the structure is malformed. pub fn followed_by_word( context: Option<(&[Token], &[Token])>, predicate: impl Fn(&Token) -> bool, ) -> bool { if let Some((_, after)) = context && let [ws, word, ..] = after && ws.kind.is_whitespace() { return predicate(word); } false } pub fn followed_by_hyphen(context: Option<(&[Token], &[Token])>) -> bool { context .and_then(|(_, after)| after.first()) .is_some_and(|hy| hy.kind.is_hyphen()) } pub fn preceded_by_word( context: Option<(&[Token], &[Token])>, predicate: impl Fn(&Token) -> bool, ) -> bool { if let Some((before, _)) = context && let [.., word, ws] = before && ws.kind.is_whitespace() { return predicate(word); } false } #[cfg(test)] mod tests_context { use crate::expr::{Expr, FixedPhrase}; use crate::linting::expr_linter::{Chunk, Sentence}; use crate::linting::tests::assert_suggestion_result; use crate::linting::{ExprLinter, Suggestion}; use crate::token_string_ext::TokenStringExt; use crate::{Lint, Token}; pub struct TestSimpleLinter { expr: Box, } impl Default for TestSimpleLinter { fn default() -> Self { Self { expr: Box::new(FixedPhrase::from_phrase("two")), } } } impl ExprLinter for TestSimpleLinter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &*self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { Some(Lint { span: toks.span()?, message: "simple".to_string(), suggestions: vec![Suggestion::ReplaceWith(vec!['2'])], ..Default::default() }) } fn description(&self) -> &str { "test linter" } } pub struct TestContextLinter { expr: Box, } impl Default for TestContextLinter { fn default() -> Self { Self { expr: Box::new(FixedPhrase::from_phrase("two")), } } } impl ExprLinter for TestContextLinter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &*self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], context: Option<(&[Token], &[Token])>, ) -> Option { if let Some((before, after)) = context { let before = before.span()?.get_content_string(src); let after = after.span()?.get_content_string(src); let (message, suggestions) = if before.eq_ignore_ascii_case("one ") && after.eq_ignore_ascii_case(" three") { ( "ascending".to_string(), vec![Suggestion::ReplaceWith(vec!['>'])], ) } else if before.eq_ignore_ascii_case("three ") && after.eq_ignore_ascii_case(" one") { ( "descending".to_string(), vec![Suggestion::ReplaceWith(vec!['<'])], ) } else { ( "dunno".to_string(), vec![Suggestion::ReplaceWith(vec!['?'])], ) }; return Some(Lint { span: toks.span()?, message, suggestions, ..Default::default() }); } else { None } } fn description(&self) -> &str { "context linter" } } pub struct TestSentenceLinter { expr: Box, } impl Default for TestSentenceLinter { fn default() -> Self { Self { expr: Box::new(FixedPhrase::from_phrase("two, two")), } } } impl ExprLinter for TestSentenceLinter { type Unit = Sentence; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { Some(Lint { span: toks.span()?, message: "sentence".to_string(), suggestions: vec![Suggestion::ReplaceWith(vec!['2', '&', '2'])], ..Default::default() }) } fn description(&self) -> &str { "sentence linter" } } #[test] fn simple_test_123() { assert_suggestion_result("one two three", TestSimpleLinter::default(), "one 2 three"); } #[test] fn context_test_123() { assert_suggestion_result("one two three", TestContextLinter::default(), "one > three"); } #[test] fn context_test_321() { assert_suggestion_result("three two one", TestContextLinter::default(), "three < one"); } #[test] fn sentence_test_123() { assert_suggestion_result( "one, two, two, three", TestSentenceLinter::default(), "one, 2&2, three", ); } } ================================================ FILE: harper-core/src/linting/far_be_it.rs ================================================ use crate::char_string::CharStringExt; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::token::Token; pub struct FarBeIt { expr: SequenceExpr, } impl Default for FarBeIt { fn default() -> Self { Self { expr: SequenceExpr::default() .t_aco("far") .t_ws() .t_aco("be") .t_ws() .t_aco("it") .t_ws() .then_word_except(&["from"]), } } } impl ExprLinter for FarBeIt { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let span = toks.last()?.span; let content = span.get_content(src); // We can only correct using `far be it for`, otherwise we recommend rephrasing the sentence. let (suggestions, message) = if span.get_content(src).eq_ignore_ascii_case_str("for") { ( vec![Suggestion::replace_with_match_case( vec!['f', 'r', 'o', 'm'], content, )], "`Far be it for` is a common error for `far be it from`".to_string(), ) } else { (vec![], "The correct usage of the idiom is `far be it from` [someone] to [do something]. Try to rephrase the sentence.".to_string()) }; Some(Lint { span, lint_kind: LintKind::Usage, suggestions, message, ..Default::default() }) } fn description(&self) -> &'static str { "Flags misuse of `far be it` and suggests using `from` when it is followed by `for`" } } #[cfg(test)] mod tests { use super::FarBeIt; use crate::linting::tests::{ assert_no_lints, assert_suggestion_count, assert_suggestion_result, }; #[test] fn far_be_it_for_me_capitalized() { assert_suggestion_result( "Far be it for me to suggestion that additional cardinality be added to the already TOO MUCH CARDINALITY metric space.", FarBeIt::default(), "Far be it from me to suggestion that additional cardinality be added to the already TOO MUCH CARDINALITY metric space.", ); } #[test] fn far_be_it_for_me_lowercase() { assert_suggestion_result( "Far be it for me to tell people what to do so I'm not earnestly proposing to take away the ability to add literals to lazyframes.", FarBeIt::default(), "Far be it from me to tell people what to do so I'm not earnestly proposing to take away the ability to add literals to lazyframes.", ); } #[test] fn far_be_it_that() { assert_suggestion_count( "Far be it that I get in the middle of this thread (and the complexity WebAuthn has spawned)", FarBeIt::default(), 0, ); } #[test] fn far_be_it_for_the_software() { assert_suggestion_result( "Far be it for the software to give any indication of that fact.", FarBeIt::default(), "Far be it from the software to give any indication of that fact.", ); } #[test] #[ignore = "No punctuation between '... so far' and 'be it ...'"] fn missing_punctuation_false_positive() { assert_no_lints( "but it is failing for master and all the 11.x branches i have tried so far be it 11.0.0, 11.0.1 ...", FarBeIt::default(), ); } #[test] fn far_be_it_to() { assert_suggestion_count( "I'm not a marketing guy, so far be it to second guess that.", FarBeIt::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/fascinated_by.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct FascinatedBy { expr: SequenceExpr, } impl Default for FascinatedBy { fn default() -> Self { Self { expr: SequenceExpr::aco("fascinated").t_ws().then_preposition(), } } } impl ExprLinter for FascinatedBy { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let prep_span = toks.last()?.span; let prep_chars = prep_span.get_content(src); if prep_chars.eq_any_ignore_ascii_case_str(&["by", "with"]) { return None; } Some(Lint { span: prep_span, lint_kind: LintKind::Usage, suggestions: vec![ Suggestion::replace_with_match_case_str("by", prep_chars), Suggestion::replace_with_match_case_str("with", prep_chars), ], message: "The correct prepositions to use with `fascinated` are `by` or `with`." .to_string(), ..Default::default() }) } fn description(&self) -> &str { "Ensures the correct prepositions are used with `fascinated` (e.g., `fascinated by` or `fascinated with`)." } } #[cfg(test)] mod tests { use crate::linting::{fascinated_by::FascinatedBy, tests::assert_good_and_bad_suggestions}; #[test] fn fix_amiga() { assert_good_and_bad_suggestions( "Now, one aspect of the Amiga that I've always been fascinated about is making my own games for the Amiga.", FascinatedBy::default(), &[ "Now, one aspect of the Amiga that I've always been fascinated by is making my own games for the Amiga.", "Now, one aspect of the Amiga that I've always been fascinated with is making my own games for the Amiga.", ][..], &[], ); } #[test] fn fix_microbit() { assert_good_and_bad_suggestions( "also why I am very fascinated about the micro:bit itself", FascinatedBy::default(), &[ "also why I am very fascinated by the micro:bit itself", "also why I am very fascinated with the micro:bit itself", ][..], &[], ); } #[test] fn fix_software_development() { assert_good_and_bad_suggestions( "Self-learner, fascinated about software development, especially computer graphics and web - marcus-phi.", FascinatedBy::default(), &[ "Self-learner, fascinated by software development, especially computer graphics and web - marcus-phi.", "Self-learner, fascinated with software development, especially computer graphics and web - marcus-phi.", ][..], &[], ); } #[test] fn fix_computer_science() { assert_good_and_bad_suggestions( "Fascinated about Computer Science, Finance and Statistics.", FascinatedBy::default(), &[ "Fascinated by Computer Science, Finance and Statistics.", "Fascinated with Computer Science, Finance and Statistics.", ][..], &[], ); } #[test] fn fix_possibilities() { assert_good_and_bad_suggestions( "m relatively new to deCONZ and Conbee2 but already very fascinated about the possibilities compared to Philips and Ikea's", FascinatedBy::default(), &[ "m relatively new to deCONZ and Conbee2 but already very fascinated by the possibilities compared to Philips and Ikea's", "m relatively new to deCONZ and Conbee2 but already very fascinated with the possibilities compared to Philips and Ikea's", ][..], &[], ); } #[test] fn fix_project() { assert_good_and_bad_suggestions( "I have been using browser use in local mode for a while and i am pretty fascinated about the project.", FascinatedBy::default(), &[ "I have been using browser use in local mode for a while and i am pretty fascinated by the project.", "I have been using browser use in local mode for a while and i am pretty fascinated with the project.", ][..], &[], ); } #[test] fn fix_work() { assert_good_and_bad_suggestions( "Hey guys, I am really fascinated about your work and I tried to build Magisk so I will be able to contribute for the project.", FascinatedBy::default(), &[ "Hey guys, I am really fascinated by your work and I tried to build Magisk so I will be able to contribute for the project.", "Hey guys, I am really fascinated with your work and I tried to build Magisk so I will be able to contribute for the project.", ][..], &[], ); } #[test] fn fix_ais() { assert_good_and_bad_suggestions( "I am a retired Dutch telecom engineer and fascinated about AIS applications.", FascinatedBy::default(), &[ "I am a retired Dutch telecom engineer and fascinated by AIS applications.", "I am a retired Dutch telecom engineer and fascinated with AIS applications.", ][..], &[], ); } #[test] fn fix_innovative_ideas() { assert_good_and_bad_suggestions( "Software Developer fascinated about innovative ideas, love to learn and share new technologies and ideas.", FascinatedBy::default(), &[ "Software Developer fascinated by innovative ideas, love to learn and share new technologies and ideas.", "Software Developer fascinated with innovative ideas, love to learn and share new technologies and ideas.", ][..], &[], ); } #[test] fn fix_coding() { assert_good_and_bad_suggestions( "m fascinated about coding and and sharing my code to the world.", FascinatedBy::default(), &[ "m fascinated by coding and and sharing my code to the world.", "m fascinated with coding and and sharing my code to the world.", ][..], &[], ); } } ================================================ FILE: harper-core/src/linting/fed_up_with.rs ================================================ use crate::{ Dialect, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct FedUpWith { expr: SequenceExpr, dialect: Dialect, } impl FedUpWith { pub fn new(dialect: Dialect) -> Self { let expr = SequenceExpr::fixed_phrase("fed up of"); Self { expr, dialect } } } impl ExprLinter for FedUpWith { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if self.dialect == Dialect::British { return None; } let oftok = toks.last()?; let ofspan = oftok.span; Some(Lint { span: ofspan, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "with", ofspan.get_content(src), )], message: "`Fed up of` is not accepted outside of British English.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Corrects `fed up of` to `fed up with` in dialects other than British English." } } #[cfg(test)] mod tests { use super::FedUpWith; use crate::Dialect; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn correct_fed_up_of_in_us_english() { assert_suggestion_result( "I am fed up of Bugzilla reports being ignored.", FedUpWith::new(Dialect::American), "I am fed up with Bugzilla reports being ignored.", ); } #[test] fn correct_fed_up_of_in_canadian_english() { assert_suggestion_result( "Fed up of long links ??? Use ✨ Linsh ✨, a CLI tool to shorten links.", FedUpWith::new(Dialect::Canadian), "Fed up with long links ??? Use ✨ Linsh ✨, a CLI tool to shorten links.", ); } #[test] fn correct_fed_up_of_in_aus_english() { assert_suggestion_result( "Fed up of the lack of Twitter embedded timeline styling options?", FedUpWith::new(Dialect::Australian), "Fed up with the lack of Twitter embedded timeline styling options?", ); } #[test] fn correct_fed_up_of_in_indian_english() { assert_suggestion_result( "I got fed up of finding my IP (v4) address in the big pile of text that ifconfig outputs on OS X.", FedUpWith::new(Dialect::Indian), "I got fed up with finding my IP (v4) address in the big pile of text that ifconfig outputs on OS X.", ); } #[test] fn dont_flag_fed_up_of_in_british_english() { assert_no_lints( "Fed up of having to repeat the same actions for installing webmin so here's a script for 16.04+", FedUpWith::new(Dialect::British), ); } } ================================================ FILE: harper-core/src/linting/feel_fell.rs ================================================ use crate::Token; use crate::char_string::CharStringExt; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::expr_linter::find_the_only_token_matching; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; pub struct FeelFell { expr: SequenceExpr, } impl Default for FeelFell { fn default() -> Self { let with_word_before = SequenceExpr::word_set(&["didn't", "doesn't"]) .t_ws() .t_aco("fell"); let with_word_after = SequenceExpr::default() .t_aco("fell") .t_ws() .then_word_set(&[ "comfortable", "free", "good", "I", "I'm", "it", "it's", "like", "that", "we", "you", ]); Self { expr: SequenceExpr::any_of(vec![Box::new(with_word_before), Box::new(with_word_after)]), } } } impl ExprLinter for FeelFell { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let fell_token = find_the_only_token_matching(toks, src, |tok, src| { tok.span .get_content(src) .eq_ignore_ascii_case_chars(&['f', 'e', 'l', 'l']) })?; Some(Lint { span: fell_token.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "feel", fell_token.span.get_content(src), )], message: "It looks like this is a typo, did you mean `feel`?".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Corrects some expressions using `fell` where `feel` is correct." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::FeelFell; #[test] fn fix_i_fell_like() { assert_suggestion_result( "But I fell like i am having a knot in my brain ...", FeelFell::default(), "But I feel like i am having a knot in my brain ...", ); } #[test] fn fix_if_you_fell_like_it() { assert_suggestion_result( "If you fell like it create w2ui-postgres for server side implementation", FeelFell::default(), "If you feel like it create w2ui-postgres for server side implementation", ); } #[test] fn fix_i_dont_fell_like() { assert_suggestion_result( "But with this bug in place, I don't fell like asking the student to work with this tool", FeelFell::default(), "But with this bug in place, I don't feel like asking the student to work with this tool", ); } #[test] fn fix_fell_comfortable() { assert_suggestion_result( "Technology that I fell comfortable to wok Php,Laravel, Javascript,Vue, Jquery, MySqli, sqLite.", FeelFell::default(), "Technology that I feel comfortable to wok Php,Laravel, Javascript,Vue, Jquery, MySqli, sqLite.", ); } #[test] fn fix_fell_good() { assert_suggestion_result( "I've ha a touch of the flu and didn't fell good enough to mess with the computer.", FeelFell::default(), "I've ha a touch of the flu and didn't feel good enough to mess with the computer.", ); } #[test] fn fix_didnt_fell() { assert_suggestion_result( "They have served me well, and I didn't fell that it's a gamble.", FeelFell::default(), "They have served me well, and I didn't feel that it's a gamble.", ); } #[test] fn fix_fell_free() { assert_suggestion_result( "Please fell free to add more songs.", FeelFell::default(), "Please feel free to add more songs.", ); } #[test] #[ignore = "Needs more context or better heuristics"] fn fix_fell_right() { assert_suggestion_result( "It may fell right first but only causes confusion in long run.", FeelFell::default(), "It may feel right first but only causes confusion in long run.", ); } #[test] fn dont_flag_fell_right_into() { assert_no_lints( "I followed the instructions in the browser, and waited, then it fell right into shape, and the system is working out.", FeelFell::default(), ); } #[test] fn dont_flag_fell_right_through() { assert_no_lints( "In this case the whole Piper context menu entry is missing since the uncaught exception fell right through the whole context menu factory.", FeelFell::default(), ); } #[test] fn fix_does_not_fell_comfortable() { assert_suggestion_result( "she does not fell comfortable with the \" iso \"-format", FeelFell::default(), "she does not feel comfortable with the \" iso \"-format", ); } #[test] #[ignore = "Needs more context or better heuristics"] fn dont_flag_didnt_fell_for_it() { assert_no_lints( "I even tried to trick someone else to delete and add the device but he didn't fell for it...", FeelFell::default(), ); } #[test] fn fix_fell_that() { assert_suggestion_result( "I fell that a libSQL adapter would be a reasonable addition to the core offering.", FeelFell::default(), "I feel that a libSQL adapter would be a reasonable addition to the core offering.", ); } #[test] fn fix_fell_it() { assert_suggestion_result( "I personally fell it makes the screens difficult to use", FeelFell::default(), "I personally feel it makes the screens difficult to use", ); } #[test] fn fix_fell_its() { assert_suggestion_result( "but I fell it's too late to update that specific part of the API", FeelFell::default(), "but I feel it's too late to update that specific part of the API", ); } #[test] fn fix_fell_im() { assert_suggestion_result( "I fell I'm missing sth and I need help.", FeelFell::default(), "I feel I'm missing sth and I need help.", ); } #[test] fn fix_fell_we() { assert_suggestion_result( "i fell we will have to directly use BigDecimal here for Json encoding", FeelFell::default(), "i feel we will have to directly use BigDecimal here for Json encoding", ); } #[test] fn fix_fell_i() { assert_suggestion_result( "feel free to reopen if you fell I have missed something", FeelFell::default(), "feel free to reopen if you feel I have missed something", ); } #[test] fn fix_fell_you() { assert_suggestion_result( "But, I maybe fell you are stepping away from what a Markdown link actually is", FeelFell::default(), "But, I maybe feel you are stepping away from what a Markdown link actually is", ); } } ================================================ FILE: harper-core/src/linting/few_units_of_time_ago.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::expr::TimeUnitExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, Suggestion}, }; pub struct FewUnitsOfTimeAgo { expr: SequenceExpr, } impl Default for FewUnitsOfTimeAgo { fn default() -> Self { let units = TimeUnitExpr; let start = SequenceExpr::default().then_word_except(&["a"]).t_ws(); let expr = SequenceExpr::with(start) .t_aco("few") .then_whitespace() .then(units) .then_whitespace() .t_aco("ago"); Self { expr } } } impl ExprLinter for FewUnitsOfTimeAgo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let mut span = None; for tok in toks.iter().take(3) { if tok.span.get_content_string(src).eq_ignore_ascii_case("few") { span = Some(tok.span); break; } } span?; Some(Lint { span: span.unwrap(), message: "In this construction you need to use `a few` instead of just `few`." .to_string(), suggestions: vec![Suggestion::replace_with_match_case_str( "a few", span.unwrap().get_content(src), )], ..Default::default() }) } fn description(&self) -> &'static str { "Corrects some expressions using `few` where `a few` is correct." } } #[cfg(test)] mod tests { use super::*; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // Basic unit tests #[test] #[ignore = "Needs ^ zero-width anchor that matches the start of a chunk"] fn fix_few_minutes_ago() { assert_suggestion_result( "Few minutes ago", FewUnitsOfTimeAgo::default(), "A few minutes ago", ); } #[test] fn dont_flag_a_few_minutes_ago() { assert_lint_count("A few minutes ago", FewUnitsOfTimeAgo::default(), 0); } #[test] fn fix_done_few_minutes_ago() { assert_suggestion_result( "Done few minutes ago", FewUnitsOfTimeAgo::default(), "Done a few minutes ago", ); } #[test] fn dont_flag_done_a_few_minutes_ago() { assert_lint_count("Done a few minutes ago", FewUnitsOfTimeAgo::default(), 0); } #[test] #[ignore = "Needs ^ zero-width anchor that matches the start of a chunk"] fn fix_after_space() { assert_suggestion_result( " Few minutes ago.", FewUnitsOfTimeAgo::default(), " A few minutes ago.", ); } #[test] #[ignore = "Needs ^ zero-width anchor that matches the start of a chunk"] fn fix_2nd_sentence() { assert_suggestion_result( "Hello World. Few minutes ago I bought your planet.", FewUnitsOfTimeAgo::default(), "Hello World. A few minutes ago I bought your planet.", ); } // Real world examples from GitHub #[test] fn fix_days() { assert_suggestion_result( "My jupyter kernel always says restarting and never ever runs i ran into the problem few days ago before it was fine dont know what happened", FewUnitsOfTimeAgo::default(), "My jupyter kernel always says restarting and never ever runs i ran into the problem a few days ago before it was fine dont know what happened", ); } #[test] fn fix_decades() { assert_suggestion_result( "This is very old piece of software I wrote few decades ago.", FewUnitsOfTimeAgo::default(), "This is very old piece of software I wrote a few decades ago.", ); } #[test] fn fix_hours() { assert_suggestion_result( "I just updated my index file few hours ago and there's this error.", FewUnitsOfTimeAgo::default(), "I just updated my index file a few hours ago and there's this error.", ); } #[test] fn fix_minutes() { assert_suggestion_result( "mysql installed few minutes ago somehow , ubuntu bash thinks its not installed.", FewUnitsOfTimeAgo::default(), "mysql installed a few minutes ago somehow , ubuntu bash thinks its not installed.", ); } #[test] fn fix_months() { assert_suggestion_result( "Hello, I was working with D455 few months ago, and everything was working fine.", FewUnitsOfTimeAgo::default(), "Hello, I was working with D455 a few months ago, and everything was working fine.", ); } #[test] fn fix_ms() { assert_suggestion_result( "So I not sure, by getting old signal (get from few ms ago), will it affected my result badly?", FewUnitsOfTimeAgo::default(), "So I not sure, by getting old signal (get from a few ms ago), will it affected my result badly?", ); } #[test] fn fix_seconds() { assert_suggestion_result( "I have submitted the same issue few seconds ago.", FewUnitsOfTimeAgo::default(), "I have submitted the same issue a few seconds ago.", ); } #[test] fn fix_weekends() { assert_suggestion_result( "This challenge is a Python jail escape and lucky for me our team had just done one few weekends ago so I was fairly familiar with the tricks to break out.", FewUnitsOfTimeAgo::default(), "This challenge is a Python jail escape and lucky for me our team had just done one a few weekends ago so I was fairly familiar with the tricks to break out.", ); } #[test] fn fix_weeks() { assert_suggestion_result( "Terraform cloud crashes on plan (same configuration worked few weeks ago)", FewUnitsOfTimeAgo::default(), "Terraform cloud crashes on plan (same configuration worked a few weeks ago)", ); } #[test] fn fix_years() { assert_suggestion_result( "sandbox-exec was deprecated on MacOS few years ago", FewUnitsOfTimeAgo::default(), "sandbox-exec was deprecated on MacOS a few years ago", ); } // Real world non-errors from GitHub #[test] fn dont_flag_centuries() { assert_lint_count( "Would have been useful a few centuries ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_days() { assert_lint_count( "A few days ago, I upgraded ComfyUI to the latest version, then the prompt node can't upload prompt list text file in Ubuntu", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_decades() { assert_lint_count( "With your QA background you may have heard of the IBM black team of testers back a few decades ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_hours() { assert_lint_count( "It was working well and we could see the installation page a few hours ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_milliseconds() { assert_lint_count( "It is actually the true motor angle observed a few milliseconds ago (pd latency).", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_minutes() { assert_lint_count( "Example from DoD The following was circulated a few minutes ago on an IDESG/NSTIC list", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_moments() { assert_lint_count( "Our microservices started failing a few moments ago when creating new...", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_months() { assert_lint_count( "A few months ago there was an mixed reality project.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_nights() { assert_lint_count( "As an example, a few nights ago I was working on my laptop and stuff that had been working stopped working.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_seconds() { assert_lint_count( "0 - 45 seconds, a few seconds ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_weeks() { assert_lint_count( "It was all working perfectly till a few weeks ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_years() { assert_lint_count( "Hello, I've been an intensive user of your dada2 pipeline until a few years ago.", FewUnitsOfTimeAgo::default(), 0, ); } // Real world non-errors from GitHub (but using singular forms) #[test] fn dont_flag_decade() { assert_lint_count( "With your QA background you may have heard of the IBM black team of testers back a few decade ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_hour() { assert_lint_count( "It was working well and we could see the installation page a few hour ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_millennia() { assert_lint_count( "A few millennia ago, there was a civilization here", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_minute() { assert_lint_count( "Example from DoD The following was circulated a few minute ago on an IDESG/NSTIC list", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_moment() { assert_lint_count( "No problem should be in the updated version pushed a few moment ago will be live in beta in about 10 min.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_month() { assert_lint_count( "I noticed the same thing a few month ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_second() { assert_lint_count( "Bug it doesnt even answer me rn, like a few second ago he did", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_week() { assert_lint_count( "A few week ago, when logging in the usual way", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_year() { assert_lint_count( "Hello, I've been an intensive user of your dada2 pipeline until a few year ago.", FewUnitsOfTimeAgo::default(), 0, ); } // Real world non-errors from GitHub using apostrophes #[test] fn dont_flag_days_apos() { assert_lint_count( "And finally it got released a few day's ago.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_months_apos() { assert_lint_count( "I had thought that since I had done this process a few month's ago the database could just be updated.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_weeks_apos() { assert_lint_count( "A few week's ago, I was alerted in Webmin that Webmin was eligible to upgrade to 1.880 which I did through Webmin.", FewUnitsOfTimeAgo::default(), 0, ); } #[test] fn dont_flag_years_apos() { assert_lint_count( "A few year's ago a spammer registered an unused base url", FewUnitsOfTimeAgo::default(), 0, ); } // Real world mistakes from GitHub using singular forms #[test] fn fix_day() { assert_suggestion_result( "That worked few day ago with the same setting.", FewUnitsOfTimeAgo::default(), "That worked a few day ago with the same setting.", ); } #[test] #[ignore = "Needs ^ zero-width anchor that matches the start of a chunk"] fn fix_decade() { assert_suggestion_result( "few decade ago, African Americans weren't allowed to swim in public", FewUnitsOfTimeAgo::default(), "a few decade ago, African Americans weren't allowed to swim in public", ); } #[test] fn fix_minute() { assert_suggestion_result( "All works fine, but few minute ago the device stop responding from web", FewUnitsOfTimeAgo::default(), "All works fine, but a few minute ago the device stop responding from web", ); } #[test] fn fix_weekend() { assert_suggestion_result( "I have done this few weekend ago.", FewUnitsOfTimeAgo::default(), "I have done this a few weekend ago.", ); } } ================================================ FILE: harper-core/src/linting/filler_words.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct FillerWords { expr: SequenceExpr, } impl Default for FillerWords { // A filler is unlikely to be completely on its own, so check for and remove with whitespace either before or after. fn default() -> Self { let filler_words = Lrc::new(WordSet::new(&["uh", "um"])); let pattern = SequenceExpr::any_of(vec![ Box::new(SequenceExpr::with(filler_words.clone()).then_whitespace()), Box::new(SequenceExpr::whitespace().then(filler_words)), ]); Self { expr: pattern } } } impl ExprLinter for FillerWords { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { // A filler is unlikely to be completely on its own, so check for and remove with whitespace either before or after. Some(Lint { span: toks.span()?, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::Remove], message: "Remove this unnecessary filler word.".to_string(), priority: 31, }) } fn description(&self) -> &str { "Removes filler words." } } #[cfg(test)] mod tests { use super::FillerWords; use crate::linting::tests::assert_suggestion_result; #[test] fn remove_uh() { assert_suggestion_result( "Let's remove all the uh filler words.", FillerWords::default(), "Let's remove all the filler words.", ); } #[test] fn remove_um_st_start() { assert_suggestion_result( "Um but I'll just add some context for this.", FillerWords::default(), "but I'll just add some context for this.", ); } } ================================================ FILE: harper-core/src/linting/find_fine.rs ================================================ use crate::Token; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::patterns::InflectionOfBe; use super::expr_linter::Chunk; use super::{ExprLinter, Lint, LintKind, Suggestion}; pub struct FindFine { expr: SequenceExpr, } impl Default for FindFine { fn default() -> Self { let expr = SequenceExpr::with(InflectionOfBe::default()) .t_ws() .t_aco("find"); Self { expr } } } impl ExprLinter for FindFine { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_word = matched_tokens.get(2)?; Some(Lint { span: offending_word.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "fine", offending_word.span.get_content(source), )], message: "Did you mean `fine`?".to_owned(), priority: 63, }) } fn description(&self) -> &'static str { "Fixes the common typo where writers write `find` when they mean `fine`." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::FindFine; #[test] fn issue_2115() { assert_suggestion_result( "I was using oil.nvim from an year and everything was find for me but I was missing a very key feature", FindFine::default(), "I was using oil.nvim from an year and everything was fine for me but I was missing a very key feature", ); assert_suggestion_result( "I made several observations throughout the evening and everything was find.", FindFine::default(), "I made several observations throughout the evening and everything was fine.", ); assert_suggestion_result( "I am find not using GPU at all for open3d.", FindFine::default(), "I am fine not using GPU at all for open3d.", ); } } ================================================ FILE: harper-core/src/linting/first_aid_kit.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct FirstAidKit { expr: SequenceExpr, } impl Default for FirstAidKit { fn default() -> Self { let supply_words = WordSet::new(&["aid", "starter", "travel", "tool"]); let pattern = SequenceExpr::with(supply_words) .then_whitespace() .then_any_capitalization_of("kid"); Self { expr: pattern } } } impl ExprLinter for FirstAidKit { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let typo_token = tokens.last()?; let typo_span = typo_token.span; let typo_text = typo_span.get_content(source); Some(Lint { span: typo_span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "kit".chars().collect(), typo_text, )], message: "Did you mean `kit` (a set of items) instead of “kid”?".to_string(), priority: 31, }) } fn description(&self) -> &str { "Detects when “kid” after “aid”, “starter”, “travel”, or “tool” should be “kit” (a set of supplies)." } } #[cfg(test)] mod tests { use super::FirstAidKit; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_first_aid_kid() { assert_suggestion_result( "A first aid kid is a collection of medical supplies.", FirstAidKit::default(), "A first aid kit is a collection of medical supplies.", ); } #[test] fn corrects_starter_kid() { assert_suggestion_result( "Check the starter kid before proceeding.", FirstAidKit::default(), "Check the starter kit before proceeding.", ); } #[test] fn corrects_travel_kid() { assert_suggestion_result( "Pack your travel kid for the trip.", FirstAidKit::default(), "Pack your travel kit for the trip.", ); } #[test] fn corrects_tool_kid() { assert_suggestion_result( "Don't forget the tool kid for assembly.", FirstAidKit::default(), "Don't forget the tool kit for assembly.", ); } #[test] fn does_not_flag_kid_in_other_contexts() { assert_lint_count( "The kid ran through the aid station.", FirstAidKit::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/flesh_out_vs_full_fledged.rs ================================================ use crate::{ expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, {CharStringExt, Lint, Token, TokenStringExt}, }; pub struct FleshOutVsFullFledged { expr: SequenceExpr, } impl Default for FleshOutVsFullFledged { fn default() -> Self { Self { expr: SequenceExpr::optional(SequenceExpr::word_set(&["full", "fully"]).t_ws_h()) .then_word_set(&[ "fledge", "fledged", "fledged", "fledges", "fledging", "flesh", "fleshed", "fleshed", "fleshes", "fleshing", "pledge", "pledged", "pledged", "pledges", "pledging", ]) .then_optional(SequenceExpr::default().t_ws_h().t_aco("out")), } } } impl ExprLinter for FleshOutVsFullFledged { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { // Is the first word is "full" or "fully"? let has_full_y = toks .first() .map(|t| { t.span .get_content(src) .eq_any_ignore_ascii_case_str(&["full", "fully"]) }) .unwrap_or(false); // Is the last word is "out"? let mut has_out = toks .last() .map(|t| t.span.get_content(src).eq_ignore_ascii_case_str("out")) .unwrap_or(false); // Adjust tokens to exclude "out" when it's part of a hyphenated compound let toks = if has_out && ctx .is_some_and(|(_, next)| next.first().map(|t| t.kind.is_hyphen()).unwrap_or(false)) { has_out = false; &toks[..toks.len() - 2] } else { toks }; // Parse the verb form (tense) enum Form { Lemma, Past, ThirdPersonSingular, Ing, } let vtok_idx = if has_full_y { 2 } else { 0 }; let vtok = &toks[vtok_idx]; let vtok_chars = vtok.span.get_content(src); let form = match vtok_chars.last() { Some('d') => Form::Past, Some('s') => Form::ThirdPersonSingular, Some('g') => Form::Ing, _ => Form::Lemma, }; // Parse which verb enum Verb { Fledge, Flesh, Pledge, } let verb = if vtok_chars.starts_with_ignore_ascii_case_str("fledg") { Verb::Fledge } else if vtok_chars.starts_with_ignore_ascii_case_str("flesh") { Verb::Flesh } else { Verb::Pledge }; // Separated by spaces or hyphens? Abort if it's mixed. let mut sep_flags = 0; for sep_tok in toks.iter().skip(1).step_by(2) { if sep_tok.kind.is_hyphen() { sep_flags |= 1; } else if sep_tok.kind.is_whitespace() { sep_flags |= 2; } else { sep_flags |= 4; } } let is_hy = match sep_flags { 1 => true, 2 => false, _ => return None, }; match (has_full_y, verb, &form, has_out) { // full pledge(d) -> full fledged // full fledge -> full fledged (true, Verb::Pledge, Form::Lemma | Form::Past, false) | (true, Verb::Fledge, Form::Lemma, false) => { let verb_and_sep_toks = &toks[0..2]; let verb_and_sep_span = verb_and_sep_toks.span()?; Some(Lint { span: toks.span()?, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( format!("{}fledged", verb_and_sep_span.get_content_string(src)) .chars() .collect(), verb_and_sep_span.get_content(src), )], message: "This idiom uses the word `fledged`.".to_string(), ..Default::default() }) } // fledge out -> flesh out (false, Verb::Fledge | Verb::Pledge, _, true) => Some(Lint { span: vtok.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( match &form { Form::Lemma => "flesh", Form::Past => "fleshed", Form::Ing => "fleshing", Form::ThirdPersonSingular => "fleshes", }, vtok_chars, )], message: "This idiom uses the word `flesh`.".to_string(), ..Default::default() }), // TODO: only with "fully" and not "full"? // fully fledged/pledged out -> fully fledged / fully fleshed out // fully fleshed -> fully fledged / fully fleshed out (true, Verb::Fledge | Verb::Pledge, Form::Past, true) | (true, Verb::Flesh, Form::Past, false) => Some(Lint { span: toks[vtok_idx..].span()?, lint_kind: LintKind::Usage, suggestions: vec![ Suggestion::replace_with_match_case_str("fledged", vtok_chars), Suggestion::replace_with_match_case( format!("fleshed{}out", if is_hy { '-' } else { ' ' }) .chars() .collect(), vtok_chars, ), ], message: "Perhaps you're confusing `fully fledged` and `fleshed out`?".to_string(), ..Default::default() }), _ => None, } } fn description(&self) -> &str { "Corrects mixing up `flesh out` and `full fledged`." } } #[cfg(test)] mod tests { use crate::linting::{ flesh_out_vs_full_fledged::FleshOutVsFullFledged, tests::{assert_good_and_bad_suggestions, assert_suggestion_result}, }; // FULL // full Vlemma #[test] fn full_fledge_hyphen() { assert_suggestion_result( "Or do we want to become a full-fledge out-of-core ml library?", FleshOutVsFullFledged::default(), "Or do we want to become a full-fledged out-of-core ml library?", ); } // full Vpast #[test] fn full_fleshed_space() { assert_suggestion_result( "Run a full fleshed ubuntu in termux without rooting your android.", FleshOutVsFullFledged::default(), "Run a full fledged ubuntu in termux without rooting your android.", ); } #[test] fn full_fleshed_webscraper_hyphen() { assert_suggestion_result( "A full-fleshed webscraper web app build on Next.js13 with tracking the prices of different product you want", FleshOutVsFullFledged::default(), "A full-fledged webscraper web app build on Next.js13 with tracking the prices of different product you want", ); } #[test] fn full_fleshed_implementation_hyphen() { assert_suggestion_result( "almost provides a full-fleshed implementation allowing to read binary files into a tensor in a torchscript-compatible way.", FleshOutVsFullFledged::default(), "almost provides a full-fledged implementation allowing to read binary files into a tensor in a torchscript-compatible way.", ); } #[test] fn full_pledged_space() { assert_suggestion_result( "Any plan to make full pledged php server with swoole?", FleshOutVsFullFledged::default(), "Any plan to make full fledged php server with swoole?", ); } #[test] fn full_pledged_hyphen() { assert_suggestion_result( "Not yet, but I am considering the full-pledged snapshotting built-in.", FleshOutVsFullFledged::default(), "Not yet, but I am considering the full-fledged snapshotting built-in.", ); } // FULLY // fully Vpast - out #[test] fn not_fully_fledged_out() { assert_good_and_bad_suggestions( "There, it's not fully fledged out yet, but it's just an idea for now.", FleshOutVsFullFledged::default(), &[ "There, it's not fully fleshed out yet, but it's just an idea for now.", "There, it's not fully fledged yet, but it's just an idea for now.", ], &[], ); } #[test] fn fully_fledged_out() { assert_good_and_bad_suggestions( "Is the spawning process fully fledged out yet or am I joining the party too early?", FleshOutVsFullFledged::default(), &[ "Is the spawning process fully fleshed out yet or am I joining the party too early?", "Is the spawning process fully fledged yet or am I joining the party too early?", ], &[], ); } #[test] fn fully_fleshed_space() { assert_good_and_bad_suggestions( "A Fully Fleshed E-Commerce web application, built with React, Redux and Firebase", FleshOutVsFullFledged::default(), &[ "A Fully Fledged E-Commerce web application, built with React, Redux and Firebase", "A Fully Fleshed out E-Commerce web application, built with React, Redux and Firebase", ], &[], ); } #[test] fn fully_fleshed_hyphen() { assert_good_and_bad_suggestions( "This issue tracks the current progress towards publishing a fully-fleshed Fabric version of Gallery", FleshOutVsFullFledged::default(), &[ "This issue tracks the current progress towards publishing a fully-fleshed-out Fabric version of Gallery", "This issue tracks the current progress towards publishing a fully-fledged Fabric version of Gallery", ], &[], ); } #[test] fn fully_pledged_space() { assert_suggestion_result( "Overall, we are already moving closer to having a fully pledged distributed recording and replay.", FleshOutVsFullFledged::default(), "Overall, we are already moving closer to having a fully fledged distributed recording and replay.", ); } // V.LEMMA - out #[test] fn fledge_out() { assert_suggestion_result( "For this we could fledge out the rule evaluation in a library and link this library to the server.", FleshOutVsFullFledged::default(), "For this we could flesh out the rule evaluation in a library and link this library to the server.", ); } // V.PAST - out #[test] fn fledged_out_space() { assert_suggestion_result( "We will be talking more about this when the technical details a more fledged out.", FleshOutVsFullFledged::default(), "We will be talking more about this when the technical details a more fleshed out.", ); } } ================================================ FILE: harper-core/src/linting/for_noun.rs ================================================ use crate::expr::Expr; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::{ Token, patterns::{NominalPhrase, Word}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ForNoun { expr: SequenceExpr, } impl Default for ForNoun { fn default() -> Self { let pattern = SequenceExpr::aco("fro") .then_whitespace() .then(NominalPhrase.or(Word::new("sure"))); Self { expr: pattern } } } impl ExprLinter for ForNoun { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.first()?.span; let problem_chars = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "for", problem_chars, )], message: "`For` is more common in this context.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Corrects the archaic or mistaken `fro` to `for` when followed by a noun." } } #[cfg(test)] mod tests { use super::ForNoun; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_fro_basic_correction() { assert_suggestion_result( "I got a text fro Sarah.", ForNoun::default(), "I got a text for Sarah.", ); } #[test] fn allows_for_clean() { assert_lint_count("I got a text for Sarah.", ForNoun::default(), 0); } #[test] fn corrects_fro_sure() { assert_suggestion_result( "He was away fro sure!", ForNoun::default(), "He was away for sure!", ); } } ================================================ FILE: harper-core/src/linting/free_predicate.rs ================================================ use crate::Token; use crate::TokenKind; use crate::char_string::CharStringExt; use crate::expr::{Expr, ExprMap, SequenceExpr}; use crate::patterns::WhitespacePattern; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct FreePredicate { expr: ExprMap, } impl Default for FreePredicate { fn default() -> Self { let mut map = ExprMap::default(); let no_modifier = SequenceExpr::with(linking_like) .t_ws() .then(matches_fee) .then_optional(WhitespacePattern) .then(follows_fee); map.insert(no_modifier, 2); let with_adverb = SequenceExpr::with(linking_like) .t_ws() .then_adverb() .t_ws() .then(matches_fee) .then_optional(WhitespacePattern) .then(follows_fee); map.insert(with_adverb, 4); Self { expr: map } } } impl ExprLinter for FreePredicate { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_idx = *self.expr.lookup(0, matched_tokens, source)?; let offending = matched_tokens.get(offending_idx)?; Some(Lint { span: offending.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "free", offending.span.get_content(source), )], message: "Use `free` here to show that something costs nothing.".to_owned(), priority: 38, }) } fn description(&self) -> &'static str { "Helps swap in `free` when a linking verb is followed by the noun `fee`." } } fn matches_fee(token: &Token, source: &[char]) -> bool { if !token.kind.is_noun() { return false; } const FEE: [char; 3] = ['f', 'e', 'e']; let content = token.span.get_content(source); content.len() == FEE.len() && content .iter() .zip(FEE) .all(|(actual, expected)| actual.eq_ignore_ascii_case(&expected)) } fn follows_fee(token: &Token, _source: &[char]) -> bool { if token.kind.is_hyphen() { return false; } token.kind.is_preposition() || token.kind.is_conjunction() || matches!(token.kind, TokenKind::Punctuation(_)) } fn linking_like(token: &Token, source: &[char]) -> bool { const BE_FORMS: [&str; 8] = ["be", "is", "am", "are", "was", "were", "being", "been"]; let content = token.span.get_content(source); BE_FORMS .iter() .any(|form| content.eq_ignore_ascii_case_str(form)) } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::FreePredicate; #[test] fn corrects_is_fee_for() { assert_suggestion_result( "The trial is fee for new members.", FreePredicate::default(), "The trial is free for new members.", ); } #[test] fn corrects_totally_fee() { assert_suggestion_result( "Customer support is totally fee.", FreePredicate::default(), "Customer support is totally free.", ); } #[test] fn corrects_really_fee_to() { assert_suggestion_result( "The workshop is really fee to attend.", FreePredicate::default(), "The workshop is really free to attend.", ); } #[test] fn corrects_fee_with_comma() { assert_suggestion_result( "Our platform is fee, and always available.", FreePredicate::default(), "Our platform is free, and always available.", ); } #[test] fn corrects_fee_period() { assert_suggestion_result( "Access is fee.", FreePredicate::default(), "Access is free.", ); } #[test] fn corrects_fee_past_tense() { assert_suggestion_result( "The program was fee for nonprofits.", FreePredicate::default(), "The program was free for nonprofits.", ); } #[test] fn allows_fee_based() { assert_no_lints("The pricing model is fee-based.", FreePredicate::default()); } #[test] fn allows_fee_paying() { assert_no_lints("The membership is fee-paying.", FreePredicate::default()); } #[test] fn allows_fee_schedule_statement() { assert_no_lints( "This plan has a fee for standard support.", FreePredicate::default(), ); } #[test] fn allows_fee_free_phrase() { assert_no_lints( "Our service is fee-free for students.", FreePredicate::default(), ); } #[test] fn counts_single_lint() { assert_lint_count( "The upgrade is fee for existing users.", FreePredicate::default(), 1, ); } } ================================================ FILE: harper-core/src/linting/friend_of_me.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct FriendOfMe { expr: SequenceExpr, } impl Default for FriendOfMe { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["friend", "friends", "enemy", "enemies"]) .then_whitespace() .t_aco("of") .t_ws() .then_object_pronoun(), } } } impl ExprLinter for FriendOfMe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let obj_pron_tok = toks.last()?; let obj_pron_str = obj_pron_tok.span.get_content_string(src); let poss_pron_str = match obj_pron_str.as_str() { "me" => "mine", "you" => "yours", "him" => "his", // "her" is also a possessive determiner, which leads to many false positives "her" => return None, "it" => return None, "us" => "ours", "them" => "theirs", _ => return None, }; Some(Lint { span: obj_pron_tok.span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::replace_with_match_case_str( poss_pron_str, obj_pron_tok.span.get_content(src), )], message: format!("Use `{poss_pron_str}` instead of `{obj_pron_str}`."), priority: 31, }) } fn description(&self) -> &'static str { "Corrects wrong pronoun usage in constructions like `a friend of me`." } } #[cfg(test)] mod tests { use super::FriendOfMe; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_friend_of_me() { assert_suggestion_result( "Last year a friend of me died unexpectedly (not a close friend).", FriendOfMe::default(), "Last year a friend of mine died unexpectedly (not a close friend).", ); } #[test] fn corrects_friend_of_you() { assert_suggestion_result( "imagine a friend of you wants to disturb your call, and send you a session-terminate with a wrong SID", FriendOfMe::default(), "imagine a friend of yours wants to disturb your call, and send you a session-terminate with a wrong SID", ); } #[test] fn corrects_friend_of_us() { assert_suggestion_result( "You have denounced a friend of us! You have denounced an enemy of us.", FriendOfMe::default(), "You have denounced a friend of ours! You have denounced an enemy of ours.", ); } #[test] fn corrects_friends_of_them() { assert_suggestion_result( "guest has friend and they see which friends of them are comming", FriendOfMe::default(), "guest has friend and they see which friends of theirs are comming", ); } #[test] fn corrects_friend_of_him() { assert_suggestion_result( "Ah, got it, i thought you may was a friend of him", FriendOfMe::default(), "Ah, got it, i thought you may was a friend of his", ); } #[test] fn corrects_friends_of_me() { assert_suggestion_result( "guest has friend and they see which friends of me are comming", FriendOfMe::default(), "guest has friend and they see which friends of mine are comming", ); } #[test] fn corrects_friends_of_us() { assert_suggestion_result( "This project was created for friends of us.", FriendOfMe::default(), "This project was created for friends of ours.", ); } } ================================================ FILE: harper-core/src/linting/go_so_far_as_to.rs ================================================ use crate::Token; use crate::TokenStringExt; use crate::expr::{Expr, SequenceExpr}; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind}; pub struct GoSoFarAsTo { exp: SequenceExpr, } impl Default for GoSoFarAsTo { fn default() -> Self { Self { exp: SequenceExpr::word_set(&["go", "goes", "going", "gone", "went"]) .then_fixed_phrase(" so far to ") .then_optional(SequenceExpr::default().then_adverb().t_ws()) .then_any_word(), } } } impl ExprLinter for GoSoFarAsTo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.exp } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let toks_len = toks.len(); if toks_len != 9 && toks_len != 11 { return None; } let last = toks.last().unwrap(); let penult = &toks[toks_len - 3]; match (toks_len, penult.kind.is_adverb(), last.kind.is_verb_lemma()) { (11, true, true) => (), (9, _, true) => (), _ => return None, } let go_so_far_to_toks = &toks[0..=6]; let go_so_far_to_span = go_so_far_to_toks.span()?; let go_so_far_toks = &toks[0..=4]; let to_tok = &toks[6]; let sugg = Suggestion::replace_with_match_case( format!( "{} as {}", go_so_far_toks.span()?.get_content_string(src), to_tok.span.get_content_string(src) ) .chars() .collect(), go_so_far_to_span.get_content(src), ); Some(Lint { span: go_so_far_to_span, lint_kind: LintKind::Nonstandard, suggestions: vec![sugg], message: "If this is intended to express going beyond what's expected, the standard idiom is `go so far as to`".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Flags 'go so far to' when it should be 'go so far as to' to express going beyond expectations" } } #[cfg(test)] mod tests { use super::GoSoFarAsTo; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn go_so_far_to() { assert_suggestion_result( "I'd even go so far to say as it's a good way to get started with getting things onto ...", GoSoFarAsTo::default(), "I'd even go so far as to say as it's a good way to get started with getting things onto ...", ); } #[test] fn goes_so_far_to() { assert_suggestion_result( "I believe Java goes so far to even throw a runtime exception.", GoSoFarAsTo::default(), "I believe Java goes so far as to even throw a runtime exception.", ); } #[test] fn gone_so_far_to() { assert_suggestion_result( "I've gone so far to reinstall Mac OS, which got the runner to finally start", GoSoFarAsTo::default(), "I've gone so far as to reinstall Mac OS, which got the runner to finally start", ); } #[test] fn went_so_far_to() { assert_suggestion_result( "I've read these posts but only went so far to conclude that I need to potentially add sql statements into the blocks", GoSoFarAsTo::default(), "I've read these posts but only went so far as to conclude that I need to potentially add sql statements into the blocks", ); } #[test] fn went_so_far_to_adverb() { assert_suggestion_result( "I even went so far to manually replace the .AppImage with a different file in the Applications folder", GoSoFarAsTo::default(), "I even went so far as to manually replace the .AppImage with a different file in the Applications folder", ); } #[test] #[ignore = "A false positive we can't detect due to the next word being a verb lemma"] fn dont_flag_going_so_far_to() { assert_no_lints( "Why dictate that the system must be canonically described through a textual syntax – especially after going so far to make that unnecessary?", GoSoFarAsTo::default(), ); } #[test] fn dont_flag_goes_so_far_to() { assert_no_lints( "... even so much that one line goes so far to the right", GoSoFarAsTo::default(), ); } #[test] fn dont_flag_go_so_far_to() { assert_no_lints( "Unfortunetly, our logs don't go so far to that time, but I found something interesting.", GoSoFarAsTo::default(), ); } } ================================================ FILE: harper-core/src/linting/go_to_war.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct GoToWar { expr: SequenceExpr, } impl Default for GoToWar { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["go", "goes", "going", "gone", "went"]) .t_ws() .then_preposition() .t_ws() .then_word_set(&["war"]), } } } impl ExprLinter for GoToWar { type Unit = Chunk; fn description(&self) -> &str { "Replaces `go at war` with `go to war`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let prep_idx = 2; let prep_tok = &toks[prep_idx]; let prep_span = prep_tok.span; let prep_chars = prep_span.get_content(src); if prep_chars.eq_ignore_ascii_case_chars(&['t', 'o']) { return None; } Some(Lint { span: prep_span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str("to", prep_chars)], message: "Use `to` instead of `at`.".to_string(), ..Default::default() }) } } #[cfg(test)] pub mod tests { use super::GoToWar; use crate::linting::tests::assert_suggestion_result; #[test] fn go_at() { assert_suggestion_result( "specialization makes you vulnerable if you go at war with your trading partners", GoToWar::default(), "specialization makes you vulnerable if you go to war with your trading partners", ); } #[test] fn go_in() { assert_suggestion_result( "for whatever reason, it would go in war with another town", GoToWar::default(), "for whatever reason, it would go to war with another town", ); } #[test] fn go_on() { assert_suggestion_result( "How much time do we have before Youtube starts to go on war with Revanced?", GoToWar::default(), "How much time do we have before Youtube starts to go to war with Revanced?", ); } #[test] fn goes_on() { assert_suggestion_result( "It would be the same case if USA goes on war with Canada and Mexico.", GoToWar::default(), "It would be the same case if USA goes to war with Canada and Mexico.", ); } #[test] fn going_at() { assert_suggestion_result( "So instead of going at war with technology, let's be friends and work better.", GoToWar::default(), "So instead of going to war with technology, let's be friends and work better.", ); } #[test] fn going_on() { assert_suggestion_result( "How consequences of India going on war with Pakistan after the recent Uri Terror attack?", GoToWar::default(), "How consequences of India going to war with Pakistan after the recent Uri Terror attack?", ); } #[test] fn went_at() { assert_suggestion_result( "the magic energy released since the colleges went at war with each others", GoToWar::default(), "the magic energy released since the colleges went to war with each others", ); } #[test] fn went_in() { assert_suggestion_result( "even America wanted to expand its territories and they went in War with Mexico", GoToWar::default(), "even America wanted to expand its territories and they went to War with Mexico", ); } #[test] fn went_on() { assert_suggestion_result( "I used to skip clubman and make as many vills as i can and then went on war with ai", GoToWar::default(), "I used to skip clubman and make as many vills as i can and then went to war with ai", ); } } ================================================ FILE: harper-core/src/linting/good_at.rs ================================================ use crate::{ Lint, Token, TokenStringExt, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::{InflectionOfBe, WordSet}, }; pub struct GoodAt { expr: FirstMatchOf, } impl Default for GoodAt { fn default() -> Self { let we_re_not_always_very_good_in_sth = SequenceExpr::any_of(vec![ Box::new(InflectionOfBe::default()), Box::new(WordSet::new(&[ "I'm", "we're", "you're", "he's", "she's", "it's", "they're", "Im", "were", "youre", "your", "hes", "shes", "its", "theyre", ])), ]) .t_ws() .then_optional(SequenceExpr::aco("not").t_ws()) .then_optional(SequenceExpr::default().then_frequency_adverb().t_ws()) .then_optional(SequenceExpr::default().then_degree_adverb().t_ws()) .then_word_set(&["good", "bad", "great", "okay", "OK"]) .t_ws() .t_aco("in") .t_ws() .then_any_word(); let good_in_skill_or_subject = SequenceExpr::word_set(&["good", "bad", "great", "okay", "OK"]) .t_ws() .t_aco("in") .t_ws() .then_word_set(&[ // sciences "biology", "chemistry", "math", "mathematics", "physics", // programming "programming", "coding", "c", // Note: C++ would be multiple tokens "debugging", "go", "java", "javascript", "laravel", "python", "ruby", // languages "english", "chinese", "french", "german", "japanese", "spanish", ]); let expr = FirstMatchOf::new(vec![ Box::new(we_re_not_always_very_good_in_sth), Box::new(good_in_skill_or_subject), ]); Self { expr } } } impl ExprLinter for GoodAt { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let prep_span = toks.get_rel(-3)?.span; Some(Lint { span: prep_span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( "at".chars().collect(), prep_span.get_content(src), )], message: "Use 'good at' to describe proficiency with a skill.".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Checks for `good in` used instead of `good at` to describe proficiency with a skill." } } #[cfg(test)] mod tests { use super::GoodAt; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_good_in_being_frugal() { assert_suggestion_result( "but we found that Claude is not always very good in being frugal ( Gemini seemed better at it ) .", GoodAt::default(), "but we found that Claude is not always very good at being frugal ( Gemini seemed better at it ) .", ); } #[test] fn fix_im_not_good_in_python() { assert_suggestion_result( "can't run it i'm not good in python", GoodAt::default(), "can't run it i'm not good at python", ); } #[test] fn fix_not_good_in_go() { assert_suggestion_result( "Hi, I have very similar problem and I'm not good in go either.", GoodAt::default(), "Hi, I have very similar problem and I'm not good at go either.", ); } #[test] fn fix_not_good_in_coding_stuff() { assert_suggestion_result( "Unfortunately I can't help in anyway but testing, because I'm not good in coding stuff.", GoodAt::default(), "Unfortunately I can't help in anyway but testing, because I'm not good at coding stuff.", ); } #[test] fn fix_very_good_in_mathematics() { assert_suggestion_result( "They were very good in Mathematics and were the pets of Ranjani Ma'am.", GoodAt::default(), "They were very good at Mathematics and were the pets of Ranjani Ma'am.", ); } #[test] fn fix_not_good_in_coding() { assert_suggestion_result( "Didnt know these things.. and since im not good in coding, maybe one day someone will work on this.", GoodAt::default(), "Didnt know these things.. and since im not good at coding, maybe one day someone will work on this.", ); } #[test] fn fix_very_good_in_most_things() { assert_suggestion_result( "But I do want to continue using riverpod because its very good in most things I need from my app.", GoodAt::default(), "But I do want to continue using riverpod because its very good at most things I need from my app.", ); } #[test] fn fix_not_good_in_laravel() { assert_suggestion_result( "im not good in laravel.", GoodAt::default(), "im not good at laravel.", ); } #[test] fn fixim_not_good_in_english() { assert_suggestion_result( "Sorry about my grammar im not good in English.", GoodAt::default(), "Sorry about my grammar im not good at English.", ); } #[test] fn fix_not_all_good_in_english() { assert_suggestion_result( "I think if there is translation support will be great, our school society not all good in english.", GoodAt::default(), "I think if there is translation support will be great, our school society not all good at english.", ); } #[test] fn fix_i_am_not_good_in_english() { assert_suggestion_result( "I am in Togo, i am not good in english but i will ask you to apologize me for my speaking.", GoodAt::default(), "I am in Togo, i am not good at english but i will ask you to apologize me for my speaking.", ); } #[test] fn fix_not_good_in_programming() { assert_suggestion_result( "Is it My Drive,Chess or \"My Drive\",\"Chess\" or what? Because I'm not good in programming.", GoodAt::default(), "Is it My Drive,Chess or \"My Drive\",\"Chess\" or what? Because I'm not good at programming.", ); } #[test] fn fix_not_so_good_in_coding() { assert_suggestion_result( "I'm not so good in coding to understand how to handle all these bytes...", GoodAt::default(), "I'm not so good at coding to understand how to handle all these bytes...", ); } #[test] fn fix_im_not_good_in_programming() { assert_suggestion_result( "Im not good in programming , but can i ask what is the password of your codes?", GoodAt::default(), "Im not good at programming , but can i ask what is the password of your codes?", ); } } ================================================ FILE: harper-core/src/linting/handful.rs ================================================ use crate::expr::{Expr, SequenceExpr, SpaceOrHyphen}; use crate::linting::expr_linter::Chunk; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; pub struct Handful { expr: SequenceExpr, } impl Default for Handful { fn default() -> Self { let expr = SequenceExpr::any_capitalization_of("hand") .then_one_or_more(SpaceOrHyphen) .then_any_capitalization_of("full") .then_one_or_more(SpaceOrHyphen) .then_any_capitalization_of("of"); Self { expr } } } impl ExprLinter for Handful { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { if matched_tokens.len() < 2 { return None; } let mut highlight_end = matched_tokens.len() - 1; while highlight_end > 0 { let prev = &matched_tokens[highlight_end - 1]; if prev.kind.is_whitespace() || prev.kind.is_hyphen() { highlight_end -= 1; } else { break; } } if highlight_end == 0 { return None; } let replacement = &matched_tokens[..highlight_end]; let span = replacement.span()?; let template = matched_tokens.first()?.span.get_content(source); Some(Lint { span, lint_kind: LintKind::BoundaryError, suggestions: vec![Suggestion::replace_with_match_case( "handful".chars().collect(), template, )], message: "Write this quantity as the single word `handful`.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Keeps the palm-sized quantity expressed by `handful` as one word." } } #[cfg(test)] mod tests { use super::Handful; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn suggests_plain_spacing() { assert_suggestion_result( "Her basket held a hand full of berries.", Handful::default(), "Her basket held a handful of berries.", ); } #[test] fn suggests_capitalized_form() { assert_suggestion_result( "Hand full of tales lined the shelf.", Handful::default(), "Handful of tales lined the shelf.", ); } #[test] fn suggests_hyphenated_form() { assert_suggestion_result( "A hand-full of marbles scattered across the floor.", Handful::default(), "A handful of marbles scattered across the floor.", ); } #[test] fn suggests_space_hyphen_combo() { assert_suggestion_result( "A hand - full of seeds spilled on the workbench.", Handful::default(), "A handful of seeds spilled on the workbench.", ); } #[test] fn suggests_initial_hyphen_variants() { assert_suggestion_result( "Hand-Full of furniture, the cart creaked slowly.", Handful::default(), "Handful of furniture, the cart creaked slowly.", ); } #[test] fn flags_multiple_instances() { assert_lint_count( "She carried a hand full of carrots and a hand full of radishes.", Handful::default(), 2, ); } #[test] fn allows_correct_handful() { assert_no_lints( "A handful of volunteers arrived in time.", Handful::default(), ); } #[test] fn allows_parenthetical_hand() { assert_no_lints( "His hand, full of ink, kept writing without pause.", Handful::default(), ); } #[test] fn allows_hand_is_full() { assert_no_lints("The hand is full of water.", Handful::default()); } #[test] fn allows_handfull_typo() { assert_no_lints( "The word handfull is an incorrect spelling.", Handful::default(), ); } } ================================================ FILE: harper-core/src/linting/have_pronoun.rs ================================================ use crate::expr::{AnchorStart, Expr, SequenceExpr}; use crate::{Token, TokenKind}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct HavePronoun { expr: SequenceExpr, } impl Default for HavePronoun { fn default() -> Self { let expr = SequenceExpr::with(AnchorStart) .t_aco("has") .t_ws() .then_kind_either( TokenKind::is_first_person_singular_pronoun, TokenKind::is_plural_pronoun, ); Self { expr } } } impl ExprLinter for HavePronoun { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { // First real word in the match is always "has". let has_tok = toks.iter().find(|t| t.kind.is_word())?; let span = has_tok.span; let original = span.get_content(src); Some(Lint { span, lint_kind: LintKind::Agreement, suggestions: vec![Suggestion::replace_with_match_case( "have".chars().collect(), original, )], message: "Use `have` with first-person singular or plural pronouns.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Flags questions that begin with `has` followed by a pronoun that requires `have`, \ such as `Has we …` or `Has I …`, and suggests the correct auxiliary." } } #[cfg(test)] mod tests { use super::HavePronoun; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_has_we() { assert_suggestion_result( "Has we finished the report?", HavePronoun::default(), "Have we finished the report?", ); } #[test] fn corrects_has_you() { assert_suggestion_result( "Has you misunderstood?", HavePronoun::default(), "Have you misunderstood?", ); } #[test] fn corrects_has_i() { assert_suggestion_result( "Has I misunderstood?", HavePronoun::default(), "Have I misunderstood?", ); } #[test] fn corrects_has_they() { assert_suggestion_result( "Has they arrived yet?", HavePronoun::default(), "Have they arrived yet?", ); } #[test] fn allows_has_he() { assert_lint_count("Has he arrived yet?", HavePronoun::default(), 0); } #[test] fn ignores_non_initial_usage() { assert_lint_count( "The system has we confused for a moment.", HavePronoun::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/have_take_a_look.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Dialect, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct HaveTakeALook { expr: SequenceExpr, dialect: Dialect, } impl HaveTakeALook { pub fn new(dialect: Dialect) -> Self { let light_verb = match dialect { // Match the opposite of what is used in the dialect. Dialect::British | Dialect::Australian => &["take", "took", "taken", "takes", "taking"], _ => &["have", "had", "had", "has", "having"], }; let expr = SequenceExpr::word_set(light_verb) .t_ws() .then_fixed_phrase("a look"); Self { expr, dialect } } } impl ExprLinter for HaveTakeALook { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let light_verb_tok = toks.first().unwrap(); let light_verb_str = light_verb_tok.span.get_content_string(src); let light_verb = light_verb_str.to_ascii_lowercase(); let translated_light_verb: &[&str] = match light_verb.as_str() { "have" => &["take"], "had" => &["took", "taken"], "has" => &["takes"], "having" => &["taking"], "take" => &["have"], "took" => &["had"], "taken" => &["had"], "takes" => &["has"], "taking" => &["having"], _ => return None, }; let suggestions = translated_light_verb .iter() .map(|s| { Suggestion::replace_with_match_case( s.chars().collect(), light_verb_tok.span.get_content(src), ) }) .collect(); let message = format!( "{} English prefers {} over `{} a look`.", self.dialect, translated_light_verb .iter() .map(|lv| format!("`{lv} a look`")) .collect::>() .join(" or "), light_verb, ); Some(Lint { span: light_verb_tok.span, lint_kind: LintKind::Regionalism, suggestions, message, priority: 63, }) } fn description(&self) -> &str { "Corrects either `have a look` or `take a look` to the other, depending on the dialect." } } #[cfg(test)] mod tests { use super::HaveTakeALook; use crate::{Dialect, linting::tests::assert_suggestion_result}; #[test] fn correct_taking_a_look() { assert_suggestion_result( "Consider taking a look at crossorigin attribute.", HaveTakeALook::new(Dialect::British), "Consider having a look at crossorigin attribute.", ); } #[test] fn correct_take_a_look() { assert_suggestion_result( "Have time to help take a look at the jdk21 upgrade issue.", HaveTakeALook::new(Dialect::Australian), "Have time to help have a look at the jdk21 upgrade issue.", ); } #[test] fn correct_have_a_look() { assert_suggestion_result( "Have a look at this question crashing histoire using init-state and ref.", HaveTakeALook::new(Dialect::American), "Take a look at this question crashing histoire using init-state and ref.", ); } #[test] fn correct_taken_a_look() { assert_suggestion_result( "Have you taken a look at HQEMU?", HaveTakeALook::new(Dialect::British), "Have you had a look at HQEMU?", ); } #[test] fn correct_had_a_look() { assert_suggestion_result( "I had a look at the podman.go and have some theories I could test.", HaveTakeALook::new(Dialect::Canadian), "I took a look at the podman.go and have some theories I could test.", ); } #[test] fn correct_took_a_look() { assert_suggestion_result( "I though GitHub's “Dashboard” page might help with this, so I took a look.", HaveTakeALook::new(Dialect::Australian), "I though GitHub's “Dashboard” page might help with this, so I had a look.", ); } #[test] fn correct_takes_a_look() { assert_suggestion_result( "I'm closing this one, but it would be nice if someone takes a look at the notes in the original issue.", HaveTakeALook::new(Dialect::British), "I'm closing this one, but it would be nice if someone has a look at the notes in the original issue.", ); } #[test] fn correct_having_a_look() { assert_suggestion_result( "It only appeared after I was having a look through the files.", HaveTakeALook::new(Dialect::American), "It only appeared after I was taking a look through the files.", ); } #[test] fn correct_has_a_look() { assert_suggestion_result( "When Serializing messages the code in SchemaRegistrySerde has a look into the registry using the topic name.", HaveTakeALook::new(Dialect::Canadian), "When Serializing messages the code in SchemaRegistrySerde takes a look into the registry using the topic name.", ); } } ================================================ FILE: harper-core/src/linting/hedging.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::FixedPhrase; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind}; use crate::{Token, TokenStringExt}; /// A linter that detects hedging language. pub struct Hedging { expr: FirstMatchOf, } impl Default for Hedging { fn default() -> Self { let phrases = vec!["I would argue that", ", so to speak", "to a certain degree"]; let patterns: Vec> = phrases .into_iter() .map(|s| Box::new(FixedPhrase::from_phrase(s)) as Box) .collect(); Self { expr: FirstMatchOf::new(patterns), } } } impl ExprLinter for Hedging { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let span = matched_tokens.span()?; Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: Vec::new(), message: "You're hedging.".to_string(), priority: 31, }) } fn description(&self) -> &str { "Flags hedging language (e.g. `I would argue that`, `..., so to speak`, `to a certain degree`)." } } #[cfg(test)] mod tests { use super::Hedging; use crate::linting::tests::assert_lint_count; #[test] fn detects_hedging_phrase() { assert_lint_count("I would argue that this is correct.", Hedging::default(), 1); } #[test] fn does_not_flag_clean_text() { assert_lint_count("This is clear and direct.", Hedging::default(), 0); } #[test] fn lowercase_hedging() { assert_lint_count( "i would argue that the outcome is uncertain.", Hedging::default(), 1, ); } #[test] fn incomplete_phrase_not_flagged() { assert_lint_count("I would argue the data is clear.", Hedging::default(), 0); } #[test] fn phrase_with_trailing_comma() { let text = "I would argue that, this method works."; assert_lint_count(text, Hedging::default(), 1); } #[test] fn phrase_with_extra_whitespace() { assert_lint_count( "to a certain degree the results are ambiguous.", Hedging::default(), 1, ); } #[test] fn does_not_flag_similar_but_incorrect_phrase() { assert_lint_count( "He spoke so to speakingly about the event.", Hedging::default(), 0, ); } #[test] fn phrase_split_by_line_break() { assert_lint_count( "I would argue\nthat this approach fails.", Hedging::default(), 1, ); } } ================================================ FILE: harper-core/src/linting/hello_greeting.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{AnchorStart, Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct HelloGreeting { expr: SequenceExpr, } impl Default for HelloGreeting { fn default() -> Self { let expr = SequenceExpr::with(AnchorStart) .then_optional(SequenceExpr::default().t_ws()) .then_optional( SequenceExpr::default() .then_quote() .then_optional(SequenceExpr::default().t_ws()), ) .t_aco("halo"); Self { expr } } } impl ExprLinter for HelloGreeting { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let word = matched_tokens.iter().find(|tok| tok.kind.is_word())?; let span = word.span; let original = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "hello".chars().collect(), original, )], message: "Prefer `hello` as a greeting; `halo` refers to the optical effect." .to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Encourages greeting someone with `hello` instead of the homophone `halo`." } } #[cfg(test)] mod tests { use super::HelloGreeting; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_basic_greeting() { assert_suggestion_result("Halo John!", HelloGreeting::default(), "Hello John!"); } #[test] fn corrects_with_comma() { assert_suggestion_result("Halo, Jane.", HelloGreeting::default(), "Hello, Jane."); } #[test] fn corrects_with_world() { assert_suggestion_result("Halo world!", HelloGreeting::default(), "Hello world!"); } #[test] fn corrects_without_punctuation() { assert_suggestion_result( "Halo there friend.", HelloGreeting::default(), "Hello there friend.", ); } #[test] fn corrects_single_word_sentence() { assert_suggestion_result("Halo!", HelloGreeting::default(), "Hello!"); } #[test] fn corrects_question() { assert_suggestion_result("Halo?", HelloGreeting::default(), "Hello?"); } #[test] fn corrects_uppercase() { assert_suggestion_result("HALO!", HelloGreeting::default(), "HELLO!"); } #[test] fn no_lint_for_optical_term() { assert_lint_count( "The halo around the moon glowed softly.", HelloGreeting::default(), 0, ); } #[test] fn no_lint_mid_sentence() { assert_lint_count( "They shouted hello, not Halo, during rehearsal.", HelloGreeting::default(), 0, ); } #[test] fn corrects_in_quotes() { assert_suggestion_result( "\"Halo John!\"", HelloGreeting::default(), "\"Hello John!\"", ); } } ================================================ FILE: harper-core/src/linting/hereby.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct Hereby { expr: SequenceExpr, } impl Default for Hereby { fn default() -> Self { let pattern = SequenceExpr::aco("here") .then_whitespace() .t_aco("by") .then_whitespace() .then_verb(); Self { expr: pattern } } } impl ExprLinter for Hereby { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens[0..3].span()?; let orig_chars = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "hereby".chars().collect(), orig_chars, )], message: "Did you mean the closed compound `hereby`?".to_owned(), ..Default::default() }) } fn description(&self) -> &'static str { "`Here by` in some contexts should be `hereby`" } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::Hereby; #[test] fn declare() { assert_suggestion_result( "I here by declare this state to be free.", Hereby::default(), "I hereby declare this state to be free.", ); } } ================================================ FILE: harper-core/src/linting/hop_hope/mod.rs ================================================ use super::merge_linters::merge_linters; mod to_hop; mod to_hope; use to_hop::ToHop; use to_hope::ToHope; merge_linters!(HopHope => ToHop, ToHope => "Handles common errors involving `hop` and `hope`. Ensures `hop` is used correctly in phrases like `hop on a bus` while correcting mistaken uses of `hope` in contexts where `hop` is expected."); #[cfg(test)] mod tests { use super::HopHope; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_hop_to_hope() { assert_suggestion_result( "I hop we can clarify this soon.", HopHope::default(), "I hope we can clarify this soon.", ); } #[test] fn does_not_correct_unrelated_use() { assert_suggestion_result( "I hop on one foot for fun.", HopHope::default(), "I hop on one foot for fun.", ); } #[test] fn corrects_mixed_case_hop() { assert_suggestion_result( "I HoP we can find a solution.", HopHope::default(), "I HoPE we can find a solution.", ); } #[test] fn corrects_hoping_on_call() { assert_suggestion_result( "I was hoping on a call to discuss this.", HopHope::default(), "I was hopping on a call to discuss this.", ); } #[test] fn corrects_hoped_on_plane() { assert_suggestion_result( "She hoped on an airplane to visit family.", HopHope::default(), "She hopped on an airplane to visit family.", ); } #[test] fn corrects_hope_on_bus() { assert_suggestion_result( "They hope on a bus every morning.", HopHope::default(), "They hop on a bus every morning.", ); } #[test] fn does_not_correct_unrelated_context() { assert_suggestion_result( "I hope everything goes well with your project.", HopHope::default(), "I hope everything goes well with your project.", ); } #[test] fn corrects_mixed_case() { assert_suggestion_result( "She HoPeD on a train to get home.", HopHope::default(), "She HoPpED on a train to get home.", ); } } ================================================ FILE: harper-core/src/linting/hop_hope/to_hop.rs ================================================ use super::super::{ExprLinter, Lint, LintKind}; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::{CharString, CharStringExt}; use crate::{Token, char_string::char_string}; pub struct ToHop { expr: Box, } impl Default for ToHop { fn default() -> Self { let pattern = SequenceExpr::word_set(&["hoping", "hoped", "hope"]) .then_whitespace() .t_aco("on") .then_whitespace() .then_determiner() .then_whitespace() .then_word_set(&["airplane", "plane", "bus", "call", "train"]); Self { expr: Box::new(pattern), } } } impl ToHop { fn to_correct(word: &str) -> Option { Some(match word.to_lowercase().as_str() { "hoping" => char_string!("hopping"), "hoped" => char_string!("hopped"), "hope" => char_string!("hop"), _ => return None, }) } } impl ExprLinter for ToHop { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_word = &matched_tokens[0]; let word_chars = offending_word.span.get_content(source); let word = word_chars.to_string(); let correct = Self::to_correct(&word)?; Some(Lint { span: offending_word.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( correct.to_vec(), word_chars, )], message: format!( "Did you mean to use {word} instead of {} in this context?", correct.to_string() ), ..Default::default() }) } fn description(&self) -> &'static str { "Detects incorrect usage of the words 'hoping,' 'hoped,' or 'hope' when referring to boarding or entering a mode of transportation. Suggests replacing them with the correct verb form such as 'hopping,' 'hopped,' or 'hop.'" } } ================================================ FILE: harper-core/src/linting/hop_hope/to_hope.rs ================================================ use super::super::{ExprLinter, Lint, LintKind}; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::{Token, char_string::char_string}; pub struct ToHope { expr: Box, } impl Default for ToHope { fn default() -> Self { let pattern = SequenceExpr::default() .then_nominal() .then_whitespace() .then_word_set(&["hop", "hopped"]) .then_whitespace() .then_nominal(); Self { expr: Box::new(pattern), } } } impl ExprLinter for ToHope { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_word = &matched_tokens[2]; let word_chars = offending_word.span.get_content(source); Some(Lint { span: offending_word.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( char_string!("hope").to_vec(), word_chars, )], message: "Did you mean to use 'hope' instead of 'hop' in this context?".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Detects incorrect use of 'hop' when the correct verb 'hope' should be used in a sentence." } } ================================================ FILE: harper-core/src/linting/hope_youre.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::SequenceExpr, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct HopeYoure { expr: SequenceExpr, } impl Default for HopeYoure { fn default() -> Self { let loc = WordSet::new(&["here", "there"]); let prep = SequenceExpr::default().t_ws().then_preposition(); let expr = SequenceExpr::aco("hope") .t_ws() .t_aco("your") .t_ws() .then_adjective() .then_optional(prep) .t_ws() .then(loc); Self { expr } } } impl ExprLinter for HopeYoure { type Unit = Chunk; fn expr(&self) -> &dyn crate::expr::Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let your_tok = toks.get(2)?; let span = your_tok.span; let original = span.get_content(src); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "you're".chars().collect(), original, )], message: "Prefer `you're`—the contraction of “you are”—when expressing a hope about someone’s condition." .into(), priority: 31, }) } fn description(&self) -> &str { "Detects the misuse of possessive **your** after “hope” and an adjective \ (e.g., “I hope your well”) and advises using **you’re** to supply the \ missing verb “are.”" } } #[cfg(test)] mod tests { use super::HopeYoure; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_excited_here() { assert_suggestion_result( "I hope your excited here.", HopeYoure::default(), "I hope you're excited here.", ); } #[test] fn corrects_safe_there() { assert_suggestion_result( "I hope your safe there.", HopeYoure::default(), "I hope you're safe there.", ); } #[test] fn corrects_safe_over_there() { assert_suggestion_result( "I hope your safe over there.", HopeYoure::default(), "I hope you're safe over there.", ); } #[test] fn corrects_fine_here() { assert_suggestion_result( "I hope your fine here.", HopeYoure::default(), "I hope you're fine here.", ); } #[test] fn corrects_happy_there() { assert_suggestion_result( "I hope your happy there.", HopeYoure::default(), "I hope you're happy there.", ); } #[test] fn corrects_healthy_out_here() { assert_suggestion_result( "I hope your healthy out here.", HopeYoure::default(), "I hope you're healthy out here.", ); } #[test] fn corrects_strong_there() { assert_suggestion_result( "We hope your strong there.", HopeYoure::default(), "We hope you're strong there.", ); } #[test] fn corrects_sorry_here() { assert_suggestion_result( "Hope your sorry here.", HopeYoure::default(), "Hope you're sorry here.", ); } #[test] fn no_lint_with_contraction() { assert_lint_count("I hope you're excited here.", HopeYoure::default(), 0); } #[test] fn no_lint_without_adjective() { assert_lint_count("I hope your trip went well.", HopeYoure::default(), 0); } #[test] fn no_lint_with_following_clause() { assert_lint_count( "I hope your friends are well there.", HopeYoure::default(), 0, ); } #[test] fn no_lint_when_possessive_context() { assert_lint_count( "I hope your advice on punctuation is helpful.", HopeYoure::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/how_to.rs ================================================ use harper_brill::UPOS; use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, TokenStringExt, expr::{All, Expr, OwnedExprExt, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{InflectionOfBe, UPOSSet}, }; pub struct HowTo { expr: All, } impl Default for HowTo { fn default() -> Self { let mut pattern = All::default(); let pos_pattern = SequenceExpr::anything() .then_anything() .t_aco("how") .then_whitespace() .then_verb_lemma(); pattern.add(pos_pattern); let exceptions = SequenceExpr::unless(UPOSSet::new(&[UPOS::PART])) .then_anything() .then_unless(|tok: &Token, _: &[char]| tok.kind.is_np_member()) .then_anything() .then_unless( InflectionOfBe::new().or(SequenceExpr::default().then_kind_any_or_words( &[ TokenKind::is_auxiliary_verb, TokenKind::is_adjective, TokenKind::is_conjunction, TokenKind::is_proper_noun, ] as &[_], &["did", "come", "does"], )), ); pattern.add(exceptions); Self { expr: pattern } } } impl ExprLinter for HowTo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { let span = toks[2..4].span()?; let fix: Vec = "to ".chars().collect(); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::InsertAfter(fix)], message: "Insert `to` after `how` (e.g., `how to clone`).".into(), priority: 63, }) } fn description(&self) -> &str { "Detects the omission of `to` in constructions like `how clone / how install` and suggests `how to …`." } } #[cfg(test)] mod tests { use super::HowTo; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn flags_missing_to() { assert_suggestion_result( "Here's how clone the repository.", HowTo::default(), "Here's how to clone the repository.", ); } #[test] fn ignores_correct_phrase() { assert_lint_count("Here's how to clone the repository.", HowTo::default(), 0); } #[test] fn flags_other_verbs() { assert_suggestion_result( "Learn how install Rust.", HowTo::default(), "Learn how to install Rust.", ); } #[test] fn ros_package_install() { assert_suggestion_result( "Can someone explain how install this ROS package on Humble?", HowTo::default(), "Can someone explain how to install this ROS package on Humble?", ); } #[test] fn extract_and_install_app() { assert_suggestion_result( "Here’s a quick guide on how install an app you’ve extracted from a tarball.", HowTo::default(), "Here’s a quick guide on how to install an app you’ve extracted from a tarball.", ); } #[test] fn dll_files() { assert_suggestion_result( "This video shows how fix missing DLL files on Windows.", HowTo::default(), "This video shows how to fix missing DLL files on Windows.", ); } #[test] fn dofus_on_ubuntu() { assert_suggestion_result( "Full tutorial on how install Dofus under Ubuntu.", HowTo::default(), "Full tutorial on how to install Dofus under Ubuntu.", ); } #[test] fn tar_gz_install() { assert_suggestion_result( "Find out how install software shipped as a .tar.gz archive.", HowTo::default(), "Find out how to install software shipped as a .tar.gz archive.", ); } #[test] fn thrift_libraries() { assert_suggestion_result( "Anyone know how install the Thrift libraries from source?", HowTo::default(), "Anyone know how to install the Thrift libraries from source?", ); } #[test] fn windows_adk() { assert_suggestion_result( "Lost the Windows ADK again—remind me how install it?", HowTo::default(), "Lost the Windows ADK again—remind me how to install it?", ); } #[test] fn accounting_errors() { assert_suggestion_result( "Eight common accounting errors and how fix them.", HowTo::default(), "Eight common accounting errors and how to fix them.", ); } #[test] fn sentence_fragments() { assert_suggestion_result( "Here’s what sentence fragments are and how fix them.", HowTo::default(), "Here’s what sentence fragments are and how to fix them.", ); } #[test] fn zipper_slider() { assert_suggestion_result( "Quick demo on how fix a broken zipper slider.", HowTo::default(), "Quick demo on how to fix a broken zipper slider.", ); } #[test] fn door_lock() { assert_suggestion_result( "Tips on how fix a door that won’t lock.", HowTo::default(), "Tips on how to fix a door that won’t lock.", ); } #[test] fn already_correct_install() { assert_lint_count( "See how to install the package with apt.", HowTo::default(), 0, ); } #[test] fn already_correct_fix() { assert_lint_count( "He showed me how to fix the zipper in ten minutes.", HowTo::default(), 0, ); } #[test] fn how_are_you() { assert_lint_count("How are you?", HowTo::default(), 0); } #[test] fn how_calm_you_are() { assert_lint_count("I like how calm you are.", HowTo::default(), 0); } #[test] fn how_will_you_make_up() { assert_lint_count( "How will you make up for your mistakes?", HowTo::default(), 0, ); } #[test] fn storytelling_clause() { assert_lint_count( "I will tell about how leaving my husband led to my dog winning a Nobel Prize.", HowTo::default(), 0, ); } #[test] fn dont_flag_how_did_you() { assert_lint_count("How did you get to school every day?", HowTo::default(), 0); } #[test] fn dont_flag_how_come() { assert_lint_count( "How come this has to be a special case?", HowTo::default(), 0, ); } #[test] fn allows_how_has() { assert_lint_count("How Has This Been Tested?", HowTo::default(), 0); } #[test] fn issue_1492() { assert_no_lints( "I hope to provide some insight into correct HTML formatting, in addition to how authors can avoid these issues.", HowTo::default(), ); assert_no_lints("But how does something like this...", HowTo::default()); } #[test] fn allow_issue_1298() { assert_no_lints( "The story of how and why things came to this point.", HowTo::default(), ); } #[test] fn dont_flag_false_positive_pr_1846() { assert_no_lints( "About how Microsoft, Google, and others are training people in Rust.", HowTo::default(), ) } #[test] fn dont_flag_false_positives_1492_how_indexes() { assert_no_lints( "controls how indexes will be added to unwrapped keys of flat array-like objects", HowTo::default(), ); } #[test] fn issue_2124() { assert_no_lints( "I like how discord shows Spotify status on your profile.", HowTo::default(), ); assert_no_lints( "To be determined based on how error handling is done in new paradigm.", HowTo::default(), ); } } ================================================ FILE: harper-core/src/linting/hyphenate_number_day.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, patterns::NominalPhrase}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct HyphenateNumberDay { expr: SequenceExpr, } impl Default for HyphenateNumberDay { fn default() -> Self { let pattern = SequenceExpr::default() .then_number() .then_whitespace() .t_aco("day") .then_longest_of(vec![ Box::new(SequenceExpr::whitespace().then(NominalPhrase)), Box::new( SequenceExpr::default() .then_hyphen() .then_adjective() .then_whitespace() .then(NominalPhrase), ), ]); Self { expr: pattern } } } impl ExprLinter for HyphenateNumberDay { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let number = matched_tokens[0].kind.as_number()?; let space = &matched_tokens[1]; Some(Lint { span: space.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith(vec!['-'])], message: format!("Use a hyphen in `{number}-day` when forming an adjectival compound."), priority: 31, }) } fn description(&self) -> &'static str { "Ensures a hyphen is used in `X-day` when it is part of a compound adjective, such as `4-day work week`." } } #[cfg(test)] mod tests { use super::HyphenateNumberDay; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_three_day_training() { assert_suggestion_result( "The company offers a 3 day training program.", HyphenateNumberDay::default(), "The company offers a 3-day training program.", ); } #[test] fn corrects_five_day_challenge() { assert_suggestion_result( "Join the 5 day challenge to improve your skills.", HyphenateNumberDay::default(), "Join the 5-day challenge to improve your skills.", ); } #[test] fn corrects_seven_day_plan() { assert_suggestion_result( "She followed a strict 7 day meal plan.", HyphenateNumberDay::default(), "She followed a strict 7-day meal plan.", ); } #[test] fn does_not_correct_when_not_adjective() { assert_suggestion_result( "The seminar lasts for 2 days.", HyphenateNumberDay::default(), "The seminar lasts for 2 days.", ); } #[test] fn corrects_varied_phrases() { assert_suggestion_result( "They implemented a new 6 day work schedule.", HyphenateNumberDay::default(), "They implemented a new 6-day work schedule.", ); assert_suggestion_result( "Enroll in our 10 day fitness bootcamp!", HyphenateNumberDay::default(), "Enroll in our 10-day fitness bootcamp!", ); } #[test] fn edge_case_day_long() { assert_suggestion_result( "The 4 day-long seminar was insightful.", HyphenateNumberDay::default(), "The 4-day-long seminar was insightful.", ); } #[test] fn edge_case_plural_days() { assert_suggestion_result( "The trip was a fun 5 day experience.", HyphenateNumberDay::default(), "The trip was a fun 5-day experience.", ); } #[test] fn ignores_spelled_out_numbers() { assert_suggestion_result( "We had a three day holiday.", HyphenateNumberDay::default(), "We had a three day holiday.", ); } } ================================================ FILE: harper-core/src/linting/i_am_agreement.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Token, TokenStringExt, expr::{AnchorStart, Expr, FirstMatchOf, FixedPhrase, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct IAmAgreement { expr: FirstMatchOf, } impl Default for IAmAgreement { fn default() -> Self { let i_are = Lrc::new(FixedPhrase::from_phrase("I are")); let nothing_before_i_are = SequenceExpr::with(AnchorStart).then(i_are.clone()); let non_and_word_before_i_are = SequenceExpr::default() .then_word_except(&["and"]) .t_ws() .then(i_are); let expr = FirstMatchOf::new(vec![ Box::new(nothing_before_i_are), Box::new(non_and_word_before_i_are), ]); Self { expr } } } impl ExprLinter for IAmAgreement { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let toks = &toks[toks.len() - 3..]; Some(Lint { span: toks.span()?, lint_kind: LintKind::Agreement, suggestions: vec![Suggestion::replace_with_match_case( "I am".chars().collect(), toks.span()?.get_content(src), )], message: "The first-person singular pronoun `I` requires the verb form `am`; `are` belongs to second-person or plural contexts.".to_string(), priority: 31, }) } fn description(&self) -> &str { "Corrects `I are` to `I am`." } } #[cfg(test)] mod tests { use super::*; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_i_are_simple() { assert_suggestion_result("I are", IAmAgreement::default(), "I am"); } #[test] fn corrects_i_are() { assert_suggestion_result( "I are really happy about this release.", IAmAgreement::default(), "I am really happy about this release.", ); } #[test] fn dont_flag_you_and_i_are() { assert_lint_count( "You know, you and I are sitting on the Titanic and the iceberg is over there.", IAmAgreement::default(), 0, ); } #[test] fn dont_flag_mention_and_i_are() { assert_lint_count( "Hello, @another-rex and I are attempting to package packageurl-go for Debian as we need it for a build dependency.", IAmAgreement::default(), 0, ); } #[test] fn dont_flag_z_and_i_are() { assert_lint_count( "The url is copied from a manual search, and Z and I are modified.", IAmAgreement::default(), 0, ) } #[test] fn dont_flag_name_and_i_are() { assert_lint_count( "Paper that Lena Baunaz and I are working on as part of my SNSF-funded 'Focus in diachrony'", IAmAgreement::default(), 0, ); } #[test] fn fix_so_i_are() { assert_suggestion_result( "I have not yet been able to reproduce this issue in my environment, so I are still trying to figure it out", IAmAgreement::default(), "I have not yet been able to reproduce this issue in my environment, so I am still trying to figure it out", ); } #[test] fn fix_if_i_are() { assert_suggestion_result( "If i are on creative inventory, and try to clean my inventory holding shift is disconnected too.", IAmAgreement::default(), "If i am on creative inventory, and try to clean my inventory holding shift is disconnected too.", ); } #[test] fn fix_what_i_are() { assert_suggestion_result( "in this situation I can't see what I are typing", IAmAgreement::default(), "in this situation I can't see what I am typing", ); } #[test] fn fix_where_i_are() { assert_suggestion_result( "I have a logging application where I are append to a topic", IAmAgreement::default(), "I have a logging application where I am append to a topic", ); } } ================================================ FILE: harper-core/src/linting/if_wouldve.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, LintKind, Suggestion}; use crate::patterns::{NominalPhrase, WordSet}; use crate::token_string_ext::TokenStringExt; use crate::{CharStringExt, Lint, Token}; pub struct IfWouldve { expr: SequenceExpr, } impl Default for IfWouldve { fn default() -> Self { Self { expr: SequenceExpr::aco("if") .t_ws() .then(NominalPhrase) .t_ws() .then_any_of(vec![ Box::new( SequenceExpr::word_set(&["would", "had"]) .t_ws() .then_word_set(&["have", "of"]), ), Box::new(WordSet::new(&["would've", "wouldve", "had've", "hadve"])), ]) .t_ws() .then_verb_past_participle_form(), } } } impl ExprLinter for IfWouldve { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } /// Identifies and corrects incorrect conditional phrases like "would've", "would have", "would of", etc. /// to use the correct "had" construction in conditional statements. fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { // We examine tokens in pairs, moving backwards from the end of the phrase // to find the incorrect verb construction to replace with "had". // The pattern we're looking for is: [if] [NP] [would/had] [have/of/ve] [verb] // Start from the end of the token sequence (before the verb) let matched_tokens = (2..toks.len() - 2) .rev() .step_by(2) // Check every other token since we're looking at pairs .find_map(|i| { let prev = toks[i - 2].span.get_content(src); let curr = toks[i].span.get_content(src); let would_had = &["would", "had"]; // Determine which tokens to replace based on the pattern match () { // Handle contractions like "would've" or "had've" _ if curr.ends_with_ignore_ascii_case_str("ve") => { if curr.starts_with_any_ignore_ascii_case_str(would_had) { Some(&toks[i..=i]) // Single token like "would've" } else if prev.starts_with_any_ignore_ascii_case_str(would_had) { Some(&toks[i - 2..=i]) // Two tokens like "would have" } else { None } } // Handle "would of" / "had of" _ if curr.ends_with_ignore_ascii_case_str("of") && prev.starts_with_any_ignore_ascii_case_str(would_had) => { Some(&toks[i - 2..=i]) } _ => None, } }); matched_tokens.and_then(|tokens_to_replace| { let span = tokens_to_replace.span()?; Some(Lint { span, lint_kind: LintKind::Nonstandard, suggestions: vec![Suggestion::replace_with_match_case( vec!['h', 'a', 'd'], span.get_content(src), )], message: "If this is counterfactual or hypothetical, use `had` after `if` rather than `would have` or `had have`.".to_string(), ..Default::default() }) }) } fn description(&self) -> &str { "Corrects `if I would've done` etc. to `if I had done` etc." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::*; #[test] fn flag_if_i_wouldve_done_x() { assert_suggestion_result( "If I would've done X...", IfWouldve::default(), "If I had done X...", ); } #[test] fn flag_if_you_would_have_done_y() { assert_suggestion_result( "If you would have done Y...", IfWouldve::default(), "If you had done Y...", ); } #[test] fn flag_if_we_would_of_z() { assert_suggestion_result( "If we would of done Z...", IfWouldve::default(), "If we had done Z...", ); } #[test] fn flag_if_he_hadve_done_w() { assert_suggestion_result( "If he hadve done W...", IfWouldve::default(), "If he had done W...", ); } #[test] fn flag_if_she_hadve_done_x() { assert_suggestion_result( "If she had've done X...", IfWouldve::default(), "If she had done X...", ); } #[test] fn flag_if_it_had_of_done_x() { assert_suggestion_result( "If it had of done X...", IfWouldve::default(), "If it had done X...", ); } #[test] fn flag_if_np_wouldve() { assert_suggestion_result( "If that guy would've thought it through...", IfWouldve::default(), "If that guy had thought it through...", ); } // The linter cannot yet detect when this pattern is a counterfactual. // If you can improve this linter to do so, here are some example sentences. #[test] #[ignore = "Can't detect correct use not in counterfactual"] fn dont_flag_non_counterfactual_done() { assert_no_lints( "I don't know if they would have done that for a designer", IfWouldve::default(), ); } #[test] #[ignore = "Can't detect correct use not in counterfactual"] fn dont_flag_non_counterfactual_gotten() { assert_no_lints( "I don't know if a normal programmer would have gotten that treatment.", IfWouldve::default(), ); } #[test] #[ignore = "Can't detect correct use not in counterfactual"] fn dont_flag_non_counterfactual_been() { assert_no_lints( "I don't know if they would have been interested anyway", IfWouldve::default(), ); } } ================================================ FILE: harper-core/src/linting/in_on_the_cards.rs ================================================ use crate::{ CharStringExt, Dialect, Token, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{LintKind, Suggestion}, patterns::{InflectionOfBe, WordSet}, }; use super::{ExprLinter, Lint}; use crate::linting::expr_linter::Chunk; pub struct InOnTheCards { expr: SequenceExpr, dialect: Dialect, } impl InOnTheCards { pub fn new(dialect: Dialect) -> Self { // Quick research suggested that Australian and Canadian English agree with American English. let preposition = match dialect { Dialect::British => "in", _ => "on", }; let pre_context = FirstMatchOf::new(vec![ Box::new(InflectionOfBe::new()), Box::new(WordSet::new(&[ "isn't", "it's", "wasn't", "weren't", "not", "isnt", "its", "wasnt", "werent", ])), ]); let expr = SequenceExpr::with(pre_context) .t_ws() .t_aco(preposition) .then_fixed_phrase(" the cards"); Self { expr, dialect } } } impl ExprLinter for InOnTheCards { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let prep_span = toks[2].span; let prep = prep_span.get_content(src); let new_prep = [ match prep[0] { 'i' => 'o', 'o' => 'i', 'I' => 'O', 'O' => 'I', _ => return None, }, prep[1], ]; let sugg = Suggestion::ReplaceWith(new_prep.to_vec()); let message = format!( "Use `{} the cards` instead of `{} the cards` in {} English.", new_prep.to_string(), prep.to_string(), self.dialect, ); Some(Lint { span: prep_span, lint_kind: LintKind::Regionalism, suggestions: vec![sugg], message, priority: 63, }) } fn description(&self) -> &str { "Corrects either `in the cards` or `on the cards` to the other, depending on the dialect." } } #[cfg(test)] mod tests { use super::InOnTheCards; use crate::{ Dialect, linting::tests::{assert_lint_count, assert_suggestion_result}, }; // On the cards #[test] fn correct_are_on_for_american() { assert_suggestion_result( "Both these features are on the cards, but for now we want to let users know if they have requested an invalid example.", InOnTheCards::new(Dialect::American), "Both these features are in the cards, but for now we want to let users know if they have requested an invalid example.", ); } #[test] fn dont_correct_is_on_for_british() { assert_lint_count( "Yes, I think this is on the cards.", InOnTheCards::new(Dialect::British), 0, ); } #[test] fn correct_not_on_for_american() { assert_suggestion_result( "If a permanent unique identifier is not on the cards any time soon for WebHID, we should consider a WebUSB alternative.", InOnTheCards::new(Dialect::American), "If a permanent unique identifier is not in the cards any time soon for WebHID, we should consider a WebUSB alternative.", ); } #[test] fn correct_be_on_for_american() { assert_suggestion_result( "a full breach of genomics (patient?) data can be on the cards since S3 AWS bucket credentials can be slurped from the process's memory", InOnTheCards::new(Dialect::American), "a full breach of genomics (patient?) data can be in the cards since S3 AWS bucket credentials can be slurped from the process's memory", ); } #[test] fn correct_was_on_for_american() { assert_suggestion_result( "Virtualising the message summaries ObservableCollection was on the cards so I also take note of your last point.", InOnTheCards::new(Dialect::American), "Virtualising the message summaries ObservableCollection was in the cards so I also take note of your last point.", ); } #[test] fn correct_isnt_on_no_apostrophe_for_american() { assert_suggestion_result( "parallelising that part isnt on the cards since there would be no noticeable ...", InOnTheCards::new(Dialect::American), "parallelising that part isnt in the cards since there would be no noticeable ...", ); } #[test] fn correct_its_on_for_american() { assert_suggestion_result( "Regarding extensive documentation, as mentioned, its on the cards, project being sponsored by the aforementioned organisations.", InOnTheCards::new(Dialect::American), "Regarding extensive documentation, as mentioned, its in the cards, project being sponsored by the aforementioned organisations.", ); } #[test] fn correct_were_on_for_american() { assert_suggestion_result( "lots of high altitudes were on the cards again", InOnTheCards::new(Dialect::American), "lots of high altitudes were in the cards again", ); } #[test] fn correct_isnt_on_for_american() { assert_suggestion_result( "downgrading to an end-of-life operating system isn't on the cards", InOnTheCards::new(Dialect::American), "downgrading to an end-of-life operating system isn't in the cards", ); } #[test] fn correct_wasnt_on_for_american() { assert_suggestion_result( "it's only a middleground for an org because passwordless wasn't on the cards previously", InOnTheCards::new(Dialect::American), "it's only a middleground for an org because passwordless wasn't in the cards previously", ); } // In the cards #[test] fn correct_was_in_for_british() { assert_suggestion_result( "Just wondering if it was in the cards or not for something like the Quest3 to get support in the future.", InOnTheCards::new(Dialect::British), "Just wondering if it was on the cards or not for something like the Quest3 to get support in the future.", ); } #[test] fn dont_correct_is_in_for_american() { assert_lint_count( "Not sure if such a project is in the cards", InOnTheCards::new(Dialect::American), 0, ); } #[test] fn correct_not_in_for_british() { assert_suggestion_result( "Is that just not in the cards for WASM at this time?", InOnTheCards::new(Dialect::British), "Is that just not on the cards for WASM at this time?", ); } #[test] fn correct_be_in_for_british() { assert_suggestion_result( "Would this be in the cards?", InOnTheCards::new(Dialect::British), "Would this be on the cards?", ); } #[test] fn correct_are_in_for_british() { assert_suggestion_result( "Manifest files are in the cards but haven't been implemented yet.", InOnTheCards::new(Dialect::British), "Manifest files are on the cards but haven't been implemented yet.", ); } #[test] fn correct_its_in_for_british() { assert_suggestion_result( "As far as an error, that probably would be helpful but doesn't sound like its in the cards.", InOnTheCards::new(Dialect::British), "As far as an error, that probably would be helpful but doesn't sound like its on the cards.", ); } #[test] fn correct_were_in_for_british() { assert_suggestion_result( "a year or two given the major overhauls that were in the cards at the time", InOnTheCards::new(Dialect::British), "a year or two given the major overhauls that were on the cards at the time", ); } #[test] fn correct_isnt_in_for_british() { assert_suggestion_result( "I'm going to close this as opting out of the installation framework that Electron gives us isn't in the cards for the project at this time.", InOnTheCards::new(Dialect::British), "I'm going to close this as opting out of the installation framework that Electron gives us isn't on the cards for the project at this time.", ); } #[test] fn correct_wasnt_in_for_british() { assert_suggestion_result( "doing something better than just swapping our internal log package for glog wasn’t in the cards back then", InOnTheCards::new(Dialect::British), "doing something better than just swapping our internal log package for glog wasn’t on the cards back then", ); } #[test] fn correct_werent_in_for_british() { assert_suggestion_result( "I had thought stacked borrows was mostly in a final tweaking phase and major changes weren't in the cards.", InOnTheCards::new(Dialect::British), "I had thought stacked borrows was mostly in a final tweaking phase and major changes weren't on the cards.", ); } } ================================================ FILE: harper-core/src/linting/inflected_verb_after_to.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::char_string::CharStringExt; use crate::spell::Dictionary; use crate::{Document, Span, TokenStringExt}; pub struct InflectedVerbAfterTo where T: Dictionary, { dictionary: T, } impl InflectedVerbAfterTo { pub fn new(dictionary: T) -> Self { Self { dictionary } } } impl Linter for InflectedVerbAfterTo { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for pi in document.iter_preposition_indices() { let prep = document.get_token(pi).unwrap(); let Some(space) = document.get_token(pi + 1) else { continue; }; let Some(word) = document.get_token(pi + 2) else { continue; }; if !space.kind.is_whitespace() || !word.kind.is_word() { continue; } let prep_to = document.get_span_content(&prep.span); if !prep_to.eq_ignore_ascii_case_chars(&['t', 'o']) { continue; } let chars = document.get_span_content(&word.span); if chars.len() < 4 { continue; } let check_stem = |stem: &[char]| { if let Some(metadata) = self.dictionary.get_word_metadata(stem) && metadata.is_verb() && !metadata.is_noun() { return true; } false }; let mut lint_from_stem = |stem: &[char]| { lints.push(Lint { span: Span::new(prep.span.start, word.span.end), lint_kind: LintKind::WordChoice, message: "The base form of the verb is needed here.".to_string(), suggestions: vec![Suggestion::ReplaceWith( prep_to .iter() .chain([' '].iter()) .chain(stem.iter()) .copied() .collect(), )], ..Default::default() }); }; #[derive(PartialEq)] enum ToVerbExpects { ExpectsInfinitive, ExpectsNominal, } use ToVerbExpects::*; let ed_specific_heuristics = || { if let Some(prev) = document.get_next_word_from_offset(pi, -1) { let prev_chars = document.get_span_content(&prev.span); if let Some(metadata) = self.dictionary.get_word_metadata(prev_chars) { // adj: "able to" expects an infinitive verb // verb: "have/had/has/having to" expect an infinitive verb if metadata.is_adjective() || metadata.is_verb() { return ToVerbExpects::ExpectsInfinitive; } } } else { // Assume a chunk beginning with "to" and a verb in -ed should expect an infinitive verb return ToVerbExpects::ExpectsInfinitive; } // Default assumption is that "to" is a preposition so a noun etc. should come after it ToVerbExpects::ExpectsNominal }; if chars.ends_with(&['e', 'd']) { let ed = check_stem(&chars[..chars.len() - 2]); if ed && ed_specific_heuristics() == ExpectsInfinitive { lint_from_stem(&chars[..chars.len() - 2]); }; let d = check_stem(&chars[..chars.len() - 1]); // Add -d specific heuristics when needed if d { lint_from_stem(&chars[..chars.len() - 1]); }; } if chars.ends_with(&['e', 's']) { let es = check_stem(&chars[..chars.len() - 2]); // Add -es specific heuristics when needed if es { lint_from_stem(&chars[..chars.len() - 2]); }; } if chars.ends_with(&['s']) { let s = check_stem(&chars[..chars.len() - 1]); // Add -s specific heuristics when needed if s { lint_from_stem(&chars[..chars.len() - 1]); }; } } lints } fn description(&self) -> &str { "This rule looks for `to verb` where `verb` is not in the infinitive form." } } #[cfg(test)] mod tests { use super::InflectedVerbAfterTo; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use crate::spell::FstDictionary; #[test] fn dont_flag_to_check_both_verb_and_noun() { assert_lint_count( "to check", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] fn dont_flag_to_checks_both_verb_and_noun() { assert_lint_count( "to checks", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] fn dont_flag_to_cheques_not_a_verb() { assert_lint_count( "to cheques", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] #[ignore = "-ing forms can act as nouns, current heuristics cannot distinguish"] fn flag_to_checking() { assert_lint_count( "to checking", InflectedVerbAfterTo::new(FstDictionary::curated()), 1, ); } #[test] fn dont_flag_check_ed() { assert_lint_count( "to checked", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] fn dont_flag_noun_belief_s() { assert_lint_count( "to beliefs", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] fn dont_flag_noun_meat_s() { assert_lint_count( "to meats", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] #[ignore = "can't check yet. 'capture' is noun as well as verb. \"to nouns\" is good English. we can't disambiguate verbs from nouns."] fn check_993_suggestions() { assert_suggestion_result( "A location-agnostic structure that attempts to captures the context and content that a Lint occurred.", InflectedVerbAfterTo::new(FstDictionary::curated()), "A location-agnostic structure that attempts to capture the context and content that a Lint occurred.", ); } #[test] fn dont_flag_embarrass_not_in_dictionary() { assert_lint_count( "Second I'm going to embarrass you for a.", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] fn corrects_exist_s() { assert_suggestion_result( "A valid solution is expected to exists.", InflectedVerbAfterTo::new(FstDictionary::curated()), "A valid solution is expected to exist.", ); } #[test] #[ignore = "can't check yet. 'catch' is noun as well as verb. 'to nouns' is good English. we can't disambiguate verbs from nouns."] fn corrects_es_ending() { assert_suggestion_result( "I need it to catches every exception.", InflectedVerbAfterTo::new(FstDictionary::curated()), "I need it to catch every exception.", ); } #[test] fn corrects_ed_ending() { assert_suggestion_result( "I had to expanded my horizon.", InflectedVerbAfterTo::new(FstDictionary::curated()), "I had to expand my horizon.", ); } #[test] fn flags_expire_d() { assert_lint_count( "I didn't know it was going to expired.", InflectedVerbAfterTo::new(FstDictionary::curated()), 1, ); } #[test] fn corrects_explain_ed() { assert_suggestion_result( "To explained the rules to the team.", InflectedVerbAfterTo::new(FstDictionary::curated()), "To explain the rules to the team.", ); } #[test] #[ignore = "can't check yet. surprisingly, 'explore' is noun as well as verb. 'to nouns' is good English. we can't disambiguate verbs from nouns."] fn corrects_explor_ed() { assert_suggestion_result( "I went to explored distant galaxies.", InflectedVerbAfterTo::new(FstDictionary::curated()), "I went to explore distant galaxies.", ); } #[test] fn cant_flag_express_ed_also_noun() { assert_lint_count( "I failed to clearly expressed my point.", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } #[test] fn correct_feign_ed() { // adj "able" before "to" works with "to", making "to" part of an infinitive verb assert_suggestion_result( "I was able to feigned ignorance.", InflectedVerbAfterTo::new(FstDictionary::curated()), "I was able to feign ignorance.", ); } #[test] fn issue_241() { // Hypothesis: when before "to" is not an adj, assume "to" is a preposition assert_lint_count( "Comparison to Expected Results", InflectedVerbAfterTo::new(FstDictionary::curated()), 0, ); } } ================================================ FILE: harper-core/src/linting/initialism_linter.rs ================================================ use crate::expr::Expr; use crate::{Token, patterns::Word}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; /// Alias for a word in an initialism expansion type InitialismWord = Vec; /// Alias for a phrase an initialism expands to type InitialismPhrase = Vec; /// A struct that can be composed to expand initialisms, respecting the capitalization of each /// item. pub struct InitialismLinter { expr: Word, /// The lowercase-normalized expansion of the initialism. expansions_lower: Vec, } impl InitialismLinter { /// Construct a linter that can correct an initialism to pub fn new(initialism: &str, expansions: &[&str]) -> Self { let expansions_lower = expansions .iter() .map(|expansion| { expansion .split(' ') .map(|s| s.chars().map(|v| v.to_ascii_lowercase()).collect()) .collect() }) .collect(); Self { expr: Word::from_char_string(initialism.chars().collect()), expansions_lower, } } } impl ExprLinter for InitialismLinter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let tok = matched_tokens.first()?; let source = tok.span.get_content(source); let suggestions = self .expansions_lower .iter() .map(|expansion_lower| { let mut expansion = expansion_lower.clone(); let first_letter = &mut expansion[0][0]; *first_letter = if source[0].is_ascii_uppercase() { first_letter.to_ascii_uppercase() } else { first_letter.to_ascii_lowercase() }; Suggestion::ReplaceWith( expansion .iter() .flat_map(|word| std::iter::once(' ').chain(word.iter().copied())) .skip(1) .collect::>(), ) }) .collect::>(); Some(Lint { span: tok.span, lint_kind: LintKind::Miscellaneous, suggestions, message: "Try expanding this initialism.".to_owned(), priority: 127, }) } fn description(&self) -> &'static str { "Expands an initialism." } } #[cfg(test)] mod tests {} ================================================ FILE: harper-core/src/linting/initialisms.rs ================================================ use crate::linting::LintGroup; use super::InitialismLinter; pub fn lint_group() -> LintGroup { let mut group = LintGroup::empty(); macro_rules! add_initialism_mappings { ($group:expr, { $($name:expr => ($initialism:expr, $expanded:expr)),+ $(,)? }) => { $( $group.add_chunk_expr_linter( $name, Box::new(InitialismLinter::new($initialism, $expanded)), ); )+ }; } add_initialism_mappings!(group, { "AsFarAsIKnow" => ("afaik", &["as far as I know"]), "AsSoonAsPossible" => ("asap", &["as soon as possible"]), "BeRightBack" => ("brb", &["be right back"]), "ByTheWay" => ("btw", &["by the way"]), "ExplainLikeImFive" => ("eli5", &["explain like i'm five"]), "ForWhatItsWorth" => ("fwiw", &["for what it's worth"]), "ForYourInformation" => ("fyi", &["for your information"]), "IDontKnow" => ("idk", &["I don't know"]), "IfIRecallCorrectly" => ("iirc", &["if I recall correctly"]), "IfIUnderstandCorrectly" => ("iiuc", &["if I understand correctly"]), "IfYouKnowYouKnow" => ("iykyk", &["if you know, you know"]), "InCaseYouMissedIt" => ("icymi", &["in case you missed it"]), "InMyHumbleOpinion" => ("imho", &["in my humble opinion", "in my honest opinion"]), "InMyOpinion" => ("imo", &["in my opinion"]), "InRealLife" => ("irl", &["in real life"]), "NeverMind" => ("nvm", &["never mind"]), "OhMyGod" => ("omg", &["oh my god"]), "PleaseTakeALook" => ("ptal", &["please take a look"]), "Really" => ("rly", &["really"]), "TalkToYouLater" => ("ttyl", &["talk to you later"]), "ToBeHonest" => ("tbh", &["to be honest"]), }); group.set_all_rules_to(Some(true)); group } #[cfg(test)] mod tests { use crate::linting::tests::{assert_good_and_bad_suggestions, assert_suggestion_result}; use super::lint_group; #[test] fn corrects_btw() { assert_suggestion_result( "Btw, are you ready to go shopping soon?", lint_group(), "By the way, are you ready to go shopping soon?", ); } #[test] fn corrects_style() { assert_suggestion_result( "I love the fit, btw.", lint_group(), "I love the fit, by the way.", ); } #[test] fn corrects_fyi() { assert_suggestion_result( "Fyi, the meeting is at 3.", lint_group(), "For your information, the meeting is at 3.", ); } #[test] fn corrects_asap() { assert_suggestion_result( "Please respond asap.", lint_group(), "Please respond as soon as possible.", ); } #[test] fn corrects_imo() { assert_suggestion_result( "Imo, that is the best option.", lint_group(), "In my opinion, that is the best option.", ); } #[test] fn corrects_omg() { assert_suggestion_result( "Omg! That's incredible!", lint_group(), "Oh my god! That's incredible!", ); } #[test] fn corrects_brb() { assert_suggestion_result("Hold on, brb.", lint_group(), "Hold on, be right back."); } #[test] fn corrects_tbh() { assert_suggestion_result( "Tbh, I'm not impressed.", lint_group(), "To be honest, I'm not impressed.", ); } #[test] fn corrects_rly() { assert_suggestion_result( "Rly excited for this.", lint_group(), "Really excited for this.", ); } #[test] fn issue_2181() { assert_suggestion_result( "AFAIK, we don't currently have an issue for it.", lint_group(), "As far as i know, we don't currently have an issue for it.", ); } #[test] fn corrects_eli5() { assert_suggestion_result( "Can you eli5 how this works?", lint_group(), "Can you explain like i'm five how this works?", ); } #[test] fn corrects_fwiw() { assert_suggestion_result( "Fwiw, I think it's a good idea.", lint_group(), "For what it's worth, I think it's a good idea.", ); } #[test] fn corrects_idk() { assert_suggestion_result( "Idk if I'll make it to the party.", lint_group(), "I don't know if I'll make it to the party.", ); } #[test] fn corrects_iirc() { assert_suggestion_result( "Iirc, the event starts at 6 PM.", lint_group(), "If i recall correctly, the event starts at 6 PM.", ); } #[test] fn corrects_iykyk() { assert_suggestion_result( "Iykyk, this place is amazing.", lint_group(), "If you know, you know, this place is amazing.", ); } #[test] fn corrects_icymi() { assert_suggestion_result( "Icymi, the deadline is tomorrow.", lint_group(), "In case you missed it, the deadline is tomorrow.", ); } #[test] fn corrects_irl() { assert_suggestion_result( "We should meet irl sometime.", lint_group(), "We should meet in real life sometime.", ); } #[test] fn corrects_ptal() { assert_suggestion_result( "Ptal at the document I sent.", lint_group(), "Please take a look at the document I sent.", ); } #[test] fn expands_imho_both_ways() { assert_good_and_bad_suggestions( "Imho, this is a good idea.", lint_group(), &[ "In my humble opinion, this is a good idea.", "In my honest opinion, this is a good idea.", ], &["In my horrible opinion, this is a good idea."], ); } #[test] fn corrects_iiuc() { assert_suggestion_result( "iiuc build caching in hol4 works at the file level", lint_group(), "if i understand correctly build caching in hol4 works at the file level", ); } } ================================================ FILE: harper-core/src/linting/interested_in.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct InterestedIn { expr: SequenceExpr, } impl Default for InterestedIn { fn default() -> Self { let pattern = SequenceExpr::default() .t_aco("interested") .t_ws() .then_kind_except( TokenKind::is_preposition, &["around", "for", "through", "to", "within"], ); Self { expr: pattern } } } impl ExprLinter for InterestedIn { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let prep_span = tokens.last().unwrap().span; let prep_chars = prep_span.get_content(source); if prep_chars.eq_ignore_ascii_case_chars(&['i', 'n']) { return None; } Some(Lint { span: prep_span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( "in".chars().collect(), prep_chars, )], message: "The correct preposition to use with `interested` is `in`.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Ensures the correct preposition is used with the word `interested` (e.g. `interested in`)." } } #[cfg(test)] mod tests { use super::InterestedIn; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fix_about() { assert_suggestion_result( "It suggests some useful programs the user could be interested about - NyarchLinux/NyarchWizard.", InterestedIn::default(), "It suggests some useful programs the user could be interested in - NyarchLinux/NyarchWizard.", ); } #[test] fn dont_flag_around() { assert_lint_count( "We want to figure out why this is, and how to keep those interested around for longer.", InterestedIn::default(), 0, ); } #[test] fn fix_at() { assert_suggestion_result( "If someone is interested at the processed data, please email me.", InterestedIn::default(), "If someone is interested in the processed data, please email me.", ); } #[test] #[ignore = "Requires more context because 'interested for now/for sure' are not errors"] fn fix_for() { assert_suggestion_result( "but the user is only interested for the examples in one of the modes", InterestedIn::default(), "but the user is only interested in the examples in one of the modes", ); } #[test] fn dont_flag_for_sure() { assert_lint_count("I am interested for sure!", InterestedIn::default(), 0); } #[test] fn fix_into() { assert_suggestion_result( "This is one of the first complex software I wrote, and it prefigures so much of the reasons why I was interested into working on designing HTML and CSS.", InterestedIn::default(), "This is one of the first complex software I wrote, and it prefigures so much of the reasons why I was interested in working on designing HTML and CSS.", ); } #[test] fn fix_of() { assert_suggestion_result( "If you are interested of tinkering.", InterestedIn::default(), "If you are interested in tinkering.", ); } #[test] fn fix_on() { assert_suggestion_result( "The creator of Photopea, a great free alternative to Photoshop, is not interested on making an offline version, so I took it upon myself to make it.", InterestedIn::default(), "The creator of Photopea, a great free alternative to Photoshop, is not interested in making an offline version, so I took it upon myself to make it.", ); } #[test] fn dont_flag_through() { assert_lint_count( "I'm happy to help walk anyone interested through doing this", InterestedIn::default(), 0, ); } #[test] fn does_not_flag_to() { assert_lint_count( "Hi, As title suggest i am interested to know if we can run a custom model trained on yolov9 inference running on two GPU-s.", InterestedIn::default(), 0, ); } #[test] fn fix_with() { assert_suggestion_result( "no_std support (is anybody interested with this?)", InterestedIn::default(), "no_std support (is anybody interested in this?)", ); } #[test] fn dont_flag_within() { assert_lint_count( "But with no one being interested within 8 months, what help would it be.", InterestedIn::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/it_is.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct ItIs { expr: SequenceExpr, } impl Default for ItIs { fn default() -> Self { let pattern = SequenceExpr::default() .t_aco("its") .then_whitespace() .then_kind_except( TokenKind::is_adjective, &[ "1st", "animal", "assault", "body", "budget", "business", "center", "centre", "frontline", "head", "key", "mainline", "material", "mean", "own", "power", "regulation", "runtime", "size", "state", "team", "turnover", "utility", "woman", ], ) .then_whitespace() .then_preposition(); Self { expr: pattern } } } impl ExprLinter for ItIs { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let its_token = &tokens[0]; let span = its_token.span; let text = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( "it's".chars().collect(), text, )], message: "Consider using 'it's' (it is) instead of 'its' (possessive form)." .to_string(), priority: 31, }) } fn description(&self) -> &str { "Detects when “its” is used before an adjective + preposition and suggests the contraction “it's”." } } #[cfg(test)] mod tests { use super::ItIs; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn flags_simple_case() { assert_suggestion_result( "Its amazing to see this.", ItIs::default(), "It's amazing to see this.", ); } #[test] fn flags_with_preposition() { assert_suggestion_result( "Its critical for the project.", ItIs::default(), "It's critical for the project.", ); } #[test] fn does_not_flag_exception_own() { assert_lint_count("Its own design is unique.", ItIs::default(), 0); } #[test] fn does_not_flag_exception_team() { assert_lint_count("Its team lead is excellent.", ItIs::default(), 0); } #[test] #[ignore = "This case fails, but I think that's acceptable"] fn does_not_flag_non_adjective() { assert_lint_count( "The cat chased its tail around the room.", ItIs::default(), 0, ); } #[test] fn does_not_flag_already_correct() { assert_lint_count("It's important to note.", ItIs::default(), 0); } #[test] fn flags_search_filter_context() { assert_suggestion_result( "Its important to note that the search filter will currently only search the current page.", ItIs::default(), "It's important to note that the search filter will currently only search the current page.", ); } #[test] fn flags_ens_restart_context() { assert_suggestion_result( "Today is the third day and I am still stuck on Register. Its important to note that after hours of waiting, I tried to restart the process and clicked on register again but it gets stuck at TX pending.", ItIs::default(), "Today is the third day and I am still stuck on Register. It's important to note that after hours of waiting, I tried to restart the process and clicked on register again but it gets stuck at TX pending.", ); } #[test] fn flags_academics_support_context() { assert_suggestion_result( "To assist learners, because its critical for academics to support their ideas and arguments with sources of published research.", ItIs::default(), "To assist learners, because it's critical for academics to support their ideas and arguments with sources of published research.", ); } #[test] fn flags_parents_explain_context() { assert_suggestion_result( "I also think its critical for parents to explain their reason for saying no though I would advise against attempting to use logic in the face of either toddler or teenage rage.", ItIs::default(), "I also think it's critical for parents to explain their reason for saying no though I would advise against attempting to use logic in the face of either toddler or teenage rage.", ); } #[test] fn flags_chapter_context() { assert_suggestion_result( "I think it's okay since its critical for the rest of the chapter in terms of tone and approach.", ItIs::default(), "I think it's okay since it's critical for the rest of the chapter in terms of tone and approach.", ); } #[test] fn flags_microsoft_work_context() { assert_suggestion_result( "... Need help, its critical for my work, as i am a technical blog writer ...", ItIs::default(), "... Need help, it's critical for my work, as i am a technical blog writer ...", ); } #[test] fn flags_feminists_context() { assert_suggestion_result( "when it comes to the teaching of grammar and diverse linguistics practices. Its critical for feminists to think about the ways in which they frame language.", ItIs::default(), "when it comes to the teaching of grammar and diverse linguistics practices. It's critical for feminists to think about the ways in which they frame language.", ); } #[test] fn flags_students_proofreading_context() { assert_suggestion_result( "its critical for students to develop a similarly sharp eye for misspellings and grammatical errors.", ItIs::default(), "it's critical for students to develop a similarly sharp eye for misspellings and grammatical errors.", ); } #[test] fn flags_americans_context() { assert_suggestion_result( "Its critical for Americans to realize that Fox has nothing to do with news.", ItIs::default(), "It's critical for Americans to realize that Fox has nothing to do with news.", ); } // Negative guard: correct possessive use #[test] fn does_not_flag_its_team_lead() { assert_lint_count("Its team lead is excellent.", ItIs::default(), 0); } // Imagined edge cases based on real usage: #[test] fn flags_crucial_api_context() { assert_suggestion_result( "Its crucial to understand the API before using it.", ItIs::default(), "It's crucial to understand the API before using it.", ); } #[test] fn flags_essential_standards_context() { assert_suggestion_result( "Its essential to follow the coding standards in this project.", ItIs::default(), "It's essential to follow the coding standards in this project.", ); } #[test] fn flags_vital_dependencies_context() { assert_suggestion_result( "Its vital to keep dependencies up to date.", ItIs::default(), "It's vital to keep dependencies up to date.", ); } } ================================================ FILE: harper-core/src/linting/it_looks_like_that.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::token_string_ext::TokenStringExt; pub struct ItLooksLikeThat { expr: SequenceExpr, } impl Default for ItLooksLikeThat { fn default() -> Self { Self { expr: SequenceExpr::fixed_phrase("it looks like that") .then_whitespace() .then_kind_where(|kind| { // Heuristics on the word after "that" which show "that" was used // as a relative pronoun, which is a mistake let is_subj = kind.is_subject_pronoun(); let is_ing = kind.is_verb_progressive_form(); let is_definitely_rel_pron = is_subj || is_ing; // Heuristics on the word after "that" which show "that" // could possibly be a legitimate demonstrative pronoun or determiner // as a demonstrative pronoun or a determiner // which would not be a mistake. let is_v3psgpres = kind.is_verb_third_person_singular_present_form(); // NOTE: we don't have .is_modal_verb() but maybe we need it now! let is_vmodal_or_aux = kind.is_auxiliary_verb(); let is_vpret = kind.is_verb_simple_past_form(); let is_noun = kind.is_noun(); let is_oov = kind.is_oov(); let maybe_demonstrative_or_determiner = is_v3psgpres || is_vmodal_or_aux || is_vpret || is_noun || is_oov; is_definitely_rel_pron || !maybe_demonstrative_or_determiner }), } } } impl ExprLinter for ItLooksLikeThat { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _: &[char]) -> Option { let that_span = toks[6..8].span()?; Some(Lint { span: that_span, lint_kind: LintKind::Redundancy, suggestions: vec![Suggestion::Remove], message: "`that` is redundant and ungrammatical here".to_string(), priority: 31, }) } fn description(&self) -> &str { "Corrects `it looks like that` to just `it looks like`." } } #[cfg(test)] mod tests { mod that_noun { use super::super::ItLooksLikeThat; use crate::linting::tests::assert_no_lints; #[test] fn dont_flag_that_noun_is_also_verb_part_of_np() { // "that" could be legit demonstrative, indicating which 'file tree view' // "file" is both a noun and a verb assert_no_lints( "It looks like that file tree view is just for things that have already been committed?", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_noun_is_also_adj() { // "metric" is both a noun and an adjective assert_no_lints( "Yes, unfortunately it looks like that metric kind isn't supported yet.", ItLooksLikeThat::default(), ); } #[test] fn cant_flag_that_noun_is_also_verb_function() { // "that" is not demonstrative, but heuristics can't determine that. // "function" is both a noun and a verb assert_no_lints( "It looks like that function Config.validate_doc_path is only called in one place", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_noun_is_also_verb_test() { assert_no_lints( "It looks like that test runs with -sOFFSCREEN_FRAMEBUFFER", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_oov() { // "that" could be legit demonstrative, indicating which 'nms' // because OOV words are most commonly nouns. assert_no_lints( "It looks like that nms is not working.", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_noun_pad() { assert_no_lints( "It looks like that pad was not covered in solder mask or glue", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_noun_plural() { assert_no_lints( "The issue we're running into is that it looks like that nodes not only want to peer via raft", ItLooksLikeThat::default(), ); } } mod that_det { use super::super::ItLooksLikeThat; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_that_the() { // "that" is being wrongly used as a relative pronoun assert_suggestion_result( "it looks like that the original products should have NULL in the value column", ItLooksLikeThat::default(), "it looks like the original products should have NULL in the value column", ); } #[test] fn fix_that_some() { assert_suggestion_result( "From first expresion it looks like that some tokkens or what was cached", ItLooksLikeThat::default(), "From first expresion it looks like some tokkens or what was cached", ); } } mod that_verb { use super::super::ItLooksLikeThat; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn dont_flag_that_verb_3p_sing_pres_is() { // "that" is definitely legit demonstrative pronoun // Because "is" is a linking verb in 3rd person singular present form. assert_no_lints( "Looking at the code it looks like that is not the case", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_verb_3p_sing_pres_comes() { assert_no_lints( "it looks like that comes with additional compile-time dependencies", ItLooksLikeThat::default(), ); } #[test] fn fix_that_it_verb_lemma() { // "that" is being wrongly used as a relative pronoun // But it's hard to check because 'renovate' is a verb but is being used as a noun assert_suggestion_result( "It looks like that Renovate decides to not reuse the branch when there are no changes in it", ItLooksLikeThat::default(), "It looks like Renovate decides to not reuse the branch when there are no changes in it", ); } #[test] fn dont_flag_that_modal_verb_might() { assert_no_lints( "It looks like that might be exactly what I needed!", ItLooksLikeThat::default(), ); } #[test] fn dont_flag_that_verb_modal_would() { assert_no_lints( "but it looks like that would require writing the data out to vsimem and reading it back", ItLooksLikeThat::default(), ); } #[test] fn fix_that_verb_ing_have() { // Verbs in -ing are also gerunds, which are nouns. // But at least in this case, "having", it doesn't work after "that". assert_suggestion_result( "It looks like that having
tags inside them breaks the rendering", ItLooksLikeThat::default(), "It looks like having
tags inside them breaks the rendering", ); } #[test] fn fix_that_verb_ing_using() { assert_suggestion_result( "it looks like that using TensorFlow in conjunction with packages that use pybind11_abseil will fail", ItLooksLikeThat::default(), "it looks like using TensorFlow in conjunction with packages that use pybind11_abseil will fail", ); } #[test] fn dont_flag_that_verb_simple_past() { assert_no_lints( "but it looks like that got accidentally reverted at some point", ItLooksLikeThat::default(), ); } } mod pronoun { use super::super::ItLooksLikeThat; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn fix_that_subj_obj_pronoun_it_was() { // "that" is being wrongly used as a relative pronoun assert_suggestion_result( "It looks like that it was not improved a lot.", ItLooksLikeThat::default(), "It looks like it was not improved a lot.", ); } #[test] fn fix_that_subj_obj_pronoun_it_works() { // "that" is being wrongly used as a relative pronoun assert_suggestion_result( "Thx, it looks like that it works for Inpainting itself", ItLooksLikeThat::default(), "Thx, it looks like it works for Inpainting itself", ); } #[test] fn fix_that_subj_obj_pronoun_you() { assert_suggestion_result( "It looks like that you can't use the files in combination.", ItLooksLikeThat::default(), "It looks like you can't use the files in combination.", ); } #[test] fn dont_flag_thats() { assert_no_lints( "it looks like that's how you access the system changeset functionality", ItLooksLikeThat::default(), ); } } mod conjunction { use super::super::ItLooksLikeThat; use crate::linting::tests::assert_no_lints; #[test] fn cant_flag_that_if() { // This can be read two ways, so we can't flag it assert_no_lints( "It looks like that if the server goes away in the middle of a request, and a request is cancelled", ItLooksLikeThat::default(), ); } #[test] fn cant_flag_that_but() { // This can be read two ways, so we can't flag it assert_no_lints( "Yes, it looks like that but it is unreasonable since the shim executable is in the same directory", ItLooksLikeThat::default(), ); } } } ================================================ FILE: harper-core/src/linting/it_would_be.rs ================================================ use crate::expr::{Expr, FirstMatchOf, OwnedExprExt, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct ItWouldBe { expr: FirstMatchOf, } impl Default for ItWouldBe { fn default() -> Self { /* ─────────────── helpers ─────────────── */ let head_verbs = WordSet::new(&["believe", "doubt", "think", "assume", "guess"]); let modals = WordSet::new(&["might", "would", "will"]); let adjectives = WordSet::new(&["good", "bad", "wonderful", "real"]); let tail_nouns = WordSet::new(&[ "bummer", "pity", "shame", "pleasure", "idea", "experience", "problem", "catastrophe", "disaster", "trap", "challenge", ]); let branch = |has_not: bool, has_adj: bool| { let mut p = SequenceExpr::with(head_verbs.clone()) .then_whitespace() .t_aco("i") // the mistaken pronoun .then_whitespace() .then(modals.clone()); if has_not { p = p.then_whitespace().t_aco("not"); } p = p.then_whitespace().t_aco("be").then_whitespace().t_aco("a"); if has_adj { p = p.then_whitespace().then(adjectives.clone()); } p.then_whitespace().then(tail_nouns.clone()) }; let combined = branch(false, false) .or(branch(false, true)) .or(branch(true, false)) .or(branch(true, true)); Self { expr: combined } } } impl ExprLinter for ItWouldBe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { let pronoun = &toks[2]; let span = pronoun.span; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith("it".chars().collect())], message: "In this construction the pronoun should be “it”, not “I”. \ e.g. *“I think **it** would be a shame …”*" .to_owned(), priority: 31, }) } fn description(&self) -> &str { "Replaces the incorrect sequence “I might/would/will (not) be a …” with “it …”, \ as in “I think **it** would be a shame.”" } } #[cfg(test)] mod tests { use super::ItWouldBe; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn flags_simple_shame() { assert_suggestion_result( "I think I would be a shame if this happened.", ItWouldBe::default(), "I think it would be a shame if this happened.", ); } #[test] fn flags_believe_bummer() { assert_suggestion_result( "We believe I might not be a bummer after all.", ItWouldBe::default(), "We believe it might not be a bummer after all.", ); } #[test] fn flags_doubt_good_idea() { assert_suggestion_result( "They doubt I will be a good idea for the team.", ItWouldBe::default(), "They doubt it will be a good idea for the team.", ); } #[test] fn ignores_correct_it() { assert_lint_count( "I think it would be a shame if this happened.", ItWouldBe::default(), 0, ); } #[test] fn ignores_first_person_statement() { assert_lint_count( "I would be a good fit for the role.", ItWouldBe::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/its_contraction/general.rs ================================================ use harper_brill::UPOS; use crate::{ Document, Token, TokenStringExt, expr::{All, Expr, ExprExt, OwnedExprExt, SequenceExpr}, linting::{Lint, LintKind, Linter, Suggestion}, patterns::{NominalPhrase, Pattern, UPOSSet, WordSet}, }; pub struct General { expr: Box, } impl Default for General { fn default() -> Self { let positive = SequenceExpr::default().t_aco("its").then_whitespace().then( UPOSSet::new(&[UPOS::VERB, UPOS::AUX, UPOS::DET, UPOS::PRON]) .or(WordSet::new(&[ "anywhere", "everywhere", "somewhere", "nowhere", ])) .or(WordSet::new(&["because"])), ); let exceptions = SequenceExpr::anything() .then_anything() .then_word_set(&["own", "intended"]); let inverted = SequenceExpr::unless(exceptions); let expr = All::new(vec![Box::new(positive), Box::new(inverted)]).or_longest( SequenceExpr::aco("its") .t_ws() .then(UPOSSet::new(&[UPOS::ADJ])) .t_ws() .then(UPOSSet::new(&[UPOS::SCONJ, UPOS::PART])), ); Self { expr: Box::new(expr), } } } impl Linter for General { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); let source = document.get_source(); for chunk in document.iter_chunks() { lints.extend( self.expr .iter_matches(chunk, source) .filter_map(|match_span| { self.match_to_lint(&chunk[match_span.start..], source) }), ); } lints } fn description(&self) -> &str { "Detects the possessive `its` before `had`, `been`, or `got` and offers `it's` or `it has`." } } impl General { fn match_to_lint(&self, toks: &[Token], source: &[char]) -> Option { let offender = toks.first()?; let offender_chars = offender.span.get_content(source); let modifier = toks.get(2)?; let modifier_text = modifier.span.get_content_string(source); let modifier_lower = modifier_text.to_ascii_lowercase(); let next_kind = toks.get(4).map(|tok| tok.kind.clone()); if preceding_word(source, offender.span.start).as_deref() == Some("at") && matches!( modifier_text.as_str(), "highest" | "lowest" | "best" | "worst" ) { return None; } let exact_contraction_words = [ "anybody", "anyone", "anything", "anywhere", "everybody", "everyone", "everything", "everywhere", "nobody", "nothing", "nowhere", "somebody", "someone", "something", "somewhere", "because", ]; let determiner_like_words = [ "a", "an", "my", "your", "his", "her", "our", "their", "this", "that", ]; let contraction_adjectives = ["common", "easy", "hard"]; let strong_predicative_verbs = [ "had", "been", "got", "called", "named", "known", "termed", "titled", ]; let should_consider = if exact_contraction_words.contains(&modifier_lower.as_str()) || determiner_like_words.contains(&modifier_lower.as_str()) { true } else if modifier.kind.is_upos(UPOS::ADJ) { contraction_adjectives.contains(&modifier_lower.as_str()) && next_kind .is_some_and(|kind| kind.is_upos(UPOS::SCONJ) || kind.is_upos(UPOS::PART)) } else if modifier.kind.is_upos(UPOS::VERB) || modifier.kind.is_upos(UPOS::AUX) { let blocks_contraction = !strong_predicative_verbs.contains(&modifier_lower.as_str()) && (next_non_whitespace_word(source, modifier.span.end).is_some_and(|word| { matches!( word.as_str(), "is" | "was" | "were" | "be" | "been" | "being" | "to" ) }) || next_kind.is_some_and(|kind| kind.is_noun() || kind.is_proper_noun())); !blocks_contraction } else { false }; if !should_consider { return None; } if modifier.kind.is_upos(UPOS::VERB) && NominalPhrase.matches(&toks[2..], source).is_some() && !Self::is_likely_predicative_participle(modifier, source) { return None; } // Past-participle modifiers can be tagged as verbs even in possessive noun phrases: // "its abetted parameter", "its associated parameter", etc. if self.is_possessive_participle_noun_phrase(toks, source) { return None; } Some(Lint { span: offender.span, lint_kind: LintKind::Punctuation, suggestions: vec![ Suggestion::replace_with_match_case_str("it's", offender_chars), Suggestion::replace_with_match_case_str("it has", offender_chars), ], message: "Use `it's` (short for `it has` or `it is`) here, not the possessive `its`." .to_owned(), priority: 54, }) } fn is_possessive_participle_noun_phrase(&self, toks: &[Token], source: &[char]) -> bool { let Some(modifier) = toks.get(2) else { return false; }; let Some(gap) = toks.get(3) else { return false; }; let Some(head) = toks.get(4) else { return false; }; if !modifier.kind.is_verb_past_participle_form() || !gap.kind.is_whitespace() { return false; } if !(head.kind.is_noun() || head.kind.is_proper_noun()) { return false; } if Self::is_likely_predicative_participle(modifier, source) { return false; } let modifier_text = modifier.span.get_content_string(source); !["had", "been", "got"] .iter() .any(|word| modifier_text.eq_ignore_ascii_case(word)) } fn is_likely_predicative_participle(tok: &Token, source: &[char]) -> bool { let text = tok.span.get_content_string(source); ["called", "named", "known", "termed", "titled"] .iter() .any(|word| text.eq_ignore_ascii_case(word)) } } fn preceding_word(source: &[char], offset: usize) -> Option { let prefix = source.get(..offset)?; let mut i = prefix.len().checked_sub(1)?; while prefix[i].is_whitespace() { i = i.checked_sub(1)?; } let start = prefix[..=i] .iter() .rposition(|c| c.is_whitespace()) .map(|pos| pos + 1) .unwrap_or(0); Some( prefix[start..=i] .iter() .collect::() .to_ascii_lowercase(), ) } fn next_non_whitespace_word(source: &[char], offset: usize) -> Option { let suffix = source.get(offset..)?; let mut iter = suffix .iter() .enumerate() .skip_while(|(_, c)| c.is_whitespace()); let start = iter.next()?.0; let end = suffix[start..] .iter() .position(|c| c.is_whitespace() || c.is_ascii_punctuation()) .map(|len| start + len) .unwrap_or(suffix.len()); Some( suffix[start..end] .iter() .collect::() .to_ascii_lowercase(), ) } ================================================ FILE: harper-core/src/linting/its_contraction/mod.rs ================================================ use super::merge_linters::merge_linters; mod general; mod proper_noun; use general::General; use proper_noun::ProperNoun; merge_linters!( ItsContraction => General, ProperNoun => "Detects places where the possessive `its` should be the contraction `it's`, including before verbs/clauses and before proper nouns after opinion verbs." ); #[cfg(test)] mod tests { use super::ItsContraction; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fix_had() { assert_suggestion_result( "Its had an enormous effect.", ItsContraction::default(), "It's had an enormous effect.", ); } #[test] fn fix_been() { assert_suggestion_result( "Its been months since we spoke.", ItsContraction::default(), "It's been months since we spoke.", ); } #[test] fn fix_got() { assert_suggestion_result( "I think its got nothing to do with us.", ItsContraction::default(), "I think it's got nothing to do with us.", ); } #[test] fn fixes_its_common() { assert_suggestion_result( "Its common for users to get frustrated.", ItsContraction::default(), "It's common for users to get frustrated.", ); } #[test] fn ignore_correct_contraction() { assert_lint_count( "It's been a long year for everyone.", ItsContraction::default(), 0, ); } #[test] fn ignore_possessive() { assert_lint_count( "The company revised its policies last week.", ItsContraction::default(), 0, ); } #[test] fn ignore_coroutine() { assert_lint_count( "Launch each task within its own child coroutine.", ItsContraction::default(), 0, ); } #[test] fn issue_381() { assert_suggestion_result( "Its a nice day.", ItsContraction::default(), "It's a nice day.", ); } #[test] fn ignore_nominal_progressive() { assert_lint_count( "The class preserves its existing properties.", ItsContraction::default(), 0, ); } #[test] #[ignore = "past participles are not always adjectives ('cared' for instance)"] fn ignore_nominal_perfect() { assert_lint_count( "The robot followed its predetermined route.", ItsContraction::default(), 0, ); } #[test] fn ignore_nominal_long() { assert_lint_count( "I think of its exploding marvelous spectacular output.", ItsContraction::default(), 0, ); } #[test] fn corrects_because() { assert_suggestion_result( "Its because they don't want to.", ItsContraction::default(), "It's because they don't want to.", ); } #[test] fn corrects_its_hard() { assert_suggestion_result( "Its hard to believe that.", ItsContraction::default(), "It's hard to believe that.", ); } #[test] fn corrects_its_easy() { assert_suggestion_result( "Its easy if you try.", ItsContraction::default(), "It's easy if you try.", ); } #[test] fn corrects_its_a_picnic() { assert_suggestion_result( "Its a beautiful day for a picnic", ItsContraction::default(), "It's a beautiful day for a picnic", ); } #[test] fn corrects_its_my() { assert_suggestion_result( "Its my favorite song.", ItsContraction::default(), "It's my favorite song.", ); } #[test] fn allows_its_new() { assert_no_lints( "The company announced its new product line. ", ItsContraction::default(), ); } #[test] fn allows_its_own_charm() { assert_no_lints("The house has its own charm. ", ItsContraction::default()); } #[test] fn allows_its_victory() { assert_no_lints( "The team celebrated its victory. ", ItsContraction::default(), ); } #[test] fn allows_its_history() { assert_no_lints( "The country is proud of its history. ", ItsContraction::default(), ); } #[test] fn allows_its_secrets() { assert_no_lints( "The book contains its own secrets. ", ItsContraction::default(), ); } #[test] fn corrects_think_google() { assert_suggestion_result( "I think its Google, not Microsoft.", ItsContraction::default(), "I think it's Google, not Microsoft.", ); } #[test] fn corrects_hope_katie() { assert_suggestion_result( "I hope its Katie.", ItsContraction::default(), "I hope it's Katie.", ); } #[test] fn corrects_guess_date() { assert_suggestion_result( "I guess its March 6.", ItsContraction::default(), "I guess it's March 6.", ); } #[test] fn corrects_assume_john() { assert_suggestion_result( "We assume its John.", ItsContraction::default(), "We assume it's John.", ); } #[test] fn corrects_doubt_tesla() { assert_suggestion_result( "They doubt its Tesla this year.", ItsContraction::default(), "They doubt it's Tesla this year.", ); } #[test] fn handles_two_word_name() { assert_suggestion_result( "She thinks its New York.", ItsContraction::default(), "She thinks it's New York.", ); } #[test] fn ignores_existing_contraction() { assert_lint_count("I think it's Google.", ItsContraction::default(), 0); } #[test] fn ignores_possessive_noun_after_name() { assert_lint_count( "I think its Google product launch.", ItsContraction::default(), 0, ); } #[test] fn ignores_without_opinion_verb() { assert_lint_count( "Its Google Pixel lineup is impressive.", ItsContraction::default(), 0, ); } #[test] fn ignores_common_noun_target() { assert_lint_count( "We hope its accuracy improves.", ItsContraction::default(), 0, ); } #[test] fn issue_2547() { assert_no_lints( "using the foo feature and its associated parameter", ItsContraction::default(), ); } #[test] fn ignore_past_participle_noun_phrase() { assert_no_lints( "using the foo feature and its abetted parameter", ItsContraction::default(), ); } #[test] fn corrects_predicative_called() { assert_suggestion_result( "Its called recursion.", ItsContraction::default(), "It's called recursion.", ); } #[test] fn corrects_predicative_named() { assert_suggestion_result( "Its named Manhattan.", ItsContraction::default(), "It's named Manhattan.", ); } #[test] fn allows_possessive_generated_code() { assert_no_lints( "The compiler emits its generated code.", ItsContraction::default(), ); } #[test] fn corrects_its_anybody() { assert_suggestion_result( "Its anybody who volunteers should speak up.", ItsContraction::default(), "It's anybody who volunteers should speak up.", ); } #[test] fn corrects_its_anyone() { assert_suggestion_result( "Its anyone you ping will be looped in automatically.", ItsContraction::default(), "It's anyone you ping will be looped in automatically.", ); } #[test] fn corrects_its_everyone() { assert_suggestion_result( "Its everyone on the thread noticed the spike.", ItsContraction::default(), "It's everyone on the thread noticed the spike.", ); } #[test] fn corrects_its_everything() { assert_suggestion_result( "Its everything we collect ends up in the archive.", ItsContraction::default(), "It's everything we collect ends up in the archive.", ); } #[test] fn corrects_its_somebody() { assert_suggestion_result( "Its somebody on call right now.", ItsContraction::default(), "It's somebody on call right now.", ); } #[test] fn corrects_its_somewhere() { assert_suggestion_result( "Its somewhere safe to stash the nightly dump.", ItsContraction::default(), "It's somewhere safe to stash the nightly dump.", ); } #[test] fn corrects_its_nobody() { assert_suggestion_result( "Its nobody left who can approve this.", ItsContraction::default(), "It's nobody left who can approve this.", ); } #[test] fn corrects_its_anywhere() { assert_suggestion_result( "Its anywhere the monitors blink red.", ItsContraction::default(), "It's anywhere the monitors blink red.", ); } #[test] fn corrects_its_anything() { assert_suggestion_result( "Its anything worth keeping should be archived.", ItsContraction::default(), "It's anything worth keeping should be archived.", ); } #[test] fn corrects_its_something() { assert_suggestion_result( "Its something that keeps restarting the job.", ItsContraction::default(), "It's something that keeps restarting the job.", ); } #[test] fn allows_its_tail() { assert_no_lints( "Its tail twitches every time I call it.", ItsContraction::default(), ); } #[test] fn allows_its_release_pipeline() { assert_no_lints( "Its release pipeline is stable in production.", ItsContraction::default(), ); } #[test] fn allows_its_nodes() { assert_no_lints( "The cluster updates its nodes nightly.", ItsContraction::default(), ); } #[test] fn allows_its_cover_page() { assert_no_lints( "Its cover page mentions all contributors.", ItsContraction::default(), ); } #[test] fn allows_its_not_anybody() { assert_no_lints( "Its not anybody to blame despite the outage.", ItsContraction::default(), ); } #[test] fn allows_its_never_anywhere() { assert_no_lints( "Its never anywhere near the ideal timing we hoped for.", ItsContraction::default(), ); } #[test] fn allows_at_its_highest() { assert_no_lints( "Curiosity about Gatsby was at its highest that night.", ItsContraction::default(), ); } #[test] fn allows_its_pull_is() { assert_no_lints( "The Earth is huge, so its pull is super strong.", ItsContraction::default(), ); } #[test] fn allows_its_unforeseen_consequences() { assert_no_lints( "The experiment continued despite its unforeseen consequences.", ItsContraction::default(), ); } #[test] fn allows_its_potential_to_benefit() { assert_no_lints( "The proposal emphasized its potential to benefit local businesses.", ItsContraction::default(), ); } #[test] fn allows_its_cover_was() { assert_no_lints( "Its cover was intricately engraved with floral patterns.", ItsContraction::default(), ); } #[test] fn allows_its_starting_level() { assert_no_lints( "Reduce the tracker to its starting level.", ItsContraction::default(), ); } } ================================================ FILE: harper-core/src/linting/its_contraction/proper_noun.rs ================================================ use std::ops::Range; use harper_brill::UPOS; use crate::{ Document, Token, TokenStringExt, expr::{ExprExt, ExprMap, OwnedExprExt, SequenceExpr}, linting::{Lint, LintKind, Linter, Suggestion}, patterns::{DerivedFrom, UPOSSet}, }; pub struct ProperNoun { expr: ExprMap>, } impl Default for ProperNoun { fn default() -> Self { let mut map = ExprMap::default(); let opinion_verbs = DerivedFrom::new_from_str("think") .or(DerivedFrom::new_from_str("hope")) .or(DerivedFrom::new_from_str("assume")) .or(DerivedFrom::new_from_str("doubt")) .or(DerivedFrom::new_from_str("guess")); let capitalized_word = |tok: &Token, src: &[char]| { tok.kind.is_word() && tok .span .get_content(src) .first() .map(|c| c.is_uppercase()) .unwrap_or(false) }; let name_head = UPOSSet::new(&[UPOS::PROPN]).or(capitalized_word); let lookahead_word = SequenceExpr::default().t_ws().then_any_word(); map.insert( SequenceExpr::with(opinion_verbs) .t_ws() .t_aco("its") .t_ws() .then(name_head) .then_optional(lookahead_word), 2..3, ); Self { expr: map } } } impl Linter for ProperNoun { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); let source = document.get_source(); for chunk in document.iter_chunks() { lints.extend( self.expr .iter_matches(chunk, source) .filter_map(|match_span| { let matched = &chunk[match_span.start..match_span.end]; self.match_to_lint(matched, source) }), ); } lints } fn description(&self) -> &str { "Suggests the contraction `it's` after opinion verbs when it introduces a proper noun." } } impl ProperNoun { fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { if matched_tokens.len() >= 7 && let Some(next_word) = matched_tokens.get(6) { let is_lowercase = next_word .span .get_content(source) .first() .map(|c| c.is_lowercase()) .unwrap_or(false); if is_lowercase && (next_word.kind.is_upos(UPOS::NOUN) || next_word.kind.is_upos(UPOS::ADJ)) { return None; } } let range = self.expr.lookup(0, matched_tokens, source)?.clone(); let offending = matched_tokens.get(range.start)?; let offender_text = offending.span.get_content(source); Some(Lint { span: offending.span, lint_kind: LintKind::Punctuation, suggestions: vec![Suggestion::replace_with_match_case_str( "it's", offender_text, )], message: "Use `it's` (short for \"it is\") before a proper noun in this construction." .to_owned(), priority: 31, }) } } ================================================ FILE: harper-core/src/linting/its_possessive.rs ================================================ use harper_brill::UPOS; use crate::Token; use crate::expr::AnchorStart; use crate::expr::Expr; use crate::expr::ExprMap; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::patterns::UPOSSet; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ItsPossessive { expr: ExprMap, } impl Default for ItsPossessive { fn default() -> Self { let mut map = ExprMap::default(); let adj_term_mid_sentence = SequenceExpr::default() .t_ws() .then(UPOSSet::new(&[UPOS::ADJ])); let mid_sentence = SequenceExpr::with(UPOSSet::new(&[UPOS::VERB, UPOS::ADP])) .t_ws() .t_aco("it's") .then_optional(adj_term_mid_sentence) .t_ws() .then( UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN]).or(|tok: &Token, _: &[char]| { tok.kind.as_number().is_some_and(|n| n.suffix.is_some()) }), ); map.insert(mid_sentence, 2); let start_of_sentence_noun = SequenceExpr::with(AnchorStart) .t_aco("it's") .t_ws() .then( UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN]).or(|tok: &Token, _: &[char]| { tok.kind.as_number().is_some_and(|n| n.suffix.is_some()) }), ) .then_unless(SequenceExpr::default().t_ws().then(UPOSSet::new(&[ UPOS::VERB, UPOS::PART, UPOS::ADP, UPOS::NOUN, UPOS::PRON, UPOS::SCONJ, UPOS::CCONJ, UPOS::ADV, ]))); map.insert(start_of_sentence_noun, 0); let start_of_sentence_noun_subject = SequenceExpr::with(AnchorStart) .t_aco("it's") .t_ws() .then( UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN]).or(|tok: &Token, _: &[char]| { tok.kind.as_number().is_some_and(|n| n.suffix.is_some()) || ((tok.kind.is_noun() || tok.kind.is_proper_noun()) && !tok.kind.is_adjective() && !tok.kind.is_adverb()) }), ) .t_ws() .then(UPOSSet::new(&[UPOS::VERB, UPOS::AUX])); map.insert(start_of_sentence_noun_subject, 0); let start_of_sentence_adjective = SequenceExpr::with(AnchorStart) .t_aco("it's") .t_ws() .then(UPOSSet::new(&[UPOS::ADJ])) .t_ws() .then_unless(UPOSSet::new(&[ UPOS::VERB, UPOS::PART, UPOS::ADP, UPOS::NOUN, UPOS::PRON, UPOS::SCONJ, UPOS::CCONJ, UPOS::ADV, ])); map.insert(start_of_sentence_adjective, 0); let start_of_chunk_after_conjunction = SequenceExpr::with(AnchorStart) .then(UPOSSet::new(&[UPOS::CCONJ])) .t_ws() .t_aco("it's") .t_ws() .then( UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN]).or(|tok: &Token, _: &[char]| { tok.kind.as_number().is_some_and(|n| n.suffix.is_some()) }), ) .then_unless(SequenceExpr::default().t_ws().then(UPOSSet::new(&[ UPOS::VERB, UPOS::PART, UPOS::ADP, UPOS::NOUN, UPOS::PRON, UPOS::SCONJ, UPOS::CCONJ, UPOS::ADV, ]))); map.insert(start_of_chunk_after_conjunction, 2); let special = SequenceExpr::aco("it's").t_ws().t_aco("various"); map.insert(special, 0); Self { expr: map } } } impl ExprLinter for ItsPossessive { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_idx = self.expr.lookup(0, matched_tokens, source).unwrap(); let span = matched_tokens[*offending_idx].span; Some(Lint { span, lint_kind: LintKind::Agreement, suggestions: vec![Suggestion::replace_with_match_case_str( "its", span.get_content(source), )], message: "Use the possessive pronoun `its` (without an apostrophe) to show ownership. The word `it's` (with an apostrophe) is a contraction of 'it is' or 'it has' and should not be used to indicate possession.".to_string(), priority: 31, }) } fn description(&self) -> &'static str { "In English, possessive pronouns never take an apostrophe. Use `its` to show ownership (e.g. “its texture”) and avoid confusing it with `it's`, which always means “it is” or “it has.”" } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::ItsPossessive; #[test] fn corrects_its_various() { assert_suggestion_result( "I like it's various colors.", ItsPossessive::default(), "I like its various colors.", ); } #[test] fn fixes_inspiration() { assert_suggestion_result( "I would just put `Orthography` and it's various function implementations in their own `orthography.rs` file.", ItsPossessive::default(), "I would just put `Orthography` and its various function implementations in their own `orthography.rs` file.", ); } #[test] fn engine_lost_its_compression() { assert_lint_count( "The engine lost it's compression.", ItsPossessive::default(), 1, ); } #[test] fn admired_sculpture_for_its_intricacy() { assert_suggestion_result( "I admired the sculpture for it's intricacy.", ItsPossessive::default(), "I admired the sculpture for its intricacy.", ); } #[test] fn paris_is_known_for_its_architecture() { assert_lint_count( "Paris is known for it's architecture.", ItsPossessive::default(), 1, ); } #[test] fn plain_sentence_with_apostrophe_s() { assert_suggestion_result( "It's benefits are numerous.", ItsPossessive::default(), "Its benefits are numerous.", ); } #[test] fn fixes_its_ancestor() { assert_suggestion_result( "It's ancestor is still around.", ItsPossessive::default(), "Its ancestor is still around.", ); } #[test] fn device_reached_its_100th_cycle() { assert_lint_count( "The device reached it's 100th cycle.", ItsPossessive::default(), 1, ); } #[test] fn oddly_its_wheels_misaligned() { assert_lint_count( "Oddly, it's wheels were misaligned.", ItsPossessive::default(), 1, ); } #[test] fn leaking_oil_constant_issue() { assert_lint_count("It's leaking oil constantly.", ItsPossessive::default(), 0); } #[test] fn fiftyth_anniversary() { assert_lint_count( "The company celebrated it's 50th anniversary.", ItsPossessive::default(), 1, ); } #[test] fn second_attempt() { assert_lint_count("He failed it's 2nd attempt.", ItsPossessive::default(), 1); } #[test] fn third_iteration() { assert_lint_count( "The program finished it's 3rd iteration.", ItsPossessive::default(), 1, ); } #[test] fn tenth_milestone() { assert_lint_count( "They reached it's 10th milestone.", ItsPossessive::default(), 1, ); } #[test] fn seventh_chapter() { assert_lint_count( "The novel lost it's 7th chapter.", ItsPossessive::default(), 1, ); } #[test] fn fifth_version() { assert_lint_count( "Software updated to it's 5th version.", ItsPossessive::default(), 1, ); } #[test] fn eighth_floor() { assert_lint_count( "Elevator stopped at it's 8th floor.", ItsPossessive::default(), 1, ); } #[test] fn twelfth_episode() { assert_lint_count( "Series ended it's 12th episode.", ItsPossessive::default(), 1, ); } #[test] fn fourth_draft() { assert_lint_count("He completed it's 4th draft.", ItsPossessive::default(), 1); } #[test] fn ninth_revision() { assert_lint_count( "The report saved it's 9th revision.", ItsPossessive::default(), 1, ); } #[test] fn allows_hard_to_tell() { assert_no_lints("It's hard to tell from here.", ItsPossessive::default()); } #[test] fn allows_illegible() { assert_no_lints( "When you write in cursive, its illegible", ItsPossessive::default(), ); } #[test] fn allows_good_practice() { assert_no_lints( "it's good practice to review the general settings", ItsPossessive::default(), ); } #[test] fn allows_understandable() { assert_no_lints( "It's understandable that you'd feel the weight of responsibility.", ItsPossessive::default(), ); } #[test] fn allows_insincere() { assert_no_lints( "But feel free to omit it if you feel it's insincere.", ItsPossessive::default(), ); } #[test] fn allows_its_possible() { assert_no_lints( "It's possible that a record was improperly handled. ", ItsPossessive::default(), ); } #[test] fn allows_many_times_harder() { assert_no_lints( "It's many times harder to do this than that.", ItsPossessive::default(), ); } #[test] fn allow_issue_1658() { assert_no_lints( "It's kind of a nuisance, but it will work.", ItsPossessive::default(), ); } #[test] fn allow_issue_2001() { assert_no_lints( "It's worth highlighting that while using a fork instead of a spoon is easy, it sometimes isn't.", ItsPossessive::default(), ); } #[test] fn dont_flag_issue_1722_its_whats_accessible() { assert_no_lints( "The base execution context is the global execution context: it's what's accessible everywhere in your code.", ItsPossessive::default(), ); } #[test] fn dont_flag_issue_1722_its_early_and() { assert_no_lints( "it's early and there's plenty of room for novel and potentially", ItsPossessive::default(), ); } #[test] fn dont_flag_issue_1722_its_big_enough() { assert_no_lints("It's big enough.", ItsPossessive::default()); } #[test] fn allows_its_awesome() { assert_no_lints("It's awesome.", ItsPossessive::default()); } #[test] fn flags_all_its_possessive_in_list() { assert_lint_count( "Understand it's code, it's values, and it's purpose.", ItsPossessive::default(), 3, ); } #[test] fn fixes_all_its_possessive_in_list() { assert_suggestion_result( "Understand it's code, it's values, and it's purpose.", ItsPossessive::default(), "Understand its code, its values, and its purpose.", ); } } ================================================ FILE: harper-core/src/linting/jealous_of.rs ================================================ use crate::{ Token, expr::{Expr, SequenceExpr}, linting::expr_linter::Chunk, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct JealousOf { expr: SequenceExpr, } impl Default for JealousOf { fn default() -> Self { let valid_object = |tok: &Token, _source: &[char]| { (tok.kind.is_nominal() || !tok.kind.is_verb()) && (tok.kind.is_oov() || tok.kind.is_nominal()) && !tok.kind.is_preposition() }; let pattern = SequenceExpr::default() .t_aco("jealous") .t_ws() .t_aco("from") .t_ws() .then_optional(SequenceExpr::default().then_determiner().t_ws()) .then(valid_object); Self { expr: pattern } } } impl ExprLinter for JealousOf { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let from_token = &tokens[2]; Some(Lint { span: from_token.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "of", from_token.span.get_content(source), )], message: "Use `of` after `jealous`.".to_owned(), ..Default::default() }) } fn description(&self) -> &str { "Encourages the standard preposition after `jealous`." } } #[cfg(test)] mod tests { use super::JealousOf; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn replaces_basic_from() { assert_suggestion_result( "She was jealous from her sister's success.", JealousOf::default(), "She was jealous of her sister's success.", ); } #[test] fn handles_optional_determiner() { assert_suggestion_result( "He grew jealous from the attention.", JealousOf::default(), "He grew jealous of the attention.", ); } #[test] fn fixes_pronoun_object() { assert_suggestion_result( "They became jealous from him.", JealousOf::default(), "They became jealous of him.", ); } #[test] fn allows_oov_target() { assert_suggestion_result( "I'm jealous from Zybrix.", JealousOf::default(), "I'm jealous of Zybrix.", ); } #[test] fn corrects_uppercase_preposition() { assert_suggestion_result( "Jealous FROM his fame.", JealousOf::default(), "Jealous OF his fame.", ); } #[test] fn fixes_longer_phrase() { assert_suggestion_result( "They felt jealous from the sudden praise she received.", JealousOf::default(), "They felt jealous of the sudden praise she received.", ); } #[test] fn fixes_minimal_phrase() { assert_suggestion_result( "jealous from success", JealousOf::default(), "jealous of success", ); } #[test] fn does_not_flag_correct_usage() { assert_lint_count( "She was jealous of her sister's success.", JealousOf::default(), 0, ); } #[test] fn does_not_flag_other_preposition_sequence() { assert_lint_count( "They stayed jealous from within the fortress.", JealousOf::default(), 0, ); } #[test] fn fixes_following_gerund() { assert_suggestion_result( "He was jealous from being ignored.", JealousOf::default(), "He was jealous of being ignored.", ); } #[test] fn ignores_numbers_after_from() { assert_lint_count( "She remained jealous from 2010 through 2015.", JealousOf::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/johns_hopkins.rs ================================================ use crate::{ CharStringExt, Token, expr::{Expr, SequenceExpr}, linting::expr_linter::Chunk, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct JohnsHopkins { expr: SequenceExpr, } impl Default for JohnsHopkins { fn default() -> Self { let expr = SequenceExpr::with(|tok: &Token, src: &[char]| { tok.kind.is_proper_noun() && tok.span.get_content(src).eq_ignore_ascii_case_str("john") }) .t_ws() .then(|tok: &Token, src: &[char]| { tok.kind.is_proper_noun() && tok .span .get_content(src) .eq_ignore_ascii_case_str("hopkins") }); Self { expr } } } impl ExprLinter for JohnsHopkins { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.first()?.span; let template = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str("Johns", template)], message: "Use `Johns Hopkins` for this name.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Recommends the proper spelling `Johns Hopkins`." } } #[cfg(test)] mod tests { use super::JohnsHopkins; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_university_reference() { assert_suggestion_result( "I applied to John Hopkins University last fall.", JohnsHopkins::default(), "I applied to Johns Hopkins University last fall.", ); } #[test] fn corrects_hospital_reference() { assert_suggestion_result( "She works at the John Hopkins hospital.", JohnsHopkins::default(), "She works at the Johns Hopkins hospital.", ); } #[test] fn corrects_standalone_name() { assert_suggestion_result( "We toured John Hopkins yesterday.", JohnsHopkins::default(), "We toured Johns Hopkins yesterday.", ); } #[test] fn corrects_lowercase_usage() { assert_suggestion_result( "I studied at john hopkins online.", JohnsHopkins::default(), "I studied at johns hopkins online.", ); } #[test] fn corrects_across_newline_whitespace() { assert_suggestion_result( "We met at John\nHopkins for lunch.", JohnsHopkins::default(), "We met at Johns\nHopkins for lunch.", ); } #[test] fn corrects_with_trailing_punctuation() { assert_suggestion_result( "I toured John Hopkins, and it was great.", JohnsHopkins::default(), "I toured Johns Hopkins, and it was great.", ); } #[test] fn corrects_before_hyphenated_unit() { assert_suggestion_result( "She joined the John Hopkins-affiliated lab.", JohnsHopkins::default(), "She joined the Johns Hopkins-affiliated lab.", ); } #[test] fn allows_correct_spelling() { assert_lint_count( "Johns Hopkins University has a great program.", JohnsHopkins::default(), 0, ); } #[test] fn allows_apostrophized_form() { assert_lint_count( "John Hopkins's novel won awards.", JohnsHopkins::default(), 0, ); } #[test] fn allows_reversed_name_order() { assert_lint_count("Hopkins, John is a contact.", JohnsHopkins::default(), 0); } } ================================================ FILE: harper-core/src/linting/lead_rise_to.rs ================================================ use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct LeadRiseTo { expr: SequenceExpr, } impl Default for LeadRiseTo { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["lead", "led", "leads", "leading"]) .t_ws() .t_aco("rise") .t_ws() .t_aco("to"), } } } impl ExprLinter for LeadRiseTo { type Unit = Chunk; fn description(&self) -> &str { "Corrects `leads rise to` to `gives rise to`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let ltok = toks.first()?; let lspan = ltok.span; let lchars = lspan.get_content(src); const GAVE: &[char] = &['g', 'a', 'v', 'e']; const GIVE: &[char] = &['g', 'i', 'v', 'e']; const GIVEN: &[char] = &['g', 'i', 'v', 'e', 'n']; const GIVES: &[char] = &['g', 'i', 'v', 'e', 's']; const GIVING: &[char] = &['g', 'i', 'v', 'i', 'n', 'g']; const GAVE_GIVEN: &[&[char]] = &[GAVE, GIVEN]; const GIVE_GAVE_GIVEN: &[&[char]] = &[GIVE, GAVE, GIVEN]; let gchars: &[&[char]] = match lchars { ['l', 'e', 'a', 'd'] => GIVE_GAVE_GIVEN, ['l', 'e', 'd'] => GAVE_GIVEN, ['l', 'e', 'a', 'd', 's'] => &[GIVES][..], ['l', 'e', 'a', 'd', 'i', 'n', 'g'] => &[GIVING][..], _ => return None, }; let suggestions: Vec = gchars .iter() .map(|l| Suggestion::replace_with_match_case(l.to_vec(), lspan.get_content(src))) .collect(); Some(Lint { span: lspan, lint_kind: LintKind::Usage, suggestions, message: "The correct idiom is `give rise to`.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::LeadRiseTo; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_led_simple_past() { assert_suggestion_result( "In this way, it led rise to a kind of monotheism in Egypt.", LeadRiseTo::default(), "In this way, it gave rise to a kind of monotheism in Egypt.", ); } #[test] fn fix_led_past_participle() { assert_suggestion_result( "This had led rise to some issues, such as #2777 and some over Slack", LeadRiseTo::default(), "This had given rise to some issues, such as #2777 and some over Slack", ); } #[test] fn fix_lead_spello_for_led() { assert_suggestion_result( "This lead rise to a fair number of complaints over image quality which were not down to RPT.", LeadRiseTo::default(), "This gave rise to a fair number of complaints over image quality which were not down to RPT.", ); } #[test] fn fix_lead_not_spello() { assert_suggestion_result( "Philosophy is important because it raises the questions that lead rise to the sciences.", LeadRiseTo::default(), "Philosophy is important because it raises the questions that give rise to the sciences.", ); } #[test] fn fix_leads() { assert_suggestion_result( "This leads rise to another question of mine", LeadRiseTo::default(), "This gives rise to another question of mine", ); } #[test] fn fix_leading() { assert_suggestion_result( "The severe bushfires have also created their own weather, leading rise to a phenomenon known as pyrocumulonimbus (pyroCB) storms.", LeadRiseTo::default(), "The severe bushfires have also created their own weather, giving rise to a phenomenon known as pyrocumulonimbus (pyroCB) storms.", ); } } ================================================ FILE: harper-core/src/linting/left_right_hand.rs ================================================ use crate::Token; use crate::expr::Expr; use crate::expr::SequenceExpr; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct LeftRightHand { expr: SequenceExpr, } impl Default for LeftRightHand { fn default() -> Self { let pattern = SequenceExpr::word_set(&["left", "right"]) .then_whitespace() .t_aco("hand") .then_whitespace() .then_noun(); Self { expr: pattern } } } impl ExprLinter for LeftRightHand { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let space = &matched_tokens[1]; Some(Lint { span: space.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith(vec!['-'])], message: "Use a hyphen in `left-hand` or `right-hand` when modifying a noun." .to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Ensures `left hand` and `right hand` are hyphenated when used as adjectives before a noun, such as in `left-hand side` or `right-hand corner`." } } #[cfg(test)] mod tests { use super::LeftRightHand; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_left_hand_side() { assert_suggestion_result( "You'll see it on the left hand side.", LeftRightHand::default(), "You'll see it on the left-hand side.", ); } #[test] fn corrects_right_hand_corner() { assert_suggestion_result( "It's in the right hand corner.", LeftRightHand::default(), "It's in the right-hand corner.", ); } #[test] fn does_not_correct_noun_usage() { assert_suggestion_result( "She raised her right hand.", LeftRightHand::default(), "She raised her right hand.", ); } } ================================================ FILE: harper-core/src/linting/less_worse.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::{CharStringExt, Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct LessWorse { expr: SequenceExpr, } impl Default for LessWorse { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["less", "least"]) .t_ws_h() .then_word_set(&["worse", "worst"]), } } } impl ExprLinter for LessWorse { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() != 3 { return None; } let span = toks.span()?; let how_little = toks[0].span.get_content(src).to_lower(); let space_or_hyphen = &toks[1]; let how_bad = toks[2].span.get_content(src).to_lower(); let (suggestions, message): (&[&[char]], &str) = match ( how_little.as_ref(), space_or_hyphen.kind.is_hyphen(), how_bad.as_ref(), ) { // "Least worst": Not standard or grammatical but idiomatic and popular. (['l', 'e', 'a', 's', 't'], false, ['w', 'o', 'r', 's', 't']) => ( &[&['l', 'e', 'a', 's', 't', ' ', 'b', 'a', 'd']], "Though `least worst` is a common idiom, `least bad` is the standard way to compare bad options.", ), // "Least-worst": As above but also the hyphen is incorrect. (['l', 'e', 'a', 's', 't'], true, ['w', 'o', 'r', 's', 't']) => ( &[ &['l', 'e', 'a', 's', 't', ' ', 'w', 'o', 'r', 's', 't'], &['l', 'e', 'a', 's', 't', ' ', 'b', 'a', 'd'], ], "`Least worst` (without the hyphen) is a common idiom, but `least bad` is the standard way to compare bad options.", ), // About 1/3 as common as "least worst" so less acceptable as an idiom. (['l', 'e', 's', 's'], _, ['w', 'o', 'r', 's', 'e']) => ( &[&['l', 'e', 's', 's', ' ', 'b', 'a', 'd']], "The standard way to compare bad options is `less bad`.", ), // Ambiguous. Is it supposed to be comparative or superlative? (['l', 'e', 's', 's'], _, ['w', 'o', 'r', 's', 't']) => ( &[ &['l', 'e', 's', 's', ' ', 'b', 'a', 'd'], &['l', 'e', 'a', 's', 't', ' ', 'b', 'a', 'd'], ], "These words conflict with each other. Choose `less bad` or `least bad`.", ), // Ambiguous. Probably a non-native speaker that means "least worst", but offer all three options. (['l', 'e', 'a', 's', 't'], _, ['w', 'o', 'r', 's', 'e']) => ( &[ &['l', 'e', 'a', 's', 't', ' ', 'w', 'o', 'r', 's', 't'], &['l', 'e', 'a', 's', 't', ' ', 'b', 'a', 'd'], &['l', 'e', 's', 's', ' ', 'b', 'a', 'd'], ], "These words conflict with each other. Choose `less bad` or `least bad` for more standard English, or `least worst` for more idiomatic English.", ), _ => return None, }; let template = span.get_content(src); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: suggestions .iter() .map(|s| Suggestion::replace_with_match_case(s.to_vec(), template)) .collect::>(), message: message.to_string(), priority: 126, }) } fn description(&self) -> &'static str { "Suggests alternatives to `less/least worse/worst` for more standard, clearer comparisons." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_good_and_bad_suggestions, assert_suggestion_result}; use super::LessWorse; #[test] fn correct_least_worse() { assert_good_and_bad_suggestions( "Maybe downstream packaging folks could advice what would be least worse option.", LessWorse::default(), &[ "Maybe downstream packaging folks could advice what would be least worst option.", "Maybe downstream packaging folks could advice what would be least bad option.", "Maybe downstream packaging folks could advice what would be less bad option.", ], &[], ); } #[test] fn correct_least_worst_hyphen() { assert_good_and_bad_suggestions( "async-dropper is probably the least-worst ad-hoc AsyncDrop implementation you've seen.", LessWorse::default(), &[ "async-dropper is probably the least worst ad-hoc AsyncDrop implementation you've seen.", "async-dropper is probably the least bad ad-hoc AsyncDrop implementation you've seen.", ], &[], ); } #[test] fn correct_less_worse() { assert_suggestion_result( "Professionally I've convinced the team at @Roave to pay me for making their PHP code marginally less worse.", LessWorse::default(), "Professionally I've convinced the team at @Roave to pay me for making their PHP code marginally less bad.", ); } #[test] fn correct_less_worst() { assert_good_and_bad_suggestions( "May be the less worst choice for some little playlists.", LessWorse::default(), &[ "May be the less bad choice for some little playlists.", "May be the least bad choice for some little playlists.", ], &[], ); } } ================================================ FILE: harper-core/src/linting/let_to_do.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::{LintKind, Suggestion}; use crate::token_string_ext::TokenStringExt; use super::{ExprLinter, Lint}; use crate::linting::expr_linter::Chunk; pub struct LetToDo { expr: SequenceExpr, } impl Default for LetToDo { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["let", "lets", "let's"]) .t_ws() .then_any_of(vec![ Box::new(SequenceExpr::default().then_object_pronoun()), Box::new(SequenceExpr::word_set(&[ // Elective existential indefinite pronouns "anybody", "anyone", // Universal indefinite pronouns "everybody", "everyone", // Negative indefinite pronouns (correct) "nobody", // Negative indefinite pronouns (incorrect) "noone", // Assertive existential indefinite pronouns "somebody", "someone", ])), Box::new( SequenceExpr::word_set(&["any", "every", "no", "some"]) .t_ws() .then_word_set(&["body", "one"]), ), ]) .t_ws() .t_aco("to"), } } } impl ExprLinter for LetToDo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { Some(Lint { span: toks[toks.len() - 2..].span()?, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::Remove], message: "The word `to` should not be used with `let` in this way.".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Corrects extraneous `to` after `let`." } } #[cfg(test)] mod tests { use super::LetToDo; use crate::linting::tests::assert_suggestion_result; // let #[test] fn let_me_to() { assert_suggestion_result( "Let me to decide show player controls or not", LetToDo::default(), "Let me decide show player controls or not", ); } #[test] fn let_you_to() { assert_suggestion_result( "Azure provider does not let you to ask for approval", LetToDo::default(), "Azure provider does not let you ask for approval", ); } #[test] fn let_us_to() { assert_suggestion_result( "Currently JavaScript syntax does not let us to pick one or more properties from an object", LetToDo::default(), "Currently JavaScript syntax does not let us pick one or more properties from an object", ); } #[test] fn let_it_to() { assert_suggestion_result( "I modified the load_checkpoints and let it to only load the autoencoder's checkpoint.", LetToDo::default(), "I modified the load_checkpoints and let it only load the autoencoder's checkpoint.", ); } #[test] fn let_him_to() { assert_suggestion_result( "let him to delete the information he wrote", LetToDo::default(), "let him delete the information he wrote", ); } #[test] fn let_anybody_to() { assert_suggestion_result( "but at least will not let anybody to sub from tls as far as i understood this properly", LetToDo::default(), "but at least will not let anybody sub from tls as far as i understood this properly", ); } #[test] fn let_anyone_to() { assert_suggestion_result( "How would you let anyone to help you?", LetToDo::default(), "How would you let anyone help you?", ); } #[test] fn let_any_one_to() { assert_suggestion_result( "set up a mcp server to let any one to query how to use the api in the repo", LetToDo::default(), "set up a mcp server to let any one query how to use the api in the repo", ); } #[test] fn let_everybody_to() { assert_suggestion_result( "on a project that let everybody to create things", LetToDo::default(), "on a project that let everybody create things", ); } #[test] fn let_everyone_to() { assert_suggestion_result( "We want to let everyone to be able to select between the servers we have right now", LetToDo::default(), "We want to let everyone be able to select between the servers we have right now", ); } #[test] fn let_every_one_to() { assert_suggestion_result( "you SHOULDN'T DO THIS because you let every one to upload an executable", LetToDo::default(), "you SHOULDN'T DO THIS because you let every one upload an executable", ); } #[test] fn let_nobody_to() { assert_suggestion_result( "i wouldn't let nobody to snoop on user's data", LetToDo::default(), "i wouldn't let nobody snoop on user's data", ); } #[test] fn let_no_one_to() { assert_suggestion_result( "hide video download link in wordpress - let no one to see video download link", LetToDo::default(), "hide video download link in wordpress - let no one see video download link", ); } #[test] fn let_somebody_to() { assert_suggestion_result( "So it should be the same let somebody to make required for reviewers.", LetToDo::default(), "So it should be the same let somebody make required for reviewers.", ); } #[test] fn let_some_one_to() { assert_suggestion_result( "let some one to help me who can do it", LetToDo::default(), "let some one help me who can do it", ); } // lets #[test] fn lets_me_to() { assert_suggestion_result( "Also, clicking on the gear lets me to put login credentials", LetToDo::default(), "Also, clicking on the gear lets me put login credentials", ); } #[test] fn lets_you_to() { assert_suggestion_result( "A chrome extension which lets you to create your own customised text snippets and use in your browser.", LetToDo::default(), "A chrome extension which lets you create your own customised text snippets and use in your browser.", ); } #[test] fn lets_us_to() { assert_suggestion_result( "A menu which lets us to get money", LetToDo::default(), "A menu which lets us get money", ); } #[test] fn lets_anyone_to() { assert_suggestion_result( "fake ssh server that lets anyone to connect and monitor their activty", LetToDo::default(), "fake ssh server that lets anyone connect and monitor their activty", ); } #[test] fn lets_everybody_to() { assert_suggestion_result( "Use set.seed function which lets everybody to check your result on their computers.", LetToDo::default(), "Use set.seed function which lets everybody check your result on their computers.", ); } #[test] fn lets_everyone_to() { assert_suggestion_result( "what lets everyone to know what to expect", LetToDo::default(), "what lets everyone know what to expect", ); } #[test] fn lets_someone_to() { assert_suggestion_result( "it works correctly and lets someone to connect using telnet", LetToDo::default(), "it works correctly and lets someone connect using telnet", ); } // erroneous let's #[test] fn lets_me_to_apostrophe() { assert_suggestion_result( "I need be able to clone receiver, which crossbeam let's me to do.", LetToDo::default(), "I need be able to clone receiver, which crossbeam let's me do.", ); } #[test] fn lets_us_to_apostrophe() { assert_suggestion_result( "this option let's us to cut the whole project in smaller pieces, like time based sprites.", LetToDo::default(), "this option let's us cut the whole project in smaller pieces, like time based sprites.", ); } #[test] fn lets_you_to_apostrophe() { assert_suggestion_result( "Let's you to migrate/transfer save files from older outward versions to outward definitive edition.", LetToDo::default(), "Let's you migrate/transfer save files from older outward versions to outward definitive edition.", ); } #[test] fn lets_him_to_apostrophe() { assert_suggestion_result( "A good woman gives wings to a man and let's him to take on the whole world", LetToDo::default(), "A good woman gives wings to a man and let's him take on the whole world", ); } #[test] fn lets_her_to_apostrophe() { assert_suggestion_result( "if Igor let's her to be with Wonder she would crush everyone", LetToDo::default(), "if Igor let's her be with Wonder she would crush everyone", ); } #[test] fn lets_it_to_apostrophe() { assert_suggestion_result( "It's as accurate as your GPS let's it to be.", LetToDo::default(), "It's as accurate as your GPS let's it be.", ); } #[test] fn lets_them_to_apostrophe() { assert_suggestion_result( "it does not cut the dataset into 2 separate subsets in each step but let's them to get predictions from both branches", LetToDo::default(), "it does not cut the dataset into 2 separate subsets in each step but let's them get predictions from both branches", ); } #[test] fn lets_anyone_to_apostrophe() { assert_suggestion_result( "It let's anyone to discover, take, or even teach a class.", LetToDo::default(), "It let's anyone discover, take, or even teach a class.", ); } #[test] fn lets_any_one_to_apostrophe() { assert_suggestion_result( "Whyyyy hashmeet let's any one to create their own tinder like swipe clubs or groups?", LetToDo::default(), "Whyyyy hashmeet let's any one create their own tinder like swipe clubs or groups?", ); } #[test] fn lets_everyone_to_apostrophe() { assert_suggestion_result( "How do you feel that America let's everyone to have guns", LetToDo::default(), "How do you feel that America let's everyone have guns", ); } #[test] fn lets_someone_to_apostrophe() { assert_suggestion_result( "Commands and attributes let's someone to compare it with other TRV", LetToDo::default(), "Commands and attributes let's someone compare it with other TRV", ); } } ================================================ FILE: harper-core/src/linting/lets_confusion/let_us_redundancy.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; /// See also: /// harper-core/src/linting/compound_nouns/implied_ownership_compound_nouns.rs /// harper-core/src/linting/lets_confusion/mod.rs /// harper-core/src/linting/lets_confusion/no_contraction_with_verb.rs /// harper-core/src/linting/pronoun_contraction/should_contract.rs pub struct LetUsRedundancy { expr: Box, } impl Default for LetUsRedundancy { fn default() -> Self { let pattern = SequenceExpr::aco("let's").then_whitespace().then_pronoun(); Self { expr: Box::new(pattern), } } } impl ExprLinter for LetUsRedundancy { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let template = matched_tokens.span()?.get_content(source); let pronoun = matched_tokens.last()?.span.get_content_string(source); Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Repetition, suggestions: vec![ Suggestion::replace_with_match_case( format!("lets {pronoun}").chars().collect(), template, ), Suggestion::replace_with_match_case( "let's".to_string().chars().collect(), template, ), ], message: "`let's` stands for `let us`, so including another pronoun is redundant." .to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Many are not aware that the contraction `let's` is short for `let us`. As a result, many will incorrectly use it before a pronoun, such as in the phrase `let's us do`." } } ================================================ FILE: harper-core/src/linting/lets_confusion/mod.rs ================================================ mod let_us_redundancy; mod no_contraction_with_verb; use super::merge_linters::merge_linters; use let_us_redundancy::LetUsRedundancy; use no_contraction_with_verb::NoContractionWithVerb; // See also: // harper-core/src/linting/compound_nouns/implied_ownership_compound_nouns.rs // harper-core/src/linting/lets_confusion/let_us_redundancy.rs // harper-core/src/linting/lets_confusion/no_contraction_with_verb.rs // harper-core/src/linting/pronoun_contraction/should_contract.rs merge_linters!(LetsConfusion => LetUsRedundancy, NoContractionWithVerb => "It's often hard to determine where the subject should go with the word `let`. This rule attempts to find common errors with redundancy and contractions that may lead to confusion for readers."); #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::LetsConfusion; #[test] fn walking() { assert_suggestion_result( "The crutch let's him walk.", LetsConfusion::default(), "The crutch lets him walk.", ); } #[test] fn issue_426_us() { assert_suggestion_result("let's us do", LetsConfusion::default(), "lets us do"); } #[test] fn issue_426_me() { assert_suggestion_result("let's me do", LetsConfusion::default(), "lets me do"); } #[test] fn from_harper_docs() { assert_suggestion_result( "Often the longest and the shortest words are the most helpful, so lets push them first.", LetsConfusion::default(), "Often the longest and the shortest words are the most helpful, so let's push them first.", ); } #[test] #[ignore = "\"play\" is also a noun so in a context like \"Sometimes the umpire lets play continue\""] fn issue_470_missing_apostrophe_play() { assert_suggestion_result("lets play", LetsConfusion::default(), "let's play"); } #[test] #[ignore] fn issue_470_missing_subject_play() { assert_suggestion_result("let play", LetsConfusion::default(), "let's play"); } #[test] fn issue_470_missing_apostrophe_proceed() { assert_suggestion_result("lets proceed", LetsConfusion::default(), "let's proceed"); } #[test] fn issue_470_missing_subject_proceed() { assert_suggestion_result("let proceed", LetsConfusion::default(), "let's proceed"); } #[test] fn issue_548() { assert_lint_count( "A simple web app that lets you fetch random issues.", LetsConfusion::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/lets_confusion/no_contraction_with_verb.rs ================================================ use crate::TokenKind; use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::{ Token, linting::{Lint, LintKind, Suggestion}, }; use crate::linting::ExprLinter; use crate::linting::expr_linter::Chunk; /// See also: /// harper-core/src/linting/compound_nouns/implied_ownership_compound_nouns.rs /// harper-core/src/linting/lets_confusion/mod.rs /// harper-core/src/linting/lets_confusion/let_us_redundancy.rs /// harper-core/src/linting/pronoun_contraction/should_contract.rs pub struct NoContractionWithVerb { expr: Box, } impl Default for NoContractionWithVerb { fn default() -> Self { // Only tests "let". let let_ws = SequenceExpr::word_set(&["lets", "let"]).then_whitespace(); let non_ing_verb = SequenceExpr::default().then_kind_is_but_isnt_any_of( TokenKind::is_verb, &[ TokenKind::is_noun, TokenKind::is_adjective, TokenKind::is_verb_progressive_form, ] as &[_], ); // Ambiguous word is a verb determined by heuristic of following word's part of speech // Tests the next two words after "let". let verb_due_to_following_pos = SequenceExpr::default() .then_verb() .then_whitespace() .then_kind_any(&[ TokenKind::is_determiner, TokenKind::is_pronoun, TokenKind::is_conjunction, ] as &[_]); let let_then_verb = let_ws.then(LongestMatchOf::new(vec![ Box::new(non_ing_verb), Box::new(verb_due_to_following_pos), ])); Self { expr: Box::new(let_then_verb), } } } impl ExprLinter for NoContractionWithVerb { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let (let_string, verb_string) = ( matched_tokens[0].span.get_content_string(source), matched_tokens[2].span.get_content_string(source), ); // "to let go" is a phrasal verb but "lets go" is quite a common mistake for "let's go" if let_string == "let" && verb_string == "go" { return None; } let problem_span = matched_tokens.first()?.span; let template = problem_span.get_content(source); Some(Lint { span: problem_span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case_str("let's", template), Suggestion::replace_with_match_case_str("let us", template), ], message: "To suggest an action, use 'let's' or 'let us'.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Checks for `lets` meaning `permits` when the context is about suggesting an action." } } #[cfg(test)] mod tests { use super::NoContractionWithVerb; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // Correct unambiguous verb #[test] fn fix_lets_inspect() { assert_suggestion_result( "In the end lets inspect with git-blame the results.", NoContractionWithVerb::default(), "In the end let's inspect with git-blame the results.", ); } // False positives where verb is also a noun #[test] fn dont_flag_let_chance() { assert_lint_count("Let chance decide", NoContractionWithVerb::default(), 0); } #[test] fn dont_flag_let_time() { assert_lint_count( "Let time granularity be parametrized", NoContractionWithVerb::default(), 0, ); } #[test] fn dont_flag_lets_staff() { assert_lint_count( "A plugin that backs up player's inventories and lets staff restore them or export it as a shulker.", NoContractionWithVerb::default(), 0, ); } #[test] fn dont_flag_lets_time() { assert_lint_count( "This is very different than demo recording, which just simulates a network level connection and lets time move at its own rate.", NoContractionWithVerb::default(), 0, ); } #[test] fn dont_flag_lets_play() { assert_lint_count( "Sometimes the umpire lets play continue", NoContractionWithVerb::default(), 0, ); } // False positives where verb is a gerund/past participle #[test] fn dont_flag_let_sleeping() { assert_lint_count( "Let sleeping logs lie.", NoContractionWithVerb::default(), 0, ); } // False positives where verb is also an adjective #[test] fn dont_flag_let_processed() { assert_lint_count( "Let processed response be a new structure analogous to server auction response.", NoContractionWithVerb::default(), 0, ); } // Correct disambiguated noun/verb by following determiner #[test] fn corrects_lets_make_this() { assert_suggestion_result( "Lets make this joke repo into one of the best.", NoContractionWithVerb::default(), "Let's make this joke repo into one of the best.", ); } // Correct disambiguated verb by following pronoun #[test] fn corrects_lets_mock_them() { assert_suggestion_result( "Then lets mock them using Module._load based mocker.", NoContractionWithVerb::default(), "Then let's mock them using Module._load based mocker.", ); } // False positives / edge cases filed on GitHub #[test] fn dont_flag_let_us() { assert_lint_count("Let us do this.", NoContractionWithVerb::default(), 0); } #[test] fn dont_flag_let_go_1202() { assert_lint_count( "... until you hit your opponent, then let go and quickly retap", NoContractionWithVerb::default(), 0, ); } // False positive wrongly flagged by previous version of this linter #[test] fn dont_flag_let_in_and() { assert_lint_count( "Japanese is good enough to be let in and.", NoContractionWithVerb::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/likewise.rs ================================================ use crate::expr::All; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct Likewise { expr: All, } impl Default for Likewise { fn default() -> Self { let mut expr = All::default(); expr.add(SequenceExpr::aco("like").then_whitespace().t_aco("wise")); expr.add(SequenceExpr::unless( SequenceExpr::anything() .then_whitespace() .then_anything() .then_whitespace() .then_noun(), )); Self { expr } } } impl ExprLinter for Likewise { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let orig_chars = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "likewise".chars().collect(), orig_chars, )], message: format!("Did you mean the closed compound `{}`?", "likewise"), ..Default::default() }) } fn description(&self) -> &'static str { "Looks for incorrect spacing inside the closed compound `likewise`." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::Likewise; #[test] fn wise_men() { assert_suggestion_result( "Like wise men, we waited.", Likewise::default(), "Like wise men, we waited.", ); } #[test] fn like_wise() { assert_suggestion_result( "He acted, like wise, without hesitation.", Likewise::default(), "He acted, likewise, without hesitation.", ); } } ================================================ FILE: harper-core/src/linting/lint.rs ================================================ use std::hash::{DefaultHasher, Hash, Hasher}; use serde::{Deserialize, Serialize}; use crate::{Span, render_markdown::render_markdown}; use super::{LintKind, Suggestion}; /// An error found in text. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Hash)] pub struct Lint { /// The location in the source text the error lies. /// Important for automatic lint resolution through [`Self::suggestions`]. pub span: Span, /// The general category the lint belongs to. /// Mostly used for UI elements in integrations. pub lint_kind: LintKind, /// A list of zero or more suggested edits that would resolve the underlying problem. /// See [`Suggestion`]. pub suggestions: Vec, /// A message to be displayed to the user describing the specific error found. /// /// You may use the [`format`] macro to generate more complex messages. pub message: String, /// A numerical value for the importance of a lint. /// Lower = more important. pub priority: u8, } impl Lint { /// Creates a SHA-3 hash of all elements of the lint, sans [`Self::span`]. /// This is useful for comparing lints while ignoring their position within the document. /// /// Do not assume that these hash values are stable across Harper versions. pub fn spanless_hash(&self) -> u64 { let mut hasher = DefaultHasher::new(); self.lint_kind.hash(&mut hasher); self.suggestions.hash(&mut hasher); self.message.hash(&mut hasher); self.priority.hash(&mut hasher); hasher.finish() } /// Interpret the message as Markdown and render it to HTML. pub fn message_html(&self) -> String { render_markdown(&self.message) } } impl Default for Lint { fn default() -> Self { Self { span: Default::default(), lint_kind: Default::default(), suggestions: Default::default(), message: Default::default(), priority: 127, } } } ================================================ FILE: harper-core/src/linting/lint_group.rs ================================================ use std::collections::BTreeMap; use std::hash::Hash; use std::hash::{BuildHasher, Hasher}; use std::mem; use std::num::NonZero; use std::sync::Arc; use cached::proc_macro::cached; use foldhash::quality::RandomState; use hashbrown::HashMap; use lru::LruCache; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use super::a_part::APart; use super::a_while::AWhile; use super::addicting::Addicting; use super::adjective_double_degree::AdjectiveDoubleDegree; use super::adjective_of_a::AdjectiveOfA; use super::after_later::AfterLater; use super::all_hell_break_loose::AllHellBreakLoose; use super::all_intents_and_purposes::AllIntentsAndPurposes; use super::allow_to::AllowTo; use super::am_in_the_morning::AmInTheMorning; use super::amounts_for::AmountsFor; use super::an_a::AnA; use super::and_in::AndIn; use super::and_the_like::AndTheLike; use super::another_thing_coming::AnotherThingComing; use super::another_think_coming::AnotherThinkComing; use super::apart_from::ApartFrom; use super::ask_no_preposition::AskNoPreposition; use super::avoid_curses::AvoidCurses; use super::back_in_the_day::BackInTheDay; use super::be_allowed::BeAllowed; use super::be_worried::BeWorried; use super::behind_the_scenes::BehindTheScenes; use super::best_of_all_time::BestOfAllTime; use super::boring_words::BoringWords; use super::bought::Bought; use super::brand_brandish::BrandBrandish; use super::by_accident::ByAccident; use super::cant::Cant; use super::capitalize_personal_pronouns::CapitalizePersonalPronouns; use super::cautionary_tale::CautionaryTale; use super::change_tack::ChangeTack; use super::chock_full::ChockFull; use super::comma_fixes::CommaFixes; use super::compound_nouns::CompoundNouns; use super::compound_subject_i::CompoundSubjectI; use super::confident::Confident; use super::correct_number_suffix::CorrectNumberSuffix; use super::criteria_phenomena::CriteriaPhenomena; use super::cure_for::CureFor; use super::currency_placement::CurrencyPlacement; use super::damages::Damages; use super::day_and_age::DayAndAge; use super::despite_it_is::DespiteItIs; use super::despite_of::DespiteOf; use super::did_past::DidPast; use super::didnt::Didnt; use super::discourse_markers::DiscourseMarkers; use super::disjoint_prefixes::DisjointPrefixes; use super::do_mistake::DoMistake; use super::dot_initialisms::DotInitialisms; use super::double_click::DoubleClick; use super::double_modal::DoubleModal; use super::ellipsis_length::EllipsisLength; use super::else_possessive::ElsePossessive; use super::ever_every::EverEvery; use super::everyday::Everyday; use super::expand_memory_shorthands::ExpandMemoryShorthands; use super::expand_time_shorthands::ExpandTimeShorthands; use super::expr_linter::run_on_chunk; use super::far_be_it::FarBeIt; use super::fascinated_by::FascinatedBy; use super::fed_up_with::FedUpWith; use super::feel_fell::FeelFell; use super::few_units_of_time_ago::FewUnitsOfTimeAgo; use super::filler_words::FillerWords; use super::find_fine::FindFine; use super::first_aid_kit::FirstAidKit; use super::flesh_out_vs_full_fledged::FleshOutVsFullFledged; use super::for_noun::ForNoun; use super::free_predicate::FreePredicate; use super::friend_of_me::FriendOfMe; use super::go_so_far_as_to::GoSoFarAsTo; use super::go_to_war::GoToWar; use super::good_at::GoodAt; use super::handful::Handful; use super::have_pronoun::HavePronoun; use super::have_take_a_look::HaveTakeALook; use super::hedging::Hedging; use super::hello_greeting::HelloGreeting; use super::hereby::Hereby; use super::hop_hope::HopHope; use super::how_to::HowTo; use super::hyphenate_number_day::HyphenateNumberDay; use super::i_am_agreement::IAmAgreement; use super::if_wouldve::IfWouldve; use super::in_on_the_cards::InOnTheCards; use super::inflected_verb_after_to::InflectedVerbAfterTo; use super::interested_in::InterestedIn; use super::it_looks_like_that::ItLooksLikeThat; use super::its_contraction::ItsContraction; use super::its_possessive::ItsPossessive; use super::jealous_of::JealousOf; use super::johns_hopkins::JohnsHopkins; use super::lead_rise_to::LeadRiseTo; use super::left_right_hand::LeftRightHand; use super::less_worse::LessWorse; use super::let_to_do::LetToDo; use super::lets_confusion::LetsConfusion; use super::likewise::Likewise; use super::long_sentences::LongSentences; use super::look_down_ones_nose::LookDownOnesNose; use super::looking_forward_to::LookingForwardTo; use super::mass_nouns::MassNouns; use super::means_a_lot_to::MeansALotTo; use super::merge_words::MergeWords; use super::missing_preposition::MissingPreposition; use super::missing_to::MissingTo; use super::misspell::Misspell; use super::mixed_bag::MixedBag; use super::modal_be_adjective::ModalBeAdjective; use super::modal_of::ModalOf; use super::modal_seem::ModalSeem; use super::months::Months; use super::more_adjective::MoreAdjective; use super::more_better::MoreBetter; use super::most_number::MostNumber; use super::most_of_the_times::MostOfTheTimes; use super::multiple_frequency_adverbs::MultipleFrequencyAdverbs; use super::multiple_sequential_pronouns::MultipleSequentialPronouns; use super::nail_on_the_head::NailOnTheHead; use super::need_to_noun::NeedToNoun; use super::no_french_spaces::NoFrenchSpaces; use super::no_longer::NoLonger; use super::no_match_for::NoMatchFor; use super::no_oxford_comma::NoOxfordComma; use super::nobody::Nobody; use super::nominal_wants::NominalWants; use super::nor_modal_pronoun::NorModalPronoun; use super::not_only_inversion::NotOnlyInversion; use super::noun_verb_confusion::NounVerbConfusion; use super::number_suffix_capitalization::NumberSuffixCapitalization; use super::obsess_preposition::ObsessPreposition; use super::of_course::OfCourse; use super::oldest_in_the_book::OldestInTheBook; use super::on_floor::OnFloor; use super::once_or_twice::OnceOrTwice; use super::one_and_the_same::OneAndTheSame; use super::one_of_the_singular::OneOfTheSingular; use super::open_the_light::OpenTheLight; use super::orthographic_consistency::OrthographicConsistency; use super::ought_to_be::OughtToBe; use super::out_of_date::OutOfDate; use super::oxford_comma::OxfordComma; use super::oxymorons::Oxymorons; use super::phrasal_verb_as_compound_noun::PhrasalVerbAsCompoundNoun; use super::pique_interest::PiqueInterest; use super::plural_decades::PluralDecades; use super::plural_wrong_word_of_phrase::PluralWrongWordOfPhrase; use super::possessive_noun::PossessiveNoun; use super::possessive_your::PossessiveYour; use super::progressive_needs_be::ProgressiveNeedsBe; use super::pronoun_are::PronounAre; use super::pronoun_contraction::PronounContraction; use super::pronoun_inflection_be::PronounInflectionBe; use super::pronoun_knew::PronounKnew; use super::pronoun_verb_agreement::PronounVerbAgreement; use super::proper_noun_capitalization_linters; use super::quantifier_needs_of::QuantifierNeedsOf; use super::quantifier_numeral_conflict::QuantifierNumeralConflict; use super::quite_quiet::QuiteQuiet; use super::quote_spacing::QuoteSpacing; use super::reason_for_doing::ReasonForDoing; use super::redundant_acronyms::RedundantAcronyms; use super::redundant_additive_adverbs::RedundantAdditiveAdverbs; use super::redundant_progressive_comparative::RedundantProgressiveComparative; use super::regionalisms::Regionalisms; use super::regular_irregulars::RegularIrregulars; use super::repeated_words::RepeatedWords; use super::respond::Respond; use super::right_click::RightClick; use super::rise_the_ranks::RiseTheRanks; use super::roller_skated::RollerSkated; use super::safe_to_save::SafeToSave; use super::save_to_safe::SaveToSafe; use super::sentence_capitalization::SentenceCapitalization; use super::shoot_oneself_in_the_foot::ShootOneselfInTheFoot; use super::simple_past_to_past_participle::SimplePastToPastParticiple; use super::since_duration::SinceDuration; use super::single_be::SingleBe; use super::some_without_article::SomeWithoutArticle; use super::something_is::SomethingIs; use super::somewhat_something::SomewhatSomething; use super::soon_to_be::SoonToBe; use super::sought_after::SoughtAfter; use super::spaces::Spaces; use super::spell_check::SpellCheck; use super::spelled_numbers::SpelledNumbers; use super::split_words::SplitWords; use super::subject_pronoun::SubjectPronoun; use super::take_a_look_to::TakeALookTo; use super::take_medicine::TakeMedicine; use super::that_than::ThatThan; use super::that_which::ThatWhich; use super::the_how_why::TheHowWhy; use super::the_my::TheMy; use super::the_point_for::ThePointFor; use super::the_proper_noun_possessive::TheProperNounPossessive; use super::then_than::ThenThan; use super::theres::Theres; use super::theses_these::ThesesThese; use super::theyre_confusions::TheyreConfusions; use super::thing_think::ThingThink; use super::this_type_of_thing::ThisTypeOfThing; use super::though_thought::ThoughThought; use super::throw_away::ThrowAway; use super::throw_rubbish::ThrowRubbish; use super::to_adverb::ToAdverb; use super::to_two_too::ToTwoToo; use super::touristic::Touristic; use super::transposed_space::TransposedSpace; use super::try_ones_hand_at::TryOnesHandAt; use super::unclosed_quotes::UnclosedQuotes; use super::update_place_names::UpdatePlaceNames; use super::use_title_case::UseTitleCase; use super::verb_to_adjective::VerbToAdjective; use super::very_unique::VeryUnique; use super::vice_versa::ViceVersa; use super::vicious_loop::ViciousCircle; use super::vicious_loop::ViciousCircleOrCycle; use super::vicious_loop::ViciousCycle; use super::was_aloud::WasAloud; use super::way_too_adjective::WayTooAdjective; use super::well_educated::WellEducated; use super::were_where::WereWhere; use super::whereas::Whereas; use super::whom_subject_of_verb::WhomSubjectOfVerb; use super::widely_accepted::WidelyAccepted; use super::win_prize::WinPrize; use super::wish_could::WishCould; use super::wordpress_dotcom::WordPressDotcom; use super::worth_to_do::WorthToDo; use super::would_never_have::WouldNeverHave; use super::wrong_apostrophe::WrongApostrophe; use super::{ExprLinter, Lint}; use super::{HtmlDescriptionLinter, Linter}; use crate::linting::dashes::Dashes; use crate::linting::expr_linter::Chunk; use crate::linting::open_compounds::OpenCompounds; use crate::linting::{closed_compounds, initialisms, phrase_set_corrections, weir_rules}; use crate::spell::{Dictionary, MutableDictionary}; use crate::{CharString, Dialect, Document, TokenStringExt}; fn ser_ordered(map: &HashMap>, ser: S) -> Result where S: Serializer, { let ordered: BTreeMap<_, _> = map.iter().map(|(k, v)| (k.clone(), *v)).collect(); ordered.serialize(ser) } fn de_hashbrown<'de, D>(de: D) -> Result>, D::Error> where D: Deserializer<'de>, { let ordered: BTreeMap> = BTreeMap::deserialize(de)?; Ok(ordered.into_iter().collect()) } /// The configuration for a [`LintGroup`]. /// Each child linter can be enabled, disabled, or set to a curated value. #[derive(Debug, Serialize, Deserialize, Default, Clone, PartialEq, Eq)] #[serde(transparent)] pub struct LintGroupConfig { /// We do this shenanigans with the [`BTreeMap`] to keep the serialized format consistent. #[serde(serialize_with = "ser_ordered", deserialize_with = "de_hashbrown")] inner: HashMap>, } #[cached] fn curated_config() -> LintGroupConfig { // The Dictionary and Dialect do not matter, we're just after the config. let group = LintGroup::new_curated(MutableDictionary::new().into(), Dialect::American); group.config } impl LintGroupConfig { /// Check if a rule exists in the configuration. pub fn has_rule(&self, key: impl AsRef) -> bool { self.inner.contains_key(key.as_ref()) } pub fn set_rule_enabled(&mut self, key: impl ToString, val: bool) { self.inner.insert(key.to_string(), Some(val)); } /// Remove any configuration attached to a rule. /// This allows it to assume its default (curated) state. pub fn unset_rule_enabled(&mut self, key: impl AsRef) { self.inner.remove(key.as_ref()); } pub fn set_rule_enabled_if_unset(&mut self, key: impl AsRef, val: bool) { if !self.inner.contains_key(key.as_ref()) { self.set_rule_enabled(key.as_ref().to_string(), val); } } pub fn is_rule_enabled(&self, key: &str) -> bool { self.inner.get(key).cloned().flatten().unwrap_or(false) } /// Clear all config options. /// This will reset them all to disable them. pub fn clear(&mut self) { for val in self.inner.values_mut() { *val = None } } /// Merge the contents of another [`LintGroupConfig`] into this one. /// The other config will be left empty after this operation. /// /// Conflicting keys will be overridden by the value in the other group. pub fn merge_from(&mut self, other: &mut LintGroupConfig) { for (key, val) in other.inner.iter() { if val.is_none() { continue; } self.inner.insert(key.to_string(), *val); } other.clear(); } /// Fill the group with the values for the curated lint group. pub fn fill_with_curated(&mut self) { let mut temp = Self::new_curated(); mem::swap(self, &mut temp); self.merge_from(&mut temp); } pub fn new_curated() -> Self { curated_config() } } impl Hash for LintGroupConfig { fn hash(&self, hasher: &mut H) { for (key, value) in &self.inner { hasher.write(key.as_bytes()); if let Some(value) = value { hasher.write_u8(1); hasher.write_u8(*value as u8); } else { // Do it twice so we fill the same number of bytes as the other branch. hasher.write_u8(0); hasher.write_u8(0); } } } } /// A struct for collecting the output of a number of individual [Linter]s. /// Each child can be toggled via the public, mutable `Self::config` object. pub struct LintGroup { pub config: LintGroupConfig, /// We use a binary map here so the ordering is stable. linters: BTreeMap>, /// We use a binary map here so the ordering is stable. chunk_expr_linters: BTreeMap>>, /// Since [`ExprLinter`]s operate on a chunk-basis, we can store a /// mapping of `Chunk -> Lint` and only re-run the expr linters /// when a chunk changes. /// /// Since the expr linter results also depend on the config, we hash it and pass it as part /// of the key. chunk_expr_cache: LruCache<(CharString, u64), BTreeMap>>, hasher_builder: RandomState, clashing_linter_names: Option>, } impl LintGroup { // Constructor methods pub fn empty() -> Self { Self { config: LintGroupConfig::default(), linters: BTreeMap::new(), chunk_expr_linters: BTreeMap::new(), chunk_expr_cache: LruCache::new(NonZero::new(1000).unwrap()), hasher_builder: RandomState::default(), clashing_linter_names: None, } } // Non-constructor methods /// Check if the group already contains a linter with a given name. pub fn contains_key(&self, name: impl AsRef) -> bool { self.linters.contains_key(name.as_ref()) || self.chunk_expr_linters.contains_key(name.as_ref()) } /// Add a [`Linter`] to the group, returning whether the operation was successful. /// If it returns `false`, it is because a linter with that key already existed in the group. pub fn add(&mut self, name: impl AsRef, linter: impl Linter + 'static) -> bool { if self.contains_key(&name) { if self.clashing_linter_names.is_none() { self.clashing_linter_names = Some(vec![name.as_ref().to_string()]); } else if let Some(clashing_names) = &mut self.clashing_linter_names { clashing_names.push(name.as_ref().to_string()); } false } else { self.linters .insert(name.as_ref().to_string(), Box::new(linter)); true } } /// Add a chunk-based [`ExprLinter`] to the group, returning whether the operation was successful. /// If it returns `false`, it is because a linter with that key already existed in the group. /// /// This function is not significantly different from [`Self::add`], but allows us to take /// advantage of some properties of chunk-based [`ExprLinter`]s for cache optimization. pub fn add_chunk_expr_linter( &mut self, name: impl AsRef, // linter: impl ExprLinter + 'static, linter: impl ExprLinter + 'static, ) -> bool { if self.contains_key(&name) { if self.clashing_linter_names.is_none() { self.clashing_linter_names = Some(vec![name.as_ref().to_string()]); } else if let Some(clashing_names) = &mut self.clashing_linter_names { clashing_names.push(name.as_ref().to_string()); } false } else { self.chunk_expr_linters .insert(name.as_ref().to_string(), Box::new(linter) as _); true } } /// Merge the contents of another [`LintGroup`] into this one. /// The other lint group will be left empty after this operation. pub fn merge_from(&mut self, other: &mut LintGroup) { self.config.merge_from(&mut other.config); let other_linters = std::mem::take(&mut other.linters); if let Some((conflicting_key, _)) = other_linters.iter().find(|(k, _)| self.contains_key(k)) { if self.clashing_linter_names.is_none() { self.clashing_linter_names = Some(vec![conflicting_key.clone()]); } else if let Some(clashing_names) = &mut self.clashing_linter_names { clashing_names.push(conflicting_key.clone()); } } self.linters.extend(other_linters); let other_expr_linters = std::mem::take(&mut other.chunk_expr_linters); if let Some((conflicting_key, _)) = other_expr_linters .iter() .find(|(k, _)| self.contains_key(k)) { if self.clashing_linter_names.is_none() { self.clashing_linter_names = Some(vec![conflicting_key.clone()]); } else if let Some(clashing_names) = &mut self.clashing_linter_names { clashing_names.push(conflicting_key.clone()); } } self.chunk_expr_linters.extend(other_expr_linters); } pub fn iter_keys(&self) -> impl Iterator { self.linters .keys() .chain(self.chunk_expr_linters.keys()) .map(|v| v.as_str()) } /// Set all contained rules to a specific value. /// Passing `None` will unset that rule, allowing it to assume its default state. pub fn set_all_rules_to(&mut self, enabled: Option) { let keys = self.iter_keys().map(|v| v.to_string()).collect::>(); for key in keys { match enabled { Some(v) => self.config.set_rule_enabled(key, v), None => self.config.unset_rule_enabled(key), } } } /// Get map from each contained linter's name to its associated description. pub fn all_descriptions(&self) -> HashMap<&str, &str> { self.linters .iter() .map(|(key, value)| (key.as_str(), value.description())) .chain( self.chunk_expr_linters .iter() .map(|(key, value)| (key.as_str(), ExprLinter::description(value))), ) .collect() } /// Get map from each contained linter's name to its associated description, rendered to HTML. pub fn all_descriptions_html(&self) -> HashMap<&str, String> { self.linters .iter() .map(|(key, value)| (key.as_str(), value.description_html())) .chain( self.chunk_expr_linters .iter() .map(|(key, value)| (key.as_str(), value.description_html())), ) .collect() } /// Swap out [`Self::config`] with another [`LintGroupConfig`]. pub fn with_lint_config(mut self, config: LintGroupConfig) -> Self { self.config = config; self } pub fn new_curated(dictionary: Arc, dialect: Dialect) -> Self { let mut out = Self::empty(); /// Add a `Linter` to the group, setting it to be enabled or disabled. macro_rules! insert_struct_rule { ($rule:ident, $default_config:expr) => { out.add(stringify!($rule), $rule::default()); out.config .set_rule_enabled(stringify!($rule), $default_config); }; } /// Add a `Linter` that requires a `Dictionary` to the group, setting it to be enabled or disabled. macro_rules! insert_struct_rule_with_dict { ($rule:ident, $default_config:expr) => { out.add(stringify!($rule), $rule::new(dictionary.clone())); out.config .set_rule_enabled(stringify!($rule), $default_config); }; } /// Add a `Linter` that requires a `Dialect` to the group, setting it to be enabled or disabled. macro_rules! insert_struct_rule_with_dialect { ($rule:ident, $default_config:expr) => { out.add(stringify!($rule), $rule::new(dialect)); out.config .set_rule_enabled(stringify!($rule), $default_config); }; } /// Add a chunk-based `ExprLinter` to the group, setting it to be enabled or disabled. /// While you _can_ pass an `ExprLinter` to `insert_struct_rule`, using this macro instead /// will allow it to use more aggressive caching strategies. macro_rules! insert_expr_rule { ($rule:ident, $default_config:expr) => { out.add_chunk_expr_linter(stringify!($rule), $rule::default()); out.config .set_rule_enabled(stringify!($rule), $default_config); }; } /// Add a chunk-based `ExprLinter` that requires a `Dictionary` to the group, setting it to be enabled or disabled. macro_rules! insert_expr_rule_with_dict { ($rule:ident, $default_config:expr) => { out.add_chunk_expr_linter(stringify!($rule), $rule::new(dictionary.clone())); out.config .set_rule_enabled(stringify!($rule), $default_config); }; } /// Add a chunk-based `ExprLinter` that requires a `Dialect` to the group, setting it to be enabled or disabled. macro_rules! insert_expr_rule_with_dialect { ($rule:ident, $default_config:expr) => { out.add_chunk_expr_linter(stringify!($rule), $rule::new(dialect)); out.config .set_rule_enabled(stringify!($rule), $default_config); }; } out.merge_from(&mut weir_rules::lint_group()); out.merge_from(&mut phrase_set_corrections::lint_group()); out.merge_from(&mut proper_noun_capitalization_linters::lint_group( dictionary.clone(), )); out.merge_from(&mut closed_compounds::lint_group()); out.merge_from(&mut initialisms::lint_group()); // Add all the more complex rules to the group. // Please maintain alphabetical order. // On *nix you can maintain sort order with `sort -t'(' -k2` insert_expr_rule!(APart, true); insert_expr_rule!(AWhile, true); insert_expr_rule!(Addicting, true); insert_expr_rule!(AdjectiveDoubleDegree, true); insert_struct_rule!(AdjectiveOfA, true); insert_expr_rule!(AfterLater, true); insert_expr_rule!(AllHellBreakLoose, true); insert_expr_rule!(AllIntentsAndPurposes, true); insert_expr_rule!(AllowTo, true); insert_expr_rule!(AmInTheMorning, true); insert_expr_rule!(AmountsFor, true); insert_struct_rule_with_dialect!(AnA, true); insert_expr_rule!(AndIn, true); insert_expr_rule!(AndTheLike, true); insert_expr_rule!(AnotherThingComing, true); insert_expr_rule!(AnotherThinkComing, false); insert_expr_rule!(ApartFrom, true); insert_expr_rule!(AskNoPreposition, true); insert_expr_rule!(AvoidCurses, true); insert_expr_rule!(BackInTheDay, true); insert_expr_rule!(BeAllowed, true); insert_expr_rule!(BeWorried, true); insert_expr_rule!(BehindTheScenes, true); insert_struct_rule!(BestOfAllTime, true); insert_expr_rule!(BoringWords, false); insert_expr_rule!(Bought, true); insert_expr_rule!(BrandBrandish, true); insert_expr_rule!(ByAccident, true); insert_expr_rule!(Cant, true); insert_struct_rule!(CapitalizePersonalPronouns, true); insert_expr_rule!(CautionaryTale, true); insert_expr_rule!(ChangeTack, true); insert_expr_rule!(ChockFull, true); insert_struct_rule!(CommaFixes, true); insert_struct_rule!(CompoundNouns, true); insert_expr_rule!(CompoundSubjectI, true); insert_expr_rule!(Confident, true); insert_struct_rule!(CorrectNumberSuffix, true); insert_expr_rule!(CriteriaPhenomena, true); insert_expr_rule!(CureFor, true); insert_struct_rule!(CurrencyPlacement, true); insert_expr_rule!(Dashes, true); insert_expr_rule!(DayAndAge, true); insert_expr_rule!(DespiteItIs, true); insert_expr_rule!(DespiteOf, true); insert_expr_rule_with_dict!(DidPast, true); insert_expr_rule!(Didnt, true); insert_struct_rule!(DiscourseMarkers, true); insert_expr_rule_with_dict!(DisjointPrefixes, true); insert_expr_rule!(DoMistake, true); insert_expr_rule!(DotInitialisms, true); insert_expr_rule!(DoubleClick, true); insert_expr_rule!(DoubleModal, true); insert_struct_rule!(EllipsisLength, true); insert_expr_rule!(ElsePossessive, true); insert_expr_rule!(EverEvery, true); insert_expr_rule!(Everyday, true); insert_expr_rule!(ExpandMemoryShorthands, true); insert_expr_rule!(ExpandTimeShorthands, true); insert_expr_rule!(FarBeIt, true); insert_expr_rule!(FascinatedBy, true); insert_expr_rule_with_dialect!(FedUpWith, true); insert_expr_rule!(FeelFell, true); insert_expr_rule!(FewUnitsOfTimeAgo, true); insert_expr_rule!(FillerWords, true); insert_struct_rule!(FindFine, true); insert_expr_rule!(FirstAidKit, true); insert_expr_rule!(FleshOutVsFullFledged, true); insert_expr_rule!(ForNoun, true); insert_expr_rule!(FreePredicate, true); insert_expr_rule!(FriendOfMe, true); insert_expr_rule!(GoSoFarAsTo, true); insert_expr_rule!(GoToWar, true); insert_expr_rule!(GoodAt, true); insert_expr_rule!(Handful, true); insert_expr_rule!(HavePronoun, true); insert_struct_rule_with_dialect!(HaveTakeALook, true); insert_expr_rule!(Hedging, true); insert_expr_rule!(HelloGreeting, true); insert_expr_rule!(Hereby, true); insert_struct_rule!(HopHope, true); insert_expr_rule!(HowTo, true); insert_expr_rule!(HyphenateNumberDay, true); insert_expr_rule!(IAmAgreement, true); insert_expr_rule!(IfWouldve, true); insert_struct_rule_with_dialect!(InOnTheCards, true); insert_struct_rule_with_dict!(InflectedVerbAfterTo, true); insert_expr_rule!(InterestedIn, true); insert_expr_rule!(ItLooksLikeThat, true); insert_struct_rule!(ItsContraction, true); insert_expr_rule!(ItsPossessive, true); insert_expr_rule!(JealousOf, true); insert_expr_rule!(JohnsHopkins, true); insert_expr_rule!(LeadRiseTo, true); insert_expr_rule!(LeftRightHand, true); insert_expr_rule!(LessWorse, true); insert_expr_rule!(LetToDo, true); insert_struct_rule!(LetsConfusion, true); insert_expr_rule!(Likewise, true); insert_struct_rule!(LongSentences, true); insert_expr_rule!(LookDownOnesNose, true); insert_expr_rule!(LookingForwardTo, true); insert_struct_rule_with_dict!(MassNouns, true); insert_expr_rule!(MeansALotTo, true); insert_struct_rule!(MergeWords, true); insert_expr_rule!(MissingPreposition, true); insert_expr_rule!(MissingTo, true); insert_expr_rule!(Misspell, true); insert_expr_rule!(MixedBag, true); insert_expr_rule!(ModalBeAdjective, true); insert_expr_rule!(ModalOf, true); insert_expr_rule!(ModalSeem, true); insert_expr_rule!(Months, true); insert_expr_rule_with_dict!(MoreAdjective, true); insert_expr_rule!(MoreBetter, true); insert_expr_rule!(MostNumber, true); insert_expr_rule!(MostOfTheTimes, true); insert_expr_rule!(MultipleSequentialPronouns, true); insert_expr_rule!(NailOnTheHead, true); insert_expr_rule!(NeedToNoun, true); insert_struct_rule!(NoFrenchSpaces, true); insert_expr_rule!(NoLonger, true); insert_expr_rule!(NoMatchFor, true); insert_struct_rule!(NoOxfordComma, false); insert_expr_rule!(Nobody, true); insert_expr_rule!(NominalWants, true); insert_expr_rule!(NorModalPronoun, true); insert_expr_rule!(NotOnlyInversion, true); insert_struct_rule!(NounVerbConfusion, true); insert_struct_rule!(NumberSuffixCapitalization, true); insert_expr_rule!(ObsessPreposition, true); insert_expr_rule!(OfCourse, true); insert_expr_rule!(OldestInTheBook, true); insert_expr_rule!(OnFloor, true); insert_expr_rule!(OnceOrTwice, true); insert_expr_rule!(OneAndTheSame, true); insert_expr_rule_with_dict!(OneOfTheSingular, true); insert_expr_rule!(OpenCompounds, true); insert_expr_rule!(OpenTheLight, true); insert_expr_rule!(OrthographicConsistency, true); insert_expr_rule!(OughtToBe, true); insert_expr_rule!(OutOfDate, true); insert_struct_rule!(OxfordComma, true); insert_expr_rule!(Oxymorons, true); insert_struct_rule!(PhrasalVerbAsCompoundNoun, true); insert_expr_rule!(PiqueInterest, true); insert_expr_rule!(PluralWrongWordOfPhrase, true); insert_struct_rule_with_dict!(PossessiveNoun, false); insert_expr_rule!(PossessiveYour, true); insert_expr_rule!(ProgressiveNeedsBe, true); insert_expr_rule!(PronounAre, true); insert_struct_rule!(PronounContraction, true); insert_expr_rule!(PronounInflectionBe, true); insert_expr_rule!(PronounKnew, true); insert_expr_rule_with_dict!(PronounVerbAgreement, true); insert_expr_rule!(QuantifierNeedsOf, true); insert_expr_rule!(QuantifierNumeralConflict, true); insert_expr_rule!(QuiteQuiet, true); insert_struct_rule!(QuoteSpacing, true); insert_expr_rule!(ReasonForDoing, true); insert_expr_rule!(RedundantAcronyms, true); insert_expr_rule!(RedundantAdditiveAdverbs, true); insert_expr_rule!(RedundantProgressiveComparative, true); insert_struct_rule_with_dialect!(Regionalisms, true); insert_expr_rule_with_dict!(RegularIrregulars, true); insert_struct_rule!(RepeatedWords, true); insert_expr_rule!(Respond, true); insert_expr_rule!(RightClick, true); insert_expr_rule!(RiseTheRanks, true); insert_expr_rule!(RollerSkated, true); insert_expr_rule!(SafeToSave, true); insert_expr_rule!(SaveToSafe, true); insert_struct_rule_with_dict!(SentenceCapitalization, true); insert_expr_rule!(ShootOneselfInTheFoot, true); insert_expr_rule!(SimplePastToPastParticiple, true); insert_expr_rule!(SinceDuration, true); insert_expr_rule!(SingleBe, true); insert_expr_rule!(SomeWithoutArticle, true); insert_expr_rule!(SomethingIs, true); insert_expr_rule!(SomewhatSomething, true); insert_expr_rule!(SoonToBe, true); insert_expr_rule!(SoughtAfter, true); insert_struct_rule!(Spaces, true); insert_struct_rule!(SpelledNumbers, false); insert_expr_rule!(SplitWords, true); insert_struct_rule!(SubjectPronoun, true); insert_expr_rule!(TakeALookTo, true); insert_expr_rule!(TakeMedicine, true); insert_expr_rule!(ThatThan, true); insert_expr_rule!(ThatWhich, true); insert_expr_rule!(TheHowWhy, true); insert_expr_rule!(TheMy, true); insert_expr_rule!(ThePointFor, true); insert_expr_rule!(TheProperNounPossessive, true); insert_expr_rule!(ThenThan, true); insert_expr_rule!(Theres, true); insert_expr_rule!(ThesesThese, true); insert_struct_rule!(TheyreConfusions, true); insert_expr_rule!(ThingThink, true); insert_expr_rule!(ThisTypeOfThing, true); insert_expr_rule!(ThoughThought, true); insert_expr_rule!(ThrowAway, true); insert_struct_rule!(ThrowRubbish, true); insert_expr_rule!(ToAdverb, true); insert_struct_rule!(ToTwoToo, true); insert_expr_rule!(Touristic, true); insert_expr_rule_with_dict!(TransposedSpace, true); insert_expr_rule!(TryOnesHandAt, true); insert_struct_rule!(UnclosedQuotes, true); insert_expr_rule!(UpdatePlaceNames, true); insert_struct_rule_with_dict!(UseTitleCase, true); insert_expr_rule!(VerbToAdjective, true); insert_expr_rule!(VeryUnique, true); insert_expr_rule!(ViceVersa, true); insert_expr_rule!(ViciousCircle, true); insert_expr_rule!(ViciousCircleOrCycle, false); insert_expr_rule!(ViciousCycle, false); insert_expr_rule!(WasAloud, true); insert_expr_rule!(WayTooAdjective, true); insert_expr_rule!(WellEducated, true); insert_expr_rule!(WereWhere, true); insert_expr_rule!(Whereas, true); insert_expr_rule!(WhomSubjectOfVerb, true); insert_expr_rule!(WidelyAccepted, true); insert_expr_rule!(WinPrize, true); insert_expr_rule!(WishCould, true); insert_struct_rule!(WordPressDotcom, true); insert_expr_rule_with_dict!(WorthToDo, true); insert_expr_rule!(WouldNeverHave, true); insert_expr_rule!(WrongApostrophe, true); // Uses Sentence rather than Chunk out.add("Damages", Damages::default()); out.config.set_rule_enabled("Damages", true); // Uses Sentence rather than Chunk out.add( "MultipleFrequencyAdverbs", MultipleFrequencyAdverbs::default(), ); out.config .set_rule_enabled("MultipleFrequencyAdverbs", true); // Uses Sentence rather than Chunk out.add("PluralDecades", PluralDecades::default()); out.config.set_rule_enabled("PluralDecades", true); // Uses Dictionary and Dialect out.add("SpellCheck", SpellCheck::new(dictionary.clone(), dialect)); out.config.set_rule_enabled("SpellCheck", true); out } /// Create a new curated group with all config values cleared out. pub fn new_curated_empty_config( dictionary: Arc, dialect: Dialect, ) -> Self { let mut group = Self::new_curated(dictionary, dialect); group.config.clear(); group } pub fn organized_lints(&mut self, document: &Document) -> BTreeMap> { let mut results = BTreeMap::new(); // Normal linters for (key, linter) in &mut self.linters { if self.config.is_rule_enabled(key) { results.insert(key.clone(), linter.lint(document)); } } // Expr linters for chunk in document.iter_chunks() { let Some(chunk_span) = chunk.span() else { continue; }; let chunk_chars = document.get_span_content(&chunk_span); let config_hash = self.hasher_builder.hash_one(&self.config); let cache_key = (chunk_chars.into(), config_hash); let mut chunk_results = if let Some(hit) = self.chunk_expr_cache.get(&cache_key) { hit.clone() } else { let mut pattern_lints = BTreeMap::new(); for (key, linter) in &mut self.chunk_expr_linters { if self.config.is_rule_enabled(key) { let lints = run_on_chunk(linter, chunk, document.get_source()).map(|mut l| { l.span.pull_by(chunk_span.start); l }); pattern_lints.insert(key.clone(), lints.collect()); } } self.chunk_expr_cache.put(cache_key, pattern_lints.clone()); pattern_lints }; // Bring the spans back into document-space for value in chunk_results.values_mut() { for lint in value { lint.span.push_by(chunk_span.start); } } for (key, mut vec) in chunk_results { results.entry(key).or_default().append(&mut vec); } } results } } impl Default for LintGroup { fn default() -> Self { Self::empty() } } impl Linter for LintGroup { fn lint(&mut self, document: &Document) -> Vec { self.organized_lints(document) .into_values() .flatten() .collect() } fn description(&self) -> &str { "A collection of linters that can be run as one." } } #[cfg(test)] mod tests { use std::sync::Arc; use super::{LintGroup, LintGroupConfig}; use crate::linting::LintKind; use crate::linting::tests::assert_no_lints; use crate::spell::{FstDictionary, MutableDictionary}; use crate::{Dialect, Document, linting::Linter}; fn test_group() -> LintGroup { LintGroup::new_curated(Arc::new(MutableDictionary::curated()), Dialect::American) } #[test] fn clean_interjection() { assert_no_lints( "Although I only saw the need to interject once, I still saw it.", test_group(), ); } #[test] fn clean_consensus() { assert_no_lints("But there is less consensus on this.", test_group()); } #[test] fn can_get_all_descriptions() { let group = LintGroup::new_curated(Arc::new(MutableDictionary::default()), Dialect::American); group.all_descriptions(); } #[test] fn can_get_all_descriptions_as_html() { let group = LintGroup::new_curated(Arc::new(MutableDictionary::default()), Dialect::American); group.all_descriptions_html(); } #[test] fn dont_flag_low_hanging_fruit_msg() { assert_no_lints( "The standard form is low-hanging fruit with a hyphen and singular form.", test_group(), ); } #[test] fn dont_flag_low_hanging_fruit_desc() { assert_no_lints( "Corrects nonstandard variants of low-hanging fruit.", test_group(), ); } /// Tests that no linters' descriptions contain errors handled by other linters. /// /// This test verifies that the description of each linter (which is written in natural language) /// doesn't trigger any other linter's rules, with the exception of certain linters that /// suggest mere alternatives rather than flagging actual errors. /// /// For example, we disable the "MoreAdjective" linter since some comparative and superlative /// adjectives can be more awkward than their two-word counterparts, even if technically correct. /// /// If this test fails, it means either: /// 1. A linter's description contains an actual error that should be fixed, or /// 2. A linter is being too aggressive in flagging text that is actually correct English /// in the context of another linter's description. #[test] fn lint_descriptions_are_clean() { let lints_to_check = LintGroup::new_curated(FstDictionary::curated(), Dialect::American); let enforcer_config = LintGroupConfig::new_curated(); let mut lints_to_enforce = LintGroup::new_curated(FstDictionary::curated(), Dialect::American) .with_lint_config(enforcer_config); let name_description_pairs: Vec<_> = lints_to_check .all_descriptions() .into_iter() .map(|(n, d)| (n.to_string(), d.to_string())) .collect(); for (lint_name, description) in name_description_pairs { let doc = Document::new_markdown_default_curated(&description); eprintln!("{lint_name}: {description}"); let mut lints = lints_to_enforce.lint(&doc); // Remove ones related to style lints.retain(|l| l.lint_kind != LintKind::Style); if !lints.is_empty() { dbg!(lints); panic!(); } } } #[test] fn no_linter_names_clash() { let group = LintGroup::new_curated(Arc::new(MutableDictionary::default()), Dialect::American); if let Some(names) = &group.clashing_linter_names { if !names.is_empty() { panic!( "⚠️ Found {} clashing linter names: {}", names.len(), names.join(", ") ); } } } } ================================================ FILE: harper-core/src/linting/lint_kind.rs ================================================ use std::fmt::Display; use is_macro::Is; use serde::{Deserialize, Serialize}; /// The general category a [`Lint`](super::Lint) falls into. /// There's no reason not to add a new item here if you are adding a new rule that doesn't fit /// the existing categories. #[derive(Debug, Clone, Copy, Serialize, Deserialize, Is, Default, Hash, PartialEq, Eq)] pub enum LintKind { Agreement, /// For errors where words are joined or split at the wrong boundaries /// (e.g., "each and everyone" vs. "each and every one") BoundaryError, Capitalization, /// For cases where a word or phrase is misused for a similar-sounding word or phrase, /// where the incorrect version makes logical sense (e.g., 'egg corn' for 'acorn', /// 'on mass' for 'en masse'). Eggcorn, /// For suggesting improvements that enhance clarity or impact without fixing errors Enhancement, Formatting, Grammar, /// For cases where a word is mistakenly used for a similar-sounding word with a different meaning /// (e.g., 'eluded to' instead of 'alluded to'). Unlike eggcorns, these don't create new meanings. Malapropism, /// For any other lint that doesn't fit neatly into the other categories #[default] Miscellaneous, Nonstandard, /// For issues with punctuation, including hyphenation in compound adjectives /// (e.g., "face first" vs. "face-first" when used before a noun) Punctuation, Readability, /// For cases where words duplicate meaning that's already expressed /// (e.g., "basic fundamentals" → "fundamentals", "free gift" → "gift") Redundancy, /// For variations that are standard in some regions or dialects but not others Regionalism, Repetition, /// When your brain doesn't know the right spelling. /// This should only be used by linters doing spellcheck on individual words. Spelling, /// For cases where multiple options are correct but one is preferred for style or clarity, /// such as expanding abbreviations in formal writing (e.g., 'min' → 'minimum') Style, /// When your brain knows the right spelling but your fingers made a mistake. /// (e.g., 'can be seem' → 'can be seen') Typo, /// For conventional word usage and standard collocations /// (e.g., 'by accident' vs. 'on accident' in standard English) Usage, /// For choosing between different words or phrases in a given context WordChoice, } impl LintKind { /// The inverse of [`Self::to_string_key`] pub fn from_string_key(s: &str) -> Option { match s { "Agreement" => Some(LintKind::Agreement), "BoundaryError" => Some(LintKind::BoundaryError), "Capitalization" => Some(LintKind::Capitalization), "Eggcorn" => Some(LintKind::Eggcorn), "Enhancement" => Some(LintKind::Enhancement), "Formatting" => Some(LintKind::Formatting), "Grammar" => Some(LintKind::Grammar), "Malapropism" => Some(LintKind::Malapropism), "Miscellaneous" => Some(LintKind::Miscellaneous), "Nonstandard" => Some(LintKind::Nonstandard), "Punctuation" => Some(LintKind::Punctuation), "Readability" => Some(LintKind::Readability), "Redundancy" => Some(LintKind::Redundancy), "Regionalism" => Some(LintKind::Regionalism), "Repetition" => Some(LintKind::Repetition), "Spelling" => Some(LintKind::Spelling), "Style" => Some(LintKind::Style), "Typo" => Some(LintKind::Typo), "Usage" => Some(LintKind::Usage), "WordChoice" => Some(LintKind::WordChoice), _ => None, } } /// Produce a string representation, which can be used as keys in a map or CSS variables. pub fn to_string_key(&self) -> String { match self { LintKind::Agreement => "Agreement", LintKind::BoundaryError => "BoundaryError", LintKind::Capitalization => "Capitalization", LintKind::Eggcorn => "Eggcorn", LintKind::Enhancement => "Enhancement", LintKind::Formatting => "Formatting", LintKind::Grammar => "Grammar", LintKind::Malapropism => "Malapropism", LintKind::Miscellaneous => "Miscellaneous", LintKind::Nonstandard => "Nonstandard", LintKind::Punctuation => "Punctuation", LintKind::Readability => "Readability", LintKind::Redundancy => "Redundancy", LintKind::Regionalism => "Regionalism", LintKind::Repetition => "Repetition", LintKind::Spelling => "Spelling", LintKind::Style => "Style", LintKind::Typo => "Typo", LintKind::Usage => "Usage", LintKind::WordChoice => "WordChoice", } .to_owned() } } impl Display for LintKind { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let s = match self { LintKind::Agreement => "Agreement", LintKind::BoundaryError => "BoundaryError", LintKind::Capitalization => "Capitalization", LintKind::Eggcorn => "Eggcorn", LintKind::Enhancement => "Enhancement", LintKind::Formatting => "Formatting", LintKind::Grammar => "Grammar", LintKind::Malapropism => "Malapropism", LintKind::Miscellaneous => "Miscellaneous", LintKind::Nonstandard => "Nonstandard", LintKind::Punctuation => "Punctuation", LintKind::Readability => "Readability", LintKind::Redundancy => "Redundancy", LintKind::Regionalism => "Regionalism", LintKind::Repetition => "Repetition", LintKind::Spelling => "Spelling", LintKind::Style => "Style", LintKind::Typo => "Typo", LintKind::Usage => "Usage", LintKind::WordChoice => "Word Choice", }; write!(f, "{s}") } } ================================================ FILE: harper-core/src/linting/long_sentences.rs ================================================ use super::{Lint, LintKind, Linter}; use crate::TokenStringExt; use crate::{Document, Span}; /// Detect and warn that the sentence is too long. #[derive(Debug, Clone, Copy, Default)] pub struct LongSentences; impl Linter for LongSentences { fn lint(&mut self, document: &Document) -> Vec { let mut output = Vec::new(); for sentence in document.iter_sentences() { let word_count = sentence.iter_words().count(); if word_count > 40 { output.push(Lint { span: Span::new( sentence.first_word().unwrap().span.start, sentence.last().unwrap().span.end, ), lint_kind: LintKind::Readability, message: format!("This sentence is {word_count} words long."), ..Default::default() }) } } output } fn description(&self) -> &'static str { "This rule looks for run-on sentences, which can make your work harder to grok." } } ================================================ FILE: harper-core/src/linting/look_down_ones_nose.rs ================================================ use crate::{ Lint, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct LookDownOnesNose { expr: SequenceExpr, } impl Default for LookDownOnesNose { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["look", "looked", "looking", "looks"]) .t_ws() .then_possessive_determiner() .t_ws() .then_word_set(&["nose", "noses"]) .t_ws() .t_aco("down"), } } } impl ExprLinter for LookDownOnesNose { type Unit = Chunk; fn description(&self) -> &str { "Corrects `look one's nose down` to `look down one's nose`" } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let (looktok, prontok, nosetok) = (toks.first()?, toks.get(2)?, toks.get(4)?); let (lookspan, pronspan, nosespan) = (looktok.span, prontok.span, nosetok.span); let (lookstr, pronstr, nosestr) = ( lookspan.get_content_string(src), pronspan.get_content_string(src), nosespan.get_content_string(src), ); Some(Lint { lint_kind: LintKind::Usage, span: toks.span()?, suggestions: vec![Suggestion::replace_with_match_case( format!("{lookstr} down {pronstr} {nosestr}") .chars() .collect(), toks.span()?.get_content(src), )], message: "The correct idiom is `look down one's nose`.".to_string(), ..Default::default() }) } fn expr(&self) -> &dyn Expr { &self.expr } } #[cfg(test)] mod tests { use super::LookDownOnesNose; use crate::linting::tests::assert_suggestion_result; #[test] fn look_his_nose() { assert_suggestion_result( "He seemed to look his nose down upon everything", LookDownOnesNose::default(), "He seemed to look down his nose upon everything", ); } #[test] fn look_my_nose() { assert_suggestion_result( "I'm the last one to look my nose down at what people do from a moral perspective.", LookDownOnesNose::default(), "I'm the last one to look down my nose at what people do from a moral perspective.", ); } #[test] fn look_their_nose() { assert_suggestion_result( "I hate how humans look their nose down on certain animals", LookDownOnesNose::default(), "I hate how humans look down their nose on certain animals", ); } #[test] fn look_their_noses() { assert_suggestion_result( "Yet many look their noses down at the right as if it were a used Kleenex.", LookDownOnesNose::default(), "Yet many look down their noses at the right as if it were a used Kleenex.", ); } #[test] fn look_your_nose() { assert_suggestion_result( "You look your nose down on me like I am only a breathing object", LookDownOnesNose::default(), "You look down your nose on me like I am only a breathing object", ); } #[test] fn looking_her_nose() { assert_suggestion_result( "The long nose definitely helps give the feel of her looking her nose down on others", LookDownOnesNose::default(), "The long nose definitely helps give the feel of her looking down her nose on others", ); } #[test] fn looking_his_nose() { assert_suggestion_result( "literally looking his nose down at the commoners", LookDownOnesNose::default(), "literally looking down his nose at the commoners", ); } #[test] fn looking_their_noses() { assert_suggestion_result( "It makes no sense that the princesses are looking their noses down on her", LookDownOnesNose::default(), "It makes no sense that the princesses are looking down their noses on her", ); } #[test] fn looking_your_nose() { assert_suggestion_result( "Whatever you do, don’t fall into the trap of looking your nose down at the customer.", LookDownOnesNose::default(), "Whatever you do, don’t fall into the trap of looking down your nose at the customer.", ); } #[test] fn looks_her_nose() { assert_suggestion_result( "Daenerys looks her nose down at them.", LookDownOnesNose::default(), "Daenerys looks down her nose at them.", ); } #[test] fn looks_his_nose() { assert_suggestion_result( "He probably looks his nose down on Wraith, who don't eat inbred humans.", LookDownOnesNose::default(), "He probably looks down his nose on Wraith, who don't eat inbred humans.", ); } #[test] fn looks_their_nose() { assert_suggestion_result( "Your friend looks their nose down at them and wants to unfriend them based on how little money they have.", LookDownOnesNose::default(), "Your friend looks down their nose at them and wants to unfriend them based on how little money they have.", ); } } ================================================ FILE: harper-core/src/linting/looking_forward_to.rs ================================================ use hashbrown::HashSet; use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, FixedPhrase, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct LookingForwardTo { expr: SequenceExpr, } impl Default for LookingForwardTo { fn default() -> Self { let looking_forward_to = FixedPhrase::from_phrase("looking forward to"); let pattern = SequenceExpr::with(looking_forward_to) .t_ws() // TODO: update the use the verb with progressive tense function later .then_verb(); Self { expr: pattern } } } impl ExprLinter for LookingForwardTo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], src: &[char]) -> Option { let span = matched_tokens.last()?.span; let verb = matched_tokens.last()?.span.get_content_string(src); if verb.ends_with("ing") { return None; } // TODO: create a util function to handle the appending of -ing // to verbs, taking into account exceptions and irregular forms. let exception_word: HashSet<&str> = [ // Verbs ending in -ee "see", "flee", "agree", "knee", "guarantee", // Verbs ending in -oe "hoe", "toe", // Verbs ending in -ye or to avoid confusion "dye", "eye", // Irregular/spelling clarification "singe", "tinge", ] .iter() .cloned() .collect(); let gerund_form: String = if verb.to_lowercase().ends_with('e') && !exception_word.contains(verb.as_str()) { verb.trim_end_matches('e').to_string() + "ing" } else { format!("{verb}ing") }; println!("gerund_form: -{gerund_form}- -- verb: -{verb}-"); Some(Lint { span, lint_kind: LintKind::WordChoice, message: format!( "The verb `{verb}` must be in the gerund form (verb + -ing) after 'looking forward to'.", ), suggestions: vec![Suggestion::replace_with_match_case( gerund_form.chars().collect(), span.get_content(src), )], ..Default::default() }) } fn description(&self) -> &'static str { "This rule identifies instances where the phrase `looking forward to` is followed by a base form verb instead of the required gerund (verb + `-ing` form)." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::LookingForwardTo; #[test] fn not_lint_with_correct_verb() { assert_suggestion_result( "She was looking forward to see the grandchildren again.", LookingForwardTo::default(), "She was looking forward to seeing the grandchildren again.", ); // assert_lint_count( // "She was looking forward to seeing the grandchildren again.", // LookingForwardTo::default(), // 0, // ); } #[test] fn lint_with_incorrect_verb() { assert_suggestion_result( "She was looking forward to see the grandchildren again.", LookingForwardTo::default(), "She was looking forward to seeing the grandchildren again.", ); } #[test] fn lint_with_incorrect_verb_ending_in_e() { assert_suggestion_result( "She was looking forward to make the grandchildren happy.", LookingForwardTo::default(), "She was looking forward to making the grandchildren happy.", ); } #[test] fn not_lint_with_non_verb() { assert_lint_count( "She was looking forward to the grandchildren's visit.", LookingForwardTo::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/map_phrase_linter.rs ================================================ use super::{ExprLinter, Lint, LintKind}; use crate::expr::Expr; use crate::expr::FixedPhrase; use crate::expr::LongestMatchOf; use crate::expr::SimilarToPhrase; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::weir::weir_expr_to_expr; use crate::{Token, TokenStringExt}; pub struct MapPhraseLinter { description: String, expr: Box, correct_forms: Vec, message: String, lint_kind: LintKind, } impl MapPhraseLinter { pub fn new( expr: Box, correct_forms: impl IntoIterator, message: impl ToString, description: impl ToString, lint_kind: Option, ) -> Self { Self { description: description.to_string(), expr, correct_forms: correct_forms.into_iter().map(|f| f.to_string()).collect(), message: message.to_string(), lint_kind: lint_kind.unwrap_or(LintKind::Miscellaneous), } } pub fn new_similar_to_phrase(phrase: &'static str, detectable_distance: u8) -> Self { Self::new( Box::new(SimilarToPhrase::from_phrase(phrase, detectable_distance)), [phrase], format!("Did you mean the phrase `{phrase}`?"), format!("Looks for slight improper modifications to the phrase `{phrase}`."), None, ) } pub fn new_fixed_phrases( phrase: impl IntoIterator>, correct_forms: impl IntoIterator, message: impl ToString, description: impl ToString, lint_kind: Option, ) -> Self { let patterns = LongestMatchOf::new( phrase .into_iter() .map(|p| { let expr: Box = Box::new(weir_expr_to_expr(p.as_ref()).unwrap()); expr }) .collect(), ); Self::new( Box::new(patterns), correct_forms, message, description, lint_kind, ) } pub fn new_fixed_phrase( phrase: impl AsRef, correct_forms: impl IntoIterator, message: impl ToString, description: impl ToString, lint_kind: Option, ) -> Self { Self::new( Box::new(FixedPhrase::from_phrase(phrase.as_ref())), correct_forms, message, description, lint_kind, ) } pub fn new_closed_compound(phrase: impl AsRef, correct_form: impl ToString) -> Self { let message = format!( "Did you mean the closed compound `{}`?", correct_form.to_string() ); let description = format!( "Looks for incorrect spacing inside the closed compound `{}`.", correct_form.to_string() ); Self::new_fixed_phrase( phrase, [correct_form], message, description, Some(LintKind::Miscellaneous), ) } } impl ExprLinter for MapPhraseLinter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let matched_text = span.get_content(source); Some(Lint { span, lint_kind: self.lint_kind, suggestions: self .correct_forms .iter() .map(|correct_form| { Suggestion::replace_with_match_case( correct_form.chars().collect(), matched_text, ) }) .collect(), message: self.message.to_string(), priority: 31, }) } fn description(&self) -> &str { self.description.as_str() } } ================================================ FILE: harper-core/src/linting/map_phrase_set_linter.rs ================================================ use super::{ExprLinter, Lint, LintKind}; use crate::CharStringExt; use crate::expr::Expr; use crate::expr::FixedPhrase; use crate::expr::LongestMatchOf; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::{Token, TokenStringExt}; pub struct MapPhraseSetLinter<'a> { description: String, expr: LongestMatchOf, wrong_forms_to_correct_forms: &'a [(&'a str, &'a str)], multi_wrong_forms_to_multi_correct_forms: &'a [(&'a [&'a str], &'a [&'a str])], message: String, lint_kind: LintKind, } impl<'a> MapPhraseSetLinter<'a> { pub fn one_to_one( wrong_forms_to_correct_forms: &'a [(&'a str, &'a str)], message: impl ToString, description: impl ToString, lint_kind: Option, ) -> Self { let expr = LongestMatchOf::new( wrong_forms_to_correct_forms .iter() .map(|(wrong_form, _correct_form)| { let expr: Box = Box::new(FixedPhrase::from_phrase(wrong_form)); expr }) .collect(), ); Self { description: description.to_string(), expr, wrong_forms_to_correct_forms, multi_wrong_forms_to_multi_correct_forms: &[], message: message.to_string(), lint_kind: lint_kind.unwrap_or(LintKind::Miscellaneous), } } pub fn many_to_many( multi_wrong_forms_to_multi_correct_forms: &'a [(&'a [&'a str], &'a [&'a str])], message: impl ToString, description: impl ToString, lint_kind: Option, ) -> Self { let mut lmo = LongestMatchOf::new(Vec::new()); for (wrong_forms, _correct_forms) in multi_wrong_forms_to_multi_correct_forms { for wrong_form in wrong_forms.iter() { lmo.add(FixedPhrase::from_phrase(wrong_form)); } } let expr = lmo; Self { description: description.to_string(), expr, wrong_forms_to_correct_forms: &[], multi_wrong_forms_to_multi_correct_forms, message: message.to_string(), lint_kind: lint_kind.unwrap_or(LintKind::Miscellaneous), } } } impl<'a> ExprLinter for MapPhraseSetLinter<'a> { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let matched_text = span.get_content(source); let mut suggestions: Vec<_> = self .wrong_forms_to_correct_forms .iter() .filter(|(wrong_form, _)| matched_text.eq_ignore_ascii_case_str(wrong_form)) .map(|(_, correct_form)| { Suggestion::replace_with_match_case(correct_form.chars().collect(), matched_text) }) .collect(); let many_to_many_suggestions: Vec<_> = self .multi_wrong_forms_to_multi_correct_forms .iter() .flat_map(|(wrong_forms, correct_forms)| { wrong_forms .iter() .filter(move |&&wrong_form| matched_text.eq_ignore_ascii_case_str(wrong_form)) .flat_map(move |_| { correct_forms.iter().map(move |correct_form| { Suggestion::replace_with_match_case( correct_form.chars().collect(), matched_text, ) }) }) }) .collect(); suggestions.extend(many_to_many_suggestions); if suggestions.is_empty() { return None; } Some(Lint { span, lint_kind: self.lint_kind, suggestions, message: self.message.to_string(), priority: 31, }) } fn description(&self) -> &str { self.description.as_str() } } ================================================ FILE: harper-core/src/linting/mass_nouns/mass_plurals.rs ================================================ use hashbrown::HashSet; use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenStringExt, expr::{All, Expr, FirstMatchOf, FixedPhrase, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, spell::Dictionary, }; pub struct MassPlurals { expr: Box, dict: D, } impl MassPlurals where D: Dictionary, { pub fn new(dict: D) -> Self { let oov = SequenceExpr::default().then_oov(); let looks_plural = SequenceExpr::with(|tok: &Token, src: &[char]| { tok.span .get_content(src) .ends_with_ignore_ascii_case_chars(&['s']) }); let oov_looks_plural = All::new(vec![Box::new(oov), Box::new(looks_plural)]); let phrases = FirstMatchOf::new(vec![ Box::new(FixedPhrase::from_phrase("real estates")), Box::new(FixedPhrase::from_phrase("source codes")), Box::new(FixedPhrase::from_phrase("wear and tears")), ]); Self { expr: Box::new(FirstMatchOf::new(vec![ Box::new(oov_looks_plural), Box::new(phrases), ])), dict, } } fn is_mass_noun_in_dictionary(&self, chars: &[char]) -> bool { self.dict .get_word_metadata(chars) .is_some_and(|wmd| wmd.is_mass_noun_only()) } fn is_mass_noun_in_dictionary_str(&self, s: &str) -> bool { self.dict .get_word_metadata_str(s) .is_some_and(|wmd| wmd.is_mass_noun_only()) } } impl ExprLinter for MassPlurals where D: Dictionary, { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let invalid_plural_toks = toks; let mut valid_singulars: HashSet> = HashSet::new(); if invalid_plural_toks.len() != 1 { // Multiple tokens means we matched a fixed phrase let phrase = invalid_plural_toks.span()?.get_content(src); valid_singulars.insert(phrase[..phrase.len() - 1].into()); } else { let invalid_plural_tok = &invalid_plural_toks[0]; // Not a fixed phrase, so it's a single word that's not in the dictionary and ends with -s let mut remaining_chars = invalid_plural_tok.span.get_content(src); // -s if remaining_chars.ends_with(&['s']) { remaining_chars = &remaining_chars[..remaining_chars.len() - 1]; if self.is_mass_noun_in_dictionary(remaining_chars) { valid_singulars.insert(remaining_chars.into()); } // -es if remaining_chars.ends_with(&['e']) { remaining_chars = &remaining_chars[..remaining_chars.len() - 1]; if self.is_mass_noun_in_dictionary(remaining_chars) { valid_singulars.insert(remaining_chars.into()); } // -ies -> -y if remaining_chars.ends_with(&['i']) { remaining_chars = &remaining_chars[..remaining_chars.len() - 1]; let y_singular = format!("{}y", remaining_chars.to_string()); if self.is_mass_noun_in_dictionary_str(&y_singular) { let y_singular_chars: Box<[char]> = y_singular.chars().collect::>().into_boxed_slice(); valid_singulars.insert(y_singular_chars.clone()); } } } } } if valid_singulars.is_empty() { return None; } let message = format!( "The {} `{}` is a mass noun and should not be pluralized.", if invalid_plural_toks.len() == 1 { "word" } else { "term" }, valid_singulars .iter() .map(|s| s.to_string()) .collect::>() .join("`, `") ); let span = invalid_plural_toks.span()?; let suggestions: Vec = valid_singulars .iter() .map(|sing| { Suggestion::replace_with_match_case(sing.clone().into(), span.get_content(src)) }) .collect(); Some(Lint { span, lint_kind: LintKind::Grammar, suggestions, message, ..Default::default() }) } fn description(&self) -> &'static str { "Looks for plural forms of mass nouns that have no plural." } } #[cfg(test)] mod tests { use crate::{ linting::tests::{assert_lint_count, assert_suggestion_result}, spell::FstDictionary, }; use super::MassPlurals; #[test] fn flag_advicess() { assert_lint_count( "You gave me bad advices.", MassPlurals::new(FstDictionary::curated()), 1, ); } #[test] fn flag_source_codes_and_softwares() { assert_lint_count( "Do we have the source codes for these softwares?", MassPlurals::new(FstDictionary::curated()), 2, ); } #[test] fn flag_noun_ending_in_ies() { assert_lint_count( "Celibacies are better than sex.", MassPlurals::new(FstDictionary::curated()), 1, ); } #[test] fn flag_real_estates() { assert_lint_count( "Instead of giving any of her many luxury real estates or multi-million dollar fortune ...", MassPlurals::new(FstDictionary::curated()), 1, ); } #[test] fn flag_wear_and_tears() { assert_lint_count( "Transit costs were high in terms of time, finances, and vehicle wear and tears, which posed significant obstacles to international commerce", MassPlurals::new(FstDictionary::curated()), 1, ); } #[test] fn fix_wear_and_tears() { assert_suggestion_result( "Transit costs were high in terms of time, finances, and vehicle wear and tears, which posed significant obstacles to international commerce", MassPlurals::new(FstDictionary::curated()), "Transit costs were high in terms of time, finances, and vehicle wear and tear, which posed significant obstacles to international commerce", ); } } ================================================ FILE: harper-core/src/linting/mass_nouns/mod.rs ================================================ mod mass_plurals; mod noun_countability; use mass_plurals::MassPlurals; use noun_countability::NounCountability; use crate::{ Document, linting::{Lint, Linter}, remove_overlaps, spell::Dictionary, }; pub struct MassNouns { mass_plurals: MassPlurals, noun_countability: NounCountability, } impl MassNouns where D: Dictionary + Clone, { pub fn new(dict: D) -> Self { Self { mass_plurals: MassPlurals::new(dict.clone()), noun_countability: NounCountability::default(), } } } impl Linter for MassNouns where D: Dictionary, { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); lints.extend(self.mass_plurals.lint(document)); lints.extend(self.noun_countability.lint(document)); remove_overlaps(&mut lints); lints } fn description(&self) -> &'static str { "Detects mass nouns used as countable nouns." } } #[cfg(test)] mod tests { use crate::{ linting::tests::{assert_lint_count, assert_suggestion_result}, spell::FstDictionary, }; use super::MassNouns; #[test] fn flag_advices_and_an_advice() { assert_lint_count( "I asked for an advice and he gave me two advices!", MassNouns::new(FstDictionary::curated()), 2, ); } #[test] fn correct_a_luggage() { assert_suggestion_result( "I managed to pack all my clothing into one luggage.", MassNouns::new(FstDictionary::curated()), "I managed to pack all my clothing into one suitcase.", ); } #[test] fn correct_clothings() { assert_suggestion_result( "I managed to pack all my clothings into one suitcase.", MassNouns::new(FstDictionary::curated()), "I managed to pack all my clothing into one suitcase.", ); } } ================================================ FILE: harper-core/src/linting/mass_nouns/noun_countability.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Span, Token, TokenStringExt, expr::{Expr, LongestMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{IndefiniteArticle, WordSet}, }; #[derive(Debug, Clone, Copy)] pub enum Correction { // Drop the determiner or quantifier DropDQ, // Replace the determiner or quantifier with a string ReplaceDQWith(&'static str), // Insert a string between the determiner or quantifier and the mass noun InsertBetween(&'static str), // Replace the mass noun with a string ReplaceNounWith(&'static str), } use Correction::*; pub struct NounCountability { expr: Box, } impl Default for NounCountability { fn default() -> Self { let quantifier = WordSet::new(&[ "another", "both", "each", "every", "few", "fewer", "many", "multiple", "one", "several", ]); // A determiner or quantifier followed by a mass noun let detquant_mass = Lrc::new( SequenceExpr::any_of(vec![ Box::new(IndefiniteArticle::default()), Box::new(quantifier), ]) .then_whitespace() .then_mass_noun_only(), ); let detauant_mass_then_hyphen = Lrc::new(SequenceExpr::with(detquant_mass.clone()).then_hyphen()); let detquant_mass_following_context = Lrc::new( SequenceExpr::with(detquant_mass.clone()) .then_whitespace() // If we don't get the word, this won't be the longest match .then_any_word(), ); Self { expr: Box::new(LongestMatchOf::new(vec![ Box::new(detquant_mass), Box::new(detauant_mass_then_hyphen), Box::new(detquant_mass_following_context), ])), } } } impl ExprLinter for NounCountability { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let toks_chars = toks.span()?.get_content(src); // 4 tokens means the phrase was followed by a hyphen if toks.len() == 4 { return None; } // 3 tokens means the phrase was at the end of a chunk/sentence. // 5 tokens means the phrase was in the middle of a chunk/sentence. // If it's in the middle then we check if the next word token is a noun or OOV. // Since the last token of our phrase is the mass noun, this would make it part of a compound noun. if toks.len() == 5 && (toks.last()?.kind.is_noun() || toks.last()?.kind.is_oov()) { return None; } // the determiner or quantifier let dq = toks[0].span.get_content_string(src).to_lowercase(); // the mass noun let noun = toks[2].span.get_content_string(src).to_lowercase(); let synonym_corrections: &'static [Correction] = match (noun.as_str(), dq.as_str()) { ("advice", "a" | "an" | "another" | "each" | "every" | "one") => &[ ReplaceNounWith("tip"), ReplaceNounWith("suggestion"), ReplaceNounWith("recommendation"), ], ("advice", "both" | "many" | "multiple" | "several") => &[ ReplaceNounWith("tips"), ReplaceNounWith("suggestions"), ReplaceNounWith("recommendations"), ], ("clothing", "a" | "an" | "another" | "each" | "every" | "one") => { &[ReplaceNounWith("garment")] } ("clothing", "both" | "many" | "multiple" | "several") => { &[ReplaceNounWith("garments")] } ("luggage", "a" | "an" | "another" | "each" | "every" | "one") => { &[ReplaceNounWith("suitcase"), ReplaceNounWith("bag")] } ("luggage", "both" | "many" | "multiple" | "several") => { &[ReplaceNounWith("suitcases"), ReplaceNounWith("bags")] } ("punctuation", "a" | "an" | "another" | "each" | "every" | "one") => { &[ReplaceNounWith("punctuation mark")] } ("punctuation", "both" | "many" | "multiple" | "several") => { &[ReplaceNounWith("punctuation marks")] } ("software", "a") => &[ ReplaceNounWith("program"), ReplaceNounWith("software package"), ReplaceNounWith("software tool"), ], ("software", "an" | "another" | "each" | "every" | "one") => &[ ReplaceNounWith("app"), ReplaceNounWith("application"), ReplaceNounWith("program"), ReplaceNounWith("software package"), ReplaceNounWith("software tool"), ], ("software", "both" | "many" | "multiple" | "several") => &[ ReplaceNounWith("apps"), ReplaceNounWith("applications"), ReplaceNounWith("programs"), ReplaceNounWith("software packages"), ReplaceNounWith("software tools"), ], _ => &[], }; let no_piece = matches!(noun.as_str(), "punctuation" | "traffic"); let basic_corrections: &'static [Correction] = match (dq.as_str(), no_piece) { ("a" | "an", true) => &[DropDQ, ReplaceDQWith("some")], ("a" | "an", false) => &[DropDQ, ReplaceDQWith("some"), ReplaceDQWith("a piece of")], ("another" | "each" | "every" | "one", true) => &[], ("another" | "each" | "every" | "one", false) => &[InsertBetween("piece of")], ("both" | "multiple" | "several", true) => &[], ("both" | "multiple" | "several", false) => &[InsertBetween("pieces of")], ("few", true) => &[ReplaceDQWith("little")], ("few", false) => &[ReplaceDQWith("little"), InsertBetween("pieces of")], ("fewer", true) => &[ReplaceDQWith("less")], ("fewer", false) => &[ReplaceDQWith("less"), InsertBetween("pieces of")], ("many", true) => &[ReplaceDQWith("much"), ReplaceDQWith("a lot of")], ("many", false) => &[ ReplaceDQWith("much"), ReplaceDQWith("a lot of"), InsertBetween("pieces of"), ], _ => &[], }; let mut suggestions = Vec::new(); for correction in synonym_corrections { let parts = match correction { ReplaceNounWith(w) => &[&dq, *w], _ => return None, }; suggestions.push(Suggestion::replace_with_match_case( parts.join(" ").chars().collect(), toks_chars, )); } suggestions.extend(basic_corrections.iter().map(|correction| { let parts: &[&str] = match correction { DropDQ => &[&noun], ReplaceDQWith(w) => &[w, &noun], InsertBetween(w) => &[&dq, w, &noun], ReplaceNounWith(w) => &[&dq, w], }; Suggestion::replace_with_match_case(parts.join(" ").chars().collect(), toks_chars) })); Some(Lint { span: Span::new(toks[0].span.start, toks[2].span.end), lint_kind: LintKind::Agreement, suggestions, message: format!("`{noun}` is a mass noun."), priority: 31, }) } fn description(&self) -> &'static str { "Correct mass nouns that are preceded by the wrong determiners or quantifiers." } } #[cfg(test)] mod tests { use super::NounCountability; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_a() { assert_suggestion_result( "If the unit turns out to be noisy, can I expect a firmware with phase ...", NounCountability::default(), "If the unit turns out to be noisy, can I expect some firmware with phase ...", ); } #[test] #[ignore = "replace_with_match_case matches by index, not by lower vs title vs upper"] fn corrects_a_title_case() { assert_suggestion_result( "Simple POC of a Ransomware.", NounCountability::default(), "Simple POC of a piece of Ransomware.", ); } #[test] fn corrects_an() { assert_suggestion_result( "The PlaySEM platform provides an infrastructure for playing and rendering sensory effects in multimedia applications.", NounCountability::default(), "The PlaySEM platform provides infrastructure for playing and rendering sensory effects in multimedia applications.", ); } #[test] #[ignore = "replace_with_match_case matches by index, not by lower vs title vs upper"] fn corrects_an_title_case() { assert_suggestion_result( "An Infrastructure for Integrated EDA.", NounCountability::default(), "Infrastructure for Integrated EDA.", ); } #[test] fn corrects_another() { assert_suggestion_result( "Another ransomware made by me for fun.", NounCountability::default(), "Another piece of ransomware made by me for fun.", ); } #[test] fn corrects_both() { assert_suggestion_result( "Make a terminal show both information of your CPU and GPU!", NounCountability::default(), "Make a terminal show both pieces of information of your CPU and GPU!", ); } #[test] // "piece of traffic" sounds very weird fn can_correct_each_with_traffic() { assert_suggestion_result( "Beside each traffic there is also a pedestrian traffic light.", NounCountability::default(), "Beside each traffic there is also a pedestrian traffic light.", ); } #[test] fn corrects_every() { assert_suggestion_result( "Capacitor plugin to get access to every info about the device software and hardware.", NounCountability::default(), "Capacitor plugin to get access to every piece of info about the device software and hardware.", ); } #[test] fn corrects_few() { assert_suggestion_result( "Displays a few information to help you rotating through your spells.", NounCountability::default(), "Displays a few pieces of information to help you rotating through your spells.", ); } #[test] fn corrects_many() { assert_suggestion_result( "It shows clearly how many information about objects you can get with old search ...", NounCountability::default(), "It shows clearly how much information about objects you can get with old search ...", ); } #[test] fn corrects_one() { assert_suggestion_result( "For example, it only makes sense to compare global protein q-value filtering in one software with that in another.", NounCountability::default(), "For example, it only makes sense to compare global protein q-value filtering in one application with that in another.", ); } #[test] #[ignore = "'in' = noun because conflated with 'IN' (Indiana)"] fn corrects_several() { assert_suggestion_result( "The program takes in input a single XML file and outputs several info in different files.", NounCountability::default(), "The program takes in input a single XML file and outputs several pieces of info in different files.", ); } #[test] fn dont_correct_many_compound() { assert_lint_count( "Additionally, many software development platforms also provide access to a community of developers.", NounCountability::default(), 0, ); } #[test] #[ignore] fn dont_correct_first_do_correct_second() { assert_suggestion_result( "A advice description is required for each advice.", NounCountability::default(), "A advice description is required for each piece of advice.", ); } #[test] fn corrects_an_advice() { assert_suggestion_result( "Origin will not always provide the right method when an advice is applied to a bridged method.", NounCountability::default(), "Origin will not always provide the right method when an tip is applied to a bridged method.", ); } #[test] fn corrects_one_advice() { assert_suggestion_result( "Is it possible to use more than one advice on the same method?", NounCountability::default(), "Is it possible to use more than one tip on the same method?", ); } #[test] fn corrects_every_advice() { assert_suggestion_result( "Ideally every advice would have a unique identifier.", NounCountability::default(), "Ideally every tip would have a unique identifier.", ); } #[test] fn corrects_a_advice() { assert_suggestion_result( "Hello! I need a advice.", NounCountability::default(), "Hello! I need a tip.", ); } #[test] fn corrects_a_software() { assert_suggestion_result( "HGroup-DIA, a software for analyzing multiple DIA data files.", NounCountability::default(), "HGroup-DIA, a software package for analyzing multiple DIA data files.", ); } #[test] fn corrects_a_luggage() { assert_suggestion_result( "A luggage with a little engine, sensors (gps, ultrasounds, etc...) and bluetooth connection that will follow you everywhere.", NounCountability::default(), "A suitcase with a little engine, sensors (gps, ultrasounds, etc...) and bluetooth connection that will follow you everywhere.", ); } #[test] fn corrects_multiple_advice() { assert_suggestion_result( "Update Advice API doc for event and data params, multiple advice.", NounCountability::default(), "Update Advice API doc for event and data params, multiple suggestions.", ); } #[test] fn corrects_every_software() { assert_suggestion_result( "Rewrite every software known to man in Rust.", NounCountability::default(), "Rewrite every application known to man in Rust.", ); } #[test] fn corrects_each_furniture() { assert_suggestion_result( "the position (x, y) and size (height, width, length) of each furniture", NounCountability::default(), "the position (x, y) and size (height, width, length) of each piece of furniture", ); } #[test] fn corrects_one_clothing() { assert_suggestion_result( "Each list element represents one clothing based on weather conditions.", NounCountability::default(), "Each list element represents one garment based on weather conditions.", ); } #[test] fn dont_flag_compound_nouns() { assert_lint_count( "Fill in the blanks following the creation of each Furniture class instance.", NounCountability::default(), 0, ); assert_lint_count( "This project is a clothing shop that let users buy and pay for they purchases.", NounCountability::default(), 0, ); assert_lint_count( "Yet another software router.", NounCountability::default(), 0, ); assert_lint_count( "Calculate a rate for every software component.", NounCountability::default(), 0, ); } #[test] fn corrects_fewer() { assert_suggestion_result( "Why do my packages have fewer information?", NounCountability::default(), "Why do my packages have less information?", ); } #[test] fn dont_flag_fewer_in_compound_noun() { assert_lint_count( "Additionally, less traffic leads to fewer traffic jams, resulting in a more fluent, thus more efficient, trip.", NounCountability::default(), 0, ); } #[test] fn dont_flag_mass_noun_part_of_hyphenated_compound() { assert_lint_count( "Internally, we have a hardware-in-the-loop Jenkins test suite that builds and unit tests the various processes.", NounCountability::default(), 0, ); } #[test] fn corrects_punctuation() { assert_suggestion_result( "Not in this form because it currently works with one punctuation with one letter either side.", NounCountability::default(), "Not in this form because it currently works with one punctuation mark with one letter either side.", ); } } ================================================ FILE: harper-core/src/linting/means_a_lot_to.rs ================================================ use crate::{ Lint, Token, TokenStringExt, expr::{Expr, FixedPhrase, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::WordSet, }; pub struct MeansALotTo { expr: SequenceExpr, } impl Default for MeansALotTo { fn default() -> Self { Self { expr: SequenceExpr::default() // Note that "meaning a lot to" is not used. .t_set(&["mean", "means", "meant"]) .t_ws() .then_any_of(vec![ Box::new(FixedPhrase::from_phrase("a lot")), Box::new(WordSet::new(&["alot", "lot"])), ]) .t_ws() .t_aco("for"), } } } impl ExprLinter for MeansALotTo { type Unit = Chunk; fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if ![5, 7].contains(&toks.len()) { return None; } let (span, sug, msg) = match toks.len() { 5 => ( toks[2..5].span()?, "a lot to", "In this phrase the correct spelling is `a lot` and the correct preposition is `to`.", ), 7 => ( toks.last()?.span, "to", "The correct preposition in this phrase is `to`.", ), _ => return None, }; Some(Lint { span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( sug.chars().collect(), span.get_content(src), )], message: msg.to_string(), ..Default::default() }) } fn expr(&self) -> &dyn Expr { &self.expr } fn description(&self) -> &str { "Corrects wrong variants of `means a lot for [someone]` to `means a lot to [someone]`." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::MeansALotTo; #[test] fn fix_mean_a_lot_for() { assert_suggestion_result( "It would mean a lot for me and save me a lot of time and effort", MeansALotTo::default(), "It would mean a lot to me and save me a lot of time and effort", ); } #[test] fn fix_mean_alot_for() { assert_suggestion_result( "Appreciate it! Would mean alot for me!", MeansALotTo::default(), "Appreciate it! Would mean a lot to me!", ); } #[test] fn fix_mean_lot_for() { assert_suggestion_result( "It would be very grateful to achieve number of sponsors for me and it mean lot for me.", MeansALotTo::default(), "It would be very grateful to achieve number of sponsors for me and it mean a lot to me.", ); } #[test] fn fix_means_a_lot_for() { assert_suggestion_result( "Your star means a lot for us to develop this project!", MeansALotTo::default(), "Your star means a lot to us to develop this project!", ); } #[test] fn fix_means_alot_for() { assert_suggestion_result( "Even a single sponsor means alot for me.", MeansALotTo::default(), "Even a single sponsor means a lot to me.", ); } #[test] fn fix_means_lot_for() { assert_suggestion_result( "Any help means lot for me.", MeansALotTo::default(), "Any help means a lot to me.", ); } #[test] fn fix_meant_a_lot_for() { assert_suggestion_result( "It meant a lot for me to improve this library further.", MeansALotTo::default(), "It meant a lot to me to improve this library further.", ); } #[test] fn fix_meant_alot_for() { assert_suggestion_result( "Thanks a lot by the way. this meant alot for me.", MeansALotTo::default(), "Thanks a lot by the way. this meant a lot to me.", ); } } ================================================ FILE: harper-core/src/linting/merge_linters.rs ================================================ macro_rules! merge_linters { ($name:ident => $($linter:ident),* => $desc:expr) => { pub use merge_rule_hidden::$name; mod merge_rule_hidden { use paste::paste; use crate::{Document, linting::{Lint, Linter}, remove_overlaps}; $( use super::$linter; )* paste! { #[derive(Default)] pub struct $name { $( [< $linter:snake >]: $linter, )* } impl Linter for $name { fn lint(&mut self, document: &Document) -> Vec{ let mut lints = Vec::new(); $( lints.extend(self.[< $linter:snake >].lint(document)); )* remove_overlaps(&mut lints); lints } fn description(&self) -> &'static str { $desc } } } } }; } pub(crate) use merge_linters; ================================================ FILE: harper-core/src/linting/merge_words.rs ================================================ use std::sync::Arc; use itertools::Itertools; use super::{Lint, LintKind, Linter, Suggestion}; use crate::spell::{Dictionary, FstDictionary}; use crate::{CharString, Document, Span}; pub struct MergeWords { dict: Arc, } impl MergeWords { pub fn new() -> Self { Self { dict: FstDictionary::curated(), } } } impl Default for MergeWords { fn default() -> Self { Self::new() } } impl Linter for MergeWords { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); let mut merged_word = CharString::new(); for (a, w, b) in document.tokens().tuple_windows() { if !a.kind.is_word() || !w.kind.is_whitespace() || !b.kind.is_word() { continue; } let a_chars = document.get_span_content(&a.span); let b_chars = document.get_span_content(&b.span); if (a_chars.len() == 1 && a_chars[0].is_uppercase()) || (b_chars.len() == 1 && b_chars[0].is_uppercase()) { continue; } // Not super helpful in this case, so we skip it if matches!(a_chars, ['a']) || matches!(b_chars, ['a']) { continue; } merged_word.clear(); merged_word.extend_from_slice(a_chars); merged_word.extend_from_slice(b_chars); if self.dict.contains_word(&merged_word) && (!self.dict.contains_word(a_chars) || !self.dict.contains_word(b_chars)) { lints.push(Lint { span: Span::new(a.span.start, b.span.end), lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(merged_word.to_vec())], message: "It seems these words would go better together.".to_owned(), priority: 63, }); } merged_word.clear(); merged_word.extend_from_slice(a_chars); merged_word.push('\''); merged_word.extend_from_slice(b_chars); if self.dict.contains_word(&merged_word) && (!self.dict.contains_word(a_chars) || !self.dict.contains_word(b_chars)) { lints.push(Lint { span: Span::new(a.span.start, b.span.end), lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(merged_word.to_vec())], message: "It seems you intended to make this a contraction.".to_owned(), priority: 63, }); } } lints } fn description(&self) -> &str { "Accidentally inserting a space inside a word is common. This rule looks for valid words that are split by whitespace." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::MergeWords; #[test] fn clean() { assert_lint_count( "When referring to the political party, make sure to treat them as a proper noun.", MergeWords::default(), 0, ); } #[test] fn heretofore() { assert_lint_count( "This is a her etofore unseen problem.", MergeWords::default(), 1, ); } #[test] fn therefore() { assert_lint_count("The refore", MergeWords::default(), 1); } #[test] fn that_is_contraction() { assert_suggestion_result("That s", MergeWords::default(), "That's"); } #[test] fn allows_issue_722() { assert_lint_count("Leaving S and K alone.", MergeWords::default(), 0); assert_lint_count("Similarly an S with a line.", MergeWords::default(), 0); } } ================================================ FILE: harper-core/src/linting/missing_preposition.rs ================================================ use harper_brill::UPOS; use crate::expr::AnchorStart; use crate::expr::Expr; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::patterns::AnyPattern; use crate::patterns::UPOSSet; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind}; use crate::linting::expr_linter::Chunk; pub struct MissingPreposition { expr: SequenceExpr, } impl Default for MissingPreposition { fn default() -> Self { let expr = SequenceExpr::with( AnchorStart.or_longest( SequenceExpr::default() .then_non_quantifier_determiner() .t_ws(), ), ) .then(UPOSSet::new(&[UPOS::NOUN, UPOS::PRON, UPOS::PROPN])) .t_ws() .then(UPOSSet::new(&[UPOS::AUX])) .t_ws() .then(UPOSSet::new(&[UPOS::ADJ])) .t_ws() .then(UPOSSet::new(&[UPOS::NOUN, UPOS::PRON, UPOS::PROPN])) .then_optional(AnyPattern) .then_optional(AnyPattern); Self { expr } } } impl ExprLinter for MissingPreposition { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { if matched_tokens.last()?.kind.is_upos(UPOS::ADP) { return None; } Some({ Lint { span: matched_tokens[2..4].span()?, lint_kind: LintKind::Miscellaneous, suggestions: vec![], message: "You may be missing a preposition here.".to_owned(), priority: 31, } }) } fn description(&self) -> &'static str { "Locates potentially missing prepositions." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints}; use super::MissingPreposition; #[test] fn fixes_issue_1513() { assert_lint_count( "The city is famous its beaches.", MissingPreposition::default(), 1, ); assert_lint_count( "The students are interested learning.", MissingPreposition::default(), 1, ); } #[test] fn allows_corrected_issue_1513() { assert_no_lints( "The city is famous for its beaches.", MissingPreposition::default(), ); assert_no_lints( "The students are interested in learning.", MissingPreposition::default(), ); } #[test] fn no_lint_without_adj_noun_sequence() { assert_lint_count("She is happy.", MissingPreposition::default(), 0); } #[test] fn no_lint_with_preposition_present() { assert_lint_count("They are fond of music.", MissingPreposition::default(), 0); assert_lint_count( "Students are interested in history.", MissingPreposition::default(), 0, ); } #[test] fn flag_adj_pron_pair() { assert_lint_count("He was angry him.", MissingPreposition::default(), 1); } #[test] fn no_lint_empty() { assert_lint_count("", MissingPreposition::default(), 0); } #[test] fn allows_tired_herself() { assert_no_lints( "She had tired herself out with trying.", MissingPreposition::default(), ); } #[test] fn allows_terrible_stuff() { assert_no_lints( "Either it was terrible stuff or the whiskey distorted things.", MissingPreposition::default(), ); } #[test] fn allows_issue_1585() { assert_no_lints( "Each agent has specific tools and tasks orchestrated through a crew workflow.", MissingPreposition::default(), ); } } ================================================ FILE: harper-core/src/linting/missing_space.rs ================================================ use itertools::Itertools; use crate::{Document, Punctuation}; use super::{Lint, LintKind, Linter, Suggestion}; pub struct MissingSpace; impl Linter for MissingSpace { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for (a, b, c) in document.tokens().tuple_windows() { if let Some(punct) = b.kind.as_punctuation() && [ Punctuation::Period, Punctuation::Bang, Punctuation::Question, Punctuation::Semicolon, ] .contains(punct) && a.kind.is_word() && c.kind.is_word() { lints.push(Lint { span: b.span, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::InsertAfter(vec![' '])], message: "It looks like you're missing a space here.".to_owned(), priority: 31, }); } } lints } fn description(&self) -> &str { "Looks for missing spaces after a comma or period." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::MissingSpace; #[test] fn issue_2191() { assert_suggestion_result( "people that can help us.So I feel like there", MissingSpace, "people that can help us. So I feel like there", ); } #[test] fn coffee_table() { assert_suggestion_result( "The coffee cooled on the table.The room stayed quiet.", MissingSpace, "The coffee cooled on the table. The room stayed quiet.", ); } #[test] fn open_window() { assert_suggestion_result( "A small breeze moved through the open window.The curtains lifted and fell in slow waves.", MissingSpace, "A small breeze moved through the open window. The curtains lifted and fell in slow waves.", ); } #[test] fn hallway_cat() { assert_suggestion_result( "The cat watched the hallway.Its tail twitched with steady focus.", MissingSpace, "The cat watched the hallway. Its tail twitched with steady focus.", ); } #[test] fn rain_glass() { assert_suggestion_result( "Rain tapped against the glass.The sound made the afternoon feel longer.", MissingSpace, "Rain tapped against the glass. The sound made the afternoon feel longer.", ); } #[test] fn cyclist_house() { assert_suggestion_result( "A cyclist passed by the house.The wheels hummed softly on the road.", MissingSpace, "A cyclist passed by the house. The wheels hummed softly on the road.", ); } #[test] fn kettle_stove() { assert_suggestion_result( "The kettle hissed on the stove.A thin ribbon of steam curled toward the ceiling.", MissingSpace, "The kettle hissed on the stove. A thin ribbon of steam curled toward the ceiling.", ); } #[test] fn sparrow_fence() { assert_suggestion_result( "A sparrow landed on the fence.Its wings fluttered once before it settled.", MissingSpace, "A sparrow landed on the fence. Its wings fluttered once before it settled.", ); } #[test] fn streetlamp_dusk() { assert_suggestion_result( "The streetlamp flickered at dusk.A pale glow spread across the sidewalk.", MissingSpace, "The streetlamp flickered at dusk. A pale glow spread across the sidewalk.", ); } #[test] fn distant_laughter() { assert_suggestion_result( "Someone laughed in the distance.The echo drifted between the buildings.", MissingSpace, "Someone laughed in the distance. The echo drifted between the buildings.", ); } #[test] fn notebook_desk() { assert_suggestion_result( "A notebook lay open on the desk.Its blank pages waited for a pen.", MissingSpace, "A notebook lay open on the desk. Its blank pages waited for a pen.", ); } #[test] fn question_mark_mid_sentence() { assert_suggestion_result( "Where are you?I looked around the room.", MissingSpace, "Where are you? I looked around the room.", ); } #[test] fn question_mark_before_name() { assert_suggestion_result( "Are you coming?Elijah is already waiting.", MissingSpace, "Are you coming? Elijah is already waiting.", ); } #[test] fn exclamation_mid_sentence() { assert_suggestion_result( "The door slammed shut!Everyone in the hall jumped.", MissingSpace, "The door slammed shut! Everyone in the hall jumped.", ); } #[test] fn exclamation_before_clause() { assert_suggestion_result( "You actually solved it!That changes everything.", MissingSpace, "You actually solved it! That changes everything.", ); } #[test] fn semicolon_before_adverb() { assert_suggestion_result( "He wanted to leave;however, he stayed until the end.", MissingSpace, "He wanted to leave; however, he stayed until the end.", ); } #[test] fn semicolon_connecting_clauses() { assert_suggestion_result( "The night was cold;stars glittered above the dark field.", MissingSpace, "The night was cold; stars glittered above the dark field.", ); } } ================================================ FILE: harper-core/src/linting/missing_to.rs ================================================ use harper_brill::UPOS; use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct MissingTo { map: ExprMap, } impl MissingTo { fn strict_controller_words() -> WordSet { WordSet::new(&[ "eager", "fail", "failed", "failing", "fails", "incline", "inclined", "inclines", "inclining", "manage", "managed", "manages", "managing", "ready", ]) } fn permissive_controller_words() -> WordSet { WordSet::new(&[ "aim", "aimed", "aiming", "aims", "agree", "agreed", "agreeing", "agrees", "arrange", "arranged", "arranges", "arranging", "aspire", "aspired", "aspires", "aspiring", "attempt", "attempted", "attempting", "attempts", "decide", "decided", "decides", "deciding", "endeavor", "endeavored", "endeavoring", "endeavors", "endeavour", "endeavoured", "endeavouring", "endeavours", "eager", "expect", "expected", "expecting", "expects", "forget", "forgot", "forgotten", "forgetting", "forgets", "hope", "hoped", "hopes", "hoping", "intend", "intended", "intending", "intends", "learn", "learned", "learning", "learns", "learnt", "long", "longed", "longing", "longs", "mean", "means", "meant", "need", "needed", "needing", "needs", "neglect", "neglected", "neglecting", "neglects", "prepare", "prepared", "prepares", "preparing", "refuse", "refused", "refuses", "refusing", "resolve", "resolved", "resolves", "resolving", "struggle", "struggled", "struggles", "struggling", "try", "tried", "trying", "tries", "want", "wanted", "wanting", "wants", ]) } fn previous_word_with_span(source: &[char], start: usize) -> Option<(String, usize)> { let mut cursor = start; while cursor > 0 && source[cursor - 1].is_whitespace() { cursor -= 1; } if cursor == 0 { return None; } let end = cursor; while cursor > 0 { let ch = source[cursor - 1]; if ch.is_alphabetic() || ch == '\'' { cursor -= 1; } else { break; } } if cursor == end { return None; } Some(( source[cursor..end] .iter() .collect::() .to_ascii_lowercase(), cursor, )) } fn previous_word(source: &[char], start: usize) -> Option { Self::previous_word_with_span(source, start).map(|(word, _)| word) } fn previous_non_whitespace_char(source: &[char], start: usize) -> Option { let mut cursor = start; while cursor > 0 { cursor -= 1; let ch = source[cursor]; if !ch.is_whitespace() { return Some(ch); } } None } fn next_non_whitespace_char(source: &[char], start: usize) -> Option { let mut cursor = start; while cursor < source.len() { let ch = source[cursor]; if !ch.is_whitespace() { return Some(ch); } cursor += 1; } None } fn determiner_within_three(source: &[char], controller_span_start: usize) -> bool { let mut determiner_scan_cursor = controller_span_start; for _ in 0..3 { let Some((word, start)) = Self::previous_word_with_span(source, determiner_scan_cursor) else { break; }; let word = word.as_str(); if matches!(word, "and" | "or" | "but") { determiner_scan_cursor = start; continue; } if matches!( word, "a" | "an" | "the" | "this" | "that" | "these" | "those" ) { return true; } determiner_scan_cursor = start; } false } } impl Default for MissingTo { fn default() -> Self { let mut map = ExprMap::default(); let strict_pattern = SequenceExpr::with(Self::strict_controller_words()) .t_ws() .then_kind_where(|kind| kind.is_upos(UPOS::VERB)); map.insert(strict_pattern, 0); let permissive_pattern = SequenceExpr::with(Self::permissive_controller_words()) .t_ws() .then_kind_where(|kind| kind.is_verb_lemma()); map.insert(permissive_pattern, 0); Self { map } } } impl ExprLinter for MissingTo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.map } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_idx = *self.map.lookup(0, matched_tokens, source)?; let controller = &matched_tokens[offending_idx]; let span = controller.span; let controller_text = controller.span.get_content_string(source).to_lowercase(); let controller_text = controller_text.as_str(); let is_adjective_controller = matches!(controller_text, "eager" | "inclined" | "ready"); if controller.kind.is_upos(UPOS::ADJ) && !is_adjective_controller { return None; } if !controller.kind.is_upos(UPOS::VERB) && !is_adjective_controller { return None; } let previous_word_info = Self::previous_word_with_span(source, span.start); let previous_word = previous_word_info.as_ref().map(|(word, _)| word.as_str()); if matches!( previous_word, Some("a" | "an" | "the" | "this" | "that" | "these" | "those") | Some("very" | "so" | "too" | "quite" | "rather") ) { return None; } let controller_text_ends_with_d_or_en = controller_text.ends_with('d') || controller_text.ends_with("en"); if previous_word == Some("of") && controller_text_ends_with_d_or_en { return None; } if previous_word.is_some_and(|word| word.ends_with("ly")) && controller_text_ends_with_d_or_en { return None; } if controller_text.starts_with("hope") && previous_word == Some("of") { return None; } if controller_text == "needs" && previous_word == Some("must") { return None; } let prev_non_whitespace_char = Self::previous_non_whitespace_char(source, span.start); if controller_text == "prepare" && matches!(prev_non_whitespace_char, None | Some('.' | '!' | '?')) { return None; } let next_token = matched_tokens .iter() .skip(offending_idx + 1) .find(|tok| !tok.kind.is_whitespace())?; let next_text = next_token.span.get_content_string(source).to_lowercase(); if controller_text.starts_with("try") && next_text == "and" { return None; } if next_text.ends_with("ing") { return None; } // Ugly workaround since `Option::flatten` doesn't work with `Option<&Option<...>>`. let next_upos = next_token .kind .as_word() .and_then(Option::as_ref) .and_then(|word| word.pos_tag); let next_is_verb = next_upos == Some(UPOS::VERB); let next_is_noun = matches!(next_upos, Some(UPOS::NOUN | UPOS::PROPN | UPOS::ADJ)); let determiner_within_three = Self::determiner_within_three(source, span.start); if next_token.kind.is_np_member() && !next_is_verb && (previous_word == Some("to") || determiner_within_three) { return None; } if !next_is_verb && matches!( next_upos, Some(UPOS::ADV | UPOS::ADJ | UPOS::ADP | UPOS::SCONJ | UPOS::CCONJ) ) { return None; } let next_is_noun_but_not_verb = next_is_noun && !next_is_verb; if matches!( controller_text, "learn" | "learned" | "learning" | "learns" | "learnt" | "mean" | "means" | "meant" ) && next_is_noun_but_not_verb { return None; } if matches!(controller_text, "hope" | "hoped" | "hopes" | "hoping") && (next_is_noun_but_not_verb || next_upos == Some(UPOS::AUX)) { return None; } let next_non_whitespace_char = Self::next_non_whitespace_char(source, next_token.span.end); if matches!(controller_text, "need" | "needed" | "needing" | "needs") && (next_is_noun_but_not_verb || next_text == "help" || next_non_whitespace_char == Some('-')) { return None; } if next_upos == Some(UPOS::PROPN) && matches!( prev_non_whitespace_char, Some('"' | '\'' | '”' | '’' | '!' | '?' | ',') ) { return None; } Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::InsertAfter(" to".chars().collect())], message: "Insert `to` to complete the infinitive (e.g., `need to talk`).".to_string(), priority: 62, }) } fn description(&self) -> &str { "Flags verbs and adjectives like `need`, `want`, or `ready` that are missing `to` before an infinitive." } } #[cfg(test)] mod tests { use super::MissingTo; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn inserts_to_after_meant() { assert_suggestion_result( "I meant call you last night.", MissingTo::default(), "I meant to call you last night.", ); } #[test] fn inserts_to_after_wants() { assert_suggestion_result( "She wants finish early.", MissingTo::default(), "She wants to finish early.", ); } #[test] fn inserts_to_after_need() { assert_suggestion_result( "We need talk about pricing.", MissingTo::default(), "We need to talk about pricing.", ); } #[test] fn inserts_to_after_agreed() { assert_suggestion_result( "They agreed meet at dawn.", MissingTo::default(), "They agreed to meet at dawn.", ); } #[test] fn inserts_to_after_forgot() { assert_suggestion_result( "He forgot send the file.", MissingTo::default(), "He forgot to send the file.", ); } #[test] fn inserts_to_after_trying() { assert_suggestion_result( "I'm trying get better at chess.", MissingTo::default(), "I'm trying to get better at chess.", ); } #[test] fn inserts_to_after_refused() { assert_suggestion_result( "She refused answer the question.", MissingTo::default(), "She refused to answer the question.", ); } #[test] fn inserts_to_after_ready() { assert_suggestion_result( "We're ready start the meeting.", MissingTo::default(), "We're ready to start the meeting.", ); } #[test] fn inserts_to_after_eager() { assert_suggestion_result( "I'm eager see the results.", MissingTo::default(), "I'm eager to see the results.", ); } #[test] fn inserts_to_after_inclined() { assert_suggestion_result( "I'm inclined believe you.", MissingTo::default(), "I'm inclined to believe you.", ); } #[test] fn inserts_to_after_resolved() { assert_suggestion_result( "She resolved solve the case.", MissingTo::default(), "She resolved to solve the case.", ); } #[test] fn no_lint_when_to_present() { assert_lint_count("She wants to finish early.", MissingTo::default(), 0); } #[test] fn no_lint_with_noun_after_controller() { assert_lint_count("They arranged a meeting at noon.", MissingTo::default(), 0); } #[test] fn no_lint_needs_follow_up_appointments() { assert_lint_count( "Gus is recovering well, though he needs follow-up appointments.", MissingTo::default(), 0, ); } #[test] fn no_lint_delays_meant_decisions() { assert_lint_count( "The delays meant decisions were often made on outdated information, hindering agility and potentially impacting return on investment.", MissingTo::default(), 0, ); } #[test] fn no_lint_bouquet_of_roses() { assert_lint_count( "I made a note to request a small bouquet of roses for his room, a simple gesture that I hoped would bring a moment of solace.", MissingTo::default(), 0, ); } #[test] fn no_lint_for_intended_word_phrase() { assert_lint_count( "Detects incorrect usage of `peak` when the intended word is `pique`.", MissingTo::default(), 0, ); } #[test] fn no_lint_long_passage() { assert_lint_count( "Before her was another long passage illuminated by lamps.", MissingTo::default(), 0, ); } #[test] fn no_lint_long_island_sound() { assert_lint_count( "The sailboat drifted along Long Island Sound at sunrise.", MissingTo::default(), 0, ); } #[test] fn no_lint_learn_tag_probabilities() { assert_lint_count( "These models learn tag probabilities from annotated corpora.", MissingTo::default(), 0, ); } #[test] fn no_lint_standard_feature_nominal_phrase() { assert_lint_count( "This is a standard and expected feature for any e-commerce site selling visually-driven products.", MissingTo::default(), 0, ); } #[test] fn no_lint_mixing_bowl_nominal_phrase() { assert_lint_count( "This is a 2-quart mixing bowl, ideal for everything from whipping cream to preparing cake batter.", MissingTo::default(), 0, ); } #[test] fn no_lint_try_and_say() { assert_lint_count( "I'll try and say hello before I leave.", MissingTo::default(), 0, ); } #[test] fn no_lint_failed_edit_attempts() { assert_lint_count("failed edit attempts", MissingTo::default(), 0); } #[test] fn no_lint_ready_work() { assert_lint_count("ready work", MissingTo::default(), 0); } #[test] fn no_lint_bad_at_managing_side_effects() { assert_lint_count("Bad at managing side-effects", MissingTo::default(), 0); } #[test] fn no_lint_a_fully_resolved_conflict() { assert_lint_count("a fully resolved conflict", MissingTo::default(), 0); } #[test] fn no_lint_a_resolved_configuration() { assert_lint_count("A resolved configuration", MissingTo::default(), 0); } #[test] fn no_lint_a_fully_resolved_configuration() { assert_lint_count("A fully resolved configuration", MissingTo::default(), 0); } #[test] fn no_lint_a_resolved_set_of_configuration() { assert_lint_count("A resolved set of configuration", MissingTo::default(), 0); } #[test] fn no_lint_a_fully_resolved_set_of_configuration() { assert_lint_count( "A fully resolved set of configuration", MissingTo::default(), 0, ); } #[test] fn no_lint_system_produced_a_fully_resolved_set_of_dependencies() { assert_lint_count( "System produced a fully resolved set of dependencies", MissingTo::default(), 0, ); } #[test] fn no_lint_a_resolved_list_of_parameters() { assert_lint_count("A resolved list of parameters", MissingTo::default(), 0); } #[test] fn no_lint_a_fully_resolved_list_of_parameters() { assert_lint_count( "A fully resolved list of parameters", MissingTo::default(), 0, ); } #[test] fn no_lint_a_prepared_stranger() { assert_lint_count("A prepared stranger", MissingTo::default(), 0); } #[test] fn no_lint_a_fully_prepared_stranger() { assert_lint_count("A fully prepared stranger", MissingTo::default(), 0); } #[test] fn no_lint_a_prepared_group_of_strangers() { assert_lint_count("A prepared group of strangers", MissingTo::default(), 0); } #[test] fn no_lint_a_fully_prepared_group_of_strangers() { assert_lint_count( "A fully prepared group of strangers", MissingTo::default(), 0, ); } #[test] fn no_lint_a_nicely_arranged_set_of_flowers() { assert_lint_count( "A nicely arranged bunch of flowers", MissingTo::default(), 0, ); } #[test] fn no_lint_a_recently_forgotten_list_of_names() { assert_lint_count( "A recently forgotten list of names", MissingTo::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/misspell.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct Misspell { expr: SequenceExpr, } impl Default for Misspell { fn default() -> Self { let expr = SequenceExpr::word_set(&["miss"]).t_ws_h().then_word_set(&[ "spell", "spelled", "spelling", "spells", "spellings", ]); Self { expr } } } impl ExprLinter for Misspell { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let misspell_variant = matched_tokens.last()?; let variant_chars = misspell_variant.span.get_content(source); let variant_lower = variant_chars .iter() .map(|c| c.to_ascii_lowercase()) .collect::(); let replacement = match variant_lower.as_str() { "spell" => "misspell", "spelled" => "misspelled", "spelling" => "misspelling", "spells" => "misspells", "spellings" => "misspellings", _ => return None, }; let suggestions = vec![Suggestion::replace_with_match_case( replacement.chars().collect(), span.get_content(source), )]; Some(Lint { span, lint_kind: LintKind::BoundaryError, suggestions, message: "Write `misspell` and its inflections as a single word.".to_string(), priority: 63, }) } fn description(&self) -> &'static str { "Ensures `misspell` and its inflected forms are written as a single word." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::Misspell; #[test] fn base_form() { assert_suggestion_result( "They often miss spell names in the log.", Misspell::default(), "They often misspell names in the log.", ); } #[test] fn past_tense() { assert_suggestion_result( "She miss spelled the answer on the quiz.", Misspell::default(), "She misspelled the answer on the quiz.", ); } #[test] fn past_tense_hyphen() { assert_suggestion_result( "She miss-spelled the answer on the quiz.", Misspell::default(), "She misspelled the answer on the quiz.", ); } #[test] fn gerund_form() { assert_suggestion_result( "His constant miss spelling frustrated the team.", Misspell::default(), "His constant misspelling frustrated the team.", ); } } ================================================ FILE: harper-core/src/linting/mixed_bag.rs ================================================ use crate::CharStringExt; use crate::linting::expr_linter::Chunk; use crate::linting::expr_linter::find_the_only_token_matching; use crate::linting::{ExprLinter, LintKind, Suggestion}; use crate::{ Lint, Token, TokenKind, expr::{Expr, SequenceExpr}, }; pub struct MixedBag { expr: SequenceExpr, } impl Default for MixedBag { fn default() -> Self { Self { expr: SequenceExpr::default() .then_kind_any_or_words( &[TokenKind::is_adjective, TokenKind::is_adverb] as &[_], &["a"], ) .t_ws() .t_aco("mixed") .t_ws() .t_aco("bad"), } } } impl ExprLinter for MixedBag { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let bad_span = find_the_only_token_matching(toks, src, |tok, _src| { tok.span .get_content(src) .eq_ignore_ascii_case_chars(&['b', 'a', 'd']) })? .span; Some(Lint { span: bad_span, lint_kind: LintKind::Eggcorn, suggestions: vec![Suggestion::replace_with_match_case_str( "bag", bad_span.get_content(src), )], message: "Corrects the eggcorn `mixed bad` to `mixed bag`.".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Corrects the eggcorn `mixed bad` to `mixed bag`." } } #[cfg(test)] mod tests { use super::MixedBag; use crate::linting::tests::assert_suggestion_result; #[test] fn a_mixed_bad() { assert_suggestion_result( "CommandLine interface is already a mixed bad of wstring and #ifdef to string or wstring.", MixedBag::default(), "CommandLine interface is already a mixed bag of wstring and #ifdef to string or wstring.", ); } #[test] fn big_mixed_bag() { assert_suggestion_result( "Speaking of dungeons , the dungeons in this game are a big mixed bad.", MixedBag::default(), "Speaking of dungeons , the dungeons in this game are a big mixed bag.", ); } #[test] fn damn_mixed_bag() { assert_suggestion_result( "This is a damn mixed bad which left me frustrated, and yet longing for more.", MixedBag::default(), "This is a damn mixed bag which left me frustrated, and yet longing for more.", ); } #[test] fn huge_mixed_bag() { assert_suggestion_result( "Also a huge mixed bad of no name monitors of different sizes that all have different color settings on.", MixedBag::default(), "Also a huge mixed bag of no name monitors of different sizes that all have different color settings on.", ); } #[test] fn large_mixed_bag() { assert_suggestion_result( "I’m still struggling to comprehend how it throws such a large mixed bad of symptoms in the mix this time.", MixedBag::default(), "I’m still struggling to comprehend how it throws such a large mixed bag of symptoms in the mix this time.", ); } #[test] fn massive_mixed_bad() { assert_suggestion_result( "Anyway. In topic, Swano was a massive mixed bad in this game.", MixedBag::default(), "Anyway. In topic, Swano was a massive mixed bag in this game.", ); } #[test] fn massively_mixed_bag() { assert_suggestion_result( "While certain things are more common to be either way, it's a massively mixed bad overall.", MixedBag::default(), "While certain things are more common to be either way, it's a massively mixed bag overall.", ); } #[test] fn pretty_mixed_bag() { assert_suggestion_result( "It's a pretty mixed bad for me: Evolution Xavier for comic Xavier. Evolution Magneto for comic Magneto.", MixedBag::default(), "It's a pretty mixed bag for me: Evolution Xavier for comic Xavier. Evolution Magneto for comic Magneto.", ); } #[test] fn rather_mixed_bag() { assert_suggestion_result( "Well chaps, as expected the TS contains a rather mixed bad of promise and disappointment.", MixedBag::default(), "Well chaps, as expected the TS contains a rather mixed bag of promise and disappointment.", ); } #[test] fn really_mixed_bag() { assert_suggestion_result( "This is a really mixed bad On one hand you have some of Eminem's highest highs and his lowest lows but ever.", MixedBag::default(), "This is a really mixed bag On one hand you have some of Eminem's highest highs and his lowest lows but ever.", ); } #[test] fn slightly_mixed_bag() { assert_suggestion_result( "I absolutely love Yes Minister and Yes Prime Minister but it did end up a slightly mixed bad in terms of impact.", MixedBag::default(), "I absolutely love Yes Minister and Yes Prime Minister but it did end up a slightly mixed bag in terms of impact.", ); } #[test] fn somewhat_mixed_bag() { assert_suggestion_result( "A somewhat mixed bad. The space is pleasant with a rustic vibe.", MixedBag::default(), "A somewhat mixed bag. The space is pleasant with a rustic vibe.", ); } #[test] fn very_mixed_bag() { assert_suggestion_result( "AVAILABLE MEN is a very mixed bad of short films about gay subjects that very from excellent to weak.", MixedBag::default(), "AVAILABLE MEN is a very mixed bag of short films about gay subjects that very from excellent to weak.", ); } } ================================================ FILE: harper-core/src/linting/mod.rs ================================================ //! Frameworks and rules that locate errors in text. //! //! See the [`Linter`] trait and the [documentation for authoring a rule](https://writewithharper.com/docs/contributors/author-a-rule) for more information. mod a_part; mod a_while; mod addicting; mod adjective_double_degree; mod adjective_of_a; mod after_later; mod all_hell_break_loose; mod all_intents_and_purposes; mod allow_to; mod am_in_the_morning; mod amounts_for; mod an_a; mod and_in; mod and_the_like; mod another_thing_coming; mod another_think_coming; mod apart_from; mod ask_no_preposition; mod avoid_curses; mod back_in_the_day; mod be_allowed; mod be_worried; mod behind_the_scenes; mod best_of_all_time; mod boring_words; mod bought; mod brand_brandish; mod by_accident; mod call_them; mod cant; mod capitalize_personal_pronouns; mod cautionary_tale; mod change_tack; mod chock_full; mod closed_compounds; mod comma_fixes; mod compound_nouns; mod compound_subject_i; mod confident; mod correct_number_suffix; mod criteria_phenomena; mod cure_for; mod currency_placement; mod damages; mod dashes; mod day_and_age; mod despite_it_is; mod despite_of; mod determiner_without_noun; mod did_past; mod didnt; mod discourse_markers; mod disjoint_prefixes; mod do_mistake; mod dot_initialisms; mod double_click; mod double_modal; mod ellipsis_length; mod else_possessive; mod ever_every; mod everyday; mod expand_memory_shorthands; mod expand_time_shorthands; mod expr_linter; mod far_be_it; mod fascinated_by; mod fed_up_with; mod feel_fell; mod few_units_of_time_ago; mod filler_words; mod find_fine; mod first_aid_kit; mod flesh_out_vs_full_fledged; mod for_noun; mod free_predicate; mod friend_of_me; mod go_so_far_as_to; mod go_to_war; mod good_at; mod handful; mod have_pronoun; mod have_take_a_look; mod hedging; mod hello_greeting; mod hereby; mod hop_hope; mod hope_youre; mod how_to; mod hyphenate_number_day; mod i_am_agreement; mod if_wouldve; mod in_on_the_cards; mod inflected_verb_after_to; mod initialism_linter; mod initialisms; mod interested_in; mod it_is; mod it_looks_like_that; mod it_would_be; mod its_contraction; mod its_possessive; mod jealous_of; mod johns_hopkins; mod lead_rise_to; mod left_right_hand; mod less_worse; mod let_to_do; mod lets_confusion; mod likewise; mod lint; mod lint_group; mod lint_kind; mod long_sentences; mod look_down_ones_nose; mod looking_forward_to; mod map_phrase_linter; mod map_phrase_set_linter; mod mass_nouns; mod means_a_lot_to; mod merge_linters; mod merge_words; mod missing_preposition; mod missing_space; mod missing_to; mod misspell; mod mixed_bag; mod modal_be_adjective; mod modal_of; mod modal_seem; mod months; mod more_adjective; mod more_better; mod most_number; mod most_of_the_times; mod multiple_frequency_adverbs; mod multiple_sequential_pronouns; mod nail_on_the_head; mod need_to_noun; mod no_french_spaces; mod no_longer; mod no_match_for; mod no_oxford_comma; mod nobody; mod nominal_wants; mod nor_modal_pronoun; mod not_only_inversion; mod noun_verb_confusion; mod number_suffix_capitalization; mod obsess_preposition; mod of_course; mod oldest_in_the_book; mod on_floor; mod once_or_twice; mod one_and_the_same; mod one_of_the_singular; mod open_compounds; mod open_the_light; mod orthographic_consistency; mod ought_to_be; mod out_of_date; mod oxford_comma; mod oxymorons; mod phrasal_verb_as_compound_noun; mod phrase_set_corrections; mod pique_interest; mod plural_decades; mod plural_wrong_word_of_phrase; mod possessive_noun; mod possessive_your; mod progressive_needs_be; mod pronoun_are; mod pronoun_contraction; mod pronoun_inflection_be; mod pronoun_knew; mod pronoun_verb_agreement; mod proper_noun_capitalization_linters; mod quantifier_needs_of; mod quantifier_numeral_conflict; mod quite_quiet; mod quote_spacing; mod reason_for_doing; mod redundant_acronyms; mod redundant_additive_adverbs; mod redundant_progressive_comparative; mod regionalisms; mod regular_irregulars; mod repeated_words; mod respond; mod right_click; mod rise_the_ranks; mod roller_skated; mod safe_to_save; mod save_to_safe; mod sentence_capitalization; mod shoot_oneself_in_the_foot; mod simple_past_to_past_participle; mod since_duration; mod single_be; mod some_without_article; mod something_is; mod somewhat_something; mod soon_to_be; mod sought_after; mod spaces; mod spell_check; mod spelled_numbers; mod split_words; mod subject_pronoun; mod suggestion; mod take_a_look_to; mod take_medicine; mod take_serious; mod that_than; mod that_which; mod the_how_why; mod the_my; mod the_point_for; mod the_proper_noun_possessive; mod then_than; mod theres; mod theses_these; mod theyre_confusions; mod thing_think; mod this_type_of_thing; mod though_thought; mod throw_away; mod throw_rubbish; mod to_adverb; mod to_two_too; mod touristic; mod transposed_space; mod try_ones_hand_at; mod unclosed_quotes; mod update_place_names; mod use_title_case; mod verb_to_adjective; mod very_unique; mod vice_versa; mod vicious_loop; mod was_aloud; mod way_too_adjective; mod weir_rules; mod well_educated; mod were_where; mod whereas; mod whom_subject_of_verb; mod widely_accepted; mod win_prize; mod wish_could; mod wordpress_dotcom; mod worth_to_do; mod would_never_have; mod wrong_apostrophe; pub use expr_linter::{Chunk, ExprLinter}; pub use initialism_linter::InitialismLinter; pub use lint::Lint; pub use lint_group::{LintGroup, LintGroupConfig}; pub use lint_kind::LintKind; pub use map_phrase_linter::MapPhraseLinter; pub use map_phrase_set_linter::MapPhraseSetLinter; pub use suggestion::{Suggestion, SuggestionCollectionExt}; use crate::{Document, LSend, render_markdown}; /// A __stateless__ rule that searches documents for grammatical errors. /// /// Commonly implemented via [`ExprLinter`]. /// /// See also: [`LintGroup`]. pub trait Linter: LSend { /// Analyzes a document and produces zero or more [`Lint`]s. /// We pass `self` mutably for caching purposes. fn lint(&mut self, document: &Document) -> Vec; /// A user-facing description of what kinds of grammatical errors this rule looks for. /// It is usually shown in settings menus. fn description(&self) -> &str; } /// A blanket-implemented trait that renders the Markdown description field of a linter to HTML. pub trait HtmlDescriptionLinter { fn description_html(&self) -> String; } impl HtmlDescriptionLinter for L where L: Linter, { fn description_html(&self) -> String { let desc = self.description(); render_markdown(desc) } } pub mod debug { use crate::Token; /// Formats a lint match with surrounding context for debug output. /// /// The function takes the same `matched_tokens` and `source`, and `context` parameters /// passed to `[match_to_lint_with_context]`. /// /// # Arguments /// * `log` - `matched_tokens` /// * `ctx` - `context`, or `None` if calling from `[match_to_lint]` /// * `src` - `source` from `[match_to_lint]` / `[match_to_lint_with_context]` /// /// # Returns /// A string with ANSI escape codes where: /// - Context tokens are dimmed before and after the matched tokens in normal weight. /// - Markup and formatting text hidden in whitespace tokens is filtered out. pub fn format_lint_match( log: &[Token], ctx: Option<(&[Token], &[Token])>, src: &[char], ) -> String { let fmt = |tokens: &[Token]| { tokens .iter() .filter(|t| !t.kind.is_unlintable()) .map(|t| t.span.get_content_string(src)) .collect::() }; if let Some((pro, epi)) = ctx { format!( "\x1b[2m{}\x1b[0m{}\x1b[2m{}\x1b[0m", fmt(pro), fmt(log), fmt(epi) ) } else { fmt(log) } } } #[cfg(test)] pub mod tests { use crate::{Document, Span, Token, linting::Linter}; use hashbrown::HashSet; /// Extension trait for converting spans of tokens back to their original text pub trait SpanVecExt { fn to_strings(&self, doc: &Document) -> Vec; } impl SpanVecExt for Vec> { fn to_strings(&self, doc: &Document) -> Vec { self.iter() .map(|sp| { doc.get_tokens()[sp.start..sp.end] .iter() .map(|tok| doc.get_span_content_str(&tok.span)) .collect::() }) .collect() } } // Special Linter just for testing use crate::{ CharStringExt, Lint, TokenStringExt, linting::{LintKind, Suggestion}, }; /// Type alias for many:many error-to-fix mappings used in testing /// Each error pattern can map to multiple possible fixes pub type TestLinterMap<'a> = &'a [(&'a [&'a str], &'a [&'a str])]; #[derive(Clone)] pub struct TestLinter<'a> { map: TestLinterMap<'a>, } impl<'a> TestLinter<'a> { pub fn new(map: TestLinterMap<'a>) -> Self { Self { map } } } impl<'a> Linter for TestLinter<'a> { fn lint(&mut self, doc: &Document) -> Vec { let mut corr: Vec<(Span, &[char], &[&str])> = Vec::new(); for wordtok in doc.iter_words() { let wordspan = wordtok.span; let word_chars = wordspan.get_content(doc.get_source()); // Check if word matches any of the patterns in the map for (errors, fixes) in self.map { // if any of the errors match, add all of the corrections if errors .iter() .any(|&e| word_chars.eq_ignore_ascii_case_str(e)) { corr.push((wordspan, word_chars, fixes)) } } } corr.iter() .map(|(ws, wch, cstr)| { // Create suggestions for all possible fixes let suggestions: Vec = cstr .iter() .map(|&suggestion_str| { Suggestion::replace_with_match_case( suggestion_str.chars().collect(), wch.to_owned(), ) }) .collect(); Lint { span: *ws, lint_kind: LintKind::Spelling, suggestions, message: "Test linter for 'linting assertion' tests".to_string(), ..Default::default() } }) .collect() } fn description(&self) -> &str { "Test linter for 'linting assertion' tests" } } // Before the asserts, let's test that the test linter itself has the behaviours we intend mod linter_tests { use super::{TestLinter, assert_suggestion_result}; #[test] fn test_1_to_1_error_to_fix() { assert_suggestion_result("bad", TestLinter::new(&[(&["bad"], &["good"])]), "good"); } #[test] fn test_1_to_2_error_to_fixes() { let linter = TestLinter::new(&[(&["bad"], &["good1", "good2"])]); assert_suggestion_result("bad", linter.clone(), "good1"); assert_suggestion_result("bad", linter, "good2"); } #[test] fn test_2_to_1_errors_to_fix() { let linter = TestLinter::new(&[(&["bad1", "bad2"], &["good"])]); assert_suggestion_result("bad1", linter.clone(), "good"); assert_suggestion_result("bad2", linter, "good"); } #[test] fn test_2_to_2_errors_to_fixes() { let linter = TestLinter::new(&[(&["bad1", "bad2"], &["good1", "good2"])]); assert_suggestion_result("bad1", linter.clone(), "good1"); assert_suggestion_result("bad2", linter.clone(), "good2"); assert_suggestion_result("bad1", linter.clone(), "good2"); assert_suggestion_result("bad2", linter, "good1"); } } #[track_caller] pub fn assert_no_lints(text: &str, linter: impl Linter) { assert_lint_count(text, linter, 0); } #[test] fn verify_no_lints() { assert_no_lints("hello world", TestLinter::new(&[])); } #[track_caller] pub fn assert_lint_count(text: &str, mut linter: impl Linter, count: usize) { let test = Document::new_plain_english_curated(text); let lints = linter.lint(&test); // dbg!(&lints); if lints.len() != count { panic!( "Expected \"{text}\" to create {count} lints, but it created {}.", lints.len() ); } } #[test] fn verify_1_lint() { assert_lint_count( "heloo world", TestLinter::new(&[(&["heloo"], &["hello"])]), 1, ); } #[test] fn verify_2_lints() { assert_lint_count( "heloo wolrd", TestLinter::new(&[(&["heloo"], &["hello"]), (&["wolrd"], &["world"])]), 2, ); } /// Assert the total number of suggestions produced by a [`Linter`], spread across all produced /// [`Lint`]s. #[track_caller] pub fn assert_suggestion_count(text: &str, mut linter: impl Linter, count: usize) { let test = Document::new_plain_english_curated(text); let lints = linter.lint(&test); eprintln!( "{}", lints .iter() .map(|l| l .suggestions .iter() .map(|s| s.to_string()) .collect::>() .join(", ")) .collect::>() .join("\n") ); assert_eq!( lints.iter().map(|l| l.suggestions.len()).sum::(), count ); } #[test] fn verify_no_suggestions() { assert_suggestion_count("afjehwkf", TestLinter::new(&[]), 0); } #[test] fn verify_1_suggestion() { assert_suggestion_count( "dictionery", TestLinter::new(&[(&["dictionery"], &["dictionary"])]), 1, ); } /// Document types for suggestion search testing #[derive(Debug, Clone, Copy)] enum DocumentType { PlainEnglish, Markdown, } /// Creates a document of the specified type from character data fn create_document(chars: &[char], doc_type: DocumentType) -> Document { match doc_type { DocumentType::PlainEnglish => Document::new_plain_english_curated_chars(chars), DocumentType::Markdown => Document::new_markdown_default_curated_chars(chars), } } /// Applies suggestions iteratively until any combination produces the expected result. /// /// Explores all possible suggestion branches (depth-first search) until finding a path /// that produces the expected result. Stops after 100 iterations to prevent infinite loops. /// /// Use this when you want to verify that *some* suggestion sequence produces the /// expected result, without caring which specific suggestions are used. /// /// See issue #950: https://github.com/Automattic/harper/issues/950 #[track_caller] pub fn assert_suggestion_result(text: &str, mut linter: impl Linter, needle: &str) { if search_for_suggestion(DocumentType::PlainEnglish, text, &mut linter, needle, 0) { return; } panic!( "No suggestion sequence produced the expected result.\n\ Expected: \"{needle}\"" ); } /// DFS implementation using markdown instead of plain English #[track_caller] pub fn assert_markdown_suggestion_result(text: &str, mut linter: impl Linter, needle: &str) { if !search_for_suggestion(DocumentType::Markdown, text, &mut linter, needle, 0) { panic!("No suggestion sequence produced the expected result.\nExpected: {needle}"); } } /// Recursively searches all suggestion combinations using depth-first search. /// Returns true if any path reaches the expected result, false otherwise. fn search_for_suggestion( doc_type: DocumentType, text: &str, linter: &mut impl Linter, needle: &str, depth: usize, ) -> bool { // Prevent infinite recursion (e.g. cycles in suggestions) if depth > 100 { eprintln!("⚠️ Reached depth limit (100)"); return false; } // Check if we've reached the expected result if text == needle { return true; } // Lint current text and try each suggestion branch let chars: Vec = text.chars().collect(); let document = create_document(&chars, doc_type); let lints = linter.lint(&document); if let Some(lint) = lints.first() { for sug in lint.suggestions.iter() { let mut chars_copy = chars.clone(); sug.apply(lint.span, &mut chars_copy); let next: String = chars_copy.iter().collect(); // Recursively search this branch if search_for_suggestion(doc_type, &next, linter, needle, depth + 1) { return true; } } } false } #[test] fn verify_fix_one_lint() { assert_suggestion_result( "find the misstake and fix it", TestLinter::new(&[(&["misstake"], &["mistake"])]), "find the mistake and fix it", ); } #[test] #[should_panic] fn verify_unable_to_fix_one_spanish_lint() { assert_suggestion_result("Hay una orrrer", TestLinter::new(&[]), "Hay una error"); } #[test] fn verify_fix_two_lints() { assert_suggestion_result( "find two misstakes and fix theem", TestLinter::new(&[(&["misstakes"], &["mistakes"]), (&["theem"], &["them"])]), "find two mistakes and fix them", ); } // Stress test: multiple errors in one sentence, DFS must find correct suggestion path // Note: This test is known to be brittle - it depends on SpellCheck dictionary and // suggestion ranking. If it fails after a dictionary update, try different word combinations. // Uses common misspellings that have unambiguous correct suggestions in the top 3. #[test] fn verify_fix_five_typos() { assert_suggestion_result( "Please recieve teh payment untill thier authorization occured", TestLinter::new(&[ (&["recieve"], &["receive"]), (&["teh"], &["the"]), (&["untill"], &["until"]), (&["thier"], &["their"]), (&["occured"], &["occurred"]), ]), "Please receive the payment until their authorization occurred", ); } /// Asserts that none of the suggestions from the linter match the given text. #[track_caller] pub fn assert_not_in_suggestion_result( text: &str, mut linter: impl Linter, bad_suggestion: &str, ) { if !search_for_suggestion( DocumentType::PlainEnglish, text, &mut linter, bad_suggestion, 0, ) { return; } panic!( "A suggestion sequence produced the undesired result.\n\ Undesired: \"{bad_suggestion}\"" ); } #[test] fn verify_sole_suggestion_is_the_one_we_wanted() { assert_not_in_suggestion_result( "Baby cats are called kitens", TestLinter::new(&[]), "Baby cats are called puppies", ); } // TODO verify sole suggestion is not the one we wanted fails #[test] #[should_panic] fn verify_sole_suggestion_not_in_result_fails() { assert_not_in_suggestion_result( "heloo", TestLinter::new(&[(&["heloo"], &["hello"])]), "hello", ); } // TODO verify many suggestions including the one we want succeeds // TODO verify many suggestions but not the one we want fails /// Asserts both that the given text matches the expected good suggestions and that none of the /// suggestions are in the bad suggestions list. /// TODO: Reimplement similar to `search_suggestion_tree` #[track_caller] pub fn assert_good_and_bad_suggestions( text: &str, mut linter: impl Linter, good: &[&str], bad: &[&str], ) { let test = Document::new_plain_english_curated(text); let lints = linter.lint(&test); let mut unseen_good: HashSet<_> = good.iter().cloned().collect(); let mut found_bad = Vec::new(); let mut found_good = Vec::new(); for (i, lint) in lints.into_iter().enumerate() { for (j, suggestion) in lint.suggestions.into_iter().enumerate() { let mut text_chars: Vec = text.chars().collect(); suggestion.apply(lint.span, &mut text_chars); let suggestion_text: String = text_chars.into_iter().collect(); // Check for bad suggestions if bad.contains(&&*suggestion_text) { found_bad.push((i, j, suggestion_text.clone())); eprintln!( " ❌ Found bad suggestion at lint[{i}].suggestions[{j}]: \"{suggestion_text}\"" ); } // Check for good suggestions else if good.contains(&&*suggestion_text) { found_good.push((i, j, suggestion_text.clone())); eprintln!( " ✅ Found good suggestion at lint[{i}].suggestions[{j}]: \"{suggestion_text}\"" ); unseen_good.remove(suggestion_text.as_str()); } } } // Print summary if !found_bad.is_empty() || !unseen_good.is_empty() { eprintln!("\n=== Test Summary ==="); // In the summary section, change these loops: if !found_bad.is_empty() { eprintln!("\n❌ Found {} bad suggestions:", found_bad.len()); for (i, j, text) in &found_bad { eprintln!(" - lint[{i}].suggestions[{j}]: \"{text}\""); } } // And for the good suggestions: if !unseen_good.is_empty() { eprintln!( "\n❌ Missing {} expected good suggestions:", unseen_good.len() ); for text in &unseen_good { eprintln!(" - \"{text}\""); } } eprintln!("\n✅ Found {} good suggestions", found_good.len()); eprintln!("==================\n"); if !found_bad.is_empty() || !unseen_good.is_empty() { panic!("Test failed - see error output above"); } } else { eprintln!( "\n✅ All {} good suggestions found, no bad suggestions\n", found_good.len() ); } } // TODO test that having all the good and none of the bad succeeds // TODO test that missing one of the good fails // TODO test that having one of the bads fails #[test] #[should_panic] fn verify_mutal_corrections_cause_failure() { assert_suggestion_result( "gooder", TestLinter::new(&[(&["gooder"], &["more good"])]), "better", ); } /// Asserts that the lint's message matches the expected message. #[track_caller] pub fn assert_lint_message(text: &str, mut linter: impl Linter, expected_message: &str) { let test = Document::new_plain_english_curated(text); let lints = linter.lint(&test); // Just check the first lint for now - TODO if let Some(lint) = lints.first() && lint.message != expected_message { panic!( "Expected lint message \"{expected_message}\", but got \"{}\"", lint.message ); } } } ================================================ FILE: harper-core/src/linting/modal_be_adjective.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{ ExprLinter, Suggestion, expr_linter::{Chunk, followed_by_word}, }, patterns::ModalVerb, }; pub struct ModalBeAdjective { expr: SequenceExpr, } impl Default for ModalBeAdjective { fn default() -> Self { Self { expr: SequenceExpr::with(ModalVerb::default()) .t_ws() .then_kind_is_but_isnt_any_of_except( TokenKind::is_adjective, &[ TokenKind::is_verb_lemma, // set TokenKind::is_adverb, // ever TokenKind::is_preposition, // on TokenKind::is_determiner, // all TokenKind::is_pronoun, // all ] as &[_], &[ "backup", // adjective commonly misused as a verb "likely", // adjective but with special usage ] as &[_], ), } } } impl ExprLinter for ModalBeAdjective { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if followed_by_word(ctx, |nw| { (nw.kind.is_noun() && !nw .span .get_content(src) .eq_any_ignore_ascii_case_str(&["at", "by", "if"])) || (toks .last() .unwrap() .span .get_content(src) .eq_ignore_ascii_case_str("kind") && nw.span.get_content(src).eq_ignore_ascii_case_str("of")) }) { return None; } Some(Lint { span: toks[0].span, suggestions: vec![Suggestion::InsertAfter(" be".chars().collect())], message: "You may be missing the word `be` between this modal verb and adjective." .to_string(), ..Default::default() }) } fn description(&self) -> &str { "Looks for `be` missing between a modal verb and adjective." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::ModalBeAdjective; #[test] fn fix_would_nice() { assert_suggestion_result( "It would nice if Harper could detect this.", ModalBeAdjective::default(), "It would be nice if Harper could detect this.", ); } #[test] fn fix_could_configured() { assert_suggestion_result( "It could configured by parameters and the commands above effectively disable it.", ModalBeAdjective::default(), "It could be configured by parameters and the commands above effectively disable it.", ); } #[test] fn fix_will_accessible() { assert_suggestion_result( "Your WordPress site will accessible at http://localhost", ModalBeAdjective::default(), "Your WordPress site will be accessible at http://localhost", ); } #[test] fn ignore_would_external_traffic() { assert_no_lints( "And why would external traffic be trying to access my server if I don't know who or what it is?", ModalBeAdjective::default(), ) } #[test] fn ignore_could_kind_of() { assert_no_lints("you could kind of see the ...", ModalBeAdjective::default()) } // Known false positives. You may want to improve the code to handle some of these. #[test] #[ignore = "false positive: 'backup' is an adjective but also a spello for the verb 'back up'"] fn ignore_you_can_backup() { assert_no_lints("You can backup Userdata.", ModalBeAdjective::default()); } #[test] #[ignore = "false positive: 'incorrect' should be 'incorrectly'."] fn ignore_would_incorrect() { assert_no_lints( "Bug in versions 4.0 and 4.1 would incorrect list the address module", ModalBeAdjective::default(), ); } #[test] #[ignore = "false positive: 'upper-bound' is an ad-hoc verb here."] fn ignore_should_upper() { assert_no_lints( "we should upper-bound it to the next MAJOR version.", ModalBeAdjective::default(), ); assert_no_lints( "some older software (filezilla on debian-stable) cannot passive-mode with TLS", ModalBeAdjective::default(), ); } } ================================================ FILE: harper-core/src/linting/modal_of.rs ================================================ use crate::{ Lrc, Token, TokenStringExt, expr::{Expr, FirstMatchOf, LongestMatchOf, OwnedExprExt, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, patterns::{ModalVerb, Word}, }; pub struct ModalOf { expr: LongestMatchOf, } impl Default for ModalOf { fn default() -> Self { // Note 1. "shan't of" is plausible but very unlikely // Note 2. "had of" has trickier false positives and is less common anyway // "The only other report we've had of this kind of problem ..." // "The code I had of this used to work fine ..." let modal_of = Lrc::new( SequenceExpr::with(ModalVerb::default()) .then_whitespace() .t_aco("of") .and_not(FirstMatchOf::new(vec![ Box::new(Word::new("can")), Box::new(Word::new_exact("May")), ])), ); // "will of" is a false positive if "will" is a noun // "The will of the many" let noun_will_of_naive = Lrc::new( SequenceExpr::word_set(&["the", "a"]) .then_whitespace() .t_aco("will") .then_whitespace() .t_aco("of"), ); let ws_course = Lrc::new(SequenceExpr::whitespace().t_aco("course")); let modal_of_course = Lrc::new(SequenceExpr::with(modal_of.clone()).then(ws_course.clone())); let anyword_might_of = Lrc::new( SequenceExpr::any_word() .then_whitespace() .t_aco("might") .then_whitespace() .t_aco("of"), ); let anyword_might_of_course = Lrc::new(SequenceExpr::with(anyword_might_of.clone()).then(ws_course.clone())); Self { expr: LongestMatchOf::new(vec![ Box::new(anyword_might_of_course), Box::new(modal_of_course), Box::new(anyword_might_of), Box::new(noun_will_of_naive), Box::new(modal_of), ]), } } } impl ExprLinter for ModalOf { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_toks: &[Token], source_chars: &[char]) -> Option { let modal_index = match matched_toks.len() { // Without context, always an error from the start 3 => 0, 5 => { // False positives: modal _ of _ course / adj. _ might _ of / art. _ might _ of let w3_text = matched_toks .last() .unwrap() .span .get_content(source_chars) .iter() .collect::(); if w3_text.as_str() != "of" { return None; } let w1_kind = &matched_toks.first().unwrap().kind; // the might of something, great might of something if w1_kind.is_adjective() || w1_kind.is_determiner() { return None; } // not a false positive, skip context before 2 } // False positive: _ might _ of _ course 7 => return None, _ => unreachable!(), }; let span_modal_of = matched_toks[modal_index..modal_index + 3].span().unwrap(); let modal_have = format!( "{} have", matched_toks[modal_index] .span .get_content_string(source_chars) ) .chars() .collect(); Some(Lint { span: span_modal_of, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( modal_have, span_modal_of.get_content(source_chars), )], message: "Use `have` rather than `of` here.".to_string(), priority: 126, }) } fn description(&self) -> &'static str { "Detects `of` mistakenly used with `would`, `could`, `should`, etc." } } #[cfg(test)] mod tests { use super::ModalOf; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; // atomic unit tests #[test] fn test_lowercase() { assert_suggestion_result("could of", ModalOf::default(), "could have"); } #[test] fn test_negative() { assert_suggestion_result("mightn't of", ModalOf::default(), "mightn't have"); } #[test] fn test_uppercase_negative() { assert_suggestion_result("Mustn't of", ModalOf::default(), "Mustn't have"); } #[test] fn test_false_positive_of_course() { assert_lint_count("should of course", ModalOf::default(), 0); } #[test] fn test_false_positive_the_might_of() { assert_lint_count("the might of", ModalOf::default(), 0); } #[test] fn test_false_positive_great_might_of() { assert_lint_count("great might of", ModalOf::default(), 0); } #[test] fn test_false_positive_capital_negative() { assert_lint_count("Wouldn't of course", ModalOf::default(), 0); } // real-world tests #[test] fn test_buggy_implementation() { assert_lint_count( "... could of just been a buggy implementation", ModalOf::default(), 1, ); } #[test] fn test_missed_one() { assert_lint_count( "We already have a function ... that nedb can understand so we might of missed one.", ModalOf::default(), 1, ); } #[test] fn test_user_option() { assert_lint_count( "im more likely to believe you might of left in the 'user' option", ModalOf::default(), 1, ); } #[test] fn catches_must_of() { assert_suggestion_result( "Ah I must of missed that part.", ModalOf::default(), "Ah I must have missed that part.", ); } #[test] fn catches_should_of() { assert_lint_count( "Yeah I should of just mentioned it should of been a for of.", ModalOf::default(), 2, ); } #[test] fn catches_would_of() { assert_suggestion_result( "now this issue would of caused hundreds of thousands of extra lines", ModalOf::default(), "now this issue would have caused hundreds of thousands of extra lines", ); } #[test] fn doesnt_catch_you_could_of_course() { assert_lint_count( "You could of course explicit the else with each possibility", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_compiler_could_of_course() { assert_lint_count( "The compiler could of course detect this too", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_might_of_course_be() { assert_lint_count( "There might of course be other places where not implementing the IMemberSource might break ...", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_not_a_must_of_course() { assert_lint_count( "Not a must of course if the convention should be .ts", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_must_of_course_also() { assert_lint_count( "the schedular must of course also have run through", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_should_of_course_not() { assert_lint_count( "not being local should of course not be supported", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_would_of_course_just() { assert_lint_count( "I would of course just test this by compiling with MATX_MULTI_GPU=ON", ModalOf::default(), 0, ); } #[test] fn doesnt_catch_to_take_on_the_full_might_of_nato() { assert_lint_count("To take on the full might of NATO.", ModalOf::default(), 0); } #[test] fn doesnt_catch_mixed_case_of_course() { assert_lint_count( "... for now you could of Course put ...", ModalOf::default(), 0, ); } #[test] fn catches_mixed_case_could_of_put() { assert_lint_count("... for now you could of Put ...", ModalOf::default(), 1); } #[test] fn doesnt_catch_noun_will_of() { assert_lint_count("the will of the many", ModalOf::default(), 0); } #[test] fn doesnt_catch_noun_will_of_edgecase() { assert_lint_count("he sent us a will of his", ModalOf::default(), 0); } #[test] fn catch_modal_will_of() { assert_lint_count("that will of an impact", ModalOf::default(), 1); } #[test] fn catch_may_of() { assert_suggestion_result( "I may of made a mistake", ModalOf::default(), "I may have made a mistake", ); } #[test] fn dont_flag_in_may_of_last_year_bug_2786() { assert_no_lints("This happened in May of last year.", ModalOf::default()); } #[test] fn dont_flag_can_of_red_bull_2807() { assert_no_lints("I drank a can of Red Bull.", ModalOf::default()); } } ================================================ FILE: harper-core/src/linting/modal_seem.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, expr::{Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::ModalVerb, }; #[derive(Clone, Copy, Default)] struct MatchContext { modal_index: usize, } pub struct ModalSeem { expr: ExprMap, } impl ModalSeem { fn base_sequence() -> SequenceExpr { SequenceExpr::with(ModalVerb::default()) .t_ws() .t_aco("seen") } fn adjective_step() -> SequenceExpr { SequenceExpr::default() .t_ws() .then_kind_where(|kind| kind.is_adjective()) } fn adverb_then_adjective_step() -> SequenceExpr { SequenceExpr::default() .t_ws() .then_kind_where(|kind| kind.is_adverb()) .t_ws() .then_kind_where(|kind| kind.is_adjective()) } } impl Default for ModalSeem { fn default() -> Self { let mut map = ExprMap::default(); map.insert( SequenceExpr::default() .then_seq(Self::base_sequence()) .then(Self::adjective_step()), MatchContext::default(), ); map.insert( SequenceExpr::default() .then_seq(Self::base_sequence()) .then(Self::adverb_then_adjective_step()), MatchContext::default(), ); Self { expr: map } } } impl ExprLinter for ModalSeem { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let context = self.expr.lookup(0, matched_tokens, source)?; let seen_token = matched_tokens .iter() .skip(context.modal_index) .find(|tok| { tok.span .get_content(source) .eq_ignore_ascii_case_str("seen") })?; let span = seen_token.span; let original = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Grammar, suggestions: vec![ Suggestion::replace_with_match_case("seem".chars().collect(), original), Suggestion::replace_with_match_case("be".chars().collect(), original), ], message: "Swap `seen` for a linking verb when it follows a modal before an adjective." .to_owned(), priority: 32, }) } fn description(&self) -> &str { "Detects modal verbs followed by `seen` before adjectives and suggests `seem` or `be`." } } #[cfg(test)] mod tests { use super::ModalSeem; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn corrects_basic_case() { assert_suggestion_result( "It may seen impossible to finish.", ModalSeem::default(), "It may seem impossible to finish.", ); } #[test] fn corrects_with_adverb() { assert_suggestion_result( "That might seen utterly ridiculous.", ModalSeem::default(), "That might seem utterly ridiculous.", ); } #[test] fn offers_be_option() { assert_suggestion_result( "It may seen impossible to finish.", ModalSeem::default(), "It may be impossible to finish.", ); } #[test] fn respects_uppercase() { assert_suggestion_result( "THIS COULD SEEN TERRIBLE.", ModalSeem::default(), "THIS COULD SEEM TERRIBLE.", ); } #[test] fn corrects_before_punctuation() { assert_suggestion_result( "Still, it may seen absurd, but we will continue.", ModalSeem::default(), "Still, it may seem absurd, but we will continue.", ); } #[test] fn corrects_across_newline() { assert_suggestion_result( "It may seen\n impossible to pull off.", ModalSeem::default(), "It may seem\n impossible to pull off.", ); } #[test] fn ignores_correct_seem() { assert_no_lints("It may seem impossible to finish.", ModalSeem::default()); } #[test] fn ignores_modal_with_be_seen() { assert_no_lints("It may be seen as unfair.", ModalSeem::default()); } #[test] fn ignores_modal_seen_noun() { assert_no_lints( "It may seen results sooner than expected.", ModalSeem::default(), ); } #[test] fn ignores_modal_seen_clause() { assert_lint_count( "It may seen that we are improving.", ModalSeem::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/months.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Token, TokenKind, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; // Static array of all month names const ALL_MONTHS: &[&str] = &[ "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december", ]; pub struct Months { expr: SequenceExpr, } impl Default for Months { fn default() -> Self { // Define ambiguous months (those that are also common words) let ambiguous_months = Lrc::new(WordSet::new(&["march", "may", "august"])); // The unambiguous months let only_months: Vec<&str> = ALL_MONTHS .iter() .filter(|&&m| !ambiguous_months.contains(m)) .copied() .collect(); let only_months = WordSet::new(&only_months); let before_month_sense_only = WordSet::new(&[ // Determiners. // These words won't disambiguate months: "each", "this", "that" // "each may do as he likes" // "this may be the best month" "every", // Prepositions. // Possible false positives: // "the first word at the beginning of the next may be fragmented" // "Next may be to offer all the color tables in some way" // "First and last may have been swapped" "by", "during", "in", "last", "next", "of", "until", ]); let year_or_day_of_month = SequenceExpr::default().then_kind_where(|kind| { if let TokenKind::Number(number) = &kind { let v = number.value.into_inner() as u32; (1500..=2500).contains(&v) || (1..=31).contains(&v) } else { false } }); // An Expr that matches either a plain month // Or an ambiguous month after a disambiguating word let month_expr = SequenceExpr::with(FirstMatchOf::new(vec![ Box::new(only_months), Box::new( SequenceExpr::with(before_month_sense_only) .then_whitespace() .then(ambiguous_months.clone()), ), Box::new( SequenceExpr::with(ambiguous_months) .then_whitespace() .then(year_or_day_of_month), ), ])); Self { expr: month_expr } } } impl ExprLinter for Months { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], src: &[char]) -> Option { // `find` which token is the month by seeing which tok's content (lowercased) is in ALL_MONTHS let month_tok = tokens.iter().find(|token| { let token_str = token.span.get_content_string(src); ALL_MONTHS.iter().any(|&m| m == token_str.to_lowercase()) })?; // Return None if no month token found // let month_tok = tokens.last().unwrap(); let month_ch = month_tok.span.get_content(src); if month_ch[0].is_uppercase() { return None; } let mut month_vec = month_ch.to_vec(); month_vec[0] = month_vec[0].to_ascii_uppercase(); Some(Lint { span: month_tok.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith(month_vec)], message: "Months should be written with a capital letter.".to_string(), priority: 126, }) } fn description(&self) -> &str { "Detects months written with a lowercase first letter." } } #[cfg(test)] mod tests { use super::Months; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_in_august() { assert_suggestion_result( "I worked for WebstaurantStore doing Quality Assurance Automation and am now transitioning to a new graduate developer role at BNY Mellon, starting in august.", Months::default(), "I worked for WebstaurantStore doing Quality Assurance Automation and am now transitioning to a new graduate developer role at BNY Mellon, starting in August.", ); } #[test] fn fix_in_march() { assert_suggestion_result( "This game was originally written by me in march 2000.", Months::default(), "This game was originally written by me in March 2000.", ); } #[test] fn fix_in_may() { assert_suggestion_result( "typo in may 2024 updates", Months::default(), "typo in May 2024 updates", ); } #[test] fn fix_last_august() { assert_suggestion_result( "since last august smart has been leading talks to open up japan", Months::default(), "since last August smart has been leading talks to open up japan", ); } #[test] fn fix_last_may() { assert_suggestion_result( "I have a 2019 mini countryman that i purchased last may.", Months::default(), "I have a 2019 mini countryman that i purchased last May.", ); } #[test] fn fix_of_august() { assert_suggestion_result( "change abbreviation of august for Indonesian locale", Months::default(), "change abbreviation of August for Indonesian locale", ) } #[test] fn fix_march_2019() { assert_suggestion_result( "How to disable drop cap today (late march 2019)", Months::default(), "How to disable drop cap today (late March 2019)", ); } #[test] fn fix_may_2022() { assert_suggestion_result( "That will be ende from 30 may 2022.", Months::default(), "That will be ende from 30 May 2022.", ); } #[test] fn fix_days() { assert_suggestion_result( "Between march 15 and august 27.", Months::default(), "Between March 15 and August 27.", ); } } ================================================ FILE: harper-core/src/linting/more_adjective.rs ================================================ use itertools::Itertools; use crate::{ char_ext::CharExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, {CharStringExt, Lint, Token, TokenStringExt}, }; pub struct MoreAdjective { expr: SequenceExpr, dict: D, } impl MoreAdjective where D: Dictionary, { pub fn new(dict: D) -> Self { Self { expr: SequenceExpr::word_set(&["more", "most"]) .t_ws() .then_positive_adjective(), dict, } } fn add_valid_candidate(&self, candidates: &mut Vec, candidate: String) -> bool { if let Some(metadata) = self.dict.get_word_metadata_str(&candidate) && (metadata.is_comparative_adjective() || metadata.is_superlative_adjective()) { candidates.push(candidate); true } else { false } } } impl ExprLinter for MoreAdjective where D: Dictionary, { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { // Check invariants just in case the Expr changes if toks.len() != 3 || !toks[1].kind.is_whitespace() || !toks[2].kind.is_positive_adjective() { return None; } let phrase = toks.span()?; enum Degree { Comparative, Superlative, } let degree_tok = &toks[0]; let degree_chars = degree_tok.span.get_content(src); let degree = if degree_chars.eq_ignore_ascii_case_str("more") { Degree::Comparative } else if degree_chars.eq_ignore_ascii_case_str("most") { Degree::Superlative } else { return None; }; let ending = match degree { Degree::Comparative => "er", Degree::Superlative => "est", }; let adj_tok = &toks[2]; let adj_span = adj_tok.span; let adj_chars = adj_span.get_content(src); let adj_str = adj_span.get_content_string(src); if adj_chars.len() < 2 { return None; } // "humaner" = "more humane", not "more human" if adj_str == "human" { return None; } let mut candidates: Vec = vec![]; // Only a handful of adjectives are irregular let new_candidates = match adj_str.as_str() { "bad" => match degree { Degree::Comparative => Some(&["worse"][..]), Degree::Superlative => Some(&["worst"][..]), }, "good" => match degree { Degree::Comparative => Some(&["better"][..]), Degree::Superlative => Some(&["best"][..]), }, "far" => match degree { Degree::Comparative => Some(&["further", "farther"][..]), Degree::Superlative => Some(&["furthest", "farthest"][..]), }, _ => None, }; if let Some(irregulars) = new_candidates { candidates.extend(irregulars.iter().map(|c| c.to_string())); } // Just add the ending: smart -> smarter/smartest self.add_valid_candidate(&mut candidates, format!("{}{}", adj_str, ending)); // Double consonant: big -> bigger/biggest let penult = adj_chars[adj_chars.len() - 2]; let last = adj_chars[adj_chars.len() - 1]; if penult.is_vowel() && !last.is_vowel() { self.add_valid_candidate(&mut candidates, format!("{}{}{}", adj_str, last, ending)); } if last == 'y' { // smelly -> smellier/smelliest self.add_valid_candidate( &mut candidates, format!( "{}i{}", &adj_chars[0..adj_chars.len() - 1].iter().collect::(), ending ), ); } else if last == 'e' { // cute -> cuter/cutest self.add_valid_candidate( &mut candidates, format!( "{}{}", &adj_chars[0..adj_chars.len() - 1].iter().collect::(), ending ), ); } if candidates.is_empty() { return None; } let suggestions = candidates .iter() .map(|c| { Suggestion::replace_with_match_case( c.chars().collect_vec(), phrase.get_content(src), ) }) .collect::>(); Some(Lint { span: phrase, lint_kind: LintKind::Style, suggestions, message: "This is not an error, but an inflected form of this adjective also exists" .to_string(), ..Default::default() }) } fn description(&self) -> &str { "Looks for comparative adjective constructions with `more` than could use inflected forms." } } #[cfg(test)] mod tests { use super::*; use crate::linting::tests::{ assert_good_and_bad_suggestions, assert_no_lints, assert_suggestion_result, }; use crate::spell::FstDictionary; // True positives #[test] fn add_er() { assert_suggestion_result( "The red car is more fast.", MoreAdjective::new(FstDictionary::curated()), "The red car is faster.", ); } #[test] fn add_r() { assert_suggestion_result( "The fluffy one is more cute.", MoreAdjective::new(FstDictionary::curated()), "The fluffy one is cuter.", ); } #[test] fn double_final_consonant() { assert_suggestion_result( "You'll find out when you're more big.", MoreAdjective::new(FstDictionary::curated()), "You'll find out when you're bigger.", ) } #[test] fn final_y() { assert_suggestion_result( "That one was even more smelly!", MoreAdjective::new(FstDictionary::curated()), "That one was even smellier!", ); } #[test] fn irregular_good() { assert_suggestion_result( "I bet you couldn't do more good.", MoreAdjective::new(FstDictionary::curated()), "I bet you couldn't do better.", ); } #[test] fn irregular_far() { assert_good_and_bad_suggestions( "Is it much more far?", MoreAdjective::new(FstDictionary::curated()), &["Is it much further?", "Is it much farther?"], &[], ); } #[test] fn humane() { assert_suggestion_result( "That Klingon is more humane than the humans!", MoreAdjective::new(FstDictionary::curated()), "That Klingon is humaner than the humans!", ); } // False positives #[test] fn dont_flag_more_time() { assert_no_lints( "I need more time.", MoreAdjective::new(FstDictionary::curated()), ); } #[test] fn dont_flag_more_model() { assert_no_lints( "Expanded access to more model architectures", MoreAdjective::new(FstDictionary::curated()), ); } #[test] fn dont_flag_more_human() { assert_no_lints( "I am more human than machine.", MoreAdjective::new(FstDictionary::curated()), ); } #[test] fn dont_flag_more_battle() { assert_no_lints( "and has more battle-tested defaults", MoreAdjective::new(FstDictionary::curated()), ); } #[test] fn dont_flag_more_like() { assert_no_lints( "It's more like a suggestion than a mistake.", MoreAdjective::new(FstDictionary::curated()), ); } #[test] fn dont_flag_more_ground() { assert_no_lints( "This E2E security scan covers more ground", MoreAdjective::new(FstDictionary::curated()), ); } #[test] fn dont_flag_more_foreign() { assert_no_lints( "There are more foreign visitors this year.", MoreAdjective::new(FstDictionary::curated()), ); } } ================================================ FILE: harper-core/src/linting/more_better.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::token::Token; use crate::token_string_ext::TokenStringExt; pub struct MoreBetter { expr: SequenceExpr, } impl Default for MoreBetter { fn default() -> Self { Self { expr: SequenceExpr::any_of(vec![ Box::new( SequenceExpr::default() .t_aco("more") .t_ws() .then_comparative_adjective(), ), Box::new( SequenceExpr::default() .t_aco("most") .t_ws() .then_superlative_adjective(), ), ]), } } } impl ExprLinter for MoreBetter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let phrase_span = toks.span()?; let degree_str = toks.first()?.span.get_content_string(src); let adj_span = toks.last()?.span; let suggestion = Suggestion::replace_with_match_case( adj_span.get_content(src).to_vec(), phrase_span.get_content(src), ); let message = format!( "{} is already in the {} form, the {} is redundant", adj_span.get_content_string(src), if degree_str.eq_ignore_ascii_case("more") { "comparative" } else { "superlative" }, degree_str, ); Some(Lint { span: phrase_span, lint_kind: LintKind::Redundancy, suggestions: vec![suggestion], message, ..Default::default() }) } fn description(&self) -> &'static str { "Finds redundant paring of `more` or `most` with adjectives already in the comparative or superlative form." } } #[cfg(test)] mod tests { use super::MoreBetter; use crate::linting::tests::assert_suggestion_result; #[test] fn flag_most_biggest() { assert_suggestion_result("Most biggest", MoreBetter::default(), "Biggest"); } #[test] fn flag_more_better_and_more_better() { assert_suggestion_result( "More bigger is more better", MoreBetter::default(), "Bigger is better", ); } } ================================================ FILE: harper-core/src/linting/most_number.rs ================================================ use crate::expr::All; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct MostNumber { expr: All, } impl Default for MostNumber { fn default() -> Self { Self { expr: All::new(vec![ // Main pattern Box::new( SequenceExpr::default() .t_aco("most") .t_ws() .then_word_set(&["amount", "number"]), ), // Context pattern Box::new( SequenceExpr::anything() .then_anything() .then_anything() .then_anything() .t_aco("of"), ), ]), } } } impl ExprLinter for MostNumber { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], source: &[char]) -> Option { let most_amt_num_span = toks[0..3].span()?; let noun_string = toks[2].span.get_content_string(source); let superlatives = if noun_string == "amount" { vec!["largest", "greatest", "maximum"] } else { vec!["highest", "largest", "maximum"] }; let suggestions = superlatives .into_iter() .map(|superlative| { Suggestion::replace_with_match_case( format!("{superlative} {noun_string}").chars().collect(), most_amt_num_span.get_content(source), ) }) .collect(); Some(Lint { span: most_amt_num_span, lint_kind: LintKind::Miscellaneous, suggestions, message: format!( "`Most` is not standard before `{}`.", toks[2].span.get_content_string(source) ), priority: 31, }) } fn description(&self) -> &str { "Corrects `most number` and `most amount`" } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::MostNumber; #[test] fn corrects_most_number() { assert_suggestion_result( "Find artists that have been on Spotify the most number of times.", MostNumber::default(), "Find artists that have been on Spotify the highest number of times.", ); } #[test] #[ignore = "replace_with_match_case currently produces 'GreatEst'"] fn corrects_most_amount_title_case() { assert_suggestion_result( "Area of Container with the Most Amount of Water", MostNumber::default(), "Area of Container with the Greatest Amount of Water", ); } #[test] fn corrects_most_amount() { assert_suggestion_result( "I just wanted to make sure it's good for the most amount of people, not just what I like.", MostNumber::default(), "I just wanted to make sure it's good for the greatest amount of people, not just what I like.", ); } #[test] fn dont_correct_most_number_without_context() { assert_lint_count( "The random non-sequential nature should prevent most number gaming/sniping/lunging.", MostNumber::default(), 0, ); } #[test] fn corrects_most_amount_with_maximum() { assert_suggestion_result( "If you want to support the most amount of different architectures ...", MostNumber::default(), "If you want to support the maximum amount of different architectures ...", ); } } ================================================ FILE: harper-core/src/linting/most_of_the_times.rs ================================================ use crate::expr::{Expr, FixedPhrase, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, LintKind, Suggestion}; use crate::patterns::Word; use crate::{Lint, Token}; pub struct MostOfTheTimes { expr: SequenceExpr, } impl Default for MostOfTheTimes { fn default() -> Self { Self { expr: SequenceExpr::any_of(vec![ Box::new(FixedPhrase::from_phrase("a lot")), Box::new(Word::new("most")), ]) .t_ws() .then_fixed_phrase("of the times"), } } } impl ExprLinter for MostOfTheTimes { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let span = toks.last()?.span; Some(Lint { span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( "time".chars().collect(), span.get_content(src), )], message: "Singular `time` is usually the correct form in this context.".to_string(), priority: 32, }) } fn description(&self) -> &str { "Corrects `a lot of the times` and `most of the times` to use singular `time`." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::MostOfTheTimes; #[test] fn hangs_forever() { assert_suggestion_result( "restic backup hangs forever most of the times · Issue #2834", MostOfTheTimes::default(), "restic backup hangs forever most of the time · Issue #2834", ); } #[test] fn options_are_ignored() { assert_suggestion_result( "but other options like device and options are ignored most of the times", MostOfTheTimes::default(), "but other options like device and options are ignored most of the time", ); } #[test] fn parenthesized() { assert_suggestion_result( "prompted html code gets (most of the times) read by copilot but is not displayed.", MostOfTheTimes::default(), "prompted html code gets (most of the time) read by copilot but is not displayed.", ); } #[test] fn i_cant_play() { assert_suggestion_result( "I cannot get the version 1.0 without c so I cant play a lot of the times with other people", MostOfTheTimes::default(), "I cannot get the version 1.0 without c so I cant play a lot of the time with other people", ); } } ================================================ FILE: harper-core/src/linting/multiple_frequency_adverbs.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, expr_linter::Sentence}, }; pub struct MultipleFrequencyAdverbs { expr: SequenceExpr, } impl Default for MultipleFrequencyAdverbs { fn default() -> Self { let adverb_of_frequency = |t: &Token, s: &[char]| { t.kind.is_frequency_adverb() && !t .span .get_content(s) .eq_ignore_ascii_case_chars(&['o', 'n', 'l', 'y']) }; Self { expr: SequenceExpr::default() .then(adverb_of_frequency) .then_optional_comma() .t_ws() .then(adverb_of_frequency), } } } impl ExprLinter for MultipleFrequencyAdverbs { // We have to use `Sentence` if our `Expr` includes commas! type Unit = Sentence; fn description(&self) -> &str { "Looks for adjacent adverbs of frequency, which will be either redundant or contradictory." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let (adv1tok, adv2tok) = (toks.first()?, toks.last()?); let (adv1span, adv2span) = (adv1tok.span, adv2tok.span); let (adv1ch, adv2ch) = (adv1span.get_content(src), adv2span.get_content(src)); if !adv1ch.eq_ignore_ascii_case_chars(adv2ch) { Some(Lint { span: toks.span()?, lint_kind: LintKind::Usage, suggestions: vec![], message: format!( "The adverbs of frequency ‘{}’ and ‘{}’ are either redundant or contradictory", adv1ch.to_string(), adv2ch.to_string() ), ..Default::default() }) } else { None } } } #[cfg(test)] mod tests { use super::MultipleFrequencyAdverbs; use crate::linting::tests::assert_lint_count; #[test] fn often_never_without_comma() { assert_lint_count("People have often never even heard of nutrinos, but yeah, about 100 billion solar nutrinos are passing through your thumbnail every second. ", MultipleFrequencyAdverbs::default(), 1); } #[test] fn often_never_with_comma() { assert_lint_count("often, never", MultipleFrequencyAdverbs::default(), 1); } #[test] fn sometimes_never() { assert_lint_count( "Using @ directive in comments renders modal/portal that is sometimes never destroyed until app is closed.", MultipleFrequencyAdverbs::default(), 1, ); } #[test] fn usually_always() { assert_lint_count( "Unfortunately, I can't switch to Pip with Mamba (to avoid conda), which I usually always do.", MultipleFrequencyAdverbs::default(), 1, ); } #[test] fn sometimes_usually() { assert_lint_count( "I do my best to fix stuff when some issues pop up, but it sometimes usually doesn't work out.", MultipleFrequencyAdverbs::default(), 1, ); } } ================================================ FILE: harper-core/src/linting/multiple_sequential_pronouns.rs ================================================ use crate::{ expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, {Lint, Lrc, Token, TokenStringExt}, }; /// Linter that checks if multiple pronouns are being used right after each /// other. This is a common mistake to make during the revision process. pub struct MultipleSequentialPronouns { expr: SequenceExpr, } impl MultipleSequentialPronouns { fn new() -> Self { let pronouns = Lrc::new(|t: &Token, _s: &[char]| { t.kind.is_subject_pronoun() // e.g. I || t.kind.is_object_pronoun() // e.g. me || t.kind.is_possessive_pronoun() // e.g. mine || t.kind.is_possessive_determiner() // e.g. my }); Self { expr: SequenceExpr::with(pronouns.clone()) .then_one_or_more(SequenceExpr::whitespace().then(pronouns.clone())), } } } impl ExprLinter for MultipleSequentialPronouns { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let mut suggestions = Vec::new(); if matched_tokens.len() == 3 { let first_word_tok = &matched_tokens[0]; let second_word_tok = &matched_tokens[2]; let first_word_raw = first_word_tok.span.get_content(source); let second_word_raw = second_word_tok.span.get_content(source); // Bug 578: "I can lend you my car" - if 1st is object and second is possessive adjective, don't lint if first_word_tok.kind.is_object_pronoun() && second_word_tok.kind.is_possessive_determiner() { return None; } // Bug 724: "One told me they were able to begin reading" - if 1st is object ans second is subject, don't lint if first_word_tok.kind.is_object_pronoun() && second_word_tok.kind.is_subject_pronoun() { return None; } // US is a qualifier meaning American, so uppercase after a possessive is OK. // Likewise, IT means Information Technology, as in "our IT director" if first_word_tok.kind.is_possessive_determiner() && (second_word_raw == ['U', 'S'] || second_word_raw == ['I', 'T']) { return None; } // The same applies to uppercase before a subject pronoun if first_word_raw == ['U', 'S'] && second_word_tok.kind.is_subject_pronoun() { return None; } suggestions.push(Suggestion::ReplaceWith( matched_tokens[0].span.get_content(source).to_vec(), )); suggestions.push(Suggestion::ReplaceWith( matched_tokens[2].span.get_content(source).to_vec(), )); } Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Repetition, message: "There are too many personal pronouns in sequence here.".to_owned(), priority: 63, suggestions, }) } fn description(&self) -> &'static str { "When editing work to change point of view (i.e. first-person or third-person) it is common to add pronouns while neglecting to remove old ones. This rule catches cases where you have multiple disparate pronouns in sequence." } } impl Default for MultipleSequentialPronouns { fn default() -> Self { Self::new() } } #[cfg(test)] mod tests { use super::MultipleSequentialPronouns; use crate::linting::tests::assert_lint_count; #[test] fn can_detect_two_pronouns() { assert_lint_count( "...little bit about my I want to do.", MultipleSequentialPronouns::new(), 1, ) } #[test] fn can_detect_three_pronouns() { assert_lint_count( "...little bit about my I you want to do.", MultipleSequentialPronouns::new(), 1, ) } #[test] fn allows_single_pronouns() { assert_lint_count( "...little bit about I want to do.", MultipleSequentialPronouns::new(), 0, ) } #[test] fn detects_multiple_pronouns_at_end() { assert_lint_count( "...I need to explain this to you them.", MultipleSequentialPronouns::new(), 1, ) } #[test] fn comma_separated() { assert_lint_count("To prove it, we...", MultipleSequentialPronouns::new(), 0) } #[test] fn dont_flag_578() { assert_lint_count( "I can lend you my car.", MultipleSequentialPronouns::new(), 0, ) } #[test] fn dont_flag_724() { assert_lint_count( "One told me they were able to begin reading.", MultipleSequentialPronouns::new(), 0, ) } #[test] fn dont_flag_us() { assert_lint_count( "Take the plunge and pull plug from their US tech.", MultipleSequentialPronouns::new(), 0, ) } #[test] fn dont_flag_my_us_your_us() { assert_lint_count( "My US passport looks different from your US passport.", MultipleSequentialPronouns::new(), 0, ) } #[test] fn dont_flag_subject_after_usa() { assert_lint_count( "And if it’s manufactured in the US it may have more automation.", MultipleSequentialPronouns::new(), 0, ) } #[test] fn dont_flag_case_insensitive_cost_him_his_life() { assert_lint_count( "to the point where it very well likely cost Him his life", MultipleSequentialPronouns::new(), 0, ) } #[test] fn dont_flag_2870() { assert_lint_count( "their sales derp was just having none of it when our IT director told him, point blank, that we're not moving anything into the cloud", MultipleSequentialPronouns::new(), 0, ) } } ================================================ FILE: harper-core/src/linting/nail_on_the_head.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct NailOnTheHead { expr: SequenceExpr, } impl Default for NailOnTheHead { fn default() -> Self { let mis = WordSet::new(&["hat", "had", "hit", "hid"]); let pattern = SequenceExpr::default() .t_aco("nail") .then_whitespace() .t_aco("on") .then_whitespace() .t_aco("the") .then_whitespace() .then(mis); Self { expr: pattern } } } impl ExprLinter for NailOnTheHead { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _src: &[char]) -> Option { let offender = toks.last()?; Some(Lint { span: offender.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith("head".chars().collect())], message: "Did you mean `head`?".to_owned(), priority: 45, }) } fn description(&self) -> &str { "Replaces hat/had/hit/hid in the idiom `nail on the head` with `head`." } } #[cfg(test)] mod tests { use super::NailOnTheHead; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fix_hat() { assert_suggestion_result( "She hit the nail on the hat.", NailOnTheHead::default(), "She hit the nail on the head.", ); } #[test] fn fix_had() { assert_suggestion_result( "You really put the nail on the had with that comment.", NailOnTheHead::default(), "You really put the nail on the head with that comment.", ); } #[test] fn fix_hit() { assert_suggestion_result( "They hit the nail on the hit regarding our problem.", NailOnTheHead::default(), "They hit the nail on the head regarding our problem.", ); } #[test] fn fix_hid() { assert_suggestion_result( "The article nails the nail on the hid this time.", NailOnTheHead::default(), "The article nails the nail on the head this time.", ); } #[test] fn ignore_correct() { assert_lint_count("She hit the nail on the head.", NailOnTheHead::default(), 0); } } ================================================ FILE: harper-core/src/linting/need_to_noun.rs ================================================ use crate::Token; use crate::char_string::char_string; use crate::expr::{All, Expr, LongestMatchOf, OwnedExprExt, SequenceExpr, UnlessStep}; use crate::patterns::DerivedFrom; use crate::patterns::WordSet; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct NeedToNoun { expr: All, } impl Default for NeedToNoun { fn default() -> Self { let postfix_exceptions = LongestMatchOf::new(vec![ Box::new(|tok: &Token, _: &[char]| { tok.kind.is_adverb() || tok.kind.is_determiner() || tok.kind.is_unlintable() || tok.kind.is_pronoun() }), Box::new(WordSet::new(&["about", "into", "it"])), ]); let exceptions = SequenceExpr::anything() .t_any() .t_any() .t_any() .then_word_set(&["be", "match"]); let a = SequenceExpr::default() .then_kind_where(|kind| kind.is_nominal() && !kind.is_likely_homograph()) .t_ws() .then_unless(postfix_exceptions); // Bare words after infinitive `to` are the hardest cases to disambiguate. // If the token is a noun/verb homograph, prefer not linting over inserting // `the` into a potentially valid verb phrase. let b = SequenceExpr::default().then_kind_where(|kind| { kind.is_nominal() && !kind.is_verb() && !kind.is_likely_homograph() }); let expr = SequenceExpr::with(DerivedFrom::new_from_str("need")) .t_ws() .t_aco("to") .t_ws() .then(a.or(b)); Self { expr: expr.and(UnlessStep::new(exceptions, |_: &Token, _: &[char]| true)), } } } impl ExprLinter for NeedToNoun { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let to_idx = 2; let to_token = &matched_tokens[to_idx]; let noun_idx = 4; let noun_token = &matched_tokens[noun_idx]; let noun_text = noun_token.span.get_content_string(source); let span = to_token.span; Some(Lint { span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::ReplaceWith(char_string!("the").to_vec())], message: format!( "`need to` should be followed by a verb, not a noun or pronoun like `{noun_text}`." ), priority: 48, }) } fn description(&self) -> &'static str { "Flags `need to` when it is immediately followed by a noun, which usually means the infinitive verb is missing." } } #[cfg(test)] mod tests { use super::NeedToNoun; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn flags_need_to_noun() { assert_suggestion_result( "I need to information now.", NeedToNoun::default(), "I need the information now.", ); } #[test] fn allows_need_to_verb() { assert_lint_count("I need to leave now.", NeedToNoun::default(), 0); } #[test] fn allows_need_to_finish() { assert_lint_count( "I need to finish this report by tomorrow.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_call() { assert_lint_count( "You need to call your mother tonight.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_talk() { assert_lint_count( "We need to talk about the budget.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_leave() { assert_lint_count( "They need to leave early to catch the train.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_practice() { assert_lint_count( "She needs to practice her German more often.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_fix() { assert_lint_count( "He needs to fix his bike before the weekend.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_decide() { assert_lint_count( "We need to decide where to go for dinner.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_update() { assert_lint_count( "You need to update your password.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_take() { assert_lint_count( "I need to take a break and get some fresh air.", NeedToNoun::default(), 0, ); } #[test] fn allows_need_to_clean() { assert_lint_count( "They need to clean the house before guests arrive.", NeedToNoun::default(), 0, ); } #[test] fn avoids_false_positive_for_need_to_verify() { assert_lint_count( "I need to verify the expenses before submission.", NeedToNoun::default(), 0, ); } #[test] fn flags_need_to_compiler() { assert_suggestion_result( "We simply don't need to compiler to do as much work anymore.", NeedToNoun::default(), "We simply don't need the compiler to do as much work anymore.", ); } #[test] fn flags_need_to_verification() { assert_suggestion_result( "I need to verification before logging in.", NeedToNoun::default(), "I need the verification before logging in.", ); } #[test] fn allows_need_to_report() { assert_no_lints( "We need to report before the meeting starts.", NeedToNoun::default(), ); } #[test] fn allows_need_to_password() { assert_no_lints( "You need to password to access the server.", NeedToNoun::default(), ); } #[test] fn flags_need_to_data() { assert_suggestion_result( "They need to data analyzed by tomorrow.", NeedToNoun::default(), "They need the data analyzed by tomorrow.", ); } #[test] fn flags_need_to_approval() { assert_suggestion_result( "She will need to approval of her manager first.", NeedToNoun::default(), "She will need the approval of her manager first.", ); } #[test] fn allows_need_to_backup() { assert_no_lints( "We might need to backup if the main system fails.", NeedToNoun::default(), ); } #[test] fn allows_need_to_permit() { assert_no_lints( "He didn’t realize he would need to permit to film there.", NeedToNoun::default(), ); } #[test] fn allows_need_to_tools() { assert_no_lints( "You’ll need to right tools to fix that.", NeedToNoun::default(), ); } #[test] fn allows_need_to_context() { assert_no_lints( "We need to context to make sense of his decision.", NeedToNoun::default(), ); } #[test] fn allows_need_to_funds() { assert_no_lints( "They need to funds released before construction begins.", NeedToNoun::default(), ); } #[test] fn allows_need_to_silence() { assert_no_lints("I need to silence to think clearly.", NeedToNoun::default()); } #[test] fn flags_needs_to_approval() { assert_suggestion_result( "She needs to approval from her advisor.", NeedToNoun::default(), "She needs the approval from her advisor.", ); } #[test] fn avoids_false_positive_for_needs_to_coordinate() { assert_lint_count( "She needs to collaborate with everyone on the plan.", NeedToNoun::default(), 0, ); } #[test] fn flags_needs_to_verification() { assert_suggestion_result( "He needs to verification ready before the audit.", NeedToNoun::default(), "He needs the verification ready before the audit.", ); } #[test] fn allows_needs_to_finalize() { assert_lint_count( "She needs to finalize the schedule.", NeedToNoun::default(), 0, ); } #[test] fn allows_needed_to_permit() { assert_no_lints( "They needed to permit before entering the site.", NeedToNoun::default(), ); } #[test] fn avoids_false_positive_for_needed_to_explain() { assert_lint_count( "They needed to explain the new policy carefully.", NeedToNoun::default(), 0, ); } #[test] fn catches_false_negative_for_needed_to_authorization() { assert_suggestion_result( "They needed to authorization before proceeding.", NeedToNoun::default(), "They needed the authorization before proceeding.", ); } #[test] fn allows_needed_to_file() { assert_lint_count( "They needed to file the paperwork before noon.", NeedToNoun::default(), 0, ); } #[test] fn flags_needing_to_documentation() { assert_suggestion_result( "Needing to documentation slowed the entire process.", NeedToNoun::default(), "Needing the documentation slowed the entire process.", ); } #[test] fn avoids_false_positive_for_needing_to_calibrate() { assert_lint_count( "Needing to calibrate the equipment delayed us slightly.", NeedToNoun::default(), 0, ); } #[test] fn catches_false_negative_for_needing_to_confirmation() { assert_suggestion_result( "Needing to confirmation from legal stalled the launch.", NeedToNoun::default(), "Needing the confirmation from legal stalled the launch.", ); } #[test] fn allows_needing_to_call() { assert_lint_count( "Needing to call your mother is stressful.", NeedToNoun::default(), 0, ); } #[test] fn allows_issue_2252() { assert_no_lints("Things I need to do today:", NeedToNoun::default()); } #[test] fn allows_install() { assert_no_lints( "You need to install it separately, as it's a standalone application.", NeedToNoun::default(), ); } #[test] fn allows_lay() { assert_no_lints( "Okay, this is a long one, but I feel like I need to lay everything out.", NeedToNoun::default(), ); } #[test] fn allows_overcome() { assert_no_lints( "We believe every family deserves the opportunity to flourish, and we are committed to providing the resources they need to overcome adversity.", NeedToNoun::default(), ); } #[test] fn allows_need_to_run_into_2433() { assert_no_lints( "So that they don't need to run into this problem in the future.", NeedToNoun::default(), ); } #[test] fn allows_need_to_match_2446() { assert_no_lints( "You don't need to match string errors explicitly.", NeedToNoun::default(), ); } #[test] fn allows_need_to_match_exactly_2446() { assert_no_lints("They need to match exactly.", NeedToNoun::default()); } #[test] fn allows_need_to_use_php_code_fuzz() { assert_no_lints( "To display the custom field data on your website, you'll likely need to use PHP code within your theme files.", NeedToNoun::default(), ); } #[test] fn allows_need_to_display_images_fuzz() { assert_no_lints( "I'm building a photography portfolio site for a client and need to display images in a responsive gallery.", NeedToNoun::default(), ); } #[test] fn allows_need_to_build_brighter_futures_fuzz() { assert_no_lints( "At Haven House, our mission is to provide families with the resources they need to build brighter futures.", NeedToNoun::default(), ); } #[test] fn allows_need_to_redefine_success_fuzz() { assert_no_lints( "We need to redefine success to include wellbeing and sustainability.", NeedToNoun::default(), ); } #[test] fn allows_need_to_shift_from_fuzz() { assert_no_lints( "We need to shift from a deficit model to an abundance model.", NeedToNoun::default(), ); } #[test] fn allows_need_to_research_and_choose_fuzz() { assert_no_lints( "This means you need to research and choose adapters carefully.", NeedToNoun::default(), ); } #[test] fn allows_need_to_model_healthy_habits_fuzz() { assert_no_lints( "Leaders need to model healthy work habits and create a safe space for employees.", NeedToNoun::default(), ); } } ================================================ FILE: harper-core/src/linting/no_french_spaces.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::TokenStringExt; use crate::{Document, TokenKind}; #[derive(Debug, Default)] pub struct NoFrenchSpaces; impl Linter for NoFrenchSpaces { fn lint(&mut self, document: &Document) -> Vec { let mut output = Vec::new(); for sentence in document.iter_sentences() { if let Some(space_idx) = sentence.iter_space_indices().next() { let space = &sentence[space_idx]; if matches!(space.kind, TokenKind::Space(0)) { continue; } if space_idx == 0 && space.span.len() != 1 { output.push(Lint { span: space.span, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::ReplaceWith(vec![' '])], message: "French spaces are generally not recommended.".to_owned(), priority: 15, }) } } } output } fn description(&self) -> &str { "Stops users from accidentally inserting French spaces." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::NoFrenchSpaces; #[test] fn fixes_basic() { assert_suggestion_result( "This is a short sentence. This is another short sentence.", NoFrenchSpaces::default(), "This is a short sentence. This is another short sentence.", ); } } ================================================ FILE: harper-core/src/linting/no_longer.rs ================================================ use crate::{ Lint, Token, TokenKind, expr::{All, Expr, OwnedExprExt, SequenceExpr}, linting::{Chunk, ExprLinter, LintKind, Suggestion}, }; pub struct NoLonger { expr: All, } impl Default for NoLonger { fn default() -> Self { Self { expr: SequenceExpr::aco("not") .t_ws() .t_aco("longer") .then_optional(SequenceExpr::default().t_ws().then_kind_any( &[ TokenKind::is_verb_lemma, TokenKind::is_verb_third_person_singular_present_form, TokenKind::is_verb_past_participle_form, TokenKind::is_verb_progressive_form, TokenKind::is_adjective, ][..], )) .and_not( SequenceExpr::anything() .t_any() .t_any() .t_any() .t_aco("than"), ), } } } impl ExprLinter for NoLonger { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn description(&self) -> &str { "Corrects `not longer` when it should be `no longer`." } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { Some(Lint { span: toks[0].span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "no", toks[0].span.get_content(src), )], message: "The correct expression is `no longer`.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::NoLonger; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // Don't flag #[test] fn ignore_than() { assert_no_lints("My arm is not longer than my leg.", NoLonger::default()) } // Flag not longer #[test] fn fix_can_modal() { // TODO: would an improvement always be? - no longer can -> can no longer assert_suggestion_result( "and I've found out that I not longer can launch Kitty from the menus", NoLonger::default(), "and I've found out that I no longer can launch Kitty from the menus", ); } #[test] fn fix_done_past_participle() { assert_suggestion_result( "I've noticed that the ML stuff is not longer done on the more recent photos.", NoLonger::default(), "I've noticed that the ML stuff is no longer done on the more recent photos.", ); } #[test] fn fix_exist() { assert_suggestion_result( "Vendoring means that the transitive dependencies do not longer exist from the point of view of the consumer.", NoLonger::default(), "Vendoring means that the transitive dependencies do no longer exist from the point of view of the consumer.", ); } #[test] fn fix_exists_3rd_person_singular_present() { assert_suggestion_result( "this script is mentioned in the RF3 Readme but the script not longer exists", NoLonger::default(), "this script is mentioned in the RF3 Readme but the script no longer exists", ); } #[test] fn fix_render() { assert_suggestion_result( "auto comments will not longer render annotations in such a way as to make them valid annotation links", NoLonger::default(), "auto comments will no longer render annotations in such a way as to make them valid annotation links", ); } #[test] fn fix_saved_regular_past() { assert_suggestion_result( "edit notes are not longer saved on mobile", NoLonger::default(), "edit notes are no longer saved on mobile", ); } #[test] fn fix_saving_present_participle() { assert_suggestion_result( "After Updating to 4.3.2 from 4.2.1 the JSON Editor is not longer saving the metadata.", NoLonger::default(), "After Updating to 4.3.2 from 4.2.1 the JSON Editor is no longer saving the metadata.", ); } #[test] fn fix_written_past_participle() { assert_suggestion_result( "I get this error and the fasta file is not longer written", NoLonger::default(), "I get this error and the fasta file is no longer written", ); } // Flag not longer #[test] fn fix_able() { assert_suggestion_result( "I am not longer able to set multi-cursors in Zed 0.190.6.", NoLonger::default(), "I am no longer able to set multi-cursors in Zed 0.190.6.", ); } #[test] fn fix_affordable() { assert_suggestion_result( "No not Oakland, it's not longer affordable.", NoLonger::default(), "No not Oakland, it's no longer affordable.", ); } #[test] fn fix_bad() { assert_suggestion_result( "How many times does this have to happen before its not longer bad luck?", NoLonger::default(), "How many times does this have to happen before its no longer bad luck?", ); } #[test] fn fix_best() { assert_suggestion_result( "AWS Java V1 is not longer best practice as specified in this Github page", NoLonger::default(), "AWS Java V1 is no longer best practice as specified in this Github page", ); } #[test] fn fix_effective() { assert_suggestion_result( "when you delete those keys from the dict, it is not longer effective", NoLonger::default(), "when you delete those keys from the dict, it is no longer effective", ); } #[test] fn fix_empty() { assert_suggestion_result( "not only set as username, it sets common name as well and is not longer empty", NoLonger::default(), "not only set as username, it sets common name as well and is no longer empty", ); } #[test] fn fix_enough() { assert_suggestion_result( "the message body is not longer enough", NoLonger::default(), "the message body is no longer enough", ); } #[test] fn fix_equal() { assert_suggestion_result( "once the size of the current batch is not longer equal to batch_size , I used the temporary batch", NoLonger::default(), "once the size of the current batch is no longer equal to batch_size , I used the temporary batch", ); } #[test] fn fix_equivalent() { assert_suggestion_result( "the lambda is not longer equivalent to how std::isspace would behave as a unary predicate", NoLonger::default(), "the lambda is no longer equivalent to how std::isspace would behave as a unary predicate", ); } #[test] fn fix_free() { assert_suggestion_result( "so if i understand it correct, myteslamate is not longer free? ", NoLonger::default(), "so if i understand it correct, myteslamate is no longer free? ", ); } #[test] fn fix_good() { assert_suggestion_result( "Just in case that link is not longer good I'll reproduce the code here.", NoLonger::default(), "Just in case that link is no longer good I'll reproduce the code here.", ); } #[test] fn fix_near() { assert_suggestion_result( "reminder that they are not longer near each other", NoLonger::default(), "reminder that they are no longer near each other", ); } #[test] fn fix_open() { assert_suggestion_result( "removing old breakpoints from a project which was not longer open", NoLonger::default(), "removing old breakpoints from a project which was no longer open", ); } #[test] fn fix_possible() { assert_suggestion_result( "As far as I can set tell it is not longer possible to set these programmatically.", NoLonger::default(), "As far as I can set tell it is no longer possible to set these programmatically.", ); } #[test] fn fix_relevant() { assert_suggestion_result( "individual remuneration is not longer relevant as we can produce enough", NoLonger::default(), "individual remuneration is no longer relevant as we can produce enough", ); } #[test] fn fix_sufficient() { assert_suggestion_result( "the fichier.close() command is not longer sufficient to close the file", NoLonger::default(), "the fichier.close() command is no longer sufficient to close the file", ); } } ================================================ FILE: harper-core/src/linting/no_match_for.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenStringExt, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{InflectionOfBe, WordSet}, }; pub struct NoMatchFor { expr: SequenceExpr, } impl Default for NoMatchFor { fn default() -> Self { let pre_context = FirstMatchOf::new(vec![ Box::new(InflectionOfBe::default()), Box::new(WordSet::new(&[ "I'm", "we're", "you're", "he's", "she's", "it's", "they're", "Im", "were", "youre", "hes", "shes", "its", "theyre", ])), ]); let expr = SequenceExpr::with(pre_context) .then_whitespace() .t_aco("no") .then_whitespace() .t_aco("match") .then_whitespace() .then_preposition(); Self { expr } } } impl ExprLinter for NoMatchFor { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let prep_tok = toks.last()?; let prep_chars = prep_tok.span.get_content(src); if prep_chars.eq_ignore_ascii_case_chars(&['f', 'o', 'r']) { return None; } let phrase_toks = &toks[2..]; let phrase_span = phrase_toks.span()?; let suggestion = Suggestion::replace_with_match_case_str("no match for", phrase_span.get_content(src)); Some(Lint { span: phrase_span, lint_kind: LintKind::WordChoice, suggestions: vec![suggestion], message: "If you mean the idiom, it's `no match for`.".to_owned(), priority: 55, }) } fn description(&self) -> &str { "No match for" } } #[cfg(test)] pub mod tests { use super::NoMatchFor; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fix_against() { assert_suggestion_result( "Erlang was no match against my sweeping gale.", NoMatchFor::default(), "Erlang was no match for my sweeping gale.", ); } #[test] fn fix_to() { assert_suggestion_result( "My BW5 was no match to his BW7.", NoMatchFor::default(), "My BW5 was no match for his BW7.", ); } #[test] fn fix_of() { assert_suggestion_result( "This Attack Plane Was No Match Of Me So I Did This To Him", NoMatchFor::default(), "This Attack Plane Was No Match For Me So I Did This To Him", ); } #[test] fn fix_its_to() { assert_suggestion_result( "cuz AI is bull crap and its no match to human voice", NoMatchFor::default(), "cuz AI is bull crap and its no match for human voice", ); } #[test] fn fix_im_to() { assert_suggestion_result( "Im no match to you but like let me no what u think", NoMatchFor::default(), "Im no match for you but like let me no what u think", ); } #[test] fn theyre_to() { assert_suggestion_result( "Theyre no match to late 60s early 70s sansuis.", NoMatchFor::default(), "Theyre no match for late 60s early 70s sansuis.", ); } #[test] fn fix_hes_to() { assert_suggestion_result( "Even ouki on drinks with renpa said hes no match to him.", NoMatchFor::default(), "Even ouki on drinks with renpa said hes no match for him.", ); } #[test] fn fix_shes_to() { assert_suggestion_result( "Izma tries to struggle but she's no match to your superior strength", NoMatchFor::default(), "Izma tries to struggle but she's no match for your superior strength", ); } #[test] fn dont_fix_for() { assert_lint_count( "Type to search appears even there is no match for search term when autoFocus is true.", NoMatchFor::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/no_oxford_comma.rs ================================================ use crate::expr::ExprExt; use crate::expr::SequenceExpr; use crate::{Document, Token, TokenStringExt, patterns::NominalPhrase}; use super::{Lint, LintKind, Linter, Suggestion}; pub struct NoOxfordComma { expr: SequenceExpr, } impl NoOxfordComma { pub fn new() -> Self { Self { expr: { let this = { let this = SequenceExpr::default(); this.then(NominalPhrase) } .then_comma() .then_whitespace(); this.then(NominalPhrase) } .then_comma() .then_whitespace() .then_word_set(&["and", "or", "nor"]), } } fn match_to_lint(&self, matched_toks: &[Token], _source: &[char]) -> Option { let last_comma_index = matched_toks.last_comma_index()?; let offender = &matched_toks[last_comma_index]; Some(Lint { span: offender.span, lint_kind: LintKind::Style, suggestions: vec![Suggestion::Remove], message: "Remove the Oxford comma here.".to_owned(), priority: 31, }) } } impl Default for NoOxfordComma { fn default() -> Self { Self::new() } } impl Linter for NoOxfordComma { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for sentence in document.iter_sentences() { for match_span in self.expr.iter_matches(sentence, document.get_source()) { let lint = self.match_to_lint( &sentence[match_span.start..match_span.end], document.get_source(), ); lints.extend(lint); } } lints } fn description(&self) -> &str { "The Oxford comma is one of the more controversial rules in common use today. Enabling this lint checks that there is no comma before `and`, `or` or `nor` when listing out more than two ideas." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::NoOxfordComma; #[test] fn fruits() { assert_lint_count( "An apple, a banana, and a pear", NoOxfordComma::default(), 1, ); } #[test] fn people() { assert_suggestion_result( "Nancy, Steve, and Carl are going to the coffee shop.", NoOxfordComma::default(), "Nancy, Steve and Carl are going to the coffee shop.", ); } #[test] fn places() { assert_suggestion_result( "I've always wanted to visit Paris, Tokyo, and Rome.", NoOxfordComma::default(), "I've always wanted to visit Paris, Tokyo and Rome.", ); } #[test] fn foods() { assert_suggestion_result( "My favorite foods are pizza, sushi, tacos, and burgers.", NoOxfordComma::default(), "My favorite foods are pizza, sushi, tacos and burgers.", ); } #[test] fn allows_clean_music() { assert_lint_count( "I enjoy listening to pop music, rock, hip-hop, electronic dance and classical music.", NoOxfordComma::default(), 0, ); } #[test] fn allows_clean_nations() { assert_lint_count( "The team consists of players from different countries: France, Germany, Italy and Spain.", NoOxfordComma::default(), 0, ); } #[test] fn or_writing() { assert_suggestion_result( "Harper can be a lifesaver when writing technical documents, emails, or other formal forms of communication.", NoOxfordComma::default(), "Harper can be a lifesaver when writing technical documents, emails or other formal forms of communication.", ); } #[test] fn sports() { assert_suggestion_result( "They enjoy playing soccer, basketball, or tennis.", NoOxfordComma::default(), "They enjoy playing soccer, basketball or tennis.", ); } #[test] fn nor_vegetables() { assert_suggestion_result( "I like carrots, kale, nor broccoli.", NoOxfordComma::default(), "I like carrots, kale nor broccoli.", ); } } ================================================ FILE: harper-core/src/linting/nobody.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct Nobody { expr: SequenceExpr, } impl Default for Nobody { fn default() -> Self { let pattern = SequenceExpr::aco("no") .then_whitespace() .t_aco("body") .then_whitespace() .then_verb(); Self { expr: pattern } } } impl ExprLinter for Nobody { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens[0..3].span()?; let orig_chars = span.get_content(source); if next_non_whitespace_char(source, span.end).is_some_and(|ch| ch == ',') { return None; } if next_non_whitespace_word(source, span.end).is_some_and(|word| { matches!( word.as_str(), "is" | "was" | "were" | "be" | "been" | "being" ) }) { return None; } Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "nobody".chars().collect(), orig_chars, )], message: format!("Did you mean the closed compound `{}`?", "nobody"), ..Default::default() }) } fn description(&self) -> &'static str { "Looks for incorrect spacing inside the closed compound `nobody`." } } fn next_non_whitespace_char(source: &[char], offset: usize) -> Option { source .get(offset..)? .iter() .find(|c| !c.is_whitespace()) .copied() } fn next_non_whitespace_word(source: &[char], offset: usize) -> Option { let suffix = source.get(offset..)?; let mut iter = suffix .iter() .enumerate() .skip_while(|(_, c)| c.is_whitespace()); let start = iter.next()?.0; let end = suffix[start..] .iter() .position(|c| c.is_whitespace() || c.is_ascii_punctuation()) .map(|len| start + len) .unwrap_or(suffix.len()); Some( suffix[start..end] .iter() .collect::() .to_ascii_lowercase(), ) } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::Nobody; #[test] fn both_valid_and_invalid() { assert_suggestion_result( "No body told me. I have a head but no body.", Nobody::default(), "Nobody told me. I have a head but no body.", ); } #[test] fn ignores_no_body_was_found() { assert_lint_count("No body was found after the search.", Nobody::default(), 0); } #[test] fn ignores_no_body_comma() { assert_lint_count( "No body, no signs of a struggle, no answers.", Nobody::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/nominal_wants.rs ================================================ use harper_brill::UPOS; use crate::CharStringExt; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, dict_word_metadata::Person, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct NominalWants { expr: SequenceExpr, } impl Default for NominalWants { fn default() -> Self { fn is_applicable_pronoun(tok: &Token, src: &[char]) -> bool { if tok.kind.is_pronoun() && tok.kind.is_upos(UPOS::PRON) { let pron = tok.span.get_content(src); !pron.eq_any_ignore_ascii_case_chars(&[ // "That" can act as two kinds of pronoun: demonstrative and relative. // As a demonstrative pronoun, it's third person singular. // As a relative pronoun, it's behaves as any person: // I am the one that wants to. He is the one that wants to. &['t', 'h', 'a', 't'], // Personal pronouns have case. Object case personal pronouns // can come after "want": // Make them want to believe. // Note: "you" and "it" are both subject and object case. &['m', 'e'], &['u', 's'], // "you" is subject and object both OK before "want". &['h', 'i', 'm'], &['h', 'e', 'r'], // "it" is both subject and object. Subject before "wants", object before "want". &['i', 't'], &['t', 'h', 'e', 'm'], &['w', 'h', 'o'], ]) } else { false } } let miss = WordSet::new(&["wont", "wonts", "want", "wants"]); let pattern = SequenceExpr::with(is_applicable_pronoun) .then_whitespace() .then(miss); Self { expr: pattern } } } impl ExprLinter for NominalWants { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], source: &[char]) -> Option { let subject = toks.first()?; let offender = &toks.last()?; let plural = subject.kind.is_plural_nominal(); let person = subject .kind .as_word() .unwrap() .clone() .unwrap() .pronoun .and_then(|p| p.person) .unwrap_or(Person::Third); let replacement = if person == Person::Third { if plural { "want" } else { "wants" } } else { "want" }; let replacement_chars: Vec = replacement.chars().collect(); let offender_span = offender.span; let offender_chars = offender_span.get_content(source); if offender_chars.eq_ignore_ascii_case_chars(&replacement_chars) { return None; } Some(Lint { span: offender_span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( replacement_chars, offender_chars, )], message: format!("Did you mean `{replacement}`?"), priority: 55, }) } fn description(&self) -> &str { "Ensures you use the correct `want` / `wants` after a nominal." } } #[cfg(test)] mod tests { use super::NominalWants; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fixes_he_wonts() { assert_suggestion_result( "He wonts to join us.", NominalWants::default(), "He wants to join us.", ); } #[test] #[ignore = "This is not a grammar error if the previous word is `help`, `let`, or `make`."] fn fixes_it_wont() { assert_suggestion_result( "It wont to move forward.", NominalWants::default(), "It wants to move forward.", ); } #[test] fn fixes_she_wont() { assert_suggestion_result( "She wont to leave early.", NominalWants::default(), "She wants to leave early.", ); } #[test] fn fixes_i_wont() { assert_suggestion_result( "I wonts to leave early.", NominalWants::default(), "I want to leave early.", ); } #[test] fn allows_you_want() { assert_lint_count("What size do you want to be?", NominalWants::default(), 0); } #[test] fn fixes_you_wants() { assert_suggestion_result( "What do you wants?", NominalWants::default(), "What do you want?", ); } #[test] fn ignores_correct_usage_they() { assert_lint_count("They want to help.", NominalWants::default(), 0); } #[test] fn ignores_correct_usage_he() { assert_lint_count("He wants to help.", NominalWants::default(), 0); } #[test] fn ignores_correct_usage_that_1298() { assert_lint_count( "The projects that want to take it seriously are the best.", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_make_me() { assert_lint_count( "Take another person code make me want to die.", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_makes_me() { assert_lint_count( "It makes me want to not use GitHub at all.", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_make_us() { assert_lint_count( "... try harder to make us want to implement it.", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_made_us() { assert_lint_count( "This change made us want to adopt luxon's strict mode", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_help_us() { assert_lint_count("... help us want to help you.", NominalWants::default(), 0); } #[test] fn ignores_correct_usage_make_you() { assert_lint_count( "I can certainly see why that would make you want to ditch Linux packaging.", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_makes_you() { assert_lint_count( "If something happens that makes you want to scream from the top of your lungs", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_made_you() { assert_lint_count( "What made you want to leave the LibFuzzer ...", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_make_him() { assert_lint_count( "make him want to help with your issue", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_make_her() { assert_lint_count( "... and make her want to get into coding.", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_make_it() { assert_lint_count( "you just make it want to appear as a drama", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_makes_it() { assert_lint_count( "using UHD makes it want to put labels in the corner saying UHD", NominalWants::default(), 0, ); } #[test] fn ignores_correct_usage_make_them() { assert_lint_count( "And make them want to believe in it.", NominalWants::default(), 0, ) } #[test] fn ignores_correct_usage_making_them() { assert_lint_count( "you're annoying ALMOST ALL of the users and making them want to switch to another ...", NominalWants::default(), 0, ) } #[test] fn ignores_correct_usage_help_them() { assert_lint_count("And help them want to do it.", NominalWants::default(), 0) } #[test] fn allows_want_to() { assert_no_lints( "Harper is a grammar checker for people who want to write fast.", NominalWants::default(), ); } #[test] fn test_2007() { assert_no_lints( "### 🙌 **We Want to Hear From You!**", NominalWants::default(), ) } } ================================================ FILE: harper-core/src/linting/nor_modal_pronoun.rs ================================================ use crate::{ Lint, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::ModalVerb, }; pub struct NorModalPronoun { expr: SequenceExpr, } impl Default for NorModalPronoun { fn default() -> Self { Self { expr: SequenceExpr::aco("nor") .t_ws() .then_subject_pronoun() .t_ws() .then(ModalVerb::with_common_errors()), } } } impl ExprLinter for NorModalPronoun { type Unit = Chunk; fn description(&self) -> &str { "Corrects the order of the pronoun and modal verb after `nor`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if ctx .map(|(pre, _)| { // Check for pattern 1: subject pronoun [ws] let is_subj_pronoun = pre .get_rel(-1) .filter(|t| t.kind.is_whitespace()) .and_then(|_| pre.get_rel(-2)) .is_some_and(|t| t.kind.is_subject_pronoun()); // Check for pattern 2: possessive [ws] noun [ws] let is_poss_and_noun = pre .get_rel(-1) .filter(|t| t.kind.is_whitespace()) .and_then(|_| pre.get_rel(-2)) .filter(|t| t.kind.is_noun()) .and_then(|_| pre.get_rel(-3)) .filter(|t| t.kind.is_whitespace()) .and_then(|_| pre.get_rel(-4)) .is_some_and(|t| t.kind.is_possessive_determiner()); is_subj_pronoun || is_poss_and_noun }) .unwrap_or(false) { return None; } let (pron_tok, modal_tok) = (toks.get_rel(-3)?, toks.get_rel(-1)?); let pron_ws_modal_toks = toks.get_rel_slice(-3, -1)?; let (pron_span, modal_span) = (pron_tok.span, modal_tok.span); let pron_modal_span = pron_ws_modal_toks.span()?; let value = format!( "{} {}", modal_span.get_content_string(src), pron_span.get_content_string(src) ) .chars() .collect(); // Avoid capitalizing the modals verbs just because the pronoun was "I" let suggestion = if pron_span.get_content(src) == ['I'] { Suggestion::ReplaceWith(value) } else { Suggestion::replace_with_match_case(value, pron_modal_span.get_content(src)) }; Some(Lint { span: pron_modal_span, lint_kind: LintKind::Grammar, suggestions: vec![suggestion], message: "After `nor`, the modal verb should come before the pronoun.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::NorModalPronoun; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn fix_nor_i_can() { assert_suggestion_result( "i can't see the menu nor i can see the features of your app or how it looks !", NorModalPronoun::default(), "i can't see the menu nor can i see the features of your app or how it looks !", ); } #[test] fn fix_nor_i_could() { assert_suggestion_result( "but never saw any warnings nor I could read messages until I debugged", NorModalPronoun::default(), "but never saw any warnings nor could I read messages until I debugged", ); } #[test] fn fix_nor_i_will() { assert_suggestion_result( "I am not the author of the plugins nor I will be updating bugged/unavailable plugins.", NorModalPronoun::default(), "I am not the author of the plugins nor will I be updating bugged/unavailable plugins.", ); } #[test] fn fix_nor_i_would() { assert_suggestion_result( "I would not like to own a Pollock, nor I would hang one of his paintings on a wall inside my home", NorModalPronoun::default(), "I would not like to own a Pollock, nor would I hang one of his paintings on a wall inside my home", ); } #[test] fn fix_nor_it_can() { assert_suggestion_result( "However, since several days ago FreeTube simply doesn't open ANY videos nor it can search.", NorModalPronoun::default(), "However, since several days ago FreeTube simply doesn't open ANY videos nor can it search.", ); } #[test] fn fix_nor_it_should() { assert_suggestion_result( "Since the code doesn't guard against it (nor it should), internalModule.stripBOM is called with an undefined", NorModalPronoun::default(), "Since the code doesn't guard against it (nor should it), internalModule.stripBOM is called with an undefined", ); } #[test] fn fix_nor_it_will() { assert_suggestion_result( "It will never \"create a table\", nor it will issue any query - it will only create the entity instance.", NorModalPronoun::default(), "It will never \"create a table\", nor will it issue any query - it will only create the entity instance.", ); } #[test] fn fix_nor_it_would() { assert_suggestion_result( "Neither whitespace (excepting NL and CR) is special char in this sense, nor it would destroy something, if it gets \"escaped\" as variable", NorModalPronoun::default(), "Neither whitespace (excepting NL and CR) is special char in this sense, nor would it destroy something, if it gets \"escaped\" as variable", ); } #[test] fn fix_nor_they_can() { assert_suggestion_result( "Currently these assets don't include the code provided by the submodules nor they can be disabled", NorModalPronoun::default(), "Currently these assets don't include the code provided by the submodules nor can they be disabled", ); } #[test] fn fix_nor_we_can() { assert_suggestion_result( "The NSLayoutConstraint errors are really Apple bugs, not our fault, nor we can fix them, but they are harmless.", NorModalPronoun::default(), "The NSLayoutConstraint errors are really Apple bugs, not our fault, nor can we fix them, but they are harmless.", ); } #[test] fn fix_nor_you_can() { assert_suggestion_result( "You cannot create a view to do it, nor you can have a function to do it", NorModalPronoun::default(), "You cannot create a view to do it, nor can you have a function to do it", ); } #[test] fn fix_nor_you_should() { assert_suggestion_result( "I believe you cannot create two sessions through one signin, and maybe nor you should.", NorModalPronoun::default(), "I believe you cannot create two sessions through one signin, and maybe nor should you.", ); } // Potential false positives #[test] fn ignore_neither_they_nor_i_could() { assert_no_lints( "One of my users was unable to install tools via mise, but neither they nor I could initially figure out why.", NorModalPronoun::default(), ); } #[test] fn ignore_neither_my_tool_nor_i_shall() { assert_no_lints( "but neither my tool nor I shall feel disrespected", NorModalPronoun::default(), ); } } ================================================ FILE: harper-core/src/linting/not_only_inversion.rs ================================================ use crate::{ Lint, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, debug::format_lint_match, expr_linter::Chunk}, }; pub struct NotOnlyInversion { expr: SequenceExpr, } impl Default for NotOnlyInversion { fn default() -> Self { Self { expr: SequenceExpr::aco("not") .t_ws() .t_aco("only") .t_ws() .then_word_set(&["I", "we", "you", "he", "she", "it", "they"]) .t_ws() .then_word_set(&["am", "are", "is", "was", "were"]), } } } impl ExprLinter for NotOnlyInversion { type Unit = Chunk; fn description(&self) -> &str { "Corrects `not only it is` to `not only is it`" } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { eprintln!("🍭 {}", format_lint_match(toks, ctx, src)); let (prontok, betok) = (toks.get_rel(-3)?, toks.get_rel(-1)?); let (pronspan, bespan) = (prontok.span, betok.span); let (pronch, bech) = (pronspan.get_content(src), bespan.get_content(src)); let pronbetoks = toks.get_rel_slice(-3, -1)?; eprintln!("🍭🍭 '{}'", pronbetoks.span()?.get_content_string(src)); let inverted = [bech.to_vec(), vec![' '], pronch.to_vec()].concat(); Some(Lint { span: pronbetoks.span()?, lint_kind: LintKind::Grammar, message: "After `not only` the subject and verb should be inverted.".to_string(), suggestions: vec![Suggestion::replace_with_match_case( inverted, pronbetoks.span()?.get_content(src), )], ..Default::default() }) // None } fn expr(&self) -> &dyn Expr { &self.expr } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::NotOnlyInversion; #[test] fn fix_not_only_he_is() { assert_suggestion_result( "not only he is discouraged from look at them but he can't manipulate them", NotOnlyInversion::default(), "not only is he discouraged from look at them but he can't manipulate them", ); } #[test] fn fix_not_only_he_was() { assert_suggestion_result( "not only he was born as a man, he was the Promised Messiah", NotOnlyInversion::default(), "not only was he born as a man, he was the Promised Messiah", ); } #[test] #[ignore = "replace_with_match_case goes by character index matching"] fn fix_not_only_i_am() { assert_suggestion_result( "Not only I am proud of the work we have accomplished together but also I have learned so much from you about statistics, sciences and beyond.", NotOnlyInversion::default(), "Not only am I proud of the work we have accomplished together but also I have learned so much from you about statistics, sciences and beyond.", ); } #[test] #[ignore = "replace_with_match_case goes by character index matching"] fn fix_not_only_i_was() { assert_suggestion_result( "Not only I was wrong in saying the right meaning, I was also wrong in stating the parts of speech", NotOnlyInversion::default(), "Not only was I wrong in saying the right meaning, I was also wrong in stating the parts of speech", ); } #[test] fn fix_not_only_it_is() { assert_suggestion_result( "Not only it is not the same problem, #899 is a solution suggested in #969.", NotOnlyInversion::default(), "Not only is it not the same problem, #899 is a solution suggested in #969.", ); } #[test] fn fix_not_only_it_was() { assert_suggestion_result( "because not only it was unlikely that I could answer any question I also felt that I cannot even ask any on-topic question", NotOnlyInversion::default(), "because not only was it unlikely that I could answer any question I also felt that I cannot even ask any on-topic question", ); } #[test] fn fix_not_only_they_are() { assert_suggestion_result( "Not only they are written in much cleaner and verbose way, they are also available in 6 languages like russian.", NotOnlyInversion::default(), "Not only are they written in much cleaner and verbose way, they are also available in 6 languages like russian.", ); } #[test] fn fix_not_only_they_were() { assert_suggestion_result( "Not only they were tall, but also they were strong. ", NotOnlyInversion::default(), "Not only were they tall, but also they were strong. ", ); } #[test] fn fix_not_only_we_are() { assert_suggestion_result( "Here not only we are using multiline string to create an HTML output but we also are binding variable using expression language.", NotOnlyInversion::default(), "Here not only are we using multiline string to create an HTML output but we also are binding variable using expression language.", ); } #[test] fn fix_not_only_we_were() { assert_suggestion_result( "Not only we were using an old version of our front end library (React), but we were also locked into a version of our functional programming utility package (Lodash) released more than three years ago.", NotOnlyInversion::default(), "Not only were we using an old version of our front end library (React), but we were also locked into a version of our functional programming utility package (Lodash) released more than three years ago.", ); } #[test] fn fix_not_only_you_are() { assert_suggestion_result( "So not only you are a perfect reference, but also a viable candidate for drop-n-use.", NotOnlyInversion::default(), "So not only are you a perfect reference, but also a viable candidate for drop-n-use.", ); } #[test] fn fix_not_only_you_were() { assert_suggestion_result( "because not only you were able to explain it but you were able to show me how to sort it so it would displayed", NotOnlyInversion::default(), "because not only were you able to explain it but you were able to show me how to sort it so it would displayed", ); } } ================================================ FILE: harper-core/src/linting/noun_verb_confusion/effect_affect/affect_to_effect.rs ================================================ use harper_brill::UPOS; use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenKind, expr::{Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{ModalVerb, Pattern, UPOSSet}, }; pub(super) struct AffectToEffect { expr: ExprMap, } impl Default for AffectToEffect { fn default() -> Self { let mut map = ExprMap::default(); let adj_then_noun_follow = SequenceExpr::with(|tok: &Token, source: &[char]| { matches_preceding_context_adj_noun(tok, source) }) .t_ws() .then(|tok: &Token, source: &[char]| is_affect_word(tok, source)) .t_ws() .then(UPOSSet::new(&[UPOS::ADJ])) .t_ws() .then(UPOSSet::new(&[UPOS::NOUN])); map.insert(adj_then_noun_follow, 2); let word_follow = SequenceExpr::with(|tok: &Token, source: &[char]| { matches_preceding_context(tok, source) }) .t_ws() .then(|tok: &Token, source: &[char]| is_affect_word(tok, source)) .t_ws() .then(UPOSSet::new(&[ UPOS::PROPN, UPOS::INTJ, UPOS::ADP, UPOS::SCONJ, ])); map.insert(word_follow, 2); let verb_follow = SequenceExpr::with(|tok: &Token, source: &[char]| { matches_preceding_context_verb_follow(tok, source) }) .t_ws() .then(|tok: &Token, source: &[char]| is_affect_word(tok, source)) .t_ws() .then(UPOSSet::new(&[UPOS::AUX, UPOS::VERB])); map.insert(verb_follow, 2); let punctuation_follow = SequenceExpr::with(|tok: &Token, source: &[char]| { matches_preceding_context(tok, source) }) .t_ws() .then(|tok: &Token, source: &[char]| is_affect_word(tok, source)) .then_kind_where(|kind| kind.is_punctuation()); map.insert(punctuation_follow, 2); let great_affect = SequenceExpr::default() .t_aco("great") .t_ws() .then(|tok: &Token, source: &[char]| is_affect_word(tok, source)); map.insert(great_affect, 2); Self { expr: map } } } impl ExprLinter for AffectToEffect { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_index = *self.expr.lookup(0, matched_tokens, source)?; let target = &matched_tokens[offending_index]; let preceding = matched_tokens[..offending_index] .iter() .rfind(|tok| !tok.kind.is_whitespace()); if preceding.is_some_and(|tok| { (tok.kind.is_pronoun() || tok.kind.is_upos(UPOS::PRON)) && !tok.kind.is_possessive_pronoun() }) { // Pronouns like "it" or "they" almost always introduce the verb form ("it affects"). return None; } let token_text = target.span.get_content_string(source); let lower = token_text.to_lowercase(); let replacement = match lower.as_str() { "affect" => "effect", "affects" => "effects", _ => return None, }; Some(Lint { span: target.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( replacement, target.span.get_content(source), )], message: "`affect` is usually a verb; use `effect` here for the result or outcome." .into(), priority: 63, }) } fn description(&self) -> &'static str { "Corrects `affect` to `effect` when the context shows the noun meaning `result`." } } fn is_affect_word(token: &Token, source: &[char]) -> bool { const AFFECT: &[char] = &['a', 'f', 'f', 'e', 'c', 't']; const AFFECTS: &[char] = &['a', 'f', 'f', 'e', 'c', 't', 's']; if !matches!(token.kind, TokenKind::Word(_)) { return false; } let text = token.span.get_content(source); text.eq_ignore_ascii_case_chars(AFFECT) || text.eq_ignore_ascii_case_chars(AFFECTS) } fn is_take_form(chars: &[char]) -> bool { chars.eq_ignore_ascii_case_str("take") || chars.eq_ignore_ascii_case_str("takes") || chars.eq_ignore_ascii_case_str("taking") || chars.eq_ignore_ascii_case_str("took") || chars.eq_ignore_ascii_case_str("taken") } fn is_modal_like(token: &Token, source: &[char], prev: &[char]) -> bool { if ModalVerb::default() .matches(std::slice::from_ref(token), source) .is_some() { return true; } prev.eq_ignore_ascii_case_str("do") || prev.eq_ignore_ascii_case_str("does") || prev.eq_ignore_ascii_case_str("did") || prev.eq_ignore_ascii_case_str("don't") || prev.eq_ignore_ascii_case_str("dont") || prev.eq_ignore_ascii_case_str("doesn't") || prev.eq_ignore_ascii_case_str("doesnt") || prev.eq_ignore_ascii_case_str("didn't") || prev.eq_ignore_ascii_case_str("didnt") } fn matches_preceding_context(token: &Token, source: &[char]) -> bool { matches_preceding_context_impl(token, source, true, true) } fn matches_preceding_context_adj_noun(token: &Token, source: &[char]) -> bool { matches_preceding_context_impl(token, source, false, true) } fn matches_preceding_context_verb_follow(token: &Token, source: &[char]) -> bool { matches_preceding_context_impl(token, source, true, false) } fn matches_preceding_context_impl( token: &Token, source: &[char], allow_noun_like: bool, allow_verb_like: bool, ) -> bool { if token.kind.is_possessive_nominal() { return false; } if !is_preceding_context(token) { return false; } let content = token.span.get_content(source); let is_take_form_word = is_take_form(content); if behaves_like_verb(token, source, content) && !is_take_form_word { return false; } if !allow_verb_like && token.kind.is_upos(UPOS::VERB) && !is_take_form_word { return false; } if !allow_noun_like && (token.kind.is_noun() || token.kind.is_proper_noun()) && !is_take_form_word { return false; } true } fn behaves_like_verb(token: &Token, source: &[char], prev: &[char]) -> bool { token.kind.is_upos(UPOS::AUX) || token.kind.is_auxiliary_verb() || is_modal_like(token, source, prev) } fn is_preceding_context(token: &Token) -> bool { if token.kind.is_upos(UPOS::ADV) { return false; } matches!(token.kind, TokenKind::Punctuation(_)) || token.kind.is_preposition() || token.kind.is_conjunction() || token.kind.is_proper_noun() || token.kind.is_verb() || token.kind.is_adjective() || token.kind.is_determiner() || token.kind.is_noun() } ================================================ FILE: harper-core/src/linting/noun_verb_confusion/effect_affect/effect_to_affect.rs ================================================ use harper_brill::UPOS; use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenKind, expr::{Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WhitespacePattern, }; pub(super) struct EffectToAffect { expr: ExprMap, } impl Default for EffectToAffect { fn default() -> Self { let mut map = ExprMap::default(); let context = SequenceExpr::with(matches_preceding_context) .t_ws() .then(|tok: &Token, source: &[char]| is_effect_word(tok, source)) .t_ws() .then(matches_following_context) .then_optional(WhitespacePattern) .then_optional(matches_optional_following) .then_optional(WhitespacePattern); map.insert(context, 2); Self { expr: map } } } impl ExprLinter for EffectToAffect { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offending_idx = *self.expr.lookup(0, matched_tokens, source)?; let target = &matched_tokens[offending_idx]; let preceding = matched_tokens[..offending_idx] .iter() .rfind(|tok| !tok.kind.is_whitespace()); let mut following = matched_tokens[offending_idx + 1..] .iter() .filter(|tok| !tok.kind.is_whitespace()); let first_following = following.next()?; let second_following = following.next(); if let Some(prev) = preceding { let lower_prev = prev.span.get_content_string(source).to_lowercase(); if matches!( lower_prev.as_str(), "take" | "takes" | "taking" | "took" | "taken" ) { return None; } } if first_following.kind.is_upos(UPOS::AUX) || first_following.kind.is_linking_verb() { return None; } let first_following_lower = first_following .span .get_content_string(source) .to_lowercase(); if matches!( first_following_lower.as_str(), "is" | "are" | "was" | "were" | "be" | "been" | "being" ) { return None; } // Avoid "to effect change", which uses the legitimate verb "effect". if let Some(prev) = preceding && is_token_to(prev, source) && is_change_like(first_following, source) { return None; } if first_following.kind.is_upos(UPOS::VERB) && preceding.is_some_and(|tok| { tok.kind.is_upos(UPOS::NOUN) || tok.kind.is_upos(UPOS::DET) || tok.kind.is_upos(UPOS::ADJ) || (tok.kind.is_noun() && !tok.kind.is_upos(UPOS::VERB) && !tok.kind.is_upos(UPOS::AUX)) }) { return None; } // Skip when the context already shows a clear noun usage (e.g., "the effect your idea had"). if let Some(prev) = preceding && (prev.kind.is_upos(UPOS::DET) || prev.kind.is_upos(UPOS::ADJ)) { return None; } // Do not flag when the following noun is clearly the result of "effect" in the idiomatic sense. if let Some(next) = second_following && next.kind.is_noun() && is_change_like(next, source) { return None; } let token_text = target.span.get_content_string(source); let lower = token_text.to_lowercase(); if lower.as_str() == "effects" && preceding.is_some_and(|tok| tok.kind.is_upos(UPOS::VERB)) { // Imperative phrases like "Avoid effects" legitimately use the noun. return None; } let replacement = match lower.as_str() { "effect" => "affect", "effects" => "affects", _ => return None, }; Some(Lint { span: target.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( replacement, target.span.get_content(source), )], message: "Use `affect` for the verb meaning to influence; `effect` usually names the result." .into(), priority: 63, }) } fn description(&self) -> &'static str { "Corrects `effect` to `affect` when the context shows the verb meaning `influence`." } } fn is_effect_word(token: &Token, source: &[char]) -> bool { if !matches!(token.kind, TokenKind::Word(_)) { return false; } const EFFECT: &[char] = &['e', 'f', 'f', 'e', 'c', 't']; const EFFECTS: &[char] = &['e', 'f', 'f', 'e', 'c', 't', 's']; let text = token.span.get_content(source); text.eq_ignore_ascii_case_chars(EFFECT) || text.eq_ignore_ascii_case_chars(EFFECTS) } fn is_token_to(token: &Token, source: &[char]) -> bool { token .span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) } fn is_change_like(token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } matches!( token .span .get_content_string(source) .to_lowercase() .as_str(), "change" | "changes" | "substitution" | "substitutions" ) } fn matches_preceding_context(token: &Token, _source: &[char]) -> bool { tag_matches_any( token, &[ UPOS::PART, UPOS::NOUN, UPOS::PRON, UPOS::PROPN, UPOS::ADV, UPOS::AUX, UPOS::VERB, UPOS::ADJ, ], ) } fn matches_following_context(token: &Token, _source: &[char]) -> bool { tag_matches_any( token, &[ UPOS::ADV, UPOS::AUX, UPOS::PRON, UPOS::PROPN, UPOS::VERB, UPOS::NUM, UPOS::NOUN, UPOS::INTJ, UPOS::SCONJ, UPOS::DET, UPOS::ADJ, ], ) } fn matches_optional_following(token: &Token, _source: &[char]) -> bool { if token.kind.is_punctuation() { return true; } tag_matches_any(token, &[UPOS::NOUN]) } fn tag_matches_any(token: &Token, allowed: &[UPOS]) -> bool { let Some(word_meta_opt) = token.kind.as_word() else { return false; }; match word_meta_opt { Some(meta) => meta.pos_tag.is_none_or(|tag| allowed.contains(&tag)), None => true, } } ================================================ FILE: harper-core/src/linting/noun_verb_confusion/effect_affect/mod.rs ================================================ mod affect_to_effect; mod effect_to_affect; use affect_to_effect::AffectToEffect; use effect_to_affect::EffectToAffect; use crate::linting::merge_linters::merge_linters; merge_linters!( EffectAffect => EffectToAffect, AffectToEffect => "Guides writers toward the right choice between `effect` and `affect`, correcting each term when it shows up in the other one's role." ); ================================================ FILE: harper-core/src/linting/noun_verb_confusion/mod.rs ================================================ use super::merge_linters::merge_linters; mod effect_affect; mod noun_instead_of_verb; mod verb_instead_of_noun; // Common noun-verb pairs that are often confused // See also [`NounInsteadOfVerb``] pub(crate) const NOUN_VERB_PAIRS: &[(&str, &str)] = &[ ("advice", "advise"), ("belief", "believe"), ("breath", "breathe"), ("effect", "affect"), // "Effect" is also a verb meaning "to bring about". "Affect" is a noun in psychology. ("emphasis", "emphasize"), // TODO how to handle "emphasise" as well as "emphasize"? ("intent", "intend"), // ("proof", "prove"), // "Proof" is also a verb, a synonym of "proofread". ("weight", "weigh"), // Add more pairs here as needed ]; use noun_instead_of_verb::NounInsteadOfVerb; use verb_instead_of_noun::VerbInsteadOfNoun; merge_linters! { NounVerbConfusion => NounInsteadOfVerb, VerbInsteadOfNoun => "Handles common confusions between related nouns and verbs (e.g., 'advice/advise', 'breath/breathe')" } #[cfg(test)] mod tests { use super::NounVerbConfusion; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn corrects_good_advise() { assert_suggestion_result("Good advise", NounVerbConfusion::default(), "Good advice"); } #[test] fn corrects_bad_advise() { assert_suggestion_result( "I just wanted to bring attention to this because it stood out to me as potentially bad advise.", NounVerbConfusion::default(), "I just wanted to bring attention to this because it stood out to me as potentially bad advice.", ); } #[test] fn dont_flag_correct_better_advise() { assert_lint_count( "Hello! I am an engineer at Plexon and am conducting tests with Kilosort4 so we can better advise our clients.", NounVerbConfusion::default(), 0, ); } #[test] #[ignore = "'better advise' can be correct as above, or a mistake like here"] fn correct_better_advise() { assert_suggestion_result( "Maybe this will be a decent idea, .or anybody has better advise :)", NounVerbConfusion::default(), "Maybe this will be a decent idea, .or anybody has better advice :)", ); } #[test] fn dont_flag_correct_better_believe() { assert_lint_count( "You'd better believe this is bbedit-gist-maker.", NounVerbConfusion::default(), 0, ); } #[test] fn correct_strong_believe() { assert_suggestion_result( "cause my strong believe is that we must give any user to describe whether a post is meant factual", NounVerbConfusion::default(), "cause my strong belief is that we must give any user to describe whether a post is meant factual", ); } #[test] fn correct_deep_breathe() { assert_suggestion_result( "Take deep breathe and Do it again!", NounVerbConfusion::default(), "Take deep breath and Do it again!", ); } #[test] fn correct_bad_intend() { assert_suggestion_result( "What do you do if you only see slightly longer posts that may still be acceptable (and not bad intend from the poster)", NounVerbConfusion::default(), "What do you do if you only see slightly longer posts that may still be acceptable (and not bad intent from the poster)", ); } #[test] fn corrects_belief_instead_of_verb() { assert_suggestion_result( "I belief in you.", NounVerbConfusion::default(), "I believe in you.", ); } #[test] #[ignore = "`to` can't disambiguate since it's valid between verbs and nouns"] fn corrects_breath_instead_of_verb() { assert_suggestion_result( "Remember to breath deeply.", NounVerbConfusion::default(), "Remember to breathe deeply.", ); } #[test] fn does_not_flag_correct_believe() { assert_lint_count("I believe in you.", NounVerbConfusion::default(), 0); } #[test] fn does_not_flag_correct_breath() { assert_lint_count("Take a deep breath.", NounVerbConfusion::default(), 0); } // real-world example unit tests #[test] fn fix_when_i_breath_you_breath() { assert_suggestion_result( "When I breath, you breath!", NounVerbConfusion::default(), "When I breathe, you breathe!", ); } #[test] fn fix_weather_climate_and_the_air_we_breath() { assert_suggestion_result( "Weather Climate and the Air We Breath", NounVerbConfusion::default(), "Weather Climate and the Air We Breathe", ); } #[test] fn fix_always_breath() { assert_suggestion_result( "breathing. remember to always breath.", NounVerbConfusion::default(), "breathing. remember to always breathe.", ); } #[test] fn fix_never_breath_a_word() { assert_suggestion_result( "And never breath a word about your loss; If you can force your heart and nerve and sinew.", NounVerbConfusion::default(), "And never breathe a word about your loss; If you can force your heart and nerve and sinew.", ); } #[test] fn fix_breath_for_seconds() { assert_suggestion_result( "Once turned on, the LED on the TX unit would breath for a few seconds, then go completely dead and not responding to objects in front of the sensors.", NounVerbConfusion::default(), "Once turned on, the LED on the TX unit would breathe for a few seconds, then go completely dead and not responding to objects in front of the sensors.", ); } #[test] fn fix_breath_a_little_more_life() { assert_suggestion_result( "... up to 12% more performance, could breath a little more life into systems as old as Sandy Bridge.", NounVerbConfusion::default(), "... up to 12% more performance, could breathe a little more life into systems as old as Sandy Bridge.", ); } #[test] fn fix_the_diversity_we_breath() { assert_suggestion_result( "The Diversity We Breath: Community Diversity", NounVerbConfusion::default(), "The Diversity We Breathe: Community Diversity", ); } #[test] fn fix_belief() { assert_suggestion_result( "While I have no plans to return to aerospace I belief it gives me a unique perspective to many challenges.", NounVerbConfusion::default(), "While I have no plans to return to aerospace I believe it gives me a unique perspective to many challenges.", ); } #[test] fn fix_we_belief() { assert_suggestion_result( "In contrast to other vendors in e-mobility, we belief that true transparency is only trustworthy if the entire process ...", NounVerbConfusion::default(), "In contrast to other vendors in e-mobility, we believe that true transparency is only trustworthy if the entire process ...", ); } #[test] #[ignore = "`underwater` is a marginal noun so `breath underwater` matches the compound noun test."] fn fix_i_can_breath() { assert_suggestion_result( "Steps to reproduce Expected behaviour I can breath underwater.", NounVerbConfusion::default(), "Steps to reproduce Expected behaviour I can breathe underwater.", ); } #[test] fn fix_caps_should_breath() { assert_suggestion_result( "CAPS 1 2 3 4 5 A B C D SHOULD BREATH A BIT MORE ?", NounVerbConfusion::default(), "CAPS 1 2 3 4 5 A B C D SHOULD BREATHE A BIT MORE ?", ); } #[test] fn fix_can_you_advice_me() { assert_suggestion_result( "Can you advice me how to train?", NounVerbConfusion::default(), "Can you advise me how to train?", ); } #[test] fn fix_we_can_advice_you() { assert_suggestion_result( "Feel free to share more details about your use case, so we can advice you specifically based on your case.", NounVerbConfusion::default(), "Feel free to share more details about your use case, so we can advise you specifically based on your case.", ); } #[test] fn fix_would_advice_against() { assert_suggestion_result( "So that I would advice against using a spindle in laser mode.", NounVerbConfusion::default(), "So that I would advise against using a spindle in laser mode.", ); } #[test] fn fix_advice_to_listen() { assert_suggestion_result( "The idea of this applicaton was inspired by Ray Dalio, who always advice to listen to people who know more than us by experience.", NounVerbConfusion::default(), "The idea of this applicaton was inspired by Ray Dalio, who always advise to listen to people who know more than us by experience.", ); } #[test] #[ignore = "`You` is an object pronoun in this example. `It` is also both subject and object."] fn dont_fix_advice_on_that() { assert_lint_count( "I don't do table returning functions in my code so can't offer you advice on that.", NounVerbConfusion::default(), 0, ); } #[test] fn fix_advice_to_stick_with_openvscode() { assert_suggestion_result( "But unless you really need it, I would advice to stick with openvscode as there are nearly the same.", NounVerbConfusion::default(), "But unless you really need it, I would advise to stick with openvscode as there are nearly the same.", ); } #[test] fn fix_advice_to_back_up_os_image() { assert_suggestion_result( "I would advice to back up all OS image before any update, because you could lose something what was working previously.", NounVerbConfusion::default(), "I would advise to back up all OS image before any update, because you could lose something what was working previously.", ); } #[test] fn fix_advice_to_use_ms_store() { assert_suggestion_result( "I know we can always advice to use the MS store to download JASP instead", NounVerbConfusion::default(), "I know we can always advise to use the MS store to download JASP instead", ); } #[test] fn fix_should_intent_be() { assert_suggestion_result( "Should intent be on the blocklist?", NounVerbConfusion::default(), "Should intent be on the blocklist?", ); } #[test] fn fix_if_you_intent() { assert_suggestion_result( "If you intent to use a 64 bits machine, change line 74", NounVerbConfusion::default(), "If you intend to use a 64 bits machine, change line 74", ); } #[test] fn fix_what_you_would_intent_to_do() { assert_suggestion_result( "May I ask what you would intent to do with such a feature?", NounVerbConfusion::default(), "May I ask what you would intend to do with such a feature?", ); } #[test] fn dont_flag_intent_records() { assert_lint_count( "there are always intent records associated to the txns", NounVerbConfusion::default(), 0, ); } #[test] fn fix_did_you_always_intent_to() { assert_suggestion_result( "Did you always intent to fight malware? No.", NounVerbConfusion::default(), "Did you always intend to fight malware? No.", ); } #[test] fn fix_we_recommend_you_create_a_new_issue_on_github_explaining_what_you_intent_to_do() { assert_suggestion_result( "... we recommend you create a new issue on github explaining what you intent to do.", NounVerbConfusion::default(), "... we recommend you create a new issue on github explaining what you intend to do.", ); } #[test] fn fix_intent_to_use_non_imported_symbol() { assert_suggestion_result( "There's a warning reported for this code, saying that it may intent to use non-imported symbol", NounVerbConfusion::default(), "There's a warning reported for this code, saying that it may intend to use non-imported symbol", ); } // tests for preceding "to" #[test] fn fix_to_emphasis_the() { assert_suggestion_result( "This one could be used in a dialog to emphasis the surprise.", NounVerbConfusion::default(), "This one could be used in a dialog to emphasize the surprise.", ); } #[test] fn allow_to_emphasis_at_end() { assert_lint_count( "Changes literal underscores to emphasis", NounVerbConfusion::default(), 0, ); } #[test] fn allow_to_intent_adjective() { assert_lint_count( "Cleanup passing statistics to intent aware iterator", NounVerbConfusion::default(), 0, ); } #[test] fn fix_to_advice_a_class() { assert_suggestion_result( "How to advice a class that have been intercepted by another javaagent", NounVerbConfusion::default(), "How to advise a class that have been intercepted by another javaagent", ); } #[test] fn fix_to_breath_some() { assert_suggestion_result( "You go to the balcony to breath some fresh air and look down at the things outside.", NounVerbConfusion::default(), "You go to the balcony to breathe some fresh air and look down at the things outside.", ); } #[test] fn fix_to_emphasis_a() { assert_suggestion_result( "we'd like to emphasis a few points below", NounVerbConfusion::default(), "we'd like to emphasize a few points below", ); } #[test] fn fix_to_advice_their() { assert_suggestion_result( "People who are managing this situation tend to advice their users to lock+unlock their screen", NounVerbConfusion::default(), "People who are managing this situation tend to advise their users to lock+unlock their screen", ); } // affect vs. effect sentences gathered from user reports #[test] fn fix_positive_affect_on_small_businesses() { assert_suggestion_result( "The new law had a positive affect on small businesses.", NounVerbConfusion::default(), "The new law had a positive effect on small businesses.", ); } #[test] fn fix_measured_the_affect_of_caffeine() { assert_suggestion_result( "We measured the affect of caffeine on reaction time.", NounVerbConfusion::default(), "We measured the effect of caffeine on reaction time.", ); } #[test] fn fix_side_affects_included_nausea() { assert_suggestion_result( "The side affects included nausea and fatigue.", NounVerbConfusion::default(), "The side effects included nausea and fatigue.", ); } #[test] fn fix_cause_and_affect_not_same() { assert_suggestion_result( "Cause and affect are not the same thing.", NounVerbConfusion::default(), "Cause and effect are not the same thing.", ); } #[test] fn fix_change_will_have_an_affect_on_revenue() { assert_suggestion_result( "The change will have an affect on our revenue.", NounVerbConfusion::default(), "The change will have an effect on our revenue.", ); } #[test] fn fix_medicine_took_affect_within_minutes() { assert_suggestion_result( "The medicine took affect within minutes.", NounVerbConfusion::default(), "The medicine took effect within minutes.", ); } #[test] fn fix_policy_will_come_into_affect() { assert_suggestion_result( "The policy will come into affect on October 1.", NounVerbConfusion::default(), "The policy will come into effect on October 1.", ); } #[test] fn fix_rules_are_now_in_affect() { assert_suggestion_result( "The rules are now in affect.", NounVerbConfusion::default(), "The rules are now in effect.", ); } #[test] fn fix_with_immediate_affect_office_closed() { assert_suggestion_result( "With immediate affect, the office is closed.", NounVerbConfusion::default(), "With immediate effect, the office is closed.", ); } #[test] fn fix_stunning_special_affects() { assert_suggestion_result( "The director used stunning special affects.", NounVerbConfusion::default(), "The director used stunning special effects.", ); } #[test] fn fix_placebo_affect_can_be_powerful() { assert_suggestion_result( "The placebo affect can be powerful.", NounVerbConfusion::default(), "The placebo effect can be powerful.", ); } #[test] fn fix_ripple_affect_across_market() { assert_suggestion_result( "We felt the ripple affect across the entire market.", NounVerbConfusion::default(), "We felt the ripple effect across the entire market.", ); } #[test] fn fix_snowball_affect_amplified_problem() { assert_suggestion_result( "The snowball affect amplified the problem.", NounVerbConfusion::default(), "The snowball effect amplified the problem.", ); } #[test] fn fix_knock_on_affect_throughout_team() { assert_suggestion_result( "That decision had a knock-on affect throughout the team.", NounVerbConfusion::default(), "That decision had a knock-on effect throughout the team.", ); } #[test] fn fix_greenhouse_affect_warms_planet() { assert_suggestion_result( "The greenhouse affect warms the planet.", NounVerbConfusion::default(), "The greenhouse effect warms the planet.", ); } #[test] fn fix_apology_had_little_affect() { assert_suggestion_result( "Her apology had little affect.", NounVerbConfusion::default(), "Her apology had little effect.", ); } #[test] fn fix_settings_go_into_affect() { assert_suggestion_result( "The new settings go into affect after a restart.", NounVerbConfusion::default(), "The new settings go into effect after a restart.", ); } #[test] fn fix_put_plan_into_affect() { assert_suggestion_result( "They put the new plan into affect last week.", NounVerbConfusion::default(), "They put the new plan into effect last week.", ); } #[test] fn fix_contract_comes_into_affect() { assert_suggestion_result( "The contract comes into affect at midnight.", NounVerbConfusion::default(), "The contract comes into effect at midnight.", ); } #[test] fn fix_warning_had_no_affect_on_behavior() { assert_suggestion_result( "The warning had no affect on his behavior.", NounVerbConfusion::default(), "The warning had no effect on his behavior.", ); } #[test] fn fix_inflation_had_opposite_affect() { assert_suggestion_result( "Inflation had the opposite affect than expected.", NounVerbConfusion::default(), "Inflation had the opposite effect than expected.", ); } #[test] fn fix_regulation_remains_in_affect() { assert_suggestion_result( "The regulation remains in affect until further notice.", NounVerbConfusion::default(), "The regulation remains in effect until further notice.", ); } #[test] fn fix_app_changes_take_affect() { assert_suggestion_result( "The app changes take affect next week.", NounVerbConfusion::default(), "The app changes take effect next week.", ); } #[test] fn fix_sound_affects_were_added() { assert_suggestion_result( "Sound affects were added in post.", NounVerbConfusion::default(), "Sound effects were added in post.", ); } // Effect/affect-specific checks // `effect` mistakenly used as the verb `affect`. #[test] fn corrects_noun_subject_effects_object() { assert_suggestion_result( "System outages effect our customers.", NounVerbConfusion::default(), "System outages affect our customers.", ); } #[test] fn corrects_effects_variant() { assert_suggestion_result( "This policy effects employee morale.", NounVerbConfusion::default(), "This policy affects employee morale.", ); } #[test] fn ignores_effect_change_idiom() { assert_lint_count( "Leaders work to effect change in their communities.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_effect_noun_phrase() { assert_lint_count( "The effect your plan had was dramatic.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_effect_as_result_noun() { assert_lint_count( "The effect was immediate and obvious.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_to_effect_substitutions() { assert_lint_count( "or it may be desired to effect substitutions", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_effect_followed_by_of_phrase() { assert_lint_count( "We measured the effect of caffeine on sleep.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_side_effects_usage() { assert_lint_count( "Side effects may include mild nausea.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_special_effects_phrase() { assert_lint_count( "She admired the special effects in the film.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_effect_in_cause_and_effect() { assert_lint_count( "The diagram explains cause and effect relationships.", NounVerbConfusion::default(), 0, ); } #[test] fn ignores_effects_with_pronoun_subject() { assert_lint_count( "Those effects were less severe than expected.", NounVerbConfusion::default(), 0, ); } #[test] fn corrects_tariff_effect_import_prices() { assert_suggestion_result( "The new tariff will effect import prices next quarter.", NounVerbConfusion::default(), "The new tariff will affect import prices next quarter.", ); } #[test] fn corrects_droughts_effect_crop_yields() { assert_suggestion_result( "Prolonged droughts severely effect crop yields across the valley.", NounVerbConfusion::default(), "Prolonged droughts severely affect crop yields across the valley.", ); } #[test] fn corrects_caffeine_effect_sleep() { assert_suggestion_result( "Caffeine can effect your sleep architecture.", NounVerbConfusion::default(), "Caffeine can affect your sleep architecture.", ); } #[test] fn corrects_bug_effect_devices() { assert_suggestion_result( "The firmware bug doesn't effect older devices.", NounVerbConfusion::default(), "The firmware bug doesn't affect older devices.", ); } #[test] fn corrects_sarcasm_effect_morale() { assert_suggestion_result( "Her sarcasm seemed to effect the team's morale.", NounVerbConfusion::default(), "Her sarcasm seemed to affect the team's morale.", ); } #[test] fn corrects_outage_effect_timeline() { assert_suggestion_result( "How will this outage effect our deployment timeline?", NounVerbConfusion::default(), "How will this outage affect our deployment timeline?", ); } #[test] fn corrects_temperatures_effect_battery() { assert_suggestion_result( "Cold temperatures drastically effect lithium-ion battery performance.", NounVerbConfusion::default(), "Cold temperatures drastically affect lithium-ion battery performance.", ); } #[test] fn corrects_policy_effect_eligibility() { assert_suggestion_result( "The policy change could effect your eligibility for benefits.", NounVerbConfusion::default(), "The policy change could affect your eligibility for benefits.", ); } #[test] fn corrects_variables_effect_results() { assert_suggestion_result( "These confounding variables may effect the study's results.", NounVerbConfusion::default(), "These confounding variables may affect the study's results.", ); } #[test] fn corrects_fans_effect_concentration() { assert_suggestion_result( "The noisy HVAC fans constantly effect concentration in the lab.", NounVerbConfusion::default(), "The noisy HVAC fans constantly affect concentration in the lab.", ); } #[test] fn corrects_hormones_effect_immunity() { assert_suggestion_result( "Stress hormones can effect immune response during recovery.", NounVerbConfusion::default(), "Stress hormones can affect immune response during recovery.", ); } #[test] fn corrects_pacing_effect_engagement() { assert_suggestion_result( "The instructor's pacing tended to effect student engagement.", NounVerbConfusion::default(), "The instructor's pacing tended to affect student engagement.", ); } #[test] fn corrects_humidity_effect_paint() { assert_suggestion_result( "Humidity levels directly effect paint curing time.", NounVerbConfusion::default(), "Humidity levels directly affect paint curing time.", ); } #[test] fn corrects_exchange_effect_invoice() { assert_suggestion_result( "The exchange rate will surely effect the final invoice.", NounVerbConfusion::default(), "The exchange rate will surely affect the final invoice.", ); } #[test] fn corrects_brightness_effect_contrast() { assert_suggestion_result( "Screen brightness settings can effect perceived contrast.", NounVerbConfusion::default(), "Screen brightness settings can affect perceived contrast.", ); } #[test] fn corrects_medication_effect_him() { assert_suggestion_result( "The medication didn't effect him the way the doctor expected.", NounVerbConfusion::default(), "The medication didn't affect him the way the doctor expected.", ); } #[test] fn corrects_payments_effect_credit() { assert_suggestion_result( "Late payments will negatively effect your credit score.", NounVerbConfusion::default(), "Late payments will negatively affect your credit score.", ); } #[test] fn corrects_wording_effect_interpretation() { assert_suggestion_result( "Minor wording tweaks shouldn't effect the legal interpretation.", NounVerbConfusion::default(), "Minor wording tweaks shouldn't affect the legal interpretation.", ); } #[test] fn corrects_traffic_effect_delivery() { assert_suggestion_result( "Traffic patterns often effect delivery windows downtown.", NounVerbConfusion::default(), "Traffic patterns often affect delivery windows downtown.", ); } #[test] fn corrects_rumor_effect_confidence() { assert_suggestion_result( "The rumor started to effect investor confidence by noon.", NounVerbConfusion::default(), "The rumor started to affect investor confidence by noon.", ); } #[test] fn corrects_allergies_effect_productivity() { assert_suggestion_result( "Seasonal allergies badly effect her productivity each April.", NounVerbConfusion::default(), "Seasonal allergies badly affect her productivity each April.", ); } #[test] fn corrects_feedback_effect_roadmap() { assert_suggestion_result( "Your feedback won't immediately effect the roadmap.", NounVerbConfusion::default(), "Your feedback won't immediately affect the roadmap.", ); } #[test] fn corrects_rules_effect_honeypot() { assert_suggestion_result( "I cant seem to get my additional rules to effect the honeypot", NounVerbConfusion::default(), "I cant seem to get my additional rules to affect the honeypot", ); } #[test] fn corrects_bandwidth_effect_video() { assert_suggestion_result( "Fluctuating bandwidth can effect video call quality.", NounVerbConfusion::default(), "Fluctuating bandwidth can affect video call quality.", ); } #[test] fn corrects_gradient_effect_sensor() { assert_suggestion_result( "The temperature gradient might effect the sensor's calibration.", NounVerbConfusion::default(), "The temperature gradient might affect the sensor's calibration.", ); } #[test] fn corrects_delays_effect_satisfaction() { assert_suggestion_result( "Even tiny delays can effect user satisfaction metrics.", NounVerbConfusion::default(), "Even tiny delays can affect user satisfaction metrics.", ); } #[test] fn corrects_architecture_effect_gps() { assert_suggestion_result( "The surrounding architecture can effect GPS accuracy.", NounVerbConfusion::default(), "The surrounding architecture can affect GPS accuracy.", ); } #[test] fn corrects_lighting_effect_color() { assert_suggestion_result( "Lighting conditions strongly effect color perception.", NounVerbConfusion::default(), "Lighting conditions strongly affect color perception.", ); } #[test] fn corrects_coach_effect_roles() { assert_suggestion_result( "The new coach's strategy will effect players' roles.", NounVerbConfusion::default(), "The new coach's strategy will affect players' roles.", ); } #[test] fn corrects_overtraining_effect_reaction() { assert_suggestion_result( "Overtraining can effect reaction time and coordination.", NounVerbConfusion::default(), "Overtraining can affect reaction time and coordination.", ); } #[test] fn corrects_label_effect_behavior() { assert_suggestion_result( "The warning label may effect how consumers use the product.", NounVerbConfusion::default(), "The warning label may affect how consumers use the product.", ); } // `affect` mistakenly used as the noun `effect`. #[test] fn corrects_because_affect_is() { assert_suggestion_result( "I worry because affect is hidden.", NounVerbConfusion::default(), "I worry because effect is hidden.", ); } #[test] fn ignores_psychology_usage() { assert_lint_count( "The patient's affect is flat.", NounVerbConfusion::default(), 0, ); } #[test] fn corrects_positive_affect_on() { assert_suggestion_result( "The new law had a positive affect on small businesses.", NounVerbConfusion::default(), "The new law had a positive effect on small businesses.", ); } #[test] fn corrects_great_affect() { assert_suggestion_result( "badges that they provide to users to allow them to promote their projects to great affect", NounVerbConfusion::default(), "badges that they provide to users to allow them to promote their projects to great effect", ); } #[test] fn corrects_affect_of() { assert_suggestion_result( "We measured the affect of caffeine on reaction time.", NounVerbConfusion::default(), "We measured the effect of caffeine on reaction time.", ); } #[test] fn corrects_side_affects() { assert_suggestion_result( "The side affects included nausea and fatigue.", NounVerbConfusion::default(), "The side effects included nausea and fatigue.", ); } #[test] fn corrects_cause_and_affect() { assert_suggestion_result( "Cause and affect are not the same thing.", NounVerbConfusion::default(), "Cause and effect are not the same thing.", ); } #[test] fn corrects_have_an_affect_on() { assert_suggestion_result( "The change will have an affect on our revenue.", NounVerbConfusion::default(), "The change will have an effect on our revenue.", ); } #[test] fn corrects_took_affect() { assert_suggestion_result( "The medicine took affect within minutes.", NounVerbConfusion::default(), "The medicine took effect within minutes.", ); } #[test] fn corrects_come_into_affect() { assert_suggestion_result( "The policy will come into affect on October 1.", NounVerbConfusion::default(), "The policy will come into effect on October 1.", ); } #[test] fn corrects_in_affect_sentence() { assert_suggestion_result( "The rules are now in affect.", NounVerbConfusion::default(), "The rules are now in effect.", ); } #[test] fn corrects_with_immediate_affect() { assert_suggestion_result( "With immediate affect, the office is closed.", NounVerbConfusion::default(), "With immediate effect, the office is closed.", ); } #[test] fn corrects_special_affects() { assert_suggestion_result( "The director used stunning special affects.", NounVerbConfusion::default(), "The director used stunning special effects.", ); } #[test] fn corrects_placebo_affect() { assert_suggestion_result( "The placebo affect can be powerful.", NounVerbConfusion::default(), "The placebo effect can be powerful.", ); } #[test] fn corrects_ripple_affect() { assert_suggestion_result( "We felt the ripple affect across the entire market.", NounVerbConfusion::default(), "We felt the ripple effect across the entire market.", ); } #[test] fn corrects_snowball_affect() { assert_suggestion_result( "The snowball affect amplified the problem.", NounVerbConfusion::default(), "The snowball effect amplified the problem.", ); } #[test] fn corrects_knock_on_affect() { assert_suggestion_result( "That decision had a knock-on affect throughout the team.", NounVerbConfusion::default(), "That decision had a knock-on effect throughout the team.", ); } #[test] fn corrects_greenhouse_affect() { assert_suggestion_result( "The greenhouse affect warms the planet.", NounVerbConfusion::default(), "The greenhouse effect warms the planet.", ); } #[test] fn corrects_little_affect() { assert_suggestion_result( "Her apology had little affect.", NounVerbConfusion::default(), "Her apology had little effect.", ); } #[test] fn corrects_go_into_affect() { assert_suggestion_result( "The new settings go into affect after a restart.", NounVerbConfusion::default(), "The new settings go into effect after a restart.", ); } #[test] fn corrects_put_plan_into_affect() { assert_suggestion_result( "They put the new plan into affect last week.", NounVerbConfusion::default(), "They put the new plan into effect last week.", ); } #[test] fn corrects_contract_into_affect() { assert_suggestion_result( "The contract comes into affect at midnight.", NounVerbConfusion::default(), "The contract comes into effect at midnight.", ); } #[test] fn corrects_no_affect_on_behavior() { assert_suggestion_result( "The warning had no affect on his behavior.", NounVerbConfusion::default(), "The warning had no effect on his behavior.", ); } #[test] fn corrects_opposite_affect() { assert_suggestion_result( "Inflation had the opposite affect than expected.", NounVerbConfusion::default(), "Inflation had the opposite effect than expected.", ); } #[test] fn corrects_remains_in_affect() { assert_suggestion_result( "The regulation remains in affect until further notice.", NounVerbConfusion::default(), "The regulation remains in effect until further notice.", ); } #[test] fn corrects_take_affect_next_week() { assert_suggestion_result( "The app changes take affect next week.", NounVerbConfusion::default(), "The app changes take effect next week.", ); } #[test] fn corrects_sound_affects() { assert_suggestion_result( "Sound affects were added in post.", NounVerbConfusion::default(), "Sound effects were added in post.", ); } #[test] fn does_not_flag_best_affect() { assert_lint_count( "Using linear regression to predict and understand what factors best affect house price", NounVerbConfusion::default(), 0, ); } #[test] fn does_not_flag_sound_affect() { assert_lint_count( "The goal of this study was to learn what properties of sound affect human focus the most.", NounVerbConfusion::default(), 0, ); } #[test] fn corrects_sound_affect() { assert_suggestion_result( "Diesel Generator's animation returns to 'idle' state, but it's sound affect remains in the 'work' state.", NounVerbConfusion::default(), "Diesel Generator's animation returns to 'idle' state, but it's sound effect remains in the 'work' state.", ); } #[test] fn does_not_flag_affect_as_verb() { assert_lint_count( "The change will affect our revenue significantly.", NounVerbConfusion::default(), 0, ); } #[test] fn does_not_flag_affects_as_verb() { assert_lint_count( "This policy directly affects remote workers.", NounVerbConfusion::default(), 0, ); } #[test] fn does_not_flag_correct_effect_noun() { assert_lint_count( "The placebo effect can be powerful.", NounVerbConfusion::default(), 0, ); } #[test] fn does_not_flag_sound_effects() { assert_lint_count( "Sound effects were added in post.", NounVerbConfusion::default(), 0, ); } #[test] fn issue_1997() { assert_no_lints( "It depends on which sources it affects, what parameters it uses, etc.", NounVerbConfusion::default(), ); } #[test] fn issue_1996() { assert_no_lints( "Avoid effects outside of functions.", NounVerbConfusion::default(), ); } #[test] fn issue_2008() { assert_no_lints( "Changes that only affect static types, without breaking runtime behavior.", NounVerbConfusion::default(), ); } #[test] fn issue_2041() { assert_suggestion_result( "Let me give you a piece of advise.", NounVerbConfusion::default(), "Let me give you a piece of advice.", ); } #[test] fn fix_helps_you_weight() { assert_suggestion_result( "An iOS app that helps you weight small things on the screen of your iPhone / iPad.", NounVerbConfusion::default(), "An iOS app that helps you weigh small things on the screen of your iPhone / iPad.", ); } #[test] fn fix_do_you_weight() { assert_suggestion_result( "How much do you weight?", NounVerbConfusion::default(), "How much do you weigh?", ); } #[test] fn fix_more_than_you_weight() { assert_suggestion_result( "contributed more than you weight", NounVerbConfusion::default(), "contributed more than you weigh", ); } } ================================================ FILE: harper-core/src/linting/noun_verb_confusion/noun_instead_of_verb/general.rs ================================================ use crate::{ CharStringExt, Lrc, Token, expr::{Expr, FirstMatchOf, LongestMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, patterns::{ModalVerb, Word, WordSet}, }; use super::super::NOUN_VERB_PAIRS; /// Pronouns that can come before verbs but not nouns const PRONOUNS: &[&str] = &["he", "I", "it", "she", "they", "we", "who", "you"]; /// Linter that corrects common noun/verb confusions pub(super) struct GeneralNounInsteadOfVerb { expr: Box, } impl Default for GeneralNounInsteadOfVerb { fn default() -> Self { // Adverbs that can come before verbs but not nouns // Note: "Sometimes" can come before a noun. let adverb_of_frequency = |tok: &Token, src: &[char]| { tok.kind.is_frequency_adverb() && !tok .span .get_content(src) .eq_ignore_ascii_case_str("sometimes") }; let pre_context = FirstMatchOf::new(vec![ Box::new(WordSet::new(PRONOUNS)), Box::new(ModalVerb::with_common_errors()), Box::new(WordSet::new(&["do", "don't", "dont"])), Box::new(adverb_of_frequency), Box::new(Word::new("to")), ]); let nouns = Lrc::new(WordSet::new( &NOUN_VERB_PAIRS .iter() .map(|&(noun, _)| noun) .collect::>(), )); let basic_pattern = Lrc::new( SequenceExpr::with(pre_context) .then_whitespace() .then(nouns.clone()), ); let pattern_followed_by_punctuation = SequenceExpr::with(basic_pattern.clone()).then_punctuation(); let pattern_followed_by_word = SequenceExpr::with(basic_pattern.clone()) .then_whitespace() .then_any_word(); Self { expr: Box::new(LongestMatchOf::new(vec![ Box::new(pattern_followed_by_punctuation), Box::new(pattern_followed_by_word), Box::new(basic_pattern), ])), } } } impl ExprLinter for GeneralNounInsteadOfVerb { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let prev_tok = &toks[0]; // If we have the next word token, try to rule out compound nouns if toks.len() > 4 { let following_tok = &toks[4]; if following_tok.kind.is_noun() && !following_tok.kind.is_proper_noun() && !following_tok.kind.is_preposition() { // But first rule out marginal "nouns" if !following_tok .span .get_content(src) .eq_any_ignore_ascii_case_str(&["it", "me", "on", "that"]) { return None; } } // If the previous word is "to", use the following word to disambiguate if prev_tok .span .get_content(src) .eq_ignore_ascii_case_chars(&['t', 'o']) && !following_tok.kind.is_determiner() { return None; } } // If we don't have the next word token, don't continue if the previous token is "to" // since "to" is a preposition and an infinitive marker and there's not enough context to disambiguate. if toks.len() <= 4 && prev_tok .span .get_content(src) .eq_ignore_ascii_case_chars(&['t', 'o']) { return None; } let noun_tok = &toks[2]; let noun_chars = noun_tok.span.get_content(src); let noun_text = noun_tok.span.get_content_string(src); let noun_lower = noun_text.to_lowercase(); let verb = NOUN_VERB_PAIRS .iter() .find(|(noun, _)| *noun == noun_lower) .map(|(_, verb)| verb)?; Some(Lint { span: noun_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( verb.chars().collect(), noun_chars, )], message: format!("`{noun_text}` is a noun, the verb should be `{verb}`."), priority: 63, }) } fn description(&self) -> &'static str { "Corrects nouns used instead of verbs when the two are related." } } ================================================ FILE: harper-core/src/linting/noun_verb_confusion/noun_instead_of_verb/mod.rs ================================================ mod general; use super::effect_affect::EffectAffect; use crate::linting::merge_linters::merge_linters; use general::GeneralNounInsteadOfVerb; merge_linters! { NounInsteadOfVerb => GeneralNounInsteadOfVerb, EffectAffect => "Corrects noun/verb confusions such as `advice/advise` and handles the common `effect/affect` mix-up." } ================================================ FILE: harper-core/src/linting/noun_verb_confusion/verb_instead_of_noun.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{UPOSSet, WordSet}, }; use harper_brill::UPOS; use super::NOUN_VERB_PAIRS; pub struct VerbInsteadOfNoun { expr: Box, } impl Default for VerbInsteadOfNoun { fn default() -> Self { let verbs = Lrc::new(WordSet::new( &NOUN_VERB_PAIRS .iter() .map(|&(_, verb)| verb) .collect::>(), )); Self { expr: Box::new( SequenceExpr::with(UPOSSet::new(&[UPOS::ADJ, UPOS::ADP])) .then_whitespace() .then(verbs.clone()), ), } } } impl ExprLinter for VerbInsteadOfNoun { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let adj_tok = &toks.first()?; let verb_tok = &toks.last()?; let adj_text = adj_tok.span.get_content_string(src); let verb_text = verb_tok.span.get_content_string(src); let verb_lower = verb_text.to_lowercase(); if adj_tok.kind.is_auxiliary_verb() || adj_tok.kind.is_upos(UPOS::AUX) { return None; } let noun = NOUN_VERB_PAIRS .iter() .find(|(_, verb)| *verb == verb_lower) .map(|(noun, _)| noun)?; // Don't flag "so I better advise you", "you'd better believe this", "you'd best listen to me". if adj_text == "better" || adj_text == "best" { return None; } // "Sound" is both adjective and noun. We want to flag the common "sound advise" // But not "sound affect", which is just as correct as "sound effect". if adj_text == "sound" && verb_text == "affect" { return None; } Some(Lint { span: verb_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( noun.chars().collect(), verb_tok.span.get_content(src), )], message: format!("`{verb_text}` is a verb, the noun should be `{noun}`."), priority: 63, }) } fn description(&self) -> &'static str { "Corrects verbs used instead of nouns when the two are related." } } ================================================ FILE: harper-core/src/linting/number_suffix_capitalization.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::{Document, Span, TokenKind}; use crate::{Number, TokenStringExt}; /// Detect incorrect capitalization for number suffixes (e.g. "2ND"). #[derive(Debug, Clone, Copy, Default)] pub struct NumberSuffixCapitalization; impl Linter for NumberSuffixCapitalization { fn lint(&mut self, document: &Document) -> Vec { let mut output = Vec::new(); for number_tok in document.iter_numbers() { if let TokenKind::Number(Number { suffix: None, .. }) = number_tok.kind { continue; } let suffix_span = Span::new_with_len(number_tok.span.end, 2) .pulled_by(2) .unwrap(); let chars = document.get_span_content(&suffix_span); if chars.iter().any(|c| !c.is_lowercase()) { output.push(Lint { span: suffix_span, lint_kind: LintKind::Capitalization, message: "This suffix should be lowercase".to_string(), suggestions: vec![Suggestion::ReplaceWith( chars.iter().map(|c| c.to_ascii_lowercase()).collect(), )], ..Default::default() }) } } output } fn description(&self) -> &'static str { "You should never capitalize number suffixes." } } #[cfg(test)] mod tests { use super::NumberSuffixCapitalization; use crate::linting::tests::assert_lint_count; #[test] fn detects_uppercase_suffix() { assert_lint_count("2ND", NumberSuffixCapitalization, 1); } #[test] fn detects_inconsistent_suffix() { assert_lint_count("2nD", NumberSuffixCapitalization, 1); } #[test] fn passes_correct_case() { assert_lint_count("2nd", NumberSuffixCapitalization, 0); } } ================================================ FILE: harper-core/src/linting/obsess_preposition.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct ObsessPreposition { expr: SequenceExpr, } impl Default for ObsessPreposition { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["obsess", "obsessed", "obsesses", "obsessing"]) .t_ws() .then_preposition(), } } } impl ExprLinter for ObsessPreposition { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn description(&self) -> &str { "Ensures valid prepositions are used with `obsess`" } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let verb_idx = 0; let verb_tok = toks.get(verb_idx)?; let verb_span = verb_tok.span; let verb_chars = verb_span.get_content(src); let prep_idx = toks.len() - 1; let prep_tok = toks.get(prep_idx)?; let prep_span = prep_tok.span; let prep_chars = prep_span.get_content(src); #[derive(PartialEq)] enum Conj { Lemma, Ed, Es, Ing, } let conj = if verb_chars.ends_with_ignore_ascii_case_chars(&['e', 'd']) { Conj::Ed } else if verb_chars.ends_with_ignore_ascii_case_chars(&['e', 's']) { Conj::Es } else if verb_chars.ends_with_ignore_ascii_case_chars(&['i', 'n', 'g']) { Conj::Ing } else { Conj::Lemma }; // 👍 // obsess* over - pay close attention to details // obsessed with - excessively preoccupied with // 👎 // obsessed of if prep_chars.eq_ignore_ascii_case_str("over") { return None; } if conj == Conj::Ed && prep_chars.eq_ignore_ascii_case_str("with") { return None; } let ok_prep_vec: &[&str] = if conj == Conj::Ed { &["over", "with"] } else { &["over"] }; let suggestions = ok_prep_vec .iter() .map(|p| Suggestion::replace_with_match_case(p.chars().collect(), prep_chars)) .collect(); let message = if ok_prep_vec.len() == 1 { format!("Use 'over' instead of '{}'.", String::from_iter(prep_chars)) } else { "For `excessively preoccupied with` use `obsessed with`. For `paid close attention to details` use `obsessed over`".to_string() }; Some(Lint { span: prep_span, lint_kind: LintKind::Usage, suggestions, message, ..Default::default() }) } } #[cfg(test)] mod tests { use super::ObsessPreposition; use crate::linting::tests::{assert_lint_message, assert_suggestion_result}; #[test] fn fix_obsess_on() { assert_suggestion_result( "Obsess on collecting good answers and you might be precise but irrelevant.", ObsessPreposition::default(), "Obsess over collecting good answers and you might be precise but irrelevant.", ); } #[test] fn fix_obsessing_on() { assert_suggestion_result( "Obsessing on finding new solutions to old problems with AI.", ObsessPreposition::default(), "Obsessing over finding new solutions to old problems with AI.", ); } #[test] fn fix_obsessing_with() { assert_suggestion_result( "I spent too long checking my code over and over, obsessing with just what might cause this", ObsessPreposition::default(), "I spent too long checking my code over and over, obsessing over just what might cause this", ); } #[test] fn fix_obsess_with() { assert_suggestion_result( "And as a programmer I've been taught to obsess with that.", ObsessPreposition::default(), "And as a programmer I've been taught to obsess over that.", ); } #[test] fn fix_obsesses_with() { assert_suggestion_result( "Every developer obsesses with micro-optimizations must be made to read it over and over again.", ObsessPreposition::default(), "Every developer obsesses over micro-optimizations must be made to read it over and over again.", ); } #[test] fn fix_obsessed_on() { assert_suggestion_result( "Secondly, if you get obsessed on any idea, then delve in it and don't worry about anything others until you get there.", ObsessPreposition::default(), "Secondly, if you get obsessed with any idea, then delve in it and don't worry about anything others until you get there.", ); } #[test] fn fix_obsess_about_2743() { assert_lint_message( "but don't obsess about it", ObsessPreposition::default(), "Use 'over' instead of 'about'.", ); } } ================================================ FILE: harper-core/src/linting/of_course.rs ================================================ //! Corrects common mistaken forms of "of course" while ignoring valid phrases like //! "kind of curse". use crate::expr::{Expr, LongestMatchOf, OwnedExprExt, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct OfCourse { expr: LongestMatchOf, } impl Default for OfCourse { fn default() -> Self { let curse_or_corse = SequenceExpr::default() .t_aco("of") .then_whitespace() .then(WordSet::new(&["curse", "corse"])); let off_course_or_coarse = SequenceExpr::default() .t_aco("off") .then_whitespace() .then(WordSet::new(&["course", "coarse"])); let expr = curse_or_corse .or_longest(off_course_or_coarse) .or_longest( SequenceExpr::default() .t_aco("o") .then_whitespace() .t_aco("course"), ) .or_longest(WordSet::new(&["ofcourse"])); Self { expr } } } impl ExprLinter for OfCourse { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched: &[Token], source: &[char]) -> Option { let phrase_span = matched.span()?; let phrase = phrase_span.get_content_string(source); if (phrase.eq_ignore_ascii_case("of curse") || phrase.eq_ignore_ascii_case("of corse")) && preceding_word(source, matched.first()?.span.start) .is_some_and(|prev| matches!(prev.as_str(), "kind" | "sort")) { return None; } if phrase.eq_ignore_ascii_case("off course") && preceding_non_whitespace_char(source, matched.first()?.span.start) .is_some_and(|ch| ch.is_alphanumeric()) { return None; } Some(Lint { span: phrase_span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "of course", phrase_span.get_content(source), )], message: "Did you mean `of course`?".to_string(), priority: 31, }) } fn description(&self) -> &str { "Corrects common mistaken forms of `of course`, including `of curse`, `off course`, and `ofcourse`, while ignoring valid phrases like `kind of curse`." } } fn preceding_word(source: &[char], offset: usize) -> Option { let prefix = source.get(..offset)?; let mut i = prefix.len().checked_sub(1)?; while prefix[i].is_whitespace() { i = i.checked_sub(1)?; } let start = prefix[..=i] .iter() .rposition(|c| c.is_whitespace()) .map(|pos| pos + 1) .unwrap_or(0); Some( prefix[start..=i] .iter() .collect::() .to_ascii_lowercase(), ) } fn preceding_non_whitespace_char(source: &[char], offset: usize) -> Option { let prefix = source.get(..offset)?; prefix.iter().rev().find(|c| !c.is_whitespace()).copied() } #[cfg(test)] mod tests { use super::OfCourse; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn flags_of_curse() { assert_suggestion_result("Yes, of curse!", OfCourse::default(), "Yes, of course!"); } #[test] fn flags_of_corse() { assert_suggestion_result( "Well, of corse we can.", OfCourse::default(), "Well, of course we can.", ); } #[test] fn ignores_kind_of_curse() { assert_lint_count("This kind of curse is dangerous.", OfCourse::default(), 0); } #[test] fn ignores_sort_of_curse() { assert_lint_count("It's a sort of curse that lingers.", OfCourse::default(), 0); } #[test] fn ignores_curse_of_title() { assert_lint_count( "The Curse of Strahd is a famous module.", OfCourse::default(), 0, ); } #[test] fn flags_off_course() { assert_suggestion_result( "Yes, off course we should do that.", OfCourse::default(), "Yes, of course we should do that.", ); } #[test] fn flags_o_course() { assert_suggestion_result( "Yes, o course we should do that.", OfCourse::default(), "Yes, of course we should do that.", ); } #[test] fn flags_ofcourse() { assert_suggestion_result( "Ofcourse, I like other languages.", OfCourse::default(), "Of course, I like other languages.", ); } #[test] fn flags_off_coarse() { assert_suggestion_result( "Off coarse, the web service will still be operational.", OfCourse::default(), "Of course, the web service will still be operational.", ); } #[test] fn ignores_literal_off_course() { assert_lint_count( "Her sailboat had been driven off course by the storm.", OfCourse::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/oldest_in_the_book.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, Repeating, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct OldestInTheBook { expr: SequenceExpr, } impl Default for OldestInTheBook { fn default() -> Self { let adj = |t: &Token, s: &[char]| { let k = &t.kind; (k.is_np_member() || k.is_adjective()) && !k.is_noun() && !t .span .get_content(s) .eq_ignore_ascii_case_chars(&['i', 'n']) }; // Zero or more adjectives let adjseq = Repeating::new(Box::new(SequenceExpr::with(adj).t_ws()), 0); let noun = |t: &Token, s: &[char]| { let k = &t.kind; (k.is_np_member() || k.is_noun() || k.is_oov()) && !t .span .get_content(s) .eq_ignore_ascii_case_chars(&['i', 'n']) }; // One or more nouns let nounseq = SequenceExpr::with(noun).then_optional(Repeating::new( Box::new(SequenceExpr::default().t_ws().then(noun)), 1, )); let noun_phrase = SequenceExpr::optional(adjseq).then(nounseq); Self { expr: SequenceExpr::fixed_phrase("oldest ") .then(noun_phrase) .then_fixed_phrase(" in the books"), } } } impl ExprLinter for OldestInTheBook { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], _ctx: Option<(&[Token], &[Token])>, ) -> Option { let np = &toks[2..toks.len() - 4]; let tricky = np.iter().any(|n| { n.span .get_content(src) .eq_any_ignore_ascii_case_str(&["trick", "tricks"]) }); let message = if tricky { "This idiom should use singular `book` instead of plural `books`." } else { "If this is a play on the idiom `oldest trick in the book`, it should use singular `book` instead of plural `books`." } .to_string(); Some(Lint { span: toks.last()?.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "book", toks.last()?.span.get_content(src), )], message, ..Default::default() }) } fn description(&self) -> &'static str { "Detects the idiom `oldest X in the books`, which should use singular `book`." } } #[cfg(test)] mod tests { use super::OldestInTheBook; use crate::linting::tests::{assert_lint_message, assert_suggestion_result}; // Probable references to the idiom "oldest trick in the book" #[test] fn fix_delphi_mistake() { assert_suggestion_result( "This is the oldest Delphi mistake in the books and I'm sure you've made it before (we all have), and I'm sure you recognise it when you see it.", OldestInTheBook::default(), "This is the oldest Delphi mistake in the book and I'm sure you've made it before (we all have), and I'm sure you recognise it when you see it.", ); } #[test] fn fix_trick() { assert_suggestion_result( "... oldest trick in the books, a restart and it works all the times(for now).", OldestInTheBook::default(), "... oldest trick in the book, a restart and it works all the times(for now).", ); } #[test] fn fix_virus_trick() { assert_suggestion_result( "Once the OS is started the MBR is typically protected for virus reasons - this is one of the oldest virus tricks in the books - goes back to ...", OldestInTheBook::default(), "Once the OS is started the MBR is typically protected for virus reasons - this is one of the oldest virus tricks in the book - goes back to ...", ) } #[test] fn fix_mistake() { assert_suggestion_result( "Ok, I realized now that I was making the oldest mistake in the books with my code, dividing my v by 2 instead of dividing it by 5.", OldestInTheBook::default(), "Ok, I realized now that I was making the oldest mistake in the book with my code, dividing my v by 2 instead of dividing it by 5.", ); } #[test] fn fix_tricks() { assert_suggestion_result( "He enables the oldest tricks in the books, create fear from thing like prosperity (we really don't need Foxconn?)", OldestInTheBook::default(), "He enables the oldest tricks in the book, create fear from thing like prosperity (we really don't need Foxconn?)", ); } #[test] fn fix_military_plays() { assert_suggestion_result( "Isnt that like one of the oldest military plays in the books?", OldestInTheBook::default(), "Isnt that like one of the oldest military plays in the book?", ); } // Test messages #[test] fn is_oldest_trick_in_the_books_ref_to_idom() { assert_lint_message( "This is one of the oldest trick in the books", OldestInTheBook::default(), "This idiom should use singular `book` instead of plural `books`.", ); } #[test] fn is_chromatic_alterations_ref_to_idom() { assert_lint_message( "One of the oldest chromatic alterations in the books is the raising of the leading tone", OldestInTheBook::default(), "If this is a play on the idiom `oldest trick in the book`, it should use singular `book` instead of plural `books`.", ); } } ================================================ FILE: harper-core/src/linting/on_floor.rs ================================================ use crate::CharStringExt; use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::patterns::WordSet; use crate::{ Lrc, Token, TokenStringExt, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct OnFloor { expr: LongestMatchOf, } impl Default for OnFloor { fn default() -> Self { let preposition = WordSet::new(&["in", "at"]); let on_the_floor = Lrc::new( SequenceExpr::with(preposition) .t_ws() .t_aco("the") .t_ws() .t_any() .t_ws() .t_aco("floor"), ); let look_up_phrase = Lrc::new( SequenceExpr::word_set(&["look", "looking", "looks", "looked"]) .t_ws() .t_aco("up"), ); let stop = Lrc::new(WordSet::new(&["stop", "stopping", "stops", "stopped"])); let exceptions = Lrc::new(LongestMatchOf::new(vec![ Box::new(SequenceExpr::with(look_up_phrase.clone())), Box::new(SequenceExpr::with(stop.clone())), ])); let pattern = LongestMatchOf::new(vec![ Box::new(on_the_floor.clone()), Box::new( SequenceExpr::with(exceptions.clone()) .t_ws() .then(on_the_floor.clone()), ), ]); Self { expr: pattern } } } impl ExprLinter for OnFloor { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let incorrect_preposition = matched_tokens[0..1].span()?.get_content(source).to_string(); // if the first token is not "in" or "at", means that the match is belong to the exceptions // so we don't need to lint it if !["in", "at"].contains(&incorrect_preposition.to_lowercase().as_str()) { return None; } let span = matched_tokens[0..1].span()?; Some(Lint { lint_kind: LintKind::WordChoice, span, suggestions: vec![Suggestion::replace_with_match_case_str( "on", span.get_content(source), )], message: format!( "Corrects `{incorrect_preposition}` to `on` when talking about position inside a building", ) .to_string(), priority: 63, }) } fn description(&self) -> &'static str { "This rule identifies incorrect uses of the prepositions `in` or `at` when referring to locations inside a building and recommends using `on the floor` instead." } } #[cfg(test)] mod tests { use super::OnFloor; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn not_lint_with_correct_phrase() { assert_lint_count( "I'm living on the 3rd floor of a building.", OnFloor::default(), 0, ); } #[test] fn lint_with_in() { assert_suggestion_result( "I'm living in the 3rd floor of a building.", OnFloor::default(), "I'm living on the 3rd floor of a building.", ); } #[test] fn lint_with_at() { assert_suggestion_result( "I'm living at the second floor of a building.", OnFloor::default(), "I'm living on the second floor of a building.", ); } #[test] fn in_the_start_of_sentence() { assert_suggestion_result( "In the 3rd floor of a building.", OnFloor::default(), "On the 3rd floor of a building.", ); } #[test] fn at_the_start_of_sentence() { assert_suggestion_result( "At the second floor of a building.", OnFloor::default(), "On the second floor of a building.", ); } #[test] fn no_lint_with_look_up_at() { assert_lint_count("She looked up at the third floor.", OnFloor::default(), 0); } #[test] fn no_lint_with_stop_at() { assert_lint_count( "The elevator stops at the 3rd floor of a building.", OnFloor::default(), 0, ); } #[test] fn no_lint_with_looking_up_at() { assert_lint_count( "The workers are looking up at the 3rd floor of a building.", OnFloor::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/once_or_twice.rs ================================================ use crate::CharStringExt; use crate::Token; use crate::expr::{Expr, SequenceExpr}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct OnceOrTwice { expr: SequenceExpr, } impl Default for OnceOrTwice { fn default() -> Self { let pattern = SequenceExpr::aco("once") .then_whitespace() .t_aco("a") .then_whitespace() .t_aco("twice"); Self { expr: pattern } } } impl ExprLinter for OnceOrTwice { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let article = matched_tokens.iter().find(|token| { token.kind.is_word() && token.span.get_content(source).eq_ignore_ascii_case_str("a") })?; let span = article.span; let original = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str("or", original)], message: "Did you mean “or”?".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Detects the mistaken phrase `once a twice` and suggests `once or twice`." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::OnceOrTwice; #[test] fn corrects_once_a_twice() { assert_suggestion_result( "He wants to do it once a twice a month.", OnceOrTwice::default(), "He wants to do it once or twice a month.", ); } #[test] fn allows_once_or_twice() { assert_no_lints( "He wants to do it once or twice a month.", OnceOrTwice::default(), ); } #[test] fn corrects_once_a_twice_sentence_start() { assert_suggestion_result( "Once a twice, we gathered for coffee.", OnceOrTwice::default(), "Once or twice, we gathered for coffee.", ); } #[test] fn corrects_once_a_twice_uppercase() { assert_suggestion_result( "ONCE A TWICE WE MET.", OnceOrTwice::default(), "ONCE OR TWICE WE MET.", ); } #[test] fn corrects_once_a_twice_mixed_case() { assert_suggestion_result( "once a Twice sounds odd.", OnceOrTwice::default(), "once or Twice sounds odd.", ); } #[test] fn corrects_once_a_twice_with_exclamation() { assert_suggestion_result( "Let's do it once a twice!", OnceOrTwice::default(), "Let's do it once or twice!", ); } #[test] fn corrects_once_a_twice_with_question_mark() { assert_suggestion_result( "You really tried once a twice?", OnceOrTwice::default(), "You really tried once or twice?", ); } #[test] fn corrects_once_a_twice_inside_quotes() { assert_suggestion_result( "He said, \"once a twice\" without thinking.", OnceOrTwice::default(), "He said, \"once or twice\" without thinking.", ); } #[test] fn corrects_once_a_twice_with_comma() { assert_suggestion_result( "We planned it once a twice, but never finished.", OnceOrTwice::default(), "We planned it once or twice, but never finished.", ); } #[test] fn corrects_once_a_twice_with_parentheses() { assert_suggestion_result( "Try it (just once a twice) before judging.", OnceOrTwice::default(), "Try it (just once or twice) before judging.", ); } #[test] fn corrects_once_a_twice_after_colon() { assert_suggestion_result( "My answer is simple: once a twice is too many.", OnceOrTwice::default(), "My answer is simple: once or twice is too many.", ); } #[test] fn corrects_once_a_twice_with_double_space() { assert_suggestion_result( "We tested once a twice before launch.", OnceOrTwice::default(), "We tested once or twice before launch.", ); } #[test] fn corrects_once_a_twice_before_semicolon() { assert_suggestion_result( "They tried once a twice; it still failed.", OnceOrTwice::default(), "They tried once or twice; it still failed.", ); } #[test] fn corrects_once_a_twice_newline_split() { assert_suggestion_result( "We met once a twice\nwhen the cafe was quiet.", OnceOrTwice::default(), "We met once or twice\nwhen the cafe was quiet.", ); } #[test] fn corrects_once_a_twice_with_tab() { assert_suggestion_result( "Schedule it once a twice\tfor testing.", OnceOrTwice::default(), "Schedule it once or twice\tfor testing.", ); } #[test] fn corrects_once_a_twice_multiple_sentences() { assert_suggestion_result( "Do it once a twice. Then rest.", OnceOrTwice::default(), "Do it once or twice. Then rest.", ); } #[test] fn corrects_once_a_twice_before_period() { assert_suggestion_result( "He rehearsed once a twice.", OnceOrTwice::default(), "He rehearsed once or twice.", ); } #[test] fn corrects_once_a_twice_with_trailing_space() { assert_suggestion_result( "Practice once a twice .", OnceOrTwice::default(), "Practice once or twice .", ); } #[test] fn corrects_once_a_twice_before_dash() { assert_suggestion_result( "He called once a twice—no response.", OnceOrTwice::default(), "He called once or twice—no response.", ); } #[test] fn corrects_once_a_twice_around_em_dash() { assert_suggestion_result( "She visits once a twice—maybe thrice.", OnceOrTwice::default(), "She visits once or twice—maybe thrice.", ); } #[test] fn corrects_once_a_twice_before_quote() { assert_suggestion_result( "We heard once a twice, \"she's late.\"", OnceOrTwice::default(), "We heard once or twice, \"she's late.\"", ); } #[test] fn corrects_once_a_twice_all_caps_sentence() { assert_suggestion_result( "DO IT ONCE A TWICE RIGHT NOW!", OnceOrTwice::default(), "DO IT ONCE OR TWICE RIGHT NOW!", ); } #[test] fn allows_once_a_time_story() { assert_no_lints("Once a time, in a distant land...", OnceOrTwice::default()); } #[test] fn allows_once_a_week_routine() { assert_no_lints("We meet once a week to sync up.", OnceOrTwice::default()); } #[test] fn allows_once_a_while_phrase() { assert_no_lints( "Check in every once a while to stay updated.", OnceOrTwice::default(), ); } #[test] fn allows_once_or_twice_uppercase() { assert_no_lints("ONCE OR TWICE, WE MADE IT WORK.", OnceOrTwice::default()); } #[test] fn allows_twice_without_once() { assert_no_lints( "We only managed it twice this year.", OnceOrTwice::default(), ); } #[test] fn allows_once_and_twice_separated() { assert_no_lints("Once I tried; twice I failed.", OnceOrTwice::default()); } #[test] fn allows_oncemisatypo() { assert_no_lints("oncemisatypo appears once a line.", OnceOrTwice::default()); } #[test] fn allows_spaced_words() { assert_no_lints( "We say once at twice distance to be safe.", OnceOrTwice::default(), ); } } ================================================ FILE: harper-core/src/linting/one_and_the_same.rs ================================================ use crate::expr::Expr; use crate::expr::FixedPhrase; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::{Lrc, Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct OneAndTheSame { expr: LongestMatchOf, } impl Default for OneAndTheSame { fn default() -> Self { let one_in_the_same = Lrc::new(FixedPhrase::from_phrase("one in the same")); Self { expr: LongestMatchOf::new(vec![ Box::new( SequenceExpr::word_set(&["are", "were"]) .t_ws() .then(one_in_the_same.clone()), ), Box::new( SequenceExpr::with(one_in_the_same.clone()) .t_ws() .t_aco("as"), ), ]), } } } fn ws_word(word: &'static str) -> SequenceExpr { SequenceExpr::default().t_ws().t_aco(word) } impl ExprLinter for OneAndTheSame { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let phrase = if matched_tokens.last()?.span.get_content(source) == ['a', 's'] { matched_tokens[0..matched_tokens.len() - 2].span()? } else { matched_tokens[2..].span()? }; Some(Lint { span: phrase, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "one and the same".chars().collect(), phrase.get_content(source), )], message: "The actual idiom is with the word `and`.".to_owned(), priority: 127, }) } fn description(&self) -> &'static str { "This linter flags instances of the nonstandard phrase `one in the same`. The correct, more accepted form is `one and the same`" } } #[cfg(test)] mod tests { use super::OneAndTheSame; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_after_are_atomic() { assert_suggestion_result( "... are one in the same ...", OneAndTheSame::default(), "... are one and the same ...", ); } #[test] fn corrects_after_were_atomic() { assert_suggestion_result( "... were one in the same ...", OneAndTheSame::default(), "... were one and the same ...", ); } #[test] fn doesnt_flag_after_other_words_atomic() { assert_lint_count( "... and another one in the same place ...", OneAndTheSame::default(), 0, ); } #[test] fn corrects_github_are() { assert_suggestion_result( "Yes, I believe they are one in the same.", OneAndTheSame::default(), "Yes, I believe they are one and the same.", ); } #[test] fn corrects_github_were() { assert_suggestion_result( "As prior to OpenShift 4.0, OAuth and Kubernetes REST API were one in the same, option (2) above should still work there.", OneAndTheSame::default(), "As prior to OpenShift 4.0, OAuth and Kubernetes REST API were one and the same, option (2) above should still work there.", ); } #[test] fn corrects_before_as_atomic() { assert_suggestion_result( "... one in the same as ...", OneAndTheSame::default(), "... one and the same as ...", ); } #[test] fn corrects_before_as_github() { assert_suggestion_result( "In our case the slicedState is one in the same as the featureState", OneAndTheSame::default(), "In our case the slicedState is one and the same as the featureState", ); } #[test] #[ignore = "needs zero-width end-of-chunk pattern akin to regex `$`"] fn corrects_at_end() { assert_suggestion_result( "I think this is one in the same.", OneAndTheSame::default(), "I think this is one and the same.", ); } #[test] fn corrects_is_as() { assert_suggestion_result( "I believe this and this issue is one in the same as Next.js uses cloudflare workers for it's edge infra.", OneAndTheSame::default(), "I believe this and this issue is one and the same as Next.js uses cloudflare workers for it's edge infra.", ); } #[test] fn avoids_false_positive() { assert_lint_count( "If there is no postgresql.pg_hba either there is one in the same section of patroni.yaml or pg_hba.conf is not managed by Patroni.", OneAndTheSame::default(), 0, ); } #[test] #[ignore = "Cannot detect unexpected ungrammatical `same of`"] fn corrects_is_of() { assert_suggestion_result( "R3 that Stephan Buhre noted is one-in-the-same of what I posted.", OneAndTheSame::default(), "R3 that Stephan Buhre noted is one and the same of what I posted.", ); } #[test] fn doesnt_flag_ambiguous_before_noun() { assert_lint_count( "I'm guessing this is one in the same request.", OneAndTheSame::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/one_of_the_singular.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, }; pub struct OneOfTheSingular { expr: SequenceExpr, dict: D, } pub trait SeqExprExt { fn then_my_noun_or_adjective(self) -> Self; } impl SeqExprExt for SequenceExpr { fn then_my_noun_or_adjective(self) -> Self { self.then(|t: &Token, s: &[char]| { // We can't restrict to singular nouns because it will match and then flag the part of a phrase // leading up to but not including a plural noun, even when that plural noun is the result of // this linter having corrected a mistake. // eg. "one of the train station" -> "one of the train stations" will now match on "one of the train". (t.kind.is_non_possessive_noun() || t.kind.is_adjective()) && !t.kind.is_preposition() // "in" etc. && !t.kind.is_pronoun() // "who" etc. && !t .span .get_content(s) .eq_any_ignore_ascii_case_str(&["ah", "few", "first", "said", "uh"]) }) } } impl OneOfTheSingular { pub fn new(dict: D) -> Self { let advs = SequenceExpr::default().then_zero_or_more_spaced(SequenceExpr::default().then_adverb()); let adj_or_nouns = SequenceExpr::default() .then_zero_or_more_spaced(SequenceExpr::default().then_my_noun_or_adjective()); Self { expr: SequenceExpr::fixed_phrase("one of the ") .then(SequenceExpr::optional(advs.t_ws()).then(adj_or_nouns)), dict, } } } impl ExprLinter for OneOfTheSingular { type Unit = Chunk; fn description(&self) -> &str { "Corrects 'one of the [singular]' to 'one of the [plural]'" } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let nountok = toks.last()?; // It's only a mistake if the noun phrase ends with a singular noun. if !nountok.kind.is_singular_noun() // "Being" in eg. one of the most widely used being the bi-directional inference algorithm. || nountok.kind.is_verb_progressive_form() { return None; } // If any token is a singular noun that's not also a plural noun, don't continue. if toks .iter() .any(|t| t.kind.is_plural_noun() && !t.kind.is_singular_noun()) { return None; } // But if not if it's part of a hyphenated compound. if let Some(next) = ctx?.1.first() && (next.kind.is_hyphen() || next.kind.is_comma()) { return None; } let nounspan = nountok.span; let singular = nounspan.get_content(src); let mut plural_s = singular.to_vec(); let mut plural_es = singular.to_vec(); plural_s.push('s'); plural_es.extend(['e', 's']); let mut suggestions = vec![]; if self .dict .get_word_metadata(&plural_s) .is_some_and(|m| m.is_plural_noun()) { suggestions.push(Suggestion::replace_with_match_case(plural_s, singular)); } if self .dict .get_word_metadata(&plural_es) .is_some_and(|m| m.is_plural_noun()) { suggestions.push(Suggestion::replace_with_match_case(plural_es, singular)); } if singular.ends_with_ignore_ascii_case_chars(&['y']) { // Handle words ending in 'y' -> 'ies' (e.g., "city" -> "cities") let mut plural_ies = singular[..singular.len() - 1].to_vec(); plural_ies.extend(['i', 'e', 's']); if self .dict .get_word_metadata(&plural_ies) .is_some_and(|m| m.is_plural_noun()) { suggestions.push(Suggestion::replace_with_match_case(plural_ies, singular)); } } if singular.ends_with_ignore_ascii_case_chars(&['f', 'e']) { // Handle words ending in 'fe' -> 'ves' (e.g., "wife" -> "wives") let mut plural_ves = singular[..singular.len() - 2].to_vec(); plural_ves.extend(['v', 'e', 's']); if self .dict .get_word_metadata(&plural_ves) .is_some_and(|m| m.is_plural_noun()) { suggestions.push(Suggestion::replace_with_match_case(plural_ves, singular)); } } Some(Lint { span: nounspan, lint_kind: LintKind::Usage, suggestions, message: "The construction `one of the ...` should use a plural noun.".to_string(), ..Default::default() }) } fn expr(&self) -> &dyn Expr { &self.expr } } #[cfg(test)] mod tests { use super::OneOfTheSingular; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use crate::spell::FstDictionary; #[test] fn fix_one_of_the_noun() { assert_suggestion_result( "one of the noun", OneOfTheSingular::new(FstDictionary::curated()), "one of the nouns", ); } #[test] fn fix_one_of_the_noun_noun() { assert_suggestion_result( "one of the car park", OneOfTheSingular::new(FstDictionary::curated()), "one of the car parks", ); } #[test] fn fix_one_of_the_adj_noun() { assert_suggestion_result( "one of the best noun", OneOfTheSingular::new(FstDictionary::curated()), "one of the best nouns", ); } #[test] fn fix_one_of_the_adv_adv_adj_adj_noun_noun() { assert_suggestion_result( "one of the really incredibly big red rubber ball", OneOfTheSingular::new(FstDictionary::curated()), "one of the really incredibly big red rubber balls", ); } #[test] fn fix_one_of_the_best_tutorial() { assert_suggestion_result( "Bro casually dropped one of the best graphics tutorial I've ever seen and thought we wouldn't notice", OneOfTheSingular::new(FstDictionary::curated()), "Bro casually dropped one of the best graphics tutorials I've ever seen and thought we wouldn't notice", ); } #[test] fn fix_one_of_the_neat_trick() { assert_suggestion_result( "One of the neat trick with AVX-512 is that given a mask", OneOfTheSingular::new(FstDictionary::curated()), "One of the neat tricks with AVX-512 is that given a mask", ); } #[test] fn fix_one_of_the_latest_version() { assert_suggestion_result( "Footer line shown since one of the latest version", OneOfTheSingular::new(FstDictionary::curated()), "Footer line shown since one of the latest versions", ); } #[test] fn fix_one_of_the_node() { assert_suggestion_result( "... noticed occasional production issue when one of the node loses connection", OneOfTheSingular::new(FstDictionary::curated()), "... noticed occasional production issue when one of the nodes loses connection", ); } #[test] fn fix_one_of_the_unstaged_file() { assert_suggestion_result( "Sublime Merge hangs if one of the unstaged file is a pretty ...", OneOfTheSingular::new(FstDictionary::curated()), "Sublime Merge hangs if one of the unstaged files is a pretty ...", ); } #[test] fn fix_one_of_the_tedious_things() { assert_suggestion_result( "One of the tedious thing in Stack Overflow is to grab example data provided by users", OneOfTheSingular::new(FstDictionary::curated()), "One of the tedious things in Stack Overflow is to grab example data provided by users", ); } #[test] fn fix_one_of_the_brave_process() { assert_suggestion_result( "One of the Brave Process is consuming almost 170%", OneOfTheSingular::new(FstDictionary::curated()), "One of the Brave Processes is consuming almost 170%", ); } #[test] fn fix_one_of_the_most_cumbersome_thing() { assert_suggestion_result( "One of the most cumbersome thing to create in markdown is a table.", OneOfTheSingular::new(FstDictionary::curated()), "One of the most cumbersome things to create in markdown is a table.", ); } #[test] fn fix_one_of_the_test() { assert_suggestion_result( "Not passing one of the test", OneOfTheSingular::new(FstDictionary::curated()), "Not passing one of the tests", ); } #[test] fn fix_one_of_the_process_main_thread() { assert_suggestion_result( "And those threads life cycle is very long, sometimes, it will be one of the process main thread", OneOfTheSingular::new(FstDictionary::curated()), "And those threads life cycle is very long, sometimes, it will be one of the process main threads", ); } #[test] fn dont_flag_being() { assert_no_lints( "HMMs underlie the functioning of stochastic taggers and are used in various algorithms one of the most widely used being the bi-directional inference algorithm.", OneOfTheSingular::new(FstDictionary::curated()), ); } #[test] fn dont_flag_one_of_the_rabbits_gloves() { assert_no_lints( "As she said this she looked down at her hands, and was surprised to see that she had put on one of the Rabbit’s little white kid gloves while she was talking.", OneOfTheSingular::new(FstDictionary::curated()), ); } } ================================================ FILE: harper-core/src/linting/open_compounds.rs ================================================ use crate::expr::{Expr, LongestMatchOf, SequenceExpr}; use crate::{Lrc, Token, patterns::WordSet}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; use hashbrown::HashMap; pub struct OpenCompounds { expr: LongestMatchOf, compound_to_phrase: HashMap, } impl Default for OpenCompounds { fn default() -> Self { let phrases = [ "a few", "a lot", "as well", "at all", "at least", "each other", "in case", "in fact", "in front", "up to", ]; let mut compound_to_phrase = HashMap::new(); for phrase in phrases { compound_to_phrase.insert( phrase .split_whitespace() .map(|s| s.to_lowercase()) .collect::(), phrase.to_string(), ); } let mut compound_wordset = WordSet::default(); for compound in compound_to_phrase.keys().cloned().collect::>() { compound_wordset.add(&compound); } let compound = Lrc::new(SequenceExpr::with(compound_wordset)); let with_prev = SequenceExpr::anything().then(compound.clone()); let with_next = SequenceExpr::with(compound.clone()).then_anything(); let with_prev_and_next = SequenceExpr::anything() .then(compound.clone()) .then_anything(); Self { expr: LongestMatchOf::new(vec![ Box::new(with_prev_and_next), Box::new(with_prev), Box::new(with_next), Box::new(compound), ]), compound_to_phrase, } } } impl ExprLinter for OpenCompounds { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_toks: &[Token], source_chars: &[char]) -> Option { // Because we don't have anything like regex captures we need to find which token matched which compound let index = self .compound_to_phrase .keys() .find_map(|compound| get_compound_idx(matched_toks, source_chars, compound))?; let span = matched_toks[index].span; let compound_string = span.get_content(source_chars).iter().collect::(); // Ignore if there's a hyphen immediately on either side if (0..matched_toks.len()) .filter(|&i| i != index) .any(|i| matched_toks[i].kind.is_hyphen()) { return None; } // Ignore trademarks etc. like InFront, inFront let phrase = self .compound_to_phrase .get(&compound_string.to_lowercase())?; if compound_string .chars() .nth(phrase.find(' ')?)? .is_uppercase() { return None; } Some(Lint { span, lint_kind: LintKind::BoundaryError, suggestions: vec![Suggestion::replace_with_match_case( phrase.chars().collect(), span.get_content(source_chars), )], message: format!("`{phrase}` should be written as two words."), priority: 31, }) } fn description(&self) -> &str { "Corrects compound words that should be written as two words." } } fn get_compound_idx(toks: &[Token], src: &[char], compound: &str) -> Option { let len = compound.len(); let tok_count = toks.len(); match tok_count { 1 => Some(0), 3 => Some(1), 2 => { let [tok0, tok1] = toks else { return None }; let [len0, len1] = [tok0.span.len(), tok1.span.len()]; if len0 == len && len1 != len { Some(0) } else if len1 == len && len0 != len { Some(1) } else if tok0.kind.is_word() && !tok1.kind.is_word() { Some(0) } else if !tok0.kind.is_word() && tok1.kind.is_word() { Some(1) } else { Some( !tok0 .span .get_content(src) .iter() .collect::() .eq_ignore_ascii_case(compound) as usize, ) } } _ => None, } } #[cfg(test)] mod tests { use super::OpenCompounds; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // In front #[test] fn corrects_lone_infront() { assert_suggestion_result( "Button always overlaps (infront) of other views.", OpenCompounds::default(), "Button always overlaps (in front) of other views.", ); } #[test] fn corrects_infront() { assert_suggestion_result( "So if i have no variable or a running process id/name which indicates that liveley is infront/fullscreen i can't do anything further via batch and must wait ...", OpenCompounds::default(), "So if i have no variable or a running process id/name which indicates that liveley is in front/fullscreen i can't do anything further via batch and must wait ...", ); } #[test] fn ignores_pascalcase() { assert_lint_count( "InFront Labs, LLC has 16 repositories available. Follow their code on GitHub.", OpenCompounds::default(), 0, ); } #[test] fn ignores_camelcase() { assert_lint_count( "Click the \"toggle\" button to see how wrapping changes when an inFront is added to a letter in a word.", OpenCompounds::default(), 0, ); } #[test] fn correct_with_period_after() { assert_suggestion_result( "Car with a reversed ramp infront.", OpenCompounds::default(), "Car with a reversed ramp in front.", ); } #[test] fn ignore_hyphen_before() { assert_lint_count("-infront", OpenCompounds::default(), 0); } #[test] fn ignore_hyphen_after() { assert_lint_count("infront-", OpenCompounds::default(), 0); } #[test] fn ignores_with_hyphen_before() { assert_lint_count( "Instantly share code, notes, and snippets. @yossi-infront", OpenCompounds::default(), 0, ); } #[test] fn ignores_with_hyphen_after() { assert_lint_count( "infront-cycle.ipe · infront-cycle.ipe · infront-cycle.svg · infront-cycle.svg · infront-s1s2.ipe · infront-s1s2.ipe · infront-s1s2.svg · infront-s1s2.svg.", OpenCompounds::default(), 0, ); } #[test] fn even_repeated_infront_works() { assert_suggestion_result( "infront infront", OpenCompounds::default(), "in front in front", ); } // A few #[test] fn correct_afew_atomic() { assert_suggestion_result( "ITK code to generate anisotropic metrics, mostly Riemannian metrics and afew particular cases of Finslerian metrics.", OpenCompounds::default(), "ITK code to generate anisotropic metrics, mostly Riemannian metrics and a few particular cases of Finslerian metrics.", ); } // A lot #[test] fn correct_alot_atomic() { assert_suggestion_result("Alot", OpenCompounds::default(), "A lot"); } // As well #[test] fn correct_aswell_atomic() { assert_suggestion_result("Aswell", OpenCompounds::default(), "As well"); } #[test] fn corrects_as_keyboards_aswell() { assert_suggestion_result( "Tool to read physical joystick devices, keyboards aswell, and create virtual joystick devices and output keyboard presses on a Linux system.", OpenCompounds::default(), "Tool to read physical joystick devices, keyboards as well, and create virtual joystick devices and output keyboard presses on a Linux system.", ); } #[test] fn corrects_aswell_as() { assert_suggestion_result( "When UseAcrylic is true in Focused aswell as Unfocused Apearance , changing enableUnfocusedAcrylic at runtime doesn't work", OpenCompounds::default(), "When UseAcrylic is true in Focused as well as Unfocused Apearance , changing enableUnfocusedAcrylic at runtime doesn't work", ); } #[test] fn corrects_toml_aswell() { assert_suggestion_result( "format Cargo.toml aswell #5893 - rust-lang/rustfmt", OpenCompounds::default(), "format Cargo.toml as well #5893 - rust-lang/rustfmt", ); } #[test] fn correct_aswell() { assert_suggestion_result( "'wejoy' is a tool to read physical joystick devices, aswell as keyboards, create virtual joystick devices and output keyboard presses on a Linux system.", OpenCompounds::default(), "'wejoy' is a tool to read physical joystick devices, as well as keyboards, create virtual joystick devices and output keyboard presses on a Linux system.", ); } // At all #[test] fn correct_atall() { assert_suggestion_result( "claude code with vs code extension not working atall", OpenCompounds::default(), "claude code with vs code extension not working at all", ); } // At least #[test] fn correct_atleast_atomic() { assert_suggestion_result("Atleast", OpenCompounds::default(), "At least"); } #[test] fn ignore_atleast_pascalcase() { assert_lint_count( "I want to understand if we are using AtLeast correctly.", OpenCompounds::default(), 0, ); } #[test] fn ignore_atleast_camelcase() { assert_lint_count( "verfiy with atLeast = 0 should pass even if the mocked function is never called.", OpenCompounds::default(), 0, ); } #[test] fn correct_atleast() { assert_suggestion_result( "Mar 22, 2562 BE — constructor - expected atleast one input #250.", OpenCompounds::default(), "Mar 22, 2562 BE — constructor - expected at least one input #250.", ); } // Each other #[test] fn correct_eachother_atomic() { assert_suggestion_result("Eachother", OpenCompounds::default(), "Each other"); } #[test] fn correct_eachother() { assert_suggestion_result( "Script parsing fails when two scenes reference eachother", OpenCompounds::default(), "Script parsing fails when two scenes reference each other", ); } // In case #[test] fn correct_incase_atomic() { assert_suggestion_result("Incase", OpenCompounds::default(), "In case"); } #[test] fn correct_in_case() { assert_suggestion_result( "Support for enum variable incase of reusable enum class", OpenCompounds::default(), "Support for enum variable in case of reusable enum class", ); } #[test] fn ignore_incase_pascalcase() { assert_lint_count( "InCase save your secrets for a friend, so they can use in case it in case you went \"missing\".", OpenCompounds::default(), 0, ); } // In fact #[test] fn correct_infact_atomic() { assert_suggestion_result( "Yes I do infact exist :O", OpenCompounds::default(), "Yes I do in fact exist :O", ); } // up to #[test] fn correct_upto() { assert_suggestion_result( "Free for upto 10k subscribers, unlimited push notifications, in-browser messaging", OpenCompounds::default(), "Free for up to 10k subscribers, unlimited push notifications, in-browser messaging", ); } } ================================================ FILE: harper-core/src/linting/open_the_light.rs ================================================ use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::{ Lrc, Token, TokenStringExt, linting::{LintKind, Suggestion}, }; use super::{ExprLinter, Lint}; use crate::linting::expr_linter::Chunk; pub struct OpenTheLight { expr: LongestMatchOf, } impl Default for OpenTheLight { fn default() -> Self { const TO_OPEN: &[&str] = &["open", "opens", "opened", "opening"]; const DEVICES: &[&str] = &[ "air conditioner", "air conditioning", "aircon", "cellphone", "fan", "handphone", "heater", "heating", "lamp", "light", "lights", "radio", "telephone", "television", "TV", ]; let open_the_device = Lrc::new( SequenceExpr::word_set(TO_OPEN) .t_ws() .then_determiner() .t_ws() .then_word_set(DEVICES), ); let open_the_device_then_noun = SequenceExpr::with(open_the_device.clone()) .t_ws() .then_noun(); let expr = LongestMatchOf::new(vec![ Box::new(open_the_device), Box::new(open_the_device_then_noun), ]); Self { expr } } } impl ExprLinter for OpenTheLight { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { // If I try to do this in the Pattern, the shorter pattern matches, without the context token. if toks.len() == 7 { let (device_tok, context_tok) = (toks.get_rel(-3)?, toks.get_rel(-1)?); // The device word is part of compound noun if it's singular and followed by another noun if !device_tok.kind.is_plural_noun() || !context_tok.kind.is_noun() { return None; } } const ING: &[char] = &['i', 'n', 'g']; const ED: &[char] = &['e', 'd']; const ES: &[char] = &['e', 's']; const LEMMA: &[char] = &[]; let verb: &[char] = toks.first()?.span.get_content(src); let (e, n, d) = ( verb[verb.len() - 3], verb[verb.len() - 2], verb[verb.len() - 1], ); let (turn_ending, switch_ending) = match (e, n, d) { ('i', 'n', 'g') => (ING, ING), (_, 'e', 'd') => (ED, ED), (_, _, 's') => (&ES[1..], ES), _ => (LEMMA, LEMMA), }; let mut turn_end_on: [char; 7 + 3] = ['t', 'u', 'r', 'n', '\0', '\0', '\0', '\0', '\0', '\0']; let mut switch_end_on: [char; 9 + 3] = [ 's', 'w', 'i', 't', 'c', 'h', '\0', '\0', '\0', '\0', '\0', '\0', ]; // paste in the inflected ending turn_end_on[4..4 + turn_ending.len()].copy_from_slice(turn_ending); switch_end_on[6..6 + switch_ending.len()].copy_from_slice(switch_ending); turn_end_on[4 + turn_ending.len()..4 + turn_ending.len() + 3] .copy_from_slice(&[' ', 'o', 'n']); switch_end_on[6 + switch_ending.len()..6 + switch_ending.len() + 3] .copy_from_slice(&[' ', 'o', 'n']); let turn = &turn_end_on[..4 + turn_ending.len() + 3]; let switch = &switch_end_on[..6 + switch_ending.len() + 3]; Some(Lint { span: toks.first()?.span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case(turn.to_vec(), toks.span()?.get_content(src)), Suggestion::replace_with_match_case(switch.to_vec(), toks.span()?.get_content(src)), ], message: "Are you accessing the device's internals or `turning` it `on`?".to_owned(), priority: 63, }) } fn description(&self) -> &'static str { "Corrects using `open` instead of `turn on` or `switch on`" } } #[cfg(test)] mod tests { use super::OpenTheLight; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // made-up unit tests #[test] fn fix_open_the_tv() { assert_suggestion_result("open the TV", OpenTheLight::default(), "turn on the TV"); } #[test] fn fix_he_opens_the_tv() { assert_suggestion_result( "he opens the TV", OpenTheLight::default(), "he turns on the TV", ); } #[test] fn fix_she_opened_the_tv() { assert_suggestion_result( "she opened the TV", OpenTheLight::default(), "she turned on the TV", ); } #[test] fn opening_the_tv() { assert_suggestion_result( "opening the TV", OpenTheLight::default(), "turning on the TV", ); } #[test] fn dont_flag_open_the_tv_app() { assert_lint_count("open the TV app", OpenTheLight::default(), 0); } #[test] fn fix_open_the_tv_to_watch_the_news() { assert_suggestion_result( "open the TV to watch the news", OpenTheLight::default(), "turn on the TV to watch the news", ); } #[test] fn fix_dont_forget_to_open_the_lights() { assert_suggestion_result( "Don't forget to open the lights when you enter the room.", OpenTheLight::default(), "Don't forget to turn on the lights when you enter the room.", ); } #[test] fn fix_can_you_open_the_fan() { assert_suggestion_result( "Can you open the fan? It's quite stuffy.", OpenTheLight::default(), "Can you turn on the fan? It's quite stuffy.", ); } #[test] fn fix_opened_the_radio() { assert_suggestion_result( "I opened the radio to listen to the morning show.", OpenTheLight::default(), "I turned on the radio to listen to the morning show.", ); } #[test] fn fix_open_the_aircon() { assert_suggestion_result( "Can you open the aircon? It's hot.", OpenTheLight::default(), "Can you turn on the aircon? It's hot.", ); } #[test] fn dont_flag_open_the_tv_mode() { assert_lint_count("open the TV mode", OpenTheLight::default(), 0); } // real world examples #[test] fn dont_flag_radio_configuration() { assert_lint_count( "To open the Radio Configuration click on the three dots on the top right side.", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Requires much more complex context parsing"] fn dont_flag_open_the_lamp() { assert_lint_count( "Now you will need to open your lamp and solder everything together according to schematics.", OpenTheLight::default(), 0, ); } #[test] fn dont_flag_open_tv_up_to() { assert_lint_count( "it opens the TV up to a massive library of software", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Requires more complex context parsing"] fn dont_flag_open_the_light_slash_sound() { assert_lint_count( "To do so, open the light/sound configuration.", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Not common enough"] fn dont_flag_cutting_open() { assert_lint_count( "However, instead of cutting open the lights, I opted to 3D print the Minecraft Torch Nightlight", OpenTheLight::default(), 0, ); } #[test] fn dont_flag_open_the_light_source() { assert_lint_count( "open the light source light and regulate it to the suitable luminance", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Requires more complex context parsing"] fn dont_flag_opening_lamp() { assert_lint_count( "After opening the lamp, you need to solder 4 wires to the board in order to connect the USB-to-Serial adapter.", OpenTheLight::default(), 0, ); } #[test] fn dont_flag_fan_control() { assert_lint_count( "It seems like it opens the fan control? ", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Requires more complex context parsing"] fn dont_flag_open_tv_to_access_eeprom() { assert_lint_count( "Involves opening your TV and directly accessing the an EEPROM IC.", OpenTheLight::default(), 0, ); } #[test] fn dont_flag_open_tv_viewing_application() { assert_lint_count( "Open your TV viewing application or platform.", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Requires more complex context parsing"] fn dont_flag_open_as_noun() { assert_lint_count( "when we press open the lamp will be on", OpenTheLight::default(), 0, ); } #[test] #[ignore = "Requires more complex context parsing"] fn dont_flag_opening_as_noun() { assert_lint_count( "and through that opening the light was streaming in", OpenTheLight::default(), 0, ); } #[test] fn fix_opening_fan() { assert_suggestion_result( "If the CO2 passed a set point, it would open the fan, and close it once CO2 dropped enough.", OpenTheLight::default(), "If the CO2 passed a set point, it would turn on the fan, and close it once CO2 dropped enough.", ); } #[test] fn fix_opening_tv() { assert_suggestion_result( "This was to prevent me from falling back into the temptation of opening the TV and breaking up the rule I wanted to implement.", OpenTheLight::default(), "This was to prevent me from falling back into the temptation of turning on the TV and breaking up the rule I wanted to implement.", ); } #[test] #[ignore = "We don't yet handle hyphenated words"] fn dont_flag_opens_fan_like() { assert_lint_count( "Out by the garden fence the high ice plant opens its fan-like petals to the sun.", OpenTheLight::default(), 0, ); } #[test] fn fix_opening_lights() { assert_suggestion_result( "Steering wheel remains blocked until I open my lights.", OpenTheLight::default(), "Steering wheel remains blocked until I turn on my lights.", ); } } ================================================ FILE: harper-core/src/linting/orthographic_consistency.rs ================================================ use std::sync::Arc; use crate::{ expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, spell::{Dictionary, FstDictionary}, {OrthFlags, Token}, }; pub struct OrthographicConsistency { dict: Arc, expr: SequenceExpr, } impl OrthographicConsistency { pub fn new() -> Self { Self { dict: FstDictionary::curated(), expr: SequenceExpr::any_word(), } } } impl Default for OrthographicConsistency { fn default() -> Self { Self::new() } } impl ExprLinter for OrthographicConsistency { type Unit = Chunk; fn description(&self) -> &str { "Ensures word casing matches the dictionary's canonical orthography." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, matched_tokens: &[Token], source: &[char], context: Option<(&[Token], &[Token])>, ) -> Option { if let Some((pre, post)) = context { if let Some(pre_tok) = pre.last() && pre_tok.kind.is_hyphen() { return None; } if let Some(post_tok) = post.first() && post_tok.kind.is_hyphen() { return None; } } let word = &matched_tokens[0]; let Some(Some(metadata)) = word.kind.as_word() else { return None; }; let chars = word.span.get_content(source); let cur_flags = OrthFlags::from_letters(chars); if metadata.is_allcaps() && !metadata.is_lowercase() && !metadata.is_upper_camel() && !cur_flags.contains(OrthFlags::ALLCAPS) { return Some(Lint { span: word.span, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith( chars.iter().map(|c| c.to_ascii_uppercase()).collect(), )], message: "This word's canonical spelling is all-caps.".to_owned(), priority: 127, }); } let canonical_flags = metadata.orth_info; let flags_to_check = [ OrthFlags::LOWER_CAMEL, OrthFlags::UPPER_CAMEL, OrthFlags::APOSTROPHE, OrthFlags::HYPHENATED, ]; if flags_to_check .into_iter() .filter(|flag| canonical_flags.contains(*flag) != cur_flags.contains(*flag)) .count() == 1 && let Some(canonical) = self.dict.get_correct_capitalization_of(chars) && alphabetic_differs(canonical, chars) { return Some(Lint { span: word.span, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith(canonical.to_vec())], message: format!( "The canonical dictionary spelling is `{}`.", canonical.iter().collect::() ), priority: 31, }); } if metadata.is_titlecase() && cur_flags.contains(OrthFlags::LOWERCASE) && let Some(canonical) = self.dict.get_correct_capitalization_of(chars) && alphabetic_differs(canonical, chars) { return Some(Lint { span: word.span, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith(canonical.to_vec())], message: format!( "The canonical dictionary spelling is title case: `{}`.", canonical.iter().collect::() ), priority: 127, }); } None } } /// Check if the alphabetic characters in the string differ from one another. /// Ignores non-alphabetic characters. fn alphabetic_differs(a: &[char], b: &[char]) -> bool { a.iter() .zip(b.iter()) .any(|(a, b)| a.is_alphabetic() && b.is_alphabetic() && a != b) } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::OrthographicConsistency; #[test] fn nasa_should_be_all_caps() { assert_suggestion_result( "Nasa is a governmental institution.", OrthographicConsistency::default(), "NASA is a governmental institution.", ); } #[test] fn ikea_should_be_all_caps() { assert_suggestion_result( "Ikea operates a vast retail network.", OrthographicConsistency::default(), "IKEA operates a vast retail network.", ); } #[test] fn lego_should_be_all_caps() { assert_suggestion_result( "Lego bricks encourage creativity.", OrthographicConsistency::default(), "LEGO bricks encourage creativity.", ); } #[test] fn nato_should_be_all_caps() { assert_suggestion_result( "Nato is a military alliance.", OrthographicConsistency::default(), "NATO is a military alliance.", ); } #[test] fn fbi_should_be_all_caps() { assert_suggestion_result( "Fbi investigates federal crimes.", OrthographicConsistency::default(), "FBI investigates federal crimes.", ); } #[test] fn cia_should_be_all_caps() { assert_suggestion_result( "Cia gathers intelligence.", OrthographicConsistency::default(), "CIA gathers intelligence.", ); } #[test] fn hiv_should_be_all_caps() { assert_suggestion_result( "Hiv is a virus.", OrthographicConsistency::default(), "HIV is a virus.", ); } #[test] fn dna_should_be_all_caps() { assert_suggestion_result( "Dna carries genetic information.", OrthographicConsistency::default(), "DNA carries genetic information.", ); } #[test] fn rna_should_be_all_caps() { assert_suggestion_result( "Rna participates in protein synthesis.", OrthographicConsistency::default(), "RNA participates in protein synthesis.", ); } #[test] fn cpu_should_be_all_caps() { assert_suggestion_result( "Cpu executes instructions.", OrthographicConsistency::default(), "CPU executes instructions.", ); } #[test] fn gpu_should_be_all_caps() { assert_suggestion_result( "Gpu accelerates graphics.", OrthographicConsistency::default(), "GPU accelerates graphics.", ); } #[test] fn html_should_be_all_caps() { assert_suggestion_result( "Html structures web documents.", OrthographicConsistency::default(), "HTML structures web documents.", ); } #[test] fn url_should_be_all_caps() { assert_suggestion_result( "Url identifies a resource.", OrthographicConsistency::default(), "URL identifies a resource.", ); } #[test] fn faq_should_be_all_caps() { assert_suggestion_result( "Faq answers common questions.", OrthographicConsistency::default(), "FAQ answers common questions.", ); } #[test] fn linkedin_should_use_canonical_case() { assert_suggestion_result( "I updated my linkedin profile yesterday.", OrthographicConsistency::default(), "I updated my LinkedIn profile yesterday.", ); } #[test] fn wordpress_should_use_canonical_case() { assert_suggestion_result( "She writes daily on her wordpress blog.", OrthographicConsistency::default(), "She writes daily on her WordPress blog.", ); } #[test] fn pdf_should_be_all_caps() { assert_suggestion_result( "Pdf preserves formatting.", OrthographicConsistency::default(), "PDF preserves formatting.", ); } #[test] fn ceo_should_be_all_caps() { assert_suggestion_result( "Our Ceo approved the budget.", OrthographicConsistency::default(), "Our CEO approved the budget.", ); } #[test] fn cfo_should_be_all_caps() { assert_suggestion_result( "The Cfo presented the report.", OrthographicConsistency::default(), "The CFO presented the report.", ); } #[test] fn hr_should_be_all_caps() { assert_suggestion_result( "The Hr team scheduled interviews.", OrthographicConsistency::default(), "The HR team scheduled interviews.", ); } #[test] fn ai_should_be_all_caps() { assert_suggestion_result( "Ai enables new capabilities.", OrthographicConsistency::default(), "AI enables new capabilities.", ); } #[test] fn ufo_should_be_all_caps() { assert_suggestion_result( "Ufo sightings provoke debate.", OrthographicConsistency::default(), "UFO sightings provoke debate.", ); } #[test] fn markdown_should_be_caps() { assert_suggestion_result( "I adore markdown.", OrthographicConsistency::default(), "I adore Markdown.", ); } #[test] fn canonical_forms_should_not_be_flagged() { let sentences = [ "NASA is a governmental institution.", "IKEA operates a vast retail network.", "LEGO bricks encourage creativity.", "NATO is a military alliance.", "FBI investigates federal crimes.", "CIA gathers intelligence.", "HIV is a virus.", "DNA carries genetic information.", "RNA participates in protein synthesis.", "CPU executes instructions.", "GPU accelerates graphics.", "HTML structures web documents.", "URL identifies a resource.", "FAQ answers common questions.", "I updated my LinkedIn profile yesterday.", "She writes daily on her WordPress blog.", "PDF preserves formatting.", "Our CEO approved the budget.", "The CFO presented the report.", "The HR team scheduled interviews.", "AI enables new capabilities.", "UFO sightings provoke debate.", "I adore Markdown.", ]; for sentence in sentences { assert_no_lints(sentence, OrthographicConsistency::default()); } } #[test] fn allows_news() { assert_no_lints( "This is the best part of the news broadcast.", OrthographicConsistency::default(), ); } #[test] fn allows_issue_2465() { assert_no_lints( "The post’s problem was not in its complexity.", OrthographicConsistency::default(), ); } } ================================================ FILE: harper-core/src/linting/ought_to_be.rs ================================================ use crate::TokenKind; use crate::expr::{AnchorStart, Expr, ExprMap, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; /// Detects the eggcorn `out to be` when the intended phrase is `ought to be`. /// /// Legitimate phrasal-verb uses like `turn out to be`, `work out to be`, or /// `make it out to be` are ignored. pub struct OughtToBe { expr: ExprMap, // index of the `out` token within the match } impl Default for OughtToBe { fn default() -> Self { // We’ll construct three branches and record where the `out` token sits in each. // 1) non-verb word + pronoun + "out to be" → index of `out` = 4 tokens after start // [word(!verb)] [ws] [pronoun] [ws] [out] [ws] [to] [ws] [be] let branch_nonverb_pronoun = SequenceExpr::default() .then_kind_is_but_is_not(TokenKind::is_word, TokenKind::is_verb) .then_whitespace() .then_pronoun() .then_whitespace() .then_fixed_phrase("out to be"); // 2) start-of-sentence + pronoun + "out to be" → index of `out` = 2 tokens after start // [AnchorStart] [pronoun] [ws] [out] [ws] [to] [ws] [be] let branch_anchor_pronoun = SequenceExpr::with(AnchorStart) .then_pronoun() .then_whitespace() .then_fixed_phrase("out to be"); // 3) punctuation + pronoun + "out to be" → index of `out` = 4 tokens after start // [punct] [ws] [pronoun] [ws] [out] [ws] [to] [ws] [be] let branch_punct_pronoun = SequenceExpr::default() .then_punctuation() .then_whitespace() .then_pronoun() .then_whitespace() .then_fixed_phrase("out to be"); let mut map = ExprMap::default(); map.insert(branch_nonverb_pronoun, 4); map.insert(branch_anchor_pronoun, 2); map.insert(branch_punct_pronoun, 4); Self { expr: map } } } impl ExprLinter for OughtToBe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched: &[Token], source: &[char]) -> Option { // Find which branch matched and where the `out` token sits. let out_index = *self.expr.lookup(0, matched, source)?; let out_tok = matched.get(out_index)?; let replace_span = out_tok.span; // only replace the word `out` let original = replace_span.get_content(source); Some(Lint { span: replace_span, lint_kind: LintKind::Eggcorn, suggestions: vec![Suggestion::replace_with_match_case( "ought".chars().collect(), original, )], message: "Did you mean `ought to be` (expressing expectation or obligation)?" .to_string(), priority: 31, }) } fn description(&self) -> &str { "Detects the mistaken `out to be` and suggests `ought to be`, while ignoring legitimate phrasal-verb uses such as `turn out to be` and `make it out to be`." } } #[cfg(test)] mod tests { use super::OughtToBe; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // Flagged examples #[test] fn flags_you_out_to_be_able_to_see() { assert_suggestion_result( "you out to be able to see", OughtToBe::default(), "you ought to be able to see", ); } #[test] fn flags_as_it_out_to_be() { assert_suggestion_result("as it out to be", OughtToBe::default(), "as it ought to be"); } #[test] fn flags_then_it_out_to_be() { assert_suggestion_result( "then it out to be", OughtToBe::default(), "then it ought to be", ); } // Legit phrasal-verb cases that should be ignored #[test] fn ignores_turned_out_to_be() { assert_lint_count("It turned out to be fine.", OughtToBe::default(), 0); } #[test] fn ignores_turns_out_to_be() { assert_lint_count("It turns out to be fine.", OughtToBe::default(), 0); } #[test] fn ignores_make_it_out_to_be() { assert_lint_count( "It's not as simple as they make it out to be.", OughtToBe::default(), 0, ); } #[test] fn ignores_makes_it_out_to_be() { assert_lint_count( "I think this rule may not be as smart as its definition makes it out to be.", OughtToBe::default(), 0, ); } #[test] fn ignores_worked_out_to_be() { assert_lint_count("It worked out to be $5.", OughtToBe::default(), 0); } #[test] fn ignores_figured_it_out_to_be() { assert_lint_count( "I figured it out to be a memory issue.", OughtToBe::default(), 0, ); } #[test] fn ignores_try_it_out_to_be() { assert_lint_count("Try it out to be sure.", OughtToBe::default(), 0); } #[test] fn ignores_separate_it_out_to_be() { assert_lint_count( "I want to separate it out to be able to process it later.", OughtToBe::default(), 0, ); } #[test] fn ignores_rotate_it_out_to_be() { assert_lint_count( "We will rotate it out to be eventually deleted.", OughtToBe::default(), 0, ); } #[test] fn ignores_flesh_it_out_to_be() { assert_lint_count( "This needs some work to flesh it out to be usable.", OughtToBe::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/out_of_date.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::FixedPhrase; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct OutOfDate { expr: FirstMatchOf, } impl Default for OutOfDate { fn default() -> Self { let pattern = FirstMatchOf::new(vec![ Box::new(FixedPhrase::from_phrase("out of date")), Box::new(FixedPhrase::from_phrase("out-of date")), Box::new(FixedPhrase::from_phrase("out of-date")), ]); Self { expr: pattern } } } impl ExprLinter for OutOfDate { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let problem_text = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( "out-of-date".chars().collect(), problem_text, )], message: "Did you mean the compound adjective?".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Ensures that the phrase `out of date` is written with a hyphen as `out-of-date` when used as a compound adjective." } } #[cfg(test)] mod tests { use super::OutOfDate; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_out_of_date() { assert_suggestion_result( "The software is out of date.", OutOfDate::default(), "The software is out-of-date.", ); } #[test] fn corrects_out_of_date_with_variation() { assert_suggestion_result( "This information is out of-date.", OutOfDate::default(), "This information is out-of-date.", ); } #[test] fn allows_correct_usage() { assert_suggestion_result( "The guidelines are out-of-date.", OutOfDate::default(), "The guidelines are out-of-date.", ); } } ================================================ FILE: harper-core/src/linting/oxford_comma.rs ================================================ use crate::expr::ExprExt; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::{Lrc, Token, TokenStringExt, linting::Linter}; use super::{super::Lint, LintKind, Suggestion}; pub struct OxfordComma { expr: SequenceExpr, } impl Default for OxfordComma { fn default() -> Self { let item = Lrc::new( SequenceExpr::default() .then_determiner() .then_whitespace() .then_nominal() .or_longest(SequenceExpr::default().then_nominal()), ); let item_chunk = SequenceExpr::with(item.clone()) .then_comma() .then_whitespace(); let pattern = SequenceExpr::default() .then_one_or_more(item_chunk) .then(item.clone()) .then_whitespace() .then_word_set(&["and", "or", "nor"]) .then_whitespace() .then(item.clone()); Self { expr: pattern } } } impl OxfordComma { fn match_to_lint(&self, matched_toks: &[Token], _source: &[char]) -> Option { let conj_index = matched_toks.last_conjunction_index()?; let offender = &matched_toks[conj_index - 2]; Some(Lint { span: offender.span, lint_kind: LintKind::Style, suggestions: vec![Suggestion::InsertAfter(vec![','])], message: "An Oxford comma is necessary here.".to_owned(), priority: 31, }) } } impl Linter for OxfordComma { fn lint(&mut self, document: &crate::Document) -> Vec { let mut lints = Vec::new(); for sentence in document.iter_sentences() { let mut skip = 0; let mut words = sentence .iter_words() .filter_map(|v| v.kind.as_word()) .flatten(); if let (Some(first), Some(second)) = (words.next(), words.next()) && first.preposition && second.is_likely_homograph() { skip = sentence .iter() .position(|t| t.kind.is_comma()) .unwrap_or(sentence.iter().len()) } let sentence = &sentence[skip..]; for match_span in self.expr.iter_matches(sentence, document.get_source()) { let lint = self.match_to_lint( &sentence[match_span.start..match_span.end], document.get_source(), ); lints.extend(lint); } } lints } fn description(&self) -> &str { "The Oxford comma is one of the more controversial rules in common use today. Enabling this lint checks that there is a comma before `and`, `or`, or `nor` when listing out more than two ideas." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::OxfordComma; #[test] fn fruits() { assert_lint_count( "An apple, a banana and a pear walk into a bar.", OxfordComma::default(), 1, ); } #[test] fn people() { assert_suggestion_result( "Nancy, Steve and Carl are going to the coffee shop.", OxfordComma::default(), "Nancy, Steve, and Carl are going to the coffee shop.", ); } #[test] fn places() { assert_suggestion_result( "I've always wanted to visit Paris, Tokyo and Rome.", OxfordComma::default(), "I've always wanted to visit Paris, Tokyo, and Rome.", ); } #[test] fn foods() { assert_suggestion_result( "My favorite foods are pizza, sushi, tacos and burgers.", OxfordComma::default(), "My favorite foods are pizza, sushi, tacos, and burgers.", ); } #[test] fn allows_clean_music() { assert_lint_count( "I enjoy listening to pop music, rock, hip-hop, electronic dance, and classical music.", OxfordComma::default(), 0, ); } #[test] fn allows_clean_nations() { assert_lint_count( "The team consists of players from different countries: France, Germany, Italy, and Spain.", OxfordComma::default(), 0, ); } #[test] fn or_writing() { assert_suggestion_result( "Harper can be a lifesaver when writing technical documents, emails or other formal forms of communication.", OxfordComma::default(), "Harper can be a lifesaver when writing technical documents, emails, or other formal forms of communication.", ); } #[test] fn sports() { assert_suggestion_result( "They enjoy playing soccer, basketball or tennis.", OxfordComma::default(), "They enjoy playing soccer, basketball, or tennis.", ); } #[test] fn nor_vegetables() { assert_suggestion_result( "I like carrots, kale nor broccoli.", OxfordComma::default(), "I like carrots, kale, nor broccoli.", ); } #[test] fn allow_non_list_transportation() { assert_lint_count( "In transportation, autonomous vehicles and smart traffic management systems promise to reduce accidents and optimize travel routes.", OxfordComma::default(), 0, ); } #[test] fn allow_pill() { assert_lint_count( "Develop a pill that causes partial amnesia, affecting relationships and identity.", OxfordComma::default(), 0, ); } #[test] fn allow_at_first() { assert_lint_count( "In the heart of a bustling city, Sarah finds herself trapped in an endless cycle of the same day. Each morning, she awakens to find the date unchanged, her life on repeat. At first, confusion and frustration cloud her thoughts, but soon she notices something peculiar—each day has tiny differences, subtle changes that hint at a larger pattern.", OxfordComma::default(), 0, ); } #[test] fn allow_standoff() { assert_lint_count( "In a tense standoff, Alex and his reflection engage in a battle of wills.", OxfordComma::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/oxymorons.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::FixedPhrase; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind}; use crate::{Token, TokenStringExt}; /// A linter that flags oxymoronic phrases. pub struct Oxymorons { expr: FirstMatchOf, } impl Oxymorons { pub fn new() -> Self { // List of phrases that are considered oxymoronic. let phrases = vec![ "amateur expert", "increasingly less", "advancing backwards?", "alludes explicitly to", "explicitly alludes to", "totally obsolescent", "completely obsolescent", "generally always", "usually always", "build down", "conspicuous absence", "exact estimate", "found missing", "intense apathy", "mandatory choice", "nonworking mother", "organized mess", ]; // Build a vector of exact-match patterns for each oxymoron. let exprs: Vec> = phrases .into_iter() .map(|s| Box::new(FixedPhrase::from_phrase(s)) as Box) .collect(); Self { expr: FirstMatchOf::new(exprs), } } } impl Default for Oxymorons { fn default() -> Self { Self::new() } } impl ExprLinter for Oxymorons { type Unit = Chunk; /// Returns the underlying pattern. fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let matched_text: String = span.get_content(source).iter().collect(); Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: Vec::new(), message: format!("'{matched_text}' is an oxymoron."), priority: 31, }) } fn description(&self) -> &str { "Flags oxymoronic phrases (e.g. `amateur expert`, `increasingly less`, etc.)." } } #[cfg(test)] mod tests { use super::Oxymorons; use crate::linting::tests::assert_lint_count; #[test] fn detects_amateur_expert() { assert_lint_count("The amateur expert gave his opinion.", Oxymorons::new(), 1); } #[test] fn detects_increasingly_less() { assert_lint_count( "The solution was increasingly less effective.", Oxymorons::new(), 1, ); } #[test] fn detects_advancing_backwards() { assert_lint_count("The project is advancing backwards?", Oxymorons::new(), 1); } #[test] fn detects_alludes_explicitly_to() { assert_lint_count( "The report alludes explicitly to several issues.", Oxymorons::new(), 1, ); } #[test] fn detects_explicitly_alludes_to() { assert_lint_count( "The report explicitly alludes to several issues.", Oxymorons::new(), 1, ); } #[test] fn does_not_flag_clean_text() { assert_lint_count("The expert provided clear advice.", Oxymorons::new(), 0); } #[test] fn lowercase_match() { assert_lint_count( "the amateur expert is often unreliable.", Oxymorons::new(), 1, ); } #[test] fn phrase_with_extra_whitespace() { assert_lint_count("An organized mess was found.", Oxymorons::new(), 1); } #[test] fn phrase_split_by_line_break() { assert_lint_count( "nonworking\nmother is not a term to be used.", Oxymorons::new(), 1, ); } } ================================================ FILE: harper-core/src/linting/phrasal_verb_as_compound_noun.rs ================================================ use std::sync::Arc; use super::{Lint, LintKind, Linter, Suggestion}; use crate::spell::{Dictionary, FstDictionary}; use crate::{CharStringExt, Document, Span, TokenStringExt}; /// Detect phrasal verbs written as compound nouns. pub struct PhrasalVerbAsCompoundNoun { dict: Arc, } #[derive(Debug)] enum Confidence { DefinitelyVerb, PossiblyVerb, } impl PhrasalVerbAsCompoundNoun { pub fn new() -> Self { Self { dict: FstDictionary::curated(), } } } impl Default for PhrasalVerbAsCompoundNoun { fn default() -> Self { Self { dict: FstDictionary::curated(), } } } #[derive(Debug, PartialEq)] enum Why { ItsAProperNounOrVerb, ItContainsSpaceHyphenOrApostrophe, ItsAKnownFalsePositive, ItDoesntEndWithOneOfTheParticles, NeitherTheWholeWordNorThePartBeforeTheParticleIsAVerb, ItsInIsolation, IHaveNoConfidenceThatItsAVerb, TheresAnAdjectiveOrDeterminerBeforeIt, ItsPrecededByANonPluralNoun, ItsAnItemInAListOfNouns, ItsPrecededByAPreposition, ItsPrecededByAnUnknownWord, TheresNothingBeforeItAndAPrepositionAfterIt, ItsFollowedByThatOrWhich, ItsActuallyPartOfANounPhrase, TheresNothingWrongWithIt, } impl PhrasalVerbAsCompoundNoun { fn logic_and_heuristics( &self, document: &Document, i: usize, token: &crate::Token, ) -> Result<(String, Confidence), Why> { // It would be handy if there could be a dict flag for nouns which are compounds of phrasal verbs. // Instead, let's use a few heuristics. // let no_phrasal_verb = String::new(); // * Can't also be a proper noun or a real verb. if token.kind.is_proper_noun() || token.kind.is_verb() { return Err(Why::ItsAProperNounOrVerb); } let nountok_charsl = document.get_span_content(&token.span); // * Can't contain space, hyphen or apostrophe if nountok_charsl.contains(&' ') || nountok_charsl.contains(&'-') || nountok_charsl.contains(&'\'') || nountok_charsl.contains(&'’') { return Err(Why::ItContainsSpaceHyphenOrApostrophe); } let nountok_lower = nountok_charsl.to_lower(); let nountok_lower = nountok_lower.as_ref(); // * Must not be in the set of known false positives. if nountok_lower == ['g', 'a', 'l', 'l', 'o', 'n'] || nountok_lower == ['d', 'r', 'a', 'g', 'o', 'n'] { return Err(Why::ItsAKnownFalsePositive); } // * Must end with the same letters as one of the particles used in phrasal verbs. let particle_endings: &[&[char]] = &[ &['a', 'r', 'o', 'u', 'n', 'd'], &['b', 'a', 'c', 'k'], &['d', 'o', 'w', 'n'], &['i', 'n'], &['o', 'n'], &['o', 'f', 'f'], &['o', 'u', 't'], &['o', 'v', 'e', 'r'], &['u', 'p'], ]; let mut found_particle_len = 0; if !particle_endings.iter().any(|ending| { let ending_len = ending.len(); if ending_len <= nountok_charsl.len() && ending .iter() .eq(nountok_charsl[nountok_charsl.len() - ending_len..].iter()) { found_particle_len = ending_len; true } else { false } }) { return Err(Why::ItDoesntEndWithOneOfTheParticles); } let verb_part = &nountok_charsl[..nountok_charsl.len() - found_particle_len]; let particle_part = &nountok_charsl[nountok_charsl.len() - found_particle_len..]; let phrasal_verb: String = verb_part .iter() .chain(std::iter::once(&' ')) .chain(particle_part.iter()) .collect(); // Check if both things are verbs. // So far we only have a small number of phrasal verbs in the dictionary. let (verb_part_is_verb, phrasal_verb_is_verb) = ( self.dict .get_word_metadata(verb_part) .is_some_and(|md| md.verb.is_some()), self.dict .get_word_metadata_str(&phrasal_verb) .is_some_and(|md| md.verb.is_some()), ); // If neither is a verb, then it's not a phrasal verb if !verb_part_is_verb && !phrasal_verb_is_verb { return Err(Why::NeitherTheWholeWordNorThePartBeforeTheParticleIsAVerb); } // Now we know it matches the pattern of a phrasal verb erroneously written as a compound noun. // But we have to check if it's an actual compound noun rather than an error. // For that we need some heuristics based on the surrounding context. // Let's try to get the word before and the word after. // To do that we have to get the tokens immediately before and after, which we expect to be whitespace. let maybe_prev_tok = document.get_next_word_from_offset(i, -1); let maybe_next_tok = document.get_next_word_from_offset(i, 1); // If it's in isolation, a compound noun is fine. if maybe_prev_tok.is_none() && maybe_next_tok.is_none() { return Err(Why::ItsInIsolation); } let confidence = match (phrasal_verb_is_verb, verb_part_is_verb) { (true, _) => Confidence::DefinitelyVerb, (false, true) => Confidence::PossiblyVerb, _ => return Err(Why::IHaveNoConfidenceThatItsAVerb), }; if let Some(prev_tok) = maybe_prev_tok { if prev_tok.kind.is_adjective() || prev_tok.kind.is_determiner() { return Err(Why::TheresAnAdjectiveOrDeterminerBeforeIt); } // "dictionary lookup" is not a mistake but "couples breakup" is. // But "settings plugin" is not. if prev_tok.kind.is_noun() && !prev_tok.kind.is_plural_noun() || prev_tok .span .get_content(document.get_source()) .eq_ignore_ascii_case_str("settings") { return Err(Why::ItsPrecededByANonPluralNoun); } if is_part_of_noun_list(document, i) { return Err(Why::ItsAnItemInAListOfNouns); } // If the previous word is (only) a preposition, this word is surely a noun if prev_tok.kind.is_preposition() && !prev_tok .span .get_content(document.get_source()) .eq_ignore_ascii_case_str("to") { return Err(Why::ItsPrecededByAPreposition); } // If the previous word is OOV, those are most commonly nouns if prev_tok.kind.is_oov() { return Err(Why::ItsPrecededByAnUnknownWord); } } // A preposition may follow either a verb or a noun. // A previous word can help us decide. Without one we can't decide so we won't flag it. // ❌ I will never breakup with Gym. // ✅ Plugin for text editors. // ✅ Plug in for faster performance. if maybe_prev_tok.is_none() && maybe_next_tok.is_some_and(|t| t.kind.is_preposition()) { return Err(Why::TheresNothingBeforeItAndAPrepositionAfterIt); } if let Some(next_tok) = maybe_next_tok { // "That" or "which" can follow a noun as relative pronouns. if next_tok.kind.is_pronoun() && next_tok .span .get_content(document.get_source()) .eq_any_ignore_ascii_case_chars(&[ &['t', 'h', 'a', 't'][..], &['w', 'h', 'i', 'c', 'h'][..], ]) { return Err(Why::ItsFollowedByThatOrWhich); } } // If the compound noun is followed by another noun, check for larger compound nouns. if let Some(next_tok) = maybe_next_tok.filter(|tok| tok.kind.is_noun()) && match nountok_lower { ['b', 'a', 'c', 'k', 'u', 'p'] => &[ "file", "images", "link", "links", "location", "plan", "sites", "snapshots", ][..], ['c', 'a', 'l', 'l', 'b', 'a', 'c', 'k'] => &["function", "handlers"][..], ['l', 'a', 'y', 'o', 'u', 't'] => &["estimation"][..], ['m', 'a', 'r', 'k', 'u', 'p'] => &["language", "languages"][..], ['m', 'o', 'u', 's', 'e', 'o', 'v', 'e', 'r'] => &["hints"][..], ['p', 'l', 'a', 'y', 'b', 'a', 'c', 'k'] => &["latency", "speed"][..], ['p', 'l', 'u', 'g', 'i', 'n'] => &[ "architecture", "classes", "development", "developer", "docs", "ecosystem", "files", "interface", "name", "packages", "suite", "support", ][..], ['p', 'o', 'p', 'u', 'p'] => &["window"][..], ['r', 'o', 'l', 'l', 'o', 'u', 't'] => &["logic", "status"][..], ['s', 't', 'a', 'r', 't', 'u', 'p'] => &["environments"][..], ['t', 'h', 'r', 'o', 'w', 'b', 'a', 'c', 'k'] => &["machine"][..], ['w', 'o', 'r', 'k', 'o', 'u', 't'] => &["constraints", "preference"][..], _ => &[], } .contains( &next_tok .span .get_content_string(document.get_source()) .to_lowercase() .as_ref(), ) { return Err(Why::ItsActuallyPartOfANounPhrase); } Ok((phrasal_verb, confidence)) } } impl Linter for PhrasalVerbAsCompoundNoun { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for i in document.iter_noun_indices() { let token = document.get_token(i).unwrap(); if let Ok((phrasal_verb, confidence)) = self.logic_and_heuristics(document, i, token) { let message = match confidence { Confidence::DefinitelyVerb => { "This word should be a phrasal verb, not a compound noun." } Confidence::PossiblyVerb => { "This word might be a phrasal verb rather than a compound noun." } }; lints.push(Lint { span: Span::new(token.span.start, token.span.end), lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith(phrasal_verb.chars().collect())], message: message.to_string(), priority: 63, }); } } lints } fn description(&self) -> &str { "This rule looks for phrasal verbs written as compound nouns." } } /// Checks if the current token is part of a list of nouns fn is_part_of_noun_list(document: &Document, current_index: usize) -> bool { // Check for a conjunction before the current word (-1 is whitespace, -2 is the conjunction) if !matches!( document.get_next_word_from_offset(current_index, -1), Some(tok) if tok.kind.is_conjunction() ) { return false; } // Check the token sequence before the conjunction match document.get_token_offset(current_index, -3) { // A comma without the space, assume we're in a list of nouns. Some(tok) if tok.kind.is_comma() => true, // Whitespace. If the token before that is a noun or a comma, assume we're in a list of nouns. Some(ws) if ws.kind.is_whitespace() => { document .get_token_offset(current_index, -4) // `noun and` or `, and` .is_some_and(|tok| tok.kind.is_noun() || tok.kind.is_comma()) } _ => false, } } #[cfg(test)] mod tests { use super::PhrasalVerbAsCompoundNoun; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn flag_breakup_and_workout() { assert_lint_count( "I will never breakup with Gym. We just seem to workout.", PhrasalVerbAsCompoundNoun::default(), 2, ); } #[test] fn correct_breakup_and_workout() { assert_suggestion_result( "I will never breakup with Gym. We just seem to workout.", PhrasalVerbAsCompoundNoun::default(), "I will never break up with Gym. We just seem to work out.", ); } #[test] fn dont_flag_random_words_that_happen_to_end_like_a_particle() { assert_no_lints("I like bacon.", PhrasalVerbAsCompoundNoun::default()); } #[test] fn dont_flag_non_verb_particles() { assert_no_lints("non", PhrasalVerbAsCompoundNoun::default()); } #[test] fn correct_after_i() { assert_suggestion_result( "I backup", PhrasalVerbAsCompoundNoun::default(), "I back up", ); } #[test] fn correct_after_we() { assert_suggestion_result( "we breakup", PhrasalVerbAsCompoundNoun::default(), "we break up", ); } #[test] fn dont_flag_checkin() { // It's actually not a noun in English. assert_no_lints("checkin", PhrasalVerbAsCompoundNoun::default()); } #[test] fn dont_flag_cleanup() { assert_no_lints("cleanup", PhrasalVerbAsCompoundNoun::default()); } #[test] fn correct_after_you_lowercase() { assert_suggestion_result( "you checkout", PhrasalVerbAsCompoundNoun::default(), "you check out", ); } #[test] fn correct_after_you_capitalized() { assert_suggestion_result( "You checkout", PhrasalVerbAsCompoundNoun::default(), "You check out", ); } #[test] fn flag_checkout_after_you() { assert_lint_count("you checkout", PhrasalVerbAsCompoundNoun::default(), 1); } #[test] fn correct_after_they_lowercase() { assert_suggestion_result( "they cleanup", PhrasalVerbAsCompoundNoun::default(), "they clean up", ); } #[test] fn flag_cleanup_after_they() { assert_lint_count("they cleanup", PhrasalVerbAsCompoundNoun::default(), 1); } #[test] fn dont_flag_dictionary_lookup() { assert_no_lints("dictionary lookup", PhrasalVerbAsCompoundNoun::default()); } #[test] fn flag_couples_breakup() { assert_lint_count("couples breakup", PhrasalVerbAsCompoundNoun::default(), 1); } #[test] fn dont_flag_gallon() { assert_no_lints("gallon", PhrasalVerbAsCompoundNoun::default()); } // Maybe this works by accident because "given" is also an adjective. // It should be because "funding" is a noun, but it's a gerund, which makes it also a verb. // Still, "given start up" doesn't make sense so maybe this test if fine. #[test] fn dont_flag_startup_funding() { assert_no_lints( "Yarvin has actually given startup funding. They hang out and party together", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_huge_markup() { assert_no_lints( "Sell it back to Russia at a huge markup.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_another_layoff() { assert_no_lints( "And now just announced another layoff", PhrasalVerbAsCompoundNoun::default(), ); } #[test] #[ignore = "\"Shakedown\" is a compound noun -- it's part of a comma-separated list with another noun \"threat\"\nBut this is not easy to check for so is not implemented yet."] fn dont_flag_a_threat_or_shakedown() { assert_no_lints( "Just a threat or Shakedown.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_a_flyover() { assert_no_lints( "if I'm the Brits I'm doing a flyover", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_mafia_style_shakedown() { assert_no_lints( "Basically it's kind of a mafia style shakedown of Ukraine", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_my_meetup_repository() { assert_no_lints( "I might have in my Meetup repository", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn ignore_multi_word() { assert_no_lints("I like this add-on!", PhrasalVerbAsCompoundNoun::default()); } #[test] fn dont_flag_list_of_nouns_1298() { assert_no_lints( "A printable format and layout.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_oov_nvim_plugin_1280() { assert_no_lints( "This is the nvim plugin for you.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn flag_title_case() { assert_lint_count( "I Will Never Breakup With Gym. We Just Seem To Workout.", PhrasalVerbAsCompoundNoun::default(), 2, ); } #[test] fn dont_flag_all_caps() { assert_no_lints( "I WILL NEVER BREAKUP WITH GYM. WE JUST SEEM TO WORKOUT.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn false_positive_issue_1495() { assert_no_lints( "Color schemes are available by using the Style Settings plugin.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_thanks_a_lot_linter_description() { assert_lint_count( "Thanks a lot` is the fixed, widely accepted form, while variants like `thanks lot` or `thanks alot` are non-standard and can jar readers.", PhrasalVerbAsCompoundNoun::default(), 0, ); } #[test] fn dont_flag_backup_location() { assert_no_lints( "Backup location: `%APPDATA%\\Cursor\\User\\globalStorage\\backups`", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_backup_plan() { assert_no_lints( "Every backup plan is unique, based on your risk assessment.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_backup_program() { assert_no_lints( "restic is a backup program that is fast, efficient and secure", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_backup_solution_or_backup_problems() { assert_no_lints( "NPBackup is a multiparadigm backup solution which tries to solve two major backup problems", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_backup_utilities_backup_system_or_backup_snapshots() { assert_no_lints( "GitHub Enterprise Server Backup Utilities is a backup system you install on a separate host, which takes backup snapshots", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_backup_images() { assert_no_lints( "This App creates and stores backup images of your Nextcloud.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn fix_backup_individual_apps() { assert_suggestion_result( "It requires root and allows you to backup individual apps and their data.", PhrasalVerbAsCompoundNoun::default(), "It requires root and allows you to back up individual apps and their data.", ); } #[test] fn dont_flag_backup_strategy() { assert_no_lints( "This is for you if you want to quickly set up a backup strategy without much fuss.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_helm_backup_plugin() { assert_no_lints("Helm Backup Plugin.", PhrasalVerbAsCompoundNoun::default()); } #[test] fn dont_flag_callback_function() { assert_no_lints( "By the time the `setTimeout` callback function was invoked", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_playback_latency() { assert_no_lints( "Low-Latency HLS is a recently standardized variant of the protocol that allows to greatly reduce playback latency.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_workout_constraints() { assert_no_lints("Workout constraints", PhrasalVerbAsCompoundNoun::default()); } #[test] fn dont_flag_workout_preference() { assert_no_lints("Workout preference", PhrasalVerbAsCompoundNoun::default()); } #[test] fn dont_flag_rollout_status() { assert_no_lints( "Rollout Status of Latest Image Release", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn font_flag_with_plugin() { assert_no_lints( "**Xcode** (8.0+, otherwise [with plugin](https://github.com/robertvojta/LigatureXcodePlugin))", PhrasalVerbAsCompoundNoun::default(), ) } #[test] fn dont_flag_and_layout_of_data() { assert_no_lints( "shape, memory space, and layout of data, while performing the complicated indexing for the user", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_in_noun_list_without_space_after_comma() { assert_no_lints( "shape, memory space,and layout of data", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_layout_estimation() { assert_no_lints( "Layout estimation focuses on predicting architectural elements, i.e., walls, doors, and windows, within an indoor scene.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_that() { assert_no_lints( "plugin that provides way for auto-loading of Golang SDK", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_load_balancing_and_failover() { assert_no_lints( "resilient mid-tier load balancing and failover", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_for() { assert_no_lints( "Plugin for text editors and IDEs.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_markup_language() { assert_no_lints( "Markup language used for websites & web apps.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_ecosystem_or_plugin_development() { assert_no_lints( "## 🧩 Plugin Ecosystem\n### Plugin Development", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_files_or_plugin_packages() { assert_no_lints( "plugin files between plugin packages installed with pip must have unique filenames.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_docs() { assert_no_lints( "building your own plugin: [Plugin Docs]", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_suite() { assert_no_lints( "An all-in-one digital audio workstation (DAW) and plugin suite.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_hacker_news_throwback_machine() { assert_no_lints( "| Hacker News Throwback Machine | Shows what was popular on Hacker News on this day in previous years.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_plugin_interface() { assert_no_lints("[Plugin interface]", PhrasalVerbAsCompoundNoun::default()); } #[test] fn issue_1918() { assert_no_lints( "Boost your productivity with our JetBrains plugin!", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn dont_flag_pop_up_2217() { assert_no_lints( "Popup window instead of command line.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn issue_1772() { assert_no_lints( "By default, only one tile size is instantiated for each data type, math instruction, and layout.", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn issue_2369() { assert_no_lints( "## Plugin developer documentation", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn issue_2505_dont_flag_backup_links() { assert_no_lints( "seamless switching to one of the backup links ideally happens without packet drops", PhrasalVerbAsCompoundNoun::default(), ); } #[test] fn issue_2505_correct_setup_but_dont_flag_backup_link() { assert_suggestion_result( "How to properly setup a backup link (and have it act like a backup again after stop/start of master link)", PhrasalVerbAsCompoundNoun::default(), "How to properly set up a backup link (and have it act like a backup again after stop/start of master link)", ); } } ================================================ FILE: harper-core/src/linting/phrase_set_corrections/mod.rs ================================================ use crate::linting::LintKind; use super::{LintGroup, MapPhraseSetLinter}; #[cfg(test)] mod tests; /// Produce a [`LintGroup`] that looks for errors in sets of common phrases. pub fn lint_group() -> LintGroup { let mut group = LintGroup::default(); // Each correction pair has a single bad form and a single correct form. macro_rules! add_1_to_1_mappings { ($group:expr, { $($name:expr => ($input_correction_pairs:expr, $message:expr, $description:expr $(, $lint_kind:expr)?)),+ $(,)? }) => { $( $group.add_chunk_expr_linter( $name, Box::new( MapPhraseSetLinter::one_to_one( $input_correction_pairs, $message, $description, None$(.or(Some($lint_kind)))?, ), ), ); )+ }; } // Each correction pair has multiple bad forms and multiple correct forms. macro_rules! add_many_to_many_mappings { ($group:expr, { $($name:expr => ($input_correction_multi_pairs:expr, $message:expr, $description:expr $(, $lint_kind:expr)?)),+ $(,)? }) => { $( $group.add_chunk_expr_linter( $name, Box::new( MapPhraseSetLinter::many_to_many( $input_correction_multi_pairs, $message, $description, None$(.or(Some($lint_kind)))?, ), ), ); )+ }; } add_1_to_1_mappings!(group, { "Ado" => ( &[ ("further adieu", "further ado"), ("much adieu", "much ado"), ], "Don't confuse the French/German `adieu`, meaning `farewell`, with the English `ado`, meaning `fuss`.", "Corrects `adieu` to `ado`.", LintKind::Eggcorn ), "Bollocks" => ( &[ ("bullocks!", "bollocks!"), ("complete bullocks", "complete bollocks"), ("dogs bullocks", "dogs bollocks"), ("dog's bullocks", "dog's bollocks"), ("is bullocks", "is bollocks"), ("it's bullocks", "it's bollocks"), ("its bullocks", "its bollocks"), ("such bullocks", "such bollocks"), ("that's bullocks", "that's bollocks"), ("thats bullocks", "thats bollocks"), ("total bullocks", "total bollocks"), ("utter bullocks", "utter bollocks"), ("was bullocks", "was bollocks"), ("what bullocks", "what bollocks"), ], "The slang word for `nonsense` is `bollocks`. `Bullocks` are male cattle.", "Corrects `bullocks` to `bollocks` when the meaning is `nonsense`.", LintKind::Spelling ), "ChampAtTheBit" => ( &[ ("chomp at the bit", "champ at the bit"), ("chomped at the bit", "champed at the bit"), ("chomping at the bit", "champing at the bit"), ("chomps at the bit", "champs at the bit"), ], "The correct idiom is `champ at the bit`.", "Corrects `chomp at the bit` to the idiom `champ at the bit`, which has an equestrian origin referring to the way an anxious horse grinds its teeth against the metal part of the bridle.", LintKind::Eggcorn ), "ClientOrServerSide" => ( &[ ("client's side", "client-side"), ("server's side", "server-side"), ], "`Client-side` and `server-side` do not use an apostrophe.", "Corrects extraneous apostrophe in `client's side` and `server's side`.", LintKind::Punctuation ), "CompulseToCompel" => ( &[ ("compulse", "compel"), ("compulsed", "compelled"), ("compulses", "compels"), ("compulsing", "compelling"), ], "Did you mean `compel` rather than the obsolete or archaic (and non-standard) `compulse`?", "Suggests replacing the obsolete or archaic verb `compulse` with the standard `compel`.", LintKind::Nonstandard ), "ConfirmThat" => ( &[ ("conform that", "confirm that"), ("conformed that", "confirmed that"), ("conforms that", "confirms that"), // Note: false positives in this inflection: // "is there any example of a case that isn't fully conforming that is supported today?" ("conforming that", "confirming that"), ], "Did you mean `confirm` rather than `conform`?", "Corrects `conform` typos to `confirm`.", LintKind::Typo ), "DefiniteArticle" => ( &[ ("definitive article", "definite article"), ("definitive articles", "definite articles") ], "The correct term for `the` is `definite article`.", "The name of the word `the` is `definite article`.", LintKind::Usage ), "DigestiveTract" => ( &[ ("digestive track", "digestive tract"), ("digestive tracks", "digestive tracts"), ], "The correct term is digestive `tract`.", "Corrects `digestive track` to `digestive tract`.", LintKind::WordChoice ), "Discuss" => ( &[ ("discuss about", "discuss"), ("discussed about", "discussed"), ("discusses about", "discusses"), ("discussing about", "discussing"), ], "`About` is redundant", "Removes unnecessary `about` after `discuss`.", // or maybe Redundancy? LintKind::Usage ), "DoesOrDose" => ( &[ // Negatives ("dose not", "does not"), // Pronouns ("he dose", "he does"), ("it dose", "it does"), ("she dose", "she does"), ("someone dose", "someone does"), // Interrogatives ("how dose", "how does"), ("when dose", "when does"), ("where dose", "where does"), ("who dose", "who does"), ("why dose", "why does"), ], "This may be a typo for `does`.", "Tries to correct typos of `dose` to `does`.", LintKind::Typo ), "ExpandArgument" => ( &[ ("arg", "argument"), ("args", "arguments"), ], "Use `argument` instead of `arg`", "Expands the abbreviation `arg` to the full word `argument` for clarity.", LintKind::Style ), "ExpandDependencies" => ( &[ ("dep", "dependency"), ("deps", "dependencies"), ], "Use `dependencies` instead of `deps`", "Expands the abbreviation `deps` to the full word `dependencies` for clarity.", LintKind::Style ), "ExpandDeref" => ( &[ ("deref", "dereference"), ("derefs", "dereferences"), ], "Use `dereference` instead of `deref`", "Expands the abbreviation `deref` to the full word `dereference` for clarity.", LintKind::Style ), "ExpandParameter" => ( &[ ("param", "parameter"), ("params", "parameters"), ], "Use `parameter` instead of `param`", "Expands the abbreviation `param` to the full word `parameter` for clarity.", LintKind::Style ), "ExpandPointer" => ( &[ ("ptr", "pointer"), ("ptrs", "pointers"), ], "Use `pointer` instead of `ptr`", "Expands the abbreviation `ptr` to the full word `pointer` for clarity.", LintKind::Style ), "ExpandStandardInputAndOutput" => ( &[ ("stdin", "standard input"), ("stdout", "standard output"), ("stderr", "standard error"), ], "Use `standard input`, `standard output`, and `standard error` instead of `stdin`, `stdout`, and `stderr`", "Expands the abbreviations `stdin`, `stdout`, and `stderr` to the full words `standard input`, etc. for clarity.", LintKind::Style ), "ExplanationMark" => ( &[ ("explanation mark", "exclamation mark"), ("explanation marks", "exclamation marks"), ("explanation point", "exclamation point"), ], "The correct names for the `!` punctuation are `exclamation mark` and `exclamation point`.", "Corrects the eggcorn `explanation mark/point` to `exclamation mark/point`.", LintKind::Usage ), "ExtendOrExtent" => ( &[ ("a certain extend", "a certain extent"), ("to an extend", "to an extent"), ("to some extend", "to some extent"), ("to the extend that", "to the extent that") ], "Use `extent` for the noun and `extend` for the verb.", "Corrects `extend` to `extent` when the context is a noun.", // ConfusedPair?? LintKind::WordChoice ), "FlauntForFlout" => ( &[ ("flaunt the rules", "flout the rules"), ("flaunts the rules", "flouts the rules"), ("flaunted the rules", "flouted the rules"), ("flaunting the rules", "flouting the rules"), ("flaunt the law", "flout the law"), ("flaunts the law", "flouts the law"), ("flaunted the law", "flouted the law"), ("flaunting the law", "flouting the law"), ("flaunt the regulations", "flout the regulations"), ("flaunt authority", "flout authority"), ("flaunts authority", "flouts authority"), ("flaunted authority", "flouted authority"), ("flaunting authority", "flouting authority"), ("flaunt convention", "flout convention"), ("flaunts convention", "flouts convention"), ("flaunted convention", "flouted convention"), ("flaunting convention", "flouting convention"), ], "`Flaunt` means to show off. Use `flout` when you mean to openly disregard rules or conventions.", "Corrects `flaunt` to `flout` when used with rule-like nouns.", LintKind::WordChoice ), "FoamAtTheMouth" => ( &[ ("foam out the mouth", "foam at the mouth"), ("foamed out the mouth", "foamed at the mouth"), ("foaming out the mouth", "foaming at the mouth"), ("foams out the mouth", "foams at the mouth"), ], "The correct idiom is `foam at the mouth`.", "Corrects the idiom `foam out the mouth` to the standard `foam at the mouth`.", LintKind::Nonstandard ), "FootTheBill" => ( &[ ("flip the bill", "foot the bill"), ("flipped the bill", "footed the bill"), ("flipping the bill", "footing the bill"), ("flips the bill", "foots the bill"), ], "The standard expression is `foot the bill`.", "Corrects `flip the bill` to `foot the bill`.", LintKind::Nonstandard ), "GetUsedTo" => ( &[ ("get used of", "get used to"), ("gets used of", "gets used to"), ("getting used of", "getting used to"), ("got used of", "got used to"), ("gotten used of", "gotten used to"), ], "Use `used to` instead of `used of`.", "Corrects `used of` to `used to`.", LintKind::Usage ), "GrindToAHalt" => ( &[ ("grind to halt", "grind to a halt"), ("grinding to halt", "grinding to a halt"), ("grinds to halt", "grinds to a halt"), ("ground to halt", "ground to a halt"), ], "You are missing the indefinite article `a` before `halt`.", "Corrects the idiom `grind to halt` to the standard `grind to a halt`.", LintKind::Nonstandard ), "HavePassed" => ( &[ ("had past", "had passed"), ("has past", "has passed"), ("have past", "have passed"), ("having past", "having passed"), ], "Did you mean the verb `passed`?", "Suggests `past` for `passed` in case a verb was intended.", // ConfusedPair? LintKind::WordChoice ), "HitTheNailOnTheHead" => ( &[ ("hit the nail in the head", "hit the nail on the head"), ("hits the nail in the head", "hits the nail on the head"), ("hitting the nail in the head", "hitting the nail on the head"), ("hitted the nail in the head", "hitted the nail on the head") ], "The correct preposition in this idiom is `on`.", "Corrects the eggcorn `hit the nail in the head` to the standard `hit the nail on the head`.", LintKind::Eggcorn ), "HomeInOn" => ( &[ ("hone in on", "home in on"), ("honed in on", "homed in on"), ("hones in on", "homes in on"), ("honing in on", "homing in on"), ], "Use `home in on` rather than `hone in on`", "Corrects `hone in on` to `home in on`.", LintKind::Eggcorn ), "InDetail" => ( &[ ("in details", "in detail"), ("in more details", "in more detail"), ], "Use singular `in detail` for referring to a detailed description.", "Corrects unidiomatic plural `in details` to `in detail`.", LintKind::Usage ), "InvestIn" => ( &[ // Verb ("invest into", "invest in"), ("invested into", "invested in"), ("investing into", "investing in"), ("invests into", "invests in"), // Noun ("investment into", "investment in"), // Note "investments into" can be correct in some contexts ], "Traditionally `invest` uses the preposition `in`.", "`Invest` is traditionally followed by 'in,' not `into.`", LintKind::Usage ), "LayoutVerb" => ( &[ ("layouted", "laid out"), ("layouting", "laying out"), // Note "layout" and "layouts" are valid as nouns ], "`layouted` and `layouting` are non-standard verb forms. Use `laid out` and `laying out` instead.", "Flags nonstandard verb forms of `layout` (like `layouted` and `layouting`) and suggests the standard English verb forms (`laid out` and `laying out`).", LintKind::Usage ), // General litotes (double negatives) → direct positive suggestions "LitotesDirectPositive" => ( &[ ("not uncommon", "common"), ("not unusual", "common"), ("not insignificant", "significant"), ("not unimportant", "important"), ("not unlikely", "likely"), ("not infrequent", "frequent"), ("not inaccurate", "accurate"), ("not unclear", "clear"), ("not irrelevant", "relevant"), ("not unpredictable", "predictable"), ("not inadequate", "adequate"), ("not unpleasant", "pleasant"), ("not unreasonable", "reasonable"), ("not impossible", "possible"), ("more preferable", "preferable"), ("not online", "offline"), ("not offline", "online"), ], "Consider the direct form.", "Offers direct-positive alternatives when double negatives might feel heavy.", LintKind::Style ), "MakeDoWith" => ( &[ ("make due with", "make do with"), ("made due with", "made do with"), ("makes due with", "makes do with"), ("making due with", "making do with"), ], "Use `do` instead of `due` when referring to a resource scarcity.", "Corrects `make due` to `make do` when followed by `with`." ), "MakeSense" => ( &[ ("make senses", "make sense"), ("made senses", "made sense"), ("makes senses", "makes sense"), ("making senses", "making sense") ], "Use `sense` instead of `senses`.", "Corrects `make senses` to `make sense`.", LintKind::Usage ), "MootPoint" => ( &[ ("mute point", "moot point"), ("point is mute", "point is moot"), ], "Use `moot` instead of `mute` when referring to a debatable or irrelevant point.", "Corrects `mute` to `moot` in the phrase `moot point`.", LintKind::Eggcorn ), "OperatingSystem" => ( &[ ("operative system", "operating system"), ("operative systems", "operating systems"), ], "Did you mean `operating system`?", "Ensures `operating system` is used correctly instead of `operative system`.", LintKind::Usage ), "PassersBy" => ( &[ ("passerbys", "passersby"), ("passer-bys", "passers-by"), ], "The correct plural is `passersby` or `passers-by`.", "Corrects `passerbys` and `passer-bys` to `passersby` or `passers-by`.", LintKind::Grammar ), "PeekBehindTheCurtain" => ( &[ ("peak behind the curtain", "peek behind the curtain"), ("peaked behind the curtain", "peeked behind the curtain"), ("peaking behind the curtain", "peeking behind the curtain"), ("peaks behind the curtain", "peeks behind the curtain"), ], "The correct idiom is `peek behind the curtain`.", "Corrects `peak behind the curtain` to `peek behind the curtain`.", LintKind::Eggcorn ), "Piggyback" => ( &[ ("piggy bag", "piggyback"), ("piggy bagged", "piggybacked"), ("piggy bagging", "piggybacking"), ], "Did you mean `piggyback`?", "Corrects the eggcorn `piggy bag` to `piggyback`, which is the proper term for riding on someone’s back or using an existing system.", LintKind::Eggcorn ), // Redundant degree modifiers on positives (double positives) → base form "RedundantSuperlatives" => ( &[ ("more optimal", "optimal"), ("most optimal", "optimal"), ("more ideal", "ideal"), ("most ideal", "ideal"), ], "Avoid redundant degree modifiers; prefer the base adjective.", "Simplifies redundant double positives like `most optimal` to the base form.", LintKind::Redundancy ), "ResponsibilityFor" => ( &[ ("take responsibility of", "take responsibility for"), ("took responsibility of", "took responsibility for"), ("taken responsibility of", "taken responsibility for"), ("taking responsibility of", "taking responsibility for"), ("takes responsibility of", "takes responsibility for"), ("assume responsibility of", "assume responsibility for"), ("assumed responsibility of", "assumed responsibility for"), ("assuming responsibility of", "assuming responsibility for"), ("assumes responsibility of", "assumes responsibility for"), ("claim responsibility of", "claim responsibility for"), ("claimed responsibility of", "claimed responsibility for"), ("claiming responsibility of", "claiming responsibility for"), ("claims responsibility of", "claims responsibility for"), ], "The correct preposition is `for`, not `of`.", "Corrects `take/assume/claim responsibility of` to `take/assume/claim responsibility for`.", LintKind::Usage ), "ScapeGoat" => ( &[ ("an escape goat", "a scapegoat"), ("escape goat", "scapegoat"), ("escape goats", "scapegoats"), ], "If you're referring someone is being blamed unfairly, write it as a single word: `scapegoat`.", "Corrects `scape goat` to `scapegoat`, which is the proper term for a person blamed for others' failures.", LintKind::Eggcorn ), "SeamToSeem" => ( &[ ("seam to be", "seem to be"), ("seams to be", "seems to be"), ("i seam", "i seem"), ("we seam", "we seem"), ("we all seam", "we all seem"), ("we both seam", "we both seem"), ("you seam", "you seem"), ("you all seam", "you all seem"), ("you both seam", "you both seem"), ("he seams", "he seems"), ("she seams", "she seems"), ("it seams", "it seems"), ("they seam", "they seem"), ("they all seam", "they all seem"), ("they both seam", "they both seem"), ("everything seams", "everything seems"), ("everybody seams", "everybody seems"), ("everyone seams", "everyone seems") ], "Did you mean `seem`? `Seam` refers to a line where two pieces of material are sewn together.", "Corrects `seam` to `seem` when used as a verb meaning `to appear` or `to give the impression`.", LintKind::Spelling ), "SubjunctiveWasToWere" => ( &[ ("if only there was", "if only there were"), ("if only i was", "if only i were"), ("if only he was", "if only he were"), ("if only she was", "if only she were"), ("if only it was", "if only it were"), ("i wish there was", "i wish there were"), ("i wish i was", "i wish i were"), ("i wish he was", "i wish he were"), ("i wish she was", "i wish she were"), ("i wish it was", "i wish it were") ], "Use the subjunctive mood with `if only` or `I wish`. The correct form is `were`, not `was`.", "Ensures proper use of the subjunctive mood in counterfactual conditional statements starting with `if only` or `I wish`.", LintKind::Grammar ), "WreakHavoc" => ( &[ ("wreck havoc", "wreak havoc"), ("wrecked havoc", "wreaked havoc"), ("wrecking havoc", "wreaking havoc"), ("wrecks havoc", "wreaks havoc"), ], "Did you mean `wreak havoc`?", "Corrects the eggcorn `wreck havoc` to `wreak havoc`, which is the proper term for causing chaos or destruction.", LintKind::Eggcorn ), "WroteToRote" => ( &[ ("by wrote", "by rote"), ("by-wrote", "by-rote"), ("wrote learning", "rote learning"), ("wrote memorisation", "rote memorisation"), ("wrote-memorisation", "rote-memorisation"), ("wrote memorization", "rote memorization"), ("wrote-memorization", "rote-memorization"), ("wrote memorizing", "rote memorizing"), ], "Did you mean `rote` (mechanical memorization) instead of `wrote`?", "Corrects `by wrote` to `by rote`.", LintKind::Eggcorn ) }); add_many_to_many_mappings!(group, { "AwaitFor" => ( &[ (&["await for"], &["await", "wait for"]), (&["awaited for"], &["awaited", "waited for"]), (&["awaiting for"], &["awaiting", "waiting for"]), (&["awaits for"], &["awaits", "waits for"]) ], "`Await` and `for` are redundant when used together - use one or the other", "Suggests using either `await` or `wait for` but not both, as they express the same meaning.", LintKind::Redundancy ), "CommitmentTo" => ( &[ (&["commitment toward", "commitment towards"], &["commitment to"]), (&["commitments toward", "commitments towards"], &["commitments to"]), ], "The correct preposition to use with `commitment` is `to`, not `toward` or `towards`.", "Corrects `commitment toward/towards` to `commitment to`.", LintKind::Usage ), "Copyright" => ( &[ (&["copywrite"], &["copyright"]), (&["copywrites"], &["copyrights"]), (&["copywriting"], &["copyrighting"]), (&["copywritten", "copywrited", "copywrote"], &["copyrighted"]), ], "Did you mean `copyright`? `Copywrite` means to write copy (advertising text), while `copyright` is the legal right to control use of creative works.", "Corrects `copywrite` to `copyright`. `Copywrite` refers to writing copy, while `copyright` is the legal right to creative works.", LintKind::WordChoice ), "DoubleEdgedSword" => ( &[ (&["double edge sword", "double-edge sword", "double edge-sword", "double-edge-sword", "double edged sword", "double edged-sword", "double-edged-sword"], &["double-edged sword"]), (&["double edge swords", "double-edge swords", "double edge-swords", "double-edge-swords", "double edged swords", "double edged-swords", "double-edged-swords"], &["double-edged swords"]), ], "Did you mean `double-edged sword`?", "Corrects variants of `double-edged sword`.", LintKind::Spelling ), "ExpandAlloc" => ( &[ (&["alloc"], &["allocate", "allocation"]), (&["allocs"], &["allocates", "allocations"]), ], "Use `allocate` or `allocation` instead of `alloc`", "Expands the abbreviation `alloc` to the full word `allocate` or `allocation` for clarity.", LintKind::Style ), "ExpandDecl" => ( &[ (&["decl"], &["declaration", "declarator"]), (&["decls"], &["declarations", "declarators"]) ], "Use `declaration` or `declarator` instead of `decl`", "Expands the abbreviation `decl` to the full word `declaration` or `declarator` for clarity.", LintKind::Style ), "Expat" => ( &[ (&["ex-pat", "ex pat"], &["expat"]), (&["ex-pats", "ex pats"], &["expats"]), (&["ex-pat's", "ex pat's"], &["expat's"]), ], "The correct spelling is `expat` with no hyphen or space.", "Corrects the mistake of writing `expat` as two words.", LintKind::Spelling ), "Expatriate" => ( &[ (&["ex-patriot", "expatriot", "ex patriot"], &["expatriate"]), (&["ex-patriots", "expatriots", "ex patriots"], &["expatriates"]), (&["ex-patriot's", "expatriot's", "ex patriot's"], &["expatriate's"]), ], "Use the correct term for someone living abroad.", "Fixes the misinterpretation of `expatriate`, ensuring the correct term is used for individuals residing abroad.", LintKind::Eggcorn ), "GetRidOf" => ( &[ (&["get rid off", "get ride of", "get ride off"], &["get rid of"]), (&["gets rid off", "gets ride of", "gets ride off"], &["gets rid of"]), (&["getting rid off", "getting ride of", "getting ride off"], &["getting rid of"]), (&["got rid off", "got ride of", "got ride off"], &["got rid of"]), (&["gotten rid off", "gotten ride of", "gotten ride off"], &["gotten rid of"]), ], "The idiom is `to get rid of`, not `off` or `ride`.", "Corrects common misspellings of the idiom `get rid of`.", LintKind::Typo ), "HolyWar" => ( &[ (&["holey war", "holly war"], &["holy war"]), (&["holey wars", "holly wars"], &["holy wars"]), ], "Literally for religious conflicts and metaphorically for tech preference debats, the correct spelling is `holy war`.", "Corrects misspellings of `holy war`.", LintKind::Malapropism ), "HowItLooksLike" => ( &[ (&["how he looks like"], &["how he looks", "what he looks like"]), (&["how it looks like", "how it look like", "how it look's like"], &["how it looks", "what it looks like"]), (&["how she looks like"], &["how she looks", "what she looks like"]), (&["how they look like", "how they looks like"], &["how they look", "what they look like"]), ], "Don't use both `how` and `like` together to express similarity.", "Corrects `how ... looks like` to `how ... looks` or `what ... looks like`.", LintKind::Grammar ), "MakeItSeem" => ( &[ (&["make it seems"], &["make it seem"]), (&["made it seems", "made it seemed"], &["made it seem"]), (&["makes it seems"], &["makes it seem"]), (&["making it seems"], &["making it seem"]), ], "Don't inflect `seem` in `make it seem`.", "Corrects `make it seems` to `make it seem`." ), "NervousWreck" => ( &[ (&["nerve wreck", "nerve-wreck"], &["nervous wreck"]), (&["nerve wrecks", "nerve-wrecks"], &["nervous wrecks"]), ], "Use `nervous wreck` when referring to a person who is extremely anxious or upset. `Nerve wreck` is non-standard but sometimes used for events or situations.", "Suggests using `nervous wreck` when referring to a person's emotional state.", LintKind::Eggcorn ), "NotOnly" => ( &[ (&["no only are"], &["not only are"]), (&["no only is"], &["not only is"]), (&["no only was"], &["not only was"]), (&["no only were"], &["not only were"]), ], "Use `not only` instead of `no only` in this expression.", "Corrects `no only` to `not only` before forms of `to be`.", LintKind::Grammar ), "RiseTheQuestion" => ( &[ (&["rise the question", "arise the question"], &["raise the question"]), (&["rises the question", "arises the question"], &["raises the question"]), ( &[ "risen the question", "rose the question", "rised the question", "arisen the question", "arose the question", "arised the question" ], &["raised the question"] ), (&["rising the question", "arising the question"], &["raising the question"]) ], "Use `raise` instead of `rise` when referring to the act of asking a question.", "Corrects `rise the question` to `raise the question`.", LintKind::Grammar ), "ToTooIdioms" => ( &[ (&["a bridge to far"], &["a bridge too far"]), (&["cake and eat it to"], &["cake and eat it too"]), // "a few to many" has many false positives (&["go to far"], &["go too far"]), (&["goes to far"], &["goes too far"]), (&["going to far"], &["going too far"]), (&["gone to far"], &["gone too far"]), (&["went to far"], &["went too far"]), // "in to deep" has many false positives (&["life's to short", "lifes to short"], &["life's too short"]), (&["life is to short"], &["life is too short"]), // "one to many" has many false positives (&["put to fine a point"], &["put too fine a point"], ), (&["speak to soon"], &["speak too soon"]), (&["speaking to soon"], &["speaking too soon"]), // "speaks to soon" is very rare (&["spoke to soon"], &["spoke too soon"]), (&["spoken to soon"], &["spoken too soon"]), (&["think to much"], &["think too much"]), (&["to big for"], &["too big for"]), (&["to big to fail"], &["too big to fail"]), (&["to good to be true", "too good too be true"], &["too good to be true"]), (&["to much information"], &["too much information"]), ], "Use `too` rather than `to` in this expression.", "Corrects `to` used instead of `too`.", LintKind::Grammar ), "TooTo" => ( &[ (&["too big too fail"], &["too big to fail"]) ], "Use `to` rather than `too` in this expression.", "Corrects `too` used instead of `to`.", LintKind::Grammar ), "WholeEntire" => ( &[ (&["whole entire"], &["whole", "entire"]), // Avoid suggestions resulting in "a entire ...." (&["a whole entire"], &["a whole", "an entire"]), ], "Avoid redundancy. Use either `whole` or `entire` for referring to the complete amount or extent.", "Corrects the redundancy in `whole entire` to `whole` or `entire`.", LintKind::Redundancy ), "WorseOrWorst" => ( &[ // worst -> worse (&["a lot worst", "alot worst"], &["a lot worse"]), (&["become worst"], &["become worse"]), (&["became worst"], &["became worse"]), (&["becomes worst"], &["becomes worse"]), (&["becoming worst"], &["becoming worse"]), (&["far worst"], &["far worse"]), (&["get worst"], &["get worse"]), (&["gets worst"], &["gets worse"]), (&["getting worst"], &["getting worse"]), (&["got worst"], &["got worse"]), (&["gotten worst"], &["gotten worse"]), (&["make it worst"], &["make it worse"]), (&["made it worst"], &["made it worse"]), (&["makes it worst"], &["makes it worse"]), (&["making it worst"], &["making it worse"]), (&["make them worst"], &["make them worse"]), (&["made them worst"], &["made them worse"]), (&["makes them worst"], &["makes them worse"]), (&["making them worst"], &["making them worse"]), (&["much worst"], &["much worse"]), (&["turn for the worst"], &["turn for the worse"]), (&["worst and worst", "worse and worst", "worst and worse"], &["worse and worse"]), (&["worst than"], &["worse than"]), // worse -> worst (&["at worse"], &["at worst"]), (&["worse case scenario", "worse-case scenario", "worse-case-scenario"], &["worst-case scenario"]), (&["worse ever"], &["worst ever"]), ], "`Worse` is for comparing and `worst` is for the extreme case.", "Corrects `worse` and `worst` used in contexts where the other belongs.", LintKind::Agreement ) }); group.set_all_rules_to(Some(true)); group } ================================================ FILE: harper-core/src/linting/phrase_set_corrections/tests.rs ================================================ use crate::linting::tests::{ assert_good_and_bad_suggestions, assert_lint_count, assert_no_lints, assert_suggestion_result, }; use super::lint_group; // 1:1 tests // Ado #[test] fn corrects_further_ado() { assert_suggestion_result( "... but we finally hit a great spot, so without further adieu.", lint_group(), "... but we finally hit a great spot, so without further ado.", ); } #[test] fn corrects_much_ado() { assert_suggestion_result( "After much adieu this functionality is now available.", lint_group(), "After much ado this functionality is now available.", ); } // Bollocks #[test] fn fix_complete_bullocks() { assert_suggestion_result( "why you think some of them are complete bullocks or would be a bad idea", lint_group(), "why you think some of them are complete bollocks or would be a bad idea", ); } #[test] fn fix_dogs() { assert_suggestion_result( "The cat's ass, priceless! I have to steal that one. My go to phrase is “The dog's bullocks.", lint_group(), "The cat's ass, priceless! I have to steal that one. My go to phrase is “The dog's bollocks.", ); } #[test] fn fix_dogs_no_apostrophe_bullocks() { assert_suggestion_result( "some dumb rubbish that i do not give a dogs bullocks about", lint_group(), "some dumb rubbish that i do not give a dogs bollocks about", ); } #[test] fn fix_is_bullocks() { assert_suggestion_result( "for me this is bullocks, when the same user can sudo rm -rf", lint_group(), "for me this is bollocks, when the same user can sudo rm -rf", ); } #[test] fn fix_its_bullocks() { assert_suggestion_result( "I'm too lazy to explain why, but I think it's bullocks.", lint_group(), "I'm too lazy to explain why, but I think it's bollocks.", ); } #[test] fn fix_its_no_apostrophe_bullocks() { assert_suggestion_result( "but lance, dont claim to be clean, because we all know its bullocks", lint_group(), "but lance, dont claim to be clean, because we all know its bollocks", ); } #[test] fn fix_such_bullocks() { assert_suggestion_result( "This is why numerology is such bullocks.", lint_group(), "This is why numerology is such bollocks.", ); } #[test] fn fix_thats_bullocks() { assert_suggestion_result( "Respectfully, that's bullocks.", lint_group(), "Respectfully, that's bollocks.", ); } #[test] fn fix_thats_no_apostrophe_bullocks() { assert_suggestion_result( "In CSS thats bullocks as directives have priority in the order they are defined.", lint_group(), "In CSS thats bollocks as directives have priority in the order they are defined.", ); } #[test] fn fix_total_bullocks() { assert_suggestion_result( "Pointing out to the audience that their gravity explanation is total bullocks would seem an ethical must as well.", lint_group(), "Pointing out to the audience that their gravity explanation is total bollocks would seem an ethical must as well.", ); } #[test] fn fix_utter_bullocks() { assert_suggestion_result( "what utter bullocks a self employed person will get £94 under corona virus crisis", lint_group(), "what utter bollocks a self employed person will get £94 under corona virus crisis", ); } #[test] fn fix_was_bullocks() { assert_suggestion_result( "a few years ago I thought that was bullocks", lint_group(), "a few years ago I thought that was bollocks", ); } #[test] fn fix_bullocks_exclamation() { assert_suggestion_result( "throw(new Error('Bullocks!')));", lint_group(), "throw(new Error('Bollocks!')));", ); } #[test] fn dont_flag_herd_of_bullocks() { assert_no_lints( "driven back (literally) by a herd of bullocks across the path", lint_group(), ); } // ChampAtTheBit #[test] fn correct_chomp_at_the_bit() { assert_suggestion_result( "so other than rolling back to older drivers i might have to chomp at the bit for a while longer yet", lint_group(), "so other than rolling back to older drivers i might have to champ at the bit for a while longer yet", ); } #[test] fn correct_chomped_at_the_bit() { assert_suggestion_result( "I chomped at the bit, frustrated by my urge to go faster, while my husband chafed at what I thought was a moderate pace.", lint_group(), "I champed at the bit, frustrated by my urge to go faster, while my husband chafed at what I thought was a moderate pace.", ); } #[test] fn correct_chomping_at_the_bit() { assert_suggestion_result( "Checking in to see when the Windows install will be ready. I am chomping at the bit!", lint_group(), "Checking in to see when the Windows install will be ready. I am champing at the bit!", ); } #[test] fn correct_chomps_at_the_bit() { assert_suggestion_result( "nobody chomps at the bit to make sure these are maintained, current, complete, and error free", lint_group(), "nobody champs at the bit to make sure these are maintained, current, complete, and error free", ); } // ClientOrServerSide // -client's side- #[test] fn correct_clients_side() { assert_suggestion_result( "I want to debug this server-side as I cannot find out why the connection is being refused from the client's side.", lint_group(), "I want to debug this server-side as I cannot find out why the connection is being refused from the client-side.", ); } // -server's side- #[test] fn correct_servers_side() { assert_suggestion_result( "A client-server model where the client can execute commands in a terminal on the server's side", lint_group(), "A client-server model where the client can execute commands in a terminal on the server-side", ); } // CompulseToCompel #[test] fn correct_compulse() { assert_suggestion_result( "Play Store will soon compulse to use SDK 30 on any app updates , and it's mandatory to have SDK 30 for new apps.", lint_group(), "Play Store will soon compel to use SDK 30 on any app updates , and it's mandatory to have SDK 30 for new apps.", ); } #[test] fn correct_compulsed() { assert_suggestion_result( "Just alpha, but now i am compulsed to work 10.6 into the github actions and insane docker environment :)", lint_group(), "Just alpha, but now i am compelled to work 10.6 into the github actions and insane docker environment :)", ); } #[test] fn correct_compulses() { assert_suggestion_result( "Occasionally, a film comes along that compulses me to make a fan poster.", lint_group(), "Occasionally, a film comes along that compels me to make a fan poster.", ); } #[test] fn correct_compulsing() { assert_suggestion_result( "We have an button enabled to prompt user to download the app whenever we find difference in version number in our servlet war file and apk verision compulsing user to update.", lint_group(), "We have an button enabled to prompt user to download the app whenever we find difference in version number in our servlet war file and apk verision compelling user to update.", ); } // ConfirmThat #[test] fn correct_conform_that() { assert_suggestion_result( "the WCAG requires every view of the page to conform that we move this", lint_group(), "the WCAG requires every view of the page to confirm that we move this", ); } #[test] fn corrects_conformed_that() { assert_suggestion_result( "I have conformed that works now.", lint_group(), "I have confirmed that works now.", ); } #[test] fn corrects_conforms_that() { assert_suggestion_result( "I conformed that with the correct configuration, this is working correctly.", lint_group(), "I confirmed that with the correct configuration, this is working correctly.", ); } #[test] #[ignore = "False positive not yet handled."] fn dont_flag_conforming_that() { assert_lint_count( "is there any example of a case that isn't fully conforming that is supported today?", lint_group(), 0, ); } #[test] fn corrects_conforming_that() { assert_suggestion_result( "Thanks for conforming that this issue is fixed in the latest version.", lint_group(), "Thanks for confirming that this issue is fixed in the latest version.", ); } // DefiniteArticle #[test] fn corrects_definite_article() { assert_suggestion_result( "As for format of outputs: the spec defines the field as using the singular definitive article \"the\"", lint_group(), "As for format of outputs: the spec defines the field as using the singular definite article \"the\"", ); } #[test] #[ignore = "Title case capitalization problem causes this one to fail too."] fn corrects_definite_articles_title_case() { assert_suggestion_result( "01 Definitive Articles: De or Het. Before starting more complicated topics in Dutch grammar, you should be aware of the articles.", lint_group(), "01 Definite Articles: De or Het. Before starting more complicated topics in Dutch grammar, you should be aware of the articles.", ); } #[test] fn corrects_definite_articles_lowercase() { assert_suggestion_result( ".. definitive articles -та /-ta/ and -те /-te/ (postfixed in Bulgarian).", lint_group(), ".. definite articles -та /-ta/ and -те /-te/ (postfixed in Bulgarian).", ); } // DigestiveTract #[test] fn dont_flag_digestive_track() { assert_suggestion_result( "In infants less than a year old, because their digestive track is not finished developing yet", lint_group(), "In infants less than a year old, because their digestive tract is not finished developing yet", ); } #[test] fn corrects_digestive_tracks() { assert_suggestion_result( "The digestive tracks of mammals are complex and diverse, with each species having its own unique digestive system.", lint_group(), "The digestive tracts of mammals are complex and diverse, with each species having its own unique digestive system.", ); } // Discuss // -none- // DoesOrDose // -does not- #[test] fn corrects_dose_not() { assert_suggestion_result( "It dose not run windows ?", lint_group(), "It does not run windows ?", ); } // -dose it true positive- #[test] #[ignore = "due to false positives this can't be fixed yet"] fn corrects_dose_it() { assert_suggestion_result( "dose it support zh_cn ?", lint_group(), "does it support zh_cn ?", ); } // -dose it- noun false positives // it should be noted that (in an excessive dose) (it might have an opposite effect) #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_excessive_dose_it_might() { assert_lint_count( "it should be noted that in an excessive dose it might have an opposite effect", lint_group(), 0, ); } // When the person receives (a prescribed second dose) (it is not counted ttwice) #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_second_dose_it_is_not() { assert_lint_count( "When the person receives a prescribed second dose it is not counted ttwice", lint_group(), 0, ); } // (At that small a dose) (it was pleasent). #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_a_dose_it_was() { assert_lint_count("At that small a dose it was pleasent.", lint_group(), 0); } // I do not know (what dose) (it takes) to trip out, but I don't think I could stay awake to find out. #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_what_dose_it_takes() { assert_lint_count( "I do not know what dose it takes to trip out, but I don't think I could stay awake to find out.", lint_group(), 0, ); } // -dose it- verb false positives #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_to_dose_it() { assert_lint_count( "And then I have to re-add the salts back to it to dose it back up to drinkable.", lint_group(), 0, ); } #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_dont_dose_it_too_high() { assert_lint_count( "So my conclusion is: don't dose it too high or it actually is dangerous and not pleasant at all", lint_group(), 0, ); } #[test] #[ignore = "would be a false positive in a naive implementation"] fn dont_flag_to_dose_it_off() { assert_lint_count( "the only solution the other hopefully-dominant-reasonable-adult-human mind can find, is to dose it off, hoping the drowsiness can keep the fear at bay", lint_group(), 0, ); } // -he/she/it does- #[test] fn corrects_he_does() { assert_suggestion_result( "This validate each and every field of your from with nice dotted red color warring for the user, incase he dose some mistakes.", lint_group(), "This validate each and every field of your from with nice dotted red color warring for the user, incase he does some mistakes.", ); } #[test] fn corrects_she_does() { assert_suggestion_result( "we wont agree on everything she dose thats what a real person would feel like", lint_group(), "we wont agree on everything she does thats what a real person would feel like", ); } // -it does- #[test] fn corrects_it_dose() { assert_suggestion_result( "it dose work without WEBP enabled", lint_group(), "it does work without WEBP enabled", ); } // -someone does- #[test] fn corrects_someone_dose() { assert_suggestion_result( "Hopefully someone dose, I'm not good at C programing....", lint_group(), "Hopefully someone does, I'm not good at C programing....", ); } // -interrogatives- #[test] fn corrects_how_dose() { assert_suggestion_result( "How dose qsv-copy works?", lint_group(), "How does qsv-copy works?", ); } #[test] #[ignore = "false positive not yet detected"] fn dont_fix_how_dose_false_positive() { assert_lint_count( "Work in progress exploration of how dose modifications throughout a trial can also induce bias in the exposure-response relationships.", lint_group(), 0, ); } #[test] fn corrects_when_dose() { assert_suggestion_result( "When dose reusebale variable sync between device? #2634", lint_group(), "When does reusebale variable sync between device? #2634", ); } #[test] #[ignore = "false positive not yet detected"] fn dont_fix_when_dose_false_positive() { assert_lint_count( "Should we remove the dose when dose has been applied", lint_group(), 0, ); } #[test] fn corrects_where_dose() { assert_suggestion_result( "where dose the password store?", lint_group(), "where does the password store?", ); } #[test] #[ignore = "false positive not yet detected"] fn dont_fix_where_dose_false_positive() { assert_lint_count( "added some better error handling for the weird case where dose files have no dose...", lint_group(), 0, ); } #[test] fn corrects_who_dose() { assert_suggestion_result( "Who dose knows the problem?", lint_group(), "Who does knows the problem?", ); } #[test] fn corrects_why_dose() { assert_suggestion_result( "why dose the path is random ?", lint_group(), "why does the path is random ?", ); } // Note: no false positive detected for 'why does'. Only true positives. // ExpandArgument #[test] fn corrects_arg() { assert_suggestion_result( "but I cannot figure out how to flag an arg as required", lint_group(), "but I cannot figure out how to flag an argument as required", ); } #[test] fn corrects_args() { assert_suggestion_result( "but every test I've done shows args as being about 65% faster", lint_group(), "but every test I've done shows arguments as being about 65% faster", ); } // ExpandDecl #[test] fn corrects_decl() { assert_suggestion_result( "Yeah, I agree a forward decl would be preferable in this case.", lint_group(), "Yeah, I agree a forward declaration would be preferable in this case.", ); } #[test] fn corrects_decls() { assert_suggestion_result( "Accessing type decls from pointer types", lint_group(), "Accessing type declarations from pointer types", ); } // ExpandDependency // -none- // ExpandDereference #[test] fn expand_deref() { assert_suggestion_result( "Should raw pointer deref/projections have to be in-bounds?", lint_group(), "Should raw pointer dereference/projections have to be in-bounds?", ); } #[test] fn corrects_derefs() { assert_suggestion_result( "A contiguous-in-memory double-ended queue that derefs into a slice - gnzlbg/slice_deque.", lint_group(), "A contiguous-in-memory double-ended queue that dereferences into a slice - gnzlbg/slice_deque.", ); } // ExpandParam #[test] fn corrects_param() { assert_suggestion_result( "If I use the following to set an endDate param with a default value", lint_group(), "If I use the following to set an endDate parameter with a default value", ); } #[test] fn corrects_params() { assert_suggestion_result( "the params are not loaded in the R environment when using the terminal", lint_group(), "the parameters are not loaded in the R environment when using the terminal", ); } // ExpandPointer fn correct_ptr() { assert_suggestion_result( "How else would you construct a slice from a ptr and a length?", lint_group(), "How else would you construct a slice from a pointer and a length?", ); } fn correct_ptrs() { assert_suggestion_result( "FixedBufferAllocator.free not freeing ptrs", lint_group(), "FixedBufferAllocator.free not freeing pointers", ); } // ExpandSpecification // ExpandStandardInput // -none- // ExpandStandardOutput // -none- // ExplanationMark #[test] fn detect_explanation_mark_atomic() { assert_suggestion_result("explanation mark", lint_group(), "exclamation mark"); } #[test] fn detect_explanation_marks_atomic() { assert_suggestion_result("explanation marks", lint_group(), "exclamation marks"); } #[test] fn detect_explanation_mark_real_world() { assert_suggestion_result( "Note that circled explanation mark, question mark, plus and arrows may be significantly harder to distinguish than their uncircled variants.", lint_group(), "Note that circled exclamation mark, question mark, plus and arrows may be significantly harder to distinguish than their uncircled variants.", ); } #[test] fn detect_explanation_marks_real_world() { assert_suggestion_result( "this issue: html: properly handle explanation marks in comments", lint_group(), "this issue: html: properly handle exclamation marks in comments", ); } #[test] fn detect_explanation_point_atomic() { assert_suggestion_result("explanation point", lint_group(), "exclamation point"); } #[test] fn detect_explanation_point_real_world() { assert_suggestion_result( "js and makes an offhand mention that you can disable inbuilt plugin with an explanation point (e.g. !error ).", lint_group(), "js and makes an offhand mention that you can disable inbuilt plugin with an exclamation point (e.g. !error ).", ); } // ExtendOrExtent #[test] fn correct_certain_extend() { assert_suggestion_result( "This is a PowerShell script to automate client pentests / checkups - at least to a certain extend.", lint_group(), "This is a PowerShell script to automate client pentests / checkups - at least to a certain extent.", ); } #[test] fn correct_to_the_extend() { assert_suggestion_result( "Our artifacts are carefully documented and well-structured to the extend that reuse is facilitated.", lint_group(), "Our artifacts are carefully documented and well-structured to the extent that reuse is facilitated.", ); } #[test] fn correct_to_some_extend() { assert_suggestion_result( "Hi, I'm new to Pydantic and to some extend python, and I have a question that I haven't been able to figure out from the Docs.", lint_group(), "Hi, I'm new to Pydantic and to some extent python, and I have a question that I haven't been able to figure out from the Docs.", ); } #[test] fn correct_to_an_extend() { assert_suggestion_result( "It mimics (to an extend) the way in which Chrome requests SSO cookies with the Windows 10 accounts extension.", lint_group(), "It mimics (to an extent) the way in which Chrome requests SSO cookies with the Windows 10 accounts extension.", ); } // FlauntForFlout #[test] fn corrects_flaunt_the_rules() { assert_suggestion_result( "Some users flaunt the rules of punctuation.", lint_group(), "Some users flout the rules of punctuation.", ); } #[test] fn corrects_flaunted_the_law() { assert_suggestion_result( "He flaunted the law for personal gain.", lint_group(), "He flouted the law for personal gain.", ); } #[test] fn corrects_flaunting_authority() { assert_suggestion_result( "She was flaunting authority at every turn.", lint_group(), "She was flouting authority at every turn.", ); } #[test] fn allows_flaunt_wealth() { assert_no_lints("He likes to flaunt his wealth.", lint_group()); } // FoamAtTheMouth #[test] fn correct_foam_out_the_mouth() { assert_suggestion_result( "and he gave him a drink that made him foam out the mouth and die", lint_group(), "and he gave him a drink that made him foam at the mouth and die", ); } #[test] fn correct_foamed_out_the_mouth() { assert_suggestion_result( "You can see in some shots they've foamed out the mouth, and it's apparent their poisoned.", lint_group(), "You can see in some shots they've foamed at the mouth, and it's apparent their poisoned.", ); } #[test] fn correct_foaming_out_the_mouth() { assert_suggestion_result( "choking or foaming out the mouth or something like that, leading up to death", lint_group(), "choking or foaming at the mouth or something like that, leading up to death", ); } #[test] fn correct_foams_out_the_mouth() { assert_suggestion_result( "Elaine can't swallow, foams out the mouth and Kramer says she has rabies just like his friend Bob Sacamano after she gets bit by the guy's dog", lint_group(), "Elaine can't swallow, foams at the mouth and Kramer says she has rabies just like his friend Bob Sacamano after she gets bit by the guy's dog", ); } // FootTheBill #[test] fn correct_flip_the_bill() { assert_suggestion_result( "- SQL Compare (If the company will flip the bill)", lint_group(), "- SQL Compare (If the company will foot the bill)", ); } #[test] fn correct_flipped_the_bill() { assert_suggestion_result( "As a meetup we were extremely lucky that NOVI flipped the bill for our in-person events.", lint_group(), "As a meetup we were extremely lucky that NOVI footed the bill for our in-person events.", ); } #[test] fn correct_flipping_the_bill() { assert_suggestion_result( "for the simple reason that there were no multimillion dollar company flipping the bill", lint_group(), "for the simple reason that there were no multimillion dollar company footing the bill", ); } #[test] fn correct_flips_the_bill() { assert_suggestion_result( "There seems to be a perennial debate in Illinois between urbanites and rural folk about who really flips the bill.", lint_group(), "There seems to be a perennial debate in Illinois between urbanites and rural folk about who really foots the bill.", ); } // GetUsedTo //-get used of- #[test] fn corrects_get_used_of() { assert_suggestion_result( "I am following the examples in the documentation in order to get used of comets.", lint_group(), "I am following the examples in the documentation in order to get used to comets.", ); } //-gets used of- #[test] fn corrects_gets_used_of() { assert_suggestion_result( "its like she gets used of her food and becomes spoiled", lint_group(), "its like she gets used to her food and becomes spoiled", ); } //-getting used of- #[test] fn corrects_getting_used_of() { assert_suggestion_result( "Here you can find a guide to getting used of the most important methods of magum.", lint_group(), "Here you can find a guide to getting used to the most important methods of magum.", ); } //-got used of- #[test] fn corrects_got_used_of() { assert_suggestion_result( "we users actually got used of such delays", lint_group(), "we users actually got used to such delays", ); } //-gotten used of- #[test] fn corrects_gotten_used_of() { assert_suggestion_result( "The tutorial has indeed been of help, and I've gotten used of using Hull.", lint_group(), "The tutorial has indeed been of help, and I've gotten used to using Hull.", ); } // GrindToAHalt #[test] fn corrects_grind_to_halt() { // Without this it will eventually grind to halt as it backs up upon itself assert_suggestion_result( "Without this it will eventually grind to halt as it backs up upon itself", lint_group(), "Without this it will eventually grind to a halt as it backs up upon itself", ); } #[test] #[ignore = "Fails due to how replace_with_matched_case works"] fn corrects_grind_to_halt_title_case() { assert_suggestion_result( "Smart Search Tools Cause System to Grind to Halt", lint_group(), "Smart Search Tools Cause System to Grind to a Halt", ); } #[test] fn corrects_grinding_to_halt() { assert_suggestion_result( "app grinding to halt when loading many objects", lint_group(), "app grinding to a halt when loading many objects", ); } #[test] fn corrects_grinds_to_halt() { assert_suggestion_result( "If your machine grinds to halt due to memory oversubscription, you may want to try to set the MOLD_JOBS environment variable to 1", lint_group(), "If your machine grinds to a halt due to memory oversubscription, you may want to try to set the MOLD_JOBS environment variable to 1", ); } #[test] fn corrects_ground_to_halt() { assert_suggestion_result( "As you have probably guessed, my work on my fork has ground to halt.", lint_group(), "As you have probably guessed, my work on my fork has ground to a halt.", ); } // HavePassed #[test] fn correct_has_past() { assert_suggestion_result( "Track the amount of time that has past since a point in time.", lint_group(), "Track the amount of time that has passed since a point in time.", ); } #[test] fn correct_have_past() { assert_suggestion_result( "Another 14+ days have past, any updates on this?", lint_group(), "Another 14+ days have passed, any updates on this?", ); } #[test] fn correct_had_past() { assert_suggestion_result( "Few days had past, so im starting to thinks there is a problem in my local version.", lint_group(), "Few days had passed, so im starting to thinks there is a problem in my local version.", ); } #[test] fn correct_having_past() { assert_suggestion_result( "Return to computer, with enough time having past for the computer to go to full sleep.", lint_group(), "Return to computer, with enough time having passed for the computer to go to full sleep.", ); } // HitTheNailOnTheHead #[test] fn correct_hit_the_nail() { assert_suggestion_result( "Ahh, found it! You hit the nail in the head once again.", lint_group(), "Ahh, found it! You hit the nail on the head once again.", ); } #[test] fn correct_hits_the_nail() { assert_suggestion_result( "I'm not sure if this sentence hits the nail in the head", lint_group(), "I'm not sure if this sentence hits the nail on the head", ); } #[test] fn correct_hitting_the_nail() { assert_suggestion_result( "You are hitting the nail in the head of my issue with this game, too.", lint_group(), "You are hitting the nail on the head of my issue with this game, too.", ); } #[test] fn correct_hitted_the_nail() { assert_suggestion_result( "I mean, you just kinda hitted the nail in the head. You cannot do anything with this that you couldn't do in a Raspberry PI.", lint_group(), "I mean, you just kinda hitted the nail on the head. You cannot do anything with this that you couldn't do in a Raspberry PI.", ); } // HomeInOn #[test] fn correct_hone_in_on() { assert_suggestion_result( "This way you can use an object detector algorithm to hone in on subjects and tell sam to only focus in certain areas when looking to extend ...", lint_group(), "This way you can use an object detector algorithm to home in on subjects and tell sam to only focus in certain areas when looking to extend ...", ); } #[test] fn correct_honing_in_on() { assert_suggestion_result( "I think I understand the syntax limitation you're honing in on.", lint_group(), "I think I understand the syntax limitation you're homing in on.", ); } #[test] fn correct_hones_in_on() { assert_suggestion_result( "[FEATURE] Add a magnet that hones in on mobs", lint_group(), "[FEATURE] Add a magnet that homes in on mobs", ); } #[test] fn correct_honed_in_on() { assert_suggestion_result( "But it took me quite a bit of faffing about checking things out before I honed in on the session as the problem and tried to dump out the ...", lint_group(), "But it took me quite a bit of faffing about checking things out before I homed in on the session as the problem and tried to dump out the ...", ); } // InDetail // -in details- #[test] fn in_detail_atomic() { assert_suggestion_result("in details", lint_group(), "in detail"); } #[test] fn in_detail_real_world() { assert_suggestion_result( "c++ - who can tell me \"*this pointer\" in details?", lint_group(), "c++ - who can tell me \"*this pointer\" in detail?", ) } // -in more details- #[test] fn in_more_detail_atomic() { assert_suggestion_result("in more details", lint_group(), "in more detail"); } #[test] fn in_more_detail_real_world() { assert_suggestion_result( "Document the interface in more details · Issue #3 · owlbarn ...", lint_group(), "Document the interface in more detail · Issue #3 · owlbarn ...", ); } // InvestIn #[test] fn corrects_invest_into() { assert_suggestion_result( "which represents the amount of money they want to invest into a particular deal.", lint_group(), "which represents the amount of money they want to invest in a particular deal.", ); } #[test] fn corrects_investing_into() { assert_suggestion_result( "Taking dividends in cash (rather than automatically re-investing into the originating fund) can help alleviate the need for rebalancing.", lint_group(), "Taking dividends in cash (rather than automatically re-investing in the originating fund) can help alleviate the need for rebalancing.", ); } #[test] fn corrects_invested_into() { assert_suggestion_result( "it's all automatically invested into a collection of loans that match the criteria that ...", lint_group(), "it's all automatically invested in a collection of loans that match the criteria that ...", ); } #[test] fn corrects_invests_into() { assert_suggestion_result( "If a user invests into the protocol first using USDC but afterward changing to DAI, ...", lint_group(), "If a user invests in the protocol first using USDC but afterward changing to DAI, ...", ); } #[test] fn corrects_investment_into() { assert_suggestion_result( "A $10,000 investment into the fund made on February 28, 1997 would have grown to a value of $42,650 at the end of the 20-year period.", lint_group(), "A $10,000 investment in the fund made on February 28, 1997 would have grown to a value of $42,650 at the end of the 20-year period.", ); } // LayoutVerb #[test] fn corrects_layouted() { assert_suggestion_result( "only the views that neeed it will be measured and layouted when the superview changes", lint_group(), "only the views that neeed it will be measured and laid out when the superview changes", ); } #[test] fn corrects_layouting() { assert_suggestion_result( "An R package for layouting tables, using the S4 method", lint_group(), "An R package for laying out tables, using the S4 method", ); } // LitotesDirectPositive #[test] fn litotes_not_uncommon_atomic() { assert_suggestion_result("not uncommon", lint_group(), "common"); } #[test] fn litotes_not_uncommon_sentence() { assert_suggestion_result( "It is not uncommon to see outages during storms.", lint_group(), "It is common to see outages during storms.", ); } #[test] fn litotes_not_unlikely() { assert_suggestion_result( "This outcome is not unlikely given the data.", lint_group(), "This outcome is likely given the data.", ); } #[test] fn litotes_not_insignificant() { assert_suggestion_result( "That is not insignificant progress.", lint_group(), "That is significant progress.", ); } #[test] fn litotes_more_preferable() { assert_suggestion_result( "Is it more preferable to use process.env.variable or env.parsed.variable?", lint_group(), "Is it preferable to use process.env.variable or env.parsed.variable?", ); } // MakeDoWith #[test] fn corrects_make_due_with() { assert_suggestion_result( "For now, I can make due with a bash script I have", lint_group(), "For now, I can make do with a bash script I have", ); } #[test] fn corrects_made_due_with() { assert_suggestion_result( "I made due with using actions.push for now but will try to do a codepen soon", lint_group(), "I made do with using actions.push for now but will try to do a codepen soon", ); } #[test] fn corrects_makes_due_with() { assert_suggestion_result( "but the code makes due with what is available", lint_group(), "but the code makes do with what is available", ); } #[test] fn corrects_making_due_with() { assert_suggestion_result( "I've been making due with the testMultiple script I wrote above.", lint_group(), "I've been making do with the testMultiple script I wrote above.", ); } // MakeSense #[test] fn fix_make_senses() { assert_suggestion_result( "some symbols make senses only if you have a certain keyboard", lint_group(), "some symbols make sense only if you have a certain keyboard", ); } #[test] fn fix_made_senses() { assert_suggestion_result( "Usually on the examples of matlab central I have found all with positive magnitude and made senses to me.", lint_group(), "Usually on the examples of matlab central I have found all with positive magnitude and made sense to me.", ); } #[test] fn fix_makes_senses() { assert_suggestion_result( "If it makes senses I can open a PR.", lint_group(), "If it makes sense I can open a PR.", ); } #[test] fn fix_making_senses() { assert_suggestion_result( "I appreciate you mentioned the two use cases, which are making senses for both.", lint_group(), "I appreciate you mentioned the two use cases, which are making sense for both.", ); } // MootPoint // -point is mute- #[test] fn point_is_moot() { assert_suggestion_result("Your point is mute.", lint_group(), "Your point is moot."); } // OperatingSystem #[test] fn operative_system() { assert_suggestion_result( "COS is a operative system made with the COSMOS Kernel and written in C#, COS its literally the same than MS-DOS but written in C# and open-source.", lint_group(), "COS is a operating system made with the COSMOS Kernel and written in C#, COS its literally the same than MS-DOS but written in C# and open-source.", ); } #[test] fn operative_systems() { assert_suggestion_result( "My dotfiles for my operative systems and other configurations.", lint_group(), "My dotfiles for my operating systems and other configurations.", ); } // PassersBy #[test] fn correct_passerbys() { assert_suggestion_result( "For any passerbys, you may replace visibility: hidden/collapsed with: opacity: 0; pointer-events: none;.", lint_group(), "For any passersby, you may replace visibility: hidden/collapsed with: opacity: 0; pointer-events: none;.", ); } #[test] fn correct_passer_bys_hyphen() { assert_suggestion_result( "Is there any way for random willing passer-bys to help with this effort?", lint_group(), "Is there any way for random willing passers-by to help with this effort?", ); } // PeekBehindTheCurtain #[test] fn fix_peak() { assert_suggestion_result( "Offer a peak behind the curtain of what I look for when baselining a software installation.", lint_group(), "Offer a peek behind the curtain of what I look for when baselining a software installation.", ); } #[test] fn fix_peaked() { assert_suggestion_result( "I peaked behind the curtain of the new Autodraw tool and noticed some expected similarities to what I saw in Quickdraw.", lint_group(), "I peeked behind the curtain of the new Autodraw tool and noticed some expected similarities to what I saw in Quickdraw.", ); } #[test] fn fix_peaking() { assert_suggestion_result( "I can see how peaking behind the curtain got me to where I am today.", lint_group(), "I can see how peeking behind the curtain got me to where I am today.", ); } #[test] fn fix_peaks() { assert_suggestion_result( "The Daily Vlog Series that peaks behind the curtain of an Entrepreneur's day to day life in 2016 building a business.", lint_group(), "The Daily Vlog Series that peeks behind the curtain of an Entrepreneur's day to day life in 2016 building a business.", ); } // Piggyback // -none- // RedundantSuperlatives #[test] fn redundant_more_optimal() { assert_suggestion_result("Is this more optimal?", lint_group(), "Is this optimal?"); } #[test] fn redundant_most_ideal() { assert_suggestion_result( "This is the most ideal scenario.", lint_group(), "This is the ideal scenario.", ); } // ResponsibilityFor #[test] fn fix_take() { assert_suggestion_result( "Is anyone wanting to step up and take responsibility of this library, or should I put it in EOL and redirect to another tool? ", lint_group(), "Is anyone wanting to step up and take responsibility for this library, or should I put it in EOL and redirect to another tool? ", ); } #[test] fn fix_taken() { assert_suggestion_result( "if it had only taken responsibility of the manifest/info additions and extensionsID it would have made our life easier", lint_group(), "if it had only taken responsibility for the manifest/info additions and extensionsID it would have made our life easier", ); } #[test] fn fix_takes() { assert_suggestion_result( "If I have a message that i want to encode, who takes responsibility of pointers?", lint_group(), "If I have a message that i want to encode, who takes responsibility for pointers?", ); } #[test] fn fix_taking() { assert_suggestion_result( "This issue is about taking responsibility of the feature area auto indentation and start solving the bugs in the feature area.", lint_group(), "This issue is about taking responsibility for the feature area auto indentation and start solving the bugs in the feature area.", ); } #[test] fn fix_took() { assert_suggestion_result( "If the driver took responsibility of the locking, it could let these HTTP calls happen in parallel", lint_group(), "If the driver took responsibility for the locking, it could let these HTTP calls happen in parallel", ); } #[test] fn fix_assume() { assert_suggestion_result( "it's a relatively big chunk of behavior to assume responsibility of", lint_group(), "it's a relatively big chunk of behavior to assume responsibility for", ); } #[test] fn fix_assumed() { assert_suggestion_result( "and assumed responsibility of project managing the transition of Barclays", lint_group(), "and assumed responsibility for project managing the transition of Barclays", ); } #[test] fn fix_assumes() { assert_suggestion_result( "It means that the core development team assumes responsibility of the module", lint_group(), "It means that the core development team assumes responsibility for the module", ); } #[test] fn fix_assuming() { assert_suggestion_result( "The point of extract is essentially that you're assuming responsibility of maintenance for that version of the formula.", lint_group(), "The point of extract is essentially that you're assuming responsibility for maintenance for that version of the formula.", ); } #[test] fn fix_claim() { assert_suggestion_result( "so it doesn't need to claim responsibility of the reappearing containers lifecycle", lint_group(), "so it doesn't need to claim responsibility for the reappearing containers lifecycle", ); } #[test] fn fix_claimed() { assert_suggestion_result( "a group called The Impact Team had claimed responsibility of the data breach", lint_group(), "a group called The Impact Team had claimed responsibility for the data breach", ); } #[test] fn fix_claiming() { assert_suggestion_result( "I feel that there should be some other way of claiming responsibility of the promise's continuation.", lint_group(), "I feel that there should be some other way of claiming responsibility for the promise's continuation.", ); } #[test] fn fix_claims() { assert_suggestion_result( "yet the Lord claims responsibility of those boundaries", lint_group(), "yet the Lord claims responsibility for those boundaries", ); } // ScapeGoat #[test] fn fix_an_escape_goat() { assert_suggestion_result( "I see too many times the cable and ps thingy being used as an escape goat.", lint_group(), "I see too many times the cable and ps thingy being used as a scapegoat.", ); } #[test] fn fix_escape_goat() { assert_suggestion_result( "It helps shift the reason for the failure on to what the manager did not do (making them the escape goat when it fails).", lint_group(), "It helps shift the reason for the failure on to what the manager did not do (making them the scapegoat when it fails).", ); } #[test] fn fix_escape_goats() { assert_suggestion_result( "People might be using Americans as escape goats for this, but these mishearings are becoming as common as a bowl in a china shop!", lint_group(), "People might be using Americans as scapegoats for this, but these mishearings are becoming as common as a bowl in a china shop!", ); } // SeamToSeem //-seam to be- #[test] fn fix_seam_to_be() { assert_suggestion_result( "amdvlk is deprecated but my system still uses it as default and I can't seam to be able to change it.", lint_group(), "amdvlk is deprecated but my system still uses it as default and I can't seem to be able to change it.", ); } //-seams to be- fn fix_seams_to_be() { assert_suggestion_result( "Problem: Docker image is seriously broken and everything seams to be related to trivial things like creating directory or dumping key", lint_group(), "Problem: Docker image is seriously broken and everything seems to be related to trivial things like creating directory or dumping key", ); } //-I seam- #[test] fn fix_i_seam() { assert_suggestion_result( "so now whatever i seam to try it doesnt work", lint_group(), "so now whatever i seem to try it doesnt work", ); } //-we seam- #[test] fn fix_we_seam() { assert_suggestion_result( "using a 4G network we seam to get ICE messages mixing Ipv6 and Ipv4", lint_group(), "using a 4G network we seem to get ICE messages mixing Ipv6 and Ipv4", ); } //-we-all-seam- #[test] fn fix_we_all_seam() { assert_suggestion_result( "if it is your own nation then we all seam to get the update", lint_group(), "if it is your own nation then we all seem to get the update", ); } //-we-both-seam- #[test] // because we both seam to have enough for frivolous things fn fix_we_both_seam() { assert_suggestion_result( "because we both seam to have enough for frivolous things", lint_group(), "because we both seem to have enough for frivolous things", ); } //-you seam- #[test] fn fix_you_seam() { assert_suggestion_result( "Assigning you, since you seam to have already made the fix.", lint_group(), "Assigning you, since you seem to have already made the fix.", ); } //-you-all-seam #[test] fn fix_you_all_seam() { assert_suggestion_result( "That's a good advice which you all seam to agree upon.", lint_group(), "That's a good advice which you all seem to agree upon.", ); } //-you-both-seam #[test] fn fix_you_both_seam() { assert_suggestion_result( "since you both seam to like the game", lint_group(), "since you both seem to like the game", ); } //-he seams- #[test] fn fix_he_seams() { assert_suggestion_result( "tagging @PedroTroller as he seams to still be active on this project.", lint_group(), "tagging @PedroTroller as he seems to still be active on this project.", ); } //-she seams- #[test] fn fix_she_seams() { assert_suggestion_result( "Here is the exact timestamp where she seams to talk about exactly this -> video.", lint_group(), "Here is the exact timestamp where she seems to talk about exactly this -> video.", ); } //-it seams- #[test] fn fix_it_seams() { assert_suggestion_result( "It seams i cannot use $tries and $timeout properties on my queued listener class?", lint_group(), "It seems i cannot use $tries and $timeout properties on my queued listener class?", ); } //-they seam- #[test] fn fix_they_seam() { assert_suggestion_result( "Lets start with the \"not\" and \"and\" gates because they seam the easiest.", lint_group(), "Lets start with the \"not\" and \"and\" gates because they seem the easiest.", ); } //-they all seam- #[test] fn fix_they_all_seam() { assert_suggestion_result( "I have tried the sum, product, max and min functions and they all seam to work.", lint_group(), "I have tried the sum, product, max and min functions and they all seem to work.", ); } //-they-both-seam- #[test] fn fix_they_both_seam() { assert_suggestion_result( "It's probably cause they both seam to combine martial arts with animal instincts", lint_group(), "It's probably cause they both seem to combine martial arts with animal instincts", ); } //-everything seams- #[test] fn fix_everything_seams() { assert_suggestion_result( "Note that if you try to slider the slider first to the right and then to the left, everything seams alright.", lint_group(), "Note that if you try to slider the slider first to the right and then to the left, everything seems alright.", ); } //-everybody seams- #[test] fn fix_everybody_seams() { assert_suggestion_result( "I'm currently a little disappointed because everybody seams to care only about the Rails framework", lint_group(), "I'm currently a little disappointed because everybody seems to care only about the Rails framework", ); } //-everyone seams- #[test] fn fix_everyone_seams() { assert_suggestion_result( "everyone seams to use the editor now a days plus there is a tun of extensions available", lint_group(), "everyone seems to use the editor now a days plus there is a tun of extensions available", ); } // SubjunctiveWasToWere // -if only there was- #[test] fn if_only_there_was() { assert_suggestion_result( "if only there was an endpoint do to so", lint_group(), "if only there were an endpoint do to so", ); } // -if only I- #[test] fn if_only_i_was() { assert_suggestion_result( "Oh If only I was that clever !!", lint_group(), "Oh If only I were that clever !!", ); } // -if only he- #[test] fn if_only_he_was() { assert_suggestion_result( "If only he was kind enough to attempt to contact me in private first", lint_group(), "If only he were kind enough to attempt to contact me in private first", ); } // -if only she- #[test] fn if_only_she_was() { assert_suggestion_result( "If only she was right.", lint_group(), "If only she were right.", ); } // -it- #[test] fn if_only_it_was() { assert_suggestion_result( "if only it was accessible via USB connection - hint hint", lint_group(), "if only it were accessible via USB connection - hint hint", ); } // -I wish there was- #[test] fn i_wish_there_was() { assert_suggestion_result( "I wish there was a keyboard shortcut or something that was \"bring back the suggestion you just made in the last 3 seconds\".", lint_group(), "I wish there were a keyboard shortcut or something that was \"bring back the suggestion you just made in the last 3 seconds\".", ); } // -I wish I was- #[test] fn i_wish_i_was() { assert_suggestion_result( "I wish I was as smart as I think I am.", lint_group(), "I wish I were as smart as I think I am.", ); } // -I wish he was- #[test] fn i_wish_he_was() { assert_suggestion_result( "However I wish he was that smart about ARM chips present in the current mobile devices.", lint_group(), "However I wish he were that smart about ARM chips present in the current mobile devices.", ); } // -I wish she was- #[test] fn i_wish_she_was() { assert_suggestion_result( "I wish she was more accepting of her own interests.", lint_group(), "I wish she were more accepting of her own interests.", ); } // -I wish it was- #[test] fn i_wish_it_was() { assert_suggestion_result( "but I wish it was more friendly to existing ecosystems", lint_group(), "but I wish it were more friendly to existing ecosystems", ); } // WreakHavoc #[test] fn fix_wreck_havoc() { assert_suggestion_result( "Tables with a \".\" in the name wreck havoc with the system", lint_group(), "Tables with a \".\" in the name wreak havoc with the system", ); } #[test] fn fix_wrecked_havoc() { assert_suggestion_result( "It would have been some weird local configuration of LO that wrecked havoc.", lint_group(), "It would have been some weird local configuration of LO that wreaked havoc.", ); } #[test] fn fix_wrecking_havoc() { assert_suggestion_result( "Multi-line edit is wrecking havoc with indention", lint_group(), "Multi-line edit is wreaking havoc with indention", ); } #[test] fn fix_wrecks_havoc() { assert_suggestion_result( "Small POC using rust with ptrace that wrecks havoc on msync", lint_group(), "Small POC using rust with ptrace that wreaks havoc on msync", ); } // WroteToRote #[test] fn fix_by_wrote() { assert_suggestion_result( "Until one repeats and learns a fact by wrote it is the picture that sustains us.", lint_group(), "Until one repeats and learns a fact by rote it is the picture that sustains us.", ); } #[test] fn fix_by_wrote_hyphen() { assert_suggestion_result( "This specification may then be translated into a recursive-decent parser almost by-wrote.", lint_group(), "This specification may then be translated into a recursive-decent parser almost by-rote.", ); } #[test] fn fix_wrote_learning() { assert_suggestion_result( "I found that what turned me off math class was that teachers encouraged wrote learning instead of understanding.", lint_group(), "I found that what turned me off math class was that teachers encouraged rote learning instead of understanding.", ); } #[test] fn fix_wrote_memorisation() { assert_suggestion_result( "Not much of a wrote memorisation kind of guy, so I preferred to commit them to memory by framing them in the context of a paragraph.", lint_group(), "Not much of a rote memorisation kind of guy, so I preferred to commit them to memory by framing them in the context of a paragraph.", ); } #[test] fn fix_wrote_memorisation_hyphen() { assert_suggestion_result( "I find it helps me retain information much better and for longer compared to when I just blindly did wrote-memorisation.", lint_group(), "I find it helps me retain information much better and for longer compared to when I just blindly did rote-memorisation.", ); } #[test] fn fix_wrote_memorization() { assert_suggestion_result( "Outside websites are also no-go, exacerbating the need for wrote memorization.", lint_group(), "Outside websites are also no-go, exacerbating the need for rote memorization.", ); } #[test] fn fix_wrote_memorization_hyphen() { assert_suggestion_result( "The voicings was the biggest game-changer for me, coming from a wrote-memorization type classical piano background.", lint_group(), "The voicings was the biggest game-changer for me, coming from a rote-memorization type classical piano background.", ); } #[test] fn fix_wrote_memorizing() { assert_suggestion_result( "I have never been good at wrote memorizing abbreviations, initialisms, or acronyms.", lint_group(), "I have never been good at rote memorizing abbreviations, initialisms, or acronyms.", ); } // Many to many tests // AwaitFor #[test] fn correct_awaits_for() { assert_good_and_bad_suggestions( "Headless mode awaits for requested user feedback without showing any text for what that feedback should be", lint_group(), &[ "Headless mode awaits requested user feedback without showing any text for what that feedback should be", "Headless mode waits for requested user feedback without showing any text for what that feedback should be", ], &[], ); } #[test] fn correct_awaiting_for() { assert_good_and_bad_suggestions( "gpg import fails awaiting for prompt answer", lint_group(), &[ "gpg import fails waiting for prompt answer", "gpg import fails awaiting prompt answer", ], &[], ); } #[test] fn correct_await_for() { assert_good_and_bad_suggestions( "I still await for a college course on \"Followership 101\"", lint_group(), &[ "I still wait for a college course on \"Followership 101\"", "I still await a college course on \"Followership 101\"", ], &[], ); } #[test] fn correct_awaited_for() { assert_good_and_bad_suggestions( "I have long awaited for the rise of the Dagoat agenda, and it is glorious.", lint_group(), &[ "I have long awaited the rise of the Dagoat agenda, and it is glorious.", "I have long waited for the rise of the Dagoat agenda, and it is glorious.", ], &[], ); } // CommitmentTo #[test] fn singular_towards() { assert_suggestion_result( "the platform's focus on multimedia projects and VideoLAN's long history of commitment towards free and open multimedia", lint_group(), "the platform's focus on multimedia projects and VideoLAN's long history of commitment to free and open multimedia", ); } #[test] fn plural_towards() { assert_suggestion_result( "the signer may express multiple commitments towards the data objects", lint_group(), "the signer may express multiple commitments to the data objects", ); } #[test] fn singular_toward() { assert_suggestion_result( "This document outlines the current level of commitment toward Linux distributions and packaging formats.", lint_group(), "This document outlines the current level of commitment to Linux distributions and packaging formats.", ); } #[test] fn plural_toward() { assert_suggestion_result( "... and are expected to inform parties in updating their commitments toward the Paris Agreement", lint_group(), "... and are expected to inform parties in updating their commitments to the Paris Agreement", ); } // Copyright #[test] fn copywritten() { assert_suggestion_result( "Including digital copies of copywritten artwork with the project isn't advised.", lint_group(), "Including digital copies of copyrighted artwork with the project isn't advised.", ); } #[test] fn copywrites() { assert_suggestion_result( "Code is 99% copy/pasted from OpenSSH with an attempt to retain all copywrites", lint_group(), "Code is 99% copy/pasted from OpenSSH with an attempt to retain all copyrights", ); } #[test] fn copywrited() { assert_suggestion_result( "Proprietary copywrited code", lint_group(), "Proprietary copyrighted code", ); } #[test] fn copywrited_all_caps() { assert_suggestion_result( "URLS MAY CONTAIN COPYWRITED MATERIAL", lint_group(), "URLS MAY CONTAIN COPYRIGHTED MATERIAL", ); } #[test] fn copywrote() { assert_suggestion_result( "How do you find out if someone copywrote a movie", lint_group(), "How do you find out if someone copyrighted a movie", ); } // DoubleEdgedSword #[test] fn correct_double_edge_hyphen() { assert_suggestion_result( "I thought the global defaultTranslationValues was potentially a double-edge sword as it also obfuscates the full set of values", lint_group(), "I thought the global defaultTranslationValues was potentially a double-edged sword as it also obfuscates the full set of values", ); } #[test] fn correct_double_edge_space() { assert_suggestion_result( "It becomes a double edge sword when it should not be used in cases like this.", lint_group(), "It becomes a double-edged sword when it should not be used in cases like this.", ); } #[test] fn correct_double_edge_space_plural() { assert_suggestion_result( "Wake locks are really double edge swords.", lint_group(), "Wake locks are really double-edged swords.", ); } #[test] fn correct_double_edged_space() { assert_suggestion_result( "Use case. currently OPTIMIZE is a double edged sword and potentially a very dangerous tool to use.", lint_group(), "Use case. currently OPTIMIZE is a double-edged sword and potentially a very dangerous tool to use.", ); } #[test] fn correct_double_edged_space_plural() { assert_suggestion_result( "Change: Ambushers and Crusaders now protect their targets too, making them double edged swords", lint_group(), "Change: Ambushers and Crusaders now protect their targets too, making them double-edged swords", ); } // ExpandAlloc #[test] fn corrects_allocs() { assert_suggestion_result( "cmd/compile: avoid allocs by better tracking of literals for interface conversions and make", lint_group(), "cmd/compile: avoid allocations by better tracking of literals for interface conversions and make", ); } #[test] fn expand_alloc() { assert_suggestion_result( "Used to find system libraries that alloc RWX regions on load.", lint_group(), "Used to find system libraries that allocate RWX regions on load.", ); } // Expat #[test] fn correct_ex_pat_hyphen() { assert_suggestion_result( "It seems ex-pat means the person will be in a foreign country temporarily", lint_group(), "It seems expat means the person will be in a foreign country temporarily", ); } #[test] fn correct_ex_pats_hyphen() { assert_suggestion_result( "So, it might be correct to call most Brits ex-pats.", lint_group(), "So, it might be correct to call most Brits expats.", ); } #[test] fn correct_ex_pat_space() { assert_suggestion_result( "For me, the term ex pat embodies the exquisite hypocrisy of certain people feeling entitled", lint_group(), "For me, the term expat embodies the exquisite hypocrisy of certain people feeling entitled", ); } #[test] #[ignore = "replace_with_match_case results in ExPats"] fn correct_ex_pats_space() { assert_suggestion_result( "Why are Brits who emigrate \"Ex Pats\" but people who come here \"immigrants\"?", lint_group(), "Why are Brits who emigrate \"Expats\" but people who come here \"immigrants\"?", ); } // Expatriate #[test] fn correct_expatriot() { assert_suggestion_result( "Another expatriot of the era, James Joyce, also followed Papa's writing and drinking schedule.", lint_group(), "Another expatriate of the era, James Joyce, also followed Papa's writing and drinking schedule.", ); } #[test] fn correct_expatriots() { assert_suggestion_result( "Expatriots, upon discovering the delightful nuances of Dutch pronunciation, often find themselves in stitches.", lint_group(), "Expatriates, upon discovering the delightful nuances of Dutch pronunciation, often find themselves in stitches.", ); } #[test] fn correct_ex_patriot_hyphen() { assert_suggestion_result( "Then I added we should all be using the word 移民 immigrant, not ex-patriot, not 外国人 gaikokujin, and definitely not 外人 gaijin", lint_group(), "Then I added we should all be using the word 移民 immigrant, not expatriate, not 外国人 gaikokujin, and definitely not 外人 gaijin", ); } #[test] fn correct_ex_patriots_hyphen() { assert_suggestion_result( "Ex-patriots who move to Hong Kong to seek greener pastures and to experience a new culture seem to bring their own cultural baggage with them.", lint_group(), "Expatriates who move to Hong Kong to seek greener pastures and to experience a new culture seem to bring their own cultural baggage with them.", ); } // GetRidOf #[test] fn get_rid_off() { assert_suggestion_result( "Please bump axios version to get rid off npm warning #624", lint_group(), "Please bump axios version to get rid of npm warning #624", ); } #[test] fn gets_rid_off() { assert_suggestion_result( "Adding at as a runtime dependency gets rid off that error", lint_group(), "Adding at as a runtime dependency gets rid of that error", ); } #[test] fn getting_rid_off() { assert_suggestion_result( "getting rid off of all the complexity of the different accesses method of API service providers", lint_group(), "getting rid of of all the complexity of the different accesses method of API service providers", ); } #[test] fn got_rid_off() { assert_suggestion_result( "For now we got rid off circular deps in model tree structure and it's API.", lint_group(), "For now we got rid of circular dependencies in model tree structure and it's API.", ); } #[test] fn gotten_rid_off() { assert_suggestion_result( "The baX variable thingy I have gotten rid off, that was due to a bad character in the encryption key.", lint_group(), "The baX variable thingy I have gotten rid of, that was due to a bad character in the encryption key.", ); } #[test] fn get_ride_of() { assert_suggestion_result( "Get ride of \"WARNING Deprecated: markdown_github. Use gfm\"", lint_group(), "Get rid of \"WARNING Deprecated: markdown_github. Use gfm\"", ); } #[test] fn get_ride_off() { assert_suggestion_result( "This exact hack was what I trying to get ride off. ", lint_group(), "This exact hack was what I trying to get rid of. ", ); } #[test] fn getting_ride_of() { assert_suggestion_result( "If you have any idea how to fix this without getting ride of bootstrap I would be thankfull.", lint_group(), "If you have any idea how to fix this without getting rid of bootstrap I would be thankfull.", ); } #[test] fn gets_ride_of() { assert_suggestion_result( ".. gets ride of a central back-end/server and eliminates all the risks associated to it.", lint_group(), ".. gets rid of a central back-end/server and eliminates all the risks associated to it.", ); } #[test] fn gotten_ride_of() { assert_suggestion_result( "I have gotten ride of the react-table and everything works just fine.", lint_group(), "I have gotten rid of the react-table and everything works just fine.", ); } #[test] fn got_ride_of() { assert_suggestion_result( "I had to adjust the labels on the free version because you guys got ride of ...", lint_group(), "I had to adjust the labels on the free version because you guys got rid of ...", ); } // HolyWar #[test] #[ignore = "Known failure due to replace_with_match_case working by character index"] fn correct_holy_war() { assert_suggestion_result( "I know it is Holly War about idempotent in HTTP and DELETE", lint_group(), "I know it is Holy War about idempotent in HTTP and DELETE", ); } #[test] fn correct_holly_wars() { assert_suggestion_result( "Anyway I'm not starting some holly wars about this point.", lint_group(), "Anyway I'm not starting some holy wars about this point.", ); } // HowItLooksLike #[test] fn correct_how_it_looks_like_1() { assert_suggestion_result( "And here is how it looks like: As you can see, there is no real difference in the diagram itself.", lint_group(), "And here is how it looks: As you can see, there is no real difference in the diagram itself.", ); } #[test] fn correct_how_it_looks_like_2() { assert_suggestion_result( "This is how it looks like when run from Windows PowerShell or Cmd: image.", lint_group(), "This is what it looks like when run from Windows PowerShell or Cmd: image.", ); } #[test] fn correct_how_they_look_like_1() { assert_suggestion_result( "This is a sample project illustrating a demo of how to use the new Material 3 components and how they look like.", lint_group(), "This is a sample project illustrating a demo of how to use the new Material 3 components and how they look.", ); } #[test] fn correct_how_they_look_like_2() { assert_suggestion_result( "So for now I'll just leave this issue here of how they look like in the XLSX", lint_group(), "So for now I'll just leave this issue here of what they look like in the XLSX", ); } #[test] fn correct_how_they_looks_like_1() { assert_suggestion_result( "Here I demonstrate how disney works and how they looks like Don't miss to give me a star.", lint_group(), "Here I demonstrate how disney works and how they look Don't miss to give me a star.", ); } #[test] fn correct_how_they_looks_like_2() { assert_suggestion_result( "You can check how they looks like on Android app by this command:", lint_group(), "You can check what they look like on Android app by this command:", ); } #[test] fn correct_how_she_looks_like_1() { assert_suggestion_result( "You all know how she looks like.", lint_group(), "You all know how she looks.", ); } #[test] fn correct_how_he_looks_like_2() { assert_suggestion_result( "Here's how he looks like, when he's supposed to just look like his old fatui design.", lint_group(), "Here's what he looks like, when he's supposed to just look like his old fatui design.", ); } #[test] fn correct_how_it_look_like_1() { assert_suggestion_result( "And I don't mind how it look like, language code subpath or the last subpath as below.", lint_group(), "And I don't mind how it looks, language code subpath or the last subpath as below.", ); } #[test] fn correct_how_it_look_like_2() { assert_suggestion_result( "Here is how it look like in your browser:", lint_group(), "Here is what it looks like in your browser:", ); } #[test] fn correct_how_it_looks_like_with_apostrophe() { assert_suggestion_result( "In the picture we can see how It look's like on worker desktop.", lint_group(), "In the picture we can see how It looks on worker desktop.", ); } // MakeItSeem #[test] fn corrects_make_it_seems() { assert_suggestion_result( "but put it into unlisted list may make it seems like listed for GitHub", lint_group(), "but put it into unlisted list may make it seem like listed for GitHub", ); } #[test] fn corrects_made_it_seems() { assert_suggestion_result( "previous explanations made it seems like it would be n", lint_group(), "previous explanations made it seem like it would be n", ); } #[test] fn corrects_makes_it_seems() { assert_suggestion_result( "bundle gives an error that makes it seems like esbuild is trying to use lib/index.js from main", lint_group(), "bundle gives an error that makes it seem like esbuild is trying to use lib/index.js from main", ); } #[test] fn corrects_making_it_seems() { assert_suggestion_result( "Is it possible to teach the concept of assignment/reassignment at the very beginner stage instead of making it seems like constants?", lint_group(), "Is it possible to teach the concept of assignment/reassignment at the very beginner stage instead of making it seem like constants?", ); } #[test] fn corrects_made_it_seemed() { assert_suggestion_result( "The path made it seemed a bit \"internal\".", lint_group(), "The path made it seem a bit \"internal\".", ); } // NervousWreck #[test] #[ignore = "Harper matches case by letter index as 'How Not to Be a Complete NervoUs wreck in an Interview'"] fn correct_nerve_wreck_space_title_case() { assert_suggestion_result( "How Not to Be a Complete Nerve Wreck in an Interview", lint_group(), "How Not to Be a Complete Nervous Wreck in an Interview", ); } #[test] fn correct_nerve_wreck_space() { assert_suggestion_result( "The nerve wreck you are makes you seem anxious and agitated so your employer will believe the complaints.", lint_group(), "The nervous wreck you are makes you seem anxious and agitated so your employer will believe the complaints.", ); } #[test] fn correct_nerve_wreck_hyphen() { assert_suggestion_result( "the child receives little education and grows up to be a nerve-wreck", lint_group(), "the child receives little education and grows up to be a nervous wreck", ); } #[test] fn correct_nerve_wreck_hyphen_plural() { assert_suggestion_result( "This helps us not to become nerve wrecks while looking at the side mirrors", lint_group(), "This helps us not to become nervous wrecks while looking at the side mirrors", ); } #[test] #[ignore = "We can't detect when the altered form is used for an event rather than a person."] fn dont_correct_it_was_a_nerve_wreck() { assert_no_lints( "It was a nerve-wreck, but I was also excited to see what would happen next.", lint_group(), ); } #[test] #[ignore = "We can't detect when the altered form is used for an event rather than a person."] fn dont_correct_so_much_nerve_wreck() { assert_no_lints( "So much nerve wreck for such a simple game ...", lint_group(), ); } // NotOnly // -not only are- #[test] fn fix_no_only_are() { assert_suggestion_result( "No only are tests run on my pipeline but once successful, my app is deployed differently", lint_group(), "Not only are tests run on my pipeline but once successful, my app is deployed differently", ); } // -not only is- #[test] fn fix_no_only_is() { assert_suggestion_result( "No only is it simple, it's efficient!", lint_group(), "Not only is it simple, it's efficient!", ); } // -not only was- #[test] fn fix_no_only_was() { assert_suggestion_result( "No only was he happily creating shapes, but he was actively using distances and angles to do so.", lint_group(), "Not only was he happily creating shapes, but he was actively using distances and angles to do so.", ); } // -not only were- #[test] fn fix_no_only_were() { assert_suggestion_result( "No only were there UI inconsistencies, but Safari lags behind chrome with things like the Popover API", lint_group(), "Not only were there UI inconsistencies, but Safari lags behind chrome with things like the Popover API", ); } // RaiseTheQuestion // -raise the question- #[test] fn detect_rise_the_question() { assert_suggestion_result( "That would rise the question how to deal with syntax errors etc.", lint_group(), "That would raise the question how to deal with syntax errors etc.", ); } #[test] fn detect_arise_the_question() { assert_suggestion_result( "As e.g. UTC+1, might arise the question whether it includes summer and winter time", lint_group(), "As e.g. UTC+1, might raise the question whether it includes summer and winter time", ); } // -raises the question- #[test] fn detect_rises_the_question() { assert_suggestion_result( "However, this rises the question as to whether this test is conceptually sound.", lint_group(), "However, this raises the question as to whether this test is conceptually sound.", ); } #[test] fn detect_arises_the_question() { assert_suggestion_result( "And it arises the question, why?", lint_group(), "And it raises the question, why?", ); } // -raising the question- #[test] fn detect_rising_the_question() { assert_suggestion_result( "as soon as a infoHash query is performed, a Torrent file is retried, rising the question of:", lint_group(), "as soon as a infoHash query is performed, a Torrent file is retried, raising the question of:", ); } #[test] fn detect_arising_the_question() { assert_suggestion_result( "arising the question whether the requirement of wgpu::Features::DEPTH24PLUS_STENCIL8 is precise", lint_group(), "raising the question whether the requirement of wgpu::Features::DEPTH24PLUS_STENCIL8 is precise", ); } // -raised the question- #[test] fn detect_rose_the_question() { assert_suggestion_result( "Here is an example that rose the question at first: What works.", lint_group(), "Here is an example that raised the question at first: What works.", ); } #[test] fn detect_risen_the_question() { assert_suggestion_result( "That has risen the question in my mind if it is still possible to embed your own Flash player on Facebook today?", lint_group(), "That has raised the question in my mind if it is still possible to embed your own Flash player on Facebook today?", ); } #[test] fn detect_rised_the_question() { assert_suggestion_result( "I rised the question to Emax Support and they just came back to me inmediately with the below response.", lint_group(), "I raised the question to Emax Support and they just came back to me inmediately with the below response.", ); } #[test] #[ignore = "Not actually an error after when it's 'there arose'"] fn dont_fag_there_arose_the_question() { assert_suggestion_result( "Hello, while I have been using modals manager there arose the question related to customizing of modal header.", lint_group(), "Hello, while I have been using modals manager there arose the question related to customizing of modal header.", ); } #[test] fn detect_arised_the_question() { assert_suggestion_result( "and that fact arised the question in my mind, what does exactly is happening", lint_group(), "and that fact raised the question in my mind, what does exactly is happening", ); } #[test] fn detect_arose_the_question() { assert_suggestion_result( "This arose the question, could I store 32 digits on the stack?", lint_group(), "This raised the question, could I store 32 digits on the stack?", ); } #[test] fn detect_arisen_the_question() { assert_suggestion_result( "Some have arisen the question like how to use this wireless HD mini camera", lint_group(), "Some have raised the question like how to use this wireless HD mini camera", ); } // ToToo // -a bridge too far- #[test] fn fix_a_bridge_too_far() { assert_suggestion_result( "If Winforms can ever be conquered by the Mono developers may be a bridge to far.", lint_group(), "If Winforms can ever be conquered by the Mono developers may be a bridge too far.", ); } // -cake and eat it too- #[test] fn fix_cake_and_eat_it_too() { assert_suggestion_result( "The solution: wouldn't it be great if I could have my cake and eat it to?", lint_group(), "The solution: wouldn't it be great if I could have my cake and eat it too?", ); } // -go to far- #[test] fn fix_go_to_far() { assert_suggestion_result( "It's difficult to be sure when we go to far sometime when you don't exactly how the beast works in the background .", lint_group(), "It's difficult to be sure when we go too far sometime when you don't exactly how the beast works in the background .", ); } // -goes to far- #[test] fn fix_goes_to_far() { assert_suggestion_result( "Memory consumption and cpu consumption goes to far like 900% and more than this", lint_group(), "Memory consumption and cpu consumption goes too far like 900% and more than this", ); } // -going to far- #[test] fn fix_going_to_far() { assert_suggestion_result( "wsrun is going to far on this because debug 's devDependency shouldn't be considered in the cycle detection, should it?", lint_group(), "wsrun is going too far on this because debug 's devDependency shouldn't be considered in the cycle detection, should it?", ); } // -gone to far- #[test] fn fix_gone_to_far() { assert_suggestion_result( "I might have gone to far with opening issues for small things.", lint_group(), "I might have gone too far with opening issues for small things.", ); } // -went to far- #[test] fn fix_went_to_far() { assert_suggestion_result( "But I went to far compared to the initial request that seems talk about ...", lint_group(), "But I went too far compared to the initial request that seems talk about ...", ); } // -life's too short- #[test] fn fix_life_s_too_short() { assert_suggestion_result( "Life's to short for messing around with git add , writing commit message.", lint_group(), "Life's too short for messing around with git add , writing commit message.", ); } #[test] fn fix_lifes_to_short() { assert_suggestion_result( "I wouldn't go back after the 3rd interview lifes to short.", lint_group(), "I wouldn't go back after the 3rd interview life's too short.", ); } // -life is too short- #[test] fn fix_life_is_too_short() { assert_suggestion_result( "[Life is to short to use dated cli tools that suck]", lint_group(), "[Life is too short to use dated cli tools that suck]", ); } // -put too fine a point- #[test] fn fix_put_too_fine_a_point() { assert_suggestion_result( "Not to put to fine a point on it... that's not the kind of team I think we want to be.", lint_group(), "Not to put too fine a point on it... that's not the kind of team I think we want to be.", ); } // -speak too soon- #[test] fn fix_speak_too_soon() { assert_suggestion_result( "I don't want to speak to soon but I kept everything as I had before but included: http = httplib2.Http()", lint_group(), "I don't want to speak too soon but I kept everything as I had before but included: http = httplib2.Http()", ); } // -speaking too soon- #[test] fn fix_speaking_too_soon() { assert_suggestion_result( "EDIT: Thats what I get for speaking to soon...", lint_group(), "EDIT: Thats what I get for speaking too soon...", ); } // -spoke too soon- #[test] fn fix_spoke_too_soon() { assert_suggestion_result( "I spoke to soon. Ignore the previous post.", lint_group(), "I spoke too soon. Ignore the previous post.", ); } // -spoken too soon- #[test] fn fix_spoken_too_soon() { assert_suggestion_result( "EDIT: I might have spoken to soon...", lint_group(), "EDIT: I might have spoken too soon...", ); } // -think to much- #[test] fn fix_think_too_much() { assert_suggestion_result( "I don't think to much about it, but I don't think it's a big deal.", lint_group(), "I don't think too much about it, but I don't think it's a big deal.", ); } // -too big for- #[test] fn fix_too_big_for() { assert_suggestion_result( "ng-relations form to big for small screens", lint_group(), "ng-relations form too big for small screens", ); } // -too big to fail- #[test] fn fix_too_big_to_fail() { assert_suggestion_result( "The core alone has 50k LOC. Reminds me of \"to big to fail\".", lint_group(), "The core alone has 50k LOC. Reminds me of \"too big to fail\".", ); } // -too good to be true- #[test] fn fix_too_good_to_be_true() { assert_suggestion_result( "This seemed to good to be true, but local to scene resources will not work when they are not contained in a node.", lint_group(), "This seemed too good to be true, but local to scene resources will not work when they are not contained in a node.", ); } #[test] fn fix_too_good_too_be_true() { assert_suggestion_result( "The normalization of rewards is making the plot in tensorboard look too good too be true, because they are not the actual reward ...", lint_group(), "The normalization of rewards is making the plot in tensorboard look too good to be true, because they are not the actual reward ...", ); } // -too much information- #[test] fn fix_too_much_information() { assert_suggestion_result( "Live test are printing way to much information and is polluting our test output", lint_group(), "Live test are printing way too much information and is polluting our test output", ); } // TooTo // -too big too fail- #[test] fn fix_too_big_too_fail() { assert_suggestion_result( "In other words, pointer arithmetic is, at this point, too big too fail, regardless of the clever and sophisticated way C++ lawyercats worded it.", lint_group(), "In other words, pointer arithmetic is, at this point, too big to fail, regardless of the clever and sophisticated way C++ lawyercats worded it.", ); } // WholeEntire #[test] fn detect_atomic_whole_entire() { assert_suggestion_result("whole entire", lint_group(), "whole"); } #[test] fn correct_real_world_whole_entire() { assert_suggestion_result( "[FR] support use system dns in whole entire app", lint_group(), "[FR] support use system dns in whole app", ); } // -a whole entire- #[test] fn correct_atomic_a_whole_entire_to_a_whole() { assert_suggestion_result("a whole entire", lint_group(), "a whole"); } #[test] fn correct_atomic_a_whole_entire_to_an_entire() { assert_suggestion_result("a whole entire", lint_group(), "an entire"); } #[test] fn correct_real_world_a_whole_entire_to_a_whole() { assert_suggestion_result( "Start mapping a whole entire new planet using NASA’s MOLA.", lint_group(), "Start mapping a whole new planet using NASA’s MOLA.", ); } #[test] fn correct_real_world_a_whole_entire_to_an_entire() { assert_suggestion_result( "I am not sure I can pass in a whole entire query via the include.", lint_group(), "I am not sure I can pass in an entire query via the include.", ); } // WorseOrWorst // -a lot worst- #[test] fn detect_a_lot_worse_atomic() { assert_suggestion_result("a lot worst", lint_group(), "a lot worse"); } #[test] fn detect_a_lot_worse_real_world() { assert_suggestion_result( "On a debug build, it's even a lot worst.", lint_group(), "On a debug build, it's even a lot worse.", ); } // -become worst- #[test] fn fix_became_worst() { assert_suggestion_result( "The problem became worst lately.", lint_group(), "The problem became worse lately.", ); } #[test] fn fix_become_worst() { assert_suggestion_result( "But results seems stay at one place or become worst.", lint_group(), "But results seems stay at one place or become worse.", ); } #[test] fn fix_becomes_worst() { assert_suggestion_result( "This becomes worst if you have an x64 dll and an x86 dll that you don't have thier source codes and want to use them in same project!", lint_group(), "This becomes worse if you have an x64 dll and an x86 dll that you don't have thier source codes and want to use them in same project!", ); } #[test] fn fix_becoming_worst() { assert_suggestion_result( "France is becoming worst than the Five Eyes", lint_group(), "France is becoming worse than the Five Eyes", ); } // -far worse- #[test] fn detect_far_worse_atomic() { assert_suggestion_result("far worst", lint_group(), "far worse"); } #[test] fn detect_far_worse_real_world() { assert_suggestion_result( "I mainly use Firefox (personal preference) and have noticed it has far worst performance than Chrome", lint_group(), "I mainly use Firefox (personal preference) and have noticed it has far worse performance than Chrome", ); } // -get worst- #[test] fn fix_get_worse() { assert_suggestion_result( "and the problem appears to get worst with 2025.5.1 and 2025.5.2.", lint_group(), "and the problem appears to get worse with 2025.5.1 and 2025.5.2.", ); } #[test] fn fix_gets_worse() { assert_suggestion_result( "It just starts after about 15 minutes of work and gradually gets worst.", lint_group(), "It just starts after about 15 minutes of work and gradually gets worse.", ); } #[test] #[ignore = "This kind of false positive is probably too subtle to detect"] fn dont_flag_getting_worst() { // Here "getting" probably belongs to "I am getting" rather than "getting worst". // Which would not be an error but "I am getting the worst accuracy" would be better. // TODO: Maybe a noun following "getting" is enough context? assert_lint_count( "I am getting worst accuracy on the same dataste and 3 different models.", lint_group(), 0, ); } #[test] fn fix_getting_worst() { assert_suggestion_result( "But, as I said, it is getting worst...", lint_group(), "But, as I said, it is getting worse...", ); } #[test] fn fix_got_worst() { assert_suggestion_result( "typescript support got worst.", lint_group(), "typescript support got worse.", ); } #[test] fn fix_gotten_worst() { assert_suggestion_result( "Has Claude gotten worst?", lint_group(), "Has Claude gotten worse?", ); } // -much worse- #[test] fn detect_much_worse_atomic() { assert_suggestion_result("much worst", lint_group(), "much worse"); } #[test] fn detect_much_worse_real_world() { assert_suggestion_result( "the generated image quality is much worst (actually nearly broken)", lint_group(), "the generated image quality is much worse (actually nearly broken)", ); } // -turn for the worse- #[test] fn detect_turn_for_the_worse_atomic() { assert_suggestion_result("turn for the worst", lint_group(), "turn for the worse"); } #[test] fn detect_turn_for_the_worse_real_world() { assert_suggestion_result( "Very surprised to see this repo take such a turn for the worst.", lint_group(), "Very surprised to see this repo take such a turn for the worse.", ); } // -worse than- #[test] fn detect_worse_than_atomic() { assert_suggestion_result("worst than", lint_group(), "worse than"); } #[test] fn detect_worse_than_real_world() { assert_suggestion_result( "Project real image - inversion quality is worst than in StyleGAN2", lint_group(), "Project real image - inversion quality is worse than in StyleGAN2", ); } // -worst ever- #[test] fn detect_worst_ever_atomic() { assert_suggestion_result("worse ever", lint_group(), "worst ever"); } #[test] fn detect_worst_ever_real_world() { assert_suggestion_result( "The Bcl package family is one of the worse ever published by Microsoft.", lint_group(), "The Bcl package family is one of the worst ever published by Microsoft.", ); } // -worse and worse- #[test] fn detect_worst_and_worst_atomic() { assert_suggestion_result("worst and worst", lint_group(), "worse and worse"); } #[test] fn detect_worst_and_worst_real_world() { assert_suggestion_result( "This control-L trick does not work for me. The padding is getting worst and worst.", lint_group(), "This control-L trick does not work for me. The padding is getting worse and worse.", ); } #[test] fn detect_worse_and_worst_real_world() { assert_suggestion_result( "This progressively got worse and worst to the point that the machine (LEAD 1010) stopped moving alltogether.", lint_group(), "This progressively got worse and worse to the point that the machine (LEAD 1010) stopped moving alltogether.", ); } // -at worst- #[test] fn detect_at_worst_atomic() { assert_suggestion_result( "Partial moving of core objects to interpreter state is incorrect at best, unsafe at worse.", lint_group(), "Partial moving of core objects to interpreter state is incorrect at best, unsafe at worst.", ); } // -worst case scenario- #[test] fn correct_worse_case_space() { assert_suggestion_result( "In the worse case scenario, remote code execution could be achieved.", lint_group(), "In the worst-case scenario, remote code execution could be achieved.", ); } #[test] fn correct_worse_case_hyphen() { assert_suggestion_result( "Basically I want my pods to get the original client IP address... or at least have X-Forwarded-For header, in a worse-case scenario.", lint_group(), "Basically I want my pods to get the original client IP address... or at least have X-Forwarded-For header, in a worst-case scenario.", ); } #[test] fn correct_worse_case_two_hyphens() { assert_suggestion_result( "In a worse-case-scenario, the scenario class code and the results being analysed, become out of sync, and so the wrong labels are applied.", lint_group(), "In a worst-case scenario, the scenario class code and the results being analysed, become out of sync, and so the wrong labels are applied.", ); } // -make it worst- #[test] fn detect_make_it_worst_atomic() { assert_suggestion_result( "And if you try to access before that, CloudFront will cache the error and it'll make it worst.", lint_group(), "And if you try to access before that, CloudFront will cache the error and it'll make it worse.", ); } // -made it worst- #[test] fn detect_made_it_worst_atomic() { assert_suggestion_result( "However in couple of occasions the refresh made it worst and it showed commit differences that were already commited and pushed to origin.", lint_group(), "However in couple of occasions the refresh made it worse and it showed commit differences that were already commited and pushed to origin.", ); } // -makes it worst- #[test] fn detect_makes_it_worst_atomic() { assert_suggestion_result( "What makes it worst, is if I use the returned SHA to try and update the newly created file I get the same error I show below.", lint_group(), "What makes it worse, is if I use the returned SHA to try and update the newly created file I get the same error I show below.", ); } // -making it worst- #[test] fn detect_making_it_worst_atomic() { assert_suggestion_result( "PLease ai realled need help with this I think I'm making it worst.", lint_group(), "PLease ai realled need help with this I think I'm making it worse.", ); } // -make them worst- #[test] fn detect_make_them_worst_atomic() { assert_suggestion_result( "Not sure if this makes things clearer or make them worst.", lint_group(), "Not sure if this makes things clearer or make them worse.", ); } // -made them worst- #[test] fn detect_made_them_worst_atomic() { assert_suggestion_result( "if not outroght caused them / made them worst", lint_group(), "if not outroght caused them / made them worse", ); } // -makes them worst- #[test] fn detect_makes_them_worst_atomic() { assert_suggestion_result( "(tried ~14 different hyperparameter and data format combos), however, always just makes them worst, they go from \"slightly\" wrong to \"complete nonsense\".", lint_group(), "(tried ~14 different hyperparameter and data format combos), however, always just makes them worse, they go from \"slightly\" wrong to \"complete nonsense\".", ); } #[test] #[ignore = "This false positive is not handled yet"] fn dont_flag_makes_them_worst_case() { assert_lint_count( "Note 1: all hash tables has an Achilles heel that makes them worst case O(N)", lint_group(), 0, ); } // -making them worst- #[test] fn detect_making_them_worst_atomic() { assert_suggestion_result( "As for the last part about Apple deliberately making them worst in order for us to buy the 3s", lint_group(), "As for the last part about Apple deliberately making them worse in order for us to buy the 3s", ); } ================================================ FILE: harper-core/src/linting/pique_interest.rs ================================================ use crate::TokenKind; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{CharString, CharStringExt, Token, char_string::char_string}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct PiqueInterest { expr: SequenceExpr, } impl Default for PiqueInterest { fn default() -> Self { let pattern = SequenceExpr::word_set(&["peak", "peaked", "peek", "peeked", "peeking", "peaking"]) .then_whitespace() .then_kind_either( TokenKind::is_non_plural_nominal, TokenKind::is_possessive_determiner, ) .then_whitespace() .t_aco("interest"); Self { expr: pattern } } } impl PiqueInterest { fn to_correct(word: &str) -> Option { Some(match word.to_lowercase().as_str() { "peak" => char_string!("pique"), "peek" => char_string!("pique"), "peeked" => char_string!("piqued"), "peaked" => char_string!("piqued"), "peaking" => char_string!("piquing"), "peeking" => char_string!("piquing"), _ => return None, }) } } impl ExprLinter for PiqueInterest { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens[0].span; let word = span.get_content_string(source).to_lowercase(); let correct = Self::to_correct(&word)?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( correct.to_vec(), matched_tokens[0].span.get_content(source), )], message: format!( "Did you mean `{}` instead of `{}`?", correct.to_string(), word, ), priority: 31, }) } fn description(&self) -> &'static str { "Detects incorrect usage of `peak` or `peek` when the intended word is `pique`, as in the phrase `you've peaked my interest`." } } #[cfg(test)] mod tests { use super::PiqueInterest; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_peak_interest() { assert_suggestion_result( "The story managed to peak his interest.", PiqueInterest::default(), "The story managed to pique his interest.", ); } #[test] fn corrects_peeked_interest_at_start() { assert_suggestion_result( "Peeked his interest, did she?", PiqueInterest::default(), "Piqued his interest, did she?", ); } #[test] fn corrects_peak_interest_in_middle() { assert_suggestion_result( "She tried to peak his interest during the lecture.", PiqueInterest::default(), "She tried to pique his interest during the lecture.", ); } #[test] fn corrects_peaked_interest_at_end() { assert_suggestion_result( "All along, she hoped she peaked his interest.", PiqueInterest::default(), "All along, she hoped she piqued his interest.", ); } #[test] fn does_not_correct_unrelated_peak() { assert_suggestion_result( "He reached the peak of the mountain.", PiqueInterest::default(), "He reached the peak of the mountain.", ); } #[test] fn corrects_peaking_interest() { assert_suggestion_result( "She was peaking his interest with her stories.", PiqueInterest::default(), "She was piquing his interest with her stories.", ); } #[test] fn corrects_peaked_my_interest() { assert_suggestion_result( "you've peaked my interest.", PiqueInterest::default(), "you've piqued my interest.", ); } } ================================================ FILE: harper-core/src/linting/plural_decades/four_digits.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenStringExt, linting::{LintKind, Suggestion}, }; pub fn match_to_lint_four_digits( toks: &[Token], src: &[char], decade: &[char], suffix: &[char], pre: Option<&[Token]>, post: Option<&[Token]>, ) -> Option { enum UsageJudgment { NotMistake, IsMistake, Unsure, } struct Context<'a> { sep_is_hyphen: bool, word: &'a [char], } let before = if pre.is_some_and(|b| b.len() >= 2) && let [.., pw, psep] = pre.unwrap() && (psep.kind.is_whitespace() || psep.kind.is_hyphen()) && pw.kind.is_word() { Some(Context { sep_is_hyphen: psep.kind.is_hyphen(), word: pw.span.get_content(src), }) } else { None }; let after = if post.is_some_and(|a| a.len() >= 2) && let [nsep, nw, ..] = post.unwrap() && (nsep.kind.is_whitespace() || nsep.kind.is_hyphen()) && nw.kind.is_word() { Some(Context { sep_is_hyphen: nsep.kind.is_hyphen(), word: nw.span.get_content(src), }) } else { None }; let judgment = match (&before, &after) { // Words before the decade which suggest the apostrophe is a mistake (Some(before), _) if before .word .eq_any_ignore_ascii_case_str(&["early", "mid", "late"]) => { UsageJudgment::IsMistake } // Hyphen before suggests username, not a mistake (Some(before), _) if before.sep_is_hyphen => UsageJudgment::NotMistake, // "style" after the decade suggests the apostrophe is a mistake (_, Some(after)) if after.word.eq_ignore_ascii_case_str("style") => { UsageJudgment::IsMistake } (Some(before), _) if !before.sep_is_hyphen && before.word.eq_ignore_ascii_case_str("the") => { // Go back one more word and look for "in the" before the decade if let [.., ppw, ppsep, _, _] = pre.unwrap() && ppsep.kind.is_whitespace() && ppw.kind.is_preposition() { UsageJudgment::IsMistake } else { UsageJudgment::Unsure } } _ => UsageJudgment::Unsure, }; if !matches!(judgment, UsageJudgment::IsMistake) { return None; } Some(Lint { span: toks.span()?, lint_kind: LintKind::Usage, message: "Plural decades do not use an apostrophe before the `s`".to_string(), suggestions: vec![Suggestion::ReplaceWith([decade, suffix].concat())], ..Default::default() }) } #[cfg(test)] mod lints { use super::super::PluralDecades; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; // Made-up examples #[test] fn eighties() { assert_lint_count("in the 1980's", PluralDecades::default(), 1); } #[test] #[ignore = "wip"] fn nineties() { assert_lint_count("the 1990’s were a bit grungy", PluralDecades::default(), 1); } #[test] fn dont_flag_three_digits() { assert_lint_count( "200's doesn't look like a decade", PluralDecades::default(), 0, ); } #[test] fn dont_flag_five_digits() { assert_lint_count( "20000's doesn't look like a decade", PluralDecades::default(), 0, ); } #[test] fn dont_flag_with_thousands_separator() { assert_lint_count( "Nobody says \"in the 1,950's\".", PluralDecades::default(), 0, ); } #[test] fn dont_flag_not_ending_with_0() { assert_lint_count("1977's best month was October", PluralDecades::default(), 0); } // Real-world examples using sentences found on GitHub // 1900s (2 examples) #[test] #[ignore = "Too ambiguous to lint?"] // 1900 is probably a username, but otherwise it looks like a decade with the common apostrophe error fn dont_flag_ambiguous_1900s_nppl() { assert_no_lints( "star and fork 1900's gists by creating an account on GitHub.", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_in_1900s_npsg() { assert_suggestion_result( "Children Aged 0-4 in 1900's Norway.", PluralDecades::default(), "Children Aged 0-4 in 1900s Norway.", ); } // 1910s (1 example) #[test] #[ignore = "Looks like a product name, not a decade"] fn ignore_hp_1910s() { assert_no_lints("Add support for HP 1910's", PluralDecades::default()); } // 1920s (3 examples) #[test] #[ignore = "wip"] fn fix_the_roaring_1920s() { assert_suggestion_result( "The \"Roaring 1920's\" wasn't just about the economy and technology.", PluralDecades::default(), "The \"Roaring 1920s\" wasn't just about the economy and technology.", ); } #[test] #[ignore = "wip"] fn fix_special_1920s_touch() { assert_suggestion_result( "It is beautiful and easily readable with that special 1920's touch.", PluralDecades::default(), "It is beautiful and easily readable with that special 1920s touch.", ); } #[test] fn fix_in_the_1920s() { assert_suggestion_result( "Sir Josiah Stamp, president of the Bank of England and the second richest man in Britain in the 1920's, speaking at the University of Texas in 1927.", PluralDecades::default(), "Sir Josiah Stamp, president of the Bank of England and the second richest man in Britain in the 1920s, speaking at the University of Texas in 1927.", ); } // 1950s (7 examples) #[test] #[ignore = "Grammar would be correct but the computer is from 1951 so must be a mistake for 1950s"] fn dont_flag_ambiguous_1950s_npsg() { assert_no_lints( "Simulator for 1950's MIT Whirlwind Computer.", PluralDecades::default(), ); } #[test] fn fix_in_the_1950s() { assert_suggestion_result( "Using the sandbox on the right, write and execute a query to return people born in the 1950's (1950 - 1959)", PluralDecades::default(), "Using the sandbox on the right, write and execute a query to return people born in the 1950s (1950 - 1959)", ); } #[test] #[ignore = "wip"] fn fix_a_adj_1950s_npsg() { assert_suggestion_result( "Wave digital filter based emulation of a famous 1950's tube stereo limiter.", PluralDecades::default(), "Wave digital filter based emulation of a famous 1950s tube stereo limiter.", ); } #[test] #[ignore = "wip"] fn fix_1950s_npsg() { assert_suggestion_result( "1950's elevator randomly gets stuck", PluralDecades::default(), "1950s elevator randomly gets stuck", ); } #[test] #[ignore = "wip"] fn fix_from_1950s_npsg() { assert_suggestion_result( "documenting my family's camera business, from 1950's England, run by my father", PluralDecades::default(), "documenting my family's camera business, from 1950s England, run by my father", ); } #[test] fn fix_from_1950() { assert_suggestion_result( "Plot the top ten most common baby names for New South Wales by year from the 1950's", PluralDecades::default(), "Plot the top ten most common baby names for New South Wales by year from the 1950s", ); } #[test] #[ignore = "wip"] fn fix_1950s_brick_built_house() { assert_suggestion_result( "We live in a 3 bedroom 1950's brick built house in the UK.", PluralDecades::default(), "We live in a 3 bedroom 1950s brick built house in the UK.", ); } // 1960s (4 examples) #[test] #[ignore = "wip"] fn fix_a_adj_1960s_npsg() { assert_suggestion_result( "Emulating a rare 1960's educational computer.", PluralDecades::default(), "Emulating a rare 1960s educational computer.", ); } #[test] #[ignore = "Ambiguous - could be referring to the specific year 1960 or the decade 1960s"] fn ignore_ambiguous_1960s_npsg() { assert_no_lints( "MyTheil - 1960's IP Sprint Hillarity.", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_1960s_npsg() { assert_suggestion_result( "Punchbag game inspired by 1960's TV Show Batman!", PluralDecades::default(), "Punchbag game inspired by 1960s TV Show Batman!", ); } #[test] #[ignore = "ambiguous, not sure what it means"] fn ignore_in_1960s_aperture() { assert_no_lints( "Several \"SP entrances\" in 1960's Aperture have visible nodraw around entrance door", PluralDecades::default(), ); } // 1970s (11 examples) #[test] #[ignore = "wip"] fn fix_1970s_npsg() { assert_suggestion_result( "1970's chess engine CHEKMO-II + UCI adapter.", PluralDecades::default(), "1970s chess engine CHEKMO-II + UCI adapter.", ); } #[test] #[ignore = "wip"] fn fix_vprog_1970s_nppl_dates() { assert_suggestion_result( "listsockets printing 1970's dates.", PluralDecades::default(), "listsockets printing 1970s dates.", ); } #[test] fn fix_in_a_1970s_style_npsg() { assert_suggestion_result( "I tried to create some catwalk in a 1970's style level.", PluralDecades::default(), "I tried to create some catwalk in a 1970s style level.", ); } #[test] #[ignore = "Grammar would be correct but Pong is from 1972 so must be a mistake for 1970s"] fn fix_1970s_pong_game() { assert_suggestion_result( "1970's Pong game rewritten in C++.", PluralDecades::default(), "1970s Pong game rewritten in C++.", ); } #[test] #[ignore = "wip"] fn fix_1970s_in_parens() { assert_suggestion_result( "Convert a MIDI file to a record compatible with vintage (1970's) Fisher Price music box record players", PluralDecades::default(), "Convert a MIDI file to a record compatible with vintage (1970s) Fisher Price music box record players", ); } #[test] fn fix_in_the_1970s() { assert_suggestion_result( "may have begun, depending on when you start counting, in the 1970's.", PluralDecades::default(), "may have begun, depending on when you start counting, in the 1970s.", ); } #[test] fn ignore_username_hyphen_1970s_gists() { assert_no_lints( "GitHub Gist: star and fork ricardo-reis-1970's gists by creating an account on GitHub.", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_after_1970s_nppl_minicomputers() { assert_suggestion_result( "I'm also working on extending it as my CPU is modelled after 1970's minicomputers", PluralDecades::default(), "I'm also working on extending it as my CPU is modelled after 1970s minicomputers", ); } #[test] fn fix_of_the_1970s() { assert_suggestion_result( "I despise both as outdated, hard to use relics of the 1970's.", PluralDecades::default(), "I despise both as outdated, hard to use relics of the 1970s.", ); } #[test] fn fix_couples_in_the_1970s() { assert_suggestion_result( "This visualization tracks a sample of couples in the 1970's to show how long they transition through relationship stages.", PluralDecades::default(), "This visualization tracks a sample of couples in the 1970s to show how long they transition through relationship stages.", ); } #[test] fn fix_developed_in_early_1970s() { assert_suggestion_result( "GPS, originally developed in the early 1970's, is a unidirectional (broadcast only) system", PluralDecades::default(), "GPS, originally developed in the early 1970s, is a unidirectional (broadcast only) system", ); } // 1980s (13 examples) #[test] fn fix_from_the_1980s_like() { assert_suggestion_result( "Old Stern tables from the 1980's like Flight 2000, Catacomb, etc. are playing audio samples twice, it seems.", PluralDecades::default(), "Old Stern tables from the 1980s like Flight 2000, Catacomb, etc. are playing audio samples twice, it seems.", ); } #[test] #[ignore = "wip"] fn fix_its_the_1980s() { assert_suggestion_result( "Declarative Rapid Application Development like it's the 1980's again.", PluralDecades::default(), "Declarative Rapid Application Development like it's the 1980s again.", ); } #[test] fn fix_from_the_1980s_end() { assert_suggestion_result( "Former countries from the 1980's", PluralDecades::default(), "Former countries from the 1980s", ); } #[test] #[ignore = "wip"] fn fix_a_1980s_npsg() { assert_suggestion_result( "A re-imiplementation of a classic 1980's DOS game, but in D.", PluralDecades::default(), "A re-imiplementation of a classic 1980s DOS game, but in D.", ); } #[test] fn fix_of_the_1980s() { assert_suggestion_result( "The Pugputer is a little labor of love, made as a tribute to the early home computers of the 1980's.", PluralDecades::default(), "The Pugputer is a little labor of love, made as a tribute to the early home computers of the 1980s.", ); } #[test] fn fix_of_the_1980s_npsg() { assert_suggestion_result( "FPGA implementation of the 1980's \"Music 5000\" wavetable synthesiser", PluralDecades::default(), "FPGA implementation of the 1980s \"Music 5000\" wavetable synthesiser", ); } #[test] fn fix_based_off_of_the_1980s_npsg() { assert_suggestion_result( "Space Fortress is based off of the 1980's vector-based arcade game by Cinematronics called Star Castle.", PluralDecades::default(), "Space Fortress is based off of the 1980s vector-based arcade game by Cinematronics called Star Castle.", ); } #[test] #[ignore = "Ambiguous - could be referring to the specific year 1980 or the decade 1980s"] fn ignore_ambiguous_1980s() { assert_no_lints( "1980's Old aperture coop checkpoint uses the timer signage instead of checkmarks.", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_1980s_nppl() { assert_suggestion_result( "A project resurrecting the classic 1980's Usborne Computer Guide books, for a new generation of programmers.", PluralDecades::default(), "A project resurrecting the classic 1980s Usborne Computer Guide books, for a new generation of programmers.", ); } #[test] #[ignore = "Missing determiner is out of the scope of the current version of this linter"] fn fix_the_end_of_missing_determiner_1980s() { assert_suggestion_result( "System software for TIM011, a school computer from the end of 1980's made in former Yugoslavia", PluralDecades::default(), "System software for TIM011, a school computer from the end of the 1980s made in former Yugoslavia", ); } #[test] fn fix_in_the_1980s_for() { assert_suggestion_result( "HMSL was originally released in the 1980's for Mac Plus and Amiga", PluralDecades::default(), "HMSL was originally released in the 1980s for Mac Plus and Amiga", ); } #[test] #[ignore = "wip"] fn fix_the_adj_1980s_npsg() { assert_suggestion_result( "Modern remake of Pole Position, the classic 1980's arcade racing game from Atari.", PluralDecades::default(), "Modern remake of Pole Position, the classic 1980s arcade racing game from Atari.", ); } #[test] fn fix_since_the_1980s() { assert_suggestion_result( "Since the 1980's the most common way to interact with a computer is via the graphical user interface (GUI)", PluralDecades::default(), "Since the 1980s the most common way to interact with a computer is via the graphical user interface (GUI)", ); } // 1990s (12 examples) #[test] #[ignore = "wip"] fn fix_the_adj_1990s_npsg() { assert_suggestion_result( "42 3d Graphics Project, recreating the classic 1990's game Wolfienstien 3d", PluralDecades::default(), "42 3d Graphics Project, recreating the classic 1990s game Wolfienstien 3d", ); } #[test] #[ignore = "wip"] fn fix_a_1990s_npsg() { assert_suggestion_result( "A 1990's Retro linux-rice for Hyprland or Sway, based on Quickshell.", PluralDecades::default(), "A 1990s Retro linux-rice for Hyprland or Sway, based on Quickshell.", ); } #[test] #[ignore = "Missing determiner is out of the scope of the current version of this linter"] fn lacks_determiner_stuck_in_1990s() { assert_suggestion_result( "Docs are stuck in 1990's - need AWS or Azure example", PluralDecades::default(), "Docs are stuck in the 1990s - need AWS or Azure example", ); } #[test] #[ignore = "wip"] fn fix_the_1990s_npsg() { assert_suggestion_result( "This program recreates the 1990's arcade game \"Boulder Dash.\"", PluralDecades::default(), "This program recreates the 1990s arcade game \"Boulder Dash.\"", ); } #[test] fn fix_in_the_1990s_comma() { assert_suggestion_result( "In the 1990's, Innovative Computer Solutions released multiple programs for the Newton MessagePad as shareware", PluralDecades::default(), "In the 1990s, Innovative Computer Solutions released multiple programs for the Newton MessagePad as shareware", ); } #[test] fn fix_a_mid_1990s_npsg() { assert_suggestion_result( "This repository is a modernization of a mid 1990's implementation of the ZMODEM protocol called 'zmtx-zmrx'.", PluralDecades::default(), "This repository is a modernization of a mid 1990s implementation of the ZMODEM protocol called 'zmtx-zmrx'.", ); } #[test] #[ignore = "Missing determiner is out of the scope of the current version of this linter"] fn lacks_determiner_written_in_java_in_1990s() { assert_suggestion_result( "JMud, mud server written in Java in 1990's.", PluralDecades::default(), "JMud, mud server written in Java in the 1990s.", ); } #[test] #[ignore = "wip"] fn fix_a_adj_1990s_npsg() { assert_suggestion_result( "Port of a famous 1990's fighting game to MSX2.", PluralDecades::default(), "Port of a famous 1990s fighting game to MSX2.", ); } #[test] #[ignore = "circa 1990s doesn't sound like natural English. changing to 'circa the 1990s' is out of scope for this linter"] fn fix_circa_1990s() { assert_suggestion_result( "Inspired by Digimon \"Digivices\" tamagotchis circa 1990's.", PluralDecades::default(), "Inspired by Digimon \"Digivices\" tamagotchis circa the 1990s.", ); } #[test] #[ignore = "wip"] fn fix_for_1990s_nppl() { assert_suggestion_result( "Daughter-board for reprogramming 1990's Toyota ECUs", PluralDecades::default(), "Daughter-board for reprogramming 1990s Toyota ECUs", ); } #[test] fn fix_the_1990s_classic_mario_hit() { assert_suggestion_result( "A remake of the 1990's classic mario hit.", PluralDecades::default(), "A remake of the 1990s classic mario hit.", ); } #[test] fn fix_developed_in_early_1990s() { assert_suggestion_result( "The code was originally developed in the early 1990's", PluralDecades::default(), "The code was originally developed in the early 1990s", ); } // 2000s (10 example) #[test] fn fix_2000s_style() { assert_suggestion_result( "2000's-style media library for vintage cellphones (Nokia, etc.)", PluralDecades::default(), "2000s-style media library for vintage cellphones (Nokia, etc.)", ); } #[test] fn ignore_fork_username_hyphen_2000s_nppl() { assert_no_lints( "star and fork vishal-2000's gists by creating an account on GitHub.", PluralDecades::default(), ); } #[test] fn fix_in_the_2000s() { assert_suggestion_result( "Simulator engine for reproducing LCD games made by McDonald's in the 2000's.", PluralDecades::default(), "Simulator engine for reproducing LCD games made by McDonald's in the 2000s.", ); } #[test] #[ignore = "Missing determiner is out of the scope of the current version of this linter"] fn fix_in_the_early_2000s_missing_determiner() { assert_suggestion_result( "Silo was originally released in early 2000's using LLNL-home-grown license verbiage.", PluralDecades::default(), "Silo was originally released in the early 2000s using LLNL-home-grown license verbiage.", ); } #[test] fn ignore_view_username_hyphen_2000s_npsg() { assert_no_lints( "View lxw-2000's full-sized avatar.", PluralDecades::default(), ); } #[test] fn fix_early_2000s_style_npsg() { assert_suggestion_result( "Early 2000's Style Personal Webpage.", PluralDecades::default(), "Early 2000s Style Personal Webpage.", ); } #[test] fn fix_from_the_mid_2000s() { assert_suggestion_result( "Modeled after the now-defunct Geosense game from the mid 2000's", PluralDecades::default(), "Modeled after the now-defunct Geosense game from the mid 2000s", ); } #[test] fn fix_for_the_early_2000s_games() { assert_suggestion_result( "GothicKit is a community-run organization hosting libraries and tools for the early 2000's games Gothic and Gothic II.", PluralDecades::default(), "GothicKit is a community-run organization hosting libraries and tools for the early 2000s games Gothic and Gothic II.", ); } #[test] fn fix_back_in_the_2000s() { assert_suggestion_result( "A basic music player/organizer I created back in the 2000's - carderne/CAMO.", PluralDecades::default(), "A basic music player/organizer I created back in the 2000s - carderne/CAMO.", ); } #[test] fn fix_mid_2000s() { assert_suggestion_result( "Things I wrote about RDF from the mid-2000's.", PluralDecades::default(), "Things I wrote about RDF from the mid-2000s.", ); } // 2010s (4 examples) #[test] #[ignore = "Sinnemäki 2010 here refers to the author's publication from 2010"] fn ignore_author_2010s_publication_reference() { assert_no_lints( "CLDF version of Sinnemäki 2010's dataset on zero marking and word order", PluralDecades::default(), ); } #[test] #[ignore = "Looks like a product name, not a decade"] fn ignore_bazel_calls_vs_2010s_cl() { assert_no_lints( "Bazel calls VS 2010's cl with /DEBUG:FASTLINK", PluralDecades::default(), ); } #[test] fn fix_since_the_early_2010s() { assert_suggestion_result( "the degree of drop-off of CouchDB online community activity since the early-2010's NoSQL craze faded", PluralDecades::default(), "the degree of drop-off of CouchDB online community activity since the early-2010s NoSQL craze faded", ); } #[test] fn fix_blog_posts_of_the_2010s() { assert_suggestion_result( "It's jumped off the esoteric analytics blog posts of the 2010's and on to your television screens and into your video games", PluralDecades::default(), "It's jumped off the esoteric analytics blog posts of the 2010s and on to your television screens and into your video games", ); } // 2020s (10 examples) #[test] #[ignore = "Ambiguous. Looks like awkward wording for `the IEEE CEC's 2020 Strategy Card Game AI Competition"] fn ignore_ambiguous_2020s() { assert_no_lints( "This is a bot for Legends of Code and Magic submitted to the IEEE CEC 2020's Strategy Card Game AI Competition.", PluralDecades::default(), ); } #[test] #[ignore = "Ambiguous. Maybe awkward wording for `CSSPI Fall 2020's frontend`??"] fn ignore_ambiguous_2020s_2() { assert_no_lints( "CSSPI Fall 2020's frontend mobile web application utilizing React Native.", PluralDecades::default(), ); } #[test] #[ignore = "A human can tell from the comparison to `2024's` that `2020's` refers to a specific year/version/release. Harper has no way to tell."] fn ignore_ambiguous_2020s_2024s() { assert_no_lints( "App that converts MSFS 2020's DDS texture format to MSFS 2024's KTX2 format", PluralDecades::default(), ); } #[test] #[ignore = "eRum 2020 is probably an event name, not a decade"] fn ignore_erum_2020s() { assert_no_lints( "A repository for purposes of eRum 2020's workshop \"Image processing and computer vision with R\", held on Saturday, June 20, 2020.", PluralDecades::default(), ); } #[test] #[ignore = "Ambiguous. Not sure what it means"] fn ignore_ambiguous_2020s_3() { assert_no_lints( "Crashing upon loading saved game in 2020's", PluralDecades::default(), ); } #[test] #[ignore = "DEF CON 2020's is probably an event name, not a decade"] fn ignore_defcon_2020s_event() { assert_no_lints( "Reimplementation of DEF CON 2020's Pinboool Binary - pinboool.py.", PluralDecades::default(), ); } #[test] fn ignore_username_hyphen_2020s_avatar() { assert_no_lints( "View theredpill-2020's full-sized avatar.", PluralDecades::default(), ); } #[test] #[ignore = "Ambiguous. Not sure what it means"] fn ignore_ambiguous_2020s_scipy() { assert_no_lints( "No imread() in 2020's Scipy v1.5.x.", PluralDecades::default(), ); } #[test] #[ignore = "ambiguous"] fn ignore_pull_into_2020s() { assert_no_lints("Pull into the 2020's.", PluralDecades::default()); } #[test] #[ignore = "Odd. Looks like it should be `Blasas et al's 2020 \"FUT9-driven ...\"`"] fn ignore_blasas_et_al_2020s() { assert_no_lints( "Scripts that were used to create figure 5 in Blasas et al. 2020's \"FUT9-driven programming of colon cancer cells towards a stem cell-like state\"", PluralDecades::default(), ); } // Multiple decades (11 examples) #[test] fn fix_in_the_1990s_and_the_2000s() { assert_suggestion_result( "NTXShape, a converter I developed in the 1990's and maintained through the 2000's", PluralDecades::default(), "NTXShape, a converter I developed in the 1990s and maintained through the 2000s", ); } #[test] fn fix_early_2000s_early_1990s_early_1980s() { assert_suggestion_result( "CDISC since 2005, XML since the early 2000's, @SAS since the early 1990's, Programming since the early 1980's.", PluralDecades::default(), "CDISC since 2005, XML since the early 2000s, @SAS since the early 1990s, Programming since the early 1980s.", ); } #[test] #[ignore = "wip"] fn fix_dates_in_the_1960s_comma_1950s_early_1900s() { assert_suggestion_result( "OK for dates in the 1960's, 1950's... Now... I expect 1939-12-31T23 ... Was Belgium ever not in UTC+1 timezone in early 1900's ?", PluralDecades::default(), "OK for dates in the 1960s, 1950s... Now... I expect 1939-12-31T23 ... Was Belgium ever not in UTC+1 timezone in early 1900s ?", ); } #[test] fn fix_late_1970s_early_1980s() { assert_suggestion_result( "Late 1970's/Early 1980's Text Adventure Game from the Mainframe era", PluralDecades::default(), "Late 1970s/Early 1980s Text Adventure Game from the Mainframe era", ); } #[test] fn fix_in_the_1970s_and_early_1980s() { assert_suggestion_result( "We modeled the gas mileage of 398 cars built in the 1970's and early 1980's", PluralDecades::default(), "We modeled the gas mileage of 398 cars built in the 1970s and early 1980s", ); } #[test] fn fix_from_the_late_1970s_early_1980s() { assert_suggestion_result( "Europe Card Bus (ECB) is a Retro CPU Bus standard from the late 1970's / early 1980's.", PluralDecades::default(), "Europe Card Bus (ECB) is a Retro CPU Bus standard from the late 1970s / early 1980s.", ); } #[test] #[ignore = "Unnatural English where 'on [decade]' should be 'in the [decade]'"] fn ignore_on_80s_on_90s_on_2000s_on_2010s_on_2020s() { assert_no_lints( "Developer on 80's, software engineer on 90's, tech lead on 2000's, manager from 2010's on and CIO/CDO/CTO on 2020's", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_in_the_80s_in_the_90s_2000s_2010s() { assert_suggestion_result( "UUCP BBS in the 80's Winternet / ABX Net Un Hacking in the 90's FOU 2000's CIS Inc. 2010's For Every Hacker there is an Equal and Opposite Hacker.", PluralDecades::default(), "UUCP BBS in the 80s Winternet / ABX Net Un Hacking in the 90s FOU 2000s CIS Inc. 2010s For Every Hacker there is an Equal and Opposite Hacker.", ); } #[test] #[ignore = "wip"] fn fix_in_the_1990s_and_2000s() { assert_suggestion_result( "Edelman and his colleagues in the 1990's and 2000's.", PluralDecades::default(), "Edelman and his colleagues in the 1990s and 2000s.", ); } #[test] #[ignore = "wip"] fn fix_1930s_ampersand_1940s() { assert_suggestion_result( "DJ and collector of quality tango music from the golden era (1930's & 1940's)", PluralDecades::default(), "DJ and collector of quality tango music from the golden era (1930s & 1940s)", ); } #[test] #[ignore = "wip"] fn fix_80s_90s_2000s_2020s() { assert_suggestion_result( "Nerdy coder-kid on ZX81 and Oric 1 in the 80's, nerdy teen-tech writer on PC in 90's, nerdy engineer in the 2000's, 2020's MongoDB addict, Databricks fan now!", PluralDecades::default(), "Nerdy coder-kid on ZX81 and Oric 1 in the 80s, nerdy teen-tech writer on PC in 90s, nerdy engineer in the 2000s, 2020s MongoDB addict, Databricks fan now!", ); } } ================================================ FILE: harper-core/src/linting/plural_decades/mod.rs ================================================ mod four_digits; mod two_digits; use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, expr_linter::Sentence}, }; use four_digits::match_to_lint_four_digits; use two_digits::match_to_lint_two_digits; pub struct PluralDecades { expr: SequenceExpr, } impl Default for PluralDecades { fn default() -> Self { Self { expr: SequenceExpr::default() .then_cardinal_number() .then_apostrophe() .t_aco("s"), } } } impl ExprLinter for PluralDecades { type Unit = Sentence; fn expr(&self) -> &dyn Expr { &self.expr } fn description(&self) -> &str { "Flags plural decades erroneously using an apostrophe before the `s`" } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { // eprintln!("📅 {}", crate::linting::debug::format_lint_match(toks, ctx, src)); if toks.len() != 3 { return None; } let (decade_chars, _s_chars) = (toks[0].span.get_content(src), toks[2].span.get_content(src)); // TODO does not yet support two-digit decades like 80's // if decade_chars.len() != 4 || !decade_chars.ends_with(&['0']) { if ![2, 4].contains(&decade_chars.len()) || !decade_chars.ends_with(&['0']) { return None; } let (decade_chars, s_chars) = (toks[0].span.get_content(src), toks[2].span.get_content(src)); let (before_context, after_context): (Option<&[Token]>, Option<&[Token]>) = match ctx { Some((pw, nw)) => { if pw.is_empty() { if nw.is_empty() { (None, None) } else { (None, Some(nw)) } } else if nw.is_empty() { (Some(pw), None) } else { (Some(pw), Some(nw)) } } None => (None, None), }; if decade_chars.len() == 4 { match_to_lint_four_digits( toks, src, decade_chars, s_chars, before_context, after_context, ) } else { match_to_lint_two_digits( toks, src, decade_chars, s_chars, before_context, after_context, ) } } } ================================================ FILE: harper-core/src/linting/plural_decades/two_digits.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenKind, TokenStringExt, linting::{LintKind, Suggestion}, }; #[derive(PartialEq)] enum UsageJudgment { NotMistake, IsMistakeForDecade, IsMistakeForAgeRange, Unsure, } // Simplified `TokenType` that works with pattern matching enum Tok<'a> { Whitespace, Hyphen, Plus, Word(&'a [char]), } pub fn match_to_lint_two_digits( toks: &[Token], src: &[char], decade: &[char], suffix: &[char], before: Option<&[Token]>, after: Option<&[Token]>, ) -> Option { let get_tok = |context: Option<&[Token]>, offset: isize| -> Option> { if let Some(toks) = context && let Some(tok) = toks.get_rel(offset) { if tok.kind.is_whitespace() { return Some(Tok::Whitespace); } else if tok.kind.is_hyphen() { return Some(Tok::Hyphen); } else if tok.kind.is_plus() { return Some(Tok::Plus); } else if tok.kind.is_word() { return Some(Tok::Word(tok.span.get_content(src))); } } None }; let get_kind = |context: Option<&[Token]>, offset: isize| -> Option { context .and_then(|toks| toks.get_rel(offset)) .map(|tok| tok.kind.clone()) }; let get_tok_with_kind = |context: Option<&[Token]>, offset: isize| -> Option<(Tok<'_>, TokenKind)> { let toks = context?; let tok = toks.get_rel(offset)?; Some(( if tok.kind.is_whitespace() { Tok::Whitespace } else if tok.kind.is_hyphen() { Tok::Hyphen } else if tok.kind.is_plus() { Tok::Plus } else if tok.kind.is_word() { Tok::Word(tok.span.get_content(src)) } else { return None; }, tok.kind.clone(), )) }; let judge = || { let tok1 = get_tok(before, -1); if let Some(tok1) = tok1 { // _20's / _80's if matches!(tok1, Tok::Whitespace) && let Some((tok2, kind2)) = get_tok_with_kind(before, -2) { // in the 80's if matches!(tok2, Tok::Word(w) if w.eq_ignore_ascii_case_str("the")) && get_kind(before, -3).is_some_and(|k| k.is_whitespace()) && get_kind(before, -4).is_some_and(|k| k.is_preposition()) { return UsageJudgment::IsMistakeForDecade; } // my 20's if kind2.is_possessive_determiner() { return UsageJudgment::IsMistakeForAgeRange; } // Windows 10's / Xcode 10's if decade.eq_ignore_ascii_case_str("10") && matches!(tok2, Tok::Word(w) if w.eq_any_ignore_ascii_case_str(&["windows", "xcode", "android"])) { return UsageJudgment::NotMistake; } } // early_20's / late-80's if matches!(tok1, Tok::Whitespace | Tok::Hyphen) && get_tok(before, -2).is_some_and(|t| matches!(t, Tok::Word(w) if w.eq_any_ignore_ascii_case_str(&["early", "mid", "late"]))) { // my early_20s if get_tok(before, -3).is_some_and(|t| matches!(t, Tok::Whitespace)) && get_kind(before, -4).is_some_and(|k| k.is_possessive_determiner()) { return UsageJudgment::IsMistakeForAgeRange; } // mid-90's return UsageJudgment::IsMistakeForDecade; } // +10's if matches!(tok1, Tok::Plus) && decade.eq_ignore_ascii_case_str("20") && get_tok(before, -2).is_some_and(|t| matches!(t, Tok::Plus)) && get_tok(before, -3) .is_some_and(|t| matches!(t, Tok::Word(w) if w.eq_ignore_ascii_case_str("c"))) { // C++10's return UsageJudgment::NotMistake; } } // 70's_style / 80's-style if get_tok(after, 0).is_some_and(|t| matches!(t, Tok::Whitespace | Tok::Hyphen)) && get_tok(after, 1) .is_some_and(|t| matches!(t, Tok::Word(w) if w.eq_ignore_ascii_case_str("style"))) { return UsageJudgment::IsMistakeForDecade; } UsageJudgment::Unsure }; let judgement = judge(); let with_apostrophe_before = [&['\''], decade, suffix].concat(); let without_apostrophe = &with_apostrophe_before[1..]; let mut suggestions = vec![]; if judgement == UsageJudgment::NotMistake { return None; } if judgement == UsageJudgment::IsMistakeForDecade { suggestions.push(Suggestion::ReplaceWith(with_apostrophe_before.to_vec())); } if judgement == UsageJudgment::IsMistakeForAgeRange { suggestions.push(Suggestion::ReplaceWith(without_apostrophe.to_vec())); } Some(Lint { span: toks.span()?, lint_kind: LintKind::Usage, suggestions, message: "To refer to a decade the apostrophe must be before the decade. To refer to an age range, use no apostrophe.".to_string(), ..Default::default() }) } #[cfg(test)] mod lints { use super::super::PluralDecades; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; // Made-up examples #[test] fn eighties() { assert_lint_count("in the 80's", PluralDecades::default(), 1); } #[test] #[ignore = "wip"] fn nineties() { assert_lint_count("the 90’s were a bit grungy", PluralDecades::default(), 1); } #[test] fn dont_flag_three_digits() { assert_no_lints("200's doesn't look like a decade", PluralDecades::default()); } #[test] fn dont_flag_one_digit() { assert_no_lints("0's doesn't look like a decade", PluralDecades::default()); } #[test] fn dont_flag_not_ending_with_0() { assert_no_lints("'77's best month was October", PluralDecades::default()); } // Real-world examples using sentences found on GitHub // 10s #[test] #[ignore = "wip"] fn dont_flag_dot_version_numbers() { assert_no_lints( "A bug is apparently in FOG 1.5.10's normalize() function inside init.xz.", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_showing_the_10s_of_hours() { assert_suggestion_result( "It took 10's of hours to debug this issue", PluralDecades::default(), "It took 10s of hours to debug this issue", ); } #[test] fn dont_flag_windows_10() { assert_no_lints( "How about Windows 10's taskbar progress bar?", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_space_version_numbers_resharper_10() { assert_no_lints( "\"gd\" doesn't work correctly with ReSharper 10's \"Usage-aware Go to Declaration\"", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_space_version_numbers_mermaid_10() { assert_no_lints( "mermaid 10's ESM only support breaks compat with many apps", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_npm_10s_npsg() { assert_no_lints( "Align npm packages to npm 10's node engine range", PluralDecades::default(), ); } #[test] fn dont_flag_xcode_10s_version_number() { assert_no_lints( "Leverage Xcode 10's new \"File list\" feature for input/output files of Run Script build phases", PluralDecades::default(), ); } #[test] #[ignore = "non-well-known products couldn't really be checked for though"] fn dont_flag_modo_10s_version_number() { assert_no_lints( "Modo 10's Unreal editor plugin (for loading PBR materials / textures)", PluralDecades::default(), ); } #[test] fn dont_flag_windows_10s_touch_keyboard() { assert_no_lints( "Arrow Key Command History Navigation Not Working Using Windows 10's Built-in 'Touch Keyboard'", PluralDecades::default(), ); } #[test] fn dont_flag_android_10s_scoped_storage() { assert_no_lints( "Android 10's Scoped storage using Image picker (Gallery / Camera) with compression example.", PluralDecades::default(), ); } #[test] fn dont_flag_windows_10s_openssh() { assert_no_lints( "If I try to set Windows 10's OpenSSH ssh-agent.exe as the pageant executable, I get an error message", PluralDecades::default(), ); } #[test] #[ignore = "release/version number?"] fn dont_flag_node10s_resolution_algorithm() { assert_no_lints( "node10 encoded Node.js 10's resolution algorithm, which predates ESM support", PluralDecades::default(), ); } #[test] fn dont_flag_xcode_10s_new_build_system() { assert_no_lints( "Fixes the third party dependency issues introduced by Xcode 10's new build system.", PluralDecades::default(), ); } #[test] fn dont_flag_windows_10s_controlled_folder_access() { assert_no_lints( "NVDA install fails when Windows 10's Controlled Folder Access is enabled", PluralDecades::default(), ); } #[test] fn dont_flag_windows_10s_wsl() { assert_no_lints( "By default Windows 10's WSL has trouble opening paths on mounted VeraCrypt volumes.", PluralDecades::default(), ); } // 20s #[test] fn dont_flag_cpp20s_std_span() { assert_no_lints( "This repository contains a single-header implementation of C++20's std::span, conforming to the C++20 committee draft.", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_space_version_numbers_virtualenv_20() { assert_no_lints( "Clarifying virtualenv 20's -p behavior", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_hyphenated_version_numbers_soi_20() { assert_no_lints("View soi-20's full-sized avatar.", PluralDecades::default()); } #[test] fn dont_flag_cpp20s_concepts() { assert_no_lints( "Replace SFINAE with C++20's Concepts and Constraints", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_cpp20s_std_latch() { assert_no_lints( "As part of an experiment I recently switched from ducc's latch class to C++20's std::latch, and to my surprise I noticed a significant speedup", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_team_20s_application() { assert_no_lints( "Team 20's application for the 2020 Teens In AI Global COVID Hackathon.", PluralDecades::default(), ); } #[test] #[ignore = "should we detect lesson numbers?"] fn dont_flag_lesson_20s_sql_query() { assert_no_lints( "Lesson 20's SQL Query is too inefficient", PluralDecades::default(), ); } #[test] fn dont_flag_cpp20s_initialization_change() { assert_no_lints( "Potential issue with C++20's initialization change.", PluralDecades::default(), ); } #[test] fn fix_my_20s() { assert_suggestion_result( "Just a software engineer in his 20's.", PluralDecades::default(), "Just a software engineer in his 20s.", ); } #[test] fn fix_my_early_20s() { assert_suggestion_result( "Thank you Steve Wozniak :-) it was the dream machine of my early 20's.", PluralDecades::default(), "Thank you Steve Wozniak :-) it was the dream machine of my early 20s.", ); } #[test] fn fix_my_late_20s() { assert_suggestion_result( "I only decided that I wanted to work in the field at my late 20's when I chose a graduation course", PluralDecades::default(), "I only decided that I wanted to work in the field at my late 20s when I chose a graduation course", ); } // 30s #[test] #[ignore = "wip"] fn dont_flag_sdk_versions() { assert_no_lints( "binder: We call SDK 30's bindServiceAsUser() and SDK 26's bindDeviceAdminServiceAsUser() methods without a runtime check", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn dont_flag_jxn_hyphen_30s_username() { assert_no_lints( "GitHub Gist: star and fork jxn-30's gists by creating an account on GitHub", PluralDecades::default(), ); } #[test] fn fix_my_30s() { assert_suggestion_result( "I'm a developer in my 30's.", PluralDecades::default(), "I'm a developer in my 30s.", ); } #[test] fn fix_my_mid_30s() { assert_suggestion_result( "Today, in my mid 30's, I am proficient in a wide range of programming languages and environments.", PluralDecades::default(), "Today, in my mid 30s, I am proficient in a wide range of programming languages and environments.", ); } #[test] fn fix_my_early_30s() { assert_suggestion_result( "Software Developer in my early 30's.", PluralDecades::default(), "Software Developer in my early 30s.", ); } // 40s #[test] #[ignore = "might be too ambiguous to detect?"] fn dont_flag_group_40s() { assert_no_lints("Group 40's team maths game.", PluralDecades::default()); } #[test] fn fix_my_40s() { assert_suggestion_result( "I'm a married father of two in my 40's who currently programs at work by day, and, well, at home by night.", PluralDecades::default(), "I'm a married father of two in my 40s who currently programs at work by day, and, well, at home by night.", ); } #[test] fn fix_their_40s() { assert_suggestion_result( "for a person in their 40's you're awfully bitter", PluralDecades::default(), "for a person in their 40s you're awfully bitter", ); } #[test] fn fix_my_mid_40s() { assert_suggestion_result( "I am a system developer in my mid 40's working in the health care sector at DNV Imatis AS.", PluralDecades::default(), "I am a system developer in my mid 40s working in the health care sector at DNV Imatis AS.", ); } #[test] fn fix_their_mid_40s() { assert_suggestion_result( "even my parents who are in their mid-40's can manage to use the default interface", PluralDecades::default(), "even my parents who are in their mid-40s can manage to use the default interface", ); } // 50s #[test] #[ignore = "here it's a username but Harper has no way to know"] fn dont_flag_50s_username() { assert_no_lints("View 50's full-sized avatar.", PluralDecades::default()); } // 60s #[test] #[ignore = "here it means 60+ seconds"] fn dont_flag_60_seconds() { assert_no_lints("WSL cold startup 60's +", PluralDecades::default()); } #[test] fn fix_my_late_60s() { assert_suggestion_result( "Comment: i'm a white woman in my late 60's and believe me, they are not too crazy about me", PluralDecades::default(), "Comment: i'm a white woman in my late 60s and believe me, they are not too crazy about me", ); } // 70s #[test] #[ignore = "ambiguous: version number?"] fn dont_flag_dotnet_runtime_70s() { assert_no_lints( "dotnet-runtime-70's release of 16th of May is causing \"version `GLIBC_2.34' not found\"", PluralDecades::default(), ); } #[test] fn fix_late_hyphen_70s() { assert_suggestion_result( "Retrocomputer built from late-70's TTL logic chips", PluralDecades::default(), "Retrocomputer built from late-'70s TTL logic chips", ); } #[test] #[ignore = "wip"] fn fix_a_fun_70s_industrial() { assert_suggestion_result( "A fun 70's industrial \"launch\" control panel with a Yubikey key switch", PluralDecades::default(), "A fun '70s industrial \"launch\" control panel with a Yubikey key switch", ); } // 80s #[test] fn fix_of_the_80s_npsg() { assert_suggestion_result( "A reboot of the 80's Microwriter accessible chord keyboard done using an Arduino.", PluralDecades::default(), "A reboot of the '80s Microwriter accessible chord keyboard done using an Arduino.", ); } #[test] #[ignore = "wip"] fn fix_an_80s_npsg() { assert_suggestion_result( "A remake of an 80's card game classic \"Around the World\"", PluralDecades::default(), "A remake of an '80s card game classic \"Around the World\"", ); } #[test] fn fix_the_80s_npsg() { assert_suggestion_result( "Small remake of the 80's legendary paperboy arcade game", PluralDecades::default(), "Small remake of the '80s legendary paperboy arcade game", ); } #[test] fn fix_the_80s_style_game_breakout() { assert_suggestion_result( "I called this pong but then was reminded that it more closely resembles the 80's style game Breakout.", PluralDecades::default(), "I called this pong but then was reminded that it more closely resembles the '80s style game Breakout.", ); } #[test] fn fix_the_80s_microwriter() { assert_suggestion_result( "A reboot of the 80's Microwriter accessible chord keyboard done using an Arduino.", PluralDecades::default(), "A reboot of the '80s Microwriter accessible chord keyboard done using an Arduino.", ); } #[test] #[ignore = "wip"] fn fix_80s_neon_theme() { assert_suggestion_result( "A flat, 80's neon inspired theme for JupyterLab.", PluralDecades::default(), "A flat, '80s neon inspired theme for JupyterLab.", ); } #[test] #[ignore = "wip"] fn fix_80s_neon_theme_colors() { assert_suggestion_result( "Cool UI Theme for Atom based on 80's neon colors with big tabs for easy files Switch.", PluralDecades::default(), "Cool UI Theme for Atom based on '80s neon colors with big tabs for easy files Switch.", ); } #[test] #[ignore = "wip"] fn fix_80s_synthwave_theme() { assert_suggestion_result( "An clean 80's synthwave / outrun inspired theme for Vim.", PluralDecades::default(), "An clean '80s synthwave / outrun inspired theme for Vim.", ); } #[test] #[ignore = "wip"] fn fix_80s_3d_era() { assert_suggestion_result( "Experimenting with writing 80's era 3D code but in Javascript and with HTML5 Canvas acting as display buffer.", PluralDecades::default(), "Experimenting with writing '80s era 3D code but in Javascript and with HTML5 Canvas acting as display buffer.", ); } #[test] #[ignore = "wip"] fn fix_80s_theme_80s_aesthetics() { assert_suggestion_result( "Vibrant 80's Klipper Mainsail Theme, based around 80's Dark Neon Aesthetics.", PluralDecades::default(), "Vibrant '80s Klipper Mainsail Theme, based around '80s Dark Neon Aesthetics.", ); } #[test] #[ignore = "wip"] fn fix_80s_dark_retro_theme() { assert_suggestion_result( "80's dark retro theme for VS Code and Sublime Text", PluralDecades::default(), "'80s dark retro theme for VS Code and Sublime Text", ); } #[test] fn fix_80s_chorus_effect() { assert_suggestion_result( "An 80's style chorus effect for your KORG 'logue synthesizers - hammondeggs/hera.", PluralDecades::default(), "An '80s style chorus effect for your KORG 'logue synthesizers - hammondeggs/hera.", ); } #[test] #[ignore = "Does this mean a Chrome browser version? If so what's the possessive for?"] fn dont_flag_chrome_80s() { assert_no_lints( "Ready for Chrome 80's [Cookies default to SameSite=Lax] ?", PluralDecades::default(), ); } #[test] fn fix_80s_style() { assert_suggestion_result( "Made your RStudio 80's style only after the sun goes down.", PluralDecades::default(), "Made your RStudio '80s style only after the sun goes down.", ); } #[test] fn fix_early_80s() { assert_suggestion_result( "Hardware and a game for the early 80's Z8671 MCU with built-in BASIC", PluralDecades::default(), "Hardware and a game for the early '80s Z8671 MCU with built-in BASIC", ); } #[test] #[ignore = "wip"] fn fix_modest_80s_fighter_game() { assert_suggestion_result( "An attempt by the MEGA65 community to write a modest 80's fighter game with BASIC 65 + Eleven", PluralDecades::default(), "An attempt by the MEGA65 community to write a modest '80s fighter game with BASIC 65 + Eleven", ); } #[test] #[ignore = "probably nonnative Engish for 'from the 80s'"] fn fix_straight_from_80s() { assert_suggestion_result( "Straight from 80's", PluralDecades::default(), "Straight from the '80s", ); } // 90s #[test] #[ignore = "wip"] fn fix_the_90s_were() { assert_suggestion_result( "Generate animated vector graphics for old-school 90's demos, like ST_NICCC", PluralDecades::default(), "Generate animated vector graphics for old-school '90s demos, like ST_NICCC", ); } #[test] #[ignore = "we detect `your 90's` as an age range, not a decade"] fn fix_late_90s() { assert_suggestion_result( "gmdrec is a USB interface between your late 90's Sony portable MiniDisc recorder and your PC.", PluralDecades::default(), "gmdrec is a USB interface between your late '90s Sony portable MiniDisc recorder and your PC.", ); } #[test] fn fix_the_90s_npsg() { assert_suggestion_result( "A modern vision on the 90's game Log!cal.", PluralDecades::default(), "A modern vision on the '90s game Log!cal.", ); } #[test] fn fix_from_the_90s() { assert_suggestion_result( "Digital Sound and Music Interface (from the 90's).", PluralDecades::default(), "Digital Sound and Music Interface (from the '90s).", ); } #[test] fn fix_the_late_90s() { assert_suggestion_result( "A modified CircleMUD that ran in the late 90's.", PluralDecades::default(), "A modified CircleMUD that ran in the late '90s.", ); } #[test] #[ignore = "wip"] fn fix_rad_90s_website() { assert_suggestion_result( "This is our rad 90's website.", PluralDecades::default(), "This is our rad '90s website.", ); } #[test] #[ignore = "mixed 80 with no 's next to 90's with 's might be too oddball"] fn fix_mixed_80s_and_90s() { // We could 'half-fix' just the 90's -> '90s part ... assert_suggestion_result( "\"ワープロ明朝\" is a font that reproduced the smoothing algorithm used in the 80-90's Japanese word processors.", PluralDecades::default(), "\"ワープロ明朝\" is a font that reproduced the smoothing algorithm used in the 80s-'90s Japanese word processors.", ); } #[test] #[ignore = "90 degrees"] fn dont_flag_all_90_degrees() { assert_no_lints( "get_map(\"Slope Degrees\") returns all 90's unless projected crs is specified", PluralDecades::default(), ); } #[test] #[ignore = "wip"] fn fix_a_90s_workstation() { assert_suggestion_result( "a 90's workstation; now likely too small", PluralDecades::default(), "a '90s workstation; now likely too small", ); } #[test] fn fix_domains_in_the_90s() { assert_suggestion_result( "Whois for gems, because gem names are like domains in the 90's", PluralDecades::default(), "Whois for gems, because gem names are like domains in the '90s", ); } #[test] #[ignore = "wip"] fn fix_the_classic_90s_game() { assert_suggestion_result( "Dragon Court, the classic 90's game by Fred Haslam", PluralDecades::default(), "Dragon Court, the classic '90s game by Fred Haslam", ); } // Multiple decades #[test] #[ignore = "wip"] fn fix_multiple_ages() { assert_suggestion_result( "It generates 100,000 random \"people\" and randomly assigns them as being in their 20's, 30's, 40's, 50's, 60's, or 70's.", PluralDecades::default(), "It generates 100,000 random \"people\" and randomly assigns them as being in their 20s, 30s, 40s, 50s, 60s, or 70s.", ); } #[test] #[ignore = "not sure if we should support missing 'the', especially when there's two decades"] fn fix_missing_the() { assert_suggestion_result( "A thoughtful full-stack reimplementation of gaming in 80's and 90's.", PluralDecades::default(), "A thoughtful full-stack reimplementation of gaming in the '80s and '90s.", ); } #[test] #[ignore = "wip"] fn fix_my_20s_and_30s() { assert_suggestion_result( "I spend my 20's and 30's as an officer with Royal Caribbean Cruises", PluralDecades::default(), "I spend my 20s and 30s as an officer with Royal Caribbean Cruises", ); } } ================================================ FILE: harper-core/src/linting/plural_wrong_word_of_phrase.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct PluralWrongWordOfPhrase { expr: SequenceExpr, } // If a noun needs other than an -s suffix to be pluralized, include it as the 2nd array element. const PATTERNS: &[(&[&str], &str, &[&str])] = &[ (&["body", "bodies"], "in", &["white"]), (&["flash", "flashes"], "in the", &["pan"]), (&["flash", "flashes"], "in-the", &["pan"]), (&["line"], "of", &["code"]), (&["part"], "of", &["speech", "speeches"]), (&["point"], "of", &["view"]), (&["rule"], "of", &["thumb"]), ]; impl Default for PluralWrongWordOfPhrase { fn default() -> Self { let word_str = |w| { SequenceExpr::with(move |t: &Token, s: &[char]| { t.kind.is_word() && t.span.get_content(s).eq_ignore_ascii_case_str(w) }) }; let word_string = |w: String| { SequenceExpr::with(move |t: &Token, s: &[char]| { t.kind.is_word() && t.span.get_content(s).eq_ignore_ascii_case_str(&w) }) }; let mut mistakes = vec![]; for &(main_noun, mid, last_noun) in PATTERNS { let main_pl = if main_noun.len() == 2 { main_noun[1].to_string() } else { format!("{}s", main_noun[0]) }; let last_pl = if last_noun.len() == 2 { last_noun[1].to_string() } else { format!("{}s", last_noun[0]) }; mistakes.push(Box::new( SequenceExpr::any_of(vec![ Box::new(word_str(main_noun[0])), Box::new(word_string(main_pl)), ]) .t_ws_h() .then_fixed_phrase(mid) .t_ws_h() .then(word_string(last_pl)), ) as Box); } Self { expr: SequenceExpr::any_of(mistakes), } } } impl ExprLinter for PluralWrongWordOfPhrase { type Unit = Chunk; fn description(&self) -> &str { "Corrects noun phrases that pluralize the last noun instead of the main noun." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let (main_noun_tok, last_noun_tok) = (toks.first()?, toks.last()?); let (main_noun_span, last_noun_span) = (main_noun_tok.span, last_noun_tok.span); let (main_noun_chars, last_noun_chars) = ( main_noun_span.get_content(src), last_noun_span.get_content(src), ); let (main_noun, mid, last_noun) = PATTERNS.iter().find(|(main, _, last)| { main_noun_chars.starts_with_ignore_ascii_case_str(main[0]) && last_noun_chars.starts_with_ignore_ascii_case_str(last[0]) })?; let main_noun_pl = if main_noun.len() == 2 { main_noun[1].to_string() } else { format!("{}s", main_noun[0]) }; Some(Lint { lint_kind: LintKind::Usage, span: toks.span()?, suggestions: vec![Suggestion::replace_with_match_case( format!("{} {} {}", main_noun_pl, mid, last_noun[0]) .chars() .collect::>(), toks.span()?.get_content(src), )], message: "This phrase is pluralized on the main noun, not on the last noun." .to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::PluralWrongWordOfPhrase; use crate::linting::tests::assert_suggestion_result; // LinesOfCode #[test] fn corrects_line_of_codes() { assert_suggestion_result( "desktop application used to estimate the line of codes to certain software application", PluralWrongWordOfPhrase::default(), "desktop application used to estimate the lines of code to certain software application", ); } #[test] #[ignore = "Wrong letters capitalized due to how `Suggstion::replace_with_match_case` works by index."] fn corrects_line_of_codes_title_case() { assert_suggestion_result( "A simple tool for Line Of Codes (LOC) calculation.", PluralWrongWordOfPhrase::default(), "A simple tool for Lines Of Code (LOC) calculation.", ); } #[test] fn corrects_lines_of_codes() { assert_suggestion_result( "I myself don't have something against giving users the ability to show the lines of codes they wrote.", PluralWrongWordOfPhrase::default(), "I myself don't have something against giving users the ability to show the lines of code they wrote.", ); } // PartsOfSpeech #[test] fn corrects_part_of_speeches() { assert_suggestion_result( "The part of speeches (POS) or as follows:", PluralWrongWordOfPhrase::default(), "The parts of speech (POS) or as follows:", ) } #[test] fn corrects_parts_of_speeches() { assert_suggestion_result( "It can connect different parts of speeches e.g noun to adjective, adjective to adverb, noun to verb etc.", PluralWrongWordOfPhrase::default(), "It can connect different parts of speech e.g noun to adjective, adjective to adverb, noun to verb etc.", ) } // PointsOfView #[test] fn corrects_point_of_views() { assert_suggestion_result( "This will produce a huge amount of raw data, representing the region in multiple point of views.", PluralWrongWordOfPhrase::default(), "This will produce a huge amount of raw data, representing the region in multiple points of view.", ) } #[test] fn corrects_points_of_views() { assert_suggestion_result( "log events, places, moods and self-reflect from various points of views", PluralWrongWordOfPhrase::default(), "log events, places, moods and self-reflect from various points of view", ) } // RulesOfThumb #[test] fn correct_rule_of_thumbs() { assert_suggestion_result( "Thanks. 0.2 is just from my rule of thumbs.", PluralWrongWordOfPhrase::default(), "Thanks. 0.2 is just from my rules of thumb.", ); } #[test] fn correct_rules_of_thumbs() { assert_suggestion_result( "But as rules of thumbs, what is said in config file should be respected whatever parameter (field or directory) is passed to php-cs-fixer.phar.", PluralWrongWordOfPhrase::default(), "But as rules of thumb, what is said in config file should be respected whatever parameter (field or directory) is passed to php-cs-fixer.phar.", ); } #[test] fn correct_rules_of_thumbs_hyphenated() { assert_suggestion_result( "Add rule-of-thumbs for basic metrics, like \"Spill more than 1GB is a red flag\".", PluralWrongWordOfPhrase::default(), "Add rules of thumb for basic metrics, like \"Spill more than 1GB is a red flag\".", ); } // BodiesInWhite #[test] fn correct_body_in_whites_1() { assert_suggestion_result( "Normally, when they manufacture these body in whites, they would spot weld a lot of the components on.", PluralWrongWordOfPhrase::default(), "Normally, when they manufacture these bodies in white, they would spot weld a lot of the components on.", ); } #[test] fn correct_body_in_whites_2() { assert_suggestion_result( "I'm not sure, but just having seen a lot of body in whites, I know normally they try to spot weld it.", PluralWrongWordOfPhrase::default(), "I'm not sure, but just having seen a lot of bodies in white, I know normally they try to spot weld it.", ); } // FlashesInThePan #[test] fn correct_flash_in_the_pans() { assert_suggestion_result( "I wish they do more flash in the pans, like the suggestions they do on ERB2 could be such a good way to see if these suggestions are worthy.", PluralWrongWordOfPhrase::default(), "I wish they do more flashes in the pan, like the suggestions they do on ERB2 could be such a good way to see if these suggestions are worthy.", ); } #[test] fn correct_flash_in_the_pans_hyphenated() { assert_suggestion_result( "what makes 'Super Hexagon' rise above other nostalgic flash-in-the-pans is that there is a game to be learned here", PluralWrongWordOfPhrase::default(), "what makes 'Super Hexagon' rise above other nostalgic flashes in the pan is that there is a game to be learned here", ); } #[test] fn correct_flashes_in_the_pans() { assert_suggestion_result( "Who are some of the biggest flashes in the pans in wrestling history?", PluralWrongWordOfPhrase::default(), "Who are some of the biggest flashes in the pan in wrestling history?", ); } } ================================================ FILE: harper-core/src/linting/possessive_noun.rs ================================================ use harper_brill::UPOS; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::expr::{All, Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::patterns::{UPOSSet, WordSet}; use crate::spell::Dictionary; use crate::{Token, TokenKind}; pub struct PossessiveNoun { expr: All, dict: D, } impl PossessiveNoun where D: Dictionary, { pub fn new(dict: D) -> Self { let expr = SequenceExpr::with(UPOSSet::new(&[UPOS::DET, UPOS::PROPN])) .t_ws() .then_kind_is_but_is_not(TokenKind::is_plural_nominal, TokenKind::is_singular_nominal) .t_ws() .then(UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN])) .then_optional(SequenceExpr::anything().t_any()); let additional_req = SequenceExpr::anything().t_any().t_any().t_any().then_noun(); let exceptions = SequenceExpr::unless(|tok: &Token, _: &[char]| tok.kind.is_demonstrative_determiner()) .t_any() .then_unless(WordSet::new(&["flags", "checks", "catches", "you"])) .t_any() .then_unless(WordSet::new(&["form", "go"])); Self { expr: All::new(vec![ Box::new(expr), Box::new(additional_req), Box::new(exceptions), ]), dict, } } } impl ExprLinter for PossessiveNoun where D: Dictionary, { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { let last_kind = &matched_tokens.last()?.kind; if last_kind.is_upos(UPOS::ADV) { return None; } let first = matched_tokens.get(2)?; let span = first.span; let plural = span.get_content_string(_source); let singular = if plural.ends_with('s') { &plural[..plural.len() - 1] } else { &plural }; let replacement = format!("{singular}'s"); if !self.dict.contains_word_str(&replacement) { return None; } Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith(replacement.chars().collect())], message: self.description().to_string(), priority: 10, }) } fn description(&self) -> &'static str { "Use an apostrophe and `s` to form a noun’s possessive." } } #[cfg(test)] mod tests { use std::sync::Arc; use super::PossessiveNoun; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use crate::spell::FstDictionary; fn test_linter() -> PossessiveNoun> { PossessiveNoun::new(FstDictionary::curated()) } /// Sourced from a Hacker News comment #[test] fn fixes_hn() { assert_suggestion_result( "Me and Jennifer went to have seen the ducks cousin.", test_linter(), "Me and Jennifer went to have seen the duck's cousin.", ); } #[test] fn fixes_cats_tail() { assert_suggestion_result( "The cats tail is long.", test_linter(), "The cat's tail is long.", ); } #[test] fn fixes_children_toys() { assert_suggestion_result( "The children toys were scattered.", test_linter(), "The children's toys were scattered.", ); } #[test] fn fixes_teachers_lounge() { assert_suggestion_result( "Many schools have a teachers lounge.", test_linter(), "Many schools have a teacher's lounge.", ); } #[test] fn fixes_ducks_park() { assert_suggestion_result( "Kids played in the ducks park.", test_linter(), "Kids played in the duck's park.", ); } #[test] fn no_lint_for_already_possessive() { assert_lint_count("The duck's cousin visited.", test_linter(), 0); } #[test] fn no_lint_for_alrreaady_possessive() { assert_lint_count("The duck's cousin visited.", test_linter(), 0); } #[test] fn fixes_dogs_bone() { assert_suggestion_result( "The dogs bone is delicious.", test_linter(), "The dog's bone is delicious.", ); } #[test] fn fixes_students_books() { assert_suggestion_result( "The students books are on the desk.", test_linter(), "The student's books are on the desk.", ); } #[test] fn fixes_farmers_field() { assert_suggestion_result( "The farmers field looked beautiful.", test_linter(), "The farmer's field looked beautiful.", ); } #[test] fn fixes_women_dress() { assert_suggestion_result( "The women dress was elegant.", test_linter(), "The women's dress was elegant.", ); } #[test] fn fixes_birds_song() { assert_suggestion_result( "We heard the birds song.", test_linter(), "We heard the bird's song.", ); } #[test] fn fixes_scientists_research() { assert_suggestion_result( "The scientists research was groundbreaking.", test_linter(), "The scientist's research was groundbreaking.", ); } #[test] fn fixes_artists_gallery() { assert_suggestion_result( "The artists gallery is open.", test_linter(), "The artist's gallery is open.", ); } #[test] fn no_lint_for_plural_noun() { assert_lint_count("The ducks are swimming.", test_linter(), 0); } #[test] fn no_lint_for_proper_noun() { assert_lint_count("John's car is red.", test_linter(), 0); } #[test] fn fixes_the_students_assignment() { assert_suggestion_result( "The students assignment was due yesterday.", test_linter(), "The student's assignment was due yesterday.", ); } #[test] fn fixes_the_birds_flight() { assert_suggestion_result( "The birds flight was graceful.", test_linter(), "The bird's flight was graceful.", ); } #[test] fn allows_the_city_lights() { assert_lint_count( "The city lights twinkled in the distance.", test_linter(), 0, ); } #[test] fn fixes_the_farmers_crops() { assert_suggestion_result( "The farmers crops were bountiful this year.", test_linter(), "The farmer's crops were bountiful this year.", ); } #[test] fn fixes_the_artists_inspiration() { assert_suggestion_result( "The artists inspiration came from nature.", test_linter(), "The artist's inspiration came from nature.", ); } #[test] fn fixes_the_scientists_discovery() { assert_suggestion_result( "The scientists discovery revolutionized the field.", test_linter(), "The scientist's discovery revolutionized the field.", ); } #[test] fn fixes_the_writers_novel() { assert_suggestion_result( "The writers novel was a bestseller.", test_linter(), "The writer's novel was a bestseller.", ); } #[test] fn fixes_the_students_presentation() { assert_suggestion_result( "The students presentation was well-received.", test_linter(), "The student's presentation was well-received.", ); } #[test] fn fixes_the_teams_victory() { assert_suggestion_result( "The teams victory was celebrated by the fans.", test_linter(), "The team's victory was celebrated by the fans.", ); } #[test] fn fixes_the_museums_collection() { assert_suggestion_result( "The museums collection included many artifacts.", test_linter(), "The museum's collection included many artifacts.", ); } #[test] fn no_lint_for_already_possessive_2() { assert_lint_count("John's car is red.", test_linter(), 0); } #[test] fn no_lint_for_proper_noun_2() { assert_lint_count("Mary went to the store.", test_linter(), 0); } #[test] fn fixes_the_doctors_office() { assert_suggestion_result( "The doctors office is on Main Street.", test_linter(), "The doctor's office is on Main Street.", ); } #[test] fn fixes_the_neighbors_garden() { assert_suggestion_result( "The neighbors garden is beautiful.", test_linter(), "The neighbor's garden is beautiful.", ); } #[test] fn fixes_the_architects_design() { assert_suggestion_result( "The architects design was innovative.", test_linter(), "The architect's design was innovative.", ); } #[test] fn fixes_the_bakers_shop() { assert_suggestion_result( "The bakers shop is famous for its bread.", test_linter(), "The baker's shop is famous for its bread.", ); } #[test] fn fixes_the_musics_performance() { assert_suggestion_result( "The musics performance was captivating.", test_linter(), "The music's performance was captivating.", ); } #[test] fn fixes_the_flowers_scent() { assert_suggestion_result( "The flowers scent filled the room.", test_linter(), "The flower's scent filled the room.", ); } #[test] fn allows_birds_hurried() { assert_lint_count("The birds hurried off.", test_linter(), 0); } #[test] #[ignore = "false positive issue 1582"] fn allows_1582_harms_readability() { assert_lint_count( "This harms readability and maintainability.", test_linter(), 0, ); } #[test] #[ignore = "false positive issue 1582"] fn allows_1582_imports_couples() { assert_lint_count( "Since using Webpack syntax in the imports couples the code to a module bundler", test_linter(), 0, ); } #[test] #[ignore = "false positive issue 1582"] fn allows_1582_graphics_programmer() { assert_lint_count( "Are you a graphics programmer or Rust developer?", test_linter(), 0, ); } #[test] #[ignore = "false positive issue 1582"] fn allows_1582_data_sources() { assert_lint_count( "these data sources can be queried using a full SQL dialect", test_linter(), 0, ); } } ================================================ FILE: harper-core/src/linting/possessive_your.rs ================================================ use crate::{ Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{ ExprLinter, Lint, LintKind, Suggestion, expr_linter::{Chunk, preceded_by_word}, }, }; pub struct PossessiveYour { expr: SequenceExpr, } impl Default for PossessiveYour { fn default() -> Self { let pattern = SequenceExpr::aco("you") .then_whitespace() .then_kind_is_but_is_not_except( TokenKind::is_nominal, TokenKind::is_likely_homograph, &["guys", "what's"], ); Self { expr: pattern } } } impl ExprLinter for PossessiveYour { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, matched_tokens: &[Token], source: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if preceded_by_word(ctx, |pw| pw.kind.is_verb()) { return None; } let span = matched_tokens.first()?.span; let orig_chars = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case("your".chars().collect(), orig_chars), Suggestion::replace_with_match_case("you're a".chars().collect(), orig_chars), Suggestion::replace_with_match_case("you're an".chars().collect(), orig_chars), ], message: "The possessive version of this word is more common in this context." .to_owned(), ..Default::default() }) } fn description(&self) -> &'static str { "The possessive form of `you` is more likely before nouns." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::PossessiveYour; #[test] #[ignore = "currently fails because comments is a homographs (verb or noun)"] fn your_comments() { assert_suggestion_result( "You comments may end up in the documentation.", PossessiveYour::default(), "Your comments may end up in the documentation.", ); } #[test] fn allow_intro_page() { assert_lint_count( "You can try out an editor that uses Harper under-the-hood here.", PossessiveYour::default(), 0, ); } #[test] fn allow_you_guys() { assert_lint_count( "I mean I'm pretty sure you guys can't do anything with this stuff.", PossessiveYour::default(), 0, ); } #[test] fn test_suggestion_your() { assert_suggestion_result( "You combination of artist and teacher.", PossessiveYour::default(), "Your combination of artist and teacher.", ); } #[test] fn test_suggestion_youre_a() { assert_suggestion_result( "You combination of artist and teacher.", PossessiveYour::default(), "You're a combination of artist and teacher.", ); } #[test] #[ignore] fn test_suggestion_multiple() { assert_suggestion_result( "You knowledge. You imagination. You icosahedron", PossessiveYour::default(), "Your knowledge. Your imagination. You're an icosahedron", ); } #[test] fn dont_flag_just_showing_you() { assert_lint_count( "I'm just showing you what's available and how to use it.", PossessiveYour::default(), 0, ); } #[test] fn allows_issue_1583() { assert_no_lints( "Note that in a world with modules everywhere, you almost never need an IIFE", PossessiveYour::default(), ); } #[test] fn dont_flag_1919_brought_you() { assert_lint_count( "team who also brought you [BloodHound Enterprise](http://specterops.io/bloodhound-verview/).", PossessiveYour::default(), 0, ); } #[test] fn dont_flag_1919_teaches_you() { assert_lint_count( "Teaches you PyTorch and many machine learning concepts in a hands-on, code-first way.", PossessiveYour::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/progressive_needs_be.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ProgressiveNeedsBe { expr: SequenceExpr, } impl Default for ProgressiveNeedsBe { fn default() -> Self { // Support both contracted (I've/We've/You've/They've) and non-contracted // (I have/We have/You have/They have) forms before a progressive verb. let contracted = SequenceExpr::word_set(&[ "I've", "We've", "You've", "They've", "Ive", "Weve", "Youve", "Theyve", ]) .t_ws() .then_verb_progressive_form(); let non_contracted = SequenceExpr::word_set(&["I", "We", "You", "They"]) .t_ws() .then_any_capitalization_of("have") .t_ws() .then_verb_progressive_form(); let expr = SequenceExpr::any_of(vec![Box::new(contracted), Box::new(non_contracted)]); Self { expr } } } impl ExprLinter for ProgressiveNeedsBe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { use crate::CharStringExt; // Collect the word tokens in the matched slice let word_toks: Vec<&Token> = toks.iter().filter(|t| t.kind.is_word()).collect(); let first_word = *word_toks.first()?; // contraction or pronoun // If this is the non-contracted pattern, extend the replacement span to include "have" let have_tok_opt = word_toks .iter() .find(|t| t.span.get_content(src).eq_ignore_ascii_case_str("have")) .copied(); let span = if let Some(have_tok) = have_tok_opt { crate::Span::new(first_word.span.start, have_tok.span.end) } else { first_word.span }; // Choose the correct "be" contraction based on the pronoun let pronoun = first_word.span.get_content(src); let progressive_replacement = if pronoun.starts_with_ignore_ascii_case_str("i") { "I'm" } else if pronoun.starts_with_ignore_ascii_case_str("we") { "We're" } else if pronoun.starts_with_ignore_ascii_case_str("you") { "You're" } else if pronoun.starts_with_ignore_ascii_case_str("they") { "They're" } else { "I'm" }; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case( progressive_replacement.chars().collect(), span.get_content(src), ), Suggestion::InsertAfter(" been".chars().collect()), ], message: "Use present progressive (`…'re/…'m …`) or present perfect progressive (`… have been …`/`…'ve been …`) instead of `… have …ing` or `…'ve …ing`.".to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Detects the ungrammatical patterns ` have …ing` (e.g., `I have …ing`) and `'ve …ing` (e.g., `I've …ing`) and suggests either the present progressive (e.g., `I'm/We're/You're/They're …`) or the present perfect progressive (e.g., `I/We/You/They have been …` or `I've/We've/You've/They've been …`)." } } #[cfg(test)] mod tests { use super::ProgressiveNeedsBe; use crate::linting::tests::{ assert_good_and_bad_suggestions, assert_lint_count, assert_suggestion_result, }; #[test] fn suggests_im_looking() { assert_suggestion_result( "I've looking into it.", ProgressiveNeedsBe::default(), "I'm looking into it.", ); } #[test] fn corrects_basic_im() { assert_suggestion_result( "I've looking into it.", ProgressiveNeedsBe::default(), "I'm looking into it.", ); } #[test] fn offers_both_suggestions() { assert_good_and_bad_suggestions( "I've looking into it.", ProgressiveNeedsBe::default(), &["I'm looking into it.", "I've been looking into it."], &[], ); } #[test] fn allows_ive_looked() { assert_lint_count("I've looked into it.", ProgressiveNeedsBe::default(), 0); } #[test] fn allows_ive_been_looking() { assert_lint_count( "I've been looking into it.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn allows_ive_seen() { assert_lint_count("I've seen the results.", ProgressiveNeedsBe::default(), 0); } #[test] fn allows_ive_long_been_looking() { assert_lint_count( "I've long been looking into it.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn no_match_with_punctuation_between() { assert_lint_count("I've, looking into it.", ProgressiveNeedsBe::default(), 0); } #[test] fn handles_newline_whitespace() { assert_suggestion_result( "I've\nlooking into it.", ProgressiveNeedsBe::default(), "I'm\nlooking into it.", ); } #[test] fn capitalization_all_caps_base() { assert_suggestion_result( "I'VE looking into it.", ProgressiveNeedsBe::default(), "I'M looking into it.", ); } #[test] fn works_for_weve() { assert_suggestion_result( "We've looking into it.", ProgressiveNeedsBe::default(), "We're looking into it.", ); } #[test] fn suggests_im_looking_non_contracted() { assert_suggestion_result( "I have looking into it.", ProgressiveNeedsBe::default(), "I'm looking into it.", ); } #[test] fn offers_both_suggestions_non_contracted() { assert_good_and_bad_suggestions( "They have looking into it.", ProgressiveNeedsBe::default(), &[ "They're looking into it.", "They have been looking into it.", ], &[], ); } #[test] fn allows_i_have_been_looking() { assert_lint_count( "I have been looking into it.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn allows_i_have_looked() { assert_lint_count("I have looked into it.", ProgressiveNeedsBe::default(), 0); } // Additional generalized cases // Contracted: I've/We've/You've/They've + gerund #[test] fn ive_working() { assert_suggestion_result( "I've working on it today.", ProgressiveNeedsBe::default(), "I'm working on it today.", ); } #[test] fn weve_working() { assert_suggestion_result( "We've working on it today.", ProgressiveNeedsBe::default(), "We're working on it today.", ); } #[test] fn youve_working() { assert_suggestion_result( "You've working on it today.", ProgressiveNeedsBe::default(), "You're working on it today.", ); } #[test] fn theyve_working() { assert_suggestion_result( "They've working on it today.", ProgressiveNeedsBe::default(), "They're working on it today.", ); } #[test] fn ive_eating() { assert_suggestion_result( "I've eating it today.", ProgressiveNeedsBe::default(), "I'm eating it today.", ); } #[test] fn weve_eating() { assert_suggestion_result( "We've eating it today.", ProgressiveNeedsBe::default(), "We're eating it today.", ); } #[test] fn youve_eating() { assert_suggestion_result( "You've eating it today.", ProgressiveNeedsBe::default(), "You're eating it today.", ); } #[test] fn theyve_eating() { assert_suggestion_result( "They've eating it today.", ProgressiveNeedsBe::default(), "They're eating it today.", ); } #[test] fn ive_reading() { assert_suggestion_result( "I've reading it today.", ProgressiveNeedsBe::default(), "I'm reading it today.", ); } #[test] fn weve_reading() { assert_suggestion_result( "We've reading it today.", ProgressiveNeedsBe::default(), "We're reading it today.", ); } #[test] fn youve_reading() { assert_suggestion_result( "You've reading it today.", ProgressiveNeedsBe::default(), "You're reading it today.", ); } #[test] fn theyve_reading() { assert_suggestion_result( "They've reading it today.", ProgressiveNeedsBe::default(), "They're reading it today.", ); } #[test] fn ive_writing() { assert_suggestion_result( "I've writing it today.", ProgressiveNeedsBe::default(), "I'm writing it today.", ); } #[test] fn weve_writing() { assert_suggestion_result( "We've writing it today.", ProgressiveNeedsBe::default(), "We're writing it today.", ); } #[test] fn youve_writing() { assert_suggestion_result( "You've writing it today.", ProgressiveNeedsBe::default(), "You're writing it today.", ); } #[test] fn theyve_writing() { assert_suggestion_result( "They've writing it today.", ProgressiveNeedsBe::default(), "They're writing it today.", ); } #[test] fn ive_speaking() { assert_suggestion_result( "I've speaking about it today.", ProgressiveNeedsBe::default(), "I'm speaking about it today.", ); } #[test] fn weve_speaking() { assert_suggestion_result( "We've speaking about it today.", ProgressiveNeedsBe::default(), "We're speaking about it today.", ); } #[test] fn youve_speaking() { assert_suggestion_result( "You've speaking about it today.", ProgressiveNeedsBe::default(), "You're speaking about it today.", ); } #[test] fn theyve_speaking() { assert_suggestion_result( "They've speaking about it today.", ProgressiveNeedsBe::default(), "They're speaking about it today.", ); } #[test] fn ive_studying() { assert_suggestion_result( "I've studying it today.", ProgressiveNeedsBe::default(), "I'm studying it today.", ); } #[test] fn weve_studying() { assert_suggestion_result( "We've studying it today.", ProgressiveNeedsBe::default(), "We're studying it today.", ); } #[test] fn youve_studying() { assert_suggestion_result( "You've studying it today.", ProgressiveNeedsBe::default(), "You're studying it today.", ); } #[test] fn theyve_studying() { assert_suggestion_result( "They've studying it today.", ProgressiveNeedsBe::default(), "They're studying it today.", ); } #[test] fn ive_testing() { assert_suggestion_result( "I've testing it today.", ProgressiveNeedsBe::default(), "I'm testing it today.", ); } #[test] fn weve_testing() { assert_suggestion_result( "We've testing it today.", ProgressiveNeedsBe::default(), "We're testing it today.", ); } #[test] fn youve_testing() { assert_suggestion_result( "You've testing it today.", ProgressiveNeedsBe::default(), "You're testing it today.", ); } #[test] fn theyve_testing() { assert_suggestion_result( "They've testing it today.", ProgressiveNeedsBe::default(), "They're testing it today.", ); } #[test] fn ive_using() { assert_suggestion_result( "I've using it today.", ProgressiveNeedsBe::default(), "I'm using it today.", ); } #[test] fn weve_using() { assert_suggestion_result( "We've using it today.", ProgressiveNeedsBe::default(), "We're using it today.", ); } #[test] fn youve_using() { assert_suggestion_result( "You've using it today.", ProgressiveNeedsBe::default(), "You're using it today.", ); } #[test] fn theyve_using() { assert_suggestion_result( "They've using it today.", ProgressiveNeedsBe::default(), "They're using it today.", ); } // Non-contracted: I/We/You/They have + gerund #[test] fn i_have_working() { assert_suggestion_result( "I have working on it today.", ProgressiveNeedsBe::default(), "I'm working on it today.", ); } #[test] fn we_have_working() { assert_suggestion_result( "We have working on it today.", ProgressiveNeedsBe::default(), "We're working on it today.", ); } #[test] fn you_have_working() { assert_suggestion_result( "You have working on it today.", ProgressiveNeedsBe::default(), "You're working on it today.", ); } #[test] fn they_have_working() { assert_suggestion_result( "They have working on it today.", ProgressiveNeedsBe::default(), "They're working on it today.", ); } #[test] fn i_have_eating() { assert_suggestion_result( "I have eating it today.", ProgressiveNeedsBe::default(), "I'm eating it today.", ); } #[test] fn we_have_eating() { assert_suggestion_result( "We have eating it today.", ProgressiveNeedsBe::default(), "We're eating it today.", ); } #[test] fn you_have_eating() { assert_suggestion_result( "You have eating it today.", ProgressiveNeedsBe::default(), "You're eating it today.", ); } #[test] fn they_have_eating() { assert_suggestion_result( "They have eating it today.", ProgressiveNeedsBe::default(), "They're eating it today.", ); } #[test] fn i_have_reading() { assert_suggestion_result( "I have reading it today.", ProgressiveNeedsBe::default(), "I'm reading it today.", ); } #[test] fn we_have_reading() { assert_suggestion_result( "We have reading it today.", ProgressiveNeedsBe::default(), "We're reading it today.", ); } #[test] fn you_have_reading() { assert_suggestion_result( "You have reading it today.", ProgressiveNeedsBe::default(), "You're reading it today.", ); } #[test] fn they_have_reading() { assert_suggestion_result( "They have reading it today.", ProgressiveNeedsBe::default(), "They're reading it today.", ); } #[test] fn i_have_writing() { assert_suggestion_result( "I have writing it today.", ProgressiveNeedsBe::default(), "I'm writing it today.", ); } #[test] fn we_have_writing() { assert_suggestion_result( "We have writing it today.", ProgressiveNeedsBe::default(), "We're writing it today.", ); } #[test] fn you_have_writing() { assert_suggestion_result( "You have writing it today.", ProgressiveNeedsBe::default(), "You're writing it today.", ); } #[test] fn they_have_writing() { assert_suggestion_result( "They have writing it today.", ProgressiveNeedsBe::default(), "They're writing it today.", ); } #[test] fn i_have_speaking() { assert_suggestion_result( "I have speaking about it today.", ProgressiveNeedsBe::default(), "I'm speaking about it today.", ); } #[test] fn we_have_speaking() { assert_suggestion_result( "We have speaking about it today.", ProgressiveNeedsBe::default(), "We're speaking about it today.", ); } #[test] fn you_have_speaking() { assert_suggestion_result( "You have speaking about it today.", ProgressiveNeedsBe::default(), "You're speaking about it today.", ); } #[test] fn they_have_speaking() { assert_suggestion_result( "They have speaking about it today.", ProgressiveNeedsBe::default(), "They're speaking about it today.", ); } #[test] fn i_have_studying() { assert_suggestion_result( "I have studying it today.", ProgressiveNeedsBe::default(), "I'm studying it today.", ); } #[test] fn we_have_studying() { assert_suggestion_result( "We have studying it today.", ProgressiveNeedsBe::default(), "We're studying it today.", ); } #[test] fn you_have_studying() { assert_suggestion_result( "You have studying it today.", ProgressiveNeedsBe::default(), "You're studying it today.", ); } #[test] fn they_have_studying() { assert_suggestion_result( "They have studying it today.", ProgressiveNeedsBe::default(), "They're studying it today.", ); } #[test] fn i_have_testing() { assert_suggestion_result( "I have testing it today.", ProgressiveNeedsBe::default(), "I'm testing it today.", ); } #[test] fn we_have_testing() { assert_suggestion_result( "We have testing it today.", ProgressiveNeedsBe::default(), "We're testing it today.", ); } #[test] fn you_have_testing() { assert_suggestion_result( "You have testing it today.", ProgressiveNeedsBe::default(), "You're testing it today.", ); } #[test] fn they_have_testing() { assert_suggestion_result( "They have testing it today.", ProgressiveNeedsBe::default(), "They're testing it today.", ); } #[test] fn i_have_using() { assert_suggestion_result( "I have using it today.", ProgressiveNeedsBe::default(), "I'm using it today.", ); } #[test] fn we_have_using() { assert_suggestion_result( "We have using it today.", ProgressiveNeedsBe::default(), "We're using it today.", ); } #[test] fn you_have_using() { assert_suggestion_result( "You have using it today.", ProgressiveNeedsBe::default(), "You're using it today.", ); } #[test] fn they_have_using() { assert_suggestion_result( "They have using it today.", ProgressiveNeedsBe::default(), "They're using it today.", ); } // Both-suggestion checks #[test] fn both_suggestions_ive_working() { assert_good_and_bad_suggestions( "I've working today.", ProgressiveNeedsBe::default(), &["I'm working today.", "I've been working today."], &[], ); } #[test] fn both_suggestions_we_have_reading() { assert_good_and_bad_suggestions( "We have reading it today.", ProgressiveNeedsBe::default(), &["We're reading it today.", "We have been reading it today."], &[], ); } #[test] fn both_suggestions_youve_reading() { assert_good_and_bad_suggestions( "You've reading today.", ProgressiveNeedsBe::default(), &["You're reading today.", "You've been reading today."], &[], ); } #[test] fn both_suggestions_they_have_writing() { assert_good_and_bad_suggestions( "They have writing today.", ProgressiveNeedsBe::default(), &["They're writing today.", "They have been writing today."], &[], ); } // Non-match and allowed-form checks fn no_match_punctuation_contracted() { assert_lint_count("I've, working today.", ProgressiveNeedsBe::default(), 0); } #[test] fn no_match_punctuation_non_contracted() { assert_lint_count("I have, working today.", ProgressiveNeedsBe::default(), 0); } #[test] fn no_match_adverb_interruption() { assert_lint_count( "I have quickly working today.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn allowed_contracted_have_been() { assert_lint_count( "You've been studying today.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn allowed_non_contracted_have_been() { assert_lint_count( "You have been studying today.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn allowed_they_have_been() { assert_lint_count( "They have been testing today.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn allowed_theyve_been() { assert_lint_count( "They've been testing today.", ProgressiveNeedsBe::default(), 0, ); } #[test] fn capitalization_variants_non_contracted() { assert_suggestion_result( "WE HAVE working today.", ProgressiveNeedsBe::default(), "WE'RE working today.", ); } #[test] fn newline_variants_non_contracted() { assert_suggestion_result( "We have\nworking on it today.", ProgressiveNeedsBe::default(), "We're\nworking on it today.", ); } ////////// #[test] #[ignore = "Handling the progressive `being` will need a special case"] fn test_ive_being() { assert_good_and_bad_suggestions( "I've being playing with languages.toml", ProgressiveNeedsBe::default(), &[ "I've been playing with languages.toml", "I'm playing with languages.toml", ], &[], ); } #[test] fn test_ive_doing_no_apostrophe() { assert_suggestion_result( "Ive always seen the variables and debug into it, and thats what ive doing.", ProgressiveNeedsBe::default(), "Ive always seen the variables and debug into it, and thats what i'm doing.", ); } #[test] fn test_ive_looking_no_apostrophe() { assert_suggestion_result( "Ive looking for a way to get temperature and humidity for all of our rooms within for a reasonable price in Germany.", ProgressiveNeedsBe::default(), "I'm looking for a way to get temperature and humidity for all of our rooms within for a reasonable price in Germany.", ); } #[test] #[ignore = "Handling the progressive `being` will need a special case"] fn test_youve_being() { assert_suggestion_result( "Thanks for all the work you've being doing for this project btw!", ProgressiveNeedsBe::default(), "Thanks for all the work you're doing for this project btw!", ); } #[test] fn test_theyve_doing() { assert_suggestion_result( "it’s also kind of implied users read the documentation or generally have a sense of what they’ve doing and what could go wrong", ProgressiveNeedsBe::default(), "it’s also kind of implied users read the documentation or generally have a sense of what they're doing and what could go wrong", ); } } ================================================ FILE: harper-core/src/linting/pronoun_are.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; /// Corrects the shorthand `r` after plural first- and second-person pronouns. pub struct PronounAre { expr: SequenceExpr, } impl Default for PronounAre { fn default() -> Self { let expr = SequenceExpr::default() .then_kind_where(|kind| { kind.is_pronoun() && kind.is_subject_pronoun() && (kind.is_second_person_pronoun() || kind.is_first_person_plural_pronoun() || kind.is_third_person_plural_pronoun()) }) .t_ws() .t_aco("r"); Self { expr } } } impl ExprLinter for PronounAre { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let span = tokens.span()?; let pronoun = tokens.first()?; let gap = tokens.get(1)?; let letter = tokens.get(2)?; let pronoun_chars = pronoun.span.get_content(source); let gap_chars = gap.span.get_content(source); let letter_chars = letter.span.get_content(source); let all_pronoun_letters_uppercase = pronoun_chars .iter() .filter(|c| c.is_alphabetic()) .all(|c| c.is_uppercase()); let letter_has_uppercase = letter_chars.iter().any(|c| c.is_uppercase()); let uppercase_suffix = letter_has_uppercase || all_pronoun_letters_uppercase; let are_suffix: Vec = if uppercase_suffix { vec!['A', 'R', 'E'] } else { vec!['a', 'r', 'e'] }; let re_suffix: Vec = if uppercase_suffix { vec!['R', 'E'] } else { vec!['r', 'e'] }; let mut with_are = pronoun_chars.to_vec(); with_are.extend_from_slice(gap_chars); with_are.extend(are_suffix); let mut with_contraction = pronoun_chars.to_vec(); with_contraction.push('\''); with_contraction.extend(re_suffix); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::ReplaceWith(with_are), Suggestion::ReplaceWith(with_contraction), ], message: "Use the full verb or the contraction after this pronoun.".to_owned(), priority: 40, }) } fn description(&self) -> &str { "Spots the letter `r` used in place of `are` or `you're` after plural first- or second-person pronouns." } } #[cfg(test)] mod tests { use super::PronounAre; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fixes_you_r() { assert_suggestion_result( "You r absolutely right.", PronounAre::default(), "You are absolutely right.", ); } #[test] fn offers_contraction_option() { assert_suggestion_result( "You r absolutely right.", PronounAre::default(), "You're absolutely right.", ); } #[test] fn keeps_uppercase_pronoun() { assert_suggestion_result( "YOU r welcome here.", PronounAre::default(), "YOU ARE welcome here.", ); } #[test] fn fixes_they_r_with_comma() { assert_suggestion_result( "They r, of course, arriving tomorrow.", PronounAre::default(), "They are, of course, arriving tomorrow.", ); } #[test] fn fixes_we_r_lowercase() { assert_suggestion_result( "we r ready now.", PronounAre::default(), "we are ready now.", ); } #[test] fn fixes_they_r_sentence_start() { assert_suggestion_result( "They r planning ahead.", PronounAre::default(), "They are planning ahead.", ); } #[test] fn fixes_lowercase_sentence() { assert_suggestion_result( "they r late again.", PronounAre::default(), "they are late again.", ); } #[test] fn handles_line_break() { assert_suggestion_result( "We r\nready to go.", PronounAre::default(), "We are\nready to go.", ); } #[test] fn does_not_flag_contraction() { assert_lint_count("You're looking great.", PronounAre::default(), 0); } #[test] fn does_not_flag_full_form() { assert_lint_count("They are excited about it.", PronounAre::default(), 0); } #[test] fn ignores_similar_word() { assert_lint_count("Your results impressed everyone.", PronounAre::default(), 0); } } ================================================ FILE: harper-core/src/linting/pronoun_contraction/avoid_contraction.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::{Token, TokenKind}; use super::super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct AvoidContraction { expr: Box, } impl Default for AvoidContraction { fn default() -> Self { let pattern = SequenceExpr::aco("you're") .then_whitespace() .then_kind_is_but_is_not(TokenKind::is_nominal, TokenKind::is_likely_homograph); Self { expr: Box::new(pattern), } } } impl ExprLinter for AvoidContraction { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let word = matched_tokens[0].span.get_content(source); Some(Lint { span: matched_tokens[0].span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( vec!['y', 'o', 'u', 'r'], word, )], message: "It appears you intended to use the possessive version of this word" .to_owned(), priority: 63, }) } fn description(&self) -> &'static str { "This rule looks for situations where a contraction was used where it shouldn't have been." } } ================================================ FILE: harper-core/src/linting/pronoun_contraction/mod.rs ================================================ use super::merge_linters::merge_linters; mod avoid_contraction; mod should_contract; use avoid_contraction::AvoidContraction; use should_contract::ShouldContract; merge_linters! {PronounContraction => ShouldContract, AvoidContraction => "Choosing when to contract pronouns is a challenging art. This rule looks for faults." } #[cfg(test)] mod tests { use super::PronounContraction; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn issue_225() { assert_suggestion_result( "Your the man", PronounContraction::default(), "You're the man", ); } #[test] fn were_team() { assert_suggestion_result( "Were the best team.", PronounContraction::default(), "We're the best team.", ); } #[test] fn issue_139() { assert_suggestion_result( "it would be great if you're PR was merged into tower-lsp", PronounContraction::default(), "it would be great if your PR was merged into tower-lsp", ); } #[test] fn car() { assert_suggestion_result( "You're car is black.", PronounContraction::default(), "Your car is black.", ); } #[test] fn allows_you_are_still() { assert_lint_count( "In case you're still not convinced.", PronounContraction::default(), 0, ); } #[test] fn issue_576() { assert_lint_count( "If you're not happy you try again.", PronounContraction::default(), 0, ); assert_lint_count("No you're not.", PronounContraction::default(), 0); assert_lint_count( "Even if you're not fluent in arm assembly, you surely noticed this.", PronounContraction::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/pronoun_contraction/should_contract.rs ================================================ use std::sync::Arc; use crate::TokenKind; use crate::expr::AnchorStart; use crate::expr::Expr; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::{Token, patterns::WordSet}; use crate::Lint; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, LintKind, Suggestion}; /// See also: /// harper-core/src/linting/compound_nouns/implied_ownership_compound_nouns.rs /// harper-core/src/linting/lets_confusion/mod.rs /// harper-core/src/linting/lets_confusion/let_us_redundancy.rs /// harper-core/src/linting/lets_confusion/no_contraction_with_verb.rs pub struct ShouldContract { expr: Box, } impl Default for ShouldContract { fn default() -> Self { let cap = Arc::new( SequenceExpr::word_set(&["your", "were"]) .then_whitespace() .then_kind_is_but_is_not( TokenKind::is_non_quantifier_determiner, TokenKind::is_pronoun, ) .then_whitespace() .then_adjective(), ); let start = SequenceExpr::with(AnchorStart).then(cap.clone()); let mid = SequenceExpr::unless(WordSet::new(&["what"])) .t_ws() .then(cap); Self { expr: Box::new(start.or(mid)), } } } impl ShouldContract { fn mistake_to_correct(mistake: &str) -> Option>> { let words = match mistake.to_lowercase().as_str() { "your" => vec!["you're", "you are"], "were" => vec!["we're", "we are"], _ => return None, } .into_iter() .map(|v| v.chars().collect()) .collect(); Some(words) } } impl ExprLinter for ShouldContract { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { // Locate the mistake let possible_mistakes = [matched_tokens[0].span, matched_tokens[1].span]; let mut correct = None; let mut span = None; for p_mist in possible_mistakes { let mistake = p_mist.get_content_string(source); let correct_cand = Self::mistake_to_correct(&mistake); if correct_cand.is_some() { correct = correct_cand; span = Some(p_mist); } } let correct = correct?; let span = span?; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: correct .into_iter() .map(|v| Suggestion::replace_with_match_case(v, span.get_content(source))) .collect(), message: "Use the contraction or separate the words instead.".to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Neglecting the apostrophe when contracting pronouns with \"are\" (like \"your\" and \"you are\") is a fatal, but extremely common mistake to make." } } #[cfg(test)] mod tests { use super::ShouldContract; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn contracts_your_correctly() { assert_suggestion_result( "your the best", ShouldContract::default(), "you're the best", ); } #[test] fn contracts_were_complex_correctly() { assert_suggestion_result( "were a good team", ShouldContract::default(), "we're a good team", ); } #[test] fn case_insensitive_handling() { assert_suggestion_result( "Your the best", ShouldContract::default(), "You're the best", ); } #[test] fn no_match_without_the() { assert_lint_count("your best", ShouldContract::default(), 0); assert_lint_count("were best", ShouldContract::default(), 0); } #[test] fn no_match_with_punctuation() { assert_lint_count("your, the best", ShouldContract::default(), 0); } #[test] fn allow_norm() { assert_lint_count( "Let's start this story by going back to the dark ages before internet applications were the norm.", ShouldContract::default(), 0, ); } #[test] fn allow_issue_1508() { assert_no_lints("Were any other toys fun?", ShouldContract::default()); assert_no_lints("You were his closest friend.", ShouldContract::default()); } #[test] fn allows_issue_1673() { assert_no_lints("What were the action items?", ShouldContract::default()); } } ================================================ FILE: harper-core/src/linting/pronoun_inflection_be.rs ================================================ use harper_brill::UPOS; use crate::expr::{All, AnchorStart, Expr, ExprMap, SequenceExpr}; use crate::patterns::{NominalPhrase, UPOSSet}; use crate::{Lrc, Token, TokenKind, TokenStringExt}; use super::Suggestion; use super::{ExprLinter, Lint, LintKind}; use crate::linting::expr_linter::Chunk; pub struct PronounInflectionBe { expr: All, map: Lrc>, } impl PronounInflectionBe { pub fn new() -> Self { let mod_term = Lrc::new( SequenceExpr::default() .t_ws() .then(UPOSSet::new(&[UPOS::ADJ, UPOS::ADV])), ); let mut map = ExprMap::default(); let are = SequenceExpr::default() .then_third_person_singular_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("are") .t_any() .then_unless(NominalPhrase); map.insert(are, "is"); let are_at_start = SequenceExpr::with(AnchorStart) .then_third_person_singular_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("are") .t_any() .t_any(); map.insert(are_at_start, "is"); let arent = SequenceExpr::default() .then_third_person_singular_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("aren't") .t_any() .t_any(); map.insert(arent, "isn't"); let is = SequenceExpr::default() .then_kind_where(|kind| { kind.as_word() .as_ref() .and_then(|m| m.as_ref().and_then(|m| m.np_member)) .unwrap_or_default() }) .then_whitespace() .then_third_person_plural_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("is") .t_any() .t_any(); map.insert(is, "are"); let is_at_start = SequenceExpr::with(AnchorStart) .then_third_person_plural_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("is") .t_any() .t_any(); map.insert(is_at_start, "are"); let isnt = SequenceExpr::default() .then_third_person_plural_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("isn't") .t_any() .t_any(); map.insert(isnt, "aren't"); let was = SequenceExpr::default() .then_first_person_plural_pronoun() .then_optional(mod_term.clone()) .t_ws() .t_aco("was") .t_any() .t_any(); map.insert(was, "were"); // Special case for second and third-person let was_third = SequenceExpr::with(AnchorStart) .then_kind_either( TokenKind::is_third_person_plural_pronoun, TokenKind::is_second_person_pronoun, ) .then_optional(mod_term.clone()) .t_ws() .t_aco("was") .t_any() .t_any(); map.insert(was_third, "were"); let were = SequenceExpr::with(AnchorStart) .then_kind_either( TokenKind::is_first_person_singular_pronoun, TokenKind::is_third_person_singular_pronoun, ) .then_optional(mod_term.clone()) .t_ws() .t_aco("were") .t_any() .t_any(); map.insert(were, "was"); let map = Lrc::new(map); let mut all = All::default(); all.add(map.clone()); all.add(|tok: &Token, _: &[char]| tok.kind.is_upos(UPOS::PRON)); Self { expr: all, map } } } impl Default for PronounInflectionBe { fn default() -> Self { Self::new() } } impl ExprLinter for PronounInflectionBe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.get_rel(-3)?.span; // Determine the correct inflection of "be". let correct = self.map.lookup(0, matched_tokens, source)?; Some(Lint { span, lint_kind: LintKind::Agreement, suggestions: vec![Suggestion::replace_with_match_case_str( correct, span.get_content(source), )], message: "Make the verb agree with its subject.".to_owned(), priority: 30, }) } fn description(&self) -> &str { "Checks subject–verb agreement for the verb `be`. Third-person singular \ pronouns (`he`, `she`, `it`) require the singular form `is`, while the \ plural pronoun `they` takes `are`. The linter flags mismatches such as \ `He are` or `They is` and offers the correct concord." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::PronounInflectionBe; #[test] fn corrects_he_are() { assert_suggestion_result( "He are my best friend.", PronounInflectionBe::default(), "He is my best friend.", ); } #[test] fn corrects_she_are() { assert_suggestion_result( "She are my best friend.", PronounInflectionBe::default(), "She is my best friend.", ); } #[test] fn corrects_they_is() { assert_suggestion_result( "They is my best friend.", PronounInflectionBe::default(), "They are my best friend.", ); } #[test] fn allows_they_are() { assert_lint_count( "They are my best friend.", PronounInflectionBe::default(), 0, ); } #[test] fn corrects_it_are() { assert_suggestion_result( "It are on the table.", PronounInflectionBe::default(), "It is on the table.", ); } #[test] fn corrects_he_are_negation() { assert_suggestion_result( "He are not amused.", PronounInflectionBe::default(), "He is not amused.", ); } #[test] fn corrects_she_are_progressive() { assert_suggestion_result( "She are going to win.", PronounInflectionBe::default(), "She is going to win.", ); } #[test] fn corrects_they_is_negation() { assert_suggestion_result( "They is not ready.", PronounInflectionBe::default(), "They are not ready.", ); } #[test] fn corrects_they_is_progressive() { assert_suggestion_result( "They is planning a trip.", PronounInflectionBe::default(), "They are planning a trip.", ); } #[test] fn allows_he_is() { assert_lint_count("He is my best friend.", PronounInflectionBe::default(), 0); } #[test] fn allows_she_is_lowercase() { assert_lint_count("she is excited to go.", PronounInflectionBe::default(), 0); } #[test] fn allows_it_is() { assert_lint_count("It is what it is.", PronounInflectionBe::default(), 0); } #[test] fn allows_they_are_negation() { assert_lint_count( "They are not interested.", PronounInflectionBe::default(), 0, ); } #[test] fn allows_they_were() { assert_lint_count("They were already here.", PronounInflectionBe::default(), 0); } #[test] fn allows_asdf_is() { assert_lint_count("asdf is not a word", PronounInflectionBe::default(), 0); } #[test] fn no_subject() { assert_lint_count("is set", PronounInflectionBe::default(), 0); } #[test] fn corrects_i_were() { assert_suggestion_result( "I were the best player on the field.", PronounInflectionBe::default(), "I was the best player on the field.", ); } #[test] fn corrects_we_was() { assert_suggestion_result( "We was the best players on the field.", PronounInflectionBe::default(), "We were the best players on the field.", ); } #[test] fn corrects_you_was() { assert_suggestion_result( "You was my best friend.", PronounInflectionBe::default(), "You were my best friend.", ); } #[test] fn allows_you_were() { assert_lint_count( "You were my best friend.", PronounInflectionBe::default(), 0, ); } #[test] fn corrects_he_were() { assert_suggestion_result( "He were late.", PronounInflectionBe::default(), "He was late.", ); } #[test] fn corrects_they_was() { assert_suggestion_result( "They was on time.", PronounInflectionBe::default(), "They were on time.", ); } #[test] fn allows_he_was() { assert_lint_count("He was here.", PronounInflectionBe::default(), 0); } #[test] fn allows_we_were() { assert_lint_count("We were excited.", PronounInflectionBe::default(), 0); } #[test] fn corrects_he_arent() { assert_suggestion_result( "He aren't ready.", PronounInflectionBe::default(), "He isn't ready.", ); } #[test] fn corrects_they_isnt() { assert_suggestion_result( "They isn't coming.", PronounInflectionBe::default(), "They aren't coming.", ); } #[test] fn allows_he_isnt() { assert_lint_count("He isn't ready.", PronounInflectionBe::default(), 0); } #[test] fn allows_they_arent() { assert_lint_count("They aren't coming.", PronounInflectionBe::default(), 0); } #[test] fn corrects_she_really_are() { assert_suggestion_result( "She really are talented.", PronounInflectionBe::default(), "She really is talented.", ); } #[test] fn corrects_they_often_is() { assert_suggestion_result( "They often is late.", PronounInflectionBe::default(), "They often are late.", ); } #[test] fn corrects_because_he_are() { assert_suggestion_result( "because he are tired.", PronounInflectionBe::default(), "because he is tired.", ); } #[test] fn allow_behind_him() { assert_no_lints( "Behind him are new shadows.", PronounInflectionBe::default(), ); } #[test] fn issue_1682() { assert_no_lints( "Understanding them is significant", PronounInflectionBe::default(), ); } } ================================================ FILE: harper-core/src/linting/pronoun_knew.rs ================================================ use harper_brill::UPOS; use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct PronounKnew { expr: LongestMatchOf, } trait PronounKnewExt { fn then_pronoun(self) -> Self; } impl Default for PronounKnew { fn default() -> Self { // The pronoun that would occur before a verb would be a subject pronoun. // But "its" commonly occurs before "new" and is a possessive pronoun. (Much more commonly a determiner) // Since "his" and "her" are possessive and object pronouns respectively, we ignore them too. let pronoun_pattern = |tok: &Token, source: &[char]| { if !tok.kind.is_upos(UPOS::PRON) { return false; } if tok.kind.is_possessive_determiner() || !tok.kind.is_pronoun() { return false; } let pronorm = tok.span.get_content_string(source).to_lowercase(); let excluded = ["every", "something", "nothing"]; !excluded.contains(&&*pronorm) }; let pronoun_then_new = SequenceExpr::with(pronoun_pattern) .then_whitespace() .then_any_capitalization_of("new"); let pronoun_adverb_then_new = SequenceExpr::with(pronoun_pattern) .then_whitespace() .then_word_set(&["always", "never", "also", "often"]) .then_whitespace() .then_any_capitalization_of("new"); let combined_pattern = LongestMatchOf::new(vec![ Box::new(pronoun_then_new), Box::new(pronoun_adverb_then_new), ]); Self { expr: combined_pattern, } } } impl ExprLinter for PronounKnew { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let typo_token = tokens.last()?; let typo_span = typo_token.span; let typo_text = typo_span.get_content(source); Some(Lint { span: typo_span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( "knew".chars().collect(), typo_text, )], message: "Did you mean “knew” (the past tense of “know”)?".to_string(), priority: 31, }) } fn description(&self) -> &str { "Detects when “new” following a pronoun (optionally with an adverb) is a typo for the past tense “knew.”" } } #[cfg(test)] mod tests { use super::PronounKnew; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn simple_pronoun_new() { assert_suggestion_result( "I new you would say that.", PronounKnew::default(), "I knew you would say that.", ); } #[test] fn with_adverb() { assert_suggestion_result( "She often new the answer.", PronounKnew::default(), "She often knew the answer.", ); } #[test] fn does_not_flag_without_pronoun() { assert_lint_count("The software is new.", PronounKnew::default(), 0); } #[test] fn does_not_flag_other_context() { assert_lint_count("They called it \"new\".", PronounKnew::default(), 0); } #[test] fn does_not_flag_with_its() { assert_lint_count( "In 2015, the US was paying on average around 2% for its new issuance bonds.", PronounKnew::default(), 0, ); } #[test] fn does_not_flag_with_his() { assert_lint_count("His new car is fast.", PronounKnew::default(), 0); } #[test] fn does_not_flag_with_her() { assert_lint_count("Her new car is fast.", PronounKnew::default(), 0); } #[test] fn does_not_flag_with_nothing_1298() { assert_lint_count("This is nothing new.", PronounKnew::default(), 0); } #[test] fn issue_1381_tricks() { assert_lint_count("To learn some new tricks.", PronounKnew::default(), 0); } #[test] fn issue_1381_template() { assert_lint_count( "Let's build this new template function.", PronounKnew::default(), 0, ); } #[test] fn issue_1381_file() { assert_lint_count( "Move the function definition inside of that new file.", PronounKnew::default(), 0, ); } #[test] fn fixes_i_knew_what() { assert_suggestion_result( "I new what to do.", PronounKnew::default(), "I knew what to do.", ); } #[test] fn fixes_she_knew_what() { assert_suggestion_result( "She new what to do.", PronounKnew::default(), "She knew what to do.", ); } #[test] fn flags_she_new_danger() { assert_lint_count("She new danger lurked nearby.", PronounKnew::default(), 1); } #[test] fn allows_issue_1518() { assert_no_lints("If you're new to GitHub, welcome.", PronounKnew::default()); } } ================================================ FILE: harper-core/src/linting/pronoun_verb_agreement.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenKind, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, }; static NON_MODAL_AUX: &[&str] = &[ "do", "don't", "does", "doesn't", "have", "has", "haven't", "hasn't", "dont", "doesnt", "havent", "hasnt", ]; static IRREGULAR: &[(&str, &str)] = &[("don't", "doesn't"), ("have", "has"), ("haven't", "hasn't")]; static SUBJUNCTIVE: &[&str] = &[ // "if" and "that" can take the subjunctive mood: "if he go", "that he go" - as in the US constitution // "if" TODO: "if" is more complicated to support than "that" "that", // Verbs that take the subjunctive mood can omit the "that": "demanded", "demanding", "insisted", "insisting", "recommended", "recommending", "requested", "requesting", "suggested", "suggesting", ]; static DITRANSITIVE: &[&str] = &[ "give", "gave", "given", "gives", "giving", "lose", "lost", "loses", "losing", ]; pub struct PronounVerbAgreement { expr: FirstMatchOf, dict: D, } impl PronounVerbAgreement where D: Dictionary, { pub fn new(dict: D) -> Self { // TODO: allowing "you" leads to false positives: // "8 years to give you rewards", "all I can do is give you examples" let non_3p_sing_pres_pron_with_3p_sing_pres_verb = SequenceExpr::default() .then_kind_both_but_not( ( TokenKind::is_personal_pronoun, TokenKind::is_subject_pronoun, ), TokenKind::is_third_person_singular_pronoun, ) .t_ws() // NOTE: allowing verbs that are also nouns leads to false positives: // "Are they colors or colours?" // "8 years to give you rewards" // "all I can do is give you examples" .then_verb_third_person_singular_present_form(); // NOTE: But excluding them causes many more false positives: // boxes, does, drops, flies, gets, goes, likes, site, wakes // .then_kind_where(|k| k.is_verb_third_person_singular_present_form() && !k.is_plural_noun()); let third_person_sing_pres_pron = |t: &Token, _: &[char]| { t.kind.is_subject_pronoun() && !t.kind.is_object_pronoun() && t.kind.is_personal_pronoun() && t.kind.is_third_person_singular_pronoun() && !t.kind.is_plural_pronoun() }; let verb_lemma = |t: &Token, src: &[char]| { t.kind.is_verb_lemma() && !t.kind.is_verb_third_person_singular_present_form() && !t.kind.is_verb_simple_past_form() // eg. not "put" && !t.kind.is_adverb() // eg. not "even" && !t.kind.is_conjunction() // "and" && (!t.kind.is_auxiliary_verb() // "I go"≠"he goes" but "I can"="he can" // We don't want modals because they don't inflect, but we want the other auxiliaries. || t.span.get_content(src).eq_any_ignore_ascii_case_str(NON_MODAL_AUX)) }; Self { expr: FirstMatchOf::new(vec![ // One Expr for the "I walks" type: Box::new(non_3p_sing_pres_pron_with_3p_sing_pres_verb), // Two Expr's for the "he walk" type: Box::new( SequenceExpr::with(third_person_sing_pres_pron) .t_ws() .then(verb_lemma), ), Box::new(SequenceExpr::aco("it").t_ws().t_aco("don't")), ]), dict, } } fn third_person_singular_present_to_lemma(&self, form: &[char]) -> Vec> { let mut words: Vec> = Vec::new(); // -s if form.ends_with_ignore_ascii_case_chars(&['s']) { words.push(form[0..form.len() - 1].to_vec()); // -es if form.ends_with_ignore_ascii_case_chars(&['e', 's']) { words.push(form[0..form.len() - 2].to_vec()); // -ies -> -y if form.ends_with_ignore_ascii_case_chars(&['i', 'e', 's']) { words.push( format!("{}y", &form[0..form.len() - 3].iter().collect::()) .chars() .collect(), ); } } } if let Some((lemma, _)) = IRREGULAR .iter() .find(|(_, f)| form.eq_ignore_ascii_case_str(f)) { words.push(lemma.chars().collect::>()); } words .iter() .filter(|&w| { self.dict .get_word_metadata(w) .is_some_and(|md| md.is_verb_lemma()) }) .map(|w| w.to_vec()) .collect() } fn lemma_to_third_person_singular_present(&self, input: &str) -> Vec> { let mut words: Vec> = Vec::new(); words.push(format!("{input}s").chars().collect()); words.push(format!("{input}es").chars().collect()); if input.ends_with("y") { words.push( format!("{}ies", &input[0..input.len() - 1]) .chars() .collect(), ); } if let Some((_, form)) = IRREGULAR .iter() .find(|(lemma, _)| input.eq_ignore_ascii_case(lemma)) { words.push(form.chars().collect()); } words .iter() .filter(|&w| { self.dict .get_word_metadata(w) .is_some_and(|md| md.is_verb_third_person_singular_present_form()) }) .map(|w| w.to_vec()) .collect() } } impl ExprLinter for PronounVerbAgreement where D: Dictionary, { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { let pron_tok = &toks[0]; let is_3psg = pron_tok.kind.is_third_person_singular_pronoun(); let verb_tok = toks.last()?; if let Some((before, _)) = ctx && let [.., prev_word_tok, ws_tok] = before && ws_tok.kind.is_whitespace() { let prev_word = prev_word_tok.span.get_content(src); let is_exempt = if is_3psg { prev_word_tok.kind.is_auxiliary_verb() || prev_word.eq_any_ignore_ascii_case_str(SUBJUNCTIVE) } else if pron_tok.kind.is_subject_pronoun() { // Clause structure: (... in you) is ... ≠ you is // Look for "true" prepositions, not ones that are more like adverbial particles prev_word_tok.kind.is_preposition() && !prev_word.eq_ignore_ascii_case_str("up") // When the verb is ditransitive, the pronoun is object case, the verb position is actually a noun || (prev_word.eq_any_ignore_ascii_case_str(DITRANSITIVE) && verb_tok.kind.is_noun()) } else { false }; if is_exempt { return None; } } let verb_span = verb_tok.span; let verb_chars = verb_tok.span.get_content(src); let verb_str = verb_tok.span.get_content_string(src); let suggs = if is_3psg { self.lemma_to_third_person_singular_present(&verb_str) } else { self.third_person_singular_present_to_lemma(verb_chars) }; let suggestions = suggs .into_iter() .map(|s| Suggestion::replace_with_match_case(s, verb_chars)) .collect(); Some(Lint { span: verb_span, lint_kind: LintKind::Agreement, suggestions, message: "The form of the verb must agree in grammatical number with the pronoun." .to_string(), ..Default::default() }) } fn description(&self) -> &str { "Ensures pronouns agree with their verbs." } } #[cfg(test)] mod lints { use super::PronounVerbAgreement; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use crate::spell::FstDictionary; // Expected to be fixed, but there are exceptions #[test] fn issue_233_1() { assert_suggestion_result( "I likes this place.", PronounVerbAgreement::new(FstDictionary::curated()), "I like this place.", ); } #[test] fn issue_233_2() { assert_suggestion_result( "I sits under the AC.", PronounVerbAgreement::new(FstDictionary::curated()), "I sit under the AC.", ); } #[test] #[ignore = "because 'like' is an adjective as well as a verb."] fn issue_233_1_reverse() { assert_suggestion_result( "He like this place.", PronounVerbAgreement::new(FstDictionary::curated()), "He likes this place.", ); } #[test] fn why_we_cant_flag_like_yet() { assert_no_lints( "What is he like?", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn issue_233_2_reverse() { assert_suggestion_result( "She sit under the AC.", PronounVerbAgreement::new(FstDictionary::curated()), "She sits under the AC.", ); } #[test] fn dont_flag_correct_agreement() { assert_no_lints( "He likes this place. I sit under the AC.", PronounVerbAgreement::new(FstDictionary::curated()), ); } // Every pronoun systematically // Expected to get corrected #[test] fn fixes_i() { assert_suggestion_result( "I wakes up.", PronounVerbAgreement::new(FstDictionary::curated()), "I wake up.", ); } #[test] fn fixes_we() { assert_suggestion_result( "We gets dressed.", PronounVerbAgreement::new(FstDictionary::curated()), "We get dressed.", ); } #[test] fn fixes_you() { assert_suggestion_result( "You drops off the kids.", PronounVerbAgreement::new(FstDictionary::curated()), "You drop off the kids.", ); } #[test] fn fixes_he() { assert_suggestion_result( "He work hard.", PronounVerbAgreement::new(FstDictionary::curated()), "He works hard.", ); } #[test] fn fixes_she() { assert_suggestion_result( "She study hard.", PronounVerbAgreement::new(FstDictionary::curated()), "She studies hard.", ); } #[test] #[ignore = "Becasue 'it' is also object case. Eg. 'watch it break down'"] fn we_cant_fix_it_yet() { assert_suggestion_result( "It break down.", PronounVerbAgreement::new(FstDictionary::curated()), "It breaks down.", ); } #[test] fn why_we_cant_fix_it_yet() { assert_no_lints( "I heard it break down.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn fixes_they() { assert_suggestion_result( "They repairs it.", PronounVerbAgreement::new(FstDictionary::curated()), "They repair it.", ) } // Correct phrases that are expected not to get corrected #[test] fn dont_flag_i() { assert_no_lints("I eat", PronounVerbAgreement::new(FstDictionary::curated())); } #[test] fn dont_flag_we() { assert_no_lints( "We drink", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn dont_flag_you() { assert_no_lints( "You walk", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn dont_flag_he() { assert_no_lints( "He runs", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn dont_flag_she() { assert_no_lints( "She swims", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn dont_flag_it() { assert_no_lints( "It works!", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn dont_flag_they() { assert_no_lints( "They finish", PronounVerbAgreement::new(FstDictionary::curated()), ); } // Ceck changing verb endings // -ies ↔ -y #[test] fn fix_flies() { assert_suggestion_result( "I flies", PronounVerbAgreement::new(FstDictionary::curated()), "I fly", ); } #[test] fn fix_cry() { assert_suggestion_result( "He cry", PronounVerbAgreement::new(FstDictionary::curated()), "He cries", ); } // -o ↔ -oes #[test] fn fix_go() { assert_suggestion_result( "She go", PronounVerbAgreement::new(FstDictionary::curated()), "She goes", ); } #[test] fn fix_goes() { assert_suggestion_result( "They goes", PronounVerbAgreement::new(FstDictionary::curated()), "They go", ); } // Check irregular changes // has ↔ have #[test] fn fix_has() { assert_suggestion_result( "You has", PronounVerbAgreement::new(FstDictionary::curated()), "You have", ); } #[test] fn fix_have() { assert_suggestion_result( "She have", PronounVerbAgreement::new(FstDictionary::curated()), "She has", ); } // hasn't ↔ haven't #[test] fn fix_hasnt() { assert_suggestion_result( "You hasn't", PronounVerbAgreement::new(FstDictionary::curated()), "You haven't", ); } #[test] fn fix_havent() { assert_suggestion_result( "He haven't", PronounVerbAgreement::new(FstDictionary::curated()), "He hasn't", ); } // -es #[test] fn fix_box() { assert_suggestion_result( "He box", PronounVerbAgreement::new(FstDictionary::curated()), "He boxes", ); } #[test] fn fix_boxes() { assert_suggestion_result( "You boxes", PronounVerbAgreement::new(FstDictionary::curated()), "You box", ); } // TODO: Are there any double consonant endings to change? // TODO: Are there any f ↔ v endings to change? // Negative contractions // doesn't ↔ don't #[test] fn fix_doesnt() { assert_suggestion_result( "We doesn't", PronounVerbAgreement::new(FstDictionary::curated()), "We don't", ); } #[test] // Note: This requires a dedicated branch of the `[Expr]` fn fix_dont() { assert_suggestion_result( "It don't", PronounVerbAgreement::new(FstDictionary::curated()), "It doesn't", ); } // Does do ↔ does behave differently to box ↔ boxes due to being an auxiliary verb? #[test] fn fix_do() { assert_suggestion_result( "He do", PronounVerbAgreement::new(FstDictionary::curated()), "He does", ); } #[test] fn fix_does() { assert_suggestion_result( "You does", PronounVerbAgreement::new(FstDictionary::curated()), "You do", ); } // False positives found by Elijah #[test] fn false_positive_she_consider() { assert_no_lints( "On April 10th, I suggested she consider a smaller, more intimate gathering.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_she_sell() { assert_no_lints( "I suggested she sell it and use the proceeds to help with her relocation expenses, or perhaps rent a similar camera while in Barcelona.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_she_rent() { assert_no_lints( "I suggested she sell it and use the proceeds to help with her relocation expenses, or perhaps rent a similar camera while in Barcelona.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_he_donned() { assert_no_lints( "He donned his heavy oilskins and descended the winding staircase, his boots echoing in the hollow tower.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_he_cannot() { assert_no_lints( "Surely, he cannot offer the same sum as the developers.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_insisting_she_return() { assert_no_lints( "Am I the asshole for insisting she return the dress?", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_pride_in_you_is() { assert_no_lints( "It’s also important to recognize that your family's pride in you is a genuine reflection of your value.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_she_sought() { assert_no_lints( "She sought out Mrs. Hawthorne, the village’s oldest resident, a woman known for her vast knowledge of local history and her unsettlingly accurate intuition.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_lose_you_points() { assert_no_lints( "I admire your dedication to consistently drafting players who are actively trying to lose you points.", PronounVerbAgreement::new(FstDictionary::curated()), ); } #[test] fn false_positive_she_hung_up() { assert_no_lints( "When I reiterated the conditions I'd previously set, she hung up on me.", PronounVerbAgreement::new(FstDictionary::curated()), ); } } ================================================ FILE: harper-core/src/linting/proper_noun_capitalization_linters.rs ================================================ use crate::expr::{Expr, ExprMap, FixedPhrase}; use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use super::{ExprLinter, LintGroup}; use super::{Lint, LintKind, Suggestion}; use crate::Document; use crate::linting::expr_linter::Chunk; use crate::parsers::PlainEnglish; use crate::spell::Dictionary; use crate::{Token, TokenStringExt}; use std::sync::Arc; /// A linter that corrects the capitalization of multi-word proper nouns. /// They are corrected to a "canonical capitalization" provided at construction. /// /// If you would like to add a proper noun to Harper, see `proper_noun_rules.json`. pub struct ProperNounCapitalizationLinter { pattern_map: ExprMap, description: String, dictionary: Arc, } impl ProperNounCapitalizationLinter { /// Create a linter that corrects the capitalization of phrases provided. pub fn new_strs( canonical_versions: impl IntoIterator>, description: impl ToString, dictionary: D, ) -> Self { let dictionary = Arc::new(dictionary); let mut expr_map = ExprMap::default(); for can_vers in canonical_versions { let doc = Document::new_basic_tokenize(can_vers.as_ref(), &PlainEnglish); let expr = FixedPhrase::from_document(&doc); expr_map.insert(expr, doc); } Self { pattern_map: expr_map, dictionary: dictionary.clone(), description: description.to_string(), } } } impl ExprLinter for ProperNounCapitalizationLinter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.pattern_map } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let canonical_case = self.pattern_map.lookup(0, matched_tokens, source).unwrap(); let mut broken = false; for (err_token, correct_token) in matched_tokens.iter().zip(canonical_case.fat_tokens()) { let err_chars = err_token.span.get_content(source); if err_chars != correct_token.content { broken = true; break; } } if !broken { return None; } Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith( canonical_case.get_source().to_vec(), )], message: self.description.to_string(), priority: 31, }) } fn description(&self) -> &str { self.description.as_str() } } #[derive(Serialize, Deserialize)] struct RuleEntry { canonical: Vec, description: String, } /// For the time being, this panics on invalid JSON. /// Do not use with user provided JSON. fn lint_group_from_json(json: &str, dictionary: Arc) -> LintGroup { let mut group = LintGroup::empty(); let rules: HashMap = serde_json::from_str(json).unwrap(); for (key, rule) in rules.into_iter() { group.add_chunk_expr_linter( key, Box::new(ProperNounCapitalizationLinter::new_strs( rule.canonical, rule.description, dictionary.clone(), )), ); } group.set_all_rules_to(Some(true)); group } pub fn lint_group(dictionary: Arc) -> LintGroup { lint_group_from_json(include_str!("../../proper_noun_rules.json"), dictionary) } #[cfg(test)] mod tests { use super::lint_group; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use crate::spell::FstDictionary; #[test] fn americas_lowercase() { assert_suggestion_result( "south america", lint_group(FstDictionary::curated()), "South America", ); assert_suggestion_result( "north america", lint_group(FstDictionary::curated()), "North America", ); } #[test] fn americas_uppercase() { assert_suggestion_result( "SOUTH AMERICA", lint_group(FstDictionary::curated()), "South America", ); assert_suggestion_result( "NORTH AMERICA", lint_group(FstDictionary::curated()), "North America", ); } #[test] fn americas_allow_correct() { assert_lint_count("South America", lint_group(FstDictionary::curated()), 0); assert_lint_count("North America", lint_group(FstDictionary::curated()), 0); } #[test] fn issue_798() { assert_suggestion_result( "The United states is a big country.", lint_group(FstDictionary::curated()), "The United States is a big country.", ); } #[test] fn united_nations_uppercase() { assert_suggestion_result( "UNITED NATIONS", lint_group(FstDictionary::curated()), "United Nations", ); } #[test] fn united_arab_emirates_lowercase() { assert_suggestion_result( "UNITED ARAB EMIRATES", lint_group(FstDictionary::curated()), "United Arab Emirates", ); } #[test] fn united_nations_allow_correct() { assert_lint_count("United Nations", lint_group(FstDictionary::curated()), 0); } #[test] fn meta_allow_correct() { assert_lint_count("Meta Quest", lint_group(FstDictionary::curated()), 0); } #[test] fn microsoft_lowercase() { assert_suggestion_result( "microsoft visual studio", lint_group(FstDictionary::curated()), "Microsoft Visual Studio", ); } #[test] fn microsoft_first_word_is_correct() { assert_suggestion_result( "Microsoft visual studio", lint_group(FstDictionary::curated()), "Microsoft Visual Studio", ); } #[test] fn test_atlantic_ocean_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("atlantic ocean", lint_group(dictionary), "Atlantic Ocean"); } #[test] fn test_pacific_ocean_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("pacific ocean", lint_group(dictionary), "Pacific Ocean"); } #[test] fn test_indian_ocean_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("indian ocean", lint_group(dictionary), "Indian Ocean"); } #[test] fn test_southern_ocean_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("southern ocean", lint_group(dictionary), "Southern Ocean"); } #[test] fn test_arctic_ocean_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("arctic ocean", lint_group(dictionary), "Arctic Ocean"); } #[test] fn test_mediterranean_sea_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result( "mediterranean sea", lint_group(dictionary), "Mediterranean Sea", ); } #[test] fn test_caribbean_sea_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("caribbean sea", lint_group(dictionary), "Caribbean Sea"); } #[test] fn test_south_china_sea_lowercase() { let dictionary = FstDictionary::curated(); assert_suggestion_result("south china sea", lint_group(dictionary), "South China Sea"); } #[test] fn test_atlantic_ocean_correct() { let dictionary = FstDictionary::curated(); assert_lint_count("Atlantic Ocean", lint_group(dictionary), 0); } #[test] fn test_pacific_ocean_correct() { let dictionary = FstDictionary::curated(); assert_lint_count("Pacific Ocean", lint_group(dictionary), 0); } #[test] fn test_indian_ocean_correct() { let dictionary = FstDictionary::curated(); assert_lint_count("Indian Ocean", lint_group(dictionary), 0); } #[test] fn test_mediterranean_sea_correct() { let dictionary = FstDictionary::curated(); assert_lint_count("Mediterranean Sea", lint_group(dictionary), 0); } #[test] fn test_south_china_sea_correct() { let dictionary = FstDictionary::curated(); assert_lint_count("South China Sea", lint_group(dictionary), 0); } #[test] fn day_one_in_sentence() { assert_suggestion_result( "I love day one. It is the best journaling app.", lint_group(FstDictionary::curated()), "I love Day One. It is the best journaling app.", ); } #[test] fn gilded_age_in_sentence() { assert_suggestion_result( "Mani-Chess Destiny is a JavaScript based computer game built off of chess, but in the style of the gilded age.", lint_group(FstDictionary::curated()), "Mani-Chess Destiny is a JavaScript based computer game built off of chess, but in the style of the Gilded Age.", ); } } ================================================ FILE: harper-core/src/linting/quantifier_needs_of.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; /// Flags phrases like `a couple months` → should be `a couple **of** months`. pub struct QuantifierNeedsOf { expr: SequenceExpr, } impl Default for QuantifierNeedsOf { fn default() -> Self { let expr = SequenceExpr::default() .then_indefinite_article() .t_ws() .then_word_set(&["couple", "lot"]) .t_ws() .then_plural_nominal(); Self { expr } } } impl ExprLinter for QuantifierNeedsOf { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { Some(Lint { span: matched_tokens.get(2)?.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::InsertAfter(" of".chars().collect())], message: "Add `of` in this quantity phrase.".to_owned(), priority: 32, }) } fn description(&self) -> &'static str { "Detects missing `of` after the quantifier “a couple” when it precedes a plural noun" } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::QuantifierNeedsOf; #[test] fn fixes_a_couple_months() { assert_suggestion_result( "A couple months ago...", QuantifierNeedsOf::default(), "A couple of months ago...", ); } #[test] fn fixes_a_couple_weeks() { assert_suggestion_result( "A couple weeks ago...", QuantifierNeedsOf::default(), "A couple of weeks ago...", ); } #[test] fn fixes_a_couple_days() { assert_suggestion_result( "A couple days ago...", QuantifierNeedsOf::default(), "A couple of days ago...", ); } #[test] fn fixes_a_couple_seconds() { assert_suggestion_result( "A couple seconds ago...", QuantifierNeedsOf::default(), "A couple of seconds ago...", ); } #[test] fn fixes_a_couple_minutes() { assert_suggestion_result( "A couple minutes ago...", QuantifierNeedsOf::default(), "A couple of minutes ago...", ); } #[test] fn fixes_a_couple_houses() { assert_suggestion_result( "A couple houses ago...", QuantifierNeedsOf::default(), "A couple of houses ago...", ); } #[test] fn fixes_a_couple_centuries() { assert_suggestion_result( "A couple centuries ago...", QuantifierNeedsOf::default(), "A couple of centuries ago...", ); } #[test] fn fixes_a_couple_people() { assert_suggestion_result( "I saw a couple people walk by a few minutes ago.", QuantifierNeedsOf::default(), "I saw a couple of people walk by a few minutes ago.", ); } } ================================================ FILE: harper-core/src/linting/quantifier_numeral_conflict.rs ================================================ use crate::expr::{All, Expr, SequenceExpr, SpelledNumberExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, LintKind, Suggestion}; use crate::patterns::{NominalPhrase, WordSet}; use crate::token_string_ext::TokenStringExt; use crate::{CharStringExt, Lint, Token}; pub struct QuantifierNumeralConflict { expr: All, } impl Default for QuantifierNumeralConflict { fn default() -> Self { Self { expr: All::new(vec![ Box::new( SequenceExpr::default() .then_quantifier() .t_ws() .then_longest_of(vec![ Box::new(SpelledNumberExpr), Box::new(SequenceExpr::default().then_cardinal_number()), ]), ), Box::new(SequenceExpr::unless(SequenceExpr::any_of(vec![ Box::new(WordSet::new(&["all", "any", "every", "no"])), Box::new( SequenceExpr::word_set(&["each", "some"]) .t_ws() .t_aco("one"), ), ]))), ]), } } } impl ExprLinter for QuantifierNumeralConflict { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { // If there's a hyphen straight after the number it's probably part of a compound if let Some((_, [next_tok, ..])) = ctx && next_tok.kind.is_hyphen() { return None; } let qtok = toks.first().unwrap(); let quant = qtok.span.get_content_string(src); // Handle special cases for "least", "most", "each", and "both" match quant.to_ascii_lowercase().as_str() { "least" | "most" => { if let Some((previous, _)) = ctx && let [.., prev_word, prev_space] = previous && prev_space.kind.is_whitespace() && prev_word.kind.is_word() && prev_word .span .get_content(src) .eq_ignore_ascii_case_chars(&['a', 't']) { return None; } } "each" => { return Some(Lint { span: qtok.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( "every".chars().collect(), qtok.span.get_content(src), )], message: "Use 'every' instead of 'each' before a number.".to_owned(), ..Default::default() }); } "both" => { if let Some((_, following)) = ctx && let Some(noun_phrase_span) = NominalPhrase.run(1, following, src) && let [ws, conj, ..] = following.get(noun_phrase_span.end..).unwrap_or(&[]) && ws.kind.is_whitespace() && conj.kind.is_conjunction() && conj .span .get_content_string(src) .eq_ignore_ascii_case("and") { return None; } } _ => {} // Continue with the default case } Some(Lint { span: toks.span()?, lint_kind: LintKind::Grammar, suggestions: vec![], message: format!("The word '{quant}' should not be used before a number."), ..Default::default() }) } fn description(&self) -> &'static str { "Detects quantifier-numeral conflicts" } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::QuantifierNumeralConflict; #[test] fn flag_several_two() { assert_lint_count( "A few minutes ago, there was an outage due to several two hosts being down at the same time.", QuantifierNumeralConflict::default(), 1, ); } #[test] fn dont_flag_at_least() { assert_no_lints( "Serving a company that encourages the \"996\" work schedule usually means working for at least 60 hours per week.", QuantifierNumeralConflict::default(), ); } #[test] fn dont_flag_at_most() { assert_no_lints( "But don't worry, the second machine takes at most 3 years.", QuantifierNumeralConflict::default(), ); } #[test] fn dont_flag_both_32_bit_and_64_bit() { assert_no_lints( "Both 32 bit and 64 bit architectures are supported.", QuantifierNumeralConflict::default(), ); } #[test] fn dont_flag_more_1_click() { assert_no_lints( "For more 1-click cloud deployments, see [Cloud Deployment", QuantifierNumeralConflict::default(), ); } #[test] fn correct_each_2() { assert_suggestion_result( "OSSEC by default run rootkit check each 2 hours.", QuantifierNumeralConflict::default(), "OSSEC by default run rootkit check every 2 hours.", ); } #[test] fn ignore_no_two_adjacent_characters_2486() { assert_no_lints( "No two adjacent characters are the same.", QuantifierNumeralConflict::default(), ); } } ================================================ FILE: harper-core/src/linting/quite_quiet.rs ================================================ use crate::expr::{Expr, FirstMatchOf, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::{CharStringExt, Token, TokenKind, TokenStringExt}; pub struct QuiteQuiet { expr: FirstMatchOf, } impl Default for QuiteQuiet { fn default() -> Self { let quiet_word = SequenceExpr::default() .t_aco("quiet") .t_ws() .then_kind_any_but_not_except( &[ TokenKind::is_adjective, TokenKind::is_adverb, TokenKind::is_verb, ] as &[_], TokenKind::is_noun, &["here", "up"], ); let negative_contraction_quiet = SequenceExpr::with(|tok: &Token, src: &[char]| { if !tok.kind.is_verb() || !tok.kind.is_apostrophized() { return false; } tok.span .get_content(src) .ends_with_any_ignore_ascii_case_chars(&[&['n', '\'', 't'], &['n', '’', 't']]) }) .t_ws() .t_aco("quiet"); let adverb_quite = SequenceExpr::default() .then_kind_except( TokenKind::is_adverb, &["actually", "never", "not", "really", "generally"], ) .t_ws() .t_aco("quite"); Self { expr: FirstMatchOf::new(vec![ Box::new(quiet_word), Box::new(negative_contraction_quiet), Box::new(adverb_quite), ]), } } } impl ExprLinter for QuiteQuiet { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let text = toks.span()?.get_content_string(src).to_lowercase(); if text.ends_with("quite") { let quite_span = toks.last()?.span; return Some(Lint { span: quite_span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case( "quiet".chars().collect(), quite_span.get_content(src), )], message: "‘Quite’ might be a typo here. It means ‘rather’ but you might be trying to say ‘quiet’ (not noisy).".to_string(), priority: 63, }); } else if text.starts_with("quiet") { let quiet_span = toks.first()?.span; return Some(Lint { span: quiet_span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case( "quite".chars().collect(), quiet_span.get_content(src), )], message: "‘Quiet’ might be a typo here. It means ‘not noisy’ but you might be trying to say ‘quite’ (rather).".to_string(), priority: 63, }); } else if text.ends_with("quiet") { let quiet_span = toks.last()?.span; return Some(Lint { span: quiet_span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case( "quite".chars().collect(), quiet_span.get_content(src), )], message: "‘Quiet’ might be a typo here. It means ‘not noisy’ but you might be trying to say ‘quite’ (rather).".to_string(), priority: 63, }); } None } fn description(&self) -> &str { "Helps distinguish between ‘quiet’ (making ‘little noise’) and ‘quite’ (meaning ‘rather’)." } } #[cfg(test)] mod tests { use super::QuiteQuiet; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fix_quiet_adverb() { assert_suggestion_result( "Rendering videos 145 frames, with lightx loras for 2.1 i experience reboots quiet often.", QuiteQuiet::default(), "Rendering videos 145 frames, with lightx loras for 2.1 i experience reboots quite often.", ); } #[test] fn fix_quiet_adjective() { assert_suggestion_result( "... has been already reported multiple times and I find it quiet dumb that it still exists", QuiteQuiet::default(), "... has been already reported multiple times and I find it quite dumb that it still exists", ); } #[test] fn fix_very_quite() { assert_suggestion_result( "It's very quite here at night.", QuiteQuiet::default(), "It's very quiet here at night.", ); } #[test] fn fix_doesnt_quiet() { assert_suggestion_result("doesn't quiet", QuiteQuiet::default(), "doesn't quite"); } #[test] fn fix_doesnt_quiet_typographical_apostrophe() { assert_suggestion_result("doesn’t quiet", QuiteQuiet::default(), "doesn’t quite"); } #[test] fn fix_doesnt_quiet_in_context() { assert_suggestion_result( "When we got the car back into the workshop, we actually managed to get it running and driving, but it doesn't quiet run right, and doesn't really let me rev it.", QuiteQuiet::default(), "When we got the car back into the workshop, we actually managed to get it running and driving, but it doesn't quite run right, and doesn't really let me rev it.", ); } #[test] fn dont_flag_quiet_light() { assert_lint_count("The quiet lights in the houses", QuiteQuiet::default(), 0); } #[test] fn dont_flag_quiet_till() { assert_lint_count( "You’d better try and sit quiet till morning.", QuiteQuiet::default(), 0, ); } #[test] fn fix_cant_quiet() { assert_suggestion_result( "I can't quiet read it", QuiteQuiet::default(), "I can't quite read it", ); } #[test] fn fix_wont_quiet() { assert_suggestion_result( "It won't quiet fit", QuiteQuiet::default(), "It won't quite fit", ); } #[test] fn fix_couldnt_quiet() { assert_suggestion_result( "I couldn't quiet understand everything", QuiteQuiet::default(), "I couldn't quite understand everything", ); } #[test] fn fix_but_its_not_quite_clear_1956() { assert_no_lints("But it's not quite clear", QuiteQuiet::default()); } #[test] fn dont_flag_adv_quite_1971() { assert_no_lints( "It’s actually quite smart. It’s really quite smart. The proof is actually quite neat. Actually really quite simple. It’s actually quite strong. The Sneetches got really quite smart on that day.", QuiteQuiet::default(), ); } #[test] fn issue_2003() { assert_no_lints( "The namespaces are generally quite short", QuiteQuiet::default(), ); } } ================================================ FILE: harper-core/src/linting/quote_spacing.rs ================================================ use crate::expr::{ExprExt, SequenceExpr}; use crate::linting::LintKind; use crate::{Document, TokenStringExt}; use super::{Lint, Linter}; pub struct QuoteSpacing { expr: SequenceExpr, } impl QuoteSpacing { pub fn new() -> Self { Self { expr: SequenceExpr::any_word().then_quote().then_any_word(), } } } impl Default for QuoteSpacing { fn default() -> Self { Self::new() } } impl Linter for QuoteSpacing { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for m in self.expr.iter_matches_in_doc(document) { let matched_tokens = m.get_content(document.get_tokens()); let Some(span) = matched_tokens.span() else { continue; }; lints.push(Lint { span, lint_kind: LintKind::Formatting, suggestions: vec![], message: "A quote must be preceded or succeeded by a space.".to_owned(), priority: 31, }) } lints } fn description(&self) -> &str { "Checks that quotation marks are preceded or succeeded by whitespace." } } #[cfg(test)] mod tests { use super::QuoteSpacing; use crate::linting::tests::{assert_lint_count, assert_no_lints}; #[test] fn flags_missing_space_before_quote() { assert_lint_count("He said\"hello\" to me.", QuoteSpacing::default(), 1); } #[test] fn flags_missing_space_after_quote() { assert_lint_count( "She whispered \"hurry\"and left.", QuoteSpacing::default(), 1, ); } #[test] fn allows_quotes_with_spacing() { assert_no_lints("They shouted \"charge\" together.", QuoteSpacing::default()); } #[test] fn allows_quotes_at_end_of_sentence() { assert_no_lints("They shouted \"charge.\"", QuoteSpacing::default()); } } ================================================ FILE: harper-core/src/linting/reason_for_doing.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ ExprLinter, LintKind, Suggestion, expr_linter::{Chunk, preceded_by_word}, }, }; pub struct ReasonForDoing { expr: SequenceExpr, } impl Default for ReasonForDoing { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["reason", "reasons"]) .t_ws() .t_aco("of") .t_ws() .then_verb_progressive_form(), } } } impl ExprLinter for ReasonForDoing { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn description(&self) -> &str { "Corrects `reason of doing` to `reason for doing` etc." } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if toks.len() != 5 { return None; } const REASON: usize = 0; const OF: usize = 2; // let reasontok = &toks[REASON]; // let reasonspan = reasontok.span; let reasonchars = toks[REASON].span.get_content(src); // let oftok = &toks[OF]; let ofspan = toks[OF].span; // let ofchars = ofspan.get_content(src); // "for reasons of doing" is a legit construction. TODO: Usually, but not always! if reasonchars.last()? == &'s' && preceded_by_word(ctx, |t| { t.span .get_content(src) .eq_ignore_ascii_case_chars(&['f', 'o', 'r']) }) { return None; } Some(Lint { span: ofspan, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "for", ofspan.get_content(src), )], message: "Use 'for' instead of 'of' with 'reason' and progressive verbs.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::ReasonForDoing; #[test] fn fix_sg_of_doing() { assert_suggestion_result( "However i could not find any valid reason of doing this in one project, it's still possible.", ReasonForDoing::default(), "However i could not find any valid reason for doing this in one project, it's still possible.", ); } #[test] fn fix_pl_of_doing() { assert_suggestion_result( "It actually helped me a lot understanding what is your recommended way of implementing safe-listing and your reasons of doing it this way.", ReasonForDoing::default(), "It actually helped me a lot understanding what is your recommended way of implementing safe-listing and your reasons for doing it this way.", ); } #[test] fn fix_sg_of_having() { assert_suggestion_result( "what's the reason of having USE_INTERPOLATION_TABLES in UserParams then?", ReasonForDoing::default(), "what's the reason for having USE_INTERPOLATION_TABLES in UserParams then?", ); } #[test] fn fix_pl_of_having() { assert_suggestion_result( "Any reasons of having other implementation than specified in docs?", ReasonForDoing::default(), "Any reasons for having other implementation than specified in docs?", ); } #[test] fn ignore_for_reasons_of_logging() { assert_no_lints( "whether for reasons of logging, monitoring, etc.", ReasonForDoing::default(), ); } #[test] fn fix_sg_of_making() { assert_suggestion_result( "The fact is that I am seeing where is it being used and I cannot understand the reason of making it boolean.", ReasonForDoing::default(), "The fact is that I am seeing where is it being used and I cannot understand the reason for making it boolean.", ); } #[test] fn fix_pl_of_making() { assert_suggestion_result( "So for the reasons of making it self describable as much as possible, I think it is important to express version there.", ReasonForDoing::default(), "So for the reasons for making it self describable as much as possible, I think it is important to express version there.", ); } #[test] fn allow_for_reasons_of_making() { assert_no_lints( "That said, and just for reasons of making the simple-openai code more robust, one could verify that it is not null and throw the appropriate exceptions", ReasonForDoing::default(), ); } #[test] #[ignore = "Known false negative where we should't allow 'reasons of doing' just because it follows 'for'"] fn fix_for_reasons_of_doing_this() { assert_suggestion_result( "For reasons of doing this, it is because I have some ops that need to carefully sort their execution orders in not only forward pass", ReasonForDoing::default(), "For reasons for doing this, it is because I have some ops that need to carefully sort their execution orders in not only forward pass", ); } #[test] fn fix_sg_of_needing() { assert_suggestion_result( "I just came to the same conclusion for the same reason of needing a scoped dependency in my DbContext to support global query filtering.", ReasonForDoing::default(), "I just came to the same conclusion for the same reason for needing a scoped dependency in my DbContext to support global query filtering.", ); } #[test] fn fix_sg_of_opening() { assert_suggestion_result( "Hi, What is reason of opening DB exception \"UnknownError: Internal error opening backing store for indexedDB\"?", ReasonForDoing::default(), "Hi, What is reason for opening DB exception \"UnknownError: Internal error opening backing store for indexedDB\"?", ); } #[test] fn fix_sg_of_saving() { assert_suggestion_result( "be notified about document save events with source/reason of saving", ReasonForDoing::default(), "be notified about document save events with source/reason for saving", ); } #[test] fn fix_sg_of_wanting() { assert_suggestion_result( "How do you use Severity and what is the impact/reason of wanting to having different values to you (i.e. what difference does it make to you)?", ReasonForDoing::default(), "How do you use Severity and what is the impact/reason for wanting to having different values to you (i.e. what difference does it make to you)?", ); } #[test] #[ignore = "We don't yet handle words between 'for' and 'reasons of'"] fn allow_for_reasons_of_wanting() { assert_no_lints( "Ideally we don't want to reduce the idleTimeout (currently set to 120s) for the standard reasons of wanting to be able to handle bursty traffic.", ReasonForDoing::default(), ); } } ================================================ FILE: harper-core/src/linting/redundant_acronyms.rs ================================================ use crate::{ CharStringExt, Token, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, patterns::Word, token_string_ext::TokenStringExt, }; // (acronym, first_words, last_word) const ACRONYMS: &[(&str, &[&str], &str)] = &[ ("ATM", &["automated teller", "automatic teller"], "machine"), ("GUI", &["graphical user"], "interface"), ("LCD", &["liquid crystal"], "display"), // Note: "pin number" (not capitalized) is used to refer to GPIO pins etc. ("PIN", &["personal identification"], "number"), ("TUI", &["text-based user", "terminal user"], "interface"), ("UI", &["user"], "interface"), ("VIN", &["vehicle identification"], "number"), ]; pub struct RedundantAcronyms { expr: FirstMatchOf, } impl Default for RedundantAcronyms { fn default() -> Self { let exprs: Vec> = ACRONYMS .iter() .map(|&(acronym, _, last_str)| { let last_string = last_str.to_string(); Box::new(SequenceExpr::aco(acronym).t_ws().then_any_of(vec![ Box::new(Word::new(last_str)), Box::new(move |t: &Token, src: &[char]| { t.span .get_content(src) .eq_ignore_ascii_case_str(&format!("{last_string}s")) }), ])) as Box }) .collect(); Self { expr: FirstMatchOf::new(exprs), } } } impl ExprLinter for RedundantAcronyms { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let last_word_span = toks.last()?.span; let last_word_chars = last_word_span.get_content(src); let acronym_str = toks.first()?.span.get_content_string(src); // "pin number" (lowercase) is used to refer to the pins on microchips, etc. if acronym_str.eq_ignore_ascii_case("PIN") && acronym_str != "PIN" { return None; } let (_, middle_words, _) = ACRONYMS .iter() .find(|(a, _, _)| (*a).eq_ignore_ascii_case(&acronym_str))?; let is_all_caps = last_word_chars .iter() .all(|c| c.is_ascii_alphabetic() && c.is_ascii_uppercase()); let plural_ending = last_word_chars .last() .filter(|&&c| c.eq_ignore_ascii_case(&'s')) .map(|c| c.to_string()) .unwrap_or_default(); let suggestions: Vec = std::iter::once(Suggestion::ReplaceWith( format!("{acronym_str}{plural_ending}").chars().collect(), )) .chain(middle_words.iter().map(|mw| { let middle_words = if is_all_caps { mw.to_ascii_uppercase() } else { mw.to_string() }; Suggestion::ReplaceWith( format!("{middle_words} {}", last_word_span.get_content_string(src)) .chars() .collect(), ) })) .collect(); Some(Lint { span: toks.span()?, lint_kind: LintKind::Redundancy, suggestions, message: "The acronym's last letter already stands for the last word. Use just the acronym or the full phrase.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Identifies redundant acronyms where the last word repeats the last letter's meaning (e.g., `ATM machine` → `ATM` or `automated teller machine`)." } } #[cfg(test)] mod tests { use super::RedundantAcronyms; use crate::linting::tests::{assert_good_and_bad_suggestions, assert_no_lints}; #[test] fn test_made_up() { assert_good_and_bad_suggestions( "I forgot my PIN number!", RedundantAcronyms::default(), &[ "I forgot my PIN!", "I forgot my personal identification number!", ], &[], ); } #[test] fn test_all_caps_singular() { assert_good_and_bad_suggestions( "CAN TWO CARS HAVE THE SAME VIN NUMBER?", RedundantAcronyms::default(), &[ "CAN TWO CARS HAVE THE SAME VIN?", "CAN TWO CARS HAVE THE SAME VEHICLE IDENTIFICATION NUMBER?", ], &[], ); } #[test] fn test_all_caps_plural() { assert_good_and_bad_suggestions( "THESE ATM MACHINES ALL HAVE HIGH FEES!", RedundantAcronyms::default(), &[ "THESE ATMS ALL HAVE HIGH FEES!", "THESE AUTOMATED TELLER MACHINES ALL HAVE HIGH FEES!", ], &[], ); } #[test] fn test_all_lowercase_singular() { assert_good_and_bad_suggestions( "the atm machine at my card", RedundantAcronyms::default(), &[ "the atm at my card", "the automated teller machine at my card", ], &[], ); } #[test] fn test_all_lowercase_plural() { assert_good_and_bad_suggestions( "gui interfaces were sooo trendy in 1984!", RedundantAcronyms::default(), &[ "guis were sooo trendy in 1984!", "graphical user interfaces were sooo trendy in 1984!", ], &[], ); } #[test] fn correct_atm_machine() { assert_good_and_bad_suggestions( "Developed an ATM machine application for Raspberry Pi", RedundantAcronyms::default(), &[ "Developed an ATM application for Raspberry Pi", "Developed an automatic teller machine application for Raspberry Pi", "Developed an automated teller machine application for Raspberry Pi", ], &[], ); } #[test] fn correct_atm_machines() { assert_good_and_bad_suggestions( "ATM machines allow 4 or 6 digit PIN codes", RedundantAcronyms::default(), &[ "ATMs allow 4 or 6 digit PIN codes", "automated teller machines allow 4 or 6 digit PIN codes", "automatic teller machines allow 4 or 6 digit PIN codes", ], &[], ); } #[test] fn correct_gui_interface() { assert_good_and_bad_suggestions( "This project develops using java language with GUI interface.", RedundantAcronyms::default(), &[ "This project develops using java language with GUI.", "This project develops using java language with graphical user interface.", ], &[], ); } #[test] fn correct_gui_interfaces() { assert_good_and_bad_suggestions( "In non-crafting GUI interfaces, such as a mod's own recipe tree, the shortcut key cannot be used to view item usage or crafting methods.", RedundantAcronyms::default(), &[ "In non-crafting GUIs, such as a mod's own recipe tree, the shortcut key cannot be used to view item usage or crafting methods.", "In non-crafting graphical user interfaces, such as a mod's own recipe tree, the shortcut key cannot be used to view item usage or crafting methods.", ], &[], ); } #[test] fn correct_lcd_display() { assert_good_and_bad_suggestions( "This function accepts I2C shield address for LCD display, number of columns, rows and dot size", RedundantAcronyms::default(), &[ "This function accepts I2C shield address for LCD, number of columns, rows and dot size", "This function accepts I2C shield address for liquid crystal display, number of columns, rows and dot size", ], &[], ); } #[test] fn correct_lcd_displays() { assert_good_and_bad_suggestions( "ScreenUi makes it easy to build simple or complex character based user interfaces on small LCD displays like those commonly used with Arduinos.", RedundantAcronyms::default(), &[ "ScreenUi makes it easy to build simple or complex character based user interfaces on small LCDs like those commonly used with Arduinos.", "ScreenUi makes it easy to build simple or complex character based user interfaces on small liquid crystal displays like those commonly used with Arduinos.", ], &[], ); } #[test] fn correct_pin_numbers_caps() { assert_good_and_bad_suggestions( "Randomly generating PIN numbers for ATM access.", RedundantAcronyms::default(), &[ "Randomly generating PINs for ATM access.", "Randomly generating personal identification numbers for ATM access.", ], &[], ); } #[test] fn correct_pin_number_all_caps() { assert_good_and_bad_suggestions( "DON'T LET ANYONE SEE YOUR PIN NUMBER", RedundantAcronyms::default(), &[ "DON'T LET ANYONE SEE YOUR PIN", "DON'T LET ANYONE SEE YOUR PERSONAL IDENTIFICATION NUMBER", ], &[], ); } #[test] fn dont_correct_pin_number_lowercase() { assert_no_lints( "GPIO 26 (pin 37) on the Pi4 is mapped to pin nummer GPIO 425 on the pi5", RedundantAcronyms::default(), ); } #[test] fn dont_correct_pin_number_titlecase() { assert_no_lints( "Pin Number Match Project in Javascript.", RedundantAcronyms::default(), ) } #[test] fn correct_tui_interface() { assert_good_and_bad_suggestions( "Could a history search TUI interface be added for xonsh?", RedundantAcronyms::default(), &[ "Could a history search TUI be added for xonsh?", "Could a history search text-based user interface be added for xonsh?", "Could a history search terminal user interface be added for xonsh?", ], &[], ); } #[test] fn correct_ui_interface() { assert_good_and_bad_suggestions( "call ESPUI.begin(\"Some Title\"); to start the UI interface", RedundantAcronyms::default(), &[ "call ESPUI.begin(\"Some Title\"); to start the UI", "call ESPUI.begin(\"Some Title\"); to start the user interface", ], &[], ); } #[test] fn correct_vin_numbers() { assert_good_and_bad_suggestions( "That was actually accurate in decoding the VIN numbers but it costed me a 1000 USD.", RedundantAcronyms::default(), &[ "That was actually accurate in decoding the VINs but it costed me a 1000 USD.", "That was actually accurate in decoding the vehicle identification numbers but it costed me a 1000 USD.", ], &[], ); } #[test] fn correct_vin_number() { assert_good_and_bad_suggestions( "we have implemented verification algorithms, which ensure that VIN number received is correct", RedundantAcronyms::default(), &[ "we have implemented verification algorithms, which ensure that VIN received is correct", "we have implemented verification algorithms, which ensure that vehicle identification number received is correct", ], &[], ); } } ================================================ FILE: harper-core/src/linting/redundant_additive_adverbs.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Token, TokenStringExt, expr::{Expr, FirstMatchOf, FixedPhrase, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct RedundantAdditiveAdverbs { expr: SequenceExpr, } impl Default for RedundantAdditiveAdverbs { fn default() -> Self { let also_too = WordSet::new(&["also", "too"]); let as_well = FixedPhrase::from_phrase("as well"); let additive_adverb = Lrc::new(FirstMatchOf::new(vec![ Box::new(also_too), Box::new(as_well), ])); let multiple_additive_adverbs = SequenceExpr::with(additive_adverb.clone()) .then_one_or_more(SequenceExpr::whitespace().then(additive_adverb.clone())) .then_optional(SequenceExpr::whitespace().t_aco("as")); Self { expr: multiple_additive_adverbs, } } } impl ExprLinter for RedundantAdditiveAdverbs { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let phrase_string = toks.span()?.get_content_string(src).to_lowercase(); // Rule out `also too` as in `This is also too slow`. if phrase_string.eq("also too") { return None; } let mut toks = toks; // Check for the `as well as` false positive at the end if phrase_string.ends_with(" as well as") { // three word tokens and three whitespace tokens if toks.len() >= 6 { toks = &toks[..toks.len() - 6]; } } let mut additive_adverbs: Vec<&[char]> = vec![]; for word in toks .iter() .filter(|tok| tok.kind.is_word()) .map(|tok| tok.span.get_content(src)) .collect::>() { let term: &[char] = match word { ['a', 's'] | ['w', 'e', 'l', 'l'] => &['a', 's', ' ', 'w', 'e', 'l', 'l'], _ => word, }; if !additive_adverbs.contains(&term) { additive_adverbs.push(term); } } // Because of the possible `as well as` false positive, we might only have one additive adverb left. if additive_adverbs.len() < 2 { return None; } let suggestions = additive_adverbs .iter() .filter_map(|adverb| { Some(Suggestion::replace_with_match_case( adverb.to_vec(), toks.span()?.get_content(src), )) }) .collect::>(); let message = format!( "Use just one of `{}`.", additive_adverbs .iter() .map(|s| s.iter().collect::()) .collect::>() .join("` or `") ); Some(Lint { span: toks.span()?, lint_kind: LintKind::Redundancy, suggestions, message, priority: 31, }) } fn description(&self) -> &'static str { "Detects redundant additive adverbs." } } #[cfg(test)] mod tests { use super::RedundantAdditiveAdverbs; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // Basic unit tests #[test] fn flag_as_well_too() { assert_suggestion_result( "Yeah, we definitely miss him on this episode here, but you could probably get him on a podcast that's more focused on what Equinix is doing as well too, specifically.", RedundantAdditiveAdverbs::default(), "Yeah, we definitely miss him on this episode here, but you could probably get him on a podcast that's more focused on what Equinix is doing as well, specifically.", ); } #[test] fn flag_too_also() { assert_suggestion_result( "The #1 uptime service with many servers and is easy to setup. It is free too also.", RedundantAdditiveAdverbs::default(), "The #1 uptime service with many servers and is easy to setup. It is free also.", ); } #[test] fn dont_flag_also_too() { assert_lint_count( "The version update is also too slow.", RedundantAdditiveAdverbs::default(), 0, ); } #[test] fn dont_flag_also_as_well_as() { assert_lint_count( "Believe there are stable packages in the readme also as well as a link to an old version of forge in the ...", RedundantAdditiveAdverbs::default(), 0, ); } #[test] fn do_flag_too_also_as_well_as() { assert_lint_count( "What would happen with a sentence that included too also as well as?", RedundantAdditiveAdverbs::default(), 1, ); } #[test] fn flag_too_as_well() { assert_suggestion_result( "Module name itself was changed too as well.", RedundantAdditiveAdverbs::default(), "Module name itself was changed as well.", ); } } ================================================ FILE: harper-core/src/linting/redundant_progressive_comparative.rs ================================================ use crate::{ CharStringExt, Span, Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{Chunk, ExprLinter, Lint, LintKind, Suggestion}, }; pub struct RedundantProgressiveComparative { expr: Box, } impl Default for RedundantProgressiveComparative { fn default() -> Self { Self { expr: Box::new( SequenceExpr::aco("increasingly") .t_ws() .then_word_set(&["more", "less"]) .t_ws() .then_kind_either(TokenKind::is_adjective, TokenKind::is_adverb), ), } } } impl ExprLinter for RedundantProgressiveComparative { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], src: &[char]) -> Option { let first = matched_tokens.first()?; let second = matched_tokens.get(2)?; let (replacement, message) = if second .span .get_content(src) .eq_ignore_ascii_case_str("more") { ( "more and more", "This phrasing is redundant; use a direct comparative like `more and more`.", ) } else if second .span .get_content(src) .eq_ignore_ascii_case_str("less") { ( "less and less", "This phrasing is redundant; use a direct comparative like `less and less`.", ) } else { return None; }; let span = Span::new(first.span.start, second.span.end); Some(Lint { span, lint_kind: LintKind::Redundancy, suggestions: vec![Suggestion::replace_with_match_case_str( replacement, span.get_content(src), )], message: message.to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Detects redundant comparatives like `increasingly more` and `increasingly less`." } } #[cfg(test)] mod tests { use super::RedundantProgressiveComparative; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fixes_increasingly_more() { assert_suggestion_result( "The issue is increasingly more prevalent in distributed systems.", RedundantProgressiveComparative::default(), "The issue is more and more prevalent in distributed systems.", ); } #[test] fn fixes_increasingly_less() { assert_suggestion_result( "The outages are increasingly less frequent after the migration.", RedundantProgressiveComparative::default(), "The outages are less and less frequent after the migration.", ); } #[test] fn preserves_match_case_title() { assert_suggestion_result( "The bug is Increasingly More Prevalent in nightly builds.", RedundantProgressiveComparative::default(), "The bug is More and more Prevalent in nightly builds.", ); } #[test] fn preserves_match_case_all_caps() { assert_suggestion_result( "The bug is INCREASINGLY MORE PREVALENT in nightly builds.", RedundantProgressiveComparative::default(), "The bug is MORE AND MORE PREVALENT in nightly builds.", ); } #[test] fn preserves_match_case_less_all_caps() { assert_suggestion_result( "The regressions are INCREASINGLY LESS SEVERE with each patch.", RedundantProgressiveComparative::default(), "The regressions are LESS AND LESS SEVERE with each patch.", ); } #[test] fn ignores_progressively_more() { assert_no_lints( "These failures are progressively more severe in production.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_steadily_more() { assert_no_lints( "The interface is steadily more accessible each release.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_progressively_less() { assert_no_lints( "The warnings became progressively less noticeable over time.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_steadily_less() { assert_no_lints( "The logs are steadily less noisy in recent builds.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_more_than() { assert_no_lints( "The issue is increasingly more than a minor annoyance.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_less_than() { assert_no_lints( "The issue is increasingly less than a minor annoyance.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_noun_after_more() { assert_no_lints( "The issue is increasingly more people reporting crashes.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_noun_after_less() { assert_no_lints( "The issue is increasingly less people reporting crashes.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_without_comparator() { assert_no_lints( "The issue is increasingly prevalent in this subsystem.", RedundantProgressiveComparative::default(), ); } #[test] fn ignores_other_adverbial_comparatives() { assert_no_lints( "The issue is much more prevalent in this subsystem.", RedundantProgressiveComparative::default(), ); assert_no_lints( "The issue is significantly less prevalent in this subsystem.", RedundantProgressiveComparative::default(), ); assert_no_lints( "The issue is ever more prevalent in this subsystem.", RedundantProgressiveComparative::default(), ); } #[test] fn message_mentions_less_and_less_for_less_branch() { use crate::linting::tests::assert_lint_message; assert_lint_message( "The trend is increasingly less stable over time.", RedundantProgressiveComparative::default(), "This phrasing is redundant; use a direct comparative like `less and less`.", ); } #[test] fn emits_expected_lint_count() { assert_lint_count( "The trend is increasingly more likely in larger teams.", RedundantProgressiveComparative::default(), 1, ); } } ================================================ FILE: harper-core/src/linting/regionalisms.rs ================================================ use crate::{ Dialect::{self, American, Australian, British, Canadian, Indian}, Token, TokenStringExt, expr::{Expr, FirstMatchOf, FixedPhrase}, linting::{Lint, LintKind, Suggestion}, }; use super::ExprLinter; use crate::linting::expr_linter::Chunk; #[derive(PartialEq)] enum CanFlag { /// Flag this term as a regionalism that should be suggested against Flag, /// Don't flag this term because it's universally understood across dialects UniversalTerm, /// Don't flag this term because it has other common meanings that could cause false positives HasOtherMeanings, } use CanFlag::*; /// Represents a unique concept that has different regional terms across English dialects. /// Each is named by an alphabetical concatenation of the terms that refer to the same concept. /// This allows us to suggest appropriate regional alternatives when a term from another dialect is detected. #[derive(PartialEq)] enum Concept { AubergineBrinjalEggplant, AuberginesBrinjalsEggplants, BharatIndia, // BiscuitCookie - biscuit names different foods in UK/Aus vs US; cookie has other meanings // BiscuitCracker - cracker also has other meanings BloodNoseNosebleed, BritBritisher, BritsBritishers, BumBagFannyPack, BurglarizeBurgle, CampervanRv, CaravanTrailer, CatsupKetchupTomatoSauce, CellPhoneMobilePhone, CoolboxCoolerEsky, ChipsCrisps, CilantroCoriander, Crore, Crores, DiaperNappy, DoonaDuvet, DummyPacifier, FaucetTap, FlashlightTorch, FootballSoccer, FootpathPavementSidewalk, GasolinePetrol, GasStationPetrolStationServiceStation, // HooverVacuumCleaner - Hoover is also a surname and vacuum cleaner is universal. JumperSweater, Lakh, Lakhs, LightBulbLightGlobe, LorryTruck, MotorhomeRv, PhotocopierXerox, PhotocopyXerox, PickupUte, PramStroller, Prepone, SpannerWrench, StationWagonEstate, UpdateUpdation, UpdatesUpdations, WindscreenWindshield, } use Concept::*; /// Represents a single entry in our regional terms database struct Term<'a> { /// The term (e.g., "light globe", "sidewalk") term: &'a str, /// Whether to flag this term or only suggest it. /// We don't want to flag universal terms just because they have a regional synonym. /// We also don't want to flag terms that are common in other senses. flag: CanFlag, /// The dialect(s) this term is associated with. dialects: &'a [Dialect], /// The concept this term is associated with. /// Named by concatenating all the associated terms in alphabetical order. concept: Concept, } const REGIONAL_TERMS: &[Term<'_>] = &[ Term { term: "aubergine", flag: Flag, dialects: &[British], concept: AubergineBrinjalEggplant, }, Term { term: "aubergines", flag: Flag, dialects: &[British], concept: AuberginesBrinjalsEggplants, }, Term { term: "Bharat", flag: Flag, dialects: &[Indian], concept: BharatIndia, }, Term { term: "brinjal", flag: Flag, dialects: &[Indian], concept: AubergineBrinjalEggplant, }, Term { term: "brinjals", flag: Flag, dialects: &[Indian], concept: AuberginesBrinjalsEggplants, }, Term { term: "Brit", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian], concept: BritBritisher, }, Term { term: "Brits", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian], concept: BritsBritishers, }, Term { term: "Britisher", flag: Flag, dialects: &[Indian], concept: BritBritisher, }, Term { term: "Britishers", flag: Flag, dialects: &[Indian], concept: BritsBritishers, }, Term { term: "blood nose", flag: Flag, dialects: &[Australian], concept: BloodNoseNosebleed, }, Term { term: "bum bag", flag: Flag, dialects: &[Australian], concept: BumBagFannyPack, }, Term { term: "burglarize", flag: Flag, dialects: &[American], concept: BurglarizeBurgle, }, Term { term: "burgle", flag: Flag, dialects: &[British], concept: BurglarizeBurgle, }, Term { term: "campervan", flag: Flag, dialects: &[Australian, British], concept: CampervanRv, }, Term { term: "caravan", flag: UniversalTerm, dialects: &[Australian, British], concept: CaravanTrailer, }, Term { term: "catsup", flag: Flag, dialects: &[American], concept: CatsupKetchupTomatoSauce, }, Term { term: "cellphone", flag: Flag, dialects: &[American], concept: CellPhoneMobilePhone, }, Term { term: "chips", flag: UniversalTerm, dialects: &[American, Australian], concept: ChipsCrisps, }, Term { term: "cilantro", flag: Flag, dialects: &[American], concept: CilantroCoriander, }, Term { term: "coolbox", flag: Flag, dialects: &[British], concept: CoolboxCoolerEsky, }, Term { term: "cooler", flag: HasOtherMeanings, dialects: &[American, Canadian], concept: CoolboxCoolerEsky, }, Term { term: "coriander", flag: Flag, dialects: &[Australian, British], concept: CilantroCoriander, }, Term { term: "crisps", flag: Flag, dialects: &[British], concept: ChipsCrisps, }, Term { term: "crore", flag: Flag, dialects: &[Indian], concept: Crore, }, Term { term: "crores", flag: Flag, dialects: &[Indian], concept: Crores, }, Term { term: "diaper", flag: Flag, dialects: &[American, Canadian], concept: DiaperNappy, }, Term { term: "doona", flag: Flag, dialects: &[Australian], concept: DoonaDuvet, }, Term { term: "dummy", flag: HasOtherMeanings, dialects: &[Australian], concept: DummyPacifier, }, Term { term: "duvet", flag: Flag, dialects: &[Australian], concept: DoonaDuvet, }, Term { term: "eggplant", flag: Flag, dialects: &[American, Australian], concept: AubergineBrinjalEggplant, }, Term { term: "eggplants", flag: Flag, dialects: &[American, Australian], concept: AuberginesBrinjalsEggplants, }, Term { term: "esky", flag: Flag, dialects: &[Australian], concept: CoolboxCoolerEsky, }, Term { term: "estate", flag: HasOtherMeanings, dialects: &[British], concept: StationWagonEstate, }, Term { term: "fanny pack", flag: Flag, dialects: &[American, Canadian], concept: BumBagFannyPack, }, Term { term: "faucet", flag: Flag, dialects: &[American], concept: FaucetTap, }, Term { term: "flashlight", flag: Flag, dialects: &[American, Canadian], concept: FlashlightTorch, }, Term { term: "football", flag: HasOtherMeanings, dialects: &[British], concept: FootballSoccer, }, Term { term: "footpath", flag: Flag, dialects: &[Australian], concept: FootpathPavementSidewalk, }, Term { term: "gas", flag: HasOtherMeanings, dialects: &[American, Canadian], concept: GasolinePetrol, }, Term { term: "gas station", flag: Flag, dialects: &[American, Canadian], concept: GasStationPetrolStationServiceStation, }, Term { term: "gasoline", flag: Flag, dialects: &[American], concept: GasolinePetrol, }, Term { term: "India", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian, Indian], concept: BharatIndia, }, Term { term: "jumper", flag: HasOtherMeanings, dialects: &[Australian], concept: JumperSweater, }, Term { term: "ketchup", flag: Flag, dialects: &[American, Canadian], concept: CatsupKetchupTomatoSauce, }, Term { term: "lakh", flag: Flag, dialects: &[Indian], concept: Lakh, }, Term { term: "lakhs", flag: Flag, dialects: &[Indian], concept: Lakhs, }, Term { term: "light bulb", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian], concept: LightBulbLightGlobe, }, Term { term: "light globe", flag: Flag, dialects: &[Australian], concept: LightBulbLightGlobe, }, Term { term: "lorry", flag: Flag, dialects: &[British], concept: LorryTruck, }, Term { term: "mobile phone", flag: Flag, dialects: &[Australian, British], concept: CellPhoneMobilePhone, }, Term { term: "motorhome", flag: Flag, dialects: &[Australian, British], concept: MotorhomeRv, }, Term { term: "nappy", flag: Flag, dialects: &[Australian, British], concept: DiaperNappy, }, Term { term: "nosebleed", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian], concept: BloodNoseNosebleed, }, Term { term: "pacifier", flag: Flag, dialects: &[American], concept: DummyPacifier, }, Term { term: "pavement", flag: HasOtherMeanings, dialects: &[British], concept: FootpathPavementSidewalk, }, Term { term: "petrol", flag: Flag, dialects: &[Australian, British], concept: GasolinePetrol, }, Term { term: "petrol station", flag: Flag, dialects: &[Australian, British], concept: GasStationPetrolStationServiceStation, }, Term { term: "photocopier", flag: Flag, dialects: &[Australian, British, Canadian], concept: PhotocopierXerox, }, Term { term: "photocopy", flag: Flag, dialects: &[Australian, British, Canadian], concept: PhotocopyXerox, }, Term { term: "pickup truck", flag: Flag, dialects: &[American], concept: PickupUte, }, Term { term: "pram", flag: Flag, dialects: &[Australian, British], concept: PramStroller, }, Term { term: "prepone", flag: Flag, dialects: &[Indian], concept: Prepone, }, Term { // Must be normalized to lowercase term: "rv", flag: Flag, dialects: &[American], concept: CampervanRv, }, Term { term: "rv", flag: Flag, dialects: &[American], concept: MotorhomeRv, }, Term { term: "sidewalk", flag: Flag, dialects: &[American, Canadian], concept: FootpathPavementSidewalk, }, Term { term: "soccer", flag: Flag, dialects: &[American, Australian], concept: FootballSoccer, }, Term { term: "spanner", flag: Flag, dialects: &[Australian, British], concept: SpannerWrench, }, Term { term: "station wagon", flag: Flag, dialects: &[American, Australian], concept: StationWagonEstate, }, Term { term: "stroller", flag: Flag, dialects: &[American, Australian], concept: PramStroller, }, Term { term: "sweater", flag: Flag, dialects: &[American], concept: JumperSweater, }, Term { term: "tap", flag: HasOtherMeanings, dialects: &[Australian, British], concept: FaucetTap, }, Term { term: "tomato sauce", flag: HasOtherMeanings, dialects: &[Australian], concept: CatsupKetchupTomatoSauce, }, Term { term: "torch", flag: HasOtherMeanings, dialects: &[Australian, British], concept: FlashlightTorch, }, Term { term: "trailer", flag: HasOtherMeanings, dialects: &[American], concept: CaravanTrailer, }, Term { term: "truck", flag: HasOtherMeanings, dialects: &[American, Australian, Canadian], concept: LorryTruck, }, Term { term: "update", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian], concept: UpdateUpdation, }, Term { term: "updates", flag: UniversalTerm, dialects: &[American, Australian, British, Canadian], concept: UpdateUpdation, }, Term { term: "updation", flag: Flag, dialects: &[Indian], concept: UpdateUpdation, }, Term { term: "updations", flag: Flag, dialects: &[Indian], concept: UpdatesUpdations, }, Term { term: "ute", flag: Flag, dialects: &[Australian], concept: PickupUte, }, Term { term: "xerox", dialects: &[American], flag: Flag, concept: PhotocopierXerox, }, Term { term: "xerox", flag: Flag, dialects: &[American], concept: PhotocopyXerox, }, Term { term: "wrench", flag: Flag, dialects: &[American], concept: SpannerWrench, }, Term { term: "windscreen", flag: Flag, dialects: &[British, Australian], concept: WindscreenWindshield, }, Term { term: "windshield", flag: Flag, dialects: &[American, Canadian], concept: WindscreenWindshield, }, ]; pub struct Regionalisms { expr: FirstMatchOf, dialect: Dialect, } impl Regionalisms { pub fn new(dialect: Dialect) -> Self { let terms: Vec> = REGIONAL_TERMS .iter() .filter(|row| row.flag == Flag) .map(|row| Box::new(FixedPhrase::from_phrase(row.term)) as Box) .collect(); Self { expr: FirstMatchOf::new(terms), dialect, } } } impl ExprLinter for Regionalisms { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let span = toks.span()?; let flagged_term_chars = span.get_content(src); let flagged_term_string = span.get_content_string(src).to_lowercase(); let linter_dialect = self.dialect; // If this term is used in the linter dialect, then we don't want to lint it. if REGIONAL_TERMS .iter() .any(|row| row.term == flagged_term_string && row.dialects.contains(&linter_dialect)) { return None; } let concept = match REGIONAL_TERMS .iter() .find(|row| row.term == flagged_term_string) { Some(term) => &term.concept, None => return None, // No matching term found, so nothing to lint }; let other_terms = REGIONAL_TERMS .iter() .filter(|row| row.concept == *concept) .filter_map(|row| { if row.dialects.contains(&linter_dialect) { Some(&row.term) } else { None } }) .collect::>(); let suggestions = other_terms .iter() .map(|term| Suggestion::replace_with_match_case_str(term, flagged_term_chars)) .collect::>(); let message = if other_terms.len() == 1 { format!( "`{flagged_term_string}` isn't used in {linter_dialect} English. Use `{}` instead.", other_terms[0] ) } else { format!("`{flagged_term_string}` isn't used in {linter_dialect} English.") }; Some(Lint { span, lint_kind: LintKind::Regionalism, suggestions, message, priority: 64, }) } fn description(&self) -> &str { "Regionalisms" } } #[cfg(test)] mod tests { use super::*; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn uk_to_us_food() { assert_suggestion_result( "I can't eat aubergine or coriander, so I'll just have a bag of crisps.", Regionalisms::new(Dialect::American), "I can't eat eggplant or cilantro, so I'll just have a bag of chips.", ); } #[test] fn au_to_us_phone() { assert_suggestion_result( "I dropped my mobile phone in the esky and now it's covered in tomato sauce.", Regionalisms::new(Dialect::American), // Tomato sauce is valid in American English, it just means pasta sauce rather than ketchup. "I dropped my cellphone in the cooler and now it's covered in tomato sauce.", ) } #[test] fn au_to_uk_cars() { assert_suggestion_result( "Drive the station wagon onto the footpath and hand me that spanner.", Regionalisms::new(Dialect::British), "Drive the estate onto the pavement and hand me that spanner.", ) } #[test] fn au_to_us_cars() { assert_suggestion_result( "Drive the station wagon onto the footpath and hand me that spanner.", Regionalisms::new(Dialect::American), "Drive the station wagon onto the sidewalk and hand me that wrench.", ) } #[test] fn us_to_au_baby() { assert_suggestion_result( "Wash the pacifier under the faucet.", Regionalisms::new(Dialect::Australian), "Wash the dummy under the tap.", ) } #[test] fn us_to_uk_fuel() { assert_suggestion_result( "I needed more gasoline to drive the truck to the soccer match.", Regionalisms::new(Dialect::British), "I needed more petrol to drive the truck to the football match.", ) } #[test] fn au_to_uk_light() { assert_suggestion_result( "Can you sell me a light globe for this torch?", Regionalisms::new(Dialect::British), "Can you sell me a light bulb for this torch?", ) } #[test] fn us_to_au_oops() { assert_suggestion_result( "I spilled ketchup on my clean sweater.", Regionalisms::new(Dialect::Australian), "I spilled tomato sauce on my clean jumper.", ) } #[test] fn caravan_doesnt_always_mean_trailer() { assert_lint_count( "A caravan (from Persian کاروان kârvân) is a group of people traveling together, often on a trade expedition. Caravans were used mainly in desert areas.", Regionalisms::new(Dialect::British), 0, ) } #[test] fn uk_to_us_windscreen() { assert_suggestion_result( "Detect raindrops on vehicle windscreen by combining various region proposal algorithm with Convolutional Neural Network.", Regionalisms::new(Dialect::American), "Detect raindrops on vehicle windshield by combining various region proposal algorithm with Convolutional Neural Network.", ) } #[test] fn au_to_uk_blood_nose() { assert_suggestion_result( "Oh no! I got a blood nose.", Regionalisms::new(Dialect::British), "Oh no! I got a nosebleed.", ) } #[test] fn in_to_non_in_updation() { assert_suggestion_result( "Add apps to queue for updation or installation and resize it.", Regionalisms::new(Dialect::American), "Add apps to queue for update or installation and resize it.", ) } #[test] fn dont_flag_update_or_updation_for_indian() { assert_lint_count( "Hey, the colab notebook which you have provided, required lot of updations, Can you pls update it.", Regionalisms::new(Dialect::Indian), 0, ) } #[test] fn flag_crore_and_lakh_for_non_indian() { assert_lint_count( "There are 100 lakhs in one crore.", Regionalisms::new(Dialect::American), 2, ) } #[test] fn dont_flag_lakh_or_crore_for_indian() { assert_lint_count( "There are 100 lakhs in one crore.", Regionalisms::new(Dialect::Indian), 0, ) } #[test] fn a_brinjal_is_an_aubergine() { assert_suggestion_result( "Is brinjal used in curries or chutneys?", Regionalisms::new(Dialect::British), "Is aubergine used in curries or chutneys?", ); } #[test] fn a_brinjal_is_an_eggplant() { assert_suggestion_result( "Is brinjal used in curries or chutneys?", Regionalisms::new(Dialect::Australian), "Is eggplant used in curries or chutneys?", ); } } ================================================ FILE: harper-core/src/linting/regular_irregulars.rs ================================================ use crate::{ Token, char_string::CharStringExt, expr::Expr, irregular_nouns::IrregularNouns, irregular_verbs::IrregularVerbs, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, }; use hashbrown::HashSet; pub struct RegularIrregulars { exp: Box, dict: D, } impl RegularIrregulars where D: Dictionary, { pub fn new(dict: D) -> Self { Self { exp: Box::new(|tok: &Token, src: &[char]| { tok.kind.is_oov() && tok .span .get_content(src) .ends_with_any_ignore_ascii_case_chars(&[ &['s'], &['e', 'd'], &['e', 'r'], &['e', 's', 't'], ]) }), dict, } } } impl ExprLinter for RegularIrregulars where D: Dictionary, { type Unit = Chunk; fn description(&self) -> &'static str { "Replaces wrong regular inflections of words with their correct irregular forms." } fn expr(&self) -> &dyn Expr { self.exp.as_ref() } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() != 1 { return None; } let tok = &toks[0]; let span = tok.span; let chars = span.get_content(src); let word = span.get_content_string(src); let mut suggs: HashSet = HashSet::new(); handle_plural_nouns(&self.dict, &mut suggs, chars); handle_past_verbs(&self.dict, &mut suggs, chars); handle_adjectives(&mut suggs, chars); let suggestions: Vec<_> = suggs .iter() .map(|good_str| Suggestion::replace_with_match_case(good_str.chars().collect(), chars)) .collect(); if suggestions.is_empty() { return None; } let irregulars = suggs .iter() .map(|s| format!("'{}'", s)) .collect::>() .join(" or "); Some(Lint { span, lint_kind: LintKind::Grammar, message: format!( "Use the irregular form {} instead of '{}'", irregulars, word ), suggestions, ..Default::default() }) } } fn get_irreg_compar(word: &str) -> Option<&'static [&'static str]> { match word { "good" => Some(&["better"]), "far" => Some(&["farther", "further"]), "well" => Some(&["better"]), "bad" => Some(&["worse"]), _ => None, } } fn get_irreg_super(word: &str) -> Option<&'static [&'static str]> { match word { "good" => Some(&["best"]), "far" => Some(&["farthest", "furthest"]), "well" => Some(&["best"]), "bad" => Some(&["worst"]), _ => None, } } fn handle_adjectives(suggs: &mut HashSet, chars: &[char]) { if chars.ends_with_ignore_ascii_case_str("er") { // Irregular comparatives: gooder -> better etc. let key = chars[..chars.len() - 2].iter().collect::(); if let Some(forms) = get_irreg_compar(&key) { suggs.extend(forms.iter().map(|s| s.to_string())); } } if chars.ends_with_ignore_ascii_case_str("est") { // Irregular superlatives: goodest -> best etc. let key = chars[..chars.len() - 2].iter().collect::(); if let Some(forms) = get_irreg_super(&key) { suggs.extend(forms.iter().map(|s| s.to_string())); } } } fn handle_plural_nouns(dict: &dyn Dictionary, suggs: &mut HashSet, chars: &[char]) { let mut plurals = vec![]; let mut sg_candidates = vec![]; if let Some(drop_s) = chars.strip_suffix(&['s']) { sg_candidates.push(drop_s); if let Some(drop_es) = drop_s.strip_suffix(&['e']) { sg_candidates.push(drop_es); } let singulars = sg_candidates.iter().filter(|sg| { dict.get_word_metadata(sg) .is_some_and(|m| m.is_singular_noun()) }); singulars.into_iter().for_each(|sg| { // irregular plurals if let Some(pl) = IrregularNouns::curated().get_plural_for_singular(&sg.iter().collect::()) { plurals.push(pl.chars().collect()); } // skys -> sky -> skies etc. if let Some(drop_y) = sg.strip_suffix(&['y']) { let mut add_ies = drop_y.to_vec(); add_ies.extend(['i', 'e', 's']); if dict .get_word_metadata(&add_ies) .is_some_and(|m| m.is_plural_noun()) { plurals.push(add_ies); } } // knifes -> knife -> knives etc. (No because "knifes" is a legit verb) if let Some(drop_fe) = sg.strip_suffix(&['f', 'e']) { let mut add_ves = drop_fe.to_vec(); add_ves.extend(['v', 'e', 's']); if dict .get_word_metadata(&add_ves) .is_some_and(|m| m.is_plural_noun()) { plurals.push(add_ves); } } // calfs -> calf -> calves etc. if let Some(drop_f) = sg.strip_suffix(&['f']) { let mut add_ves = drop_f.to_vec(); add_ves.extend(['v', 'e', 's']); if dict .get_word_metadata(&add_ves) .is_some_and(|m| m.is_plural_noun()) { plurals.push(add_ves); } } // tomatos -> tomato -> tomatoes etc. // TODO: boxs -> box -> boxes ? if sg.ends_with_ignore_ascii_case_chars(&['o']) { let mut add_es = sg.to_vec(); add_es.extend(['e', 's']); if dict .get_word_metadata(&add_es) .is_some_and(|m| m.is_plural_noun()) { plurals.push(add_es); } } // TODO are there words which double the last consonant to pluralize? gas? whiz? }); plurals.iter().for_each(|pl| { suggs.insert(pl.iter().collect()); }); } } fn handle_past_verbs(dict: &dyn Dictionary, suggs: &mut HashSet, chars: &[char]) { let mut pasts: HashSet> = HashSet::new(); let mut vp_candidates = vec![]; if chars.ends_with_ignore_ascii_case_chars(&['e', 'd']) { vp_candidates.push(&chars[..chars.len() - 2]); // drop_ed vp_candidates.push(&chars[..chars.len() - 1]); // drop_d // Handle doubled consonant before -ed (e.g., "resetted" -> "reset") // Check if position len-3 and len-4 are same char (the doubled consonant) if chars.len() >= 5 && chars[chars.len() - 3] == chars[chars.len() - 4] { vp_candidates.push(&chars[..chars.len() - 3]); // drop one of the doubled consonants + ed } } let lemmata = vp_candidates.into_iter().filter(|vp| { dict.get_word_metadata(vp) .is_some_and(|m| m.is_verb_lemma()) }); lemmata.into_iter().for_each(|lem| { let lem_str = lem.iter().collect::(); // Irregular verbs if let Some((pt, pp)) = IrregularVerbs::curated().get_pasts_for_lemma(&lem_str) { pasts.insert(pt.chars().collect()); pasts.insert(pp.chars().collect()); } }); pasts.iter().for_each(|p| { suggs.insert(p.iter().collect()); }); } #[cfg(test)] mod tests { mod nouns { use super::super::RegularIrregulars; use crate::linting::tests::assert_suggestion_result; use crate::spell::FstDictionary; #[test] fn fix_irregulars() { assert_suggestion_result( "Womans and childs first", RegularIrregulars::new(FstDictionary::curated()), "Women and children first", ); } #[test] fn fix_ys_and_fs() { assert_suggestion_result( "Kittys playing on the shelfs.", RegularIrregulars::new(FstDictionary::curated()), "Kitties playing on the shelves.", ); } #[test] fn fix_os_and_oes() { assert_suggestion_result( "The heros climb the volcanos", RegularIrregulars::new(FstDictionary::curated()), "The heroes climb the volcanoes", ); } #[test] fn fix_oxen_and_meatloaves() { assert_suggestion_result( "These meatloafs are made out of oxes.", RegularIrregulars::new(FstDictionary::curated()), "These meatloaves are made out of oxen.", ); } } mod verbs { use super::super::RegularIrregulars; use crate::linting::tests::assert_suggestion_result; use crate::spell::FstDictionary; #[test] fn fix_irregular_past_verb() { assert_suggestion_result( "I eated the banana.", RegularIrregulars::new(FstDictionary::curated()), "I ate the banana.", ); } #[test] fn fix_readed() { assert_suggestion_result( "He readed the newspaper", RegularIrregulars::new(FstDictionary::curated()), "He read the newspaper", ); } #[test] fn fix_writed() { assert_suggestion_result( "She writed many lines of code.", RegularIrregulars::new(FstDictionary::curated()), "She wrote many lines of code.", ); } #[test] fn fix_runned() { assert_suggestion_result( "I runned faster than ever!", RegularIrregulars::new(FstDictionary::curated()), "I ran faster than ever!", ); } #[test] fn fix_resetted() { assert_suggestion_result( "I resetted the phone to factory settings.", RegularIrregulars::new(FstDictionary::curated()), "I reset the phone to factory settings.", ); } #[test] fn fix_eat_drink_sleep() { assert_suggestion_result( "I eated and drinked too much but I sleeped good.", RegularIrregulars::new(FstDictionary::curated()), "I ate and drank too much but I slept good.", ); } } mod adjectives { use super::super::RegularIrregulars; use crate::linting::tests::assert_good_and_bad_suggestions; use crate::spell::FstDictionary; #[test] fn fix_adjectives() { assert_good_and_bad_suggestions( "This way is farer.", RegularIrregulars::new(FstDictionary::curated()), &["This way is farther.", "This way is further."], &[], ); } } } ================================================ FILE: harper-core/src/linting/repeated_words.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::TokenStringExt; use crate::char_string::char_string; use crate::{CharString, CharStringExt, Document, Span}; #[derive(Debug, Clone)] pub struct RepeatedWords { /// Words that we need to make sure are detected. /// We use a `Vec` since there aren't a whole lot of 'em. special_cases: Vec, } impl RepeatedWords { pub fn new() -> Self { Self { special_cases: vec![char_string!("this")], } } fn is_special_case(&self, chars: &[char]) -> bool { let lower = chars.to_lower(); self.special_cases .iter() .any(|v| v.as_slice() == lower.as_ref()) } } impl Default for RepeatedWords { fn default() -> Self { Self::new() } } impl Linter for RepeatedWords { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for chunk in document.iter_chunks() { let mut iter = chunk.iter_word_indices().zip(chunk.iter_words()).peekable(); while let (Some((idx_a, tok_a)), Some((idx_b, tok_b))) = (iter.next(), iter.peek()) { let word_a = document.get_span_content(&tok_a.span); let word_b = document.get_span_content(&tok_b.span); let prev_tok = document.get_token_offset(idx_a, -1); let next_tok = document.get_token_offset(*idx_b, 1); if prev_tok.is_some_and(|t| t.kind.is_hyphen()) || next_tok.is_some_and(|t| t.kind.is_hyphen()) { continue; } if (tok_a.kind.is_preposition() || tok_a.kind.is_conjunction() || !tok_a.kind.is_likely_homograph() || self.is_special_case(word_a) || tok_a.kind.is_adverb() || tok_a.kind.is_determiner()) && word_a.to_lower() == word_b.to_lower() { let intervening_tokens = &chunk[idx_a + 1..*idx_b]; if intervening_tokens.iter().any(|t| !t.kind.is_whitespace()) { continue; } lints.push(Lint { span: Span::new(tok_a.span.start, tok_b.span.end), lint_kind: LintKind::Repetition, suggestions: vec![Suggestion::ReplaceWith( document.get_span_content(&tok_a.span).to_vec(), )], message: "Did you mean to repeat this word?".to_string(), ..Default::default() }) } } } lints } fn description(&self) -> &'static str { "This rule looks for repetitions of words that are not homographs." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::super::tests::assert_lint_count; use super::RepeatedWords; #[test] fn catches_basic() { assert_lint_count("I wanted the the banana.", RepeatedWords::default(), 1) } #[test] fn does_not_lint_homographs_address() { assert_lint_count("To address address problems.", RepeatedWords::default(), 0); } #[test] fn does_not_lint_homographs_record() { assert_lint_count("To record record profits.", RepeatedWords::default(), 0); } #[test] fn issue_253() { assert_lint_count( "this paper shows that, while the method may be more accurate accurate, the turnout overestimate suggests that self-selection bias is not sufficiently reduced", RepeatedWords::default(), 1, ); } #[test] fn issue_333() { assert_suggestion_result( "This is is a test", RepeatedWords::default(), "This is a test", ); } #[test] fn double_a() { assert_suggestion_result( "This is a a test", RepeatedWords::default(), "This is a test", ); } #[test] fn double_and() { assert_suggestion_result( "And and this is also a test", RepeatedWords::default(), "And this is also a test", ); } #[test] fn on_on_github() { assert_suggestion_result( "Take a look at the project on on GitHub.", RepeatedWords::default(), "Take a look at the project on GitHub.", ); } #[test] fn as_as() { assert_suggestion_result( "he is as as hard as nails", RepeatedWords::default(), "he is as hard as nails", ); } #[test] fn dont_flag_first_hyphenated() { assert_lint_count( "The driver-facing camera and microphone are only logged if you explicitly opt-in in settings.", RepeatedWords::default(), 0, ); } #[test] fn dont_flag_hyphenated_either_side() { assert_lint_count("foo-foo foo bar bar-bar", RepeatedWords::default(), 0); } } ================================================ FILE: harper-core/src/linting/respond.rs ================================================ use crate::Token; use crate::expr::{Expr, ExprMap, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; pub struct Respond { expr: ExprMap, } impl Default for Respond { fn default() -> Self { let mut map = ExprMap::default(); let helper_verb = |tok: &Token, src: &[char]| { if tok.kind.is_auxiliary_verb() { return true; } if !tok.kind.is_verb() { return false; } let lower = tok.span.get_content_string(src).to_lowercase(); matches!( lower.as_str(), "do" | "did" | "does" | "won't" | "don't" | "didn't" | "doesn't" ) }; map.insert( SequenceExpr::default() .then_nominal() .t_ws() .then(helper_verb) .t_ws() .t_aco("response"), 4, ); map.insert( SequenceExpr::default() .then_nominal() .t_ws() .then(helper_verb) .t_ws() .then_adverb() .t_ws() .t_aco("response"), 6, ); Self { expr: map } } } impl ExprLinter for Respond { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let response_index = *self.expr.lookup(0, matched_tokens, source)?; let response_token = matched_tokens.get(response_index)?; Some(Lint { span: response_token.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "respond", response_token.span.get_content(source), )], message: "Use the verb `respond` here.".to_owned(), priority: 40, }) } fn description(&self) -> &'static str { "Flags uses of the noun `response` where the verb `respond` is needed after an auxiliary." } } #[cfg(test)] mod tests { use super::Respond; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fixes_will_response() { assert_suggestion_result( "He will response soon.", Respond::default(), "He will respond soon.", ); } #[test] fn fixes_can_response() { assert_suggestion_result( "They can response to the survey.", Respond::default(), "They can respond to the survey.", ); } #[test] fn fixes_did_not_response() { assert_suggestion_result( "I did not response yesterday.", Respond::default(), "I did not respond yesterday.", ); } #[test] fn fixes_might_quickly_response() { assert_suggestion_result( "She might quickly response to feedback.", Respond::default(), "She might quickly respond to feedback.", ); } #[test] fn fixes_wont_response() { assert_suggestion_result( "They won't response in time.", Respond::default(), "They won't respond in time.", ); } #[test] fn fixes_would_response() { assert_suggestion_result( "We would response if we could.", Respond::default(), "We would respond if we could.", ); } #[test] fn fixes_should_response() { assert_suggestion_result( "You should response politely.", Respond::default(), "You should respond politely.", ); } #[test] fn does_not_flag_correct_respond() { assert_no_lints("Please respond when you can.", Respond::default()); } #[test] fn does_not_flag_noun_use() { assert_no_lints("The response time was great.", Respond::default()); } #[test] fn does_not_flag_question_subject() { assert_lint_count("Should response times be logged?", Respond::default(), 0); } #[test] fn does_not_flag_response_as_object() { assert_no_lints("I have no response for that.", Respond::default()); } } ================================================ FILE: harper-core/src/linting/right_click.rs ================================================ use crate::{ Token, TokenStringExt, expr::{Expr, ExprMap, SequenceExpr}, linting::expr_linter::Chunk, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::DerivedFrom, }; pub struct RightClick { expr: ExprMap, } impl Default for RightClick { fn default() -> Self { let mut map = ExprMap::default(); map.insert( SequenceExpr::word_set(&["right", "left", "middle"]) .t_ws() .then(DerivedFrom::new_from_str("click")), 0, ); Self { expr: map } } } impl ExprLinter for RightClick { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let start_idx = *self.expr.lookup(0, matched_tokens, source)?; let click_idx = matched_tokens.len().checked_sub(1)?; let span = matched_tokens.get(start_idx..=click_idx)?.span()?; let template = span.get_content(source); let direction = matched_tokens.get(start_idx)?.span.get_content(source); let click = matched_tokens.get(click_idx)?.span.get_content(source); let replacement: Vec = direction .iter() .copied() .chain(['-']) .chain(click.iter().copied()) .collect(); Some(Lint { span, lint_kind: LintKind::Punctuation, suggestions: vec![Suggestion::replace_with_match_case(replacement, template)], message: "Hyphenate this mouse command.".to_owned(), priority: 40, }) } fn description(&self) -> &'static str { "Hyphenates right-click style mouse commands." } } #[cfg(test)] mod tests { use super::RightClick; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn hyphenates_basic_command() { assert_suggestion_result( "Right click the icon.", RightClick::default(), "Right-click the icon.", ); } #[test] fn hyphenates_with_preposition() { assert_suggestion_result( "Please right click on the link.", RightClick::default(), "Please right-click on the link.", ); } #[test] fn hyphenates_past_tense() { assert_suggestion_result( "They right clicked the submit button.", RightClick::default(), "They right-clicked the submit button.", ); } #[test] fn hyphenates_gerund() { assert_suggestion_result( "Right clicking the item highlights it.", RightClick::default(), "Right-clicking the item highlights it.", ); } #[test] fn hyphenates_plural_noun() { assert_suggestion_result( "Right clicks are tracked in the log.", RightClick::default(), "Right-clicks are tracked in the log.", ); } #[test] fn hyphenates_all_caps() { assert_suggestion_result( "He RIGHT CLICKED the file.", RightClick::default(), "He RIGHT-CLICKED the file.", ); } #[test] fn hyphenates_left_click() { assert_suggestion_result( "Left click the checkbox.", RightClick::default(), "Left-click the checkbox.", ); } #[test] fn hyphenates_middle_click() { assert_suggestion_result( "Middle click to open in a new tab.", RightClick::default(), "Middle-click to open in a new tab.", ); } #[test] fn allows_hyphenated_form() { assert_lint_count("Right-click the icon.", RightClick::default(), 0); } #[test] fn ignores_unrelated_right_and_click() { assert_lint_count( "Click the right button to continue.", RightClick::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/rise_the_ranks.rs ================================================ use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, debug::format_lint_match, expr_linter::Chunk}, }; pub struct RiseTheRanks { expr: SequenceExpr, } impl Default for RiseTheRanks { fn default() -> Self { Self { expr: SequenceExpr::word_set(&[ // legit forms of the legit verb "rise" "rise", "risen", "rising", "rose", // wrong forms of the legit verb "rise" "rised", // forms of wrong verbs used instead of forms of "rise" // "arise", "arised", "arisen", "arising", "arose", "raise", "raised", "raises", // "raising", ]) .t_ws() // .then_optional( // SequenceExpr::optional(SequenceExpr::aco("up").t_ws()) // // modern "through", traditional "from" // // also seen: "in", "up" // .then_preposition() // .t_ws(), // ) .t_aco("the") .t_ws() // .t_set(&["ranks", "rank"]), .t_aco("ranks"), } } } impl ExprLinter for RiseTheRanks { type Unit = Chunk; fn description(&self) -> &str { "Corrects the nonstandard phrase `rise the ranks` to the standard `rise through the ranks` or `rise from the ranks`" } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { eprintln!("🧵 {}", format_lint_match(toks, ctx, src)); Some(Lint { span: toks[0].span, lint_kind: LintKind::Usage, suggestions: vec![ Suggestion::InsertAfter(vec![' ', 't', 'h', 'r', 'o', 'u', 'g', 'h']), Suggestion::InsertAfter(vec![' ', 'f', 'r', 'o', 'm']), ], message: "Use either the modern standard 'rise through the ranks' or the traditional 'rise from the ranks'. 'Rise the ranks' is nonstandard.".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::RiseTheRanks; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn fix_rise_the_ranks() { assert_suggestion_result( "Rise the ranks from Division 8 to the Champion!", RiseTheRanks::default(), "Rise through the ranks from Division 8 to the Champion!", ); } #[test] fn fix_rised_the_ranks() { assert_suggestion_result( "while there I've rised the ranks from L1 Tech > L2 Tech > Team lead and now Manager", RiseTheRanks::default(), "while there I've rised through the ranks from L1 Tech > L2 Tech > Team lead and now Manager", ); } #[test] fn fix_risen_the_ranks() { assert_suggestion_result( "AngularJS has risen the ranks of popularity a lot over the last couple of years.", RiseTheRanks::default(), "AngularJS has risen through the ranks of popularity a lot over the last couple of years.", ); } #[test] fn fix_rising_the_ranks() { assert_suggestion_result( "Rust is new coding language rising the ranks, aiming at safe concurrency, data safe programming at zero abstraction cost.", RiseTheRanks::default(), "Rust is new coding language rising through the ranks, aiming at safe concurrency, data safe programming at zero abstraction cost.", ); } #[test] fn fix_rose_the_ranks() { assert_suggestion_result( "we follow these women as they quickly rose the ranks of NASA alongside many of history's greatest minds", RiseTheRanks::default(), "we follow these women as they quickly rose through the ranks of NASA alongside many of history's greatest minds", ); } #[test] fn dont_flag_rise_through_the_ranks() { assert_no_lints( "I hadn't noticed any particular suspicious behavior during my slow but steady rise through the ranks.", RiseTheRanks::default(), ); } #[test] fn dont_flag_rises_through_the_ranks() { assert_no_lints( "Vito Scaletta rises through the ranks of the mafia, becoming a powerful don.", RiseTheRanks::default(), ); } #[test] fn dont_flag_rising_from_the_ranks() { assert_no_lints( "Rising from the ranks of a sailor, he seems to have embodied the American Dream among a navy full of elites.", RiseTheRanks::default(), ); } #[test] fn dont_flag_rising_through_the_ranks() { assert_no_lints( "From a tranquil town, he discovered his passion in online gaming tournaments, rising through the ranks with unwavering dedication.", RiseTheRanks::default(), ); } // #[test] // fn fix_raise_in_the_ranks() { // assert_suggestion_result( // "I am trying to raise in the ranks to be more helpful so I would appreciate comments, and upvotes if this was helpful.", // RiseTheRanks::default(), // "I am trying to rise through the ranks to be more helpful so I would appreciate comments, and upvotes if this was helpful.", // ); // } // #[test] // fn fix_raise_up_in_the_ranks() { // assert_suggestion_result( // "And the rejects that make it back successfully raise up in the ranks.", // RiseTheRanks::default(), // "And the rejects that make it back successfully rise through the ranks.", // ); // } // #[test] // fn fix_raise_up_through_the_ranks() { // assert_suggestion_result( // "characters who use their intelligence, charms ETC. to gain power and raise up through the ranks", // RiseTheRanks::default(), // "characters who use their intelligence, charms ETC. to gain power and rise through the ranks", // ); // } // #[test] // fn fix_raised_through_the_rank() { // assert_suggestion_result( // "I raised through the rank to be responsible of all the main offensive wars and managed to help my ruler build a respectable kingdom", // RiseTheRanks::default(), // "I rose through the ranks to be responsible of all the main offensive wars and managed to help my ruler build a respectable kingdom", // ); // } // #[test] // fn fix_raises_through_the_ranks() { // assert_suggestion_result( // "He raises through the ranks pretty quickly. Ensign. Lieutenant. Senior Lieutenant.", // RiseTheRanks::default(), // "He rises through the ranks pretty quickly. Ensign. Lieutenant. Senior Lieutenant.", // ); // } // #[test] // fn fix_raising_through_the_ranks() { // assert_suggestion_result( // "The signals were reinforced by the people whom I saw raising through the ranks while those around them burnt out.", // RiseTheRanks::default(), // "The signals were reinforced by the people whom I saw rising through the ranks while those around them burnt out.", // ); // } // #[test] // fn fix_raising_up_in_the_ranks() { // assert_suggestion_result( // "I would have rather stayed as a blacksmith son raising up in the ranks.", // RiseTheRanks::default(), // "I would have rather stayed as a blacksmith son rising through the ranks.", // ); // } // #[test] // fn fix_raising_up_through_the_ranks() { // assert_suggestion_result( // "then it's through completing the foraging club missions and raising up through the ranks", // RiseTheRanks::default(), // "then it's through completing the foraging club missions and rising through the ranks", // ); // } // #[test] // fn fix_rise_up_in_the_rank() { // assert_suggestion_result( // "Supposing I am a soldier in the Qin military,what should I do to rise up in the rank?", // RiseTheRanks::default(), // "Supposing I am a soldier in the Qin military,what should I do to rise through the ranks?", // ); // } // #[test] // fn fix_rise_up_in_the_ranks() { // assert_suggestion_result( // "It requires weeding out those that would stop or rise up in the ranks against communist control.", // RiseTheRanks::default(), // "It requires weeding out those that would stop or rise through the ranks against communist control.", // ); // } // #[test] // fn fix_rise_up_the_ranks() { // assert_suggestion_result( // "It is far easier to rise up the ranks quickly in a new space than in an old, crowded space.", // RiseTheRanks::default(), // "It is far easier to rise through the ranks quickly in a new space than in an old, crowded space.", // ); // } // #[test] // fn fix_rise_up_through_the_rank() { // assert_suggestion_result( // "Gau really rise up through the rank after they finally settle him on wind/lightning lol.", // RiseTheRanks::default(), // "Gau really rise through the ranks after they finally settle him on wind/lightning lol.", // ); // } // #[test] // fn fix_rise_up_through_the_ranks() { // assert_suggestion_result( // "There's no obligation to do this, but it does help users to rise up through the ranks, or sometimes, simply to feel helpful", // RiseTheRanks::default(), // "There's no obligation to do this, but it does help users to rise through the ranks, or sometimes, simply to feel helpful", // ); // } // #[test] // fn fix_rised_through_the_ranks() { // assert_suggestion_result( // "The eldest brother quickly rised through the ranks of the legion.", // RiseTheRanks::default(), // "The eldest brother quickly rose through the ranks of the legion.", // ); // } // #[test] // fn fix_rised_up_in_the_ranks() { // assert_suggestion_result( // "infiltrated the council and rised up in the ranks but couldn't pretend to be Mystogan for less than a week", // RiseTheRanks::default(), // "infiltrated the council and rose through the ranks but couldn't pretend to be Mystogan for less than a week", // ); // } // #[test] // fn fix_risen_in_the_ranks() { // assert_suggestion_result( // "Python has risen in the ranks, surpassing C# this year, much like it surpassed PHP last year.", // RiseTheRanks::default(), // "Python has risen through the ranks, surpassing C# this year, much like it surpassed PHP last year.", // ); // } // #[test] // fn fix_rising_up_through_the_ranks() { // assert_suggestion_result( // "It's hard to even imagine rising up through the ranks, grinding out the decades, and then retiring - with a penchant - all at a single company.", // RiseTheRanks::default(), // "It's hard to even imagine rising through the ranks, grinding out the decades, and then retiring - with a penchant - all at a single company.", // ); // } } ================================================ FILE: harper-core/src/linting/roller_skated.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, TokenStringExt, expr::{AnchorStart, Expr, ExprMap, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; /// Suggests hyphenating the past tense of `roller-skate`. pub struct RollerSkated { expr: ExprMap, } impl RollerSkated { fn roller_pair() -> SequenceExpr { SequenceExpr::default() .t_aco("roller") .t_ws() .t_aco("skated") } } impl Default for RollerSkated { fn default() -> Self { let mut map = ExprMap::default(); map.insert( SequenceExpr::default() .then_kind_is_but_is_not( |kind| matches!(kind, TokenKind::Word(_)), |kind| kind.is_determiner(), ) .then_whitespace() .then_seq(Self::roller_pair()), 2, ); map.insert( SequenceExpr::default() .then_punctuation() .then_whitespace() .then_seq(Self::roller_pair()), 2, ); map.insert( SequenceExpr::default() .then_punctuation() .then_seq(Self::roller_pair()), 1, ); map.insert( SequenceExpr::with(AnchorStart).then_seq(Self::roller_pair()), 0, ); Self { expr: map } } } impl ExprLinter for RollerSkated { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let roller_idx = *self.expr.lookup(0, matched_tokens, source)?; let skated_idx = roller_idx.checked_add(2)?; let window = matched_tokens.get(roller_idx..=skated_idx)?; let span = window.span()?; let original = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Punctuation, suggestions: vec![Suggestion::replace_with_match_case( "roller-skated".chars().collect(), original, )], message: "Hyphenate this verb as `roller-skated`.".to_owned(), priority: 40, }) } fn description(&self) -> &'static str { "Encourages hyphenating the past tense of `roller-skate`." } } #[cfg(test)] mod tests { use super::RollerSkated; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_basic_sentence() { assert_suggestion_result( "He roller skated down the hill.", RollerSkated::default(), "He roller-skated down the hill.", ); } #[test] fn corrects_with_adverb() { assert_suggestion_result( "They roller skated quickly around the rink.", RollerSkated::default(), "They roller-skated quickly around the rink.", ); } #[test] fn corrects_with_auxiliary() { assert_suggestion_result( "She had roller skated there before.", RollerSkated::default(), "She had roller-skated there before.", ); } #[test] fn corrects_with_contraction() { assert_suggestion_result( "They'd roller skated all night.", RollerSkated::default(), "They'd roller-skated all night.", ); } #[test] fn corrects_caps() { assert_suggestion_result( "They ROLLER SKATED yesterday.", RollerSkated::default(), "They ROLLER-SKATED yesterday.", ); } #[test] fn corrects_in_quotes() { assert_suggestion_result( "\"We roller skated together,\" she said.", RollerSkated::default(), "\"We roller-skated together,\" she said.", ); } #[test] fn corrects_across_line_break() { assert_suggestion_result( "We\nroller skated whenever we could.", RollerSkated::default(), "We\nroller-skated whenever we could.", ); } #[test] fn corrects_with_trailing_punctuation() { assert_suggestion_result( "He roller skated, laughed, and waved.", RollerSkated::default(), "He roller-skated, laughed, and waved.", ); } #[test] fn corrects_without_space_after_punctuation() { assert_suggestion_result( "He roller skated,laughed, and waved.", RollerSkated::default(), "He roller-skated,laughed, and waved.", ); } #[test] fn allows_hyphenated_form() { assert_lint_count("They roller-skated yesterday.", RollerSkated::default(), 0); } #[test] fn allows_subject_named_roller() { assert_lint_count( "The roller skated across the stage.", RollerSkated::default(), 0, ); } #[test] fn allows_other_compounds() { assert_lint_count( "Their roller skating routine impressed everyone.", RollerSkated::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/safe_to_save.rs ================================================ use harper_brill::UPOS; use crate::expr::Expr; use crate::expr::LongestMatchOf; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::patterns::{ModalVerb, UPOSSet, WordSet}; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct SafeToSave { expr: LongestMatchOf, } impl Default for SafeToSave { fn default() -> Self { let with_adv = SequenceExpr::with(ModalVerb::default()) .then_whitespace() .then(UPOSSet::new(&[UPOS::ADV])) .then_whitespace() .t_aco("safe") .then_whitespace() .then_unless(WordSet::new(&["to"])); let without_adv = SequenceExpr::with(ModalVerb::default()) .then_whitespace() .t_aco("safe") .then_whitespace() .then_unless(WordSet::new(&["to"])); let pattern = with_adv.or_longest(without_adv); Self { expr: pattern } } } impl ExprLinter for SafeToSave { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let safe_idx = toks .iter() .position(|t| t.span.get_content_string(src).to_lowercase() == "safe")?; let safe_tok = &toks[safe_idx]; Some(Lint { span: safe_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith("save".chars().collect())], message: "The word `safe` is an adjective. Did you mean the verb `save`?".to_string(), priority: 57, }) } fn description(&self) -> &str { "Detects `safe` (adjective) when `save` (verb) is intended after modal verbs like `could` or `should`." } } #[cfg(test)] mod tests { use super::SafeToSave; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn corrects_could_safe() { assert_suggestion_result( "He could safe my life.", SafeToSave::default(), "He could save my life.", ); } #[test] fn corrects_should_safe() { assert_suggestion_result( "You should safe your work frequently.", SafeToSave::default(), "You should save your work frequently.", ); } #[test] fn corrects_will_safe() { assert_suggestion_result( "This will safe you time.", SafeToSave::default(), "This will save you time.", ); } #[test] fn corrects_would_safe() { assert_suggestion_result( "It would safe us money.", SafeToSave::default(), "It would save us money.", ); } #[test] fn corrects_can_safe() { assert_suggestion_result( "You can safe the document now.", SafeToSave::default(), "You can save the document now.", ); } #[test] fn corrects_might_safe() { assert_suggestion_result( "This might safe the company.", SafeToSave::default(), "This might save the company.", ); } #[test] fn corrects_must_safe() { assert_suggestion_result( "We must safe our resources.", SafeToSave::default(), "We must save our resources.", ); } #[test] fn corrects_may_safe() { assert_suggestion_result( "You may safe your progress here.", SafeToSave::default(), "You may save your progress here.", ); } #[test] fn corrects_with_adverb() { assert_suggestion_result( "You should definitely safe your changes.", SafeToSave::default(), "You should definitely save your changes.", ); } #[test] fn corrects_shall_safe() { assert_suggestion_result( "We shall safe the nation.", SafeToSave::default(), "We shall save the nation.", ); } #[test] fn corrects_couldnt_safe() { assert_suggestion_result( "I couldn't safe the file.", SafeToSave::default(), "I couldn't save the file.", ); } #[test] fn allows_safe_to_verb() { assert_no_lints("It is safe to assume.", SafeToSave::default()); } #[test] fn allows_safe_noun() { assert_no_lints("Put the money in the safe today.", SafeToSave::default()); } #[test] fn allows_correct_save() { assert_no_lints("You should save your work.", SafeToSave::default()); } } ================================================ FILE: harper-core/src/linting/save_to_safe.rs ================================================ use crate::expr::Expr; use crate::expr::OwnedExprExt; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{InflectionOfBe, Word}, }; pub struct SaveToSafe { expr: SequenceExpr, } impl Default for SaveToSafe { fn default() -> Self { let pattern = SequenceExpr::with(InflectionOfBe::new().or(Word::new("it"))) .then_whitespace() .t_aco("save") .then_whitespace() .t_aco("to") .then_whitespace() .then_verb(); Self { expr: pattern } } } impl ExprLinter for SaveToSafe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let save_tok = &toks.get(2)?; let verb_tok = &toks.get(4)?; let verb = verb_tok.span.get_content_string(src).to_lowercase(); Some(Lint { span: save_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::ReplaceWith("safe".chars().collect())], message: format!("Did you mean `safe to {verb}`?"), priority: 57, }) } fn description(&self) -> &str { "Corrects `save to ` to `safe to ` after a form of `be`." } } #[cfg(test)] mod tests { use super::SaveToSafe; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fix_ignore() { assert_suggestion_result( "It is save to ignore trivial code.", SaveToSafe::default(), "It is safe to ignore trivial code.", ); } #[test] fn fix_travel() { assert_suggestion_result( "Is it save to travel abroad now?", SaveToSafe::default(), "Is it safe to travel abroad now?", ); } #[test] fn ignore_correct() { assert_lint_count("It is safe to assume nothing.", SaveToSafe::default(), 0); } } ================================================ FILE: harper-core/src/linting/sentence_capitalization.rs ================================================ use super::Suggestion; use super::{Lint, LintKind, Linter}; use crate::document::Document; use crate::spell::Dictionary; use crate::{Token, TokenKind, TokenStringExt}; pub struct SentenceCapitalization where T: Dictionary, { dictionary: T, } impl SentenceCapitalization { pub fn new(dictionary: T) -> Self { Self { dictionary } } } impl Linter for SentenceCapitalization { /// A linter that checks to make sure the first word of each sentence is /// capitalized. fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for paragraph in document.iter_paragraphs() { // Allows short, label-like comments in code. if paragraph.iter_sentences().count() == 1 { let only_sentence = paragraph.iter_sentences().next().unwrap(); if !only_sentence .iter_chunks() .map(|c| c.iter_words().count()) .any(|c| c > 5) { continue; } } for sentence in paragraph.iter_sentences() { if !is_full_sentence(sentence) { continue; } if let Some(first_word) = sentence.first_non_whitespace() { if !first_word.kind.is_word() { continue; } let word_chars = document.get_span_content(&first_word.span); if let Some(first_char) = word_chars.first() && first_char.is_alphabetic() && !first_char.is_uppercase() { if let Some(canonical_spelling) = self.dictionary.get_correct_capitalization_of(word_chars) { // Skip if it's a proper noun or contains uppercase letters before a separator if first_word.kind.is_proper_noun() { continue; } // Check for uppercase letters in the rest of the word before any separators if canonical_spelling .iter() .skip(1) .take_while(|&c| !c.is_whitespace() && *c != '-' && *c != '\'') .any(|&c| c.is_uppercase()) { continue; } } let target_span = first_word.span; let mut replacement_chars = document.get_span_content(&target_span).to_vec(); replacement_chars[0] = replacement_chars[0].to_ascii_uppercase(); lints.push(Lint { span: target_span, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith(replacement_chars)], priority: 31, message: "This sentence does not start with a capital letter" .to_string(), }); } } } } lints } fn description(&self) -> &'static str { "The opening word of a sentence should almost always be capitalized." } } fn is_full_sentence(toks: &[Token]) -> bool { let mut has_nominal = false; let mut has_verb = false; for tok in toks { if let TokenKind::Word(Some(metadata)) = &tok.kind { if metadata.is_nominal() { has_nominal = true; } if metadata.is_verb() { has_verb = true; } } } has_nominal && has_verb } #[cfg(test)] mod tests { use super::super::tests::assert_lint_count; use super::SentenceCapitalization; use crate::spell::FstDictionary; #[test] fn catches_basic() { assert_lint_count( "there is no way she is not guilty.", SentenceCapitalization::new(FstDictionary::curated()), 1, ) } #[test] fn no_period() { assert_lint_count( "there is no way she is not guilty", SentenceCapitalization::new(FstDictionary::curated()), 1, ) } #[test] fn two_sentence() { assert_lint_count( "i have complete conviction in this. she is absolutely guilty", SentenceCapitalization::new(FstDictionary::curated()), 2, ) } #[test] fn start_with_number() { assert_lint_count( "53 is the length of the longest word.", SentenceCapitalization::new(FstDictionary::curated()), 0, ); } #[test] fn ignores_unlintable() { assert_lint_count( "[`misspelled_word`] is assumed to be quite small (n < 100). ", SentenceCapitalization::new(FstDictionary::curated()), 0, ) } #[test] fn unfazed_unlintable() { assert_lint_count( "the linter should not be affected by `this` unlintable.", SentenceCapitalization::new(FstDictionary::curated()), 1, ) } #[test] fn unfazed_ellipsis() { assert_lint_count( "the linter should not be affected by... that ellipsis.", SentenceCapitalization::new(FstDictionary::curated()), 1, ) } #[test] fn unfazed_comma() { assert_lint_count( "the linter should not be affected by, that comma.", SentenceCapitalization::new(FstDictionary::curated()), 1, ) } #[test] fn issue_228_allows_labels() { assert_lint_count( "python lsp (fork of pyright)", SentenceCapitalization::new(FstDictionary::curated()), 0, ) } #[test] fn allow_camel_case_trademarks() { // Some words are marked as proper nouns in `dictionary.dict` but are lower camel case. assert_lint_count( "macOS 16 could be called something like Redwood or Shasta", SentenceCapitalization::new(FstDictionary::curated()), 0, ) } #[test] #[ignore = "This can't work because currently hyphens are not included in tokenized words\nalthough they are now permitted in `dictionary.dict`"] fn uppercase_unamerican_at_start() { assert_lint_count( "un-American starts with a lowercase letter and contains an uppercase letter, but is not a proper noun or trademark.", SentenceCapitalization::new(FstDictionary::curated()), 1, ) } #[test] fn allow_lowercase_proper_nouns() { // A very few words are marked as proper nouns even though they're all lowercase. // https://css-tricks.com/start-sentence-npm/ assert_lint_count( concat!( "npm is the world's largest software registry. Open source developers from every ", "continent use npm to share and borrow packages, and many organizations use npm to ", "manage private development as well." ), SentenceCapitalization::new(FstDictionary::curated()), 0, ) } #[test] fn doesnt_flag_after_esp_issue_2753() { assert_lint_count( "I'll go, esp. if it's a free event.", SentenceCapitalization::new(FstDictionary::curated()), 0, ); } #[test] fn allow_lower_camel_case_non_proper_nouns() { // A very few words are not considered proper nouns but still start with a lowercase letter that shouldn't be uppercased at the start of a sentence. assert_lint_count( "mRNA is synthesized from the coding sequence of a gene during the transcriptional process.", SentenceCapitalization::new(FstDictionary::curated()), 0, ) } } ================================================ FILE: harper-core/src/linting/shoot_oneself_in_the_foot.rs ================================================ use crate::{ CharStringExt, Span, Token, expr::{Expr, ReflexivePronoun, SequenceExpr}, linting::Suggestion, patterns::WordSet, }; use super::{ExprLinter, Lint, LintKind}; use crate::linting::expr_linter::Chunk; pub struct ShootOneselfInTheFoot { pattern: SequenceExpr, } impl Default for ShootOneselfInTheFoot { fn default() -> Self { let verb_forms = WordSet::new(&["shoot", "shooting", "shoots", "shot", "shooted"]); let body_parts = WordSet::new(&["foot", "feet", "leg", "legs"]); let pattern = SequenceExpr::with(verb_forms) .t_ws() .then(ReflexivePronoun::default()) .t_ws() .then_preposition() .t_ws() .then_determiner() .t_ws() .then(body_parts); Self { pattern } } } impl ExprLinter for ShootOneselfInTheFoot { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.pattern } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let pron = &toks.get(2)?.span.get_content(src); let prep = &toks.get(4)?.span.get_content(src); let det = &toks.get(6)?.span.get_content(src); let body_part = &toks.get(8)?.span.get_content(src); let plural_pron = pron.ends_with_ignore_ascii_case_str("elves"); let plural_foot = toks.get(8)?.kind.is_plural_noun(); let is_in = prep.eq_ignore_ascii_case_str("in"); let is_the = det.eq_ignore_ascii_case_str("the"); let is_foot = body_part.eq_ignore_ascii_case_str("foot"); let foot_ok = is_foot || (plural_pron && plural_foot); if is_in && is_the && foot_ok { return None; } let in_the_foot = Span::new(toks.get(4)?.span.start, toks.get(8)?.span.end); let mut suggestions = vec![Suggestion::replace_with_match_case_str( "in the foot", in_the_foot.get_content(src), )]; if plural_pron { suggestions.push(Suggestion::replace_with_match_case_str( "in the feet", in_the_foot.get_content(src), )); } Some(Lint { span: in_the_foot, lint_kind: LintKind::Miscellaneous, suggestions, message: "The standard idiom is 'shoot oneself in the foot'.".to_string(), priority: 50, }) } fn description(&self) -> &str { "Corrects nonstandard variants of 'shoot oneself in the foot'." } } #[cfg(test)] mod tests { use super::ShootOneselfInTheFoot; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn ignore_correct() { assert_lint_count( "Don't shoot yourself in the foot.", ShootOneselfInTheFoot::default(), 0, ); } #[test] fn ignore_title_case() { assert_lint_count( "Don't Shoot Yourself In The Foot.", ShootOneselfInTheFoot::default(), 0, ); } #[test] fn ignore_all_caps() { assert_lint_count( "DON'T SHOOT YOURSELF IN THE FOOT.", ShootOneselfInTheFoot::default(), 0, ); } #[test] fn fix_shoot_leg() { assert_suggestion_result( "I managed to shoot myself in the leg when using CF Workers deployment", ShootOneselfInTheFoot::default(), "I managed to shoot myself in the foot when using CF Workers deployment", ); } #[test] fn fix_shoot_into_foot() { assert_suggestion_result( "Or should we keep them to prevent users from shooting themselves into the foot?", ShootOneselfInTheFoot::default(), "Or should we keep them to prevent users from shooting themselves in the foot?", ); } #[test] fn fix_shoot_into_feet() { assert_suggestion_result( "(to prevent you from shooting yourself into the feet)", ShootOneselfInTheFoot::default(), "(to prevent you from shooting yourself in the foot)", ); } #[test] fn ignore_themselves_foot() { assert_lint_count( "Thou shalt not make a rule that prevents C++ programmers from shooting themselves in the foot.", ShootOneselfInTheFoot::default(), 0, ); } #[test] fn ignore_ourselves_feet() { assert_lint_count( "It will help avoiding shooting ourselves in the feet.", ShootOneselfInTheFoot::default(), 0, ); } #[test] fn fix_a_foot() { assert_suggestion_result( "Shot ourselves in a foot, \"Wrong X-Request-Key\" error #589.", ShootOneselfInTheFoot::default(), "Shot ourselves in the foot, \"Wrong X-Request-Key\" error #589.", ); } #[test] fn ignore_shoots_himself() { assert_suggestion_result( "the administrator shoots himself in the foot and then hops around", ShootOneselfInTheFoot::default(), "the administrator shoots himself in the foot and then hops around", ); } #[test] fn ignore_shooting_oneself_in_the_foot() { assert_lint_count( "A historical document of shooting oneself in the foot, if you will.", ShootOneselfInTheFoot::default(), 0, ); } #[test] fn fix_oneself_in_a_foot() { assert_suggestion_result( "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself in a foot", ShootOneselfInTheFoot::default(), "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself in the foot", ); } #[test] fn fix_oneself_in_the_feet() { assert_suggestion_result( "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself in the feet", ShootOneselfInTheFoot::default(), "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself in the foot", ); } #[test] fn fix_oneself_into_the_leg() { assert_suggestion_result( "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself into the foot", ShootOneselfInTheFoot::default(), "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself in the foot", ); } #[test] fn ignore_oneself_in_the_toes() { assert_lint_count( "Forgetting to declare some variable local withing a function definition is a common way to shoot oneself in the toes", ShootOneselfInTheFoot::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/simple_past_to_past_participle.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{All, Expr, FirstMatchOf, SequenceExpr}, irregular_verbs::IrregularVerbs, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{InflectionOfBe, WordSet}, }; /// Corrects simple past tense verbs to past participle after auxiliary verbs like "have" or "be". pub struct SimplePastToPastParticiple { expr: All, } impl Default for SimplePastToPastParticiple { fn default() -> Self { Self { expr: All::new(vec![ // positive: the general case Box::new( SequenceExpr::any_of(vec![ // for perfect tenses Box::new(WordSet::new(&["have", "had", "has", "having"])), // for passive voice Box::new(InflectionOfBe::default()), // pronoun + have contractions Box::new(WordSet::new(&[ "I've", "I'd", "we've", "we'd", "you've", "you'd", "he's", "he'd", "she's", "she'd", "it's", "it'd", "they've", "they'd", ])), // pronoun + have contractions missing apostrophes Box::new(WordSet::new(&[ "Ive", "Id", "weve", "wed", "youve", "youd", "hes", "hed", "shes", "shed", "its", "itd", "theyve", "theyd", ])), ]) .t_ws() .then_verb_simple_past_form(), ), // negative: exceptions Box::new(SequenceExpr::unless(FirstMatchOf::new(vec![ Box::new( SequenceExpr::with(InflectionOfBe::default()) .t_any() .t_aco("woke"), ), Box::new( SequenceExpr::aco("id") .t_any() .then_word_set(&["came", "did", "went"]), ), ]))), ]), } } } impl ExprLinter for SimplePastToPastParticiple { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() != 3 || !toks[1].kind.is_whitespace() || !toks[2].kind.is_verb() { return None; } let verb_tok = &toks[2]; let simple_past = verb_tok.span.get_content_string(src); if let Some(past_participle) = IrregularVerbs::curated() .get_past_participle_for_preterite(&simple_past) .filter(|pp| pp != &simple_past) { let suggestions = vec![Suggestion::replace_with_match_case( past_participle.chars().collect(), verb_tok.span.get_content(src), )]; let message = format!( "Use the past participle `{}` instead of `{}` when using compound tenses or passive voice.", past_participle, simple_past ); Some(Lint { span: verb_tok.span, lint_kind: LintKind::Grammar, suggestions, message, ..Default::default() }) } else { None } } fn description(&self) -> &str { "Corrects simple past tense verbs to past participle after auxiliary verbs like \"have\" or \"be\"." } } #[cfg(test)] mod tests { use super::SimplePastToPastParticiple; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // "Be" and "have" #[test] fn correct_have_went() { assert_suggestion_result( "I have went into the btle.py file and added a print statement in _connect()", SimplePastToPastParticiple::default(), "I have gone into the btle.py file and added a print statement in _connect()", ); } #[test] fn correct_had_went() { assert_suggestion_result( "Not sure if TroLoos had went from Tasmota->minimal->Tasmota, or directly Minimal->Tasmota, but going ESPHome->Minimal->Tasmota is not possible", SimplePastToPastParticiple::default(), "Not sure if TroLoos had gone from Tasmota->minimal->Tasmota, or directly Minimal->Tasmota, but going ESPHome->Minimal->Tasmota is not possible", ); } #[test] fn correct_having_went() { assert_suggestion_result( "Having went through the setup guidelines and picking react starter, running npm run watch results in an error", SimplePastToPastParticiple::default(), "Having gone through the setup guidelines and picking react starter, running npm run watch results in an error", ); } #[test] fn correct_has_went() { assert_suggestion_result( "I would like to report that the package request which you are loading has went into maintenance mode.", SimplePastToPastParticiple::default(), "I would like to report that the package request which you are loading has gone into maintenance mode.", ); } #[test] fn correct_have_wrote() { assert_suggestion_result( "and while people have wrote partial ImGuiStyle save and ...", SimplePastToPastParticiple::default(), "and while people have written partial ImGuiStyle save and ...", ); } #[test] fn correct_has_came() { assert_suggestion_result( "and mail has came to a work account", SimplePastToPastParticiple::default(), "and mail has come to a work account", ); } #[test] fn correct_have_took() { assert_suggestion_result( "The Keychain took longer than I'd like it to have took, but it still works", SimplePastToPastParticiple::default(), "The Keychain took longer than I'd like it to have taken, but it still works", ); } #[test] fn correct_have_did() { assert_suggestion_result( "so I have did like below: cd ~/.pub-cache/hosted/pub.dev/", SimplePastToPastParticiple::default(), "so I have done like below: cd ~/.pub-cache/hosted/pub.dev/", ); } #[test] fn correct_has_fell() { assert_suggestion_result( "ScopedHistory instance has fell out of scope ...", SimplePastToPastParticiple::default(), "ScopedHistory instance has fallen out of scope ...", ); } #[test] fn correct_have_broke() { assert_suggestion_result( "PlanningEnitity to see the hard constraints that it may have broke", SimplePastToPastParticiple::default(), "PlanningEnitity to see the hard constraints that it may have broken", ); } #[test] fn correct_had_began() { assert_suggestion_result( "I had began learning Android App development since Aug 2021", SimplePastToPastParticiple::default(), "I had begun learning Android App development since Aug 2021", ); } #[test] fn correct_have_gave() { assert_suggestion_result( "I'm not aware we have gave up SM75, why are you asking this?", SimplePastToPastParticiple::default(), "I'm not aware we have given up SM75, why are you asking this?", ); } #[test] fn correct_have_saw() { assert_suggestion_result( "I have saw that your paper has been accepted by JAIR", SimplePastToPastParticiple::default(), "I have seen that your paper has been accepted by JAIR", ); } #[test] fn correct_have_spoke() { assert_suggestion_result( "so i may have spoke in error", SimplePastToPastParticiple::default(), "so i may have spoken in error", ); } #[test] fn correct_has_became() { assert_suggestion_result( "but it has became failed after v2.6.1", SimplePastToPastParticiple::default(), "but it has become failed after v2.6.1", ); } #[test] fn correct_have_knew() { assert_suggestion_result( "Oh, I have knew this. You can decrypted it in \"Assetstudio\".", SimplePastToPastParticiple::default(), "Oh, I have known this. You can decrypted it in \"Assetstudio\".", ); } #[test] fn correct_have_drank() { assert_suggestion_result( "User should be able to see approximately how much water they have drank today", SimplePastToPastParticiple::default(), "User should be able to see approximately how much water they have drunk today", ); } #[test] #[ignore = "'Woke' is also an adjective these days"] fn being_woke() { assert_suggestion_result( "and the containers will not being woke up until I execute a \"docker ps\"", SimplePastToPastParticiple::default(), "and the containers will not being woken up until I execute a \"docker ps\"", ); } #[test] fn correct_has_flew() { assert_suggestion_result( "Well time has flew and I was quite busy but I remember this conversation so I am sharing this with you.", SimplePastToPastParticiple::default(), "Well time has flown and I was quite busy but I remember this conversation so I am sharing this with you.", ); } #[test] fn correct_being_stole() { assert_suggestion_result( "any requests to obtain the hostname will return the hostname of the container being stole", SimplePastToPastParticiple::default(), "any requests to obtain the hostname will return the hostname of the container being stolen", ); } #[test] fn correct_are_broke() { assert_suggestion_result( "They all worked wonderfully under 3.4.2 and all are broke under 3.5.1.", SimplePastToPastParticiple::default(), "They all worked wonderfully under 3.4.2 and all are broken under 3.5.1.", ); } #[test] fn correct_were_gave() { assert_suggestion_result( "Some devices were gave up during a storm recently, but some are still the same as before.", SimplePastToPastParticiple::default(), "Some devices were given up during a storm recently, but some are still the same as before.", ); } #[test] fn correct_be_saw() { assert_suggestion_result( "Currently, it's 14560/14550 for default mavlink RX/TX, which can be saw in wfb-cli .", SimplePastToPastParticiple::default(), "Currently, it's 14560/14550 for default mavlink RX/TX, which can be seen in wfb-cli .", ); } #[test] fn correct_was_began() { assert_suggestion_result( "The initial intent, when v1alpha3 was began, was that almost all usages of InitConfiguration outside of kubeadm init code, could be easily replaced", SimplePastToPastParticiple::default(), "The initial intent, when v1alpha3 was begun, was that almost all usages of InitConfiguration outside of kubeadm init code, could be easily replaced", ); } #[test] fn correct_was_gave() { assert_suggestion_result( "you will find the config file path was gave by -c argument", SimplePastToPastParticiple::default(), "you will find the config file path was given by -c argument", ); } #[test] fn correct_be_began() { assert_suggestion_result( "Ticket requires something from design before it can be began.", SimplePastToPastParticiple::default(), "Ticket requires something from design before it can be begun.", ); } #[test] fn correct_being_took() { assert_suggestion_result( "Dunno, I saw some old threads about port not being took into account in asw-sdk library but seems fixed on aws side.", SimplePastToPastParticiple::default(), "Dunno, I saw some old threads about port not being taken into account in asw-sdk library but seems fixed on aws side.", ); } #[test] fn correct_are_took() { assert_suggestion_result( "In the example provided, TP53 and LMNB1 genes are took as seeds.", SimplePastToPastParticiple::default(), "In the example provided, TP53 and LMNB1 genes are taken as seeds.", ); } // Contractions #[test] fn correct_ive_went() { assert_suggestion_result( "I've went through some tutorials and went back and forth with AI translating programs from one language to the other.", SimplePastToPastParticiple::default(), "I've gone through some tutorials and went back and forth with AI translating programs from one language to the other.", ); } #[test] fn correct_ive_went_no_apostrophe() { assert_suggestion_result( "I've went thru all the steps to help fix this Virus issue and im locked up.", SimplePastToPastParticiple::default(), "I've gone thru all the steps to help fix this Virus issue and im locked up.", ); } #[test] fn correct_id_did() { assert_suggestion_result( "I'd did a calibration after the FW update now.", SimplePastToPastParticiple::default(), "I'd done a calibration after the FW update now.", ); } #[test] fn correct_weve_went() { assert_suggestion_result( "Thanks for the feedback, but the issue is no longer relevant since we've went with different approach.", SimplePastToPastParticiple::default(), "Thanks for the feedback, but the issue is no longer relevant since we've gone with different approach.", ); } #[test] fn correct_wed_chose() { assert_suggestion_result( "whatever number we'd chose, only one tab will be allowed to run", SimplePastToPastParticiple::default(), "whatever number we'd chosen, only one tab will be allowed to run", ); } #[test] fn correct_youve_wrote() { assert_suggestion_result( "I love this project, it's impressing how many refactoring you've wrote in a limited amount of time.", SimplePastToPastParticiple::default(), "I love this project, it's impressing how many refactoring you've written in a limited amount of time.", ); } #[test] fn correct_youve_ran_no_apostrophe() { assert_suggestion_result( "after youve ran it, execute the file_mover.ps1 using powershell", SimplePastToPastParticiple::default(), "after youve run it, execute the file_mover.ps1 using powershell", ); } #[test] fn correct_youd_wrote() { assert_suggestion_result( "When I saw you'd wrote a terminal emulator I had to try it and so far it's amazing.", SimplePastToPastParticiple::default(), "When I saw you'd written a terminal emulator I had to try it and so far it's amazing.", ); } #[test] fn correct_its_broke() { assert_suggestion_result( "Not sure why it's broke for me but not for you.", SimplePastToPastParticiple::default(), "Not sure why it's broken for me but not for you.", ); } #[test] fn correct_its_broke_no_apostrophe() { assert_suggestion_result( "Now its broke and won't do batch images (decoding error).", SimplePastToPastParticiple::default(), "Now its broken and won't do batch images (decoding error).", ); } #[test] fn correct_theyve_broke() { assert_suggestion_result( "They've broke something again :D.", SimplePastToPastParticiple::default(), "They've broken something again :D.", ); } #[test] fn correct_theyd_forgot() { assert_suggestion_result( "they found the process they'd forgot they were running", SimplePastToPastParticiple::default(), "they found the process they'd forgotten they were running", ); } // Known exceptions #[test] fn dont_flag_being_woke() { assert_no_lints( "Being woke to gender discrimination is difficult", SimplePastToPastParticiple::default(), ); } #[test] fn dont_flag_be_woke() { assert_no_lints( "So You Want To Be Woke. The path to becoming woke is hard", SimplePastToPastParticiple::default(), ); } #[test] fn dont_flag_id_did() { assert_no_lints( "Prop id did not match.", SimplePastToPastParticiple::default(), ); } #[test] fn dont_flag_id_came() { assert_no_lints( "I'm a longtime user of UniFi and site ID came around after my account was established.", SimplePastToPastParticiple::default(), ); } #[test] fn dont_flag_id_went() { assert_no_lints( "Could not determine debug ID went away after cleaning the dist/ before the build, so that's unrelated.", SimplePastToPastParticiple::default(), ); } } ================================================ FILE: harper-core/src/linting/since_duration.rs ================================================ use crate::expr::{DurationExpr, Expr, SequenceExpr}; use crate::{CharStringExt, Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; const AGO_VARIANTS: [&[char]; 3] = [&['a', 'g', 'o'], &['A', 'g', 'o'], &['A', 'G', 'O']]; const FOR_VARIANTS: [&[char]; 3] = [&['f', 'o', 'r'], &['F', 'o', 'r'], &['F', 'O', 'R']]; fn match_case_string<'a>(template: &[char], variants: [&'a [char]; 3]) -> &'a [char] { let c1 = template.first().copied().unwrap(); let c2 = template.get(1).copied().unwrap_or(' '); if c1.is_uppercase() && c2.is_uppercase() { variants[2] } else if c1.is_uppercase() { variants[1] } else { variants[0] } } pub struct SinceDuration { expr: SequenceExpr, } impl Default for SinceDuration { fn default() -> Self { Self { expr: SequenceExpr::any_capitalization_of("since") .then_whitespace() .then(DurationExpr) .then_optional( SequenceExpr::default() .t_ws() .then_word_set(&["ago", "old"]), ), } } } impl ExprLinter for SinceDuration { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let last = toks.last()?; if last .span .get_content(src) .eq_any_ignore_ascii_case_chars(&[&['a', 'g', 'o'], &['o', 'l', 'd']]) { return None; } let since_duration_span = toks.span()?; let mut since_point_in_time = since_duration_span.get_content(src).to_vec(); since_point_in_time.push(' '); let unit_template = toks.last()?.span.get_content(src); since_point_in_time.extend( match_case_string(unit_template, AGO_VARIANTS) .iter() .copied(), ); let ago_suggestion = Suggestion::ReplaceWith(since_point_in_time); let duration = toks[1..].span()?.get_content(src); let since_template = toks.first()?.span.get_content(src); let mut for_duration = match_case_string(since_template, FOR_VARIANTS).to_vec(); for_duration.extend(duration); let for_suggestion = Suggestion::ReplaceWith(for_duration); Some(Lint { span: since_duration_span, lint_kind: LintKind::Miscellaneous, suggestions: vec![for_suggestion, ago_suggestion], message: "For a duration, use 'for' instead of 'since'. Or for a point in time, add 'ago' at the end.".to_string(), priority: 50, }) } fn description(&self) -> &str { "Detects the use of 'since' with a duration instead of a point in time." } } #[cfg(test)] mod tests { use super::SinceDuration; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn catches_spelled() { assert_lint_count( "I have been waiting since two hours.", SinceDuration::default(), 1, ); } #[test] fn permits_spelled_with_ago() { assert_no_lints( "I have been waiting since two hours ago.", SinceDuration::default(), ); } #[test] fn catches_numerals() { assert_lint_count( "I have been waiting since 2 hours.", SinceDuration::default(), 1, ); } #[test] fn permits_numerals_with_ago() { assert_no_lints( "I have been waiting since 2 hours ago.", SinceDuration::default(), ); } #[test] fn correct_without_issues() { assert_suggestion_result( "I'm running v2.2.1 on bare metal (no docker, vm) since two weeks without issues.", SinceDuration::default(), "I'm running v2.2.1 on bare metal (no docker, vm) for two weeks without issues.", ); } #[test] fn correct_anything_back() { assert_suggestion_result( "I have not heard anything back since three months.", SinceDuration::default(), "I have not heard anything back for three months.", ); } #[test] fn correct_get_done() { assert_suggestion_result( "I am trying to get this done since two days, someone please help.", SinceDuration::default(), "I am trying to get this done for two days, someone please help.", ); } #[test] fn correct_deprecated() { assert_suggestion_result( "This project is now officially deprecated, since I worked with virtualabs on the next version of Mirage since three years now: an ecosystem of tools named WHAD.", SinceDuration::default(), "This project is now officially deprecated, since I worked with virtualabs on the next version of Mirage for three years now: an ecosystem of tools named WHAD.", ); } #[test] fn correct_same() { assert_suggestion_result( "Same! Since two days.", SinceDuration::default(), "Same! For two days.", ); } #[test] fn correct_what_changed() { assert_suggestion_result( "What changed since two weeks?", SinceDuration::default(), "What changed since two weeks ago?", ); } #[test] fn correct_with_period() { assert_suggestion_result( "I have been waiting since two hours.", SinceDuration::default(), "I have been waiting since two hours ago.", ); } #[test] fn correct_with_exclamation() { assert_suggestion_result( "I have been waiting since two hours!", SinceDuration::default(), "I have been waiting since two hours ago!", ); } #[test] fn correct_with_question_mark() { assert_suggestion_result( "Have you been waiting since two hours?", SinceDuration::default(), "Have you been waiting for two hours?", ); } #[test] fn correct_with_comma() { assert_suggestion_result( "Since two days, I have been trying to get this done.", SinceDuration::default(), "For two days, I have been trying to get this done.", ); } #[test] fn correct_for_title_case() { assert_suggestion_result( "Since 45 Minutes I See The Following Picture In The Terminal.", SinceDuration::default(), "For 45 Minutes I See The Following Picture In The Terminal.", ); } #[test] fn correct_for_all_caps() { assert_suggestion_result( "STOPPED SINCE 12 HOURS WITH EXIT CODE 0", SinceDuration::default(), "STOPPED FOR 12 HOURS WITH EXIT CODE 0", ); } #[test] fn correct_ago_title_case() { assert_suggestion_result( "It Is In Development Since Two Years.", SinceDuration::default(), "It Is In Development Since Two Years Ago.", ); } #[test] fn correct_ago_all_caps() { assert_suggestion_result( "BUG: SINCE 6 MONTHS UNLOAD CHECKPOINT", SinceDuration::default(), "BUG: SINCE 6 MONTHS AGO UNLOAD CHECKPOINT", ); } #[test] #[ignore = "We can't yet handle modifiers like 'over'. Plus it doesn't work with 'ago'."] fn not_yet_handled() { assert_suggestion_result( "It's an asked feature since over 9 years", SinceDuration::default(), "It's an asked feature for over 9 years.", ); } #[test] #[ignore = "We can't yet handle modifiers like 'more than'. Plus it doesn't work with 'ago'."] fn not_yet_handled_2() { assert_suggestion_result( "It's an asked feature since more than 9 years", SinceDuration::default(), "It's an asked feature for more than 9 years.", ); } #[test] #[ignore = "We can't yet handle indefinite numbers."] fn not_yet_handled_3() { assert_suggestion_result( "I use a Wacom Cintiq 27QHDT since several years on Linux", SinceDuration::default(), "I use a Wacom Cintiq 27QHDT for several years on Linux", ); } #[test] fn ignore_since_years_old() { assert_no_lints( "I've been coding since 11 years old and I'm now 57", SinceDuration::default(), ); } } ================================================ FILE: harper-core/src/linting/single_be.rs ================================================ use crate::dict_word_metadata::VerbFormFlags; use crate::linting::expr_linter::Chunk; use crate::{ Span, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::{DerivedFrom, InflectionOfBe}, }; fn be_forms(token: &Token) -> Option { let metadata = token .kind .as_word() .and_then(|metadata| metadata.as_ref())?; let verb_data = metadata.verb.as_ref()?; verb_data.verb_forms } fn is_past_flag(forms: VerbFormFlags) -> bool { forms.intersects(VerbFormFlags::PAST | VerbFormFlags::PRETERITE) } fn looks_like_be_contraction(token: &Token, source: &[char]) -> bool { let Some(_) = token.kind.as_word() else { return false; }; if token.kind.is_possessive_nominal() && token.kind.is_proper_noun() { return false; } let content = token.span.get_content(source); let Some(apostrophe_idx) = content.iter().rposition(|c| matches!(*c, '\'' | '’')) else { return false; }; let base_slice = &content[..apostrophe_idx]; if token.kind.is_possessive_nominal() && token.kind.is_proper_noun() { return false; } if base_slice .first() .is_some_and(|c| c.is_uppercase() && token.kind.is_nominal() && !token.kind.is_pronoun()) { return false; } let base: Vec = base_slice.iter().map(|c| c.to_ascii_lowercase()).collect(); if base == ['l', 'e', 't'] { return false; } let suffix: Vec = content[apostrophe_idx + 1..] .iter() .map(|c| c.to_ascii_lowercase()) .collect(); matches!(suffix.as_slice(), ['s'] | ['r', 'e'] | ['m']) && apostrophe_idx > 0 } pub struct SingleBe { expr: SequenceExpr, } impl Default for SingleBe { fn default() -> Self { fn be_like_expr() -> SequenceExpr { SequenceExpr::any_of(vec![ Box::new(InflectionOfBe::new()), Box::new(DerivedFrom::new_from_str("be")), Box::new(looks_like_be_contraction), ]) } let expr = SequenceExpr::with(be_like_expr()) .t_ws() .then(be_like_expr()); Self { expr } } } impl ExprLinter for SingleBe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let first = matched_tokens.first()?; let second = matched_tokens.last()?; if first.kind.is_possessive_nominal() && first.kind.is_proper_noun() { return None; } if first.kind.is_possessive_nominal() && first .span .get_content(source) .first() .is_some_and(|c| c.is_uppercase()) { return None; } let progressive_like = |tok: &Token| { be_forms(tok).map_or_else( || false, |forms| { forms.intersects(VerbFormFlags::PROGRESSIVE | VerbFormFlags::PAST_PARTICIPLE) }, ) }; if progressive_like(first) || progressive_like(second) { return None; } let first_is_past = be_forms(first) .map(is_past_flag) .unwrap_or_else(|| first.kind.is_verb_past_form()); let second_is_past = be_forms(second) .map(is_past_flag) .unwrap_or_else(|| second.kind.is_verb_past_form()); let first_chars = first.span.get_content(source); let base_before_apostrophe = first_chars .iter() .rposition(|c| matches!(*c, '\'' | '’')) .map(|idx| &first_chars[..idx]); if let Some(base) = base_before_apostrophe { let base_first_upper = base.first().is_some_and(|c| c.is_uppercase()); let base_lower: Vec = base.iter().map(|c| c.to_ascii_lowercase()).collect(); let is_common_pronoun = matches!( base_lower.as_slice(), ['i'] | ['w', 'e'] | ['t', 'h', 'e', 'y'] | ['y', 'o', 'u'] | ['h', 'e'] | ['s', 'h', 'e'] | ['i', 't'] | ['t', 'h', 'a', 't'] | ['t', 'h', 'e', 'r', 'e'] ); if base_first_upper && !first.kind.is_pronoun() && !is_common_pronoun { return None; } } if first_is_past && second_is_past { return None; } let whitespace_start = matched_tokens.get(1)?.span.start; let second_be_end = second.span.end; Some(Lint { span: Span::new(whitespace_start, second_be_end), lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::Remove], message: "Drop the repeated verb form so only one instance of `be` remains.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Removes adjacent duplicate inflections of `be`, including contracted forms followed by another `be` verb." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; use super::SingleBe; #[test] fn removes_double_is() { assert_suggestion_result( "The server is is slow.", SingleBe::default(), "The server is slow.", ); } #[test] fn removes_is_are() { assert_suggestion_result( "This is are unusual.", SingleBe::default(), "This is unusual.", ); } #[test] fn removes_are_were_mismatch() { assert_suggestion_result( "They are were excited.", SingleBe::default(), "They are excited.", ); } #[test] fn removes_mismatched_pair() { assert_suggestion_result("That is was odd.", SingleBe::default(), "That is odd."); } #[test] fn handles_s_contraction() { assert_suggestion_result( "The error's are gone.", SingleBe::default(), "The error's gone.", ); } #[test] fn handles_re_contraction() { assert_suggestion_result( "We're are ready to ship.", SingleBe::default(), "We're ready to ship.", ); } #[test] fn handles_m_contraction() { assert_suggestion_result("I'm am aware.", SingleBe::default(), "I'm aware."); } #[test] fn handles_future_repetition() { assert_suggestion_result( "That will be be an issue.", SingleBe::default(), "That will be an issue.", ); } #[test] fn skips_being_chain() { assert_no_lints("It's been being rebuilt for months.", SingleBe::default()); } #[test] fn allows_simple_be_statement() { assert_no_lints("Let's be honest.", SingleBe::default()); } #[test] fn allows_possessive_before_are() { assert_no_lints( "Stories like Mateo's are the heart of what we do.", SingleBe::default(), ); } #[test] fn removes_across_newline() { assert_suggestion_result( "That is\nis tricky.", SingleBe::default(), "That is tricky.", ); } #[test] fn ignores_separated_forms() { assert_no_lints("The server is not is down.", SingleBe::default()); } #[test] fn ignores_single_be() { assert_no_lints("This is ready.", SingleBe::default()); } } ================================================ FILE: harper-core/src/linting/some_without_article.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct SomeWithoutArticle { expr: SequenceExpr, } impl Default for SomeWithoutArticle { fn default() -> Self { let expr = SequenceExpr::any_capitalization_of("the") .t_ws() .then_any_capitalization_of("some"); Self { expr } } } impl ExprLinter for SomeWithoutArticle { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let template = span.get_content(source); let some_chars = matched_tokens.last()?.span.get_content(source); let suggestions = vec![ Suggestion::ReplaceWith(some_chars.to_vec()), Suggestion::replace_with_match_case("the same".chars().collect(), template), ]; Some(Lint { span, lint_kind: LintKind::WordChoice, message: "Use `some` on its own here, or switch to `the same` if that was the intention." .to_owned(), suggestions, ..Default::default() }) } fn description(&self) -> &'static str { "Detects the redundant article in front of `some` and suggests more natural phrasing." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::SomeWithoutArticle; #[test] fn fixes_simple_lowercase() { assert_suggestion_result( "We interviewed the some candidates today.", SomeWithoutArticle::default(), "We interviewed some candidates today.", ); } #[test] fn fixes_sentence_case() { assert_suggestion_result( "The Some volunteers arrived early.", SomeWithoutArticle::default(), "Some volunteers arrived early.", ); } #[test] fn preserves_uppercase_block() { assert_suggestion_result( "THE SOME OPTIONS WERE LISTED.", SomeWithoutArticle::default(), "SOME OPTIONS WERE LISTED.", ); } #[test] fn second_suggestion_produces_the_same() { assert_suggestion_result( "We kept the some approach from last year.", SomeWithoutArticle::default(), "We kept the same approach from last year.", ); } #[test] fn ignores_already_correct_some() { assert_lint_count( "We interviewed some candidates today.", SomeWithoutArticle::default(), 0, ); } #[test] fn ignores_the_same() { assert_lint_count( "We kept the same approach from last year.", SomeWithoutArticle::default(), 0, ); } #[test] fn ignores_the_something() { assert_lint_count( "We interviewed the something else entirely.", SomeWithoutArticle::default(), 0, ); } #[test] fn works_before_comma() { assert_suggestion_result( "They reviewed the some, then finalized the list.", SomeWithoutArticle::default(), "They reviewed some, then finalized the list.", ); } #[test] fn works_before_possessive_noun() { assert_suggestion_result( "The report praised the some team's effort.", SomeWithoutArticle::default(), "The report praised some team's effort.", ); } #[test] fn handles_line_break_spacing() { assert_suggestion_result( "We invited the some\nartists to perform.", SomeWithoutArticle::default(), "We invited some\nartists to perform.", ); } } ================================================ FILE: harper-core/src/linting/something_is.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::patterns::WordSet; use crate::{Token, TokenKind}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct SomethingIs { expr: SequenceExpr, } impl Default for SomethingIs { fn default() -> Self { let forms = WordSet::new(&["somethings", "anythings", "everythings", "nothings"]); let expr = SequenceExpr::with(forms) .t_ws() .then_optional(SequenceExpr::default().then_one_or_more_adverbs().t_ws()) .then_kind_any(&[TokenKind::is_verb_progressive_form]); Self { expr } } } impl ExprLinter for SomethingIs { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offender = matched_tokens.first()?; let original = offender.span.get_content(source); let stem_len = original.len().checked_sub(1)?; let stem = original[..stem_len].to_vec(); let mut contraction = stem.clone(); contraction.extend(['\'', 's']); let mut expanded = stem; expanded.push(' '); expanded.extend(['i', 's']); Some(Lint { span: offender.span, lint_kind: LintKind::WordChoice, suggestions: vec![ Suggestion::replace_with_match_case(contraction, original), Suggestion::replace_with_match_case(expanded, original), ], message: "Prefer the contraction or full `is` rather than pluralizing this pronoun." .into(), priority: 31, }) } fn description(&self) -> &str { "Flags forms like `somethings` before progressive verbs and suggests using `something's` or `something is`." } } #[cfg(test)] mod tests { use super::SomethingIs; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn fixes_somethings_going() { assert_suggestion_result( "Somethings going well today.", SomethingIs::default(), "Something's going well today.", ); } #[test] fn fixes_anythings_happening() { assert_suggestion_result( "Anythings happening tonight?", SomethingIs::default(), "Anything's happening tonight?", ); } #[test] fn fixes_everythings_working() { assert_suggestion_result( "Everythings working smoothly.", SomethingIs::default(), "Everything's working smoothly.", ); } #[test] fn fixes_nothings_changing() { assert_suggestion_result( "Nothings changing around here.", SomethingIs::default(), "Nothing's changing around here.", ); } #[test] fn fixes_with_adverb() { assert_suggestion_result( "Somethings really happening now.", SomethingIs::default(), "Something's really happening now.", ); } #[test] fn fixes_uppercase() { assert_suggestion_result( "SOMETHINGS HAPPENING NOW!", SomethingIs::default(), "SOMETHING'S HAPPENING NOW!", ); } #[test] fn offers_is_expansion() { assert_suggestion_result( "Somethings going wrong.", SomethingIs::default(), "Something is going wrong.", ); } #[test] fn no_lint_when_contracted() { assert_no_lints("Something's going well today.", SomethingIs::default()); } #[test] fn no_lint_when_plural_noun() { assert_lint_count( "Somethings in the attic kept us awake.", SomethingIs::default(), 0, ); } #[test] fn no_lint_at_sentence_end() { assert_no_lints("Somethings.", SomethingIs::default()); } } ================================================ FILE: harper-core/src/linting/somewhat_something.rs ================================================ use crate::Token; use crate::expr::{Expr, SequenceExpr}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct SomewhatSomething { expr: SequenceExpr, } impl Default for SomewhatSomething { fn default() -> Self { let pattern = SequenceExpr::aco("somewhat") .then_whitespace() .t_aco("of") .then_whitespace() .t_aco("a"); Self { expr: pattern } } } impl ExprLinter for SomewhatSomething { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.first()?.span; let og = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Style, suggestions: vec![Suggestion::replace_with_match_case_str("something", og)], message: "Consider using `something of a` in more formal writing.".to_owned(), priority: 63, }) } fn description(&self) -> &'static str { "Flags the phrase `somewhat of a` in favor of `something of a`, which can be considered more traditional." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::SomewhatSomething; #[test] fn issue_414() { assert_suggestion_result( "This may be somewhat of a surprise.", SomewhatSomething::default(), "This may be something of a surprise.", ); } #[test] fn flag_these() { assert_suggestion_result( "These are somewhat of a cult data structure.", SomewhatSomething::default(), "These are something of a cult data structure.", ); } } ================================================ FILE: harper-core/src/linting/soon_to_be.rs ================================================ use std::ops::Range; use crate::{ Token, TokenKind, TokenStringExt, expr::{Expr, ExprMap, SequenceExpr}, linting::expr_linter::Chunk, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::NominalPhrase, }; pub struct SoonToBe { expr: ExprMap>, } impl Default for SoonToBe { fn default() -> Self { let mut map = ExprMap::default(); let soon_to_be = || { SequenceExpr::default() .t_aco("soon") .t_ws() .t_aco("to") .t_ws() .t_aco("be") }; let nominal_tail = || { SequenceExpr::optional(SequenceExpr::default().then_one_or_more_adverbs().t_ws()) .then(NominalPhrase) }; let hyphenated_number_modifier = || { SequenceExpr::default() .then_number() .then_hyphen() .then_nominal() .then_optional(SequenceExpr::default().then_hyphen().then_adjective()) .t_ws() .then_nominal() }; let hyphenated_compound = || { SequenceExpr::default() .then_kind_any(&[TokenKind::is_word_like as fn(&TokenKind) -> bool]) .then_hyphen() .then_nominal() }; let trailing_phrase = || { SequenceExpr::any_of(vec![ Box::new(hyphenated_number_modifier()), Box::new(hyphenated_compound()), Box::new(nominal_tail()), ]) }; map.insert( SequenceExpr::default() .then_determiner() .t_ws() .then_seq(soon_to_be()) .t_ws() .then_seq(trailing_phrase()), 2usize..7usize, ); map.insert( SequenceExpr::default() .then_seq(soon_to_be()) .t_ws() .then_seq(trailing_phrase()), 0usize..5usize, ); Self { expr: map } } } impl ExprLinter for SoonToBe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let range = self.expr.lookup(0, matched_tokens, source)?; let span = matched_tokens.get(range.start..range.end)?.span()?; let template = span.get_content(source); let mut nominal_found = false; for tok in matched_tokens.iter().skip(range.end) { if tok.kind.is_whitespace() || tok.kind.is_hyphen() { continue; } if tok.kind.is_punctuation() { break; } if tok.kind.is_nominal() { if tok.kind.is_preposition() { continue; } else { nominal_found = true; break; } } } if !nominal_found { return None; } Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case_str( "soon-to-be", template, )], message: "Use hyphens when `soon to be` modifies a noun.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Hyphenates `soon-to-be` when it appears before a noun." } } #[cfg(test)] mod tests { use super::SoonToBe; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn hyphenates_possessive_phrase() { assert_suggestion_result( "We met his soon to be boss at lunch.", SoonToBe::default(), "We met his soon-to-be boss at lunch.", ); } #[test] fn hyphenates_article_phrase() { assert_suggestion_result( "They toasted the soon to be couple.", SoonToBe::default(), "They toasted the soon-to-be couple.", ); } #[test] fn hyphenates_sentence_start() { assert_suggestion_result( "Soon to be parents filled the classroom.", SoonToBe::default(), "Soon-to-be parents filled the classroom.", ); } #[test] fn allows_existing_hyphens() { assert_no_lints("We met his soon-to-be boss yesterday.", SoonToBe::default()); } #[test] fn keeps_non_adjectival_use() { assert_no_lints("The concert is soon to be over.", SoonToBe::default()); } #[test] fn hyphenates_with_adverb() { assert_suggestion_result( "Our soon to be newly married friends visited.", SoonToBe::default(), "Our soon-to-be newly married friends visited.", ); } #[test] fn hyphenates_hyphenated_number_phrase() { assert_suggestion_result( "Our soon to be 5-year-old son starts school.", SoonToBe::default(), "Our soon-to-be 5-year-old son starts school.", ); } #[test] fn hyphenates_in_law_phrase() { assert_suggestion_result( "She thanked her soon to be in-laws for hosting.", SoonToBe::default(), "She thanked her soon-to-be in-laws for hosting.", ); } #[test] fn hyphenates_future_event() { assert_suggestion_result( "We reserved space for our soon to be celebration.", SoonToBe::default(), "We reserved space for our soon-to-be celebration.", ); } #[test] fn ignores_misaligned_verb_chain() { assert_lint_count( "They will soon to be moving overseas.", SoonToBe::default(), 0, ); } #[test] fn hyphenates_guest_example() { assert_suggestion_result( "I cooked for my soon to be guests.", SoonToBe::default(), "I cooked for my soon-to-be guests.", ); } #[test] fn ignores_rearranged_phrase() { assert_no_lints("We hope to soon be home.", SoonToBe::default()); } } ================================================ FILE: harper-core/src/linting/sought_after.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::{Token, TokenKind}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct SoughtAfter { expr: SequenceExpr, } impl Default for SoughtAfter { fn default() -> Self { let pattern = SequenceExpr::any_of(vec![ Box::new( SequenceExpr::default() .then_kind_except(TokenKind::is_adverb, &["always", "maybe", "not", "perhaps"]), ), Box::new(SequenceExpr::word_set(&[ "abit", // Typo for "a bit" "are", // may cause false positive, but few found so far. "bit", // "is" causes many false postivies and disambiguating looks tricky. // "maybe" causes many false postivies and disambiguating looks tricky. "of", "quiet", // Common typo for "quite". ])), ]) .t_ws() .t_aco("sort") .t_ws_h() .t_aco("after"); Self { expr: pattern } } } impl ExprLinter for SoughtAfter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let span = toks[2].span; Some(Lint { span, lint_kind: LintKind::Eggcorn, suggestions: vec![Suggestion::replace_with_match_case_str( "sought", span.get_content(src), )], message: "The correct word in this context is `sought`.".to_owned(), priority: 63, }) } fn description(&self) -> &'static str { "Correct `sort after` to `sought after`" } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; use super::SoughtAfter; #[test] fn fix_abit_sort_after() { assert_suggestion_result( "Blue mountain buffalo no damage abit sort after,$120 ono.", SoughtAfter::default(), "Blue mountain buffalo no damage abit sought after,$120 ono.", ); } #[test] fn dont_flag_always_sort_after() { assert_lint_count( "Always sort after converting your set into list objects", SoughtAfter::default(), 0, ); } #[test] fn fix_are_sort_after() { assert_suggestion_result( "Ux engineers are sort after, but it requires experience.", SoughtAfter::default(), "Ux engineers are sought after, but it requires experience.", ) } #[test] fn fix_are_sort_after_hyphenated() { assert_suggestion_result( "optimistic people are sort-after for their life", SoughtAfter::default(), "optimistic people are sought-after for their life", ); } #[test] fn fix_bit_sort_after() { assert_suggestion_result( "It's the early enduro model getting a bit sort after now", SoughtAfter::default(), "It's the early enduro model getting a bit sought after now", ); } #[test] fn fix_extremely_sort_after() { assert_suggestion_result( "3 extremely sort after Pokémon trading cards.", SoughtAfter::default(), "3 extremely sought after Pokémon trading cards.", ); } #[test] fn fix_fairly_sort_after() { assert_suggestion_result( "The ability for editors to add tables to pages is a fairly sort after piece of functionality", SoughtAfter::default(), "The ability for editors to add tables to pages is a fairly sought after piece of functionality", ); } #[test] fn fix_highly_sort_after() { assert_suggestion_result( "Wrestlemania 2K adds three highly sort after features", SoughtAfter::default(), "Wrestlemania 2K adds three highly sought after features", ); } #[test] fn fix_hugely_sort_after() { assert_suggestion_result( "Currently the hugely sort after and most highly prized variety is the electric neon blue Paraiba Tourmaline.", SoughtAfter::default(), "Currently the hugely sought after and most highly prized variety is the electric neon blue Paraiba Tourmaline.", ); } #[test] fn fix_incredibly_sort_after() { assert_suggestion_result( "This is no surprise as it's been an incredibly sort after and top choice amongst outdoorists from all walks of life.", SoughtAfter::default(), "This is no surprise as it's been an incredibly sought after and top choice amongst outdoorists from all walks of life.", ); } #[test] #[ignore = "'Is' is a bit more subtle to handle correctly"] fn fix_is_sort_after() { assert_suggestion_result( "White bait is sort after by many fisherman because they are a delicacy.", SoughtAfter::default(), "White bait is sought after by many fisherman because they are a delicacy.", ); } #[test] fn dont_flag_is_sort_after() { assert_lint_count( "What I would do is sort after the union or join.", SoughtAfter::default(), 0, ); } #[test] fn fix_kinda_sort_after() { assert_suggestion_result( "If so is the US bond still kinda sort after as it's tied to USD (that's how I took OPs post).", SoughtAfter::default(), "If so is the US bond still kinda sought after as it's tied to USD (that's how I took OPs post).", ); } #[test] fn dont_flag_maybe_sort_after() { assert_lint_count( "Or maybe sort after adding the index?", SoughtAfter::default(), 0, ); } #[test] fn fix_most_sort_after() { assert_suggestion_result( "This has got to be one of the most sort after solutions.", SoughtAfter::default(), "This has got to be one of the most sought after solutions.", ); } #[test] fn fix_mostly_sort_after() { assert_suggestion_result( "What color and size is mostly sort after In ladies footwear", SoughtAfter::default(), "What color and size is mostly sought after In ladies footwear", ); } #[test] fn fix_much_sort_after() { assert_suggestion_result( "Sending audio files is a much sort after feature in chat apps.", SoughtAfter::default(), "Sending audio files is a much sought after feature in chat apps.", ); } #[test] fn dont_flag_not_sort_after() { assert_lint_count( "My issue is that it does not sort after the startyear", SoughtAfter::default(), 0, ); } // This part is occasionally sort after and if they were easily available I reckon you'd sell a few easily enough. #[test] fn fix_occasionally_sort_after() { assert_suggestion_result( "This part is occasionally sort after and if they were easily available I reckon you'd sell a few easily enough.", SoughtAfter::default(), "This part is occasionally sought after and if they were easily available I reckon you'd sell a few easily enough.", ); } #[test] fn fix_of_sort_after() { assert_suggestion_result( "A couple of sort after casserole pots .", SoughtAfter::default(), "A couple of sought after casserole pots .", ); } #[test] fn fix_often_sort_after() { assert_suggestion_result( "North American countries (ok, there are only two) often sort after the total amount of medals.", SoughtAfter::default(), "North American countries (ok, there are only two) often sought after the total amount of medals.", ); } #[test] #[ignore = "'Perhaps' is a bit more subtle to handle correctly"] fn fix_perhaps_sort_after() { assert_suggestion_result( "Perhaps sort after guitar teachers could do a similar teaching tour to a few major cities", SoughtAfter::default(), "Perhaps sought after guitar teachers could do a similar teaching tour to a few major cities", ); } #[test] fn dont_flat_perhaps_sort_after() { assert_lint_count( "min_Vround: perhaps sort after min_breadth.", SoughtAfter::default(), 0, ); } #[test] fn flag_pretty_sort_after() { assert_suggestion_result( "But just like jin and V, he is also pretty sort after", SoughtAfter::default(), "But just like jin and V, he is also pretty sought after", ); } #[test] fn fix_quiet_sort_after_sic() { assert_suggestion_result( "MBA in Christ (deemed university) is quiet sort after in South India", SoughtAfter::default(), "MBA in Christ (deemed university) is quiet sought after in South India", ); } // The university that i studied my MBBS from offers the course as well and it is quite sort after for the above said course. #[test] fn fix_quite_sort_after() { assert_suggestion_result( "The university that i studied my MBBS from offers the course as well and it is quite sort after for the above said course.", SoughtAfter::default(), "The university that i studied my MBBS from offers the course as well and it is quite sought after for the above said course.", ); } #[test] fn fix_rather_sort_after() { assert_suggestion_result( "In a bid to satisfy an innate inquisitive hunger for a rather sort after phenomenon that only a few could precisely speak", SoughtAfter::default(), "In a bid to satisfy an innate inquisitive hunger for a rather sought after phenomenon that only a few could precisely speak", ); } #[test] fn fix_really_sort_after() { assert_suggestion_result( "Creators - especially women in their 30s, 40s, 50s and 60s are really sort after.", SoughtAfter::default(), "Creators - especially women in their 30s, 40s, 50s and 60s are really sought after.", ); } #[test] fn fix_sometimes_sort_after() { assert_suggestion_result( "the N15 1.6L gearbox is sometimes sort after for the micra", SoughtAfter::default(), "the N15 1.6L gearbox is sometimes sought after for the micra", ); } #[test] fn fix_somewhat_sort_after() { assert_suggestion_result( "I know tri res boots used to be somewhat sort after, but not sure now!", SoughtAfter::default(), "I know tri res boots used to be somewhat sought after, but not sure now!", ); } #[test] fn fix_strongly_sort_after() { assert_suggestion_result( "This eventually leads to the growth that is so strongly sort after.", SoughtAfter::default(), "This eventually leads to the growth that is so strongly sought after.", ); } #[test] fn fix_vastly_sort_after() { assert_suggestion_result( "Hardie stuff no longer vastly sort after as it was years ago , hasn't been for decades.", SoughtAfter::default(), "Hardie stuff no longer vastly sought after as it was years ago , hasn't been for decades.", ); } #[test] fn fix_very_sort_after() { assert_suggestion_result( "I could imagine, this functionality very sort after.", SoughtAfter::default(), "I could imagine, this functionality very sought after.", ); } } ================================================ FILE: harper-core/src/linting/spaces.rs ================================================ use super::{Lint, LintKind, Linter, Suggestion}; use crate::TokenStringExt; use crate::{Document, Token, TokenKind}; #[derive(Debug, Default)] pub struct Spaces; impl Linter for Spaces { fn lint(&mut self, document: &Document) -> Vec { let mut output = Vec::new(); for sentence in document.iter_sentences() { for space_idx in sentence.iter_space_indices() { if space_idx == 0 { continue; } let space = &sentence[space_idx]; let TokenKind::Space(count) = space.kind else { panic!("The space iterator should only return spaces.") }; if count > 1 { output.push(Lint { span: space.span, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::ReplaceWith(vec![' '])], message: format!( "There are {count} spaces where there should be only one." ), priority: 15, }) } } if matches!( sentence, [ .., Token { kind: TokenKind::Word(_), .. }, Token { kind: TokenKind::Space(_), .. }, Token { kind: TokenKind::Punctuation(_), .. } ] ) && let Some(space) = sentence.get_rel(-2) { output.push(Lint { span: space.span, lint_kind: LintKind::Formatting, suggestions: vec![Suggestion::Remove], message: "Unnecessary space at the end of the sentence.".to_string(), priority: 63, }) } } output } fn description(&self) -> &'static str { "Words should be separated by at most one space." } } #[cfg(test)] mod tests { use super::Spaces; use crate::linting::tests::{assert_lint_count, assert_no_lints}; #[test] fn detects_space_before_period() { let source = "There is a space at the end of this sentence ."; assert_lint_count(source, Spaces, 1) } #[test] fn allows_period_without_space() { let source = "There isn't a space at the end of this sentence."; assert_lint_count(source, Spaces, 0) } #[test] fn ignores_french_spacing() { assert_no_lints( "This is a short sentence. This is another short sentence.", Spaces, ); } } ================================================ FILE: harper-core/src/linting/spell_check.rs ================================================ use std::num::NonZero; use lru::LruCache; use smallvec::ToSmallVec; use super::Suggestion; use super::{Lint, LintKind, Linter}; use crate::document::Document; use crate::spell::{Dictionary, suggest_correct_spelling}; use crate::{CharString, CharStringExt, Dialect, TokenStringExt}; pub struct SpellCheck where T: Dictionary, { dictionary: T, suggestion_cache: LruCache>, dialect: Dialect, } impl SpellCheck { pub fn new(dictionary: T, dialect: Dialect) -> Self { Self { dictionary, suggestion_cache: LruCache::new(NonZero::new(10000).unwrap()), dialect, } } const MAX_SUGGESTIONS: usize = 3; fn suggest_correct_spelling(&mut self, word: &[char]) -> Vec { if let Some(hit) = self.suggestion_cache.get(word) { hit.clone() } else { let suggestions = self.uncached_suggest_correct_spelling(word); self.suggestion_cache.put(word.into(), suggestions.clone()); suggestions } } fn uncached_suggest_correct_spelling(&self, word: &[char]) -> Vec { // Back off until we find a match. for dist in 2..5 { let suggestions: Vec = suggest_correct_spelling(word, 200, dist, &self.dictionary) .into_iter() .filter(|v| { // Ignore entries outside the configured dialect self.dictionary .get_word_metadata(v) .unwrap() .dialects .is_dialect_enabled(self.dialect) }) .map(|v| v.to_smallvec()) .take(Self::MAX_SUGGESTIONS) .collect(); if !suggestions.is_empty() { return suggestions; } } // no suggestions found Vec::new() } } impl Linter for SpellCheck { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for word in document.iter_words() { let word_chars = document.get_span_content(&word.span); if let Some(metadata) = word.kind.as_word().unwrap() && metadata.dialects.is_dialect_enabled(self.dialect) && (self.dictionary.contains_exact_word(word_chars) || self.dictionary.contains_exact_word(&word_chars.to_lower())) { continue; }; let mut possibilities = self.suggest_correct_spelling(word_chars); // If the misspelled word is capitalized, capitalize the results too. if let Some(mis_f) = word_chars.first() && mis_f.is_uppercase() { for sug_f in possibilities.iter_mut().filter_map(|w| { // Skip words that have uppercase chars in any position except the first. // (For words with specific capitalization, like 'macOS') w.iter() .skip(1) .all(|c| !c.is_uppercase()) .then_some(w.first_mut()) .flatten() }) { *sug_f = sug_f.to_uppercase().next().unwrap(); } } let suggestions: Vec<_> = possibilities .iter() .map(|sug| Suggestion::ReplaceWith(sug.to_vec())) .collect(); // If there's only one suggestion, save the user a step in the GUI let message = if suggestions.len() == 1 { format!( "Did you mean `{}`?", possibilities.first().unwrap().iter().collect::() ) } else { format!( "Did you mean to spell `{}` this way?", document.get_span_content_str(&word.span) ) }; lints.push(Lint { span: word.span, lint_kind: LintKind::Spelling, suggestions, message, priority: 63, }) } lints } fn description(&self) -> &'static str { "Looks and provides corrections for misspelled words." } } #[cfg(test)] mod tests { use strum::IntoEnumIterator; use super::SpellCheck; use crate::dict_word_metadata::DialectFlags; use crate::linting::Linter; use crate::linting::tests::{assert_good_and_bad_suggestions, assert_no_lints}; use crate::spell::{Dictionary, FstDictionary, MergedDictionary, MutableDictionary}; use crate::{ Dialect, linting::tests::{assert_lint_count, assert_suggestion_result}, }; use crate::{DictWordMetadata, Document}; // Capitalization tests #[test] fn america_capitalized() { assert_suggestion_result( "The word america should be capitalized.", SpellCheck::new(FstDictionary::curated(), Dialect::American), "The word America should be capitalized.", ); } // Dialect tests #[test] fn harper_automattic_capitalized() { assert_lint_count( "So should harper and automattic.", SpellCheck::new(FstDictionary::curated(), Dialect::American), 2, ); } #[test] fn american_color_in_british_dialect() { assert_lint_count( "Do you like the color?", SpellCheck::new(FstDictionary::curated(), Dialect::British), 1, ); } #[test] fn canadian_words_in_australian_dialect() { assert_lint_count( "Does your mom like yogourt?", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 2, ); } #[test] fn australian_words_in_canadian_dialect() { assert_lint_count( "We mine bauxite to make aluminium.", SpellCheck::new(FstDictionary::curated(), Dialect::Canadian), 1, ); } #[test] fn mum_and_mummy_not_just_commonwealth() { assert_lint_count( "Mum's the word about that Egyptian mummy.", SpellCheck::new(FstDictionary::curated(), Dialect::American), 0, ); } #[test] fn australian_verandah() { assert_lint_count( "Our house has a verandah.", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 0, ); } #[test] fn australian_verandah_in_american_dialect() { assert_lint_count( "Our house has a verandah.", SpellCheck::new(FstDictionary::curated(), Dialect::American), 1, ); } #[test] fn australian_verandah_in_british_dialect() { assert_lint_count( "Our house has a verandah.", SpellCheck::new(FstDictionary::curated(), Dialect::British), 1, ); } #[test] fn australian_verandah_in_canadian_dialect() { assert_lint_count( "Our house has a verandah.", SpellCheck::new(FstDictionary::curated(), Dialect::Canadian), 1, ); } #[test] fn mixing_australian_and_canadian_dialects() { assert_lint_count( "In summer we sit on the verandah and eat yogourt.", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 1, ); } #[test] fn mixing_canadian_and_australian_dialects() { assert_lint_count( "In summer we sit on the verandah and eat yogourt.", SpellCheck::new(FstDictionary::curated(), Dialect::Canadian), 1, ); } #[test] fn australian_and_canadian_spellings_that_are_not_american() { assert_lint_count( "In summer we sit on the verandah and eat yogourt.", SpellCheck::new(FstDictionary::curated(), Dialect::American), 2, ); } #[test] fn australian_and_canadian_spellings_that_are_not_british() { assert_lint_count( "In summer we sit on the verandah and eat yogourt.", SpellCheck::new(FstDictionary::curated(), Dialect::British), 2, ); } #[test] fn australian_labour_vs_labor() { assert_lint_count( "In Australia we write 'labour' but the political party is the 'Labor Party'.", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 0, ) } #[test] fn australian_words_flagged_for_american_english() { assert_lint_count( "There's an esky full of beers in the back of the ute.", SpellCheck::new(FstDictionary::curated(), Dialect::American), 2, ); } #[test] fn american_words_not_flagged_for_australian_english() { assert_lint_count( "In general, utes have unibody construction while pickups have frames.", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 0, ); } #[test] fn abandonware_correction() { assert_suggestion_result( "abanonedware", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), "abandonware", ); } // Unit tests for specific spellcheck corrections #[test] fn corrects_abandonedware_1131_1166() { // assert_suggestion_result( assert_suggestion_result( "Abandonedware is abandoned. Do not bother submitting issues about the empty page bug. Author moved to greener pastures", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Abandonware is abandoned. Do not bother submitting issues about the empty page bug. Author moved to greener pastures", ); } #[test] fn afterwards_not_us() { assert_lint_count( "afterwards", SpellCheck::new(FstDictionary::curated(), Dialect::American), 1, ); } #[test] fn afterward_is_us() { assert_lint_count( "afterward", SpellCheck::new(FstDictionary::curated(), Dialect::American), 0, ); } #[test] fn afterward_not_au() { assert_lint_count( "afterward", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 1, ); } #[test] fn afterwards_is_au() { assert_lint_count( "afterwards", SpellCheck::new(FstDictionary::curated(), Dialect::Australian), 0, ); } #[test] fn afterward_not_ca() { assert_lint_count( "afterward", SpellCheck::new(FstDictionary::curated(), Dialect::Canadian), 1, ); } #[test] fn afterwards_is_ca() { assert_lint_count( "afterwards", SpellCheck::new(FstDictionary::curated(), Dialect::Canadian), 0, ); } #[test] fn afterward_not_uk() { assert_lint_count( "afterward", SpellCheck::new(FstDictionary::curated(), Dialect::British), 1, ); } #[test] fn afterwards_is_uk() { assert_lint_count( "afterwards", SpellCheck::new(FstDictionary::curated(), Dialect::British), 0, ); } #[test] fn corrects_hes() { assert_suggestion_result( "hes", SpellCheck::new(FstDictionary::curated(), Dialect::British), "he's", ); } #[test] fn corrects_shes() { assert_suggestion_result( "shes", SpellCheck::new(FstDictionary::curated(), Dialect::British), "she's", ); } #[test] fn issue_1876() { let user_dialect = Dialect::American; // Create a user dictionary with a word normally of another dialect in it. let mut user_dict = MutableDictionary::new(); user_dict.append_word_str( "Calibre", DictWordMetadata { dialects: DialectFlags::from_dialect(user_dialect), ..Default::default() }, ); // Create a merged dictionary, using curated first. let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(FstDictionary::curated()); merged_dict.add_dictionary(std::sync::Arc::from(user_dict)); assert!(merged_dict.contains_word_str("Calibre")); // No dialect issues should be found if the word from another dialect is in our user dictionary. assert_eq!( SpellCheck::new(merged_dict.clone(), user_dialect) .lint(&Document::new_markdown_default( "I like to use the software Calibre.", &merged_dict )) .len(), 0, "Calibre is not part of the user's dialect!" ); assert_eq!( SpellCheck::new(merged_dict.clone(), user_dialect) .lint(&Document::new_markdown_default( "I like to use the spelling colour.", &merged_dict )) .len(), 1 ); } #[test] fn matt_is_allowed() { for dialect in Dialect::iter() { dbg!(dialect); assert_no_lints( "Matt is a great name.", SpellCheck::new(FstDictionary::curated(), dialect), ); } } #[test] fn issue_2026() { assert_suggestion_result( "'Tere' is supposed to be 'There'", SpellCheck::new(FstDictionary::curated(), Dialect::British), "'There' is supposed to be 'There'", ); assert_suggestion_result( "'fll' is supposed to be 'fill'", SpellCheck::new(FstDictionary::curated(), Dialect::British), "'fill' is supposed to be 'fill'", ); } #[test] fn issue_2261() { assert_suggestion_result( "Generaly", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Generally", ); } #[test] fn flag_prepone_in_non_indian_english() { assert_lint_count( "We had to prepone the meeting", SpellCheck::new(FstDictionary::curated(), Dialect::American), 1, ); } #[test] fn dont_flag_prepone_in_indian_english() { assert_no_lints( "We had to prepone the meeting", SpellCheck::new(FstDictionary::curated(), Dialect::Indian), ); } #[test] fn dont_flag_pr() { assert_no_lints( "PR", SpellCheck::new(FstDictionary::curated(), Dialect::American), ); } #[test] fn no_improper_suggestion_for_macos() { assert_good_and_bad_suggestions( "MacOS", SpellCheck::new(FstDictionary::curated(), Dialect::American), &["macOS"], &["MacOS"], ); } // Tests that were previously in `spell/mod.rs` // Tests for dialect-specific misspelling patterns // is_ou_misspelling #[test] fn suggest_color_for_colour_lowercase() { assert_suggestion_result( "colour", SpellCheck::new(FstDictionary::curated(), Dialect::American), "color", ); } #[test] fn suggest_colour_for_color_lowercase() { assert_suggestion_result( "color", SpellCheck::new(FstDictionary::curated(), Dialect::British), "colour", ); } // titlecase #[test] fn suggest_color_for_colour_titlecase() { assert_suggestion_result( "Colour", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Color", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_colour_for_color_titlecase() { assert_suggestion_result( "Color", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Colour", ); } // all-caps #[test] #[ignore = "known failure due to bug"] fn suggest_color_for_colour_all_caps() { assert_suggestion_result( "COLOUR", SpellCheck::new(FstDictionary::curated(), Dialect::American), "COLOR", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_colour_for_color_all_caps() { assert_suggestion_result( "COLOR", SpellCheck::new(FstDictionary::curated(), Dialect::British), "COLOUR", ); } // is_cksz_misspelling // s/z as in realise/realize #[test] #[ignore = "both spellings are acceptable in UK, AU, and IN despite popular opinion"] fn suggest_realise_for_realize() { assert_suggestion_result( "realize", SpellCheck::new(FstDictionary::curated(), Dialect::British), "realise", ); } #[test] fn suggest_realize_for_realise() { assert_suggestion_result( "realise", SpellCheck::new(FstDictionary::curated(), Dialect::American), "realize", ); } #[test] #[ignore = "both spellings are acceptable in UK, AU, and IN despite popular opinion"] fn suggest_realise_for_realize_titlecase() { assert_suggestion_result( "Realize", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Realise", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_realize_for_realise_titlecase() { assert_suggestion_result( "Realise", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Realize", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_realise_for_realize_all_caps() { assert_suggestion_result( "REALIZE", SpellCheck::new(FstDictionary::curated(), Dialect::British), "REALISE", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_realize_for_realise_all_caps() { assert_suggestion_result( "REALISE", SpellCheck::new(FstDictionary::curated(), Dialect::American), "REALIZE", ); } // s/c as in defense/defence #[test] fn suggest_defence_for_defense() { assert_suggestion_result( "defense", SpellCheck::new(FstDictionary::curated(), Dialect::British), "defence", ); } #[test] fn suggest_defense_for_defence() { assert_suggestion_result( "defence", SpellCheck::new(FstDictionary::curated(), Dialect::American), "defense", ); } #[test] fn suggest_defense_for_defence_titlecase() { assert_suggestion_result( "Defense", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Defence", ); } #[test] fn suggest_defence_for_defense_titlecase() { assert_suggestion_result( "Defence", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Defense", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_defense_for_defence_all_caps() { assert_suggestion_result( "DEFENSE", SpellCheck::new(FstDictionary::curated(), Dialect::British), "DEFENCE", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_defence_for_defense_all_caps() { assert_suggestion_result( "DEFENCE", SpellCheck::new(FstDictionary::curated(), Dialect::American), "DEFENSE", ); } // k/c as in skeptic/sceptic #[test] fn suggest_sceptic_for_skeptic() { assert_suggestion_result( "skeptic", SpellCheck::new(FstDictionary::curated(), Dialect::British), "sceptic", ); } #[test] fn suggest_skeptic_for_sceptic() { assert_suggestion_result( "sceptic", SpellCheck::new(FstDictionary::curated(), Dialect::American), "skeptic", ); } #[test] fn suggest_sceptic_for_skeptic_titlecase() { assert_suggestion_result( "Skeptic", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Sceptic", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_skeptic_for_sceptic_titlecase() { assert_suggestion_result( "Sceptic", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Skeptic", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_skeptic_for_sceptic_all_caps() { assert_suggestion_result( "SKEPTIC", SpellCheck::new(FstDictionary::curated(), Dialect::British), "SCEPTIC", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_sceptic_for_skeptic_all_caps() { assert_suggestion_result( "SCEPTIC", SpellCheck::new(FstDictionary::curated(), Dialect::American), "SKEPTIC", ); } // is_er_misspelling // as in meter/metre #[test] fn suggest_centimeter_for_centimetre() { assert_suggestion_result( "centimetre", SpellCheck::new(FstDictionary::curated(), Dialect::American), "centimeter", ); } #[test] fn suggest_centimetre_for_centimeter() { assert_suggestion_result( "centimeter", SpellCheck::new(FstDictionary::curated(), Dialect::British), "centimetre", ); } #[test] fn suggest_centimeter_for_centimetre_titlecase() { assert_suggestion_result( "Centimetre", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Centimeter", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_centimetre_for_centimeter_titlecase() { assert_suggestion_result( "Centimeter", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Centimetre", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_centimeter_for_centimetre_all_caps() { assert_suggestion_result( "CENTIMETRE", SpellCheck::new(FstDictionary::curated(), Dialect::American), "CENTIMETER", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_centimetre_for_centimeter_all_caps() { assert_suggestion_result( "CENTIMETER", SpellCheck::new(FstDictionary::curated(), Dialect::British), "CENTIMETRE", ); } // is_ll_misspelling // as in traveller/traveler #[test] fn suggest_traveler_for_traveller() { assert_suggestion_result( "traveller", SpellCheck::new(FstDictionary::curated(), Dialect::American), "traveler", ); } #[test] fn suggest_traveller_for_traveler() { assert_suggestion_result( "traveler", SpellCheck::new(FstDictionary::curated(), Dialect::British), "traveller", ); } #[test] fn suggest_traveler_for_traveller_titlecase() { assert_suggestion_result( "Traveller", SpellCheck::new(FstDictionary::curated(), Dialect::American), "Traveler", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_traveller_for_traveler_titlecase() { assert_suggestion_result( "Traveler", SpellCheck::new(FstDictionary::curated(), Dialect::British), "Traveller", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_traveler_for_traveller_all_caps() { assert_suggestion_result( "TRAVELLER", SpellCheck::new(FstDictionary::curated(), Dialect::American), "TRAVELER", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_traveller_for_traveler_all_caps() { assert_suggestion_result( "TRAVELER", SpellCheck::new(FstDictionary::curated(), Dialect::British), "TRAVELLER", ); } // is_ay_ey_misspelling // as in gray/grey #[test] fn suggest_grey_for_gray_in_non_american() { assert_suggestion_result( "I've got a gray cat.", SpellCheck::new(FstDictionary::curated(), Dialect::British), "I've got a grey cat.", ); } #[test] fn suggest_gray_for_grey_in_american() { assert_suggestion_result( "It's a greyscale photo.", SpellCheck::new(FstDictionary::curated(), Dialect::American), "It's a grayscale photo.", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_grey_for_gray_in_non_american_titlecase() { assert_suggestion_result( "I've Got a Gray Cat.", SpellCheck::new(FstDictionary::curated(), Dialect::British), "I've Got a Grey Cat.", ); } #[test] fn suggest_gray_for_grey_in_american_titlecase() { assert_suggestion_result( "It's a Greyscale Photo.", SpellCheck::new(FstDictionary::curated(), Dialect::American), "It's a Grayscale Photo.", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_grey_for_gray_in_non_american_all_caps() { assert_suggestion_result( "GRAY", SpellCheck::new(FstDictionary::curated(), Dialect::British), "GREY", ); } #[test] #[ignore = "known failure due to bug"] fn suggest_gray_for_grey_in_american_all_caps() { assert_suggestion_result( "GREY", SpellCheck::new(FstDictionary::curated(), Dialect::American), "GRAY", ); } // Tests for non-dialectal misspelling patterns // is_ei_ie_misspelling #[test] fn fix_cheif_and_recieved() { assert_suggestion_result( "The cheif recieved a letter.", SpellCheck::new(FstDictionary::curated(), Dialect::British), "The chief received a letter.", ); } #[test] #[ignore = "known failure due to bug"] fn fix_cheif_and_recieved_titlecase() { assert_suggestion_result( "The Cheif Recieved a Letter.", SpellCheck::new(FstDictionary::curated(), Dialect::British), "The Chief Received a Letter.", ); } #[test] #[ignore = "known failure due to bug"] fn fix_cheif_and_recieved_all_caps() { assert_suggestion_result( "THE CHEIF RECIEVED A LETTER.", SpellCheck::new(FstDictionary::curated(), Dialect::British), "THE CHEIF RECEIVED A LETTER.", ); } #[test] fn fix_vs_apostrophe() { assert_suggestion_result( "v's", SpellCheck::new(FstDictionary::curated(), Dialect::British), "vs", ); } #[test] fn fix_vs_typographical_apostrophe() { assert_suggestion_result( "v’s", SpellCheck::new(FstDictionary::curated(), Dialect::British), "vs", ); } #[test] fn fix_childrens_missing_apostrophe() { assert_suggestion_result( "childrens", SpellCheck::new(FstDictionary::curated(), Dialect::British), "children's", ); } } ================================================ FILE: harper-core/src/linting/spelled_numbers.rs ================================================ use crate::linting::{LintKind, Linter, Suggestion}; use crate::{Document, Lint, Number, TokenStringExt}; /// Linter that checks to make sure small integers (< 10) are spelled /// out. #[derive(Default, Clone, Copy)] pub struct SpelledNumbers; impl Linter for SpelledNumbers { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for number_tok in document.iter_numbers() { let Number { value, suffix: None, .. } = number_tok.kind.as_number().unwrap() else { continue; }; let value: f64 = (*value).into(); if (value - value.floor()).abs() < f64::EPSILON && value < 10. { lints.push(Lint { span: number_tok.span, lint_kind: LintKind::Readability, suggestions: vec![Suggestion::ReplaceWith( spell_out_number(value as u64).unwrap().chars().collect(), )], message: "Try to spell out numbers less than ten.".to_string(), priority: 63, }) } } lints } fn description(&self) -> &'static str { "Most style guides recommend that you spell out numbers less than ten." } } /// Converts a number to its spelled-out variant. /// /// For example: 100 -> one hundred. /// /// Works for numbers up to 999, but can be expanded to include more powers of 10. fn spell_out_number(num: u64) -> Option { if num > 999 { return None; } Some(match num { 0 => "zero".to_string(), 1 => "one".to_string(), 2 => "two".to_string(), 3 => "three".to_string(), 4 => "four".to_string(), 5 => "five".to_string(), 6 => "six".to_string(), 7 => "seven".to_string(), 8 => "eight".to_string(), 9 => "nine".to_string(), 10 => "ten".to_string(), 11 => "eleven".to_string(), 12 => "twelve".to_string(), 13 => "thirteen".to_string(), 14 => "fourteen".to_string(), 15 => "fifteen".to_string(), 16 => "sixteen".to_string(), 17 => "seventeen".to_string(), 18 => "eighteen".to_string(), 19 => "nineteen".to_string(), 20 => "twenty".to_string(), 30 => "thirty".to_string(), 40 => "forty".to_string(), 50 => "fifty".to_string(), 60 => "sixty".to_string(), 70 => "seventy".to_string(), 80 => "eighty".to_string(), 90 => "ninety".to_string(), hundred if hundred % 100 == 0 => { format!("{} hundred", spell_out_number(hundred / 100).unwrap()) } _ => { let n = 10u64.pow((num as f32).log10() as u32); let parent = (num / n) * n; // truncate let child = num % n; format!( "{}{}{}", spell_out_number(parent).unwrap(), if num <= 99 { '-' } else { ' ' }, spell_out_number(child).unwrap() ) } }) } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::{SpelledNumbers, spell_out_number}; #[test] fn produces_zero() { assert_eq!(spell_out_number(0), Some("zero".to_string())) } #[test] fn produces_eighty_two() { assert_eq!(spell_out_number(82), Some("eighty-two".to_string())) } #[test] fn produces_nine_hundred_ninety_nine() { assert_eq!( spell_out_number(999), Some("nine hundred ninety-nine".to_string()) ) } #[test] fn corrects_nine() { assert_suggestion_result("There are 9 pigs.", SpelledNumbers, "There are nine pigs."); } #[test] fn does_not_correct_ten() { assert_suggestion_result("There are 10 pigs.", SpelledNumbers, "There are 10 pigs."); } /// Check that the algorithm won't stack overflow or return `None` for any numbers within the specified range. #[test] fn services_range() { for i in 0..1000 { spell_out_number(i).unwrap(); } } } ================================================ FILE: harper-core/src/linting/split_words.rs ================================================ use std::sync::Arc; use hashbrown::HashSet; use crate::expr::Expr; use crate::linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}; use crate::spell::{Dictionary, FstDictionary, TrieDictionary}; use crate::{Lint, Token}; pub struct SplitWords { dict: Arc>>, expr: Box, } impl SplitWords { pub fn new() -> Self { Self { dict: TrieDictionary::curated(), expr: Box::new(|tok: &Token, _: &[char]| tok.kind.is_word()), } } } impl Default for SplitWords { fn default() -> Self { Self::new() } } impl ExprLinter for SplitWords { type Unit = Chunk; fn description(&self) -> &str { "Finds missing spaces in improper compound words." } fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let word = &matched_tokens[0]; // If it's a recognized word, we don't care about it. if word.kind.as_word().unwrap().is_some() { return None; } let chars = &word.span.get_content(source); // Get all possible prefix candidates from trie and extract valid split positions let candidates = self.dict.find_words_with_common_prefix(chars); let len = chars.len(); let mut valid_positions: HashSet = HashSet::new(); for candidate in candidates { if candidate.len() >= len { continue; } valid_positions.insert(candidate.len()); } // Generate middle-outward position order based on heuristic from PR #885: // Missing spaces are more likely near the middle of a word let mid = len / 2; let mut positions: Vec = Vec::new(); positions.push(mid); for offset in 1..len { if mid >= offset { positions.push(mid - offset); } if mid + offset < len { positions.push(mid + offset); } } let mut suggestions = Vec::new(); let mut message: Option = None; // Check positions in middle-outward order for split_pos in positions { if split_pos == 0 || split_pos >= len || !valid_positions.contains(&split_pos) { continue; } let candidate = &chars[..split_pos]; let remainder = &chars[split_pos..]; // Both parts must be valid common words if let Some(cand_meta) = self.dict.get_word_metadata(candidate) { if !cand_meta.common { continue; } } else { continue; } if let Some(rem_meta) = self.dict.get_word_metadata(remainder) { if !rem_meta.common { continue; } } else { continue; } // Valid split found let mut suggestion = Vec::new(); suggestion.extend(candidate.iter()); suggestion.push(' '); suggestion.extend(remainder.iter()); suggestions.push(Suggestion::ReplaceWith(suggestion)); if suggestions.len() == 1 { message = Some(format!( "`{}` should probably be written as `{} {}`.", chars.iter().collect::(), candidate.iter().collect::(), remainder.iter().collect::() )); } } if !suggestions.is_empty() { let original_word: String = chars.iter().collect(); if suggestions.len() != 1 { message = Some(format!( "`{original_word}` has a missing space between words." )); } return Some(Lint { span: word.span, lint_kind: LintKind::Typo, suggestions, message: message?, priority: 31, }); } None } } #[cfg(test)] mod tests { use crate::linting::tests::{ assert_good_and_bad_suggestions, assert_no_lints, assert_suggestion_result, }; use super::SplitWords; #[test] fn issue_1905() { assert_suggestion_result( "I want to try this insteadof that.", SplitWords::default(), "I want to try this instead of that.", ); } /// Same as above, but with the longer component word at the end. #[test] fn issue_1905_rev() { assert_suggestion_result( "I want to try thisinstead of that.", SplitWords::default(), "I want to try this instead of that.", ); } #[test] fn split_common() { assert_suggestion_result( "This is notnot a problem.", SplitWords::default(), "This is not not a problem.", ); } #[test] fn splits_multiple_compound_words() { assert_suggestion_result( "We stared intothe darkness and kindof panicked about sortof everything.", SplitWords::default(), "We stared into the darkness and kind of panicked about sort of everything.", ); } #[test] fn splits_word_with_longer_prefix() { assert_suggestion_result( "The astronauts waited on the landingpad for hours.", SplitWords::default(), "The astronauts waited on the landing pad for hours.", ); } #[test] fn splits_before_punctuation() { assert_suggestion_result( "This was kindof, actually, hilarious.", SplitWords::default(), "This was kind of, actually, hilarious.", ); } #[test] fn ignores_known_compound_words() { assert_no_lints("Someone left early.", SplitWords::default()); } #[test] fn ignores_prefix_without_valid_remainder() { assert_no_lints("The monkeyxyz escaped unnoticed.", SplitWords::default()); } #[test] fn test_atall_to_at_all() { assert_suggestion_result( "don't seem to support symbolic links atall.", SplitWords::default(), "don't seem to support symbolic links at all.", ); } #[test] fn test_atall_to_a_tall() { assert_suggestion_result("atall", SplitWords::default(), "a tall"); } #[test] fn atall_should_split_to_a_tall_and_at_all() { assert_good_and_bad_suggestions("atall", SplitWords::default(), &["a tall", "at all"], &[]); } #[test] fn issue_2763_leaves() { assert_suggestion_result( "I love to eat cornleaves.", SplitWords::default(), "I love to eat corn leaves.", ); } #[test] fn issue_2763_husks() { assert_suggestion_result( "I love to eat cornhusks.", SplitWords::default(), "I love to eat corn husks.", ); } #[test] fn issue_2763_singular() { assert_suggestion_result( "I would love to eat a cornleaf.", SplitWords::default(), "I would love to eat a corn leaf.", ); } } ================================================ FILE: harper-core/src/linting/subject_pronoun.rs ================================================ use crate::expr::{AnchorStart, Expr, SequenceExpr}; use crate::{Token, TokenStringExt}; use super::expr_linter::Chunk; use super::{ExprLinter, Lint, LintKind, Suggestion}; pub struct SubjectPronoun { expr: SequenceExpr, } impl Default for SubjectPronoun { fn default() -> Self { let expr = SequenceExpr::with(AnchorStart) .t_aco("me") .t_ws() .t_aco("and") .t_ws() .then_proper_noun(); Self { expr } } } impl ExprLinter for SubjectPronoun { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let mut suggestion_chars = Vec::new(); suggestion_chars.extend_from_slice(matched_tokens.last()?.span.get_content(source)); suggestion_chars.extend(" and I".chars()); Some(Lint { span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::ReplaceWith(suggestion_chars)], message: "Put the other person first and use `I` in this compound subject.".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Fixes sentences that start with `me and X` by putting the proper noun first and using `I`." } } fn append_token_chars(chars: &mut Vec, token: &Token, source: &[char]) { chars.extend(token.span.get_content(source).iter().copied()); } fn append_tokens_chars(chars: &mut Vec, tokens: &[Token], source: &[char]) { for token in tokens { append_token_chars(chars, token, source); } } #[cfg(test)] mod tests { use super::SubjectPronoun; use crate::linting::tests::assert_suggestion_result; #[test] fn alex_ladder() { assert_suggestion_result( "Me and Alex carried the huge ladder.", SubjectPronoun::default(), "Alex and I carried the huge ladder.", ); } #[test] fn jordan_lamp() { assert_suggestion_result( "Me and Jordan fixed the broken lamp.", SubjectPronoun::default(), "Jordan and I fixed the broken lamp.", ); } #[test] fn taylor_crate() { assert_suggestion_result( "Me and Taylor opened the dusty crate.", SubjectPronoun::default(), "Taylor and I opened the dusty crate.", ); } #[test] fn kayla_dog() { assert_suggestion_result( "Me and Kayla chased the noisy dog.", SubjectPronoun::default(), "Kayla and I chased the noisy dog.", ); } #[test] fn madison_yard() { assert_suggestion_result( "Me and Madison painted the small yard shed.", SubjectPronoun::default(), "Madison and I painted the small yard shed.", ); } #[test] fn avery_tree() { assert_suggestion_result( "Me and Avery climbed the old tree.", SubjectPronoun::default(), "Avery and I climbed the old tree.", ); } #[test] fn blake_room() { assert_suggestion_result( "Me and Blake cleaned the crowded room.", SubjectPronoun::default(), "Blake and I cleaned the crowded room.", ); } #[test] fn riley_train() { assert_suggestion_result( "Me and Riley watched the slow train go by.", SubjectPronoun::default(), "Riley and I watched the slow train go by.", ); } #[test] fn cameron_door() { assert_suggestion_result( "Me and Cameron fixed the loose door hinge.", SubjectPronoun::default(), "Cameron and I fixed the loose door hinge.", ); } #[test] fn jamie_bag() { assert_suggestion_result( "Me and Jamie carried the heavy shopping bag.", SubjectPronoun::default(), "Jamie and I carried the heavy shopping bag.", ); } } ================================================ FILE: harper-core/src/linting/suggestion.rs ================================================ use std::{ borrow::Borrow, fmt::{Debug, Display}, }; use is_macro::Is; use serde::{Deserialize, Serialize}; use crate::{Span, case}; /// A suggested edit that could resolve a [`Lint`](super::Lint). #[derive(Clone, Serialize, Deserialize, Is, PartialEq, Eq, Hash)] pub enum Suggestion { /// Replace the offending text with a specific character sequence. ReplaceWith(Vec), /// Insert the provided characters _after_ the offending text. InsertAfter(Vec), /// Remove the offending text. Remove, } impl Suggestion { /// Variant of [`Self::replace_with_match_case`] that accepts a static string. pub fn replace_with_match_case_str( value: &str, template: impl IntoIterator>, ) -> Self { Self::replace_with_match_case(value.chars().collect(), template) } /// Construct an instance of [`Self::ReplaceWith`], but make the content match the case of the /// provided template. /// /// For example, if we want to replace "You're" with "You are", we can provide "you are" and /// "You're". pub fn replace_with_match_case( value: Vec, template: impl IntoIterator>, ) -> Self { Self::ReplaceWith(case::copy_casing(template, value).to_vec()) } /// Apply a suggestion to a given text. pub fn apply(&self, span: Span, source: &mut Vec) { match self { Self::ReplaceWith(chars) => { // Avoid allocation if possible if chars.len() == span.len() { for (index, c) in chars.iter().enumerate() { source[index + span.start] = *c } } else { let popped = source.split_off(span.start); source.extend(chars); source.extend(popped.into_iter().skip(span.len())); } } Self::Remove => { for i in span.end..source.len() { source[i - span.len()] = source[i]; } source.truncate(source.len() - span.len()); } Self::InsertAfter(chars) => { let popped = source.split_off(span.end); source.extend(chars); source.extend(popped); } } } } impl Display for Suggestion { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Suggestion::ReplaceWith(with) => { write!(f, "Replace with: “{}”", with.iter().collect::()) } Suggestion::InsertAfter(with) => { write!(f, "Insert “{}”", with.iter().collect::()) } Suggestion::Remove => write!(f, "Remove error"), } } } // To make debug output more readable. // The default debug implementation for Vec isn't ideal in this scenario, as it prints // characters one at a time, line by line. impl Debug for Suggestion { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { ::fmt(self, f) } } pub trait SuggestionCollectionExt { fn to_replace_suggestions( self, case_template: impl IntoIterator> + Clone, ) -> impl Iterator; } impl SuggestionCollectionExt for I where I: IntoIterator, T: AsRef, { fn to_replace_suggestions( self, case_template: impl IntoIterator> + Clone, ) -> impl Iterator { self.into_iter().map(move |s| { Suggestion::replace_with_match_case_str(s.as_ref(), case_template.clone()) }) } } #[cfg(test)] mod tests { use crate::Span; use super::Suggestion; #[test] fn insert_comma_after() { let source = "This is a test"; let mut source_chars = source.chars().collect(); let sug = Suggestion::InsertAfter(vec![',']); sug.apply(Span::new(0, 4), &mut source_chars); assert_eq!(source_chars, "This, is a test".chars().collect::>()); } #[test] fn suggestion_your_match_case() { let template: Vec<_> = "You're".chars().collect(); let value: Vec<_> = "you are".chars().collect(); let correct = "You are".chars().collect(); assert_eq!( Suggestion::replace_with_match_case(value, &template), Suggestion::ReplaceWith(correct) ) } #[test] fn issue_1065() { let template: Vec<_> = "Stack Overflow".chars().collect(); let value: Vec<_> = "stackoverflow".chars().collect(); let correct = "StackOverflow".chars().collect(); assert_eq!( Suggestion::replace_with_match_case(value, &template), Suggestion::ReplaceWith(correct) ) } } ================================================ FILE: harper-core/src/linting/take_a_look_to.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ ExprLinter, LintKind, Suggestion, expr_linter::{Chunk, followed_by_word}, }, patterns::WordSet, }; static TAKE_FORMS: &[&str] = &["take", "took", "taken", "takes", "taking"]; static HAVE_FORMS: &[&str] = &["have", "had", "has", "having"]; pub struct TakeALookTo { pub expr: SequenceExpr, } impl Default for TakeALookTo { fn default() -> Self { Self { expr: SequenceExpr::any_of(vec![ Box::new(WordSet::new(TAKE_FORMS)), Box::new(WordSet::new(HAVE_FORMS)), ]) .t_ws() .t_aco("a") .t_ws() .t_aco("look") .t_ws() .t_aco("to"), } } } impl ExprLinter for TakeALookTo { type Unit = Chunk; fn description(&self) -> &str { "Corrects `take a look to`/`have a look to` to correctly use `at`." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if followed_by_word(ctx, |nw| { nw.kind.is_verb_lemma() // Exception 1. Have/take a look to see if everything is ok || (nw.span.get_content(src).eq_ignore_ascii_case_str("it") // Exception 2. It has a look to it that I don't like && toks.first().is_some_and(|tok| { tok.span .get_content(src) .eq_any_ignore_ascii_case_str(HAVE_FORMS) })) }) { return None; } let to_span = toks.last()?.span; Some(Lint { lint_kind: LintKind::Usage, span: to_span, suggestions: vec![Suggestion::replace_with_match_case( vec!['a', 't'], to_span.get_content(src), )], message: "This phrase uses `to` rather than `at`".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::TakeALookTo; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn take_a_look_to_a_new() { assert_suggestion_result( "Hello, I am Drago and in this video we're going to take a look to a new AI CLI and VS Code extension tool", TakeALookTo::default(), "Hello, I am Drago and in this video we're going to take a look at a new AI CLI and VS Code extension tool", ); } #[test] fn have_a_look_to_url() { assert_suggestion_result( "If you haven't yet, please have a look to https://docs.conan.io/2/devops/devops_local_recipes_index.html", TakeALookTo::default(), "If you haven't yet, please have a look at https://docs.conan.io/2/devops/devops_local_recipes_index.html", ); } #[test] fn having_a_look_to_mode() { assert_suggestion_result( "Having a look to mode and overScaleMode , I see they are scriptable", TakeALookTo::default(), "Having a look at mode and overScaleMode , I see they are scriptable", ); } #[test] fn taking_a_look_to_this() { assert_suggestion_result( "after taking a look to this issue and making some test I figure out that it likely to be an error", TakeALookTo::default(), "after taking a look at this issue and making some test I figure out that it likely to be an error", ); } #[test] fn have_had_a_look_to_your() { assert_suggestion_result( "I have had a look to your conanfile.py and it is strange that it fails.", TakeALookTo::default(), "I have had a look at your conanfile.py and it is strange that it fails.", ); } #[test] fn took_a_look_to_both() { assert_suggestion_result( "Since I have some knowledge in programing I took a look to both codes (LK and XCS)", TakeALookTo::default(), "Since I have some knowledge in programing I took a look at both codes (LK and XCS)", ); } #[test] fn taken_a_look_to_that() { assert_suggestion_result( "Yeah I've taken a look to that, but I really need to use classes on this one", TakeALookTo::default(), "Yeah I've taken a look at that, but I really need to use classes on this one", ); } #[test] fn takes_a_look_to_the() { assert_suggestion_result( "basically, it takes a look to the signing request", TakeALookTo::default(), "basically, it takes a look at the signing request", ); } // Make sure we avoid potential false positives #[test] fn dont_flag_have_a_look_to_see_if() { assert_no_lints( "@budarin can you have a look to see if it addresses your concerns?", TakeALookTo::default(), ); } #[test] fn dont_flag_taking_a_look_to_decide() { assert_no_lints( "Would be worth taking a look to decide which way to go.", TakeALookTo::default(), ); } #[test] fn dont_flag_takes_a_look_to_see() { assert_no_lints( "It attempts to open the URL in a new window and then after 2s it takes a look to see if it can read the location.", TakeALookTo::default(), ); } #[test] fn dont_flag_has_a_look_to_it() { assert_no_lints( "The ecosystem's UI certainly has a look to it but inside of your app you could implement a different look as long as it's consistent.", TakeALookTo::default(), ); } #[test] fn but_dont_ignore_takes_a_look_to_it() { assert_suggestion_result( "When he gets back I hope he takes a look to it", TakeALookTo::default(), "When he gets back I hope he takes a look at it", ); } } ================================================ FILE: harper-core/src/linting/take_medicine.rs ================================================ use crate::{ Token, expr::{Expr, OwnedExprExt, SequenceExpr}, linting::expr_linter::Chunk, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::DerivedFrom, }; pub struct TakeMedicine { expr: SequenceExpr, } impl Default for TakeMedicine { fn default() -> Self { let eat_verb = DerivedFrom::new_from_str("eat") .or(DerivedFrom::new_from_str("eats")) .or(DerivedFrom::new_from_str("ate")) .or(DerivedFrom::new_from_str("eating")) .or(DerivedFrom::new_from_str("eaten")); let medication = DerivedFrom::new_from_str("antibiotic") .or(DerivedFrom::new_from_str("medicine")) .or(DerivedFrom::new_from_str("medication")) .or(DerivedFrom::new_from_str("pill")) .or(DerivedFrom::new_from_str("tablet")) .or(DerivedFrom::new_from_str("aspirin")) .or(DerivedFrom::new_from_str("paracetamol")); let modifiers = SequenceExpr::any_of(vec![ Box::new(SequenceExpr::default().then_determiner()), Box::new(SequenceExpr::default().then_possessive_determiner()), Box::new(SequenceExpr::default().then_quantifier()), ]) .t_ws(); let adjectives = SequenceExpr::default().then_one_or_more_adjectives().t_ws(); let pattern = SequenceExpr::with(eat_verb) .t_ws() .then_optional(modifiers) .then_optional(adjectives) .then(medication); Self { expr: pattern } } } fn replacement_for( verb: &Token, source: &[char], base: &str, third_person: &str, past: &str, past_participle: &str, progressive: &str, ) -> Suggestion { let replacement = if verb.kind.is_verb_progressive_form() { progressive } else if verb.kind.is_verb_third_person_singular_present_form() { third_person } else if verb.kind.is_verb_past_participle_form() && !verb.kind.is_verb_simple_past_form() { past_participle } else if verb.kind.is_verb_simple_past_form() { past } else { base }; Suggestion::replace_with_match_case( replacement.chars().collect(), verb.span.get_content(source), ) } impl ExprLinter for TakeMedicine { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let verb = matched_tokens.first()?; let span = verb.span; let suggestions = vec![ replacement_for(verb, source, "take", "takes", "took", "taken", "taking"), replacement_for( verb, source, "swallow", "swallows", "swallowed", "swallowed", "swallowing", ), ]; Some(Lint { span, lint_kind: LintKind::Usage, suggestions, message: "Use a verb like `take` or `swallow` with medicine instead of `eat`." .to_string(), priority: 63, }) } fn description(&self) -> &'static str { "Encourages pairing medicine-related nouns with verbs like `take` or `swallow` instead of `eat`." } } #[cfg(test)] mod tests { use super::TakeMedicine; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn swaps_ate_antibiotics() { assert_suggestion_result( "I ate antibiotics for a week.", TakeMedicine::default(), "I took antibiotics for a week.", ); } #[test] fn swaps_eat_medicine() { assert_suggestion_result( "You should eat the medicine now.", TakeMedicine::default(), "You should take the medicine now.", ); } #[test] fn swaps_eats_medication() { assert_suggestion_result( "She eats medication daily.", TakeMedicine::default(), "She takes medication daily.", ); } #[test] fn swaps_eating_medicines() { assert_suggestion_result( "Are you eating medicines for that illness?", TakeMedicine::default(), "Are you taking medicines for that illness?", ); } #[test] fn swaps_eaten_medication() { assert_suggestion_result( "He has eaten medication already.", TakeMedicine::default(), "He has taken medication already.", ); } #[test] fn swaps_eat_pills() { assert_suggestion_result( "He ate the pills without water.", TakeMedicine::default(), "He took the pills without water.", ); } #[test] fn swaps_eating_paracetamol() { assert_suggestion_result( "She is eating paracetamol for her headache.", TakeMedicine::default(), "She is taking paracetamol for her headache.", ); } #[test] fn handles_possessive_modifier() { assert_suggestion_result( "Please eat my antibiotics.", TakeMedicine::default(), "Please take my antibiotics.", ); } #[test] fn handles_adjectives() { assert_suggestion_result( "They ate the prescribed antibiotics.", TakeMedicine::default(), "They took the prescribed antibiotics.", ); } #[test] fn supports_uppercase() { assert_suggestion_result( "Eat antibiotics with water.", TakeMedicine::default(), "Take antibiotics with water.", ); } #[test] fn offers_swallow_alternative() { assert_suggestion_result( "He ate the medication without water.", TakeMedicine::default(), "He swallowed the medication without water.", ); } #[test] fn ignores_correct_usage() { assert_lint_count( "She took antibiotics last winter.", TakeMedicine::default(), 0, ); } #[test] fn ignores_unrelated_eat() { assert_lint_count( "They ate dinner after taking medicine.", TakeMedicine::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/take_serious.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::NominalPhrase, }; /// Linter that corrects "take X serious" to "take X seriously". /// /// This linter identifies and corrects the common mistake of using the adjective "serious" /// instead of the adverb "seriously" in phrases like "take it serious". pub struct TakeSerious { expr: SequenceExpr, } impl Default for TakeSerious { /// Creates a new `TakeSerious` instance with the default pattern. /// /// The pattern matches: /// - Any form of "take" (take/takes/taking/took/taken) /// - Followed by a nominal phrase /// - Ending with "serious" fn default() -> Self { let pattern = SequenceExpr::word_set(&["take", "taken", "takes", "taking", "took"]) .t_ws() .then(NominalPhrase) .t_ws() .t_aco("serious"); Self { expr: pattern } } } impl ExprLinter for TakeSerious { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let whole_phrase_span = matched_tokens.span()?; let all_but_last_token = matched_tokens[..matched_tokens.len() - 1].span()?; let mut sugg_value = all_but_last_token.get_content(source).to_vec(); sugg_value.extend_from_slice(&['s', 'e', 'r', 'i', 'o', 'u', 's', 'l', 'y']); let sugg_template = whole_phrase_span.get_content(source); let suggestions = vec![Suggestion::replace_with_match_case( sugg_value, sugg_template, )]; Some(Lint { span: whole_phrase_span, lint_kind: LintKind::WordChoice, suggestions, message: "Take seriously".to_string(), priority: 63, }) } fn description(&self) -> &'static str { "Ensures the correct use of the adverb `seriously` instead of the adjective `serious` in phrases like `take it seriously`." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::TakeSerious; #[test] fn take_it() { assert_suggestion_result( "I take it serious.", TakeSerious::default(), "I take it seriously.", ); } #[test] #[ignore = "'This' and 'that', which can be determiners and pronouns, are not handled properly by `NominalPhrase`"] fn take_this() { assert_suggestion_result( "What's more important is, that it's impossible to actually take this serious when ...", TakeSerious::default(), "What's more important is, that it's impossible to actually take this seriously when ...", ); } #[test] fn not_take_security() { assert_suggestion_result( "When you say someone does not take security serious you are being judgemental / destructive.", TakeSerious::default(), "When you say someone does not take security seriously you are being judgemental / destructive.", ); } #[test] fn we_take_security() { assert_suggestion_result( "We take security serious.", TakeSerious::default(), "We take security seriously.", ); } #[test] fn take_me() { assert_suggestion_result( "Yeah , don't take me serious , i do this as a hobby - jusspatel.", TakeSerious::default(), "Yeah , don't take me seriously , i do this as a hobby - jusspatel.", ); } #[test] #[ignore = "Passive voice and adverbs are not yet supported"] fn taken_adv() { assert_suggestion_result( "This is not meant to be taken overly serious", TakeSerious::default(), "This is not meant to be taken overly seriously", ); } #[test] fn takes_these_numbers() { assert_suggestion_result( "if a program actually takes these numbers serious the results could be catastrophic.", TakeSerious::default(), "if a program actually takes these numbers seriously the results could be catastrophic.", ); } #[test] #[ignore = "'No one' is not handled properly by `NominalPhrase`"] fn takes_bf() { assert_suggestion_result( "And obviously no one takes brainfuck serious as a language.", TakeSerious::default(), "And obviously no one takes brainfuck seriously as a language.", ); } #[test] #[ignore = "Adverbs are not yet supported"] fn taken_very() { assert_suggestion_result( "Hmm flaky soldering iron is something that must be taken very serious.", TakeSerious::default(), "Hmm flaky soldering iron is something that must be taken very seriously.", ); } } ================================================ FILE: harper-core/src/linting/that_than.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct ThatThan { expr: SequenceExpr, } impl Default for ThatThan { fn default() -> Self { let adjective_er_that_nextword = SequenceExpr::default() .then_kind_except( TokenKind::is_comparative_adjective, &["better", "later", "number"], ) .t_ws() .t_aco("that") .t_ws() .then_word_except(&["way"]); Self { expr: adjective_er_that_nextword, } } } impl ExprLinter for ThatThan { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { if toks.len() != 5 { return None; } let that_tok = &toks[2]; Some(Lint { span: that_tok.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "than", that_tok.span.get_content(src), )], message: "This looks like a comparison that should use `than` rather than `that`." .to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Corrects the typo `that` to `than` in comparisons." } } #[cfg(test)] mod tests { use super::ThatThan; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // adj-er that #[test] fn fix_slower_that() { assert_suggestion_result( "Local installed PHAR 5x times slower that the same PHAR installed globally", ThatThan::default(), "Local installed PHAR 5x times slower than the same PHAR installed globally", ); } #[test] fn dont_flag_more_that() { assert_lint_count( "so it's probably more that Croatian had an easier test", ThatThan::default(), 0, ); } #[test] fn dont_flag_easier_that_way() { assert_lint_count( "Given svelte now has signals, it might actually be easier that way.", ThatThan::default(), 0, ); } #[test] fn dont_flag_better_that() { assert_lint_count( "So I am wondering if its better that I run SCENIC+ once on the integrated dataset or 3 times on the individual datasets", ThatThan::default(), 0, ); } #[test] #[ignore = "not handled because 'better' results in false positives"] fn fix_better_that() { assert_suggestion_result( "Examples of how different cards perform far better that others.", ThatThan::default(), "Examples of how different cards perform far better than others.", ); } #[test] fn fix_smaller_that() { assert_suggestion_result( "When the resulting part is smaller that the build plate, it gets re-arranged.", ThatThan::default(), "When the resulting part is smaller than the build plate, it gets re-arranged.", ); } #[test] #[ignore = "not handled because 'bigger' results in false positives"] fn cant_flag_bigger_that() { assert_suggestion_result( "Enable bigger that 1024*768 window for world builder.", ThatThan::default(), "Enable bigger than 1024*768 window for world builder.", ); } #[test] fn fix_longer_that() { assert_suggestion_result( "Window list in CodeBrowser can be longer that screen height.", ThatThan::default(), "Window list in CodeBrowser can be longer than screen height.", ); } #[test] #[ignore = "'less that' also occurs in false positives"] fn fix_less_that() { assert_suggestion_result( "Collector Not collecting metrics if the collection interval is less that the metric generation interval.", ThatThan::default(), "Collector Not collecting metrics if the collection interval is less than the metric generation interval.", ); } #[test] fn fix_faster_that() { assert_suggestion_result( "with the general case performing approximately 4x faster that a Vec based implementation", ThatThan::default(), "with the general case performing approximately 4x faster than a Vec based implementation", ); } #[test] fn fix_taller_that() { assert_suggestion_result( "Notice that people we've already placed are not taller that the current person.", ThatThan::default(), "Notice that people we've already placed are not taller than the current person.", ); } #[test] fn dont_fix_faster_that_way() { assert_lint_count( "You will get an answer quicker that way!", ThatThan::default(), 0, ) } #[test] fn dont_fix_lighter_that() { assert_lint_count( "This is the code for Seed-Studio-based timer and desk lighter that I built as a gift for a good friend.", ThatThan::default(), 0, ) } // more/less adj that #[test] fn dont_flag_more_explicit_that() { assert_lint_count( "make it more explicit that those files are auto ...", ThatThan::default(), 0, ); } #[test] fn dont_flag_more_clear_that() { assert_lint_count( "Make it more clear that users need to download the VS tooling installer for .NET Core in VS.", ThatThan::default(), 0, ); } // False positives from The Great Gatsby #[test] fn dont_flag_i_gathered_later_that() { assert_lint_count( "and I gathered later that he was a photographer", ThatThan::default(), 0, ); } #[test] fn dont_flag_its_better_that() { assert_lint_count( "It’s better that the shock should all come at once.", ThatThan::default(), 0, ) } #[test] fn dont_flag_number_that_1663() { assert_lint_count( " 455 │ `MAJOR.MINOR.PATCH` version number that increments with:", ThatThan::default(), 0, ) } } ================================================ FILE: harper-core/src/linting/that_which.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::SequenceExpr; use crate::expr::WordExprGroup; use itertools::Itertools; use crate::{Lrc, Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ThatWhich { expr: WordExprGroup, } impl Default for ThatWhich { fn default() -> Self { let mut pattern = WordExprGroup::default(); let matching_pattern = Lrc::new( SequenceExpr::any_capitalization_of("that") .then_whitespace() .then_any_capitalization_of("that"), ); pattern.add("that", matching_pattern.clone()); pattern.add("That", matching_pattern); Self { expr: pattern } } } impl ExprLinter for ThatWhich { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let suggestion = format!( "{} which", matched_tokens[0] .span .get_content(source) .iter() .collect::() ) .chars() .collect_vec(); Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Repetition, suggestions: vec![Suggestion::ReplaceWith(suggestion)], message: "“that that” sometimes means “that which”, which is clearer.".to_string(), priority: 126, }) } fn description(&self) -> &'static str { "Repeating the word \"that\" is often redundant. The phrase `that which` is easier to read." } } #[cfg(test)] mod tests { use super::super::tests::assert_lint_count; use super::ThatWhich; #[test] fn catches_lowercase() { assert_lint_count( "To reiterate, that that is cool is not uncool.", ThatWhich::default(), 1, ); } #[test] fn catches_different_cases() { assert_lint_count("That that is cool is not uncool.", ThatWhich::default(), 1); } #[test] fn likes_correction() { assert_lint_count( "To reiterate, that which is cool is not uncool.", ThatWhich::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/the_how_why.rs ================================================ use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; /// Suggests removing `the` when followed by how/why/who/when/what, /// skipping cases like `how to` and `who's who`. pub struct TheHowWhy { expr: FirstMatchOf, } impl Default for TheHowWhy { fn default() -> Self { let the_how = SequenceExpr::default() .t_aco("the") .then_whitespace() .t_aco("how") .then_unless(SequenceExpr::whitespace().t_aco("to")); let the_who = SequenceExpr::default() .t_aco("the") .then_whitespace() .t_aco("who") .then_unless( SequenceExpr::whitespace() .t_aco("'s") .then_whitespace() .t_aco("who"), ); let the_why = SequenceExpr::default() .t_aco("the") .then_whitespace() .t_aco("why"); let the_when = SequenceExpr::default() .t_aco("the") .then_whitespace() .t_aco("when"); let the_what = SequenceExpr::default() .t_aco("the") .then_whitespace() .t_aco("what"); let expr = FirstMatchOf::new(vec![ Box::new(the_how), Box::new(the_who), Box::new(the_why), Box::new(the_when), Box::new(the_what), ]); Self { expr } } } impl ExprLinter for TheHowWhy { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let the_token_span = matched_tokens[0..2].span()?; let question_word_token = matched_tokens.get(2)?; let question_word = question_word_token.span.get_content(source); Some(Lint { span: the_token_span, lint_kind: LintKind::Miscellaneous, message: format!( "Remove `the` before `{}`. In most contexts, `{}` alone is clearer.", question_word.iter().collect::(), question_word.iter().collect::() ), suggestions: vec![Suggestion::Remove], priority: 31, }) } fn description(&self) -> &str { "Removes the extra `the` from expressions like `the how`, skipping `how to` and `who's who`." } } #[cfg(test)] mod tests { use super::TheHowWhy; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn basic_the_how() { assert_suggestion_result( "This is the how it all started.", TheHowWhy::default(), "This is how it all started.", ); } #[test] fn the_why() { assert_suggestion_result( "The important part is the why it matters.", TheHowWhy::default(), "The important part is why it matters.", ); } #[test] fn skip_how_to() { assert_lint_count( "I'd like to explain the how to install this properly.", TheHowWhy::default(), 0, ); } #[test] fn skip_whos_who() { assert_lint_count( "We covered the who's who of corporate leadership last time.", TheHowWhy::default(), 0, ); } #[test] fn the_who() { assert_suggestion_result( "We must identify the who is responsible.", TheHowWhy::default(), "We must identify who is responsible.", ); } #[test] fn the_when() { assert_suggestion_result( "He outlined the when the new phase will start.", TheHowWhy::default(), "He outlined when the new phase will start.", ); } #[test] fn the_what() { assert_suggestion_result( "The presentation clarifies the what we intend to build.", TheHowWhy::default(), "The presentation clarifies what we intend to build.", ); } #[test] fn no_false_positive() { assert_lint_count( "These tips examine the how to fix your code quickly, plus the what's next.", TheHowWhy::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/the_my.rs ================================================ use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::expr::Expr; use crate::expr::FirstMatchOf; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenStringExt, patterns::{Word, WordSet}, }; pub struct TheMy { expr: FirstMatchOf, } impl Default for TheMy { fn default() -> Self { let the = Word::new("the"); let any_possessive = WordSet::new(&["my", "your", "his", "her", "its", "our", "their"]); let the_poss = SequenceExpr::with(the.clone()) .then_whitespace() .then(any_possessive.clone()); let poss_the = SequenceExpr::with(any_possessive) .then_whitespace() .then(the); Self { expr: FirstMatchOf::new(vec![Box::new(the_poss), Box::new(poss_the)]), } } } impl ExprLinter for TheMy { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span().unwrap(); let span_content = span.get_content(source); let first_word = matched_tokens[0].span.get_content(source); let second_word = matched_tokens[2].span.get_content(source); let first_word_string: String = first_word.to_string(); let possessive = if first_word_string.eq_ignore_ascii_case("the") { second_word } else { first_word }; // Don't flag "the My" or "my The" since they could be titles of things if second_word[0].is_uppercase() { return None; } // Don't flag "her the" since her is also the object case pronoun: "give her the book" if first_word_string.eq_ignore_ascii_case("her") { return None; } let suggestions = vec![ Suggestion::replace_with_match_case(possessive.to_vec(), span_content), Suggestion::replace_with_match_case("the".chars().collect(), span_content), ]; Some(Lint { span, lint_kind: LintKind::Repetition, suggestions, message: "Use either the definite article 'the' or the possessive. Using both together is ungrammatical in English.".to_owned(), priority: 127, }) } fn description(&self) -> &'static str { "Flags the definite article used together with a possessive." } } #[cfg(test)] mod tests { use super::TheMy; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn correct_the_my_atomic_lowercase() { assert_suggestion_result("the my", TheMy::default(), "my"); } #[test] fn correct_the_my_atomic_2nd_suggestion() { assert_suggestion_result("the my", TheMy::default(), "the"); } #[test] fn correct_the_my_atomic_uppercase() { assert_suggestion_result("The my", TheMy::default(), "My"); } #[test] fn correct_my_the_atomic_lowercase() { assert_suggestion_result("my the", TheMy::default(), "my"); } #[test] fn correct_my_the_atomic_2nd_suggestion() { assert_suggestion_result("my the", TheMy::default(), "the"); } #[test] fn correct_my_the_atomic_uppercase() { assert_suggestion_result("My the", TheMy::default(), "My"); } #[test] fn dont_correct_capitalized_possessive() { assert_lint_count("For some time the My Projects personal page was \"sluggish\" or took some time to generate the miniature depicting the project, now it seems completely stuck ... ", TheMy::default(), 0); } #[test] fn correct_the_my_github() { assert_suggestion_result( "When I try to configure the my react-native app to support koltin file, this library gives these errors", TheMy::default(), "When I try to configure my react-native app to support koltin file, this library gives these errors", ); } #[test] fn correct_the_our_github() { assert_suggestion_result( "Source codes of the our paper titled \"Multi-level Textual-Visual Alignment and Fusion Network for Multimodal Aspect-based Sentiment Analysis\"", TheMy::default(), "Source codes of our paper titled \"Multi-level Textual-Visual Alignment and Fusion Network for Multimodal Aspect-based Sentiment Analysis\"", ); } #[test] fn correct_the_their_github() { assert_suggestion_result( "the slider cannot render when i use again the their component on NextJS app", TheMy::default(), "the slider cannot render when i use again their component on NextJS app", ); } #[test] fn correct_your_the_github() { assert_suggestion_result( "This plugin allows you to view your the information about order and customer from your spree store on zendesk", TheMy::default(), "This plugin allows you to view your information about order and customer from your spree store on zendesk", ); } #[test] fn correct_my_the_github() { assert_suggestion_result( "Scripts used my the project to collect, process and store social media data from a number of sources", TheMy::default(), "Scripts used my project to collect, process and store social media data from a number of sources", ); } #[test] fn dont_correct_the_your_github() { assert_lint_count( "What exactly is the sort order of list names on the Your Stars page?", TheMy::default(), 0, ); } #[test] fn dont_correct_my_the_github() { assert_lint_count( "My The Frame TV is not pulling information properly", TheMy::default(), 0, ) } #[test] fn correct_our_the_github() { assert_suggestion_result( "Companion Repository to our the whitepaper \"Towards Reliable and Scalable Linux Kernel CVE Attribution in Automated Static Firmware Analyses\"", TheMy::default(), "Companion Repository to our whitepaper \"Towards Reliable and Scalable Linux Kernel CVE Attribution in Automated Static Firmware Analyses\"", ) } #[test] fn correct_their_the_github() { assert_suggestion_result( "Types exported by @_exported remember only their the original module", TheMy::default(), "Types exported by @_exported remember only their original module", ) } #[test] fn dont_correct_her_the_github() { assert_lint_count( "Create an admin role for boba-tan and give her the GoreMaster role only in !gore", TheMy::default(), 0, ) } #[test] fn correct_the_his_github() { assert_suggestion_result( "Allows the user to specify the his last name.", TheMy::default(), "Allows the user to specify his last name.", ) } #[test] fn correct_his_the_github() { assert_suggestion_result( "One interesting creation was his the Schelling segregation model", TheMy::default(), "One interesting creation was his Schelling segregation model", ) } #[test] fn correct_the_her_github() { assert_suggestion_result( "In memory of the occasion when our Queen Victoria graciously came to see our Island, and the her Royal Consort Albert landed at Ramsey", TheMy::default(), "In memory of the occasion when our Queen Victoria graciously came to see our Island, and her Royal Consort Albert landed at Ramsey", ) } } ================================================ FILE: harper-core/src/linting/the_point_for.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::WordSet, }; pub struct ThePointFor { expr: SequenceExpr, } impl Default for ThePointFor { fn default() -> Self { Self { expr: SequenceExpr::any_of(vec![Box::new(WordSet::new(&[ // "that's" leads to false positives: "that's the point for me" "is", "was", "what's", "whats", ]))]) .t_ws() .t_aco("the") .t_ws() .t_aco("point") .t_ws() .t_aco("for"), } } } impl ExprLinter for ThePointFor { type Unit = Chunk; fn description(&self) -> &str { "Corrects `the point for` to `the point of`" } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { // Avoid flagging things like "p0 is the point for which we want to find the closest point to the line" if let Some((_, after)) = ctx && after.len() >= 2 && after[0].kind.is_whitespace() && after[1] .span .get_content(src) .eq_ignore_ascii_case_str("which") { return None; } let forspan = toks.last()?.span; Some(Lint { span: forspan, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "of", forspan.get_content(src), )], message: "Did you mean `the point of`?".to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::ThePointFor; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn fix_is() { assert_suggestion_result( "What is the point for this check?", ThePointFor::default(), "What is the point of this check?", ); } #[test] #[ignore = "'that' is disabled to avoid false positives until the heuristics can be improved"] fn fix_thats_the_point_no_apostrophe() { assert_suggestion_result( "You should also keep an eye on the issue list because thats the point for being public", ThePointFor::default(), "You should also keep an eye on the issue list because thats the point of being public", ); } #[test] fn fix_was_the_point() { assert_suggestion_result( "But avoiding to learn qraphql to find out the proper query was the point for asking for this convenience command.", ThePointFor::default(), "But avoiding to learn qraphql to find out the proper query was the point of asking for this convenience command.", ); } #[test] fn fix_whats_the_point() { assert_suggestion_result( "What's the point for IRepository?", ThePointFor::default(), "What's the point of IRepository?", ); } #[test] fn fix_whats_the_point_no_apostrophe() { // Whats the point for using a reader like feedly, if the articles open in their native website assert_suggestion_result( "## I dont get RSS. Whats the point for using a reader like feedly, if the articles open in their native website", ThePointFor::default(), "## I dont get RSS. Whats the point of using a reader like feedly, if the articles open in their native website", ); } #[test] fn avoid_flagging_the_point_for_which() { assert_no_lints( "p0 is the point for which we want to find the closest point to the line", ThePointFor::default(), ); } } ================================================ FILE: harper-core/src/linting/the_proper_noun_possessive.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct TheProperNounPossessive { expr: SequenceExpr, } impl Default for TheProperNounPossessive { fn default() -> Self { Self { expr: SequenceExpr::aco("the") .t_ws() .then(|t: &Token, s: &[char]| { // TODO: should use `k.is_proper_noun()` when #2327 is fixed // TODO: should use `k.is_common_noun()` which doesn't exist yet t.kind.is_possessive_noun() && t.kind.is_titlecase() && !t.kind.is_lowercase() && !t .span .get_content(s) .eq_any_ignore_ascii_case_str(&["internet's", "internet’s"]) }), } } } impl ExprLinter for TheProperNounPossessive { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], _: &[char]) -> Option { Some(Lint { span: toks[..2].span()?, lint_kind: LintKind::Redundancy, suggestions: vec![Suggestion::Remove], message: "The definite article `the` is redundant before a proper noun in the possessive." .to_string(), ..Default::default() }) } fn description(&self) -> &str { "Checks for redundant `the` before possessive proper noun such as `The London's population`." } } #[cfg(test)] mod tests { use crate::linting::{ tests::{assert_no_lints, assert_suggestion_result}, the_proper_noun_possessive::TheProperNounPossessive, }; #[test] fn fix_the_putins_war() { assert_suggestion_result( "The Putin's war", TheProperNounPossessive::default(), "Putin's war", ); } #[test] fn fix_the_londons_population() { assert_suggestion_result( "The London's population.", TheProperNounPossessive::default(), "London's population.", ) } #[test] fn dont_flag_common_noun_in_titlecase() { assert_no_lints("The Dog's Dinner", TheProperNounPossessive::default()) } #[test] #[ignore = "Can't currently do this due to issue #???"] fn fix_proper_noun_stylized_to_begin_lowercase() { assert_suggestion_result( "The macOS's Finder", TheProperNounPossessive::default(), "macOS's Finder", ); } #[test] fn fix_even_when_capitalisation_omitted() { assert_suggestion_result( "the egypt's pyramids", TheProperNounPossessive::default(), "egypt's pyramids", ) } #[test] fn dont_flag_proper_noun_thats_also_common_noun() { assert_no_lints("the china's broken", TheProperNounPossessive::default()); } #[test] fn dont_flag_the_internets() { assert_no_lints( "The internet's most popular icon toolkit has been redesigned", TheProperNounPossessive::default(), ); } #[test] fn dont_flag_the_internets_curly_apostrophe() { assert_no_lints( "The internet’s most popular icon toolkit has been redesigned", TheProperNounPossessive::default(), ); } } ================================================ FILE: harper-core/src/linting/then_than.rs ================================================ use super::{ExprLinter, Lint, LintKind}; use crate::expr::{All, Expr, FirstMatchOf, FixedPhrase, SequenceExpr}; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; use crate::patterns::{Invert, Word, WordSet}; use crate::{CharStringExt, Token, TokenKind}; /// Corrects the misuse of `then` to `than`. pub struct ThenThan { expr: FirstMatchOf, } impl ThenThan { pub fn new() -> Self { let comparison = All::new(vec![ Box::new(FirstMatchOf::new(vec![ // Comparative form of adjective Box::new( SequenceExpr::with(Box::new(|tok: &Token, source: &[char]| { is_comparative(tok, source) })) .t_ws() .t_aco("then") .t_ws() .then_unless(Word::new("that")), ), // Positive form of adjective following "more" or "less" Box::new( SequenceExpr::word_set(&["more", "less"]) .t_ws() .then_kind_either(TokenKind::is_adjective, TokenKind::is_adverb) .t_ws() .t_aco("then") .t_ws() .then_unless(Word::new("that")), ), ])), // Exceptions to the rule. Box::new(Invert::new(WordSet::new(&["back", "this", "so", "but"]))), ]); Self { expr: FirstMatchOf::new(vec![ Box::new(comparison), Box::new(FixedPhrase::from_phrase("easier said then done")), Box::new(FixedPhrase::from_phrase("now and than")), Box::new(FixedPhrase::from_phrase("other then")), Box::new(FixedPhrase::from_phrase("rather then")), Box::new(FixedPhrase::from_phrase("than again")), Box::new(FixedPhrase::from_phrase("until than")), ]), } } } fn is_comparative(tok: &Token, source: &[char]) -> bool { tok.kind.is_comparative_adjective() || tok .span .get_content(source) .eq_any_ignore_ascii_case_chars(&[&['l', 'e', 's', 's'], &['m', 'o', 'r', 'e']]) } impl Default for ThenThan { fn default() -> Self { Self::new() } } impl ExprLinter for ThenThan { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let mut thans_and_thens = matched_tokens.iter().filter(|tok| { tok.span .get_content(source) .eq_any_ignore_ascii_case_chars(&[&['t', 'h', 'a', 'n'], &['t', 'h', 'e', 'n']]) }); // Get the first match and ensure there's exactly one let span = match (thans_and_thens.next(), thans_and_thens.next()) { (Some(token), None) => token.span, _ => return None, }; let offending_text = span.get_content(source); let new_text = if offending_text.eq_ignore_ascii_case_chars(&['t', 'h', 'e', 'n']) { "than" } else { "then" }; Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( new_text.chars().collect(), offending_text, )], message: format!("Did you mean `{new_text}`?"), priority: 31, }) } fn description(&self) -> &'static str { "Corrects mixing up `then` and `than`." } } #[cfg(test)] mod tests { use super::ThenThan; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn allows_back_then() { assert_lint_count("I was a gross kid back then.", ThenThan::default(), 0); } #[test] fn catches_shorter_then() { assert_suggestion_result( "One was shorter then the other.", ThenThan::default(), "One was shorter than the other.", ); } #[test] fn catches_better_then() { assert_suggestion_result( "One was better then the other.", ThenThan::default(), "One was better than the other.", ); } #[test] fn catches_longer_then() { assert_suggestion_result( "One was longer then the other.", ThenThan::default(), "One was longer than the other.", ); } #[test] fn catches_less_then() { assert_suggestion_result( "I eat less then you.", ThenThan::default(), "I eat less than you.", ); } #[test] fn catches_more_then() { assert_suggestion_result( "I eat more then you.", ThenThan::default(), "I eat more than you.", ); } #[test] fn stronger_should_change() { assert_suggestion_result( "a chain is no stronger then its weakest link", ThenThan::default(), "a chain is no stronger than its weakest link", ); } #[test] fn half_a_loaf_should_change() { assert_suggestion_result( "half a loaf is better then no bread", ThenThan::default(), "half a loaf is better than no bread", ); } #[test] fn then_everyone_clapped_should_be_allowed() { assert_lint_count("and then everyone clapped", ThenThan::default(), 0); } #[test] fn crazier_than_rat_should_change() { assert_suggestion_result( "crazier then a shithouse rat", ThenThan::default(), "crazier than a shithouse rat", ); } #[test] fn poke_in_eye_should_change() { assert_suggestion_result( "better then a poke in the eye with a sharp stick", ThenThan::default(), "better than a poke in the eye with a sharp stick", ); } #[test] fn other_then_should_change() { assert_suggestion_result( "There was no one other then us at the campsite.", ThenThan::default(), "There was no one other than us at the campsite.", ); } #[test] fn allows_and_then() { assert_lint_count("And then we left.", ThenThan::default(), 0); } #[test] fn allows_this_then() { assert_lint_count("Do this then that.", ThenThan::default(), 0); } #[test] fn allows_issue_720() { assert_lint_count( "And if just one of those is set incorrectly or it has the tiniest bit of dirt inside then that will wreak havoc with the engine's running ability.", ThenThan::default(), 0, ); assert_lint_count("So let's check it out then.", ThenThan::default(), 0); assert_lint_count( "And if just the tiniest bit of dirt gets inside then that will wreak havoc.", ThenThan::default(), 0, ); assert_lint_count( "He was always a top student in school but then his argument is that grades don't define intelligence.", ThenThan::default(), 0, ); } #[test] fn allows_issue_744() { assert_lint_count( "So then after talking about how he would, he didn't.", ThenThan::default(), 0, ); } #[test] fn issue_720_school_but_then_his() { assert_lint_count( "She loved the atmosphere of the school but then his argument is that it lacks proper resources for students.", ThenThan::default(), 0, ); assert_lint_count( "The teacher praised the efforts of the school but then his argument is that the curriculum needs to be updated.", ThenThan::default(), 0, ); assert_lint_count( "They were excited about the new program at school but then his argument is that it won't be effective without proper training.", ThenThan::default(), 0, ); assert_lint_count( "The community supported the school but then his argument is that funding is still a major issue.", ThenThan::default(), 0, ); } #[test] fn issue_720_so_then_these_resistors() { assert_lint_count( "So then these resistors are connected up in parallel to reduce the overall resistance.", ThenThan::default(), 0, ); assert_lint_count( "So then these resistors are connected up to ensure the current flows properly.", ThenThan::default(), 0, ); assert_lint_count( "So then these resistors are connected up to achieve the desired voltage drop.", ThenThan::default(), 0, ); assert_lint_count( "So then these resistors are connected up to demonstrate the principles of series and parallel circuits.", ThenThan::default(), 0, ); assert_lint_count( "So then these resistors are connected up to optimize the circuit's performance.", ThenThan::default(), 0, ); } #[test] fn issue_720_yes_so_then_sorry() { assert_lint_count( "Yes so then sorry you didn't receive the memo about the meeting changes.", ThenThan::default(), 0, ); assert_lint_count( "Yes so then sorry you had to wait so long for a response from our team.", ThenThan::default(), 0, ); assert_lint_count( "Yes so then sorry you felt left out during the discussion; we value your input.", ThenThan::default(), 0, ); assert_lint_count( "Yes so then sorry you missed the deadline; we can discuss an extension.", ThenThan::default(), 0, ); assert_lint_count( "Yes so then sorry you encountered issues with the software; let me help you troubleshoot.", ThenThan::default(), 0, ); } #[test] fn more_talented_then_her_issue_720() { assert_suggestion_result( "He was more talented then her at writing code.", ThenThan::default(), "He was more talented than her at writing code.", ); } #[test] fn simpler_then_hers_issue_720() { assert_suggestion_result( "The design was simpler then hers in layout and color scheme.", ThenThan::default(), "The design was simpler than hers in layout and color scheme.", ); } #[test] fn earlier_then_him_issue_720() { assert_suggestion_result( "We arrived earlier then him at the event.", ThenThan::default(), "We arrived earlier than him at the event.", ); } #[test] fn more_robust_then_his_issue_720() { assert_suggestion_result( "This approach is more robust then his for handling edge cases.", ThenThan::default(), "This approach is more robust than his for handling edge cases.", ); } #[test] fn patch_more_recently_then_last_week_issue_720() { assert_suggestion_result( "We submitted the patch more recently then last week, so they should have it already.", ThenThan::default(), "We submitted the patch more recently than last week, so they should have it already.", ); } #[test] fn allows_well_then() { assert_lint_count( "Well then we're just going to raise all of these taxes", ThenThan::default(), 0, ); } #[test] fn allows_nervous_then() { assert_lint_count( "I think both of us were getting nervous then because the system would have automatically aborted.", ThenThan::default(), 0, ); } #[test] fn flags_stupider_then_and_more_and_less_stupid_then() { assert_lint_count( "He was stupider then her but she was more stupid then some. Then again he was less stupid then some too.", ThenThan::default(), 3, ); } #[test] fn patch_worse_then() { assert_suggestion_result( "He was worse then her at writing code.", ThenThan::default(), "He was worse than her at writing code.", ); } #[test] fn patch_rather_then() { assert_suggestion_result( "If copy-paste has to be prevented, I'd prefer it if paste rather then copy would be disabled", ThenThan::default(), "If copy-paste has to be prevented, I'd prefer it if paste rather than copy would be disabled", ); } #[test] fn patch_easier_said_then_done() { assert_suggestion_result( "This is currently easier said then done because you cannot press Ctrl+A in the debug console", ThenThan::default(), "This is currently easier said than done because you cannot press Ctrl+A in the debug console", ); } #[test] fn patch_every_now_and_than() { assert_suggestion_result( "I was testing every now and than after an upgrade on the home assistant plugin.", ThenThan::default(), "I was testing every now and then after an upgrade on the home assistant plugin.", ); } #[test] fn patch_until_than() { assert_suggestion_result( "For the case anyone else ever hits this and the problem is not solved until than, this is a working workaround for the problem", ThenThan::default(), "For the case anyone else ever hits this and the problem is not solved until then, this is a working workaround for the problem", ); } #[test] fn patch_now_and_than() { assert_suggestion_result( "sounds good if golang-set becomes an issue between now and than…just let me know!", ThenThan::default(), "sounds good if golang-set becomes an issue between now and then…just let me know!", ); } } ================================================ FILE: harper-core/src/linting/theres.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenKind, expr::SequenceExpr, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct Theres { expr: SequenceExpr, } impl Default for Theres { fn default() -> Self { let expr = SequenceExpr::aco("their's").t_ws().then_kind_any_or_words( &[TokenKind::is_determiner, TokenKind::is_quantifier] as &[_], &["no", "enough"], ); Self { expr } } } impl ExprLinter for Theres { type Unit = Chunk; fn expr(&self) -> &dyn crate::expr::Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let offender = tokens.first()?; let span = offender.span; let template = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str("there's", template)], message: "Use `there's`—the contraction of “there is”—for this construction.".into(), priority: 31, }) } fn description(&self) -> &str { "Replaces the mistaken possessive `their's` before a determiner with the contraction `there's`." } } #[cfg(test)] mod tests { use super::Theres; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_lowercase_before_the() { assert_suggestion_result( "We realized their's the clue we missed.", Theres::default(), "We realized there's the clue we missed.", ); } #[test] fn corrects_sentence_start() { assert_suggestion_result( "Their's the solution on the table.", Theres::default(), "There's the solution on the table.", ); } #[test] fn corrects_before_no() { assert_suggestion_result( "I promise their's no extra charge.", Theres::default(), "I promise there's no extra charge.", ); } #[test] fn corrects_before_an() { assert_suggestion_result( "I suspect their's an error in the log.", Theres::default(), "I suspect there's an error in the log.", ); } #[test] fn corrects_before_a() { assert_suggestion_result( "Maybe their's a better route available.", Theres::default(), "Maybe there's a better route available.", ); } #[test] fn corrects_before_another() { assert_suggestion_result( "Their's another round after this.", Theres::default(), "There's another round after this.", ); } #[test] fn corrects_before_enough() { assert_suggestion_result( "Their's enough context in the report.", Theres::default(), "There's enough context in the report.", ); } #[test] fn allows_possessive_pronoun_form() { assert_lint_count("Theirs is the final draft.", Theres::default(), 0); } #[test] fn ignores_without_determiner_afterward() { assert_lint_count("I think their's better already.", Theres::default(), 0); } #[test] fn ignores_correct_contraction() { assert_lint_count("There's a bright sign ahead.", Theres::default(), 0); } } ================================================ FILE: harper-core/src/linting/theses_these.rs ================================================ use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::patterns::UPOSSet; use harper_brill::UPOS; pub struct ThesesThese { expr: SequenceExpr, } impl Default for ThesesThese { fn default() -> Self { let expr = SequenceExpr::default() .t_aco("theses") .t_ws() .then(UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN])); Self { expr } } } impl ExprLinter for ThesesThese { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let theses_token = matched_tokens.first()?; let content = theses_token.span.get_content(source); let suggestions = vec![Suggestion::replace_with_match_case_str("these", content)]; Some(Lint { span: theses_token.span, lint_kind: LintKind::Spelling, suggestions, message: "Did you mean `these`?".to_string(), priority: 1, }) } fn description(&self) -> &'static str { "Corrects the common misspelling of `these` as `theses`." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::ThesesThese; #[test] fn corrects_theses_scenes() { assert_suggestion_result( "Are theses scenes from a novel?", ThesesThese::default(), "Are these scenes from a novel?", ); } #[test] fn corrects_theses_days() { assert_suggestion_result( "That's why the two countries look as they do theses days.", ThesesThese::default(), "That's why the two countries look as they do these days.", ); } #[test] fn allows_correct_theses() { assert_no_lints( "There are universities that are dedicated just to this field, thousands of people doing theses on Picasso, for example.", ThesesThese::default(), ); } #[test] fn allows_theses_followed_by_verb() { assert_no_lints( "Theses are the times that try men's souls.", ThesesThese::default(), ); } #[test] fn works_with_capitalization() { assert_suggestion_result( "THESES BOOKS ARE GREAT.", ThesesThese::default(), "THESE BOOKS ARE GREAT.", ); } #[test] fn works_with_mixed_capitalization() { assert_suggestion_result( "Theses Books Are My Favorite.", ThesesThese::default(), "These Books Are My Favorite.", ); } #[test] fn simple_case() { assert_suggestion_result( "I like theses apples.", ThesesThese::default(), "I like these apples.", ); } #[test] fn with_punctuation() { assert_no_lints("Are theses, books good?", ThesesThese::default()); } #[test] fn in_the_middle_of_sentence() { assert_suggestion_result( "I saw theses movies yesterday.", ThesesThese::default(), "I saw these movies yesterday.", ); } #[test] fn another_example() { assert_lint_count("I have theses books.", ThesesThese::default(), 1); } #[test] fn allows_band_name() { assert_no_lints("Theses are a great band.", ThesesThese::default()); } #[test] fn does_not_correct_valid_theses() { assert_no_lints( "She wrote multiple theses on the topic.", ThesesThese::default(), ); } } ================================================ FILE: harper-core/src/linting/theyre_confusions/mod.rs ================================================ mod over_theyre_to_there; mod typographic_theyre_to_their; use crate::Token; use crate::char_ext::CharExt; use crate::char_string::CharStringExt; use super::merge_linters::merge_linters; use over_theyre_to_there::OverTheyreToThere; use typographic_theyre_to_their::TypographicTheyreToTheir; fn token_is_theyre(token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } token .span .get_content(source) .normalized() .eq_ignore_ascii_case_str("they're") } fn token_is_typographic_theyre(token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } let content = token.span.get_content(source); content.iter().any(|c| c.normalized() != *c) && content.normalized().eq_ignore_ascii_case_str("they're") } fn token_is_likely_their_possession(token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } let normalized = token.span.get_content(source).normalized(); matches!( normalized.as_ref(), ['b', 'a', 'c', 'k', 'p', 'a', 'c', 'k', 's'] | ['p', 'a', 't', 'i', 'e', 'n', 'c', 'e'] | ['d', 'o', 'g'] | ['p', 'r', 'o', 'p', 'o', 's', 'a', 'l'] | ['l', 'a', 'u', 'g', 'h', 't', 'e', 'r'] | ['l', 'a', 'd', 'd', 'e', 'r'] | ['a', 'p', 'a', 'r', 't', 'm', 'e', 'n', 't'] | ['m', 'i', 't', 't', 'e', 'n', 's'] | ['a', 'n', 's', 'w', 'e', 'r'] | ['s', 'k', 'e', 't', 'c', 'h', 'e', 's'] | ['s', 'e', 'r', 'v', 'e', 'r'] | ['b', 'a', 'c', 'k', 'u', 'p'] | ['e', 'v', 'i', 'd', 'e', 'n', 'c', 'e'] | ['g', 'a', 'r', 'd', 'e', 'n'] | ['m', 'a', 'p', 's'] | ['t', 'e', 'a', 'm'] | ['p', 'a', 's', 't'] | ['n', 'e', 'e', 'd', 's'] | ['p', 'a', 'w', 'n'] | ['a', 'b', 'i', 'l', 'i', 't', 'y'] | ['r', 'e', 't', 'u', 'r', 'n'] | ['h', 'e', 'a', 'r', 'i', 'n', 'g'] | ['h', 'o', 'u', 's', 'e'] | ['c', 'o', 'a', 't', 's'] | ['p', 'r', 'o', 'b', 'l', 'e', 'm', 's'] | [ 'u', 'n', 'd', 'e', 'r', 's', 't', 'a', 'n', 'd', 'i', 'n', 'g' ] | ['n', 'e', 'w'] ) } merge_linters!( TheyreConfusions => OverTheyreToThere, TypographicTheyreToTheir => "Detects apostrophe and locative edge cases that are awkward to model with standard contraction checks." ); ================================================ FILE: harper-core/src/linting/theyre_confusions/over_theyre_to_there.rs ================================================ use super::token_is_theyre; use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::SequenceExpr, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct OverTheyreToThere { expr: Box, } impl Default for OverTheyreToThere { fn default() -> Self { let expr = SequenceExpr::aco("over") .t_ws() .then(token_is_theyre as fn(&Token, &[char]) -> bool); Self { expr: Box::new(expr), } } } impl ExprLinter for OverTheyreToThere { type Unit = Chunk; fn expr(&self) -> &dyn crate::expr::Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offender = matched_tokens.last()?; let template = offender.span.get_content(source); Some(Lint { span: offender.span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::replace_with_match_case_str("there", template)], message: "Did you mean `there`?".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Corrects locative `over they're` to `over there`." } } #[cfg(test)] mod tests { use super::OverTheyreToThere; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_locative_ascii_apostrophe() { assert_suggestion_result( "Put the chairs over they're by the window.", OverTheyreToThere::default(), "Put the chairs over there by the window.", ); } #[test] fn corrects_locative_smart_apostrophe() { assert_suggestion_result( "Is that their car parked over they’re?", OverTheyreToThere::default(), "Is that their car parked over there?", ); } #[test] fn ignores_correct_form() { assert_lint_count( "Put the chairs over there by the window.", OverTheyreToThere::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/theyre_confusions/typographic_theyre_to_their.rs ================================================ use super::{token_is_likely_their_possession, token_is_typographic_theyre}; use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::SequenceExpr, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct TypographicTheyreToTheir { expr: Box, } impl Default for TypographicTheyreToTheir { fn default() -> Self { let expr = SequenceExpr::with(token_is_typographic_theyre as fn(&Token, &[char]) -> bool) .t_ws() .then(token_is_likely_their_possession as fn(&Token, &[char]) -> bool); Self { expr: Box::new(expr), } } } impl ExprLinter for TypographicTheyreToTheir { type Unit = Chunk; fn expr(&self) -> &dyn crate::expr::Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let offender = matched_tokens.first()?; let template = offender.span.get_content(source); Some(Lint { span: offender.span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::replace_with_match_case_str("their", template)], message: "Did you mean `their`?".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Corrects smart-apostrophe `they’re` to `their` in possessive noun contexts." } } #[cfg(test)] mod tests { use super::TypographicTheyreToTheir; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_smart_apostrophe_possessive() { assert_suggestion_result( "I think they’re house is the blue one.", TypographicTheyreToTheir::default(), "I think their house is the blue one.", ); } #[test] fn ignores_ascii_form_for_existing_rule() { assert_lint_count( "I think they're house is the blue one.", TypographicTheyreToTheir::default(), 0, ); } #[test] fn ignores_non_possessive_usage() { assert_lint_count( "I think they’re coming tonight.", TypographicTheyreToTheir::default(), 0, ); } #[test] fn ignores_contraction_examples_from_books() { assert_lint_count("No, they’re not.", TypographicTheyreToTheir::default(), 0); assert_lint_count( "I don’t know what they’re like.", TypographicTheyreToTheir::default(), 0, ); assert_lint_count( "They’re all over crumbs.", TypographicTheyreToTheir::default(), 0, ); assert_lint_count( "They’re done with blacking, I believe.", TypographicTheyreToTheir::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/thing_think.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, FirstMatchOf, FixedPhrase, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; /// Corrects the typo "thing" for "think". pub struct ThingThink { expr: SequenceExpr, } impl Default for ThingThink { fn default() -> Self { let subject_pronouns = WordSet::new(&["I", "you", "we", "they"]); let indefinite_pronouns = FirstMatchOf::new(vec![ Box::new(WordSet::new(&[ "anybody", "anyone", "everybody", "everyone", ])), // "Any one thing", "every one thing", "any body thing" cause false positives. Box::new(FixedPhrase::from_phrase("every body")), ]); let pronoun = FirstMatchOf::new(vec![ Box::new(subject_pronouns), Box::new(indefinite_pronouns), ]); let verb_to = SequenceExpr::word_set(&[ "have", "had", "has", "having", "need", "needed", "needs", "needing", "want", "wanted", "wants", "wanting", "try", "tried", "tries", "trying", ]) .t_ws() .t_aco("to"); let modal = WordSet::new(&[ "can", "cannot", "can't", "could", "couldn't", "may", "might", "mightn't", "must", "mustn't", "shall", "shan't", "should", "shouldn't", "will", "won't", ]); let adverb_of_frequency = WordSet::new(&["always", "sometimes", "often", "usually", "never"]); let pre_context = FirstMatchOf::new(vec![ Box::new(pronoun), Box::new(verb_to), Box::new(modal), Box::new(adverb_of_frequency), ]); let pattern = SequenceExpr::with(pre_context).t_ws().t_aco("thing"); Self { expr: pattern } } } impl ExprLinter for ThingThink { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let thing_span = toks.last()?.span; Some(Lint { span: thing_span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case( ['t', 'h', 'i', 'n', 'k'].to_vec(), thing_span.get_content(src), )], message: "Did you mean `think`?".to_owned(), priority: 31, }) } fn description(&self) -> &'static str { "Corrects the typo `thing` when it should be `think`." } } #[cfg(test)] mod tests { use super::ThingThink; use crate::linting::tests::assert_suggestion_result; // Pronouns #[test] fn fix_you_thing() { assert_suggestion_result( "Whad do you thing about tinygo?", ThingThink::default(), "Whad do you think about tinygo?", ); } #[test] fn fix_i_thing() { assert_suggestion_result( "bcz i thing hugging face embeddings and models are very complex", ThingThink::default(), "bcz i think hugging face embeddings and models are very complex", ); } #[test] fn fix_we_thing() { assert_suggestion_result( "which information we thing to be missing", ThingThink::default(), "which information we think to be missing", ); } #[test] fn fix_they_thing() { assert_suggestion_result( "they thing something is a good idea", ThingThink::default(), "they think something is a good idea", ); } #[test] fn fix_everyone_thing() { assert_suggestion_result( "What does everyone thing here?", ThingThink::default(), "What does everyone think here?", ); } #[test] fn fix_anyone_thing() { assert_suggestion_result( "Can anyone thing of a (reasonable) way to align them such that the 'a's in all 4 words will be in (more or less) the same vertical position?", ThingThink::default(), "Can anyone think of a (reasonable) way to align them such that the 'a's in all 4 words will be in (more or less) the same vertical position?", ); } #[test] fn fix_anybody_thing() { assert_suggestion_result( "If anybody thing there is an issue in Karma, please re-open.", ThingThink::default(), "If anybody think there is an issue in Karma, please re-open.", ); } #[test] fn fix_every_body_thing() { assert_suggestion_result( "What does every body thing I should do with my Randy Johnson rookie card.", ThingThink::default(), "What does every body think I should do with my Randy Johnson rookie card.", ); } // Verb to #[test] fn fix_have_to_thing() { assert_suggestion_result( "I always have to thing what button does what action.", ThingThink::default(), "I always have to think what button does what action.", ); } #[test] fn fix_need_to_thing() { assert_suggestion_result( "No need to thing about the REGEX.", ThingThink::default(), "No need to think about the REGEX.", ); } #[test] fn fix_want_to_thing() { assert_suggestion_result( "maybe you want to thing of this also as a feature enhancement.", ThingThink::default(), "maybe you want to think of this also as a feature enhancement.", ); } #[test] fn fix_having_to_thing() { assert_suggestion_result( "it has saved me personally hours in combined time not having to thing about whether something is in seconds or milliseconds", ThingThink::default(), "it has saved me personally hours in combined time not having to think about whether something is in seconds or milliseconds", ); } #[test] fn fix_needs_to() { assert_suggestion_result( "When implementing any functionality once needs to thing aboiut how it is going to be used.", ThingThink::default(), "When implementing any functionality once needs to think aboiut how it is going to be used.", ); } #[test] fn fix_needed_to() { assert_suggestion_result( "Even in that case we needed to thing about the syntax so that we wouldn't need to change existing syntax", ThingThink::default(), "Even in that case we needed to think about the syntax so that we wouldn't need to change existing syntax", ); } #[test] fn fix_had_to() { assert_suggestion_result( "I had to thing in ways of making people more interested in it", ThingThink::default(), "I had to think in ways of making people more interested in it", ); } #[test] fn fix_trying_to_thing() { assert_suggestion_result( "Here I'm trying to thing about the following questions:", ThingThink::default(), "Here I'm trying to think about the following questions:", ); } // Modal verbs #[test] fn fix_can_thing() { assert_suggestion_result( "The exe file dosen't work allways, because antivirus can thing it is a virus.", ThingThink::default(), "The exe file dosen't work allways, because antivirus can think it is a virus.", ); } #[test] fn fix_could_thing() { assert_suggestion_result( "\"doesNotReturnSameInstanceWhenCalledMultipleTimes\" is a terrible name, but the only one i could thing of immediately.", ThingThink::default(), "\"doesNotReturnSameInstanceWhenCalledMultipleTimes\" is a terrible name, but the only one i could think of immediately.", ); } #[test] fn fix_might_thing() { assert_suggestion_result( "Consider what a reader might thing when reading a switch", ThingThink::default(), "Consider what a reader might think when reading a switch", ); } #[test] fn fix_should_thing() { assert_suggestion_result( "And we should thing to add a flag so the user could decide if internal top level extension functions are ok or not.", ThingThink::default(), "And we should think to add a flag so the user could decide if internal top level extension functions are ok or not.", ); } #[test] fn fix_may_thing() { assert_suggestion_result( "It is easier than you may thing to run both bands with hostapd.", ThingThink::default(), "It is easier than you may think to run both bands with hostapd.", ); } #[test] fn fix_cannot_thing() { assert_suggestion_result( "I cannot thing of a simple way to implement compensation of a change in Fnco.", ThingThink::default(), "I cannot think of a simple way to implement compensation of a change in Fnco.", ); } #[test] fn fix_will_thing() { assert_suggestion_result( "So user will thing that delete operation is fine but its not this code deletes the wrong page and make one extra page which wrong.", ThingThink::default(), "So user will think that delete operation is fine but its not this code deletes the wrong page and make one extra page which wrong.", ); } #[test] fn fix_cant_thing() { assert_suggestion_result( "can't thing of another place, which could have such effect", ThingThink::default(), "can't think of another place, which could have such effect", ); } #[test] fn fix_couldnt_thing() { assert_suggestion_result( "I couldn't thing about a better title, but I run into problems since the new dplyr release.", ThingThink::default(), "I couldn't think about a better title, but I run into problems since the new dplyr release.", ); } #[test] fn fix_shouldnt_thing() { assert_suggestion_result( "When dealing with a multi-tenanted system, users shouldn't thing about 'Databases', they should think about Tenants.", ThingThink::default(), "When dealing with a multi-tenanted system, users shouldn't think about 'Databases', they should think about Tenants.", ); } #[test] fn fix_wont_thing() { assert_suggestion_result( "I think you need to use an io.Pipe so the Go HTTP Request won't thing the buf has been fulling read.", ThingThink::default(), "I think you need to use an io.Pipe so the Go HTTP Request won't think the buf has been fulling read.", ); } // Adverb of frequency #[test] fn fix_always_thing() { assert_suggestion_result( "one should always thing of whether the efforts are better targeted to the improvement", ThingThink::default(), "one should always think of whether the efforts are better targeted to the improvement", ); } #[test] fn fix_sometimes_thing() { assert_suggestion_result( "One thing that I sometimes thing would be nice is if I could make different instances", ThingThink::default(), "One thing that I sometimes think would be nice is if I could make different instances", ); } #[test] fn fix_often_thing() { assert_suggestion_result( "When working with workflows on many forms I often thing I need to do the same over and over", ThingThink::default(), "When working with workflows on many forms I often think I need to do the same over and over", ); } #[test] fn fix_never_thing() { assert_suggestion_result( "just use UUIDv7 and never thing about those details again", ThingThink::default(), "just use UUIDv7 and never think about those details again", ); } #[test] fn fix_usually_thing() { assert_suggestion_result( "And the order of that relationship might be reversed from what one might usually thing.", ThingThink::default(), "And the order of that relationship might be reversed from what one might usually think.", ); } } ================================================ FILE: harper-core/src/linting/this_type_of_thing.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::WordSet, }; pub struct ThisTypeOfThing { expr: SequenceExpr, } impl Default for ThisTypeOfThing { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["this", "these", "that", "those"]) .t_ws() .then( SequenceExpr::word_set(&["kind", "kinds", "sort", "sorts", "type", "types"]) .t_ws(), ) .t_aco("of") .t_ws() .then_any_of(vec![ // "thing" is common in this construction and won't be part of a compound noun. Box::new(WordSet::new(&["thing", "things"])), // Other singular nouns may be part of hard-to-determine compound nouns, but plural nouns won't. Box::new( SequenceExpr::default() .then_kind_where(|k| k.is_plural_noun() && !k.is_singular_noun()), ), ]), } } } impl ExprLinter for ThisTypeOfThing { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn description(&self) -> &str { "Checks that the parts of `this/these type(s) of thing(s)` agree in grammatical number" } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { #[derive(PartialEq)] enum Num { Sg, Pl, } let (det_tok, type_tok, thing_tok) = (toks.first()?, toks.get(2)?, toks.last()?); let (type_kind, thing_kind) = (&type_tok.kind, &thing_tok.kind); let (det_span, type_span) = (det_tok.span, type_tok.span); let (det_chars, type_chars) = (det_span.get_content(src), type_span.get_content(src)); let (det_num, type_num, thing_num) = ( if det_chars.eq_any_ignore_ascii_case_str(&["this", "that"]) { Num::Sg } else { Num::Pl }, if type_kind.is_plural_noun() { Num::Pl } else { Num::Sg }, if thing_kind.is_plural_noun() { Num::Pl } else { Num::Sg }, ); if det_num == type_num && type_num == thing_num { return None; }; enum Deixis { Proximal, Distal, } let deixis = if det_chars.eq_any_ignore_ascii_case_str(&["this", "these"]) { Deixis::Proximal } else { Deixis::Distal }; enum Specie { Kind, Sort, Type, } let specie = match type_chars.first()? { 'k' | 'K' => Specie::Kind, 's' | 'S' => Specie::Sort, 't' | 'T' => Specie::Type, _ => return None, }; // Due to the logic above, when we get here we either have 1 singular and 2 plurals or 2 plurals and 1 singular. // Meaning one of the three varying words does not agree in number with the other two. let bad_tok = match (&det_num, &type_num, &thing_num) { (Num::Sg, Num::Sg, Num::Pl) => thing_tok, (Num::Sg, Num::Pl, Num::Sg) => type_tok, (Num::Sg, Num::Pl, Num::Pl) => det_tok, (Num::Pl, Num::Sg, Num::Sg) => det_tok, (Num::Pl, Num::Sg, Num::Pl) => type_tok, (Num::Pl, Num::Pl, Num::Sg) => thing_tok, _ => return None, }; Some(Lint { span: bad_tok.span, lint_kind: LintKind::Agreement, suggestions: vec![Suggestion::replace_with_match_case( if bad_tok == det_tok { match (det_num, deixis) { (Num::Sg, Deixis::Proximal) => "these", (Num::Sg, Deixis::Distal) => "those", (Num::Pl, Deixis::Proximal) => "this", (Num::Pl, Deixis::Distal) => "that", } } else if bad_tok == type_tok { match (type_num, specie) { (Num::Sg, Specie::Kind) => "kinds", (Num::Pl, Specie::Kind) => "kind", (Num::Sg, Specie::Sort) => "sorts", (Num::Pl, Specie::Sort) => "sort", (Num::Sg, Specie::Type) => "types", (Num::Pl, Specie::Type) => "type", } } else if bad_tok == thing_tok { match thing_num { Num::Sg => "things", Num::Pl => "thing", } } else { return None; } .chars() .collect(), bad_tok.span.get_content(src), )], message: "The grammatical number of the determiner and the two nouns must agree." .to_string(), ..Default::default() }) } } #[cfg(test)] mod tests { use crate::linting::{tests::assert_suggestion_result, this_type_of_thing::ThisTypeOfThing}; #[test] fn fix_that_kind_of_things() { assert_suggestion_result( "it's specific to TypeScript and not Go nor Python can do that kind of things", ThisTypeOfThing::default(), "it's specific to TypeScript and not Go nor Python can do that kind of thing", ); } #[test] fn fix_that_sort_of_things() { assert_suggestion_result( "there isn't a trivial stb-like ready-to-use C++ library to do that sort of things", ThisTypeOfThing::default(), "there isn't a trivial stb-like ready-to-use C++ library to do that sort of thing", ); } #[test] fn fix_these_kind_of_things() { assert_suggestion_result( "For these kind of things, I think it would be great to have a user-defined field which can be used to search for files.", ThisTypeOfThing::default(), "For these kinds of things, I think it would be great to have a user-defined field which can be used to search for files.", ); } #[test] fn fix_these_sort_of_thing() { assert_suggestion_result( "People from npm actually get death threats for these sort of thing", ThisTypeOfThing::default(), "People from npm actually get death threats for this sort of thing", ); } #[test] fn fix_these_sort_of_things() { assert_suggestion_result( "I suppose doing these sort of things should be legal", ThisTypeOfThing::default(), "I suppose doing these sorts of things should be legal", ); } #[test] fn fix_these_sorts_of_thing() { assert_suggestion_result( "What I would like to understand is what the syntactic structure is for these sorts of things.", ThisTypeOfThing::default(), "What I would like to understand is what the syntactic structure is for these sorts of things.", ); } #[test] fn fix_these_type_of_things() { assert_suggestion_result( "You can use the Symfony validator to validate these type of things easily.", ThisTypeOfThing::default(), "You can use the Symfony validator to validate these types of things easily.", ); } #[test] fn fix_this_kind_of_things() { assert_suggestion_result( "this kind of things could exists in languages like Haskell which supports higher kinded types", ThisTypeOfThing::default(), "this kind of thing could exists in languages like Haskell which supports higher kinded types", ); } #[test] fn fix_this_sort_of_things() { assert_suggestion_result( "I have heard this sort of things happening in the movie industry but it's appalling that it happens in the business world too", ThisTypeOfThing::default(), "I have heard this sort of thing happening in the movie industry but it's appalling that it happens in the business world too", ); } #[test] fn fix_this_type_of_things() { assert_suggestion_result( "how to handle this type of things", ThisTypeOfThing::default(), "how to handle this type of thing", ); } #[test] fn fix_those_kind_of_things() { assert_suggestion_result( "uh, so I was playing both of those kind of things", ThisTypeOfThing::default(), "uh, so I was playing both of those kinds of things", ); } } ================================================ FILE: harper-core/src/linting/though_thought.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::expr_linter::find_the_only_token_matching; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::{CharStringExt, Token, TokenKind}; pub struct ThoughThought { expr: SequenceExpr, } impl Default for ThoughThought { fn default() -> Self { Self { expr: SequenceExpr::default() .then_kind_is_but_is_not( TokenKind::is_subject_pronoun, TokenKind::is_object_pronoun, ) .t_ws() .t_aco("though") .t_ws() .then_any_of(vec![ Box::new(SequenceExpr::default().then_subject_pronoun()), Box::new(SequenceExpr::aco("that")), ]), } } } impl ExprLinter for ThoughThought { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let tok = find_the_only_token_matching(toks, src, |tok, src| { tok.span .get_content(src) .eq_ignore_ascii_case_chars(&['t', 'h', 'o', 'u', 'g', 'h']) })?; Some(Lint { span: tok.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "thought", tok.span.get_content(src), )], message: "Is this a typo for `thought`?".to_string(), ..Default::default() }) } fn description(&self) -> &'static str { "Corrects `though` when it's a typo for `thought`." } } #[cfg(test)] mod tests { use super::ThoughThought; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; #[test] fn fix_i_though_i() { assert_suggestion_result( "Looking at those I though I had to draw imgui into separate renderpass", ThoughThought::default(), "Looking at those I thought I had to draw imgui into separate renderpass", ); } #[test] fn fix_i_though_it() { assert_suggestion_result( "and I though it was a shame because the data it provides can be ...", ThoughThought::default(), "and I thought it was a shame because the data it provides can be ...", ); } #[test] fn fix_i_though_that() { assert_suggestion_result( "I though that there may be other solutions as in other here", ThoughThought::default(), "I thought that there may be other solutions as in other here", ); } #[test] fn fix_i_though_they() { assert_suggestion_result( "path parsin error ( i though they were extincted )", ThoughThought::default(), "path parsin error ( i thought they were extincted )", ); } #[test] fn fix_i_though_we() { assert_suggestion_result( "and that way I though we need something universial", ThoughThought::default(), "and that way I thought we need something universial", ); } #[test] fn fix_i_though_you() { assert_suggestion_result( "I though you resolved the issue, so I updated my version", ThoughThought::default(), "I thought you resolved the issue, so I updated my version", ); } #[test] fn dont_flag_it_though_i() { assert_no_lints( "am including it though i believe it's nto the case because before this", ThoughThought::default(), ); } #[test] fn dont_flag_it_though_it() { assert_no_lints( "Prisma works with it though it is not officially supported by Prisma yet.", ThoughThought::default(), ); } #[test] #[ignore = "TODO: Can't check because `it` is both subject and object"] fn fix_you_though_it() { assert_suggestion_result( "it may reveal that the bug is not where you though it was", ThoughThought::default(), "it may reveal that the bug is not where you thought it was", ); } #[test] fn dont_flag_you_though_that_1() { // Ambiguous: "I can tell you, though, that a project..." vs "I can tell (that) you thought that a project..." assert_no_lints( "I can tell you though that a project not using headers at all will likely be compiling much faster.", ThoughThought::default(), ); } #[test] fn dont_flag_you_though_that_2() { assert_no_lints( "I agree with you though that 2D lat/lon grids are unnecessarily confusing", ThoughThought::default(), ); } } ================================================ FILE: harper-core/src/linting/throw_away.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct ThrowAway { expr: SequenceExpr, } impl Default for ThrowAway { fn default() -> Self { let expr = SequenceExpr::default() .t_aco("through") .t_ws() .t_aco("away"); Self { expr } } } impl ExprLinter for ThrowAway { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let typo = matched_tokens.first()?; let original = typo.span.get_content(source); Some(Lint { span: typo.span, lint_kind: LintKind::Typo, suggestions: vec![ Suggestion::replace_with_match_case_str("throw", original), Suggestion::replace_with_match_case_str("threw", original), ], message: "Use `throw away` or `threw away`, depending on the tense you need." .to_string(), priority: 60, }) } fn description(&self) -> &str { "Finds the typo `through away` and suggests `throw away` or `threw away` instead." } } #[cfg(test)] mod tests { use super::ThrowAway; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn corrects_simple_case() { assert_suggestion_result( "We through away the old code.", ThrowAway::default(), "We throw away the old code.", ); } #[test] fn offers_past_tense_option() { assert_suggestion_result( "We through away the old code.", ThrowAway::default(), "We threw away the old code.", ); } #[test] fn corrects_sentence_start_capital() { assert_suggestion_result( "Through away this document when you're done.", ThrowAway::default(), "Throw away this document when you're done.", ); } #[test] fn corrects_all_caps_instance() { assert_suggestion_result( "Please THROUGH AWAY THE TRASH.", ThrowAway::default(), "Please THROW AWAY THE TRASH.", ); } #[test] fn corrects_with_extra_whitespace() { assert_suggestion_result( "We through away the leftovers.", ThrowAway::default(), "We throw away the leftovers.", ); } #[test] fn does_not_flag_throw_away() { assert_no_lints( "They throw away the packaging every time.", ThrowAway::default(), ); } #[test] fn does_not_flag_through_tunnel() { assert_no_lints( "They walked through the tunnel away from danger.", ThrowAway::default(), ); } #[test] fn flags_multiple_occurrences() { assert_lint_count( "We through away the forks and through away the spoons.", ThrowAway::default(), 2, ); } #[test] fn does_not_flag_thorough() { assert_no_lints( "She gave the room a thorough, away-from-home cleaning.", ThrowAway::default(), ); } #[test] fn corrects_with_contraction() { assert_suggestion_result( "Don't through away your shot.", ThrowAway::default(), "Don't throw away your shot.", ); } #[test] fn does_not_flag_spread_words() { assert_no_lints( "They pushed through as the crowd moved away.", ThrowAway::default(), ); } } ================================================ FILE: harper-core/src/linting/throw_rubbish.rs ================================================ use std::sync::LazyLock; use super::{Lint, LintKind, Linter}; use crate::{Document, Span, TokenStringExt, linting::Suggestion}; use hashbrown::HashSet; static THROW: LazyLock> = LazyLock::new(|| HashSet::from(["throw", "throws", "threw", "thrown", "throwing"])); static JUNK: LazyLock> = LazyLock::new(|| HashSet::from(["rubbish", "trash", "garbage", "junk"])); static ADV_PREP: LazyLock> = LazyLock::new(|| { HashSet::from([ // adverbs "away", "out", "back", "everywhere", // prepositions "in", "into", "at", "on", ]) }); #[derive(Debug, Default)] pub struct ThrowRubbish; impl Linter for ThrowRubbish { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for chunk in document.iter_chunks() { for verb_i in chunk.iter_verb_indices() { let verb_token = &chunk[verb_i]; let verb_str = document .get_span_content_str(&verb_token.span) .to_lowercase(); if !THROW.contains(verb_str.as_str()) { continue; } let chunk_rest = &chunk[verb_i + 1..]; let mut adv_prep_seen = false; let mut junk_seen = false; let mut last_i = None; for (rest_i, token) in chunk_rest.iter().enumerate() { let chunk_i = verb_i + rest_i + 1; let token_str = document.get_span_content_str(&token.span).to_lowercase(); if ADV_PREP.contains(token_str.as_str()) { adv_prep_seen = true; last_i = Some(chunk_i); if junk_seen { break; } } if JUNK.contains(token_str.as_str()) { // Check if this is being used as a qualifier for another noun // by looking at the next token after any whitespace if let Some(next_token) = document.get_next_word_from_offset(chunk_i, 1) && next_token.kind.is_noun() && !is_progressive_verb_form(document, next_token) { continue; // Skip if it's being used as an adjective } junk_seen = true; last_i = Some(chunk_i); if adv_prep_seen { break; } } } if junk_seen && !adv_prep_seen { let span = Span::new(chunk[verb_i].span.start, chunk[last_i.unwrap()].span.end); let verb = document.get_span_content_str(&chunk[verb_i].span); let rest = document.get_span_content_str(&Span::new( chunk[verb_i].span.end, chunk[last_i.unwrap()].span.end, )); // Generate all possible suggestions let suggestions = ["away", "out"] .iter() .flat_map(|adv| { [format!("{verb} {adv}{rest}"), format!("{verb}{rest} {adv}")] }) .map(|sugg| Suggestion::ReplaceWith(sugg.chars().collect())) .collect(); lints.push(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions, message: "To dispose of rubbish we don't just throw it, we throw it away" .to_string(), priority: 63, }); } } } lints } fn description(&self) -> &str { "Checks for throwing rubbish rather than throwing it away." } } // TODO replace this when we have proper support for progressive verb form in metadata fn is_progressive_verb_form(document: &Document, token: &crate::Token) -> bool { token.kind.is_verb_progressive_form() && document .get_span_content_str(&token.span) .to_lowercase() .ends_with("ing") } #[cfg(test)] mod tests { use super::ThrowRubbish; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; // Test correct patterns (should not trigger lint) #[test] fn allow_throw_away_rubbish() { assert_lint_count("Throw away the rubbish", ThrowRubbish, 0); } #[test] fn allow_throws_garbage_away() { assert_lint_count("He throws garbage away", ThrowRubbish, 0); } #[test] fn allow_threw_out_trash() { assert_lint_count("I threw out the trash", ThrowRubbish, 0); } #[test] fn allow_throw_junk_into() { assert_lint_count("Throw that junk into the bin!", ThrowRubbish, 0); } // Test incorrect patterns (should trigger lint) #[test] fn reject_throw_garbage() { assert_lint_count("You should throw garbage", ThrowRubbish, 1); } #[test] fn reject_throwing_rubbish() { assert_lint_count("Throwing rubbish is not a good idea", ThrowRubbish, 1); } // Test suggestions #[test] fn correct_thrown_some_trash() { assert_suggestion_result( "I've thrown some trash", ThrowRubbish, "I've thrown some trash away", ); } #[test] fn correct_throws_garbage() { assert_suggestion_result( "That guy just throws his garbage", ThrowRubbish, "That guy just throws out his garbage", ); } // Test edge cases #[test] fn ignore_throw_ball() { assert_lint_count("Can you throw the ball?", ThrowRubbish, 0); } // Sentences from GitHub #[test] fn correct_come_close_to_throw_trash() { assert_suggestion_result( "Smart Dustbin is a trash bin that automatically opens when you come close to throw trash.", ThrowRubbish, "Smart Dustbin is a trash bin that automatically opens when you come close to throw away trash.", ); } #[test] fn correct_thrown_rubbish() { assert_suggestion_result( "Add a script that draws the bin behind thrown rubbish.", ThrowRubbish, "Add a script that draws the bin behind thrown away rubbish.", ); } #[test] #[ignore = "`on` doesn't go with `throw` but with `daily basis`"] fn correct_encourage_people_to_throw_trash() { assert_suggestion_result( "The app main goal is to encourage people to throw trash they can found on a daily basis.", ThrowRubbish, "The app main goal is to encourage people to throw away trash they can found on a daily basis.", ); } #[test] fn correct_a_person_throwing_trash() { assert_suggestion_result( "I think personally the icons look okay, aside from the clear prompt one, as it's currently accented on a person throwing trash.", ThrowRubbish, "I think personally the icons look okay, aside from the clear prompt one, as it's currently accented on a person throwing away trash.", ); } #[test] fn allow_at_and_back() { assert_lint_count( "Throw garbage at a program, it will throw garbage back.", ThrowRubbish, 0, ); } #[test] fn correct_responsibly_throw_trash() { assert_suggestion_result( "Reward system for people responsibly throwing trash saving the environment.", ThrowRubbish, "Reward system for people responsibly throwing away trash saving the environment.", ); } // False positive when "rubbish" is a qualifier for another word #[test] fn dont_flag_throws_junk_errors() { assert_lint_count( "Experimental init throws junk errors, Ignore.", ThrowRubbish, 0, ); } #[test] fn dont_flag_throwing_garbage_data() { assert_lint_count( "I can resolve this in various ways, such as by not throwing garbage data at Typesense", ThrowRubbish, 0, ); } #[test] fn dont_flag_throwing_garbage_value() { assert_lint_count("Fix Spill tree Throwing garbage value", ThrowRubbish, 0); } #[test] fn correct_threw_trash_properly() { assert_suggestion_result( "we want to know which student threw trash properly so that we can reward that student", ThrowRubbish, "we want to know which student threw away trash properly so that we can reward that student", ); } #[test] fn dont_flag_throw_junk_bytes() { assert_lint_count( "the most efficient way to enforce the buffer size and throw junk bytes is to have a local (to the reception function) buffer", ThrowRubbish, 0, ); } #[test] fn dont_flag_throw_trash_everywhere() { assert_lint_count( "People throw trash everywhere and this tendency is very harmful.", ThrowRubbish, 0, ); } #[test] fn dont_flag_throws_garbage_comments() { assert_lint_count( "We dont need guys that throws garbage comments based on theyr lack of knowledge.", ThrowRubbish, 0, ); } #[test] fn dont_flag_trash_can_be_thrown_into_the_trash() { assert_lint_count( "Trash balls generated during cutting can be thrown into the trash", ThrowRubbish, 0, ); } #[test] fn correct_throwing_rubbish() { assert_suggestion_result( "Admiring paintings, throwing rubbish, greeting.", ThrowRubbish, "Admiring paintings, throwing away rubbish, greeting.", ); } } ================================================ FILE: harper-core/src/linting/to_adverb.rs ================================================ use harper_brill::UPOS; use crate::expr::{Expr, OwnedExprExt, SequenceExpr}; use crate::patterns::{UPOSSet, WordSet}; use crate::{Span, Token}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; const AMBIGUOUS_ADVERBS: &[&str] = &["just", "not"]; pub struct ToAdverb { expr: SequenceExpr, } impl Default for ToAdverb { fn default() -> Self { let expr = SequenceExpr::default() .t_aco("to") .t_ws() .then(UPOSSet::new(&[UPOS::ADV]).or(WordSet::new(AMBIGUOUS_ADVERBS))) .t_ws() .t_aco("to") .t_ws() .then_verb(); Self { expr } } } impl ExprLinter for ToAdverb { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let first_to = tokens.first()?; let second_to_idx = 4; let second_to = tokens.get(second_to_idx)?; let adverb_idx = 2; let adverb = tokens.get(adverb_idx)?; let span = Span::new(first_to.span.start, second_to.span.end); let keep_first_variant = source[first_to.span.start..adverb.span.end].to_vec(); let drop_first_variant = source[adverb.span.start..second_to.span.end].to_vec(); if keep_first_variant.is_empty() || drop_first_variant.is_empty() { return None; } Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![ Suggestion::ReplaceWith(keep_first_variant), Suggestion::ReplaceWith(drop_first_variant), ], message: "Remove the repeated `to` in this infinitive.".to_owned(), priority: 40, }) } fn description(&self) -> &'static str { "Flags duplicated `to` around certain adverbs (e.g. `to never to`) and offers fixes that keep only one `to`." } } #[cfg(test)] mod tests { use super::ToAdverb; use crate::linting::tests::{ assert_lint_count, assert_suggestion_count, assert_suggestion_result, }; #[test] fn corrects_to_never_to() { assert_suggestion_result( "Tom has decided to never to do that again.", ToAdverb::default(), "Tom has decided to never do that again.", ); } #[test] fn alternative_moves_adverb() { assert_suggestion_result( "Tom has decided to never to do that again.", ToAdverb::default(), "Tom has decided never to do that again.", ); } #[test] fn corrects_to_maybe_to() { assert_suggestion_result( "The next step is to maybe to take a language class.", ToAdverb::default(), "The next step is to maybe take a language class.", ); } #[test] fn corrects_to_not_to() { assert_suggestion_result( "He tells the monitor to not to collect anything.", ToAdverb::default(), "He tells the monitor to not collect anything.", ); } #[test] fn corrects_to_just_to() { assert_suggestion_result( "She told me to just to keep the peace.", ToAdverb::default(), "She told me to just keep the peace.", ); } #[test] fn corrects_to_really_to() { assert_suggestion_result( "They plan to really to push the release.", ToAdverb::default(), "They plan to really push the release.", ); } #[test] fn offers_two_suggestions() { assert_suggestion_count( "He agreed to probably to lead the effort.", ToAdverb::default(), 2, ); } #[test] fn allows_single_to_with_adverb() { assert_lint_count("He wants to always win the match.", ToAdverb::default(), 0); } #[test] fn corrects_to_quickly_to() { assert_suggestion_result( "They hoped to quickly to solve it.", ToAdverb::default(), "They hoped to quickly solve it.", ); } #[test] fn ignores_missing_verb_after_second_to() { assert_lint_count("We tried to eventually to.", ToAdverb::default(), 0); } #[test] fn handles_capitalized_to() { assert_suggestion_result( "To Always to succeed is the goal.", ToAdverb::default(), "To Always succeed is the goal.", ); } } ================================================ FILE: harper-core/src/linting/to_two_too/mod.rs ================================================ mod to_too_adjective_end; mod to_too_adjective_punct; mod to_too_adjverb_ed_punct; mod to_too_adverb; mod to_too_chunk_start_comma; mod to_too_degree_words; mod to_too_eos; mod to_too_pronoun_end; mod too_to; use super::merge_linters::merge_linters; use super::{ExprLinter, Lint, LintKind, Suggestion}; use to_too_adjective_end::ToTooAdjectiveEnd; use to_too_adjective_punct::ToTooAdjectivePunct; use to_too_adjverb_ed_punct::ToTooAdjVerbEdPunct; use to_too_adverb::ToTooAdverb; use to_too_chunk_start_comma::ToTooChunkStartComma; use to_too_degree_words::ToTooDegreeWords; use to_too_eos::ToTooEos; use to_too_pronoun_end::ToTooPronounEnd; use too_to::TooTo; merge_linters!( ToTwoToo => ToTooAdjectiveEnd, ToTooAdjectivePunct, ToTooAdverb, ToTooAdjVerbEdPunct, ToTooChunkStartComma, ToTooDegreeWords, ToTooPronounEnd, ToTooEos, TooTo => "Corrects homophone confusion between `to` and `too`." ); #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; use super::ToTwoToo; #[test] fn fixes_to_ambitious() { assert_suggestion_result( "The project scope is to ambitious", ToTwoToo::default(), "The project scope is too ambitious", ); } #[test] fn fixes_end_of_sent() { assert_suggestion_result( "She wants ice cream, to.", ToTwoToo::default(), "She wants ice cream, too.", ); } #[test] fn flags_to_hungry() { assert_lint_count("I am to hungry.", ToTwoToo::default(), 1); } #[test] fn no_lint_on_proper_too() { assert_no_lints("I am too hungry.", ToTwoToo::default()); } #[test] fn flags_to_with_irregular_whitespace() { assert_lint_count("She was to\t tired.", ToTwoToo::default(), 1); assert_lint_count("He felt it was\nto cold.", ToTwoToo::default(), 1); } #[test] fn flags_to_with_trailing_punct() { assert_lint_count("He spoke to loud!", ToTwoToo::default(), 1); assert_lint_count("He spoke to loud?", ToTwoToo::default(), 1); assert_lint_count("He spoke to loud.", ToTwoToo::default(), 1); } #[test] fn no_lint_to_eat() { assert_no_lints( "Please remember to eat your vegetables.", ToTwoToo::default(), ); } #[test] fn no_lint_to_nashville_or_you() { assert_no_lints("I’m going to Nashville next week.", ToTwoToo::default()); assert_no_lints("Talk to you later.", ToTwoToo::default()); } #[test] fn no_lint_distance_from_center() { assert_no_lints("Distance from the center to any face", ToTwoToo::default()); } #[test] fn fixes_too_go() { assert_suggestion_result( "I want too go abroad.", ToTwoToo::default(), "I want to go abroad.", ); } #[test] fn fixes_too_him() { assert_suggestion_result( "Give it too him as a gift", ToTwoToo::default(), "Give it to him as a gift", ); } #[test] fn fixes_too_the() { assert_suggestion_result( "We're going too the conference.", ToTwoToo::default(), "We're going to the conference.", ); } #[test] fn fixes_too_a() { assert_suggestion_result( "We're going too a concert.", ToTwoToo::default(), "We're going to a concert.", ); } #[test] fn fixes_to_hard() { assert_suggestion_result( "It's not to hard, is it?", ToTwoToo::default(), "It's not too hard, is it?", ); } #[test] fn no_lint_too_hot() { assert_no_lints("The coffee is too hot to drink.", ToTwoToo::default()); } #[test] fn no_lint_too_loud() { assert_no_lints( "The music was too loud, making it hard to hear.", ToTwoToo::default(), ); } #[test] fn no_lint_too_shy() { assert_no_lints("He's too shy to speak in public.", ToTwoToo::default()); } #[test] fn no_lint_too_sweet() { assert_no_lints("The cake is too sweet for my taste.", ToTwoToo::default()); } #[test] fn no_lint_too_expensive() { assert_no_lints( "It's too expensive for me to buy right now.", ToTwoToo::default(), ); } #[test] fn no_lint_too_hard() { assert_no_lints( "She worked too hard and ended up getting sick.", ToTwoToo::default(), ); } #[test] fn no_lint_too_complicated() { assert_no_lints( "The instructions were too complicated to understand.", ToTwoToo::default(), ); } #[test] fn no_lint_too_too() { assert_no_lints( "I like apples, and my brother does too.", ToTwoToo::default(), ); } #[test] fn no_lint_too_too_2() { assert_no_lints( "She's coming to the party, and he is too.", ToTwoToo::default(), ); } #[test] fn no_lint_too_too_3() { assert_no_lints( "I want to go to the beach, and you do too?", ToTwoToo::default(), ); } #[test] fn no_lint_too_too_4() { assert_no_lints( "He's a talented musician, and a great friend too.", ToTwoToo::default(), ); } #[test] fn no_lint_too_too_5() { assert_no_lints( "The movie was good, and the popcorn was delicious too.", ToTwoToo::default(), ); } #[test] fn no_lint_too_difficult_too_close() { assert_no_lints( "The problem is too difficult, and the deadline is too close.", ToTwoToo::default(), ); } #[test] fn no_lint_too_good_too_nice() { assert_no_lints( "He's too good at the game, and he's too nice to win.", ToTwoToo::default(), ); } #[test] fn allow_young_musicians() { assert_no_lints( "Bringing Hope and Opportunity to Young Musicians", ToTwoToo::default(), ); } #[test] fn allow_semicolon() { assert_no_lints("Attendees can look forward to:", ToTwoToo::default()); } #[test] fn allow_build_brighter() { assert_no_lints( "We're empowering them to build brighter futures.", ToTwoToo::default(), ); } #[test] fn allow_delegate() { assert_no_lints( "I’d like you to consciously delegate one task", ToTwoToo::default(), ); } #[test] fn no_lint_soundscapes() { assert_no_lints( "Soundscapes are not merely environmental features; they are integral to human identity and cultural expression.", ToTwoToo::default(), ); } #[test] fn no_lint_speed_flexibility() { assert_no_lints( "Its speed, flexibility, and seamless integration with FZF make it a compelling alternative to traditional fuzzy finding solutions.", ToTwoToo::default(), ); } #[test] fn no_lint_explicitly_cast() { assert_no_lints( "Attempted to explicitly cast the result back to a string", ToTwoToo::default(), ); } #[test] fn no_lint_buried_under_data() { assert_no_lints( "They felt buried under the data, unable to proactively address emerging threats.", ToTwoToo::default(), ); } #[test] fn no_lint_familiarize() { assert_no_lints( "Familiarize yourself with these resources to learn how to effectively utilize the plugin’s features.", ToTwoToo::default(), ); } #[test] fn no_lint_great_deal_of_energy() { assert_no_lints( "It takes a great deal of energy to consistently operate under that kind of pressure.", ToTwoToo::default(), ); } #[test] fn no_lint_occasionally_troubleshoot() { assert_no_lints( "Just be prepared to occasionally troubleshoot the debugger itself.", ToTwoToo::default(), ); } #[test] fn ccoveille_suggestion() { assert_no_lints("He goes too far with bets.", ToTwoToo::default()); } #[test] fn no_lint_auto_detect_debuggers() { assert_no_lints( "Daprio attempts to auto-detect debugger servers and configurations, which can save significant time, especially for common languages.", ToTwoToo::default(), ); } #[test] fn no_lint_commitment_open_source() { assert_no_lints( "I believe a commitment to open-source solutions and internal skill development would ultimately yield a more sustainable and ethical approach.", ToTwoToo::default(), ); } #[test] fn no_lint_feeling_confident_dominate() { assert_no_lints( "I'm feeling confident, and I suspect you all should be too – because I’m about to dominate.", ToTwoToo::default(), ); } #[test] fn no_lint_egyptian_smiling_faces_commentary() { assert_no_lints( "Today I learned that the ubiquitous, seemingly cheerful faces carved into ancient Egyptian relief sculptures – often referred to as “smiling faces” – weren’t simply a stylistic choice reflecting happiness. Recent scholarship suggests they functioned as a subtle, often satirical, form of social commentary, particularly targeting individuals who were arrogant, boastful, or otherwise deserving of ridicule.", ToTwoToo::default(), ); } #[test] fn no_lint_intended_to_leave_it_to() { assert_no_lints( "Beatrice never explicitly said who she intended to leave it to.", ToTwoToo::default(), ); } #[test] fn no_lint_time_for_good_girl_to_bed() { assert_no_lints("Time for this good girl to go to bed.", ToTwoToo::default()); } #[test] fn no_lint_connected_to_many_other_fields() { assert_no_lints( "The study is connected to many other fields.", ToTwoToo::default(), ); } #[test] fn no_lint_till_she_too_began_dreaming() { assert_no_lints( "till she too began dreaming after a fashion", ToTwoToo::default(), ); } #[test] fn no_lint_to_quickly_find_a_factory() { assert_no_lints( "To quickly find a factory, look for a map.", ToTwoToo::default(), ); } #[test] fn no_lint_asking_to_simply_in_scare_quotes() { assert_no_lints( "He was asking to simply \"show up\" for the meeting.", ToTwoToo::default(), ); } #[test] fn no_lint_llm_as_judge_to_automatically_score() { assert_no_lints( "We used an LLM-as-judge to automatically score agent trajectories.", ToTwoToo::default(), ); } #[test] fn no_lint_all_the_way_to_advanced_usage() { assert_no_lints( "All the way to advanced usage, like an expert.", ToTwoToo::default(), ); } #[test] fn no_lint_access_to_over_400_integrations() { assert_no_lints( "You'll have access to over 400 integrations.", ToTwoToo::default(), ); } #[test] fn no_lint_accustomed_to_precision() { assert_no_lints("I’m rather accustomed to precision.", ToTwoToo::default()); } #[test] fn no_lint_prone_to_melancholy() { assert_no_lints("He wasn’t a man prone to melancholy.", ToTwoToo::default()); } #[test] fn no_lint_superlative_range() { assert_no_lints("Sort speeds from slowest to fastest.", ToTwoToo::default()); } #[test] fn no_lint_comparative_range() { assert_no_lints("We rank tasks from harder to easier.", ToTwoToo::default()); } #[test] fn still_lints_positive_adjective_end() { assert_lint_count("The room felt to cold.", ToTwoToo::default(), 1); } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_adjective_end.rs ================================================ use crate::{ Token, TokenKind, char_string::CharStringExt, expr::{Expr, SequenceExpr}, patterns::{SingleTokenPattern, WhitespacePattern, prepositional_preceder}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ToTooAdjectiveEnd { expr: Box, } impl Default for ToTooAdjectiveEnd { fn default() -> Self { let expr = SequenceExpr::optional(SequenceExpr::any_word().t_ws()) .t_aco("to") .t_ws() .then_kind_is_but_is_not_except( TokenKind::is_adjective, TokenKind::is_verb, &["standard"], ) .then_optional(WhitespacePattern) .then_optional(SequenceExpr::any_word()) .then_optional(WhitespacePattern) .then_optional(SequenceExpr::default().then_punctuation()); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooAdjectiveEnd { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { // Find the `to` token let to_index = tokens.iter().position(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; // First non-whitespace after `to` should be the adjective let mut idx = to_index + 1; while idx < tokens.len() && tokens[idx].kind.is_whitespace() { idx += 1; } if idx >= tokens.len() || !tokens[idx].kind.is_adjective() || !tokens[idx].kind.is_positive_adjective() { return None; } let prev_non_ws = tokens[..to_index].iter().rfind(|t| !t.kind.is_whitespace()); if tokens[idx].kind.is_preposition() { return None; } if let Some(prev_token) = prev_non_ws && prepositional_preceder().matches_token(prev_token, source) { return None; } // Find the next non-whitespace after the adjective let mut j = idx + 1; while j < tokens.len() && tokens[j].kind.is_whitespace() { j += 1; } let should_lint = if j >= tokens.len() { true } else if tokens[j].kind.is_punctuation() { let punct: String = tokens[j].span.get_content(source).iter().collect(); !matches!( punct.as_str(), "`" | "\"" | "'" | "“" | "”" | "‘" | "’" | "-" | "–" | "—" ) } else { false }; if !should_lint { return None; } let to_tok = &tokens[to_index]; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` before an adjective when no word follows (end or punct)." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_adjective_punct.rs ================================================ use crate::{ Token, TokenKind, char_string::CharStringExt, expr::{Expr, SequenceExpr}, patterns::{SingleTokenPattern, WhitespacePattern, prepositional_preceder}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ToTooAdjectivePunct { expr: Box, } impl Default for ToTooAdjectivePunct { fn default() -> Self { let expr = SequenceExpr::optional(SequenceExpr::any_word().t_ws()) .t_aco("to") .t_ws() .then_kind_is_but_is_not_except( TokenKind::is_adjective, TokenKind::is_verb, &["standard"], ) .then_optional(WhitespacePattern) .then_sentence_terminator(); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooAdjectivePunct { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let to_index = tokens.iter().position(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; let mut idx = to_index + 1; while idx < tokens.len() && tokens[idx].kind.is_whitespace() { idx += 1; } if idx >= tokens.len() { return None; } let adjective = &tokens[idx]; if !adjective.kind.is_adjective() || !adjective.kind.is_positive_adjective() { return None; } if adjective.kind.is_preposition() { return None; } let prev_non_ws = tokens[..to_index].iter().rfind(|t| !t.kind.is_whitespace()); if let Some(prev_token) = prev_non_ws && prepositional_preceder().matches_token(prev_token, source) { return None; } let to_tok = &tokens[to_index]; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` before an adjective when followed by punctuation." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_adjverb_ed_punct.rs ================================================ use crate::char_string::CharStringExt; use crate::{ Token, expr::{Expr, SequenceExpr}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ToTooAdjVerbEdPunct { expr: Box, } impl Default for ToTooAdjVerbEdPunct { fn default() -> Self { let expr = SequenceExpr::default() .t_aco("to") .t_ws() .then(|tok: &crate::Token, src: &[char]| { tok.kind.is_adjective() && tok.kind.is_verb() && !tok.kind.is_noun() && tok .span .get_content(src) .ends_with_ignore_ascii_case_chars(&['e', 'd']) }) .then_sentence_terminator(); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooAdjVerbEdPunct { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let to_tok = tokens.iter().find(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` before words that are adj/verb ending with `ed`, followed by punctuation." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_adverb.rs ================================================ use crate::patterns::WhitespacePattern; use crate::{ Token, TokenKind, char_string::CharStringExt, expr::{AnchorEnd, Expr, SequenceExpr}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Sentence; pub struct ToTooAdverb { expr: Box, } impl Default for ToTooAdverb { fn default() -> Self { let expr = SequenceExpr::default() .t_aco("to") .t_ws() .then_kind_is_but_is_not_except(TokenKind::is_adverb, TokenKind::is_determiner, &["as"]) .then_optional(WhitespacePattern) .then_any_of(vec![ Box::new(SequenceExpr::default().then_kind_is_but_is_not_except( TokenKind::is_punctuation, |_| false, &["`", "\"", "'", "“", "”", "‘", "’", "-", "–", "—"], )), Box::new(AnchorEnd), ]); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooAdverb { type Unit = Sentence; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let to_tok = tokens.iter().find(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` before an adverb when it should be `too`." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_chunk_start_comma.rs ================================================ use crate::{ Token, char_string::CharStringExt, expr::{AnchorStart, Expr, SequenceExpr}, patterns::WhitespacePattern, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ToTooChunkStartComma { expr: Box, } impl Default for ToTooChunkStartComma { fn default() -> Self { let expr = SequenceExpr::with(AnchorStart) .t_aco("to") .then_optional(WhitespacePattern) .then_comma(); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooChunkStartComma { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let to_tok = tokens.iter().find(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` at the start of a clause before a comma." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_degree_words.rs ================================================ use crate::{ Token, TokenKind, char_string::CharStringExt, expr::{AnchorEnd, Expr, SequenceExpr}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ToTooDegreeWords { expr: Box, } impl Default for ToTooDegreeWords { fn default() -> Self { // Only flag `to` before degree words when the phrase ends the clause // (punctuation or end). Avoids false positives like "connected to many X". let expr = SequenceExpr::default() .t_aco("to") .t_ws() .then_word_set(&["many", "much", "few"]) .then_any_of(vec![ Box::new(SequenceExpr::default().then_kind_is_but_is_not_except( TokenKind::is_punctuation, |_| false, &["`", "\"", "'", "“", "”", "‘", "’", "-", "–", "—"], )), Box::new(AnchorEnd), ]); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooDegreeWords { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let to_tok = tokens.iter().find(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` used before degree words like `many`, `much`, or `few`." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_eos.rs ================================================ use crate::{ Document, expr::{ExprExt, SequenceExpr}, linting::Linter, }; use super::{Lint, LintKind, Suggestion}; pub struct ToTooEos { expr: SequenceExpr, } impl ToTooEos { pub fn new() -> Self { Self { expr: SequenceExpr::default() .then_comma() .t_ws() .t_aco("to") .then_sentence_terminator(), } } } impl Default for ToTooEos { fn default() -> Self { Self::new() } } impl Linter for ToTooEos { fn lint(&mut self, document: &Document) -> Vec { let matches = self.expr.iter_matches_in_doc(document); matches .map(|m| { let tok = &m.get_content(document.get_tokens())[2]; Lint { span: tok.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "too", tok.span.get_content(document.get_source()), )], message: "Use `too` when expressing similarity.".to_owned(), priority: 63, } }) .collect() } fn description(&self) -> &str { "Identifies incorrect usage of the term `to` at the end of a sentence." } } ================================================ FILE: harper-core/src/linting/to_two_too/to_too_pronoun_end.rs ================================================ use crate::{ Token, TokenKind, char_string::CharStringExt, expr::{AnchorEnd, AnchorStart, Expr, SequenceExpr}, patterns::WhitespacePattern, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct ToTooPronounEnd { expr: Box, } impl Default for ToTooPronounEnd { fn default() -> Self { // Match at clause start or after punctuation to avoid cases like // "leave it to." where `it` is an object pronoun. let expr = SequenceExpr::any_of(vec![ Box::new(SequenceExpr::with(AnchorStart)), Box::new( SequenceExpr::default() .then_kind_is_but_is_not_except( TokenKind::is_punctuation, |_| false, &["`", "\"", "'", "“", "”", "‘", "’"], ) .then_optional(WhitespacePattern), ), ]) .then_pronoun() .t_ws() .t_aco("to") .then_any_of(vec![ Box::new(SequenceExpr::default().then_kind_is_but_is_not_except( TokenKind::is_punctuation, |_| false, &["`", "\"", "'", "“", "”", "‘", "’"], )), Box::new(AnchorEnd), ]); Self { expr: Box::new(expr), } } } impl ExprLinter for ToTooPronounEnd { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, tokens: &[Token], source: &[char]) -> Option { let to_tok = tokens.iter().find(|t| { t.span .get_content(source) .eq_ignore_ascii_case_chars(&['t', 'o']) })?; Some(Lint { span: to_tok.span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case_str( "too", to_tok.span.get_content(source), )], message: "Use `too` here to mean ‘also’ or an excessive degree.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Detects `to` after a pronoun at clause end (e.g., `Me to!`)." } } ================================================ FILE: harper-core/src/linting/to_two_too/too_to.rs ================================================ use harper_brill::UPOS; use crate::Token; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::patterns::UPOSSet; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct TooTo { expr: Box, } impl Default for TooTo { fn default() -> Self { let expr = SequenceExpr::aco("too").t_ws().then(UPOSSet::new(&[ UPOS::NOUN, UPOS::PRON, UPOS::PROPN, UPOS::VERB, UPOS::DET, ])); Self { expr: Box::new(expr), } } } impl ExprLinter for TooTo { type Unit = Chunk; fn expr(&self) -> &dyn Expr { self.expr.as_ref() } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let too_token = &matched_tokens[0]; let span = too_token.span; let text = span.get_content(source); if let Some(next_tok) = matched_tokens.get(2) && next_tok.kind.is_upos(UPOS::VERB) && !next_tok.kind.is_verb_lemma() { return None; } Some(Lint { span, lint_kind: LintKind::Typo, suggestions: vec![ Suggestion::replace_with_match_case("to".chars().collect(), text) ], message: "Use the infinitive marker `to` here instead of the adverb `too`, which indicates excess degree.".to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Handles the transition from `too` -> `to`." } } ================================================ FILE: harper-core/src/linting/touristic.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, LongestMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum SuggestionPreference { /// Explicitly allow this suggestion Allow, /// Explicitly deny this suggestion Deny, /// Not explicitly allowed or denied #[default] Neutral, } use SuggestionPreference::*; pub struct Touristic { expr: LongestMatchOf, } // "touristy" doesn't sound natural with these words const BLACKLIST: &[&str] = &[ "app", "apps", "data", "content", "establishment", "establishments", "info", "information", "interest", "platform", "platforms", "service", "services", ]; // "touristy" sounds natural with these words const WHITELIST: &[&str] = &[ "activity", "activities", "area", "areas", "destination", "destinations", "location", "locations", "place", "places", "route", "routes", "spot", "spots", ]; impl Default for Touristic { fn default() -> Self { let with_prev_and_next_word = SequenceExpr::any_word() .t_ws() .t_aco("touristic") .t_ws() .then_any_word(); let with_prev_word = SequenceExpr::any_word().t_ws().t_aco("touristic"); let with_next_word = SequenceExpr::default() .t_aco("touristic") .t_ws() .then_any_word(); let pattern = LongestMatchOf::new(vec![ Box::new(with_prev_and_next_word), Box::new(with_prev_word), Box::new(with_next_word), Box::new(SequenceExpr::default().t_aco("touristic")), ]); Self { expr: pattern } } } impl ExprLinter for Touristic { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let tok_span_content_string = toks.span()?.get_content_string(src); let tok_span_content_string = tok_span_content_string.to_lowercase(); let mut touristy_pref = Neutral; let mut noun_forms_pref = Neutral; let span_number = match ( toks.len(), tok_span_content_string.starts_with("touristic "), tok_span_content_string.ends_with(" touristic"), ) { (1, _, _) => { noun_forms_pref = Allow; touristy_pref = Allow; 0 } (3, true, false) => { let next_word = toks[2].span.get_content_string(src); let next_kind = &toks[2].kind; if next_kind.is_noun() { if WHITELIST.contains(&next_word.as_str()) { touristy_pref = Allow; } if BLACKLIST.contains(&next_word.as_str()) { touristy_pref = Deny; } } 0 } (3, false, true) => { let prev_kind = &toks[0].kind; noun_forms_pref = if prev_kind.is_adjective() || prev_kind.is_linking_verb() { Deny } else { Allow }; 2 } (5, _, _) => { let _prev_word = toks[0].span.get_content_string(src).to_lowercase(); let prev_kind = &toks[0].kind; let next_word = toks[4].span.get_content_string(src).to_lowercase(); let next_kind = &toks[4].kind; if prev_kind.is_adverb() { noun_forms_pref = Deny; } if next_kind.is_noun() { if WHITELIST.contains(&next_word.as_str()) { touristy_pref = Allow; } if BLACKLIST.contains(&next_word.as_str()) { touristy_pref = Deny; } } if next_kind.is_adjective() && !next_kind.is_noun() { noun_forms_pref = Deny; touristy_pref = Allow; } 2 } _ => return None, }; let mut suggested = Vec::new(); if noun_forms_pref != Deny { suggested.push("tourist"); suggested.push("tourism"); } if touristy_pref != Deny { suggested.push("touristy"); } let span = toks[span_number].span; Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: suggested .into_iter() .map(|s| Suggestion::replace_with_match_case_str(s, span.get_content(src))) .collect(), message: "The word `touristic` is rarely used by native speakers.".to_string(), priority: 31, }) } fn description(&self) -> &'static str { "Suggests replacing the uncommon word `touristic` with `tourist`, `tourism`, and/or `touristy`." } } #[cfg(test)] mod tests { use super::Touristic; use crate::linting::tests::assert_good_and_bad_suggestions; #[test] fn fixes_touristic_alone() { assert_good_and_bad_suggestions( "touristic", Touristic::default(), &["tourist", "tourism", "touristy"], &[], ); } #[test] fn fixes_very_t() { assert_good_and_bad_suggestions( "very touristic", Touristic::default(), &["very touristy"], &["very tourist", "very tourism"], ); } #[test] fn fixes_t_location_good_and_bad() { assert_good_and_bad_suggestions( "touristic location", Touristic::default(), &["tourist location", "tourism location", "touristy location"], &[], ); } #[test] fn fixes_is_t() { assert_good_and_bad_suggestions( "That place is touristic", Touristic::default(), &["That place is touristy"], &["That place is tourist", "That place is tourism"], ); } #[test] fn fixes_t_information() { assert_good_and_bad_suggestions( "The AI Touristic Information Tool for Liquid Galaxy is a Flutter-based Android tablet application that simplifies and enhances travel planning.", Touristic::default(), &[ "The AI Tourist Information Tool for Liquid Galaxy is a Flutter-based Android tablet application that simplifies and enhances travel planning.", "The AI Tourism Information Tool for Liquid Galaxy is a Flutter-based Android tablet application that simplifies and enhances travel planning.", ], &[ "The AI Touristy Information Tool for Liquid Galaxy is a Flutter-based Android tablet application that simplifies and enhances travel planning.", ], ); } #[test] fn fixes_t_data() { assert_good_and_bad_suggestions( "Official API to access Apidae touristic data.", Touristic::default(), &[ "Official API to access Apidae tourist data.", "Official API to access Apidae tourism data.", ], &["Official API to access Apidae touristy data."], ); } #[test] fn corrects_t_information_2() { assert_good_and_bad_suggestions( "Oppidums is open source app that provide cultural, historical and touristic information on different cities.", Touristic::default(), &[ "Oppidums is open source app that provide cultural, historical and tourist information on different cities.", "Oppidums is open source app that provide cultural, historical and tourism information on different cities.", ], &[ "Oppidums is open source app that provide cultural, historical and touristy information on different cities.", ], ); } #[test] fn corrects_very_t_spot() { assert_good_and_bad_suggestions( "The destination is a very touristic spot, many people visit this place at the weekend.", Touristic::default(), &[ "The destination is a very touristy spot, many people visit this place at the weekend.", ], &[ "The destination is a very tourist spot, many people visit this place at the weekend.", "The destination is a very tourism spot, many people visit this place at the weekend.", ], ); } #[test] #[ignore = "Checks previous word but results depend on the next word"] fn fixes_t_platform() { assert_good_and_bad_suggestions( "Incuti is touristic platform for African destinations.", Touristic::default(), &[ "Incuti is tourist platform for African destinations.", "Incuti is tourism platform for African destinations.", ], &["Incuti is touristy platform for African destinations."], ); } #[test] fn fixes_t_service_providers() { assert_good_and_bad_suggestions( "Onlim API is a tool that touristic service providers utilize to generate social media posts by injecting data about their offers into some templates.", Touristic::default(), &[ "Onlim API is a tool that tourist service providers utilize to generate social media posts by injecting data about their offers into some templates.", "Onlim API is a tool that tourism service providers utilize to generate social media posts by injecting data about their offers into some templates.", ], &[ "Onlim API is a tool that touristy service providers utilize to generate social media posts by injecting data about their offers into some templates.", ], ); } #[test] fn fixes_are_t_areas() { assert_good_and_bad_suggestions( "We can determine that most of the busier areas are touristic areas, which in return helps with the high demand for the shared bikes.", Touristic::default(), &[ "We can determine that most of the busier areas are tourist areas, which in return helps with the high demand for the shared bikes.", "We can determine that most of the busier areas are tourism areas, which in return helps with the high demand for the shared bikes.", "We can determine that most of the busier areas are touristy areas, which in return helps with the high demand for the shared bikes.", ], &[], ); } #[test] fn fixes_very_t_area() { assert_good_and_bad_suggestions( "This is Manhattan, a very popular, very touristic area of New York.", Touristic::default(), &["This is Manhattan, a very popular, very touristy area of New York."], &[ "This is Manhattan, a very popular, very tourist area of New York.", "This is Manhattan, a very popular, very tourism area of New York.", ], ); } #[test] fn fixes_for_t_photographic() { assert_good_and_bad_suggestions( "Python implementation of my clustering-based recommendation system for touristic photographic spots.", Touristic::default(), &[ "Python implementation of my clustering-based recommendation system for touristy photographic spots.", ], &[ "Python implementation of my clustering-based recommendation system for tourist photographic spots.", "Python implementation of my clustering-based recommendation system for tourism photographic spots.", ], ); } #[test] fn fixes_czech_t_routes() { assert_good_and_bad_suggestions( "Management and Control Application for Czech Touristic Routes in OSM.", Touristic::default(), &[ "Management and Control Application for Czech Tourist Routes in OSM.", "Management and Control Application for Czech Tourism Routes in OSM.", "Management and Control Application for Czech Touristy Routes in OSM.", ], &[], ); } #[test] fn fixes_promote_t_activities() { assert_good_and_bad_suggestions( "Application to promote touristic activities in Valencia.", Touristic::default(), &[ "Application to promote tourist activities in Valencia.", "Application to promote tourism activities in Valencia.", "Application to promote touristy activities in Valencia.", ], &[], ); } #[test] fn fixes_a_t_flutter() { assert_good_and_bad_suggestions( "A Touristic Flutter App.", Touristic::default(), &["A Tourist Flutter App.", "A Tourism Flutter App."], &[ // "app" would be fine in the blacklist, but "Flutter" would be going too far // "A Touristy Flutter App.", ], ); } #[test] fn fixes_of_t_interest() { assert_good_and_bad_suggestions( "ARCHEO: a python lib for sound event detection in areas of touristic Interest.", Touristic::default(), &[ "ARCHEO: a python lib for sound event detection in areas of tourist Interest.", "ARCHEO: a python lib for sound event detection in areas of tourism Interest.", ], &["ARCHEO: a python lib for sound event detection in areas of touristy Interest."], ); } #[test] fn fixes_t_establishments() { assert_good_and_bad_suggestions( "Touristic establishments by EUROSTAT NUTS regions.", Touristic::default(), &[ "Tourist establishments by EUROSTAT NUTS regions.", "Tourism establishments by EUROSTAT NUTS regions.", ], &["Touristy establishments by EUROSTAT NUTS regions."], ); } } ================================================ FILE: harper-core/src/linting/transposed_space.rs ================================================ use crate::{ Lint, Token, TokenStringExt, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, }; pub struct TransposedSpace { expr: FirstMatchOf, dict: D, } impl TransposedSpace { pub fn new(dict: D) -> Self { Self { expr: FirstMatchOf::new(vec![Box::new( SequenceExpr::default().then_oov().t_ws().then_oov(), )]), dict, } } pub fn sensitive(dict: D) -> Self { Self { expr: FirstMatchOf::new(vec![ Box::new(SequenceExpr::default().then_oov().t_ws().then_any_word()), Box::new(SequenceExpr::any_word().t_ws().then_oov()), Box::new(SequenceExpr::default().then_oov().t_ws().then_oov()), ]), dict, } } } fn keep_unique(values: &mut Vec, word1: &[char], word2: &[char]) { let value = format!( "{} {}", word1.iter().collect::(), word2.iter().collect::() ); if !values.contains(&value) { values.push(value); } } impl ExprLinter for TransposedSpace { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let toks_span = toks.span()?; // "thec" "at" / "th ecat" let word1 = toks.first()?.span.get_content(src); let word2 = toks.last()?.span.get_content(src); // "thec" -> "the c" let w1_start = &word1[..word1.len() - 1]; let w1_last = word1.iter().last()?; // "ecat" -> "e cat" let w2_first = word2.first()?; let w2_end = &word2[1..]; // "c" + "at" -> "cat" let mut w1_last_plus_w2 = word2.to_vec(); w1_last_plus_w2.insert(0, *w1_last); // "th" + "e" -> "the" let mut w1_plus_w2_first = word1.to_vec(); w1_plus_w2_first.push(*w2_first); let mut values = vec![]; // "thec" "at" -> "the cat" if self.dict.contains_word(w1_start) && self.dict.contains_word(&w1_last_plus_w2) { let maybe_canon_w2 = self.dict.get_correct_capitalization_of(&w1_last_plus_w2); if let Some(canon_w1) = self.dict.get_correct_capitalization_of(w1_start) { if let Some(canon_w2) = maybe_canon_w2 { keep_unique(&mut values, canon_w1, canon_w2); } else { keep_unique(&mut values, canon_w1, &w1_last_plus_w2); } } else if let Some(canon_w2) = maybe_canon_w2 { keep_unique(&mut values, w1_start, canon_w2); } keep_unique(&mut values, w1_start, &w1_last_plus_w2); } // "th" "ecat" -> "the cat" if self.dict.contains_word(&w1_plus_w2_first) && self.dict.contains_word(w2_end) { let maybe_canon_w2 = self.dict.get_correct_capitalization_of(w2_end); if let Some(canon_w1) = self.dict.get_correct_capitalization_of(&w1_plus_w2_first) { if let Some(canon_w2) = maybe_canon_w2 { keep_unique(&mut values, canon_w1, canon_w2); } else { keep_unique(&mut values, canon_w1, w2_end); } } else if let Some(canon_w2) = maybe_canon_w2 { keep_unique(&mut values, &w1_plus_w2_first, canon_w2); } keep_unique(&mut values, &w1_plus_w2_first, w2_end); } if values.is_empty() { return None; } let suggestions = values .iter() .map(|value| { Suggestion::replace_with_match_case( value.chars().collect(), toks_span.get_content(src), ) }) .collect(); Some(Lint { span: toks_span, lint_kind: LintKind::Typo, suggestions, message: format!( "Is the space between `{}` and `{}` one character out of place?", word1.iter().collect::(), word2.iter().collect::() ), ..Default::default() }) } fn description(&self) -> &str { "Looks for a space one character too early or too late between words." } } #[cfg(test)] mod tests { use super::TransposedSpace; use crate::{linting::tests::assert_suggestion_result, spell::FstDictionary}; #[test] fn space_too_early() { assert_suggestion_result( "Th ecat sat on the mat.", TransposedSpace::sensitive(FstDictionary::curated()), "The cat sat on the mat.", ); } #[test] fn space_too_late() { assert_suggestion_result( "Thec at sat on the mat.", TransposedSpace::sensitive(FstDictionary::curated()), "The cat sat on the mat.", ); } #[test] fn test_early() { assert_suggestion_result( "Sometimes the spac eis one character early.", TransposedSpace::new(FstDictionary::curated()), "Sometimes the space is one character early.", ); } #[test] fn test_late() { assert_suggestion_result( "Ands ometimes the space is a character late.", TransposedSpace::new(FstDictionary::curated()), "And sometimes the space is a character late.", ); } } ================================================ FILE: harper-core/src/linting/try_ones_hand_at.rs ================================================ use crate::{ Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; pub struct TryOnesHandAt { expr: SequenceExpr, } impl Default for TryOnesHandAt { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["try", "tried", "tries", "trying"]) .t_ws() .then_possessive_determiner() .t_ws() .t_aco("hands") .t_ws() .t_aco("at"), } } } impl ExprLinter for TryOnesHandAt { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let hands_idx = 4; let hands_tok = toks.get(hands_idx)?; let hands_span = hands_tok.span; let hands_chars = hands_span.get_content(src); Some(Lint { span: hands_span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case( vec!['h', 'a', 'n', 'd'], hands_chars, )], message: "This idiom uses the singular `hand`.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Corrects `try one's hands at` to `try one's hand at`." } } #[cfg(test)] mod tests { use super::TryOnesHandAt; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_tried_my() { assert_suggestion_result( "I tried my hands at a little test to see how different parameters I get for the same deck and the same material.", TryOnesHandAt::default(), "I tried my hand at a little test to see how different parameters I get for the same deck and the same material.", ) } #[test] fn fix_tried_their() { assert_suggestion_result( "If there isn't any obvious reason why no one has tried their hands at it yet, I might try implementing it.", TryOnesHandAt::default(), "If there isn't any obvious reason why no one has tried their hand at it yet, I might try implementing it.", ) } #[test] fn fix_tries_his() { assert_suggestion_result( "A fellow programmer from India who tries his hands at everything he can.", TryOnesHandAt::default(), "A fellow programmer from India who tries his hand at everything he can.", ) } #[test] fn fix_try_my() { assert_suggestion_result( "I am happy to try my hands at implementing one, but not being that proficient in C/C++ need some guidance on where to start.", TryOnesHandAt::default(), "I am happy to try my hand at implementing one, but not being that proficient in C/C++ need some guidance on where to start.", ) } #[test] fn fix_try_our() { assert_suggestion_result( "One way to make some of the requirements for this more concrete is to try our hands at implementing a language server.", TryOnesHandAt::default(), "One way to make some of the requirements for this more concrete is to try our hand at implementing a language server.", ) } #[test] fn fix_try_their() { assert_suggestion_result( "At the end the user will be able to create a list of decimal numbers to try their hands at the Diagonal Argument on their own.", TryOnesHandAt::default(), "At the end the user will be able to create a list of decimal numbers to try their hand at the Diagonal Argument on their own.", ) } #[test] fn fix_try_your() { assert_suggestion_result( "You'll likely need to try your hands at a bit of Lua to make it work.", TryOnesHandAt::default(), "You'll likely need to try your hand at a bit of Lua to make it work.", ) } #[test] fn fix_trying_my() { assert_suggestion_result( "I wouldn't mind trying my hands at a PR if the solution would be accepted.", TryOnesHandAt::default(), "I wouldn't mind trying my hand at a PR if the solution would be accepted.", ) } } ================================================ FILE: harper-core/src/linting/unclosed_quotes.rs ================================================ use super::{Lint, LintKind, Linter}; use crate::document::Document; use crate::{Punctuation, Quote, TokenKind}; #[derive(Debug, Clone, Copy, Default)] pub struct UnclosedQuotes; impl Linter for UnclosedQuotes { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); // TODO: Try zipping quote positions for token in document.tokens() { if let TokenKind::Punctuation(Punctuation::Quote(Quote { twin_loc: None })) = token.kind { lints.push(Lint { span: token.span, lint_kind: LintKind::Formatting, suggestions: vec![], message: "This quote has no termination.".to_string(), priority: 255, }) } } lints } fn description(&self) -> &'static str { "Quotation marks should always be closed. Unpaired quotation marks are a hallmark of sloppy work." } } ================================================ FILE: harper-core/src/linting/update_place_names.rs ================================================ use crate::expr::{Expr, FixedPhrase, LongestMatchOf}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, LintKind, Suggestion}; use crate::{Lint, Token, TokenStringExt}; type PlaceNameMappings<'a> = &'a [((i16, &'a str), &'a [&'a str])]; pub struct UpdatePlaceNames<'a> { expr: LongestMatchOf, place_name_mappings: PlaceNameMappings<'a>, } impl<'a> Default for UpdatePlaceNames<'a> { fn default() -> Self { let place_name_mappings: PlaceNameMappings<'a> = &[ // // Africa ((1984, "Burkina Faso"), &["Upper Volta"]), ((1985, "Côte d'Ivoire"), &["Ivory Coast"]), // TODO: Can we recommend Cote d'Ivoire as well? ((2018, "Eswatini"), &["Swaziland"]), // ((1995, "Janjanbureh"), &["Georgetown"]), // Too many places named Georgetown / George Town // Australia ((1993, "Kata Tjuta"), &["The Olgas"]), // TODO: Can we recommend the spelling with the underscore letter(s) as well? ((1993, "Uluru"), &["Ayers Rock"]), // TODO: Can we recommend the spelling with the underscore letter as well? // Central Asia ((1961, "Dushanbe"), &["Stalinabad"]), // East Asia ((1979, "Beijing"), &["Peking"]), ((0, "Guangzhou"), &["Canton"]), ((1945, "Taiwan"), &["Formosa"]), ((1991, "Ulaanbaatar"), &["Ulan Bator"]), // Europe (and nearby) ((1945, "Gdańsk"), &["Danzig"]), // TODO: Can we recommend Gdansk as well? ((1992, "Podgorica"), &["Titograd"]), ((1936, "Tbilisi"), &["Tiflis"]), ((2022, "Türkiye"), &["Turkey"]), // TODO: Can we recommend Turkiye as well? // India ((2006, "Bengaluru"), &["Bangalore"]), ((1996, "Chennai"), &["Madras"]), ((2007, "Kochi"), &["Cochin"]), ((2001, "Kolkata"), &["Calcutta"]), ((1995, "Mumbai"), &["Bombay"]), ((2014, "Mysuru"), &["Mysore"]), ((2006, "Puducherry"), &["Pondicherry"]), ((1978, "Pune"), &["Poona"]), ((1991, "Thiruvananthapuram"), &["Trivandrum"]), // Latin America ((2013, "CDMX"), &["DF"]), // Pacific Island nations ((1997, "Samoa"), &["Western Samoa"]), ((1980, "Vanuatu"), &["New Hebrides"]), // Russia ((1946, "Kaliningrad"), &["Königsberg"]), // TODO: can we handle Konigsberg and Koenigsberg? ((1991, "Saint Petersburg"), &["Leningrad", "Petrograd"]), // TODO: can we add St. Petersburg? ((1961, "Volgograd"), &["Stalingrad"]), // South Asia ((2000, "Busan"), &["Pusan"]), ((2018, "Chattogram"), &["Chittagong"]), ((1982, "Dhaka"), &["Dacca"]), ((1972, "Sri Lanka"), &["Ceylon"]), // Southeast Asia ((1989, "Cambodia"), &["Kampuchea"]), ((1976, "Ho Chi Minh City"), &["Saigon"]), ((2017, "Melaka"), &["Malacca"]), ((1989, "Myanmar"), &["Burma"]), ((1939, "Thailand"), &["Siam"]), ((2002, "Timor-Leste"), &["East Timor"]), ((1989, "Yangon"), &["Rangoon"]), // Ukraine ((1992, "Kharkiv"), &["Kharkov"]), ((1992, "Kyiv"), &["Kiev"]), ((1992, "Luhansk"), &["Lugansk"]), ((1992, "Lviv"), &["Lvov"]), ((1992, "Odesa"), &["Odessa"]), ((1992, "Vinnytsia"), &["Vinnitsa"]), ((1992, "Zaporizhzhia"), &["Zaporozhye"]), ]; let expr = LongestMatchOf::new( place_name_mappings .iter() .flat_map(|(_, old_names)| old_names.iter()) .map(|old_name| Box::new(FixedPhrase::from_phrase(old_name)) as Box) .collect(), ); Self::new(expr, place_name_mappings) } } impl<'a> UpdatePlaceNames<'a> { pub fn new(expr: LongestMatchOf, place_name_mappings: PlaceNameMappings<'a>) -> Self { Self { expr, place_name_mappings, } } } impl<'a> ExprLinter for UpdatePlaceNames<'a> { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let old_name = toks.span()?.get_content_string(src); let (year, new_name) = self.place_name_mappings .iter() .find_map(|((year, new_name), old_names)| { old_names .iter() .any(|n| n == &old_name) .then_some((year, *new_name)) })?; let suggestions = vec![Suggestion::ReplaceWith(new_name.chars().collect())]; let message = match year { 1.. => format!("This place has been officially known as '{new_name}' since {year}"), _ => format!("This place is now officially known as '{new_name}'"), }; Some(Lint { span: toks.span()?, lint_kind: LintKind::WordChoice, suggestions, message, priority: 31, }) } fn description(&self) -> &str { "This rule looks for deprecated place names and offers to update them." } } #[cfg(test)] mod tests { use crate::linting::{ tests::{assert_lint_count, assert_suggestion_result}, update_place_names::UpdatePlaceNames, }; #[test] fn update_single_word_name_alone() { assert_suggestion_result("Bombay", UpdatePlaceNames::default(), "Mumbai"); } #[test] fn update_single_word_name_after_space() { assert_suggestion_result(" Bombay", UpdatePlaceNames::default(), " Mumbai"); } #[test] fn update_single_word_name_after_punctuation() { assert_suggestion_result(";Bombay", UpdatePlaceNames::default(), ";Mumbai"); } #[test] fn update_two_word_name_to_single_word_alone() { assert_suggestion_result("Ayers Rock", UpdatePlaceNames::default(), "Uluru"); } #[test] fn update_two_word_name_to_single_word_after_space() { assert_suggestion_result(" Ayers Rock", UpdatePlaceNames::default(), " Uluru"); } #[test] fn update_two_word_name_to_single_word_after_punctuation() { assert_suggestion_result(";Ayers Rock", UpdatePlaceNames::default(), ";Uluru"); } #[test] fn update_single_word_name_to_multi_word_name_alone() { assert_suggestion_result("Saigon", UpdatePlaceNames::default(), "Ho Chi Minh City"); } #[test] fn update_two_word_name_to_two_word_name_alone() { assert_suggestion_result("The Olgas", UpdatePlaceNames::default(), "Kata Tjuta"); } #[test] fn dont_flag_multiword_name_with_non_space() { assert_lint_count("The, Olgas", UpdatePlaceNames::default(), 0); } #[test] fn dont_flag_multiword_name_with_hyphen() { assert_lint_count("The-Olgas", UpdatePlaceNames::default(), 0); } // TODO: when both old and new names contain whitespace we don't copy the whitespace #[test] #[ignore = "tabs not supported as whitespace?"] fn flag_multiword_name_with_tabs() { assert_lint_count("The\tOlgas", UpdatePlaceNames::default(), 1); } // TODO: when both old and new names contain whitespace we don't copy the whitespace #[test] #[ignore = "newlines not supported as whitespace?"] fn flag_multiword_name_with_newline() { assert_lint_count("The\nOlgas", UpdatePlaceNames::default(), 1); } #[test] fn update_two_word_name_to_single_word_at_end_of_sentence() { assert_suggestion_result( "It's dangerous to climb Ayers Rock.", UpdatePlaceNames::default(), "It's dangerous to climb Uluru.", ); } #[test] fn update_two_word_name_to_single_word_at_start_of_sentence() { assert_suggestion_result( "Ayers Rock is dangerous to climb.", UpdatePlaceNames::default(), "Uluru is dangerous to climb.", ); } #[test] fn update_first_old_name() { assert_suggestion_result("Leningrad", UpdatePlaceNames::default(), "Saint Petersburg"); } #[test] fn update_second_old_name() { assert_suggestion_result( "Have you ever been to Petrograd before?", UpdatePlaceNames::default(), "Have you ever been to Saint Petersburg before?", ); } #[test] fn update_two_word_name_with_two_word_name() { assert_suggestion_result( "Upper Volta is in Africa.", UpdatePlaceNames::default(), "Burkina Faso is in Africa.", ) } #[test] fn dont_flag_czech_republic() { assert_lint_count( "The Czech Republic is in Europe.", UpdatePlaceNames::default(), 0, ); } // NOTE: Can't handle place names with obligatory or compulsory "The" perfectly. #[test] fn update_to_name_with_punctuation() { assert_suggestion_result( "I've never been to Ivory Coast.", UpdatePlaceNames::default(), "I've never been to Côte d'Ivoire.", ) } } ================================================ FILE: harper-core/src/linting/use_title_case.rs ================================================ use crate::{Document, TokenStringExt, spell::Dictionary, title_case::try_make_title_case}; use super::{Lint, LintKind, Linter, Suggestion}; pub struct UseTitleCase { dict: D, } impl UseTitleCase { pub fn new(dict: D) -> Self { Self { dict } } } impl Linter for UseTitleCase { fn lint(&mut self, document: &Document) -> Vec { let mut lints = Vec::new(); for heading in document.iter_headings() { let Some(span) = heading.span() else { continue; }; if let Some(title_case) = try_make_title_case(heading, document.get_source(), &self.dict) { lints.push(Lint { span, lint_kind: LintKind::Capitalization, suggestions: vec![Suggestion::ReplaceWith(title_case)], message: "Try to use title case in headings.".to_owned(), priority: 127, }); } } lints } fn description(&self) -> &str { "Prompts you to use title case in relevant headings." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_markdown_suggestion_result, assert_no_lints}; use crate::spell::FstDictionary; use super::UseTitleCase; #[test] fn simple_correction() { assert_markdown_suggestion_result( "# This is a title", UseTitleCase::new(FstDictionary::curated()), "# This Is a Title", ); } #[test] fn double_correction() { assert_markdown_suggestion_result( "# This is a title\n\n## This is a subtitle", UseTitleCase::new(FstDictionary::curated()), "# This Is a Title\n\n## This Is a Subtitle", ); } #[test] fn doesnt_lowercase_this_in_github_template_title() { assert_no_lints( "# How Has This Been Tested?", UseTitleCase::new(FstDictionary::curated()), ); } #[test] fn shoud_uppercase_possessive_determiners() { assert_markdown_suggestion_result( "# my/our/your/his/her/its/their", UseTitleCase::new(FstDictionary::curated()), "# My/Our/Your/His/Her/Its/Their", ); } #[test] fn ignores_leading_number_list_marker_in_heading() { assert_no_lints( "### 1. To Do a Thing", UseTitleCase::new(FstDictionary::curated()), ); } #[test] fn still_fixes_non_first_small_words_after_leading_number() { assert_markdown_suggestion_result( "### 1. To do a thing", UseTitleCase::new(FstDictionary::curated()), "### 1. To Do a Thing", ); } } ================================================ FILE: harper-core/src/linting/verb_to_adjective.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::patterns::WordSet; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind}; use crate::linting::expr_linter::Chunk; pub struct VerbToAdjective { expr: SequenceExpr, } impl Default for VerbToAdjective { fn default() -> Self { let expr = SequenceExpr::word_set(&["the", "a", "an"]) .t_ws() .then_kind_where(|kind| kind.is_degree_adverb()) .t_ws() .then_kind_where(|kind| kind.is_noun() && kind.is_verb_progressive_form()) .t_ws() .then(WordSet::new(&["of"])); Self { expr } } } impl ExprLinter for VerbToAdjective { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let words: Vec<_> = matched_tokens .iter() .filter(|tok| tok.kind.is_word()) .collect(); let [_, adverb, noun, _] = words.as_slice() else { return None; }; Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::Typo, suggestions: vec![], message: format!( "`{}` is an adverb. Before the noun `{}`, this phrase more likely needs an adjective.", adverb.span.get_content_string(source), noun.span.get_content_string(source), ), priority: 31, }) } fn description(&self) -> &'static str { "Looks for article-led gerund noun phrases like `a fully accounting of`, where an adjective is more likely than an adverb." } } #[cfg(test)] mod tests { use crate::linting::tests::{assert_lint_count, assert_lint_message, assert_no_lints}; use super::VerbToAdjective; fn assert_each_lints(cases: &[&str]) { for case in cases { assert_lint_count(case, VerbToAdjective::default(), 1); } } fn assert_each_no_lints(cases: &[&str]) { for case in cases { assert_no_lints(case, VerbToAdjective::default()); } } #[test] fn flags_issue_2855_and_similar_gerund_noun_phrases() { assert_each_lints(&[ "By scheduling time to do a fully accounting of where your CPU cycles are going, you can preemptively save yourself (and your contributors) a lot of time.", "We need a fully understanding of the risk before launch.", "The mockup offered a fully rendering of the scene.", "An entirely recording of the hearing was never released.", "The appendix contained a completely listing of every exception.", "The report ended with a highly framing of the debate.", "A fully mapping of the cave is still useful to explorers.", "The board requested a truly accounting of the losses.", ]); } #[test] fn message_points_to_the_adverb_and_noun() { assert_lint_message( "We need a fully understanding of the risk before launch.", VerbToAdjective::default(), "`fully` is an adverb. Before the noun `understanding`, this phrase more likely needs an adjective.", ); } #[test] fn allows_the_issue_2855_regressions() { assert_each_no_lints(&[ "South Korea Set To Get a Fully Functioning Google Maps integration.", "This allows our clients to embrace a truly data-driven approach.", "Before he could press the transmit button, the sphere emitted a high-pitched whine.", "The target of coordinated, algorithmic pursuit kept moving.", "A fully functioning prototype shipped yesterday.", "A truly remarkable outcome followed.", "A completely different problem remains.", "A fully rendered image loaded instantly.", ]); } #[test] fn allows_correct_adjective_plus_gerund_noun_of_phrases() { assert_each_no_lints(&[ "We need a full understanding of the risk before launch.", "The audit delivered a full accounting of the losses.", "The appendix included a complete listing of the requirements.", "The demo provided a detailed rendering of the scene.", "They archived a proper recording of the interview.", "The memo offered a clear framing of the issue.", "The atlas provides a partial mapping of the cave.", "The exhibit included the recording of the speech.", ]); } #[test] fn allows_nonmatching_determiner_phrases_and_previous_regressions() { assert_each_no_lints(&[ "I really like my new car.", "I want you to write a new sentence for me.", "Ensure the correct term is used for individuals residing abroad.", "It is something that causes amazement.", "Can you suggest a correct auxiliary?", "This is the email address that will receive the submitted form data.", "Not the unexplored territories, ripe for discovery, but the areas actively erased, obscured, or simply deemed unworthy of representation?", "A local mapping service is sufficient here.", "The transmit queue drained normally.", "A mostly accurate summary is still useful.", ]); } } ================================================ FILE: harper-core/src/linting/very_unique.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct VeryUnique { expr: SequenceExpr, } impl Default for VeryUnique { fn default() -> Self { Self { expr: SequenceExpr::word_set(&[ "fairly", "pretty", "rather", "quite", "somewhat", "very", ]) .t_ws() .t_aco("unique"), } } } impl ExprLinter for VeryUnique { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let very_unique_span = toks.span()?; let very_unique_chars = very_unique_span.get_content(src); let qualifier_tok = &toks.first()?; let qualifier_str = qualifier_tok.span.get_content_string(src); let adjectives = ["special", "rare", "unusual"]; let suggestions = adjectives .iter() .map(|adj| { Suggestion::replace_with_match_case( format!("{qualifier_str} {adj}").chars().collect(), very_unique_chars, ) }) .chain(std::iter::once(Suggestion::replace_with_match_case( "unique".chars().collect(), very_unique_chars, ))) .collect::>(); Some(Lint { span: very_unique_span, lint_kind: LintKind::WordChoice, suggestions, message: "`Unique` is absolute, so consider using `unique` alone or a more precise adjective such as `special`, `rare`, or `unusual`.".to_string(), priority: 57, }) } fn description(&self) -> &str { "Flags phrases like `very unique`, `pretty unique`, etc., and suggests using `unique` alone or a more precise adjective such as `special`, `rare`, or `unusual`." } } #[cfg(test)] mod tests { use super::VeryUnique; use crate::linting::tests::{assert_good_and_bad_suggestions, assert_suggestion_result}; #[test] fn fix_very_unique() { assert_good_and_bad_suggestions( "I'm not sure whether Llama Stack or ollama are generating the chat completion ids, but they are not very unique.", VeryUnique::default(), &[ "I'm not sure whether Llama Stack or ollama are generating the chat completion ids, but they are not unique.", ], &[], ); } #[test] fn fix_pretty_unique() { assert_suggestion_result( "Numerous accounts with my exact full name/surname (which is pretty unique) has been created (most recently).", VeryUnique::default(), "Numerous accounts with my exact full name/surname (which is pretty rare) has been created (most recently).", ); } #[test] fn fix_fairly_unique() { assert_good_and_bad_suggestions( "In browsers, the first chars are obtained from the user agent string (which is fairly unique), and the supported mimeTypes", VeryUnique::default(), &[ "In browsers, the first chars are obtained from the user agent string (which is unique), and the supported mimeTypes", ], &[], ); } #[test] fn fix_somewhat_unique() { assert_suggestion_result( "A new pack of somewhat unique upgrades for R.E.P.O.!", VeryUnique::default(), "A new pack of somewhat unusual upgrades for R.E.P.O.!", ); } #[test] fn fix_quite_unique() { assert_good_and_bad_suggestions( "Now I understand that this is quite unique to insta and if it's not useful I am also going to investigate alternatives", VeryUnique::default(), &[ "Now I understand that this is unique to insta and if it's not useful I am also going to investigate alternatives", ], &[], ); } #[test] fn fix_rather_unique() { assert_suggestion_result( "I regret using the Vue compiler because the resulting AST is rather unique.", VeryUnique::default(), "I regret using the Vue compiler because the resulting AST is rather unusual.", ); } } ================================================ FILE: harper-core/src/linting/vice_versa.rs ================================================ use crate::expr::{Expr, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::linting::{ExprLinter, Lint, LintKind, Suggestion}; use crate::{Token, TokenStringExt}; fn matches_hyphen(token: &Token, _source: &[char]) -> bool { token.kind.is_hyphen() } fn replacement_for(template: &[char]) -> Vec { let mut replacement = "vice versa".chars().collect::>(); let mut has_upper = false; let mut has_lower = false; let mut first_alpha_upper = None; for ch in template.iter().copied() { if !ch.is_alphabetic() { continue; } has_upper |= ch.is_uppercase(); has_lower |= ch.is_lowercase(); if first_alpha_upper.is_none() { first_alpha_upper = Some(ch.is_uppercase()); } } if has_upper && !has_lower { for ch in replacement.iter_mut() { if ch.is_alphabetic() { *ch = ch.to_ascii_uppercase(); } } return replacement; } if !has_upper { return replacement; } if first_alpha_upper.unwrap_or(false) { let mut capitalized_first = false; for ch in replacement.iter_mut() { if !ch.is_alphabetic() { continue; } if !capitalized_first { *ch = ch.to_ascii_uppercase(); capitalized_first = true; } else { *ch = ch.to_ascii_lowercase(); } } return replacement; } for ch in replacement.iter_mut() { if ch.is_alphabetic() { *ch = ch.to_ascii_lowercase(); } } replacement } pub struct ViceVersa { expr: SequenceExpr, } impl Default for ViceVersa { fn default() -> Self { let expr = SequenceExpr::word_set(&["vice", "vise"]) .then(matches_hyphen) .then_optional(SequenceExpr::aco("a").then(matches_hyphen)) .t_aco("versa"); Self { expr } } } impl ExprLinter for ViceVersa { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let template = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Punctuation, suggestions: vec![Suggestion::ReplaceWith(replacement_for(template))], message: "The expression \"vice versa\" is spelled without hyphens.".to_owned(), priority: 60, }) } fn description(&self) -> &str { "Recommends writing ‘vice versa’ without hyphens." } } #[cfg(test)] mod tests { use super::ViceVersa; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_basic_hyphenated() { assert_suggestion_result( "We swapped the arguments vice-versa this time.", ViceVersa::default(), "We swapped the arguments vice versa this time.", ); } #[test] fn corrects_leading_capitalization() { assert_suggestion_result( "Vice-Versa, the movie, was interesting.", ViceVersa::default(), "Vice versa, the movie, was interesting.", ); } #[test] fn corrects_all_caps() { assert_suggestion_result( "They agreed VICE-VERSA on the clause.", ViceVersa::default(), "They agreed VICE VERSA on the clause.", ); } #[test] fn corrects_with_extra_a() { assert_suggestion_result( "The logic works vice-a-versa as well.", ViceVersa::default(), "The logic works vice versa as well.", ); } #[test] fn corrects_vise_variant() { assert_suggestion_result( "The rule applies vise-versa too.", ViceVersa::default(), "The rule applies vice versa too.", ); } #[test] fn corrects_vise_extra_a_variant() { assert_suggestion_result( "The rule applies Vise-A-Versa too.", ViceVersa::default(), "The rule applies Vice versa too.", ); } #[test] fn corrects_with_trailing_suffix() { assert_suggestion_result( "That was a vice-versa-like transformation.", ViceVersa::default(), "That was a vice versa-like transformation.", ); } #[test] fn allows_correct_spelling() { assert_lint_count( "We swapped the arguments vice versa this time.", ViceVersa::default(), 0, ); } #[test] fn allows_sentence_case() { assert_lint_count( "Vice versa, the movie, was interesting.", ViceVersa::default(), 0, ); } #[test] fn does_not_flag_unrelated_words() { assert_lint_count( "Their service-versa mapping was custom.", ViceVersa::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/vicious_loop/mod.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenStringExt, expr::{Expr, OwnedExprExt, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, }; #[derive(PartialEq)] enum Prefer { Circle, Cycle, DontCare, } pub struct ViciousCircle { expr: Box, } pub struct ViciousCycle { expr: Box, } pub struct ViciousCircleOrCycle { expr: Box, } // The Expr must have all three tokens because they should only be flagged when used together. // But we don't want to flag the legitimate combinations, and which those are depends on the user's preferences. fn build_expr(flag: Prefer) -> Box { let seq = SequenceExpr::word_set(&["vicious", "virtuous", "viscous"]) .t_ws() .then_word_set(&["circle", "circles", "cycle", "cycles"]); match flag { Prefer::Circle => Box::new( seq.and_not( SequenceExpr::default() .then_word_except(&["viscous"]) .t_ws() .then_word_set(&["circle", "circles"]), ), ), Prefer::Cycle => Box::new( seq.and_not( SequenceExpr::default() .then_word_except(&["viscous"]) .t_ws() .then_word_set(&["cycle", "cycles"]), ), ), Prefer::DontCare => { Box::new(seq.and_not(SequenceExpr::default().then_word_except(&["viscous"]))) } } } fn to_lint(toks: &[Token], src: &[char], pref: Prefer) -> Option { let tokspan = toks.span()?; let (adjtok, nountok) = (toks.first()?, toks.last()?); let badadj = adjtok .span .get_content(src) .eq_ignore_ascii_case_chars(&['v', 'i', 's', 'c', 'o', 'u', 's']); let badnoun = match pref { Prefer::Circle => nountok .span .get_content(src) .starts_with_ignore_ascii_case_str("cycle"), Prefer::Cycle => nountok .span .get_content(src) .starts_with_ignore_ascii_case_str("circle"), Prefer::DontCare => false, }; let is_plural = matches!(nountok.span.get_content(src).last(), Some('s' | 'S')); // The noun doesn't match the user's preferred word. if badnoun && !badadj { return Some(Lint { span: nountok.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( match (&pref, is_plural) { (Prefer::Circle, false) => "circle", (Prefer::Circle, true) => "circles", (Prefer::Cycle, false) => "cycle", (Prefer::Cycle, true) => "cycles", _ => unreachable!(), }, nountok.span.get_content(src), )], message: if pref == Prefer::Circle { "This idiom originally used `circle`, not `cycle`".to_string() } else { "Though this idiom originally used `circle`, `cycle` is preferred.".to_string() }, ..Default::default() }); } // The noun doesn't match the user's preference *and* the adjective also needs to be corrected from "viscous" to "vicious" if badnoun && badadj { let nouns = &["circle", "cycle"]; let i = match pref { Prefer::Circle => 0, Prefer::Cycle => 1, Prefer::DontCare => return None, // Unreachable, but we don't risk crashing the LSP. }; let message = format!( "The idiom uses the word `vicious`, not `viscous`, which describes thick liquids. And we prefer `{}` over `{}`.", nouns[i], nouns[1 - i], ); return Some(Lint { span: tokspan, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( match (&pref, is_plural) { (Prefer::Circle, false) => "vicious circle", (Prefer::Circle, true) => "vicious circles", (Prefer::Cycle, false) => "vicious cycle", (Prefer::Cycle, true) => "vicious cycles", _ => return None, // Unreachable, but we don't risk crashing the LSP. }, tokspan.get_content(src), )], message, ..Default::default() }); } // Nouns are fine, but we need to correct "viscous" to "vicious". if badadj { return Some(Lint { span: adjtok.span, lint_kind: LintKind::Usage, suggestions: vec![Suggestion::replace_with_match_case_str( "vicious", adjtok.span.get_content(src), )], message: "The idiom uses the word `vicious`, not `viscous`, which describes thick liquids." .to_string(), ..Default::default() }); } None } macro_rules! impl_expr_linter { ($name:ident, $pref:expr, $desc:expr) => { impl Default for $name { fn default() -> Self { Self { expr: build_expr($pref), } } } impl ExprLinter for $name { type Unit = Chunk; fn description(&self) -> &str { $desc } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { to_lint(toks, src, $pref) } fn expr(&self) -> &dyn Expr { self.expr.as_ref() } } }; } impl_expr_linter!( ViciousCircle, Prefer::Circle, "Corrects and standardizes common errors and variants of `vicious/virtuous circle`." ); impl_expr_linter!( ViciousCycle, Prefer::Cycle, "Corrects and standardizes common errors and variants of `vicious/virtuous cycle`." ); impl_expr_linter!( ViciousCircleOrCycle, Prefer::DontCare, "Corrects common errors in `vicious/virtuous circle/cycle`." ); #[cfg(test)] mod tests { use super::{ViciousCircle, ViciousCircleOrCycle, ViciousCycle}; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // Prefer "circle" - Made up, simple examples #[test] fn vicious_singular() { assert_suggestion_result("vicious cycle", ViciousCircle::default(), "vicious circle"); } #[test] fn vicious_plural() { assert_suggestion_result( "vicious cycles", ViciousCircle::default(), "vicious circles", ); } #[test] fn viscous_singular() { assert_suggestion_result("viscous cycle", ViciousCircle::default(), "vicious circle"); } #[test] fn viscous_plural() { assert_suggestion_result( "viscous cycles", ViciousCircle::default(), "vicious circles", ); } #[test] fn ignore_vicious_singular() { assert_no_lints("vicious circle", ViciousCircle::default()); } #[test] fn ignore_virtuous_plural() { assert_no_lints("virtuous circles", ViciousCircle::default()); } // Prefer "circle" - Real-world examples #[test] fn fix_singular_and_plural_nouns() { assert_suggestion_result( "The file Vicious Cycle Dataset.ods contains 33 vicious cycles from 13 open source systems studied in our paper.", ViciousCircle::default(), "The file Vicious Circle Dataset.ods contains 33 vicious circles from 13 open source systems studied in our paper.", ); } #[test] fn fix_virtuous() { assert_suggestion_result( "FlashInfer-Bench is a benchmark suite and production workflow designed to build a virtuous cycle of self-improving AI systems.", ViciousCircle::default(), "FlashInfer-Bench is a benchmark suite and production workflow designed to build a virtuous circle of self-improving AI systems.", ); } // Prefer "cycle" - Made up, simple examples #[test] fn fix_singular() { assert_suggestion_result("vicious circle", ViciousCycle::default(), "vicious cycle"); } #[test] fn fix_plural() { assert_suggestion_result( "virtuous circles", ViciousCycle::default(), "virtuous cycles", ); } #[test] fn fix_viscous_singular() { assert_suggestion_result("viscous circle", ViciousCycle::default(), "vicious cycle"); } #[test] fn fix_viscous_plural() { assert_suggestion_result("viscous circles", ViciousCycle::default(), "vicious cycles"); } #[test] fn dont_flag_singular() { assert_no_lints("viscious cycle", ViciousCycle::default()); } #[test] fn dont_flag_plural() { assert_no_lints("virtuous cycles", ViciousCycle::default()); } // Prefer "cycle" - Real-world examples #[test] fn fix_its_a_virtuous() { assert_suggestion_result( "It's a virtuous circle: if it's interesting to do a project, a person spends a lot of time on it", ViciousCycle::default(), "It's a virtuous cycle: if it's interesting to do a project, a person spends a lot of time on it", ); } #[test] #[ignore = "Harper currently misinterprets the words around the ellipses as a hostname"] fn fix_viscous() { assert_suggestion_result( "However, adding it to $connectionsToTransact causes the tests to stop running...viscous circle.", ViciousCycle::default(), "However, adding it to $connectionsToTransact causes the tests to stop running...vicious cycle.", ); } // No preference - both "circle" and "cycle" are fine. #[test] fn dont_flag_either() { assert_no_lints( "vicious circle, virtuous cycle, vicious cycles, virtuous circles", ViciousCircleOrCycle::default(), ); } #[test] fn fix_both_viscous() { assert_suggestion_result( "viscous circle, viscous cycles", ViciousCircleOrCycle::default(), "vicious circle, vicious cycles", ); } // No preference - Real-world examples #[test] fn dont_flag_combo() { assert_no_lints( "Instead of a vicious cycle, popularity creates a virtuous circle.", ViciousCircleOrCycle::default(), ); } #[test] fn fix_its_a_viscous_cycle() { assert_suggestion_result( "Its a viscous cycle that started back in 1.13 for a few plugins but is now hurting every single world generation plugin", ViciousCircleOrCycle::default(), "Its a vicious cycle that started back in 1.13 for a few plugins but is now hurting every single world generation plugin", ); } } ================================================ FILE: harper-core/src/linting/was_aloud.rs ================================================ use super::{ExprLinter, Lint, LintKind}; use crate::Token; use crate::TokenStringExt; use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::Suggestion; use crate::linting::expr_linter::Chunk; pub struct WasAloud { expr: SequenceExpr, } impl Default for WasAloud { fn default() -> Self { let pattern = SequenceExpr::word_set(&["was", "were", "be", "been"]) .then_whitespace() .then_exact_word("aloud"); Self { expr: pattern } } } impl ExprLinter for WasAloud { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let verb = matched_tokens[0].span.get_content_string(source); Some(Lint { span: matched_tokens.span()?, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( format!("{verb} allowed").chars().collect(), matched_tokens[0].span.get_content(source), )], message: format!("Did you mean `{verb} allowed`?"), priority: 31, }) } fn description(&self) -> &'static str { "Ensures `was aloud` and `were aloud` are corrected to `was allowed` or `were allowed` when referring to permission." } } #[cfg(test)] mod tests { use super::WasAloud; use crate::linting::tests::assert_suggestion_result; #[test] fn corrects_was_aloud() { assert_suggestion_result( "He was aloud to enter the room.", WasAloud::default(), "He was allowed to enter the room.", ); } #[test] fn corrects_were_aloud() { assert_suggestion_result( "They were aloud to participate.", WasAloud::default(), "They were allowed to participate.", ); } #[test] fn does_not_correct_proper_use_of_aloud() { assert_suggestion_result( "She read the passage aloud to the class.", WasAloud::default(), "She read the passage aloud to the class.", ); } #[test] fn does_not_flag_unrelated_text() { assert_suggestion_result( "The concert was loud and exciting.", WasAloud::default(), "The concert was loud and exciting.", ); } #[test] fn be_aloud() { assert_suggestion_result( "You may be aloud to enter the room.", WasAloud::default(), "You may be allowed to enter the room.", ); } #[test] fn been_aloud() { assert_suggestion_result( "If I had been aloud to enter I would've jumped at the chance.", WasAloud::default(), "If I had been allowed to enter I would've jumped at the chance.", ); } } ================================================ FILE: harper-core/src/linting/way_too_adjective.rs ================================================ use harper_brill::UPOS; use crate::Token; use crate::expr::{All, Expr, OwnedExprExt, SequenceExpr}; use crate::patterns::{UPOSSet, WordSet}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct WayTooAdjective { expr: All, } impl Default for WayTooAdjective { fn default() -> Self { let base = SequenceExpr::default() .t_aco("way") .t_ws() .t_aco("to") .t_ws() .then(UPOSSet::new(&[UPOS::ADJ]).or(WordSet::new(&["much"]))); let exceptions = SequenceExpr::anything() .t_any() .t_any() .t_any() .then_word_set(&["surface", "return", "aqua"]); let expr = All::new(vec![ Box::new(base), Box::new(SequenceExpr::unless(exceptions)), ]); Self { expr } } } impl ExprLinter for WayTooAdjective { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let to_tok = toks.get(2)?; let span = to_tok.span; let original = span.get_content(src); Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( "too".chars().collect(), original, )], message: "Did you mean “too”?".into(), priority: 25, }) } fn description(&self) -> &'static str { "Replaces the preposition `to` with the adverb `too` after `way` when followed by an \ adjective (e.g. `way too fast`)" } } #[cfg(test)] mod tests { use super::WayTooAdjective; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_way_to_fast() { assert_suggestion_result( "You drive way to fast.", WayTooAdjective::default(), "You drive way too fast.", ); } #[test] fn corrects_way_to_complicated() { assert_suggestion_result( "I think this would be way to complicated to implement.", WayTooAdjective::default(), "I think this would be way too complicated to implement.", ); } #[test] fn corrects_way_to_much() { assert_suggestion_result( "…and ate way to much.", WayTooAdjective::default(), "…and ate way too much.", ); } #[test] fn allows_fast_way_to_test() { assert_lint_count( "Fast way to test daily defence teams?", WayTooAdjective::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/weir_rules/ACoupleMore.weir ================================================ expr main (a couple of more) let message "The correct wording is `a couple more`, without the `of`." let description "Corrects `a couple of more` to `a couple more`." let kind "Redundancy" let becomes "a couple more" test "There are a couple of more rules that could be added, how can I contribute?" "There are a couple more rules that could be added, how can I contribute?" ================================================ FILE: harper-core/src/linting/weir_rules/ALongTime.weir ================================================ expr main (along time) let message "Use `a long time` for referring to a duration of time." let description "Corrects `along time` to `a long time`." let kind "Grammar" let becomes "a long time" test "along time" "a long time" test "Fast refreshing is very slow had to wait along time for it to update." "Fast refreshing is very slow had to wait a long time for it to update." ================================================ FILE: harper-core/src/linting/weir_rules/AOkHyphen.weir ================================================ expr main a [ok, okay] let message "Use `A-OK` when stating that something is acceptable or ready." let description "Replaces the loose article-plus-abbreviation pairing with the standard hyphenated form whenever a linking verb describes readiness or approval." let kind "Style" let becomes "A-OK" test "I am a ok with the plan." "I am a-ok with the plan." test "We are totally a ok team before the launch." "We are totally a-ok team before the launch." test "The crew was pretty a okay about the repairs." "The crew was pretty a-ok about the repairs." test "It will be a ok once the update reaches the fleet." "It will be a-ok once the update reaches the fleet." test "You are very a ok partner for the call." "You are very a-ok partner for the call." test "This is almost a ok outcome for the holiday." "This is almost a-ok outcome for the holiday." test "I am just a okay voice on the call." "I am just a-ok voice on the call." test "We were really a ok group at the summit." "We were really a-ok group at the summit." test "It is a ok moment to decide." "It is a-ok moment to decide." test "The product is pretty a ok example of resilience." "The product is pretty a-ok example of resilience." test "The service was totally a okay signal." "The service was totally a-ok signal." test "Are you a ok with this change?" "Are you a-ok with this change?" test "It is A OK to proceed." "It is A-OK to proceed." test "I was a ok support while the team was busy." "I was a-ok support while the team was busy." test "You were totally a ok host." "You were totally a-ok host." test "Being a ok line of communication matters." "Being a-ok line of communication matters." test "It has been a ok solution in the past." "It has been a-ok solution in the past." allows "The dashboard shows A-OK feedback." allows "Our status is OK." allows "This is a good plan." allows "AOK signals readiness." ================================================ FILE: harper-core/src/linting/weir_rules/AdNauseam.weir ================================================ expr main (as nauseam) let message "This phrase comes from Latin, where `ad` means `to`." let description "Corrects `as nauseam` to `ad nauseam`." let kind "Spelling" let becomes "ad nauseam" test "As you say, discussed as nauseam, but no nearer a solution." "As you say, discussed ad nauseam, but no nearer a solution." test "no more autism please, hearing about it as nauseam is starting to make me sick" "no more autism please, hearing about it ad nauseam is starting to make me sick" ================================================ FILE: harper-core/src/linting/weir_rules/AfterAWhile.weir ================================================ expr main (after while) let message "When describing a timeframe, use `a while`." let description "Corrects the missing article in `after while`, forming `after a while`." let kind "Grammar" let becomes "after a while" test "bromite Crashes on all sites after while." "bromite Crashes on all sites after a while." ================================================ FILE: harper-core/src/linting/weir_rules/AfterAll.weir ================================================ expr main (afterall) let message "Did you mean `after all`?" let description "Corrects `afterall` to `after all`." let kind "BoundaryError" let becomes "after all" test "I hope it will pop up afterall but that remains to be seen." "I hope it will pop up after all but that remains to be seen." ================================================ FILE: harper-core/src/linting/weir_rules/AheadAnd.weir ================================================ expr main (ahead an) let message "Did you make a typo? Shouldn't it be `and`?" let description "Corrects `an` to `and` after `ahead`." let becomes "ahead and" test "If it's important, go ahead an open an issue." "If it's important, go ahead and open an issue." ================================================ FILE: harper-core/src/linting/weir_rules/Albeit.weir ================================================ expr main [(all be it), (al be it), (al beit), (all beit), (allbe it)] let message "This should be written as a single word with a single `l`: `albeit`." let description "Corrects this expression to the standard `albeit`." let kind "Spelling" let becomes "albeit" test "If I type in the path to the upstats.html file I do get the page all be it with no data" "If I type in the path to the upstats.html file I do get the page albeit with no data" test "only one developer, al be it they have been very responsive to my issues" "only one developer, albeit they have been very responsive to my issues" test "I am one of those idiots, al beit I did it when I was young" "I am one of those idiots, albeit I did it when I was young" test "the red error mesages display in the console, all beit to quick to read" "the red error mesages display in the console, albeit to quick to read" test "i think this persons theory is worng allbe it very impresive" "i think this persons theory is worng albeit very impresive" ================================================ FILE: harper-core/src/linting/weir_rules/AllOfASudden.weir ================================================ expr main [(all of the sudden), (all of sudden), (all the sudden)] let message "Prefer the standard phrasing `all of a sudden`." let description "Guides this expression toward the standard `all of a sudden`." let kind "Nonstandard" let becomes "all of a sudden" test "On an app that has been released since December, all of the sudden around February 5th ANRs started going up." "On an app that has been released since December, all of a sudden around February 5th ANRs started going up." test "It happened all the sudden when the lights went out." "It happened all of a sudden when the lights went out." test "All the sudden the room fell quiet." "All of a sudden the room fell quiet." test "The music stopped, all the sudden, during the chorus." "The music stopped, all of a sudden, during the chorus." test "Did the power cut all the sudden?" "Did the power cut all of a sudden?" test "He whispered, \"all the sudden we were alone.\"" "He whispered, \"all of a sudden we were alone.\"" test "ALL THE SUDDEN THE ROOM WENT DARK." "ALL OF A SUDDEN THE ROOM WENT DARK." test "They were laughing all the sudden." "They were laughing all of a sudden." test "It stormed all of sudden after a warm morning." "It stormed all of a sudden after a warm morning." allows "Their excitement and suddenness were all the suddenness she remembered." test "This all the sudden change surprised everyone." "This all of a sudden change surprised everyone." ================================================ FILE: harper-core/src/linting/weir_rules/AllReady.weir ================================================ expr main <(all ready ADJ), (all ready)> let message "Use `already` before adjectives instead of the two-word phrase." let description "Flags `all ready` when it precedes an adjective so the adverb `already` can take its place." let kind "Grammar" let becomes "already" # True positives test "The device is all ready available in Korea." "The device is already available in Korea." test "Everything is all ready clear before the deadline." "Everything is already clear before the deadline." test "The firmware is all ready stable on the new hardware." "The firmware is already stable on the new hardware." test "They were all ready aware of the security policy." "They were already aware of the security policy." test "Our team is all ready excited to release the patch." "Our team is already excited to release the patch." test "It is all ready possible to switch to the new plan." "It is already possible to switch to the new plan." test "The training is all ready complete for the next cohort." "The training is already complete for the next cohort." test "Her notes are all ready relevant to the presentation." "Her notes are already relevant to the presentation." test "The content is all ready public on the blog." "The content is already public on the blog." test "ALL READY AVAILABLE data arrived yesterday." "ALREADY AVAILABLE data arrived yesterday." test "The settings are all ready consistent across environments." "The settings are already consistent across environments." test "Our docs are all ready accurate for the release notes." "Our docs are already accurate for the release notes." # False negatives (these contexts still need the correction) test "All ready solid documentation should go live soon." "Already solid documentation should go live soon." test "The plan is all ready steady for roll out." "The plan is already steady for roll out." test "The board felt all ready confident in the direction." "The board felt already confident in the direction." # Guardrails / False positives (these should remain untouched) test "Are you all ready for the show?" "Are you all ready for the show?" test "We were all ready to leave as soon as the bell rang." "We were all ready to leave as soon as the bell rang." test "Your crew was all ready and waiting for the signal." "Your crew was all ready and waiting for the signal." test "You can keep all ready supplies in the closet." "You can keep all ready supplies in the closet." test "I saw that they were all ready when the curtains opened." "I saw that they were all ready when the curtains opened." ================================================ FILE: harper-core/src/linting/weir_rules/AllThough.weir ================================================ expr main all though let message "Merge `all` and `though` into the conjunction `although`." let description "Nobody means to write the two-word phrase `all though` when the single word `although` is intended." let kind "Typo" let becomes "although" let strategy "Exact" test "All though I liked the book, I had to stop reading it." "although I liked the book, I had to stop reading it." test "all though the schedule is tight, I'll try." "although the schedule is tight, I'll try." test "ALL THOUGH the rules are set, we questioned them." "although the rules are set, we questioned them." test "All Though we planned carefully, things shifted." "although we planned carefully, things shifted." test "He kept asking all though she already declined." "He kept asking although she already declined." test "All though." "although." test "Everyone cheered all though the score was clear." "Everyone cheered although the score was clear." test "All though, the pilot stayed calm." "although, the pilot stayed calm." test "All though they tried, the system failed." "although they tried, the system failed." test "All though the evidence is sparse, the team persisted." "although the evidence is sparse, the team persisted." test "All though we expect the meeting to end early, we prepared backup." "although we expect the meeting to end early, we prepared backup." test "All, though, the plan still faltered." "All, though, the plan still faltered." test "We covered all the parts, though, until the hour." "We covered all the parts, though, until the hour." test "She knows all of the relevant rules though." "She knows all of the relevant rules though." test "Although we disagree, this is still valid." "Although we disagree, this is still valid." test "He said all of his reasons, though it was long." "He said all of his reasons, though it was long." test "They discussed all of the topics, though briefly." "They discussed all of the topics, though briefly." ================================================ FILE: harper-core/src/linting/weir_rules/Alongside.weir ================================================ expr main (along side) let message "Use the single word `alongside`." let description "Replaces the spaced form `along side` with `alongside`." let kind "WordChoice" let becomes "alongside" test "They walked along side the river." "They walked alongside the river." test "Along side the road, we saw a parade." "Alongside the road, we saw a parade." test "The banner read ALONG SIDE THE TEAM!" "The banner read ALONGSIDE THE TEAM!" test "The skiff pulled along side." "The skiff pulled alongside." test "\"We drifted along side,\" she said." "\"We drifted alongside,\" she said." test "They stood along side, waiting patiently." "They stood alongside, waiting patiently." test "Cars lined up along side the curb." "Cars lined up alongside the curb." allows "They walked alongside the river." allows "They walked along the side of the river." allows "We camped along the lakeside all weekend." ================================================ FILE: harper-core/src/linting/weir_rules/AlzheimersDisease.weir ================================================ expr main (old-timers' disease) let message "Use the correct medical term." let description "Fixes the common misnomer `old-timers' disease`, ensuring the correct medical term `Alzheimer’s disease` is used." let kind "Eggcorn" let becomes "Alzheimer’s disease" ================================================ FILE: harper-core/src/linting/weir_rules/AnAnother.weir ================================================ expr main [(an another), (a another)] let message "Use `another` on its own." let description "Corrects `an another` and `a another`." let kind "Redundancy" let becomes "another" test "Render shader to use it as texture in an another shader." "Render shader to use it as texture in another shader." test "Audit login is a another package for laravel framework." "Audit login is another package for laravel framework." ================================================ FILE: harper-core/src/linting/weir_rules/AnotherAn.weir ================================================ expr main (another an) let message "Use `another` on its own." let description "Corrects `another an` to `another`." let kind "Redundancy" let becomes "another" test "Yet another an atomic deployment tool." "Yet another atomic deployment tool." ================================================ FILE: harper-core/src/linting/weir_rules/AnotherOnes.weir ================================================ expr main (another ones) let message "`another` is singular but `ones` is plural. Or maybe you meant the possessive `one's`." let description "Corrects `another ones`." let kind "Agreement" let becomes ["another one", "another one's", "other ones"] test "Change list params of a resource, another ones change too" "Change list params of a resource, other ones change too" ================================================ FILE: harper-core/src/linting/weir_rules/AnotherThings.weir ================================================ expr main (another things) let message "`another` is singular but `things` is plural." let description "Corrects `another things`." let kind "Agreement" let becomes ["another thing", "other things"] test "Another things to fix in the Mask editor" "Other things to fix in the Mask editor" ================================================ FILE: harper-core/src/linting/weir_rules/ArriveOnWeekday.weir ================================================ expr weekdays [Monday, Mon, Tuesday, Tue, Wednesday, Wed, Thursday, Thu, Thur, Thurs, Friday, Fri, Saturday, Sat, Sunday, Sun] expr arriveWeekdayGap <(arrive @weekdays), ( )> expr main @arriveWeekdayGap let message "Add 'on' after 'arrive' when it is immediately followed by a weekday." let description "Keeps schedules explicit by preferring the familiar `arrive on Friday` pattern instead of a bare weekday." let kind "Style" let becomes " on " # true positives # weekday spelled out test "I plan to arrive Monday afternoon." "I plan to arrive on Monday afternoon." # abbreviated day test "Please arrive Tue before noon." "Please arrive on Tue before noon." test "Make sure we arrive Thursday prepared." "Make sure we arrive on Thursday prepared." test "Arrive fri if you want to join." "Arrive on fri if you want to join." test "arrive SUN this time around." "arrive on SUN this time around." test "arrive Wed, I mean it." "arrive on Wed, I mean it." test "We should arrive Mon and start with the briefing." "We should arrive on Mon and start with the briefing." test "He asked if we could arrive Thurs for setup." "He asked if we could arrive on Thurs for setup." test "Arrive Tue, please." "Arrive on Tue, please." # true negatives and guardrails test "Please arrive on Monday." "Please arrive on Monday." test "We can arrive tomorrow." "We can arrive tomorrow." test "Arrive after Monday to avoid traffic." "Arrive after Monday to avoid traffic." test "Arrive Monday's crew already left." "Arrive Monday's crew already left." test "They plan to arrive in May." "They plan to arrive in May." test "Arrive before noon, so we can prep." "Arrive before noon, so we can prep." ================================================ FILE: harper-core/src/linting/weir_rules/AsEvidentBy.weir ================================================ expr main [<(as is evident by), evident>, <(as evident by), evident>, <(is evident by), evident>] let message "Did you mean `evidenced`? The correct phrase uses the past participle of the verb `evidence`." let description "Corrects `evident by` to `evidenced by` in passive constructions where `evidence` is used as a verb." let kind "Grammar" let becomes "evidenced" let strategy "MatchCase" # True positives (from real-world examples in issue #2895) test "as many others have differing preferences as is evident by the differing feedback" "as many others have differing preferences as is evidenced by the differing feedback" test "But as is evident by this bug, I'm not certain this will always be the case." "But as is evidenced by this bug, I'm not certain this will always be the case." test "This is evident by the call to remove_connection by the establish_connection method." "This is evidenced by the call to remove_connection by the establish_connection method." test "I noticed it always gets compiled, as evident by the cranelift log." "I noticed it always gets compiled, as evidenced by the cranelift log." test "As evident by gits history, it was made on purpose." "As evidenced by gits history, it was made on purpose." test "Errors thrown synchronously are caught (as evident by the stacktrace)." "Errors thrown synchronously are caught (as evidenced by the stacktrace)." test "I had the wrong username (as evident by my server's ssh log)." "I had the wrong username (as evidenced by my server's ssh log)." test "AS IS EVIDENT BY the data, this approach works." "AS IS EVIDENCED BY the data, this approach works." # True negatives allows "As evidenced by the data, this approach works." allows "This is evidenced by the test results." allows "The trend is evident from the chart." allows "It was evident in his tone of voice." allows "The answer is self-evident." allows "This problem is not evident to new users." ================================================ FILE: harper-core/src/linting/weir_rules/AsFarBackAs.weir ================================================ expr main (as early back as) let message "Use `as far back as` for referring to a time in the past." let description "Corrects nonstandard `as early back as` to `as far back as`." let kind "WordChoice" let becomes "as far back as" test "as early back as" "as far back as" test "skin overrides also supports a wide variety of minecraft versions - as early back as 1.14.4." "skin overrides also supports a wide variety of minecraft versions - as far back as 1.14.4." ================================================ FILE: harper-core/src/linting/weir_rules/AsFollows.weir ================================================ expr main (as follow) let message "Use `as follows`." let description "Corrects the phrase `as follow`, which is sometimes produced by overcorrection. While it appeared briefly in 19th-century English, it is now considered archaic; modern standard usage requires `as follows` regardless of number." let kind "Grammar" let becomes "as follows" test "The main points are as follow:" "The main points are as follows:" test "Please read the steps as follow before you begin." "Please read the steps as follows before you begin." test "As follow you requested, I have compiled the list." "As follows you requested, I have compiled the list." test "I write this as follow for future reference." "I write this as follows for future reference." test "as follow" "as follows" test "AS FOLLOW" "AS FOLLOWS" test "The instructions are listed as follow in the appendix." "The instructions are listed as follows in the appendix." test "We were told as follow the timeline would slip." "We were told as follows the timeline would slip." test "Is this description as follow the sample?" "Is this description as follows the sample?" test "You can verify as follow once the build completes." "You can verify as follows once the build completes." # Ensure unrelated uses of "follow" are not affected allows "Follow the instructions as written." allows "We follow-up on these requests weekly." allows "This is the way to follow as best you can." allows "As follows the plan will unfold." allows "I will follow your lead." allows "The as follows section is helpful." ================================================ FILE: harper-core/src/linting/weir_rules/AsIfThough.weir ================================================ expr main (as if though) let message "This should be `as if` or `as though`." let description "Corrects redundant `as if though`." let kind "Redundancy" let becomes ["as if", "as though"] test "It's coming back to you. and looking as if though it's very bright red." "It's coming back to you. and looking as if it's very bright red." test "it passes right on by it as if though nothing happened." "it passes right on by it as though nothing happened." ================================================ FILE: harper-core/src/linting/weir_rules/AsItHappens.weir ================================================ expr main (as it so happens) let message "Did you mean `as it happens`?" let description "Corrects `as it so happens` to `as it happens`." let kind "Usage" let becomes "as it happens" test "As it so happens, we have language currently in review that basically states that a major version break means backwards incompatibility ..." "As it happens, we have language currently in review that basically states that a major version break means backwards incompatibility ..." ================================================ FILE: harper-core/src/linting/weir_rules/AsLongAs.weir ================================================ expr main (aslong as) let message "`As long` should be written as two words." let description "Corrects `aslong as` to `as long as`." let kind "BoundaryError" let becomes "as long as" test "server loads up fine but cant log on client side aslong as the plugin is installed" "server loads up fine but cant log on client side as long as the plugin is installed" ================================================ FILE: harper-core/src/linting/weir_rules/AsOfCurrently.weir ================================================ expr main (as of currently) let message "Standard equivalents are `currently` or `as of now`." let description "Corrects `as of currently` to `currently` or `as of now`." let kind "WordChoice" let becomes ["currently", "as of now"] test "Note that, as of currently, selecting a method on the list leaves it highlighted as such, until the script is changed." "Note that, currently, selecting a method on the list leaves it highlighted as such, until the script is changed." test "As of currently, Cervo offers a set of inferers, noise generators (for continuous-action/parametrized policies), and a unified asset format." "As of now, Cervo offers a set of inferers, noise generators (for continuous-action/parametrized policies), and a unified asset format." ================================================ FILE: harper-core/src/linting/weir_rules/AsOfLately.weir ================================================ expr main (as of lately) let message "Standard equivalents are `lately` or `as of late`." let description "Corrects `as of lately` to `lately` or `as of late`." let kind "WordChoice" let becomes ["lately", "as of late"] test "I haven't noticed any crashing with AMDGPU as of lately, so this looks to not be an issue anymore." "I haven't noticed any crashing with AMDGPU as of late, so this looks to not be an issue anymore." test "As of lately, I've been more active on Gitlab." "As of late, I've been more active on Gitlab." ================================================ FILE: harper-core/src/linting/weir_rules/AsOpposedTo.weir ================================================ expr main (as oppose to) let message "Did you mean `as opposed to`?" let description "Corrects `as oppose to` to `as opposed to`." let kind "Usage" let becomes "as opposed to" test "Distorted image upon opening the app as oppose to running the app after successful build" "Distorted image upon opening the app as opposed to running the app after successful build" ================================================ FILE: harper-core/src/linting/weir_rules/AtFaceValue.weir ================================================ expr main (on face value) let message "`at face value is more idiomatic and more common." let description "Corrects `on face value` to the more usual `at face value`." let kind "WordChoice" let becomes "at face value" test "Obviously what you want is possible and on face value it's a trivial change on our end." "Obviously what you want is possible and at face value it's a trivial change on our end." ================================================ FILE: harper-core/src/linting/weir_rules/AtTheEndOfTheDay.weir ================================================ expr main (in the end of the day) let message "Did you mean `at the end of the day`?" let description "Corrects `in the end of the day` to `at the end of the day`." let kind "WordChoice" let becomes "at the end of the day" test "In the end of the day, it's not a big deal." "At the end of the day, it's not a big deal." ================================================ FILE: harper-core/src/linting/weir_rules/AtTheExpenseOf.weir ================================================ expr main [(at the expanse of), (at the expance of), (at the expenses of)] let message "In the context of tradeoffs, use `at the expense of`. `Expanse` means " let description "The correct idiom is `at the expense of`, with singular `expense`. But retain `expanse` if this phrase refers to a wide area." let kind "Eggcorn" let becomes "at the expense of" test "for those who wish to favor code size and compilation time at the expanse of slightly less efficient code" "for those who wish to favor code size and compilation time at the expense of slightly less efficient code" test "That - at least for me - increases the database performce at the expance of the speed of synchronisation between container and host." "That - at least for me - increases the database performce at the expense of the speed of synchronisation between container and host." test "we, users, can solve this by ourselves, at the expenses of using more votes" "we, users, can solve this by ourselves, at the expense of using more votes" ================================================ FILE: harper-core/src/linting/weir_rules/AvoidAndAlso.weir ================================================ expr main (and also) let message "Consider using just `and`." let description "Reduces redundancy by replacing `and also` with `and`." let kind "Redundancy" let becomes "and" ================================================ FILE: harper-core/src/linting/weir_rules/AwareOf.weir ================================================ expr main (aware about) let message "Use `aware of` instead of `aware about`." let description "Corrects `aware about` to the standard `aware of`." let kind "Usage" let becomes "aware of" test "\"no-member\" checks is not aware about the scope" "\"no-member\" checks is not aware of the scope" test "OP-TEE core will still be aware about that id, but at least we will be able to change it in runtime." "OP-TEE core will still be aware of that id, but at least we will be able to change it in runtime." ================================================ FILE: harper-core/src/linting/weir_rules/BadRap.weir ================================================ expr main [(bed rap), (bad rep)] let message "Did you mean `bad rap`?" let description "Changes `bed rap` to the proper idiom `bad rap`." let kind "Eggcorn" let becomes "bad rap" test "bad rep" "bad rap" ================================================ FILE: harper-core/src/linting/weir_rules/BanTogether.weir ================================================ expr main (ban together) let message "Did you mean `band together`?" let description "Detects and corrects the common error of using `ban together` instead of the idiom `band together`, which means to unite or join forces." let kind "Eggcorn" let becomes "band together" ================================================ FILE: harper-core/src/linting/weir_rules/BareInMind.weir ================================================ expr main (bare in mind) let message "Did you mean `bear in mind`?" let description "Ensures the phrase `bear in mind` is used correctly instead of `bare in mind`." let kind "Eggcorn" let becomes "bear in mind" ================================================ FILE: harper-core/src/linting/weir_rules/BatedBreath.weir ================================================ expr main (baited breath) let message "Did you mean `bated breath`?" let description "Changes `baited breath` to the correct `bated breath`." let kind "Eggcorn" let becomes "bated breath" test "baited breath" "bated breath" ================================================ FILE: harper-core/src/linting/weir_rules/BeckAndCall.weir ================================================ expr main (back and call) let message "Did you mean `beck and call`?" let description "Fixes `back and call` to `beck and call`." let kind "Eggcorn" let becomes "beck and call" ================================================ FILE: harper-core/src/linting/weir_rules/BeenThere.weir ================================================ expr main (bee there) let message "Did you mean `been there`?" let description "Corrects the misspelling `bee there` to the proper phrase `been there`." let kind "Typo" let becomes "been there" ================================================ FILE: harper-core/src/linting/weir_rules/Beforehand.weir ================================================ expr main [(before hand), (before-hand)] let message "Prefer the single-word adverb `beforehand`." let description "`Beforehand` functions as a fixed adverb meaning ‘in advance’; writing it as two words or with a hyphen is nonstandard and can jar readers." let becomes "beforehand" test "Let me know before hand if you will attend." "Let me know beforehand if you will attend." test "I prepared the documents before-hand." "I prepared the documents beforehand." allows "We finished the preparations beforehand." ================================================ FILE: harper-core/src/linting/weir_rules/BesideThePoint.weir ================================================ expr main (besides the point) let message "Use `beside` in the idiom `beside the point`." let description "Corrects `besides the point` to `beside the point`." let kind "Eggcorn" let becomes "beside the point" test "we kind of focus on GPUs a lot but uh that's besides the point so uh sometime ago" "we kind of focus on GPUs a lot but uh that's beside the point so uh sometime ago" ================================================ FILE: harper-core/src/linting/weir_rules/BestRegards.weir ================================================ expr main (beat regards) let message "Use `best regards` to convey sincere well wishes in a closing." let description "In valedictions, `best` expresses your highest regard—avoid the typo `beat regards`." let kind "Typo" let becomes "best regards" ================================================ FILE: harper-core/src/linting/weir_rules/BetterOffWith.weir ================================================ expr main (better of with) let message "This phrase uses the word `off`." let description "Corrects `better of with` to `better off with`." let kind "Typo" let becomes "better off with" test "If you're wanting dynamic meta data, your might be better of with getServerSideProps ." "If you're wanting dynamic meta data, your might be better off with getServerSideProps ." ================================================ FILE: harper-core/src/linting/weir_rules/BewareOf.weir ================================================ expr main [(beware with regard to), (beware about), (beware with), (beware regarding), (beware concerning), (beware against), (beware for), (beware in), (beware on), (beware at), (beware among), (beware between)] let message "Use `beware of` when naming the object you want readers to avoid." let description "The verb `beware` naturally pairs with `of` before the noun being warned about, so swap other prepositions for clarity." let kind "Usage" let becomes "beware of" let strategy "MatchCase" test "Beware about scams that arrive by email." "Beware of scams that arrive by email." test "beware with the loose wires behind the TV." "beware of the loose wires behind the TV." test "Beware with regard to the rusted railing." "Beware of the rusted railing." test "Beware regarding the crumbling guardrail." "Beware of the crumbling guardrail." test "Beware concerning the expired coupon." "Beware of the expired coupon." test "Beware against mixing cleaning chemicals." "Beware of mixing cleaning chemicals." test "Beware for the slippery tile near the pool." "Beware of the slippery tile near the pool." test "Beware in the area where the fog hides the cliffs." "Beware of the area where the fog hides the cliffs." test "Beware on the step that squeaks." "Beware of the step that squeaks." test "Beware at that crossing when traffic is heavy." "Beware of that crossing when traffic is heavy." test "Beware among the wild animals outside the park." "Beware of the wild animals outside the park." test "Beware between the gaps in the scaffolding." "Beware of the gaps in the scaffolding." test "BEWARE WITH THE LOUD CRASHING." "BEWARE OF THE LOUD CRASHING." allows "Beware of the dog that guards the porch." allows "Beware the gap between the platforms." allows "Beware every time you go near the cliff." allows "Some people say beware: the path narrows." allows "Beware of tall waves on this beach." ================================================ FILE: harper-core/src/linting/weir_rules/BlacklistWhitelist.weir ================================================ expr colors [black, white] expr items [list, lists] expr main @colors @items let message "Treat color-based deny/allow lists as single words like `blacklist` or `whitelist`." let description "Normalize the two-word sequence `black list`/`white list` so it matches the established compound noun or verb." let kind "Usage" let becomes ["blacklist", "whitelist"] # True positives test "We need to black list that vendor." "We need to blacklist that vendor." test "I told the compliance team to white list our partners." "I told the compliance team to whitelist our partners." test "Black list suspicious spikes before the release." "Blacklist suspicious spikes before the release." test "White list the new IPs before the demo." "Whitelist the new IPs before the demo." test "Do not black list folks lightly." "Do not blacklist folks lightly." test "Please white list those domains." "Please whitelist those domains." test "The policy will black list multiple addresses." "The policy will blacklist multiple addresses." test "White list the staging nodes before testing." "Whitelist the staging nodes before testing." test "Black list any host that misbehaves." "Blacklist any host that misbehaves." test "White list their servers before the big push." "Whitelist their servers before the big push." # False positives / true negatives allows "The color black is on this list." allows "Please keep the list of white items up to date." allows "The existing blacklist already contains these values." allows "We've been using whitelist entries for weeks." ================================================ FILE: harper-core/src/linting/weir_rules/BlanketStatement.weir ================================================ expr main (blanketed statement) let message "Use the more idiomatic phrasing." let description "Corrects common errors in the phrase `blanket statement`." let kind "Usage" let becomes "blanket statement" test "This seems like a blanketed statement and I have not found any info to back up whether PyJWT is affected." "This seems like a blanket statement and I have not found any info to back up whether PyJWT is affected." ================================================ FILE: harper-core/src/linting/weir_rules/Brutality.weir ================================================ expr main (brutalness) let message "This word has a more standard, more common synonym." let description "Suggests the more standard and common synonym `brutality`." let kind "WordChoice" let becomes "brutality" test "the mildness and brutalness of the story rises." "the mildness and brutality of the story rises." ================================================ FILE: harper-core/src/linting/weir_rules/BuiltIn.weir ================================================ expr main [(in built), (in-built), (built in)] let message "Prefer the hyphenated compound `built-in`." let description "English convention treats `built-in` as a single, attributive adjective—meaning something integrated from the outset—whereas other forms like `in built` are nonstandard and can feel awkward to readers." let becomes "built-in" let kind "Punctuation" ================================================ FILE: harper-core/src/linting/weir_rules/CanBeSeen.weir ================================================ expr main (can be seem) let message "Did you mean `can be seen`?" let description "Corrects `can be seem` to the proper phrase `can be seen`." let kind "Typo" let becomes "can be seen" ================================================ FILE: harper-core/src/linting/weir_rules/CaseInPoint.weir ================================================ expr main (case and point) let message "`Case in point` is the correct form of the phrase." let description "Corrects `case and point` to `case in point`." let kind "Malapropism" let becomes "case in point" test "They are just not as high of a priority as other tasks that user's are requesting for, a case and point is I have never ran into this issue." "They are just not as high of a priority as other tasks that user's are requesting for, a case in point is I have never ran into this issue." ================================================ FILE: harper-core/src/linting/weir_rules/CaseSensitive.weir ================================================ expr main (case sensitive) let message "Use the hyphenated form for `case-sensitive`." let description "Ensures `case-sensitive` is correctly hyphenated." let kind "Punctuation" let becomes "case-sensitive" ================================================ FILE: harper-core/src/linting/weir_rules/ClickThroughRate.weir ================================================ expr metricHeads [click, view] expr metricNouns [rate, rates, conversion, conversions, optimization, optimizations] expr main <((@metricHeads through) @metricNouns), (@metricHeads through)> let message "Keep the metric modifier bonded so the compound explicitly names the analytics signal." let description "Hyphenates the verb+preposition pair when it directly precedes rate-style nouns, mirroring how these terms are commonly styled in analytics writing." let kind "Punctuation" let becomes ["click-through", "view-through"] let strategy "MatchCase" # True positives # These sequences should become hyphenated because they describe a compound metric modifier. test "The click through rate improved." "The click-through rate improved." test "Our click through rates are trending up." "Our click-through rates are trending up." test "We monitor the click through conversion for each campaign." "We monitor the click-through conversion for each campaign." test "Click through conversions kept climbing overnight." "Click-through conversions kept climbing overnight." test "A sudden click through optimization push arrived." "A sudden click-through optimization push arrived." test "The latest click through rate dashboard arrived." "The latest click-through rate dashboard arrived." test "click through conversions stay on the board." "click-through conversions stay on the board." test "CLICK THROUGH RATES stay on the board." "CLICK-THROUGH RATES stay on the board." test "After the launch, the click through conversion number improved." "After the launch, the click-through conversion number improved." test "The view through optimization performed well." "The view-through optimization performed well." # False positives / true negatives # Keep the rule from firing when the modifier simply describes a navigation action or lacks a metric noun. test "Click through the next tab when ready." "Click through the next tab when ready." test "We click through every data point before shipping." "We click through every data point before shipping." test "Please click through the menu options slowly." "Please click through the menu options slowly." test "If you click through this screen, let me know." "If you click through this screen, let me know." test "She needs to view through the samples before approving." "She needs to view through the samples before approving." test "Click through, at your leisure, to see the preview." "Click through, at your leisure, to see the preview." ================================================ FILE: harper-core/src/linting/weir_rules/ComprisesOf.weir ================================================ expr main (comprises of) let message "Avoid `comprises of`; let `comprises` stand on its own or choose `consists of`." let description "`Comprises` already contains the notion of `of`, so following it with another `of` is redundant." let kind "Usage" let becomes ["comprises", "is comprised of"] test "The playlist comprises of twelve tracks." "The playlist comprises twelve tracks." test "Our team comprises of specialists with diverse expertise." "Our team comprises specialists with diverse expertise." test "The committee comprises of members from each department." "The committee comprises members from each department." test "The community comprises of volunteers and donors." "The community comprises volunteers and donors." test "The project comprises of multiple modules." "The project comprises multiple modules." test "The project comprises of multiple modules." "The project is comprised of multiple modules." test "His speech comprises of anecdotes." "His speech comprises anecdotes." test "This portfolio comprises of leading companies." "This portfolio comprises leading companies." test "Comprises of rare objects, the exhibit feels curated." "Comprises rare objects, the exhibit feels curated." test "COMPRISES OF outdated references, the memo loses credibility." "COMPRISES outdated references, the memo loses credibility." test "The team comprises consultants from all regions." "The team comprises consultants from all regions." test "Her summary comprises a list of skills." "Her summary comprises a list of skills." test "The board comprises directors of multiple backgrounds." "The board comprises directors of multiple backgrounds." test "It comprises a mix of fans and critics." "It comprises a mix of fans and critics." test "I know what comprises the committee." "I know what comprises the committee." test "A phrase like comprises-of should stay untouched." "A phrase like comprises-of should stay untouched." test "Comprising the look of the thing, the design stands out." "Comprising the look of the thing, the design stands out." test "The comprise of energy issues is complex." "The comprise of energy issues is complex." ================================================ FILE: harper-core/src/linting/weir_rules/CondenseAllThe.weir ================================================ expr main (all of the) let message "Consider simplifying to `all the`." let description "Suggests removing `of` in `all of the` for a more concise phrase." let kind "Redundancy" let becomes "all the" ================================================ FILE: harper-core/src/linting/weir_rules/CoursingThroughVeins.weir ================================================ expr main (cursing through veins) let message "In this idiom, blood `courses` (flows) through veins, not `curses`." let description "In English idioms, `to course` means to flow rapidly—so avoid the eggcorn `cursing through veins.`" let kind "Eggcorn" let becomes "coursing through veins" test "cursing through veins" "coursing through veins" test "It felt like the drugs were cursing through veins." "It felt like the drugs were coursing through veins." allows "He was cursing through the entire meeting." ================================================ FILE: harper-core/src/linting/weir_rules/CuttingAgeEggcorn.weir ================================================ expr main [(cutting age), (cutting-age)] let message "Did you mean `cutting-edge` (adjective before a noun) or `cutting edge` (in other positions)?" let description "Corrects the eggcorn `cutting age` or `cutting-age` to `cutting-edge` or `cutting edge`." let kind "Eggcorn" let becomes ["cutting-edge", "cutting edge"] let strategy "MatchCase" # True positives test "We use cutting age technology." "We use cutting-edge technology." test "This is a cutting age framework." "This is a cutting-edge framework." test "They deliver cutting-age solutions to clients." "They deliver cutting-edge solutions to clients." test "CUTTING AGE software is our specialty." "CUTTING-EDGE software is our specialty." test "The cutting age approach impressed everyone." "The cutting-edge approach impressed everyone." test "We chose cutting age tools for this project." "We chose cutting-edge tools for this project." # True negatives allows "We use cutting-edge technology." allows "This is a cutting-edge framework." allows "The cutting edge of research is exciting." allows "She is cutting the age requirement in half." allows "Cutting edge solutions are our focus." ================================================ FILE: harper-core/src/linting/weir_rules/Cybersec.weir ================================================ expr main (cybersec) let message "Use `cybersecurity` instead of `cybersec`." let description "Expands the informal abbreviation `cybersec` to `cybersecurity`." let kind "Style" let becomes "cybersecurity" let strategy "MatchCase" test "We hired a cybersec analyst." "We hired a cybersecurity analyst." test "Cybersec teams are growing." "Cybersecurity teams are growing." test "CYBERSEC is a priority." "CYBERSECURITY is a priority." test "Our cybersec program needs funding." "Our cybersecurity program needs funding." test "They focus on cybersec in healthcare." "They focus on cybersecurity in healthcare." test "cybersec." "cybersecurity." test "cybersec," "cybersecurity," test "cybersec?" "cybersecurity?" test "cybersec!" "cybersecurity!" test "The cybersec training starts Monday." "The cybersecurity training starts Monday." test "A cybersec role opened today." "A cybersecurity role opened today." test "We discussed cybersec risks." "We discussed cybersecurity risks." test "Cybersecurity is important." "Cybersecurity is important." test "cybersecurity is important." "cybersecurity is important." test "This is about cyber-sec systems." "This is about cyber-sec systems." test "We build cybersecops tooling." "We build cybersecops tooling." test "The cybersecx team is separate." "The cybersecx team is separate." ================================================ FILE: harper-core/src/linting/weir_rules/DampSquib.weir ================================================ expr main (damp squid) let message "Use the correct phrase for a disappointing outcome." let description "Corrects the eggcorn `damp squid` to `damp squib`, ensuring the intended meaning of a failed or underwhelming outcome." let kind "Eggcorn" let becomes "damp squib" ================================================ FILE: harper-core/src/linting/weir_rules/DegreesKelvin.weir ================================================ expr main [(degrees kelvin), (degrees Kelvin), (degree kelvin), (degree Kelvin)] let message "Use `kelvins` when discussing the unit Kelvin." let description "Corrects use of `degrees kelvin` to `kelvins`." let kind "Usage" let becomes ["kelvins", "kelvin"] test "degrees kelvin" "kelvins" ================================================ FILE: harper-core/src/linting/weir_rules/DegreesKelvinSymbol.weir ================================================ expr main (°K) let message "Use just the symbol `K` when discussing the unit Kelvin." let description "Corrects use of `°K` to `K`." let kind "Usage" let becomes "K" test "°K" "K" ================================================ FILE: harper-core/src/linting/weir_rules/DoIAdjective.weir ================================================ expr main <([(Do I [interested, excited, tired, ready, curious, comfortable, prepared, overwhelmed, confident, available, worried, annoyed, relieved, frustrated, surprised, anxious, calm, satisfied, concerned]), (Do I not [interested, excited, tired, ready, curious, comfortable, prepared, overwhelmed, confident, available, worried, annoyed, relieved, frustrated, surprised, anxious, calm, satisfied, concerned])]), Do> let message "When describing how you feel, `I` pairs with `am`, not `do`." let description "Swaps the helping verb `do` for `am` in `Do I ` questions so they use the correct linking verb." let kind "Grammar" let becomes "am" test "Do I interested in music?" "Am I interested in music?" test "Do I excited about the launch?" "Am I excited about the launch?" test "Do I tired after the hike?" "Am I tired after the hike?" test "Do I ready for the interview?" "Am I ready for the interview?" test "Do I curious what they decide?" "Am I curious what they decide?" test "Do I comfortable sharing that detail?" "Am I comfortable sharing that detail?" test "Do I prepared to join the call?" "Am I prepared to join the call?" test "Do I overwhelmed by the inbox?" "Am I overwhelmed by the inbox?" test "Do I confident in that plan?" "Am I confident in that plan?" test "Do I not interested in attending?" "Am I not interested in attending?" test "Do I not ready yet?" "Am I not ready yet?" test "do I concerned about the changes?" "am I concerned about the changes?" allows "Do I want to help you?" allows "Do I need to finish this tonight?" allows "Do I have to explain everything?" allows "Do I run the tests again?" allows "Do I look like I'm not listening?" ================================================ FILE: harper-core/src/linting/weir_rules/DoNotWant.weir ================================================ expr main [(don't wan), (do not wan)] let message "Use the full verb `want` after negation: `don't want` or `do not want.`" let description "In English, negation still requires the complete verb form (`want`), so avoid truncating it to `wan.`" let kind "Typo" let becomes ["don't want", "do not want"] test "I don't wan to pay for this." "I don't want to pay for this." test "Don't Wan that option." "Don't Want that option." allows "I don't want to leave." ================================================ FILE: harper-core/src/linting/weir_rules/DoToDueTo.weir ================================================ expr main <([(![PRON, INTJ, PART, ADV, CCONJ, SCONJ, ADP, DET] do to [ADJ, NOUN, VERB, PROPN] NOUN), (![PRON, INTJ, PART, ADV, CCONJ, SCONJ, ADP, DET] do to DET * NOUN), (![PRON, INTJ, PART, ADV, CCONJ, SCONJ, ADP, DET] ADV do to [ADJ, NOUN, VERB, PROPN] NOUN), (![PRON, INTJ, PART, ADV, CCONJ, SCONJ, ADP, DET] ADV do to DET * NOUN)]), (do to)> let message "Did you mean `due to`?" let description "Corrects the typo `do to` when it is intended to mean `due to` in causal phrases." let kind "Usage" let becomes "due to" test "Many restaurants will close do to the corona restrictions." "Many restaurants will close due to the corona restrictions." test "The event was canceled do to bad weather." "The event was canceled due to bad weather." test "Production stopped do to a supply shortage." "Production stopped due to a supply shortage." test "Flights were delayed do to heavy fog." "Flights were delayed due to heavy fog." test "The server rebooted do to power issues." "The server rebooted due to power issues." test "They left early do to a family emergency." "They left early due to a family emergency." test "The cancelation happened do to unexpected maintenance." "The cancelation happened due to unexpected maintenance." test "Our plan changed do to the new policy." "Our plan changed due to the new policy." test "The app crashed do to memory leaks." "The app crashed due to memory leaks." test "Tickets sold quickly do to a viral post." "Tickets sold quickly due to a viral post." test "It failed do to data loss." "It failed due to data loss." allows "What did you do to the file?" allows "Please do to the file what you did to the other one." allows "Don't do to others what you wouldn't want done to you." allows "We need to do to this spreadsheet what we did last week." allows "She asked what the update would do to her settings." ================================================ FILE: harper-core/src/linting/weir_rules/DontCan.weir ================================================ expr main (don't can) let message "The grammatically correct form is `can't` or `cannot`." let description "Corrects `don't can` to `can't` or `cannot`." let kind "Grammar" let becomes ["can't", "cannot"] test "And currently uh I'm looking at it when I don't can see it like you know where it is, right?" "And currently uh I'm looking at it when I can't see it like you know where it is, right?" ================================================ FILE: harper-core/src/linting/weir_rules/DoubleNegative.weir ================================================ expr main <([(didn't), (did not), (did n't)] [need, have, want, make, take, get] no), no> let message "With `didn't/did not`, using `no` creates a double negative; replace `no` with `any` to keep a single negation." let description "Replaces the determiner `no` with `any` when it follows the auxiliary `didn't/did not` plus a main verb (e.g., have, need, want, make, take, get) so the clause contains only one negation." let kind "Grammar" let becomes "any" test "I didn't have no idea what to say." "I didn't have any idea what to say." test "She didn't want no trouble last night." "She didn't want any trouble last night." test "He did not make no progress this week." "He did not make any progress this week." test "We didn't take no for an answer." "We didn't take any for an answer." test "They didn't get no signal from the device." "They didn't get any signal from the device." test "You didn't need no permission to do that." "You didn't need any permission to do that." test "I didn't have no choice after the meeting." "I didn't have any choice after the meeting." test "I didn't want no part of it." "I didn't want any part of it." test "The driver didn't take no excuses." "The driver didn't take any excuses." test "I didn't have no time for that." "I didn't have any time for that." test "I DIDN'T HAVE NO IDEA WHEN THIS WOULD END." "I DIDN'T HAVE ANY IDEA WHEN THIS WOULD END." test "She did not make no progress yet." "She did not make any progress yet." # Should not change when there's no double negative `no` allows "I didn't have any idea what to do." allows "I didn't say no to the invitation." allows "She doesn't have any idea why the alarm rang." allows "I did not see any sign of trouble." allows "No friends came over." ================================================ FILE: harper-core/src/linting/weir_rules/DueDiligence.weir ================================================ expr main (do diligence) let message "If this phrase should function as a noun it should be `due diligence`. If it should function as a verb it should be `do due diligence" let description "Corrects `do diligence` to `due diligence`." let kind "Usage" let becomes ["due diligence", "do due diligence"] test "Thank you for your time, I am trying to do my do diligence and find some answers." "Thank you for your time, I am trying to do my due diligence and find some answers." test "The Technical Committee (TC) will do diligence, write a report, and attach that report to the GitHub issue." "The Technical Committee (TC) will do due diligence, write a report, and attach that report to the GitHub issue." ================================================ FILE: harper-core/src/linting/weir_rules/DuringAges.weir ================================================ expr main <((during ages) ![NUM, :]), (during)> let message "Use `for ages` instead of `during ages` when referring to a vague stretch of time." let description "The idiomatic duration is 'for ages', so swap the initial preposition whenever the words refer to a general span." let kind "Usage" let becomes "for" let strategy "MatchCase" # True positives # Replace `during ages` with `for ages` when the phrase describes a vague stretch of time. test "Stories accumulate during ages past." "Stories accumulate for ages past." test "During ages of exile, they remained resolute." "For ages of exile, they remained resolute." test "She waited during ages for the letter." "She waited for ages for the letter." test "We have been friends during ages long." "We have been friends for ages long." test "During ages gone by, the valley slept." "For ages gone by, the valley slept." test "People argued during ages on behalf of the plan." "People argued for ages on behalf of the plan." test "During ages past, kings ruled here." "For ages past, kings ruled here." test "I reminisced during ages about the river." "I reminisced for ages about the river." test "During ages of waiting he kept faith." "For ages of waiting he kept faith." test "Why do you speak during ages like that?" "Why do you speak for ages like that?" test "During ages after the fall they rebuilt." "For ages after the fall they rebuilt." test "She sang during ages when storms howled." "She sang for ages when storms howled." # Guardrails # Numeric age ranges should remain untouched. # Keep the precise age range framing. allows "During ages: 35 to 40, we recorded the decline." ================================================ FILE: harper-core/src/linting/weir_rules/EachAndEveryOne.weir ================================================ expr main (each and everyone) let message "Use `each and every one` for referring to a group of people or things." let description "Corrects `each and everyone` to `each and every one`." let kind "BoundaryError" let becomes "each and every one" test "each and everyone" "each and every one" test "I have modified each and everyone of them to keep only the best of the best!" "I have modified each and every one of them to keep only the best of the best!" ================================================ FILE: harper-core/src/linting/weir_rules/EagleEyed.weir ================================================ expr main (eagle eyed) let message "Hyphenate `eagle eyed` when it acts as a single adjective before a noun." let description "Treats the phrase as a compound modifier and replaces the space with a hyphen so it reads like one idea." let kind "Punctuation" let becomes "eagle-eyed" let strategy "MatchCase" # True positives # Ensure the hyphen appears before a noun when `eagle eyed` describes it. test "The eagle eyed analyst noticed the bug." "The eagle-eyed analyst noticed the bug." test "Our eagle eyed intern flagged the missing reference." "Our eagle-eyed intern flagged the missing reference." test "An eagle eyed reviewer spotted the mismatch." "An eagle-eyed reviewer spotted the mismatch." test "Eagle eyed mentors guide the new hires." "Eagle-eyed mentors guide the new hires." test "That eagle eyed editor catches grammar slips." "That eagle-eyed editor catches grammar slips." test "I rely on eagle eyed assistants for QA." "I rely on eagle-eyed assistants for QA." test "Her eagle eyed focus kept the doc clean." "Her eagle-eyed focus kept the doc clean." test "Late-night eagle eyed editors keep releases stable." "Late-night eagle-eyed editors keep releases stable." test "Eagle eyed scientists double-check the data." "Eagle-eyed scientists double-check the data." test "The eagle eyed security team audits every deploy." "The eagle-eyed security team audits every deploy." test "Our eagle eyed partner shared the warning." "Our eagle-eyed partner shared the warning." test "He admired their eagle eyed vigilance." "He admired their eagle-eyed vigilance." # False negatives (capitalization should not stop the correction) test "Eagle Eyed reviewers always respond quickly." "Eagle-Eyed reviewers always respond quickly." test "EAGLE EYED surveyors noticed the shift." "EAGLE-EYED surveyors noticed the shift." test "An Eagle Eyed champion kept tabs on the data." "An Eagle-Eyed champion kept tabs on the data." # True negatives / false positives allows "Eagle-eyed editors already finished the article." allows "The eagle eyedness they display is a point of pride." ================================================ FILE: harper-core/src/linting/weir_rules/EggYolk.weir ================================================ expr main (egg yoke) let message "Use `egg yolk` when you mean the yellow portion of an egg." let description "Corrects the eggcorn `egg yoke`, replacing it with the standard culinary term `egg yolk`." let kind "Eggcorn" let becomes "egg yolk" test "She whisked the egg yoke briskly." "She whisked the egg yolk briskly." test "Egg yoke is rich in nutrients." "Egg yolk is rich in nutrients." test "Add the EGG YOKE to the batter." "Add the EGG YOLK to the batter." test "Separate the egg yoke, then fold it in." "Separate the egg yolk, then fold it in." test "The runny egg yoke spilled over the toast." "The runny egg yolk spilled over the toast." test "Blend the cream with each egg yoke before baking." "Blend the cream with each egg yolk before baking." allows "The custard calls for one egg yolk." allows "Reserve the egg yolks for later." allows "The artisan carved a wooden yoke for the oxen." allows "Crack the eggs so no yoke spills." ================================================ FILE: harper-core/src/linting/weir_rules/EludedTo.weir ================================================ expr main (eluded to) let message "Did you mean `alluded to`?" let description "Corrects `eluded to` to `alluded to` in contexts referring to indirect references." let kind "Malapropism" let becomes "alluded to" ================================================ FILE: harper-core/src/linting/weir_rules/EnMasse.weir ================================================ expr main [(on mass), (on masse), (in mass)] let message "Did you mean `en masse`?" let description "Detects variants like `on mass` or `in mass` and suggests `en masse`." let kind "Eggcorn" let becomes "en masse" test "in mass" "en masse" ================================================ FILE: harper-core/src/linting/weir_rules/EnRoute.weir ================================================ expr main [(on route to), (in route to), (on-route to), (in-route to)] let message "Did you mean `en route`?" let description "Detects variants like `on route` or `in route` and suggests `en route`." let kind "Eggcorn" let becomes ["en route to", "en-route to"] test "on route to" "en route to" test "in route to" "en route to" test "vehicles may already be on route to one end of a Shipment" "vehicles may already be en route to one end of a Shipment" test "TF-South is in route to conduct SSE on the strike." "TF-South is en route to conduct SSE on the strike." test "I ultimately just want a slight preference for matches that are on-route to correct cases like the above." "I ultimately just want a slight preference for matches that are en-route to correct cases like the above." ================================================ FILE: harper-core/src/linting/weir_rules/EverPresent.weir ================================================ expr main (ever present) let message "Hyphenate `ever-present` when it functions as a compound adjective." let description "Corrects the missing hyphen in `ever present` to the compound adjective `ever-present`." let kind "Punctuation" let becomes "ever-present" test "ever present" "ever-present" test "Distrust was an ever present tension in the negotiations." "Distrust was an ever-present tension in the negotiations." ================================================ FILE: harper-core/src/linting/weir_rules/EverSince.weir ================================================ expr main (every since) let message "Did you mean `ever since`?" let description "Corrects `every since` to `ever since`." let kind "Typo" let becomes "ever since" test "einstein been real quiet every since this dropped" "einstein been real quiet ever since this dropped" ================================================ FILE: harper-core/src/linting/weir_rules/EveryOnceAndAgain.weir ================================================ expr main (every once and again) let message "For things that happen only occasionaly use `every once in a while. For things that persistently happen use `once again`." let description "Corrects `every once and again` to `every once in a while` or `once again`." let kind "Usage" let becomes ["every once in a while", "once again"] test "Ys have been replaced with Ps, happens randomly every once and again with different letters" "Ys have been replaced with Ps, happens randomly every once in a while with different letters" ================================================ FILE: harper-core/src/linting/weir_rules/EveryTime.weir ================================================ expr main (everytime) let message "`Everytime` as a single word is proscribed. Use `every time` instead." let description "Corrects `everytime` to `every time`." let kind "Usage" let becomes "every time" test "Init tool everytime a file in a directory is modified" "Init tool every time a file in a directory is modified" ================================================ FILE: harper-core/src/linting/weir_rules/Excellent.weir ================================================ expr main (very good) let message "Vocabulary enhancement: use `excellent` instead of `very good`" let description "Provides a stronger word choice by replacing `very good` with `excellent` for clarity and emphasis." let kind "Enhancement" let becomes "excellent" test "Her results were very good this semester." "Her results were excellent this semester." allows "The performance was excellent, drawing praise from all critics." allows "He radiated a sense of very goodness in his charitable acts." test "She generally gave herself very good advice" "She generally gave herself excellent advice" ================================================ FILE: harper-core/src/linting/weir_rules/ExpandBecause.weir ================================================ expr main (cuz) let message "Use `because` instead of informal `cuz`" let description "Expands the informal abbreviation `cuz` to the full word `because` for formality." let kind "Style" let becomes "because" test "Stick around cuz I got a surprise for you at the end." "Stick around because I got a surprise for you at the end." ================================================ FILE: harper-core/src/linting/weir_rules/ExpandControl.weir ================================================ expr main (ctrl) let message "Use `control` instead of informal `ctrl`" let description "Expands the informal abbreviation `ctrl` to the full word `control` for clarity." let kind "Style" let becomes "control" test "Ctrl+click" "Control+click" ================================================ FILE: harper-core/src/linting/weir_rules/ExpandForward.weir ================================================ expr main (fwd) let message "Use `forward` instead of `fwd`" let description "Expands the abbreviation `fwd` to the full word `forward` for clarity." let kind "Style" let becomes "forward" test "Now I look fwd to the interior, the color, etc." "Now I look forward to the interior, the color, etc." ================================================ FILE: harper-core/src/linting/weir_rules/ExpandMinimum.weir ================================================ expr main (min) let message "Use `minimum` instead of `min`" let description "Expands the abbreviation `min` to the full word `minimum` for clarity." let kind "Style" let becomes "minimum" ================================================ FILE: harper-core/src/linting/weir_rules/ExpandPrevious.weir ================================================ expr main (prev) let message "Use `previous` instead of `prev`" let description "Expands the abbreviation `prev` to the full word `previous` for clarity." let kind "Style" let becomes "previous" test "Just change :after by :before in the code above. Otherwise, you'll see the default prev/next images + the font awesome chevrons.Read" "Just change :after by :before in the code above. Otherwise, you'll see the default previous/next images + the font awesome chevrons.Read" ================================================ FILE: harper-core/src/linting/weir_rules/ExpandThrough.weir ================================================ expr main (thru) let message "Use `thru` instead of `through`" let description "Expands the informal spelling `thru` to the standard word `through`." let kind "Style" let becomes "through" test "Switch with coloned value parsed differently when invoking with pass thru args" "Switch with coloned value parsed differently when invoking with pass through args" ================================================ FILE: harper-core/src/linting/weir_rules/ExpandWith.weir ================================================ expr main (w/) let message "Use `with` instead of `w/`" let description "Expands the abbreviation `w/` to the full word `with` for clarity." let kind "Style" let becomes "with" ================================================ FILE: harper-core/src/linting/weir_rules/ExpandWithout.weir ================================================ expr main (w/o) let message "Use `without` instead of `w/o`" let description "Expands the abbreviation `w/o` to the full word `without` for clarity." let kind "Style" let becomes "without" test "She lacks w/o experience." "She lacks without experience." test "He has w/o skills w/o knowledge." "He has without skills without knowledge." test "The report includes w/o details." "The report includes without details." allows "She works with out effort." test "She’s w/o a plan." "She’s without a plan." ================================================ FILE: harper-core/src/linting/weir_rules/FaceFirst.weir ================================================ expr main (face first into) let message "Should this be `face-first`?" let description "Ensures `face first` is correctly hyphenated as `face-first` when used before `into`." let kind "Punctuation" let becomes "face-first into" ================================================ FILE: harper-core/src/linting/weir_rules/FairBit.weir ================================================ expr main (fare bit) let message "A `decent amount` is a `fair bit`. `Fare` is the price of a ticket." let description "Corrects malapropisms of `a fair bit`." let kind "Eggcorn" let becomes "fair bit" test "I've read through a fare bit of the ecosystem framework, but I am not clear on what is modified..." "I've read through a fair bit of the ecosystem framework, but I am not clear on what is modified..." ================================================ FILE: harper-core/src/linting/weir_rules/FarAndFewBetween.weir ================================================ expr main (far and few between) let message "The correct idiom is `few and far between`?" let description "Corrects `far and few between` to the standard idiom `few and far between`." let kind "Eggcorn" let becomes "few and far between" test "Their neighbors were far and few between, which only made it even more unlikely that surveillance footage recovered from their properties could help." "Their neighbors were few and far between, which only made it even more unlikely that surveillance footage recovered from their properties could help." ================================================ FILE: harper-core/src/linting/weir_rules/FastPaste.weir ================================================ expr main [(fast paste), (fast-paste)] let message "Did you mean `fast-paced`?" let description "Detects incorrect usage of `fast paste` or `fast-paste` and suggests `fast-paced` as the correct phrase." let kind "Eggcorn" let becomes "fast-paced" ================================================ FILE: harper-core/src/linting/weir_rules/FatalOutcome.weir ================================================ expr main (fatal outcome) let message "Consider using `death` for clarity." let description "Replaces `fatal outcome` with the more direct term `death` for conciseness." let kind "Style" let becomes "death" ================================================ FILE: harper-core/src/linting/weir_rules/FetalPosition.weir ================================================ expr main (the feeble position) let message "Use the correct term for a curled-up posture." let description "Ensures the correct use of `fetal position`, avoiding confusion with `feeble position`, which is not a standard phrase." let kind "Malapropism" let becomes "the fetal position" ================================================ FILE: harper-core/src/linting/weir_rules/ForALongTime.weir ================================================ expr main (for along time) let message "Use the standard phrase `for a long time` to indicate an extended duration." let description "Eliminates the incorrect merging in `for along time`." let kind "Grammar" let becomes "for a long time" test "I was stuck there for along time." "I was stuck there for a long time." ================================================ FILE: harper-core/src/linting/weir_rules/ForAWhile.weir ================================================ expr main (for while) let message "When describing a timeframe, use `a while`." let description "Corrects the missing article in `for while`, forming `for a while`." let kind "Typo" let becomes "for a while" test "Build flutter releases in github actions for production only android for while." "Build flutter releases in github actions for production only android for a while." ================================================ FILE: harper-core/src/linting/weir_rules/ForArgumentsSake.weir ================================================ expr main [(for argument sake), (for arguments sake)] let message "Use the possessive `argument's`." let description "Corrects `for argument sake` to `for argument's sake`." let kind "Usage" let becomes "for argument's sake" test "I'm sure it would be incorrect to do so, but for argument sake, if I change" "I'm sure it would be incorrect to do so, but for argument's sake, if I change" test "In my app, for arguments sake user hits button which sets search_term" "In my app, for argument's sake user hits button which sets search_term" ================================================ FILE: harper-core/src/linting/weir_rules/ForTheMostPart.weir ================================================ expr main (for most part) let message "Use `for the most part` instead of `for most part`." let description "Corrects `for most part` to `for the most part`." let kind "Usage" let becomes ["for the most part"] test "Got bot working for most part but he has trouble with vendor potions" "Got bot working for the most part but he has trouble with vendor potions" test "it's unresponsive for most part and the only thing you can do is to restart for most part" "it's unresponsive for the most part and the only thing you can do is to restart for the most part" ================================================ FILE: harper-core/src/linting/weir_rules/FreeRein.weir ================================================ expr main (free reign) let message "Use the correct phrase for unrestricted control." let description "Ensures the correct use of `free rein`, avoiding confusion with `free reign`, which incorrectly suggests authority rather than freedom of action." let kind "Eggcorn" let becomes "free rein" ================================================ FILE: harper-core/src/linting/weir_rules/Freezing.weir ================================================ expr main [(very cold), (really cold), (extremely cold)] let message "A more vivid adjective would better capture extreme cold." let description "Encourages vivid writing by suggesting `freezing` instead of weaker expressions like `very cold.`" let kind "Enhancement" let becomes "freezing" ================================================ FILE: harper-core/src/linting/weir_rules/FromTheGetGo.weir ================================================ expr main (from the get go) let message "Use the hyphenated form: `from the get-go`." let description "Ensures `from the get-go` is correctly hyphenated, preserving the idiom’s meaning of ‘from the very beginning’." let kind "Punctuation" let becomes "from the get-go" ================================================ FILE: harper-core/src/linting/weir_rules/GildedAge.weir ================================================ expr main (guilded age) let message "The period of economic prosperity is called the `Gilded Age`." let description "If referring to the period of economic prosperity, the correct term is `Gilded Age`." let kind "Eggcorn" let becomes "Gilded Age" let strategy "Exact" test "It is especially a reflection of the socio-economic patterns in the Guilded Age." "It is especially a reflection of the socio-economic patterns in the Gilded Age." test "It is especially a reflection of the socio-economic patterns in the guilded age." "It is especially a reflection of the socio-economic patterns in the Gilded Age." ================================================ FILE: harper-core/src/linting/weir_rules/GoggleBrand.weir ================================================ expr googleMispellings [goggle, googol] expr main <(@googleMispellings [ads, analytics, calendar, chrome, classroom, docs, drive, forms, hangouts, mail, maps, news, photos, search, sheets, slides, translate, workspace]), @googleMispellings> let message "You probably meant to spell the company name `Google`." let description "Replaces the misspelling `goggle` when it is paired with a well-known Google service." let kind "Typo" let becomes "Google" let strategy "Exact" test "goggle docs keeps syncing in the background." "Google docs keeps syncing in the background." test "GOGGLE analytics shows the same anomaly." "Google analytics shows the same anomaly." test "I bookmarked the goggle maps route for tomorrow." "I bookmarked the Google maps route for tomorrow." test "Please open goggle slides before the meeting." "Please open Google slides before the meeting." test "We archived the goggle forms responses for later." "We archived the Google forms responses for later." test "The goggle drive link expired yesterday." "The Google drive link expired yesterday." test "His goggle search history is a little wild." "His Google search history is a little wild." test "Goggle workspace just announced a redesign." "Google workspace just announced a redesign." test "goggle mail and goggle calendar both flagged the alert." "Google mail and Google calendar both flagged the alert." test "Send the screenshot to goggle photos support." "Send the screenshot to Google photos support." test "Send the screenshot to googol photos support." "Send the screenshot to Google photos support." test "She wore a goggle when swimming." "She wore a goggle when swimming." test "The archaeologist examined the ancient goggle carefully." "The archaeologist examined the ancient goggle carefully." test "This goggle strap needs tightening." "This goggle strap needs tightening." test "Goggle is a brand of swimwear." "Goggle is a brand of swimwear." test "Let's goggle the data and see what pops up." "Let's goggle the data and see what pops up." test "Goggles help keep sand out of the eyes." "Goggles help keep sand out of the eyes." ================================================ FILE: harper-core/src/linting/weir_rules/GoingTo.weir ================================================ expr main (gong to) let message "Did you mean `going to`?" let description "Corrects `gong to` to the intended phrase `going to`." let kind "Typo" let becomes "going to" ================================================ FILE: harper-core/src/linting/weir_rules/GuineaBissau.weir ================================================ expr main (Guinea Bissau) let message "The official spelling is hyphenated." let description "Checks for the correct official name of the African country." let kind "Punctuation" let becomes "Guinea-Bissau" test "Guinea Bissau" "Guinea-Bissau" ================================================ FILE: harper-core/src/linting/weir_rules/HadOf.weir ================================================ expr main (had of) let message "Did you mean `had have` or `had've`?" let description "Flags the unnecessary use of `of` after `had` and suggests the correct forms." let kind "Grammar" let becomes ["had have", "had've"] ================================================ FILE: harper-core/src/linting/weir_rules/HalfAnHour.weir ================================================ expr main (half an our) let message "Remember the silent 'h' when writing `hour`: `half an hour`." let description "Fixes the eggcorn `half an our` to the accepted `half an hour`." let kind "Typo" let becomes "half an hour" test "It took half an our to get there." "It took half an hour to get there." ================================================ FILE: harper-core/src/linting/weir_rules/Haphazard.weir ================================================ expr main [(half hazard), (half-hazard), (halfhazard)] let message "Use `haphazard` for randomness or lack of organization." let description "Corrects the eggcorn `half hazard` to `haphazard`, which properly means lacking organization or being random." let kind "Eggcorn" let becomes "haphazard" ================================================ FILE: harper-core/src/linting/weir_rules/HeDos.weir ================================================ expr main <([(he dos), (he ADV dos), (she dos), (she ADV dos), (it dos), (it ADV dos)]), dos> let message "Did you mean `does`?" let description "Corrects the misspelling `dos` after `he`, `she`, or `it`." let kind "Typo" let becomes "does" test "He dos not want to go." "He does not want to go." test "She dos it." "She does it." test "It dos work." "It does work." test "he dos not like it." "he does not like it." test "HE DOS IT." "HE DOES IT." test "He just dos it." "He just does it." test "She never dos that." "She never does that." test "It really dos." "It really does." test "He dos." "He does." test "She dos, then she stops." "She does, then she stops." allows "I dos it." allows "They dos it." allows "Dos is Spanish for two." allows "He does it." allows "He doso it." ================================================ FILE: harper-core/src/linting/weir_rules/HeartToHeard.weir ================================================ expr main <([([have, has, had] [I, you, he, she, it, we, they] [heart, herd] [of, about, from, in, on, for, to, with]), ([have, has, had] [I, you, he, she, it, we, they] ADV [heart, herd] [of, about, from, in, on, for, to, with]), ([have, has, had] n't [I, you, he, she, it, we, they] [heart, herd] [of, about, from, in, on, for, to, with]), ([have, has, had] n't [I, you, he, she, it, we, they] ADV [heart, herd] [of, about, from, in, on, for, to, with]), ([have, has, had] DET NOUN ADV [heart, herd] [of, about, from, in, on, for, to, with]), ([have, has, had] n't DET NOUN ADV [heart, herd] [of, about, from, in, on, for, to, with]), ([haven't, hasn't, hadn't] [I, you, he, she, it, we, they] [heart, herd] [of, about, from, in, on, for, to, with]), ([haven't, hasn't, hadn't] [I, you, he, she, it, we, they] ADV [heart, herd] [of, about, from, in, on, for, to, with]), ([haven't, hasn't, hadn't] DET NOUN ADV [heart, herd] [of, about, from, in, on, for, to, with])]), [heart, herd]> let message "Did you mean the verb `heard` (= past tense of `hear`)?" let description "Corrects `heart` or `herd` to `heard` in common `have ... heard of/about` questions." let kind "Usage" let becomes "heard" test "Have you heart of this band?" "Have you heard of this band?" test "Have you herd of this band?" "Have you heard of this band?" test "Have you ever heart of this band?" "Have you ever heard of this band?" test "Have you ever herd of this band?" "Have you ever heard of this band?" test "Has she heart of the update?" "Has she heard of the update?" test "Has she ever heart of the update?" "Has she ever heard of the update?" test "Had they heart of the plan?" "Had they heard of the plan?" test "Have the police ever heart of this?" "Have the police ever heard of this?" test "Have the staff ever herd of the policy?" "Have the staff ever heard of the policy?" test "Haven't you heart of that movie?" "Haven't you heard of that movie?" test "Haven't you ever herd of that movie?" "Haven't you ever heard of that movie?" allows "Have you heard of this band?" allows "Have the police heard of this?" allows "Have the heart of this story been told?" allows "I have a herd of cattle." allows "I have heart of the matter already." ================================================ FILE: harper-core/src/linting/weir_rules/HiddenIn.weir ================================================ expr main (hidden into) let message "Did you mean `hidden in`?" let description "Corrects `hidden into` to `hidden in`." let kind "Usage" let becomes "hidden in" test "The button is hidden into the exam settings menu or something like that." "The button is hidden in the exam settings menu or something like that." ================================================ FILE: harper-core/src/linting/weir_rules/HowMach.weir ================================================ expr main <(how [mach, match] !PUNCT), [mach, match]> let message "Use `how much` when you're asking about quantity, not the brand name or verb." let description "Swaps `how mach` or `how match` with the correct quantifier `how much`." let kind "Typo" let becomes "much" test "Do you know how mach it weighs?" "Do you know how much it weighs?" test "Tell me how match sugar you want." "Tell me how much sugar you want." test "How mach are we supposed to study?" "How much are we supposed to study?" test "How match time have we spent already?" "How much time have we spent already?" test "He wondered how mach courage it takes." "He wondered how much courage it takes." test "She asked how match water to add." "She asked how much water to add." test "Ask how mach light you need." "Ask how much light you need." test "How mach did you train for this race?" "How much did you train for this race?" test "How match of those settings are legal?" "How much of those settings are legal?" test "HOW MACH DO YOU WANT IT?" "HOW MUCH DO YOU WANT IT?" allows "Now that we know how match() works, let's refactor." allows "How Match.com Got Women to Sign Up for Online Dating." allows "The engine develops 131.7kN and the speed of the aircraft is Mach 2." allows "Tell me how much time you need." allows "I can't decide how much of this to keep." ================================================ FILE: harper-core/src/linting/weir_rules/HumanBeings.weir ================================================ expr main [(human's beings), (humans beings)] let message "Use `human beings` to refer to people collectively." let description "Eliminates the incorrect possessive/plural usage like `human's beings` or `humans beings`." let kind "Grammar" let becomes "human beings" test "All humans beings deserve empathy." "All human beings deserve empathy." test "We should respect a human's beings fundamental rights." "We should respect a human beings fundamental rights." ================================================ FILE: harper-core/src/linting/weir_rules/HumanLife.weir ================================================ expr main (human live) let message "Did you mean `human life`?" let description "Changes `human live` to `human life`." let kind "Typo" let becomes "human life" ================================================ FILE: harper-core/src/linting/weir_rules/HungerPang.weir ================================================ expr main (hunger pain) let message "Did you mean `hunger pang`?" let description "Corrects `hunger pain` to `hunger pang`." let kind "Eggcorn" let becomes "hunger pang" test "hunger pain" "hunger pang" ================================================ FILE: harper-core/src/linting/weir_rules/IAm.weir ================================================ expr main (I a m) let message "Did you mean `I am`?" let description "Fixes the incorrect spacing in `I a m` to properly form `I am`." let kind "Typo" let becomes "I am" ================================================ FILE: harper-core/src/linting/weir_rules/IDo.weir ================================================ expr main (I does) let message "`I` pairs with the bare verb `do`; the –s inflection `does` is reserved for third-person singular subjects." let description "Corrects `I does` to `I do`." let kind "Agreement" let becomes "I do" test "I does enjoy writing Rust." "I do enjoy writing Rust." ================================================ FILE: harper-core/src/linting/weir_rules/ImitateFrom.weir ================================================ expr imitateVerbs [imitate, imitates, imitated, imitating] expr main <([(@imitateVerbs * from *), (@imitateVerbs * from * *), (@imitateVerbs * from * * *), (@imitateVerbs * * from *), (@imitateVerbs * * from * *), (@imitateVerbs * * from * * *), (@imitateVerbs * * * from *), (@imitateVerbs * * * from * *), (@imitateVerbs * * * from * * *), (@imitateVerbs * * * * from *), (@imitateVerbs * * * * from * *), (@imitateVerbs * * * * from * * *)]), (from)> let message "Use `of` with `imitate` when naming the source you copy." let description "After `imitate ...`, idiomatic phrasing points to the inspiration with `of` instead of `from`." let kind "Usage" let becomes "of" # True positives test "They imitate the rhythm from their mentor." "They imitate the rhythm of their mentor." test "She imitates every gesture from her teacher." "She imitates every gesture of her teacher." test "We imitated the cadence from the recording." "We imitated the cadence of the recording." test "He imitates the haircut from the cover model." "He imitates the haircut of the cover model." test "They are imitating the protocol from their architects." "They are imitating the protocol of their architects." test "The troupe imitates every flourish from the original cast." "The troupe imitates every flourish of the original cast." test "Our design imitates the polish from Picasso's gouache." "Our design imitates the polish of Picasso's gouache." test "The coach imitates the pace from the champion." "The coach imitates the pace of the champion." test "I imitated the approach from the guide." "I imitated the approach of the guide." test "We imitate the vibe from our favorite show." "We imitate the vibe of our favorite show." test "She imitates that electric rhythm from the rehearsal tape." "She imitates that electric rhythm of the rehearsal tape." test "They imitate him from the clip to get the cadence right." "They imitate him of the clip to get the cadence right." # Guardrails / False positives allows "They imitate from memory." allows "He imitates from scratch." allows "The mimic imitates from afar." allows "Imitate from this formula only when you intend to copy exact numbers." allows "Our dancer imitates from the safety of the balcony." allows "She imitates from the stage instead of the audience." ================================================ FILE: harper-core/src/linting/weir_rules/InAHurry.weir ================================================ expr main (in hurry) let message "The correct idiom is `in a hurry`." let description "Corrects `in hurry` to `in a hurry`." let kind "Usage" let becomes "in a hurry" test "helpful when JSON is huge and developer is in hurry" "helpful when JSON is huge and developer is in a hurry" test "eLab report making service for people in hurry." "eLab report making service for people in a hurry." ================================================ FILE: harper-core/src/linting/weir_rules/InAWhile.weir ================================================ expr main (in while) let message "When describing a timeframe, use `a while`." let description "Corrects the missing article in `in while`, forming `in a while`." let kind "Grammar" let becomes "in a while" test "We’ll talk again in while." "We’ll talk again in a while." ================================================ FILE: harper-core/src/linting/weir_rules/InAnyWay.weir ================================================ expr main (in anyway) let message "Use `in any way` for emphasizing a point." let description "Corrects ungrammatical `in anyway` to `in any way`." let kind "BoundaryError" let becomes "in any way" test "in anyway" "in any way" test "The names should not affect your application in anyway and you can override extension names." "The names should not affect your application in any way and you can override extension names." ================================================ FILE: harper-core/src/linting/weir_rules/InLieuOf.weir ================================================ expr main (in lue of) let message "Did you mean `in lieu of`?" let description "Corrects the misspelling `in lue of` to `in lieu of`." let kind "Spelling" let becomes "in lieu of" test "Controller Emulation in lue of Direct Controller binding" "Controller Emulation in lieu of Direct Controller binding" ================================================ FILE: harper-core/src/linting/weir_rules/InNeedOf.weir ================================================ expr main (in need for) let message "Use `in need of` for when something is required or necessary." let description "Corrects `in need for` to `in need of`." let kind "Usage" let becomes "in need of" test "In need for a native control for map symbols (map legend) #5203." "In need of a native control for map symbols (map legend) #5203." ================================================ FILE: harper-core/src/linting/weir_rules/InOfItself.weir ================================================ expr main (in of itself) let message "Use `in itself` (more common) or `in and of itself` (more formal) to mean 'intrinsically'." let description "Corrects nonstandard `in of itself` to standard `in itself` or `in and of itself`." let kind "Usage" let becomes ["in itself", "in and of itself"] test "in of itself" "in and of itself" test "This is not entirely unexpected in of itself, as Git and GitHub Desktop both generally prove fairly bad at delineating context intelligently..." "This is not entirely unexpected in and of itself, as Git and GitHub Desktop both generally prove fairly bad at delineating context intelligently..." ================================================ FILE: harper-core/src/linting/weir_rules/InThe.weir ================================================ expr main (int he) let message "Did you mean `in the`?" let description "Detects and corrects a spacing error where `in the` is mistakenly written as `int he`. Proper spacing is essential for readability and grammatical correctness in common phrases." let kind "Typo" let becomes "in the" ================================================ FILE: harper-core/src/linting/weir_rules/Initiatively.weir ================================================ expr main initiatively let message "Did you mean `proactive` (taking initiative, acting in advance) or `initially` (at first, in the beginning)?" let description "Corrects nonstandard `initiatively`." let kind "Nonstandard" let becomes ["proactively", "initially"] test "I have initiatively signed up for the course." "I have proactively signed up for the course." ================================================ FILE: harper-core/src/linting/weir_rules/Insensitive.weir ================================================ expr main (unsensitive) let message "This word has a more standard, more common synonym." let description "Suggests the more standard and common synonym `insensitive`." let kind "WordChoice" let becomes "insensitive" test "We want to potentially make an unsensitive header" "We want to potentially make an insensitive header" ================================================ FILE: harper-core/src/linting/weir_rules/InsteadOf.weir ================================================ expr main (in stead of) let message "Use the modern single word `instead of` to indicate a replacement." let description "Corrects the archaic or mistaken separation `in stead of` to `instead of` in everyday usage." let kind "BoundaryError" let becomes "instead of" test "He used water in stead of soda." "He used water instead of soda." allows "He used water instead of soda." ================================================ FILE: harper-core/src/linting/weir_rules/Insurmountable.weir ================================================ expr main (unsurmountable) let message "This word has a more standard, more common synonym." let description "Suggests the more standard and common synonym `insurmountable`." let kind "WordChoice" let becomes "insurmountable" test "That being said, if you find upgrading to newer versions to be unsurmountable, please open an issue." "That being said, if you find upgrading to newer versions to be insurmountable, please open an issue." ================================================ FILE: harper-core/src/linting/weir_rules/IsKnownFor.weir ================================================ expr main (is know for) let message "Did you mean `is known for`?" let description "Typo: `known` is the correct past participle." let kind "Typo" let becomes "is known for" ================================================ FILE: harper-core/src/linting/weir_rules/ItCan.weir ================================================ expr main (It cam) let message "Did you mean `It can`?" let description "Corrects the misspelling `It cam` to the proper phrase `It can`." let kind "Typo" let becomes "It can" ================================================ FILE: harper-core/src/linting/weir_rules/IveGotTo.weir ================================================ expr main (I've go to) let message "Use `I've got to` for necessity or obligation." let description "Corrects the slip `I've go to` to the idiomatic `I've got to`." let kind "Typo" let becomes "I've got to" test "I've go to finish this before Monday." "I've got to finish this before Monday." ================================================ FILE: harper-core/src/linting/weir_rules/JawDropping.weir ================================================ expr main (jar-dropping) let message "Use the correct phrase for something astonishing." let description "Corrects `jar-dropping` to `jaw-dropping`, ensuring the intended meaning of something that causes amazement." let kind "Eggcorn" let becomes "jaw-dropping" ================================================ FILE: harper-core/src/linting/weir_rules/JustDeserts.weir ================================================ expr main (just desserts) let message "Use the correct phrase for receiving what one deserves." let description "Ensures `just deserts` is used correctly, preserving its meaning of receiving an appropriate outcome for one's actions." let kind "Spelling" let becomes "just deserts" ================================================ FILE: harper-core/src/linting/weir_rules/KindOf.weir ================================================ expr main (kinda of) let message "`Kinda` already means `kind of`, so `kinda of` is redundant." let description "Corrects `kinda of` to `kind of`." let kind "Redundancy" let becomes ["kind of", "kinda"] test "Some kinda of Sync issue only with 0.79.1" "Some kind of Sync issue only with 0.79.1" ================================================ FILE: harper-core/src/linting/weir_rules/KindRegards.weir ================================================ expr main (kid regards) let message "Did you mean `kind regards`?" let description "Changes `kid regards` to `kind regards`." let kind "Typo" let becomes "kind regards" ================================================ FILE: harper-core/src/linting/weir_rules/KindSortOf.weir ================================================ expr connector [kind, sort] expr wrongprep [if, off] expr guard ![PRON, INTJ, PART, CCONJ, SCONJ, ADP, PUNCT, this, that, these, those, there, here] expr main <((@connector @wrongprep) @guard), (@wrongprep)> let message "Use `of` after `kind` or `sort` when you mean the softening filler instead of the typo." let description "Flags `kind if` or `sort off` that stand before qualifiers so the filler `of` stays intact." let kind "Typo" let becomes "of" # True positives test "I'm kind if tired today." "I'm kind of tired today." test "Sort off the new theme looked strange." "Sort of the new theme looked strange." test "This is kind if a stretch for sure." "This is kind of a stretch for sure." test "We saw sort off the same glitch twice." "We saw sort of the same glitch twice." test "Kind off serious bugs remain." "Kind of serious bugs remain." test "Sort off a few people ignored the warning." "Sort of a few people ignored the warning." test "KIND IF IMPORTANT signals lit up the board." "KIND OF IMPORTANT signals lit up the board." test "kind off perfectly tuned feedback arrived." "kind of perfectly tuned feedback arrived." test "Sort off a steady trend emerges soon." "Sort of a steady trend emerges soon." # True negatives / false positives test "Be kind if you can." "Be kind if you can." test "Sort if that path seems safe." "Sort if that path seems safe." test "Kind if there is time, I'll help." "Kind if there is time, I'll help." test "Sort if this plan feels solid." "Sort if this plan feels solid." # Known false negatives test "Kind if, at first, the logs were quiet." "Kind if, at first, the logs were quiet." test "Sort off, despite the caveats, the data feels solid." "Sort off, despite the caveats, the data feels solid." test "kind if whatever, I trust the fix." "kind if whatever, I trust the fix." ================================================ FILE: harper-core/src/linting/weir_rules/LastButNotLeast.weir ================================================ expr main [(last but not the least), (last, but not the least), (last but, not least), (last but not last)] let message "Use the more idiomatic phrasing." let description "Corrects common errors in the phrase `last but not least`." let kind "Usage" let becomes "last but not least" test "Last but not the least, with VS2013 you can use Web Essentials 2013" "Last but not least, with VS2013 you can use Web Essentials 2013" test "Last but not last, I'd like to thank my parents." "Last but not least, I'd like to thank my parents." ================================================ FILE: harper-core/src/linting/weir_rules/LastDitch.weir ================================================ expr main [(last ditch), (last ditched), (last-ditched)] let message "In this idiom, `ditch` is a noun and a hyphen is needed." let description "Corrects wrong variations of the idiomatic adjective `last-ditch`." let kind "Usage" let becomes "last-ditch" test "I was actually just trying that as a last ditched attempt to get it working, previously those ..." "I was actually just trying that as a last-ditch attempt to get it working, previously those ..." test "There are unique use cases and is meant to be a last ditch option." "There are unique use cases and is meant to be a last-ditch option." ================================================ FILE: harper-core/src/linting/weir_rules/LastNight.weir ================================================ expr main (yesterday night) let message "The idiomatic phrase is `last night`." let description "Flags `yesterday night` and suggests the standard phrasing `last night`." let kind "WordChoice" let becomes "last night" test "I was there yesterday night." "I was there last night." test "Yesterday night was fun." "Last night was fun." test "Yesterday night, we watched a movie." "Last night, we watched a movie." test "They left yesterday night after the show." "They left last night after the show." allows "I remember last night clearly." ================================================ FILE: harper-core/src/linting/weir_rules/LaughOfAt.weir ================================================ expr main <([laugh, laughs, laughed, laughing] of [PRON, PROPN]), of> let message "Use `laugh at ...` instead of `laugh of ...` when pointing at someone." let description "Warns when `laugh` takes `of` before a person or pronoun and nudges writers toward the conventional `at`." let kind "Usage" let becomes "at" test "I laugh of him." "I laugh at him." test "She laughs of her teacher." "She laughs at her teacher." test "They laughed of us in the hallway." "They laughed at us in the hallway." test "He's laughing of them already." "He's laughing at them already." test "We laugh of you whenever you wear that hat." "We laugh at you whenever you wear that hat." test "Laugh of John while he waits." "Laugh at John while he waits." test "Don't laugh of your teammate again." "Don't laugh at your teammate again." test "The crowd laughs of Mary when she trips." "The crowd laughs at Mary when she trips." test "I was laughing of Alex when the joke landed." "I was laughing at Alex when the joke landed." test "They laugh of me even when I'm serious." "They laugh at me even when I'm serious." allows "The laugh of the audience shook the rafters." allows "That's the laugh of the most relentless critic." allows "The laugh of the baby warmed everyone." allows "We had a laugh of relief when it ended." allows "A laugh of astonishment escaped him." allows "Her laugh of disbelief made us pause." allows "The laugh of a friend sounded distant." allows "I savor the laugh of children playing outside." ================================================ FILE: harper-core/src/linting/weir_rules/LeaveToFor.weir ================================================ expr main <([leave, leaves, left, leaving] to [PROPN] [next, tomorrow, soon]), to> let message "Use `for` when pointing a departure toward a place." let description "When describing travel plans that include a destination and a time frame, prefer `leave for a destination` instead of `leave to a destination`." let kind "Usage" let becomes "for" let strategy "MatchCase" test "They are leaving to England soon." "They are leaving for England soon." test "We leave to Japan tomorrow morning." "We leave for Japan tomorrow morning." test "He leaves to Canada next week." "He leaves for Canada next week." test "We're leaving to Morocco next fall." "We're leaving for Morocco next fall." test "They're leaving to France tomorrow." "They're leaving for France tomorrow." test "My team leaves to London soon for the conference." "My team leaves for London soon for the conference." test "We are leaving to Brazil soon." "We are leaving for Brazil soon." test "I leave to Spain next Monday." "I leave for Spain next Monday." test "He left to Italy soon after the ceremony." "He left for Italy soon after the ceremony." test "The crew is leaving to Paris soon." "The crew is leaving for Paris soon." allows "I leave it to you." allows "Leave it to me, and I'll handle it." allows "We are leaving to the west soon." allows "We left to surprise them." allows "They leave to inform the board tomorrow." ================================================ FILE: harper-core/src/linting/weir_rules/LetAlone.weir ================================================ expr main (let along) let message "Did you mean `let alone`?" let description "Changes `let along` to `let alone`." let kind "Typo" let becomes "let alone" test "let along" "let alone" ================================================ FILE: harper-core/src/linting/weir_rules/LikeAsIf.weir ================================================ expr main (like as if) let message "Avoid redundancy. Use either `like` or `as if`." let description "Corrects redundant `like as if` to `like` or `as if`." let becomes ["like", "as if"] test "And looks like as if linux-personality hasn't got any changes for 8 years." "And looks as if linux-personality hasn't got any changes for 8 years." test "She looks like as if she’s tired." "She looks as if she’s tired." test "He seems like as if he’s happy." "He seems as if he’s happy." test "It feels like as if it’s a dream." "It feels as if it’s a dream." allows "She acts like a hero." test "She seems like as if she’s in love." "She seems as if she’s in love." ================================================ FILE: harper-core/src/linting/weir_rules/LikeThePlague.weir ================================================ expr main (like a plague) let message "`Things are avoided `like the plague` not `like a plague`." let description "Corrects `like a plague` to `like the plague`." let kind "Usage" let becomes "like the plague" test "Below is the worst example of them all (avoid such coding like a plague):" "Below is the worst example of them all (avoid such coding like the plague):" ================================================ FILE: harper-core/src/linting/weir_rules/LikeTheresNoTomorrow.weir ================================================ expr main (like no tomorrow) let message "The correct phrase is `like there's no tomorrow`." let description "Corrects `like no tomorrow` to `like there's no tomorrow`." let kind "Usage" let becomes "like there's no tomorrow" test "Also, AI is getting pushed like no tomorrow, on so many levels im personally seeing it's honestly staggering." "Also, AI is getting pushed like there's no tomorrow, on so many levels im personally seeing it's honestly staggering." ================================================ FILE: harper-core/src/linting/weir_rules/LikelyHood.weir ================================================ expr main (likely hood) let message "Merge `likely hood` into the established noun `likelihood`." let description "Treat the split tokens as one compound word (`likelihood`) whenever the adjective `likely` precedes `hood`." let kind "Usage" let becomes "likelihood" let strategy "MatchCase" # True positives test "likely hood" "likelihood" test "Likely hood" "Likelihood" test "The likely hood of rain has me packing an umbrella." "The likelihood of rain has me packing an umbrella." test "We treat that likely hood as a probability metric." "We treat that likelihood as a probability metric." test "An analyst improved on his likely hood forecast." "An analyst improved on his likelihood forecast." test "The likely hood of data loss grows with age." "The likelihood of data loss grows with age." test "Another likely hood sample shows the same pattern." "Another likelihood sample shows the same pattern." test "My likely hood estimation improved yesterday." "My likelihood estimation improved yesterday." test "Likely hood matters more than a coin flip." "Likelihood matters more than a coin flip." test "Treat that likely hood carefully." "Treat that likelihood carefully." # Seek to leave everything else untouched allows "The hood is dark and damp." allows "I like your hooded jacket; it's warm." allows "Likely, the hood is black tonight." allows "The likelihood is already high so we celebrate." allows "He feared the hoods in the alley." ================================================ FILE: harper-core/src/linting/weir_rules/LinesOfCode.weir ================================================ expr main [(line of codes), (lines of codes)] let message "The correct plural is `lines of code`." let description "Corrects pluralizing the wrong noun in `lines of code`." let kind "Usage" let becomes "lines of code" test "These are line of codes we should refactor." "These are lines of code we should refactor." test "We removed several lines of codes yesterday." "We removed several lines of code yesterday." ================================================ FILE: harper-core/src/linting/weir_rules/LooksLikes.weir ================================================ expr main <([looks, looked, looking] likes), likes> let message "Drop the extra `s` in `likes` when it immediately follows a form of `look`." let description "This rule turns `looks likes`, `looked likes`, and `looking likes` into the idiomatic `look ... like`." let kind "Typo" let becomes "like" test "It looks likes the same story." "It looks like the same story." test "The memoir looked likes a diary." "The memoir looked like a diary." test "The detective is looking likes the culprit." "The detective is looking like the culprit." test "She looks likes, honestly, a champion." "She looks like, honestly, a champion." test "LOOKS LIKES a bad omen." "LOOKS LIKE a bad omen." test "It looked LIKES a mirage." "It looked LIKE a mirage." test "He is looking LIKES his brother." "He is looking LIKE his brother." test "Looks likes both people are arriving." "Looks like both people are arriving." test "She looked likes, well there it is." "She looked like, well there it is." test "Those who are looking likes a miracle never arrive." "Those who are looking like a miracle never arrive." test "Looks likes the worst scenario." "Looks like the worst scenario." allows "Looks like the winner." allows "He likes to code every day." allows "She looked like a star." allows "I was looking carefully." allows "I like how it looks." allows "Like how he likes the team." ================================================ FILE: harper-core/src/linting/weir_rules/LowHangingFruit.weir ================================================ expr main [(low[-, ( )]hanging fruits), (low hanging fruit)] let message "The standard form is `low-hanging fruit` with a hyphen and singular form." let description "Corrects nonstandard variants of `low-hanging fruit`." let kind "Usage" let becomes "low-hanging fruit" test "If you add me as a collaborator i can start merging some of the low hanging fruit." "If you add me as a collaborator i can start merging some of the low-hanging fruit." test "Field guide to gather low-hanging fruits." "Field guide to gather low-hanging fruit." test "Will search for low hanging fruits and useful information for escalation on a compromised workstation." "Will search for low-hanging fruit and useful information for escalation on a compromised workstation." ================================================ FILE: harper-core/src/linting/weir_rules/ManagerialReins.weir ================================================ expr main (managerial reigns) let message "Swap in `reins` when talking about control of a team or project." let description "Corrects the eggcorn `managerial reigns` to the idiomatic `managerial reins`." let kind "Eggcorn" let becomes "managerial reins" test "She grabbed the managerial reigns during the crisis." "She grabbed the managerial reins during the crisis." test "Managerial reigns are never easy to hand over." "Managerial reins are never easy to hand over." test "The managerial reigns belong to Carla now." "The managerial reins belong to Carla now." test "By winter, he held the managerial reigns, and morale improved." "By winter, he held the managerial reins, and morale improved." test "Who will hold the managerial reigns after April?" "Who will hold the managerial reins after April?" test "\"managerial reigns\" showed up in the draft notes." "\"managerial reins\" showed up in the draft notes." allows "He kept the managerial reins despite the reshuffle." allows "Legends of ancient reigns filled the museum." test "They debated who should manage the managerial reigns for the quarter." "They debated who should manage the managerial reins for the quarter." test "Their memo shouted MANAGERIAL REIGNS." "Their memo shouted MANAGERIAL REINS." ================================================ FILE: harper-core/src/linting/weir_rules/MercedesBenzHyphen.weir ================================================ expr main (Mercedes Benz) let message "Hyphenate the two components of this classic Mercedes-Benz trademark." let description "Connect the separate words `Mercedes` and `Benz` whenever they appear together so the brand stays consistent with its official styling." let kind "Spelling" let becomes "Mercedes-Benz" let strategy "Exact" # True positives test "Mercedes Benz is iconic." "Mercedes-Benz is iconic." test "Have you seen Mercedes Benz commercials?" "Have you seen Mercedes-Benz commercials?" test "I booked a Mercedes Benz for the demo." "I booked a Mercedes-Benz for the demo." test "mercedes benz is fast." "Mercedes-Benz is fast." test "MERCEDES BENZ leads the standings." "Mercedes-Benz leads the standings." test "My neighbor bought a Mercedes Benz." "My neighbor bought a Mercedes-Benz." test "The Mercedes Benz, as a brand, makes waves." "The Mercedes-Benz, as a brand, makes waves." test "Mercedes Benz should never be split." "Mercedes-Benz should never be split." test "Mercedes Benz and BMW kept things exciting." "Mercedes-Benz and BMW kept things exciting." test "The factory's Mercedes Benz fleet grows." "The factory's Mercedes-Benz fleet grows." test "Mercedes Benz will celebrate 100 years next year." "Mercedes-Benz will celebrate 100 years next year." test "Testing shows Mercedes Benz is still relevant." "Testing shows Mercedes-Benz is still relevant." # False positives / true negatives allows "Mercedes-Benz is in the race." allows "I drove a Benz and a Mercedes the same day." # False negatives (current limitation: possessive suffix) allows "Mercedes Benz's heritage is storied." ================================================ FILE: harper-core/src/linting/weir_rules/MissingDeterminer.weir ================================================ expr techNoun [bug, case, change, comment, feature, fix, log, note, problem, reason, report, repro, reproduction, request, response, scenario, screenshot, solution, step, summary, test, ticket, answer, example, explanation, idea, issue, update] expr requestNounHead @techNoun expr requestBareNounPhrase [@requestNounHead, (ADJ @requestNounHead), (ADJ ADJ @requestNounHead), (ADV ADJ @requestNounHead), (ADV ADJ ADJ @requestNounHead), (@requestNounHead @requestNounHead), (ADJ @requestNounHead @requestNounHead), (ADV ADJ @requestNounHead @requestNounHead)] expr narrativeNoun [portrait, nest, glass, hand, coin, toy, victor] expr narrativeBareNounPhrase [@narrativeNoun, (ADJ @narrativeNoun)] expr requestMissingDet <([get, provide, give, send, share, attach, include, add, need, want, see, submit, create, report, file, reproduce] @requestBareNounPhrase), ( )> expr narrativeVerbObjectMissingDet <([painted, built, dropped, raised, found, hid, cheered] @narrativeBareNounPhrase), ( )> expr narrativePrepObjectMissingDet <([in, on] [studio, tree, floor]), ( )> expr main [@requestMissingDet, @narrativeVerbObjectMissingDet, @narrativePrepObjectMissingDet] let message "Add a determiner before this noun phrase." let description "Detects likely missing determiners in common request phrases and offers to insert one where necessary." let kind "Grammar" let becomes [" the ", " a ", " an "] test "would it be possible to get reproducible example of this?" "would it be possible to get a reproducible example of this?" test "Would it be possible to get reproducible bug report?" "Would it be possible to get a reproducible bug report?" test "Please provide detailed reproduction of this issue." "Please provide a detailed reproduction of this issue." test "Can you send minimal test case?" "Can you send a minimal test case?" test "We need quick response." "We need a quick response." test "I can attach short log." "I can attach a short log." test "Please share minimal repro." "Please share a minimal repro." test "Could you submit small change?" "Could you submit a small change?" test "Please provide reproducible example, thanks." "Please provide a reproducible example, thanks." test "We should create clear summary." "We should create a clear summary." test "Please provide the report." "Please provide the report." test "Please provide your report." "Please provide your report." test "Please provide another report." "Please provide another report." test "Please provide more detailed report." "Please provide a more detailed report." test "We can file short ticket." "We can file a short ticket." test "Could you reproduce minimal scenario?" "Could you reproduce a minimal scenario?" test "Please send clear explanation." "Please send a clear explanation." test "We need simple fix." "We need a simple fix." test "I want quick update." "I want a quick update." test "Could you share detailed response?" "Could you share a detailed response?" test "Please attach short screenshot." "Please attach a short screenshot." test "We should include short note." "We should include a short note." test "Please give minimal reproduction." "Please give a minimal reproduction." test "Can you add brief comment?" "Can you add a brief comment?" test "We want new feature." "We want a new feature." test "They need clear solution." "They need a clear solution." allows "Please provide an example of this." allows "Please provide the example." allows "Please provide your example." allows "Please provide another example." test "We want detailed explanation." "We want a detailed explanation." test "We need quick answer." "We need a quick answer." test "Please send clear update." "Please send a clear update." test "Please provide brief summary." "Please provide a brief summary." test "The artist painted portrait in studio." "The artist painted a portrait in the studio." test "The bird built nest in tree." "The bird built a nest in the tree." test "The child dropped glass on floor." "The child dropped the glass on the floor." test "The student raised hand quietly." "The student raised a hand quietly." test "The child found coin outside." "The child found a coin outside." test "The child hid toy nearby." "The child hid a toy nearby." test "The crowd cheered victor loudly." "The crowd cheered the victor loudly." allows "Let's do this for good measure." allows "This is a test to make sure we don't split up paragraphs on newlines." allows "This URL is used by the console to properly generate URLs when using the Artisan command line tool." allows "The timezone is set to \"UTC\" by default as it is suitable for most use cases." allows "This option can be set to any locale for which you plan to have translation strings." allows "Use it to show ownership." allows "This rule attempts to find common errors with redundancy and contractions that may lead to confusion for readers." allows "ACF is a powerful tool that allows you to add custom fields to your content, providing greater flexibility in how you manage and display information." allows "Historical records, colonial archives (however problematic their provenance), and oral histories from surviving communities, even if fragmented and distorted, provide crucial data points." allows "Traditional cartography relies on observable features – mountains, rivers, coastlines – to create representations of space." allows "My grandfather built timepieces to mark the passage of moments." allows "I made a note to encourage Eleanor to share more stories with him; reminiscing often proved beneficial for patients struggling with respiratory distress." ================================================ FILE: harper-core/src/linting/weir_rules/Monumentous.weir ================================================ expr main (monumentous) let message "Retain `monumentous` for jocular effect. Otherwise `momentous` indicates great signifcance while `monumental` indicates imposing size." let description "Advises using `momentous` or `monumental` instead of `monumentous` for serious usage." let kind "Nonstandard" let becomes ["momentous", "monumental"] test "monumentous" "momentous" test "I think that would be a monumentous step in the right direction, and would DEFINATLY turn heads in not just the music industry, but every ..." "I think that would be a momentous step in the right direction, and would DEFINATLY turn heads in not just the music industry, but every ..." ================================================ FILE: harper-core/src/linting/weir_rules/MoreThatLikely.weir ================================================ expr main <(more that likely), that> let message "Did you mean `more than likely`?" let description "Corrects the common typo `more that likely` to `more than likely`." let kind "Typo" let becomes "than" let strategy "MatchCase" # True positives test "It is more that likely a typo." "It is more than likely a typo." test "More that likely this is due to a config issue." "More than likely this is due to a config issue." test "There is more that likely some obvious solution." "There is more than likely some obvious solution." test "It's more that likely that I messed something up." "It's more than likely that I messed something up." test "MORE THAT LIKELY this broke in the last release." "MORE THAN LIKELY this broke in the last release." test "So it is more that likely a bug." "So it is more than likely a bug." # False positives / true negatives allows "It is more than likely a typo." allows "More than likely this is a config issue." allows "There is more that I need to tell you." allows "I know more that could help." allows "He said more that day than usual." allows "She offered more that the others couldn't." ================================================ FILE: harper-core/src/linting/weir_rules/MyHouse.weir ================================================ expr main (mu house) let message "Did you mean `my house`?" let description "Fixes the typo `mu house` to `my house`." let kind "Typo" let becomes "my house" ================================================ FILE: harper-core/src/linting/weir_rules/NeedHelp.weir ================================================ expr main (ned help) let message "Did you mean `need help`?" let description "Changes `ned help` to the correct `need help`." let kind "Typo" let becomes "need help" ================================================ FILE: harper-core/src/linting/weir_rules/NerveRacking.weir ================================================ expr main [(nerve racking), (nerve wracking), (nerve wrecking), (nerve-wracking), (nerve-wrecking)] let message "Use `nerve-racking` for something that causes anxiety or tension." let description "Corrects common misspellings and missing hyphen in `nerve-racking`." let kind "Eggcorn" let becomes "nerve-racking" test "We've gone through several major changes / upgrades to atlantis, and it's always a little bit nerve-wracking because if we mess something up we ..." "We've gone through several major changes / upgrades to atlantis, and it's always a little bit nerve-racking because if we mess something up we ..." test "The issue happens to me on a daily basis, and it is nerve-wrecking because I become unsure if I have actually saved the diagram, but every time ..." "The issue happens to me on a daily basis, and it is nerve-racking because I become unsure if I have actually saved the diagram, but every time ..." test "Very nerve wracking landing in an unfamiliar mountainous airport in dead of night with no radar to show surrounding terrain." "Very nerve-racking landing in an unfamiliar mountainous airport in dead of night with no radar to show surrounding terrain." test "I appreciate any kind of help since this is kind of nerve wrecking." "I appreciate any kind of help since this is kind of nerve-racking." test "It's nerve racking to think about it because I have code inside the callback that resolves the member and somehow I feel like it's so .." "It's nerve-racking to think about it because I have code inside the callback that resolves the member and somehow I feel like it's so .." ================================================ FILE: harper-core/src/linting/weir_rules/NobelPeacePrize.weir ================================================ expr main [(noble [peace, piece] [price, prize, prise]), (nobel piece [price, prize, prise]), (nobel peace price), (nobel peace prise)] let message "Spell the name of the international peace award as Nobel Peace Prize." let description "Corrects the frequent typos that swap the Nobel/Peace/Prize spelling when people mention the prize." let kind "Typo" let becomes "Nobel Peace Prize" let strategy "Exact" # True positives test "He accepted the Noble Peace Price at the ceremony." "He accepted the Nobel Peace Prize at the ceremony." test "Our timeline mentions the Noble peace price until 1950." "Our timeline mentions the Nobel Peace Prize until 1950." test "noble peace price facts are easy to recap." "Nobel Peace Prize facts are easy to recap." test "Nobel piece price committees meet tonight." "Nobel Peace Prize committees meet tonight." test "nobel piece prize winners shared stories." "Nobel Peace Prize winners shared stories." test "Nobel piece prise ceremonies look ready." "Nobel Peace Prize ceremonies look ready." test "NOBLE PIECE PRICE stands out in the article." "Nobel Peace Prize stands out in the article." test "She referenced the noble piece price memo." "She referenced the Nobel Peace Prize memo." test "Noble Peace Prise references appear frequently." "Nobel Peace Prize references appear frequently." test "nobel peace prise news alerted the team." "Nobel Peace Prize news alerted the team." test "nobel piece price reports track the conference." "Nobel Peace Prize reports track the conference." test "The noble piece prise historian wrote a book." "The Nobel Peace Prize historian wrote a book." # True negatives / false positives test "The Nobel Peace Prize ceremony is broadcast worldwide." "The Nobel Peace Prize ceremony is broadcast worldwide." test "Nobel Prize for Peace winners remain inspiring." "Nobel Prize for Peace winners remain inspiring." test "Peace Prize winners celebrate after the award." "Peace Prize winners celebrate after the award." # Known false negatives test "The Nobel Peace Prices for the exhibition confuse some visitors." "The Nobel Peace Prices for the exhibition confuse some visitors." test "Stories mention the Noble Peace Prizes across years." "Stories mention the Noble Peace Prizes across years." ================================================ FILE: harper-core/src/linting/weir_rules/NotBeAfterNot.weir ================================================ expr beforms [am, is, are, was, were, be, been, being, I'm, you're, we're, they're, he's, she's, it's] expr complements [ADJ, ADP, ADV, DET, NOUN, NUM, PRON, PROPN, VERB, VBN, VBG] expr main <(@beforms not be @complements), (not be)> let message "When a negative clause already uses `be`, drop the extra `be` that follows `not`." let description "Removes the redundant linking verb that sneaks in between `not` and the predicate after a conjugated `be`." let kind "Grammar" let becomes "not" # True positives test "I am not be happy today." "I am not happy today." test "They are not be ready for the call." "They are not ready for the call." test "We were not be asked anything." "We were not asked anything." test "She is not be aware of the change." "She is not aware of the change." test "I am not be a doctor yet." "I am not a doctor yet." test "I'm not be prepared for that kind of question." "I'm not prepared for that kind of question." test "He was not be allowed to speak last night." "He was not allowed to speak last night." test "If you are not be careful, the paint will drip." "If you are not careful, the paint will drip." test "The group was not be thinking about that possibility." "The group was not thinking about that possibility." test "I am not be in the mood today." "I am not in the mood today." test "They were not be sure yet." "They were not sure yet." test "He is not be already there." "He is not already there." test "You are not be of much help today." "You are not of much help today." test "The team were not be attending the show." "The team were not attending the show." test "I am not be comfortable sharing that yet." "I am not comfortable sharing that yet." # True negatives / false-positive guards allows "They will not be ready for the call." allows "I am not being difficult with you." allows "We are not the group who can finish this." allows "She was not a fan of the show." allows "I'm not sure if that will work." ================================================ FILE: harper-core/src/linting/weir_rules/NotIn.weir ================================================ expr main (no in) let message "Use `not in` for correct grammar." let description "Replaces `no in` with `not in`." let kind "Typo" let becomes "not in" ================================================ FILE: harper-core/src/linting/weir_rules/NotTo.weir ================================================ expr main (no to) let message "Did you mean `not to`?" let description "Corrects `no to` to `not to`, ensuring proper negation." let kind "Typo" let becomes "not to" ================================================ FILE: harper-core/src/linting/weir_rules/NowWay.weir ================================================ expr main <([(now way [to, of, for, finished, workflows]), (of now way), (in now way)]), now> let message "Did you mean `no way`?" let description "Corrects `now way` to `no way` in high-confidence contexts while avoiding comparative contexts like `now way too`." let kind "Typo" let becomes "no" let strategy "MatchCase" # True positives test "However, there is now way to open this console." "However, there is no way to open this console." test "it's in now way finished or usable (which, quite honestly, is a shame....)." "it's in no way finished or usable (which, quite honestly, is a shame....)." test "There is now way of retrieving info about a directive at startup." "There is no way of retrieving info about a directive at startup." test "I know of now way, especially programmatically, to get the latest version of Cursor available." "I know of no way, especially programmatically, to get the latest version of Cursor available." test "there is now way to enable 24bit colors in windows powershell / pwsh" "there is no way to enable 24bit colors in windows powershell / pwsh" test "Basically, in now way, shape, or form should use lib be part of the solution here." "Basically, in no way, shape, or form should use lib be part of the solution here." test "As of now there is now way to document the concurrent statements in doxygen." "As of now there is no way to document the concurrent statements in doxygen." test "But there seems now way for the extension to do that." "But there seems no way for the extension to do that." test "No we tried to make it work using the current props, but there was just now way to do it using options and value" "No we tried to make it work using the current props, but there was just no way to do it using options and value" test "There is currently now way workflows can store custom variables/values in a deterministic and persistent way." "There is currently no way workflows can store custom variables/values in a deterministic and persistent way." test "You found now way to use atuin for its syncing features, but use fzf for fuzzy searching the atuin history then?" "You found no way to use atuin for its syncing features, but use fzf for fuzzy searching the atuin history then?" # Guardrails / false positives allows "Sorry, but it's now way beyond my OpenGL knowledge." allows "Popups are now way too intrusive, they block the rest of the screen and make it unresponsive" allows "not a good practice since SB 4 has now way more starters for testing" allows "in the middle of rewriting a big update for a game im now way past schedule for" allows "the thumbnail and previews created are now way too light and unusable" allows "There are now way less vague and more specific cases of export behaviour I don't understand or I think are just wrong." allows "ready to be read after the (now way shorter) expiration" allows "but I think the references are now way more consistent in Conan" # Ambiguous intent allows "It was quite helpful with longer prompts that tend to be now way less precise due to the lack of todo tool and loss of context mid response." ================================================ FILE: harper-core/src/linting/weir_rules/OffTheCuff.weir ================================================ expr main (off the cuff) let message "Use the hyphenated form for `off-the-cuff`." let description "Ensures `off-the-cuff` is correctly hyphenated." let kind "Punctuation" let becomes "off-the-cuff" ================================================ FILE: harper-core/src/linting/weir_rules/OldWivesTale.weir ================================================ expr main (old wise tale) let message "Use the correct phrase for a superstition or myth." let description "Corrects `old wise tale` to `old wives' tale`, preserving the phrase’s meaning as an unfounded traditional belief." let kind "Eggcorn" let becomes "old wives' tale" ================================================ FILE: harper-core/src/linting/weir_rules/OnFirstGlance.weir ================================================ expr main <([(on first glance), (on a first glance), (on the first glance)]), ([on])> let message "Use `at first glance` instead of `on first glance` when describing an immediate impression." let description "The standard idiom starts with `at` for quick appraisals, so swap the preposition to keep the phrase idiomatic." let kind "Usage" let becomes "at" let strategy "MatchCase" # True positives test "On first glance it seems like a good plan." "At first glance it seems like a good plan." test "On first glance, the homepage felt fast." "At first glance, the homepage felt fast." test "On a first glance the credential list looked complete." "At a first glance the credential list looked complete." test "On the first glance I took at the draft, the tone felt steady." "At the first glance I took at the draft, the tone felt steady." test "ON FIRST GLANCE the tab looked empty." "AT FIRST GLANCE the tab looked empty." test "On first glance we thought the fix had landed." "At first glance we thought the fix had landed." # False negatives (should also trigger) test "On first glance? the fix seemed ready." "At first glance? the fix seemed ready." test "On a first glance when scanning the changelog, there were no errors." "At a first glance when scanning the changelog, there were no errors." test "On the first glance at the dashboard nothing seemed off." "At the first glance at the dashboard nothing seemed off." test "On first glance--before the audit--the facade looked clean." "At first glance--before the audit--the facade looked clean." # Guardrails / false positives / true negatives test "At first glance the patch was a keeper." "At first glance the patch was a keeper." test "My first glance at the console logs offered little insight." "My first glance at the console logs offered little insight." test "First glance data points still need verification." "First glance data points still need verification." test "The timeline on the first slide looked accurate." "The timeline on the first slide looked accurate." test "He always writes `on first` as part of a headline." "He always writes `on first` as part of a headline." ================================================ FILE: harper-core/src/linting/weir_rules/OnSecondThought.weir ================================================ expr main <([on, my] second though), (second though)> let message "Idiomatic expression: use `on second thought` instead of `on second though`" let description "Replaces the nonstandard `on second though` with the common idiom `on second thought` to indicate reconsideration." let kind "Typo" let becomes "second thought" test "I was going to buy it, but on second though, maybe I'll wait." "I was going to buy it, but on second thought, maybe I'll wait." allows "She considered driving home, but on second thought, she decided to walk." test "My second though is that I'd prefer something else entirely." "My second thought is that I'd prefer something else entirely." ================================================ FILE: harper-core/src/linting/weir_rules/OnTheSpurOfTheMoment.weir ================================================ expr main [(on the spurt of the moment), (at the spur of the moment), (in the spur of the moment), (in the spurt of the moment)] let message "Use the correct phrase for acting spontaneously." let description "Ensures the correct use of `on the spur of the moment`, avoiding nonstandard variations." let kind "Eggcorn" let becomes "on the spur of the moment" test "Quite often in the spurt of the moment, someone will say something which they think is witty." "Quite often on the spur of the moment, someone will say something which they think is witty." test "but at the spur of the moment, I'd say that ansible-lint should work exactly like ansible" "but on the spur of the moment, I'd say that ansible-lint should work exactly like ansible" test "an assortment of things I started yesterday in the spur of the moment" "an assortment of things I started yesterday on the spur of the moment" ================================================ FILE: harper-core/src/linting/weir_rules/OnTopOf.weir ================================================ expr main [(ontop of), (in top of)] let message "Did you mean `on top of`?" let description "Corrects `ontop of` and `in top of` to `on top of`." let kind "Usage" let becomes "on top of" test "Initcpio hooks for overlayfs ontop of root." "Initcpio hooks for overlayfs on top of root." test "This project is a proof of concept to enable all the awesome features of BrowserSync in top of a Play Framework server." "This project is a proof of concept to enable all the awesome features of BrowserSync on top of a Play Framework server." ================================================ FILE: harper-core/src/linting/weir_rules/OnceInAWhile.weir ================================================ expr main [(once a while), (once and a while)] let message "The correct idiom is `once in a while`." let description "Corrects two common malapropisms of `once in a while`." let kind "Usage" let becomes "once in a while" test "For me it is a SMB mount I have on the client device that I sync only once a while for a backup into the cloud." "For me it is a SMB mount I have on the client device that I sync only once in a while for a backup into the cloud." test "Every once and a while all the links on my page seem to stop working." "Every once in a while all the links on my page seem to stop working." ================================================ FILE: harper-core/src/linting/weir_rules/OneFellSwoop.weir ================================================ expr main [(one foul swoop), (one fowl swoop)] let message "Use the correct phrase for something happening suddenly." let description "Corrects `one foul swoop` to `one fell swoop`, preserving the phrase’s original meaning of sudden and complete action." let kind "Eggcorn" let becomes "one fell swoop" test "I just want to turn OFF all of the Controllers with one foul swoop." "I just want to turn OFF all of the Controllers with one fell swoop." test "I am trying to delete the image and it's associated thumbnail in one fowl swoop." "I am trying to delete the image and it's associated thumbnail in one fell swoop." ================================================ FILE: harper-core/src/linting/weir_rules/OneHanded.weir ================================================ expr main <([one, two] handed ![DET, PRON, ADP, PUNCT]), ([one, two] handed)> let message "Keep the numeral and 'handed' joined as a hyphenated modifier when they describe a noun." let description "Treat 'one handed' and 'two handed' as single adjectives before nouns so the measurement stays attached to 'handed'." let kind "Punctuation" let becomes ["one-handed", "two-handed"] let strategy "MatchCase" # True positives # The hyphenated form is preferred whenever the compound modifies a noun. test "A one handed catch can seal the win." "A one-handed catch can seal the win." test "We built two handed handles for the door." "We built two-handed handles for the door." test "The mechanic admired that one handed tool." "The mechanic admired that one-handed tool." test "Two handed swords need extra clearance." "Two-handed swords need extra clearance." test "one handed work is still performed by skilled climbers." "one-handed work is still performed by skilled climbers." test "Our Two Handed lift completed the load." "Our Two-Handed lift completed the load." test "Two handed heavy lifts stress the crew." "Two-handed heavy lifts stress the crew." test "Her one handed strike knocked them down." "Her one-handed strike knocked them down." test "The two handed mammal puppet looked real." "The two-handed mammal puppet looked real." test "ONE HANDED MOVES LOOK ELEGANT ON STAGE." "ONE-HANDED MOVES LOOK ELEGANT ON STAGE." test "The two handed steel brace kept flex to a minimum." "The two-handed steel brace kept flex to a minimum." test "Our two handed design earned praise from the panel." "Our two-handed design earned praise from the panel." test "a one handed grip is required for that maneuver." "a one-handed grip is required for that maneuver." # True negatives / false positives # These scenarios treat 'handed' as a verb or object, so they should stay untouched. test "No one handed them anything." "No one handed them anything." test "One handed me a basket and left." "One handed me a basket and left." test "All but one handed in their notices." "All but one handed in their notices." test "One handed the baton to his mate." "One handed the baton to his mate." test "Two handed the paperwork to the new hire." "Two handed the paperwork to the new hire." ================================================ FILE: harper-core/src/linting/weir_rules/OutOfSync.weir ================================================ expr main (out of sink) let message "Did you mean `out of sync` or `out of synch`?" let description "Corrects `out of sink` to `out of sync` or `out of synch`." let kind "Spelling" let becomes ["out of sync", "out of synch"] test "This results in the NavigationStack getting out of sink" "This results in the NavigationStack getting out of sync" test "Currently, data/costs.scv file is out of sink with the model and must be updated to match the requirements of the sector-coupled version." "Currently, data/costs.scv file is out of synch with the model and must be updated to match the requirements of the sector-coupled version." ================================================ FILE: harper-core/src/linting/weir_rules/PartsOfSpeech.weir ================================================ expr main [(part of speeches), (parts of speeches)] let message "The correct plural is `parts of speech`." let description "Corrects pluralizing the wrong noun in `part of speech`." let kind "Grammar" let becomes "parts of speech" test "Learning the part of speeches is important." "Learning the parts of speech is important." test "We studied parts of speeches yesterday." "We studied parts of speech yesterday." ================================================ FILE: harper-core/src/linting/weir_rules/PasswordProtectedHyphen.weir ================================================ expr main <(password protected [(area), (areas), (document), (documents), (doc), (docs), (spreadsheet), (spreadsheets), (archive), (archives), (zip), (zips), (pdf), (pdfs), (folder), (folders), (system), (systems), (page), (pages), (website), (websites), (site), (sites), (file), (files), (account), (accounts), (drive), (drives), (stick), (sticks), (usb), (usbs), (excel), (apps), (app), (cd), (cds), (dropbox), (dropboxes), (email), (emails), (gallery), (galleries), (iphone), (iphones)]), (password protected)> let message "Hyphenate `password-protected` when the phrase modifies a following resource." let description "Keeps the compound adjective together before nouns like folders, files, or web pages so the dependency between them is clear." let kind "Style" let becomes "password-protected" test "A password protected area restricts access." "A password-protected area restricts access." test "We store logs in a password protected folder." "We store logs in a password-protected folder." test "Please send the password protected document tomorrow." "Please send the password-protected document tomorrow." test "The password protected spreadsheet contains numbers." "The password-protected spreadsheet contains numbers." test "They locked the password protected archive." "They locked the password-protected archive." test "Bring the password protected pdf to the meeting." "Bring the password-protected pdf to the meeting." test "That password protected page requires a login." "That password-protected page requires a login." test "This password protected website is for beta users." "This password-protected website is for beta users." test "Our password protected file sits on the drive." "Our password-protected file sits on the drive." test "The password protected account holds secrets." "The password-protected account holds secrets." test "Their password protected app went live." "Their password-protected app went live." test "We updated the password protected system this morning." "We updated the password-protected system this morning." test "These password protected folders double as backups." "These password-protected folders double as backups." test "Password protected emails pile up." "Password-protected emails pile up." test "The password protected gallery remains hidden." "The password-protected gallery remains hidden." test "A password protected iphone case is ready." "A password-protected iphone case is ready." test "A password protected drive keeps everything safe." "A password-protected drive keeps everything safe." allows "The area is password protected." allows "She mentioned password protected with no follow-up." allows "The password protected from clause does not match." ================================================ FILE: harper-core/src/linting/weir_rules/PeaceOfMind.weir ================================================ expr main (piece of mind) let message "The phrase is `peace of mind`, meaning `calm`. A `piece` is a `part` of something." let description "Corrects `piece of mind` to `peace of mind`." let kind "Eggcorn" let becomes "peace of mind" test "A Discord bot that gives you piece of mind knowing you are free from obnoxious intrusions in a Discord Voice Channel" "A Discord bot that gives you peace of mind knowing you are free from obnoxious intrusions in a Discord Voice Channel" ================================================ FILE: harper-core/src/linting/weir_rules/PedalToTheMetal.weir ================================================ expr main pedal to the medal let message "Use the idiom `pedal to the metal`." let description "Corrects the eggcorn `pedal to the medal` to the standard idiom `pedal to the metal`, meaning to accelerate at full speed." let kind "Typo" let becomes "pedal to the metal" test "pedal to the medal" "pedal to the metal" test "Pedal to the medal when you see the green flag." "Pedal to the metal when you see the green flag." test "The coach shouted pedal to the medal before the jump." "The coach shouted pedal to the metal before the jump." test "We pedal to the medal whenever the lights go yellow." "We pedal to the metal whenever the lights go yellow." test "Pedal to the medal is how you fly out of the gate." "Pedal to the metal is how you fly out of the gate." test "He loves to say pedal to the medal while revving engines." "He loves to say pedal to the metal while revving engines." test "Pedal to the medal in these conditions and the tyres scream." "Pedal to the metal in these conditions and the tyres scream." test "Pedal to the medal, please, once we cross the start line." "Pedal to the metal, please, once we cross the start line." test "Keep saying pedal to the medal until the rival hears it." "Keep saying pedal to the metal until the rival hears it." test "PEDAL TO THE MEDAL seems to be the rally cry." "PEDAL TO THE METAL seems to be the rally cry." allows "Pedal to the metal is the correct idiom." allows "She earned a medal for her performance." allows "The medal ceremony happened before the race." allows "Pedal to the mettle, not the medal, outlines courage." allows "The medal in our archive dates to 1895." allows "They pedaled to the medal." ================================================ FILE: harper-core/src/linting/weir_rules/PerSe.weir ================================================ expr main [(per say), (per-se), (per-say)] let message "The correct spelling is `per se` (with no hyphen)" let description "Corrects common misspellings of `per se`." let kind "Spelling" let becomes "per se" test "It's not a problem per-se, but it would make the desktop more consistent when using QT and KDE apps." "It's not a problem per se, but it would make the desktop more consistent when using QT and KDE apps." test "Hi all - not really an issue per say, but more of a request for some suggestions and guidance." "Hi all - not really an issue per se, but more of a request for some suggestions and guidance." test "Whilst I don't think this is wrong per-say, I'm not confident it is necessary." "Whilst I don't think this is wrong per se, I'm not confident it is necessary." ================================================ FILE: harper-core/src/linting/weir_rules/PointsOfView.weir ================================================ expr main (point of views) let message "The correct plural is `points of view`." let description "Corrects pluralizing the wrong noun in `point of view`." let kind "Grammar" let becomes "points of view" test "This will produce a huge amount of raw data, representing the region in multiple point of views." "This will produce a huge amount of raw data, representing the region in multiple points of view." ================================================ FILE: harper-core/src/linting/weir_rules/PortAuPrince.weir ================================================ expr main (Port au Prince) let message "The official spelling is hyphenated." let description "Checks for the correct official name of the capital of Haiti." let kind "Punctuation" let becomes "Port-au-Prince" ================================================ FILE: harper-core/src/linting/weir_rules/PortoNovo.weir ================================================ expr main (Porto Novo) let message "The official spelling is hyphenated." let description "Checks for the correct official name of the capital of Benin." let kind "Punctuation" let becomes "Porto-Novo" ================================================ FILE: harper-core/src/linting/weir_rules/PrayingMantis.weir ================================================ expr main (preying mantis) let message "Use the insect's correct name." let description "Corrects `preying mantis` to `praying mantis`, ensuring accurate reference to the insect’s characteristic pose." let kind "Eggcorn" let becomes "praying mantis" ================================================ FILE: harper-core/src/linting/weir_rules/QuiteMany.weir ================================================ expr main (quite many) let message "Use `quite a few` instead of `quite many`." let description "Corrects `quite many` to `quite a few`, which is the more natural and idiomatic phrase in standard English. `Quite many` is considered nonstandard usage." let kind "Nonstandard" let becomes "quite a few" test "To me it seems it might be caused by a2aaa55 which contains quite many build-related changes." "To me it seems it might be caused by a2aaa55 which contains quite a few build-related changes." ================================================ FILE: harper-core/src/linting/weir_rules/RainbowColoredHyphen.weir ================================================ expr main <(([rainbow, cream] [colored, coloured]) NOUN), ( )> let message "Keep these compound color modifiers hyphenated before their nouns." let description "When rainbow-colored or cream-colored describe a noun, replace the space between the color words with a hyphen to keep the modifier cohesive." let kind "Style" let becomes "-" test "The rainbow colored leaves shimmered in the morning light." "The rainbow-colored leaves shimmered in the morning light." test "A cream colored sofa anchored the living room." "A cream-colored sofa anchored the living room." test "Bright rainbow colored banners lined the promenade." "Bright rainbow-colored banners lined the promenade." test "Bring the cream colored napkins to the table." "Bring the cream-colored napkins to the table." test "RAINBOW COLORED FLAGS fluttered over the pier." "RAINBOW-COLORED FLAGS fluttered over the pier." test "Our designer introduced cream coloured sneakers for fall." "Our designer introduced cream-coloured sneakers for fall." test "These rainbow colored posters mark the festival days." "These rainbow-colored posters mark the festival days." test "Cream coloured curtains softened the gallery lights." "Cream-coloured curtains softened the gallery lights." test "The designer chose rainbow colored tiles for the backsplash." "The designer chose rainbow-colored tiles for the backsplash." test "Our lineup now shows cream colored lipsticks and rainbow colored gloss." "Our lineup now shows cream-colored lipsticks and rainbow-colored gloss." allows "The rainbow colored the sky with a soft gradient." allows "She rainbow colored every triangle on the quilt." allows "The artist cream colored the mural in minutes." allows "The leaves were rainbow colored after the festival lights." allows "Cream colored the vase intentionally for the commission." ================================================ FILE: harper-core/src/linting/weir_rules/RallyToReally.weir ================================================ expr main <([(am rally PROG), (am not rally PROG), (am PRON rally PROG), (am PRON not rally PROG), (is rally PROG), (is not rally PROG), (is PRON rally PROG), (is PRON not rally PROG), (isn't rally PROG), (isn't PRON rally PROG), (are rally PROG), (are not rally PROG), (are PRON rally PROG), (are PRON not rally PROG), (aren't rally PROG), (aren't PRON rally PROG), (was rally PROG), (was not rally PROG), (was PRON rally PROG), (was PRON not rally PROG), (wasn't rally PROG), (wasn't PRON rally PROG), (were rally PROG), (were not rally PROG), (were PRON rally PROG), (were PRON not rally PROG), (weren't rally PROG), (weren't PRON rally PROG), (be rally PROG), (be not rally PROG), (be PRON rally PROG), (be PRON not rally PROG), (being rally PROG), (being not rally PROG), (been rally PROG), (been not rally PROG), (ain't rally PROG), (ain't PRON rally PROG)]), (rally)> let message "Replace `rally` with `really` whenever a form of `be` introduces a progressive verb." let description "Catches the typo where `rally` sneaks into `be + ...ing` constructions, including common contractions." let kind "Typo" let becomes "really" let strategy "MatchCase" test "It is rally going to happen." "It is really going to happen." test "We are rally getting closer to shipping." "We are really getting closer to shipping." test "I am rally trying to finish this before midnight." "I am really trying to finish this before midnight." test "She is not rally learning the concept." "She is not really learning the concept." test "It isn't rally raining anymore." "It isn't really raining anymore." test "They were rally practicing their lines." "They were really practicing their lines." test "It was not rally raining on our drive." "It was not really raining on our drive." test "He had been rally preparing to leave." "He had been really preparing to leave." test "Ain't rally happening yet?" "Ain't really happening yet?" test "Weren't we rally celebrating that plan?" "Weren't we really celebrating that plan?" allows "Be rally precise when you describe the steps." test "He was RALLY going to go all night." "He was REALLY going to go all night." allows "The rally celebrating our victory lasted forever." allows "I really appreciate your effort." allows "Rally fans gathered outside the stadium." allows "We had a rally before the game." allows "The news rallied the team but left them motivated." allows "We were ready to rally around the idea." ================================================ FILE: harper-core/src/linting/weir_rules/RapidFire.weir ================================================ expr main (rapid fire) let message "It is more idiomatic to hypenate `rapid-fire`." let description "Checks to ensure writers hyphenate `rapid-fire`." let kind "Punctuation" let becomes "rapid-fire" ================================================ FILE: harper-core/src/linting/weir_rules/RealTrouper.weir ================================================ expr main (real trooper) let message "Use the correct phrase for someone who perseveres." let description "Ensures the correct use of `real trouper`, distinguishing it from `trooper`, which refers to a soldier or police officer." let kind "Eggcorn" let becomes "real trouper" ================================================ FILE: harper-core/src/linting/weir_rules/RedundantIIRC.weir ================================================ expr main [(if IIRC), (IIRC correctly)] let message "`IIRC` already means 'if I recall correctly', so adding 'if' or 'correctly' is redundant." let description "Flags redundant use of 'if' or 'correctly' with `IIRC`, since `IIRC` already stands for 'if I recall correctly'." let kind "Redundancy" let becomes "IIRC" let strategy "Exact" test "This is due to the fact that if IIRC up to 2 processes mpirun will bind to core and then it will be socket." "This is due to the fact that IIRC up to 2 processes mpirun will bind to core and then it will be socket." test "if iirc getting it to work with the SQLite storage engine was turning into a whole project and we decided to punt it" "IIRC getting it to work with the SQLite storage engine was turning into a whole project and we decided to punt it" test "IIRC correctly, someone on the Home Assistant forums went as far as discovering that RS-485 was being used." "IIRC, someone on the Home Assistant forums went as far as discovering that RS-485 was being used." ================================================ FILE: harper-core/src/linting/weir_rules/RedundantPretty.weir ================================================ expr main (pretty decent) let message "Avoid redundancy." let description "`Pretty` is redundant when modifying `decent`. Use `decent` alone." let kind "Style" let becomes "decent" test "The movie was pretty decent." "The movie was decent." test "It is pretty decent work." "It is decent work." test "She did a pretty decent job." "She did a decent job." test "That sounds pretty decent to me." "That sounds decent to me." test "We had a pretty decent time." "We had a decent time." test "The movie was Pretty Decent." "The movie was Decent." test "The movie was PRETTY DECENT." "The movie was DECENT." allows "The movie was pretty good." allows "The movie was decent." allows "It was quite decent." allows "Pretty much anything works." ================================================ FILE: harper-core/src/linting/weir_rules/RedundantThat.weir ================================================ expr main (that that) let message "Consider whether the second `that` adds meaning in this context." let description "There is rarely a situation where `that that` cannot be condensed into a single token." let kind "Repetition" let becomes "that" test "I know that that answer is correct" "I know that answer is correct" ================================================ FILE: harper-core/src/linting/weir_rules/RifeWith.weir ================================================ expr main (ripe with) let message "Use the correct phrase for something abundant." let description "Corrects `ripe with` to `rife with`, preserving the phrase’s meaning of being filled with something, often undesirable." let kind "Eggcorn" let becomes "rife with" ================================================ FILE: harper-core/src/linting/weir_rules/RoadMap.weir ================================================ expr main (roadmap) let message "Did you mean `road map`?" let description "Detects when `roadmap` is used instead of `road map`, prompting the correct spacing." let kind "WordChoice" let becomes "road map" ================================================ FILE: harper-core/src/linting/weir_rules/RulesOfThumb.weir ================================================ expr main [(rule of thumbs), (rule-of-thumbs)] let message "The correct plural is `rules of thumb`." let description "Corrects pluralizing the wrong noun in `rule of thumb`." let kind "Grammar" let becomes "rules of thumb" test "Thanks. 0.2 is just from my rule of thumbs." "Thanks. 0.2 is just from my rules of thumb." test "Add rule-of-thumbs for basic metrics, like \"Spill more than 1GB is a red flag\"." "Add rules of thumb for basic metrics, like \"Spill more than 1GB is a red flag\"." ================================================ FILE: harper-core/src/linting/weir_rules/SameAs.weir ================================================ expr main (same then) let message "Did you mean `same as`?" let description "Corrects the incorrect phrase `same then` to the standard `same as`." let kind "Grammar" let becomes "same as" ================================================ FILE: harper-core/src/linting/weir_rules/ScantilyClad.weir ================================================ expr main (scandally clad) let message "Use the correct phrase for minimal attire." let description "Fixes `scandally clad` to `scantily clad`, ensuring clarity in describing minimal attire." let kind "Eggcorn" let becomes "scantily clad" ================================================ FILE: harper-core/src/linting/weir_rules/SendAnEmailTo.weir ================================================ expr main (send an email to) let message "Use the shorter verb form." let description "Replaces the verbose phrase `send an email to` with the concise verb `email`." let kind "Style" let becomes "email" let strategy "Exact" test "Please send an email to John." "Please email John." test "I will send an email to the team later." "I will email the team later." test "SEND AN EMAIL TO support." "email support." test "Send An Email To HR." "email HR." test "Can you send an email to her?" "Can you email her?" test "They decided to send an email to all users." "They decided to email all users." test "Send an email to John, please." "email John, please." test "Before noon, send an email to marketing." "Before noon, email marketing." allows "Please write an email to John." allows "She sent a message to John." ================================================ FILE: harper-core/src/linting/weir_rules/ShutdownVerb.weir ================================================ expr helper [AUX, will, would, should, could, can, may, might, must, has, have, had, is, are, was, were, am, do, does, did] expr subject [PRON, PROPN, NOUN] expr main <([( @helper shutdown), (@helper @subject shutdown), (@helper not shutdown), (@helper @subject not shutdown), (@helper not @subject shutdown)]), shutdown> let message "Use the verbal phrase `shut down` whenever an auxiliary verb is pulling `shutdown` into a predicate." let description "Keeps `shutdown` as a noun when it stands alone but swaps it for the phrasal verb `shut down` whenever an auxiliary precedes it." let kind "Grammar" let becomes "shut down" # True positives # These are scenarios where `shutdown` is acting like the verb, so the rule should rehydrate it into two words. test "I will shutdown the server after work." "I will shut down the server after work." test "You can shutdown the old cluster tonight." "You can shut down the old cluster tonight." test "He has shutdown the backup process already." "He has shut down the backup process already." test "They have not shutdown the service yet." "They have not shut down the service yet." test "Should we shutdown the build manually?" "Should we shut down the build manually?" test "Would John shutdown the demo if we ask?" "Would John shut down the demo if we ask?" test "Could you not shutdown the database until backups finish?" "Could you not shut down the database until backups finish?" test "She won't shutdown the fleet until the engineers arrive." "She won't shut down the fleet until the engineers arrive." test "Can Alice shutdown this branch for me?" "Can Alice shut down this branch for me?" test "I shouldn't shutdown the node without warning." "I shouldn't shut down the node without warning." test "Has he shutdown the node yet?" "Has he shut down the node yet?" # True negatives (these should remain untouched) test "The shutdown lasted ten minutes." "The shutdown lasted ten minutes." test "Our planned shutdown is scheduled for Friday." "Our planned shutdown is scheduled for Friday." test "They shut down the network yesterday." "They shut down the network yesterday." test "Shutdown procedures are in the handbook." "Shutdown procedures are in the handbook." test "A forced shutdown is rare in this cluster." "A forced shutdown is rare in this cluster." ================================================ FILE: harper-core/src/linting/weir_rules/SimilarLike.weir ================================================ expr main similar like let message "Prefer 'similar to' instead of 'similar like'." let description "The adjective 'similar' pairs with the preposition 'to', so never follow it with 'like'." let kind "Usage" let becomes "similar to" let strategy "MatchCase" # True positives test "similar like" "similar to" test "Similar like" "Similar to" test "SIMILAR LIKE" "SIMILAR TO" test "My idea is similar like yours." "My idea is similar to yours." test "We noticed similar like behavior in each release." "We noticed similar to behavior in each release." test "Tell me if this sample feels similar like the old version." "Tell me if this sample feels similar to the old version." test "The proof seemed similar like every previous argument." "The proof seemed similar to every previous argument." test "A similar like token often flags the wrong preposition." "A similar to token often flags the wrong preposition." # True negatives / guardrails test "The two items are similar too." "The two items are similar too." test "She is similar in taste." "She is similar in taste." test "similar to" "similar to" test "This word similarlike is unusual." "This word similarlike is unusual." test "His similar likeness is uncanny." "His similar likeness is uncanny." test "I enjoy similar lighting at dusk." "I enjoy similar lighting at dusk." test "She mentioned similar limitations yesterday." "She mentioned similar limitations yesterday." ================================================ FILE: harper-core/src/linting/weir_rules/SimpleGrammatical.weir ================================================ expr main (simply grammatical) let message "Use `simple grammatical` for correct adjective usage." let description "Corrects `simply grammatical` to `simple grammatical` for proper adjective usage." let kind "Usage" let becomes "simple grammatical" ================================================ FILE: harper-core/src/linting/weir_rules/SneakingSuspicion.weir ================================================ expr main (sneaky suspicion) let message "Did you mean `sneaking suspicion`?" let description "Changes `sneaky suspicion` to `sneaking suspicion`." let kind "Eggcorn" let becomes "sneaking suspicion" test "sneaky suspicion" "sneaking suspicion" ================================================ FILE: harper-core/src/linting/weir_rules/SomeOfThe.weir ================================================ expr main (some the) let message "Add `of` to form the partitive phrase: `some of the`." let description "Quantity words such as `some` normally take `of` before a definite article. Including `of` signals that you mean a subset of a larger set, preventing a momentary stumble in comprehension." let kind "Typo" let becomes "some of the" test "Some the trees are too thick to climb." "Some of the trees are too thick to climb." test "You have misplaced some the config files." "You have misplaced some of the config files." ================================================ FILE: harper-core/src/linting/weir_rules/SomebodyElses.weir ================================================ expr main [(somebody's else), (somebody's else's)] let message "This should be `somebody else's`?" let description "Corrects `somebody else's` when the `'s` is in the wrong place." let kind "Grammar" let becomes "somebody else's" test "I really like your component and change to somebody's else would be really bad for now." "I really like your component and change to somebody else's would be really bad for now." test "Nice to know it's somebody's else's problem for a change." "Nice to know it's somebody else's problem for a change." ================================================ FILE: harper-core/src/linting/weir_rules/SoonerOrLater.weir ================================================ expr main (sooner than later) let message "Did you mean `sooner rather than later` or `sooner or later`?" let description "Fixes the improper phrase `sooner than later` by suggesting standard alternatives." let kind "Usage" let becomes ["sooner rather than later", "sooner or later"] ================================================ FILE: harper-core/src/linting/weir_rules/SpecialAttention.weir ================================================ expr main (spacial attention) let message "Did you mean `special attention`?" let description "Changes `spacial attention` to `special attention`." let kind "Typo" let becomes "special attention" test "spacial attention" "special attention" ================================================ FILE: harper-core/src/linting/weir_rules/SpinalChord.weir ================================================ expr main <([(spinal [chord, chords]), (vocal [chord, chords]), (umbilical [chord, chords]), (electrical [chord, chords])]), ([chord, chords])> let message "Drop the `h` after these anatomical or wiring descriptors; the structure is a `cord`." let description "The words `spinal`, `vocal`, `umbilical`, and `electrical` are followed by `cord`, so replace accidental `chord`/`chords`." let kind "Typo" let becomes ["cord", "cords"] let strategy "MatchCase" # True positives test "The patient injured the spinal chord this week." "The patient injured the spinal cord this week." test "Musicians talked about the vocal chord vibrations." "Musicians talked about the vocal cord vibrations." test "Doctors monitor the umbilical chord after delivery." "Doctors monitor the umbilical cord after delivery." test "Electrical chord damage can start a fire." "Electrical cord damage can start a fire." test "We studied the spinal chords in anatomy class." "We studied the spinal cords in anatomy class." test "The singer's vocal chords were sore." "The singer's vocal cords were sore." test "Umbilical chords should remain intact until clamping." "Umbilical cords should remain intact until clamping." test "Electrical chords spark when overloaded." "Electrical cords spark when overloaded." test "Spinal chord repair takes steady hands." "Spinal cord repair takes steady hands." test "Vocal chord therapy helped the speaker." "Vocal cord therapy helped the speaker." test "Umbilical chord issues raised concern." "Umbilical cord issues raised concern." test "The crew replaced the electrical chords on stage." "The crew replaced the electrical cords on stage." test "Spinal chords often accompany nerve damage." "Spinal cords often accompany nerve damage." test "Vocal chords sustain the melody." "Vocal cords sustain the melody." test "Electrical chords run along the wall." "Electrical cords run along the wall." # False positives / true negatives allows "A guitar chord can sound beautiful." allows "The lamp cord is frayed but still works." allows "Spinal cord injuries require care." allows "Vocal cords vibrate when we sing." allows "Umbilical cord clamping is a delicate step." allows "Remember to unplug the electrical cord before repairs." ================================================ FILE: harper-core/src/linting/weir_rules/Starving.weir ================================================ expr main [(very hungry), (really hungry), (extremely hungry)] let message "A more vivid adjective would better convey intense hunger." let description "Encourages vivid writing by suggesting `starving` instead of weaker expressions like `very hungry.`" let kind "Enhancement" let becomes "starving" ================================================ FILE: harper-core/src/linting/weir_rules/StateOfTheArt.weir ================================================ expr main (state of art) let message "Did you mean `state of the art`?" let description "Detects incorrect usage of `state of art` and suggests `state of the art` as the correct phrase." let kind "Usage" let becomes "state of the art" ================================================ FILE: harper-core/src/linting/weir_rules/StatuteOfLimitations.weir ================================================ expr main (statue of limitations) let message "A `statue` is a sculpture; in legal terms, the correct word is `statute`." let description "Corrects `statue of limitations` to `statute of limitations`." let kind "Eggcorn" let becomes "statute of limitations" test "Shouldn't there be a grandfathered-in or statue of limitations for posts before the original punishment?" "Shouldn't there be a grandfathered-in or statute of limitations for posts before the original punishment?" ================================================ FILE: harper-core/src/linting/weir_rules/StrikeChord.weir ================================================ expr main (strike a cord) let message "Use the idiom with `chord` when describing a feeling or reaction." let description "The phrase about resonating with someone is spelled with a chord, not a cord, so fix the typo and keep the idiom intact." let kind "Typo" let becomes "strike a chord" let strategy "MatchCase" # True positives test "A heartfelt verse might strike a cord in every reader." "A heartfelt verse might strike a chord in every reader." test "He tried to strike a cord during the keynote." "He tried to strike a chord during the keynote." test "This rally plan is designed to strike a cord with voters." "This rally plan is designed to strike a chord with voters." test "Will this line strike a cord, or will it fall flat?" "Will this line strike a chord, or will it fall flat?" test "Our new video is meant to strike a cord across cultures." "Our new video is meant to strike a chord across cultures." test "When they strike a cord, the crowd remembers the old anthem." "When they strike a chord, the crowd remembers the old anthem." test "Strike a cord with humor and you win the room." "Strike a chord with humor and you win the room." test "STRIKE A CORD BEFORE THE DROP." "STRIKE A CHORD BEFORE THE DROP." test "It might strike a cord, then fade." "It might strike a chord, then fade." test "Strike a cord - just not the one you are thinking of." "Strike a chord - just not the one you are thinking of." # False negatives (these contexts should also resolve to the idiom) test "We plan to strike a cord; the sentiment should spread." "We plan to strike a chord; the sentiment should spread." test "The song will strike a cord? We'll see." "The song will strike a chord? We'll see." test "Do not wait until the chorus to strike a cord." "Do not wait until the chorus to strike a chord." test "I hope we strike a cord tomorrow." "I hope we strike a chord tomorrow." test "As soon as they strike a cord, the thread goes viral." "As soon as they strike a chord, the thread goes viral." # False positives / true negatives allows "I want to strike a chord tonight." allows "He plugged the cord into the amp before playing." allows "The guitar teacher told him to strike the chord on beat." ================================================ FILE: harper-core/src/linting/weir_rules/SufficeItToSay.weir ================================================ expr main (suffice to say) let message "`Suffice it to say` is the more standard and more common variant." let description "Corrects `suffice to say` to `suffice it to say`." let kind "Usage" let becomes "suffice it to say" test "I don't fully grok the bug, but suffice to say it is not an RCD issue." "I don't fully grok the bug, but suffice it to say it is not an RCD issue." ================================================ FILE: harper-core/src/linting/weir_rules/SupposedTo.weir ================================================ expr main (suppose to) let message "Did you mean `supposed to`?" let description "Fixes `suppose to` to the correct `supposed to`." let kind "Usage" let becomes "supposed to" test "suppose to" "supposed to" ================================================ FILE: harper-core/src/linting/weir_rules/TakeItPersonally.weir ================================================ expr main (take it personal) let message "The more standard, less colloquial form is `take it personally`." let description "Corrects `take it personal` to `take it personally`." let kind "Usage" let becomes "take it personally" test "This is not personal, do not take it personal, we also think Thingsboard is a extraordinary tool (we are using in several scenarios in fact)" "This is not personal, do not take it personally, we also think Thingsboard is a extraordinary tool (we are using in several scenarios in fact)" ================================================ FILE: harper-core/src/linting/weir_rules/ThanksALot.weir ================================================ expr main (thanks lot) let message "The indefinite article `a` is required in `thanks a lot`." let description "Corrects the missing article in `thanks lot`, forming `thanks a lot`." let kind "Grammar" let becomes "thanks a lot" test "thanks lot" "thanks a lot" allows "thanks a lot" ================================================ FILE: harper-core/src/linting/weir_rules/ThatChallenged.weir ================================================ expr main (the challenged) let message "Use `that challenged` for correct relative clause." let description "Corrects `the challenged` to `that challenged` for proper relative clause usage." let becomes "that challenged" ================================================ FILE: harper-core/src/linting/weir_rules/ThatThis.weir ================================================ expr main (the this) let message "Did you mean `that this`?" let description "Fixes `the this` to the correct phrase `that this`." let kind "Typo" let becomes "that this" ================================================ FILE: harper-core/src/linting/weir_rules/The.weir ================================================ expr main [(teh), (te)] let message "Did you mean the definite article?" let description "Fixes especially common misspellings of the word `the`" let kind "Typo" let becomes "the" test "I adore teh light of the moon." "I adore the light of the moon." ================================================ FILE: harper-core/src/linting/weir_rules/TheAnother.weir ================================================ expr main (the another) let message "Use `the other` or `another`, not both." let description "Corrects `the another`." let kind "Grammar" let becomes ["the other", "another"] test "Another possible cause is simply that the application does not have file creation permissions on the another machine." "Another possible cause is simply that the application does not have file creation permissions on the other machine." ================================================ FILE: harper-core/src/linting/weir_rules/TheDifferenceBetween.weir ================================================ expr main [(the different between), (the differents between)] let message "The correct word is `difference`, not `different` or `differents`." let description "Corrects `the different(s) between to `the difference between`." let kind "Usage" let becomes "the difference between" test "What is the different between the two msi files of the latest version?" "What is the difference between the two msi files of the latest version?" test "what's the differents between \"await page.$(selector)\" and \"page.$(selector)\" ?" "what's the difference between \"await page.$(selector)\" and \"page.$(selector)\" ?" ================================================ FILE: harper-core/src/linting/weir_rules/TheirToThere.weir ================================================ expr main [<(their [is, are, was, were, isn't, aren't, wasn't, weren't, (will be), (can be), (could be), (should be), (would be), (may be), (might be), (must be), (has been), (have been)]), their>, <(their [on, after, beside, in, by, until, again, to, and, right, at]), their>, <((over their), their)>, <((over they're), they're)>, <(their,), their>, their's] let message "Did you mean `there`?" let description "Corrects `their` when the intended meaning is `there`." let kind "Grammar" let becomes ["there", "there's", "there's"] test "Their is a problem with the build." "There is a problem with the build." test "Their are several options to consider." "There are several options to consider." test "Their was a delay in the rollout." "There was a delay in the rollout." test "Their were no updates last week." "There were no updates last week." test "Their isn't any time left." "There isn't any time left." test "Their aren't enough chairs." "There aren't enough chairs." test "Their wasn't a clear answer." "There wasn't a clear answer." test "Their weren't any tickets left." "There weren't any tickets left." test "Their will be more questions." "There will be more questions." test "Their can be a conflict of interest." "There can be a conflict of interest." test "Their could be a better approach." "There could be a better approach." test "Their should be a warning." "There should be a warning." test "Their would be a delay if we waited." "There would be a delay if we waited." test "Their may be changes later." "There may be changes later." test "Their might be issues later." "There might be issues later." test "Their must be a simpler way." "There must be a simpler way." test "Their has been a change in scope." "There has been a change in scope." test "Their have been delays all week." "There have been delays all week." allows "Their car is in the driveway." allows "We used their tools for the repair." allows "Their team was excited." allows "I appreciate their help." allows "Their willpower is strong." test "Their is a cat sleeping on the radiator." "There is a cat sleeping on the radiator." test "I left the keys their on the counter." "I left the keys there on the counter." test "Their are three clean mugs in the cupboard." "There are three clean mugs in the cupboard." test "We should meet their after work, near the fountain." "We should meet there after work, near the fountain." test "Their was a strange echo in the stairwell." "There was a strange echo in the stairwell." test "Put the blue folder their, beside the printer." "Put the blue folder there, beside the printer." test "Their will be a storm tonight, so bring the plants in." "There will be a storm tonight, so bring the plants in." test "I've never been their, but I've read about it." "I've never been there, but I've read about it." test "Their isn't enough coffee for everyone." "There isn't enough coffee for everyone." test "She paused their, mid-sentence, as if listening." "She paused there, mid-sentence, as if listening." test "Their were fingerprints on the glass." "There were fingerprints on the glass." test "We can stop their and refuel before the mountains." "We can stop there and refuel before the mountains." test "Their's a tiny crack in the screen." "There's a tiny crack in the screen." test "I saw him standing their, perfectly still." "I saw him standing there, perfectly still." test "Their are more questions than answers." "There are more questions than answers." test "Leave the umbrella their by the door." "Leave the umbrella there by the door." test "Their must be a simpler explanation." "There must be a simpler explanation." test "I wish I could go their again in summer." "I wish I could go there again in summer." test "Their is no shortcut through this part of the forest." "There is no shortcut through this part of the forest." test "He moved the chair their to catch the sunlight." "He moved the chair there to catch the sunlight." test "Their were candles on every windowsill." "There were candles on every windowsill." test "You can park their, but only after 6 p.m." "You can park there, but only after 6 p.m." test "Their's a note taped under the table." "There's a note taped under the table." test "She felt safer their, among familiar faces." "She felt safer there, among familiar faces." test "Their were no footprints their in the fresh snow." "There were no footprints there in the fresh snow." test "I'll wait their until you arrive." "I'll wait there until you arrive." test "Their is a quiet confidence in her voice." "There is a quiet confidence in her voice." test "The answer is right their in the first paragraph." "The answer is right there in the first paragraph." test "Their are deadlines, and then their are consequences." "There are deadlines, and then there are consequences." test "I can't believe you're still standing their, smiling." "I can't believe you're still standing there, smiling." test "I left my keys over their on the table." "I left my keys over there on the table." test "We should meet their at noon." "We should meet there at noon." test "Their is no reason to panic." "There is no reason to panic." ================================================ FILE: harper-core/src/linting/weir_rules/TheirToTheyre.weir ================================================ expr main [<(their [AUX, (supposed to), (allowed to), (invited to), (going to), (trying to), (coming over), (coming tonight), (leaving in), (moving to), (planning a), (waiting for), (answering any), (wondering where), (running behind), (running through), (far too), even, (already here), (in the), (on the), (at the), (a lot), an, two, offline, (ADV [PROG, AUX]), (ADV VERB), (PART [PROG, VERB, ADJ, AUX]), (ready to), (always [late, early]), the]), their>, <(there [(moving next), (planning a)]), there>] let message "Did you mean `they're`?" let description "Corrects `their` when the intended meaning is `they're`." let kind "Grammar" let becomes ["they're", "they're "] test "Their going to be late." "They're going to be late." test "I think their already here." "I think they're already here." test "Their not sure what to do next." "They're not sure what to do next." test "Their coming over after work." "They're coming over after work." test "Tell them their invited to the meeting." "Tell them they're invited to the meeting." test "Their trying to fix the bug right now." "They're trying to fix the bug right now." test "Their going to love this movie." "They're going to love this movie." test "Their the fastest team in the league." "They're the fastest team in the league." test "Their supposed to call you back today." "They're supposed to call you back today." test "Their leaving in five minutes." "They're leaving in five minutes." test "I heard their moving to Denver." "I heard they're moving to Denver." test "Their just kidding--don't worry." "They're just kidding--don't worry." test "Their going to email the final draft tonight." "They're going to email the final draft tonight." test "Their not available until Tuesday." "They're not available until Tuesday." test "Their planning a surprise party." "They're planning a surprise party." test "Looks like their running behind schedule." "Looks like they're running behind schedule." test "Their the ones who approved it." "They're the ones who approved it." test "Their going to miss the train." "They're going to miss the train." test "Their still waiting for the test results." "They're still waiting for the test results." test "Their not allowed to park here." "They're not allowed to park here." test "Their going to change the policy." "They're going to change the policy." test "Their ready to start whenever you are." "They're ready to start whenever you are." test "Their not answering any messages." "They're not answering any messages." test "Their going to be a problem if we don't hurry." "They're going to be a problem if we don't hurry." test "Their probably wondering where we went." "They're probably wondering where we went." test "Their always late." "They're always late." test "Their going to the store after work." "They're going to the store after work." test "Do you know if their coming tonight?" "Do you know if they're coming tonight?" test "The neighbors said there moving next month." "The neighbors said they're moving next month." test "I saw their running through the park." "I saw they're running through the park." test "I heard there planning a surprise party." "I heard they're planning a surprise party." allows "Their backpacks were stacked neatly by the door." allows "I admired their patience during the long, glitchy delay." allows "Their dog sprinted across the yard like a furry comet." allows "The committee revised their proposal after the budget changed." allows "Their laughter drifted down the hallway, bright and unguarded." allows "We borrowed their ladder to reach the stubborn light fixture." allows "Their apartment smells like coffee, citrus, and old paperbacks." allows "The kids lost their mittens somewhere between the car and the rink." allows "Their answer was careful, precise, and unexpectedly kind." allows "The artists framed their sketches before the gallery opened." allows "Their server crashed, but their backup plan worked flawlessly." allows "I couldn't ignore their evidence; it was meticulously documented." allows "Their garden is a riot of basil, tomatoes, and bee traffic." allows "The hikers checked their maps twice before leaving the trailhead." allows "Their team celebrated quietly--relieved more than triumphant." allows "Users should be able to visualize their connected notes as a knowledge graph, allowing them to explore relationships and identify patterns." allows "The frustration was palpable; the team felt they were fighting a constant uphill battle against their own data infrastructure." allows "Historians and sociologists have long examined how societies construct and maintain narratives about their past." allows "Traditional maps, often produced by the colonizers, replaced native nomenclature with European equivalents, effectively severing a vital link between people and their ancestral lands." allows "She believes I should prioritize their needs above my own." allows "Each player places their pawn on GRI Headquarters (designated space on the board)." allows "This fragmented view hindered their ability to make timely adjustments, ultimately impacting their return on investment." allows "My shift was nearing its end, and I was conducting my final rounds, ensuring each patient was comfortable and their needs were met." allows "Upon opening the application, users see a prioritized list of information cards related to their most recently accessed projects or tasks in connected applications." allows "For instance, a musician who has lost their hearing might collaborate with a visual artist to create a series of abstract paintings that attempt to translate the emotional impact of music into a visual form." allows "Their relatively low density facilitates handling and transportation." allows "The growing interest in mycelium-based construction materials stems from their potential to offer a sustainable alternative to conventional building materials." allows "Similarly, the individual experiencing sensory loss must actively reconstruct their understanding of the world, mapping the contours of their new, altered reality." test "Their far too warm for that." "They're far too warm for that." test "Their far too cold for that." "They're far too cold for that." test "Their even, just as I said!" "They're even, just as I said!" test "Their in the kitchen already." "They're in the kitchen already." test "Their on the way to the airport." "They're on the way to the airport." test "Their at the wrong address." "They're at the wrong address." test "Their a lot of people waiting outside." "They're a lot of people waiting outside." test "Their an example of how not to do it." "They're an example of how not to do it." test "Their two options left." "They're two options left." test "Their to blame for the mistake." "They're to blame for the mistake." test "Their to meet us after work." "They're to meet us after work." test "Their offline right now, try again later." "They're offline right now, try again later." ================================================ FILE: harper-core/src/linting/weir_rules/ThereToTheir.weir ================================================ expr main [<(there [NOUN, (NOUN NOUN), mittens, sketches, past, needs, pawn, ability, return]), there>, <(there connected notes), there>, <(there own data infrastructure), there>, <(there ancestral lands), there>, <(there relatively low density), there>, <(there potential to), there>, <(there backup plan), there>, <(there most recently accessed projects), there>, <(there new), there>] let message "Did you mean `their`?" let description "Corrects `there` when the intended meaning is `their`." let kind "Grammar" let becomes "their" test "There backpacks were stacked neatly by the door." "Their backpacks were stacked neatly by the door." test "Is that there dog?" "Is that their dog?" test "There dog is barking again." "Their dog is barking again." test "The students forgot there backpacks." "The students forgot their backpacks." test "I admired there patience during the long, glitchy delay." "I admired their patience during the long, glitchy delay." test "There dog sprinted across the yard like a furry comet." "Their dog sprinted across the yard like a furry comet." test "The committee revised there proposal after the budget changed." "The committee revised their proposal after the budget changed." test "There laughter drifted down the hallway, bright and unguarded." "Their laughter drifted down the hallway, bright and unguarded." test "We borrowed there ladder to reach the stubborn light fixture." "We borrowed their ladder to reach the stubborn light fixture." test "There apartment smells like coffee, citrus, and old paperbacks." "Their apartment smells like coffee, citrus, and old paperbacks." test "The kids lost there mittens somewhere between the car and the rink." "The kids lost their mittens somewhere between the car and the rink." test "There answer was careful, precise, and unexpectedly kind." "Their answer was careful, precise, and unexpectedly kind." test "The artists framed there sketches before the gallery opened." "The artists framed their sketches before the gallery opened." test "There server crashed, but there backup plan worked flawlessly." "Their server crashed, but their backup plan worked flawlessly." test "I couldn't ignore there evidence; it was meticulously documented." "I couldn't ignore their evidence; it was meticulously documented." test "There garden is a riot of basil, tomatoes, and bee traffic." "Their garden is a riot of basil, tomatoes, and bee traffic." test "The hikers checked there maps twice before leaving the trailhead." "The hikers checked their maps twice before leaving the trailhead." test "They left there books in the classroom." "They left their books in the classroom." test "There team celebrated quietly--relieved more than triumphant." "Their team celebrated quietly--relieved more than triumphant." test "Users should be able to visualize there connected notes as a knowledge graph, allowing them to explore relationships and identify patterns." "Users should be able to visualize their connected notes as a knowledge graph, allowing them to explore relationships and identify patterns." test "The frustration was palpable; the team felt they were fighting a constant uphill battle against there own data infrastructure." "The frustration was palpable; the team felt they were fighting a constant uphill battle against their own data infrastructure." test "Historians and sociologists have long examined how societies construct and maintain narratives about there past." "Historians and sociologists have long examined how societies construct and maintain narratives about their past." test "Traditional maps, often produced by the colonizers, replaced native nomenclature with European equivalents, effectively severing a vital link between people and there ancestral lands." "Traditional maps, often produced by the colonizers, replaced native nomenclature with European equivalents, effectively severing a vital link between people and their ancestral lands." test "She believes I should prioritize there needs above my own." "She believes I should prioritize their needs above my own." test "Each player places there pawn on GRI Headquarters (designated space on the board)." "Each player places their pawn on GRI Headquarters (designated space on the board)." test "This fragmented view hindered there ability to make timely adjustments, ultimately impacting there return on investment." "This fragmented view hindered their ability to make timely adjustments, ultimately impacting their return on investment." test "My shift was nearing its end, and I was conducting my final rounds, ensuring each patient was comfortable and there needs were met." "My shift was nearing its end, and I was conducting my final rounds, ensuring each patient was comfortable and their needs were met." test "Upon opening the application, users see a prioritized list of information cards related to there most recently accessed projects or tasks in connected applications." "Upon opening the application, users see a prioritized list of information cards related to their most recently accessed projects or tasks in connected applications." test "For instance, a musician who has lost there hearing might collaborate with a visual artist to create a series of abstract paintings that attempt to translate the emotional impact of music into a visual form." "For instance, a musician who has lost their hearing might collaborate with a visual artist to create a series of abstract paintings that attempt to translate the emotional impact of music into a visual form." test "There relatively low density facilitates handling and transportation." "Their relatively low density facilitates handling and transportation." test "The growing interest in mycelium-based construction materials stems from there potential to offer a sustainable alternative to conventional building materials." "The growing interest in mycelium-based construction materials stems from their potential to offer a sustainable alternative to conventional building materials." test "Similarly, the individual experiencing sensory loss must actively reconstruct there understanding of the world, mapping the contours of there new, altered reality." "Similarly, the individual experiencing sensory loss must actively reconstruct their understanding of the world, mapping the contours of their new, altered reality." allows "There are several options to consider." allows "I left the keys there on the counter." allows "We should meet there after work, near the fountain." allows "There will be more questions." allows "There isn't any time left." allows "There's a note taped under the table." allows "I saw him standing there, perfectly still." allows "Leave the umbrella there by the door." allows "The answer is right there in the first paragraph." allows "Are there known issues between these specific versions of Elementor and ACF that I’m unaware of?" allows "There are lots of different phases." allows "Yet, there are pockets of silence, moments where the urban soundscape recedes." allows "While there are areas for improvement, the plugin is already a valuable tool for developers who want a modern and efficient debugging experience." ================================================ FILE: harper-core/src/linting/weir_rules/TheyToThem.weir ================================================ expr main <([to, with, for, about, against, between, among, around, toward, towards, through, beyond, behind, across, near, inside, outside, call, contact, invite, remind, ask, see, watch, help, trust, send, support, follow, visit, tell, thank, mention, show] they), they> let message "Use `them` when the pronoun follows a preposition or transitive verb." let description "Converts `they` to `them` whenever the pronoun serves as an object after common prepositions or actions that take direct objects." let kind "Grammar" let becomes "them" let strategy "MatchCase" # True positives test "Talk to they about the plan." "Talk to them about the plan." test "I will ask they for consent." "I will ask them for consent." test "Send they the invitation." "Send them the invitation." test "Call they when you arrive." "Call them when you arrive." test "Contact they via email." "Contact them via email." test "Thank they for their help." "Thank them for their help." test "I remind they as soon as possible." "I remind them as soon as possible." test "Discuss with they the new requirements." "Discuss with them the new requirements." test "We fought against they for fairness." "We fought against them for fairness." test "Between they and us, the message is clear." "Between them and us, the message is clear." test "Tell they the good news." "Tell them the good news." test "CALL THEY TODAY." "CALL THEM TODAY." test "Support they during the transition." "Support them during the transition." test "Show they how the tool works." "Show them how the tool works." test "Mention they in your update." "Mention them in your update." # True negatives test "They went to the store." "They went to the store." test "I know they will arrive soon." "I know they will arrive soon." test "Because they are busy, we rescheduled." "Because they are busy, we rescheduled." test "They told us they would stay." "They told us they would stay." test "They announced the event yesterday." "They announced the event yesterday." ================================================ FILE: harper-core/src/linting/weir_rules/TheyreToTheir.weir ================================================ expr main <(they're [backpacks, patience, dog, proposal, laughter, ladder, apartment, mittens, answer, sketches, server, backup, evidence, garden, maps, team, past, needs, pawn, ability, return, hearing, house, coats, problems, (connected notes), (own data infrastructure), (ancestral lands), (most recently accessed projects), (potential to), (understanding), (new), (relatively low density)]), they're> let message "Did you mean `their`?" let description "Corrects `they're` when the intended meaning is `their`." let kind "Grammar" let becomes "their" allows "They're going to be late." allows "I think they're already here." allows "They're not sure what to do next." allows "They're coming over after work." allows "Tell them they're invited to the meeting." allows "They're trying to fix the bug right now." allows "They're going to love this movie." allows "They're the fastest team in the league." allows "They're supposed to call you back today." allows "They're leaving in five minutes." allows "I heard they're moving to Denver." allows "They're just kidding--don't worry." allows "They're going to email the final draft tonight." allows "They're not available until Tuesday." allows "They're planning a surprise party." allows "Looks like they're running behind schedule." allows "They're the ones who approved it." allows "They're going to miss the train." allows "They're still waiting for the test results." allows "They're not allowed to park here." allows "They're going to change the policy." allows "They're ready to start whenever you are." allows "They're not answering any messages." allows "They're going to be a problem if we don't hurry." allows "They're probably wondering where we went." allows "No, they're not." allows "They're done with blacking, I believe." allows "I don't know what they're like." allows "They're all over crumbs." test "They're backpacks were stacked neatly by the door." "Their backpacks were stacked neatly by the door." test "What are they're problems?" "What are their problems?" test "I think they're house is the blue one." "I think their house is the blue one." test "I admired they're patience during the long, glitchy delay." "I admired their patience during the long, glitchy delay." test "They're dog sprinted across the yard like a furry comet." "Their dog sprinted across the yard like a furry comet." test "The committee revised they're proposal after the budget changed." "The committee revised their proposal after the budget changed." test "They're laughter drifted down the hallway, bright and unguarded." "Their laughter drifted down the hallway, bright and unguarded." test "We borrowed they're ladder to reach the stubborn light fixture." "We borrowed their ladder to reach the stubborn light fixture." test "They're apartment smells like coffee, citrus, and old paperbacks." "Their apartment smells like coffee, citrus, and old paperbacks." test "The kids lost they're mittens somewhere between the car and the rink." "The kids lost their mittens somewhere between the car and the rink." test "They're answer was careful, precise, and unexpectedly kind." "Their answer was careful, precise, and unexpectedly kind." test "The artists framed they're sketches before the gallery opened." "The artists framed their sketches before the gallery opened." test "They're server crashed, but they're backup plan worked flawlessly." "Their server crashed, but their backup plan worked flawlessly." test "I couldn't ignore they're evidence; it was meticulously documented." "I couldn't ignore their evidence; it was meticulously documented." test "They're garden is a riot of basil, tomatoes, and bee traffic." "Their garden is a riot of basil, tomatoes, and bee traffic." test "The hikers checked they're maps twice before leaving the trailhead." "The hikers checked their maps twice before leaving the trailhead." test "They're team celebrated quietly--relieved more than triumphant." "Their team celebrated quietly--relieved more than triumphant." test "Users should be able to visualize they're connected notes as a knowledge graph, allowing them to explore relationships and identify patterns." "Users should be able to visualize their connected notes as a knowledge graph, allowing them to explore relationships and identify patterns." test "The frustration was palpable; the team felt they were fighting a constant uphill battle against they're own data infrastructure." "The frustration was palpable; the team felt they were fighting a constant uphill battle against their own data infrastructure." test "Historians and sociologists have long examined how societies construct and maintain narratives about they're past." "Historians and sociologists have long examined how societies construct and maintain narratives about their past." test "Traditional maps, often produced by the colonizers, replaced native nomenclature with European equivalents, effectively severing a vital link between people and they're ancestral lands." "Traditional maps, often produced by the colonizers, replaced native nomenclature with European equivalents, effectively severing a vital link between people and their ancestral lands." test "She believes I should prioritize they're needs above my own." "She believes I should prioritize their needs above my own." test "Each player places they're pawn on GRI Headquarters (designated space on the board)." "Each player places their pawn on GRI Headquarters (designated space on the board)." test "This fragmented view hindered they're ability to make timely adjustments, ultimately impacting they're return on investment." "This fragmented view hindered their ability to make timely adjustments, ultimately impacting their return on investment." test "My shift was nearing its end, and I was conducting my final rounds, ensuring each patient was comfortable and they're needs were met." "My shift was nearing its end, and I was conducting my final rounds, ensuring each patient was comfortable and their needs were met." test "Upon opening the application, users see a prioritized list of information cards related to they're most recently accessed projects or tasks in connected applications." "Upon opening the application, users see a prioritized list of information cards related to their most recently accessed projects or tasks in connected applications." test "For instance, a musician who has lost they're hearing might collaborate with a visual artist to create a series of abstract paintings that attempt to translate the emotional impact of music into a visual form." "For instance, a musician who has lost their hearing might collaborate with a visual artist to create a series of abstract paintings that attempt to translate the emotional impact of music into a visual form." test "They're relatively low density facilitates handling and transportation." "Their relatively low density facilitates handling and transportation." test "The growing interest in mycelium-based construction materials stems from they're potential to offer a sustainable alternative to conventional building materials." "The growing interest in mycelium-based construction materials stems from their potential to offer a sustainable alternative to conventional building materials." test "Similarly, the individual experiencing sensory loss must actively reconstruct they're understanding of the world, mapping the contours of they're new, altered reality." "Similarly, the individual experiencing sensory loss must actively reconstruct their understanding of the world, mapping the contours of their new, altered reality." test "Can you hand me they're coats?" "Can you hand me their coats?" ================================================ FILE: harper-core/src/linting/weir_rules/ThoughtProcess.weir ================================================ expr main (though process) let message "Did you mean `thought process`?" let description "Changes `though process` to `thought process`." let kind "Typo" let becomes "thought process" ================================================ FILE: harper-core/src/linting/weir_rules/ThreatenVerb.weir ================================================ expr modalAux [will, would, should, could, can, may, might, must, shall, won't, wouldn't, shouldn't, couldn't, can't, mustn't] expr subject [(DET NOUN), (DET PROPN), PRON, NOUN, PROPN] expr main <([( @modalAux threat), (@modalAux @subject threat)]), threat> let message "Modal verbs followed by `threat` almost always intend the verb `threaten`." let description "Normalize `threat` to `threaten` when it is used after modals (or their contractions) because the noun form is being mistaken for a verb." let kind "Grammar" let becomes "threaten" let strategy "MatchCase" test "I will threat the vendor if they miss another check-in." "I will threaten the vendor if they miss another check-in." test "You shouldn't threat the partnership over a misunderstanding." "You shouldn't threaten the partnership over a misunderstanding." test "We could threat the release if the bug persists." "We could threaten the release if the bug persists." test "They might threat the roadmap during the review." "They might threaten the roadmap during the review." test "You must threat the issue before it escalates." "You must threaten the issue before it escalates." test "He should threat his backup plan." "He should threaten his backup plan." test "We wouldn't threat our customers for honest feedback." "We wouldn't threaten our customers for honest feedback." test "She can't threat the crew without checking policy." "She can't threaten the crew without checking policy." test "I would threat the system again if it keeps failing." "I would threaten the system again if it keeps failing." test "May I threat them later?" "May I threaten them later?" test "Might you threat the schedule to force a fix?" "Might you threaten the schedule to force a fix?" test "You won't threat me with the same ultimatum twice." "You won't threaten me with the same ultimatum twice." test "Should they threat the platform to pressure the release?" "Should they threaten the platform to pressure the release?" test "I WILL threat the contract if the clauses keep changing." "I WILL threaten the contract if the clauses keep changing." test "They mustn't threat the new hires." "They mustn't threaten the new hires." allows "The threat on the board made everyone nervous." allows "This threat level matches last winter's storms." allows "Threat modeling exercises take several days." allows "Treat each threat seriously, but don't confuse the noun with the verb." allows "A threat scenario looks at possible attackers and motives." allows "Her tone sounded like the threat of a storm, not a promise." allows "Threat actors often test the defenses before committing to a breach." ================================================ FILE: harper-core/src/linting/weir_rules/TickingTimeClock.weir ================================================ expr main (ticking time clock) let message "Use `ticking time bomb` for disastrous consequences, otherwise avoid redundancy with just `ticking clock`." let description "Corrects `ticking time clock` to `ticking time bomb` for idiomatic urgency or `ticking clock` otherwise." let kind "Usage" let becomes ["ticking time bomb", "ticking clock"] test "One element that can help up the stakes (and tension!) is a \“ticking time clock.\”" "One element that can help up the stakes (and tension!) is a \“ticking time bomb.\”" test "The opportunity itself has a ticking time clock as all great opportunities do." "The opportunity itself has a ticking clock as all great opportunities do." ================================================ FILE: harper-core/src/linting/weir_rules/ToBackOut.weir ================================================ expr main (to backout) let message "Separate `backout` into the verb `back out` after `to`." let description "Treats `to backout` as a mistyped infinitive and prefers the two-word verb." let kind "Usage" let becomes "to back out" # True positives test "There's still time to backout of the deal." "There's still time to back out of the deal." test "Make sure to backout that commit before merging." "Make sure to back out that commit before merging." test "I told them to BACKOUT once the bug surfaced." "I told them to BACK OUT once the bug surfaced." test "Please remember to backout the change if it breaks tests." "Please remember to back out the change if it breaks tests." test "To backout, you can cancel the pipeline." "To back out, you can cancel the pipeline." test "We still might need to backout this feature." "We still might need to back out this feature." test "If we have to TO BACKOUT now, we should warn everyone." "If we have to TO BACK OUT now, we should warn everyone." test "We might need to backout; let us know." "We might need to back out; let us know." # False negative coverage (punctuation and casing should still trigger). test "to backout?" "to back out?" test "to backout!" "to back out!" # True negatives (these contexts should stay untouched). test "We plan to back out after the meeting." "We plan to back out after the meeting." test "The backout plan came with the release." "The backout plan came with the release." test "Backout is spelled as a noun in this paragraph." "Backout is spelled as a noun in this paragraph." test "to back out" "to back out" # False positives (near misses that should not change). test "This doc mentions to backouts and other options." "This doc mentions to backouts and other options." test "They call it the backout-ary clause." "They call it the backout-ary clause." ================================================ FILE: harper-core/src/linting/weir_rules/ToDoHyphen.weir ================================================ expr main (todo) let message "Hyphenate `to-do`." let description "Ensures `to-do` is correctly hyphenated." let becomes "to-do" ================================================ FILE: harper-core/src/linting/weir_rules/ToGreatLengths.weir ================================================ expr main [(through great lengths), (to a great length)] let message "The idiom is to go `to great lengths`." let description "Corrects `through great lengths` to `to great lengths`." let becomes "to great lengths" test "Bloomberg's sponsored paid for content goes through great lengths to market Nvidia's products and in particular its AI products that we've frequently criticized." "Bloomberg's sponsored paid for content goes to great lengths to market Nvidia's products and in particular its AI products that we've frequently criticized." test "While ratatui-image goes to a great length to detect a rendered image's pixel size in terms of \"character cells that will be covered\", via font pixel size detection, ultimately it's up to the terminal emulator to decide what exactly a pixel is." "While ratatui-image goes to great lengths to detect a rendered image's pixel size in terms of \"character cells that will be covered\", via font pixel size detection, ultimately it's up to the terminal emulator to decide what exactly a pixel is." ================================================ FILE: harper-core/src/linting/weir_rules/ToLoseTooLoose.weir ================================================ expr main [(to loose), (too lose)] let message "For `not to win`, use `to lose`. For `not tight enough`, use `too loose`." let description "Corrects mixing up `to` with `too` and `lose` with `loose`." let kind "Spelling" let becomes ["to lose", "too loose"] test "Bits and pieces of legacy code that are lying around on my system and that it would be a pity to loose" "Bits and pieces of legacy code that are lying around on my system and that it would be a pity to lose" test "infinite recursion caused by transforms that have their preconditions too lose and/or conflict with each other" "infinite recursion caused by transforms that have their preconditions too loose and/or conflict with each other" ================================================ FILE: harper-core/src/linting/weir_rules/ToSomeDegree.weir ================================================ expr main (in some degree) let message "The correct preposition in this phrase is 'to', not 'in'." let description "Corrects `in some degree` to `to some degree`, meaning to a certain extent." let kind "Eggcorn" let becomes "to some degree" test "It would be prescriptive in some degree, but we could use MUST / MAY / SHOULD as like the current spec and IETF RFCs." "It would be prescriptive to some degree, but we could use MUST / MAY / SHOULD as like the current spec and IETF RFCs." ================================================ FILE: harper-core/src/linting/weir_rules/ToTheMannerBorn.weir ================================================ expr main (to the manor born) let message "Use the correct phrase for being naturally suited to something." let description "Corrects `to the manor born` to `to the manner born`, ensuring the intended meaning of being naturally suited to a way of life." let kind "Eggcorn" let becomes "to the manner born" ================================================ FILE: harper-core/src/linting/weir_rules/ToWorryAbout.weir ================================================ expr main (to worried about) let message "Did you mean the progressive form?" let description "Fixes incorrect use of `to worried about`." let becomes ["to worry about", "too worried about"] test "I don't want you to worried about it." "I don't want you to worry about it." test "I don't want you to worried about it." "I don't want you too worried about it." ================================================ FILE: harper-core/src/linting/weir_rules/TongueInCheek.weir ================================================ expr main (tongue and cheek) let message "Use `tongue in cheek` for the idiom." let description "Corrects the idiom when `and` replaces the needed preposition." let kind "WordChoice" let becomes "tongue in cheek" test "The remark was entirely tongue and cheek." "The remark was entirely tongue in cheek." test "It was a tongue and cheek response." "It was a tongue in cheek response." test "He delivered it tongue and cheek, expecting a laugh." "He delivered it tongue in cheek, expecting a laugh." test "\"tongue and cheek\" jokes are tough to read." "\"tongue in cheek\" jokes are tough to read." test "Their tone was TONGUE AND CHEEK all night." "Their tone was TONGUE IN CHEEK all night." test "Tongue and cheek banter kept the meeting light." "Tongue in cheek banter kept the meeting light." test "Her note (totally tongue and cheek) made us smile." "Her note (totally tongue in cheek) made us smile." test "Was that tongue and cheek or sincere?" "Was that tongue in cheek or sincere?" allows "Their comments were deliberately tongue in cheek." allows "That was a tongue-in-cheek reply." ================================================ FILE: harper-core/src/linting/weir_rules/Towards.weir ================================================ expr main (to towards) let message "Use `towards` without the preceding `to`." let description "Removes redundant `to` before `towards`." let kind "Redundancy" let becomes "towards" ================================================ FILE: harper-core/src/linting/weir_rules/TrialAndError.weir ================================================ expr main (trail and error) let message "You misspelled `trial`." let description "Corrects `trail` to `trial` in `trial and error`." let kind "Typo" let becomes "trial and error" test "It was produced through trail and error." "It was produced through trial and error." ================================================ FILE: harper-core/src/linting/weir_rules/TrueToWord.weir ================================================ expr main <(true to [my, your, his, her, its, our, their, one's] words), words> let message "Replace the plural `words` with the idiomatic singular form when someone stays true to a promise." let description "Normalizes phrasing around `true to ` so it follows the conventional `true to one's word`." let kind "Style" let becomes "word" test "She was true to her words." "She was true to her word." test "He stays TRUE to his words daily." "He stays TRUE to his word daily." test "We're true to our words even when it's hard." "We're true to our word even when it's hard." test "You're true to your words, no matter what." "You're true to your word, no matter what." test "I try to be true to my words." "I try to be true to my word." test "They remain true to their words after the announcement." "They remain true to their word after the announcement." test "True to one's words, the promise held." "True to one's word, the promise held." test "True to its words, the contract stands." "True to its word, the contract stands." test "He has been true to her words through thick and thin." "He has been true to her word through thick and thin." test "They were true to THEIR words, so the customers celebrated." "They were true to THEIR word, so the customers celebrated." test "One stays true to one's words while keeping a diary." "One stays true to one's word while keeping a diary." test "I'm true to my words." "I'm true to my word." test "True to your words, you resumed the pledge." "True to your word, you resumed the pledge." allows "She was true to her word." allows "They were true to the words they heard in class." allows "Being true to your word is the goal." allows "The article praised her true words." allows "Our team is true to the word we said earlier." ================================================ FILE: harper-core/src/linting/weir_rules/TuffEnough.weir ================================================ expr main <(tuff [enough, like]), (tuff)> let message "Swap `tuff` for `tough` when it describes strength or difficulty followed by 'enough' or 'like'." let description "The adjective `tough` pairs with words like `enough` or `like`, so correct the common typo `tuff` in those constructions." let kind "Typo" let becomes "tough" let strategy "MatchCase" # True positives # These examples should be rewritten with 'tough'. test "He was tuff enough to lift it." "He was tough enough to lift it." test "That plan needs to be tuff enough to withstand critique." "That plan needs to be tough enough to withstand critique." test "Tuff enough, he still tried." "Tough enough, he still tried." test "I'm feeling tuff like a warrior today." "I'm feeling tough like a warrior today." test "Her tuff enough answer silenced the crowd." "Her tough enough answer silenced the crowd." test "The tuff like textures on the armor impressed me." "The tough like textures on the armor impressed me." test "They need to be tuff enough to finish the run." "They need to be tough enough to finish the run." test "Tuff like this builds character." "Tough like this builds character." test "She acted tuff enough to merge the teams." "She acted tough enough to merge the teams." test "Tuff like steel, the hinge kept swinging." "Tough like steel, the hinge kept swinging." test "The argument must be tuff enough to sway them." "The argument must be tough enough to sway them." test "Tuff enough socks keep the feet warm." "Tough enough socks keep the feet warm." # True negatives # The rule should not fire when `tuff` is part of a name or followed by other words. test "Tuff City hosts the festival." "Tuff City hosts the festival." test "He called the passage tuff and unforgiving." "He called the passage tuff and unforgiving." test "She grabbed a tuff bar before the workout." "She grabbed a tuff bar before the workout." allows "Stay tuff, friend." allows "Tuff, the nickname, belonged to his grandfather." ================================================ FILE: harper-core/src/linting/weir_rules/TurnItOff.weir ================================================ expr main [(turn it of), (turn i of)] let message "Did you mean `turn it off`?" let description "Fixes the mistake in the phrase `turn it off`." let kind "Typo" let becomes "turn it off" test "Turn it of" "Turn it off" test "Turn i of" "Turn it off" allows "turn it off" allows "Turn it off" allows "run by one" ================================================ FILE: harper-core/src/linting/weir_rules/Unless.weir ================================================ expr main (unless if) let message "`Unless if` is not idiomatic English. `Unless`, `except if`, and `except when` express a condition that is true in all cases except one." let description "Corrects `unless if`." let kind "Usage" let becomes ["unless", "except if", "except when"] test "Simplex does not interpret the following invite link as an invite link unless if it has https:// in front of it." "Simplex does not interpret the following invite link as an invite link unless it has https:// in front of it." ================================================ FILE: harper-core/src/linting/weir_rules/VeryKnown.weir ================================================ expr main (very known) let message "Replace `very known` with the idiomatic phrasing that mentions recognition explicitly." let description "`very well-known` (or `well-known`) is the standard way to describe something widely recognized, so we flag the uncommon `very known` word pair." let kind "Usage" let becomes ["very well-known", "well-known"] let strategy "MatchCase" test "He is a very known actor." "He is a very well-known actor." test "Her work is very known among the local schools." "Her work is very well-known among the local schools." test "Our very known product draws new users every month." "Our very well-known product draws new users every month." test "The very known landmark draws visitors all year." "The very well-known landmark draws visitors all year." test "Very known memes cycle through the forum quickly." "Very well-known memes cycle through the forum quickly." test "I saw a very known engineer presenting at yesterday's event." "I saw a very well-known engineer presenting at yesterday's event." test "This very known rumor sparked debate on social feeds." "This very well-known rumor sparked debate on social feeds." test "They keep very known influencers on the payroll." "They keep very well-known influencers on the payroll." test "Is that a very known bug in this app?" "Is that a very well-known bug in this app?" test "It's a very known trick in debugging." "It's a very well-known trick in debugging." test "Very known incidents are still in the news." "Very well-known incidents are still in the news." test "A very known glitch pops up when we run the suite." "A very well-known glitch pops up when we run the suite." test "The very known singer clicked with fans again." "The very well-known singer clicked with fans again." test "We handle very known customers personally." "We handle very well-known customers personally." test "Any very known shortcut is documented." "Any very well-known shortcut is documented." allows "It is known very well, so we can move on." allows "The very knowledge that matters is intangible." allows "The very-known cover art is a nice throwback." allows "The team is very knowledgeable about the API." allows "They are extremely known for their tone." allows "Known very well, the trick still surprises people." ================================================ FILE: harper-core/src/linting/weir_rules/VeryLess.weir ================================================ expr main (very less) let message "English doesn't use `very` with `less`." let description "Corrects `very less`." let kind "Grammar" let becomes ["much less", "far less", "a lot less"] test "here is a simple way to do it with very less coding ... ;)" "here is a simple way to do it with much less coding ... ;)" test "algorithm for processing large datasets with very less pre-configuration" "algorithm for processing large datasets with far less pre-configuration" test "Also the gpu memory usage is very less." "Also the gpu memory usage is a lot less." ================================================ FILE: harper-core/src/linting/weir_rules/WantBe.weir ================================================ expr main (want be) let message "Did you mean `won't be` or `want to be`?" let description "Detects incorrect usage of `want be` and suggests `won't be` or `want to be` based on context." let becomes ["won't be", "want to be"] ================================================ FILE: harper-core/src/linting/weir_rules/WaveFunction.weir ================================================ expr main (wavefunction) let message "Did you mean `wave function`?" let description "Identifies the mistake of merging `wave` and `function` into one word. In quantum mechanics, a `wave function` (written as two words) describes the mathematical function that represents the quantum state of a particle or system. Correct usage is crucial for clear and accurate scientific communication." let kind "WordChoice" let becomes "wave function" ================================================ FILE: harper-core/src/linting/weir_rules/WellBeing.weir ================================================ expr main (wellbeing) let message "Use the hyphenated form for `well-being`." let description "Ensures `well-being` is correctly hyphenated." let kind "Punctuation" let becomes "well-being" ================================================ FILE: harper-core/src/linting/weir_rules/WellKept.weir ================================================ expr main [(highly-kept), (highly kept)] let message "`Highly-kept` is not standard. To describe secrets, `well-kept` is the most used phrase." let description "Flags `highly-kept` and recommends `well-kept` as an alternative." let kind "Usage" let becomes "well-kept" test "I assure you that frequency/angle dependence is a highly kept secret." "I assure you that frequency/angle dependence is a well-kept secret." test "Well, Kushina's giving birth was already a highly-kept secret so it makes sense to operate with only the completely necessary personnel." "Well, Kushina's giving birth was already a well-kept secret so it makes sense to operate with only the completely necessary personnel." ================================================ FILE: harper-core/src/linting/weir_rules/WhetYourAppetite.weir ================================================ expr main (wet your appetite) let message "Use the correct phrase for stimulating desire." let description "Ensures `whet your appetite` is used correctly, distinguishing it from the incorrect `wet` variation." let kind "Eggcorn" let becomes "whet your appetite" ================================================ FILE: harper-core/src/linting/weir_rules/WillContain.weir ================================================ expr main (will contains) let message "Did you mean `will contain`?" let description "Incorrect verb form: `will` should be followed by the base form `contain`." let kind "Agreement" let becomes "will contain" ================================================ FILE: harper-core/src/linting/weir_rules/WithoutOut.weir ================================================ expr main without out let message "Drop the duplicated `out` when it follows `without`." let description "When writers accidentally type `without out`, Harper can collapse the two words back into the single preposition." let kind "Typo" let becomes "without" let strategy "MatchCase" test "Without out a doubt, the team delivered." "Without a doubt, the team delivered." test "She ran without out hesitation this morning." "She ran without hesitation this morning." test "Without out fail, the backup completed." "Without fail, the backup completed." test "We proceed without out complaint from clients." "We proceed without complaint from clients." test "Without out this addition, the plan collapses." "Without this addition, the plan collapses." test "Without out any warning, the lights went out." "Without any warning, the lights went out." test "Without OUT, the process would stop." "Without, the process would stop." test "WITHOUT OUT luck, the players backed down." "WITHOUT luck, the players backed down." test "without out all hope, we succeeded." "without all hope, we succeeded." test "Last week we moved without out delay." "Last week we moved without delay." allows "Without outstanding debts we can pivot." allows "There is a without output fallback." allows "The absence of outbuildings was puzzling." allows "Without doubt, the plan succeeded." allows "Mind the output to ensure correctness." ================================================ FILE: harper-core/src/linting/weir_rules/WorstCaseScenario.weir ================================================ expr main [(worst case scenario), (worst-case-scenario)] let message "Hyphenate `worst-case`." let description "Corrects `worst-case scenario` when the hyphen is missing or `worse` is used instead of `worst`." let kind "Punctuation" let becomes "worst-case scenario" test "The worst case scenario can be calculated without looking at streams of data." "The worst-case scenario can be calculated without looking at streams of data." test "CAPD worst-case-scenario cloud simulator for naughty clouds." "CAPD worst-case scenario cloud simulator for naughty clouds." allows "Those are now on hold for month." ================================================ FILE: harper-core/src/linting/weir_rules/WroughtIron.weir ================================================ expr main [(rod iron), (rot iron), (rod-iron), (rot-iron)] let message "Prefer the standard term `wrought iron`." let description "`Wrought iron` is low-carbon, malleable iron used for decorative work; variants like `rod iron` or `rot iron` are phonetic misspellings that may confuse readers." let kind "Eggcorn" let becomes "wrought iron" test "The gate was crafted from rod iron." "The gate was crafted from wrought iron." test "The artisan works in rot iron." "The artisan works in wrought iron." allows "She specialized in wrought iron artwork." ================================================ FILE: harper-core/src/linting/weir_rules/YeaToYeah.weir ================================================ expr main (yea) let message "If you mean the informal word for `yes` and not the biblical or legalistic `yea`, the standard spelling is `yeah`." let description "Corrects `yea` to `yeah`." let kind "Spelling" let becomes "yeah" test "The very core basics are essentially the same because yea - it's just a web browser." "The very core basics are essentially the same because yeah - it's just a web browser." ================================================ FILE: harper-core/src/linting/weir_rules/YehToYeah.weir ================================================ expr main (yeh) let message "If you mean the informal word for `yes`, the standard spelling is `yeah`." let description "Corrects `yeh` to `yeah`." let kind "Spelling" let becomes "yeah" test "But yeh, it seems I'm the only one that feels that way" "But yeah, it seems I'm the only one that feels that way" ================================================ FILE: harper-core/src/linting/weir_rules/YourPredicateAdjective.weir ================================================ expr main [<([your, yr, ur, ya] [cool, serious, ready, proud, patient, committed, calm, brave, excited, kind, delightful, awake, dedicated, loyal, (really patient), (very patient), (totally committed), (surprisingly calm), (exceptionally brave), (so excited), (very very kind), (absolutely delightful), (barely awake), (really dedicated)]), [your, yr, ur, ya]>] let message "Use the contraction `you're` (you are) before predicate adjectives instead of the possessive `your` or its variants." let description "Catches cases where a predicate adjective follows `your`, `yr`, `ur`, or `ya` and suggests the proper contraction so the sentence states how someone is feeling or behaving." let kind "Grammar" let becomes "you're" let strategy "MatchCase" test "Your cool." "You're cool." test "your serious?" "you're serious?" test "UR ready?" "YOU'RE ready?" test "ya proud?" "you're proud?" test "Your really patient." "You're really patient." test "Your very patient." "You're very patient." test "your totally committed?" "you're totally committed?" test "UR surprisingly calm." "YOU'RE surprisingly calm." test "Ya exceptionally brave?" "You're exceptionally brave?" test "Your so excited?" "You're so excited?" test "your very very kind." "you're very very kind." test "YA absolutely delightful." "YOU'RE absolutely delightful." test "ur barely awake." "you're barely awake." test "Ya really dedicated." "You're really dedicated." test "yr loyal?" "you're loyal?" test "Your favorite color is blue." "Your favorite color is blue." test "Your excitement is contagious." "Your excitement is contagious." test "UR car is parked outside." "UR car is parked outside." test "ya favorite flavor is mint." "ya favorite flavor is mint." test "Your very good idea is interesting." "Your very good idea is interesting." test "Ur new plan looks solid." "Ur new plan looks solid." ================================================ FILE: harper-core/src/linting/weir_rules/mod.rs ================================================ use super::LintGroup; use crate::weir::WeirLinter; macro_rules! generate_boilerplate { ([$($name:ident),+ $(,)?]) => { pub fn lint_group() -> LintGroup { let mut group = LintGroup::default(); { $( group.add_chunk_expr_linter(stringify!($name), WeirLinter::new(include_str!(concat!(env!("WEIR_RULE_DIR"), "/", stringify!($name), ".weir"))).unwrap()); )+ } group.set_all_rules_to(Some(true)); group } #[cfg(test)] mod tests { use paste::paste; use crate::weir::tests::assert_passes_all; use crate::weir::WeirLinter; $( paste! { #[test] fn [](){ let mut linter = WeirLinter::new(include_str!(concat!(env!("WEIR_RULE_DIR"), "/", stringify!($name), ".weir"))).unwrap(); assert_passes_all(&mut linter); } } )+ } }; } include!(env!("WEIR_RULE_LIST")); ================================================ FILE: harper-core/src/linting/well_educated.rs ================================================ use crate::{ Token, TokenStringExt, expr::{Expr, SequenceExpr}, patterns::{WhitespacePattern, WordSet}, }; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct WellEducated { expr: SequenceExpr, } impl Default for WellEducated { fn default() -> Self { let combined = WordSet::new(&["good-educated"]); let separated = SequenceExpr::default() .t_aco("good") .then_optional(WhitespacePattern) .then_hyphen() .then_optional(WhitespacePattern) .t_aco("educated"); let expr = SequenceExpr::any_of(vec![Box::new(combined), Box::new(separated)]); Self { expr } } } impl ExprLinter for WellEducated { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let original = span.get_content(source); Some(Lint { span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::replace_with_match_case( "well-educated".chars().collect(), original, )], message: "Prefer `well-educated` for this compound.".into(), priority: 35, }) } fn description(&self) -> &'static str { "Replaces `good-educated` with the accepted compound `well-educated`." } } #[cfg(test)] mod tests { use super::WellEducated; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn corrects_simple_sentence() { assert_suggestion_result( "She is good-educated.", WellEducated::default(), "She is well-educated.", ); } #[test] fn corrects_in_clause() { assert_suggestion_result( "The panel found him good-educated and articulate.", WellEducated::default(), "The panel found him well-educated and articulate.", ); } #[test] fn corrects_with_modifier() { assert_suggestion_result( "They considered her very good-educated for her age.", WellEducated::default(), "They considered her very well-educated for her age.", ); } #[test] fn corrects_all_caps() { assert_suggestion_result( "Their mentors are GOOD-EDUCATED leaders.", WellEducated::default(), "Their mentors are WELL-EDUCATED leaders.", ); } #[test] fn corrects_title_case() { assert_suggestion_result( "The report lauded Good-Educated Candidates.", WellEducated::default(), "The report lauded Well-Educated Candidates.", ); } #[test] fn corrects_with_quotes() { assert_suggestion_result( "He called them \"good-educated\" professionals.", WellEducated::default(), "He called them \"well-educated\" professionals.", ); } #[test] fn corrects_split_tokens() { assert_suggestion_result( "Their children are good - educated despite the odds.", WellEducated::default(), "Their children are well-educated despite the odds.", ); } #[test] fn allows_well_educated() { assert_lint_count("She is well-educated.", WellEducated::default(), 0); } #[test] fn allows_good_education_phrase() { assert_lint_count( "They received a good education.", WellEducated::default(), 0, ); } #[test] fn allows_good_to_be_educated() { assert_lint_count( "It is good to be educated about local history.", WellEducated::default(), 0, ); } } ================================================ FILE: harper-core/src/linting/were_where.rs ================================================ use harper_brill::UPOS; use crate::linting::expr_linter::Chunk; use crate::{ CharStringExt, Token, TokenKind, expr::{Expr, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::UPOSSet, }; pub struct WereWhere { expr: SequenceExpr, } impl Default for WereWhere { fn default() -> Self { // === where → were === // "they/we" are unambiguous plural subject pronouns — "where" directly after // them is almost certainly a typo for "were". // e.g. "they where going" → "they were going" let unambiguous_pronoun_where = SequenceExpr::word_set(&["they", "we"]) .t_ws() .t_aco("where"); // "you where" alone is ambiguous ("I'll show you where to go"), so only flag // it when followed by a verb, auxiliary, or adjective — confirming a verb slot. // e.g. "you where going" → "you were going" let you_where_verb = SequenceExpr::aco("you") .t_ws() .t_aco("where") .t_ws() .then(UPOSSet::new(&[UPOS::VERB, UPOS::AUX, UPOS::ADJ])); // === were → where === // A verb of cognition or motion followed directly by "were" and then a // pronoun, determiner, or proper noun indicates the start of a relative or // indirect question — where "were" should be "where". // e.g. "I know were they went" → "I know where they went" // e.g. "I found were the book was" → "I found where the book was" // // "they were going" does NOT match: "they" (PRON) precedes "were", not VERB. // "I think they were going" does NOT match: "they" sits between "think" and "were". let verb_were_clause = SequenceExpr::with(|tok: &Token, _: &[char]| tok.kind.is_upos(UPOS::VERB)) .t_ws() .t_aco("were") .t_ws() .then(UPOSSet::new(&[UPOS::PRON, UPOS::DET, UPOS::PROPN])); Self { expr: SequenceExpr::any_of(vec![ Box::new(unambiguous_pronoun_where), Box::new(you_where_verb), Box::new(verb_were_clause), ]), } } } impl ExprLinter for WereWhere { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { const WHERE: &[char] = &['w', 'h', 'e', 'r', 'e']; const WERE: &[char] = &['w', 'e', 'r', 'e']; // Check if "where" appears in the match (where → were case) let where_tok = toks.iter().find(|tok| { matches!(tok.kind, TokenKind::Word(_)) && tok.span.get_content(src).eq_ignore_ascii_case_chars(WHERE) }); // Check if "were" appears in the match (were → where case) let were_tok = toks.iter().find(|tok| { matches!(tok.kind, TokenKind::Word(_)) && tok.span.get_content(src).eq_ignore_ascii_case_chars(WERE) }); if let Some(tok) = where_tok { Some(Lint { span: tok.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "were", tok.span.get_content(src), )], message: "It looks like this is a typo, did you mean `were`?".to_string(), ..Default::default() }) } else { were_tok.map(|tok| Lint { span: tok.span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case_str( "where", tok.span.get_content(src), )], message: "It looks like this is a typo, did you mean `where`?".to_string(), ..Default::default() }) } } fn description(&self) -> &'static str { "Detects mixing up `were` and `where`." } } #[cfg(test)] mod tests { use super::WereWhere; use crate::linting::tests::{assert_no_lints, assert_suggestion_result}; // ── where → were: unambiguous pronouns ────────────────────────────────── #[test] fn fix_they_where() { assert_suggestion_result( "They where going to the store.", WereWhere::default(), "They were going to the store.", ); } #[test] fn fix_we_where() { assert_suggestion_result( "We where right about that.", WereWhere::default(), "We were right about that.", ); } #[test] fn fix_they_where_happy() { assert_suggestion_result( "They where happy with the result.", WereWhere::default(), "They were happy with the result.", ); } // ── where → were: "you where" with a following verb ───────────────────── #[test] fn fix_you_where_going() { assert_suggestion_result( "you where going in the right direction.", WereWhere::default(), "you were going in the right direction.", ); } #[test] fn fix_you_where_right() { assert_suggestion_result( "you where right about that.", WereWhere::default(), "you were right about that.", ); } // ── were → where: verb + were + pronoun/determiner ────────────────────── #[test] fn fix_know_were_they() { assert_suggestion_result( "Do you know were they went?", WereWhere::default(), "Do you know where they went?", ); } #[test] fn fix_forgot_were_i() { assert_suggestion_result( "I forgot were I put my keys.", WereWhere::default(), "I forgot where I put my keys.", ); } #[test] fn fix_found_were_the() { assert_suggestion_result( "I found were the book was.", WereWhere::default(), "I found where the book was.", ); } #[test] fn fix_go_were_they() { assert_suggestion_result( "Go were they tell you.", WereWhere::default(), "Go where they tell you.", ); } // ── where → were: more they/we variants ───────────────────────────────── #[test] fn fix_we_where_almost_done() { // No following-word check needed for "we/they" — the pair alone is enough assert_suggestion_result( "We where almost done with the task.", WereWhere::default(), "We were almost done with the task.", ); } #[test] fn fix_they_where_able() { assert_suggestion_result( "They where able to fix the issue in time.", WereWhere::default(), "They were able to fix the issue in time.", ); } #[test] fn fix_we_where_told() { assert_suggestion_result( "We where told about the change last week.", WereWhere::default(), "We were told about the change last week.", ); } #[test] fn fix_they_where_supposed() { assert_suggestion_result( "They where supposed to be here by now.", WereWhere::default(), "They were supposed to be here by now.", ); } // ── where → were: more "you where" variants ────────────────────────────── #[test] fn fix_you_where_supposed() { // "supposed" is ADJ — confirms verb slot assert_suggestion_result( "You where supposed to call me.", WereWhere::default(), "You were supposed to call me.", ); } #[test] fn fix_you_where_asked() { // "asked" past participle used as VERB assert_suggestion_result( "you where asked to leave the room.", WereWhere::default(), "you were asked to leave the room.", ); } // ── were → where: more verbs and pronouns ──────────────────────────────── #[test] fn fix_remember_were_i() { assert_suggestion_result( "Do you remember were I left the keys?", WereWhere::default(), "Do you remember where I left the keys?", ); } #[test] fn fix_check_were_the() { assert_suggestion_result( "Check were the error occurred.", WereWhere::default(), "Check where the error occurred.", ); } #[test] fn fix_asked_were_he() { assert_suggestion_result( "She asked were he lived.", WereWhere::default(), "She asked where he lived.", ); } #[test] fn fix_know_were_the_bug() { assert_suggestion_result( "I know were the bug is.", WereWhere::default(), "I know where the bug is.", ); } #[test] fn fix_find_were_it() { assert_suggestion_result( "Find were it crashed.", WereWhere::default(), "Find where it crashed.", ); } // ── no false positives ─────────────────────────────────────────────────── #[test] fn no_flag_where_they_are() { assert_no_lints("Do you know where they are going?", WereWhere::default()); } #[test] fn no_flag_they_were_going() { assert_no_lints("They were going to the store.", WereWhere::default()); } #[test] fn no_flag_we_were_right() { assert_no_lints("We were right about that.", WereWhere::default()); } #[test] fn no_flag_show_you_where() { // "you" before "where" is legitimate — followed by "to" (PART), not a verb assert_no_lints("I'll show you where to go.", WereWhere::default()); } #[test] fn no_flag_tell_you_where_the() { // "you where" followed by DET — not flagged (DET is not VERB/AUX/ADJ) assert_no_lints("I'll tell you where the exit is.", WereWhere::default()); } #[test] fn no_flag_they_were_wrong() { // "they" (PRON) precedes "were", so VERB + "were" pattern does not fire assert_no_lints("I think they were wrong.", WereWhere::default()); } #[test] fn no_flag_confirmed_they_were() { // "they" sits between "confirmed" and "were" — not adjacent, no match assert_no_lints("I confirmed they were correct.", WereWhere::default()); } #[test] fn no_flag_found_they_were() { assert_no_lints("He found they were missing.", WereWhere::default()); } #[test] fn no_flag_where_were_they() { // "Where" is an adverb or subordinating conjunction here, not VERB — the were→where pattern does not fire assert_no_lints("Where were they going?", WereWhere::default()); } #[test] fn no_flag_showed_me_where() { // Object pronoun "me" sits between "showed" and "where" — no direct adjacency assert_no_lints("He showed me where the exit was.", WereWhere::default()); } // ── known limitations (documented but not yet handled) ─────────────────── #[test] #[ignore = "limitation: 'you where' followed by DET is not flagged; would need DET in the following-word set"] fn fix_you_where_the_only_one() { assert_suggestion_result( "you where the only one there.", WereWhere::default(), "you were the only one there.", ); } #[test] #[ignore = "limitation: sentence-initial 'Where' as typo for 'Were' is not handled"] fn fix_where_they_going_sentence_start() { assert_suggestion_result( "Where they going to the party?", WereWhere::default(), "Were they going to the party?", ); } #[test] #[ignore = "limitation: indirect object between verb and 'were' is not detected"] fn fix_showed_me_were() { assert_suggestion_result( "He showed me were the exit was.", WereWhere::default(), "He showed me where the exit was.", ); } } ================================================ FILE: harper-core/src/linting/whereas.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::{Token, TokenStringExt}; use super::{ExprLinter, Lint, LintKind, Suggestion}; use crate::linting::expr_linter::Chunk; pub struct Whereas { expr: SequenceExpr, } impl Default for Whereas { fn default() -> Self { let pattern = SequenceExpr::default() .t_aco("where") .then_whitespace() .t_aco("as"); Self { expr: pattern } } } impl ExprLinter for Whereas { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let orig_chars = span.get_content(source); Some(Lint { span, lint_kind: LintKind::WordChoice, suggestions: vec![Suggestion::replace_with_match_case( vec!['w', 'h', 'e', 'r', 'e', 'a', 's'], orig_chars, )], message: "`Whereas` is commonly mistaken for `where as`.".to_owned(), ..Default::default() }) } fn description(&self) -> &'static str { "The Whereas rule is designed to identify instances where the phrase `where as` is used in text and suggests replacing it with the single word `whereas`." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::Whereas; #[test] fn where_as() { assert_suggestion_result( "Dogs love playing fetch, where as cats are more independent creatures.", Whereas::default(), "Dogs love playing fetch, whereas cats are more independent creatures.", ); } } ================================================ FILE: harper-core/src/linting/whom_subject_of_verb.rs ================================================ use crate::{ CharStringExt, Lint, Token, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, patterns::ModalVerb, }; pub struct WhomSubjectOfVerb { expr: SequenceExpr, } impl Default for WhomSubjectOfVerb { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["whom", "whomever", "whomsoever"]) .t_ws() .then_any_of(vec![ Box::new(SequenceExpr::default().then_kind_where(|k| { k.is_verb_third_person_singular_present_form() || k.is_verb_simple_past_form() })), Box::new(ModalVerb::with_common_errors()), ]), } } } impl ExprLinter for WhomSubjectOfVerb { type Unit = Chunk; fn description(&self) -> &str { "Detects whom and its variants used as the subject of a verb instead of who." } fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint_with_context( &self, toks: &[Token], src: &[char], ctx: Option<(&[Token], &[Token])>, ) -> Option { if let Some((before, _)) = ctx && let [.., word, ws1, prep, ws2] = before && ws2.kind.is_whitespace() && prep .span .get_content(src) .eq_ignore_ascii_case_chars(&['o', 'f']) && ws1.kind.is_whitespace() && word.span.get_content(src).eq_ignore_ascii_case_str("many") { return None; } let whom_span = toks.first()?.span; let whom_chars = whom_span.get_content(src); let who_vec = [&whom_chars[..3], &whom_chars[4..]].concat(); Some(Lint { span: whom_span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::replace_with_match_case(who_vec, whom_chars)], message: "“Whom” is used for the object of a verb and “who” is used for the subject of a verb.".to_owned(), ..Default::default() }) } } #[cfg(test)] mod tests { use super::WhomSubjectOfVerb; use crate::linting::tests::{assert_lint_count, assert_no_lints, assert_suggestion_result}; #[test] fn flag_whom_has() { assert_suggestion_result( "there is no course to whom has opened the most PRs", WhomSubjectOfVerb::default(), "there is no course to who has opened the most PRs", ); } #[test] fn flag_whomever_wrote() { assert_suggestion_result( "To whomever wrote this course, I truly am not trying to be a jerk or ungrateful", WhomSubjectOfVerb::default(), "To whoever wrote this course, I truly am not trying to be a jerk or ungrateful", ); } #[test] #[ignore = "wrong kind of error"] fn dont_flag_wrong_kind_of_error() { assert_lint_count( "self service ticket view is not showing to whom is the ticket assigned to", // "self service ticket view is not showing to whom this ticket is assigned" // "self service ticket view is not showing whom this ticket is assigned to" WhomSubjectOfVerb::default(), 0, ); } #[test] fn dont_flag_whom_can() { assert_suggestion_result( "Whom can of course build a helper, but that is only a workaround.", WhomSubjectOfVerb::default(), "Who can of course build a helper, but that is only a workaround.", ); } #[test] fn flag_whomever_is() { assert_suggestion_result( "Whomever is making those harassing phone calls to me after I post something on Github - consider yourself put on notice.", WhomSubjectOfVerb::default(), "Whoever is making those harassing phone calls to me after I post something on Github - consider yourself put on notice.", ); } #[test] fn flag_whom_is() { assert_suggestion_result( "I thought it might be good idea to address the topic of whom is \"allowed\" to merge.", WhomSubjectOfVerb::default(), "I thought it might be good idea to address the topic of who is \"allowed\" to merge.", ); } #[test] fn flag_whomsoever_will() { assert_suggestion_result( "This is a quick record of my discoveries and solution for whomsoever will be fixing the issue.", WhomSubjectOfVerb::default(), "This is a quick record of my discoveries and solution for whosoever will be fixing the issue.", ); } #[test] fn dont_flag_many_of_whom() { assert_no_lints( "it's far from straightforward for new users, many of whom will likely have a lot to learn", WhomSubjectOfVerb::default(), ); } } ================================================ FILE: harper-core/src/linting/widely_accepted.rs ================================================ use crate::expr::Expr; use crate::expr::SequenceExpr; use crate::linting::expr_linter::Chunk; use crate::{ Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, }; pub struct WidelyAccepted { expr: SequenceExpr, } impl Default for WidelyAccepted { fn default() -> Self { let expr = SequenceExpr::default() .t_aco("wide") .then_whitespace() .then_word_set(&["accepted", "acceptable", "used"]); Self { expr } } } impl ExprLinter for WidelyAccepted { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { // We only need to replace the `wide` token with `widely`. let wide_token = matched_tokens.first()?; let wide_chars = wide_token.span.get_content(source); Some(Lint { span: wide_token.span, lint_kind: LintKind::Miscellaneous, message: "Use the adverb `widely` in this context. For example, `widely accepted` or `widely used` is standard usage." .to_owned(), suggestions: vec![Suggestion::replace_with_match_case_str("widely", wide_chars)], priority: 31, }) } fn description(&self) -> &str { "Flags `wide accepted`, `wide acceptable`, or `wide used` and recommends switching `wide` to the adverb `widely`." } } #[cfg(test)] mod tests { use super::WidelyAccepted; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn wide_accepted_lowercase() { assert_suggestion_result( "It is wide accepted that exercise improves health.", WidelyAccepted::default(), "It is widely accepted that exercise improves health.", ); } #[test] fn wide_acceptable_mixed_case() { assert_suggestion_result( "Wide acceptable standards are used in the design.", WidelyAccepted::default(), "Widely acceptable standards are used in the design.", ); } #[test] fn widely_already_correct() { assert_lint_count( "It is widely accepted that sunlight is beneficial in moderation.", WidelyAccepted::default(), 0, ); } #[test] fn no_false_positive() { assert_lint_count( "The house had wide open windows during the renovation.", WidelyAccepted::default(), 0, ); } #[test] fn wide_accepted_in_long_text() { assert_suggestion_result( "This is an example paragraph, and it is wide accepted that these changes will improve performance. In fact, widely used frameworks have already adopted them.", WidelyAccepted::default(), "This is an example paragraph, and it is widely accepted that these changes will improve performance. In fact, widely used frameworks have already adopted them.", ); } #[test] fn wide_twice_in_one_sentence() { assert_suggestion_result( "It is wide accepted and wide used by many professionals.", WidelyAccepted::default(), "It is widely accepted and widely used by many professionals.", ); } } ================================================ FILE: harper-core/src/linting/win_prize.rs ================================================ use crate::expr::{Expr, OwnedExprExt}; use crate::expr::{LongestMatchOf, SequenceExpr}; use crate::linting::expr_linter::Chunk; use crate::{ Lrc, Token, linting::{ExprLinter, Lint, LintKind, Suggestion}, patterns::WordSet, }; pub struct WinPrize { expr: LongestMatchOf, } impl Default for WinPrize { fn default() -> Self { let verbs = Lrc::new(WordSet::new(&["win", "wins", "won", "winning"])); let miss = Lrc::new(WordSet::new(&["price", "prices", "prise", "prises"])); let pattern = SequenceExpr::with(verbs.clone()) .then_whitespace() .then_determiner() .then_whitespace() .then(miss.clone()) .or_longest(SequenceExpr::with(verbs).then_whitespace().then(miss)); Self { expr: pattern } } } impl ExprLinter for WinPrize { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let candidate = toks.last()?; let raw = candidate.span.get_content_string(src).to_lowercase(); let repl = match raw.as_str() { "price" | "prise" => "prize", "prices" | "prises" => "prizes", _ => return None, }; Some(Lint { span: candidate.span, lint_kind: LintKind::Miscellaneous, suggestions: vec![Suggestion::ReplaceWith(repl.chars().collect())], message: format!("Perhaps you meant `{repl}`, the word for an award."), priority: 50, }) } fn description(&self) -> &str { "Catches the mix-up between `price`/`prise` and `prize` after the verb `win`." } } #[cfg(test)] mod tests { use super::WinPrize; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fix_price_singular() { assert_suggestion_result( "Lena won a price in the coding marathon.", WinPrize::default(), "Lena won a prize in the coding marathon.", ); } #[test] fn fix_price_plural() { assert_suggestion_result( "Our team won the prices announced yesterday.", WinPrize::default(), "Our team won the prizes announced yesterday.", ); } #[test] fn fix_prise_singular() { assert_suggestion_result( "He finally won the prise he'd dreamed of.", WinPrize::default(), "He finally won the prize he'd dreamed of.", ); } #[test] fn fix_prise_plural() { assert_suggestion_result( "The inventors won several prises at the expo.", WinPrize::default(), "The inventors won several prizes at the expo.", ); } #[test] fn ignore_correct_prize() { assert_lint_count( "Miranda won the grand prize last year.", WinPrize::default(), 0, ); } #[test] fn fix_no_det() { assert_suggestion_result("I won prices!", WinPrize::default(), "I won prizes!"); } } ================================================ FILE: harper-core/src/linting/wish_could.rs ================================================ use super::{Lint, LintKind, Suggestion}; use crate::Token; use crate::expr::{Expr, SequenceExpr}; use crate::linting::{ExprLinter, expr_linter::Chunk}; pub struct WishCould { expr: SequenceExpr, } impl Default for WishCould { fn default() -> Self { Self { expr: SequenceExpr::word_set(&["wish", "wished", "wishes", "wishing"]) .t_ws() .then_any_of(vec![ Box::new(SequenceExpr::default().then_subject_pronoun()), Box::new(SequenceExpr::word_set(&[ // Elective existential indefinite pronouns "anybody", "anyone", // Universal indefinite pronouns "everybody", "everyone", // Negative indefinite pronouns (correct) "nobody", // Negative indefinite pronouns (incorrect) "noone", // Assertive existential indefinite pronouns "somebody", "someone", // Demonstrative pronouns "these", "this", "those", ])), ]) .t_ws() .t_aco("can"), } } } impl ExprLinter for WishCould { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let can_tok = toks.last()?; let can_span = can_tok.span; Some(Lint { span: can_span, lint_kind: LintKind::Grammar, suggestions: vec![Suggestion::replace_with_match_case_str( "could", can_span.get_content(src), )], message: "Use 'could' instead of 'can' after 'wish'.".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Checks for `can` being used after `wish` when it should be `could`." } } #[cfg(test)] mod tests { use super::*; use crate::linting::tests::assert_suggestion_result; #[test] fn flag_wish_we_can() { assert_suggestion_result( "i wish we can spend more time together", WishCould::default(), "i wish we could spend more time together", ); } #[test] fn flag_wish_i_can() { assert_suggestion_result( "I wish I can finally forgive myself for all the things I am not.", WishCould::default(), "I wish I could finally forgive myself for all the things I am not.", ); } #[test] fn flag_wish_you_can() { assert_suggestion_result( "I wish you can find your true love.", WishCould::default(), "I wish you could find your true love.", ); } #[test] fn flag_wishes_they_can() { assert_suggestion_result( "What your Therapist wishes they can tell you.", WishCould::default(), "What your Therapist wishes they could tell you.", ); } #[test] fn flag_wishing_someone_can() { assert_suggestion_result( "Forever wishing someone can point me in the right direction", WishCould::default(), "Forever wishing someone could point me in the right direction", ); } #[test] fn flag_wish_they_can() { assert_suggestion_result( "I wish they can plant more trees on this road.", WishCould::default(), "I wish they could plant more trees on this road.", ); } #[test] fn flag_wished_he_can() { assert_suggestion_result( "I just wished he can talk and tell me how he feels", WishCould::default(), "I just wished he could talk and tell me how he feels", ); } #[test] fn wish_this_can() { assert_suggestion_result( "but I wish this can be fixed by Electron team", WishCould::default(), "but I wish this could be fixed by Electron team", ) } #[test] fn wish_it_can() { assert_suggestion_result( "Wish it can be supported.", WishCould::default(), "Wish it could be supported.", ) } #[test] fn wish_somebody_can() { assert_suggestion_result( "I wish somebody can fix this issue.", WishCould::default(), "I wish somebody could fix this issue.", ) } } ================================================ FILE: harper-core/src/linting/wordpress_dotcom.rs ================================================ use crate::{CharString, CharStringExt, TokenStringExt}; use super::{Lint, LintKind, Linter, Suggestion}; /// Make sure you properly capitalize `WordPress.com`. #[derive(Default)] pub struct WordPressDotcom; impl Linter for WordPressDotcom { fn lint(&mut self, document: &crate::Document) -> Vec { let correct: CharString = "WordPress.com".chars().collect(); let correct_lower = correct.to_lower(); let mut lints = Vec::new(); for hostname in document.iter_hostnames() { let text = document.get_span_content(&hostname.span); if correct.as_slice() != text && text.to_lower() == correct_lower { lints.push(Lint { span: hostname.span, lint_kind: LintKind::Style, suggestions: vec![Suggestion::ReplaceWith(correct.to_vec())], message: "The WordPress hosting provider should be stylized as `WordPress.com`" .to_owned(), priority: 31, }); } } lints } fn description(&self) -> &str { "Ensures correct capitalization of WordPress.com. This rule verifies that the official stylization of WordPress.com is used when referring to the hosting provider." } } #[cfg(test)] mod tests { use crate::linting::tests::assert_suggestion_result; use super::WordPressDotcom; #[test] fn simple() { assert_suggestion_result("wordpress.com", WordPressDotcom, "WordPress.com"); } #[test] fn sentence() { assert_suggestion_result( "wordpress.com is a great hosting provider", WordPressDotcom, "WordPress.com is a great hosting provider", ); } } ================================================ FILE: harper-core/src/linting/worth_to_do.rs ================================================ use crate::{ CharStringExt, Lint, Token, TokenStringExt, char_ext::CharExt, expr::{Expr, SequenceExpr}, linting::{ExprLinter, LintKind, Suggestion, expr_linter::Chunk}, spell::Dictionary, }; pub struct WorthToDo where D: Dictionary, { expr: SequenceExpr, dict: D, } impl WorthToDo where D: Dictionary, { pub fn new(dict: D) -> Self { Self { expr: SequenceExpr::aco("worth") .t_ws() .t_aco("to") .t_ws() .then_verb_lemma(), dict, } } } impl ExprLinter for WorthToDo where D: Dictionary, { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let tolemtoks = &toks[toks.len() - 3..]; let lemtok = toks.last()?; let tolemspan = tolemtoks.span()?; let lemspan = lemtok.span; let tolemchars = tolemspan.get_content(src); let lemchars = lemspan.get_content(src); let lemstr = lemspan.get_content_string(src); let mut gerunds = Vec::new(); let glom_ing = format!("{}ing", lemstr); if self.dict.contains_word_str(&glom_ing) { gerunds.push(glom_ing); } if lemchars.ends_with_ignore_ascii_case_chars(&['e']) { let replace_e_with_ing = format!("{}ing", &lemstr[..lemstr.len() - 1]); if self.dict.contains_word_str(&replace_e_with_ing) { gerunds.push(replace_e_with_ing); } } if let Some(last_letter) = lemstr.chars().last() && !last_letter.is_vowel() { let double_consonant = format!("{}{}ing", lemstr, last_letter); if self.dict.contains_word_str(&double_consonant) { gerunds.push(double_consonant); } } let suggestions = gerunds .into_iter() .map(|gerund| { Suggestion::replace_with_match_case( gerund.chars().collect::>(), tolemchars, ) }) .collect(); Some(Lint { span: tolemspan, lint_kind: LintKind::Grammar, suggestions, message: "Use the `gerund` of the verb, the form that ends in `-ing`".to_string(), ..Default::default() }) } fn description(&self) -> &str { "Corrects `worth to` + a verb to `worth` + the gerund of the verb." } } #[cfg(test)] mod tests { use super::WorthToDo; use crate::{linting::tests::assert_suggestion_result, spell::FstDictionary}; #[test] fn worth_to_add() { assert_suggestion_result( "Is it worth to add those files?", WorthToDo::new(FstDictionary::curated()), "Is it worth adding those files?", ); } #[test] fn worth_to_adjust() { assert_suggestion_result( "If yes, it would be worth to adjust the description to make it easier to understand", WorthToDo::new(FstDictionary::curated()), "If yes, it would be worth adjusting the description to make it easier to understand", ); } #[test] fn worth_to_ask() { assert_suggestion_result( "So it is worth to ask for this there or take a look at their wiki pages. ", WorthToDo::new(FstDictionary::curated()), "So it is worth asking for this there or take a look at their wiki pages. ", ); } #[test] fn worth_to_buy() { assert_suggestion_result( "and it makes it really worth to buy the software", WorthToDo::new(FstDictionary::curated()), "and it makes it really worth buying the software", ); } #[test] fn worth_to_deal() { assert_suggestion_result( "CC2531 is considered as crap in 2024 and its not worth to deal with it.", WorthToDo::new(FstDictionary::curated()), "CC2531 is considered as crap in 2024 and its not worth dealing with it.", ); } #[test] fn worth_to_do() { assert_suggestion_result( "Is it worth to do the credit-card-balance-transfer?", WorthToDo::new(FstDictionary::curated()), "Is it worth doing the credit-card-balance-transfer?", ); } #[test] fn worth_to_experiment() { assert_suggestion_result( "Hello @tkchia, thanks for the hint, I agree it is worth to experiment.", WorthToDo::new(FstDictionary::curated()), "Hello @tkchia, thanks for the hint, I agree it is worth experimenting.", ); } #[test] fn worth_to_fix() { assert_suggestion_result( "i dont know if this is worth to fix, i just wanted to point this and start a discussion about this.", WorthToDo::new(FstDictionary::curated()), "i dont know if this is worth fixing, i just wanted to point this and start a discussion about this.", ); } #[test] fn worth_to_get_published() { assert_suggestion_result( "think that would be worth to get published in my Thesis.", WorthToDo::new(FstDictionary::curated()), "think that would be worth getting published in my Thesis.", ); } #[test] fn worth_to_imagine() { assert_suggestion_result( "Might be worth to imagine how the current Nu style would look like in other programming languages.", WorthToDo::new(FstDictionary::curated()), "Might be worth imagining how the current Nu style would look like in other programming languages.", ); } #[test] fn worth_to_invest() { assert_suggestion_result( "It doesn't seem worth to invest much effort in this though...", WorthToDo::new(FstDictionary::curated()), "It doesn't seem worth investing much effort in this though...", ); } #[test] fn worth_to_investigate() { assert_suggestion_result( "to get a feeling how CP-SAT works and what are directions worth to investigate i wanted to ask", WorthToDo::new(FstDictionary::curated()), "to get a feeling how CP-SAT works and what are directions worth investigating i wanted to ask", ); } #[test] fn worth_to_play() { assert_suggestion_result( "Is worth to play with thread count if there are no issues?", WorthToDo::new(FstDictionary::curated()), "Is worth playing with thread count if there are no issues?", ); } #[test] fn worth_to_put() { assert_suggestion_result( "Do you think it would be worth to put a suggestion to remove the kind network if cluster creation fails", WorthToDo::new(FstDictionary::curated()), "Do you think it would be worth putting a suggestion to remove the kind network if cluster creation fails", ); } #[test] fn worth_to_read() { assert_suggestion_result( "Stored books worth to read.", WorthToDo::new(FstDictionary::curated()), "Stored books worth reading.", ); } #[test] fn worth_to_revisit() { assert_suggestion_result( "we've had discussions before #260 and it maybe worth to revisit again", WorthToDo::new(FstDictionary::curated()), "we've had discussions before #260 and it maybe worth revisiting again", ); } #[test] fn worth_to_rewrite() { assert_suggestion_result( "is puppet so bad that it is worth to rewrite everything?", WorthToDo::new(FstDictionary::curated()), "is puppet so bad that it is worth rewriting everything?", ); } #[test] fn worth_to_try() { assert_suggestion_result( "is it really worth to try and what are facebook long-term plans about this engine.", WorthToDo::new(FstDictionary::curated()), "is it really worth trying and what are facebook long-term plans about this engine.", ); } #[test] fn worth_to_update() { assert_suggestion_result( "Hi, maybe it's worth to update doc with the script for Bullseye given by @frenchfaso ?", WorthToDo::new(FstDictionary::curated()), "Hi, maybe it's worth updating doc with the script for Bullseye given by @frenchfaso ?", ); } #[test] fn worth_to_upgrade() { assert_suggestion_result( "Your PR should've fixed that issue so I think it's worth to upgrade to 10.33 and see if that brings the delta down.", WorthToDo::new(FstDictionary::curated()), "Your PR should've fixed that issue so I think it's worth upgrading to 10.33 and see if that brings the delta down.", ); } #[test] fn worth_to_use_and_develop() { assert_suggestion_result( "I think It worth to use and worth to develop further", WorthToDo::new(FstDictionary::curated()), "I think It worth using and worth developing further", ); } #[test] fn works_with_uppercase_glom() { assert_suggestion_result( " YES IT IS WORTH TO DO", WorthToDo::new(FstDictionary::curated()), " YES IT IS WORTH DOING", ); } #[test] fn works_with_uppercase_final_e() { assert_suggestion_result( "THIS LINTER WAS WORTH TO MAKE", WorthToDo::new(FstDictionary::curated()), "THIS LINTER WAS WORTH MAKING", ); } #[test] fn works_with_uppercase_double_consonant() { assert_suggestion_result( "SO YEAH IT WAS WORTH TO GET THIS DONE", WorthToDo::new(FstDictionary::curated()), "SO YEAH IT WAS WORTH GETTING THIS DONE", ); } } ================================================ FILE: harper-core/src/linting/would_never_have.rs ================================================ use crate::linting::expr_linter::Chunk; use crate::{ Token, expr::{Expr, FixedPhrase, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion}, token_string_ext::TokenStringExt, }; pub struct WouldNeverHave { expr: SequenceExpr, } impl Default for WouldNeverHave { fn default() -> Self { let phrases = [ "could have never", "could never have", "could've never", "couldve never", "would have never", "would never have", "would've never", "wouldve never", ]; let expr: Vec> = phrases .iter() .map(|&phrase| Box::new(FixedPhrase::from_phrase(phrase)) as Box) .collect(); // TODO: verb should be perfect form ("done", "happened", etc.) when verb property changes are merged let expr = SequenceExpr::any_of(expr).then_whitespace().then_verb(); Self { expr } } } impl ExprLinter for WouldNeverHave { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let modal_have_toks = toks.first()?; let modal_have_chars = modal_have_toks.span.get_content(src); let modal_have_str = modal_have_toks.span.get_content_string(src).to_lowercase(); let modal = if modal_have_str.starts_with("could") { "could" } else if modal_have_str.starts_with("would") { "would" } else { return None; }; let is_contraction = modal_have_str.ends_with("ve"); let new_phrasing = format!( "never {modal}{}", if is_contraction { "'ve" } else { " have" } ); let suggestions = vec![Suggestion::replace_with_match_case( new_phrasing.chars().collect(), modal_have_chars, )]; let message = format!("For a more standard style, consider using `{new_phrasing}`."); Some(Lint { span: toks[..toks.len() - 2].span()?, lint_kind: LintKind::Style, suggestions, message, ..Default::default() }) } fn description(&self) -> &str { "Corrects `would/could have never` to `never would/could have`." } } #[cfg(test)] mod tests { use super::WouldNeverHave; use crate::linting::tests::assert_suggestion_result; #[test] fn fix_could_have_never_been() { assert_suggestion_result( "Having a conversation would have never been easier with Ramen!", WouldNeverHave::default(), "Having a conversation never would have been easier with Ramen!", ); } #[test] fn fix_would_have_never_come() { assert_suggestion_result( "This would have never come about without the help and encouragement of many people, too numerous to mention here.", WouldNeverHave::default(), "This never would have come about without the help and encouragement of many people, too numerous to mention here.", ); } #[test] fn fix_would_have_never_find() { assert_suggestion_result( "Thanks for the help, think I would have never find it out alone.", WouldNeverHave::default(), "Thanks for the help, think I never would have find it out alone.", ); } #[test] fn fix_all_caps() { assert_suggestion_result( "I WOULD'VE NEVER THOUGHT TO TEST ALL CAPS.", WouldNeverHave::default(), "I NEVER WOULD'VE THOUGHT TO TEST ALL CAPS.", ); } #[test] #[ignore = "Fails due to the strange way replace_with_match_case works"] fn fix_title_case() { assert_suggestion_result( "I Would Never Have Thought To Test Title Case English.", WouldNeverHave::default(), "I Never Would Have Thought To Test Title Case English.", ); } #[test] fn fix_could_never_have_worked() { assert_suggestion_result( "ft_quantile_discretizer could never have worked", WouldNeverHave::default(), "ft_quantile_discretizer never could have worked", ); } #[test] fn fix_would_never_have_thought_of() { assert_suggestion_result( "We discover security flaws that your team would never have thought of.", WouldNeverHave::default(), "We discover security flaws that your team never would have thought of.", ); } #[test] fn fix_wouldve_never_known_missing_apostrophe() { assert_suggestion_result( "We wouldve never known from the current api docs", WouldNeverHave::default(), "We never would've known from the current api docs", ); } #[test] fn fix_wouldve_never_grokked() { assert_suggestion_result( "I would've never grokked that it's an issue in rollup.", WouldNeverHave::default(), "I never would've grokked that it's an issue in rollup.", ); } #[test] fn fix_couldve_never_designed() { assert_suggestion_result( "Without my subscription I could've never designed this in such little time without it.", WouldNeverHave::default(), "Without my subscription I never could've designed this in such little time without it.", ); } } ================================================ FILE: harper-core/src/linting/wrong_apostrophe.rs ================================================ use crate::{ Token, TokenStringExt, expr::{Expr, FirstMatchOf, SequenceExpr}, linting::{ExprLinter, Lint, LintKind, Suggestion, expr_linter::Chunk}, }; const CONTRACTION_AND_POSSESSIVE_ENDINGS: [&str; 7] = ["d", "ll", "m", "re", "s", "t", "ve"]; pub struct WrongApostrophe { expr: FirstMatchOf, } impl Default for WrongApostrophe { fn default() -> Self { Self { expr: FirstMatchOf::new(vec![ Box::new( SequenceExpr::any_word() .then_semicolon() .then_word_set(&CONTRACTION_AND_POSSESSIVE_ENDINGS), ), Box::new( SequenceExpr::any_word() .then_acute() .then_word_set(&CONTRACTION_AND_POSSESSIVE_ENDINGS), ), ]), } } } impl ExprLinter for WrongApostrophe { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, toks: &[Token], src: &[char]) -> Option { let whole_span = toks.span()?; let base = &toks.first()?; let ending = &toks.last()?; let replacement_str = format!( "{}'{}", base.span.get_content_string(src).to_lowercase(), ending.span.get_content_string(src).to_lowercase() ); let lettercase_template = [base.span.get_content(src), ending.span.get_content(src)].concat(); Some(Lint { span: whole_span, lint_kind: LintKind::Typo, suggestions: vec![Suggestion::replace_with_match_case( replacement_str.chars().collect(), &lettercase_template, )], message: format!("Did you mean `{replacement_str}`?"), priority: 57, }) } fn description(&self) -> &str { "Corrects semicolons or acute accents typed instead of apostrophes." } } #[cfg(test)] mod tests { use super::WrongApostrophe; use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; #[test] fn fix_dont_with_semicolon_to_apostrophe() { assert_suggestion_result( "It's better if you don;t type like this.", WrongApostrophe::default(), "It's better if you don't type like this.", ); } #[test] fn ignore_correct() { assert_lint_count("I don't doubt it.", WrongApostrophe::default(), 0); } #[test] fn fix_title_case() { assert_suggestion_result( "Don;t type like this.", WrongApostrophe::default(), "Don't type like this.", ); } #[test] fn fix_all_caps() { assert_suggestion_result( "DON;T TRY THIS AT HOME.", WrongApostrophe::default(), "DON'T TRY THIS AT HOME.", ); } #[test] #[ignore = "replace_with_match_case has a bug turning `I'll` into `I'LL`"] fn fix_ill_and_monkeys() { assert_suggestion_result( "Well I;ll be a monkey;s uncle!", WrongApostrophe::default(), "Well I'll be a monkey's uncle!", ) } #[test] fn fix_other_contractions_and_possessives() { assert_suggestion_result( "Let;s see if we;ve fixed patrakov;s bug. Fun wasn;t it?", WrongApostrophe::default(), "Let's see if we've fixed patrakov's bug. Fun wasn't it?", ) } #[test] fn corrects_ive_with_correct_capitalization() { assert_suggestion_result("I;ve", WrongApostrophe::default(), "I've"); } #[test] fn fix_acute_dont() { assert_suggestion_result( "To see the list of available bikes for a location, you don´t need any authentication.", WrongApostrophe::default(), "To see the list of available bikes for a location, you don't need any authentication.", ); } #[test] fn fix_acute_im() { assert_suggestion_result( "In my research, I´m applying the latest generation of quantitative methods in epidemiology", WrongApostrophe::default(), "In my research, I'm applying the latest generation of quantitative methods in epidemiology", ); } #[test] fn fix_acute_its() { assert_suggestion_result( "and it´s auto-updated if that project is hosted here on github", WrongApostrophe::default(), "and it's auto-updated if that project is hosted here on github", ); } #[test] fn fix_acute_lets() { assert_suggestion_result( "Let´s now visit the main functionalities provided by GrimoireLab.", WrongApostrophe::default(), "Let's now visit the main functionalities provided by GrimoireLab.", ); } #[test] fn fix_acute_microsofts() { assert_suggestion_result( "Windows 11 Upgrade tool that bypasses new Microsoft´s requirements", WrongApostrophe::default(), "Windows 11 Upgrade tool that bypasses new Microsoft's requirements", ); } #[test] fn fix_acute_youre() { assert_suggestion_result( "You´re looking for clues, but you´re missing all the signs", WrongApostrophe::default(), "You're looking for clues, but you're missing all the signs", ); } } ================================================ FILE: harper-core/src/mask/mod.rs ================================================ mod regex_masker; pub use regex_masker::RegexMasker; use itertools::Itertools; use crate::Span; /// A Masker is a tool that can be composed to eliminate chunks of text from /// being parsed. They can be composed to do things like isolate comments from a /// programming language or disable linting for languages that have been /// determined to not be English. /// /// This is primarily used by [`crate::parsers::Mask`] to create parsers for /// things like comments of programming languages. pub trait Masker: Send + Sync { fn create_mask(&self, source: &[char]) -> Mask; } /// Identifies portions of a [`char`] sequence that should __not__ be ignored by /// Harper. pub struct Mask { // Right now, there aren't any use-cases where we can't treat this as a stack. // // Assumed that no elements overlap and exist in sorted order. pub(self) allowed: Vec>, } impl FromIterator> for Mask { fn from_iter>>(iter: T) -> Self { let allowed = iter .into_iter() .sorted_by_key(|span| span.start) .collect_vec(); assert!( allowed.is_sorted_by(|a, b| a.end <= b.start), "Masker elements cannot overlap and must be sorted!" ); Self { allowed } } } impl Mask { /// Create a new Mask for a given piece of text, marking all text as /// disallowed. pub fn new_blank() -> Self { Self { allowed: Vec::new(), } } pub fn iter_allowed<'a>( &'a self, source: &'a [char], ) -> impl Iterator, &'a [char])> { self.allowed.iter().map(|s| (*s, s.get_content(source))) } /// Mark a span of the text as allowed. pub fn push_allowed(&mut self, allowed: Span) { if let Some(last) = self.allowed.last_mut() { assert!( allowed.start >= last.end, "Masker elements cannot overlap and must be sorted!" ); if allowed.start == last.end { last.end = allowed.end; return; } } self.allowed.push(allowed) } /// Merge chunks that are only separated by whitespace. pub fn merge_whitespace_sep(&mut self, source: &[char]) { let mut after = Vec::with_capacity(self.allowed.len()); let mut iter = 0..self.allowed.len(); while let Some(i) = iter.next() { let a = self.allowed[i]; if let Some(b) = self.allowed.get(i + 1) { let sep = Span::new(a.end, b.start); let sep_content = sep.get_content(source); if sep_content.iter().all(|c| c.is_whitespace() || *c == '\n') { iter.next(); after.push(Span::new(a.start, b.end)); continue; } } after.push(a); } if self.allowed.len() != after.len() { self.allowed = after; self.merge_whitespace_sep(source); } else { self.allowed = after; } } } #[cfg(test)] mod tests { use crate::{Mask, Span}; #[test] fn bumps_existing() { let mut mask = Mask::new_blank(); mask.push_allowed(Span::new_with_len(0, 1)); mask.push_allowed(Span::new_with_len(1, 2)); assert_eq!(mask.allowed.len(), 1) } #[test] fn merges_whitespace_sep() { let source: Vec<_> = "word word\nword".chars().collect(); let mut mask = Mask::new_blank(); mask.push_allowed(Span::new_with_len(0, 4)); mask.push_allowed(Span::new_with_len(5, 4)); mask.push_allowed(Span::new_with_len(10, 4)); assert_eq!(mask.allowed.len(), 3); mask.merge_whitespace_sep(&source); assert_eq!(mask.allowed.len(), 1); } } ================================================ FILE: harper-core/src/mask/regex_masker.rs ================================================ use regex::Regex; use crate::{Span, offsets::build_byte_to_char_map}; use super::{Mask, Masker}; /// Allows one to mask the sections of a document that match a regular expression (or vice versa). pub struct RegexMasker { regex: Regex, exclude_matches: bool, } impl RegexMasker { /// Parses and compiles the provided Regex expression. Returns None if an invalid expression /// was provided. /// /// If `exclude_matches` is marked `true`, then the areas selected by the regular expression /// will be _removed_ from Harper's view. If it is `false`, those areas will be the only ones /// _included_. pub fn new(regex: &str, exclude_matches: bool) -> Option { Some(Self { regex: Regex::new(regex).ok()?, exclude_matches, }) } } impl Masker for RegexMasker { fn create_mask(&self, source: &[char]) -> Mask { let source_s: String = source.iter().collect(); let byte_to_char = build_byte_to_char_map(&source_s); let mut mask = Mask::new_blank(); if self.exclude_matches { let mut allowed_start = 0; for m in self.regex.find_iter(&source_s) { let match_start = byte_to_char[m.start()]; let match_end = byte_to_char[m.end()]; if allowed_start < match_start { mask.push_allowed(Span::new(allowed_start, match_start)); } allowed_start = match_end; } if allowed_start < source.len() { mask.push_allowed(Span::new(allowed_start, source.len())); } } else { for m in self.regex.find_iter(&source_s) { let match_start = byte_to_char[m.start()]; let match_end = byte_to_char[m.end()]; if match_start < match_end { mask.push_allowed(Span::new(match_start, match_end)); } } } mask } } #[cfg(test)] mod tests { use quickcheck::TestResult; use quickcheck_macros::quickcheck; use super::RegexMasker; use crate::{Masker, Span}; #[test] fn include_matches() { let source: Vec<_> = "foo [ignore] bar [drop]".chars().collect(); let masker = RegexMasker::new(r"\[[^\]]+\]", false).unwrap(); let allowed = masker .create_mask(&source) .iter_allowed(&source) .map(|(_, chars)| chars.iter().collect::()) .collect::>(); assert_eq!(allowed, vec!["[ignore]", "[drop]"]); } #[test] fn exclude_matches() { let source: Vec<_> = "foo [ignore] bar [drop]".chars().collect(); let masker = RegexMasker::new(r"\[[^\]]+\]", true).unwrap(); let allowed = masker .create_mask(&source) .iter_allowed(&source) .map(|(_, chars)| chars.iter().collect::()) .collect::>(); assert_eq!(allowed, vec!["foo ", " bar "]); } #[test] fn unicode_offsets_are_converted_to_char_spans() { let source: Vec<_> = "A🙂B🙂C".chars().collect(); let masker = RegexMasker::new(r"🙂B🙂", false).unwrap(); let allowed = masker .create_mask(&source) .iter_allowed(&source) .map(|(_, chars)| chars.iter().collect::()) .collect::>(); assert_eq!(allowed, vec!["🙂B🙂"]); } #[quickcheck] fn can_match_everything(source: String) -> TestResult { if source.contains(|s: char| !s.is_ascii() || s.is_control()) { return TestResult::discard(); } let masker = RegexMasker::new(".*", false).unwrap(); let chars: Vec<_> = source.chars().collect(); let mask = masker.create_mask(&chars); if !chars.is_empty() { assert_eq!(mask.allowed, vec![Span::new_with_len(0, chars.len())]); TestResult::passed() } else { TestResult::discard() } } } ================================================ FILE: harper-core/src/number.rs ================================================ use std::fmt::Display; use is_macro::Is; use itertools::Itertools; use ordered_float::OrderedFloat; use serde::{Deserialize, Serialize}; /// Represents a written number. #[derive(Debug, Serialize, Deserialize, Clone, Copy, Default, PartialEq, Eq, Hash, PartialOrd)] pub struct Number { /// The actual value of the number pub value: OrderedFloat, /// Whether it contains a suffix (like the 1__st__ element). pub suffix: Option, /// What base it is in (hex v.s. decimal, for example). pub radix: u32, /// The level of precision the number is formatted with. pub precision: usize, } impl Display for Number { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if self.radix == 16 { write!(f, "0x{:X}", self.value.0 as u64)?; } else { write!(f, "{:.*}", self.precision, self.value.0)?; } if let Some(suffix) = self.suffix { for c in suffix.to_chars() { write!(f, "{c}")?; } } Ok(()) } } #[derive( Debug, Serialize, Deserialize, Default, PartialEq, PartialOrd, Clone, Copy, Is, Hash, Eq, )] pub enum OrdinalSuffix { #[default] Th, St, Nd, Rd, } impl OrdinalSuffix { pub fn correct_suffix_for(number: impl Into) -> Option { let number = number.into(); if number < 0.0 || number - number.floor() > f64::EPSILON || number > u64::MAX as f64 { return None; } let integer = number as u64; if let 11..=13 = integer % 100 { return Some(Self::Th); }; Some(match integer % 10 { 0 | 4..=9 => Self::Th, 1 => Self::St, 2 => Self::Nd, 3 => Self::Rd, _ => unreachable!(), }) } pub const fn to_chars(self) -> &'static [char] { match self { OrdinalSuffix::Th => &['t', 'h'], OrdinalSuffix::St => &['s', 't'], OrdinalSuffix::Nd => &['n', 'd'], OrdinalSuffix::Rd => &['r', 'd'], } } /// Check the characters in a buffer to see if it matches a number suffix. pub fn from_chars(chars: &[char]) -> Option { let lower_chars: [char; 2] = chars.iter().map(char::to_ascii_lowercase).collect_array()?; match lower_chars { ['t', 'h'] => Some(OrdinalSuffix::Th), ['s', 't'] => Some(OrdinalSuffix::St), ['n', 'd'] => Some(OrdinalSuffix::Nd), ['r', 'd'] => Some(OrdinalSuffix::Rd), _ => None, } } } #[cfg(test)] mod tests { use itertools::Itertools; use ordered_float::OrderedFloat; use crate::OrdinalSuffix; use super::Number; #[test] fn hex_fifteen() { assert_eq!( Number { value: OrderedFloat(15.0), suffix: None, radix: 16, precision: 0 } .to_string(), "0xF" ) } #[test] fn decimal_fifteen() { assert_eq!( Number { value: OrderedFloat(15.0), suffix: None, radix: 10, precision: 0 } .to_string(), "15" ) } #[test] fn decimal_fifteen_suffix() { assert_eq!( Number { value: OrderedFloat(15.0), suffix: Some(OrdinalSuffix::Th), radix: 10, precision: 0 } .to_string(), "15th" ) } #[test] fn decimal_fifteen_and_a_half() { assert_eq!( Number { value: OrderedFloat(15.5), suffix: None, radix: 10, precision: 2 } .to_string(), "15.50" ) } #[test] fn issue_1051() { let word = "story".chars().collect_vec(); assert_eq!(None, OrdinalSuffix::from_chars(&word)); } } ================================================ FILE: harper-core/src/offsets.rs ================================================ /// Build a lookup table that maps every byte offset in `source` to its /// corresponding character offset. pub(crate) fn build_byte_to_char_map(source: &str) -> Vec { let mut byte_to_char = vec![0; source.len() + 1]; let mut char_idx = 0; for (byte_idx, ch) in source.char_indices() { let next_byte_idx = byte_idx + ch.len_utf8(); for slot in &mut byte_to_char[byte_idx..next_byte_idx] { *slot = char_idx; } char_idx += 1; byte_to_char[next_byte_idx] = char_idx; } byte_to_char } #[cfg(test)] mod tests { use super::build_byte_to_char_map; #[test] fn maps_ascii_offsets() { let map = build_byte_to_char_map("abc"); assert_eq!(map, vec![0, 1, 2, 3]); } #[test] fn maps_unicode_offsets() { let map = build_byte_to_char_map("A🙂B"); assert_eq!(map, vec![0, 1, 1, 1, 1, 2, 3]); } } ================================================ FILE: harper-core/src/parsers/collapse_identifiers.rs ================================================ use std::collections::VecDeque; use std::sync::Arc; use itertools::Itertools; use super::Parser; use crate::expr::{ExprExt, SequenceExpr}; use crate::spell::Dictionary; use crate::{Lrc, Span, Token, TokenKind, VecExt}; /// A parser that wraps any other parser to collapse token strings that match /// the pattern `word_word` or `word-word`. pub struct CollapseIdentifiers { inner: Box, dict: Arc, } impl CollapseIdentifiers { pub fn new(inner: Box, dict: Box>) -> Self { Self { inner, dict: *dict.clone(), } } } thread_local! { static WORD_OR_NUMBER: Lrc = Lrc::new(SequenceExpr::any_word() .then_one_or_more(SequenceExpr::default() .then_case_separator() .then_any_word())); } impl Parser for CollapseIdentifiers { fn parse(&self, source: &[char]) -> Vec { let mut tokens = self.inner.parse(source); let mut to_remove = VecDeque::default(); for tok_span in WORD_OR_NUMBER .with(|v| v.clone()) .iter_matches(&tokens, source) .collect::>() { let start_tok = &tokens[tok_span.start]; let end_tok = &tokens[tok_span.end - 1]; let char_span = Span::new(start_tok.span.start, end_tok.span.end); if self.dict.contains_word(char_span.get_content(source)) { tokens[tok_span.start] = Token::new(char_span, TokenKind::blank_word()); to_remove.extend(tok_span.start + 1..tok_span.end); } } tokens.remove_indices(to_remove.into_iter().sorted().unique().collect()); tokens } } #[cfg(test)] mod tests { use super::*; use crate::spell::{FstDictionary, MergedDictionary, MutableDictionary}; use crate::{ DictWordMetadata, parsers::{PlainEnglish, StrParser}, }; #[test] fn matches_kebab() { let source: Vec<_> = "kebab-case".chars().collect(); assert_eq!( WORD_OR_NUMBER .with(|v| v.clone()) .iter_matches(&PlainEnglish.parse(&source), &source) .count(), 1 ); } #[test] fn no_collapse() { let dict = FstDictionary::curated(); let source = "This is a test."; let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(dict)).parse_str(source); assert_eq!(tokens.len(), 8); } #[test] fn one_collapse() { let source = "This is a separated_identifier, wow!"; let curated_dictionary = FstDictionary::curated(); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(curated_dictionary.clone())) .parse_str(source); assert_eq!(tokens.len(), 13); let mut dict = MutableDictionary::new(); dict.append_word_str("separated_identifier", DictWordMetadata::default()); let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(curated_dictionary); merged_dict.add_dictionary(Arc::new(dict)); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(Arc::new(merged_dict))) .parse_str(source); assert_eq!(tokens.len(), 11); } #[test] fn kebab_collapse() { let source = "This is a separated-identifier, wow!"; let curated_dictionary = FstDictionary::curated(); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(curated_dictionary.clone())) .parse_str(source); assert_eq!(tokens.len(), 13); let mut dict = MutableDictionary::new(); dict.append_word_str("separated-identifier", DictWordMetadata::default()); let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(curated_dictionary); merged_dict.add_dictionary(Arc::new(dict)); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(Arc::new(merged_dict))) .parse_str(source); assert_eq!(tokens.len(), 11); } #[test] fn double_collapse() { let source = "This is a separated_identifier_token, wow!"; let curated_dictionary = FstDictionary::curated(); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(curated_dictionary.clone())) .parse_str(source); assert_eq!(tokens.len(), 15); let mut dict = MutableDictionary::new(); dict.append_word_str("separated_identifier_token", DictWordMetadata::default()); let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(curated_dictionary); merged_dict.add_dictionary(Arc::new(dict)); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(Arc::new(merged_dict))) .parse_str(source); assert_eq!(tokens.len(), 11); } #[test] fn two_collapses() { let source = "This is a separated_identifier, wow! separated_identifier"; let curated_dictionary = FstDictionary::curated(); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(curated_dictionary.clone())) .parse_str(source); assert_eq!(tokens.len(), 17); let mut dict = MutableDictionary::new(); dict.append_word_str("separated_identifier", DictWordMetadata::default()); let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(curated_dictionary); merged_dict.add_dictionary(Arc::new(dict)); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(Arc::new(merged_dict))) .parse_str(source); assert_eq!(tokens.len(), 13); } #[test] fn overlapping_identifiers() { let source = "This is a separated_identifier_token, wow!"; let curated_dictionary = FstDictionary::curated(); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(curated_dictionary.clone())) .parse_str(source); assert_eq!(tokens.len(), 15); let mut dict = MutableDictionary::new(); dict.append_word_str("separated_identifier", DictWordMetadata::default()); dict.append_word_str("identifier_token", DictWordMetadata::default()); let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(curated_dictionary); merged_dict.add_dictionary(Arc::new(dict)); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(Arc::new(merged_dict))) .parse_str(source); assert_eq!(tokens.len(), 15); } #[test] fn nested_identifiers() { let source = "This is a separated_identifier_token, wow!"; let curated_dictionary = FstDictionary::curated(); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(curated_dictionary.clone())) .parse_str(source); assert_eq!(tokens.len(), 15); let mut dict = MutableDictionary::new(); dict.append_word_str("separated_identifier_token", DictWordMetadata::default()); dict.append_word_str("separated_identifier", DictWordMetadata::default()); let mut merged_dict = MergedDictionary::new(); merged_dict.add_dictionary(curated_dictionary); merged_dict.add_dictionary(Arc::new(dict)); let tokens = CollapseIdentifiers::new(Box::new(PlainEnglish), Box::new(Arc::new(merged_dict))) .parse_str(source); assert_eq!(tokens.len(), 11); } } ================================================ FILE: harper-core/src/parsers/isolate_english.rs ================================================ use super::{Parser, Token, TokenStringExt}; use crate::language_detection::is_likely_english; use crate::spell::Dictionary; /// A parser that wraps another, using heuristics to quickly redact paragraphs of a document that aren't /// intended to be English text. pub struct IsolateEnglish { inner: Box, dict: D, } impl IsolateEnglish { pub fn new(inner: Box, dictionary: D) -> Self { Self { inner, dict: dictionary, } } } impl Parser for IsolateEnglish { fn parse(&self, source: &[char]) -> Vec { let tokens = self.inner.parse(source); let mut english_tokens: Vec = Vec::with_capacity(tokens.len()); for chunk in tokens.iter_chunks() { if chunk.len() < 4 || is_likely_english(chunk, source, &self.dict) { english_tokens.extend_from_slice(chunk); } } english_tokens } } #[cfg(test)] mod tests { use super::IsolateEnglish; use crate::spell::FstDictionary; use crate::{Document, TokenStringExt, parsers::PlainEnglish}; /// Assert that the provided text contains _no_ chunks of valid English fn assert_no_english(text: &str) { let dict = FstDictionary::curated(); let document = Document::new( text, &IsolateEnglish::new(Box::new(PlainEnglish), dict.clone()), &dict, ); assert_eq!(document.iter_words().count(), 0); assert_eq!(document.iter_punctuations().count(), 0); } /// Assert that, once stripped of non-English chunks, the resulting document looks like another /// piece of text. fn assert_stripped_english(source: &str, target: &str) { let dict = FstDictionary::curated(); let document = Document::new( source, &IsolateEnglish::new(Box::new(PlainEnglish), dict.clone()), &dict, ); assert_eq!(document.to_string(), target); } #[test] fn mixed_spanish_english_breakfast() { assert_no_english( "En la mañana, como a dish de los huevos, un poquito of tocino, y a lot of leche.", ); } #[test] fn mixed_spanish_english_politics() { assert_no_english( "No estoy of acuerdo con the politics de Los estados unidos ahora; pienso que we need mas diversidad in el gobierno.", ); } #[test] fn english_no_edit_motto() { assert_stripped_english( "I have a simple motto in life: ", "I have a simple motto in life: ", ); } #[test] fn chunked_trad_chinese_english() { assert_stripped_english( "I have a simple motto in life: 如果你渴了,就喝水。", "I have a simple motto in life:", ); } #[test] fn chunked_trad_polish_english() { assert_stripped_english( "I have a simple motto in life: jeśli jesteś spragniony, napij się wody.", "I have a simple motto in life:", ); } } ================================================ FILE: harper-core/src/parsers/markdown.rs ================================================ use std::collections::VecDeque; use serde::{Deserialize, Serialize}; use super::{Parser, PlainEnglish}; use crate::{Span, Token, TokenKind, TokenStringExt, VecExt, offsets::build_byte_to_char_map}; /// A parser that wraps the [`PlainEnglish`] parser that allows one to parse /// CommonMark files. /// /// Will ignore code blocks and tables. #[derive(Default, Clone, Debug, Copy)] pub struct Markdown { options: MarkdownOptions, } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] #[non_exhaustive] pub struct MarkdownOptions { pub ignore_link_title: bool, } // Clippy rule excepted because this can easily be expanded later #[allow(clippy::derivable_impls)] impl Default for MarkdownOptions { fn default() -> Self { Self { ignore_link_title: false, } } } impl Markdown { pub fn new(options: MarkdownOptions) -> Self { Self { options } } /// Remove hidden Wikilink target text. /// /// As in the stuff to the left of the pipe operator: /// /// ```markdown /// [[Target text|Display Text]] /// ``` fn remove_hidden_wikilink_tokens(tokens: &mut Vec) { let mut to_remove = VecDeque::new(); for pipe_idx in tokens.iter_pipe_indices() { if pipe_idx < 2 { continue; } // Locate preceding `[[` let mut cursor = pipe_idx - 2; let mut open_bracket = None; loop { let Some((a, b)) = tokens.get(cursor).zip(tokens.get(cursor + 1)) else { break; }; if a.kind.is_newline() { break; } if a.kind.is_open_square() && b.kind.is_open_square() { open_bracket = Some(cursor); break; } else if cursor == 0 { break; } else { cursor -= 1; } } // Locate succeeding `[[` cursor = pipe_idx + 1; let mut close_bracket = None; loop { let Some((a, b)) = tokens.get(cursor).zip(tokens.get(cursor + 1)) else { break; }; if a.kind.is_newline() { break; } if a.kind.is_close_square() && b.kind.is_close_square() { close_bracket = Some(cursor); break; } else { cursor += 1; } } if let Some(open_bracket_idx) = open_bracket && let Some(close_bracket_idx) = close_bracket { to_remove.extend(open_bracket_idx..=pipe_idx); to_remove.push_back(close_bracket_idx); to_remove.push_back(close_bracket_idx + 1); } } tokens.remove_indices(to_remove); } /// Remove the brackets from Wikilinks without pipe operators. /// For __those__ Wikilinks, see [`Self::remove_hidden_wikilink_tokens`] fn remove_wikilink_brackets(tokens: &mut Vec) { let mut to_remove = VecDeque::new(); let mut open_brackets = None; let mut cursor = 0; loop { let Some((a, b)) = tokens.get(cursor).zip(tokens.get(cursor + 1)) else { break; }; if let Some(open_brackets_idx) = open_brackets { if a.kind.is_newline() { open_brackets = None; cursor += 1; continue; } if a.kind.is_close_square() && b.kind.is_close_square() { to_remove.push_back(open_brackets_idx); to_remove.push_back(open_brackets_idx + 1); to_remove.push_back(cursor); to_remove.push_back(cursor + 1); open_brackets = None; } } else if a.kind.is_open_square() && b.kind.is_open_square() { open_brackets = Some(cursor); } cursor += 1; } tokens.remove_indices(to_remove); } } impl Parser for Markdown { /// This implementation is quite gross to look at, but it works. /// If any issues arise, it would likely help to refactor this out first. fn parse(&self, source: &[char]) -> Vec { let english_parser = PlainEnglish; let source_str: String = source.iter().collect(); let md_parser = pulldown_cmark::Parser::new_ext( &source_str, pulldown_cmark::Options::all() .difference(pulldown_cmark::Options::ENABLE_SMART_PUNCTUATION), ); let mut tokens = Vec::new(); // Build a mapping from the inner parser's byte-based indexing to Harper's char-based // indexing. let byte_to_char = build_byte_to_char_map(&source_str); let mut stack = Vec::new(); // NOTE: the range spits out __byte__ indices, not char indices. // This is why we keep track above. for (event, range) in md_parser.into_offset_iter() { let span_start = byte_to_char[range.start]; let span_end = byte_to_char[range.end]; match event { pulldown_cmark::Event::SoftBreak => { tokens.push(Token { span: Span::new_with_len(span_start, 1), kind: TokenKind::Newline(1), }); } pulldown_cmark::Event::HardBreak => { tokens.push(Token { span: Span::new_with_len(span_start, 1), kind: TokenKind::Newline(2), }); } pulldown_cmark::Event::Start(pulldown_cmark::Tag::List(v)) => { tokens.push(Token { span: Span::empty(span_start), kind: TokenKind::Newline(2), }); stack.push(pulldown_cmark::Tag::List(v)); } pulldown_cmark::Event::Start(tag) => { if matches!(tag, pulldown_cmark::Tag::Heading { .. }) { tokens.push(Token { span: Span::empty(span_start), kind: TokenKind::HeadingStart, }); } stack.push(tag) } pulldown_cmark::Event::End(pulldown_cmark::TagEnd::Paragraph) | pulldown_cmark::Event::End(pulldown_cmark::TagEnd::Item) | pulldown_cmark::Event::End(pulldown_cmark::TagEnd::Heading(_)) | pulldown_cmark::Event::End(pulldown_cmark::TagEnd::CodeBlock) | pulldown_cmark::Event::End(pulldown_cmark::TagEnd::TableCell) => { tokens.push(Token { // We cannot use `span_start` here, as it will still point to the // first character of the `Event` at this point. Instead, we use the // position of the previous token's last character. This ensures the // paragraph break is placed at the end of the content, not its beginning. // For more info, see: https://github.com/Automattic/harper/pull/1239. span: Span::empty(tokens.last().map_or(0, |last| last.span.end)), kind: TokenKind::ParagraphBreak, }); stack.pop(); } pulldown_cmark::Event::End(_) => { stack.pop(); } pulldown_cmark::Event::InlineMath(_) | pulldown_cmark::Event::DisplayMath(_) | pulldown_cmark::Event::Code(_) => { let chunk_len = span_end - span_start; tokens.push(Token { span: Span::new_with_len(span_start, chunk_len), kind: TokenKind::Unlintable, }); } pulldown_cmark::Event::Text(_text) => { let chunk_len = span_end - span_start; if let Some(tag) = stack.last() { use pulldown_cmark::Tag; if matches!(tag, Tag::CodeBlock(..)) { tokens.push(Token { span: Span::new_with_len(span_start, chunk_len), kind: TokenKind::Unlintable, }); continue; } if matches!(tag, Tag::Link { .. }) && self.options.ignore_link_title { tokens.push(Token { span: Span::new_with_len(span_start, chunk_len), kind: TokenKind::Unlintable, }); continue; } if !(matches!(tag, Tag::Paragraph) || (matches!(tag, Tag::Link { .. }) && !self.options.ignore_link_title) || matches!(tag, Tag::Heading { .. }) || matches!(tag, Tag::Item) || matches!(tag, Tag::TableCell) || matches!(tag, Tag::Emphasis) || matches!(tag, Tag::Strong) || matches!(tag, Tag::Strikethrough)) { continue; } } let mut new_tokens = english_parser.parse(&source[span_start..span_end]); new_tokens .iter_mut() .for_each(|token| token.span.push_by(span_start)); tokens.append(&mut new_tokens); } // TODO: Support via `harper-html` pulldown_cmark::Event::Html(_) | pulldown_cmark::Event::InlineHtml(_) => { let size = span_end - span_start; tokens.push(Token { span: Span::new_with_len(span_start, size), kind: TokenKind::Unlintable, }); } _ => (), } } if matches!( tokens.last(), Some(Token { kind: TokenKind::Newline(_) | TokenKind::ParagraphBreak, .. }) ) && source.last() != Some(&'\n') { tokens.pop(); } Self::remove_hidden_wikilink_tokens(&mut tokens); Self::remove_wikilink_brackets(&mut tokens); tokens } } #[cfg(test)] mod tests { use super::super::StrParser; use super::Markdown; use crate::{Punctuation, TokenKind, TokenStringExt, parsers::markdown::MarkdownOptions}; #[test] fn survives_emojis() { let source = r"🤷."; Markdown::default().parse_str(source); } /// Check whether the Markdown parser will emit a breaking newline /// at the end of each input. /// /// It should _not_ do this. #[test] fn ends_with_newline() { let source = "This is a test."; let tokens = Markdown::default().parse_str(source); assert_ne!(tokens.len(), 0); assert!(!tokens.last().unwrap().kind.is_newline()); } #[test] fn math_becomes_unlintable() { let source = r"$\Katex$ $\text{is}$ $\text{great}$."; let tokens = Markdown::default().parse_str(source); assert_eq!( tokens.iter().map(|t| t.kind.clone()).collect::>(), vec![ TokenKind::Unlintable, TokenKind::Space(1), TokenKind::Unlintable, TokenKind::Space(1), TokenKind::Unlintable, TokenKind::Punctuation(Punctuation::Period) ] ) } #[test] fn hidden_wikilink_text() { let source = r"[[this is hidden|this is not]]"; let tokens = Markdown::default().parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), ] )) } #[test] fn just_pipe() { let source = r"|"; let tokens = Markdown::default().parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); dbg!(&token_kinds); assert!(matches!( token_kinds.as_slice(), &[TokenKind::Punctuation(Punctuation::Pipe)] )) } #[test] fn empty_wikilink_text() { let source = r"[[|]]"; let tokens = Markdown::default().parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); dbg!(&token_kinds); assert!(matches!(token_kinds.as_slice(), &[])) } #[test] fn improper_wikilink_text() { let source = r"this is shown|this is also shown]]"; let tokens = Markdown::default().parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); dbg!(&token_kinds); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Punctuation(Punctuation::Pipe), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Punctuation(Punctuation::CloseSquare), TokenKind::Punctuation(Punctuation::CloseSquare), ] )) } #[test] fn normal_wikilink() { let source = r"[[Wikilink]]"; let tokens = Markdown::default().parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); dbg!(&token_kinds); assert!(matches!(token_kinds.as_slice(), &[TokenKind::Word(_)])) } #[test] fn html_is_unlintable() { let source = r"The range of inputs from to ctrl-z"; let tokens = Markdown::default().parse_str(source); assert_eq!(tokens.iter_unlintables().count(), 1); } #[test] fn link_title_unlintable() { let parser = Markdown::new(MarkdownOptions { ignore_link_title: true, ..MarkdownOptions::default() }); let source = r"[elijah-potter/harper](https://github.com/elijah-potter/harper)"; let tokens = parser.parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); dbg!(&token_kinds); assert!(matches!(token_kinds.as_slice(), &[TokenKind::Unlintable])) } #[test] fn issue_194() { let source = r""; let parser = Markdown::new(MarkdownOptions { ignore_link_title: true, ..MarkdownOptions::default() }); let token_kinds = parser .parse_str(source) .iter() .map(|t| t.kind.clone()) .collect::>(); assert!(matches!(token_kinds.as_slice(), &[TokenKind::Unlintable])); } #[test] fn respects_link_title_config() { let source = r"[elijah-potter/harper](https://github.com/elijah-potter/harper)"; let parser = Markdown::new(MarkdownOptions { ignore_link_title: true, ..MarkdownOptions::default() }); let token_kinds = parser .parse_str(source) .iter() .map(|t| t.kind.clone()) .collect::>(); assert!(matches!(token_kinds.as_slice(), &[TokenKind::Unlintable])); let parser = Markdown::new(MarkdownOptions { ignore_link_title: false, ..MarkdownOptions::default() }); let token_kinds = parser .parse_str(source) .iter() .map(|t| t.kind.clone()) .collect::>(); dbg!(&token_kinds); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Word(_), TokenKind::Punctuation(Punctuation::Hyphen), TokenKind::Word(_), TokenKind::Punctuation(Punctuation::ForwardSlash), TokenKind::Word(_) ] )); } /// Test that code blocks are immediately followed by a paragraph break. #[test] fn issue_880() { let source = r#" Paragraph. ``` Code block ``` Paragraph. "#; let parser = Markdown::new(MarkdownOptions::default()); let tokens = parser.parse_str(source); let token_kinds = tokens.iter().map(|t| t.kind.clone()).collect::>(); dbg!(&token_kinds); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Word(_), TokenKind::Punctuation(_), TokenKind::ParagraphBreak, TokenKind::Unlintable, TokenKind::ParagraphBreak, TokenKind::Word(_), TokenKind::Punctuation(_), ] )) } /// Helps ensure that ending tokens (like `ParagraphBreak`) don't get erroneously placed at /// the beginning of a sentence. This kind of behavior can cause crashes, as seen in /// [#1181](https://github.com/Automattic/harper/issues/1181). #[test] fn no_end_token_incorrectly_ending_at_zero() { let source = "Something\n"; let parser = Markdown::new(MarkdownOptions::default()); let tokens = parser.parse_str(source); assert_ne!(tokens.last().unwrap().span.end, 0); } #[test] fn hang() { let opts = MarkdownOptions::default(); let parser = Markdown::new(opts); let _res = parser.parse_str("[[#|]]:A]"); } #[test] fn hang2() { // This seems to only be a java specific problem... let opts = MarkdownOptions::default(); let parser = Markdown::new(opts); let _res = parser.parse_str("//{@j"); } #[test] fn simple_headings_are_marked() { let opts = MarkdownOptions::default(); let parser = Markdown::new(opts); let tokens = parser.parse_str("# This is a simple heading"); assert_eq!(tokens.iter_heading_starts().count(), 1); assert_eq!(tokens.iter_headings().count(), 1); } #[test] fn multiple_headings_are_marked() { let opts = MarkdownOptions::default(); let parser = Markdown::new(opts); let tokens = parser.parse_str( r#"# This is a simple heading ## This is a second simple heading"#, ); assert_eq!(tokens.iter_heading_starts().count(), 2); assert_eq!(tokens.iter_headings().count(), 2); } } ================================================ FILE: harper-core/src/parsers/mask.rs ================================================ use super::Parser; use crate::mask::Masker; use crate::{Span, Token, TokenKind}; /// Composes a Masker and a Parser to parse only masked chunks of text. pub struct Mask where M: Masker, P: Parser, { pub masker: M, pub parser: P, } impl Mask where M: Masker, P: Parser, { pub fn new(masker: M, parser: P) -> Self { Self { masker, parser } } } impl Parser for Mask where M: Masker, P: Parser, { fn parse(&self, source: &[char]) -> Vec { let mask = self.masker.create_mask(source); let mut tokens: Vec = Vec::new(); let mut last_allowed: Option> = None; for (span, content) in mask.iter_allowed(source) { // Check for a line break separating the current chunk from the preceding one. if let Some(last_allowed) = last_allowed { let intervening = Span::new(last_allowed.end, span.start); if intervening.get_content(source).contains(&'\n') { tokens.push(Token::new(intervening, TokenKind::ParagraphBreak)) } } let new_tokens = &mut self.parser.parse(content); for token in new_tokens.iter_mut() { token.span.push_by(span.start); } tokens.append(new_tokens); last_allowed = Some(span); } tokens } } ================================================ FILE: harper-core/src/parsers/mod.rs ================================================ //! Adds support for parsing various programming and markup languages through a unified trait: [`Parser`]. mod collapse_identifiers; mod isolate_english; mod markdown; mod mask; mod oops_all_headings; mod org_mode; mod plain_english; use blanket::blanket; pub use collapse_identifiers::CollapseIdentifiers; pub use isolate_english::IsolateEnglish; pub use markdown::{Markdown, MarkdownOptions}; pub use mask::Mask; pub use oops_all_headings::OopsAllHeadings; pub use org_mode::OrgMode; pub use plain_english::PlainEnglish; use crate::{LSend, Token, TokenStringExt}; #[cfg_attr(feature = "concurrent", blanket(derive(Ref, Box, Arc)))] #[cfg_attr(not(feature = "concurrent"), blanket(derive(Ref, Box, Rc)))] pub trait Parser: LSend { fn parse(&self, source: &[char]) -> Vec; } pub trait StrParser { fn parse_str(&self, source: impl AsRef) -> Vec; } impl StrParser for T where T: Parser, { fn parse_str(&self, source: impl AsRef) -> Vec { let source: Vec<_> = source.as_ref().chars().collect(); self.parse(&source) } } #[cfg(test)] mod tests { use super::{Markdown, OrgMode, Parser, PlainEnglish}; use crate::Punctuation; use crate::TokenKind::{self, *}; fn assert_tokens_eq(test_str: impl AsRef, expected: &[TokenKind], parser: &impl Parser) { let chars: Vec<_> = test_str.as_ref().chars().collect(); let tokens = parser.parse(&chars); let kinds: Vec<_> = tokens.into_iter().map(|v| v.kind).collect(); assert_eq!(&kinds, expected) } fn assert_tokens_eq_plain(test_str: impl AsRef, expected: &[TokenKind]) { assert_tokens_eq(test_str, expected, &PlainEnglish); } fn assert_tokens_eq_md(test_str: impl AsRef, expected: &[TokenKind]) { assert_tokens_eq(test_str, expected, &Markdown::default()) } fn assert_tokens_eq_org(test_str: impl AsRef, expected: &[TokenKind]) { assert_tokens_eq(test_str, expected, &OrgMode) } #[test] fn single_letter() { assert_tokens_eq_plain("a", &[TokenKind::blank_word()]) } #[test] fn sentence() { assert_tokens_eq_plain( "hello world, my friend", &[ TokenKind::blank_word(), Space(1), TokenKind::blank_word(), Punctuation(Punctuation::Comma), Space(1), TokenKind::blank_word(), Space(1), TokenKind::blank_word(), ], ) } #[test] fn sentence_md() { assert_tokens_eq_md( "__hello__ world, [my]() friend", &[ TokenKind::blank_word(), Space(1), TokenKind::blank_word(), Punctuation(Punctuation::Comma), Space(1), TokenKind::blank_word(), Space(1), TokenKind::blank_word(), ], ); } #[test] fn inserts_newlines() { assert_tokens_eq_md( "__hello__ world,\n\n[my]() friend", &[ TokenKind::blank_word(), Space(1), TokenKind::blank_word(), Punctuation(Punctuation::Comma), ParagraphBreak, TokenKind::blank_word(), Space(1), TokenKind::blank_word(), ], ); } /// Make sure that the English parser correctly identifies non-English /// characters as part of the same word. #[test] fn parses_non_english() { assert_tokens_eq_plain("Løvetann", &[TokenKind::blank_word()]); assert_tokens_eq_plain("Naïve", &[TokenKind::blank_word()]); } #[test] fn org_mode_basic() { assert_tokens_eq_org( "hello world", &[TokenKind::blank_word(), Space(1), TokenKind::blank_word()], ); } } ================================================ FILE: harper-core/src/parsers/oops_all_headings.rs ================================================ use crate::{Span, Token, TokenKind}; use super::Parser; /// A parser that wraps another, forcing the entirety of the document to be composed of headings. pub struct OopsAllHeadings { inner: P, } impl OopsAllHeadings

{ pub fn new(inner: P) -> Self { Self { inner } } } impl Parser for OopsAllHeadings

{ fn parse(&self, source: &[char]) -> Vec { let inner = self.inner.parse(source); let mut output = Vec::with_capacity(inner.capacity()); output.push(Token { span: Span::default(), kind: TokenKind::HeadingStart, }); let mut iter = inner.into_iter().peekable(); while let Some(tok) = iter.next() { let heading_start = if tok.kind.is_paragraph_break() && iter.peek().is_some_and(|t| !t.kind.is_heading_start()) { Some(Token { span: Span::empty(tok.span.end), kind: TokenKind::HeadingStart, }) } else { None }; output.push(tok); if let Some(extra) = heading_start { output.push(extra); } } output } } ================================================ FILE: harper-core/src/parsers/org_mode.rs ================================================ use super::{Parser, PlainEnglish}; use crate::{Span, Token, TokenKind}; #[derive(Debug, PartialEq, Copy, Clone)] enum SourceBlockMarker { Begin, End, } // Check if a line starts with a header (starts with one or more '*') fn is_header_line(chars: &[char], start: usize) -> bool { chars.get(start).is_some_and(|c| *c == '*') } // Check if a line starts with a source block begin/end fn is_source_block_marker(chars: &[char], start: usize) -> Option { let line = get_line_from_start(chars, start); let line_str: String = line.iter().collect(); let line_str = line_str.trim(); if line_str.starts_with("#+BEGIN_SRC") || line_str.starts_with("#+begin_src") { Some(SourceBlockMarker::Begin) } else if line_str.starts_with("#+END_SRC") || line_str.starts_with("#+end_src") { Some(SourceBlockMarker::End) } else { None } } // Check if a line is a directive (starts with #+) fn is_directive(chars: &[char], start: usize) -> bool { if start + 1 >= chars.len() { return false; } chars[start] == '#' && chars[start + 1] == '+' } // Check if a line is a list item (starts with -, +, or number) fn is_list_item(chars: &[char], start: usize) -> bool { let mut pos = start; // initial whitespaces or tabs while pos < chars.len() && (chars[pos] == ' ' || chars[pos] == '\t') { pos += 1; } if pos >= chars.len() { return false; } // Check for - or + followed by space if (chars[pos] == '-' || chars[pos] == '+') && pos + 1 < chars.len() && chars[pos + 1] == ' ' { return true; } // Check for numbered list if chars[pos].is_ascii_digit() { let mut num_pos = pos; while num_pos < chars.len() && chars[num_pos].is_ascii_digit() { num_pos += 1; } if num_pos < chars.len() && (chars[num_pos] == '.' || chars[num_pos] == ')') && num_pos + 1 < chars.len() && chars[num_pos + 1] == ' ' { return true; } } false } // Convert tabs to spaces in list items to avoid French spaces error fn normalize_list_item_whitespace(chars: &[char]) -> Vec { let mut result = Vec::new(); let mut init_list = false; for &ch in chars { if !init_list && ch == '\t' { result.push(' '); init_list = true; } else { result.push(ch); } } result } // Get the rest of the line from a starting position fn get_line_from_start(chars: &[char], start: usize) -> &[char] { let mut end = start; while end < chars.len() && chars[end] != '\n' { end += 1; } &chars[start..end] } // Find the end of the current line starting from position fn find_line_end(chars: &[char], start: usize) -> usize { let mut pos = start; while pos < chars.len() && chars[pos] != '\n' { pos += 1; } if pos < chars.len() && chars[pos] == '\n' { pos + 1 // Include the newline } else { pos } } // Find the start of the line containing the given position fn find_line_start(chars: &[char], pos: usize) -> usize { let mut start = pos; while start > 0 && chars[start - 1] != '\n' { start -= 1; } start } /// A parser that wraps the [`PlainEnglish`] parser that allows one to parse /// Org-mode files. /// /// Will ignore code blocks, source blocks, and other org-mode specific elements /// that should not be linted for prose. #[derive(Default, Clone, Debug, Copy)] pub struct OrgMode; impl OrgMode {} impl Parser for OrgMode { fn parse(&self, source: &[char]) -> Vec { let english_parser = PlainEnglish; let mut tokens = Vec::new(); let mut cursor = 0; let mut in_source_block = false; while cursor < source.len() { let line_start = find_line_start(source, cursor); // Check for source block markers let source_marker = is_source_block_marker(source, line_start); if let Some(marker) = source_marker { in_source_block = marker == SourceBlockMarker::Begin; } // If we're in a source block or found a source block marker, make the line unlintable if in_source_block || source_marker.is_some() { let line_end = find_line_end(source, line_start); tokens.push(Token { span: Span::new(line_start, line_end), kind: TokenKind::Unlintable, }); cursor = line_end; continue; } // Check for headers if is_header_line(source, line_start) { let line_end = find_line_end(source, line_start); // Find where the header text starts (after the stars and spaces) let mut header_text_start = line_start; while header_text_start < line_end && (source[header_text_start] == '*' || source[header_text_start] == ' ') { header_text_start += 1; } // If there's actual text after the stars, parse it if header_text_start < line_end { let mut header_tokens = english_parser.parse(&source[header_text_start..line_end]); header_tokens .iter_mut() .for_each(|token| token.span.push_by(header_text_start)); tokens.append(&mut header_tokens); } // Add paragraph break after header tokens.push(Token { span: Span::empty(line_end.saturating_sub(1)), kind: TokenKind::ParagraphBreak, }); cursor = line_end; continue; } // Check for directives (#+SOMETHING) if is_directive(source, line_start) { let line_end = find_line_end(source, line_start); tokens.push(Token { span: Span::new(line_start, line_end), kind: TokenKind::Unlintable, }); cursor = line_end; continue; } // Check for list items and normalize tabs to avoid French spaces if is_list_item(source, line_start) { let line_end = find_line_end(source, line_start); let line_chars = &source[line_start..line_end]; let normalized_chars = normalize_list_item_whitespace(line_chars); let mut line_tokens = english_parser.parse(&normalized_chars); line_tokens .iter_mut() .for_each(|token| token.span.push_by(line_start)); tokens.append(&mut line_tokens); cursor = line_end; continue; } // For normal text, parse with the English parser let line_end = find_line_end(source, cursor); if cursor < line_end { let mut line_tokens = english_parser.parse(&source[cursor..line_end]); line_tokens .iter_mut() .for_each(|token| token.span.push_by(cursor)); tokens.append(&mut line_tokens); } cursor = line_end; } // Remove trailing newline/paragraph break tokens if the source doesn't actually end with a newline. if matches!( tokens.last(), Some(Token { kind: TokenKind::Newline(_) | TokenKind::ParagraphBreak, .. }) ) && source.last() != Some(&'\n') { tokens.pop(); } tokens } } #[cfg(test)] mod tests { use super::super::StrParser; use super::OrgMode; use crate::TokenKind; #[test] fn simple_text() { let source = "This is simple text."; let tokens = OrgMode.parse_str(source); assert!(!tokens.is_empty()); assert!(tokens.iter().any(|t| matches!(t.kind, TokenKind::Word(_)))); } #[test] fn header_parsing() { let source = "* This is a header\nThis is regular text."; let tokens = OrgMode.parse_str(source); let token_kinds: Vec<_> = tokens.iter().map(|t| &t.kind).collect(); // Should have words from header and paragraph break assert!(token_kinds.iter().any(|k| matches!(k, TokenKind::Word(_)))); assert!( token_kinds .iter() .any(|k| matches!(k, TokenKind::ParagraphBreak)) ); } #[test] fn multiple_level_headers() { let source = "** Second level header\n*** Third level header"; let tokens = OrgMode.parse_str(source); let token_kinds: Vec<_> = tokens.iter().map(|t| &t.kind).collect(); // Should parse text from both headers let word_count = token_kinds .iter() .filter(|k| matches!(k, TokenKind::Word(_))) .count(); assert!(word_count >= 4); // "Second", "level", "Third", "header" } #[test] fn source_block_unlintable() { let source = r#"Regular text. #+BEGIN_SRC rust fn main() { println!("Hello, world!"); } #+END_SRC More regular text."#; let tokens = OrgMode.parse_str(source); let unlintable_count = tokens .iter() .filter(|t| matches!(t.kind, TokenKind::Unlintable)) .count(); // Should have unlintable tokens for the source block lines assert!(unlintable_count > 0); // Should still have regular words from the non-source-block text assert!(tokens.iter().any(|t| matches!(t.kind, TokenKind::Word(_)))); } #[test] fn directive_unlintable() { let source = r#"#+TITLE: My Document #+AUTHOR: Test Author This is regular text."#; let tokens = OrgMode.parse_str(source); let unlintable_count = tokens .iter() .filter(|t| matches!(t.kind, TokenKind::Unlintable)) .count(); // Should have unlintable tokens for directives assert_eq!(unlintable_count, 2); // Should still have regular words assert!(tokens.iter().any(|t| matches!(t.kind, TokenKind::Word(_)))); } #[test] fn case_insensitive_source_blocks() { let source = r#"#+begin_src python print("hello") #+end_src"#; let tokens = OrgMode.parse_str(source); let unlintable_count = tokens .iter() .filter(|t| matches!(t.kind, TokenKind::Unlintable)) .count(); // All lines should be unlintable assert_eq!(unlintable_count, 3); } #[test] fn empty_header() { let source = "*\nRegular text."; let tokens = OrgMode.parse_str(source); // Should handle empty headers gracefully assert!(tokens.iter().any(|t| matches!(t.kind, TokenKind::Word(_)))); } #[test] fn no_trailing_newline() { let source = "Simple text without newline"; let tokens = OrgMode.parse_str(source); // Should not end with newline token if source doesn't assert!(!tokens.last().unwrap().kind.is_newline()); } #[test] fn list_items_with_tabs() { let source = "- First item\n\t- Indented with tab\n+ Second item\n1. Numbered item"; let tokens = OrgMode.parse_str(source); assert!(tokens.iter().any(|t| matches!(t.kind, TokenKind::Word(_)))); let unlintable_count = tokens .iter() .filter(|t| matches!(t.kind, TokenKind::Unlintable)) .count(); assert_eq!(unlintable_count, 0); } #[test] fn mixed_list_formats() { let source = r#"- Bullet item 1. Numbered item + Plus item 2) Parenthesis numbered"#; let tokens = OrgMode.parse_str(source); // Should recognize all list formats let word_count = tokens .iter() .filter(|t| matches!(t.kind, TokenKind::Word(_))) .count(); assert!(word_count == 8, "{:?}", tokens); // "Bullet", "item", "Numbered", "item", "Plus", "item", "Parenthesis", "numbered" } } ================================================ FILE: harper-core/src/parsers/plain_english.rs ================================================ use super::Parser; use crate::Token; use crate::lexing::{lex_english_token, lex_with}; /// A parser that will attempt to lex as many tokens as possible, /// without discrimination and until the end of input. #[derive(Clone, Copy)] pub struct PlainEnglish; impl Parser for PlainEnglish { fn parse(&self, source: &[char]) -> Vec { lex_with(source, lex_english_token) } } ================================================ FILE: harper-core/src/patterns/any_pattern.rs ================================================ use crate::Token; use super::SingleTokenPattern; /// Matches any single token. pub struct AnyPattern; impl SingleTokenPattern for AnyPattern { fn matches_token(&self, _token: &Token, _source: &[char]) -> bool { true } } ================================================ FILE: harper-core/src/patterns/derived_from.rs ================================================ use crate::spell::WordId; use super::Pattern; /// A [Pattern] that looks for Word tokens that are either derived from a given word, or the word /// itself. /// /// For example, this will match "call" as well as "recall", "calling", etc. pub struct DerivedFrom { word_id: WordId, } impl DerivedFrom { pub fn new_from_str(word: &str) -> DerivedFrom { Self::new(WordId::from_word_str(word)) } pub fn new_from_chars(word: &[char]) -> DerivedFrom { Self::new(WordId::from_word_chars(word)) } pub fn new(word_id: WordId) -> Self { Self { word_id } } } impl Pattern for DerivedFrom { fn matches(&self, tokens: &[crate::Token], source: &[char]) -> Option { let tok = tokens.first()?; let metadata = tok.kind.as_word()?.as_ref()?; if metadata.derived_from == Some(self.word_id) { return Some(1); } let chars = tok.span.get_content(source); let word_id = WordId::from_word_chars(chars); if word_id == self.word_id { return Some(1); } None } } ================================================ FILE: harper-core/src/patterns/implies_quantity.rs ================================================ use crate::{Token, TokenKind}; use super::SingleTokenPattern; /// This struct does two things. /// /// First, it acts as a pattern that looks for phrases that describe a quantity of a noun /// that may or may not succeed it. /// /// Second, it determines the implied plurality of that quantity.implies pub struct ImpliesQuantity; impl ImpliesQuantity { pub fn implies_plurality(token: &Token, source: &[char]) -> Option { match &token.kind { TokenKind::Word(Some(lexeme_metadata)) => { if lexeme_metadata.is_determiner() { return Some(false); } let source = token.span.get_content(source); match source { ['a'] => Some(false), ['a', 'n'] => Some(false), ['m', 'a', 'n', 'y'] => Some(true), _ => None, } } TokenKind::Number(number) => Some((number.value.abs() - 1.).abs() > f64::EPSILON), _ => None, } } } impl SingleTokenPattern for ImpliesQuantity { fn matches_token(&self, token: &Token, source: &[char]) -> bool { Self::implies_plurality(token, source).is_some() } } #[cfg(test)] mod tests { use crate::{ Document, Span, patterns::{DocPattern, ImpliesQuantity}, }; #[test] fn number_implies() { let doc = Document::new_plain_english_curated("There are 60 minutes in an hour."); assert_eq!( ImpliesQuantity.find_all_matches_in_doc(&doc), vec![Span::new(4, 5), Span::new(10, 11)] ) } } ================================================ FILE: harper-core/src/patterns/indefinite_article.rs ================================================ use crate::Token; use super::{SingleTokenPattern, WordSet}; pub struct IndefiniteArticle { inner: WordSet, } impl Default for IndefiniteArticle { fn default() -> Self { Self { inner: WordSet::new(&["a", "an"]), } } } impl SingleTokenPattern for IndefiniteArticle { fn matches_token(&self, token: &Token, source: &[char]) -> bool { self.inner.matches_token(token, source) } } ================================================ FILE: harper-core/src/patterns/inflection_of_be.rs ================================================ use super::SingleTokenPattern; use crate::Token; use crate::patterns::WordSet; /// Matches any inflection of the verb “be”: /// `am`, `is`, `are`, `was`, `were`, `be`, `been`, `being`. pub struct InflectionOfBe { /// If using a `WordSet` proves expensive, we'll switch to something else. inner: WordSet, } impl Default for InflectionOfBe { fn default() -> Self { Self::new() } } impl InflectionOfBe { pub fn new() -> Self { Self { inner: WordSet::new(&["be", "am", "is", "are", "was", "were", "been", "being"]), } } } impl SingleTokenPattern for InflectionOfBe { fn matches_token(&self, token: &Token, source: &[char]) -> bool { self.inner.matches_token(token, source) } } ================================================ FILE: harper-core/src/patterns/invert.rs ================================================ use crate::Token; use super::Pattern; /// A struct that matches any pattern __except__ the one provided. pub struct Invert { inner: Box, } impl Invert { pub fn new(inner: impl Pattern + 'static) -> Self { Self { inner: Box::new(inner), } } } impl Pattern for Invert { fn matches(&self, tokens: &[Token], source: &[char]) -> Option { if self.inner.matches(tokens, source).is_some() { None } else { Some(1) } } } ================================================ FILE: harper-core/src/patterns/mod.rs ================================================ //! [`Pattern`]s are one of the more powerful ways to query text inside Harper, especially for beginners. They are a simplified abstraction over [`Expr`](crate::expr::Expr). //! //! Through the [`ExprLinter`](crate::linting::ExprLinter) trait, they make it much easier to //! build Harper [rules](crate::linting::Linter). //! //! See the page about [`SequenceExpr`](crate::expr::SequenceExpr) for a concrete example of their use. use crate::{Document, LSend, Span, Token}; mod any_pattern; mod derived_from; mod implies_quantity; mod indefinite_article; mod inflection_of_be; mod invert; mod modal_verb; mod nominal_phrase; mod prepositional_preceder; mod upos_set; mod whitespace_pattern; mod within_edit_distance; mod word; mod word_set; pub use any_pattern::AnyPattern; pub use derived_from::DerivedFrom; pub use implies_quantity::ImpliesQuantity; pub use indefinite_article::IndefiniteArticle; pub use inflection_of_be::InflectionOfBe; pub use invert::Invert; pub use modal_verb::ModalVerb; pub use nominal_phrase::NominalPhrase; pub use prepositional_preceder::{PrepositionalPrecederPattern, prepositional_preceder}; pub use upos_set::UPOSSet; pub use whitespace_pattern::WhitespacePattern; pub use within_edit_distance::WithinEditDistance; pub use word::Word; pub use word_set::WordSet; pub trait Pattern: LSend { /// Check if the pattern matches at the start of the given token slice. /// /// Returns the length of the match if successful, or `None` if not. fn matches(&self, tokens: &[Token], source: &[char]) -> Option; } pub trait PatternExt { fn iter_matches(&self, tokens: &[Token], source: &[char]) -> impl Iterator>; /// Search through all tokens to locate all non-overlapping pattern matches. fn find_all_matches(&self, tokens: &[Token], source: &[char]) -> Vec> { self.iter_matches(tokens, source).collect() } } impl

PatternExt for P where P: Pattern + ?Sized, { fn iter_matches(&self, tokens: &[Token], source: &[char]) -> impl Iterator> { MatchIter::new(self, tokens, source) } } struct MatchIter<'a, 'b, 'c, P: ?Sized> { pattern: &'a P, tokens: &'b [Token], source: &'c [char], index: usize, } impl<'a, 'b, 'c, P> MatchIter<'a, 'b, 'c, P> where P: Pattern + ?Sized, { fn new(pattern: &'a P, tokens: &'b [Token], source: &'c [char]) -> Self { Self { pattern, tokens, source, index: 0, } } } impl

Iterator for MatchIter<'_, '_, '_, P> where P: Pattern + ?Sized, { type Item = Span; fn next(&mut self) -> Option { while self.index < self.tokens.len() { if let Some(len) = self .pattern .matches(&self.tokens[self.index..], self.source) { let span = Span::new_with_len(self.index, len); self.index += len.max(1); return Some(span); } else { self.index += 1; } } None } } /// A simpler version of the [`Pattern`] trait that only matches a single /// token. pub trait SingleTokenPattern: LSend { fn matches_token(&self, token: &Token, source: &[char]) -> bool; } impl Pattern for S { fn matches(&self, tokens: &[Token], source: &[char]) -> Option { if self.matches_token(tokens.first()?, source) { Some(1) } else { None } } } impl bool> SingleTokenPattern for F { fn matches_token(&self, token: &Token, source: &[char]) -> bool { self(token, source) } } pub trait DocPattern { fn find_all_matches_in_doc(&self, document: &Document) -> Vec>; } impl DocPattern for P { fn find_all_matches_in_doc(&self, document: &Document) -> Vec> { self.find_all_matches(document.get_tokens(), document.get_source()) } } ================================================ FILE: harper-core/src/patterns/modal_verb.rs ================================================ use super::{Pattern, WordSet}; pub struct ModalVerb { inner: WordSet, include_common_errors: bool, } impl Default for ModalVerb { fn default() -> Self { let (words, include_common_errors) = Self::init(false); Self { inner: words, include_common_errors, } } } impl ModalVerb { fn init(include_common_errors: bool) -> (WordSet, bool) { let modals = [ "can", "can't", "could", "may", "might", "must", "shall", "shan't", "should", "will", "won't", "would", "ought", "dare", ]; let mut words = WordSet::new(&modals); modals.iter().for_each(|word| { words.add(&format!("{word}n't")); if include_common_errors { words.add(&format!("{word}nt")); } }); words.add("cannot"); (words, include_common_errors) } pub fn with_common_errors() -> Self { let (words, _) = Self::init(true); Self { inner: words, include_common_errors: true, } } } impl Pattern for ModalVerb { fn matches(&self, tokens: &[crate::Token], source: &[char]) -> Option { self.inner.matches(tokens, source) } } ================================================ FILE: harper-core/src/patterns/nominal_phrase.rs ================================================ use crate::Token; use super::Pattern; /// A pattern that uses primitive syntax-tree heuristics to locate nominal phrases. /// Given that it does not take context into account, it is not recommended for new code. /// Please prefer [`DictWordMetadata::np_member`](crate::DictWordMetadata::np_member). #[derive(Default)] pub struct NominalPhrase; impl Pattern for NominalPhrase { fn matches(&self, tokens: &[Token], _source: &[char]) -> Option { let mut cursor = 0; loop { let tok = tokens.get(cursor)?; if (tok.kind.is_adjective() || tok.kind.is_determiner() || tok.kind.is_verb_progressive_form()) && let Some(next) = tokens.get(cursor + 1) && next.kind.is_whitespace() { cursor += 2; continue; } if tok.kind.is_nominal() { return Some(cursor + 1); } return None; } } } #[cfg(test)] mod tests { use super::super::DocPattern; use super::NominalPhrase; use crate::{Document, Span, Token, patterns::Pattern}; trait SpanVecExt { fn to_strings(&self, doc: &Document) -> Vec; } impl SpanVecExt for Vec> { fn to_strings(&self, doc: &Document) -> Vec { self.iter() .map(|sp| { doc.get_tokens()[sp.start..sp.end] .iter() .map(|tok| doc.get_span_content_str(&tok.span)) .collect::() }) .collect() } } #[test] fn simple_apple() { let doc = Document::new_markdown_default_curated("A red apple"); let matches = NominalPhrase.find_all_matches_in_doc(&doc); assert_eq!(matches.to_strings(&doc), vec!["A red apple"]) } #[test] fn complex_apple() { let doc = Document::new_markdown_default_curated("A red apple with a long stem"); let matches = NominalPhrase.find_all_matches_in_doc(&doc); assert_eq!(matches.to_strings(&doc), vec!["A red apple", "a long stem"]) } #[test] fn list_fruit() { let doc = Document::new_markdown_default_curated("An apple, a banana and a pear"); let matches = NominalPhrase.find_all_matches_in_doc(&doc); assert_eq!( matches.to_strings(&doc), vec!["An apple", "a banana", "a pear"] ) } #[test] fn simplest_banana() { let doc = Document::new_markdown_default_curated("a banana"); assert!( NominalPhrase .matches(doc.get_tokens(), doc.get_source()) .is_some() ); } #[test] fn food() { let doc = Document::new_markdown_default_curated( "My favorite foods are pizza, sushi, tacos and burgers.", ); let matches = NominalPhrase.find_all_matches_in_doc(&doc); dbg!(&matches); dbg!(matches.to_strings(&doc)); for span in &matches { let gc = span .to_char_span(doc.get_tokens()) .get_content(doc.get_source()); dbg!(gc); } assert_eq!( matches.to_strings(&doc), vec!["My favorite foods", "pizza", "sushi", "tacos", "burgers"] ) } #[test] fn simplest_way() { let doc = Document::new_markdown_default_curated("a way"); assert!( NominalPhrase .matches(doc.get_tokens(), doc.get_source()) .is_some() ); } #[test] fn present_participle_way() { let doc = Document::new_markdown_default_curated("a winning way"); assert!( NominalPhrase .matches(doc.get_tokens(), doc.get_source()) .is_some() ); } #[test] fn perfect_participle_way() { let doc = Document::new_markdown_default_curated("a failed way"); assert!( NominalPhrase .matches(doc.get_tokens(), doc.get_source()) .is_some() ); } } ================================================ FILE: harper-core/src/patterns/prepositional_preceder.rs ================================================ use std::sync::LazyLock; use super::{SingleTokenPattern, WordSet}; use crate::Token; /// Matches adjectives that routinely introduce a `… to …` prepositional phrase, such as /// `accustomed`, `prone`, or `used`. /// /// Several `ToTwoToo` branches need this guard so they only flag cases where `to` is meant as /// `too`, not when it participates in idioms like `accustomed to precision`. #[derive(Debug, Clone)] pub struct PrepositionalPrecederPattern { word_set: WordSet, } impl Default for PrepositionalPrecederPattern { fn default() -> Self { Self { word_set: WordSet::new(&[ "accustomed", "addicted", "adjacent", "allergic", "attached", "attuned", "committed", "connected", "dedicated", "devoted", "immune", "oblivious", "opposed", "partial", "prone", "receptive", "related", "resistant", "sensitive", "subject", "susceptible", "used", ]), } } } impl SingleTokenPattern for PrepositionalPrecederPattern { fn matches_token(&self, token: &Token, source: &[char]) -> bool { self.word_set.matches_token(token, source) } } static PREPOSITIONAL_PRECEDER_PATTERN: LazyLock = LazyLock::new(PrepositionalPrecederPattern::default); /// Shared accessor for the lazily-initialized [`PrepositionalPrecederPattern`]. pub fn prepositional_preceder() -> &'static PrepositionalPrecederPattern { &PREPOSITIONAL_PRECEDER_PATTERN } ================================================ FILE: harper-core/src/patterns/upos_set.rs ================================================ use harper_brill::UPOS; use serde::{Deserialize, Serialize}; use smallvec::{SmallVec, ToSmallVec}; use crate::Token; use super::Pattern; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct UPOSSet { allowed_tags: SmallVec<[UPOS; 10]>, } impl UPOSSet { pub fn new(allowed: &[UPOS]) -> Self { Self { allowed_tags: allowed.to_smallvec(), } } } impl Pattern for UPOSSet { fn matches(&self, tokens: &[Token], _source: &[char]) -> Option { tokens.first()?.kind.as_word()?.as_ref().and_then(|w| { if self.allowed_tags.contains(&(w.pos_tag?)) { Some(1) } else { None } }) } } ================================================ FILE: harper-core/src/patterns/whitespace_pattern.rs ================================================ use super::Pattern; pub struct WhitespacePattern; impl Pattern for WhitespacePattern { fn matches(&self, tokens: &[crate::Token], _source: &[char]) -> Option { let count = tokens .iter() .position(|t| !t.kind.is_whitespace()) .unwrap_or(tokens.len()); if count == 0 { None } else { Some(count) } } } ================================================ FILE: harper-core/src/patterns/within_edit_distance.rs ================================================ use std::cell::RefCell; use super::SingleTokenPattern; use crate::{CharString, CharStringExt, Token}; use crate::edit_distance::edit_distance_min_alloc; /// Matches single words within a certain edit distance of a given word. pub struct WithinEditDistance { word: CharString, max_edit_dist: u8, } impl WithinEditDistance { pub fn new(word: CharString, max_edit_dist: u8) -> Self { Self { word, max_edit_dist, } } pub fn from_str(word: &str, edit_dist: u8) -> Self { let chars = word.chars().collect(); Self::new(chars, edit_dist) } } thread_local! { // To avoid allocating each call to `matches`. static BUFFERS: RefCell<(Vec, Vec)> = const { RefCell::new((Vec::new(), Vec::new())) }; } impl SingleTokenPattern for WithinEditDistance { fn matches_token(&self, token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } let content = token.span.get_content(source); BUFFERS.with_borrow_mut(|(buffer_a, buffer_b)| { let distance = edit_distance_min_alloc( &content.to_lower(), &self.word.to_lower(), buffer_a, buffer_b, ); distance <= self.max_edit_dist }) } } ================================================ FILE: harper-core/src/patterns/word.rs ================================================ use super::SingleTokenPattern; use crate::{CharString, Token}; /// Matches a predefined word. #[derive(Clone)] pub struct Word { /// The word to match. word: CharString, /// Determines whether the match is case-sensitive. case_sensitive: bool, } impl Word { /// Matches the provided word, ignoring case. pub fn new(word: &'static str) -> Self { Self { word: word.chars().collect(), case_sensitive: false, } } /// Matches the provided word, ignoring case. pub fn from_chars(word: &[char]) -> Self { Self { word: word.iter().copied().collect(), case_sensitive: false, } } /// Matches the provided word, ignoring case. pub fn from_char_string(word: CharString) -> Self { Self { word, case_sensitive: false, } } /// Matches the provided word, case-sensitive. pub fn new_exact(word: &'static str) -> Self { Self { word: word.chars().collect(), case_sensitive: true, } } } impl SingleTokenPattern for Word { fn matches_token(&self, token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } if token.span.len() != self.word.len() { return false; } let chars = token.span.get_content(source); if self.case_sensitive { chars == self.word.as_slice() } else { chars .iter() .zip(&self.word) .all(|(a, b)| a.eq_ignore_ascii_case(b)) } } } #[cfg(test)] mod tests { use crate::{Document, Span, patterns::DocPattern}; use super::Word; #[test] fn fruit() { let doc = Document::new_markdown_default_curated("I ate a banana and an apple today."); assert_eq!( Word::new("banana").find_all_matches_in_doc(&doc), vec![Span::new(6, 7)] ); assert_eq!( Word::new_exact("banana").find_all_matches_in_doc(&doc), vec![Span::new(6, 7)] ); } #[test] fn fruit_whack_capitalization() { let doc = Document::new_markdown_default_curated("I Ate A bAnaNa And aN apPlE today."); assert_eq!( Word::new("banana").find_all_matches_in_doc(&doc), vec![Span::new(6, 7)] ); assert_eq!( Word::new_exact("banana").find_all_matches_in_doc(&doc), vec![] ); } } ================================================ FILE: harper-core/src/patterns/word_set.rs ================================================ use super::SingleTokenPattern; use smallvec::SmallVec; use crate::{CharString, Token, char_ext::CharExt}; /// A [`super::Pattern`] that matches against any of a set of provided words. /// For small sets of short words, it doesn't allocate. /// /// Note that any capitalization of the contained words will result in a match. #[derive(Debug, Default, Clone)] pub struct WordSet { words: SmallVec<[CharString; 4]>, } impl WordSet { pub fn add(&mut self, word: &str) { let chars = word.chars().collect(); if !self.words.contains(&chars) { self.words.push(chars); } } pub fn add_chars(&mut self, chars: &[char]) { if !self.words.iter().any(|i| i.as_ref() == chars) { self.words.push(chars.into()); } } pub fn contains(&self, word: &str) -> bool { self.words.contains(&word.chars().collect()) } /// Create a new word set that matches against any word in the provided list. pub fn new(words: &[&'static str]) -> Self { let mut set = Self::default(); for str in words { set.add(str); } set } } impl SingleTokenPattern for WordSet { fn matches_token(&self, token: &Token, source: &[char]) -> bool { if !token.kind.is_word() { return false; } let tok_chars = token.span.get_content(source); for word in &self.words { if tok_chars.len() != word.len() { continue; } let partial_match = tok_chars .iter() .map(CharExt::normalized) .zip(word.iter().map(CharExt::normalized)) .all(|(a, b)| a.eq_ignore_ascii_case(&b)); if partial_match { return true; } } false } } #[cfg(test)] mod tests { use crate::{Document, Span, patterns::DocPattern}; use super::WordSet; #[test] fn fruit() { let set = WordSet::new(&["banana", "apple", "orange"]); let doc = Document::new_markdown_default_curated("I ate a banana and an apple today."); let matches = set.find_all_matches_in_doc(&doc); assert_eq!(matches, vec![Span::new(6, 7), Span::new(12, 13)]); } #[test] fn fruit_whack_capitalization() { let set = WordSet::new(&["banana", "apple", "orange"]); let doc = Document::new_markdown_default_curated("I Ate A bAnaNa And aN apPlE today."); let matches = set.find_all_matches_in_doc(&doc); assert_eq!(matches, vec![Span::new(6, 7), Span::new(12, 13)]); } #[test] fn supports_typographic_apostrophes() { let set = WordSet::new(&["They're"]); let doc = Document::new_markdown_default_curated("They’re"); let matches = set.find_all_matches_in_doc(&doc); assert_eq!(matches, vec![Span::new(0, 1)]); } } ================================================ FILE: harper-core/src/punctuation.rs ================================================ use is_macro::Is; use serde::{Deserialize, Serialize}; use crate::Currency; #[derive( Debug, Is, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Default, Hash, )] #[serde(tag = "kind")] pub enum Punctuation { /// `°` Degree, /// `…` Ellipsis, /// `–` EnDash, /// `—` EmDash, /// `&` Ampersand, /// `.` #[default] Period, /// `!` Bang, /// `?` Question, /// `:` Colon, /// ``;`` Semicolon, /// `"` Quote(Quote), /// `,` Comma, /// `-` Hyphen, /// `[` OpenSquare, /// `]` CloseSquare, /// `(` OpenRound, /// `)` CloseRound, /// `{` OpenCurly, /// `}` CloseCurly, /// `"` Hash, /// `'` Apostrophe, /// `%` Percent, /// `/` ForwardSlash, /// `\` Backslash, /// `<` LessThan, /// `>` GreaterThan, /// `=` Equal, /// `*` Star, /// `~` Tilde, /// `@` At, /// `^` Caret, /// `+` Plus, Currency(Currency), /// `|` Pipe, /// `_` Underscore, /// `´` Acute, } impl Punctuation { pub fn from_char(c: char) -> Option { let punct = match c { '@' => Punctuation::At, '~' => Punctuation::Tilde, '°' => Punctuation::Degree, '=' => Punctuation::Equal, '<' => Punctuation::LessThan, '>' => Punctuation::GreaterThan, '/' => Punctuation::ForwardSlash, '\\' => Punctuation::Backslash, '%' => Punctuation::Percent, '’' => Punctuation::Apostrophe, '\'' => Punctuation::Apostrophe, '.' => Punctuation::Period, '!' => Punctuation::Bang, '?' => Punctuation::Question, ':' => Punctuation::Colon, ';' => Punctuation::Semicolon, ',' => Punctuation::Comma, '、' => Punctuation::Comma, ',' => Punctuation::Comma, '-' => Punctuation::Hyphen, '[' => Punctuation::OpenSquare, ']' => Punctuation::CloseSquare, '{' => Punctuation::OpenCurly, '}' => Punctuation::CloseCurly, '(' => Punctuation::OpenRound, ')' => Punctuation::CloseRound, '#' => Punctuation::Hash, '*' => Punctuation::Star, '&' => Punctuation::Ampersand, '–' => Punctuation::EnDash, '—' => Punctuation::EmDash, '…' => Punctuation::Ellipsis, '^' => Punctuation::Caret, '+' => Punctuation::Plus, '|' => Punctuation::Pipe, '_' => Punctuation::Underscore, '´' => Punctuation::Acute, _ => Punctuation::Currency(Currency::from_char(c)?), }; Some(punct) } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, PartialOrd, Hash)] pub struct Quote { /// The location of the matching quote, if it exists. pub twin_loc: Option, } ================================================ FILE: harper-core/src/render_markdown.rs ================================================ use ammonia::clean; use pulldown_cmark::{Options, Parser, html}; /// The standard Markdown rendering function for the crate. /// Do not call `pulldown_cmark` directly. Use this. pub fn render_markdown(markdown: &str) -> String { let parser = Parser::new_ext(markdown, Options::all()); let mut html = String::new(); html::push_html(&mut html, parser); clean(&html) } ================================================ FILE: harper-core/src/span.rs ================================================ use std::{fmt::Display, marker::PhantomData, ops::Range}; use serde::{Deserialize, Serialize}; use crate::Token; /// A window in a `T` sequence. /// /// Note that the range covered by a [`Span`] is end-exclusive, meaning that the end index is not /// included in the range covered by the [`Span`]. If you're familiar with the Rust range syntax, /// you could say the span covers the equivalent of `start..end`, *not* `start..=end`. /// /// For a [`Span`] to be correct, its end index must be greater than or equal to its start /// index. Creating or using a [`Span`] which does not follow this rule may lead to unexpected /// behavior or panics. /// /// Although specific to `harper.js`, [this page may clear up any questions you have](https://writewithharper.com/docs/harperjs/spans). #[derive(Debug, Serialize, Deserialize, Default, PartialEq, Eq, Hash)] pub struct Span { /// The start index of the span. pub start: usize, /// The end index of the span. /// /// Note that [`Span`] represents an exclusive range. This means that a `Span::new(0, 5)` will /// cover the values `0, 1, 2, 3, 4`; it will not cover the `5`. pub end: usize, #[serde(skip)] span_type: PhantomData, } impl Span { /// A [`Span`] with a start and end index of 0. pub const ZERO: Self = Self::empty(0); /// Creates a new [`Span`] with the provided start and end indices. /// /// # Panics /// /// This will panic if `start` is greater than `end`. pub fn new(start: usize, end: usize) -> Self { if start > end { panic!("{start} > {end}"); } Self { start, end, span_type: PhantomData, } } /// Creates a new [`Span`] from the provided start position and length. pub fn new_with_len(start: usize, len: usize) -> Self { Self { start, end: start + len, span_type: PhantomData, } } /// Creates a new empty [`Span`] with the provided position. pub const fn empty(pos: usize) -> Self { Self { start: pos, end: pos, span_type: PhantomData, } } /// The length of the [`Span`]. pub fn len(&self) -> usize { self.end - self.start } /// Checks whether the [`Span`] is empty. /// /// A [`Span`] is considered empty if it has a length of 0. pub fn is_empty(&self) -> bool { self.len() == 0 } /// Checks whether `idx` is within the range of the span. pub fn contains(&self, idx: usize) -> bool { self.start <= idx && idx < self.end } /// Checks whether this span's range overlaps with `other`. pub fn overlaps_with(&self, other: Self) -> bool { (self.start < other.end) && (other.start < self.end) } /// Get the associated content. Will return [`None`] if the span is non-empty and any aspect is /// invalid. pub fn try_get_content<'a>(&self, source: &'a [T]) -> Option<&'a [T]> { if self.is_empty() { Some(&source[0..0]) } else { source.get(self.start..self.end) } } /// Expand the span by either modifying [`Self::start`] or [`Self::end`] to include the target /// index. /// /// Does nothing if the span already includes the target. pub fn expand_to_include(&mut self, target: usize) { if target < self.start { self.start = target; } else if target >= self.end { self.end = target + 1; } } /// Get the associated content. Will panic if any aspect is invalid. pub fn get_content<'a>(&self, source: &'a [T]) -> &'a [T] { match self.try_get_content(source) { Some(v) => v, None => panic!("Failed to get content for span."), } } /// Set the span's length. pub fn set_len(&mut self, length: usize) { self.end = self.start + length; } /// Returns a copy of this [`Span`] with a new length. pub fn with_len(&self, length: usize) -> Self { let mut cloned = *self; cloned.set_len(length); cloned } /// Add an amount to both [`Self::start`] and [`Self::end`] pub fn push_by(&mut self, by: usize) { self.start += by; self.end += by; } /// Subtract an amount from both [`Self::start`] and [`Self::end`] pub fn pull_by(&mut self, by: usize) { self.start -= by; self.end -= by; } /// Add an amount to a copy of both [`Self::start`] and [`Self::end`] pub fn pushed_by(&self, by: usize) -> Self { let mut clone = *self; clone.start += by; clone.end += by; clone } /// Subtract an amount to a copy of both [`Self::start`] and [`Self::end`] pub fn pulled_by(&self, by: usize) -> Option { if by > self.start { return None; } let mut clone = *self; clone.start -= by; clone.end -= by; Some(clone) } } /// Additional functions for types that implement [`std::fmt::Debug`] and [`Display`]. impl Span { /// Gets the content of this [`Span`] as a [`String`]. pub fn get_content_string(&self, source: &[T]) -> String { if let Some(content) = self.try_get_content(source) { content.iter().map(|t| t.to_string()).collect() } else { panic!("Could not get position {self:?} within \"{source:?}\"") } } } /// Functionality specific to [`Token`] spans. impl Span { /// Converts the [`Span`] into a [`Span`]. /// /// This requires knowing the character spans of the tokens covered by this /// [`Span`]. Because of this, a reference to the source token sequence used to create /// this span is required. pub fn to_char_span(&self, source_document_tokens: &[Token]) -> Span { if self.is_empty() { Span::ZERO } else { let target_tokens = &source_document_tokens[self.start..self.end]; Span::new( target_tokens.first().unwrap().span.start, target_tokens.last().unwrap().span.end, ) } } } impl From> for Span { /// Reinterprets the provided [`std::ops::Range`] as a [`Span`]. fn from(value: Range) -> Self { Self::new(value.start, value.end) } } impl From> for Range { /// Converts the [`Span`] to an [`std::ops::Range`]. fn from(value: Span) -> Self { value.start..value.end } } impl IntoIterator for Span { type Item = usize; type IntoIter = Range; /// Converts the [`Span`] into an iterator that yields the indices covered by its range. /// /// Note that [`Span`] is half-open, meaning that the value [`Self::end`] will not be yielded /// by this iterator: it will stop at the index immediately preceding [`Self::end`]. fn into_iter(self) -> Self::IntoIter { self.start..self.end } } impl Clone for Span { // Note: manual implementation so we don't unnecessarily require `T` to impl `Clone`. fn clone(&self) -> Self { *self } } impl Copy for Span {} #[cfg(test)] mod tests { use crate::{ Document, expr::{ExprExt, SequenceExpr}, }; use super::Span; type UntypedSpan = Span<()>; #[test] fn overlaps() { assert!(UntypedSpan::new(0, 5).overlaps_with(UntypedSpan::new(3, 6))); assert!(UntypedSpan::new(0, 5).overlaps_with(UntypedSpan::new(2, 3))); assert!(UntypedSpan::new(0, 5).overlaps_with(UntypedSpan::new(4, 5))); assert!(UntypedSpan::new(0, 5).overlaps_with(UntypedSpan::new(4, 4))); assert!(!UntypedSpan::new(0, 3).overlaps_with(UntypedSpan::new(3, 5))); } #[test] fn expands_properly() { let mut span = UntypedSpan::new(2, 2); span.expand_to_include(1); assert_eq!(span, UntypedSpan::new(1, 2)); span.expand_to_include(2); assert_eq!(span, UntypedSpan::new(1, 3)); } #[test] fn to_char_span_converts_correctly() { let doc = Document::new_plain_english_curated("Hello world!"); // Empty span. let token_span = Span::ZERO; let converted = token_span.to_char_span(doc.get_tokens()); assert!(converted.is_empty()); // Span from `Expr`. let token_span = SequenceExpr::any_word() .t_ws() .then_any_word() .iter_matches_in_doc(&doc) .next() .unwrap(); let converted = token_span.to_char_span(doc.get_tokens()); assert_eq!( converted.get_content_string(doc.get_source()), "Hello world" ); } } ================================================ FILE: harper-core/src/spell/dictionary.rs ================================================ use blanket::blanket; use std::borrow::Cow; use super::FuzzyMatchResult; use super::WordId; use crate::DictWordMetadata; /// An in-memory database that contains everything necessary to parse and analyze English text. /// /// See also: [`super::FstDictionary`] and [`super::MutableDictionary`]. #[blanket(derive(Arc, Ref))] pub trait Dictionary: Send + Sync { /// Check if the dictionary contains any capitalization of a given word. fn contains_word(&self, word: &[char]) -> bool; /// Check if the dictionary contains any capitalization of a given word. fn contains_word_str(&self, word: &str) -> bool; /// Check if the dictionary contains the exact capitalization of a given word. fn contains_exact_word(&self, word: &[char]) -> bool; /// Check if the dictionary contains the exact capitalization of a given word. fn contains_exact_word_str(&self, word: &str) -> bool; /// Gets best fuzzy match from dictionary fn fuzzy_match( &'_ self, word: &[char], max_distance: u8, max_results: usize, ) -> Vec>; /// Gets best fuzzy match from dictionary fn fuzzy_match_str( &'_ self, word: &str, max_distance: u8, max_results: usize, ) -> Vec>; fn get_correct_capitalization_of(&self, word: &[char]) -> Option<&'_ [char]>; /// Get the associated [`DictWordMetadata`] for any capitalization of a given word. fn get_word_metadata(&self, word: &[char]) -> Option>; /// Get the associated [`DictWordMetadata`] for any capitalization of a given word. /// If the word isn't in the dictionary, the resulting metadata will be /// empty. fn get_word_metadata_str(&self, word: &str) -> Option>; /// Iterate over the words in the dictionary. fn words_iter(&self) -> Box + Send + '_>; /// The number of words in the dictionary. fn word_count(&self) -> usize; /// Returns the correct capitalization of the word with the given ID. fn get_word_from_id(&self, id: &WordId) -> Option<&[char]>; /// Look for words with a specific prefix fn find_words_with_prefix(&self, prefix: &[char]) -> Vec>; /// Look for words that share a prefix with the provided word fn find_words_with_common_prefix(&self, word: &[char]) -> Vec>; } ================================================ FILE: harper-core/src/spell/fst_dictionary.rs ================================================ use super::{MutableDictionary, WordId}; use fst::{IntoStreamer, Map as FstMap, Streamer, map::StreamWithState}; use hashbrown::HashMap; use levenshtein_automata::{DFA, LevenshteinAutomatonBuilder}; use std::borrow::Cow; use std::sync::LazyLock; use std::{cell::RefCell, sync::Arc}; use crate::{CharString, CharStringExt, DictWordMetadata}; use super::Dictionary; use super::FuzzyMatchResult; /// An immutable dictionary allowing for very fast spellchecking. /// /// For dictionaries with changing contents, such as user and file dictionaries, prefer /// [`MutableDictionary`]. pub struct FstDictionary { /// Underlying [`super::MutableDictionary`] used for everything except fuzzy finding mutable_dict: Arc, /// Used for fuzzy-finding the index of words or metadata word_map: FstMap>, /// Used for fuzzy-finding the index of words or metadata words: Vec<(CharString, DictWordMetadata)>, } const EXPECTED_DISTANCE: u8 = 3; const TRANSPOSITION_COST_ONE: bool = true; static DICT: LazyLock> = LazyLock::new(|| Arc::new((*MutableDictionary::curated()).clone().into())); thread_local! { // Builders are computationally expensive and do not depend on the word, so we store a // collection of builders and the associated edit distance here. // Currently, the edit distance we use is three, but a value that does not exist in this // collection will create a new builder of that distance and push it to the collection. static AUTOMATON_BUILDERS: RefCell> = RefCell::new(vec![( EXPECTED_DISTANCE, LevenshteinAutomatonBuilder::new(EXPECTED_DISTANCE, TRANSPOSITION_COST_ONE), )]); } impl PartialEq for FstDictionary { fn eq(&self, other: &Self) -> bool { self.mutable_dict == other.mutable_dict } } impl FstDictionary { /// Create a dictionary from the curated dictionary included /// in the Harper binary. pub fn curated() -> Arc { (*DICT).clone() } /// Construct a new [`FstDictionary`] using a wordlist as a source. /// This can be expensive, so only use this if fast fuzzy searches are worth it. pub fn new(mut words: Vec<(CharString, DictWordMetadata)>) -> Self { words.sort_unstable_by(|(a, _), (b, _)| a.cmp(b)); words.dedup_by(|(a, _), (b, _)| a == b); let mut builder = fst::MapBuilder::memory(); for (index, (word, _)) in words.iter().enumerate() { let word = word.iter().collect::(); builder .insert(word, index as u64) .expect("Insertion not in lexicographical order!"); } let mut mutable_dict = MutableDictionary::new(); mutable_dict.extend_words(words.iter().cloned()); let fst_bytes = builder.into_inner().unwrap(); let word_map = FstMap::new(fst_bytes).expect("Unable to build FST map."); FstDictionary { mutable_dict: Arc::new(mutable_dict), word_map, words, } } } fn build_dfa(max_distance: u8, query: &str) -> DFA { // Insert if it does not exist AUTOMATON_BUILDERS.with_borrow_mut(|v| { if !v.iter().any(|t| t.0 == max_distance) { v.push(( max_distance, LevenshteinAutomatonBuilder::new(max_distance, TRANSPOSITION_COST_ONE), )); } }); AUTOMATON_BUILDERS.with_borrow(|v| { v.iter() .find(|a| a.0 == max_distance) .unwrap() .1 .build_dfa(query) }) } /// Consumes a DFA stream and emits the index-edit distance pairs it produces. fn stream_distances_vec(stream: &mut StreamWithState<&DFA>, dfa: &DFA) -> Vec<(u64, u8)> { let mut word_index_pairs = Vec::new(); while let Some((_, v, s)) = stream.next() { word_index_pairs.push((v, dfa.distance(s).to_u8())); } word_index_pairs } impl Dictionary for FstDictionary { fn contains_word(&self, word: &[char]) -> bool { self.mutable_dict.contains_word(word) } fn contains_word_str(&self, word: &str) -> bool { self.mutable_dict.contains_word_str(word) } fn get_word_metadata(&self, word: &[char]) -> Option> { self.mutable_dict.get_word_metadata(word) } fn get_word_metadata_str(&self, word: &str) -> Option> { self.mutable_dict.get_word_metadata_str(word) } fn fuzzy_match( &'_ self, word: &[char], max_distance: u8, max_results: usize, ) -> Vec> { let misspelled_word_charslice = word.normalized(); let misspelled_word_string = misspelled_word_charslice.to_string(); // Actual FST search let dfa = build_dfa(max_distance, &misspelled_word_string); let dfa_lowercase = build_dfa(max_distance, &misspelled_word_string.to_lowercase()); let mut word_indexes_stream = self.word_map.search_with_state(&dfa).into_stream(); let mut word_indexes_lowercase_stream = self .word_map .search_with_state(&dfa_lowercase) .into_stream(); let upper_dists = stream_distances_vec(&mut word_indexes_stream, &dfa); let lower_dists = stream_distances_vec(&mut word_indexes_lowercase_stream, &dfa_lowercase); // Merge the two results, keeping the smallest distance when both DFAs match. // The uppercase and lowercase searches can return different result counts, so // we can't simply zip the vectors without losing matches. let mut merged = Vec::with_capacity(upper_dists.len().max(lower_dists.len())); let mut best_distances = HashMap::::new(); for (idx, dist) in upper_dists.into_iter().chain(lower_dists.into_iter()) { best_distances .entry(idx) .and_modify(|existing| *existing = (*existing).min(dist)) .or_insert(dist); } for (index, edit_distance) in best_distances { let (word, metadata) = &self.words[index as usize]; merged.push(FuzzyMatchResult { word, edit_distance, metadata: Cow::Borrowed(metadata), }); } // Ignore exact matches merged.retain(|v| v.edit_distance > 0); merged.sort_unstable_by(|a, b| { a.edit_distance .cmp(&b.edit_distance) .then_with(|| a.word.cmp(b.word)) }); merged.truncate(max_results); merged } fn fuzzy_match_str( &'_ self, word: &str, max_distance: u8, max_results: usize, ) -> Vec> { self.fuzzy_match( word.chars().collect::>().as_slice(), max_distance, max_results, ) } fn words_iter(&self) -> Box + Send + '_> { self.mutable_dict.words_iter() } fn word_count(&self) -> usize { self.mutable_dict.word_count() } fn contains_exact_word(&self, word: &[char]) -> bool { self.mutable_dict.contains_exact_word(word) } fn contains_exact_word_str(&self, word: &str) -> bool { self.mutable_dict.contains_exact_word_str(word) } fn get_correct_capitalization_of(&self, word: &[char]) -> Option<&'_ [char]> { self.mutable_dict.get_correct_capitalization_of(word) } fn get_word_from_id(&self, id: &WordId) -> Option<&[char]> { self.mutable_dict.get_word_from_id(id) } fn find_words_with_prefix(&self, prefix: &[char]) -> Vec> { self.mutable_dict.find_words_with_prefix(prefix) } fn find_words_with_common_prefix(&self, word: &[char]) -> Vec> { self.mutable_dict.find_words_with_common_prefix(word) } } #[cfg(test)] mod tests { use itertools::Itertools; use crate::CharStringExt; use crate::spell::{Dictionary, WordId}; use super::FstDictionary; #[test] fn damerau_transposition_costs_one() { let lev_automata = levenshtein_automata::LevenshteinAutomatonBuilder::new(1, true).build_dfa("woof"); assert_eq!( lev_automata.eval("wofo"), levenshtein_automata::Distance::Exact(1) ); } #[test] fn damerau_transposition_costs_two() { let lev_automata = levenshtein_automata::LevenshteinAutomatonBuilder::new(1, false).build_dfa("woof"); assert_eq!( lev_automata.eval("wofo"), levenshtein_automata::Distance::AtLeast(2) ); } #[test] fn fst_map_contains_all_in_mutable_dict() { let dict = FstDictionary::curated(); for word in dict.words_iter() { let misspelled_normalized = word.normalized(); let misspelled_word = misspelled_normalized.to_string(); let misspelled_lower = misspelled_normalized.to_lower().to_string(); dbg!(&misspelled_lower); assert!(!misspelled_word.is_empty()); assert!(dict.word_map.contains_key(misspelled_word)); } } #[test] fn fst_contains_hello() { let dict = FstDictionary::curated(); let word: Vec<_> = "hello".chars().collect(); let misspelled_normalized = word.normalized(); let misspelled_word = misspelled_normalized.to_string(); let misspelled_lower = misspelled_normalized.to_lower().to_string(); assert!(dict.contains_word(&misspelled_normalized)); assert!( dict.word_map.contains_key(misspelled_lower) || dict.word_map.contains_key(misspelled_word) ); } #[test] fn on_is_not_nominal() { let dict = FstDictionary::curated(); assert!(!dict.get_word_metadata_str("on").unwrap().is_nominal()); } #[test] fn fuzzy_result_sorted_by_edit_distance() { let dict = FstDictionary::curated(); let results = dict.fuzzy_match_str("hello", 3, 100); let is_sorted_by_dist = results .iter() .map(|fm| fm.edit_distance) .tuple_windows() .all(|(a, b)| a <= b); assert!(is_sorted_by_dist) } #[test] fn curated_contains_no_duplicates() { let dict = FstDictionary::curated(); assert!(dict.words.iter().map(|(word, _)| word).all_unique()); } #[test] fn contractions_not_derived() { let dict = FstDictionary::curated(); let contractions = ["there's", "we're", "here's"]; for contraction in contractions { dbg!(contraction); assert!( dict.get_word_metadata_str(contraction) .unwrap() .derived_from .is_none() ) } } #[test] fn plural_llamas_derived_from_llama() { let dict = FstDictionary::curated(); assert_eq!( dict.get_word_metadata_str("llamas") .unwrap() .derived_from .unwrap(), WordId::from_word_str("llama") ) } #[test] fn plural_cats_derived_from_cat() { let dict = FstDictionary::curated(); assert_eq!( dict.get_word_metadata_str("cats") .unwrap() .derived_from .unwrap(), WordId::from_word_str("cat") ); } #[test] fn unhappy_derived_from_happy() { let dict = FstDictionary::curated(); assert_eq!( dict.get_word_metadata_str("unhappy") .unwrap() .derived_from .unwrap(), WordId::from_word_str("happy") ); } #[test] fn quickly_derived_from_quick() { let dict = FstDictionary::curated(); assert_eq!( dict.get_word_metadata_str("quickly") .unwrap() .derived_from .unwrap(), WordId::from_word_str("quick") ); } } ================================================ FILE: harper-core/src/spell/merged_dictionary.rs ================================================ use std::borrow::Cow; use std::hash::{BuildHasher, Hasher}; use std::sync::Arc; use foldhash::quality::FixedState; use itertools::Itertools; use super::{FstDictionary, WordId}; use super::{FuzzyMatchResult, dictionary::Dictionary}; use crate::{CharString, DictWordMetadata}; /// A simple wrapper over [`Dictionary`] that allows /// one to merge multiple dictionaries without copying. /// /// In cases where more than one dictionary contains a word, data in the first /// dictionary inserted will be returned. #[derive(Clone)] pub struct MergedDictionary { children: Vec>, hasher_builder: FixedState, child_hashes: Vec, } impl MergedDictionary { pub fn new() -> Self { Self { children: Vec::new(), hasher_builder: FixedState::default(), child_hashes: Vec::new(), } } pub fn add_dictionary(&mut self, dictionary: Arc) { self.child_hashes.push(self.hash_dictionary(&dictionary)); self.children.push(dictionary); } fn hash_dictionary(&self, dictionary: &Arc) -> u64 { // Hashing the curated dictionary isn't super helpful and takes a long time. if Arc::ptr_eq( dictionary, &(FstDictionary::curated() as Arc), ) { return 1; } let mut hasher = self.hasher_builder.build_hasher(); dictionary .words_iter() .for_each(|w| w.iter().for_each(|c| hasher.write_u32(*c as u32))); hasher.finish() } } impl PartialEq for MergedDictionary { fn eq(&self, other: &Self) -> bool { self.child_hashes == other.child_hashes } } impl Default for MergedDictionary { fn default() -> Self { Self::new() } } impl Dictionary for MergedDictionary { fn get_correct_capitalization_of(&self, word: &[char]) -> Option<&'_ [char]> { for child in &self.children { if let Some(word) = child.get_correct_capitalization_of(word) { return Some(word); } } None } fn contains_word(&self, word: &[char]) -> bool { for child in &self.children { if child.contains_word(word) { return true; } } false } fn contains_exact_word(&self, word: &[char]) -> bool { for child in &self.children { if child.contains_exact_word(word) { return true; } } false } fn get_word_metadata(&self, word: &[char]) -> Option> { let mut meta_iter = self .children .iter() .filter_map(|d| d.get_word_metadata(word)); let first = meta_iter.next()?; // Check if multiple entries were found for the word. if let Some(second) = meta_iter.next() { // If so, merge them. let mut first = first.into_owned(); first.merge(&second); meta_iter.for_each(|additional_md| { first.merge(&additional_md); }); Some(Cow::Owned(first)) } else { // If not, return the sole found entry. Some(first) } } fn words_iter(&self) -> Box + Send + '_> { Box::new(self.children.iter().flat_map(|c| c.words_iter())) } fn contains_word_str(&self, word: &str) -> bool { let chars: CharString = word.chars().collect(); self.contains_word(&chars) } fn contains_exact_word_str(&self, word: &str) -> bool { let chars: CharString = word.chars().collect(); self.contains_word(&chars) } fn get_word_metadata_str(&self, word: &str) -> Option> { let chars: CharString = word.chars().collect(); self.get_word_metadata(&chars) } fn fuzzy_match( &'_ self, word: &[char], max_distance: u8, max_results: usize, ) -> Vec> { self.children .iter() .flat_map(|d| d.fuzzy_match(word, max_distance, max_results)) .sorted_by_key(|r| r.word) .dedup_by(|a, b| a.word == b.word) .sorted_by_key(|r| r.edit_distance) .take(max_results) .collect() } fn fuzzy_match_str( &'_ self, word: &str, max_distance: u8, max_results: usize, ) -> Vec> { self.children .iter() .flat_map(|d| d.fuzzy_match_str(word, max_distance, max_results)) .sorted_by_key(|r| r.word) .dedup_by(|a, b| a.word == b.word) .sorted_by_key(|r| r.edit_distance) .take(max_results) .collect() } fn word_count(&self) -> usize { self.children.iter().map(|d| d.word_count()).sum() } fn get_word_from_id(&self, id: &WordId) -> Option<&[char]> { self.children .iter() .find_map(|dict| dict.get_word_from_id(id)) } fn find_words_with_prefix(&self, prefix: &[char]) -> Vec> { self.children .iter() .flat_map(|dict| dict.find_words_with_prefix(prefix)) .sorted() .dedup() .collect() } fn find_words_with_common_prefix(&self, word: &[char]) -> Vec> { self.children .iter() .flat_map(|dict| dict.find_words_with_common_prefix(word)) .sorted() .dedup() .collect() } } ================================================ FILE: harper-core/src/spell/mod.rs ================================================ //! Contains the relevant code for performing dictionary lookups and spellchecking (i.e. fuzzy //! dictionary lookups). use itertools::Itertools; use crate::{CharString, CharStringExt, DictWordMetadata}; pub use self::dictionary::Dictionary; pub use self::fst_dictionary::FstDictionary; pub use self::merged_dictionary::MergedDictionary; pub use self::mutable_dictionary::MutableDictionary; pub use self::trie_dictionary::TrieDictionary; pub use self::word_id::WordId; mod dictionary; mod fst_dictionary; mod merged_dictionary; mod mutable_dictionary; mod rune; mod trie_dictionary; mod word_id; mod word_map; #[derive(PartialEq, Debug, Hash, Eq)] pub struct FuzzyMatchResult<'a> { pub word: &'a [char], pub edit_distance: u8, pub metadata: std::borrow::Cow<'a, DictWordMetadata>, } impl PartialOrd for FuzzyMatchResult<'_> { fn partial_cmp(&self, other: &Self) -> Option { self.edit_distance.partial_cmp(&other.edit_distance) } } /// Returns whether the two words are the same, expect that one is written /// with 'ou' and the other with 'o'. /// /// E.g. "color" and "colour" pub(crate) fn is_ou_misspelling(a: &[char], b: &[char]) -> bool { if a.len().abs_diff(b.len()) != 1 { return false; } let mut a_iter = a.iter(); let mut b_iter = b.iter(); loop { match ( a_iter.next().map(char::to_ascii_lowercase), b_iter.next().map(char::to_ascii_lowercase), ) { (Some('o'), Some('o')) => { let mut a_next = a_iter.next().map(char::to_ascii_lowercase); let mut b_next = b_iter.next().map(char::to_ascii_lowercase); if a_next != b_next { if a_next == Some('u') { a_next = a_iter.next().map(char::to_ascii_lowercase); } else if b_next == Some('u') { b_next = b_iter.next().map(char::to_ascii_lowercase); } if a_next != b_next { return false; } } } (Some(a_char), Some(b_char)) => { if !a_char.eq_ignore_ascii_case(&b_char) { return false; } } (None, None) => return true, _ => return false, } } } /// Returns whether the two words are the same, expect for a single confusion of: /// /// - `s` and `z`. E.g."realize" and "realise" /// - `s` and `c`. E.g. "defense" and "defence" /// - `k` and `c`. E.g. "skepticism" and "scepticism" pub(crate) fn is_cksz_misspelling(a: &[char], b: &[char]) -> bool { if a.len() != b.len() { return false; } if a.is_empty() { return true; } // the first character must be the same if !a[0].eq_ignore_ascii_case(&b[0]) { return false; } let mut found = false; for (a_char, b_char) in a.iter().copied().zip(b.iter().copied()) { let a_char = a_char.to_ascii_lowercase(); let b_char = b_char.to_ascii_lowercase(); if a_char != b_char { if (a_char == 's' && b_char == 'z') || (a_char == 'z' && b_char == 's') || (a_char == 's' && b_char == 'c') || (a_char == 'c' && b_char == 's') || (a_char == 'k' && b_char == 'c') || (a_char == 'c' && b_char == 'k') { if found { return false; } found = true; } else { return false; } } } found } /// Returns whether the two words are the same, expect that one is written /// with '-er' and the other with '-re'. /// /// E.g. "meter" and "metre" pub(crate) fn is_er_misspelling(a: &[char], b: &[char]) -> bool { if a.len() != b.len() || a.len() <= 4 { return false; } let len = a.len(); let a_suffix = [&a[len - 2], &a[len - 1]].map(char::to_ascii_lowercase); let b_suffix = [&b[len - 2], &b[len - 1]].map(char::to_ascii_lowercase); if a_suffix == ['r', 'e'] && b_suffix == ['e', 'r'] || a_suffix == ['e', 'r'] && b_suffix == ['r', 'e'] { return a[0..len - 2] .iter() .copied() .zip(b[0..len - 2].iter().copied()) .all(|(a_char, b_char)| a_char.eq_ignore_ascii_case(&b_char)); } false } /// Returns whether the two words are the same, expect that one is written /// with 'll' and the other with 'l'. /// /// E.g. "traveller" and "traveler" pub(crate) fn is_ll_misspelling(a: &[char], b: &[char]) -> bool { if a.len().abs_diff(b.len()) != 1 { return false; } let mut a_iter = a.iter(); let mut b_iter = b.iter(); loop { match ( a_iter.next().map(char::to_ascii_lowercase), b_iter.next().map(char::to_ascii_lowercase), ) { (Some('l'), Some('l')) => { let mut a_next = a_iter.next().map(char::to_ascii_lowercase); let mut b_next = b_iter.next().map(char::to_ascii_lowercase); if a_next != b_next { if a_next == Some('l') { a_next = a_iter.next().map(char::to_ascii_lowercase); } else if b_next == Some('l') { b_next = b_iter.next().map(char::to_ascii_lowercase); } if a_next != b_next { return false; } } } (Some(a_char), Some(b_char)) => { if !a_char.eq_ignore_ascii_case(&b_char) { return false; } } (None, None) => return true, _ => return false, } } } pub fn is_th_h_missing(a: &[char], b: &[char]) -> bool { a.iter().any(|c| c.eq_ignore_ascii_case(&'t')) && b.iter() .tuple_windows() .any(|(a, b)| a.eq_ignore_ascii_case(&'t') && b.eq_ignore_ascii_case(&'h')) } /// Returns whether the two words are the same, except that one is written /// with 'ay' and the other with 'ey'. /// /// E.g. "gray" and "grey" pub(crate) fn is_ay_ey_misspelling(a: &[char], b: &[char]) -> bool { if a.len() != b.len() { return false; } let mut found_ay_ey = false; let mut a_iter = a.iter(); let mut b_iter = b.iter(); while let (Some(&a_char), Some(&b_char)) = (a_iter.next(), b_iter.next()) { if a_char.eq_ignore_ascii_case(&b_char) { continue; } // Check for 'a'/'e' difference if (a_char.eq_ignore_ascii_case(&'a') && b_char.eq_ignore_ascii_case(&'e')) || (a_char.eq_ignore_ascii_case(&'e') && b_char.eq_ignore_ascii_case(&'a')) { // Check if next character is 'y' for both if let (Some(&a_next), Some(&b_next)) = (a_iter.next(), b_iter.next()) && a_next.eq_ignore_ascii_case(&'y') && b_next.eq_ignore_ascii_case(&'y') { if found_ay_ey { return false; // More than one ay/ey difference } found_ay_ey = true; continue; } } return false; // Non-ay/ey difference found } if !found_ay_ey { return false; } found_ay_ey } /// Returns whether the two words are the same, except that one is written /// with 'ei' and the other with 'ie'. /// /// E.g. "recieved" instead of "received", "cheif" instead of "chief" pub(crate) fn is_ei_ie_misspelling(a: &[char], b: &[char]) -> bool { if a.len() != b.len() { return false; } let mut found_ei_ie = false; let mut a_iter = a.iter(); let mut b_iter = b.iter(); while let (Some(&a_char), Some(&b_char)) = (a_iter.next(), b_iter.next()) { if a_char.eq_ignore_ascii_case(&b_char) { continue; } // Check for 'e' vs 'i' in first position if a_char.eq_ignore_ascii_case(&'e') && b_char.eq_ignore_ascii_case(&'i') { if let (Some(&a_next), Some(&b_next)) = (a_iter.next(), b_iter.next()) { // Next chars must be 'i' and 'e' respectively if a_next.eq_ignore_ascii_case(&'i') && b_next.eq_ignore_ascii_case(&'e') { if found_ei_ie { return false; // More than one ei/ie difference } found_ei_ie = true; continue; } } } // Check for 'i' vs 'e' in first position else if a_char.eq_ignore_ascii_case(&'i') && b_char.eq_ignore_ascii_case(&'e') && let (Some(&a_next), Some(&b_next)) = (a_iter.next(), b_iter.next()) { // Next chars must be 'e' and 'i' respectively if a_next.eq_ignore_ascii_case(&'e') && b_next.eq_ignore_ascii_case(&'i') { if found_ei_ie { return false; // More than one ei/ie difference } found_ei_ie = true; continue; } } return false; } found_ei_ie } /// Scores a possible spelling suggestion based on possible relevance to the user. /// /// Lower = better. fn score_suggestion(misspelled_word: &[char], sug: &FuzzyMatchResult) -> i32 { if misspelled_word.is_empty() || sug.word.is_empty() { return i32::MAX; } let mut score = sug.edit_distance as i32 * 10; // People are much less likely to mistype the first letter. if misspelled_word .first() .unwrap() .eq_ignore_ascii_case(sug.word.first().unwrap()) { score -= 10; } // If the original word is plural, the correct one probably is too. if *misspelled_word.last().unwrap() == 's' && *sug.word.last().unwrap() == 's' { score -= 5; } // Promote suggestions that differ only by an apostrophe let check_apostrophe_diff = |longer: &[char], shorter: &[char]| -> bool { if let Some(pos) = longer.iter().position(|&c| c == '\'' || c == '’') { longer.len() - 1 == shorter.len() && longer.starts_with(&shorter[..pos]) && longer.ends_with(&shorter[pos..]) } else { false } }; match ( misspelled_word.len() as i32 - sug.word.len() as i32, sug.metadata.is_apostrophized(), ) { (1, _) if (misspelled_word.contains(&'\'') || misspelled_word.contains(&'\u{2019}')) && check_apostrophe_diff(misspelled_word, sug.word) => { score -= 8 } (-1, true) if check_apostrophe_diff(sug.word, misspelled_word) => score -= 8, _ => {} // not a single-character apostrophe difference } // Boost common words. if sug.metadata.common && sug.metadata.derived_from.is_none() { score -= 4; } // For turning words into contractions. if sug.word.iter().filter(|c| **c == '\'').count() == 1 { score -= 5; } if is_th_h_missing(misspelled_word, sug.word) { score -= 6; } if !misspelled_word.contains_vowel() && !sug.word.contains_vowel() { score += 10; } // Detect dialect-specific variations if sug.edit_distance == 1 && (is_cksz_misspelling(misspelled_word, sug.word) || is_ou_misspelling(misspelled_word, sug.word) || is_ll_misspelling(misspelled_word, sug.word) || is_ay_ey_misspelling(misspelled_word, sug.word) || is_th_h_missing(misspelled_word, sug.word)) { score -= 6; } if sug.edit_distance <= 2 { if is_ei_ie_misspelling(misspelled_word, sug.word) { score -= 11; } if is_er_misspelling(misspelled_word, sug.word) { score -= 15; } } score } /// Order the suggestions to be shown to the user. fn order_suggestions<'b>( misspelled_word: &[char], mut matches: Vec>, ) -> Vec<&'b [char]> { matches.sort_by_cached_key(|v| score_suggestion(misspelled_word, v)); matches.into_iter().map(|v| v.word).collect() } /// Get the closest matches in the provided [`Dictionary`] and rank them /// Implementation is left up to the underlying dictionary. pub fn suggest_correct_spelling<'a>( misspelled_word: &[char], result_limit: usize, max_edit_dist: u8, dictionary: &'a impl Dictionary, ) -> Vec<&'a [char]> { let matches: Vec = dictionary .fuzzy_match(misspelled_word, max_edit_dist, result_limit) .into_iter() .collect(); order_suggestions(misspelled_word, matches) } /// Convenience function over [`suggest_correct_spelling`] that does conversions /// for you. pub fn suggest_correct_spelling_str( misspelled_word: impl Into, result_limit: usize, max_edit_dist: u8, dictionary: &impl Dictionary, ) -> Vec { let chars: CharString = misspelled_word.into().chars().collect(); suggest_correct_spelling(&chars, result_limit, max_edit_dist, dictionary) .into_iter() .map(|a| a.to_string()) .collect() } #[cfg(test)] mod tests { use itertools::Itertools; use crate::CharStringExt; use super::{FstDictionary, suggest_correct_spelling_str}; const RESULT_LIMIT: usize = 200; const MAX_EDIT_DIST: u8 = 2; #[test] fn normalizes_weve() { let word = ['w', 'e', '’', 'v', 'e']; let norm = word.normalized(); assert_eq!(norm.clone(), vec!['w', 'e', '\'', 'v', 'e']) } #[test] fn punctation_no_duplicates() { let results = suggest_correct_spelling_str( "punctation", RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); assert!(results.iter().all_unique()) } #[test] fn youre_contraction() { assert_suggests_correction("youre", "you're"); } #[test] fn thats_contraction() { assert_suggests_correction("thats", "that's"); } #[test] fn weve_contraction() { assert_suggests_correction("weve", "we've"); } #[test] fn this_correction() { assert_suggests_correction("ths", "this"); } #[test] fn issue_624_no_duplicates() { let results = suggest_correct_spelling_str( "Semantical", RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); assert!(results.iter().all_unique()) } #[test] fn issue_182() { assert_suggests_correction("Im", "I'm"); } #[test] fn fst_spellcheck_hvllo() { let results = suggest_correct_spelling_str( "hvllo", RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); assert!(results.iter().take(3).contains(&"hello".to_string())); } /// Assert that the default suggestion settings result in a specific word /// being in the top three results for a given misspelling. #[track_caller] fn assert_suggests_correction(misspelled_word: &str, correct: &str) { let results = suggest_correct_spelling_str( misspelled_word, RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); dbg!(&results); assert!(results.iter().take(3).contains(&correct.to_string())); } #[test] fn spellcheck_hvllo() { assert_suggests_correction("hvllo", "hello"); } #[test] fn spellcheck_aout() { assert_suggests_correction("aout", "about"); } #[test] fn spellchecking_is_deterministic() { let results1 = suggest_correct_spelling_str( "hello", RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); let results2 = suggest_correct_spelling_str( "hello", RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); let results3 = suggest_correct_spelling_str( "hello", RESULT_LIMIT, MAX_EDIT_DIST, &FstDictionary::curated(), ); assert_eq!(results1, results2); assert_eq!(results1, results3); } #[test] fn adviced_correction() { assert_suggests_correction("adviced", "advised"); } #[test] fn aknowledged_correction() { assert_suggests_correction("aknowledged", "acknowledged"); } #[test] fn alcaholic_correction() { assert_suggests_correction("alcaholic", "alcoholic"); } #[test] fn slaves_correction() { assert_suggests_correction("Slaves", "Slavs"); } #[test] fn conciousness_correction() { assert_suggests_correction("conciousness", "consciousness"); } #[test] fn v_apostrophe_s_suggests_vs() { assert_suggests_correction("v's", "vs"); } #[test] fn v_apostrophe_typographical_s_suggests_vs() { assert_suggests_correction("v’s", "vs"); } #[test] fn missing_apostrophe_childrens_suggests_childrens() { assert_suggests_correction("childrens", "children's"); } } ================================================ FILE: harper-core/src/spell/mutable_dictionary.rs ================================================ use super::{ FstDictionary, WordId, rune::{self, AttributeList, parse_word_list}, word_map::{WordMap, WordMapEntry}, }; use crate::edit_distance::edit_distance_min_alloc; use itertools::Itertools; use std::sync::Arc; use std::{borrow::Cow, sync::LazyLock}; use crate::{CharString, CharStringExt, DictWordMetadata}; use super::FuzzyMatchResult; use super::dictionary::Dictionary; /// A basic dictionary that allows words to be added after instantiating. /// This is useful for user and file dictionaries that may change at runtime. /// /// For immutable use-cases that require fuzzy lookups, such as the curated dictionary, prefer [`super::FstDictionary`], /// as it is much faster. /// /// To combine the contents of multiple dictionaries, regardless of type, use /// [`super::MergedDictionary`]. #[derive(Debug, Clone, Eq, PartialEq)] pub struct MutableDictionary { /// All English words word_map: WordMap, } /// The uncached function that is used to produce the original copy of the /// curated dictionary. fn uncached_inner_new() -> Arc { MutableDictionary::from_rune_files( include_str!("../../dictionary.dict"), include_str!("../../annotations.json"), ) .map(Arc::new) .unwrap_or_else(|e| panic!("Failed to load curated dictionary: {}", e)) } static DICT: LazyLock> = LazyLock::new(uncached_inner_new); impl MutableDictionary { pub fn new() -> Self { Self { word_map: WordMap::default(), } } pub fn from_rune_files(word_list: &str, attr_list: &str) -> Result { let word_list = parse_word_list(word_list)?; let attr_list = AttributeList::parse(attr_list)?; // There will be at _least_ this number of words let mut word_map = WordMap::default(); attr_list.expand_annotated_words(word_list, &mut word_map); Ok(Self { word_map }) } /// Create a dictionary from the curated dictionary included /// in the Harper binary. /// Consider using [`super::FstDictionary::curated()`] instead, as it is more performant for spellchecking. pub fn curated() -> Arc { (*DICT).clone() } /// Appends words to the dictionary. /// It is significantly faster to append many words with one call than many /// distinct calls to this function. pub fn extend_words( &mut self, words: impl IntoIterator, DictWordMetadata)>, ) { for (chars, metadata) in words.into_iter() { self.word_map.insert(WordMapEntry { metadata, canonical_spelling: chars.as_ref().into(), }) } } /// Append a single word to the dictionary. /// /// If you are appending many words, consider using [`Self::extend_words`] /// instead. pub fn append_word(&mut self, word: impl AsRef<[char]>, metadata: DictWordMetadata) { self.extend_words(std::iter::once((word.as_ref(), metadata))) } /// Append a single string to the dictionary. /// /// If you are appending many words, consider using [`Self::extend_words`] /// instead. pub fn append_word_str(&mut self, word: &str, metadata: DictWordMetadata) { self.append_word(word.chars().collect::>(), metadata) } } impl Default for MutableDictionary { fn default() -> Self { Self::new() } } impl Dictionary for MutableDictionary { fn get_word_metadata(&self, word: &[char]) -> Option> { self.word_map .get_with_chars(word) .map(|v| Cow::Borrowed(&v.metadata)) } fn contains_word(&self, word: &[char]) -> bool { self.word_map.contains_chars(word) } fn contains_word_str(&self, word: &str) -> bool { let chars: CharString = word.chars().collect(); self.contains_word(&chars) } fn get_word_metadata_str(&self, word: &str) -> Option> { let chars: CharString = word.chars().collect(); self.get_word_metadata(&chars) } fn get_correct_capitalization_of(&self, word: &[char]) -> Option<&'_ [char]> { self.word_map .get_with_chars(word) .map(|v| v.canonical_spelling.as_slice()) } /// Suggest a correct spelling for a given misspelled word. /// `Self::word` is assumed to be quite small (n < 100). /// `max_distance` relates to an optimization that allows the search /// algorithm to prune large portions of the search. fn fuzzy_match( &'_ self, word: &[char], max_distance: u8, max_results: usize, ) -> Vec> { let misspelled_charslice = word.normalized(); let misspelled_charslice_lower = misspelled_charslice.to_lower(); let shortest_word_len = if misspelled_charslice.len() <= max_distance as usize { 1 } else { misspelled_charslice.len() - max_distance as usize }; let longest_word_len = misspelled_charslice.len() + max_distance as usize; // Get candidate words let words_to_search = self .words_iter() .filter(|word| (shortest_word_len..=longest_word_len).contains(&word.len())); // Pre-allocated vectors for the edit-distance calculation // 53 is the length of the longest word. let mut buf_a = Vec::with_capacity(53); let mut buf_b = Vec::with_capacity(53); // Sort by edit-distance words_to_search .filter_map(|word| { let dist = edit_distance_min_alloc(&misspelled_charslice, word, &mut buf_a, &mut buf_b); let lowercase_dist = edit_distance_min_alloc( &misspelled_charslice_lower, word, &mut buf_a, &mut buf_b, ); let smaller_dist = dist.min(lowercase_dist); if smaller_dist <= max_distance { Some((word, smaller_dist)) } else { None } }) .sorted_unstable_by_key(|a| a.1) .take(max_results) .map(|(word, edit_distance)| FuzzyMatchResult { word, edit_distance, metadata: self.get_word_metadata(word).unwrap(), }) .collect() } fn fuzzy_match_str( &'_ self, word: &str, max_distance: u8, max_results: usize, ) -> Vec> { let word: Vec<_> = word.chars().collect(); self.fuzzy_match(&word, max_distance, max_results) } fn words_iter(&self) -> Box + Send + '_> { Box::new( self.word_map .iter() .map(|v| v.canonical_spelling.as_slice()), ) } fn word_count(&self) -> usize { self.word_map.len() } fn contains_exact_word(&self, word: &[char]) -> bool { let normalized = word.normalized(); if let Some(found) = self.word_map.get_with_chars(normalized.as_ref()) && found.canonical_spelling.as_ref() == normalized.as_ref() { return true; } false } fn contains_exact_word_str(&self, word: &str) -> bool { let word: CharString = word.chars().collect(); self.contains_exact_word(word.as_ref()) } fn get_word_from_id(&self, id: &WordId) -> Option<&[char]> { self.word_map.get(id).map(|w| w.canonical_spelling.as_ref()) } fn find_words_with_prefix(&self, prefix: &[char]) -> Vec> { let mut found = Vec::new(); for word in self.words_iter() { if let Some(item_prefix) = word.get(0..prefix.len()) && item_prefix == prefix { found.push(Cow::Borrowed(word)); } } found } fn find_words_with_common_prefix(&self, word: &[char]) -> Vec> { let mut found = Vec::new(); for item in self.words_iter() { if let Some(item_prefix) = word.get(0..item.len()) && item_prefix == item { found.push(Cow::Borrowed(item)); } } found } } impl From for FstDictionary { fn from(dict: MutableDictionary) -> Self { let words = dict .word_map .into_iter() .map(|entry| (entry.canonical_spelling, entry.metadata)) .collect(); FstDictionary::new(words) } } #[cfg(test)] mod tests { use std::borrow::Cow; use hashbrown::HashSet; use itertools::Itertools; use crate::spell::{Dictionary, MutableDictionary}; use crate::{DictWordMetadata, char_string::char_string}; #[test] fn curated_contains_no_duplicates() { let dict = MutableDictionary::curated(); assert!(dict.words_iter().all_unique()); } #[test] fn curated_matches_capitalized() { let dict = MutableDictionary::curated(); assert!(dict.contains_word_str("this")); assert!(dict.contains_word_str("This")); } // "This" is a determiner when used similarly to "the" // but when used alone it's a "demonstrative pronoun". // Harper previously wrongly classified it as a noun. #[test] fn this_is_determiner() { let dict = MutableDictionary::curated(); assert!(dict.get_word_metadata_str("this").unwrap().is_determiner()); assert!(dict.get_word_metadata_str("This").unwrap().is_determiner()); } #[test] fn several_is_quantifier() { let dict = MutableDictionary::curated(); assert!( dict.get_word_metadata_str("several") .unwrap() .is_quantifier() ); } #[test] fn few_is_quantifier() { let dict = MutableDictionary::curated(); assert!(dict.get_word_metadata_str("few").unwrap().is_quantifier()); } #[test] fn fewer_is_quantifier() { let dict = MutableDictionary::curated(); assert!(dict.get_word_metadata_str("fewer").unwrap().is_quantifier()); } #[test] fn than_is_conjunction() { let dict = MutableDictionary::curated(); assert!(dict.get_word_metadata_str("than").unwrap().is_conjunction()); assert!(dict.get_word_metadata_str("Than").unwrap().is_conjunction()); } #[test] fn herself_is_pronoun() { let dict = MutableDictionary::curated(); assert!(dict.get_word_metadata_str("herself").unwrap().is_pronoun()); assert!(dict.get_word_metadata_str("Herself").unwrap().is_pronoun()); } #[test] fn discussion_171() { let dict = MutableDictionary::curated(); assert!(dict.contains_word_str("natively")); } #[test] fn im_is_common() { let dict = MutableDictionary::curated(); assert!(dict.get_word_metadata_str("I'm").unwrap().common); } #[test] fn fuzzy_result_sorted_by_edit_distance() { let dict = MutableDictionary::curated(); let results = dict.fuzzy_match_str("hello", 3, 100); let is_sorted_by_dist = results .iter() .map(|fm| fm.edit_distance) .tuple_windows() .all(|(a, b)| a <= b); assert!(is_sorted_by_dist) } #[test] fn there_is_not_a_pronoun() { let dict = MutableDictionary::curated(); assert!(!dict.get_word_metadata_str("there").unwrap().is_nominal()); assert!(!dict.get_word_metadata_str("there").unwrap().is_pronoun()); } #[test] fn expanded_contains_giants() { assert!(MutableDictionary::curated().contains_word_str("giants")); } #[test] fn expanded_contains_deallocate() { assert!(MutableDictionary::curated().contains_word_str("deallocate")); } #[test] fn curated_contains_repo() { let dict = MutableDictionary::curated(); assert!(dict.contains_word_str("repo")); assert!(dict.contains_word_str("repos")); assert!(dict.contains_word_str("repo's")); } #[test] fn curated_contains_possessive_abandonment() { assert!( MutableDictionary::curated() .get_word_metadata_str("abandonment's") .unwrap() .is_possessive_noun() ) } #[test] fn has_is_not_a_nominal() { let dict = MutableDictionary::curated(); let has = dict.get_word_metadata_str("has"); assert!(has.is_some()); assert!(!has.unwrap().is_nominal()) } #[test] fn is_is_linking_verb() { let dict = MutableDictionary::curated(); let is = dict.get_word_metadata_str("is"); assert!(is.is_some()); assert!(is.unwrap().is_linking_verb()); } #[test] fn are_merged_attrs_same_as_spread_attrs() { let curated_attr_list = include_str!("../../annotations.json"); let merged = MutableDictionary::from_rune_files("1\nblork/DGS", curated_attr_list).unwrap(); let spread = MutableDictionary::from_rune_files("2\nblork/DG\nblork/S", curated_attr_list).unwrap(); assert_eq!( merged.word_map.into_iter().collect::>(), spread.word_map.into_iter().collect::>() ); } #[test] fn apart_is_not_noun() { let dict = MutableDictionary::curated(); assert!(!dict.get_word_metadata_str("apart").unwrap().is_noun()); } #[test] fn be_is_verb_lemma() { let dict = MutableDictionary::curated(); let is = dict.get_word_metadata_str("be"); assert!(is.is_some()); assert!(is.unwrap().is_verb_lemma()); } #[test] fn gets_prefixes_as_expected() { let mut dict = MutableDictionary::new(); dict.append_word_str("predict", DictWordMetadata::default()); dict.append_word_str("prelude", DictWordMetadata::default()); dict.append_word_str("preview", DictWordMetadata::default()); dict.append_word_str("dwight", DictWordMetadata::default()); let with_prefix = dict.find_words_with_prefix(char_string!("pre").as_slice()); assert_eq!(with_prefix.len(), 3); assert!(with_prefix.contains(&Cow::Owned(char_string!("predict").into_vec()))); assert!(with_prefix.contains(&Cow::Owned(char_string!("prelude").into_vec()))); assert!(with_prefix.contains(&Cow::Owned(char_string!("preview").into_vec()))); } #[test] fn gets_common_prefixes_as_expected() { let mut dict = MutableDictionary::new(); dict.append_word_str("pre", DictWordMetadata::default()); dict.append_word_str("prep", DictWordMetadata::default()); dict.append_word_str("dwight", DictWordMetadata::default()); let with_prefix = dict.find_words_with_common_prefix(char_string!("preposition").as_slice()); assert_eq!(with_prefix.len(), 2); assert!(with_prefix.contains(&Cow::Owned(char_string!("pre").into_vec()))); assert!(with_prefix.contains(&Cow::Owned(char_string!("prep").into_vec()))); } } ================================================ FILE: harper-core/src/spell/rune/affix_replacement.rs ================================================ use serde::{Deserialize, Serialize}; use super::Error; use super::matcher::Matcher; #[derive(Debug, Clone)] pub struct AffixReplacement { pub remove: Vec, pub add: Vec, pub condition: Matcher, } impl AffixReplacement { pub fn to_human_readable(&self) -> HumanReadableAffixReplacement { HumanReadableAffixReplacement { remove: self.remove.iter().collect(), add: self.add.iter().collect(), condition: self.condition.to_string(), } } } /// A version of [`AffixReplacement`] that can be serialized to JSON (or /// whatever) and maintain the nice Regex syntax of the inner [`Matcher`]. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct HumanReadableAffixReplacement { pub remove: String, pub add: String, pub condition: String, } impl HumanReadableAffixReplacement { pub fn to_normal(&self) -> Result { Ok(AffixReplacement { remove: self.remove.chars().collect(), add: self.add.chars().collect(), condition: Matcher::parse(&self.condition)?, }) } } ================================================ FILE: harper-core/src/spell/rune/attribute_list.rs ================================================ use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use smallvec::ToSmallVec; use super::super::word_map::{WordMap, WordMapEntry}; use super::Error; use super::affix_replacement::AffixReplacement; use super::expansion::Property; use super::expansion::{ AffixEntryKind, AffixEntryKind::{Prefix, Suffix}, Expansion, HumanReadableExpansion, }; use super::word_list::AnnotatedWord; use crate::dict_word_metadata_orthography::OrthFlags; use crate::spell::WordId; use crate::{CharString, DictWordMetadata, Span}; #[derive(Debug, Clone)] pub struct AttributeList { /// Key = Affix Flag affixes: HashMap, properties: HashMap, } impl AttributeList { fn into_human_readable(self) -> HumanReadableAttributeList { HumanReadableAttributeList { affixes: self .affixes .into_iter() .map(|(affix, exp)| (affix, exp.into_human_readable())) .collect(), properties: self.properties, } } pub fn parse(source: &str) -> Result { let human_readable: Result = serde_json::from_str(source); human_readable .map_err(Error::from) .and_then(|parsed| parsed.into_normal()) } /// Expand an [`AnnotatedWord`] into a list of full words, including itself. /// /// This function processes a word and its attributes to: /// 1. Apply properties to the base word /// 2. Generate derived words using affix rules /// 3. Handle conditional expansions /// 4. Manage cross-product expansions /// /// # Arguments /// * `word` - The word to expand, along with its attributes /// * `dest` - The WordMap to store the expanded words and their metadata pub fn expand_annotated_word(&self, annotated_word: AnnotatedWord, word_map: &mut WordMap) { // Pre-allocate space in the destination map for better performance word_map.reserve(annotated_word.annotations.len() + 1); // Initialize base metadata that will be applied to all derived forms let mut base_metadata = DictWordMetadata::default(); // Store metadata that should only be applied if certain conditions are met let orth_flags = OrthFlags::from_letters(&annotated_word.letters); base_metadata.orth_info = orth_flags; let mut conditional_expansion_metadata = Vec::new(); // First pass: Process all properties to build the base metadata // Properties directly modify the word's metadata (e.g., part of speech, usage) for attr in &annotated_word.annotations { let Some(property) = self.properties.get(attr) else { continue; }; base_metadata.merge(&property.metadata); } // Second pass: Process all affix rules to generate derived forms for attr in &annotated_word.annotations { // Skip if this attribute isn't an affix rule let Some(expansion) = self.affixes.get(attr) else { continue; }; // Add any base metadata from this affix rule base_metadata.merge(&expansion.base_metadata); // Track new words generated by this affix rule let mut new_words: HashMap = HashMap::new(); // Apply each replacement rule in this affix for replacement in &expansion.replacements { if let Some(replaced) = Self::apply_replacement(replacement, &annotated_word.letters, expansion.kind) { // Get or create metadata for this new word form let metadata = new_words.entry(replaced.clone()).or_default(); // Process each target for this replacement for target in &expansion.target { if let Some(condition) = &target.if_base { // Store conditional metadata to be applied later conditional_expansion_metadata.push(( replaced.clone(), target.metadata.clone(), condition.clone(), )); } else { // Apply target metadata immediately metadata.merge(&target.metadata); } } } } // Handle cross-product expansions (e.g., both prefix and suffix) if expansion.cross_product { // Collect attributes that should be applied to the opposite affix type let mut opposite_attributes = Vec::new(); // Add properties that should propagate to derived forms for attr in &annotated_word.annotations { let Some(property) = self.properties.get(attr) else { continue; }; if expansion.kind == Prefix || property.propagate { opposite_attributes.push(*attr); } } // Add affix attributes of the opposite type for attr in &annotated_word.annotations { let Some(attr_def) = self.affixes.get(attr) else { continue; }; // This checks if the current affix is of the opposite type if (attr_def.kind != Prefix) != (expansion.kind != Prefix) { opposite_attributes.push(*attr); } } // Recursively process each new word form for (new_word, metadata) in new_words { self.expand_annotated_word( AnnotatedWord { letters: new_word.clone(), annotations: opposite_attributes.clone(), }, word_map, ); // Update the metadata of the expanded word let target_metadata = word_map.get_metadata_mut_chars(&new_word).unwrap(); target_metadata.merge(&metadata); target_metadata.derived_from = Some(WordId::from_word_chars(&annotated_word.letters)); } } else { // Simple case: no cross-product expansion needed for (key, mut value) in new_words.into_iter() { value.derived_from = Some(WordId::from_word_chars(&annotated_word.letters)); if let Some(existing_metadata) = word_map.get_metadata_mut_chars(&key) { // Merge with existing metadata existing_metadata.merge(&value); } else { // Add new entry word_map.insert(WordMapEntry { canonical_spelling: key, metadata: value, }); } } } } // Finalize the metadata for the base word let mut full_metadata = base_metadata; // Merge with any existing metadata for this word if let Some(existing_metadata) = word_map.get_with_chars(&annotated_word.letters) { full_metadata.merge(&existing_metadata.metadata); } // Store the final metadata for the base word word_map.insert(WordMapEntry { metadata: full_metadata.clone(), canonical_spelling: annotated_word.letters, }); // Process any conditional expansions for (letters, metadata, condition) in conditional_expansion_metadata { // Check if the condition is satisfied by the base word's metadata let condition_satisfied = full_metadata.or(&condition) == full_metadata; if !condition_satisfied { continue; } // Apply the conditional metadata word_map .get_metadata_mut_chars(&letters) .unwrap() .merge(&metadata); } } /// Expand an iterator of annotated words into strings. /// Note that this does __not__ guarantee that produced words will be /// unique. pub fn expand_annotated_words( &self, words: impl IntoIterator, dest: &mut WordMap, ) { for word in words { self.expand_annotated_word(word, dest); } } fn apply_replacement( replacement: &AffixReplacement, letters: &[char], kind: AffixEntryKind, ) -> Option { if replacement.condition.len() > letters.len() { return None; } let target_span = if kind == Suffix { Span::new(letters.len() - replacement.condition.len(), letters.len()) } else { Span::new(0, replacement.condition.len()) }; let target_segment = target_span.get_content(letters); if replacement.condition.matches(target_segment) { let mut replaced_segment = letters.to_smallvec(); let mut remove: CharString = replacement.remove.to_smallvec(); if kind != Suffix { replaced_segment.reverse(); } else { remove.reverse(); } for c in &remove { let last = replaced_segment.last()?; if last == c { replaced_segment.pop(); } else { return None; } } let mut to_add = replacement.add.to_vec(); if kind != Suffix { to_add.reverse() } replaced_segment.extend(to_add); if kind != Suffix { replaced_segment.reverse(); } return Some(replaced_segment); } None } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct HumanReadableAttributeList { affixes: HashMap, properties: HashMap, } impl HumanReadableAttributeList { pub fn into_normal(self) -> Result { let mut affixes = HashMap::with_capacity(self.affixes.len()); for (affix, expansion) in self.affixes.into_iter() { affixes.insert(affix, expansion.into_normal()?); } Ok(AttributeList { affixes, properties: self.properties, }) } } #[cfg(test)] mod tests { use crate::spell::{Dictionary, FstDictionary}; #[test] fn proper_noun_property_propagates_to_plurals() { let fst_dict = FstDictionary::curated(); if let Some(vw_plural) = fst_dict.get_word_metadata_str("Volkswagens") { assert!(vw_plural.is_proper_noun()); } } #[test] fn proper_noun_propagates_to_possessives_2327() { if let Some(vw_possessive) = FstDictionary::curated().get_word_metadata_str("Volkswagen's") { assert!(vw_possessive.is_possessive_noun()); } } } ================================================ FILE: harper-core/src/spell/rune/error.rs ================================================ use super::matcher; use serde_json::Error as SerdeJsonError; #[derive(Debug, Clone, thiserror::Error)] pub enum Error { #[error("The provided file's item count was malformed.")] MalformedItemCount, #[error("Expected affix flag to be exactly one character.")] MultiCharacterFlag, #[error("Expected affix option to be a boolean.")] ExpectedBoolean, #[error("Expected affix option to be an unsigned integer.")] ExpectedUnsignedInteger, #[error("Could not parse because we encountered the end of the line.")] UnexpectedEndOfLine, #[error("Received malformed JSON at line {line}, column {column}: {message}")] MalformedJSON { message: String, line: usize, column: usize, }, #[error("An error occurred with a condition: {0}")] Matcher(#[from] matcher::Error), } impl From for Error { fn from(e: SerdeJsonError) -> Self { Error::MalformedJSON { message: e.to_string(), line: e.line(), column: e.column(), } } } ================================================ FILE: harper-core/src/spell/rune/expansion.rs ================================================ use serde::{Deserialize, Serialize}; use super::Error; use super::affix_replacement::{AffixReplacement, HumanReadableAffixReplacement}; use crate::DictWordMetadata; #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] pub enum AffixEntryKind { Suffix, Prefix, } /// Defines how a word can be transformed and what metadata to apply #[derive(Debug, Clone)] pub struct Expansion { /// Whether this is a prefix or suffix expansion pub kind: AffixEntryKind, /// If true, allows this expansion to be combined with others (e.g., both prefix and suffix) pub cross_product: bool, /// The replacement rules that define how to modify the word pub replacements: Vec, /// Metadata to apply to the transformed word pub target: Vec, /// Metadata to apply to the base word when this expansion is applied pub base_metadata: DictWordMetadata, } impl Expansion { pub fn into_human_readable(self) -> HumanReadableExpansion { HumanReadableExpansion { kind: self.kind, cross_product: self.cross_product, replacements: self .replacements .iter() .map(AffixReplacement::to_human_readable) .collect(), target: self.target, base_metadata: self.base_metadata, } } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MetadataExpansion { pub metadata: DictWordMetadata, pub if_base: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct HumanReadableExpansion { pub kind: AffixEntryKind, pub cross_product: bool, pub replacements: Vec, pub target: Vec, pub base_metadata: DictWordMetadata, } impl HumanReadableExpansion { pub fn into_normal(self) -> Result { let mut replacements = Vec::with_capacity(self.replacements.len()); for replacement in &self.replacements { replacements.push(replacement.to_normal()?); } Ok(Expansion { kind: self.kind, cross_product: self.cross_product, replacements, target: self.target, base_metadata: self.base_metadata, }) } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Property { /// Whether the metadata will propagate to all derived words. #[serde(default)] pub propagate: bool, /// The metadata applied to the word. pub metadata: DictWordMetadata, } ================================================ FILE: harper-core/src/spell/rune/matcher.rs ================================================ use std::fmt::{Display, Formatter}; use serde::{Deserialize, Serialize}; /// A simplified, Regex-like matcher. /// /// See the Hunspell documentation on affixes for more information. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Matcher { /// Position-based operators. operators: Vec, } impl Matcher { pub fn parse(source: &str) -> Result { let mut operators = Vec::new(); let char_indices: Vec<_> = source.char_indices().collect(); let mut char_idx = 0; while char_idx < char_indices.len() { let (idx, c) = char_indices[char_idx]; match c { '[' => { let close_idx = source[idx..] .find(']') .ok_or(Error::UnmatchedBracket { index: idx })?; let bracket_contents = &source[idx + 1..close_idx]; let invert = matches!(bracket_contents.chars().next(), Some('^')); if invert { let chars: Vec = bracket_contents.chars().skip(1).collect(); char_idx += chars.len() + 2; operators.push(Operator::MatchNone(chars)); } else { let chars: Vec = bracket_contents.chars().collect(); char_idx += chars.len() + 1; operators.push(Operator::MatchOne(chars)); } } '.' => operators.push(Operator::Any), _ => operators.push(Operator::Literal(c)), } char_idx += 1; } Ok(Self { operators }) } pub fn len(&self) -> usize { self.operators.len() } pub fn matches(&self, chars: &[char]) -> bool { if chars.len() != self.len() { return false; } for (c, op) in chars.iter().zip(self.operators.iter()) { if !op.matches(*c) { return false; } } true } } impl Display for Matcher { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { for op in &self.operators { match op { Operator::Literal(c) => write!(f, "{c}")?, Operator::MatchOne(cs) => { write!(f, "[")?; for c in cs { write!(f, "{c}")?; } write!(f, "]")?; } Operator::MatchNone(cs) => { write!(f, "[^")?; for c in cs { write!(f, "{c}")?; } write!(f, "]")?; } Operator::Any => write!(f, ".")?, } } Ok(()) } } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] enum Operator { Literal(char), MatchOne(Vec), MatchNone(Vec), Any, } impl Operator { fn matches(&self, a: char) -> bool { match self { Operator::Literal(b) => a == *b, Operator::MatchOne(b) => b.contains(&a), Operator::MatchNone(b) => !b.contains(&a), Operator::Any => true, } } } #[derive(Debug, Clone, Copy, thiserror::Error)] pub enum Error { #[error("Unmatched bracket at index: {index}")] UnmatchedBracket { index: usize }, } #[cfg(test)] mod tests { use super::{Matcher, Operator}; #[test] fn parses_simple() { let matcher = Matcher::parse("[^aeiou]a.s").unwrap(); assert_eq!( matcher.operators, vec![ Operator::MatchNone(vec!['a', 'e', 'i', 'o', 'u']), Operator::Literal('a'), Operator::Any, Operator::Literal('s') ] ) } #[test] fn matches_vowels() { let matcher = Matcher::parse("[aeiou]").unwrap(); assert!(matcher.matches(&['a'])); assert!(matcher.matches(&['e'])); assert!(matcher.matches(&['i'])); assert!(matcher.matches(&['o'])); assert!(matcher.matches(&['u'])); } #[test] fn round_trip() { let source = "[^aeiou]a.s"; let matcher = Matcher::parse(source).unwrap(); assert_eq!(matcher.to_string(), source); } } ================================================ FILE: harper-core/src/spell/rune/mod.rs ================================================ mod affix_replacement; mod attribute_list; mod error; mod expansion; mod matcher; pub mod word_list; pub use attribute_list::AttributeList; pub use error::Error; pub use self::word_list::parse_word_list; #[cfg(test)] mod tests { use hashbrown::HashSet; use serde_json::json; use std::sync::LazyLock; use super::super::word_map::WordMap; use super::word_list::parse_word_list; use crate::CharStringExt; use crate::spell::rune::AttributeList; pub const TEST_WORD_LIST: &str = "4\nhello\ntry/B\nwork/AB\nblank/"; pub const TEST_WORD_LIST_WITH_BLANK_LINES: &str = "4\n\nhello\n\ntry/B\nwork/AB\n\n\nblank/"; pub const TEST_WORD_LIST_WITH_FULL_LINE_COMMENTS: &str = "4\n#\nhello\n#with\ntry/B\nwork/AB\n# some\n# comments aded\nblank/"; pub const TEST_WORD_LIST_WITH_COMMENTS: &str = "4\nhello # a word without attributes\ntry/B \t # a word with empty attributes\nwork/AB\t #a word with one attribute\nblank/ #a word with two attributes"; pub static TEST_AFFIX_JSON: LazyLock = LazyLock::new(|| { json!({ "affixes": { "A": { "kind": "prefix", "cross_product": true, "replacements": [ { "remove": "", "add": "re", "condition": "." } ], "target": [], "base_metadata": {} }, "B": { "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "ed", "condition": "[^y]" }, { "remove": "y", "add": "ied", "condition": "y" } ], "target": [ { "metadata": { "noun": {} } } ], "base_metadata": {} } }, "properties": {} }) }); fn assert_expansion_results(test_word_list: &str, expected: Vec<&str>) { let words = parse_word_list(test_word_list).unwrap(); let attributes = AttributeList::parse(&TEST_AFFIX_JSON.to_string()).unwrap(); let mut expanded = WordMap::default(); attributes.expand_annotated_words(words, &mut expanded); let expanded: HashSet = expanded .into_iter() .map(|v| v.canonical_spelling.into_iter().collect()) .collect(); assert_eq!(expanded, expected.into_iter().map(|v| v.into()).collect()); } #[test] fn correctly_expands_test_files() { assert_expansion_results( TEST_WORD_LIST, vec![ "reworked", "rework", "tried", "try", "hello", "worked", "work", "blank", ], ); } #[test] fn correctly_expands_test_files_with_blank_lines() { assert_expansion_results( TEST_WORD_LIST_WITH_BLANK_LINES, vec![ "reworked", "rework", "tried", "try", "hello", "worked", "work", "blank", ], ); } fn correctly_expands_test_files_with_full_line_comments() { assert_expansion_results( TEST_WORD_LIST_WITH_FULL_LINE_COMMENTS, vec![ "reworked", "rework", "tried", "try", "hello", "worked", "work", "blank", ], ); } #[test] fn correctly_expands_test_files_with_comments() { let words = parse_word_list(TEST_WORD_LIST_WITH_COMMENTS).unwrap(); let attributes = AttributeList::parse(&TEST_AFFIX_JSON.to_string()).unwrap(); let mut expanded = WordMap::default(); attributes.expand_annotated_words(words, &mut expanded); let expanded: HashSet = expanded .into_iter() .map(|v| v.canonical_spelling.to_string()) .collect(); assert_eq!( expanded, vec![ "reworked", "rework", "tried", "try", "hello", "worked", "work", "blank" ] .into_iter() .map(|v| v.into()) .collect() ) } #[test] fn plural_giants() { let words = parse_word_list("1\ngiant/SM").unwrap(); let attributes = AttributeList::parse( &json!({ "affixes": { "S": { "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "y", "add": "ies", "condition": "[^aeiou]" }, { "remove": "", "add": "s", "condition": "[aeiou]y" }, { "remove": "", "add": "s", "condition": "[^sxzhy]" } ], "target": [ { "metadata": { "noun": { "is_plural": true } } } ], "base_metadata": { "noun": {} } }, "M": { "kind": "suffix", "cross_product": true, "replacements": [ { "remove": "", "add": "'s", "condition": "." } ], "target": [], "base_metadata": {} } }, "properties": {} }) .to_string(), ) .unwrap(); let mut expanded = WordMap::default(); attributes.expand_annotated_words(words, &mut expanded); let giant_data = expanded.get_with_str("giant").unwrap(); assert!(giant_data.metadata.is_noun()); let giants_data = expanded.get_with_str("giants").unwrap(); assert!(giants_data.metadata.is_plural_noun()); } } ================================================ FILE: harper-core/src/spell/rune/word_list.rs ================================================ use super::Error; use crate::CharString; #[derive(Debug, Clone)] pub struct AnnotatedWord { pub letters: CharString, pub annotations: Vec, } /// Parse a Rune word list /// /// Returns [`None`] if the given string is invalid. pub fn parse_word_list(source: &str) -> Result, Error> { let mut lines = source.lines(); let approx_item_count = lines .next() .ok_or(Error::MalformedItemCount)? .parse() .map_err(|_| Error::MalformedItemCount)?; let mut words = Vec::with_capacity(approx_item_count); for line in lines { // Ignore blank lines and full line comments. if line.is_empty() || line.starts_with('#') { continue; } let entry: &str; if let Some((entry_part, _comment_part)) = line.split_once('#') { entry = entry_part.trim_end(); } else { entry = line.trim_end(); } let word: &str; let attr: Option<&str>; if let Some((word_part, attr_part)) = entry.split_once('/') { word = word_part; attr = Some(attr_part); } else { word = entry; attr = None; } words.push(AnnotatedWord { letters: word.chars().collect(), annotations: attr.unwrap_or_default().chars().collect(), }) } Ok(words) } #[cfg(test)] mod tests { use super::super::tests::TEST_WORD_LIST; use super::parse_word_list; #[test] fn can_parse_test_file() { let list = parse_word_list(TEST_WORD_LIST).unwrap(); assert_eq!(list.last().unwrap().annotations.len(), 0); assert_eq!(list.len(), 4); } } ================================================ FILE: harper-core/src/spell/trie_dictionary.rs ================================================ use std::borrow::Cow; use std::sync::{Arc, LazyLock}; use trie_rs::Trie; use trie_rs::iter::{Keys, PrefixIter, SearchIter}; use crate::DictWordMetadata; use super::{Dictionary, FstDictionary, FuzzyMatchResult, WordId}; /// A [`Dictionary`] optimized for pre- and postfix search. /// Wraps another dictionary to implement other operations. pub struct TrieDictionary { trie: Trie, inner: D, } pub static DICT: LazyLock>>> = LazyLock::new(|| Arc::new(TrieDictionary::new(FstDictionary::curated()))); impl TrieDictionary> { /// Create a dictionary from the curated dictionary included /// in the Harper binary. pub fn curated() -> Arc { (*DICT).clone() } } impl TrieDictionary { pub fn new(inner: D) -> Self { let trie = Trie::from_iter(inner.words_iter()); Self { inner, trie } } } impl Dictionary for TrieDictionary { fn contains_word(&self, word: &[char]) -> bool { self.inner.contains_word(word) } fn contains_word_str(&self, word: &str) -> bool { self.inner.contains_word_str(word) } fn contains_exact_word(&self, word: &[char]) -> bool { self.inner.contains_exact_word(word) } fn contains_exact_word_str(&self, word: &str) -> bool { self.inner.contains_exact_word_str(word) } fn fuzzy_match( &'_ self, word: &[char], max_distance: u8, max_results: usize, ) -> Vec> { self.inner.fuzzy_match(word, max_distance, max_results) } fn fuzzy_match_str( &'_ self, word: &str, max_distance: u8, max_results: usize, ) -> Vec> { self.inner.fuzzy_match_str(word, max_distance, max_results) } fn get_correct_capitalization_of(&self, word: &[char]) -> Option<&'_ [char]> { self.inner.get_correct_capitalization_of(word) } fn get_word_metadata(&self, word: &[char]) -> Option> { self.inner.get_word_metadata(word) } fn get_word_metadata_str(&self, word: &str) -> Option> { self.inner.get_word_metadata_str(word) } fn words_iter(&self) -> Box + Send + '_> { self.inner.words_iter() } fn word_count(&self) -> usize { self.inner.word_count() } fn get_word_from_id(&self, id: &WordId) -> Option<&[char]> { self.inner.get_word_from_id(id) } fn find_words_with_prefix(&self, prefix: &[char]) -> Vec> { let results: Keys, _>> = self.trie.predictive_search(prefix); results.map(Cow::Owned).collect() } fn find_words_with_common_prefix(&self, word: &[char]) -> Vec> { let results: Keys, _>> = self.trie.common_prefix_search(word); results.map(Cow::Owned).collect() } } #[cfg(test)] mod tests { use std::borrow::Cow; use crate::DictWordMetadata; use crate::char_string::char_string; use crate::spell::MutableDictionary; use crate::spell::dictionary::Dictionary; use crate::spell::trie_dictionary::TrieDictionary; #[test] fn gets_prefixes_as_expected() { let mut inner = MutableDictionary::new(); inner.append_word_str("predict", DictWordMetadata::default()); inner.append_word_str("prelude", DictWordMetadata::default()); inner.append_word_str("preview", DictWordMetadata::default()); inner.append_word_str("dwight", DictWordMetadata::default()); let dict = TrieDictionary::new(inner); let with_prefix = dict.find_words_with_prefix(char_string!("pre").as_slice()); assert_eq!(with_prefix.len(), 3); assert!(with_prefix.contains(&Cow::Owned(char_string!("predict").into_vec()))); assert!(with_prefix.contains(&Cow::Owned(char_string!("prelude").into_vec()))); assert!(with_prefix.contains(&Cow::Owned(char_string!("preview").into_vec()))); } #[test] fn gets_common_prefixes_as_expected() { let mut inner = MutableDictionary::new(); inner.append_word_str("pre", DictWordMetadata::default()); inner.append_word_str("prep", DictWordMetadata::default()); inner.append_word_str("dwight", DictWordMetadata::default()); let dict = TrieDictionary::new(inner); let with_prefix = dict.find_words_with_common_prefix(char_string!("preposition").as_slice()); assert_eq!(with_prefix.len(), 2); assert!(with_prefix.contains(&Cow::Owned(char_string!("pre").into_vec()))); assert!(with_prefix.contains(&Cow::Owned(char_string!("prep").into_vec()))); } } ================================================ FILE: harper-core/src/spell/word_id.rs ================================================ use std::hash::BuildHasher; use foldhash::fast::FixedState; use serde::{Deserialize, Serialize}; use crate::{CharString, CharStringExt}; /// An identifier for a particular word. /// /// It works by hashing the word it represents, normalized to lowercase. /// It is meant for situations where you need to refer to a word (or a collection of words), /// without storing all of accompanying data (like spelling or metadata). #[derive(Hash, Copy, Clone, PartialEq, Eq, PartialOrd, Debug, Serialize, Deserialize)] pub struct WordId { hash: u64, } impl WordId { /// Create a Word ID from a character slice. pub fn from_word_chars(chars: impl AsRef<[char]>) -> Self { let normalized = chars.as_ref().normalized(); let lower = normalized.to_lower(); let hash = FixedState::default().hash_one(lower); Self { hash } } /// Create a word ID from a string. /// Requires allocation, so use sparingly. pub fn from_word_str(text: impl AsRef) -> Self { let chars: CharString = text.as_ref().chars().collect(); Self::from_word_chars(chars) } } ================================================ FILE: harper-core/src/spell/word_map.rs ================================================ use hashbrown::{HashMap, hash_map::IntoValues}; use crate::{CharString, DictWordMetadata}; use super::WordId; /// The underlying data structure for the `MutableDictionary`. #[derive(Debug, Clone, Eq, PartialEq, Default)] pub struct WordMap { inner: HashMap, } #[derive(Debug, Clone, Eq, PartialEq, Hash)] pub struct WordMapEntry { pub metadata: DictWordMetadata, pub canonical_spelling: CharString, } impl WordMap { /// Get an entry from the word map using raw chars. pub fn get_with_str(&self, string: &str) -> Option<&WordMapEntry> { let chars: CharString = string.chars().collect(); let id = WordId::from_word_chars(chars); self.get(&id) } pub fn contains_str(&self, string: &str) -> bool { self.get_with_str(string).is_some() } pub fn contains_chars(&self, chars: impl AsRef<[char]>) -> bool { self.get_with_chars(chars).is_some() } pub fn contains(&self, id: &WordId) -> bool { self.get(id).is_some() } /// Get an entry from the word map using raw chars. pub fn get_with_chars(&self, chars: impl AsRef<[char]>) -> Option<&WordMapEntry> { let id = WordId::from_word_chars(chars); self.get(&id) } /// Get an entry from the word map using a word identifier. pub fn get(&self, id: &WordId) -> Option<&WordMapEntry> { self.inner.get(id) } /// Borrow a word's metadata mutably pub fn get_metadata_mut_chars( &mut self, chars: impl AsRef<[char]>, ) -> Option<&mut DictWordMetadata> { let id = WordId::from_word_chars(chars); self.get_metadata_mut(&id) } /// Borrow a word's metadata mutably pub fn get_metadata_mut(&mut self, id: &WordId) -> Option<&mut DictWordMetadata> { self.inner.get_mut(id).map(|v| &mut v.metadata) } pub fn insert(&mut self, entry: WordMapEntry) { let id = WordId::from_word_chars(&entry.canonical_spelling); self.inner.insert(id, entry); } /// Reserves capacity for at least `additional` more elements to be inserted /// in the `WordMap`. The collection may reserve more space to avoid /// frequent reallocations. pub fn reserve(&mut self, additional: usize) { self.inner.reserve(additional); } /// Iterate through the canonical spellings of the words in the map. pub fn iter(&self) -> impl Iterator { self.inner.values() } pub fn len(&self) -> usize { self.inner.len() } pub fn with_capacity(capacity: usize) -> Self { Self { inner: HashMap::with_capacity(capacity), } } } impl IntoIterator for WordMap { type Item = WordMapEntry; fn into_iter(self) -> Self::IntoIter { self.inner.into_values() } type IntoIter = IntoValues; } ================================================ FILE: harper-core/src/sync.rs ================================================ #[cfg(not(feature = "concurrent"))] pub use std::rc::Rc as Lrc; #[cfg(feature = "concurrent")] pub use std::sync::Arc as Lrc; #[cfg(not(feature = "concurrent"))] pub trait LSend {} #[cfg(not(feature = "concurrent"))] impl LSend for T {} #[cfg(feature = "concurrent")] pub trait LSend: Send + Sync {} #[cfg(feature = "concurrent")] impl LSend for T {} ================================================ FILE: harper-core/src/thesaurus_helper.rs ================================================ use crate::{ TokenKind, linting::{Suggestion, SuggestionCollectionExt}, }; #[cfg(feature = "thesaurus")] use crate::spell::{Dictionary, FstDictionary}; /// Gets synonyms for a provided word. /// /// If the `thesaurus` feature is not enabled, will always return [`None`]. #[allow(unreachable_code)] pub fn get_synonyms(_word: &str) -> Option> { #[cfg(feature = "thesaurus")] { return harper_thesaurus::thesaurus().get_synonyms(_word); } None } /// Gets synonyms for a provided word, sorted by the following means: /// - The level of difference between the provided token and that of the synonym. /// - How often the synonym is used. /// /// If the `thesaurus` feature is not enabled, will always return [`None`]. #[allow(unreachable_code)] pub fn get_synonyms_sorted(_word: &str, _token: &TokenKind) -> Option> { #[cfg(feature = "thesaurus")] { // Sorting by frequency. let mut syns = harper_thesaurus::thesaurus().get_synonyms_freq_sorted(_word)?; // Sorting by TokenKind difference. if let Some(Some(word_meta)) = _token.as_word() { let dict = FstDictionary::curated(); syns.sort_by_key(|syn| { if let Some(syn_meta) = dict.get_word_metadata_str(syn) { word_meta.difference(&syn_meta) } else { u32::MAX } }); } return Some(syns); } None } /// Helper method to provide synonym replacement suggestions for the provided word. /// /// The output is sorted as in [`get_synonyms_sorted()`], which attempts to place more relevant /// results first. /// /// If the `thesaurus` feature isn't enabled or the word cannot be found in the thesaurus, will /// return an empty iterator. pub fn get_synonym_replacement_suggestions( word: &str, token: &TokenKind, ) -> impl Iterator { get_synonyms_sorted(word, token) .unwrap_or_default() .to_replace_suggestions(word.chars()) } ================================================ FILE: harper-core/src/title_case.rs ================================================ use std::borrow::Cow; use std::sync::LazyLock; use crate::Lrc; use crate::Token; use crate::TokenKind; use hashbrown::HashSet; use crate::Punctuation; use crate::spell::Dictionary; use crate::{CharStringExt, Document, TokenStringExt, parsers::Parser}; /// A helper function for [`make_title_case`] that uses Strings instead of char buffers. pub fn make_title_case_str(source: &str, parser: &impl Parser, dict: &impl Dictionary) -> String { let source: Vec = source.chars().collect(); make_title_case_chars(Lrc::new(source), parser, dict).to_string() } // Make a given string [title case](https://en.wikipedia.org/wiki/Title_case) following the Chicago Manual of Style. pub fn make_title_case_chars( source: Lrc>, parser: &impl Parser, dict: &impl Dictionary, ) -> Vec { let document = Document::new_from_vec(source.clone(), parser, dict); make_title_case(document.get_tokens(), source.as_slice(), dict) } pub fn try_make_title_case( toks: &[Token], source: &[char], dict: &impl Dictionary, ) -> Option> { if toks.is_empty() { return None; } let start_index = toks.first().unwrap().span.start; let relevant_text = toks.span().unwrap().get_content(source); let mut word_likes = toks.iter_word_like_indices().peekable(); let mut output = None; let mut previous_word_index = 0; // Checks if the output if the provided char is different from the source. If so, it will // set the output. The goal here is to avoid allocating if no edits must be made. let mut set_output_char = |idx: usize, new_char: char| { if output .as_ref() .is_some_and(|o: &Vec| o[idx] != new_char) || relevant_text[idx] != new_char { output.get_or_insert_with(|| relevant_text.to_vec())[idx] = new_char; } }; let mut seen_alphabetic_word = false; while let Some(word_idx) = word_likes.next() { let word = &toks[word_idx]; let is_alphabetic_word = word .span .get_content(source) .iter() .any(|c| c.is_alphabetic()); if let Some(Some(metadata)) = word.kind.as_word() && metadata.is_proper_noun() { // Replace it with the dictionary entry verbatim. let orig_text = word.span.get_content(source); if let Some(correct_caps) = dict.get_correct_capitalization_of(orig_text) { // It should match the dictionary verbatim for (i, c) in correct_caps.iter().enumerate() { if c.is_alphabetic() { set_output_char(word.span.start - start_index + i, *c); } } } }; // Capitalize the first word following a colon to match Chicago style. let is_after_colon = toks[previous_word_index..word_idx] .iter() .any(|tok| matches!(tok.kind, TokenKind::Punctuation(Punctuation::Colon))); let is_first_alphabetic_word = is_alphabetic_word && !seen_alphabetic_word; let should_capitalize = is_after_colon || should_capitalize_token(word, source) || is_first_alphabetic_word || word_likes.peek().is_none(); if should_capitalize { set_output_char( word.span.start - start_index, relevant_text[word.span.start - start_index].to_ascii_uppercase(), ); } else { // The whole word should be lowercase. for i in word.span { set_output_char( i - start_index, relevant_text[i - start_index].to_ascii_lowercase(), ); } } if is_alphabetic_word { seen_alphabetic_word = true; } previous_word_index = word_idx } if let Some(output) = &output && output.as_slice() == relevant_text { return None; } output } pub fn make_title_case(toks: &[Token], source: &[char], dict: &impl Dictionary) -> Vec { try_make_title_case(toks, source, dict) .unwrap_or_else(|| toks.span().unwrap_or_default().get_content(source).to_vec()) } /// Determines whether a token should be capitalized. /// Is not responsible for capitalization requirements that are dependent on token position. fn should_capitalize_token(tok: &Token, source: &[char]) -> bool { match &tok.kind { TokenKind::Word(Some(metadata)) => { // Only specific conjunctions are not capitalized. static SPECIAL_CONJUNCTIONS: LazyLock>> = LazyLock::new(|| { ["and", "but", "for", "or", "nor", "as"] .iter() .map(|v| v.chars().collect()) .collect() }); static SPECIAL_ARTICLES: LazyLock>> = LazyLock::new(|| { ["a", "an", "the"] .iter() .map(|v| v.chars().collect()) .collect() }); let chars = tok.span.get_content(source); let chars_lower = chars.to_lower(); let metadata = Cow::Borrowed(metadata); let is_short_preposition = metadata.preposition && tok.span.len() <= 4; if chars_lower.as_ref() == ['a', 'l', 'l'] { return true; } !is_short_preposition && !SPECIAL_CONJUNCTIONS.contains(chars_lower.as_ref()) && !SPECIAL_ARTICLES.contains(chars_lower.as_ref()) } _ => true, } } #[cfg(test)] mod tests { use quickcheck::TestResult; use quickcheck_macros::quickcheck; use super::make_title_case_str; use crate::parsers::{Markdown, PlainEnglish}; use crate::spell::FstDictionary; #[test] fn normal() { assert_eq!( make_title_case_str("this is a test", &PlainEnglish, &FstDictionary::curated()), "This Is a Test" ) } #[test] fn complex() { assert_eq!( make_title_case_str( "the first and last words should be capitalized, even if it is \"the\"", &PlainEnglish, &FstDictionary::curated() ), "The First and Last Words Should Be Capitalized, Even If It Is \"The\"" ) } /// Check that "about" remains uppercase #[test] fn about_uppercase_with_numbers() { assert_eq!( make_title_case_str("0 about 0", &PlainEnglish, &FstDictionary::curated()), "0 About 0" ) } #[test] fn pipe_does_not_cause_crash() { assert_eq!( make_title_case_str("|", &Markdown::default(), &FstDictionary::curated()), "|" ) } #[test] fn a_paragraph_does_not_cause_crash() { assert_eq!( make_title_case_str("A\n", &Markdown::default(), &FstDictionary::curated()), "A" ) } #[test] fn tab_a_becomes_upcase() { assert_eq!( make_title_case_str("\ta", &PlainEnglish, &FstDictionary::curated()), "\tA" ) } #[test] fn fixes_video_press() { assert_eq!( make_title_case_str("videopress", &PlainEnglish, &FstDictionary::curated()), "VideoPress" ) } #[quickcheck] fn a_stays_lowercase(prefix: String, postfix: String) -> TestResult { // There must be words other than the `a`. if prefix.chars().any(|c| !c.is_ascii_alphabetic()) || prefix.is_empty() || postfix.chars().any(|c| !c.is_ascii_alphabetic()) || postfix.is_empty() { return TestResult::discard(); } let title_case: Vec<_> = make_title_case_str( &format!("{prefix} a {postfix}"), &Markdown::default(), &FstDictionary::curated(), ) .chars() .collect(); TestResult::from_bool(title_case[prefix.chars().count() + 1] == 'a') } #[quickcheck] fn about_becomes_uppercase(prefix: String, postfix: String) -> TestResult { // There must be words other than the `a`. if prefix.chars().any(|c| !c.is_ascii_alphanumeric()) || prefix.is_empty() || postfix.chars().any(|c| !c.is_ascii_alphanumeric()) || postfix.is_empty() { return TestResult::discard(); } let title_case: Vec<_> = make_title_case_str( &format!("{prefix} about {postfix}"), &Markdown::default(), &FstDictionary::curated(), ) .chars() .collect(); TestResult::from_bool(title_case[prefix.chars().count() + 1] == 'A') } #[quickcheck] fn first_word_is_upcase(text: String) -> TestResult { let title_case: Vec<_> = make_title_case_str(&text, &PlainEnglish, &FstDictionary::curated()) .chars() .collect(); if let Some(first) = title_case.first() { if first.is_ascii_alphabetic() { TestResult::from_bool(first.is_ascii_uppercase()) } else { TestResult::discard() } } else { TestResult::discard() } } #[test] fn united_states() { assert_eq!( make_title_case_str("united states", &PlainEnglish, &FstDictionary::curated()), "United States" ) } #[test] fn keeps_decimal() { assert_eq!( make_title_case_str( "harper turns 1.0 today", &PlainEnglish, &FstDictionary::curated() ), "Harper Turns 1.0 Today" ) } #[test] fn fixes_odd_capitalized_proper_nouns() { assert_eq!( make_title_case_str( "i spoke at wordcamp u.s. in 2025", &PlainEnglish, &FstDictionary::curated() ), "I Spoke at WordCamp U.S. in 2025", ); } #[test] fn fixes_your_correctly() { assert_eq!( make_title_case_str( "it is not your friend", &PlainEnglish, &FstDictionary::curated() ), "It Is Not Your Friend", ); } #[test] fn handles_old_man_and_the_sea() { assert_eq!( make_title_case_str( "the old man and the sea", &PlainEnglish, &FstDictionary::curated() ), "The Old Man and the Sea", ); } #[test] fn handles_great_story_with_subtitle() { assert_eq!( make_title_case_str( "the great story: a tale of two cities", &PlainEnglish, &FstDictionary::curated() ), "The Great Story: A Tale of Two Cities", ); } #[test] fn handles_lantern_and_moths() { assert_eq!( make_title_case_str( "lantern flickered; moths began their worship", &PlainEnglish, &FstDictionary::curated() ), "Lantern Flickered; Moths Began Their Worship", ); } #[test] fn handles_static_with_ghosts() { assert_eq!( make_title_case_str( "static filled the room with ghosts", &PlainEnglish, &FstDictionary::curated() ), "Static Filled the Room with Ghosts", ); } #[test] fn handles_glass_trembled_before_thunder() { assert_eq!( make_title_case_str( "glass trembled before thunder arrived.", &PlainEnglish, &FstDictionary::curated() ), "Glass Trembled Before Thunder Arrived.", ); } #[test] fn handles_hepatitis_b_shots() { assert_eq!( make_title_case_str( "an end to hepatitis b shots for all newborns", &PlainEnglish, &FstDictionary::curated() ), "An End to Hepatitis B Shots for All Newborns", ); } #[test] fn handles_trump_approval_rating() { assert_eq!( make_title_case_str( "trump's approval rating dips as views of his handling of the economy sour", &PlainEnglish, &FstDictionary::curated() ), "Trump's Approval Rating Dips as Views of His Handling of the Economy Sour", ); } #[test] fn handles_last_door() { assert_eq!( make_title_case_str("the last door", &PlainEnglish, &FstDictionary::curated()), "The Last Door", ); } #[test] fn handles_midnight_river() { assert_eq!( make_title_case_str("midnight river", &PlainEnglish, &FstDictionary::curated()), "Midnight River", ); } #[test] fn handles_a_quiet_room() { assert_eq!( make_title_case_str("a quiet room", &PlainEnglish, &FstDictionary::curated()), "A Quiet Room", ); } #[test] fn handles_broken_map() { assert_eq!( make_title_case_str("broken map", &PlainEnglish, &FstDictionary::curated()), "Broken Map", ); } #[test] fn handles_fire_in_autumn() { assert_eq!( make_title_case_str("fire in autumn", &PlainEnglish, &FstDictionary::curated()), "Fire in Autumn", ); } #[test] fn handles_hidden_path() { assert_eq!( make_title_case_str("the hidden path", &PlainEnglish, &FstDictionary::curated()), "The Hidden Path", ); } #[test] fn handles_under_blue_skies() { assert_eq!( make_title_case_str("under blue skies", &PlainEnglish, &FstDictionary::curated()), "Under Blue Skies", ); } #[test] fn handles_lost_and_found() { assert_eq!( make_title_case_str("lost and found", &PlainEnglish, &FstDictionary::curated()), "Lost and Found", ); } #[test] fn handles_silent_watcher() { assert_eq!( make_title_case_str( "the silent watcher", &PlainEnglish, &FstDictionary::curated() ), "The Silent Watcher", ); } #[test] fn handles_winter_road() { assert_eq!( make_title_case_str("winter road", &PlainEnglish, &FstDictionary::curated()), "Winter Road", ); } #[test] fn maintains_same_apostrophe_type() { assert_eq!( make_title_case_str( "Alice’s Adventures in Wonderland", &PlainEnglish, &FstDictionary::curated() ), "Alice’s Adventures in Wonderland", ); } #[test] fn doesnt_lowercase_this_in_github_template_title() { assert_eq!( make_title_case_str( "# How Has This Been Tested?", &PlainEnglish, &FstDictionary::curated() ), "# How Has This Been Tested?", ); } } ================================================ FILE: harper-core/src/token.rs ================================================ use serde::{Deserialize, Serialize}; use crate::{FatToken, Span, TokenKind}; /// Represents a semantic, parsed component of a [`Document`](crate::Document). #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)] pub struct Token { /// The characters the token represents. pub span: Span, /// The parsed value. pub kind: TokenKind, } impl Token { pub fn new(span: Span, kind: TokenKind) -> Self { Self { span, kind } } /// Convert to an allocated [`FatToken`]. pub fn to_fat(&self, source: &[char]) -> FatToken { let content = self.span.get_content(source).to_vec(); FatToken { content, kind: self.kind.clone(), } } } #[cfg(test)] mod tests { use crate::{ TokenStringExt, parsers::{Parser, PlainEnglish}, }; #[test] fn parses_sentences_correctly() { let text = "There were three little pigs. They built three little homes."; let chars: Vec = text.chars().collect(); let toks = PlainEnglish.parse(&chars); let mut sentence_strs = vec![]; for sentence in toks.iter_sentences() { if let Some(span) = sentence.span() { sentence_strs.push(span.get_content_string(&chars)); } } assert_eq!( sentence_strs, vec![ "There were three little pigs.", " They built three little homes." ] ) } } ================================================ FILE: harper-core/src/token_kind.rs ================================================ use harper_brill::UPOS; use is_macro::Is; use serde::{Deserialize, Serialize}; use crate::{ DictWordMetadata, Number, Punctuation, Quote, TokenKind::Word, dict_word_metadata::Person, }; /// Generate wrapper code to pass a function call to the inner [`DictWordMetadata`], /// if the token is indeed a word, while also emitting method-level documentation. macro_rules! delegate_to_metadata { ($($method:ident),* $(,)?) => { $( #[doc = concat!( "Delegates to [`DictWordMetadata::", stringify!($method), "`] when this token is a word.\n\n", "Returns `false` if the token is not a word." )] pub fn $method(&self) -> bool { let Word(Some(metadata)) = self else { return false; }; metadata.$method() } )* }; } /// The parsed value of a [`Token`](crate::Token). /// Has a variety of queries available. /// If there is a query missing, it may be easy to implement by just calling the /// `delegate_to_metadata` macro. #[derive(Debug, Is, Clone, Serialize, Deserialize, Default, PartialOrd, Hash, Eq, PartialEq)] #[serde(tag = "kind", content = "value")] pub enum TokenKind { /// `None` if the word does not exist in the dictionary. Word(Option), Punctuation(Punctuation), Decade, Number(Number), /// A sequence of " " spaces. Space(usize), /// A sequence of "\n" newlines Newline(usize), EmailAddress, Url, Hostname, /// A special token used for things like inline code blocks that should be /// ignored by all linters. #[default] Unlintable, ParagraphBreak, Regexish, HeadingStart, } impl TokenKind { // DictWord metadata delegation methods grouped by part of speech delegate_to_metadata! { // Nominal methods (nouns and pronouns) is_nominal, is_noun, is_pronoun, is_proper_noun, is_singular_nominal, is_plural_nominal, is_possessive_nominal, is_non_plural_nominal, is_singular_noun, is_plural_noun, is_non_plural_noun, is_non_possessive_noun, is_countable_noun, is_non_countable_noun, is_mass_noun, is_mass_noun_only, is_non_mass_noun, is_singular_pronoun, is_plural_pronoun, is_non_plural_pronoun, is_reflexive_pronoun, is_personal_pronoun, is_first_person_singular_pronoun, is_first_person_plural_pronoun, is_second_person_pronoun, is_third_person_pronoun, is_third_person_singular_pronoun, is_third_person_plural_pronoun, is_subject_pronoun, is_object_pronoun, is_possessive_noun, // Note: possessive pronouns are: mine, ours, yours, his, hers, its, theirs is_possessive_pronoun, // Verb methods is_verb, is_auxiliary_verb, is_linking_verb, is_verb_lemma, is_verb_past_form, is_verb_simple_past_form, is_verb_past_participle_form, is_verb_progressive_form, is_verb_third_person_singular_present_form, // Adjective methods is_adjective, is_comparative_adjective, is_superlative_adjective, is_positive_adjective, // Adverb methods is_adverb, is_manner_adverb, is_frequency_adverb, is_degree_adverb, // Determiner methods is_determiner, is_demonstrative_determiner, is_possessive_determiner, is_quantifier, is_non_quantifier_determiner, is_non_demonstrative_determiner, // Conjunction methods is_conjunction, // Generic word methods is_swear, is_likely_homograph, // Orthography methods is_lowercase, is_titlecase, is_allcaps, is_lower_camel, is_upper_camel, is_apostrophized, is_roman_numerals } pub fn get_pronoun_person(&self) -> Option { let Word(Some(metadata)) = self else { return None; }; metadata.get_person() } // DictWord metadata delegation methods not generated by macro pub fn is_preposition(&self) -> bool { let Word(Some(metadata)) = self else { return false; }; metadata.preposition } // Generic word is-methods pub fn is_common_word(&self) -> bool { let Word(Some(metadata)) = self else { return true; }; metadata.common } /// Checks whether the token is a member of a nominal phrase. pub fn is_np_member(&self) -> bool { let Word(Some(metadata)) = self else { return false; }; metadata.np_member.unwrap_or(false) } /// Checks whether a word token is out-of-vocabulary (not found in the dictionary). /// /// Returns `true` if the token is a word that was not found in the dictionary, /// `false` if the token is a word found in the dictionary or is not a word token. pub fn is_oov(&self) -> bool { matches!(self, TokenKind::Word(None)) } // Number is-methods pub fn is_cardinal_number(&self) -> bool { matches!(self, TokenKind::Number(Number { suffix: None, .. })) } pub fn is_ordinal_number(&self) -> bool { matches!( self, TokenKind::Number(Number { suffix: Some(_), .. }) ) } // Punctuation and symbol is-methods pub fn is_open_square(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::OpenSquare)) } pub fn is_close_square(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::CloseSquare)) } pub fn is_less_than(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::LessThan)) } pub fn is_greater_than(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::GreaterThan)) } pub fn is_open_round(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::OpenRound)) } pub fn is_close_round(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::CloseRound)) } pub fn is_pipe(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Pipe)) } pub fn is_currency(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Currency(..))) } pub fn is_ellipsis(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Ellipsis)) } // AKA 'minus' pub fn is_hyphen(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Hyphen)) } pub fn is_plus(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Plus)) } pub fn is_quote(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Quote(_))) } pub fn is_apostrophe(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Apostrophe)) } pub fn is_period(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Period)) } pub fn is_at(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::At)) } pub fn is_comma(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Comma)) } pub fn is_semicolon(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Semicolon)) } pub fn is_acute(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Acute)) } pub fn is_ampersand(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Ampersand)) } pub fn is_backslash(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Backslash)) } pub fn is_slash(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::ForwardSlash)) } pub fn is_percent(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Percent)) } // Miscellaneous is-methods /// Checks whether a token is word-like--meaning it is more complex than punctuation and can /// hold semantic meaning in the way a word does. pub fn is_word_like(&self) -> bool { matches!( self, TokenKind::Word(..) | TokenKind::EmailAddress | TokenKind::Hostname | TokenKind::Decade | TokenKind::Number(..) ) } pub(crate) fn is_chunk_terminator(&self) -> bool { if self.is_sentence_terminator() { return true; } match self { TokenKind::Punctuation(punct) => { matches!( punct, Punctuation::Comma | Punctuation::Quote { .. } | Punctuation::Colon ) } _ => false, } } pub fn is_sentence_terminator(&self) -> bool { match self { TokenKind::Punctuation(punct) => [ Punctuation::Period, Punctuation::Bang, Punctuation::Question, ] .contains(punct), TokenKind::ParagraphBreak => true, _ => false, } } /// Used by `crate::parsers::CollapseIdentifiers` /// TODO: Separate this into two functions and add OR functionality to /// pattern matching pub fn is_case_separator(&self) -> bool { matches!(self, TokenKind::Punctuation(Punctuation::Underscore)) || matches!(self, TokenKind::Punctuation(Punctuation::Hyphen)) } /// Checks whether the token is whitespace. pub fn is_whitespace(&self) -> bool { matches!(self, TokenKind::Space(_) | TokenKind::Newline(_)) } pub fn is_upos(&self, upos: UPOS) -> bool { let Some(Some(meta)) = self.as_word() else { return false; }; meta.pos_tag == Some(upos) } // Miscellaneous non-is methods /// Checks that `self` is the same enum variant as `other`, regardless of /// whether the inner metadata is also equal. pub fn matches_variant_of(&self, other: &Self) -> bool { self.with_default_data() == other.with_default_data() } /// Produces a copy of `self` with any inner data replaced with its default /// value. Useful for making comparisons on just the variant of the /// enum. pub fn with_default_data(&self) -> Self { match self { TokenKind::Word(_) => TokenKind::Word(Default::default()), TokenKind::Punctuation(_) => TokenKind::Punctuation(Default::default()), TokenKind::Number(..) => TokenKind::Number(Default::default()), TokenKind::Space(_) => TokenKind::Space(Default::default()), TokenKind::Newline(_) => TokenKind::Newline(Default::default()), _ => self.clone(), } } /// Construct a [`TokenKind::Word`] with no metadata. pub fn blank_word() -> Self { Self::Word(None) } // Punctuation and symbol non-is methods pub fn as_mut_quote(&mut self) -> Option<&mut Quote> { self.as_mut_punctuation()?.as_mut_quote() } pub fn as_quote(&self) -> Option<&Quote> { self.as_punctuation()?.as_quote() } } #[cfg(test)] mod tests { use crate::Document; #[test] fn car_is_singular_noun() { let doc = Document::new_plain_english_curated("car"); let tk = &doc.tokens().next().unwrap().kind; assert!(tk.is_singular_noun()); } #[test] fn traffic_is_mass_noun_only() { let doc = Document::new_plain_english_curated("traffic"); let tk = &doc.tokens().next().unwrap().kind; assert!(tk.is_mass_noun_only()); } #[test] fn equipment_is_mass_noun() { let doc = Document::new_plain_english_curated("equipment"); let tk = &doc.tokens().next().unwrap().kind; assert!(tk.is_mass_noun()); } #[test] fn equipment_is_non_countable_noun() { let doc = Document::new_plain_english_curated("equipment"); let tk = &doc.tokens().next().unwrap().kind; assert!(tk.is_non_countable_noun()); } #[test] fn equipment_isnt_countable_noun() { let doc = Document::new_plain_english_curated("equipment"); let tk = &doc.tokens().next().unwrap().kind; assert!(!tk.is_countable_noun()); } #[test] fn oov_word_is_oov() { let doc = Document::new_plain_english_curated("nonexistentword"); let tk = &doc.tokens().next().unwrap().kind; assert!(tk.is_oov()); } #[test] fn known_word_is_not_oov() { let doc = Document::new_plain_english_curated("car"); let tk = &doc.tokens().next().unwrap().kind; assert!(!tk.is_oov()); } #[test] fn non_word_tokens_are_not_oov() { let doc = Document::new_plain_english_curated("Hello, world!"); let tokens: Vec<_> = doc.tokens().collect(); // Comma should not be OOV assert!(!tokens[1].kind.is_oov()); // Exclamation mark should not be OOV assert!(!tokens[3].kind.is_oov()); } } ================================================ FILE: harper-core/src/token_string_ext.rs ================================================ use crate::{Span, Token}; use itertools::Itertools; use paste::paste; macro_rules! create_decl_for { ($thing:ident) => { paste! { fn [< first_ $thing >](&self) -> Option<&Token>; fn [< last_ $thing >](&self) -> Option<&Token>; fn [< last_ $thing _index >](&self) -> Option; fn [](&self) -> impl DoubleEndedIterator + '_; fn [](&self) -> impl Iterator + '_; } }; } macro_rules! create_fns_for { ($thing:ident) => { paste! { fn [< first_ $thing >](&self) -> Option<&Token> { self.iter().find(|v| v.kind.[]()) } fn [< last_ $thing >](&self) -> Option<&Token> { self.iter().rev().find(|v| v.kind.[]()) } fn [< last_ $thing _index >](&self) -> Option { self.iter().rev().position(|v| v.kind.[]()).map(|i| self.len() - i - 1) } fn [](&self) -> impl DoubleEndedIterator + '_ { self.iter() .enumerate() .filter(|(_, t)| t.kind.[]()) .map(|(i, _)| i) } fn [](&self) -> impl Iterator + '_ { self.[]().map(|i| &self[i]) } } }; } mod private { use crate::{Document, Token}; pub trait Sealed {} impl Sealed for [Token] {} impl Sealed for Document {} } /// Extension methods for [`Token`] sequences that make them easier to wrangle and query. pub trait TokenStringExt: private::Sealed { fn first_sentence_word(&self) -> Option<&Token>; fn first_non_whitespace(&self) -> Option<&Token>; /// Grab the span that represents the beginning of the first element and the /// end of the last element. fn span(&self) -> Option>; create_decl_for!(adjective); create_decl_for!(apostrophe); create_decl_for!(at); create_decl_for!(comma); create_decl_for!(conjunction); create_decl_for!(chunk_terminator); create_decl_for!(currency); create_decl_for!(ellipsis); create_decl_for!(hostname); create_decl_for!(likely_homograph); create_decl_for!(number); create_decl_for!(noun); create_decl_for!(paragraph_break); create_decl_for!(pipe); create_decl_for!(preposition); create_decl_for!(punctuation); create_decl_for!(quote); create_decl_for!(sentence_terminator); create_decl_for!(space); create_decl_for!(unlintable); create_decl_for!(verb); create_decl_for!(word); create_decl_for!(word_like); create_decl_for!(heading_start); /// Get a reference to a token by index, with negative numbers counting from the end. /// /// # Examples /// ``` /// # use harper_core::{Token, TokenStringExt, parsers::{Parser, PlainEnglish}}; /// # fn main() { /// let source = "The cat sat on the mat.".chars().collect::>(); /// let tokens = PlainEnglish.parse(&source); /// assert_eq!(tokens.get_rel(0).unwrap().span.get_content_string(&source), "The"); /// assert_eq!(tokens.get_rel(1).unwrap().kind.is_whitespace(), true); /// assert_eq!(tokens.get_rel(-1).unwrap().kind.is_punctuation(), true); /// assert_eq!(tokens.get_rel(-2).unwrap().span.get_content_string(&source), "mat"); /// # } /// ``` /// /// # Returns /// /// * `Some(&Token)` - If the index is in bounds /// * `None` - If the index is out of bounds fn get_rel(&self, index: isize) -> Option<&Token> where Self: AsRef<[Token]>, { let slice = self.as_ref(); let len = slice.len() as isize; if index >= len || -index > len { return None; } let idx = if index >= 0 { index } else { len + index } as usize; slice.get(idx) } /// Get a slice of tokens using relative indices. /// /// # Examples /// ``` /// # use harper_core::{Token, TokenStringExt, parsers::{Parser, PlainEnglish}}; /// # fn main() { /// let source = "The cat sat on the mat.".chars().collect::>(); /// let tokens = PlainEnglish.parse(&source); /// assert_eq!(tokens.get_rel_slice(0, 2).unwrap().span().unwrap().get_content_string(&source), "The cat"); /// assert_eq!(tokens.get_rel_slice(-3, -1).unwrap().span().unwrap().get_content_string(&source), " mat."); /// # } /// ``` fn get_rel_slice(&self, rel_start: isize, inclusive_end: isize) -> Option<&[Token]> where Self: AsRef<[Token]>, { let slice = self.as_ref(); let len = slice.len() as isize; // Convert relative indices to absolute indices let start_idx = if rel_start >= 0 { rel_start } else { len + rel_start } as usize; let end_idx_plus_one = if inclusive_end >= 0 { inclusive_end + 1 // +1 to make end exclusive } else { len + inclusive_end + 1 } as usize; // Check bounds if start_idx >= slice.len() || end_idx_plus_one > slice.len() || start_idx >= end_idx_plus_one { return None; } Some(&slice[start_idx..end_idx_plus_one]) } fn iter_linking_verb_indices(&self) -> impl Iterator + '_; fn iter_linking_verbs(&self) -> impl Iterator + '_; /// Iterate over chunks. /// /// For example, the following sentence contains two chunks separated by a /// comma: /// /// ```text /// Here is an example, it is short. /// ``` fn iter_chunks(&self) -> impl Iterator + '_; /// Get an iterator over token slices that represent the individual /// paragraphs in a document. fn iter_paragraphs(&self) -> impl Iterator + '_; /// Get an iterator over token slices that represent headings. /// /// A heading begins with a [`TokenKind::HeadingStart`](crate::TokenKind::HeadingStart) token and ends with /// the next [`TokenKind::ParagraphBreak`](crate::TokenKind::ParagraphBreak). fn iter_headings(&self) -> impl Iterator + '_; /// Get an iterator over token slices that represent the individual /// sentences in a document. fn iter_sentences(&self) -> impl Iterator + '_; /// Get an iterator over mutable token slices that represent the individual /// sentences in a document. fn iter_sentences_mut(&mut self) -> impl Iterator + '_; } impl TokenStringExt for [Token] { create_fns_for!(adjective); create_fns_for!(apostrophe); create_fns_for!(at); create_fns_for!(chunk_terminator); create_fns_for!(comma); create_fns_for!(conjunction); create_fns_for!(currency); create_fns_for!(ellipsis); create_fns_for!(hostname); create_fns_for!(likely_homograph); create_fns_for!(noun); create_fns_for!(number); create_fns_for!(paragraph_break); create_fns_for!(pipe); create_fns_for!(preposition); create_fns_for!(punctuation); create_fns_for!(quote); create_fns_for!(sentence_terminator); create_fns_for!(space); create_fns_for!(unlintable); create_fns_for!(verb); create_fns_for!(word_like); create_fns_for!(word); create_fns_for!(heading_start); fn first_non_whitespace(&self) -> Option<&Token> { self.iter().find(|t| !t.kind.is_whitespace()) } fn first_sentence_word(&self) -> Option<&Token> { let (w_idx, word) = self.iter().find_position(|v| v.kind.is_word())?; let Some(u_idx) = self.iter().position(|v| v.kind.is_unlintable()) else { return Some(word); }; if w_idx < u_idx { Some(word) } else { None } } fn span(&self) -> Option> { let min_max = self .iter() .flat_map(|v| [v.span.start, v.span.end].into_iter()) .minmax(); match min_max { itertools::MinMaxResult::NoElements => None, itertools::MinMaxResult::OneElement(min) => Some(Span::new(min, min)), itertools::MinMaxResult::MinMax(min, max) => Some(Span::new(min, max)), } } fn iter_linking_verb_indices(&self) -> impl Iterator + '_ { self.iter_word_indices().filter(|idx| { let word = &self[*idx]; let Some(Some(meta)) = word.kind.as_word() else { return false; }; meta.is_linking_verb() }) } fn iter_linking_verbs(&self) -> impl Iterator + '_ { self.iter_linking_verb_indices().map(|idx| &self[idx]) } fn iter_chunks(&self) -> impl Iterator + '_ { self.split_inclusive(|tok| tok.kind.is_chunk_terminator()) } fn iter_paragraphs(&self) -> impl Iterator + '_ { self.split_inclusive(|tok| tok.kind.is_paragraph_break()) } fn iter_headings(&self) -> impl Iterator + '_ { self.iter_heading_start_indices().map(|start| { let end = self[start..] .iter() .position(|t| t.kind.is_paragraph_break()) .unwrap_or(self[start..].len() - 1); &self[start..=start + end] }) } fn iter_sentences(&self) -> impl Iterator + '_ { self.split_inclusive(|token| token.kind.is_sentence_terminator()) } fn iter_sentences_mut(&mut self) -> impl Iterator + '_ { struct SentIter<'a> { rem: &'a mut [Token], } impl<'a> Iterator for SentIter<'a> { type Item = &'a mut [Token]; fn next(&mut self) -> Option { if self.rem.is_empty() { return None; } let split = self .rem .iter() .position(|t| t.kind.is_sentence_terminator()) .map(|i| i + 1) .unwrap_or(self.rem.len()); let tmp = core::mem::take(&mut self.rem); let (sent, rest) = tmp.split_at_mut(split); self.rem = rest; Some(sent) } } SentIter { rem: self } } } ================================================ FILE: harper-core/src/vec_ext.rs ================================================ use std::collections::VecDeque; mod private { pub trait Sealed {} impl Sealed for Vec {} } /// Extensions on top of [`Vec`] that make certain common operations easier. pub trait VecExt: private::Sealed { /// Removes a list of indices from a Vector. /// Assumes that the provided indices are already in sorted order. fn remove_indices(&mut self, to_remove: VecDeque); } impl VecExt for Vec { fn remove_indices(&mut self, mut to_remove: VecDeque) { let mut i = 0; let mut next_remove = to_remove.pop_front(); self.retain(|_| { let keep = if let Some(next_remove) = next_remove { i != next_remove } else { true }; if !keep { next_remove = to_remove.pop_front(); } i += 1; keep }); } } #[cfg(test)] mod tests { use std::collections::VecDeque; use crate::vec_ext::VecExt; #[test] fn removes_requested_indices() { let mut data: Vec = (0..10).collect(); let remove: VecDeque = vec![1, 4, 6].into_iter().collect(); data.remove_indices(remove); assert_eq!(data, vec![0, 2, 3, 5, 7, 8, 9]) } } ================================================ FILE: harper-core/src/weir/ast.rs ================================================ use harper_brill::UPOS; use hashbrown::HashMap; use is_macro::Is; use itertools::Itertools; use crate::expr::{Expr, Filter, FirstMatchOf, SequenceExpr, UnlessStep}; use crate::patterns::{AnyPattern, DerivedFrom, UPOSSet, WhitespacePattern, Word}; use crate::{CharString, CharStringExt, Lrc, Punctuation, Token}; use super::Error; #[derive(Debug, Clone, Eq, PartialEq)] pub struct Ast { pub stmts: Vec, } impl Ast { /// Construct a new abstract syntax tree from individual statements. pub fn new(stmts: Vec) -> Self { Self { stmts } } /// Get the value of a variable from the last time it was set. pub fn get_variable_value(&self, var_name: &str) -> Option<&'_ AstVariable> { for stmt in self.stmts.iter().rev() { if let AstStmtNode::DeclareVariable { name, value } = stmt && name == var_name { return Some(value); } } None } /// Get the value of an expression from the last time it was set. pub fn get_expr(&self, expr_name: &str) -> Option<&'_ AstExprNode> { for stmt in self.stmts.iter().rev() { if let AstStmtNode::SetExpr { name, value } = stmt && name == expr_name { return Some(value); } } None } /// Iterate through all unique variable values, from the last time they were set. pub fn iter_variable_values(&self) -> impl Iterator { self.stmts .iter() .rev() .filter_map(|n| match n { AstStmtNode::DeclareVariable { name, value } => Some((name.as_str(), value)), _ => None, }) .unique_by(|(n, _)| *n) } /// Iterate through all the tests in the tree, starting with the one first declared in the /// tree. pub fn iter_tests(&self) -> impl Iterator { self.stmts.iter().filter_map(|stmt| match stmt { AstStmtNode::Test { expect, to_be } => Some((expect.as_str(), to_be.as_str())), AstStmtNode::Allows { value } => Some((value.as_str(), value.as_str())), _ => None, }) } /// Iterate through all the expressions in the tree, starting with the one first declared in the /// tree. pub fn iter_exprs(&self) -> impl Iterator { self.stmts.iter().filter_map(|stmt| { if let AstStmtNode::SetExpr { name, value } = stmt { Some((name.as_str(), value)) } else { None } }) } } /// A node that represents an expression that can be used to search through natural language. #[derive(Debug, Clone, Is, Eq, PartialEq)] pub enum AstExprNode { Whitespace, /// A progressive verb. Progressive, UPOSSet(Vec), Word(CharString), DerivativeOf(CharString), Punctuation(Punctuation), Not(Box), Seq(Vec), Arr(Vec), Filter(Vec), ExprRef(CharString), Anything, } impl AstExprNode { /// Create an actual expression that fulfills the pattern matching contract defined by this tree. /// /// Requires a map of all expressions currently in the context. pub fn to_expr( &self, ctx_exprs: &HashMap>>, ) -> Result, Error> { match self { AstExprNode::Anything => Ok(Box::new(AnyPattern)), AstExprNode::Progressive => Ok(Box::new(|tok: &Token, _: &[char]| { tok.kind.is_verb_progressive_form() })), AstExprNode::UPOSSet(upos) => Ok(Box::new(UPOSSet::new(upos))), AstExprNode::Whitespace => Ok(Box::new(WhitespacePattern)), AstExprNode::Word(word) => Ok(Box::new(Word::from_chars(word))), AstExprNode::DerivativeOf(word) => Ok(Box::new(DerivedFrom::new_from_chars(word))), AstExprNode::Not(ast_node) => Ok(Box::new(UnlessStep::new( ast_node.to_expr(ctx_exprs)?, |_tok: &Token, _: &[char]| true, )) as Box), AstExprNode::Seq(children) => { let mut expr = SequenceExpr::default(); for node in children { expr = expr.then_boxed(node.to_expr(ctx_exprs)?); } Ok(Box::new(expr)) } AstExprNode::Arr(children) => { let mut expr = FirstMatchOf::default(); for node in children { expr.add_boxed(node.to_expr(ctx_exprs)?); } Ok(Box::new(expr)) } AstExprNode::Filter(children) => Ok(Box::new(Filter::new( children .iter() .map(|n| n.to_expr(ctx_exprs)) .process_results(|iter| iter.collect())?, ))), AstExprNode::Punctuation(punct) => { let punct = *punct; Ok(Box::new(move |tok: &Token, _: &[char]| { tok.kind.as_punctuation().is_some_and(|p| *p == punct) })) } AstExprNode::ExprRef(name) => ctx_exprs .get(&name.to_string()) .map(|e| Box::new(e.clone()) as Box) .ok_or_else(|| Error::UnableToResolveExpr(name.to_string())), } } } /// A variable defined by the `let` keyword. #[derive(Debug, Clone, Is, Eq, PartialEq)] pub enum AstVariable { String(String), Array(Vec), } impl AstVariable { pub fn create_string(val: impl ToString) -> Self { Self::String(val.to_string()) } } /// An AST node that represents a top-level statement. #[derive(Debug, Clone, Is, Eq, PartialEq)] pub enum AstStmtNode { DeclareVariable { name: String, value: AstVariable }, SetExpr { name: String, value: AstExprNode }, Comment(String), Test { expect: String, to_be: String }, Allows { value: String }, } impl AstStmtNode { pub fn create_declare_variable(name: impl ToString, value: AstVariable) -> Self { Self::DeclareVariable { name: name.to_string(), value, } } pub fn create_set_expr(name: impl ToString, value: AstExprNode) -> Self { Self::SetExpr { name: name.to_string(), value, } } pub fn create_test(expect: impl ToString, to_be: impl ToString) -> Self { Self::Test { expect: expect.to_string(), to_be: to_be.to_string(), } } pub fn create_allow_test(value: impl ToString) -> Self { Self::Allows { value: value.to_string(), } } } ================================================ FILE: harper-core/src/weir/error.rs ================================================ use thiserror::Error; #[derive(Debug, Error, Eq, PartialEq)] pub enum Error { #[error("Encountered a token that is unsupported by the parser.")] UnsupportedToken(String), #[error("Reached the end of the input token stream prematurely.")] EndOfInput, #[error("Unmatched brace")] UnmatchedBrace, #[error("Expected a comma here.")] ExpectedComma, #[error("Expected a valid keyword. Got: {0}")] UnexpectedToken(String), #[error("Expected a value to be defined.")] ExpectedVariableUndefined, #[error("Invalid LintKind")] InvalidLintKind, #[error("Invalid Replacement Strategy")] InvalidReplacementStrategy, #[error("Expected a variable type other than the one provided.")] ExpectedDifferentVariableType, #[error("Unable to resolve expression reference {0}")] UnableToResolveExpr(String), } ================================================ FILE: harper-core/src/weir/mod.rs ================================================ //! Weir is a programming language for finding errors in natural language. //! See our [main documentation](https://writewithharper.com/docs/weir) for more details. mod ast; mod error; mod optimize; mod parsing; use std::collections::VecDeque; use std::str::FromStr; use std::sync::Arc; pub use error::Error; use hashbrown::{HashMap, HashSet}; use is_macro::Is; use parsing::{parse_expr_str, parse_str}; use strum_macros::{AsRefStr, EnumString}; use crate::expr::Expr; use crate::linting::{Chunk, ExprLinter, Lint, LintKind, Linter, Suggestion}; use crate::parsers::Markdown; use crate::spell::FstDictionary; use crate::{Document, Lrc, Token, TokenStringExt}; use self::ast::{Ast, AstVariable}; pub(crate) fn weir_expr_to_expr(weir_code: &str) -> Result, Error> { let ast = parse_expr_str(weir_code, true)?; ast.to_expr(&HashMap::new()) } #[derive(Debug, Is, EnumString, AsRefStr)] enum ReplacementStrategy { MatchCase, Exact, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct TestResult { pub expected: String, pub got: String, } pub struct WeirLinter { expr: Lrc>, description: String, message: String, strategy: ReplacementStrategy, replacements: Vec, lint_kind: LintKind, ast: Arc, } impl WeirLinter { pub fn new(weir_code: &str) -> Result { let ast = parse_str(weir_code, true)?; let main_expr_name = "main"; let description_name = "description"; let message_name = "message"; let lint_kind_name = "kind"; let replacement_name = "becomes"; let replacement_strat_name = "strategy"; let resolved = resolve_exprs(&ast)?; let expr = resolved .get(main_expr_name) .ok_or(Error::ExpectedVariableUndefined)?; let description = ast .get_variable_value(description_name) .ok_or(Error::ExpectedVariableUndefined)? .as_string() .ok_or(Error::ExpectedDifferentVariableType)? .to_owned(); let message = ast .get_variable_value(message_name) .ok_or(Error::ExpectedVariableUndefined)? .as_string() .ok_or(Error::ExpectedDifferentVariableType)? .to_owned(); let replacement_val = ast .get_variable_value(replacement_name) .ok_or(Error::ExpectedVariableUndefined)?; let replacements = match replacement_val { AstVariable::String(s) => vec![s.to_owned()], AstVariable::Array(arr) => { let mut out = Vec::with_capacity(arr.len()); for item in arr.iter().map(|v| { v.as_string() .cloned() .ok_or(Error::ExpectedDifferentVariableType) }) { let item = item?; out.push(item); } out } }; let replacement_strat_var = ast.get_variable_value(replacement_strat_name); let replacement_strat = if let Some(replacement_strat) = replacement_strat_var { let str = replacement_strat .as_string() .ok_or(Error::ExpectedDifferentVariableType)?; ReplacementStrategy::from_str(str) .ok() .ok_or(Error::InvalidReplacementStrategy)? } else { ReplacementStrategy::MatchCase }; let lint_kind_var = ast.get_variable_value(lint_kind_name); let lint_kind = if let Some(lint_kind) = lint_kind_var { let str = lint_kind .as_string() .ok_or(Error::ExpectedDifferentVariableType)?; LintKind::from_string_key(str).ok_or(Error::InvalidLintKind)? } else { LintKind::Miscellaneous }; let linter = WeirLinter { strategy: replacement_strat, ast, expr: expr.clone(), lint_kind, description, message, replacements, }; Ok(linter) } /// Counts the total number of tests defined. pub fn count_tests(&self) -> usize { self.ast.iter_tests().count() } /// Runs the tests defined in the source code, returning any failing results. pub fn run_tests(&mut self) -> Vec { fn apply_nth_suggestion(text: &str, lint: &Lint, n: usize) -> Option { let suggestion = lint.suggestions.get(n)?; let mut text_chars: Vec = text.chars().collect(); suggestion.apply(lint.span, &mut text_chars); Some(text_chars.iter().collect()) } fn transform_top3_to_expected( text: &str, expected: &str, linter: &mut impl Linter, ) -> Option { let mut queue: VecDeque<(String, usize)> = VecDeque::new(); let mut seen: HashSet = HashSet::new(); queue.push_back((text.to_string(), 0)); seen.insert(text.to_string()); while let Some((current, depth)) = queue.pop_front() { if current == expected { return Some(current); } if depth >= 100 { continue; } let doc = Document::new_from_vec( current.chars().collect::>().into(), &Markdown::default(), &FstDictionary::curated(), ); let lints = linter.lint(&doc); if let Some(lint) = lints.first() { for i in 0..3 { if let Some(next) = apply_nth_suggestion(¤t, lint, i) && seen.insert(next.clone()) { queue.push_back((next, depth + 1)); } } } } None } fn transform_nth_str(text: &str, linter: &mut impl Linter, n: usize) -> String { let mut text_chars: Vec = text.chars().collect(); let mut iter_count = 0; loop { let test = Document::new_from_vec( text_chars.clone().into(), &Markdown::default(), &FstDictionary::curated(), ); let lints = linter.lint(&test); if let Some(lint) = lints.first() { if let Some(suggestion) = lint.suggestions.get(n) { suggestion.apply(lint.span, &mut text_chars); } else { break; } } else { break; } iter_count += 1; if iter_count == 100 { break; } } text_chars.iter().collect() } fn lint_count(text: &str, linter: &mut impl Linter) -> usize { let document = Document::new_from_vec( text.chars().collect::>().into(), &Markdown::default(), &FstDictionary::curated(), ); linter.lint(&document).len() } let mut results = Vec::new(); let tests: Vec<(String, String)> = self .ast .iter_tests() .map(|(text, expected)| (text.to_string(), expected.to_string())) .collect(); for (text, expected) in tests { let matched = transform_top3_to_expected(&text, &expected, self); match matched { Some(result) => { let remaining_lints = lint_count(&result, self); if remaining_lints != 0 { results.push(TestResult { expected: expected.to_string(), got: result, }); } } None => results.push(TestResult { expected: expected.to_string(), got: transform_nth_str(&text, self, 0), }), } } results } } impl ExprLinter for WeirLinter { type Unit = Chunk; fn expr(&self) -> &dyn Expr { &self.expr } fn match_to_lint(&self, matched_tokens: &[Token], source: &[char]) -> Option { let span = matched_tokens.span()?; let orig = span.get_content(source); let suggestions = match self.strategy { ReplacementStrategy::MatchCase => self .replacements .iter() .map(|s| Suggestion::replace_with_match_case(s.chars().collect(), orig)) .collect(), ReplacementStrategy::Exact => self .replacements .iter() .map(|r| Suggestion::ReplaceWith(r.chars().collect())) .collect(), }; Some(Lint { span, lint_kind: self.lint_kind, suggestions, message: self.message.to_owned(), priority: 31, }) } fn description(&self) -> &str { &self.description } } fn resolve_exprs(ast: &Ast) -> Result>>, Error> { let mut resolved_exprs = HashMap::new(); for (name, val) in ast.iter_exprs() { let expr = val.to_expr(&resolved_exprs)?; resolved_exprs.insert(name.to_owned(), Lrc::new(expr)); } Ok(resolved_exprs) } #[cfg(test)] pub mod tests { use quickcheck_macros::quickcheck; use crate::weir::Error; use super::{TestResult, WeirLinter}; #[track_caller] pub fn assert_passes_all(linter: &mut WeirLinter) { assert_eq!(Vec::::new(), linter.run_tests()); } #[test] fn simple_right_click_linter() { let source = r#" expr main <([right, middle, left] $click), ( )> let message "Hyphenate this mouse command" let description "Hyphenates right-click style mouse commands." let kind "Punctuation" let becomes "-" test "Right click the icon." "Right-click the icon." test "Please right click on the link." "Please right-click on the link." test "They right clicked the submit button." "They right-clicked the submit button." test "Right clicking the item highlights it." "Right-clicking the item highlights it." test "Right clicks are tracked in the log." "Right-clicks are tracked in the log." test "He RIGHT CLICKED the file." "He RIGHT-CLICKED the file." test "Left click the checkbox." "Left-click the checkbox." test "Middle click to open in a new tab." "Middle-click to open in a new tab." allows "This test contains the correct version of right-click and therefore shouldn't error." "#; let mut linter = WeirLinter::new(source).unwrap(); assert_passes_all(&mut linter); assert_eq!(9, linter.count_tests()); } #[test] fn g_suite() { let source = r#" expr main [(G [Suite, Suit]), (Google Apps for Work)] let message "Use the updated brand." let description "`G Suite` or `Google Apps for Work` is now called `Google Workspace`" let kind "Miscellaneous" let becomes "Google Workspace" let strategy "Exact" test "We migrated from G Suite last year." "We migrated from Google Workspace last year." test "This account is still labeled as Google Apps for Work." "This account is still labeled as Google Workspace." test "The pricing page mentions G Suit for legacy plans." "The pricing page mentions Google Workspace for legacy plans." test "New customers sign up for Google Workspace." "New customers sign up for Google Workspace." allows "This test contains the correct version of Google Workspace and therefore shouldn't error." "#; let mut linter = WeirLinter::new(source).unwrap(); assert_passes_all(&mut linter); assert_eq!(5, linter.count_tests()); } #[test] fn g_suite_with_refs() { let source = r#" expr a (G [Suite, Suit]) expr b (Google Apps For Work) expr incorrect [@a, @b] expr main @incorrect let message "Use the updated brand." let description "`G Suite` or `Google Apps for Work` is now called `Google Workspace`" let kind "Miscellaneous" let becomes "Google Workspace" let strategy "Exact" test "We migrated from G Suite last year." "We migrated from Google Workspace last year." test "This account is still labeled as Google Apps for Work." "This account is still labeled as Google Workspace." test "The pricing page mentions G Suit for legacy plans." "The pricing page mentions Google Workspace for legacy plans." test "New customers sign up for Google Workspace." "New customers sign up for Google Workspace." "#; let mut linter = WeirLinter::new(source).unwrap(); assert_passes_all(&mut linter); assert_eq!(4, linter.count_tests()); } #[test] fn fails_on_unresolved_expr() { let source = r#" expr main @missing let message "" let description "" let kind "Miscellaneous" let becomes "" let strategy "Exact" "#; let res = WeirLinter::new(source); assert_eq!( res.err().unwrap(), Error::UnableToResolveExpr("missing".to_string()) ) } #[test] fn wildcard() { let source = r#" expr main <(NOUN * NOUN), (* NOUN), *> let message "" let description "" let kind "Miscellaneous" let becomes "" let strategy "Exact" test "I like trees and plants of all kinds" "I like trees plants of all kinds" test "homework tempts teachers" "homework teachers" "#; let mut linter = WeirLinter::new(source).unwrap(); assert_passes_all(&mut linter); assert_eq!(2, linter.count_tests()); } #[test] fn dashes() { let source = r#" expr main -- let message "" let description "" let kind "Miscellaneous" let becomes "-" let strategy "Exact" test "This--and--that" "This-and-that" allows "this-and-that" "#; let mut linter = WeirLinter::new(source).unwrap(); assert_passes_all(&mut linter); assert_eq!(2, linter.count_tests()); } #[test] fn fails_on_ignore_test() { let source = r#" expr main test let message "" let description "" let kind "Miscellaneous" let becomes "-" let strategy "Exact" allows "test" "#; let mut linter = WeirLinter::new(source).unwrap(); assert_eq!(linter.run_tests().len(), 1) } #[test] fn errors_properly_with_missing_expr() { let source = "expr main"; let res = WeirLinter::new(source); assert_eq!(res.err(), Some(Error::ExpectedVariableUndefined)) } #[quickcheck] fn does_not_panic(s: String) { let _ = WeirLinter::new(s.as_str()); } } ================================================ FILE: harper-core/src/weir/optimize.rs ================================================ use super::ast::{AstExprNode, AstStmtNode}; /// Optimizes the AST to use fewer nodes. /// Returns whether an edit was made. pub fn optimize(stmts: &mut Vec) -> bool { let mut edit = false; for stmt in stmts { if let AstStmtNode::SetExpr { value, .. } = stmt && optimize_expr(value) { edit = true; } } edit } /// Optimizes the AST of the expression to use fewer nodes. /// Returns whether an edit was made. pub fn optimize_expr(ast: &mut AstExprNode) -> bool { let mut edit = false; match ast { AstExprNode::Not(child) => return optimize_expr(child), AstExprNode::Seq(children) => { if children.len() == 1 { *ast = children.pop().unwrap(); edit = true; } else { children.iter_mut().for_each(|child| { if optimize_expr(child) { edit = true; } }); } } AstExprNode::Arr(children) => { if children.len() == 1 { *ast = children.pop().unwrap(); edit = true; } else if !children.is_empty() && children.iter().all(|n| n.is_upos_set()) { *ast = AstExprNode::UPOSSet( children .iter_mut() .flat_map(|n| n.as_upos_set().unwrap()) .copied() .collect(), ) } else { children.iter_mut().for_each(|child| { if optimize_expr(child) { edit = true; } }); } } _ => (), } edit } ================================================ FILE: harper-core/src/weir/parsing/expr.rs ================================================ use std::str::FromStr; use harper_brill::UPOS; use crate::{CharString, Currency, Punctuation, Token, TokenKind}; use super::{ AstExprNode, Error, FoundNode, lex, locate_matching_brace, optimize_expr, parse_collection, }; /// Parse a raw expression string. pub fn parse_expr_str(weir_code: &str, use_optimizer: bool) -> Result { let chars: CharString = weir_code.chars().collect(); let tokens = lex(&chars); let seq = parse_seq(&tokens, &chars)?; let mut root = AstExprNode::Seq(seq); if use_optimizer { while optimize_expr(&mut root) {} } Ok(root) } /// Parse a sequence of expressions, one after the other. pub fn parse_seq(tokens: &[Token], source: &[char]) -> Result, Error> { let mut seq = Vec::new(); let mut cursor = 0; while let Some(remainder) = tokens.get(cursor..) && !remainder.is_empty() { let res = parse_single_expr(remainder, source)?; seq.push(res.node); cursor += res.next_idx; } Ok(seq) } /// Parse an individual expression. fn parse_single_expr(tokens: &[Token], source: &[char]) -> Result, Error> { let cursor = 0; let tok = tokens.get(cursor).ok_or(Error::EndOfInput)?; match tok.kind { TokenKind::Space(_) => Ok(FoundNode::new(AstExprNode::Whitespace, 1)), // The expr ref notation TokenKind::Punctuation(Punctuation::At) => { let name_tok = tokens.get(1).ok_or(Error::EndOfInput)?; let name = name_tok.span.get_content(source); Ok(FoundNode::new(AstExprNode::ExprRef(name.into()), 2)) } // The derivation notation. TokenKind::Punctuation(Punctuation::Currency(Currency::Dollar)) => { let word_tok = tokens.get(1).ok_or(Error::EndOfInput)?; let word = word_tok.span.get_content(source); Ok(FoundNode::new(AstExprNode::DerivativeOf(word.into()), 2)) } TokenKind::Punctuation(Punctuation::Star) => { Ok(FoundNode::new(AstExprNode::Anything, 1)) } TokenKind::Word(_) => { let text = tok.span.get_content_string(source); if let Ok(upos) = UPOS::from_str(&text){ Ok(FoundNode::new( AstExprNode::UPOSSet(vec![upos]), 1, )) }else{ let node = match text.as_str() { "PROG" => AstExprNode::Progressive, _ => AstExprNode::Word(text.chars().collect()), }; Ok(FoundNode::new( node, 1, )) } } , // The sequence notation. Useful for representing strings. TokenKind::Punctuation(Punctuation::OpenRound) => { let close_idx = locate_matching_brace(tokens, TokenKind::is_open_round, TokenKind::is_close_round) .ok_or(Error::UnmatchedBrace)?; let child = parse_seq(&tokens[1..close_idx], source)?; Ok(FoundNode::new(AstExprNode::Seq(child), close_idx + 1)) } // The _not_ or _unless_ notation TokenKind::Punctuation(Punctuation::Bang) => { let res = parse_single_expr(&tokens[1..], source)?; Ok(FoundNode::new( AstExprNode::Not(Box::new(res.node)), res.next_idx + 1, )) } // The array notation TokenKind::Punctuation(Punctuation::OpenSquare) => { let close_idx = locate_matching_brace( tokens, TokenKind::is_open_square, TokenKind::is_close_square, ) .ok_or(Error::UnmatchedBrace)?; let children = parse_collection(&tokens[1..close_idx], source, parse_single_expr)?; Ok(FoundNode::new(AstExprNode::Arr(children), close_idx + 1)) } // The filter notation TokenKind::Punctuation(Punctuation::LessThan) => { let close_idx = locate_matching_brace(tokens, TokenKind::is_less_than, TokenKind::is_greater_than) .ok_or(Error::UnmatchedBrace)?; let children = parse_collection(&tokens[1..close_idx], source, parse_single_expr)?; Ok(FoundNode::new(AstExprNode::Filter(children), close_idx + 1)) } TokenKind::Punctuation(p) => Ok(FoundNode::new(AstExprNode::Punctuation(p), 1)), _ => Err(Error::UnsupportedToken(tok.span.get_content_string(source))), } } #[cfg(test)] mod tests { use harper_brill::UPOS; use crate::Punctuation; use crate::char_string::char_string; use super::{AstExprNode, parse_expr_str}; #[test] fn parses_whitespace() { assert_eq!(parse_expr_str(" ", true).unwrap(), AstExprNode::Whitespace) } #[test] fn parses_word() { assert_eq!( parse_expr_str("word", true).unwrap(), AstExprNode::Word(char_string!("word")) ) } #[test] fn parses_word_space() { assert_eq!( parse_expr_str("word ", true).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("word")), AstExprNode::Whitespace ]) ) } #[test] fn parses_word_space_word() { assert_eq!( parse_expr_str("word word", true).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("word")), AstExprNode::Whitespace, AstExprNode::Word(char_string!("word")), ]) ) } #[test] fn parses_simple_seq() { assert_eq!( parse_expr_str("a (b c) d", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Whitespace, AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("b")), AstExprNode::Whitespace, AstExprNode::Word(char_string!("c")), ]), AstExprNode::Whitespace, AstExprNode::Word(char_string!("d")), ]) ) } #[test] fn parses_nested_seqs() { assert_eq!( parse_expr_str("a (b (c)) d", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Whitespace, AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("b")), AstExprNode::Whitespace, AstExprNode::Seq(vec![AstExprNode::Word(char_string!("c")),]), ]), AstExprNode::Whitespace, AstExprNode::Word(char_string!("d")), ]) ) } #[test] fn parses_paired_seqs() { assert_eq!( parse_expr_str("a (b) (c) d", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Whitespace, AstExprNode::Seq(vec![AstExprNode::Word(char_string!("b")),]), AstExprNode::Whitespace, AstExprNode::Seq(vec![AstExprNode::Word(char_string!("c")),]), AstExprNode::Whitespace, AstExprNode::Word(char_string!("d")), ]) ) } #[test] fn parses_not() { assert_eq!( parse_expr_str("a !b c", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Whitespace, AstExprNode::Not(Box::new(AstExprNode::Word(char_string!("b")))), AstExprNode::Whitespace, AstExprNode::Word(char_string!("c")), ]) ) } #[test] fn parses_not_seq() { assert_eq!( parse_expr_str("a !(b c) d", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Whitespace, AstExprNode::Not(Box::new(AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("b")), AstExprNode::Whitespace, AstExprNode::Word(char_string!("c")), ]),)), AstExprNode::Whitespace, AstExprNode::Word(char_string!("d")), ]) ) } #[test] fn parses_empty_array() { assert_eq!( parse_expr_str("[]", true).unwrap(), AstExprNode::Arr(vec![]) ) } #[test] fn parses_single_element_array() { assert_eq!( parse_expr_str("[a]", false).unwrap(), AstExprNode::Seq(vec![AstExprNode::Arr(vec![AstExprNode::Word( char_string!("a") )])]) ) } #[test] fn optimizer_deconstructs_single_element_array() { assert_eq!( parse_expr_str("[a]", true).unwrap(), AstExprNode::Word(char_string!("a")) ) } #[test] fn optimizer_deconstructs_single_element_seq() { assert_eq!( parse_expr_str("(a)", true).unwrap(), AstExprNode::Word(char_string!("a")) ) } #[test] fn parses_double_element_array() { assert_eq!( parse_expr_str("[a, b]", true).unwrap(), AstExprNode::Arr(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Word(char_string!("b")) ]) ) } #[test] fn parses_triple_element_array() { assert_eq!( parse_expr_str("[a, b, c]", true).unwrap(), AstExprNode::Arr(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Word(char_string!("b")), AstExprNode::Word(char_string!("c")) ]) ) } #[test] fn parses_not_triple_element_array() { assert_eq!( parse_expr_str("![a, b, c]", true).unwrap(), AstExprNode::Not(Box::new(AstExprNode::Arr(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Word(char_string!("b")), AstExprNode::Word(char_string!("c")) ]))) ) } #[test] fn parses_triple_dot() { assert_eq!( parse_expr_str("...", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Punctuation(Punctuation::Period), AstExprNode::Punctuation(Punctuation::Period), AstExprNode::Punctuation(Punctuation::Period), ]) ) } #[test] fn parses_space_comma() { assert_eq!( parse_expr_str("[( ), (,)]", true).unwrap(), AstExprNode::Arr(vec![ AstExprNode::Whitespace, AstExprNode::Punctuation(Punctuation::Comma), ]) ) } #[test] fn parses_space_dash() { assert_eq!( parse_expr_str("[( ), (-)]", true).unwrap(), AstExprNode::Arr(vec![ AstExprNode::Whitespace, AstExprNode::Punctuation(Punctuation::Hyphen), ]) ) } #[test] fn parses_filter() { assert_eq!( parse_expr_str("", true).unwrap(), AstExprNode::Filter(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Word(char_string!("b")), AstExprNode::Word(char_string!("c")), ]) ) } #[test] fn parses_filter_with_space_prefixing_element() { assert_eq!( parse_expr_str("< a, b, c>", true).unwrap(), AstExprNode::Filter(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Word(char_string!("b")), AstExprNode::Word(char_string!("c")), ]) ) } #[test] fn parses_filter_with_space_postfixing_element() { assert_eq!( parse_expr_str("", true).unwrap(), AstExprNode::Filter(vec![ AstExprNode::Word(char_string!("a")), AstExprNode::Word(char_string!("b")), AstExprNode::Word(char_string!("c")), ]) ) } #[test] fn parses_derivative() { assert_eq!( parse_expr_str("$word", true).unwrap(), AstExprNode::DerivativeOf(char_string!("word")) ) } #[test] fn parses_derivative_seq() { assert_eq!( parse_expr_str("$a $b $c", true).unwrap(), AstExprNode::Seq(vec![ AstExprNode::DerivativeOf(char_string!("a")), AstExprNode::Whitespace, AstExprNode::DerivativeOf(char_string!("b")), AstExprNode::Whitespace, AstExprNode::DerivativeOf(char_string!("c")), ]) ) } #[test] fn parses_contraction() { assert_eq!( parse_expr_str("don't do this", true).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Word(char_string!("don't")), AstExprNode::Whitespace, AstExprNode::Word(char_string!("do")), AstExprNode::Whitespace, AstExprNode::Word(char_string!("this")), ]) ) } #[test] fn parses_upos() { assert_eq!( parse_expr_str("PROPN NOUN VERB", false).unwrap(), AstExprNode::Seq(vec![ AstExprNode::UPOSSet(vec![UPOS::PROPN]), AstExprNode::Whitespace, AstExprNode::UPOSSet(vec![UPOS::NOUN]), AstExprNode::Whitespace, AstExprNode::UPOSSet(vec![UPOS::VERB]), ]) ) } #[test] fn optimizes_upos_set() { assert_eq!( parse_expr_str("[PROPN, NOUN, VERB]", true).unwrap(), AstExprNode::UPOSSet(vec![UPOS::PROPN, UPOS::NOUN, UPOS::VERB]), ) } #[test] fn parses_prog() { assert_eq!( parse_expr_str("PROG", true).unwrap(), AstExprNode::Progressive ) } #[test] fn parses_expr_ref() { assert_eq!( parse_expr_str("@test", true).unwrap(), AstExprNode::ExprRef(char_string!("test")) ) } #[test] fn parses_expr_ref_array() { assert_eq!( parse_expr_str("[@a, @b, @c]", true).unwrap(), AstExprNode::Arr(vec![ AstExprNode::ExprRef(char_string!("a")), AstExprNode::ExprRef(char_string!("b")), AstExprNode::ExprRef(char_string!("c")) ]) ) } #[test] fn parses_anything() { assert_eq!(parse_expr_str("*", true).unwrap(), AstExprNode::Anything) } #[test] fn parses_anything_seq() { assert_eq!( parse_expr_str("* * *", true).unwrap(), AstExprNode::Seq(vec![ AstExprNode::Anything, AstExprNode::Whitespace, AstExprNode::Anything, AstExprNode::Whitespace, AstExprNode::Anything, ]) ) } } ================================================ FILE: harper-core/src/weir/parsing/mod.rs ================================================ mod expr; mod stmt; use super::Error; use ast::{Ast, AstExprNode, AstStmtNode}; pub use expr::parse_expr_str; pub use stmt::parse_str; use crate::lexing::{lex_weir_token, lex_with}; use crate::{Token, TokenKind}; use super::{ ast, optimize::{optimize, optimize_expr}, }; /// Lex the entirety of a Weir document. fn lex(source: &[char]) -> Vec { lex_with(source, lex_weir_token) } #[derive(Debug)] struct FoundNode { /// The parsed node found. node: T, /// The next token to be read. next_idx: usize, } impl FoundNode { pub fn new(node: T, next_idx: usize) -> Self { Self { node, next_idx } } } /// A utility for parsing a collection of items, separated by commas. /// Requires a parser used for parsing individual elements. fn parse_collection( tokens: &[Token], source: &[char], el_parser: impl Fn(&[Token], &[char]) -> Result, Error>, ) -> Result, Error> { let mut children = Vec::new(); let mut cursor = 0; while cursor < tokens.len() { while tokens[cursor].kind.is_space() { cursor += 1; } let new_child = el_parser(&tokens[cursor..], source)?; children.push(new_child.node); cursor += new_child.next_idx; while cursor != tokens.len() && tokens[cursor].kind.is_space() { cursor += 1; } if cursor != tokens.len() && !tokens[cursor].kind.is_comma() { return Err(Error::ExpectedComma); } cursor += 1; if cursor < tokens.len() && tokens[cursor].kind.is_space() { cursor += 1; } } Ok(children) } /// Locates the closing brace for the token at index zero. fn locate_matching_brace( tokens: &[Token], is_open: impl Fn(&TokenKind) -> bool, is_close: impl Fn(&TokenKind) -> bool, ) -> Option { // Locate closing brace let mut visited_opens = 0; let mut cursor = 1; inc_by_spaces(&mut cursor, tokens); loop { let cur = tokens.get(cursor)?; if is_open(&cur.kind) { visited_opens += 1; } else if is_close(&cur.kind) { if visited_opens == 0 { return Some(cursor); } else { visited_opens -= 1; } } cursor += 1; } } /// Increments the cursor until it is no longer over a space. fn inc_by_spaces(cursor: &mut usize, tokens: &[Token]) { // Skip whitespace at the beginning. while matches!( tokens.get(*cursor).map(|t| &t.kind), Some(&TokenKind::Space(..)) ) { *cursor += 1; } } /// Increments the cursor until it is no longer over whitespace. fn inc_by_whitespace(cursor: &mut usize, tokens: &[Token]) { // Skip whitespace at the beginning. while tokens .get(*cursor) .map(|t| &t.kind) .is_some_and(|t| t.is_whitespace()) { *cursor += 1; } } /// Asserts that a space is expected in the location of the cursor. /// Returns the proper arrow type that can be handled with the `?` syntax. fn expected_space(cursor: usize, tokens: &[Token], source: &[char]) -> Result<(), Error> { let expected_space = &tokens[cursor]; if !expected_space.kind.is_space() { return Err(Error::UnexpectedToken( expected_space.span.get_content_string(source), )); } Ok(()) } ================================================ FILE: harper-core/src/weir/parsing/stmt.rs ================================================ use std::num::NonZeroUsize; use std::sync::{Arc, LazyLock, RwLock}; use lru::LruCache; use super::ast::AstVariable; use super::inc_by_spaces; use crate::{CharStringExt, Punctuation, Token, TokenKind, TokenStringExt}; use super::expr::parse_seq; use super::{ Ast, AstExprNode, AstStmtNode, Error, FoundNode, expected_space, inc_by_whitespace, lex, locate_matching_brace, optimize, parse_collection, }; /// Parse the provided string using caching to speed up repeated requests. /// /// Will return the cached AST if the provided code has previously been cached. Otherwise, it will /// parse the code and cache the resulting AST. pub fn parse_str(weir_code: &str, use_optimizer: bool) -> Result, Error> { // The parameters that might influence the generated AST. // This is used as the key for the cache hashmap. type ParseStrParams = (Arc, bool); static PARSE_CACHE: LazyLock< RwLock, hashbrown::DefaultHashBuilder>>, > = LazyLock::new(|| RwLock::new(LruCache::new(NonZeroUsize::new(10000).unwrap()))); let weir_code = Arc::new(weir_code.to_owned()); Ok( if let Some(cached) = PARSE_CACHE .read() .unwrap() .peek(&(weir_code.clone(), use_optimizer)) { cached.clone() } else { let chars: Vec = weir_code.chars().collect(); let tokens = lex(&chars); let mut stmts = parse_stmt_list(&tokens, &chars)?; if use_optimizer { while optimize(&mut stmts) {} } let ast = Arc::new(Ast { stmts }); PARSE_CACHE .write() .unwrap() .put((weir_code, use_optimizer), ast.clone()); ast }, ) } fn parse_stmt_list(tokens: &[Token], source: &[char]) -> Result, Error> { let mut list = Vec::new(); let mut cursor = 0; while let Some(remainder) = tokens.get(cursor..) && !remainder.is_empty() { let res = parse_stmt(remainder, source)?; if let Some(node) = res.node { list.push(node); } cursor += res.next_idx; } Ok(list) } fn parse_stmt(tokens: &[Token], source: &[char]) -> Result>, Error> { let mut cursor = 0; inc_by_whitespace(&mut cursor, tokens); let end = tokens .iter() .enumerate() .skip(cursor) .find_map(|(i, t)| t.kind.is_newline().then_some(i)) .unwrap_or(tokens.len()); let Some(key_token) = tokens.get(cursor) else { return Ok(FoundNode { node: None, next_idx: cursor + 1, }); }; match key_token.kind { TokenKind::Punctuation(Punctuation::Hash) => { let comment = tokens[cursor..end] .span() .unwrap() .get_content_string(source); Ok(FoundNode::new(Some(AstStmtNode::Comment(comment)), end + 1)) } TokenKind::Word(_) => { let word_literal = key_token.span.get_content(source); match word_literal { ['l', 'e', 't'] => { expected_space(cursor + 1, tokens, source)?; let name = tokens[cursor + 2].span.get_content_string(source); expected_space(cursor + 3, tokens, source)?; let str_res = parse_quoted_string(&tokens[cursor + 4..end], source); if let Ok(str_contents) = str_res { if tokens[str_contents.next_idx + cursor + 4..end] .iter() .any(|t| !t.kind.is_space()) { return Err(Error::UnexpectedToken( tokens[str_contents.next_idx + cursor + 4] .span .get_content_string(source), )); } Ok(FoundNode::new( Some(AstStmtNode::create_declare_variable( name, AstVariable::String(str_contents.node), )), end + 1, )) } else { let open_brac_tok = &tokens[cursor + 4]; if !open_brac_tok.kind.is_open_square() { return Err(Error::UnexpectedToken( open_brac_tok.span.get_content_string(source), )); } let matching = locate_matching_brace( &tokens[cursor + 4..end], TokenKind::is_open_square, TokenKind::is_close_square, ) .ok_or(Error::UnmatchedBrace)? + cursor + 4; let elements = parse_collection( &tokens[cursor + 5..matching], source, parse_quoted_string, )?; Ok(FoundNode::new( Some(AstStmtNode::create_declare_variable( name, AstVariable::Array( elements.into_iter().map(AstVariable::String).collect(), ), )), end + 1, )) } } ['e', 'x', 'p', 'r'] => { expected_space(cursor + 1, tokens, source)?; Ok(FoundNode::new( Some(AstStmtNode::create_set_expr( tokens[cursor + 2].span.get_content_string(source), AstExprNode::Seq(parse_seq( &tokens[(cursor + 4).min(end)..end], source, )?), )), end + 1, )) } ['a', 'l', 'l', 'o', 'w', 's'] => { let case = parse_quoted_string(&tokens[cursor + 1..], source)?; cursor += 1 + case.next_idx; if cursor != end { return Err(Error::UnexpectedToken( tokens[cursor].span.get_content_string(source), )); } Ok(FoundNode::new( Some(AstStmtNode::create_allow_test(case.node)), end + 1, )) } ['t', 'e', 's', 't'] => { let case = parse_quoted_string(&tokens[cursor + 1..], source)?; cursor += 1 + case.next_idx; expected_space(cursor, tokens, source)?; let sol = parse_quoted_string(&tokens[cursor + 1..], source)?; cursor += 1 + sol.next_idx; if cursor != end { return Err(Error::UnexpectedToken( tokens[cursor].span.get_content_string(source), )); } Ok(FoundNode::new( Some(AstStmtNode::create_test(case.node, sol.node)), end + 1, )) } _ => Err(Error::UnexpectedToken(word_literal.to_string())), } } _ => Err(Error::UnsupportedToken( key_token.span.get_content_string(source), )), } } fn parse_quoted_string(tokens: &[Token], source: &[char]) -> Result, Error> { fn is_escaped(pos: usize, source: &[char]) -> bool { if pos == 0 { return false; } let mut i = pos; let mut n = 0; while i > 0 && source[i - 1] == '\\' { n += 1; i -= 1; } n % 2 == 1 } let mut cursor = 0; inc_by_spaces(&mut cursor, tokens); let quote_tok = tokens.get(cursor).ok_or(Error::EndOfInput)?; if !quote_tok.kind.is_quote() { return Err(Error::UnexpectedToken( quote_tok.span.get_content_string(source), )); } let mut end = None; for (i, tok) in tokens.iter().enumerate().skip(cursor + 1) { if tok.kind.is_quote() { let qpos = tok.span.start; if !is_escaped(qpos, source) { end = Some(i); break; } } } let end = end.ok_or(Error::EndOfInput)?; Ok(FoundNode { node: tokens[cursor + 1..end] .span() .unwrap_or_default() .get_content_string(source), next_idx: end + 1, }) } #[cfg(test)] mod tests { use quickcheck_macros::quickcheck; use crate::char_string::char_string; use super::{AstExprNode, AstStmtNode, AstVariable, parse_str}; #[test] fn parses_single_var_stmt() { let ast = parse_str("let test \"to be this\"", true).unwrap(); assert_eq!( ast.stmts, vec![AstStmtNode::create_declare_variable( "test", AstVariable::create_string("to be this") ),] ); assert_eq!( ast.get_variable_value("test"), Some(&AstVariable::create_string("to be this")) ); } #[test] fn parses_single_var_stmt_with_lots_of_space() { let ast = parse_str("let test \"to be this\"", true).unwrap(); assert_eq!( ast.stmts, vec![AstStmtNode::create_declare_variable( "test", AstVariable::create_string("to be this") ),] ); assert_eq!( ast.get_variable_value("test"), Some(&AstVariable::create_string("to be this")) ); } #[test] fn parses_single_var_stmt_array() { let ast = parse_str("let test [\"to be this\", \"and this\"]", true).unwrap(); let correct_var_val = AstVariable::Array(vec![ AstVariable::create_string("to be this"), AstVariable::create_string("and this"), ]); assert_eq!(ast.get_variable_value("test"), Some(&correct_var_val)); assert_eq!( ast.stmts, vec![AstStmtNode::create_declare_variable( "test", correct_var_val ),] ); } #[test] fn parses_single_expr_stmt() { assert_eq!( parse_str("expr main word", true).unwrap().stmts, vec![AstStmtNode::create_set_expr( "main", AstExprNode::Word(char_string!("word")) )] ) } #[test] fn parses_single_comment_stmt() { assert_eq!( parse_str("# this is a comment", true).unwrap().stmts, vec![AstStmtNode::Comment("# this is a comment".to_string())] ) } #[test] fn parses_single_comment_stmt_with_space_prefix() { assert_eq!( parse_str(" # this is a comment", true).unwrap().stmts, vec![AstStmtNode::Comment("# this is a comment".to_string())] ) } #[test] fn parses_tests() { assert_eq!( parse_str("test \"this is the case\" \"this is the solution\"", true) .unwrap() .stmts, vec![AstStmtNode::create_test( "this is the case", "this is the solution" )] ) } #[test] fn parses_multiple_spaces_in_tests() { assert_eq!( parse_str( "test \"this is the case\" \"this is the solution\"", true ) .unwrap() .stmts, vec![AstStmtNode::create_test( "this is the case", "this is the solution" )] ) } #[test] fn parses_allows() { assert_eq!( parse_str("allows \"this is the case\"", true) .unwrap() .stmts, vec![AstStmtNode::create_allow_test("this is the case",)] ) } #[test] fn parses_comment_expr_var_together() { let ast = parse_str( "let test \"to be this\"\nexpr main word\n# this is a comment", true, ) .unwrap(); assert_eq!( ast.stmts, vec![ AstStmtNode::create_declare_variable( "test", AstVariable::create_string("to be this") ), AstStmtNode::create_set_expr("main", AstExprNode::Word(char_string!("word"))), AstStmtNode::Comment("# this is a comment".to_string()) ] ); assert_eq!( ast.get_variable_value("test"), Some(&AstVariable::create_string("to be this")) ); assert_eq!( ast.get_expr("main"), Some(&AstExprNode::Word(char_string!("word"))) ); } #[test] fn parses_comment_in_middle() { let ast = parse_str( "let test \"to be this\"\n# this is a comment\nexpr main word", true, ) .unwrap(); assert_eq!( ast.stmts, vec![ AstStmtNode::create_declare_variable( "test", AstVariable::create_string("to be this") ), AstStmtNode::Comment("# this is a comment".to_string()), AstStmtNode::create_set_expr("main", AstExprNode::Word(char_string!("word"))) ] ); assert_eq!( ast.get_variable_value("test"), Some(&AstVariable::create_string("to be this")) ); assert_eq!( ast.get_expr("main"), Some(&AstExprNode::Word(char_string!("word"))) ); } #[test] #[should_panic] fn catches_non_whitespace_after_expr() { parse_str("expr+this is a test", false).unwrap(); } #[test] #[should_panic] fn catches_non_whitespace_after_test() { parse_str("test+\"\" \"\"", false).unwrap(); } #[test] #[should_panic] fn catches_non_whitespace_between_test() { parse_str("test \"\"+\"\"", false).unwrap(); } #[test] #[should_panic] fn catches_non_whitespace_after_let() { parse_str("let+var \"\"", false).unwrap(); } #[test] #[should_panic] fn catches_non_whitespace_after_let_var() { parse_str("let var+\"\"", false).unwrap(); } #[test] #[should_panic] fn catches_non_whitespace_after_allows() { parse_str("allows+\"\"", false).unwrap(); } #[quickcheck] fn catches_anything_after_test(a: String) { if !a.is_empty() && !a.starts_with('\n') { let code = format!("test \"\" \"\"{a}"); assert!(parse_str(code.as_str(), false).is_err()) } } #[quickcheck] fn catches_anything_after_allows(a: String) { if !a.is_empty() && !a.starts_with('\n') { let code = format!("allows \"\" {a}"); assert!(parse_str(code.as_str(), false).is_err()) } } } ================================================ FILE: harper-core/src/weirpack/error.rs ================================================ use thiserror::Error; #[derive(Debug, Error)] pub enum Error { #[error("IO error: {0}")] Io(#[from] std::io::Error), #[error("Zip error: {0}")] Zip(#[from] zip::result::ZipError), #[error("JSON error: {0}")] Json(#[from] serde_json::Error), #[error("Weir error: {0}")] Weir(#[from] crate::weir::Error), #[error("Missing manifest file '{0}'.")] MissingManifest(&'static str), #[error("Manifest field '{0}' is missing.")] MissingManifestField(&'static str), #[error("Manifest field '{0}' must be a string.")] InvalidManifestFieldType(&'static str), #[error("Duplicate manifest file '{0}'.")] DuplicateManifest(&'static str), #[error("Invalid rule filename '{0}'.")] InvalidRuleFileName(String), } ================================================ FILE: harper-core/src/weirpack/manifest.rs ================================================ use std::io::{Read, Write}; use hashbrown::HashMap; use paste::paste; use serde_json::Value; use super::Error; #[derive(Debug, Clone, Default)] pub struct WeirpackManifest { data: HashMap, } macro_rules! gen_fns { ($field:ident) => { paste! { #[doc = concat!("Get the ", stringify!($field), " field from the manifest.")] pub fn $field(&self) -> Result<&str, Error>{ self.required_str(stringify!($field)) } #[doc = concat!("Set the ", stringify!($field), " field in the manifest.")] pub fn [< set_ $field >](&mut self, value: impl Into) { self.set_field(stringify!($field), Value::String(value.into())); } } }; } impl WeirpackManifest { /// Create a new, empty manifest. /// Note that an empty manifest is an invalid manifest. pub fn new() -> Self { Self::default() } /// Load a manifest from some bytes. pub fn from_reader(reader: impl Read) -> Result { let data: HashMap = serde_json::from_reader(reader)?; let manifest = Self { data }; manifest.validate_required()?; Ok(manifest) } /// Write a manifest to some bytes. pub fn write_to(&self, writer: impl Write) -> Result<(), Error> { self.validate_required()?; serde_json::to_writer_pretty(writer, &self.data)?; Ok(()) } /// Get an arbitrary field from the manifest. pub fn get_field(&self, key: &str) -> Option<&Value> { self.data.get(key) } /// Set an arbitrary field from the manifest. pub fn set_field(&mut self, key: impl Into, value: Value) { self.data.insert(key.into(), value); } gen_fns!(author); gen_fns!(version); gen_fns!(description); gen_fns!(license); fn required_str(&self, key: &'static str) -> Result<&str, Error> { match self.data.get(key) { Some(Value::String(value)) => Ok(value), Some(_) => Err(Error::InvalidManifestFieldType(key)), None => Err(Error::MissingManifestField(key)), } } fn validate_required(&self) -> Result<(), Error> { self.author()?; self.version()?; self.description()?; self.license()?; Ok(()) } } ================================================ FILE: harper-core/src/weirpack/mod.rs ================================================ //! See [our main documentation](https://writewithharper.com/docs/weir#Weirpacks) on Weir and the Weirpack format. use std::io::{Read, Write}; use std::path::Path; use hashbrown::HashMap; use zip::write::FileOptions; use zip::{CompressionMethod, ZipArchive, ZipWriter}; use crate::linting::LintGroup; use crate::weir::{TestResult, WeirLinter}; mod error; mod manifest; pub use error::Error; pub use manifest::WeirpackManifest; /// A Weirpack, which carries within itself one or more rules to be used for grammar checking. /// These rules are written in Weir. #[derive(Debug, Clone, Default)] pub struct Weirpack { pub rules: HashMap, pub manifest: WeirpackManifest, } impl Weirpack { /// Create an empty Weirpack. pub fn new(manifest: WeirpackManifest) -> Self { Self { rules: HashMap::new(), manifest, } } /// Add a rule to this Weirpack. Does not compile to test the rule. pub fn add_rule(&mut self, name: impl Into, rule: impl Into) -> Option { self.rules.insert(name.into(), rule.into()) } /// Remove a rule from this Weirpack. pub fn remove_rule(&mut self, name: &str) -> Option { self.rules.remove(name) } /// Run all the tests within all the Weir rules in this Weirpack. pub fn run_tests(&self) -> Result>, Error> { let mut failures = HashMap::new(); for (name, rule) in &self.rules { let mut linter = WeirLinter::new(rule)?; let failing_tests = linter.run_tests(); if !failing_tests.is_empty() { failures.insert(name.to_string(), failing_tests); } } Ok(failures) } /// Parse and optimize the Weir rules in the pack, converting the set into a single [`LintGroup`]. /// Does not run tests. pub fn to_lint_group(&self) -> Result { let mut group = LintGroup::default(); for (name, rule) in &self.rules { let linter = WeirLinter::new(rule)?; group.add_chunk_expr_linter(name, linter); group.config.set_rule_enabled(name, true); } Ok(group) } /// Load a Weirpack from bytes. pub fn from_reader(mut reader: impl Read) -> Result { let mut bytes = Vec::new(); reader.read_to_end(&mut bytes)?; Self::from_bytes(&bytes) } /// Write the Weirpack to bytes. pub fn write_to(&self, mut writer: impl Write) -> Result<(), Error> { let bytes = self.to_bytes()?; writer.write_all(&bytes)?; Ok(()) } /// Load a Weirpack from bytes. pub fn from_bytes(bytes: &[u8]) -> Result { let cursor = std::io::Cursor::new(bytes); let mut archive = ZipArchive::new(cursor)?; let mut manifest = None; let mut rules = HashMap::new(); for i in 0..archive.len() { let mut file = archive.by_index(i)?; if file.is_dir() { continue; } let name = file.name().to_string(); if name == "manifest.json" { if manifest.is_some() { return Err(Error::DuplicateManifest("manifest.json")); } let manifest_data = WeirpackManifest::from_reader(&mut file)?; manifest = Some(manifest_data); continue; } if !name.ends_with(".weir") { continue; } let path = Path::new(&name); let file_name = path .file_name() .and_then(|segment| segment.to_str()) .ok_or_else(|| Error::InvalidRuleFileName(name.clone()))?; let rule_name = Path::new(file_name) .file_stem() .and_then(|stem| stem.to_str()) .ok_or_else(|| Error::InvalidRuleFileName(name.clone()))?; let mut contents = String::new(); file.read_to_string(&mut contents)?; rules.insert(rule_name.to_string(), contents); } let manifest = manifest.ok_or(Error::MissingManifest("manifest.json"))?; Ok(Self { rules, manifest }) } /// Write a Weirpack into bytes. pub fn to_bytes(&self) -> Result, Error> { let mut zip = ZipWriter::new(std::io::Cursor::new(Vec::new())); let options = FileOptions::<()>::default().compression_method(CompressionMethod::Deflated); let mut manifest_bytes = Vec::new(); self.manifest.write_to(&mut manifest_bytes)?; zip.start_file("manifest.json", options)?; zip.write_all(&manifest_bytes)?; let mut rule_names: Vec<_> = self.rules.keys().collect(); rule_names.sort(); for rule_name in rule_names { let file_name = format!("{rule_name}.weir"); zip.start_file(file_name, options)?; if let Some(rule) = self.rules.get(rule_name) { zip.write_all(rule.as_bytes())?; } } let cursor = zip.finish()?; Ok(cursor.into_inner()) } } #[cfg(test)] mod tests { use super::{Weirpack, WeirpackManifest}; #[test] fn round_trip_weirpack_bytes() { let mut manifest = WeirpackManifest::new(); manifest.set_author("Test Author"); manifest.set_version("0.1.0"); manifest.set_description("Test pack"); manifest.set_license("MIT"); let mut pack = Weirpack::new(manifest); pack.add_rule("ExampleRule", "expr main test"); let bytes = pack.to_bytes().expect("serialize weirpack"); let parsed = Weirpack::from_bytes(&bytes).expect("deserialize weirpack"); assert_eq!(parsed.manifest.author().unwrap(), "Test Author"); assert_eq!(parsed.manifest.version().unwrap(), "0.1.0"); assert_eq!(parsed.manifest.description().unwrap(), "Test pack"); assert_eq!(parsed.manifest.license().unwrap(), "MIT"); assert_eq!(parsed.rules.get("ExampleRule").unwrap(), "expr main test"); } } ================================================ FILE: harper-core/tests/linters.rs ================================================ //! This test creates snapshots of the reports of all linters. //! //! # Usage //! //! To add a new snapshot, simply add the document to `tests/text` and run this //! test. It will automatically create a new snapshot in `tests/text/linters`. //! To update an existing snapshot, also just run this test. //! //! Note: This test will fail if the snapshot files are not up to date. This //! ensures that CI will fail if linters change their behavior. use harper_core::spell::FstDictionary; use harper_core::{ Dialect, Document, linting::{LintGroup, Linter}, }; mod snapshot; struct LinePos { /// 0-based index of the line pub line: usize, /// 0-based index of the column pub col: usize, } struct Lines<'a> { lines: Vec<&'a str>, offsets: Vec, } impl Lines<'_> { fn new(source: &'_ str) -> Lines<'_> { let lines: Vec<&str> = source.split('\n').collect(); let offsets: Vec = lines .iter() .scan(0, |offset, line| { let old_offset = *offset; *offset += line.chars().count() + 1; Some(old_offset) }) .collect(); Lines { lines, offsets } } fn len(&self) -> usize { self.lines.len() } fn get_pos(&self, offset: usize) -> LinePos { let line_index = self .offsets .binary_search(&offset) .unwrap_or_else(|x| x - 1); LinePos { line: line_index, col: offset - self.offsets[line_index], } } } impl<'a> std::ops::Index for Lines<'a> { type Output = &'a str; fn index(&self, index: usize) -> &Self::Output { &self.lines[index] } } fn print_error(lines: &Lines, start: usize, end: usize, message: &str) -> String { let mut out = String::new(); fn print_line(out: &mut String, line: &str, number: usize) { out.push_str(&format!("{number:>6} | {line}\n")); } fn is_sentence_boundary(c: char) -> bool { matches!(c, '.' | '?' | '!' | ':' | ';') } fn print_pre_line_context( out: &mut String, context_line: &str, number: usize, line: &str, start_col: usize, ) { if context_line.is_empty() { return; } if start_col > 40 { // that's enough context return; } let last_char = context_line.chars().last().unwrap(); let mut chars_before = line.chars().take(start_col); if !is_sentence_boundary(last_char) && !chars_before.any(is_sentence_boundary) { print_line(out, context_line, number); } } fn print_post_line_context( out: &mut String, context_line: &str, number: usize, line: &str, end_col: usize, ) { if context_line.is_empty() { return; } if end_col < 40 { // that's enough context return; } let mut chars_after = line.chars().skip(end_col); if !chars_after.any(is_sentence_boundary) { print_line(out, context_line, number); } } fn print_underline( out: &mut String, start_col: usize, end_col: usize, continuation: bool, message: &str, ) { out.push_str(" | "); for _ in 0..start_col { out.push(' '); } out.push(if continuation { '~' } else { '^' }); for _ in 0..end_col.saturating_sub(start_col) { out.push('~'); } if !message.is_empty() { out.push(' '); out.push_str(message); } out.push('\n'); } let start = lines.get_pos(start); let end = lines.get_pos(end - 1); if start.line > 0 { print_pre_line_context( &mut out, lines[start.line - 1], start.line, lines[start.line], start.col, ); } if start.line == end.line { print_line(&mut out, lines[start.line], start.line + 1); print_underline(&mut out, start.col, end.col, false, message); } else { for i in start.line..end.line { let line = lines[i]; print_line(&mut out, line, i + 1); print_underline( &mut out, if i == start.line { start.col } else { 0 }, line.chars().count(), i != start.line, "", ); } print_line(&mut out, lines[end.line], end.line + 1); print_underline(&mut out, 0, end.col, true, message); } if end.line + 1 < lines.len() { print_post_line_context( &mut out, lines[end.line + 1], end.line + 2, lines[end.line], end.col, ); } out } #[test] fn test_most_lints() { snapshot::snapshot_all_text_files("linters", ".snap.yml", |source, dialect_override| { let dict = FstDictionary::curated(); let document = Document::new_markdown_default(source, &dict); let mut linter = LintGroup::new_curated( dict, dialect_override.unwrap_or_else(|| { Dialect::try_guess_from_document(&document).unwrap_or(Dialect::American) }), ); let mut lints = linter.lint(&document); lints.sort_by(|a, b| { a.span .start .cmp(&b.span.start) .then(a.span.end.cmp(&b.span.end)) }); // split the input document into lines let lines = Lines::new(source); let mut out = String::new(); for lint in lints { out.push_str(&format!( "Lint: {:?} ({} priority)\n", lint.lint_kind, lint.priority )); let message = print_error(&lines, lint.span.start, lint.span.end, &lint.message); out.push_str("Message: |\n"); for l in message.lines() { out.push_str(" "); out.push_str(l); out.push('\n'); } if !lint.suggestions.is_empty() { out.push_str("Suggest:\n"); for suggestion in &lint.suggestions { out.push_str(&format!(" - {suggestion}\n")); } } out.push_str("\n\n\n"); } out }); } ================================================ FILE: harper-core/tests/pos_tags.rs ================================================ //! This test creates snapshots of the part-of-speech (POS) tags assigned by the //! [`Document`] struct to the text files in the `tests/text` directory. //! //! # Usage //! //! To add a new snapshot, simply add the document to `tests/text` and run this //! test. It will automatically create a new snapshot in `tests/text/tagged`. //! To update an existing snapshot, also just run this test. //! //! Note: This test will fail if the snapshot files are not up to date. This //! ensures that CI will fail if the POS tagger changes its behavior. //! //! # Snapshot format //! //! The snapshot files contain 2 lines for every line in the original text. The //! first line contains the original text, and the second line contains the POS //! tags. The text and tags are aligned so that the tags are directly below the //! corresponding words in the text. Example: //! //! ```md //! > I told her how I had stopped off in Chicago for a day on my way East . //! # ISg V I/J/D NSg/C ISg V V/J NSg/V/J/P NPrSg/V/J/P NPr C/P D/P NPrSg J/P D J NPrSg/J . //! ``` //! //! ## Tags //! //! Tags are assigned based on the [`TokenKind`] and [`DictWordMetadata`] of a //! token. //! //! - The tag of [`TokenKind::Word`] variants depends on their //! [`DictWordMetadata`]. If they don't have any metadata, they are denoted by `?`. //! Otherwise, the tag is constructed as follows: //! //! - Nouns are denoted by `N`. //! - The `Pl` suffix means plural, and `Sg` means singular. //! - The `Pr` suffix means proper noun. //! - The `$` suffix means possessive. //! - Superscript `ᴹ` means mass (uncountable) noun. //! - Superscript `🅪` means mass + countable noun. //! - Pronouns are denoted by `I`. //! - The `Pl` suffix means plural, and `Sg` means singular. //! - The `$` suffix means possessive. //! - Verbs are denoted by `V`. //! - The `L` suffix means linking verb. //! - The `X` suffix means auxiliary verb. //! - The `B` suffix means base (lemma) form. //! - The `P` suffix means simple past tense & past participle. //! - The `Pr` suffix means progressive form. //! - The `Pt` suffix means simple past tense. //! - The `Pp` suffix means past participle. //! - The `3` suffix means third person singular present form. //! - Adjectives are denoted by `J`. //! - The `C` suffix means comparative. //! - The `S` suffix means superlative. //! - Adverbs are denoted by `R`. //! - Conjunctions are denoted by `C`. //! - Determiners are denoted by `D`. //! - The `dem` suffix means demonstrative. //! - The `q` suffix means quantifier. //! - Prepositions are denoted by `P`. //! - Dialects are denoted by `Am`, `Br`, `Ca`, or `Au` for individual //! dialects, or `NoAm` for North America (US and Canada) //! or `Comm` for Commonwealth (UK, Australia, and Canada). //! - Swear words are denoted by `B` (for bad). //! - Noun phrase membership is denoted by `+` //! - For words not in the dictionary or without annotations, //! they are denoted by `K` for "contraction" if they contain an apostrophe, //! or `W?` otherwise. //! //! The tagger supports uncertainty, so a single word can be e.g. both a //! noun and a verb. This is denoted by a `/` between the tags. //! For example, `N/V/J` means the word is a noun, verb, and/or adjective. //! //! - [`TokenKind::Punctuation`] are denoted by `.`. //! - [`TokenKind::Number`] are denoted by `#`. //! - [`TokenKind::Decade`] are denoted by `#d`. //! - Roman numerals are denoted by `#r`. //! - [`TokenKind::Space`], [`TokenKind::Newline`], and //! [`TokenKind::ParagraphBreak`] are ignored. //! - All other token kinds are denoted by their variant name. use std::borrow::Cow; use harper_core::spell::FstDictionary; use harper_core::{ Degree, Dialect, DictWordMetadata, Document, OrthFlags, TokenKind, VerbFormFlags, }; mod snapshot; fn format_word_tag(word: &DictWordMetadata) -> String { // These tags are inspired by the Penn Treebank POS tagset let mut tags = String::new(); fn add(t: &str, tags: &mut String) { if !tags.is_empty() { tags.push('/'); } tags.push_str(t); } fn add_bool(tag: &mut String, name: &str, value: Option) { if let Some(value) = value { if !value { tag.push('!'); } tag.push_str(name); } } fn add_switch(tag: &mut String, value: Option, yes: &str, no: &str) { if let Some(value) = value { if value { tag.push_str(yes); } else { tag.push_str(no); } } } if let Some(noun) = word.noun { let mut tag = String::from("N"); add_bool(&mut tag, "Pr", noun.is_proper); if word.is_mass_noun() { add_switch(&mut tag, Some(word.is_countable_noun()), "🅪", "ᴹ"); } if word.is_countable_noun() { // Countable nouns are optionally marked in the dictionary. Countable is default if neither it nor mass is marked. // Common nouns are not marked in the dictionary, but being a mass noun implies being a common noun. // We don't want to clutter the output with `Sg` for mass nouns unless they are also countable. // We don't want to clutter the output with `Sg` for proper nouns unless they are also common. // "wood"/"Wood" is a countable and mass common noun and also a proper noun. if word.is_singular_noun() && (!word.is_proper_noun() || word.is_mass_noun()) { tag.push_str("Sg"); } if word.is_plural_noun() { tag.push_str("Pl"); } } add_bool(&mut tag, "$", noun.is_possessive); add(&tag, &mut tags); } if let Some(pronoun) = word.pronoun { let mut tag = String::from("I"); add_bool( &mut tag, "Sg", pronoun.is_singular.and_then(|sg| sg.then_some(true)), ); add_bool( &mut tag, "Pl", pronoun.is_plural.and_then(|pl| pl.then_some(true)), ); add_bool(&mut tag, "$", pronoun.is_possessive); add(&tag, &mut tags); } if let Some(verb) = word.verb { let mut tag = String::from("V"); add_bool(&mut tag, "L", verb.is_linking); add_bool(&mut tag, "X", verb.is_auxiliary); if let Some(forms) = verb.verb_forms { // If Lemma flag is explicitly set; or if no verb forms are set Lemma is the default. match ( forms.contains(VerbFormFlags::LEMMA), forms.contains(VerbFormFlags::PAST), forms.contains(VerbFormFlags::PAST_PARTICIPLE), forms.contains(VerbFormFlags::PRETERITE), forms.contains(VerbFormFlags::PROGRESSIVE), forms.contains(VerbFormFlags::THIRD_PERSON_SINGULAR), ) { (true, _, _, _, _, _) | (false, false, false, false, false, false) => { tag.push_str("B") } _ => {} } // Regular verbs set both together; Irregular verbs can set them separately. match ( forms.contains(VerbFormFlags::PAST), forms.contains(VerbFormFlags::PRETERITE), forms.contains(VerbFormFlags::PAST_PARTICIPLE), ) { (true, _, _) | (_, true, true) => tag.push_str("P"), (false, true, false) => tag.push_str("Pt"), (false, false, true) => tag.push_str("Pp"), _ => {} } if forms.contains(VerbFormFlags::PROGRESSIVE) { tag.push_str("g"); } if forms.contains(VerbFormFlags::THIRD_PERSON_SINGULAR) { tag.push_str("3"); } } else { tag.push_str("B"); } add(&tag, &mut tags); } if let Some(adjective) = word.adjective { let mut tag = String::from("J"); if let Some(degree) = adjective.degree { tag.push_str(match degree { Degree::Comparative => "C", Degree::Superlative => "S", _ => "", }); } add(&tag, &mut tags); } if let Some(_adverb) = word.adverb { add("R", &mut tags); } if let Some(_conj) = word.conjunction { add("C", &mut tags); } if let Some(determiner) = word.determiner { let mut tag = String::from("D"); add_bool(&mut tag, "$", determiner.is_possessive); add_bool(&mut tag, "dem", determiner.is_demonstrative); add_bool(&mut tag, "q", determiner.is_quantifier); add(&tag, &mut tags); } if word.preposition { add("P", &mut tags); } if word.is_roman_numerals() { add("#r", &mut tags); } get_dialect_annotations(word).into_iter().for_each(|tag| { add(tag, &mut tags); }); add_switch(&mut tags, word.np_member, "+", ""); if word.swear == Some(true) { add("B", &mut tags); } match tags.is_empty() { true if word.orth_info.contains(OrthFlags::APOSTROPHE) => String::from("K"), true => String::from("W?"), false => tags, } } /// Returns a vector of dialect annotation strings for the given word. /// Handles both individual dialects and special groupings (NoAm, Comm). fn get_dialect_annotations(word: &DictWordMetadata) -> Vec<&'static str> { let mut annotations = Vec::new(); let mut north_america = false; let mut commonwealth = false; let en_au = word.dialects.is_dialect_enabled_strict(Dialect::Australian); let en_ca = word.dialects.is_dialect_enabled_strict(Dialect::Canadian); let en_gb = word.dialects.is_dialect_enabled_strict(Dialect::British); let en_us = word.dialects.is_dialect_enabled_strict(Dialect::American); // Dialect groups in alphabetical order if en_gb && en_au && en_ca { annotations.push("Comm"); commonwealth = true; } if en_us && en_ca { annotations.push("NoAm"); north_america = true; } // Individual dialects in alphabetical order if en_us && !north_america { annotations.push("Am"); } if en_au && !commonwealth { annotations.push("Au"); } if en_gb && !commonwealth { annotations.push("Br"); } if en_ca && !north_america && !commonwealth { annotations.push("Ca"); } annotations } fn format_tag(kind: &TokenKind) -> Cow<'static, str> { match kind { TokenKind::Word(word) => { // These tags are inspired by the Penn Treebank POS tagset if let Some(word) = word { Cow::Owned(format_word_tag(word)) } else { Cow::Borrowed("?") } } TokenKind::Punctuation(_) => Cow::Borrowed("."), TokenKind::Number(_) => Cow::Borrowed("#"), TokenKind::Decade => Cow::Borrowed("#d"), // The following variants just print their variant name TokenKind::Space(_) => Cow::Borrowed("Space"), TokenKind::Newline(_) => Cow::Borrowed("Newline"), TokenKind::EmailAddress => Cow::Borrowed("Email"), TokenKind::Url => Cow::Borrowed("Url"), TokenKind::Hostname => Cow::Borrowed("Hostname"), TokenKind::Unlintable => Cow::Borrowed("Unlintable"), TokenKind::Regexish => Cow::Borrowed("Regexish"), TokenKind::ParagraphBreak => Cow::Borrowed("ParagraphBreak"), TokenKind::HeadingStart => Cow::Borrowed("HeadingStart"), } } struct Formatter { out: String, line1: String, line2: String, } impl Formatter { const LINE1_PREFIX: &'static str = "> "; const LINE2_PREFIX: &'static str = "# "; fn new() -> Self { Self { out: String::new(), line1: String::from(Self::LINE1_PREFIX), line2: String::from(Self::LINE2_PREFIX), } } fn add(&mut self, token: &str, tag: &str) { for (line_number, token_line) in token.split('\n').enumerate() { if line_number > 0 { self.new_line(); } self.line1.push_str(token_line); self.line1.push(' '); self.line2.push_str(tag); self.line2.push(' '); let token_chars = token_line.chars().count(); let tag_chars = tag.chars().count(); for _ in token_chars..tag_chars { self.line1.push(' '); } for _ in tag_chars..token_chars { self.line2.push(' '); } } } fn new_line(&mut self) { self.out.push_str(self.line1.trim_end()); self.out.push('\n'); self.out.push_str(self.line2.trim_end()); self.out.push('\n'); self.line1.clear(); self.line2.clear(); self.line1.push_str(Self::LINE1_PREFIX); self.line2.push_str(Self::LINE2_PREFIX); } fn finish(mut self) -> String { self.new_line(); self.out } } #[test] fn test_pos_tagger() { snapshot::snapshot_all_text_files("tagged", ".md", |source, _| { let dict = FstDictionary::curated(); let document = Document::new_markdown_default(source, &dict); let mut formatter = Formatter::new(); for token in document.fat_string_tokens() { match token.kind { TokenKind::Space(_) => { /* ignore */ } TokenKind::ParagraphBreak => { formatter.new_line(); formatter.new_line(); } TokenKind::Newline(_) => { formatter.new_line(); } kind => { let text = &token.content; let tag = format_tag(&kind); formatter.add(text, &tag); } } } formatter.finish() }); } ================================================ FILE: harper-core/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::parsers::OrgMode; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; /// Creates a unit test checking that the linting of a Markdown document (in /// `tests_sources`) produces the expected number of lints. macro_rules! create_test { ($filename:ident.md, $correct_expected:expr, $dialect:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".md") ) ); let dict = FstDictionary::curated(); let document = Document::new_markdown_default(&source, &dict); let mut linter = LintGroup::new_curated(dict, $dialect); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } /// Creates a unit test checking that the linting of an Org mode document (in /// `tests_sources`) produces the expected number of lints. macro_rules! create_org_test { ($filename:ident.org, $correct_expected:expr, $dialect:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".org") ) ); let dict = FstDictionary::curated(); let document = Document::new(&source, &OrgMode, &dict); let mut linter = LintGroup::new_curated(dict, $dialect); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(whack_bullets.md, 1, Dialect::American); create_test!(issue_109.md, 0, Dialect::American); create_test!(issue_109_ext.md, 0, Dialect::American); create_test!(chinese_lorem_ipsum.md, 2, Dialect::American); create_test!(obsidian_links.md, 3, Dialect::American); create_test!(issue_267.md, 0, Dialect::American); create_test!(proper_noun_capitalization.md, 3, Dialect::American); create_test!(amazon_hostname.md, 0, Dialect::American); create_test!(issue_159.md, 1, Dialect::American); create_test!(issue_358.md, 0, Dialect::American); create_test!(issue_195.md, 0, Dialect::American); create_test!(issue_118.md, 0, Dialect::American); create_test!(lots_of_latin.md, 1, Dialect::American); create_test!(pr_504.md, 1, Dialect::American); create_test!(pr_452.md, 2, Dialect::American); create_test!(hex_basic_clean.md, 0, Dialect::American); create_test!(hex_basic_dirty.md, 1, Dialect::American); create_test!(misc_closed_compound_clean.md, 0, Dialect::American); create_test!(statist_localist.md, 0, Dialect::American); create_test!(yogurt_british_clean.md, 0, Dialect::British); create_test!(issue_1581.md, 0, Dialect::British); create_test!(issue_2054.md, 6, Dialect::British); create_test!(issue_1988.md, 0, Dialect::American); create_test!(issue_2054_clean.md, 0, Dialect::British); create_test!(issue_1873.md, 0, Dialect::British); create_test!(issue_2246.md, 0, Dialect::American); create_test!(title_case_errors.md, 2, Dialect::American); create_test!(title_case_clean.md, 0, Dialect::American); create_test!(issue_2233.md, 0, Dialect::American); create_test!(issue_2240.md, 0, Dialect::American); create_test!(allows_domain_extensions.md, 0, Dialect::American); // It just matters that it is > 1 create_test!(issue_2151.md, 4, Dialect::British); // Make sure it doesn't panic create_test!(lukas_homework.md, 4, Dialect::American); // Org mode tests create_org_test!(index.org, 49, Dialect::American); ================================================ FILE: harper-core/tests/snapshot.rs ================================================ use std::{ marker::Sync, path::{Path, PathBuf}, }; use harper_core::Dialect; use itertools::Itertools; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; fn get_tests_dir() -> PathBuf { PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests") } fn get_text_dir() -> PathBuf { get_tests_dir().join("text") } /// Tries to find a dialect override from a given file path. Returns `None` if the number of /// dialect overrides found is not 1. #[must_use] fn try_get_dialect_override(path: &Path) -> Option { path.file_stem()? .to_string_lossy() .split('.') .filter_map(Dialect::try_from_abbr) .exactly_one() // If we find multiple overrides, it's unlikely that a dialect override is intended. .ok() } pub fn get_text_files() -> Vec { let mut files = vec![]; for entry in std::fs::read_dir(get_text_dir()) .unwrap() .filter_map(|f| f.ok()) .filter(|f| f.metadata().unwrap().is_file()) { let path = entry.path(); let ext = path .extension() .map(|e| e.to_string_lossy().to_string()) .unwrap_or_default(); if matches!(ext.as_str(), "txt" | "md") { files.push(entry.path()); } } files } fn tag_file( text_file: &Path, snapshot_file: &Path, create_snapshot: impl Fn(&str, Option) -> String, ) -> Result<(), Box> { let source = std::fs::read_to_string(text_file)?.replace("\r\n", "\n"); let dialect_override = try_get_dialect_override(text_file); let tagged = create_snapshot(source.trim_end(), dialect_override); // compare with snapshot let has_snapshot = snapshot_file.exists(); if has_snapshot { let snapshot = std::fs::read_to_string(snapshot_file)?; if tagged == snapshot { return Ok(()); } } // write snapshot std::fs::write(snapshot_file, tagged)?; Err(if has_snapshot { "Snapshot mismatches!".into() } else { "No snapshot!".into() }) } fn get_snapshot_file(text_file: &Path, snapshot_dir: &Path, ext: &str) -> PathBuf { let snapshot_name = text_file.file_stem().unwrap().to_string_lossy().to_string() + ext; snapshot_dir.join(snapshot_name) } #[allow(dead_code)] pub fn snapshot_all_text_files( out_dir: &str, snapshot_ext: &str, create_snapshot: impl Copy + Fn(&str, Option) -> String + 'static + Sync, ) { let snapshot_dir = get_text_dir().join(out_dir); std::fs::create_dir_all(&snapshot_dir).expect("Failed to create snapshot directory"); let errors: u64 = get_text_files() .par_iter() .map(|text_file| { println!("Processing {}", text_file.display()); let snapshot_file = get_snapshot_file(text_file, &snapshot_dir, snapshot_ext); if let Err(e) = tag_file(text_file, &snapshot_file, create_snapshot) { eprintln!("Error processing {}: {}", text_file.display(), e); 1 } else { 0 } }) .sum(); if errors > 0 { panic!("{errors} errors occurred while processing files"); } } ================================================ FILE: harper-core/tests/test_sources/allows_domain_extensions.md ================================================ I would love a .ai domain. I would love a .app domain. I would love a .blog domain. I would love a .co domain. I would love a .com domain. I would love a .dev domain. I would love a .edu domain. I would love a .gov domain. I would love a .info domain. I would love a .io domain. I would love a .me domain. I would love a .mil domain. I would love a .net domain. I would love a .org domain. I would love a .shop domain. I would love a .tech domain. I would love a .uk domain. I would love a .us domain. I would love a .xyz domain. ================================================ FILE: harper-core/tests/test_sources/amazon_hostname.md ================================================ This is a test of whether Amazon.com is considered a URI. ================================================ FILE: harper-core/tests/test_sources/chinese_lorem_ipsum.md ================================================ The following text was generated using [a Chinese lorem ipsum generator](https://pinkylam.me/generator/chinese-lorem-ipsum/). 食棵支每躲種。奶象打星爪子二細喜才記行在發像原斤!頁固點子衣點豆看身蝴看苗急午公何足,筆娘經色蝶行元香也要。麻了綠尼固世,色北書目登功;因告黑。 從下由服行巴登魚,棵苦亮珠春用訴星比都由發丟法主犬水現,能國書午錯馬吹隻幾外。筆泉可去牙用同貝步登娘毛完且哭,北巴種化吃石正由讀借示!幸造愛扒,才怕至成下。 亮您紅星浪中兩安乙菜上做玉做火愛玩植結面,蝴哭往兒完哥封波在,林春田早次王同月清丁筆道兩請玩燈們唱。 十兌雞做喜木發屋害要書目把麼早父方從以。冰正共片海告假衣夏冒吃戊很口松牠室肖。斗門看登給畫聽斤婆品歡個。 澡弓兩化員把戊各但他用親!給好校魚火包,根朵告幫着道具象海太或文苗。西首友雞頭、我跳花發,可功才門田訴去首或行。 吧都上午京主根相由或想、澡快送哭麻細麻白言原風童乍外、右更新一婆幸七片院。教刀麻哥幾在同四就遠新來長喜呢雪:兒時貓千十門功玩刀比。媽習出才,借食乞原成欠波米掃古校良具們昔!少學刀工火入。 兔追找古裏雞喜假經南瓜枝未發發几!菜書共媽申欠彩因到「金羊昌追秋才着海隻」雪像麻孝亮乞土點首事向往!知瓜祖。 因主很貫唱重目刃右,封飯房屋造土都犬帶刃抱他重他冬幸以坡十雲?跳肖頭反入小坐歡院帶士自央。 ================================================ FILE: harper-core/tests/test_sources/hex_basic_clean.md ================================================ If p is an `int*`, and `p = 0x1000`, what is the value of `p+3`? _0x100C_ ================================================ FILE: harper-core/tests/test_sources/hex_basic_dirty.md ================================================ If p is an `int*`, and `p = 0x1000`, what is the value of `p+3`? _0x100C_ asdkjd ================================================ FILE: harper-core/tests/test_sources/index.org ================================================ #+OPTIONS: H:9 ^:nil * Nvim Orgmode Nvim orgmode is a clone of Emacs Orgmode for Neovim 0.10.3+. It aims to be a feature-complete implementation of Orgmode features in Neovim. Online version of this documentation is available at [[https://nvim-orgmode.github.io]]. To view this documentation offline in Neovim, run =:Org help=. More info in [[#globals-and-commands][Globals and commands]] section. ** Quick start :PROPERTIES: :CUSTOM_ID: quick-start :END: - Install with [[https://github.com/folke/lazy.nvim][lazy.nvim]]: #+begin_src lua { 'nvim-orgmode/orgmode', event = 'VeryLazy', config = function() -- Setup orgmode require('orgmode').setup({ org_agenda_files = '~/orgfiles/**/*', org_default_notes_file = '~/orgfiles/refile.org', }) end, } #+end_src - Capture your first note with =oc= - Open up the prompt for agenda with =oa= For more details about the installation and usage, check [[./installation.org][Installation page]]. To see all configuration options, check [[file:./configuration.org][Configuration page]]. ** Getting started with orgmode :PROPERTIES: :CUSTOM_ID: getting-started :END: To get a basic idea how Orgmode works, check our hands-on [[file:./tutorial.org][tutorial]]. You can also check this screencast from [[https://github.com/dhruvasagar][@dhruvasagar]] that demonstrates how the similar Orgmode clone [[https://github.com/dhruvasagar/vim-dotoo][vim-dotoo]] works. [[https://www.youtube.com/watch?v=nsv33iOnH34]] ** API docs :PROPERTIES: :CUSTOM_ID: api-docs :END: Nvim-orgmode exposes a Lua API that can be used to interact with the orgmode. To view it, check [[file:../doc/orgmode_api.txt][orgmode_api.txt]] or do =:h OrgApi= in Neovim. ** Globals and commands :PROPERTIES: :CUSTOM_ID: globals-and-commands :END: There are 2 additional ways to interact with Orgmode: 1. Through the =:Org= command 2. Through =Org= Lua global variable List of available actions: - =:Org help= - Open this documentation in new tab, set working directory to the doc's folder for the tab to allow browsing - =:Org helpgrep= - Open search agenda view that allows searching through the documentation - =:Org agenda {type?}= - Open agenda view by the shortcut, for example =:Org agenda M= will open =tags_todo= view. When =type= is omitted, it opens up Agenda view. - =:Org capture {type?}= - Open capture template by the shortcut, for example =:Org capture t=. When =type= is omitted, it opens up Capture prompt. - =:Org install_treesitter_grammar= - Install the treesitter grammar for Orgmode. If installed, prompt to reinstall. Grammar is installed automatically on first run, but this is useful in case when there are issues with the grammar. - =:Org store_link= - [[file:./configuration.org::#org_store_link][Store link]] to the headline under cursor. Works in both agenda and org files. - =:Org indent_mode= - Toggle virtual indent mode in the current buffer. See [[file:./configuration.org::#org_startup_indented][osg_startup_indented]] for additional info. All of the commands above can be executed through the global Lua =Org= variable. Examples: - =Org.help()= - =Org.helpgrep()= - =Org.install_treesitter_grammar()= - =Org.store_link()= - =Org.indent_mode()= - =Org.agenda()= - Opens =agenda= prompt - =Org.agenda.m()= - Opens =tags= view - =Org.capture()= - Opens capture prompt - =Org.capture.t()= - Opens capture template for =t= shortcut ================================================ FILE: harper-core/tests/test_sources/issue_109.md ================================================ 本文档是使用 Microsoft Translate 翻译的。哈珀根本不应该抱怨。 ================================================ FILE: harper-core/tests/test_sources/issue_109_ext.md ================================================ # 이것은 제목 ## 이것은 소제목 이것이 본문이다 옛날 옛적 깊은 산 속에 가난하지만 사이좋은 오누이와 그 홀어머니 가족이 살고 있었다. 오누이의 아버지는 일찍 세상을 떠났고, 어머니 혼자 집으로부터 몇 고개를 넘어가야 나오는 먼 거리의 장터에 떡(인절미)을 내다 파는 일을 하며 생계를 책임지고 있었다. 어느 날, 어머니가 장터로 떡을 팔러 가게 되었다. 어머니는 애들만 두고 가려니까 걱정이 되어서 아무한테나 함부로 문 열어주지 말라고 애들에게 신신당부했다. 그렇게 늦은 밤, 장터에서 팔다 남은 떡을 가지고 집으로 돌아오는 길. 어머니는 첫번째 고개에서 호랑이를 만났고, 호랑이가 "떡 하나 주면 안 잡아먹지."라고 위협하자 어머니는 벌벌 떨면서 떡을 하나 던져줬다. 그 떡을 먹고 가버린 줄 알았으나, 호랑이는 어머니가 고개를 하나하나 넘을 때마다 계속해서 똑같이 나타나 똑같은 대사를 반복하며 떡을 하나씩 뺏어먹었고 떡이 떨어지자 결국 어머니까지 잡아먹는 만행까지 저질렀다. 그러고도 배가 덜 찼는지 아예 오누이까지 잡아먹으려고 어머니의 옷을 입고 위장을 한 채로 그 집을 찾아갔다. 아직 어린 여동생 달님은 대뜸 문 밖 발소리만 듣고 어머니가 온 줄 알고 기뻐하며 바로 문을 열려 했지만, 판단력이 있었던 오빠 해님은 여동생을 제지한 후 목소리를 내서 어머니인 것을 증명해 보라고 단호하게 말했다. 하지만 호랑이의 목소리가 사람의 목소리처럼 나올 순 없는 법이었다. 호랑이는 목이 쉬어서 그렇다며 핑계댔고, 이에 오빠가 이번에는 손을 내밀어 보라고 했다. 그 말에 호랑이가 문풍지를 뚫고 앞발을 보여주었지만, 이에 오빠는 이것은 엄마의 손이 절대로 아니라며 의심하자 호랑이는 오랜 시간 동안 일을 해서 손이 거칠어졌다며 또 둘러댔다.[1] 그러나 문풍지 구멍 밖으로 보이는 호랑이의 희번덕한 노란 눈을 보자마자 오누이는 그 정체가 알고 보니 호랑이였다는 것을 비로소 알아차렸으며, 엄마가 이 호랑이에 의해 잡아먹힌 것을 알고, 몰래 뒷문으로 빠져나와 나무 위로 몸을 피했다. 호랑이는 나무 위로 간 오누이를 찾지 못하다가, 바로 옆의 우물에 오누이가 비친 모습을 발견했다. 이에 호랑이가 부드럽게 "얘들아, 거긴 어떻게 올라갔니?" 하고 묻자 오빠가 "손발에 참기름을 바르고 올라왔지!"라고 거짓말을 했다.[2] 이에 호랑이는 그 말만 듣고 어리석게도 곧바로 부엌에 가서 발에 참기름을 바르고 왔지만, 당연히 미끌미끌한 참기름 때문에 자꾸만 나무 줄기에서 미끄러져 구르기만 했다. 이런 호랑이를 보면서 오누이는 어느새 무서움도 잊고 웃음을 터뜨렸다. 그러다가 신나게 웃던 동생이 자기도 모르게 "멍청하기는! 도끼로 나무를 찍으며 올라오면 쉽게 올라올 수 있는 것을!"이라고 올라오는 방법을 발설하자 정신을 차린 동생이 얼른 손으로 입을 막았지만[3], 호랑이는 이미 그걸 들어버린 뒤라 잽싸게 도끼를 꺼내들고 와서 나무를 쿵쿵 찍으며 올라오기 시작했다. 오누이는 호랑이를 피해 계속 올라가 나무의 꼭대기까지 다다랐고 더 이상 올라갈 곳이 없어지자 오누이는 지푸라기라도 잡는 심정으로 눈물을 흘리며 하늘을 향해 싹싹 빌기 시작했다. ================================================ FILE: harper-core/tests/test_sources/issue_118.md ================================================ This is another sentence that says item 1, item 2, etc. in the middle of the sentence. ================================================ FILE: harper-core/tests/test_sources/issue_1581.md ================================================ Simple walkthroughs with... The above phrase supposedly threw an error in an older version of Harper. ================================================ FILE: harper-core/tests/test_sources/issue_159.md ================================================ The file in question was myfile.txt, and it was glorious. It was referenced by https://pax.grsecurity.net/docs/pageexec.old.txt. this is another test for the sentence capitalization. ================================================ FILE: harper-core/tests/test_sources/issue_1873.md ================================================ TeX is a typesetting system. ================================================ FILE: harper-core/tests/test_sources/issue_195.md ================================================ If we have words with numbers in them, like IPv4, they should get marked as just that: words. ================================================ FILE: harper-core/tests/test_sources/issue_1988.md ================================================ When this test is run, it returns a result. ================================================ FILE: harper-core/tests/test_sources/issue_2054.md ================================================ I really enjoy a good ui or gui. When developer put time and effort into a good ux, I feel so much more productive. ================================================ FILE: harper-core/tests/test_sources/issue_2054_clean.md ================================================ I really enjoy a good UI or GUI. When developer put time and effort into a good UX, I feel so much more productive. ================================================ FILE: harper-core/tests/test_sources/issue_2151.md ================================================ Are cloudflare and CloudFlare incorrect? ================================================ FILE: harper-core/tests/test_sources/issue_2233.md ================================================ In foobar, apple is a fruit, and "beer" is not a fruit. ================================================ FILE: harper-core/tests/test_sources/issue_2240.md ================================================ There is no more need to run `git`. ================================================ FILE: harper-core/tests/test_sources/issue_2246.md ================================================ But current implementations will likely be bypassable. ================================================ FILE: harper-core/tests/test_sources/issue_267.md ================================================

What did you learn from the assignment? Were there any special insights you had? What did you find that you already knew?

================================================ FILE: harper-core/tests/test_sources/issue_358.md ================================================ The total number of pixels in the image pertains to a one channel image. ================================================ FILE: harper-core/tests/test_sources/lots_of_latin.md ================================================ We had some issues with correctly parsing certain Latin terms. It caused issues with phrases like, "it was Mike Tyson vs. Weird Al!" and "Mike Tyson et al. wrote this paper," etc., especially for scientific papers. ================================================ FILE: harper-core/tests/test_sources/lukas_homework.md ================================================ # Native American Assimilation and Activism Week Two Reflection > This is the first in a bi-weekly series that I will be publishing for my Native American Assimilation and Activism class. Every two weeks we make posts sharing what we learned in the class. Unfortunately, due to weather in England I was unable to make it back to the United States in time for the first lecture. One of the key discussions in Monday's lecture/discussion was since time immemorial and teaching around that. Time Immemorium is a period before human memory, and involved other human species, travel stories, and creation stories. Some of the key lessons I learned from that class were: * Humans branched from some common ancestor that had multiple other human species branch off * We are not evolved from chimps but also have a shared ancestor * Many genetic evolutional specializations have to do with environmental adaptation * Some of these adaptations were shared when isolated groups had visitors (Weaving rivers theory) * Also related: Intergenerational Trauma Oregon and Washington have been leading the country when it comes to integrating Native Americans into their school curriculum. This includes adding Since Time Immemorium curriculum. These advances have the possibility to significantly improve the awareness and appreciation of Native American Peoples who have and still live in these lands. ================================================ FILE: harper-core/tests/test_sources/misc_closed_compound_clean.md ================================================ It's hidden right here under the carpet. I got there after him. Go back there after dinner and finish it. We've gotta go down right here. I hereby state that I got here by way of the "issues" link. It's over there in that box. I'll still be here after work. I'll meet you here after work. ================================================ FILE: harper-core/tests/test_sources/obsidian_links.md ================================================ # Example Obsidian Links Below, you will find a number of example links that Obsidian is able to process. These should be treated as normal Markdown links. The things inside the square brackets are visible and should be checked by Harper. [[Three lws of motion]] [Three las of motion](Three%20laws%20of%20motion.md) Wikilinks allow you to replace the visible text with a pipe (|) operator. The text to the left of the operator should be ignored. [[lnk tget|Link Text]] ================================================ FILE: harper-core/tests/test_sources/pr_452.md ================================================ Lets go and check if this lint let's us catch this class of errors. ================================================ FILE: harper-core/tests/test_sources/pr_504.md ================================================ These say "This is in Greek/Georgian/Thai" in those languages: Αυτό είναι στα ελληνικά. ეს ქართულად. นี่มันภาษาไทย This is English with misstakess. ================================================ FILE: harper-core/tests/test_sources/proper_noun_capitalization.md ================================================ Apple watch should have been capitalized here. Similarly, amazon web seRVices should have been capitalized differently here. ================================================ FILE: harper-core/tests/test_sources/statist_localist.md ================================================ These villages run the gamut from statist too localist. Their pedigree can be traced back to Plato, the father of statism. But the localism of France at the time should not be underestimated. ================================================ FILE: harper-core/tests/test_sources/title_case_clean.md ================================================ # Here, We Try to Test Our Title-Casing Feature It should only pay attention to headings. ## Maybe It Works? There will be a similar file with the corrected headings. ================================================ FILE: harper-core/tests/test_sources/title_case_errors.md ================================================ # Here, we try to test our title-casing feature It should only pay attention to headings. ## Maybe it works? There will be a similar file with the corrected headings. ================================================ FILE: harper-core/tests/test_sources/whack_bullets.md ================================================ # This Is a Big Heading, with a Lot of Words - New here's a list, this part doesn't have as many words - But this part does, it has so many words, more words than you could ever dream of Just look at all those words - So does this part, I might be overwhelmed with all these words - This is an test to make sure it isn't crashing ================================================ FILE: harper-core/tests/test_sources/yogurt_british_clean.md ================================================ The following essay should produce no errors when Harper is set to British English. Yoghurt, a simple yet remarkably versatile food, has a rich history that stretches back thousands of years. Originating from the ancient civilizations of the Middle East and Central Asia, yoghurt has transcended geographical boundaries, becoming a staple in diets around the globe. Historically, yoghurt was discovered by chance, likely from milk stored in warm climates naturally turning into a cultured product. This process, involving beneficial bacteria, not only preserves milk but also enhances its nutritional value, digestibility, and flavour. Over centuries, yoghurt evolved from a basic dietary component into a diverse food enjoyed in numerous culinary traditions. The versatility of yoghurt is evident in its varied uses across different cuisines. In Mediterranean and Middle Eastern dishes, yoghurt often accompanies savoury meals, acting as a refreshing complement to spicy flavours. Tzatziki, a blend of yoghurt, cucumber, garlic, and mint, exemplifies this culinary tradition. Similarly, Indian cuisine features yoghurt prominently, using it as the base for marinades. Yoghurt is not just a savoury food; it is equally embraced in sweet dishes. Its creamy texture and tangy taste make it ideal for desserts, smoothies, and breakfast dishes. In European countries, yoghurt mixed with fresh fruit, granola, and honey is a popular breakfast or snack option, providing a nutritious and delicious start to the day. Nutritionally, yoghurt is celebrated for its health benefits. It is rich in protein, calcium, vitamins, and probiotics—live bacteria that support digestive health and immune function. These beneficial bacteria contribute to maintaining a balanced gut microbiome, essential for overall wellness. The popularity of yoghurt has further increased with rising consumer awareness about gut health and nutrition, fuelling innovations in dairy and plant-based yoghurt alternatives. The production methods of yoghurt have evolved significantly over time, from traditional artisanal practices to advanced industrial techniques. Modern yoghurt manufacturing employs precise control of temperature, bacterial cultures, and incubation processes to ensure consistent quality, taste, and nutritional content. Additionally, innovations in packaging and preservation have expanded yoghurt's accessibility and convenience, making it an ubiquitous presence in supermarkets worldwide. However, yoghurt production and consumption also present certain challenges. Concerns around sustainability, environmental impact, and ethical dairy farming practices have encouraged a shift toward organic and plant-based alternatives. This has spurred market growth for nondairy yoghurts made from ingredients such as coconut, almond, oat, and soy, reflecting evolving consumer preferences and dietary needs. In conclusion, yoghurt is much more than a simple dairy product—it is a cultural and nutritional cornerstone that continues to adapt and thrive across global culinary traditions. Its enduring popularity is a testament to its delicious versatility, health benefits, and adaptability to changing dietary trends, ensuring yoghurt's continued prominence in diets around the world. ================================================ FILE: harper-core/tests/text/Alice's Adventures in Wonderland.md ================================================ # Alice’s Adventures in Wonderland by Lewis Carroll THE MILLENNIUM FULCRUM EDITION 3.0 ## CHAPTER I: Down the Rabbit-Hole Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, “and what is the use of a book,” thought Alice “without pictures or conversations?” So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a White Rabbit with pink eyes ran close by her. There was nothing so very remarkable in that; nor did Alice think it so very much out of the way to hear the Rabbit say to itself, “Oh dear! Oh dear! I shall be late!” (when she thought it over afterwards, it occurred to her that she ought to have wondered at this, but at the time it all seemed quite natural); but when the Rabbit actually took a watch out of its waistcoat-pocket, and looked at it, and then hurried on, Alice started to her feet, for it flashed across her mind that she had never before seen a rabbit with either a waistcoat-pocket, or a watch to take out of it, and burning with curiosity, she ran across the field after it, and fortunately was just in time to see it pop down a large rabbit-hole under the hedge. In another moment down went Alice after it, never once considering how in the world she was to get out again. The rabbit-hole went straight on like a tunnel for some way, and then dipped suddenly down, so suddenly that Alice had not a moment to think about stopping herself before she found herself falling down a very deep well. Either the well was very deep, or she fell very slowly, for she had plenty of time as she went down to look about her and to wonder what was going to happen next. First, she tried to look down and make out what she was coming to, but it was too dark to see anything; then she looked at the sides of the well, and noticed that they were filled with cupboards and book-shelves; here and there she saw maps and pictures hung upon pegs. She took down a jar from one of the shelves as she passed; it was labelled “ORANGE MARMALADE”, but to her great disappointment it was empty: she did not like to drop the jar for fear of killing somebody underneath, so managed to put it into one of the cupboards as she fell past it. “Well!” thought Alice to herself, “after such a fall as this, I shall think nothing of tumbling down stairs! How brave they’ll all think me at home! Why, I wouldn’t say anything about it, even if I fell off the top of the house!” (Which was very likely true.) Down, down, down. Would the fall never come to an end? “I wonder how many miles I’ve fallen by this time?” she said aloud. “I must be getting somewhere near the centre of the earth. Let me see: that would be four thousand miles down, I think—” (for, you see, Alice had learnt several things of this sort in her lessons in the schoolroom, and though this was not a very good opportunity for showing off her knowledge, as there was no one to listen to her, still it was good practice to say it over) “—yes, that’s about the right distance—but then I wonder what Latitude or Longitude I’ve got to?” (Alice had no idea what Latitude was, or Longitude either, but thought they were nice grand words to say.) Presently she began again. “I wonder if I shall fall right through the earth! How funny it’ll seem to come out among the people that walk with their heads downward! The Antipathies, I think—” (she was rather glad there was no one listening, this time, as it didn’t sound at all the right word) “—but I shall have to ask them what the name of the country is, you know. Please, Ma’am, is this New Zealand or Australia?” (and she tried to curtsey as she spoke—fancy curtseying as you’re falling through the air! Do you think you could manage it?) “And what an ignorant little girl she’ll think me for asking! No, it’ll never do to ask: perhaps I shall see it written up somewhere.” Down, down, down. There was nothing else to do, so Alice soon began talking again. “Dinah’ll miss me very much to-night, I should think!” (Dinah was the cat.) “I hope they’ll remember her saucer of milk at tea-time. Dinah my dear! I wish you were down here with me! There are no mice in the air, I’m afraid, but you might catch a bat, and that’s very like a mouse, you know. But do cats eat bats, I wonder?” And here Alice began to get rather sleepy, and went on saying to herself, in a dreamy sort of way, “Do cats eat bats? Do cats eat bats?” and sometimes, “Do bats eat cats?” for, you see, as she couldn’t answer either question, it didn’t much matter which way she put it. She felt that she was dozing off, and had just begun to dream that she was walking hand in hand with Dinah, and saying to her very earnestly, “Now, Dinah, tell me the truth: did you ever eat a bat?” when suddenly, thump! thump! down she came upon a heap of sticks and dry leaves, and the fall was over. Alice was not a bit hurt, and she jumped up on to her feet in a moment: she looked up, but it was all dark overhead; before her was another long passage, and the White Rabbit was still in sight, hurrying down it. There was not a moment to be lost: away went Alice like the wind, and was just in time to hear it say, as it turned a corner, “Oh my ears and whiskers, how late it’s getting!” She was close behind it when she turned the corner, but the Rabbit was no longer to be seen: she found herself in a long, low hall, which was lit up by a row of lamps hanging from the roof. There were doors all round the hall, but they were all locked; and when Alice had been all the way down one side and up the other, trying every door, she walked sadly down the middle, wondering how she was ever to get out again. Suddenly she came upon a little three-legged table, all made of solid glass; there was nothing on it except a tiny golden key, and Alice’s first thought was that it might belong to one of the doors of the hall; but, alas! either the locks were too large, or the key was too small, but at any rate it would not open any of them. However, on the second time round, she came upon a low curtain she had not noticed before, and behind it was a little door about fifteen inches high: she tried the little golden key in the lock, and to her great delight it fitted! Alice opened the door and found that it led into a small passage, not much larger than a rat-hole: she knelt down and looked along the passage into the loveliest garden you ever saw. How she longed to get out of that dark hall, and wander about among those beds of bright flowers and those cool fountains, but she could not even get her head through the doorway; “and even if my head would go through,” thought poor Alice, “it would be of very little use without my shoulders. Oh, how I wish I could shut up like a telescope! I think I could, if I only knew how to begin.” For, you see, so many out-of-the-way things had happened lately, that Alice had begun to think that very few things indeed were really impossible. There seemed to be no use in waiting by the little door, so she went back to the table, half hoping she might find another key on it, or at any rate a book of rules for shutting people up like telescopes: this time she found a little bottle on it, (“which certainly was not here before,” said Alice,) and round the neck of the bottle was a paper label, with the words “DRINK ME,” beautifully printed on it in large letters. It was all very well to say “Drink me,” but the wise little Alice was not going to do that in a hurry. “No, I’ll look first,” she said, “and see whether it’s marked ‘poison’ or not”; for she had read several nice little histories about children who had got burnt, and eaten up by wild beasts and other unpleasant things, all because they would not remember the simple rules their friends had taught them: such as, that a red-hot poker will burn you if you hold it too long; and that if you cut your finger very deeply with a knife, it usually bleeds; and she had never forgotten that, if you drink much from a bottle marked “poison,” it is almost certain to disagree with you, sooner or later. However, this bottle was not marked “poison,” so Alice ventured to taste it, and finding it very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, custard, pine-apple, roast turkey, toffee, and hot buttered toast,) she very soon finished it off. “What a curious feeling!” said Alice; “I must be shutting up like a telescope.” And so it was indeed: she was now only ten inches high, and her face brightened up at the thought that she was now the right size for going through the little door into that lovely garden. First, however, she waited for a few minutes to see if she was going to shrink any further: she felt a little nervous about this; “for it might end, you know,” said Alice to herself, “in my going out altogether, like a candle. I wonder what I should be like then?” And she tried to fancy what the flame of a candle is like after the candle is blown out, for she could not remember ever having seen such a thing. After a while, finding that nothing more happened, she decided on going into the garden at once; but, alas for poor Alice! when she got to the door, she found she had forgotten the little golden key, and when she went back to the table for it, she found she could not possibly reach it: she could see it quite plainly through the glass, and she tried her best to climb up one of the legs of the table, but it was too slippery; and when she had tired herself out with trying, the poor little thing sat down and cried. “Come, there’s no use in crying like that!” said Alice to herself, rather sharply; “I advise you to leave off this minute!” She generally gave herself very good advice, (though she very seldom followed it), and sometimes she scolded herself so severely as to bring tears into her eyes; and once she remembered trying to box her own ears for having cheated herself in a game of croquet she was playing against herself, for this curious child was very fond of pretending to be two people. “But it’s no use now,” thought poor Alice, “to pretend to be two people! Why, there’s hardly enough of me left to make one respectable person!” Soon her eye fell on a little glass box that was lying under the table: she opened it, and found in it a very small cake, on which the words “EAT ME” were beautifully marked in currants. “Well, I’ll eat it,” said Alice, “and if it makes me grow larger, I can reach the key; and if it makes me grow smaller, I can creep under the door; so either way I’ll get into the garden, and I don’t care which happens!” She ate a little bit, and said anxiously to herself, “Which way? Which way?”, holding her hand on the top of her head to feel which way it was growing, and she was quite surprised to find that she remained the same size: to be sure, this generally happens when one eats cake, but Alice had got so much into the way of expecting nothing but out-of-the-way things to happen, that it seemed quite dull and stupid for life to go on in the common way. So she set to work, and very soon finished off the cake. ## CHAPTER II: The Pool of Tears “Curiouser and curiouser!” cried Alice (she was so much surprised, that for the moment she quite forgot how to speak good English); “now I’m opening out like the largest telescope that ever was! Good-bye, feet!” (for when she looked down at her feet, they seemed to be almost out of sight, they were getting so far off). “Oh, my poor little feet, I wonder who will put on your shoes and stockings for you now, dears? I’m sure I shan’t be able! I shall be a great deal too far off to trouble myself about you: you must manage the best way you can;—but I must be kind to them,” thought Alice, “or perhaps they won’t walk the way I want to go! Let me see: I’ll give them a new pair of boots every Christmas.” And she went on planning to herself how she would manage it. “They must go by the carrier,” she thought; “and how funny it’ll seem, sending presents to one’s own feet! And how odd the directions will look! > Alice’s Right Foot, Esq., Hearthrug, near the Fender, (with Alice’s love). Oh dear, what nonsense I’m talking!” Just then her head struck against the roof of the hall: in fact she was now more than nine feet high, and she at once took up the little golden key and hurried off to the garden door. Poor Alice! It was as much as she could do, lying down on one side, to look through into the garden with one eye; but to get through was more hopeless than ever: she sat down and began to cry again. “You ought to be ashamed of yourself,” said Alice, “a great girl like you,” (she might well say this), “to go on crying in this way! Stop this moment, I tell you!” But she went on all the same, shedding gallons of tears, until there was a large pool all round her, about four inches deep and reaching half down the hall. After a time she heard a little pattering of feet in the distance, and she hastily dried her eyes to see what was coming. It was the White Rabbit returning, splendidly dressed, with a pair of white kid gloves in one hand and a large fan in the other: he came trotting along in a great hurry, muttering to himself as he came, “Oh! the Duchess, the Duchess! Oh! won’t she be savage if I’ve kept her waiting!” Alice felt so desperate that she was ready to ask help of any one; so, when the Rabbit came near her, she began, in a low, timid voice, “If you please, sir—” The Rabbit started violently, dropped the white kid gloves and the fan, and skurried away into the darkness as hard as he could go. Alice took up the fan and gloves, and, as the hall was very hot, she kept fanning herself all the time she went on talking: “Dear, dear! How queer everything is to-day! And yesterday things went on just as usual. I wonder if I’ve been changed in the night? Let me think: was I the same when I got up this morning? I almost think I can remember feeling a little different. But if I’m not the same, the next question is, Who in the world am I? Ah, that’s the great puzzle!” And she began thinking over all the children she knew that were of the same age as herself, to see if she could have been changed for any of them. “I’m sure I’m not Ada,” she said, “for her hair goes in such long ringlets, and mine doesn’t go in ringlets at all; and I’m sure I can’t be Mabel, for I know all sorts of things, and she, oh! she knows such a very little! Besides, she’s she, and I’m I, and—oh dear, how puzzling it all is! I’ll try if I know all the things I used to know. Let me see: four times five is twelve, and four times six is thirteen, and four times seven is—oh dear! I shall never get to twenty at that rate! However, the Multiplication Table doesn’t signify: let’s try Geography. London is the capital of Paris, and Paris is the capital of Rome, and Rome—no, that’s all wrong, I’m certain! I must have been changed for Mabel! I’ll try and say ‘How doth the little—’” and she crossed her hands on her lap as if she were saying lessons, and began to repeat it, but her voice sounded hoarse and strange, and the words did not come the same as they used to do:— > “How doth the little crocodile Improve his shining tail, And pour the waters > of the Nile On every golden scale! > > “How cheerfully he seems to grin, How neatly spread his claws, And welcome > little fishes in With gently smiling jaws!” “I’m sure those are not the right words,” said poor Alice, and her eyes filled with tears again as she went on, “I must be Mabel after all, and I shall have to go and live in that poky little house, and have next to no toys to play with, and oh! ever so many lessons to learn! No, I’ve made up my mind about it; if I’m Mabel, I’ll stay down here! It’ll be no use their putting their heads down and saying ‘Come up again, dear!’ I shall only look up and say ‘Who am I then? Tell me that first, and then, if I like being that person, I’ll come up: if not, I’ll stay down here till I’m somebody else’—but, oh dear!” cried Alice, with a sudden burst of tears, “I do wish they would put their heads down! I am so very tired of being all alone here!” As she said this she looked down at her hands, and was surprised to see that she had put on one of the Rabbit’s little white kid gloves while she was talking. “How can I have done that?” she thought. “I must be growing small again.” She got up and went to the table to measure herself by it, and found that, as nearly as she could guess, she was now about two feet high, and was going on shrinking rapidly: she soon found out that the cause of this was the fan she was holding, and she dropped it hastily, just in time to avoid shrinking away altogether. “That was a narrow escape!” said Alice, a good deal frightened at the sudden change, but very glad to find herself still in existence; “and now for the garden!” and she ran with all speed back to the little door: but, alas! the little door was shut again, and the little golden key was lying on the glass table as before, “and things are worse than ever,” thought the poor child, “for I never was so small as this before, never! And I declare it’s too bad, that it is!” As she said these words her foot slipped, and in another moment, splash! she was up to her chin in salt water. Her first idea was that she had somehow fallen into the sea, “and in that case I can go back by railway,” she said to herself. (Alice had been to the seaside once in her life, and had come to the general conclusion, that wherever you go to on the English coast you find a number of bathing machines in the sea, some children digging in the sand with wooden spades, then a row of lodging houses, and behind them a railway station.) However, she soon made out that she was in the pool of tears which she had wept when she was nine feet high. “I wish I hadn’t cried so much!” said Alice, as she swam about, trying to find her way out. “I shall be punished for it now, I suppose, by being drowned in my own tears! That will be a queer thing, to be sure! However, everything is queer to-day.” Just then she heard something splashing about in the pool a little way off, and she swam nearer to make out what it was: at first she thought it must be a walrus or hippopotamus, but then she remembered how small she was now, and she soon made out that it was only a mouse that had slipped in like herself. “Would it be of any use, now,” thought Alice, “to speak to this mouse? Everything is so out-of-the-way down here, that I should think very likely it can talk: at any rate, there’s no harm in trying.” So she began: “O Mouse, do you know the way out of this pool? I am very tired of swimming about here, O Mouse!” (Alice thought this must be the right way of speaking to a mouse: she had never done such a thing before, but she remembered having seen in her brother’s Latin Grammar, “A mouse—of a mouse—to a mouse—a mouse—O mouse!”) The Mouse looked at her rather inquisitively, and seemed to her to wink with one of its little eyes, but it said nothing. “Perhaps it doesn’t understand English,” thought Alice; “I daresay it’s a French mouse, come over with William the Conqueror.” (For, with all her knowledge of history, Alice had no very clear notion how long ago anything had happened.) So she began again: “Où est ma chatte?” which was the first sentence in her French lesson-book. The Mouse gave a sudden leap out of the water, and seemed to quiver all over with fright. “Oh, I beg your pardon!” cried Alice hastily, afraid that she had hurt the poor animal’s feelings. “I quite forgot you didn’t like cats.” “Not like cats!” cried the Mouse, in a shrill, passionate voice. “Would you like cats if you were me?” “Well, perhaps not,” said Alice in a soothing tone: “don’t be angry about it. And yet I wish I could show you our cat Dinah: I think you’d take a fancy to cats if you could only see her. She is such a dear quiet thing,” Alice went on, half to herself, as she swam lazily about in the pool, “and she sits purring so nicely by the fire, licking her paws and washing her face—and she is such a nice soft thing to nurse—and she’s such a capital one for catching mice—oh, I beg your pardon!” cried Alice again, for this time the Mouse was bristling all over, and she felt certain it must be really offended. “We won’t talk about her any more if you’d rather not.” “We indeed!” cried the Mouse, who was trembling down to the end of his tail. “As if I would talk on such a subject! Our family always hated cats: nasty, low, vulgar things! Don’t let me hear the name again!” “I won’t indeed!” said Alice, in a great hurry to change the subject of conversation. “Are you—are you fond—of—of dogs?” The Mouse did not answer, so Alice went on eagerly: “There is such a nice little dog near our house I should like to show you! A little bright-eyed terrier, you know, with oh, such long curly brown hair! And it’ll fetch things when you throw them, and it’ll sit up and beg for its dinner, and all sorts of things—I can’t remember half of them—and it belongs to a farmer, you know, and he says it’s so useful, it’s worth a hundred pounds! He says it kills all the rats and—oh dear!” cried Alice in a sorrowful tone, “I’m afraid I’ve offended it again!” For the Mouse was swimming away from her as hard as it could go, and making quite a commotion in the pool as it went. So she called softly after it, “Mouse dear! Do come back again, and we won’t talk about cats or dogs either, if you don’t like them!” When the Mouse heard this, it turned round and swam slowly back to her: its face was quite pale (with passion, Alice thought), and it said in a low trembling voice, “Let us get to the shore, and then I’ll tell you my history, and you’ll understand why it is I hate cats and dogs.” It was high time to go, for the pool was getting quite crowded with the birds and animals that had fallen into it: there were a Duck and a Dodo, a Lory and an Eaglet, and several other curious creatures. Alice led the way, and the whole party swam to the shore. ## CHAPTER III: A Caucus-Race and a Long Tale They were indeed a queer-looking party that assembled on the bank—the birds with draggled feathers, the animals with their fur clinging close to them, and all dripping wet, cross, and uncomfortable. The first question of course was, how to get dry again: they had a consultation about this, and after a few minutes it seemed quite natural to Alice to find herself talking familiarly with them, as if she had known them all her life. Indeed, she had quite a long argument with the Lory, who at last turned sulky, and would only say, “I am older than you, and must know better;” and this Alice would not allow without knowing how old it was, and, as the Lory positively refused to tell its age, there was no more to be said. At last the Mouse, who seemed to be a person of authority among them, called out, “Sit down, all of you, and listen to me! I’ll soon make you dry enough!” They all sat down at once, in a large ring, with the Mouse in the middle. Alice kept her eyes anxiously fixed on it, for she felt sure she would catch a bad cold if she did not get dry very soon. “Ahem!” said the Mouse with an important air, “are you all ready? This is the driest thing I know. Silence all round, if you please! ‘William the Conqueror, whose cause was favoured by the pope, was soon submitted to by the English, who wanted leaders, and had been of late much accustomed to usurpation and conquest. Edwin and Morcar, the earls of Mercia and Northumbria—’” “Ugh!” said the Lory, with a shiver. “I beg your pardon!” said the Mouse, frowning, but very politely: “Did you speak?” “Not I!” said the Lory hastily. “I thought you did,” said the Mouse. “—I proceed. ‘Edwin and Morcar, the earls of Mercia and Northumbria, declared for him: and even Stigand, the patriotic archbishop of Canterbury, found it advisable—’” “Found what?” said the Duck. “Found it,” the Mouse replied rather crossly: “of course you know what ‘it’ means.” “I know what ‘it’ means well enough, when I find a thing,” said the Duck: “it’s generally a frog or a worm. The question is, what did the archbishop find?” The Mouse did not notice this question, but hurriedly went on, “‘—found it advisable to go with Edgar Atheling to meet William and offer him the crown. William’s conduct at first was moderate. But the insolence of his Normans—’ How are you getting on now, my dear?” it continued, turning to Alice as it spoke. “As wet as ever,” said Alice in a melancholy tone: “it doesn’t seem to dry me at all.” “In that case,” said the Dodo solemnly, rising to its feet, “I move that the meeting adjourn, for the immediate adoption of more energetic remedies—” “Speak English!” said the Eaglet. “I don’t know the meaning of half those long words, and, what’s more, I don’t believe you do either!” And the Eaglet bent down its head to hide a smile: some of the other birds tittered audibly. “What I was going to say,” said the Dodo in an offended tone, “was, that the best thing to get us dry would be a Caucus-race.” “What is a Caucus-race?” said Alice; not that she wanted much to know, but the Dodo had paused as if it thought that somebody ought to speak, and no one else seemed inclined to say anything. “Why,” said the Dodo, “the best way to explain it is to do it.” (And, as you might like to try the thing yourself, some winter day, I will tell you how the Dodo managed it.) First it marked out a race-course, in a sort of circle, (“the exact shape doesn’t matter,” it said,) and then all the party were placed along the course, here and there. There was no “One, two, three, and away,” but they began running when they liked, and left off when they liked, so that it was not easy to know when the race was over. However, when they had been running half an hour or so, and were quite dry again, the Dodo suddenly called out “The race is over!” and they all crowded round it, panting, and asking, “But who has won?” This question the Dodo could not answer without a great deal of thought, and it sat for a long time with one finger pressed upon its forehead (the position in which you usually see Shakespeare, in the pictures of him), while the rest waited in silence. At last the Dodo said, “Everybody has won, and all must have prizes.” “But who is to give the prizes?” quite a chorus of voices asked. “Why, she, of course,” said the Dodo, pointing to Alice with one finger; and the whole party at once crowded round her, calling out in a confused way, “Prizes! Prizes!” Alice had no idea what to do, and in despair she put her hand in her pocket, and pulled out a box of comfits, (luckily the salt water had not got into it), and handed them round as prizes. There was exactly one a-piece, all round. “But she must have a prize herself, you know,” said the Mouse. “Of course,” the Dodo replied very gravely. “What else have you got in your pocket?” he went on, turning to Alice. “Only a thimble,” said Alice sadly. “Hand it over here,” said the Dodo. Then they all crowded round her once more, while the Dodo solemnly presented the thimble, saying “We beg your acceptance of this elegant thimble;” and, when it had finished this short speech, they all cheered. Alice thought the whole thing very absurd, but they all looked so grave that she did not dare to laugh; and, as she could not think of anything to say, she simply bowed, and took the thimble, looking as solemn as she could. The next thing was to eat the comfits: this caused some noise and confusion, as the large birds complained that they could not taste theirs, and the small ones choked and had to be patted on the back. However, it was over at last, and they sat down again in a ring, and begged the Mouse to tell them something more. “You promised to tell me your history, you know,” said Alice, “and why it is you hate—C and D,” she added in a whisper, half afraid that it would be offended again. “Mine is a long and a sad tale!” said the Mouse, turning to Alice, and sighing. “It is a long tail, certainly,” said Alice, looking down with wonder at the Mouse’s tail; “but why do you call it sad?” And she kept on puzzling about it while the Mouse was speaking, so that her idea of the tale was something like this:— > “Fury said to a > mouse, That he > met in the > > house, ‘Let us both go to law: I will prosecute you.—Come, I’ll take no > denial; We must have a trial: For really this morning I’ve nothing to do.’ > Said the mouse to the cur, ‘Such a trial, dear sir, With no jury or judge, > would be wasting our breath.’ ‘I’ll be judge, I’ll be jury,’ Said cunning old > Fury: ‘I’ll try the whole cause, and condemn you to death.’” “You are not attending!” said the Mouse to Alice severely. “What are you thinking of?” “I beg your pardon,” said Alice very humbly: “you had got to the fifth bend, I think?” “I had not!” cried the Mouse, sharply and very angrily. “A knot!” said Alice, always ready to make herself useful, and looking anxiously about her. “Oh, do let me help to undo it!” “I shall do nothing of the sort,” said the Mouse, getting up and walking away. “You insult me by talking such nonsense!” “I didn’t mean it!” pleaded poor Alice. “But you’re so easily offended, you know!” The Mouse only growled in reply. “Please come back and finish your story!” Alice called after it; and the others all joined in chorus, “Yes, please do!” but the Mouse only shook its head impatiently, and walked a little quicker. “What a pity it wouldn’t stay!” sighed the Lory, as soon as it was quite out of sight; and an old Crab took the opportunity of saying to her daughter “Ah, my dear! Let this be a lesson to you never to lose your temper!” “Hold your tongue, Ma!” said the young Crab, a little snappishly. “You’re enough to try the patience of an oyster!” “I wish I had our Dinah here, I know I do!” said Alice aloud, addressing nobody in particular. “She’d soon fetch it back!” “And who is Dinah, if I might venture to ask the question?” said the Lory. Alice replied eagerly, for she was always ready to talk about her pet: “Dinah’s our cat. And she’s such a capital one for catching mice you can’t think! And oh, I wish you could see her after the birds! Why, she’ll eat a little bird as soon as look at it!” This speech caused a remarkable sensation among the party. Some of the birds hurried off at once: one old Magpie began wrapping itself up very carefully, remarking, “I really must be getting home; the night-air doesn’t suit my throat!” and a Canary called out in a trembling voice to its children, “Come away, my dears! It’s high time you were all in bed!” On various pretexts they all moved off, and Alice was soon left alone. “I wish I hadn’t mentioned Dinah!” she said to herself in a melancholy tone. “Nobody seems to like her, down here, and I’m sure she’s the best cat in the world! Oh, my dear Dinah! I wonder if I shall ever see you any more!” And here poor Alice began to cry again, for she felt very lonely and low-spirited. In a little while, however, she again heard a little pattering of footsteps in the distance, and she looked up eagerly, half hoping that the Mouse had changed his mind, and was coming back to finish his story. ## CHAPTER IV: The Rabbit Sends in a Little Bill It was the White Rabbit, trotting slowly back again, and looking anxiously about as it went, as if it had lost something; and she heard it muttering to itself “The Duchess! The Duchess! Oh my dear paws! Oh my fur and whiskers! She’ll get me executed, as sure as ferrets are ferrets! Where can I have dropped them, I wonder?” Alice guessed in a moment that it was looking for the fan and the pair of white kid gloves, and she very good-naturedly began hunting about for them, but they were nowhere to be seen—everything seemed to have changed since her swim in the pool, and the great hall, with the glass table and the little door, had vanished completely. Very soon the Rabbit noticed Alice, as she went hunting about, and called out to her in an angry tone, “Why, Mary Ann, what are you doing out here? Run home this moment, and fetch me a pair of gloves and a fan! Quick, now!” And Alice was so much frightened that she ran off at once in the direction it pointed to, without trying to explain the mistake it had made. “He took me for his housemaid,” she said to herself as she ran. “How surprised he’ll be when he finds out who I am! But I’d better take him his fan and gloves—that is, if I can find them.” As she said this, she came upon a neat little house, on the door of which was a bright brass plate with the name “W. RABBIT,” engraved upon it. She went in without knocking, and hurried upstairs, in great fear lest she should meet the real Mary Ann, and be turned out of the house before she had found the fan and gloves. “How queer it seems,” Alice said to herself, “to be going messages for a rabbit! I suppose Dinah’ll be sending me on messages next!” And she began fancying the sort of thing that would happen: “‘Miss Alice! Come here directly, and get ready for your walk!’ ‘Coming in a minute, nurse! But I’ve got to see that the mouse doesn’t get out.’ Only I don’t think,” Alice went on, “that they’d let Dinah stop in the house if it began ordering people about like that!” By this time she had found her way into a tidy little room with a table in the window, and on it (as she had hoped) a fan and two or three pairs of tiny white kid gloves: she took up the fan and a pair of the gloves, and was just going to leave the room, when her eye fell upon a little bottle that stood near the looking-glass. There was no label this time with the words “DRINK ME,” but nevertheless she uncorked it and put it to her lips. “I know something interesting is sure to happen,” she said to herself, “whenever I eat or drink anything; so I’ll just see what this bottle does. I do hope it’ll make me grow large again, for really I’m quite tired of being such a tiny little thing!” It did so indeed, and much sooner than she had expected: before she had drunk half the bottle, she found her head pressing against the ceiling, and had to stoop to save her neck from being broken. She hastily put down the bottle, saying to herself “That’s quite enough—I hope I shan’t grow any more—As it is, I can’t get out at the door—I do wish I hadn’t drunk quite so much!” Alas! it was too late to wish that! She went on growing, and growing, and very soon had to kneel down on the floor: in another minute there was not even room for this, and she tried the effect of lying down with one elbow against the door, and the other arm curled round her head. Still she went on growing, and, as a last resource, she put one arm out of the window, and one foot up the chimney, and said to herself “Now I can do no more, whatever happens. What will become of me?” Luckily for Alice, the little magic bottle had now had its full effect, and she grew no larger: still it was very uncomfortable, and, as there seemed to be no sort of chance of her ever getting out of the room again, no wonder she felt unhappy. “It was much pleasanter at home,” thought poor Alice, “when one wasn’t always growing larger and smaller, and being ordered about by mice and rabbits. I almost wish I hadn’t gone down that rabbit-hole—and yet—and yet—it’s rather curious, you know, this sort of life! I do wonder what can have happened to me! When I used to read fairy-tales, I fancied that kind of thing never happened, and now here I am in the middle of one! There ought to be a book written about me, that there ought! And when I grow up, I’ll write one—but I’m grown up now,” she added in a sorrowful tone; “at least there’s no room to grow up any more here.” “But then,” thought Alice, “shall I never get any older than I am now? That’ll be a comfort, one way—never to be an old woman—but then—always to have lessons to learn! Oh, I shouldn’t like that!” “Oh, you foolish Alice!” she answered herself. “How can you learn lessons in here? Why, there’s hardly room for you, and no room at all for any lesson-books!” And so she went on, taking first one side and then the other, and making quite a conversation of it altogether; but after a few minutes she heard a voice outside, and stopped to listen. “Mary Ann! Mary Ann!” said the voice. “Fetch me my gloves this moment!” Then came a little pattering of feet on the stairs. Alice knew it was the Rabbit coming to look for her, and she trembled till she shook the house, quite forgetting that she was now about a thousand times as large as the Rabbit, and had no reason to be afraid of it. Presently the Rabbit came up to the door, and tried to open it; but, as the door opened inwards, and Alice’s elbow was pressed hard against it, that attempt proved a failure. Alice heard it say to itself “Then I’ll go round and get in at the window.” “That you won’t!” thought Alice, and, after waiting till she fancied she heard the Rabbit just under the window, she suddenly spread out her hand, and made a snatch in the air. She did not get hold of anything, but she heard a little shriek and a fall, and a crash of broken glass, from which she concluded that it was just possible it had fallen into a cucumber-frame, or something of the sort. Next came an angry voice—the Rabbit’s—“Pat! Pat! Where are you?” And then a voice she had never heard before, “Sure then I’m here! Digging for apples, yer honour!” “Digging for apples, indeed!” said the Rabbit angrily. “Here! Come and help me out of this!” (Sounds of more broken glass.) “Now tell me, Pat, what’s that in the window?” “Sure, it’s an arm, yer honour!” (He pronounced it “arrum.”) “An arm, you goose! Who ever saw one that size? Why, it fills the whole window!” “Sure, it does, yer honour: but it’s an arm for all that.” “Well, it’s got no business there, at any rate: go and take it away!” There was a long silence after this, and Alice could only hear whispers now and then; such as, “Sure, I don’t like it, yer honour, at all, at all!” “Do as I tell you, you coward!” and at last she spread out her hand again, and made another snatch in the air. This time there were two little shrieks, and more sounds of broken glass. “What a number of cucumber-frames there must be!” thought Alice. “I wonder what they’ll do next! As for pulling me out of the window, I only wish they could! I’m sure I don’t want to stay in here any longer!” She waited for some time without hearing anything more: at last came a rumbling of little cartwheels, and the sound of a good many voices all talking together: she made out the words: “Where’s the other ladder?—Why, I hadn’t to bring but one; Bill’s got the other—Bill! fetch it here, lad!—Here, put ’em up at this corner—No, tie ’em together first—they don’t reach half high enough yet—Oh! they’ll do well enough; don’t be particular—Here, Bill! catch hold of this rope—Will the roof bear?—Mind that loose slate—Oh, it’s coming down! Heads below!” (a loud crash)—“Now, who did that?—It was Bill, I fancy—Who’s to go down the chimney?—Nay, I shan’t! You do it!—That I won’t, then!—Bill’s to go down—Here, Bill! the master says you’re to go down the chimney!” “Oh! So Bill’s got to come down the chimney, has he?” said Alice to herself. “Shy, they seem to put everything upon Bill! I wouldn’t be in Bill’s place for a good deal: this fireplace is narrow, to be sure; but I think I can kick a little!” She drew her foot as far down the chimney as she could, and waited till she heard a little animal (she couldn’t guess of what sort it was) scratching and scrambling about in the chimney close above her: then, saying to herself “This is Bill,” she gave one sharp kick, and waited to see what would happen next. The first thing she heard was a general chorus of “There goes Bill!” then the Rabbit’s voice along—“Catch him, you by the hedge!” then silence, and then another confusion of voices—“Hold up his head—Brandy now—Don’t choke him—How was it, old fellow? What happened to you? Tell us all about it!” Last came a little feeble, squeaking voice, (“That’s Bill,” thought Alice,) “Well, I hardly know—No more, thank ye; I’m better now—but I’m a deal too flustered to tell you—all I know is, something comes at me like a Jack-in-the-box, and up I goes like a sky-rocket!” “So you did, old fellow!” said the others. “We must burn the house down!” said the Rabbit’s voice; and Alice called out as loud as she could, “If you do, I’ll set Dinah at you!” There was a dead silence instantly, and Alice thought to herself, “I wonder what they will do next! If they had any sense, they’d take the roof off.” After a minute or two, they began moving about again, and Alice heard the Rabbit say, “A barrowful will do, to begin with.” “A barrowful of what?” thought Alice; but she had not long to doubt, for the next moment a shower of little pebbles came rattling in at the window, and some of them hit her in the face. “I’ll put a stop to this,” she said to herself, and shouted out, “You’d better not do that again!” which produced another dead silence. Alice noticed with some surprise that the pebbles were all turning into little cakes as they lay on the floor, and a bright idea came into her head. “If I eat one of these cakes,” she thought, “it’s sure to make some change in my size; and as it can’t possibly make me larger, it must make me smaller, I suppose.” So she swallowed one of the cakes, and was delighted to find that she began shrinking directly. As soon as she was small enough to get through the door, she ran out of the house, and found quite a crowd of little animals and birds waiting outside. The poor little Lizard, Bill, was in the middle, being held up by two guinea-pigs, who were giving it something out of a bottle. They all made a rush at Alice the moment she appeared; but she ran off as hard as she could, and soon found herself safe in a thick wood. “The first thing I’ve got to do,” said Alice to herself, as she wandered about in the wood, “is to grow to my right size again; and the second thing is to find my way into that lovely garden. I think that will be the best plan.” It sounded an excellent plan, no doubt, and very neatly and simply arranged; the only difficulty was, that she had not the smallest idea how to set about it; and while she was peering about anxiously among the trees, a little sharp bark just over her head made her look up in a great hurry. An enormous puppy was looking down at her with large round eyes, and feebly stretching out one paw, trying to touch her. “Poor little thing!” said Alice, in a coaxing tone, and she tried hard to whistle to it; but she was terribly frightened all the time at the thought that it might be hungry, in which case it would be very likely to eat her up in spite of all her coaxing. Hardly knowing what she did, she picked up a little bit of stick, and held it out to the puppy; whereupon the puppy jumped into the air off all its feet at once, with a yelp of delight, and rushed at the stick, and made believe to worry it; then Alice dodged behind a great thistle, to keep herself from being run over; and the moment she appeared on the other side, the puppy made another rush at the stick, and tumbled head over heels in its hurry to get hold of it; then Alice, thinking it was very like having a game of play with a cart-horse, and expecting every moment to be trampled under its feet, ran round the thistle again; then the puppy began a series of short charges at the stick, running a very little way forwards each time and a long way back, and barking hoarsely all the while, till at last it sat down a good way off, panting, with its tongue hanging out of its mouth, and its great eyes half shut. This seemed to Alice a good opportunity for making her escape; so she set off at once, and ran till she was quite tired and out of breath, and till the puppy’s bark sounded quite faint in the distance. “And yet what a dear little puppy it was!” said Alice, as she leant against a buttercup to rest herself, and fanned herself with one of the leaves: “I should have liked teaching it tricks very much, if—if I’d only been the right size to do it! Oh dear! I’d nearly forgotten that I’ve got to grow up again! Let me see—how is it to be managed? I suppose I ought to eat or drink something or other; but the great question is, what?” The great question certainly was, what? Alice looked all round her at the flowers and the blades of grass, but she did not see anything that looked like the right thing to eat or drink under the circumstances. There was a large mushroom growing near her, about the same height as herself; and when she had looked under it, and on both sides of it, and behind it, it occurred to her that she might as well look and see what was on the top of it. She stretched herself up on tiptoe, and peeped over the edge of the mushroom, and her eyes immediately met those of a large blue caterpillar, that was sitting on the top with its arms folded, quietly smoking a long hookah, and taking not the smallest notice of her or of anything else. ## CHAPTER V: Advice from a Caterpillar The Caterpillar and Alice looked at each other for some time in silence: at last the Caterpillar took the hookah out of its mouth, and addressed her in a languid, sleepy voice. “Who are you?” said the Caterpillar. This was not an encouraging opening for a conversation. Alice replied, rather shyly, “I—I hardly know, sir, just at present—at least I know who I was when I got up this morning, but I think I must have been changed several times since then.” “What do you mean by that?” said the Caterpillar sternly. “Explain yourself!” “I can’t explain myself, I’m afraid, sir,” said Alice, “because I’m not myself, you see.” “I don’t see,” said the Caterpillar. “I’m afraid I can’t put it more clearly,” Alice replied very politely, “for I can’t understand it myself to begin with; and being so many different sizes in a day is very confusing.” “It isn’t,” said the Caterpillar. “Well, perhaps you haven’t found it so yet,” said Alice; “but when you have to turn into a chrysalis—you will some day, you know—and then after that into a butterfly, I should think you’ll feel it a little queer, won’t you?” “Not a bit,” said the Caterpillar. “Well, perhaps your feelings may be different,” said Alice; “all I know is, it would feel very queer to me.” “You!” said the Caterpillar contemptuously. “Who are you?” Which brought them back again to the beginning of the conversation. Alice felt a little irritated at the Caterpillar’s making such very short remarks, and she drew herself up and said, very gravely, “I think, you ought to tell me who you are, first.” “Why?” said the Caterpillar. Here was another puzzling question; and as Alice could not think of any good reason, and as the Caterpillar seemed to be in a very unpleasant state of mind, she turned away. “Come back!” the Caterpillar called after her. “I’ve something important to say!” This sounded promising, certainly: Alice turned and came back again. “Keep your temper,” said the Caterpillar. “Is that all?” said Alice, swallowing down her anger as well as she could. “No,” said the Caterpillar. Alice thought she might as well wait, as she had nothing else to do, and perhaps after all it might tell her something worth hearing. For some minutes it puffed away without speaking, but at last it unfolded its arms, took the hookah out of its mouth again, and said, “So you think you’re changed, do you?” “I’m afraid I am, sir,” said Alice; “I can’t remember things as I used—and I don’t keep the same size for ten minutes together!” “Can’t remember what things?” said the Caterpillar. “Well, I’ve tried to say “How doth the little busy bee,” but it all came different!” Alice replied in a very melancholy voice. “Repeat, “You are old, Father William,’” said the Caterpillar. Alice folded her hands, and began:— > “You are old, Father William,” the young man said, “And your hair has become > very white; And yet you incessantly stand on your head— Do you think, at your > age, it is right?” > > “In my youth,” Father William replied to his son, “I feared it might injure > the brain; But, now that I’m perfectly sure I have none, Why, I do it again > and again.” > > “You are old,” said the youth, “as I mentioned before, And have grown most > uncommonly fat; Yet you turned a back-somersault in at the door— Pray, what is > the reason of that?” > > “In my youth,” said the sage, as he shook his grey locks, “I kept all my limbs > very supple By the use of this ointment—one shilling the box— Allow me to sell > you a couple?” > > “You are old,” said the youth, “and your jaws are too weak For anything > tougher than suet; Yet you finished the goose, with the bones and the beak— > Pray, how did you manage to do it?” > > “In my youth,” said his father, “I took to the law, And argued each case with > my wife; And the muscular strength, which it gave to my jaw, Has lasted the > rest of my life.” > > “You are old,” said the youth, “one would hardly suppose That your eye was as > steady as ever; Yet you balanced an eel on the end of your nose— What made you > so awfully clever?” > > “I have answered three questions, and that is enough,” Said his father; “don’t > give yourself airs! Do you think I can listen all day to such stuff? Be off, > or I’ll kick you down stairs!” “That is not said right,” said the Caterpillar. “Not quite right, I’m afraid,” said Alice, timidly; “some of the words have got altered.” “It is wrong from beginning to end,” said the Caterpillar decidedly, and there was silence for some minutes. The Caterpillar was the first to speak. “What size do you want to be?” it asked. “Oh, I’m not particular as to size,” Alice hastily replied; “only one doesn’t like changing so often, you know.” “I don’t know,” said the Caterpillar. Alice said nothing: she had never been so much contradicted in her life before, and she felt that she was losing her temper. “Are you content now?” said the Caterpillar. “Well, I should like to be a little larger, sir, if you wouldn’t mind,” said Alice: “three inches is such a wretched height to be.” “It is a very good height indeed!” said the Caterpillar angrily, rearing itself upright as it spoke (it was exactly three inches high). “But I’m not used to it!” pleaded poor Alice in a piteous tone. And she thought of herself, “I wish the creatures wouldn’t be so easily offended!” “You’ll get used to it in time,” said the Caterpillar; and it put the hookah into its mouth and began smoking again. This time Alice waited patiently until it chose to speak again. In a minute or two the Caterpillar took the hookah out of its mouth and yawned once or twice, and shook itself. Then it got down off the mushroom, and crawled away in the grass, merely remarking as it went, “One side will make you grow taller, and the other side will make you grow shorter.” “One side of what? The other side of what?” thought Alice to herself. “Of the mushroom,” said the Caterpillar, just as if she had asked it aloud; and in another moment it was out of sight. Alice remained looking thoughtfully at the mushroom for a minute, trying to make out which were the two sides of it; and as it was perfectly round, she found this a very difficult question. However, at last she stretched her arms round it as far as they would go, and broke off a bit of the edge with each hand. “And now which is which?” she said to herself, and nibbled a little of the right-hand bit to try the effect: the next moment she felt a violent blow underneath her chin: it had struck her foot! She was a good deal frightened by this very sudden change, but she felt that there was no time to be lost, as she was shrinking rapidly; so she set to work at once to eat some of the other bit. Her chin was pressed so closely against her foot, that there was hardly room to open her mouth; but she did it at last, and managed to swallow a morsel of the lefthand bit. “Come, my head’s free at last!” said Alice in a tone of delight, which changed into alarm in another moment, when she found that her shoulders were nowhere to be found: all she could see, when she looked down, was an immense length of neck, which seemed to rise like a stalk out of a sea of green leaves that lay far below her. “What can all that green stuff be?” said Alice. “And where have my shoulders got to? And oh, my poor hands, how is it I can’t see you?” She was moving them about as she spoke, but no result seemed to follow, except a little shaking among the distant green leaves. As there seemed to be no chance of getting her hands up to her head, she tried to get her head down to them, and was delighted to find that her neck would bend about easily in any direction, like a serpent. She had just succeeded in curving it down into a graceful zigzag, and was going to dive in among the leaves, which she found to be nothing but the tops of the trees under which she had been wandering, when a sharp hiss made her draw back in a hurry: a large pigeon had flown into her face, and was beating her violently with its wings. “Serpent!” screamed the Pigeon. “I’m not a serpent!” said Alice indignantly. “Let me alone!” “Serpent, I say again!” repeated the Pigeon, but in a more subdued tone, and added with a kind of sob, “I’ve tried every way, and nothing seems to suit them!” “I haven’t the least idea what you’re talking about,” said Alice. “I’ve tried the roots of trees, and I’ve tried banks, and I’ve tried hedges,” the Pigeon went on, without attending to her; “but those serpents! There’s no pleasing them!” Alice was more and more puzzled, but she thought there was no use in saying anything more till the Pigeon had finished. “As if it wasn’t trouble enough hatching the eggs,” said the Pigeon; “but I must be on the look-out for serpents night and day! Why, I haven’t had a wink of sleep these three weeks!” “I’m very sorry you’ve been annoyed,” said Alice, who was beginning to see its meaning. “And just as I’d taken the highest tree in the wood,” continued the Pigeon, raising its voice to a shriek, “and just as I was thinking I should be free of them at last, they must needs come wriggling down from the sky! Ugh, Serpent!” “But I’m not a serpent, I tell you!” said Alice. “I’m a—I’m a—” “Well! What are you?” said the Pigeon. “I can see you’re trying to invent something!” “I—I’m a little girl,” said Alice, rather doubtfully, as she remembered the number of changes she had gone through that day. “A likely story indeed!” said the Pigeon in a tone of the deepest contempt. “I’ve seen a good many little girls in my time, but never one with such a neck as that! No, no! You’re a serpent; and there’s no use denying it. I suppose you’ll be telling me next that you never tasted an egg!” “I have tasted eggs, certainly,” said Alice, who was a very truthful child; “but little girls eat eggs quite as much as serpents do, you know.” “I don’t believe it,” said the Pigeon; “but if they do, why then they’re a kind of serpent, that’s all I can say.” This was such a new idea to Alice, that she was quite silent for a minute or two, which gave the Pigeon the opportunity of adding, “You’re looking for eggs, I know that well enough; and what does it matter to me whether you’re a little girl or a serpent?” “It matters a good deal to me,” said Alice hastily; “but I’m not looking for eggs, as it happens; and if I was, I shouldn’t want yours: I don’t like them raw.” “Well, be off, then!” said the Pigeon in a sulky tone, as it settled down again into its nest. Alice crouched down among the trees as well as she could, for her neck kept getting entangled among the branches, and every now and then she had to stop and untwist it. After a while she remembered that she still held the pieces of mushroom in her hands, and she set to work very carefully, nibbling first at one and then at the other, and growing sometimes taller and sometimes shorter, until she had succeeded in bringing herself down to her usual height. It was so long since she had been anything near the right size, that it felt quite strange at first; but she got used to it in a few minutes, and began talking to herself, as usual. “Come, there’s half my plan done now! How puzzling all these changes are! I’m never sure what I’m going to be, from one minute to another! However, I’ve got back to my right size: the next thing is, to get into that beautiful garden—how is that to be done, I wonder?” As she said this, she came suddenly upon an open place, with a little house in it about four feet high. “Whoever lives there,” thought Alice, “it’ll never do to come upon them this size: why, I should frighten them out of their wits!” So she began nibbling at the righthand bit again, and did not venture to go near the house till she had brought herself down to nine inches high. ## CHAPTER VI: Pig and Pepper For a minute or two she stood looking at the house, and wondering what to do next, when suddenly a footman in livery came running out of the wood—(she considered him to be a footman because he was in livery: otherwise, judging by his face only, she would have called him a fish)—and rapped loudly at the door with his knuckles. It was opened by another footman in livery, with a round face, and large eyes like a frog; and both footmen, Alice noticed, had powdered hair that curled all over their heads. She felt very curious to know what it was all about, and crept a little way out of the wood to listen. The Fish-Footman began by producing from under his arm a great letter, nearly as large as himself, and this he handed over to the other, saying, in a solemn tone, “For the Duchess. An invitation from the Queen to play croquet.” The Frog-Footman repeated, in the same solemn tone, only changing the order of the words a little, “From the Queen. An invitation for the Duchess to play croquet.” Then they both bowed low, and their curls got entangled together. Alice laughed so much at this, that she had to run back into the wood for fear of their hearing her; and when she next peeped out the Fish-Footman was gone, and the other was sitting on the ground near the door, staring stupidly up into the sky. Alice went timidly up to the door, and knocked. “There’s no sort of use in knocking,” said the Footman, “and that for two reasons. First, because I’m on the same side of the door as you are; secondly, because they’re making such a noise inside, no one could possibly hear you.” And certainly there was a most extraordinary noise going on within—a constant howling and sneezing, and every now and then a great crash, as if a dish or kettle had been broken to pieces. “Please, then,” said Alice, “how am I to get in?” “There might be some sense in your knocking,” the Footman went on without attending to her, “if we had the door between us. For instance, if you were inside, you might knock, and I could let you out, you know.” He was looking up into the sky all the time he was speaking, and this Alice thought decidedly uncivil. “But perhaps he can’t help it,” she said to herself; “his eyes are so very nearly at the top of his head. But at any rate he might answer questions.—How am I to get in?” she repeated, aloud. “I shall sit here,” the Footman remarked, “till tomorrow—” At this moment the door of the house opened, and a large plate came skimming out, straight at the Footman’s head: it just grazed his nose, and broke to pieces against one of the trees behind him. “—or next day, maybe,” the Footman continued in the same tone, exactly as if nothing had happened. “How am I to get in?” asked Alice again, in a louder tone. “Are you to get in at all?” said the Footman. “That’s the first question, you know.” It was, no doubt: only Alice did not like to be told so. “It’s really dreadful,” she muttered to herself, “the way all the creatures argue. It’s enough to drive one crazy!” The Footman seemed to think this a good opportunity for repeating his remark, with variations. “I shall sit here,” he said, “on and off, for days and days.” “But what am I to do?” said Alice. “Anything you like,” said the Footman, and began whistling. “Oh, there’s no use in talking to him,” said Alice desperately: “he’s perfectly idiotic!” And she opened the door and went in. The door led right into a large kitchen, which was full of smoke from one end to the other: the Duchess was sitting on a three-legged stool in the middle, nursing a baby; the cook was leaning over the fire, stirring a large cauldron which seemed to be full of soup. “There’s certainly too much pepper in that soup!” Alice said to herself, as well as she could for sneezing. There was certainly too much of it in the air. Even the Duchess sneezed occasionally; and as for the baby, it was sneezing and howling alternately without a moment’s pause. The only things in the kitchen that did not sneeze, were the cook, and a large cat which was sitting on the hearth and grinning from ear to ear. “Please would you tell me,” said Alice, a little timidly, for she was not quite sure whether it was good manners for her to speak first, “why your cat grins like that?” “It’s a Cheshire cat,” said the Duchess, “and that’s why. Pig!” She said the last word with such sudden violence that Alice quite jumped; but she saw in another moment that it was addressed to the baby, and not to her, so she took courage, and went on again:— “I didn’t know that Cheshire cats always grinned; in fact, I didn’t know that cats could grin.” “They all can,” said the Duchess; “and most of ’em do.” “I don’t know of any that do,” Alice said very politely, feeling quite pleased to have got into a conversation. “You don’t know much,” said the Duchess; “and that’s a fact.” Alice did not at all like the tone of this remark, and thought it would be as well to introduce some other subject of conversation. While she was trying to fix on one, the cook took the cauldron of soup off the fire, and at once set to work throwing everything within her reach at the Duchess and the baby—the fire-irons came first; then followed a shower of saucepans, plates, and dishes. The Duchess took no notice of them even when they hit her; and the baby was howling so much already, that it was quite impossible to say whether the blows hurt it or not. “Oh, please mind what you’re doing!” cried Alice, jumping up and down in an agony of terror. “Oh, there goes his precious nose!” as an unusually large saucepan flew close by it, and very nearly carried it off. “If everybody minded their own business,” the Duchess said in a hoarse growl, “the world would go round a deal faster than it does.” “Which would not be an advantage,” said Alice, who felt very glad to get an opportunity of showing off a little of her knowledge. “Just think of what work it would make with the day and night! You see the earth takes twenty-four hours to turn round on its axis—” “Talking of axes,” said the Duchess, “chop off her head!” Alice glanced rather anxiously at the cook, to see if she meant to take the hint; but the cook was busily stirring the soup, and seemed not to be listening, so she went on again: “Twenty-four hours, I think; or is it twelve? I—” “Oh, don’t bother me,” said the Duchess; “I never could abide figures!” And with that she began nursing her child again, singing a sort of lullaby to it as she did so, and giving it a violent shake at the end of every line: > “Speak roughly to your little boy, And beat him when he sneezes: He only does > it to annoy, Because he knows it teases.” CHORUS. (In which the cook and the baby joined): > “Wow! wow! wow!” While the Duchess sang the second verse of the song, she kept tossing the baby violently up and down, and the poor little thing howled so, that Alice could hardly hear the words:— > “I speak severely to my boy, I beat him when he sneezes; For he can thoroughly > enjoy The pepper when he pleases!” CHORUS. > “Wow! wow! wow!” “Here! you may nurse it a bit, if you like!” the Duchess said to Alice, flinging the baby at her as she spoke. “I must go and get ready to play croquet with the Queen,” and she hurried out of the room. The cook threw a frying-pan after her as she went out, but it just missed her. Alice caught the baby with some difficulty, as it was a queer-shaped little creature, and held out its arms and legs in all directions, “just like a star-fish,” thought Alice. The poor little thing was snorting like a steam-engine when she caught it, and kept doubling itself up and straightening itself out again, so that altogether, for the first minute or two, it was as much as she could do to hold it. As soon as she had made out the proper way of nursing it, (which was to twist it up into a sort of knot, and then keep tight hold of its right ear and left foot, so as to prevent its undoing itself,) she carried it out into the open air. “If I don’t take this child away with me,” thought Alice, “they’re sure to kill it in a day or two: wouldn’t it be murder to leave it behind?” She said the last words out loud, and the little thing grunted in reply (it had left off sneezing by this time). “Don’t grunt,” said Alice; “that’s not at all a proper way of expressing yourself.” The baby grunted again, and Alice looked very anxiously into its face to see what was the matter with it. There could be no doubt that it had a very turn-up nose, much more like a snout than a real nose; also its eyes were getting extremely small for a baby: altogether Alice did not like the look of the thing at all. “But perhaps it was only sobbing,” she thought, and looked into its eyes again, to see if there were any tears. No, there were no tears. “If you’re going to turn into a pig, my dear,” said Alice, seriously, “I’ll have nothing more to do with you. Mind now!” The poor little thing sobbed again (or grunted, it was impossible to say which), and they went on for some while in silence. Alice was just beginning to think to herself, “Now, what am I to do with this creature when I get it home?” when it grunted again, so violently, that she looked down into its face in some alarm. This time there could be no mistake about it: it was neither more nor less than a pig, and she felt that it would be quite absurd for her to carry it further. So she set the little creature down, and felt quite relieved to see it trot away quietly into the wood. “If it had grown up,” she said to herself, “it would have made a dreadfully ugly child: but it makes rather a handsome pig, I think.” And she began thinking over other children she knew, who might do very well as pigs, and was just saying to herself, “if one only knew the right way to change them—” when she was a little startled by seeing the Cheshire Cat sitting on a bough of a tree a few yards off. The Cat only grinned when it saw Alice. It looked good-natured, she thought: still it had very long claws and a great many teeth, so she felt that it ought to be treated with respect. “Cheshire Puss,” she began, rather timidly, as she did not at all know whether it would like the name: however, it only grinned a little wider. “Come, it’s pleased so far,” thought Alice, and she went on. “Would you tell me, please, which way I ought to go from here?” “That depends a good deal on where you want to get to,” said the Cat. “I don’t much care where—” said Alice. “Then it doesn’t matter which way you go,” said the Cat. “—so long as I get somewhere,” Alice added as an explanation. “Oh, you’re sure to do that,” said the Cat, “if you only walk long enough.” Alice felt that this could not be denied, so she tried another question. “What sort of people live about here?” “In that direction,” the Cat said, waving its right paw round, “lives a Hatter: and in that direction,” waving the other paw, “lives a March Hare. Visit either you like: they’re both mad.” “But I don’t want to go among mad people,” Alice remarked. “Oh, you can’t help that,” said the Cat: “we’re all mad here. I’m mad. You’re mad.” “How do you know I’m mad?” said Alice. “You must be,” said the Cat, “or you wouldn’t have come here.” Alice didn’t think that proved it at all; however, she went on “And how do you know that you’re mad?” “To begin with,” said the Cat, “a dog’s not mad. You grant that?” “I suppose so,” said Alice. “Well, then,” the Cat went on, “you see, a dog growls when it’s angry, and wags its tail when it’s pleased. Now I growl when I’m pleased, and wag my tail when I’m angry. Therefore I’m mad.” “I call it purring, not growling,” said Alice. “Call it what you like,” said the Cat. “Do you play croquet with the Queen to-day?” “I should like it very much,” said Alice, “but I haven’t been invited yet.” “You’ll see me there,” said the Cat, and vanished. Alice was not much surprised at this, she was getting so used to queer things happening. While she was looking at the place where it had been, it suddenly appeared again. “By-the-bye, what became of the baby?” said the Cat. “I’d nearly forgotten to ask.” “It turned into a pig,” Alice quietly said, just as if it had come back in a natural way. “I thought it would,” said the Cat, and vanished again. Alice waited a little, half expecting to see it again, but it did not appear, and after a minute or two she walked on in the direction in which the March Hare was said to live. “I’ve seen hatters before,” she said to herself; “the March Hare will be much the most interesting, and perhaps as this is May it won’t be raving mad—at least not so mad as it was in March.” As she said this, she looked up, and there was the Cat again, sitting on a branch of a tree. “Did you say pig, or fig?” said the Cat. “I said pig,” replied Alice; “and I wish you wouldn’t keep appearing and vanishing so suddenly: you make one quite giddy.” “All right,” said the Cat; and this time it vanished quite slowly, beginning with the end of the tail, and ending with the grin, which remained some time after the rest of it had gone. “Well! I’ve often seen a cat without a grin,” thought Alice; “but a grin without a cat! It’s the most curious thing I ever saw in my life!” She had not gone much farther before she came in sight of the house of the March Hare: she thought it must be the right house, because the chimneys were shaped like ears and the roof was thatched with fur. It was so large a house, that she did not like to go nearer till she had nibbled some more of the lefthand bit of mushroom, and raised herself to about two feet high: even then she walked up towards it rather timidly, saying to herself “Suppose it should be raving mad after all! I almost wish I’d gone to see the Hatter instead!” ## CHAPTER VII: A Mad Tea-Party There was a table set out under a tree in front of the house, and the March Hare and the Hatter were having tea at it: a Dormouse was sitting between them, fast asleep, and the other two were using it as a cushion, resting their elbows on it, and talking over its head. “Very uncomfortable for the Dormouse,” thought Alice; “only, as it’s asleep, I suppose it doesn’t mind.” The table was a large one, but the three were all crowded together at one corner of it: “No room! No room!” they cried out when they saw Alice coming. “There’s plenty of room!” said Alice indignantly, and she sat down in a large arm-chair at one end of the table. “Have some wine,” the March Hare said in an encouraging tone. Alice looked all round the table, but there was nothing on it but tea. “I don’t see any wine,” she remarked. “There isn’t any,” said the March Hare. “Then it wasn’t very civil of you to offer it,” said Alice angrily. “It wasn’t very civil of you to sit down without being invited,” said the March Hare. “I didn’t know it was your table,” said Alice; “it’s laid for a great many more than three.” “Your hair wants cutting,” said the Hatter. He had been looking at Alice for some time with great curiosity, and this was his first speech. “You should learn not to make personal remarks,” Alice said with some severity; “it’s very rude.” The Hatter opened his eyes very wide on hearing this; but all he said was, “Why is a raven like a writing-desk?” “Come, we shall have some fun now!” thought Alice. “I’m glad they’ve begun asking riddles.—I believe I can guess that,” she added aloud. “Do you mean that you think you can find out the answer to it?” said the March Hare. “Exactly so,” said Alice. “Then you should say what you mean,” the March Hare went on. “I do,” Alice hastily replied; “at least—at least I mean what I say—that’s the same thing, you know.” “Not the same thing a bit!” said the Hatter. “You might just as well say that ‘I see what I eat’ is the same thing as ‘I eat what I see’!” “You might just as well say,” added the March Hare, “that ‘I like what I get’ is the same thing as ‘I get what I like’!” “You might just as well say,” added the Dormouse, who seemed to be talking in his sleep, “that ‘I breathe when I sleep’ is the same thing as ‘I sleep when I breathe’!” “It is the same thing with you,” said the Hatter, and here the conversation dropped, and the party sat silent for a minute, while Alice thought over all she could remember about ravens and writing-desks, which wasn’t much. The Hatter was the first to break the silence. “What day of the month is it?” he said, turning to Alice: he had taken his watch out of his pocket, and was looking at it uneasily, shaking it every now and then, and holding it to his ear. Alice considered a little, and then said “The fourth.” “Two days wrong!” sighed the Hatter. “I told you butter wouldn’t suit the works!” he added looking angrily at the March Hare. “It was the best butter,” the March Hare meekly replied. “Yes, but some crumbs must have got in as well,” the Hatter grumbled: “you shouldn’t have put it in with the bread-knife.” The March Hare took the watch and looked at it gloomily: then he dipped it into his cup of tea, and looked at it again: but he could think of nothing better to say than his first remark, “It was the best butter, you know.” Alice had been looking over his shoulder with some curiosity. “What a funny watch!” she remarked. “It tells the day of the month, and doesn’t tell what o’clock it is!” “Why should it?” muttered the Hatter. “Does your watch tell you what year it is?” “Of course not,” Alice replied very readily: “but that’s because it stays the same year for such a long time together.” “Which is just the case with mine,” said the Hatter. Alice felt dreadfully puzzled, The Hatter’s remark seemed to have no sort of meaning in it, and yet it was certainly English. “I don’t quite understand you,” she said, as politely as she could. “The Dormouse is asleep again,” said the Hatter, and he poured a little hot tea upon its nose. The Dormouse shook its head impatiently, and said, without opening its eyes, “Of course, of course; just what I was going to remark myself.” “Have you guessed the riddle yet?” the Hatter said, turning to Alice again. “No, I give it up,” Alice replied: “what’s the answer?” “I haven’t the slightest idea,” said the Hatter. “Nor I,” said the March Hare. Alice sighed wearily. “I think you might do something better with the time,” she said, “than waste it in asking riddles that have no answers.” “If you knew Time as well as I do,” said the Hatter, “you wouldn’t talk about wasting it. It’s him.” “I don’t know what you mean,” said Alice. “Of course you don’t!” the Hatter said, tossing his head contemptuously. “I dare say you never even spoke to Time!” “Perhaps not,” Alice cautiously replied: “but I know I have to beat time when I learn music.” “Ah! that accounts for it,” said the Hatter. “He won’t stand beating. Now, if you only kept on good terms with him, he’d do almost anything you liked with the clock. For instance, suppose it were nine o’clock in the morning, just time to begin lessons: you’d only have to whisper a hint to Time, and round goes the clock in a twinkling! Half-past one, time for dinner!” (“I only wish it was,” the March Hare said to itself in a whisper.) “That would be grand, certainly,” said Alice thoughtfully: “but then—I shouldn’t be hungry for it, you know.” “Not at first, perhaps,” said the Hatter: “but you could keep it to half-past one as long as you liked.” “Is that the way you manage?” Alice asked. The Hatter shook his head mournfully. “Not I!” he replied. “We quarrelled last March—just before he went mad, you know—” (pointing with his tea spoon at the March Hare,) “—it was at the great concert given by the Queen of Hearts, and I had to sing > ‘Twinkle, twinkle, little bat! How I wonder what you’re at!’ You know the song, perhaps?” “I’ve heard something like it,” said Alice. “It goes on, you know,” the Hatter continued, “in this way:— > ‘Up above the world you fly, Like a tea-tray in the sky. Twinkle, twinkle—’” Here the Dormouse shook itself, and began singing in its sleep “Twinkle, twinkle, twinkle, twinkle—” and went on so long that they had to pinch it to make it stop. “Well, I’d hardly finished the first verse,” said the Hatter, “when the Queen jumped up and bawled out, ‘He’s murdering the time! Off with his head!’” “How dreadfully savage!” exclaimed Alice. “And ever since that,” the Hatter went on in a mournful tone, “he won’t do a thing I ask! It’s always six o’clock now.” A bright idea came into Alice’s head. “Is that the reason so many tea-things are put out here?” she asked. “Yes, that’s it,” said the Hatter with a sigh: “it’s always tea-time, and we’ve no time to wash the things between whiles.” “Then you keep moving round, I suppose?” said Alice. “Exactly so,” said the Hatter: “as the things get used up.” “But what happens when you come to the beginning again?” Alice ventured to ask. “Suppose we change the subject,” the March Hare interrupted, yawning. “I’m getting tired of this. I vote the young lady tells us a story.” “I’m afraid I don’t know one,” said Alice, rather alarmed at the proposal. “Then the Dormouse shall!” they both cried. “Wake up, Dormouse!” And they pinched it on both sides at once. The Dormouse slowly opened his eyes. “I wasn’t asleep,” he said in a hoarse, feeble voice: “I heard every word you fellows were saying.” “Tell us a story!” said the March Hare. “Yes, please do!” pleaded Alice. “And be quick about it,” added the Hatter, “or you’ll be asleep again before it’s done.” “Once upon a time there were three little sisters,” the Dormouse began in a great hurry; “and their names were Elsie, Lacie, and Tillie; and they lived at the bottom of a well—” “What did they live on?” said Alice, who always took a great interest in questions of eating and drinking. “They lived on treacle,” said the Dormouse, after thinking a minute or two. “They couldn’t have done that, you know,” Alice gently remarked; “they’d have been ill.” “So they were,” said the Dormouse; “very ill.” Alice tried to fancy to herself what such an extraordinary way of living would be like, but it puzzled her too much, so she went on: “But why did they live at the bottom of a well?” “Take some more tea,” the March Hare said to Alice, very earnestly. “I’ve had nothing yet,” Alice replied in an offended tone, “so I can’t take more.” “You mean you can’t take less,” said the Hatter: “it’s very easy to take more than nothing.” “Nobody asked your opinion,” said Alice. “Who’s making personal remarks now?” the Hatter asked triumphantly. Alice did not quite know what to say to this: so she helped herself to some tea and bread-and-butter, and then turned to the Dormouse, and repeated her question. “Why did they live at the bottom of a well?” The Dormouse again took a minute or two to think about it, and then said, “It was a treacle-well.” “There’s no such thing!” Alice was beginning very angrily, but the Hatter and the March Hare went “Sh! sh!” and the Dormouse sulkily remarked, “If you can’t be civil, you’d better finish the story for yourself.” “No, please go on!” Alice said very humbly; “I won’t interrupt again. I dare say there may be one.” “One, indeed!” said the Dormouse indignantly. However, he consented to go on. “And so these three little sisters—they were learning to draw, you know—” “What did they draw?” said Alice, quite forgetting her promise. “Treacle,” said the Dormouse, without considering at all this time. “I want a clean cup,” interrupted the Hatter: “let’s all move one place on.” He moved on as he spoke, and the Dormouse followed him: the March Hare moved into the Dormouse’s place, and Alice rather unwillingly took the place of the March Hare. The Hatter was the only one who got any advantage from the change: and Alice was a good deal worse off than before, as the March Hare had just upset the milk-jug into his plate. Alice did not wish to offend the Dormouse again, so she began very cautiously: “But I don’t understand. Where did they draw the treacle from?” “You can draw water out of a water-well,” said the Hatter; “so I should think you could draw treacle out of a treacle-well—eh, stupid?” “But they were in the well,” Alice said to the Dormouse, not choosing to notice this last remark. “Of course they were,” said the Dormouse; “—well in.” This answer so confused poor Alice, that she let the Dormouse go on for some time without interrupting it. “They were learning to draw,” the Dormouse went on, yawning and rubbing its eyes, for it was getting very sleepy; “and they drew all manner of things—everything that begins with an M—” “Why with an M?” said Alice. “Why not?” said the March Hare. Alice was silent. The Dormouse had closed its eyes by this time, and was going off into a doze; but, on being pinched by the Hatter, it woke up again with a little shriek, and went on: “—that begins with an M, such as mouse-traps, and the moon, and memory, and muchness—you know you say things are “much of a muchness”—did you ever see such a thing as a drawing of a muchness?” “Really, now you ask me,” said Alice, very much confused, “I don’t think—” “Then you shouldn’t talk,” said the Hatter. This piece of rudeness was more than Alice could bear: she got up in great disgust, and walked off; the Dormouse fell asleep instantly, and neither of the others took the least notice of her going, though she looked back once or twice, half hoping that they would call after her: the last time she saw them, they were trying to put the Dormouse into the teapot. “At any rate I’ll never go there again!” said Alice as she picked her way through the wood. “It’s the stupidest tea-party I ever was at in all my life!” Just as she said this, she noticed that one of the trees had a door leading right into it. “That’s very curious!” she thought. “But everything’s curious today. I think I may as well go in at once.” And in she went. Once more she found herself in the long hall, and close to the little glass table. “Now, I’ll manage better this time,” she said to herself, and began by taking the little golden key, and unlocking the door that led into the garden. Then she went to work nibbling at the mushroom (she had kept a piece of it in her pocket) till she was about a foot high: then she walked down the little passage: and then—she found herself at last in the beautiful garden, among the bright flower-beds and the cool fountains. ## CHAPTER VIII: The Queen’s Croquet-Ground A large rose-tree stood near the entrance of the garden: the roses growing on it were white, but there were three gardeners at it, busily painting them red. Alice thought this a very curious thing, and she went nearer to watch them, and just as she came up to them she heard one of them say, “Look out now, Five! Don’t go splashing paint over me like that!” “I couldn’t help it,” said Five, in a sulky tone; “Seven jogged my elbow.” On which Seven looked up and said, “That’s right, Five! Always lay the blame on others!” “You’d better not talk!” said Five. “I heard the Queen say only yesterday you deserved to be beheaded!” “What for?” said the one who had spoken first. “That’s none of your business, Two!” said Seven. “Yes, it is his business!” said Five, “and I’ll tell him—it was for bringing the cook tulip-roots instead of onions.” Seven flung down his brush, and had just begun “Well, of all the unjust things—” when his eye chanced to fall upon Alice, as she stood watching them, and he checked himself suddenly: the others looked round also, and all of them bowed low. “Would you tell me,” said Alice, a little timidly, “why you are painting those roses?” Five and Seven said nothing, but looked at Two. Two began in a low voice, “Why the fact is, you see, Miss, this here ought to have been a red rose-tree, and we put a white one in by mistake; and if the Queen was to find it out, we should all have our heads cut off, you know. So you see, Miss, we’re doing our best, afore she comes, to—” At this moment Five, who had been anxiously looking across the garden, called out “The Queen! The Queen!” and the three gardeners instantly threw themselves flat upon their faces. There was a sound of many footsteps, and Alice looked round, eager to see the Queen. First came ten soldiers carrying clubs; these were all shaped like the three gardeners, oblong and flat, with their hands and feet at the corners: next the ten courtiers; these were ornamented all over with diamonds, and walked two and two, as the soldiers did. After these came the royal children; there were ten of them, and the little dears came jumping merrily along hand in hand, in couples: they were all ornamented with hearts. Next came the guests, mostly Kings and Queens, and among them Alice recognised the White Rabbit: it was talking in a hurried nervous manner, smiling at everything that was said, and went by without noticing her. Then followed the Knave of Hearts, carrying the King’s crown on a crimson velvet cushion; and, last of all this grand procession, came THE KING AND QUEEN OF HEARTS. Alice was rather doubtful whether she ought not to lie down on her face like the three gardeners, but she could not remember ever having heard of such a rule at processions; “and besides, what would be the use of a procession,” thought she, “if people had all to lie down upon their faces, so that they couldn’t see it?” So she stood still where she was, and waited. When the procession came opposite to Alice, they all stopped and looked at her, and the Queen said severely “Who is this?” She said it to the Knave of Hearts, who only bowed and smiled in reply. “Idiot!” said the Queen, tossing her head impatiently; and, turning to Alice, she went on, “What’s your name, child?” “My name is Alice, so please your Majesty,” said Alice very politely; but she added, to herself, “Why, they’re only a pack of cards, after all. I needn’t be afraid of them!” “And who are these?” said the Queen, pointing to the three gardeners who were lying round the rose-tree; for, you see, as they were lying on their faces, and the pattern on their backs was the same as the rest of the pack, she could not tell whether they were gardeners, or soldiers, or courtiers, or three of her own children. “How should I know?” said Alice, surprised at her own courage. “It’s no business of mine.” The Queen turned crimson with fury, and, after glaring at her for a moment like a wild beast, screamed “Off with her head! Off—” “Nonsense!” said Alice, very loudly and decidedly, and the Queen was silent. The King laid his hand upon her arm, and timidly said “Consider, my dear: she is only a child!” The Queen turned angrily away from him, and said to the Knave “Turn them over!” The Knave did so, very carefully, with one foot. “Get up!” said the Queen, in a shrill, loud voice, and the three gardeners instantly jumped up, and began bowing to the King, the Queen, the royal children, and everybody else. “Leave off that!” screamed the Queen. “You make me giddy.” And then, turning to the rose-tree, she went on, “What have you been doing here?” “May it please your Majesty,” said Two, in a very humble tone, going down on one knee as he spoke, “we were trying—” “I see!” said the Queen, who had meanwhile been examining the roses. “Off with their heads!” and the procession moved on, three of the soldiers remaining behind to execute the unfortunate gardeners, who ran to Alice for protection. “You shan’t be beheaded!” said Alice, and she put them into a large flower-pot that stood near. The three soldiers wandered about for a minute or two, looking for them, and then quietly marched off after the others. “Are their heads off?” shouted the Queen. “Their heads are gone, if it please your Majesty!” the soldiers shouted in reply. “That’s right!” shouted the Queen. “Can you play croquet?” The soldiers were silent, and looked at Alice, as the question was evidently meant for her. “Yes!” shouted Alice. “Come on, then!” roared the Queen, and Alice joined the procession, wondering very much what would happen next. “It’s—it’s a very fine day!” said a timid voice at her side. She was walking by the White Rabbit, who was peeping anxiously into her face. “Very,” said Alice: “—where’s the Duchess?” “Hush! Hush!” said the Rabbit in a low, hurried tone. He looked anxiously over his shoulder as he spoke, and then raised himself upon tiptoe, put his mouth close to her ear, and whispered “She’s under sentence of execution.” “What for?” said Alice. “Did you say ‘What a pity!’?” the Rabbit asked. “No, I didn’t,” said Alice: “I don’t think it’s at all a pity. I said ‘What for?’” “She boxed the Queen’s ears—” the Rabbit began. Alice gave a little scream of laughter. “Oh, hush!” the Rabbit whispered in a frightened tone. “The Queen will hear you! You see, she came rather late, and the Queen said—” “Get to your places!” shouted the Queen in a voice of thunder, and people began running about in all directions, tumbling up against each other; however, they got settled down in a minute or two, and the game began. Alice thought she had never seen such a curious croquet-ground in her life; it was all ridges and furrows; the balls were live hedgehogs, the mallets live flamingoes, and the soldiers had to double themselves up and to stand on their hands and feet, to make the arches. The chief difficulty Alice found at first was in managing her flamingo: she succeeded in getting its body tucked away, comfortably enough, under her arm, with its legs hanging down, but generally, just as she had got its neck nicely straightened out, and was going to give the hedgehog a blow with its head, it would twist itself round and look up in her face, with such a puzzled expression that she could not help bursting out laughing: and when she had got its head down, and was going to begin again, it was very provoking to find that the hedgehog had unrolled itself, and was in the act of crawling away: besides all this, there was generally a ridge or furrow in the way wherever she wanted to send the hedgehog to, and, as the doubled-up soldiers were always getting up and walking off to other parts of the ground, Alice soon came to the conclusion that it was a very difficult game indeed. The players all played at once without waiting for turns, quarrelling all the while, and fighting for the hedgehogs; and in a very short time the Queen was in a furious passion, and went stamping about, and shouting “Off with his head!” or “Off with her head!” about once in a minute. Alice began to feel very uneasy: to be sure, she had not as yet had any dispute with the Queen, but she knew that it might happen any minute, “and then,” thought she, “what would become of me? They’re dreadfully fond of beheading people here; the great wonder is, that there’s any one left alive!” She was looking about for some way of escape, and wondering whether she could get away without being seen, when she noticed a curious appearance in the air: it puzzled her very much at first, but, after watching it a minute or two, she made it out to be a grin, and she said to herself “It’s the Cheshire Cat: now I shall have somebody to talk to.” “How are you getting on?” said the Cat, as soon as there was mouth enough for it to speak with. Alice waited till the eyes appeared, and then nodded. “It’s no use speaking to it,” she thought, “till its ears have come, or at least one of them.” In another minute the whole head appeared, and then Alice put down her flamingo, and began an account of the game, feeling very glad she had someone to listen to her. The Cat seemed to think that there was enough of it now in sight, and no more of it appeared. “I don’t think they play at all fairly,” Alice began, in rather a complaining tone, “and they all quarrel so dreadfully one can’t hear oneself speak—and they don’t seem to have any rules in particular; at least, if there are, nobody attends to them—and you’ve no idea how confusing it is all the things being alive; for instance, there’s the arch I’ve got to go through next walking about at the other end of the ground—and I should have croqueted the Queen’s hedgehog just now, only it ran away when it saw mine coming!” “How do you like the Queen?” said the Cat in a low voice. “Not at all,” said Alice: “she’s so extremely—” Just then she noticed that the Queen was close behind her, listening: so she went on, “—likely to win, that it’s hardly worth while finishing the game.” The Queen smiled and passed on. “Who are you talking to?” said the King, going up to Alice, and looking at the Cat’s head with great curiosity. “It’s a friend of mine—a Cheshire Cat,” said Alice: “allow me to introduce it.” “I don’t like the look of it at all,” said the King: “however, it may kiss my hand if it likes.” “I’d rather not,” the Cat remarked. “Don’t be impertinent,” said the King, “and don’t look at me like that!” He got behind Alice as he spoke. “A cat may look at a king,” said Alice. “I’ve read that in some book, but I don’t remember where.” “Well, it must be removed,” said the King very decidedly, and he called the Queen, who was passing at the moment, “My dear! I wish you would have this cat removed!” The Queen had only one way of settling all difficulties, great or small. “Off with his head!” she said, without even looking round. “I’ll fetch the executioner myself,” said the King eagerly, and he hurried off. Alice thought she might as well go back, and see how the game was going on, as she heard the Queen’s voice in the distance, screaming with passion. She had already heard her sentence three of the players to be executed for having missed their turns, and she did not like the look of things at all, as the game was in such confusion that she never knew whether it was her turn or not. So she went in search of her hedgehog. The hedgehog was engaged in a fight with another hedgehog, which seemed to Alice an excellent opportunity for croqueting one of them with the other: the only difficulty was, that her flamingo was gone across to the other side of the garden, where Alice could see it trying in a helpless sort of way to fly up into a tree. By the time she had caught the flamingo and brought it back, the fight was over, and both the hedgehogs were out of sight: “but it doesn’t matter much,” thought Alice, “as all the arches are gone from this side of the ground.” So she tucked it away under her arm, that it might not escape again, and went back for a little more conversation with her friend. When she got back to the Cheshire Cat, she was surprised to find quite a large crowd collected round it: there was a dispute going on between the executioner, the King, and the Queen, who were all talking at once, while all the rest were quite silent, and looked very uncomfortable. The moment Alice appeared, she was appealed to by all three to settle the question, and they repeated their arguments to her, though, as they all spoke at once, she found it very hard indeed to make out exactly what they said. The executioner’s argument was, that you couldn’t cut off a head unless there was a body to cut it off from: that he had never had to do such a thing before, and he wasn’t going to begin at his time of life. The King’s argument was, that anything that had a head could be beheaded, and that you weren’t to talk nonsense. The Queen’s argument was, that if something wasn’t done about it in less than no time she’d have everybody executed, all round. (It was this last remark that had made the whole party look so grave and anxious.) Alice could think of nothing else to say but “It belongs to the Duchess: you’d better ask her about it.” “She’s in prison,” the Queen said to the executioner: “fetch her here.” And the executioner went off like an arrow. The Cat’s head began fading away the moment he was gone, and, by the time he had come back with the Duchess, it had entirely disappeared; so the King and the executioner ran wildly up and down looking for it, while the rest of the party went back to the game. ## CHAPTER IX: The Mock Turtle’s Story “You can’t think how glad I am to see you again, you dear old thing!” said the Duchess, as she tucked her arm affectionately into Alice’s, and they walked off together. Alice was very glad to find her in such a pleasant temper, and thought to herself that perhaps it was only the pepper that had made her so savage when they met in the kitchen. “When I’m a Duchess,” she said to herself, (not in a very hopeful tone though), “I won’t have any pepper in my kitchen at all. Soup does very well without—Maybe it’s always pepper that makes people hot-tempered,” she went on, very much pleased at having found out a new kind of rule, “and vinegar that makes them sour—and camomile that makes them bitter—and—and barley-sugar and such things that make children sweet-tempered. I only wish people knew that: then they wouldn’t be so stingy about it, you know—” She had quite forgotten the Duchess by this time, and was a little startled when she heard her voice close to her ear. “You’re thinking about something, my dear, and that makes you forget to talk. I can’t tell you just now what the moral of that is, but I shall remember it in a bit.” “Perhaps it hasn’t one,” Alice ventured to remark. “Tut, tut, child!” said the Duchess. “Everything’s got a moral, if only you can find it.” And she squeezed herself up closer to Alice’s side as she spoke. Alice did not much like keeping so close to her: first, because the Duchess was very ugly; and secondly, because she was exactly the right height to rest her chin upon Alice’s shoulder, and it was an uncomfortably sharp chin. However, she did not like to be rude, so she bore it as well as she could. “The game’s going on rather better now,” she said, by way of keeping up the conversation a little. “’Tis so,” said the Duchess: “and the moral of that is—‘Oh, ’tis love, ’tis love, that makes the world go round!’” “Somebody said,” Alice whispered, “that it’s done by everybody minding their own business!” “Ah, well! It means much the same thing,” said the Duchess, digging her sharp little chin into Alice’s shoulder as she added, “and the moral of that is—‘Take care of the sense, and the sounds will take care of themselves.’” “How fond she is of finding morals in things!” Alice thought to herself. “I dare say you’re wondering why I don’t put my arm round your waist,” the Duchess said after a pause: “the reason is, that I’m doubtful about the temper of your flamingo. Shall I try the experiment?” “He might bite,” Alice cautiously replied, not feeling at all anxious to have the experiment tried. “Very true,” said the Duchess: “flamingoes and mustard both bite. And the moral of that is—‘Birds of a feather flock together.’” “Only mustard isn’t a bird,” Alice remarked. “Right, as usual,” said the Duchess: “what a clear way you have of putting things!” “It’s a mineral, I think,” said Alice. “Of course it is,” said the Duchess, who seemed ready to agree to everything that Alice said; “there’s a large mustard-mine near here. And the moral of that is—‘The more there is of mine, the less there is of yours.’” “Oh, I know!” exclaimed Alice, who had not attended to this last remark, “it’s a vegetable. It doesn’t look like one, but it is.” “I quite agree with you,” said the Duchess; “and the moral of that is—‘Be what you would seem to be’—or if you’d like it put more simply—‘Never imagine yourself not to be otherwise than what it might appear to others that what you were or might have been was not otherwise than what you had been would have appeared to them to be otherwise.’” “I think I should understand that better,” Alice said very politely, “if I had it written down: but I can’t quite follow it as you say it.” “That’s nothing to what I could say if I chose,” the Duchess replied, in a pleased tone. “Pray don’t trouble yourself to say it any longer than that,” said Alice. “Oh, don’t talk about trouble!” said the Duchess. “I make you a present of everything I’ve said as yet.” “A cheap sort of present!” thought Alice. “I’m glad they don’t give birthday presents like that!” But she did not venture to say it out loud. “Thinking again?” the Duchess asked, with another dig of her sharp little chin. “I’ve a right to think,” said Alice sharply, for she was beginning to feel a little worried. “Just about as much right,” said the Duchess, “as pigs have to fly; and the m—” But here, to Alice’s great surprise, the Duchess’s voice died away, even in the middle of her favourite word ‘moral,’ and the arm that was linked into hers began to tremble. Alice looked up, and there stood the Queen in front of them, with her arms folded, frowning like a thunderstorm. “A fine day, your Majesty!” the Duchess began in a low, weak voice. “Now, I give you fair warning,” shouted the Queen, stamping on the ground as she spoke; “either you or your head must be off, and that in about half no time! Take your choice!” The Duchess took her choice, and was gone in a moment. “Let’s go on with the game,” the Queen said to Alice; and Alice was too much frightened to say a word, but slowly followed her back to the croquet-ground. The other guests had taken advantage of the Queen’s absence, and were resting in the shade: however, the moment they saw her, they hurried back to the game, the Queen merely remarking that a moment’s delay would cost them their lives. All the time they were playing the Queen never left off quarrelling with the other players, and shouting “Off with his head!” or “Off with her head!” Those whom she sentenced were taken into custody by the soldiers, who of course had to leave off being arches to do this, so that by the end of half an hour or so there were no arches left, and all the players, except the King, the Queen, and Alice, were in custody and under sentence of execution. Then the Queen left off, quite out of breath, and said to Alice, “Have you seen the Mock Turtle yet?” “No,” said Alice. “I don’t even know what a Mock Turtle is.” “It’s the thing Mock Turtle Soup is made from,” said the Queen. “I never saw one, or heard of one,” said Alice. “Come on, then,” said the Queen, “and he shall tell you his history.” As they walked off together, Alice heard the King say in a low voice, to the company generally, “You are all pardoned.” “Come, that’s a good thing!” she said to herself, for she had felt quite unhappy at the number of executions the Queen had ordered. They very soon came upon a Gryphon, lying fast asleep in the sun. (If you don’t know what a Gryphon is, look at the picture.) “Up, lazy thing!” said the Queen, “and take this young lady to see the Mock Turtle, and to hear his history. I must go back and see after some executions I have ordered;” and she walked off, leaving Alice alone with the Gryphon. Alice did not quite like the look of the creature, but on the whole she thought it would be quite as safe to stay with it as to go after that savage Queen: so she waited. The Gryphon sat up and rubbed its eyes: then it watched the Queen till she was out of sight: then it chuckled. “What fun!” said the Gryphon, half to itself, half to Alice. “What is the fun?” said Alice. “Why, she,” said the Gryphon. “It’s all her fancy, that: they never executes nobody, you know. Come on!” “Everybody says ‘come on!’ here,” thought Alice, as she went slowly after it: “I never was so ordered about in all my life, never!” They had not gone far before they saw the Mock Turtle in the distance, sitting sad and lonely on a little ledge of rock, and, as they came nearer, Alice could hear him sighing as if his heart would break. She pitied him deeply. “What is his sorrow?” she asked the Gryphon, and the Gryphon answered, very nearly in the same words as before, “It’s all his fancy, that: he hasn’t got no sorrow, you know. Come on!” So they went up to the Mock Turtle, who looked at them with large eyes full of tears, but said nothing. “This here young lady,” said the Gryphon, “she wants for to know your history, she do.” “I’ll tell it her,” said the Mock Turtle in a deep, hollow tone: “sit down, both of you, and don’t speak a word till I’ve finished.” So they sat down, and nobody spoke for some minutes. Alice thought to herself, “I don’t see how he can ever finish, if he doesn’t begin.” But she waited patiently. “Once,” said the Mock Turtle at last, with a deep sigh, “I was a real Turtle.” These words were followed by a very long silence, broken only by an occasional exclamation of “Hjckrrh!” from the Gryphon, and the constant heavy sobbing of the Mock Turtle. Alice was very nearly getting up and saying, “Thank you, sir, for your interesting story,” but she could not help thinking there must be more to come, so she sat still and said nothing. “When we were little,” the Mock Turtle went on at last, more calmly, though still sobbing a little now and then, “we went to school in the sea. The master was an old Turtle—we used to call him Tortoise—” “Why did you call him Tortoise, if he wasn’t one?” Alice asked. “We called him Tortoise because he taught us,” said the Mock Turtle angrily: “really you are very dull!” “You ought to be ashamed of yourself for asking such a simple question,” added the Gryphon; and then they both sat silent and looked at poor Alice, who felt ready to sink into the earth. At last the Gryphon said to the Mock Turtle, “Drive on, old fellow! Don’t be all day about it!” and he went on in these words: “Yes, we went to school in the sea, though you mayn’t believe it—” “I never said I didn’t!” interrupted Alice. “You did,” said the Mock Turtle. “Hold your tongue!” added the Gryphon, before Alice could speak again. The Mock Turtle went on. “We had the best of educations—in fact, we went to school every day—” “I’ve been to a day-school, too,” said Alice; “you needn’t be so proud as all that.” “With extras?” asked the Mock Turtle a little anxiously. “Yes,” said Alice, “we learned French and music.” “And washing?” said the Mock Turtle. “Certainly not!” said Alice indignantly. “Ah! then yours wasn’t a really good school,” said the Mock Turtle in a tone of great relief. “Now at ours they had at the end of the bill, ‘French, music, and washing—extra.’” “You couldn’t have wanted it much,” said Alice; “living at the bottom of the sea.” “I couldn’t afford to learn it.” said the Mock Turtle with a sigh. “I only took the regular course.” “What was that?” inquired Alice. “Reeling and Writhing, of course, to begin with,” the Mock Turtle replied; “and then the different branches of Arithmetic—Ambition, Distraction, Uglification, and Derision.” “I never heard of ‘Uglification,’” Alice ventured to say. “What is it?” The Gryphon lifted up both its paws in surprise. “What! Never heard of uglifying!” it exclaimed. “You know what to beautify is, I suppose?” “Yes,” said Alice doubtfully: “it means—to—make—anything—prettier.” “Well, then,” the Gryphon went on, “if you don’t know what to uglify is, you are a simpleton.” Alice did not feel encouraged to ask any more questions about it, so she turned to the Mock Turtle, and said “What else had you to learn?” “Well, there was Mystery,” the Mock Turtle replied, counting off the subjects on his flappers, “—Mystery, ancient and modern, with Seaography: then Drawling—the Drawling-master was an old conger-eel, that used to come once a week: he taught us Drawling, Stretching, and Fainting in Coils.” “What was that like?” said Alice. “Well, I can’t show it you myself,” the Mock Turtle said: “I’m too stiff. And the Gryphon never learnt it.” “Hadn’t time,” said the Gryphon: “I went to the Classics master, though. He was an old crab, he was.” “I never went to him,” the Mock Turtle said with a sigh: “he taught Laughing and Grief, they used to say.” “So he did, so he did,” said the Gryphon, sighing in his turn; and both creatures hid their faces in their paws. “And how many hours a day did you do lessons?” said Alice, in a hurry to change the subject. “Ten hours the first day,” said the Mock Turtle: “nine the next, and so on.” “What a curious plan!” exclaimed Alice. “That’s the reason they’re called lessons,” the Gryphon remarked: “because they lessen from day to day.” This was quite a new idea to Alice, and she thought it over a little before she made her next remark. “Then the eleventh day must have been a holiday?” “Of course it was,” said the Mock Turtle. “And how did you manage on the twelfth?” Alice went on eagerly. “That’s enough about lessons,” the Gryphon interrupted in a very decided tone: “tell her something about the games now.” ## CHAPTER X: The Lobster Quadrille The Mock Turtle sighed deeply, and drew the back of one flapper across his eyes. He looked at Alice, and tried to speak, but for a minute or two sobs choked his voice. “Same as if he had a bone in his throat,” said the Gryphon: and it set to work shaking him and punching him in the back. At last the Mock Turtle recovered his voice, and, with tears running down his cheeks, he went on again:— “You may not have lived much under the sea—” (“I haven’t,” said Alice)—“and perhaps you were never even introduced to a lobster—” (Alice began to say “I once tasted—” but checked herself hastily, and said “No, never”) “—so you can have no idea what a delightful thing a Lobster Quadrille is!” “No, indeed,” said Alice. “What sort of a dance is it?” “Why,” said the Gryphon, “you first form into a line along the sea-shore—” “Two lines!” cried the Mock Turtle. “Seals, turtles, salmon, and so on; then, when you’ve cleared all the jelly-fish out of the way—” “That generally takes some time,” interrupted the Gryphon. “—you advance twice—” “Each with a lobster as a partner!” cried the Gryphon. “Of course,” the Mock Turtle said: “advance twice, set to partners—” “—change lobsters, and retire in same order,” continued the Gryphon. “Then, you know,” the Mock Turtle went on, “you throw the—” “The lobsters!” shouted the Gryphon, with a bound into the air. “—as far out to sea as you can—” “Swim after them!” screamed the Gryphon. “Turn a somersault in the sea!” cried the Mock Turtle, capering wildly about. “Change lobsters again!” yelled the Gryphon at the top of its voice. “Back to land again, and that’s all the first figure,” said the Mock Turtle, suddenly dropping his voice; and the two creatures, who had been jumping about like mad things all this time, sat down again very sadly and quietly, and looked at Alice. “It must be a very pretty dance,” said Alice timidly. “Would you like to see a little of it?” said the Mock Turtle. “Very much indeed,” said Alice. “Come, let’s try the first figure!” said the Mock Turtle to the Gryphon. “We can do without lobsters, you know. Which shall sing?” “Oh, you sing,” said the Gryphon. “I’ve forgotten the words.” So they began solemnly dancing round and round Alice, every now and then treading on her toes when they passed too close, and waving their forepaws to mark the time, while the Mock Turtle sang this, very slowly and sadly:— > “Will you walk a little faster?” said a whiting to a snail. “There’s a > porpoise close behind us, and he’s treading on my tail. See how eagerly the > lobsters and the turtles all advance! They are waiting on the shingle—will you > come and join the dance? Will you, won’t you, will you, won’t you, will you > join the dance? Will you, won’t you, will you, won’t you, won’t you join the > dance? > > “You can really have no notion how delightful it will be When they take us up > and throw us, with the lobsters, out to sea!” But the snail replied “Too far, > too far!” and gave a look askance— Said he thanked the whiting kindly, but he > would not join the dance. Would not, could not, would not, could not, would > not join the dance. Would not, could not, would not, could not, could not join > the dance. > > “What matters it how far we go?” his scaly friend replied. “There is another > shore, you know, upon the other side. The further off from England the nearer > is to France— Then turn not pale, beloved snail, but come and join the dance. > Will you, won’t you, will you, won’t you, will you join the dance? Will you, > won’t you, will you, won’t you, won’t you join the dance?” “Thank you, it’s a very interesting dance to watch,” said Alice, feeling very glad that it was over at last: “and I do so like that curious song about the whiting!” “Oh, as to the whiting,” said the Mock Turtle, “they—you’ve seen them, of course?” “Yes,” said Alice, “I’ve often seen them at dinn—” she checked herself hastily. “I don’t know where Dinn may be,” said the Mock Turtle, “but if you’ve seen them so often, of course you know what they’re like.” “I believe so,” Alice replied thoughtfully. “They have their tails in their mouths—and they’re all over crumbs.” “You’re wrong about the crumbs,” said the Mock Turtle: “crumbs would all wash off in the sea. But they have their tails in their mouths; and the reason is—” here the Mock Turtle yawned and shut his eyes.—“Tell her about the reason and all that,” he said to the Gryphon. “The reason is,” said the Gryphon, “that they would go with the lobsters to the dance. So they got thrown out to sea. So they had to fall a long way. So they got their tails fast in their mouths. So they couldn’t get them out again. That’s all.” “Thank you,” said Alice, “it’s very interesting. I never knew so much about a whiting before.” “I can tell you more than that, if you like,” said the Gryphon. “Do you know why it’s called a whiting?” “I never thought about it,” said Alice. “Why?” “It does the boots and shoes,” the Gryphon replied very solemnly. Alice was thoroughly puzzled. “Does the boots and shoes!” she repeated in a wondering tone. “Why, what are your shoes done with?” said the Gryphon. “I mean, what makes them so shiny?” Alice looked down at them, and considered a little before she gave her answer. “They’re done with blacking, I believe.” “Boots and shoes under the sea,” the Gryphon went on in a deep voice, “are done with a whiting. Now you know.” “And what are they made of?” Alice asked in a tone of great curiosity. “Soles and eels, of course,” the Gryphon replied rather impatiently: “any shrimp could have told you that.” “If I’d been the whiting,” said Alice, whose thoughts were still running on the song, “I’d have said to the porpoise, ‘Keep back, please: we don’t want you with us!’” “They were obliged to have him with them,” the Mock Turtle said: “no wise fish would go anywhere without a porpoise.” “Wouldn’t it really?” said Alice in a tone of great surprise. “Of course not,” said the Mock Turtle: “why, if a fish came to me, and told me he was going a journey, I should say ‘With what porpoise?’” “Don’t you mean ‘purpose’?” said Alice. “I mean what I say,” the Mock Turtle replied in an offended tone. And the Gryphon added “Come, let’s hear some of your adventures.” “I could tell you my adventures—beginning from this morning,” said Alice a little timidly: “but it’s no use going back to yesterday, because I was a different person then.” “Explain all that,” said the Mock Turtle. “No, no! The adventures first,” said the Gryphon in an impatient tone: “explanations take such a dreadful time.” So Alice began telling them her adventures from the time when she first saw the White Rabbit. She was a little nervous about it just at first, the two creatures got so close to her, one on each side, and opened their eyes and mouths so very wide, but she gained courage as she went on. Her listeners were perfectly quiet till she got to the part about her repeating “You are old, Father William,” to the Caterpillar, and the words all coming different, and then the Mock Turtle drew a long breath, and said “That’s very curious.” “It’s all about as curious as it can be,” said the Gryphon. “It all came different!” the Mock Turtle repeated thoughtfully. “I should like to hear her try and repeat something now. Tell her to begin.” He looked at the Gryphon as if he thought it had some kind of authority over Alice. “Stand up and repeat ‘’Tis the voice of the sluggard,’” said the Gryphon. “How the creatures order one about, and make one repeat lessons!” thought Alice; “I might as well be at school at once.” However, she got up, and began to repeat it, but her head was so full of the Lobster Quadrille, that she hardly knew what she was saying, and the words came very queer indeed:— > “’Tis the voice of the Lobster; I heard him declare, “You have baked me too > brown, I must sugar my hair.” As a duck with its eyelids, so he with his nose > Trims his belt and his buttons, and turns out his toes.” > > (later editions continued as follows When the sands are all dry, he is gay as > a lark, And will talk in contemptuous tones of the Shark, But, when the tide > rises and sharks are around, His voice has a timid and tremulous sound.) “That’s different from what I used to say when I was a child,” said the Gryphon. “Well, I never heard it before,” said the Mock Turtle; “but it sounds uncommon nonsense.” Alice said nothing; she had sat down with her face in her hands, wondering if anything would ever happen in a natural way again. “I should like to have it explained,” said the Mock Turtle. “She can’t explain it,” said the Gryphon hastily. “Go on with the next verse.” “But about his toes?” the Mock Turtle persisted. “How could he turn them out with his nose, you know?” “It’s the first position in dancing.” Alice said; but was dreadfully puzzled by the whole thing, and longed to change the subject. “Go on with the next verse,” the Gryphon repeated impatiently: “it begins ‘I passed by his garden.’” Alice did not dare to disobey, though she felt sure it would all come wrong, and she went on in a trembling voice:— > “I passed by his garden, and marked, with one eye, How the Owl and the Panther > were sharing a pie—” > > (later editions continued as follows The Panther took pie-crust, and gravy, > and meat, While the Owl had the dish as its share of the treat. When the pie > was all finished, the Owl, as a boon, Was kindly permitted to pocket the > spoon: While the Panther received knife and fork with a growl, And concluded > the banquet—) “What is the use of repeating all that stuff,” the Mock Turtle interrupted, “if you don’t explain it as you go on? It’s by far the most confusing thing I ever heard!” “Yes, I think you’d better leave off,” said the Gryphon: and Alice was only too glad to do so. “Shall we try another figure of the Lobster Quadrille?” the Gryphon went on. “Or would you like the Mock Turtle to sing you a song?” “Oh, a song, please, if the Mock Turtle would be so kind,” Alice replied, so eagerly that the Gryphon said, in a rather offended tone, “Hm! No accounting for tastes! Sing her ‘Turtle Soup,’ will you, old fellow?” The Mock Turtle sighed deeply, and began, in a voice sometimes choked with sobs, to sing this:— > “Beautiful Soup, so rich and green, Waiting in a hot tureen! Who for such > dainties would not stoop? Soup of the evening, beautiful Soup! Soup of the > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop > of the e—e—evening, Beautiful, beautiful Soup! > > “Beautiful Soup! Who cares for fish, Game, or any other dish? Who would not > give all else for two p ennyworth only of beautiful Soup? Pennyworth only of > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the > e—e—evening, Beautiful, beauti—FUL SOUP!” “Chorus again!” cried the Gryphon, and the Mock Turtle had just begun to repeat it, when a cry of “The trial’s beginning!” was heard in the distance. “Come on!” cried the Gryphon, and, taking Alice by the hand, it hurried off, without waiting for the end of the song. “What trial is it?” Alice panted as she ran; but the Gryphon only answered “Come on!” and ran the faster, while more and more faintly came, carried on the breeze that followed them, the melancholy words:— > “Soo—oop of the e—e—evening, Beautiful, beautiful Soup!” ## CHAPTER XI: Who Stole the Tarts? The King and Queen of Hearts were seated on their throne when they arrived, with a great crowd assembled about them—all sorts of little birds and beasts, as well as the whole pack of cards: the Knave was standing before them, in chains, with a soldier on each side to guard him; and near the King was the White Rabbit, with a trumpet in one hand, and a scroll of parchment in the other. In the very middle of the court was a table, with a large dish of tarts upon it: they looked so good, that it made Alice quite hungry to look at them—“I wish they’d get the trial done,” she thought, “and hand round the refreshments!” But there seemed to be no chance of this, so she began looking at everything about her, to pass away the time. Alice had never been in a court of justice before, but she had read about them in books, and she was quite pleased to find that she knew the name of nearly everything there. “That’s the judge,” she said to herself, “because of his great wig.” The judge, by the way, was the King; and as he wore his crown over the wig, (look at the frontispiece if you want to see how he did it,) he did not look at all comfortable, and it was certainly not becoming. “And that’s the jury-box,” thought Alice, “and those twelve creatures,” (she was obliged to say “creatures,” you see, because some of them were animals, and some were birds,) “I suppose they are the jurors.” She said this last word two or three times over to herself, being rather proud of it: for she thought, and rightly too, that very few little girls of her age knew the meaning of it at all. However, “jury-men” would have done just as well. The twelve jurors were all writing very busily on slates. “What are they doing?” Alice whispered to the Gryphon. “They can’t have anything to put down yet, before the trial’s begun.” “They’re putting down their names,” the Gryphon whispered in reply, “for fear they should forget them before the end of the trial.” “Stupid things!” Alice began in a loud, indignant voice, but she stopped hastily, for the White Rabbit cried out, “Silence in the court!” and the King put on his spectacles and looked anxiously round, to make out who was talking. Alice could see, as well as if she were looking over their shoulders, that all the jurors were writing down “stupid things!” on their slates, and she could even make out that one of them didn’t know how to spell “stupid,” and that he had to ask his neighbour to tell him. “A nice muddle their slates’ll be in before the trial’s over!” thought Alice. One of the jurors had a pencil that squeaked. This of course, Alice could not stand, and she went round the court and got behind him, and very soon found an opportunity of taking it away. She did it so quickly that the poor little juror (it was Bill, the Lizard) could not make out at all what had become of it; so, after hunting all about for it, he was obliged to write with one finger for the rest of the day; and this was of very little use, as it left no mark on the slate. “Herald, read the accusation!” said the King. On this the White Rabbit blew three blasts on the trumpet, and then unrolled the parchment scroll, and read as follows:— > “The Queen of Hearts, she made some tarts, All on a summer day: The Knave of > Hearts, he stole those tarts, And took them quite away!” “Consider your verdict,” the King said to the jury. “Not yet, not yet!” the Rabbit hastily interrupted. “There’s a great deal to come before that!” “Call the first witness,” said the King; and the White Rabbit blew three blasts on the trumpet, and called out, “First witness!” The first witness was the Hatter. He came in with a teacup in one hand and a piece of bread-and-butter in the other. “I beg pardon, your Majesty,” he began, “for bringing these in: but I hadn’t quite finished my tea when I was sent for.” “You ought to have finished,” said the King. “When did you begin?” The Hatter looked at the March Hare, who had followed him into the court, arm-in-arm with the Dormouse. “Fourteenth of March, I think it was,” he said. “Fifteenth,” said the March Hare. “Sixteenth,” added the Dormouse. “Write that down,” the King said to the jury, and the jury eagerly wrote down all three dates on their slates, and then added them up, and reduced the answer to shillings and pence. “Take off your hat,” the King said to the Hatter. “It isn’t mine,” said the Hatter. “Stolen!” the King exclaimed, turning to the jury, who instantly made a memorandum of the fact. “I keep them to sell,” the Hatter added as an explanation; “I’ve none of my own. I’m a hatter.” Here the Queen put on her spectacles, and began staring at the Hatter, who turned pale and fidgeted. “Give your evidence,” said the King; “and don’t be nervous, or I’ll have you executed on the spot.” This did not seem to encourage the witness at all: he kept shifting from one foot to the other, looking uneasily at the Queen, and in his confusion he bit a large piece out of his teacup instead of the bread-and-butter. Just at this moment Alice felt a very curious sensation, which puzzled her a good deal until she made out what it was: she was beginning to grow larger again, and she thought at first she would get up and leave the court; but on second thoughts she decided to remain where she was as long as there was room for her. “I wish you wouldn’t squeeze so.” said the Dormouse, who was sitting next to her. “I can hardly breathe.” “I can’t help it,” said Alice very meekly: “I’m growing.” “You’ve no right to grow here,” said the Dormouse. “Don’t talk nonsense,” said Alice more boldly: “you know you’re growing too.” “Yes, but I grow at a reasonable pace,” said the Dormouse: “not in that ridiculous fashion.” And he got up very sulkily and crossed over to the other side of the court. All this time the Queen had never left off staring at the Hatter, and, just as the Dormouse crossed the court, she said to one of the officers of the court, “Bring me the list of the singers in the last concert!” on which the wretched Hatter trembled so, that he shook both his shoes off. “Give your evidence,” the King repeated angrily, “or I’ll have you executed, whether you’re nervous or not.” “I’m a poor man, your Majesty,” the Hatter began, in a trembling voice, “—and I hadn’t begun my tea—not above a week or so—and what with the bread-and-butter getting so thin—and the twinkling of the tea—” “The twinkling of the what?” said the King. “It began with the tea,” the Hatter replied. “Of course twinkling begins with a T!” said the King sharply. “Do you take me for a dunce? Go on!” “I’m a poor man,” the Hatter went on, “and most things twinkled after that—only the March Hare said—” “I didn’t!” the March Hare interrupted in a great hurry. “You did!” said the Hatter. “I deny it!” said the March Hare. “He denies it,” said the King: “leave out that part.” “Well, at any rate, the Dormouse said—” the Hatter went on, looking anxiously round to see if he would deny it too: but the Dormouse denied nothing, being fast asleep. “After that,” continued the Hatter, “I cut some more bread-and-butter—” “But what did the Dormouse say?” one of the jury asked. “That I can’t remember,” said the Hatter. “You must remember,” remarked the King, “or I’ll have you executed.” The miserable Hatter dropped his teacup and bread-and-butter, and went down on one knee. “I’m a poor man, your Majesty,” he began. “You’re a very poor speaker,” said the King. Here one of the guinea-pigs cheered, and was immediately suppressed by the officers of the court. (As that is rather a hard word, I will just explain to you how it was done. They had a large canvas bag, which tied up at the mouth with strings: into this they slipped the guinea-pig, head first, and then sat upon it.) “I’m glad I’ve seen that done,” thought Alice. “I’ve so often read in the newspapers, at the end of trials, “There was some attempts at applause, which was immediately suppressed by the officers of the court,” and I never understood what it meant till now.” “If that’s all you know about it, you may stand down,” continued the King. “I can’t go no lower,” said the Hatter: “I’m on the floor, as it is.” “Then you may sit down,” the King replied. Here the other guinea-pig cheered, and was suppressed. “Come, that finished the guinea-pigs!” thought Alice. “Now we shall get on better.” “I’d rather finish my tea,” said the Hatter, with an anxious look at the Queen, who was reading the list of singers. “You may go,” said the King, and the Hatter hurriedly left the court, without even waiting to put his shoes on. “—and just take his head off outside,” the Queen added to one of the officers: but the Hatter was out of sight before the officer could get to the door. “Call the next witness!” said the King. The next witness was the Duchess’s cook. She carried the pepper-box in her hand, and Alice guessed who it was, even before she got into the court, by the way the people near the door began sneezing all at once. “Give your evidence,” said the King. “Shan’t,” said the cook. The King looked anxiously at the White Rabbit, who said in a low voice, “Your Majesty must cross-examine this witness.” “Well, if I must, I must,” the King said, with a melancholy air, and, after folding his arms and frowning at the cook till his eyes were nearly out of sight, he said in a deep voice, “What are tarts made of?” “Pepper, mostly,” said the cook. “Treacle,” said a sleepy voice behind her. “Collar that Dormouse,” the Queen shrieked out. “Behead that Dormouse! Turn that Dormouse out of court! Suppress him! Pinch him! Off with his whiskers!” For some minutes the whole court was in confusion, getting the Dormouse turned out, and, by the time they had settled down again, the cook had disappeared. “Never mind!” said the King, with an air of great relief. “Call the next witness.” And he added in an undertone to the Queen, “Really, my dear, you must cross-examine the next witness. It quite makes my forehead ache!” Alice watched the White Rabbit as he fumbled over the list, feeling very curious to see what the next witness would be like, “—for they haven’t got much evidence yet,” she said to herself. Imagine her surprise, when the White Rabbit read out, at the top of his shrill little voice, the name “Alice!” ## CHAPTER XII: Alice’s Evidence “Here!” cried Alice, quite forgetting in the flurry of the moment how large she had grown in the last few minutes, and she jumped up in such a hurry that she tipped over the jury-box with the edge of her skirt, upsetting all the jurymen on to the heads of the crowd below, and there they lay sprawling about, reminding her very much of a globe of goldfish she had accidentally upset the week before. “Oh, I beg your pardon!” she exclaimed in a tone of great dismay, and began picking them up again as quickly as she could, for the accident of the goldfish kept running in her head, and she had a vague sort of idea that they must be collected at once and put back into the jury-box, or they would die. “The trial cannot proceed,” said the King in a very grave voice, “until all the jurymen are back in their proper places—all,” he repeated with great emphasis, looking hard at Alice as he said so. Alice looked at the jury-box, and saw that, in her haste, she had put the Lizard in head downwards, and the poor little thing was waving its tail about in a melancholy way, being quite unable to move. She soon got it out again, and put it right; “not that it signifies much,” she said to herself; “I should think it would be quite as much use in the trial one way up as the other.” As soon as the jury had a little recovered from the shock of being upset, and their slates and pencils had been found and handed back to them, they set to work very diligently to write out a history of the accident, all except the Lizard, who seemed too much overcome to do anything but sit with its mouth open, gazing up into the roof of the court. “What do you know about this business?” the King said to Alice. “Nothing,” said Alice. “Nothing whatever?” persisted the King. “Nothing whatever,” said Alice. “That’s very important,” the King said, turning to the jury. They were just beginning to write this down on their slates, when the White Rabbit interrupted: “Unimportant, your Majesty means, of course,” he said in a very respectful tone, but frowning and making faces at him as he spoke. “Unimportant, of course, I meant,” the King hastily said, and went on to himself in an undertone, “important—unimportant—unimportant—important—” as if he were trying which word sounded best. Some of the jury wrote it down “important,” and some “unimportant.” Alice could see this, as she was near enough to look over their slates; “but it doesn’t matter a bit,” she thought to herself. At this moment the King, who had been for some time busily writing in his note-book, cackled out “Silence!” and read out from his book, “Rule Forty-two. All persons more than a mile high to leave the court.” Everybody looked at Alice. “I’m not a mile high,” said Alice. “You are,” said the King. “Nearly two miles high,” added the Queen. “Well, I shan’t go, at any rate,” said Alice: “besides, that’s not a regular rule: you invented it just now.” “It’s the oldest rule in the book,” said the King. “Then it ought to be Number One,” said Alice. The King turned pale, and shut his note-book hastily. “Consider your verdict,” he said to the jury, in a low, trembling voice. “There’s more evidence to come yet, please your Majesty,” said the White Rabbit, jumping up in a great hurry; “this paper has just been picked up.” “What’s in it?” said the Queen. “I haven’t opened it yet,” said the White Rabbit, “but it seems to be a letter, written by the prisoner to—to somebody.” “It must have been that,” said the King, “unless it was written to nobody, which isn’t usual, you know.” “Who is it directed to?” said one of the jurymen. “It isn’t directed at all,” said the White Rabbit; “in fact, there’s nothing written on the outside.” He unfolded the paper as he spoke, and added “It isn’t a letter, after all: it’s a set of verses.” “Are they in the prisoner’s handwriting?” asked another of the jurymen. “No, they’re not,” said the White Rabbit, “and that’s the queerest thing about it.” (The jury all looked puzzled.) “He must have imitated somebody else’s hand,” said the King. (The jury all brightened up again.) “Please your Majesty,” said the Knave, “I didn’t write it, and they can’t prove I did: there’s no name signed at the end.” “If you didn’t sign it,” said the King, “that only makes the matter worse. You must have meant some mischief, or else you’d have signed your name like an honest man.” There was a general clapping of hands at this: it was the first really clever thing the King had said that day. “That proves his guilt,” said the Queen. “It proves nothing of the sort!” said Alice. “Why, you don’t even know what they’re about!” “Read them,” said the King. The White Rabbit put on his spectacles. “Where shall I begin, please your Majesty?” he asked. “Begin at the beginning,” the King said gravely, “and go on till you come to the end: then stop.” These were the verses the White Rabbit read:— > “They told me you had been to her, And mentioned me to him: She gave me a good > character, But said I could not swim. > > He sent them word I had not gone (We know it to be true): If she should push > the matter on, What would become of you? > > I gave her one, they gave him two, You gave us three or more; They all > returned from him to you, Though they were mine before. > > If I or she should chance to be Involved in this affair, He trusts to you to > set them free, Exactly as we were. > > My notion was that you had been (Before she had this fit) An obstacle that > came between Him, and ourselves, and it. > > Don’t let him know she liked them best, For this must ever be A secret, kept > from all the rest, Between yourself and me.” “That’s the most important piece of evidence we’ve heard yet,” said the King, rubbing his hands; “so now let the jury—” “If any one of them can explain it,” said Alice, (she had grown so large in the last few minutes that she wasn’t a bit afraid of interrupting him,) “I’ll give him sixpence. I don’t believe there’s an atom of meaning in it.” The jury all wrote down on their slates, “She doesn’t believe there’s an atom of meaning in it,” but none of them attempted to explain the paper. “If there’s no meaning in it,” said the King, “that saves a world of trouble, you know, as we needn’t try to find any. And yet I don’t know,” he went on, spreading out the verses on his knee, and looking at them with one eye; “I seem to see some meaning in them, after all. “—said I could not swim—” you can’t swim, can you?” he added, turning to the Knave. The Knave shook his head sadly. “Do I look like it?” he said. (Which he certainly did not, being made entirely of cardboard.) “All right, so far,” said the King, and he went on muttering over the verses to himself: “‘We know it to be true—’ that’s the jury, of course—‘I gave her one, they gave him two—’ why, that must be what he did with the tarts, you know—” “But, it goes on ‘they all returned from him to you,’” said Alice. “Why, there they are!” said the King triumphantly, pointing to the tarts on the table. “Nothing can be clearer than that. Then again—‘before she had this fit—’ you never had fits, my dear, I think?” he said to the Queen. “Never!” said the Queen furiously, throwing an inkstand at the Lizard as she spoke. (The unfortunate little Bill had left off writing on his slate with one finger, as he found it made no mark; but he now hastily began again, using the ink, that was trickling down his face, as long as it lasted.) “Then the words don’t fit you,” said the King, looking round the court with a smile. There was a dead silence. “It’s a pun!” the King added in an offended tone, and everybody laughed, “Let the jury consider their verdict,” the King said, for about the twentieth time that day. “No, no!” said the Queen. “Sentence first—verdict afterwards.” “Stuff and nonsense!” said Alice loudly. “The idea of having the sentence first!” “Hold your tongue!” said the Queen, turning purple. “I won’t!” said Alice. “Off with her head!” the Queen shouted at the top of her voice. Nobody moved. “Who cares for you?” said Alice, (she had grown to her full size by this time.) “You’re nothing but a pack of cards!” At this the whole pack rose up into the air, and came flying down upon her: she gave a little scream, half of fright and half of anger, and tried to beat them off, and found herself lying on the bank, with her head in the lap of her sister, who was gently brushing away some dead leaves that had fluttered down from the trees upon her face. “Wake up, Alice dear!” said her sister; “Why, what a long sleep you’ve had!” “Oh, I’ve had such a curious dream!” said Alice, and she told her sister, as well as she could remember them, all these strange Adventures of hers that you have just been reading about; and when she had finished, her sister kissed her, and said, “It was a curious dream, dear, certainly: but now run in to your tea; it’s getting late.” So Alice got up and ran off, thinking while she ran, as well she might, what a wonderful dream it had been. --- But her sister sat still just as she left her, leaning her head on her hand, watching the setting sun, and thinking of little Alice and all her wonderful Adventures, till she too began dreaming after a fashion, and this was her dream:— First, she dreamed of little Alice herself, and once again the tiny hands were clasped upon her knee, and the bright eager eyes were looking up into hers—she could hear the very tones of her voice, and see that queer little toss of her head to keep back the wandering hair that would always get into her eyes—and still as she listened, or seemed to listen, the whole place around her became alive with the strange creatures of her little sister’s dream. The long grass rustled at her feet as the White Rabbit hurried by—the frightened Mouse splashed his way through the neighbouring pool—she could hear the rattle of the teacups as the March Hare and his friends shared their never-ending meal, and the shrill voice of the Queen ordering off her unfortunate guests to execution—once more the pig-baby was sneezing on the Duchess’s knee, while plates and dishes crashed around it—once more the shriek of the Gryphon, the squeaking of the Lizard’s slate-pencil, and the choking of the suppressed guinea-pigs, filled the air, mixed up with the distant sobs of the miserable Mock Turtle. So she sat on, with closed eyes, and half believed herself in Wonderland, though she knew she had but to open them again, and all would change to dull reality—the grass would be only rustling in the wind, and the pool rippling to the waving of the reeds—the rattling teacups would change to tinkling sheep-bells, and the Queen’s shrill cries to the voice of the shepherd boy—and the sneeze of the baby, the shriek of the Gryphon, and all the other queer noises, would change (she knew) to the confused clamour of the busy farm-yard—while the lowing of the cattle in the distance would take the place of the Mock Turtle’s heavy sobs. Lastly, she pictured to herself how this same little sister of hers would, in the after-time, be herself a grown woman; and how she would keep, through all her riper years, the simple and loving heart of her childhood: and how she would gather about her other little children, and make their eyes bright and eager with many a strange tale, perhaps even with the dream of Wonderland of long ago: and how she would feel with all their simple sorrows, and find a pleasure in all their simple joys, remembering her own child-life, and the happy summer days. THE END ================================================ FILE: harper-core/tests/text/Computer science.md ================================================ # Computer science Computer science is the study of computation, information, and automation. Computer science spans theoretical disciplines (such as algorithms, theory of computation, and information theory) to applied disciplines (including the design and implementation of hardware and software). Algorithms and data structures are central to computer science. The theory of computation concerns abstract models of computation and general classes of problems that can be solved using them. The fields of cryptography and computer security involve studying the means for secure communication and preventing security vulnerabilities. Computer graphics and computational geometry address the generation of images. Programming language theory considers different ways to describe computational processes, and database theory concerns the management of repositories of data. Human–computer interaction investigates the interfaces through which humans and computers interact, and software engineering focuses on the design and principles behind developing software. Areas such as operating systems, networks and embedded systems investigate the principles and design behind complex systems. Computer architecture describes the construction of computer components and computer-operated equipment. Artificial intelligence and machine learning aim to synthesize goal-orientated processes such as problem-solving, decision-making, environmental adaptation, planning and learning found in humans and animals. Within artificial intelligence, computer vision aims to understand and process image and video data, while natural language processing aims to understand and process textual and linguistic data. The fundamental concern of computer science is determining what can and cannot be automated. The Turing Award is generally recognized as the highest distinction in computer science. ## History The earliest foundations of what would become computer science predate the invention of the modern digital computer. Machines for calculating fixed numerical tasks such as the abacus have existed since antiquity, aiding in computations such as multiplication and division. Algorithms for performing computations have existed since antiquity, even before the development of sophisticated computing equipment. Wilhelm Schickard designed and constructed the first working mechanical calculator in 1623. In 1673, Gottfried Leibniz demonstrated a digital mechanical calculator, called the Stepped Reckoner. Leibniz may be considered the first computer scientist and information theorist, because of various reasons, including the fact that he documented the binary number system. In 1820, Thomas de Colmar launched the mechanical calculator industry[note 1] when he invented his simplified arithmometer, the first calculating machine strong enough and reliable enough to be used daily in an office environment. Charles Babbage started the design of the first automatic mechanical calculator, his Difference Engine, in 1822, which eventually gave him the idea of the first programmable mechanical calculator, his Analytical Engine. He started developing this machine in 1834, and "in less than two years, he had sketched out many of the salient features of the modern computer". "A crucial step was the adoption of a punched card system derived from the Jacquard loom" making it infinitely programmable.[note 2] In 1843, during the translation of a French article on the Analytical Engine, Ada Lovelace wrote, in one of the many notes she included, an algorithm to compute the Bernoulli numbers, which is considered to be the first published algorithm ever specifically tailored for implementation on a computer. Around 1885, Herman Hollerith invented the tabulator, which used punched cards to process statistical information; eventually his company became part of IBM. Following Babbage, although unaware of his earlier work, Percy Ludgate in 1909 published the 2nd of the only two designs for mechanical analytical engines in history. In 1914, the Spanish engineer Leonardo Torres Quevedo published his Essays on Automatics, and designed, inspired by Babbage, a theoretical electromechanical calculating machine which was to be controlled by a read-only program. The paper also introduced the idea of floating-point arithmetic. In 1920, to celebrate the 100th anniversary of the invention of the arithmometer, Torres presented in Paris the Electromechanical Arithmometer, a prototype that demonstrated the feasibility of an electromechanical analytical engine, on which commands could be typed and the results printed automatically. In 1937, one hundred years after Babbage's impossible dream, Howard Aiken convinced IBM, which was making all kinds of punched card equipment and was also in the calculator business to develop his giant programmable calculator, the ASCC/Harvard Mark I, based on Babbage's Analytical Engine, which itself used cards and a central computing unit. When the machine was finished, some hailed it as "Babbage's dream come true". During the 1940s, with the development of new and more powerful computing machines such as the Atanasoff–Berry computer and ENIAC, the term computer came to refer to the machines rather than their human predecessors. As it became clear that computers could be used for more than just mathematical calculations, the field of computer science broadened to study computation in general. In 1945, IBM founded the Watson Scientific Computing Laboratory at Columbia University in New York City. The renovated fraternity house on Manhattan's West Side was IBM's first laboratory devoted to pure science. The lab is the forerunner of IBM's Research Division, which today operates research facilities around the world. Ultimately, the close relationship between IBM and Columbia University was instrumental in the emergence of a new scientific discipline, with Columbia offering one of the first academic-credit courses in computer science in 1946. Computer science began to be established as a distinct academic discipline in the 1950s and early 1960s. The world's first computer science degree program, the Cambridge Diploma in Computer Science, began at the University of Cambridge Computer Laboratory in 1953. The first computer science department in the United States was formed at Purdue University in 1962. Since practical computers became available, many applications of computing have become distinct areas of study in their own rights. ## Etymology and scope Although first proposed in 1956, the term "computer science" appears in a 1959 article in Communications of the ACM, in which Louis Fein argues for the creation of a Graduate School in Computer Sciences analogous to the creation of Harvard Business School in 1921. Louis justifies the name by arguing that, like management science, the subject is applied and interdisciplinary in nature, while having the characteristics typical of an academic discipline. His efforts, and those of others such as numerical analyst George Forsythe, were rewarded: universities went on to create such departments, starting with Purdue in 1962. Despite its name, a significant amount of computer science does not involve the study of computers themselves. Because of this, several alternative names have been proposed. Certain departments of major universities prefer the term computing science, to emphasize precisely that difference. Danish scientist Peter Naur suggested the term datalogy, to reflect the fact that the scientific discipline revolves around data and data treatment, while not necessarily involving computers. The first scientific institution to use the term was the Department of Datalogy at the University of Copenhagen, founded in 1969, with Peter Naur being the first professor in datalogy. The term is used mainly in the Scandinavian countries. An alternative term, also proposed by Naur, is data science; this is now used for a multi-disciplinary field of data analysis, including statistics and databases. In the early days of computing, a number of terms for the practitioners of the field of computing were suggested (albeit facetiously) in the Communications of the ACM—turingineer, turologist, flow-charts-man, applied meta-mathematician, and applied epistemologist. Three months later in the same journal, comptologist was suggested, followed next year by hypologist. The term computics has also been suggested. In Europe, terms derived from contracted translations of the expression "automatic information" (e.g. "informazione automatica" in Italian) or "information and mathematics" are often used, e.g. informatique (French), Informatik (German), informatica (Italian, Dutch), informática (Spanish, Portuguese), informatika (Slavic languages and Hungarian) or pliroforiki (πληροφορική, which means informatics) in Greek. Similar words have also been adopted in the UK (as in the School of Informatics, University of Edinburgh). "In the U.S., however, informatics is linked with applied computing, or computing in the context of another domain." A folkloric quotation, often attributed to—but almost certainly not first formulated by—Edsger Dijkstra, states that "computer science is no more about computers than astronomy is about telescopes."[note 3] The design and deployment of computers and computer systems is generally considered the province of disciplines other than computer science. For example, the study of computer hardware is usually considered part of computer engineering, while the study of commercial computer systems and their deployment is often called information technology or information systems. However, there has been exchange of ideas between the various computer-related disciplines. Computer science research also often intersects other disciplines, such as cognitive science, linguistics, mathematics, physics, biology, Earth science, statistics, philosophy, and logic. Computer science is considered by some to have a much closer relationship with mathematics than many scientific disciplines, with some observers saying that computing is a mathematical science. Early computer science was strongly influenced by the work of mathematicians such as Kurt Gödel, Alan Turing, John von Neumann, Rózsa Péter and Alonzo Church and there continues to be a useful interchange of ideas between the two fields in areas such as mathematical logic, category theory, domain theory, and algebra. The relationship between computer science and software engineering is a contentious issue, which is further muddied by disputes over what the term "software engineering" means, and how computer science is defined. David Parnas, taking a cue from the relationship between other engineering and science disciplines, has claimed that the principal focus of computer science is studying the properties of computation in general, while the principal focus of software engineering is the design of specific computations to achieve practical goals, making the two separate but complementary disciplines. The academic, political, and funding aspects of computer science tend to depend on whether a department is formed with a mathematical emphasis or with an engineering emphasis. Computer science departments with a mathematics emphasis and with a numerical orientation consider alignment with computational science. Both types of departments tend to make efforts to bridge the field educationally if not across all research. ## Philosophy ### Epistemology of computer science Despite the word science in its name, there is debate over whether or not computer science is a discipline of science, mathematics, or engineering. Allen Newell and Herbert A. Simon argued in 1975, > Computer science is an empirical discipline. We would have called it an > experimental science, but like astronomy, economics, and geology, some of its > unique forms of observation and experience do not fit a narrow stereotype of > the experimental method. Nonetheless, they are experiments. Each new machine > that is built is an experiment. Actually constructing the machine poses a > question to nature; and we listen for the answer by observing the machine in > operation and analyzing it by all analytical and measurement means available. It has since been argued that computer science can be classified as an empirical science since it makes use of empirical testing to evaluate the correctness of programs, but a problem remains in defining the laws and theorems of computer science (if any exist) and defining the nature of experiments in computer science. Proponents of classifying computer science as an engineering discipline argue that the reliability of computational systems is investigated in the same way as bridges in civil engineering and airplanes in aerospace engineering. They also argue that while empirical sciences observe what presently exists, computer science observes what is possible to exist and while scientists discover laws from observation, no proper laws have been found in computer science and it is instead concerned with creating phenomena. Proponents of classifying computer science as a mathematical discipline argue that computer programs are physical realizations of mathematical entities and programs that can be deductively reasoned through mathematical formal methods. Computer scientists Edsger W. Dijkstra and Tony Hoare regard instructions for computer programs as mathematical sentences and interpret formal semantics for programming languages as mathematical axiomatic systems. ### Paradigms of computer science A number of computer scientists have argued for the distinction of three separate paradigms in computer science. Peter Wegner argued that those paradigms are science, technology, and mathematics. Peter Denning's working group argued that they are theory, abstraction (modeling), and design. Amnon H. Eden described them as the "rationalist paradigm" (which treats computer science as a branch of mathematics, which is prevalent in theoretical computer science, and mainly employs deductive reasoning), the "technocratic paradigm" (which might be found in engineering approaches, most prominently in software engineering), and the "scientific paradigm" (which approaches computer-related artifacts from the empirical perspective of natural sciences, identifiable in some branches of artificial intelligence). Computer science focuses on methods involved in design, specification, programming, verification, implementation and testing of human-made computing systems. ## Fields As a discipline, computer science spans a range of topics from theoretical studies of algorithms and the limits of computation to the practical issues of implementing computing systems in hardware and software. CSAB, formerly called Computing Sciences Accreditation Board—which is made up of representatives of the Association for Computing Machinery (ACM), and the IEEE Computer Society (IEEE CS)—identifies four areas that it considers crucial to the discipline of computer science: theory of computation, algorithms and data structures, programming methodology and languages, and computer elements and architecture. In addition to these four areas, CSAB also identifies fields such as software engineering, artificial intelligence, computer networking and communication, database systems, parallel computation, distributed computation, human–computer interaction, computer graphics, operating systems, and numerical and symbolic computation as being important areas of computer science. ### Theoretical computer science Theoretical computer science is mathematical and abstract in spirit, but it derives its motivation from practical and everyday computation. It aims to understand the nature of computation and, as a consequence of this understanding, provide more efficient methodologies. #### Theory of computation According to Peter Denning, the fundamental question underlying computer science is, "What can be automated?" Theory of computation is focused on answering fundamental questions about what can be computed and what amount of resources are required to perform those computations. In an effort to answer the first question, computability theory examines which computational problems are solvable on various theoretical models of computation. The second question is addressed by computational complexity theory, which studies the time and space costs associated with different approaches to solving a multitude of computational problems. The famous P = NP? problem, one of the Millennium Prize Problems, is an open problem in the theory of computation. #### Information and coding theory Information theory, closely related to probability and statistics, is related to the quantification of information. This was developed by Claude Shannon to find fundamental limits on signal processing operations such as compressing data and on reliably storing and communicating data. Coding theory is the study of the properties of codes (systems for converting information from one form to another) and their fitness for a specific application. Codes are used for data compression, cryptography, error detection and correction, and more recently also for network coding. Codes are studied for the purpose of designing efficient and reliable data transmission methods. #### Data structures and algorithms Data structures and algorithms are the studies of commonly used computational methods and their computational efficiency. #### Programming language theory and formal methods Programming language theory is a branch of computer science that deals with the design, implementation, analysis, characterization, and classification of programming languages and their individual features. It falls within the discipline of computer science, both depending on and affecting mathematics, software engineering, and linguistics. It is an active research area, with numerous dedicated academic journals. Formal methods are a particular kind of mathematically based technique for the specification, development and verification of software and hardware systems. The use of formal methods for software and hardware design is motivated by the expectation that, as in other engineering disciplines, performing appropriate mathematical analysis can contribute to the reliability and robustness of a design. They form an important theoretical underpinning for software engineering, especially where safety or security is involved. Formal methods are a useful adjunct to software testing since they help avoid errors and can also give a framework for testing. For industrial use, tool support is required. However, the high cost of using formal methods means that they are usually only used in the development of high-integrity and life-critical systems, where safety or security is of utmost importance. Formal methods are best described as the application of a fairly broad variety of theoretical computer science fundamentals, in particular logic calculi, formal languages, automata theory, and program semantics, but also type systems and algebraic data types to problems in software and hardware specification and verification. ### Applied computer science #### Computer graphics and visualization Computer graphics is the study of digital visual contents and involves the synthesis and manipulation of image data. The study is connected to many other fields in computer science, including computer vision, image processing, and computational geometry, and is heavily applied in the fields of special effects and video games. #### Image and sound processing Information can take the form of images, sound, video or other multimedia. Bits of information can be streamed via signals. Its processing is the central notion of informatics, the European view on computing, which studies information processing algorithms independently of the type of information carrier – whether it is electrical, mechanical or biological. This field plays important role in information theory, telecommunications, information engineering and has applications in medical image computing and speech synthesis, among others. What is the lower bound on the complexity of fast Fourier transform algorithms? is one of the unsolved problems in theoretical computer science. #### Computational science, finance and engineering Scientific computing (or computational science) is the field of study concerned with constructing mathematical models and quantitative analysis techniques and using computers to analyze and solve scientific problems. A major usage of scientific computing is simulation of various processes, including computational fluid dynamics, physical, electrical, and electronic systems and circuits, as well as societies and social situations (notably war games) along with their habitats, among many others. Modern computers enable optimization of such designs as complete aircraft. Notable in electrical and electronic circuit design are SPICE, as well as software for physical realization of new (or modified) designs. The latter includes essential design software for integrated circuits. #### Human–computer interaction Human–computer interaction (HCI) is the field of study and research concerned with the design and use of computer systems, mainly based on the analysis of the interaction between humans and computer interfaces. HCI has several subfields that focus on the relationship between emotions, social behavior and brain activity with computers. #### Software engineering Software engineering is the study of designing, implementing, and modifying the software in order to ensure it is of high quality, affordable, maintainable, and fast to build. It is a systematic approach to software design, involving the application of engineering practices to software. Software engineering deals with the organizing and analyzing of software—it does not just deal with the creation or manufacture of new software, but its internal arrangement and maintenance. For example software testing, systems engineering, technical debt and software development processes. #### Artificial intelligence Artificial intelligence (AI) aims to or is required to synthesize goal-orientated processes such as problem-solving, decision-making, environmental adaptation, learning, and communication found in humans and animals. From its origins in cybernetics and in the Dartmouth Conference (1956), artificial intelligence research has been necessarily cross-disciplinary, drawing on areas of expertise such as applied mathematics, symbolic logic, semiotics, electrical engineering, philosophy of mind, neurophysiology, and social intelligence. AI is associated in the popular mind with robotic development, but the main field of practical application has been as an embedded component in areas of software development, which require computational understanding. The starting point in the late 1940s was Alan Turing's question "Can computers think?", and the question remains effectively unanswered, although the Turing test is still used to assess computer output on the scale of human intelligence. But the automation of evaluative and predictive tasks has been increasingly successful as a substitute for human monitoring and intervention in domains of computer application involving complex real-world data. ### Computer systems #### Computer architecture and microarchitecture Computer architecture, or digital computer organization, is the conceptual design and fundamental operational structure of a computer system. It focuses largely on the way by which the central processing unit performs internally and accesses addresses in memory. Computer engineers study computational logic and design of computer hardware, from individual processor components, microcontrollers, personal computers to supercomputers and embedded systems. The term "architecture" in computer literature can be traced to the work of Lyle R. Johnson and Frederick P. Brooks Jr., members of the Machine Organization department in IBM's main research center in 1959. #### Concurrent, parallel and distributed computing Concurrency is a property of systems in which several computations are executing simultaneously, and potentially interacting with each other. A number of mathematical models have been developed for general concurrent computation including Petri nets, process calculi and the parallel random access machine model. When multiple computers are connected in a network while using concurrency, this is known as a distributed system. Computers within that distributed system have their own private memory, and information can be exchanged to achieve common goals. #### Computer networks This branch of computer science aims to manage networks between computers worldwide. #### Computer security and cryptography Computer security is a branch of computer technology with the objective of protecting information from unauthorized access, disruption, or modification while maintaining the accessibility and usability of the system for its intended users. Historical cryptography is the art of writing and deciphering secret messages. Modern cryptography is the scientific study of problems relating to distributed computations that can be attacked. Technologies studied in modern cryptography include symmetric and asymmetric encryption, digital signatures, cryptographic hash functions, key-agreement protocols, blockchain, zero-knowledge proofs, and garbled circuits. #### Databases and data mining A database is intended to organize, store, and retrieve large amounts of data easily. Digital databases are managed using database management systems to store, create, maintain, and search data, through database models and query languages. Data mining is a process of discovering patterns in large data sets. ## Discoveries The philosopher of computing Bill Rapaport noted three Great Insights of Computer Science: - Gottfried Wilhelm Leibniz's, George Boole's, Alan Turing's, Claude Shannon's, and Samuel Morse's insight: there are only two objects that a computer has to deal with in order to represent "anything".[note 4] > All the information about any computable problem can be represented using > only 0 and 1 (or any other bistable pair that can flip-flop between two > easily distinguishable states, such as "on/off", "magnetized/de-magnetized", > "high-voltage/low-voltage", etc.). - Alan Turing's insight: there are only five actions that a computer has to perform in order to do "anything". Every algorithm can be expressed in a language for a computer consisting of only five basic instructions: - move left one location; - move right one location; - read symbol at current location; - print 0 at current location; - print 1 at current location. - Corrado Böhm and Giuseppe Jacopini's insight: there are only three ways of combining these actions (into more complex ones) that are needed in order for a computer to do "anything". Only three rules are needed to combine any set of basic instructions into more complex ones: - sequence: first do this, then do that; - selection: IF such-and-such is the case, THEN do this, ELSE do that; - repetition: WHILE such-and-such is the case, DO this. The three rules of Boehm's and Jacopini's insight can be further simplified with the use of goto (which means it is more elementary than structured programming). ## Programming paradigms Programming languages can be used to accomplish different tasks in different ways. Common programming paradigms include: - Functional programming, a style of building the structure and elements of computer programs that treats computation as the evaluation of mathematical functions and avoids state and mutable data. It is a declarative programming paradigm, which means programming is done with expressions or declarations instead of statements. - Imperative programming, a programming paradigm that uses statements that change a program's state. In much the same way that the imperative mood in natural languages expresses commands, an imperative program consists of commands for the computer to perform. Imperative programming focuses on describing how a program operates. - Object-oriented programming, a programming paradigm based on the concept of "objects", which may contain data, in the form of fields, often known as attributes; and code, in the form of procedures, often known as methods. A feature of objects is that an object's procedures can access and often modify the data fields of the object with which they are associated. Thus object-oriented computer programs are made out of objects that interact with one another. - Service-oriented programming, a programming paradigm that uses "services" as the unit of computer work, to design and implement integrated business applications and mission critical software programs. Many languages offer support for multiple paradigms, making the distinction more a matter of style than of technical capabilities. ## Research Conferences are important events for computer science research. During these conferences, researchers from the public and private sectors present their recent work and meet. Unlike in most other academic fields, in computer science, the prestige of conference papers is greater than that of journal publications. One proposed explanation for this is the quick development of this relatively new field requires rapid review and distribution of results, a task better handled by conferences than by journals. ================================================ FILE: harper-core/tests/text/Difficult sentences.md ================================================ # Difficult sentences A collection of difficult sentences to test Harper's ability to correctly tag unusual/uncommon but correct sentences. Note that some word may **not** be tagged correctly right now. Most example sentences are taken from https://en.wiktionary.org/. License: CC BY-SA 4.0. # A With one attack, he was torn a pieces. I brush my teeth twice a day. ## At ### Preposition Caesar was at Rome; a climate treaty was signed at Kyoto in 1997. I was at Jim’s house at the corner of Fourth Street and Vine. at the bottom of the page; sitting at the table; at church; at sea Target at five miles. Prepare torpedoes! Look out! UFO at two o'clock! Don't pick at your food! My cat keeps scratching at the furniture. I was working at the problem all day. He shouted at her. She pointed at the curious animal. At my request, they agreed to move us to another hotel. He jumped at the sudden noise. We laughed at the joke. She was mad at their comments. men at work; children at play The two countries are at war. She is at sixes and sevens with him. ### Noun The at sign. ### Verb (In online chats:) Don't @ me! Don't at me! ## By ### Preposition The mailbox is by the bus stop. The stream runs by our back door. He ran straight by me. Be back by ten o'clock!. We'll find someone by the end of March. We will send it by the first week of July. The matter was decided by the chairman. The boat was swamped by the water. He was protected by his body armour. There was a call by the unions for a 30% pay rise. I was aghast by what I saw. There are many well-known plays by William Shakespeare. I avoided the guards by moving only when they weren't looking. By Pythagoras' theorem, we can calculate the length of the hypotenuse. We went by bus. I discovered it by chance. By 'maybe' she means 'no'. The electricity was cut off, so we had to read by candlelight. By the power vested in me, I now pronounce you man and wife. By Jove! I think she's got it! By all that is holy, I'll put an end to this. I sorted the items by category. Table 1 shows details of our employees broken down by sex and age. Our stock is up by ten percent. We won by six goals to three. His date of birth was wrong by ten years. We went through the book page by page. We crawled forward by inches. sold by the yard; cheaper if bought by the gross While sitting listening to the radio by the hour, she can drink brandy by the bucketful! He sits listening to the radio by the hour. His health was deteriorating by the day. The pickers are paid by the bushel. He cheated by his own admission. By my reckoning, we should be nearly there. It is easy to invert a 2-by-2 matrix. The room was about 4 foot by 6 foot. The bricks used to build the wall measured 10 by 20 by 30 cm. She's a lovely little filly, by Big Lad, out of Damsel in Distress. Are you eating by Rabbi Fischer? (at the house of) By Chabad, it's different. (with, among) ### Adverb I watched the parade as it passed by. There was a shepherd close by. I'll stop by on my way home from work. We're right near the lifeguard station. Come by before you leave. The women spent much time after harvest putting jams by for winter and spring. ### Adjective a by path; a by room (Out of the way, off to one side.) by catch; a by issue (Subsidiary, incidental.) ## For ### Conjunction I had to stay with my wicked stepmother, for I had nowhere else to go. ### Preposition The astronauts headed for the moon. Run for the hills! He was headed for the door when he remembered. I have something for you. Everything I do, I do for you. We're having a birthday party for Janet. The mayor gave a speech for the charity gala. If having to bag the groceries correctly is more than you can handle, then this isn't the job for you. This is a new bell for my bicycle. The cake is for Tom and Helen's anniversary. This medicine is for your cough. He wouldn't apologize; and just for that, she refused to help him. He looks better for having lost weight. (UK usage) She was the worse for drink. All those for the motion, raise your hands. Who's for ice-cream? I'm for going by train Ten voted for, and three against. (with implied object) Make way for the president! Clear the shelves for our new Christmas stock! Stand by for your cue. Prepare for battle. They swept the area for enemy operatives. Police combed his flat for clues. I've lived here for three years. They fought for days over a silly pencil. The store is closed for the day. I can see for miles. I will stand in for him. I speak for the Prime Minister. It is unreasonable for our boss to withhold our wages. I don't think it's a good idea for you and me to meet ever again. I am aiming for completion by the end of business Thursday. He's going for his doctorate. Do you want to go for coffee? I'm saving up for a car. Don't wait for an answer. Fair for its day. She's spry for an old lady. Don't take me for a fool. For all his expensive education, he didn't seem very bright. And now for a slap-up meal! Go scuba diving? For one thing, I can't even swim. For another, we don't have any equipment. He is named for his grandfather. He totally screwed up that project. Now he's surely for the sack. In term of base hits, Jones was three for four on the day At close of play, England were 305 for 3. He took the swing shift for he could get more overtime. to account for one's whereabouts. ## From Paul is from New Zealand. I got a letter from my brother. You can't get all your news from the Internet. He had books piled from floor to ceiling. He departed yesterday from Chicago. This figure has been changed from a one to a seven. Face away from the wall! The working day runs from 9 am to 5 pm. Tickets are available from 17th July. Rate your pain from 1 to 10. Start counting from 1. You can study anything from math to literature. It's hard to tell from here. Try to see it from his point of view. The bomb went off just 100 yards from where they were standing. From the top of the lighthouse you can just see the mainland. I’ve been doing this from pickney. Your opinions differ from mine. He knows right from wrong. ## In ### Preposition Who lives in a pineapple under the sea? The dog is in the kennel. There were three pickles in a jar. I like living in the city. There are lots of trees in the park. We are in the enemy camp. Her plane is in the air. I glanced over at the pretty girl in the red dress. There wasn't much of interest in her speech. He hasn't got an original idea in him. You are one in a million. She's in an orchestra. My birthday is in the first week of December. Easter falls in the fourth lunar month. Will you be able to finish this in a week? They said they would call us in a week. Less water gets in your boots this way. She stood there looking in the window longingly. In replacing the faucet washers, he felt he was making his contribution to the environment. In trying to make amends, she actually made matters worse. My aim in travelling there was to find my missing friend. My fat rolls around in folds. The planes flew over in waves. Arrange the chairs in a circle. He stalked away in anger. John is in a coma. My fruit trees are in bud. The company is in profit. You've got a friend in me. He's met his match in her. There has been no change in his condition. What grade did he get in English? Please pay me in cash — preferably in tens and twenties. The deposit can be in any legal tender, even in gold. Beethoven's "Symphony No. 5" in C minor is among his most popular. His speech was in French, but was simultaneously translated into eight languages. When you write in cursive, it's illegible. Military letters should be formal in tone, but not stilted. ### Verb He that ears my land spares my team and gives me leave to in the crop. ### Adverb Suddenly a strange man walked in. Would you like that to take away or eat in? He ran to the edge of the swimming pool and dived in. They flew in from London last night. For six hours the tide flows in, then for another six hours it flows out. Bring the water to the boil and drop the vegetables in. The show still didn't become interesting 20 minutes in. ### Noun His parents got him an in with the company. ### Adjective Is Mr. Smith in? Little by little I pushed the snake into the basket, until finally all of it was in. The bullet is about five centimetres in. If the tennis ball bounces on the line then it's in. I've discovered why the TV wasn't working – the plug wasn't in! The replies to the questionnaires are now all in. Skirts are in this year. the in train (incoming train) You can't get round the headland when the tide's in. in by descent; in by purchase; in of the seisin of her husband He is very in with the Joneses. I need to keep in with the neighbours in case I ever need a favour from them. I think that bird fancies you. You're in there, mate! I'm three drinks in right now. I was 500 dollars in when the stock crashed. ### Unit The glass is 8 inches. The glass is 8in. ## Of Take the chicken out of the freezer. He hasn't been well of late. Finally she was relieved of the burden of caring for her sick husband. He seemed devoid of human feelings. The word is believed to be of Japanese origin. Jesus of Nazareth The invention was born of necessity. It is said that she died of a broken heart. What a lot of nonsense! I'll have a dozen of those apples, please. Welcome to the historic town of Harwich. I'm not driving this wreck of a car. I'm always thinking of you. He told us the story of his journey to India. This behaviour is typical of teenagers. He is a friend of mine. We want a larger slice of the cake. The owner of the nightclub was arrested. My companion seemed affable and easy of manner. It's not that big of a deal. I’ve not taken her out of a goodly long while. After a delay of three hours, the plane finally took off. ## On ### Adjective All the lights are on, so they must be home. We had to ration our food because there was a war on. Some of the cast went down with flu, but the show's still on. That TV programme that you wanted to watch is on now. This is her last song. You're on next! Are we still on for tonight? Mike just threw coffee onto Paul's lap. It's on now. England need a hundred runs, with twenty-five overs remaining. Game on! Your feet will soon warm up once your socks are on. I was trying to drink out of the bottle while the top was still on! Climbing up that steep ridge isn't on. We'll have to find another route. He'd like to play the red next to the black spot, but that shot isn't on. The captain moved two fielders to the on side. Ponsonby-Smythe hit a thumping on drive. If the player fails to hit the ball on, it's a foul. He always has to be on, it's so exhausting. ### Adverb turn the television on The lid wasn't screwed on properly. Put on your hat and gloves. The policeman moved the tramp on. Drive on past the railway station. From now on things are going to be different. and so on. He rambled on and on. Ten years on, nothing had changed in the village. ### Preposition A vase of flowers stood on the table. Please lie down on the couch. The parrot was sitting on Jim's shoulder. He had a scar on the side of his face. There is a dirty smudge on this window. The painting hangs on the wall. The fruit ripened on the trees. Should there be an accent on the "e"? He wore old shoes on his feet. The lighthouse that you can see is on the mainland. The suspect is thought to still be on the campus. We live on the edge of the city. on the left, on the right, on the side, on the bottom. The fleet is on the American coast. on a bus, on a train, on a plane, on a ferry, on a yacht. All of the responsibility is on him. I put a bet on the winning horse. tug on the rope; push hard on the door. I stubbed my toe on an old tree stump. I caught my fingernail on the door handle. The rope snagged on a branch. to play on a violin or piano. A table can't stand on two legs. After resting on his elbows, he stood on his toes, then walked on his heels. The Tories are on twenty-five percent in this constituency. The blue team are on six points and the red team on five. I'm on question four. Born on the 4th of July. On Sunday I'm busy. I'll see you on Monday. Can I see you on a different day? Smith scored again on twelve minutes, doubling Mudchester Rovers' lead. I was reading a book on history. The city hosted the World Summit on the Information Society I have no opinion on this subject. I saw it on television. Can't you see I'm on the phone? My favorite shows are on BBC America. I'll pay on card. He travelled on false documents. They planned an attack on London. The soldiers mutinied and turned their guns on their officers. Her words made a lasting impression on my mind. What will be the effect on morale? I haven't got any money on me. On Jack's entry, William got up to leave. On the addition of ammonia, a chemical reaction begins. The drinks are on me tonight, boys. The meal is on the house. I had a terrible thirst on me. Have pity or compassion on him. He's on his lunch break. I'm on nights all this week. You've been on these antidepressants far too long. I depended on them for assistance. He will promise on certain conditions. A curse on him! Please don't tell on her and get her in trouble. ### Verb Can you on the light? (switch on) ## To ### Particle I want to leave. He asked me what to do. I have places to go and people to see. To err is human. Who am I to criticise? I've done worse things myself. Precisely to get away from you was why I did what I did. I need some more books to read and friends to go partying with. If he hasn't read it yet, he ought to. I went to the shops to buy some bread. ### Preposition She looked to the heavens. We are walking to the shop. The water came right to the top of this wall. The coconut fell to the ground. I gave the book to him. His face was beaten to a pulp. I sang my baby to sleep. Whisk the mixture to a smooth consistency. He made several bad-taste jokes to groans from the audience. I tried complaining, but it was to no effect. It was to a large extent true. We manufacture these parts to a very high tolerance. This gauge is accurate to a second. There's a lot of sense to what he says. The name has a nice ring to it. There are 100 pence to the pound. It takes 2 to 4 weeks to process typical applications. Three to the power of two is nine. Three to the second is nine. Three squared or three to the second power is nine. What's the time? – It's quarter to four in the afternoon (or 3:45 pm). ### Adverb Please push the door to. (close) ## With ### Preposition He picked a fight with the class bully. He went with his friends. She owns a motorcycle with a sidecar. Jim was listening to Bach with his eyes closed. The match result was 10-5, with John scoring three goals. With a heavy sigh, she looked around the empty room. Four people were injured, with one of them in critical condition. With their reputation on the line, they decided to fire their PR team. We are with you all the way. There are a number of problems with your plan. What on Earth is wrong with my keyboard? He was pleased with the outcome. I’m upset with my father. slain with robbers. cut with a knife I water my plants with this watering can. This is the watering can I water my plants with. Find what you want instantly with our search engine. They dismissed the meeting with a wave of their hand. Speak with a confident voice. With what/whose money? I have nothing left to buy groceries (with). It was small and bumpy, with a tinge of orange. There are lots of people with no homes after the wildfire. Speak with confidence. He spoke with sadness in his voice. The sailors were infected with malaria. overcome with happiness green with envy; flushed with success She was with Acme for twenty years before retiring last fall. With your kind of body size, you shouldn’t be eating pizza at all. That was a lot to explain; are you still with me? ### Adverb Do you want to come with? ================================================ FILE: harper-core/tests/text/Part-of-speech tagging.md ================================================ # Part-of-speech tagging In corpus linguistics, part-of-speech tagging (POS tagging or PoS tagging or POST), also called grammatical tagging is the process of marking up a word in a text (corpus) as corresponding to a particular part of speech, based on both its definition and its context. A simplified form of this is commonly taught to school-age children, in the identification of words as nouns, verbs, adjectives, adverbs, etc. Once performed by hand, POS tagging is now done in the context of computational linguistics, using algorithms which associate discrete terms, as well as hidden parts of speech, by a set of descriptive tags. POS-tagging algorithms fall into two distinctive groups: rule-based and stochastic. E. Brill's tagger, one of the first and most widely used English POS-taggers, employs rule-based algorithms. ## Principle Part-of-speech tagging is harder than just having a list of words and their parts of speech, because some words can represent more than one part of speech at different times, and because some parts of speech are complex. This is not rare—in natural languages (as opposed to many artificial languages), a large percentage of word-forms are ambiguous. For example, even "dogs", which is usually thought of as just a plural noun, can also be a verb: > The sailor dogs the hatch. Correct grammatical tagging will reflect that "dogs" is here used as a verb, not as the more common plural noun. Grammatical context is one way to determine this; semantic analysis can also be used to infer that "sailor" and "hatch" implicate "dogs" as 1) in the nautical context and 2) an action applied to the object "hatch" (in this context, "dogs" is a nautical term meaning "fastens (a watertight door) securely"). ### Tag sets Schools commonly teach that there are 9 parts of speech in English: noun, verb, article, adjective, preposition, pronoun, adverb, conjunction, and interjection. However, there are clearly many more categories and sub-categories. For nouns, the plural, possessive, and singular forms can be distinguished. In many languages words are also marked for their "case" (role as subject, object, etc.), grammatical gender, and so on; while verbs are marked for tense, aspect, and other things. In some tagging systems, different inflections of the same root word will get different parts of speech, resulting in a large number of tags. For example, NN for singular common nouns, NNS for plural common nouns, NP for singular proper nouns (see the POS tags used in the Brown Corpus). Other tagging systems use a smaller number of tags and ignore fine differences or model them as features somewhat independent from part-of-speech. In part-of-speech tagging by computer, it is typical to distinguish from 50 to 150 separate parts of speech for English. Work on stochastic methods for tagging Koine Greek (DeRose 1990) has used over 1,000 parts of speech and found that about as many words were ambiguous in that language as in English. A morphosyntactic descriptor in the case of morphologically rich languages is commonly expressed using very short mnemonics, such as Ncmsan for Category=Noun, Type = common, Gender = masculine, Number = singular, Case = accusative, Animate = no. The most popular "tag set" for POS tagging for American English is probably the Penn tag set, developed in the Penn Treebank project. It is largely similar to the earlier Brown Corpus and LOB Corpus tag sets, though much smaller. In Europe, tag sets from the Eagles Guidelines see wide use and include versions for multiple languages. POS tagging work has been done in a variety of languages, and the set of POS tags used varies greatly with language. Tags usually are designed to include overt morphological distinctions, although this leads to inconsistencies such as case-marking for pronouns but not nouns in English, and much larger cross-language differences. The tag sets for heavily inflected languages such as Greek and Latin can be very large; tagging words in agglutinative languages such as Inuit languages may be virtually impossible. At the other extreme, Petrov et al. have proposed a "universal" tag set, with 12 categories (for example, no subtypes of nouns, verbs, punctuation, and so on). Whether a very small set of very broad tags or a much larger set of more precise ones is preferable, depends on the purpose at hand. Automatic tagging is easier on smaller tag-sets. ## History ### The Brown Corpus Research on part-of-speech tagging has been closely tied to corpus linguistics. The first major corpus of English for computer analysis was the Brown Corpus developed at Brown University by Henry Kučera and W. Nelson Francis, in the mid-1960s. It consists of about 1,000,000 words of running English prose text, made up of 500 samples from randomly chosen publications. Each sample is 2,000 or more words (ending at the first sentence-end after 2,000 words, so that the corpus contains only complete sentences). The Brown Corpus was painstakingly "tagged" with part-of-speech markers over many years. A first approximation was done with a program by Greene and Rubin, which consisted of a huge handmade list of what categories could co-occur at all. For example, article then noun can occur, but article then verb (arguably) cannot. The program got about 70% correct. Its results were repeatedly reviewed and corrected by hand, and later users sent in errata so that by the late 70s the tagging was nearly perfect (allowing for some cases on which even human speakers might not agree). This corpus has been used for innumerable studies of word-frequency and of part-of-speech and inspired the development of similar "tagged" corpora in many other languages. Statistics derived by analyzing it formed the basis for most later part-of-speech tagging systems, such as CLAWS and VOLSUNGA. However, by this time (2005) it has been superseded by larger corpora such as the 100 million word British National Corpus, even though larger corpora are rarely so thoroughly curated. For some time, part-of-speech tagging was considered an inseparable part of natural language processing, because there are certain cases where the correct part of speech cannot be decided without understanding the semantics or even the pragmatics of the context. This is extremely expensive, especially because analyzing the higher levels is much harder when multiple part-of-speech possibilities must be considered for each word. ### Use of hidden Markov models In the mid-1980s, researchers in Europe began to use hidden Markov models (HMMs) to disambiguate parts of speech, when working to tag the Lancaster-Oslo-Bergen Corpus of British English. HMMs involve counting cases (such as from the Brown Corpus) and making a table of the probabilities of certain sequences. For example, once you've seen an article such as 'the', perhaps the next word is a noun 40% of the time, an adjective 40%, and a number 20%. Knowing this, a program can decide that "can" in "the can" is far more likely to be a noun than a verb or a modal. The same method can, of course, be used to benefit from knowledge about the following words. More advanced ("higher-order") HMMs learn the probabilities not only of pairs but triples or even larger sequences. So, for example, if you've just seen a noun followed by a verb, the next item may be very likely a preposition, article, or noun, but much less likely another verb. When several ambiguous words occur together, the possibilities multiply. However, it is easy to enumerate every combination and to assign a relative probability to each one, by multiplying together the probabilities of each choice in turn. The combination with the highest probability is then chosen. The European group developed CLAWS, a tagging program that did exactly this and achieved accuracy in the 93–95% range. Eugene Charniak points out in Statistical techniques for natural language parsing (1997) that merely assigning the most common tag to each known word and the tag "proper noun" to all unknowns will approach 90% accuracy because many words are unambiguous, and many others only rarely represent their less-common parts of speech. CLAWS pioneered the field of HMM-based part of speech tagging but was quite expensive since it enumerated all possibilities. It sometimes had to resort to backup methods when there were simply too many options (the Brown Corpus contains a case with 17 ambiguous words in a row, and there are words such as "still" that can represent as many as 7 distinct parts of speech. HMMs underlie the functioning of stochastic taggers and are used in various algorithms one of the most widely used being the bi-directional inference algorithm. ### Dynamic programming methods In 1987, Steven DeRose and Kenneth W. Church independently developed dynamic programming algorithms to solve the same problem in vastly less time. Their methods were similar to the Viterbi algorithm known for some time in other fields. DeRose used a table of pairs, while Church used a table of triples and a method of estimating the values for triples that were rare or nonexistent in the Brown Corpus (an actual measurement of triple probabilities would require a much larger corpus). Both methods achieved an accuracy of over 95%. DeRose's 1990 dissertation at Brown University included analyses of the specific error types, probabilities, and other related data, and replicated his work for Greek, where it proved similarly effective. These findings were surprisingly disruptive to the field of natural language processing. The accuracy reported was higher than the typical accuracy of very sophisticated algorithms that integrated part of speech choice with many higher levels of linguistic analysis: syntax, morphology, semantics, and so on. CLAWS, DeRose's and Church's methods did fail for some of the known cases where semantics is required, but those proved negligibly rare. This convinced many in the field that part-of-speech tagging could usefully be separated from the other levels of processing; this, in turn, simplified the theory and practice of computerized language analysis and encouraged researchers to find ways to separate other pieces as well. Markov Models became the standard method for the part-of-speech assignment. #### Unsupervised taggers The methods already discussed involve working from a pre-existing corpus to learn tag probabilities. It is, however, also possible to bootstrap using "unsupervised" tagging. Unsupervised tagging techniques use an untagged corpus for their training data and produce the tagset by induction. That is, they observe patterns in word use, and derive part-of-speech categories themselves. For example, statistics readily reveal that "the", "a", and "an" occur in similar contexts, while "eat" occurs in very different ones. With sufficient iteration, similarity classes of words emerge that are remarkably similar to those human linguists would expect; and the differences themselves sometimes suggest valuable new insights. These two categories can be further subdivided into rule-based, stochastic, and neural approaches. #### Other taggers and methods Some current major algorithms for part-of-speech tagging include the Viterbi algorithm, Brill tagger, Constraint Grammar, and the Baum-Welch algorithm (also known as the forward-backward algorithm). Hidden Markov model and visible Markov model taggers can both be implemented using the Viterbi algorithm. The rule-based Brill tagger is unusual in that it learns a set of rule patterns, and then applies those patterns rather than optimizing a statistical quantity. Many machine learning methods have also been applied to the problem of POS tagging. Methods such as SVM, maximum entropy classifier, perceptron, and nearest-neighbor have all been tried, and most can achieve accuracy above 95%.[citation needed] A direct comparison of several methods is reported (with references) at the ACL Wiki. This comparison uses the Penn tag set on some of the Penn Treebank data, so the results are directly comparable. However, many significant taggers are not included (perhaps because of the labor involved in reconfiguring them for this particular dataset). Thus, it should not be assumed that the results reported here are the best that can be achieved with a given approach; nor even the best that have been achieved with a given approach. In 2014, a paper reporting using the structure regularization method for part-of-speech tagging, achieving 97.36% on a standard benchmark dataset. ================================================ FILE: harper-core/tests/text/Spell.US.md ================================================ # Spell This document contains a list of words spelled correctly in some dialects of English, but not American English. This is designed to test the spelling suggestions we give for such mistakes. To achieve this, the filename of this file contains `.US.`, which will tell the snapshot generator to use the American dialect, rather than trying to use an automatically detected dialect. ## Words - Afterwards. - Centre. - Labelled. - Flavour. - Favoured. - Honour. - Grey. - Quarrelled. - Quarrelling. - Recognised. - Neighbour. - Neighbouring. - Clamour. - Theatre. - Analyse. ================================================ FILE: harper-core/tests/text/Spell.md ================================================ # Spell This document contains example sentences with misspelled words that we want to test the spell checker on. ## Example Sentences My favourite color is blu. I must defend my honour! I recognize that you recognise me. I analyze how you infantilize me. I analyse how you infantilise me. Careful, traveller! At the centre of the theatre I dropped a litre of coke. ================================================ FILE: harper-core/tests/text/Swear.md ================================================ # Swears This documents tests that different forms/variations of swears are tagged as such. ## Examples One turd, two turds. I fart, you're farting, he farts, she farted. ================================================ FILE: harper-core/tests/text/The Constitution of the United States.md ================================================ # The Constitution Of The United States Of America **We the People** of the United States, in Order to form a more perfect Union, establish Justice, insure domestic Tranquility, provide for the common defence, promote the general Welfare, and secure the Blessings of Liberty to ourselves and our Posterity, do ordain and establish this Constitution for the United States of America. ## Article. I. ### Section. 1. All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of a Senate and House of Representatives. Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the government for a redress of grievances. No person shall be a Senator or Representative in Congress, or elector of President and Vice President, or hold any office, civil or military, under the United States, or under any State, who, having previously taken an oath, as a member of Congress, or as an officer of the United States, or as a member of any State legislature, or as an executive or judicial officer of any State, to support the Constitution of the United States, shall have engaged in insurrection or rebellion against the same, or given aid or comfort to the enemies thereof. But Congress may, by a vote of two-thirds of each House, remove such disability. The terms of Senators and Representatives shall end at noon on the 3d day of January, of the years in which such terms end; and the terms of their successors shall then begin. ### Section. 2. The House of Representatives shall be composed of Members chosen every second Year by the People of the several States, and the Electors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the State Legislature. No Person shall be a Representative who shall not have attained to the Age of twenty five Years, and been seven Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that State in which he shall be chosen. Representatives shall be apportioned among the several States according to their respective numbers, counting the whole number of persons in each State, excluding Indians not taxed. But when the right to vote at any election for the choice of electors for President and Vice President of the United States, Representatives in Congress, the Executive and Judicial officers of a State, or the members of the Legislature thereof, is denied to any of the male inhabitants of such State, being twenty-one years of age, and citizens of the United States, or in any way abridged, except for participation in rebellion, or other crime, the basis of representation therein shall be reduced in the proportion which the number of such male citizens shall bear to the whole number of male citizens twenty-one years of age in such State. The actual Enumeration shall be made within three Years after the first Meeting of the Congress of the United States, and within every subsequent Term of ten Years, in such Manner as they shall by Law direct. The Number of Representatives shall not exceed one for every thirty Thousand, but each State shall have at Least one Representative; and until such enumeration shall be made, the State of New Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island and Providence Plantations one, Connecticut five, New-York six, New Jersey four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North Carolina five, South Carolina five, and Georgia three. When vacancies happen in the Representation from any State, the Executive Authority thereof shall issue Writs of Election to fill such Vacancies. The House of Representatives shall chuse their Speaker and other Officers; and shall have the sole Power of Impeachment. ### Section. 3. The Senate of the United States shall be composed of two Senators from each State, elected by the people thereof, for six years; and each Senator shall have one vote. The electors in each State shall have the qualifications requisite for electors of the most numerous branch of the State legislatures. Immediately after they shall be assembled in Consequence of the first Election, they shall be divided as equally as may be into three Classes. The Seats of the Senators of the first Class shall be vacated at the Expiration of the second Year, of the second Class at the Expiration of the fourth Year, and of the third Class at the Expiration of the sixth Year, so that one third may be chosen every second Year; and when vacancies happen in the representation of any State in the Senate, the executive authority of such State shall issue writs of election to fill such vacancies: Provided, That the legislature of any State may empower the executive thereof to make temporary appointments until the people fill the vacancies by election as the legislature may direct. No Person shall be a Senator who shall not have attained to the Age of thirty Years, and been nine Years a Citizen of the United States, and who shall not, when elected, be an Inhabitant of that State for which he shall be chosen. The Vice President of the United States shall be President of the Senate, but shall have no Vote, unless they be equally divided. The Senate shall chuse their other Officers, and also a President pro tempore, in the Absence of the Vice President, or when he shall exercise the Office of President of the United States. The Senate shall have the sole Power to try all Impeachments. When sitting for that Purpose, they shall be on Oath or Affirmation. When the President of the United States is tried, the Chief Justice shall preside: And no Person shall be convicted without the Concurrence of two thirds of the Members present. Judgment in Cases of impeachment shall not extend further than to removal from Office, and disqualification to hold and enjoy any Office of honor, Trust or Profit under the United States: but the Party convicted shall nevertheless be liable and subject to Indictment, Trial, Judgment and Punishment, according to Law. ### Section. 4. The Times, Places and Manner of holding Elections for Senators and Representatives, shall be prescribed in each State by the Legislature thereof; but the Congress may at any time by Law make or alter such Regulations, except as to the Places of chusing Senators. The Congress shall assemble at least once in every year, and such meeting shall begin at noon on the 3d day of January, unless they shall by law appoint a different day. ### Section. 5. Each House shall be the Judge of the Elections, Returns and Qualifications of its own Members, and a Majority of each shall constitute a Quorum to do Business; but a smaller Number may adjourn from day to day, and may be authorized to compel the Attendance of absent Members, in such Manner, and under such Penalties as each House may provide. Each House may determine the Rules of its Proceedings, punish its Members for disorderly Behaviour, and, with the Concurrence of two thirds, expel a Member. Each House shall keep a Journal of its Proceedings, and from time to time publish the same, excepting such Parts as may in their Judgment require Secrecy; and the Yeas and Nays of the Members of either House on any question shall, at the Desire of one fifth of those Present, be entered on the Journal. Neither House, during the Session of Congress, shall, without the Consent of the other, adjourn for more than three days, nor to any other Place than that in which the two Houses shall be sitting. ### Section. 6. The Senators and Representatives shall receive a Compensation for their Services, to be ascertained by Law, and paid out of the Treasury of the United States. They shall in all Cases, except Treason, Felony and Breach of the Peace, be privileged from Arrest during their Attendance at the Session of their respective Houses, and in going to and returning from the same; and for any Speech or Debate in either House, they shall not be questioned in any other Place. No Senator or Representative shall, during the Time for which he was elected, be appointed to any civil Office under the Authority of the United States, which shall have been created, or the Emoluments whereof shall have been encreased during such time; and no Person holding any Office under the United States, shall be a Member of either House during his Continuance in Office. No law, varying the compensation for the services of the Senators and Representatives, shall take effect, until an election of Representatives shall have intervened. ### Section. 7. All Bills for raising Revenue shall originate in the House of Representatives; but the Senate may propose or concur with Amendments as on other Bills. Every Bill which shall have passed the House of Representatives and the Senate, shall, before it become a Law, be presented to the President of the United States; If he approve he shall sign it, but if not he shall return it, with his Objections to that House in which it shall have originated, who shall enter the Objections at large on their Journal, and proceed to reconsider it. If after such Reconsideration two thirds of that House shall agree to pass the Bill, it shall be sent, together with the Objections, to the other House, by which it shall likewise be reconsidered, and if approved by two thirds of that House, it shall become a Law. But in all such Cases the Votes of both Houses shall be determined by yeas and Nays, and the Names of the Persons voting for and against the Bill shall be entered on the Journal of each House respectively. If any Bill shall not be returned by the President within ten Days (Sundays excepted) after it shall have been presented to him, the Same shall be a Law, in like Manner as if he had signed it, unless the Congress by their Adjournment prevent its Return, in which Case it shall not be a Law. Every Order, Resolution, or Vote to which the Concurrence of the Senate and House of Representatives may be necessary (except on a question of Adjournment) shall be presented to the President of the United States; and before the Same shall take Effect, shall be approved by him, or being disapproved by him, shall be repassed by two thirds of the Senate and House of Representatives, according to the Rules and Limitations prescribed in the Case of a Bill. ### Section. 8. The Congress shall have Power To lay and collect Taxes, Duties, Imposts and Excises, to pay the Debts and provide for the common Defence and general Welfare of the United States; but all Duties, Imposts and Excises shall be uniform throughout the United States; 1. To borrow Money on the credit of the United States; 2. To regulate Commerce with foreign Nations, and among the several States, and with the Indian Tribes; 3. To establish an uniform Rule of Naturalization, and uniform Laws on the subject of Bankruptcies throughout the United States; 4. To coin Money, regulate the Value thereof, and of foreign Coin, and fix the Standard of Weights and Measures; 5. To provide for the Punishment of counterfeiting the Securities and current Coin of the United States; 6. To establish Post Offices and post Roads; 7. To promote the Progress of Science and useful Arts, by securing for limited Times to Authors and Inventors the exclusive Right to their respective Writings and Discoveries; 8. To constitute Tribunals inferior to the supreme Court; 9. To define and punish Piracies and Felonies committed on the high Seas, and Offences against the Law of Nations; 10. To declare War, grant Letters of Marque and Reprisal, and make Rules concerning Captures on Land and Water; 11. To raise and support Armies, but no Appropriation of Money to that Use shall be for a longer Term than two Years; 12. To provide and maintain a Navy; 13. To make Rules for the Government and Regulation of the land and naval Forces; 14. To provide for calling forth the Militia to execute the Laws of the Union, suppress Insurrections and repel Invasions; 15. To provide for organizing, arming, and disciplining, the Militia, and for governing such Part of them as may be employed in the Service of the United States, reserving to the States respectively, the Appointment of the Officers, and the Authority of training the Militia according to the discipline prescribed by Congress; 16. To exercise exclusive Legislation in all Cases whatsoever, over such District (not exceeding ten Miles square) as may, by Cession of particular States, and the Acceptance of Congress, become the Seat of the Government of the United States, and to exercise like Authority over all Places purchased by the Consent of the Legislature of the State in which the Same shall be, for the Erection of Forts, Magazines, Arsenals, dock-Yards, and other needful Buildings;—And 17. To make all Laws which shall be necessary and proper for carrying into Execution the foregoing Powers, and all other Powers vested by this Constitution in the Government of the United States, or in any Department or Officer thereof. ### Section. 9. The Migration or Importation of such Persons as any of the States now existing shall think proper to admit, shall not be prohibited by the Congress prior to the Year one thousand eight hundred and eight, but a Tax or duty may be imposed on such Importation, not exceeding ten dollars for each Person. The Privilege of the Writ of Habeas Corpus shall not be suspended, unless when in Cases of Rebellion or Invasion the public Safety may require it. No Bill of Attainder or ex post facto Law shall be passed. No Capitation, or other direct, Tax shall be laid, unless in Proportion to the Census or Enumeration herein before directed to be taken. Congress shall have power to lay and collect taxes on incomes, from whatever source derived, without apportionment among the several States, and without regard to any census or enumeration. No Tax or Duty shall be laid on Articles exported from any State. No Preference shall be given by any Regulation of Commerce or Revenue to the Ports of one State over those of another: nor shall Vessels bound to, or from, one State, be obliged to enter, clear, or pay Duties in another. No Money shall be drawn from the Treasury, but in Consequence of Appropriations made by Law; and a regular Statement and Account of the Receipts and Expenditures of all public Money shall be published from time to time. No Title of Nobility shall be granted by the United States: And no Person holding any Office of Profit or Trust under them, shall, without the Consent of the Congress, accept of any present, Emolument, Office, or Title, of any kind whatever, from any King, Prince, or foreign State. The right of citizens of the United States to vote in any primary or other election for President or Vice President, for electors for President or Vice President, or for Senator or Representative in Congress, shall not be denied or abridged by the United States or any State by reason of failure to pay any poll tax or other tax. ### Section. 10. No State shall enter into any Treaty, Alliance, or Confederation; grant Letters of Marque and Reprisal; coin Money; emit Bills of Credit; make any Thing but gold and silver Coin a Tender in Payment of Debts; pass any Bill of Attainder, ex post facto Law, or Law impairing the Obligation of Contracts, or grant any Title of Nobility. No State shall, without the Consent of the Congress, lay any Imposts or Duties on Imports or Exports, except what may be absolutely necessary for executing it's inspection Laws: and the net Produce of all Duties and Imposts, laid by any State on Imports or Exports, shall be for the Use of the Treasury of the United States; and all such Laws shall be subject to the Revision and Controul of the Congress. No State shall, without the Consent of Congress, lay any Duty of Tonnage, keep Troops, or Ships of War in time of Peace, enter into any Agreement or Compact with another State, or with a foreign Power, or engage in War, unless actually invaded, or in such imminent Danger as will not admit of delay. ## Article. II. ### Section. 1. The executive Power shall be vested in a President of the United States of America. He shall hold his Office during the Term of four Years ending at noon on the 20th day of January, and, together with the Vice President, chosen for the same Term, be elected, as follows Each State shall appoint, in such Manner as the Legislature thereof may direct, a Number of Electors, equal to the whole Number of Senators and Representatives to which the State may be entitled in the Congress: but no Senator or Representative, or Person holding an Office of Trust or Profit under the United States, shall be appointed an Elector. #### SubSection. 1. The Electors shall meet in their respective states, and vote by ballot for President and Vice-President, one of whom, at least, shall not be an inhabitant of the same state with themselves; they shall name in their ballots the person voted for as President, and in distinct ballots the person voted for as Vice-President, and they shall make distinct lists of all persons voted for as President, and all persons voted for as Vice-President and of the number of votes for each, which lists they shall sign and certify, and transmit sealed to the seat of the government of the United States, directed to the President of the Senate;—The President of the Senate shall, in the presence of the Senate and House of Representatives, open all the certificates and the votes shall then be counted;—The person having the greatest Number of votes for President, shall be the President, if such number be a majority of the whole number of Electors appointed; and if no person have such majority, then from the persons having the highest numbers not exceeding three on the list of those voted for as President, the House of Representatives shall choose immediately, by ballot, the President. But in choosing the President, the votes shall be taken by states, the representation from each state having one vote; a quorum for this purpose shall consist of a member or members from two-thirds of the states, and a majority of all the states shall be necessary to a choice. [If, at the time fixed for the beginning of the term of the President, the President elect shall have died, the Vice President elect shall become President. If a President shall not have been chosen before the time fixed for the beginning of his term, or if the President elect shall have failed to qualify, then the Vice President elect shall act as President until a President shall have qualified; and the Congress may by law provide for the case wherein neither a President elect nor a Vice President elect shall have qualified, declaring who shall then act as President, or the manner in which one who is to act shall be selected, and such person shall act accordingly until a President or Vice President shall have qualified.The Congress may by law provide for the case of the death of any of the persons from whom the House of Representatives may choose a President whenever the right of choice shall have devolved upon them, and for the case of the death of any of the persons from whom the Senate may choose a Vice President whenever the right of choice shall have devolved upon them.]The person having the greatest number of votes as Vice-President, shall be the Vice-President, if such number be a majority of the whole number of Electors appointed, and if no person have a majority, then from the two highest numbers on the list, the Senate shall choose the Vice-President; a quorum for the purpose shall consist of two-thirds of the whole number of Senators, and a majority of the whole number shall be necessary to a choice. But no person constitutionally ineligible to the office of President shall be eligible to that of Vice-President of the United States. The Congress may determine the Time of chusing the Electors, and the Day on which they shall give their Votes; which Day shall be the same throughout the United States. #### SubSection. 2 No Person except a natural born Citizen, or a Citizen of the United States, at the time of the Adoption of this Constitution, shall be eligible to the Office of President; neither shall any Person be eligible to that Office who shall not have attained to the Age of thirty five Years, and been fourteen Years a Resident within the United States. No person shall be elected to the office of the President more than twice, and no person who has held the office of President, or acted as President, for more than two years of a term to which some other person was elected President shall be elected to the office of the President more than once. But this article shall not apply to any person holding the office of President when this article was proposed by the Congress, and shall not prevent any person who may be holding the office of President, or acting as President, during the term within which this article becomes operative from holding the office of President or acting as President during the remainder of such term. #### SubSection 3. In case of the removal of the President from office or of his death or resignation, the Vice President shall become President. Whenever there is a vacancy in the office of the Vice President, the President shall nominate a Vice President who shall take office upon confirmation by a majority vote of both Houses of Congress. Whenever the President transmits to the President pro tempore of the Senate and the Speaker of the House of Representatives his written declaration that he is unable to discharge the powers and duties of his office, and until he transmits to them a written declaration to the contrary, such powers and duties shall be discharged by the Vice President as Acting President. Whenever the Vice President and a majority of either the principal officers of the executive departments or of such other body as Congress may by law provide, transmit to the President pro tempore of the Senate and the Speaker of the House of Representatives their written declaration that the President is unable to discharge the powers and duties of his office, the Vice President shall immediately assume the powers and duties of the office as Acting President. Thereafter, when the President transmits to the President pro tempore of the Senate and the Speaker of the House of Representatives his written declaration that no inability exists, he shall resume the powers and duties of his office unless the Vice President and a majority of either the principal officers of the executive department or of such other body as Congress may by law provide, transmit within four days to the President pro tempore of the Senate and the Speaker of the House of Representatives their written declaration that the President is unable to discharge the powers and duties of his office. Thereupon Congress shall decide the issue, assembling within forty-eight hours for that purpose if not in session. If the Congress, within twenty-one days after receipt of the latter written declaration, or, if Congress is not in session, within twenty-one days after Congress is required to assemble, determines by two-thirds vote of both Houses that the President is unable to discharge the powers and duties of his office, the Vice President shall continue to discharge the same as Acting President; otherwise, the President shall resume the powers and duties of his office. #### SubSection 4. The President shall, at stated Times, receive for his Services, a Compensation, which shall neither be encreased nor diminished during the Period for which he shall have been elected, and he shall not receive within that Period any other Emolument from the United States, or any of them. Before he enter on the Execution of his Office, he shall take the following Oath or Affirmation:-- "I do solemnly swear (or affirm) that I will faithfully execute the Office of President of the United States, and will to the best of my Ability, preserve, protect and defend the Constitution of the United States." #### SubSection 5. The District constituting the seat of Government of the United States shall appoint in such manner as the Congress may direct: A number of electors of President and Vice President equal to the whole number of Senators and Representatives in Congress to which the District would be entitled if it were a State, but in no event more than the least populous State; they shall be in addition to those appointed by the States, but they shall be considered, for the purposes of the election of President and Vice President, to be electors appointed by a State; and they shall meet in the District and perform such duties as provided by this article of the Constitution. ### Section. 2. The President shall be Commander in Chief of the Army and Navy of the United States, and of the Militia of the several States, when called into the actual Service of the United States; he may require the Opinion, in writing, of the principal Officer in each of the executive Departments, upon any Subject relating to the Duties of their respective Offices, and he shall have Power to grant Reprieves and Pardons for Offences against the United States, except in Cases of Impeachment. He shall have Power, by and with the Advice and Consent of the Senate, to make Treaties, provided two thirds of the Senators present concur; and he shall nominate, and by and with the Advice and Consent of the Senate, shall appoint Ambassadors, other public Ministers and Consuls, Judges of the supreme Court, and all other Officers of the United States, whose Appointments are not herein otherwise provided for, and which shall be established by Law: but the Congress may by Law vest the Appointment of such inferior Officers, as they think proper, in the President alone, in the Courts of Law, or in the Heads of Departments. The President shall have Power to fill up all Vacancies that may happen during the Recess of the Senate, by granting Commissions which shall expire at the End of their next Session. No soldier shall, in time of peace be quartered in any house, without the consent of the owner, nor in time of war, but in a manner to be prescribed by law. ### Section. 3. He shall from time to time give to the Congress Information of the State of the Union, and recommend to their Consideration such Measures as he shall judge necessary and expedient; he may, on extraordinary Occasions, convene both Houses, or either of them, and in Case of Disagreement between them, with Respect to the Time of Adjournment, he may adjourn them to such Time as he shall think proper; he shall receive Ambassadors and other public Ministers; he shall take Care that the Laws be faithfully executed, and shall Commission all the Officers of the United States. ### Section. 4. The President, Vice President and all civil Officers of the United States, shall be removed from Office on Impeachment for, and Conviction of, Treason, Bribery, or other high Crimes and Misdemeanors. ## Article. III. ### Section. 1. The judicial Power of the United States, shall be vested in one supreme Court, and in such inferior Courts as the Congress may from time to time ordain and establish. The Judges, both of the supreme and inferior Courts, shall hold their Offices during good Behaviour, and shall, at stated Times, receive for their Services, a Compensation, which shall not be diminished during their Continuance in Office. ### Section. 2. The judicial Power shall extend to all Cases, in Law and Equity, arising under this Constitution, the Laws of the United States, and Treaties made, or which shall be made, under their Authority;—to all Cases affecting Ambassadors, other public Ministers and Consuls;—to all Cases of admiralty and maritime Jurisdiction;—to Controversies to which the United States shall be a Party;—to Controversies between two or more States;—between Citizens of different States, —between Citizens of the same State claiming Lands under Grants of different States. In all Cases affecting Ambassadors, other public Ministers and Consuls, and those in which a State shall be Party, the supreme Court shall have original Jurisdiction. In all the other Cases before mentioned, the supreme Court shall have appellate Jurisdiction, both as to Law and Fact, with such Exceptions, and under such Regulations as the Congress shall make. The Trial of all Crimes, except in Cases of Impeachment, shall be by Jury; and such Trial shall be held in the State where the said Crimes shall have been committed; but when not committed within any State, the Trial shall be at such Place or Places as the Congress may by Law have directed. ### Section. 3. Treason against the United States, shall consist only in levying War against them, or in adhering to their Enemies, giving them Aid and Comfort. No Person shall be convicted of Treason unless on the Testimony of two Witnesses to the same overt Act, or on Confession in open Court. The Congress shall have Power to declare the Punishment of Treason, but no Attainder of Treason shall work Corruption of Blood, or Forfeiture except during the Life of the Person attainted. ### Section. 4. The right of the people to be secure in their persons, houses, papers, and effects, against unreasonable searches and seizures, shall not be violated, and no warrants shall issue, but upon probable cause, supported by oath or affirmation, and particularly describing the place to be searched, and the persons or things to be seized. No person shall be held to answer for a capital, or otherwise infamous crime, unless on a presentment or indictment of a grand jury, except in cases arising in the land or naval forces, or in the militia, when in actual service in time of war or public danger; nor shall any person be subject for the same offense to be twice put in jeopardy of life or limb; nor shall be compelled in any criminal case to be a witness against himself, nor be deprived of life, liberty, or property, without due process of law; nor shall private property be taken for public use, without just compensation. In all criminal prosecutions, the accused shall enjoy the right to a speedy and public trial, by an impartial jury of the state and district wherein the crime shall have been committed, which district shall have been previously ascertained by law, and to be informed of the nature and cause of the accusation; to be confronted with the witnesses against him; to have compulsory process for obtaining witnesses in his favor, and to have the assistance of counsel for his defense. In suits at common law, where the value in controversy shall exceed twenty dollars, the right of trial by jury shall be preserved, and no fact tried by a jury, shall be otherwise reexamined in any court of the United States, than according to the rules of the common law. Excessive bail shall not be required, nor excessive fines imposed, nor cruel and unusual punishments inflicted. ## Article. IV. ### Section. 1. Full Faith and Credit shall be given in each State to the public Acts, Records, and judicial Proceedings of every other State. And the Congress may by general Laws prescribe the Manner in which such Acts, Records and Proceedings shall be proved, and the Effect thereof. ### Section. 2. All persons born or naturalized in the United States, and subject to the jurisdiction thereof, are citizens of the United States and of the State wherein they reside. No State shall make or enforce any law which shall abridge the privileges or immunities of citizens of the United States; nor shall any State deprive any person of life, liberty, or property, without due process of law; nor deny to any person within its jurisdiction the equal protection of the laws. The right of citizens of the United States, who are eighteen years of age or older, to vote shall not be denied or abridged by the United States or by any State on account of age, sex, race, color, or previous condition of servitude. A Person charged in any State with Treason, Felony, or other Crime, who shall flee from Justice, and be found in another State, shall on Demand of the executive Authority of the State from which he fled, be delivered up, to be removed to the State having Jurisdiction of the Crime. Neither slavery nor involuntary servitude, except as a punishment for crime whereof the party shall have been duly convicted, shall exist within the United States, or any place subject to their jurisdiction. No Person held to Service or Labour in one State, under the Laws thereof, escaping into another, shall, in Consequence of any Law or Regulation therein, be discharged from such Service or Labour, but shall be delivered up on Claim of the Party to whom such Service or Labour may be due. ### Section. 3. New States may be admitted by the Congress into this Union; but no new State shall be formed or erected within the Jurisdiction of any other State; nor any State be formed by the Junction of two or more States, or Parts of States, without the Consent of the Legislatures of the States concerned as well as of the Congress. The Congress shall have Power to dispose of and make all needful Rules and Regulations respecting the Territory or other Property belonging to the United States; and nothing in this Constitution shall be so construed as to Prejudice any Claims of the United States, or of any particular State. ### Section. 4. The United States shall guarantee to every State in this Union a Republican Form of Government, and shall protect each of them against Invasion; and on Application of the Legislature, or of the Executive (when the Legislature cannot be convened) against domestic Violence. ### Section. 5. The validity of the public debt of the United States, authorized by law, including debts incurred for payment of pensions and bounties for services in suppressing insurrection or rebellion, shall not be questioned. But neither the United States nor any State shall assume or pay any debt or obligation incurred in aid of insurrection or rebellion against the United States, or any claim for the loss or emancipation of any slave; but all such debts, obligations and claims shall be held illegal and void. ## Article. V. The Congress, whenever two thirds of both Houses shall deem it necessary, shall propose Amendments to this Constitution, or, on the Application of the Legislatures of two thirds of the several States, shall call a Convention for proposing Amendments, which, in either Case, shall be valid to all Intents and Purposes, as Part of this Constitution, when ratified by the Legislatures of three fourths of the several States, or by Conventions in three fourths thereof, as the one or the other Mode of Ratification may be proposed by the Congress; Provided that no Amendment which may be made prior to the Year One thousand eight hundred and eight shall in any Manner affect the first and fourth Clauses in the Ninth Section of the first Article; and that no State, without its Consent, shall be deprived of its equal Suffrage in the Senate. ## Article. VI. All Debts contracted and Engagements entered into, before the Adoption of this Constitution, shall be as valid against the United States under this Constitution, as under the Confederation. This Constitution, and the Laws of the United States which shall be made in Pursuance thereof; and all Treaties made, or which shall be made, under the Authority of the United States, shall be the supreme Law of the Land; and the Judges in every State shall be bound thereby, any Thing in the Constitution or Laws of any State to the Contrary notwithstanding. The Senators and Representatives before mentioned, and the Members of the several State Legislatures, and all executive and judicial Officers, both of the United States and of the several States, shall be bound by Oath or Affirmation, to support this Constitution; but no religious Test shall ever be required as a Qualification to any Office or public Trust under the United States. A well regulated militia, being necessary to the security of a free state, the right of the people to keep and bear arms, shall not be infringed. ### Section. 1. The enumeration in the Constitution, of certain rights, shall not be construed to deny or disparage others retained by the people. The powers not delegated to the United States by the Constitution, nor prohibited by it to the states, are reserved to the states respectively, or to the people. ## Article. VII. The Ratification of the Conventions of nine States, shall be sufficient for the Establishment of this Constitution between the States so ratifying the Same. The Word "the", being interlined between the seventh and eight Lines of the first Page, The Word "Thirty" being partly written on an Erazure in the fifteenth Line of the first Page. The Words "is tried" being interlined between the thirty second and thirty third Lines of the first Page and the Word "the" being interlined between the forty third and forty fourth Lines of the second Page. done in Convention by the Unanimous Consent of the States present the Seventeenth Day of September in the Year of our Lord one thousand seven hundred and Eighty seven and of the Independence of the United States of America the Twelfth In witness whereof We have hereunto subscribed our Names, ## Article. VIII. ### Section 1. The transportation or importation into any State, Territory, or possession of the United States for delivery or use therein of intoxicating liquors, in violation of the laws thereof, is hereby prohibited. ================================================ FILE: harper-core/tests/text/The Great Gatsby.md ================================================ # The Great Gatsby BY F. SCOTT FITZGERALD ## CHAPTER I In my younger and more vulnerable years my father gave me some advice that I’ve been turning over in my mind ever since. “Whenever you feel like criticising any one,” he told me, “just remember that all the people in this world haven’t had the advantages that you’ve had.” He didn’t say any more, but we’ve always been unusually communicative in a reserved way, and I understood that he meant a great deal more than that. In consequence, I’m inclined to reserve all judgments, a habit that has opened up many curious natures to me and also made me the victim of not a few veteran bores. The abnormal mind is quick to detect and attach itself to this quality when it appears in a normal person, and so it came about that in college I was unjustly accused of being a politician, because I was privy to the secret griefs of wild, unknown men. Most of the confidences were unsought—frequently I have feigned sleep, preoccupation, or a hostile levity when I realized by some unmistakable sign that an intimate revelation was quivering on the horizon; for the intimate revelations of young men, or at least the terms in which they express them, are usually plagiaristic and marred by obvious suppressions. Reserving judgments is a matter of infinite hope. I am still a little afraid of missing something if I forget that, as my father snobbishly suggested, and I snobbishly repeat, a sense of the fundamental decencies is parcelled out unequally at birth. And, after boasting this way of my tolerance, I come to the admission that it has a limit. Conduct may be founded on the hard rock or the wet marshes, but after a certain point I don’t care what it’s founded on. When I came back from the East last autumn I felt that I wanted the world to be in uniform and at a sort of moral attention forever; I wanted no more riotous excursions with privileged glimpses into the human heart. Only Gatsby, the man who gives his name to this book, was exempt from my reaction—Gatsby, who represented everything for which I have an unaffected scorn. If personality is an unbroken series of successful gestures, then there was something gorgeous about him, some heightened sensitivity to the promises of life, as if he were related to one of those intricate machines that register earthquakes ten thousand miles away. This responsiveness had nothing to do with that flabby impressionability which is dignified under the name of the “creative temperament”—it was an extraordinary gift for hope, a romantic readiness such as I have never found in any other person and which it is not likely I shall ever find again. No—Gatsby turned out all right at the end; it is what preyed on Gatsby, what foul dust floated in the wake of his dreams that temporarily closed out my interest in the abortive sorrows and short-winded elations of men. My family have been prominent, well-to-do people in this Middle Western city for three generations. The Carraways are something of a clan, and we have a tradition that we’re descended from the Dukes of Buccleuch, but the actual founder of my line was my grandfather’s brother, who came here in fifty-one, sent a substitute to the Civil War, and started the wholesale hardware business that my father carries on to-day. I never saw this great-uncle, but I’m supposed to look like him—with special reference to the rather hard-boiled painting that hangs in father’s office. I graduated from New Haven in 1915, just a quarter of a century after my father, and a little later I participated in that delayed Teutonic migration known as the Great War. I enjoyed the counter-raid so thoroughly that I came back restless. Instead of being the warm centre of the world, the Middle West now seemed like the ragged edge of the universe—so I decided to go East and learn the bond business. Everybody I knew was in the bond business, so I supposed it could support one more single man. All my aunts and uncles talked it over as if they were choosing a prep school for me, and finally said, “Why—ye-es,” with very grave, hesitant faces. Father agreed to finance me for a year, and after various delays I came East, permanently, I thought, in the spring of twenty-two. The practical thing was to find rooms in the city, but it was a warm season, and I had just left a country of wide lawns and friendly trees, so when a young man at the office suggested that we take a house together in a commuting town, it sounded like a great idea. He found the house, a weatherbeaten cardboard bungalow at eighty a month, but at the last minute the firm ordered him to Washington, and I went out to the country alone. I had a dog—at least I had him for a few days until he ran away—and an old Dodge and a Finnish woman, who made my bed and cooked breakfast and muttered Finnish wisdom to herself over the electric stove. It was lonely for a day or so until one morning some man, more recently arrived than I, stopped me on the road. “How do you get to West Egg village?” he asked helplessly. I told him. And as I walked on I was lonely no longer. I was a guide, a pathfinder, an original settler. He had casually conferred on me the freedom of the neighborhood. And so with the sunshine and the great bursts of leaves growing on the trees, just as things grow in fast movies, I had that familiar conviction that life was beginning over again with the summer. There was so much to read, for one thing, and so much fine health to be pulled down out of the young breath-giving air. I bought a dozen volumes on banking and credit and investment securities, and they stood on my shelf in red and gold like new money from the mint, promising to unfold the shining secrets that only Midas and Morgan and Mæcenas knew. And I had the high intention of reading many other books besides. I was rather literary in college—one year I wrote a series of very solemn and obvious editorials for the Yale News—and now I was going to bring back all such things into my life and become again that most limited of all specialists, the “well-rounded man.” This isn’t just an epigram—life is much more successfully looked at from a single window, after all. It was a matter of chance that I should have rented a house in one of the strangest communities in North America. It was on that slender riotous island which extends itself due east of New York—and where there are, among other natural curiosities, two unusual formations of land. Twenty miles from the city a pair of enormous eggs, identical in contour and separated only by a courtesy bay, jut out into the most domesticated body of salt water in the Western hemisphere, the great wet barnyard of Long Island Sound. They are not perfect ovals—like the egg in the Columbus story, they are both crushed flat at the contact end—but their physical resemblance must be a source of perpetual wonder to the gulls that fly overhead. To the wingless a more interesting phenomenon is their dissimilarity in every particular except shape and size. I lived at West Egg, the—well, the less fashionable of the two, though this is a most superficial tag to express the bizarre and not a little sinister contrast between them. My house was at the very tip of the egg, only fifty yards from the Sound, and squeezed between two huge places that rented for twelve or fifteen thousand a season. The one on my right was a colossal affair by any standard—it was a factual imitation of some Hôtel de Ville in Normandy, with a tower on one side, spanking new under a thin beard of raw ivy, and a marble swimming pool, and more than forty acres of lawn and garden. It was Gatsby’s mansion. Or, rather, as I didn’t know Mr. Gatsby, it was a mansion inhabited by a gentleman of that name. My own house was an eyesore, but it was a small eyesore, and it had been overlooked, so I had a view of the water, a partial view of my neighbor’s lawn, and the consoling proximity of millionaires—all for eighty dollars a month. Across the courtesy bay the white palaces of fashionable East Egg glittered along the water, and the history of the summer really begins on the evening I drove over there to have dinner with the Tom Buchanans. Daisy was my second cousin once removed, and I’d known Tom in college. And just after the war I spent two days with them in Chicago. Her husband, among various physical accomplishments, had been one of the most powerful ends that ever played football at New Haven—a national figure in a way, one of those men who reach such an acute limited excellence at twenty-one that everything afterward savors of anti-climax. His family were enormously wealthy—even in college his freedom with money was a matter for reproach—but now he’d left Chicago and come East in a fashion that rather took your breath away: for instance, he’d brought down a string of polo ponies from Lake Forest. It was hard to realize that a man in my own generation was wealthy enough to do that. Why they came East I don’t know. They had spent a year in France for no particular reason, and then drifted here and there unrestfully wherever people played polo and were rich together. This was a permanent move, said Daisy over the telephone, but I didn’t believe it—I had no sight into Daisy’s heart, but I felt that Tom would drift on forever seeking, a little wistfully, for the dramatic turbulence of some irrecoverable football game. And so it happened that on a warm windy evening I drove over to East Egg to see two old friends whom I scarcely knew at all. Their house was even more elaborate than I expected, a cheerful red-and-white Georgian Colonial mansion, overlooking the bay. The lawn started at the beach and ran toward the front door for a quarter of a mile, jumping over sun-dials and brick walks and burning gardens—finally when it reached the house drifting up the side in bright vines as though from the momentum of its run. The front was broken by a line of French windows, glowing now with reflected gold and wide open to the warm windy afternoon, and Tom Buchanan in riding clothes was standing with his legs apart on the front porch. He had changed since his New Haven years. Now he was a sturdy straw-haired man of thirty with a rather hard mouth and a supercilious manner. Two shining arrogant eyes had established dominance over his face and gave him the appearance of always leaning aggressively forward. Not even the effeminate swank of his riding clothes could hide the enormous power of that body—he seemed to fill those glistening boots until he strained the top lacing, and you could see a great pack of muscle shifting when his shoulder moved under his thin coat. It was a body capable of enormous leverage—a cruel body. His speaking voice, a gruff husky tenor, added to the impression of fractiousness he conveyed. There was a touch of paternal contempt in it, even toward people he liked—and there were men at New Haven who had hated his guts. “Now, don’t think my opinion on these matters is final,” he seemed to say, “just because I’m stronger and more of a man than you are.” We were in the same senior society, and while we were never intimate I always had the impression that he approved of me and wanted me to like him with some harsh, defiant wistfulness of his own. We talked for a few minutes on the sunny porch. “I’ve got a nice place here,” he said, his eyes flashing about restlessly. Turning me around by one arm, he moved a broad flat hand along the front vista, including in its sweep a sunken Italian garden, a half acre of deep, pungent roses, and a snub-nosed motor-boat that bumped the tide offshore. “It belonged to Demaine, the oil man.” He turned me around again, politely and abruptly. “We'll go inside.” We walked through a high hallway into a bright rosy-colored space, fragilely bound into the house by French windows at either end. The windows were ajar and gleaming white against the fresh grass outside that seemed to grow a little way into the house. A breeze blew through the room, blew curtains in at one end and out the other like pale flags, twisting them up toward the frosted wedding-cake of the ceiling, and then rippled over the wine-colored rug, making a shadow on it as wind does on the sea. The only completely stationary object in the room was an enormous couch on which two young women were buoyed up as though upon an anchored balloon. They were both in white, and their dresses were rippling and fluttering as if they had just been blown back in after a short flight around the house. I must have stood for a few moments listening to the whip and snap of the curtains and the groan of a picture on the wall. Then there was a boom as Tom Buchanan shut the rear windows and the caught wind died out about the room, and the curtains and the rugs and the two young women ballooned slowly to the floor. The younger of the two was a stranger to me. She was extended full length at her end of the divan, completely motionless, and with her chin raised a little, as if she were balancing something on it which was quite likely to fall. If she saw me out of the corner of her eyes she gave no hint of it—indeed, I was almost surprised into murmuring an apology for having disturbed her by coming in. The other girl, Daisy, made an attempt to rise—she leaned slightly forward with a conscientious expression—then she laughed, an absurd, charming little laugh, and I laughed too and came forward into the room. “I’m p-paralyzed with happiness.” She laughed again, as if she said something very witty, and held my hand for a moment, looking up into my face, promising that there was no one in the world she so much wanted to see. That was a way she had. She hinted in a murmur that the surname of the balancing girl was Baker. (I’ve heard it said that Daisy’s murmur was only to make people lean toward her; an irrelevant criticism that made it no less charming.) At any rate, Miss Baker’s lips fluttered, she nodded at me almost imperceptibly, and then quickly tipped her head back again—the object she was balancing had obviously tottered a little and given her something of a fright. Again a sort of apology arose to my lips. Almost any exhibition of complete self-sufficiency draws a stunned tribute from me. I looked back at my cousin, who began to ask me questions in her low, thrilling voice. It was the kind of voice that the ear follows up and down, as if each speech is an arrangement of notes that will never be played again. Her face was sad and lovely with bright things in it, bright eyes and a bright passionate mouth, but there was an excitement in her voice that men who had cared for her found difficult to forget: a singing compulsion, a whispered “Listen,” a promise that she had done gay, exciting things just a while since and that there were gay, exciting things hovering in the next hour. I told her how I had stopped off in Chicago for a day on my way East, and how a dozen people had sent their love through me. “Do they miss me?” she cried ecstatically. “The whole town is desolate. All the cars have the left rear wheel painted black as a mourning wreath, and there’s a persistent wail all night along the north shore.” “How gorgeous! Let’s go back, Tom. To-morrow!” Then she added irrelevantly: “You ought to see the baby.” “I’d like to.” “She’s asleep. She’s three years old. Haven’t you ever seen her?” “Never.” “Well, you ought to see her. She’s—” Tom Buchanan, who had been hovering restlessly about the room, stopped and rested his hand on my shoulder. “What you doing, Nick?” “I’m a bond man.” "Who with?” I told him. “Never heard of them,” he remarked decisively. This annoyed me. “You will,” I answered shortly. “You will if you stay in the East.” “Oh, I’ll stay in the East, don’t you worry,” he said, glancing at Daisy and then back at me, as if he were alert for something more. “I’d be a God damned fool to live anywhere else.” At this point Miss Baker said: “Absolutely!” with such suddenness that I started—it was the first word she had uttered since I came into the room. Evidently it surprised her as much as it did me, for she yawned and with a series of rapid, deft movements stood up into the room. “I’m stiff,” she complained, “I’ve been lying on that sofa for as long as I can remember.” “Don’t look at me,” Daisy retorted, “‘I’ve been trying to get you to New York all afternoon.” “No, thanks,” said Miss Baker to the four cocktails just in from the pantry, “I’m absolutely in training.” Her host looked at her incredulously. “You are!” He took down his drink as if it were a drop in the bottom of a glass. “How you ever get anything done is beyond me.” I looked at Miss Baker, wondering what it was she “got done.” I enjoyed looking at her. She was a slender, small-breasted girl, with an erect carriage, which she accentuated by throwing her body backward at the shoulders like a young cadet. Her gray sun-strained eyes looked back at me with polite reciprocal curiosity out of a wan, charming, discontented face. It occurred to me now that I had seen her, or a picture of her, somewhere before. “You live in West Egg,” she remarked contemptuously. “I know somebody there.” “I don’t know a single—” “You must know Gatsby.” “Gatsby?” demanded Daisy. “What Gatsby?” Before I could reply that he was my neighbor dinner was announced; wedging his tense arm imperatively under mine, Tom Buchanan compelled me from the room as though he were moving a checker to another square. Slenderly, languidly, their hands set lightly on their hips, the two young women preceded us out onto a rosy-colored porch, open toward the sunset, where four candles flickered on the table in the diminished wind. “Why candles?” objected Daisy, frowning. She snapped them out with her fingers. “In two weeks it’ll be the longest day in the year.” She looked at us all radiantly. “Do you always watch for the longest day of the year and then miss it? I always watch for the longest day in the year and then miss it.” “We ought to plan something,” yawned Miss Baker, sitting down at the table as if she were getting into bed. “All right,” said Daisy. ‘‘What’ll we plan?” She turned to me helplessly: ‘‘What do people plan?” Before I could answer her eyes fastened with an awed expression on her little finger. “Look!” she complained; “I hurt it.” We all looked—the knuckle was black and blue. “You did it, Tom,” she said accusingly. “I know you didn’t mean to, but you did do it. That’s what I get for marrying a brute of a man, a great, big, hulking physical specimen of a—”’ “I hate that word hulking,” objected Tom crossly, “even in kidding.” “Hulking,” insisted Daisy. Sometimes she and Miss Baker talked at once, unobtrusively and with a bantering inconsequence that was never quite chatter, that was as cool as their white dresses and their impersonal eyes in the absence of all desire. They were here, and they accepted Tom and me, making only a polite pleasant effort to entertain or to be entertained. They knew that presently dinner would be over and a little later the evening too would be over and casually put away. It was sharply different from the West, where an evening was hurried from phase to phase toward its close, in a continually disappointed anticipation or else in sheer nervous dread of the moment itself. “You make me feel uncivilized, Daisy,” I confessed on my second glass of corky but rather impressive claret. “Can’t you talk about crops or something?” I meant nothing in particular by this remark, but it was taken up in an unexpected way. “Civilization’s going to pieces,” broke out Tom violently. “I’ve gotten to be a terrible pessimist about things. Have you read ‘The Rise of the Colored Empires’ by this man Goddard?” “Why, no,” I answered, rather surprised by his tone. “Well, it’s a fine book, and everybody ought to read it. The idea is if we don’t look out the white race will be—will be utterly submerged. It’s all scientific stuff; it’s been proved.” “Tom’s getting very profound,” said Daisy, with an expression of unthoughtful sadness. “He reads deep books with long words in them. What was that word we———” “Well, these books are all scientific,” insisted Tom, glancing at her impatiently. “This fellow has worked out the whole thing. It’s up to us, who are the dominant race, to watch out or these other races will have control of things.” “We’ve got to beat them down,” whispered Daisy, winking ferociously toward the fervent sun. “You ought to live in California—” began Miss Baker, but Tom interrupted her by shifting heavily in his chair. “This idea is that we’re Nordics. I am, and you are, and you are, and—” After an infinitesimal hesitation he included Daisy with a slight nod, and she winked at me again. ‘‘—And we’ve produced all the things that go to make civilization—oh, science and art, and all that. Do you see?” There was something pathetic in his concentration, as if his complacency, more acute than of old, was not enough to him any more. When, almost immediately, the telephone rang inside and the butler left the porch Daisy seized upon the momentary interruption and leaned toward me. “I’ll tell you a family secret,” she whispered enthusiastically. “It’s about the butler’s nose. Do you want to hear about the butler’s nose?” “That’s why I came over to-night.” “Well, he wasn’t always a butler; he used to be the silver polisher for some people in New York that had a silver service for two hundred people. He had to polish it from morning till night, until finally it began to affect his nose———” “Things went from bad to worse,” suggested Miss Baker. “Yes. Things went from bad to worse, until finally he had to give up his position.” For a moment the last sunshine fell with romantic affection upon her glowing face; her voice compelled me forward breathlessly as I listened—then the glow faded, each light deserting her with lingering regret, like children leaving a pleasant street at dusk. The butler came back and murmured something close to Tom’s ear, whereupon Tom frowned, pushed back his chair, and without a word went inside. As if his absence quickened something within her, Daisy leaned forward again, her voice glowing and singing. “I love to see you at my table, Nick. You remind me of a—of a rose, an absolute rose. Doesn’t he?” She turned to Miss Baker for confirmation: “An absolute rose?” This was untrue. I am not even faintly like a rose. She was only extemporizing, but a stirring warmth flowed from her, as if her heart was trying to come out to you concealed in one of those breathless, thrilling words. Then suddenly she threw her napkin on the table and excused herself and went into the house. Miss Baker and I exchanged a short glance consciously devoid of meaning. I was about to speak when she sat up alertly and said “Sh!” in a warning voice. A subdued impassioned murmur was audible in the room beyond, and Miss Baker leaned forward unashamed, trying to hear. The murmur trembled on the verge of coherence, sank down, mounted excitedly, and then ceased altogether. “This Mr. Gatsby you spoke of is my neighbor—”’ I began. “Don’t talk. I want to hear what happens.” “Is something happening?” I inquired innocently. “You mean to say you don’t know?” said Miss Baker, honestly surprised. “I thought everybody knew.” “I don’t.” “Why—” she said hesitantly, ‘‘Tom’s got some woman in New York.” “Got some woman?” I repeated blankly. Miss Baker nodded. “She might have the decency not to telephone him at dinner time. Don’t you think?” Almost before I had grasped her meaning there was the flutter of a dress and the crunch of leather boots, and Tom and Daisy were back at the table. “It couldn’t be helped!” cried Daisy with tense gayety. She sat down, glanced searchingly at Miss Baker and then at me, and continued: “I looked outdoors for a minute, and it’s very romantic outdoors. There’s a bird on the lawn that I think must be a nightingale come over on the Cunard or White Star Line. He’s singing away—” Her voice sang: “It’s romantic, isn’t it, Tom?” “Very romantic,” he said, and then miserably to me: “If it’s light enough after dinner, I want to take you down to the stables.” The telephone rang inside, startingly, and as Daisy shook her head decisively at Tom the subject of the stables, in fact all subjects, vanished into air. Among the broken fragments of the last five minutes at table I remember the candles being lit again, pointlessly, and I was conscious of wanting to look squarely at every one, and yet to avoid all eyes. I couldn’t guess what Daisy and Tom were thinking, but I doubt if even Miss Baker, who seemed to have mastered a certain hardy scepticism, was able utterly to put this fifth guest’s shrill metallic urgency out of mind. To a certain temperament the situation might have seemed intriguing—my own instinct was to telephone immediately for the police. The horses, needless to say, were not mentioned again. Tom and Miss Baker, with several feet of twilight between them, strolled back into the library, as if to a vigil beside a perfectly tangible body, while, trying to look pleasantly interested and a little deaf, I followed Daisy around a chain of connecting verandas to the porch in front. In its deep gloom we sat down side by side on a wicker settee. Daisy took her face in her hands as if feeling its lovely shape, and her eyes moved gradually out into the velvet dusk. I saw that turbulent emotions possessed her, so I asked what I thought would be some sedative questions about her little girl. “We don’t know each other very well, Nick,” she said suddenly. “Even if we are cousins. You didn’t come to my wedding.” “I wasn’t back from the war.” “That’s true.” She hesitated. “Well, I’ve had a very bad time, Nick, and I’m pretty cynical about everything.” Evidently she had reason to be. I waited but she didn’t say any more, and after a moment I returned rather feebly to the subject of her daughter. “I suppose she talks, and—eats, and everything.” “Oh, yes.” She looked at me absently. “Listen, Nick; let me tell you what I said when she was born. Would you like to hear?” “Very much.” “I’ll show you how I’ve gotten to feel about—things. Well, she was less than an hour old and Tom was God knows where. I woke up out of the ether with an utterly abandoned feeling, and asked the nurse right away if it was a boy or a girl. She told me it was a girl, and so I turned my head away and wept. ‘All right,’ I said, ‘I’m glad it’s a girl. And I hope she’ll be a fool—that’s the best thing a girl can be in this world, a beautiful little fool.’ “You see I think everything’s terrible anyhow,” she went on in a convinced way. “Everybody thinks so—the most advanced people. And I know. I’ve been everywhere and seen everything and done everything.” Her eyes flashed around her in a defiant way, rather like Tom’s, and she laughed with thrilling scorn. “Sophisticated—God, I’m sophisticated!” The instant her voice broke off, ceasing to compel my attention, my belief, I felt the basic insincerity of what she had said. It made me uneasy, as though the whole evening had been a trick of some sort to exact a contributary emotion from me. I waited, and sure enough, in a moment she looked at me with an absolute smirk on her lovely face, as if she had asserted her membership in a rather distinguished secret society to which she and Tom belonged. Inside, the crimson room bloomed with light. Tom and Miss Baker sat at either end of the long couch and she read aloud to him from the Saturday Evening Post—the words, murmurous and uninflected, running together in a soothing tune. The lamp-light, bright on his boots and dull on the autumn-leaf yellow of her hair, glinted along the paper as she turned a page with a flutter of slender muscles in her arms. When we came in she held us silent for a moment with a lifted hand. “To be continued,” she said, tossing the magazine on the table, “in our very next issue.” Her body asserted itself with a restless movement of her knee, and she stood up. “Ten o’clock,” she remarked, apparently finding the time on the ceiling. “Time for this good girl to go to bed.” “Jordan’s going to play in the tournament tomorrow,” explained Daisy, “over at Westchester.” “Oh—you’re Jordan Baker.” I knew now why her face was familiar—its pleasing contemptuous expression had looked out at me from many rotogravure pictures of the sporting life at Asheville and Hot Springs and Palm Beach. I had heard some story of her too, a critical, unpleasant story, but what it was I had forgotten long ago. “Good night,” she said softly. “Wake me at eight, won’t you.” “If you’ll get up.” “I will. Good night, Mr. Carraway. See you anon.” “Of course you will,” confirmed Daisy. “In fact I think I’ll arrange a marriage. Come over often, Nick, and I’ll sort of—oh—fling you together. You know—lock you up accidentally in linen closets and push you out to sea in a boat, and all that sort of thing———” “Good night,” called Miss Baker from the stairs. “I haven’t heard a word.” “She’s a nice girl,” said Tom after a moment. “They oughtn’t to let her run around the country this way.” “Who oughtn’t to?” inquired Daisy coldly. “Her family.” “Her family is one aunt about a thousand years old. Besides, Nick’s going to look after her, aren’t you, Nick? She’s going to spend lots of week-ends out here this summer. I think the home influence will be very good for her.” Daisy and Tom looked at each other for a moment in silence. “Is she from New York?” I asked quickly. “From Louisville. Our white girlhood was passed together there. Our beautiful white———” “Did you give Nick a little heart to heart talk on the veranda?” demanded Tom suddenly. “Did I?” She looked at me. “I can’t seem to remember, but I think we talked about the Nordic race. Yes, I’m sure we did. It sort of crept up on us and first thing you know———” “Don’t believe everything you hear, Nick,” he advised me. I said lightly that I had heard nothing at all, and a few minutes later I got up to go home. They came to the door with me and stood side by side in a cheerful square of light. As I started my motor Daisy peremptorily called: “Wait! “I forgot to ask you something, and it’s important. We heard you were engaged to a girl out West.” “That’s right,” corroborated Tom kindly. “We heard that you were engaged.” “It’s a libel. I’m too poor.” “But we heard it,” insisted Daisy, surprising me by opening up again in a flower-like way. “We heard it from three people, so it must be true.” Of course I knew what they were referring to, but I wasn’t even vaguely engaged. The fact that gossip had published the banns was one of the reasons I had come East. You can’t stop going with an old friend on account of rumors, and on the other hand I had no intention of being rumored into marriage. Their interest rather touched me and made them less remotely rich—nevertheless, I was confused and a little disgusted as I drove away. It seemed to me that the thing for Daisy to do was to rush out of the house, child in arms—but apparently there were no such intentions in her head. As for Tom, the fact that he “had some woman in New York” was really less surprising than that he had been depressed by a book. Something was making him nibble at the edge of stale ideas as if his sturdy physical egotism no longer nourished his peremptory heart. Already it was deep summer on roadhouse roofs and in front of wayside garages, where new red gaspumps sat out in pools of light, and when I reached my estate at West Egg I ran the car under its shed and sat for a while on an abandoned grass roller in the yard. The wind had blown off, leaving a loud, bright night, with wings beating in the trees and a persistent organ sound as the full bellows of the earth blew the frogs full of life. The silhouette of a moving cat wavered across the moonlight, and turning my head to watch it, I saw that I was not alone—fifty feet away a figure had emerged from the shadow of my neighbor’s mansion and was standing with his hands in his pockets regarding the silver pepper of the stars. Something in his leisurely movements and the secure position of his feet upon the lawn suggested that it was Mr. Gatsby himself, come out to determine what share was his of our local heavens. I decided to call to him. Miss Baker had mentioned him at dinner, and that would do for an introduction. But I didn’t call to him, for he gave a sudden intimation that he was content to be alone—he stretched out his arms toward the dark water in a curious way, and, far as I was from him, I could have sworn he was trembling. Involuntarily I glanced seaward—and distinguished nothing except a single green light, minute and far away, that might have been the end of a dock. When I looked once more for Gatsby he had vanished, and I was alone again in the unquiet darkness. ## CHAPTER II About half way between West Egg and New York the motor road hastily joins the railroad and runs beside it for a quarter of a mile, so as to shrink away from a certain desolate area of land. This is a valley of ashes—a fantastic farm where ashes grow like wheat into ridges and hills and grotesque gardens; where ashes take the forms of houses and chimneys and rising smoke and, finally, with a transcendent effort, of ash-gray men, who move dimly and already crumbling through the powdery air. Occasionally a line of gray cars crawls along an invisible track, gives out a ghastly creak, and comes to rest, and immediately the ash-gray men swarm up with leaden spades and stir up an impenetrable cloud, which screens their obscure operations from your sight. But above the gray land and the spasms of bleak dust which drift endlessly over it, you perceive, after a moment, the eyes of Doctor T. J. Eckleburg. The eyes of Doctor T. J. Eckleburg are blue and gigantic—their retinas are one yard high. They look out of no face, but, instead, from a pair of enormous yellow spectacles which pass over a nonexistent nose. Evidently some wild wag of an oculist set them there to fatten his practice in the borough of Queens, and then sank down himself into eternal blindness, or forgot them and moved away. But his eyes, dimmed a little by many paintless days, under sun and rain, brood on over the solemn dumping ground. The valley of ashes is bounded on one side by a small foul river, and, when the drawbridge is up to let barges through, the passengers on waiting trains can stare at the dismal scene for as long as half an hour. There is always a halt there of at least a minute, and it was because of this that I first met Tom Buchanan’s mistress. The fact that he had one was insisted upon wherever he was known. His acquaintances resented the fact that he turned up in popular cafés with her and, leaving her at a table, sauntered about, chatting with whomsoever he knew. Though I was curious to see her, I had no desire to meet her—but I did. I went up to New York with Tom on the train one afternoon, and when we stopped by the ashheaps he jumped to his feet and, taking hold of my elbow, literally forced me from the car. “We're getting off,” he insisted. “I want you to meet my girl.” I think he’d tanked up a good deal at luncheon, and his determination to have my company bordered on violence. The supercilious assumption was that on Sunday afternoon I had nothing better to do. I followed him over a low whitewashed railroad fence, and we walked back a hundred yards along the road under Doctor Eckleburg’s persistent stare. The only building in sight was a small block of yellow brick sitting on the edge of the waste land, a sort of compact Main Street ministering to it, and contiguous to absolutely nothing. One of the three shops it contained was for rent and another was an all-night restaurant, approached by a trail of ashes; the third was a garage—Repairs. George B. Wilson. Cars bought and sold.—and I followed Tom inside. The interior was unprosperous and bare; the only car visible was the dust-covered wreck of a Ford which crouched in a dim corner. It had occurred to me that this shadow of a garage must be a blind, and that sumptuous and romantic apartments were concealed overhead, when the proprietor himself appeared in the door of an office, wiping his hands on a piece of waste. He was a blond, spiritless man, anæmic, and faintly handsome. When he saw us a damp gleam of hope sprang into his light blue eyes. “Hello, Wilson, old man,” said Tom, slapping him jovially on the shoulder. ‘‘How’s business?” “I can’t complain,” answered Wilson unconvincingly. “When are you going to sell me that car?” “Next week; I’ve got my man working on it now.” “Works pretty slow, don’t he?” “No, he doesn’t,” said Tom coldly. “And if you feel that way about it, maybe I’d better sell it somewhere else after all.” “I don’t mean that,” explained Wilson quickly. “I just meant———” His voice faded off and Tom glanced impatiently around the garage. Then I heard footsteps on a stairs, and in a moment the thickish figure of a woman blocked out the light from the office door. She was in the middle thirties, and faintly stout, but she carried her flesh sensuously as some women can. Her face, above a spotted dress of dark blue crêpe-de-chine, contained no facet or gleam of beauty, but there was an immediately perceptible vitality about her as if the nerves of her body were continually smouldering. She smiled slowly and, walking through her husband as if he were a ghost, shook hands with Tom, looking him flush in the eye. Then she wet her lips, and without turning around spoke to her husband in a soft, coarse voice: “Get some chairs, why don’t you, so somebody can sit down.” “Oh, sure,” agreed Wilson hurriedly, and went toward the little office, mingling immediately with the cement color of the walls. A white ashen dust veiled his dark suit and his pale hair as it veiled everything in the vicinity—except his wife, who moved close to Tom. “I want to see you,” said Tom intently. “Get on the next train.” “All right.” “I’ll meet you by the news-stand on the lower level.” She nodded and moved away from him just as George Wilson emerged with two chairs from his office door. We waited for her down the road and out of sight. It was a few days before the Fourth of July, and a gray, scrawny Italian child was setting torpedoes in a row along the railroad track. “Terrible place, isn’t it,” said Tom, exchanging a frown with Doctor Eckleburg. “Awful.” “It does her good to get away.” “Doesn’t her husband object?” “Wilson? He thinks she goes to see her sister in New York. He’s so dumb he doesn’t know he’s alive.” So Tom Buchanan and his girl and I went up together to New York—or not quite together, for Mrs. Wilson sat discreetly in another car. Tom deferred that much to the sensibilities of those East Eggers who might be on the train. She had changed her dress to a brown figured muslin, which stretched tight over her rather wide hips as Tom helped her to the platform in New York. At the news-stand she bought a copy of Town Tattle and a moving-picture magazine, and in the station drug-store some cold cream and a small flask of perfume. Up-stairs, in the solemn echoing drive she let four taxicabs drive away before she selected a new one, lavender-colored with gray upholstery, and in this we slid out from the mass of the station into the glowing sunshine. But immediately she turned sharply from the window and, leaning forward, tapped on the front glass. “I want to get one of those dogs,” she said earnestly. “I want to get one for the apartment. They’re nice to have—a dog.” We backed up to a gray old man who bore an absurd resemblance to John D. Rockefeller. In a basket swung from his neck cowered a dozen very recent puppies of an indeterminate breed. “What kind are they?” asked Mrs. Wilson eagerly, as he came to the taxi-window. “All kinds. What kind do you want, lady?” “I’d like to get one of those police dogs; I don’t suppose you got that kind?” The man peered doubtfully into the basket, plunged in his hand and drew one up, wriggling, by the back of the neck. “That’s no police dog,” said Tom. “No, it’s not exactly a police dog,” said the man with disappointment in his voice. “It’s more of an Airedale.” He passed his hand over the brown washrag of a back. “Look at that coat. Some coat. That’s a dog that’ll never bother you with catching cold.” “I think it’s cute,” said Mrs. Wilson enthusiastically. “How much is it?” “That dog?” He looked at it admiringly. “That dog will cost you ten dollars.” The Airedale—undoubtedly there was an Airedale concerned in it somewhere, though its feet were startlingly white—changed hands and settled down into Mrs. Wilson’s lap, where she fondled the weatherproof coat with rapture. “Is it a boy or a girl?” she asked delicately. “That dog? That dog’s a boy.” “It’s a bitch,” said Tom decisively. “Here’s your money. Go and buy ten more dogs with it.” We drove over to Fifth Avenue, warm and soft, almost pastoral, on the summer Sunday afternoon. I wouldn’t have been surprised to see a great flock of white sheep turn the corner. “Hold on,” I said, “I have to leave you here.” “No, you don’t,” interposed Tom quickly. “Myrtle’ll be hurt if you don’t come up to the apartment. Won’t you, Myrtle?” “Come on,” she urged. “I'll telephone my sister Catherine. She’s said to be very beautiful by people who ought to know.” “Well, I’d like to, but—” We went on, cutting back again over the Park toward the West Hundreds. At 158th Street the cab stopped at one slice in a long white cake of apartment-houses. Throwing a regal homecoming glance around the neighborhood, Mrs. Wilson gathered up her dog and her other purchases, and went haughtily in. “I’m going to have the McKees come up,” she announced as we rose in the elevator. “And, of course, I got to call up my sister, too.” The apartment was on the top floor—a small living-room, a small dining-room, a small bedroom, and a bath. The living-room was crowded to the doors with a set of tapestried furniture entirely too large for it, so that to move about was to stumble continually over scenes of ladies swinging in the gardens of Versailles. The only picture was an over-enlarged photograph, apparently a hen sitting on a blurred rock. Looked at from a distance, however, the hen resolved itself into a bonnet, and the countenance of a stout old lady beamed down into the room. Several old copies of Town Tattle lay on the table together with a copy of “Simon Called Peter,” and some of the small scandal magazines of Broadway. Mrs. Wilson was first concerned with the dog. A reluctant elevator-boy went for a box full of straw and some milk, to which he added on his own initiative a tin of large, hard dog-biscuits— one of which decomposed apathetically in the saucer of milk all afternoon. Meanwhile Tom brought out a bottle of whiskey from a locked bureau door. I have been drunk just twice in my life, and the second time was that afternoon; so everything that happened has a dim, hazy cast over it, although until after eight o’clock the apartment was full of cheerful sun. Sitting on Tom’s lap Mrs. Wilson called up several people on the telephone; then there were no cigarettes, and I went out to buy some at the drugstore on the corner. When I came back they had both disappeared, so I sat down discreetly in the living-room and read a chapter of “Simon Called Peter”—either it was terrible stuff or the whiskey distorted things, because it didn’t make any sense to me. Just as Tom and Myrtle (after the first drink Mrs. Wilson and I called each other by our first names) reappeared, company commenced to arrive at the apartment-door. The sister, Catherine, was a slender, worldly girl of about thirty, with a solid, sticky bob of red hair, and a complexion powdered milky white. Her eyebrows had been plucked and then drawn on again at a more rakish angle, but the efforts of nature toward the restoration of the old alignment gave a blurred air to her face. When she moved about there was an incessant clicking as innumerable pottery bracelets jingled up and down upon her arms. She came in with such a proprietary haste, and looked around so possessively at the furniture that I wondered if she lived here. But when I asked her she laughed immoderately, repeated my question aloud, and told me she lived with a girl friend at a hotel. Mr. McKee was a pale, feminine man from the flat below. He had just shaved, for there was a white spot of lather on his cheekbone, and he was most respectful in his greeting to every one in the room. He informed me that he was in the “artistic game,” and I gathered later that he was a photographer and had made the dim enlargement of Mrs. Wilson’s mother which hovered like an ectoplasm on the wall. His wife was shrill, languid, handsome, and horrible. She told me with pride that her husband had photographed her a hundred and twenty-seven times since they had been married. Mrs. Wilson had changed her costume some time before, and was now attired in an elaborate afternoon dress of cream-colored chiffon, which gave out a continual rustle as she swept about the room. With the influence of the dress her personality had also undergone a change. The intense vitality that had been so remarkable in the garage was converted into impressive hauteur. Her laughter, her gestures, her assertions became more violently affected moment by moment, and as she expanded the room grew smaller around her, until she seemed to be revolving on a noisy, creaking pivot through the smoky air. “My dear,” she told her sister in a high, mincing shout, “most of these fellas will cheat you every time. All they think of is money. I had a woman up here last week to look at my feet, and when she gave me the bill you’d of thought she had my appendicitus out.” “What was the name of the woman?” asked Mrs. McKee. “Mrs. Eberhardt. She goes around looking at people’s feet in their own homes.” “I like your dress,” remarked Mrs. McKee, “I think it’s adorable.” Mrs. Wilson rejected the compliment by raising her eyebrow in disdain. “It’s just a crazy old thing,” she said. “I just slip it on sometimes when I don’t care what I look like.” “But it looks wonderful on you, if you know what I mean,” pursued Mrs. McKee. “If Chester could only get you in that pose I think he could make something of it.” We all looked in silence at Mrs. Wilson, who removed a strand of hair from over her eyes and looked back at us with a brilliant smile. Mr. McKee regarded her intently with his head on one side, and then moved his hand back and forth slowly in front of his face. “I should change the light,” he said after a moment. “I’d like to bring out the modelling of the features. And I’d try to get hold of all the back hair.” “I wouldn’t think of changing the light,” cried Mrs. McKee. “I think it’s———” Her husband said “Sh!” and we all looked at the subject again, whereupon Tom Buchanan yawned audibly and got to his feet. “You McKees have something to drink,” he said. “Get some more ice and mineral water, Myrtle, before everybody goes to sleep.” “I told that boy about the ice.” Myrtle raised her eyebrows in despair at the shiftlessness of the lower orders. “These people! You have to keep after them all the time.” She looked at me and laughed pointlessly. Then she flounced over to the dog, kissed it with ecstasy, and swept into the kitchen, implying that a dozen chefs awaited her orders there. “I’ve done some nice things out on Long Island,” asserted Mr. McKee. Tom looked at him blankly. “Two of them we have framed down-stairs.” “Two what?” demanded Tom. “Two studies. One of them I call ‘Montauk Point—The Gulls,’ and the other I call ‘Montauk Point—The Sea.’” The sister Catherine sat down beside me on the couch. “Do you live down on Long Island, too,” she inquired. “I live at West Egg.” “Really? I was down there at a party about a month ago. At a man named Gatsby’s. Do you know him?” “I live next door to him.” “Well, they say he’s a nephew or a cousin of Kaiser Wilhelm’s. That’s where all his money comes from.” “Really?” She nodded. “I’m scared of him. I’d hate to have him get anything on me.” This absorbing information about my neighbor was interrupted by Mrs. McKee’s pointing suddenly at Catherine: “Chester, I think you could do something with her,” she broke out, but Mr. McKee only nodded in a bored way, and turned his attention to Tom. “I’d like to do more work on Long Island, if I could get the entry. All I ask is that they should give me a start.” “Ask Myrtle,” said Tom, breaking into a short shout of laughter as Mrs. Wilson entered with a tray. “She'll give you a letter of introduction, won’t you, Myrtle?” “Do what?” she asked, startled. “You'll give McKee a letter of introduction to your husband, so he can do some studies of him.” His lips moved silently for a moment as he invented. “‘George B. Wilson at the Gasoline Pump,’ or something like that.” Catherine leaned close to me and whispered in my ear: “Neither of them can stand the person they’re married to.” “Can’t they?” “Can’t stand them.” She looked at Myrtle and then at Tom. “What I say is, why go on living with them if they can’t stand them? If I was them I’d get a divorce and get married to each other right away.” “Doesn’t she like Wilson either?” The answer to this was unexpected. It came from Myrtle, who had overheard the question, and it was violent and obscene. “You see,” cried Catherine triumphantly. She lowered her voice again. “It’s really his wife that’s keeping them apart. She’s a Catholic, and they don’t believe in divorce.” Daisy was not a Catholic, and I was a little shocked at the elaborateness of the lie. “When they do get married,” continued Catherine, “they’re going West to live for a while until it blows over.” “It’d be more discreet to go to Europe.” “Oh, do you like Europe?” she exclaimed surprisingly. “I just got back from Monte Carlo.” “Really.” “Just last year. I went over there with another girl.” “Stay long?” “No, we just went to Monte Carlo and back. We went by way of Marseilles. We had over twelve hundred dollars when we started, but we got gyped out of it all in two days in the private rooms. We had an awful time getting back, I can tell you. God, how I hated that town!” The late afternoon sky bloomed in the window for a moment like the blue honey of the Mediterranean—then the shrill voice of Mrs. McKee called me back into the room. “I almost made a mistake, too,” she declared vigorously. “I almost married a little kyke who’d been after me for years. I knew he was below me. Everybody kept saying to me: ‘Lucille, that man’s ’way below you!’ But if I hadn’t met Chester, he’d of got me sure.” “Yes, but listen,” said Myrtle Wilson, nodding her head up and down, “at least you didn’t marry him.” “I know I didn’t.” “Well, I married him,” said Myrtle, ambiguously. “And that’s the difference between your case and mine.” “Why did you, Myrtle?” demanded Catherine. “Nobody forced you to.” Myrtle considered. “I married him because I thought he was a gentleman,” she said finally. “I thought he knew something about breeding, but he wasn’t fit to lick my shoe.” “You were crazy about him for a while,” said Catherine. “Crazy about him!” cried Myrtle incredulously. “Who said I was crazy about him? I never was any more crazy about him than I was about that man there.” She pointed suddenly at me, and every one looked at me accusingly. I tried to show by my expression that I expected no affection. “The only crazy I was was when I married him. I knew right away I made a mistake. He borrowed somebody’s best suit to get married in, and never even told me about it, and the man came after it one day when he was out: ‘Oh, is that your suit?’ I said. ‘This is the first I ever heard about it.’ But I gave it to him and then I lay down and cried to beat the band all afternoon.” “She really ought to get away from him,” resumed Catherine to me. “They’ve been living over that garage for eleven years. And Tom’s the first sweetie she ever had.” The bottle of whiskey—a second one—was now in constant demand by all present, excepting Catherine, who “felt just as good on nothing at all.” Tom rang for the janitor and sent him for some celebrated sandwiches, which were a complete supper in themselves. I wanted to get out and walk eastward toward the park through the soft twilight, but each time I tried to go I became entangled in some wild, strident argument which pulled me back, as if with ropes, into my chair. Yet high over the city our line of yellow windows must have contributed their share of human secrecy to the casual watcher in the darkening streets, and I saw him too, looking up and wondering. I was within and without, simultaneously enchanted and repelled by the inexhaustible variety of life. Myrtle pulled her chair close to mine, and suddenly her warm breath poured over me the story of her first meeting with Tom. “It was on the two little seats facing each other that are always the last ones left on the train. I was going up to New York to see my sister and spend the night. He had on a dress suit and patent leather shoes, and I couldn’t keep my eyes off him, but every time he looked at me I had to pretend to be looking at the advertisement over his head. When we came into the station he was next to me, and his white shirt-front pressed against my arm, and so I told him I’d have to call a policeman, but he knew I lied. I was so excited that when I got into a taxi with him I didn’t hardly know I wasn’t getting into a subway train. All I kept thinking about, over and over, was ‘You can’t live forever; you can’t live forever.’” She turned to Mrs. McKee and the room rang full of her artificial laughter. “My dear,” she cried, “I’m going to give you this dress as soon as I’m through with it. I’ve got to get another one to-morrow. I’m going to make a list of all the things I’ve got to get. A massage and a wave, and a collar for the dog, and one of those cute little ash-trays where you touch a spring, and a wreath with a black silk bow for mother’s grave that’ll last all summer. I got to write down a list so I won’t forget all the things I got to do.” It was nine o’clock—almost immediately afterward I looked at my watch and found it was ten. Mr. McKee was asleep on a chair with his fists clenched in his lap, like a photograph of a man of action. Taking out my handkerchief I wiped from his cheek the spot of dried lather that had worried me all the afternoon. The little dog was sitting on the table looking with blind eyes through the smoke, and from time to time groaning faintly. People disappeared, reappeared, made plans to go somewhere, and then lost each other, searched for each other, found each other a few feet away. Some time toward midnight Tom Buchanan and Mrs. Wilson stood face to face discussing, in impassioned voices, whether Mrs. Wilson had any right to mention Daisy’s name. “Daisy! Daisy! Daisy!” shouted Mrs. Wilson. “I’ll say it whenever I want to! Daisy! Dai———” Making a short deft movement, Tom Buchanan broke her nose with his open hand. Then there were bloody towels upon the bathroom floor, and women’s voices scolding, and high over the confusion a long broken wail of pain. Mr. McKee awoke from his doze and started in a daze toward the door. When he had gone half way he turned around and stared at the scene—his wife and Catherine scolding and consoling as they stumbled here and there among the crowded furniture with articles of aid, and the despairing figure on the couch, bleeding fluently, and trying to spread a copy of Town Tattle over the tapestry scenes of Versailles. Then Mr. McKee turned and continued on out the door. Taking my hat from the chandelier, I followed. “Come to lunch some day,” he suggested, as we groaned down in the elevator. “Where?” “Anywhere.” “Keep your hands off the lever,” snapped the elevator boy. “I beg your pardon,” said Mr. McKee with dignity, “I didn’t know I was touching it.” “All right,” I agreed, “I’ll be glad to.” . . . I was standing beside his bed and he was sitting up between the sheets, clad in his underwear, with a great portfolio in his hands. “Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n Bridge . . .” Then I was lying half asleep in the cold lower level of the Pennsylvania Station, staring at the morning Tribune, and waiting for the four o’clock train. ## CHAPTER III There was music from my neighbor’s house through the summer nights. In his blue gardens men and girls came and went like moths among the whisperings and the champagne and the stars. At high tide in the afternoon I watched his guests diving from the tower of his raft, or taking the sun on the hot sand of his beach while his two motor-boats slit the waters of the Sound, drawing aquaplanes over cataracts of foam. On week-ends his Rolls-Royce became an omnibus, bearing parties to and from the city between nine in the morning and long past midnight, while his station wagon scampered like a brisk yellow bug to meet all trains. And on Mondays eight servants, including an extra gardener, toiled all day with mops and scrubbing-brushes and hammers and garden-shears, repairing the ravages of the night before. Every Friday five crates of oranges and lemons arrived from a fruiterer in New York—every Monday these same oranges and lemons left his back door in a pyramid of pulpless halves. There was a machine in the kitchen which could extract the juice of two hundred oranges in half an hour if a little button was pressed two hundred times by a butler’s thumb. At least once a fortnight a corps of caterers came down with several hundred feet of canvas and enough colored lights to make a Christmas tree of Gatsby’s enormous garden. On buffet tables, garnished with glistening hors-d’œuvre, spiced baked hams crowded against salads of harlequin designs and pastry pigs and turkeys bewitched to a dark gold. In the main hall a bar with a real brass rail was set up, and stocked with gins and liquors and with cordials so long forgotten that most of his female guests were too young to know one from another. By seven o’clock the orchestra has arrived, no thin five-piece affair, but a whole pitful of oboes and trombones and saxophones and viols and cornets and piccolos, and low and high drums. The last swimmers have come in from the beach now and are dressing up-stairs; the cars from New York are parked five deep in the drive, and already the halls and salons and verandas are gaudy with primary colors, and hair bobbed in strange new ways, and shawls beyond the dreams of Castile. The bar is in full swing, and floating rounds of cocktails permeate the garden outside, until the air is alive with chatter and laughter, and casual innuendo and introductions forgotten on the spot, and enthusiastic meetings between women who never knew each other’s names. The lights grow brighter as the earth lurches away from the sun, and now the orchestra is playing yellow cocktail music, and the opera of voices pitches a key higher. Laughter is easier minute by minute, spilled with prodigality, tipped out at a cheerful word. The groups change more swiftly, swell with new arrivals, dissolve and form in the same breath; already there are wanderers, confident girls who weave here and there among the stouter and more stable, become for a sharp, joyous moment the centre of a group, and then, excited with triumph, glide on through the sea-change of faces and voices and color under the constantly changing light. Suddenly one of these gypsies, in trembling opal, seizes a cocktail out of the air, dumps it down for courage and, moving her hands like Frisco, dances out alone on the canvas platform. A momentary hush; the orchestra leader varies his rhythm obligingly for her, and there is a burst of chatter as the erroneous news goes around that she is Gilda Gray’s understudy from the Follies. The party has begun. I believe that on the first night I went to Gatsby’s house I was one of the few guests who had actually been invited. People were not invited—they went there. They got into automobiles which bore them out to Long Island, and somehow they ended up at Gatsby’s door. Once there they were introduced by somebody who knew Gatsby, and after that they conducted themselves according to the rules of behavior associated with an amusement park. Sometimes they came and went without having met Gatsby at all, came for the party with a simplicity of heart that was its own ticket of admission. I had been actually invited. A chauffeur in a uniform of robin’s-egg blue crossed my lawn early that Saturday morning with a surprisingly formal note from his employer: the honor would be entirely Gatsby’s, it said, if I would attend his “little party” that night. He had seen me several times, and had intended to call on me long before, but a peculiar combination of circumstances had prevented it— signed Jay Gatsby, in a majestic hand. Dressed up in white flannels I went over to his lawn a little after seven, and wandered around rather ill at ease among swirls and eddies of people I didn’t know—though here and there was a face I had noticed on the commuting train. I was immediately struck by the number of young Englishmen dotted about; all well dressed, all looking a little hungry, and all talking in low, earnest voices to solid and prosperous Americans. I was sure that they were selling something: bonds or insurance or automobiles. They were at least agonizingly aware of the easy money in the vicinity and convinced that it was theirs for a few words in the right key. As soon as I arrived I made an attempt to find my host, but the two or three people of whom I asked his whereabouts stared at me in such an amazed way, and denied so vehemently any knowledge of his movements, that I slunk off in the direction of the cocktail table—the only place in the garden where a single man could linger without looking purposeless and alone. I was on my way to get roaring drunk from sheer embarrassment when Jordan Baker came out of the house and stood at the head of the marble steps, leaning a little backward and looking with contemptuous interest down into the garden. Welcome or not, I found it necessary to attach myself to some one before I should begin to address cordial remarks to the passers-by. “Hello!” I roared, advancing toward her. My voice seemed unnaturally loud across the garden. “I thought you might be here,” she responded absently as I came up. “I remembered you lived next door to——” She held my hand impersonally, as a promise that she’d take care of me in a minute, and gave ear to two girls in twin yellow dresses, who stopped at the foot of the steps. “Hello!” they cried together. “Sorry you didn’t win.” That was for the golf tournament. She had lost in the finals the week before. “You don’t know who we are,” said one of the girls in yellow, “but we met you here about a month ago.” “You’ve dyed your hair since then,” remarked Jordan, and I started, but the girls had moved casually on and her remark was addressed to the premature moon, produced like the supper, no doubt, out of a caterer’s basket. With Jordan’s slender golden arm resting in mine, we descended the steps and sauntered about the garden. A tray of cocktails floated at us through the twilight, and we sat down at a table with the two girls in yellow and three men, each one introduced to us as Mr. Mumble. “Do you come to these parties often?” inquired Jordan of the girl beside her. “The last one was the one I met you at,” answered the girl, in an alert confident voice. She turned to her companion: “Wasn’t it for you, Lucille?” It was for Lucille, too. “I like to come,” Lucille said. “I never care what I do, so I always have a good time. When I was here last I tore my gown on a chair, and he asked me my name and address—inside of a week I got a package from Croirier’s with a new evening gown in it.” “Did you keep it?” asked Jordan. “Sure I did. I was going to wear it to-night, but it was too big in the bust and had to be altered. It was gas blue with lavender beads. Two hundred and sixty-five dollars.” “There’s something funny about a fellow that’ll do a thing like that,” said the other girl eagerly. “He doesn’t want any trouble with anybody.” “Who doesn’t?” I inquired. “Gatsby. Somebody told me——” The two girls and Jordan leaned together confidentially. “Somebody told me they thought he killed a man once.” A thrill passed over all of us. The three Mr. Mumbles bent forward and listened eagerly. “I don’t think it’s so much that,” argued Lucille sceptically; “it’s more that he was a German spy during the war.” One of the men nodded in confirmation. “I heard that from a man who knew all about him, grew up with him in Germany,” he assured us positively. “Oh, no,” said the first girl, “it couldn’t be that, because he was in the American army during the war.” As our credulity switched back to her she leaned forward with enthusiasm. “You look at him sometimes when he thinks nobody’s looking at him. I’ll bet he killed a man.” She narrowed her eyes and shivered. Lucille shivered. We all turned and looked around for Gatsby. It was testimony to the romantic speculation he inspired that there were whispers about him from those who had found little that it was necessary to whisper about in this world. The first supper—there would be another one after midnight—was now being served, and Jordan invited me to join her own party, who were spread around a table on the other side of the garden. There were three married couples and Jordan’s escort, a persistent undergraduate given to violent innuendo, and obviously under the impression that sooner or later Jordan was going to yield him up her person to a greater or lesser degree. Instead of rambling this party had preserved a dignified homogeneity, and assumed to itself the function of representing the staid nobility of the country-side—East Egg condescending to West Egg, and carefully on guard against its spectroscopic gayety. “Let’s get out,” whispered Jordan, after a somehow wasteful and inappropriate half-hour; “this is much too polite for me.” We got up, and she explained that we were going to find the host: I had never met him, she said, and it was making me uneasy. The undergraduate nodded in a cynical, melancholy way. The bar, where we glanced first, was crowded, but Gatsby was not there. She couldn’t find him from the top of the steps, and he wasn’t on the veranda. On a chance we tried an important-looking door, and walked into a high Gothic library, panelled with carved English oak, and probably transported complete from some ruin overseas. A stout, middle-aged man, with enormous owl-eyed spectacles, was sitting somewhat drunk on the edge of a great table, staring with unsteady concentration at the shelves of books. As we entered he wheeled excitedly around and examined Jordan from head to foot. “What do you think?” he demanded impetuously. “About what?” He waved his hand toward the book-shelves. “About that. As a matter of fact you needn’t bother to ascertain. I ascertained. They’re real.” “The books?” He nodded. “Absolutely real—have pages and everything. I thought they’d be a nice durable cardboard. Matter of fact, they’re absolutely real. Pages and—Here! Lemme show you.” Taking our scepticism for granted, he rushed to the bookcases and returned with Volume One of the “Stoddard Lectures.” “See!” he cried triumphantly. “It’s a bona-fide piece of printed matter. It fooled me. This fella’s a regular Belasco. It’s a triumph. What thoroughness! What realism! Knew when to stop, too—didn’t cut the pages. But what do you want? What do you expect?” He snatched the book from me and replaced it hastily on its shelf, muttering that if one brick was removed the whole library was liable to collapse. “Who brought you?” he demanded. “Or did you just come? I was brought. Most people were brought.” Jordan looked at him alertly, cheerfully, without answering. “I was brought by a woman named Roosevelt,” he continued. “Mrs. Claud Roosevelt. Do you know her? I met her somewhere last night. I’ve been drunk for about a week now, and I thought it might sober me up to sit in a library.” “Has it?” “A little bit, I think. I can’t tell yet. I’ve only been here an hour. Did I tell you about the books? They’re real. They’re—” “You told us.” We shook hands with him gravely and went back outdoors. There was dancing now on the canvas in the garden; old men pushing young girls backward in eternal graceless circles, superior couples holding each other tortuously, fashionably, and keeping in the corners—and a great number of single girls dancing individualistically or relieving the orchestra for a moment of the burden of the banjo or the traps. By midnight the hilarity had increased. A celebrated tenor had sung in Italian, and a notorious contralto had sung in jazz, and between the numbers people were doing ‘‘stunts” all over the garden, while happy, vacuous bursts of laughter rose toward the summer sky. A pair of stage twins, who turned out to be the girls in yellow, did a baby act in costume, and champagne was served in glasses bigger than finger-bowls. The moon had risen higher, and floating in the Sound was a triangle of silver scales, trembling a little to the stiff, tinny drip of the banjoes on the lawn. I was still with Jordan Baker. We were sitting at a table with a man of about my age and a rowdy little girl, who gave way upon the slightest provocation to uncontrollable laughter. I was enjoying myself now. I had taken two finger-bowls of champagne, and the scene had changed before my eyes into something significant, elemental, and profound. At a lull in the entertainment the man looked at me and smiled. “Your face is familiar,” he said, politely. “Weren’t you in the First Division during the war?” “Why, yes. I was in the Twenty-eighth Infantry.” “I was in the Sixteenth until June nineteen-eighteen. I knew I’d seen you somewhere before.” We talked for a moment about some wet, gray little villages in France. Evidently he lived in this vicinity, for he told me that he had just bought a hydroplane, and was going to try it out in the morning. “Want to go with me, old sport? Just near the shore along the Sound.” “What time?” “Any time that suits you best.” It was on the tip of my tongue to ask his name when Jordan looked around and smiled. “Having a gay time now?” she inquired. “Much better.” I turned again to my new acquaintance. “This is an unusual party for me. I haven’t even seen the host. I live over there—” I waved my hand at the invisible hedge in the distance, “and this man Gatsby sent over his chauffeur with an invitation.” For a moment he looked at me as if he failed to understand. “I’m Gatsby,” he said suddenly. “What!” I exclaimed. “Oh, I beg your pardon.” “I thought you knew, old sport. I’m afraid I’m not a very good host.” He smiled understandingly—much more than understandingly. It was one of those rare smiles with a quality of eternal reassurance in it, that you may come across four or five times in life. It faced—or seemed to face—the whole eternal world for an instant, and then concentrated on you with an irresistible prejudice in your favor. It understood you just so far as you wanted to be understood, believed in you as you would like to believe in yourself, and assured you that it had precisely the impression of you that, at your best, you hoped to convey. Precisely at that point it vanished—and I was looking at an elegant young rough-neck, a year or two over thirty, whose elaborate formality of speech just missed being absurd. Some time before he introduced himself I’d got a strong impression that he was picking his words with care. Almost at the moment when Mr. Gatsby identified himself a butler hurried toward him with the information that Chicago was calling him on the wire. He excused himself with a small bow that included each of us in turn. “If you want anything just ask for it, old sport,” he urged me. “Excuse me. I will rejoin you later.” When he was gone I turned immediately to Jordan—constrained to assure her of my surprise. I had expected that Mr. Gatsby would be a florid and corpulent person in his middle years. “Who is he?” I demanded. “Do you know?” “He’s just a man named Gatsby.” “Where is he from, I mean? And what does he do?” “Now you’re started on the subject,” she answered with a wan smile. “Well, he told me once he was an Oxford man.” A dim background started to take shape behind him, but at her next remark it faded away. “However, I don’t believe it.” “Why not?” “I don’t know,” she insisted, “I just don’t think he went there.” Something in her tone reminded me of the other girl’s “I think he killed a man,” and had the effect of stimulating my curiosity. I would have accepted without question the information that Gatsby sprang from the swamps of Louisiana or from the lower East Side of New York. That was comprehensible. But young men didn’t—at least in my provincial inexperience I believed they didn’t—drift coolly out of nowhere and buy a palace on Long Island Sound. “Anyhow, he gives large parties,” said Jordan, changing the subject with an urban distaste for the concrete. “And I like large parties. They’re so intimate. At small parties there isn’t any privacy.” There was the boom of a bass drum, and the voice of the orchestra leader rang out suddenly above the chatter of the garden. “Ladies and gentlemen,” he cried. “At the request of Mr. Gatsby we are going to play for you Mr. Vladmir Tostoff’s latest work, which attracted so much attention at Carnegie Hall last May. If you read the papers you know there was a big sensation.” He smiled with jovial condescension, and added: “Some sensation!” Whereupon everybody laughed. “The piece is known,” he concluded lustily, “as ‘Vladmir Tostoff’s Jazz History of the World.’” The nature of Mr. Tostoff’s composition eluded me, because just as it began my eyes fell on Gatsby, standing alone on the marble steps and looking from one group to another with approving eyes. His tanned skin was drawn attractively tight on his face and his short hair looked as though it were trimmed every day. I could see nothing sinister about him. I wondered if the fact that he was not drinking helped to set him off from his guests, for it seemed to me that he grew more correct as the fraternal hilarity increased. When the “Jazz History of the World” was over, girls were putting their heads on men’s shoulders in a puppyish, convivial way, girls were swooning backward playfully into men’s arms, even into groups, knowing that some one would arrest their falls—but no one swooned backward on Gatsby, and no French bob touched Gatsby’s shoulder, and no singing quartets were formed for Gatsby’s head for one link. “I beg your pardon.” Gatsby’s butler was suddenly standing beside us. “Miss Baker?” he inquired. “I beg your pardon, but Mr. Gatsby would like to speak to you alone.” “With me?” she exclaimed in surprise. “Yes, madame.” She got up slowly, raising her eyebrows at me in astonishment, and followed the butler toward the house. I noticed that she wore her evening-dress, all her dresses, like sports clothes—there was a jauntiness about her movements as if she had first learned to walk upon golf courses on clean, crisp mornings. I was alone and it was almost two. For some time confused and intriguing sounds had issued from a long, many-windowed room which overhung the terrace. Eluding Jordan’s undergraduate, who was now engaged in an obstetrical conversation with two chorus girls, and who implored me to join him, I went inside. The large room was full of people. One of the girls in yellow was playing the piano, and beside her stood a tall, red-haired young lady from a famous chorus, engaged in song. She had drunk a quantity of champagne, and during the course of her song she had decided, ineptly, that everything was very, very sad—she was not only singing, she was weeping too. Whenever there was a pause in the song she filled it with gasping, broken sobs, and then took up the lyric again in a quavering soprano. The tears coursed down her cheeks—not freely, however, for when they came into contact with her heavily beaded eyelashes they assumed an inky color, and pursued the rest of their way in slow black rivulets. A humorous suggestion was made that she sing the notes on her face, whereupon she threw up her hands, sank into a chair, and went off into a deep vinous sleep. “She had a fight with a man who says he’s her husband,” explained a girl at my elbow. I looked around. Most of the remaining women were now having fights with men said to be their husbands. Even Jordan’s party, the quartet from East Egg, were rent asunder by dissension. One of the men was talking with curious intensity to a young actress, and his wife, after attempting to laugh at the situation in a dignified and indifferent way, broke down entirely and resorted to flank attacks—at intervals she appeared suddenly at his side like an angry diamond, and hissed: “You promised!” into his ear. The reluctance to go home was not confined to wayward men. The hall was at present occupied by two deplorably sober men and their highly indignant wives. The wives were sympathizing with each other in slightly raised voices. “Whenever he sees I’m having a good time he wants to go home.” “Never heard anything so selfish in my life.” “We're always the first ones to leave.” “So are we.” “Well, we’re almost the last to-night,” said one of the men sheepishly. “The orchestra left half an hour ago.” In spite of the wives’ agreement that such malevolence was beyond credibility, the dispute ended in a short struggle, and both wives were lifted, kicking, into the night. As I waited for my hat in the hall the door of the library opened and Jordan Baker and Gatsby came out together. He was saying some last word to her, but the eagerness in his manner tightened abruptly into formality as several people approached him to say good-by. Jordan’s party were calling impatiently to her from the porch, but she lingered for a moment to shake hands. “I’ve just heard the most amazing thing,” she whispered. “How long were we in there?” “Why, about an hour.” “It was . . . simply amazing,” she repeated abstractedly. “But I swore I wouldn’t tell it and here I am tantalizing you.” She yawned gracefully in my face. “Please come and see me. . . . Phone book. . . . Under the name of Mrs. Sigourney Howard. . . . My aunt. . . .” She was hurrying off as she talked—her brown hand waved a jaunty salute as she melted into her party at the door. Rather ashamed that on my first appearance I had stayed so late, I joined the last of Gatsby’s guests, who were clustered around him. I wanted to explain that I’d hunted for him early in the evening and to apologize for not having known him in the garden. “Don’t mention it,” he enjoined me eagerly. “Don’t give it another thought, old sport.” The familiar expression held no more familiarity than the hand which reassuringly brushed my shoulder. “And don’t forget we’re going up in the hydroplane to-morrow morning, at nine o’clock.” Then the butler, behind his shoulder: “Philadelphia wants you on the ’phone, sir.” “All right, in a minute. Tell them I’ll be right there. . . . Good night.” “Good night.” “Good night.” He smiled—and suddenly there seemed to be a pleasant significance in having been among the last to go, as if he had desired it all the time. “Good night, old sport. . . . Good night.” But as I walked down the steps I saw that the evening was not quite over. Fifty feet from the door a dozen headlights illuminated a bizarre and tumultuous scene. In the ditch beside the road, right side up, but violently shorn of one wheel, rested a new coupé which had left Gatsby’s drive not two minutes before. The sharp jut of a wall accounted for the detachment of the wheel, which was now getting considerable attention from half a dozen curious chauffeurs. However, as they had left their cars blocking the road, a harsh, discordant din from those in the rear had been audible for some time, and added to the already violent confusion of the scene. A man in a long duster had dismounted from the wreck and now stood in the middle of the road, looking from the car to the tire and from the tire to the observers in a pleasant, puzzled way. “See!” he explained. “It went in the ditch.” The fact was infinitely astonishing to him, and I recognized first the unusual quality of wonder, and then the man—it was the late patron of Gatsby’s library. “How’d it happen?” He shrugged his shoulders. “I know nothing whatever about mechanics,” he said decisively. “But how did it happen? Did you run into the wall?” “Don’t ask me,” said Owl Eyes, washing his hands of the whole matter. “I know very little about driving—next to nothing. It happened, and that’s all I know.” “Well, if you’re a poor driver you oughtn’t to try driving at night.” “But I wasn’t even trying,” he explained indignantly, “I wasn’t even trying.” An awed hush fell upon the bystanders. “Do you want to commit suicide?” “You're lucky it was just a wheel! A bad driver and not even trying!” “You don’t understand,” explained the criminal. “I wasn’t driving. There’s another man in the car.” The shock that followed this declaration found voice in a sustained “Ah-h-h!” as the door of the coupé swung slowly open. The crowd—it was now a crowd—stepped back involuntarily, and when the door had opened wide there was a ghostly pause. Then, very gradually, part by part, a pale, dangling individual stepped out of the wreck, pawing tentatively at the ground with a large uncertain dancing shoe. Blinded by the glare of the headlights and confused by the incessant groaning of the horns, the apparition stood swaying for a moment before he perceived the man in the duster. “Wha’s matter?” he inquired calmly. “Did we run outa gas?” “Look!” Half a dozen fingers pointed at the amputated wheel—he stared at it for a moment, and then looked upward as though he suspected that it had dropped from the sky. “It came off,” some one explained. He nodded. “At first I din’ notice we’d stopped.” A pause. Then, taking a long breath and straightening his shoulders, he remarked in a determined voice: “Wonder’ff tell me where there’s a gas’line station?” At least a dozen men, some of them a little better off than he was, explained to him that wheel and car were no longer joined by any physical bond. “Back out,” he suggested after a moment. “Put her in reverse.” “But the wheel’s off!” He hesitated. “No harm in trying,” he said. The caterwauling horns had reached a crescendo and I turned away and cut across the lawn toward home. I glanced back once. A wafer of a moon was shining over Gatsby’s house, making the night fine as before, and surviving the laughter and the sound of his still glowing garden. A sudden emptiness seemed to flow now from the windows and the great doors, endowing with complete isolation the figure of the host, who stood on the porch, his hand up in a formal gesture of farewell. Reading over what I have written so far, I see I have given the impression that the events of three nights several weeks apart were all that absorbed me. On the contrary, they were merely casual events in a crowded summer, and, until much later, they absorbed me infinitely less than my personal affairs. Most of the time I worked. In the early morning the sun threw my shadow westward as I hurried down the white chasms of lower New York to the Probity Trust. I knew the other clerks and young bond-salesmen by their first names, and lunched with them in dark, crowded restaurants on little pig sausages and mashed potatoes and coffee. I even had a short affair with a girl who lived in Jersey City and worked in the accounting department, but her brother began throwing mean looks in my direction, so when she went on her vacation in July I let it blow quietly away. I took dinner usually at the Yale Club—for some reason it was the gloomiest event of my day—and then I went up-stairs to the library and studied investments and securities for a conscientious hour. There were generally a few rioters around, but they never came into the library, so it was a good place to work. After that, if the night was mellow, I strolled down Madison Avenue past the old Murray Hill Hotel, and over 33d Street to the Pennsylvania Station. I began to like New York, the racy, adventurous feel of it at night, and the satisfaction that the constant flicker of men and women and machines gives to the restless eye. I liked to walk up Fifth Avenue and pick out romantic women from the crowd and imagine that in a few minutes I was going to enter into their lives, and no one would ever know or disapprove. Sometimes, in my mind, I followed them to their apartments on the corners of hidden streets, and they turned and smiled back at me before they faded through a door into warm darkness. At the enchanted metropolitan twilight I felt a haunting loneliness sometimes, and felt it in others—poor young clerks who loitered in front of windows waiting until it was time for a solitary restaurant dinner—young clerks in the dusk, wasting the most poignant moments of night and life. Again at eight o’clock, when the dark lanes of the Forties were lined five deep with throbbing taxicabs, bound for the theatre district, I felt a sinking in my heart. Forms leaned together in the taxis as they waited, and voices sang, and there was laughter from unheard jokes, and lighted cigarettes made unintelligible circles inside. Imagining that I, too, was hurrying toward gayety and sharing their intimate excitement, I wished them well. For a while I lost sight of Jordan Baker, and then in midsummer I found her again. At first I was flattered to go places with her, because she was a golf champion, and every one knew her name. Then it was something more. I wasn’t actually in love, but I felt a sort of tender curiosity. The bored haughty face that she turned to the world concealed something—most affectations conceal something eventually, even though they don’t in the beginning—and one day I found what it was. When we were on a house-party together up in Warwick, she left a borrowed car out in the rain with the top down, and then lied about it—and suddenly I remembered the story about her that had eluded me that night at Daisy’s. At her first big golf tournament there was a row that nearly reached the newspapers—a suggestion that she had moved her ball from a bad lie in the semi-final round. The thing approached the proportions of a scandal—then died away. A caddy retracted his statement, and the only other witness admitted that he might have been mistaken. The incident and the name had remained together in my mind. Jordan Baker instinctively avoided clever, shrewd men, and now I saw that this was because she felt safer on a plane where any divergence from a code would be thought impossible. She was incurably dishonest. She wasn’t able to endure being at a disadvantage and, given this unwillingness, I suppose she had begun dealing in subterfuges when she was very young in order to keep that cool, insolent smile turned to the world and yet satisfy the demands of her hard, jaunty body. It made no difference to me. Dishonesty in a woman is a thing you never blame deeply—I was casually sorry, and then I forgot. It was on that same house party that we had a curious conversation about driving a car. It started because she passed so close to some workmen that our fender flicked a button on one man’s coat. “You’re a rotten driver,” I protested. “Either you ought to be more careful, or you oughtn’t to drive at all.” “I am careful.” “No, you’re not.” “Well, other people are,” she said lightly. “What’s that got to do with it?” “They’ll keep out of my way,” she insisted. “It takes two to make an accident.” “Suppose you met somebody just as careless as yourself.” “I hope I never will,” she answered. “I hate careless people. That’s why I like you.” Her gray, sun-strained eyes stared straight ahead, but she had deliberately shifted our relations, and for a moment I thought I loved her. But I am slow-thinking and full of interior rules that act as brakes on my desires, and I knew that first I had to get myself definitely out of that tangle back home. I'd been writing letters once a week and signing them: “Love, Nick,” and all I could think of was how, when that certain girl played tennis, a faint mustache of perspiration appeared on her upper lip. Nevertheless there was a vague understanding that had to be tactfully broken off before I was free. Every one suspects himself of at least one of the cardinal virtues, and this is mine: I am one of the few honest people that I have ever known. ## CHAPTER IV On Sunday morning while church bells rang in the villages alongshore, the world and its mistress returned to Gatsby’s house and twinkled hilariously on his lawn. “He’s a bootlegger,” said the young ladies, moving somewhere between his cocktails and his flowers. “One time he killed a man who had found out that he was nephew to Von Hindenburg and second cousin to the devil. Reach me a rose, honey, and pour me a last drop into that there crystal glass.” Once I wrote down on the empty spaces of a timetable the names of those who came to Gatsby’s house that summer. It is an old time-table now, disintegrating at its folds, and headed “This schedule in effect July 5th, 1922.” But I can still read the gray names, and they will give you a better impression than my generalities of those who accepted Gatsby’s hospitality and paid him the subtle tribute of knowing nothing whatever about him. From East Egg, then, came the Chester Beckers and the Leeches, and a man named Bunsen, whom I knew at Yale, and Doctor Webster Civet, who was drowned last summer up in Maine. And the Hornbeams and the Willie Voltaires, and a whole clan named Blackbuck, who always gathered in a corner and flipped up their noses like goats at whosoever came near. And the Ismays and the Chrysties (or rather Hubert Auerbach and Mr. Chrystie’s wife), and Edgar Beaver, whose hair, they say, turned cotton-white one winter afternoon for no good reason at all. Clarence Endive was from East Egg, as I remember. He came only once, in white knickerbockers, and had a fight with a bum named Etty in the garden. From farther out on the Island came the Cheadles and the O. R. P. Schraeders, and the Stonewall Jackson Abrams of Georgia, and the Fishguards and the Ripley Snells. Snell was there three days before he went to the penitentiary, so drunk out on the gravel drive that Mrs. Ulysses Swett’s automobile ran over his right hand. The Dancies came, too, and S. B. Whitebait, who was well over sixty, and Maurice A. Flink, and the Hammerheads, and Beluga the tobacco importer, and Beluga’s girls. From West Egg came the Poles and the Mulreadys and Cecil Roebuck and Cecil Schoen and Gulick the State senator and Newton Orchid, who controlled Films Par Excellence, and Eckhaust and Clyde Cohen and Don S. Schwartze (the son) and Arthur McCarty, all connected with the movies in one way or another. And the Catlips and the Bembergs and G. Earl Muldoon, brother to that Muldoon who afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros and James B. (“Rot-Gut”) Ferret and the De Jongs and Ernest Lilly—they came to gamble, and when Ferret wandered into the garden it meant he was cleaned out and Associated Traction would have to fluctuate profitably next day. A man named Klipspringer was there so often and so long that he became known as “the boarder”—I doubt if he had any other home. Of theatrical people there were Gus Waize and Horace O’Donavan and Lester Myer and George Duckweed and Francis Bull. Also from New York were the Chromes and the Backhyssons and the Dennickers and Russel Betty and the Corrigans and the Kellehers and the Dewars and the Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, and Henry L. Palmetto, who killed himself by jumping in front of a subway train in Times Square. Benny McClenahan arrived always with four girls. They were never quite the same ones in physical person, but they were so identical one with another that it inevitably seemed they had been there before. I have forgotten their names—Jaqueline, I think, or else Consuela, or Gloria or Judy or June, and their last names were either the melodious names of flowers and months or the sterner ones of the great American capitalists whose cousins, if pressed, they would confess themselves to be. In addition to all these I can remember that Faustina O’Brien came there at least once and the Baedeker girls and young Brewer, who had his nose shot off in the war, and Mr. Albrucksburger and Miss Haag, his fiancée, and Ardita Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss Claudia Hip, with a man reputed to be her chauffeur, and a prince of something, whom we called Duke, and whose name, if I ever knew it, I have forgotten. All these people came to Gatsby’s house in the summer. At nine o’clock, one morning late in July, Gatsby’s gorgeous car lurched up the rocky drive to my door and gave out a burst of melody from its three-noted horn. It was the first time he had called on me, though I had gone to two of his parties, mounted in his hydroplane, and, at his urgent invitation, made frequent use of his beach. “Good morning, old sport. You’re having lunch with me to-day and I thought we’d ride up together.” He was balancing himself on the dashboard of his car with that resourcefulness of movement that is so peculiarly American—that comes, I suppose, with the absence of lifting work in youth and, even more, with the formless grace of our nervous, sporadic games. This quality was continually breaking through his punctilious manner in the shape of restlessness. He was never quite still; there was always a tapping foot somewhere or the impatient opening and closing of a hand. He saw me looking with admiration at his car. “It’s pretty, isn’t it, old sport?” He jumped off to give me a better view. “Haven’t you ever seen it before?” I’d seen it. Everybody had seen it. It was a rich cream color, bright with nickel, swollen here and there in its monstrous length with triumphant hat-boxes and supper-boxes and tool-boxes, and terraced with a labyrinth of wind-shields that mirrored a dozen suns. Sitting down behind many layers of glass in a sort of green leather conservatory, we started to town. I had talked with him perhaps half a dozen times in the past month and found, to my disappointment, that he had little to say. So my first impression, that he was a person of some undefined consequence, had gradually faded and he had become simply the proprietor of an elaborate road-house next door. And then came that disconcerting ride. We hadn’t reached West Egg Village before Gatsby began leaving his elegant sentences unfinished and slapping himself indecisively on the knee of his caramel-colored suit. “Look here, old sport,” he broke out surprisingly, “what’s your opinion of me, anyhow?” A little overwhelmed, I began the generalized evasions which that question deserves. “Well, I’m going to tell you something about my life,” he interrupted. “I don’t want you to get a wrong idea of me from all these stories you hear.” So he was aware of the bizarre accusations that flavored conversation in his halls. “I’ll tell you God’s truth.” His right hand suddenly ordered divine retribution to stand by. “I am the son of some wealthy people in the Middle West—all dead now. I was brought up in America but educated at Oxford, because all my ancestors have been educated there for many years. It is a family tradition.” He looked at me sideways—and I knew why Jordan Baker had believed he was lying. He hurried the phrase “educated at Oxford,” or swallowed it, or choked on it, as though it had bothered him before. And with this doubt, his whole statement fell to pieces, and I wondered if there wasn’t something a little sinister about him, after all. “What part of the Middle West?” I inquired casually. “San Francisco.” “I see.” “My family all died and I came into a good deal of money.” His voice was solemn, as if the memory of that sudden extinction of a clan still haunted him. For a moment I suspected that he was pulling my leg, but a glance at him convinced me otherwise. “After that I lived like a young rajah in all the capitals of Europe—Paris, Venice, Rome—collecting jewels, chiefly rubies, hunting big game, painting a little, things for myself only, and trying to forget something very sad that had happened to me long ago.” With an effort I managed to restrain my incredulous laughter. The very phrases were worn so threadbare that they evoked no image except that of a turbaned “character” leaking sawdust at every pore as he pursued a tiger through the Bois de Boulogne. “Then came the war, old sport. It was a great relief, and I tried very hard to die, but I seemed to bear an enchanted life. I accepted a commission as first lieutenant when it began. In the Argonne Forest I took the remains of my machine-gun battalion so far forward that there was a half mile gap on either side of us where the infantry couldn’t advance. We stayed there two days and two nights, a hundred and thirty men with sixteen Lewis guns, and when the infantry came up at last they found the insignia of three German divisions among the piles of dead. I was promoted to be a major, and every Allied government gave me a decoration—even Montenegro, little Montenegro down on the Adriatic Sea!” Little Montenegro! He lifted up the words and nodded at them—with his smile. The smile comprehended Montenegro’s troubled history and sympathized with the brave struggles of the Montenegrin people. It appreciated fully the chain of national circumstances which had elicited this tribute from Montenegro’s warm little heart. My incredulity was submerged in fascination now; it was like skimming hastily through a dozen magazines. He reached in his pocket, and a piece of metal, slung on a ribbon, fell into my palm. “That’s the one from Montenegro.” To my astonishment, the thing had an authentic look. “Orderi di Danilo,” ran the circular legend, “Montenegro, Nicolas Rex.” “Turn it.” “Major Jay Gatsby,” I read, “For Valour Extraordinary.” “Here’s another thing I always carry. A souvenir of Oxford days. It was taken in Trinity Quad—the man on my left is now the Earl of Doncaster.” It was a photograph of half a dozen young men in blazers loafing in an archway through which were visible a host of spires. There was Gatsby, looking a little, not much, younger—with a cricket bat in his hand. Then it was all true. I saw the skins of tigers flaming in his palace on the Grand Canal; I saw him opening a chest of rubies to ease, with their crimson-lighted depths, the gnawings of his broken heart. “I’m going to make a big request of you to-day,” he said, pocketing his souvenirs with satisfaction, “so I thought you ought to know something about me. I didn’t want you to think I was just some nobody. You see, I usually find myself among strangers because I drift here and there trying to forget the sad thing that happened to me.” He hesitated. “You’ll hear about it this afternoon.” “At lunch?” “No, this afternoon. I happened to find out that you’re taking Miss Baker to tea.” “Do you mean you’re in love with Miss Baker?” “No, old sport, I’m not. But Miss Baker has kindly consented to speak to you about this matter.” I hadn’t the faintest idea what “this matter” was, but I was more annoyed than interested. I hadn’t asked Jordan to tea in order to discuss Mr. Jay Gatsby. I was sure the request would be something utterly fantastic, and for a moment I was sorry I’d ever set foot upon his overpopulated lawn. He wouldn’t say another word. His correctness grew on him as we neared the city. We passed Port Roosevelt, where there was a glimpse of red-belted ocean-going ships, and sped along a cobbled slum lined with the dark, undeserted saloons of the faded-gilt nineteen-hundreds. Then the valley of ashes opened out on both sides of us, and I had a glimpse of Mrs. Wilson straining at the garage pump with panting vitality as we went by. With fenders spread like wings we scattered light through half Astoria—only half, for as we twisted among the pillars of the elevated I heard the familiar “jug-jug-spat!” of a motorcycle, and a frantic policeman rode alongside. “All right, old sport,” called Gatsby. We slowed down. Taking a white card from his wallet, he waved it before the man’s eyes. “Right you are,” agreed the policeman, tipping his cap. “Know you next time, Mr. Gatsby. Excuse me!” “What was that?” I inquired. “The picture of Oxford?” “I was able to do the commissioner a favor once, and he sends me a Christmas card every year.” Over the great bridge, with the sunlight through the girders making a constant flicker upon the moving cars, with the city rising up across the river in white heaps and sugar lumps all built with a wish out of non-olfactory money. The city seen from the Queensboro Bridge is always the city seen for the first time, in its first wild promise of all the mystery and the beauty in the world. A dead man passed us in a hearse heaped with blooms, followed by two carriages with drawn blinds, and by more cheerful carriages for friends. The friends looked out at us with the tragic eyes and short upper lips of southeastern Europe, and I was glad that the sight of Gatsby’s splendid car was included in their sombre holiday. As we crossed Blackwell’s Island a limousine passed us, driven by a white chauffeur, in which sat three modish negroes, two bucks and a girl. I laughed aloud as the yolks of their eyeballs rolled toward us in haughty rivalry. “Anything can happen now that we’ve slid over this bridge,” I thought; “anything at all. . . .” Even Gatsby could happen, without any particular wonder. Roaring noon. In a well-fanned Forty-second Street cellar I met Gatsby for lunch. Blinking away the brightness of the street outside, my eyes picked him out obscurely in the anteroom, talking to another man. “Mr. Carraway, this is my friend Mr. Wolfshiem.” A small, flat-nosed Jew raised his large head and regarded me with two fine growths of hair which luxuriated in either nostril. After a moment I discovered his tiny eyes in the half-darkness. “So I took one look at him,” said Mr. Wolfshiem, shaking my hand earnestly, “and what do you think I did?” “What?” I inquired politely. But evidently he was not addressing me, for he dropped my hand and covered Gatsby with his expressive nose. “I handed the money to Katspaugh and I sid: ‘All right, Katspaugh, don’t pay him a penny till he shuts his mouth.’ He shut it then and there.” Gatsby took an arm of each of us and moved forward into the restaurant, whereupon Mr. Wolfshiem swallowed a new sentence he was starting and lapsed into a somnambulatory abstraction. “Highballs?” asked the head waiter. “This is a nice restaurant here,” said Mr. Wolfshiem, looking at the Presbyterian nymphs on the ceiling. “But I like across the street better!” “Yes, highballs,” agreed Gatsby, and then to Mr. Wolfshiem: “It’s too hot over there.” “Hot and small—yes,” said Mr. Wolfshiem, “but full of memories.” “What place is that?” I asked. “The old Metropole.” “The old Metropole,” brooded Mr. Wolfshiem gloomily. “Filled with faces dead and gone. Filled with friends gone now forever. I can’t forget so long as I live the night they shot Rosy Rosenthal there. It was six of us at the table, and Rosy had eat and drunk a lot all evening. When it was almost morning the waiter came up to him with a funny look and says somebody wants to speak to him outside. ‘All right,’ says Rosy, and begins to get up, and I pulled him down in his chair. “‘Let the bastards come in here if they want you, Rosy, but don’t you, so help me, move outside this room.’ “It was four o’clock in the morning then, and if we’d of raised the blinds we’d of seen daylight.” “Did he go?” I asked innocently. “Sure he went.” Mr. Wolfshiem’s nose flashed at me indignantly. “He turned around in the door and says: ‘Don’t let that waiter take away my coffee!’ Then he went out on the sidewalk, and they shot him three times in his full belly and drove away.” “Four of them were electrocuted,” I said, remembering. “Five, with Becker.” His nostrils turned to me in an interested way. “I understand you’re looking for a business gonnegtion.” The juxtaposition of these two remarks was startling. Gatsby answered for me: “Oh, no,” he exclaimed, ‘‘this isn’t the man.” “No?” Mr. Wolfshiem seemed disappointed. “This is just a friend. I told you we’d talk about that some other time.” “I beg your pardon,” said Mr. Wolfshiem, “I had a wrong man.” A succulent hash arrived, and Mr. Wolfshiem, forgetting the more sentimental atmosphere of the old Metropole, began to eat with ferocious delicacy. His eyes, meanwhile, roved very slowly all around the room—he completed the arc by turning to inspect the people directly behind. I think that, except for my presence, he would have taken one short glance beneath our own table. “Look here, old sport,” said Gatsby, leaning toward me, “I’m afraid I made you a little angry this morning in the car.” There was the smile again, but this time I held out against it. “I don’t like mysteries,” I answered, “and I don’t understand why you won’t come out frankly and tell me what you want. Why has it all got to come through Miss Baker?” “Oh, it’s nothing underhand,” he assured me. “Miss Baker’s a great sportswoman, you know, and she’d never do anything that wasn’t all right.” Suddenly he looked at his watch, jumped up, and hurried from the room, leaving me with Mr. Wolfshiem at the table. “He has to telephone,” said Mr. Wolfshiem, following him with his eyes. “Fine fellow, isn’t he? Handsome to look at and a perfect gentleman.” “Yes.” “He’s an Oggsford man.” “Oh!” “He went to Oggsford College in England. You know Oggsford College?” “I’ve heard of it.” “It’s one of the most famous colleges in the world.” “Have you known Gatsby for a long time?” I inquired. “Several years,” he answered in a gratified way. “I made the pleasure of his acquaintance just after the war. But I knew I had discovered a man of fine breeding after I talked with him an hour. I said to myself: ‘There’s the kind of man you’d like to take home and introduce to your mother and sister.’” He paused. “I see you’re looking at my cuff buttons.” I hadn’t been looking at them, but I did now. They were composed of oddly familiar pieces of ivory. “Finest specimens of human molars,” he informed me. “Well!” I inspected them. “That’s a very interesting idea.” “Yeah.” He flipped his sleeves up under his coat. “Yeah, Gatsby’s very careful about women. He would never so much as look at a friend’s wife.” When the subject of this instinctive trust returned to the table and sat down Mr. Wolfshiem drank his coffee with a jerk and got to his feet. “I have enjoyed my lunch,” he said, “and I’m going to run off from you two young men before I outstay my welcome.” “Don’t hurry, Meyer,” said Gatsby, without enthusiasm. Mr. Wolfshiem raised his hand in a sort of benediction. “You’re very polite, but I belong to another generation,” he announced solemnly. “You sit here and discuss your sports and your young ladies and your—” He supplied an imaginary noun with another wave of his hand. “As for me, I am fifty years old, and I won’t impose myself on you any longer.” As he shook hands and turned away his tragic nose was trembling. I wondered if I had said anything to offend him. “He becomes very sentimental sometimes,” explained Gatsby. “This is one of his sentimental days. He’s quite a character around New York—a denizen of Broadway.” “Who is he, anyhow, an actor?” “No.” “A dentist?” “Meyer Wolfshiem? No, he’s a gambler.” Gatsby hesitated, then added coolly: “He’s the man who fixed the World’s Series back in 1919.” “Fixed the World’s Series?” I repeated. The idea staggered me. I remembered, of course, that the World’s Series had been fixed in 1919, but if I had thought of it at all I would have thought of it as a thing that merely happened, the end of some inevitable chain. It never occurred to me that one man could start to play with the faith of fifty million people—with the single-mindedness of a burglar blowing a safe. “How did he happen to do that?” I asked after a minute. “He just saw the opportunity.” “Why isn’t he in jail?” “They can’t get him, old sport. He’s a smart man.” I insisted on paying the check. As the waiter brought my change I caught sight of Tom Buchanan across the crowded room. “Come along with me for a minute,” I said; “I’ve got to say hello to some one.” When he saw us Tom jumped up and took half a dozen steps in our direction. “Where’ve you been?” he demanded eagerly. “Daisy’s furious because you haven’t called up.” “This is Mr. Gatsby, Mr. Buchanan.” They shook hands briefly, and a strained, unfamiliar look of embarrassment came over Gatsby’s face. “How’ve you been, anyhow?” demanded Tom of me. “How’d you happen to come up this far to eat?” “I’ve been having lunch with Mr. Gatsby.” I turned toward Mr. Gatsby, but he was no longer there. One October day in nineteen-seventeen— (said Jordan Baker that afternoon, sitting up very straight on a straight chair in the tea-garden at the Plaza Hotel) —I was walking along from one place to another, half on the sidewalks and half on the lawns. I was happier on the lawns because I had on shoes from England with rubber nobs on the soles that bit into the soft ground. I had on a new plaid skirt also that blew a little in the wind, and whenever this happened the red, white, and blue banners in front of all the houses stretched out stiff and said tut-tut-tut-tut, in a disapproving way. The largest of the banners and the largest of the lawns belonged to Daisy Fay’s house. She was just eighteen, two years older than me, and by far the most popular of all the young girls in Louisville. She dressed in white, and had a little white roadster, and all day long the telephone rang in her house and excited young officers from Camp Taylor demanded the privilege of monopolizing her that night. “Anyways, for an hour!” When I came opposite her house that morning her white roadster was beside the curb, and she was sitting in it with a lieutenant I had never seen before. They were so engrossed in each other that she didn’t see me until I was five feet away. “Hello, Jordan,” she called unexpectedly. “Please come here.” I was flattered that she wanted to speak to me, because of all the older girls I admired her most. She asked me if I was going to the Red Cross and make bandages. I was. Well, then, would I tell them that she couldn’t come that day? The officer looked at Daisy while she was speaking, in a way that every young girl wants to be looked at sometime, and because it seemed romantic to me I have remembered the incident ever since. His name was Jay Gatsby, and I didn’t lay eyes on him again for over four years—even after I'd met him on Long Island I didn’t realize it was the same man. That was nineteen-seventeen. By the next year I had a few beaux myself, and I began to play in tournaments, so I didn’t see Daisy very often. She went with a slightly older crowd—when she went with anyone at all. Wild rumors were circulating about her—how her mother had found her packing her bag one winter night to go to New York and say good-by to a soldier who was going overseas. She was effectually prevented, but she wasn’t on speaking terms with her family for several weeks. After that she didn’t play around with the soldiers any more, but only with a few flat-footed, shortsighted young men in town, who couldn’t get into the army at all. By the next autumn she was gay again, gay as ever. She had a début after the armistice, and in February she was presumably engaged to a man from New Orleans. In June she married Tom Buchanan of Chicago, with more pomp and circumstance than Louisville ever knew before. He came down with a hundred people in four private cars, and hired a whole floor of the Muhlbach Hotel, and the day before the wedding he gave her a string of pearls valued at three hundred and fifty thousand dollars. I was a bridesmaid. I came into her room half an hour before the bridal dinner, and found her lying on her bed as lovely as the June night in her flowered dress—and as drunk as a monkey. She had a bottle of Sauterne in one hand and a letter in the other. “’Gratulate me,” she muttered. “Never had a drink before, but oh how I do enjoy it.” “What’s the matter, Daisy?” I was scared, I can tell you; I’d never seen a girl like that before. “Here, deares’.” She groped around in a wastebasket she had with her on the bed and pulled out the string of pearls. ‘Take ’em down-stairs and give ’em back to whoever they belong to. Tell ’em all Daisy’s change’ her mine. Say: ‘Daisy’s change’ her mine!’” She began to cry—she cried and cried. I rushed out and found her mother’s maid, and we locked the door and got her into a cold bath. She wouldn’t let go of the letter. She took it into the tub with her and squeezed it up into a wet ball, and only let me leave it in the soap-dish when she saw that it was coming to pieces like snow. But she didn’t say another word. We gave her spirits of ammonia and put ice on her forehead and hooked her back into her dress, and half an hour later, when we walked out of the room, the pearls were around her neck and the incident was over. Next day at five o’clock she married Tom Buchanan without so much as a shiver, and started off on a three months’ trip to the South Seas. I saw them in Santa Barbara when they came back, and I thought I’d never seen a girl so mad about her husband. If he left the room for a minute she’d look around uneasily, and say: ‘‘Where’s Tom gone?” and wear the most abstracted expression until she saw him coming in the door. She used to sit on the sand with his head in her lap by the hour, rubbing her fingers over his eyes and looking at him with unfathomable delight. It was touching to see them together—it made you laugh in a hushed, fascinated way. That was in August. A week after I left Santa Barbara Tom ran into a wagon on the Ventura road one night, and ripped a front wheel off his car. The girl who was with him got into the papers, too, because her arm was broken—she was one of the chambermaids in the Santa Barbara Hotel. The next April Daisy had her little girl, and they went to France for a year. I saw them one spring in Cannes, and later in Deauville, and then they came back to Chicago to settle down. Daisy was popular in Chicago, as you know. They moved with a fast crowd, all of them young and rich and wild, but she came out with an absolutely perfect reputation. Perhaps because she doesn’t drink. It’s a great advantage not to drink among hard-drinking people. You can hold your tongue, and, moreover, you can time any little irregularity of your own so that everybody else is so blind that they don’t see or care. Perhaps Daisy never went in for amour at all—and yet there’s something in that voice of hers. . . . Well, about six weeks ago, she heard the name Gatsby for the first time in years. It was when I asked you—do you remember?—if you knew Gatsby in West Egg. After you had gone home she came into my room and woke me up, and said: “What Gatsby?” and when I described him—I was half asleep—she said in the strangest voice that it must be the man she used to know. It wasn’t until then that I connected this Gatsby with the officer in her white car. When Jordan Baker had finished telling all this we had left the Plaza for half an hour and were driving in a victoria through Central Park. The sun had gone down behind the tall apartments of the movie stars in the West Fifties, and the clear voices of children, already gathered like crickets on the grass, rose through the hot twilight: > “I’m the Sheik of Araby. Your love belongs to me. At night when you’re asleep > Into your tent I’ll creep—” “It was a strange coincidence,” I said. “But it wasn’t a coincidence at all.” “Why not?” “Gatsby bought that house so that Daisy would be just across the bay.” Then it had not been merely the stars to which he had aspired on that June night. He came alive to me, delivered suddenly from the womb of his purposeless splendor. “He wants to know,” continued Jordan, “if you'll invite Daisy to your house some afternoon and then let him come over.” The modesty of the demand shook me. He had waited five years and bought a mansion where he dispensed starlight to casual moths—so that he could “come over” some afternoon to a stranger’s garden. “Did I have to know all this before he could ask such a little thing?” “He’s afraid, he’s waited so long. He thought you might be offended. You see, he’s regular tough underneath it all.” Something worried me. “Why didn’t he ask you to arrange a meeting?” “He wants her to see his house,” she explained. “And your house is right next door.” “Oh!” “I think he half expected her to wander into one of his parties, some night,” went on Jordan, “but she never did. Then he began asking people casually if they knew her, and I was the first one he found. It was that night he sent for me at his dance, and you should have heard the elaborate way he worked up to it. Of course, I immediately suggested a luncheon in New York—and I thought he’d go mad: “‘I don’t want to do anything out of the way!’ he kept saying. ‘I want to see her right next door.’ “When I said you were a particular friend of Tom’s, he started to abandon the whole idea. He doesn’t know very much about Tom, though he says he’s read a Chicago paper for years just on the chance of catching a glimpse of Daisy’s name.” It was dark now, and as we dipped under a little bridge I put my arm around Jordan’s golden shoulder and drew her toward me and asked her to dinner. Suddenly I wasn’t thinking of Daisy and Gatsby any more, but of this clean, hard, limited person, who dealt in universal scepticism, and who leaned back jauntily just within the circle of my arm. A phrase began to beat in my ears with a sort of heady excitement: ‘‘There are only the pursued, the pursuing, the busy and the tired.” “And Daisy ought to have something in her life,” murmured Jordan to me. “Does she want to see Gatsby?” “She’s not to know about it. Gatsby doesn’t want her to know. You’re just supposed to invite her to tea.” We passed a barrier of dark trees, and then the façade of Fifty-ninth Street, a block of delicate pale light, beamed down into the park. Unlike Gatsby and Tom Buchanan, I had no girl whose disembodied face floated along the dark cornices and blinding signs, and so I drew up the girl beside me, tightening my arms. Her wan, scornful mouth smiled, and so I drew her up again closer, this time to my face. ## CHAPTER V When I came home to West Egg that night I was afraid for a moment that my house was on fire. Two o’clock and the whole corner of the peninsula was blazing with light, which fell unreal on the shrubbery and made thin elongating glints upon the roadside wires. Turning a corner, I saw that it was Gatsby’s house, lit from tower to cellar. At first I thought it was another party, a wild rout that had resolved itself into “hide-and-go-seek” or “sardines-in-the-box” with all the house thrown open to the game. But there wasn’t a sound. Only wind in the trees, which blew the wires and made the lights go off and on again as if the house had winked into the darkness. As my taxi groaned away I saw Gatsby walking toward me across his lawn. “Your place looks like the World’s Fair,” I said. “Does it?” He turned his eyes toward it absently. “I have been glancing into some of the rooms. Let’s go to Coney Island, old sport. In my car.” “It’s too late.” “Well, suppose we take a plunge in the swimming-pool? I haven’t made use of it all summer.” “I’ve got to go to bed.” “All right.” He waited, looking at me with suppressed eagerness. “I talked with Miss Baker,” I said after a moment. “I’m going to call up Daisy to-morrow and invite her over here to tea.” “Oh, that’s all right,” he said carelessly. “I don’t want to put you to any trouble.” “What day would suit you?” “What day would suit you?” he corrected me quickly. “I don’t want to put you to any trouble, you see.” “How about the day after to-morrow?” He considered for a moment. Then, with reluctance: “I want to get the grass cut,” he said. We both looked down at the grass—there was a sharp line where my ragged lawn ended and the darker, well-kept expanse of his began. I suspected that he meant my grass. “There’s another little thing,” he said uncertainly, and hesitated. “Would you rather put it off for a few days?” I asked. “Oh, it isn’t about that. At least—’’ He fumbled with a series of beginnings. “Why, I thought—why, look here, old sport, you don’t make much money, do you?” “Not very much.” This seemed to reassure him and he continued more confidently. “I thought you didn’t, if you'll pardon my—you see, I carry on a little business on the side, a sort of side line, you understand. And I thought that if you don’t make very much— You’re selling bonds, aren’t you, old sport?” “Trying to.” “Well, this would interest you. It wouldn’t take up much of your time and you might pick up a nice bit of money. It happens to be a rather confidential sort of thing.” I realize now that under different circumstances that conversation might have been one of the crises of my life. But, because the offer was obviously and tactlessly for a service to be rendered, I had no choice except to cut him off there. “I’ve got my hands full,” I said. “I’m much obliged but I couldn’t take on any more work.” “You wouldn’t have to do any business with Wolfshiem.” Evidently he thought that I was shying away from the “gonnegtion” mentioned at lunch, but I assured him he was wrong. He waited a moment longer, hoping I’d begin a conversation, but I was too absorbed to be responsive, so he went unwillingly home. The evening had made me light-headed and happy; I think I walked into a deep sleep as I entered my front door. So I don’t know whether or not Gatsby went to Coney Island, or for how many hours he “glanced into rooms” while his house blazed gaudily on. I called up Daisy from the office next morning, and invited her to come to tea. “Don’t bring Tom,” I warned her. “What?” “Don’t bring Tom.” “Who is ‘Tom’?” she asked innocently. The day agreed upon was pouring rain. At eleven o’clock a man in a raincoat, dragging a lawn-mower, tapped at my front door and said that Mr. Gatsby had sent him over to cut my grass. This reminded me that I had forgotten to tell my Finn to come back, so I drove into West Egg Village to search for her among soggy whitewashed alleys and to buy some cups and lemons and flowers. The flowers were unnecessary, for at two o’clock a greenhouse arrived from Gatsby’s, with innumerable receptacles to contain it. An hour later the front door opened nervously, and Gatsby, in a white flannel suit, silver shirt, and gold-colored tie, hurried in. He was pale, and there were dark signs of sleeplessness beneath his eyes. “Is everything all right?” he asked immediately. “The grass looks fine, if that’s what you mean.” “What grass?” he inquired blankly. “Oh, the grass in the yard.” He looked out the window at it, but, judging from his expression, I don’t believe he saw a thing. “Looks very good,” he remarked vaguely. “One of the papers said they thought the rain would stop about four. I think it was The Journal. Have you got everything you need in the shape of—of tea?” I took him into the pantry, where he looked a little reproachfully at the Finn. Together we scrutinized the twelve lemon cakes from the delicatessen shop. “Will they do?” I asked. “Of course, of course! They’re fine!” and he added hollowly, “. . . old sport.” The rain cooled about half-past three to a damp mist, through which occasional thin drops swam like dew. Gatsby looked with vacant eyes through a copy of Clay’s “Economics,” starting at the Finnish tread that shook the kitchen floor, and peering toward the bleared windows from time to time as if a series of invisible but alarming happenings were taking place outside. Finally he got up and informed me, in an uncertain voice, that he was going home. “Why’s that?” “Nobody’s coming to tea. It’s too late!” He looked at his watch as if there was some pressing demand on his time elsewhere. “I can’t wait all day.” “Don’t be silly; it’s just two minutes to four.” He sat down miserably, as if I had pushed him, and simultaneously there was the sound of a motor turning into my lane. We both jumped up, and, a little harrowed myself, I went out into the yard. Under the dripping bare lilac-trees a large open car was coming up the drive. It stopped. Daisy’s face, tipped sideways beneath a three-cornered lavender hat, looked out at me with a bright ecstatic smile. “Is this absolutely where you live, my dearest one?” The exhilarating ripple of her voice was a wild tonic in the rain. I had to follow the sound of it for a moment, up and down, with my ear alone, before any words came through. A damp streak of hair lay like a dash of blue paint across her cheek, and her hand was wet with glistening drops as I took it to help her from the car. “Are you in love with me,” she said low in my ear, “or why did I have to come alone?” “That’s the secret of Castle Rackrent. Tell your chauffeur to go far away and spend an hour.” “Come back in an hour, Ferdie.” Then in a grave murmur: “His name is Ferdie.” “Does the gasoline affect his nose?” “I don’t think so,” she said innocently. “Why?” We went in. To my overwhelming surprise the living-room was deserted. “Well, that’s funny,” I exclaimed. “What’s funny?” She turned her head as there was a light dignified knocking at the front door. I went out and opened it. Gatsby, pale as death, with his hands plunged like weights in his coat pockets, was standing in a puddle of water glaring tragically into my eyes. With his hands still in his coat pockets he stalked by me into the hall, turned sharply as if he were on a wire, and disappeared into the living-room. It wasn’t a bit funny. Aware of the loud beating of my own heart I pulled the door to against the increasing rain. For half a minute there wasn’t a sound. Then from the living-room I heard a sort of choking murmur and part of a laugh, followed by Daisy’s voice on a clear artificial note: “I certainly am awfully glad to see you again.” A pause; it endured horribly. I had nothing to do in the hall, so I went into the room. Gatsby, his hands still in his pockets, was reclining against the mantelpiece in a strained counterfeit of perfect ease, even of boredom. His head leaned back so far that it rested against the face of a defunct mantelpiece clock, and from this position his distraught eyes stared down at Daisy, who was sitting, frightened but graceful, on the edge of a stiff chair. “We've met before,” muttered Gatsby. His eyes glanced momentarily at me, and his lips parted with an abortive attempt at a laugh. Luckily the clock took this moment to tilt dangerously at the pressure of his head, whereupon he turned and caught it with trembling fingers, and set it back in place. Then he sat down, rigidly, his elbow on the arm of the sofa and his chin in his hand. “I’m sorry about the clock,” he said. My own face had now assumed a deep tropical burn. I couldn’t muster up a single commonplace out of the thousand in my head. “It’s an old clock,” I told them idiotically. I think we all believed for a moment that it had smashed in pieces on the floor. “We haven’t met for many years,” said Daisy, her voice as matter-of-fact as it could ever be. “Five years next November.” The automatic quality of Gatsby’s answer set us all back at least another minute. I had them both on their feet with the desperate suggestion that they help me make tea in the kitchen when the demoniac Finn brought it in on a tray. Amid the welcome confusion of cups and cakes a certain physical decency established itself. Gatsby got himself into a shadow and, while Daisy and I talked, looked conscientiously from one to the other of us with tense, unhappy eyes. However, as calmness wasn’t an end in itself, I made an excuse at the first possible moment, and got to my feet. “Where are you going?” demanded Gatsby in immediate alarm. “I’ll be back.” “I’ve got to speak to you about something before you go.” He followed me wildly into the kitchen, closed the door, and whispered: “Oh, God!” in a miserable way. “What’s the matter?” “This is a terrible mistake,” he said, shaking his head from side to side, ‘‘a terrible, terrible mistake.” “You’re just embarrassed, that’s all,” and luckily I added: “Daisy’s embarrassed too.” “She’s embarrassed?” he repeated incredulously. “Just as much as you are.” “Don’t talk so loud.” “You're acting like a little boy,” I broke out impatiently. “Not only that, but you’re rude. Daisy’s sitting in there all alone.” He raised his hand to stop my words, looked at me with unforgettable reproach, and, opening the door cautiously, went back into the other room. I walked out the back way—just as Gatsby had when he had made his nervous circuit of the house half an hour before—and ran for a huge black knotted tree, whose massed leaves made a fabric against the rain. Once more it was pouring, and my irregular lawn, well-shaved by Gatsby’s gardener, abounded in small muddy swamps and prehistoric marshes. There was nothing to look at from under the tree except Gatsby’s enormous house, so I stared at it, like Kant at his church steeple, for half an hour. A brewer had built it early in the “period” craze, a decade before, and there was a story that he’d agreed to pay five years’ taxes on all the neighboring cottages if the owners would have their roofs thatched with straw. Perhaps their refusal took the heart out of his plan to Found a Family—he went into an immediate decline. His children sold his house with the black wreath still on the door. Americans, while willing, even eager, to be serfs, have always been obstinate about being peasantry. After half an hour, the sun shone again, and the grocer’s automobile rounded Gatsby’s drive with the raw material for his servants’ dinner—I felt sure he wouldn’t eat a spoonful. A maid began opening the upper windows of his house, appeared momentarily in each, and, leaning from the large central bay, spat meditatively into the garden. It was time I went back. While the rain continued it had seemed like the murmur of their voices, rising and swelling a little now and then with gusts of emotion. But in the new silence I felt that silence had fallen within the house too. I went in—after making every possible noise in the kitchen, short of pushing over the stove—but I don’t believe they heard a sound. They were sitting at either end of the couch, looking at each other as if some question had been asked, or was in the air, and every vestige of embarrassment was gone. Daisy’s face was smeared with tears, and when I came in she jumped up and began wiping at it with her handkerchief before a mirror. But there was a change in Gatsby that was simply confounding. He literally glowed; without a word or a gesture of exultation a new well-being radiated from him and filled the little room. “Oh, hello, old sport,” he said, as if he hadn’t seen me for years. I thought for a moment he was going to shake hands. “It’s stopped raining.” “Has it?” When he realized what I was talking about, that there were twinkle-bells of sunshine in the room, he smiled like a weather man, like an ecstatic patron of recurrent light, and repeated the news to Daisy. “What do you think of that? It’s stopped raining.” “I’m glad, Jay.” Her throat, full of aching, grieving beauty, told only of her unexpected joy. “I want you and Daisy to come over to my house,”’ he said, “‘I’d like to show her around.” “You’re sure you want me to come?” “Absolutely, old sport.” Daisy went up-stairs to wash her face—too late I thought with humiliation of my towels—while Gatsby and I waited on the lawn. “My house looks well, doesn’t it?” he demanded. “See how the whole front of it catches the light.” I agreed that it was splendid. “Yes.” His eyes went over it, every arched door and square tower. “It took me just three years to earn the money that bought it.” “I thought you inherited your money.” “I did, old sport,” he said automatically, “but I lost most of it in the big panic—the panic of the war.” I think he hardly knew what he was saying, for when I asked him what business he was in he answered: ‘‘That’s my affair,” before he realized that it wasn’t an appropriate reply. “Oh, I’ve been in several things,” he corrected himself. “I was in the drug business and then I was in the oil business. But I’m not in either one now.” He looked at me with more attention. “Do you mean you’ve been thinking over what I proposed the other night?” Before I could answer, Daisy came out of the house and two rows of brass buttons on her dress gleamed in the sunlight. “That huge place there?” she cried pointing. “Do you like it?” “I love it, but I don’t see how you live there all alone.” “I keep it always full of interesting people, night and day. People who do interesting things. Celebrated people.” Instead of taking the short cut along the Sound we went down to the road and entered by the big postern. With enchanting murmurs Daisy admired this aspect or that of the feudal silhouette against the sky, admired the gardens, the sparkling odor of jonquils and the frothy odor of hawthorn and plum blossoms and the pale gold odor of kiss-me-at-the-gate. It was strange to reach the marble steps and find no stir of bright dresses in and out the door, and hear no sound but bird voices in the trees. And inside, as we wandered through Marie Antoinette music-rooms and Restoration Salons, I felt that there were guests concealed behind every couch and table, under orders to be breathlessly silent until we had passed through. As Gatsby closed the door of ‘‘the Merton College Library” I could have sworn I heard the owl-eyed man break into ghostly laughter. We went up-stairs, through period bedrooms swathed in rose and lavender silk and vivid with new flowers, through dressing-rooms and poolrooms, and bathrooms with sunken baths—intruding into one chamber where a dishevelled man in pajamas was doing liver exercises on the floor. It was Mr. Klipspringer, the ‘‘boarder.” I had seen him wandering hungrily about the beach that morning. Finally we came to Gatsby’s own apartment, a bedroom and a bath, and an Adam’s study, where we sat down and drank a glass of some Chartreuse he took from a cupboard in the wall. He hadn’t once ceased looking at Daisy, and I think he revalued everything in his house according to the measure of response it drew from her well-loved eyes. Sometimes, too, he stared around at his possessions in a dazed way, as though in her actual and astounding presence none of it was any longer real. Once he nearly toppled down a flight of stairs. His bedroom was the simplest room of all—except where the dresser was garnished with a toilet set of pure dull gold. Daisy took the brush with delight, and smoothed her hair, whereupon Gatsby sat down and shaded his eyes and began to laugh. “It’s the funniest thing, old sport,” he said hilariously. “I can’t— When I try to—” He had passed visibly through two states and was entering upon a third. After his embarrassment and his unreasoning joy he was consumed with wonder at her presence. He had been full of the idea so long, dreamed it right through to the end, waited with his teeth set, so to speak, at an inconceivable pitch of intensity. Now, in the reaction, he was running down like an overwound clock. Recovering himself in a minute he opened for us two hulking patent cabinets which held his massed suits and dressing-gowns and ties, and his shirts, piled like bricks in stacks a dozen high. “I’ve got a man in England who buys me clothes. He sends over a selection of things at the beginning of each season, spring and fall.” He took out a pile of shirts and began throwing them, one by one, before us, shirts of sheer linen and thick silk and fine flannel, which lost their folds as they fell and covered the table in many colored disarray. While we admired he brought more and the soft rich heap mounted higher—shirts with stripes and scrolls and plaids in coral and applegreen and lavender and faint orange, with monograms of Indian blue. Suddenly, with a strained sound, Daisy bent her head into the shirts and began to cry stormily. “They’re such beautiful shirts,” she sobbed, her voice muffled in the thick folds. “It makes me sad because I’ve never seen such—such beautiful shirts before.” After the house, we were to see the grounds and the swimming-pool, and the hydroplane and the midsummer flowers—but outside Gatsby’s window it began to rain again, so we stood in a row looking at the corrugated surface of the Sound. “If it wasn’t for the mist we could see your home across the bay,” said Gatsby. “You always have a green light that burns all night at the end of your dock.” Daisy put her arm through his abruptly, but he seemed absorbed in what he had just said. Possibly it had occurred to him that the colossal significance of that light had now vanished forever. Compared to the great distance that had separated him from Daisy it had seemed very near to her, almost touching her. It had seemed as close as a star to the moon. Now it was again a green light on a dock. His count of enchanted objects had diminished by one. I began to walk about the room, examining various indefinite objects in the half darkness. A large photograph of an elderly man in yachting costume attracted me, hung on the wall over his desk. “Who’s this?” “That? That’s Mr. Dan Cody, old sport.” The name sounded faintly familiar. “He’s dead now. He used to be my best friend years ago.” There was a small picture of Gatsby, also in yachting costume, on the bureau—Gatsby with his head thrown back defiantly—taken apparently when he was about eighteen. “I adore it,” exclaimed Daisy. “The pompadour! You never told me you had a pompadour—or a yacht.” “Look at this,” said Gatsby quickly. “Here’s a lot of clippings—about you.” They stood side by side examining it. I was going to ask to see the rubies when the phone rang, and Gatsby took up the receiver. “Yes. . . . Well, I can’t talk now. . . . I can’t talk now, old sport. . . . I said a small town. . . . He must know what a small town is. . . . Well, he’s no use to us if Detroit is his idea of a small town. . . .” He rang off. “Come here quick!” cried Daisy at the window. The rain was still falling, but the darkness had parted in the west, and there was a pink and golden billow of foamy clouds above the sea. “Look at that,” she whispered, and then after a moment: “I’d like to just get one of those pink clouds and put you in it and push you around.” I tried to go then, but they wouldn’t hear of it; perhaps my presence made them feel more satisfactorily alone. “I know what we'll do,” said Gatsby, “we'll have Klipspringer play the piano.” He went out of the room calling “Ewing!” and returned in a few minutes accompanied by an embarrassed, slightly worn young man, with shell-rimmed glasses and scanty blond hair. He was now decently clothed in a “sport shirt,” open at the neck, sneakers, and duck trousers of a nebulous hue. “Did we interrupt your exercises?” inquired Daisy politely. “I was asleep,” cried Mr. Klipspringer, in a spasm of embarrassment. “That is, I’d been asleep. Then I got up . . .” “Klipspringer plays the piano,” said Gatsby, cutting him off. “Don’t you, Ewing, old sport?” “I don’t play well. I don’t—I hardly play at all. I’m all out of prac———” “We’ll go down-stairs,” interrupted Gatsby. He flipped a switch. The gray windows disappeared as the house glowed full of light. In the music-room Gatsby turned on a solitary lamp beside the piano. He lit Daisy’s cigarette from a trembling match, and sat down with her on a couch far across the room, where there was no light save what the gleaming floor bounced in from the hall. When Klipspringer had played “The Love Nest” he turned around on the bench and searched unhappily for Gatsby in the gloom. “I’m all out of practice, you see. I told you I couldn’t play. I’m all out of prac—” “Don’t talk so much, old sport,” commanded Gatsby. “Play!” > “In the morning, In the evening, Ain’t we got fun———” Outside the wind was loud and there was a faint flow of thunder along the Sound. All the lights were going on in West Egg now; the electric trains, men-carrying, were plunging home through the rain from New York. It was the hour of a profound human change, and excitement was generating on the air. > “One thing’s sure and nothing’s surer The rich get richer and the poor > get—children. In the meantime, In between time———” As I went over to say good-by I saw that the expression of bewilderment had come back into Gatsby’s face, as though a faint doubt had occurred to him as to the quality of his present happiness. Almost five years! There must have been moments even that afternoon when Daisy tumbled short of his dreams—not through her own fault, but because of the colossal vitality of his illusion. It had gone beyond her, beyond everything. He had thrown himself into it with a creative passion, adding to it all the time, decking it out with every bright feather that drifted his way. No amount of fire or freshness can challenge what a man can store up in his ghostly heart. As I watched him he adjusted himself a little, visibly. His hand took hold of hers, and as she said something low in his ear he turned toward her with a rush of emotion. I think that voice held him most, with its fluctuating, feverish warmth, because it couldn’t be over-dreamed—that voice was a deathless song. They had forgotten me, but Daisy glanced up and held out her hand; Gatsby didn’t know me now at all. I looked once more at them and they looked back at me, remotely, possessed by intense life. Then I went out of the room and down the marble steps into the rain, leaving them there together. ## CHAPTER VI About this time an ambitious young reporter from New York arrived one morning at Gatsby’s door and asked him if he had anything to say. “Anything to say about what?” inquired Gatsby politely. “Why—any statement to give out.” It transpired after a confused five minutes that the man had heard Gatsby’s name around his office in a connection which he either wouldn’t reveal or didn’t fully understand. This was his day off and with laudable initiative he had hurried out “to see.” It was a random shot, and yet the reporter’s instinct was right. Gatsby’s notoriety, spread about by the hundreds who had accepted his hospitality and so become authorities upon his past, had increased all summer until he fell just short of being news. Contemporary legends such as the “underground pipe-line to Canada” attached themselves to him, and there was one persistent story that he didn’t live in a house at all, but in a boat that looked like a house and was moved secretly up and down the Long Island shore. Just why these inventions were a source of satisfaction to James Gatz of North Dakota, isn’t easy to say. James Gatz—that was really, or at least legally, his name. He had changed it at the age of seventeen and at the specific moment that witnessed the beginning of his career—when he saw Dan Cody’s yacht drop anchor over the most insidious flat on Lake Superior. It was James Gatz who had been loafing along the beach that afternoon in a torn green jersey and a pair of canvas pants, but it was already Jay Gatsby who borrowed a rowboat, pulled out to the Tuolomee, and informed Cody that a wind might catch him and break him up in half an hour. I suppose he’d had the name ready for a long time, even then. His parents were shiftless and unsuccessful farm people—his imagination had never really accepted them as his parents at all. The truth was that Jay Gatsby of West Egg, Long Island, sprang from his Platonic conception of himself. He was a son of God—a phrase which, if it means anything, means just that—and he must be about His Father’s business, the service of a vast, vulgar, and meretricious beauty. So he invented just the sort of Jay Gatsby that a seventeen year-old boy would be likely to invent, and to this conception he was faithful to the end. For over a year he had been beating his way along the south shore of Lake Superior as a clam-digger and a salmon-fisher or in any other capacity that brought him food and bed. His brown, hardening body lived naturally through the half-fierce, half-lazy work of the bracing days. He knew women early, and since they spoiled him he became contemptuous of them, of young virgins because they were ignorant, of the others because they were hysterical about things which in his overwhelming self-absorbtion he took for granted. But his heart was in a constant, turbulent riot. The most grotesque and fantastic conceits haunted him in his bed at night. A universe of ineffable gaudiness spun itself out in his brain while the clock ticked on the wash-stand and the moon soaked with wet light his tangled clothes upon the floor. Each night he added to the pattern of his fancies until drowsiness closed down upon some vivid scene with an oblivious embrace. For a while these reveries provided an outlet for his imagination; they were a satisfactory hint of the unreality of reality, a promise that the rock of the world was founded securely on a fairy’s wing. An instinct toward his future glory had led him, some months before, to the small Lutheran College of St. Olaf’s in northern Minnesota. He stayed there two weeks, dismayed at its ferocious indifference to the drums of his destiny, to destiny itself, and despising the janitor’s work with which he was to pay his way through. Then he drifted back to Lake Superior, and he was still searching for something to do on the day that Dan Cody’s yacht dropped anchor in the shallows alongshore. Cody was fifty years old then, a product of the Nevada silver fields, of the Yukon, of every rush for metal since seventy-five. The transactions in Montana copper that made him many times a millionaire found him physically robust but on the verge of soft-mindedness, and, suspecting this, an infinite number of women tried to separate him from his money. The none too savory ramifications by which Ella Kaye, the newspaper woman, played Madame de Maintenon to his weakness and sent him to sea in a yacht, were common property of the turgid journalism of 1902. He had been coasting along all too hospitable shores for five years when he turned up as James Gatz’s destiny in Little Girl Bay. To young Gatz, resting on his oars and looking up at the railed deck, that yacht represented all the beauty and glamour in the world. I suppose he smiled at Cody—he had probably discovered that people liked him when he smiled. At any rate Cody asked him a few questions (one of them elicited the brand new name) and found that he was quick and extravagantly ambitious. A few days later he took him to Duluth and bought him a blue coat, six pair of white duck trousers, and a yachting cap. And when the Tuolomee left for the West Indies and the Barbary Coast Gatsby left too. He was employed in a vague personal capacity—while he remained with Cody he was in turn steward, mate, skipper, secretary, and even jailor, for Dan Cody sober knew what lavish doings Dan Cody drunk might soon be about, and he provided for such contingencies by reposing more and more trust in Gatsby. The arrangement lasted five years, during which the boat went three times around the Continent. It might have lasted indefinitely except for the fact that Ella Kaye came on board one night in Boston and a week later Dan Cody inhospitably died. I remember the portrait of him up in Gatsby’s bedroom, a gray, florid man with a hard, empty face—the pioneer debauchee, who during one phase of American life brought back to the Eastern seaboard the savage violence of the frontier brothel and saloon. It was indirectly due to Cody that Gatsby drank so little. Sometimes in the course of gay parties women used to rub champagne into his hair; for himself he formed the habit of letting liquor alone. And it was from Cody that he inherited money—a legacy of twenty-five thousand dollars. He didn’t get it. He never understood the legal device that was used against him, but what remained of the millions went intact to Ella Kaye. He was left with his singularly appropriate education; the vague contour of Jay Gatsby had filled out to the substantiality of a man. He told me all this very much later, but I’ve put it down here with the idea of exploding those first wild rumors about his antecedents, which weren’t even faintly true. Moreover he told it to me at a time of confusion, when I had reached the point of believing everything and nothing about him. So I take advantage of this short halt, while Gatsby, so to speak, caught his breath, to clear this set of misconceptions away. It was a halt, too, in my association with his affairs. For several weeks I didn’t see him or hear his voice on the phone—mostly I was in New York, trotting around with Jordan and trying to ingratiate myself with her senile aunt—but finally I went over to his house one Sunday afternoon. I hadn’t been there two minutes when somebody brought Tom Buchanan in for a drink. I was startled, naturally, but the really surprising thing was that it hadn’t happened before. They were a party of three on horseback—Tom and a man named Sloane and a pretty woman in a brown riding-habit, who had been there previously. “I’m delighted to see you,” said Gatsby, standing on his porch. “I’m delighted that you dropped in.” As though they cared! “Sit right down. Have a cigarette or a cigar.” He walked around the room quickly, ringing bells. “I’ll have something to drink for you in just a minute.” He was profoundly affected by the fact that Tom was there. But he would be uneasy anyhow until he had given them something, realizing in a vague way that that was all they came for. Mr. Sloane wanted nothing. A lemonade? No, thanks. A little champagne? Nothing at all, thanks. . . . I’m sorry——— “Did you have a nice ride?” “Very good roads around here.” “I suppose the automobiles———” “Yeah.” Moved by an irresistible impulse, Gatsby turned to Tom, who had accepted the introduction as a stranger. “I believe we’ve met somewhere before, Mr. Buchanan.” “Oh, yes,” said Tom, gruffly polite, but obviously not remembering. “So we did. I remember very well.” “About two weeks ago.” “That’s right. You were with Nick here.” “I know your wife,” continued Gatsby, almost aggressively. “That so?” Tom turned to me. “You live near here, Nick?” “Next door.” “That so?” Mr. Sloane didn’t enter into the conversation, but lounged back haughtily in his chair; the woman said nothing either—until unexpectedly, after two highballs, she became cordial. “We’ll all come over to your next party, Mr. Gatsby,” she suggested. “What do you say?” “Certainly; I’d be delighted to have you.” “Be ver’ nice,” said Mr. Sloane, without gratitude. “Well—think ought to be starting home.” “Please don’t hurry,” Gatsby urged them. He had control of himself now, and he wanted to see more of Tom. “Why don’t you—why don’t you stay for supper? I wouldn’t be surprised if some other people dropped in from New York.” “You come to supper with me,” said the lady enthusiastically. “Both of you.” This included me. Mr. Sloane got to his feet. “Come along,” he said—but to her only. “I mean it,” she insisted. “I’d love to have you. Lots of room.” Gatsby looked at me questioningly. He wanted to go, and he didn’t see that Mr. Sloane had determined he shouldn’t. “I’m afraid I won’t be able to,” I said. “Well, you come,” she urged, concentrating on Gatsby. Mr. Sloane murmured something close to her ear. “We won’t be late if we start now,” she insisted aloud. “I haven’t got a horse,” said Gatsby. “I used to ride in the army, but I’ve never bought a horse. I’ll have to follow you in my car. Excuse me for just a minute.” The rest of us walked out on the porch, where Sloane and the lady began an impassioned conversation aside. “My God, I believe the man’s coming,” said Tom. “Doesn’t he know she doesn’t want him?” “She says she does want him.” “She has a big dinner party and he won’t know a soul there.” He frowned. “I wonder where in the devil he met Daisy. By God, I may be old-fashioned in my ideas, but women run around too much these days to suit me. They meet all kinds of crazy fish.” Suddenly Mr. Sloane and the lady walked down the steps and mounted their horses. “Come on,” said Mr. Sloane to Tom, “we’re late. We've got to go.” And then to me: “Tell him we couldn’t wait, will you?” Tom and I shook hands, the rest of us exchanged a cool nod, and they trotted quickly down the drive, disappearing under the August foliage just as Gatsby, with hat and light overcoat in hand, came out the front door. Tom was evidently perturbed at Daisy’s running around alone, for on the following Saturday night he came with her to Gatsby’s party. Perhaps his presence gave the evening its peculiar quality of oppressiveness—it stands out in my memory from Gatsby’s other parties that summer. There were the same people, or at least the same sort of people, the same profusion of champagne, the same many-colored, many-keyed commotion, but I felt an unpleasantness in the air, a pervading harshness that hadn’t been there before. Or perhaps I had merely grown used to it, grown to accept West Egg as a world complete in itself, with its own standards and its own great figures, second to nothing because it had no consciousness of being so, and now I was looking at it again, through Daisy’s eyes. It is invariably saddening to look through new eyes at things upon which you have expended your own powers of adjustment. They arrived at twilight, and, as we strolled out among the sparkling hundreds, Daisy’s voice was playing murmurous tricks in her throat. “These things excite me so,” she whispered. “If you want to kiss me any time during the evening, Nick, just let me know and I'll be glad to arrange it for you. Just mention my name. Or present a green card. I’m giving out green—” “Look around,” suggested Gatsby “I’m looking around. I’m having a marvellous—” “You must see the faces of many people you’ve heard about.” Tom’s arrogant eyes roamed the crowd. “We don’t go around very much,” he said; “in fact, I was just thinking I don’t know a soul here.” “Perhaps you know that lady,” Gatsby indicated a gorgeous, scarcely human orchid of a woman who sat in state under a white-plum tree. Tom and Daisy stared, with that peculiarly unreal feeling that accompanies the recognition of a hitherto ghostly celebrity of the movies. “She’s lovely,” said Daisy. “The man bending over her is her director.” He took them ceremoniously from group to group: “Mrs. Buchanan . . . and Mr. Buchanan—” After an instant’s hesitation he added: “the polo player.” “Oh no,” objected Tom quickly, “not me.” But evidently the sound of it pleased Gatsby for Tom remained “the polo player” for the rest of the evening. “I’ve never met so many celebrities,” Daisy exclaimed, “I liked that man—what was his name?—with the sort of blue nose.” Gatsby identified him, adding that he was a small producer. “Well, I liked him anyhow.” “I’d a little rather not be the polo player,” said Tom pleasantly, “I’d rather look at all these famous people in—in oblivion.” Daisy and Gatsby danced. I remember being surprised by his graceful, conservative fox-trot—I had never seen him dance before. Then they sauntered over to my house and sat on the steps for half an hour, while at her request I remained watchfully in the garden. “In case there’s a fire or a flood,” she explained, ‘‘or any act of God.” Tom appeared from his oblivion as we were sitting down to supper together. “Do you mind if I eat with some people over here?” he said. “A fellow’s getting off some funny stuff.” “Go ahead,” answered Daisy genially, “and if you want to take down any addresses here’s my little gold pencil.” . . . She looked around after a moment and told me the girl was “common but pretty,” and I knew that except for the half-hour she’d been alone with Gatsby she wasn’t having a good time. We were at a particularly tipsy table. That was my fault—Gatsby had been called to the phone, and I’d enjoyed these same people only two weeks before. But what had amused me then turned septic on the air now. “How do you feel, Miss Baedeker?” The girl addressed was trying, unsuccessfully, to slump against my shoulder. At this inquiry she sat up and opened her eyes. “Wha’?” A massive and lethargic woman, who had been urging Daisy to play golf with her at the local club to-morrow, spoke in Miss Baedeker’s defence: “Oh, she’s all right now. When she’s had five or six cocktails she always starts screaming like that. I tell her she ought to leave it alone.” “I do leave it alone,” affirmed the accused hollowly. “We heard you yelling, so I said to Doc Civet here: ‘There’s somebody that needs your help, Doc.’” “She’s much obliged, I’m sure,” said another friend, without gratitude, “but you got her dress all wet when you stuck her head in the pool.” “Anything I hate is to get my head stuck in a pool,” mumbled Miss Baedeker. “They almost drowned me once over in New Jersey.” “Then you ought to leave it alone,” countered Doctor Civet. “Speak for yourself!” cried Miss Baedeker violently. “Your hand shakes. I wouldn’t let you operate on me!” It was like that. Almost the last thing I remember was standing with Daisy and watching the moving-picture director and his Star. They were still under the white-plum tree and their faces were touching except for a pale, thin ray of moonlight between. It occurred to me that he had been very slowly bending toward her all evening to attain this proximity, and even while I watched I saw him stoop one ultimate degree and kiss at her cheek. “I like her,” said Daisy, “I think she’s lovely.” But the rest offended her—and inarguably, because it wasn’t a gesture but an emotion. She was appalled by West Egg, this unprecedented “place” that Broadway had begotten upon a Long Island fishing village—appalled by its raw vigor that chafed under the old euphemisms and by the too obtrusive fate that herded its inhabitants along a short-cut from nothing to nothing. She saw something awful in the very simplicity she failed to understand. I sat on the front steps with them while they waited for their car. It was dark here in front; only the bright door sent ten square feet of light volleying out into the soft black morning. Sometimes a shadow moved against a dressing-room blind above, gave way to another shadow, an indefinite procession of shadows, who rouged and powdered in an invisible glass. “Who is this Gatsby anyhow?” demanded Tom suddenly. “Some big bootlegger?” “Where’d you hear that?” I inquired. “I didn’t hear it. I imagined it. A lot of these newly rich people are just big bootleggers, you know.” “Not Gatsby,” I said shortly. He was silent for a moment. The pebbles of the drive crunched under his feet. “Well, he certainly must have strained himself to get this menagerie together.” A breeze stirred the gray haze of Daisy’s fur collar. “At least they are more interesting than the people we know,” she said with an effort. “You didn’t look so interested.” “Well, I was.” Tom laughed and turned to me. “Did you notice Daisy’s face when that girl asked her to put her under a cold shower?” Daisy began to sing with the music in a husky, rythmic whisper, bringing out a meaning in each word that it had never had before and would never have again. When the melody rose her voice broke up sweetly, following it, in a way contralto voices have, and each change tipped out a little of her warm human magic upon the air. “Lots of people come who haven’t been invited,” she said suddenly. “That girl hadn’t been invited. They simply force their way in and he’s too polite to object.” “I’d like to know who he is and what he does,” insisted Tom. “And I think I’ll make a point of finding out.” “I can tell you right now,” she answered. “He owned some drug-stores, a lot of drug-stores. He built them up himself.” The dilatory limousine came rolling up the drive. “Good night, Nick,” said Daisy. Her glance left me and sought the lighted top of the steps, where “Three o’Clock in the Morning,” a neat, sad little waltz of that year, was drifting out the open door. After all, in the very casualness of Gatsby’s party there were romantic possibilities totally absent from her world. What was it up there in the song that seemed to be calling her back inside? What would happen now in the dim, incalculable hours? Perhaps some unbelievable guest would arrive, a person infinitely rare and to be marvelled at, some authentically radiant young girl who with one fresh glance at Gatsby, one moment of magical encounter, would blot out those five years of unwavering devotion. I stayed late that night, Gatsby asked me to wait until he was free, and I lingered in the garden until the inevitable swimming party had run up, chilled and exalted, from the black beach, until the lights were extinguished in the guest-rooms overhead. When he came down the steps at last the tanned skin was drawn unusually tight on his face, and his eyes were bright and tired. “She didn’t like it,” he said immediately. “Of course she did.” “She didn’t like it,” he insisted. “She didn’t have a good time.” He was silent, and I guessed at his unutterable depression. “I feel far away from her,” he said. “It’s hard to make her understand.” “You mean about the dance?” “The dance?” He dismissed all the dances he had given with a snap of his fingers. “Old sport, the dance is unimportant.” He wanted nothing less of Daisy than that she should go to Tom and say: “I never loved you.” After she had obliterated four years with that sentence they could decide upon the more practical measures to be taken. One of them was that, after she was free, they were to go back to Louisville and be married from her house—just as if it were five years ago. “And she doesn’t understand,” he said. “She used to be able to understand. We’d sit for hours—” He broke off and began to walk up and down a desolate path of fruit rinds and discarded favors and crushed flowers. “I wouldn’t ask too much of her,” I ventured. “You can’t repeat the past.” “Can’t repeat the past?” he cried incredulously. “Why of course you can!” He looked around him wildly, as if the past were lurking here in the shadow of his house, just out of reach of his hand. “I’m going to fix everything just the way it was before,” he said, nodding determinedly. “She’ll see.” He talked a lot about the past, and I gathered that he wanted to recover something, some idea of himself perhaps, that had gone into loving Daisy. His life had been confused and disordered since then, but if he could once return to a certain starting place and go over it all slowly, he could find out what that thing was. . . . . . . One autumn night, five years before, they had been walking down the street when the leaves were falling, and they came to a place where there were no trees and the sidewalk was white with moonlight. They stopped here and turned toward each other. Now it was a cool night with that mysterious excitement in it which comes at the two changes of the year. The quiet lights in the houses were humming out into the darkness and there was a stir and bustle among the stars. Out of the corner of his eye Gatsby saw that the blocks of the sidewalks really formed a ladder and mounted to a secret place above the trees—he could climb to it, if he climbed alone, and once there he could suck on the pap of life, gulp down the incomparable milk of wonder. His heart beat faster and faster as Daisy’s white face came up to his own. He knew that when he kissed this girl, and forever wed his unutterable visions to her perishable breath, his mind would never romp again like the mind of God. So he waited, listening for a moment longer to the tuning-fork that had been struck upon a star. Then he kissed her. At his lips’ touch she blossomed for him like a flower and the incarnation was complete. Through all he said, even through his appalling sentimentality, I was reminded of something—an elusive rhythm, a fragment of lost words, that I had heard somewhere a long time ago. For a moment a phrase tried to take shape in my mouth and my lips parted like a dumb man’s, as though there was more struggling upon them than a wisp of startled air. But they made no sound, and what I had almost remembered was uncommunicable forever. ## CHAPTER VII It was when curiosity about Gatsby was at its highest that the lights in his house failed to go on one Saturday night—and, as obscurely as it had begun, his career as Trimalchio was over. Only gradually did I become aware that the automobiles which turned expectantly into his drive stayed for just a minute and then drove sulkily away. Wondering if he were sick I went over to find out—an unfamiliar butler with a villainous face squinted at me suspiciously from the door. “Is Mr. Gatsby sick?” “Nope.” After a pause he added “sir’’ in a dilatory, grudging way. “I hadn’t seen him around, and I was rather worried. Tell him Mr. Carraway came over.” “Who?” he demanded rudely. “Carraway.” “Carraway. All right, I'll tell him.” Abruptly he slammed the door. My Finn informed me that Gatsby had dismissed every servant in his house a week ago and replaced them with half a dozen others, who never went into West Egg Village to be bribed by the tradesmen, but ordered moderate supplies over the telephone. The grocery boy reported that the kitchen looked like a pigsty, and the general opinion in the village was that the new people weren’t servants at all. Next day Gatsby called me on the phone. “Going away?” I inquired. “No, old sport.” “I hear you fired all your servants.” “I wanted somebody who wouldn’t gossip. Daisy comes over quite often—in the afternoons.” So the whole caravansary had fallen in like a card house at the disapproval in her eyes. “They’re some people Wolfshiem wanted to do something for. They’re all brothers and sisters. They used to run a small hotel.” “I see.” He was calling up at Daisy’s request—would I come to lunch at her house to-morrow? Miss Baker would be there. Half an hour later Daisy herself telephoned and seemed relieved to find that I was coming. Something was up. And yet I couldn’t believe that they would choose this occasion for a scene—especially for the rather harrowing scene that Gatsby had outlined in the garden. The next day was broiling, almost the last, certainly the warmest, of the summer. As my train emerged from the tunnel into sunlight, only the hot whistles of the National Biscuit Company broke the simmering hush at noon. The straw seats of the car hovered on the edge of combustion; the woman next to me perspired delicately for a while into her white shirtwaist, and then, as her newspaper dampened under her fingers, lapsed despairingly into deep heat with a desolate cry. Her pocket-book slapped to the floor. “Oh, my!” she gasped. I picked it up with a weary bend and handed it back to her, holding it at arm’s length and by the extreme tip of the corners to indicate that I had no designs upon it—but every one near by, including the woman, suspected me just the same. “Hot!” said the conductor to familiar faces. “Some weather! . . . Hot! . . . Hot! . . . Hot! . . . Is it hot enough for you? Is it hot? Is it . . .?” My commutation ticket came back to me with a dark stain from his hand. That any one should care in this heat whose flushed lips he kissed, whose head made damp the pajama pocket over his heart! . . . Through the hall of the Buchanans’ house blew a faint wind, carrying the sound of the telephone bell out to Gatsby and me as we waited at the door. “The master’s body!” roared the butler into the mouthpiece. “I’m sorry, madame, but we can’t furnish it—it’s far too hot to touch this noon!” What he really said was: “Yes . . . Yes . . . I’ll see.” He set down the receiver and came toward us, glistening slightly, to take our stiff straw hats. “Madame expects you in the salon!” he cried, needlessly indicating the direction. In this heat every extra gesture was an affront to the common store of life. The room, shadowed well with awnings, was dark and cool. Daisy and Jordan lay upon an enormous couch, like silver idols weighing down their own white dresses against the singing breeze of the fans. “We can’t move,” they said together. Jordan’s fingers, powdered white over their tan, rested for a moment in mine. “And Mr. Thomas Buchanan, the athlete?” I inquired. Simultaneously I heard his voice, gruff, muffled, husky, at the hall telephone. Gatsby stood in the centre of the crimson carpet and gazed around with fascinated eyes. Daisy watched him and laughed, her sweet, exciting laugh; a tiny gust of powder rose from her bosom into the air. “The rumor is,” whispered Jordan, “that that’s Tom’s girl on the telephone.” We were silent. The voice in the hall rose high with annoyance: “Very well, then, I won’t sell you the car at all. . . . I’m under no obligations to you at all . . . and as for your bothering me about it at lunch time, I won’t stand that at all!” “Holding down the receiver,” said Daisy cynically. “No, he’s not,” I assured her. “It’s a bona-fide deal. I happen to know about it.” Tom flung open the door, blocked out its space for a moment with his thick body, and hurried into the room. “Mr. Gatsby!” He put out his broad, flat hand with well-concealed dislike. “I’m glad to see you, sir. . . . Nick. . . .” “Make us a cold drink,” cried Daisy. As he left the room again she got up and went over to Gatsby and pulled his face down, kissing him on the mouth. “You know I love you,” she murmured. “You forget there’s a lady present,” said Jordan. Daisy looked around doubtfully. “You kiss Nick too.” “What a low, vulgar girl!” “I don’t care!” cried Daisy, and began to clog on the brick fireplace. Then she remembered the heat and sat down guiltily on the couch just as a freshly laundered nurse leading a little girl came into the room. “Bles-sed pre-cious,” she crooned, holding out her arms. “Come to your own mother that loves you.” The child, relinquished by the nurse, rushed across the room and rooted shyly into her mother’s dress. “The bles-sed pre-cious! Did mother get powder on your old yellowy hair? Stand up now, and say—How-de-do.” Gatsby and I in turn leaned down and took the small reluctant hand. Afterward he kept looking at the child with surprise. I don’t think he had ever really believed in its existence before. “I got dressed before luncheon,” said the child, turning eagerly to Daisy. “That’s because your mother wanted to show you off.” Her face bent into the single wrinkle of the small white neck. “You dream, you. You absolute little dream.” “Yes,” admitted the child calmly. “Aunt Jordan’s got on a white dress too.” “How do you like mother’s friends?” Daisy turned her around so that she faced Gatsby. “Do you think they’re pretty?” “Where’s Daddy?” “She doesn’t look like her father,” explained Daisy. “She looks like me. She’s got my hair and shape of the face.” Daisy sat back upon the couch. The nurse took a step forward and held out her hand. “Come, Pammy.” “Good-by, sweetheart!” With a reluctant backward glance the well-disciplined child held to her nurse’s hand and was pulled out the door, just as Tom came back, preceding four gin rickeys that clicked full of ice. Gatsby took up his drink. “They certainly look cool,” he said, with visible tension. We drank in long, greedy swallows. “I read somewhere that the sun’s getting hotter every year,” said Tom genially. “It seems that pretty soon the earth’s going to fall into the sun—or wait a minute—it’s just the opposite—the sun’s getting colder every year. “Come outside,” he suggested to Gatsby, “I’d like you to have a look at the place.” I went with them out to the veranda. On the green Sound, stagnant in the heat, one small sail crawled slowly toward the fresher sea. Gatsby’s eyes followed it momentarily; he raised his hand and pointed across the bay. “I’m right across from you.” “So you are.” Our eyes lifted over the rose-beds and the hot lawn and the weedy refuse of the dog-days alongshore. Slowly the white wings of the boat moved against the blue cool limit of the sky. Ahead lay the scalloped ocean and the abounding blessed isles. “There’s sport for you,” said Tom, nodding. “I’d like to be out there with him for about an hour.” We had luncheon in the dining-room, darkened too against the heat, and drank down nervous gayety with the cold ale. “What’ll we do with ourselves this afternoon?” cried Daisy, “and the day after that, and the next thirty years?” “Don’t be morbid,” Jordan said. “Life starts all over again when it gets crisp in the fall.” “But it’s so hot,” insisted Daisy, on the verge of tears, “and everything’s so confused. Let’s all go to town!” Her voice struggled on through the heat, beating against it, molding its senselessness into forms. “I’ve heard of making a garage out of a stable,” Tom was saying to Gatsby, “but I’m the first man who ever made a stable out of a garage.” “Who wants to go to town?” demanded Daisy insistently. Gatsby’s eyes floated toward her. “Ah,” she cried, “you look so cool.” Their eyes met, and they stared together at each other, alone in space. With an effort she glanced down at the table. “You always look so cool,” she repeated. She had told him that she loved him, and Tom Buchanan saw. He was astounded. His mouth opened a little, and he looked at Gatsby, and then back at Daisy as if he had just recognized her as some one he knew a long time ago. “You resemble the advertisement of the man,” she went on innocently. ‘You know the advertisement of the man—” “All right,” broke in Tom quickly, “I’m perfectly willing to go to town. Come on—we’re all going to town.” He got up, his eyes still flashing between Gatsby and his wife. No one moved. “Come on!” His temper cracked a little. “What’s the matter, anyhow? If we’re going to town, let’s start.” His hand, trembling with his effort at self-control, bore to his lips the last of his glass of ale. Daisy’s voice got us to our feet and out on to the blazing gravel drive. “Are we just going to go?” she objected. “Like this? Aren’t we going to let any one smoke a cigarette first?” “Everybody smoked all through lunch.” “Oh, let’s have fun,” she begged him. “It’s too hot to fuss.” He didn’t answer. “Have it your own way,” she said. “Come on, Jordan.” They went up-stairs to get ready while we three men stood there shuffling the hot pebbles with our feet. A silver curve of the moon hovered already in the western sky. Gatsby started to speak, changed his mind, but not before Tom wheeled and faced him expectantly. “Have you got your stables here?” asked Gatsby with an effort. “About a quarter of a mile down the road.” “Oh.” A pause. “I don’t see the idea of going to town,” broke out Tom savagely. “Women get these notions in their heads———” “Shall we take anything to drink?” called Daisy from an upper window. “I’ll get some whiskey,” answered Tom. He went inside. Gatsby turned to me rigidly: “I can’t say anything in his house, old sport.” “She’s got an indiscreet voice,” I remarked. “It’s full of—” I hesitated. “Her voice is full of money,” he said suddenly. That was it. I’d never understood before. It was full of money—that was the inexhaustible charm that rose and fell in it, the jingle of it, the cymbals’ song of it. . . . High in a white palace the king’s daughter, the golden girl. . . . Tom came out of the house wrapping a quart bottle in a towel, followed by Daisy and Jordan wearing small tight hats of metallic cloth and carrying light capes over their arms. “Shall we all go in my car?” suggested Gatsby. He felt the hot, green leather of the seat. “I ought to have left it in the shade.” “Is it standard shift?” demanded Tom. “Yes.” “Well, you take my coupé and let me drive your car to town.” The suggestion was distasteful to Gatsby. “I don’t think there’s much gas,” he objected. “Plenty of gas,” said Tom boisterously. He looked at the gauge. “And if it runs out I can stop at a drug-store. You can buy anything at a drug-store nowadays.” A pause followed this apparently pointless remark. Daisy looked at Tom frowning, and an indefinable expression, at once definitely unfamiliar and vaguely recognizable, as if I had only heard it described in words, passed over Gatsby’s face. “Come on, Daisy,” said Tom, pressing her with his hand toward Gatsby’s car. “I’ll take you in this circus wagon.” He opened the door, but she moved out from the circle of his arm. “You take Nick and Jordan. We’ll follow you in the coupé.” She walked close to Gatsby, touching his coat with her hand. Jordan and Tom and I got into the front seat of Gatsby’s car, Tom pushed the unfamiliar gears tentatively, and we shot off into the oppressive heat, leaving them out of sight behind. “Did you see that?” demanded Tom. “See what?” He looked at me keenly, realizing that Jordan and I must have known all along. “You think I’m pretty dumb, don’t you?” he suggested. “Perhaps I am, but I have a—almost a second sight, sometimes, that tells me what to do. Maybe you don’t believe that, but science———” He paused. The immediate contingency overtook him, pulled him back from the edge of the theoretical abyss. “I’ve made a small investigation of this fellow,” he continued. “I could have gone deeper if I’d known———” “Do you mean you’ve been to a medium?” inquired Jordan humorously. “What?” Confused, he stared at us as we laughed. “A medium?” “About Gatsby.” “About Gatsby! No, I haven’t. I said I’d been making a small investigation of his past.” “And you found he was an Oxford man,” said Jordan helpfully. “An Oxford man!” He was incredulous. “Like hell he is! He wears a pink suit.” “Nevertheless he’s an Oxford man.” “Oxford, New Mexico,” snorted Tom contemptuously, “or something like that.” “Listen, Tom. If you’re such a snob, why did you invite him to lunch?” demanded Jordan crossly. “Daisy invited him; she knew him before we were married—God knows where!” We were all irritable now with the fading ale, and aware of it we drove for a while in silence. Then as Doctor T. J. Eckleburg’s faded eyes came into sight down the road, I remembered Gatsby’s caution about gasoline. “We’ve got enough to get us to town,” said Tom. “But there’s a garage right here,” objected Jordan. “I don’t want to get stalled in this baking heat.” Tom threw on both brakes impatiently, and we slid to an abrupt dusty spot under Wilson’s sign. After a moment the proprietor emerged from the interior of his establishment and gazed hollow-eyed at the car. “Let’s have some gas!” cried Tom roughly. “What do you think we stopped for—to admire the view?” “I’m sick,” said Wilson without moving. “Been sick all day.” “What’s the matter?” “I’m all run down.” “Well, shall I help myself?” Tom demanded. “You sounded well enough on the phone.” With an effort Wilson left the shade and support of the doorway and, breathing hard, unscrewed the cap of the tank. In the sunlight his face was green. “I didn’t mean to interrupt your lunch,” he said. “But I need money pretty bad, and I was wondering what you were going to do with your old car.” “How do you like this one?” inquired Tom. “I bought it last week.” “It’s a nice yellow one,” said Wilson, as he strained at the handle. “Like to buy it?” “Big chance,” Wilson smiled faintly. “No, but I could make some money on the other.” “What do you want money for, all of a sudden?” “I’ve been here too long. I want to get away. My wife and I want to go West.” “Your wife does,” exclaimed Tom, startled. “She’s been talking about it for ten years.” He rested for a moment against the pump, shading his eyes. “And now she’s going whether she wants to or not. I’m going to get her away.” The coupé flashed by us with a flurry of dust and the flash of a waving hand. “What do I owe you?” demanded Tom harshly. “I just got wised up to something funny the last two days,” remarked Wilson. “That’s why I want to get away. That’s why I been bothering you about the car.” “What do I owe you?” “Dollar twenty.” The relentless beating heat was beginning to confuse me and I had a bad moment there before I realized that so far his suspicions hadn’t alighted on Tom. He had discovered that Myrtle had some sort of life apart from him in another world, and the shock had made him physically sick. I stared at him and then at Tom, who had made a parallel discovery less than an hour before—and it occurred to me that there was no difference between men, in intelligence or race, so profound as the difference between the sick and the well. Wilson was so sick that he looked guilty, unforgivably guilty—as if he had just got some poor girl with child. “I’ll let you have that car,” said Tom. “I’ll send it over to-morrow afternoon.” That locality was always vaguely disquieting, even in the broad glare of afternoon, and now I turned my head as though I had been warned of something behind. Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their vigil, but I perceived, after a moment, that other eyes were regarding us with peculiar intensity from less than twenty feet away. In one of the windows over the garage the curtains had been moved aside a little, and Myrtle Wilson was peering down at the car. So engrossed was she that she had no consciousness of being observed, and one emotion after another crept into her face like objects into a slowly developing picture. Her expression was curiously familiar—it was an expression I had often seen on women’s faces, but on Myrtle Wilson’s face it seemed purposeless and inexplicable until I realized that her eyes, wide with jealous terror, were fixed not on Tom, but on Jordan Baker, whom she took to be his wife. There is no confusion like the confusion of a simple mind, and as we drove away Tom was feeling the hot whips of panic. His wife and his mistress, until an hour ago secure and inviolate, were slipping precipitately from his control. Instinct made him step on the accelerator with the double purpose of overtaking Daisy and leaving Wilson behind, and we sped along toward Astoria at fifty miles an hour, until, among the spidery girders of the elevated, we came in sight of the easy-going blue coupé. “Those big movies around Fiftieth Street are cool,” suggested Jordan. “I love New York on summer afternoons when every one’s away. There’s something very sensuous about it—overripe, as if all sorts of funny fruits were going to fall into your hands.” The word “sensuous” had the effect of further disquieting Tom, but before he could invent a protest the coupé came to a stop, and Daisy signalled us to draw up alongside. “Where are we going?” she cried. “How about the movies?” “It’s so hot,” she complained. “You go. We'll ride around and meet you after.” With an effort her wit rose faintly, “We’ll meet you on some corner. I'll be the man smoking two cigarettes.” “We can’t argue about it here,” Tom said impatiently, as a truck gave out a cursing whistle behind us. “You follow me to the south side of Central Park, in front of the Plaza.” Several times he turned his head and looked back for their car, and if the traffic delayed them he slowed up until they came into sight. I think he was afraid they would dart down a side street and out of his life forever. But they didn’t. And we all took the less explicable step of engaging the parlor of a suite in the Plaza Hotel. The prolonged and tumultuous argument that ended by herding us into that room eludes me, though I have a sharp physical memory that, in the course of it, my underwear kept climbing like a damp snake around my legs and intermittent beads of sweat raced cool across my back. The notion originated with Daisy’s suggestion that we hire five bathrooms and take cold baths, and then assumed more tangible form as “a place to have a mint julep.” Each of us said over and over that it was a “crazy idea”—we all talked at once to a baffled clerk and thought, or pretended to think, that we were being very funny . . . The room was large and stifling, and, though it was already four o’clock, opening the windows admitted only a gust of hot shrubbery from the Park. Daisy went to the mirror and stood with her back to us, fixing her hair. “It’s a swell suite,” whispered Jordan respectfully, and every one laughed. “Open another window,” commanded Daisy, without turning around. “There aren’t any more.” “Well, we’d better telephone for an axe———” “The thing to do is to forget about the heat,” said Tom impatiently. “You make it ten times worse by crabbing about it.” He unrolled the bottle of whiskey from the towel and put it on the table. “Why not let her alone, old sport?” remarked Gatsby. “You’re the one that wanted to come to town.” There was a moment of silence. The telephone book slipped from its nail and splashed to the floor, whereupon Jordan whispered, “Excuse me”—but this time no one laughed. “I’ll pick it up,” I offered. “I’ve got it.” Gatsby examined the parted string, muttered “Hum!” in an interested way, and tossed the book on a chair. “That’s a great expression of yours, isn’t it?” said Tom sharply. “What is?” “All this ‘old sport’ business. Where’d you pick that up?” “Now see here, Tom,” said Daisy, turning around from the mirror, “if you’re going to make personal remarks I won’t stay here a minute. Call up and order some ice for the mint julep.” As Tom took up the receiver the compressed heat exploded into sound and we were listening to the portentous chords of Mendelssohn’s Wedding March from the ballroom below. “Imagine marrying anybody in this heat!” cried Jordan dismally. “Still—I was married in the middle of June,” Daisy remembered, “Louisville in June! Somebody fainted. Who was it fainted, Tom?” “Biloxi,” he answered shortly. “A man named Biloxi. ‘Blocks’ Biloxi, and he made boxes—that’s a fact—and he was from Biloxi, Tennessee.” “They carried him into my house,” appended Jordan, “because we lived just two doors from the church. And he stayed three weeks, until Daddy told him he had to get out. The day after he left Daddy died.” After a moment she added. ‘‘There wasn’t any connection.” “I used to know a Bill Biloxi from Memphis,” I remarked. “That was his cousin. I knew his whole family history before he left. He gave me an aluminum putter that I use to-day.” The music had died down as the ceremony began and now a long cheer floated in at the window, followed by intermittent cries of “Yea—ea—ea!” and finally by a burst of jazz as the dancing began. “We're getting old,” said Daisy. “lf we were young we’d rise and dance.” “Remember Biloxi,” Jordan warned her. ‘‘Where’d you know him, Tom?” “Biloxi?” He concentrated with an effort. “I didn’t know him. He was a friend of Daisy’s.” “He was not,” she denied. “I’d never seen him before. He came down in the private car.” “Well, he said he knew you. He said he was raised in Louisville. Asa Bird brought him around at the last minute and asked if we had room for him.” Jordan smiled. “He was probably bumming his way home. He told me he was president of your class at Yale.” Tom and I looked at each other blankly. “Biloxi?” “First place, we didn’t have any president———” Gatsby’s foot beat a short, restless tattoo and Tom eyed him suddenly. “By the way, Mr. Gatsby, I understand you’re an Oxford man.” “Not exactly.” “Oh, yes, I understand you went to Oxford.” “Yes—I went there.” A pause. Then Tom’s voice, incredulous and insulting: “You must have gone there about the time Biloxi went to New Haven.” Another pause. A waiter knocked and came in with crushed mint and ice but the silence was unbroken by his “thank you” and the soft closing of the door. This tremendous detail was to be cleared up at last. “I told you I went there,” said Gatsby. “I heard you, but I’d like to know when.” “It was in nineteen-nineteen, I only stayed five months. That’s why I can’t really call myself an Oxford man.” Tom glanced around to see if we mirrored his unbelief. But we were all looking at Gatsby. “It was an opportunity they gave to some of the officers after the armistice,” he continued. “We could go to any of the universities in England or France.” I wanted to get up and slap him on the back. I had one of those renewals of complete faith in him that I’d experienced before. Daisy rose, smiling faintly, and went to the table. “Open the whiskey, Tom,” she ordered, ‘‘and I'll make you a mint julep. Then you won’t seem so stupid to yourself. . . . Look at the mint!” “Wait a minute,” snapped Tom, “I want to ask Mr. Gatsby one more question.” “Go on,” Gatsby said politely. “What kind of a row are you trying to cause in my house anyhow?” They were out in the open at last and Gatsby was content. “He isn’t causing a row,” Daisy looked desperately from one to the other. “You’re causing a row. Please have a little self-control.” “Self-control!” repeated Tom incredulously. “I suppose the latest thing is to sit back and let Mr. Nobody from Nowhere make love to your wife. Well, if that’s the idea you can count me out. . . . Nowadays people begin by sneering at family life and family institutions, and next they’ll throw everything overboard and have intermarriage between black and white.” Flushed with his impassioned gibberish, he saw himself standing alone on the last barrier of civilization. “We’re all white here,” murmured Jordan. “I know I’m not very popular. I don’t give big parties. I suppose you’ve got to make your house into a pigsty in order to have any friends—in the modern world.” Angry as I was, as we all were, I was tempted to laugh whenever he opened his mouth. The transition from libertine to prig was so complete. “I’ve got something to tell you, old sport—” began Gatsby. But Daisy guessed at his intention. “Please don’t!” she interrupted helplessly. “Please let’s all go home. Why don’t we all go home?” “That’s a good idea.” I got up. “Come on, Tom. Nobody wants a drink.” “I want to know what Mr. Gatsby has to tell me.” “Your wife doesn’t love you,” said Gatsby. ‘‘She’s never loved you. She loves me.” “You must be crazy!” exclaimed Tom automatically. Gatsby sprang to his feet, vivid with excitement. “She never loved you, do you hear?” he cried. “She only married you because I was poor and she was tired of waiting for me. It was a terrible mistake, but in her heart she never loved any one except me!” At this point Jordan and I tried to go, but Tom and Gatsby insisted with competitive firmness that we remain—as though neither of them had anything to conceal and it would be a privilege to partake vicariously of their emotions. “Sit down, Daisy,” Tom’s voice groped unsuccessfully for the paternal note. “What’s been going on? I want to hear all about it.” “I told you what’s been going on,” said Gatsby. “Going on for five years—and you didn’t know.” Tom turned to Daisy sharply. “You’ve been seeing this fellow for five years?” “Not seeing,” said Gatsby. “No, we couldn’t meet. But both of us loved each other all that time, old sport, and you didn’t know. I used to laugh sometimes”—but there was no laughter in his eyes—“to think that you didn’t know.” “Oh—that’s all.” Tom tapped his thick fingers together like a clergyman and leaned back in his chair. “You’re crazy!” he exploded. “I can’t speak about what happened five years ago, because I didn’t know Daisy then—and I’ll be damned if I see how you got within a mile of her unless you brought the groceries to the back door. But all the rest of that’s a God damned lie. Daisy loved me when she married me and she loves me now.” “No,” said Gatsby, shaking his head. “She does, though. The trouble is that sometimes she gets foolish ideas in her head and doesn’t know what she’s doing.” He nodded sagely. “And what’s more, I love Daisy too. Once in a while I go off on a spree and make a fool of myself, but I always come back, and in my heart I love her all the time.” “You're revolting,” said Daisy. She turned to me, and her voice, dropping an octave lower, filled the room with thrilling scorn: “Do you know why we left Chicago? I’m surprised that they didn’t treat you to the story of that little spree.” Gatsby walked over and stood beside her. “Daisy, that’s all over now,” he said earnestly. “It doesn’t matter any more. Just tell him the truth—that you never loved him—and it’s all wiped out forever.” She looked at him blindly. “Why—how could I love him—possibly?” “You never loved him.” She hesitated. Her eyes fell on Jordan and me with a sort of appeal, as though she realized at last what she was doing—and as though she had never, all along, intended doing anything at all. But it was done now. It was too late. “I never loved him,” she said, with perceptible reluctance. “Not at Kapiolani?” demanded Tom suddenly. “No.” From the ballroom beneath, muffled and suffocating chords were drifting up on hot waves of air. “Not that day I carried you down from the Punch Bowl to keep your shoes dry?” There was a husky tenderness in his tone. . . . “Daisy?” “Please don’t.” Her voice was cold, but the rancor was gone from it. She looked at Gatsby. “There, Jay,” she said—but her hand as she tried to light a cigarette was trembling. Suddenly she threw the cigarette and the burning match on the carpet. “Oh, you want too much!” she cried to Gatsby. “I love you now—isn’t that enough? I can’t help what’s past.” She began to sob helplessly. “I did love him once—but I loved you too.” Gatsby’s eyes opened and closed. “You loved me too?” he repeated. “Even that’s a lie,” said Tom savagely. “She didn’t know you were alive. Why—there’re things between Daisy and me that you’ll never know, things that neither of us can ever forget.” The words seemed to bite physically into Gatsby. “I want to speak to Daisy alone,” he insisted. “She’s all excited now—” “Even alone I can’t say I never loved Tom,” she admitted in a pitiful voice. “It wouldn’t be true.” “Of course it wouldn’t,” agreed Tom. She turned to her husband. “As if it mattered to you,” she said. “Of course it matters. I’m going to take better care of you from now on.” “You don’t understand,” said Gatsby, with a touch of panic. “You’re not going to take care of her any more.” “I’m not?” Tom opened his eyes wide and laughed. He could afford to control himself now. “Why’s that?” “Daisy’s leaving you.” “Nonsense.” “I am, though,” she said with a visible effort. “She’s not leaving me!” Tom’s words suddenly leaned down over Gatsby. “Certainly not for a common swindler who’d have to steal the ring he put on her finger.” “I won’t stand this!” cried Daisy. “Oh, please let’s get out.” “Who are you, anyhow?” broke out Tom. “You’re one of that bunch that hangs around with Meyer Wolfshiem—that much I happen to know. I’ve made a little investigation into your affairs—and I’ll carry it further to-morrow.” “You can suit yourself about that, old sport.” said Gatsby steadily. “I found out what your ‘drug-stores’ were.” He turned to us and spoke rapidly. “He and this Wolfshiem bought up a lot of side-street drug-stores here and in Chicago and sold grain alcohol over the counter. That’s one of his little stunts. I picked him for a bootlegger the first time I saw him, and I wasn’t far wrong.” “What about it?” said Gatsby politely. “I guess your friend Walter Chase wasn’t too proud to come in on it.” “And you left him in the lurch, didn’t you? You let him go to jail for a month over in New Jersey. God! You ought to hear Walter on the subject of you.” “He came to us dead broke. He was very glad to pick up some money, old sport.” “Don’t you call me ‘old sport’!” cried Tom. Gatsby said nothing. “Walter could have you up on the betting laws too, but Wolfshiem scared him into shutting his mouth.” That unfamiliar yet recognizable look was back again in Gatsby’s face. “That drug-store business was just small change,” continued Tom slowly, “but you’ve got something on now that Walter’s afraid to tell me about.” I glanced at Daisy, who was staring terrified between Gatsby and her husband, and at Jordan, who had begun to balance an invisible but absorbing object on the tip of her chin. Then I turned back to Gatsby—and was startled at his expression. He looked—and this is said in all contempt for the babbled slander of his garden—as if he had “killed a man.” For a moment the set of his face could be described in just that fantastic way. It passed, and he began to talk excitedly to Daisy, denying everything, defending his name against accusations that had not been made. But with every word she was drawing further and further into herself, so he gave that up, and only the dead dream fought on as the afternoon slipped away, trying to touch what was no longer tangible, struggling unhappily, undespairingly, toward that lost voice across the room. The voice begged again to go. “Please, Tom! I can’t stand this any more.” Her frightened eyes told that whatever intentions, whatever courage she had had, were definitely gone. “You two start on home, Daisy,” said Tom. “In Mr. Gatsby’s car.” She looked at Tom, alarmed now, but he insisted with magnanimous scorn. “Go on. He won’t annoy you. I think he realizes that his presumptuous little flirtation is over.” They were gone, without a word, snapped out, made accidental, isolated, like ghosts, even from our pity. After a moment Tom got up and began wrapping the unopened bottle of whiskey in the towel. “Want any of this stuff? Jordan? . . . Nick?” I didn’t answer. “Nick?” He asked again. “What?” “Want any?” “No . . . I just remembered that to-day’s my birthday.” I was thirty. Before me stretched the portentous, menacing road of a new decade. It was seven o’clock when we got into the coupé with him and started for Long Island. Tom talked incessantly, exulting and laughing, but his voice was as remote from Jordan and me as the foreign clamor on the sidewalk or the tumult of the elevated overhead. Human sympathy has its limits, and we were content to let all their tragic arguments fade with the city lights behind. Thirty—the promise of a decade of loneliness, a thinning list of single men to know, a thinning brief-case of enthusiasm, thinning hair. But there was Jordan beside me, who, unlike Daisy, was too wise ever to carry well-forgotten dreams from age to age. As we passed over the dark bridge her wan face fell lazily against my coat’s shoulder and the formidable stroke of thirty died away with the reassuring pressure of her hand. So we drove on toward death through the cooling twilight. The young Greek, Michaelis, who ran the coffee joint beside the ashheaps was the principal witness at the inquest. He had slept through the heat until after five, when he strolled over to the garage, and found George Wilson sick in his office—really sick, pale as his own pale hair and shaking all over. Michaelis advised him to go to bed, but Wilson refused, saying that he’d miss a lot of business if he did. While his neighbor was trying to persuade him a violent racket broke out overhead. “I’ve got my wife locked in up there,” explained Wilson calmly. “She’s going to stay there till the day after to-morrow, and then we’re going to move away.” Michaelis was astonished; they had been neighbors for four years, and Wilson had never seemed faintly capable of such a statement. Generally he was one of these worn-out men: when he wasn’t working, he sat on a chair in the doorway and stared at the people and the cars that passed along the road. When any one spoke to him he invariably laughed in an agreeable, colorless way. He was his wife’s man and not his own. So naturally Michaelis tried to find out what had happened, but Wilson wouldn’t say a word—instead he began to throw curious, suspicious glances at his visitor and ask him what he’d been doing at certain times on certain days. Just as the latter was getting uneasy, some workmen came past the door bound for his restaurant, and Michaelis took the opportunity to get away, intending to come back later. But he didn’t. He supposed he forgot to, that’s all. When he came outside again, a little after seven, he was reminded of the conversation because he heard Mrs. Wilson’s voice, loud and scolding, down-stairs in the garage. “Beat me!” he heard her cry. “Throw me down and beat me, you dirty little coward!” A moment later she rushed out into the dusk, waving her hands and shouting—before he could move from his door the business was over. The “death car” as the newspapers called it, didn’t stop; it came out of the gathering darkness, wavered tragically for a moment, and then disappeared around the next bend. Mavromichaelis wasn’t even sure of its color—he told the first policeman that it was light green. The other car, the one going toward New York, came to rest a hundred yards beyond, and it’s driver hurried back to where Myrtle Wilson, her life violently extinguished, knelt in the road and mingled her thick dark blood with the dust. Michaelis and this man reached her first, but when they had torn open her shirtwaist, still damp with perspiration, they saw that her left breast was swinging loose like a flap, and there was no need to listen for the heart beneath. The mouth was wide open and ripped a little at the corners, as though she had choked a little in giving up the tremendous vitality she had stored so long. We saw the three or four automobiles and the crowd when we were still some distance away “Wreck!” said Tom. “That’s good. Wilson’ll have a little business at last.” He slowed down, but still without any intention of stopping, until, as we came nearer, the hushed, intent faces of the people at the garage door made him automatically put on the brakes. “We'll take a look,” he said doubtfully, “just a look.” I became aware now of a hollow, wailing sound which issued incessantly from the garage, a sound which as we got out of the coupé and walked toward the door resolved itself into the words “Oh, my God!” uttered over and over in a gasping moan. “There’s some bad trouble here,” said Tom excitedly. He reached up on tiptoes and peered over a circle of heads into the garage, which was lit only by a yellow light in a swinging metal basket overhead. Then he made a harsh sound in his throat, and with a violent thrusting movement of his powerful arms pushed his way through. The circle closed up again with a running murmur of expostulation; it was a minute before I could see anything at all. Then new arrivals deranged the line, and Jordan and I were pushed suddenly inside. Myrtle Wilson’s body, wrapped in a blanket, and then in another blanket, as though she suffered from a chill in the hot night, lay on a work-table by the wall, and Tom, with his back to us, was bending over it, motionless. Next to him stood a motorcycle policeman taking down names with much sweat and correction in a little book. At first I couldn’t find the source of the high, groaning words that echoed clamorously through the bare garage—then I saw Wilson standing on the raised threshold of his office, swaying back and forth and holding to the doorposts with both hands. Some man was talking to him in a low voice and attempting, from time to time, to lay a hand on his shoulder, but Wilson neither heard nor saw. His eyes would drop slowly from the swinging light to the laden table by the wall, and then jerk back to the light again, and he gave out incessantly his high, horrible call: “Oh, my Ga-od! Oh, my Ga-od! Oh, Ga-od! Oh, my Ga-od!” Presently Tom lifted his head with a jerk and, after staring around the garage with glazed eyes, addressed a mumbled incoherent remark to the policeman. “M-a-v—” the policeman was saying, “—o———” “No, r—” corrected the man, “M-a-v-r-o———” “Listen to me!” muttered Tom fiercely. “r—” said the policeman, “o———” “g———” “g—” He looked up as Tom’s broad hand fell sharply on his shoulder. “What you want, fella?” “What happened?—that’s what I want to know.” “Auto hit her. Ins’antly killed.” “Instantly killed,” repeated Tom, staring. “She ran out ina road. Son-of-a-bitch didn’t even stopus car.” “There was two cars,” said Michaelis, “one comin’, one goin’, see?” “Going where?” asked the policeman keenly. “One goin’ each way. Well, she”—his hand rose toward the blankets but stopped half way and fell to his side—“she ran out there an’ the one comin’ from N’York knock right into her, goin’ thirty or forty miles an hour.” “What’s the name of this place here?” demanded the officer. “Hasn’t got any name.” A pale well-dressed negro stepped near. “It was a yellow car,” he said, “big yellow car. New.” “See the accident?” asked the policeman. “No, but the car passed me down the road, going faster’n forty. Going fifty, sixty.” “Come here and let’s have your name. Look out now. I want to get his name.” Some words of this conversation must have reached Wilson, swaying in the office door, for suddenly a new theme found voice among his gasping cries: “You don’t have to tell me what kind of car it was! I know what kind of car it was!” Watching Tom, I saw the wad of muscle back of his shoulder tighten under his coat. He walked quickly over to Wilson and, standing in front of him seized him, firmly by the upper arms. “You've got to pull yourself together,” he said with soothing gruffness. Wilson’s eyes fell upon Tom; he started up on his tiptoes and then would have collapsed to his knees had not Tom held him upright. “Listen,” said Tom, shaking him a little. “I just got here a minute ago, from New York. I was bringing you that coupé we’ve been talking about. That yellow car I was driving this afternoon wasn’t mine—do you hear? I haven’t seen it all afternoon.” Only the negro and I were near enough to hear what he said, but the policeman caught something in the tone and looked over with truculent eyes. “What’s all that?” he demanded. “I’m a friend of his.” Tom turned his head but kept his hands firm on Wilson’s body. “He says he knows the car that did it. . . . It was a yellow car.” Some dim impulse moved the policeman to look suspiciously at Tom. “And what color’s your car?” “It’s a blue car, a coupé.” “We've come straight from New York,” I said. Some one who had been driving a little behind us confirmed this, and the policeman turned away. “Now, if you'll let me have that name again correct———” Picking up Wilson like a doll, Tom carried him into the office, set him down in a chair, and came back. “If somebody’ll come here and sit with him,” he snapped authoritatively. He watched while the two men standing closest glanced at each other and went unwillingly into the room. Then Tom shut the door on them and came down the single step, his eyes avoiding the table. As he passed close to me he whispered: “Let’s get out.” Self-consciously, with his authoritative arms breaking the way, we pushed through the still gathering crowd, passing a hurried doctor, case in hand, who had been sent for in wild hope half an hour ago. Tom drove slowly until we were beyond the bend—then his foot came down hard, and the coupé raced along through the night. In a little while I heard a low husky sob, and saw that the tears were overflowing down his face. “The God damned coward!” he whimpered. “He didn’t even stop his car.” The Buchanans’ house floated suddenly toward us through the dark rustling trees. Tom stopped beside the porch and looked up at the second floor, where two windows bloomed with light among the vines. “Daisy’s home,” he said. As we got out of the car he glanced at me and frowned slightly. “I ought to have dropped you in West Egg, Nick. There’s nothing we can do to-night.” A change had come over him, and he spoke gravely, and with decision. As we walked across the moonlight gravel to the porch he disposed of the situation in a few brisk phrases. “I’ll telephone for a taxi to take you home, and while you’re waiting you and Jordan better go in the kitchen and have them get you some supper—if you want any.” He opened the door. “Come in.” “No, thanks. But I’d be glad if you’d order me the taxi. I’ll wait outside.” Jordan put her hand on my arm. “Won’t you come in, Nick?” “No, thanks.” I was feeling a little sick and I wanted to be alone. But Jordan lingered for a moment more. “It’s only half-past nine,” she said. I’d be damned if I’d go in; I’d had enough of all of them for one day, and suddenly that included Jordan too. She must have seen something of this in my expression, for she turned abruptly away and ran up the porch steps into the house. I sat down for a few minutes with my head in my hands, until I heard the phone taken up inside and the butler’s voice calling a taxi. Then I walked slowly down the drive away from the house, intending to wait by the gate. I hadn’t gone twenty yards when I heard my name and Gatsby stepped from between two bushes into the path. I must have felt pretty weird by that time, because I could think of nothing except the luminosity of his pink suit under the moon. “What are you doing?” I inquired. “Just standing here, old sport.” Somehow, that seemed a despicable occupation. For all I knew he was going to rob the house in a moment; I wouldn’t have been surprised to see sinister faces, the faces of “Wolfshiem’s people,” behind him in the dark shrubbery. “Did you see any trouble on the road?” he asked after a minute. “Yes.” He hesitated. “Was she killed?” “Yes.” “I thought so; I told Daisy I thought so. It’s better that the shock should all come at once. She stood it pretty well.” He spoke as if Daisy’s reaction was the only thing that mattered. “I got to West Egg by a side road,” he went on, “and left the car in my garage. I don’t think anybody saw us, but of course I can’t be sure.” I disliked him so much by this time that I didn’t find it necessary to tell him he was wrong. “Who was the woman?” he inquired. “Her name was Wilson. Her husband owns the garage. How the devil did it happen?” “Well, I tried to swing the wheel—” He broke off, and suddenly I guessed at the truth. “Was Daisy driving?” “Yes,” he said after a moment, “but of course I'll say I was. You see, when we left New York she was very nervous and she thought it would steady her to drive—and this woman rushed out at us just as we were passing a car coming the other way. It all happened in a minute, but it seemed to me that she wanted to speak to us, thought we were somebody she knew. Well, first Daisy turned away from the woman toward the other car, and then she lost her nerve and turned back. The second my hand reached the wheel I felt the shock—it must have killed her instantly.” “It ripped her open———” “Don’t tell me, old sport.” He winced. “Anyhow—Daisy stepped on it. I tried to make her stop, but she couldn’t, so I pulled on the emergency brake. Then she fell over into my lap and I drove on. “She'll be all right to-morrow,” he said presently. “I’m just going to wait here and see if he tries to bother her about that unpleasantness this afternoon. She’s locked herself into her room, and if he tries any brutality she’s going to turn the light out and on again.” “He won’t touch her,” I said. “He’s not thinking about her.” “I don’t trust him, old sport.” “How long are you going to wait?” “All night, if necessary. Anyhow, till they all go to bed.” A new point of view occurred to me. Suppose Tom found out that Daisy had been driving. He might think he saw a connection in it—he might think anything. I looked at the house; there were two or three bright windows down-stairs and the pink glow from Daisy’s room on the second floor. “You wait here,” I said. “I’ll see if there’s any sign of a commotion.” I walked back along the border of the lawn, traversed the gravel softly, and tiptoed up the veranda steps. The drawing-room curtains were open, and I saw that the room was empty. Crossing the porch where we had dined that June night three months before, I came to a small rectangle of light which I guessed was the pantry window. The blind was drawn, but I found a rift at the sill. Daisy and Tom were sitting opposite each other at the kitchen table, with a plate of cold fried chicken between them, and two bottles of ale. He was talking intently across the table at her, and in his earnestness his hand had fallen upon and covered her own. Once in a while she looked up at him and nodded in agreement. They weren’t happy, and neither of them had touched the chicken or the ale—and yet they weren’t unhappy either. There was an unmistakable air of natural intimacy about the picture, and anybody would have said that they were conspiring together. As I tiptoed from the porch I heard my taxi feeling its way along the dark road toward the house. Gatsby was waiting where I had left him in the drive. “Is it all quiet up there?” he asked anxiously. “Yes, it’s all quiet.” I hesitated. “You’d better come home and get some sleep.” He shook his head. “I want to wait here till Daisy goes to bed. Good night, old sport.” He put his hands in his coat pockets and turned back eagerly to his scrutiny of the house, as though my presence marred the sacredness of the vigil. So I walked away and left him standing there in the moonlight—watching over nothing. ## CHAPTER VIII I couldn’t sleep all night; a fog-horn was groaning incessantly on the Sound, and I tossed half-sick between grotesque reality and savage, frightening dreams. Toward dawn I heard a taxi go up Gatsby’s drive, and immediately I jumped out of bed and began to dress—I felt that I had something to tell him, something to warn him about, and morning would be too late. Crossing his lawn, I saw that his front door was still open and he was leaning against a table in the hall, heavy with dejection or sleep. “Nothing happened,” he said wanly. “I waited, and about four o’clock she came to the window and stood there for a minute and then turned out the light.” His house had never seemed so enormous to me as it did that night when we hunted through the great rooms for cigarettes. We pushed aside curtains that were like pavilions, and felt over innumerable feet of dark wall for electric light switches—once I tumbled with a sort of splash upon the keys of a ghostly piano. There was an inexplicable amount of dust everywhere, and the rooms were musty, as though they hadn’t been aired for many days. I found the humidor on an unfamiliar table, with two stale, dry cigarettes inside. Throwing open the French windows of the drawing-room, we sat smoking out into the darkness. “You ought to go away,” I said. “It’s pretty certain they'll trace your car.” “Go away now, old sport?” “Go to Atlantic City for a week, or up to Montreal.” He wouldn’t consider it. He couldn’t possibly leave Daisy until he knew what she was going to do. He was clutching at some last hope and I couldn’t bear to shake him free. It was this night that he told me the strange story of his youth with Dan Cody—told it to me because “Jay Gatsby” had broken up like glass against Tom’s hard malice, and the long secret extravaganza was played out. I think that he would have acknowledged anything now, without reserve, but he wanted to talk about Daisy. She was the first “nice” girl he had ever known. In various unrevealed capacities he had come in contact with such people, but always with indiscernible barbed wire between. He found her excitingly desirable. He went to her house, at first with other officers from Camp Taylor, then alone. It amazed him—he had never been in such a beautiful house before. But what gave it an air of breathless intensity, was that Daisy lived there—it was as casual a thing to her as his tent out at camp was to him. There was a ripe mystery about it, a hint of bedrooms up-stairs more beautiful and cool than other bedrooms, of gay and radiant activities taking place through its corridors, and of romances that were not musty and laid away already in lavender but fresh and breathing and redolent of this year’s shining motor-cars and of dances whose flowers were scarcely withered. It excited him, too, that many men had already loved Daisy—it increased her value in his eyes. He felt their presence all about the house, pervading the air with the shades and echoes of still vibrant emotions. But he knew that he was in Daisy’s house by a colossal accident. However glorious might be his future as Jay Gatsby, he was at present a penniless young man without a past, and at any moment the invisible cloak of his uniform might slip from his shoulders. So he made the most of his time. He took what he could get, ravenously and unscrupulously—eventually he took Daisy one still October night, took her because he had no real right to touch her hand. He might have despised himself, for he had certainly taken her under false pretenses. I don’t mean that he had traded on his phantom millions, but he had deliberately given Daisy a sense of security; he let her believe that he was a person from much the same strata as herself—that he was fully able to take care of her. As a matter of fact, he had no such facilities—he had no comfortable family standing behind him, and he was liable at the whim of an impersonal government to be blown anywhere about the world. But he didn’t despise himself and it didn’t turn out as he had imagined. He had intended, probably, to take what he could and go—but now he found that he had committed himself to the following of a grail. He knew that Daisy was extraordinary, but he didn’t realize just how extraordinary a “nice” girl could be. She vanished into her rich house, into her rich, full life, leaving Gatsby—nothing. He felt married to her, that was all. When they met again, two days later, it was Gatsby who was breathless, who was, somehow, betrayed. Her porch was bright with the bought luxury of star-shine; the wicker of the settee squeaked fashionably as she turned toward him and he kissed her curious and lovely mouth. She had caught a cold, and it made her voice huskier and more charming than ever, and Gatsby was overwhelmingly aware of the youth and mystery that wealth imprisons and preserves, of the freshness of many clothes, and of Daisy, gleaming like silver, safe and proud above the hot struggles of the poor. “I can’t describe to you how surprised I was to find out I loved her, old sport. I even hoped for a while that she’d throw me over, but she didn’t, because she was in love with me too. She thought I knew a lot because I knew different things from her . . . Well, there I was, ’way off my ambitions, getting deeper in love every minute, and all of a sudden I didn’t care. What was the use of doing great things if I could have a better time telling her what I was going to do?” On the last afternoon before he went abroad, he sat with Daisy in his arms for a long, silent time. It was a cold fall day, with fire in the room and her cheeks flushed. Now and then she moved and he changed his arm a little, and once he kissed her dark shining hair. The afternoon had made them tranquil for a while, as if to give them a deep memory for the long parting the next day promised. They had never been closer in their month of love, nor communicated more profoundly one with another, than when she brushed silent lips against his coat’s shoulder or when he touched the end of her fingers, gently, as though she were asleep. He did extraordinarily well in the war. He was a captain before he went to the front, and following the Argonne battles he got his majority and the command of the divisional machine-guns. After the armistice he tried frantically to get home, but some complication or misunderstanding sent him to Oxford instead. He was worried now—there was a quality of nervous despair in Daisy’s letters. She didn’t see why he couldn’t come. She was feeling the pressure of the world outside, and she wanted to see him and feel his presence beside her and be reassured that she was doing the right thing after all. For Daisy was young and her artificial world was redolent of orchids and pleasant, cheerful snobbery and orchestras which set the rhythm of the year, summing up the sadness and suggestiveness of life in new tunes. All night the saxophones wailed the hopeless comment of the “Beale Street Blues” while a hundred pairs of golden and silver slippers shuffled the shining dust. At the gray tea hour there were always rooms that throbbed incessantly with this low, sweet fever, while fresh faces drifted here and there like rose petals blown by the sad horns around the floor. Through this twilight universe Daisy began to move again with the season; suddenly she was again keeping half a dozen dates a day with half a dozen men, and drowsing asleep at dawn with the beads and chiffon of an evening dress tangled among dying orchids on the floor beside her bed. And all the time something within her was crying for a decision. She wanted her life shaped now, immediately—and the decision must be made by some force—of love, of money, of unquestionable practicality—that was close at hand. That force took shape in the middle of spring with the arrival of Tom Buchanan. There was a wholesome bulkiness about his person and his position, and Daisy was flattered. Doubtless there was a certain struggle and a certain relief. The letter reached Gatsby while he was still at Oxford. It was dawn now on Long Island and we went about opening the rest of the windows down-stairs, filling the house with gray-turning, gold-turning light. The shadow of a tree fell abruptly across the dew and ghostly birds began to sing among the blue leaves. There was a slow, pleasant movement in the air, scarcely a wind, promising a cool, lovely day. “I don’t think she ever loved him.” Gatsby turned around from a window and looked at me challengingly. “You must remember, old sport, she was very excited this afternoon. He told her those things in a way that frightened her—that made it look as if I was some kind of cheap sharper. And the result was she hardly knew what she was saying.” He sat down gloomily. “Of course she might have loved him just for a minute, when they were first married—and loved me more even then, do you see?” Suddenly he came out with a curious remark. “In any case,” he said, “it was just personal.” What could you make of that, except to suspect some intensity in his conception of the affair that couldn’t be measured? He came back from France when Tom and Daisy were still on their wedding trip, and made a miserable but irresistible journey to Louisville on the last of his army pay. He stayed there a week, walking the streets where their footsteps had clicked together through the November night and revisiting the out-of-the-way places to which they had driven in her white car. Just as Daisy’s house had always seemed to him more mysterious and gay than other houses, so his idea of the city itself, even though she was gone from it, was pervaded with a melancholy beauty. He left feeling that if he had searched harder, he might have found her—that he was leaving her behind. The day-coach—he was penniless now—was hot. He went out to the open vestibule and sat down on a folding-chair, and the station slid away and the backs of unfamiliar buildings moved by. Then out into the spring fields, where a yellow trolley raced them for a minute with people in it who might once have seen the pale magic of her face along the casual street. The track curved and now it was going away from the sun, which, as it sank lower, seemed to spread itself in benediction over the vanishing city where she had drawn her breath. He stretched out his hand desperately as if to snatch only a wisp of air, to save a fragment of the spot that she had made lovely for him. But it was all going by too fast now for his blurred eyes and he knew that he had lost that part of it, the freshest and the best, forever. It was nine o’clock when we finished breakfast and went out on the porch. The night had made a sharp difference in the weather and there was an autumn flavor in the air. The gardener, the last one of Gatsby’s former servants, came to the foot of the steps. “I’m going to drain the pool to-day, Mr. Gatsby. Leaves’ll start falling pretty soon, and then there’s always trouble with the pipes.” “Don’t do it to-day,” Gatsby answered. He turned to me apologetically. “You know, old sport, I’ve never used that pool all summer?” I looked at my watch and stood up. “Twelve minutes to my train,” I didn’t want to go to the city. I wasn’t worth a decent stroke of work, but it was more than that—I didn’t want to leave Gatsby. I missed that train, and then another, before I could get myself away. “I’ll call you up,” I said finally. “Do, old sport.” “I’ll call you about noon.” We walked slowly down the steps. “I suppose Daisy’ll call too.” He looked at me anxiously, as if he hoped I’d corroborate this. “I suppose so.” “Well, good-by.” We shook hands and I started away. Just before I reached the hedge I remembered something and turned around. “They’re a rotten crowd,” I shouted across the lawn. “You’re worth the whole damn bunch put together.” I’ve always been glad I said that. It was the only compliment I ever gave him, because I disapproved of him from beginning to end. First he nodded politely, and then his face broke into that radiant and understanding smile, as if we’d been in ecstatic cahoots on that fact all the time. His gorgeous pink rag of a suit made a bright spot of color against the white steps, and I thought of the night when I first came to his ancestral home, three months before. The lawn and drive had been crowded with the faces of those who guessed at his corruption—and he had stood on those steps, concealing his incorruptible dream, as he waved them good-by. I thanked him for his hospitality. We were always thanking him for that—I and the others. “Good-by,” I called. “I enjoyed breakfast, Gatsby.” Up in the city, I tried for a while to list the quotations on an interminable amount of stock, then I fell asleep in my swivel-chair. Just before noon the phone woke me, and I started up with sweat breaking out on my forehead. It was Jordan Baker; she often called me up at this hour because the uncertainty of her own movements between hotels and clubs and private houses made her hard to find in any other way. Usually her voice came over the wire as something fresh and cool, as if a divot from a green golf-links had come sailing in at the office window, but this morning it seemed harsh and dry. “I’ve left Daisy’s house,” she said. “I’m at Hempstead, and I’m going down to Southampton this afternoon.” Probably it had been tactful to leave Daisy’s house, but the act annoyed me, and her next remark made me rigid. “You weren’t so nice to me last night.” “How could it have mattered then?” Silence for a moment. Then: “However—I want to see you.” “I want to see you, too.” “Suppose I don’t go to Southampton, and come into town this afternoon?” “No—I don’t think this afternoon.” “Very well.” “It’s impossible this afternoon. Various———” We talked like that for a while, and then abruptly we weren’t talking any longer. I don’t know which of us hung up with a sharp click, but I know I didn’t care. I couldn’t have talked to her across a tea-table that day if I never talked to her again in this world. I called Gatsby’s house a few minutes later, but the line was busy. I tried four times; finally an exasperated central told me the wire was being kept open for long distance from Detroit. Taking out my time-table, I drew a small circle around the three-fifty train. Then I leaned back in my chair and tried to think. It was just noon. When I passed the ashheaps on the train that morning I had crossed deliberately to the other side of the car. I supposed there’d be a curious crowd around there all day with little boys searching for dark spots in the dust, and some garrulous man telling over and over what had happened, until it became less and less real even to him and he could tell it no longer, and Myrtle Wilson’s tragic achievement was forgotten. Now I want to go back a little and tell what happened at the garage after we left there the night before. They had difficulty in locating the sister, Catherine. She must have broken her rule against drinking that night, for when she arrived she was stupid with liquor and unable to understand that the ambulance had already gone to Flushing. When they convinced her of this, she immediately fainted, as if that was the intolerable part of the affair. Some one, kind or curious, took her in his car and drove her in the wake of her sister’s body. Until long after midnight a changing crowd lapped up against the front of the garage, while George Wilson rocked himself back and forth on the couch inside. For a while the door of the office was open, and every one who came into the garage glanced irresistibly through it. Finally some one said it was a shame, and closed the door. Michaelis and several other men were with him; first, four or five men, later two or three men. Still later Michaelis had to ask the last stranger to wait there fifteen minutes longer, while he went back to his own place and made a pot of coffee. After that, he stayed there alone with Wilson until dawn. About three o’clock the quality of Wilson’s incoherent muttering changed—he grew quieter and began to talk about the yellow car. He announced that he had a way of finding out whom the yellow car belonged to, and then he blurted out that a couple of months ago his wife had come from the city with her face bruised and her nose swollen. But when he heard himself say this, he flinched and began to cry “Oh, my God!” again in his groaning voice. Michaelis made a clumsy attempt to distract him. “How long have you been married, George? Come on there, try and sit still a minute and answer my question. How long have you been married?” “Twelve years.” “Ever had any children? Come on, George, sit still—I asked you a question. Did you ever have any children?” The hard brown beetles kept thudding against the dull light, and whenever Michaelis heard a car go tearing along the road outside it sounded to him like the car that hadn’t stopped a few hours before. He didn’t like to go into the garage, because the work bench was stained where the body had been lying, so he moved uncomfortably around the office—he knew every object in it before morning—and from time to time sat down beside Wilson trying to keep him more quiet. “Have you got a church you go to sometimes, George? Maybe even if you haven’t been there for a long time? Maybe I could call up the church and get a priest to come over and he could talk to you, see?” “Don’t belong to any.” “You ought to have a church, George, for times like this. You must have gone to church once. Didn’t you get married in a church? Listen, George, listen to me. Didn’t you get married in a church?” “That was a long time ago.” The effort of answering broke the rhythm of his rocking—for a moment he was silent. Then the same half-knowing, half-bewildered look came back into his faded eyes. “Look in the drawer there,” he said, pointing at the desk. “Which drawer?” “That drawer—that one.” Michaelis opened the drawer nearest his hand. There was nothing in it but a small, expensive dog-leash, made of leather and braided silver. It was apparently new. “This?” he inquired, holding it up. Wilson stared and nodded. “I found it yesterday afternoon. She tried to tell me about it, but I knew it was something funny.” “You mean your wife bought it?” “She had it wrapped in tissue paper on her bureau.” Michaelis didn’t see anything odd in that, and he gave Wilson a dozen reasons why his wife might have bought the dog-leash. But conceivably Wilson had heard some of these same explanations before, from Myrtle, because he began saying “Oh, my God!” again in a whisper—his comforter left several explanations in the air. “Then he killed her,” said Wilson. His mouth dropped open suddenly. “Who did?” “I have a way of finding out.” “You’re morbid, George,” said his friend. “This has been a strain to you and you don’t know what you're saying. You’d better try and sit quiet till morning.” “He murdered her.” “It was an accident, George.” Wilson shook his head. His eyes narrowed and his mouth widened slightly with the ghost of a superior “Hm!” “I know,” he said definitely, “I’m one of these trusting fellas and I don’t think any harm to nobody, but when I get to know a thing I know it. It was the man in that car. She ran out to speak to him and he wouldn’t stop.” Michaelis had seen this too, but it hadn’t occurred to him that there was any special significance in it. He believed that Mrs. Wilson had been running away from her husband, rather than trying to stop any particular car. “How could she of been like that?” “She’s a deep one,” said Wilson, as if that answered the question. “Ah-h-h———” He began to rock again, and Michaelis stood twisting the leash in his hand. “Maybe you got some friend that I could telephone for, George?” This was a forlorn hope—he was almost sure that Wilson had no friend: there was not enough of him for his wife. He was glad a little later when he noticed a change in the room, a blue quickening by the window, and realized that dawn wasn’t far off. About five o’clock it was blue enough outside to snap off the light. Wilson’s glazed eyes turned out to the ashheaps, where small gray clouds took on fantastic shapes and scurried here and there in the faint dawn wind. “I spoke to her,” he muttered, after a long silence. “I told her she might fool me but she couldn’t fool God. I took her to the window”—with an effort he got up and walked to the rear window and leaned with his face pressed against it—“and I said ‘God knows what you’ve been doing, everything you’ve been doing. You may fool me, but you can’t fool God!’” Standing behind him, Michaelis saw with a shock that he was looking at the eyes of Doctor T. J. Eckleburg, which had just emerged, pale and enormous, from the dissolving night. “God sees everything,” repeated Wilson. “That’s an advertisement,” Michaelis assured him. Something made him turn away from the window and look back into the room. But Wilson stood there a long time, his face close to the window pane, nodding into the twilight. By six o’clock Michaelis was worn out, and grateful for the sound of a car stopping outside. It was one of the watchers of the night before who had promised to come back, so he cooked breakfast for three, which he and the other man ate together. Wilson was quieter now, and Michaelis went home to sleep; when he awoke four hours later and hurried back to the garage, Wilson was gone. His movements—he was on foot all the time—were afterward traced to Port Roosevelt and then to Gad’s Hill, where he bought a sandwich that he didn’t eat, and a cup of coffee. He must have been tired and walking slowly, for he didn’t reach Gad’s Hill until noon. Thus far there was no difficulty in accounting for his time—there were boys who had seen a man “acting sort of crazy,” and motorists at whom he stared oddly from the side of the road. Then for three hours he disappeared from view. The police, on the strength of what he said to Michaelis, that he “had a way of finding out,” supposed that he spent that time going from garage to garage thereabout, inquiring for a yellow car. On the other hand, no garage man who had seen him ever came forward, and perhaps he had an easier, surer way of finding out what he wanted to know. By half-past two he was in West Egg, where he asked some one the way to Gatsby’s house. So by that time he knew Gatsby’s name. At two o’clock Gatsby put on his bathing-suit and left word with the butler that if any one phoned word was to be brought to him at the pool. He stopped at the garage for a pneumatic mattress that had amused his guests during the summer, and the chauffeur helped him pump it up. Then he gave instructions that the open car wasn’t to be taken out under any circumstances—and this was strange, because the front right fender needed repair. Gatsby shouldered the mattress and started for the pool. Once he stopped and shifted it a little, and the chauffeur asked him if he needed help, but he shook his head and in a moment disappeared among the yellowing trees. No telephone message arrived, but the butler went without his sleep and waited for it until four o’clock—until long after there was any one to give it to if it came. I have an idea that Gatsby himself didn’t believe it would come, and perhaps he no longer cared. If that was true he must have felt that he had lost the old warm world, paid a high price for living too long with a single dream. He must have looked up at an unfamiliar sky through frightening leaves and shivered as he found what a grotesque thing a rose is and how raw the sunlight was upon the scarcely created grass. A new world, material without being real, where poor ghosts, breathing dreams like air, drifted fortuitously about . . . like that ashen, fantastic figure gliding toward him through the amorphous trees. The chauffeur—he was one of Wolfshiem’s protégés—heard the shots—afterward he could only say that he hadn’t thought anything much about them. I drove from the station directly to Gatsby’s house and my rushing anxiously up the front steps was the first thing that alarmed any one. But they knew then, I firmly believe. With scarcely a word said, four of us, the chauffeur, butler, gardener, and I, hurried down to the pool. There was a faint, barely perceptible movement of the water as the fresh flow from one end urged its way toward the drain at the other. With little ripples that were hardly the shadows of waves, the laden mattress moved irregularly down the pool. A small gust of wind that scarcely corrugated the surface was enough to disturb its accidental course with its accidental burden. The touch of a cluster of leaves revolved it slowly, tracing, like the leg of transit, a thin red circle in the water. It was after we started with Gatsby toward the house that the gardener saw Wilson’s body a little way off in the grass, and the holocaust was complete. ## CHAPTER IX After two years I remember the rest of that day, and that night and the next day, only as an endless drill of police and photographers and newspaper men in and out of Gatsby’s front door. A rope stretched across the main gate and a policeman by it kept out the curious, but little boys soon discovered that they could enter through my yard, and there were always a few of them clustered open-mouthed about the pool. Some one with a positive manner, perhaps a detective, used the expression “madman” as he bent over Wilson’s body that afternoon, and the adventitious authority of his voice set the key for the newspaper reports next morning. Most of those reports were a nightmare—grotesque, circumstantial, eager, and untrue. When Michaelis’s testimony at the inquest brought to light Wilson’s suspicions of his wife I thought the whole tale would shortly be served up in racy pasquinade—but Catherine, who might have said anything, didn’t say a word. She showed a surprising amount of character about it too—looked at the coroner with determined eyes under that corrected brow of hers, and swore that her sister had never seen Gatsby, that her sister was completely happy with her husband, that her sister had been into no mischief whatever. She convinced herself of it, and cried into her handkerchief, as if the very suggestion was more than she could endure. So Wilson was reduced to a man “deranged by grief” in order that the case might remain in its simplest form. And it rested there. But all this part of it seemed remote and unessential. I found myself on Gatsby’s side, and alone. From the moment I telephoned news of the catastrophe to West Egg village, every surmise about him, and every practical question, was referred to me. At first I was surprised and confused; then, as he lay in his house and didn’t move or breathe or speak, hour upon hour, it grew upon me that I was responsible, because no one else was interested—interested, I mean, with that intense personal interest to which every one has some vague right at the end. I called up Daisy half an hour after we found him, called her instinctively and without hesitation. But she and Tom had gone away early that afternoon, and taken baggage with them. “Left no address?” “No.” “Say when they’d be back?” “No.” “Any idea where they are? How I could reach them?” “I don’t know. Can’t say.” I wanted to get somebody for him. I wanted to go into the room where he lay and reassure him: “I’ll get somebody for you, Gatsby. Don’t worry. Just trust me and I’ll get somebody for you———” Meyer Wolfshiem’s name wasn’t in the phone book. The butler gave me his office address on Broadway, and I called Information, but by the time I had the number it was long after five, and no one answered the phone. “Will you ring again?” “I’ve rung them three times.” “It’s very important.” “Sorry. I’m afraid no one’s there.” I went back to the drawing-room and thought for an instant that they were chance visitors, all these official people who suddenly filled it. But, though they drew back the sheet and looked at Gatsby with shocked eyes, his protest continued in my brain: “Look here, old sport, you’ve got to get somebody for me. You’ve got to try hard. I can’t go through this alone.” Some one started to ask me questions, but I broke away and going up-stairs looked hastily through the unlocked parts of his desk—he’d never told me definitely that his parents were dead. But there was nothing—only the picture of Dan Cody, a token of forgotten violence, staring down from the wall. Next morning I sent the butler to New York with a letter to Wolfshiem, which asked for information and urged him to come out on the next train. That request seemed superfluous when I wrote it. I was sure he’d start when he saw the newspapers, just as I was sure there’d be a wire from Daisy before noon—but neither a wire nor Mr. Wolfshiem arrived; no one arrived except more police and photographers and newspaper men. When the butler brought back Wolfshiem’s answer I began to have a feeling of defiance, of scornful solidarity between Gatsby and me against them all. Dear Mr. Carraway. This has been one of the most terrible shocks of my life to me I hardly can believe it that it is true at all. Such a mad act as that man did should make us all think. I cannot come down now as I am tied up in some very important business and cannot get mixed up in this thing now. If there is anything I can do a little later let me know in a letter by Edgar. I hardly know where I am when I hear about a thing like this and am completely knocked down and out. > Yours truly > > Meyer Wolfshiem and then hasty addenda beneath: Let me know about the funeral etc do not know his family at all. When the phone rang that afternoon and Long Distance said Chicago was calling I thought this would be Daisy at last. But the connection came through as a man’s voice, very thin and far away. “This is Slagle speaking . . .” “Yes?” The name was unfamiliar. “Hell of a note, isn’t it? Get my wire?” “There haven’t been any wires.” “Young Parke’s in trouble,” he said rapidly. “They picked him up when he handed the bonds over the counter. They got a circular from New York giving ’em the numbers just five minutes before. What d’you know about that, hey? You never can tell in these hick towns———” “Hello!” I interrupted breathlessly. “Look here—this isn’t Mr. Gatsby. Mr. Gatsby’s dead.” There was a long silence on the other end of the wire, followed by an exclamation . . . then a quick squawk as the connection was broken. I think it was on the third day that a telegram signed Henry C. Gatz arrived from a town in Minnesota. It said only that the sender was leaving immediately and to postpone the funeral until he came. It was Gatsby’s father, a solemn old man, very helpless and dismayed, bundled up in a long cheap ulster against the warm September day. His eyes leaked continuously with excitement, and when I took the bag and umbrella from his hands he began to pull so incessantly at his sparse gray beard that I had difficulty in getting off his coat. He was on the point of collapse, so I took him into the music room and made him sit down while I sent for something to eat. But he wouldn’t eat, and the glass of milk spilled from his trembling hand. “I saw it in the Chicago newspaper,” he said. “It was all in the Chicago newspaper. I started right away.” “I didn’t know how to reach you.” His eyes, seeing nothing, moved ceaselessly about the room. “It was a madman,” he said. “He must have been mad.” “Wouldn’t you like some coffee?” I urged him. “I don’t want anything. I’m all right now, Mr———” “Carraway.” “Well, I’m all right now. Where have they got Jimmy?” I took him into the drawing-room, where his son lay, and left him there. Some little boys had come up on the steps and were looking into the hall; when I told them who had arrived, they went reluctantly away. After a little while Mr. Gatz opened the door and came out, his mouth ajar, his face flushed slightly, his eyes leaking isolated and unpunctual tears. He had reached an age where death no longer has the quality of ghastly surprise, and when he looked around him now for the first time and saw the height and splendor of the hall and the great rooms opening out from it into other rooms, his grief began to be mixed with an awed pride. I helped him to a bedroom up-stairs; while he took off his coat and vest I told him that all arrangements had been deferred until he came. “I didn’t know what you’d want, Mr. Gatsby———” “Gatz is my name.” “—Mr. Gatz. I thought you might want to take the body West.” He shook his head. “Jimmy always liked it better down East. He rose up to his position in the East. Were you a friend of my boy’s, Mr. ———?” “We were close friends.” “He had a big future before him, you know. He was only a young man, but he had a lot of brain power here.” He touched his head impressively, and I nodded. “If he’d of lived, he’d of been a great man. A man like James J. Hill. He’d of helped build up the country.” “That’s true,” I said, uncomfortably. He fumbled at the embroidered coverlet, trying to take it from the bed, and lay down stiffly—was instantly asleep. That night an obviously frightened person called up, and demanded to know who I was before he would give his name. “This is Mr. Carraway,” I said. “Oh!” He sounded relieved. “This is Klipspringer.” I was relieved too, for that seemed to promise another friend at Gatsby’s grave. I didn’t want it to be in the papers and draw a sightseeing crowd, so I’d been calling up a few people myself. They were hard to find. “The funeral’s to-morrow,” I said. “Three o’clock, here at the house. I wish you’d tell anybody who’d be interested.” “Oh, I will,” he broke out hastily. “Of course I’m not likely to see anybody, but if I do.” His tone made me suspicious. “Of course you’ll be there yourself.” “Well, I’ll certainly try. What I called up about is———” “Wait a minute,” I interrupted. “How about saying you’ll come?” “Well, the fact is—the truth of the matter is that I’m staying with some people up here in Greenwich, and they rather expect me to be with them tomorrow. In fact, there’s a sort of picnic or something. Of course I’ll do my very best to get away.” I ejaculated an unrestrained “Huh!” and he must have heard me, for he went on nervously: “What I called up about was a pair of shoes I left there. I wonder if it’d be too much trouble to have the butler send them on. You see, they’re tennis shoes, and I’m sort of helpless without them. My address is care of B. F.———” I didn’t hear the rest of the name, because I hung up the receiver. After that I felt a certain shame for Gatsby—one gentleman to whom I telephoned implied that he had got what he deserved. However, that was my fault, for he was one of those who used to sneer most bitterly at Gatsby on the courage of Gatsby’s liquor, and I should have known better than to call him. The morning of the funeral I went up to New York to see Meyer Wolfshiem; I couldn’t seem to reach him any other way. The door that I pushed open, on the advice of an elevator boy, was marked “The Swastika Holding Company,” and at first there didn’t seem to be any one inside. But when I’d shouted “hello” several times in vain, an argument broke out behind a partition, and presently a lovely Jewess appeared at an interior door and scrutinized me with black hostile eyes. “Nobody’s in,” she said. “Mr. Wolfshiem’s gone to Chicago.” The first part of this was obviously untrue, for some one had begun to whistle “The Rosary,” tunelessly, inside. “Please say that Mr. Carraway wants to see him.” “I can’t get him back from Chicago, can I?” At this moment a voice, unmistakably Wolfshiem’s, called “Stella!” from the other side of the door. “Leave your name on the desk,” she said quickly. “I’ll give it to him when he gets back.” “But I know he’s there.” She took a step toward me and began to slide her hands indignantly up and down her hips. “You young men think you can force your way in here any time,” she scolded. “We’re getting sick in tired of it. When I say he’s in Chicago, he’s in Chicago.” I mentioned Gatsby. “Oh-h!” She looked at me over again. ‘‘Will you just— What was your name?” She vanished. In a moment Meyer Wolfsheim stood solemnly in the doorway, holding out both hands. He drew me into his office, remarking in a reverent voice that it was a sad time for all of us, and offered me a cigar. “My memory goes back to when first I met him,” he said. “A young major just out of the army and covered over with medals he got in the war. He was so hard up he had to keep on wearing his uniform because he couldn’t buy some regular clothes. First time I saw him was when he come into Winebrenner’s poolroom at Forty-third Street and asked for a job. He hadn’t eat anything for a couple of days. ‘Come on have some lunch with me,’ I sid. He ate more than four dollars’ worth of food in half an hour.” “Did you start him in business?” I inquired. “Start him! I made him.” “Oh.” “I raised him up out of nothing, right out of the gutter. I saw right away he was a fine-appearing, gentlemanly young man, and when he told me he was an Oggsford I knew I could use him good. I got him to join up in the American Legion and he used to stand high there. Right off he did some work for a client of mine up to Albany. We were so thick like that in everything”—he held up two bulbous fingers—“always together.” I wondered if this partnership had included the World’s Series transaction in 1919. “Now he’s dead,” I said after a moment. “You were his closest friend, so I know you'll want to come to his funeral this afternoon.” “I’d like to come.” “Well, come then.” The hair in his nostrils quivered slightly, and as he shook his head his eyes filled with tears. “I can’t do it—I can’t get mixed up in it,” he said. “There’s nothing to get mixed up in. It’s all over now.” “When a man gets killed I never like to get mixed up in it in any way. I keep out. When I was a young man it was different—if a friend of mine died, no matter how, I stuck with them to the end. You may think that’s sentimental, but I mean it—to the bitter end.” I saw that for some reason of his own he was determined not to come, so I stood up. “Are you a college man?” he inquired suddenly. For a moment I thought he was going to suggest a “gonnegtion,” but he only nodded and shook my hand. “Let us learn to show our friendship for a man when he is alive and not after he is dead,” he suggested. “After that my own rule is to let everything alone.” When I left his office the sky had turned dark and I got back to West Egg in a drizzle. After changing my clothes I went next door and found Mr. Gatz walking up and down excitedly in the hall. His pride in his son and in his son’s possessions was continually increasing and now he had something to show me. “Jimmy sent me this picture.” He took out his wallet with trembling fingers. “Look there.” It was a photograph of the house, cracked in the corners and dirty with many hands. He pointed out every detail to me eagerly. “Look there!” and then sought admiration from my eyes. He had shown it so often that I think it was more real to him now than the house itself. “Jimmy sent it to me. I think it’s a very pretty picture. It shows up well.” “Very well. Had you seen him lately?” “He come out to see me two years ago and bought me the house I live in now. Of course we was broke up when he run off from home, but I see now there was a reason for it. He knew he had a big future in front of him. And ever since he made a success he was very generous with me.” He seemed reluctant to put away the picture, held it for another minute, lingeringly, before my eyes. Then he returned the wallet and pulled from his pocket a ragged old copy of a book called “Hopalong Cassidy.” “Look here, this is a book he had when he was a boy. It just shows you.” He opened it at the back cover and turned it around for me to see. On the last fly-leaf was printed the word SCHEDULE, and the date September 12, 1906. And underneath: ``` Rise from bed 6.00 a. m. Dumbbell exercise and wall-scaling 6.15–6.30 „ Study electricity, etc. 7.15–8.15 „ Work 8.30–4.30 p. m. Baseball and sports 4.30–5.00 „ Practice elocution, poise and how to attain it 5.00–6.00 „ Study needed inventions 7.00–9.00 „ ``` > GENERAL RESOLVES > > No wasting time at Shafters or [a name, indecipherable] No more smokeing or > chewing. Bath every other day Read one improving book or magazine per week > Save $5.00 [crossed out] $3.00 per week Be better to parents “I come across this book by accident,” said the old man. “It just shows you, don’t it?” “It just shows you.” “Jimmy was bound to get ahead. He always had some resolves like this or something. Do you notice what he’s got about improving his mind? He was always great for that. He told me I et like a hog once, and I beat him for it.” He was reluctant to close the book, reading each item aloud and then looking eagerly at me. I think he rather expected me to copy down the list for my own use. A little before three the Lutheran minister arrived from Flushing, and I began to look involuntarily out the windows for other cars. So did Gatsby’s father. And as the time passed and the servants came in and stood waiting in the hall, his eyes began to blink anxiously, and he spoke of the rain in a worried, uncertain way. The minister glanced several times at his watch, so I took him aside and asked him to wait for half an hour. But it wasn’t any use. Nobody came. About five o’clock our procession of three cars reached the cemetery and stopped in a thick drizzle beside the gate—first a motor hearse, horribly black and wet, then Mr. Gatz and the minister and I in the limousine, and a little later four or five servants and the postman from West Egg, in Gatsby’s station wagon, all wet to the skin. As we started through the gate into the cemetery I heard a car stop and then the sound of some one splashing after us over the soggy ground. I looked around. It was the man with owl-eyed glasses whom I had found marvelling over Gatsby’s books in the library one night three months before. I'd never seen him since then. I don’t know how he knew about the funeral, or even his name. The rain poured down his thick glasses, and he took them off and wiped them to see the protecting canvas unrolled from Gatsby’s grave. I tried to think about Gatsby then for a moment, but he was already too far away, and I could only remember, without resentment, that Daisy hadn’t sent a message or a flower. Dimly I heard some one murmur “Blessed are the dead that the rain falls on,” and then the owl-eyed man said “Amen to that,” in a brave voice. We straggled down quickly through the rain to the cars. Owl-eyes spoke to me by the gate. “I couldn’t get to the house,” he remarked. “Neither could anybody else.” “Go on!” He started. “Why, my God! they used to go there by the hundreds.” He took off his glasses and wiped them again, outside and in. “The poor son-of-a-bitch,” he said. One of my most vivid memories is of coming back West from prep school and later from college at Christmas time. Those who went farther than Chicago would gather in the old dim Union Street station at six o’clock of a December evening, with a few Chicago friends, already caught up into their own holiday gayeties, to bid them a hasty good-by. I remember the fur coats of the girls returning from Miss This-or-That’s and the chatter of frozen breath and the hands waving overhead as we caught sight of old acquaintances, and the matchings of invitations: “Are you going to the Ordways’? the Herseys’? the Schultzes’?” and the long green tickets clasped tight in our gloved hands. And last the murky yellow cars of the Chicago, Milwaukee & St. Paul railroad looking cheerful as Christmas itself on the tracks beside the gate. When we pulled out into the winter night and the real snow, our snow, began to stretch out beside us and twinkle against the windows, and the dim lights of small Wisconsin stations moved by, a sharp wild brace came suddenly into the air. We drew in deep breaths of it as we walked back from dinner through the cold vestibules, unutterably aware of our identity with this country for one strange hour, before we melted indistinguishably into it again. That’s my Middle West—not the wheat or the prairies or the lost Swede towns, but the thrilling returning trains of my youth, and the street lamps and sleigh bells in the frosty dark and the shadows of holly wreaths thrown by lighted windows on the snow. I am part of that, a little solemn with the feel of those long winters, a little complacent from growing up in the Carraway house in a city where dwellings are still called through decades by a family’s name. I see now that this has been a story of the West, after all—Tom and Gatsby, Daisy and Jordan and I, were all Westerners, and perhaps we possessed some deficiency in common which made us subtly unadaptable to Eastern life. Even when the East excited me most, even when I was most keenly aware of its superiority to the bored, sprawling, swollen towns beyond the Ohio, with their interminable inquisitions which spared only the children and the very old—even then it had always for me a quality of distortion. West Egg, especially, still figures in my more fantastic dreams. I see it as a night scene by El Greco: a hundred houses, at once conventional and grotesque, crouching under a sullen, overhanging sky and a lustreless moon. In the foreground four solemn men in dress suits are walking along the sidewalk with a stretcher on which lies a drunken woman in a white evening dress. Her hand, which dangles over the side, sparkles cold with jewels. Gravely the men turn in at a house—the wrong house. But no one knows the woman’s name, and no one cares. After Gatsby’s death the East was haunted for me like that, distorted beyond my eyes’ power of correction. So when the blue smoke of brittle leaves was in the air and the wind blew the wet laundry stiff on the line I decided to come back home. There was one thing to be done before I left, an awkward, unpleasant thing that perhaps had better have been let alone. But I wanted to leave things in order and not just trust that obliging and indifferent sea to sweep my refuse away. I saw Jordan Baker and talked over and around what had happened to us together, and what had happened afterward to me, and she lay perfectly still, listening, in a big chair. She was dressed to play golf, and I remember thinking she looked like a good illustration, her chin raised a little jauntily, her hair the color of an autumn leaf, her face the same brown tint as the fingerless glove on her knee. When I had finished she told me without comment that she was engaged to another man. I doubted that, though there were several she could have married at a nod of her head, but I pretended to be surprised. For just a minute I wondered if I wasn’t making a mistake, then I thought it all over again quickly and got up to say good-by. “Nevertheless you did throw me over,” said Jordan suddenly. ‘‘You threw me over on the telephone. I don’t give a damn about you now, but it was a new experience for me, and I felt a little dizzy for a while.” We shook hands. “Oh, and do you remember”—she added—“a conversation we had once about driving a car?” “Why—not exactly.” “You said a bad driver was only safe until she met another bad driver? Well, I met another bad driver, didn’t I? I mean it was careless of me to make such a wrong guess. I thought you were rather an honest, straightforward person. I thought it was your secret pride.” “I’m thirty,” I said. “I’m five years too old to lie to myself and call it honor.” She didn’t answer. Angry, and half in love with her, and tremendously sorry, I turned away. One afternoon late in October I saw Tom Buchanan. He was walking ahead of me along Fifth Avenue in his alert, aggressive way, his hands out a little from his body as if to fight off interference, his head moving sharply here and there, adapting itself to his restless eyes. Just as I slowed up to avoid overtaking him he stopped and began frowning into the windows of a jewelry store. Suddenly he saw me and walked back, holding out his hand. “What’s the matter, Nick? Do you object to shaking hands with me?” “Yes. You know what I think of you.” “You're crazy, Nick,” he said quickly. “Crazy as hell. I don’t know what’s the matter with you.” “Tom,” I inquired, “what did you say to Wilson that afternoon?” He stared at me without a word, and I knew I had guessed right about those missing hours. I started to turn away, but he took a step after me and grabbed my arm. “I told him the truth,” he said. “He came to the door while we were getting ready to leave, and when I sent down word that we weren’t in he tried to force his way up-stairs. He was crazy enough to kill me if I hadn’t told him who owned the car. His hand was on a revolver in his pocket every minute he was in the house—” He broke off defiantly. “What if I did tell him? That fellow had it coming to him. He threw dust into your eyes just like he did in Daisy’s, but he was a tough one. He ran over Myrtle like you’d run over a dog and never even stopped his car.” There was nothing I could say, except the one unutterable fact that it wasn’t true. “And if you think I didn’t have my share of suffering—look here, when I went to give up that flat and saw that damn box of dog biscuits sitting there on the sideboard, I sat down and cried like a baby. By God it was awful—” I couldn’t forgive him or like him, but I saw that what he had done was, to him, entirely justified. It was all very careless and confused. They were careless people, Tom and Daisy—they smashed up things and creatures and then retreated back into their money or their vast carelessness, or whatever it was that kept them together, and let other people clean up the mess they had made. . . . I shook hands with him; it seemed silly not to, for I felt suddenly as though I were talking to a child. Then he went into the jewelry store to buy a pearl necklace—or perhaps only a pair of cuff buttons—rid of my provincial squeamishness forever. Gatsby’s house was still empty when I left—the grass on his lawn had grown as long as mine. One of the taxi drivers in the village never took a fare past the entrance gate without stopping for a minute and pointing inside; perhaps it was he who drove Daisy and Gatsby over to East Egg the night of the accident, and perhaps he had made a story about it all his own. I didn’t want to hear it and I avoided him when I got off the train. I spent my Saturday nights in New York because those gleaming, dazzling parties of his were with me so vividly that I could still hear the music and the laughter, faint and incessant, from his garden, and the cars going up and down his drive. One night I did hear a material car there, and saw its lights stop at his front steps. But I didn’t investigate. Probably it was some final guest who had been away at the ends of the earth and didn’t know that the party was over. On the last night, with my trunk packed and my car sold to the grocer, I went over and looked at that huge incoherent failure of a house once more. On the white steps an obscene word, scrawled by some boy with a piece of brick, stood out clearly in the moonlight, and I erased it, drawing my shoe raspingly along the stone. Then I wandered down to the beach and sprawled out on the sand. Most of the big shore places were closed now and there were hardly any lights except the shadowy, moving glow of a ferryboat across the Sound. And as the moon rose higher the inessential houses began to melt away until gradually I became aware of the old island here that flowered once for Dutch sailors’ eyes—a fresh, green breast of the new world. Its vanished trees, the trees that had made way for Gatsby’s house, had once pandered in whispers to the last and greatest of all human dreams; for a transitory enchanted moment man must have held his breath in the presence of this continent, compelled into an esthetic contemplation he neither understood nor desired, face to face for the last time in history with something commensurate to his capacity for wonder. And as I sat there brooding on the old, unknown world, I thought of Gatsby’s wonder when he first picked out the green light at the end of Daisy’s dock. He had come a long way to this blue lawn, and his dream must have seemed so close that he could hardly fail to grasp it. He did not know that it was already behind him, somewhere back in that vast obscurity beyond the city, where the dark fields of the republic rolled on under the night. Gatsby believed in the green light, the orgastic future that year by year recedes before us. It eluded us then, but that’s no matter—to-morrow we will run faster, stretch out our arms farther. . . . And one fine morning——— So we beat on, boats against the current, borne back ceaselessly into the past. ================================================ FILE: harper-core/tests/text/linters/Alice's Adventures in Wonderland.snap.yml ================================================ Lint: Readability (127 priority) Message: | 9 | Alice was beginning to get very tired of sitting by her sister on the bank, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10 | of having nothing to do: once or twice she had peeped into the book her sister | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 | was reading, but it had no pictures or conversations in it, “and what is the use | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 12 | of a book,” thought Alice “without pictures or conversations?” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 57 words long. Lint: Readability (127 priority) Message: | 14 | So she was considering in her own mind (as well as she could, for the hot day | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 15 | made her feel very sleepy and stupid), whether the pleasure of making a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 16 | daisy-chain would be worth the trouble of getting up and picking the daisies, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 17 | when suddenly a White Rabbit with pink eyes ran close by her. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Readability (127 priority) Message: | 21 | be late!” (when she thought it over afterwards, it occurred to her that she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 22 | ought to have wondered at this, but at the time it all seemed quite natural); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 23 | but when the Rabbit actually took a watch out of its waistcoat-pocket, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 | looked at it, and then hurried on, Alice started to her feet, for it flashed | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 | across her mind that she had never before seen a rabbit with either a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 26 | waistcoat-pocket, or a watch to take out of it, and burning with curiosity, she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 27 | ran across the field after it, and fortunately was just in time to see it pop | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 28 | down a large rabbit-hole under the hedge. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 109 words long. Lint: Spelling (63 priority) Message: | 21 | be late!” (when she thought it over afterwards, it occurred to her that she | ^~~~~~~~~~ Did you mean to spell `afterwards` this way? 22 | ought to have wondered at this, but at the time it all seemed quite natural); Suggest: - Replace with: “afterwords” - Replace with: “afterward” - Replace with: “afterword's” Lint: Readability (127 priority) Message: | 39 | next. First, she tried to look down and make out what she was coming to, but it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 40 | was too dark to see anything; then she looked at the sides of the well, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41 | noticed that they were filled with cupboards and book-shelves; here and there | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 42 | she saw maps and pictures hung upon pegs. She took down a jar from one of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Readability (127 priority) Message: | 42 | she saw maps and pictures hung upon pegs. She took down a jar from one of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 43 | shelves as she passed; it was labelled “ORANGE MARMALADE”, but to her great | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 44 | disappointment it was empty: she did not like to drop the jar for fear of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 | killing somebody underneath, so managed to put it into one of the cupboards as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 | she fell past it. | ~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Spelling (63 priority) Message: | 43 | shelves as she passed; it was labelled “ORANGE MARMALADE”, but to her great | ^~~~~~~~ Did you mean to spell `labelled` this way? Suggest: - Replace with: “labeled” - Replace with: “labeler” - Replace with: “labelless” Lint: Spelling (63 priority) Message: | 54 | I’ve fallen by this time?” she said aloud. “I must be getting somewhere near the 55 | centre of the earth. Let me see: that would be four thousand miles down, I | ^~~~~~ Did you mean to spell `centre` this way? Suggest: - Replace with: “center” - Replace with: “cent's” - Replace with: “censure” Lint: Readability (127 priority) Message: | 55 | centre of the earth. Let me see: that would be four thousand miles down, I | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | think—” (for, you see, Alice had learnt several things of this sort in her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | lessons in the schoolroom, and though this was not a very good opportunity for | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | showing off her knowledge, as there was no one to listen to her, still it was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 59 | good practice to say it over) “—yes, that’s about the right distance—but then I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 60 | wonder what Latitude or Longitude I’ve got to?” (Alice had no idea what Latitude | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 78 words long. Lint: Enhancement (31 priority) Message: | 57 | lessons in the schoolroom, and though this was not a very good opportunity for | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` 58 | showing off her knowledge, as there was no one to listen to her, still it was Suggest: - Replace with: “excellent” Lint: Agreement (31 priority) Message: | 65 | downward! The Antipathies, I think—” (she was rather glad there was no one | ^~~~ 66 | listening, this time, as it didn’t sound at all the right word) “—but I shall | ~~~~~~~~~ `listening` is a mass noun. Suggest: - Replace with: “one piece of listening” Lint: Spelling (63 priority) Message: | 68 | this New Zealand or Australia?” (and she tried to curtsey as she spoke—fancy | ^~~~~~~ Did you mean to spell `curtsey` this way? 69 | curtseying as you’re falling through the air! Do you think you could manage it?) Suggest: - Replace with: “curtsy” - Replace with: “courtesy” - Replace with: “curse” Lint: Spelling (63 priority) Message: | 68 | this New Zealand or Australia?” (and she tried to curtsey as she spoke—fancy 69 | curtseying as you’re falling through the air! Do you think you could manage it?) | ^~~~~~~~~~ Did you mean `curtsying`? Suggest: - Replace with: “curtsying” Lint: Spelling (63 priority) Message: | 74 | again. “Dinah’ll miss me very much to-night, I should think!” (Dinah was the | ^~~~~~~~ Did you mean `Dinah's`? Suggest: - Replace with: “Dinah's” Lint: Capitalization (31 priority) Message: | 84 | ever eat a bat?” when suddenly, thump! thump! down she came upon a heap of | ^~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Thump” Lint: Capitalization (31 priority) Message: | 84 | ever eat a bat?” when suddenly, thump! thump! down she came upon a heap of | ^~~~ This sentence does not start with a capital letter 85 | sticks and dry leaves, and the fall was over. Suggest: - Replace with: “Down” Lint: Readability (127 priority) Message: | 87 | Alice was not a bit hurt, and she jumped up on to her feet in a moment: she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | looked up, but it was all dark overhead; before her was another long passage, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 89 | and the White Rabbit was still in sight, hurrying down it. There was not a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 96 | There were doors all round the hall, but they were all locked; and when Alice | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 97 | had been all the way down one side and up the other, trying every door, she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 98 | walked sadly down the middle, wondering how she was ever to get out again. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Readability (127 priority) Message: | 100 | Suddenly she came upon a little three-legged table, all made of solid glass; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 101 | there was nothing on it except a tiny golden key, and Alice’s first thought was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | that it might belong to one of the doors of the hall; but, alas! either the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Capitalization (31 priority) Message: | 102 | that it might belong to one of the doors of the hall; but, alas! either the | ^~~~~~ This sentence does not start with a capital letter 103 | locks were too large, or the key was too small, but at any rate it would not Suggest: - Replace with: “Either” Lint: Readability (127 priority) Message: | 104 | open any of them. However, on the second time round, she came upon a low curtain | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | she had not noticed before, and behind it was a little door about fifteen inches | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | high: she tried the little golden key in the lock, and to her great delight it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 107 | fitted! | ~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 111 | loveliest garden you ever saw. How she longed to get out of that dark hall, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 112 | wander about among those beds of bright flowers and those cool fountains, but | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | she could not even get her head through the doorway; “and even if my head would | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 114 | go through,” thought poor Alice, “it would be of very little use without my | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 115 | shoulders. Oh, how I wish I could shut up like a telescope! I think I could, if | ~~~~~~~~~~ This sentence is 55 words long. Lint: Readability (127 priority) Message: | 120 | There seemed to be no use in waiting by the little door, so she went back to the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | table, half hoping she might find another key on it, or at any rate a book of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 122 | rules for shutting people up like telescopes: this time she found a little | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 123 | bottle on it, (“which certainly was not here before,” said Alice,) and round the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 124 | neck of the bottle was a paper label, with the words “DRINK ME,” beautifully | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | printed on it in large letters. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 82 words long. Lint: Readability (127 priority) Message: | 128 | to do that in a hurry. “No, I’ll look first,” she said, “and see whether it’s | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | marked ‘poison’ or not”; for she had read several nice little histories about | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 130 | children who had got burnt, and eaten up by wild beasts and other unpleasant | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 131 | things, all because they would not remember the simple rules their friends had | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 132 | taught them: such as, that a red-hot poker will burn you if you hold it too | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | long; and that if you cut your finger very deeply with a knife, it usually | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 134 | bleeds; and she had never forgotten that, if you drink much from a bottle marked | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 135 | “poison,” it is almost certain to disagree with you, sooner or later. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 109 words long. Lint: Readability (127 priority) Message: | 137 | However, this bottle was not marked “poison,” so Alice ventured to taste it, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 138 | finding it very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 139 | custard, pine-apple, roast turkey, toffee, and hot buttered toast,) she very | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 140 | soon finished it off. | ~~~~~~~~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: Spelling (63 priority) Message: | 138 | finding it very nice, (it had, in fact, a sort of mixed flavour of cherry-tart, | ^~~~~~~ Did you mean to spell `flavour` this way? 139 | custard, pine-apple, roast turkey, toffee, and hot buttered toast,) she very Suggest: - Replace with: “flavor” - Replace with: “favor” - Replace with: “flour” Lint: Readability (127 priority) Message: | 146 | door into that lovely garden. First, however, she waited for a few minutes to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 147 | see if she was going to shrink any further: she felt a little nervous about | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 148 | this; “for it might end, you know,” said Alice to herself, “in my going out | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | altogether, like a candle. I wonder what I should be like then?” And she tried | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Capitalization (31 priority) Message: | 154 | garden at once; but, alas for poor Alice! when she got to the door, she found | ^~~~ This sentence does not start with a capital letter 155 | she had forgotten the little golden key, and when she went back to the table for Suggest: - Replace with: “When” Lint: Readability (127 priority) Message: | 154 | garden at once; but, alas for poor Alice! when she got to the door, she found | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 155 | she had forgotten the little golden key, and when she went back to the table for | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 156 | it, she found she could not possibly reach it: she could see it quite plainly | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | through the glass, and she tried her best to climb up one of the legs of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 158 | table, but it was too slippery; and when she had tired herself out with trying, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 159 | the poor little thing sat down and cried. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 79 words long. Lint: Readability (127 priority) Message: | 162 | sharply; “I advise you to leave off this minute!” She generally gave herself | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | very good advice, (though she very seldom followed it), and sometimes she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 164 | scolded herself so severely as to bring tears into her eyes; and once she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | remembered trying to box her own ears for having cheated herself in a game of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 166 | croquet she was playing against herself, for this curious child was very fond of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | pretending to be two people. “But it’s no use now,” thought poor Alice, “to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 64 words long. Lint: Enhancement (31 priority) Message: | 162 | sharply; “I advise you to leave off this minute!” She generally gave herself 163 | very good advice, (though she very seldom followed it), and sometimes she | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “excellent” Lint: Readability (127 priority) Message: | 173 | beautifully marked in currants. “Well, I’ll eat it,” said Alice, “and if it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 174 | makes me grow larger, I can reach the key; and if it makes me grow smaller, I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | can creep under the door; so either way I’ll get into the garden, and I don’t | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 176 | care which happens!” | ~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Readability (127 priority) Message: | 178 | She ate a little bit, and said anxiously to herself, “Which way? Which way?”, 179 | holding her hand on the top of her head to feel which way it was growing, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | she was quite surprised to find that she remained the same size: to be sure, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | this generally happens when one eats cake, but Alice had got so much into the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 182 | way of expecting nothing but out-of-the-way things to happen, that it seemed | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 183 | quite dull and stupid for life to go on in the common way. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 75 words long. Lint: Spelling (63 priority) Message: | 189 | “Curiouser and curiouser!” cried Alice (she was so much surprised, that for the | ^~~~~~~~~ Did you mean to spell `Curiouser` this way? Suggest: - Replace with: “Curious” - Replace with: “Carouser” - Replace with: “Curiously” Lint: Spelling (63 priority) Message: | 189 | “Curiouser and curiouser!” cried Alice (she was so much surprised, that for the | ^~~~~~~~~ Did you mean to spell `curiouser` this way? Suggest: - Replace with: “curious” - Replace with: “carouser” - Replace with: “curiously” Lint: Readability (127 priority) Message: | 194 | stockings for you now, dears? I’m sure I shan’t be able! I shall be a great deal | ^~~~~~~~~~~~~~~~~~~~~~~~ 195 | too far off to trouble myself about you: you must manage the best way you | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 196 | can;—but I must be kind to them,” thought Alice, “or perhaps they won’t walk the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | way I want to go! Let me see: I’ll give them a new pair of boots every | ~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Formatting (255 priority) Message: | 201 | the carrier,” she thought; “and how funny it’ll seem, sending presents to one’s | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 206 | Oh dear, what nonsense I’m talking!” | ^ This quote has no termination. Lint: Capitalization (31 priority) Message: | 226 | himself as he came, “Oh! the Duchess, the Duchess! Oh! won’t she be savage if | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “The” Lint: Capitalization (31 priority) Message: | 226 | himself as he came, “Oh! the Duchess, the Duchess! Oh! won’t she be savage if | ^~~~~ This sentence does not start with a capital letter 227 | I’ve kept her waiting!” Alice felt so desperate that she was ready to ask help Suggest: - Replace with: “Won’t” Lint: Readability (127 priority) Message: | 227 | I’ve kept her waiting!” Alice felt so desperate that she was ready to ask help | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 228 | of any one; so, when the Rabbit came near her, she began, in a low, timid voice, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 229 | “If you please, sir—” The Rabbit started violently, dropped the white kid gloves | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | and the fan, and skurried away into the darkness as hard as he could go. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Spelling (63 priority) Message: | 229 | “If you please, sir—” The Rabbit started violently, dropped the white kid gloves 230 | and the fan, and skurried away into the darkness as hard as he could go. | ^~~~~~~~ Did you mean to spell `skurried` this way? Suggest: - Replace with: “scurried” - Replace with: “spurred” - Replace with: “scurries” Lint: Miscellaneous (31 priority) Message: | 238 | puzzle!” And she began thinking over all the children she knew that were of the | ^~~~~~~~ Did you mean the closed compound `overall`? Suggest: - Replace with: “overall” Lint: Capitalization (31 priority) Message: | 243 | all sorts of things, and she, oh! she knows such a very little! Besides, she’s | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “She” Lint: Readability (127 priority) Message: | 249 | Rome—no, that’s all wrong, I’m certain! I must have been changed for Mabel! I’ll | ^~~~~ 250 | try and say ‘How doth the little—’” and she crossed her hands on her lap as if | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | she were saying lessons, and began to repeat it, but her voice sounded hoarse | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | and strange, and the words did not come the same as they used to do:— | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Formatting (255 priority) Message: | 254 | > “How doth the little crocodile Improve his shining tail, And pour the waters | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 260 | “I’m sure those are not the right words,” said poor Alice, and her eyes filled | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | with tears again as she went on, “I must be Mabel after all, and I shall have to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 262 | go and live in that poky little house, and have next to no toys to play with, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | and oh! ever so many lessons to learn! No, I’ve made up my mind about it; if I’m | ~~~~~~~ This sentence is 52 words long. Lint: Capitalization (31 priority) Message: | 263 | and oh! ever so many lessons to learn! No, I’ve made up my mind about it; if I’m | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Ever” Lint: Readability (127 priority) Message: | 273 | “How can I have done that?” she thought. “I must be growing small again.” She | ^~~~ 274 | got up and went to the table to measure herself by it, and found that, as nearly | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | as she could guess, she was now about two feet high, and was going on shrinking | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 276 | rapidly: she soon found out that the cause of this was the fan she was holding, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 277 | and she dropped it hastily, just in time to avoid shrinking away altogether. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 63 words long. Lint: Capitalization (31 priority) Message: | 281 | garden!” and she ran with all speed back to the little door: but, alas! the | ^~~ This sentence does not start with a capital letter 282 | little door was shut again, and the little golden key was lying on the glass Suggest: - Replace with: “The” Lint: Capitalization (31 priority) Message: | 287 | As she said these words her foot slipped, and in another moment, splash! she was | ^~~ This sentence does not start with a capital letter 288 | up to her chin in salt water. Her first idea was that she had somehow fallen Suggest: - Replace with: “She” Lint: WordChoice (63 priority) Message: | 287 | As she said these words her foot slipped, and in another moment, splash! she was 288 | up to her chin in salt water. Her first idea was that she had somehow fallen | ^~~~~~~~~~ Did you mean the closed compound noun “saltwater”? Suggest: - Replace with: “saltwater” Lint: Readability (127 priority) Message: | 290 | (Alice had been to the seaside once in her life, and had come to the general | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | conclusion, that wherever you go to on the English coast you find a number of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 292 | bathing machines in the sea, some children digging in the sand with wooden | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | spades, then a row of lodging houses, and behind them a railway station.) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 57 words long. Lint: Readability (127 priority) Message: | 302 | Just then she heard something splashing about in the pool a little way off, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 303 | she swam nearer to make out what it was: at first she thought it must be a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | walrus or hippopotamus, but then she remembered how small she was now, and she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 305 | soon made out that it was only a mouse that had slipped in like herself. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 61 words long. Lint: Readability (127 priority) Message: | 311 | Mouse!” (Alice thought this must be the right way of speaking to a mouse: she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | had never done such a thing before, but she remembered having seen in her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 313 | brother’s Latin Grammar, “A mouse—of a mouse—to a mouse—a mouse—O mouse!”) The | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 320 | she began again: “Où est ma chatte?” which was the first sentence in her French | ^~ Did you mean to spell `Où` this way? Suggest: - Replace with: “Of” - Replace with: “Oh” - Replace with: “Oi” Lint: Capitalization (127 priority) Message: | 320 | she began again: “Où est ma chatte?” which was the first sentence in her French | ^~~ This word's canonical spelling is all-caps. Suggest: - Replace with: “EST” Lint: Spelling (63 priority) Message: | 320 | she began again: “Où est ma chatte?” which was the first sentence in her French | ^~~ Did you mean to spell `est` this way? Suggest: - Replace with: “east” - Replace with: “eat” - Replace with: “esp” Lint: Spelling (63 priority) Message: | 320 | she began again: “Où est ma chatte?” which was the first sentence in her French | ^~~~~~ Did you mean to spell `chatte` this way? Suggest: - Replace with: “chaste” - Replace with: “chatted” - Replace with: “chattel” Lint: Readability (127 priority) Message: | 330 | cats if you could only see her. She is such a dear quiet thing,” Alice went on, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | half to herself, as she swam lazily about in the pool, “and she sits purring so | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 332 | nicely by the fire, licking her paws and washing her face—and she is such a nice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | soft thing to nurse—and she’s such a capital one for catching mice—oh, I beg | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 334 | your pardon!” cried Alice again, for this time the Mouse was bristling all over, | ~~~~~~~~~~~~ This sentence is 61 words long. Lint: Readability (127 priority) Message: | 346 | curly brown hair! And it’ll fetch things when you throw them, and it’ll sit up | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 347 | and beg for its dinner, and all sorts of things—I can’t remember half of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 348 | them—and it belongs to a farmer, you know, and he says it’s so useful, it’s | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 349 | worth a hundred pounds! He says it kills all the rats and—oh dear!” cried Alice | ~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Readability (127 priority) Message: | 355 | talk about cats or dogs either, if you don’t like them!” When the Mouse heard | ^~~~~~~~~~~~~~~~~~~~~ 356 | this, it turned round and swam slowly back to her: its face was quite pale (with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | passion, Alice thought), and it said in a low trembling voice, “Let us get to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 358 | the shore, and then I’ll tell you my history, and you’ll understand why it is I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | hate cats and dogs.” | ~~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Miscellaneous (31 priority) Message: | 361 | It was high time to go, for the pool was getting quite crowded with the birds | ^~~~ You may be missing a preposition here. Lint: Spelling (63 priority) Message: | 362 | and animals that had fallen into it: there were a Duck and a Dodo, a Lory and an | ^~~~ Did you mean to spell `Lory` this way? 363 | Eaglet, and several other curious creatures. Alice led the way, and the whole Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Spelling (63 priority) Message: | 368 | They were indeed a queer-looking party that assembled on the bank—the birds with 369 | draggled feathers, the animals with their fur clinging close to them, and all | ^~~~~~~~ Did you mean to spell `draggled` this way? Suggest: - Replace with: “dragged” - Replace with: “drugged” - Replace with: “dangled” Lint: Readability (127 priority) Message: | 372 | The first question of course was, how to get dry again: they had a consultation | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | about this, and after a few minutes it seemed quite natural to Alice to find | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 374 | herself talking familiarly with them, as if she had known them all her life. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 375 | Indeed, she had quite a long argument with the Lory, who at last turned sulky, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | and would only say, “I am older than you, and must know better;” and this Alice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 377 | would not allow without knowing how old it was, and, as the Lory positively | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | refused to tell its age, there was no more to be said. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 57 words long. Lint: Spelling (63 priority) Message: | 375 | Indeed, she had quite a long argument with the Lory, who at last turned sulky, | ^~~~ Did you mean to spell `Lory` this way? 376 | and would only say, “I am older than you, and must know better;” and this Alice Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Spelling (63 priority) Message: | 377 | would not allow without knowing how old it was, and, as the Lory positively | ^~~~ Did you mean to spell `Lory` this way? 378 | refused to tell its age, there was no more to be said. Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Spelling (63 priority) Message: | 387 | driest thing I know. Silence all round, if you please! ‘William the Conqueror, 388 | whose cause was favoured by the pope, was soon submitted to by the English, who | ^~~~~~~~ Did you mean to spell `favoured` this way? Suggest: - Replace with: “favored” - Replace with: “flavored” - Replace with: “floured” Lint: Spelling (63 priority) Message: | 390 | Edwin and Morcar, the earls of Mercia and Northumbria—’” | ^~~~~~ Did you mean to spell `Morcar` this way? Suggest: - Replace with: “Mortar” - Replace with: “Mercer” - Replace with: “Molar” Lint: Spelling (63 priority) Message: | 390 | Edwin and Morcar, the earls of Mercia and Northumbria—’” | ^~~~~~~~~~~ Did you mean to spell `Northumbria` this way? Lint: Spelling (63 priority) Message: | 392 | “Ugh!” said the Lory, with a shiver. | ^~~~ Did you mean to spell `Lory` this way? Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Spelling (63 priority) Message: | 397 | “Not I!” said the Lory hastily. | ^~~~ Did you mean to spell `Lory` this way? Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Spelling (63 priority) Message: | 399 | “I thought you did,” said the Mouse. “—I proceed. ‘Edwin and Morcar, the earls | ^~~~~~ Did you mean to spell `Morcar` this way? 400 | of Mercia and Northumbria, declared for him: and even Stigand, the patriotic Suggest: - Replace with: “Mortar” - Replace with: “Mercer” - Replace with: “Molar” Lint: Spelling (63 priority) Message: | 399 | “I thought you did,” said the Mouse. “—I proceed. ‘Edwin and Morcar, the earls 400 | of Mercia and Northumbria, declared for him: and even Stigand, the patriotic | ^~~~~~~~~~~ Did you mean to spell `Northumbria` this way? Lint: Spelling (63 priority) Message: | 400 | of Mercia and Northumbria, declared for him: and even Stigand, the patriotic | ^~~~~~~ Did you mean to spell `Stigand` this way? 401 | archbishop of Canterbury, found it advisable—’” Suggest: - Replace with: “Stand” - Replace with: “Stipend” - Replace with: “Strand” Lint: Spelling (63 priority) Message: | 411 | The Mouse did not notice this question, but hurriedly went on, “‘—found it 412 | advisable to go with Edgar Atheling to meet William and offer him the crown. | ^~~~~~~~ Did you mean to spell `Atheling` this way? Suggest: - Replace with: “Adhering” - Replace with: “Fathering” - Replace with: “Gathering” Lint: Readability (127 priority) Message: | 445 | This question the Dodo could not answer without a great deal of thought, and it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 446 | sat for a long time with one finger pressed upon its forehead (the position in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | which you usually see Shakespeare, in the pictures of him), while the rest | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | waited in silence. At last the Dodo said, “Everybody has won, and all must have | ~~~~~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: WordChoice (63 priority) Message: | 458 | pulled out a box of comfits, (luckily the salt water had not got into it), and | ^~~~~~~~~~ Did you mean the closed compound noun “saltwater”? 459 | handed them round as prizes. There was exactly one a-piece, all round. Suggest: - Replace with: “saltwater” Lint: Readability (127 priority) Message: | 474 | Alice thought the whole thing very absurd, but they all looked so grave that she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 475 | did not dare to laugh; and, as she could not think of anything to say, she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 476 | simply bowed, and took the thimble, looking as solemn as she could. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Formatting (255 priority) Message: | 502 | > Fury: ‘I’ll try the whole cause, and condemn you to death.’” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 527 | “What a pity it wouldn’t stay!” sighed the Lory, as soon as it was quite out of | ^~~~ Did you mean to spell `Lory` this way? 528 | sight; and an old Crab took the opportunity of saying to her daughter “Ah, my Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Spelling (63 priority) Message: | 536 | “And who is Dinah, if I might venture to ask the question?” said the Lory. | ^~~~ Did you mean to spell `Lory` this way? Suggest: - Replace with: “Lord” - Replace with: “Lore” - Replace with: “Lorry” Lint: Readability (127 priority) Message: | 564 | wonder?” Alice guessed in a moment that it was looking for the fan and the pair | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 565 | of white kid gloves, and she very good-naturedly began hunting about for them, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 566 | but they were nowhere to be seen—everything seemed to have changed since her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 567 | swim in the pool, and the great hall, with the glass table and the little door, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 568 | had vanished completely. | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 62 words long. Lint: Enhancement (31 priority) Message: | 564 | wonder?” Alice guessed in a moment that it was looking for the fan and the pair 565 | of white kid gloves, and she very good-naturedly began hunting about for them, | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “excellent” Lint: Spelling (63 priority) Message: | 564 | wonder?” Alice guessed in a moment that it was looking for the fan and the pair 565 | of white kid gloves, and she very good-naturedly began hunting about for them, | ^~~~~~~~~ Did you mean to spell `naturedly` this way? 566 | but they were nowhere to be seen—everything seemed to have changed since her Suggest: - Replace with: “naturally” - Replace with: “maturely” Lint: Spelling (63 priority) Message: | 579 | little house, on the door of which was a bright brass plate with the name “W. | ^~ Did you mean to spell `W.` this way? Suggest: - Replace with: “We” - Replace with: “WA” - Replace with: “WI” Lint: Spelling (63 priority) Message: | 585 | I suppose Dinah’ll be sending me on messages next!” And she began fancying the | ^~~~~~~~ Did you mean `Dinah's`? Suggest: - Replace with: “Dinah's” Lint: Readability (127 priority) Message: | 591 | By this time she had found her way into a tidy little room with a table in the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | window, and on it (as she had hoped) a fan and two or three pairs of tiny white | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 593 | kid gloves: she took up the fan and a pair of the gloves, and was just going to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | leave the room, when her eye fell upon a little bottle that stood near the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 595 | looking-glass. There was no label this time with the words “DRINK ME,” but | ~~~~~~~~~~~~~~ This sentence is 71 words long. Lint: Readability (127 priority) Message: | 607 | Alas! it was too late to wish that! She went on growing, and growing, and very | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | soon had to kneel down on the floor: in another minute there was not even room | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 609 | for this, and she tried the effect of lying down with one elbow against the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 610 | door, and the other arm curled round her head. Still she went on growing, and, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Readability (127 priority) Message: | 615 | Luckily for Alice, the little magic bottle had now had its full effect, and she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 616 | grew no larger: still it was very uncomfortable, and, as there seemed to be no | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | sort of chance of her ever getting out of the room again, no wonder she felt | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 618 | unhappy. | ~~~~~~~~ This sentence is 47 words long. Lint: Readability (127 priority) Message: | 643 | came a little pattering of feet on the stairs. Alice knew it was the Rabbit | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 644 | coming to look for her, and she trembled till she shook the house, quite | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | forgetting that she was now about a thousand times as large as the Rabbit, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 646 | had no reason to be afraid of it. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 655 | snatch in the air. She did not get hold of anything, but she heard a little | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 656 | shriek and a fall, and a crash of broken glass, from which she concluded that it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | was just possible it had fallen into a cucumber-frame, or something of the sort. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Formatting (255 priority) Message: | 659 | Next came an angry voice—the Rabbit’s—“Pat! Pat! Where are you?” And then a | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 659 | Next came an angry voice—the Rabbit’s—“Pat! Pat! Where are you?” And then a | ^ This quote has no termination. 660 | voice she had never heard before, “Sure then I’m here! Digging for apples, yer Lint: Spelling (63 priority) Message: | 660 | voice she had never heard before, “Sure then I’m here! Digging for apples, yer 661 | honour!” | ^~~~~~ Did you mean to spell `honour` this way? Suggest: - Replace with: “honor” - Replace with: “hour” - Replace with: “honer” Lint: Spelling (63 priority) Message: | 668 | “Sure, it’s an arm, yer honour!” (He pronounced it “arrum.”) | ^~~~~~ Did you mean to spell `honour` this way? Suggest: - Replace with: “honor” - Replace with: “hour” - Replace with: “honer” Lint: Spelling (63 priority) Message: | 668 | “Sure, it’s an arm, yer honour!” (He pronounced it “arrum.”) | ^~~~~ Did you mean to spell `arrum` this way? Suggest: - Replace with: “arum” - Replace with: “album” - Replace with: “alum” Lint: Typo (31 priority) Message: | 668 | “Sure, it’s an arm, yer honour!” (He pronounced it “arrum.”) | ^~~~~ `arrum` should probably be written as `arr um`. Suggest: - Replace with: “arr um” Lint: Spelling (63 priority) Message: | 672 | “Sure, it does, yer honour: but it’s an arm for all that.” | ^~~~~~ Did you mean to spell `honour` this way? Suggest: - Replace with: “honor” - Replace with: “hour” - Replace with: “honer” Lint: Spelling (63 priority) Message: | 677 | then; such as, “Sure, I don’t like it, yer honour, at all, at all!” “Do as I | ^~~~~~ Did you mean to spell `honour` this way? Suggest: - Replace with: “honor” - Replace with: “hour” - Replace with: “honer” Lint: Capitalization (31 priority) Message: | 688 | one; Bill’s got the other—Bill! fetch it here, lad!—Here, put ’em up at this | ^~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Fetch” Lint: Capitalization (31 priority) Message: | 690 | they’ll do well enough; don’t be particular—Here, Bill! catch hold of this | ^~~~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “They’ll” Lint: Capitalization (31 priority) Message: | 690 | they’ll do well enough; don’t be particular—Here, Bill! catch hold of this | ^~~~~ This sentence does not start with a capital letter 691 | rope—Will the roof bear?—Mind that loose slate—Oh, it’s coming down! Heads Suggest: - Replace with: “Catch” Lint: Formatting (255 priority) Message: | 692 | below!” (a loud crash)—“Now, who did that?—It was Bill, I fancy—Who’s to go down | ^ This quote has no termination. Lint: Capitalization (31 priority) Message: | 692 | below!” (a loud crash)—“Now, who did that?—It was Bill, I fancy—Who’s to go down | ^~~~~ The canonical dictionary spelling is `who's`. 693 | the chimney?—Nay, I shan’t! You do it!—That I won’t, then!—Bill’s to go Suggest: - Replace with: “who's” Lint: Capitalization (31 priority) Message: | 694 | down—Here, Bill! the master says you’re to go down the chimney!” | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “The” Lint: Formatting (255 priority) Message: | 694 | down—Here, Bill! the master says you’re to go down the chimney!” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 701 | She drew her foot as far down the chimney as she could, and waited till she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 702 | heard a little animal (she couldn’t guess of what sort it was) scratching and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 703 | scrambling about in the chimney close above her: then, saying to herself “This | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 704 | is Bill,” she gave one sharp kick, and waited to see what would happen next. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 58 words long. Lint: Formatting (255 priority) Message: | 706 | The first thing she heard was a general chorus of “There goes Bill!” then the 707 | Rabbit’s voice along—“Catch him, you by the hedge!” then silence, and then | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 707 | Rabbit’s voice along—“Catch him, you by the hedge!” then silence, and then | ^ This quote has no termination. 708 | another confusion of voices—“Hold up his head—Brandy now—Don’t choke him—How was Lint: Formatting (255 priority) Message: | 707 | Rabbit’s voice along—“Catch him, you by the hedge!” then silence, and then 708 | another confusion of voices—“Hold up his head—Brandy now—Don’t choke him—How was | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 709 | it, old fellow? What happened to you? Tell us all about it!” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 711 | Last came a little feeble, squeaking voice, (“That’s Bill,” thought Alice,) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | “Well, I hardly know—No more, thank ye; I’m better now—but I’m a deal too | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | flustered to tell you—all I know is, something comes at me like a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | Jack-in-the-box, and up I goes like a sky-rocket!” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Agreement (127 priority) Message: | 713 | flustered to tell you—all I know is, something comes at me like a 714 | Jack-in-the-box, and up I goes like a sky-rocket!” | ^~~~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “go” Lint: Spelling (63 priority) Message: | 723 | minute or two, they began moving about again, and Alice heard the Rabbit say, “A 724 | barrowful will do, to begin with.” | ^~~~~~~~~ Did you mean `sorrowful`? Suggest: - Replace with: “sorrowful” Lint: Spelling (63 priority) Message: | 726 | “A barrowful of what?” thought Alice; but she had not long to doubt, for the | ^~~~~~~~~ Did you mean `sorrowful`? Suggest: - Replace with: “sorrowful” Lint: Readability (127 priority) Message: | 749 | It sounded an excellent plan, no doubt, and very neatly and simply arranged; the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | only difficulty was, that she had not the smallest idea how to set about it; and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 751 | while she was peering about anxiously among the trees, a little sharp bark just | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 752 | over her head made her look up in a great hurry. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Readability (127 priority) Message: | 755 | stretching out one paw, trying to touch her. “Poor little thing!” said Alice, in | ^~~~~~~~~~~~~~~ 756 | a coaxing tone, and she tried hard to whistle to it; but she was terribly | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | frightened all the time at the thought that it might be hungry, in which case it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 758 | would be very likely to eat her up in spite of all her coaxing. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Readability (127 priority) Message: | 760 | Hardly knowing what she did, she picked up a little bit of stick, and held it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 761 | out to the puppy; whereupon the puppy jumped into the air off all its feet at | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 762 | once, with a yelp of delight, and rushed at the stick, and made believe to worry | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | it; then Alice dodged behind a great thistle, to keep herself from being run | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 764 | over; and the moment she appeared on the other side, the puppy made another rush | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 765 | at the stick, and tumbled head over heels in its hurry to get hold of it; then | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 766 | Alice, thinking it was very like having a game of play with a cart-horse, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | expecting every moment to be trampled under its feet, ran round the thistle | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 768 | again; then the puppy began a series of short charges at the stick, running a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 769 | very little way forwards each time and a long way back, and barking hoarsely all | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | the while, till at last it sat down a good way off, panting, with its tongue | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 771 | hanging out of its mouth, and its great eyes half shut. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 180 words long. Lint: Spelling (63 priority) Message: | 777 | “And yet what a dear little puppy it was!” said Alice, as she leant against a | ^~~~~ Did you mean to spell `leant` this way? 778 | buttercup to rest herself, and fanned herself with one of the leaves: “I should Suggest: - Replace with: “lean” - Replace with: “learnt” - Replace with: “least” Lint: Readability (127 priority) Message: | 786 | the right thing to eat or drink under the circumstances. There was a large | ^~~~~~~~~~~~~~~~~~ 787 | mushroom growing near her, about the same height as herself; and when she had | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | looked under it, and on both sides of it, and behind it, it occurred to her that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | she might as well look and see what was on the top of it. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 791 | She stretched herself up on tiptoe, and peeped over the edge of the mushroom, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | and her eyes immediately met those of a large blue caterpillar, that was sitting | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 793 | on the top with its arms folded, quietly smoking a long hookah, and taking not | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 794 | the smallest notice of her or of anything else. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Capitalization (127 priority) Message: | 796 | ## CHAPTER V: Advice from a Caterpillar | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “## CHAPTER v: Advice from a Caterpillar” Lint: Readability (127 priority) Message: | 822 | “Well, perhaps you haven’t found it so yet,” said Alice; “but when you have to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 823 | turn into a chrysalis—you will some day, you know—and then after that into a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | butterfly, I should think you’ll feel it a little queer, won’t you?” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Formatting (255 priority) Message: | 865 | “Well, I’ve tried to say “How doth the little busy bee,” but it all came | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 866 | different!” Alice replied in a very melancholy voice. | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 868 | “Repeat, “You are old, Father William,’” said the Caterpillar. | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 884 | > “In my youth,” said the sage, as he shook his grey locks, “I kept all my limbs | ^~~~ Did you mean to spell `grey` this way? 885 | > very supple By the use of this ointment—one shilling the box— Allow me to sell Suggest: - Replace with: “gray” - Replace with: “grew” - Replace with: “grep” Lint: Enhancement (31 priority) Message: | 929 | “It is a very good height indeed!” said the Caterpillar angrily, rearing itself | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “excellent” Lint: Readability (127 priority) Message: | 958 | She was a good deal frightened by this very sudden change, but she felt that | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 959 | there was no time to be lost, as she was shrinking rapidly; so she set to work | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 960 | at once to eat some of the other bit. Her chin was pressed so closely against | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 961 | her foot, that there was hardly room to open her mouth; but she did it at last, 962 | and managed to swallow a morsel of the lefthand bit. | ^~~~~~~~ Did you mean to spell `lefthand` this way? Suggest: - Replace with: “left-hand” - Replace with: “leftward” Lint: Typo (31 priority) Message: | 961 | her foot, that there was hardly room to open her mouth; but she did it at last, 962 | and managed to swallow a morsel of the lefthand bit. | ^~~~~~~~ `lefthand` should probably be written as `left hand`. Suggest: - Replace with: “left hand” Lint: Readability (127 priority) Message: | 964 | “Come, my head’s free at last!” said Alice in a tone of delight, which changed | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 965 | into alarm in another moment, when she found that her shoulders were nowhere to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 966 | be found: all she could see, when she looked down, was an immense length of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 967 | neck, which seemed to rise like a stalk out of a sea of green leaves that lay | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 968 | far below her. | ~~~~~~~~~~~~~~ This sentence is 58 words long. Lint: Readability (127 priority) Message: | 975 | As there seemed to be no chance of getting her hands up to her head, she tried | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | to get her head down to them, and was delighted to find that her neck would bend | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 977 | about easily in any direction, like a serpent. She had just succeeded in curving | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 977 | about easily in any direction, like a serpent. She had just succeeded in curving | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | it down into a graceful zigzag, and was going to dive in among the leaves, which | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 979 | she found to be nothing but the tops of the trees under which she had been | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 980 | wandering, when a sharp hiss made her draw back in a hurry: a large pigeon had | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 981 | flown into her face, and was beating her violently with its wings. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 66 words long. Lint: WordChoice (63 priority) Message: | 979 | she found to be nothing but the tops of the trees under which she had been 980 | wandering, when a sharp hiss made her draw back in a hurry: a large pigeon had | ^~~~~~~~~ Did you mean the closed compound noun “drawback”? Suggest: - Replace with: “drawback” Lint: Readability (127 priority) Message: | 1007 | “And just as I’d taken the highest tree in the wood,” continued the Pigeon, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | raising its voice to a shriek, “and just as I was thinking I should be free of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1009 | them at last, they must needs come wriggling down from the sky! Ugh, Serpent!” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Miscellaneous (31 priority) Message: | 1011 | “But I’m not a serpent, I tell you!” said Alice. “I’m a—I’m a—” | ^ Incorrect indefinite article. Suggest: - Replace with: “an” Lint: Readability (127 priority) Message: | 1030 | This was such a new idea to Alice, that she was quite silent for a minute or | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | two, which gave the Pigeon the opportunity of adding, “You’re looking for eggs, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1032 | I know that well enough; and what does it matter to me whether you’re a little | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1033 | girl or a serpent?” | ~~~~~~~~~~~~~~~~~~ This sentence is 50 words long. Lint: Readability (127 priority) Message: | 1042 | to stop and untwist it. After a while she remembered that she still held the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1043 | pieces of mushroom in her hands, and she set to work very carefully, nibbling | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | first at one and then at the other, and growing sometimes taller and sometimes | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1045 | shorter, until she had succeeded in bringing herself down to her usual height. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Spelling (63 priority) Message: | 1055 | this size: why, I should frighten them out of their wits!” So she began nibbling 1056 | at the righthand bit again, and did not venture to go near the house till she | ^~~~~~~~~ Did you mean to spell `righthand` this way? Suggest: - Replace with: “right-hand” - Replace with: “rightward” Lint: Typo (31 priority) Message: | 1055 | this size: why, I should frighten them out of their wits!” So she began nibbling 1056 | at the righthand bit again, and did not venture to go near the house till she | ^~~~~~~~~ `righthand` should probably be written as `right hand`. Suggest: - Replace with: “right hand” Lint: Capitalization (127 priority) Message: | 1059 | ## CHAPTER VI: Pig and Pepper | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “## CHAPTER Vi: Pig and Pepper” Lint: Readability (127 priority) Message: | 1061 | For a minute or two she stood looking at the house, and wondering what to do | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | next, when suddenly a footman in livery came running out of the wood—(she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1063 | considered him to be a footman because he was in livery: otherwise, judging by | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1064 | his face only, she would have called him a fish)—and rapped loudly at the door | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | with his knuckles. It was opened by another footman in livery, with a round | ~~~~~~~~~~~~~~~~~~ This sentence is 63 words long. Lint: Readability (127 priority) Message: | 1078 | Alice laughed so much at this, that she had to run back into the wood for fear | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1079 | of their hearing her; and when she next peeped out the Fish-Footman was gone, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | and the other was sitting on the ground near the door, staring stupidly up into | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1081 | the sky. | ~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 1130 | The door led right into a large kitchen, which was full of smoke from one end to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | the other: the Duchess was sitting on a three-legged stool in the middle, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1132 | nursing a baby; the cook was leaning over the fire, stirring a large cauldron | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | which seemed to be full of soup. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Readability (127 priority) Message: | 1165 | well to introduce some other subject of conversation. While she was trying to | ^~~~~~~~~~~~~~~~~~~~~~~~ 1166 | fix on one, the cook took the cauldron of soup off the fire, and at once set to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1167 | work throwing everything within her reach at the Duchess and the baby—the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | fire-irons came first; then followed a shower of saucepans, plates, and dishes. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 1187 | Alice glanced rather anxiously at the cook, to see if she meant to take the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1188 | hint; but the cook was busily stirring the soup, and seemed not to be listening, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | so she went on again: “Twenty-four hours, I think; or is it twelve? I—” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Capitalization (31 priority) Message: | 1200 | > “Wow! wow! wow!” | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Wow” Lint: Capitalization (31 priority) Message: | 1200 | > “Wow! wow! wow!” | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Wow” Lint: Capitalization (31 priority) Message: | 1211 | > “Wow! wow! wow!” | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Wow” Lint: Capitalization (31 priority) Message: | 1211 | > “Wow! wow! wow!” | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Wow” Lint: Capitalization (31 priority) Message: | 1213 | “Here! you may nurse it a bit, if you like!” the Duchess said to Alice, flinging | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “You” Lint: Readability (127 priority) Message: | 1220 | star-fish,” thought Alice. The poor little thing was snorting like a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | steam-engine when she caught it, and kept doubling itself up and straightening | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1222 | itself out again, so that altogether, for the first minute or two, it was as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | much as she could do to hold it. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 1225 | As soon as she had made out the proper way of nursing it, (which was to twist it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1226 | up into a sort of knot, and then keep tight hold of its right ear and left foot, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1227 | so as to prevent its undoing itself,) she carried it out into the open air. “If | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Readability (127 priority) Message: | 1235 | what was the matter with it. There could be no doubt that it had a very turn-up | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1236 | nose, much more like a snout than a real nose; also its eyes were getting | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1237 | extremely small for a baby: altogether Alice did not like the look of the thing | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1238 | at all. “But perhaps it was only sobbing,” she thought, and looked into its eyes | ~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 1254 | made a dreadfully ugly child: but it makes rather a handsome pig, I think.” And | ^~~~ 1255 | she began thinking over other children she knew, who might do very well as pigs, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1256 | and was just saying to herself, “if one only knew the right way to change them—” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1257 | when she was a little startled by seeing the Cheshire Cat sitting on a bough of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | a tree a few yards off. | ~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 54 words long. Lint: Spelling (63 priority) Message: | 1260 | The Cat only grinned when it saw Alice. It looked good-natured, she thought: | ^~~~~~~ Did you mean to spell `natured` this way? Suggest: - Replace with: “nature” - Replace with: “natures” - Replace with: “nature's” Lint: Punctuation (31 priority) Message: | 1304 | I’m angry. Therefore I’m mad.” | ^~~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 1348 | like ears and the roof was thatched with fur. It was so large a house, that she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1349 | did not like to go nearer till she had nibbled some more of the lefthand bit of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | mushroom, and raised herself to about two feet high: even then she walked up | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1351 | towards it rather timidly, saying to herself “Suppose it should be raving mad | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | after all! I almost wish I’d gone to see the Hatter instead!” | ~~~~~~~~~~ This sentence is 54 words long. Lint: Spelling (63 priority) Message: | 1349 | did not like to go nearer till she had nibbled some more of the lefthand bit of | ^~~~~~~~ Did you mean to spell `lefthand` this way? 1350 | mushroom, and raised herself to about two feet high: even then she walked up Suggest: - Replace with: “left-hand” - Replace with: “leftward” Lint: Typo (31 priority) Message: | 1349 | did not like to go nearer till she had nibbled some more of the lefthand bit of | ^~~~~~~~ `lefthand` should probably be written as `left hand`. 1350 | mushroom, and raised herself to about two feet high: even then she walked up Suggest: - Replace with: “left hand” Lint: Readability (127 priority) Message: | 1356 | There was a table set out under a tree in front of the house, and the March Hare | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | and the Hatter were having tea at it: a Dormouse was sitting between them, fast | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1358 | asleep, and the other two were using it as a cushion, resting their elbows on | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1359 | it, and talking over its head. “Very uncomfortable for the Dormouse,” thought | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 54 words long. Lint: Miscellaneous (31 priority) Message: | 1415 | dropped, and the party sat silent for a minute, while Alice thought over all she | ^~~~~~~~ Did you mean the closed compound `overall`? 1416 | could remember about ravens and writing-desks, which wasn’t much. Suggest: - Replace with: “overall” Lint: Readability (127 priority) Message: | 1433 | The March Hare took the watch and looked at it gloomily: then he dipped it into | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1434 | his cup of tea, and looked at it again: but he could think of nothing better to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1435 | say than his first remark, “It was the best butter, you know.” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Capitalization (31 priority) Message: | 1481 | “Ah! that accounts for it,” said the Hatter. “He won’t stand beating. Now, if | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “That” Lint: Spelling (63 priority) Message: | 1497 | The Hatter shook his head mournfully. “Not I!” he replied. “We quarrelled last | ^~~~~~~~~~ Did you mean to spell `quarrelled` this way? 1498 | March—just before he went mad, you know—” (pointing with his tea spoon at the Suggest: - Replace with: “quarreled” - Replace with: “quarreler” Lint: WordChoice (63 priority) Message: | 1498 | March—just before he went mad, you know—” (pointing with his tea spoon at the | ^~~~~~~~~ Did you mean the closed compound noun “teaspoon”? 1499 | March Hare,) “—it was at the great concert given by the Queen of Hearts, and I Suggest: - Replace with: “teaspoon” Lint: Formatting (255 priority) Message: | 1498 | March—just before he went mad, you know—” (pointing with his tea spoon at the 1499 | March Hare,) “—it was at the great concert given by the Queen of Hearts, and I | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 1504 | You know the song, perhaps?” | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 1508 | “It goes on, you know,” the Hatter continued, “in this way:— | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 1510 | > ‘Up above the world you fly, Like a tea-tray in the sky. Twinkle, twinkle—’” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 1555 | great hurry; “and their names were Elsie, Lacie, and Tillie; and they lived at | ^~~~~ Did you mean to spell `Lacie` this way? Suggest: - Replace with: “Lace” - Replace with: “Lacier” - Replace with: “Lac's” Lint: Spelling (63 priority) Message: | 1555 | great hurry; “and their names were Elsie, Lacie, and Tillie; and they lived at | ^~~~~~ Did you mean to spell `Tillie` this way? Suggest: - Replace with: “Till's” - Replace with: “Tile” - Replace with: “Till” Lint: Capitalization (31 priority) Message: | 1582 | “Who’s making personal remarks now?” the Hatter asked triumphantly. | ^~~~~ The canonical dictionary spelling is `who's`. Suggest: - Replace with: “who's” Lint: Readability (127 priority) Message: | 1637 | The Dormouse had closed its eyes by this time, and was going off into a doze; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1638 | but, on being pinched by the Hatter, it woke up again with a little shriek, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1639 | went on: “—that begins with an M, such as mouse-traps, and the moon, and memory, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1640 | and muchness—you know you say things are “much of a muchness”—did you ever see | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | such a thing as a drawing of a muchness?” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 73 words long. Lint: Formatting (255 priority) Message: | 1639 | went on: “—that begins with an M, such as mouse-traps, and the moon, and memory, | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 1641 | such a thing as a drawing of a muchness?” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 1647 | This piece of rudeness was more than Alice could bear: she got up in great | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | disgust, and walked off; the Dormouse fell asleep instantly, and neither of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | others took the least notice of her going, though she looked back once or twice, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1650 | half hoping that they would call after her: the last time she saw them, they | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | were trying to put the Dormouse into the teapot. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 67 words long. Lint: Readability (127 priority) Message: | 1663 | Then she went to work nibbling at the mushroom (she had kept a piece of it in | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | her pocket) till she was about a foot high: then she walked down the little | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1665 | passage: and then—she found herself at last in the beautiful garden, among the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | bright flower-beds and the cool fountains. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Readability (127 priority) Message: | 1691 | Seven flung down his brush, and had just begun “Well, of all the unjust things—” | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | when his eye chanced to fall upon Alice, as she stood watching them, and he | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1693 | checked himself suddenly: the others looked round also, and all of them bowed | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1694 | low. | ~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 1699 | Five and Seven said nothing, but looked at Two. Two began in a low voice, “Why | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1700 | the fact is, you see, Miss, this here ought to have been a red rose-tree, and we | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1701 | put a white one in by mistake; and if the Queen was to find it out, we should | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | all have our heads cut off, you know. So you see, Miss, we’re doing our best, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Readability (127 priority) Message: | 1708 | First came ten soldiers carrying clubs; these were all shaped like the three | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | gardeners, oblong and flat, with their hands and feet at the corners: next the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1710 | ten courtiers; these were ornamented all over with diamonds, and walked two and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1711 | two, as the soldiers did. After these came the royal children; there were ten of | ~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Style (31 priority) Message: | 1708 | First came ten soldiers carrying clubs; these were all shaped like the three 1709 | gardeners, oblong and flat, with their hands and feet at the corners: next the | ^~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 1713 | they were all ornamented with hearts. Next came the guests, mostly Kings and 1714 | Queens, and among them Alice recognised the White Rabbit: it was talking in a | ^~~~~~~~~~ Did you mean to spell `recognised` this way? Suggest: - Replace with: “recognized” - Replace with: “recognize” - Replace with: “recognizer” Lint: Readability (127 priority) Message: | 1720 | Alice was rather doubtful whether she ought not to lie down on her face like the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1721 | three gardeners, but she could not remember ever having heard of such a rule at | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | processions; “and besides, what would be the use of a procession,” thought she, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1723 | “if people had all to lie down upon their faces, so that they couldn’t see it?” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 60 words long. Lint: Readability (127 priority) Message: | 1737 | “And who are these?” said the Queen, pointing to the three gardeners who were | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1738 | lying round the rose-tree; for, you see, as they were lying on their faces, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | the pattern on their backs was the same as the rest of the pack, she could not | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | tell whether they were gardeners, or soldiers, or courtiers, or three of her own | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1741 | children. | ~~~~~~~~~ This sentence is 58 words long. Lint: Readability (127 priority) Message: | 1813 | got settled down in a minute or two, and the game began. Alice thought she had | ^~~~~~~~~~~~~~~~~~~~~~ 1814 | never seen such a curious croquet-ground in her life; it was all ridges and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | furrows; the balls were live hedgehogs, the mallets live flamingoes, and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1816 | soldiers had to double themselves up and to stand on their hands and feet, to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1817 | make the arches. | ~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 1819 | The chief difficulty Alice found at first was in managing her flamingo: she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | succeeded in getting its body tucked away, comfortably enough, under her arm, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1821 | with its legs hanging down, but generally, just as she had got its neck nicely | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1822 | straightened out, and was going to give the hedgehog a blow with its head, it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1823 | would twist itself round and look up in her face, with such a puzzled expression | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1824 | that she could not help bursting out laughing: and when she had got its head | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | down, and was going to begin again, it was very provoking to find that the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1826 | hedgehog had unrolled itself, and was in the act of crawling away: besides all | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | this, there was generally a ridge or furrow in the way wherever she wanted to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1828 | send the hedgehog to, and, as the doubled-up soldiers were always getting up and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1829 | walking off to other parts of the ground, Alice soon came to the conclusion that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | it was a very difficult game indeed. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 166 words long. Lint: Readability (127 priority) Message: | 1832 | The players all played at once without waiting for turns, quarrelling all the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | while, and fighting for the hedgehogs; and in a very short time the Queen was in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1834 | a furious passion, and went stamping about, and shouting “Off with his head!” or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 1832 | The players all played at once without waiting for turns, quarrelling all the | ^~~~~~~~~~~ Did you mean `quarreling`? 1833 | while, and fighting for the hedgehogs; and in a very short time the Queen was in Suggest: - Replace with: “quarreling” Lint: Readability (127 priority) Message: | 1842 | She was looking about for some way of escape, and wondering whether she could | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | get away without being seen, when she noticed a curious appearance in the air: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | it puzzled her very much at first, but, after watching it a minute or two, she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1845 | made it out to be a grin, and she said to herself “It’s the Cheshire Cat: now I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | shall have somebody to talk to.” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 68 words long. Lint: Readability (127 priority) Message: | 1858 | “I don’t think they play at all fairly,” Alice began, in rather a complaining | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1859 | tone, “and they all quarrel so dreadfully one can’t hear oneself speak—and they | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1860 | don’t seem to have any rules in particular; at least, if there are, nobody | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | attends to them—and you’ve no idea how confusing it is all the things being | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1862 | alive; for instance, there’s the arch I’ve got to go through next walking about | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1863 | at the other end of the ground—and I should have croqueted the Queen’s hedgehog | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | just now, only it ran away when it saw mine coming!” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 97 words long. Lint: Style (31 priority) Message: | 1894 | The Queen had only one way of settling all difficulties, great or small. “Off | ^~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 1900 | she heard the Queen’s voice in the distance, screaming with passion. She had | ^~~~~~~~ 1901 | already heard her sentence three of the players to be executed for having missed | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | their turns, and she did not like the look of things at all, as the game was in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1903 | such confusion that she never knew whether it was her turn or not. So she went | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Readability (127 priority) Message: | 1906 | The hedgehog was engaged in a fight with another hedgehog, which seemed to Alice | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1907 | an excellent opportunity for croqueting one of them with the other: the only | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1908 | difficulty was, that her flamingo was gone across to the other side of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | garden, where Alice could see it trying in a helpless sort of way to fly up into | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1910 | a tree. | ~~~~~~~ This sentence is 60 words long. Lint: Readability (127 priority) Message: | 1912 | By the time she had caught the flamingo and brought it back, the fight was over, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1913 | and both the hedgehogs were out of sight: “but it doesn’t matter much,” thought | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | Alice, “as all the arches are gone from this side of the ground.” So she tucked | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 1918 | When she got back to the Cheshire Cat, she was surprised to find quite a large | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1919 | crowd collected round it: there was a dispute going on between the executioner, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | the King, and the Queen, who were all talking at once, while all the rest were | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1921 | quite silent, and looked very uncomfortable. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Readability (127 priority) Message: | 1923 | The moment Alice appeared, she was appealed to by all three to settle the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1924 | question, and they repeated their arguments to her, though, as they all spoke at | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | once, she found it very hard indeed to make out exactly what they said. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 1927 | The executioner’s argument was, that you couldn’t cut off a head unless there | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | was a body to cut it off from: that he had never had to do such a thing before, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1929 | and he wasn’t going to begin at his time of life. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 1944 | The Cat’s head began fading away the moment he was gone, and, by the time he had | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | come back with the Duchess, it had entirely disappeared; so the King and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1946 | executioner ran wildly up and down looking for it, while the rest of the party | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1947 | went back to the game. | ~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Readability (127 priority) Message: | 1960 | “I won’t have any pepper in my kitchen at all. Soup does very well without—Maybe | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1961 | it’s always pepper that makes people hot-tempered,” she went on, very much | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | pleased at having found out a new kind of rule, “and vinegar that makes them | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1963 | sour—and camomile that makes them bitter—and—and barley-sugar and such things | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1964 | that make children sweet-tempered. I only wish people knew that: then they | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Spelling (63 priority) Message: | 1962 | pleased at having found out a new kind of rule, “and vinegar that makes them 1963 | sour—and camomile that makes them bitter—and—and barley-sugar and such things | ^~~~~~~~ Did you mean to spell `camomile` this way? Suggest: - Replace with: “chamomile” - Replace with: “chamomiles” Lint: Spelling (63 priority) Message: | 1985 | “’Tis so,” said the Duchess: “and the moral of that is—‘Oh, ’tis love, ’tis | ^~~ Did you mean to spell `Tis` this way? Suggest: - Replace with: “This” - Replace with: “T's” - Replace with: “Ti's” Lint: Spelling (63 priority) Message: | 1985 | “’Tis so,” said the Duchess: “and the moral of that is—‘Oh, ’tis love, ’tis | ^~~ Did you mean to spell `tis` this way? 1986 | love, that makes the world go round!’” Suggest: - Replace with: “this” - Replace with: “ti's” - Replace with: “tic” Lint: Spelling (63 priority) Message: | 1985 | “’Tis so,” said the Duchess: “and the moral of that is—‘Oh, ’tis love, ’tis | ^~~ Did you mean to spell `tis` this way? 1986 | love, that makes the world go round!’” Suggest: - Replace with: “this” - Replace with: “ti's” - Replace with: “tic” Lint: WordChoice (63 priority) Message: | 2009 | “Right, as usual,” said the Duchess: “what a clear way you have of putting | ^~~~~~~~~ Did you mean the closed compound noun “clearway”? 2010 | things!” Suggest: - Replace with: “clearway” Lint: Readability (127 priority) Message: | 2021 | “I quite agree with you,” said the Duchess; “and the moral of that is—‘Be what | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2022 | you would seem to be’—or if you’d like it put more simply—‘Never imagine | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2023 | yourself not to be otherwise than what it might appear to others that what you | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | were or might have been was not otherwise than what you had been would have | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2025 | appeared to them to be otherwise.’” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 67 words long. Lint: Spelling (63 priority) Message: | 2048 | But here, to Alice’s great surprise, the Duchess’s voice died away, even in the 2049 | middle of her favourite word ‘moral,’ and the arm that was linked into hers | ^~~~~~~~~ Did you mean to spell `favourite` this way? Suggest: - Replace with: “favorite” - Replace with: “favorites” Lint: Readability (127 priority) Message: | 2064 | The other guests had taken advantage of the Queen’s absence, and were resting in | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2065 | the shade: however, the moment they saw her, they hurried back to the game, the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2066 | Queen merely remarking that a moment’s delay would cost them their lives. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 2068 | All the time they were playing the Queen never left off quarrelling with the | ^~~~~~~~~~~ Did you mean `quarreling`? 2069 | other players, and shouting “Off with his head!” or “Off with her head!” Those Suggest: - Replace with: “quarreling” Lint: Readability (127 priority) Message: | 2069 | other players, and shouting “Off with his head!” or “Off with her head!” Those | ^~~~~~ 2070 | whom she sentenced were taken into custody by the soldiers, who of course had to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2071 | leave off being arches to do this, so that by the end of half an hour or so | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2072 | there were no arches left, and all the players, except the King, the Queen, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2073 | Alice, were in custody and under sentence of execution. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 58 words long. Lint: Spelling (63 priority) Message: | 2091 | They very soon came upon a Gryphon, lying fast asleep in the sun. (If you don’t | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2091 | They very soon came upon a Gryphon, lying fast asleep in the sun. (If you don’t 2092 | know what a Gryphon is, look at the picture.) “Up, lazy thing!” said the Queen, | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2094 | must go back and see after some executions I have ordered;” and she walked off, 2095 | leaving Alice alone with the Gryphon. Alice did not quite like the look of the | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2099 | The Gryphon sat up and rubbed its eyes: then it watched the Queen till she was | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2100 | out of sight: then it chuckled. “What fun!” said the Gryphon, half to itself, | ^~~~~~~ Did you mean `Krypton`? 2101 | half to Alice. Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2105 | “Why, she,” said the Gryphon. “It’s all her fancy, that: they never executes | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2114 | his sorrow?” she asked the Gryphon, and the Gryphon answered, very nearly in the | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2114 | his sorrow?” she asked the Gryphon, and the Gryphon answered, very nearly in the | ^~~~~~~ Did you mean `Krypton`? 2115 | same words as before, “It’s all his fancy, that: he hasn’t got no sorrow, you Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2121 | “This here young lady,” said the Gryphon, “she wants for to know your history, | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Agreement (127 priority) Message: | 2121 | “This here young lady,” said the Gryphon, “she wants for to know your history, 2122 | she do.” | ^~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “does” Lint: Spelling (63 priority) Message: | 2133 | These words were followed by a very long silence, broken only by an occasional 2134 | exclamation of “Hjckrrh!” from the Gryphon, and the constant heavy sobbing of | ^~~~~~~ Did you mean to spell `Hjckrrh` this way? Suggest: - Replace with: “Hickory” - Replace with: “Hacker” - Replace with: “Hackers” Lint: Spelling (63 priority) Message: | 2134 | exclamation of “Hjckrrh!” from the Gryphon, and the constant heavy sobbing of | ^~~~~~~ Did you mean `Krypton`? 2135 | the Mock Turtle. Alice was very nearly getting up and saying, “Thank you, sir, Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2148 | “You ought to be ashamed of yourself for asking such a simple question,” added 2149 | the Gryphon; and then they both sat silent and looked at poor Alice, who felt | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2150 | ready to sink into the earth. At last the Gryphon said to the Mock Turtle, | ^~~~~~~ Did you mean `Krypton`? 2151 | “Drive on, old fellow! Don’t be all day about it!” and he went on in these Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2160 | “Hold your tongue!” added the Gryphon, before Alice could speak again. The Mock | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Capitalization (31 priority) Message: | 2176 | “Ah! then yours wasn’t a really good school,” said the Mock Turtle in a tone of | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Then” Lint: Spelling (63 priority) Message: | 2194 | The Gryphon lifted up both its paws in surprise. “What! Never heard of | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2194 | The Gryphon lifted up both its paws in surprise. “What! Never heard of 2195 | uglifying!” it exclaimed. “You know what to beautify is, I suppose?” | ^~~~~~~~~ Did you mean to spell `uglifying` this way? Suggest: - Replace with: “unifying” - Replace with: “uplifting” - Replace with: “nullifying” Lint: Spelling (63 priority) Message: | 2199 | “Well, then,” the Gryphon went on, “if you don’t know what to uglify is, you are | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2199 | “Well, then,” the Gryphon went on, “if you don’t know what to uglify is, you are | ^~~~~~ Did you mean to spell `uglify` this way? 2200 | a simpleton.” Suggest: - Replace with: “ugly” - Replace with: “unify” - Replace with: “uplift” Lint: Readability (127 priority) Message: | 2205 | “Well, there was Mystery,” the Mock Turtle replied, counting off the subjects on | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2206 | his flappers, “—Mystery, ancient and modern, with Seaography: then Drawling—the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2207 | Drawling-master was an old conger-eel, that used to come once a week: he taught | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2208 | us Drawling, Stretching, and Fainting in Coils.” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Style (31 priority) Message: | 2205 | “Well, there was Mystery,” the Mock Turtle replied, counting off the subjects on 2206 | his flappers, “—Mystery, ancient and modern, with Seaography: then Drawling—the | ^~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 2206 | his flappers, “—Mystery, ancient and modern, with Seaography: then Drawling—the | ^~~~~~~~~~ Did you mean to spell `Seaography` this way? Suggest: - Replace with: “Scenography” - Replace with: “Stenography” - Replace with: “Demography” Lint: WordChoice (127 priority) Message: | 2212 | “Well, I can’t show it you myself,” the Mock Turtle said: “I’m too stiff. And | ^~~ The possessive version of this word is more common in this context. Suggest: - Replace with: “your” - Replace with: “you're a” - Replace with: “you're an” Lint: Spelling (63 priority) Message: | 2212 | “Well, I can’t show it you myself,” the Mock Turtle said: “I’m too stiff. And 2213 | the Gryphon never learnt it.” | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2215 | “Hadn’t time,” said the Gryphon: “I went to the Classics master, though. He was | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2221 | “So he did, so he did,” said the Gryphon, sighing in his turn; and both | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2231 | “That’s the reason they’re called lessons,” the Gryphon remarked: “because they | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2241 | “That’s enough about lessons,” the Gryphon interrupted in a very decided tone: | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2248 | voice. “Same as if he had a bone in his throat,” said the Gryphon: and it set to | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Readability (127 priority) Message: | 2252 | “You may not have lived much under the sea—” (“I haven’t,” said Alice)—“and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2253 | perhaps you were never even introduced to a lobster—” (Alice began to say “I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2254 | once tasted—” but checked herself hastily, and said “No, never”) “—so you can | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2255 | have no idea what a delightful thing a Lobster Quadrille is!” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Formatting (255 priority) Message: | 2252 | “You may not have lived much under the sea—” (“I haven’t,” said Alice)—“and | ^ This quote has no termination. 2253 | perhaps you were never even introduced to a lobster—” (Alice began to say “I Lint: Formatting (255 priority) Message: | 2253 | perhaps you were never even introduced to a lobster—” (Alice began to say “I | ^ This quote has no termination. 2254 | once tasted—” but checked herself hastily, and said “No, never”) “—so you can Lint: Spelling (63 priority) Message: | 2259 | “Why,” said the Gryphon, “you first form into a line along the sea-shore—” | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2264 | “That generally takes some time,” interrupted the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2268 | “Each with a lobster as a partner!” cried the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2272 | “—change lobsters, and retire in same order,” continued the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2276 | “The lobsters!” shouted the Gryphon, with a bound into the air. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2280 | “Swim after them!” screamed the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2284 | “Change lobsters again!” yelled the Gryphon at the top of its voice. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Readability (127 priority) Message: | 2286 | “Back to land again, and that’s all the first figure,” said the Mock Turtle, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | suddenly dropping his voice; and the two creatures, who had been jumping about | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2288 | like mad things all this time, sat down again very sadly and quietly, and looked | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2289 | at Alice. | ~~~~~~~~~ This sentence is 44 words long. Lint: Spelling (63 priority) Message: | 2297 | “Come, let’s try the first figure!” said the Mock Turtle to the Gryphon. “We can | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2300 | “Oh, you sing,” said the Gryphon. “I’ve forgotten the words.” | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Style (31 priority) Message: | 2302 | So they began solemnly dancing round and round Alice, every now and then | ^~~ An Oxford comma is necessary here. 2303 | treading on her toes when they passed too close, and waving their forepaws to Suggest: - Insert “,” Lint: Formatting (255 priority) Message: | 2306 | > “Will you walk a little faster?” said a whiting to a snail. “There’s a | ^ This quote has no termination. 2307 | > porpoise close behind us, and he’s treading on my tail. See how eagerly the Lint: Spelling (63 priority) Message: | 2333 | “Yes,” said Alice, “I’ve often seen them at dinn—” she checked herself hastily. | ^~~~ Did you mean to spell `dinn` this way? Suggest: - Replace with: “din” - Replace with: “dine” - Replace with: “ding” Lint: Spelling (63 priority) Message: | 2335 | “I don’t know where Dinn may be,” said the Mock Turtle, “but if you’ve seen them | ^~~~ Did you mean to spell `Dinn` this way? Suggest: - Replace with: “Din” - Replace with: “Dine” - Replace with: “Diann” Lint: Formatting (255 priority) Message: | 2343 | here the Mock Turtle yawned and shut his eyes.—“Tell her about the reason and | ^ This quote has no termination. 2344 | all that,” he said to the Gryphon. Lint: Formatting (255 priority) Message: | 2343 | here the Mock Turtle yawned and shut his eyes.—“Tell her about the reason and 2344 | all that,” he said to the Gryphon. | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2343 | here the Mock Turtle yawned and shut his eyes.—“Tell her about the reason and 2344 | all that,” he said to the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2346 | “The reason is,” said the Gryphon, “that they would go with the lobsters to the | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2354 | “I can tell you more than that, if you like,” said the Gryphon. “Do you know why | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2359 | “It does the boots and shoes,” the Gryphon replied very solemnly. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2364 | “Why, what are your shoes done with?” said the Gryphon. “I mean, what makes them | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2370 | “Boots and shoes under the sea,” the Gryphon went on in a deep voice, “are done | ^~~~~~~ Did you mean `Krypton`? 2371 | with a whiting. Now you know.” Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2375 | “Soles and eels, of course,” the Gryphon replied rather impatiently: “any shrimp | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2392 | “I mean what I say,” the Mock Turtle replied in an offended tone. And the 2393 | Gryphon added “Come, let’s hear some of your adventures.” | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2401 | “No, no! The adventures first,” said the Gryphon in an impatient tone: | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Readability (127 priority) Message: | 2407 | wide, but she gained courage as she went on. Her listeners were perfectly quiet | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2408 | till she got to the part about her repeating “You are old, Father William,” to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | the Caterpillar, and the words all coming different, and then the Mock Turtle | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2410 | drew a long breath, and said “That’s very curious.” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 2412 | “It’s all about as curious as it can be,” said the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2415 | to hear her try and repeat something now. Tell her to begin.” He looked at the 2416 | Gryphon as if he thought it had some kind of authority over Alice. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2418 | “Stand up and repeat ‘’Tis the voice of the sluggard,’” said the Gryphon. | ^~~ Did you mean to spell `Tis` this way? Suggest: - Replace with: “This” - Replace with: “T's” - Replace with: “Ti's” Lint: Spelling (63 priority) Message: | 2418 | “Stand up and repeat ‘’Tis the voice of the sluggard,’” said the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Formatting (255 priority) Message: | 2425 | > “’Tis the voice of the Lobster; I heard him declare, “You have baked me too | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2425 | > “’Tis the voice of the Lobster; I heard him declare, “You have baked me too | ^~~ Did you mean to spell `Tis` this way? Suggest: - Replace with: “This” - Replace with: “T's” - Replace with: “Ti's” Lint: Formatting (255 priority) Message: | 2427 | > Trims his belt and his buttons, and turns out his toes.” | ^ This quote has no termination. 2428 | > Lint: Readability (127 priority) Message: | 2428 | > 2429 | > (later editions continued as follows When the sands are all dry, he is gay as | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | > a lark, And will talk in contemptuous tones of the Shark, But, when the tide | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2431 | > rises and sharks are around, His voice has a timid and tremulous sound.) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 2433 | “That’s different from what I used to say when I was a child,” said the Gryphon. | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2443 | “She can’t explain it,” said the Gryphon hastily. “Go on with the next verse.” | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2451 | “Go on with the next verse,” the Gryphon repeated impatiently: “it begins ‘I | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2470 | “Yes, I think you’d better leave off,” said the Gryphon: and Alice was only too | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2473 | “Shall we try another figure of the Lobster Quadrille?” the Gryphon went on. “Or | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2476 | “Oh, a song, please, if the Mock Turtle would be so kind,” Alice replied, so 2477 | eagerly that the Gryphon said, in a rather offended tone, “Hm! No accounting for | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Capitalization (127 priority) Message: | 2477 | eagerly that the Gryphon said, in a rather offended tone, “Hm! No accounting for | ^~ This word's canonical spelling is all-caps. Suggest: - Replace with: “HM” Lint: Spelling (63 priority) Message: | 2477 | eagerly that the Gryphon said, in a rather offended tone, “Hm! No accounting for | ^~ Did you mean to spell `Hm` this way? Suggest: - Replace with: “Ha” - Replace with: “Ham” - Replace with: “He” Lint: Formatting (255 priority) Message: | 2483 | > “Beautiful Soup, so rich and green, Waiting in a hot tureen! Who for such | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~~~~~ Did you mean to spell `ootiful` this way? Suggest: - Replace with: “dutiful” - Replace with: “pitiful” - Replace with: “potful” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ Did you mean to spell `Soo` this way? Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ This word's canonical spelling is all-caps. Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ Did you mean to spell `oop` this way? Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~~~~~ Did you mean to spell `ootiful` this way? Suggest: - Replace with: “dutiful” - Replace with: “pitiful” - Replace with: “potful” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ Did you mean to spell `Soo` this way? Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ This word's canonical spelling is all-caps. Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ Did you mean to spell `oop` this way? Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ Did you mean to spell `Soo` this way? 2486 | > of the e—e—evening, Beautiful, beautiful Soup! Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ This word's canonical spelling is all-caps. 2486 | > of the e—e—evening, Beautiful, beautiful Soup! Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2485 | > evening, beautiful Soup! Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop | ^~~ Did you mean to spell `oop` this way? 2486 | > of the e—e—evening, Beautiful, beautiful Soup! Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: WordChoice (63 priority) Message: | 2488 | > “Beautiful Soup! Who cares for fish, Game, or any other dish? Who would not 2489 | > give all else for two p ennyworth only of beautiful Soup? Pennyworth only of | ^~~~~~~~~~~ It seems these words would go better together. Suggest: - Replace with: “pennyworth” Lint: Spelling (63 priority) Message: | 2488 | > “Beautiful Soup! Who cares for fish, Game, or any other dish? Who would not 2489 | > give all else for two p ennyworth only of beautiful Soup? Pennyworth only of | ^~~~~~~~~ Did you mean `pennyworth`? Suggest: - Replace with: “pennyworth” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~~~~~ Did you mean to spell `ootiful` this way? Suggest: - Replace with: “dutiful” - Replace with: “pitiful” - Replace with: “potful” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ Did you mean to spell `Soo` this way? Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ This word's canonical spelling is all-caps. Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ Did you mean to spell `oop` this way? Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~~~~~ Did you mean to spell `ootiful` this way? Suggest: - Replace with: “dutiful” - Replace with: “pitiful” - Replace with: “potful” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ Did you mean to spell `Soo` this way? Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ This word's canonical spelling is all-caps. Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ Did you mean to spell `oop` this way? Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ Did you mean to spell `Soo` this way? 2491 | > e—e—evening, Beautiful, beauti—FUL SOUP!” Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ This word's canonical spelling is all-caps. 2491 | > e—e—evening, Beautiful, beauti—FUL SOUP!” Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the | ^~~ Did you mean to spell `oop` this way? 2491 | > e—e—evening, Beautiful, beauti—FUL SOUP!” Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the 2491 | > e—e—evening, Beautiful, beauti—FUL SOUP!” | ^~~~~~ Did you mean to spell `beauti` this way? Suggest: - Replace with: “beauty” - Replace with: “beaut” - Replace with: “beauts” Lint: Typo (31 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the 2491 | > e—e—evening, Beautiful, beauti—FUL SOUP!” | ^~~~~~ `beauti` should probably be written as `beau ti`. Suggest: - Replace with: “beau ti” Lint: Spelling (63 priority) Message: | 2490 | > beautiful Soup? Beau—ootiful Soo—oop! Beau—ootiful Soo—oop! Soo—oop of the 2491 | > e—e—evening, Beautiful, beauti—FUL SOUP!” | ^~~ Did you mean to spell `FUL` this way? Suggest: - Replace with: “Full” - Replace with: “Flu” - Replace with: “Fol” Lint: Spelling (63 priority) Message: | 2493 | “Chorus again!” cried the Gryphon, and the Mock Turtle had just begun to repeat | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2496 | “Come on!” cried the Gryphon, and, taking Alice by the hand, it hurried off, | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2499 | “What trial is it?” Alice panted as she ran; but the Gryphon only answered “Come | ^~~~~~~ Did you mean `Krypton`? 2500 | on!” and ran the faster, while more and more faintly came, carried on the breeze Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2503 | > “Soo—oop of the e—e—evening, Beautiful, beautiful Soup!” | ^~~ Did you mean to spell `Soo` this way? Suggest: - Replace with: “So” - Replace with: “Soc” - Replace with: “Sod” Lint: Capitalization (127 priority) Message: | 2503 | > “Soo—oop of the e—e—evening, Beautiful, beautiful Soup!” | ^~~ This word's canonical spelling is all-caps. Suggest: - Replace with: “OOP” Lint: Spelling (63 priority) Message: | 2503 | > “Soo—oop of the e—e—evening, Beautiful, beautiful Soup!” | ^~~ Did you mean to spell `oop` this way? Suggest: - Replace with: “oops” - Replace with: “op” - Replace with: “opp” Lint: Readability (127 priority) Message: | 2507 | The King and Queen of Hearts were seated on their throne when they arrived, with | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2508 | a great crowd assembled about them—all sorts of little birds and beasts, as well | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2509 | as the whole pack of cards: the Knave was standing before them, in chains, with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2510 | a soldier on each side to guard him; and near the King was the White Rabbit, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2511 | with a trumpet in one hand, and a scroll of parchment in the other. In the very | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 75 words long. Lint: Readability (127 priority) Message: | 2511 | with a trumpet in one hand, and a scroll of parchment in the other. In the very | ^~~~~~~~~~~~ 2512 | middle of the court was a table, with a large dish of tarts upon it: they looked | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2513 | so good, that it made Alice quite hungry to look at them—“I wish they’d get the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2514 | trial done,” she thought, “and hand round the refreshments!” But there seemed to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: Formatting (255 priority) Message: | 2513 | so good, that it made Alice quite hungry to look at them—“I wish they’d get the | ^ This quote has no termination. 2514 | trial done,” she thought, “and hand round the refreshments!” But there seemed to Lint: Formatting (255 priority) Message: | 2513 | so good, that it made Alice quite hungry to look at them—“I wish they’d get the 2514 | trial done,” she thought, “and hand round the refreshments!” But there seemed to | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 2523 | The judge, by the way, was the King; and as he wore his crown over the wig, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | (look at the frontispiece if you want to see how he did it,) he did not look at | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2525 | all comfortable, and it was certainly not becoming. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 2534 | The twelve jurors were all writing very busily on slates. “What are they doing?” 2535 | Alice whispered to the Gryphon. “They can’t have anything to put down yet, | ^~~~~~~ Did you mean `Krypton`? Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2538 | “They’re putting down their names,” the Gryphon whispered in reply, “for fear | ^~~~~~~ Did you mean `Krypton`? 2539 | they should forget them before the end of the trial.” Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2547 | even make out that one of them didn’t know how to spell “stupid,” and that he 2548 | had to ask his neighbour to tell him. “A nice muddle their slates’ll be in | ^~~~~~~~~ Did you mean to spell `neighbour` this way? Suggest: - Replace with: “neighbor” - Replace with: “neighbors” Lint: Spelling (63 priority) Message: | 2548 | had to ask his neighbour to tell him. “A nice muddle their slates’ll be in | ^~~~~~~~~ Did you mean to spell `slates’ll` this way? 2549 | before the trial’s over!” thought Alice. Suggest: - Replace with: “slate's” - Replace with: “slates” Lint: Readability (127 priority) Message: | 2553 | opportunity of taking it away. She did it so quickly that the poor little juror | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2554 | (it was Bill, the Lizard) could not make out at all what had become of it; so, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2555 | after hunting all about for it, he was obliged to write with one finger for the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | rest of the day; and this was of very little use, as it left no mark on the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2557 | slate. | ~~~~~~ This sentence is 62 words long. Lint: Readability (127 priority) Message: | 2608 | This did not seem to encourage the witness at all: he kept shifting from one | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2609 | foot to the other, looking uneasily at the Queen, and in his confusion he bit a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2610 | large piece out of his teacup instead of the bread-and-butter. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 2612 | Just at this moment Alice felt a very curious sensation, which puzzled her a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2613 | good deal until she made out what it was: she was beginning to grow larger | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | again, and she thought at first she would get up and leave the court; but on | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2615 | second thoughts she decided to remain where she was as long as there was room | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2616 | for her. | ~~~~~~~~ This sentence is 62 words long. Lint: Readability (127 priority) Message: | 2631 | All this time the Queen had never left off staring at the Hatter, and, just as | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2632 | the Dormouse crossed the court, she said to one of the officers of the court, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2633 | “Bring me the list of the singers in the last concert!” on which the wretched | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 2639 | “I’m a poor man, your Majesty,” the Hatter began, in a trembling voice, “—and I | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2640 | hadn’t begun my tea—not above a week or so—and what with the bread-and-butter | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2641 | getting so thin—and the twinkling of the tea—” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Miscellaneous (31 priority) Message: | 2643 | “The twinkling of the what?” said the King. | ^~~~ Remove `the` before `what`. In most contexts, `what` alone is clearer. Suggest: - Remove error Lint: Formatting (255 priority) Message: | 2684 | “I’m glad I’ve seen that done,” thought Alice. “I’ve so often read in the | ^ This quote has no termination. 2685 | newspapers, at the end of trials, “There was some attempts at applause, which Lint: Formatting (255 priority) Message: | 2687 | what it meant till now.” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 2722 | “Well, if I must, I must,” the King said, with a melancholy air, and, after | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2723 | folding his arms and frowning at the cook till his eyes were nearly out of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | sight, he said in a deep voice, “What are tarts made of?” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Grammar (31 priority) Message: | 2741 | to see what the next witness would be like, “—for they haven’t got much evidence | ^~~~ Use `them` when the pronoun follows a preposition or transitive verb. 2742 | yet,” she said to herself. Imagine her surprise, when the White Rabbit read out, Suggest: - Replace with: “them” Lint: Readability (127 priority) Message: | 2747 | “Here!” cried Alice, quite forgetting in the flurry of the moment how large she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2748 | had grown in the last few minutes, and she jumped up in such a hurry that she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2749 | tipped over the jury-box with the edge of her skirt, upsetting all the jurymen | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | on to the heads of the crowd below, and there they lay sprawling about, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2751 | reminding her very much of a globe of goldfish she had accidentally upset the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2752 | week before. | ~~~~~~~~~~~~ This sentence is 75 words long. Lint: Readability (127 priority) Message: | 2754 | “Oh, I beg your pardon!” she exclaimed in a tone of great dismay, and began | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2755 | picking them up again as quickly as she could, for the accident of the goldfish | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | kept running in her head, and she had a vague sort of idea that they must be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2757 | collected at once and put back into the jury-box, or they would die. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Readability (127 priority) Message: | 2769 | As soon as the jury had a little recovered from the shock of being upset, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2770 | their slates and pencils had been found and handed back to them, they set to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2771 | work very diligently to write out a history of the accident, all except the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2772 | Lizard, who seemed too much overcome to do anything but sit with its mouth open, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2773 | gazing up into the roof of the court. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 68 words long. Lint: Formatting (255 priority) Message: | 2870 | > “They told me you had been to her, And mentioned me to him: She gave me a good | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 2886 | > from all the rest, Between yourself and me.” | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 2900 | spreading out the verses on his knee, and looking at them with one eye; “I seem | ^ This quote has no termination. 2901 | to see some meaning in them, after all. “—said I could not swim—” you can’t Lint: Formatting (255 priority) Message: | 2902 | swim, can you?” he added, turning to the Knave. | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 2907 | “All right, so far,” said the King, and he went on muttering over the verses to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2908 | himself: “‘We know it to be true—’ that’s the jury, of course—‘I gave her one, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2909 | they gave him two—’ why, that must be what he did with the tarts, you know—” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Readability (127 priority) Message: | 2918 | spoke. (The unfortunate little Bill had left off writing on his slate with one | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2919 | finger, as he found it made no mark; but he now hastily began again, using the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2920 | ink, that was trickling down his face, as long as it lasted.) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 2929 | “No, no!” said the Queen. “Sentence first—verdict afterwards.” | ^~~~~~~~~~ Did you mean to spell `afterwards` this way? Suggest: - Replace with: “afterwords” - Replace with: “afterward” - Replace with: “afterword's” Lint: Readability (127 priority) Message: | 2943 | At this the whole pack rose up into the air, and came flying down upon her: she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2944 | gave a little scream, half of fright and half of anger, and tried to beat them | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2945 | off, and found herself lying on the bank, with her head in the lap of her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2946 | sister, who was gently brushing away some dead leaves that had fluttered down | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2947 | from the trees upon her face. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 68 words long. Lint: Readability (127 priority) Message: | 2951 | “Oh, I’ve had such a curious dream!” said Alice, and she told her sister, as | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2952 | well as she could remember them, all these strange Adventures of hers that you | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2953 | have just been reading about; and when she had finished, her sister kissed her, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2954 | and said, “It was a curious dream, dear, certainly: but now run in to your tea; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2955 | it’s getting late.” So Alice got up and ran off, thinking while she ran, as well | ~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Readability (127 priority) Message: | 2960 | But her sister sat still just as she left her, leaning her head on her hand, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2961 | watching the setting sun, and thinking of little Alice and all her wonderful | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2962 | Adventures, till she too began dreaming after a fashion, and this was her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2963 | dream:— | ~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 2965 | First, she dreamed of little Alice herself, and once again the tiny hands were | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2966 | clasped upon her knee, and the bright eager eyes were looking up into hers—she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2967 | could hear the very tones of her voice, and see that queer little toss of her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2968 | head to keep back the wandering hair that would always get into her eyes—and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2969 | still as she listened, or seemed to listen, the whole place around her became | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2970 | alive with the strange creatures of her little sister’s dream. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 84 words long. Lint: Readability (127 priority) Message: | 2972 | The long grass rustled at her feet as the White Rabbit hurried by—the frightened | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2973 | Mouse splashed his way through the neighbouring pool—she could hear the rattle | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2974 | of the teacups as the March Hare and his friends shared their never-ending meal, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2975 | and the shrill voice of the Queen ordering off her unfortunate guests to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2976 | execution—once more the pig-baby was sneezing on the Duchess’s knee, while | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2977 | plates and dishes crashed around it—once more the shriek of the Gryphon, the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2978 | squeaking of the Lizard’s slate-pencil, and the choking of the suppressed | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2979 | guinea-pigs, filled the air, mixed up with the distant sobs of the miserable | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2980 | Mock Turtle. | ~~~~~~~~~~~~ This sentence is 111 words long. Lint: Spelling (63 priority) Message: | 2972 | The long grass rustled at her feet as the White Rabbit hurried by—the frightened 2973 | Mouse splashed his way through the neighbouring pool—she could hear the rattle | ^~~~~~~~~~~~ Did you mean `neighboring`? 2974 | of the teacups as the March Hare and his friends shared their never-ending meal, Suggest: - Replace with: “neighboring” Lint: Spelling (63 priority) Message: | 2977 | plates and dishes crashed around it—once more the shriek of the Gryphon, the | ^~~~~~~ Did you mean `Krypton`? 2978 | squeaking of the Lizard’s slate-pencil, and the choking of the suppressed Suggest: - Replace with: “Krypton” Lint: Readability (127 priority) Message: | 2982 | So she sat on, with closed eyes, and half believed herself in Wonderland, though | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2983 | she knew she had but to open them again, and all would change to dull | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2984 | reality—the grass would be only rustling in the wind, and the pool rippling to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2985 | the waving of the reeds—the rattling teacups would change to tinkling | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2986 | sheep-bells, and the Queen’s shrill cries to the voice of the shepherd boy—and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2987 | the sneeze of the baby, the shriek of the Gryphon, and all the other queer | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2988 | noises, would change (she knew) to the confused clamour of the busy | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2989 | farm-yard—while the lowing of the cattle in the distance would take the place of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2990 | the Mock Turtle’s heavy sobs. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 119 words long. Lint: Spelling (63 priority) Message: | 2987 | the sneeze of the baby, the shriek of the Gryphon, and all the other queer | ^~~~~~~ Did you mean `Krypton`? 2988 | noises, would change (she knew) to the confused clamour of the busy Suggest: - Replace with: “Krypton” Lint: Spelling (63 priority) Message: | 2988 | noises, would change (she knew) to the confused clamour of the busy | ^~~~~~~ Did you mean to spell `clamour` this way? 2989 | farm-yard—while the lowing of the cattle in the distance would take the place of Suggest: - Replace with: “clamor” - Replace with: “glamour” - Replace with: “clamber” Lint: Readability (127 priority) Message: | 2992 | Lastly, she pictured to herself how this same little sister of hers would, in | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2993 | the after-time, be herself a grown woman; and how she would keep, through all | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2994 | her riper years, the simple and loving heart of her childhood: and how she would | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2995 | gather about her other little children, and make their eyes bright and eager | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2996 | with many a strange tale, perhaps even with the dream of Wonderland of long ago: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2997 | and how she would feel with all their simple sorrows, and find a pleasure in all | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2998 | their simple joys, remembering her own child-life, and the happy summer days. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 101 words long. Lint: Style (31 priority) Message: | 2993 | the after-time, be herself a grown woman; and how she would keep, through all 2994 | her riper years, the simple and loving heart of her childhood: and how she would | ^~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” ================================================ FILE: harper-core/tests/text/linters/Computer science.snap.yml ================================================ Lint: Capitalization (127 priority) Message: | 6 | # Computer science | ^~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “# Computer Science” Lint: Style (31 priority) Message: | 27 | problem-solving, decision-making, environmental adaptation, planning and | ^~~~~~~~ An Oxford comma is necessary here. 28 | learning found in humans and animals. Within artificial intelligence, computer Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 45 | Wilhelm Schickard designed and constructed the first working mechanical | ^~~~~~~~~ Did you mean to spell `Schickard` this way? Suggest: - Replace with: “Schick's” - Replace with: “Shipyard” - Replace with: “Schick” Lint: Spelling (63 priority) Message: | 46 | calculator in 1623. In 1673, Gottfried Leibniz demonstrated a digital mechanical | ^~~~~~~~~ Did you mean to spell `Gottfried` this way? Suggest: - Replace with: “Guttered” - Replace with: “Lotteries” - Replace with: “Notified” Lint: Spelling (63 priority) Message: | 46 | calculator in 1623. In 1673, Gottfried Leibniz demonstrated a digital mechanical 47 | calculator, called the Stepped Reckoner. Leibniz may be considered the first | ^~~~~~~~ Did you mean to spell `Reckoner` this way? Suggest: - Replace with: “Reckoned” - Replace with: “Rickover” - Replace with: “Reasoner” Lint: Spelling (63 priority) Message: | 49 | including the fact that he documented the binary number system. In 1820, Thomas 50 | de Colmar launched the mechanical calculator industry[note 1] when he invented | ^~~~~~ Did you mean to spell `Colmar` this way? Suggest: - Replace with: “Collar” - Replace with: “Cellar” - Replace with: “Clear” Lint: Spelling (63 priority) Message: | 50 | de Colmar launched the mechanical calculator industry[note 1] when he invented 51 | his simplified arithmometer, the first calculating machine strong enough and | ^~~~~~~~~~~~ Did you mean to spell `arithmometer` this way? Suggest: - Replace with: “arithmetic” - Replace with: “anemometer” Lint: Readability (127 priority) Message: | 59 | programmable.[note 2] In 1843, during the translation of a French article on the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 60 | Analytical Engine, Ada Lovelace wrote, in one of the many notes she included, an | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | algorithm to compute the Bernoulli numbers, which is considered to be the first | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | published algorithm ever specifically tailored for implementation on a computer. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Spelling (63 priority) Message: | 65 | Following Babbage, although unaware of his earlier work, Percy Ludgate in 1909 | ^~~~~~~ Did you mean to spell `Ludgate` this way? 66 | published the 2nd of the only two designs for mechanical analytical engines in Suggest: - Replace with: “Legate” - Replace with: “Luggage” - Replace with: “Luddite” Lint: Spelling (63 priority) Message: | 67 | history. In 1914, the Spanish engineer Leonardo Torres Quevedo published his | ^~~~~~~ Did you mean to spell `Quevedo` this way? 68 | Essays on Automatics, and designed, inspired by Babbage, a theoretical Suggest: - Replace with: “Queued” - Replace with: “Acevedo” Lint: Spelling (63 priority) Message: | 71 | 1920, to celebrate the 100th anniversary of the invention of the arithmometer, | ^~~~~~~~~~~~ Did you mean to spell `arithmometer` this way? 72 | Torres presented in Paris the Electromechanical Arithmometer, a prototype that Suggest: - Replace with: “arithmetic” - Replace with: “anemometer” Lint: Spelling (63 priority) Message: | 72 | Torres presented in Paris the Electromechanical Arithmometer, a prototype that | ^~~~~~~~~~~~ Did you mean to spell `Arithmometer` this way? 73 | demonstrated the feasibility of an electromechanical analytical engine, on which Suggest: - Replace with: “Arithmetic” - Replace with: “Anemometer” Lint: Readability (127 priority) Message: | 74 | commands could be typed and the results printed automatically. In 1937, one | ^~~~~~~~~~~~~ 75 | hundred years after Babbage's impossible dream, Howard Aiken convinced IBM, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 76 | which was making all kinds of punched card equipment and was also in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 77 | calculator business to develop his giant programmable calculator, the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | ASCC/Harvard Mark I, based on Babbage's Analytical Engine, which itself used | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | cards and a central computing unit. When the machine was finished, some hailed | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Spelling (63 priority) Message: | 77 | calculator business to develop his giant programmable calculator, the 78 | ASCC/Harvard Mark I, based on Babbage's Analytical Engine, which itself used | ^~~~ Did you mean to spell `ASCC` this way? Suggest: - Replace with: “Ac” - Replace with: “Ace” - Replace with: “Act” Lint: Spelling (63 priority) Message: | 82 | During the 1940s, with the development of new and more powerful computing 83 | machines such as the Atanasoff–Berry computer and ENIAC, the term computer came | ^~~~~~~~~ Did you mean to spell `Atanasoff` this way? Suggest: - Replace with: “Standoff” - Replace with: “Stand off” Lint: Spelling (63 priority) Message: | 83 | machines such as the Atanasoff–Berry computer and ENIAC, the term computer came | ^~~~~ Did you mean to spell `ENIAC` this way? 84 | to refer to the machines rather than their human predecessors. As it became Suggest: - Replace with: “Enact” - Replace with: “Epic” - Replace with: “Enc” Lint: Capitalization (31 priority) Message: | 87 | 1945, IBM founded the Watson Scientific Computing Laboratory at Columbia | ^~~~~~~~~ 88 | University in New York City. The renovated fraternity house on Manhattan's West | ~~~~~~~~~~ Ensure proper capitalization of major universities in the United States. Suggest: - Replace with: “Columbia University” Lint: Capitalization (31 priority) Message: | 91 | around the world. Ultimately, the close relationship between IBM and Columbia | ^~~~~~~~~ 92 | University was instrumental in the emergence of a new scientific discipline, | ~~~~~~~~~~ Ensure proper capitalization of major universities in the United States. Suggest: - Replace with: “Columbia University” Lint: Capitalization (127 priority) Message: | 102 | ## Etymology and scope | ^~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “## Etymology and Scope” Lint: Readability (127 priority) Message: | 104 | Although first proposed in 1956, the term "computer science" appears in a 1959 | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | article in Communications of the ACM, in which Louis Fein argues for the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | creation of a Graduate School in Computer Sciences analogous to the creation of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 107 | Harvard Business School in 1921. Louis justifies the name by arguing that, like | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 105 | article in Communications of the ACM, in which Louis Fein argues for the | ^~~~ Did you mean to spell `Fein` this way? 106 | creation of a Graduate School in Computer Sciences analogous to the creation of Suggest: - Replace with: “Fen” - Replace with: “Fern” - Replace with: “Fin” Lint: Spelling (63 priority) Message: | 110 | and those of others such as numerical analyst George Forsythe, were rewarded: | ^~~~~~~~ Did you mean `Forsythia`? Suggest: - Replace with: “Forsythia” Lint: Spelling (63 priority) Message: | 115 | computing science, to emphasize precisely that difference. Danish scientist 116 | Peter Naur suggested the term datalogy, to reflect the fact that the scientific | ^~~~ Did you mean to spell `Naur` this way? Suggest: - Replace with: “Nair” - Replace with: “Nauru” - Replace with: “Nag” Lint: Spelling (63 priority) Message: | 115 | computing science, to emphasize precisely that difference. Danish scientist 116 | Peter Naur suggested the term datalogy, to reflect the fact that the scientific | ^~~~~~~~ Did you mean to spell `datalogy` this way? Suggest: - Replace with: “analogy” - Replace with: “catalog” - Replace with: “catalogs” Lint: Spelling (63 priority) Message: | 118 | involving computers. The first scientific institution to use the term was the 119 | Department of Datalogy at the University of Copenhagen, founded in 1969, with | ^~~~~~~~ Did you mean to spell `Datalogy` this way? Suggest: - Replace with: “DataDog” - Replace with: “Analogy” - Replace with: “Catalog” Lint: Spelling (63 priority) Message: | 119 | Department of Datalogy at the University of Copenhagen, founded in 1969, with 120 | Peter Naur being the first professor in datalogy. The term is used mainly in the | ^~~~ Did you mean to spell `Naur` this way? Suggest: - Replace with: “Nair” - Replace with: “Nauru” - Replace with: “Nag” Lint: Spelling (63 priority) Message: | 119 | Department of Datalogy at the University of Copenhagen, founded in 1969, with 120 | Peter Naur being the first professor in datalogy. The term is used mainly in the | ^~~~~~~~ Did you mean to spell `datalogy` this way? Suggest: - Replace with: “analogy” - Replace with: “catalog” - Replace with: “catalogs” Lint: Spelling (63 priority) Message: | 121 | Scandinavian countries. An alternative term, also proposed by Naur, is data | ^~~~ Did you mean to spell `Naur` this way? 122 | science; this is now used for a multi-disciplinary field of data analysis, Suggest: - Replace with: “Nair” - Replace with: “Nauru” - Replace with: “Nag” Lint: Spelling (127 priority) Message: | 122 | science; this is now used for a multi-disciplinary field of data analysis, | ^~~~~~~~~~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. 123 | including statistics and databases. Suggest: - Replace with: “multidisciplinary” Lint: Spelling (63 priority) Message: | 126 | field of computing were suggested (albeit facetiously) in the Communications of 127 | the ACM—turingineer, turologist, flow-charts-man, applied meta-mathematician, | ^~~~~~~~~~~ Did you mean to spell `turingineer` this way? Suggest: - Replace with: “engineer” - Replace with: “springier” - Replace with: “springiness” Lint: Spelling (63 priority) Message: | 126 | field of computing were suggested (albeit facetiously) in the Communications of 127 | the ACM—turingineer, turologist, flow-charts-man, applied meta-mathematician, | ^~~~~~~~~~ Did you mean to spell `turologist` this way? Suggest: - Replace with: “theologist” - Replace with: “urologist” - Replace with: “neurologist” Lint: Spelling (63 priority) Message: | 128 | and applied epistemologist. Three months later in the same journal, comptologist | ^~~~~~~~~~~~ Did you mean `cosmetologist`? 129 | was suggested, followed next year by hypologist. The term computics has also Suggest: - Replace with: “cosmetologist” Lint: Spelling (63 priority) Message: | 128 | and applied epistemologist. Three months later in the same journal, comptologist 129 | was suggested, followed next year by hypologist. The term computics has also | ^~~~~~~~~~ Did you mean to spell `hypologist` this way? Suggest: - Replace with: “horologist” - Replace with: “hydrologist” - Replace with: “apologist” Lint: Spelling (63 priority) Message: | 129 | was suggested, followed next year by hypologist. The term computics has also | ^~~~~~~~~ Did you mean to spell `computics` this way? 130 | been suggested. In Europe, terms derived from contracted translations of the Suggest: - Replace with: “computers” - Replace with: “computes” - Replace with: “computing” Lint: Readability (127 priority) Message: | 130 | been suggested. In Europe, terms derived from contracted translations of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 131 | expression "automatic information" (e.g. "informazione automatica" in Italian) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 132 | or "information and mathematics" are often used, e.g. informatique (French), | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | Informatik (German), informatica (Italian, Dutch), informática (Spanish, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 134 | Portuguese), informatika (Slavic languages and Hungarian) or pliroforiki | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 135 | (πληροφορική, which means informatics) in Greek. Similar words have also been | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Spelling (63 priority) Message: | 131 | expression "automatic information" (e.g. "informazione automatica" in Italian) | ^~~~~~~~~~~~ Did you mean `information`? 132 | or "information and mathematics" are often used, e.g. informatique (French), Suggest: - Replace with: “information” Lint: Spelling (63 priority) Message: | 131 | expression "automatic information" (e.g. "informazione automatica" in Italian) | ^~~~~~~~~~ Did you mean to spell `automatica` this way? 132 | or "information and mathematics" are often used, e.g. informatique (French), Suggest: - Replace with: “automatic” - Replace with: “automatics” - Replace with: “automatic's” Lint: Typo (31 priority) Message: | 131 | expression "automatic information" (e.g. "informazione automatica" in Italian) | ^~~~~~~~~~ `automatica` should probably be written as `automatic a`. 132 | or "information and mathematics" are often used, e.g. informatique (French), Suggest: - Replace with: “automatic a” Lint: Spelling (63 priority) Message: | 132 | or "information and mathematics" are often used, e.g. informatique (French), | ^~~~~~~~~~~~ Did you mean `informative`? 133 | Informatik (German), informatica (Italian, Dutch), informática (Spanish, Suggest: - Replace with: “informative” Lint: Spelling (63 priority) Message: | 132 | or "information and mathematics" are often used, e.g. informatique (French), 133 | Informatik (German), informatica (Italian, Dutch), informática (Spanish, | ^~~~~~~~~~ Did you mean to spell `Informatik` this way? Suggest: - Replace with: “Informatics” - Replace with: “Information” - Replace with: “Informative” Lint: Spelling (63 priority) Message: | 132 | or "information and mathematics" are often used, e.g. informatique (French), 133 | Informatik (German), informatica (Italian, Dutch), informática (Spanish, | ^~~~~~~~~~~ Did you mean to spell `informatica` this way? Suggest: - Replace with: “informatics” - Replace with: “information” - Replace with: “informative” Lint: Spelling (63 priority) Message: | 133 | Informatik (German), informatica (Italian, Dutch), informática (Spanish, | ^~~~~~~~~~~ Did you mean `informatics`? 134 | Portuguese), informatika (Slavic languages and Hungarian) or pliroforiki Suggest: - Replace with: “informatics” Lint: Spelling (63 priority) Message: | 133 | Informatik (German), informatica (Italian, Dutch), informática (Spanish, 134 | Portuguese), informatika (Slavic languages and Hungarian) or pliroforiki | ^~~~~~~~~~~ Did you mean to spell `informatika` this way? Suggest: - Replace with: “informatics” - Replace with: “information” - Replace with: “informative” Lint: Spelling (63 priority) Message: | 134 | Portuguese), informatika (Slavic languages and Hungarian) or pliroforiki | ^~~~~~~~~~~ Did you mean to spell `pliroforiki` this way? 135 | (πληροφορική, which means informatics) in Greek. Similar words have also been Lint: Spelling (63 priority) Message: | 140 | A folkloric quotation, often attributed to—but almost certainly not first 141 | formulated by—Edsger Dijkstra, states that "computer science is no more about | ^~~~~~ Did you mean to spell `Edsger` this way? Suggest: - Replace with: “Edger” - Replace with: “Eager” - Replace with: “Edge” Lint: Readability (127 priority) Message: | 154 | computing is a mathematical science. Early computer science was strongly | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 155 | influenced by the work of mathematicians such as Kurt Gödel, Alan Turing, John | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 156 | von Neumann, Rózsa Péter and Alonzo Church and there continues to be a useful | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | interchange of ideas between the two fields in areas such as mathematical logic, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 158 | category theory, domain theory, and algebra. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Spelling (63 priority) Message: | 155 | influenced by the work of mathematicians such as Kurt Gödel, Alan Turing, John 156 | von Neumann, Rózsa Péter and Alonzo Church and there continues to be a useful | ^~~ Did you mean to spell `von` this way? Suggest: - Replace with: “van” - Replace with: “vol” - Replace with: “vow” Lint: Spelling (63 priority) Message: | 155 | influenced by the work of mathematicians such as Kurt Gödel, Alan Turing, John 156 | von Neumann, Rózsa Péter and Alonzo Church and there continues to be a useful | ^~~~~~~ Did you mean `Newman`? Suggest: - Replace with: “Newman” Lint: Spelling (63 priority) Message: | 155 | influenced by the work of mathematicians such as Kurt Gödel, Alan Turing, John 156 | von Neumann, Rózsa Péter and Alonzo Church and there continues to be a useful | ^~~~~ Did you mean `Rosa`? Suggest: - Replace with: “Rosa” Lint: Spelling (63 priority) Message: | 155 | influenced by the work of mathematicians such as Kurt Gödel, Alan Turing, John 156 | von Neumann, Rózsa Péter and Alonzo Church and there continues to be a useful | ^~~~~ Did you mean to spell `Péter` this way? Suggest: - Replace with: “Peter” - Replace with: “Pother” - Replace with: “Paper” Lint: Readability (127 priority) Message: | 162 | "software engineering" means, and how computer science is defined. David Parnas, | ^~~~~~~~~~~~~~ 163 | taking a cue from the relationship between other engineering and science | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 164 | disciplines, has claimed that the principal focus of computer science is | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | studying the properties of computation in general, while the principal focus of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 166 | software engineering is the design of specific computations to achieve practical | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | goals, making the two separate but complementary disciplines. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Spelling (63 priority) Message: | 162 | "software engineering" means, and how computer science is defined. David Parnas, | ^~~~~~ Did you mean to spell `Parnas` this way? 163 | taking a cue from the relationship between other engineering and science Suggest: - Replace with: “Paras” - Replace with: “Parkas” - Replace with: “Parana's” Lint: Capitalization (127 priority) Message: | 178 | ### Epistemology of computer science | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Epistemology of Computer Science” Lint: Spelling (63 priority) Message: | 181 | computer science is a discipline of science, mathematics, or engineering. Allen 182 | Newell and Herbert A. Simon argued in 1975, | ^~~~~~ Did you mean to spell `Newell` this way? Suggest: - Replace with: “Newel” - Replace with: “Newels” - Replace with: “Newel's” Lint: Spelling (63 priority) Message: | 181 | computer science is a discipline of science, mathematics, or engineering. Allen 182 | Newell and Herbert A. Simon argued in 1975, | ^~ Did you mean to spell `A.` this way? Suggest: - Replace with: “A” - Replace with: “Ab” - Replace with: “Ac” Lint: Readability (127 priority) Message: | 192 | It has since been argued that computer science can be classified as an empirical | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 193 | science since it makes use of empirical testing to evaluate the correctness of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 194 | programs, but a problem remains in defining the laws and theorems of computer | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | science (if any exist) and defining the nature of experiments in computer | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 196 | science. Proponents of classifying computer science as an engineering discipline | ~~~~~~~~ This sentence is 53 words long. Lint: Readability (127 priority) Message: | 198 | way as bridges in civil engineering and airplanes in aerospace engineering. They | ^~~~~ 199 | also argue that while empirical sciences observe what presently exists, computer | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 200 | science observes what is possible to exist and while scientists discover laws | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | from observation, no proper laws have been found in computer science and it is | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 202 | instead concerned with creating phenomena. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 207 | Computer scientists Edsger W. Dijkstra and Tony Hoare regard instructions for | ^~~~~~ Did you mean to spell `Edsger` this way? Suggest: - Replace with: “Edger” - Replace with: “Eager” - Replace with: “Edge” Lint: Spelling (63 priority) Message: | 207 | Computer scientists Edsger W. Dijkstra and Tony Hoare regard instructions for | ^~ Did you mean to spell `W.` this way? Suggest: - Replace with: “We” - Replace with: “WA” - Replace with: “WI” Lint: Spelling (63 priority) Message: | 207 | Computer scientists Edsger W. Dijkstra and Tony Hoare regard instructions for | ^~~~~ Did you mean to spell `Hoare` this way? 208 | computer programs as mathematical sentences and interpret formal semantics for Suggest: - Replace with: “Hare” - Replace with: “Hoard” - Replace with: “Hoary” Lint: Capitalization (127 priority) Message: | 211 | ### Paradigms of computer science | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Paradigms of Computer Science” Lint: Spelling (63 priority) Message: | 214 | separate paradigms in computer science. Peter Wegner argued that those paradigms | ^~~~~~ Did you mean to spell `Wegner` this way? 215 | are science, technology, and mathematics. Peter Denning's working group argued Suggest: - Replace with: “Wagner” - Replace with: “Wigner” - Replace with: “Wetter” Lint: Spelling (63 priority) Message: | 215 | are science, technology, and mathematics. Peter Denning's working group argued | ^~~~~~~~~ Did you mean to spell `Denning's` this way? 216 | that they are theory, abstraction (modeling), and design. Amnon H. Eden Suggest: - Replace with: “Deming's” - Replace with: “Dennis's” - Replace with: “Dancing's” Lint: Spelling (63 priority) Message: | 216 | that they are theory, abstraction (modeling), and design. Amnon H. Eden | ^~~~~ Did you mean to spell `Amnon` this way? Suggest: - Replace with: “Anon” - Replace with: “Amnion” - Replace with: “Amazon” Lint: Readability (127 priority) Message: | 216 | that they are theory, abstraction (modeling), and design. Amnon H. Eden | ^~~~~~~~~~~~~~ 217 | described them as the "rationalist paradigm" (which treats computer science as a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 218 | branch of mathematics, which is prevalent in theoretical computer science, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 219 | mainly employs deductive reasoning), the "technocratic paradigm" (which might be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | found in engineering approaches, most prominently in software engineering), and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 221 | the "scientific paradigm" (which approaches computer-related artifacts from the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 222 | empirical perspective of natural sciences, identifiable in some branches of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | artificial intelligence). Computer science focuses on methods involved in | ~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 68 words long. Lint: Spelling (63 priority) Message: | 216 | that they are theory, abstraction (modeling), and design. Amnon H. Eden | ^~ Did you mean to spell `H.` this way? Suggest: - Replace with: “Ha” - Replace with: “He” - Replace with: “Hi” Lint: Style (31 priority) Message: | 224 | design, specification, programming, verification, implementation and testing of | ^~~~~~~~~~~~~~ An Oxford comma is necessary here. 225 | human-made computing systems. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 231 | implementing computing systems in hardware and software. CSAB, formerly called | ^~~~ Did you mean to spell `CSAB` this way? 232 | Computing Sciences Accreditation Board—which is made up of representatives of Suggest: - Replace with: “Cab” - Replace with: “Crab” - Replace with: “Cad” Lint: Readability (127 priority) Message: | 231 | implementing computing systems in hardware and software. CSAB, formerly called | ^~~~~~~~~~~~~~~~~~~~~~ 232 | Computing Sciences Accreditation Board—which is made up of representatives of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | the Association for Computing Machinery (ACM), and the IEEE Computer Society | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 234 | (IEEE CS)—identifies four areas that it considers crucial to the discipline of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 235 | computer science: theory of computation, algorithms and data structures, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | programming methodology and languages, and computer elements and architecture. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Style (31 priority) Message: | 235 | computer science: theory of computation, algorithms and data structures, | ^~~~~~~~~~ An Oxford comma is necessary here. 236 | programming methodology and languages, and computer elements and architecture. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 237 | In addition to these four areas, CSAB also identifies fields such as software | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | engineering, artificial intelligence, computer networking and communication, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 239 | database systems, parallel computation, distributed computation, human–computer | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | interaction, computer graphics, operating systems, and numerical and symbolic | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 241 | computation as being important areas of computer science. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (63 priority) Message: | 237 | In addition to these four areas, CSAB also identifies fields such as software | ^~~~ Did you mean to spell `CSAB` this way? Suggest: - Replace with: “Cab” - Replace with: “Crab” - Replace with: “Cad” Lint: Capitalization (127 priority) Message: | 243 | ### Theoretical computer science | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Theoretical Computer Science” Lint: Capitalization (127 priority) Message: | 250 | #### Theory of computation | ^~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Theory of Computation” Lint: Spelling (63 priority) Message: | 252 | According to Peter Denning, the fundamental question underlying computer science | ^~~~~~~ Did you mean to spell `Denning` this way? Suggest: - Replace with: “Dunning” - Replace with: “Denting” - Replace with: “Denying” Lint: Spelling (63 priority) Message: | 262 | The famous P = NP? problem, one of the Millennium Prize Problems, is an open | ^~ Did you mean to spell `NP` this way? Suggest: - Replace with: “Nap” - Replace with: “Nip” - Replace with: “No” Lint: Capitalization (31 priority) Message: | 262 | The famous P = NP? problem, one of the Millennium Prize Problems, is an open | ^~~~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Problem” Lint: Capitalization (127 priority) Message: | 265 | #### Information and coding theory | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Information and Coding Theory” Lint: Capitalization (127 priority) Message: | 277 | #### Data structures and algorithms | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Data Structures and Algorithms” Lint: Capitalization (127 priority) Message: | 282 | #### Programming language theory and formal methods | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Programming Language Theory and Formal Methods” Lint: Agreement (31 priority) Message: | 286 | programming languages and their individual features. It falls within the 287 | discipline of computer science, both depending on and affecting mathematics, | ^~~~~~~~~~~~~~ `depending` is a mass noun. 288 | software engineering, and linguistics. It is an active research area, with Suggest: - Replace with: “both pieces of depending” Lint: Style (31 priority) Message: | 291 | Formal methods are a particular kind of mathematically based technique for the 292 | specification, development and verification of software and hardware systems. | ^~~~~~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 302 | safety or security is of utmost importance. Formal methods are best described as | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 303 | the application of a fairly broad variety of theoretical computer science | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | fundamentals, in particular logic calculi, formal languages, automata theory, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 305 | and program semantics, but also type systems and algebraic data types to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 306 | problems in software and hardware specification and verification. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: Capitalization (127 priority) Message: | 308 | ### Applied computer science | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Applied Computer Science” Lint: Capitalization (127 priority) Message: | 310 | #### Computer graphics and visualization | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Computer Graphics and Visualization” Lint: Capitalization (127 priority) Message: | 318 | #### Image and sound processing | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Image and Sound Processing” Lint: Style (31 priority) Message: | 320 | Information can take the form of images, sound, video or other multimedia. Bits | ^~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Style (31 priority) Message: | 323 | processing algorithms independently of the type of information carrier – whether 324 | it is electrical, mechanical or biological. This field plays important role in | ^~~~~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Capitalization (31 priority) Message: | 327 | is the lower bound on the complexity of fast Fourier transform algorithms? is | ^~ This sentence does not start with a capital letter 328 | one of the unsolved problems in theoretical computer science. Suggest: - Replace with: “Is” Lint: Capitalization (127 priority) Message: | 330 | #### Computational science, finance and engineering | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Computational Science, Finance and Engineering” Lint: Style (31 priority) Message: | 330 | #### Computational science, finance and engineering | ^~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Capitalization (127 priority) Message: | 344 | #### Human–computer interaction | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Human–Computer Interaction” Lint: Spelling (63 priority) Message: | 346 | Human–computer interaction (HCI) is the field of study and research concerned | ^~~ Did you mean to spell `HCI` this way? Suggest: - Replace with: “Hi” - Replace with: “H'm” - Replace with: “Chi” Lint: Spelling (63 priority) Message: | 348 | interaction between humans and computer interfaces. HCI has several subfields | ^~~ Did you mean to spell `HCI` this way? 349 | that focus on the relationship between emotions, social behavior and brain Suggest: - Replace with: “Hi” - Replace with: “H'm” - Replace with: “Chi” Lint: Capitalization (127 priority) Message: | 352 | #### Software engineering | ^~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Software Engineering” Lint: Punctuation (31 priority) Message: | 360 | maintenance. For example software testing, systems engineering, technical debt | ^~~~~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. Suggest: - Insert “,” Lint: Capitalization (127 priority) Message: | 363 | #### Artificial intelligence | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Artificial Intelligence” Lint: Capitalization (127 priority) Message: | 383 | ### Computer systems | ^~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Computer Systems” Lint: Capitalization (127 priority) Message: | 385 | #### Computer architecture and microarchitecture | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Computer Architecture and Microarchitecture” Lint: Spelling (63 priority) Message: | 393 | term "architecture" in computer literature can be traced to the work of Lyle R. | ^~ Did you mean to spell `R.` this way? Suggest: - Replace with: “RI” - Replace with: “Ra” - Replace with: “Ru” Lint: Spelling (63 priority) Message: | 394 | Johnson and Frederick P. Brooks Jr., members of the Machine Organization | ^~ Did you mean to spell `P.` this way? Suggest: - Replace with: “Pa” - Replace with: “Pi” - Replace with: “PE” Lint: Capitalization (127 priority) Message: | 397 | #### Concurrent, parallel and distributed computing | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Concurrent, Parallel and Distributed Computing” Lint: Spelling (63 priority) Message: | 401 | mathematical models have been developed for general concurrent computation 402 | including Petri nets, process calculi and the parallel random access machine | ^~~~~ Did you mean to spell `Petri` this way? Suggest: - Replace with: “Petra” - Replace with: “Perth” - Replace with: “Pet's” Lint: Capitalization (127 priority) Message: | 408 | #### Computer networks | ^~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Computer Networks” Lint: Capitalization (127 priority) Message: | 413 | #### Computer security and cryptography | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Computer Security and Cryptography” Lint: WordChoice (127 priority) Message: | 421 | Modern cryptography is the scientific study of problems relating to distributed | ^~~~~~~~~~~~~~ The base form of the verb is needed here. 422 | computations that can be attacked. Technologies studied in modern cryptography Suggest: - Replace with: “to distribute” Lint: Capitalization (127 priority) Message: | 427 | #### Databases and data mining | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Databases and Data Mining” Lint: WordChoice (63 priority) Message: | 432 | languages. Data mining is a process of discovering patterns in large data sets. | ^~~~~~~~~ Did you mean the closed compound noun “datasets”? Suggest: - Replace with: “datasets” Lint: Spelling (63 priority) Message: | 436 | The philosopher of computing Bill Rapaport noted three Great Insights of | ^~~~~~~~ Did you mean to spell `Rapaport` this way? 437 | Computer Science: Suggest: - Replace with: “Rapport” - Replace with: “Rappaport” - Replace with: “Rapports” Lint: Spelling (63 priority) Message: | 439 | - Gottfried Wilhelm Leibniz's, George Boole's, Alan Turing's, Claude Shannon's, | ^~~~~~~~~ Did you mean to spell `Gottfried` this way? Suggest: - Replace with: “Guttered” - Replace with: “Lotteries” - Replace with: “Notified” Lint: Spelling (127 priority) Message: | 444 | > easily distinguishable states, such as "on/off", "magnetized/de-magnetized", | ^~~~~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. 445 | > "high-voltage/low-voltage", etc.). Suggest: - Replace with: “demagnetized” Lint: Capitalization (31 priority) Message: | 456 | - print 1 at current location. | ^~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Print” Lint: Spelling (63 priority) Message: | 458 | - Corrado Böhm and Giuseppe Jacopini's insight: there are only three ways of | ^~~~~~~ Did you mean to spell `Corrado` this way? Suggest: - Replace with: “Comrade” - Replace with: “Corral” - Replace with: “Corridor” Lint: Spelling (63 priority) Message: | 458 | - Corrado Böhm and Giuseppe Jacopini's insight: there are only three ways of | ^~~~ Did you mean to spell `Böhm` this way? Suggest: - Replace with: “Bah” - Replace with: “Baht” - Replace with: “Beam” Lint: Spelling (63 priority) Message: | 458 | - Corrado Böhm and Giuseppe Jacopini's insight: there are only three ways of | ^~~~~~~~~~ Did you mean `Jacobin's`? Suggest: - Replace with: “Jacobin's” Lint: Capitalization (31 priority) Message: | 466 | - selection: IF such-and-such is the case, THEN do this, ELSE do that; | ^~~~~~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Selection” Lint: Capitalization (31 priority) Message: | 467 | - repetition: WHILE such-and-such is the case, DO this. The three rules of | ^~~~~~~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Repetition” Lint: Spelling (63 priority) Message: | 467 | - repetition: WHILE such-and-such is the case, DO this. The three rules of 468 | Boehm's and Jacopini's insight can be further simplified with the use of | ^~~~~~~ Did you mean to spell `Boehm's` this way? Suggest: - Replace with: “Boer's” - Replace with: “Bohr's” - Replace with: “Beam's” Lint: Spelling (63 priority) Message: | 467 | - repetition: WHILE such-and-such is the case, DO this. The three rules of 468 | Boehm's and Jacopini's insight can be further simplified with the use of | ^~~~~~~~~~ Did you mean `Jacobin's`? Suggest: - Replace with: “Jacobin's” Lint: Spelling (63 priority) Message: | 468 | Boehm's and Jacopini's insight can be further simplified with the use of 469 | goto (which means it is more elementary than structured programming). | ^~~~ Did you mean to spell `goto` this way? Suggest: - Replace with: “goo” - Replace with: “got” - Replace with: “goths” Lint: Typo (31 priority) Message: | 468 | Boehm's and Jacopini's insight can be further simplified with the use of 469 | goto (which means it is more elementary than structured programming). | ^~~~ `goto` should probably be written as `go to`. Suggest: - Replace with: “go to” Lint: Capitalization (127 priority) Message: | 471 | ## Programming paradigms | ^~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “## Programming Paradigms” Lint: Punctuation (31 priority) Message: | 490 | the data fields of the object with which they are associated. Thus | ^~~~ Discourse markers at the beginning of a sentence should be followed by a comma. 491 | object-oriented computer programs are made out of objects that interact with Suggest: - Insert “,” ================================================ FILE: harper-core/tests/text/linters/Difficult sentences.snap.yml ================================================ Lint: Capitalization (127 priority) Message: | 1 | # Difficult sentences | ^~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “# Difficult Sentences” Lint: Capitalization (31 priority) Message: | 20 | at the bottom of the page; sitting at the table; at church; at sea | ^~ This sentence does not start with a capital letter Suggest: - Replace with: “At” Lint: Capitalization (31 priority) Message: | 32 | men at work; children at play | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Men” Lint: Spelling (63 priority) Message: | 56 | He was protected by his body armour. | ^~~~~~ Did you mean to spell `armour` this way? Suggest: - Replace with: “armor” - Replace with: “amour” - Replace with: “arbor” Lint: Capitalization (31 priority) Message: | 76 | sold by the yard; cheaper if bought by the gross | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Sold” Lint: Spelling (63 priority) Message: | 87 | Are you eating by Rabbi Fischer? (at the house of) 88 | By Chabad, it's different. (with, among) | ^~~~~~ Did you mean to spell `Chabad` this way? Suggest: - Replace with: “Cabal” - Replace with: “Chad” - Replace with: “Charade” Lint: Capitalization (31 priority) Message: | 100 | a by path; a by room (Out of the way, off to one side.) | ^ This sentence does not start with a capital letter Suggest: - Replace with: “A” Lint: Capitalization (31 priority) Message: | 126 | Who's for ice-cream? | ^~~~~ The canonical dictionary spelling is `who's`. Suggest: - Replace with: “who's” Lint: Capitalization (31 priority) Message: | 160 | to account for one's whereabouts. | ^~ This sentence does not start with a capital letter Suggest: - Replace with: “To” Lint: Spelling (63 priority) Message: | 180 | I’ve been doing this from pickney. | ^~~~~~~ Did you mean to spell `pickney` this way? Suggest: - Replace with: “picket” - Replace with: “pickle” - Replace with: “piney” Lint: Spelling (63 priority) Message: | 208 | My aim in travelling there was to find my missing friend. | ^~~~~~~~~~ Did you mean to spell `travelling` this way? Suggest: - Replace with: “traveling” - Replace with: “travailing” - Replace with: “travelings” Lint: Typo (127 priority) Message: | 243 | His parents got him an in with the company. | ^~ Did you mean `and in`? Suggest: - Replace with: “and” Lint: Spelling (63 priority) Message: | 249 | The bullet is about five centimetres in. | ^~~~~~~~~~~ Did you mean to spell `centimetres` this way? Suggest: - Replace with: “centimeters” - Replace with: “centimeter's” - Replace with: “centimeter” Lint: Capitalization (31 priority) Message: | 254 | the in train (incoming train) | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “The” Lint: Spelling (63 priority) Message: | 256 | in by descent; in by purchase; in of the seisin of her husband | ^~~~~~ Did you mean to spell `seisin` this way? 257 | He is very in with the Joneses. Suggest: - Replace with: “season” - Replace with: “seismic” - Replace with: “sepsis” Lint: Spelling (63 priority) Message: | 258 | I need to keep in with the neighbours in case I ever need a favour from them. | ^~~~~~~~~~ Did you mean to spell `neighbours` this way? Suggest: - Replace with: “neighbors” - Replace with: “neighbor's” - Replace with: “neighbor” Lint: Spelling (63 priority) Message: | 258 | I need to keep in with the neighbours in case I ever need a favour from them. | ^~~~~~ Did you mean to spell `favour` this way? Suggest: - Replace with: “favor” - Replace with: “famous” - Replace with: “flavor” Lint: Spelling (63 priority) Message: | 280 | Welcome to the historic town of Harwich. | ^~~~~~~ Did you mean to spell `Harwich` this way? Suggest: - Replace with: “Norwich” - Replace with: “Warwick” Lint: Spelling (63 priority) Message: | 284 | This behaviour is typical of teenagers. | ^~~~~~~~~ Did you mean to spell `behaviour` this way? Suggest: - Replace with: “behavior” - Replace with: “behaviors” Lint: Style (63 priority) Message: | 289 | It's not that big of a deal. | ^~~~~~~~ The word `of` is not needed here. Suggest: - Replace with: “big a” Lint: Spelling (63 priority) Message: | 300 | That TV programme that you wanted to watch is on now. | ^~~~~~~~~ Did you mean to spell `programme` this way? Suggest: - Replace with: “programmed” - Replace with: “programmer” - Replace with: “programmes” Lint: Spelling (63 priority) Message: | 310 | Ponsonby-Smythe hit a thumping on drive. | ^~~~~~~~ Did you mean to spell `Ponsonby` this way? Suggest: - Replace with: “Poison's” - Replace with: “Poison” - Replace with: “Poisoned” Lint: Spelling (63 priority) Message: | 310 | Ponsonby-Smythe hit a thumping on drive. | ^~~~~~ Did you mean to spell `Smythe` this way? Suggest: - Replace with: “Scythe” - Replace with: “Smith” - Replace with: “Smiths” Lint: Agreement (31 priority) Message: | 310 | Ponsonby-Smythe hit a thumping on drive. | ^~~~~~~~~~ `thumping` is a mass noun. Suggest: - Replace with: “thumping” - Replace with: “some thumping” - Replace with: “a piece of thumping” Lint: Capitalization (31 priority) Message: | 316 | turn the television on | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Turn” Lint: Capitalization (31 priority) Message: | 322 | and so on. | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “And” Lint: Capitalization (31 priority) Message: | 340 | on the left, on the right, on the side, on the bottom. | ^~ This sentence does not start with a capital letter Suggest: - Replace with: “On” Lint: Capitalization (31 priority) Message: | 342 | on a bus, on a train, on a plane, on a ferry, on a yacht. | ^~ This sentence does not start with a capital letter Suggest: - Replace with: “On” Lint: Redundancy (31 priority) Message: | 343 | All of the responsibility is on him. | ^~~~~~~~~~ Consider simplifying to `all the`. Suggest: - Replace with: “All the” Lint: Capitalization (31 priority) Message: | 345 | tug on the rope; push hard on the door. | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Tug” Lint: Capitalization (31 priority) Message: | 349 | to play on a violin or piano. | ^~ This sentence does not start with a capital letter Suggest: - Replace with: “To” Lint: Spelling (63 priority) Message: | 358 | Smith scored again on twelve minutes, doubling Mudchester Rovers' lead. | ^~~~~~~~~~ Did you mean `Manchester`? Suggest: - Replace with: “Manchester” Lint: Spelling (63 priority) Message: | 366 | He travelled on false documents. | ^~~~~~~~~ Did you mean to spell `travelled` this way? Suggest: - Replace with: “traveled” - Replace with: “travailed” - Replace with: “traveler” Lint: Spelling (63 priority) Message: | 398 | Who am I to criticise? I've done worse things myself. | ^~~~~~~~~ Did you mean to spell `criticise` this way? Suggest: - Replace with: “criticize” - Replace with: “criticism” - Replace with: “critic's” Lint: Capitalization (31 priority) Message: | 449 | slain with robbers. | ^~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Slain” Lint: Capitalization (31 priority) Message: | 450 | cut with a knife | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Cut” Lint: Capitalization (31 priority) Message: | 461 | overcome with happiness | ^~~~~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Overcome” Lint: Grammar (31 priority) Message: | 464 | With your kind of body size, you shouldn’t be eating pizza at all. | ^~~~ Use the contraction `you're` (you are) before predicate adjectives instead of the possessive `your` or its variants. Suggest: - Replace with: “you're” ================================================ FILE: harper-core/tests/text/linters/Part-of-speech tagging.snap.yml ================================================ Lint: Capitalization (127 priority) Message: | 6 | # Part-of-speech tagging | ^~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “# Part-of-Speech Tagging” Lint: Readability (127 priority) Message: | 8 | In corpus linguistics, part-of-speech tagging (POS tagging or PoS tagging or | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9 | POST), also called grammatical tagging is the process of marking up a word in a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10 | text (corpus) as corresponding to a particular part of speech, based on both its | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 | definition and its context. A simplified form of this is commonly taught to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: Capitalization (127 priority) Message: | 8 | In corpus linguistics, part-of-speech tagging (POS tagging or PoS tagging or | ^~~ This word's canonical spelling is all-caps. 9 | POST), also called grammatical tagging is the process of marking up a word in a Suggest: - Replace with: “POS” Lint: Spelling (63 priority) Message: | 8 | In corpus linguistics, part-of-speech tagging (POS tagging or PoS tagging or | ^~~ Did you mean to spell `PoS` this way? 9 | POST), also called grammatical tagging is the process of marking up a word in a Suggest: - Replace with: “Pod” - Replace with: “Poi” - Replace with: “Pol” Lint: Spelling (63 priority) Message: | 18 | two distinctive groups: rule-based and stochastic. E. Brill's tagger, one of the | ^~ Did you mean to spell `E.` this way? Suggest: - Replace with: “E” - Replace with: “Ea” - Replace with: “Eh” Lint: Spelling (63 priority) Message: | 18 | two distinctive groups: rule-based and stochastic. E. Brill's tagger, one of the | ^~~~~~~ Did you mean to spell `Brill's` this way? 19 | first and most widely used English POS-taggers, employs rule-based algorithms. Suggest: - Replace with: “Brillo's” - Replace with: “Bill's” - Replace with: “Drill's” Lint: Style (127 priority) Message: | 32 | Correct grammatical tagging will reflect that "dogs" is here used as a verb, not 33 | as the more common plural noun. Grammatical context is one way to determine | ^~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “commoner” Lint: Readability (127 priority) Message: | 33 | as the more common plural noun. Grammatical context is one way to determine | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 34 | this; semantic analysis can also be used to infer that "sailor" and "hatch" | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 35 | implicate "dogs" as 1) in the nautical context and 2) an action applied to the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 | object "hatch" (in this context, "dogs" is a nautical term meaning "fastens (a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 37 | watertight door) securely"). | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Capitalization (127 priority) Message: | 39 | ### Tag sets | ^~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Tag Sets” Lint: Spelling (127 priority) Message: | 43 | However, there are clearly many more categories and sub-categories. For nouns, | ^~~~~~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “subcategories” Lint: Spelling (63 priority) Message: | 49 | tags. For example, NN for singular common nouns, NNS for plural common nouns, NP | ^~ Did you mean to spell `NN` this way? Suggest: - Replace with: “No” - Replace with: “Non” - Replace with: “Nu” Lint: Spelling (63 priority) Message: | 49 | tags. For example, NN for singular common nouns, NNS for plural common nouns, NP | ^~~ Did you mean to spell `NNS` this way? 50 | for singular proper nouns (see the POS tags used in the Brown Corpus). Other Suggest: - Replace with: “NES” - Replace with: “Nos” - Replace with: “Nuns” Lint: Spelling (63 priority) Message: | 49 | tags. For example, NN for singular common nouns, NNS for plural common nouns, NP | ^~ Did you mean to spell `NP` this way? 50 | for singular proper nouns (see the POS tags used in the Brown Corpus). Other Suggest: - Replace with: “Nap” - Replace with: “Nip” - Replace with: “No” Lint: Spelling (63 priority) Message: | 55 | 150 separate parts of speech for English. Work on stochastic methods for tagging 56 | Koine Greek (DeRose 1990) has used over 1,000 parts of speech and found that | ^~~~~ Did you mean to spell `Koine` this way? Suggest: - Replace with: “Kline” - Replace with: “Kine” - Replace with: “Kin” Lint: Spelling (63 priority) Message: | 55 | 150 separate parts of speech for English. Work on stochastic methods for tagging 56 | Koine Greek (DeRose 1990) has used over 1,000 parts of speech and found that | ^~~~~~ Did you mean to spell `DeRose` this way? Suggest: - Replace with: “Depose” - Replace with: “Demise” - Replace with: “Dense” Lint: Spelling (63 priority) Message: | 57 | about as many words were ambiguous in that language as in English. A 58 | morphosyntactic descriptor in the case of morphologically rich languages is | ^~~~~~~~~~~~~~~ Did you mean to spell `morphosyntactic` this way? Suggest: - Replace with: “morphosyntax's” - Replace with: “morphosyntax” Lint: Spelling (63 priority) Message: | 58 | morphosyntactic descriptor in the case of morphologically rich languages is | ^~~~~~~~~~~~~~~ Did you mean `morphological`? 59 | commonly expressed using very short mnemonics, such as Ncmsan for Category=Noun, Suggest: - Replace with: “morphological” Lint: Spelling (63 priority) Message: | 59 | commonly expressed using very short mnemonics, such as Ncmsan for Category=Noun, | ^~~~~~ Did you mean to spell `Ncmsan` this way? 60 | Type = common, Gender = masculine, Number = singular, Case = accusative, Animate Suggest: - Replace with: “Nisan” - Replace with: “Nissan” Lint: Spelling (63 priority) Message: | 63 | The most popular "tag set" for POS tagging for American English is probably the 64 | Penn tag set, developed in the Penn Treebank project. It is largely similar to | ^~~~~~~~ Did you mean to spell `Treebank` this way? Suggest: - Replace with: “Tie back” - Replace with: “Tieback” - Replace with: “Traceback” Lint: WordChoice (63 priority) Message: | 73 | cross-language differences. The tag sets for heavily inflected languages such as | ^~~~~~~~ Did you mean the closed compound noun “tagsets”? Suggest: - Replace with: “tagsets” Lint: Spelling (63 priority) Message: | 75 | as Inuit languages may be virtually impossible. At the other extreme, Petrov et | ^~~~~~ Did you mean to spell `Petrov` this way? 76 | al. have proposed a "universal" tag set, with 12 categories (for example, no Suggest: - Replace with: “Petrol” - Replace with: “Patrol” - Replace with: “Patron” Lint: Spelling (63 priority) Message: | 75 | as Inuit languages may be virtually impossible. At the other extreme, Petrov et | ^~~ 76 | al. have proposed a "universal" tag set, with 12 categories (for example, no | ~~~ Did you mean `et al.`? Suggest: - Replace with: “et al.” Lint: Spelling (63 priority) Message: | 86 | The first major corpus of English for computer analysis was the Brown Corpus 87 | developed at Brown University by Henry Kučera and W. Nelson Francis, in the | ^~~~~~ Did you mean to spell `Kučera` this way? Suggest: - Replace with: “Kara” - Replace with: “Kendra” - Replace with: “Keri” Lint: Spelling (63 priority) Message: | 87 | developed at Brown University by Henry Kučera and W. Nelson Francis, in the | ^~ Did you mean to spell `W.` this way? Suggest: - Replace with: “We” - Replace with: “WA” - Replace with: “WI” Lint: Spelling (63 priority) Message: | 98 | and corrected by hand, and later users sent in errata so that by the late 70s | ^ Did you mean to spell `s` this way? 99 | the tagging was nearly perfect (allowing for some cases on which even human Suggest: - Replace with: “so” - Replace with: “as” - Replace with: “is” Lint: WordChoice (126 priority) Message: | 104 | other languages. Statistics derived by analyzing it formed the basis for most | ^~~~~ 105 | later part-of-speech tagging systems, such as CLAWS and VOLSUNGA. However, by | ~~~~~ The degree of the adverb conflicts with the degree of the adjective. Suggest: - Replace with: “later” - Replace with: “latest” Lint: Spelling (63 priority) Message: | 105 | later part-of-speech tagging systems, such as CLAWS and VOLSUNGA. However, by | ^~~~~~~~ Did you mean to spell `VOLSUNGA` this way? Suggest: - Replace with: “Volcanic” - Replace with: “Volcano” - Replace with: “Voltage” Lint: Readability (127 priority) Message: | 110 | For some time, part-of-speech tagging was considered an inseparable part of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 111 | natural language processing, because there are certain cases where the correct | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 112 | part of speech cannot be decided without understanding the semantics or even the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | pragmatics of the context. This is extremely expensive, especially because | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Capitalization (127 priority) Message: | 117 | ### Use of hidden Markov models | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Use of Hidden Markov Models” Lint: Spelling (63 priority) Message: | 119 | In the mid-1980s, researchers in Europe began to use hidden Markov models (HMMs) | ^~~~ Did you mean to spell `HMMs` this way? 120 | to disambiguate parts of speech, when working to tag the Lancaster-Oslo-Bergen Suggest: - Replace with: “Hams” - Replace with: “Hems” - Replace with: “Hums” Lint: Spelling (63 priority) Message: | 121 | Corpus of British English. HMMs involve counting cases (such as from the Brown | ^~~~ Did you mean to spell `HMMs` this way? Suggest: - Replace with: “Hams” - Replace with: “Hems” - Replace with: “Hums” Lint: Style (127 priority) Message: | 125 | program can decide that "can" in "the can" is far more likely to be a noun than | ^~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists 126 | a verb or a modal. The same method can, of course, be used to benefit from Suggest: - Replace with: “likelier” Lint: Spelling (63 priority) Message: | 129 | More advanced ("higher-order") HMMs learn the probabilities not only of pairs | ^~~~ Did you mean to spell `HMMs` this way? Suggest: - Replace with: “Hams” - Replace with: “Hems” - Replace with: “Hums” Lint: Readability (127 priority) Message: | 141 | Eugene Charniak points out in Statistical techniques for natural language | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 142 | parsing (1997) that merely assigning the most common tag to each known word and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 143 | the tag "proper noun" to all unknowns will approach 90% accuracy because many | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 144 | words are unambiguous, and many others only rarely represent their less-common | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | parts of speech. | ~~~~~~~~~~~~~~~~ This sentence is 50 words long. Lint: Spelling (63 priority) Message: | 141 | Eugene Charniak points out in Statistical techniques for natural language | ^~~~~~~~ Did you mean to spell `Charniak` this way? Suggest: - Replace with: “Cardiac” - Replace with: “Carnal” - Replace with: “Carnival” Lint: Style (127 priority) Message: | 142 | parsing (1997) that merely assigning the most common tag to each known word and | ^~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists 143 | the tag "proper noun" to all unknowns will approach 90% accuracy because many Suggest: - Replace with: “commonest” Lint: Readability (127 priority) Message: | 148 | expensive since it enumerated all possibilities. It sometimes had to resort to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | backup methods when there were simply too many options (the Brown Corpus | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 150 | contains a case with 17 ambiguous words in a row, and there are words such as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | "still" that can represent as many as 7 distinct parts of speech. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: WordChoice (63 priority) Message: | 148 | expensive since it enumerated all possibilities. It sometimes had to resort to 149 | backup methods when there were simply too many options (the Brown Corpus | ^~~~~~ This word should be a phrasal verb, not a compound noun. Suggest: - Replace with: “back up” Lint: Spelling (63 priority) Message: | 153 | HMMs underlie the functioning of stochastic taggers and are used in various | ^~~~ Did you mean to spell `HMMs` this way? Suggest: - Replace with: “Hams” - Replace with: “Hems” - Replace with: “Hums” Lint: Spelling (127 priority) Message: | 154 | algorithms one of the most widely used being the bi-directional inference | ^~~~~~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. 155 | algorithm. Suggest: - Replace with: “bidirectional” Lint: Capitalization (127 priority) Message: | 157 | ### Dynamic programming methods | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “### Dynamic Programming Methods” Lint: Spelling (63 priority) Message: | 159 | In 1987, Steven DeRose and Kenneth W. Church independently developed dynamic | ^~~~~~ Did you mean to spell `DeRose` this way? Suggest: - Replace with: “Depose” - Replace with: “Demise” - Replace with: “Dense” Lint: Spelling (63 priority) Message: | 159 | In 1987, Steven DeRose and Kenneth W. Church independently developed dynamic | ^~ Did you mean to spell `W.` this way? Suggest: - Replace with: “We” - Replace with: “WA” - Replace with: “WI” Lint: Spelling (63 priority) Message: | 160 | programming algorithms to solve the same problem in vastly less time. Their 161 | methods were similar to the Viterbi algorithm known for some time in other | ^~~~~~~ Did you mean to spell `Viterbi` this way? Suggest: - Replace with: “Vite's” - Replace with: “Viper's” - Replace with: “Voter's” Lint: Spelling (63 priority) Message: | 162 | fields. DeRose used a table of pairs, while Church used a table of triples and a | ^~~~~~ Did you mean to spell `DeRose` this way? Suggest: - Replace with: “Depose” - Replace with: “Demise” - Replace with: “Dense” Lint: Readability (127 priority) Message: | 162 | fields. DeRose used a table of pairs, while Church used a table of triples and a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | method of estimating the values for triples that were rare or nonexistent in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 164 | Brown Corpus (an actual measurement of triple probabilities would require a much | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | larger corpus). Both methods achieved an accuracy of over 95%. DeRose's 1990 | ~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 165 | larger corpus). Both methods achieved an accuracy of over 95%. DeRose's 1990 | ^~~~~~~~ Did you mean to spell `DeRose's` this way? 166 | dissertation at Brown University included analyses of the specific error types, Suggest: - Replace with: “Defoe's” - Replace with: “Denise's” - Replace with: “Demise's” Lint: Spelling (63 priority) Message: | 166 | dissertation at Brown University included analyses of the specific error types, | ^~~~~~~~ Did you mean to spell `analyses` this way? 167 | probabilities, and other related data, and replicated his work for Greek, where Suggest: - Replace with: “analyzes” - Replace with: “analysis” - Replace with: “analysts” Lint: Spelling (63 priority) Message: | 173 | levels of linguistic analysis: syntax, morphology, semantics, and so on. CLAWS, 174 | DeRose's and Church's methods did fail for some of the known cases where | ^~~~~~~~ Did you mean to spell `DeRose's` this way? Suggest: - Replace with: “Defoe's” - Replace with: “Denise's” - Replace with: “Demise's” Lint: Readability (127 priority) Message: | 175 | semantics is required, but those proved negligibly rare. This convinced many in | ^~~~~~~~~~~~~~~~~~~~~~~ 176 | the field that part-of-speech tagging could usefully be separated from the other | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | levels of processing; this, in turn, simplified the theory and practice of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | computerized language analysis and encouraged researchers to find ways to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 179 | separate other pieces as well. Markov Models became the standard method for the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Capitalization (127 priority) Message: | 182 | #### Unsupervised taggers | ^~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Unsupervised Taggers” Lint: Spelling (127 priority) Message: | 184 | The methods already discussed involve working from a pre-existing corpus to | ^~~~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. 185 | learn tag probabilities. It is, however, also possible to bootstrap using Suggest: - Replace with: “preexisting” Lint: Capitalization (127 priority) Message: | 198 | #### Other taggers and methods | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “#### Other Taggers and Methods” Lint: Spelling (63 priority) Message: | 200 | Some current major algorithms for part-of-speech tagging include the Viterbi | ^~~~~~~ Did you mean to spell `Viterbi` this way? 201 | algorithm, Brill tagger, Constraint Grammar, and the Baum-Welch algorithm (also Suggest: - Replace with: “Vite's” - Replace with: “Viper's” - Replace with: “Voter's” Lint: Spelling (63 priority) Message: | 201 | algorithm, Brill tagger, Constraint Grammar, and the Baum-Welch algorithm (also | ^~~~~ Did you mean to spell `Welch` this way? 202 | known as the forward-backward algorithm). Hidden Markov model and visible Markov Suggest: - Replace with: “Welsh” - Replace with: “Wench” - Replace with: “Watch” Lint: Spelling (63 priority) Message: | 203 | model taggers can both be implemented using the Viterbi algorithm. The | ^~~~~~~ Did you mean to spell `Viterbi` this way? Suggest: - Replace with: “Vite's” - Replace with: “Viper's” - Replace with: “Voter's” Lint: Spelling (63 priority) Message: | 208 | tagging. Methods such as SVM, maximum entropy classifier, perceptron, and | ^~~ Did you mean to spell `SVM` this way? Suggest: - Replace with: “Sim” - Replace with: “Sum” - Replace with: “SCM” Lint: Spelling (63 priority) Message: | 213 | Wiki. This comparison uses the Penn tag set on some of the Penn Treebank data, | ^~~~~~~~ Did you mean to spell `Treebank` this way? 214 | so the results are directly comparable. However, many significant taggers are Suggest: - Replace with: “Tie back” - Replace with: “Tieback” - Replace with: “Traceback” ================================================ FILE: harper-core/tests/text/linters/Spell.US.snap.yml ================================================ Lint: Spelling (63 priority) Message: | 9 | - Afterwards. | ^~~~~~~~~~ Did you mean to spell `Afterwards` this way? Suggest: - Replace with: “Afterwords” - Replace with: “Afterward” - Replace with: “Afterword's” Lint: Spelling (63 priority) Message: | 10 | - Centre. | ^~~~~~ Did you mean to spell `Centre` this way? Suggest: - Replace with: “Center” - Replace with: “Cent's” - Replace with: “Censure” Lint: Spelling (63 priority) Message: | 11 | - Labelled. | ^~~~~~~~ Did you mean to spell `Labelled` this way? Suggest: - Replace with: “Labeled” - Replace with: “Labeler” - Replace with: “Labelless” Lint: Spelling (63 priority) Message: | 12 | - Flavour. | ^~~~~~~ Did you mean to spell `Flavour` this way? Suggest: - Replace with: “Flavor” - Replace with: “Favor” - Replace with: “Flour” Lint: Spelling (63 priority) Message: | 13 | - Favoured. | ^~~~~~~~ Did you mean to spell `Favoured` this way? Suggest: - Replace with: “Favored” - Replace with: “Flavored” - Replace with: “Floured” Lint: Spelling (63 priority) Message: | 14 | - Honour. | ^~~~~~ Did you mean to spell `Honour` this way? Suggest: - Replace with: “Honor” - Replace with: “Hour” - Replace with: “Honer” Lint: Spelling (63 priority) Message: | 15 | - Grey. | ^~~~ Did you mean to spell `Grey` this way? Suggest: - Replace with: “Gray” - Replace with: “Grew” - Replace with: “Gorey” Lint: Spelling (63 priority) Message: | 16 | - Quarrelled. | ^~~~~~~~~~ Did you mean to spell `Quarrelled` this way? Suggest: - Replace with: “Quarreled” - Replace with: “Quarreler” Lint: Spelling (63 priority) Message: | 17 | - Quarrelling. | ^~~~~~~~~~~ Did you mean `Quarreling`? Suggest: - Replace with: “Quarreling” Lint: Spelling (63 priority) Message: | 18 | - Recognised. | ^~~~~~~~~~ Did you mean to spell `Recognised` this way? Suggest: - Replace with: “Recognized” - Replace with: “Recognize” - Replace with: “Recognizer” Lint: Spelling (63 priority) Message: | 19 | - Neighbour. | ^~~~~~~~~ Did you mean to spell `Neighbour` this way? Suggest: - Replace with: “Neighbor” - Replace with: “Neighbors” Lint: Spelling (63 priority) Message: | 20 | - Neighbouring. | ^~~~~~~~~~~~ Did you mean `Neighboring`? Suggest: - Replace with: “Neighboring” Lint: Spelling (63 priority) Message: | 21 | - Clamour. | ^~~~~~~ Did you mean to spell `Clamour` this way? Suggest: - Replace with: “Clamor” - Replace with: “Glamour” - Replace with: “Cavour” Lint: Spelling (63 priority) Message: | 22 | - Theatre. | ^~~~~~~ Did you mean to spell `Theatre` this way? Suggest: - Replace with: “Theater” - Replace with: “They're” - Replace with: “There” Lint: Spelling (63 priority) Message: | 23 | - Analyse. | ^~~~~~~ Did you mean to spell `Analyse` this way? Suggest: - Replace with: “Analyze” - Replace with: “Analyst” - Replace with: “Analysis” ================================================ FILE: harper-core/tests/text/linters/Spell.snap.yml ================================================ Lint: Spelling (63 priority) Message: | 7 | My favourite color is blu. | ^~~~~~~~~ Did you mean to spell `favourite` this way? Suggest: - Replace with: “favorite” - Replace with: “favorites” Lint: Capitalization (127 priority) Message: | 7 | My favourite color is blu. | ^~~ The canonical dictionary spelling is title case: `Blu`. Suggest: - Replace with: “Blu” Lint: Spelling (63 priority) Message: | 7 | My favourite color is blu. | ^~~ Did you mean to spell `blu` this way? Suggest: - Replace with: “bl” - Replace with: “blue” - Replace with: “blur” Lint: Spelling (63 priority) Message: | 8 | I must defend my honour! | ^~~~~~ Did you mean to spell `honour` this way? Suggest: - Replace with: “honor” - Replace with: “hour” - Replace with: “honer” Lint: Spelling (63 priority) Message: | 9 | I recognize that you recognise me. | ^~~~~~~~~ Did you mean to spell `recognise` this way? Suggest: - Replace with: “recognize” - Replace with: “recognized” - Replace with: “recognizer” Lint: Spelling (63 priority) Message: | 11 | I analyse how you infantilise me. | ^~~~~~~ Did you mean to spell `analyse` this way? Suggest: - Replace with: “analyze” - Replace with: “analyst” - Replace with: “analysis” Lint: Spelling (63 priority) Message: | 11 | I analyse how you infantilise me. | ^~~~~~~~~~~ Did you mean to spell `infantilise` this way? Suggest: - Replace with: “infantilize” - Replace with: “infantile” - Replace with: “infanticide” Lint: Spelling (63 priority) Message: | 12 | Careful, traveller! | ^~~~~~~~~ Did you mean to spell `traveller` this way? Suggest: - Replace with: “traveler” - Replace with: “traveled” - Replace with: “travelers” Lint: Spelling (63 priority) Message: | 13 | At the centre of the theatre I dropped a litre of coke. | ^~~~~~ Did you mean to spell `centre` this way? Suggest: - Replace with: “center” - Replace with: “cent's” - Replace with: “censure” Lint: Spelling (63 priority) Message: | 13 | At the centre of the theatre I dropped a litre of coke. | ^~~~~~~ Did you mean to spell `theatre` this way? Suggest: - Replace with: “theater” - Replace with: “they're” - Replace with: “there” Lint: Spelling (63 priority) Message: | 13 | At the centre of the theatre I dropped a litre of coke. | ^~~~~ Did you mean to spell `litre` this way? Suggest: - Replace with: “liter” - Replace with: “lithe” - Replace with: “lire” ================================================ FILE: harper-core/tests/text/linters/Swear.snap.yml ================================================ Lint: WordChoice (127 priority) Message: | 7 | One turd, two turds. | ^~~~ Try to avoid offensive language. Suggest: - Replace with: “poo” - Replace with: “poop” - Replace with: “feces” - Replace with: “dung” Lint: WordChoice (127 priority) Message: | 7 | One turd, two turds. | ^~~~~ Try to avoid offensive language. Suggest: - Replace with: “poos” - Replace with: “poops” - Replace with: “feces” - Replace with: “dung” Lint: WordChoice (127 priority) Message: | 9 | I fart, you're farting, he farts, she farted. | ^~~~ Try to avoid offensive language. Suggest: - Replace with: “gas” - Replace with: “wind” - Replace with: “break wind” Lint: WordChoice (127 priority) Message: | 9 | I fart, you're farting, he farts, she farted. | ^~~~~~~ Try to avoid offensive language. Suggest: - Replace with: “breaking wind” Lint: WordChoice (127 priority) Message: | 9 | I fart, you're farting, he farts, she farted. | ^~~~~ Try to avoid offensive language. Suggest: - Replace with: “gas” - Replace with: “wind” - Replace with: “breaks wind” Lint: WordChoice (127 priority) Message: | 9 | I fart, you're farting, he farts, she farted. | ^~~~~~ Try to avoid offensive language. Suggest: - Replace with: “broke wind” - Replace with: “broken wind” ================================================ FILE: harper-core/tests/text/linters/The Constitution of the United States.snap.yml ================================================ Lint: Capitalization (127 priority) Message: | 3 | # The Constitution Of The United States Of America | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “# The Constitution of the United States of America” Lint: Readability (127 priority) Message: | 5 | **We the People** of the United States, in Order to form a more perfect Union, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 | establish Justice, insure domestic Tranquility, provide for the common defence, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7 | promote the general Welfare, and secure the Blessings of Liberty to ourselves | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8 | and our Posterity, do ordain and establish this Constitution for the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9 | States of America. | ~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Style (127 priority) Message: | 5 | **We the People** of the United States, in Order to form a more perfect Union, | ^~~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists 6 | establish Justice, insure domestic Tranquility, provide for the common defence, Suggest: - Replace with: “perfecter” Lint: Spelling (63 priority) Message: | 6 | establish Justice, insure domestic Tranquility, provide for the common defence, | ^~~~~~~ Did you mean to spell `defence` this way? 7 | promote the general Welfare, and secure the Blessings of Liberty to ourselves Suggest: - Replace with: “defense” - Replace with: “decency” - Replace with: “defect” Lint: Capitalization (31 priority) Message: | 8 | and our Posterity, do ordain and establish this Constitution for the United | ^~~~~~~ 9 | States of America. | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Spelling (63 priority) Message: | 11 | ## Article. I. | ^~ Did you mean to spell `I.` this way? Suggest: - Replace with: “I” - Replace with: “Id” - Replace with: “If” Lint: Readability (127 priority) Message: | 17 | Representatives. Congress shall make no law respecting an establishment of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 18 | religion, or prohibiting the free exercise thereof; or abridging the freedom of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 | speech, or of the press; or the right of the people peaceably to assemble, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 | to petition the government for a redress of grievances. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Readability (127 priority) Message: | 22 | No person shall be a Senator or Representative in Congress, or elector of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 23 | President and Vice President, or hold any office, civil or military, under the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 | United States, or under any State, who, having previously taken an oath, as a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 | member of Congress, or as an officer of the United States, or as a member of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 26 | any State legislature, or as an executive or judicial officer of any State, to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 27 | support the Constitution of the United States, shall have engaged in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 28 | insurrection or rebellion against the same, or given aid or comfort to the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 29 | enemies thereof. But Congress may, by a vote of two-thirds of each House, | ~~~~~~~~~~~~~~~~ This sentence is 96 words long. Lint: Readability (127 priority) Message: | 38 | The House of Representatives shall be composed of Members | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 39 | chosen every second Year by the People of the several States, and the Electors | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 40 | in each State shall have the Qualifications requisite for Electors of the most | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 41 | numerous Branch of the State Legislature. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 43 | No Person shall be a Representative who shall not have attained to the Age of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 44 | twenty five Years, and been seven Years a Citizen of the United States, and who | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 | shall not, when elected, be an Inhabitant of that State in which he shall be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 | chosen. | ~~~~~~~ This sentence is 46 words long. Lint: Readability (127 priority) Message: | 50 | excluding Indians not taxed. But when the right to vote at any election for the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 51 | choice of electors for President and Vice President of the United States, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 52 | Representatives in Congress, the Executive and Judicial officers of a State, or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | the members of the Legislature thereof, is denied to any of the male | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | inhabitants of such State, being twenty-one years of age, and citizens of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | United States, or in any way abridged, except for participation in rebellion, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | or other crime, the basis of representation therein shall be reduced in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | proportion which the number of such male citizens shall bear to the whole | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | number of male citizens twenty-one years of age in such State. The actual | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 112 words long. Lint: Style (31 priority) Message: | 51 | choice of electors for President and Vice President of the United States, 52 | Representatives in Congress, the Executive and Judicial officers of a State, or | ^~~~~~~~~ An Oxford comma is necessary here. 53 | the members of the Legislature thereof, is denied to any of the male Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 61 | in such Manner as they shall by Law direct. The Number of Representatives shall | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | not exceed one for every thirty Thousand, but each State shall have at Least | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | one Representative; and until such enumeration shall be made, the State of New | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | and Providence Plantations one, Connecticut five, New-York six, New Jersey | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | four, Pennsylvania eight, Delaware one, Maryland six, Virginia ten, North | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 67 | Carolina five, South Carolina five, and Georgia three. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 72 words long. Lint: Spelling (63 priority) Message: | 63 | one Representative; and until such enumeration shall be made, the State of New 64 | Hampshire shall be entitled to chuse three, Massachusetts eight, Rhode-Island | ^~~~~ Did you mean to spell `chuse` this way? Suggest: - Replace with: “cause” - Replace with: “chase” - Replace with: “chose” Lint: Spelling (63 priority) Message: | 72 | The House of Representatives shall chuse their Speaker and other Officers; and | ^~~~~ Did you mean to spell `chuse` this way? Suggest: - Replace with: “cause” - Replace with: “chase” - Replace with: “chose” Lint: Readability (127 priority) Message: | 86 | they shall be divided as equally as may be into three Classes. The Seats of the | ^~~~~~~~~~~~~~~~~ 87 | Senators of the first Class shall be vacated at the Expiration of the second | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | Year, of the second Class at the Expiration of the fourth Year, and of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 89 | third Class at the Expiration of the sixth Year, so that one third may be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | chosen every second Year; and when vacancies happen in the representation of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 91 | any State in the Senate, the executive authority of such State shall issue | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | writs of election to fill such vacancies: Provided, That the legislature of any | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 93 | State may empower the executive thereof to make temporary appointments until | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 94 | the people fill the vacancies by election as the legislature may direct. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 109 words long. Lint: Readability (127 priority) Message: | 96 | No Person shall be a Senator who shall not have attained to the Age of thirty | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 97 | Years, and been nine Years a Citizen of the United States, and who shall not, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 98 | when elected, be an Inhabitant of that State for which he shall be chosen. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (63 priority) Message: | 103 | The Senate shall chuse their other Officers, and also a President pro tempore, | ^~~~~ Did you mean to spell `chuse` this way? Suggest: - Replace with: “cause” - Replace with: “chase” - Replace with: “chose” Lint: Redundancy (31 priority) Message: | 103 | The Senate shall chuse their other Officers, and also a President pro tempore, | ^~~~~~~~ Consider using just `and`. 104 | in the Absence of the Vice President, or when he shall exercise the Office of Suggest: - Replace with: “and” Lint: Spelling (63 priority) Message: | 103 | The Senate shall chuse their other Officers, and also a President pro tempore, | ^~~~~~~ Did you mean to spell `tempore` this way? 104 | in the Absence of the Vice President, or when he shall exercise the Office of Suggest: - Replace with: “tempo's” - Replace with: “temple” - Replace with: “tempo” Lint: Typo (31 priority) Message: | 103 | The Senate shall chuse their other Officers, and also a President pro tempore, | ^~~~~~~ `tempore` should probably be written as `temp ore`. 104 | in the Absence of the Vice President, or when he shall exercise the Office of Suggest: - Replace with: “temp ore” Lint: Readability (127 priority) Message: | 112 | Judgment in Cases of impeachment shall not extend further than to removal from | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | Office, and disqualification to hold and enjoy any Office of honor, Trust or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 114 | Profit under the United States: but the Party convicted shall nevertheless be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 115 | liable and subject to Indictment, Trial, Judgment and Punishment, according to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | Law. | ~~~~ This sentence is 50 words long. Lint: Style (31 priority) Message: | 113 | Office, and disqualification to hold and enjoy any Office of honor, Trust or | ^~~~~ An Oxford comma is necessary here. 114 | Profit under the United States: but the Party convicted shall nevertheless be Suggest: - Insert “,” Lint: Style (31 priority) Message: | 115 | liable and subject to Indictment, Trial, Judgment and Punishment, according to | ^~~~~~~~ An Oxford comma is necessary here. 116 | Law. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 122 | The Times, Places and Manner of holding Elections for Senators | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 123 | and Representatives, shall be prescribed in each State by the Legislature | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 124 | thereof; but the Congress may at any time by Law make or alter such | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | Regulations, except as to the Places of chusing Senators. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Style (31 priority) Message: | 122 | The Times, Places and Manner of holding Elections for Senators | ^~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 124 | thereof; but the Congress may at any time by Law make or alter such 125 | Regulations, except as to the Places of chusing Senators. | ^~~~~~~ Did you mean to spell `chusing` this way? Suggest: - Replace with: “causing” - Replace with: “chasing” - Replace with: “cousin” Lint: Readability (127 priority) Message: | 133 | Each House shall be the Judge of the Elections, Returns and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 134 | Qualifications of its own Members, and a Majority of each shall constitute a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 135 | Quorum to do Business; but a smaller Number may adjourn from day to day, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 136 | may be authorized to compel the Attendance of absent Members, in such Manner, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | and under such Penalties as each House may provide. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 61 words long. Lint: Style (31 priority) Message: | 133 | Each House shall be the Judge of the Elections, Returns and | ^~~~~~~ An Oxford comma is necessary here. 134 | Qualifications of its own Members, and a Majority of each shall constitute a Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 139 | Each House may determine the Rules of its Proceedings, punish its Members for 140 | disorderly Behaviour, and, with the Concurrence of two thirds, expel a Member. | ^~~~~~~~~ Did you mean to spell `Behaviour` this way? Suggest: - Replace with: “Behavior” - Replace with: “Behaviors” Lint: Readability (127 priority) Message: | 142 | Each House shall keep a Journal of its Proceedings, and from time to time | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 143 | publish the same, excepting such Parts as may in their Judgment require | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 144 | Secrecy; and the Yeas and Nays of the Members of either House on any question | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | shall, at the Desire of one fifth of those Present, be entered on the Journal. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Readability (127 priority) Message: | 155 | the United States. They shall in all Cases, except Treason, Felony and Breach | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 156 | of the Peace, be privileged from Arrest during their Attendance at the Session | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | of their respective Houses, and in going to and returning from the same; and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 158 | for any Speech or Debate in either House, they shall not be questioned in any | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 159 | other Place. | ~~~~~~~~~~~~ This sentence is 54 words long. Lint: Style (31 priority) Message: | 155 | the United States. They shall in all Cases, except Treason, Felony and Breach | ^~~~~~ An Oxford comma is necessary here. 156 | of the Peace, be privileged from Arrest during their Attendance at the Session Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 161 | No Senator or Representative shall, during the Time for which he was elected, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 162 | be appointed to any civil Office under the Authority of the United States, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | which shall have been created, or the Emoluments whereof shall have been | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 164 | encreased during such time; and no Person holding any Office under the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | States, shall be a Member of either House during his Continuance in Office. No | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 64 words long. Lint: Spelling (63 priority) Message: | 163 | which shall have been created, or the Emoluments whereof shall have been 164 | encreased during such time; and no Person holding any Office under the United | ^~~~~~~~~ Did you mean to spell `encreased` this way? Suggest: - Replace with: “increased” - Replace with: “encased” - Replace with: “entreated” Lint: Capitalization (31 priority) Message: | 164 | encreased during such time; and no Person holding any Office under the United | ^~~~~~~ 165 | States, shall be a Member of either House during his Continuance in Office. No | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Readability (127 priority) Message: | 177 | Every Bill which shall have passed the House of Representatives and the Senate, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | shall, before it become a Law, be presented to the President of the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 179 | States; If he approve he shall sign it, but if not he shall return it, with his | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | Objections to that House in which it shall have originated, who shall enter the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | Objections at large on their Journal, and proceed to reconsider it. If after | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 69 words long. Lint: Capitalization (31 priority) Message: | 178 | shall, before it become a Law, be presented to the President of the United | ^~~~~~~ 179 | States; If he approve he shall sign it, but if not he shall return it, with his | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Agreement (127 priority) Message: | 179 | States; If he approve he shall sign it, but if not he shall return it, with his | ^~~~~~~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “approves” Lint: Readability (127 priority) Message: | 181 | Objections at large on their Journal, and proceed to reconsider it. If after | ^~~~~~~~~ 182 | such Reconsideration two thirds of that House shall agree to pass the Bill, it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 183 | shall be sent, together with the Objections, to the other House, by which it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | shall likewise be reconsidered, and if approved by two thirds of that House, it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | shall become a Law. But in all such Cases the Votes of both Houses shall be | ~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Readability (127 priority) Message: | 187 | against the Bill shall be entered on the Journal of each House respectively. If | ^~~ 188 | any Bill shall not be returned by the President within ten Days (Sundays | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 189 | excepted) after it shall have been presented to him, the Same shall be a Law, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 190 | in like Manner as if he had signed it, unless the Congress by their Adjournment | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | prevent its Return, in which Case it shall not be a Law. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Readability (127 priority) Message: | 193 | Every Order, Resolution, or Vote to which the Concurrence of the Senate and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 194 | House of Representatives may be necessary (except on a question of Adjournment) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | shall be presented to the President of the United States; and before the Same | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 196 | shall take Effect, shall be approved by him, or being disapproved by him, shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | be repassed by two thirds of the Senate and House of Representatives, according | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 198 | to the Rules and Limitations prescribed in the Case of a Bill. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 78 words long. Lint: Spelling (63 priority) Message: | 196 | shall take Effect, shall be approved by him, or being disapproved by him, shall 197 | be repassed by two thirds of the Senate and House of Representatives, according | ^~~~~~~~ Did you mean to spell `repassed` this way? Suggest: - Replace with: “rebased” - Replace with: “recessed” - Replace with: “rehashed” Lint: Readability (127 priority) Message: | 202 | The Congress shall have Power To lay and collect Taxes, Duties, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 203 | Imposts and Excises, to pay the Debts and provide for the common Defence and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | general Welfare of the United States; but all Duties, Imposts and Excises shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | be uniform throughout the United States; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Style (31 priority) Message: | 202 | The Congress shall have Power To lay and collect Taxes, Duties, 203 | Imposts and Excises, to pay the Debts and provide for the common Defence and | ^~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 203 | Imposts and Excises, to pay the Debts and provide for the common Defence and | ^~~~~~~ Did you mean to spell `Defence` this way? 204 | general Welfare of the United States; but all Duties, Imposts and Excises shall Suggest: - Replace with: “Defense” - Replace with: “Decency” - Replace with: “Defect” Lint: Style (31 priority) Message: | 204 | general Welfare of the United States; but all Duties, Imposts and Excises shall | ^~~~~~~ An Oxford comma is necessary here. 205 | be uniform throughout the United States; Suggest: - Insert “,” Lint: Miscellaneous (31 priority) Message: | 212 | 3. To establish an uniform Rule of Naturalization, and uniform Laws on the subject | ^~ Incorrect indefinite article. Suggest: - Replace with: “a” Lint: Spelling (63 priority) Message: | 229 | 9. To define and punish Piracies and Felonies committed on the high Seas, and | ^~~~~~~~ Did you mean to spell `Piracies` this way? Suggest: - Replace with: “Piracy's” - Replace with: “Papacies” - Replace with: “Pirates” Lint: Spelling (63 priority) Message: | 229 | 9. To define and punish Piracies and Felonies committed on the high Seas, and 230 | Offences against the Law of Nations; | ^~~~~~~~ Did you mean to spell `Offences` this way? Suggest: - Replace with: “Offenses” - Replace with: “Offense's” - Replace with: “Offenders” Lint: Readability (127 priority) Message: | 245 | 15. To provide for organizing, arming, and disciplining, the Militia, and for | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 246 | governing such Part of them as may be employed in the Service of the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | States, reserving to the States respectively, the Appointment of the Officers, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 248 | and the Authority of training the Militia according to the discipline | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | prescribed by Congress; | ~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Capitalization (31 priority) Message: | 246 | governing such Part of them as may be employed in the Service of the United | ^~~~~~~ 247 | States, reserving to the States respectively, the Appointment of the Officers, | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Readability (127 priority) Message: | 251 | 16. To exercise exclusive Legislation in all Cases whatsoever, over such District | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | (not exceeding ten Miles square) as may, by Cession of particular States, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | the Acceptance of Congress, become the Seat of the Government of the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 254 | States, and to exercise like Authority over all Places purchased by the Consent | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | of the Legislature of the State in which the Same shall be, for the Erection of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 256 | Forts, Magazines, Arsenals, dock-Yards, and other needful Buildings;—And | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 76 words long. Lint: Capitalization (31 priority) Message: | 253 | the Acceptance of Congress, become the Seat of the Government of the United | ^~~~~~~ 254 | States, and to exercise like Authority over all Places purchased by the Consent | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Miscellaneous (31 priority) Message: | 253 | the Acceptance of Congress, become the Seat of the Government of the United 254 | States, and to exercise like Authority over all Places purchased by the Consent | ^~~~~~~~ Did you mean the closed compound `overall`? 255 | of the Legislature of the State in which the Same shall be, for the Erection of Suggest: - Replace with: “overall” Lint: Readability (127 priority) Message: | 265 | The Migration or Importation of such Persons as any of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | States now existing shall think proper to admit, shall not be prohibited by the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 267 | Congress prior to the Year one thousand eight hundred and eight, but a Tax or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 268 | duty may be imposed on such Importation, not exceeding ten dollars for each | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 269 | Person. | ~~~~~~~ This sentence is 54 words long. Lint: Spelling (63 priority) Message: | 271 | The Privilege of the Writ of Habeas Corpus shall not be suspended, unless when | ^~~~~~ Did you mean to spell `Habeas` this way? Suggest: - Replace with: “Haber's” - Replace with: “Hale's” - Replace with: “Hebe's” Lint: Spelling (63 priority) Message: | 274 | No Bill of Attainder or ex post facto Law shall be passed. | ^~~~~ Did you mean to spell `facto` this way? Suggest: - Replace with: “fact” - Replace with: “factor” - Replace with: “facts” Lint: Readability (127 priority) Message: | 284 | No Preference shall be given by any Regulation of Commerce or Revenue to the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | Ports of one State over those of another: nor shall Vessels bound to, or from, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 286 | one State, be obliged to enter, clear, or pay Duties in another. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 292 | No Title of Nobility shall be granted by the United States: And no Person | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | holding any Office of Profit or Trust under them, shall, without the Consent of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 294 | the Congress, accept of any present, Emolument, Office, or Title, of any kind | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | whatever, from any King, Prince, or foreign State. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 297 | The right of citizens of the United States to vote in any primary or other | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | election for President or Vice President, for electors for President or Vice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 299 | President, or for Senator or Representative in Congress, shall not be denied or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 300 | abridged by the United States or any State by reason of failure to pay any poll | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | tax or other tax. | ~~~~~~~~~~~~~~~~~ This sentence is 60 words long. Lint: Readability (127 priority) Message: | 305 | No State shall enter into any Treaty, Alliance, or | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 306 | Confederation; grant Letters of Marque and Reprisal; coin Money; emit Bills of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | Credit; make any Thing but gold and silver Coin a Tender in Payment of Debts; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 308 | pass any Bill of Attainder, ex post facto Law, or Law impairing the Obligation | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 309 | of Contracts, or grant any Title of Nobility. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 58 words long. Lint: Spelling (63 priority) Message: | 308 | pass any Bill of Attainder, ex post facto Law, or Law impairing the Obligation | ^~~~~ Did you mean to spell `facto` this way? 309 | of Contracts, or grant any Title of Nobility. Suggest: - Replace with: “fact” - Replace with: “factor” - Replace with: “facts” Lint: Readability (127 priority) Message: | 311 | No State shall, without the Consent of the Congress, lay any Imposts or Duties | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | on Imports or Exports, except what may be absolutely necessary for executing | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 313 | it's inspection Laws: and the net Produce of all Duties and Imposts, laid by | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | any State on Imports or Exports, shall be for the Use of the Treasury of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | United States; and all such Laws shall be subject to the Revision and Controul | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 316 | of the Congress. | ~~~~~~~~~~~~~~~~ This sentence is 73 words long. Lint: Agreement (31 priority) Message: | 312 | on Imports or Exports, except what may be absolutely necessary for executing 313 | it's inspection Laws: and the net Produce of all Duties and Imposts, laid by | ^~~~ Use the possessive pronoun `its` (without an apostrophe) to show ownership. The word `it's` (with an apostrophe) is a contraction of 'it is' or 'it has' and should not be used to indicate possession. Suggest: - Replace with: “its” Lint: Spelling (63 priority) Message: | 315 | United States; and all such Laws shall be subject to the Revision and Controul | ^~~~~~~~ Did you mean to spell `Controul` this way? 316 | of the Congress. Suggest: - Replace with: “Control” - Replace with: “Contour” - Replace with: “Contrail” Lint: Readability (127 priority) Message: | 318 | No State shall, without the Consent of Congress, lay any Duty of Tonnage, keep | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | Troops, or Ships of War in time of Peace, enter into any Agreement or Compact | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 320 | with another State, or with a foreign Power, or engage in War, unless actually | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 321 | invaded, or in such imminent Danger as will not admit of delay. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Readability (127 priority) Message: | 332 | Each State shall appoint, in such Manner as the Legislature thereof may direct, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | a Number of Electors, equal to the whole Number of Senators and Representatives | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 334 | to which the State may be entitled in the Congress: but no Senator or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | Representative, or Person holding an Office of Trust or Profit under the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 336 | States, shall be appointed an Elector. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 59 words long. Lint: Capitalization (31 priority) Message: | 335 | Representative, or Person holding an Office of Trust or Profit under the United | ^~~~~~~ 336 | States, shall be appointed an Elector. | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Capitalization (31 priority) Message: | 338 | #### SubSection. 1. | ^~~~~~~~~~ The canonical dictionary spelling is `subsection`. Suggest: - Replace with: “subsection” Lint: Readability (127 priority) Message: | 340 | The Electors shall meet in their respective states, and vote | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | by ballot for President and Vice-President, one of whom, at least, shall not be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 342 | an inhabitant of the same state with themselves; they shall name in their | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 343 | ballots the person voted for as President, and in distinct ballots the person | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 344 | voted for as Vice-President, and they shall make distinct lists of all persons | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 345 | voted for as President, and all persons voted for as Vice-President and of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | number of votes for each, which lists they shall sign and certify, and transmit | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 347 | sealed to the seat of the government of the United States, directed to the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 348 | President of the Senate;—The President of the Senate shall, in the presence of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 349 | the Senate and House of Representatives, open all the certificates and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | votes shall then be counted;—The person having the greatest Number of votes for | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 351 | President, shall be the President, if such number be a majority of the whole | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | number of Electors appointed; and if no person have such majority, then from | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | the persons having the highest numbers not exceeding three on the list of those | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 354 | voted for as President, the House of Representatives shall choose immediately, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 355 | by ballot, the President. But in choosing the President, the votes shall be | ~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 204 words long. Lint: Readability (127 priority) Message: | 355 | by ballot, the President. But in choosing the President, the votes shall be | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | taken by states, the representation from each state having one vote; a quorum | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | for this purpose shall consist of a member or members from two-thirds of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 358 | states, and a majority of all the states shall be necessary to a choice. [If, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Readability (127 priority) Message: | 360 | elect shall have died, the Vice President elect shall become President. If a | ^~~~~ 361 | President shall not have been chosen before the time fixed for the beginning of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 362 | his term, or if the President elect shall have failed to qualify, then the Vice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | President elect shall act as President until a President shall have qualified; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 364 | and the Congress may by law provide for the case wherein neither a President | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | elect nor a Vice President elect shall have qualified, declaring who shall then | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | act as President, or the manner in which one who is to act shall be selected, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 367 | and such person shall act accordingly until a President or Vice President shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 368 | have qualified.The Congress may by law provide for the case of the death of any | ~~~~~~~~~~~~~~~ This sentence is 101 words long. Lint: Readability (127 priority) Message: | 368 | have qualified.The Congress may by law provide for the case of the death of any | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | of the persons from whom the House of Representatives may choose a President | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 370 | whenever the right of choice shall have devolved upon them, and for the case of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 371 | the death of any of the persons from whom the Senate may choose a Vice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 372 | President whenever the right of choice shall have devolved upon them.]The | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 68 words long. Lint: Readability (127 priority) Message: | 372 | President whenever the right of choice shall have devolved upon them.]The | ^~~~ 373 | person having the greatest number of votes as Vice-President, shall be the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 374 | Vice-President, if such number be a majority of the whole number of Electors | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | appointed, and if no person have a majority, then from the two highest numbers | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | on the list, the Senate shall choose the Vice-President; a quorum for the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 377 | purpose shall consist of two-thirds of the whole number of Senators, and a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | majority of the whole number shall be necessary to a choice. But no person | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 81 words long. Lint: Spelling (63 priority) Message: | 383 | The Congress may determine the Time of chusing the Electors, and the Day on | ^~~~~~~ Did you mean to spell `chusing` this way? 384 | which they shall give their Votes; which Day shall be the same throughout the Suggest: - Replace with: “causing” - Replace with: “chasing” - Replace with: “cousin” Lint: Capitalization (31 priority) Message: | 388 | #### SubSection. 2 | ^~~~~~~~~~ The canonical dictionary spelling is `subsection`. Suggest: - Replace with: “subsection” Lint: Readability (127 priority) Message: | 390 | No Person except a natural born Citizen, or a Citizen of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 391 | United States, at the time of the Adoption of this Constitution, shall be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 392 | eligible to the Office of President; neither shall any Person be eligible to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 393 | that Office who shall not have attained to the Age of thirty five Years, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 394 | been fourteen Years a Resident within the United States. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 62 words long. Lint: Readability (127 priority) Message: | 396 | No person shall be elected to the office of the President more than twice, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | no person who has held the office of President, or acted as President, for more | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 398 | than two years of a term to which some other person was elected President shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | be elected to the office of the President more than once. But this article | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Readability (127 priority) Message: | 399 | be elected to the office of the President more than once. But this article | ^~~~~~~~~~~~~~~~~ 400 | shall not apply to any person holding the office of President when this article | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 401 | was proposed by the Congress, and shall not prevent any person who may be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | holding the office of President, or acting as President, during the term within | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 403 | which this article becomes operative from holding the office of President or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | acting as President during the remainder of such term. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 65 words long. Lint: Capitalization (31 priority) Message: | 406 | #### SubSection 3. | ^~~~~~~~~~ The canonical dictionary spelling is `subsection`. Suggest: - Replace with: “subsection” Lint: Readability (127 priority) Message: | 415 | Whenever the President transmits to the President pro tempore of the Senate and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | the Speaker of the House of Representatives his written declaration that he is | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 417 | unable to discharge the powers and duties of his office, and until he transmits | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 418 | to them a written declaration to the contrary, such powers and duties shall be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 419 | discharged by the Vice President as Acting President. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 62 words long. Lint: Spelling (63 priority) Message: | 415 | Whenever the President transmits to the President pro tempore of the Senate and | ^~~~~~~ Did you mean to spell `tempore` this way? 416 | the Speaker of the House of Representatives his written declaration that he is Suggest: - Replace with: “tempo's” - Replace with: “temple” - Replace with: “tempo” Lint: Typo (31 priority) Message: | 415 | Whenever the President transmits to the President pro tempore of the Senate and | ^~~~~~~ `tempore` should probably be written as `temp ore`. 416 | the Speaker of the House of Representatives his written declaration that he is Suggest: - Replace with: “temp ore” Lint: Readability (127 priority) Message: | 421 | Whenever the Vice President and a majority of either the principal officers of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 422 | the executive departments or of such other body as Congress may by law provide, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | transmit to the President pro tempore of the Senate and the Speaker of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | House of Representatives their written declaration that the President is unable | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 425 | to discharge the powers and duties of his office, the Vice President shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | immediately assume the powers and duties of the office as Acting President. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 77 words long. Lint: Spelling (63 priority) Message: | 422 | the executive departments or of such other body as Congress may by law provide, 423 | transmit to the President pro tempore of the Senate and the Speaker of the | ^~~~~~~ Did you mean to spell `tempore` this way? Suggest: - Replace with: “tempo's” - Replace with: “temple” - Replace with: “tempo” Lint: Typo (31 priority) Message: | 422 | the executive departments or of such other body as Congress may by law provide, 423 | transmit to the President pro tempore of the Senate and the Speaker of the | ^~~~~~~ `tempore` should probably be written as `temp ore`. Suggest: - Replace with: “temp ore” Lint: Readability (127 priority) Message: | 428 | Thereafter, when the President transmits to the President pro tempore of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 429 | Senate and the Speaker of the House of Representatives his written declaration | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 430 | that no inability exists, he shall resume the powers and duties of his office | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | unless the Vice President and a majority of either the principal officers of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 432 | the executive department or of such other body as Congress may by law provide, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 433 | transmit within four days to the President pro tempore of the Senate and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 434 | Speaker of the House of Representatives their written declaration that the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 435 | President is unable to discharge the powers and duties of his office. Thereupon | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 102 words long. Lint: Spelling (63 priority) Message: | 428 | Thereafter, when the President transmits to the President pro tempore of the | ^~~~~~~ Did you mean to spell `tempore` this way? 429 | Senate and the Speaker of the House of Representatives his written declaration Suggest: - Replace with: “tempo's” - Replace with: “temple” - Replace with: “tempo” Lint: Typo (31 priority) Message: | 428 | Thereafter, when the President transmits to the President pro tempore of the | ^~~~~~~ `tempore` should probably be written as `temp ore`. 429 | Senate and the Speaker of the House of Representatives his written declaration Suggest: - Replace with: “temp ore” Lint: Spelling (63 priority) Message: | 433 | transmit within four days to the President pro tempore of the Senate and the | ^~~~~~~ Did you mean to spell `tempore` this way? 434 | Speaker of the House of Representatives their written declaration that the Suggest: - Replace with: “tempo's” - Replace with: “temple” - Replace with: “tempo” Lint: Typo (31 priority) Message: | 433 | transmit within four days to the President pro tempore of the Senate and the | ^~~~~~~ `tempore` should probably be written as `temp ore`. 434 | Speaker of the House of Representatives their written declaration that the Suggest: - Replace with: “temp ore” Lint: Readability (127 priority) Message: | 437 | purpose if not in session. If the Congress, within twenty-one days after | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 438 | receipt of the latter written declaration, or, if Congress is not in session, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 439 | within twenty-one days after Congress is required to assemble, determines by | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 440 | two-thirds vote of both Houses that the President is unable to discharge the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 441 | powers and duties of his office, the Vice President shall continue to discharge | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 442 | the same as Acting President; otherwise, the President shall resume the powers | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 443 | and duties of his office. | ~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 77 words long. Lint: Capitalization (31 priority) Message: | 446 | #### SubSection 4. | ^~~~~~~~~~ The canonical dictionary spelling is `subsection`. Suggest: - Replace with: “subsection” Lint: Readability (127 priority) Message: | 448 | The President shall, at stated Times, receive for his | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 449 | Services, a Compensation, which shall neither be encreased nor diminished | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 450 | during the Period for which he shall have been elected, and he shall not | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 451 | receive within that Period any other Emolument from the United States, or any | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 452 | of them. | ~~~~~~~~ This sentence is 48 words long. Lint: Spelling (63 priority) Message: | 449 | Services, a Compensation, which shall neither be encreased nor diminished | ^~~~~~~~~ Did you mean to spell `encreased` this way? 450 | during the Period for which he shall have been elected, and he shall not Suggest: - Replace with: “increased” - Replace with: “encased” - Replace with: “entreated” Lint: Readability (127 priority) Message: | 454 | Before he enter on the Execution of his Office, he shall take the following | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 455 | Oath or Affirmation:-- "I do solemnly swear (or affirm) that I will faithfully | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 456 | execute the Office of President of the United States, and will to the best of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 457 | my Ability, preserve, protect and defend the Constitution of the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | States." | ~~~~~~~ This sentence is 54 words long. Lint: Agreement (127 priority) Message: | 454 | Before he enter on the Execution of his Office, he shall take the following | ^~~~~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “enters” Lint: Formatting (63 priority) Message: | 455 | Oath or Affirmation:-- "I do solemnly swear (or affirm) that I will faithfully | ^~ Replace these two hyphens with an en dash (–). Suggest: - Replace with: “–” Lint: Capitalization (31 priority) Message: | 457 | my Ability, preserve, protect and defend the Constitution of the United | ^~~~~~~ 458 | States." | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Capitalization (31 priority) Message: | 460 | #### SubSection 5. | ^~~~~~~~~~ The canonical dictionary spelling is `subsection`. Suggest: - Replace with: “subsection” Lint: Readability (127 priority) Message: | 465 | A number of electors of President and Vice President equal to the whole number | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 466 | of Senators and Representatives in Congress to which the District would be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 467 | entitled if it were a State, but in no event more than the least populous | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 468 | State; they shall be in addition to those appointed by the States, but they | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 469 | shall be considered, for the purposes of the election of President and Vice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 470 | President, to be electors appointed by a State; and they shall meet in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 471 | District and perform such duties as provided by this article of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | Constitution. | ~~~~~~~~~~~~~ This sentence is 95 words long. Lint: Readability (127 priority) Message: | 476 | The President shall be Commander in Chief of the Army and Navy | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 477 | of the United States, and of the Militia of the several States, when called | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | into the actual Service of the United States; he may require the Opinion, in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 479 | writing, of the principal Officer in each of the executive Departments, upon | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 480 | any Subject relating to the Duties of their respective Offices, and he shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 481 | have Power to grant Reprieves and Pardons for Offences against the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 482 | States, except in Cases of Impeachment. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 83 words long. Lint: Spelling (63 priority) Message: | 481 | have Power to grant Reprieves and Pardons for Offences against the United | ^~~~~~~~ Did you mean to spell `Offences` this way? 482 | States, except in Cases of Impeachment. Suggest: - Replace with: “Offenses” - Replace with: “Offense's” - Replace with: “Offenders” Lint: Capitalization (31 priority) Message: | 481 | have Power to grant Reprieves and Pardons for Offences against the United | ^~~~~~~ 482 | States, except in Cases of Impeachment. | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Readability (127 priority) Message: | 484 | He shall have Power, by and with the Advice and Consent of the Senate, to make | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 485 | Treaties, provided two thirds of the Senators present concur; and he shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 486 | nominate, and by and with the Advice and Consent of the Senate, shall appoint | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 487 | Ambassadors, other public Ministers and Consuls, Judges of the supreme Court, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | and all other Officers of the United States, whose Appointments are not herein | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 489 | otherwise provided for, and which shall be established by Law: but the Congress | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 490 | may by Law vest the Appointment of such inferior Officers, as they think | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 491 | proper, in the President alone, in the Courts of Law, or in the Heads of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 492 | Departments. | ~~~~~~~~~~~~ This sentence is 108 words long. Lint: Readability (127 priority) Message: | 504 | He shall from time to time give to the Congress Information of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 505 | the State of the Union, and recommend to their Consideration such Measures as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 506 | he shall judge necessary and expedient; he may, on extraordinary Occasions, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | convene both Houses, or either of them, and in Case of Disagreement between | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 508 | them, with Respect to the Time of Adjournment, he may adjourn them to such Time | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | as he shall think proper; he shall receive Ambassadors and other public | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 510 | Ministers; he shall take Care that the Laws be faithfully executed, and shall | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | Commission all the Officers of the United States. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 97 words long. Lint: Spelling (63 priority) Message: | 525 | time ordain and establish. The Judges, both of the supreme and inferior Courts, 526 | shall hold their Offices during good Behaviour, and shall, at stated Times, | ^~~~~~~~~ Did you mean to spell `Behaviour` this way? 527 | receive for their Services, a Compensation, which shall not be diminished Suggest: - Replace with: “Behavior” - Replace with: “Behaviors” Lint: Readability (127 priority) Message: | 532 | The judicial Power shall extend to all Cases, in Law and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | Equity, arising under this Constitution, the Laws of the United States, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 534 | Treaties made, or which shall be made, under their Authority;—to all Cases | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 535 | affecting Ambassadors, other public Ministers and Consuls;—to all Cases of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | admiralty and maritime Jurisdiction;—to Controversies to which the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | States shall be a Party;—to Controversies between two or more States;—between | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 538 | Citizens of different States, —between Citizens of the same State claiming | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 539 | Lands under Grants of different States. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 87 words long. Lint: Capitalization (31 priority) Message: | 536 | admiralty and maritime Jurisdiction;—to Controversies to which the United | ^~~~~~~ 537 | States shall be a Party;—to Controversies between two or more States;—between | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Readability (127 priority) Message: | 548 | The Trial of all Crimes, except in Cases of Impeachment, shall be by Jury; and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | such Trial shall be held in the State where the said Crimes shall have been | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | committed; but when not committed within any State, the Trial shall be at such | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 551 | Place or Places as the Congress may by Law have directed. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: Readability (127 priority) Message: | 566 | The right of the people to be secure in their persons, houses, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 567 | papers, and effects, against unreasonable searches and seizures, shall not be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 568 | violated, and no warrants shall issue, but upon probable cause, supported by | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 569 | oath or affirmation, and particularly describing the place to be searched, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 570 | the persons or things to be seized. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 54 words long. Lint: Readability (127 priority) Message: | 572 | No person shall be held to answer for a capital, or otherwise infamous crime, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | unless on a presentment or indictment of a grand jury, except in cases arising | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 574 | in the land or naval forces, or in the militia, when in actual service in time | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | of war or public danger; nor shall any person be subject for the same offense | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | to be twice put in jeopardy of life or limb; nor shall be compelled in any | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 577 | criminal case to be a witness against himself, nor be deprived of life, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 578 | liberty, or property, without due process of law; nor shall private property be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 579 | taken for public use, without just compensation. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 108 words long. Lint: Readability (127 priority) Message: | 581 | In all criminal prosecutions, the accused shall enjoy the right to a speedy and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 582 | public trial, by an impartial jury of the state and district wherein the crime | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | shall have been committed, which district shall have been previously | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 584 | ascertained by law, and to be informed of the nature and cause of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 585 | accusation; to be confronted with the witnesses against him; to have compulsory | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | process for obtaining witnesses in his favor, and to have the assistance of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 587 | counsel for his defense. | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 81 words long. Lint: Readability (127 priority) Message: | 589 | In suits at common law, where the value in controversy shall exceed twenty | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 590 | dollars, the right of trial by jury shall be preserved, and no fact tried by a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | jury, shall be otherwise reexamined in any court of the United States, than | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | according to the rules of the common law. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 50 words long. Lint: Style (31 priority) Message: | 603 | Congress may by general Laws prescribe the Manner in which such Acts, Records | ^~~~~~~ An Oxford comma is necessary here. 604 | and Proceedings shall be proved, and the Effect thereof. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 610 | the State wherein they reside. No State shall make or enforce any law which | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | shall abridge the privileges or immunities of citizens of the United States; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 612 | nor shall any State deprive any person of life, liberty, or property, without | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | due process of law; nor deny to any person within its jurisdiction the equal | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 614 | protection of the laws. | ~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Readability (127 priority) Message: | 616 | The right of citizens of the United States, who are eighteen years of age or | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | older, to vote shall not be denied or abridged by the United States or by any | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 618 | State on account of age, sex, race, color, or previous condition of servitude. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 620 | A Person charged in any State with Treason, Felony, or other Crime, who shall | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 621 | flee from Justice, and be found in another State, shall on Demand of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 622 | executive Authority of the State from which he fled, be delivered up, to be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | removed to the State having Jurisdiction of the Crime. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Capitalization (31 priority) Message: | 626 | whereof the party shall have been duly convicted, shall exist within the United | ^~~~~~~ 627 | States, or any place subject to their jurisdiction. No Person held to Service | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Readability (127 priority) Message: | 627 | States, or any place subject to their jurisdiction. No Person held to Service | ^~~~~~~~~~~~~~~~~~~~~~~~~~ 628 | or Labour in one State, under the Laws thereof, escaping into another, shall, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 629 | in Consequence of any Law or Regulation therein, be discharged from such | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 630 | Service or Labour, but shall be delivered up on Claim of the Party to whom such | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | Service or Labour may be due. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Spelling (63 priority) Message: | 627 | States, or any place subject to their jurisdiction. No Person held to Service 628 | or Labour in one State, under the Laws thereof, escaping into another, shall, | ^~~~~~ Did you mean to spell `Labour` this way? Suggest: - Replace with: “Labor” - Replace with: “Layout” - Replace with: “Labium” Lint: Spelling (63 priority) Message: | 629 | in Consequence of any Law or Regulation therein, be discharged from such 630 | Service or Labour, but shall be delivered up on Claim of the Party to whom such | ^~~~~~ Did you mean to spell `Labour` this way? Suggest: - Replace with: “Labor” - Replace with: “Layout” - Replace with: “Labium” Lint: Spelling (63 priority) Message: | 630 | Service or Labour, but shall be delivered up on Claim of the Party to whom such 631 | Service or Labour may be due. | ^~~~~~ Did you mean to spell `Labour` this way? Suggest: - Replace with: “Labor” - Replace with: “Layout” - Replace with: “Labium” Lint: Readability (127 priority) Message: | 635 | New States may be admitted by the Congress into this Union; but | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | no new State shall be formed or erected within the Jurisdiction of any other | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 637 | State; nor any State be formed by the Junction of two or more States, or Parts | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 638 | of States, without the Consent of the Legislatures of the States concerned as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | well as of the Congress. | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 60 words long. Lint: Readability (127 priority) Message: | 641 | The Congress shall have Power to dispose of and make all needful Rules and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 642 | Regulations respecting the Territory or other Property belonging to the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | States; and nothing in this Constitution shall be so construed as to Prejudice | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 644 | any Claims of the United States, or of any particular State. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Capitalization (31 priority) Message: | 642 | Regulations respecting the Territory or other Property belonging to the United | ^~~~~~~ 643 | States; and nothing in this Constitution shall be so construed as to Prejudice | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Readability (127 priority) Message: | 648 | The United States shall guarantee to every State in this Union | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | a Republican Form of Government, and shall protect each of them against | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 650 | Invasion; and on Application of the Legislature, or of the Executive (when the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 651 | Legislature cannot be convened) against domestic Violence. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 658 | questioned. But neither the United States nor any State shall assume or pay any | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 659 | debt or obligation incurred in aid of insurrection or rebellion against the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 660 | United States, or any claim for the loss or emancipation of any slave; but all | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | such debts, obligations and claims shall be held illegal and void. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Style (31 priority) Message: | 660 | United States, or any claim for the loss or emancipation of any slave; but all 661 | such debts, obligations and claims shall be held illegal and void. | ^~~~~~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 663 | ## Article. V. | ^~ Did you mean to spell `V.` this way? Suggest: - Replace with: “Vi” - Replace with: “VA” - Replace with: “Vb” Lint: Readability (127 priority) Message: | 665 | The Congress, whenever two thirds of both Houses shall deem it necessary, shall | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | propose Amendments to this Constitution, or, on the Application of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 667 | Legislatures of two thirds of the several States, shall call a Convention for | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | proposing Amendments, which, in either Case, shall be valid to all Intents and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 669 | Purposes, as Part of this Constitution, when ratified by the Legislatures of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | three fourths of the several States, or by Conventions in three fourths | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 671 | thereof, as the one or the other Mode of Ratification may be proposed by the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 672 | Congress; Provided that no Amendment which may be made prior to the Year One | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | thousand eight hundred and eight shall in any Manner affect the first and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 674 | fourth Clauses in the Ninth Section of the first Article; and that no State, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 675 | without its Consent, shall be deprived of its equal Suffrage in the Senate. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 143 words long. Lint: Nonstandard (50 priority) Message: | 668 | proposing Amendments, which, in either Case, shall be valid to all Intents and | ^~~~~~~~~~~~~~~~~~~ 669 | Purposes, as Part of this Constitution, when ratified by the Legislatures of | ~~~~~~~~ The correct form is 'to all intents and purposes'. Suggest: - Replace with: “to all Intents and Purposes” - Replace with: “for alL intents anD purposes” Lint: Capitalization (127 priority) Message: | 677 | ## Article. VI. | ^~~~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “## Article. Vi.” Lint: Readability (127 priority) Message: | 683 | This Constitution, and the Laws of the United States which shall be made in | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 684 | Pursuance thereof; and all Treaties made, or which shall be made, under the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 685 | Authority of the United States, shall be the supreme Law of the Land; and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 686 | Judges in every State shall be bound thereby, any Thing in the Constitution or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 687 | Laws of any State to the Contrary notwithstanding. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 64 words long. Lint: Readability (127 priority) Message: | 689 | The Senators and Representatives before mentioned, and the Members of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 690 | several State Legislatures, and all executive and judicial Officers, both of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 691 | the United States and of the several States, shall be bound by Oath or | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | Affirmation, to support this Constitution; but no religious Test shall ever be | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | required as a Qualification to any Office or public Trust under the United | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | States. | ~~~~~~~ This sentence is 62 words long. Lint: Capitalization (31 priority) Message: | 693 | required as a Qualification to any Office or public Trust under the United | ^~~~~~~ 694 | States. | ~~~~~~ When referring to national or international organizations, make sure to treat them as a proper noun. Suggest: - Replace with: “United States” Lint: Spelling (63 priority) Message: | 714 | first Page, The Word "Thirty" being partly written on an Erazure in the | ^~~~~~~ Did you mean to spell `Erazure` this way? 715 | fifteenth Line of the first Page. The Words "is tried" being interlined between Suggest: - Replace with: “Erasure” - Replace with: “Erasures” - Replace with: “Azure” Lint: Capitalization (31 priority) Message: | 721 | done in Convention by the Unanimous Consent of the States present the | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Done” Lint: Readability (127 priority) Message: | 721 | done in Convention by the Unanimous Consent of the States present the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 722 | Seventeenth Day of September in the Year of our Lord one thousand seven hundred | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | and Eighty seven and of the Independence of the United States of America the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 724 | Twelfth In witness whereof We have hereunto subscribed our Names, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 50 words long. ================================================ FILE: harper-core/tests/text/linters/The Great Gatsby.snap.yml ================================================ Lint: Spelling (63 priority) Message: | 3 | BY F. SCOTT FITZGERALD | ^~ Did you mean to spell `F.` this way? Suggest: - Replace with: “Fa” - Replace with: “Fe” - Replace with: “Ff” Lint: Spelling (63 priority) Message: | 3 | BY F. SCOTT FITZGERALD | ^~~~~ Did you mean to spell `SCOTT` this way? Suggest: - Replace with: “Scout” - Replace with: “Scott” - Replace with: “Scoot” Lint: Spelling (63 priority) Message: | 3 | BY F. SCOTT FITZGERALD | ^~~~~~~~~~ Did you mean `Fitzgerald`? Suggest: - Replace with: “Fitzgerald” Lint: Spelling (63 priority) Message: | 10 | “Whenever you feel like criticising any one,” he told me, “just remember that | ^~~~~~~~~~~ Did you mean `criticizing`? Suggest: - Replace with: “criticizing” Lint: Redundancy (31 priority) Message: | 15 | consequence, I’m inclined to reserve all judgments, a habit that has opened up 16 | many curious natures to me and also made me the victim of not a few veteran | ^~~~~~~~ Consider using just `and`. Suggest: - Replace with: “and” Lint: Readability (127 priority) Message: | 17 | bores. The abnormal mind is quick to detect and attach itself to this quality | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 18 | when it appears in a normal person, and so it came about that in college I was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 | unjustly accused of being a politician, because I was privy to the secret griefs | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 | of wild, unknown men. Most of the confidences were unsought—frequently I have | ~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Readability (127 priority) Message: | 20 | of wild, unknown men. Most of the confidences were unsought—frequently I have | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 21 | feigned sleep, preoccupation, or a hostile levity when I realized by some | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 22 | unmistakable sign that an intimate revelation was quivering on the horizon; for | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 23 | the intimate revelations of young men, or at least the terms in which they | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 | express them, are usually plagiaristic and marred by obvious suppressions. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 57 words long. Lint: Spelling (63 priority) Message: | 27 | snobbishly repeat, a sense of the fundamental decencies is parcelled out | ^~~~~~~~~ Did you mean `parceled`? 28 | unequally at birth. Suggest: - Replace with: “parceled” Lint: Readability (127 priority) Message: | 32 | after a certain point I don’t care what it’s founded on. When I came back from | ^~~~~~~~~~~~~~~~~~~~~~ 33 | the East last autumn I felt that I wanted the world to be in uniform and at a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 34 | sort of moral attention forever; I wanted no more riotous excursions with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 35 | privileged glimpses into the human heart. Only Gatsby, the man who gives his | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 37 | everything for which I have an unaffected scorn. If personality is an unbroken | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 38 | series of successful gestures, then there was something gorgeous about him, some | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 39 | heightened sensitivity to the promises of life, as if he were related to one of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 40 | those intricate machines that register earthquakes ten thousand miles away. This | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 40 | those intricate machines that register earthquakes ten thousand miles away. This | ^~~~~ 41 | responsiveness had nothing to do with that flabby impressionability which is | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 42 | dignified under the name of the “creative temperament”—it was an extraordinary | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 43 | gift for hope, a romantic readiness such as I have never found in any other | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 44 | person and which it is not likely I shall ever find again. No—Gatsby turned out | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Readability (127 priority) Message: | 44 | person and which it is not likely I shall ever find again. No—Gatsby turned out | ^~~~~~~~~~~~~~~~~~~~~ 45 | all right at the end; it is what preyed on Gatsby, what foul dust floated in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 | wake of his dreams that temporarily closed out my interest in the abortive | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 47 | sorrows and short-winded elations of men. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 50 | three generations. The Carraways are something of a clan, and we have a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 51 | tradition that we’re descended from the Dukes of Buccleuch, but the actual | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 52 | founder of my line was my grandfather’s brother, who came here in fifty-one, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | sent a substitute to the Civil War, and started the wholesale hardware business | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | that my father carries on to-day. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 57 words long. Lint: Spelling (63 priority) Message: | 50 | three generations. The Carraways are something of a clan, and we have a | ^~~~~~~~~ Did you mean to spell `Carraways` this way? Suggest: - Replace with: “Caraways” - Replace with: “Caraway's” - Replace with: “Castaways” Lint: Spelling (63 priority) Message: | 51 | tradition that we’re descended from the Dukes of Buccleuch, but the actual | ^~~~~~~~~ Did you mean to spell `Buccleuch` this way? 52 | founder of my line was my grandfather’s brother, who came here in fifty-one, Suggest: - Replace with: “Buckley's” - Replace with: “Buckle's” - Replace with: “Buckler's” Lint: Spelling (63 priority) Message: | 61 | restless. Instead of being the warm centre of the world, the Middle West now | ^~~~~~ Did you mean to spell `centre` this way? 62 | seemed like the ragged edge of the universe—so I decided to go East and learn Suggest: - Replace with: “center” - Replace with: “cent's” - Replace with: “censure” Lint: Readability (127 priority) Message: | 69 | The practical thing was to find rooms in the city, but it was a warm season, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | I had just left a country of wide lawns and friendly trees, so when a young man | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | at the office suggested that we take a house together in a commuting town, it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | sounded like a great idea. He found the house, a weatherbeaten cardboard | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 54 words long. Lint: Spelling (63 priority) Message: | 72 | sounded like a great idea. He found the house, a weatherbeaten cardboard | ^~~~~~~~~~~~~ Did you mean `weather-beaten`? 73 | bungalow at eighty a month, but at the last minute the firm ordered him to Suggest: - Replace with: “weather-beaten” Lint: Typo (31 priority) Message: | 72 | sounded like a great idea. He found the house, a weatherbeaten cardboard | ^~~~~~~~~~~~~ `weatherbeaten` should probably be written as `weather beaten`. 73 | bungalow at eighty a month, but at the last minute the firm ordered him to Suggest: - Replace with: “weather beaten” Lint: Readability (127 priority) Message: | 74 | Washington, and I went out to the country alone. I had a dog—at least I had him | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 75 | for a few days until he ran away—and an old Dodge and a Finnish woman, who made | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 76 | my bed and cooked breakfast and muttered Finnish wisdom to herself over the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 77 | electric stove. | ~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 93 | down out of the young breath-giving air. I bought a dozen volumes on banking and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 94 | credit and investment securities, and they stood on my shelf in red and gold | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | like new money from the mint, promising to unfold the shining secrets that only | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | Midas and Morgan and Mæcenas knew. And I had the high intention of reading many | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 95 | like new money from the mint, promising to unfold the shining secrets that only 96 | Midas and Morgan and Mæcenas knew. And I had the high intention of reading many | ^~~~~~~ Did you mean `Mycenae`? Suggest: - Replace with: “Mycenae” Lint: Readability (127 priority) Message: | 97 | other books besides. I was rather literary in college—one year I wrote a series | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 98 | of very solemn and obvious editorials for the Yale News—and now I was going to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | bring back all such things into my life and become again that most limited of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 100 | all specialists, the “well-rounded man.” This isn’t just an epigram—life is much | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 106 | natural curiosities, two unusual formations of land. Twenty miles from the city | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 107 | a pair of enormous eggs, identical in contour and separated only by a courtesy | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 108 | bay, jut out into the most domesticated body of salt water in the Western | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | hemisphere, the great wet barnyard of Long Island Sound. They are not perfect | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 119 | thousand a season. The one on my right was a colossal affair by any standard—it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 120 | was a factual imitation of some Hôtel de Ville in Normandy, with a tower on one | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | side, spanking new under a thin beard of raw ivy, and a marble swimming pool, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 122 | and more than forty acres of lawn and garden. It was Gatsby’s mansion. Or, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Spelling (63 priority) Message: | 119 | thousand a season. The one on my right was a colossal affair by any standard—it 120 | was a factual imitation of some Hôtel de Ville in Normandy, with a tower on one | ^~~~~ Did you mean to spell `Hôtel` this way? Suggest: - Replace with: “Hotel” - Replace with: “Hate” - Replace with: “Hazel” Lint: Spelling (63 priority) Message: | 120 | was a factual imitation of some Hôtel de Ville in Normandy, with a tower on one | ^~~~~ Did you mean to spell `Ville` this way? 121 | side, spanking new under a thin beard of raw ivy, and a marble swimming pool, Suggest: - Replace with: “Vile” - Replace with: “Villa” - Replace with: “Villi” Lint: WordChoice (63 priority) Message: | 120 | was a factual imitation of some Hôtel de Ville in Normandy, with a tower on one | ^~~~~~~~ It seems these words would go better together. 121 | side, spanking new under a thin beard of raw ivy, and a marble swimming pool, Suggest: - Replace with: “Villein” Lint: Readability (127 priority) Message: | 124 | of that name. My own house was an eyesore, but it was a small eyesore, and it | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | had been overlooked, so I had a view of the water, a partial view of my | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 126 | neighbor’s lawn, and the consoling proximity of millionaires—all for eighty | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 127 | dollars a month. | ~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Spelling (63 priority) Message: | 131 | drove over there to have dinner with the Tom Buchanans. Daisy was my second | ^~~~~~~~~ Did you mean to spell `Buchanans` this way? Suggest: - Replace with: “Buchanan's” - Replace with: “Buchanan” Lint: Readability (127 priority) Message: | 135 | Her husband, among various physical accomplishments, had been one of the most | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 136 | powerful ends that ever played football at New Haven—a national figure in a way, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | one of those men who reach such an acute limited excellence at twenty-one that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 138 | everything afterward savors of anti-climax. His family were enormously | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Spelling (127 priority) Message: | 137 | one of those men who reach such an acute limited excellence at twenty-one that 138 | everything afterward savors of anti-climax. His family were enormously | ^~~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “anticlimax” Lint: Readability (127 priority) Message: | 138 | everything afterward savors of anti-climax. His family were enormously | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 139 | wealthy—even in college his freedom with money was a matter for reproach—but now | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 140 | he’d left Chicago and come East in a fashion that rather took your breath away: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | for instance, he’d brought down a string of polo ponies from Lake Forest. It was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Readability (127 priority) Message: | 146 | played polo and were rich together. This was a permanent move, said Daisy over | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 147 | the telephone, but I didn’t believe it—I had no sight into Daisy’s heart, but I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 148 | felt that Tom would drift on forever seeking, a little wistfully, for the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | dramatic turbulence of some irrecoverable football game. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 154 | the bay. The lawn started at the beach and ran toward the front door for a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 155 | quarter of a mile, jumping over sun-dials and brick walks and burning | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 156 | gardens—finally when it reached the house drifting up the side in bright vines | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | as though from the momentum of its run. The front was broken by a line of French | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 165 | appearance of always leaning aggressively forward. Not even the effeminate swank | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 166 | of his riding clothes could hide the enormous power of that body—he seemed to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | fill those glistening boots until he strained the top lacing, and you could see | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | a great pack of muscle shifting when his shoulder moved under his thin coat. It | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Readability (127 priority) Message: | 185 | Turning me around by one arm, he moved a broad flat hand along the front vista, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 186 | including in its sweep a sunken Italian garden, a half acre of deep, pungent | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | roses, and a snub-nosed motor-boat that bumped the tide offshore. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 189 | “It belonged to Demaine, the oil man.” He turned me around again, politely and | ^~~~~~~ Did you mean to spell `Demaine` this way? Suggest: - Replace with: “Decline” - Replace with: “Demand” - Replace with: “Demise” Lint: WordChoice (63 priority) Message: | 189 | “It belonged to Demaine, the oil man.” He turned me around again, politely and | ^~~~~~~ Did you mean the closed compound noun “oilman”? Suggest: - Replace with: “oilman” Lint: Readability (127 priority) Message: | 195 | into the house. A breeze blew through the room, blew curtains in at one end and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 196 | out the other like pale flags, twisting them up toward the frosted wedding-cake | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | of the ceiling, and then rippled over the wine-colored rug, making a shadow on | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 198 | it as wind does on the sea. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Readability (127 priority) Message: | 236 | speech is an arrangement of notes that will never be played again. Her face was | ^~~~~~~~~~~~~ 237 | sad and lovely with bright things in it, bright eyes and a bright passionate | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | mouth, but there was an excitement in her voice that men who had cared for her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 239 | found difficult to forget: a singing compulsion, a whispered “Listen,” a promise | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | that she had done gay, exciting things just a while since and that there were | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 241 | gay, exciting things hovering in the next hour. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 68 words long. Lint: WordChoice (63 priority) Message: | 268 | “I’m a bond man.” | ^~~~~~~~ Did you mean the closed compound noun “bondman”? Suggest: - Replace with: “bondman” Lint: Formatting (255 priority) Message: | 334 | “All right,” said Daisy. ‘‘What’ll we plan?” She turned to me helplessly: ‘‘What | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 335 | do people plan?” | ^ This quote has no termination. Lint: Style (31 priority) Message: | 394 | me again. ‘‘—And we’ve produced all the things that go to make civilization—oh, 395 | science and art, and all that. Do you see?” | ^~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Formatting (255 priority) Message: | 395 | science and art, and all that. Do you see?” | ^ This quote has no termination. Lint: Style (127 priority) Message: | 397 | There was something pathetic in his concentration, as if his complacency, more | ^~~~~ 398 | acute than of old, was not enough to him any more. When, almost immediately, the | ~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “acuter” Lint: Readability (127 priority) Message: | 416 | For a moment the last sunshine fell with romantic affection upon her glowing | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 417 | face; her voice compelled me forward breathlessly as I listened—then the glow | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 418 | faded, each light deserting her with lingering regret, like children leaving a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 419 | pleasant street at dusk. | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Miscellaneous (31 priority) Message: | 426 | “I love to see you at my table, Nick. You remind me of a—of a rose, an absolute | ^ Incorrect indefinite article. 427 | rose. Doesn’t he?” She turned to Miss Baker for confirmation: “An absolute Suggest: - Replace with: “an” Lint: Formatting (255 priority) Message: | 452 | “Why—” she said hesitantly, ‘‘Tom’s got some woman in New York.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 464 | “It couldn’t be helped!” cried Daisy with tense gayety. | ^~~~~~ Did you mean to spell `gayety` this way? Suggest: - Replace with: “gaiety” - Replace with: “gamely” - Replace with: “gamete” Lint: Miscellaneous (31 priority) Message: | 477 | being lit again, pointlessly, and I was conscious of wanting to look squarely at 478 | every one, and yet to avoid all eyes. I couldn’t guess what Daisy and Tom were | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “everyone” Lint: Spelling (63 priority) Message: | 479 | thinking, but I doubt if even Miss Baker, who seemed to have mastered a certain 480 | hardy scepticism, was able utterly to put this fifth guest’s shrill metallic | ^~~~~~~~~~ Did you mean to spell `scepticism` this way? Suggest: - Replace with: “skepticism” - Replace with: “asceticism” Lint: Readability (127 priority) Message: | 484 | The horses, needless to say, were not mentioned again. Tom and Miss Baker, with | ^~~~~~~~~~~~~~~~~~~~~~~~~ 485 | several feet of twilight between them, strolled back into the library, as if to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 486 | a vigil beside a perfectly tangible body, while, trying to look pleasantly | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 487 | interested and a little deaf, I followed Daisy around a chain of connecting | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | verandas to the porch in front. In its deep gloom we sat down side by side on a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 50 words long. Lint: Formatting (255 priority) Message: | 514 | “I’ll show you how I’ve gotten to feel about—things. Well, she was less than an | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 529 | the whole evening had been a trick of some sort to exact a contributary emotion | ^~~~~~~~~~~~ Did you mean to spell `contributary` this way? 530 | from me. I waited, and sure enough, in a moment she looked at me with an Suggest: - Replace with: “contributory” - Replace with: “contributor” - Replace with: “contributors” Lint: Typo (31 priority) Message: | 529 | the whole evening had been a trick of some sort to exact a contributary emotion | ^~~~~~~~~~~~ `contributary` should probably be written as `con tributary`. 530 | from me. I waited, and sure enough, in a moment she looked at me with an Suggest: - Replace with: “con tributary” Lint: Spelling (63 priority) Message: | 551 | “Jordan’s going to play in the tournament tomorrow,” explained Daisy, “over at 552 | Westchester.” | ^~~~~~~~~~~ Did you mean to spell `Westchester` this way? Suggest: - Replace with: “Westminster” - Replace with: “Winchester” Lint: Spelling (63 priority) Message: | 565 | “I will. Good night, Mr. Carraway. See you anon.” | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Enhancement (31 priority) Message: | 583 | here this summer. I think the home influence will be very good for her.” | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “excellent” Lint: Formatting (255 priority) Message: | 603 | square of light. As I started my motor Daisy peremptorily called: “Wait! | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 628 | Already it was deep summer on roadhouse roofs and in front of wayside garages, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 629 | where new red gaspumps sat out in pools of light, and when I reached my estate | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 630 | at West Egg I ran the car under its shed and sat for a while on an abandoned | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | grass roller in the yard. The wind had blown off, leaving a loud, bright night, | ~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Spelling (63 priority) Message: | 628 | Already it was deep summer on roadhouse roofs and in front of wayside garages, 629 | where new red gaspumps sat out in pools of light, and when I reached my estate | ^~~~~~~~ Did you mean `gazumps`? Suggest: - Replace with: “gazumps” Lint: Typo (31 priority) Message: | 628 | Already it was deep summer on roadhouse roofs and in front of wayside garages, 629 | where new red gaspumps sat out in pools of light, and when I reached my estate | ^~~~~~~~ `gaspumps` should probably be written as `gas pumps`. Suggest: - Replace with: “gas pumps” Lint: Readability (127 priority) Message: | 633 | of the earth blew the frogs full of life. The silhouette of a moving cat wavered | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 634 | across the moonlight, and turning my head to watch it, I saw that I was not | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 635 | alone—fifty feet away a figure had emerged from the shadow of my neighbor’s | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | mansion and was standing with his hands in his pockets regarding the silver | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 637 | pepper of the stars. Something in his leisurely movements and the secure | ~~~~~~~~~~~~~~~~~~~~ This sentence is 54 words long. Lint: Readability (127 priority) Message: | 642 | do for an introduction. But I didn’t call to him, for he gave a sudden | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | intimation that he was content to be alone—he stretched out his arms toward the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 644 | dark water in a curious way, and, far as I was from him, I could have sworn he | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | was trembling. Involuntarily I glanced seaward—and distinguished nothing except | ~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: Style (31 priority) Message: | 645 | was trembling. Involuntarily I glanced seaward—and distinguished nothing except 646 | a single green light, minute and far away, that might have been the end of a | ^~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 654 | certain desolate area of land. This is a valley of ashes—a fantastic farm where | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 655 | ashes grow like wheat into ridges and hills and grotesque gardens; where ashes | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 656 | take the forms of houses and chimneys and rising smoke and, finally, with a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | transcendent effort, of ash-gray men, who move dimly and already crumbling | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 658 | through the powdery air. Occasionally a line of gray cars crawls along an | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Readability (127 priority) Message: | 658 | through the powdery air. Occasionally a line of gray cars crawls along an | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 659 | invisible track, gives out a ghastly creak, and comes to rest, and immediately | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 660 | the ash-gray men swarm up with leaden spades and stir up an impenetrable cloud, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | which screens their obscure operations from your sight. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (63 priority) Message: | 664 | it, you perceive, after a moment, the eyes of Doctor T. J. Eckleburg. The eyes | ^~ Did you mean to spell `T.` this way? Suggest: - Replace with: “Ta” - Replace with: “Ti” - Replace with: “To” Lint: Spelling (63 priority) Message: | 664 | it, you perceive, after a moment, the eyes of Doctor T. J. Eckleburg. The eyes | ^~ Did you mean to spell `J.` this way? Suggest: - Replace with: “Jo” - Replace with: “J” - Replace with: “Jg” Lint: Spelling (63 priority) Message: | 664 | it, you perceive, after a moment, the eyes of Doctor T. J. Eckleburg. The eyes | ^~~~~~~~~ Did you mean to spell `Eckleburg` this way? Suggest: - Replace with: “Excalibur” - Replace with: “Vicksburg” - Replace with: “Heckler” Lint: Spelling (63 priority) Message: | 664 | it, you perceive, after a moment, the eyes of Doctor T. J. Eckleburg. The eyes 665 | of Doctor T. J. Eckleburg are blue and gigantic—their retinas are one yard high. | ^~ Did you mean to spell `T.` this way? Suggest: - Replace with: “Ta” - Replace with: “Ti” - Replace with: “To” Lint: Spelling (63 priority) Message: | 665 | of Doctor T. J. Eckleburg are blue and gigantic—their retinas are one yard high. | ^~ Did you mean to spell `J.` this way? Suggest: - Replace with: “Jo” - Replace with: “J” - Replace with: “Jg” Lint: Spelling (63 priority) Message: | 665 | of Doctor T. J. Eckleburg are blue and gigantic—their retinas are one yard high. | ^~~~~~~~~ Did you mean to spell `Eckleburg` this way? Suggest: - Replace with: “Excalibur” - Replace with: “Vicksburg” - Replace with: “Heckler” Lint: Readability (127 priority) Message: | 673 | The valley of ashes is bounded on one side by a small foul river, and, when the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 674 | drawbridge is up to let barges through, the passengers on waiting trains can | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 675 | stare at the dismal scene for as long as half an hour. There is always a halt | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 683 | up to New York with Tom on the train one afternoon, and when we stopped by the 684 | ashheaps he jumped to his feet and, taking hold of my elbow, literally forced me | ^~~~~~~~ Did you mean to spell `ashheaps` this way? Suggest: - Replace with: “asthma's” - Replace with: “airheads” - Replace with: “ashcans” Lint: Typo (31 priority) Message: | 683 | up to New York with Tom on the train one afternoon, and when we stopped by the 684 | ashheaps he jumped to his feet and, taking hold of my elbow, literally forced me | ^~~~~~~~ `ashheaps` should probably be written as `ash heaps`. Suggest: - Replace with: “ash heaps” Lint: Spelling (63 priority) Message: | 694 | hundred yards along the road under Doctor Eckleburg’s persistent stare. The only | ^~~~~~~~~~~ Did you mean to spell `Eckleburg’s` this way? Suggest: - Replace with: “Excalibur's” - Replace with: “Vicksburg's” - Replace with: “Heckler's” Lint: WordChoice (63 priority) Message: | 695 | building in sight was a small block of yellow brick sitting on the edge of the 696 | waste land, a sort of compact Main Street ministering to it, and contiguous to | ^~~~~~~~~~ Did you mean the closed compound noun “wasteland”? Suggest: - Replace with: “wasteland” Lint: Spelling (63 priority) Message: | 699 | garage—Repairs. George B. Wilson. Cars bought and sold.—and I followed Tom | ^~ Did you mean to spell `B.` this way? Suggest: - Replace with: “Be” - Replace with: “Bi” - Replace with: “Bu” Lint: Readability (127 priority) Message: | 703 | dust-covered wreck of a Ford which crouched in a dim corner. It had occurred to | ^~~~~~~~~~~~~~~~~~~ 704 | me that this shadow of a garage must be a blind, and that sumptuous and romantic | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | apartments were concealed overhead, when the proprietor himself appeared in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 706 | door of an office, wiping his hands on a piece of waste. He was a blond, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Style (63 priority) Message: | 703 | dust-covered wreck of a Ford which crouched in a dim corner. It had occurred to 704 | me that this shadow of a garage must be a blind, and that sumptuous and romantic | ^~~~~~~~~~~ The word `of` is not needed here. Suggest: - Replace with: “shadow a” Lint: Formatting (255 priority) Message: | 711 | ‘‘How’s business?” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 730 | beauty, but there was an immediately perceptible vitality about her as if the 731 | nerves of her body were continually smouldering. She smiled slowly and, walking | ^~~~~~~~~~~ Did you mean to spell `smouldering` this way? Suggest: - Replace with: “smoldering” - Replace with: “shouldering” - Replace with: “soldering” Lint: Spelling (63 priority) Message: | 756 | “Terrible place, isn’t it,” said Tom, exchanging a frown with Doctor Eckleburg. | ^~~~~~~~~ Did you mean to spell `Eckleburg` this way? Suggest: - Replace with: “Excalibur” - Replace with: “Vicksburg” - Replace with: “Heckler” Lint: Spelling (63 priority) Message: | 768 | together, for Mrs. Wilson sat discreetly in another car. Tom deferred that much 769 | to the sensibilities of those East Eggers who might be on the train. | ^~~~~~ Did you mean to spell `Eggers` this way? Suggest: - Replace with: “Edgers” - Replace with: “Eggo's” - Replace with: “Edge's” Lint: Spelling (127 priority) Message: | 775 | Up-stairs, in the solemn echoing drive she let four taxicabs drive away before | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “Upstairs” Lint: Spelling (63 priority) Message: | 784 | We backed up to a gray old man who bore an absurd resemblance to John D. | ^~ Did you mean to spell `D.` this way? Suggest: - Replace with: “Do” - Replace with: “DA” - Replace with: “Di” Lint: Style (31 priority) Message: | 819 | We drove over to Fifth Avenue, warm and soft, almost pastoral, on the summer | ^~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 825 | “No, you don’t,” interposed Tom quickly. “Myrtle’ll be hurt if you don’t come up | ^~~~~~~~~ Did you mean `Myrtle's`? 826 | to the apartment. Won’t you, Myrtle?” Suggest: - Replace with: “Myrtle's” Lint: Spelling (63 priority) Message: | 838 | “I’m going to have the McKees come up,” she announced as we rose in the | ^~~~~~ Did you mean to spell `McKees` this way? Suggest: - Replace with: “McKee's” - Replace with: “McKee” - Replace with: “McGee's” Lint: Readability (127 priority) Message: | 850 | Wilson was first concerned with the dog. A reluctant elevator-boy went for a box | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | full of straw and some milk, to which he added on his own initiative a tin of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 852 | large, hard dog-biscuits— one of which decomposed apathetically in the saucer of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 853 | milk all afternoon. Meanwhile Tom brought out a bottle of whiskey from a locked | ~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Punctuation (31 priority) Message: | 853 | milk all afternoon. Meanwhile Tom brought out a bottle of whiskey from a locked | ^~~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 860 | and I went out to buy some at the drugstore on the corner. When I came back they | ^~~~~~~~~~~~~~~~~~~~~~ 861 | had both disappeared, so I sat down discreetly in the living-room and read a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | chapter of “Simon Called Peter”—either it was terrible stuff or the whiskey | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 863 | distorted things, because it didn’t make any sense to me. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: WordChoice (63 priority) Message: | 877 | immoderately, repeated my question aloud, and told me she lived with a girl | ^~~~~ 878 | friend at a hotel. | ~~~~~~ Did you mean the closed compound noun “girlfriend”? Suggest: - Replace with: “girlfriend” Lint: Miscellaneous (31 priority) Message: | 881 | there was a white spot of lather on his cheekbone, and he was most respectful in 882 | his greeting to every one in the room. He informed me that he was in the | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “everyone” Lint: Spelling (63 priority) Message: | 900 | last week to look at my feet, and when she gave me the bill you’d of thought she 901 | had my appendicitus out.” | ^~~~~~~~~~~~ Did you mean `appendicitis`? Suggest: - Replace with: “appendicitis” Lint: Spelling (63 priority) Message: | 905 | “Mrs. Eberhardt. She goes around looking at people’s feet in their own homes.” | ^~~~~~~~~ Did you mean to spell `Eberhardt` this way? Suggest: - Replace with: “Earhart” - Replace with: “Earnhardt” - Replace with: “Erhard” Lint: Spelling (63 priority) Message: | 923 | “I should change the light,” he said after a moment. “I’d like to bring out the 924 | modelling of the features. And I’d try to get hold of all the back hair.” | ^~~~~~~~~ Did you mean to spell `modelling` this way? Suggest: - Replace with: “modeling” - Replace with: “modelings” - Replace with: “yodeling” Lint: Spelling (63 priority) Message: | 931 | “You McKees have something to drink,” he said. “Get some more ice and mineral | ^~~~~~ Did you mean to spell `McKees` this way? Suggest: - Replace with: “McKee's” - Replace with: “McKee” - Replace with: “McGee's” Lint: Spelling (63 priority) Message: | 950 | “Two studies. One of them I call ‘Montauk Point—The Gulls,’ and the other I call | ^~~~~~~ Did you mean to spell `Montauk` this way? 951 | ‘Montauk Point—The Sea.’” Suggest: - Replace with: “Montage” - Replace with: “Montague” - Replace with: “Montana” Lint: Spelling (63 priority) Message: | 950 | “Two studies. One of them I call ‘Montauk Point—The Gulls,’ and the other I call 951 | ‘Montauk Point—The Sea.’” | ^~~~~~~ Did you mean to spell `Montauk` this way? Suggest: - Replace with: “Montage” - Replace with: “Montague” - Replace with: “Montana” Lint: Spelling (63 priority) Message: | 989 | studies of him.” His lips moved silently for a moment as he invented. “‘George 990 | B. Wilson at the Gasoline Pump,’ or something like that.” | ^~ Did you mean to spell `B.` this way? Suggest: - Replace with: “Be” - Replace with: “Bi” - Replace with: “Bu” Lint: Style (127 priority) Message: | 1017 | “It’d be more discreet to go to Europe.” | ^~~~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “discreeter” Lint: Spelling (63 priority) Message: | 1029 | over twelve hundred dollars when we started, but we got gyped out of it all in | ^~~~~ Did you mean to spell `gyped` this way? 1030 | two days in the private rooms. We had an awful time getting back, I can tell Suggest: - Replace with: “gaped” - Replace with: “gypped” - Replace with: “gyved” Lint: Spelling (63 priority) Message: | 1037 | “I almost made a mistake, too,” she declared vigorously. “I almost married a 1038 | little kyke who’d been after me for years. I knew he was below me. Everybody | ^~~~ Did you mean to spell `kyke` this way? Suggest: - Replace with: “kike” - Replace with: “dyke” - Replace with: “tyke” Lint: Style (127 priority) Message: | 1060 | I never was any more crazy about him than I was about that man there.” | ^~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “crazier” Lint: Miscellaneous (31 priority) Message: | 1062 | She pointed suddenly at me, and every one looked at me accusingly. I tried to | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “everyone” Lint: Repetition (127 priority) Message: | 1065 | “The only crazy I was was when I married him. I knew right away I made a | ^~~~~~~ Did you mean to repeat this word? Suggest: - Replace with: “was” Lint: Readability (127 priority) Message: | 1078 | supper in themselves. I wanted to get out and walk eastward toward the park | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1079 | through the soft twilight, but each time I tried to go I became entangled in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | some wild, strident argument which pulled me back, as if with ropes, into my | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1081 | chair. Yet high over the city our line of yellow windows must have contributed | ~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 1122 | Daisy! Dai———” | ^~~ Did you mean to spell `Dai` this way? Suggest: - Replace with: “Dab” - Replace with: “Dad” - Replace with: “Dag” Lint: Readability (127 priority) Message: | 1128 | awoke from his doze and started in a daze toward the door. When he had gone half | ^~~~~~~~~~~~~~~~~~~~~~ 1129 | way he turned around and stared at the scene—his wife and Catherine scolding and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | consoling as they stumbled here and there among the crowded furniture with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | articles of aid, and the despairing figure on the couch, bleeding fluently, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1132 | trying to spread a copy of Town Tattle over the tapestry scenes of Versailles. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 59 words long. Lint: Formatting (63 priority) Message: | 1152 | “Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Formatting (63 priority) Message: | 1152 | “Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Formatting (63 priority) Message: | 1152 | “Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Spelling (63 priority) Message: | 1152 | “Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n | ^~~~~~~ Did you mean to spell `Brook’n` this way? 1153 | Bridge . . .” Then I was lying half asleep in the cold lower level of the Suggest: - Replace with: “Brook's” - Replace with: “Brock's” - Replace with: “Brooke's” Lint: Formatting (63 priority) Message: | 1152 | “Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n 1153 | Bridge . . .” Then I was lying half asleep in the cold lower level of the | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Readability (127 priority) Message: | 1161 | champagne and the stars. At high tide in the afternoon I watched his guests | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1162 | diving from the tower of his raft, or taking the sun on the hot sand of his | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1163 | beach while his two motor-boats slit the waters of the Sound, drawing aquaplanes | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1164 | over cataracts of foam. On week-ends his Rolls-Royce became an omnibus, bearing | ~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Capitalization (31 priority) Message: | 1171 | Every Friday five crates of oranges and lemons arrived from a fruiterer in New | ^~~~ 1172 | York—every Monday these same oranges and lemons left his back door in a pyramid | ~~~~ Ensure proper capitalization of notable places that are significant regional centers, travel destinations, or have international importance. Suggest: - Replace with: “New York” Lint: Spelling (63 priority) Message: | 1172 | York—every Monday these same oranges and lemons left his back door in a pyramid 1173 | of pulpless halves. There was a machine in the kitchen which could extract the | ^~~~~~~~ Did you mean to spell `pulpless` this way? Suggest: - Replace with: “purple's” - Replace with: “pullers” - Replace with: “pullets” Lint: Typo (31 priority) Message: | 1172 | York—every Monday these same oranges and lemons left his back door in a pyramid 1173 | of pulpless halves. There was a machine in the kitchen which could extract the | ^~~~~~~~ `pulpless` should probably be written as `pulp less`. Suggest: - Replace with: “pulp less” Lint: Spelling (63 priority) Message: | 1179 | enormous garden. On buffet tables, garnished with glistening hors-d’œuvre, | ^~~~ Did you mean to spell `hors` this way? 1180 | spiced baked hams crowded against salads of harlequin designs and pastry pigs Suggest: - Replace with: “hours” - Replace with: “ho's” - Replace with: “hers” Lint: Spelling (63 priority) Message: | 1179 | enormous garden. On buffet tables, garnished with glistening hors-d’œuvre, | ^~~~~~~ Did you mean to spell `d’œuvre` this way? 1180 | spiced baked hams crowded against salads of harlequin designs and pastry pigs Suggest: - Replace with: “demure” - Replace with: “oeuvre” Lint: Spelling (63 priority) Message: | 1186 | By seven o’clock the orchestra has arrived, no thin five-piece affair, but a 1187 | whole pitful of oboes and trombones and saxophones and viols and cornets and | ^~~~~~ Did you mean to spell `pitful` this way? Suggest: - Replace with: “pitiful” - Replace with: “potful” - Replace with: “painful” Lint: Readability (127 priority) Message: | 1188 | piccolos, and low and high drums. The last swimmers have come in from the beach | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | now and are dressing up-stairs; the cars from New York are parked five deep in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1190 | the drive, and already the halls and salons and verandas are gaudy with primary | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1191 | colors, and hair bobbed in strange new ways, and shawls beyond the dreams of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1192 | Castile. The bar is in full swing, and floating rounds of cocktails permeate the | ~~~~~~~~ This sentence is 54 words long. Lint: Spelling (127 priority) Message: | 1188 | piccolos, and low and high drums. The last swimmers have come in from the beach 1189 | now and are dressing up-stairs; the cars from New York are parked five deep in | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Spelling (63 priority) Message: | 1191 | colors, and hair bobbed in strange new ways, and shawls beyond the dreams of 1192 | Castile. The bar is in full swing, and floating rounds of cocktails permeate the | ^~~~~~~ Did you mean to spell `Castile` this way? Suggest: - Replace with: “Castle” - Replace with: “Captive” - Replace with: “Caste” Lint: Readability (127 priority) Message: | 1192 | Castile. The bar is in full swing, and floating rounds of cocktails permeate the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | garden outside, until the air is alive with chatter and laughter, and casual | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1194 | innuendo and introductions forgotten on the spot, and enthusiastic meetings | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1195 | between women who never knew each other’s names. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 1200 | tipped out at a cheerful word. The groups change more swiftly, swell with new | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | arrivals, dissolve and form in the same breath; already there are wanderers, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1202 | confident girls who weave here and there among the stouter and more stable, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1203 | become for a sharp, joyous moment the centre of a group, and then, excited with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1204 | triumph, glide on through the sea-change of faces and voices and color under the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1205 | constantly changing light. | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 66 words long. Lint: Style (31 priority) Message: | 1200 | tipped out at a cheerful word. The groups change more swiftly, swell with new 1201 | arrivals, dissolve and form in the same breath; already there are wanderers, | ^~~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Style (127 priority) Message: | 1202 | confident girls who weave here and there among the stouter and more stable, | ^~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists 1203 | become for a sharp, joyous moment the centre of a group, and then, excited with Suggest: - Replace with: “stabler” Lint: Spelling (63 priority) Message: | 1202 | confident girls who weave here and there among the stouter and more stable, 1203 | become for a sharp, joyous moment the centre of a group, and then, excited with | ^~~~~~ Did you mean to spell `centre` this way? 1204 | triumph, glide on through the sea-change of faces and voices and color under the Suggest: - Replace with: “center” - Replace with: “cent's” - Replace with: “censure” Lint: Readability (127 priority) Message: | 1223 | I had been actually invited. A chauffeur in a uniform of robin’s-egg blue | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1224 | crossed my lawn early that Saturday morning with a surprisingly formal note from | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1225 | his employer: the honor would be entirely Gatsby’s, it said, if I would attend | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1226 | his “little party” that night. He had seen me several times, and had intended to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 1230 | Dressed up in white flannels I went over to his lawn a little after seven, and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1231 | wandered around rather ill at ease among swirls and eddies of people I didn’t | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1232 | know—though here and there was a face I had noticed on the commuting train. I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Readability (127 priority) Message: | 1240 | As soon as I arrived I made an attempt to find my host, but the two or three | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1241 | people of whom I asked his whereabouts stared at me in such an amazed way, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1242 | denied so vehemently any knowledge of his movements, that I slunk off in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1243 | direction of the cocktail table—the only place in the garden where a single man | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | could linger without looking purposeless and alone. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 70 words long. Lint: Readability (127 priority) Message: | 1246 | I was on my way to get roaring drunk from sheer embarrassment when Jordan Baker | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1247 | came out of the house and stood at the head of the marble steps, leaning a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1248 | little backward and looking with contemptuous interest down into the garden. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Miscellaneous (31 priority) Message: | 1250 | Welcome or not, I found it necessary to attach myself to some one before I | ^~~~~~~~ Did you mean the closed compound `someone`? 1251 | should begin to address cordial remarks to the passers-by. Suggest: - Replace with: “someone” Lint: Spelling (63 priority) Message: | 1287 | and address—inside of a week I got a package from Croirier’s with a new evening | ^~~~~~~~~~ Did you mean to spell `Croirier’s` this way? 1288 | gown in it.” Suggest: - Replace with: “Courier's” - Replace with: “Crosier's” - Replace with: “Croupier's” Lint: Miscellaneous (31 priority) Message: | 1307 | A thrill passed over all of us. The three Mr. Mumbles bent forward and listened | ^~~~~~~~ Did you mean the closed compound `overall`? Suggest: - Replace with: “overall” Lint: Spelling (63 priority) Message: | 1310 | “I don’t think it’s so much that,” argued Lucille sceptically; “it’s more that | ^~~~~~~~~~~ Did you mean to spell `sceptically` this way? Suggest: - Replace with: “skeptically” - Replace with: “scenically” - Replace with: “ascetically” Lint: Spelling (63 priority) Message: | 1336 | West Egg, and carefully on guard against its spectroscopic gayety. | ^~~~~~ Did you mean to spell `gayety` this way? Suggest: - Replace with: “gaiety” - Replace with: “gamely” - Replace with: “gamete” Lint: Spelling (63 priority) Message: | 1347 | chance we tried an important-looking door, and walked into a high Gothic 1348 | library, panelled with carved English oak, and probably transported complete | ^~~~~~~~ Did you mean to spell `panelled` this way? Suggest: - Replace with: “paneled” - Replace with: “palled” - Replace with: “Janelle” Lint: Spelling (63 priority) Message: | 1373 | Taking our scepticism for granted, he rushed to the bookcases and returned with | ^~~~~~~~~~ Did you mean to spell `scepticism` this way? Suggest: - Replace with: “skepticism” - Replace with: “asceticism” Lint: Spelling (63 priority) Message: | 1373 | Taking our scepticism for granted, he rushed to the bookcases and returned with 1374 | Volume One of the “Stoddard Lectures.” | ^~~~~~~~ Did you mean to spell `Stoddard` this way? Suggest: - Replace with: “Standard” - Replace with: “Stoppard” - Replace with: “Goddard” Lint: Spelling (63 priority) Message: | 1376 | “See!” he cried triumphantly. “It’s a bona-fide piece of printed matter. It | ^~~~ Did you mean to spell `bona` this way? Suggest: - Replace with: “boa” - Replace with: “bond” - Replace with: “bone” Lint: Spelling (63 priority) Message: | 1376 | “See!” he cried triumphantly. “It’s a bona-fide piece of printed matter. It | ^~~~ Did you mean to spell `fide` this way? Suggest: - Replace with: “fade” - Replace with: “fife” - Replace with: “file” Lint: Spelling (63 priority) Message: | 1377 | fooled me. This fella’s a regular Belasco. It’s a triumph. What thoroughness! | ^~~~~~~ Did you mean to spell `fella’s` this way? Suggest: - Replace with: “fellas” - Replace with: “fell's” - Replace with: “Bella's” Lint: Spelling (63 priority) Message: | 1377 | fooled me. This fella’s a regular Belasco. It’s a triumph. What thoroughness! | ^~~~~~~ Did you mean to spell `Belasco` this way? Suggest: - Replace with: “Bela's” - Replace with: “Belau's” - Replace with: “Balance” Lint: Spelling (63 priority) Message: | 1389 | “I was brought by a woman named Roosevelt,” he continued. “Mrs. Claud Roosevelt. | ^~~~~ Did you mean to spell `Claud` this way? Suggest: - Replace with: “Clad” - Replace with: “Cloud” - Replace with: “Claude” Lint: Readability (127 priority) Message: | 1402 | There was dancing now on the canvas in the garden; old men pushing young girls | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | backward in eternal graceless circles, superior couples holding each other | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1404 | tortuously, fashionably, and keeping in the corners—and a great number of single | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1405 | girls dancing individualistically or relieving the orchestra for a moment of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1406 | burden of the banjo or the traps. By midnight the hilarity had increased. A | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 57 words long. Lint: Formatting (255 priority) Message: | 1408 | jazz, and between the numbers people were doing ‘‘stunts” all over the garden, | ^ This quote has no termination. 1409 | while happy, vacuous bursts of laughter rose toward the summer sky. A pair of Lint: Spelling (63 priority) Message: | 1413 | trembling a little to the stiff, tinny drip of the banjoes on the lawn. | ^~~~~~~ Did you mean to spell `banjoes` this way? Suggest: - Replace with: “banjo's” - Replace with: “banjos” - Replace with: “bandies” Lint: Typo (31 priority) Message: | 1413 | trembling a little to the stiff, tinny drip of the banjoes on the lawn. | ^~~~~~~ `banjoes` should probably be written as `banjo es`. Suggest: - Replace with: “banjo es” Lint: Enhancement (31 priority) Message: | 1457 | “I thought you knew, old sport. I’m afraid I’m not a very good host.” | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “excellent” Lint: Readability (127 priority) Message: | 1463 | prejudice in your favor. It understood you just so far as you wanted to be | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | understood, believed in you as you would like to believe in yourself, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1465 | assured you that it had precisely the impression of you that, at your best, you | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1466 | hoped to convey. Precisely at that point it vanished—and I was looking at an | ~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Style (31 priority) Message: | 1466 | hoped to convey. Precisely at that point it vanished—and I was looking at an 1467 | elegant young rough-neck, a year or two over thirty, whose elaborate formality | ^~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: WordChoice (127 priority) Message: | 1514 | “Ladies and gentlemen,” he cried. “At the request of Mr. Gatsby we are going to 1515 | play for you Mr. Vladmir Tostoff’s latest work, which attracted so much | ^~~ The possessive version of this word is more common in this context. Suggest: - Replace with: “your” - Replace with: “you're a” - Replace with: “you're an” Lint: Spelling (63 priority) Message: | 1515 | play for you Mr. Vladmir Tostoff’s latest work, which attracted so much | ^~~~~~~ Did you mean `Vladimir`? Suggest: - Replace with: “Vladimir” Lint: Spelling (63 priority) Message: | 1515 | play for you Mr. Vladmir Tostoff’s latest work, which attracted so much | ^~~~~~~~~ Did you mean `Castoff's`? Suggest: - Replace with: “Castoff's” Lint: Spelling (63 priority) Message: | 1520 | “The piece is known,” he concluded lustily, “as ‘Vladmir Tostoff’s Jazz History | ^~~~~~~ Did you mean `Vladimir`? 1521 | of the World.’” Suggest: - Replace with: “Vladimir” Lint: Spelling (63 priority) Message: | 1520 | “The piece is known,” he concluded lustily, “as ‘Vladmir Tostoff’s Jazz History | ^~~~~~~~~ Did you mean `Castoff's`? 1521 | of the World.’” Suggest: - Replace with: “Castoff's” Lint: Spelling (63 priority) Message: | 1523 | The nature of Mr. Tostoff’s composition eluded me, because just as it began my | ^~~~~~~~~ Did you mean `Castoff's`? Suggest: - Replace with: “Castoff's” Lint: Style (127 priority) Message: | 1528 | drinking helped to set him off from his guests, for it seemed to me that he grew 1529 | more correct as the fraternal hilarity increased. When the “Jazz History of the | ^~~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “correcter” Lint: Readability (127 priority) Message: | 1529 | more correct as the fraternal hilarity increased. When the “Jazz History of the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | World” was over, girls were putting their heads on men’s shoulders in a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1531 | puppyish, convivial way, girls were swooning backward playfully into men’s arms, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1532 | even into groups, knowing that some one would arrest their falls—but no one | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1533 | swooned backward on Gatsby, and no French bob touched Gatsby’s shoulder, and no | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1534 | singing quartets were formed for Gatsby’s head for one link. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 67 words long. Lint: Spelling (63 priority) Message: | 1530 | World” was over, girls were putting their heads on men’s shoulders in a 1531 | puppyish, convivial way, girls were swooning backward playfully into men’s arms, | ^~~~~~~~ Did you mean to spell `puppyish` this way? Suggest: - Replace with: “puppy's” - Replace with: “purplish” - Replace with: “uppish” Lint: Miscellaneous (31 priority) Message: | 1531 | puppyish, convivial way, girls were swooning backward playfully into men’s arms, 1532 | even into groups, knowing that some one would arrest their falls—but no one | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “someone” Lint: Readability (127 priority) Message: | 1574 | rent asunder by dissension. One of the men was talking with curious intensity to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | a young actress, and his wife, after attempting to laugh at the situation in a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1576 | dignified and indifferent way, broke down entirely and resorted to flank | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1577 | attacks—at intervals she appeared suddenly at his side like an angry diamond, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1578 | and hissed: “You promised!” into his ear. | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Formatting (63 priority) Message: | 1612 | “It was . . . simply amazing,” she repeated abstractedly. “But I swore I | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Capitalization (31 priority) Message: | 1612 | “It was . . . simply amazing,” she repeated abstractedly. “But I swore I | ^~~~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Simply” Lint: Spelling (63 priority) Message: | 1615 | Sigourney Howard. . . . My aunt. . . .” She was hurrying off as she talked—her | ^~~~~~~~~ Did you mean to spell `Sigourney` this way? Suggest: - Replace with: “Sojourned” - Replace with: “Sojourner” - Replace with: “Gurney” Lint: Spelling (63 priority) Message: | 1642 | scene. In the ditch beside the road, right side up, but violently shorn of one | ^~~~~ Did you mean to spell `shorn` this way? 1643 | wheel, rested a new coupé which had left Gatsby’s drive not two minutes before. Suggest: - Replace with: “shore” - Replace with: “short” - Replace with: “shown” Lint: Spelling (63 priority) Message: | 1642 | scene. In the ditch beside the road, right side up, but violently shorn of one 1643 | wheel, rested a new coupé which had left Gatsby’s drive not two minutes before. | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: WordChoice (127 priority) Message: | 1667 | “Don’t ask me,” said Owl Eyes, washing his hands of the whole matter. “I know 1668 | very little about driving—next to nothing. It happened, and that’s all I know.” | ^~ Use `too` here to mean ‘also’ or an excessive degree. Suggest: - Replace with: “too” Lint: Spelling (63 priority) Message: | 1683 | The shock that followed this declaration found voice in a sustained “Ah-h-h!” as 1684 | the door of the coupé swung slowly open. The crowd—it was now a crowd—stepped | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 1693 | “Wha’s matter?” he inquired calmly. “Did we run outa gas?” | ^~~~~ Did you mean to spell `Wha’s` this way? Suggest: - Replace with: “Wham's” - Replace with: “What's” - Replace with: “Who's” Lint: Spelling (63 priority) Message: | 1693 | “Wha’s matter?” he inquired calmly. “Did we run outa gas?” | ^~~~ Did you mean to spell `outa` this way? Suggest: - Replace with: “out” - Replace with: “outta” - Replace with: “outs” Lint: Typo (31 priority) Message: | 1693 | “Wha’s matter?” he inquired calmly. “Did we run outa gas?” | ^~~~ `outa` should probably be written as `out a`. Suggest: - Replace with: “out a” Lint: Miscellaneous (31 priority) Message: | 1701 | “It came off,” some one explained. | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “someone” Lint: Spelling (63 priority) Message: | 1710 | “Wonder’ff tell me where there’s a gas’line station?” | ^~~~~~~~~ Did you mean `Wonder's`? Suggest: - Replace with: “Wonder's” Lint: Spelling (63 priority) Message: | 1710 | “Wonder’ff tell me where there’s a gas’line station?” | ^~~~~~~~ Did you mean to spell `gas’line` this way? Suggest: - Replace with: “gasoline” - Replace with: “baseline” - Replace with: “Vaseline” Lint: Readability (127 priority) Message: | 1740 | potatoes and coffee. I even had a short affair with a girl who lived in Jersey | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1741 | City and worked in the accounting department, but her brother began throwing | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1742 | mean looks in my direction, so when she went on her vacation in July I let it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1743 | blow quietly away. | ~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (127 priority) Message: | 1745 | I took dinner usually at the Yale Club—for some reason it was the gloomiest 1746 | event of my day—and then I went up-stairs to the library and studied investments | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. 1747 | and securities for a conscientious hour. There were generally a few rioters Suggest: - Replace with: “upstairs” Lint: Readability (127 priority) Message: | 1759 | darkness. At the enchanted metropolitan twilight I felt a haunting loneliness | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1760 | sometimes, and felt it in others—poor young clerks who loitered in front of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1761 | windows waiting until it was time for a solitary restaurant dinner—young clerks | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1762 | in the dusk, wasting the most poignant moments of night and life. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Spelling (63 priority) Message: | 1764 | Again at eight o’clock, when the dark lanes of the Forties were lined five deep 1765 | with throbbing taxicabs, bound for the theatre district, I felt a sinking in my | ^~~~~~~ Did you mean to spell `theatre` this way? 1766 | heart. Forms leaned together in the taxis as they waited, and voices sang, and Suggest: - Replace with: “theater” - Replace with: “they're” - Replace with: “there” Lint: Spelling (63 priority) Message: | 1768 | unintelligible circles inside. Imagining that I, too, was hurrying toward gayety | ^~~~~~ Did you mean to spell `gayety` this way? 1769 | and sharing their intimate excitement, I wished them well. Suggest: - Replace with: “gaiety” - Replace with: “gamely” - Replace with: “gamete” Lint: Miscellaneous (31 priority) Message: | 1772 | again. At first I was flattered to go places with her, because she was a golf 1773 | champion, and every one knew her name. Then it was something more. I wasn’t | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “everyone” Lint: Readability (127 priority) Message: | 1777 | found what it was. When we were on a house-party together up in Warwick, she | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | left a borrowed car out in the rain with the top down, and then lied about | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1779 | it—and suddenly I remembered the story about her that had eluded me that night | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | at Daisy’s. At her first big golf tournament there was a row that nearly reached | ~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (127 priority) Message: | 1781 | the newspapers—a suggestion that she had moved her ball from a bad lie in the 1782 | semi-final round. The thing approached the proportions of a scandal—then died | ^~~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “semifinal” Lint: Readability (127 priority) Message: | 1789 | thought impossible. She was incurably dishonest. She wasn’t able to endure being | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1790 | at a disadvantage and, given this unwillingness, I suppose she had begun dealing | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | in subterfuges when she was very young in order to keep that cool, insolent | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | smile turned to the world and yet satisfy the demands of her hard, jaunty body. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: Style (127 priority) Message: | 1800 | “You’re a rotten driver,” I protested. “Either you ought to be more careful, or | ^~~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists 1801 | you oughtn’t to drive at all.” Suggest: - Replace with: “carefuller” Lint: Punctuation (31 priority) Message: | 1824 | perspiration appeared on her upper lip. Nevertheless there was a vague | ^~~~~~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. 1825 | understanding that had to be tactfully broken off before I was free. Suggest: - Insert “,” Lint: Miscellaneous (31 priority) Message: | 1827 | Every one suspects himself of at least one of the cardinal virtues, and this is | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “Everyone” Lint: Spelling (63 priority) Message: | 1837 | cocktails and his flowers. “One time he killed a man who had found out that he 1838 | was nephew to Von Hindenburg and second cousin to the devil. Reach me a rose, | ^~~ Did you mean to spell `Von` this way? Suggest: - Replace with: “Van” - Replace with: “Vol” - Replace with: “Vow” Lint: Grammar (31 priority) Message: | 1839 | honey, and pour me a last drop into that there crystal glass.” | ^~~~~ Did you mean `their`? Suggest: - Replace with: “their” Lint: Spelling (63 priority) Message: | 1848 | From East Egg, then, came the Chester Beckers and the Leeches, and a man named | ^~~~~~~ Did you mean to spell `Beckers` this way? 1849 | Bunsen, whom I knew at Yale, and Doctor Webster Civet, who was drowned last Suggest: - Replace with: “Becker's” - Replace with: “Backers” - Replace with: “Beakers” Lint: Spelling (63 priority) Message: | 1850 | summer up in Maine. And the Hornbeams and the Willie Voltaires, and a whole clan | ^~~~~~~~~ Did you mean to spell `Hornbeams` this way? Suggest: - Replace with: “Hornbeam” - Replace with: “Moonbeams” Lint: Spelling (63 priority) Message: | 1850 | summer up in Maine. And the Hornbeams and the Willie Voltaires, and a whole clan | ^~~~~~~~~ Did you mean to spell `Voltaires` this way? 1851 | named Blackbuck, who always gathered in a corner and flipped up their noses like Suggest: - Replace with: “Voltaire's” - Replace with: “Voltaire” - Replace with: “Voltages” Lint: Spelling (63 priority) Message: | 1850 | summer up in Maine. And the Hornbeams and the Willie Voltaires, and a whole clan 1851 | named Blackbuck, who always gathered in a corner and flipped up their noses like | ^~~~~~~~~ Did you mean to spell `Blackbuck` this way? Suggest: - Replace with: “Blackjack” - Replace with: “Blackburn” Lint: Spelling (63 priority) Message: | 1852 | goats at whosoever came near. And the Ismays and the Chrysties (or rather Hubert | ^~~~~~ Did you mean to spell `Ismays` this way? 1853 | Auerbach and Mr. Chrystie’s wife), and Edgar Beaver, whose hair, they say, Suggest: - Replace with: “Irma's” - Replace with: “Ism's” - Replace with: “Dismays” Lint: Spelling (63 priority) Message: | 1852 | goats at whosoever came near. And the Ismays and the Chrysties (or rather Hubert | ^~~~~~~~~ Did you mean to spell `Chrysties` this way? 1853 | Auerbach and Mr. Chrystie’s wife), and Edgar Beaver, whose hair, they say, Suggest: - Replace with: “Christi's” - Replace with: “Christie's” - Replace with: “Christie” Lint: Spelling (63 priority) Message: | 1852 | goats at whosoever came near. And the Ismays and the Chrysties (or rather Hubert 1853 | Auerbach and Mr. Chrystie’s wife), and Edgar Beaver, whose hair, they say, | ^~~~~~~~ Did you mean to spell `Auerbach` this way? Suggest: - Replace with: “Approach” - Replace with: “Acerbate” - Replace with: “Acerbic” Lint: Spelling (63 priority) Message: | 1853 | Auerbach and Mr. Chrystie’s wife), and Edgar Beaver, whose hair, they say, | ^~~~~~~~~~ Did you mean to spell `Chrystie’s` this way? Suggest: - Replace with: “Christie's” - Replace with: “Christi's” - Replace with: “Christine's” Lint: Spelling (63 priority) Message: | 1857 | knickerbockers, and had a fight with a bum named Etty in the garden. From | ^~~~ Did you mean to spell `Etty` this way? Suggest: - Replace with: “Etta” - Replace with: “Ethyl” - Replace with: “Jetty” Lint: Spelling (63 priority) Message: | 1857 | knickerbockers, and had a fight with a bum named Etty in the garden. From 1858 | farther out on the Island came the Cheadles and the O. R. P. Schraeders, and the | ^~~~~~~~ Did you mean to spell `Cheadles` this way? Suggest: - Replace with: “Charles” - Replace with: “Cradles” - Replace with: “Headless” Lint: Spelling (63 priority) Message: | 1858 | farther out on the Island came the Cheadles and the O. R. P. Schraeders, and the | ^~ Did you mean to spell `O.` this way? Suggest: - Replace with: “Of” - Replace with: “Oh” - Replace with: “Oi” Lint: Spelling (63 priority) Message: | 1858 | farther out on the Island came the Cheadles and the O. R. P. Schraeders, and the | ^~ Did you mean to spell `R.` this way? Suggest: - Replace with: “RI” - Replace with: “Ra” - Replace with: “Ru” Lint: Spelling (63 priority) Message: | 1858 | farther out on the Island came the Cheadles and the O. R. P. Schraeders, and the | ^~ Did you mean to spell `P.` this way? Suggest: - Replace with: “Pa” - Replace with: “Pi” - Replace with: “PE” Lint: Spelling (63 priority) Message: | 1858 | farther out on the Island came the Cheadles and the O. R. P. Schraeders, and the | ^~~~~~~~~~ Did you mean to spell `Schraeders` this way? 1859 | Stonewall Jackson Abrams of Georgia, and the Fishguards and the Ripley Snells. Suggest: - Replace with: “Schroeder's” - Replace with: “Schroeder” Lint: Spelling (63 priority) Message: | 1859 | Stonewall Jackson Abrams of Georgia, and the Fishguards and the Ripley Snells. | ^~~~~~~~~~ Did you mean `Fireguards`? Suggest: - Replace with: “Fireguards” Lint: Spelling (63 priority) Message: | 1859 | Stonewall Jackson Abrams of Georgia, and the Fishguards and the Ripley Snells. | ^~~~~~ Did you mean to spell `Snells` this way? Suggest: - Replace with: “Snell's” - Replace with: “Sells” - Replace with: “Shells” Lint: Spelling (63 priority) Message: | 1861 | the gravel drive that Mrs. Ulysses Swett’s automobile ran over his right hand. | ^~~~~~~ Did you mean to spell `Swett’s` this way? Suggest: - Replace with: “Sweat's” - Replace with: “Sweet's” - Replace with: “Seth's” Lint: Spelling (63 priority) Message: | 1862 | The Dancies came, too, and S. B. Whitebait, who was well over sixty, and Maurice | ^~~~~~~ Did you mean to spell `Dancies` this way? Suggest: - Replace with: “Dances” - Replace with: “Dandies” - Replace with: “Dannie's” Lint: Spelling (63 priority) Message: | 1862 | The Dancies came, too, and S. B. Whitebait, who was well over sixty, and Maurice | ^~ Did you mean to spell `S.` this way? Suggest: - Replace with: “So” - Replace with: “SA” - Replace with: “Se” Lint: Spelling (63 priority) Message: | 1862 | The Dancies came, too, and S. B. Whitebait, who was well over sixty, and Maurice | ^~ Did you mean to spell `B.` this way? Suggest: - Replace with: “Be” - Replace with: “Bi” - Replace with: “Bu” Lint: Spelling (63 priority) Message: | 1862 | The Dancies came, too, and S. B. Whitebait, who was well over sixty, and Maurice 1863 | A. Flink, and the Hammerheads, and Beluga the tobacco importer, and Beluga’s | ^~ Did you mean to spell `A.` this way? Suggest: - Replace with: “A” - Replace with: “Ab” - Replace with: “Ac” Lint: Spelling (63 priority) Message: | 1863 | A. Flink, and the Hammerheads, and Beluga the tobacco importer, and Beluga’s | ^~~~~ Did you mean to spell `Flink` this way? Suggest: - Replace with: “Fink” - Replace with: “Flank” - Replace with: “Flick” Lint: Readability (127 priority) Message: | 1866 | From West Egg came the Poles and the Mulreadys and Cecil Roebuck and Cecil | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1867 | Schoen and Gulick the State senator and Newton Orchid, who controlled Films Par | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1868 | Excellence, and Eckhaust and Clyde Cohen and Don S. Schwartze (the son) and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1869 | Arthur McCarty, all connected with the movies in one way or another. And the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Spelling (63 priority) Message: | 1866 | From West Egg came the Poles and the Mulreadys and Cecil Roebuck and Cecil | ^~~~~~~~~ Did you mean to spell `Mulreadys` this way? 1867 | Schoen and Gulick the State senator and Newton Orchid, who controlled Films Par Suggest: - Replace with: “Misreads” - Replace with: “Already” - Replace with: “Unready” Lint: Spelling (63 priority) Message: | 1866 | From West Egg came the Poles and the Mulreadys and Cecil Roebuck and Cecil 1867 | Schoen and Gulick the State senator and Newton Orchid, who controlled Films Par | ^~~~~~ Did you mean to spell `Schoen` this way? Suggest: - Replace with: “School” - Replace with: “Scion” - Replace with: “Scone” Lint: Spelling (63 priority) Message: | 1866 | From West Egg came the Poles and the Mulreadys and Cecil Roebuck and Cecil 1867 | Schoen and Gulick the State senator and Newton Orchid, who controlled Films Par | ^~~~~~ Did you mean to spell `Gulick` this way? Suggest: - Replace with: “Gulch” - Replace with: “Click” - Replace with: “Flick” Lint: Spelling (63 priority) Message: | 1867 | Schoen and Gulick the State senator and Newton Orchid, who controlled Films Par 1868 | Excellence, and Eckhaust and Clyde Cohen and Don S. Schwartze (the son) and | ^~~~~~~~ Did you mean `Exhaust`? Suggest: - Replace with: “Exhaust” Lint: Spelling (63 priority) Message: | 1868 | Excellence, and Eckhaust and Clyde Cohen and Don S. Schwartze (the son) and | ^~ Did you mean to spell `S.` this way? Suggest: - Replace with: “So” - Replace with: “SA” - Replace with: “Se” Lint: Spelling (63 priority) Message: | 1868 | Excellence, and Eckhaust and Clyde Cohen and Don S. Schwartze (the son) and | ^~~~~~~~~ Did you mean to spell `Schwartze` this way? 1869 | Arthur McCarty, all connected with the movies in one way or another. And the Suggest: - Replace with: “Schwartz” - Replace with: “Schwartz's” Lint: Spelling (63 priority) Message: | 1869 | Arthur McCarty, all connected with the movies in one way or another. And the 1870 | Catlips and the Bembergs and G. Earl Muldoon, brother to that Muldoon who | ^~~~~~~ Did you mean to spell `Catlips` this way? Suggest: - Replace with: “Cali's” - Replace with: “Catnip's” - Replace with: “Caliphs” Lint: Spelling (63 priority) Message: | 1869 | Arthur McCarty, all connected with the movies in one way or another. And the 1870 | Catlips and the Bembergs and G. Earl Muldoon, brother to that Muldoon who | ^~~~~~~~ Did you mean to spell `Bembergs` this way? Suggest: - Replace with: “Berber's” - Replace with: “Bomber's” - Replace with: “Berbers” Lint: Spelling (63 priority) Message: | 1869 | Arthur McCarty, all connected with the movies in one way or another. And the 1870 | Catlips and the Bembergs and G. Earl Muldoon, brother to that Muldoon who | ^~ Did you mean to spell `G.` this way? Suggest: - Replace with: “Go” - Replace with: “GI” - Replace with: “GU” Lint: Spelling (63 priority) Message: | 1870 | Catlips and the Bembergs and G. Earl Muldoon, brother to that Muldoon who | ^~~~~~~ Did you mean `Mullion`? 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros Suggest: - Replace with: “Mullion” Lint: Spelling (63 priority) Message: | 1870 | Catlips and the Bembergs and G. Earl Muldoon, brother to that Muldoon who | ^~~~~~~ Did you mean `Mullion`? 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros Suggest: - Replace with: “Mullion” Lint: Capitalization (127 priority) Message: | 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros | ^~ This word's canonical spelling is all-caps. Suggest: - Replace with: “DA” Lint: Spelling (63 priority) Message: | 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros | ^~ Did you mean to spell `Da` this way? Suggest: - Replace with: “Dab” - Replace with: “Dad” - Replace with: “Dag” Lint: Readability (127 priority) Message: | 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | and James B. (“Rot-Gut”) Ferret and the De Jongs and Ernest Lilly—they came to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1873 | gamble, and when Ferret wandered into the garden it meant he was cleaned out and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1874 | Associated Traction would have to fluctuate profitably next day. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Spelling (63 priority) Message: | 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros | ^~~~~~~ Did you mean to spell `Fontano` this way? Suggest: - Replace with: “Fondant” - Replace with: “Fontanel” - Replace with: “Montana” Lint: Spelling (63 priority) Message: | 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros | ^~~~~~ Did you mean to spell `Legros` this way? 1872 | and James B. (“Rot-Gut”) Ferret and the De Jongs and Ernest Lilly—they came to Suggest: - Replace with: “Lear's” - Replace with: “Leger's” - Replace with: “Leer's” Lint: Spelling (63 priority) Message: | 1871 | afterward strangled his wife. Da Fontano the promoter came there, and Ed Legros 1872 | and James B. (“Rot-Gut”) Ferret and the De Jongs and Ernest Lilly—they came to | ^~ Did you mean to spell `B.` this way? Suggest: - Replace with: “Be” - Replace with: “Bi” - Replace with: “Bu” Lint: Spelling (63 priority) Message: | 1872 | and James B. (“Rot-Gut”) Ferret and the De Jongs and Ernest Lilly—they came to | ^~~~~ Did you mean to spell `Jongs` this way? 1873 | gamble, and when Ferret wandered into the garden it meant he was cleaned out and Suggest: - Replace with: “Jon's” - Replace with: “Jonas” - Replace with: “Jogs” Lint: Spelling (63 priority) Message: | 1876 | A man named Klipspringer was there so often and so long that he became known as | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Spelling (63 priority) Message: | 1877 | “the boarder”—I doubt if he had any other home. Of theatrical people there were 1878 | Gus Waize and Horace O’Donavan and Lester Myer and George Duckweed and Francis | ^~~~~ Did you mean to spell `Waize` this way? Suggest: - Replace with: “Waive” - Replace with: “Waite” - Replace with: “Maize” Lint: Spelling (63 priority) Message: | 1877 | “the boarder”—I doubt if he had any other home. Of theatrical people there were 1878 | Gus Waize and Horace O’Donavan and Lester Myer and George Duckweed and Francis | ^~~~~~~~~ Did you mean `Donovan`? Suggest: - Replace with: “Donovan” Lint: Spelling (63 priority) Message: | 1878 | Gus Waize and Horace O’Donavan and Lester Myer and George Duckweed and Francis | ^~~~ Did you mean to spell `Myer` this way? 1879 | Bull. Also from New York were the Chromes and the Backhyssons and the Dennickers Suggest: - Replace with: “Mayer” - Replace with: “Meyer” - Replace with: “Myers” Lint: Readability (127 priority) Message: | 1879 | Bull. Also from New York were the Chromes and the Backhyssons and the Dennickers | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1882 | and Henry L. Palmetto, who killed himself by jumping in front of a subway train | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | in Times Square. | ~~~~~~~~~~~~~~~~ This sentence is 59 words long. Lint: Spelling (63 priority) Message: | 1879 | Bull. Also from New York were the Chromes and the Backhyssons and the Dennickers | ^~~~~~~~~~~ Did you mean to spell `Backhyssons` this way? 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the Suggest: - Replace with: “Backhoes” - Replace with: “Backstops” - Replace with: “Jacksons” Lint: Spelling (63 priority) Message: | 1879 | Bull. Also from New York were the Chromes and the Backhyssons and the Dennickers | ^~~~~~~~~~ Did you mean to spell `Dennickers` this way? 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the Suggest: - Replace with: “Deicers” - Replace with: “Deniers” - Replace with: “Dickers” Lint: Spelling (63 priority) Message: | 1879 | Bull. Also from New York were the Chromes and the Backhyssons and the Dennickers 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the | ^~~~~~~~~ Did you mean `Cardigans`? Suggest: - Replace with: “Cardigans” Lint: Spelling (63 priority) Message: | 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the | ^~~~~~~~~ Did you mean to spell `Kellehers` this way? 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, Suggest: - Replace with: “Keller's” - Replace with: “Kelley's” - Replace with: “Kellie's” Lint: Spelling (63 priority) Message: | 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the | ^~~~~~ Did you mean to spell `Dewars` this way? 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, Suggest: - Replace with: “Dewar's” - Replace with: “Dears” - Replace with: “Debars” Lint: Spelling (63 priority) Message: | 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ^~~~~~~ Did you mean to spell `Scullys` this way? Suggest: - Replace with: “Scull's” - Replace with: “Sculls” - Replace with: “Sculley's” Lint: Spelling (63 priority) Message: | 1880 | and Russel Betty and the Corrigans and the Kellehers and the Dewars and the 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ^~ Did you mean to spell `S.` this way? Suggest: - Replace with: “So” - Replace with: “SA” - Replace with: “Se” Lint: Spelling (63 priority) Message: | 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ^~ Did you mean to spell `W.` this way? Suggest: - Replace with: “We” - Replace with: “WA” - Replace with: “WI” Lint: Spelling (63 priority) Message: | 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ^~~~~~~ Did you mean to spell `Belcher` this way? Suggest: - Replace with: “Beecher” - Replace with: “Belched” - Replace with: “Belches” Lint: Spelling (63 priority) Message: | 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ^~~~~~~ Did you mean to spell `Smirkes` this way? 1882 | and Henry L. Palmetto, who killed himself by jumping in front of a subway train Suggest: - Replace with: “Smirk's” - Replace with: “Smirks” - Replace with: “Smirked” Lint: Spelling (63 priority) Message: | 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, | ^~~~~~ Did you mean to spell `Quinns` this way? 1882 | and Henry L. Palmetto, who killed himself by jumping in front of a subway train Suggest: - Replace with: “Quinn's” - Replace with: “Quines” - Replace with: “Quins” Lint: Spelling (63 priority) Message: | 1881 | Scullys and S. W. Belcher and the Smirkes and the young Quinns, divorced now, 1882 | and Henry L. Palmetto, who killed himself by jumping in front of a subway train | ^~ Did you mean to spell `L.` this way? Suggest: - Replace with: “Le” - Replace with: “Li” - Replace with: “Lu” Lint: Spelling (63 priority) Message: | 1885 | Benny McClenahan arrived always with four girls. They were never quite the same | ^~~~~~~~~~ Did you mean `McClellan`? Suggest: - Replace with: “McClellan” Lint: Readability (127 priority) Message: | 1887 | inevitably seemed they had been there before. I have forgotten their | ^~~~~~~~~~~~~~~~~~~~~~~ 1888 | names—Jaqueline, I think, or else Consuela, or Gloria or Judy or June, and their | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1889 | last names were either the melodious names of flowers and months or the sterner | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1890 | ones of the great American capitalists whose cousins, if pressed, they would | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | confess themselves to be. | ~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Spelling (63 priority) Message: | 1887 | inevitably seemed they had been there before. I have forgotten their 1888 | names—Jaqueline, I think, or else Consuela, or Gloria or Judy or June, and their | ^~~~~~~~~ Did you mean to spell `Jaqueline` this way? Suggest: - Replace with: “Jacqueline” - Replace with: “Aquiline” Lint: Spelling (63 priority) Message: | 1887 | inevitably seemed they had been there before. I have forgotten their 1888 | names—Jaqueline, I think, or else Consuela, or Gloria or Judy or June, and their | ^~~~~~~~ Did you mean to spell `Consuela` this way? 1889 | last names were either the melodious names of flowers and months or the sterner Suggest: - Replace with: “Consuelo” - Replace with: “Consul” - Replace with: “Consular” Lint: Spelling (63 priority) Message: | 1893 | In addition to all these I can remember that Faustina O’Brien came there at | ^~~~~~~~ Did you mean to spell `Faustina` this way? 1894 | least once and the Baedeker girls and young Brewer, who had his nose shot off in Suggest: - Replace with: “Faustian” - Replace with: “Faustino” - Replace with: “Fasting” Lint: Spelling (63 priority) Message: | 1895 | the war, and Mr. Albrucksburger and Miss Haag, his fiancée, and Ardita | ^~~~~~~~~~~~~~ Did you mean to spell `Albrucksburger` this way? Lint: Spelling (63 priority) Message: | 1895 | the war, and Mr. Albrucksburger and Miss Haag, his fiancée, and Ardita | ^~~~ Did you mean to spell `Haag` this way? 1896 | Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss Suggest: - Replace with: “Hang” - Replace with: “Haas” - Replace with: “Hag” Lint: Spelling (63 priority) Message: | 1895 | the war, and Mr. Albrucksburger and Miss Haag, his fiancée, and Ardita | ^~~~~~~ Did you mean to spell `fiancée` this way? 1896 | Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss Suggest: - Replace with: “fiance” - Replace with: “fiancee” - Replace with: “finance” Lint: Spelling (63 priority) Message: | 1895 | the war, and Mr. Albrucksburger and Miss Haag, his fiancée, and Ardita | ^~~~~~ Did you mean to spell `Ardita` this way? 1896 | Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss Suggest: - Replace with: “Aria” - Replace with: “Audit” - Replace with: “Akita” Lint: Spelling (63 priority) Message: | 1895 | the war, and Mr. Albrucksburger and Miss Haag, his fiancée, and Ardita 1896 | Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss | ^~~~ Did you mean to spell `Fitz` this way? Suggest: - Replace with: “Fits” - Replace with: “Fit” - Replace with: “Fritz” Lint: Spelling (63 priority) Message: | 1896 | Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss | ^~ Did you mean to spell `P.` this way? Suggest: - Replace with: “Pa” - Replace with: “Pi” - Replace with: “PE” Lint: Spelling (63 priority) Message: | 1896 | Fitz-Peters and Mr. P. Jewett, once head of the American Legion, and Miss | ^~~~~~ Did you mean to spell `Jewett` this way? Suggest: - Replace with: “Jewel” - Replace with: “Jewell” - Replace with: “Jewess” Lint: Readability (127 priority) Message: | 1911 | He was balancing himself on the dashboard of his car with that resourcefulness | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1912 | of movement that is so peculiarly American—that comes, I suppose, with the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1913 | absence of lifting work in youth and, even more, with the formless grace of our | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | nervous, sporadic games. This quality was continually breaking through his | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 1974 | “After that I lived like a young rajah in all the capitals of Europe—Paris, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1975 | Venice, Rome—collecting jewels, chiefly rubies, hunting big game, painting a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1976 | little, things for myself only, and trying to forget something very sad that had | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | happened to me long ago.” | ~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (63 priority) Message: | 1981 | “character” leaking sawdust at every pore as he pursued a tiger through the Bois | ^~~~ Did you mean to spell `Bois` this way? 1982 | de Boulogne. Suggest: - Replace with: “Boss” - Replace with: “Boris” - Replace with: “Bios” Lint: Spelling (63 priority) Message: | 1981 | “character” leaking sawdust at every pore as he pursued a tiger through the Bois 1982 | de Boulogne. | ^~~~~~~~ Did you mean to spell `Boulogne` this way? Suggest: - Replace with: “Bologna” - Replace with: “Cologne” Lint: Style (31 priority) Message: | 1988 | side of us where the infantry couldn’t advance. We stayed there two days and two 1989 | nights, a hundred and thirty men with sixteen Lewis guns, and when the infantry | ^~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 2006 | To my astonishment, the thing had an authentic look. “Orderi di Danilo,” ran the | ^~~~~~ Did you mean to spell `Orderi` this way? 2007 | circular legend, “Montenegro, Nicolas Rex.” Suggest: - Replace with: “Order” - Replace with: “Orders” - Replace with: “Order's” Lint: Capitalization (127 priority) Message: | 2006 | To my astonishment, the thing had an authentic look. “Orderi di Danilo,” ran the | ^~ This word's canonical spelling is all-caps. 2007 | circular legend, “Montenegro, Nicolas Rex.” Suggest: - Replace with: “DI” Lint: Spelling (63 priority) Message: | 2006 | To my astonishment, the thing had an authentic look. “Orderi di Danilo,” ran the | ^~ Did you mean to spell `di` this way? 2007 | circular legend, “Montenegro, Nicolas Rex.” Suggest: - Replace with: “db” - Replace with: “dc” - Replace with: “dd” Lint: Spelling (63 priority) Message: | 2006 | To my astonishment, the thing had an authentic look. “Orderi di Danilo,” ran the | ^~~~~~ Did you mean to spell `Danilo` this way? 2007 | circular legend, “Montenegro, Nicolas Rex.” Suggest: - Replace with: “Daily” - Replace with: “Danish” - Replace with: “Danial” Lint: Spelling (63 priority) Message: | 2011 | “Major Jay Gatsby,” I read, “For Valour Extraordinary.” | ^~~~~~ Did you mean to spell `Valour` this way? Suggest: - Replace with: “Valor” - Replace with: “Velour” - Replace with: “Value” Lint: Spelling (63 priority) Message: | 2014 | Trinity Quad—the man on my left is now the Earl of Doncaster.” | ^~~~~~~~~ Did you mean to spell `Doncaster` this way? Suggest: - Replace with: “Lancaster” - Replace with: “Podcaster” Lint: Spelling (63 priority) Message: | 2021 | Grand Canal; I saw him opening a chest of rubies to ease, with their 2022 | crimson-lighted depths, the gnawings of his broken heart. | ^~~~~~~~ Did you mean to spell `gnawings` this way? Suggest: - Replace with: “gnawing” - Replace with: “gearings” - Replace with: “gratings” Lint: Spelling (63 priority) Message: | 2047 | ships, and sped along a cobbled slum lined with the dark, undeserted saloons of | ^~~~~~~~~~ Did you mean to spell `undeserted` this way? 2048 | the faded-gilt nineteen-hundreds. Then the valley of ashes opened out on both Suggest: - Replace with: “undeserved” - Replace with: “undefeated” - Replace with: “underserved” Lint: Readability (127 priority) Message: | 2067 | Over the great bridge, with the sunlight through the girders making a constant | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | flicker upon the moving cars, with the city rising up across the river in white | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2069 | heaps and sugar lumps all built with a wish out of non-olfactory money. The city | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 2069 | heaps and sugar lumps all built with a wish out of non-olfactory money. The city 2070 | seen from the Queensboro Bridge is always the city seen for the first time, in | ^~~~~~~~~~ Did you mean `Greensboro`? Suggest: - Replace with: “Greensboro” Lint: Style (127 priority) Message: | 2073 | A dead man passed us in a hearse heaped with blooms, followed by two carriages 2074 | with drawn blinds, and by more cheerful carriages for friends. The friends | ^~~~~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “cheerfuller” Lint: Spelling (63 priority) Message: | 2076 | Europe, and I was glad that the sight of Gatsby’s splendid car was included in 2077 | their sombre holiday. As we crossed Blackwell’s Island a limousine passed us, | ^~~~~~ Did you mean to spell `sombre` this way? Suggest: - Replace with: “somber” - Replace with: “hombre” - Replace with: “sober” Lint: Capitalization (127 priority) Message: | 2078 | driven by a white chauffeur, in which sat three modish negroes, two bucks and a | ^~~~~~~ The canonical dictionary spelling is title case: `Negroes`. 2079 | girl. I laughed aloud as the yolks of their eyeballs rolled toward us in haughty Suggest: - Replace with: “Negroes” Lint: Spelling (63 priority) Message: | 2078 | driven by a white chauffeur, in which sat three modish negroes, two bucks and a | ^~~~~~~ Did you mean to spell `negroes` this way? 2079 | girl. I laughed aloud as the yolks of their eyeballs rolled toward us in haughty Suggest: - Replace with: “Negroes” - Replace with: “Negro's” - Replace with: “Negros” Lint: Spelling (63 priority) Message: | 2091 | “Mr. Carraway, this is my friend Mr. Wolfshiem.” | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 2091 | “Mr. Carraway, this is my friend Mr. Wolfshiem.” | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2097 | “So I took one look at him,” said Mr. Wolfshiem, shaking my hand earnestly, “and | ^~~~~~~~~ Did you mean `Bolshie`? 2098 | what do you think I did?” Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2105 | “I handed the money to Katspaugh and I sid: ‘All right, Katspaugh, don’t pay him | ^~~~~~~~~ Did you mean `Kasparov`? Suggest: - Replace with: “Kasparov” Lint: Capitalization (127 priority) Message: | 2105 | “I handed the money to Katspaugh and I sid: ‘All right, Katspaugh, don’t pay him | ^~~ The canonical dictionary spelling is title case: `Sid`. Suggest: - Replace with: “Sid” Lint: Spelling (63 priority) Message: | 2105 | “I handed the money to Katspaugh and I sid: ‘All right, Katspaugh, don’t pay him | ^~~ Did you mean to spell `sid` this way? Suggest: - Replace with: “sad” - Replace with: “said” - Replace with: “sic” Lint: Spelling (63 priority) Message: | 2105 | “I handed the money to Katspaugh and I sid: ‘All right, Katspaugh, don’t pay him | ^~~~~~~~~ Did you mean `Kasparov`? 2106 | a penny till he shuts his mouth.’ He shut it then and there.” Suggest: - Replace with: “Kasparov” Lint: Spelling (63 priority) Message: | 2109 | whereupon Mr. Wolfshiem swallowed a new sentence he was starting and lapsed into | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2109 | whereupon Mr. Wolfshiem swallowed a new sentence he was starting and lapsed into 2110 | a somnambulatory abstraction. | ^~~~~~~~~~~~~~ Did you mean `ambulatory`? Suggest: - Replace with: “ambulatory” Lint: WordChoice (63 priority) Message: | 2112 | “Highballs?” asked the head waiter. | ^~~~~~~~~~~ Did you mean the closed compound noun “headwaiter”? Suggest: - Replace with: “headwaiter” Lint: Spelling (63 priority) Message: | 2114 | “This is a nice restaurant here,” said Mr. Wolfshiem, looking at the | ^~~~~~~~~ Did you mean `Bolshie`? 2115 | Presbyterian nymphs on the ceiling. “But I like across the street better!” Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2117 | “Yes, highballs,” agreed Gatsby, and then to Mr. Wolfshiem: “It’s too hot over | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2120 | “Hot and small—yes,” said Mr. Wolfshiem, “but full of memories.” | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2124 | “The old Metropole.” | ^~~~~~~~~ Did you mean to spell `Metropole` this way? Suggest: - Replace with: “Metropolis” - Replace with: “Metronome” Lint: Spelling (63 priority) Message: | 2126 | “The old Metropole,” brooded Mr. Wolfshiem gloomily. “Filled with faces dead and | ^~~~~~~~~ Did you mean to spell `Metropole` this way? Suggest: - Replace with: “Metropolis” - Replace with: “Metronome” Lint: Spelling (63 priority) Message: | 2126 | “The old Metropole,” brooded Mr. Wolfshiem gloomily. “Filled with faces dead and | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Formatting (255 priority) Message: | 2126 | “The old Metropole,” brooded Mr. Wolfshiem gloomily. “Filled with faces dead and | ^ This quote has no termination. 2127 | gone. Filled with friends gone now forever. I can’t forget so long as I live the Lint: Formatting (255 priority) Message: | 2134 | “‘Let the bastards come in here if they want you, Rosy, but don’t you, so help | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2142 | “Sure he went.” Mr. Wolfshiem’s nose flashed at me indignantly. “He turned | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Spelling (63 priority) Message: | 2150 | understand you’re looking for a business gonnegtion.” | ^~~~~~~~~~ Did you mean `connection`? Suggest: - Replace with: “connection” Lint: Formatting (255 priority) Message: | 2154 | “Oh, no,” he exclaimed, ‘‘this isn’t the man.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2156 | “No?” Mr. Wolfshiem seemed disappointed. | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2160 | “I beg your pardon,” said Mr. Wolfshiem, “I had a wrong man.” | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2162 | A succulent hash arrived, and Mr. Wolfshiem, forgetting the more sentimental | ^~~~~~~~~ Did you mean `Bolshie`? 2163 | atmosphere of the old Metropole, began to eat with ferocious delicacy. His eyes, Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2162 | A succulent hash arrived, and Mr. Wolfshiem, forgetting the more sentimental 2163 | atmosphere of the old Metropole, began to eat with ferocious delicacy. His eyes, | ^~~~~~~~~ Did you mean to spell `Metropole` this way? Suggest: - Replace with: “Metropolis” - Replace with: “Metronome” Lint: Spelling (63 priority) Message: | 2181 | me with Mr. Wolfshiem at the table. | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2183 | “He has to telephone,” said Mr. Wolfshiem, following him with his eyes. “Fine | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2188 | “He’s an Oggsford man.” | ^~~~~~~~ Did you mean to spell `Oggsford` this way? Suggest: - Replace with: “Oxford” - Replace with: “Longsword” Lint: Spelling (63 priority) Message: | 2192 | “He went to Oggsford College in England. You know Oggsford College?” | ^~~~~~~~ Did you mean to spell `Oggsford` this way? Suggest: - Replace with: “Oxford” - Replace with: “Longsword” Lint: Spelling (63 priority) Message: | 2192 | “He went to Oggsford College in England. You know Oggsford College?” | ^~~~~~~~ Did you mean to spell `Oggsford` this way? Suggest: - Replace with: “Oxford” - Replace with: “Longsword” Lint: Spelling (63 priority) Message: | 2218 | Mr. Wolfshiem drank his coffee with a jerk and got to his feet. | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: WordChoice (127 priority) Message: | 2220 | “I have enjoyed my lunch,” he said, “and I’m going to run off from you two young | ^~~ The possessive version of this word is more common in this context. 2221 | men before I outstay my welcome.” Suggest: - Replace with: “your” - Replace with: “you're a” - Replace with: “you're an” Lint: Spelling (63 priority) Message: | 2223 | “Don’t hurry, Meyer,” said Gatsby, without enthusiasm. Mr. Wolfshiem raised his | ^~~~~~~~~ Did you mean `Bolshie`? 2224 | hand in a sort of benediction. Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2243 | “Meyer Wolfshiem? No, he’s a gambler.” Gatsby hesitated, then added coolly: | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Miscellaneous (31 priority) Message: | 2265 | “Come along with me for a minute,” I said; “I’ve got to say hello to some one.” | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “someone” Lint: Spelling (63 priority) Message: | 2269 | “Where’ve you been?” he demanded eagerly. “Daisy’s furious because you haven’t | ^~~~~~~~ Did you mean to spell `Where’ve` this way? Suggest: - Replace with: “Where'd” - Replace with: “Where's” - Replace with: “Wherever” Lint: Spelling (63 priority) Message: | 2277 | “How’ve you been, anyhow?” demanded Tom of me. “How’d you happen to come up this | ^~~~~~ Did you mean to spell `How’ve` this way? Suggest: - Replace with: “How're” - Replace with: “How'd” - Replace with: “How's” Lint: Readability (127 priority) Message: | 2291 | with rubber nobs on the soles that bit into the soft ground. I had on a new | ^~~~~~~~~~~~~~~ 2292 | plaid skirt also that blew a little in the wind, and whenever this happened the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | red, white, and blue banners in front of all the houses stretched out stiff and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2294 | said tut-tut-tut-tut, in a disapproving way. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Spelling (63 priority) Message: | 2319 | That was nineteen-seventeen. By the next year I had a few beaux myself, and I | ^~~~~ Did you mean to spell `beaux` this way? 2320 | began to play in tournaments, so I didn’t see Daisy very often. She went with a Suggest: - Replace with: “beau” - Replace with: “beaus” - Replace with: “beaut” Lint: Typo (31 priority) Message: | 2319 | That was nineteen-seventeen. By the next year I had a few beaux myself, and I | ^~~~~ `beaux` has a missing space between words. 2320 | began to play in tournaments, so I didn’t see Daisy very often. She went with a Suggest: - Replace with: “be aux” - Replace with: “beau x” Lint: Spelling (63 priority) Message: | 2329 | By the next autumn she was gay again, gay as ever. She had a début after the | ^~~~~ Did you mean to spell `début` this way? 2330 | armistice, and in February she was presumably engaged to a man from New Orleans. Suggest: - Replace with: “debut” - Replace with: “debt” - Replace with: “doubt” Lint: Readability (127 priority) Message: | 2332 | than Louisville ever knew before. He came down with a hundred people in four | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2333 | private cars, and hired a whole floor of the Muhlbach Hotel, and the day before | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | the wedding he gave her a string of pearls valued at three hundred and fifty | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | thousand dollars. | ~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 2333 | private cars, and hired a whole floor of the Muhlbach Hotel, and the day before | ^~~~~~~~ Did you mean to spell `Muhlbach` this way? 2334 | the wedding he gave her a string of pearls valued at three hundred and fifty Suggest: - Replace with: “Mulch” - Replace with: “Mullah” - Replace with: “Fullback” Lint: Spelling (63 priority) Message: | 2339 | dress—and as drunk as a monkey. She had a bottle of Sauterne in one hand and a | ^~~~~~~~ Did you mean to spell `Sauterne` this way? 2340 | letter in the other. Suggest: - Replace with: “Sauternes” - Replace with: “Sterne” - Replace with: “Sauteing” Lint: Spelling (63 priority) Message: | 2342 | “’Gratulate me,” she muttered. “Never had a drink before, but oh how I do enjoy | ^~~~~~~~~ Did you mean to spell `Gratulate` this way? Suggest: - Replace with: “Granulate” - Replace with: “Graduate” - Replace with: “Granulated” Lint: Spelling (63 priority) Message: | 2349 | “Here, deares’.” She groped around in a wastebasket she had with her on the bed | ^~~~~~ Did you mean to spell `deares` this way? Suggest: - Replace with: “dear's” - Replace with: “dares” - Replace with: “dearies” Lint: Typo (31 priority) Message: | 2349 | “Here, deares’.” She groped around in a wastebasket she had with her on the bed | ^~~~~~ `deares` should probably be written as `dear es`. Suggest: - Replace with: “dear es” Lint: Formatting (255 priority) Message: | 2352 | change’ her mine!’” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 2360 | But she didn’t say another word. We gave her spirits of ammonia and put ice on | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2361 | her forehead and hooked her back into her dress, and half an hour later, when we | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2362 | walked out of the room, the pearls were around her neck and the incident was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | over. Next day at five o’clock she married Tom Buchanan without so much as a | ~~~~~ This sentence is 42 words long. Lint: Formatting (255 priority) Message: | 2368 | around uneasily, and say: ‘‘Where’s Tom gone?” and wear the most abstracted | ^ This quote has no termination. 2369 | expression until she saw him coming in the door. She used to sit on the sand Lint: Spelling (63 priority) Message: | 2373 | week after I left Santa Barbara Tom ran into a wagon on the Ventura road one | ^~~~~~~ Did you mean to spell `Ventura` this way? 2374 | night, and ripped a front wheel off his car. The girl who was with him got into Suggest: - Replace with: “Venture” - Replace with: “Ventral” - Replace with: “Ventured” Lint: Spelling (63 priority) Message: | 2379 | saw them one spring in Cannes, and later in Deauville, and then they came back | ^~~~~~~~~ Did you mean `Danville`? 2380 | to Chicago to settle down. Daisy was popular in Chicago, as you know. They moved Suggest: - Replace with: “Danville” Lint: Capitalization (127 priority) Message: | 2395 | When Jordan Baker had finished telling all this we had left the Plaza for half 2396 | an hour and were driving in a victoria through Central Park. The sun had gone | ^~~~~~~~ The canonical dictionary spelling is title case: `Victoria`. Suggest: - Replace with: “Victoria” Lint: Spelling (63 priority) Message: | 2395 | When Jordan Baker had finished telling all this we had left the Plaza for half 2396 | an hour and were driving in a victoria through Central Park. The sun had gone | ^~~~~~~~ Did you mean to spell `victoria` this way? Suggest: - Replace with: “Victoria” - Replace with: “victor's” - Replace with: “victor” Lint: Spelling (63 priority) Message: | 2401 | > “I’m the Sheik of Araby. Your love belongs to me. At night when you’re asleep | ^~~~~ Did you mean to spell `Sheik` this way? Suggest: - Replace with: “Sheikh” - Replace with: “She'd” - Replace with: “She's” Lint: Formatting (255 priority) Message: | 2437 | “I think he half expected her to wander into one of his parties, some night,” 2438 | went on Jordan, “but she never did. Then he began asking people casually if they | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 2444 | “‘I don’t want to do anything out of the way!’ he kept saying. ‘I want to see | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2455 | hard, limited person, who dealt in universal scepticism, and who leaned back | ^~~~~~~~~~ Did you mean to spell `scepticism` this way? 2456 | jauntily just within the circle of my arm. A phrase began to beat in my ears Suggest: - Replace with: “skepticism” - Replace with: “asceticism” Lint: Formatting (255 priority) Message: | 2458 | busy and the tired.” | ^ This quote has no termination. Lint: Miscellaneous (55 priority) Message: | 2462 | “Does she want to see Gatsby?” | ^~~~ Did you mean `wants`? Suggest: - Replace with: “wants” Lint: Spelling (63 priority) Message: | 2467 | We passed a barrier of dark trees, and then the façade of Fifty-ninth Street, a | ^~~~~~ Did you mean to spell `façade` this way? 2468 | block of delicate pale light, beamed down into the park. Unlike Gatsby and Tom Suggest: - Replace with: “facade” - Replace with: “fade” - Replace with: “facades” Lint: Spelling (63 priority) Message: | 2492 | some of the rooms. Let’s go to Coney Island, old sport. In my car.” | ^~~~~ Did you mean to spell `Coney` this way? Suggest: - Replace with: “Convey” - Replace with: “Conley” - Replace with: “Corey” Lint: Spelling (63 priority) Message: | 2526 | “There’s another little thing,” he said uncertainly, and hesitated. | ^~~~~~~~~~~ Did you mean to spell `uncertainly` this way? Suggest: - Replace with: “uncertainty” - Replace with: “uncertain” - Replace with: “certainly” Lint: Formatting (255 priority) Message: | 2530 | “Oh, it isn’t about that. At least—’’ He fumbled with a series of beginnings. | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 2555 | “You wouldn’t have to do any business with Wolfshiem.” Evidently he thought that | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 2555 | “You wouldn’t have to do any business with Wolfshiem.” Evidently he thought that 2556 | I was shying away from the “gonnegtion” mentioned at lunch, but I assured him he | ^~~~~~~~~~ Did you mean `connection`? Suggest: - Replace with: “connection” Lint: Spelling (63 priority) Message: | 2561 | sleep as I entered my front door. So I don’t know whether or not Gatsby went to 2562 | Coney Island, or for how many hours he “glanced into rooms” while his house | ^~~~~ Did you mean to spell `Coney` this way? Suggest: - Replace with: “Convey” - Replace with: “Conley” - Replace with: “Corey” Lint: Enhancement (31 priority) Message: | 2594 | “Looks very good,” he remarked vaguely. “One of the papers said they thought the | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “excellent” Lint: Capitalization (31 priority) Message: | 2603 | “Of course, of course! They’re fine!” and he added hollowly, “. . . old sport.” | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “Old” Lint: Readability (127 priority) Message: | 2606 | thin drops swam like dew. Gatsby looked with vacant eyes through a copy of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2607 | Clay’s “Economics,” starting at the Finnish tread that shook the kitchen floor, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | and peering toward the bleared windows from time to time as if a series of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2609 | invisible but alarming happenings were taking place outside. Finally he got up | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Spelling (63 priority) Message: | 2607 | Clay’s “Economics,” starting at the Finnish tread that shook the kitchen floor, 2608 | and peering toward the bleared windows from time to time as if a series of | ^~~~~~~ Did you mean to spell `bleared` this way? Suggest: - Replace with: “blared” - Replace with: “bleated” - Replace with: “beard” Lint: Typo (31 priority) Message: | 2607 | Clay’s “Economics,” starting at the Finnish tread that shook the kitchen floor, 2608 | and peering toward the bleared windows from time to time as if a series of | ^~~~~~~ `bleared` should probably be written as `bl eared`. Suggest: - Replace with: “bl eared” Lint: Style (31 priority) Message: | 2629 | The exhilarating ripple of her voice was a wild tonic in the rain. I had to 2630 | follow the sound of it for a moment, up and down, with my ear alone, before any | ^~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 2638 | “That’s the secret of Castle Rackrent. Tell your chauffeur to go far away and | ^~~~~~~~ Did you mean to spell `Rackrent` this way? Suggest: - Replace with: “Racket” - Replace with: “Backrest” Lint: Spelling (63 priority) Message: | 2641 | “Come back in an hour, Ferdie.” Then in a grave murmur: “His name is Ferdie.” | ^~~~~~ Did you mean to spell `Ferdie` this way? Suggest: - Replace with: “Faerie” - Replace with: “Fertile” - Replace with: “Fermi” Lint: Spelling (63 priority) Message: | 2641 | “Come back in an hour, Ferdie.” Then in a grave murmur: “His name is Ferdie.” | ^~~~~~ Did you mean to spell `Ferdie` this way? Suggest: - Replace with: “Faerie” - Replace with: “Fertile” - Replace with: “Fermi” Lint: Readability (127 priority) Message: | 2673 | a strained counterfeit of perfect ease, even of boredom. His head leaned back so | ^~~~~~~~~~~~~~~~~~~~~~~~ 2674 | far that it rested against the face of a defunct mantelpiece clock, and from | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2675 | this position his distraught eyes stared down at Daisy, who was sitting, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2676 | frightened but graceful, on the edge of a stiff chair. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Formatting (255 priority) Message: | 2720 | terrible, terrible mistake.” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 2737 | I walked out the back way—just as Gatsby had when he had made his nervous | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2738 | circuit of the house half an hour before—and ran for a huge black knotted tree, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2739 | whose massed leaves made a fabric against the rain. Once more it was pouring, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: WordChoice (63 priority) Message: | 2737 | I walked out the back way—just as Gatsby had when he had made his nervous | ^~~~~~~~ Did you mean the closed compound noun “backway”? Suggest: - Replace with: “backway” Lint: Readability (127 priority) Message: | 2743 | steeple, for half an hour. A brewer had built it early in the “period” craze, a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2744 | decade before, and there was a story that he’d agreed to pay five years’ taxes | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2745 | on all the neighboring cottages if the owners would have their roofs thatched | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | with straw. Perhaps their refusal took the heart out of his plan to Found a | ~~~~~~~~~~~ This sentence is 41 words long. Lint: WordChoice (63 priority) Message: | 2775 | twinkle-bells of sunshine in the room, he smiled like a weather man, like an | ^~~~~~~~~~~ Did you mean the closed compound noun “weatherman”? 2776 | ecstatic patron of recurrent light, and repeated the news to Daisy. “What do you Suggest: - Replace with: “weatherman” Lint: Spelling (127 priority) Message: | 2789 | Daisy went up-stairs to wash her face—too late I thought with humiliation of my | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Formatting (255 priority) Message: | 2806 | was in he answered: ‘‘That’s my affair,” before he realized that it wasn’t an | ^ This quote has no termination. Lint: Style (31 priority) Message: | 2823 | “I keep it always full of interesting people, night and day. People who do | ^~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 2826 | Instead of taking the short cut along the Sound we went down to the road and 2827 | entered by the big postern. With enchanting murmurs Daisy admired this aspect or | ^~~~~~~ Did you mean to spell `postern` this way? Suggest: - Replace with: “pastern” - Replace with: “poster” - Replace with: “posters” Lint: Readability (127 priority) Message: | 2827 | entered by the big postern. With enchanting murmurs Daisy admired this aspect or | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2828 | that of the feudal silhouette against the sky, admired the gardens, the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2829 | sparkling odor of jonquils and the frothy odor of hawthorn and plum blossoms and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2830 | the pale gold odor of kiss-me-at-the-gate. It was strange to reach the marble | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Formatting (255 priority) Message: | 2837 | closed the door of ‘‘the Merton College Library” I could have sworn I heard the | ^ This quote has no termination. 2838 | owl-eyed man break into ghostly laughter. Lint: Readability (127 priority) Message: | 2840 | We went up-stairs, through period bedrooms swathed in rose and lavender silk and | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2841 | vivid with new flowers, through dressing-rooms and poolrooms, and bathrooms with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2842 | sunken baths—intruding into one chamber where a dishevelled man in pajamas was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2843 | doing liver exercises on the floor. It was Mr. Klipspringer, the ‘‘boarder.” I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (127 priority) Message: | 2840 | We went up-stairs, through period bedrooms swathed in rose and lavender silk and | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Spelling (63 priority) Message: | 2842 | sunken baths—intruding into one chamber where a dishevelled man in pajamas was | ^~~~~~~~~~~ Did you mean `disheveled`? 2843 | doing liver exercises on the floor. It was Mr. Klipspringer, the ‘‘boarder.” I Suggest: - Replace with: “disheveled” Lint: Spelling (63 priority) Message: | 2843 | doing liver exercises on the floor. It was Mr. Klipspringer, the ‘‘boarder.” I | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Formatting (255 priority) Message: | 2843 | doing liver exercises on the floor. It was Mr. Klipspringer, the ‘‘boarder.” I | ^ This quote has no termination. 2844 | had seen him wandering hungrily about the beach that morning. Finally we came to Lint: Style (31 priority) Message: | 2844 | had seen him wandering hungrily about the beach that morning. Finally we came to 2845 | Gatsby’s own apartment, a bedroom and a bath, and an Adam’s study, where we sat | ^~~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Style (31 priority) Message: | 2872 | “I’ve got a man in England who buys me clothes. He sends over a selection of 2873 | things at the beginning of each season, spring and fall.” | ^~~~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 2875 | He took out a pile of shirts and began throwing them, one by one, before us, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2876 | shirts of sheer linen and thick silk and fine flannel, which lost their folds as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2877 | they fell and covered the table in many colored disarray. While we admired he | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 2878 | brought more and the soft rich heap mounted higher—shirts with stripes and 2879 | scrolls and plaids in coral and applegreen and lavender and faint orange, with | ^~~~~~~~~~ Did you mean to spell `applegreen` this way? 2880 | monograms of Indian blue. Suddenly, with a strained sound, Daisy bent her head Suggest: - Replace with: “Appleseed” - Replace with: “allergen” - Replace with: “appeared” Lint: Typo (31 priority) Message: | 2878 | brought more and the soft rich heap mounted higher—shirts with stripes and 2879 | scrolls and plaids in coral and applegreen and lavender and faint orange, with | ^~~~~~~~~~ `applegreen` should probably be written as `apple green`. 2880 | monograms of Indian blue. Suddenly, with a strained sound, Daisy bent her head Suggest: - Replace with: “apple green” Lint: Readability (127 priority) Message: | 2887 | After the house, we were to see the grounds and the swimming-pool, and the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | hydroplane and the midsummer flowers—but outside Gatsby’s window it began to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2889 | rain again, so we stood in a row looking at the corrugated surface of the Sound. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Capitalization (31 priority) Message: | 2905 | “Who’s this?” | ^~~~~ The canonical dictionary spelling is `who's`. Suggest: - Replace with: “who's” Lint: Spelling (63 priority) Message: | 2940 | “I know what we'll do,” said Gatsby, “we'll have Klipspringer play the piano.” | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Spelling (63 priority) Message: | 2949 | “I was asleep,” cried Mr. Klipspringer, in a spasm of embarrassment. “That is, | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Formatting (63 priority) Message: | 2950 | I’d been asleep. Then I got up . . .” | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Spelling (63 priority) Message: | 2952 | “Klipspringer plays the piano,” said Gatsby, cutting him off. “Don’t you, Ewing, | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Spelling (63 priority) Message: | 2955 | “I don’t play well. I don’t—I hardly play at all. I’m all out of prac———” | ^~~~ Did you mean to spell `prac` this way? Suggest: - Replace with: “prat” - Replace with: “pray” - Replace with: “pram” Lint: Spelling (63 priority) Message: | 2965 | When Klipspringer had played “The Love Nest” he turned around on the bench and | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Spelling (63 priority) Message: | 2968 | “I’m all out of practice, you see. I told you I couldn’t play. I’m all out of 2969 | prac—” | ^~~~ Did you mean to spell `prac` this way? Suggest: - Replace with: “prat” - Replace with: “pray” - Replace with: “pram” Lint: Capitalization (127 priority) Message: | 3003 | ## CHAPTER VI | ^~~~~~~~~~~~~ Try to use title case in headings. Suggest: - Replace with: “## CHAPTER Vi” Lint: Readability (127 priority) Message: | 3020 | short of being news. Contemporary legends such as the “underground pipe-line to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3021 | Canada” attached themselves to him, and there was one persistent story that he | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3022 | didn’t live in a house at all, but in a boat that looked like a house and was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3023 | moved secretly up and down the Long Island shore. Just why these inventions were | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Spelling (63 priority) Message: | 3023 | moved secretly up and down the Long Island shore. Just why these inventions were 3024 | a source of satisfaction to James Gatz of North Dakota, isn’t easy to say. | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Spelling (63 priority) Message: | 3026 | James Gatz—that was really, or at least legally, his name. He had changed it at | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Readability (127 priority) Message: | 3029 | on Lake Superior. It was James Gatz who had been loafing along the beach that | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3030 | afternoon in a torn green jersey and a pair of canvas pants, but it was already | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3031 | Jay Gatsby who borrowed a rowboat, pulled out to the Tuolomee, and informed Cody | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3032 | that a wind might catch him and break him up in half an hour. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Spelling (63 priority) Message: | 3029 | on Lake Superior. It was James Gatz who had been loafing along the beach that | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Spelling (63 priority) Message: | 3031 | Jay Gatsby who borrowed a rowboat, pulled out to the Tuolomee, and informed Cody | ^~~~~~~~ Did you mean to spell `Tuolomee` this way? 3032 | that a wind might catch him and break him up in half an hour. Suggest: - Replace with: “Toulouse” - Replace with: “Twosome” - Replace with: “Twosomes” Lint: Spelling (63 priority) Message: | 3048 | were ignorant, of the others because they were hysterical about things which in 3049 | his overwhelming self-absorbtion he took for granted. | ^~~~~~~~~~ Did you mean to spell `absorbtion` this way? Suggest: - Replace with: “absorption” - Replace with: “abortion” - Replace with: “adsorption” Lint: WordChoice (63 priority) Message: | 3073 | tried to separate him from his money. The none too savory ramifications by which 3074 | Ella Kaye, the newspaper woman, played Madame de Maintenon to his weakness and | ^~~~~~~~~~~~~~~ Did you mean the closed compound noun “newspaperwoman”? Suggest: - Replace with: “newspaperwoman” Lint: Spelling (63 priority) Message: | 3074 | Ella Kaye, the newspaper woman, played Madame de Maintenon to his weakness and | ^~~~~~~~~ Did you mean to spell `Maintenon` this way? 3075 | sent him to sea in a yacht, were common property of the turgid journalism Suggest: - Replace with: “Maintain” - Replace with: “Maintenance” - Replace with: “Maintop” Lint: Spelling (63 priority) Message: | 3076 | of 1902. He had been coasting along all too hospitable shores for five years 3077 | when he turned up as James Gatz’s destiny in Little Girl Bay. | ^~~~~~ Did you mean to spell `Gatz’s` this way? Suggest: - Replace with: “Gate's” - Replace with: “Garth's” - Replace with: “Goth's” Lint: Spelling (63 priority) Message: | 3079 | To young Gatz, resting on his oars and looking up at the railed deck, that yacht | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Spelling (63 priority) Message: | 3085 | and a yachting cap. And when the Tuolomee left for the West Indies and the | ^~~~~~~~ Did you mean to spell `Tuolomee` this way? 3086 | Barbary Coast Gatsby left too. Suggest: - Replace with: “Toulouse” - Replace with: “Twosome” - Replace with: “Twosomes” Lint: Readability (127 priority) Message: | 3088 | He was employed in a vague personal capacity—while he remained with Cody he was | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3089 | in turn steward, mate, skipper, secretary, and even jailor, for Dan Cody sober | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3090 | knew what lavish doings Dan Cody drunk might soon be about, and he provided for | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3091 | such contingencies by reposing more and more trust in Gatsby. The arrangement | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Spelling (63 priority) Message: | 3089 | in turn steward, mate, skipper, secretary, and even jailor, for Dan Cody sober | ^~~~~~ Did you mean to spell `jailor` this way? 3090 | knew what lavish doings Dan Cody drunk might soon be about, and he provided for Suggest: - Replace with: “jailer” - Replace with: “jail's” - Replace with: “sailor” Lint: Typo (31 priority) Message: | 3089 | in turn steward, mate, skipper, secretary, and even jailor, for Dan Cody sober | ^~~~~~ `jailor` should probably be written as `jail or`. 3090 | knew what lavish doings Dan Cody drunk might soon be about, and he provided for Suggest: - Replace with: “jail or” Lint: Readability (127 priority) Message: | 3096 | I remember the portrait of him up in Gatsby’s bedroom, a gray, florid man with a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3097 | hard, empty face—the pioneer debauchee, who during one phase of American life | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3098 | brought back to the Eastern seaboard the savage violence of the frontier brothel | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3099 | and saloon. It was indirectly due to Cody that Gatsby drank so little. Sometimes | ~~~~~~~~~~~ This sentence is 44 words long. Lint: Spelling (63 priority) Message: | 3106 | left with his singularly appropriate education; the vague contour of Jay Gatsby 3107 | had filled out to the substantiality of a man. | ^~~~~~~~~~~~~~ Did you mean `substantially`? Suggest: - Replace with: “substantially” Lint: Punctuation (31 priority) Message: | 3111 | faintly true. Moreover he told it to me at a time of confusion, when I had | ^~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 3116 | It was a halt, too, in my association with his affairs. For several weeks I | ^~~~~~~~~~~~~~~~~~~~ 3117 | didn’t see him or hear his voice on the phone—mostly I was in New York, trotting | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3118 | around with Jordan and trying to ingratiate myself with her senile aunt—but | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3119 | finally I went over to his house one Sunday afternoon. I hadn’t been there two | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Repetition (31 priority) Message: | 3135 | uneasy anyhow until he had given them something, realizing in a vague way that | ^~~~~ 3136 | that was all they came for. Mr. Sloane wanted nothing. A lemonade? No, thanks. A | ~~~~ Consider whether the second `that` adds meaning in this context. Suggest: - Replace with: “that” Lint: Repetition (127 priority) Message: | 3135 | uneasy anyhow until he had given them something, realizing in a vague way that | ^~~~~ 3136 | that was all they came for. Mr. Sloane wanted nothing. A lemonade? No, thanks. A | ~~~~ Did you mean to repeat this word? Suggest: - Replace with: “that” Lint: Repetition (126 priority) Message: | 3135 | uneasy anyhow until he had given them something, realizing in a vague way that | ^~~~~ 3136 | that was all they came for. Mr. Sloane wanted nothing. A lemonade? No, thanks. A | ~~~~ “that that” sometimes means “that which”, which is clearer. Suggest: - Replace with: “that which” Lint: Enhancement (31 priority) Message: | 3141 | “Very good roads around here.” | ^~~~~~~~~ Vocabulary enhancement: use `excellent` instead of `very good` Suggest: - Replace with: “Excellent” Lint: Spelling (63 priority) Message: | 3180 | “Be ver’ nice,” said Mr. Sloane, without gratitude. “Well—think ought to be | ^~~ Did you mean to spell `ver` this way? Suggest: - Replace with: “var” - Replace with: “veer” - Replace with: “verb” Lint: Readability (127 priority) Message: | 3235 | in my memory from Gatsby’s other parties that summer. There were the same | ^~~~~~~~~~~~~~~~~~~~ 3236 | people, or at least the same sort of people, the same profusion of champagne, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3237 | the same many-colored, many-keyed commotion, but I felt an unpleasantness in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3238 | air, a pervading harshness that hadn’t been there before. Or perhaps I had | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 3238 | air, a pervading harshness that hadn’t been there before. Or perhaps I had | ^~~~~~~~~~~~~~~~~ 3239 | merely grown used to it, grown to accept West Egg as a world complete in itself, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3240 | with its own standards and its own great figures, second to nothing because it | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3241 | had no consciousness of being so, and now I was looking at it again, through | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3242 | Daisy’s eyes. It is invariably saddening to look through new eyes at things upon | ~~~~~~~~~~~~~ This sentence is 51 words long. Lint: Spelling (63 priority) Message: | 3254 | “I’m looking around. I’m having a marvellous—” | ^~~~~~~~~~ Did you mean `marvelous`? Suggest: - Replace with: “marvelous” Lint: Formatting (63 priority) Message: | 3274 | “Mrs. Buchanan . . . and Mr. Buchanan—” After an instant’s hesitation he added: | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Capitalization (31 priority) Message: | 3274 | “Mrs. Buchanan . . . and Mr. Buchanan—” After an instant’s hesitation he added: | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “And” Lint: Formatting (255 priority) Message: | 3296 | explained, ‘‘or any act of God.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 3316 | “Wha’?” | ^~~ Did you mean to spell `Wha` this way? Suggest: - Replace with: “Wham” - Replace with: “What” - Replace with: “Who” Lint: Spelling (63 priority) Message: | 3319 | at the local club to-morrow, spoke in Miss Baedeker’s defence: | ^~~~~~~ Did you mean to spell `defence` this way? Suggest: - Replace with: “defense” - Replace with: “decency” - Replace with: “defect” Lint: WordChoice (63 priority) Message: | 3337 | “Speak for yourself!” cried Miss Baedeker violently. “Your hand shakes. I | ^~~~~~~~~~~ Did you mean the closed compound noun “handshakes”? Suggest: - Replace with: “handshakes” Lint: Spelling (63 priority) Message: | 3349 | But the rest offended her—and inarguably, because it wasn’t a gesture but an | ^~~~~~~~~~ Did you mean to spell `inarguably` this way? Suggest: - Replace with: “inarguable” - Replace with: “unarguably” - Replace with: “arguably” Lint: Typo (31 priority) Message: | 3349 | But the rest offended her—and inarguably, because it wasn’t a gesture but an | ^~~~~~~~~~ `inarguably` should probably be written as `in arguably`. Suggest: - Replace with: “in arguably” Lint: Readability (127 priority) Message: | 3350 | emotion. She was appalled by West Egg, this unprecedented “place” that Broadway | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3351 | had begotten upon a Long Island fishing village—appalled by its raw vigor that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3352 | chafed under the old euphemisms and by the too obtrusive fate that herded its | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3353 | inhabitants along a short-cut from nothing to nothing. She saw something awful | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 48 words long. Lint: WordChoice (127 priority) Message: | 3353 | inhabitants along a short-cut from nothing to nothing. She saw something awful | ^~ Use `too` here to mean ‘also’ or an excessive degree. Suggest: - Replace with: “too” Lint: Spelling (63 priority) Message: | 3389 | Daisy began to sing with the music in a husky, rythmic whisper, bringing out a | ^~~~~~~ Did you mean to spell `rythmic` this way? 3390 | meaning in each word that it had never had before and would never have again. Suggest: - Replace with: “rhythmic” - Replace with: “mythic” Lint: Capitalization (31 priority) Message: | 3409 | Her glance left me and sought the lighted top of the steps, where “Three o’Clock | ^~~~~~~ The canonical dictionary spelling is `o'clock`. 3410 | in the Morning,” a neat, sad little waltz of that year, was drifting out the Suggest: - Replace with: “o'clock” Lint: Readability (127 priority) Message: | 3414 | dim, incalculable hours? Perhaps some unbelievable guest would arrive, a person | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3415 | infinitely rare and to be marvelled at, some authentically radiant young girl | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3416 | who with one fresh glance at Gatsby, one moment of magical encounter, would blot | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3417 | out those five years of unwavering devotion. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (63 priority) Message: | 3414 | dim, incalculable hours? Perhaps some unbelievable guest would arrive, a person 3415 | infinitely rare and to be marvelled at, some authentically radiant young girl | ^~~~~~~~~ Did you mean `marveled`? Suggest: - Replace with: “marveled” Lint: Readability (127 priority) Message: | 3419 | I stayed late that night, Gatsby asked me to wait until he was free, and I | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3420 | lingered in the garden until the inevitable swimming party had run up, chilled | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3421 | and exalted, from the black beach, until the lights were extinguished in the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3422 | guest-rooms overhead. When he came down the steps at last the tanned skin was | ~~~~~~~~~~~~~~~~~~~~~ This sentence is 45 words long. Lint: Readability (127 priority) Message: | 3474 | Out of the corner of his eye Gatsby saw that the blocks of the sidewalks really | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3475 | formed a ladder and mounted to a secret place above the trees—he could climb to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3476 | it, if he climbed alone, and once there he could suck on the pap of life, gulp | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3477 | down the incomparable milk of wonder. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 55 words long. Lint: WordChoice (63 priority) Message: | 3479 | His heart beat faster and faster as Daisy’s white face came up to his own. He | ^~~~~~~~~~ Did you mean the closed compound noun “heartbeat”? Suggest: - Replace with: “heartbeat” Lint: Spelling (63 priority) Message: | 3490 | them than a wisp of startled air. But they made no sound, and what I had almost 3491 | remembered was uncommunicable forever. | ^~~~~~~~~~~~~~ Did you mean to spell `uncommunicable` this way? Suggest: - Replace with: “incommunicable” - Replace with: “communicable” - Replace with: “noncommunicable” Lint: Spelling (63 priority) Message: | 3496 | house failed to go on one Saturday night—and, as obscurely as it had begun, his 3497 | career as Trimalchio was over. Only gradually did I become aware that the | ^~~~~~~~~~ Did you mean to spell `Trimalchio` this way? Lint: Formatting (255 priority) Message: | 3505 | “Nope.” After a pause he added “sir’’ in a dilatory, grudging way. | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 3507 | “I hadn’t seen him around, and I was rather worried. Tell him Mr. Carraway came | ^~~~~~~~ Did you mean to spell `Carraway` this way? 3508 | over.” Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 3512 | “Carraway.” | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 3514 | “Carraway. All right, I'll tell him.” | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Readability (127 priority) Message: | 3518 | My Finn informed me that Gatsby had dismissed every servant in his house a week | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3519 | ago and replaced them with half a dozen others, who never went into West Egg | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3520 | Village to be bribed by the tradesmen, but ordered moderate supplies over the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3521 | telephone. The grocery boy reported that the kitchen looked like a pigsty, and | ~~~~~~~~~~ This sentence is 44 words long. Lint: Spelling (63 priority) Message: | 3539 | “They’re some people Wolfshiem wanted to do something for. They’re all brothers | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Readability (127 priority) Message: | 3553 | of the National Biscuit Company broke the simmering hush at noon. The straw | ^~~~~~~~~~ 3554 | seats of the car hovered on the edge of combustion; the woman next to me | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3555 | perspired delicately for a while into her white shirtwaist, and then, as her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3556 | newspaper dampened under her fingers, lapsed despairingly into deep heat with a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3557 | desolate cry. Her pocket-book slapped to the floor. | ~~~~~~~~~~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 3561 | I picked it up with a weary bend and handed it back to her, holding it at arm’s | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3562 | length and by the extreme tip of the corners to indicate that I had no designs | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3563 | upon it—but every one near by, including the woman, suspected me just the same. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Miscellaneous (31 priority) Message: | 3562 | length and by the extreme tip of the corners to indicate that I had no designs 3563 | upon it—but every one near by, including the woman, suspected me just the same. | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “everyone” Lint: Formatting (63 priority) Message: | 3566 | Hot! . . . Hot! . . . Is it hot enough for you? Is it hot? Is it . . .?” | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Spelling (63 priority) Message: | 3572 | . . . Through the hall of the Buchanans’ house blew a faint wind, carrying the | ^~~~~~~~~ Did you mean to spell `Buchanans` this way? Suggest: - Replace with: “Buchanan's” - Replace with: “Buchanan” Lint: Formatting (63 priority) Message: | 3578 | What he really said was: “Yes . . . Yes . . . I’ll see.” | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Formatting (63 priority) Message: | 3578 | What he really said was: “Yes . . . Yes . . . I’ll see.” | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Spelling (63 priority) Message: | 3599 | Gatsby stood in the centre of the crimson carpet and gazed around with | ^~~~~~ Did you mean to spell `centre` this way? Suggest: - Replace with: “center” - Replace with: “cent's” - Replace with: “censure” Lint: Formatting (63 priority) Message: | 3606 | then, I won’t sell you the car at all. . . . I’m under no obligations to you at 3607 | all . . . and as for your bothering me about it at lunch time, I won’t stand | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Capitalization (31 priority) Message: | 3607 | all . . . and as for your bothering me about it at lunch time, I won’t stand | ^~~ This sentence does not start with a capital letter Suggest: - Replace with: “And” Lint: Spelling (63 priority) Message: | 3612 | “No, he’s not,” I assured her. “It’s a bona-fide deal. I happen to know about | ^~~~ Did you mean to spell `bona` this way? Suggest: - Replace with: “boa” - Replace with: “bond” - Replace with: “bone” Lint: Spelling (63 priority) Message: | 3612 | “No, he’s not,” I assured her. “It’s a bona-fide deal. I happen to know about | ^~~~ Did you mean to spell `fide` this way? Suggest: - Replace with: “fade” - Replace with: “fife” - Replace with: “file” Lint: Spelling (63 priority) Message: | 3640 | “Bles-sed pre-cious,” she crooned, holding out her arms. “Come to your own | ^~~~ Did you mean to spell `Bles` this way? Suggest: - Replace with: “Bless” - Replace with: “Bales” - Replace with: “Bees” Lint: Spelling (63 priority) Message: | 3640 | “Bles-sed pre-cious,” she crooned, holding out her arms. “Come to your own | ^~~~~ Did you mean to spell `cious` this way? Suggest: - Replace with: “coo's” - Replace with: “pious” - Replace with: “chorus” Lint: Spelling (63 priority) Message: | 3646 | “The bles-sed pre-cious! Did mother get powder on your old yellowy hair? Stand | ^~~~ Did you mean to spell `bles` this way? Suggest: - Replace with: “bless” - Replace with: “bales” - Replace with: “bees” Lint: Typo (31 priority) Message: | 3646 | “The bles-sed pre-cious! Did mother get powder on your old yellowy hair? Stand | ^~~~ `bles` should probably be written as `bl es`. Suggest: - Replace with: “bl es” Lint: Spelling (63 priority) Message: | 3646 | “The bles-sed pre-cious! Did mother get powder on your old yellowy hair? Stand | ^~~~~ Did you mean to spell `cious` this way? Suggest: - Replace with: “coo's” - Replace with: “pious” - Replace with: “chorus” Lint: Spelling (63 priority) Message: | 3672 | “Come, Pammy.” | ^~~~~ Did you mean to spell `Pammy` this way? Suggest: - Replace with: “Palmy” - Replace with: “Pommy” - Replace with: “Pam's” Lint: Spelling (63 priority) Message: | 3677 | hand and was pulled out the door, just as Tom came back, preceding four gin 3678 | rickeys that clicked full of ice. | ^~~~~~~ Did you mean to spell `rickeys` this way? Suggest: - Replace with: “rickets” - Replace with: “Rickey's” - Replace with: “rice's” Lint: Formatting (255 priority) Message: | 3687 | “It seems that pretty soon the earth’s going to fall into the sun—or wait a | ^ This quote has no termination. Lint: Regionalism (63 priority) Message: | 3690 | “Come outside,” he suggested to Gatsby, “I’d like you to have a look at the | ^~~~ American English prefers `take a look` over `have a look`. 3691 | place.” Suggest: - Replace with: “take” Lint: Spelling (63 priority) Message: | 3709 | We had luncheon in the dining-room, darkened too against the heat, and drank 3710 | down nervous gayety with the cold ale. | ^~~~~~ Did you mean to spell `gayety` this way? Suggest: - Replace with: “gaiety” - Replace with: “gamely” - Replace with: “gamete” Lint: Miscellaneous (31 priority) Message: | 3736 | mouth opened a little, and he looked at Gatsby, and then back at Daisy as if he 3737 | had just recognized her as some one he knew a long time ago. | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “someone” Lint: Formatting (255 priority) Message: | 3739 | “You resemble the advertisement of the man,” she went on innocently. ‘You know 3740 | the advertisement of the man—” | ^ This quote has no termination. Lint: Spelling (127 priority) Message: | 3765 | They went up-stairs to get ready while we three men stood there shuffling the | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Spelling (63 priority) Message: | 3809 | “Well, you take my coupé and let me drive your car to town.” | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 3828 | “You take Nick and Jordan. We’ll follow you in the coupé.” | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Miscellaneous (31 priority) Message: | 3841 | “You think I’m pretty dumb, don’t you?” he suggested. “Perhaps I am, but I have 3842 | a—almost a second sight, sometimes, that tells me what to do. Maybe you don’t | ^ Incorrect indefinite article. Suggest: - Replace with: “an” Lint: Punctuation (31 priority) Message: | 3864 | “Nevertheless he’s an Oxford man.” | ^~~~~~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 3874 | while in silence. Then as Doctor T. J. Eckleburg’s faded eyes came into sight | ^~ Did you mean to spell `T.` this way? Suggest: - Replace with: “Ta” - Replace with: “Ti” - Replace with: “To” Lint: Spelling (63 priority) Message: | 3874 | while in silence. Then as Doctor T. J. Eckleburg’s faded eyes came into sight | ^~ Did you mean to spell `J.` this way? Suggest: - Replace with: “Jo” - Replace with: “J” - Replace with: “Jg” Lint: Spelling (63 priority) Message: | 3874 | while in silence. Then as Doctor T. J. Eckleburg’s faded eyes came into sight | ^~~~~~~~~~~ Did you mean to spell `Eckleburg’s` this way? 3875 | down the road, I remembered Gatsby’s caution about gasoline. Suggest: - Replace with: “Excalibur's” - Replace with: “Vicksburg's” - Replace with: “Heckler's” Lint: Spelling (63 priority) Message: | 3923 | The coupé flashed by us with a flurry of dust and the flash of a waving hand. | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Readability (127 priority) Message: | 3937 | world, and the shock had made him physically sick. I stared at him and then at | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3938 | Tom, who had made a parallel discovery less than an hour before—and it occurred | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3939 | to me that there was no difference between men, in intelligence or race, so | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3940 | profound as the difference between the sick and the well. Wilson was so sick | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 46 words long. Lint: Spelling (63 priority) Message: | 3948 | behind. Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their | ^~~~~~~~ Did you mean to spell `ashheaps` this way? Suggest: - Replace with: “asthma's” - Replace with: “airheads” - Replace with: “ashcans” Lint: Typo (31 priority) Message: | 3948 | behind. Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their | ^~~~~~~~ `ashheaps` should probably be written as `ash heaps`. Suggest: - Replace with: “ash heaps” Lint: Spelling (63 priority) Message: | 3948 | behind. Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their | ^~ Did you mean to spell `T.` this way? Suggest: - Replace with: “Ta” - Replace with: “Ti” - Replace with: “To” Lint: Spelling (63 priority) Message: | 3948 | behind. Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their | ^~ Did you mean to spell `J.` this way? Suggest: - Replace with: “Jo” - Replace with: “J” - Replace with: “Jg” Lint: Spelling (63 priority) Message: | 3948 | behind. Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their | ^~~~~~~~~ Did you mean to spell `Eckleburg` this way? 3949 | vigil, but I perceived, after a moment, that other eyes were regarding us with Suggest: - Replace with: “Excalibur” - Replace with: “Vicksburg” - Replace with: “Heckler” Lint: Readability (127 priority) Message: | 3955 | into her face like objects into a slowly developing picture. Her expression was | ^~~~~~~~~~~~~~~~~~~ 3956 | curiously familiar—it was an expression I had often seen on women’s faces, but | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3957 | on Myrtle Wilson’s face it seemed purposeless and inexplicable until I realized | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3958 | that her eyes, wide with jealous terror, were fixed not on Tom, but on Jordan | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3959 | Baker, whom she took to be his wife. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Readability (127 priority) Message: | 3963 | ago secure and inviolate, were slipping precipitately from his control. Instinct | ^~~~~~~~~ 3964 | made him step on the accelerator with the double purpose of overtaking Daisy and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3965 | leaving Wilson behind, and we sped along toward Astoria at fifty miles an hour, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3966 | until, among the spidery girders of the elevated, we came in sight of the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3967 | easy-going blue coupé. | ~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Spelling (63 priority) Message: | 3966 | until, among the spidery girders of the elevated, we came in sight of the 3967 | easy-going blue coupé. | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 3974 | The word “sensuous” had the effect of further disquieting Tom, but before he 3975 | could invent a protest the coupé came to a stop, and Daisy signalled us to draw | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 3975 | could invent a protest the coupé came to a stop, and Daisy signalled us to draw | ^~~~~~~~~ Did you mean to spell `signalled` this way? 3976 | up alongside. Suggest: - Replace with: “signaled” - Replace with: “signaler” - Replace with: “signalized” Lint: Readability (127 priority) Message: | 3997 | The prolonged and tumultuous argument that ended by herding us into that room | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3998 | eludes me, though I have a sharp physical memory that, in the course of it, my | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3999 | underwear kept climbing like a damp snake around my legs and intermittent beads | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4000 | of sweat raced cool across my back. The notion originated with Daisy’s | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 49 words long. Lint: Formatting (63 priority) Message: | 4004 | thought, or pretended to think, that we were being very funny . . . | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Miscellaneous (31 priority) Message: | 4010 | “It’s a swell suite,” whispered Jordan respectfully, and every one laughed. | ^~~~~~~~~ Did you mean the closed compound `everyone`? Suggest: - Replace with: “everyone” Lint: Spelling (63 priority) Message: | 4016 | “Well, we’d better telephone for an axe———” | ^~~ Did you mean to spell `axe` this way? Suggest: - Replace with: “ace” - Replace with: “age” - Replace with: “ale” Lint: Spelling (63 priority) Message: | 4054 | “Biloxi,” he answered shortly. | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Spelling (63 priority) Message: | 4056 | “A man named Biloxi. ‘Blocks’ Biloxi, and he made boxes—that’s a fact—and he was | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Spelling (63 priority) Message: | 4056 | “A man named Biloxi. ‘Blocks’ Biloxi, and he made boxes—that’s a fact—and he was | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Spelling (63 priority) Message: | 4056 | “A man named Biloxi. ‘Blocks’ Biloxi, and he made boxes—that’s a fact—and he was 4057 | from Biloxi, Tennessee.” | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Formatting (255 priority) Message: | 4062 | wasn’t any connection.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 4064 | “I used to know a Bill Biloxi from Memphis,” I remarked. | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Spelling (31 priority) Message: | 4070 | the window, followed by intermittent cries of “Yea—ea—ea!” and finally by a | ^~~ If you mean the informal word for `yes` and not the biblical or legalistic `yea`, the standard spelling is `yeah`. Suggest: - Replace with: “Yeah” Lint: Spelling (63 priority) Message: | 4073 | “We're getting old,” said Daisy. “lf we were young we’d rise and dance.” | ^~ Did you mean to spell `lf` this way? Suggest: - Replace with: “la” - Replace with: “lo” - Replace with: “elf” Lint: Spelling (63 priority) Message: | 4075 | “Remember Biloxi,” Jordan warned her. ‘‘Where’d you know him, Tom?” | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Formatting (255 priority) Message: | 4075 | “Remember Biloxi,” Jordan warned her. ‘‘Where’d you know him, Tom?” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 4077 | “Biloxi?” He concentrated with an effort. “I didn’t know him. He was a friend of | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Spelling (63 priority) Message: | 4083 | “Well, he said he knew you. He said he was raised in Louisville. Asa Bird | ^~~ Did you mean to spell `Asa` this way? 4084 | brought him around at the last minute and asked if we had room for him.” Suggest: - Replace with: “Aha” - Replace with: “Aka” - Replace with: “As” Lint: Spelling (63 priority) Message: | 4093 | “Biloxi?” | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Spelling (63 priority) Message: | 4109 | “You must have gone there about the time Biloxi went to New Haven.” | ^~~~~~ Did you mean to spell `Biloxi` this way? Suggest: - Replace with: “Biko's” - Replace with: “Bilbo's” - Replace with: “Biro's” Lint: Formatting (255 priority) Message: | 4134 | won’t seem so stupid to yourself. . . . Look at the mint!” | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 4175 | me.” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 4185 | At this point Jordan and I tried to go, but Tom and Gatsby insisted with | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4186 | competitive firmness that we remain—as though neither of them had anything to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4187 | conceal and it would be a privilege to partake vicariously of their emotions. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Formatting (255 priority) Message: | 4201 | sometimes”—but there was no laughter in his eyes—“to think that you didn’t | ^ This quote has no termination. 4202 | know.” Lint: Formatting (255 priority) Message: | 4202 | know.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 4241 | “Not at Kapiolani?” demanded Tom suddenly. | ^~~~~~~~~ Did you mean to spell `Kapiolani` this way? Suggest: - Replace with: “Kaitlin” - Replace with: “Kaposi” - Replace with: “Kaolin” Lint: Spelling (63 priority) Message: | 4265 | Why—there’re things between Daisy and me that you’ll never know, things that | ^~~~~~~~ Did you mean to spell `there’re` this way? Suggest: - Replace with: “there's” - Replace with: “there'd” - Replace with: “there'll” Lint: Spelling (63 priority) Message: | 4300 | “Who are you, anyhow?” broke out Tom. “You’re one of that bunch that hangs 4301 | around with Meyer Wolfshiem—that much I happen to know. I’ve made a little | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 4307 | “He and this Wolfshiem bought up a lot of side-street drug-stores here and in | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 4321 | have you up on the betting laws too, but Wolfshiem scared him into shutting his | ^~~~~~~~~ Did you mean `Bolshie`? 4322 | mouth.” Suggest: - Replace with: “Bolshie” Lint: Readability (127 priority) Message: | 4337 | defending his name against accusations that had not been made. But with every | ^~~~~~~~~~~~~~~ 4338 | word she was drawing further and further into herself, so he gave that up, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4339 | only the dead dream fought on as the afternoon slipped away, trying to touch | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4340 | what was no longer tangible, struggling unhappily, undespairingly, toward that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4341 | lost voice across the room. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: Spelling (63 priority) Message: | 4340 | what was no longer tangible, struggling unhappily, undespairingly, toward that | ^~~~~~~~~~~~~~ Did you mean `despairingly`? 4341 | lost voice across the room. Suggest: - Replace with: “despairingly” Lint: Repetition (127 priority) Message: | 4347 | Her frightened eyes told that whatever intentions, whatever courage she had had, | ^~~~~~~ Did you mean to repeat this word? 4348 | were definitely gone. Suggest: - Replace with: “had” Lint: WordChoice (127 priority) Message: | 4350 | “You two start on home, Daisy,” said Tom. “In Mr. Gatsby’s car.” | ^~~ The possessive version of this word is more common in this context. Suggest: - Replace with: “Your” - Replace with: “You're a” - Replace with: “You're an” Lint: Formatting (63 priority) Message: | 4373 | “No . . . I just remembered that to-day’s my birthday.” | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Spelling (63 priority) Message: | 4377 | It was seven o’clock when we got into the coupé with him and started for Long | ^~~~~ Did you mean to spell `coupé` this way? 4378 | Island. Tom talked incessantly, exulting and laughing, but his voice was as Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 4391 | The young Greek, Michaelis, who ran the coffee joint beside the ashheaps was the | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 4391 | The young Greek, Michaelis, who ran the coffee joint beside the ashheaps was the | ^~~~~~~~ Did you mean to spell `ashheaps` this way? 4392 | principal witness at the inquest. He had slept through the heat until after Suggest: - Replace with: “asthma's” - Replace with: “airheads” - Replace with: “ashcans” Lint: Typo (31 priority) Message: | 4391 | The young Greek, Michaelis, who ran the coffee joint beside the ashheaps was the | ^~~~~~~~ `ashheaps` should probably be written as `ash heaps`. 4392 | principal witness at the inquest. He had slept through the heat until after Suggest: - Replace with: “ash heaps” Lint: Spelling (63 priority) Message: | 4394 | office—really sick, pale as his own pale hair and shaking all over. Michaelis | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? 4395 | advised him to go to bed, but Wilson refused, saying that he’d miss a lot of Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 4402 | Michaelis was astonished; they had been neighbors for four years, and Wilson had | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 4409 | So naturally Michaelis tried to find out what had happened, but Wilson wouldn’t | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 4412 | latter was getting uneasy, some workmen came past the door bound for his 4413 | restaurant, and Michaelis took the opportunity to get away, intending to come | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Style (31 priority) Message: | 4416 | he heard Mrs. Wilson’s voice, loud and scolding, down-stairs in the garage. | ^~~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 4426 | the next bend. Mavromichaelis wasn’t even sure of its color—he told the first | ^~~~~~~~~~~~~~ Did you mean `Carmichael's`? Suggest: - Replace with: “Carmichael's” Lint: Readability (127 priority) Message: | 4427 | policeman that it was light green. The other car, the one going toward New York, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4428 | came to rest a hundred yards beyond, and it’s driver hurried back to where | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4429 | Myrtle Wilson, her life violently extinguished, knelt in the road and mingled | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4430 | her thick dark blood with the dust. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Agreement (31 priority) Message: | 4427 | policeman that it was light green. The other car, the one going toward New York, | ^~~~~~~~~ `going` is a mass noun. 4428 | came to rest a hundred yards beyond, and it’s driver hurried back to where Suggest: - Replace with: “one piece of going” Lint: Spelling (63 priority) Message: | 4432 | Michaelis and this man reached her first, but when they had torn open her | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Readability (127 priority) Message: | 4432 | Michaelis and this man reached her first, but when they had torn open her | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4433 | shirtwaist, still damp with perspiration, they saw that her left breast was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4434 | swinging loose like a flap, and there was no need to listen for the heart | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4435 | beneath. The mouth was wide open and ripped a little at the corners, as though | ~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 4442 | “Wreck!” said Tom. “That’s good. Wilson’ll have a little business at last.” | ^~~~~~~~~ Did you mean `Wilson's`? Suggest: - Replace with: “Wilson's” Lint: Spelling (63 priority) Message: | 4451 | garage, a sound which as we got out of the coupé and walked toward the door | ^~~~~ Did you mean to spell `coupé` this way? 4452 | resolved itself into the words “Oh, my God!” uttered over and over in a gasping Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Readability (127 priority) Message: | 4466 | Myrtle Wilson’s body, wrapped in a blanket, and then in another blanket, as | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4467 | though she suffered from a chill in the hot night, lay on a work-table by the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4468 | wall, and Tom, with his back to us, was bending over it, motionless. Next to him | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Readability (127 priority) Message: | 4470 | a little book. At first I couldn’t find the source of the high, groaning words | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4471 | that echoed clamorously through the bare garage—then I saw Wilson standing on | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4472 | the raised threshold of his office, swaying back and forth and holding to the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4473 | doorposts with both hands. Some man was talking to him in a low voice and | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 4470 | a little book. At first I couldn’t find the source of the high, groaning words 4471 | that echoed clamorously through the bare garage—then I saw Wilson standing on | ^~~~~~~~~~~ Did you mean to spell `clamorously` this way? Suggest: - Replace with: “glamorously” - Replace with: “clamorous” - Replace with: “clangorously” Lint: Typo (31 priority) Message: | 4470 | a little book. At first I couldn’t find the source of the high, groaning words 4471 | that echoed clamorously through the bare garage—then I saw Wilson standing on | ^~~~~~~~~~~ `clamorously` should probably be written as `cl amorously`. Suggest: - Replace with: “cl amorously” Lint: Spelling (63 priority) Message: | 4479 | “Oh, my Ga-od! Oh, my Ga-od! Oh, Ga-od! Oh, my Ga-od!” | ^~ Did you mean to spell `od` this way? Suggest: - Replace with: “odd” - Replace with: “ode” - Replace with: “of” Lint: Spelling (63 priority) Message: | 4479 | “Oh, my Ga-od! Oh, my Ga-od! Oh, Ga-od! Oh, my Ga-od!” | ^~ Did you mean to spell `od` this way? Suggest: - Replace with: “odd” - Replace with: “ode” - Replace with: “of” Lint: Spelling (63 priority) Message: | 4479 | “Oh, my Ga-od! Oh, my Ga-od! Oh, Ga-od! Oh, my Ga-od!” | ^~ Did you mean to spell `od` this way? Suggest: - Replace with: “odd” - Replace with: “ode” - Replace with: “of” Lint: Spelling (63 priority) Message: | 4479 | “Oh, my Ga-od! Oh, my Ga-od! Oh, Ga-od! Oh, my Ga-od!” | ^~ Did you mean to spell `od` this way? Suggest: - Replace with: “odd” - Replace with: “ode” - Replace with: “of” Lint: Capitalization (127 priority) Message: | 4484 | “M-a-v—” the policeman was saying, “—o———” | ^ This word's canonical spelling is all-caps. Suggest: - Replace with: “O” Lint: Spelling (63 priority) Message: | 4484 | “M-a-v—” the policeman was saying, “—o———” | ^ Did you mean to spell `o` this way? Suggest: - Replace with: “of” - Replace with: “oh” - Replace with: “oi” Lint: Capitalization (127 priority) Message: | 4486 | “No, r—” corrected the man, “M-a-v-r-o———” | ^ This word's canonical spelling is all-caps. Suggest: - Replace with: “R” Lint: Spelling (63 priority) Message: | 4486 | “No, r—” corrected the man, “M-a-v-r-o———” | ^ Did you mean to spell `r` this way? Suggest: - Replace with: “re” - Replace with: “a” - Replace with: “e” Lint: Spelling (63 priority) Message: | 4486 | “No, r—” corrected the man, “M-a-v-r-o———” | ^ Did you mean to spell `r` this way? Suggest: - Replace with: “re” - Replace with: “a” - Replace with: “e” Lint: Spelling (63 priority) Message: | 4486 | “No, r—” corrected the man, “M-a-v-r-o———” | ^ Did you mean to spell `o` this way? Suggest: - Replace with: “of” - Replace with: “oh” - Replace with: “oi” Lint: Capitalization (127 priority) Message: | 4490 | “r—” said the policeman, “o———” | ^ This word's canonical spelling is all-caps. Suggest: - Replace with: “R” Lint: Spelling (63 priority) Message: | 4490 | “r—” said the policeman, “o———” | ^ Did you mean to spell `r` this way? Suggest: - Replace with: “re” - Replace with: “a” - Replace with: “e” Lint: Capitalization (127 priority) Message: | 4490 | “r—” said the policeman, “o———” | ^ This word's canonical spelling is all-caps. Suggest: - Replace with: “O” Lint: Spelling (63 priority) Message: | 4490 | “r—” said the policeman, “o———” | ^ Did you mean to spell `o` this way? Suggest: - Replace with: “of” - Replace with: “oh” - Replace with: “oi” Lint: Spelling (63 priority) Message: | 4499 | “Auto hit her. Ins’antly killed.” | ^~~~~~~~~ Did you mean to spell `Ins’antly` this way? Suggest: - Replace with: “Instantly” - Replace with: “Insanely” Lint: Capitalization (127 priority) Message: | 4503 | “She ran out ina road. Son-of-a-bitch didn’t even stopus car.” | ^~~ The canonical dictionary spelling is title case: `Ina`. Suggest: - Replace with: “Ina” Lint: Spelling (63 priority) Message: | 4503 | “She ran out ina road. Son-of-a-bitch didn’t even stopus car.” | ^~~ Did you mean to spell `ina` this way? Suggest: - Replace with: “in” - Replace with: “ind” - Replace with: “inf” Lint: Spelling (63 priority) Message: | 4503 | “She ran out ina road. Son-of-a-bitch didn’t even stopus car.” | ^~~~~~ Did you mean to spell `stopus` this way? Suggest: - Replace with: “stop's” - Replace with: “stops” - Replace with: “stoups” Lint: Typo (31 priority) Message: | 4503 | “She ran out ina road. Son-of-a-bitch didn’t even stopus car.” | ^~~~~~ `stopus` has a missing space between words. Suggest: - Replace with: “st opus” - Replace with: “stop us” Lint: Spelling (63 priority) Message: | 4505 | “There was two cars,” said Michaelis, “one comin’, one goin’, see?” | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 4505 | “There was two cars,” said Michaelis, “one comin’, one goin’, see?” | ^~~~~ Did you mean to spell `comin` this way? Suggest: - Replace with: “coin” - Replace with: “comic” - Replace with: “coming” Lint: Typo (31 priority) Message: | 4505 | “There was two cars,” said Michaelis, “one comin’, one goin’, see?” | ^~~~~ `comin` has a missing space between words. Suggest: - Replace with: “co min” - Replace with: “com in” Lint: Spelling (63 priority) Message: | 4505 | “There was two cars,” said Michaelis, “one comin’, one goin’, see?” | ^~~~ Did you mean to spell `goin` this way? Suggest: - Replace with: “gain” - Replace with: “gin” - Replace with: “goon” Lint: Typo (31 priority) Message: | 4505 | “There was two cars,” said Michaelis, “one comin’, one goin’, see?” | ^~~~ `goin` should probably be written as `go in`. Suggest: - Replace with: “go in” Lint: Spelling (63 priority) Message: | 4509 | “One goin’ each way. Well, she”—his hand rose toward the blankets but stopped | ^~~~ Did you mean to spell `goin` this way? Suggest: - Replace with: “gain” - Replace with: “gin” - Replace with: “goon” Lint: Typo (31 priority) Message: | 4509 | “One goin’ each way. Well, she”—his hand rose toward the blankets but stopped | ^~~~ `goin` should probably be written as `go in`. Suggest: - Replace with: “go in” Lint: Formatting (255 priority) Message: | 4509 | “One goin’ each way. Well, she”—his hand rose toward the blankets but stopped 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York | ^ This quote has no termination. Lint: Miscellaneous (31 priority) Message: | 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York | ^~ Incorrect indefinite article. 4511 | knock right into her, goin’ thirty or forty miles an hour.” Suggest: - Replace with: “a” Lint: Spelling (63 priority) Message: | 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York | ^~~~~ Did you mean to spell `comin` this way? 4511 | knock right into her, goin’ thirty or forty miles an hour.” Suggest: - Replace with: “coin” - Replace with: “comic” - Replace with: “coming” Lint: Typo (31 priority) Message: | 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York | ^~~~~ `comin` has a missing space between words. 4511 | knock right into her, goin’ thirty or forty miles an hour.” Suggest: - Replace with: “co min” - Replace with: “com in” Lint: Spelling (63 priority) Message: | 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York | ^~~~~~ Did you mean `York`? 4511 | knock right into her, goin’ thirty or forty miles an hour.” Suggest: - Replace with: “York” Lint: Spelling (63 priority) Message: | 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York 4511 | knock right into her, goin’ thirty or forty miles an hour.” | ^~~~ Did you mean to spell `goin` this way? Suggest: - Replace with: “gain” - Replace with: “gin” - Replace with: “goon” Lint: Typo (31 priority) Message: | 4510 | half way and fell to his side—“she ran out there an’ the one comin’ from N’York 4511 | knock right into her, goin’ thirty or forty miles an hour.” | ^~~~ `goin` should probably be written as `go in`. Suggest: - Replace with: “go in” Lint: Formatting (255 priority) Message: | 4511 | knock right into her, goin’ thirty or forty miles an hour.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 4523 | “No, but the car passed me down the road, going faster’n forty. Going fifty, | ^~~~~~~~ Did you mean to spell `faster’n` this way? Suggest: - Replace with: “falter's” - Replace with: “feaster's” - Replace with: “fester's” Lint: Spelling (63 priority) Message: | 4544 | New York. I was bringing you that coupé we’ve been talking about. That yellow | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 4560 | “It’s a blue car, a coupé.” | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Miscellaneous (31 priority) Message: | 4564 | Some one who had been driving a little behind us confirmed this, and the | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “Someone” Lint: Spelling (63 priority) Message: | 4572 | “If somebody’ll come here and sit with him,” he snapped authoritatively. He | ^~~~~~~~~~~ Did you mean `somebody's`? Suggest: - Replace with: “somebody's” Lint: Spelling (63 priority) Message: | 4582 | Tom drove slowly until we were beyond the bend—then his foot came down hard, and 4583 | the coupé raced along through the night. In a little while I heard a low husky | ^~~~~ Did you mean to spell `coupé` this way? Suggest: - Replace with: “coup” - Replace with: “coupe” - Replace with: “coups” Lint: Spelling (63 priority) Message: | 4588 | The Buchanans’ house floated suddenly toward us through the dark rustling trees. | ^~~~~~~~~ Did you mean to spell `Buchanans` this way? Suggest: - Replace with: “Buchanan's” - Replace with: “Buchanan” Lint: Spelling (63 priority) Message: | 4635 | the house in a moment; I wouldn’t have been surprised to see sinister faces, the 4636 | faces of “Wolfshiem’s people,” behind him in the dark shrubbery. | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Formatting (255 priority) Message: | 4679 | “Don’t tell me, old sport.” He winced. “Anyhow—Daisy stepped on it. I tried to | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 4739 | Toward dawn I heard a taxi go up Gatsby’s drive, and immediately I jumped out of | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4740 | bed and began to dress—I felt that I had something to tell him, something to | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4741 | warn him about, and morning would be too late. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 4768 | It was this night that he told me the strange story of his youth with Dan | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4769 | Cody—told it to me because “Jay Gatsby” had broken up like glass against Tom’s | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4770 | hard malice, and the long secret extravaganza was played out. I think that he | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Readability (127 priority) Message: | 4780 | her as his tent out at camp was to him. There was a ripe mystery about it, a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4781 | hint of bedrooms up-stairs more beautiful and cool than other bedrooms, of gay | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4782 | and radiant activities taking place through its corridors, and of romances that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4783 | were not musty and laid away already in lavender but fresh and breathing and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4784 | redolent of this year’s shining motor-cars and of dances whose flowers were | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4785 | scarcely withered. It excited him, too, that many men had already loved Daisy—it | ~~~~~~~~~~~~~~~~~~ This sentence is 63 words long. Lint: Spelling (127 priority) Message: | 4780 | her as his tent out at camp was to him. There was a ripe mystery about it, a 4781 | hint of bedrooms up-stairs more beautiful and cool than other bedrooms, of gay | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Readability (127 priority) Message: | 4797 | pretenses. I don’t mean that he had traded on his phantom millions, but he had | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4798 | deliberately given Daisy a sense of security; he let her believe that he was a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4799 | person from much the same strata as herself—that he was fully able to take care | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4800 | of her. As a matter of fact, he had no such facilities—he had no comfortable | ~~~~~~~ This sentence is 47 words long. Lint: Readability (127 priority) Message: | 4814 | kissed her curious and lovely mouth. She had caught a cold, and it made her | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4815 | voice huskier and more charming than ever, and Gatsby was overwhelmingly aware | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4816 | of the youth and mystery that wealth imprisons and preserves, of the freshness | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4817 | of many clothes, and of Daisy, gleaming like silver, safe and proud above the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4818 | hot struggles of the poor. | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 53 words long. Lint: Formatting (63 priority) Message: | 4822 | was in love with me too. She thought I knew a lot because I knew different 4823 | things from her . . . Well, there I was, ’way off my ambitions, getting deeper | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Readability (127 priority) Message: | 4833 | They had never been closer in their month of love, nor communicated more | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4834 | profoundly one with another, than when she brushed silent lips against his | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4835 | coat’s shoulder or when he touched the end of her fingers, gently, as though she | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4836 | were asleep. | ~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 4850 | saxophones wailed the hopeless comment of the “Beale Street Blues” while a | ^~~~~ Did you mean to spell `Beale` this way? 4851 | hundred pairs of golden and silver slippers shuffled the shining dust. At the Suggest: - Replace with: “Bale” - Replace with: “Beagle” - Replace with: “Belle” Lint: Readability (127 priority) Message: | 4856 | Through this twilight universe Daisy began to move again with the season; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4857 | suddenly she was again keeping half a dozen dates a day with half a dozen men, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4858 | and drowsing asleep at dawn with the beads and chiffon of an evening dress | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4859 | tangled among dying orchids on the floor beside her bed. And all the time | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 52 words long. Lint: Spelling (63 priority) Message: | 4875 | “I don’t think she ever loved him.” Gatsby turned around from a window and 4876 | looked at me challengingly. “You must remember, old sport, she was very excited | ^~~~~~~~~~~~~ Did you mean `challenging`? Suggest: - Replace with: “challenging” Lint: Style (127 priority) Message: | 4883 | “Of course she might have loved him just for a minute, when they were first 4884 | married—and loved me more even then, do you see?” | ^~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “evener” Lint: Spelling (63 priority) Message: | 4921 | “I’m going to drain the pool to-day, Mr. Gatsby. Leaves’ll start falling pretty | ^~~~~~~~~ Did you mean to spell `Leaves’ll` this way? 4922 | soon, and then there’s always trouble with the pipes.” Suggest: - Replace with: “Leave's” - Replace with: “Leaven's” - Replace with: “Leaver's” Lint: Spelling (63 priority) Message: | 4943 | “I suppose Daisy’ll call too.” He looked at me anxiously, as if he hoped I’d | ^~~~~~~~ Did you mean `Daisy's`? Suggest: - Replace with: “Daisy's” Lint: Spelling (63 priority) Message: | 4980 | “I’ve left Daisy’s house,” she said. “I’m at Hempstead, and I’m going down to | ^~~~~~~~~ Did you mean `Homestead`? 4981 | Southampton this afternoon.” Suggest: - Replace with: “Homestead” Lint: Spelling (63 priority) Message: | 5015 | When I passed the ashheaps on the train that morning I had crossed deliberately | ^~~~~~~~ Did you mean to spell `ashheaps` this way? Suggest: - Replace with: “asthma's” - Replace with: “airheads” - Replace with: “ashcans” Lint: Typo (31 priority) Message: | 5015 | When I passed the ashheaps on the train that morning I had crossed deliberately | ^~~~~~~~ `ashheaps` should probably be written as `ash heaps`. Suggest: - Replace with: “ash heaps” Lint: Readability (127 priority) Message: | 5016 | to the other side of the car. I supposed there’d be a curious crowd around there | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5017 | all day with little boys searching for dark spots in the dust, and some | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5018 | garrulous man telling over and over what had happened, until it became less and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5019 | less real even to him and he could tell it no longer, and Myrtle Wilson’s tragic | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5020 | achievement was forgotten. Now I want to go back a little and tell what happened | ~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Miscellaneous (31 priority) Message: | 5027 | intolerable part of the affair. Some one, kind or curious, took her in his car | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “Someone” Lint: Miscellaneous (31 priority) Message: | 5032 | For a while the door of the office was open, and every one who came into the | ^~~~~~~~~ Did you mean the closed compound `everyone`? 5033 | garage glanced irresistibly through it. Finally some one said it was a shame, Suggest: - Replace with: “everyone” Lint: Miscellaneous (31 priority) Message: | 5033 | garage glanced irresistibly through it. Finally some one said it was a shame, | ^~~~~~~~ Did you mean the closed compound `someone`? 5034 | and closed the door. Michaelis and several other men were with him; first, four Suggest: - Replace with: “someone” Lint: Spelling (63 priority) Message: | 5034 | and closed the door. Michaelis and several other men were with him; first, four | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Style (31 priority) Message: | 5034 | and closed the door. Michaelis and several other men were with him; first, four | ^~~~ An Oxford comma is necessary here. 5035 | or five men, later two or three men. Still later Michaelis had to ask the last Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 5035 | or five men, later two or three men. Still later Michaelis had to ask the last | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? 5036 | stranger to wait there fifteen minutes longer, while he went back to his own Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Readability (127 priority) Message: | 5041 | quieter and began to talk about the yellow car. He announced that he had a way | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5042 | of finding out whom the yellow car belonged to, and then he blurted out that a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5043 | couple of months ago his wife had come from the city with her face bruised and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5044 | her nose swollen. | ~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 5047 | again in his groaning voice. Michaelis made a clumsy attempt to distract him. | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5057 | The hard brown beetles kept thudding against the dull light, and whenever 5058 | Michaelis heard a car go tearing along the road outside it sounded to him like | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: WordChoice (63 priority) Message: | 5057 | The hard brown beetles kept thudding against the dull light, and whenever 5058 | Michaelis heard a car go tearing along the road outside it sounded to him like | ^~~~~~ Did you mean the closed compound noun “cargo”? Suggest: - Replace with: “cargo” Lint: Readability (127 priority) Message: | 5059 | the car that hadn’t stopped a few hours before. He didn’t like to go into the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5060 | garage, because the work bench was stained where the body had been lying, so he | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5061 | moved uncomfortably around the office—he knew every object in it before | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5062 | morning—and from time to time sat down beside Wilson trying to keep him more | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5063 | quiet. | ~~~~~~ This sentence is 50 words long. Lint: WordChoice (63 priority) Message: | 5059 | the car that hadn’t stopped a few hours before. He didn’t like to go into the 5060 | garage, because the work bench was stained where the body had been lying, so he | ^~~~~~~~~~ Did you mean the closed compound noun “workbench”? Suggest: - Replace with: “workbench” Lint: Style (127 priority) Message: | 5062 | morning—and from time to time sat down beside Wilson trying to keep him more | ^~~~~ 5063 | quiet. | ~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “quieter” Lint: WordChoice (127 priority) Message: | 5065 | “Have you got a church you go to sometimes, George? Maybe even if you haven’t | ^~ Use `too` here to mean ‘also’ or an excessive degree. Suggest: - Replace with: “too” Lint: Spelling (63 priority) Message: | 5087 | Michaelis opened the drawer nearest his hand. There was nothing in it but a | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5102 | Michaelis didn’t see anything odd in that, and he gave Wilson a dozen reasons | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Capitalization (127 priority) Message: | 5121 | Wilson shook his head. His eyes narrowed and his mouth widened slightly with the 5122 | ghost of a superior “Hm!” | ^~ This word's canonical spelling is all-caps. Suggest: - Replace with: “HM” Lint: Spelling (63 priority) Message: | 5121 | Wilson shook his head. His eyes narrowed and his mouth widened slightly with the 5122 | ghost of a superior “Hm!” | ^~ Did you mean to spell `Hm` this way? Suggest: - Replace with: “Ha” - Replace with: “Ham” - Replace with: “He” Lint: Spelling (63 priority) Message: | 5128 | Michaelis had seen this too, but it hadn’t occurred to him that there was any | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5136 | He began to rock again, and Michaelis stood twisting the leash in his hand. | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5146 | Wilson’s glazed eyes turned out to the ashheaps, where small gray clouds took on | ^~~~~~~~ Did you mean to spell `ashheaps` this way? 5147 | fantastic shapes and scurried here and there in the faint dawn wind. Suggest: - Replace with: “asthma's” - Replace with: “airheads” - Replace with: “ashcans” Lint: Typo (31 priority) Message: | 5146 | Wilson’s glazed eyes turned out to the ashheaps, where small gray clouds took on | ^~~~~~~~ `ashheaps` should probably be written as `ash heaps`. 5147 | fantastic shapes and scurried here and there in the faint dawn wind. Suggest: - Replace with: “ash heaps” Lint: Formatting (255 priority) Message: | 5151 | and walked to the rear window and leaned with his face pressed against it—“and I | ^ This quote has no termination. 5152 | said ‘God knows what you’ve been doing, everything you’ve been doing. You may Lint: Formatting (255 priority) Message: | 5153 | fool me, but you can’t fool God!’” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 5155 | Standing behind him, Michaelis saw with a shock that he was looking at the eyes | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5155 | Standing behind him, Michaelis saw with a shock that he was looking at the eyes 5156 | of Doctor T. J. Eckleburg, which had just emerged, pale and enormous, from the | ^~ Did you mean to spell `T.` this way? Suggest: - Replace with: “Ta” - Replace with: “Ti” - Replace with: “To” Lint: Spelling (63 priority) Message: | 5156 | of Doctor T. J. Eckleburg, which had just emerged, pale and enormous, from the | ^~ Did you mean to spell `J.` this way? Suggest: - Replace with: “Jo” - Replace with: “J” - Replace with: “Jg” Lint: Spelling (63 priority) Message: | 5156 | of Doctor T. J. Eckleburg, which had just emerged, pale and enormous, from the | ^~~~~~~~~ Did you mean to spell `Eckleburg` this way? Suggest: - Replace with: “Excalibur” - Replace with: “Vicksburg” - Replace with: “Heckler” Lint: Spelling (63 priority) Message: | 5161 | “That’s an advertisement,” Michaelis assured him. Something made him turn away | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: WordChoice (63 priority) Message: | 5162 | from the window and look back into the room. But Wilson stood there a long time, 5163 | his face close to the window pane, nodding into the twilight. | ^~~~~~~~~~~ Did you mean the closed compound noun “windowpane”? Suggest: - Replace with: “windowpane” Lint: Spelling (63 priority) Message: | 5165 | By six o’clock Michaelis was worn out, and grateful for the sound of a car | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5168 | man ate together. Wilson was quieter now, and Michaelis went home to sleep; when | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Spelling (63 priority) Message: | 5171 | His movements—he was on foot all the time—were afterward traced to Port 5172 | Roosevelt and then to Gad’s Hill, where he bought a sandwich that he didn’t eat, | ^~~~~ Did you mean to spell `Gad’s` this way? Suggest: - Replace with: “Gab's” - Replace with: “Gag's” - Replace with: “Gal's” Lint: Spelling (63 priority) Message: | 5173 | and a cup of coffee. He must have been tired and walking slowly, for he didn’t 5174 | reach Gad’s Hill until noon. Thus far there was no difficulty in accounting for | ^~~~~ Did you mean to spell `Gad’s` this way? Suggest: - Replace with: “Gab's” - Replace with: “Gag's” - Replace with: “Gal's” Lint: Spelling (63 priority) Message: | 5177 | hours he disappeared from view. The police, on the strength of what he said to 5178 | Michaelis, that he “had a way of finding out,” supposed that he spent that time | ^~~~~~~~~ Did you mean to spell `Michaelis` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Micheal's” Lint: Miscellaneous (31 priority) Message: | 5181 | easier, surer way of finding out what he wanted to know. By half-past two he was 5182 | in West Egg, where he asked some one the way to Gatsby’s house. So by that time | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “someone” Lint: Formatting (63 priority) Message: | 5204 | where poor ghosts, breathing dreams like air, drifted fortuitously about . . . | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Capitalization (31 priority) Message: | 5205 | like that ashen, fantastic figure gliding toward him through the amorphous | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Like” Lint: Spelling (63 priority) Message: | 5208 | The chauffeur—he was one of Wolfshiem’s protégés—heard the shots—afterward he | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Spelling (63 priority) Message: | 5208 | The chauffeur—he was one of Wolfshiem’s protégés—heard the shots—afterward he | ^~~~~~~~ Did you mean `proteges`? 5209 | could only say that he hadn’t thought anything much about them. I drove from the Suggest: - Replace with: “proteges” Lint: Readability (127 priority) Message: | 5230 | and out of Gatsby’s front door. A rope stretched across the main gate and a | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5231 | policeman by it kept out the curious, but little boys soon discovered that they | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5232 | could enter through my yard, and there were always a few of them clustered | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5233 | open-mouthed about the pool. Some one with a positive manner, perhaps a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Miscellaneous (31 priority) Message: | 5233 | open-mouthed about the pool. Some one with a positive manner, perhaps a | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “Someone” Lint: Spelling (63 priority) Message: | 5239 | untrue. When Michaelis’s testimony at the inquest brought to light Wilson’s | ^~~~~~~~~~~ Did you mean to spell `Michaelis’s` this way? Suggest: - Replace with: “Michael's” - Replace with: “Michaela's” - Replace with: “Michaelmas's” Lint: Spelling (63 priority) Message: | 5240 | suspicions of his wife I thought the whole tale would shortly be served up in 5241 | racy pasquinade—but Catherine, who might have said anything, didn’t say a word. | ^~~~~~~~~~ Did you mean `masquerade`? Suggest: - Replace with: “masquerade” Lint: Readability (127 priority) Message: | 5242 | She showed a surprising amount of character about it too—looked at the coroner | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5243 | with determined eyes under that corrected brow of hers, and swore that her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5244 | sister had never seen Gatsby, that her sister was completely happy with her | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5245 | husband, that her sister had been into no mischief whatever. She convinced | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 50 words long. Lint: Readability (127 priority) Message: | 5253 | referred to me. At first I was surprised and confused; then, as he lay in his | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5254 | house and didn’t move or breathe or speak, hour upon hour, it grew upon me that | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5255 | I was responsible, because no one else was interested—interested, I mean, with | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5256 | that intense personal interest to which every one has some vague right at the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5257 | end. | ~~~~ This sentence is 57 words long. Lint: Miscellaneous (31 priority) Message: | 5255 | I was responsible, because no one else was interested—interested, I mean, with 5256 | that intense personal interest to which every one has some vague right at the | ^~~~~~~~~ Did you mean the closed compound `everyone`? 5257 | end. Suggest: - Replace with: “everyone” Lint: Spelling (63 priority) Message: | 5279 | Meyer Wolfshiem’s name wasn’t in the phone book. The butler gave me his office | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Miscellaneous (31 priority) Message: | 5299 | Some one started to ask me questions, but I broke away and going up-stairs | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “Someone” Lint: Spelling (127 priority) Message: | 5299 | Some one started to ask me questions, but I broke away and going up-stairs | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. 5300 | looked hastily through the unlocked parts of his desk—he’d never told me Suggest: - Replace with: “upstairs” Lint: Spelling (63 priority) Message: | 5304 | Next morning I sent the butler to New York with a letter to Wolfshiem, which | ^~~~~~~~~ Did you mean `Bolshie`? 5305 | asked for information and urged him to come out on the next train. That request Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 5308 | neither a wire nor Mr. Wolfshiem arrived; no one arrived except more police and | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 5309 | photographers and newspaper men. When the butler brought back Wolfshiem’s answer | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? 5310 | I began to have a feeling of defiance, of scornful solidarity between Gatsby and Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Spelling (63 priority) Message: | 5313 | Dear Mr. Carraway. This has been one of the most terrible shocks of my life to | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 5322 | > 5323 | > Meyer Wolfshiem | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 5327 | Let me know about the funeral etc do not know his family at all. | ^~~ Did you mean to spell `etc` this way? Suggest: - Replace with: “eta” - Replace with: “etc.” - Replace with: “enc” Lint: Spelling (63 priority) Message: | 5333 | “This is Slagle speaking . . .” | ^~~~~~ Did you mean to spell `Slagle` this way? Suggest: - Replace with: “Slag's” - Replace with: “Sable” - Replace with: “Sage” Lint: Formatting (63 priority) Message: | 5333 | “This is Slagle speaking . . .” | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Spelling (63 priority) Message: | 5341 | “Young Parke’s in trouble,” he said rapidly. “They picked him up when he handed | ^~~~~~~ Did you mean to spell `Parke’s` this way? Suggest: - Replace with: “Parker's” - Replace with: “Parks's” - Replace with: “Park's” Lint: Spelling (63 priority) Message: | 5343 | numbers just five minutes before. What d’you know about that, hey? You never can | ^~~~~ Did you mean to spell `d’you` this way? Suggest: - Replace with: “bayou” - Replace with: “you” Lint: Formatting (63 priority) Message: | 5349 | There was a long silence on the other end of the wire, followed by an 5350 | exclamation . . . then a quick squawk as the connection was broken. | ^ Unnecessary space at the end of the sentence. Suggest: - Remove error Lint: Capitalization (31 priority) Message: | 5350 | exclamation . . . then a quick squawk as the connection was broken. | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “Then” Lint: Spelling (63 priority) Message: | 5352 | I think it was on the third day that a telegram signed Henry C. Gatz arrived | ^~ Did you mean to spell `C.` this way? Suggest: - Replace with: “Co” - Replace with: “Cu” - Replace with: “CI” Lint: Spelling (63 priority) Message: | 5352 | I think it was on the third day that a telegram signed Henry C. Gatz arrived | ^~~~ Did you mean to spell `Gatz` this way? 5353 | from a town in Minnesota. It said only that the sender was leaving immediately Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: WordChoice (63 priority) Message: | 5359 | hands he began to pull so incessantly at his sparse gray beard that I had | ^~~~~~~~~~ Did you mean the closed compound noun “graybeard”? 5360 | difficulty in getting off his coat. He was on the point of collapse, so I took Suggest: - Replace with: “graybeard” Lint: Spelling (63 priority) Message: | 5377 | “Carraway.” | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 5385 | After a little while Mr. Gatz opened the door and came out, his mouth ajar, his | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Spelling (63 priority) Message: | 5386 | face flushed slightly, his eyes leaking isolated and unpunctual tears. He had | ^~~~~~~~~~ Did you mean `punctual`? Suggest: - Replace with: “punctual” Lint: Readability (127 priority) Message: | 5386 | face flushed slightly, his eyes leaking isolated and unpunctual tears. He had | ^~~~~~~ 5387 | reached an age where death no longer has the quality of ghastly surprise, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5388 | when he looked around him now for the first time and saw the height and splendor | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5389 | of the hall and the great rooms opening out from it into other rooms, his grief | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5390 | began to be mixed with an awed pride. I helped him to a bedroom up-stairs; while | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 56 words long. Lint: Spelling (127 priority) Message: | 5390 | began to be mixed with an awed pride. I helped him to a bedroom up-stairs; while | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Spelling (63 priority) Message: | 5396 | “Gatz is my name.” | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Spelling (63 priority) Message: | 5398 | “—Mr. Gatz. I thought you might want to take the body West.” | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Miscellaneous (31 priority) Message: | 5405 | “We were close friends.” | ^~~~~ You may be missing a preposition here. Lint: Spelling (63 priority) Message: | 5412 | “If he’d of lived, he’d of been a great man. A man like James J. Hill. He’d of | ^~ Did you mean to spell `J.` this way? Suggest: - Replace with: “Jo” - Replace with: “J” - Replace with: “Jg” Lint: Spelling (63 priority) Message: | 5423 | “This is Mr. Carraway,” I said. | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 5425 | “Oh!” He sounded relieved. “This is Klipspringer.” | ^~~~~~~~~~~~ Did you mean `Kissinger`? Suggest: - Replace with: “Kissinger” Lint: Spelling (63 priority) Message: | 5455 | and I’m sort of helpless without them. My address is care of B. F.———” | ^~ Did you mean to spell `B.` this way? Suggest: - Replace with: “Be” - Replace with: “Bi” - Replace with: “Bu” Lint: Spelling (63 priority) Message: | 5455 | and I’m sort of helpless without them. My address is care of B. F.———” | ^~ Did you mean to spell `F.` this way? Suggest: - Replace with: “Fa” - Replace with: “Fe” - Replace with: “Ff” Lint: Spelling (63 priority) Message: | 5464 | The morning of the funeral I went up to New York to see Meyer Wolfshiem; I | ^~~~~~~~~ Did you mean `Bolshie`? Suggest: - Replace with: “Bolshie” Lint: Spelling (63 priority) Message: | 5472 | “Nobody’s in,” she said. “Mr. Wolfshiem’s gone to Chicago.” | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Miscellaneous (31 priority) Message: | 5474 | The first part of this was obviously untrue, for some one had begun to whistle | ^~~~~~~~ Did you mean the closed compound `someone`? 5475 | “The Rosary,” tunelessly, inside. Suggest: - Replace with: “someone” Lint: Spelling (63 priority) Message: | 5477 | “Please say that Mr. Carraway wants to see him.” | ^~~~~~~~ Did you mean to spell `Carraway` this way? Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Spelling (63 priority) Message: | 5481 | At this moment a voice, unmistakably Wolfshiem’s, called “Stella!” from the | ^~~~~~~~~~~ Did you mean to spell `Wolfshiem’s` this way? Suggest: - Replace with: “Waldheim's” - Replace with: “Welshmen's” - Replace with: “Wolfe's” Lint: Formatting (255 priority) Message: | 5498 | “Oh-h!” She looked at me over again. ‘‘Will you just— What was your name?” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 5500 | She vanished. In a moment Meyer Wolfsheim stood solemnly in the doorway, holding | ^~~~~~~~~ Did you mean to spell `Wolfsheim` this way? 5501 | out both hands. He drew me into his office, remarking in a reverent voice that Suggest: - Replace with: “Waldheim” - Replace with: “Florsheim” Lint: Agreement (127 priority) Message: | 5507 | First time I saw him was when he come into Winebrenner’s poolroom at Forty-third | ^~~~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “comes” Lint: Spelling (63 priority) Message: | 5507 | First time I saw him was when he come into Winebrenner’s poolroom at Forty-third | ^~~~~~~~~~~~~ Did you mean `Windbreaker's`? 5508 | Street and asked for a job. He hadn’t eat anything for a couple of days. ‘Come Suggest: - Replace with: “Windbreaker's” Lint: Capitalization (127 priority) Message: | 5508 | Street and asked for a job. He hadn’t eat anything for a couple of days. ‘Come 5509 | on have some lunch with me,’ I sid. He ate more than four dollars’ worth of food | ^~~ The canonical dictionary spelling is title case: `Sid`. Suggest: - Replace with: “Sid” Lint: Spelling (63 priority) Message: | 5508 | Street and asked for a job. He hadn’t eat anything for a couple of days. ‘Come 5509 | on have some lunch with me,’ I sid. He ate more than four dollars’ worth of food | ^~~ Did you mean to spell `sid` this way? Suggest: - Replace with: “sad” - Replace with: “said” - Replace with: “sic” Lint: Spelling (63 priority) Message: | 5519 | was a fine-appearing, gentlemanly young man, and when he told me he was an 5520 | Oggsford I knew I could use him good. I got him to join up in the American | ^~~~~~~~ Did you mean to spell `Oggsford` this way? Suggest: - Replace with: “Oxford” - Replace with: “Longsword” Lint: Formatting (255 priority) Message: | 5522 | of mine up to Albany. We were so thick like that in everything”—he held up two 5523 | bulbous fingers—“always together.” | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 5523 | bulbous fingers—“always together.” | ^ This quote has no termination. Lint: Spelling (63 priority) Message: | 5552 | For a moment I thought he was going to suggest a “gonnegtion,” but he only | ^~~~~~~~~~ Did you mean `connection`? 5553 | nodded and shook my hand. Suggest: - Replace with: “connection” Lint: Spelling (63 priority) Message: | 5559 | drizzle. After changing my clothes I went next door and found Mr. Gatz walking | ^~~~ Did you mean to spell `Gatz` this way? 5560 | up and down excitedly in the hall. His pride in his son and in his son’s Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Style (127 priority) Message: | 5568 | admiration from my eyes. He had shown it so often that I think it was more real | ^~~~~~~~~ This is not an error, but an inflected form of this adjective also exists 5569 | to him now than the house itself. Suggest: - Replace with: “realer” Lint: Agreement (127 priority) Message: | 5575 | “He come out to see me two years ago and bought me the house I live in now. Of | ^~~~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “comes” Lint: Agreement (30 priority) Message: | 5575 | “He come out to see me two years ago and bought me the house I live in now. Of 5576 | course we was broke up when he run off from home, but I see now there was a | ^~~ Make the verb agree with its subject. Suggest: - Replace with: “were” Lint: Grammar (127 priority) Message: | 5575 | “He come out to see me two years ago and bought me the house I live in now. Of 5576 | course we was broke up when he run off from home, but I see now there was a | ^~~~~ Use the past participle `broken` instead of `broke` when using compound tenses or passive voice. Suggest: - Replace with: “broken” Lint: Agreement (127 priority) Message: | 5575 | “He come out to see me two years ago and bought me the house I live in now. Of 5576 | course we was broke up when he run off from home, but I see now there was a | ^~~ The form of the verb must agree in grammatical number with the pronoun. Suggest: - Replace with: “runs” Lint: Spelling (63 priority) Message: | 5582 | pocket a ragged old copy of a book called “Hopalong Cassidy.” | ^~~~~~~~ Did you mean to spell `Hopalong` this way? Suggest: - Replace with: “Hopping” - Replace with: “Haling” - Replace with: “Haloing” Lint: Spelling (63 priority) Message: | 5601 | > 5602 | > No wasting time at Shafters or [a name, indecipherable] No more smokeing or | ^~~~~~~~ Did you mean to spell `Shafters` this way? Suggest: - Replace with: “Shatters” - Replace with: “Shifters” - Replace with: “Shaffer's” Lint: Spelling (63 priority) Message: | 5602 | > No wasting time at Shafters or [a name, indecipherable] No more smokeing or | ^~~~~~~~ Did you mean to spell `smokeing` this way? 5603 | > chewing. Bath every other day Read one improving book or magazine per week Suggest: - Replace with: “smoking” - Replace with: “shoeing” - Replace with: “smocking” Lint: Capitalization (127 priority) Message: | 5613 | great for that. He told me I et like a hog once, and I beat him for it.” | ^~ This word's canonical spelling is all-caps. Suggest: - Replace with: “ET” Lint: Spelling (63 priority) Message: | 5613 | great for that. He told me I et like a hog once, and I beat him for it.” | ^~ Did you mean to spell `et` this way? Suggest: - Replace with: “e” - Replace with: “ea” - Replace with: “eat” Lint: Spelling (63 priority) Message: | 5629 | then Mr. Gatz and the minister and I in the limousine, and a little later four | ^~~~ Did you mean to spell `Gatz` this way? Suggest: - Replace with: “Gate” - Replace with: “Garth” - Replace with: “Goth” Lint: Miscellaneous (31 priority) Message: | 5631 | wet to the skin. As we started through the gate into the cemetery I heard a car 5632 | stop and then the sound of some one splashing after us over the soggy ground. I | ^~~~~~~~ Did you mean the closed compound `someone`? Suggest: - Replace with: “someone” Lint: Agreement (31 priority) Message: | 5631 | wet to the skin. As we started through the gate into the cemetery I heard a car 5632 | stop and then the sound of some one splashing after us over the soggy ground. I | ^~~~~~~~~~~~~ `splashing` is a mass noun. Suggest: - Replace with: “one piece of splashing” Lint: Spelling (63 priority) Message: | 5633 | looked around. It was the man with owl-eyed glasses whom I had found marvelling | ^~~~~~~~~~ Did you mean `marveling`? 5634 | over Gatsby’s books in the library one night three months before. Suggest: - Replace with: “marveling” Lint: Miscellaneous (31 priority) Message: | 5642 | message or a flower. Dimly I heard some one murmur “Blessed are the dead that | ^~~~~~~~ Did you mean the closed compound `someone`? 5643 | the rain falls on,” and then the owl-eyed man said “Amen to that,” in a brave Suggest: - Replace with: “someone” Lint: WordChoice (63 priority) Message: | 5642 | message or a flower. Dimly I heard some one murmur “Blessed are the dead that 5643 | the rain falls on,” and then the owl-eyed man said “Amen to that,” in a brave | ^~~~~~~~~~ Did you mean the closed compound noun “rainfalls”? Suggest: - Replace with: “rainfalls” Lint: Capitalization (31 priority) Message: | 5653 | “Go on!” He started. “Why, my God! they used to go there by the hundreds.” | ^~~~ This sentence does not start with a capital letter Suggest: - Replace with: “They” Lint: Style (127 priority) Message: | 5659 | One of my most vivid memories is of coming back West from prep school and later | ^~~~~~~~~~ This is not an error, but an inflected form of this adjective also exists Suggest: - Replace with: “vividest” Lint: Readability (127 priority) Message: | 5660 | from college at Christmas time. Those who went farther than Chicago would gather | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5661 | in the old dim Union Street station at six o’clock of a December evening, with a | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5662 | few Chicago friends, already caught up into their own holiday gayeties, to bid | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5663 | them a hasty good-by. I remember the fur coats of the girls returning from Miss | ~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Spelling (63 priority) Message: | 5662 | few Chicago friends, already caught up into their own holiday gayeties, to bid | ^~~~~~~~ Did you mean to spell `gayeties` this way? 5663 | them a hasty good-by. I remember the fur coats of the girls returning from Miss Suggest: - Replace with: “gametes” - Replace with: “gazettes” - Replace with: “layettes” Lint: Readability (127 priority) Message: | 5663 | them a hasty good-by. I remember the fur coats of the girls returning from Miss | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5664 | This-or-That’s and the chatter of frozen breath and the hands waving overhead as | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5665 | we caught sight of old acquaintances, and the matchings of invitations: “Are you | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5666 | going to the Ordways’? the Herseys’? the Schultzes’?” and the long green tickets | ~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 5665 | we caught sight of old acquaintances, and the matchings of invitations: “Are you | ^~~~~~~~~ Did you mean to spell `matchings` this way? Suggest: - Replace with: “matching” - Replace with: “catchings” - Replace with: “machines” Lint: Spelling (63 priority) Message: | 5665 | we caught sight of old acquaintances, and the matchings of invitations: “Are you 5666 | going to the Ordways’? the Herseys’? the Schultzes’?” and the long green tickets | ^~~~~~~ Did you mean to spell `Ordways` this way? Suggest: - Replace with: “Ordeals” - Replace with: “Endways” - Replace with: “Midways” Lint: Spelling (63 priority) Message: | 5666 | going to the Ordways’? the Herseys’? the Schultzes’?” and the long green tickets | ^~~~~~~ Did you mean to spell `Herseys` this way? Suggest: - Replace with: “Hersey's” - Replace with: “Hersey” - Replace with: “Hershey's” Lint: Spelling (63 priority) Message: | 5666 | going to the Ordways’? the Herseys’? the Schultzes’?” and the long green tickets | ^~~~~~~~~ Did you mean to spell `Schultzes` this way? Suggest: - Replace with: “Schultz's” - Replace with: “Schulz's” - Replace with: “Schultz” Lint: Readability (127 priority) Message: | 5671 | When we pulled out into the winter night and the real snow, our snow, began to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5672 | stretch out beside us and twinkle against the windows, and the dim lights of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5673 | small Wisconsin stations moved by, a sharp wild brace came suddenly into the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5674 | air. We drew in deep breaths of it as we walked back from dinner through the | ~~~~ This sentence is 44 words long. Lint: Readability (127 priority) Message: | 5678 | That’s my Middle West—not the wheat or the prairies or the lost Swede towns, but | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5679 | the thrilling returning trains of my youth, and the street lamps and sleigh | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5680 | bells in the frosty dark and the shadows of holly wreaths thrown by lighted | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5681 | windows on the snow. I am part of that, a little solemn with the feel of those | ~~~~~~~~~~~~~~~~~~~~ This sentence is 47 words long. Lint: WordChoice (63 priority) Message: | 5679 | the thrilling returning trains of my youth, and the street lamps and sleigh | ^~~~~~~~~~~~ Did you mean the closed compound noun “streetlamps”? 5680 | bells in the frosty dark and the shadows of holly wreaths thrown by lighted Suggest: - Replace with: “streetlamps” Lint: Spelling (63 priority) Message: | 5682 | long winters, a little complacent from growing up in the Carraway house in a | ^~~~~~~~ Did you mean to spell `Carraway` this way? 5683 | city where dwellings are still called through decades by a family’s name. I see Suggest: - Replace with: “Caraway” - Replace with: “Caraways” - Replace with: “Castaway” Lint: Readability (127 priority) Message: | 5683 | city where dwellings are still called through decades by a family’s name. I see | ^~~~~~ 5684 | now that this has been a story of the West, after all—Tom and Gatsby, Daisy and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5685 | Jordan and I, were all Westerners, and perhaps we possessed some deficiency in | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5686 | common which made us subtly unadaptable to Eastern life. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Style (31 priority) Message: | 5684 | now that this has been a story of the West, after all—Tom and Gatsby, Daisy and | ^~~~~ An Oxford comma is necessary here. 5685 | Jordan and I, were all Westerners, and perhaps we possessed some deficiency in Suggest: - Insert “,” Lint: Spelling (63 priority) Message: | 5685 | Jordan and I, were all Westerners, and perhaps we possessed some deficiency in 5686 | common which made us subtly unadaptable to Eastern life. | ^~~~~~~~~~~ Did you mean `adaptable`? Suggest: - Replace with: “adaptable” Lint: Readability (127 priority) Message: | 5688 | Even when the East excited me most, even when I was most keenly aware of its | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5689 | superiority to the bored, sprawling, swollen towns beyond the Ohio, with their | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5690 | interminable inquisitions which spared only the children and the very old—even | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5691 | then it had always for me a quality of distortion. West Egg, especially, still | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 50 words long. Lint: Spelling (63 priority) Message: | 5692 | figures in my more fantastic dreams. I see it as a night scene by El Greco: a | ^~ Did you mean to spell `El` this way? Suggest: - Replace with: “Ell” - Replace with: “E” - Replace with: “Ea” Lint: Spelling (63 priority) Message: | 5692 | figures in my more fantastic dreams. I see it as a night scene by El Greco: a | ^~~~~ Did you mean to spell `Greco` this way? Suggest: - Replace with: “Gecko” - Replace with: “Grace” - Replace with: “Great” Lint: Spelling (63 priority) Message: | 5693 | hundred houses, at once conventional and grotesque, crouching under a sullen, 5694 | overhanging sky and a lustreless moon. In the foreground four solemn men in | ^~~~~~~~~~ Did you mean `lusterless`? Suggest: - Replace with: “lusterless” Lint: Readability (127 priority) Message: | 5712 | She was dressed to play golf, and I remember thinking she looked like a good | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5713 | illustration, her chin raised a little jauntily, her hair the color of an autumn | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5714 | leaf, her face the same brown tint as the fingerless glove on her knee. When I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Spelling (63 priority) Message: | 5714 | leaf, her face the same brown tint as the fingerless glove on her knee. When I | ^~~~~~~~~~ Did you mean `linerless`? Suggest: - Replace with: “linerless” Lint: Typo (31 priority) Message: | 5714 | leaf, her face the same brown tint as the fingerless glove on her knee. When I | ^~~~~~~~~~ `fingerless` should probably be written as `finger less`. Suggest: - Replace with: “finger less” Lint: Punctuation (31 priority) Message: | 5721 | “Nevertheless you did throw me over,” said Jordan suddenly. ‘‘You threw me over | ^~~~~~~~~~~~ Discourse markers at the beginning of a sentence should be followed by a comma. Suggest: - Insert “,” Lint: Formatting (255 priority) Message: | 5723 | for me, and I felt a little dizzy for a while.” | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 5727 | “Oh, and do you remember”—she added—“a conversation we had once about driving a | ^ This quote has no termination. Lint: Formatting (255 priority) Message: | 5728 | car?” | ^ This quote has no termination. Lint: Readability (127 priority) Message: | 5743 | One afternoon late in October I saw Tom Buchanan. He was walking ahead of me | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 5744 | along Fifth Avenue in his alert, aggressive way, his hands out a little from his | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5745 | body as if to fight off interference, his head moving sharply here and there, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5746 | adapting itself to his restless eyes. Just as I slowed up to avoid overtaking | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 41 words long. Lint: Spelling (127 priority) Message: | 5764 | ready to leave, and when I sent down word that we weren’t in he tried to force 5765 | his way up-stairs. He was crazy enough to kill me if I hadn’t told him who owned | ^~~~~~~~~ This looks like a prefix that can be joined with the rest of the word. Suggest: - Replace with: “upstairs” Lint: Readability (127 priority) Message: | 5775 | “And if you think I didn’t have my share of suffering—look here, when I went to | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5776 | give up that flat and saw that damn box of dog biscuits sitting there on the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5777 | sideboard, I sat down and cried like a baby. By God it was awful—” | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 42 words long. Lint: Readability (127 priority) Message: | 5780 | entirely justified. It was all very careless and confused. They were careless | ^~~~~~~~~~~~~~~~~~~ 5781 | people, Tom and Daisy—they smashed up things and creatures and then retreated | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5782 | back into their money or their vast carelessness, or whatever it was that kept | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5783 | them together, and let other people clean up the mess they had made. . . . | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 43 words long. Lint: Miscellaneous (31 priority) Message: | 5780 | entirely justified. It was all very careless and confused. They were careless | ^~~~~ You may be missing a preposition here. 5781 | people, Tom and Daisy—they smashed up things and creatures and then retreated Lint: Style (31 priority) Message: | 5780 | entirely justified. It was all very careless and confused. They were careless 5781 | people, Tom and Daisy—they smashed up things and creatures and then retreated | ^~~ An Oxford comma is necessary here. Suggest: - Insert “,” Lint: Readability (127 priority) Message: | 5791 | long as mine. One of the taxi drivers in the village never took a fare past the | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5792 | entrance gate without stopping for a minute and pointing inside; perhaps it was | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5793 | he who drove Daisy and Gatsby over to East Egg the night of the accident, and | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5794 | perhaps he had made a story about it all his own. I didn’t want to hear it and I | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 54 words long. Lint: Readability (127 priority) Message: | 5797 | I spent my Saturday nights in New York because those gleaming, dazzling parties | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5798 | of his were with me so vividly that I could still hear the music and the | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5799 | laughter, faint and incessant, from his garden, and the cars going up and down | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5800 | his drive. One night I did hear a material car there, and saw its lights stop at | ~~~~~~~~~~ This sentence is 45 words long. Lint: Spelling (63 priority) Message: | 5807 | out clearly in the moonlight, and I erased it, drawing my shoe raspingly along | ^~~~~~~~~ Did you mean to spell `raspingly` this way? 5808 | the stone. Then I wandered down to the beach and sprawled out on the sand. Suggest: - Replace with: “ragingly” - Replace with: “rasping” - Replace with: “dashingly” Lint: Readability (127 priority) Message: | 5814 | green breast of the new world. Its vanished trees, the trees that had made way | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5815 | for Gatsby’s house, had once pandered in whispers to the last and greatest of | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5816 | all human dreams; for a transitory enchanted moment man must have held his | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5817 | breath in the presence of this continent, compelled into an esthetic | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5818 | contemplation he neither understood nor desired, face to face for the last time | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5819 | in history with something commensurate to his capacity for wonder. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This sentence is 70 words long. Lint: WordChoice (63 priority) Message: | 5817 | breath in the presence of this continent, compelled into an esthetic | ^~~~~~~~~~~ It seems these words would go better together. 5818 | contemplation he neither understood nor desired, face to face for the last time Suggest: - Replace with: “anesthetic” Lint: Spelling (63 priority) Message: | 5817 | breath in the presence of this continent, compelled into an esthetic | ^~~~~~~~ Did you mean to spell `esthetic` this way? 5818 | contemplation he neither understood nor desired, face to face for the last time Suggest: - Replace with: “aesthetic” - Replace with: “pathetic” - Replace with: “aesthetics” Lint: Spelling (63 priority) Message: | 5828 | Gatsby believed in the green light, the orgastic future that year by year | ^~~~~~~~ Did you mean to spell `orgastic` this way? 5829 | recedes before us. It eluded us then, but that’s no matter—to-morrow we will run Suggest: - Replace with: “orgasmic” - Replace with: “orgiastic” - Replace with: “organic” ================================================ FILE: harper-core/tests/text/linters/this and that.snap.yml ================================================ ================================================ FILE: harper-core/tests/text/tagged/Alice's Adventures in Wonderland.md ================================================ > Alice’s Adventures in Wonderland # HeadingStart NPr$ NPl/V3 NPr/J/R/P NSg+ > # > by Lewis Carroll # NSg/P NPr+ NPr+ > # > THE MILLENNIUM FULCRUM EDITION 3.0 # D NSg+ NSg NSg+ # > # > CHAPTER I : Down the Rabbit - Hole # HeadingStart NSg/VB+ ISg/#r+ . N🅪Sg/VB/J/P D NSg/VB+ . NSg/VB+ > # > Alice was beginning to get very tired of sitting by her sister on the bank , and # NPr+ VLPt NSg/Vg/J P NSg/VB J/R VP/J P NSg/Vg/J NSg/P ISg/D$+ NSg/VB+ J/P D+ NSg/VB+ . VB/C > of having nothing to do : once or twice she had peeped into the book her sister # P Nᴹ/Vg/J NSg/I/J+ P VXB . NSg/C NPr/C R ISg+ VP VP/J P D+ NSg/VB+ ISg/D$+ NSg/VB+ > was reading , but it had no pictures or conversations in it , “ and what is the use # VLPt NPrᴹ/Vg/J . NSg/C/P NPr/ISg+ VP NSg/Dq/P NPl/V3 NPr/C NPl/V3+ NPr/J/R/P NPr/ISg+ . . VB/C NSg/I+ VL3 D N🅪Sg/VB > of a book , ” thought Alice “ without pictures or conversations ? ” # P D/P NSg/VB+ . . N🅪Sg/VP NPr+ . C/P NPl/V3 NPr/C NPl/V3+ . . > # > So she was considering in her own mind ( as well as she could , for the hot day # NSg/I/J/R/C ISg+ VLPt Nᴹ/Vg/J NPr/J/R/P ISg/D$+ NSg/VB/J+ NSg/VB+ . R/C/P NSg/VB/J/R R/C/P ISg+ NSg/VXB . R/C/P D+ NSg/VB/J+ NPr🅪Sg+ > made her feel very sleepy and stupid ) , whether the pleasure of making a # VP ISg/D$+ NSg/I/VB J/R NSg/J VB/C NSg/J . . I/C D NSg/VB P Nᴹ/Vg/J D/P+ > daisy - chain would be worth the trouble of getting up and picking the daisies , # NPr+ . N🅪Sg/VB+ VXB NSg/VLXB NSg/VB/J D N🅪Sg/VB P NSg/Vg NSg/VB/J/P VB/C Nᴹ/Vg/J D NPl . > when suddenly a White Rabbit with pink eyes ran close by her . # NSg/I/C R D/P NPr🅪Sg/VB/J NSg/VB+ P N🅪Sg/VB/J NPl/V3+ NSg/VPt NSg/VB/J NSg/P ISg/D$+ . > # > There was nothing so very remarkable in that ; nor did Alice think it so very # R+ VLPt NSg/I/J+ NSg/I/J/R/C J/R J NPr/J/R/P NSg/I/C/Ddem+ . NSg/C VXPt NPr+ NSg/VB NPr/ISg+ NSg/I/J/R/C J/R > much out of the way to hear the Rabbit say to itself , “ Oh dear ! Oh dear ! I shall # NSg/I/J/R/Dq NSg/VB/J/R/P P D+ NSg/J+ P VB D+ NSg/VB+ NSg/VB P ISg+ . . NPr/VB NSg/VB/J . NPr/VB NSg/VB/J . ISg/#r+ VXB > be late ! ” ( when she thought it over afterwards , it occurred to her that she # NSg/VLXB NSg/J . . . NSg/I/C ISg+ N🅪Sg/VP NPr/ISg+ NSg/J/P R/Comm . NPr/ISg+ VP P ISg/D$+ NSg/I/C/Ddem ISg+ > ought to have wondered at this , but at the time it all seemed quite natural ) ; # NSg/I/VXB P NSg/VXB VP/J NSg/P I/Ddem+ . NSg/C/P NSg/P D+ N🅪Sg/VB/J+ NPr/ISg+ NSg/I/J/C/Dq VP/J R NSg/J . . > but when the Rabbit actually took a watch out of its waistcoat - pocket , and # NSg/C/P NSg/I/C D+ NSg/VB+ R VPt D/P+ NSg/VB+ NSg/VB/J/R/P P ISg/D$+ NSg . NSg/VB/J+ . VB/C > looked at it , and then hurried on , Alice started to her feet , for it flashed # VP/J NSg/P NPr/ISg+ . VB/C NSg/J/R/C VP/J J/P . NPr+ VP/J P ISg/D$+ NPl+ . R/C/P NPr/ISg+ VP/J > across her mind that she had never before seen a rabbit with either a # NSg/P ISg/D$+ NSg/VB+ NSg/I/C/Ddem+ ISg+ VP R C/P NSg/VPp D/P NSg/VB+ P I/C D/P > waistcoat - pocket , or a watch to take out of it , and burning with curiosity , she # NSg . NSg/VB/J+ . NPr/C D/P NSg/VB P NSg/VB NSg/VB/J/R/P P NPr/ISg+ . VB/C Nᴹ/Vg/J P NSg+ . ISg+ > ran across the field after it , and fortunately was just in time to see it pop # NSg/VPt NSg/P D NSg/VB+ P NPr/ISg+ . VB/C R VLPt J/R NPr/J/R/P N🅪Sg/VB/J+ P NSg/VB NPr/ISg+ N🅪Sg/VB/J+ > down a large rabbit - hole under the hedge . # N🅪Sg/VB/J/P D/P NSg/J NSg/VB+ . NSg/VB+ NSg/J/P D NSg/VB+ . > # > In another moment down went Alice after it , never once considering how in the # NPr/J/R/P I/D+ NSg+ N🅪Sg/VB/J/P NSg/VPt NPr+ P NPr/ISg+ . R NSg/C Nᴹ/Vg/J NSg/C NPr/J/R/P D+ > world she was to get out again . # NSg/VB+ ISg+ VLPt P NSg/VB NSg/VB/J/R/P P . > # > The rabbit - hole went straight on like a tunnel for some way , and then dipped # D+ NSg/VB+ . NSg/VB+ NSg/VPt NSg/VB/J/R J/P NSg/VB/J/C/P D/P NSg/VB R/C/P I/J/R/Dq+ NSg/J+ . VB/C NSg/J/R/C VP/J > suddenly down , so suddenly that Alice had not a moment to think about stopping # R N🅪Sg/VB/J/P . NSg/I/J/R/C R NSg/I/C/Ddem NPr+ VP NSg/R/C D/P NSg P NSg/VB J/P NSg/Vg > herself before she found herself falling down a very deep well . # ISg+ C/P ISg+ NSg/VP ISg+ Nᴹ/Vg/J N🅪Sg/VB/J/P D/P J/R NSg/J NSg/VB/J/R . > # > Either the well was very deep , or she fell very slowly , for she had plenty of # I/C D NSg/VB/J/R VLPt J/R NSg/J . NPr/C ISg+ NSg/VPt/J J/R R . R/C/P ISg+ VP NSg/I/J P > time as she went down to look about her and to wonder what was going to happen # N🅪Sg/VB/J+ R/C/P ISg+ NSg/VPt N🅪Sg/VB/J/P P NSg/VB J/P ISg/D$+ VB/C P N🅪Sg/VB NSg/I+ VLPt Nᴹ/Vg/J P VB > next . First , she tried to look down and make out what she was coming to , but it # NSg/J/P . NSg/J . ISg+ VP/J P NSg/VB N🅪Sg/VB/J/P VB/C NSg/VB NSg/VB/J/R/P NSg/I+ ISg+ VLPt Nᴹ/Vg/J P . NSg/C/P NPr/ISg+ > was too dark to see anything ; then she looked at the sides of the well , and # VLPt R NSg/VB/J P NSg/VB NSg/I/VB+ . NSg/J/R/C ISg+ VP/J NSg/P D NPl/V3 P D NSg/VB/J/R . VB/C > noticed that they were filled with cupboards and book - shelves ; here and there # VP/J NSg/I/C/Ddem IPl+ NSg/VLPt VP/J P NPl/V3 VB/C NSg/VB+ . NPl/V3+ . J/R VB/C R+ > she saw maps and pictures hung upon pegs . She took down a jar from one of the # ISg+ NSg/VPt NPl/V3 VB/C NPl/V3+ NPr/VP/J P NPl/V3 . ISg+ VPt N🅪Sg/VB/J/P D/P+ NSg/VB+ P NSg/I/J P D+ > shelves as she passed ; it was labelled “ ORANGE MARMALADE ” , but to her great # NPl/V3+ R/C/P ISg+ VP/J . NPr/ISg+ VLPt VP/J/Comm . NPr🅪Sg/VB/J Nᴹ/VB . . NSg/C/P P ISg/D$+ NSg/J > disappointment it was empty : she did not like to drop the jar for fear of # NSg+ NPr/ISg+ VLPt NSg/VB/J . ISg+ VXPt NSg/R/C NSg/VB/J/C/P P NSg/VB D NSg/VB+ R/C/P N🅪Sg/VB+ P > killing somebody underneath , so managed to put it into one of the cupboards as # Nᴹ/Vg/J NSg/I+ NSg/J/P . NSg/I/J/R/C VP/J P NSg/VBP NPr/ISg+ P NSg/I/J P D NPl/V3 R/C/P > she fell past it . # ISg+ NSg/VPt/J NSg/VB/J/P NPr/ISg+ . > # > “ Well ! ” thought Alice to herself , “ after such a fall as this , I shall think # . NSg/VB/J/R . . N🅪Sg/VP NPr+ P ISg+ . . P NSg/I D/P+ N🅪Sg/VB+ R/C/P I/Ddem+ . ISg/#r+ VXB NSg/VB > nothing of tumbling down stairs ! How brave they’ll all think me at home ! Why , I # NSg/I/J+ P Nᴹ/Vg/J N🅪Sg/VB/J/P NPl+ . NSg/C NSg/VB/J K NSg/I/J/C/Dq NSg/VB NPr/ISg+ NSg/P NSg/VB/J+ . NSg/VB . ISg/#r+ > wouldn’t say anything about it , even if I fell off the top of the house ! ” ( Which # VXB NSg/VB NSg/I/VB+ J/P NPr/ISg+ . NSg/VB/J/R NSg/C ISg/#r+ NSg/VPt/J NSg/VB/J/P D NSg/VB/J P D NPr/VB+ . . . I/C+ > was very likely true . ) # VLPt J/R NSg/J NSg/VB/J . . > # > Down , down , down . Would the fall never come to an end ? “ I wonder how many miles # N🅪Sg/VB/J/P . N🅪Sg/VB/J/P . N🅪Sg/VB/J/P . VXB D+ N🅪Sg/VB+ R NSg/VBPp/P P D/P+ NSg/VB+ . . ISg/#r+ N🅪Sg/VB NSg/C NSg/I/J/Dq+ NPrPl+ > I’ve fallen by this time ? ” she said aloud . “ I must be getting somewhere near the # K VPp/J NSg/P I/Ddem N🅪Sg/VB/J+ . . ISg+ VP/J J . . ISg/#r+ NSg/VXB NSg/VLXB NSg/Vg NSg NSg/VB/J/P D > centre of the earth . Let me see : that would be four thousand miles down , I # NSg/VB/Comm P D+ NPrᴹ/VB+ . NSg/VBP NPr/ISg+ NSg/VB . NSg/I/C/Ddem+ VXB NSg/VLXB NSg+ NSg+ NPrPl+ N🅪Sg/VB/J/P . ISg/#r+ > think — ” ( for , you see , Alice had learnt several things of this sort in her # NSg/VB . . . R/C/P . ISgPl+ NSg/VB . NPr+ VP VB J/Dq NPl P I/Ddem+ NSg/VB+ NPr/J/R/P ISg/D$+ > lessons in the schoolroom , and though this was not a very good opportunity for # NPl/V3+ NPr/J/R/P D NSg . VB/C C I/Ddem+ VLPt NSg/R/C D/P J/R NPr/VB/J N🅪Sg+ R/C/P > showing off her knowledge , as there was no one to listen to her , still it was # Nᴹ/Vg/J+ NSg/VB/J/P ISg/D$+ Nᴹ+ . R/C/P R+ VLPt NSg/Dq/P NSg/I/J+ P NSg/VB P ISg/D$+ . NSg/VB/J/R NPr/ISg+ VLPt > good practice to say it over ) “ — yes , that’s about the right distance — but then I # NPr/VB/J NSg/VB+ P NSg/VB NPr/ISg+ NSg/J/P . . . NPl/VB . NSg$ J/P D NPr/VB/J N🅪Sg/VB+ . NSg/C/P NSg/J/R/C ISg/#r+ > wonder what Latitude or Longitude I’ve got to ? ” ( Alice had no idea what Latitude # N🅪Sg/VB NSg/I+ NSg NPr/C NSg+ K VP P . . . NPr+ VP NSg/Dq/P+ NSg+ NSg/I+ NSg+ > was , or Longitude either , but thought they were nice grand words to say . ) # VLPt . NPr/C NSg+ I/C . NSg/C/P N🅪Sg/VP IPl+ NSg/VLPt NPr/J NSg/J NPl/V3 P NSg/VB . . > # > Presently she began again . “ I wonder if I shall fall right through the earth ! # R ISg+ VPt P . . ISg/#r+ N🅪Sg/VB NSg/C ISg/#r+ VXB N🅪Sg/VB+ NPr/VB/J NSg/J/P D+ NPrᴹ/VB+ . > How funny it’ll seem to come out among the people that walk with their heads # NSg/C NSg/J K VB P NSg/VBPp/P NSg/VB/J/R/P P D NPl/VB+ NSg/I/C/Ddem+ NSg/VB P D$+ NPl/V3+ > downward ! The Antipathies , I think — ” ( she was rather glad there was no one # J/R . D NPl . ISg/#r+ NSg/VB . . . ISg+ VLPt NPr/VB/J/R NSg/VB/J R+ VLPt NSg/Dq/P NSg/I/J+ > listening , this time , as it didn’t sound at all the right word ) “ — but I shall # Nᴹ/Vg/J . I/Ddem N🅪Sg/VB/J+ . R/C/P NPr/ISg+ VXPt N🅪Sg/VB/J+ NSg/P NSg/I/J/C/Dq D NPr/VB/J NSg/VB+ . . . NSg/C/P ISg/#r+ VXB > have to ask them what the name of the country is , you know . Please , Ma’am , is # NSg/VXB P NSg/VB NSg/IPl+ NSg/I+ D NSg/VB P D NSg/J+ VL3 . ISgPl+ VB . VB . NSg/VB . VL3 > this New Zealand or Australia ? ” ( and she tried to curtsey as she spoke — fancy # I/Ddem NSg/J NPr NPr/C NPr+ . . . VB/C ISg+ VP/J P ? R/C/P ISg+ NSg/VPt . NSg/VB/J > curtseying as you’re falling through the air ! Do you think you could manage it ? ) # ? R/C/P K Nᴹ/Vg/J NSg/J/P D N🅪Sg/VB+ . VXB ISgPl+ NSg/VB ISgPl+ NSg/VXB NSg/VB NPr/ISg+ . . > “ And what an ignorant little girl she’ll think me for asking ! No , it’ll never do # . VB/C NSg/I+ D/P+ NSg/J+ NPr/I/J/Dq+ NSg/VB+ K NSg/VB NPr/ISg+ R/C/P Nᴹ/Vg/J . NSg/Dq/P . K R VXB > to ask : perhaps I shall see it written up somewhere . ” # P NSg/VB . NSg/R ISg/#r+ VXB NSg/VB NPr/ISg+ VPp/J NSg/VB/J/P NSg . . > # > Down , down , down . There was nothing else to do , so Alice soon began talking # N🅪Sg/VB/J/P . N🅪Sg/VB/J/P . N🅪Sg/VB/J/P . R+ VLPt NSg/I/J+ NSg/J/C P VXB . NSg/I/J/R/C NPr+ J/R VPt Nᴹ/Vg/J > again . “ Dinah’ll miss me very much to - night , I should think ! ” ( Dinah was the # P . . ? NSg/VB NPr/ISg+ J/R NSg/I/J/R/Dq P . N🅪Sg/VB+ . ISg/#r+ VXB NSg/VB . . . NPr VLPt D > cat . ) “ I hope they’ll remember her saucer of milk at tea - time . Dinah my dear ! I # NSg/VB/J+ . . . ISg/#r+ NPr🅪Sg/VB K NSg/VB ISg/D$+ NSg/VB P N🅪Sg/VB+ NSg/P N🅪Sg/VB+ . N🅪Sg/VB/J+ . NPr D$+ NSg/VB/J . ISg/#r+ > wish you were down here with me ! There are no mice in the air , I’m afraid , but # NSg/VB ISgPl+ NSg/VLPt N🅪Sg/VB/J/P J/R P NPr/ISg+ . R+ VLB NSg/Dq/P NPl/VB NPr/J/R/P D+ N🅪Sg/VB+ . K J . NSg/C/P > you might catch a bat , and that’s very like a mouse , you know . But do cats eat # ISgPl+ Nᴹ/VXB/J NSg/VB D/P NSg/VB+ . VB/C NSg$ J/R NSg/VB/J/C/P D/P NSg/VB+ . ISgPl+ VB . NSg/C/P VXB NPl/V3+ VB > bats , I wonder ? ” And here Alice began to get rather sleepy , and went on saying # NPl/V3 . ISg/#r+ N🅪Sg/VB . . VB/C J/R NPr+ VPt P NSg/VB NPr/VB/J/R NSg/J . VB/C NSg/VPt J/P N🅪Sg/Vg/J > to herself , in a dreamy sort of way , “ Do cats eat bats ? Do cats eat bats ? ” and # P ISg+ . NPr/J/R/P D/P J NSg/VB P NSg/J+ . . VXB NPl/V3+ VB NPl/V3 . VXB NPl/V3+ VB NPl/V3 . . VB/C > sometimes , “ Do bats eat cats ? ” for , you see , as she couldn’t answer either # R . . VXB NPl/V3 VB NPl/V3+ . . R/C/P . ISgPl+ NSg/VB . R/C/P ISg+ VXB NSg/VB+ I/C > question , it didn’t much matter which way she put it . She felt that she was # NSg/VB+ . NPr/ISg+ VXPt NSg/I/J/R/Dq N🅪Sg/VB I/C+ NSg/J+ ISg+ NSg/VBP NPr/ISg+ . ISg+ N🅪Sg/VP/J NSg/I/C/Ddem ISg+ VLPt > dozing off , and had just begun to dream that she was walking hand in hand with # Nᴹ/Vg/J NSg/VB/J/P . VB/C VP J/R VPp P NSg/VB/J NSg/I/C/Ddem ISg+ VLPt Nᴹ/Vg/J NSg/VB+ NPr/J/R/P NSg/VB+ P > Dinah , and saying to her very earnestly , “ Now , Dinah , tell me the truth : did you # NPr . VB/C N🅪Sg/Vg/J P ISg/D$+ J/R R . . NSg/J/R/C . NPr . NPr/VB NPr/ISg+ D N🅪Sg/VB+ . VXPt ISgPl+ > ever eat a bat ? ” when suddenly , thump ! thump ! down she came upon a heap of # J/R VB D/P NSg/VB+ . . NSg/I/C R . NSg/VB+ . NSg/VB+ . N🅪Sg/VB/J/P ISg+ NSg/VPt/P P D/P NSg/VB P > sticks and dry leaves , and the fall was over . # NPl/V3 VB/C NSg/VB/J+ NPl/V3+ . VB/C D+ N🅪Sg/VB+ VLPt NSg/J/P . > # > Alice was not a bit hurt , and she jumped up on to her feet in a moment : she # NPr+ VLPt NSg/R/C D/P NSg/VPt NSg/VBP/J . VB/C ISg+ VP/J NSg/VB/J/P J/P P ISg/D$+ NPl+ NPr/J/R/P D/P+ NSg+ . ISg+ > looked up , but it was all dark overhead ; before her was another long passage , # VP/J NSg/VB/J/P . NSg/C/P NPr/ISg+ VLPt NSg/I/J/C/Dq NSg/VB/J NSg/J/P . C/P ISg/D$+ VLPt I/D NPr/VB/J NSg/VB/J . > and the White Rabbit was still in sight , hurrying down it . There was not a # VB/C D+ NPr🅪Sg/VB/J+ NSg/VB+ VLPt NSg/VB/J/R NPr/J/R/P N🅪Sg/VB+ . Nᴹ/Vg/J N🅪Sg/VB/J/P NPr/ISg+ . R+ VLPt NSg/R/C D/P > moment to be lost : away went Alice like the wind , and was just in time to hear # NSg+ P NSg/VLXB VP/J . VB/J NSg/VPt NPr+ NSg/VB/J/C/P D+ N🅪Sg/VB+ . VB/C VLPt J/R NPr/J/R/P N🅪Sg/VB/J+ P VB > it say , as it turned a corner , “ Oh my ears and whiskers , how late it’s getting ! ” # NPr/ISg+ NSg/VB . R/C/P NPr/ISg+ VP/J D/P+ NSg/VB+ . . NPr/VB D$+ NPl/V3+ VB/C NPl . NSg/C NSg/J K NSg/Vg . . > She was close behind it when she turned the corner , but the Rabbit was no longer # ISg+ VLPt NSg/VB/J NSg/J/P NPr/ISg+ NSg/I/C ISg+ VP/J D+ NSg/VB+ . NSg/C/P D+ NSg/VB+ VLPt NSg/Dq/P NSg/JC > to be seen : she found herself in a long , low hall , which was lit up by a row of # P NSg/VLXB NSg/VPp . ISg+ NSg/VP ISg+ NPr/J/R/P D/P NPr/VB/J . NSg/VB/J/R+ NPr+ . I/C+ VLPt NSg/VP/J NSg/VB/J/P NSg/P D/P NSg/VB P > lamps hanging from the roof . # NPl/V3+ Nᴹ/Vg/J P D+ NSg/VB+ . > # > There were doors all round the hall , but they were all locked ; and when Alice # R+ NSg/VLPt NPl/V3+ NSg/I/J/C/Dq NSg/VB/J/P D+ NPr+ . NSg/C/P IPl+ NSg/VLPt NSg/I/J/C/Dq VP/J . VB/C NSg/I/C NPr+ > had been all the way down one side and up the other , trying every door , she # VP NSg/VLPp NSg/I/J/C/Dq D NSg/J N🅪Sg/VB/J/P NSg/I/J+ NSg/VB/J+ VB/C NSg/VB/J/P D NSg/VB/J . Nᴹ/Vg/J Dq+ NSg/VB+ . ISg+ > walked sadly down the middle , wondering how she was ever to get out again . # VP/J R N🅪Sg/VB/J/P D NSg/VB/J . Nᴹ/Vg/J NSg/C ISg+ VLPt J/R P NSg/VB NSg/VB/J/R/P P . > # > Suddenly she came upon a little three - legged table , all made of solid glass ; # R ISg+ NSg/VPt/P P D/P NPr/I/J/Dq NSg . NSg/VP/J NSg/VB+ . NSg/I/J/C/Dq VP P NSg/J NPr🅪Sg/VB+ . > there was nothing on it except a tiny golden key , and Alice’s first thought was # R+ VLPt NSg/I/J+ J/P NPr/ISg+ VB/C/P D/P NSg/J NPr/VB/J NPr/VB/J . VB/C NPr$ NSg/J+ N🅪Sg/VP+ VLPt > that it might belong to one of the doors of the hall ; but , alas ! either the # NSg/I/C/Ddem NPr/ISg+ Nᴹ/VXB/J VB/P P NSg/I/J P D NPl/V3 P D NPr+ . NSg/C/P . NPrPl . I/C D+ > locks were too large , or the key was too small , but at any rate it would not # NPl/V3+ NSg/VLPt R NSg/J . NPr/C D NPr/VB/J VLPt R NPr/VB/J . NSg/C/P NSg/P I/R/Dq+ NSg/VB+ NPr/ISg+ VXB NSg/R/C > open any of them . However , on the second time round , she came upon a low curtain # NSg/VB/J I/R/Dq P NSg/IPl+ . C . J/P D+ NSg/VB/J+ N🅪Sg/VB/J+ NSg/VB/J/P . ISg+ NSg/VPt/P P D/P+ NSg/VB/J/R+ NSg/VB+ > she had not noticed before , and behind it was a little door about fifteen inches # ISg+ VP NSg/R/C VP/J C/P . VB/C NSg/J/P NPr/ISg+ VLPt D/P NPr/I/J/Dq NSg/VB J/P NSg+ NPl/V3+ > high : she tried the little golden key in the lock , and to her great delight it # NSg/VB/J/R . ISg+ VP/J D NPr/I/J/Dq NPr/VB/J NPr/VB/J NPr/J/R/P D+ NSg/VB+ . VB/C P ISg/D$+ NSg/J+ N🅪Sg/VB/J+ NPr/ISg+ > fitted ! # NSg/VP/J . > # > Alice opened the door and found that it led into a small passage , not much # NPr+ VP/J D+ NSg/VB+ VB/C NSg/VP NSg/I/C/Ddem NPr/ISg+ NSg/VP/J P D/P+ NPr/VB/J+ NSg/VB/J+ . NSg/R/C NSg/I/J/R/Dq > larger than a rat - hole : she knelt down and looked along the passage into the # JC C/P D/P NSg/VB+ . NSg/VB+ . ISg+ VP N🅪Sg/VB/J/P VB/C VP/J P D NSg/VB/J+ P D > loveliest garden you ever saw . How she longed to get out of that dark hall , and # JS NSg/VB/J+ ISgPl+ J/R NSg/VPt . NSg/C ISg+ VP/J P NSg/VB NSg/VB/J/R/P P NSg/I/C/Ddem+ NSg/VB/J+ NPr+ . VB/C > wander about among those beds of bright flowers and those cool fountains , but # NSg/VB J/P P I/Ddem NPl/V3 P NPr/VB/J+ NPrPl/V3+ VB/C I/Ddem NSg/VB/J NPl/V3 . NSg/C/P > she could not even get her head through the doorway ; “ and even if my head would # ISg+ NSg/VXB NSg/R/C NSg/VB/J/R NSg/VB ISg/D$+ NPr/VB/J+ NSg/J/P D NSg+ . . VB/C NSg/VB/J/R NSg/C D$+ NPr/VB/J+ VXB > go through , ” thought poor Alice , “ it would be of very little use without my # NSg/VB/J NSg/J/P . . N🅪Sg/VP NSg/VB/J NPr+ . . NPr/ISg+ VXB NSg/VLXB P J/R NPr/I/J/Dq N🅪Sg/VB C/P D$+ > shoulders . Oh , how I wish I could shut up like a telescope ! I think I could , if # NPl/V3+ . NPr/VB . NSg/C ISg/#r+ NSg/VB ISg/#r+ NSg/VXB NSg/VBP/J NSg/VB/J/P NSg/VB/J/C/P D/P+ NSg/VB+ . ISg/#r+ NSg/VB ISg/#r+ NSg/VXB . NSg/C > I only knew how to begin . ” For , you see , so many out - of - the - way things had # ISg/#r+ J/R/C VPt NSg/C P NSg/VB . . R/C/P . ISgPl+ NSg/VB . NSg/I/J/R/C NSg/I/J/Dq NSg/VB/J/R/P . P . D . NSg/J NPl+ VP > happened lately , that Alice had begun to think that very few things indeed were # VP/J R . NSg/I/C/Ddem NPr+ VP VPp P NSg/VB NSg/I/C/Ddem J/R NSg/I/Dq+ NPl+ R NSg/VLPt > really impossible . # R NSg/J . > # > There seemed to be no use in waiting by the little door , so she went back to the # R+ VP/J P NSg/VLXB NSg/Dq/P N🅪Sg/VB NPr/J/R/P Nᴹ/Vg/J+ NSg/P D+ NPr/I/J/Dq+ NSg/VB+ . NSg/I/J/R/C ISg+ NSg/VPt NSg/VB/J P D+ > table , half hoping she might find another key on it , or at any rate a book of # NSg/VB+ . N🅪Sg/J/P+ Nᴹ/Vg/J ISg+ Nᴹ/VXB/J NSg/VB I/D NPr/VB/J J/P NPr/ISg+ . NPr/C NSg/P I/R/Dq NSg/VB+ D/P NSg/VB P > rules for shutting people up like telescopes : this time she found a little # NPl/V3+ R/C/P NSg/Vg NPl/VB+ NSg/VB/J/P NSg/VB/J/C/P NPl/V3 . I/Ddem N🅪Sg/VB/J+ ISg+ NSg/VP D/P NPr/I/J/Dq > bottle on it , ( “ which certainly was not here before , ” said Alice , ) and round the # NSg/VB+ J/P NPr/ISg+ . . . I/C+ R VLPt NSg/R/C J/R C/P . . VP/J NPr+ . . VB/C NSg/VB/J/P D > neck of the bottle was a paper label , with the words “ DRINK ME , ” beautifully # NSg/VB P D NSg/VB+ VLPt D/P N🅪Sg/VB/J+ NSg/VB+ . P D NPl/V3+ . NSg/VB+ NPr/ISg+ . . R > printed on it in large letters . # VP/J J/P NPr/ISg+ NPr/J/R/P NSg/J NPl/V3+ . > # > It was all very well to say “ Drink me , ” but the wise little Alice was not going # NPr/ISg+ VLPt NSg/I/J/C/Dq J/R NSg/VB/J/R P NSg/VB . NSg/VB+ NPr/ISg+ . . NSg/C/P D+ NPr/VB/J+ NPr/I/J/Dq+ NPr+ VLPt NSg/R/C Nᴹ/Vg/J > to do that in a hurry . “ No , I’ll look first , ” she said , “ and see whether it’s # P VXB NSg/I/C/Ddem+ NPr/J/R/P D/P+ NSg/VB+ . . NSg/Dq/P . K NSg/VB NSg/J . . ISg+ VP/J . . VB/C NSg/VB I/C K > marked ‘ poison ’ or not ” ; for she had read several nice little histories about # VP/J Unlintable N🅪Sg/VB+ . NPr/C NSg/R/C . . R/C/P ISg+ VP NSg/VBP J/Dq NPr/J NPr/I/J/Dq NPl J/P > children who had got burnt , and eaten up by wild beasts and other unpleasant # NPl+ NPr/I+ VP VP VB/J . VB/C VPp/J NSg/VB/J/P NSg/P NSg/VB/J NPl/V3 VB/C NSg/VB/J NSg/J > things , all because they would not remember the simple rules their friends had # NPl+ . NSg/I/J/C/Dq C/P IPl+ VXB NSg/R/C NSg/VB D NSg/VB/J NPl/V3+ D$+ NPrPl/V3+ VP > taught them : such as , that a red - hot poker will burn you if you hold it too # VP NSg/IPl+ . NSg/I R/C/P . NSg/I/C/Ddem D/P N🅪Sg/J . NSg/VB/J NSg/VB+ NPr/VXB NSg/VB ISgPl+ NSg/C ISgPl+ NSg/VB/J NPr/ISg+ R > long ; and that if you cut your finger very deeply with a knife , it usually # NPr/VB/J . VB/C NSg/I/C/Ddem NSg/C ISgPl+ NSg/VBP/J D$+ NSg/VB+ J/R R P D/P NSg/VB+ . NPr/ISg+ R > bleeds ; and she had never forgotten that , if you drink much from a bottle marked # NPl/V3 . VB/C ISg+ VP R NSg/VPp/J NSg/I/C/Ddem+ . NSg/C ISgPl+ NSg/VB+ NSg/I/J/R/Dq P D/P NSg/VB+ VP/J > “ poison , ” it is almost certain to disagree with you , sooner or later . # . N🅪Sg/VB+ . . NPr/ISg+ VL3 R I/J P VB P ISgPl+ . JC NPr/C JC . > # > However , this bottle was not marked “ poison , ” so Alice ventured to taste it , and # C . I/Ddem+ NSg/VB+ VLPt NSg/R/C VP/J . N🅪Sg/VB+ . . NSg/I/J/R/C NPr+ VP/J P NSg/VB/J NPr/ISg+ . VB/C > finding it very nice , ( it had , in fact , a sort of mixed flavour of cherry - tart , # Nᴹ/Vg/J NPr/ISg+ J/R NPr/J . . NPr/ISg+ VP . NPr/J/R/P NSg+ . D/P NSg/VB P VP/J N🅪Sg/VB/Comm P NPr🅪Sg/J+ . NSg/VB/J . > custard , pine - apple , roast turkey , toffee , and hot buttered toast , ) she very # N🅪Sg . NSg/VB . NPr🅪Sg+ . N🅪Sg/VB/J NPr🅪Sg/J+ . N🅪Sg/VB . VB/C NSg/VB/J VP/J N🅪Sg/VB+ . . ISg+ J/R > soon finished it off . # J/R VP/J NPr/ISg+ NSg/VB/J/P . > # > “ What a curious feeling ! ” said Alice ; “ I must be shutting up like a telescope . ” # . NSg/I+ D/P+ J+ N🅪Sg/Vg/J+ . . VP/J NPr+ . . ISg/#r+ NSg/VXB NSg/VLXB NSg/Vg NSg/VB/J/P NSg/VB/J/C/P D/P NSg/VB+ . . > # > And so it was indeed : she was now only ten inches high , and her face brightened # VB/C NSg/I/J/R/C NPr/ISg+ VLPt R . ISg+ VLPt NSg/J/R/C J/R/C NSg NPl/V3+ NSg/VB/J/R . VB/C ISg/D$+ NSg/VB+ VP/J > up at the thought that she was now the right size for going through the little # NSg/VB/J/P NSg/P D N🅪Sg/VP NSg/I/C/Ddem ISg+ VLPt NSg/J/R/C D NPr/VB/J N🅪Sg/VB+ R/C/P Nᴹ/Vg/J NSg/J/P D NPr/I/J/Dq > door into that lovely garden . First , however , she waited for a few minutes to # NSg/VB+ P NSg/I/C/Ddem NSg/J NSg/VB/J+ . NSg/J . C . ISg+ VP/J R/C/P D/P+ NSg/I/Dq+ NPl/V3+ P > see if she was going to shrink any further : she felt a little nervous about # NSg/VB NSg/C ISg+ VLPt Nᴹ/Vg/J P NSg/VB I/R/Dq VB/JC . ISg+ N🅪Sg/VP/J D/P NPr/I/J/Dq J J/P > this ; “ for it might end , you know , ” said Alice to herself , “ in my going out # I/Ddem+ . . R/C/P NPr/ISg+ Nᴹ/VXB/J NSg/VB+ . ISgPl+ VB . . VP/J NPr+ P ISg+ . . NPr/J/R/P D$+ Nᴹ/Vg/J NSg/VB/J/R/P > altogether , like a candle . I wonder what I should be like then ? ” And she tried # NSg . NSg/VB/J/C/P D/P+ NSg/VB+ . ISg/#r+ N🅪Sg/VB NSg/I+ ISg/#r+ VXB NSg/VLXB NSg/VB/J/C/P NSg/J/R/C . . VB/C ISg+ VP/J > to fancy what the flame of a candle is like after the candle is blown out , for # P NSg/VB/J NSg/I+ D NSg/VB/J P D/P+ NSg/VB+ VL3 NSg/VB/J/C/P P D+ NSg/VB+ VL3 VPp/J NSg/VB/J/R/P . R/C/P > she could not remember ever having seen such a thing . # ISg+ NSg/VXB NSg/R/C NSg/VB J/R Nᴹ/Vg/J NSg/VPp NSg/I+ D/P+ NSg+ . > # > After a while , finding that nothing more happened , she decided on going into the # P D/P+ NSg/VB/C/P+ . Nᴹ/Vg/J NSg/I/C/Ddem NSg/I/J+ NPr/I/J/R/Dq VP/J . ISg+ NSg/VP/J J/P Nᴹ/Vg/J P D+ > garden at once ; but , alas for poor Alice ! when she got to the door , she found # NSg/VB/J+ NSg/P NSg/C . NSg/C/P . NPrPl R/C/P NSg/VB/J+ NPr+ . NSg/I/C ISg+ VP P D+ NSg/VB+ . ISg+ NSg/VP > she had forgotten the little golden key , and when she went back to the table for # ISg+ VP NSg/VPp/J D NPr/I/J/Dq NPr/VB/J NPr/VB/J . VB/C NSg/I/C ISg+ NSg/VPt NSg/VB/J P D+ NSg/VB+ R/C/P > it , she found she could not possibly reach it : she could see it quite plainly # NPr/ISg+ . ISg+ NSg/VP ISg+ NSg/VXB NSg/R/C R NSg/VB NPr/ISg+ . ISg+ NSg/VXB NSg/VB NPr/ISg+ R R > through the glass , and she tried her best to climb up one of the legs of the # NSg/J/P D NPr🅪Sg/VB+ . VB/C ISg+ VP/J ISg/D$+ NPr/VXB/JS P NSg/VB NSg/VB/J/P NSg/I/J P D NPl/V3 P D > table , but it was too slippery ; and when she had tired herself out with trying , # NSg/VB+ . NSg/C/P NPr/ISg+ VLPt R J . VB/C NSg/I/C ISg+ VP VP/J ISg+ NSg/VB/J/R/P P Nᴹ/Vg/J . > the poor little thing sat down and cried . # D NSg/VB/J NPr/I/J/Dq NSg+ NSg/VP/J N🅪Sg/VB/J/P VB/C VP/J . > # > “ Come , there’s no use in crying like that ! ” said Alice to herself , rather # . NSg/VBPp/P . K NSg/Dq/P N🅪Sg/VB NPr/J/R/P Nᴹ/Vg/J NSg/VB/J/C/P NSg/I/C/Ddem+ . . VP/J NPr+ P ISg+ . NPr/VB/J/R > sharply ; “ I advise you to leave off this minute ! ” She generally gave herself # R . . ISg/#r+ NSg/VB ISgPl+ P NSg/VB NSg/VB/J/P I/Ddem+ NSg/VB/J+ . . ISg+ R VPt ISg+ > very good advice , ( though she very seldom followed it ) , and sometimes she # J/R NPr/VB/J+ Nᴹ+ . . C ISg+ J/R R VP/J NPr/ISg+ . . VB/C R ISg+ > scolded herself so severely as to bring tears into her eyes ; and once she # VP/J ISg+ NSg/I/J/R/C R R/C/P P VB NPl/V3+ P ISg/D$+ NPl/V3+ . VB/C NSg/C ISg+ > remembered trying to box her own ears for having cheated herself in a game of # VP/J Nᴹ/Vg/J P NSg/VB ISg/D$+ NSg/VB/J NPl/V3+ R/C/P Nᴹ/Vg/J VP/J ISg+ NPr/J/R/P D/P NSg/VB/J+ P > croquet she was playing against herself , for this curious child was very fond of # NSg/VB ISg+ VLPt Nᴹ/Vg/J C/P ISg+ . R/C/P I/Ddem J NSg/VB+ VLPt J/R NSg/VB/J P > pretending to be two people . “ But it’s no use now , ” thought poor Alice , “ to # Nᴹ/Vg/J P NSg/VLXB NSg NPl/VB+ . . NSg/C/P K NSg/Dq/P N🅪Sg/VB NSg/J/R/C . . N🅪Sg/VP NSg/VB/J NPr+ . . P > pretend to be two people ! Why , there’s hardly enough of me left to make one # NSg/VB/J P NSg/VLXB NSg NPl/VB+ . NSg/VB . K R NSg/I P NPr/ISg+ NPr/VP/J P NSg/VB NSg/I/J > respectable person ! ” # NSg/J NSg/VB+ . . > # > Soon her eye fell on a little glass box that was lying under the table : she # J/R ISg/D$+ NSg/VB+ NSg/VPt/J J/P D/P+ NPr/I/J/Dq+ NPr🅪Sg/VB+ NSg/VB+ NSg/I/C/Ddem+ VLPt Nᴹ/Vg/J NSg/J/P D+ NSg/VB+ . ISg+ > opened it , and found in it a very small cake , on which the words “ EAT ME ” were # VP/J NPr/ISg+ . VB/C NSg/VP NPr/J/R/P NPr/ISg+ D/P J/R NPr/VB/J+ N🅪Sg/VB+ . J/P I/C+ D+ NPl/V3+ . VB NPr/ISg+ . NSg/VLPt > beautifully marked in currants . “ Well , I’ll eat it , ” said Alice , “ and if it # R VP/J NPr/J/R/P NPl . . NSg/VB/J/R . K VB NPr/ISg+ . . VP/J NPr+ . . VB/C NSg/C NPr/ISg+ > makes me grow larger , I can reach the key ; and if it makes me grow smaller , I # NPl/V3 NPr/ISg+ VB JC . ISg/#r+ NPr/VXB NSg/VB D NPr/VB/J . VB/C NSg/C NPr/ISg+ NPl/V3 NPr/ISg+ VB NSg/JC . ISg/#r+ > can creep under the door ; so either way I’ll get into the garden , and I don’t # NPr/VXB NSg/VB+ NSg/J/P D NSg/VB+ . NSg/I/J/R/C I/C NSg/J+ K NSg/VB P D NSg/VB/J+ . VB/C ISg/#r+ VXB > care which happens ! ” # N🅪Sg/VB+ I/C+ V3 . . > # > She ate a little bit , and said anxiously to herself , “ Which way ? Which way ? ” , # ISg+ NSg/VPt D/P+ NPr/I/J/Dq+ NSg/VPt+ . VB/C VP/J R P ISg+ . . I/C+ NSg/J+ . I/C+ NSg/J+ . . . > holding her hand on the top of her head to feel which way it was growing , and # Nᴹ/Vg/J ISg/D$+ NSg/VB+ J/P D NSg/VB/J P ISg/D$+ NPr/VB/J+ P NSg/I/VB I/C+ NSg/J+ NPr/ISg+ VLPt Nᴹ/Vg/J . VB/C > she was quite surprised to find that she remained the same size : to be sure , # ISg+ VLPt R VP/J P NSg/VB NSg/I/C/Ddem ISg+ VP/J D+ I/J+ N🅪Sg/VB+ . P NSg/VLXB J . > this generally happens when one eats cake , but Alice had got so much into the # I/Ddem R V3 NSg/I/C NSg/I/J V3 N🅪Sg/VB+ . NSg/C/P NPr+ VP VP NSg/I/J/R/C NSg/I/J/R/Dq P D > way of expecting nothing but out - of - the - way things to happen , that it seemed # NSg/J P Nᴹ/Vg/J NSg/I/J+ NSg/C/P NSg/VB/J/R/P . P . D . NSg/J NPl P VB . NSg/I/C/Ddem NPr/ISg+ VP/J > quite dull and stupid for life to go on in the common way . # R VB/J VB/C NSg/J R/C/P N🅪Sg/VB+ P NSg/VB/J J/P NPr/J/R/P D+ NSg/VB/J+ NSg/J+ . > # > So she set to work , and very soon finished off the cake . # NSg/I/J/R/C ISg+ NPr/VBP/J P N🅪Sg/VB . VB/C J/R J/R VP/J NSg/VB/J/P D+ N🅪Sg/VB+ . > # > CHAPTER II : The Pool of Tears # HeadingStart NSg/VB+ #r . D NSg/VB P NPl/V3+ > # > “ Curiouser and curiouser ! ” cried Alice ( she was so much surprised , that for the # . ? VB/C ? . . VP/J NPr+ . ISg+ VLPt NSg/I/J/R/C NSg/I/J/R/Dq VP/J . NSg/I/C/Ddem R/C/P D+ > moment she quite forgot how to speak good English ) ; “ now I’m opening out like # NSg+ ISg+ R VPt NSg/C P NSg/VB NPr/VB/J+ NPr🅪Sg/VB/J+ . . . NSg/J/R/C K Nᴹ/Vg/J NSg/VB/J/R/P NSg/VB/J/C/P > the largest telescope that ever was ! Good - bye , feet ! ” ( for when she looked down # D JS NSg/VB+ NSg/I/C/Ddem+ J/R VLPt . NPr/VB/J . NSg/J/P . NPl+ . . . R/C/P NSg/I/C ISg+ VP/J N🅪Sg/VB/J/P > at her feet , they seemed to be almost out of sight , they were getting so far # NSg/P ISg/D$+ NPl+ . IPl+ VP/J P NSg/VLXB R NSg/VB/J/R/P P N🅪Sg/VB+ . IPl+ NSg/VLPt NSg/Vg NSg/I/J/R/C NSg/VB/J > off ) . “ Oh , my poor little feet , I wonder who will put on your shoes and # NSg/VB/J/P . . . NPr/VB . D$+ NSg/VB/J+ NPr/I/J/Dq+ NPl+ . ISg/#r+ N🅪Sg/VB NPr/I+ NPr/VXB NSg/VBP J/P D$+ NPl/V3 VB/C > stockings for you now , dears ? I’m sure I shan’t be able ! I shall be a great deal # NPl/V3+ R/C/P ISgPl+ NSg/J/R/C . NPl/V3+ . K J ISg/#r+ VXB NSg/VLXB NSg/VB/J . ISg/#r+ VXB NSg/VLXB D/P+ NSg/J+ NSg/VB/J+ > too far off to trouble myself about you : you must manage the best way you # R NSg/VB/J NSg/VB/J/P P N🅪Sg/VB ISg+ J/P ISgPl+ . ISgPl+ NSg/VXB NSg/VB D+ NPr/VXB/JS+ NSg/J+ ISgPl+ > can ; — but I must be kind to them , ” thought Alice , “ or perhaps they won’t walk the # NPr/VXB . . NSg/C/P ISg/#r+ NSg/VXB NSg/VLXB NSg/J P NSg/IPl+ . . N🅪Sg/VP NPr+ . . NPr/C NSg/R IPl+ VXB NSg/VB D > way I want to go ! Let me see : I’ll give them a new pair of boots every # NSg/J+ ISg/#r+ NSg/VB P NSg/VB/J . NSg/VBP NPr/ISg+ NSg/VB . K NSg/VB NSg/IPl+ D/P NSg/J NSg/VB P NPl/V3+ Dq > Christmas . ” # NPr/VB/J+ . . > # > And she went on planning to herself how she would manage it . “ They must go by # VB/C ISg+ NSg/VPt J/P NSg/Vg P ISg+ NSg/C ISg+ VXB NSg/VB NPr/ISg+ . . IPl+ NSg/VXB NSg/VB/J NSg/P > the carrier , ” she thought ; “ and how funny it’ll seem , sending presents to one’s # D+ NPr+ . . ISg+ N🅪Sg/VP . . VB/C NSg/C NSg/J K VB . Nᴹ/Vg/J NPl/V3+ P NSg$ > own feet ! And how odd the directions will look ! # NSg/VB/J NPl+ . VB/C NSg/C NSg/J+ D+ NPl+ NPr/VXB NSg/VB . > # > Alice’s Right Foot , Esq . , Hearthrug , near the Fender , ( with Alice’s love ) . # NPr$ NPr/VB/J+ NSg/VB+ . NSg . . NSg . NSg/VB/J/P D NSg/VB . . P NPr$ NPr🅪Sg/VB . . > # > Oh dear , what nonsense I’m talking ! ” # NPr/VB NSg/VB/J . NSg/I+ Nᴹ/VB/J+ K Nᴹ/Vg/J . . > # > Just then her head struck against the roof of the hall : in fact she was now more # J/R NSg/J/R/C ISg/D$+ NPr/VB/J+ VB C/P D NSg/VB P D+ NPr+ . NPr/J/R/P NSg+ ISg+ VLPt NSg/J/R/C NPr/I/J/R/Dq > than nine feet high , and she at once took up the little golden key and hurried # C/P NSg+ NPl+ NSg/VB/J/R . VB/C ISg+ NSg/P NSg/C VPt NSg/VB/J/P D NPr/I/J/Dq NPr/VB/J NPr/VB/J VB/C VP/J > off to the garden door . # NSg/VB/J/P P D+ NSg/VB/J+ NSg/VB+ . > # > Poor Alice ! It was as much as she could do , lying down on one side , to look # NSg/VB/J+ NPr+ . NPr/ISg+ VLPt R/C/P NSg/I/J/R/Dq R/C/P ISg+ NSg/VXB VXB . Nᴹ/Vg/J N🅪Sg/VB/J/P J/P NSg/I/J+ NSg/VB/J+ . P NSg/VB > through into the garden with one eye ; but to get through was more hopeless than # NSg/J/P P D NSg/VB/J+ P NSg/I/J+ NSg/VB+ . NSg/C/P P NSg/VB NSg/J/P VLPt NPr/I/J/R/Dq J C/P > ever : she sat down and began to cry again . # J/R . ISg+ NSg/VP/J N🅪Sg/VB/J/P VB/C VPt P NSg/VB P . > # > “ You ought to be ashamed of yourself , ” said Alice , “ a great girl like you , ” ( she # . ISgPl+ NSg/I/VXB P NSg/VLXB J P ISg+ . . VP/J NPr+ . . D/P NSg/J NSg/VB+ NSg/VB/J/C/P ISgPl+ . . . ISg+ > might well say this ) , “ to go on crying in this way ! Stop this moment , I tell # Nᴹ/VXB/J NSg/VB/J/R NSg/VB I/Ddem+ . . . P NSg/VB/J J/P Nᴹ/Vg/J NPr/J/R/P I/Ddem+ NSg/J+ . NSg/VB I/Ddem+ NSg+ . ISg/#r+ NPr/VB > you ! ” But she went on all the same , shedding gallons of tears , until there was a # ISgPl+ . . NSg/C/P ISg+ NSg/VPt J/P NSg/I/J/C/Dq D I/J . NSg/Vg NPl P NPl/V3+ . C/P R+ VLPt D/P > large pool all round her , about four inches deep and reaching half down the # NSg/J NSg/VB+ NSg/I/J/C/Dq NSg/VB/J/P ISg/D$+ . J/P NSg NPl/V3+ NSg/J VB/C Nᴹ/Vg/J N🅪Sg/J/P+ N🅪Sg/VB/J/P D > hall . # NPr+ . > # > After a time she heard a little pattering of feet in the distance , and she # P D/P+ N🅪Sg/VB/J+ ISg+ VP/J D/P NPr/I/J/Dq Nᴹ/Vg/J P NPl NPr/J/R/P D N🅪Sg/VB+ . VB/C ISg+ > hastily dried her eyes to see what was coming . It was the White Rabbit # R VP/J ISg/D$+ NPl/V3+ P NSg/VB NSg/I+ VLPt Nᴹ/Vg/J . NPr/ISg+ VLPt D NPr🅪Sg/VB/J NSg/VB > returning , splendidly dressed , with a pair of white kid gloves in one hand and a # Nᴹ/Vg/J . R VP/J . P D/P NSg/VB P NPr🅪Sg/VB/J+ NSg/VB+ NPl/V3+ NPr/J/R/P NSg/I/J NSg/VB VB/C D/P+ > large fan in the other : he came trotting along in a great hurry , muttering to # NSg/J+ NSg/VB+ NPr/J/R/P D NSg/VB/J . NPr/ISg+ NSg/VPt/P NSg/Vg/J P NPr/J/R/P D/P+ NSg/J+ NSg/VB+ . Nᴹ/Vg/J P > himself as he came , “ Oh ! the Duchess , the Duchess ! Oh ! won’t she be savage if # ISg+ R/C/P NPr/ISg+ NSg/VPt/P . . NPr/VB . D NSg/VB . D NSg/VB . NPr/VB . VXB ISg+ NSg/VLXB NPr/VB/J+ NSg/C > I’ve kept her waiting ! ” Alice felt so desperate that she was ready to ask help # K VP ISg/D$+ Nᴹ/Vg/J . . NPr+ N🅪Sg/VP/J NSg/I/J/R/C NSg/J NSg/I/C/Ddem ISg+ VLPt NSg/VB/J P NSg/VB NSg/VB > of any one ; so , when the Rabbit came near her , she began , in a low , timid voice , # P I/R/Dq+ NSg/I/J+ . NSg/I/J/R/C . NSg/I/C D+ NSg/VB+ NSg/VPt/P NSg/VB/J/P ISg/D$+ . ISg+ VPt . NPr/J/R/P D/P NSg/VB/J/R . J+ NSg/VB+ . > “ If you please , sir — ” The Rabbit started violently , dropped the white kid gloves # . NSg/C ISgPl+ VB . NPr/VB+ . . D+ NSg/VB+ VP/J R . VP/J D+ NPr🅪Sg/VB/J+ NSg/VB+ NPl/V3 > and the fan , and skurried away into the darkness as hard as he could go . # VB/C D+ NSg/VB+ . VB/C ? VB/J P D Nᴹ+ R/C/P N🅪Sg/J/R R/C/P NPr/ISg+ NSg/VXB NSg/VB/J . > # > Alice took up the fan and gloves , and , as the hall was very hot , she kept # NPr+ VPt NSg/VB/J/P D NSg/VB VB/C NPl/V3+ . VB/C . R/C/P D+ NPr+ VLPt J/R NSg/VB/J . ISg+ VP > fanning herself all the time she went on talking : “ Dear , dear ! How queer # NSg/Vg ISg+ NSg/I/J/C/Dq D N🅪Sg/VB/J+ ISg+ NSg/VPt J/P Nᴹ/Vg/J . . NSg/VB/J . NSg/VB/J . NSg/C NSg/VB/J > everything is to - day ! And yesterday things went on just as usual . I wonder if # NSg/I/VB+ VL3 P . NPr🅪Sg+ . VB/C NSg+ NPl+ NSg/VPt J/P J/R R/C/P NSg/J . ISg/#r+ N🅪Sg/VB NSg/C > I’ve been changed in the night ? Let me think : was I the same when I got up this # K NSg/VLPp VP/J NPr/J/R/P D N🅪Sg/VB+ . NSg/VBP NPr/ISg+ NSg/VB . VLPt ISg/#r+ D I/J NSg/I/C ISg/#r+ VP NSg/VB/J/P I/Ddem+ > morning ? I almost think I can remember feeling a little different . But if I’m # N🅪Sg/Vg/J+ . ISg/#r+ R NSg/VB ISg/#r+ NPr/VXB NSg/VB N🅪Sg/Vg/J D/P NPr/I/J/Dq NSg/J . NSg/C/P NSg/C K > not the same , the next question is , Who in the world am I ? Ah , that’s the great # NSg/R/C D I/J . D NSg/J/P NSg/VB+ VL3 . NPr/I+ NPr/J/R/P D NSg/VB+ NPr/VLB/J ISg/#r+ . NSg/I/VB . NSg$ D NSg/J > puzzle ! ” And she began thinking over all the children she knew that were of the # NSg/VB . . VB/C ISg+ VPt Nᴹ/Vg/J NSg/J/P NSg/I/J/C/Dq+ D+ NPl+ ISg+ VPt NSg/I/C/Ddem+ NSg/VLPt P D+ > same age as herself , to see if she could have been changed for any of them . # I/J+ N🅪Sg/VB+ R/C/P ISg+ . P NSg/VB NSg/C ISg+ NSg/VXB NSg/VXB NSg/VLPp VP/J R/C/P I/R/Dq P NSg/IPl+ . > # > “ I’m sure I’m not Ada , ” she said , “ for her hair goes in such long ringlets , and # . K J K NSg/R/C NPr+ . . ISg+ VP/J . . R/C/P ISg/D$+ N🅪Sg/VB+ NPl/V3 NPr/J/R/P NSg/I NPr/VB/J NPl/V3 . VB/C > mine doesn’t go in ringlets at all ; and I’m sure I can’t be Mabel , for I know # NSg/I/VB+ VX3 NSg/VB/J NPr/J/R/P NPl/V3 NSg/P NSg/I/J/C/Dq . VB/C K J ISg/#r+ VXB NSg/VLXB NPr . R/C/P ISg/#r+ VB > all sorts of things , and she , oh ! she knows such a very little ! Besides , she’s # NSg/I/J/C/Dq NPl/V3 P NPl+ . VB/C ISg+ . NPr/VB . ISg+ V3 NSg/I D/P J/R NPr/I/J/Dq . R/P . K > she , and I’m I , and — oh dear , how puzzling it all is ! I’ll try if I know all the # ISg+ . VB/C K ISg/#r+ . VB/C . NPr/VB NSg/VB/J . NSg/C Nᴹ/Vg/J NPr/ISg+ NSg/I/J/C/Dq VL3 . K NSg/VB/J NSg/C ISg/#r+ VB NSg/I/J/C/Dq D > things I used to know . Let me see : four times five is twelve , and four times six # NPl+ ISg/#r+ VP/J P VB . NSg/VBP NPr/ISg+ NSg/VB . NSg NPl/V3+ NSg VL3+ NSg . VB/C NSg+ NPl/V3+ NSg > is thirteen , and four times seven is — oh dear ! I shall never get to twenty at # VL3+ NSg . VB/C NSg+ NPl/V3+ NSg+ VL3+ . NPr/VB NSg/VB/J . ISg/#r+ VXB R NSg/VB P NSg NSg/P > that rate ! However , the Multiplication Table doesn’t signify : let’s try # NSg/I/C/Ddem+ NSg/VB+ . C . D Nᴹ NSg/VB+ VX3 VB . NSg$ NSg/VB/J > Geography . London is the capital of Paris , and Paris is the capital of Rome , and # N🅪Sg+ . NPr+ VL3 D N🅪Sg/J P NPr+ . VB/C NPr+ VL3 D N🅪Sg/J P NPr+ . VB/C > Rome — no , that’s all wrong , I’m certain ! I must have been changed for Mabel ! I’ll # NPr+ . NSg/Dq/P . NSg$ NSg/I/J/C/Dq NSg/VB/J/R . K I/J . ISg/#r+ NSg/VXB NSg/VXB NSg/VLPp VP/J R/C/P NPr . K > try and say ‘ How doth the little — ’ ” and she crossed her hands on her lap as if # NSg/VB/J VB/C NSg/VB Unlintable NSg/C V3 D NPr/I/J/Dq . . . VB/C ISg+ VP/J ISg/D$+ NPl/V3+ J/P ISg/D$+ NSg/VB/J+ R/C/P NSg/C > she were saying lessons , and began to repeat it , but her voice sounded hoarse # ISg+ NSg/VLPt N🅪Sg/Vg/J NPl/V3+ . VB/C VPt P NSg/VB NPr/ISg+ . NSg/C/P ISg/D$+ NSg/VB+ VP/J NSg/VB/J > and strange , and the words did not come the same as they used to do : — # VB/C NSg/VB/J . VB/C D NPl/V3+ VXPt NSg/R/C NSg/VBPp/P D I/J R/C/P IPl+ VP/J P VXB . . > # > “ How doth the little crocodile Improve his shining tail , And pour the waters # . NSg/C V3 D+ NPr/I/J/Dq NSg/VB+ VB ISg/D$+ Nᴹ/Vg/J NSg/VB/J+ . VB/C NSg/VB D NPrPl/V3 > of the Nile On every golden scale ! # P D NPr+ J/P Dq NPr/VB/J N🅪Sg/VB+ . > # > “ How cheerfully he seems to grin , How neatly spread his claws , And welcome # . NSg/C R NPr/ISg+ V3 P NSg/VB . NSg/C R N🅪Sg/VBP ISg/D$+ NPl/V3+ . VB/C NSg/VB/J > little fishes in With gently smiling jaws ! ” # NPr/I/J/Dq NPl/V3+ NPr/J/R/P P R Nᴹ/Vg/J NPl/V3+ . . > # > “ I’m sure those are not the right words , ” said poor Alice , and her eyes filled # . K J I/Ddem+ VLB NSg/R/C D NPr/VB/J NPl/V3+ . . VP/J NSg/VB/J NPr+ . VB/C ISg/D$+ NPl/V3+ VP/J > with tears again as she went on , “ I must be Mabel after all , and I shall have to # P NPl/V3+ P R/C/P ISg+ NSg/VPt J/P . . ISg/#r+ NSg/VXB NSg/VLXB NPr P NSg/I/J/C/Dq . VB/C ISg/#r+ VXB NSg/VXB P > go and live in that poky little house , and have next to no toys to play with , # NSg/VB/J VB/C VB/J NPr/J/R/P NSg/I/C/Ddem NSg/J NPr/I/J/Dq NPr/VB+ . VB/C NSg/VXB NSg/J/P P NSg/Dq/P NPl/V3+ P N🅪Sg/VB P . > and oh ! ever so many lessons to learn ! No , I’ve made up my mind about it ; if I’m # VB/C NPr/VB . J/R NSg/I/J/R/C NSg/I/J/Dq NPl/V3+ P NSg/VB . NSg/Dq/P . K VP NSg/VB/J/P D$+ NSg/VB+ J/P NPr/ISg+ . NSg/C K > Mabel , I’ll stay down here ! It’ll be no use their putting their heads down and # NPr . K NSg/VB/J N🅪Sg/VB/J/P J/R . K NSg/VLXB NSg/Dq/P N🅪Sg/VB D$+ Nᴹ/Vg/J D$+ NPl/V3+ N🅪Sg/VB/J/P VB/C > saying ‘ Come up again , dear ! ’ I shall only look up and say ‘ Who am I then ? Tell # N🅪Sg/Vg/J Unlintable NSg/VBPp/P NSg/VB/J/P P . NSg/VB/J . . ISg/#r+ VXB J/R/C NSg/VB NSg/VB/J/P VB/C NSg/VB Unlintable NPr/I+ NPr/VLB/J ISg/#r+ NSg/J/R/C . NPr/VB > me that first , and then , if I like being that person , I’ll come up : if not , I’ll # NPr/ISg+ NSg/I/C/Ddem NSg/J . VB/C NSg/J/R/C . NSg/C ISg/#r+ NSg/VB/J/C/P N🅪Sg/VLg/J/C NSg/I/C/Ddem+ NSg/VB+ . K NSg/VBPp/P NSg/VB/J/P . NSg/C NSg/R/C . K > stay down here till I’m somebody else ’ — but , oh dear ! ” cried Alice , with a sudden # NSg/VB/J N🅪Sg/VB/J/P J/R NSg/VB/C/P K NSg/I+ NSg/J/C . . NSg/C/P . NPr/VB NSg/VB/J . . VP/J NPr+ . P D/P NSg/J > burst of tears , “ I do wish they would put their heads down ! I am so very tired # NSg/VB P NPl/V3+ . . ISg/#r+ VXB NSg/VB IPl+ VXB NSg/VBP D$+ NPl/V3+ N🅪Sg/VB/J/P . ISg/#r+ NPr/VLB/J NSg/I/J/R/C J/R VP/J > of being all alone here ! ” # P N🅪Sg/VLg/J/C NSg/I/J/C/Dq J J/R . . > # > As she said this she looked down at her hands , and was surprised to see that she # R/C/P ISg+ VP/J I/Ddem+ ISg+ VP/J N🅪Sg/VB/J/P NSg/P ISg/D$+ NPl/V3+ . VB/C VLPt VP/J P NSg/VB NSg/I/C/Ddem ISg+ > had put on one of the Rabbit’s little white kid gloves while she was talking . # VP NSg/VBP J/P NSg/I/J P D NSg$ NPr/I/J/Dq NPr🅪Sg/VB/J NSg/VB+ NPl/V3+ NSg/VB/C/P ISg+ VLPt Nᴹ/Vg/J . > “ How can I have done that ? ” she thought . “ I must be growing small again . ” She # . NSg/C NPr/VXB ISg/#r+ NSg/VXB NSg/VPp/J NSg/I/C/Ddem+ . . ISg+ N🅪Sg/VP . . ISg/#r+ NSg/VXB NSg/VLXB Nᴹ/Vg/J NPr/VB/J P . . ISg+ > got up and went to the table to measure herself by it , and found that , as nearly # VP NSg/VB/J/P VB/C NSg/VPt P D+ NSg/VB+ P NSg/VB ISg+ NSg/P NPr/ISg+ . VB/C NSg/VP NSg/I/C/Ddem+ . R/C/P R > as she could guess , she was now about two feet high , and was going on shrinking # R/C/P ISg+ NSg/VXB NSg/VB . ISg+ VLPt NSg/J/R/C J/P NSg+ NPl+ NSg/VB/J/R . VB/C VLPt Nᴹ/Vg/J J/P Nᴹ/Vg/J > rapidly : she soon found out that the cause of this was the fan she was holding , # R . ISg+ J/R NSg/VP NSg/VB/J/R/P NSg/I/C/Ddem D N🅪Sg/VB/C P I/Ddem+ VLPt D+ NSg/VB ISg+ VLPt Nᴹ/Vg/J . > and she dropped it hastily , just in time to avoid shrinking away altogether . # VB/C ISg+ VP/J NPr/ISg+ R . J/R NPr/J/R/P N🅪Sg/VB/J+ P VB Nᴹ/Vg/J VB/J NSg . > # > “ That was a narrow escape ! ” said Alice , a good deal frightened at the sudden # . NSg/I/C/Ddem+ VLPt D/P NSg/VB/J N🅪Sg/VB . . VP/J NPr+ . D/P+ NPr/VB/J+ NSg/VB/J+ VP/J NSg/P D+ NSg/J+ > change , but very glad to find herself still in existence ; “ and now for the # N🅪Sg/VB+ . NSg/C/P J/R NSg/VB/J P NSg/VB ISg+ NSg/VB/J/R NPr/J/R/P NSg+ . . VB/C NSg/J/R/C R/C/P D+ > garden ! ” and she ran with all speed back to the little door : but , alas ! the # NSg/VB/J+ . . VB/C ISg+ NSg/VPt P NSg/I/J/C/Dq+ N🅪Sg/VB+ NSg/VB/J P D+ NPr/I/J/Dq+ NSg/VB+ . NSg/C/P . NPrPl . D+ > little door was shut again , and the little golden key was lying on the glass # NPr/I/J/Dq+ NSg/VB+ VLPt NSg/VBP/J P . VB/C D+ NPr/I/J/Dq+ NPr/VB/J+ NPr/VB/J+ VLPt Nᴹ/Vg/J J/P D+ NPr🅪Sg/VB+ > table as before , “ and things are worse than ever , ” thought the poor child , “ for # NSg/VB+ R/C/P C/P . . VB/C NPl+ VLB NSg/VB/JC C/P J/R . . N🅪Sg/VP D+ NSg/VB/J+ NSg/VB+ . . R/C/P > I never was so small as this before , never ! And I declare it’s too bad , that it # ISg/#r+ R VLPt NSg/I/J/R/C NPr/VB/J R/C/P I/Ddem C/P . R . VB/C ISg/#r+ VB K R NSg/VB/J . NSg/I/C/Ddem NPr/ISg+ > is ! ” # VL3 . . > # > As she said these words her foot slipped , and in another moment , splash ! she was # R/C/P ISg+ VP/J I/Ddem+ NPl/V3+ ISg/D$+ NSg/VB+ VP/J . VB/C NPr/J/R/P I/D+ NSg+ . NSg/VB+ . ISg+ VLPt > up to her chin in salt water . Her first idea was that she had somehow fallen # NSg/VB/J/P P ISg/D$+ NPr/VB+ NPr/J/R/P NPr🅪Sg/VB/J+ N🅪Sg/VB+ . ISg/D$+ NSg/J+ NSg+ VLPt NSg/I/C/Ddem ISg+ VP R VPp/J > into the sea , “ and in that case I can go back by railway , ” she said to herself . # P D+ NSg+ . . VB/C NPr/J/R/P NSg/I/C/Ddem NPr🅪Sg/VB+ ISg/#r+ NPr/VXB NSg/VB/J NSg/VB/J NSg/P NSg+ . . ISg+ VP/J P ISg+ . > ( Alice had been to the seaside once in her life , and had come to the general # . NPr+ VP NSg/VLPp P D NPr/J NSg/C NPr/J/R/P ISg/D$+ N🅪Sg/VB+ . VB/C VP NSg/VBPp/P P D NSg/VB/J > conclusion , that wherever you go to on the English coast you find a number of # NSg+ . NSg/I/C/Ddem+ C ISgPl+ NSg/VB/J P J/P D NPr🅪Sg/VB/J+ NSg/VB+ ISgPl+ NSg/VB D/P N🅪Sg/VB/JC P > bathing machines in the sea , some children digging in the sand with wooden # Nᴹ/Vg/J NPl/V3+ NPr/J/R/P D NSg+ . I/J/R/Dq NPl+ NSg/Vg NPr/J/R/P D NSg/VB/J+ P J > spades , then a row of lodging houses , and behind them a railway station . ) # NPl/V3 . NSg/J/R/C D/P NSg/VB P N🅪Sg/Vg/J+ NPl/V3+ . VB/C NSg/J/P NSg/IPl+ D/P NSg+ NSg/VB+ . . > However , she soon made out that she was in the pool of tears which she had wept # C . ISg+ J/R VP NSg/VB/J/R/P NSg/I/C/Ddem ISg+ VLPt NPr/J/R/P D NSg/VB P NPl/V3+ I/C+ ISg+ VP VB > when she was nine feet high . # NSg/I/C ISg+ VLPt NSg NPl NSg/VB/J/R . > # > “ I wish I hadn’t cried so much ! ” said Alice , as she swam about , trying to find # . ISg/#r+ NSg/VB ISg/#r+ VPt VP/J NSg/I/J/R/C NSg/I/J/R/Dq . . VP/J NPr+ . R/C/P ISg+ VPt J/P . Nᴹ/Vg/J P NSg/VB > her way out . “ I shall be punished for it now , I suppose , by being drowned in my # ISg/D$+ NSg/J+ NSg/VB/J/R/P . . ISg/#r+ VXB NSg/VLXB VP/J R/C/P NPr/ISg+ NSg/J/R/C . ISg/#r+ VB . NSg/P N🅪Sg/VLg/J/C VP/J NPr/J/R/P D$+ > own tears ! That will be a queer thing , to be sure ! However , everything is queer # NSg/VB/J+ NPl/V3+ . NSg/I/C/Ddem+ NPr/VXB NSg/VLXB D/P NSg/VB/J+ NSg+ . P NSg/VLXB J . C . NSg/I/VB+ VL3 NSg/VB/J > to - day . ” # P . NPr🅪Sg+ . . > # > Just then she heard something splashing about in the pool a little way off , and # J/R NSg/J/R/C ISg+ VP/J NSg/I/J+ Nᴹ/Vg/J J/P NPr/J/R/P D NSg/VB+ D/P NPr/I/J/Dq NSg/J+ NSg/VB/J/P . VB/C > she swam nearer to make out what it was : at first she thought it must be a # ISg+ VPt NSg/JC P NSg/VB NSg/VB/J/R/P NSg/I+ NPr/ISg+ VLPt . NSg/P NSg/J ISg+ N🅪Sg/VP NPr/ISg+ NSg/VXB NSg/VLXB D/P > walrus or hippopotamus , but then she remembered how small she was now , and she # NSg/VB+ NPr/C NSg . NSg/C/P NSg/J/R/C ISg+ VP/J NSg/C NPr/VB/J ISg+ VLPt NSg/J/R/C . VB/C ISg+ > soon made out that it was only a mouse that had slipped in like herself . # J/R VP NSg/VB/J/R/P NSg/I/C/Ddem NPr/ISg+ VLPt J/R/C D/P NSg/VB+ NSg/I/C/Ddem+ VP VP/J NPr/J/R/P NSg/VB/J/C/P ISg+ . > # > “ Would it be of any use , now , ” thought Alice , “ to speak to this mouse ? # . VXB NPr/ISg+ NSg/VLXB P I/R/Dq+ N🅪Sg/VB+ . NSg/J/R/C . . N🅪Sg/VP NPr+ . . P NSg/VB P I/Ddem+ NSg/VB+ . > Everything is so out - of - the - way down here , that I should think very likely it # NSg/I/VB+ VL3 NSg/I/J/R/C NSg/VB/J/R/P . P . D . NSg/J N🅪Sg/VB/J/P J/R . NSg/I/C/Ddem ISg/#r+ VXB NSg/VB J/R NSg/J NPr/ISg+ > can talk : at any rate , there’s no harm in trying . ” So she began : “ O Mouse , do # NPr/VXB N🅪Sg/VB . NSg/P I/R/Dq+ NSg/VB+ . K NSg/Dq/P+ N🅪Sg/VB+ NPr/J/R/P Nᴹ/Vg/J . . NSg/I/J/R/C ISg+ VPt . . NPr/J/P NSg/VB+ . VXB > you know the way out of this pool ? I am very tired of swimming about here , O # ISgPl+ VB D+ NSg/J+ NSg/VB/J/R/P P I/Ddem+ NSg/VB+ . ISg/#r+ NPr/VLB/J J/R VP/J P NSg/Vg J/P J/R . NPr/J/P > Mouse ! ” ( Alice thought this must be the right way of speaking to a mouse : she # NSg/VB+ . . . NPr+ N🅪Sg/VP I/Ddem+ NSg/VXB NSg/VLXB D NPr/VB/J NSg/J P Nᴹ/Vg/J P D/P+ NSg/VB+ . ISg+ > had never done such a thing before , but she remembered having seen in her # VP R NSg/VPp/J NSg/I D/P+ NSg+ C/P . NSg/C/P ISg+ VP/J Nᴹ/Vg/J NSg/VPp NPr/J/R/P ISg/D$+ > brother’s Latin Grammar , “ A mouse — of a mouse — to a mouse — a mouse — O mouse ! ” ) The # NSg$ NPr/J N🅪Sg/VB+ . . D/P NSg/VB+ . P D/P NSg/VB+ . P D/P NSg/VB+ . D/P NSg/VB+ . NPr/J/P NSg/VB+ . . . D+ > Mouse looked at her rather inquisitively , and seemed to her to wink with one of # NSg/VB+ VP/J NSg/P ISg/D$+ NPr/VB/J/R R . VB/C VP/J P ISg/D$+ P NSg/VB P NSg/I/J P > its little eyes , but it said nothing . # ISg/D$+ NPr/I/J/Dq NPl/V3+ . NSg/C/P NPr/ISg+ VP/J NSg/I/J+ . > # > “ Perhaps it doesn’t understand English , ” thought Alice ; “ I daresay it’s a French # . NSg/R NPr/ISg+ VX3 VB NPr🅪Sg/VB/J+ . . N🅪Sg/VP NPr+ . . ISg/#r+ VB K D/P NPr🅪Sg/VB/J > mouse , come over with William the Conqueror . ” ( For , with all her knowledge of # NSg/VB+ . NSg/VBPp/P NSg/J/P P NPr+ D NSg . . . R/C/P . P NSg/I/J/C/Dq ISg/D$+ Nᴹ P > history , Alice had no very clear notion how long ago anything had happened . ) So # N🅪Sg+ . NPr+ VP NSg/Dq/P J/R NSg/VB/J+ NSg+ NSg/C NPr/VB/J J/P NSg/I/VB+ VP VP/J . . NSg/I/J/R/C > she began again : “ Où est ma chatte ? ” which was the first sentence in her French # ISg+ VPt P . . ? NPr+ NPr/J+ ? . . I/C+ VLPt D NSg/J NSg/VB NPr/J/R/P ISg/D$+ NPr🅪Sg/VB/J > lesson - book . The Mouse gave a sudden leap out of the water , and seemed to quiver # NSg/VB+ . NSg/VB+ . D+ NSg/VB+ VPt D/P+ NSg/J+ NSg/VB/J+ NSg/VB/J/R/P P D+ N🅪Sg/VB+ . VB/C VP/J P NSg/VB/J > all over with fright . “ Oh , I beg your pardon ! ” cried Alice hastily , afraid that # NSg/I/J/C/Dq NSg/J/P+ P NSg/VB/J . . NPr/VB . ISg/#r+ NSg/VB D$+ NSg/VB . . VP/J NPr+ R . J NSg/I/C/Ddem > she had hurt the poor animal’s feelings . “ I quite forgot you didn’t like cats . ” # ISg+ VP NSg/VBP/J D NSg/VB/J NSg$ NPl/V3+ . . ISg/#r+ R VPt ISgPl+ VXPt NSg/VB/J/C/P NPl/V3+ . . > # > “ Not like cats ! ” cried the Mouse , in a shrill , passionate voice . “ Would you like # . NSg/R/C NSg/VB/J/C/P NPl/V3+ . . VP/J D+ NSg/VB+ . NPr/J/R/P D/P NSg/VB/J . NSg/VB/J+ NSg/VB+ . . VXB ISgPl+ NSg/VB/J/C/P > cats if you were me ? ” # NPl/V3+ NSg/C ISgPl+ NSg/VLPt NPr/ISg+ . . > # > “ Well , perhaps not , ” said Alice in a soothing tone : “ don’t be angry about it . # . NSg/VB/J/R . NSg/R NSg/R/C . . VP/J NPr+ NPr/J/R/P D/P+ Nᴹ/Vg/J+ N🅪Sg/I/VB+ . . VXB NSg/VLXB VB/J J/P NPr/ISg+ . > And yet I wish I could show you our cat Dinah : I think you’d take a fancy to # VB/C NSg/VB/C ISg/#r+ NSg/VB ISg/#r+ NSg/VXB NSg/VB ISgPl+ D$+ NSg/VB/J+ NPr . ISg/#r+ NSg/VB K NSg/VB D/P NSg/VB/J+ P > cats if you could only see her . She is such a dear quiet thing , ” Alice went on , # NPl/V3 NSg/C ISgPl+ NSg/VXB J/R/C NSg/VB ISg/D$+ . ISg+ VL3 NSg/I D/P NSg/VB/J N🅪Sg/VB/J NSg . . NPr+ NSg/VPt J/P . > half to herself , as she swam lazily about in the pool , “ and she sits purring so # N🅪Sg/J/P+ P ISg+ . R/C/P ISg+ VPt R J/P NPr/J/R/P D+ NSg/VB+ . . VB/C ISg+ NPl/V3 Nᴹ/Vg/J NSg/I/J/R/C > nicely by the fire , licking her paws and washing her face — and she is such a nice # R NSg/P D N🅪Sg/VB/J+ . Nᴹ/Vg/J ISg/D$+ NPl/V3+ VB/C Nᴹ/Vg/J ISg/D$+ NSg/VB+ . VB/C ISg+ VL3 NSg/I D/P NPr/J > soft thing to nurse — and she’s such a capital one for catching mice — oh , I beg # NSg/J NSg+ P NSg/VB . VB/C K NSg/I D/P N🅪Sg/J+ NSg/I/J+ R/C/P Nᴹ/Vg/J NPl/VB+ . NPr/VB . ISg/#r+ NSg/VB > your pardon ! ” cried Alice again , for this time the Mouse was bristling all over , # D$+ NSg/VB . . VP/J NPr+ P . R/C/P I/Ddem+ N🅪Sg/VB/J+ D+ NSg/VB+ VLPt Nᴹ/Vg/J NSg/I/J/C/Dq NSg/J/P . > and she felt certain it must be really offended . “ We won’t talk about her any # VB/C ISg+ N🅪Sg/VP/J I/J NPr/ISg+ NSg/VXB NSg/VLXB R VP/J . . IPl+ VXB N🅪Sg/VB J/P ISg/D$+ I/R/Dq > more if you’d rather not . ” # NPr/I/J/R/Dq NSg/C K NPr/VB/J/R NSg/R/C . . > # > “ We indeed ! ” cried the Mouse , who was trembling down to the end of his tail . “ As # . IPl+ R . . VP/J D+ NSg/VB+ . NPr/I+ VLPt Nᴹ/Vg/J N🅪Sg/VB/J/P P D NSg/VB P ISg/D$+ NSg/VB/J+ . . R/C/P > if I would talk on such a subject ! Our family always hated cats : nasty , low , # NSg/C ISg/#r+ VXB N🅪Sg/VB J/P NSg/I D/P+ NSg/VB/J+ . D$+ N🅪Sg/J+ R VP/J NPl/V3+ . NSg/J . NSg/VB/J/R . > vulgar things ! Don’t let me hear the name again ! ” # NSg/J NPl+ . VXB NSg/VBP NPr/ISg+ VB D NSg/VB+ P . . > # > “ I won’t indeed ! ” said Alice , in a great hurry to change the subject of # . ISg/#r+ VXB R . . VP/J NPr+ . NPr/J/R/P D/P NSg/J NSg/VB+ P N🅪Sg/VB D NSg/VB/J P > conversation . “ Are you — are you fond — of — of dogs ? ” The Mouse did not answer , so # N🅪Sg/VB+ . . VLB ISgPl+ . VLB ISgPl+ NSg/VB/J . P . P NPl/V3+ . . D+ NSg/VB+ VXPt NSg/R/C NSg/VB+ . NSg/I/J/R/C > Alice went on eagerly : “ There is such a nice little dog near our house I should # NPr+ NSg/VPt J/P R . . R+ VL3 NSg/I D/P NPr/J NPr/I/J/Dq NSg/VB/J+ NSg/VB/J/P D$+ NPr/VB+ ISg/#r+ VXB > like to show you ! A little bright - eyed terrier , you know , with oh , such long # NSg/VB/J/C/P P NSg/VB ISgPl+ . D/P NPr/I/J/Dq NPr/VB/J . VP/J NSg . ISgPl+ VB . P NPr/VB . NSg/I NPr/VB/J > curly brown hair ! And it’ll fetch things when you throw them , and it’ll sit up # NSg/J/R NPr🅪Sg/VB/J N🅪Sg/VB+ . VB/C K NSg/VB NPl+ NSg/I/C ISgPl+ NSg/VB NSg/IPl+ . VB/C K NSg/VB NSg/VB/J/P > and beg for its dinner , and all sorts of things — I can’t remember half of # VB/C NSg/VB R/C/P ISg/D$+ N🅪Sg/VB+ . VB/C NSg/I/J/C/Dq NPl/V3 P NPl+ . ISg/#r+ VXB NSg/VB N🅪Sg/J/P P > them — and it belongs to a farmer , you know , and he says it’s so useful , it’s # NSg/IPl+ . VB/C NPr/ISg+ V3 P D/P NPr+ . ISgPl+ VB . VB/C NPr/ISg+ NPl/V3 K NSg/I/J/R/C J . K > worth a hundred pounds ! He says it kills all the rats and — oh dear ! ” cried Alice # NSg/VB/J D/P NSg NPl/V3+ . NPr/ISg+ NPl/V3 NPr/ISg+ NPl/V3 NSg/I/J/C/Dq+ D+ NPl/V3+ VB/C . NPr/VB NSg/VB/J . . VP/J NPr+ > in a sorrowful tone , “ I’m afraid I’ve offended it again ! ” For the Mouse was # NPr/J/R/P D/P J N🅪Sg/I/VB+ . . K J K VP/J NPr/ISg+ P . . R/C/P D+ NSg/VB+ VLPt > swimming away from her as hard as it could go , and making quite a commotion in # NSg/Vg VB/J P ISg/D$+ R/C/P N🅪Sg/J/R R/C/P NPr/ISg+ NSg/VXB NSg/VB/J . VB/C Nᴹ/Vg/J R D/P N🅪Sg NPr/J/R/P > the pool as it went . # D NSg/VB+ R/C/P NPr/ISg+ NSg/VPt . > # > So she called softly after it , “ Mouse dear ! Do come back again , and we won’t # NSg/I/J/R/C ISg+ VP/J R P NPr/ISg+ . . NSg/VB+ NSg/VB/J . VXB NSg/VBPp/P NSg/VB/J P . VB/C IPl+ VXB > talk about cats or dogs either , if you don’t like them ! ” When the Mouse heard # N🅪Sg/VB J/P NPl/V3+ NPr/C NPl/V3+ I/C . NSg/C ISgPl+ VXB NSg/VB/J/C/P NSg/IPl+ . . NSg/I/C D+ NSg/VB+ VP/J > this , it turned round and swam slowly back to her : its face was quite pale ( with # I/Ddem+ . NPr/ISg+ VP/J NSg/VB/J/P VB/C VPt R NSg/VB/J P ISg/D$+ . ISg/D$+ NSg/VB+ VLPt R NSg/VB/J . P > passion , Alice thought ) , and it said in a low trembling voice , “ Let us get to # NPrᴹ/VB+ . NPr+ N🅪Sg/VP . . VB/C NPr/ISg+ VP/J NPr/J/R/P D/P+ NSg/VB/J/R+ Nᴹ/Vg/J+ NSg/VB+ . . NSg/VBP NPr/IPl+ NSg/VB P > the shore , and then I’ll tell you my history , and you’ll understand why it is I # D+ NSg/VB+ . VB/C NSg/J/R/C K NPr/VB ISgPl+ D$+ N🅪Sg+ . VB/C K VB NSg/VB NPr/ISg+ VL3 ISg/#r+ > hate cats and dogs . ” # N🅪Sg/VB NPl/V3 VB/C NPl/V3+ . . > # > It was high time to go , for the pool was getting quite crowded with the birds # NPr/ISg+ VLPt NSg/VB/J/R N🅪Sg/VB/J P NSg/VB/J . R/C/P D+ NSg/VB+ VLPt NSg/Vg R VP/J P D NPl/V3 > and animals that had fallen into it : there were a Duck and a Dodo , a Lory and an # VB/C NPl+ NSg/I/C/Ddem+ VP VPp/J P NPr/ISg+ . R+ NSg/VLPt D/P+ NSg/VB+ VB/C D/P NSg . D/P ? VB/C D/P > Eaglet , and several other curious creatures . Alice led the way , and the whole # NSg . VB/C J/Dq NSg/VB/J J NPl+ . NPr+ NSg/VP/J D+ NSg/J+ . VB/C D+ NSg/J+ > party swam to the shore . # NSg/VB/J+ VPt P D+ NSg/VB+ . > # > CHAPTER III : A Caucus - Race and a Long Tale # HeadingStart NSg/VB+ #r . D/P NSg/VB+ . N🅪Sg/VB VB/C D/P NPr/VB/J NSg/VB+ > # > They were indeed a queer - looking party that assembled on the bank — the birds with # IPl+ NSg/VLPt R D/P NSg/VB/J . Nᴹ/Vg/J NSg/VB/J+ NSg/I/C/Ddem+ VP/J J/P D NSg/VB . D NPl/V3 P > draggled feathers , the animals with their fur clinging close to them , and all # ? NPl/V3+ . D NPl+ P D$+ N🅪Sg/VB/C/P+ Nᴹ/Vg/J NSg/VB/J P NSg/IPl+ . VB/C NSg/I/J/C/Dq > dripping wet , cross , and uncomfortable . # NSg/Vg NSg/VP/J . NPr/VB/J/P+ . VB/C J . > # > The first question of course was , how to get dry again : they had a consultation # D NSg/J NSg/VB P NSg/VB+ VLPt . NSg/C P NSg/VB NSg/VB/J P . IPl+ VP D/P NSg+ > about this , and after a few minutes it seemed quite natural to Alice to find # J/P I/Ddem+ . VB/C P D/P+ NSg/I/Dq+ NPl/V3+ NPr/ISg+ VP/J R NSg/J P NPr+ P NSg/VB > herself talking familiarly with them , as if she had known them all her life . # ISg+ Nᴹ/Vg/J R P NSg/IPl+ . R/C/P NSg/C ISg+ VP VPp/J NSg/IPl+ NSg/I/J/C/Dq ISg/D$+ N🅪Sg/VB+ . > Indeed , she had quite a long argument with the Lory , who at last turned sulky , # R . ISg+ VP R D/P NPr/VB/J N🅪Sg/VB P D ? . NPr/I+ NSg/P NSg/VB/J VP/J NSg/J . > and would only say , “ I am older than you , and must know better ; ” and this Alice # VB/C VXB J/R/C NSg/VB . . ISg/#r+ NPr/VLB/J JC C/P ISgPl+ . VB/C NSg/VXB VB NSg/VXB/JC . . VB/C I/Ddem NPr+ > would not allow without knowing how old it was , and , as the Lory positively # VXB NSg/R/C VB C/P NSg/Vg/J/P NSg/C NSg/J NPr/ISg+ VLPt . VB/C . R/C/P D ? R > refused to tell its age , there was no more to be said . # VP/J P NPr/VB ISg/D$+ N🅪Sg/VB+ . R+ VLPt NSg/Dq/P NPr/I/J/R/Dq P NSg/VLXB VP/J . > # > At last the Mouse , who seemed to be a person of authority among them , called # NSg/P NSg/VB/J D+ NSg/VB+ . NPr/I+ VP/J P NSg/VLXB D/P NSg/VB P N🅪Sg+ P NSg/IPl+ . VP/J > out , “ Sit down , all of you , and listen to me ! I’ll soon make you dry enough ! ” # NSg/VB/J/R/P . . NSg/VB N🅪Sg/VB/J/P . NSg/I/J/C/Dq P ISgPl+ . VB/C NSg/VB P NPr/ISg+ . K J/R NSg/VB ISgPl+ NSg/VB/J NSg/I . . > They all sat down at once , in a large ring , with the Mouse in the middle . Alice # IPl+ NSg/I/J/C/Dq NSg/VP/J N🅪Sg/VB/J/P NSg/P NSg/C . NPr/J/R/P D/P+ NSg/J+ NSg/VB+ . P D+ NSg/VB+ NPr/J/R/P D NSg/VB/J . NPr+ > kept her eyes anxiously fixed on it , for she felt sure she would catch a bad # VP ISg/D$+ NPl/V3+ R VP/J J/P NPr/ISg+ . R/C/P ISg+ N🅪Sg/VP/J J ISg+ VXB NSg/VB D/P NSg/VB/J > cold if she did not get dry very soon . # NSg/J NSg/C ISg+ VXPt NSg/R/C NSg/VB NSg/VB/J J/R J/R . > # > “ Ahem ! ” said the Mouse with an important air , “ are you all ready ? This is the # . VB . . VP/J D NSg/VB+ P D/P+ J+ N🅪Sg/VB+ . . VLB ISgPl+ NSg/I/J/C/Dq NSg/VB/J . I/Ddem+ VL3 D > driest thing I know . Silence all round , if you please ! ‘ William the Conqueror , # JS NSg ISg/#r+ VB . NSg/VB+ NSg/I/J/C/Dq NSg/VB/J/P . NSg/C ISgPl+ VB . Unlintable NPr+ D NSg . > whose cause was favoured by the pope , was soon submitted to by the English , who # I+ N🅪Sg/VB/C+ VLPt VP/J/Comm NSg/P D NPr/VB+ . VLPt J/R VP P NSg/P D NPr🅪Sg/VB/J+ . NPr/I+ > wanted leaders , and had been of late much accustomed to usurpation and conquest . # VP/J NPl+ . VB/C VP NSg/VLPp P NSg/J NSg/I/J/R/Dq VP/J P NSg VB/C NSg/VB+ . > Edwin and Morcar , the earls of Mercia and Northumbria — ’ ” # NPr+ VB/C ? . D NPl+ P NPr VB/C ? . . . > # > “ Ugh ! ” said the Lory , with a shiver . # . W? . . VP/J D ? . P D/P NSg/VB . > # > “ I beg your pardon ! ” said the Mouse , frowning , but very politely : “ Did you # . ISg/#r+ NSg/VB D$+ NSg/VB . . VP/J D+ NSg/VB+ . Nᴹ/Vg/J . NSg/C/P J/R R . . VXPt ISgPl+ > speak ? ” # NSg/VB . . > # > “ Not I ! ” said the Lory hastily . # . NSg/R/C ISg/#r+ . . VP/J D ? R . > # > “ I thought you did , ” said the Mouse . “ — I proceed . ‘ Edwin and Morcar , the earls # . ISg/#r+ N🅪Sg/VP ISgPl+ VXPt . . VP/J D+ NSg/VB+ . . . ISg/#r+ VB . Unlintable NPr+ VB/C ? . D NPl+ > of Mercia and Northumbria , declared for him : and even Stigand , the patriotic # P NPr VB/C ? . VP/J R/C/P ISg+ . VB/C NSg/VB/J/R ? . D NSg/J > archbishop of Canterbury , found it advisable — ’ ” # NSg P NPr . NSg/VP NPr/ISg+ J . . . > # > “ Found what ? ” said the Duck . # . NSg/VP NSg/I+ . . VP/J D+ NSg/VB+ . > # > “ Found it , ” the Mouse replied rather crossly : “ of course you know what ‘ it ’ # . NSg/VP NPr/ISg+ . . D+ NSg/VB+ VP/J NPr/VB/J/R R . . P NSg/VB+ ISgPl+ VB NSg/I+ Unlintable NPr/ISg+ . > means . ” # NPl/V3 . . > # > “ I know what ‘ it ’ means well enough , when I find a thing , ” said the Duck : “ it’s # . ISg/#r+ VB NSg/I+ Unlintable NPr/ISg+ . NPl/V3 NSg/VB/J/R NSg/I . NSg/I/C ISg/#r+ NSg/VB D/P+ NSg+ . . VP/J D+ NSg/VB+ . . K > generally a frog or a worm . The question is , what did the archbishop find ? ” # R D/P NSg/VB NPr/C D/P NSg/VB+ . D+ NSg/VB+ VL3 . NSg/I+ VXPt D NSg NSg/VB . . > # > The Mouse did not notice this question , but hurriedly went on , “ ‘ — found it # D+ NSg/VB+ VXPt NSg/R/C NSg/VB I/Ddem+ NSg/VB+ . NSg/C/P R NSg/VPt J/P . . Unlintable . NSg/VP NPr/ISg+ > advisable to go with Edgar Atheling to meet William and offer him the crown . # J P NSg/VB/J P NPr+ ? P NSg/VB/J NPr+ VB/C NSg/VB/JC ISg+ D NSg/VB/J+ . > William’s conduct at first was moderate . But the insolence of his Normans — ’ How # NPr$ NSg/VB NSg/P NSg/J VLPt NSg/VB/J . NSg/C/P D Nᴹ/VB P ISg/D$+ NPrPl . . NSg/C > are you getting on now , my dear ? ” it continued , turning to Alice as it spoke . # VLB ISgPl+ NSg/Vg J/P NSg/J/R/C . D$+ NSg/VB/J . . NPr/ISg+ VP/J . Nᴹ/Vg/J P NPr+ R/C/P NPr/ISg+ NSg/VPt . > # > “ As wet as ever , ” said Alice in a melancholy tone : “ it doesn’t seem to dry me at # . R/C/P NSg/VP/J R/C/P J/R . . VP/J NPr+ NPr/J/R/P D/P NSg/J N🅪Sg/I/VB+ . . NPr/ISg+ VX3 VB P NSg/VB/J NPr/ISg+ NSg/P > all . ” # NSg/I/J/C/Dq . . > # > “ In that case , ” said the Dodo solemnly , rising to its feet , “ I move that the # . NPr/J/R/P NSg/I/C/Ddem+ NPr🅪Sg/VB+ . . VP/J D NSg R . Nᴹ/Vg/J/P P ISg/D$+ NPl+ . . ISg/#r+ NSg/VB NSg/I/C/Ddem D > meeting adjourn , for the immediate adoption of more energetic remedies — ” # N🅪Sg/Vg/J+ VB . R/C/P D J N🅪Sg P NPr/I/J/R/Dq NSg/J NPl/V3+ . . > # > “ Speak English ! ” said the Eaglet . “ I don’t know the meaning of half those long # . NSg/VB NPr🅪Sg/VB/J+ . . VP/J D NSg . . ISg/#r+ VXB VB D N🅪Sg/Vg/J P N🅪Sg/J/P+ I/Ddem NPr/VB/J > words , and , what’s more , I don’t believe you do either ! ” And the Eaglet bent # NPl/V3+ . VB/C . K NPr/I/J/R/Dq . ISg/#r+ VXB VB ISgPl+ VXB I/C . . VB/C D NSg NSg/VP/J > down its head to hide a smile : some of the other birds tittered audibly . # N🅪Sg/VB/J/P ISg/D$+ NPr/VB/J+ P NSg/VB D/P NSg/VB+ . I/J/R/Dq P D NSg/VB/J NPl/V3+ VP/J R . > # > “ What I was going to say , ” said the Dodo in an offended tone , “ was , that the # . NSg/I+ ISg/#r+ VLPt Nᴹ/Vg/J P NSg/VB . . VP/J D NSg NPr/J/R/P D/P VP/J N🅪Sg/I/VB+ . . VLPt . NSg/I/C/Ddem D > best thing to get us dry would be a Caucus - race . ” # NPr/VXB/JS NSg+ P NSg/VB NPr/IPl+ NSg/VB/J VXB NSg/VLXB D/P NSg/VB+ . N🅪Sg/VB+ . . > # > “ What is a Caucus - race ? ” said Alice ; not that she wanted much to know , but the # . NSg/I+ VL3 D/P NSg/VB . N🅪Sg/VB+ . . VP/J NPr+ . NSg/R/C NSg/I/C/Ddem ISg+ VP/J NSg/I/J/R/Dq P VB . NSg/C/P D > Dodo had paused as if it thought that somebody ought to speak , and no one else # NSg VP VP/J R/C/P NSg/C NPr/ISg+ N🅪Sg/VP NSg/I/C/Ddem NSg/I+ NSg/I/VXB P NSg/VB . VB/C NSg/Dq/P NSg/I/J+ NSg/J/C > seemed inclined to say anything . # VP/J VP/J P NSg/VB NSg/I/VB+ . > # > “ Why , ” said the Dodo , “ the best way to explain it is to do it . ” ( And , as you # . NSg/VB . . VP/J D NSg . . D NPr/VXB/JS NSg/J+ P VB NPr/ISg+ VL3 P VXB NPr/ISg+ . . . VB/C . R/C/P ISgPl+ > might like to try the thing yourself , some winter day , I will tell you how the # Nᴹ/VXB/J NSg/VB/J/C/P P NSg/VB/J D+ NSg+ ISg+ . I/J/R/Dq+ N🅪Sg/VB+ NPr🅪Sg+ . ISg/#r+ NPr/VXB NPr/VB ISgPl+ NSg/C D > Dodo managed it . ) # NSg VP/J NPr/ISg+ . . > # > First it marked out a race - course , in a sort of circle , ( “ the exact shape # NSg/J NPr/ISg+ VP/J NSg/VB/J/R/P D/P N🅪Sg/VB+ . NSg/VB+ . NPr/J/R/P D/P NSg/VB P NSg/VB+ . . . D+ VB/J+ N🅪Sg/VB+ > doesn’t matter , ” it said , ) and then all the party were placed along the course , # VX3 N🅪Sg/VB+ . . NPr/ISg+ VP/J . . VB/C NSg/J/R/C NSg/I/J/C/Dq D NSg/VB/J+ NSg/VLPt VP/J P D NSg/VB+ . > here and there . There was no “ One , two , three , and away , ” but they began running # J/R VB/C R . R+ VLPt NSg/Dq/P . NSg/I/J+ . NSg . NSg . VB/C VB/J . . NSg/C/P IPl+ VPt Nᴹ/Vg/J/P > when they liked , and left off when they liked , so that it was not easy to know # NSg/I/C IPl+ VP/J . VB/C NPr/VP/J NSg/VB/J/P NSg/I/C IPl+ VP/J . NSg/I/J/R/C NSg/I/C/Ddem NPr/ISg+ VLPt NSg/R/C NSg/VB/J P VB > when the race was over . However , when they had been running half an hour or so , # NSg/I/C D+ N🅪Sg/VB+ VLPt NSg/J/P . C . NSg/I/C IPl+ VP NSg/VLPp Nᴹ/Vg/J/P N🅪Sg/J/P+ D/P+ NSg+ NPr/C NSg/I/J/R/C . > and were quite dry again , the Dodo suddenly called out “ The race is over ! ” and # VB/C NSg/VLPt R NSg/VB/J P . D NSg R VP/J NSg/VB/J/R/P . D N🅪Sg/VB+ VL3 NSg/J/P . . VB/C > they all crowded round it , panting , and asking , “ But who has won ? ” # IPl+ NSg/I/J/C/Dq VP/J NSg/VB/J/P NPr/ISg+ . Nᴹ/Vg/J . VB/C Nᴹ/Vg/J . . NSg/C/P NPr/I+ V3 NSgPl/VP . . > # > This question the Dodo could not answer without a great deal of thought , and it # I/Ddem+ NSg/VB+ D NSg NSg/VXB NSg/R/C NSg/VB+ C/P D/P NSg/J NSg/VB/J P N🅪Sg/VP+ . VB/C NPr/ISg+ > sat for a long time with one finger pressed upon its forehead ( the position in # NSg/VP/J R/C/P D/P NPr/VB/J N🅪Sg/VB/J+ P NSg/I/J NSg/VB+ VP/J P ISg/D$+ NSg . D NSg/VB+ NPr/J/R/P > which you usually see Shakespeare , in the pictures of him ) , while the rest # I/C+ ISgPl+ R NSg/VB NPr/VB+ . NPr/J/R/P D NPl/V3 P ISg+ . . NSg/VB/C/P D NSg/VB+ > waited in silence . At last the Dodo said , “ Everybody has won , and all must have # VP/J NPr/J/R/P NSg/VB+ . NSg/P NSg/VB/J D NSg VP/J . . NSg/I+ V3 NSgPl/VP . VB/C NSg/I/J/C/Dq NSg/VXB NSg/VXB > prizes . ” # NPl/V3+ . . > # > “ But who is to give the prizes ? ” quite a chorus of voices asked . # . NSg/C/P NPr/I+ VL3 P NSg/VB D+ NPl/V3+ . . R D/P NSg/VB P NPl/V3+ VP/J . > # > “ Why , she , of course , ” said the Dodo , pointing to Alice with one finger ; and the # . NSg/VB . ISg+ . P NSg/VB+ . . VP/J D NSg . Nᴹ/Vg/J P NPr+ P NSg/I/J NSg/VB+ . VB/C D > whole party at once crowded round her , calling out in a confused way , “ Prizes ! # NSg/J NSg/VB/J+ NSg/P NSg/C VP/J NSg/VB/J/P ISg/D$+ . Nᴹ/Vg/J NSg/VB/J/R/P NPr/J/R/P D/P VP/J NSg/J+ . . NPl/V3+ . > Prizes ! ” # NPl/V3+ . . > # > Alice had no idea what to do , and in despair she put her hand in her pocket , and # NPr+ VP NSg/Dq/P+ NSg+ NSg/I+ P VXB . VB/C NPr/J/R/P NSg/VB+ ISg+ NSg/VBP ISg/D$+ NSg/VB+ NPr/J/R/P ISg/D$+ NSg/VB/J+ . VB/C > pulled out a box of comfits , ( luckily the salt water had not got into it ) , and # VP/J NSg/VB/J/R/P D/P NSg/VB P NPl/V3 . . R D NPr🅪Sg/VB/J+ N🅪Sg/VB+ VP NSg/R/C VP P NPr/ISg+ . . VB/C > handed them round as prizes . There was exactly one a - piece , all round . # VP/J NSg/IPl+ NSg/VB/J/P R/C/P NPl/V3+ . R+ VLPt R NSg/I/J D/P . NSg/VB+ . NSg/I/J/C/Dq NSg/VB/J/P . > # > “ But she must have a prize herself , you know , ” said the Mouse . # . NSg/C/P ISg+ NSg/VXB NSg/VXB D/P+ NSg/VB/J+ ISg+ . ISgPl+ VB . . VP/J D+ NSg/VB+ . > # > “ Of course , ” the Dodo replied very gravely . “ What else have you got in your # . P NSg/VB+ . . D NSg VP/J J/R R . . NSg/I+ NSg/J/C NSg/VXB ISgPl+ VP NPr/J/R/P D$+ > pocket ? ” he went on , turning to Alice . # NSg/VB/J+ . . NPr/ISg+ NSg/VPt J/P . Nᴹ/Vg/J P NPr+ . > # > “ Only a thimble , ” said Alice sadly . # . J/R/C D/P NSg/VB . . VP/J NPr+ R . > # > “ Hand it over here , ” said the Dodo . # . NSg/VB+ NPr/ISg+ NSg/J/P J/R . . VP/J D NSg . > # > Then they all crowded round her once more , while the Dodo solemnly presented the # NSg/J/R/C IPl+ NSg/I/J/C/Dq VP/J NSg/VB/J/P ISg/D$+ NSg/C NPr/I/J/R/Dq . NSg/VB/C/P D NSg R VP/J D > thimble , saying “ We beg your acceptance of this elegant thimble ; ” and , when it # NSg/VB . N🅪Sg/Vg/J . IPl+ NSg/VB D$+ N🅪Sg P I/Ddem NSg/J NSg/VB . . VB/C . NSg/I/C NPr/ISg+ > had finished this short speech , they all cheered . # VP VP/J I/Ddem NPr/VB/J/P N🅪Sg/VB+ . IPl+ NSg/I/J/C/Dq VP/J+ . > # > Alice thought the whole thing very absurd , but they all looked so grave that she # NPr+ N🅪Sg/VP D+ NSg/J+ NSg+ J/R NSg/J . NSg/C/P IPl+ NSg/I/J/C/Dq VP/J NSg/I/J/R/C NSg/VB/J NSg/I/C/Ddem ISg+ > did not dare to laugh ; and , as she could not think of anything to say , she # VXPt NSg/R/C NPr/VXB P NSg/VB . VB/C . R/C/P ISg+ NSg/VXB NSg/R/C NSg/VB P NSg/I/VB+ P NSg/VB . ISg+ > simply bowed , and took the thimble , looking as solemn as she could . # R VP/J . VB/C VPt D NSg/VB . Nᴹ/Vg/J R/C/P J R/C/P ISg+ NSg/VXB . > # > The next thing was to eat the comfits : this caused some noise and confusion , as # D+ NSg/J/P+ NSg+ VLPt P VB D NPl/V3 . I/Ddem VP/J I/J/R/Dq N🅪Sg/VB VB/C N🅪Sg/VB+ . R/C/P > the large birds complained that they could not taste theirs , and the small ones # D NSg/J NPl/V3+ VP/J NSg/I/C/Ddem IPl+ NSg/VXB NSg/R/C NSg/VB/J I+ . VB/C D NPr/VB/J NPl+ > choked and had to be patted on the back . However , it was over at last , and they # VP/J VB/C VP P NSg/VLXB VP J/P D NSg/VB/J . C . NPr/ISg+ VLPt NSg/J/P NSg/P NSg/VB/J . VB/C IPl+ > sat down again in a ring , and begged the Mouse to tell them something more . # NSg/VP/J N🅪Sg/VB/J/P P NPr/J/R/P D/P+ NSg/VB+ . VB/C VP D+ NSg/VB+ P NPr/VB NSg/IPl+ NSg/I/J+ NPr/I/J/R/Dq . > # > “ You promised to tell me your history , you know , ” said Alice , “ and why it is you # . ISgPl+ VP/J P NPr/VB NPr/ISg+ D$+ N🅪Sg+ . ISgPl+ VB . . VP/J NPr+ . . VB/C NSg/VB NPr/ISg+ VL3 ISgPl+ > hate — C and D , ” she added in a whisper , half afraid that it would be offended # N🅪Sg/VB . NPr/VB/#r VB/C NPr/J/#r+ . . ISg+ VP/J NPr/J/R/P D/P+ NSg/VB+ . N🅪Sg/J/P+ J NSg/I/C/Ddem NPr/ISg+ VXB NSg/VLXB VP/J > again . # P . > # > “ Mine is a long and a sad tale ! ” said the Mouse , turning to Alice , and sighing . # . NSg/I/VB+ VL3 D/P NPr/VB/J VB/C D/P+ NSg/VB/J+ NSg/VB+ . . VP/J D+ NSg/VB+ . Nᴹ/Vg/J P NPr+ . VB/C Nᴹ/Vg/J . > # > “ It is a long tail , certainly , ” said Alice , looking down with wonder at the # . NPr/ISg+ VL3 D/P NPr/VB/J NSg/VB/J . R . . VP/J NPr+ . Nᴹ/Vg/J N🅪Sg/VB/J/P P N🅪Sg/VB NSg/P D > Mouse’s tail ; “ but why do you call it sad ? ” And she kept on puzzling about it # NSg$ NSg/VB/J+ . . NSg/C/P NSg/VB VXB ISgPl+ NSg/VB NPr/ISg+ NSg/VB/J . . VB/C ISg+ VP J/P Nᴹ/Vg/J J/P NPr/ISg+ > while the Mouse was speaking , so that her idea of the tale was something like # NSg/VB/C/P D+ NSg/VB+ VLPt Nᴹ/Vg/J . NSg/I/J/R/C NSg/I/C/Ddem ISg/D$+ NSg P D+ NSg/VB+ VLPt NSg/I/J+ NSg/VB/J/C/P > this : — # I/Ddem+ . . > # > “Fury said to a # Unlintable > mouse, That he # Unlintable Unlintable > met in the # Unlintable Unlintable > # Unlintable > # > house , ‘ Let us both go to law : I will prosecute you . — Come , I’ll take no # NPr/VB+ . Unlintable NSg/VBP NPr/IPl+ I/C/Dq NSg/VB/J P N🅪Sg/VB . ISg/#r+ NPr/VXB VB ISgPl+ . . NSg/VBPp/P . K NSg/VB NSg/Dq/P > denial ; We must have a trial : For really this morning I’ve nothing to do . ’ # N🅪Sg+ . IPl+ NSg/VXB NSg/VXB D/P NSg/VB/J+ . R/C/P R I/Ddem N🅪Sg/Vg/J+ K NSg/I/J+ P VXB . . > Said the mouse to the cur , ‘ Such a trial , dear sir , With no jury or judge , # VP/J D+ NSg/VB+ P D NSg/J . Unlintable NSg/I D/P NSg/VB/J+ . NSg/VB/J NPr/VB+ . P NSg/Dq/P NSg/VB/J NPr/C NSg/VB+ . > would be wasting our breath . ’ ‘ I’ll be judge , I’ll be jury , ’ Said cunning old # VXB NSg/VLXB Nᴹ/Vg/J D$+ N🅪Sg/VB/J+ . . Unlintable K NSg/VLXB NSg/VB+ . K NSg/VLXB NSg/VB/J+ . . VP/J NSg/J NSg/J > Fury : ‘ I’ll try the whole cause , and condemn you to death . ’ ” # N🅪Sg+ . Unlintable K NSg/VB/J D NSg/J N🅪Sg/VB/C . VB/C VB ISgPl+ P NPr🅪Sg . . . > # > “ You are not attending ! ” said the Mouse to Alice severely . “ What are you # . ISgPl+ VLB NSg/R/C Nᴹ/Vg/J . . VP/J D NSg/VB+ P NPr+ R . . NSg/I+ VLB ISgPl+ > thinking of ? ” # Nᴹ/Vg/J P . . > # > “ I beg your pardon , ” said Alice very humbly : “ you had got to the fifth bend , I # . ISg/#r+ NSg/VB D$+ NSg/VB . . VP/J NPr+ J/R R . . ISgPl+ VP VP P D NSg/VB/J NPr/VB+ . ISg/#r+ > think ? ” # NSg/VB . . > # > “ I had not ! ” cried the Mouse , sharply and very angrily . # . ISg/#r+ VP NSg/R/C . . VP/J D+ NSg/VB+ . R VB/C J/R R . > # > “ A knot ! ” said Alice , always ready to make herself useful , and looking anxiously # . D/P+ NSg/VB+ . . VP/J NPr+ . R NSg/VB/J P NSg/VB ISg+ J . VB/C Nᴹ/Vg/J R > about her . “ Oh , do let me help to undo it ! ” # J/P ISg/D$+ . . NPr/VB . VXB NSg/VBP NPr/ISg+ NSg/VB P NSg/VB/J NPr/ISg+ . . > # > “ I shall do nothing of the sort , ” said the Mouse , getting up and walking away . # . ISg/#r+ VXB VXB NSg/I/J P D+ NSg/VB+ . . VP/J D+ NSg/VB+ . NSg/Vg NSg/VB/J/P VB/C Nᴹ/Vg/J VB/J . > “ You insult me by talking such nonsense ! ” # . ISgPl+ NSg/VB+ NPr/ISg+ NSg/P Nᴹ/Vg/J NSg/I+ Nᴹ/VB/J+ . . > # > “ I didn’t mean it ! ” pleaded poor Alice . “ But you’re so easily offended , you # . ISg/#r+ VXPt NSg/VB/J NPr/ISg+ . . VP/J NSg/VB/J+ NPr+ . . NSg/C/P K NSg/I/J/R/C R VP/J . ISgPl+ > know ! ” # VB . . > # > The Mouse only growled in reply . # D+ NSg/VB+ J/R/C VP/J NPr/J/R/P NSg/VB+ . > # > “ Please come back and finish your story ! ” Alice called after it ; and the others # . VB NSg/VBPp/P NSg/VB/J VB/C NSg/VB D$+ NSg/VB+ . . NPr+ VP/J P NPr/ISg+ . VB/C D+ NPl/V3+ > all joined in chorus , “ Yes , please do ! ” but the Mouse only shook its head # NSg/I/J/C/Dq VP/J NPr/J/R/P NSg/VB+ . . NPl/VB . VB VXB . . NSg/C/P D+ NSg/VB+ J/R/C NSg/VPt/J ISg/D$+ NPr/VB/J+ > impatiently , and walked a little quicker . # R . VB/C VP/J D/P NPr/I/J/Dq NSg/JC . > # > “ What a pity it wouldn’t stay ! ” sighed the Lory , as soon as it was quite out of # . NSg/I+ D/P+ N🅪Sg/VB+ NPr/ISg+ VXB NSg/VB/J . . VP/J D ? . R/C/P J/R R/C/P NPr/ISg+ VLPt R NSg/VB/J/R/P P > sight ; and an old Crab took the opportunity of saying to her daughter “ Ah , my # N🅪Sg/VB+ . VB/C D/P NSg/J NSg/VB+ VPt D N🅪Sg P N🅪Sg/Vg/J P ISg/D$+ NSg+ . NSg/I/VB . D$+ > dear ! Let this be a lesson to you never to lose your temper ! ” “ Hold your tongue , # NSg/VB/J . NSg/VBP I/Ddem+ NSg/VLXB D/P NSg/VB P ISgPl+ R P VB D$+ NSg/VB/JC+ . . . NSg/VB/J D$+ N🅪Sg/VB+ . > Ma ! ” said the young Crab , a little snappishly . “ You’re enough to try the # NPr/J+ . . VP/J D+ NPr/VB/J+ NSg/VB+ . D/P NPr/I/J/Dq R . . K NSg/I P NSg/VB/J D > patience of an oyster ! ” # Nᴹ P D/P NSg/VB/J+ . . > # > “ I wish I had our Dinah here , I know I do ! ” said Alice aloud , addressing nobody # . ISg/#r+ NSg/VB ISg/#r+ VP D$+ NPr J/R . ISg/#r+ VB ISg/#r+ VXB . . VP/J NPr+ J . Nᴹ/Vg/J NSg/I+ > in particular . “ She’d soon fetch it back ! ” # NPr/J/R/P NSg/J . . K J/R NSg/VB NPr/ISg+ NSg/VB/J . . > # > “ And who is Dinah , if I might venture to ask the question ? ” said the Lory . # . VB/C NPr/I+ VL3 NPr . NSg/C ISg/#r+ Nᴹ/VXB/J NSg/VB+ P NSg/VB D NSg/VB+ . . VP/J D ? . > # > Alice replied eagerly , for she was always ready to talk about her pet : “ Dinah’s # NPr+ VP/J R . R/C/P ISg+ VLPt R NSg/VB/J P N🅪Sg/VB J/P ISg/D$+ NPr/VB/J+ . . NPr$ > our cat . And she’s such a capital one for catching mice you can’t think ! And oh , # D$+ NSg/VB/J+ . VB/C K NSg/I D/P N🅪Sg/J+ NSg/I/J+ R/C/P Nᴹ/Vg/J NPl/VB+ ISgPl+ VXB NSg/VB . VB/C NPr/VB . > I wish you could see her after the birds ! Why , she’ll eat a little bird as soon # ISg/#r+ NSg/VB ISgPl+ NSg/VXB NSg/VB ISg/D$+ P D+ NPl/V3+ . NSg/VB . K VB D/P NPr/I/J/Dq NPr/VB/J+ R/C/P J/R > as look at it ! ” # R/C/P NSg/VB NSg/P NPr/ISg+ . . > # > This speech caused a remarkable sensation among the party . Some of the birds # I/Ddem+ N🅪Sg/VB+ VP/J D/P J NSg+ P D+ NSg/VB/J+ . I/J/R/Dq P D+ NPl/V3+ > hurried off at once : one old Magpie began wrapping itself up very carefully , # VP/J+ NSg/VB/J/P NSg/P NSg/C . NSg/I/J NSg/J NSg/VB VPt N🅪Sg/Vg+ ISg+ NSg/VB/J/P J/R R . > remarking , “ I really must be getting home ; the night - air doesn’t suit my # Nᴹ/Vg/J . . ISg/#r+ R NSg/VXB NSg/VLXB NSg/Vg NSg/VB/J+ . D N🅪Sg/VB+ . N🅪Sg/VB+ VX3 NSg/VB+ D$+ > throat ! ” and a Canary called out in a trembling voice to its children , “ Come # NSg/VB+ . . VB/C D/P NSg/VB/J VP/J NSg/VB/J/R/P NPr/J/R/P D/P Nᴹ/Vg/J NSg/VB+ P ISg/D$+ NPl+ . . NSg/VBPp/P > away , my dears ! It’s high time you were all in bed ! ” On various pretexts they # VB/J . D$+ NPl/V3+ . K NSg/VB/J/R+ N🅪Sg/VB/J+ ISgPl+ NSg/VLPt NSg/I/J/C/Dq NPr/J/R/P NSg/VBP/J+ . . J/P J NPl/V3 IPl+ > all moved off , and Alice was soon left alone . # NSg/I/J/C/Dq VP/J+ NSg/VB/J/P . VB/C NPr+ VLPt J/R NPr/VP/J J . > # > “ I wish I hadn’t mentioned Dinah ! ” she said to herself in a melancholy tone . # . ISg/#r+ NSg/VB ISg/#r+ VPt VP/J NPr . . ISg+ VP/J P ISg+ NPr/J/R/P D/P NSg/J N🅪Sg/I/VB+ . > “ Nobody seems to like her , down here , and I’m sure she’s the best cat in the # . NSg/I+ V3 P NSg/VB/J/C/P ISg/D$+ . N🅪Sg/VB/J/P J/R . VB/C K J K D NPr/VXB/JS NSg/VB/J+ NPr/J/R/P D > world ! Oh , my dear Dinah ! I wonder if I shall ever see you any more ! ” And here # NSg/VB+ . NPr/VB . D$+ NSg/VB/J NPr . ISg/#r+ N🅪Sg/VB NSg/C ISg/#r+ VXB J/R NSg/VB ISgPl+ I/R/Dq NPr/I/J/R/Dq . . VB/C J/R > poor Alice began to cry again , for she felt very lonely and low - spirited . In a # NSg/VB/J+ NPr+ VPt P NSg/VB P . R/C/P ISg+ N🅪Sg/VP/J J/R J/R VB/C NSg/VB/J/R . VP/J . NPr/J/R/P D/P > little while , however , she again heard a little pattering of footsteps in the # NPr/I/J/Dq NSg/VB/C/P . C . ISg+ P VP/J D/P NPr/I/J/Dq Nᴹ/Vg/J P NPl+ NPr/J/R/P D > distance , and she looked up eagerly , half hoping that the Mouse had changed his # N🅪Sg/VB+ . VB/C ISg+ VP/J NSg/VB/J/P R . N🅪Sg/J/P+ Nᴹ/Vg/J NSg/I/C/Ddem D NSg/VB+ VP VP/J ISg/D$+ > mind , and was coming back to finish his story . # NSg/VB+ . VB/C VLPt Nᴹ/Vg/J NSg/VB/J P NSg/VB ISg/D$+ NSg/VB+ . > # > CHAPTER IV : The Rabbit Sends in a Little Bill # HeadingStart NSg/VB+ NSg/J/#r+ . D NSg/VB+ NPl/V3 NPr/J/R/P D/P NPr/I/J/Dq NPr/VB+ > # > It was the White Rabbit , trotting slowly back again , and looking anxiously about # NPr/ISg+ VLPt D NPr🅪Sg/VB/J NSg/VB . NSg/Vg/J R NSg/VB/J P . VB/C Nᴹ/Vg/J R J/P > as it went , as if it had lost something ; and she heard it muttering to itself # R/C/P NPr/ISg+ NSg/VPt . R/C/P NSg/C NPr/ISg+ VP VP/J NSg/I/J+ . VB/C ISg+ VP/J NPr/ISg+ Nᴹ/Vg/J P ISg+ > “ The Duchess ! The Duchess ! Oh my dear paws ! Oh my fur and whiskers ! She’ll get # . D NSg/VB . D NSg/VB . NPr/VB D$+ NSg/VB/J+ NPl/V3+ . NPr/VB D$+ N🅪Sg/VB/C/P+ VB/C NPl . K NSg/VB > me executed , as sure as ferrets are ferrets ! Where can I have dropped them , I # NPr/ISg+ VP/J . R/C/P J R/C/P NPl/V3 VLB NPl/V3 . NSg/R/C NPr/VXB ISg/#r+ NSg/VXB VP/J NSg/IPl+ . ISg/#r+ > wonder ? ” Alice guessed in a moment that it was looking for the fan and the pair # N🅪Sg/VB . . NPr+ VP/J NPr/J/R/P D/P+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ VLPt Nᴹ/Vg/J R/C/P D+ NSg/VB+ VB/C D NSg/VB > of white kid gloves , and she very good - naturedly began hunting about for them , # P NPr🅪Sg/VB/J+ NSg/VB+ NPl/V3+ . VB/C ISg+ J/R NPr/VB/J . ? VPt Nᴹ/Vg/J J/P R/C/P NSg/IPl+ . > but they were nowhere to be seen — everything seemed to have changed since her # NSg/C/P IPl+ NSg/VLPt NSg/J P NSg/VLXB NSg/VPp . NSg/I/VB+ VP/J P NSg/VXB VP/J C/P ISg/D$+ > swim in the pool , and the great hall , with the glass table and the little door , # NSg/VB NPr/J/R/P D NSg/VB+ . VB/C D NSg/J NPr+ . P D NPr🅪Sg/VB+ NSg/VB VB/C D NPr/I/J/Dq NSg/VB+ . > had vanished completely . # VP VP/J R . > # > Very soon the Rabbit noticed Alice , as she went hunting about , and called out to # J/R J/R D+ NSg/VB+ VP/J NPr+ . R/C/P ISg+ NSg/VPt Nᴹ/Vg/J J/P . VB/C VP/J NSg/VB/J/R/P P > her in an angry tone , “ Why , Mary Ann , what are you doing out here ? Run home this # ISg/D$+ NPr/J/R/P D/P+ VB/J+ N🅪Sg/I/VB+ . . NSg/VB . NPr+ NPr/J+ . NSg/I+ VLB ISgPl+ Nᴹ/Vg/J NSg/VB/J/R/P J/R . NSg/VBPp NSg/VB/J+ I/Ddem+ > moment , and fetch me a pair of gloves and a fan ! Quick , now ! ” And Alice was so # NSg+ . VB/C NSg/VB NPr/ISg+ D/P NSg/VB P NPl/V3 VB/C D/P+ NSg/VB+ . NSg/VB/J . NSg/J/R/C . . VB/C NPr+ VLPt NSg/I/J/R/C > much frightened that she ran off at once in the direction it pointed to , without # NSg/I/J/R/Dq VP/J NSg/I/C/Ddem ISg+ NSg/VPt NSg/VB/J/P NSg/P NSg/C NPr/J/R/P D+ N🅪Sg+ NPr/ISg+ VP/J P . C/P > trying to explain the mistake it had made . # Nᴹ/Vg/J P VB D+ NSg/VB+ NPr/ISg+ VP VP . > # > “ He took me for his housemaid , ” she said to herself as she ran . “ How surprised # . NPr/ISg+ VPt NPr/ISg+ R/C/P ISg/D$+ NSg/VB . . ISg+ VP/J P ISg+ R/C/P ISg+ NSg/VPt . . NSg/C VP/J > he’ll be when he finds out who I am ! But I’d better take him his fan and # K NSg/VLXB NSg/I/C NPr/ISg+ NPl/V3 NSg/VB/J/R/P NPr/I+ ISg/#r+ NPr/VLB/J . NSg/C/P K NSg/VXB/JC NSg/VB ISg+ ISg/D$+ NSg/VB VB/C > gloves — that is , if I can find them . ” As she said this , she came upon a neat # NPl/V3+ . NSg/I/C/Ddem+ VL3 . NSg/C ISg/#r+ NPr/VXB NSg/VB NSg/IPl+ . . R/C/P ISg+ VP/J I/Ddem+ . ISg+ NSg/VPt/P P D/P+ J+ > little house , on the door of which was a bright brass plate with the name “ W. # NPr/I/J/Dq+ NPr/VB+ . J/P D NSg/VB P I/C+ VLPt D/P NPr/VB/J N🅪Sg/VB/J NSg/VB P D+ NSg/VB+ . ? > RABBIT , ” engraved upon it . She went in without knocking , and hurried upstairs , # NSg/VB+ . . VP/J P NPr/ISg+ . ISg+ NSg/VPt NPr/J/R/P C/P Nᴹ/Vg/J . VB/C VP/J NSg/J . > in great fear lest she should meet the real Mary Ann , and be turned out of the # NPr/J/R/P NSg/J+ N🅪Sg/VB+ JS ISg+ VXB NSg/VB/J D+ NSg/J+ NPr+ NPr/J+ . VB/C NSg/VLXB VP/J NSg/VB/J/R/P P D+ > house before she had found the fan and gloves . # NPr/VB+ C/P ISg+ VP NSg/VP D NSg/VB VB/C NPl/V3+ . > # > “ How queer it seems , ” Alice said to herself , “ to be going messages for a rabbit ! # . NSg/C NSg/VB/J NPr/ISg+ V3 . . NPr+ VP/J P ISg+ . . P NSg/VLXB Nᴹ/Vg/J NPl/V3 R/C/P D/P+ NSg/VB+ . > I suppose Dinah’ll be sending me on messages next ! ” And she began fancying the # ISg/#r+ VB ? NSg/VLXB Nᴹ/Vg/J NPr/ISg+ J/P NPl/V3+ NSg/J/P . . VB/C ISg+ VPt Nᴹ/Vg/J D > sort of thing that would happen : “ ‘ Miss Alice ! Come here directly , and get ready # NSg/VB P NSg+ NSg/I/C/Ddem+ VXB VB . . Unlintable NSg/VB NPr+ . NSg/VBPp/P J/R R/C . VB/C NSg/VB NSg/VB/J > for your walk ! ’ ‘ Coming in a minute , nurse ! But I’ve got to see that the mouse # R/C/P D$+ NSg/VB+ . . Unlintable Nᴹ/Vg/J NPr/J/R/P D/P+ NSg/VB/J+ . NSg/VB+ . NSg/C/P K VP P NSg/VB NSg/I/C/Ddem D NSg/VB+ > doesn’t get out . ’ Only I don’t think , ” Alice went on , “ that they’d let Dinah # VX3 NSg/VB NSg/VB/J/R/P . . J/R/C ISg/#r+ VXB NSg/VB . . NPr+ NSg/VPt J/P . . NSg/I/C/Ddem+ K NSg/VBP NPr > stop in the house if it began ordering people about like that ! ” # NSg/VB NPr/J/R/P D NPr/VB+ NSg/C NPr/ISg+ VPt Nᴹ/Vg/J NPl/VB+ J/P NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > By this time she had found her way into a tidy little room with a table in the # NSg/P I/Ddem+ N🅪Sg/VB/J+ ISg+ VP NSg/VP ISg/D$+ NSg/J+ P D/P NSg/VB/J NPr/I/J/Dq N🅪Sg/VB/J P D/P NSg/VB+ NPr/J/R/P D > window , and on it ( as she had hoped ) a fan and two or three pairs of tiny white # NSg/VB+ . VB/C J/P NPr/ISg+ . R/C/P ISg+ VP VP/J . D/P NSg/VB+ VB/C NSg NPr/C NSg NPl/V3 P NSg/J NPr🅪Sg/VB/J > kid gloves : she took up the fan and a pair of the gloves , and was just going to # NSg/VB+ NPl/V3+ . ISg+ VPt NSg/VB/J/P D NSg/VB+ VB/C D/P NSg/VB P D NPl/V3+ . VB/C VLPt J/R Nᴹ/Vg/J P > leave the room , when her eye fell upon a little bottle that stood near the # NSg/VB D N🅪Sg/VB/J+ . NSg/I/C ISg/D$+ NSg/VB+ NSg/VPt/J P D/P NPr/I/J/Dq NSg/VB+ NSg/I/C/Ddem+ VP NSg/VB/J/P D > looking - glass . There was no label this time with the words “ DRINK ME , ” but # Nᴹ/Vg/J+ . NPr🅪Sg/VB+ . R+ VLPt NSg/Dq/P+ NSg/VB+ I/Ddem N🅪Sg/VB/J+ P D+ NPl/V3+ . NSg/VB+ NPr/ISg+ . . NSg/C/P > nevertheless she uncorked it and put it to her lips . “ I know something # R ISg+ VP/J NPr/ISg+ VB/C NSg/VBP NPr/ISg+ P ISg/D$+ NPl/V3+ . . ISg/#r+ VB NSg/I/J+ > interesting is sure to happen , ” she said to herself , “ whenever I eat or drink # Vg/J VL3 J P VB . . ISg+ VP/J P ISg+ . . C ISg/#r+ VB NPr/C NSg/VB+ > anything ; so I’ll just see what this bottle does . I do hope it’ll make me grow # NSg/I/VB+ . NSg/I/J/R/C K J/R NSg/VB NSg/I+ I/Ddem NSg/VB+ NPl/VX3 . ISg/#r+ VXB NPr🅪Sg/VB K NSg/VB NPr/ISg+ VB > large again , for really I’m quite tired of being such a tiny little thing ! ” # NSg/J P . R/C/P R K R VP/J P N🅪Sg/VLg/J/C NSg/I D/P NSg/J NPr/I/J/Dq NSg+ . . > # > It did so indeed , and much sooner than she had expected : before she had drunk # NPr/ISg+ VXPt NSg/I/J/R/C R . VB/C NSg/I/J/R/Dq JC C/P ISg+ VP NSg/VP/J . C/P ISg+ VP NSg/VPp/J+ > half the bottle , she found her head pressing against the ceiling , and had to # N🅪Sg/J/P+ D+ NSg/VB+ . ISg+ NSg/VP ISg/D$+ NPr/VB/J+ Nᴹ/Vg/J C/P D+ NSg/VB+ . VB/C VP P > stoop to save her neck from being broken . She hastily put down the bottle , # NSg/VB P NSg/VB/C/P ISg/D$+ NSg/VB+ P N🅪Sg/VLg/J/C VPp/J . ISg+ R NSg/VBP N🅪Sg/VB/J/P D+ NSg/VB+ . > saying to herself “ That’s quite enough — I hope I shan’t grow any more — As it is , I # N🅪Sg/Vg/J P ISg+ . NSg$ R NSg/I . ISg/#r+ NPr🅪Sg/VB ISg/#r+ VXB VB I/R/Dq NPr/I/J/R/Dq . R/C/P NPr/ISg+ VL3 . ISg/#r+ > can’t get out at the door — I do wish I hadn’t drunk quite so much ! ” # VXB NSg/VB NSg/VB/J/R/P NSg/P D NSg/VB+ . ISg/#r+ VXB NSg/VB ISg/#r+ VPt NSg/VPp/J R NSg/I/J/R/C NSg/I/J/R/Dq . . > # > Alas ! it was too late to wish that ! She went on growing , and growing , and very # NPrPl . NPr/ISg+ VLPt R NSg/J P NSg/VB NSg/I/C/Ddem+ . ISg+ NSg/VPt J/P Nᴹ/Vg/J . VB/C Nᴹ/Vg/J . VB/C J/R > soon had to kneel down on the floor : in another minute there was not even room # J/R VP P VB N🅪Sg/VB/J/P J/P D NSg/VB+ . NPr/J/R/P I/D NSg/VB/J+ R+ VLPt NSg/R/C NSg/VB/J/R N🅪Sg/VB/J+ > for this , and she tried the effect of lying down with one elbow against the # R/C/P I/Ddem+ . VB/C ISg+ VP/J D NSg/VB+ P Nᴹ/Vg/J N🅪Sg/VB/J/P P NSg/I/J NSg/VB+ C/P D > door , and the other arm curled round her head . Still she went on growing , and , # NSg/VB+ . VB/C D NSg/VB/J NSg/VB/J+ VP/J NSg/VB/J/P ISg/D$+ NPr/VB/J+ . NSg/VB/J/R ISg+ NSg/VPt J/P Nᴹ/Vg/J . VB/C . > as a last resource , she put one arm out of the window , and one foot up the # R/C/P D/P+ NSg/VB/J+ N🅪Sg/VB+ . ISg+ NSg/VBP NSg/I/J NSg/VB/J+ NSg/VB/J/R/P P D+ NSg/VB+ . VB/C NSg/I/J+ NSg/VB+ NSg/VB/J/P D+ > chimney , and said to herself “ Now I can do no more , whatever happens . What will # NSg/VB+ . VB/C VP/J P ISg+ . NSg/J/R/C ISg/#r+ NPr/VXB VXB NSg/Dq/P NPr/I/J/R/Dq . NSg/I/J+ V3 . NSg/I+ NPr/VXB > become of me ? ” # VBPp P NPr/ISg+ . . > # > Luckily for Alice , the little magic bottle had now had its full effect , and she # R R/C/P NPr+ . D+ NPr/I/J/Dq+ N🅪Sg/VB/J+ NSg/VB+ VP NSg/J/R/C VP ISg/D$+ NSg/VB/J+ NSg/VB+ . VB/C ISg+ > grew no larger : still it was very uncomfortable , and , as there seemed to be no # VPt NSg/Dq/P JC . NSg/VB/J/R NPr/ISg+ VLPt J/R J . VB/C . R/C/P R+ VP/J P NSg/VLXB NSg/Dq/P > sort of chance of her ever getting out of the room again , no wonder she felt # NSg/VB P NPr/VB/J P ISg/D$+ J/R NSg/Vg NSg/VB/J/R/P P D+ N🅪Sg/VB/J+ P . NSg/Dq/P N🅪Sg/VB ISg+ N🅪Sg/VP/J > unhappy . # NSg/VB/J . > # > “ It was much pleasanter at home , ” thought poor Alice , “ when one wasn’t always # . NPr/ISg+ VLPt NSg/I/J/R/Dq JC NSg/P NSg/VB/J+ . . N🅪Sg/VP NSg/VB/J NPr+ . . NSg/I/C NSg/I/J VPt R > growing larger and smaller , and being ordered about by mice and rabbits . I # Nᴹ/Vg/J JC VB/C NSg/JC . VB/C N🅪Sg/VLg/J/C VP/J J/P NSg/P NPl/VB VB/C NPl/V3+ . ISg/#r+ > almost wish I hadn’t gone down that rabbit - hole — and yet — and yet — it’s rather # R NSg/VB ISg/#r+ VPt VPp/J/P N🅪Sg/VB/J/P NSg/I/C/Ddem NSg/VB+ . NSg/VB+ . VB/C NSg/VB/C . VB/C NSg/VB/C . K NPr/VB/J/R > curious , you know , this sort of life ! I do wonder what can have happened to me ! # J . ISgPl+ VB . I/Ddem NSg/VB P N🅪Sg/VB+ . ISg/#r+ VXB N🅪Sg/VB NSg/I+ NPr/VXB NSg/VXB VP/J P NPr/ISg+ . > When I used to read fairy - tales , I fancied that kind of thing never happened , # NSg/I/C ISg/#r+ VP/J P NSg/VBP NSg/J+ . NPl/V3+ . ISg/#r+ VP/J NSg/I/C/Ddem NSg/J P NSg+ R VP/J . > and now here I am in the middle of one ! There ought to be a book written about # VB/C NSg/J/R/C J/R ISg/#r+ NPr/VLB/J NPr/J/R/P D NSg/VB/J P NSg/I/J . R+ NSg/I/VXB P NSg/VLXB D/P NSg/VB+ VPp/J J/P > me , that there ought ! And when I grow up , I’ll write one — but I’m grown up now , ” # NPr/ISg+ . NSg/I/C/Ddem R+ NSg/I/VXB . VB/C NSg/I/C ISg/#r+ VB NSg/VB/J/P . K NSg/VB NSg/I/J . NSg/C/P K VB/J NSg/VB/J/P NSg/J/R/C . . > she added in a sorrowful tone ; “ at least there’s no room to grow up any more # ISg+ VP/J NPr/J/R/P D/P J N🅪Sg/I/VB+ . . NSg/P NSg/J/Dq K NSg/Dq/P N🅪Sg/VB/J+ P VB NSg/VB/J/P I/R/Dq NPr/I/J/R/Dq > here . ” # J/R . . > # > “ But then , ” thought Alice , “ shall I never get any older than I am now ? That’ll # . NSg/C/P NSg/J/R/C . . N🅪Sg/VP NPr+ . . VXB ISg/#r+ R NSg/VB I/R/Dq JC C/P ISg/#r+ NPr/VLB/J NSg/J/R/C . K > be a comfort , one way — never to be an old woman — but then — always to have lessons # NSg/VLXB D/P N🅪Sg/VB+ . NSg/I/J NSg/J+ . R P NSg/VLXB D/P NSg/J NSg/VB+ . NSg/C/P NSg/J/R/C . R P NSg/VXB NPl/V3+ > to learn ! Oh , I shouldn’t like that ! ” # P NSg/VB . NPr/VB . ISg/#r+ VXB NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > “ Oh , you foolish Alice ! ” she answered herself . “ How can you learn lessons in # . NPr/VB . ISgPl+ J+ NPr+ . . ISg+ VP/J ISg+ . . NSg/C NPr/VXB ISgPl+ NSg/VB NPl/V3+ NPr/J/R/P > here ? Why , there’s hardly room for you , and no room at all for any # J/R . NSg/VB . K R N🅪Sg/VB/J+ R/C/P ISgPl+ . VB/C NSg/Dq/P N🅪Sg/VB/J+ NSg/P NSg/I/J/C/Dq R/C/P I/R/Dq > lesson - books ! ” # NSg/VB+ . NPl/V3+ . . > # > And so she went on , taking first one side and then the other , and making quite a # VB/C NSg/I/J/R/C ISg+ NSg/VPt J/P . NSg/Vg/J NSg/J+ NSg/I/J+ NSg/VB/J+ VB/C NSg/J/R/C D NSg/VB/J . VB/C Nᴹ/Vg/J R D/P > conversation of it altogether ; but after a few minutes she heard a voice # N🅪Sg/VB P NPr/ISg+ NSg . NSg/C/P P D/P+ NSg/I/Dq+ NPl/V3+ ISg+ VP/J D/P+ NSg/VB+ > outside , and stopped to listen . # Nᴹ/VB/J/P . VB/C VP/J P NSg/VB . > # > “ Mary Ann ! Mary Ann ! ” said the voice . “ Fetch me my gloves this moment ! ” Then # . NPr+ NPr/J+ . NPr+ NPr/J+ . . VP/J D+ NSg/VB+ . . NSg/VB NPr/ISg+ D$+ NPl/V3 I/Ddem+ NSg+ . . NSg/J/R/C > came a little pattering of feet on the stairs . Alice knew it was the Rabbit # NSg/VPt/P D/P NPr/I/J/Dq Nᴹ/Vg/J P NPl J/P D NPl+ . NPr+ VPt NPr/ISg+ VLPt D NSg/VB > coming to look for her , and she trembled till she shook the house , quite # Nᴹ/Vg/J P NSg/VB R/C/P ISg/D$+ . VB/C ISg+ VP/J NSg/VB/C/P ISg+ NSg/VPt/J D+ NPr/VB+ . R > forgetting that she was now about a thousand times as large as the Rabbit , and # NSg/Vg NSg/I/C/Ddem ISg+ VLPt NSg/J/R/C J/P D/P+ NSg+ NPl/V3+ R/C/P NSg/J R/C/P D+ NSg/VB+ . VB/C > had no reason to be afraid of it . # VP NSg/Dq/P N🅪Sg/VB+ P NSg/VLXB J P NPr/ISg+ . > # > Presently the Rabbit came up to the door , and tried to open it ; but , as the door # R D+ NSg/VB+ NSg/VPt/P NSg/VB/J/P P D+ NSg/VB+ . VB/C VP/J P NSg/VB/J NPr/ISg+ . NSg/C/P . R/C/P D+ NSg/VB+ > opened inwards , and Alice’s elbow was pressed hard against it , that attempt # VP/J NPl . VB/C NPr$ NSg/VB+ VLPt VP/J N🅪Sg/J/R C/P NPr/ISg+ . NSg/I/C/Ddem NSg/VB+ > proved a failure . Alice heard it say to itself “ Then I’ll go round and get in at # VP/J D/P N🅪Sg+ . NPr+ VP/J NPr/ISg+ NSg/VB P ISg+ . NSg/J/R/C K NSg/VB/J NSg/VB/J/P VB/C NSg/VB NPr/J/R/P NSg/P > the window . ” # D NSg/VB+ . . > # > “ That you won’t ! ” thought Alice , and , after waiting till she fancied she heard # . NSg/I/C/Ddem ISgPl+ VXB . . N🅪Sg/VP NPr+ . VB/C . P Nᴹ/Vg/J NSg/VB/C/P ISg+ VP/J ISg+ VP/J > the Rabbit just under the window , she suddenly spread out her hand , and made a # D+ NSg/VB+ J/R NSg/J/P D+ NSg/VB+ . ISg+ R N🅪Sg/VBP NSg/VB/J/R/P ISg/D$+ NSg/VB+ . VB/C VP D/P > snatch in the air . She did not get hold of anything , but she heard a little # NSg/VB NPr/J/R/P D N🅪Sg/VB+ . ISg+ VXPt NSg/R/C NSg/VB NSg/VB/J P NSg/I/VB+ . NSg/C/P ISg+ VP/J D/P NPr/I/J/Dq > shriek and a fall , and a crash of broken glass , from which she concluded that it # NSg/VB VB/C D/P N🅪Sg/VB+ . VB/C D/P NSg/VB/J P VPp/J NPr🅪Sg/VB+ . P I/C+ ISg+ VP/J NSg/I/C/Ddem NPr/ISg+ > was just possible it had fallen into a cucumber - frame , or something of the sort . # VLPt J/R NSg/J NPr/ISg+ VP VPp/J P D/P N🅪Sg+ . NSg/VB+ . NPr/C NSg/I/J P D NSg/VB+ . > # > Next came an angry voice — the Rabbit’s — “ Pat ! Pat ! Where are you ? ” And then a # NSg/J/P NSg/VPt/P D/P+ VB/J+ NSg/VB+ . D NSg$ . . NPr/VB/J+ . NPr/VB/J+ . NSg/R/C VLB ISgPl+ . . VB/C NSg/J/R/C D/P+ > voice she had never heard before , “ Sure then I’m here ! Digging for apples , yer # NSg/VB+ ISg+ VP R VP/J C/P . . J NSg/J/R/C K J/R . NSg/Vg R/C/P NPl . + > honour ! ” # N🅪Sg/VB/Comm+ . . > # > “ Digging for apples , indeed ! ” said the Rabbit angrily . “ Here ! Come and help me # . NSg/Vg R/C/P NPl . R . . VP/J D+ NSg/VB+ R . . J/R . NSg/VBPp/P VB/C NSg/VB NPr/ISg+ > out of this ! ” ( Sounds of more broken glass . ) # NSg/VB/J/R/P P I/Ddem+ . . . NPl/V3 P NPr/I/J/R/Dq VPp/J NPr🅪Sg/VB+ . . > # > “ Now tell me , Pat , what’s that in the window ? ” # . NSg/J/R/C NPr/VB NPr/ISg+ . NPr/VB/J+ . K NSg/I/C/Ddem+ NPr/J/R/P D NSg/VB+ . . > # > “ Sure , it’s an arm , yer honour ! ” ( He pronounced it “ arrum . ” ) # . J . K D/P NSg/VB/J+ . + N🅪Sg/VB/Comm+ . . . NPr/ISg+ VP/J NPr/ISg+ . ? . . . > # > “ An arm , you goose ! Who ever saw one that size ? Why , it fills the whole window ! ” # . D/P+ NSg/VB/J+ . ISgPl+ NSg/VB+ . NPr/I+ J/R NSg/VPt NSg/I/J NSg/I/C/Ddem+ N🅪Sg/VB+ . NSg/VB . NPr/ISg+ NPl/V3 D+ NSg/J+ NSg/VB+ . . > # > “ Sure , it does , yer honour : but it’s an arm for all that . ” # . J . NPr/ISg+ NPl/VX3 . + N🅪Sg/VB/Comm+ . NSg/C/P K D/P NSg/VB/J+ R/C/P NSg/I/J/C/Dq+ NSg/I/C/Ddem+ . . > # > “ Well , it’s got no business there , at any rate : go and take it away ! ” # . NSg/VB/J/R . K VP NSg/Dq/P N🅪Sg/J+ R . NSg/P I/R/Dq NSg/VB+ . NSg/VB/J VB/C NSg/VB NPr/ISg+ VB/J . . > # > There was a long silence after this , and Alice could only hear whispers now and # R+ VLPt D/P+ NPr/VB/J+ NSg/VB+ P I/Ddem+ . VB/C NPr+ NSg/VXB J/R/C VB NPl/V3 NSg/J/R/C VB/C > then ; such as , “ Sure , I don’t like it , yer honour , at all , at all ! ” “ Do as I # NSg/J/R/C . NSg/I R/C/P . . J . ISg/#r+ VXB NSg/VB/J/C/P NPr/ISg+ . + N🅪Sg/VB/Comm+ . NSg/P NSg/I/J/C/Dq . NSg/P NSg/I/J/C/Dq . . . VXB R/C/P ISg/#r+ > tell you , you coward ! ” and at last she spread out her hand again , and made # NPr/VB ISgPl+ . ISgPl+ NPr/VB/J . . VB/C NSg/P NSg/VB/J ISg+ N🅪Sg/VBP NSg/VB/J/R/P ISg/D$+ NSg/VB+ P . VB/C VP > another snatch in the air . This time there were two little shrieks , and more # I/D NSg/VB NPr/J/R/P D N🅪Sg/VB+ . I/Ddem+ N🅪Sg/VB/J+ R+ NSg/VLPt NSg+ NPr/I/J/Dq+ NPl/V3+ . VB/C NPr/I/J/R/Dq > sounds of broken glass . “ What a number of cucumber - frames there must be ! ” # NPl/V3 P VPp/J NPr🅪Sg/VB+ . . NSg/I+ D/P N🅪Sg/VB/JC P N🅪Sg+ . NPl/V3+ R+ NSg/VXB NSg/VLXB . . > thought Alice . “ I wonder what they’ll do next ! As for pulling me out of the # N🅪Sg/VP NPr+ . . ISg/#r+ N🅪Sg/VB NSg/I+ K VXB NSg/J/P . R/C/P R/C/P+ Nᴹ/Vg/J NPr/ISg+ NSg/VB/J/R/P P D+ > window , I only wish they could ! I’m sure I don’t want to stay in here any # NSg/VB+ . ISg/#r+ J/R/C NSg/VB IPl+ NSg/VXB . K J ISg/#r+ VXB NSg/VB P NSg/VB/J NPr/J/R/P J/R I/R/Dq > longer ! ” # NSg/JC . . > # > She waited for some time without hearing anything more : at last came a rumbling # ISg+ VP/J R/C/P I/J/R/Dq N🅪Sg/VB/J+ C/P Nᴹ/Vg/J+ NSg/I/VB+ NPr/I/J/R/Dq . NSg/P NSg/VB/J NSg/VPt/P D/P N🅪Sg/Vg/J > of little cartwheels , and the sound of a good many voices all talking together : # P NPr/I/J/Dq NPl/V3 . VB/C D N🅪Sg/VB/J P D/P NPr/VB/J NSg/I/J/Dq NPl/V3+ NSg/I/J/C/Dq Nᴹ/Vg/J J . > she made out the words : “ Where’s the other ladder ? — Why , I hadn’t to bring but # ISg+ VP NSg/VB/J/R/P D NPl/V3+ . . NSg$ D NSg/VB/J NSg/VB+ . . NSg/VB . ISg/#r+ VPt P VB NSg/C/P > one ; Bill’s got the other — Bill ! fetch it here , lad ! — Here , put ’ em up at this # NSg/I/J . NPr$ VP D NSg/VB/J . NPr/VB+ . NSg/VB NPr/ISg+ J/R . NSg . . J/R . NSg/VBP . NSg/I/J+ NSg/VB/J/P NSg/P I/Ddem+ > corner — No , tie ’ em together first — they don’t reach half high enough yet — Oh ! # NSg/VB+ . NSg/Dq/P . NSg/VB+ . NSg/I/J+ J NSg/J . IPl+ VXB NSg/VB N🅪Sg/J/P+ NSg/VB/J/R NSg/I NSg/VB/C . NPr/VB . > they’ll do well enough ; don’t be particular — Here , Bill ! catch hold of this # K VXB NSg/VB/J/R NSg/I . VXB NSg/VLXB NSg/J . J/R . NPr/VB+ . NSg/VB NSg/VB/J P I/Ddem+ > rope — Will the roof bear ? — Mind that loose slate — Oh , it’s coming down ! Heads # NSg/VB+ . NPr/VXB D+ NSg/VB+ NSg/VB/J+ . . NSg/VB+ NSg/I/C/Ddem NSg/VB/J+ NSg/VB/J+ . NPr/VB . K Nᴹ/Vg/J N🅪Sg/VB/J/P . NPl/V3+ > below ! ” ( a loud crash ) — “ Now , who did that ? — It was Bill , I fancy — Who’s to go down # P . . . D/P+ NSg/J+ NSg/VB/J+ . . . NSg/J/R/C . NPr/I+ VXPt NSg/I/C/Ddem+ . . NPr/ISg+ VLPt NPr/VB+ . ISg/#r+ NSg/VB/J . NPr$ P NSg/VB/J N🅪Sg/VB/J/P > the chimney ? — Nay , I shan’t ! You do it ! — That I won’t , then ! — Bill’s to go # D NSg/VB+ . . NSg/VB/J . ISg/#r+ VXB . ISgPl+ VXB NPr/ISg+ . . NSg/I/C/Ddem ISg/#r+ VXB . NSg/J/R/C . . NPr$ P NSg/VB/J > down — Here , Bill ! the master says you’re to go down the chimney ! ” # N🅪Sg/VB/J/P . J/R . NPr/VB+ . D+ NPr/VB/J+ NPl/V3 K P NSg/VB/J N🅪Sg/VB/J/P D NSg/VB+ . . > # > “ Oh ! So Bill’s got to come down the chimney , has he ? ” said Alice to herself . # . NPr/VB . NSg/I/J/R/C NPr$ VP P NSg/VBPp/P N🅪Sg/VB/J/P D NSg/VB+ . V3 NPr/ISg+ . . VP/J NPr+ P ISg+ . > “ Shy , they seem to put everything upon Bill ! I wouldn’t be in Bill’s place for a # . NSg/VB/J . IPl+ VB P NSg/VBP NSg/I/VB+ P NPr/VB+ . ISg/#r+ VXB NSg/VLXB NPr/J/R/P NPr$ N🅪Sg/VB+ R/C/P D/P > good deal : this fireplace is narrow , to be sure ; but I think I can kick a # NPr/VB/J NSg/VB/J+ . I/Ddem NSg+ VL3 NSg/VB/J . P NSg/VLXB J . NSg/C/P ISg/#r+ NSg/VB ISg/#r+ NPr/VXB NSg/VB D/P > little ! ” # NPr/I/J/Dq . . > # > She drew her foot as far down the chimney as she could , and waited till she # ISg+ NPr/VPt ISg/D$+ NSg/VB+ R/C/P NSg/VB/J N🅪Sg/VB/J/P D+ NSg/VB+ R/C/P ISg+ NSg/VXB . VB/C VP/J NSg/VB/C/P ISg+ > heard a little animal ( she couldn’t guess of what sort it was ) scratching and # VP/J D/P+ NPr/I/J/Dq+ NSg/J+ . ISg+ VXB NSg/VB P NSg/I+ NSg/VB+ NPr/ISg+ VLPt . Nᴹ/Vg/J VB/C > scrambling about in the chimney close above her : then , saying to herself “ This # Nᴹ/Vg/J J/P NPr/J/R/P D NSg/VB+ NSg/VB/J NSg/J/P ISg/D$+ . NSg/J/R/C . N🅪Sg/Vg/J P ISg+ . I/Ddem+ > is Bill , ” she gave one sharp kick , and waited to see what would happen next . # VL3 NPr/VB+ . . ISg+ VPt NSg/I/J NPr/VB/J NSg/VB+ . VB/C VP/J P NSg/VB NSg/I+ VXB VB NSg/J/P . > # > The first thing she heard was a general chorus of “ There goes Bill ! ” then the # D+ NSg/J+ NSg+ ISg+ VP/J VLPt D/P NSg/VB/J NSg/VB P . R+ NPl/V3 NPr/VB+ . . NSg/J/R/C D > Rabbit’s voice along — “ Catch him , you by the hedge ! ” then silence , and then # NSg$ NSg/VB+ P . . NSg/VB ISg+ . ISgPl+ NSg/P D NSg/VB+ . . NSg/J/R/C NSg/VB+ . VB/C NSg/J/R/C > another confusion of voices — “ Hold up his head — Brandy now — Don’t choke him — How was # I/D N🅪Sg/VB P NPl/V3+ . . NSg/VB/J NSg/VB/J/P ISg/D$+ NPr/VB/J+ . NPr/VB+ NSg/J/R/C . VXB NSg/VB ISg+ . NSg/C VLPt > it , old fellow ? What happened to you ? Tell us all about it ! ” # NPr/ISg+ . NSg/J NSg . NSg/I+ VP/J P ISgPl+ . NPr/VB NPr/IPl+ NSg/I/J/C/Dq J/P NPr/ISg+ . . > # > Last came a little feeble , squeaking voice , ( “ That’s Bill , ” thought Alice , ) # NSg/VB/J NSg/VPt/P D/P NPr/I/J/Dq VB/J . Nᴹ/Vg/J NSg/VB+ . . . NSg$ NPr/VB+ . . N🅪Sg/VP NPr+ . . > “ Well , I hardly know — No more , thank ye ; I’m better now — but I’m a deal too # . NSg/VB/J/R . ISg/#r+ R VB . NSg/Dq/P NPr/I/J/R/Dq . NSg/VB NSg/I/D+ . K NSg/VXB/JC NSg/J/R/C . NSg/C/P K D/P NSg/VB/J+ R > flustered to tell you — all I know is , something comes at me like a # VP/J P NPr/VB ISgPl+ . NSg/I/J/C/Dq ISg/#r+ VB VL3 . NSg/I/J+ NPl/V3 NSg/P NPr/ISg+ NSg/VB/J/C/P D/P > Jack - in - the - box , and up I goes like a sky - rocket ! ” # NPr/VB/J+ . NPr/J/R/P . D . NSg/VB+ . VB/C NSg/VB/J/P ISg/#r+ NPl/V3 NSg/VB/J/C/P D/P N🅪Sg/VB+ . NSg/VB+ . . > # > “ So you did , old fellow ! ” said the others . # . NSg/I/J/R/C ISgPl+ VXPt . NSg/J NSg . . VP/J D+ NPl/V3+ . > # > “ We must burn the house down ! ” said the Rabbit’s voice ; and Alice called out as # . IPl+ NSg/VXB NSg/VB D+ NPr/VB+ N🅪Sg/VB/J/P . . VP/J D NSg$ NSg/VB+ . VB/C NPr+ VP/J NSg/VB/J/R/P R/C/P > loud as she could , “ If you do , I’ll set Dinah at you ! ” # NSg/J R/C/P ISg+ NSg/VXB . . NSg/C ISgPl+ VXB . K NPr/VBP/J NPr NSg/P ISgPl+ . . > # > There was a dead silence instantly , and Alice thought to herself , “ I wonder what # R+ VLPt D/P+ NSg/VB/J+ NSg/VB+ R . VB/C NPr+ N🅪Sg/VP P ISg+ . . ISg/#r+ N🅪Sg/VB NSg/I+ > they will do next ! If they had any sense , they’d take the roof off . ” After a # IPl+ NPr/VXB VXB NSg/J/P . NSg/C IPl+ VP I/R/Dq+ N🅪Sg/VB+ . K NSg/VB D NSg/VB+ NSg/VB/J/P . . P D/P+ > minute or two , they began moving about again , and Alice heard the Rabbit say , “ A # NSg/VB/J+ NPr/C NSg . IPl+ VPt Nᴹ/Vg/J J/P P . VB/C NPr+ VP/J D+ NSg/VB+ NSg/VB . . D/P > barrowful will do , to begin with . ” # ? NPr/VXB VXB . P NSg/VB P . . > # > “ A barrowful of what ? ” thought Alice ; but she had not long to doubt , for the # . D/P ? P NSg/I+ . . N🅪Sg/VP NPr+ . NSg/C/P ISg+ VP NSg/R/C NPr/VB/J P N🅪Sg/VB . R/C/P D > next moment a shower of little pebbles came rattling in at the window , and some # NSg/J/P+ NSg+ D/P NSg/VB P NPr/I/J/Dq+ NPl/V3+ NSg/VPt/P Nᴹ/Vg/J NPr/J/R/P NSg/P D+ NSg/VB+ . VB/C I/J/R/Dq > of them hit her in the face . “ I’ll put a stop to this , ” she said to herself , and # P NSg/IPl+ NSg/VBP/J ISg/D$+ NPr/J/R/P D+ NSg/VB+ . . K NSg/VBP D/P NSg/VB+ P I/Ddem+ . . ISg+ VP/J P ISg+ . VB/C > shouted out , “ You’d better not do that again ! ” which produced another dead # VP/J NSg/VB/J/R/P . . K NSg/VXB/JC NSg/R/C VXB NSg/I/C/Ddem+ P . . I/C+ VP/J I/D+ NSg/VB/J+ > silence . # NSg/VB+ . > # > Alice noticed with some surprise that the pebbles were all turning into little # NPr+ VP/J P I/J/R/Dq NSg/VB+ NSg/I/C/Ddem D+ NPl/V3+ NSg/VLPt NSg/I/J/C/Dq Nᴹ/Vg/J P NPr/I/J/Dq+ > cakes as they lay on the floor , and a bright idea came into her head . “ If I eat # NPl/V3+ R/C/P IPl+ NSg/VBPt/J J/P D+ NSg/VB+ . VB/C D/P+ NPr/VB/J+ NSg+ NSg/VPt/P P ISg/D$+ NPr/VB/J+ . . NSg/C ISg/#r+ VB > one of these cakes , ” she thought , “ it’s sure to make some change in my size ; and # NSg/I/J P I/Ddem+ NPl/V3+ . . ISg+ N🅪Sg/VP . . K J P NSg/VB I/J/R/Dq N🅪Sg/VB+ NPr/J/R/P D$+ N🅪Sg/VB+ . VB/C > as it can’t possibly make me larger , it must make me smaller , I suppose . ” # R/C/P NPr/ISg+ VXB R NSg/VB NPr/ISg+ JC . NPr/ISg+ NSg/VXB NSg/VB NPr/ISg+ NSg/JC . ISg/#r+ VB . . > # > So she swallowed one of the cakes , and was delighted to find that she began # NSg/I/J/R/C ISg+ VP/J NSg/I/J P D+ NPl/V3+ . VB/C VLPt VP/J P NSg/VB NSg/I/C/Ddem ISg+ VPt > shrinking directly . As soon as she was small enough to get through the door , she # Nᴹ/Vg/J R/C . R/C/P J/R R/C/P ISg+ VLPt NPr/VB/J NSg/I P NSg/VB NSg/J/P D+ NSg/VB+ . ISg+ > ran out of the house , and found quite a crowd of little animals and birds # NSg/VPt NSg/VB/J/R/P P D+ NPr/VB+ . VB/C NSg/VP R D/P NSg/VB P NPr/I/J/Dq NPl VB/C NPl/V3+ > waiting outside . The poor little Lizard , Bill , was in the middle , being held up # Nᴹ/Vg/J Nᴹ/VB/J/P . D NSg/VB/J NPr/I/J/Dq NSg . NPr/VB+ . VLPt NPr/J/R/P D NSg/VB/J . N🅪Sg/VLg/J/C VP NSg/VB/J/P > by two guinea - pigs , who were giving it something out of a bottle . They all made # NSg/P NSg NPr+ . NPl/V3+ . NPr/I+ NSg/VLPt Nᴹ/Vg/J NPr/ISg+ NSg/I/J+ NSg/VB/J/R/P P D/P NSg/VB+ . IPl+ NSg/I/J/C/Dq VP > a rush at Alice the moment she appeared ; but she ran off as hard as she could , # D/P NPr/VB/J+ NSg/P NPr+ D+ NSg+ ISg+ VP/J . NSg/C/P ISg+ NSg/VPt NSg/VB/J/P R/C/P N🅪Sg/J/R R/C/P ISg+ NSg/VXB . > and soon found herself safe in a thick wood . # VB/C J/R NSg/VP ISg+ NSg/VB/J NPr/J/R/P D/P+ NSg/VB/J+ NPr🅪Sg/VB/J+ . > # > “ The first thing I’ve got to do , ” said Alice to herself , as she wandered about # . D+ NSg/J+ NSg+ K VP P VXB . . VP/J NPr+ P ISg+ . R/C/P ISg+ VP/J J/P > in the wood , “ is to grow to my right size again ; and the second thing is to find # NPr/J/R/P D NPr🅪Sg/VB/J+ . . VL3 P VB P D$+ NPr/VB/J N🅪Sg/VB+ P . VB/C D NSg/VB/J NSg+ VL3 P NSg/VB > my way into that lovely garden . I think that will be the best plan . ” # D$+ NSg/J+ P NSg/I/C/Ddem NSg/J NSg/VB/J+ . ISg/#r+ NSg/VB NSg/I/C/Ddem+ NPr/VXB NSg/VLXB D+ NPr/VXB/JS+ NSg/VB+ . . > # > It sounded an excellent plan , no doubt , and very neatly and simply arranged ; the # NPr/ISg+ VP/J D/P+ J+ NSg/VB+ . NSg/Dq/P+ N🅪Sg/VB+ . VB/C J/R R VB/C R VP/J . D+ > only difficulty was , that she had not the smallest idea how to set about it ; and # J/R/C+ N🅪Sg+ VLPt . NSg/I/C/Ddem ISg+ VP NSg/R/C D+ JS NSg NSg/C P NPr/VBP/J J/P NPr/ISg+ . VB/C > while she was peering about anxiously among the trees , a little sharp bark just # NSg/VB/C/P ISg+ VLPt Nᴹ/Vg/J J/P R P D NPl/V3+ . D/P NPr/I/J/Dq NPr/VB/J N🅪Sg/VB+ J/R > over her head made her look up in a great hurry . # NSg/J/P ISg/D$+ NPr/VB/J+ VP ISg/D$+ NSg/VB NSg/VB/J/P NPr/J/R/P D/P NSg/J NSg/VB+ . > # > An enormous puppy was looking down at her with large round eyes , and feebly # D/P+ J+ NSg/VB+ VLPt Nᴹ/Vg/J N🅪Sg/VB/J/P NSg/P ISg/D$+ P NSg/J NSg/VB/J/P NPl/V3+ . VB/C R > stretching out one paw , trying to touch her . “ Poor little thing ! ” said Alice , in # Nᴹ/Vg/J NSg/VB/J/R/P NSg/I/J+ NSg/VB+ . Nᴹ/Vg/J P N🅪Sg/VB ISg/D$+ . . NSg/VB/J+ NPr/I/J/Dq+ NSg+ . . VP/J NPr+ . NPr/J/R/P > a coaxing tone , and she tried hard to whistle to it ; but she was terribly # D/P Nᴹ/Vg/J N🅪Sg/I/VB+ . VB/C ISg+ VP/J N🅪Sg/J/R P NSg/VB P NPr/ISg+ . NSg/C/P ISg+ VLPt R > frightened all the time at the thought that it might be hungry , in which case it # VP/J NSg/I/J/C/Dq D N🅪Sg/VB/J+ NSg/P D N🅪Sg/VP NSg/I/C/Ddem NPr/ISg+ Nᴹ/VXB/J NSg/VLXB J . NPr/J/R/P I/C+ NPr🅪Sg/VB+ NPr/ISg+ > would be very likely to eat her up in spite of all her coaxing . # VXB NSg/VLXB J/R NSg/J P VB ISg/D$+ NSg/VB/J/P NPr/J/R/P NSg/VB/P+ P NSg/I/J/C/Dq ISg/D$+ Nᴹ/Vg/J . > # > Hardly knowing what she did , she picked up a little bit of stick , and held it # R NSg/Vg/J/P NSg/I+ ISg+ VXPt . ISg+ VP/J NSg/VB/J/P D/P NPr/I/J/Dq NSg/VPt P NSg/VB/J+ . VB/C VP NPr/ISg+ > out to the puppy ; whereupon the puppy jumped into the air off all its feet at # NSg/VB/J/R/P P D+ NSg/VB+ . C D+ NSg/VB+ VP/J P D N🅪Sg/VB+ NSg/VB/J/P NSg/I/J/C/Dq ISg/D$+ NPl+ NSg/P > once , with a yelp of delight , and rushed at the stick , and made believe to worry # NSg/C . P D/P NSg/VB P N🅪Sg/VB/J+ . VB/C VP/J NSg/P D NSg/VB/J+ . VB/C VP VB P N🅪Sg/VB > it ; then Alice dodged behind a great thistle , to keep herself from being run # NPr/ISg+ . NSg/J/R/C NPr+ VP/J NSg/J/P D/P NSg/J NSg . P NSg/VB ISg+ P N🅪Sg/VLg/J/C NSg/VBPp > over ; and the moment she appeared on the other side , the puppy made another rush # NSg/J/P . VB/C D NSg+ ISg+ VP/J J/P D NSg/VB/J NSg/VB/J+ . D NSg/VB+ VP I/D NPr/VB/J+ > at the stick , and tumbled head over heels in its hurry to get hold of it ; then # NSg/P D NSg/VB/J+ . VB/C VP/J NPr/VB/J+ NSg/J/P NPl/V3+ NPr/J/R/P ISg/D$+ NSg/VB+ P NSg/VB NSg/VB/J P NPr/ISg+ . NSg/J/R/C > Alice , thinking it was very like having a game of play with a cart - horse , and # NPr+ . Nᴹ/Vg/J NPr/ISg+ VLPt J/R NSg/VB/J/C/P Nᴹ/Vg/J D/P NSg/VB/J+ P N🅪Sg/VB P D/P NSg/VB+ . NSg/VB+ . VB/C > expecting every moment to be trampled under its feet , ran round the thistle # Nᴹ/Vg/J Dq NSg+ P NSg/VLXB VP/J NSg/J/P ISg/D$+ NPl+ . NSg/VPt NSg/VB/J/P D NSg > again ; then the puppy began a series of short charges at the stick , running a # P . NSg/J/R/C D NSg/VB+ VPt D/P NSgPl P NPr/VB/J/P NPl/V3+ NSg/P D NSg/VB/J+ . Nᴹ/Vg/J/P D/P > very little way forwards each time and a long way back , and barking hoarsely all # J/R NPr/I/J/Dq NSg/J+ NPl/V3 Dq N🅪Sg/VB/J+ VB/C D/P NPr/VB/J NSg/J+ NSg/VB/J . VB/C Nᴹ/Vg/J+ R NSg/I/J/C/Dq > the while , till at last it sat down a good way off , panting , with its tongue # D NSg/VB/C/P . NSg/VB/C/P NSg/P NSg/VB/J NPr/ISg+ NSg/VP/J N🅪Sg/VB/J/P D/P NPr/VB/J NSg/J+ NSg/VB/J/P . Nᴹ/Vg/J . P ISg/D$+ N🅪Sg/VB+ > hanging out of its mouth , and its great eyes half shut . # Nᴹ/Vg/J NSg/VB/J/R/P P ISg/D$+ NSg/VB+ . VB/C ISg/D$+ NSg/J+ NPl/V3+ N🅪Sg/J/P+ NSg/VBP/J . > # > This seemed to Alice a good opportunity for making her escape ; so she set off at # I/Ddem VP/J P NPr+ D/P+ NPr/VB/J+ N🅪Sg+ R/C/P Nᴹ/Vg/J ISg/D$+ N🅪Sg/VB . NSg/I/J/R/C ISg+ NPr/VBP/J NSg/VB/J/P NSg/P > once , and ran till she was quite tired and out of breath , and till the puppy’s # NSg/C . VB/C NSg/VPt NSg/VB/C/P ISg+ VLPt R VP/J VB/C NSg/VB/J/R/P P N🅪Sg/VB/J+ . VB/C NSg/VB/C/P D NSg$ > bark sounded quite faint in the distance . # N🅪Sg/VB+ VP/J R NSg/VB/J NPr/J/R/P D N🅪Sg/VB+ . > # > “ And yet what a dear little puppy it was ! ” said Alice , as she leant against a # . VB/C NSg/VB/C NSg/I+ D/P+ NSg/VB/J+ NPr/I/J/Dq+ NSg/VB+ NPr/ISg+ VLPt . . VP/J NPr+ . R/C/P ISg+ ? C/P D/P > buttercup to rest herself , and fanned herself with one of the leaves : “ I should # NSg P NSg/VB ISg+ . VB/C VP ISg+ P NSg/I/J P D NPl/V3+ . . ISg/#r+ VXB > have liked teaching it tricks very much , if — if I’d only been the right size to # NSg/VXB VP/J N🅪Sg/Vg/J+ NPr/ISg+ NPl/V3+ J/R NSg/I/J/R/Dq . NSg/C . NSg/C K J/R/C NSg/VLPp D NPr/VB/J N🅪Sg/VB+ P > do it ! Oh dear ! I’d nearly forgotten that I’ve got to grow up again ! Let me # VXB NPr/ISg+ . NPr/VB NSg/VB/J . K R NSg/VPp/J NSg/I/C/Ddem K VP P VB NSg/VB/J/P P . NSg/VBP NPr/ISg+ > see — how is it to be managed ? I suppose I ought to eat or drink something or # NSg/VB . NSg/C VL3 NPr/ISg+ P NSg/VLXB VP/J . ISg/#r+ VB ISg/#r+ NSg/I/VXB P VB NPr/C NSg/VB+ NSg/I/J+ NPr/C > other ; but the great question is , what ? ” # NSg/VB/J . NSg/C/P D+ NSg/J+ NSg/VB+ VL3 . NSg/I+ . . > # > The great question certainly was , what ? Alice looked all round her at the # D+ NSg/J+ NSg/VB+ R VLPt . NSg/I+ . NPr+ VP/J NSg/I/J/C/Dq NSg/VB/J/P ISg/D$+ NSg/P D > flowers and the blades of grass , but she did not see anything that looked like # NPrPl/V3+ VB/C D NPl/V3 P NPr🅪Sg/VB+ . NSg/C/P ISg+ VXPt NSg/R/C NSg/VB NSg/I/VB+ NSg/I/C/Ddem+ VP/J NSg/VB/J/C/P > the right thing to eat or drink under the circumstances . There was a large # D NPr/VB/J NSg+ P VB NPr/C NSg/VB+ NSg/J/P D+ NPl/V3+ . R+ VLPt D/P NSg/J > mushroom growing near her , about the same height as herself ; and when she had # N🅪Sg/VB/J Nᴹ/Vg/J NSg/VB/J/P ISg/D$+ . J/P D I/J N🅪Sg+ R/C/P ISg+ . VB/C NSg/I/C ISg+ VP > looked under it , and on both sides of it , and behind it , it occurred to her that # VP/J NSg/J/P NPr/ISg+ . VB/C J/P I/C/Dq NPl/V3 P NPr/ISg+ . VB/C NSg/J/P NPr/ISg+ . NPr/ISg+ VP P ISg/D$+ NSg/I/C/Ddem > she might as well look and see what was on the top of it . # ISg+ Nᴹ/VXB/J R/C/P NSg/VB/J/R NSg/VB VB/C NSg/VB NSg/I+ VLPt J/P D NSg/VB/J P NPr/ISg+ . > # > She stretched herself up on tiptoe , and peeped over the edge of the mushroom , # ISg+ VP/J ISg+ NSg/VB/J/P J/P NSg/VB/J+ . VB/C VP/J NSg/J/P D NSg/VB P D N🅪Sg/VB/J . > and her eyes immediately met those of a large blue caterpillar , that was sitting # VB/C ISg/D$+ NPl/V3+ R VP I/Ddem P D/P NSg/J N🅪Sg/VB/J NSg/VB . NSg/I/C/Ddem+ VLPt NSg/Vg/J > on the top with its arms folded , quietly smoking a long hookah , and taking not # J/P D NSg/VB/J+ P ISg/D$+ NPl/V3+ VP/J . R Nᴹ/Vg/J D/P NPr/VB/J NSg . VB/C NSg/Vg/J NSg/R/C > the smallest notice of her or of anything else . # D JS NSg/VB P ISg/D$+ NPr/C P NSg/I/VB+ NSg/J/C . > # > CHAPTER V : Advice from a Caterpillar # HeadingStart NSg/VB+ NSg/P/#r . Nᴹ+ P D/P NSg/VB > # > The Caterpillar and Alice looked at each other for some time in silence : at last # D NSg/VB VB/C NPr+ VP/J NSg/P Dq NSg/VB/J R/C/P I/J/R/Dq N🅪Sg/VB/J+ NPr/J/R/P NSg/VB+ . NSg/P NSg/VB/J > the Caterpillar took the hookah out of its mouth , and addressed her in a # D NSg/VB VPt D NSg NSg/VB/J/R/P P ISg/D$+ NSg/VB+ . VB/C VP/J ISg/D$+ NPr/J/R/P D/P > languid , sleepy voice . # NSg/J . NSg/J NSg/VB+ . > # > “ Who are you ? ” said the Caterpillar . # . NPr/I+ VLB ISgPl+ . . VP/J D NSg/VB . > # > This was not an encouraging opening for a conversation . Alice replied , rather # I/Ddem+ VLPt NSg/R/C D/P Nᴹ/Vg/J Nᴹ/Vg/J R/C/P D/P+ N🅪Sg/VB+ . NPr+ VP/J . NPr/VB/J/R > shyly , “ I — I hardly know , sir , just at present — at least I know who I was when I # R . . ISg/#r+ . ISg/#r+ R VB . NPr/VB+ . J/R NSg/P NSg/VB/J . NSg/P NSg/J/Dq ISg/#r+ VB NPr/I+ ISg/#r+ VLPt NSg/I/C ISg/#r+ > got up this morning , but I think I must have been changed several times since # VP NSg/VB/J/P I/Ddem N🅪Sg/Vg/J+ . NSg/C/P ISg/#r+ NSg/VB ISg/#r+ NSg/VXB NSg/VXB NSg/VLPp VP/J J/Dq NPl/V3+ C/P > then . ” # NSg/J/R/C . . > # > “ What do you mean by that ? ” said the Caterpillar sternly . “ Explain yourself ! ” # . NSg/I+ VXB ISgPl+ NSg/VB/J NSg/P NSg/I/C/Ddem+ . . VP/J D NSg/VB R . . VB ISg+ . . > # > “ I can’t explain myself , I’m afraid , sir , ” said Alice , “ because I’m not myself , # . ISg/#r+ VXB VB ISg+ . K J . NPr/VB+ . . VP/J NPr+ . . C/P K NSg/R/C ISg+ . > you see . ” # ISgPl+ NSg/VB . . > # > “ I don’t see , ” said the Caterpillar . # . ISg/#r+ VXB NSg/VB . . VP/J D NSg/VB . > # > “ I’m afraid I can’t put it more clearly , ” Alice replied very politely , “ for I # . K J ISg/#r+ VXB NSg/VBP NPr/ISg+ NPr/I/J/R/Dq R . . NPr+ VP/J J/R R . . R/C/P ISg/#r+ > can’t understand it myself to begin with ; and being so many different sizes in a # VXB VB NPr/ISg+ ISg+ P NSg/VB P . VB/C N🅪Sg/VLg/J/C NSg/I/J/R/C NSg/I/J/Dq NSg/J NPl/V3+ NPr/J/R/P D/P > day is very confusing . ” # NPr🅪Sg+ VL3 J/R Nᴹ/Vg/J . . > # > “ It isn’t , ” said the Caterpillar . # . NPr/ISg+ NSg/VX3 . . VP/J D NSg/VB . > # > “ Well , perhaps you haven’t found it so yet , ” said Alice ; “ but when you have to # . NSg/VB/J/R . NSg/R ISgPl+ VXB NSg/VP NPr/ISg+ NSg/I/J/R/C NSg/VB/C . . VP/J NPr+ . . NSg/C/P NSg/I/C ISgPl+ NSg/VXB P > turn into a chrysalis — you will some day , you know — and then after that into a # NSg/VB P D/P NSg/VB . ISgPl+ NPr/VXB I/J/R/Dq NPr🅪Sg+ . ISgPl+ VB . VB/C NSg/J/R/C P NSg/I/C/Ddem+ P D/P > butterfly , I should think you’ll feel it a little queer , won’t you ? ” # NSg/VB+ . ISg/#r+ VXB NSg/VB K NSg/I/VB NPr/ISg+ D/P NPr/I/J/Dq NSg/VB/J . VXB ISgPl+ . . > # > “ Not a bit , ” said the Caterpillar . # . NSg/R/C D/P+ NSg/VPt+ . . VP/J D NSg/VB . > # > “ Well , perhaps your feelings may be different , ” said Alice ; “ all I know is , it # . NSg/VB/J/R . NSg/R D$+ NPl/V3+ NPr/VXB NSg/VLXB NSg/J . . VP/J NPr+ . . NSg/I/J/C/Dq ISg/#r+ VB VL3 . NPr/ISg+ > would feel very queer to me . ” # VXB NSg/I/VB J/R NSg/VB/J P NPr/ISg+ . . > # > “ You ! ” said the Caterpillar contemptuously . “ Who are you ? ” # . ISgPl+ . . VP/J D NSg/VB R . . NPr/I+ VLB ISgPl+ . . > # > Which brought them back again to the beginning of the conversation . Alice felt a # I/C+ VP NSg/IPl+ NSg/VB/J P P D NSg/Vg/J P D+ N🅪Sg/VB+ . NPr+ N🅪Sg/VP/J D/P+ > little irritated at the Caterpillar’s making such very short remarks , and she # NPr/I/J/Dq+ VP/J+ NSg/P D NSg$ Nᴹ/Vg/J NSg/I J/R NPr/VB/J/P NPl/V3+ . VB/C ISg+ > drew herself up and said , very gravely , “ I think , you ought to tell me who you # NPr/VPt ISg+ NSg/VB/J/P VB/C VP/J . J/R R . . ISg/#r+ NSg/VB . ISgPl+ NSg/I/VXB P NPr/VB NPr/ISg+ NPr/I+ ISgPl+ > are , first . ” # VLB . NSg/J . . > # > “ Why ? ” said the Caterpillar . # . NSg/VB . . VP/J D NSg/VB . > # > Here was another puzzling question ; and as Alice could not think of any good # J/R VLPt I/D+ Nᴹ/Vg/J+ NSg/VB+ . VB/C R/C/P NPr+ NSg/VXB NSg/R/C NSg/VB P I/R/Dq+ NPr/VB/J+ > reason , and as the Caterpillar seemed to be in a very unpleasant state of mind , # N🅪Sg/VB+ . VB/C R/C/P D NSg/VB VP/J P NSg/VLXB NPr/J/R/P D/P J/R NSg/J N🅪Sg/VB P NSg/VB+ . > she turned away . # ISg+ VP/J VB/J . > # > “ Come back ! ” the Caterpillar called after her . “ I’ve something important to # . NSg/VBPp/P NSg/VB/J . . D NSg/VB VP/J P ISg/D$+ . . K NSg/I/J+ J P > say ! ” # NSg/VB . . > # > This sounded promising , certainly : Alice turned and came back again . # I/Ddem VP/J Nᴹ/Vg/J . R . NPr+ VP/J VB/C NSg/VPt/P NSg/VB/J P . > # > “ Keep your temper , ” said the Caterpillar . # . NSg/VB D$+ NSg/VB/JC+ . . VP/J D NSg/VB . > # > “ Is that all ? ” said Alice , swallowing down her anger as well as she could . # . VL3 NSg/I/C/Ddem NSg/I/J/C/Dq . . VP/J NPr+ . Nᴹ/Vg/J N🅪Sg/VB/J/P ISg/D$+ Nᴹ/VB+ R/C/P NSg/VB/J/R R/C/P ISg+ NSg/VXB . > # > “ No , ” said the Caterpillar . # . NSg/Dq/P . . VP/J D NSg/VB . > # > Alice thought she might as well wait , as she had nothing else to do , and perhaps # NPr+ N🅪Sg/VP ISg+ Nᴹ/VXB/J R/C/P NSg/VB/J/R NSg/VB . R/C/P ISg+ VP NSg/I/J+ NSg/J/C P VXB . VB/C NSg/R > after all it might tell her something worth hearing . For some minutes it puffed # P NSg/I/J/C/Dq NPr/ISg+ Nᴹ/VXB/J NPr/VB ISg/D$+ NSg/I/J+ NSg/VB/J+ Nᴹ/Vg/J+ . R/C/P I/J/R/Dq+ NPl/V3+ NPr/ISg+ VP/J > away without speaking , but at last it unfolded its arms , took the hookah out of # VB/J C/P Nᴹ/Vg/J . NSg/C/P NSg/P NSg/VB/J NPr/ISg+ VP/J ISg/D$+ NPl/V3+ . VPt D NSg NSg/VB/J/R/P P > its mouth again , and said , “ So you think you’re changed , do you ? ” # ISg/D$+ NSg/VB+ P . VB/C VP/J . . NSg/I/J/R/C ISgPl+ NSg/VB K VP/J . VXB ISgPl+ . . > # > “ I’m afraid I am , sir , ” said Alice ; “ I can’t remember things as I used — and I # . K J ISg/#r+ NPr/VLB/J . NPr/VB+ . . VP/J NPr+ . . ISg/#r+ VXB NSg/VB NPl+ R/C/P ISg/#r+ VP/J . VB/C ISg/#r+ > don’t keep the same size for ten minutes together ! ” # VXB NSg/VB D I/J N🅪Sg/VB+ R/C/P NSg NPl/V3+ J . . > # > “ Can’t remember what things ? ” said the Caterpillar . # . VXB NSg/VB NSg/I+ NPl+ . . VP/J D NSg/VB . > # > “ Well , I’ve tried to say “ How doth the little busy bee , ” but it all came # . NSg/VB/J/R . K VP/J P NSg/VB . NSg/C V3 D NPr/I/J/Dq NSg/VB/J NSg/VB+ . . NSg/C/P NPr/ISg+ NSg/I/J/C/Dq NSg/VPt/P > different ! ” Alice replied in a very melancholy voice . # NSg/J . . NPr+ VP/J NPr/J/R/P D/P J/R NSg/J NSg/VB+ . > # > “ Repeat , “ You are old , Father William , ’ ” said the Caterpillar . # . NSg/VB . . ISgPl+ VLB NSg/J . NPr/VB+ NPr+ . . . VP/J D NSg/VB . > # > Alice folded her hands , and began : — # NPr+ VP/J ISg/D$+ NPl/V3+ . VB/C VPt . . > # > “ You are old , Father William , ” the young man said , “ And your hair has become # . ISgPl+ VLB NSg/J . NPr/VB+ NPr+ . . D+ NPr/VB/J+ NPr/VB/J+ VP/J . . VB/C D$+ N🅪Sg/VB+ V3 VBPp > very white ; And yet you incessantly stand on your head — Do you think , at your # J/R NPr🅪Sg/VB/J . VB/C NSg/VB/C ISgPl+ R NSg/VB J/P D$+ NPr/VB/J+ . VXB ISgPl+ NSg/VB . NSg/P D$+ > age , it is right ? ” # N🅪Sg/VB+ . NPr/ISg+ VL3 NPr/VB/J . . > # > “ In my youth , ” Father William replied to his son , “ I feared it might injure # . NPr/J/R/P D$+ NSg+ . . NPr/VB+ NPr+ VP/J P ISg/D$+ NPr/VB+ . . ISg/#r+ VP/J NPr/ISg+ Nᴹ/VXB/J VB > the brain ; But , now that I’m perfectly sure I have none , Why , I do it again # D+ NPr🅪Sg/VB+ . NSg/C/P . NSg/J/R/C NSg/I/C/Ddem+ K R J ISg/#r+ NSg/VXB NSg/I+ . NSg/VB . ISg/#r+ VXB NPr/ISg+ P > and again . ” # VB/C P . . > # > “ You are old , ” said the youth , “ as I mentioned before , And have grown most # . ISgPl+ VLB NSg/J . . VP/J D+ NSg+ . . R/C/P ISg/#r+ VP/J C/P . VB/C NSg/VXB VB/J NSg/I/J/R/Dq > uncommonly fat ; Yet you turned a back - somersault in at the door — Pray , what is # R N🅪Sg/VB/J . NSg/VB/C ISgPl+ VP/J D/P NSg/VB/J . NSg/VB NPr/J/R/P NSg/P D NSg/VB+ . VB . NSg/I+ VL3 > the reason of that ? ” # D N🅪Sg/VB P NSg/I/C/Ddem+ . . > # > “ In my youth , ” said the sage , as he shook his grey locks , “ I kept all my limbs # . NPr/J/R/P D$+ NSg+ . . VP/J D NSg/VB/J . R/C/P NPr/ISg+ NSg/VPt/J ISg/D$+ NPr🅪Sg/VB/J/Comm+ NPl/V3+ . . ISg/#r+ VP NSg/I/J/C/Dq+ D$+ NPl/V3+ > very supple By the use of this ointment — one shilling the box — Allow me to sell # J/R VB/J NSg/P D N🅪Sg/VB P I/Ddem N🅪Sg . NSg/I/J N🅪Sg/Vg/J D NSg/VB+ . VB NPr/ISg+ P NSg/VB > you a couple ? ” # ISgPl+ D/P NSg/VB/J+ . . > # > “ You are old , ” said the youth , “ and your jaws are too weak For anything # . ISgPl+ VLB NSg/J . . VP/J D+ NSg+ . . VB/C D$+ NPl/V3+ VLB R J R/C/P NSg/I/VB+ > tougher than suet ; Yet you finished the goose , with the bones and the beak — # NSg/JC C/P NSg . NSg/VB/C ISgPl+ VP/J D NSg/VB+ . P D NPl/V3+ VB/C D NSg/VB+ . > Pray , how did you manage to do it ? ” # VB . NSg/C VXPt ISgPl+ NSg/VB P VXB NPr/ISg+ . . > # > “ In my youth , ” said his father , “ I took to the law , And argued each case with # . NPr/J/R/P D$+ NSg+ . . VP/J ISg/D$+ NPr/VB+ . . ISg/#r+ VPt P D+ N🅪Sg/VB+ . VB/C VP/J Dq NPr🅪Sg/VB+ P > my wife ; And the muscular strength , which it gave to my jaw , Has lasted the # D$+ NSg/VB/J+ . VB/C D+ J+ N🅪Sg/VB+ . I/C+ NPr/ISg+ VPt P D$+ NSg/VB/J+ . V3 VP/J D > rest of my life . ” # NSg/VB P D$+ N🅪Sg/VB+ . . > # > “ You are old , ” said the youth , “ one would hardly suppose That your eye was as # . ISgPl+ VLB NSg/J . . VP/J D+ NSg+ . . NSg/I/J+ VXB R VB NSg/I/C/Ddem D$+ NSg/VB+ VLPt R/C/P > steady as ever ; Yet you balanced an eel on the end of your nose — What made you # NSg/VB/J R/C/P J/R . NSg/VB/C ISgPl+ VP/J D/P NSg/VB J/P D NSg/VB P D$+ NSg/VB+ . NSg/I+ VP ISgPl+ > so awfully clever ? ” # NSg/I/J/R/C R J . . > # > “ I have answered three questions , and that is enough , ” Said his father ; “ don’t # . ISg/#r+ NSg/VXB VP/J NSg+ NPl/V3+ . VB/C NSg/I/C/Ddem+ VL3 NSg/I . . VP/J ISg/D$+ NPr/VB+ . . VXB > give yourself airs ! Do you think I can listen all day to such stuff ? Be off , # NSg/VB ISg+ NPl/V3 . VXB ISgPl+ NSg/VB ISg/#r+ NPr/VXB NSg/VB NSg/I/J/C/Dq NPr🅪Sg+ P NSg/I+ Nᴹ/VB+ . NSg/VLXB NSg/VB/J/P . > or I’ll kick you down stairs ! ” # NPr/C K NSg/VB+ ISgPl+ N🅪Sg/VB/J/P NPl+ . . > # > “ That is not said right , ” said the Caterpillar . # . NSg/I/C/Ddem+ VL3 NSg/R/C VP/J NPr/VB/J . . VP/J D NSg/VB . > # > “ Not quite right , I’m afraid , ” said Alice , timidly ; “ some of the words have got # . NSg/R/C R NPr/VB/J . K J . . VP/J NPr+ . R . . I/J/R/Dq P D NPl/V3+ NSg/VXB VP > altered . ” # NSg/VP/J . . > # > “ It is wrong from beginning to end , ” said the Caterpillar decidedly , and there # . NPr/ISg+ VL3 NSg/VB/J/R P NSg/Vg/J+ P NSg/VB . . VP/J D NSg/VB R . VB/C R+ > was silence for some minutes . # VLPt NSg/VB+ R/C/P I/J/R/Dq NPl/V3+ . > # > The Caterpillar was the first to speak . # D NSg/VB VLPt D NSg/J+ P NSg/VB . > # > “ What size do you want to be ? ” it asked . # . NSg/I+ N🅪Sg/VB+ VXB ISgPl+ NSg/VB P NSg/VLXB . . NPr/ISg+ VP/J . > # > “ Oh , I’m not particular as to size , ” Alice hastily replied ; “ only one doesn’t # . NPr/VB . K NSg/R/C NSg/J R/C/P P N🅪Sg/VB . . NPr+ R VP/J . . J/R/C NSg/I/J VX3 > like changing so often , you know . ” # NSg/VB/J/C/P Nᴹ/Vg/J NSg/I/J/R/C R . ISgPl+ VB . . > # > “ I don’t know , ” said the Caterpillar . # . ISg/#r+ VXB VB . . VP/J D NSg/VB . > # > Alice said nothing : she had never been so much contradicted in her life before , # NPr+ VP/J NSg/I/J+ . ISg+ VP R NSg/VLPp NSg/I/J/R/C NSg/I/J/R/Dq VP/J NPr/J/R/P ISg/D$+ N🅪Sg/VB+ C/P . > and she felt that she was losing her temper . # VB/C ISg+ N🅪Sg/VP/J NSg/I/C/Ddem ISg+ VLPt Nᴹ/Vg/J ISg/D$+ NSg/VB/JC+ . > # > “ Are you content now ? ” said the Caterpillar . # . VLB ISgPl+ N🅪Sg/VB/J+ NSg/J/R/C . . VP/J D NSg/VB . > # > “ Well , I should like to be a little larger , sir , if you wouldn’t mind , ” said # . NSg/VB/J/R . ISg/#r+ VXB NSg/VB/J/C/P P NSg/VLXB D/P NPr/I/J/Dq JC . NPr/VB+ . NSg/C ISgPl+ VXB NSg/VB+ . . VP/J > Alice : “ three inches is such a wretched height to be . ” # NPr+ . . NSg NPl/V3+ VL3 NSg/I D/P J N🅪Sg+ P NSg/VLXB . . > # > “ It is a very good height indeed ! ” said the Caterpillar angrily , rearing itself # . NPr/ISg+ VL3 D/P J/R NPr/VB/J+ N🅪Sg+ R . . VP/J D NSg/VB R . Nᴹ/Vg/J+ ISg+ > upright as it spoke ( it was exactly three inches high ) . # NSg/VB/J R/C/P NPr/ISg+ NSg/VPt . NPr/ISg+ VLPt R NSg NPl/V3+ NSg/VB/J/R . . > # > “ But I’m not used to it ! ” pleaded poor Alice in a piteous tone . And she thought # . NSg/C/P K NSg/R/C VP/J P NPr/ISg+ . . VP/J NSg/VB/J NPr+ NPr/J/R/P D/P+ J+ N🅪Sg/I/VB+ . VB/C ISg+ N🅪Sg/VP > of herself , “ I wish the creatures wouldn’t be so easily offended ! ” # P ISg+ . . ISg/#r+ NSg/VB D+ NPl+ VXB NSg/VLXB NSg/I/J/R/C R VP/J . . > # > “ You’ll get used to it in time , ” said the Caterpillar ; and it put the hookah # . K NSg/VB VP/J P NPr/ISg+ NPr/J/R/P N🅪Sg/VB/J+ . . VP/J D NSg/VB . VB/C NPr/ISg+ NSg/VBP D NSg > into its mouth and began smoking again . # P ISg/D$+ NSg/VB+ VB/C VPt Nᴹ/Vg/J+ P . > # > This time Alice waited patiently until it chose to speak again . In a minute or # I/Ddem+ N🅪Sg/VB/J+ NPr+ VP/J R C/P NPr/ISg+ NSg/VPt P NSg/VB P . NPr/J/R/P D/P+ NSg/VB/J+ NPr/C > two the Caterpillar took the hookah out of its mouth and yawned once or twice , # NSg D NSg/VB VPt D NSg NSg/VB/J/R/P P ISg/D$+ NSg/VB+ VB/C VP/J NSg/C NPr/C R . > and shook itself . Then it got down off the mushroom , and crawled away in the # VB/C NSg/VPt/J ISg+ . NSg/J/R/C NPr/ISg+ VP N🅪Sg/VB/J/P NSg/VB/J/P D N🅪Sg/VB/J . VB/C VP/J VB/J NPr/J/R/P D > grass , merely remarking as it went , “ One side will make you grow taller , and the # NPr🅪Sg/VB+ . R Nᴹ/Vg/J R/C/P NPr/ISg+ NSg/VPt . . NSg/I/J NSg/VB/J+ NPr/VXB NSg/VB ISgPl+ VB JC . VB/C D > other side will make you grow shorter . ” # NSg/VB/J NSg/VB/J+ NPr/VXB NSg/VB ISgPl+ VB NSg/JC . . > # > “ One side of what ? The other side of what ? ” thought Alice to herself . # . NSg/I/J NSg/VB/J P NSg/I+ . D NSg/VB/J NSg/VB/J P NSg/I+ . . N🅪Sg/VP NPr+ P ISg+ . > # > “ Of the mushroom , ” said the Caterpillar , just as if she had asked it aloud ; and # . P D N🅪Sg/VB/J . . VP/J D NSg/VB . J/R R/C/P NSg/C ISg+ VP VP/J NPr/ISg+ J . VB/C > in another moment it was out of sight . # NPr/J/R/P I/D NSg+ NPr/ISg+ VLPt NSg/VB/J/R/P P N🅪Sg/VB+ . > # > Alice remained looking thoughtfully at the mushroom for a minute , trying to make # NPr+ VP/J Nᴹ/Vg/J R NSg/P D N🅪Sg/VB/J R/C/P D/P NSg/VB/J+ . Nᴹ/Vg/J P NSg/VB > out which were the two sides of it ; and as it was perfectly round , she found # NSg/VB/J/R/P I/C+ NSg/VLPt D NSg NPl/V3 P NPr/ISg+ . VB/C R/C/P NPr/ISg+ VLPt R NSg/VB/J/P . ISg+ NSg/VP > this a very difficult question . However , at last she stretched her arms round it # I/Ddem D/P J/R VB/J NSg/VB+ . C . NSg/P NSg/VB/J ISg+ VP/J ISg/D$+ NPl/V3+ NSg/VB/J/P NPr/ISg+ > as far as they would go , and broke off a bit of the edge with each hand . # R/C/P NSg/VB/J R/C/P IPl+ VXB NSg/VB/J . VB/C NSg/VPt/J NSg/VB/J/P D/P NSg/VPt P D NSg/VB+ P Dq+ NSg/VB+ . > # > “ And now which is which ? ” she said to herself , and nibbled a little of the # . VB/C NSg/J/R/C I/C+ VL3 I/C+ . . ISg+ VP/J P ISg+ . VB/C VP/J D/P NPr/I/J/Dq P D > right - hand bit to try the effect : the next moment she felt a violent blow # NPr/VB/J . NSg/VB+ NSg/VPt+ P NSg/VB/J D NSg/VB+ . D NSg/J/P NSg+ ISg+ N🅪Sg/VP/J D/P NSg/VB/J NSg/VB/J+ > underneath her chin : it had struck her foot ! # NSg/J/P ISg/D$+ NPr/VB+ . NPr/ISg+ VP VB ISg/D$+ NSg/VB+ . > # > She was a good deal frightened by this very sudden change , but she felt that # ISg+ VLPt D/P NPr/VB/J NSg/VB/J VP/J NSg/P I/Ddem J/R NSg/J N🅪Sg/VB . NSg/C/P ISg+ N🅪Sg/VP/J NSg/I/C/Ddem > there was no time to be lost , as she was shrinking rapidly ; so she set to work # R+ VLPt NSg/Dq/P N🅪Sg/VB/J+ P NSg/VLXB VP/J . R/C/P ISg+ VLPt Nᴹ/Vg/J R . NSg/I/J/R/C ISg+ NPr/VBP/J P N🅪Sg/VB > at once to eat some of the other bit . Her chin was pressed so closely against # NSg/P NSg/C P VB I/J/R/Dq P D+ NSg/VB/J+ NSg/VPt+ . ISg/D$+ NPr/VB+ VLPt VP/J NSg/I/J/R/C R C/P > her foot , that there was hardly room to open her mouth ; but she did it at last , # ISg/D$+ NSg/VB+ . NSg/I/C/Ddem R+ VLPt R N🅪Sg/VB/J+ P NSg/VB/J ISg/D$+ NSg/VB+ . NSg/C/P ISg+ VXPt NPr/ISg+ NSg/P NSg/VB/J . > and managed to swallow a morsel of the lefthand bit . # VB/C VP/J P NSg/VB D/P NSg/VB P D ? NSg/VPt+ . > # > “ Come , my head’s free at last ! ” said Alice in a tone of delight , which changed # . NSg/VBPp/P . D$+ NPr$ NSg/VB/J NSg/P NSg/VB/J . . VP/J NPr+ NPr/J/R/P D/P N🅪Sg/I/VB P N🅪Sg/VB/J+ . I/C+ VP/J > into alarm in another moment , when she found that her shoulders were nowhere to # P N🅪Sg/VB+ NPr/J/R/P I/D+ NSg+ . NSg/I/C ISg+ NSg/VP NSg/I/C/Ddem ISg/D$+ NPl/V3+ NSg/VLPt NSg/J P > be found : all she could see , when she looked down , was an immense length of # NSg/VLXB NSg/VP . NSg/I/J/C/Dq ISg+ NSg/VXB NSg/VB . NSg/I/C ISg+ VP/J N🅪Sg/VB/J/P . VLPt D/P NSg/J N🅪Sg/VB P > neck , which seemed to rise like a stalk out of a sea of green leaves that lay # NSg/VB+ . I/C+ VP/J P NSg/VB NSg/VB/J/C/P D/P+ NSg/VB+ NSg/VB/J/R/P P D/P NSg P NPr🅪Sg/VB/J+ NPl/V3+ NSg/I/C/Ddem+ NSg/VBPt/J > far below her . # NSg/VB/J P ISg/D$+ . > # > “ What can all that green stuff be ? ” said Alice . “ And where have my shoulders got # . NSg/I+ NPr/VXB NSg/I/J/C/Dq NSg/I/C/Ddem NPr🅪Sg/VB/J+ Nᴹ/VB+ NSg/VLXB . . VP/J NPr+ . . VB/C NSg/R/C NSg/VXB D$+ NPl/V3+ VP > to ? And oh , my poor hands , how is it I can’t see you ? ” She was moving them about # P . VB/C NPr/VB . D$+ NSg/VB/J+ NPl/V3+ . NSg/C VL3 NPr/ISg+ ISg/#r+ VXB NSg/VB ISgPl+ . . ISg+ VLPt Nᴹ/Vg/J NSg/IPl+ J/P > as she spoke , but no result seemed to follow , except a little shaking among the # R/C/P ISg+ NSg/VPt . NSg/C/P NSg/Dq/P+ NSg/VB+ VP/J P NSg/VB . VB/C/P D/P NPr/I/J/Dq Nᴹ/Vg/J+ P D+ > distant green leaves . # J+ NPr🅪Sg/VB/J+ NPl/V3+ . > # > As there seemed to be no chance of getting her hands up to her head , she tried # R/C/P R+ VP/J P NSg/VLXB NSg/Dq/P NPr/VB/J P NSg/Vg ISg/D$+ NPl/V3+ NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . ISg+ VP/J > to get her head down to them , and was delighted to find that her neck would bend # P NSg/VB ISg/D$+ NPr/VB/J+ N🅪Sg/VB/J/P P NSg/IPl+ . VB/C VLPt VP/J P NSg/VB NSg/I/C/Ddem ISg/D$+ NSg/VB+ VXB NPr/VB+ > about easily in any direction , like a serpent . She had just succeeded in curving # J/P R NPr/J/R/P I/R/Dq+ N🅪Sg+ . NSg/VB/J/C/P D/P+ NSg/VB+ . ISg+ VP J/R VP/J NPr/J/R/P Nᴹ/Vg/J+ > it down into a graceful zigzag , and was going to dive in among the leaves , which # NPr/ISg+ N🅪Sg/VB/J/P P D/P J NSg/VB/J . VB/C VLPt Nᴹ/Vg/J P NSg/VB NPr/J/R/P P D NPl/V3+ . I/C+ > she found to be nothing but the tops of the trees under which she had been # ISg+ NSg/VP P NSg/VLXB NSg/I/J+ NSg/C/P D NPl/V3 P D NPl/V3+ NSg/J/P I/C+ ISg+ VP NSg/VLPp > wandering , when a sharp hiss made her draw back in a hurry : a large pigeon had # Nᴹ/Vg/J . NSg/I/C D/P NPr/VB/J NSg/VB+ VP ISg/D$+ NSg/VB NSg/VB/J NPr/J/R/P D/P NSg/VB+ . D/P NSg/J NSg/VB+ VP > flown into her face , and was beating her violently with its wings . # VPp/J P ISg/D$+ NSg/VB+ . VB/C VLPt Nᴹ/Vg/J ISg/D$+ R P ISg/D$+ NPl/V3+ . > # > “ Serpent ! ” screamed the Pigeon . # . NSg/VB+ . . VP/J D+ NSg/VB+ . > # > “ I’m not a serpent ! ” said Alice indignantly . “ Let me alone ! ” # . K NSg/R/C D/P NSg/VB+ . . VP/J NPr+ R . . NSg/VBP NPr/ISg+ J . . > # > “ Serpent , I say again ! ” repeated the Pigeon , but in a more subdued tone , and # . NSg/VB+ . ISg/#r+ NSg/VB P . . VP/J D+ NSg/VB+ . NSg/C/P NPr/J/R/P D/P NPr/I/J/R/Dq VP/J+ N🅪Sg/I/VB . VB/C > added with a kind of sob , “ I’ve tried every way , and nothing seems to suit # VP/J P D/P NSg/J+ P NSg/VB . . K VP/J Dq NSg/J+ . VB/C NSg/I/J+ V3 P NSg/VB > them ! ” # NSg/IPl+ . . > # > “ I haven’t the least idea what you’re talking about , ” said Alice . # . ISg/#r+ VXB D NSg/J/Dq NSg+ NSg/I+ K Nᴹ/Vg/J J/P . . VP/J NPr+ . > # > “ I’ve tried the roots of trees , and I’ve tried banks , and I’ve tried hedges , ” # . K VP/J D NPl/V3 P NPl/V3+ . VB/C K VP/J NPrPl/V3+ . VB/C K VP/J NPl/V3 . . > the Pigeon went on , without attending to her ; “ but those serpents ! There’s no # D NSg/VB+ NSg/VPt J/P . C/P Nᴹ/Vg/J P ISg/D$+ . . NSg/C/P I/Ddem NPl/V3 . K NSg/Dq/P > pleasing them ! ” # Nᴹ/Vg/J NSg/IPl+ . . > # > Alice was more and more puzzled , but she thought there was no use in saying # NPr+ VLPt NPr/I/J/R/Dq VB/C NPr/I/J/R/Dq VP/J . NSg/C/P ISg+ N🅪Sg/VP R+ VLPt NSg/Dq/P N🅪Sg/VB NPr/J/R/P N🅪Sg/Vg/J > anything more till the Pigeon had finished . # NSg/I/VB+ NPr/I/J/R/Dq NSg/VB/C/P D+ NSg/VB+ VP VP/J . > # > “ As if it wasn’t trouble enough hatching the eggs , ” said the Pigeon ; “ but I must # . R/C/P NSg/C NPr/ISg+ VPt N🅪Sg/VB+ NSg/I Nᴹ/Vg/J D NPl/V3+ . . VP/J D NSg/VB+ . . NSg/C/P ISg/#r+ NSg/VXB > be on the look - out for serpents night and day ! Why , I haven’t had a wink of # NSg/VLXB J/P D NSg/VB+ . NSg/VB/J/R/P R/C/P NPl/V3 N🅪Sg/VB VB/C NPr🅪Sg+ . NSg/VB . ISg/#r+ VXB VP D/P NSg/VB P > sleep these three weeks ! ” # N🅪Sg/VB+ I/Ddem NSg NPrPl+ . . > # > “ I’m very sorry you’ve been annoyed , ” said Alice , who was beginning to see its # . K J/R NSg/VB/J K NSg/VLPp VP/J . . VP/J NPr+ . NPr/I+ VLPt NSg/Vg/J+ P NSg/VB ISg/D$+ > meaning . # N🅪Sg/Vg/J+ . > # > “ And just as I’d taken the highest tree in the wood , ” continued the Pigeon , # . VB/C J/R R/C/P K VPp/J D JS NSg/VB+ NPr/J/R/P D NPr🅪Sg/VB/J+ . . VP/J D NSg/VB+ . > raising its voice to a shriek , “ and just as I was thinking I should be free of # Nᴹ/Vg/J ISg/D$+ NSg/VB+ P D/P NSg/VB . . VB/C J/R R/C/P ISg/#r+ VLPt Nᴹ/Vg/J ISg/#r+ VXB NSg/VLXB NSg/VB/J P > them at last , they must needs come wriggling down from the sky ! Ugh , Serpent ! ” # NSg/IPl+ NSg/P NSg/VB/J . IPl+ NSg/VXB NPl/V3 NSg/VBPp/P Nᴹ/Vg/J N🅪Sg/VB/J/P P D N🅪Sg/VB+ . W? . NSg/VB+ . . > # > “ But I’m not a serpent , I tell you ! ” said Alice . “ I’m a — I’m a — ” # . NSg/C/P K NSg/R/C D/P NSg/VB+ . ISg/#r+ NPr/VB ISgPl+ . . VP/J NPr+ . . K D/P . K D/P . . > # > “ Well ! What are you ? ” said the Pigeon . “ I can see you’re trying to invent # . NSg/VB/J/R . NSg/I+ VLB ISgPl+ . . VP/J D+ NSg/VB+ . . ISg/#r+ NPr/VXB NSg/VB K Nᴹ/Vg/J P VB > something ! ” # NSg/I/J+ . . > # > “ I — I’m a little girl , ” said Alice , rather doubtfully , as she remembered the # . ISg/#r+ . K D/P+ NPr/I/J/Dq NSg/VB+ . . VP/J NPr+ . NPr/VB/J/R R . R/C/P ISg+ VP/J D > number of changes she had gone through that day . # N🅪Sg/VB/JC P NPl/V3+ ISg+ VP VPp/J/P NSg/J/P NSg/I/C/Ddem NPr🅪Sg+ . > # > “ A likely story indeed ! ” said the Pigeon in a tone of the deepest contempt . # . D/P+ NSg/J+ NSg/VB+ R . . VP/J D+ NSg/VB+ NPr/J/R/P D/P N🅪Sg/I/VB P D+ JS+ Nᴹ+ . > “ I’ve seen a good many little girls in my time , but never one with such a neck # . K NSg/VPp D/P NPr/VB/J NSg/I/J/Dq NPr/I/J/Dq NPl/V3+ NPr/J/R/P D$+ N🅪Sg/VB/J+ . NSg/C/P R NSg/I/J P NSg/I D/P NSg/VB+ > as that ! No , no ! You’re a serpent ; and there’s no use denying it . I suppose # R/C/P NSg/I/C/Ddem+ . NSg/Dq/P . NSg/Dq/P . K D/P+ NSg/VB+ . VB/C K NSg/Dq/P N🅪Sg/VB Nᴹ/Vg/J NPr/ISg+ . ISg/#r+ VB > you’ll be telling me next that you never tasted an egg ! ” # K NSg/VLXB Nᴹ/Vg/J NPr/ISg+ NSg/J/P NSg/I/C/Ddem ISgPl+ R VP/J D/P N🅪Sg/VB+ . . > # > “ I have tasted eggs , certainly , ” said Alice , who was a very truthful child ; “ but # . ISg/#r+ NSg/VXB VP/J NPl/V3+ . R . . VP/J NPr+ . NPr/I+ VLPt D/P J/R J NSg/VB+ . . NSg/C/P > little girls eat eggs quite as much as serpents do , you know . ” # NPr/I/J/Dq NPl/V3+ VB NPl/V3+ R R/C/P NSg/I/J/R/Dq R/C/P NPl/V3 VXB . ISgPl+ VB . . > # > “ I don’t believe it , ” said the Pigeon ; “ but if they do , why then they’re a kind # . ISg/#r+ VXB VB NPr/ISg+ . . VP/J D NSg/VB+ . . NSg/C/P NSg/C IPl+ VXB . NSg/VB NSg/J/R/C K D/P NSg/J > of serpent , that’s all I can say . ” # P NSg/VB+ . NSg$ NSg/I/J/C/Dq ISg/#r+ NPr/VXB NSg/VB . . > # > This was such a new idea to Alice , that she was quite silent for a minute or # I/Ddem+ VLPt NSg/I D/P NSg/J NSg P NPr+ . NSg/I/C/Ddem ISg+ VLPt R NSg/J R/C/P D/P+ NSg/VB/J+ NPr/C > two , which gave the Pigeon the opportunity of adding , “ You’re looking for eggs , # NSg . I/C+ VPt D NSg/VB+ D N🅪Sg P Nᴹ/Vg/J+ . . K Nᴹ/Vg/J R/C/P NPl/V3+ . > I know that well enough ; and what does it matter to me whether you’re a little # ISg/#r+ VB NSg/I/C/Ddem NSg/VB/J/R NSg/I . VB/C NSg/I+ NPl/VX3 NPr/ISg+ N🅪Sg/VB+ P NPr/ISg+ I/C K D/P NPr/I/J/Dq > girl or a serpent ? ” # NSg/VB NPr/C D/P NSg/VB+ . . > # > “ It matters a good deal to me , ” said Alice hastily ; “ but I’m not looking for # . NPr/ISg+ NPl/V3 D/P+ NPr/VB/J+ NSg/VB/J+ P NPr/ISg+ . . VP/J NPr+ R . . NSg/C/P K NSg/R/C Nᴹ/Vg/J R/C/P > eggs , as it happens ; and if I was , I shouldn’t want yours : I don’t like them # NPl/V3+ . R/C/P NPr/ISg+ V3 . VB/C NSg/C ISg/#r+ VLPt . ISg/#r+ VXB NSg/VB I+ . ISg/#r+ VXB NSg/VB/J/C/P NSg/IPl+ > raw . ” # NSg/VB/J . . > # > “ Well , be off , then ! ” said the Pigeon in a sulky tone , as it settled down again # . NSg/VB/J/R . NSg/VLXB NSg/VB/J/P . NSg/J/R/C . . VP/J D NSg/VB+ NPr/J/R/P D/P+ NSg/J+ N🅪Sg/I/VB+ . R/C/P NPr/ISg+ VP/J N🅪Sg/VB/J/P P > into its nest . Alice crouched down among the trees as well as she could , for her # P ISg/D$+ NSg/VB/JS+ . NPr+ VP/J N🅪Sg/VB/J/P P D+ NPl/V3+ R/C/P NSg/VB/J/R R/C/P ISg+ NSg/VXB . R/C/P ISg/D$+ > neck kept getting entangled among the branches , and every now and then she had # NSg/VB+ VP NSg/Vg VP/J P D NPl/V3+ . VB/C Dq NSg/J/R/C VB/C NSg/J/R/C ISg+ VP > to stop and untwist it . After a while she remembered that she still held the # P NSg/VB VB/C NSg/VB NPr/ISg+ . P D/P+ NSg/VB/C/P+ ISg+ VP/J NSg/I/C/Ddem ISg+ NSg/VB/J/R VP D > pieces of mushroom in her hands , and she set to work very carefully , nibbling # NPl/V3 P N🅪Sg/VB/J NPr/J/R/P ISg/D$+ NPl/V3+ . VB/C ISg+ NPr/VBP/J P N🅪Sg/VB J/R R . Nᴹ/Vg/J > first at one and then at the other , and growing sometimes taller and sometimes # NSg/J NSg/P NSg/I/J VB/C NSg/J/R/C NSg/P D NSg/VB/J . VB/C Nᴹ/Vg/J R JC VB/C R > shorter , until she had succeeded in bringing herself down to her usual height . # NSg/JC . C/P ISg+ VP VP/J NPr/J/R/P Nᴹ/Vg/J ISg+ N🅪Sg/VB/J/P P ISg/D$+ NSg/J N🅪Sg+ . > # > It was so long since she had been anything near the right size , that it felt # NPr/ISg+ VLPt NSg/I/J/R/C NPr/VB/J C/P ISg+ VP NSg/VLPp NSg/I/VB+ NSg/VB/J/P D+ NPr/VB/J+ N🅪Sg/VB+ . NSg/I/C/Ddem NPr/ISg+ N🅪Sg/VP/J > quite strange at first ; but she got used to it in a few minutes , and began # R NSg/VB/J NSg/P NSg/J . NSg/C/P ISg+ VP VP/J P NPr/ISg+ NPr/J/R/P D/P+ NSg/I/Dq+ NPl/V3+ . VB/C VPt > talking to herself , as usual . “ Come , there’s half my plan done now ! How puzzling # Nᴹ/Vg/J P ISg+ . R/C/P NSg/J . . NSg/VBPp/P . K N🅪Sg/J/P+ D$+ NSg/VB+ NSg/VPp/J NSg/J/R/C . NSg/C Nᴹ/Vg/J > all these changes are ! I’m never sure what I’m going to be , from one minute to # NSg/I/J/C/Dq+ I/Ddem+ NPl/V3+ VLB . K R J NSg/I+ K Nᴹ/Vg/J P NSg/VLXB . P NSg/I/J NSg/VB/J+ P > another ! However , I’ve got back to my right size : the next thing is , to get into # I/D . C . K VP NSg/VB/J P D$+ NPr/VB/J N🅪Sg/VB+ . D NSg/J/P NSg+ VL3 . P NSg/VB P > that beautiful garden — how is that to be done , I wonder ? ” As she said this , she # NSg/I/C/Ddem NSg/J NSg/VB/J+ . NSg/C VL3 NSg/I/C/Ddem+ P NSg/VLXB NSg/VPp/J . ISg/#r+ N🅪Sg/VB . . R/C/P ISg+ VP/J I/Ddem+ . ISg+ > came suddenly upon an open place , with a little house in it about four feet # NSg/VPt/P R P D/P+ NSg/VB/J+ N🅪Sg/VB+ . P D/P NPr/I/J/Dq NPr/VB+ NPr/J/R/P NPr/ISg+ J/P NSg+ NPl+ > high . “ Whoever lives there , ” thought Alice , “ it’ll never do to come upon them # NSg/VB/J/R . . I+ V3+ R . . N🅪Sg/VP NPr+ . . K R VXB P NSg/VBPp/P P NSg/IPl+ > this size : why , I should frighten them out of their wits ! ” So she began nibbling # I/Ddem N🅪Sg/VB+ . NSg/VB . ISg/#r+ VXB VB NSg/IPl+ NSg/VB/J/R/P P D$+ NPl/V3 . . NSg/I/J/R/C ISg+ VPt Nᴹ/Vg/J > at the righthand bit again , and did not venture to go near the house till she # NSg/P D ? NSg/VPt+ P . VB/C VXPt NSg/R/C NSg/VB+ P NSg/VB/J NSg/VB/J/P D NPr/VB+ NSg/VB/C/P ISg+ > had brought herself down to nine inches high . # VP VP ISg+ N🅪Sg/VB/J/P P NSg NPl/V3+ NSg/VB/J/R . > # > CHAPTER VI : Pig and Pepper # HeadingStart NSg/VB+ NPr/#r . NSg/VB VB/C N🅪Sg/VB+ > # > For a minute or two she stood looking at the house , and wondering what to do # R/C/P D/P+ NSg/VB/J+ NPr/C NSg ISg+ VP Nᴹ/Vg/J NSg/P D+ NPr/VB+ . VB/C Nᴹ/Vg/J NSg/I+ P VXB > next , when suddenly a footman in livery came running out of the wood — ( she # NSg/J/P . NSg/I/C R D/P NSg NPr/J/R/P NSg/VB/J NSg/VPt/P Nᴹ/Vg/J/P NSg/VB/J/R/P P D NPr🅪Sg/VB/J+ . . ISg+ > considered him to be a footman because he was in livery : otherwise , judging by # VP/J ISg+ P NSg/VLXB D/P NSg C/P NPr/ISg+ VLPt NPr/J/R/P NSg/VB/J . J/R . Nᴹ/Vg/J NSg/P > his face only , she would have called him a fish ) — and rapped loudly at the door # ISg/D$+ NSg/VB+ J/R/C . ISg+ VXB NSg/VXB VP/J ISg+ D/P N🅪SgPl/VB+ . . VB/C VP R NSg/P D NSg/VB+ > with his knuckles . It was opened by another footman in livery , with a round # P ISg/D$+ NPl/V3 . NPr/ISg+ VLPt VP/J NSg/P I/D NSg NPr/J/R/P NSg/VB/J . P D/P NSg/VB/J/P > face , and large eyes like a frog ; and both footmen , Alice noticed , had powdered # NSg/VB+ . VB/C NSg/J NPl/V3+ NSg/VB/J/C/P D/P NSg/VB . VB/C I/C/Dq NPl . NPr+ VP/J . VP VP/J > hair that curled all over their heads . She felt very curious to know what it was # N🅪Sg/VB+ NSg/I/C/Ddem+ VP/J NSg/I/J/C/Dq NSg/J/P D$+ NPl/V3+ . ISg+ N🅪Sg/VP/J J/R J P VB NSg/I+ NPr/ISg+ VLPt > all about , and crept a little way out of the wood to listen . # NSg/I/J/C/Dq J/P . VB/C VP D/P NPr/I/J/Dq+ NSg/J+ NSg/VB/J/R/P P D+ NPr🅪Sg/VB/J+ P NSg/VB . > # > The Fish - Footman began by producing from under his arm a great letter , nearly as # D+ N🅪SgPl/VB+ . NSg VPt NSg/P Nᴹ/Vg/J P NSg/J/P ISg/D$+ NSg/VB/J D/P NSg/J NSg/VB+ . R R/C/P > large as himself , and this he handed over to the other , saying , in a solemn # NSg/J R/C/P ISg+ . VB/C I/Ddem NPr/ISg+ VP/J NSg/J/P P D NSg/VB/J . N🅪Sg/Vg/J . NPr/J/R/P D/P J > tone , “ For the Duchess . An invitation from the Queen to play croquet . ” The # N🅪Sg/I/VB+ . . R/C/P D NSg/VB . D/P NSg+ P D+ NPr/VB/J+ P N🅪Sg/VB NSg/VB . . D > Frog - Footman repeated , in the same solemn tone , only changing the order of the # NSg/VB . NSg VP/J . NPr/J/R/P D I/J J N🅪Sg/I/VB+ . J/R/C Nᴹ/Vg/J D N🅪Sg/VB P D > words a little , “ From the Queen . An invitation for the Duchess to play croquet . ” # NPl/V3+ D/P NPr/I/J/Dq . . P D NPr/VB/J+ . D/P+ NSg+ R/C/P D NSg/VB P N🅪Sg/VB NSg/VB . . > # > Then they both bowed low , and their curls got entangled together . # NSg/J/R/C IPl+ I/C/Dq VP/J NSg/VB/J/R . VB/C D$+ NPl/V3 VP VP/J J . > # > Alice laughed so much at this , that she had to run back into the wood for fear # NPr+ VP/J NSg/I/J/R/C NSg/I/J/R/Dq NSg/P I/Ddem+ . NSg/I/C/Ddem ISg+ VP P NSg/VBPp NSg/VB/J P D NPr🅪Sg/VB/J R/C/P N🅪Sg/VB > of their hearing her ; and when she next peeped out the Fish - Footman was gone , # P D$+ Nᴹ/Vg/J+ ISg/D$+ . VB/C NSg/I/C ISg+ NSg/J/P VP/J NSg/VB/J/R/P D+ N🅪SgPl/VB+ . NSg VLPt VPp/J/P . > and the other was sitting on the ground near the door , staring stupidly up into # VB/C D NSg/VB/J VLPt NSg/Vg/J J/P D N🅪Sg/VB/J+ NSg/VB/J/P D NSg/VB+ . Nᴹ/Vg/J R NSg/VB/J/P P > the sky . # D N🅪Sg/VB+ . > # > Alice went timidly up to the door , and knocked . # NPr+ NSg/VPt R NSg/VB/J/P P D NSg/VB+ . VB/C VP/J . > # > “ There’s no sort of use in knocking , ” said the Footman , “ and that for two # . K NSg/Dq/P NSg/VB P N🅪Sg/VB NPr/J/R/P Nᴹ/Vg/J+ . . VP/J D NSg . . VB/C NSg/I/C/Ddem+ R/C/P NSg > reasons . First , because I’m on the same side of the door as you are ; secondly , # NPl/V3+ . NSg/J . C/P K J/P D I/J NSg/VB/J P D NSg/VB+ R/C/P ISgPl+ VLB . R . > because they’re making such a noise inside , no one could possibly hear you . ” And # C/P K Nᴹ/Vg/J NSg/I D/P N🅪Sg/VB+ NSg/J/P . NSg/Dq/P NSg/I/J+ NSg/VXB R VB ISgPl+ . . VB/C > certainly there was a most extraordinary noise going on within — a constant # R R+ VLPt D/P NSg/I/J/R/Dq NSg/J N🅪Sg/VB Nᴹ/Vg/J J/P NSg/J/P . D/P NSg/J > howling and sneezing , and every now and then a great crash , as if a dish or # Nᴹ/Vg/J VB/C Nᴹ/Vg/J . VB/C Dq NSg/J/R/C VB/C NSg/J/R/C D/P NSg/J NSg/VB/J+ . R/C/P NSg/C D/P NSg/VB+ NPr/C > kettle had been broken to pieces . # NSg/VB VP NSg/VLPp VPp/J P NPl/V3 . > # > “ Please , then , ” said Alice , “ how am I to get in ? ” # . VB . NSg/J/R/C . . VP/J NPr+ . . NSg/C NPr/VLB/J ISg/#r+ P NSg/VB NPr/J/R/P . . > # > “ There might be some sense in your knocking , ” the Footman went on without # . R+ Nᴹ/VXB/J NSg/VLXB I/J/R/Dq N🅪Sg/VB NPr/J/R/P D$+ Nᴹ/Vg/J . . D NSg NSg/VPt J/P C/P > attending to her , “ if we had the door between us . For instance , if you were # Nᴹ/Vg/J P ISg/D$+ . . NSg/C IPl+ VP D NSg/VB+ NSg/P NPr/IPl+ . R/C/P NSg/VB+ . NSg/C ISgPl+ NSg/VLPt > inside , you might knock , and I could let you out , you know . ” He was looking up # NSg/J/P . ISgPl+ Nᴹ/VXB/J NSg/VB . VB/C ISg/#r+ NSg/VXB NSg/VBP ISgPl+ NSg/VB/J/R/P . ISgPl+ VB . . NPr/ISg+ VLPt Nᴹ/Vg/J NSg/VB/J/P > into the sky all the time he was speaking , and this Alice thought decidedly # P D+ N🅪Sg/VB+ NSg/I/J/C/Dq+ D+ N🅪Sg/VB/J+ NPr/ISg+ VLPt Nᴹ/Vg/J . VB/C I/Ddem+ NPr+ N🅪Sg/VP R > uncivil . “ But perhaps he can’t help it , ” she said to herself ; “ his eyes are so # J . . NSg/C/P NSg/R NPr/ISg+ VXB NSg/VB NPr/ISg+ . . ISg+ VP/J P ISg+ . . ISg/D$+ NPl/V3+ VLB NSg/I/J/R/C > very nearly at the top of his head . But at any rate he might answer # J/R R NSg/P D NSg/VB/J P ISg/D$+ NPr/VB/J+ . NSg/C/P NSg/P I/R/Dq+ NSg/VB+ NPr/ISg+ Nᴹ/VXB/J NSg/VB+ > questions . — How am I to get in ? ” she repeated , aloud . # NPl/V3+ . . NSg/C NPr/VLB/J ISg/#r+ P NSg/VB NPr/J/R/P . . ISg+ VP/J . J . > # > “ I shall sit here , ” the Footman remarked , “ till tomorrow — ” # . ISg/#r+ VXB NSg/VB J/R . . D NSg VP/J . . NSg/VB/C/P NSg+ . . > # > At this moment the door of the house opened , and a large plate came skimming # NSg/P I/Ddem+ NSg+ D NSg/VB P D+ NPr/VB+ VP/J . VB/C D/P+ NSg/J+ NSg/VB+ NSg/VPt/P NSg/Vg > out , straight at the Footman’s head : it just grazed his nose , and broke to # NSg/VB/J/R/P . NSg/VB/J/R NSg/P D NSg$ NPr/VB/J+ . NPr/ISg+ J/R VP/J ISg/D$+ NSg/VB+ . VB/C NSg/VPt/J P > pieces against one of the trees behind him . # NPl/V3 C/P NSg/I/J P D NPl/V3+ NSg/J/P ISg+ . > # > “ — or next day , maybe , ” the Footman continued in the same tone , exactly as if # . . NPr/C NSg/J/P+ NPr🅪Sg+ . NSg/J/R . . D NSg VP/J NPr/J/R/P D I/J N🅪Sg/I/VB+ . R R/C/P NSg/C > nothing had happened . # NSg/I/J+ VP VP/J . > # > “ How am I to get in ? ” asked Alice again , in a louder tone . # . NSg/C NPr/VLB/J ISg/#r+ P NSg/VB NPr/J/R/P . . VP/J NPr+ P . NPr/J/R/P D/P+ JC+ N🅪Sg/I/VB+ . > # > “ Are you to get in at all ? ” said the Footman . “ That’s the first question , you # . VLB ISgPl+ P NSg/VB NPr/J/R/P NSg/P NSg/I/J/C/Dq . . VP/J D NSg . . NSg$ D+ NSg/J NSg/VB+ . ISgPl+ > know . ” # VB . . > # > It was , no doubt : only Alice did not like to be told so . “ It’s really dreadful , ” # NPr/ISg+ VLPt . NSg/Dq/P N🅪Sg/VB+ . J/R/C NPr+ VXPt NSg/R/C NSg/VB/J/C/P P NSg/VLXB VP NSg/I/J/R/C . . K R NSg/J . . > she muttered to herself , “ the way all the creatures argue . It’s enough to drive # ISg+ VP/J P ISg+ . . D NSg/J+ NSg/I/J/C/Dq D NPl+ VB . K NSg/I P N🅪Sg/VB > one crazy ! ” # NSg/I/J NSg/J . . > # > The Footman seemed to think this a good opportunity for repeating his remark , # D NSg VP/J P NSg/VB I/Ddem D/P NPr/VB/J N🅪Sg+ R/C/P Nᴹ/Vg/J ISg/D$+ NSg/VB+ . > with variations . “ I shall sit here , ” he said , “ on and off , for days and days . ” # P NPl . . ISg/#r+ VXB NSg/VB J/R . . NPr/ISg+ VP/J . . J/P VB/C NSg/VB/J/P . R/C/P NPl VB/C NPl+ . . > # > “ But what am I to do ? ” said Alice . # . NSg/C/P NSg/I+ NPr/VLB/J ISg/#r+ P VXB . . VP/J NPr+ . > # > “ Anything you like , ” said the Footman , and began whistling . # . NSg/I/VB+ ISgPl+ NSg/VB/J/C/P . . VP/J D NSg . VB/C VPt Nᴹ/Vg/J . > # > “ Oh , there’s no use in talking to him , ” said Alice desperately : “ he’s perfectly # . NPr/VB . K NSg/Dq/P N🅪Sg/VB NPr/J/R/P Nᴹ/Vg/J+ P ISg+ . . VP/J NPr+ R . . NPr$ R > idiotic ! ” And she opened the door and went in . # J . . VB/C ISg+ VP/J D+ NSg/VB+ VB/C NSg/VPt NPr/J/R/P . > # > The door led right into a large kitchen , which was full of smoke from one end to # D+ NSg/VB+ NSg/VP/J NPr/VB/J P D/P+ NSg/J+ NSg/VB+ . I/C+ VLPt NSg/VB/J P N🅪Sg/VB+ P NSg/I/J+ NSg/VB+ P > the other : the Duchess was sitting on a three - legged stool in the middle , # D NSg/VB/J . D NSg/VB VLPt NSg/Vg/J J/P D/P NSg . NSg/VP/J NSg/VB NPr/J/R/P D NSg/VB/J . > nursing a baby ; the cook was leaning over the fire , stirring a large cauldron # Nᴹ/Vg/J D/P NSg/VB/J+ . D NPr/VB+ VLPt Nᴹ/Vg/J NSg/J/P D N🅪Sg/VB/J+ . NSg/Vg/J D/P NSg/J NSg+ > which seemed to be full of soup . # I/C+ VP/J P NSg/VLXB NSg/VB/J P N🅪Sg/VB+ . > # > “ There’s certainly too much pepper in that soup ! ” Alice said to herself , as well # . K R R NSg/I/J/R/Dq N🅪Sg/VB+ NPr/J/R/P NSg/I/C/Ddem N🅪Sg/VB+ . . NPr+ VP/J P ISg+ . R/C/P NSg/VB/J/R > as she could for sneezing . # R/C/P ISg+ NSg/VXB R/C/P Nᴹ/Vg/J . > # > There was certainly too much of it in the air . Even the Duchess sneezed # R+ VLPt R R NSg/I/J/R/Dq P NPr/ISg+ NPr/J/R/P D+ N🅪Sg/VB+ . NSg/VB/J/R D NSg/VB VP/J > occasionally ; and as for the baby , it was sneezing and howling alternately # R . VB/C R/C/P R/C/P D NSg/VB/J+ . NPr/ISg+ VLPt Nᴹ/Vg/J VB/C Nᴹ/Vg/J R > without a moment’s pause . The only things in the kitchen that did not sneeze , # C/P D/P NSg$ NSg/VB+ . D J/R/C NPl+ NPr/J/R/P D+ NSg/VB+ NSg/I/C/Ddem+ VXPt NSg/R/C NSg/VB . > were the cook , and a large cat which was sitting on the hearth and grinning from # NSg/VLPt D+ NPr/VB+ . VB/C D/P+ NSg/J+ NSg/VB/J+ I/C+ VLPt NSg/Vg/J J/P D NSg VB/C NSg/Vg P > ear to ear . # NSg/VB/J+ P NSg/VB/J . > # > “ Please would you tell me , ” said Alice , a little timidly , for she was not quite # . VB VXB ISgPl+ NPr/VB NPr/ISg+ . . VP/J NPr+ . D/P NPr/I/J/Dq R . R/C/P ISg+ VLPt NSg/R/C R > sure whether it was good manners for her to speak first , “ why your cat grins # J I/C NPr/ISg+ VLPt NPr/VB/J NPl+ R/C/P ISg/D$+ P NSg/VB NSg/J . . NSg/VB D$+ NSg/VB/J+ NPl/V3 > like that ? ” # NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > “ It’s a Cheshire cat , ” said the Duchess , “ and that’s why . Pig ! ” # . K D/P NPr NSg/VB/J+ . . VP/J D NSg/VB . . VB/C NSg$ NSg/VB . NSg/VB+ . . > # > She said the last word with such sudden violence that Alice quite jumped ; but # ISg+ VP/J D NSg/VB/J NSg/VB P NSg/I+ NSg/J+ Nᴹ/VB+ NSg/I/C/Ddem+ NPr+ R VP/J . NSg/C/P > she saw in another moment that it was addressed to the baby , and not to her , so # ISg+ NSg/VPt NPr/J/R/P I/D+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ VLPt VP/J P D+ NSg/VB/J+ . VB/C NSg/R/C P ISg/D$+ . NSg/I/J/R/C > she took courage , and went on again : — # ISg+ VPt NSg/VB+ . VB/C NSg/VPt J/P P . . > # > “ I didn’t know that Cheshire cats always grinned ; in fact , I didn’t know that # . ISg/#r+ VXPt VB NSg/I/C/Ddem NPr NPl/V3+ R VP . NPr/J/R/P NSg+ . ISg/#r+ VXPt VB NSg/I/C/Ddem > cats could grin . ” # NPl/V3+ NSg/VXB NSg/VB+ . . > # > “ They all can , ” said the Duchess ; “ and most of ’ em do . ” # . IPl+ NSg/I/J/C/Dq NPr/VXB . . VP/J D NSg/VB . . VB/C NSg/I/J/R/Dq P . NSg/I/J+ VXB . . > # > “ I don’t know of any that do , ” Alice said very politely , feeling quite pleased # . ISg/#r+ VXB VB P I/R/Dq NSg/I/C/Ddem+ VXB . . NPr+ VP/J J/R R . N🅪Sg/Vg/J R VP/J > to have got into a conversation . # P NSg/VXB VP P D/P N🅪Sg/VB+ . > # > “ You don’t know much , ” said the Duchess ; “ and that’s a fact . ” # . ISgPl+ VXB VB NSg/I/J/R/Dq . . VP/J D NSg/VB . . VB/C NSg$ D/P NSg+ . . > # > Alice did not at all like the tone of this remark , and thought it would be as # NPr+ VXPt NSg/R/C NSg/P NSg/I/J/C/Dq NSg/VB/J/C/P D N🅪Sg/I/VB P I/Ddem+ NSg/VB+ . VB/C N🅪Sg/VP NPr/ISg+ VXB NSg/VLXB R/C/P > well to introduce some other subject of conversation . While she was trying to # NSg/VB/J/R P VB I/J/R/Dq NSg/VB/J NSg/VB/J P N🅪Sg/VB+ . NSg/VB/C/P ISg+ VLPt Nᴹ/Vg/J P > fix on one , the cook took the cauldron of soup off the fire , and at once set to # NSg/VB J/P NSg/I/J . D NPr/VB VPt D NSg P N🅪Sg/VB+ NSg/VB/J/P D+ N🅪Sg/VB/J+ . VB/C NSg/P NSg/C NPr/VBP/J P > work throwing everything within her reach at the Duchess and the baby — the # N🅪Sg/VB Nᴹ/Vg/J NSg/I/VB+ NSg/J/P ISg/D$+ NSg/VB NSg/P D NSg/VB VB/C D NSg/VB/J+ . D > fire - irons came first ; then followed a shower of saucepans , plates , and dishes . # N🅪Sg/VB/J+ . NPl/V3+ NSg/VPt/P NSg/J . NSg/J/R/C VP/J D/P NSg/VB P NPl/V3 . NPl/V3+ . VB/C NPl/V3+ . > The Duchess took no notice of them even when they hit her ; and the baby was # D NSg/VB VPt NSg/Dq/P NSg/VB P NSg/IPl+ NSg/VB/J/R NSg/I/C IPl+ NSg/VBP/J ISg/D$+ . VB/C D NSg/VB/J+ VLPt > howling so much already , that it was quite impossible to say whether the blows # Nᴹ/Vg/J NSg/I/J/R/C NSg/I/J/R/Dq R . NSg/I/C/Ddem NPr/ISg+ VLPt R NSg/J P NSg/VB I/C D NPl/V3 > hurt it or not . # NSg/VBP/J NPr/ISg+ NPr/C NSg/R/C . > # > “ Oh , please mind what you’re doing ! ” cried Alice , jumping up and down in an # . NPr/VB . VB NSg/VB+ NSg/I+ K Nᴹ/Vg/J . . VP/J NPr+ . Nᴹ/Vg/J NSg/VB/J/P VB/C N🅪Sg/VB/J/P NPr/J/R/P D/P > agony of terror . “ Oh , there goes his precious nose ! ” as an unusually large # N🅪Sg P N🅪Sg+ . . NPr/VB . R+ NPl/V3 ISg/D$+ NSg/J+ NSg/VB+ . . R/C/P D/P R NSg/J+ > saucepan flew close by it , and very nearly carried it off . # NSg/VB+ NSg/VPt/J NSg/VB/J NSg/P NPr/ISg+ . VB/C J/R R VP/J NPr/ISg+ NSg/VB/J/P . > # > “ If everybody minded their own business , ” the Duchess said in a hoarse growl , # . NSg/C NSg/I+ VP/J+ D$+ NSg/VB/J+ N🅪Sg/J+ . . D NSg/VB VP/J NPr/J/R/P D/P NSg/VB/J NSg/VB . > “ the world would go round a deal faster than it does . ” # . D NSg/VB+ VXB NSg/VB/J NSg/VB/J/P D/P NSg/VB/J+ NSg/JC C/P NPr/ISg+ NPl/VX3 . . > # > “ Which would not be an advantage , ” said Alice , who felt very glad to get an # . I/C+ VXB NSg/R/C NSg/VLXB D/P+ N🅪Sg/VB+ . . VP/J NPr+ . NPr/I+ N🅪Sg/VP/J J/R NSg/VB/J P NSg/VB D/P > opportunity of showing off a little of her knowledge . “ Just think of what work # N🅪Sg P Nᴹ/Vg/J NSg/VB/J/P D/P NPr/I/J/Dq P ISg/D$+ Nᴹ+ . . J/R NSg/VB P NSg/I+ N🅪Sg/VB+ > it would make with the day and night ! You see the earth takes twenty - four hours # NPr/ISg+ VXB NSg/VB P D NPr🅪Sg VB/C N🅪Sg/VB+ . ISgPl+ NSg/VB D+ NPrᴹ/VB+ NPl/V3 NSg . NSg NPl > to turn round on its axis — ” # P NSg/VB NSg/VB/J/P J/P ISg/D$+ NPr+ . . > # > “ Talking of axes , ” said the Duchess , “ chop off her head ! ” # . Nᴹ/Vg/J P NPl/V3/Am/Br . . VP/J D NSg/VB . . NSg/VB+ NSg/VB/J/P ISg/D$+ NPr/VB/J+ . . > # > Alice glanced rather anxiously at the cook , to see if she meant to take the # NPr+ VP/J NPr/VB/J/R R NSg/P D+ NPr/VB+ . P NSg/VB NSg/C ISg+ VP P NSg/VB D+ > hint ; but the cook was busily stirring the soup , and seemed not to be listening , # NSg/VB+ . NSg/C/P D+ NPr/VB+ VLPt R NSg/Vg/J D+ N🅪Sg/VB+ . VB/C VP/J NSg/R/C P NSg/VLXB Nᴹ/Vg/J . > so she went on again : “ Twenty - four hours , I think ; or is it twelve ? I — ” # NSg/I/J/R/C ISg+ NSg/VPt J/P P . . NSg . NSg NPl+ . ISg/#r+ NSg/VB . NPr/C VL3 NPr/ISg+ NSg . ISg/#r+ . . > # > “ Oh , don’t bother me , ” said the Duchess ; “ I never could abide figures ! ” And with # . NPr/VB . VXB Nᴹ/VB NPr/ISg+ . . VP/J D NSg/VB . . ISg/#r+ R NSg/VXB VB NPl/V3+ . . VB/C P > that she began nursing her child again , singing a sort of lullaby to it as she # NSg/I/C/Ddem ISg+ VPt Nᴹ/Vg/J ISg/D$+ NSg/VB+ P . Nᴹ/Vg/J D/P NSg/VB+ P NSg/VB P NPr/ISg+ R/C/P ISg+ > did so , and giving it a violent shake at the end of every line : # VXPt NSg/I/J/R/C . VB/C Nᴹ/Vg/J NPr/ISg+ D/P NSg/VB/J NSg/VB+ NSg/P D NSg/VB P Dq NSg/VB+ . > # > “ Speak roughly to your little boy , And beat him when he sneezes : He only does # . NSg/VB R P D$+ NPr/I/J/Dq+ NSg/VB+ . VB/C N🅪Sg/VB/J ISg+ NSg/I/C NPr/ISg+ NPl/V3 . NPr/ISg+ J/R/C NPl/VX3 > it to annoy , Because he knows it teases . ” # NPr/ISg+ P NSg/VB . C/P NPr/ISg+ V3 NPr/ISg+ NPl/V3 . . > # > CHORUS . ( In which the cook and the baby joined ) : # NSg/VB+ . . NPr/J/R/P I/C+ D NPr/VB VB/C D+ NSg/VB/J+ VP/J . . > # > “ Wow ! wow ! wow ! ” # . NSg/VB . NSg/VB . NSg/VB . . > # > While the Duchess sang the second verse of the song , she kept tossing the baby # NSg/VB/C/P D NSg/VB NPr/VPt D NSg/VB/J NSg/VB P D N🅪Sg+ . ISg+ VP Nᴹ/Vg/J D NSg/VB/J+ > violently up and down , and the poor little thing howled so , that Alice could # R NSg/VB/J/P VB/C N🅪Sg/VB/J/P . VB/C D NSg/VB/J NPr/I/J/Dq NSg+ VP/J NSg/I/J/R/C . NSg/I/C/Ddem NPr+ NSg/VXB > hardly hear the words : — # R VB D NPl/V3+ . . > # > “ I speak severely to my boy , I beat him when he sneezes ; For he can thoroughly # . ISg/#r+ NSg/VB R P D$+ NSg/VB+ . ISg/#r+ N🅪Sg/VB/J ISg+ NSg/I/C NPr/ISg+ NPl/V3 . R/C/P NPr/ISg+ NPr/VXB R > enjoy The pepper when he pleases ! ” # VB D N🅪Sg/VB+ NSg/I/C NPr/ISg+ V3 . . > # > CHORUS . # NSg/VB+ . > # > “ Wow ! wow ! wow ! ” # . NSg/VB . NSg/VB . NSg/VB . . > # > “ Here ! you may nurse it a bit , if you like ! ” the Duchess said to Alice , flinging # . J/R . ISgPl+ NPr/VXB NSg/VB NPr/ISg+ D/P+ NSg/VPt+ . NSg/C ISgPl+ NSg/VB/J/C/P . . D NSg/VB VP/J P NPr+ . Nᴹ/Vg/J > the baby at her as she spoke . “ I must go and get ready to play croquet with the # D NSg/VB/J+ NSg/P ISg/D$+ R/C/P ISg+ NSg/VPt . . ISg/#r+ NSg/VXB NSg/VB/J VB/C NSg/VB NSg/VB/J P N🅪Sg/VB NSg/VB P D+ > Queen , ” and she hurried out of the room . The cook threw a frying - pan after her # NPr/VB/J+ . . VB/C ISg+ VP/J NSg/VB/J/R/P P D N🅪Sg/VB/J+ . D NPr/VB VPt D/P Nᴹ/Vg/J . NPr/VB/J P ISg/D$+ > as she went out , but it just missed her . # R/C/P ISg+ NSg/VPt NSg/VB/J/R/P . NSg/C/P NPr/ISg+ J/R VP/J ISg/D$+ . > # > Alice caught the baby with some difficulty , as it was a queer - shaped little # NPr+ VP/J D NSg/VB/J P I/J/R/Dq+ N🅪Sg+ . R/C/P NPr/ISg+ VLPt D/P NSg/VB/J . VP/J NPr/I/J/Dq+ > creature , and held out its arms and legs in all directions , “ just like a # NSg+ . VB/C VP NSg/VB/J/R/P ISg/D$+ NPl/V3 VB/C NPl/V3+ NPr/J/R/P NSg/I/J/C/Dq+ NPl+ . . J/R NSg/VB/J/C/P D/P > star - fish , ” thought Alice . The poor little thing was snorting like a # NSg/VB+ . N🅪SgPl/VB+ . . N🅪Sg/VP NPr+ . D+ NSg/VB/J+ NPr/I/J/Dq+ NSg+ VLPt Nᴹ/Vg/J NSg/VB/J/C/P D/P > steam - engine when she caught it , and kept doubling itself up and straightening # N🅪Sg/VB/J+ . NSg/VB+ NSg/I/C ISg+ VP/J NPr/ISg+ . VB/C VP Nᴹ/Vg/J ISg+ NSg/VB/J/P VB/C Nᴹ/Vg/J > itself out again , so that altogether , for the first minute or two , it was as # ISg+ NSg/VB/J/R/P P . NSg/I/J/R/C NSg/I/C/Ddem+ NSg . R/C/P D NSg/J NSg/VB/J+ NPr/C NSg . NPr/ISg+ VLPt R/C/P > much as she could do to hold it . # NSg/I/J/R/Dq R/C/P ISg+ NSg/VXB VXB P NSg/VB/J NPr/ISg+ . > # > As soon as she had made out the proper way of nursing it , ( which was to twist it # R/C/P J/R R/C/P ISg+ VP VP NSg/VB/J/R/P D NSg/J NSg/J P Nᴹ/Vg/J NPr/ISg+ . . I/C+ VLPt P NSg/VB NPr/ISg+ > up into a sort of knot , and then keep tight hold of its right ear and left foot , # NSg/VB/J/P P D/P NSg/VB P NSg/VB+ . VB/C NSg/J/R/C NSg/VB VB/J NSg/VB/J P ISg/D$+ NPr/VB/J NSg/VB/J+ VB/C NPr/VP/J NSg/VB+ . > so as to prevent its undoing itself , ) she carried it out into the open air . “ If # NSg/I/J/R/C R/C/P P VB ISg/D$+ NSg/Vg ISg+ . . ISg+ VP/J NPr/ISg+ NSg/VB/J/R/P P D NSg/VB/J N🅪Sg/VB+ . . NSg/C > I don’t take this child away with me , ” thought Alice , “ they’re sure to kill it # ISg/#r+ VXB NSg/VB I/Ddem NSg/VB+ VB/J P NPr/ISg+ . . N🅪Sg/VP NPr+ . . K J P NSg/VB NPr/ISg+ > in a day or two : wouldn’t it be murder to leave it behind ? ” She said the last # NPr/J/R/P D/P NPr🅪Sg+ NPr/C NSg . VXB NPr/ISg+ NSg/VLXB N🅪Sg/VB+ P NSg/VB NPr/ISg+ NSg/J/P . . ISg+ VP/J D+ NSg/VB/J+ > words out loud , and the little thing grunted in reply ( it had left off sneezing # NPl/V3+ NSg/VB/J/R/P NSg/J . VB/C D+ NPr/I/J/Dq+ NSg+ VP/J NPr/J/R/P NSg/VB+ . NPr/ISg+ VP NPr/VP/J NSg/VB/J/P Nᴹ/Vg/J > by this time ) . “ Don’t grunt , ” said Alice ; “ that’s not at all a proper way of # NSg/P I/Ddem N🅪Sg/VB/J+ . . . VXB NSg/VB+ . . VP/J NPr+ . . NSg$ NSg/R/C NSg/P NSg/I/J/C/Dq D/P NSg/J NSg/J P > expressing yourself . ” # Nᴹ/Vg/J ISg+ . . > # > The baby grunted again , and Alice looked very anxiously into its face to see # D+ NSg/VB/J+ VP/J P . VB/C NPr+ VP/J J/R R P ISg/D$+ NSg/VB+ P NSg/VB > what was the matter with it . There could be no doubt that it had a very turn - up # NSg/I+ VLPt D N🅪Sg/VB+ P NPr/ISg+ . R+ NSg/VXB NSg/VLXB NSg/Dq/P+ N🅪Sg/VB+ NSg/I/C/Ddem+ NPr/ISg+ VP D/P J/R NSg/VB . NSg/VB/J/P > nose , much more like a snout than a real nose ; also its eyes were getting # NSg/VB+ . NSg/I/J/R/Dq NPr/I/J/R/Dq NSg/VB/J/C/P D/P NSg/VB C/P D/P NSg/J NSg/VB+ . R/C ISg/D$+ NPl/V3+ NSg/VLPt NSg/Vg > extremely small for a baby : altogether Alice did not like the look of the thing # R NPr/VB/J R/C/P D/P NSg/VB/J+ . NSg NPr+ VXPt NSg/R/C NSg/VB/J/C/P D NSg/VB P D NSg+ > at all . “ But perhaps it was only sobbing , ” she thought , and looked into its eyes # NSg/P NSg/I/J/C/Dq . . NSg/C/P NSg/R NPr/ISg+ VLPt J/R/C NSg/Vg/J . . ISg+ N🅪Sg/VP . VB/C VP/J P ISg/D$+ NPl/V3+ > again , to see if there were any tears . # P . P NSg/VB NSg/C R+ NSg/VLPt I/R/Dq NPl/V3+ . > # > No , there were no tears . “ If you’re going to turn into a pig , my dear , ” said # NSg/Dq/P . R+ NSg/VLPt NSg/Dq/P+ NPl/V3+ . . NSg/C K Nᴹ/Vg/J P NSg/VB P D/P NSg/VB+ . D$+ NSg/VB/J . . VP/J > Alice , seriously , “ I’ll have nothing more to do with you . Mind now ! ” The poor # NPr+ . R . . K NSg/VXB NSg/I/J+ NPr/I/J/R/Dq P VXB P ISgPl+ . NSg/VB+ NSg/J/R/C . . D+ NSg/VB/J+ > little thing sobbed again ( or grunted , it was impossible to say which ) , and they # NPr/I/J/Dq+ NSg+ VP P . NPr/C VP/J . NPr/ISg+ VLPt NSg/J P NSg/VB I/C+ . . VB/C IPl+ > went on for some while in silence . # NSg/VPt J/P R/C/P I/J/R/Dq NSg/VB/C/P NPr/J/R/P NSg/VB+ . > # > Alice was just beginning to think to herself , “ Now , what am I to do with this # NPr+ VLPt J/R NSg/Vg/J P NSg/VB P ISg+ . . NSg/J/R/C . NSg/I+ NPr/VLB/J ISg/#r+ P VXB P I/Ddem+ > creature when I get it home ? ” when it grunted again , so violently , that she # NSg+ NSg/I/C ISg/#r+ NSg/VB NPr/ISg+ NSg/VB/J+ . . NSg/I/C NPr/ISg+ VP/J P . NSg/I/J/R/C R . NSg/I/C/Ddem ISg+ > looked down into its face in some alarm . This time there could be no mistake # VP/J N🅪Sg/VB/J/P P ISg/D$+ NSg/VB+ NPr/J/R/P I/J/R/Dq N🅪Sg/VB+ . I/Ddem+ N🅪Sg/VB/J+ R+ NSg/VXB NSg/VLXB NSg/Dq/P NSg/VB > about it : it was neither more nor less than a pig , and she felt that it would be # J/P NPr/ISg+ . NPr/ISg+ VLPt I/C NPr/I/J/R/Dq NSg/C VB/J/R/C/P C/P D/P+ NSg/VB+ . VB/C ISg+ N🅪Sg/VP/J NSg/I/C/Ddem NPr/ISg+ VXB NSg/VLXB > quite absurd for her to carry it further . # R NSg/J R/C/P ISg/D$+ P NSg/VB NPr/ISg+ VB/JC . > # > So she set the little creature down , and felt quite relieved to see it trot away # NSg/I/J/R/C ISg+ NPr/VBP/J D+ NPr/I/J/Dq+ NSg+ N🅪Sg/VB/J/P . VB/C N🅪Sg/VP/J R VP/J P NSg/VB NPr/ISg+ NSg/VB+ VB/J > quietly into the wood . “ If it had grown up , ” she said to herself , “ it would have # R P D+ NPr🅪Sg/VB/J+ . . NSg/C NPr/ISg+ VP VB/J NSg/VB/J/P . . ISg+ VP/J P ISg+ . . NPr/ISg+ VXB NSg/VXB > made a dreadfully ugly child : but it makes rather a handsome pig , I think . ” And # VP D/P R NSg/VB/J+ NSg/VB+ . NSg/C/P NPr/ISg+ NPl/V3 NPr/VB/J/R D/P VB/J NSg/VB+ . ISg/#r+ NSg/VB . . VB/C > she began thinking over other children she knew , who might do very well as pigs , # ISg+ VPt Nᴹ/Vg/J NSg/J/P NSg/VB/J+ NPl+ ISg+ VPt . NPr/I+ Nᴹ/VXB/J VXB J/R NSg/VB/J/R R/C/P NPl/V3+ . > and was just saying to herself , “ if one only knew the right way to change them — ” # VB/C VLPt J/R N🅪Sg/Vg/J P ISg+ . . NSg/C NSg/I/J J/R/C VPt D NPr/VB/J NSg/J+ P N🅪Sg/VB NSg/IPl+ . . > when she was a little startled by seeing the Cheshire Cat sitting on a bough of # NSg/I/C ISg+ VLPt D/P NPr/I/J/Dq VP/J NSg/P NSg/Vg/J/C D NPr NSg/VB/J+ NSg/Vg/J J/P D/P NSg P > a tree a few yards off . # D/P NSg/VB+ D/P NSg/I/Dq NPl/V3+ NSg/VB/J/P . > # > The Cat only grinned when it saw Alice . It looked good - natured , she thought : # D+ NSg/VB/J+ J/R/C VP NSg/I/C NPr/ISg+ NSg/VPt NPr+ . NPr/ISg+ VP/J NPr/VB/J . ? . ISg+ N🅪Sg/VP . > still it had very long claws and a great many teeth , so she felt that it ought # NSg/VB/J/R NPr/ISg+ VP J/R NPr/VB/J NPl/V3 VB/C D/P NSg/J NSg/I/J/Dq NPl+ . NSg/I/J/R/C ISg+ N🅪Sg/VP/J NSg/I/C/Ddem NPr/ISg+ NSg/I/VXB > to be treated with respect . # P NSg/VLXB VP/J P Nᴹ/VB+ . > # > “ Cheshire Puss , ” she began , rather timidly , as she did not at all know whether # . NPr NSg . . ISg+ VPt . NPr/VB/J/R R . R/C/P ISg+ VXPt NSg/R/C NSg/P NSg/I/J/C/Dq VB+ I/C > it would like the name : however , it only grinned a little wider . “ Come , it’s # NPr/ISg+ VXB NSg/VB/J/C/P D NSg/VB+ . C . NPr/ISg+ J/R/C VP D/P NPr/I/J/Dq JC . . NSg/VBPp/P . K > pleased so far , ” thought Alice , and she went on . “ Would you tell me , please , # VP/J NSg/I/J/R/C NSg/VB/J . . N🅪Sg/VP NPr+ . VB/C ISg+ NSg/VPt J/P . . VXB ISgPl+ NPr/VB NPr/ISg+ . VB . > which way I ought to go from here ? ” # I/C+ NSg/J+ ISg/#r+ NSg/I/VXB P NSg/VB/J P J/R . . > # > “ That depends a good deal on where you want to get to , ” said the Cat . # . NSg/I/C/Ddem+ NPl/V3 D/P+ NPr/VB/J+ NSg/VB/J+ J/P NSg/R/C ISgPl+ NSg/VB P NSg/VB P . . VP/J D+ NSg/VB/J+ . > # > “ I don’t much care where — ” said Alice . # . ISg/#r+ VXB NSg/I/J/R/Dq N🅪Sg/VB+ NSg/R/C . . VP/J NPr+ . > # > “ Then it doesn’t matter which way you go , ” said the Cat . # . NSg/J/R/C NPr/ISg+ VX3 N🅪Sg/VB+ I/C+ NSg/J+ ISgPl+ NSg/VB/J . . VP/J D NSg/VB/J+ . > # > “ — so long as I get somewhere , ” Alice added as an explanation . # . . NSg/I/J/R/C NPr/VB/J R/C/P ISg/#r+ NSg/VB NSg . . NPr+ VP/J R/C/P D/P+ N🅪Sg+ . > # > “ Oh , you’re sure to do that , ” said the Cat , “ if you only walk long enough . ” # . NPr/VB . K J P VXB NSg/I/C/Ddem+ . . VP/J D NSg/VB/J+ . . NSg/C ISgPl+ J/R/C NSg/VB NPr/VB/J NSg/I . . > # > Alice felt that this could not be denied , so she tried another question . “ What # NPr+ N🅪Sg/VP/J NSg/I/C/Ddem I/Ddem+ NSg/VXB NSg/R/C NSg/VLXB VP/J . NSg/I/J/R/C ISg+ VP/J I/D+ NSg/VB+ . . NSg/I+ > sort of people live about here ? ” # NSg/VB P NPl/VB+ VB/J J/P J/R . . > # > “ In that direction , ” the Cat said , waving its right paw round , “ lives a Hatter : # . NPr/J/R/P NSg/I/C/Ddem+ N🅪Sg+ . . D+ NSg/VB/J+ VP/J . Nᴹ/Vg/J ISg/D$+ NPr/VB/J+ NSg/VB+ NSg/VB/J/P . . V3+ D/P NSg/VB . > and in that direction , ” waving the other paw , “ lives a March Hare . Visit either # VB/C NPr/J/R/P NSg/I/C/Ddem N🅪Sg+ . . Nᴹ/Vg/J D NSg/VB/J NSg/VB+ . . V3+ D/P NPr/VB+ NSg/VB/J+ . NSg/VB I/C > you like : they’re both mad . ” # ISgPl+ NSg/VB/J/C/P . K I/C/Dq NSg/VB/J . . > # > “ But I don’t want to go among mad people , ” Alice remarked . # . NSg/C/P ISg/#r+ VXB NSg/VB P NSg/VB/J P NSg/VB/J NPl/VB+ . . NPr+ VP/J . > # > “ Oh , you can’t help that , ” said the Cat : “ we’re all mad here . I’m mad . You’re # . NPr/VB . ISgPl+ VXB NSg/VB NSg/I/C/Ddem+ . . VP/J D NSg/VB/J+ . . K NSg/I/J/C/Dq NSg/VB/J J/R . K NSg/VB/J . K > mad . ” # NSg/VB/J . . > # > “ How do you know I’m mad ? ” said Alice . # . NSg/C VXB ISgPl+ VB K NSg/VB/J . . VP/J NPr+ . > # > “ You must be , ” said the Cat , “ or you wouldn’t have come here . ” # . ISgPl+ NSg/VXB NSg/VLXB . . VP/J D+ NSg/VB/J+ . . NPr/C ISgPl+ VXB NSg/VXB NSg/VBPp/P J/R . . > # > Alice didn’t think that proved it at all ; however , she went on “ And how do you # NPr+ VXPt NSg/VB NSg/I/C/Ddem+ VP/J NPr/ISg+ NSg/P NSg/I/J/C/Dq . C . ISg+ NSg/VPt J/P . VB/C NSg/C VXB ISgPl+ > know that you’re mad ? ” # VB NSg/I/C/Ddem K NSg/VB/J . . > # > “ To begin with , ” said the Cat , “ a dog’s not mad . You grant that ? ” # . P NSg/VB P . . VP/J D+ NSg/VB/J+ . . D/P NSg$ NSg/R/C NSg/VB/J . ISgPl+ NPr/VB+ NSg/I/C/Ddem+ . . > # > “ I suppose so , ” said Alice . # . ISg/#r+ VB NSg/I/J/R/C . . VP/J NPr+ . > # > “ Well , then , ” the Cat went on , “ you see , a dog growls when it’s angry , and wags # . NSg/VB/J/R . NSg/J/R/C . . D+ NSg/VB/J+ NSg/VPt J/P . . ISgPl+ NSg/VB . D/P+ NSg/VB/J+ NPl/V3 NSg/I/C K VB/J . VB/C NPl/V3 > its tail when it’s pleased . Now I growl when I’m pleased , and wag my tail when # ISg/D$+ NSg/VB/J+ NSg/I/C K VP/J . NSg/J/R/C ISg/#r+ NSg/VB NSg/I/C K VP/J . VB/C NSg/VB D$+ NSg/VB/J+ NSg/I/C > I’m angry . Therefore I’m mad . ” # K VB/J . R K NSg/VB/J . . > # > “ I call it purring , not growling , ” said Alice . # . ISg/#r+ NSg/VB NPr/ISg+ Nᴹ/Vg/J . NSg/R/C Nᴹ/Vg/J . . VP/J NPr+ . > # > “ Call it what you like , ” said the Cat . “ Do you play croquet with the Queen # . NSg/VB NPr/ISg+ NSg/I+ ISgPl+ NSg/VB/J/C/P . . VP/J D+ NSg/VB/J+ . . VXB ISgPl+ N🅪Sg/VB NSg/VB P D NPr/VB/J+ > to - day ? ” # P . NPr🅪Sg+ . . > # > “ I should like it very much , ” said Alice , “ but I haven’t been invited yet . ” # . ISg/#r+ VXB NSg/VB/J/C/P NPr/ISg+ J/R NSg/I/J/R/Dq . . VP/J NPr+ . . NSg/C/P ISg/#r+ VXB NSg/VLPp NSg/VP/J NSg/VB/C . . > # > “ You’ll see me there , ” said the Cat , and vanished . # . K NSg/VB NPr/ISg+ R . . VP/J D NSg/VB/J+ . VB/C VP/J . > # > Alice was not much surprised at this , she was getting so used to queer things # NPr+ VLPt NSg/R/C NSg/I/J/R/Dq VP/J NSg/P I/Ddem+ . ISg+ VLPt NSg/Vg NSg/I/J/R/C VP/J P NSg/VB/J+ NPl+ > happening . While she was looking at the place where it had been , it suddenly # N🅪Sg/Vg/J . NSg/VB/C/P ISg+ VLPt Nᴹ/Vg/J NSg/P D+ N🅪Sg/VB+ NSg/R/C NPr/ISg+ VP NSg/VLPp . NPr/ISg+ R > appeared again . # VP/J P . > # > “ By - the - bye , what became of the baby ? ” said the Cat . “ I’d nearly forgotten to # . NSg/P . D . NSg/J/P . NSg/I+ VPt P D+ NSg/VB/J+ . . VP/J D+ NSg/VB/J+ . . K R NSg/VPp/J P > ask . ” # NSg/VB . . > # > “ It turned into a pig , ” Alice quietly said , just as if it had come back in a # . NPr/ISg+ VP/J P D/P+ NSg/VB+ . . NPr+ R VP/J . J/R R/C/P NSg/C NPr/ISg+ VP NSg/VBPp/P NSg/VB/J NPr/J/R/P D/P+ > natural way . # NSg/J+ NSg/J+ . > # > “ I thought it would , ” said the Cat , and vanished again . # . ISg/#r+ N🅪Sg/VP NPr/ISg+ VXB . . VP/J D+ NSg/VB/J+ . VB/C VP/J P . > # > Alice waited a little , half expecting to see it again , but it did not appear , # NPr+ VP/J D/P NPr/I/J/Dq . N🅪Sg/J/P+ Nᴹ/Vg/J P NSg/VB NPr/ISg+ P . NSg/C/P NPr/ISg+ VXPt NSg/R/C VB . > and after a minute or two she walked on in the direction in which the March Hare # VB/C P D/P+ NSg/VB/J+ NPr/C NSg ISg+ VP/J J/P NPr/J/R/P D+ N🅪Sg+ NPr/J/R/P I/C+ D+ NPr/VB+ NSg/VB/J+ > was said to live . “ I’ve seen hatters before , ” she said to herself ; “ the March # VLPt VP/J P VB/J . . K NSg/VPp NPl/V3 C/P . . ISg+ VP/J P ISg+ . . D NPr/VB+ > Hare will be much the most interesting , and perhaps as this is May it won’t be # NSg/VB/J+ NPr/VXB NSg/VLXB NSg/I/J/R/Dq D NSg/I/J/R/Dq Vg/J . VB/C NSg/R R/C/P I/Ddem+ VL3 NPr/VXB NPr/ISg+ VXB NSg/VLXB > raving mad — at least not so mad as it was in March . ” As she said this , she looked # Nᴹ/Vg/J NSg/VB/J . NSg/P NSg/J/Dq NSg/R/C NSg/I/J/R/C NSg/VB/J R/C/P NPr/ISg+ VLPt NPr/J/R/P NPr/VB+ . . R/C/P ISg+ VP/J I/Ddem+ . ISg+ VP/J > up , and there was the Cat again , sitting on a branch of a tree . # NSg/VB/J/P . VB/C R+ VLPt D+ NSg/VB/J+ P . NSg/Vg/J J/P D/P NPr/VB P D/P+ NSg/VB+ . > # > “ Did you say pig , or fig ? ” said the Cat . # . VXPt ISgPl+ NSg/VB NSg/VB+ . NPr/C NSg/VB . . VP/J D+ NSg/VB/J+ . > # > “ I said pig , ” replied Alice ; “ and I wish you wouldn’t keep appearing and # . ISg/#r+ VP/J NSg/VB+ . . VP/J NPr+ . . VB/C ISg/#r+ NSg/VB ISgPl+ VXB NSg/VB Nᴹ/Vg/J VB/C > vanishing so suddenly : you make one quite giddy . ” # Nᴹ/Vg/J NSg/I/J/R/C R . ISgPl+ NSg/VB NSg/I/J R NSg/VB/J . . > # > “ All right , ” said the Cat ; and this time it vanished quite slowly , beginning # . NSg/I/J/C/Dq NPr/VB/J . . VP/J D+ NSg/VB/J+ . VB/C I/Ddem+ N🅪Sg/VB/J+ NPr/ISg+ VP/J R R . NSg/Vg/J+ > with the end of the tail , and ending with the grin , which remained some time # P D NSg/VB P D+ NSg/VB/J+ . VB/C Nᴹ/Vg/J P D+ NSg/VB+ . I/C+ VP/J I/J/R/Dq+ N🅪Sg/VB/J+ > after the rest of it had gone . # P D NSg/VB P NPr/ISg+ VP VPp/J/P . > # > “ Well ! I’ve often seen a cat without a grin , ” thought Alice ; “ but a grin without # . NSg/VB/J/R . K R NSg/VPp D/P NSg/VB/J+ C/P D/P NSg/VB+ . . N🅪Sg/VP NPr+ . . NSg/C/P D/P NSg/VB+ C/P > a cat ! It’s the most curious thing I ever saw in my life ! ” # D/P NSg/VB/J+ . K D NSg/I/J/R/Dq J NSg+ ISg/#r+ J/R NSg/VPt NPr/J/R/P D$+ N🅪Sg/VB+ . . > # > She had not gone much farther before she came in sight of the house of the March # ISg+ VP NSg/R/C VPp/J/P NSg/I/J/R/Dq VB/JC C/P ISg+ NSg/VPt/P NPr/J/R/P N🅪Sg/VB P D NPr/VB P D+ NPr/VB+ > Hare : she thought it must be the right house , because the chimneys were shaped # NSg/VB/J+ . ISg+ N🅪Sg/VP NPr/ISg+ NSg/VXB NSg/VLXB D+ NPr/VB/J+ NPr/VB+ . C/P D+ NPl/V3+ NSg/VLPt VP/J > like ears and the roof was thatched with fur . It was so large a house , that she # NSg/VB/J/C/P NPl/V3 VB/C D+ NSg/VB+ VLPt VP/J P N🅪Sg/VB/C/P+ . NPr/ISg+ VLPt NSg/I/J/R/C NSg/J D/P NPr/VB+ . NSg/I/C/Ddem ISg+ > did not like to go nearer till she had nibbled some more of the lefthand bit of # VXPt NSg/R/C NSg/VB/J/C/P P NSg/VB/J NSg/JC NSg/VB/C/P ISg+ VP VP/J I/J/R/Dq NPr/I/J/R/Dq P D ? NSg/VPt+ P > mushroom , and raised herself to about two feet high : even then she walked up # N🅪Sg/VB/J . VB/C VP/J ISg+ P J/P NSg NPl+ NSg/VB/J/R . NSg/VB/J/R NSg/J/R/C ISg+ VP/J NSg/VB/J/P > towards it rather timidly , saying to herself “ Suppose it should be raving mad # P NPr/ISg+ NPr/VB/J/R R . N🅪Sg/Vg/J P ISg+ . VB NPr/ISg+ VXB NSg/VLXB Nᴹ/Vg/J NSg/VB/J > after all ! I almost wish I’d gone to see the Hatter instead ! ” # P NSg/I/J/C/Dq . ISg/#r+ R NSg/VB K VPp/J/P P NSg/VB D NSg/VB R . . > # > CHAPTER VII : A Mad Tea - Party # HeadingStart NSg/VB+ NSg/#r . D/P NSg/VB/J N🅪Sg/VB+ . NSg/VB/J+ > # > There was a table set out under a tree in front of the house , and the March Hare # R+ VLPt D/P+ NSg/VB+ NPr/VBP/J NSg/VB/J/R/P NSg/J/P D/P NSg/VB+ NPr/J/R/P NSg/VB/J P D+ NPr/VB+ . VB/C D+ NPr/VB+ NSg/VB/J+ > and the Hatter were having tea at it : a Dormouse was sitting between them , fast # VB/C D NSg/VB NSg/VLPt Nᴹ/Vg/J N🅪Sg/VB+ NSg/P NPr/ISg+ . D/P NSg VLPt NSg/Vg/J NSg/P NSg/IPl+ . NSg/VB/J/R > asleep , and the other two were using it as a cushion , resting their elbows on # J . VB/C D NSg/VB/J NSg NSg/VLPt+ Nᴹ/Vg/J NPr/ISg+ R/C/P D/P NSg/VB+ . Nᴹ/Vg/J+ D$+ NPl/V3+ J/P > it , and talking over its head . “ Very uncomfortable for the Dormouse , ” thought # NPr/ISg+ . VB/C Nᴹ/Vg/J NSg/J/P ISg/D$+ NPr/VB/J+ . . J/R J R/C/P D NSg . . N🅪Sg/VP > Alice ; “ only , as it’s asleep , I suppose it doesn’t mind . ” # NPr+ . . J/R/C . R/C/P K J . ISg/#r+ VB NPr/ISg+ VX3 NSg/VB+ . . > # > The table was a large one , but the three were all crowded together at one corner # D+ NSg/VB+ VLPt D/P NSg/J NSg/I/J . NSg/C/P D+ NSg+ NSg/VLPt+ NSg/I/J/C/Dq VP/J J NSg/P NSg/I/J NSg/VB > of it : “ No room ! No room ! ” they cried out when they saw Alice coming . “ There’s # P NPr/ISg+ . . NSg/Dq/P+ N🅪Sg/VB/J+ . NSg/Dq/P+ N🅪Sg/VB/J+ . . IPl+ VP/J NSg/VB/J/R/P NSg/I/C IPl+ NSg/VPt NPr+ Nᴹ/Vg/J . . K > plenty of room ! ” said Alice indignantly , and she sat down in a large arm - chair # NSg/I/J P N🅪Sg/VB/J+ . . VP/J NPr+ R . VB/C ISg+ NSg/VP/J N🅪Sg/VB/J/P NPr/J/R/P D/P NSg/J NSg/VB/J+ . NSg/VB+ > at one end of the table . # NSg/P NSg/I/J NSg/VB P D NSg/VB+ . > # > “ Have some wine , ” the March Hare said in an encouraging tone . # . NSg/VXB I/J/R/Dq+ N🅪Sg/VB+ . . D+ NPr/VB+ NSg/VB/J+ VP/J NPr/J/R/P D/P+ Nᴹ/Vg/J N🅪Sg/I/VB+ . > # > Alice looked all round the table , but there was nothing on it but tea . “ I don’t # NPr+ VP/J NSg/I/J/C/Dq NSg/VB/J/P D+ NSg/VB+ . NSg/C/P R+ VLPt NSg/I/J+ J/P NPr/ISg+ NSg/C/P N🅪Sg/VB+ . . ISg/#r+ VXB > see any wine , ” she remarked . # NSg/VB I/R/Dq N🅪Sg/VB+ . . ISg+ VP/J . > # > “ There isn’t any , ” said the March Hare . # . R+ NSg/VX3 I/R/Dq . . VP/J D NPr/VB+ NSg/VB/J+ . > # > “ Then it wasn’t very civil of you to offer it , ” said Alice angrily . # . NSg/J/R/C NPr/ISg+ VPt J/R J P ISgPl+ P NSg/VB/JC NPr/ISg+ . . VP/J NPr+ R . > # > “ It wasn’t very civil of you to sit down without being invited , ” said the March # . NPr/ISg+ VPt J/R J P ISgPl+ P NSg/VB N🅪Sg/VB/J/P C/P N🅪Sg/VLg/J/C NSg/VP/J . . VP/J D NPr/VB+ > Hare . # NSg/VB/J+ . > # > “ I didn’t know it was your table , ” said Alice ; “ it’s laid for a great many more # . ISg/#r+ VXPt VB NPr/ISg+ VLPt D$+ NSg/VB+ . . VP/J NPr+ . . K VP/J R/C/P D/P NSg/J NSg/I/J/Dq NPr/I/J/R/Dq > than three . ” # C/P NSg . . > # > “ Your hair wants cutting , ” said the Hatter . He had been looking at Alice for # . D$+ N🅪Sg/VB+ NPl/V3 NSg/Vg/J . . VP/J D NSg/VB . NPr/ISg+ VP NSg/VLPp Nᴹ/Vg/J NSg/P NPr+ R/C/P > some time with great curiosity , and this was his first speech . # I/J/R/Dq N🅪Sg/VB/J P NSg/J+ NSg+ . VB/C I/Ddem+ VLPt ISg/D$+ NSg/J+ N🅪Sg/VB+ . > # > “ You should learn not to make personal remarks , ” Alice said with some severity ; # . ISgPl+ VXB NSg/VB NSg/R/C P NSg/VB NSg/J+ NPl/V3+ . . NPr+ VP/J P I/J/R/Dq NSg . > “ it’s very rude . ” # . K J/R J . . > # > The Hatter opened his eyes very wide on hearing this ; but all he said was , “ Why # D NSg/VB VP/J ISg/D$+ NPl/V3+ J/R NSg/J J/P Nᴹ/Vg/J+ I/Ddem+ . NSg/C/P NSg/I/J/C/Dq NPr/ISg+ VP/J VLPt . . NSg/VB > is a raven like a writing - desk ? ” # VL3 D/P NSg/VB/J NSg/VB/J/C/P D/P Nᴹ/Vg/J+ . NSg/VB+ . . > # > “ Come , we shall have some fun now ! ” thought Alice . “ I’m glad they’ve begun # . NSg/VBPp/P . IPl+ VXB NSg/VXB I/J/R/Dq Nᴹ/VB/J NSg/J/R/C . . N🅪Sg/VP NPr+ . . K NSg/VB/J K VPp > asking riddles . — I believe I can guess that , ” she added aloud . # Nᴹ/Vg/J NPl/V3 . . ISg/#r+ VB ISg/#r+ NPr/VXB NSg/VB NSg/I/C/Ddem+ . . ISg+ VP/J J . > # > “ Do you mean that you think you can find out the answer to it ? ” said the March # . VXB ISgPl+ NSg/VB/J NSg/I/C/Ddem ISgPl+ NSg/VB ISgPl+ NPr/VXB NSg/VB NSg/VB/J/R/P D+ NSg/VB+ P NPr/ISg+ . . VP/J D+ NPr/VB+ > Hare . # NSg/VB/J+ . > # > “ Exactly so , ” said Alice . # . R NSg/I/J/R/C . . VP/J NPr+ . > # > “ Then you should say what you mean , ” the March Hare went on . # . NSg/J/R/C ISgPl+ VXB NSg/VB NSg/I+ ISgPl+ NSg/VB/J . . D+ NPr/VB+ NSg/VB/J+ NSg/VPt J/P . > # > “ I do , ” Alice hastily replied ; “ at least — at least I mean what I say — that’s the # . ISg/#r+ VXB . . NPr+ R VP/J . . NSg/P NSg/J/Dq . NSg/P NSg/J/Dq ISg/#r+ NSg/VB/J NSg/I+ ISg/#r+ NSg/VB . NSg$ D+ > same thing , you know . ” # I/J NSg+ . ISgPl+ VB . . > # > “ Not the same thing a bit ! ” said the Hatter . “ You might just as well say that ‘ I # . NSg/R/C D+ I/J+ NSg+ D/P+ NSg/VPt+ . . VP/J D NSg/VB . . ISgPl+ Nᴹ/VXB/J J/R R/C/P NSg/VB/J/R NSg/VB NSg/I/C/Ddem+ Unlintable ISg/#r+ > see what I eat ’ is the same thing as ‘ I eat what I see ’ ! ” # NSg/VB NSg/I+ ISg/#r+ VB . VL3 D+ I/J+ NSg+ R/C/P Unlintable ISg/#r+ VB NSg/I+ ISg/#r+ NSg/VB . . . > # > “ You might just as well say , ” added the March Hare , “ that ‘ I like what I get ’ is # . ISgPl+ Nᴹ/VXB/J J/R R/C/P NSg/VB/J/R NSg/VB . . VP/J D+ NPr/VB+ NSg/VB/J+ . . NSg/I/C/Ddem+ Unlintable ISg/#r+ NSg/VB/J/C/P NSg/I+ ISg/#r+ NSg/VB . VL3 > the same thing as ‘ I get what I like ’ ! ” # D+ I/J+ NSg+ R/C/P Unlintable ISg/#r+ NSg/VB NSg/I+ ISg/#r+ NSg/VB/J/C/P . . . > # > “ You might just as well say , ” added the Dormouse , who seemed to be talking in # . ISgPl+ Nᴹ/VXB/J J/R R/C/P NSg/VB/J/R NSg/VB . . VP/J D NSg . NPr/I+ VP/J P NSg/VLXB Nᴹ/Vg/J NPr/J/R/P > his sleep , “ that ‘ I breathe when I sleep ’ is the same thing as ‘ I sleep when I # ISg/D$+ N🅪Sg/VB+ . . NSg/I/C/Ddem+ Unlintable ISg/#r+ VB NSg/I/C ISg/#r+ N🅪Sg/VB . VL3 D I/J NSg+ R/C/P Unlintable ISg/#r+ N🅪Sg/VB NSg/I/C ISg/#r+ > breathe ’ ! ” # VB . . . > # > “ It is the same thing with you , ” said the Hatter , and here the conversation # . NPr/ISg+ VL3 D I/J NSg P ISgPl+ . . VP/J D NSg/VB . VB/C J/R D N🅪Sg/VB+ > dropped , and the party sat silent for a minute , while Alice thought over all she # VP/J . VB/C D NSg/VB/J+ NSg/VP/J NSg/J R/C/P D/P NSg/VB/J+ . NSg/VB/C/P NPr+ N🅪Sg/VP NSg/J/P NSg/I/J/C/Dq ISg+ > could remember about ravens and writing - desks , which wasn’t much . # NSg/VXB NSg/VB J/P NPl/V3 VB/C Nᴹ/Vg/J . NPl/V3+ . I/C+ VPt NSg/I/J/R/Dq . > # > The Hatter was the first to break the silence . “ What day of the month is it ? ” he # D NSg/VB VLPt D NSg/J+ P NSg/VB D NSg/VB+ . . NSg/I+ NPr🅪Sg P D+ NSg/J+ VL3 NPr/ISg+ . . NPr/ISg+ > said , turning to Alice : he had taken his watch out of his pocket , and was # VP/J . Nᴹ/Vg/J P NPr+ . NPr/ISg+ VP VPp/J ISg/D$+ NSg/VB NSg/VB/J/R/P P ISg/D$+ NSg/VB/J+ . VB/C VLPt > looking at it uneasily , shaking it every now and then , and holding it to his # Nᴹ/Vg/J NSg/P NPr/ISg+ R . Nᴹ/Vg/J NPr/ISg+ Dq NSg/J/R/C VB/C NSg/J/R/C . VB/C Nᴹ/Vg/J NPr/ISg+ P ISg/D$+ > ear . # NSg/VB/J+ . > # > Alice considered a little , and then said “ The fourth . ” # NPr+ VP/J D/P NPr/I/J/Dq . VB/C NSg/J/R/C VP/J . D NPr/VB/J . . > # > “ Two days wrong ! ” sighed the Hatter . “ I told you butter wouldn’t suit the # . NSg+ NPl+ NSg/VB/J/R . . VP/J D NSg/VB . . ISg/#r+ VP ISgPl+ NSg/VB+ VXB NSg/VB+ D > works ! ” he added looking angrily at the March Hare . # NPl/V3+ . . NPr/ISg+ VP/J Nᴹ/Vg/J R NSg/P D+ NPr/VB+ NSg/VB/J+ . > # > “ It was the best butter , ” the March Hare meekly replied . # . NPr/ISg+ VLPt D NPr/VXB/JS NSg/VB . . D+ NPr/VB+ NSg/VB/J+ R VP/J . > # > “ Yes , but some crumbs must have got in as well , ” the Hatter grumbled : “ you # . NPl/VB . NSg/C/P I/J/R/Dq+ NPl/V3+ NSg/VXB NSg/VXB VP NPr/J/R/P R/C/P NSg/VB/J/R . . D NSg/VB VP/J . . ISgPl+ > shouldn’t have put it in with the bread - knife . ” # VXB NSg/VXB NSg/VBP NPr/ISg+ NPr/J/R/P P D N🅪Sg/VB+ . NSg/VB+ . . > # > The March Hare took the watch and looked at it gloomily : then he dipped it into # D+ NPr/VB+ NSg/VB/J+ VPt D NSg/VB VB/C VP/J NSg/P NPr/ISg+ R . NSg/J/R/C NPr/ISg+ VP/J NPr/ISg+ P > his cup of tea , and looked at it again : but he could think of nothing better to # ISg/D$+ NSg/VB P N🅪Sg/VB+ . VB/C VP/J NSg/P NPr/ISg+ P . NSg/C/P NPr/ISg+ NSg/VXB NSg/VB P NSg/I/J+ NSg/VXB/JC P > say than his first remark , “ It was the best butter , you know . ” # NSg/VB C/P ISg/D$+ NSg/J NSg/VB+ . . NPr/ISg+ VLPt D NPr/VXB/JS NSg/VB+ . ISgPl+ VB . . > # > Alice had been looking over his shoulder with some curiosity . “ What a funny # NPr+ VP NSg/VLPp Nᴹ/Vg/J NSg/J/P ISg/D$+ NSg/VB+ P I/J/R/Dq+ NSg+ . . NSg/I+ D/P+ NSg/J+ > watch ! ” she remarked . “ It tells the day of the month , and doesn’t tell what # NSg/VB+ . . ISg+ VP/J . . NPr/ISg+ NPl/V3 D NPr🅪Sg P D+ NSg/J+ . VB/C VX3 NPr/VB NSg/I+ > o’clock it is ! ” # R NPr/ISg+ VL3 . . > # > “ Why should it ? ” muttered the Hatter . “ Does your watch tell you what year it # . NSg/VB VXB NPr/ISg+ . . VP/J D NSg/VB . . NPl/VX3 D$+ NSg/VB NPr/VB ISgPl+ NSg/I+ NSg+ NPr/ISg+ > is ? ” # VL3 . . > # > “ Of course not , ” Alice replied very readily : “ but that’s because it stays the # . P NSg/VB+ NSg/R/C . . NPr+ VP/J J/R R . . NSg/C/P NSg$ C/P NPr/ISg+ NPl/V3 D > same year for such a long time together . ” # I/J NSg+ R/C/P NSg/I D/P NPr/VB/J N🅪Sg/VB/J+ J . . > # > “ Which is just the case with mine , ” said the Hatter . # . I/C+ VL3 J/R D NPr🅪Sg/VB P NSg/I/VB+ . . VP/J D NSg/VB . > # > Alice felt dreadfully puzzled , The Hatter’s remark seemed to have no sort of # NPr+ N🅪Sg/VP/J R VP/J . D NSg$ NSg/VB+ VP/J P NSg/VXB NSg/Dq/P NSg/VB P > meaning in it , and yet it was certainly English . “ I don’t quite understand you , ” # N🅪Sg/Vg/J+ NPr/J/R/P NPr/ISg+ . VB/C NSg/VB/C NPr/ISg+ VLPt R NPr🅪Sg/VB/J+ . . ISg/#r+ VXB R VB ISgPl+ . . > she said , as politely as she could . # ISg+ VP/J . R/C/P R R/C/P ISg+ NSg/VXB . > # > “ The Dormouse is asleep again , ” said the Hatter , and he poured a little hot tea # . D NSg VL3 J P . . VP/J D NSg/VB . VB/C NPr/ISg+ VP/J D/P NPr/I/J/Dq NSg/VB/J N🅪Sg/VB+ > upon its nose . # P ISg/D$+ NSg/VB+ . > # > The Dormouse shook its head impatiently , and said , without opening its eyes , “ Of # D NSg NSg/VPt/J ISg/D$+ NPr/VB/J+ R . VB/C VP/J . C/P Nᴹ/Vg/J ISg/D$+ NPl/V3+ . . P > course , of course ; just what I was going to remark myself . ” # NSg/VB+ . P NSg/VB+ . J/R NSg/I+ ISg/#r+ VLPt Nᴹ/Vg/J P NSg/VB ISg+ . . > # > “ Have you guessed the riddle yet ? ” the Hatter said , turning to Alice again . # . NSg/VXB ISgPl+ VP/J D+ NPr/VB+ NSg/VB/C . . D NSg/VB VP/J . Nᴹ/Vg/J P NPr+ P . > # > “ No , I give it up , ” Alice replied : “ what’s the answer ? ” # . NSg/Dq/P . ISg/#r+ NSg/VB NPr/ISg+ NSg/VB/J/P . . NPr+ VP/J . . K D+ NSg/VB+ . . > # > “ I haven’t the slightest idea , ” said the Hatter . # . ISg/#r+ VXB D+ JS NSg+ . . VP/J D NSg/VB . > # > “ Nor I , ” said the March Hare . # . NSg/C ISg/#r+ . . VP/J D+ NPr/VB+ NSg/VB/J+ . > # > Alice sighed wearily . “ I think you might do something better with the time , ” she # NPr+ VP/J R . . ISg/#r+ NSg/VB ISgPl+ Nᴹ/VXB/J VXB NSg/I/J+ NSg/VXB/JC P D+ N🅪Sg/VB/J+ . . ISg+ > said , “ than waste it in asking riddles that have no answers . ” # VP/J . . C/P NSg/VB/J+ NPr/ISg+ NPr/J/R/P Nᴹ/Vg/J NPl/V3 NSg/I/C/Ddem+ NSg/VXB NSg/Dq/P NPl/V3+ . . > # > “ If you knew Time as well as I do , ” said the Hatter , “ you wouldn’t talk about # . NSg/C ISgPl+ VPt N🅪Sg/VB/J+ R/C/P NSg/VB/J/R R/C/P ISg/#r+ VXB . . VP/J D NSg/VB . . ISgPl+ VXB N🅪Sg/VB J/P > wasting it . It’s him . ” # Nᴹ/Vg/J NPr/ISg+ . K ISg+ . . > # > “ I don’t know what you mean , ” said Alice . # . ISg/#r+ VXB VB NSg/I+ ISgPl+ NSg/VB/J . . VP/J NPr+ . > # > “ Of course you don’t ! ” the Hatter said , tossing his head contemptuously . “ I dare # . P NSg/VB+ ISgPl+ VXB . . D NSg/VB VP/J . Nᴹ/Vg/J ISg/D$+ NPr/VB/J+ R . . ISg/#r+ NPr/VXB > say you never even spoke to Time ! ” # NSg/VB ISgPl+ R NSg/VB/J/R NSg/VPt P N🅪Sg/VB/J . . > # > “ Perhaps not , ” Alice cautiously replied : “ but I know I have to beat time when I # . NSg/R NSg/R/C . . NPr+ R VP/J . . NSg/C/P ISg/#r+ VB ISg/#r+ NSg/VXB P N🅪Sg/VB/J N🅪Sg/VB/J+ NSg/I/C ISg/#r+ > learn music . ” # NSg/VB N🅪Sg/VB/J+ . . > # > “ Ah ! that accounts for it , ” said the Hatter . “ He won’t stand beating . Now , if # . NSg/I/VB . NSg/I/C/Ddem+ NPl/V3+ R/C/P NPr/ISg+ . . VP/J D NSg/VB . . NPr/ISg+ VXB NSg/VB Nᴹ/Vg/J . NSg/J/R/C . NSg/C > you only kept on good terms with him , he’d do almost anything you liked with the # ISgPl+ J/R/C VP J/P NPr/VB/J NPl/V3+ P ISg+ . K VXB R NSg/I/VB+ ISgPl+ VP/J P D > clock . For instance , suppose it were nine o’clock in the morning , just time to # NSg/VB+ . R/C/P NSg/VB+ . VB NPr/ISg+ NSg/VLPt NSg R NPr/J/R/P D+ N🅪Sg/Vg/J+ . J/R N🅪Sg/VB/J+ P > begin lessons : you’d only have to whisper a hint to Time , and round goes the # NSg/VB NPl/V3+ . K J/R/C NSg/VXB P NSg/VB D/P NSg/VB+ P N🅪Sg/VB/J . VB/C NSg/VB/J/P NPl/V3 D > clock in a twinkling ! Half - past one , time for dinner ! ” # NSg/VB+ NPr/J/R/P D/P N🅪Sg/Vg/J . N🅪Sg/J/P+ . NSg/VB/J/P NSg/I/J . N🅪Sg/VB/J R/C/P N🅪Sg/VB+ . . > # > ( “ I only wish it was , ” the March Hare said to itself in a whisper . ) # . . ISg/#r+ J/R/C NSg/VB NPr/ISg+ VLPt . . D+ NPr/VB+ NSg/VB/J+ VP/J P ISg+ NPr/J/R/P D/P+ NSg/VB+ . . > # > “ That would be grand , certainly , ” said Alice thoughtfully : “ but then — I shouldn’t # . NSg/I/C/Ddem+ VXB NSg/VLXB NSg/J . R . . VP/J NPr+ R . . NSg/C/P NSg/J/R/C . ISg/#r+ VXB > be hungry for it , you know . ” # NSg/VLXB J R/C/P NPr/ISg+ . ISgPl+ VB . . > # > “ Not at first , perhaps , ” said the Hatter : “ but you could keep it to half - past # . NSg/R/C NSg/P NSg/J . NSg/R . . VP/J D NSg/VB . . NSg/C/P ISgPl+ NSg/VXB NSg/VB NPr/ISg+ P N🅪Sg/J/P . NSg/VB/J/P > one as long as you liked . ” # NSg/I/J R/C/P NPr/VB/J R/C/P ISgPl+ VP/J . . > # > “ Is that the way you manage ? ” Alice asked . # . VL3 NSg/I/C/Ddem D+ NSg/J+ ISgPl+ NSg/VB . . NPr+ VP/J . > # > The Hatter shook his head mournfully . “ Not I ! ” he replied . “ We quarrelled last # D NSg/VB NSg/VPt/J ISg/D$+ NPr/VB/J+ R . . NSg/R/C ISg/#r+ . . NPr/ISg+ VP/J . . IPl+ VP/Comm NSg/VB/J > March — just before he went mad , you know — ” ( pointing with his tea spoon at the # NPr/VB+ . J/R C/P NPr/ISg+ NSg/VPt NSg/VB/J . ISgPl+ VB . . . Nᴹ/Vg/J P ISg/D$+ N🅪Sg/VB+ NSg/VB+ NSg/P D > March Hare , ) “ — it was at the great concert given by the Queen of Hearts , and I # NPr/VB+ NSg/VB/J+ . . . . NPr/ISg+ VLPt NSg/P D NSg/J NSg/VB+ NSg/VPp/J/P NSg/P D NPr/VB/J P NPl/V3+ . VB/C ISg/#r+ > had to sing # VP P NSg/VB/J > # > ‘ Twinkle , twinkle , little bat ! How I wonder what you’re at ! ’ # Unlintable NSg/VB . NSg/VB . NPr/I/J/Dq NSg/VB+ . NSg/C ISg/#r+ N🅪Sg/VB NSg/I+ K NSg/P . . > # > You know the song , perhaps ? ” # ISgPl+ VB D+ N🅪Sg+ . NSg/R . . > # > “ I’ve heard something like it , ” said Alice . # . K VP/J NSg/I/J+ NSg/VB/J/C/P NPr/ISg+ . . VP/J NPr+ . > # > “ It goes on , you know , ” the Hatter continued , “ in this way : — # . NPr/ISg+ NPl/V3 J/P . ISgPl+ VB . . D NSg/VB VP/J . . NPr/J/R/P I/Ddem NSg/J+ . . > # > ‘ Up above the world you fly , Like a tea - tray in the sky . Twinkle , twinkle — ’ ” # Unlintable NSg/VB/J/P NSg/J/P D+ NSg/VB+ ISgPl+ NSg/VB/J . NSg/VB/J/C/P D/P N🅪Sg/VB+ . NSg/VB NPr/J/R/P D+ N🅪Sg/VB+ . NSg/VB . NSg/VB . . . > # > Here the Dormouse shook itself , and began singing in its sleep “ Twinkle , # J/R D NSg NSg/VPt/J ISg+ . VB/C VPt Nᴹ/Vg/J NPr/J/R/P ISg/D$+ N🅪Sg/VB+ . NSg/VB . > twinkle , twinkle , twinkle — ” and went on so long that they had to pinch it to # NSg/VB . NSg/VB . NSg/VB . . VB/C NSg/VPt J/P NSg/I/J/R/C NPr/VB/J NSg/I/C/Ddem IPl+ VP P NSg/VB NPr/ISg+ P > make it stop . # NSg/VB NPr/ISg+ NSg/VB . > # > “ Well , I’d hardly finished the first verse , ” said the Hatter , “ when the Queen # . NSg/VB/J/R . K R VP/J D NSg/J NSg/VB . . VP/J D NSg/VB . . NSg/I/C D NPr/VB/J+ > jumped up and bawled out , ‘ He’s murdering the time ! Off with his head ! ’ ” # VP/J NSg/VB/J/P VB/C VP/J NSg/VB/J/R/P . Unlintable NPr$ Nᴹ/Vg/J+ D N🅪Sg/VB/J+ . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . . . > # > “ How dreadfully savage ! ” exclaimed Alice . # . NSg/C R NPr/VB/J+ . . VP/J NPr+ . > # > “ And ever since that , ” the Hatter went on in a mournful tone , “ he won’t do a # . VB/C J/R C/P NSg/I/C/Ddem+ . . D NSg/VB NSg/VPt J/P NPr/J/R/P D/P J N🅪Sg/I/VB+ . . NPr/ISg+ VXB VXB D/P > thing I ask ! It’s always six o’clock now . ” # NSg+ ISg/#r+ NSg/VB . K R NSg R NSg/J/R/C . . > # > A bright idea came into Alice’s head . “ Is that the reason so many tea - things are # D/P+ NPr/VB/J+ NSg+ NSg/VPt/P P NPr$ NPr/VB/J+ . . VL3 NSg/I/C/Ddem D+ N🅪Sg/VB+ NSg/I/J/R/C NSg/I/J/Dq N🅪Sg/VB+ . NPl+ VLB > put out here ? ” she asked . # NSg/VBP NSg/VB/J/R/P J/R . . ISg+ VP/J . > # > “ Yes , that’s it , ” said the Hatter with a sigh : “ it’s always tea - time , and we’ve # . NPl/VB . NSg$ NPr/ISg+ . . VP/J D NSg/VB P D/P NSg/VB . . K R N🅪Sg/VB+ . N🅪Sg/VB/J+ . VB/C K > no time to wash the things between whiles . ” # NSg/Dq/P N🅪Sg/VB/J+ P NPr/VB D NPl+ NSg/P NPl/V3 . . > # > “ Then you keep moving round , I suppose ? ” said Alice . # . NSg/J/R/C ISgPl+ NSg/VB Nᴹ/Vg/J NSg/VB/J/P . ISg/#r+ VB . . VP/J NPr+ . > # > “ Exactly so , ” said the Hatter : “ as the things get used up . ” # . R NSg/I/J/R/C . . VP/J D NSg/VB . . R/C/P D NPl+ NSg/VB VP/J NSg/VB/J/P . . > # > “ But what happens when you come to the beginning again ? ” Alice ventured to ask . # . NSg/C/P NSg/I+ V3 NSg/I/C ISgPl+ NSg/VBPp/P P D+ NSg/Vg/J+ P . . NPr+ VP/J P NSg/VB . > # > “ Suppose we change the subject , ” the March Hare interrupted , yawning . “ I’m # . VB IPl+ N🅪Sg/VB D+ NSg/VB/J+ . . D+ NPr/VB+ NSg/VB/J+ VP/J . Nᴹ/Vg/J . . K > getting tired of this . I vote the young lady tells us a story . ” # NSg/Vg VP/J P I/Ddem+ . ISg/#r+ NSg/VB D+ NPr/VB/J+ NPr/VB+ NPl/V3 NPr/IPl+ D/P+ NSg/VB+ . . > # > “ I’m afraid I don’t know one , ” said Alice , rather alarmed at the proposal . # . K J ISg/#r+ VXB VB NSg/I/J . . VP/J NPr+ . NPr/VB/J/R VP/J NSg/P D NSg+ . > # > “ Then the Dormouse shall ! ” they both cried . “ Wake up , Dormouse ! ” And they # . NSg/J/R/C D NSg VXB . . IPl+ I/C/Dq VP/J . . NPr/VB NSg/VB/J/P . NSg . . VB/C IPl+ > pinched it on both sides at once . # VP/J NPr/ISg+ J/P I/C/Dq NPl/V3+ NSg/P NSg/C . > # > The Dormouse slowly opened his eyes . “ I wasn’t asleep , ” he said in a hoarse , # D NSg R VP/J ISg/D$+ NPl/V3+ . . ISg/#r+ VPt J . . NPr/ISg+ VP/J NPr/J/R/P D/P NSg/VB/J . > feeble voice : “ I heard every word you fellows were saying . ” # VB/J NSg/VB+ . . ISg/#r+ VP/J Dq NSg/VB+ ISgPl+ NPl+ NSg/VLPt N🅪Sg/Vg/J . . > # > “ Tell us a story ! ” said the March Hare . # . NPr/VB NPr/IPl+ D/P+ NSg/VB+ . . VP/J D+ NPr/VB+ NSg/VB/J+ . > # > “ Yes , please do ! ” pleaded Alice . # . NPl/VB . VB VXB . . VP/J NPr+ . > # > “ And be quick about it , ” added the Hatter , “ or you’ll be asleep again before # . VB/C NSg/VLXB NSg/VB/J J/P NPr/ISg+ . . VP/J D NSg/VB . . NPr/C K NSg/VLXB J P C/P > it’s done . ” # K NSg/VPp/J . . > # > “ Once upon a time there were three little sisters , ” the Dormouse began in a # . NSg/C P D/P+ N🅪Sg/VB/J+ R+ NSg/VLPt NSg+ NPr/I/J/Dq+ NPl/V3+ . . D NSg VPt NPr/J/R/P D/P > great hurry ; “ and their names were Elsie , Lacie , and Tillie ; and they lived at # NSg/J NSg/VB+ . . VB/C D$+ NPl/V3+ NSg/VLPt NPr . ? . VB/C ? . VB/C IPl+ VP/J NSg/P > the bottom of a well — ” # D NSg/VB/J P D/P NSg/VB/J/R+ . . > # > “ What did they live on ? ” said Alice , who always took a great interest in # . NSg/I+ VXPt IPl+ VB/J J/P . . VP/J NPr+ . NPr/I+ R VPt D/P NSg/J N🅪Sg/VB NPr/J/R/P > questions of eating and drinking . # NPl/V3 P Nᴹ/Vg/J+ VB/C Nᴹ/Vg/J . > # > “ They lived on treacle , ” said the Dormouse , after thinking a minute or two . # . IPl+ VP/J J/P Nᴹ/VB . . VP/J D NSg . P Nᴹ/Vg/J D/P NSg/VB/J+ NPr/C NSg . > # > “ They couldn’t have done that , you know , ” Alice gently remarked ; “ they’d have # . IPl+ VXB NSg/VXB NSg/VPp/J NSg/I/C/Ddem+ . ISgPl+ VB . . NPr+ R VP/J . . K NSg/VXB > been ill . ” # NSg/VLPp NSg/VB/J . . > # > “ So they were , ” said the Dormouse ; “ very ill . ” # . NSg/I/J/R/C IPl+ NSg/VLPt . . VP/J D NSg . . J/R NSg/VB/J . . > # > Alice tried to fancy to herself what such an extraordinary way of living would # NPr+ VP/J P NSg/VB/J P ISg+ NSg/I+ NSg/I D/P NSg/J NSg/J P Nᴹ/Vg/J VXB > be like , but it puzzled her too much , so she went on : “ But why did they live at # NSg/VLXB NSg/VB/J/C/P . NSg/C/P NPr/ISg+ VP/J ISg/D$+ R NSg/I/J/R/Dq . NSg/I/J/R/C ISg+ NSg/VPt J/P . . NSg/C/P NSg/VB VXPt IPl+ VB/J NSg/P > the bottom of a well ? ” # D NSg/VB/J P D/P+ NSg/VB/J/R+ . . > # > “ Take some more tea , ” the March Hare said to Alice , very earnestly . # . NSg/VB I/J/R/Dq+ NPr/I/J/R/Dq+ N🅪Sg/VB+ . . D+ NPr/VB+ NSg/VB/J+ VP/J P NPr+ . J/R R . > # > “ I’ve had nothing yet , ” Alice replied in an offended tone , “ so I can’t take # . K VP NSg/I/J+ NSg/VB/C . . NPr+ VP/J NPr/J/R/P D/P VP/J N🅪Sg/I/VB+ . . NSg/I/J/R/C ISg/#r+ VXB NSg/VB > more . ” # NPr/I/J/R/Dq . . > # > “ You mean you can’t take less , ” said the Hatter : “ it’s very easy to take more # . ISgPl+ NSg/VB/J ISgPl+ VXB NSg/VB VB/J/R/C/P . . VP/J D NSg/VB . . K J/R NSg/VB/J P NSg/VB NPr/I/J/R/Dq > than nothing . ” # C/P NSg/I/J+ . . > # > “ Nobody asked your opinion , ” said Alice . # . NSg/I+ VP/J D$+ N🅪Sg+ . . VP/J NPr+ . > # > “ Who’s making personal remarks now ? ” the Hatter asked triumphantly . # . NPr$ Nᴹ/Vg/J NSg/J+ NPl/V3+ NSg/J/R/C . . D NSg/VB VP/J R . > # > Alice did not quite know what to say to this : so she helped herself to some tea # NPr+ VXPt NSg/R/C R VB NSg/I+ P NSg/VB P I/Ddem+ . NSg/I/J/R/C ISg+ VP/J ISg+ P I/J/R/Dq N🅪Sg/VB > and bread - and - butter , and then turned to the Dormouse , and repeated her # VB/C N🅪Sg/VB+ . VB/C . NSg/VB+ . VB/C NSg/J/R/C VP/J P D NSg . VB/C VP/J ISg/D$+ > question . “ Why did they live at the bottom of a well ? ” # NSg/VB+ . . NSg/VB VXPt IPl+ VB/J NSg/P D NSg/VB/J P D/P+ NSg/VB/J/R+ . . > # > The Dormouse again took a minute or two to think about it , and then said , “ It # D NSg P VPt D/P NSg/VB/J+ NPr/C NSg P NSg/VB J/P NPr/ISg+ . VB/C NSg/J/R/C VP/J . . NPr/ISg+ > was a treacle - well . ” # VLPt D/P Nᴹ/VB . NSg/VB/J/R . . > # > “ There’s no such thing ! ” Alice was beginning very angrily , but the Hatter and # . K NSg/Dq/P+ NSg/I NSg+ . . NPr+ VLPt NSg/Vg/J+ J/R R . NSg/C/P D NSg/VB VB/C > the March Hare went “ Sh ! sh ! ” and the Dormouse sulkily remarked , “ If you can’t # D NPr/VB+ NSg/VB/J+ NSg/VPt . W? . W? . . VB/C D NSg R VP/J . . NSg/C ISgPl+ VXB > be civil , you’d better finish the story for yourself . ” # NSg/VLXB J . K NSg/VXB/JC NSg/VB D NSg/VB+ R/C/P ISg+ . . > # > “ No , please go on ! ” Alice said very humbly ; “ I won’t interrupt again . I dare say # . NSg/Dq/P . VB NSg/VB/J J/P . . NPr+ VP/J J/R R . . ISg/#r+ VXB NSg/VB P . ISg/#r+ NPr/VXB NSg/VB > there may be one . ” # R+ NPr/VXB NSg/VLXB NSg/I/J . . > # > “ One , indeed ! ” said the Dormouse indignantly . However , he consented to go on . # . NSg/I/J . R . . VP/J D NSg R . C . NPr/ISg+ VP/J P NSg/VB/J J/P . > “ And so these three little sisters — they were learning to draw , you know — ” # . VB/C NSg/I/J/R/C I/Ddem+ NSg+ NPr/I/J/Dq+ NPl/V3+ . IPl+ NSg/VLPt Nᴹ/Vg/J P NSg/VB . ISgPl+ VB . . > # > “ What did they draw ? ” said Alice , quite forgetting her promise . # . NSg/I+ VXPt IPl+ NSg/VB . . VP/J NPr+ . R NSg/Vg ISg/D$+ NSg/VB+ . > # > “ Treacle , ” said the Dormouse , without considering at all this time . # . Nᴹ/VB . . VP/J D NSg . C/P Nᴹ/Vg/J NSg/P NSg/I/J/C/Dq I/Ddem N🅪Sg/VB/J+ . > # > “ I want a clean cup , ” interrupted the Hatter : “ let’s all move one place on . ” # . ISg/#r+ NSg/VB D/P+ NSg/VB/J+ NSg/VB+ . . VP/J D NSg/VB . . NSg$ NSg/I/J/C/Dq NSg/VB NSg/I/J N🅪Sg/VB+ J/P . . > # > He moved on as he spoke , and the Dormouse followed him : the March Hare moved # NPr/ISg+ VP/J J/P R/C/P NPr/ISg+ NSg/VPt . VB/C D NSg VP/J ISg+ . D NPr/VB+ NSg/VB/J+ VP/J > into the Dormouse’s place , and Alice rather unwillingly took the place of the # P D NSg$ N🅪Sg/VB+ . VB/C NPr+ NPr/VB/J/R R VPt D N🅪Sg/VB P D > March Hare . The Hatter was the only one who got any advantage from the change : # NPr/VB+ NSg/VB/J+ . D NSg/VB VLPt D J/R/C NSg/I/J+ NPr/I+ VP I/R/Dq N🅪Sg/VB+ P D N🅪Sg/VB+ . > and Alice was a good deal worse off than before , as the March Hare had just # VB/C NPr+ VLPt D/P NPr/VB/J NSg/VB/J+ NSg/VB/JC NSg/VB/J/P C/P C/P . R/C/P D NPr/VB+ NSg/VB/J+ VP J/R > upset the milk - jug into his plate . # NSg/VB/J D N🅪Sg/VB+ . NSg/VB+ P ISg/D$+ NSg/VB+ . > # > Alice did not wish to offend the Dormouse again , so she began very cautiously : # NPr+ VXPt NSg/R/C NSg/VB P VB D NSg P . NSg/I/J/R/C ISg+ VPt J/R R . > “ But I don’t understand . Where did they draw the treacle from ? ” # . NSg/C/P ISg/#r+ VXB VB . NSg/R/C VXPt IPl+ NSg/VB D Nᴹ/VB P . . > # > “ You can draw water out of a water - well , ” said the Hatter ; “ so I should think # . ISgPl+ NPr/VXB NSg/VB N🅪Sg/VB NSg/VB/J/R/P P D/P+ N🅪Sg/VB+ . NSg/VB/J/R . . VP/J D NSg/VB . . NSg/I/J/R/C ISg/#r+ VXB NSg/VB > you could draw treacle out of a treacle - well — eh , stupid ? ” # ISgPl+ NSg/VXB NSg/VB Nᴹ/VB NSg/VB/J/R/P P D/P Nᴹ/VB . NSg/VB/J/R . VB/J . NSg/J . . > # > “ But they were in the well , ” Alice said to the Dormouse , not choosing to notice # . NSg/C/P IPl+ NSg/VLPt NPr/J/R/P D NSg/VB/J/R . . NPr+ VP/J P D NSg . NSg/R/C Nᴹ/Vg/J P NSg/VB > this last remark . # I/Ddem NSg/VB/J NSg/VB+ . > # > “ Of course they were , ” said the Dormouse ; “ — well in . ” # . P NSg/VB+ IPl+ NSg/VLPt . . VP/J D NSg . . . NSg/VB/J/R NPr/J/R/P . . > # > This answer so confused poor Alice , that she let the Dormouse go on for some # I/Ddem+ NSg/VB+ NSg/I/J/R/C VP/J+ NSg/VB/J+ NPr+ . NSg/I/C/Ddem ISg+ NSg/VBP D NSg NSg/VB/J J/P R/C/P I/J/R/Dq > time without interrupting it . # N🅪Sg/VB/J+ C/P Nᴹ/Vg/J NPr/ISg+ . > # > “ They were learning to draw , ” the Dormouse went on , yawning and rubbing its # . IPl+ NSg/VLPt Nᴹ/Vg/J P NSg/VB . . D NSg NSg/VPt J/P . Nᴹ/Vg/J VB/C NSg/Vg ISg/D$+ > eyes , for it was getting very sleepy ; “ and they drew all manner of # NPl/V3+ . R/C/P NPr/ISg+ VLPt NSg/Vg J/R NSg/J . . VB/C IPl+ NPr/VPt NSg/I/J/C/Dq NSg P > things — everything that begins with an M — ” # NPl+ . NSg/I/VB+ NSg/I/C/Ddem+ NPl/V3 P D/P NPr/VB/J/#r . . > # > “ Why with an M ? ” said Alice . # . NSg/VB P D/P NPr/VB/J/#r . . VP/J NPr+ . > # > “ Why not ? ” said the March Hare . # . NSg/VB NSg/R/C . . VP/J D+ NPr/VB+ NSg/VB/J+ . > # > Alice was silent . # NPr+ VLPt NSg/J . > # > The Dormouse had closed its eyes by this time , and was going off into a doze ; # D NSg VP VP/J ISg/D$+ NPl/V3+ NSg/P I/Ddem N🅪Sg/VB/J+ . VB/C VLPt Nᴹ/Vg/J NSg/VB/J/P P D/P NSg/VB . > but , on being pinched by the Hatter , it woke up again with a little shriek , and # NSg/C/P . J/P N🅪Sg/VLg/J/C VP/J NSg/P D NSg/VB . NPr/ISg+ NSg/VB/J NSg/VB/J/P P P D/P NPr/I/J/Dq NSg/VB . VB/C > went on : “ — that begins with an M , such as mouse - traps , and the moon , and memory , # NSg/VPt J/P . . . NSg/I/C/Ddem+ NPl/V3 P D/P NPr/VB/J/#r . NSg/I R/C/P NSg/VB+ . NPl/V3 . VB/C D NPr/VB+ . VB/C N🅪Sg+ . > and muchness — you know you say things are “ much of a muchness ” — did you ever see # VB/C NSg . ISgPl+ VB ISgPl+ NSg/VB NPl+ VLB . NSg/I/J/R/Dq P D/P NSg . . VXPt ISgPl+ J/R NSg/VB > such a thing as a drawing of a muchness ? ” # NSg/I D/P NSg+ R/C/P D/P N🅪Sg/Vg/J P D/P NSg . . > # > “ Really , now you ask me , ” said Alice , very much confused , “ I don’t think — ” # . R . NSg/J/R/C ISgPl+ NSg/VB NPr/ISg+ . . VP/J NPr+ . J/R NSg/I/J/R/Dq VP/J . . ISg/#r+ VXB NSg/VB . . > # > “ Then you shouldn’t talk , ” said the Hatter . # . NSg/J/R/C ISgPl+ VXB N🅪Sg/VB . . VP/J D NSg/VB . > # > This piece of rudeness was more than Alice could bear : she got up in great # I/Ddem NSg/VB P NSg+ VLPt NPr/I/J/R/Dq C/P NPr+ NSg/VXB NSg/VB/J+ . ISg+ VP NSg/VB/J/P NPr/J/R/P NSg/J+ > disgust , and walked off ; the Dormouse fell asleep instantly , and neither of the # Nᴹ/VB+ . VB/C VP/J NSg/VB/J/P . D NSg NSg/VPt/J J R . VB/C I/C P D > others took the least notice of her going , though she looked back once or twice , # NPl/V3+ VPt D NSg/J/Dq NSg/VB P ISg/D$+ Nᴹ/Vg/J . C ISg+ VP/J NSg/VB/J NSg/C NPr/C R . > half hoping that they would call after her : the last time she saw them , they # N🅪Sg/J/P+ Nᴹ/Vg/J NSg/I/C/Ddem IPl+ VXB NSg/VB P ISg/D$+ . D NSg/VB/J N🅪Sg/VB/J+ ISg+ NSg/VPt NSg/IPl+ . IPl+ > were trying to put the Dormouse into the teapot . # NSg/VLPt Nᴹ/Vg/J P NSg/VBP D NSg P D NSg . > # > “ At any rate I’ll never go there again ! ” said Alice as she picked her way # . NSg/P I/R/Dq+ NSg/VB+ K R NSg/VB/J R+ P . . VP/J NPr+ R/C/P ISg+ VP/J ISg/D$+ NSg/J+ > through the wood . “ It’s the stupidest tea - party I ever was at in all my life ! ” # NSg/J/P D+ NPr🅪Sg/VB/J+ . . K D JS N🅪Sg/VB+ . NSg/VB/J+ ISg/#r+ J/R VLPt NSg/P NPr/J/R/P NSg/I/J/C/Dq D$+ N🅪Sg/VB+ . . > # > Just as she said this , she noticed that one of the trees had a door leading # J/R R/C/P ISg+ VP/J I/Ddem+ . ISg+ VP/J NSg/I/C/Ddem NSg/I/J P D+ NPl/V3+ VP D/P+ NSg/VB+ Nᴹ/Vg/J > right into it . “ That’s very curious ! ” she thought . “ But everything’s curious # NPr/VB/J P NPr/ISg+ . . NSg$ J/R J . . ISg+ N🅪Sg/VP . . NSg/C/P NSg$ J+ > today . I think I may as well go in at once . ” And in she went . # NSg/J+ . ISg/#r+ NSg/VB ISg/#r+ NPr/VXB R/C/P NSg/VB/J/R NSg/VB/J NPr/J/R/P NSg/P NSg/C . . VB/C NPr/J/R/P ISg+ NSg/VPt . > # > Once more she found herself in the long hall , and close to the little glass # NSg/C NPr/I/J/R/Dq ISg+ NSg/VP ISg+ NPr/J/R/P D+ NPr/VB/J+ NPr+ . VB/C NSg/VB/J P D+ NPr/I/J/Dq+ NPr🅪Sg/VB+ > table . “ Now , I’ll manage better this time , ” she said to herself , and began by # NSg/VB+ . . NSg/J/R/C . K NSg/VB NSg/VXB/JC I/Ddem N🅪Sg/VB/J+ . . ISg+ VP/J P ISg+ . VB/C VPt NSg/P > taking the little golden key , and unlocking the door that led into the garden . # NSg/Vg/J D NPr/I/J/Dq NPr/VB/J NPr/VB/J . VB/C Nᴹ/Vg/J D NSg/VB+ NSg/I/C/Ddem+ NSg/VP/J P D NSg/VB/J+ . > Then she went to work nibbling at the mushroom ( she had kept a piece of it in # NSg/J/R/C ISg+ NSg/VPt P N🅪Sg/VB Nᴹ/Vg/J NSg/P D N🅪Sg/VB/J . ISg+ VP VP D/P NSg/VB P NPr/ISg+ NPr/J/R/P > her pocket ) till she was about a foot high : then she walked down the little # ISg/D$+ NSg/VB/J+ . NSg/VB/C/P ISg+ VLPt J/P D/P NSg/VB+ NSg/VB/J/R . NSg/J/R/C ISg+ VP/J N🅪Sg/VB/J/P D NPr/I/J/Dq > passage : and then — she found herself at last in the beautiful garden , among the # NSg/VB/J+ . VB/C NSg/J/R/C . ISg+ NSg/VP ISg+ NSg/P NSg/VB/J NPr/J/R/P D NSg/J NSg/VB/J+ . P D > bright flower - beds and the cool fountains . # NPr/VB/J NSg/VB+ . NPl/V3+ VB/C D NSg/VB/J NPl/V3 . > # > CHAPTER VIII : The Queen’s Croquet - Ground # HeadingStart NSg/VB+ #r . D NPr$ NSg/VB . N🅪Sg/VB/J+ > # > A large rose - tree stood near the entrance of the garden : the roses growing on it # D/P NSg/J NPr/VPt/J+ . NSg/VB VP NSg/VB/J/P D NSg/VB P D+ NSg/VB/J+ . D+ NPl/V3+ Nᴹ/Vg/J J/P NPr/ISg+ > were white , but there were three gardeners at it , busily painting them red . # NSg/VLPt NPr🅪Sg/VB/J . NSg/C/P R+ NSg/VLPt NSg+ NPl+ NSg/P NPr/ISg+ . R N🅪Sg/Vg/J+ NSg/IPl+ N🅪Sg/J . > Alice thought this a very curious thing , and she went nearer to watch them , and # NPr+ N🅪Sg/VP I/Ddem D/P J/R J+ NSg+ . VB/C ISg+ NSg/VPt NSg/JC P NSg/VB NSg/IPl+ . VB/C > just as she came up to them she heard one of them say , “ Look out now , Five ! # J/R R/C/P ISg+ NSg/VPt/P NSg/VB/J/P P NSg/IPl+ ISg+ VP/J NSg/I/J P NSg/IPl+ NSg/VB . . NSg/VB NSg/VB/J/R/P NSg/J/R/C . NSg . > Don’t go splashing paint over me like that ! ” # VXB NSg/VB/J Nᴹ/Vg/J N🅪Sg/VB+ NSg/J/P NPr/ISg+ NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > “ I couldn’t help it , ” said Five , in a sulky tone ; “ Seven jogged my elbow . ” # . ISg/#r+ VXB NSg/VB NPr/ISg+ . . VP/J NSg . NPr/J/R/P D/P NSg/J N🅪Sg/I/VB+ . . NSg VP D$+ NSg/VB+ . . > # > On which Seven looked up and said , “ That’s right , Five ! Always lay the blame on # J/P I/C+ NSg VP/J NSg/VB/J/P VB/C VP/J . . NSg$ NPr/VB/J . NSg . R NSg/VBPt/J D NSg/VB/J J/P > others ! ” # NPl/V3+ . . > # > “ You’d better not talk ! ” said Five . “ I heard the Queen say only yesterday you # . K NSg/VXB/JC NSg/R/C N🅪Sg/VB . . VP/J NSg . . ISg/#r+ VP/J D+ NPr/VB/J+ NSg/VB J/R/C NSg ISgPl+ > deserved to be beheaded ! ” # VP/J P NSg/VLXB VP/J . . > # > “ What for ? ” said the one who had spoken first . # . NSg/I+ R/C/P . . VP/J D+ NSg/I/J+ NPr/I+ VP VPp/J NSg/J . > # > “ That’s none of your business , Two ! ” said Seven . # . NSg$ NSg/I P D$+ N🅪Sg/J+ . NSg . . VP/J NSg . > # > “ Yes , it is his business ! ” said Five , “ and I’ll tell him — it was for bringing the # . NPl/VB . NPr/ISg+ VL3 ISg/D$+ N🅪Sg/J+ . . VP/J NSg . . VB/C K NPr/VB ISg+ . NPr/ISg+ VLPt R/C/P Nᴹ/Vg/J D > cook tulip - roots instead of onions . ” # NPr/VB NSg . NPl/V3+ R P NPl+ . . > # > Seven flung down his brush , and had just begun “ Well , of all the unjust things — ” # NSg VB N🅪Sg/VB/J/P ISg/D$+ NSg/VB+ . VB/C VP J/R VPp . NSg/VB/J/R . P NSg/I/J/C/Dq D J NPl+ . . > when his eye chanced to fall upon Alice , as she stood watching them , and he # NSg/I/C ISg/D$+ NSg/VB+ VP/J P N🅪Sg/VB P NPr+ . R/C/P ISg+ VP Nᴹ/Vg/J NSg/IPl+ . VB/C NPr/ISg+ > checked himself suddenly : the others looked round also , and all of them bowed # VP/J ISg+ R . D NPl/V3+ VP/J NSg/VB/J/P R/C . VB/C NSg/I/J/C/Dq P NSg/IPl+ VP/J > low . # NSg/VB/J/R . > # > “ Would you tell me , ” said Alice , a little timidly , “ why you are painting those # . VXB ISgPl+ NPr/VB NPr/ISg+ . . VP/J NPr+ . D/P NPr/I/J/Dq R . . NSg/VB ISgPl+ VLB N🅪Sg/Vg/J I/Ddem > roses ? ” # NPl/V3+ . . > # > Five and Seven said nothing , but looked at Two . Two began in a low voice , “ Why # NSg VB/C NSg VP/J NSg/I/J+ . NSg/C/P VP/J NSg/P NSg . NSg VPt NPr/J/R/P D/P+ NSg/VB/J/R+ NSg/VB+ . . NSg/VB > the fact is , you see , Miss , this here ought to have been a red rose - tree , and we # D+ NSg+ VL3 . ISgPl+ NSg/VB . NSg/VB . I/Ddem J/R NSg/I/VXB P NSg/VXB NSg/VLPp D/P N🅪Sg/J NPr/VPt/J . NSg/VB+ . VB/C IPl+ > put a white one in by mistake ; and if the Queen was to find it out , we should # NSg/VBP D/P NPr🅪Sg/VB/J NSg/I/J+ NPr/J/R/P NSg/P NSg/VB+ . VB/C NSg/C D+ NPr/VB/J+ VLPt P NSg/VB NPr/ISg+ NSg/VB/J/R/P . IPl+ VXB > all have our heads cut off , you know . So you see , Miss , we’re doing our best , # NSg/I/J/C/Dq NSg/VXB D$+ NPl/V3+ NSg/VBP/J NSg/VB/J/P . ISgPl+ VB . NSg/I/J/R/C ISgPl+ NSg/VB . NSg/VB . K Nᴹ/Vg/J D$+ NPr/VXB/JS . > afore she comes , to — ” At this moment Five , who had been anxiously looking across # R/C/P ISg+ NPl/V3 . P . . NSg/P I/Ddem NSg+ NSg . NPr/I+ VP NSg/VLPp R Nᴹ/Vg/J NSg/P > the garden , called out “ The Queen ! The Queen ! ” and the three gardeners instantly # D NSg/VB/J+ . VP/J NSg/VB/J/R/P . D NPr/VB/J+ . D+ NPr/VB/J+ . . VB/C D+ NSg+ NPl+ R > threw themselves flat upon their faces . There was a sound of many footsteps , and # VPt IPl+ NSg/VB/J P D$+ NPl/V3+ . R+ VLPt D/P N🅪Sg/VB/J P NSg/I/J/Dq+ NPl+ . VB/C > Alice looked round , eager to see the Queen . # NPr+ VP/J NSg/VB/J/P . NSg/VB/J P NSg/VB D+ NPr/VB/J+ . > # > First came ten soldiers carrying clubs ; these were all shaped like the three # NSg/J NSg/VPt/P NSg+ NPl/V3+ Nᴹ/Vg/J NPl/V3+ . I/Ddem+ NSg/VLPt NSg/I/J/C/Dq VP/J NSg/VB/J/C/P D+ NSg+ > gardeners , oblong and flat , with their hands and feet at the corners : next the # NPl+ . NSg/VB/J VB/C NSg/VB/J . P D$+ NPl/V3 VB/C NPl+ NSg/P D NPl/V3+ . NSg/J/P D > ten courtiers ; these were ornamented all over with diamonds , and walked two and # NSg NPl . I/Ddem+ NSg/VLPt VP/J NSg/I/J/C/Dq NSg/J/P+ P NPl/V3 . VB/C VP/J NSg VB/C > two , as the soldiers did . After these came the royal children ; there were ten of # NSg . R/C/P D NPl/V3+ VXPt . P I/Ddem NSg/VPt/P D+ NPr/J+ NPl+ . R+ NSg/VLPt NSg P > them , and the little dears came jumping merrily along hand in hand , in couples : # NSg/IPl+ . VB/C D+ NPr/I/J/Dq+ NPl/V3+ NSg/VPt/P Nᴹ/Vg/J R P NSg/VB+ NPr/J/R/P NSg/VB+ . NPr/J/R/P NPl/V3+ . > they were all ornamented with hearts . Next came the guests , mostly Kings and # IPl+ NSg/VLPt NSg/I/J/C/Dq VP/J P NPl/V3+ . NSg/J/P NSg/VPt/P D+ NPl/V3+ . R NPl/V3+ VB/C > Queens , and among them Alice recognised the White Rabbit : it was talking in a # NPrPl/V3 . VB/C P NSg/IPl+ NPr+ VP/J/Au/Br D NPr🅪Sg/VB/J NSg/VB+ . NPr/ISg+ VLPt Nᴹ/Vg/J NPr/J/R/P D/P > hurried nervous manner , smiling at everything that was said , and went by without # VP/J+ J+ NSg+ . Nᴹ/Vg/J NSg/P NSg/I/VB+ NSg/I/C/Ddem+ VLPt VP/J . VB/C NSg/VPt NSg/P C/P > noticing her . Then followed the Knave of Hearts , carrying the King’s crown on a # Nᴹ/Vg/J ISg/D$+ . NSg/J/R/C VP/J D NSg P NPl/V3+ . Nᴹ/Vg/J D NPr$ NSg/VB/J+ J/P D/P > crimson velvet cushion ; and , last of all this grand procession , came THE KING # NSg/VB/J Nᴹ/VB/J+ NSg/VB+ . VB/C . NSg/VB/J P NSg/I/J/C/Dq I/Ddem NSg/J NSg/VB+ . NSg/VPt/P D NPr/VB/J+ > AND QUEEN OF HEARTS . # VB/C NPr/VB/J+ P NPl/V3+ . > # > Alice was rather doubtful whether she ought not to lie down on her face like the # NPr+ VLPt NPr/VB/J/R NSg/J I/C ISg+ NSg/I/VXB NSg/R/C P NPr/VB N🅪Sg/VB/J/P J/P ISg/D$+ NSg/VB+ NSg/VB/J/C/P D > three gardeners , but she could not remember ever having heard of such a rule at # NSg NPl+ . NSg/C/P ISg+ NSg/VXB NSg/R/C NSg/VB J/R Nᴹ/Vg/J VP/J P NSg/I D/P NSg/VB+ NSg/P > processions ; “ and besides , what would be the use of a procession , ” thought she , # NPl . . VB/C R/P . NSg/I+ VXB NSg/VLXB D N🅪Sg/VB P D/P NSg/VB+ . . N🅪Sg/VP ISg+ . > “ if people had all to lie down upon their faces , so that they couldn’t see it ? ” # . NSg/C NPl/VB+ VP NSg/I/J/C/Dq+ P NPr/VB N🅪Sg/VB/J/P P D$+ NPl/V3+ . NSg/I/J/R/C NSg/I/C/Ddem IPl+ VXB NSg/VB NPr/ISg+ . . > So she stood still where she was , and waited . # NSg/I/J/R/C ISg+ VP NSg/VB/J/R NSg/R/C ISg+ VLPt . VB/C VP/J . > # > When the procession came opposite to Alice , they all stopped and looked at her , # NSg/I/C D+ NSg/VB+ NSg/VPt/P NSg/J/P P NPr+ . IPl+ NSg/I/J/C/Dq VP/J VB/C VP/J NSg/P ISg/D$+ . > and the Queen said severely “ Who is this ? ” She said it to the Knave of Hearts , # VB/C D+ NPr/VB/J+ VP/J R . NPr/I+ VL3 I/Ddem+ . . ISg+ VP/J NPr/ISg+ P D NSg P NPl/V3+ . > who only bowed and smiled in reply . # NPr/I+ J/R/C VP/J VB/C VP/J NPr/J/R/P NSg/VB+ . > # > “ Idiot ! ” said the Queen , tossing her head impatiently ; and , turning to Alice , # . NSg/J+ . . VP/J D+ NPr/VB/J+ . Nᴹ/Vg/J ISg/D$+ NPr/VB/J+ R . VB/C . Nᴹ/Vg/J P NPr+ . > she went on , “ What’s your name , child ? ” # ISg+ NSg/VPt J/P . . K D$+ NSg/VB+ . NSg/VB+ . . > # > “ My name is Alice , so please your Majesty , ” said Alice very politely ; but she # . D$+ NSg/VB+ VL3 NPr+ . NSg/I/J/R/C VB D$+ N🅪Sg/I+ . . VP/J NPr+ J/R R . NSg/C/P ISg+ > added , to herself , “ Why , they’re only a pack of cards , after all . I needn’t be # VP/J . P ISg+ . . NSg/VB . K J/R/C D/P NSg/VB P NPl/V3+ . P NSg/I/J/C/Dq . ISg/#r+ VXB NSg/VLXB > afraid of them ! ” # J P NSg/IPl+ . . > # > “ And who are these ? ” said the Queen , pointing to the three gardeners who were # . VB/C NPr/I+ VLB I/Ddem . . VP/J D+ NPr/VB/J+ . Nᴹ/Vg/J P D+ NSg+ NPl+ NPr/I+ NSg/VLPt > lying round the rose - tree ; for , you see , as they were lying on their faces , and # Nᴹ/Vg/J NSg/VB/J/P D NPr/VPt/J+ . NSg/VB+ . R/C/P . ISgPl+ NSg/VB . R/C/P IPl+ NSg/VLPt Nᴹ/Vg/J J/P D$+ NPl/V3+ . VB/C > the pattern on their backs was the same as the rest of the pack , she could not # D+ NSg/VB/J+ J/P D$+ NPl/V3+ VLPt D I/J R/C/P D NSg/VB P D+ NSg/VB+ . ISg+ NSg/VXB NSg/R/C > tell whether they were gardeners , or soldiers , or courtiers , or three of her own # NPr/VB I/C IPl+ NSg/VLPt NPl . NPr/C NPl/V3+ . NPr/C NPl . NPr/C NSg P ISg/D$+ NSg/VB/J > children . # NPl+ . > # > “ How should I know ? ” said Alice , surprised at her own courage . “ It’s no business # . NSg/C VXB ISg/#r+ VB . . VP/J NPr+ . VP/J NSg/P ISg/D$+ NSg/VB/J+ NSg/VB+ . . K NSg/Dq/P N🅪Sg/J > of mine . ” # P NSg/I/VB+ . . > # > The Queen turned crimson with fury , and , after glaring at her for a moment like # D+ NPr/VB/J+ VP/J NSg/VB/J P N🅪Sg+ . VB/C . P Nᴹ/Vg/J NSg/P ISg/D$+ R/C/P D/P NSg+ NSg/VB/J/C/P > a wild beast , screamed “ Off with her head ! Off — ” # D/P+ NSg/VB/J+ NSg/VB/J+ . VP/J . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . NSg/VB/J/P . . > # > “ Nonsense ! ” said Alice , very loudly and decidedly , and the Queen was silent . # . Nᴹ/VB/J+ . . VP/J NPr+ . J/R R VB/C R . VB/C D NPr/VB/J+ VLPt NSg/J . > # > The King laid his hand upon her arm , and timidly said “ Consider , my dear : she is # D+ NPr/VB/J+ VP/J ISg/D$+ NSg/VB+ P ISg/D$+ NSg/VB/J+ . VB/C R VP/J . VB . D$+ NSg/VB/J . ISg+ VL3 > only a child ! ” # J/R/C D/P NSg/VB+ . . > # > The Queen turned angrily away from him , and said to the Knave “ Turn them over ! ” # D+ NPr/VB/J+ VP/J R VB/J P ISg+ . VB/C VP/J P D NSg . NSg/VB NSg/IPl+ NSg/J/P . . > # > The Knave did so , very carefully , with one foot . # D NSg VXPt NSg/I/J/R/C . J/R R . P NSg/I/J NSg/VB+ . > # > “ Get up ! ” said the Queen , in a shrill , loud voice , and the three gardeners # . NSg/VB NSg/VB/J/P . . VP/J D+ NPr/VB/J+ . NPr/J/R/P D/P NSg/VB/J . NSg/J NSg/VB+ . VB/C D+ NSg+ NPl+ > instantly jumped up , and began bowing to the King , the Queen , the royal # R VP/J NSg/VB/J/P . VB/C VPt Nᴹ/Vg/J P D NPr/VB/J+ . D NPr/VB/J+ . D NPr/J > children , and everybody else . # NPl+ . VB/C NSg/I+ NSg/J/C . > # > “ Leave off that ! ” screamed the Queen . “ You make me giddy . ” And then , turning to # . NSg/VB NSg/VB/J/P NSg/I/C/Ddem+ . . VP/J D+ NPr/VB/J+ . . ISgPl+ NSg/VB NPr/ISg+ NSg/VB/J . . VB/C NSg/J/R/C . Nᴹ/Vg/J P > the rose - tree , she went on , “ What have you been doing here ? ” # D+ NPr/VPt/J+ . NSg/VB+ . ISg+ NSg/VPt J/P . . NSg/I+ NSg/VXB ISgPl+ NSg/VLPp Nᴹ/Vg/J J/R . . > # > “ May it please your Majesty , ” said Two , in a very humble tone , going down on one # . NPr/VXB NPr/ISg+ VB D$+ N🅪Sg/I+ . . VP/J NSg . NPr/J/R/P D/P J/R NSg/VB/J N🅪Sg/I/VB+ . Nᴹ/Vg/J N🅪Sg/VB/J/P J/P NSg/I/J+ > knee as he spoke , “ we were trying — ” # NSg/VB+ R/C/P NPr/ISg+ NSg/VPt . . IPl+ NSg/VLPt Nᴹ/Vg/J . . > # > “ I see ! ” said the Queen , who had meanwhile been examining the roses . “ Off with # . ISg/#r+ NSg/VB . . VP/J D+ NPr/VB/J+ . NPr/I+ VP NSg NSg/VLPp Nᴹ/Vg/J D+ NPl/V3+ . . NSg/VB/J/P P > their heads ! ” and the procession moved on , three of the soldiers remaining # D$+ NPl/V3+ . . VB/C D+ NSg/VB+ VP/J J/P . NSg P D+ NPl/V3+ Nᴹ/Vg/J > behind to execute the unfortunate gardeners , who ran to Alice for protection . # NSg/J/P P VB D+ NSg/J+ NPl+ . NPr/I+ NSg/VPt P NPr R/C/P N🅪Sg+ . > # > “ You shan’t be beheaded ! ” said Alice , and she put them into a large flower - pot # . ISgPl+ VXB NSg/VLXB VP/J . . VP/J NPr+ . VB/C ISg+ NSg/VBP NSg/IPl+ P D/P NSg/J NSg/VB+ . N🅪Sg/VB+ > that stood near . The three soldiers wandered about for a minute or two , looking # NSg/I/C/Ddem+ VP NSg/VB/J/P . D+ NSg+ NPl/V3+ VP/J J/P R/C/P D/P+ NSg/VB/J+ NPr/C NSg . Nᴹ/Vg/J > for them , and then quietly marched off after the others . # R/C/P NSg/IPl+ . VB/C NSg/J/R/C R VP/J NSg/VB/J/P P D+ NPl/V3+ . > # > “ Are their heads off ? ” shouted the Queen . # . VLB D$+ NPl/V3+ NSg/VB/J/P . . VP/J D+ NPr/VB/J+ . > # > “ Their heads are gone , if it please your Majesty ! ” the soldiers shouted in # . D$+ NPl/V3+ VLB VPp/J/P . NSg/C NPr/ISg+ VB D$+ N🅪Sg/I+ . . D+ NPl/V3+ VP/J NPr/J/R/P > reply . # NSg/VB+ . > # > “ That’s right ! ” shouted the Queen . “ Can you play croquet ? ” # . NSg$ NPr/VB/J . . VP/J D+ NPr/VB/J+ . . NPr/VXB ISgPl+ N🅪Sg/VB NSg/VB . . > # > The soldiers were silent , and looked at Alice , as the question was evidently # D+ NPl/V3+ NSg/VLPt NSg/J . VB/C VP/J NSg/P NPr+ . R/C/P D+ NSg/VB+ VLPt R > meant for her . # VP R/C/P ISg/D$+ . > # > “ Yes ! ” shouted Alice . # . NPl/VB . . VP/J NPr+ . > # > “ Come on , then ! ” roared the Queen , and Alice joined the procession , wondering # . NSg/VBPp/P J/P . NSg/J/R/C . . VP/J D+ NPr/VB/J+ . VB/C NPr+ VP/J D+ NSg/VB+ . Nᴹ/Vg/J > very much what would happen next . # J/R NSg/I/J/R/Dq NSg/I+ VXB VB NSg/J/P . > # > “ It’s — it’s a very fine day ! ” said a timid voice at her side . She was walking by # . K . K D/P J/R NSg/VB/J NPr🅪Sg+ . . VP/J D/P+ J+ NSg/VB+ NSg/P ISg/D$+ NSg/VB/J+ . ISg+ VLPt Nᴹ/Vg/J NSg/P > the White Rabbit , who was peeping anxiously into her face . # D+ NPr🅪Sg/VB/J+ NSg/VB+ . NPr/I+ VLPt Nᴹ/Vg/J R P ISg/D$+ NSg/VB+ . > # > “ Very , ” said Alice : “ — where’s the Duchess ? ” # . J/R . . VP/J NPr+ . . . NSg$ D NSg/VB . . > # > “ Hush ! Hush ! ” said the Rabbit in a low , hurried tone . He looked anxiously over # . NSg/VB+ . NSg/VB+ . . VP/J D+ NSg/VB+ NPr/J/R/P D/P NSg/VB/J/R . VP/J N🅪Sg/I/VB+ . NPr/ISg+ VP/J R NSg/J/P > his shoulder as he spoke , and then raised himself upon tiptoe , put his mouth # ISg/D$+ NSg/VB+ R/C/P NPr/ISg+ NSg/VPt . VB/C NSg/J/R/C VP/J ISg+ P NSg/VB/J+ . NSg/VBP ISg/D$+ NSg/VB+ > close to her ear , and whispered “ She’s under sentence of execution . ” # NSg/VB/J P ISg/D$+ NSg/VB/J+ . VB/C VP/J . K NSg/J/P NSg/VB P N🅪Sg+ . . > # > “ What for ? ” said Alice . # . NSg/I+ R/C/P . . VP/J NPr+ . > # > “ Did you say ‘ What a pity ! ’ ? ” the Rabbit asked . # . VXPt ISgPl+ NSg/VB Unlintable NSg/I+ D/P+ N🅪Sg/VB+ . . . . D+ NSg/VB+ VP/J . > # > “ No , I didn’t , ” said Alice : “ I don’t think it’s at all a pity . I said ‘ What # . NSg/Dq/P . ISg/#r+ VXPt . . VP/J NPr+ . . ISg/#r+ VXB NSg/VB K NSg/P NSg/I/J/C/Dq D/P N🅪Sg/VB+ . ISg/#r+ VP/J Unlintable NSg/I+ > for ? ’ ” # R/C/P . . . > # > “ She boxed the Queen’s ears — ” the Rabbit began . Alice gave a little scream of # . ISg+ VP/J D NPr$ NPl/V3+ . . D NSg/VB+ VPt . NPr+ VPt D/P NPr/I/J/Dq NSg/VB P > laughter . “ Oh , hush ! ” the Rabbit whispered in a frightened tone . “ The Queen will # Nᴹ+ . . NPr/VB . NSg/VB+ . . D+ NSg/VB+ VP/J NPr/J/R/P D/P+ VP/J N🅪Sg/I/VB+ . . D+ NPr/VB/J+ NPr/VXB > hear you ! You see , she came rather late , and the Queen said — ” # VB ISgPl+ . ISgPl+ NSg/VB . ISg+ NSg/VPt/P NPr/VB/J/R NSg/J . VB/C D+ NPr/VB/J+ VP/J . . > # > “ Get to your places ! ” shouted the Queen in a voice of thunder , and people began # . NSg/VB P D$+ NPl/V3+ . . VP/J D+ NPr/VB/J+ NPr/J/R/P D/P NSg/VB P NSg/VB+ . VB/C NPl/VB+ VPt > running about in all directions , tumbling up against each other ; however , they # Nᴹ/Vg/J/P J/P NPr/J/R/P NSg/I/J/C/Dq+ NPl+ . Nᴹ/Vg/J NSg/VB/J/P C/P Dq NSg/VB/J . C . IPl+ > got settled down in a minute or two , and the game began . Alice thought she had # VP VP/J N🅪Sg/VB/J/P NPr/J/R/P D/P+ NSg/VB/J+ NPr/C NSg . VB/C D+ NSg/VB/J+ VPt . NPr+ N🅪Sg/VP ISg+ VP > never seen such a curious croquet - ground in her life ; it was all ridges and # R NSg/VPp NSg/I D/P J NSg/VB . N🅪Sg/VB/J NPr/J/R/P ISg/D$+ N🅪Sg/VB+ . NPr/ISg+ VLPt NSg/I/J/C/Dq NPl/V3 VB/C > furrows ; the balls were live hedgehogs , the mallets live flamingoes , and the # NPl/V3 . D NPl/V3+ NSg/VLPt VB/J NPl/V3 . D NPl/V3 VB/J NPl . VB/C D > soldiers had to double themselves up and to stand on their hands and feet , to # NPl/V3+ VP P NSg/VB/J IPl+ NSg/VB/J/P VB/C P NSg/VB J/P D$+ NPl/V3 VB/C NPl+ . P > make the arches . # NSg/VB D NPl/V3 . > # > The chief difficulty Alice found at first was in managing her flamingo : she # D+ NSg/VB/J+ N🅪Sg+ NPr+ NSg/VP NSg/P NSg/J VLPt NPr/J/R/P Nᴹ/Vg/J ISg/D$+ NSg/J . ISg+ > succeeded in getting its body tucked away , comfortably enough , under her arm , # VP/J NPr/J/R/P NSg/Vg ISg/D$+ NSg/VB+ VP/J VB/J . R NSg/I . NSg/J/P ISg/D$+ NSg/VB/J+ . > with its legs hanging down , but generally , just as she had got its neck nicely # P ISg/D$+ NPl/V3+ Nᴹ/Vg/J N🅪Sg/VB/J/P . NSg/C/P R . J/R R/C/P ISg+ VP VP ISg/D$+ NSg/VB+ R > straightened out , and was going to give the hedgehog a blow with its head , it # VP/J NSg/VB/J/R/P . VB/C VLPt Nᴹ/Vg/J P NSg/VB D NSg/VB+ D/P NSg/VB/J+ P ISg/D$+ NPr/VB/J+ . NPr/ISg+ > would twist itself round and look up in her face , with such a puzzled expression # VXB NSg/VB ISg+ NSg/VB/J/P VB/C NSg/VB NSg/VB/J/P NPr/J/R/P ISg/D$+ NSg/VB+ . P NSg/I D/P VP/J N🅪Sg+ > that she could not help bursting out laughing : and when she had got its head # NSg/I/C/Ddem+ ISg+ NSg/VXB NSg/R/C NSg/VB Nᴹ/Vg/J NSg/VB/J/R/P Nᴹ/Vg/J . VB/C NSg/I/C ISg+ VP VP ISg/D$+ NPr/VB/J+ > down , and was going to begin again , it was very provoking to find that the # N🅪Sg/VB/J/P . VB/C VLPt Nᴹ/Vg/J P NSg/VB P . NPr/ISg+ VLPt J/R Nᴹ/Vg/J P NSg/VB NSg/I/C/Ddem D > hedgehog had unrolled itself , and was in the act of crawling away : besides all # NSg/VB+ VP VP/J ISg+ . VB/C VLPt NPr/J/R/P D NPr/VB+ P Nᴹ/Vg/J VB/J . R/P NSg/I/J/C/Dq > this , there was generally a ridge or furrow in the way wherever she wanted to # I/Ddem+ . R+ VLPt R D/P NSg/VB+ NPr/C NSg/VB NPr/J/R/P D NSg/J+ C ISg+ VP/J P > send the hedgehog to , and , as the doubled - up soldiers were always getting up and # NSg/VB D NSg/VB+ P . VB/C . R/C/P D VP/J+ . NSg/VB/J/P NPl/V3+ NSg/VLPt R NSg/Vg NSg/VB/J/P VB/C > walking off to other parts of the ground , Alice soon came to the conclusion that # Nᴹ/Vg/J NSg/VB/J/P P NSg/VB/J NPl/V3 P D N🅪Sg/VB/J+ . NPr+ J/R NSg/VPt/P P D NSg+ NSg/I/C/Ddem+ > it was a very difficult game indeed . # NPr/ISg+ VLPt D/P J/R VB/J NSg/VB/J+ R . > # > The players all played at once without waiting for turns , quarrelling all the # D+ NPl+ NSg/I/J/C/Dq+ VP/J+ NSg/P NSg/C C/P Nᴹ/Vg/J R/C/P NPl/V3 . Nᴹ/Vg/Comm NSg/I/J/C/Dq D > while , and fighting for the hedgehogs ; and in a very short time the Queen was in # NSg/VB/C/P . VB/C Nᴹ/Vg/J R/C/P D NPl/V3 . VB/C NPr/J/R/P D/P J/R NPr/VB/J/P N🅪Sg/VB/J+ D NPr/VB/J+ VLPt NPr/J/R/P > a furious passion , and went stamping about , and shouting “ Off with his head ! ” or # D/P J NPrᴹ/VB+ . VB/C NSg/VPt NSg J/P . VB/C Nᴹ/Vg/J+ . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . . NPr/C > “ Off with her head ! ” about once in a minute . # . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . . J/P NSg/C NPr/J/R/P D/P+ NSg/VB/J+ . > # > Alice began to feel very uneasy : to be sure , she had not as yet had any dispute # NPr+ VPt P NSg/I/VB J/R NSg/VB/J . P NSg/VLXB J . ISg+ VP NSg/R/C R/C/P NSg/VB/C VP I/R/Dq NSg/VB+ > with the Queen , but she knew that it might happen any minute , “ and then , ” # P D+ NPr/VB/J+ . NSg/C/P ISg+ VPt NSg/I/C/Ddem NPr/ISg+ Nᴹ/VXB/J VB I/R/Dq+ NSg/VB/J+ . . VB/C NSg/J/R/C . . > thought she , “ what would become of me ? They’re dreadfully fond of beheading # N🅪Sg/VP ISg+ . . NSg/I+ VXB VBPp P NPr/ISg+ . K R NSg/VB/J P NSg > people here ; the great wonder is , that there’s any one left alive ! ” # NPl/VB+ J/R . D NSg/J N🅪Sg/VB+ VL3 . NSg/I/C/Ddem+ K I/R/Dq NSg/I/J+ NPr/VP/J J . . > # > She was looking about for some way of escape , and wondering whether she could # ISg+ VLPt Nᴹ/Vg/J J/P R/C/P I/J/R/Dq NSg/J P N🅪Sg/VB+ . VB/C Nᴹ/Vg/J I/C ISg+ NSg/VXB > get away without being seen , when she noticed a curious appearance in the air : # NSg/VB VB/J C/P N🅪Sg/VLg/J/C NSg/VPp . NSg/I/C ISg+ VP/J D/P J NSg NPr/J/R/P D+ N🅪Sg/VB+ . > it puzzled her very much at first , but , after watching it a minute or two , she # NPr/ISg+ VP/J ISg/D$+ J/R NSg/I/J/R/Dq NSg/P NSg/J . NSg/C/P . P Nᴹ/Vg/J NPr/ISg+ D/P+ NSg/VB/J+ NPr/C NSg . ISg+ > made it out to be a grin , and she said to herself “ It’s the Cheshire Cat : now I # VP NPr/ISg+ NSg/VB/J/R/P P NSg/VLXB D/P+ NSg/VB+ . VB/C ISg+ VP/J P ISg+ . K D NPr NSg/VB/J+ . NSg/J/R/C ISg/#r+ > shall have somebody to talk to . ” # VXB NSg/VXB NSg/I+ P N🅪Sg/VB P . . > # > “ How are you getting on ? ” said the Cat , as soon as there was mouth enough for it # . NSg/C VLB ISgPl+ NSg/Vg J/P . . VP/J D+ NSg/VB/J+ . R/C/P J/R R/C/P R+ VLPt NSg/VB+ NSg/I R/C/P NPr/ISg+ > to speak with . # P NSg/VB P . > # > Alice waited till the eyes appeared , and then nodded . “ It’s no use speaking to # NPr+ VP/J NSg/VB/C/P D+ NPl/V3+ VP/J . VB/C NSg/J/R/C VP . . K NSg/Dq/P N🅪Sg/VB Nᴹ/Vg/J P > it , ” she thought , “ till its ears have come , or at least one of them . ” In another # NPr/ISg+ . . ISg+ N🅪Sg/VP . . NSg/VB/C/P ISg/D$+ NPl/V3+ NSg/VXB NSg/VBPp/P . NPr/C NSg/P NSg/J/Dq NSg/I/J P NSg/IPl+ . . NPr/J/R/P I/D+ > minute the whole head appeared , and then Alice put down her flamingo , and began # NSg/VB/J+ D+ NSg/J+ NPr/VB/J+ VP/J . VB/C NSg/J/R/C NPr+ NSg/VBP N🅪Sg/VB/J/P ISg/D$+ NSg/J . VB/C VPt > an account of the game , feeling very glad she had someone to listen to her . The # D/P NSg/VB P D NSg/VB/J+ . N🅪Sg/Vg/J J/R NSg/VB/J ISg+ VP NSg/I+ P NSg/VB P ISg/D$+ . D+ > Cat seemed to think that there was enough of it now in sight , and no more of it # NSg/VB/J+ VP/J P NSg/VB NSg/I/C/Ddem R+ VLPt NSg/I P NPr/ISg+ NSg/J/R/C NPr/J/R/P N🅪Sg/VB+ . VB/C NSg/Dq/P NPr/I/J/R/Dq P NPr/ISg+ > appeared . # VP/J . > # > “ I don’t think they play at all fairly , ” Alice began , in rather a complaining # . ISg/#r+ VXB NSg/VB IPl+ N🅪Sg/VB NSg/P NSg/I/J/C/Dq R+ . . NPr+ VPt . NPr/J/R/P NPr/VB/J/R D/P Nᴹ/Vg/J > tone , “ and they all quarrel so dreadfully one can’t hear oneself speak — and they # N🅪Sg/I/VB+ . . VB/C IPl+ NSg/I/J/C/Dq NSg/VB+ NSg/I/J/R/C R NSg/I/J VXB VB I+ NSg/VB . VB/C IPl+ > don’t seem to have any rules in particular ; at least , if there are , nobody # VXB VB P NSg/VXB I/R/Dq NPl/V3+ NPr/J/R/P NSg/J . NSg/P NSg/J/Dq . NSg/C R+ VLB . NSg/I+ > attends to them — and you’ve no idea how confusing it is all the things being # V3 P NSg/IPl+ . VB/C K NSg/Dq/P NSg+ NSg/C Nᴹ/Vg/J NPr/ISg+ VL3 NSg/I/J/C/Dq D NPl+ N🅪Sg/VLg/J/C > alive ; for instance , there’s the arch I’ve got to go through next walking about # J . R/C/P NSg/VB+ . K D NSg/VB/J K VP P NSg/VB/J NSg/J/P NSg/J/P Nᴹ/Vg/J J/P > at the other end of the ground — and I should have croqueted the Queen’s hedgehog # NSg/P D NSg/VB/J NSg/VB P D N🅪Sg/VB/J+ . VB/C ISg/#r+ VXB NSg/VXB VP/J D NPr$ NSg/VB+ > just now , only it ran away when it saw mine coming ! ” # J/R NSg/J/R/C . J/R/C NPr/ISg+ NSg/VPt VB/J NSg/I/C NPr/ISg+ NSg/VPt NSg/I/VB+ Nᴹ/Vg/J . . > # > “ How do you like the Queen ? ” said the Cat in a low voice . # . NSg/C VXB ISgPl+ NSg/VB/J/C/P D+ NPr/VB/J+ . . VP/J D NSg/VB/J+ NPr/J/R/P D/P+ NSg/VB/J/R+ NSg/VB+ . > # > “ Not at all , ” said Alice : “ she’s so extremely — ” Just then she noticed that the # . NSg/R/C NSg/P NSg/I/J/C/Dq . . VP/J NPr+ . . K NSg/I/J/R/C R . . J/R NSg/J/R/C ISg+ VP/J NSg/I/C/Ddem D > Queen was close behind her , listening : so she went on , “ — likely to win , that # NPr/VB/J+ VLPt NSg/VB/J NSg/J/P ISg/D$+ . Nᴹ/Vg/J . NSg/I/J/R/C ISg+ NSg/VPt J/P . . . NSg/J P NSg/VB . NSg/I/C/Ddem > it’s hardly worth while finishing the game . ” # K R NSg/VB/J NSg/VB/C/P Nᴹ/Vg/J D NSg/VB/J+ . . > # > The Queen smiled and passed on . # D+ NPr/VB/J+ VP/J VB/C VP/J J/P . > # > “ Who are you talking to ? ” said the King , going up to Alice , and looking at the # . NPr/I+ VLB ISgPl+ Nᴹ/Vg/J P . . VP/J D+ NPr/VB/J+ . Nᴹ/Vg/J NSg/VB/J/P P NPr+ . VB/C Nᴹ/Vg/J NSg/P D > Cat’s head with great curiosity . # NSg$ NPr/VB/J P NSg/J NSg+ . > # > “ It’s a friend of mine — a Cheshire Cat , ” said Alice : “ allow me to introduce it . ” # . K D/P NPr/VB/J P NSg/I/VB+ . D/P NPr NSg/VB/J+ . . VP/J NPr+ . . VB NPr/ISg+ P VB NPr/ISg+ . . > # > “ I don’t like the look of it at all , ” said the King : “ however , it may kiss my # . ISg/#r+ VXB NSg/VB/J/C/P D NSg/VB P NPr/ISg+ NSg/P NSg/I/J/C/Dq . . VP/J D NPr/VB/J+ . . C . NPr/ISg+ NPr/VXB NSg/VB D$+ > hand if it likes . ” # NSg/VB+ NSg/C NPr/ISg+ NPl/V3 . . > # > “ I’d rather not , ” the Cat remarked . # . K NPr/VB/J/R NSg/R/C . . D NSg/VB/J+ VP/J . > # > “ Don’t be impertinent , ” said the King , “ and don’t look at me like that ! ” He got # . VXB NSg/VLXB NSg/J . . VP/J D NPr/VB/J+ . . VB/C VXB NSg/VB NSg/P NPr/ISg+ NSg/VB/J/C/P NSg/I/C/Ddem+ . . NPr/ISg+ VP > behind Alice as he spoke . # NSg/J/P NPr+ R/C/P NPr/ISg+ NSg/VPt . > # > “ A cat may look at a king , ” said Alice . “ I’ve read that in some book , but I # . D/P+ NSg/VB/J+ NPr/VXB NSg/VB NSg/P D/P+ NPr/VB/J+ . . VP/J NPr+ . . K NSg/VBP NSg/I/C/Ddem NPr/J/R/P I/J/R/Dq NSg/VB+ . NSg/C/P ISg/#r+ > don’t remember where . ” # VXB NSg/VB NSg/R/C . . > # > “ Well , it must be removed , ” said the King very decidedly , and he called the # . NSg/VB/J/R . NPr/ISg+ NSg/VXB NSg/VLXB VP/J . . VP/J D+ NPr/VB/J+ J/R R . VB/C NPr/ISg+ VP/J D > Queen , who was passing at the moment , “ My dear ! I wish you would have this cat # NPr/VB/J+ . NPr/I+ VLPt Nᴹ/Vg/J NSg/P D NSg+ . . D$+ NSg/VB/J . ISg/#r+ NSg/VB ISgPl+ VXB NSg/VXB I/Ddem+ NSg/VB/J+ > removed ! ” # VP/J . . > # > The Queen had only one way of settling all difficulties , great or small . “ Off # D+ NPr/VB/J+ VP J/R/C NSg/I/J NSg/J P Nᴹ/Vg/J NSg/I/J/C/Dq+ NPl+ . NSg/J NPr/C NPr/VB/J . . NSg/VB/J/P > with his head ! ” she said , without even looking round . # P ISg/D$+ NPr/VB/J+ . . ISg+ VP/J . C/P NSg/VB/J/R Nᴹ/Vg/J NSg/VB/J/P . > # > “ I’ll fetch the executioner myself , ” said the King eagerly , and he hurried off . # . K NSg/VB D NSg ISg+ . . VP/J D NPr/VB/J+ R . VB/C NPr/ISg+ VP/J NSg/VB/J/P . > # > Alice thought she might as well go back , and see how the game was going on , as # NPr+ N🅪Sg/VP ISg+ Nᴹ/VXB/J R/C/P NSg/VB/J/R NSg/VB/J NSg/VB/J . VB/C NSg/VB NSg/C D+ NSg/VB/J+ VLPt Nᴹ/Vg/J J/P . R/C/P > she heard the Queen’s voice in the distance , screaming with passion . She had # ISg+ VP/J D NPr$ NSg/VB+ NPr/J/R/P D N🅪Sg/VB+ . Nᴹ/Vg/J P NPrᴹ/VB+ . ISg+ VP > already heard her sentence three of the players to be executed for having missed # R VP/J ISg/D$+ NSg/VB+ NSg P D+ NPl+ P NSg/VLXB VP/J R/C/P Nᴹ/Vg/J VP/J > their turns , and she did not like the look of things at all , as the game was in # D$+ NPl/V3 . VB/C ISg+ VXPt NSg/R/C NSg/VB/J/C/P D NSg/VB P NPl+ NSg/P NSg/I/J/C/Dq . R/C/P D+ NSg/VB/J+ VLPt NPr/J/R/P > such confusion that she never knew whether it was her turn or not . So she went # NSg/I+ N🅪Sg/VB+ NSg/I/C/Ddem+ ISg+ R VPt I/C NPr/ISg+ VLPt ISg/D$+ NSg/VB NPr/C NSg/R/C . NSg/I/J/R/C ISg+ NSg/VPt > in search of her hedgehog . # NPr/J/R/P N🅪Sg/VB P ISg/D$+ NSg/VB+ . > # > The hedgehog was engaged in a fight with another hedgehog , which seemed to Alice # D+ NSg/VB+ VLPt VP/J NPr/J/R/P D/P NSg/VB+ P I/D+ NSg/VB+ . I/C+ VP/J P NPr+ > an excellent opportunity for croqueting one of them with the other : the only # D/P+ J+ N🅪Sg+ R/C/P Nᴹ/Vg/J NSg/I/J P NSg/IPl+ P D NSg/VB/J . D J/R/C > difficulty was , that her flamingo was gone across to the other side of the # N🅪Sg+ VLPt . NSg/I/C/Ddem ISg/D$+ NSg/J VLPt VPp/J/P NSg/P P D NSg/VB/J NSg/VB/J P D > garden , where Alice could see it trying in a helpless sort of way to fly up into # NSg/VB/J+ . NSg/R/C NPr+ NSg/VXB NSg/VB NPr/ISg+ Nᴹ/Vg/J NPr/J/R/P D/P J NSg/VB P NSg/J+ P NSg/VB/J NSg/VB/J/P P > a tree . # D/P NSg/VB+ . > # > By the time she had caught the flamingo and brought it back , the fight was over , # NSg/P D+ N🅪Sg/VB/J+ ISg+ VP VP/J D NSg/J VB/C VP NPr/ISg+ NSg/VB/J . D NSg/VB+ VLPt NSg/J/P . > and both the hedgehogs were out of sight : “ but it doesn’t matter much , ” thought # VB/C I/C/Dq D NPl/V3 NSg/VLPt NSg/VB/J/R/P P N🅪Sg/VB+ . . NSg/C/P NPr/ISg+ VX3 N🅪Sg/VB+ NSg/I/J/R/Dq . . N🅪Sg/VP > Alice , “ as all the arches are gone from this side of the ground . ” So she tucked # NPr+ . . R/C/P NSg/I/J/C/Dq D NPl/V3 VLB VPp/J/P P I/Ddem NSg/VB/J P D N🅪Sg/VB/J+ . . NSg/I/J/R/C ISg+ VP/J > it away under her arm , that it might not escape again , and went back for a # NPr/ISg+ VB/J NSg/J/P ISg/D$+ NSg/VB/J+ . NSg/I/C/Ddem NPr/ISg+ Nᴹ/VXB/J NSg/R/C N🅪Sg/VB P . VB/C NSg/VPt NSg/VB/J R/C/P D/P > little more conversation with her friend . # NPr/I/J/Dq NPr/I/J/R/Dq N🅪Sg/VB P ISg/D$+ NPr/VB/J+ . > # > When she got back to the Cheshire Cat , she was surprised to find quite a large # NSg/I/C ISg+ VP NSg/VB/J P D NPr NSg/VB/J+ . ISg+ VLPt VP/J P NSg/VB R D/P NSg/J > crowd collected round it : there was a dispute going on between the executioner , # NSg/VB+ VP/J NSg/VB/J/P NPr/ISg+ . R+ VLPt D/P NSg/VB+ Nᴹ/Vg/J J/P NSg/P D NSg . > the King , and the Queen , who were all talking at once , while all the rest were # D NPr/VB/J+ . VB/C D NPr/VB/J+ . NPr/I+ NSg/VLPt NSg/I/J/C/Dq Nᴹ/Vg/J+ NSg/P NSg/C . NSg/VB/C/P NSg/I/J/C/Dq D NSg/VB+ NSg/VLPt > quite silent , and looked very uncomfortable . # R NSg/J . VB/C VP/J J/R J . > # > The moment Alice appeared , she was appealed to by all three to settle the # D+ NSg+ NPr+ VP/J . ISg+ VLPt VP/J P NSg/P NSg/I/J/C/Dq NSg P NSg/VB D+ > question , and they repeated their arguments to her , though , as they all spoke at # NSg/VB+ . VB/C IPl+ VP/J D$+ NPl/V3+ P ISg/D$+ . C . R/C/P IPl+ NSg/I/J/C/Dq+ NSg/VPt+ NSg/P > once , she found it very hard indeed to make out exactly what they said . # NSg/C . ISg+ NSg/VP NPr/ISg+ J/R N🅪Sg/J/R R P NSg/VB NSg/VB/J/R/P R NSg/I+ IPl+ VP/J . > # > The executioner’s argument was , that you couldn’t cut off a head unless there # D NSg$ N🅪Sg/VB+ VLPt . NSg/I/C/Ddem ISgPl+ VXB NSg/VBP/J NSg/VB/J/P D/P NPr/VB/J+ C R+ > was a body to cut it off from : that he had never had to do such a thing before , # VLPt D/P NSg/VB+ P NSg/VBP/J NPr/ISg+ NSg/VB/J/P P . NSg/I/C/Ddem NPr/ISg+ VP R VP P VXB NSg/I D/P NSg+ C/P . > and he wasn’t going to begin at his time of life . # VB/C NPr/ISg+ VPt Nᴹ/Vg/J P NSg/VB NSg/P ISg/D$+ N🅪Sg/VB/J P N🅪Sg/VB+ . > # > The King’s argument was , that anything that had a head could be beheaded , and # D NPr$ N🅪Sg/VB+ VLPt . NSg/I/C/Ddem NSg/I/VB+ NSg/I/C/Ddem+ VP D/P NPr/VB/J+ NSg/VXB NSg/VLXB VP/J . VB/C > that you weren’t to talk nonsense . # NSg/I/C/Ddem ISgPl+ VPt P N🅪Sg/VB Nᴹ/VB/J+ . > # > The Queen’s argument was , that if something wasn’t done about it in less than no # D NPr$ N🅪Sg/VB+ VLPt . NSg/I/C/Ddem NSg/C NSg/I/J+ VPt NSg/VPp/J J/P NPr/ISg+ NPr/J/R/P VB/J/R/C/P C/P NSg/Dq/P > time she’d have everybody executed , all round . ( It was this last remark that had # N🅪Sg/VB/J+ K NSg/VXB NSg/I+ VP/J . NSg/I/J/C/Dq NSg/VB/J/P . . NPr/ISg+ VLPt I/Ddem NSg/VB/J NSg/VB NSg/I/C/Ddem+ VP > made the whole party look so grave and anxious . ) # VP D+ NSg/J+ NSg/VB/J+ NSg/VB NSg/I/J/R/C NSg/VB/J+ VB/C J . . > # > Alice could think of nothing else to say but “ It belongs to the Duchess : you’d # NPr+ NSg/VXB NSg/VB P NSg/I/J+ NSg/J/C P NSg/VB NSg/C/P . NPr/ISg+ V3 P D NSg/VB . K > better ask her about it . ” # NSg/VXB/JC NSg/VB ISg/D$+ J/P NPr/ISg+ . . > # > “ She’s in prison , ” the Queen said to the executioner : “ fetch her here . ” And the # . K NPr/J/R/P NSg/VB+ . . D NPr/VB/J+ VP/J P D NSg . . NSg/VB ISg/D$+ J/R . . VB/C D > executioner went off like an arrow . # NSg NSg/VPt+ NSg/VB/J/P NSg/VB/J/C/P D/P NSg/VB+ . > # > The Cat’s head began fading away the moment he was gone , and , by the time he had # D NSg$ NPr/VB/J+ VPt Nᴹ/Vg/J VB/J D NSg+ NPr/ISg+ VLPt VPp/J/P . VB/C . NSg/P D N🅪Sg/VB/J+ NPr/ISg+ VP > come back with the Duchess , it had entirely disappeared ; so the King and the # NSg/VBPp/P NSg/VB/J P D NSg/VB . NPr/ISg+ VP R VP/J . NSg/I/J/R/C D NPr/VB/J+ VB/C D > executioner ran wildly up and down looking for it , while the rest of the party # NSg NSg/VPt R NSg/VB/J/P VB/C N🅪Sg/VB/J/P Nᴹ/Vg/J R/C/P NPr/ISg+ . NSg/VB/C/P D NSg/VB P D NSg/VB/J+ > went back to the game . # NSg/VPt NSg/VB/J P D NSg/VB/J+ . > # > CHAPTER IX : The Mock Turtle’s Story # HeadingStart NSg/VB+ #r . D NSg/VB/J NSg$ NSg/VB+ > # > “ You can’t think how glad I am to see you again , you dear old thing ! ” said the # . ISgPl+ VXB NSg/VB NSg/C NSg/VB/J ISg/#r+ NPr/VLB/J P NSg/VB ISgPl+ P . ISgPl+ NSg/VB/J NSg/J NSg+ . . VP/J D > Duchess , as she tucked her arm affectionately into Alice’s , and they walked off # NSg/VB . R/C/P ISg+ VP/J ISg/D$+ NSg/VB/J+ R P NPr$ . VB/C IPl+ VP/J NSg/VB/J/P > together . # J . > # > Alice was very glad to find her in such a pleasant temper , and thought to # NPr+ VLPt J/R NSg/VB/J P NSg/VB ISg/D$+ NPr/J/R/P NSg/I+ D/P+ NSg/J+ NSg/VB/JC+ . VB/C N🅪Sg/VP P > herself that perhaps it was only the pepper that had made her so savage when # ISg+ NSg/I/C/Ddem+ NSg/R NPr/ISg+ VLPt J/R/C D+ N🅪Sg/VB+ NSg/I/C/Ddem+ VP VP ISg/D$+ NSg/I/J/R/C NPr/VB/J+ NSg/I/C > they met in the kitchen . # IPl+ VP NPr/J/R/P D+ NSg/VB+ . > # > “ When I’m a Duchess , ” she said to herself , ( not in a very hopeful tone though ) , # . NSg/I/C K D/P NSg/VB . . ISg+ VP/J P ISg+ . . NSg/R/C NPr/J/R/P D/P J/R NSg/J N🅪Sg/I/VB+ C . . > “ I won’t have any pepper in my kitchen at all . Soup does very well without — Maybe # . ISg/#r+ VXB NSg/VXB I/R/Dq N🅪Sg/VB+ NPr/J/R/P D$+ NSg/VB+ NSg/P NSg/I/J/C/Dq . N🅪Sg/VB+ NPl/VX3 J/R NSg/VB/J/R C/P . NSg/J/R > it’s always pepper that makes people hot - tempered , ” she went on , very much # K R N🅪Sg/VB NSg/I/C/Ddem+ NPl/V3 NPl/VB+ NSg/VB/J . VP/J . . ISg+ NSg/VPt J/P . J/R NSg/I/J/R/Dq > pleased at having found out a new kind of rule , “ and vinegar that makes them # VP/J NSg/P Nᴹ/Vg/J NSg/VP NSg/VB/J/R/P D/P NSg/J NSg/J P NSg/VB+ . . VB/C NSg/VB+ NSg/I/C/Ddem+ NPl/V3 NSg/IPl+ > sour — and camomile that makes them bitter — and — and barley - sugar and such things # NSg/VB/J . VB/C ? NSg/I/C/Ddem+ NPl/V3 NSg/IPl+ NSg/VB/J . VB/C . VB/C Nᴹ . N🅪Sg/VB VB/C NSg/I NPl+ > that make children sweet - tempered . I only wish people knew that : then they # NSg/I/C/Ddem+ NSg/VB NPl+ NPr/VB/J . VP/J . ISg/#r+ J/R/C NSg/VB NPl/VB+ VPt NSg/I/C/Ddem+ . NSg/J/R/C IPl+ > wouldn’t be so stingy about it , you know — ” # VXB NSg/VLXB NSg/I/J/R/C J J/P NPr/ISg+ . ISgPl+ VB . . > # > She had quite forgotten the Duchess by this time , and was a little startled when # ISg+ VP R NSg/VPp/J D NSg/VB NSg/P I/Ddem N🅪Sg/VB/J+ . VB/C VLPt D/P NPr/I/J/Dq VP/J NSg/I/C > she heard her voice close to her ear . “ You’re thinking about something , my dear , # ISg+ VP/J ISg/D$+ NSg/VB+ NSg/VB/J P ISg/D$+ NSg/VB/J+ . . K Nᴹ/Vg/J J/P NSg/I/J+ . D$+ NSg/VB/J . > and that makes you forget to talk . I can’t tell you just now what the moral of # VB/C NSg/I/C/Ddem+ NPl/V3 ISgPl+ VB P N🅪Sg/VB . ISg/#r+ VXB NPr/VB ISgPl+ J/R NSg/J/R/C NSg/I+ D NSg/VB/J P > that is , but I shall remember it in a bit . ” # NSg/I/C/Ddem+ VL3 . NSg/C/P ISg/#r+ VXB NSg/VB NPr/ISg+ NPr/J/R/P D/P NSg/VPt+ . . > # > “ Perhaps it hasn’t one , ” Alice ventured to remark . # . NSg/R NPr/ISg+ V3 NSg/I/J . . NPr+ VP/J P NSg/VB . > # > “ Tut , tut , child ! ” said the Duchess . “ Everything’s got a moral , if only you can # . NPr/VB . NPr/VB . NSg/VB+ . . VP/J D NSg/VB . . NSg$ VP D/P NSg/VB/J . NSg/C J/R/C ISgPl+ NPr/VXB > find it . ” And she squeezed herself up closer to Alice’s side as she spoke . # NSg/VB NPr/ISg+ . . VB/C ISg+ VP/J ISg+ NSg/VB/J/P NSg/JC P NPr$ NSg/VB/J+ R/C/P ISg+ NSg/VPt . > # > Alice did not much like keeping so close to her : first , because the Duchess was # NPr+ VXPt NSg/R/C NSg/I/J/R/Dq NSg/VB/J/C/P Nᴹ/Vg/J NSg/I/J/R/C NSg/VB/J P ISg/D$+ . NSg/J . C/P D NSg/VB VLPt > very ugly ; and secondly , because she was exactly the right height to rest her # J/R NSg/VB/J . VB/C R . C/P ISg+ VLPt R D NPr/VB/J N🅪Sg+ P NSg/VB ISg/D$+ > chin upon Alice’s shoulder , and it was an uncomfortably sharp chin . However , she # NPr/VB+ P NPr$ NSg/VB+ . VB/C NPr/ISg+ VLPt D/P R NPr/VB/J NPr/VB+ . C . ISg+ > did not like to be rude , so she bore it as well as she could . # VXPt NSg/R/C NSg/VB/J/C/P P NSg/VLXB J . NSg/I/J/R/C ISg+ NSg/VBPt NPr/ISg+ R/C/P NSg/VB/J/R R/C/P ISg+ NSg/VXB . > # > “ The game’s going on rather better now , ” she said , by way of keeping up the # . D NSg$ Nᴹ/Vg/J J/P NPr/VB/J/R NSg/VXB/JC NSg/J/R/C . . ISg+ VP/J . NSg/P NSg/J P Nᴹ/Vg/J NSg/VB/J/P D > conversation a little . # N🅪Sg/VB+ D/P NPr/I/J/Dq . > # > “ ’ Tis so , ” said the Duchess : “ and the moral of that is — ‘ Oh , ’ tis love , ’ tis # . . ? NSg/I/J/R/C . . VP/J D NSg/VB . . VB/C D NSg/VB/J P NSg/I/C/Ddem+ VL3 . Unlintable NPr/VB . . ? NPr🅪Sg/VB . . ? > love , that makes the world go round ! ’ ” # NPr🅪Sg/VB . NSg/I/C/Ddem+ NPl/V3 D NSg/VB+ NSg/VB/J NSg/VB/J/P . . . > # > “ Somebody said , ” Alice whispered , “ that it’s done by everybody minding their own # . NSg/I+ VP/J . . NPr+ VP/J . . NSg/I/C/Ddem+ K NSg/VPp/J NSg/P NSg/I+ Nᴹ/Vg/J D$+ NSg/VB/J > business ! ” # N🅪Sg/J+ . . > # > “ Ah , well ! It means much the same thing , ” said the Duchess , digging her sharp # . NSg/I/VB . NSg/VB/J/R . NPr/ISg+ NPl/V3 NSg/I/J/R/Dq D+ I/J+ NSg+ . . VP/J D NSg/VB . NSg/Vg ISg/D$+ NPr/VB/J > little chin into Alice’s shoulder as she added , “ and the moral of that is — ‘ Take # NPr/I/J/Dq NPr/VB+ P NPr$ NSg/VB+ R/C/P ISg+ VP/J . . VB/C D NSg/VB/J P NSg/I/C/Ddem+ VL3 . Unlintable NSg/VB > care of the sense , and the sounds will take care of themselves . ’ ” # N🅪Sg/VB P D N🅪Sg/VB+ . VB/C D NPl/V3+ NPr/VXB NSg/VB N🅪Sg/VB P IPl+ . . . > # > “ How fond she is of finding morals in things ! ” Alice thought to herself . # . NSg/C NSg/VB/J ISg+ VL3 P Nᴹ/Vg/J NPl/V3 NPr/J/R/P NPl+ . . NPr+ N🅪Sg/VP P ISg+ . > # > “ I dare say you’re wondering why I don’t put my arm round your waist , ” the # . ISg/#r+ NPr/VXB NSg/VB K Nᴹ/Vg/J NSg/VB ISg/#r+ VXB NSg/VBP D$+ NSg/VB/J+ NSg/VB/J/P D$+ NSg+ . . D > Duchess said after a pause : “ the reason is , that I’m doubtful about the temper # NSg/VB VP/J P D/P NSg/VB+ . . D N🅪Sg/VB+ VL3 . NSg/I/C/Ddem+ K NSg/J J/P D NSg/VB/JC > of your flamingo . Shall I try the experiment ? ” # P D$+ NSg/J . VXB ISg/#r+ NSg/VB/J D+ NSg/VB+ . . > # > “ He might bite , ” Alice cautiously replied , not feeling at all anxious to have # . NPr/ISg+ Nᴹ/VXB/J NSg/VB . . NPr+ R VP/J . NSg/R/C N🅪Sg/Vg/J NSg/P NSg/I/J/C/Dq+ J+ P NSg/VXB > the experiment tried . # D+ NSg/VB+ VP/J . > # > “ Very true , ” said the Duchess : “ flamingoes and mustard both bite . And the moral # . J/R NSg/VB/J . . VP/J D NSg/VB . . NPl VB/C Nᴹ/J I/C/Dq NSg/VB . VB/C D NSg/VB/J > of that is — ‘ Birds of a feather flock together . ’ ” # P NSg/I/C/Ddem+ VL3 . Unlintable NPl/V3 P D/P+ NSg/VB+ NSg/VB+ J . . . > # > “ Only mustard isn’t a bird , ” Alice remarked . # . J/R/C Nᴹ/J NSg/VX3 D/P NPr/VB/J+ . . NPr+ VP/J . > # > “ Right , as usual , ” said the Duchess : “ what a clear way you have of putting # . NPr/VB/J . R/C/P NSg/J . . VP/J D NSg/VB . . NSg/I+ D/P NSg/VB/J NSg/J+ ISgPl+ NSg/VXB P Nᴹ/Vg/J > things ! ” # NPl+ . . > # > “ It’s a mineral , I think , ” said Alice . # . K D/P+ NSg/J+ . ISg/#r+ NSg/VB . . VP/J NPr+ . > # > “ Of course it is , ” said the Duchess , who seemed ready to agree to everything # . P NSg/VB+ NPr/ISg+ VL3 . . VP/J D NSg/VB . NPr/I+ VP/J NSg/VB/J P VB P NSg/I/VB+ > that Alice said ; “ there’s a large mustard - mine near here . And the moral of that # NSg/I/C/Ddem NPr+ VP/J . . K D/P NSg/J Nᴹ/J . NSg/I/VB+ NSg/VB/J/P J/R . VB/C D NSg/VB/J P NSg/I/C/Ddem+ > is — ‘ The more there is of mine , the less there is of yours . ’ ” # VL3 . Unlintable D NPr/I/J/R/Dq R VL3 P NSg/I/VB+ . D VB/J/R/C/P R VL3 P I+ . . . > # > “ Oh , I know ! ” exclaimed Alice , who had not attended to this last remark , “ it’s a # . NPr/VB . ISg/#r+ VB . . VP/J NPr+ . NPr/I+ VP NSg/R/C VP/J P I/Ddem+ NSg/VB/J+ NSg/VB+ . . K D/P+ > vegetable . It doesn’t look like one , but it is . ” # NSg/J+ . NPr/ISg+ VX3 NSg/VB NSg/VB/J/C/P NSg/I/J . NSg/C/P NPr/ISg+ VL3 . . > # > “ I quite agree with you , ” said the Duchess ; “ and the moral of that is — ‘ Be what # . ISg/#r+ R VB P ISgPl+ . . VP/J D NSg/VB . . VB/C D NSg/VB/J P NSg/I/C/Ddem+ VL3 . Unlintable NSg/VLXB NSg/I+ > you would seem to be ’ — or if you’d like it put more simply — ‘ Never imagine # ISgPl+ VXB VB P NSg/VLXB . . NPr/C NSg/C K NSg/VB/J/C/P NPr/ISg+ NSg/VBP NPr/I/J/R/Dq R . Unlintable R NSg/VB > yourself not to be otherwise than what it might appear to others that what you # ISg+ NSg/R/C P NSg/VLXB J/R C/P NSg/I+ NPr/ISg+ Nᴹ/VXB/J VB P NPl/V3 NSg/I/C/Ddem NSg/I+ ISgPl+ > were or might have been was not otherwise than what you had been would have # NSg/VLPt NPr/C Nᴹ/VXB/J NSg/VXB NSg/VLPp VLPt NSg/R/C J/R C/P NSg/I+ ISgPl+ VP NSg/VLPp VXB NSg/VXB > appeared to them to be otherwise . ’ ” # VP/J P NSg/IPl+ P NSg/VLXB J/R . . . > # > “ I think I should understand that better , ” Alice said very politely , “ if I had # . ISg/#r+ NSg/VB ISg/#r+ VXB VB NSg/I/C/Ddem NSg/VXB/JC . . NPr+ VP/J J/R R . . NSg/C ISg/#r+ VP > it written down : but I can’t quite follow it as you say it . ” # NPr/ISg+ VPp/J N🅪Sg/VB/J/P . NSg/C/P ISg/#r+ VXB R NSg/VB NPr/ISg+ R/C/P ISgPl+ NSg/VB NPr/ISg+ . . > # > “ That’s nothing to what I could say if I chose , ” the Duchess replied , in a # . NSg$ NSg/I/J+ P NSg/I+ ISg/#r+ NSg/VXB NSg/VB NSg/C ISg/#r+ NSg/VPt . . D NSg/VB VP/J . NPr/J/R/P D/P > pleased tone . # VP/J N🅪Sg/I/VB+ . > # > “ Pray don’t trouble yourself to say it any longer than that , ” said Alice . # . VB VXB N🅪Sg/VB+ ISg+ P NSg/VB NPr/ISg+ I/R/Dq NSg/JC C/P NSg/I/C/Ddem+ . . VP/J NPr+ . > # > “ Oh , don’t talk about trouble ! ” said the Duchess . “ I make you a present of # . NPr/VB . VXB N🅪Sg/VB J/P N🅪Sg/VB+ . . VP/J D NSg/VB . . ISg/#r+ NSg/VB ISgPl+ D/P NSg/VB/J P > everything I’ve said as yet . ” # NSg/I/VB+ K VP/J R/C/P NSg/VB/C . . > # > “ A cheap sort of present ! ” thought Alice . “ I’m glad they don’t give birthday # . D/P NSg/VB/J NSg/VB P NSg/VB/J . . N🅪Sg/VP NPr+ . . K NSg/VB/J IPl+ VXB NSg/VB NSg/VB+ > presents like that ! ” But she did not venture to say it out loud . # NPl/V3+ NSg/VB/J/C/P NSg/I/C/Ddem+ . . NSg/C/P ISg+ VXPt NSg/R/C NSg/VB+ P NSg/VB NPr/ISg+ NSg/VB/J/R/P NSg/J . > # > “ Thinking again ? ” the Duchess asked , with another dig of her sharp little chin . # . Nᴹ/Vg/J P . . D NSg/VB VP/J . P I/D NSg/VB P ISg/D$+ NPr/VB/J NPr/I/J/Dq NPr/VB+ . > # > “ I’ve a right to think , ” said Alice sharply , for she was beginning to feel a # . K D/P NPr/VB/J+ P NSg/VB . . VP/J NPr+ R . R/C/P ISg+ VLPt NSg/Vg/J+ P NSg/I/VB D/P > little worried . # NPr/I/J/Dq VP/J . > # > “ Just about as much right , ” said the Duchess , “ as pigs have to fly ; and the m — ” # . J/R J/P R/C/P NSg/I/J/R/Dq NPr/VB/J . . VP/J D NSg/VB . . R/C/P NPl/V3+ NSg/VXB P NSg/VB/J . VB/C D NPr/VB/J/#r . . > # > But here , to Alice’s great surprise , the Duchess’s voice died away , even in the # NSg/C/P J/R . P NPr$ NSg/J+ NSg/VB+ . D NSg$ NSg/VB+ VP/J VB/J . NSg/VB/J/R NPr/J/R/P D > middle of her favourite word ‘ moral , ’ and the arm that was linked into hers # NSg/VB/J P ISg/D$+ NSg/VB/J/Comm NSg/VB+ Unlintable NSg/VB/J . . VB/C D NSg/VB/J+ NSg/I/C/Ddem+ VLPt VP/J P ISg+ > began to tremble . Alice looked up , and there stood the Queen in front of them , # VPt P NSg/VB . NPr+ VP/J NSg/VB/J/P . VB/C R+ VP D NPr/VB/J+ NPr/J/R/P NSg/VB/J P NSg/IPl+ . > with her arms folded , frowning like a thunderstorm . # P ISg/D$+ NPl/V3+ VP/J . Nᴹ/Vg/J NSg/VB/J/C/P D/P NSg . > # > “ A fine day , your Majesty ! ” the Duchess began in a low , weak voice . # . D/P+ NSg/VB/J+ NPr🅪Sg+ . D$+ N🅪Sg/I+ . . D NSg/VB VPt NPr/J/R/P D/P NSg/VB/J/R . J NSg/VB+ . > # > “ Now , I give you fair warning , ” shouted the Queen , stamping on the ground as she # . NSg/J/R/C . ISg/#r+ NSg/VB ISgPl+ NSg/VB/J+ N🅪Sg/Vg/J+ . . VP/J D+ NPr/VB/J+ . NSg J/P D+ N🅪Sg/VB/J+ R/C/P ISg+ > spoke ; “ either you or your head must be off , and that in about half no time ! # NSg/VPt . . I/C ISgPl+ NPr/C D$+ NPr/VB/J+ NSg/VXB NSg/VLXB NSg/VB/J/P . VB/C NSg/I/C/Ddem+ NPr/J/R/P J/P N🅪Sg/J/P+ NSg/Dq/P+ N🅪Sg/VB/J+ . > Take your choice ! ” # NSg/VB D$+ N🅪Sg/J+ . . > # > The Duchess took her choice , and was gone in a moment . # D NSg/VB VPt ISg/D$+ N🅪Sg/J+ . VB/C VLPt VPp/J/P NPr/J/R/P D/P NSg+ . > # > “ Let’s go on with the game , ” the Queen said to Alice ; and Alice was too much # . NSg$ NSg/VB/J J/P P D NSg/VB/J+ . . D NPr/VB/J+ VP/J P NPr+ . VB/C NPr+ VLPt R NSg/I/J/R/Dq > frightened to say a word , but slowly followed her back to the croquet - ground . # VP/J P NSg/VB D/P NSg/VB+ . NSg/C/P R VP/J ISg/D$+ NSg/VB/J P D NSg/VB . N🅪Sg/VB/J+ . > # > The other guests had taken advantage of the Queen’s absence , and were resting in # D+ NSg/VB/J+ NPl/V3+ VP VPp/J N🅪Sg/VB P D NPr$ N🅪Sg+ . VB/C NSg/VLPt Nᴹ/Vg/J NPr/J/R/P > the shade : however , the moment they saw her , they hurried back to the game , the # D N🅪Sg/VB+ . C . D NSg+ IPl+ NSg/VPt ISg/D$+ . IPl+ VP/J NSg/VB/J P D NSg/VB/J+ . D > Queen merely remarking that a moment’s delay would cost them their lives . # NPr/VB/J+ R Nᴹ/Vg/J NSg/I/C/Ddem D/P NSg$ NSg/VBPt/J+ VXB N🅪Sg/VBP/J NSg/IPl+ D$+ V3+ . > # > All the time they were playing the Queen never left off quarrelling with the # NSg/I/J/C/Dq+ D+ N🅪Sg/VB/J+ IPl+ NSg/VLPt Nᴹ/Vg/J D+ NPr/VB/J+ R NPr/VP/J NSg/VB/J/P Nᴹ/Vg/Comm P D > other players , and shouting “ Off with his head ! ” or “ Off with her head ! ” Those # NSg/VB/J NPl+ . VB/C Nᴹ/Vg/J+ . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . . NPr/C . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . . I/Ddem+ > whom she sentenced were taken into custody by the soldiers , who of course had to # I+ ISg+ VP/J NSg/VLPt VPp/J P Nᴹ+ NSg/P D NPl/V3+ . NPr/I P NSg/VB+ VP P > leave off being arches to do this , so that by the end of half an hour or so # NSg/VB NSg/VB/J/P N🅪Sg/VLg/J/C NPl/V3 P VXB I/Ddem+ . NSg/I/J/R/C NSg/I/C/Ddem+ NSg/P D NSg/VB P N🅪Sg/J/P+ D/P NSg+ NPr/C NSg/I/J/R/C > there were no arches left , and all the players , except the King , the Queen , and # R+ NSg/VLPt NSg/Dq/P NPl/V3 NPr/VP/J . VB/C NSg/I/J/C/Dq D NPl+ . VB/C/P D NPr/VB/J+ . D NPr/VB/J+ . VB/C > Alice , were in custody and under sentence of execution . # NPr+ . NSg/VLPt NPr/J/R/P Nᴹ+ VB/C NSg/J/P NSg/VB P N🅪Sg+ . > # > Then the Queen left off , quite out of breath , and said to Alice , “ Have you seen # NSg/J/R/C D+ NPr/VB/J+ NPr/VP/J+ NSg/VB/J/P . R NSg/VB/J/R/P P N🅪Sg/VB/J+ . VB/C VP/J P NPr+ . . NSg/VXB ISgPl+ NSg/VPp > the Mock Turtle yet ? ” # D+ NSg/VB/J+ NSg/VB+ NSg/VB/C . . > # > “ No , ” said Alice . “ I don’t even know what a Mock Turtle is . ” # . NSg/Dq/P . . VP/J NPr+ . . ISg/#r+ VXB NSg/VB/J/R VB NSg/I+ D/P NSg/VB/J NSg/VB+ VL3 . . > # > “ It’s the thing Mock Turtle Soup is made from , ” said the Queen . # . K D+ NSg+ NSg/VB/J+ NSg/VB+ N🅪Sg/VB+ VL3 VP P . . VP/J D NPr/VB/J+ . > # > “ I never saw one , or heard of one , ” said Alice . # . ISg/#r+ R NSg/VPt NSg/I/J . NPr/C VP/J P NSg/I/J . . VP/J NPr+ . > # > “ Come on , then , ” said the Queen , “ and he shall tell you his history . ” # . NSg/VBPp/P J/P . NSg/J/R/C . . VP/J D+ NPr/VB/J+ . . VB/C NPr/ISg+ VXB NPr/VB ISgPl+ ISg/D$+ N🅪Sg+ . . > # > As they walked off together , Alice heard the King say in a low voice , to the # R/C/P IPl+ VP/J NSg/VB/J/P J . NPr+ VP/J D+ NPr/VB/J+ NSg/VB NPr/J/R/P D/P+ NSg/VB/J/R+ NSg/VB+ . P D+ > company generally , “ You are all pardoned . ” “ Come , that’s a good thing ! ” she said # N🅪Sg+ R . . ISgPl+ VLB NSg/I/J/C/Dq VP/J . . . NSg/VBPp/P . NSg$ D/P+ NPr/VB/J NSg+ . . ISg+ VP/J > to herself , for she had felt quite unhappy at the number of executions the Queen # P ISg+ . R/C/P ISg+ VP N🅪Sg/VP/J R NSg/VB/J NSg/P D N🅪Sg/VB/JC P NPl+ D+ NPr/VB/J+ > had ordered . # VP VP/J . > # > They very soon came upon a Gryphon , lying fast asleep in the sun . ( If you don’t # IPl+ J/R J/R NSg/VPt/P P D/P ? . Nᴹ/Vg/J NSg/VB/J/R J NPr/J/R/P D NPr/VB+ . . NSg/C ISgPl+ VXB > know what a Gryphon is , look at the picture . ) “ Up , lazy thing ! ” said the Queen , # VB NSg/I+ D/P ? VL3 . NSg/VB NSg/P D NSg/VB+ . . . NSg/VB/J/P . NSg/VB/J+ NSg+ . . VP/J D+ NPr/VB/J+ . > “ and take this young lady to see the Mock Turtle , and to hear his history . I # . VB/C NSg/VB I/Ddem+ NPr/VB/J NPr/VB+ P NSg/VB D+ NSg/VB/J+ NSg/VB+ . VB/C P VB ISg/D$+ N🅪Sg+ . ISg/#r+ > must go back and see after some executions I have ordered ; ” and she walked off , # NSg/VXB NSg/VB/J NSg/VB/J VB/C NSg/VB P I/J/R/Dq+ NPl+ ISg/#r+ NSg/VXB VP/J . . VB/C ISg+ VP/J NSg/VB/J/P . > leaving Alice alone with the Gryphon . Alice did not quite like the look of the # Nᴹ/Vg/J NPr+ J P D ? . NPr+ VXPt NSg/R/C R NSg/VB/J/C/P D NSg/VB P D+ > creature , but on the whole she thought it would be quite as safe to stay with it # NSg+ . NSg/C/P J/P D+ NSg/J ISg+ N🅪Sg/VP NPr/ISg+ VXB NSg/VLXB R R/C/P NSg/VB/J P NSg/VB/J P NPr/ISg+ > as to go after that savage Queen : so she waited . # R/C/P P NSg/VB/J P NSg/I/C/Ddem NPr/VB/J+ NPr/VB/J+ . NSg/I/J/R/C ISg+ VP/J . > # > The Gryphon sat up and rubbed its eyes : then it watched the Queen till she was # D ? NSg/VP/J NSg/VB/J/P VB/C VP/J ISg/D$+ NPl/V3+ . NSg/J/R/C NPr/ISg+ VP/J D NPr/VB/J+ NSg/VB/C/P ISg+ VLPt > out of sight : then it chuckled . “ What fun ! ” said the Gryphon , half to itself , # NSg/VB/J/R/P P N🅪Sg/VB+ . NSg/J/R/C NPr/ISg+ VP/J . . NSg/I+ Nᴹ/VB/J . . VP/J D ? . N🅪Sg/J/P+ P ISg+ . > half to Alice . # N🅪Sg/J/P+ P NPr+ . > # > “ What is the fun ? ” said Alice . # . NSg/I+ VL3 D Nᴹ/VB/J . . VP/J NPr+ . > # > “ Why , she , ” said the Gryphon . “ It’s all her fancy , that : they never executes # . NSg/VB . ISg+ . . VP/J D ? . . K NSg/I/J/C/Dq ISg/D$+ NSg/VB/J . NSg/I/C/Ddem+ . IPl+ R V3 > nobody , you know . Come on ! ” # NSg/I+ . ISgPl+ VB . NSg/VBPp/P J/P . . > # > “ Everybody says ‘ come on ! ’ here , ” thought Alice , as she went slowly after it : “ I # . NSg/I+ NPl/V3 Unlintable NSg/VBPp/P J/P . . J/R . . N🅪Sg/VP NPr+ . R/C/P ISg+ NSg/VPt R P NPr/ISg+ . . ISg/#r+ > never was so ordered about in all my life , never ! ” # R VLPt NSg/I/J/R/C VP/J J/P NPr/J/R/P NSg/I/J/C/Dq+ D$+ N🅪Sg/VB+ . R . . > # > They had not gone far before they saw the Mock Turtle in the distance , sitting # IPl+ VP NSg/R/C VPp/J/P NSg/VB/J C/P IPl+ NSg/VPt D NSg/VB/J NSg/VB+ NPr/J/R/P D+ N🅪Sg/VB+ . NSg/Vg/J > sad and lonely on a little ledge of rock , and , as they came nearer , Alice could # NSg/VB/J VB/C J/R J/P D/P NPr/I/J/Dq NSg/VB P NPr🅪Sg/VB+ . VB/C . R/C/P IPl+ NSg/VPt/P NSg/JC . NPr+ NSg/VXB > hear him sighing as if his heart would break . She pitied him deeply . “ What is # VB ISg+ Nᴹ/Vg/J R/C/P NSg/C ISg/D$+ N🅪Sg/VB+ VXB NSg/VB+ . ISg+ VP/J ISg+ R . . NSg/I+ VL3 > his sorrow ? ” she asked the Gryphon , and the Gryphon answered , very nearly in the # ISg/D$+ N🅪Sg/VB . . ISg+ VP/J D ? . VB/C D ? VP/J . J/R R NPr/J/R/P D > same words as before , “ It’s all his fancy , that : he hasn’t got no sorrow , you # I/J NPl/V3+ R/C/P C/P . . K NSg/I/J/C/Dq ISg/D$+ NSg/VB/J . NSg/I/C/Ddem+ . NPr/ISg+ V3 VP NSg/Dq/P N🅪Sg/VB . ISgPl+ > know . Come on ! ” # VB . NSg/VBPp/P J/P . . > # > So they went up to the Mock Turtle , who looked at them with large eyes full of # NSg/I/J/R/C IPl+ NSg/VPt NSg/VB/J/P P D+ NSg/VB/J+ NSg/VB+ . NPr/I+ VP/J NSg/P NSg/IPl+ P NSg/J NPl/V3 NSg/VB/J P > tears , but said nothing . # NPl/V3+ . NSg/C/P VP/J NSg/I/J+ . > # > “ This here young lady , ” said the Gryphon , “ she wants for to know your history , # . I/Ddem J/R NPr/VB/J+ NPr/VB+ . . VP/J D ? . . ISg+ NPl/V3 R/C/P P VB D$+ N🅪Sg+ . > she do . ” # ISg+ VXB . . > # > “ I’ll tell it her , ” said the Mock Turtle in a deep , hollow tone : “ sit down , both # . K NPr/VB NPr/ISg+ ISg/D$+ . . VP/J D NSg/VB/J NSg/VB+ NPr/J/R/P D/P NSg/J . NSg/VB/J N🅪Sg/I/VB+ . . NSg/VB N🅪Sg/VB/J/P . I/C/Dq > of you , and don’t speak a word till I’ve finished . ” # P ISgPl+ . VB/C VXB NSg/VB D/P NSg/VB+ NSg/VB/C/P K VP/J . . > # > So they sat down , and nobody spoke for some minutes . Alice thought to herself , # NSg/I/J/R/C IPl+ NSg/VP/J N🅪Sg/VB/J/P . VB/C NSg/I+ NSg/VPt R/C/P I/J/R/Dq+ NPl/V3+ . NPr+ N🅪Sg/VP P ISg+ . > “ I don’t see how he can ever finish , if he doesn’t begin . ” But she waited # . ISg/#r+ VXB NSg/VB NSg/C NPr/ISg+ NPr/VXB J/R NSg/VB . NSg/C NPr/ISg+ VX3 NSg/VB . . NSg/C/P ISg+ VP/J > patiently . # R . > # > “ Once , ” said the Mock Turtle at last , with a deep sigh , “ I was a real Turtle . ” # . NSg/C . . VP/J D+ NSg/VB/J+ NSg/VB+ NSg/P NSg/VB/J . P D/P NSg/J NSg/VB . . ISg/#r+ VLPt D/P NSg/J NSg/VB . . > # > These words were followed by a very long silence , broken only by an occasional # I/Ddem+ NPl/V3+ NSg/VLPt VP/J NSg/P D/P J/R NPr/VB/J+ NSg/VB+ . VPp/J J/R/C NSg/P D/P NSg/J > exclamation of “ Hjckrrh ! ” from the Gryphon , and the constant heavy sobbing of # NSg P . ? . . P D ? . VB/C D NSg/J NSg/VB/J NSg/Vg/J P > the Mock Turtle . Alice was very nearly getting up and saying , “ Thank you , sir , # D NSg/VB/J NSg/VB+ . NPr+ VLPt J/R R NSg/Vg NSg/VB/J/P VB/C N🅪Sg/Vg/J . . NSg/VB ISgPl+ . NPr/VB+ . > for your interesting story , ” but she could not help thinking there must be more # R/C/P D$+ Vg/J+ NSg/VB+ . . NSg/C/P ISg+ NSg/VXB NSg/R/C NSg/VB Nᴹ/Vg/J R+ NSg/VXB NSg/VLXB NPr/I/J/R/Dq > to come , so she sat still and said nothing . # P NSg/VBPp/P . NSg/I/J/R/C ISg+ NSg/VP/J NSg/VB/J/R VB/C VP/J NSg/I/J+ . > # > “ When we were little , ” the Mock Turtle went on at last , more calmly , though # . NSg/I/C IPl+ NSg/VLPt NPr/I/J/Dq . . D+ NSg/VB/J+ NSg/VB+ NSg/VPt J/P NSg/P NSg/VB/J . NPr/I/J/R/Dq R . C > still sobbing a little now and then , “ we went to school in the sea . The master # NSg/VB/J/R NSg/Vg/J D/P NPr/I/J/Dq NSg/J/R/C VB/C NSg/J/R/C . . IPl+ NSg/VPt P N🅪Sg/VB NPr/J/R/P D NSg+ . D+ NPr/VB/J+ > was an old Turtle — we used to call him Tortoise — ” # VLPt D/P NSg/J NSg/VB . IPl+ VP/J P NSg/VB ISg+ NSg+ . . > # > “ Why did you call him Tortoise , if he wasn’t one ? ” Alice asked . # . NSg/VB VXPt ISgPl+ NSg/VB ISg+ NSg+ . NSg/C NPr/ISg+ VPt NSg/I/J . . NPr+ VP/J . > # > “ We called him Tortoise because he taught us , ” said the Mock Turtle angrily : # . IPl+ VP/J ISg+ NSg+ C/P NPr/ISg+ VP NPr/IPl+ . . VP/J D+ NSg/VB/J+ NSg/VB+ R . > “ really you are very dull ! ” # . R ISgPl+ VLB J/R VB/J . . > # > “ You ought to be ashamed of yourself for asking such a simple question , ” added # . ISgPl+ NSg/I/VXB P NSg/VLXB J P ISg+ R/C/P Nᴹ/Vg/J NSg/I+ D/P+ NSg/VB/J+ NSg/VB+ . . VP/J > the Gryphon ; and then they both sat silent and looked at poor Alice , who felt # D ? . VB/C NSg/J/R/C IPl+ I/C/Dq NSg/VP/J NSg/J VB/C VP/J NSg/P NSg/VB/J NPr+ . NPr/I+ N🅪Sg/VP/J > ready to sink into the earth . At last the Gryphon said to the Mock Turtle , # NSg/VB/J P NSg/VB P D NPrᴹ/VB+ . NSg/P NSg/VB/J D ? VP/J P D NSg/VB/J NSg/VB+ . > “ Drive on , old fellow ! Don’t be all day about it ! ” and he went on in these # . N🅪Sg/VB J/P . NSg/J NSg . VXB NSg/VLXB NSg/I/J/C/Dq NPr🅪Sg+ J/P NPr/ISg+ . . VB/C NPr/ISg+ NSg/VPt J/P NPr/J/R/P I/Ddem+ > words : # NPl/V3+ . > # > “ Yes , we went to school in the sea , though you mayn’t believe it — ” # . NPl/VB . IPl+ NSg/VPt P N🅪Sg/VB NPr/J/R/P D+ NSg+ . C ISgPl+ VXB VB NPr/ISg+ . . > # > “ I never said I didn’t ! ” interrupted Alice . # . ISg/#r+ R VP/J ISg/#r+ VXPt . . VP/J NPr+ . > # > “ You did , ” said the Mock Turtle . # . ISgPl+ VXPt . . VP/J D+ NSg/VB/J+ NSg/VB+ . > # > “ Hold your tongue ! ” added the Gryphon , before Alice could speak again . The Mock # . NSg/VB/J D$+ N🅪Sg/VB+ . . VP/J D ? . C/P NPr+ NSg/VXB NSg/VB P . D+ NSg/VB/J+ > Turtle went on . # NSg/VB+ NSg/VPt J/P . > # > “ We had the best of educations — in fact , we went to school every day — ” # . IPl+ VP D NPr/VXB/JS P NPl . NPr/J/R/P NSg+ . IPl+ NSg/VPt P N🅪Sg/VB Dq NPr🅪Sg+ . . > # > “ I’ve been to a day - school , too , ” said Alice ; “ you needn’t be so proud as all # . K NSg/VLPp P D/P NPr🅪Sg+ . N🅪Sg/VB+ . R . . VP/J NPr+ . . ISgPl+ VXB NSg/VLXB NSg/I/J/R/C J R/C/P NSg/I/J/C/Dq > that . ” # NSg/I/C/Ddem+ . . > # > “ With extras ? ” asked the Mock Turtle a little anxiously . # . P NPl+ . . VP/J D+ NSg/VB/J+ NSg/VB+ D/P NPr/I/J/Dq R . > # > “ Yes , ” said Alice , “ we learned French and music . ” # . NPl/VB . . VP/J NPr+ . . IPl+ VP/J NPr🅪Sg/VB/J VB/C N🅪Sg/VB/J+ . . > # > “ And washing ? ” said the Mock Turtle . # . VB/C Nᴹ/Vg/J . . VP/J D+ NSg/VB/J+ NSg/VB+ . > # > “ Certainly not ! ” said Alice indignantly . # . R NSg/R/C . . VP/J NPr+ R . > # > “ Ah ! then yours wasn’t a really good school , ” said the Mock Turtle in a tone of # . NSg/I/VB . NSg/J/R/C I+ VPt D/P R NPr/VB/J N🅪Sg/VB+ . . VP/J D NSg/VB/J NSg/VB+ NPr/J/R/P D/P N🅪Sg/I/VB P > great relief . “ Now at ours they had at the end of the bill , ‘ French , music , and # NSg/J NSg/J+ . . NSg/J/R/C NSg/P I+ IPl+ VP NSg/P D NSg/VB P D+ NPr/VB+ . Unlintable NPr🅪Sg/VB/J . N🅪Sg/VB/J+ . VB/C > washing — extra . ’ ” # Nᴹ/Vg/J . NSg/J . . . > # > “ You couldn’t have wanted it much , ” said Alice ; “ living at the bottom of the # . ISgPl+ VXB NSg/VXB VP/J NPr/ISg+ NSg/I/J/R/Dq . . VP/J NPr+ . . Nᴹ/Vg/J NSg/P D NSg/VB/J P D > sea . ” # NSg+ . . > # > “ I couldn’t afford to learn it . ” said the Mock Turtle with a sigh . “ I only took # . ISg/#r+ VXB VB P NSg/VB NPr/ISg+ . . VP/J D+ NSg/VB/J+ NSg/VB+ P D/P NSg/VB . . ISg/#r+ J/R/C VPt > the regular course . ” # D+ NSg/J+ NSg/VB+ . . > # > “ What was that ? ” inquired Alice . # . NSg/I+ VLPt NSg/I/C/Ddem+ . . VP/J NPr+ . > # > “ Reeling and Writhing , of course , to begin with , ” the Mock Turtle replied ; “ and # . Nᴹ/Vg/J VB/C Nᴹ/Vg/J+ . P NSg/VB+ . P NSg/VB P . . D NSg/VB/J NSg/VB+ VP/J . . VB/C > then the different branches of Arithmetic — Ambition , Distraction , Uglification , # NSg/J/R/C D NSg/J NPl/V3 P Nᴹ/J . N🅪Sg/VB+ . N🅪Sg/VB+ . N🅪Sg . > and Derision . ” # VB/C N🅪Sg . . > # > “ I never heard of ‘ Uglification , ’ ” Alice ventured to say . “ What is it ? ” # . ISg/#r+ R VP/J P Unlintable N🅪Sg . . . NPr+ VP/J P NSg/VB . . NSg/I+ VL3 NPr/ISg+ . . > # > The Gryphon lifted up both its paws in surprise . “ What ! Never heard of # D ? VP/J NSg/VB/J/P I/C/Dq ISg/D$+ NPl/V3+ NPr/J/R/P NSg/VB+ . . NSg/I+ . R VP/J P > uglifying ! ” it exclaimed . “ You know what to beautify is , I suppose ? ” # ? . . NPr/ISg+ VP/J . . ISgPl+ VB NSg/I+ P VB VL3 . ISg/#r+ VB . . > # > “ Yes , ” said Alice doubtfully : “ it means — to — make — anything — prettier . ” # . NPl/VB . . VP/J NPr+ R . . NPr/ISg+ NPl/V3 . P . NSg/VB . NSg/I/VB+ . NSg/JC . . > # > “ Well , then , ” the Gryphon went on , “ if you don’t know what to uglify is , you are # . NSg/VB/J/R . NSg/J/R/C . . D ? NSg/VPt J/P . . NSg/C ISgPl+ VXB VB NSg/I+ P ? VL3 . ISgPl+ VLB > a simpleton . ” # D/P NSg . . > # > Alice did not feel encouraged to ask any more questions about it , so she turned # NPr+ VXPt NSg/R/C NSg/I/VB VP/J P NSg/VB I/R/Dq+ NPr/I/J/R/Dq+ NPl/V3+ J/P NPr/ISg+ . NSg/I/J/R/C ISg+ VP/J > to the Mock Turtle , and said “ What else had you to learn ? ” # P D+ NSg/VB/J+ NSg/VB+ . VB/C VP/J . NSg/I+ NSg/J/C VP ISgPl+ P NSg/VB . . > # > “ Well , there was Mystery , ” the Mock Turtle replied , counting off the subjects on # . NSg/VB/J/R . R+ VLPt N🅪Sg+ . . D+ NSg/VB/J+ NSg/VB+ VP/J . Nᴹ/Vg/J NSg/VB/J/P D+ NPl/V3+ J/P > his flappers , “ — Mystery , ancient and modern , with Seaography : then Drawling — the # ISg/D$+ NPl . . . N🅪Sg+ . NSg/J VB/C NSg/J . P ? . NSg/J/R/C Nᴹ/Vg/J . D > Drawling - master was an old conger - eel , that used to come once a week : he taught # Nᴹ/Vg/J . NPr/VB/J+ VLPt D/P NSg/J NSg . NSg/VB . NSg/I/C/Ddem+ VP/J P NSg/VBPp/P NSg/C D/P NSg/J+ . NPr/ISg+ VP > us Drawling , Stretching , and Fainting in Coils . ” # NPr/IPl+ Nᴹ/Vg/J . Nᴹ/Vg/J . VB/C Nᴹ/Vg/J+ NPr/J/R/P NPl/V3+ . . > # > “ What was that like ? ” said Alice . # . NSg/I+ VLPt NSg/I/C/Ddem+ NSg/VB/J/C/P . . VP/J NPr+ . > # > “ Well , I can’t show it you myself , ” the Mock Turtle said : “ I’m too stiff . And # . NSg/VB/J/R . ISg/#r+ VXB NSg/VB NPr/ISg+ ISgPl+ ISg+ . . D NSg/VB/J NSg/VB+ VP/J . . K R NSg/VB/J . VB/C > the Gryphon never learnt it . ” # D ? R VB NPr/ISg+ . . > # > “ Hadn’t time , ” said the Gryphon : “ I went to the Classics master , though . He was # . VPt N🅪Sg/VB/J+ . . VP/J D ? . . ISg/#r+ NSg/VPt P D N🅪Pl+ NPr/VB/J+ . C . NPr/ISg+ VLPt > an old crab , he was . ” # D/P NSg/J NSg/VB . NPr/ISg+ VLPt . . > # > “ I never went to him , ” the Mock Turtle said with a sigh : “ he taught Laughing and # . ISg/#r+ R NSg/VPt P ISg+ . . D+ NSg/VB/J+ NSg/VB+ VP/J P D/P NSg/VB . . NPr/ISg+ VP Nᴹ/Vg/J VB/C > Grief , they used to say . ” # Nᴹ/VB+ . IPl+ VP/J P NSg/VB . . > # > “ So he did , so he did , ” said the Gryphon , sighing in his turn ; and both # . NSg/I/J/R/C NPr/ISg+ VXPt . NSg/I/J/R/C NPr/ISg+ VXPt . . VP/J D ? . Nᴹ/Vg/J NPr/J/R/P ISg/D$+ NSg/VB . VB/C I/C/Dq > creatures hid their faces in their paws . # NPl+ VB D$+ NPl/V3+ NPr/J/R/P D$+ NPl/V3+ . > # > “ And how many hours a day did you do lessons ? ” said Alice , in a hurry to change # . VB/C NSg/C NSg/I/J/Dq+ NPl+ D/P+ NPr🅪Sg+ VXPt ISgPl+ VXB NPl/V3+ . . VP/J NPr+ . NPr/J/R/P D/P+ NSg/VB+ P N🅪Sg/VB > the subject . # D+ NSg/VB/J+ . > # > “ Ten hours the first day , ” said the Mock Turtle : “ nine the next , and so on . ” # . NSg+ NPl+ D+ NSg/J+ NPr🅪Sg+ . . VP/J D+ NSg/VB/J+ NSg/VB+ . . NSg D NSg/J/P . VB/C NSg/I/J/R/C J/P . . > # > “ What a curious plan ! ” exclaimed Alice . # . NSg/I+ D/P+ J+ NSg/VB+ . . VP/J NPr+ . > # > “ That’s the reason they’re called lessons , ” the Gryphon remarked : “ because they # . NSg$ D+ N🅪Sg/VB+ K VP/J NPl/V3+ . . D ? VP/J . . C/P IPl+ > lessen from day to day . ” # VB/C P NPr🅪Sg+ P NPr🅪Sg . . > # > This was quite a new idea to Alice , and she thought it over a little before she # I/Ddem+ VLPt R D/P NSg/J NSg P NPr+ . VB/C ISg+ N🅪Sg/VP NPr/ISg+ NSg/J/P D/P NPr/I/J/Dq C/P ISg+ > made her next remark . “ Then the eleventh day must have been a holiday ? ” # VP ISg/D$+ NSg/J/P+ NSg/VB+ . . NSg/J/R/C D+ NSg/J+ NPr🅪Sg+ NSg/VXB NSg/VXB NSg/VLPp D/P+ NPr/VB+ . . > # > “ Of course it was , ” said the Mock Turtle . # . P NSg/VB+ NPr/ISg+ VLPt . . VP/J D+ NSg/VB/J+ NSg/VB+ . > # > “ And how did you manage on the twelfth ? ” Alice went on eagerly . # . VB/C NSg/C VXPt ISgPl+ NSg/VB J/P D NSg/J . . NPr+ NSg/VPt J/P R . > # > “ That’s enough about lessons , ” the Gryphon interrupted in a very decided tone : # . NSg$ NSg/I J/P NPl/V3+ . . D ? VP/J NPr/J/R/P D/P J/R NSg/VP/J N🅪Sg/I/VB+ . > “ tell her something about the games now . ” # . NPr/VB ISg/D$+ NSg/I/J+ J/P D NPl/V3+ NSg/J/R/C . . > # > CHAPTER X : The Lobster Quadrille # HeadingStart NSg/VB+ NPr/J/#r+ . D+ NSg/VB/J+ NSg/VB/J > # > The Mock Turtle sighed deeply , and drew the back of one flapper across his eyes . # D+ NSg/VB/J+ NSg/VB+ VP/J R . VB/C NPr/VPt D NSg/VB/J P NSg/I/J NSg NSg/P ISg/D$+ NPl/V3+ . > He looked at Alice , and tried to speak , but for a minute or two sobs choked his # NPr/ISg+ VP/J NSg/P NPr+ . VB/C VP/J P NSg/VB . NSg/C/P R/C/P D/P+ NSg/VB/J+ NPr/C NSg NPl/V3 VP/J ISg/D$+ > voice . “ Same as if he had a bone in his throat , ” said the Gryphon : and it set to # NSg/VB+ . . I/J R/C/P NSg/C NPr/ISg+ VP D/P+ N🅪Sg/VB/J+ NPr/J/R/P ISg/D$+ NSg/VB+ . . VP/J D ? . VB/C NPr/ISg+ NPr/VBP/J P > work shaking him and punching him in the back . At last the Mock Turtle recovered # N🅪Sg/VB Nᴹ/Vg/J ISg+ VB/C Nᴹ/Vg/J ISg+ NPr/J/R/P D NSg/VB/J . NSg/P NSg/VB/J D+ NSg/VB/J+ NSg/VB+ VP/J > his voice , and , with tears running down his cheeks , he went on again : — # ISg/D$+ NSg/VB+ . VB/C . P NPl/V3+ Nᴹ/Vg/J/P N🅪Sg/VB/J/P ISg/D$+ NPl/V3+ . NPr/ISg+ NSg/VPt J/P P . . > # > “ You may not have lived much under the sea — ” ( “ I haven’t , ” said Alice ) — “ and # . ISgPl+ NPr/VXB NSg/R/C NSg/VXB VP/J NSg/I/J/R/Dq NSg/J/P D+ NSg+ . . . . ISg/#r+ VXB . . VP/J NPr+ . . . VB/C > perhaps you were never even introduced to a lobster — ” ( Alice began to say “ I # NSg/R ISgPl+ NSg/VLPt R NSg/VB/J/R VP/J P D/P NSg/VB/J+ . . . NPr+ VPt P NSg/VB . ISg/#r+ > once tasted — ” but checked herself hastily , and said “ No , never ” ) “ — so you can # NSg/C VP/J . . NSg/C/P VP/J ISg+ R . VB/C VP/J . NSg/Dq/P . R . . . . NSg/I/J/R/C ISgPl+ NPr/VXB > have no idea what a delightful thing a Lobster Quadrille is ! ” # NSg/VXB NSg/Dq/P NSg+ NSg/I+ D/P J NSg+ D/P NSg/VB/J+ NSg/VB/J VL3 . . > # > “ No , indeed , ” said Alice . “ What sort of a dance is it ? ” # . NSg/Dq/P . R . . VP/J NPr+ . . NSg/I+ NSg/VB P D/P+ N🅪Sg/VB+ VL3 NPr/ISg+ . . > # > “ Why , ” said the Gryphon , “ you first form into a line along the sea - shore — ” # . NSg/VB . . VP/J D ? . . ISgPl+ NSg/J N🅪Sg/VB+ P D/P NSg/VB+ P D NSg+ . NSg/VB+ . . > # > “ Two lines ! ” cried the Mock Turtle . “ Seals , turtles , salmon , and so on ; then , # . NSg+ NPl/V3+ . . VP/J D+ NSg/VB/J+ NSg/VB+ . . NPl/V3+ . NPl/V3 . N🅪SgPl/VB/J+ . VB/C NSg/I/J/R/C J/P . NSg/J/R/C . > when you’ve cleared all the jelly - fish out of the way — ” # NSg/I/C K VP/J NSg/I/J/C/Dq D NSg/VB/J+ . N🅪SgPl/VB+ NSg/VB/J/R/P P D NSg/J+ . . > # > “ That generally takes some time , ” interrupted the Gryphon . # . NSg/I/C/Ddem+ R NPl/V3 I/J/R/Dq+ N🅪Sg/VB/J+ . . VP/J D ? . > # > “ — you advance twice — ” # . . ISgPl+ NSg/VB/J+ R . . > # > “ Each with a lobster as a partner ! ” cried the Gryphon . # . Dq P D/P+ NSg/VB/J+ R/C/P D/P+ NSg/VB+ . . VP/J D ? . > # > “ Of course , ” the Mock Turtle said : “ advance twice , set to partners — ” # . P NSg/VB+ . . D+ NSg/VB/J+ NSg/VB+ VP/J . . NSg/VB/J+ R . NPr/VBP/J P NPl/V3 . . > # > “ — change lobsters , and retire in same order , ” continued the Gryphon . # . . N🅪Sg/VB+ NPl/V3 . VB/C NSg/VB NPr/J/R/P I/J N🅪Sg/VB+ . . VP/J D ? . > # > “ Then , you know , ” the Mock Turtle went on , “ you throw the — ” # . NSg/J/R/C . ISgPl+ VB . . D+ NSg/VB/J+ NSg/VB+ NSg/VPt J/P . . ISgPl+ NSg/VB D . . > # > “ The lobsters ! ” shouted the Gryphon , with a bound into the air . # . D NPl/V3 . . VP/J D ? . P D/P NSg/VP/J+ P D N🅪Sg/VB+ . > # > “ — as far out to sea as you can — ” # . . R/C/P NSg/VB/J NSg/VB/J/R/P P NSg R/C/P ISgPl+ NPr/VXB . . > # > “ Swim after them ! ” screamed the Gryphon . # . NSg/VB P NSg/IPl+ . . VP/J D ? . > # > “ Turn a somersault in the sea ! ” cried the Mock Turtle , capering wildly about . # . NSg/VB D/P NSg/VB NPr/J/R/P D NSg+ . . VP/J D+ NSg/VB/J+ NSg/VB+ . Nᴹ/Vg/J R J/P . > # > “ Change lobsters again ! ” yelled the Gryphon at the top of its voice . # . N🅪Sg/VB+ NPl/V3 P . . VP/J D ? NSg/P D NSg/VB/J P ISg/D$+ NSg/VB+ . > # > “ Back to land again , and that’s all the first figure , ” said the Mock Turtle , # . NSg/VB/J P NPr🅪Sg/VB P . VB/C NSg$ NSg/I/J/C/Dq D NSg/J NSg/VB+ . . VP/J D NSg/VB/J NSg/VB+ . > suddenly dropping his voice ; and the two creatures , who had been jumping about # R NSg/Vg ISg/D$+ NSg/VB+ . VB/C D NSg NPl+ . NPr/I+ VP NSg/VLPp Nᴹ/Vg/J J/P > like mad things all this time , sat down again very sadly and quietly , and looked # NSg/VB/J/C/P NSg/VB/J NPl+ NSg/I/J/C/Dq I/Ddem N🅪Sg/VB/J+ . NSg/VP/J N🅪Sg/VB/J/P P J/R R VB/C R . VB/C VP/J > at Alice . # NSg/P NPr+ . > # > “ It must be a very pretty dance , ” said Alice timidly . # . NPr/ISg+ NSg/VXB NSg/VLXB D/P J/R NSg/VB/J/R N🅪Sg/VB+ . . VP/J NPr+ R . > # > “ Would you like to see a little of it ? ” said the Mock Turtle . # . VXB ISgPl+ NSg/VB/J/C/P P NSg/VB D/P NPr/I/J/Dq P NPr/ISg+ . . VP/J D+ NSg/VB/J+ NSg/VB+ . > # > “ Very much indeed , ” said Alice . # . J/R NSg/I/J/R/Dq R . . VP/J NPr+ . > # > “ Come , let’s try the first figure ! ” said the Mock Turtle to the Gryphon . “ We can # . NSg/VBPp/P . NSg$ NSg/VB/J D NSg/J NSg/VB+ . . VP/J D+ NSg/VB/J+ NSg/VB+ P D ? . . IPl+ NPr/VXB > do without lobsters , you know . Which shall sing ? ” # VXB C/P NPl/V3 . ISgPl+ VB . I/C+ VXB NSg/VB/J . . > # > “ Oh , you sing , ” said the Gryphon . “ I’ve forgotten the words . ” # . NPr/VB . ISgPl+ NSg/VB/J . . VP/J D ? . . K NSg/VPp/J D NPl/V3+ . . > # > So they began solemnly dancing round and round Alice , every now and then # NSg/I/J/R/C IPl+ VPt R Nᴹ/Vg/J NSg/VB/J/P VB/C NSg/VB/J/P NPr+ . Dq NSg/J/R/C VB/C NSg/J/R/C > treading on her toes when they passed too close , and waving their forepaws to # Nᴹ/Vg/J J/P ISg/D$+ NPl/V3+ NSg/I/C IPl+ VP/J R NSg/VB/J . VB/C Nᴹ/Vg/J D$+ NPl P > mark the time , while the Mock Turtle sang this , very slowly and sadly : — # NPr/VB+ D N🅪Sg/VB/J+ . NSg/VB/C/P D NSg/VB/J NSg/VB+ NPr/VPt I/Ddem+ . J/R R VB/C R . . > # > “ Will you walk a little faster ? ” said a whiting to a snail . “ There’s a # . NPr/VXB ISgPl+ NSg/VB D/P NPr/I/J/Dq NSg/JC . . VP/J D/P+ N🅪SgPl/Vg/J+ P D/P NSg/VB . . K D/P > porpoise close behind us , and he’s treading on my tail . See how eagerly the # NSg/VB+ NSg/VB/J NSg/J/P NPr/IPl+ . VB/C NPr$ Nᴹ/Vg/J J/P D$+ NSg/VB/J+ . NSg/VB NSg/C R D > lobsters and the turtles all advance ! They are waiting on the shingle — will you # NPl/V3 VB/C D NPl/V3 NSg/I/J/C/Dq NSg/VB/J+ . IPl+ VLB Nᴹ/Vg/J J/P D NSg/VB . NPr/VXB ISgPl+ > come and join the dance ? Will you , won’t you , will you , won’t you , will you # NSg/VBPp/P VB/C NSg/VB D N🅪Sg/VB+ . NPr/VXB ISgPl+ . VXB ISgPl+ . NPr/VXB ISgPl+ . VXB ISgPl+ . NPr/VXB ISgPl+ > join the dance ? Will you , won’t you , will you , won’t you , won’t you join the # NSg/VB D N🅪Sg/VB+ . NPr/VXB ISgPl+ . VXB ISgPl+ . NPr/VXB ISgPl+ . VXB ISgPl+ . VXB ISgPl+ NSg/VB D > dance ? # N🅪Sg/VB+ . > # > “ You can really have no notion how delightful it will be When they take us up # . ISgPl+ NPr/VXB R NSg/VXB NSg/Dq/P+ NSg+ NSg/C J NPr/ISg+ NPr/VXB NSg/VLXB NSg/I/C IPl+ NSg/VB NPr/IPl+ NSg/VB/J/P > and throw us , with the lobsters , out to sea ! ” But the snail replied “ Too far , # VB/C NSg/VB NPr/IPl+ . P D NPl/V3 . NSg/VB/J/R/P P NSg . . NSg/C/P D NSg/VB VP/J . R NSg/VB/J . > too far ! ” and gave a look askance — Said he thanked the whiting kindly , but he # R NSg/VB/J . . VB/C VPt D/P NSg/VB VB/J . VP/J NPr/ISg+ VP/J D N🅪SgPl/Vg/J+ J/R . NSg/C/P NPr/ISg+ > would not join the dance . Would not , could not , would not , could not , would # VXB NSg/R/C NSg/VB D N🅪Sg/VB+ . VXB NSg/R/C . NSg/VXB NSg/R/C . VXB NSg/R/C . NSg/VXB NSg/R/C . VXB > not join the dance . Would not , could not , would not , could not , could not join # NSg/R/C NSg/VB D+ N🅪Sg/VB+ . VXB NSg/R/C . NSg/VXB NSg/R/C . VXB NSg/R/C . NSg/VXB NSg/R/C . NSg/VXB NSg/R/C NSg/VB > the dance . # D+ N🅪Sg/VB+ . > # > “ What matters it how far we go ? ” his scaly friend replied . “ There is another # . NSg/I+ NPl/V3+ NPr/ISg+ NSg/C NSg/VB/J IPl+ NSg/VB/J . . ISg/D$+ NSg/J+ NPr/VB/J+ VP/J . . R+ VL3 I/D+ > shore , you know , upon the other side . The further off from England the nearer # NSg/VB+ . ISgPl+ VB . P D+ NSg/VB/J+ NSg/VB/J+ . D VB/JC NSg/VB/J/P P NPr+ D NSg/JC > is to France — Then turn not pale , beloved snail , but come and join the dance . # VL3 P NPr+ . NSg/J/R/C NSg/VB NSg/R/C NSg/VB/J . NSg/VB/J NSg/VB . NSg/C/P NSg/VBPp/P VB/C NSg/VB D N🅪Sg/VB+ . > Will you , won’t you , will you , won’t you , will you join the dance ? Will you , # NPr/VXB ISgPl+ . VXB ISgPl+ . NPr/VXB ISgPl+ . VXB ISgPl+ . NPr/VXB ISgPl+ NSg/VB D N🅪Sg/VB+ . NPr/VXB ISgPl+ . > won’t you , will you , won’t you , won’t you join the dance ? ” # VXB ISgPl+ . NPr/VXB ISgPl+ . VXB ISgPl+ . VXB ISgPl+ NSg/VB D N🅪Sg/VB+ . . > # > “ Thank you , it’s a very interesting dance to watch , ” said Alice , feeling very # . NSg/VB ISgPl+ . K D/P J/R Vg/J N🅪Sg/VB+ P NSg/VB . . VP/J NPr+ . N🅪Sg/Vg/J J/R > glad that it was over at last : “ and I do so like that curious song about the # NSg/VB/J NSg/I/C/Ddem NPr/ISg+ VLPt NSg/J/P NSg/P NSg/VB/J . . VB/C ISg/#r+ VXB NSg/I/J/R/C NSg/VB/J/C/P NSg/I/C/Ddem J N🅪Sg J/P D > whiting ! ” # N🅪SgPl/Vg/J+ . . > # > “ Oh , as to the whiting , ” said the Mock Turtle , “ they — you’ve seen them , of # . NPr/VB . R/C/P P D+ N🅪SgPl/Vg/J+ . . VP/J D+ NSg/VB/J+ NSg/VB+ . . IPl+ . K NSg/VPp NSg/IPl+ . P > course ? ” # NSg/VB+ . . > # > “ Yes , ” said Alice , “ I’ve often seen them at dinn — ” she checked herself hastily . # . NPl/VB . . VP/J NPr+ . . K R NSg/VPp NSg/IPl+ NSg/P ? . . ISg+ VP/J ISg+ R . > # > “ I don’t know where Dinn may be , ” said the Mock Turtle , “ but if you’ve seen them # . ISg/#r+ VXB VB NSg/R/C ? NPr/VXB NSg/VLXB . . VP/J D NSg/VB/J NSg/VB+ . . NSg/C/P NSg/C K NSg/VPp NSg/IPl+ > so often , of course you know what they’re like . ” # NSg/I/J/R/C R . P NSg/VB+ ISgPl+ VB NSg/I+ K NSg/VB/J/C/P . . > # > “ I believe so , ” Alice replied thoughtfully . “ They have their tails in their # . ISg/#r+ VB NSg/I/J/R/C . . NPr+ VP/J R . . IPl+ NSg/VXB D$+ NPl/V3+ NPr/J/R/P D$+ > mouths — and they’re all over crumbs . ” # NPl/V3+ . VB/C K NSg/I/J/C/Dq NSg/J/P NPl/V3+ . . > # > “ You’re wrong about the crumbs , ” said the Mock Turtle : “ crumbs would all wash # . K NSg/VB/J/R J/P D NPl/V3+ . . VP/J D NSg/VB/J NSg/VB+ . . NPl/V3+ VXB NSg/I/J/C/Dq NPr/VB+ > off in the sea . But they have their tails in their mouths ; and the reason is — ” # NSg/VB/J/P NPr/J/R/P D NSg+ . NSg/C/P IPl+ NSg/VXB D$+ NPl/V3+ NPr/J/R/P D$+ NPl/V3+ . VB/C D+ N🅪Sg/VB+ VL3 . . > here the Mock Turtle yawned and shut his eyes . — “ Tell her about the reason and # J/R D+ NSg/VB/J+ NSg/VB+ VP/J VB/C NSg/VBP/J ISg/D$+ NPl/V3+ . . . NPr/VB ISg/D$+ J/P D+ N🅪Sg/VB+ VB/C > all that , ” he said to the Gryphon . # NSg/I/J/C/Dq NSg/I/C/Ddem+ . . NPr/ISg+ VP/J P D ? . > # > “ The reason is , ” said the Gryphon , “ that they would go with the lobsters to the # . D+ N🅪Sg/VB+ VL3 . . VP/J D ? . . NSg/I/C/Ddem IPl+ VXB NSg/VB/J P D NPl/V3 P D > dance . So they got thrown out to sea . So they had to fall a long way . So they # N🅪Sg/VB+ . NSg/I/J/R/C IPl+ VP VPp/J NSg/VB/J/R/P P NSg . NSg/I/J/R/C IPl+ VP P N🅪Sg/VB D/P+ NPr/VB/J+ NSg/J+ . NSg/I/J/R/C IPl+ > got their tails fast in their mouths . So they couldn’t get them out again . # VP D$+ NPl/V3+ NSg/VB/J/R NPr/J/R/P D$+ NPl/V3+ . NSg/I/J/R/C IPl+ VXB NSg/VB NSg/IPl+ NSg/VB/J/R/P P . > That’s all . ” # NSg$ NSg/I/J/C/Dq . . > # > “ Thank you , ” said Alice , “ it’s very interesting . I never knew so much about a # . NSg/VB ISgPl+ . . VP/J NPr+ . . K J/R Vg/J . ISg/#r+ R VPt NSg/I/J/R/C NSg/I/J/R/Dq J/P D/P+ > whiting before . ” # N🅪SgPl/Vg/J+ C/P . . > # > “ I can tell you more than that , if you like , ” said the Gryphon . “ Do you know why # . ISg/#r+ NPr/VXB NPr/VB ISgPl+ NPr/I/J/R/Dq C/P NSg/I/C/Ddem+ . NSg/C ISgPl+ NSg/VB/J/C/P . . VP/J D ? . . VXB ISgPl+ VB NSg/VB > it’s called a whiting ? ” # K VP/J D/P+ N🅪SgPl/Vg/J+ . . > # > “ I never thought about it , ” said Alice . “ Why ? ” # . ISg/#r+ R N🅪Sg/VP J/P NPr/ISg+ . . VP/J NPr+ . . NSg/VB . . > # > “ It does the boots and shoes , ” the Gryphon replied very solemnly . # . NPr/ISg+ NPl/VX3 D NPl/V3 VB/C NPl/V3+ . . D ? VP/J J/R R . > # > Alice was thoroughly puzzled . “ Does the boots and shoes ! ” she repeated in a # NPr+ VLPt R VP/J . . NPl/VX3 D NPl/V3 VB/C NPl/V3+ . . ISg+ VP/J NPr/J/R/P D/P+ > wondering tone . # Nᴹ/Vg/J N🅪Sg/I/VB+ . > # > “ Why , what are your shoes done with ? ” said the Gryphon . “ I mean , what makes them # . NSg/VB . NSg/I+ VLB D$+ NPl/V3+ NSg/VPp/J P . . VP/J D ? . . ISg/#r+ NSg/VB/J . NSg/I+ NPl/V3 NSg/IPl+ > so shiny ? ” # NSg/I/J/R/C NSg/J . . > # > Alice looked down at them , and considered a little before she gave her answer . # NPr+ VP/J N🅪Sg/VB/J/P NSg/P NSg/IPl+ . VB/C VP/J D/P NPr/I/J/Dq C/P ISg+ VPt ISg/D$+ NSg/VB+ . > “ They’re done with blacking , I believe . ” # . K NSg/VPp/J P Nᴹ/Vg/J . ISg/#r+ VB . . > # > “ Boots and shoes under the sea , ” the Gryphon went on in a deep voice , “ are done # . NPl/V3 VB/C NPl/V3+ NSg/J/P D+ NSg+ . . D ? NSg/VPt J/P NPr/J/R/P D/P NSg/J NSg/VB+ . . VLB NSg/VPp/J > with a whiting . Now you know . ” # P D/P N🅪SgPl/Vg/J+ . NSg/J/R/C ISgPl+ VB . . > # > “ And what are they made of ? ” Alice asked in a tone of great curiosity . # . VB/C NSg/I+ VLB IPl+ VP P . . NPr+ VP/J NPr/J/R/P D/P N🅪Sg/I/VB P NSg/J+ NSg+ . > # > “ Soles and eels , of course , ” the Gryphon replied rather impatiently : “ any shrimp # . NPl/V3+ VB/C NPl/V3 . P NSg/VB+ . . D ? VP/J NPr/VB/J/R R . . I/R/Dq N🅪SgPl/VB+ > could have told you that . ” # NSg/VXB NSg/VXB VP ISgPl+ NSg/I/C/Ddem+ . . > # > “ If I’d been the whiting , ” said Alice , whose thoughts were still running on the # . NSg/C K NSg/VLPp D N🅪SgPl/Vg/J+ . . VP/J NPr+ . I+ NPl/V3+ NSg/VLPt NSg/VB/J/R Nᴹ/Vg/J/P J/P D > song , “ I’d have said to the porpoise , ‘ Keep back , please : we don’t want you with # N🅪Sg+ . . K NSg/VXB VP/J P D NSg/VB+ . Unlintable NSg/VB NSg/VB/J . VB . IPl+ VXB NSg/VB ISgPl+ P > us ! ’ ” # NPr/IPl+ . . . > # > “ They were obliged to have him with them , ” the Mock Turtle said : “ no wise fish # . IPl+ NSg/VLPt VP/J P NSg/VXB ISg+ P NSg/IPl+ . . D+ NSg/VB/J+ NSg/VB+ VP/J . . NSg/Dq/P+ NPr/VB/J+ N🅪SgPl/VB+ > would go anywhere without a porpoise . ” # VXB NSg/VB/J NSg/I C/P D/P+ NSg/VB+ . . > # > “ Wouldn’t it really ? ” said Alice in a tone of great surprise . # . VXB NPr/ISg+ R . . VP/J NPr+ NPr/J/R/P D/P N🅪Sg/I/VB P NSg/J+ NSg/VB+ . > # > “ Of course not , ” said the Mock Turtle : “ why , if a fish came to me , and told me # . P NSg/VB+ NSg/R/C . . VP/J D+ NSg/VB/J+ NSg/VB+ . . NSg/VB . NSg/C D/P+ N🅪SgPl/VB+ NSg/VPt/P P NPr/ISg+ . VB/C VP NPr/ISg+ > he was going a journey , I should say ‘ With what porpoise ? ’ ” # NPr/ISg+ VLPt Nᴹ/Vg/J D/P+ NSg/VB+ . ISg/#r+ VXB NSg/VB Unlintable P NSg/I+ NSg/VB+ . . . > # > “ Don’t you mean ‘ purpose ’ ? ” said Alice . # . VXB ISgPl+ NSg/VB/J Unlintable N🅪Sg/VB+ . . . VP/J NPr+ . > # > “ I mean what I say , ” the Mock Turtle replied in an offended tone . And the # . ISg/#r+ NSg/VB/J NSg/I+ ISg/#r+ NSg/VB . . D+ NSg/VB/J+ NSg/VB+ VP/J NPr/J/R/P D/P+ VP/J N🅪Sg/I/VB+ . VB/C D > Gryphon added “ Come , let’s hear some of your adventures . ” # ? VP/J . NSg/VBPp/P . NSg$ VB I/J/R/Dq P D$+ NPl/V3+ . . > # > “ I could tell you my adventures — beginning from this morning , ” said Alice a # . ISg/#r+ NSg/VXB NPr/VB ISgPl+ D$+ NPl/V3+ . NSg/Vg/J+ P I/Ddem+ N🅪Sg/Vg/J+ . . VP/J NPr+ D/P > little timidly : “ but it’s no use going back to yesterday , because I was a # NPr/I/J/Dq R . . NSg/C/P K NSg/Dq/P N🅪Sg/VB Nᴹ/Vg/J NSg/VB/J P NSg . C/P ISg/#r+ VLPt D/P > different person then . ” # NSg/J NSg/VB+ NSg/J/R/C . . > # > “ Explain all that , ” said the Mock Turtle . # . VB NSg/I/J/C/Dq NSg/I/C/Ddem+ . . VP/J D+ NSg/VB/J+ NSg/VB+ . > # > “ No , no ! The adventures first , ” said the Gryphon in an impatient tone : # . NSg/Dq/P . NSg/Dq/P . D+ NPl/V3+ NSg/J . . VP/J D ? NPr/J/R/P D/P J N🅪Sg/I/VB+ . > “ explanations take such a dreadful time . ” # . NPl+ NSg/VB NSg/I D/P NSg/J N🅪Sg/VB/J+ . . > # > So Alice began telling them her adventures from the time when she first saw the # NSg/I/J/R/C NPr+ VPt Nᴹ/Vg/J NSg/IPl+ ISg/D$+ NPl/V3+ P D+ N🅪Sg/VB/J+ NSg/I/C ISg+ NSg/J NSg/VPt D+ > White Rabbit . She was a little nervous about it just at first , the two creatures # NPr🅪Sg/VB/J+ NSg/VB+ . ISg+ VLPt D/P NPr/I/J/Dq J J/P NPr/ISg+ J/R NSg/P NSg/J . D+ NSg+ NPl+ > got so close to her , one on each side , and opened their eyes and mouths so very # VP NSg/I/J/R/C NSg/VB/J P ISg/D$+ . NSg/I/J J/P Dq+ NSg/VB/J+ . VB/C VP/J D$+ NPl/V3 VB/C NPl/V3+ NSg/I/J/R/C J/R > wide , but she gained courage as she went on . Her listeners were perfectly quiet # NSg/J . NSg/C/P ISg+ VP/J NSg/VB+ R/C/P ISg+ NSg/VPt J/P . ISg/D$+ + NSg/VLPt R N🅪Sg/VB/J > till she got to the part about her repeating “ You are old , Father William , ” to # NSg/VB/C/P ISg+ VP P D+ NSg/VB/J+ J/P ISg/D$+ Nᴹ/Vg/J . ISgPl+ VLB NSg/J . NPr/VB+ NPr+ . . P > the Caterpillar , and the words all coming different , and then the Mock Turtle # D NSg/VB . VB/C D NPl/V3+ NSg/I/J/C/Dq Nᴹ/Vg/J NSg/J . VB/C NSg/J/R/C D NSg/VB/J NSg/VB+ > drew a long breath , and said “ That’s very curious . ” # NPr/VPt D/P NPr/VB/J N🅪Sg/VB/J+ . VB/C VP/J . NSg$ J/R J . . > # > “ It’s all about as curious as it can be , ” said the Gryphon . # . K NSg/I/J/C/Dq J/P R/C/P J R/C/P NPr/ISg+ NPr/VXB NSg/VLXB . . VP/J D ? . > # > “ It all came different ! ” the Mock Turtle repeated thoughtfully . “ I should like # . NPr/ISg+ NSg/I/J/C/Dq NSg/VPt/P NSg/J . . D+ NSg/VB/J+ NSg/VB+ VP/J R . . ISg/#r+ VXB NSg/VB/J/C/P > to hear her try and repeat something now . Tell her to begin . ” He looked at the # P VB ISg/D$+ NSg/VB/J VB/C NSg/VB NSg/I/J+ NSg/J/R/C . NPr/VB ISg/D$+ P NSg/VB . . NPr/ISg+ VP/J NSg/P D > Gryphon as if he thought it had some kind of authority over Alice . # ? R/C/P NSg/C NPr/ISg+ N🅪Sg/VP NPr/ISg+ VP I/J/R/Dq NSg/J P N🅪Sg+ NSg/J/P NPr+ . > # > “ Stand up and repeat ‘ ’ Tis the voice of the sluggard , ’ ” said the Gryphon . # . NSg/VB NSg/VB/J/P VB/C NSg/VB Unlintable . ? D NSg/VB P D NSg . . . VP/J D ? . > # > “ How the creatures order one about , and make one repeat lessons ! ” thought Alice ; # . NSg/C D+ NPl+ N🅪Sg/VB+ NSg/I/J J/P . VB/C NSg/VB NSg/I/J NSg/VB NPl/V3+ . . N🅪Sg/VP NPr+ . > “ I might as well be at school at once . ” However , she got up , and began to repeat # . ISg/#r+ Nᴹ/VXB/J R/C/P NSg/VB/J/R NSg/VLXB NSg/P N🅪Sg/VB+ NSg/P NSg/C . . C . ISg+ VP NSg/VB/J/P . VB/C VPt P NSg/VB > it , but her head was so full of the Lobster Quadrille , that she hardly knew what # NPr/ISg+ . NSg/C/P ISg/D$+ NPr/VB/J+ VLPt NSg/I/J/R/C NSg/VB/J P D+ NSg/VB/J+ NSg/VB/J . NSg/I/C/Ddem ISg+ R VPt NSg/I+ > she was saying , and the words came very queer indeed : — # ISg+ VLPt N🅪Sg/Vg/J . VB/C D NPl/V3+ NSg/VPt/P J/R NSg/VB/J R . . > # > “ ’ Tis the voice of the Lobster ; I heard him declare , “ You have baked me too # . . ? D NSg/VB P D+ NSg/VB/J+ . ISg/#r+ VP/J ISg+ VB . . ISgPl+ NSg/VXB VP/J NPr/ISg+ R > brown , I must sugar my hair . ” As a duck with its eyelids , so he with his nose # NPr🅪Sg/VB/J . ISg/#r+ NSg/VXB N🅪Sg/VB D$+ N🅪Sg/VB+ . . R/C/P D/P NSg/VB+ P ISg/D$+ NPl+ . NSg/I/J/R/C NPr/ISg+ P ISg/D$+ NSg/VB+ > Trims his belt and his buttons , and turns out his toes . ” # NPl/V3 ISg/D$+ NSg/VB+ VB/C ISg/D$+ NPl/V3+ . VB/C NPl/V3 NSg/VB/J/R/P ISg/D$+ NPl/V3+ . . > # > ( later editions continued as follows When the sands are all dry , he is gay as # . JC NPl VP/J R/C/P NPl/V3 NSg/I/C D NPl/V3+ VLB NSg/I/J/C/Dq NSg/VB/J . NPr/ISg+ VL3 NPr/VB/J R/C/P > a lark , And will talk in contemptuous tones of the Shark , But , when the tide # D/P NSg/VB . VB/C NPr/VXB N🅪Sg/VB NPr/J/R/P J NPl/V3 P D NSg/VB+ . NSg/C/P . NSg/I/C D NSg/VB+ > rises and sharks are around , His voice has a timid and tremulous sound . ) # NPl/V3+ VB/C NPl/V3 VLB J/P . ISg/D$+ NSg/VB+ V3 D/P J VB/C J N🅪Sg/VB/J+ . . > # > “ That’s different from what I used to say when I was a child , ” said the Gryphon . # . NSg$ NSg/J P NSg/I+ ISg/#r+ VP/J P NSg/VB NSg/I/C ISg/#r+ VLPt D/P NSg/VB+ . . VP/J D ? . > # > “ Well , I never heard it before , ” said the Mock Turtle ; “ but it sounds uncommon # . NSg/VB/J/R . ISg/#r+ R VP/J NPr/ISg+ C/P . . VP/J D+ NSg/VB/J+ NSg/VB+ . . NSg/C/P NPr/ISg+ NPl/V3 NSg/VB/J+ > nonsense . ” # Nᴹ/VB/J+ . . > # > Alice said nothing ; she had sat down with her face in her hands , wondering if # NPr+ VP/J NSg/I/J+ . ISg+ VP NSg/VP/J N🅪Sg/VB/J/P P ISg/D$+ NSg/VB+ NPr/J/R/P ISg/D$+ NPl/V3+ . Nᴹ/Vg/J NSg/C > anything would ever happen in a natural way again . # NSg/I/VB+ VXB J/R VB NPr/J/R/P D/P+ NSg/J+ NSg/J+ P . > # > “ I should like to have it explained , ” said the Mock Turtle . # . ISg/#r+ VXB NSg/VB/J/C/P P NSg/VXB NPr/ISg+ VP/J . . VP/J D+ NSg/VB/J+ NSg/VB+ . > # > “ She can’t explain it , ” said the Gryphon hastily . “ Go on with the next verse . ” # . ISg+ VXB VB NPr/ISg+ . . VP/J D ? R . . NSg/VB/J J/P P D NSg/J/P NSg/VB . . > # > “ But about his toes ? ” the Mock Turtle persisted . “ How could he turn them out # . NSg/C/P J/P ISg/D$+ NPl/V3+ . . D+ NSg/VB/J+ NSg/VB+ VP/J . . NSg/C NSg/VXB NPr/ISg+ NSg/VB NSg/IPl+ NSg/VB/J/R/P > with his nose , you know ? ” # P ISg/D$+ NSg/VB+ . ISgPl+ VB . . > # > “ It’s the first position in dancing . ” Alice said ; but was dreadfully puzzled by # . K D+ NSg/J NSg/VB+ NPr/J/R/P Nᴹ/Vg/J . . NPr+ VP/J . NSg/C/P VLPt R VP/J NSg/P > the whole thing , and longed to change the subject . # D NSg/J NSg+ . VB/C VP/J P N🅪Sg/VB D NSg/VB/J+ . > # > “ Go on with the next verse , ” the Gryphon repeated impatiently : “ it begins ‘ I # . NSg/VB/J J/P P D NSg/J/P NSg/VB . . D ? VP/J R . . NPr/ISg+ NPl/V3 Unlintable ISg/#r+ > passed by his garden . ’ ” # VP/J NSg/P ISg/D$+ NSg/VB/J+ . . . > # > Alice did not dare to disobey , though she felt sure it would all come wrong , and # NPr+ VXPt NSg/R/C NPr/VXB P VB . C ISg+ N🅪Sg/VP/J J NPr/ISg+ VXB NSg/I/J/C/Dq NSg/VBPp/P NSg/VB/J/R . VB/C > she went on in a trembling voice : — # ISg+ NSg/VPt J/P NPr/J/R/P D/P Nᴹ/Vg/J NSg/VB+ . . > # > “ I passed by his garden , and marked , with one eye , How the Owl and the Panther # . ISg/#r+ VP/J NSg/P ISg/D$+ NSg/VB/J+ . VB/C VP/J . P NSg/I/J+ NSg/VB+ . NSg/C D+ NSg/VB+ VB/C D NSg > were sharing a pie — ” # NSg/VLPt Nᴹ/Vg/J D/P N🅪Sg/VB+ . . > # > ( later editions continued as follows The Panther took pie - crust , and gravy , # . JC NPl VP/J R/C/P NPl/V3 D NSg VPt N🅪Sg/VB+ . N🅪Sg/VB+ . VB/C N🅪Sg/VB+ . > and meat , While the Owl had the dish as its share of the treat . When the pie # VB/C N🅪Sg+ . NSg/VB/C/P D NSg/VB+ VP D NSg/VB+ R/C/P ISg/D$+ NSg/VB P D NSg/VB+ . NSg/I/C D+ N🅪Sg/VB+ > was all finished , the Owl , as a boon , Was kindly permitted to pocket the # VLPt NSg/I/J/C/Dq VP/J . D+ NSg/VB+ . R/C/P D/P NSg/J . VLPt J/R VP/J P NSg/VB/J D > spoon : While the Panther received knife and fork with a growl , And concluded # NSg/VB+ . NSg/VB/C/P D NSg VP/J NSg/VB VB/C NSg/VB+ P D/P NSg/VB . VB/C VP/J > the banquet — ) # D NSg/VB+ . . > # > “ What is the use of repeating all that stuff , ” the Mock Turtle interrupted , “ if # . NSg/I+ VL3 D N🅪Sg/VB P Nᴹ/Vg/J NSg/I/J/C/Dq+ NSg/I/C/Ddem+ Nᴹ/VB+ . . D+ NSg/VB/J+ NSg/VB+ VP/J . . NSg/C > you don’t explain it as you go on ? It’s by far the most confusing thing I ever # ISgPl+ VXB VB NPr/ISg+ R/C/P ISgPl+ NSg/VB/J J/P . K NSg/P NSg/VB/J D NSg/I/J/R/Dq Nᴹ/Vg/J NSg+ ISg/#r+ J/R > heard ! ” # VP/J . . > # > “ Yes , I think you’d better leave off , ” said the Gryphon : and Alice was only too # . NPl/VB . ISg/#r+ NSg/VB K NSg/VXB/JC+ NSg/VB+ NSg/VB/J/P . . VP/J D ? . VB/C NPr+ VLPt J/R/C R > glad to do so . # NSg/VB/J P VXB NSg/I/J/R/C . > # > “ Shall we try another figure of the Lobster Quadrille ? ” the Gryphon went on . “ Or # . VXB IPl+ NSg/VB/J I/D NSg/VB P D+ NSg/VB/J+ NSg/VB/J . . D ? NSg/VPt J/P . . NPr/C > would you like the Mock Turtle to sing you a song ? ” # VXB ISgPl+ NSg/VB/J/C/P D+ NSg/VB/J+ NSg/VB+ P NSg/VB/J ISgPl+ D/P+ N🅪Sg+ . . > # > “ Oh , a song , please , if the Mock Turtle would be so kind , ” Alice replied , so # . NPr/VB . D/P+ N🅪Sg+ . VB . NSg/C D+ NSg/VB/J+ NSg/VB+ VXB NSg/VLXB NSg/I/J/R/C NSg/J+ . . NPr+ VP/J . NSg/I/J/R/C > eagerly that the Gryphon said , in a rather offended tone , “ Hm ! No accounting for # R NSg/I/C/Ddem D ? VP/J . NPr/J/R/P D/P NPr/VB/J/R VP/J N🅪Sg/I/VB+ . . NPr . NSg/Dq/P+ Nᴹ/Vg/J+ R/C/P > tastes ! Sing her ‘ Turtle Soup , ’ will you , old fellow ? ” # NPl/V3 . NSg/VB/J ISg/D$+ Unlintable NSg/VB+ N🅪Sg/VB+ . . NPr/VXB ISgPl+ . NSg/J NSg . . > # > The Mock Turtle sighed deeply , and began , in a voice sometimes choked with sobs , # D+ NSg/VB/J+ NSg/VB+ VP/J R . VB/C VPt . NPr/J/R/P D/P+ NSg/VB+ R VP/J P NPl/V3 . > to sing this : — # P NSg/VB/J I/Ddem+ . . > # > “ Beautiful Soup , so rich and green , Waiting in a hot tureen ! Who for such # . NSg/J+ N🅪Sg/VB+ . NSg/I/J/R/C NPr/VB/J VB/C NPr🅪Sg/VB/J . Nᴹ/Vg/J NPr/J/R/P D/P NSg/VB/J NSg . NPr/I+ R/C/P NSg/I > dainties would not stoop ? Soup of the evening , beautiful Soup ! Soup of the # NPl VXB NSg/R/C NSg/VB . N🅪Sg/VB P D+ N🅪Sg/Vg/J+ . NSg/J+ N🅪Sg/VB+ . N🅪Sg/VB P D+ > evening , beautiful Soup ! Beau — ootiful Soo — oop ! Beau — ootiful Soo — oop ! Soo — oop # N🅪Sg/Vg/J+ . NSg/J+ N🅪Sg/VB+ . NPr/VB+ . ? ? . Nᴹ . NPr/VB+ . ? ? . Nᴹ . ? . Nᴹ > of the e — e — evening , Beautiful , beautiful Soup ! # P D NPr/I+ . NPr/I . N🅪Sg/Vg/J+ . NSg/J . NSg/J N🅪Sg/VB+ . > # > “ Beautiful Soup ! Who cares for fish , Game , or any other dish ? Who would not # . NSg/J+ N🅪Sg/VB+ . NPr/I+ NPl/V3 R/C/P N🅪SgPl/VB+ . NSg/VB/J+ . NPr/C I/R/Dq+ NSg/VB/J+ NSg/VB+ . NPr/I+ VXB NSg/R/C > give all else for two p ennyworth only of beautiful Soup ? Pennyworth only of # NSg/VB NSg/I/J/C/Dq NSg/J/C R/C/P NSg+ NSg/VB/P+ ? J/R/C P NSg/J N🅪Sg/VB+ . NSg J/R/C P > beautiful Soup ? Beau — ootiful Soo — oop ! Beau — ootiful Soo — oop ! Soo — oop of the # NSg/J N🅪Sg/VB+ . NPr/VB+ . ? ? . Nᴹ . NPr/VB+ . ? ? . Nᴹ . ? . Nᴹ P D > e — e — evening , Beautiful , beauti — FUL SOUP ! ” # NPr/I+ . NPr/I+ . N🅪Sg/Vg/J+ . NSg/J . ? . ? N🅪Sg/VB+ . . > # > “ Chorus again ! ” cried the Gryphon , and the Mock Turtle had just begun to repeat # . NSg/VB+ P . . VP/J D ? . VB/C D NSg/VB/J NSg/VB+ VP J/R VPp P NSg/VB > it , when a cry of “ The trial’s beginning ! ” was heard in the distance . # NPr/ISg+ . NSg/I/C D/P NSg/VB P . D NSg$ NSg/Vg/J+ . . VLPt VP/J NPr/J/R/P D+ N🅪Sg/VB+ . > # > “ Come on ! ” cried the Gryphon , and , taking Alice by the hand , it hurried off , # . NSg/VBPp/P J/P . . VP/J D ? . VB/C . NSg/Vg/J NPr+ NSg/P D NSg/VB+ . NPr/ISg+ VP/J NSg/VB/J/P . > without waiting for the end of the song . # C/P Nᴹ/Vg/J R/C/P D NSg/VB P D N🅪Sg+ . > # > “ What trial is it ? ” Alice panted as she ran ; but the Gryphon only answered “ Come # . NSg/I+ NSg/VB/J+ VL3 NPr/ISg+ . . NPr+ VP/J R/C/P ISg+ NSg/VPt . NSg/C/P D ? J/R/C VP/J . NSg/VBPp/P > on ! ” and ran the faster , while more and more faintly came , carried on the breeze # J/P . . VB/C NSg/VPt D NSg/JC . NSg/VB/C/P NPr/I/J/R/Dq VB/C NPr/I/J/R/Dq R NSg/VPt/P . VP/J J/P D+ NSg/VB+ > that followed them , the melancholy words : — # NSg/I/C/Ddem+ VP/J NSg/IPl+ . D NSg/J NPl/V3+ . . > # > “ Soo — oop of the e — e — evening , Beautiful , beautiful Soup ! ” # . ? . Nᴹ P D NPr/I+ . NPr/I+ . N🅪Sg/Vg/J+ . NSg/J . NSg/J N🅪Sg/VB+ . . > # > CHAPTER XI : Who Stole the Tarts ? # HeadingStart NSg/VB+ NSg/#r . NPr/I+ NSg/VPt D NPl/V3 . > # > The King and Queen of Hearts were seated on their throne when they arrived , with # D NPr/VB/J VB/C NPr/VB/J P NPl/V3+ NSg/VLPt VP/J J/P D$+ NSg/VB NSg/I/C IPl+ VP/J . P > a great crowd assembled about them — all sorts of little birds and beasts , as well # D/P NSg/J NSg/VB+ VP/J J/P NSg/IPl+ . NSg/I/J/C/Dq NPl/V3 P NPr/I/J/Dq NPl/V3 VB/C NPl/V3+ . R/C/P NSg/VB/J/R > as the whole pack of cards : the Knave was standing before them , in chains , with # R/C/P D NSg/J NSg/VB P NPl/V3+ . D NSg VLPt Nᴹ/Vg/J C/P NSg/IPl+ . NPr/J/R/P NPl/V3+ . P > a soldier on each side to guard him ; and near the King was the White Rabbit , # D/P NSg/VB/J+ J/P Dq NSg/VB/J+ P NSg/VB+ ISg+ . VB/C NSg/VB/J/P D NPr/VB/J+ VLPt D NPr🅪Sg/VB/J NSg/VB+ . > with a trumpet in one hand , and a scroll of parchment in the other . In the very # P D/P NSg/VB+ NPr/J/R/P NSg/I/J NSg/VB+ . VB/C D/P NSg/VB P N🅪Sg+ NPr/J/R/P D NSg/VB/J . NPr/J/R/P D J/R > middle of the court was a table , with a large dish of tarts upon it : they looked # NSg/VB/J P D+ N🅪Sg/VB/J+ VLPt D/P NSg/VB . P D/P NSg/J NSg/VB P NPl/V3 P NPr/ISg+ . IPl+ VP/J > so good , that it made Alice quite hungry to look at them — “ I wish they’d get the # NSg/I/J/R/C NPr/VB/J . NSg/I/C/Ddem NPr/ISg+ VP NPr+ R J P NSg/VB NSg/P NSg/IPl+ . . ISg/#r+ NSg/VB K NSg/VB D > trial done , ” she thought , “ and hand round the refreshments ! ” But there seemed to # NSg/VB/J+ NSg/VPp/J . . ISg+ N🅪Sg/VP . . VB/C NSg/VB+ NSg/VB/J/P D NPl . . NSg/C/P R+ VP/J P > be no chance of this , so she began looking at everything about her , to pass away # NSg/VLXB NSg/Dq/P NPr/VB/J P I/Ddem+ . NSg/I/J/R/C ISg+ VPt Nᴹ/Vg/J NSg/P NSg/I/VB+ J/P ISg/D$+ . P NSg/VB VB/J > the time . # D+ N🅪Sg/VB/J+ . > # > Alice had never been in a court of justice before , but she had read about them # NPr+ VP R NSg/VLPp NPr/J/R/P D/P N🅪Sg/VB/J P NPr🅪Sg+ C/P . NSg/C/P ISg+ VP NSg/VBP J/P NSg/IPl+ > in books , and she was quite pleased to find that she knew the name of nearly # NPr/J/R/P NPl/V3+ . VB/C ISg+ VLPt R VP/J P NSg/VB NSg/I/C/Ddem ISg+ VPt D NSg/VB P R > everything there . “ That’s the judge , ” she said to herself , “ because of his great # NSg/I/VB+ R . . NSg$ D+ NSg/VB+ . . ISg+ VP/J P ISg+ . . C/P P ISg/D$+ NSg/J > wig . ” # NSg/VB+ . . > # > The judge , by the way , was the King ; and as he wore his crown over the wig , # D+ NSg/VB+ . NSg/P D+ NSg/J+ . VLPt D+ NPr/VB/J+ . VB/C R/C/P NPr/ISg+ VPt ISg/D$+ NSg/VB/J+ NSg/J/P D+ NSg/VB+ . > ( look at the frontispiece if you want to see how he did it , ) he did not look at # . NSg/VB NSg/P D NSg/VB NSg/C ISgPl+ NSg/VB P NSg/VB NSg/C NPr/ISg+ VXPt NPr/ISg+ . . NPr/ISg+ VXPt NSg/R/C NSg/VB NSg/P > all comfortable , and it was certainly not becoming . # NSg/I/J/C/Dq NSg/J . VB/C NPr/ISg+ VLPt R NSg/R/C NSg/Vg/J . > # > “ And that’s the jury - box , ” thought Alice , “ and those twelve creatures , ” ( she was # . VB/C NSg$ D NSg/VB/J+ . NSg/VB+ . . N🅪Sg/VP NPr+ . . VB/C I/Ddem NSg NPl+ . . . ISg+ VLPt > obliged to say “ creatures , ” you see , because some of them were animals , and some # VP/J P NSg/VB . NPl+ . . ISgPl+ NSg/VB . C/P I/J/R/Dq P NSg/IPl+ NSg/VLPt NPl+ . VB/C I/J/R/Dq+ > were birds , ) “ I suppose they are the jurors . ” She said this last word two or # NSg/VLPt NPl/V3+ . . . ISg/#r+ VB IPl+ VLB D NPl . . ISg+ VP/J I/Ddem+ NSg/VB/J NSg/VB+ NSg NPr/C > three times over to herself , being rather proud of it : for she thought , and # NSg+ NPl/V3+ NSg/J/P P ISg+ . N🅪Sg/VLg/J/C NPr/VB/J/R J P NPr/ISg+ . R/C/P ISg+ N🅪Sg/VP+ . VB/C > rightly too , that very few little girls of her age knew the meaning of it at # R R . NSg/I/C/Ddem+ J/R NSg/I/Dq NPr/I/J/Dq NPl/V3 P ISg/D$+ N🅪Sg/VB+ VPt D N🅪Sg/Vg/J P NPr/ISg+ NSg/P > all . However , “ jury - men ” would have done just as well . # NSg/I/J/C/Dq . C . . NSg/VB/J+ . NPl+ . VXB NSg/VXB NSg/VPp/J J/R R/C/P NSg/VB/J/R . > # > The twelve jurors were all writing very busily on slates . “ What are they doing ? ” # D NSg NPl NSg/VLPt NSg/I/J/C/Dq Nᴹ/Vg/J J/R R J/P NPl/V3 . . NSg/I+ VLB IPl+ Nᴹ/Vg/J . . > Alice whispered to the Gryphon . “ They can’t have anything to put down yet , # NPr+ VP/J P D ? . . IPl+ VXB NSg/VXB NSg/I/VB+ P NSg/VBP N🅪Sg/VB/J/P NSg/VB/C . > before the trial’s begun . ” # C/P D NSg$ VPp . . > # > “ They’re putting down their names , ” the Gryphon whispered in reply , “ for fear # . K Nᴹ/Vg/J N🅪Sg/VB/J/P D$+ NPl/V3+ . . D ? VP/J NPr/J/R/P NSg/VB+ . . R/C/P N🅪Sg/VB+ > they should forget them before the end of the trial . ” # IPl+ VXB VB NSg/IPl+ C/P D NSg/VB P D NSg/VB/J+ . . > # > “ Stupid things ! ” Alice began in a loud , indignant voice , but she stopped # . NSg/J+ NPl+ . . NPr+ VPt NPr/J/R/P D/P NSg/J . J NSg/VB+ . NSg/C/P ISg+ VP/J > hastily , for the White Rabbit cried out , “ Silence in the court ! ” and the King # R . R/C/P D NPr🅪Sg/VB/J NSg/VB+ VP/J NSg/VB/J/R/P . . NSg/VB+ NPr/J/R/P D N🅪Sg/VB/J+ . . VB/C D+ NPr/VB/J+ > put on his spectacles and looked anxiously round , to make out who was talking . # NSg/VBP J/P ISg/D$+ NPl VB/C VP/J R NSg/VB/J/P . P NSg/VB NSg/VB/J/R/P NPr/I+ VLPt Nᴹ/Vg/J . > # > Alice could see , as well as if she were looking over their shoulders , that all # NPr+ NSg/VXB NSg/VB . R/C/P NSg/VB/J/R R/C/P NSg/C ISg+ NSg/VLPt Nᴹ/Vg/J NSg/J/P D$+ NPl/V3+ . NSg/I/C/Ddem NSg/I/J/C/Dq > the jurors were writing down “ stupid things ! ” on their slates , and she could # D NPl NSg/VLPt Nᴹ/Vg/J N🅪Sg/VB/J/P . NSg/J NPl+ . . J/P D$+ NPl/V3 . VB/C ISg+ NSg/VXB > even make out that one of them didn’t know how to spell “ stupid , ” and that he # NSg/VB/J/R NSg/VB NSg/VB/J/R/P NSg/I/C/Ddem NSg/I/J P NSg/IPl+ VXPt VB NSg/C P NSg/VB . NSg/J . . VB/C NSg/I/C/Ddem NPr/ISg+ > had to ask his neighbour to tell him . “ A nice muddle their slates’ll be in # VP P NSg/VB ISg/D$+ NSg/VB/J/Comm+ P NPr/VB ISg+ . . D/P+ NPr/J+ NSg/VB+ D$+ ? NSg/VLXB NPr/J/R/P > before the trial’s over ! ” thought Alice . # C/P D NSg$ NSg/J/P . . N🅪Sg/VP NPr+ . > # > One of the jurors had a pencil that squeaked . This of course , Alice could not # NSg/I/J P D NPl VP D/P NSg/VB+ NSg/I/C/Ddem+ VP/J . I/Ddem P NSg/VB+ . NPr+ NSg/VXB NSg/R/C > stand , and she went round the court and got behind him , and very soon found an # NSg/VB . VB/C ISg+ NSg/VPt NSg/VB/J/P D+ N🅪Sg/VB/J+ VB/C VP NSg/J/P ISg+ . VB/C J/R J/R NSg/VP D/P > opportunity of taking it away . She did it so quickly that the poor little juror # N🅪Sg P NSg/Vg/J NPr/ISg+ VB/J . ISg+ VXPt NPr/ISg+ NSg/I/J/R/C R NSg/I/C/Ddem D NSg/VB/J NPr/I/J/Dq NSg > ( it was Bill , the Lizard ) could not make out at all what had become of it ; so , # . NPr/ISg+ VLPt NPr/VB+ . D NSg . NSg/VXB NSg/R/C NSg/VB NSg/VB/J/R/P NSg/P NSg/I/J/C/Dq NSg/I+ VP VBPp P NPr/ISg+ . NSg/I/J/R/C . > after hunting all about for it , he was obliged to write with one finger for the # P Nᴹ/Vg/J NSg/I/J/C/Dq J/P+ R/C/P NPr/ISg+ . NPr/ISg+ VLPt VP/J P NSg/VB P NSg/I/J NSg/VB+ R/C/P D > rest of the day ; and this was of very little use , as it left no mark on the # NSg/VB P D NPr🅪Sg+ . VB/C I/Ddem+ VLPt P J/R NPr/I/J/Dq N🅪Sg/VB+ . R/C/P NPr/ISg+ NPr/VP/J NSg/Dq/P NPr/VB+ J/P D > slate . # NSg/VB/J+ . > # > “ Herald , read the accusation ! ” said the King . # . NSg/VB+ . NSg/VBP D N🅪Sg . . VP/J D+ NPr/VB/J+ . > # > On this the White Rabbit blew three blasts on the trumpet , and then unrolled the # J/P I/Ddem+ D+ NPr🅪Sg/VB/J+ NSg/VB+ NSg/VPt/J NSg NPl/V3 J/P D NSg/VB+ . VB/C NSg/J/R/C VP/J D > parchment scroll , and read as follows : — # N🅪Sg+ NSg/VB . VB/C NSg/VBP R/C/P NPl/V3 . . > # > “ The Queen of Hearts , she made some tarts , All on a summer day : The Knave of # . D NPr/VB/J P NPl/V3+ . ISg+ VP I/J/R/Dq NPl/V3 . NSg/I/J/C/Dq J/P D/P NPr🅪Sg/VB+ NPr🅪Sg+ . D NSg P > Hearts , he stole those tarts , And took them quite away ! ” # NPl/V3+ . NPr/ISg+ NSg/VPt I/Ddem NPl/V3 . VB/C VPt NSg/IPl+ R VB/J . . > # > “ Consider your verdict , ” the King said to the jury . # . VB D$+ NSg+ . . D+ NPr/VB/J+ VP/J P D+ NSg/VB/J+ . > # > “ Not yet , not yet ! ” the Rabbit hastily interrupted . “ There’s a great deal to # . NSg/R/C NSg/VB/C . NSg/R/C NSg/VB/C . . D+ NSg/VB+ R VP/J . . K D/P NSg/J NSg/VB/J+ P > come before that ! ” # NSg/VBPp/P C/P NSg/I/C/Ddem+ . . > # > “ Call the first witness , ” said the King ; and the White Rabbit blew three blasts # . NSg/VB D+ NSg/J+ NSg/VB+ . . VP/J D+ NPr/VB/J+ . VB/C D+ NPr🅪Sg/VB/J+ NSg/VB+ NSg/VPt/J NSg NPl/V3 > on the trumpet , and called out , “ First witness ! ” # J/P D NSg/VB+ . VB/C VP/J NSg/VB/J/R/P . . NSg/J NSg/VB+ . . > # > The first witness was the Hatter . He came in with a teacup in one hand and a # D+ NSg/J+ NSg/VB+ VLPt D NSg/VB . NPr/ISg+ NSg/VPt/P NPr/J/R/P P D/P NSg/J NPr/J/R/P NSg/I/J NSg/VB+ VB/C D/P > piece of bread - and - butter in the other . “ I beg pardon , your Majesty , ” he began , # NSg/VB P N🅪Sg/VB+ . VB/C . NSg/VB+ NPr/J/R/P D NSg/VB/J . . ISg/#r+ NSg/VB NSg/VB . D$+ N🅪Sg/I+ . . NPr/ISg+ VPt . > “ for bringing these in : but I hadn’t quite finished my tea when I was sent for . ” # . R/C/P Nᴹ/Vg/J I/Ddem NPr/J/R/P . NSg/C/P ISg/#r+ VPt R VP/J D$+ N🅪Sg/VB+ NSg/I/C ISg/#r+ VLPt NSg/VP R/C/P . . > # > “ You ought to have finished , ” said the King . “ When did you begin ? ” # . ISgPl+ NSg/I/VXB P NSg/VXB VP/J . . VP/J D+ NPr/VB/J+ . . NSg/I/C VXPt ISgPl+ NSg/VB . . > # > The Hatter looked at the March Hare , who had followed him into the court , # D NSg/VB VP/J NSg/P D NPr/VB+ NSg/VB/J+ . NPr/I+ VP VP/J ISg+ P D N🅪Sg/VB/J+ . > arm - in - arm with the Dormouse . “ Fourteenth of March , I think it was , ” he said . # NSg/VB/J+ . NPr/J/R/P . NSg/VB/J+ P D NSg . . NSg/J P NPr/VB+ . ISg/#r+ NSg/VB NPr/ISg+ VLPt . . NPr/ISg+ VP/J . > # > “ Fifteenth , ” said the March Hare . # . NSg/J+ . . VP/J D+ NPr/VB+ NSg/VB/J+ . > # > “ Sixteenth , ” added the Dormouse . # . NSg/J . . VP/J D NSg . > # > “ Write that down , ” the King said to the jury , and the jury eagerly wrote down # . NSg/VB NSg/I/C/Ddem+ N🅪Sg/VB/J/P . . D+ NPr/VB/J+ VP/J P D+ NSg/VB/J+ . VB/C D+ NSg/VB/J+ R VPt N🅪Sg/VB/J/P > all three dates on their slates , and then added them up , and reduced the answer # NSg/I/J/C/Dq NSg NPl/V3+ J/P D$+ NPl/V3 . VB/C NSg/J/R/C VP/J NSg/IPl+ NSg/VB/J/P . VB/C VP/J D NSg/VB+ > to shillings and pence . # P NPl VB/C NPl . > # > “ Take off your hat , ” the King said to the Hatter . # . NSg/VB NSg/VB/J/P D$+ NSg/VB+ . . D+ NPr/VB/J+ VP/J P D NSg/VB . > # > “ It isn’t mine , ” said the Hatter . # . NPr/ISg+ NSg/VX3 NSg/I/VB+ . . VP/J D NSg/VB . > # > “ Stolen ! ” the King exclaimed , turning to the jury , who instantly made a # . NSg/VPp/J . . D+ NPr/VB/J+ VP/J . Nᴹ/Vg/J P D+ NSg/VB/J+ . NPr/I+ R VP D/P > memorandum of the fact . # NSg P D NSg+ . > # > “ I keep them to sell , ” the Hatter added as an explanation ; “ I’ve none of my own . # . ISg/#r+ NSg/VB NSg/IPl+ P NSg/VB . . D NSg/VB VP/J R/C/P D/P N🅪Sg+ . . K NSg/I P D$+ NSg/VB/J . > I’m a hatter . ” # K D/P NSg/VB . . > # > Here the Queen put on her spectacles , and began staring at the Hatter , who # J/R D+ NPr/VB/J+ NSg/VBP J/P ISg/D$+ NPl . VB/C VPt Nᴹ/Vg/J NSg/P D NSg/VB . NPr/I+ > turned pale and fidgeted . # VP/J NSg/VB/J VB/C VP/J . > # > “ Give your evidence , ” said the King ; “ and don’t be nervous , or I’ll have you # . NSg/VB D$+ Nᴹ/VB+ . . VP/J D+ NPr/VB/J+ . . VB/C VXB NSg/VLXB J . NPr/C K NSg/VXB ISgPl+ > executed on the spot . ” # VP/J J/P D NSg/VB/J+ . . > # > This did not seem to encourage the witness at all : he kept shifting from one # I/Ddem+ VXPt NSg/R/C VB P VB D+ NSg/VB+ NSg/P NSg/I/J/C/Dq . NPr/ISg+ VP Nᴹ/Vg/J+ P NSg/I/J+ > foot to the other , looking uneasily at the Queen , and in his confusion he bit a # NSg/VB+ P D NSg/VB/J . Nᴹ/Vg/J R NSg/P D NPr/VB/J+ . VB/C NPr/J/R/P ISg/D$+ N🅪Sg/VB+ NPr/ISg+ NSg/VPt D/P > large piece out of his teacup instead of the bread - and - butter . # NSg/J NSg/VB+ NSg/VB/J/R/P P ISg/D$+ NSg/J R P D N🅪Sg/VB+ . VB/C . NSg/VB+ . > # > Just at this moment Alice felt a very curious sensation , which puzzled her a # J/R NSg/P I/Ddem+ NSg+ NPr+ N🅪Sg/VP/J D/P J/R J+ NSg+ . I/C+ VP/J ISg/D$+ D/P+ > good deal until she made out what it was : she was beginning to grow larger # NPr/VB/J+ NSg/VB/J+ C/P ISg+ VP NSg/VB/J/R/P NSg/I+ NPr/ISg+ VLPt . ISg+ VLPt NSg/Vg/J P VB JC > again , and she thought at first she would get up and leave the court ; but on # P . VB/C ISg+ N🅪Sg/VP NSg/P NSg/J ISg+ VXB NSg/VB NSg/VB/J/P VB/C NSg/VB D+ N🅪Sg/VB/J+ . NSg/C/P J/P > second thoughts she decided to remain where she was as long as there was room # NSg/VB/J+ NPl/V3+ ISg+ NSg/VP/J P NSg/VB NSg/R/C ISg+ VLPt R/C/P NPr/VB/J R/C/P R+ VLPt N🅪Sg/VB/J+ > for her . # R/C/P ISg/D$+ . > # > “ I wish you wouldn’t squeeze so . ” said the Dormouse , who was sitting next to # . ISg/#r+ NSg/VB ISgPl+ VXB NSg/VB NSg/I/J/R/C . . VP/J D NSg . NPr/I+ VLPt NSg/Vg/J NSg/J/P P > her . “ I can hardly breathe . ” # ISg/D$+ . . ISg/#r+ NPr/VXB R VB . . > # > “ I can’t help it , ” said Alice very meekly : “ I’m growing . ” # . ISg/#r+ VXB NSg/VB NPr/ISg+ . . VP/J NPr+ J/R R . . K Nᴹ/Vg/J . . > # > “ You’ve no right to grow here , ” said the Dormouse . # . K NSg/Dq/P NPr/VB/J+ P VB J/R . . VP/J D NSg . > # > “ Don’t talk nonsense , ” said Alice more boldly : “ you know you’re growing too . ” # . VXB N🅪Sg/VB Nᴹ/VB/J+ . . VP/J NPr+ NPr/I/J/R/Dq R . . ISgPl+ VB K Nᴹ/Vg/J R . . > # > “ Yes , but I grow at a reasonable pace , ” said the Dormouse : “ not in that # . NPl/VB . NSg/C/P ISg/#r+ VB NSg/P D/P+ J+ NPr/VB/J/P+ . . VP/J D NSg . . NSg/R/C NPr/J/R/P NSg/I/C/Ddem > ridiculous fashion . ” And he got up very sulkily and crossed over to the other # J N🅪Sg/VB+ . . VB/C NPr/ISg+ VP NSg/VB/J/P J/R R VB/C VP/J NSg/J/P P D NSg/VB/J > side of the court . # NSg/VB/J P D N🅪Sg/VB/J+ . > # > All this time the Queen had never left off staring at the Hatter , and , just as # NSg/I/J/C/Dq+ I/Ddem+ N🅪Sg/VB/J+ D+ NPr/VB/J+ VP R NPr/VP/J NSg/VB/J/P Nᴹ/Vg/J NSg/P D NSg/VB . VB/C . J/R R/C/P > the Dormouse crossed the court , she said to one of the officers of the court , # D NSg VP/J D N🅪Sg/VB/J+ . ISg+ VP/J P NSg/I/J P D NPl/V3 P D N🅪Sg/VB/J+ . > “ Bring me the list of the singers in the last concert ! ” on which the wretched # . VB NPr/ISg+ D NSg/VB P D + NPr/J/R/P D NSg/VB/J NSg/VB+ . . J/P I/C+ D J > Hatter trembled so , that he shook both his shoes off . # NSg/VB VP/J NSg/I/J/R/C . NSg/I/C/Ddem NPr/ISg+ NSg/VPt/J I/C/Dq ISg/D$+ NPl/V3+ NSg/VB/J/P . > # > “ Give your evidence , ” the King repeated angrily , “ or I’ll have you executed , # . NSg/VB D$+ Nᴹ/VB+ . . D+ NPr/VB/J+ VP/J R . . NPr/C K NSg/VXB ISgPl+ VP/J . > whether you’re nervous or not . ” # I/C K J NPr/C NSg/R/C . . > # > “ I’m a poor man , your Majesty , ” the Hatter began , in a trembling voice , “ — and I # . K D/P+ NSg/VB/J NPr/VB/J+ . D$+ N🅪Sg/I+ . . D NSg/VB VPt . NPr/J/R/P D/P Nᴹ/Vg/J NSg/VB+ . . . VB/C ISg/#r+ > hadn’t begun my tea — not above a week or so — and what with the bread - and - butter # VPt VPp D$+ N🅪Sg/VB+ . NSg/R/C NSg/J/P D/P NSg/J+ NPr/C NSg/I/J/R/C . VB/C NSg/I+ P D N🅪Sg/VB+ . VB/C . NSg/VB+ > getting so thin — and the twinkling of the tea — ” # NSg/Vg NSg/I/J/R/C NSg/VB/J . VB/C D N🅪Sg/Vg/J P D N🅪Sg/VB+ . . > # > “ The twinkling of the what ? ” said the King . # . D N🅪Sg/Vg/J P D NSg/I+ . . VP/J D+ NPr/VB/J+ . > # > “ It began with the tea , ” the Hatter replied . # . NPr/ISg+ VPt P D+ N🅪Sg/VB+ . . D NSg/VB VP/J . > # > “ Of course twinkling begins with a T ! ” said the King sharply . “ Do you take me # . P NSg/VB+ N🅪Sg/Vg/J NPl/V3 P D/P NPr/J+ . . VP/J D+ NPr/VB/J+ R . . VXB ISgPl+ NSg/VB NPr/ISg+ > for a dunce ? Go on ! ” # R/C/P D/P NSg . NSg/VB/J J/P . . > # > “ I’m a poor man , ” the Hatter went on , “ and most things twinkled after that — only # . K D/P+ NSg/VB/J NPr/VB/J+ . . D NSg/VB NSg/VPt J/P . . VB/C NSg/I/J/R/Dq NPl+ VP/J P NSg/I/C/Ddem+ . J/R/C > the March Hare said — ” # D NPr/VB+ NSg/VB/J+ VP/J . . > # > “ I didn’t ! ” the March Hare interrupted in a great hurry . # . ISg/#r+ VXPt . . D+ NPr/VB+ NSg/VB/J+ VP/J NPr/J/R/P D/P+ NSg/J+ NSg/VB+ . > # > “ You did ! ” said the Hatter . # . ISgPl+ VXPt . . VP/J D NSg/VB . > # > “ I deny it ! ” said the March Hare . # . ISg/#r+ VB NPr/ISg+ . . VP/J D+ NPr/VB+ NSg/VB/J+ . > # > “ He denies it , ” said the King : “ leave out that part . ” # . NPr/ISg+ V3 NPr/ISg+ . . VP/J D NPr/VB/J+ . . NSg/VB NSg/VB/J/R/P NSg/I/C/Ddem NSg/VB/J+ . . > # > “ Well , at any rate , the Dormouse said — ” the Hatter went on , looking anxiously # . NSg/VB/J/R . NSg/P I/R/Dq+ NSg/VB+ . D NSg VP/J . . D NSg/VB NSg/VPt J/P . Nᴹ/Vg/J R > round to see if he would deny it too : but the Dormouse denied nothing , being # NSg/VB/J/P P NSg/VB NSg/C NPr/ISg+ VXB VB NPr/ISg+ R . NSg/C/P D NSg VP/J NSg/I/J+ . N🅪Sg/VLg/J/C > fast asleep . # NSg/VB/J/R J . > # > “ After that , ” continued the Hatter , “ I cut some more bread - and - butter — ” # . P NSg/I/C/Ddem+ . . VP/J D NSg/VB . . ISg/#r+ NSg/VBP/J I/J/R/Dq NPr/I/J/R/Dq N🅪Sg/VB+ . VB/C . NSg/VB+ . . > # > “ But what did the Dormouse say ? ” one of the jury asked . # . NSg/C/P NSg/I+ VXPt D NSg NSg/VB . . NSg/I/J P D+ NSg/VB/J+ VP/J . > # > “ That I can’t remember , ” said the Hatter . # . NSg/I/C/Ddem ISg/#r+ VXB NSg/VB . . VP/J D NSg/VB . > # > “ You must remember , ” remarked the King , “ or I’ll have you executed . ” # . ISgPl+ NSg/VXB NSg/VB . . VP/J D+ NPr/VB/J+ . . NPr/C K NSg/VXB ISgPl+ VP/J . . > # > The miserable Hatter dropped his teacup and bread - and - butter , and went down on # D J NSg/VB VP/J ISg/D$+ NSg/J VB/C N🅪Sg/VB+ . VB/C . NSg/VB+ . VB/C NSg/VPt N🅪Sg/VB/J/P J/P > one knee . “ I’m a poor man , your Majesty , ” he began . # NSg/I/J NSg/VB+ . . K D/P+ NSg/VB/J NPr/VB/J+ . D$+ N🅪Sg/I+ . . NPr/ISg+ VPt . > # > “ You’re a very poor speaker , ” said the King . # . K D/P J/R NSg/VB/J NSg+ . . VP/J D NPr/VB/J+ . > # > Here one of the guinea - pigs cheered , and was immediately suppressed by the # J/R NSg/I/J P D+ NPr+ . NPl/V3+ VP/J . VB/C VLPt R VP/J NSg/P D > officers of the court . ( As that is rather a hard word , I will just explain to # NPl/V3 P D+ N🅪Sg/VB/J+ . . R/C/P NSg/I/C/Ddem+ VL3 NPr/VB/J/R D/P N🅪Sg/J/R NSg/VB . ISg/#r+ NPr/VXB J/R VB P > you how it was done . They had a large canvas bag , which tied up at the mouth # ISgPl+ NSg/C NPr/ISg+ VLPt NSg/VPp/J . IPl+ VP D/P+ NSg/J+ NSg/VB+ NSg/VB+ . I/C+ VP/J NSg/VB/J/P NSg/P D NSg/VB+ > with strings : into this they slipped the guinea - pig , head first , and then sat # P NPl/V3+ . P I/Ddem+ IPl+ VP/J D NPr+ . NSg/VB . NPr/VB/J+ NSg/J . VB/C NSg/J/R/C NSg/VP/J > upon it . ) # P NPr/ISg+ . . > # > “ I’m glad I’ve seen that done , ” thought Alice . “ I’ve so often read in the # . K NSg/VB/J K NSg/VPp NSg/I/C/Ddem+ NSg/VPp/J . . N🅪Sg/VP NPr+ . . K NSg/I/J/R/C R NSg/VBP NPr/J/R/P D > newspapers , at the end of trials , “ There was some attempts at applause , which # NPl/V3+ . NSg/P D NSg/VB P NPl/V3+ . . R+ VLPt I/J/R/Dq NPl/V3+ NSg/P Nᴹ+ . I/C+ > was immediately suppressed by the officers of the court , ” and I never understood # VLPt R VP/J NSg/P D NPl/V3 P D N🅪Sg/VB/J+ . . VB/C ISg/#r+ R VP/J > what it meant till now . ” # NSg/I+ NPr/ISg+ VP NSg/VB/C/P NSg/J/R/C . . > # > “ If that’s all you know about it , you may stand down , ” continued the King . # . NSg/C NSg$ NSg/I/J/C/Dq ISgPl+ VB J/P NPr/ISg+ . ISgPl+ NPr/VXB NSg/VB N🅪Sg/VB/J/P . . VP/J D NPr/VB/J+ . > # > “ I can’t go no lower , ” said the Hatter : “ I’m on the floor , as it is . ” # . ISg/#r+ VXB NSg/VB/J NSg/Dq/P NSg/VB/JC . . VP/J D NSg/VB . . K J/P D NSg/VB+ . R/C/P NPr/ISg+ VL3 . . > # > “ Then you may sit down , ” the King replied . # . NSg/J/R/C ISgPl+ NPr/VXB NSg/VB N🅪Sg/VB/J/P . . D+ NPr/VB/J+ VP/J . > # > Here the other guinea - pig cheered , and was suppressed . # J/R D NSg/VB/J NPr+ . NSg/VB+ VP/J . VB/C VLPt VP/J . > # > “ Come , that finished the guinea - pigs ! ” thought Alice . “ Now we shall get on # . NSg/VBPp/P . NSg/I/C/Ddem+ VP/J D NPr+ . NPl/V3+ . . N🅪Sg/VP NPr+ . . NSg/J/R/C IPl+ VXB NSg/VB J/P > better . ” # NSg/VXB/JC . . > # > “ I’d rather finish my tea , ” said the Hatter , with an anxious look at the Queen , # . K NPr/VB/J/R NSg/VB D$+ N🅪Sg/VB+ . . VP/J D NSg/VB . P D/P J NSg/VB NSg/P D NPr/VB/J+ . > who was reading the list of singers . # NPr/I+ VLPt NPrᴹ/Vg/J D NSg/VB P + . > # > “ You may go , ” said the King , and the Hatter hurriedly left the court , without # . ISgPl+ NPr/VXB NSg/VB/J . . VP/J D+ NPr/VB/J+ . VB/C D NSg/VB R NPr/VP/J D N🅪Sg/VB/J+ . C/P > even waiting to put his shoes on . # NSg/VB/J/R Nᴹ/Vg/J P NSg/VBP ISg/D$+ NPl/V3+ J/P . > # > “ — and just take his head off outside , ” the Queen added to one of the officers : # . . VB/C J/R NSg/VB ISg/D$+ NPr/VB/J+ NSg/VB/J/P Nᴹ/VB/J/P . . D+ NPr/VB/J+ VP/J P NSg/I/J P D+ NPl/V3+ . > but the Hatter was out of sight before the officer could get to the door . # NSg/C/P D NSg/VB VLPt NSg/VB/J/R/P P N🅪Sg/VB+ C/P D NSg/VB+ NSg/VXB NSg/VB P D NSg/VB+ . > # > “ Call the next witness ! ” said the King . # . NSg/VB D+ NSg/J/P+ NSg/VB+ . . VP/J D+ NPr/VB/J+ . > # > The next witness was the Duchess’s cook . She carried the pepper - box in her hand , # D+ NSg/J/P+ NSg/VB+ VLPt D NSg$ NPr/VB . ISg+ VP/J D N🅪Sg/VB+ . NSg/VB NPr/J/R/P ISg/D$+ NSg/VB+ . > and Alice guessed who it was , even before she got into the court , by the way the # VB/C NPr+ VP/J NPr/I+ NPr/ISg+ VLPt . NSg/VB/J/R C/P ISg+ VP P D+ N🅪Sg/VB/J+ . NSg/P D+ NSg/J+ D > people near the door began sneezing all at once . # NPl/VB+ NSg/VB/J/P D+ NSg/VB+ VPt Nᴹ/Vg/J NSg/I/J/C/Dq NSg/P NSg/C . > # > “ Give your evidence , ” said the King . # . NSg/VB D$+ Nᴹ/VB+ . . VP/J D+ NPr/VB/J+ . > # > “ Shan’t , ” said the cook . # . VXB . . VP/J D NPr/VB+ . > # > The King looked anxiously at the White Rabbit , who said in a low voice , “ Your # D+ NPr/VB/J+ VP/J R NSg/P D+ NPr🅪Sg/VB/J+ NSg/VB+ . NPr/I+ VP/J NPr/J/R/P D/P+ NSg/VB/J/R+ NSg/VB+ . . D$+ > Majesty must cross - examine this witness . ” # N🅪Sg/I+ NSg/VXB NPr/VB/J/P+ . NSg/VB I/Ddem+ NSg/VB+ . . > # > “ Well , if I must , I must , ” the King said , with a melancholy air , and , after # . NSg/VB/J/R . NSg/C ISg/#r+ NSg/VXB . ISg/#r+ NSg/VXB . . D+ NPr/VB/J+ VP/J . P D/P NSg/J N🅪Sg/VB+ . VB/C . P > folding his arms and frowning at the cook till his eyes were nearly out of # Nᴹ/Vg/J ISg/D$+ NPl/V3+ VB/C Nᴹ/Vg/J NSg/P D NPr/VB+ NSg/VB/C/P ISg/D$+ NPl/V3+ NSg/VLPt R NSg/VB/J/R/P P > sight , he said in a deep voice , “ What are tarts made of ? ” # N🅪Sg/VB+ . NPr/ISg+ VP/J NPr/J/R/P D/P NSg/J NSg/VB+ . . NSg/I+ VLB NPl/V3 VP P . . > # > “ Pepper , mostly , ” said the cook . # . N🅪Sg/VB+ . R . . VP/J D+ NPr/VB+ . > # > “ Treacle , ” said a sleepy voice behind her . # . Nᴹ/VB . . VP/J D/P NSg/J NSg/VB+ NSg/J/P ISg/D$+ . > # > “ Collar that Dormouse , ” the Queen shrieked out . “ Behead that Dormouse ! Turn that # . NSg/VB+ NSg/I/C/Ddem+ NSg . . D NPr/VB/J+ VP/J NSg/VB/J/R/P . . VB NSg/I/C/Ddem+ NSg . NSg/VB NSg/I/C/Ddem+ > Dormouse out of court ! Suppress him ! Pinch him ! Off with his whiskers ! ” # NSg NSg/VB/J/R/P P N🅪Sg/VB/J+ . VB ISg+ . NSg/VB ISg+ . NSg/VB/J/P P ISg/D$+ NPl . . > # > For some minutes the whole court was in confusion , getting the Dormouse turned # R/C/P I/J/R/Dq+ NPl/V3+ D+ NSg/J+ N🅪Sg/VB/J+ VLPt NPr/J/R/P N🅪Sg/VB+ . NSg/Vg D NSg VP/J > out , and , by the time they had settled down again , the cook had disappeared . # NSg/VB/J/R/P . VB/C . NSg/P D N🅪Sg/VB/J+ IPl+ VP VP/J N🅪Sg/VB/J/P P . D NPr/VB+ VP VP/J . > # > “ Never mind ! ” said the King , with an air of great relief . “ Call the next # . R NSg/VB+ . . VP/J D+ NPr/VB/J+ . P D/P N🅪Sg/VB P NSg/J+ NSg/J+ . . NSg/VB D+ NSg/J/P+ > witness . ” And he added in an undertone to the Queen , “ Really , my dear , you must # NSg/VB+ . . VB/C NPr/ISg+ VP/J NPr/J/R/P D/P NSg/VB P D NPr/VB/J+ . . R . D$+ NSg/VB/J . ISgPl+ NSg/VXB > cross - examine the next witness . It quite makes my forehead ache ! ” # NPr/VB/J/P+ . NSg/VB D NSg/J/P NSg/VB+ . NPr/ISg+ R NPl/V3 D$+ NSg+ NSg/VB+ . . > # > Alice watched the White Rabbit as he fumbled over the list , feeling very curious # NPr+ VP/J D+ NPr🅪Sg/VB/J+ NSg/VB+ R/C/P NPr/ISg+ VP/J NSg/J/P D NSg/VB+ . N🅪Sg/Vg/J J/R J > to see what the next witness would be like , “ — for they haven’t got much evidence # P NSg/VB NSg/I+ D NSg/J/P NSg/VB+ VXB NSg/VLXB NSg/VB/J/C/P . . . R/C/P IPl+ VXB VP NSg/I/J/R/Dq Nᴹ/VB+ > yet , ” she said to herself . Imagine her surprise , when the White Rabbit read out , # NSg/VB/C . . ISg+ VP/J P ISg+ . NSg/VB ISg/D$+ NSg/VB+ . NSg/I/C D+ NPr🅪Sg/VB/J+ NSg/VB+ NSg/VBP NSg/VB/J/R/P . > at the top of his shrill little voice , the name “ Alice ! ” # NSg/P D NSg/VB/J P ISg/D$+ NSg/VB/J NPr/I/J/Dq+ NSg/VB+ . D+ NSg/VB+ . NPr+ . . > # > CHAPTER XII : Alice’s Evidence # HeadingStart NSg/VB+ #r . NPr$ Nᴹ/VB+ > # > “ Here ! ” cried Alice , quite forgetting in the flurry of the moment how large she # . J/R . . VP/J NPr+ . R NSg/Vg NPr/J/R/P D NSg/VB P D NSg+ NSg/C NSg/J ISg+ > had grown in the last few minutes , and she jumped up in such a hurry that she # VP VB/J NPr/J/R/P D NSg/VB/J NSg/I/Dq NPl/V3+ . VB/C ISg+ VP/J NSg/VB/J/P NPr/J/R/P NSg/I D/P NSg/VB+ NSg/I/C/Ddem+ ISg+ > tipped over the jury - box with the edge of her skirt , upsetting all the jurymen # VP NSg/J/P D NSg/VB/J+ . NSg/VB P D NSg/VB P ISg/D$+ NSg/VB . NSg/Vg/J NSg/I/J/C/Dq D NPl > on to the heads of the crowd below , and there they lay sprawling about , # J/P P D NPl/V3 P D NSg/VB+ P . VB/C R+ IPl+ NSg/VBPt/J Nᴹ/Vg/J J/P . > reminding her very much of a globe of goldfish she had accidentally upset the # Nᴹ/Vg/J ISg/D$+ J/R NSg/I/J/R/Dq P D/P NSg/VB P NSgPl ISg+ VP R NSg/VB/J D > week before . # NSg/J+ C/P . > # > “ Oh , I beg your pardon ! ” she exclaimed in a tone of great dismay , and began # . NPr/VB . ISg/#r+ NSg/VB D$+ NSg/VB . . ISg+ VP/J NPr/J/R/P D/P N🅪Sg/I/VB P NSg/J+ NSg/VB+ . VB/C VPt > picking them up again as quickly as she could , for the accident of the goldfish # Nᴹ/Vg/J NSg/IPl+ NSg/VB/J/P P R/C/P R R/C/P ISg+ NSg/VXB . R/C/P D NSg/J P D NSgPl > kept running in her head , and she had a vague sort of idea that they must be # VP Nᴹ/Vg/J/P NPr/J/R/P ISg/D$+ NPr/VB/J+ . VB/C ISg+ VP D/P NSg/VB/J NSg/VB P NSg+ NSg/I/C/Ddem+ IPl+ NSg/VXB NSg/VLXB > collected at once and put back into the jury - box , or they would die . # VP/J NSg/P NSg/C VB/C NSg/VBP NSg/VB/J P D NSg/VB/J+ . NSg/VB+ . NPr/C IPl+ VXB NSg/VB . > # > “ The trial cannot proceed , ” said the King in a very grave voice , “ until all the # . D+ NSg/VB/J+ NSg/VXB VB . . VP/J D NPr/VB/J+ NPr/J/R/P D/P J/R NSg/VB/J+ NSg/VB+ . . C/P NSg/I/J/C/Dq D > jurymen are back in their proper places — all , ” he repeated with great emphasis , # NPl VLB NSg/VB/J NPr/J/R/P D$+ NSg/J NPl/V3+ . NSg/I/J/C/Dq . . NPr/ISg+ VP/J P NSg/J NSg+ . > looking hard at Alice as he said so . # Nᴹ/Vg/J N🅪Sg/J/R NSg/P NPr+ R/C/P NPr/ISg+ VP/J NSg/I/J/R/C . > # > Alice looked at the jury - box , and saw that , in her haste , she had put the Lizard # NPr+ VP/J NSg/P D NSg/VB/J+ . NSg/VB+ . VB/C NSg/VPt NSg/I/C/Ddem+ . NPr/J/R/P ISg/D$+ NSg/VB+ . ISg+ VP NSg/VBP D NSg > in head downwards , and the poor little thing was waving its tail about in a # NPr/J/R/P NPr/VB/J+ R . VB/C D NSg/VB/J NPr/I/J/Dq NSg+ VLPt Nᴹ/Vg/J ISg/D$+ NSg/VB/J+ J/P NPr/J/R/P D/P > melancholy way , being quite unable to move . She soon got it out again , and put # NSg/J NSg/J+ . N🅪Sg/VLg/J/C R NSg/VB/J P NSg/VB . ISg+ J/R VP NPr/ISg+ NSg/VB/J/R/P P . VB/C NSg/VBP > it right ; “ not that it signifies much , ” she said to herself ; “ I should think it # NPr/ISg+ NPr/VB/J . . NSg/R/C NSg/I/C/Ddem NPr/ISg+ V3 NSg/I/J/R/Dq . . ISg+ VP/J P ISg+ . . ISg/#r+ VXB NSg/VB NPr/ISg+ > would be quite as much use in the trial one way up as the other . ” # VXB NSg/VLXB R R/C/P NSg/I/J/R/Dq N🅪Sg/VB NPr/J/R/P D+ NSg/VB/J+ NSg/I/J+ NSg/J+ NSg/VB/J/P R/C/P D NSg/VB/J . . > # > As soon as the jury had a little recovered from the shock of being upset , and # R/C/P J/R R/C/P D+ NSg/VB/J+ VP D/P NPr/I/J/Dq VP/J+ P D N🅪Sg/J P N🅪Sg/VLg/J/C NSg/VB/J . VB/C > their slates and pencils had been found and handed back to them , they set to # D$+ NPl/V3 VB/C NPl/V3+ VP NSg/VLPp NSg/VP VB/C VP/J NSg/VB/J P NSg/IPl+ . IPl+ NPr/VBP/J P > work very diligently to write out a history of the accident , all except the # N🅪Sg/VB J/R R P NSg/VB NSg/VB/J/R/P D/P N🅪Sg P D NSg/J+ . NSg/I/J/C/Dq VB/C/P D > Lizard , who seemed too much overcome to do anything but sit with its mouth open , # NSg . NPr/I+ VP/J R NSg/I/J/R/Dq VB P VXB NSg/I/VB+ NSg/C/P NSg/VB P ISg/D$+ NSg/VB+ NSg/VB/J . > gazing up into the roof of the court . # Nᴹ/Vg/J NSg/VB/J/P P D NSg/VB P D N🅪Sg/VB/J+ . > # > “ What do you know about this business ? ” the King said to Alice . # . NSg/I+ VXB ISgPl+ VB J/P I/Ddem+ N🅪Sg/J+ . . D+ NPr/VB/J+ VP/J P NPr+ . > # > “ Nothing , ” said Alice . # . NSg/I/J+ . . VP/J NPr+ . > # > “ Nothing whatever ? ” persisted the King . # . NSg/I/J+ NSg/I/J+ . . VP/J D+ NPr/VB/J+ . > # > “ Nothing whatever , ” said Alice . # . NSg/I/J+ NSg/I/J+ . . VP/J NPr+ . > # > “ That’s very important , ” the King said , turning to the jury . They were just # . NSg$ J/R J . . D NPr/VB/J+ VP/J . Nᴹ/Vg/J P D NSg/VB/J+ . IPl+ NSg/VLPt J/R > beginning to write this down on their slates , when the White Rabbit interrupted : # NSg/Vg/J P NSg/VB I/Ddem N🅪Sg/VB/J/P J/P D$+ NPl/V3 . NSg/I/C D NPr🅪Sg/VB/J NSg/VB+ VP/J . > “ Unimportant , your Majesty means , of course , ” he said in a very respectful tone , # . J . D$+ N🅪Sg/I+ NPl/V3 . P NSg/VB+ . . NPr/ISg+ VP/J NPr/J/R/P D/P J/R J N🅪Sg/I/VB+ . > but frowning and making faces at him as he spoke . # NSg/C/P Nᴹ/Vg/J VB/C Nᴹ/Vg/J NPl/V3+ NSg/P ISg+ R/C/P NPr/ISg+ NSg/VPt . > # > “ Unimportant , of course , I meant , ” the King hastily said , and went on to himself # . J . P NSg/VB+ . ISg/#r+ VP . . D+ NPr/VB/J+ R VP/J . VB/C NSg/VPt J/P P ISg+ > in an undertone , # NPr/J/R/P D/P NSg/VB . > # > “ important — unimportant — unimportant — important — ” as if he were trying which word # . J . J . J . J . . R/C/P NSg/C NPr/ISg+ NSg/VLPt Nᴹ/Vg/J I/C+ NSg/VB+ > sounded best . # VP/J NPr/VXB/JS . > # > Some of the jury wrote it down “ important , ” and some “ unimportant . ” Alice could # I/J/R/Dq P D+ NSg/VB/J+ VPt NPr/ISg+ N🅪Sg/VB/J/P . J . . VB/C I/J/R/Dq . J . . NPr+ NSg/VXB > see this , as she was near enough to look over their slates ; “ but it doesn’t # NSg/VB I/Ddem+ . R/C/P ISg+ VLPt NSg/VB/J/P NSg/I P NSg/VB NSg/J/P D$+ NPl/V3 . . NSg/C/P NPr/ISg+ VX3 > matter a bit , ” she thought to herself . # N🅪Sg/VB+ D/P NSg/VPt+ . . ISg+ N🅪Sg/VP P ISg+ . > # > At this moment the King , who had been for some time busily writing in his # NSg/P I/Ddem+ NSg+ D+ NPr/VB/J+ . NPr/I+ VP NSg/VLPp R/C/P I/J/R/Dq+ N🅪Sg/VB/J+ R Nᴹ/Vg/J NPr/J/R/P ISg/D$+ > note - book , cackled out “ Silence ! ” and read out from his book , “ Rule Forty - two . # NSg/VB+ . NSg/VB+ . VP/J NSg/VB/J/R/P . NSg/VB+ . . VB/C NSg/VBP NSg/VB/J/R/P P ISg/D$+ NSg/VB+ . . NSg/VB+ NSg/J . NSg . > All persons more than a mile high to leave the court . ” # NSg/I/J/C/Dq+ NPl/V3+ NPr/I/J/R/Dq C/P D/P+ NSg+ NSg/VB/J/R P NSg/VB D+ N🅪Sg/VB/J+ . . > # > Everybody looked at Alice . # NSg/I+ VP/J NSg/P NPr+ . > # > “ I’m not a mile high , ” said Alice . # . K NSg/R/C D/P NSg+ NSg/VB/J/R . . VP/J NPr+ . > # > “ You are , ” said the King . # . ISgPl+ VLB . . VP/J D+ NPr/VB/J+ . > # > “ Nearly two miles high , ” added the Queen . # . R NSg+ NPrPl+ NSg/VB/J/R . . VP/J D+ NPr/VB/J+ . > # > “ Well , I shan’t go , at any rate , ” said Alice : “ besides , that’s not a regular # . NSg/VB/J/R . ISg/#r+ VXB NSg/VB/J . NSg/P I/R/Dq NSg/VB+ . . VP/J NPr+ . . R/P . NSg$ NSg/R/C D/P NSg/J > rule : you invented it just now . ” # NSg/VB+ . ISgPl+ VP/J NPr/ISg+ J/R NSg/J/R/C . . > # > “ It’s the oldest rule in the book , ” said the King . # . K D JS NSg/VB+ NPr/J/R/P D NSg/VB+ . . VP/J D NPr/VB/J+ . > # > “ Then it ought to be Number One , ” said Alice . # . NSg/J/R/C NPr/ISg+ NSg/I/VXB P NSg/VLXB N🅪Sg/VB/JC+ NSg/I/J . . VP/J NPr+ . > # > The King turned pale , and shut his note - book hastily . “ Consider your verdict , ” # D+ NPr/VB/J+ VP/J NSg/VB/J . VB/C NSg/VBP/J ISg/D$+ NSg/VB+ . NSg/VB+ R . . VB D$+ NSg+ . . > he said to the jury , in a low , trembling voice . # NPr/ISg+ VP/J P D+ NSg/VB/J+ . NPr/J/R/P D/P NSg/VB/J/R . Nᴹ/Vg/J NSg/VB+ . > # > “ There’s more evidence to come yet , please your Majesty , ” said the White Rabbit , # . K NPr/I/J/R/Dq Nᴹ/VB+ P NSg/VBPp/P NSg/VB/C . VB D$+ N🅪Sg/I+ . . VP/J D NPr🅪Sg/VB/J NSg/VB+ . > jumping up in a great hurry ; “ this paper has just been picked up . ” # Nᴹ/Vg/J NSg/VB/J/P NPr/J/R/P D/P NSg/J NSg/VB+ . . I/Ddem N🅪Sg/VB/J+ V3 J/R NSg/VLPp VP/J NSg/VB/J/P . . > # > “ What’s in it ? ” said the Queen . # . K NPr/J/R/P NPr/ISg+ . . VP/J D+ NPr/VB/J+ . > # > “ I haven’t opened it yet , ” said the White Rabbit , “ but it seems to be a letter , # . ISg/#r+ VXB VP/J NPr/ISg+ NSg/VB/C . . VP/J D NPr🅪Sg/VB/J NSg/VB+ . . NSg/C/P NPr/ISg+ V3 P NSg/VLXB D/P NSg/VB+ . > written by the prisoner to — to somebody . ” # VPp/J NSg/P D NSg+ P . P NSg/I+ . . > # > “ It must have been that , ” said the King , “ unless it was written to nobody , which # . NPr/ISg+ NSg/VXB NSg/VXB NSg/VLPp NSg/I/C/Ddem+ . . VP/J D+ NPr/VB/J+ . . C NPr/ISg+ VLPt VPp/J P NSg/I+ . I/C+ > isn’t usual , you know . ” # NSg/VX3 NSg/J . ISgPl+ VB . . > # > “ Who is it directed to ? ” said one of the jurymen . # . NPr/I+ VL3 NPr/ISg+ VP/J P . . VP/J NSg/I/J P D NPl . > # > “ It isn’t directed at all , ” said the White Rabbit ; “ in fact , there’s nothing # . NPr/ISg+ NSg/VX3 VP/J NSg/P NSg/I/J/C/Dq . . VP/J D NPr🅪Sg/VB/J NSg/VB+ . . NPr/J/R/P NSg+ . K NSg/I/J+ > written on the outside . ” He unfolded the paper as he spoke , and added “ It isn’t # VPp/J J/P D Nᴹ/VB/J/P . . NPr/ISg+ VP/J D+ N🅪Sg/VB/J+ R/C/P NPr/ISg+ NSg/VPt . VB/C VP/J . NPr/ISg+ NSg/VX3 > a letter , after all : it’s a set of verses . ” # D/P+ NSg/VB+ . P NSg/I/J/C/Dq . K D/P NPr/VBP/J+ P NPl/V3 . . > # > “ Are they in the prisoner’s handwriting ? ” asked another of the jurymen . # . VLB IPl+ NPr/J/R/P D NSg$ Nᴹ/VB . . VP/J I/D P D NPl . > # > “ No , they’re not , ” said the White Rabbit , “ and that’s the queerest thing about # . NSg/Dq/P . K NSg/R/C . . VP/J D NPr🅪Sg/VB/J NSg/VB+ . . VB/C NSg$ D JS NSg+ J/P > it . ” ( The jury all looked puzzled . ) # NPr/ISg+ . . . D+ NSg/VB/J+ NSg/I/J/C/Dq VP/J VP/J . . > # > “ He must have imitated somebody else’s hand , ” said the King . ( The jury all # . NPr/ISg+ NSg/VXB NSg/VXB VP/J NSg/I+ NSg$ NSg/VB+ . . VP/J D NPr/VB/J+ . . D+ NSg/VB/J+ NSg/I/J/C/Dq > brightened up again . ) # VP/J NSg/VB/J/P P . . > # > “ Please your Majesty , ” said the Knave , “ I didn’t write it , and they can’t prove # . VB D$+ N🅪Sg/I+ . . VP/J D NSg . . ISg/#r+ VXPt NSg/VB NPr/ISg+ . VB/C IPl+ VXB NSg/VB > I did : there’s no name signed at the end . ” # ISg/#r+ VXPt . K NSg/Dq/P NSg/VB+ VP/J NSg/P D NSg/VB+ . . > # > “ If you didn’t sign it , ” said the King , “ that only makes the matter worse . You # . NSg/C ISgPl+ VXPt NSg/VB+ NPr/ISg+ . . VP/J D NPr/VB/J+ . . NSg/I/C/Ddem+ J/R/C NPl/V3 D N🅪Sg/VB+ NSg/VB/JC . ISgPl+ > must have meant some mischief , or else you’d have signed your name like an # NSg/VXB NSg/VXB VP I/J/R/Dq+ NSg/VB+ . NPr/C NSg/J/C K NSg/VXB VP/J D$+ NSg/VB+ NSg/VB/J/C/P D/P > honest man . ” # VB/JS NPr/VB/J+ . . > # > There was a general clapping of hands at this : it was the first really clever # R+ VLPt D/P NSg/VB/J Nᴹ/Vg P NPl/V3+ NSg/P I/Ddem+ . NPr/ISg+ VLPt D NSg/J R J > thing the King had said that day . # NSg+ D+ NPr/VB/J+ VP VP/J NSg/I/C/Ddem NPr🅪Sg+ . > # > “ That proves his guilt , ” said the Queen . # . NSg/I/C/Ddem+ NPl/V3 ISg/D$+ NSg/VB+ . . VP/J D+ NPr/VB/J+ . > # > “ It proves nothing of the sort ! ” said Alice . “ Why , you don’t even know what # . NPr/ISg+ NPl/V3 NSg/I/J P D+ NSg/VB+ . . VP/J NPr+ . . NSg/VB . ISgPl+ VXB NSg/VB/J/R VB NSg/I+ > they’re about ! ” # K J/P . . > # > “ Read them , ” said the King . # . NSg/VBP NSg/IPl+ . . VP/J D+ NPr/VB/J+ . > # > The White Rabbit put on his spectacles . “ Where shall I begin , please your # D+ NPr🅪Sg/VB/J+ NSg/VB+ NSg/VBP J/P ISg/D$+ NPl . . NSg/R/C VXB ISg/#r+ NSg/VB . VB D$+ > Majesty ? ” he asked . # N🅪Sg/I+ . . NPr/ISg+ VP/J . > # > “ Begin at the beginning , ” the King said gravely , “ and go on till you come to the # . NSg/VB NSg/P D+ NSg/Vg/J+ . . D+ NPr/VB/J+ VP/J R . . VB/C NSg/VB/J J/P NSg/VB/C/P ISgPl+ NSg/VBPp/P P D > end : then stop . ” # NSg/VB+ . NSg/J/R/C NSg/VB . . > # > These were the verses the White Rabbit read : — # I/Ddem+ NSg/VLPt D NPl/V3 D NPr🅪Sg/VB/J NSg/VB+ NSg/VBP . . > # > “ They told me you had been to her , And mentioned me to him : She gave me a good # . IPl+ VP NPr/ISg+ ISgPl+ VP NSg/VLPp P ISg/D$+ . VB/C VP/J NPr/ISg+ P ISg+ . ISg+ VPt NPr/ISg+ D/P+ NPr/VB/J+ > character , But said I could not swim . # N🅪Sg/VB+ . NSg/C/P VP/J ISg/#r+ NSg/VXB NSg/R/C NSg/VB . > # > He sent them word I had not gone ( We know it to be true ) : If she should push # NPr/ISg+ NSg/VP NSg/IPl+ NSg/VB+ ISg/#r+ VP NSg/R/C VPp/J/P . IPl+ VB NPr/ISg+ P NSg/VLXB NSg/VB/J . . NSg/C ISg+ VXB NSg/VB > the matter on , What would become of you ? # D+ N🅪Sg/VB+ J/P . NSg/I+ VXB VBPp P ISgPl+ . > # > I gave her one , they gave him two , You gave us three or more ; They all # ISg/#r+ VPt ISg/D$+ NSg/I/J . IPl+ VPt ISg+ NSg . ISgPl+ VPt NPr/IPl+ NSg NPr/C NPr/I/J/R/Dq . IPl+ NSg/I/J/C/Dq > returned from him to you , Though they were mine before . # VP/J+ P ISg+ P ISgPl+ . C IPl+ NSg/VLPt NSg/I/VB+ C/P . > # > If I or she should chance to be Involved in this affair , He trusts to you to # NSg/C ISg/#r+ NPr/C ISg+ VXB NPr/VB/J+ P NSg/VLXB VP/J NPr/J/R/P I/Ddem+ NSg+ . NPr/ISg+ NPl/V3 P ISgPl+ P > set them free , Exactly as we were . # NPr/VBP/J NSg/IPl+ NSg/VB/J . R R/C/P IPl+ NSg/VLPt . > # > My notion was that you had been ( Before she had this fit ) An obstacle that # D$+ NSg+ VLPt NSg/I/C/Ddem ISgPl+ VP NSg/VLPp . C/P ISg+ VP I/Ddem+ NSg/VBP/J+ . D/P+ NSg+ NSg/I/C/Ddem+ > came between Him , and ourselves , and it . # NSg/VPt/P NSg/P ISg+ . VB/C IPl+ . VB/C NPr/ISg+ . > # > Don’t let him know she liked them best , For this must ever be A secret , kept # VXB NSg/VBP ISg+ VB ISg+ VP/J NSg/IPl+ NPr/VXB/JS . R/C/P I/Ddem+ NSg/VXB J/R NSg/VLXB D/P NSg/VB/J . VP > from all the rest , Between yourself and me . ” # P NSg/I/J/C/Dq D NSg/VB+ . NSg/P ISg+ VB/C NPr/ISg+ . . > # > “ That’s the most important piece of evidence we’ve heard yet , ” said the King , # . NSg$ D NSg/I/J/R/Dq J NSg/VB P Nᴹ/VB+ K VP/J NSg/VB/C . . VP/J D NPr/VB/J+ . > rubbing his hands ; “ so now let the jury — ” # NSg/Vg ISg/D$+ NPl/V3+ . . NSg/I/J/R/C NSg/J/R/C NSg/VBP D NSg/VB/J+ . . > # > “ If any one of them can explain it , ” said Alice , ( she had grown so large in the # . NSg/C I/R/Dq NSg/I/J P NSg/IPl+ NPr/VXB VB NPr/ISg+ . . VP/J NPr+ . . ISg+ VP VB/J NSg/I/J/R/C NSg/J NPr/J/R/P D+ > last few minutes that she wasn’t a bit afraid of interrupting him , ) “ I’ll give # NSg/VB/J+ NSg/I/Dq+ NPl/V3+ NSg/I/C/Ddem+ ISg+ VPt D/P NSg/VPt+ J P Nᴹ/Vg/J ISg+ . . . K NSg/VB > him sixpence . I don’t believe there’s an atom of meaning in it . ” # ISg+ NSg . ISg/#r+ VXB VB K D/P NSg P N🅪Sg/Vg/J+ NPr/J/R/P NPr/ISg+ . . > # > The jury all wrote down on their slates , “ She doesn’t believe there’s an atom of # D+ NSg/VB/J+ NSg/I/J/C/Dq VPt N🅪Sg/VB/J/P J/P D$+ NPl/V3 . . ISg+ VX3 VB K D/P NSg P > meaning in it , ” but none of them attempted to explain the paper . # N🅪Sg/Vg/J+ NPr/J/R/P NPr/ISg+ . . NSg/C/P NSg/I P NSg/IPl+ VP/J P VB D N🅪Sg/VB/J+ . > # > “ If there’s no meaning in it , ” said the King , “ that saves a world of trouble , # . NSg/C K NSg/Dq/P N🅪Sg/Vg/J+ NPr/J/R/P NPr/ISg+ . . VP/J D NPr/VB/J+ . . NSg/I/C/Ddem+ NPl/V3 D/P NSg/VB P N🅪Sg/VB+ . > you know , as we needn’t try to find any . And yet I don’t know , ” he went on , # ISgPl+ VB . R/C/P IPl+ VXB NSg/VB/J P NSg/VB I/R/Dq . VB/C NSg/VB/C ISg/#r+ VXB VB . . NPr/ISg+ NSg/VPt J/P . > spreading out the verses on his knee , and looking at them with one eye ; “ I seem # Nᴹ/Vg/J NSg/VB/J/R/P D NPl/V3 J/P ISg/D$+ NSg/VB+ . VB/C Nᴹ/Vg/J NSg/P NSg/IPl+ P NSg/I/J NSg/VB+ . . ISg/#r+ VB > to see some meaning in them , after all . “ — said I could not swim — ” you can’t # P NSg/VB I/J/R/Dq N🅪Sg/Vg/J+ NPr/J/R/P NSg/IPl+ . P NSg/I/J/C/Dq . . . VP/J ISg/#r+ NSg/VXB NSg/R/C NSg/VB . . ISgPl+ VXB > swim , can you ? ” he added , turning to the Knave . # NSg/VB . NPr/VXB ISgPl+ . . NPr/ISg+ VP/J . Nᴹ/Vg/J P D NSg . > # > The Knave shook his head sadly . “ Do I look like it ? ” he said . ( Which he # D NSg NSg/VPt/J ISg/D$+ NPr/VB/J+ R . . VXB ISg/#r+ NSg/VB NSg/VB/J/C/P NPr/ISg+ . . NPr/ISg+ VP/J . . I/C+ NPr/ISg+ > certainly did not , being made entirely of cardboard . ) # R VXPt NSg/R/C . N🅪Sg/VLg/J/C VP R P Nᴹ/J+ . . > # > “ All right , so far , ” said the King , and he went on muttering over the verses to # . NSg/I/J/C/Dq NPr/VB/J . NSg/I/J/R/C NSg/VB/J . . VP/J D+ NPr/VB/J+ . VB/C NPr/ISg+ NSg/VPt J/P Nᴹ/Vg/J NSg/J/P D NPl/V3 P > himself : “ ‘ We know it to be true — ’ that’s the jury , of course — ‘ I gave her one , # ISg+ . . Unlintable IPl+ VB NPr/ISg+ P NSg/VLXB NSg/VB/J . . NSg$ D NSg/VB/J+ . P NSg/VB+ . Unlintable ISg/#r+ VPt ISg/D$+ NSg/I/J . > they gave him two — ’ why , that must be what he did with the tarts , you know — ” # IPl+ VPt ISg+ NSg . . NSg/VB . NSg/I/C/Ddem+ NSg/VXB NSg/VLXB NSg/I+ NPr/ISg+ VXPt P D NPl/V3 . ISgPl+ VB . . > # > “ But , it goes on ‘ they all returned from him to you , ’ ” said Alice . # . NSg/C/P . NPr/ISg+ NPl/V3 J/P Unlintable IPl+ NSg/I/J/C/Dq VP/J+ P ISg+ P ISgPl+ . . . VP/J NPr+ . > # > “ Why , there they are ! ” said the King triumphantly , pointing to the tarts on the # . NSg/VB . R+ IPl+ VLB . . VP/J D+ NPr/VB/J+ R . Nᴹ/Vg/J P D NPl/V3 J/P D > table . “ Nothing can be clearer than that . Then again — ‘ before she had this fit — ’ # NSg/VB+ . . NSg/I/J+ NPr/VXB NSg/VLXB NSg/JC C/P NSg/I/C/Ddem+ . NSg/J/R/C P . Unlintable C/P ISg+ VP I/Ddem+ NSg/VBP/J+ . . > you never had fits , my dear , I think ? ” he said to the Queen . # ISgPl+ R VP NPl/V3 . D$+ NSg/VB/J . ISg/#r+ NSg/VB . . NPr/ISg+ VP/J P D+ NPr/VB/J+ . > # > “ Never ! ” said the Queen furiously , throwing an inkstand at the Lizard as she # . R . . VP/J D+ NPr/VB/J+ R . Nᴹ/Vg/J D/P NSg NSg/P D NSg R/C/P ISg+ > spoke . ( The unfortunate little Bill had left off writing on his slate with one # NSg/VPt . . D+ NSg/J+ NPr/I/J/Dq+ NPr/VB+ VP NPr/VP/J NSg/VB/J/P Nᴹ/Vg/J J/P ISg/D$+ NSg/VB/J+ P NSg/I/J+ > finger , as he found it made no mark ; but he now hastily began again , using the # NSg/VB+ . R/C/P NPr/ISg+ NSg/VP NPr/ISg+ VP NSg/Dq/P+ NPr/VB+ . NSg/C/P NPr/ISg+ NSg/J/R/C R VPt P . Nᴹ/Vg/J D+ > ink , that was trickling down his face , as long as it lasted . ) # N🅪Sg/VB+ . NSg/I/C/Ddem+ VLPt Nᴹ/Vg/J N🅪Sg/VB/J/P ISg/D$+ NSg/VB+ . R/C/P NPr/VB/J R/C/P NPr/ISg+ VP/J . . > # > “ Then the words don’t fit you , ” said the King , looking round the court with a # . NSg/J/R/C D+ NPl/V3+ VXB NSg/VBP/J ISgPl+ . . VP/J D NPr/VB/J+ . Nᴹ/Vg/J NSg/VB/J/P D N🅪Sg/VB/J+ P D/P > smile . There was a dead silence . # NSg/VB+ . R+ VLPt D/P+ NSg/VB/J+ NSg/VB+ . > # > “ It’s a pun ! ” the King added in an offended tone , and everybody laughed , “ Let # . K D/P+ NSg/VB+ . . D+ NPr/VB/J+ VP/J NPr/J/R/P D/P+ VP/J N🅪Sg/I/VB+ . VB/C NSg/I+ VP/J . . NSg/VBP > the jury consider their verdict , ” the King said , for about the twentieth time # D+ NSg/VB/J+ VB D$+ NSg+ . . D+ NPr/VB/J+ VP/J . R/C/P J/P D+ NSg/J+ N🅪Sg/VB/J+ > that day . # NSg/I/C/Ddem+ NPr🅪Sg+ . > # > “ No , no ! ” said the Queen . “ Sentence first — verdict afterwards . ” # . NSg/Dq/P . NSg/Dq/P . . VP/J D+ NPr/VB/J+ . . NSg/VB+ NSg/J . NSg+ R/Comm . . > # > “ Stuff and nonsense ! ” said Alice loudly . “ The idea of having the sentence # . Nᴹ/VB VB/C Nᴹ/VB/J+ . . VP/J NPr+ R . . D NSg P Nᴹ/Vg/J D+ NSg/VB+ > first ! ” # NSg/J . . > # > “ Hold your tongue ! ” said the Queen , turning purple . # . NSg/VB/J D$+ N🅪Sg/VB+ . . VP/J D+ NPr/VB/J+ . Nᴹ/Vg/J N🅪Sg/VB/J . > # > “ I won’t ! ” said Alice . # . ISg/#r+ VXB . . VP/J NPr+ . > # > “ Off with her head ! ” the Queen shouted at the top of her voice . Nobody moved . # . NSg/VB/J/P P ISg/D$+ NPr/VB/J+ . . D+ NPr/VB/J+ VP/J NSg/P D NSg/VB/J P ISg/D$+ NSg/VB+ . NSg/I+ VP/J . > # > “ Who cares for you ? ” said Alice , ( she had grown to her full size by this time . ) # . NPr/I+ NPl/V3 R/C/P ISgPl+ . . VP/J NPr+ . . ISg+ VP VB/J P ISg/D$+ NSg/VB/J+ N🅪Sg/VB+ NSg/P I/Ddem+ N🅪Sg/VB/J+ . . > “ You’re nothing but a pack of cards ! ” # . K NSg/I/J+ NSg/C/P D/P NSg/VB P NPl/V3+ . . > # > At this the whole pack rose up into the air , and came flying down upon her : she # NSg/P I/Ddem+ D+ NSg/J+ NSg/VB+ NPr/VPt/J NSg/VB/J/P P D+ N🅪Sg/VB+ . VB/C NSg/VPt/P Nᴹ/Vg/J N🅪Sg/VB/J/P P ISg/D$+ . ISg+ > gave a little scream , half of fright and half of anger , and tried to beat them # VPt D/P+ NPr/I/J/Dq+ NSg/VB+ . N🅪Sg/J/P P NSg/VB/J VB/C N🅪Sg/J/P P Nᴹ/VB+ . VB/C VP/J P N🅪Sg/VB/J NSg/IPl+ > off , and found herself lying on the bank , with her head in the lap of her # NSg/VB/J/P . VB/C NSg/VP ISg+ Nᴹ/Vg/J J/P D NSg/VB+ . P ISg/D$+ NPr/VB/J+ NPr/J/R/P D NSg/VB/J P ISg/D$+ > sister , who was gently brushing away some dead leaves that had fluttered down # NSg/VB+ . NPr/I+ VLPt R Nᴹ/Vg/J VB/J I/J/R/Dq NSg/VB/J NPl/V3+ NSg/I/C/Ddem+ VP VP/J N🅪Sg/VB/J/P > from the trees upon her face . # P D NPl/V3+ P ISg/D$+ NSg/VB+ . > # > “ Wake up , Alice dear ! ” said her sister ; “ Why , what a long sleep you’ve had ! ” # . NPr/VB NSg/VB/J/P . NPr+ NSg/VB/J . . VP/J ISg/D$+ NSg/VB+ . . NSg/VB . NSg/I+ D/P+ NPr/VB/J+ N🅪Sg/VB+ K VP . . > # > “ Oh , I’ve had such a curious dream ! ” said Alice , and she told her sister , as # . NPr/VB . K VP NSg/I D/P J NSg/VB/J+ . . VP/J NPr+ . VB/C ISg+ VP ISg/D$+ NSg/VB+ . R/C/P > well as she could remember them , all these strange Adventures of hers that you # NSg/VB/J/R R/C/P ISg+ NSg/VXB NSg/VB NSg/IPl+ . NSg/I/J/C/Dq I/Ddem NSg/VB/J NPl/V3 P ISg+ NSg/I/C/Ddem ISgPl+ > have just been reading about ; and when she had finished , her sister kissed her , # NSg/VXB J/R NSg/VLPp NPrᴹ/Vg/J J/P . VB/C NSg/I/C ISg+ VP VP/J . ISg/D$+ NSg/VB+ VP/J ISg/D$+ . > and said , “ It was a curious dream , dear , certainly : but now run in to your tea ; # VB/C VP/J . . NPr/ISg+ VLPt D/P J NSg/VB/J . NSg/VB/J . R . NSg/C/P NSg/J/R/C NSg/VBPp NPr/J/R/P P D$+ N🅪Sg/VB+ . > it’s getting late . ” So Alice got up and ran off , thinking while she ran , as well # K NSg/Vg NSg/J . . NSg/I/J/R/C NPr+ VP NSg/VB/J/P VB/C NSg/VPt NSg/VB/J/P . Nᴹ/Vg/J NSg/VB/C/P ISg+ NSg/VPt . R/C/P NSg/VB/J/R > she might , what a wonderful dream it had been . # ISg+ Nᴹ/VXB/J . NSg/I+ D/P+ J+ NSg/VB/J+ NPr/ISg+ VP NSg/VLPp . > # > But her sister sat still just as she left her , leaning her head on her hand , # NSg/C/P ISg/D$+ NSg/VB+ NSg/VP/J NSg/VB/J/R J/R R/C/P ISg+ NPr/VP/J ISg/D$+ . Nᴹ/Vg/J ISg/D$+ NPr/VB/J+ J/P ISg/D$+ NSg/VB+ . > watching the setting sun , and thinking of little Alice and all her wonderful # Nᴹ/Vg/J D+ N🅪Sg/Vg/J+ NPr/VB+ . VB/C Nᴹ/Vg/J P NPr/I/J/Dq+ NPr+ VB/C NSg/I/J/C/Dq+ ISg/D$+ J+ > Adventures , till she too began dreaming after a fashion , and this was her # NPl/V3+ . NSg/VB/C/P ISg+ R VPt Nᴹ/Vg/J+ P D/P+ N🅪Sg/VB+ . VB/C I/Ddem+ VLPt ISg/D$+ > dream : — # NSg/VB/J+ . . > # > First , she dreamed of little Alice herself , and once again the tiny hands were # NSg/J . ISg+ VP/J/NoAm/Au P NPr/I/J/Dq+ NPr+ ISg+ . VB/C NSg/C P D+ NSg/J+ NPl/V3+ NSg/VLPt > clasped upon her knee , and the bright eager eyes were looking up into hers — she # VP/J P ISg/D$+ NSg/VB+ . VB/C D NPr/VB/J NSg/VB/J NPl/V3+ NSg/VLPt Nᴹ/Vg/J NSg/VB/J/P P ISg+ . ISg+ > could hear the very tones of her voice , and see that queer little toss of her # NSg/VXB VB D J/R NPl/V3 P ISg/D$+ NSg/VB+ . VB/C NSg/VB NSg/I/C/Ddem NSg/VB/J NPr/I/J/Dq NSg/VB P ISg/D$+ > head to keep back the wandering hair that would always get into her eyes — and # NPr/VB/J+ P NSg/VB NSg/VB/J D Nᴹ/Vg/J N🅪Sg/VB+ NSg/I/C/Ddem+ VXB R NSg/VB P ISg/D$+ NPl/V3+ . VB/C > still as she listened , or seemed to listen , the whole place around her became # NSg/VB/J/R R/C/P ISg+ VP/J . NPr/C VP/J P NSg/VB . D NSg/J N🅪Sg/VB+ J/P ISg/D$+ VPt > alive with the strange creatures of her little sister’s dream . # J P D NSg/VB/J NPl P ISg/D$+ NPr/I/J/Dq NSg$ NSg/VB/J+ . > # > The long grass rustled at her feet as the White Rabbit hurried by — the frightened # D+ NPr/VB/J+ NPr🅪Sg/VB+ VP/J NSg/P ISg/D$+ NPl+ R/C/P D NPr🅪Sg/VB/J NSg/VB+ VP/J NSg/P . D VP/J > Mouse splashed his way through the neighbouring pool — she could hear the rattle # NSg/VB+ VP/J ISg/D$+ NSg/J+ NSg/J/P D Nᴹ/Vg/J/Comm NSg/VB+ . ISg+ NSg/VXB VB D NSg/VB > of the teacups as the March Hare and his friends shared their never - ending meal , # P D NPl R/C/P D NPr/VB+ NSg/VB/J+ VB/C ISg/D$+ NPrPl/V3+ VP/J D$+ R . Nᴹ/Vg/J NSg/VB+ . > and the shrill voice of the Queen ordering off her unfortunate guests to # VB/C D NSg/VB/J NSg/VB P D NPr/VB/J+ Nᴹ/Vg/J+ NSg/VB/J/P ISg/D$+ NSg/J NPl/V3+ P > execution — once more the pig - baby was sneezing on the Duchess’s knee , while # N🅪Sg . NSg/C NPr/I/J/R/Dq D NSg/VB+ . NSg/VB/J+ VLPt Nᴹ/Vg/J J/P D NSg$ NSg/VB+ . NSg/VB/C/P > plates and dishes crashed around it — once more the shriek of the Gryphon , the # NPl/V3 VB/C NPl/V3+ VP/J J/P NPr/ISg+ . NSg/C NPr/I/J/R/Dq D NSg/VB P D ? . D > squeaking of the Lizard’s slate - pencil , and the choking of the suppressed # Nᴹ/Vg/J P D NSg$ NSg/VB/J+ . NSg/VB+ . VB/C D Nᴹ/Vg/J P D VP/J > guinea - pigs , filled the air , mixed up with the distant sobs of the miserable # NPr+ . NPl/V3+ . VP/J D N🅪Sg/VB+ . VP/J NSg/VB/J/P P D J NPl/V3 P D J > Mock Turtle . # NSg/VB/J NSg/VB+ . > # > So she sat on , with closed eyes , and half believed herself in Wonderland , though # NSg/I/J/R/C ISg+ NSg/VP/J J/P . P VP/J NPl/V3+ . VB/C N🅪Sg/J/P+ VP/J ISg+ NPr/J/R/P NSg+ . C > she knew she had but to open them again , and all would change to dull # ISg+ VPt ISg+ VP NSg/C/P P NSg/VB/J NSg/IPl+ P . VB/C NSg/I/J/C/Dq VXB N🅪Sg/VB P VB/J+ > reality — the grass would be only rustling in the wind , and the pool rippling to # N🅪Sg+ . D+ NPr🅪Sg/VB+ VXB NSg/VLXB J/R/C Nᴹ/Vg/J NPr/J/R/P D N🅪Sg/VB+ . VB/C D NSg/VB+ Nᴹ/Vg/J P > the waving of the reeds — the rattling teacups would change to tinkling # D Nᴹ/Vg/J P D NPl+ . D Nᴹ/Vg/J NPl VXB N🅪Sg/VB+ P Nᴹ/Vg/J > sheep - bells , and the Queen’s shrill cries to the voice of the shepherd boy — and # NSgPl+ . NPl/V3 . VB/C D NPr$ NSg/VB/J NPl/V3 P D NSg/VB P D NPr/VB+ NSg/VB+ . VB/C > the sneeze of the baby , the shriek of the Gryphon , and all the other queer # D NSg/VB P D NSg/VB/J+ . D NSg/VB P D ? . VB/C NSg/I/J/C/Dq D NSg/VB/J NSg/VB/J > noises , would change ( she knew ) to the confused clamour of the busy # NPl/V3+ . VXB N🅪Sg/VB+ . ISg+ VPt . P D VP/J NSg/VB/Comm P D NSg/VB/J > farm - yard — while the lowing of the cattle in the distance would take the place of # NSg/VB+ . NSg/VB+ . NSg/VB/C/P D Nᴹ/Vg/J P D Nᴹ/VB+ NPr/J/R/P D N🅪Sg/VB+ VXB NSg/VB D N🅪Sg/VB+ P > the Mock Turtle’s heavy sobs . # D NSg/VB/J NSg$ NSg/VB/J NPl/V3 . > # > Lastly , she pictured to herself how this same little sister of hers would , in # R . ISg+ VP/J P ISg+ NSg/C I/Ddem I/J NPr/I/J/Dq NSg/VB P ISg+ VXB . NPr/J/R/P > the after - time , be herself a grown woman ; and how she would keep , through all # D P . N🅪Sg/VB/J+ . NSg/VLXB ISg+ D/P VB/J NSg/VB+ . VB/C NSg/C ISg+ VXB NSg/VB . NSg/J/P NSg/I/J/C/Dq > her riper years , the simple and loving heart of her childhood : and how she would # ISg/D$+ NSg NPl+ . D NSg/VB/J VB/C Nᴹ/Vg/J N🅪Sg/VB P ISg/D$+ NSg+ . VB/C NSg/C ISg+ VXB > gather about her other little children , and make their eyes bright and eager # NSg/VB J/P ISg/D$+ NSg/VB/J NPr/I/J/Dq NPl+ . VB/C NSg/VB D$+ NPl/V3+ NPr/VB/J VB/C NSg/VB/J > with many a strange tale , perhaps even with the dream of Wonderland of long ago : # P NSg/I/J/Dq D/P NSg/VB/J NSg/VB+ . NSg/R NSg/VB/J/R P D NSg/VB/J P NSg+ P NPr/VB/J J/P . > and how she would feel with all their simple sorrows , and find a pleasure in all # VB/C NSg/C ISg+ VXB NSg/I/VB P NSg/I/J/C/Dq D$+ NSg/VB/J NPl/V3+ . VB/C NSg/VB D/P NSg/VB+ NPr/J/R/P NSg/I/J/C/Dq > their simple joys , remembering her own child - life , and the happy summer days . # D$+ NSg/VB/J NPl/V3+ . Nᴹ/Vg/J ISg/D$+ NSg/VB/J NSg/VB+ . N🅪Sg/VB+ . VB/C D NSg/VB/J NPr🅪Sg/VB+ NPl+ . > # > THE END # D+ NSg/VB+ ================================================ FILE: harper-core/tests/text/tagged/Computer science.md ================================================ > # Unlintable Unlintable > Computer science # Unlintable HeadingStart NSg+ N🅪Sg/VB+ > # > Computer science is the study of computation , information , and automation . # NSg+ N🅪Sg/VB+ VL3 D NSg/VB P NSg . Nᴹ+ . VB/C N🅪Sg . > Computer science spans theoretical disciplines ( such as algorithms , theory of # NSg+ N🅪Sg/VB+ NPl/V3 J NPl/V3+ . NSg/I R/C/P NPl+ . N🅪Sg P > computation , and information theory ) to applied disciplines ( including the # NSg . VB/C Nᴹ+ N🅪Sg+ . P VP/J NPl/V3+ . Nᴹ/Vg/J D > design and implementation of hardware and software ) . # N🅪Sg/VB+ VB/C N🅪Sg P Nᴹ VB/C Nᴹ+ . . > # > Algorithms and data structures are central to computer science . The theory of # NPl VB/C N🅪Pl+ NPl/V3+ VLB NPr/J P NSg N🅪Sg/VB+ . D N🅪Sg P > computation concerns abstract models of computation and general classes of # NSg NPl/V3+ NSg/VB/J NPl/V3 P NSg VB/C NSg/VB/J NPl/V3 P > problems that can be solved using them . The fields of cryptography and computer # NPl+ NSg/I/C/Ddem+ NPr/VXB NSg/VLXB VP/J Nᴹ/Vg/J NSg/IPl+ . D NPrPl/V3 P Nᴹ VB/C NSg+ > security involve studying the means for secure communication and preventing # Nᴹ+ VB Nᴹ/Vg/J D NPl/V3 R/C/P VB/J N🅪Sg+ VB/C Nᴹ/Vg/J > security vulnerabilities . Computer graphics and computational geometry address # Nᴹ+ NPl+ . NSg+ NSgPl VB/C J+ N🅪Sg+ NSg/VB+ > the generation of images . Programming language theory considers different ways # D NSg P NPl/V3+ . Nᴹ/Vg/J+ N🅪Sg+ N🅪Sg+ V3 NSg/J NPl+ > to describe computational processes , and database theory concerns the management # P VB J+ NPl/V3+ . VB/C NSg/VB+ N🅪Sg+ NPl/V3+ D N🅪Sg > of repositories of data . Human – computer interaction investigates the interfaces # P NPl P N🅪Pl+ . NSg/VB/J . NSg+ N🅪Sg+ V3 D+ NPl/V3+ > through which humans and computers interact , and software engineering focuses on # NSg/J/P I/C+ NPl/V3 VB/C NPl+ NSg/VB . VB/C Nᴹ+ Nᴹ/Vg/J+ NPl/V3 J/P > the design and principles behind developing software . Areas such as operating # D N🅪Sg/VB+ VB/C NPl/V3+ NSg/J/P Nᴹ/Vg/J Nᴹ+ . NPl+ NSg/I R/C/P Nᴹ/Vg/J > systems , networks and embedded systems investigate the principles and design # NPl+ . NPl/V3+ VB/C VP/J NPl+ VB D NPl/V3 VB/C N🅪Sg/VB+ > behind complex systems . Computer architecture describes the construction of # NSg/J/P NSg/VB/J+ NPl+ . NSg+ N🅪Sg+ V3 D N🅪Sg P > computer components and computer - operated equipment . Artificial intelligence and # NSg+ NPl VB/C NSg+ . VP/J Nᴹ+ . J N🅪Sg VB/C > machine learning aim to synthesize goal - orientated processes such as # NSg/VB+ Nᴹ/Vg/J+ NSg/VB P VB NSg/VB+ . VP/J NPl/V3 NSg/I R/C/P > problem - solving , decision - making , environmental adaptation , planning and # NSg/J+ . Nᴹ/Vg/J . NSg/VB+ . Nᴹ/Vg/J . NSg/J NSg+ . NSg/Vg VB/C > learning found in humans and animals . Within artificial intelligence , computer # Nᴹ/Vg/J+ NSg/VP NPr/J/R/P NPl/V3 VB/C NPl+ . NSg/J/P J+ N🅪Sg+ . NSg+ > vision aims to understand and process image and video data , while natural # N🅪Sg/VB+ NPl/V3 P VB VB/C NSg/VB+ N🅪Sg/VB VB/C N🅪Sg/VB+ N🅪Pl+ . NSg/VB/C/P NSg/J+ > language processing aims to understand and process textual and linguistic data . # N🅪Sg+ Nᴹ/Vg/J+ NPl/V3 P VB VB/C NSg/VB+ J VB/C J N🅪Pl+ . > # > The fundamental concern of computer science is determining what can and cannot # D NSg/J N🅪Sg/VB P NSg+ N🅪Sg/VB+ VL3 Nᴹ/Vg/J NSg/I+ NPr/VXB VB/C NSg/VXB > be automated . The Turing Award is generally recognized as the highest # NSg/VLXB VP/J . D NPr NSg/VB+ VL3 R VP/J R/C/P D JS > distinction in computer science . # N🅪Sg NPr/J/R/P NSg+ N🅪Sg/VB+ . > # > History # HeadingStart N🅪Sg+ > # > The earliest foundations of what would become computer science predate the # D JS NPl P NSg/I+ VXB VBPp NSg+ N🅪Sg/VB+ NSg/VB D > invention of the modern digital computer . Machines for calculating fixed # N🅪Sg P D NSg/J NSg/J NSg+ . NPl/V3+ R/C/P Nᴹ/Vg/J VP/J > numerical tasks such as the abacus have existed since antiquity , aiding in # J+ NPl/V3+ NSg/I R/C/P D NSg NSg/VXB VP/J C/P NSg+ . Nᴹ/Vg/J NPr/J/R/P > computations such as multiplication and division . Algorithms for performing # NPl NSg/I R/C/P Nᴹ VB/C NSg+ . NPl+ R/C/P Nᴹ/Vg/J > computations have existed since antiquity , even before the development of # NPl NSg/VXB VP/J C/P NSg+ . NSg/VB/J/R C/P D N🅪Sg P > sophisticated computing equipment . # VP/J Nᴹ/Vg/J+ Nᴹ+ . > # > Wilhelm Schickard designed and constructed the first working mechanical # NPr ? VP/J VB/C VP/J D NSg/J Nᴹ/Vg/J NSg/J > calculator in 1623 . In 1673 , Gottfried Leibniz demonstrated a digital mechanical # NSg+ NPr/J/R/P # . NPr/J/R/P # . ? NPr VP/J D/P NSg/J NSg/J > calculator , called the Stepped Reckoner . Leibniz may be considered the first # NSg+ . VP/J D J ? . NPr NPr/VXB NSg/VLXB VP/J D NSg/J > computer scientist and information theorist , because of various reasons , # NSg+ NSg VB/C Nᴹ+ NSg . C/P P J NPl/V3+ . > including the fact that he documented the binary number system . In 1820 , Thomas # Nᴹ/Vg/J D NSg+ NSg/I/C/Ddem+ NPr/ISg+ VP/J D N🅪Sg/J+ N🅪Sg/VB/JC+ NSg+ . NPr/J/R/P # . NPr+ > de Colmar launched the mechanical calculator industry [ note 1 ] when he invented # NPr+ ? VP/J D NSg/J NSg+ N🅪Sg+ . NSg/VB+ # . NSg/I/C NPr/ISg+ VP/J > his simplified arithmometer , the first calculating machine strong enough and # ISg/D$+ VP/J ? . D NSg/J Nᴹ/Vg/J NSg/VB+ NPr/J NSg/I VB/C > reliable enough to be used daily in an office environment . Charles Babbage # NSg/J NSg/I P NSg/VLXB VP/J NSg/VB/J/R NPr/J/R/P D/P NSg/VB+ N🅪Sg+ . NPr+ NPr > started the design of the first automatic mechanical calculator , his Difference # VP/J D N🅪Sg/VB P D NSg/J NSg/J NSg/J NSg+ . ISg/D$+ N🅪Sg/VB+ > Engine , in 1822 , which eventually gave him the idea of the first programmable # NSg/VB+ . NPr/J/R/P # . I/C+ R VPt ISg+ D NSg P D NSg/J NSg/J > mechanical calculator , his Analytical Engine . He started developing this machine # NSg/J NSg+ . ISg/D$+ J NSg/VB+ . NPr/ISg+ VP/J Nᴹ/Vg/J I/Ddem+ NSg/VB+ > in 1834 , and " in less than two years , he had sketched out many of the salient # NPr/J/R/P # . VB/C . NPr/J/R/P VB/J/R/C/P C/P NSg+ NPl+ . NPr/ISg+ VP VP/J NSg/VB/J/R/P NSg/I/J/Dq P D NSg/J > features of the modern computer " . " A crucial step was the adoption of a punched # NPl/V3 P D NSg/J NSg+ . . . D/P+ J+ NSg/VB+ VLPt D N🅪Sg P D/P VP/J > card system derived from the Jacquard loom " making it infinitely # N🅪Sg/VB+ NSg+ VP/J P D NPr NSg/VB . Nᴹ/Vg/J NPr/ISg+ R > programmable . [ note 2 ] In 1843 , during the translation of a French article on the # NSg/J . . NSg/VB+ # . NPr/J/R/P # . VB/P D N🅪Sg P D/P NPr🅪Sg/VB/J NSg/VB+ J/P D > Analytical Engine , Ada Lovelace wrote , in one of the many notes she included , an # J NSg/VB+ . NPr+ NPr VPt . NPr/J/R/P NSg/I/J P D NSg/I/J/Dq NPl/V3+ ISg+ VP/J . D/P > algorithm to compute the Bernoulli numbers , which is considered to be the first # NSg P NSg/VB D NPr+ NPrPl/V3+ . I/C+ VL3 VP/J P NSg/VLXB D NSg/J > published algorithm ever specifically tailored for implementation on a computer . # VP/J NSg J/R R VP/J R/C/P N🅪Sg+ J/P D/P NSg+ . > Around 1885 , Herman Hollerith invented the tabulator , which used punched cards # J/P # . NPr+ NPr VP/J D NSg . I/C+ VP/J VP/J NPl/V3+ > to process statistical information ; eventually his company became part of IBM . # P NSg/VB J Nᴹ+ . R ISg/D$+ N🅪Sg+ VPt NSg/VB/J P NPr+ . > Following Babbage , although unaware of his earlier work , Percy Ludgate in 1909 # N🅪Sg/Vg/J/P NPr . C VB/J P ISg/D$+ JC N🅪Sg/VB+ . NPr+ ? NPr/J/R/P # > published the 2nd of the only two designs for mechanical analytical engines in # VP/J D # P D J/R/C NSg NPl/V3+ R/C/P NSg/J J NPl/V3 NPr/J/R/P > history . In 1914 , the Spanish engineer Leonardo Torres Quevedo published his # N🅪Sg+ . NPr/J/R/P # . D+ NPrᴹ/J+ NSg/VB+ NPr+ NPr ? VP/J ISg/D$+ > Essays on Automatics , and designed , inspired by Babbage , a theoretical # NPl/V3+ J/P NPl . VB/C VP/J . VP/J NSg/P NPr . D/P J > electromechanical calculating machine which was to be controlled by a read - only # J Nᴹ/Vg/J NSg/VB+ I/C+ VLPt P NSg/VLXB VP/J NSg/P D/P NSg/VBP+ . J/R/C > program . The paper also introduced the idea of floating - point arithmetic . In # NPr/VB+ . D+ N🅪Sg/VB/J+ R/C VP/J D NSg P Nᴹ/Vg/J+ . NSg/VB+ Nᴹ/J . NPr/J/R/P > 1920 , to celebrate the 100th anniversary of the invention of the arithmometer , # # . P VB D # NSg P D N🅪Sg P D ? . > Torres presented in Paris the Electromechanical Arithmometer , a prototype that # NPr VP/J NPr/J/R/P NPr+ D J ? . D/P NSg/VB+ NSg/I/C/Ddem+ > demonstrated the feasibility of an electromechanical analytical engine , on which # VP/J D Nᴹ P D/P J J NSg/VB+ . J/P I/C+ > commands could be typed and the results printed automatically . In 1937 , one # NPl/V3+ NSg/VXB NSg/VLXB VP/J VB/C D NPl/V3+ VP/J R . NPr/J/R/P # . NSg/I/J > hundred years after Babbage's impossible dream , Howard Aiken convinced IBM , # NSg NPl+ P NPr$ NSg/J NSg/VB/J+ . NPr+ NPr VP/J NPr+ . > which was making all kinds of punched card equipment and was also in the # I/C+ VLPt Nᴹ/Vg/J NSg/I/J/C/Dq NPl P VP/J N🅪Sg/VB+ Nᴹ+ VB/C VLPt R/C NPr/J/R/P D > calculator business to develop his giant programmable calculator , the # NSg+ N🅪Sg/J+ P VB ISg/D$+ NSg/J NSg/J NSg+ . D > ASCC / Harvard Mark I , based on Babbage's Analytical Engine , which itself used # ? . NPr+ NPr/VB+ ISg/#r+ . VP/J J/P NPr$ J NSg/VB+ . I/C+ ISg+ VP/J > cards and a central computing unit . When the machine was finished , some hailed # NPl/V3 VB/C D/P NPr/J Nᴹ/Vg/J+ NSg+ . NSg/I/C D+ NSg/VB+ VLPt VP/J . I/J/R/Dq VP/J > it as " Babbage's dream come true " . # NPr/ISg+ R/C/P . NPr$ NSg/VB/J+ NSg/VBPp/P NSg/VB/J . . > # > During the 1940s , with the development of new and more powerful computing # VB/P D+ #d . P D N🅪Sg P NSg/J VB/C NPr/I/J/R/Dq J Nᴹ/Vg/J+ > machines such as the Atanasoff – Berry computer and ENIAC , the term computer came # NPl/V3 NSg/I R/C/P D ? . NPr🅪Sg/VB+ NSg+ VB/C ? . D NSg/VB/J+ NSg+ NSg/VPt/P > to refer to the machines rather than their human predecessors . As it became # P NSg/VB P D NPl/V3+ NPr/VB/J/R C/P D$+ NSg/VB/J NPl+ . R/C/P NPr/ISg+ VPt > clear that computers could be used for more than just mathematical calculations , # NSg/VB/J NSg/I/C/Ddem NPl+ NSg/VXB NSg/VLXB VP/J R/C/P NPr/I/J/R/Dq C/P J/R J+ + . > the field of computer science broadened to study computation in general . In # D NSg/VB P NSg+ N🅪Sg/VB+ VP/J P NSg/VB NSg NPr/J/R/P NSg/VB/J . NPr/J/R/P > 1945 , IBM founded the Watson Scientific Computing Laboratory at Columbia # # . NPr+ VP/J D+ NPr+ J+ Nᴹ/Vg/J+ NSg+ NSg/P NPr+ > University in New York City . The renovated fraternity house on Manhattan's West # NSg NPr/J/R/P NSg/J+ NPr+ NSg+ . D VP/J NSg+ NPr/VB J/P NPr$ NPr/VB/J+ > Side was IBM's first laboratory devoted to pure science . The lab is the # NSg/VB/J+ VLPt NPr$ NSg/J NSg+ VP/J P NSg/VB/J N🅪Sg/VB+ . D+ NPr+ VL3 D > forerunner of IBM's Research Division , which today operates research facilities # NSg P NPr$ Nᴹ/VB+ NSg+ . I/C+ NSg/J+ V3 Nᴹ/VB+ NPl+ > around the world . Ultimately , the close relationship between IBM and Columbia # J/P D NSg/VB+ . R . D NSg/VB/J NSg NSg/P NPr VB/C NPr+ > University was instrumental in the emergence of a new scientific discipline , # NSg+ VLPt NSg/J NPr/J/R/P D Nᴹ P D/P NSg/J J NSg/VB+ . > with Columbia offering one of the first academic - credit courses in computer # P NPr+ N🅪Sg/Vg/J NSg/I/J P D NSg/J NSg/J . NSg/VB+ NPl/V3 NPr/J/R/P NSg+ > science in 1946 . Computer science began to be established as a distinct academic # N🅪Sg/VB+ NPr/J/R/P # . NSg+ N🅪Sg/VB+ VPt P NSg/VLXB VP/J R/C/P D/P VB/J NSg/J > discipline in the 1950s and early 1960s . The world's first computer science # NSg/VB+ NPr/J/R/P D #d VB/C NSg/J/R+ #d . D NSg$ NSg/J NSg+ N🅪Sg/VB+ > degree program , the Cambridge Diploma in Computer Science , began at the # NSg+ NPr/VB+ . D NPr+ NSg NPr/J/R/P NSg+ N🅪Sg/VB+ . VPt NSg/P D > University of Cambridge Computer Laboratory in 1953 . The first computer science # NSg P NPr+ NSg+ NSg+ NPr/J/R/P # . D+ NSg/J+ NSg+ N🅪Sg/VB+ > department in the United States was formed at Purdue University in 1962 . Since # NSg+ NPr/J/R/P D+ VP/J NPrPl/V3+ VLPt VP/J NSg/P NPr NSg+ NPr/J/R/P # . C/P > practical computers became available , many applications of computing have become # NSg/J+ NPl+ VPt J . NSg/I/J/Dq NPl P Nᴹ/Vg/J+ NSg/VXB VBPp > distinct areas of study in their own rights . # VB/J NPl P NSg/VB+ NPr/J/R/P D$+ NSg/VB/J+ NPl/V3+ . > # > Etymology and scope # HeadingStart N🅪Sg VB/C NSg/VB+ > # > Although first proposed in 1956 , the term " computer science " appears in a 1959 # C NSg/J VP/J NPr/J/R/P # . D NSg/VB/J . NSg+ N🅪Sg/VB+ . V3 NPr/J/R/P D/P # > article in Communications of the ACM , in which Louis Fein argues for the # NSg/VB NPr/J/R/P NPl P D NSg . NPr/J/R/P I/C+ NPr+ ? V3 R/C/P D > creation of a Graduate School in Computer Sciences analogous to the creation of # NSg P D/P NSg/VB/J+ N🅪Sg/VB+ NPr/J/R/P NSg+ NPl/V3+ J P D NSg P > Harvard Business School in 1921 . Louis justifies the name by arguing that , like # NPr+ N🅪Sg/J+ N🅪Sg/VB+ NPr/J/R/P # . NPr+ V3 D+ NSg/VB+ NSg/P Nᴹ/Vg/J NSg/I/C/Ddem+ . NSg/VB/J/C/P > management science , the subject is applied and interdisciplinary in nature , # N🅪Sg+ N🅪Sg/VB+ . D+ NSg/VB/J+ VL3 VP/J VB/C J NPr/J/R/P N🅪Sg/VB+ . > while having the characteristics typical of an academic discipline . His efforts , # NSg/VB/C/P Nᴹ/Vg/J D NPl+ NSg/J P D/P NSg/J NSg/VB+ . ISg/D$+ NPl/V3+ . > and those of others such as numerical analyst George Forsythe , were rewarded : # VB/C I/Ddem P NPl/V3+ NSg/I R/C/P J+ NSg+ NPr+ ? . NSg/VLPt VP/J . > universities went on to create such departments , starting with Purdue in 1962 . # NPl+ NSg/VPt J/P P VB/J NSg/I NPl+ . Nᴹ/Vg/J P NPr NPr/J/R/P # . > Despite its name , a significant amount of computer science does not involve the # NSg/VB/P ISg/D$+ NSg/VB+ . D/P NSg/J NSg/VB P NSg+ N🅪Sg/VB+ NPl/VX3 NSg/R/C VB D > study of computers themselves . Because of this , several alternative names have # NSg/VB P NPl+ IPl+ . C/P P I/Ddem+ . J/Dq+ NSg/J+ NPl/V3+ NSg/VXB > been proposed . Certain departments of major universities prefer the term # NSg/VLPp VP/J . I/J NPl P NPr/VB/J+ NPl+ VB D+ NSg/VB/J+ > computing science , to emphasize precisely that difference . Danish scientist # Nᴹ/Vg/J+ N🅪Sg/VB+ . P VB R NSg/I/C/Ddem+ N🅪Sg/VB+ . NPrᴹ/J+ NSg+ > Peter Naur suggested the term datalogy , to reflect the fact that the scientific # NPr/VB/JC+ ? VP/J D NSg/VB/J+ ? . P VB D NSg+ NSg/I/C/Ddem D J > discipline revolves around data and data treatment , while not necessarily # NSg/VB+ NPl/V3 J/P N🅪Pl VB/C N🅪Pl+ N🅪Sg+ . NSg/VB/C/P NSg/R/C R > involving computers . The first scientific institution to use the term was the # Nᴹ/Vg/J NPl+ . D NSg/J J NSg+ P N🅪Sg/VB D+ NSg/VB/J+ VLPt D > Department of Datalogy at the University of Copenhagen , founded in 1969 , with # NSg P ? NSg/P D NSg P NPr+ . VP/J NPr/J/R/P # . P > Peter Naur being the first professor in datalogy . The term is used mainly in the # NPr/VB/JC+ ? N🅪Sg/VLg/J/C D NSg/J NSg+ NPr/J/R/P ? . D+ NSg/VB/J+ VL3 VP/J R NPr/J/R/P D > Scandinavian countries . An alternative term , also proposed by Naur , is data # NSg/J NPl+ . D/P+ NSg/J+ NSg/VB/J+ . R/C VP/J NSg/P ? . VL3 N🅪Pl+ > science ; this is now used for a multi - disciplinary field of data analysis , # N🅪Sg/VB+ . I/Ddem+ VL3 NSg/J/R/C VP/J R/C/P D/P NSg . NSg/J NSg/VB P N🅪Pl+ N🅪Sg+ . > including statistics and databases . # Nᴹ/Vg/J NPl/V3 VB/C NPl/V3+ . > # > In the early days of computing , a number of terms for the practitioners of the # NPr/J/R/P D NSg/J/R NPl P Nᴹ/Vg/J+ . D/P N🅪Sg/VB/JC P NPl/V3+ R/C/P D NPl P D > field of computing were suggested ( albeit facetiously ) in the Communications of # NSg/VB P Nᴹ/Vg/J+ NSg/VLPt VP/J . C R . NPr/J/R/P D NPl P > the ACM — turingineer , turologist , flow - charts - man , applied meta - mathematician , # D NSg . ? . ? . NSg/VB+ . NPl/V3+ . NPr/VB/J+ . VP/J NSg/J . NSg+ . > and applied epistemologist . Three months later in the same journal , comptologist # VB/C VP/J NSg . NSg+ NPl+ JC NPr/J/R/P D+ I/J+ NSg/VB/J+ . ? > was suggested , followed next year by hypologist . The term computics has also # VLPt VP/J . VP/J NSg/J/P NSg+ NSg/P ? . D+ NSg/VB/J+ ? V3 R/C > been suggested . In Europe , terms derived from contracted translations of the # NSg/VLPp VP/J . NPr/J/R/P NPr+ . NPl/V3+ VP/J P VP/J NPl P D+ > expression " automatic information " ( e.g. " informazione automatica " in Italian ) # N🅪Sg+ . NSg/J+ Nᴹ+ . . NSg . ? ? . NPr/J/R/P N🅪Sg/J . > or " information and mathematics " are often used , e.g. informatique ( French ) , # NPr/C . Nᴹ VB/C Nᴹ+ . VLB R VP/J . NSg ? . NPr🅪Sg/VB/J . . > Informatik ( German ) , informatica ( Italian , Dutch ) , informática ( Spanish , # ? . NPr🅪Sg/J . . ? . N🅪Sg/J . NPrᴹ/VB/J . . ? . NPrᴹ/J . > Portuguese ) , informatika ( Slavic languages and Hungarian ) or pliroforiki # NPr/J . . ? . NSg/J NPl+ VB/C NSg/J . NPr/C ? > ( π λ η ρ ο φ ο ρ ι κ ή , which means informatics ) in Greek . Similar words have also been # . Unlintable Unlintable Unlintable Unlintable Unlintable Unlintable Unlintable Unlintable Unlintable Unlintable Unlintable . I/C+ NPl/V3 Nᴹ . NPr/J/R/P NPr/VB/J . NSg/J+ NPl/V3+ NSg/VXB R/C NSg/VLPp > adopted in the UK ( as in the School of Informatics , University of Edinburgh ) . # VP/J NPr/J/R/P D+ NPr+ . R/C/P NPr/J/R/P D N🅪Sg/VB P Nᴹ . NSg P NPr+ . . > " In the U.S. , however , informatics is linked with applied computing , or # . NPr/J/R/P D+ NPr+ . C . Nᴹ VL3 VP/J P VP/J Nᴹ/Vg/J+ . NPr/C > computing in the context of another domain . " # Nᴹ/Vg/J+ NPr/J/R/P D N🅪Sg/VB P I/D NSg+ . . > # > A folkloric quotation , often attributed to — but almost certainly not first # D/P J NSg . R VP/J P . NSg/C/P R R NSg/R/C NSg/J > formulated by — Edsger Dijkstra , states that " computer science is no more about # VP/J NSg/P . ? NSg . NPrPl/V3+ NSg/I/C/Ddem+ . NSg+ N🅪Sg/VB+ VL3 NSg/Dq/P NPr/I/J/R/Dq J/P > computers than astronomy is about telescopes . " [ note 3 ] The design and deployment # NPl+ C/P Nᴹ+ VL3 J/P NPl/V3 . . . NSg/VB+ # . D N🅪Sg/VB VB/C NSg > of computers and computer systems is generally considered the province of # P NPl VB/C NSg+ NPl+ VL3 R VP/J D NSg P > disciplines other than computer science . For example , the study of computer # NPl/V3+ NSg/VB/J C/P NSg+ N🅪Sg/VB+ . R/C/P NSg/VB+ . D NSg/VB P NSg+ > hardware is usually considered part of computer engineering , while the study of # Nᴹ+ VL3 R VP/J NSg/VB/J P NSg+ Nᴹ/Vg/J+ . NSg/VB/C/P D NSg/VB P > commercial computer systems and their deployment is often called information # NSg/J+ NSg+ NPl+ VB/C D$+ NSg+ VL3 R VP/J Nᴹ+ > technology or information systems . However , there has been exchange of ideas # N🅪Sg NPr/C Nᴹ+ NPl+ . C . R+ V3 NSg/VLPp NSg/VB P NPl+ > between the various computer - related disciplines . Computer science research also # NSg/P D J NSg+ . J+ NPl/V3+ . NSg+ N🅪Sg/VB+ Nᴹ/VB+ R/C > often intersects other disciplines , such as cognitive science , linguistics , # R V3+ NSg/VB/J NPl/V3+ . NSg/I R/C/P NSg/J N🅪Sg/VB . Nᴹ+ . > mathematics , physics , biology , Earth science , statistics , philosophy , and logic . # Nᴹ+ . NPl/V3+ . N🅪Sg+ . NPrᴹ/VB+ N🅪Sg/VB+ . NPl/V3+ . N🅪Sg/VB+ . VB/C Nᴹ/VB/J+ . > # > Computer science is considered by some to have a much closer relationship with # NSg+ N🅪Sg/VB+ VL3 VP/J NSg/P I/J/R/Dq P NSg/VXB D/P NSg/I/J/R/Dq NSg/JC NSg P > mathematics than many scientific disciplines , with some observers saying that # Nᴹ+ C/P NSg/I/J/Dq+ J+ NPl/V3+ . P I/J/R/Dq+ NPl+ N🅪Sg/Vg/J NSg/I/C/Ddem > computing is a mathematical science . Early computer science was strongly # Nᴹ/Vg/J+ VL3 D/P J N🅪Sg/VB . NSg/J/R+ NSg+ N🅪Sg/VB+ VLPt R > influenced by the work of mathematicians such as Kurt Gödel , Alan Turing , John # VP/J NSg/P D N🅪Sg/VB P NPl+ NSg/I R/C/P NPr NPr . NPr+ NPr . NPr+ > von Neumann , Rózsa Péter and Alonzo Church and there continues to be a useful # ? ? . ? ? VB/C NPr NPr🅪Sg/VB+ VB/C R+ NPl/V3 P NSg/VLXB D/P J > interchange of ideas between the two fields in areas such as mathematical logic , # NSg/VB P NPl+ NSg/P D NSg NPrPl/V3+ NPr/J/R/P NPl+ NSg/I R/C/P J Nᴹ/VB/J+ . > category theory , domain theory , and algebra . # NSg+ N🅪Sg+ . NSg+ N🅪Sg+ . VB/C N🅪Sg+ . > # > The relationship between computer science and software engineering is a # D NSg NSg/P NSg+ N🅪Sg/VB VB/C Nᴹ+ Nᴹ/Vg/J+ VL3 D/P > contentious issue , which is further muddied by disputes over what the term # J NSg/VB . I/C+ VL3 VB/JC VP/J NSg/P NPl/V3+ NSg/J/P NSg/I+ D NSg/VB/J+ > " software engineering " means , and how computer science is defined . David Parnas , # . Nᴹ+ Nᴹ/Vg/J+ . NPl/V3 . VB/C NSg/C NSg+ N🅪Sg/VB+ VL3 VP/J . NPr+ ? . > taking a cue from the relationship between other engineering and science # NSg/Vg/J D/P NSg/VB+ P D NSg+ NSg/P NSg/VB/J Nᴹ/Vg/J VB/C N🅪Sg/VB+ > disciplines , has claimed that the principal focus of computer science is # NPl/V3+ . V3 VP/J NSg/I/C/Ddem D NSg/J N🅪Sg/VB P NSg+ N🅪Sg/VB+ VL3 > studying the properties of computation in general , while the principal focus of # Nᴹ/Vg/J D NPl/V3+ P NSg NPr/J/R/P NSg/VB/J . NSg/VB/C/P D NSg/J N🅪Sg/VB P > software engineering is the design of specific computations to achieve practical # Nᴹ+ Nᴹ/Vg/J+ VL3 D N🅪Sg/VB P NSg/J NPl P VB NSg/J > goals , making the two separate but complementary disciplines . # NPl/V3+ . Nᴹ/Vg/J D NSg NSg/VB/J NSg/C/P NSg/J NPl/V3+ . > # > The academic , political , and funding aspects of computer science tend to depend # D NSg/J . NSg/J . VB/C Nᴹ/Vg/J+ NPl/V3 P NSg+ N🅪Sg/VB+ VB P NSg/VB > on whether a department is formed with a mathematical emphasis or with an # J/P I/C D/P+ NSg+ VL3 VP/J P D/P J NSg NPr/C P D/P+ > engineering emphasis . Computer science departments with a mathematics emphasis # Nᴹ/Vg/J+ NSg+ . NSg+ N🅪Sg/VB+ NPl+ P D/P+ Nᴹ+ NSg+ > and with a numerical orientation consider alignment with computational science . # VB/C P D/P+ J+ N🅪Sg+ VB N🅪Sg P J+ N🅪Sg/VB+ . > Both types of departments tend to make efforts to bridge the field educationally # I/C/Dq NPl/V3 P NPl+ VB P NSg/VB NPl/V3+ P N🅪Sg/VB D+ NSg/VB+ R > if not across all research . # NSg/C NSg/R/C NSg/P NSg/I/J/C/Dq Nᴹ/VB+ . > # > Philosophy # HeadingStart N🅪Sg/VB+ > # > Epistemology of computer science # HeadingStart Nᴹ P NSg+ N🅪Sg/VB+ > # > Despite the word science in its name , there is debate over whether or not # NSg/VB/P D+ NSg/VB+ N🅪Sg/VB+ NPr/J/R/P ISg/D$+ NSg/VB+ . R+ VL3 N🅪Sg/VB+ NSg/J/P I/C NPr/C NSg/R/C > computer science is a discipline of science , mathematics , or engineering . Allen # NSg+ N🅪Sg/VB+ VL3 D/P NSg/VB P N🅪Sg/VB+ . Nᴹ+ . NPr/C Nᴹ/Vg/J+ . NPr+ > Newell and Herbert A. Simon argued in 1975 , # ? VB/C NPr+ ? NPr+ VP/J NPr/J/R/P # . > # > Computer science is an empirical discipline . We would have called it an # NSg+ N🅪Sg/VB+ VL3 D/P NSg/J NSg/VB . IPl+ VXB NSg/VXB VP/J NPr/ISg+ D/P+ > experimental science , but like astronomy , economics , and geology , some of its # NSg/J+ N🅪Sg/VB+ . NSg/C/P NSg/VB/J/C/P Nᴹ+ . Nᴹ+ . VB/C NSg . I/J/R/Dq P ISg/D$+ > unique forms of observation and experience do not fit a narrow stereotype of # NSg/J NPl/V3 P N🅪Sg VB/C N🅪Sg/VB+ VXB NSg/R/C NSg/VBP/J D/P NSg/VB/J NSg/VB P > the experimental method . Nonetheless , they are experiments . Each new machine # D NSg/J NSg/VB+ . R . IPl+ VLB NPl/V3+ . Dq+ NSg/J+ NSg/VB+ > that is built is an experiment . Actually constructing the machine poses a # NSg/I/C/Ddem+ VL3 VP/J VL3 D/P+ NSg/VB+ . R Nᴹ/Vg/J D+ NSg/VB+ NPl/V3+ D/P+ > question to nature ; and we listen for the answer by observing the machine in # NSg/VB+ P N🅪Sg/VB . VB/C IPl+ NSg/VB R/C/P D+ NSg/VB+ NSg/P Nᴹ/Vg/J D NSg/VB+ NPr/J/R/P > operation and analyzing it by all analytical and measurement means available . # N🅪Sg+ VB/C Nᴹ/Vg/J NPr/ISg+ NSg/P NSg/I/J/C/Dq J VB/C N🅪Sg+ NPl/V3 J . > # > It has since been argued that computer science can be classified as an empirical # NPr/ISg+ V3 C/P+ NSg/VLPp VP/J NSg/I/C/Ddem NSg+ N🅪Sg/VB+ NPr/VXB NSg/VLXB NSg/VP/J R/C/P D/P+ NSg/J+ > science since it makes use of empirical testing to evaluate the correctness of # N🅪Sg/VB+ C/P NPr/ISg+ NPl/V3 N🅪Sg/VB P NSg/J Nᴹ/Vg/J+ P VB D NSg P > programs , but a problem remains in defining the laws and theorems of computer # NPrPl/V3+ . NSg/C/P D/P+ NSg/J+ NPl/V3 NPr/J/R/P Nᴹ/Vg/J D+ NPl/V3+ VB/C NPl/V3 P NSg+ > science ( if any exist ) and defining the nature of experiments in computer # N🅪Sg/VB+ . NSg/C I/R/Dq VB+ . VB/C Nᴹ/Vg/J D N🅪Sg/VB P NPl/V3+ NPr/J/R/P NSg+ > science . Proponents of classifying computer science as an engineering discipline # N🅪Sg/VB+ . NPl P Nᴹ/Vg/J NSg+ N🅪Sg/VB+ R/C/P D/P Nᴹ/Vg/J+ NSg/VB+ > argue that the reliability of computational systems is investigated in the same # VB NSg/I/C/Ddem D Nᴹ P J NPl+ VL3 VP/J NPr/J/R/P D I/J > way as bridges in civil engineering and airplanes in aerospace engineering . They # NSg/J+ R/C/P NPrPl/V3+ NPr/J/R/P J Nᴹ/Vg/J+ VB/C NPl/V3 NPr/J/R/P NSg/J+ Nᴹ/Vg/J+ . IPl+ > also argue that while empirical sciences observe what presently exists , computer # R/C VB NSg/I/C/Ddem NSg/VB/C/P NSg/J+ NPl/V3+ NSg/VB NSg/I+ R V3 . NSg+ > science observes what is possible to exist and while scientists discover laws # N🅪Sg/VB+ NPl/V3 NSg/I+ VL3 NSg/J P VB VB/C NSg/VB/C/P NPl+ N🅪Sg/VB/J NPl/V3 > from observation , no proper laws have been found in computer science and it is # P N🅪Sg+ . NSg/Dq/P+ NSg/J+ NPl/V3+ NSg/VXB NSg/VLPp NSg/VP NPr/J/R/P NSg+ N🅪Sg/VB+ VB/C NPr/ISg+ VL3 > instead concerned with creating phenomena . # R VP/J P Nᴹ/Vg/J NSg+ . > # > Proponents of classifying computer science as a mathematical discipline argue # NPl P Nᴹ/Vg/J NSg+ N🅪Sg/VB+ R/C/P D/P J NSg/VB+ VB > that computer programs are physical realizations of mathematical entities and # NSg/I/C/Ddem NSg+ NPrPl/V3+ VLB NSg/J NPl/Comm/NoAm P J NPl VB/C > programs that can be deductively reasoned through mathematical formal methods . # NPrPl/V3+ NSg/I/C/Ddem+ NPr/VXB NSg/VLXB R VP/J NSg/J/P J NSg/J NPl/V3+ . > Computer scientists Edsger W. Dijkstra and Tony Hoare regard instructions for # NSg+ NPl+ ? ? NSg VB/C NPr/J ? NSg/VB+ NPl R/C/P > computer programs as mathematical sentences and interpret formal semantics for # NSg+ NPrPl/V3+ R/C/P J NPl/V3+ VB/C VB NSg/J NPl R/C/P > programming languages as mathematical axiomatic systems . # Nᴹ/Vg/J+ NPl+ R/C/P J J NPl+ . > # > Paradigms of computer science # HeadingStart NPl P NSg+ N🅪Sg/VB+ > # > A number of computer scientists have argued for the distinction of three # D/P N🅪Sg/VB/JC P NSg+ NPl+ NSg/VXB VP/J R/C/P D N🅪Sg P NSg > separate paradigms in computer science . Peter Wegner argued that those paradigms # NSg/VB/J NPl NPr/J/R/P NSg+ N🅪Sg/VB+ . NPr/VB/JC+ ? VP/J NSg/I/C/Ddem I/Ddem NPl+ > are science , technology , and mathematics . Peter Denning's working group argued # VLB N🅪Sg/VB . N🅪Sg+ . VB/C Nᴹ+ . NPr/VB/JC+ ? Nᴹ/Vg/J NSg/VB+ VP/J > that they are theory , abstraction ( modeling ) , and design . Amnon H. Eden # NSg/I/C/Ddem IPl+ VLB N🅪Sg . N🅪Sg . Nᴹ/Vg/J+ . . VB/C N🅪Sg/VB+ . ? ? NPr+ > described them as the " rationalist paradigm " ( which treats computer science as a # VP/J NSg/IPl+ R/C/P D . NSg+ NSg+ . . I/C+ NPl/V3+ NSg+ N🅪Sg/VB+ R/C/P D/P > branch of mathematics , which is prevalent in theoretical computer science , and # NPr/VB P Nᴹ+ . I/C+ VL3 J NPr/J/R/P J NSg+ N🅪Sg/VB+ . VB/C > mainly employs deductive reasoning ) , the " technocratic paradigm " ( which might be # R NPl/V3 J Nᴹ/Vg/J . . D . J NSg+ . . I/C+ Nᴹ/VXB/J NSg/VLXB > found in engineering approaches , most prominently in software engineering ) , and # NSg/VP NPr/J/R/P Nᴹ/Vg/J+ NPl/V3+ . NSg/I/J/R/Dq R NPr/J/R/P Nᴹ+ Nᴹ/Vg/J+ . . VB/C > the " scientific paradigm " ( which approaches computer - related artifacts from the # D . J NSg+ . . I/C+ NPl/V3+ NSg+ . J NPl+ P D > empirical perspective of natural sciences , identifiable in some branches of # NSg/J NSg/J P NSg/J NPl/V3+ . J NPr/J/R/P I/J/R/Dq NPl/V3 P > artificial intelligence ) . Computer science focuses on methods involved in # J N🅪Sg+ . . NSg+ N🅪Sg/VB+ NPl/V3 J/P NPl/V3+ VP/J NPr/J/R/P > design , specification , programming , verification , implementation and testing of # N🅪Sg/VB+ . NSg+ . Nᴹ/Vg/J . N🅪Sg+ . N🅪Sg VB/C Nᴹ/Vg/J P > human - made computing systems . # NSg/VB/J . VP Nᴹ/Vg/J+ NPl+ . > # > Fields # HeadingStart NPrPl/V3+ > # > As a discipline , computer science spans a range of topics from theoretical # R/C/P D/P+ NSg/VB+ . NSg+ N🅪Sg/VB+ NPl/V3 D/P N🅪Sg/VB P NPl+ P J > studies of algorithms and the limits of computation to the practical issues of # NPl/V3 P NPl+ VB/C D NPl/V3 P NSg P D NSg/J NPl/V3 P > implementing computing systems in hardware and software . CSAB , formerly called # Nᴹ/Vg/J Nᴹ/Vg/J+ NPl NPr/J/R/P Nᴹ VB/C Nᴹ+ . ? . R VP/J > Computing Sciences Accreditation Board — which is made up of representatives of # Nᴹ/Vg/J+ NPl/V3+ N🅪Sg N🅪Sg/VB+ . I/C+ VL3 VP NSg/VB/J/P P NPl P > the Association for Computing Machinery ( ACM ) , and the IEEE Computer Society # D N🅪Sg+ R/C/P Nᴹ/Vg/J+ Nᴹ+ . NSg . . VB/C D NPr NSg+ N🅪Sg+ > ( IEEE CS ) — identifies four areas that it considers crucial to the discipline of # . NPr NPl/V3 . . V3 NSg NPl+ NSg/I/C/Ddem+ NPr/ISg+ V3 J P D NSg/VB P > computer science : theory of computation , algorithms and data structures , # NSg+ N🅪Sg/VB+ . N🅪Sg P NSg . NPl VB/C N🅪Pl+ NPl/V3+ . > programming methodology and languages , and computer elements and architecture . # Nᴹ/Vg/J+ NSg VB/C NPl+ . VB/C NSg+ NPl/V3 VB/C N🅪Sg+ . > In addition to these four areas , CSAB also identifies fields such as software # NPr/J/R/P NSg+ P I/Ddem+ NSg+ NPl+ . ? R/C V3 NPrPl/V3+ NSg/I R/C/P Nᴹ+ > engineering , artificial intelligence , computer networking and communication , # Nᴹ/Vg/J+ . J N🅪Sg+ . NSg+ Nᴹ/Vg/J VB/C N🅪Sg+ . > database systems , parallel computation , distributed computation , human – computer # NSg/VB+ NPl+ . NSg/VB/J NSg . VP/J NSg . NSg/VB/J . NSg+ > interaction , computer graphics , operating systems , and numerical and symbolic # N🅪Sg+ . NSg+ NSgPl+ . Nᴹ/Vg/J NPl+ . VB/C J VB/C J > computation as being important areas of computer science . # NSg R/C/P N🅪Sg/VLg/J/C J NPl P NSg+ N🅪Sg/VB+ . > # > Theoretical computer science # HeadingStart J+ NSg+ N🅪Sg/VB+ > # > Theoretical computer science is mathematical and abstract in spirit , but it # J+ NSg+ N🅪Sg/VB+ VL3 J VB/C NSg/VB/J NPr/J/R/P NSg/VB+ . NSg/C/P NPr/ISg+ > derives its motivation from practical and everyday computation . It aims to # NPl/V3 ISg/D$+ N🅪Sg+ P NSg/J VB/C NSg/J NSg . NPr/ISg+ NPl/V3 P > understand the nature of computation and , as a consequence of this # VB D N🅪Sg/VB P NSg VB/C . R/C/P D/P NSg/VB P I/Ddem > understanding , provide more efficient methodologies . # N🅪Sg/Vg/J+ . VB NPr/I/J/R/Dq NSg/J NPl . > # > Theory of computation # HeadingStart N🅪Sg P NSg > # > According to Peter Denning , the fundamental question underlying computer science # Nᴹ/Vg/J P NPr/VB/JC+ ? . D+ NSg/J+ NSg/VB+ NSg/Vg/J+ NSg+ N🅪Sg/VB+ > is , " What can be automated ? " Theory of computation is focused on answering # VL3 . . NSg/I+ NPr/VXB NSg/VLXB VP/J . . N🅪Sg P NSg VL3 VP/J J/P Nᴹ/Vg/J > fundamental questions about what can be computed and what amount of resources # NSg/J NPl/V3+ J/P NSg/I+ NPr/VXB NSg/VLXB VP/J VB/C NSg/I+ NSg/VB P NPl/V3+ > are required to perform those computations . In an effort to answer the first # VLB VP/J P VB I/Ddem NPl . NPr/J/R/P D/P N🅪Sg/VB+ P NSg/VB D+ NSg/J+ > question , computability theory examines which computational problems are # NSg/VB+ . Nᴹ N🅪Sg+ NPl/V3 I/C+ J+ NPl+ VLB > solvable on various theoretical models of computation . The second question is # J J/P J J NPl/V3 P NSg . D+ NSg/VB/J+ NSg/VB+ VL3 > addressed by computational complexity theory , which studies the time and space # VP/J NSg/P J NSg N🅪Sg+ . I/C+ NPl/V3 D N🅪Sg/VB/J VB/C N🅪Sg/VB+ > costs associated with different approaches to solving a multitude of # NPl/V3+ VP/J P NSg/J NPl/V3+ P Nᴹ/Vg/J D/P NSg P > computational problems . # J NPl+ . > # > The famous P = NP ? problem , one of the Millennium Prize Problems , is an open # D+ VB/J+ NSg/VB/P+ . NPr . NSg/J+ . NSg/I/J P D+ NSg+ NSg/VB/J+ NPl+ . VL3 D/P NSg/VB/J > problem in the theory of computation . # NSg/J NPr/J/R/P D N🅪Sg P NSg . > # > Information and coding theory # HeadingStart Nᴹ VB/C Nᴹ/Vg/J+ N🅪Sg+ > # > Information theory , closely related to probability and statistics , is related to # Nᴹ+ N🅪Sg+ . R J P NSg VB/C NPl/V3+ . VL3 J P > the quantification of information . This was developed by Claude Shannon to find # D NSg P Nᴹ+ . I/Ddem+ VLPt VP/J NSg/P NPr+ NPr+ P NSg/VB > fundamental limits on signal processing operations such as compressing data and # NSg/J NPl/V3 J/P NSg/VB/J+ Nᴹ/Vg/J+ NPl+ NSg/I R/C/P Nᴹ/Vg/J N🅪Pl+ VB/C > on reliably storing and communicating data . Coding theory is the study of the # J/P R Nᴹ/Vg/J VB/C Nᴹ/Vg/J N🅪Pl+ . Nᴹ/Vg/J+ N🅪Sg+ VL3 D NSg/VB P D > properties of codes ( systems for converting information from one form to # NPl/V3 P NPl/V3+ . NPl+ R/C/P Nᴹ/Vg/J Nᴹ+ P NSg/I/J N🅪Sg/VB+ P > another ) and their fitness for a specific application . Codes are used for data # I/D . VB/C D$+ Nᴹ R/C/P D/P+ NSg/J+ NSg+ . NPl/V3+ VLB VP/J R/C/P N🅪Pl+ > compression , cryptography , error detection and correction , and more recently # NSg+ . Nᴹ . NSg/VB+ N🅪Sg VB/C NSg+ . VB/C NPr/I/J/R/Dq R > also for network coding . Codes are studied for the purpose of designing # R/C R/C/P NSg/VB+ Nᴹ/Vg/J+ . NPl/V3+ VLB VP/J R/C/P D N🅪Sg/VB P Nᴹ/Vg/J > efficient and reliable data transmission methods . # NSg/J VB/C NSg/J+ N🅪Pl+ N🅪Sg+ NPl/V3+ . > # > Data structures and algorithms # HeadingStart N🅪Pl+ NPl/V3 VB/C NPl+ > # > Data structures and algorithms are the studies of commonly used computational # N🅪Pl+ NPl/V3 VB/C NPl+ VLB D NPl/V3 P R VP/J J > methods and their computational efficiency . # NPl/V3 VB/C D$+ J+ N🅪Sg+ . > # > Programming language theory and formal methods # HeadingStart Nᴹ/Vg/J+ N🅪Sg+ N🅪Sg VB/C NSg/J NPl/V3+ > # > Programming language theory is a branch of computer science that deals with the # Nᴹ/Vg/J+ N🅪Sg+ N🅪Sg+ VL3 D/P NPr/VB P NSg+ N🅪Sg/VB+ NSg/I/C/Ddem+ NPl/V3 P D > design , implementation , analysis , characterization , and classification of # N🅪Sg/VB+ . N🅪Sg+ . N🅪Sg+ . N🅪Sg . VB/C N🅪Sg P > programming languages and their individual features . It falls within the # Nᴹ/Vg/J+ NPl VB/C D$+ NSg/J+ NPl/V3+ . NPr/ISg+ NPl/V3+ NSg/J/P D > discipline of computer science , both depending on and affecting mathematics , # NSg/VB P NSg+ N🅪Sg/VB+ . I/C/Dq Nᴹ/Vg/J J/P VB/C Nᴹ/Vg/J Nᴹ+ . > software engineering , and linguistics . It is an active research area , with # Nᴹ+ Nᴹ/Vg/J+ . VB/C Nᴹ+ . NPr/ISg+ VL3 D/P NSg/J Nᴹ/VB N🅪Sg . P > numerous dedicated academic journals . # J+ VP/J+ NSg/J+ NPl/V3+ . > # > Formal methods are a particular kind of mathematically based technique for the # NSg/J+ NPl/V3+ VLB D/P NSg/J NSg/J P R VP/J N🅪Sg+ R/C/P D+ > specification , development and verification of software and hardware systems . # NSg+ . N🅪Sg VB/C N🅪Sg P Nᴹ VB/C Nᴹ+ NPl+ . > The use of formal methods for software and hardware design is motivated by the # D N🅪Sg/VB P NSg/J NPl/V3 R/C/P Nᴹ VB/C Nᴹ+ N🅪Sg/VB+ VL3 VP/J NSg/P D+ > expectation that , as in other engineering disciplines , performing appropriate # N🅪Sg+ NSg/I/C/Ddem+ . R/C/P NPr/J/R/P NSg/VB/J+ Nᴹ/Vg/J+ NPl/V3+ . Nᴹ/Vg/J VB/J+ > mathematical analysis can contribute to the reliability and robustness of a # J+ N🅪Sg+ NPr/VXB NSg/VB P D+ Nᴹ+ VB/C NSg P D/P > design . They form an important theoretical underpinning for software # N🅪Sg/VB+ . IPl+ N🅪Sg/VB D/P J J NSg/Vg R/C/P Nᴹ+ > engineering , especially where safety or security is involved . Formal methods are # Nᴹ/Vg/J+ . R NSg/R/C N🅪Sg/VB NPr/C Nᴹ+ VL3 VP/J . NSg/J+ NPl/V3+ VLB > a useful adjunct to software testing since they help avoid errors and can also # D/P J NSg/VB/J P Nᴹ Nᴹ/Vg/J+ C/P IPl+ NSg/VB VB NPl/V3+ VB/C NPr/VXB R/C > give a framework for testing . For industrial use , tool support is required . # NSg/VB D/P NSg R/C/P Nᴹ/Vg/J+ . R/C/P NSg/J N🅪Sg/VB+ . NSg/VB+ N🅪Sg/VB+ VL3 VP/J . > However , the high cost of using formal methods means that they are usually only # C . D NSg/VB/J/R N🅪Sg/VBP/J P Nᴹ/Vg/J NSg/J+ NPl/V3+ NPl/V3 NSg/I/C/Ddem IPl+ VLB R J/R/C > used in the development of high - integrity and life - critical systems , where # VP/J NPr/J/R/P D N🅪Sg P NSg/VB/J/R . Nᴹ VB/C N🅪Sg/VB+ . NSg/J NPl . NSg/R/C > safety or security is of utmost importance . Formal methods are best described as # N🅪Sg/VB NPr/C Nᴹ+ VL3 P NSg/J+ Nᴹ+ . NSg/J+ NPl/V3+ VLB NPr/VXB/JS VP/J R/C/P > the application of a fairly broad variety of theoretical computer science # D NSg P D/P R NSg/J N🅪Sg P J+ NSg+ N🅪Sg/VB+ > fundamentals , in particular logic calculi , formal languages , automata theory , # NPl+ . NPr/J/R/P NSg/J+ Nᴹ/VB/J+ NSg . NSg/J NPl+ . NPl N🅪Sg+ . > and program semantics , but also type systems and algebraic data types to # VB/C NPr/VB+ NPl+ . NSg/C/P R/C NSg/VB+ NPl VB/C J N🅪Pl+ NPl/V3+ P > problems in software and hardware specification and verification . # NPl NPr/J/R/P Nᴹ VB/C Nᴹ+ NSg VB/C N🅪Sg+ . > # > Applied computer science # HeadingStart VP/J NSg+ N🅪Sg/VB+ > # > Computer graphics and visualization # HeadingStart NSg+ NSgPl VB/C NSg+ > # > Computer graphics is the study of digital visual contents and involves the # NSg+ NSgPl+ VL3 D NSg/VB P NSg/J+ NSg/J+ NPl/V3+ VB/C V3 D > synthesis and manipulation of image data . The study is connected to many other # N🅪Sg VB/C N🅪Sg P N🅪Sg/VB+ N🅪Pl+ . D+ NSg/VB+ VL3 VP/J P NSg/I/J/Dq NSg/VB/J > fields in computer science , including computer vision , image processing , and # NPrPl/V3 NPr/J/R/P NSg+ N🅪Sg/VB+ . Nᴹ/Vg/J NSg+ N🅪Sg/VB . N🅪Sg/VB+ Nᴹ/Vg/J+ . VB/C > computational geometry , and is heavily applied in the fields of special effects # J+ N🅪Sg+ . VB/C VL3 R VP/J NPr/J/R/P D NPrPl/V3 P NSg/VB/J NPl/V3 > and video games . # VB/C N🅪Sg/VB+ NPl/V3+ . > # > Image and sound processing # HeadingStart N🅪Sg/VB VB/C N🅪Sg/VB/J+ Nᴹ/Vg/J+ > # > Information can take the form of images , sound , video or other multimedia . Bits # Nᴹ+ NPr/VXB NSg/VB D N🅪Sg/VB P NPl/V3+ . N🅪Sg/VB/J+ . N🅪Sg/VB+ NPr/C NSg/VB/J Nᴹ/J . NPl/V3 > of information can be streamed via signals . Its processing is the central notion # P Nᴹ+ NPr/VXB NSg/VLXB VP/J NSg/P NPl/V3 . ISg/D$+ Nᴹ/Vg/J+ VL3 D NPr/J NSg > of informatics , the European view on computing , which studies information # P Nᴹ . D NSg/J NSg/VB+ J/P Nᴹ/Vg/J+ . I/C+ NPl/V3+ Nᴹ+ > processing algorithms independently of the type of information carrier – whether # Nᴹ/Vg/J+ NPl+ R P D NSg/VB P Nᴹ+ NPr+ . I/C > it is electrical , mechanical or biological . This field plays important role in # NPr/ISg+ VL3 NSg/J . NSg/J NPr/C NSg/J . I/Ddem+ NSg/VB+ NPl/V3 J NSg NPr/J/R/P > information theory , telecommunications , information engineering and has # Nᴹ+ N🅪Sg+ . Nᴹ+ . Nᴹ+ Nᴹ/Vg/J+ VB/C V3 > applications in medical image computing and speech synthesis , among others . What # NPl NPr/J/R/P NSg/J N🅪Sg/VB+ Nᴹ/Vg/J VB/C N🅪Sg/VB+ N🅪Sg+ . P NPl/V3+ . NSg/I+ > is the lower bound on the complexity of fast Fourier transform algorithms ? is # VL3 D NSg/VB/JC NSg/VP/J J/P D NSg P NSg/VB/J/R NPr NSg/VB NPl+ . VL3 > one of the unsolved problems in theoretical computer science . # NSg/I/J P D VP/J NPl NPr/J/R/P J+ NSg+ N🅪Sg/VB+ . > # > Computational science , finance and engineering # HeadingStart J N🅪Sg/VB+ . N🅪Sg/VB VB/C Nᴹ/Vg/J+ > # > Scientific computing ( or computational science ) is the field of study concerned # J Nᴹ/Vg/J . NPr/C J+ N🅪Sg/VB+ . VL3 D NSg/VB P NSg/VB+ VP/J > with constructing mathematical models and quantitative analysis techniques and # P Nᴹ/Vg/J J NPl/V3 VB/C J+ N🅪Sg+ NPl+ VB/C > using computers to analyze and solve scientific problems . A major usage of # Nᴹ/Vg/J NPl+ P VB VB/C NSg/VB J+ NPl+ . D/P NPr/VB/J N🅪Sg P > scientific computing is simulation of various processes , including computational # J+ Nᴹ/Vg/J+ VL3 N🅪Sg P J+ NPl/V3+ . Nᴹ/Vg/J J+ > fluid dynamics , physical , electrical , and electronic systems and circuits , as # N🅪Sg/J+ NSgPl+ . NSg/J . NSg/J . VB/C J+ NPl+ VB/C NPl/V3 . R/C/P > well as societies and social situations ( notably war games ) along with their # NSg/VB/J/R R/C/P NPl VB/C NSg/J + . R N🅪Sg/VB+ NPl/V3+ . P P D$+ > habitats , among many others . Modern computers enable optimization of such # NPl . P NSg/I/J/Dq NPl/V3+ . NSg/J NPl+ VB N🅪Sg P NSg/I > designs as complete aircraft . Notable in electrical and electronic circuit # NPl/V3+ R/C/P NSg/VB/J+ NSgPl+ . J NPr/J/R/P NSg/J VB/C J+ NSg/VB+ > design are SPICE , as well as software for physical realization of new ( or # N🅪Sg/VB+ VLB N🅪Sg/VB+ . R/C/P NSg/VB/J/R R/C/P Nᴹ R/C/P NSg/J NSg/Comm/NoAm P NSg/J . NPr/C > modified ) designs . The latter includes essential design software for integrated # NSg/VP/J . NPl/V3+ . D NSg/J NPl/V3 NSg/J+ N🅪Sg/VB+ Nᴹ+ R/C/P VP/J > circuits . # NPl/V3 . > # > Human – computer interaction # HeadingStart NSg/VB/J . NSg+ N🅪Sg+ > # > Human – computer interaction ( HCI ) is the field of study and research concerned # NSg/VB/J . NSg+ N🅪Sg+ . ? . VL3 D NSg/VB P NSg/VB VB/C Nᴹ/VB+ VP/J > with the design and use of computer systems , mainly based on the analysis of the # P D N🅪Sg/VB+ VB/C N🅪Sg/VB P NSg+ NPl+ . R VP/J J/P D N🅪Sg P D > interaction between humans and computer interfaces . HCI has several subfields # N🅪Sg NSg/P NPl/V3 VB/C NSg+ NPl/V3+ . ? V3 J/Dq NPl > that focus on the relationship between emotions , social behavior and brain # NSg/I/C/Ddem N🅪Sg/VB+ J/P D NSg NSg/P NPl+ . NSg/J N🅪Sg/Am VB/C NPr🅪Sg/VB+ > activity with computers . # NSg P NPl+ . > # > Software engineering # HeadingStart Nᴹ+ Nᴹ/Vg/J+ > # > Software engineering is the study of designing , implementing , and modifying the # Nᴹ+ Nᴹ/Vg/J+ VL3 D NSg/VB P Nᴹ/Vg/J+ . Nᴹ/Vg/J . VB/C Nᴹ/Vg/J D > software in order to ensure it is of high quality , affordable , maintainable , and # Nᴹ+ NPr/J/R/P N🅪Sg/VB+ P VB NPr/ISg+ VL3 P NSg/VB/J/R+ N🅪Sg/J+ . J . J . VB/C > fast to build . It is a systematic approach to software design , involving the # NSg/VB/J/R P NSg/VB . NPr/ISg+ VL3 D/P J N🅪Sg/VB P Nᴹ N🅪Sg/VB+ . Nᴹ/Vg/J D > application of engineering practices to software . Software engineering deals # NSg P Nᴹ/Vg/J+ NPl/V3+ P Nᴹ . Nᴹ+ Nᴹ/Vg/J+ NPl/V3+ > with the organizing and analyzing of software — it does not just deal with the # P D Nᴹ/Vg/J VB/C Nᴹ/Vg/J P Nᴹ+ . NPr/ISg+ NPl/VX3 NSg/R/C J/R NSg/VB/J P D+ > creation or manufacture of new software , but its internal arrangement and # NSg+ NPr/C NSg/VB P NSg/J+ Nᴹ+ . NSg/C/P ISg/D$+ J NSg VB/C > maintenance . For example software testing , systems engineering , technical debt # Nᴹ+ . R/C/P NSg/VB+ Nᴹ+ Nᴹ/Vg/J+ . NPl+ Nᴹ/Vg/J+ . NSg/J N🅪Sg > and software development processes . # VB/C Nᴹ+ N🅪Sg+ NPl/V3+ . > # > Artificial intelligence # HeadingStart J+ N🅪Sg+ > # > Artificial intelligence ( AI ) aims to or is required to synthesize # J N🅪Sg . NPr🅪Sg+ . NPl/V3 P NPr/C VL3 VP/J P VB > goal - orientated processes such as problem - solving , decision - making , # NSg/VB+ . VP/J NPl/V3 NSg/I R/C/P NSg/J+ . Nᴹ/Vg/J . NSg/VB+ . Nᴹ/Vg/J . > environmental adaptation , learning , and communication found in humans and # NSg/J NSg+ . Nᴹ/Vg/J+ . VB/C N🅪Sg+ NSg/VP NPr/J/R/P NPl/V3 VB/C > animals . From its origins in cybernetics and in the Dartmouth Conference ( 1956 ) , # NPl+ . P ISg/D$+ NPl+ NPr/J/R/P Nᴹ VB/C NPr/J/R/P D NPr+ NSg/VB+ . # . . > artificial intelligence research has been necessarily cross - disciplinary , # J N🅪Sg+ Nᴹ/VB+ V3 NSg/VLPp R NPr/VB/J/P+ . NSg/J . > drawing on areas of expertise such as applied mathematics , symbolic logic , # N🅪Sg/Vg/J J/P NPl P Nᴹ/VB+ NSg/I R/C/P VP/J Nᴹ+ . J Nᴹ/VB/J+ . > semiotics , electrical engineering , philosophy of mind , neurophysiology , and # Nᴹ . NSg/J Nᴹ/Vg/J+ . N🅪Sg/VB P NSg/VB+ . Nᴹ . VB/C > social intelligence . AI is associated in the popular mind with robotic # NSg/J N🅪Sg+ . NPr🅪Sg+ VL3 VP/J NPr/J/R/P D NSg/J NSg/VB+ P J+ > development , but the main field of practical application has been as an embedded # N🅪Sg+ . NSg/C/P D NSg/VB/J NSg/VB P NSg/J+ NSg+ V3 NSg/VLPp R/C/P D/P VP/J > component in areas of software development , which require computational # NSg/J NPr/J/R/P NPl P Nᴹ+ N🅪Sg+ . I/C+ NSg/VB J+ > understanding . The starting point in the late 1940s was Alan Turing's question # N🅪Sg/Vg/J+ . D Nᴹ/Vg/J NSg/VB+ NPr/J/R/P D+ NSg/J+ #d VLPt NPr NPr$ NSg/VB+ > " Can computers think ? " , and the question remains effectively unanswered , # . NPr/VXB NPl+ NSg/VB . . . VB/C D+ NSg/VB+ NPl/V3 R J . > although the Turing test is still used to assess computer output on the scale of # C D NPr NSg/VB+ VL3 NSg/VB/J/R VP/J P VB NSg+ N🅪Sg/VBP+ J/P D N🅪Sg/VB P > human intelligence . But the automation of evaluative and predictive tasks has # NSg/VB/J N🅪Sg+ . NSg/C/P D N🅪Sg P J VB/C J NPl/V3+ V3 > been increasingly successful as a substitute for human monitoring and # NSg/VLPp R J R/C/P D/P NSg/VB+ R/C/P NSg/VB/J Nᴹ/Vg/J VB/C > intervention in domains of computer application involving complex real - world # NSg+ NPr/J/R/P NPl P NSg+ NSg+ Nᴹ/Vg/J NSg/VB/J NSg/J . NSg/VB+ > data . # N🅪Pl+ . > # > Computer systems # HeadingStart NSg+ NPl+ > # > Computer architecture and microarchitecture # HeadingStart NSg+ N🅪Sg+ VB/C NSg > # > Computer architecture , or digital computer organization , is the conceptual # NSg+ N🅪Sg+ . NPr/C NSg/J+ NSg+ N🅪Sg+ . VL3 D J > design and fundamental operational structure of a computer system . It focuses # N🅪Sg/VB+ VB/C NSg/J J N🅪Sg/VB P D/P+ NSg+ NSg+ . NPr/ISg+ NPl/V3 > largely on the way by which the central processing unit performs internally and # R J/P D+ NSg/J+ NSg/P I/C+ D+ NPr/J+ Nᴹ/Vg/J+ NSg+ V3 R VB/C > accesses addresses in memory . Computer engineers study computational logic and # NPl/V3 NPl/V3 NPr/J/R/P N🅪Sg+ . NSg+ NPl/V3+ NSg/VB+ J Nᴹ/VB/J VB/C > design of computer hardware , from individual processor components , # N🅪Sg/VB P NSg+ Nᴹ+ . P NSg/J+ NSg+ NPl+ . > microcontrollers , personal computers to supercomputers and embedded systems . The # NPl . NSg/J NPl+ P NPl VB/C VP/J NPl+ . D > term " architecture " in computer literature can be traced to the work of Lyle R. # NSg/VB/J . N🅪Sg+ . NPr/J/R/P NSg+ Nᴹ+ NPr/VXB NSg/VLXB VP/J P D N🅪Sg/VB P NPr ? > Johnson and Frederick P. Brooks Jr . , members of the Machine Organization # NPr VB/C NPr+ ? NPrPl/V3 NSg/J+ . . NPl/V3 P D+ NSg/VB+ N🅪Sg+ > department in IBM's main research center in 1959 . # NSg+ NPr/J/R/P NPr$ NSg/VB/J+ Nᴹ/VB+ NSg/VB/J/Am+ NPr/J/R/P # . > # > Concurrent , parallel and distributed computing # HeadingStart NSg/J . NSg/VB/J VB/C VP/J Nᴹ/Vg/J+ > # > Concurrency is a property of systems in which several computations are executing # N🅪Sg VL3 D/P NSg/VB P NPl+ NPr/J/R/P I/C+ J/Dq NPl VLB Nᴹ/Vg/J > simultaneously , and potentially interacting with each other . A number of # R . VB/C R Nᴹ/Vg/J P Dq NSg/VB/J . D/P N🅪Sg/VB/JC P > mathematical models have been developed for general concurrent computation # J+ NPl/V3+ NSg/VXB NSg/VLPp VP/J R/C/P NSg/VB/J NSg/J NSg > including Petri nets , process calculi and the parallel random access machine # Nᴹ/Vg/J ? NPl/V3 . NSg/VB+ NSg VB/C D NSg/VB/J NSg/VB/J N🅪Sg/VB+ NSg/VB+ > model . When multiple computers are connected in a network while using # NSg/VB/J+ . NSg/I/C NSg/J/Dq+ NPl+ VLB VP/J NPr/J/R/P D/P+ NSg/VB+ NSg/VB/C/P Nᴹ/Vg/J > concurrency , this is known as a distributed system . Computers within that # N🅪Sg . I/Ddem+ VL3 VPp/J R/C/P D/P VP/J+ NSg+ . NPl NSg/J/P NSg/I/C/Ddem+ > distributed system have their own private memory , and information can be # VP/J NSg+ NSg/VXB D$+ NSg/VB/J+ NSg/VB/J+ N🅪Sg+ . VB/C Nᴹ+ NPr/VXB NSg/VLXB > exchanged to achieve common goals . # VP/J P VB NSg/VB/J+ NPl/V3+ . > # > Computer networks # HeadingStart NSg+ NPl/V3+ > # > This branch of computer science aims to manage networks between computers # I/Ddem NPr/VB P NSg+ N🅪Sg/VB+ NPl/V3 P NSg/VB NPl/V3 NSg/P NPl+ > worldwide . # J . > # > Computer security and cryptography # HeadingStart NSg+ Nᴹ+ VB/C Nᴹ > # > Computer security is a branch of computer technology with the objective of # NSg+ Nᴹ+ VL3 D/P NPr/VB P NSg+ N🅪Sg+ P D NSg/J P > protecting information from unauthorized access , disruption , or modification # Nᴹ/Vg/J Nᴹ+ P J N🅪Sg/VB+ . N🅪Sg+ . NPr/C N🅪Sg+ > while maintaining the accessibility and usability of the system for its intended # NSg/VB/C/P Nᴹ/Vg/J D Nᴹ+ VB/C Nᴹ P D NSg+ R/C/P ISg/D$+ NSg/VP/J > users . # NPl+ . > # > Historical cryptography is the art of writing and deciphering secret messages . # NSg/J Nᴹ VL3 D NPr🅪Sg/VB P Nᴹ/Vg/J VB/C Nᴹ/Vg/J NSg/VB/J NPl/V3+ . > Modern cryptography is the scientific study of problems relating to distributed # NSg/J Nᴹ VL3 D J NSg/VB P NPl+ Nᴹ/Vg/J P VP/J > computations that can be attacked . Technologies studied in modern cryptography # NPl NSg/I/C/Ddem+ NPr/VXB NSg/VLXB VP/J . NPl+ VP/J NPr/J/R/P NSg/J Nᴹ > include symmetric and asymmetric encryption , digital signatures , cryptographic # NSg/VB J VB/C J N🅪Sg . NSg/J NPl+ . J > hash functions , key - agreement protocols , blockchain , zero - knowledge proofs , and # NSg/VB+ NPl/V3+ . NPr/VB/J . N🅪Sg+ NPl/V3 . NSg . NSg/VB/J . Nᴹ+ NPl/V3 . VB/C > garbled circuits . # VP/J NPl/V3 . > # > Databases and data mining # HeadingStart NPl/V3 VB/C N🅪Pl+ Nᴹ/Vg/J+ > # > A database is intended to organize , store , and retrieve large amounts of data # D/P+ NSg/VB+ VL3 NSg/VP/J P VB . NSg/VB+ . VB/C NSg/VB NSg/J NPl/V3 P N🅪Pl+ > easily . Digital databases are managed using database management systems to # R . NSg/J+ NPl/V3+ VLB VP/J Nᴹ/Vg/J NSg/VB+ N🅪Sg+ NPl+ P > store , create , maintain , and search data , through database models and query # NSg/VB . VB/J . VB . VB/C N🅪Sg/VB+ N🅪Pl+ . NSg/J/P NSg/VB+ NPl/V3 VB/C NSg/VB+ > languages . Data mining is a process of discovering patterns in large data sets . # NPl+ . N🅪Pl+ Nᴹ/Vg/J+ VL3 D/P NSg/VB P Nᴹ/Vg/J NPl/V3+ NPr/J/R/P NSg/J N🅪Pl+ NPl/V3 . > # > Discoveries # HeadingStart NPl+ > # > The philosopher of computing Bill Rapaport noted three Great Insights of # D NSg P Nᴹ/Vg/J+ NPr/VB+ ? VP/J NSg NSg/J NPl P > Computer Science : # NSg+ N🅪Sg/VB+ . > # > # > # > Gottfried Wilhelm Leibniz's , George Boole's , Alan Turing's , Claude Shannon's , # ? NPr NPr$ . NPr+ NPr$ . NPr+ NPr$ . NPr+ NPr$ . > and Samuel Morse's insight : there are only two objects that a computer has to # VB/C NPr+ NPr$ N🅪Sg+ . R+ VLB J/R/C NSg NPl/V3+ NSg/I/C/Ddem D/P NSg+ V3 P > deal with in order to represent " anything " . [ note 4 ] # NSg/VB/J P NPr/J/R/P N🅪Sg/VB+ P VB . NSg/I/VB+ . . . NSg/VB+ # . > # > All the information about any computable problem can be represented using # NSg/I/J/C/Dq D Nᴹ+ J/P I/R/Dq J NSg/J+ NPr/VXB NSg/VLXB VP/J Nᴹ/Vg/J > only 0 and 1 ( or any other bistable pair that can flip - flop between two # J/R/C # VB/C # . NPr/C I/R/Dq NSg/VB/J J NSg/VB+ NSg/I/C/Ddem+ NPr/VXB NSg/VB/J . NSg/VB+ NSg/P NSg > easily distinguishable states , such as " on / off " , " magnetized / de - magnetized " , # R J NPrPl/V3+ . NSg/I R/C/P . J/P . NSg/VB/J/P . . . VP/J . NPr+ . VP/J . . > " high - voltage / low - voltage " , etc. ) . # . NSg/VB/J/R . NSg . NSg/VB/J/R . NSg+ . . + . . > # > # > # > Alan Turing's insight : there are only five actions that a computer has to # NPr+ NPr$ N🅪Sg+ . R+ VLB J/R/C NSg NPl/V3+ NSg/I/C/Ddem D/P NSg+ V3 P > perform in order to do " anything " . # VB NPr/J/R/P N🅪Sg/VB+ P VXB . NSg/I/VB+ . . > # > Every algorithm can be expressed in a language for a computer consisting of # Dq NSg NPr/VXB NSg/VLXB VP/J NPr/J/R/P D/P N🅪Sg+ R/C/P D/P NSg+ Nᴹ/Vg/J P > only five basic instructions : # J/R/C NSg NPr/J NPl+ . > # > # > # > move left one location ; # NSg/VB NPr/VP/J NSg/I/J+ N🅪Sg+ . > # > move right one location ; # NSg/VB NPr/VB/J+ NSg/I/J+ N🅪Sg+ . > # > read symbol at current location ; # NSg/VBP NSg/VB+ NSg/P NSg/J+ N🅪Sg+ . > # > print 0 at current location ; # N🅪Sg/VB/J # NSg/P NSg/J+ N🅪Sg+ . > # > print 1 at current location . # N🅪Sg/VB/J # NSg/P NSg/J+ N🅪Sg+ . > # > # > # > Corrado Böhm and Giuseppe Jacopini's insight : there are only three ways of # ? ? VB/C NSg ? N🅪Sg+ . R+ VLB J/R/C NSg NPl P > combining these actions ( into more complex ones ) that are needed in order for # Nᴹ/Vg/J I/Ddem NPl/V3+ . P NPr/I/J/R/Dq NSg/VB/J NPl+ . NSg/I/C/Ddem+ VLB VP/J NPr/J/R/P N🅪Sg/VB+ R/C/P > a computer to do " anything " . # D/P NSg+ P VXB . NSg/I/VB+ . . > # > Only three rules are needed to combine any set of basic instructions into more # J/R/C NSg+ NPl/V3+ VLB VP/J P NSg/VB I/R/Dq NPr/VBP/J P NPr/J+ NPl+ P NPr/I/J/R/Dq > complex ones : # NSg/VB/J+ NPl+ . > # > # > # > sequence : first do this , then do that ; # NSg/VB+ . NSg/J VXB I/Ddem+ . NSg/J/R/C VXB NSg/I/C/Ddem+ . > # > selection : IF such - and - such is the case , THEN do this , ELSE do that ; # N🅪Sg+ . NSg/C NSg/I . VB/C . NSg/I VL3 D NPr🅪Sg/VB . NSg/J/R/C VXB I/Ddem+ . NSg/J/C VXB NSg/I/C/Ddem+ . > # > repetition : WHILE such - and - such is the case , DO this . The three rules of # N🅪Sg/VB+ . NSg/VB/C/P NSg/I . VB/C . NSg/I VL3 D NPr🅪Sg/VB . VXB I/Ddem+ . D NSg NPl/V3 P > Boehm's and Jacopini's insight can be further simplified with the use of # ? VB/C ? N🅪Sg+ NPr/VXB NSg/VLXB VB/JC VP/J P D N🅪Sg/VB+ P > goto ( which means it is more elementary than structured programming ) . # ? . I/C+ NPl/V3 NPr/ISg+ VL3 NPr/I/J/R/Dq NSg/J C/P VP/J Nᴹ/Vg/J+ . . > # > # > # > Programming paradigms # HeadingStart Nᴹ/Vg/J+ NPl+ > # > Programming languages can be used to accomplish different tasks in different # Nᴹ/Vg/J+ NPl+ NPr/VXB NSg/VLXB VP/J P VB NSg/J NPl/V3+ NPr/J/R/P NSg/J+ > ways . Common programming paradigms include : # NPl+ . NSg/VB/J+ Nᴹ/Vg/J+ NPl+ NSg/VB . > # > # > # > Functional programming , a style of building the structure and elements of # NSg/J+ Nᴹ/Vg/J+ . D/P NSg/VB P N🅪Sg/Vg/J+ D N🅪Sg/VB VB/C NPl/V3 P > computer programs that treats computation as the evaluation of mathematical # NSg+ NPrPl/V3+ NSg/I/C/Ddem+ NPl/V3+ NSg R/C/P D N🅪Sg P J > functions and avoids state and mutable data . It is a declarative programming # NPl/V3+ VB/C V3 N🅪Sg/VB+ VB/C J N🅪Pl+ . NPr/ISg+ VL3 D/P NSg/J Nᴹ/Vg/J+ > paradigm , which means programming is done with expressions or declarations # NSg+ . I/C+ NPl/V3 Nᴹ/Vg/J+ VL3 NSg/VPp/J P NPl NPr/C NPl+ > instead of statements . # R P NPl/V3+ . > # > Imperative programming , a programming paradigm that uses statements that # NSg/J+ Nᴹ/Vg/J+ . D/P+ Nᴹ/Vg/J+ NSg+ NSg/I/C/Ddem+ NPl/V3 NPl/V3+ NSg/I/C/Ddem+ > change a program's state . In much the same way that the imperative mood in # N🅪Sg/VB D/P NPr$ N🅪Sg/VB+ . NPr/J/R/P NSg/I/J/R/Dq D I/J NSg/J+ NSg/I/C/Ddem D NSg/J N🅪Sg NPr/J/R/P > natural languages expresses commands , an imperative program consists of # NSg/J+ NPl+ NPl/V3 NPl/V3+ . D/P+ NSg/J+ NPr/VB+ NPl/V3 P > commands for the computer to perform . Imperative programming focuses on # NPl/V3+ R/C/P D+ NSg+ P VB . NSg/J+ Nᴹ/Vg/J+ NPl/V3 J/P > describing how a program operates . # Nᴹ/Vg/J NSg/C D/P+ NPr/VB+ V3 . > # > Object - oriented programming , a programming paradigm based on the concept of # NSg/VB+ . NPr/VP/J Nᴹ/Vg/J+ . D/P+ Nᴹ/Vg/J+ NSg+ VP/J J/P D NSg/VB P > " objects " , which may contain data , in the form of fields , often known as # . NPl/V3+ . . I/C+ NPr/VXB VB N🅪Pl+ . NPr/J/R/P D N🅪Sg/VB P NPrPl/V3+ . R VPp/J R/C/P > attributes ; and code , in the form of procedures , often known as methods . A # NPl/V3+ . VB/C N🅪Sg/VB+ . NPr/J/R/P D N🅪Sg/VB P NPl+ . R VPp/J R/C/P NPl/V3+ . D/P > feature of objects is that an object's procedures can access and often modify # NSg/VB P NPl/V3+ VL3 NSg/I/C/Ddem D/P NSg$ NPl+ NPr/VXB N🅪Sg/VB+ VB/C R VB > the data fields of the object with which they are associated . Thus # D N🅪Pl+ NPrPl/V3 P D NSg/VB+ P I/C+ IPl+ VLB VP/J . NSg > object - oriented computer programs are made out of objects that interact with # NSg/VB+ . NPr/VP/J NSg+ NPrPl/V3+ VLB VP NSg/VB/J/R/P P NPl/V3+ NSg/I/C/Ddem+ NSg/VB P > one another . # NSg/I/J I/D . > # > Service - oriented programming , a programming paradigm that uses " services " as # NSg/VB+ . NPr/VP/J Nᴹ/Vg/J+ . D/P+ Nᴹ/Vg/J+ NSg+ NSg/I/C/Ddem+ NPl/V3 . NPl/V3+ . R/C/P > the unit of computer work , to design and implement integrated business # D NSg P NSg+ N🅪Sg/VB+ . P N🅪Sg/VB VB/C NSg/VB VP/J N🅪Sg/J+ > applications and mission critical software programs . # NPl VB/C NSg/VB+ NSg/J+ Nᴹ+ NPrPl/V3+ . > # > Many languages offer support for multiple paradigms , making the distinction more # NSg/I/J/Dq+ NPl+ NSg/VB/JC N🅪Sg/VB R/C/P NSg/J/Dq+ NPl+ . Nᴹ/Vg/J D+ N🅪Sg+ NPr/I/J/R/Dq > a matter of style than of technical capabilities . # D/P N🅪Sg/VB P NSg/VB+ C/P P NSg/J+ NPl+ . > # > Research # HeadingStart Nᴹ/VB+ > # > Conferences are important events for computer science research . During these # NPl/V3+ VLB J NPl/V3 R/C/P NSg+ N🅪Sg/VB+ Nᴹ/VB+ . VB/P I/Ddem+ > conferences , researchers from the public and private sectors present their # NPl/V3+ . NPl+ P D Nᴹ/VB/J VB/C NSg/VB/J NPl+ NSg/VB/J D$+ > recent work and meet . Unlike in most other academic fields , in computer science , # NSg/J+ N🅪Sg/VB+ VB/C NSg/VB/J . NSg/VB/J/P NPr/J/R/P NSg/I/J/R/Dq NSg/VB/J NSg/J+ NPrPl/V3+ . NPr/J/R/P NSg+ N🅪Sg/VB+ . > the prestige of conference papers is greater than that of journal publications . # D Nᴹ/VB/J P NSg/VB+ NPl/V3+ VL3 JC C/P NSg/I/C/Ddem P NSg/VB/J+ NPl+ . > One proposed explanation for this is the quick development of this relatively # NSg/I/J VP/J N🅪Sg+ R/C/P I/Ddem+ VL3 D NSg/VB/J N🅪Sg P I/Ddem R > new field requires rapid review and distribution of results , a task better # NSg/J NSg/VB+ NPl/V3 NSg/J NSg/VB VB/C NSg P NPl/V3+ . D/P+ NSg/VB+ NSg/VXB/JC > handled by conferences than by journals . # VP/J NSg/P NPl/V3+ C/P NSg/P NPl/V3+ . ================================================ FILE: harper-core/tests/text/tagged/Difficult sentences.md ================================================ > Difficult sentences # HeadingStart VB/J+ NPl/V3+ > # > A collection of difficult sentences to test Harper's ability to correctly tag unusual / uncommon but correct sentences . # D/P N🅪Sg P VB/J NPl/V3+ P NSg/VB NPr$ N🅪Sg+ P R NSg/VB+ NSg/J . NSg/VB/J NSg/C/P NSg/VB/J NPl/V3+ . > # > Note that some word may not be tagged correctly right now . # NSg/VB+ NSg/I/C/Ddem I/J/R/Dq+ NSg/VB+ NPr/VXB NSg/R/C NSg/VLXB VP/J R NPr/VB/J NSg/J/R/C . > # > Most example sentences are taken from https://en.wiktionary.org/. License : CC BY - SA 4.0 . # NSg/I/J/R/Dq NSg/VB+ NPl/V3+ VLB VPp/J P Url NSg/VB+ . NSg/VB/#r+ NSg/P . NPr/VB/J+ # . > # > A # HeadingStart D/P > # > With one attack , he was torn a pieces . # P NSg/I/J+ NSg/VB/J+ . NPr/ISg+ VLPt VB/J D/P NPl/V3 . > I brush my teeth twice a day . # ISg/#r+ NSg/VB D$+ NPl+ R D/P+ NPr🅪Sg+ . > # > At # HeadingStart NSg/P > # > Preposition # HeadingStart NSg/VB > # > Caesar was at Rome ; a climate treaty was signed at Kyoto in 1997 . # NPr VLPt NSg/P NPr+ . D/P N🅪Sg/VB+ NSg/VB+ VLPt VP/J NSg/P NPr+ NPr/J/R/P # . > I was at Jim’s house at the corner of Fourth Street and Vine . # ISg/#r+ VLPt NSg/P NPr$ NPr/VB+ NSg/P D NSg/VB P NPr/VB/J NSg/VB/J VB/C NSg+ . > at the bottom of the page ; sitting at the table ; at church ; at sea # NSg/P D NSg/VB/J P D+ NPr/VB+ . NSg/Vg/J NSg/P D+ NSg/VB+ . NSg/P NPr🅪Sg/VB+ . NSg/P NSg+ > Target at five miles . Prepare torpedoes ! # NSg/VB+ NSg/P NSg+ NPrPl+ . VB NPl/VB . > Look out ! UFO at two o'clock ! # NSg/VB NSg/VB/J/R/P . NSg NSg/P NSg R . > Don't pick at your food ! # VXB NSg/VB NSg/P D$+ NSg+ . > My cat keeps scratching at the furniture . # D$+ NSg/VB/J+ NPl/V3 Nᴹ/Vg/J NSg/P D+ Nᴹ+ . > I was working at the problem all day . # ISg/#r+ VLPt Nᴹ/Vg/J NSg/P D+ NSg/J+ NSg/I/J/C/Dq+ NPr🅪Sg+ . > He shouted at her . # NPr/ISg+ VP/J NSg/P ISg/D$+ . > She pointed at the curious animal . # ISg+ VP/J NSg/P D+ J+ NSg/J+ . > At my request , they agreed to move us to another hotel . # NSg/P D$+ NSg/VB+ . IPl+ VP/J P NSg/VB NPr/IPl+ P I/D+ NSg+ . > He jumped at the sudden noise . # NPr/ISg+ VP/J NSg/P D+ NSg/J+ N🅪Sg/VB+ . > We laughed at the joke . # IPl+ VP/J NSg/P D+ NSg/VB+ . > She was mad at their comments . # ISg+ VLPt NSg/VB/J NSg/P D$+ NPl/V3+ . > men at work ; children at play # NPl NSg/P N🅪Sg/VB+ . NPl+ NSg/P N🅪Sg/VB > The two countries are at war . # D+ NSg+ NPl+ VLB NSg/P N🅪Sg/VB+ . > She is at sixes and sevens with him . # ISg+ VL3 NSg/P NPl VB/C NPl P ISg+ . > # > Noun # HeadingStart NSg/VB+ > # > The at sign . # D NSg/P NSg/VB+ . > # > Verb # HeadingStart NSg/VB+ > # > ( In online chats : ) Don't @ me ! Don't at me ! # . NPr/J/R/P VB/J+ NPl/V3+ . . VXB . NPr/ISg+ . VXB NSg/P NPr/ISg+ . > # > By # HeadingStart NSg/P > # > Preposition # HeadingStart NSg/VB > # > The mailbox is by the bus stop . # D NSg VL3 NSg/P D NSg/VB+ NSg/VB . > The stream runs by our back door . # D+ NSg/VB+ NPl/V3 NSg/P D$+ NSg/VB/J NSg/VB+ . > He ran straight by me . # NPr/ISg+ NSg/VPt NSg/VB/J/R NSg/P NPr/ISg+ . > Be back by ten o'clock ! . # NSg/VLXB NSg/VB/J NSg/P NSg R . . > We'll find someone by the end of March . # K NSg/VB NSg/I+ NSg/P D NSg/VB P NPr/VB+ . > We will send it by the first week of July . # IPl+ NPr/VXB NSg/VB NPr/ISg+ NSg/P D NSg/J NSg/J P NPr+ . > The matter was decided by the chairman . # D+ N🅪Sg/VB+ VLPt NSg/VP/J NSg/P D+ NSg/VB+ . > The boat was swamped by the water . # D+ NSg/VB+ VLPt VP/J NSg/P D+ N🅪Sg/VB+ . > He was protected by his body armour . # NPr/ISg+ VLPt VP/J NSg/P ISg/D$+ NSg/VB+ NPr/VB/Comm+ . > There was a call by the unions for a 30 % pay rise . # R+ VLPt D/P+ NSg/VB+ NSg/P D NPrPl/V3 R/C/P D/P # . NSg/VB/J NSg/VB+ . > I was aghast by what I saw . # ISg/#r+ VLPt J NSg/P NSg/I+ ISg/#r+ NSg/VPt . > There are many well - known plays by William Shakespeare . # R+ VLB NSg/I/J/Dq NSg/VB/J/R . VPp/J NPl/V3 NSg/P NPr+ NPr/VB+ . > I avoided the guards by moving only when they weren't looking . # ISg/#r+ VP/J D+ NPl/V3+ NSg/P Nᴹ/Vg/J J/R/C NSg/I/C IPl+ VPt Nᴹ/Vg/J . > By Pythagoras ' theorem , we can calculate the length of the hypotenuse . # NSg/P NPr . NSg/VB . IPl+ NPr/VXB VB D N🅪Sg/VB P D NSg . > We went by bus . # IPl+ NSg/VPt NSg/P NSg/VB+ . > I discovered it by chance . # ISg/#r+ VP/J NPr/ISg+ NSg/P NPr/VB/J+ . > By ' maybe ' she means ' no ' . # NSg/P . NSg/J/R . ISg+ NPl/V3 . NSg/Dq/P . . > The electricity was cut off , so we had to read by candlelight . # D+ Nᴹ+ VLPt NSg/VBP/J NSg/VB/J/P . NSg/I/J/R/C IPl+ VP P NSg/VBP NSg/P Nᴹ . > By the power vested in me , I now pronounce you man and wife . # NSg/P D+ N🅪Sg/VB/J+ VP/J NPr/J/R/P NPr/ISg+ . ISg/#r+ NSg/J/R/C NSg/VB ISgPl+ NPr/VB/J VB/C NSg/VB/J+ . > By Jove ! I think she's got it ! # NSg/P NPr+ . ISg/#r+ NSg/VB K VP NPr/ISg+ . > By all that is holy , I'll put an end to this . # NSg/P NSg/I/J/C/Dq+ NSg/I/C/Ddem+ VL3 NSg/J/R . K NSg/VBP D/P NSg/VB+ P I/Ddem+ . > I sorted the items by category . # ISg/#r+ VP/J D NPl/V3+ NSg/P NSg+ . > Table 1 shows details of our employees broken down by sex and age . # NSg/VB+ # NPl/V3 NPl/V3 P D$+ NPl+ VPp/J N🅪Sg/VB/J/P NSg/P NSg/VB VB/C N🅪Sg/VB+ . > Our stock is up by ten percent . # D$+ N🅪Sg/VB/J+ VL3 NSg/VB/J/P NSg/P NSg+ NSg+ . > We won by six goals to three . # IPl+ NSgPl/VP NSg/P NSg+ NPl/V3+ P NSg . > His date of birth was wrong by ten years . # ISg/D$+ N🅪Sg/VB P NSg/VB/J+ VLPt NSg/VB/J/R NSg/P NSg+ NPl+ . > We went through the book page by page . # IPl+ NSg/VPt NSg/J/P D+ NSg/VB+ NPr/VB+ NSg/P NPr/VB+ . > We crawled forward by inches . # IPl+ VP/J NSg/VB/J NSg/P NPl/V3+ . > sold by the yard ; cheaper if bought by the gross # NSg/VP NSg/P D+ NSg/VB+ . NSg/JC NSg/C NSg/VP NSg/P D NPr/VB/J > While sitting listening to the radio by the hour , she can drink brandy by the bucketful ! # NSg/VB/C/P NSg/Vg/J Nᴹ/Vg/J P D+ N🅪Sg/VB+ NSg/P D+ NSg+ . ISg+ NPr/VXB NSg/VB+ NPr/VB+ NSg/P D NSg . > He sits listening to the radio by the hour . # NPr/ISg+ NPl/V3 Nᴹ/Vg/J P D+ N🅪Sg/VB+ NSg/P D+ NSg+ . > His health was deteriorating by the day . # ISg/D$+ Nᴹ+ VLPt Nᴹ/Vg/J NSg/P D+ NPr🅪Sg+ . > The pickers are paid by the bushel . # D W? VLB VP/J NSg/P D NSg/VB . > He cheated by his own admission . # NPr/ISg+ VP/J NSg/P ISg/D$+ NSg/VB/J+ NSg+ . > By my reckoning , we should be nearly there . # NSg/P D$+ Nᴹ/Vg/J+ . IPl+ VXB NSg/VLXB R R . > It is easy to invert a 2 - by - 2 matrix . # NPr/ISg+ VL3 NSg/VB/J P NSg/VB/J D/P # . NSg/P . # NSg+ . > The room was about 4 foot by 6 foot . # D+ N🅪Sg/VB/J+ VLPt J/P # NSg/VB NSg/P # NSg/VB+ . > The bricks used to build the wall measured 10 by 20 by 30 cm . # D+ NPl/V3+ VP/J P NSg/VB D+ NPr/VB+ VP/J # NSg/P # NSg/P # #r+ . > She's a lovely little filly , by Big Lad , out of Damsel in Distress . # K D/P NSg/J NPr/I/J/Dq NSg . NSg/P NSg/J NSg . NSg/VB/J/R/P P NSg NPr/J/R/P Nᴹ/VB+ . > Are you eating by Rabbi Fischer ? ( at the house of ) # VLB ISgPl+ Nᴹ/Vg/J NSg/P NSg+ NPr+ . . NSg/P D NPr/VB P . > By Chabad , it's different . ( with , among ) # NSg/P ? . + NSg/J . . P . P . > # > Adverb # HeadingStart NSg/VB+ > # > I watched the parade as it passed by . # ISg/#r+ VP/J D+ NSg/VB+ R/C/P NPr/ISg+ VP/J NSg/P . > There was a shepherd close by . # R+ VLPt D/P+ NPr/VB+ NSg/VB/J NSg/P . > I'll stop by on my way home from work . # K NSg/VB NSg/P J/P D$+ NSg/J+ NSg/VB/J P N🅪Sg/VB+ . > We're right near the lifeguard station . Come by before you leave . # K NPr/VB/J NSg/VB/J/P D NSg+ NSg/VB+ . NSg/VBPp/P NSg/P C/P ISgPl+ NSg/VB . > The women spent much time after harvest putting jams by for winter and spring . # D+ NPl+ VP/J NSg/I/J/R/Dq N🅪Sg/VB/J+ P NSg/VB+ Nᴹ/Vg/J NPl/V3+ NSg/P R/C/P N🅪Sg/VB VB/C N🅪Sg/VB+ . > # > Adjective # HeadingStart NSg/VB/J+ > # > a by path ; a by room ( Out of the way , off to one side . ) # D/P NSg/P NSg/VB+ . D/P NSg/P N🅪Sg/VB/J+ . NSg/VB/J/R/P P D+ NSg/J+ . NSg/VB/J/P P NSg/I/J+ NSg/VB/J+ . . > by catch ; a by issue ( Subsidiary , incidental . ) # NSg/P NSg/VB . D/P NSg/P NSg/VB . NSg/J+ . NSg/J . . > # > For # HeadingStart R/C/P > # > Conjunction # HeadingStart NSg/VB+ > # > I had to stay with my wicked stepmother , for I had nowhere else to go . # ISg/#r+ VP P NSg/VB/J P D$+ VP/J NSg . R/C/P ISg/#r+ VP NSg/J NSg/J/C P NSg/VB/J . > # > Preposition # HeadingStart NSg/VB > # > The astronauts headed for the moon . # D+ NPl+ VP/J R/C/P D+ NPr/VB+ . > Run for the hills ! # NSg/VBPp R/C/P D+ NPl/V3+ . > He was headed for the door when he remembered . # NPr/ISg+ VLPt VP/J R/C/P D+ NSg/VB+ NSg/I/C NPr/ISg+ VP/J . > I have something for you . # ISg/#r+ NSg/VXB NSg/I/J+ R/C/P ISgPl+ . > Everything I do , I do for you . # NSg/I/VB+ ISg/#r+ VXB . ISg/#r+ VXB R/C/P ISgPl+ . > We're having a birthday party for Janet . # K Nᴹ/Vg/J D/P NSg/VB+ NSg/VB/J R/C/P NPr+ . > The mayor gave a speech for the charity gala . # D+ NSg+ VPt D/P N🅪Sg/VB R/C/P D+ NPr+ NSg/J+ . > If having to bag the groceries correctly is more than you can handle , then this isn't the job for you . # NSg/C Nᴹ/Vg/J P NSg/VB D+ NPl/V3+ R VL3 NPr/I/J/R/Dq C/P ISgPl+ NPr/VXB NSg/VB . NSg/J/R/C I/Ddem NSg/VX3 D NPr/VB+ R/C/P ISgPl+ . > This is a new bell for my bicycle . # I/Ddem+ VL3 D/P NSg/J NPr/VB R/C/P D$+ NSg/VB+ . > The cake is for Tom and Helen's anniversary . # D+ N🅪Sg/VB+ VL3 R/C/P NPr/VB VB/C NPr$ NSg+ . > This medicine is for your cough . # I/Ddem+ N🅪Sg/VB+ VL3 R/C/P D$+ NSg/VB+ . > He wouldn't apologize ; and just for that , she refused to help him . # NPr/ISg+ VXB VB . VB/C J/R R/C/P NSg/I/C/Ddem+ . ISg+ VP/J P NSg/VB ISg+ . > He looks better for having lost weight . ( UK usage ) # NPr/ISg+ NPl/V3 NSg/VXB/JC R/C/P Nᴹ/Vg/J VP/J N🅪Sg/VB+ . . NPr+ N🅪Sg+ . > She was the worse for drink . # ISg+ VLPt D NSg/VB/JC R/C/P NSg/VB+ . > All those for the motion , raise your hands . # NSg/I/J/C/Dq I/Ddem R/C/P D+ N🅪Sg/VB+ . NSg/VB D$+ NPl/V3+ . > Who's for ice - cream ? # NPr$+ R/C/P NPr🅪Sg/VB+ . N🅪Sg/VB/J+ . > I'm for going by train # K R/C/P Nᴹ/Vg/J NSg/P NSg/VB+ > Ten voted for , and three against . ( with implied object ) # NSg VP/J R/C/P . VB/C NSg C/P . . P VP/J NSg/VB+ . > Make way for the president ! # NSg/VB NSg/J R/C/P D+ NSg/VB+ . > Clear the shelves for our new Christmas stock ! # NSg/VB/J D NPl/V3 R/C/P D$+ NSg/J+ NPr/VB/J+ N🅪Sg/VB/J+ . > Stand by for your cue . # NSg/VB NSg/P R/C/P D$+ NSg/VB+ . > Prepare for battle . # VB R/C/P NPr/VB/J+ . > They swept the area for enemy operatives . # IPl+ VP/J D N🅪Sg R/C/P NSg/VB+ NPl+ . > Police combed his flat for clues . # Nᴹ/VB+ VP/J ISg/D$+ NSg/VB/J R/C/P NPl/V3+ . > I've lived here for three years . # K VP/J J/R R/C/P NSg NPl+ . > They fought for days over a silly pencil . # IPl+ VB R/C/P NPl+ NSg/J/P D/P+ NSg/J+ NSg/VB+ . > The store is closed for the day . # D+ NSg/VB+ VL3 VP/J R/C/P D+ NPr🅪Sg+ . > I can see for miles . # ISg/#r+ NPr/VXB NSg/VB R/C/P NPrPl+ . > I will stand in for him . # ISg/#r+ NPr/VXB NSg/VB NPr/J/R/P R/C/P ISg+ . > I speak for the Prime Minister . # ISg/#r+ NSg/VB R/C/P D+ NSg/VB/J+ NSg/VB+ . > It is unreasonable for our boss to withhold our wages . # NPr/ISg+ VL3 J R/C/P D$+ NSg/VB/J+ P NSg/VB D$+ NPl/V3+ . > I don't think it's a good idea for you and me to meet ever again . # ISg/#r+ VXB NSg/VB + D/P NPr/VB/J NSg+ R/C/P ISgPl+ VB/C NPr/ISg+ P NSg/VB/J J/R P . > I am aiming for completion by the end of business Thursday . # ISg/#r+ NPr/VLB/J Nᴹ/Vg/J R/C/P NSg+ NSg/P D NSg/VB P N🅪Sg/J+ NSg+ . > He's going for his doctorate . # NPr$ Nᴹ/Vg/J R/C/P ISg/D$+ NSg/VB+ . > Do you want to go for coffee ? # VXB ISgPl+ NSg/VB P NSg/VB/J R/C/P N🅪Sg/VB/J+ . > I'm saving up for a car . # K N🅪Sg/Vg/J/P NSg/VB/J/P R/C/P D/P NSg+ . > Don't wait for an answer . # VXB NSg/VB R/C/P D/P NSg/VB+ . > Fair for its day . # NSg/VB/J R/C/P ISg/D$+ NPr🅪Sg+ . > She's spry for an old lady . # K J R/C/P D/P NSg/J NPr/VB+ . > Don't take me for a fool . # VXB NSg/VB NPr/ISg+ R/C/P D/P NSg/VB/J+ . > For all his expensive education , he didn't seem very bright . # R/C/P NSg/I/J/C/Dq+ ISg/D$+ J+ NSg+ . NPr/ISg+ VXPt VB J/R NPr/VB/J . > And now for a slap - up meal ! # VB/C NSg/J/R/C R/C/P D/P+ NSg/VB/J+ . NSg/VB/J/P NSg/VB+ . > Go scuba diving ? For one thing , I can't even swim . # NSg/VB/J N🅪Sg/VB Nᴹ/Vg/J+ . R/C/P NSg/I/J+ NSg+ . ISg/#r+ VXB NSg/VB/J/R NSg/VB . > For another , we don't have any equipment . # R/C/P I/D . IPl+ VXB NSg/VXB I/R/Dq Nᴹ+ . > He is named for his grandfather . # NPr/ISg+ VL3 VP/J R/C/P ISg/D$+ NSg/VB/J+ . > He totally screwed up that project . Now he's surely for the sack . # NPr/ISg+ R VP/J NSg/VB/J/P NSg/I/C/Ddem+ NSg/VB+ . NSg/J/R/C NPr$ R R/C/P D NSg/VB . > In term of base hits , Jones was three for four on the day # NPr/J/R/P NSg/VB/J P NSg/VB/J+ NPl/V3 . NPr/VB+ VLPt NSg R/C/P NSg J/P D+ NPr🅪Sg+ > At close of play , England were 305 for 3 . # NSg/P NSg/VB/J P N🅪Sg/VB . NPr+ NSg/VLPt # R/C/P # . > He took the swing shift for he could get more overtime . # NPr/ISg+ VPt D+ NSg/VB+ NSg/VB+ R/C/P NPr/ISg+ NSg/VXB NSg/VB NPr/I/J/R/Dq NSg/VB . > to account for one's whereabouts . # P NSg/VB R/C/P NSg$+ NSg+ . > # > From # HeadingStart P > # > Paul is from New Zealand . # NPr+ VL3 P NSg/J+ NPr+ . > I got a letter from my brother . # ISg/#r+ VP D/P NSg/VB+ P D$+ NSg/VB/J+ . > You can't get all your news from the Internet . # ISgPl+ VXB NSg/VB NSg/I/J/C/Dq D$+ Nᴹ/VB+ P D NPrᴹ/VB+ . > He had books piled from floor to ceiling . # NPr/ISg+ VP NPl/V3+ VP/J P NSg/VB+ P NSg/VB . > He departed yesterday from Chicago . # NPr/ISg+ NSg/VP/J NSg P NPr+ . > This figure has been changed from a one to a seven . # I/Ddem+ NSg/VB+ V3 NSg/VLPp VP/J P D/P+ NSg/I/J+ P D/P NSg . > Face away from the wall ! # NSg/VB+ VB/J P D+ NPr/VB+ . > The working day runs from 9 am to 5 pm . # D Nᴹ/Vg/J NPr🅪Sg+ NPl/V3 P # NPr/VLB/J+ P # NSg/VB+ . > Tickets are available from 17th July . # NPl/V3+ VLB J P # NPr+ . > Rate your pain from 1 to 10 . # NSg/VB+ D$+ N🅪Sg/VB+ P # P # . > Start counting from 1 . # NSg/VB Nᴹ/Vg/J P # . > You can study anything from math to literature . # ISgPl+ NPr/VXB NSg/VB NSg/I/VB+ P + P Nᴹ . > It's hard to tell from here . # + N🅪Sg/J/R P NPr/VB P J/R . > Try to see it from his point of view . # NSg/VB/J P NSg/VB NPr/ISg+ P ISg/D$+ NSg/VB P NSg/VB+ . > The bomb went off just 100 yards from where they were standing . # D+ NSg/VB/J+ NSg/VPt+ NSg/VB/J/P J/R # NPl/V3+ P NSg/R/C IPl+ NSg/VLPt Nᴹ/Vg/J . > From the top of the lighthouse you can just see the mainland . # P D NSg/VB/J P D+ NSg+ ISgPl+ NPr/VXB J/R NSg/VB D+ NSg+ . > I’ve been doing this from pickney . # K NSg/VLPp Nᴹ/Vg/J I/Ddem+ P ? . > Your opinions differ from mine . # D$+ NPl+ NPr/VB/JC P NSg/I/VB+ . > He knows right from wrong . # NPr/ISg+ V3 NPr/VB/J P NSg/VB/J/R . > # > In # HeadingStart NPr/J/R/P > # > Preposition # HeadingStart NSg/VB > # > Who lives in a pineapple under the sea ? # NPr/I+ V3+ NPr/J/R/P D/P NSg NSg/J/P D NSg+ . > The dog is in the kennel . # D+ NSg/VB/J+ VL3 NPr/J/R/P D NSg/VB . > There were three pickles in a jar . # R+ NSg/VLPt NSg NPl/V3 NPr/J/R/P D/P+ NSg/VB+ . > I like living in the city . # ISg/#r+ NSg/VB/J/C/P Nᴹ/Vg/J NPr/J/R/P D+ NSg+ . > There are lots of trees in the park . # R+ VLB NPl/V3 P NPl/V3+ NPr/J/R/P D+ NPr/VB+ . > We are in the enemy camp . # IPl+ VLB NPr/J/R/P D+ NSg/VB+ NSg/VB/J+ . > Her plane is in the air . # ISg/D$+ NSg/VB/J+ VL3 NPr/J/R/P D+ N🅪Sg/VB+ . > I glanced over at the pretty girl in the red dress . # ISg/#r+ VP/J NSg/J/P NSg/P D+ NSg/VB/J/R NSg/VB+ NPr/J/R/P D+ N🅪Sg/J+ NSg/VB+ . > There wasn't much of interest in her speech . # R+ VPt NSg/I/J/R/Dq P N🅪Sg/VB+ NPr/J/R/P ISg/D$+ N🅪Sg/VB+ . > He hasn't got an original idea in him . # NPr/ISg+ V3 VP D/P NSg/J NSg+ NPr/J/R/P ISg+ . > You are one in a million . # ISgPl+ VLB NSg/I/J NPr/J/R/P D/P NSg . > She's in an orchestra . # K NPr/J/R/P D/P NSg+ . > My birthday is in the first week of December . # D$+ NSg/VB+ VL3 NPr/J/R/P D NSg/J NSg/J P NPr+ . > Easter falls in the fourth lunar month . # NPr/VB+ NPl/V3+ NPr/J/R/P D+ NPr/VB/J+ NSg/J+ NSg/J+ . > Will you be able to finish this in a week ? # NPr/VXB ISgPl+ NSg/VLXB NSg/VB/J P NSg/VB I/Ddem+ NPr/J/R/P D/P+ NSg/J+ . > They said they would call us in a week . # IPl+ VP/J IPl+ VXB NSg/VB NPr/IPl+ NPr/J/R/P D/P+ NSg/J+ . > Less water gets in your boots this way . # VB/J/R/C/P N🅪Sg/VB+ NPl/V3 NPr/J/R/P D$+ NPl/V3 I/Ddem+ NSg/J+ . > She stood there looking in the window longingly . # ISg+ VP R Nᴹ/Vg/J NPr/J/R/P D+ NSg/VB+ R . > In replacing the faucet washers , he felt he was making his contribution to the environment . # NPr/J/R/P Nᴹ/Vg/J D NSg NPl/V3 . NPr/ISg+ N🅪Sg/VP/J NPr/ISg+ VLPt Nᴹ/Vg/J ISg/D$+ NSg+ P D N🅪Sg+ . > In trying to make amends , she actually made matters worse . # NPr/J/R/P Nᴹ/Vg/J P NSg/VB NPl/V3 . ISg+ R VP NPl/V3+ NSg/VB/JC . > My aim in travelling there was to find my missing friend . # D$+ NSg/VB+ NPr/J/R/P NSg/Vg/J/Comm R+ VLPt P NSg/VB D$+ Nᴹ/Vg/J NPr/VB/J+ . > My fat rolls around in folds . # D$+ N🅪Sg/VB/J NPl/V3+ J/P NPr/J/R/P NPl/V3+ . > The planes flew over in waves . # D+ NPl/V3+ NSg/VPt/J NSg/J/P NPr/J/R/P NPl/V3+ . > Arrange the chairs in a circle . # NSg/VB D NPl/V3+ NPr/J/R/P D/P+ NSg/VB+ . > He stalked away in anger . # NPr/ISg+ VP/J VB/J NPr/J/R/P Nᴹ/VB+ . > John is in a coma . # NPr+ VL3 NPr/J/R/P D/P NSg . > My fruit trees are in bud . # D$+ N🅪Sg/VB+ NPl/V3+ VLB NPr/J/R/P NPr🅪Sg/VB+ . > The company is in profit . # D+ N🅪Sg+ VL3 NPr/J/R/P N🅪Sg/VBP/J+ . > You've got a friend in me . # K VP D/P NPr/VB/J+ NPr/J/R/P NPr/ISg+ . > He's met his match in her . # NPr$ VP ISg/D$+ NSg/VB+ NPr/J/R/P ISg/D$+ . > There has been no change in his condition . # R+ V3 NSg/VLPp NSg/Dq/P N🅪Sg/VB NPr/J/R/P ISg/D$+ N🅪Sg/VB+ . > What grade did he get in English ? # NSg/I+ NSg/VB+ VXPt NPr/ISg+ NSg/VB NPr/J/R/P NPr🅪Sg/VB/J+ . > Please pay me in cash — preferably in tens and twenties . # VB NSg/VB/J NPr/ISg+ NPr/J/R/P NPrᴹ/VB/J+ . R NPr/J/R/P W? VB/C NPl+ . > The deposit can be in any legal tender , even in gold . # D+ NSg/VB+ NPr/VXB NSg/VLXB NPr/J/R/P I/R/Dq NSg/J NSg/VB/J . NSg/VB/J/R NPr/J/R/P Nᴹ/VB/J+ . > Beethoven's " Symphony No . 5 " in C minor is among his most popular . # NPr$ . NSg+ NSg/Dq/P . # . NPr/J/R/P NPr/VB/#r+ NSg/VB/J VL3 P ISg/D$+ NSg/I/J/R/Dq NSg/J . > His speech was in French , but was simultaneously translated into eight languages . # ISg/D$+ N🅪Sg/VB+ VLPt NPr/J/R/P NPr🅪Sg/VB/J . NSg/C/P VLPt R VP/J P NSg/J+ NPl+ . > When you write in cursive , it's illegible . # NSg/I/C ISgPl+ NSg/VB NPr/J/R/P NSg/J . + J . > Military letters should be formal in tone , but not stilted . # NSg/J+ NPl/V3+ VXB NSg/VLXB NSg/J NPr/J/R/P N🅪Sg/I/VB+ . NSg/C/P NSg/R/C VP/J . > # > Verb # HeadingStart NSg/VB+ > # > He that ears my land spares my team and gives me leave to in the crop . # NPr/ISg+ NSg/I/C/Ddem+ NPl/V3+ D$+ NPr🅪Sg/VB+ NPl/V3 D$+ NSg/VB+ VB/C NPl/V3 NPr/ISg+ NSg/VB P NPr/J/R/P D NSg/VB+ . > # > Adverb # HeadingStart NSg/VB+ > # > Suddenly a strange man walked in . # R D/P+ NSg/VB/J+ NPr/VB/J+ VP/J NPr/J/R/P . > Would you like that to take away or eat in ? # VXB ISgPl+ NSg/VB/J/C/P NSg/I/C/Ddem+ P NSg/VB VB/J NPr/C VB NPr/J/R/P . > He ran to the edge of the swimming pool and dived in . # NPr/ISg+ NSg/VPt P D NSg/VB P D+ NSg/Vg NSg/VB+ VB/C VP/J NPr/J/R/P . > They flew in from London last night . # IPl+ NSg/VPt/J NPr/J/R/P P NPr+ NSg/VB/J+ N🅪Sg/VB+ . > For six hours the tide flows in , then for another six hours it flows out . # R/C/P NSg+ NPl+ D+ NSg/VB+ NPl/V3 NPr/J/R/P . NSg/J/R/C R/C/P I/D+ NSg+ NPl+ NPr/ISg+ NPl/V3 NSg/VB/J/R/P . > Bring the water to the boil and drop the vegetables in . # VB D+ N🅪Sg/VB+ P D+ NSg/VB+ VB/C NSg/VB D+ NPl+ NPr/J/R/P . > The show still didn't become interesting 20 minutes in . # D NSg/VB NSg/VB/J/R VXPt VBPp Vg/J # NPl/V3+ NPr/J/R/P . > # > Noun # HeadingStart NSg/VB+ > # > His parents got him an in with the company . # ISg/D$+ NPl/V3+ VP ISg+ D/P NPr/J/R/P P D+ N🅪Sg+ . > # > Adjective # HeadingStart NSg/VB/J+ > # > Is Mr . Smith in ? # VL3 NSg+ . NPr/VB+ NPr/J/R/P . > Little by little I pushed the snake into the basket , until finally all of it was in . # NPr/I/J/Dq NSg/P NPr/I/J/Dq ISg/#r+ VP/J D+ NPr/VB+ P D+ NSg/VB+ . C/P R NSg/I/J/C/Dq P NPr/ISg+ VLPt NPr/J/R/P . > The bullet is about five centimetres in . # D+ NSg/VB+ VL3 J/P NSg NPl/Comm NPr/J/R/P . > If the tennis ball bounces on the line then it's in . # NSg/C D+ NSg/VB+ NPr/VB+ NPl/V3 J/P D+ NSg/VB+ NSg/J/R/C + NPr/J/R/P . > I've discovered why the TV wasn't working – the plug wasn't in ! # K VP/J NSg/VB D NSg+ VPt Nᴹ/Vg/J . D NSg/VB+ VPt NPr/J/R/P . > The replies to the questionnaires are now all in . # D NPl/V3+ P D+ NPl/V3+ VLB NSg/J/R/C NSg/I/J/C/Dq NPr/J/R/P . > Skirts are in this year . # NPl/V3+ VLB NPr/J/R/P I/Ddem+ NSg+ . > the in train ( incoming train ) # D NPr/J/R/P NSg/VB+ . Nᴹ/Vg/J NSg/VB+ . > You can't get round the headland when the tide's in . # ISgPl+ VXB NSg/VB NSg/VB/J/P D NSg NSg/I/C D NSg$ NPr/J/R/P . > in by descent ;   in by purchase ;   in of the seisin of her husband # NPr/J/R/P NSg/P N🅪Sg/VB+ . Unlintable NPr/J/R/P NSg/P NSg/VB+ . Unlintable NPr/J/R/P P D ? P ISg/D$+ NSg/VB+ > He is very in with the Joneses . # NPr/ISg+ VL3 J/R NPr/J/R/P P D NPl/V3 . > I need to keep in with the neighbours in case I ever need a favour from them . # ISg/#r+ N🅪Sg/VXB P NSg/VB NPr/J/R/P P D NPl/V3/Comm+ NPr/J/R/P NPr🅪Sg/VB+ ISg/#r+ J/R N🅪Sg/VXB D/P+ N🅪Sg/VB/Comm+ P NSg/IPl+ . > I think that bird fancies you . You're in there , mate ! # ISg/#r+ NSg/VB NSg/I/C/Ddem+ NPr/VB/J+ NPl/V3 ISgPl+ . + NPr/J/R/P R . NSg/VB . > I'm three drinks in right now . # K NSg+ NPl/V3+ NPr/J/R/P NPr/VB/J NSg/J/R/C . > I was 500 dollars in when the stock crashed . # ISg/#r+ VLPt # NPl NPr/J/R/P NSg/I/C D+ N🅪Sg/VB/J+ VP/J . > # > Unit # HeadingStart NSg+ > # > The glass is 8 inches . # D+ NPr🅪Sg/VB+ VL3 # NPl/V3+ . > The glass is 8 in . # D+ NPr🅪Sg/VB+ VL3 # NPr/J/R/P . > # > Of # HeadingStart P > # > Take the chicken out of the freezer . # NSg/VB D+ N🅪Sg/VB/J+ NSg/VB/J/R/P P D+ NSg+ . > He hasn't been well of late . # NPr/ISg+ V3 NSg/VLPp NSg/VB/J/R P NSg/J . > Finally she was relieved of the burden of caring for her sick husband . # R ISg+ VLPt VP/J P D NSg/VB P Nᴹ/Vg/J R/C/P ISg/D$+ NSg/VB/J+ NSg/VB+ . > He seemed devoid of human feelings . # NPr/ISg+ VP/J VB/J P NSg/VB/J+ NPl/V3+ . > The word is believed to be of Japanese origin . # D+ NSg/VB+ VL3 VP/J P NSg/VLXB P NPr🅪Sg/J+ NSg+ . > Jesus of Nazareth # NPr/VB P NPr+ > The invention was born of necessity . # D+ N🅪Sg+ VLPt NPr/VB/J P NSg+ . > It is said that she died of a broken heart . # NPr/ISg+ VL3 VP/J NSg/I/C/Ddem ISg+ VP/J P D/P+ VPp/J N🅪Sg/VB+ . > What a lot of nonsense ! # NSg/I+ D/P NPr/VB P Nᴹ/VB/J+ . > I'll have a dozen of those apples , please . # K NSg/VXB D/P NSg P I/Ddem NPl . VB . > Welcome to the historic town of Harwich . # NSg/VB/J P D NSg/J NSg P ? . > I'm not driving this wreck of a car . # K NSg/R/C Nᴹ/Vg/J I/Ddem NSg/VB P D/P NSg+ . > I'm always thinking of you . # K R Nᴹ/Vg/J P ISgPl+ . > He told us the story of his journey to India . # NPr/ISg+ VP NPr/IPl+ D NSg/VB P ISg/D$+ NSg/VB+ P NPr+ . > This behaviour is typical of teenagers . # I/Ddem+ N🅪Sg/Comm+ VL3 NSg/J P + . > He is a friend of mine . # NPr/ISg+ VL3 D/P NPr/VB/J P NSg/I/VB+ . > We want a larger slice of the cake . # IPl+ NSg/VB D/P JC NSg/VB/J P D+ N🅪Sg/VB+ . > The owner of the nightclub was arrested . # D NSg P D+ NSg/VB+ VLPt VP/J . > My companion seemed affable and easy of manner . # D$+ NSg/VB+ VP/J J VB/C NSg/VB/J P NSg+ . > It's not that big of a deal . # + NSg/R/C NSg/I/C/Ddem NSg/J P D/P+ NSg/VB/J+ . > I’ve not taken her out of a goodly long while . # K NSg/R/C VPp/J ISg/D$+ NSg/VB/J/R/P P D/P J/R NPr/VB/J NSg/VB/C/P . > After a delay of three hours , the plane finally took off . # P D/P NSg/VBPt/J P NSg+ NPl+ . D+ NSg/VB/J+ R VPt NSg/VB/J/P . > # > On # HeadingStart J/P > # > Adjective # HeadingStart NSg/VB/J+ > # > All the lights are on , so they must be home . # NSg/I/J/C/Dq+ D+ NPl/V3+ VLB J/P . NSg/I/J/R/C IPl+ NSg/VXB NSg/VLXB NSg/VB/J+ . > We had to ration our food because there was a war on . # IPl+ VP P NSg/VB D$+ NSg+ C/P R+ VLPt D/P+ N🅪Sg/VB+ J/P . > Some of the cast went down with flu , but the show's still on . # I/J/R/Dq P D NSg/VB/J NSg/VPt N🅪Sg/VB/J/P P NSg+ . NSg/C/P D NSg$ NSg/VB/J/R J/P . > That TV programme that you wanted to watch is on now . # NSg/I/C/Ddem+ NSg+ NSg/VB/Au/Br+ NSg/I/C/Ddem+ ISgPl+ VP/J P NSg/VB VL3 J/P NSg/J/R/C . > This is her last song . You're on next ! # I/Ddem+ VL3 ISg/D$+ NSg/VB/J+ N🅪Sg+ . + J/P NSg/J/P . > Are we still on for tonight ? # VLB IPl+ NSg/VB/J/R J/P R/C/P NSg+ . > Mike just threw coffee onto Paul's lap . It's on now . # NPr/VB+ J/R VPt N🅪Sg/VB/J+ J/P NPr$ NSg/VB/J+ . + J/P NSg/J/R/C . > England need a hundred runs , with twenty - five overs remaining . Game on ! # NPr+ N🅪Sg/VXB D/P NSg NPl/V3 . P NSg . NSg NPl Nᴹ/Vg/J . NSg/VB/J+ J/P . > Your feet will soon warm up once your socks are on . # D$+ NPl+ NPr/VXB J/R NSg/VB/J NSg/VB/J/P NSg/C D$+ NPl/V3+ VLB J/P . > I was trying to drink out of the bottle while the top was still on ! # ISg/#r+ VLPt Nᴹ/Vg/J P NSg/VB NSg/VB/J/R/P P D+ NSg/VB+ NSg/VB/C/P D+ NSg/VB/J+ VLPt NSg/VB/J/R J/P . > Climbing up that steep ridge isn't on . We'll have to find another route . # Nᴹ/Vg/J NSg/VB/J/P NSg/I/C/Ddem+ NSg/VB/J+ NSg/VB+ NSg/VX3 J/P . K NSg/VXB P NSg/VB I/D NSg/VB+ . > He'd like to play the red next to the black spot , but that shot isn't on . # K NSg/VB/J/C/P P N🅪Sg/VB D N🅪Sg/J NSg/J/P P D N🅪Sg/VB/J NSg/VB/J+ . NSg/C/P NSg/I/C/Ddem NSg/VP/J+ NSg/VX3 J/P . > The captain moved two fielders to the on side . # D+ NSg/VB+ VP/J NSg W? P D J/P NSg/VB/J+ . > Ponsonby - Smythe hit a thumping on drive . # ? . ? NSg/VBP/J D/P Nᴹ/Vg/J J/P N🅪Sg/VB . > If the player fails to hit the ball on , it's a foul . # NSg/C D+ NSg+ NPl/V3 P NSg/VBP/J D+ NPr/VB+ J/P . + D/P NSg/VB/J . > He always has to be on , it's so exhausting . # NPr/ISg+ R V3 P NSg/VLXB J/P . + NSg/I/J/R/C Nᴹ/Vg/J . > # > Adverb # HeadingStart NSg/VB+ > # > turn the television on # NSg/VB D+ N🅪Sg/VB+ J/P > The lid wasn't screwed on properly . # D+ NSg/VB+ VPt VP/J J/P R . > Put on your hat and gloves . # NSg/VBP J/P D$+ NSg/VB VB/C NPl/V3+ . > The policeman moved the tramp on . # D+ NSg+ VP/J D NSg/VB J/P . > Drive on past the railway station . # N🅪Sg/VB J/P NSg/VB/J/P+ D+ NSg+ NSg/VB+ . > From now on things are going to be different . # P NSg/J/R/C J/P NPl+ VLB Nᴹ/Vg/J P NSg/VLXB NSg/J . > and so on . # VB/C NSg/I/J/R/C J/P . > He rambled on and on . # NPr/ISg+ VP/J J/P VB/C J/P . > Ten years on , nothing had changed in the village . # NSg+ NPl+ J/P . NSg/I/J+ VP VP/J NPr/J/R/P D+ NSg+ . > # > Preposition # HeadingStart NSg/VB > # > A vase of flowers stood on the table . # D/P NSg/VB P NPrPl/V3+ VP J/P D NSg/VB+ . > Please lie down on the couch . # VB NPr/VB N🅪Sg/VB/J/P J/P D+ NSg/VB+ . > The parrot was sitting on Jim's shoulder . # D+ NSg/VB+ VLPt NSg/Vg/J J/P NPr$ NSg/VB+ . > He had a scar on the side of his face . # NPr/ISg+ VP D/P NSg/VB+ J/P D NSg/VB/J P ISg/D$+ NSg/VB+ . > There is a dirty smudge on this window . # R+ VL3 D/P VB/J NSg/VB J/P I/Ddem+ NSg/VB+ . > The painting hangs on the wall . # D+ N🅪Sg/Vg/J+ NPl/V3 J/P D+ NPr/VB+ . > The fruit ripened on the trees . # D+ N🅪Sg/VB+ VP/J J/P D NPl/V3+ . > Should there be an accent on the " e " ? # VXB R+ NSg/VLXB D/P NSg/VB+ J/P D . NPr/I+ . . > He wore old shoes on his feet . # NPr/ISg+ VPt NSg/J NPl/V3+ J/P ISg/D$+ NPl+ . > The lighthouse that you can see is on the mainland . # D+ NSg+ NSg/I/C/Ddem+ ISgPl+ NPr/VXB NSg/VB VL3 J/P D+ NSg+ . > The suspect is thought to still be on the campus . # D+ NSg/VB/J+ VL3 N🅪Sg/VP P NSg/VB/J/R NSg/VLXB J/P D+ NSg/VB+ . > We live on the edge of the city . # IPl+ VB/J J/P D NSg/VB P D+ NSg+ . > on the left , on the right , on the side , on the bottom . # J/P D+ NPr/VP/J+ . J/P D NPr/VB/J . J/P D+ NSg/VB/J+ . J/P D+ NSg/VB/J+ . > The fleet is on the American coast . # D+ NSg/VB/J+ VL3 J/P D+ NPr/J+ NSg/VB+ . > on a bus , on a train , on a plane , on a ferry , on a yacht . # J/P D/P+ NSg/VB+ . J/P D/P+ NSg/VB+ . J/P D/P+ NSg/VB/J+ . J/P D/P+ NSg/VB+ . J/P D/P+ NSg/VB+ . > All of the responsibility is on him . # NSg/I/J/C/Dq P D+ N🅪Sg+ VL3 J/P ISg+ . > I put a bet on the winning horse . # ISg/#r+ NSg/VBP D/P+ NSg/VB/P+ J/P D+ NSg/Vg/J NSg/VB+ . > tug on the rope ; push hard on the door . # NSg/VB+ J/P D+ NSg/VB+ . NSg/VB N🅪Sg/J/R J/P D+ NSg/VB+ . > I stubbed my toe on an old tree stump . # ISg/#r+ VP/J D$+ NSg/VB+ J/P D/P NSg/J NSg/VB+ NSg/VB . > I caught my fingernail on the door handle . # ISg/#r+ VP/J D$+ NSg+ J/P D+ NSg/VB+ NSg/VB . > The rope snagged on a branch . # D+ NSg/VB+ VP/J J/P D/P NPr/VB+ . > to play on a violin or piano . # P N🅪Sg/VB J/P D/P NSg/VB NPr/C NSg/VB/J+ . > A table can't stand on two legs . # D/P+ NSg/VB+ VXB NSg/VB J/P NSg NPl/V3+ . > After resting on his elbows , he stood on his toes , then walked on his heels . # P Nᴹ/Vg/J+ J/P ISg/D$+ NPl/V3+ . NPr/ISg+ VP J/P ISg/D$+ NPl/V3+ . NSg/J/R/C VP/J J/P ISg/D$+ NPl/V3+ . > The Tories are on twenty - five percent in this constituency . # D NPrPl VLB J/P NSg . NSg NSg NPr/J/R/P I/Ddem NSg+ . > The blue team are on six points and the red team on five . # D+ N🅪Sg/VB/J+ NSg/VB+ VLB J/P NSg NPl/V3 VB/C D+ N🅪Sg/J+ NSg/VB+ J/P NSg . > I'm on question four . # K J/P NSg/VB+ NSg . > Born on the 4th of July . # NPr/VB/J J/P D # P NPr+ . > On Sunday I'm busy . I'll see you on Monday . # J/P NSg/VB+ K NSg/VB/J . K NSg/VB ISgPl+ J/P NSg+ . > Can I see you on a different day ? # NPr/VXB ISg/#r+ NSg/VB ISgPl+ J/P D/P+ NSg/J+ NPr🅪Sg+ . > Smith scored again on twelve minutes , doubling Mudchester Rovers ' lead . # NPr/VB+ VP/J P J/P NSg+ NPl/V3+ . Nᴹ/Vg/J ? W? . N🅪Sg/VB/J . > I was reading a book on history . # ISg/#r+ VLPt NPrᴹ/Vg/J D/P NSg/VB J/P N🅪Sg+ . > The city hosted the World Summit on the Information Society # D+ NSg+ VP/J D+ NSg/VB+ NSg/VB+ J/P D+ Nᴹ+ N🅪Sg+ > I have no opinion on this subject . # ISg/#r+ NSg/VXB NSg/Dq/P N🅪Sg+ J/P I/Ddem+ NSg/VB/J+ . > I saw it on television . # ISg/#r+ NSg/VPt NPr/ISg+ J/P N🅪Sg/VB+ . > Can't you see I'm on the phone ? # VXB ISgPl+ NSg/VB K J/P D NSg/VB+ . > My favorite shows are on BBC America . # D$+ NSg/VB/J/Am+ NPl/V3+ VLB J/P NPr+ NPr+ . > I'll pay on card . # K NSg/VB/J J/P N🅪Sg/VB+ . > He travelled on false documents . # NPr/ISg+ VP/J/Comm J/P NSg/VB/J+ NPl/V3+ . > They planned an attack on London . # IPl+ VP/J D/P NSg/VB/J J/P NPr+ . > The soldiers mutinied and turned their guns on their officers . # D+ NPl/V3+ VP/J VB/C VP/J D$+ NPl/V3+ J/P D$+ NPl/V3+ . > Her words made a lasting impression on my mind . # ISg/D$+ NPl/V3+ VP D/P+ Nᴹ/Vg/J+ NSg/VB+ J/P D$+ NSg/VB+ . > What will be the effect on morale ? # NSg/I+ NPr/VXB NSg/VLXB D NSg/VB J/P Nᴹ+ . > I haven't got any money on me . # ISg/#r+ VXB VP I/R/Dq N🅪Sg/J+ J/P NPr/ISg+ . > On Jack's entry , William got up to leave . # J/P NPr$ NSg+ . NPr+ VP NSg/VB/J/P P NSg/VB . > On the addition of ammonia , a chemical reaction begins . # J/P D NSg P Nᴹ+ . D/P+ NSg/J+ N🅪Sg/VB/J+ NPl/V3 . > The drinks are on me tonight , boys . # D+ NPl/V3+ VLB J/P NPr/ISg+ NSg+ . NPl/V3+ . > The meal is on the house . # D+ NSg/VB+ VL3 J/P D+ NPr/VB+ . > I had a terrible thirst on me . # ISg/#r+ VP D/P+ J+ Nᴹ/VB+ J/P NPr/ISg+ . > Have pity or compassion on him . # NSg/VXB N🅪Sg/VB NPr/C Nᴹ/VB+ J/P ISg+ . > He's on his lunch break . # NPr$ J/P ISg/D$+ N🅪Sg/VB+ NSg/VB+ . > I'm on nights all this week . # K J/P NPl/V3+ NSg/I/J/C/Dq I/Ddem NSg/J+ . > You've been on these antidepressants far too long . # K NSg/VLPp J/P I/Ddem NPl NSg/VB/J R NPr/VB/J . > I depended on them for assistance . # ISg/#r+ VP/J J/P NSg/IPl+ R/C/P Nᴹ+ . > He will promise on certain conditions . # NPr/ISg+ NPr/VXB NSg/VB J/P I/J+ NPl/V3+ . > A curse on him ! # D/P+ NSg/VB+ J/P ISg+ . > Please don't tell on her and get her in trouble . # VB VXB NPr/VB J/P ISg/D$+ VB/C NSg/VB ISg/D$+ NPr/J/R/P N🅪Sg/VB+ . > # > Verb # HeadingStart NSg/VB+ > # > Can you on the light ? ( switch on ) # NPr/VXB ISgPl+ J/P D+ N🅪Sg/VB/J+ . . NSg/VB/J+ J/P . > # > To # HeadingStart P > # > Particle # HeadingStart NSg+ > # > I want to leave . # ISg/#r+ NSg/VB P NSg/VB . > He asked me what to do . # NPr/ISg+ VP/J NPr/ISg+ NSg/I+ P VXB . > I have places to go and people to see . # ISg/#r+ NSg/VXB NPl/V3+ P NSg/VB/J VB/C NPl/VB+ P NSg/VB . > To err is human . # P VB VL3 NSg/VB/J . > Who am I to criticise ? I've done worse things myself . # NPr/I+ NPr/VLB/J ISg/#r+ P VB/Au/Br . K NSg/VPp/J NSg/VB/JC+ NPl+ ISg+ . > Precisely to get away from you was why I did what I did . # R P NSg/VB VB/J P ISgPl+ VLPt NSg/VB ISg/#r+ VXPt NSg/I+ ISg/#r+ VXPt . > I need some more books to read and friends to go partying with . # ISg/#r+ N🅪Sg/VXB I/J/R/Dq NPr/I/J/R/Dq NPl/V3+ P NSg/VBP VB/C NPrPl/V3+ P NSg/VB/J Nᴹ/Vg/J P . > If he hasn't read it yet , he ought to . # NSg/C NPr/ISg+ V3 NSg/VBP NPr/ISg+ NSg/VB/C . NPr/ISg+ NSg/I/VXB P . > I went to the shops to buy some bread . # ISg/#r+ NSg/VPt P D+ NPl/V3+ P NSg/VB I/J/R/Dq+ N🅪Sg/VB+ . > # > Preposition # HeadingStart NSg/VB > # > She looked to the heavens . # ISg+ VP/J P D+ NPl/V3+ . > We are walking to the shop . # IPl+ VLB Nᴹ/Vg/J P D+ NSg/VB+ . > The water came right to the top of this wall . # D+ N🅪Sg/VB+ NSg/VPt/P NPr/VB/J P D NSg/VB/J P I/Ddem+ NPr/VB+ . > The coconut fell to the ground . # D+ N🅪Sg+ NSg/VPt/J P D+ N🅪Sg/VB/J+ . > I gave the book to him . # ISg/#r+ VPt D+ NSg/VB+ P ISg+ . > His face was beaten to a pulp . # ISg/D$+ NSg/VB+ VLPt VB/J P D/P N🅪Sg/VB/J . > I sang my baby to sleep . # ISg/#r+ NPr/VPt D$+ NSg/VB/J+ P N🅪Sg/VB . > Whisk the mixture to a smooth consistency . # NSg/VB D+ N🅪Sg+ P D/P+ NSg/VB/J+ NSg+ . > He made several bad - taste jokes to groans from the audience . # NPr/ISg+ VP J/Dq NSg/VB/J . NSg/VB/J NPl/V3 P NPl/V3 P D+ NSg+ . > I tried complaining , but it was to no effect . # ISg/#r+ VP/J Nᴹ/Vg/J . NSg/C/P NPr/ISg+ VLPt P NSg/Dq/P+ NSg/VB+ . > It was to a large extent true . # NPr/ISg+ VLPt P D/P NSg/J NSg/J+ NSg/VB/J . > We manufacture these parts to a very high tolerance . # IPl+ NSg/VB I/Ddem+ NPl/V3+ P D/P J/R NSg/VB/J/R+ N🅪Sg/VB+ . > This gauge is accurate to a second . # I/Ddem+ NSg/VB+ VL3 J P D/P NSg/VB/J . > There's a lot of sense to what he says . # K D/P NPr/VB P N🅪Sg/VB+ P NSg/I+ NPr/ISg+ NPl/V3 . > The name has a nice ring to it . # D+ NSg/VB+ V3 D/P+ NPr/J+ NSg/VB+ P NPr/ISg+ . > There are 100 pence to the pound . # R+ VLB # NPl P D+ NPr/VB+ . > It takes 2 to 4 weeks to process typical applications . # NPr/ISg+ NPl/V3 # P # NPrPl+ P NSg/VB NSg/J+ NPl+ . > Three to the power of two is nine . # NSg P D N🅪Sg/VB/J P NSg+ VL3+ NSg . > Three to the second is nine . # NSg P D NSg/VB/J VL3 NSg . > Three squared or three to the second power is nine . # NSg VP/J NPr/C NSg P D+ NSg/VB/J+ N🅪Sg/VB/J+ VL3 NSg . > What's the time ? – It's quarter to four in the afternoon ( or 3 : 45 pm ) . # K D+ N🅪Sg/VB/J+ . . + NSg/VB/J+ P NSg NPr/J/R/P D+ N🅪Sg+ . NPr/C # . # NSg/VB+ . . > # > Adverb # HeadingStart NSg/VB+ > # > Please push the door to . ( close ) # VB NSg/VB D+ NSg/VB+ P . . NSg/VB/J . > # > With # HeadingStart P > # > Preposition # HeadingStart NSg/VB > # > He picked a fight with the class bully . # NPr/ISg+ VP/J D/P NSg/VB P D+ N🅪Sg/VB/J+ NSg/VB/J+ . > He went with his friends . # NPr/ISg+ NSg/VPt P ISg/D$+ NPrPl/V3+ . > She owns a motorcycle with a sidecar . # ISg+ NPl/V3 D/P+ NSg/VB+ P D/P NSg . > Jim was listening to Bach with his eyes closed . # NPr+ VLPt Nᴹ/Vg/J P NPr P ISg/D$+ NPl/V3+ VP/J . > The match result was 10 - 5 , with John scoring three goals . # D+ NSg/VB+ NSg/VB+ VLPt # . # . P NPr+ Nᴹ/Vg/J+ NSg+ NPl/V3+ . > With a heavy sigh , she looked around the empty room . # P D/P NSg/VB/J NSg/VB . ISg+ VP/J J/P D+ NSg/VB/J+ N🅪Sg/VB/J+ . > Four people were injured , with one of them in critical condition . # NSg+ NPl/VB+ NSg/VLPt VP/J . P NSg/I/J P NSg/IPl+ NPr/J/R/P NSg/J+ N🅪Sg/VB+ . > With their reputation on the line , they decided to fire their PR team . # P D$+ NSg+ J/P D+ NSg/VB+ . IPl+ NSg/VP/J P N🅪Sg/VB/J D$+ NSg+ NSg/VB+ . > We are with you all the way . # IPl+ VLB P ISgPl+ NSg/I/J/C/Dq D+ NSg/J+ . > There are a number of problems with your plan . # R+ VLB D/P N🅪Sg/VB/JC P NPl+ P D$+ NSg/VB . > What on Earth is wrong with my keyboard ? # NSg/I+ J/P NPrᴹ/VB+ VL3 NSg/VB/J/R P D$+ NSg/VB+ . > He was pleased with the outcome . # NPr/ISg+ VLPt VP/J P D+ NSg+ . > I’m upset with my father . # K NSg/VB/J P D$+ NPr/VB+ . > slain with robbers . # NSg/VPp P NPl . > cut with a knife # NSg/VBP/J P D/P+ NSg/VB+ > I water my plants with this watering can . This is the watering can I water my plants with . # ISg/#r+ N🅪Sg/VB D$+ NPl/V3+ P I/Ddem+ Nᴹ/Vg/J+ NPr/VXB . I/Ddem+ VL3 D Nᴹ/Vg/J NPr/VXB ISg/#r+ N🅪Sg/VB D$+ NPl/V3+ P . > Find what you want instantly with our search engine . # NSg/VB NSg/I+ ISgPl+ NSg/VB R P D$+ N🅪Sg/VB+ NSg/VB+ . > They dismissed the meeting with a wave of their hand . # IPl+ VP/J D+ N🅪Sg/Vg/J+ P D/P NSg/VB P D$+ NSg/VB+ . > Speak with a confident voice . # NSg/VB P D/P+ NSg/J+ NSg/VB+ . > With what / whose money ? I have nothing left to buy groceries ( with ) . # P NSg/I+ . I+ N🅪Sg/J+ . ISg/#r+ NSg/VXB NSg/I/J+ NPr/VP/J P NSg/VB NPl/V3+ . P . . > It was small and bumpy , with a tinge of orange . # NPr/ISg+ VLPt NPr/VB/J VB/C J . P D/P NSg/VB P NPr🅪Sg/VB/J . > There are lots of people with no homes after the wildfire . # R+ VLB NPl/V3 P NPl/VB+ P NSg/Dq/P+ NPl/V3+ P D NSg . > Speak with confidence . # NSg/VB P Nᴹ+ . > He spoke with sadness in his voice . # NPr/ISg+ NSg/VPt P Nᴹ+ NPr/J/R/P ISg/D$+ NSg/VB+ . > The sailors were infected with malaria . # D+ NPl+ NSg/VLPt NSg/VP/J P Nᴹ+ . > overcome with happiness # VB P Nᴹ+ > green with envy ; flushed with success # NPr🅪Sg/VB/J P Nᴹ/VB+ . VP/J P N🅪Sg+ > She was with Acme for twenty years before retiring last fall . # ISg+ VLPt P NSg R/C/P NSg NPl+ C/P Nᴹ/Vg/J NSg/VB/J N🅪Sg/VB+ . > With your kind of body size , you shouldn’t be eating pizza at all . # P D$+ NSg/J P NSg/VB+ N🅪Sg/VB+ . ISgPl+ VXB NSg/VLXB Nᴹ/Vg/J N🅪Sg+ NSg/P NSg/I/J/C/Dq . > That was a lot to explain ; are you still with me ? # NSg/I/C/Ddem+ VLPt D/P NPr/VB P VB . VLB ISgPl+ NSg/VB/J/R P NPr/ISg+ . > # > Adverb # HeadingStart NSg/VB+ > # > Do you want to come with ? # VXB ISgPl+ NSg/VB P NSg/VBPp/P P . ================================================ FILE: harper-core/tests/text/tagged/Part-of-speech tagging.md ================================================ > # Unlintable Unlintable > Part - of - speech tagging # Unlintable HeadingStart NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg > # > In corpus linguistics , part - of - speech tagging ( POS tagging or PoS tagging or # NPr/J/R/P NSg+ Nᴹ+ . NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg . NSg+ NSg/Vg NPr/C NSg+ NSg/Vg NPr/C > POST ) , also called grammatical tagging is the process of marking up a word in a # NPr🅪Sg/VB/P+ . . R/C VP/J J NSg/Vg VL3 D NSg/VB P Nᴹ/Vg/J NSg/VB/J/P D/P NSg/VB+ NPr/J/R/P D/P > text ( corpus ) as corresponding to a particular part of speech , based on both its # N🅪Sg/VB+ . NSg+ . R/C/P Nᴹ/Vg/J P D/P NSg/J NSg/VB/J P N🅪Sg/VB+ . VP/J J/P I/C/Dq ISg/D$+ > definition and its context . A simplified form of this is commonly taught to # NSg VB/C ISg/D$+ N🅪Sg/VB+ . D/P VP/J N🅪Sg/VB P I/Ddem+ VL3 R VP P > school - age children , in the identification of words as nouns , verbs , adjectives , # N🅪Sg/VB . N🅪Sg/VB+ NPl+ . NPr/J/R/P D Nᴹ P NPl/V3+ R/C/P NPl/V3 . NPl/V3+ . NPl/V3 . > adverbs , etc. # NPl/V3 . + > # > Once performed by hand , POS tagging is now done in the context of computational # NSg/C VP/J NSg/P NSg/VB+ . NSg+ NSg/Vg VL3 NSg/J/R/C NSg/VPp/J NPr/J/R/P D N🅪Sg/VB P J > linguistics , using algorithms which associate discrete terms , as well as hidden # Nᴹ+ . Nᴹ/Vg/J NPl+ I/C+ NSg/VB/J+ J NPl/V3+ . R/C/P NSg/VB/J/R R/C/P VB/J > parts of speech , by a set of descriptive tags . POS - tagging algorithms fall into # NPl/V3 P N🅪Sg/VB+ . NSg/P D/P NPr/VBP/J P NSg/J NPl/V3+ . NSg+ . NSg/Vg NPl+ N🅪Sg/VB+ P > two distinctive groups : rule - based and stochastic . E. Brill's tagger , one of the # NSg NSg/J NPl/V3+ . NSg/VB+ . VP/J VB/C J . ? ? NSg . NSg/I/J P D > first and most widely used English POS - taggers , employs rule - based algorithms . # NSg/J VB/C NSg/I/J/R/Dq R VP/J NPr🅪Sg/VB/J+ NSg+ . NPl . NPl/V3 NSg/VB+ . VP/J NPl+ . > # > Principle # HeadingStart N🅪Sg/VB+ > # > Part - of - speech tagging is harder than just having a list of words and their # NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg VL3 JC C/P J/R Nᴹ/Vg/J D/P NSg/VB P NPl/V3+ VB/C D$+ > parts of speech , because some words can represent more than one part of speech # NPl/V3 P N🅪Sg/VB+ . C/P I/J/R/Dq NPl/V3+ NPr/VXB VB NPr/I/J/R/Dq C/P NSg/I/J NSg/VB/J P N🅪Sg/VB+ > at different times , and because some parts of speech are complex . This is not # NSg/P NSg/J NPl/V3+ . VB/C C/P I/J/R/Dq NPl/V3 P N🅪Sg/VB+ VLB NSg/VB/J . I/Ddem+ VL3 NSg/R/C > rare — in natural languages ( as opposed to many artificial languages ) , a large # NSg/VB/J . NPr/J/R/P NSg/J+ NPl+ . R/C/P VP/J P NSg/I/J/Dq+ J+ NPl+ . . D/P NSg/J > percentage of word - forms are ambiguous . For example , even " dogs " , which is # N🅪Sg P NSg/VB+ . NPl/V3+ VLB J . R/C/P NSg/VB+ . NSg/VB/J/R . NPl/V3+ . . I/C+ VL3 > usually thought of as just a plural noun , can also be a verb : # R N🅪Sg/VP P R/C/P J/R D/P+ NSg/J+ NSg/VB+ . NPr/VXB R/C NSg/VLXB D/P+ NSg/VB+ . > # > The sailor dogs the hatch . # D+ NSg+ NPl/V3+ D+ NSg/VB+ . > # > Correct grammatical tagging will reflect that " dogs " is here used as a verb , not # NSg/VB/J J NSg/Vg NPr/VXB VB NSg/I/C/Ddem+ . NPl/V3+ . VL3 J/R VP/J R/C/P D/P NSg/VB+ . NSg/R/C > as the more common plural noun . Grammatical context is one way to determine # R/C/P D NPr/I/J/R/Dq NSg/VB/J NSg/J NSg/VB+ . J+ N🅪Sg/VB+ VL3 NSg/I/J NSg/J P VB > this ; semantic analysis can also be used to infer that " sailor " and " hatch " # I/Ddem+ . NSg/J+ N🅪Sg+ NPr/VXB R/C NSg/VLXB VP/J P VB NSg/I/C/Ddem+ . NSg+ . VB/C . NSg/VB . > implicate " dogs " as 1 ) in the nautical context and 2 ) an action applied to the # NSg/VB . NPl/V3+ . R/C/P # . NPr/J/R/P D J N🅪Sg/VB+ VB/C # . D/P N🅪Sg/VB/J+ VP/J P D > object " hatch " ( in this context , " dogs " is a nautical term meaning " fastens ( a # NSg/VB+ . NSg/VB . . NPr/J/R/P I/Ddem N🅪Sg/VB+ . . NPl/V3+ . VL3 D/P J NSg/VB/J+ N🅪Sg/Vg/J+ . V3 . D/P > watertight door ) securely " ) . # J NSg/VB+ . R . . . > # > Tag sets # HeadingStart NSg/VB+ NPl/V3 > # > Schools commonly teach that there are 9 parts of speech in English : noun , verb , # NPl/V3+ R NSg/VB NSg/I/C/Ddem R+ VLB # NPl/V3 P N🅪Sg/VB NPr/J/R/P NPr🅪Sg/VB/J . NSg/VB+ . NSg/VB+ . > article , adjective , preposition , pronoun , adverb , conjunction , and interjection . # NSg/VB+ . NSg/VB/J+ . NSg/VB . NSg/VB+ . NSg/VB+ . NSg/VB+ . VB/C N🅪Sg+ . > However , there are clearly many more categories and sub - categories . For nouns , # C . R+ VLB R NSg/I/J/Dq+ NPr/I/J/R/Dq+ NPl+ VB/C NSg/VB/P . NPl+ . R/C/P NPl/V3 . > the plural , possessive , and singular forms can be distinguished . In many # D NSg/J . NSg/J . VB/C NSg/J NPl/V3+ NPr/VXB NSg/VLXB VP/J . NPr/J/R/P NSg/I/J/Dq+ > languages words are also marked for their " case " ( role as subject , object , # NPl+ NPl/V3+ VLB R/C VP/J R/C/P D$+ . NPr🅪Sg/VB+ . . NSg R/C/P NSg/VB/J+ . NSg/VB+ . > etc. ) , grammatical gender , and so on ; while verbs are marked for tense , aspect , # + . . J+ N🅪Sg/VB/J+ . VB/C NSg/I/J/R/C J/P . NSg/VB/C/P NPl/V3+ VLB VP/J R/C/P NSg/VB/J . N🅪Sg/VB+ . > and other things . In some tagging systems , different inflections of the same # VB/C NSg/VB/J+ NPl+ . NPr/J/R/P I/J/R/Dq NSg/Vg NPl+ . NSg/J NPl P D I/J > root word will get different parts of speech , resulting in a large number of # NPr/VB+ NSg/VB+ NPr/VXB NSg/VB NSg/J NPl/V3 P N🅪Sg/VB+ . Nᴹ/Vg/J NPr/J/R/P D/P NSg/J N🅪Sg/VB/JC P > tags . For example , NN for singular common nouns , NNS for plural common nouns , NP # NPl/V3+ . R/C/P NSg/VB+ . ? R/C/P NSg/J NSg/VB/J NPl/V3 . ? R/C/P NSg/J NSg/VB/J NPl/V3 . NPr > for singular proper nouns ( see the POS tags used in the Brown Corpus ) . Other # R/C/P NSg/J NSg/J NPl/V3 . NSg/VB D NSg+ NPl/V3+ VP/J NPr/J/R/P D NPr🅪Sg/VB/J NSg+ . . NSg/VB/J > tagging systems use a smaller number of tags and ignore fine differences or # NSg/Vg NPl+ N🅪Sg/VB D/P NSg/JC N🅪Sg/VB/JC P NPl/V3+ VB/C VB NSg/VB/J NPl/VB NPr/C > model them as features somewhat independent from part - of - speech . # NSg/VB/J+ NSg/IPl+ R/C/P NPl/V3+ NSg/I/R NSg/J P NSg/VB/J+ . P . N🅪Sg/VB+ . > # > In part - of - speech tagging by computer , it is typical to distinguish from 50 to # NPr/J/R/P NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg NSg/P NSg+ . NPr/ISg+ VL3 NSg/J P VB P # P > 150 separate parts of speech for English . Work on stochastic methods for tagging # # NSg/VB/J NPl/V3 P N🅪Sg/VB R/C/P NPr🅪Sg/VB/J+ . N🅪Sg/VB J/P J NPl/V3+ R/C/P NSg/Vg > Koine Greek ( DeRose 1990 ) has used over 1 , 000 parts of speech and found that # ? NPr/VB/J . ? # . V3 VP/J NSg/J/P # . # NPl/V3 P N🅪Sg/VB+ VB/C NSg/VP NSg/I/C/Ddem > about as many words were ambiguous in that language as in English . A # J/P R/C/P NSg/I/J/Dq NPl/V3+ NSg/VLPt J NPr/J/R/P NSg/I/C/Ddem N🅪Sg+ R/C/P NPr/J/R/P NPr🅪Sg/VB/J+ . D/P > morphosyntactic descriptor in the case of morphologically rich languages is # ? NSg NPr/J/R/P D NPr🅪Sg/VB P ? NPr/VB/J NPl+ VL3 > commonly expressed using very short mnemonics , such as Ncmsan for Category = Noun , # R VP/J Nᴹ/Vg/J J/R NPr/VB/J/P NPl . NSg/I R/C/P ? R/C/P NSg+ . NSg/VB+ . > Type = common , Gender = masculine , Number = singular , Case = accusative , Animate # NSg/VB+ . NSg/VB/J . N🅪Sg/VB/J+ . NSg/J . N🅪Sg/VB/JC+ . NSg/J . NPr🅪Sg/VB+ . NSg/J . VB/J > = no . # . NSg/Dq/P . > # > The most popular " tag set " for POS tagging for American English is probably the # D NSg/I/J/R/Dq NSg/J . NSg/VB NPr/VBP/J . R/C/P NSg+ NSg/Vg R/C/P NPr/J NPr🅪Sg/VB/J+ VL3 R D > Penn tag set , developed in the Penn Treebank project . It is largely similar to # NPr+ NSg/VB+ NPr/VBP/J . VP/J NPr/J/R/P D NPr+ ? NSg/VB+ . NPr/ISg+ VL3 R NSg/J P > the earlier Brown Corpus and LOB Corpus tag sets , though much smaller . In # D JC NPr🅪Sg/VB/J NSg VB/C NSg/VB NSg+ NSg/VB+ NPl/V3 . C NSg/I/J/R/Dq NSg/JC . NPr/J/R/P > Europe , tag sets from the Eagles Guidelines see wide use and include versions # NPr+ . NSg/VB+ NPl/V3 P D NPl/V3 NPl+ NSg/VB NSg/J N🅪Sg/VB+ VB/C NSg/VB NPl/V3+ > for multiple languages . # R/C/P NSg/J/Dq NPl+ . > # > POS tagging work has been done in a variety of languages , and the set of POS # NSg+ NSg/Vg N🅪Sg/VB+ V3 NSg/VLPp NSg/VPp/J NPr/J/R/P D/P N🅪Sg P NPl+ . VB/C D NPr/VBP/J P NSg+ > tags used varies greatly with language . Tags usually are designed to include # NPl/V3+ VP/J NPl/V3 R P N🅪Sg+ . NPl/V3+ R VLB VP/J P NSg/VB > overt morphological distinctions , although this leads to inconsistencies such as # NSg/J+ J+ NPl+ . C I/Ddem NPl/V3 P NPl NSg/I R/C/P > case - marking for pronouns but not nouns in English , and much larger # NPr🅪Sg/VB+ . Nᴹ/Vg/J R/C/P NPl/V3 NSg/C/P NSg/R/C NPl/V3 NPr/J/R/P NPr🅪Sg/VB/J+ . VB/C NSg/I/J/R/Dq JC > cross - language differences . The tag sets for heavily inflected languages such as # NPr/VB/J/P+ . N🅪Sg+ NPl/VB+ . D+ NSg/VB+ NPl/V3 R/C/P R VP/J NPl+ NSg/I R/C/P > Greek and Latin can be very large ; tagging words in agglutinative languages such # NPr/VB/J VB/C NPr/J NPr/VXB NSg/VLXB J/R NSg/J . NSg/Vg NPl/V3+ NPr/J/R/P J NPl+ NSg/I > as Inuit languages may be virtually impossible . At the other extreme , Petrov et # R/C/P NPr/J NPl+ NPr/VXB NSg/VLXB R NSg/J . NSg/P D NSg/VB/J NSg/J . ? ? > al. have proposed a " universal " tag set , with 12 categories ( for example , no # ? NSg/VXB VP/J D/P . NSg/J . NSg/VB+ NPr/VBP/J . P # NPl+ . R/C/P NSg/VB+ . NSg/Dq/P > subtypes of nouns , verbs , punctuation , and so on ) . Whether a very small set of # NPl P NPl/V3 . NPl/V3+ . Nᴹ+ . VB/C NSg/I/J/R/C J/P . . I/C D/P J/R NPr/VB/J NPr/VBP/J P > very broad tags or a much larger set of more precise ones is preferable , depends # J/R NSg/J NPl/V3+ NPr/C D/P NSg/I/J/R/Dq JC NPr/VBP/J P NPr/I/J/R/Dq VB/J+ NPl+ VL3 J . NPl/V3 > on the purpose at hand . Automatic tagging is easier on smaller tag - sets . # J/P D N🅪Sg/VB+ NSg/P NSg/VB+ . NSg/J NSg/Vg VL3 NSg/JC J/P NSg/JC NSg/VB+ . NPl/V3 . > # > History # HeadingStart N🅪Sg+ > # > The Brown Corpus # HeadingStart D+ NPr🅪Sg/VB/J NSg+ > # > Research on part - of - speech tagging has been closely tied to corpus linguistics . # Nᴹ/VB J/P NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg V3 NSg/VLPp R VP/J P NSg Nᴹ+ . > The first major corpus of English for computer analysis was the Brown Corpus # D NSg/J NPr/VB/J NSg P NPr🅪Sg/VB/J R/C/P NSg+ N🅪Sg+ VLPt D NPr🅪Sg/VB/J NSg > developed at Brown University by Henry Kučera and W. Nelson Francis , in the # VP/J NSg/P NPr🅪Sg/VB/J NSg+ NSg/P NPr+ ? VB/C ? NPr+ NPr+ . NPr/J/R/P D > mid - 1960s . It consists of about 1 , 000 , 000 words of running English prose text , # NSg/J/P+ . #d . NPr/ISg+ NPl/V3 P J/P # . # . # NPl/V3 P Nᴹ/Vg/J/P NPr🅪Sg/VB/J+ Nᴹ/VB N🅪Sg/VB+ . > made up of 500 samples from randomly chosen publications . Each sample is 2 , 000 # VP NSg/VB/J/P P # NPl/V3+ P R Nᴹ/VPp/J NPl+ . Dq+ NSg/VB+ VL3 # . # > or more words ( ending at the first sentence - end after 2 , 000 words , so that the # NPr/C NPr/I/J/R/Dq NPl/V3+ . Nᴹ/Vg/J NSg/P D NSg/J NSg/VB+ . NSg/VB+ P # . # NPl/V3+ . NSg/I/J/R/C NSg/I/C/Ddem D > corpus contains only complete sentences ) . # NSg+ V3 J/R/C NSg/VB/J NPl/V3+ . . > # > The Brown Corpus was painstakingly " tagged " with part - of - speech markers over # D+ NPr🅪Sg/VB/J+ NSg+ VLPt R . VP/J . P NSg/VB/J+ . P . N🅪Sg/VB+ NPl/V3 NSg/J/P > many years . A first approximation was done with a program by Greene and Rubin , # NSg/I/J/Dq+ NPl+ . D/P+ NSg/J+ N🅪Sg+ VLPt NSg/VPp/J P D/P+ NPr/VB+ NSg/P NPr VB/C NPr . > which consisted of a huge handmade list of what categories could co - occur at # I/C+ VP/J P D/P J NSg/J NSg/VB P NSg/I+ NPl+ NSg/VXB NPr/I/VB+ . VB NSg/P > all . For example , article then noun can occur , but article then verb ( arguably ) # NSg/I/J/C/Dq . R/C/P NSg/VB+ . NSg/VB+ NSg/J/R/C NSg/VB+ NPr/VXB VB . NSg/C/P NSg/VB+ NSg/J/R/C NSg/VB+ . R . > cannot . The program got about 70 % correct . Its results were repeatedly reviewed # NSg/VXB . D+ NPr/VB+ VP J/P # . NSg/VB/J . ISg/D$+ NPl/V3+ NSg/VLPt R VP/J > and corrected by hand , and later users sent in errata so that by the late 70 s # VB/C VP/J NSg/P NSg/VB+ . VB/C JC NPl+ NSg/VP NPr/J/R/P NSg NSg/I/J/R/C NSg/I/C/Ddem+ NSg/P D NSg/J # ? > the tagging was nearly perfect ( allowing for some cases on which even human # D NSg/Vg VLPt R NSg/VB/J . Nᴹ/Vg/J R/C/P I/J/R/Dq NPl/V3+ J/P I/C+ NSg/VB/J/R NSg/VB/J+ > speakers might not agree ) . # + Nᴹ/VXB/J NSg/R/C VB . . > # > This corpus has been used for innumerable studies of word - frequency and of # I/Ddem+ NSg+ V3 NSg/VLPp VP/J R/C/P J NPl/V3 P NSg/VB+ . NSg VB/C P > part - of - speech and inspired the development of similar " tagged " corpora in many # NSg/VB/J+ . P . N🅪Sg/VB+ VB/C VP/J D N🅪Sg P NSg/J . VP/J . NPl+ NPr/J/R/P NSg/I/J/Dq > other languages . Statistics derived by analyzing it formed the basis for most # NSg/VB/J NPl+ . NPl/V3+ VP/J NSg/P Nᴹ/Vg/J NPr/ISg+ VP/J D+ NSg+ R/C/P NSg/I/J/R/Dq > later part - of - speech tagging systems , such as CLAWS and VOLSUNGA . However , by # JC NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg NPl+ . NSg/I R/C/P NPl/V3+ VB/C ? . C . NSg/P > this time ( 2005 ) it has been superseded by larger corpora such as the 100 # I/Ddem+ N🅪Sg/VB/J+ . # . NPr/ISg+ V3 NSg/VLPp VP/J NSg/P JC NPl+ NSg/I R/C/P D # > million word British National Corpus , even though larger corpora are rarely so # NSg NSg/VB+ NPr/J NSg/J NSg+ . NSg/VB/J/R C JC NPl+ VLB R NSg/I/J/R/C > thoroughly curated . # R VP/J . > # > For some time , part - of - speech tagging was considered an inseparable part of # R/C/P I/J/R/Dq N🅪Sg/VB/J+ . NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg VLPt VP/J D/P NSg/J NSg/VB/J P > natural language processing , because there are certain cases where the correct # NSg/J N🅪Sg+ Nᴹ/Vg/J+ . C/P R+ VLB I/J NPl/V3+ NSg/R/C D NSg/VB/J > part of speech cannot be decided without understanding the semantics or even the # NSg/VB/J P N🅪Sg/VB+ NSg/VXB NSg/VLXB NSg/VP/J C/P N🅪Sg/Vg/J+ D NPl+ NPr/C NSg/VB/J/R D > pragmatics of the context . This is extremely expensive , especially because # NPl P D N🅪Sg/VB+ . I/Ddem+ VL3 R J . R C/P > analyzing the higher levels is much harder when multiple part - of - speech # Nᴹ/Vg/J D+ NSg/JC+ NPl/V3+ VL3 NSg/I/J/R/Dq JC NSg/I/C NSg/J/Dq NSg/VB/J . P . N🅪Sg/VB+ > possibilities must be considered for each word . # NPl+ NSg/VXB NSg/VLXB VP/J R/C/P Dq+ NSg/VB+ . > # > Use of hidden Markov models # HeadingStart N🅪Sg/VB P VB/J NPr NPl/V3+ > # > In the mid - 1980s , researchers in Europe began to use hidden Markov models ( HMMs ) # NPr/J/R/P D NSg/J/P+ . #d . NPl NPr/J/R/P NPr+ VPt P N🅪Sg/VB VB/J NPr NPl/V3+ . ? . > to disambiguate parts of speech , when working to tag the Lancaster - Oslo - Bergen # P VB NPl/V3 P N🅪Sg/VB+ . NSg/I/C Nᴹ/Vg/J P NSg/VB D NPr . NPr+ . NPr+ > Corpus of British English . HMMs involve counting cases ( such as from the Brown # NSg P NPr/J NPr🅪Sg/VB/J+ . ? VB Nᴹ/Vg/J NPl/V3+ . NSg/I R/C/P P D NPr🅪Sg/VB/J > Corpus ) and making a table of the probabilities of certain sequences . For # NSg+ . VB/C Nᴹ/Vg/J D/P NSg/VB P D NPl P I/J NPl/V3+ . R/C/P > example , once you've seen an article such as ' the ' , perhaps the next word is a # NSg/VB+ . NSg/C K NSg/VPp D/P NSg/VB+ NSg/I R/C/P . D . . NSg/R D NSg/J/P NSg/VB+ VL3 D/P > noun 40 % of the time , an adjective 40 % , and a number 20 % . Knowing this , a # NSg/VB+ # . P D N🅪Sg/VB/J+ . D/P NSg/VB/J+ # . . VB/C D/P N🅪Sg/VB/JC+ # . . NSg/Vg/J/P I/Ddem+ . D/P+ > program can decide that " can " in " the can " is far more likely to be a noun than # NPr/VB+ NPr/VXB VB NSg/I/C/Ddem+ . NPr/VXB . NPr/J/R/P . D+ NPr/VXB . VL3 NSg/VB/J NPr/I/J/R/Dq NSg/J P NSg/VLXB D/P NSg/VB C/P > a verb or a modal . The same method can , of course , be used to benefit from # D/P+ NSg/VB+ NPr/C D/P NSg/J . D+ I/J+ NSg/VB+ NPr/VXB . P NSg/VB+ . NSg/VLXB VP/J P NSg/VB P > knowledge about the following words . # Nᴹ+ J/P D+ N🅪Sg/Vg/J/P NPl/V3+ . > # > More advanced ( " higher - order " ) HMMs learn the probabilities not only of pairs # NPr/I/J/R/Dq VP/J . . NSg/JC . N🅪Sg/VB . . ? NSg/VB D NPl+ NSg/R/C J/R/C P NPl/V3+ > but triples or even larger sequences . So , for example , if you've just seen a # NSg/C/P NPl/V3 NPr/C NSg/VB/J/R JC NPl/V3+ . NSg/I/J/R/C . R/C/P NSg/VB+ . NSg/C K J/R NSg/VPp D/P > noun followed by a verb , the next item may be very likely a preposition , # NSg/VB+ VP/J NSg/P D/P NSg/VB+ . D NSg/J/P NSg/VB+ NPr/VXB NSg/VLXB J/R NSg/J D/P NSg/VB . > article , or noun , but much less likely another verb . # NSg/VB+ . NPr/C NSg/VB+ . NSg/C/P NSg/I/J/R/Dq VB/J/R/C/P NSg/J I/D NSg/VB+ . > # > When several ambiguous words occur together , the possibilities multiply . # NSg/I/C J/Dq+ J+ NPl/V3+ VB J . D+ NPl+ NSg/VB . > However , it is easy to enumerate every combination and to assign a relative # C . NPr/ISg+ VL3 NSg/VB/J P VB Dq+ N🅪Sg+ VB/C P NSg/VB D/P NSg/J > probability to each one , by multiplying together the probabilities of each # NSg+ P Dq NSg/I/J+ . NSg/P Nᴹ/Vg/J J D NPl P Dq > choice in turn . The combination with the highest probability is then chosen . The # N🅪Sg/J+ NPr/J/R/P NSg/VB . D N🅪Sg P D+ JS+ NSg+ VL3 NSg/J/R/C Nᴹ/VPp/J . D+ > European group developed CLAWS , a tagging program that did exactly this and # NSg/J+ NSg/VB+ VP/J NPl/V3+ . D/P NSg/Vg NPr/VB+ NSg/I/C/Ddem+ VXPt R I/Ddem VB/C > achieved accuracy in the 93 – 95 % range . # VP/J N🅪Sg+ NPr/J/R/P D # . # . N🅪Sg/VB+ . > # > Eugene Charniak points out in Statistical techniques for natural language # NPr+ ? NPl/V3+ NSg/VB/J/R/P NPr/J/R/P J NPl R/C/P NSg/J+ N🅪Sg+ > parsing ( 1997 ) that merely assigning the most common tag to each known word and # Nᴹ/Vg/J . # . NSg/I/C/Ddem+ R Nᴹ/Vg/J D NSg/I/J/R/Dq NSg/VB/J NSg/VB+ P Dq VPp/J NSg/VB+ VB/C > the tag " proper noun " to all unknowns will approach 90 % accuracy because many # D NSg/VB+ . NSg/J NSg/VB+ . P NSg/I/J/C/Dq NPl/V3+ NPr/VXB N🅪Sg/VB+ # . N🅪Sg+ C/P NSg/I/J/Dq > words are unambiguous , and many others only rarely represent their less - common # NPl/V3+ VLB J . VB/C NSg/I/J/Dq NPl/V3+ J/R/C R VB D$+ VB/J/R/C/P . NSg/VB/J > parts of speech . # NPl/V3 P N🅪Sg/VB+ . > # > CLAWS pioneered the field of HMM - based part of speech tagging but was quite # NPl/V3+ VP/J D NSg/VB P VB . VP/J NSg/VB/J P N🅪Sg/VB+ NSg/Vg NSg/C/P VLPt R > expensive since it enumerated all possibilities . It sometimes had to resort to # J C/P NPr/ISg+ VP/J NSg/I/J/C/Dq NPl+ . NPr/ISg+ R VP P NSg/VB P > backup methods when there were simply too many options ( the Brown Corpus # NSg/J NPl/V3+ NSg/I/C R+ NSg/VLPt R R NSg/I/J/Dq NPl/V3 . D+ NPr🅪Sg/VB/J+ NSg+ > contains a case with 17 ambiguous words in a row , and there are words such as # V3 D/P NPr🅪Sg/VB+ P # J NPl/V3 NPr/J/R/P D/P+ NSg/VB+ . VB/C R+ VLB NPl/V3+ NSg/I R/C/P > " still " that can represent as many as 7 distinct parts of speech . # . NSg/VB/J/R . NSg/I/C/Ddem+ NPr/VXB VB R/C/P NSg/I/J/Dq R/C/P # VB/J NPl/V3 P N🅪Sg/VB+ . > # > HMMs underlie the functioning of stochastic taggers and are used in various # ? VB D Nᴹ/Vg/J+ P J NPl VB/C VLB VP/J NPr/J/R/P J > algorithms one of the most widely used being the bi - directional inference # NPl+ NSg/I/J P D NSg/I/J/R/Dq R VP/J N🅪Sg/VLg/J/C D NSg/J . NSg/J NSg+ > algorithm . # NSg . > # > Dynamic programming methods # HeadingStart NSg/J+ Nᴹ/Vg/J+ NPl/V3+ > # > In 1987 , Steven DeRose and Kenneth W. Church independently developed dynamic # NPr/J/R/P # . NPr+ ? VB/C NPr+ ? NPr🅪Sg/VB+ R VP/J NSg/J > programming algorithms to solve the same problem in vastly less time . Their # Nᴹ/Vg/J+ NPl+ P NSg/VB D I/J NSg/J+ NPr/J/R/P R VB/J/R/C/P N🅪Sg/VB/J+ . D$+ > methods were similar to the Viterbi algorithm known for some time in other # NPl/V3+ NSg/VLPt NSg/J P D ? NSg VPp/J R/C/P I/J/R/Dq N🅪Sg/VB/J+ NPr/J/R/P NSg/VB/J > fields . DeRose used a table of pairs , while Church used a table of triples and a # NPrPl/V3+ . ? VP/J D/P NSg/VB P NPl/V3+ . NSg/VB/C/P NPr🅪Sg/VB+ VP/J D/P NSg/VB P NPl/V3 VB/C D/P > method of estimating the values for triples that were rare or nonexistent in the # NSg/VB P Nᴹ/Vg/J D NPl/V3+ R/C/P NPl/V3 NSg/I/C/Ddem+ NSg/VLPt NSg/VB/J NPr/C NSg/J NPr/J/R/P D > Brown Corpus ( an actual measurement of triple probabilities would require a much # NPr🅪Sg/VB/J NSg+ . D/P NSg/J N🅪Sg P NSg/VB/J NPl+ VXB NSg/VB D/P NSg/I/J/R/Dq > larger corpus ) . Both methods achieved an accuracy of over 95 % . DeRose's 1990 # JC NSg+ . . I/C/Dq NPl/V3+ VP/J D/P N🅪Sg+ P NSg/J/P # . . ? # > dissertation at Brown University included analyses of the specific error types , # NSg+ NSg/P NPr🅪Sg/VB/J NSg+ VP/J NPl/V3/Au/Br P D NSg/J NSg/VB+ NPl/V3+ . > probabilities , and other related data , and replicated his work for Greek , where # NPl+ . VB/C NSg/VB/J J N🅪Pl+ . VB/C VP/J ISg/D$+ N🅪Sg/VB+ R/C/P NPr/VB/J . NSg/R/C > it proved similarly effective . # NPr/ISg+ VP/J R NSg/J . > # > These findings were surprisingly disruptive to the field of natural language # I/Ddem+ NSg+ NSg/VLPt R J P D NSg/VB P NSg/J+ N🅪Sg+ > processing . The accuracy reported was higher than the typical accuracy of very # Nᴹ/Vg/J+ . D+ N🅪Sg+ VP/J VLPt NSg/JC C/P D NSg/J N🅪Sg P J/R > sophisticated algorithms that integrated part of speech choice with many higher # VP/J+ NPl+ NSg/I/C/Ddem+ VP/J NSg/VB/J P N🅪Sg/VB+ N🅪Sg/J+ P NSg/I/J/Dq NSg/JC > levels of linguistic analysis : syntax , morphology , semantics , and so on . CLAWS , # NPl/V3 P J N🅪Sg . Nᴹ+ . Nᴹ+ . NPl+ . VB/C NSg/I/J/R/C J/P . NPl/V3+ . > DeRose's and Church's methods did fail for some of the known cases where # ? VB/C NPr$ NPl/V3+ VXPt NSg/VB/J R/C/P I/J/R/Dq P D VPp/J NPl/V3+ NSg/R/C > semantics is required , but those proved negligibly rare . This convinced many in # NPl+ VL3 VP/J . NSg/C/P I/Ddem VP/J R NSg/VB/J . I/Ddem VP/J NSg/I/J/Dq NPr/J/R/P > the field that part - of - speech tagging could usefully be separated from the other # D+ NSg/VB+ NSg/I/C/Ddem+ NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg NSg/VXB R NSg/VLXB VP/J P D NSg/VB/J > levels of processing ; this , in turn , simplified the theory and practice of # NPl/V3 P Nᴹ/Vg/J+ . I/Ddem+ . NPr/J/R/P NSg/VB . VP/J D N🅪Sg VB/C NSg/VB P > computerized language analysis and encouraged researchers to find ways to # VP/J N🅪Sg+ N🅪Sg+ VB/C VP/J NPl+ P NSg/VB NPl+ P > separate other pieces as well . Markov Models became the standard method for the # NSg/VB/J NSg/VB/J NPl/V3+ R/C/P NSg/VB/J/R . NPr NPl/V3+ VPt D NSg/J NSg/VB+ R/C/P D > part - of - speech assignment . # NSg/VB/J+ . P . N🅪Sg/VB+ NSg+ . > # > Unsupervised taggers # HeadingStart VB/J NPl > # > The methods already discussed involve working from a pre - existing corpus to # D+ NPl/V3+ R VP/J VB Nᴹ/Vg/J P D/P+ NSg/VB/P+ . Nᴹ/Vg/J NSg+ P > learn tag probabilities . It is , however , also possible to bootstrap using # NSg/VB NSg/VB+ NPl+ . NPr/ISg+ VL3 . C . R/C NSg/J P NSg/VB Nᴹ/Vg/J > " unsupervised " tagging . Unsupervised tagging techniques use an untagged corpus # . VB/J . NSg/Vg . VB/J NSg/Vg NPl+ N🅪Sg/VB D/P VP/J NSg+ > for their training data and produce the tagset by induction . That is , they # R/C/P D$+ Nᴹ/Vg/J+ N🅪Pl+ VB/C Nᴹ/VB D NSg NSg/P N🅪Sg . NSg/I/C/Ddem+ VL3 . IPl+ > observe patterns in word use , and derive part - of - speech categories themselves . # NSg/VB NPl/V3+ NPr/J/R/P NSg/VB+ N🅪Sg/VB . VB/C NSg/VB NSg/VB/J+ . P . N🅪Sg/VB+ NPl+ IPl+ . > For example , statistics readily reveal that " the " , " a " , and " an " occur in # R/C/P NSg/VB+ . NPl/V3+ R NSg/VB NSg/I/C/Ddem+ . D . . . D/P . . VB/C . D/P . VB NPr/J/R/P > similar contexts , while " eat " occurs in very different ones . With sufficient # NSg/J+ NPl/V3+ . NSg/VB/C/P . VB . V3 NPr/J/R/P J/R NSg/J+ NPl+ . P J > iteration , similarity classes of words emerge that are remarkably similar to # N🅪Sg . NSg NPl/V3 P NPl/V3+ NSg/VB NSg/I/C/Ddem+ VLB R NSg/J P > those human linguists would expect ; and the differences themselves sometimes # I/Ddem NSg/VB/J NPl+ VXB VB . VB/C D NPl/VB+ IPl+ R > suggest valuable new insights . # VB NSg/J NSg/J NPl+ . > # > These two categories can be further subdivided into rule - based , stochastic , and # I/Ddem+ NSg+ NPl+ NPr/VXB NSg/VLXB VB/JC VP/J P NSg/VB+ . VP/J . J . VB/C > neural approaches . # J NPl/V3+ . > # > Other taggers and methods # HeadingStart NSg/VB/J NPl VB/C NPl/V3+ > # > Some current major algorithms for part - of - speech tagging include the Viterbi # I/J/R/Dq NSg/J NPr/VB/J NPl R/C/P NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg NSg/VB D ? > algorithm , Brill tagger , Constraint Grammar , and the Baum - Welch algorithm ( also # NSg . NSg/J NSg . NSg+ N🅪Sg/VB+ . VB/C D NPr . ? NSg . R/C > known as the forward - backward algorithm ) . Hidden Markov model and visible Markov # VPp/J R/C/P D NSg/VB/J . NSg/J NSg . . VB/J NPr NSg/VB/J+ VB/C J NPr > model taggers can both be implemented using the Viterbi algorithm . The # NSg/VB/J+ NPl NPr/VXB I/C/Dq NSg/VLXB VP/J Nᴹ/Vg/J D ? NSg . D+ > rule - based Brill tagger is unusual in that it learns a set of rule patterns , and # NSg/VB+ . VP/J NSg/J NSg VL3 NSg/J NPr/J/R/P NSg/I/C/Ddem NPr/ISg+ NPl/V3 D/P NPr/VBP/J P NSg/VB+ NPl/V3+ . VB/C > then applies those patterns rather than optimizing a statistical quantity . # NSg/J/R/C V3 I/Ddem NPl/V3+ NPr/VB/J/R C/P Nᴹ/Vg/J D/P J N🅪Sg+ . > # > Many machine learning methods have also been applied to the problem of POS # NSg/I/J/Dq+ NSg/VB+ Nᴹ/Vg/J+ NPl/V3+ NSg/VXB R/C NSg/VLPp VP/J P D NSg/J P NSg+ > tagging . Methods such as SVM , maximum entropy classifier , perceptron , and # NSg/Vg . NPl/V3+ NSg/I R/C/P ? . NSg/J NSg NSg . NSg . VB/C > nearest - neighbor have all been tried , and most can achieve accuracy above # JS . NSg/VB/J/Am+ NSg/VXB NSg/I/J/C/Dq NSg/VLPp VP/J . VB/C NSg/I/J/R/Dq NPr/VXB VB N🅪Sg+ NSg/J/P > 95 % . [ citation needed ] # # . . . NSg+ VP/J . > # > A direct comparison of several methods is reported ( with references ) at the ACL # D/P VB/J NSg P J/Dq+ NPl/V3+ VL3 VP/J . P NPl/V3+ . NSg/P D NSg > Wiki . This comparison uses the Penn tag set on some of the Penn Treebank data , # NSg/VB+ . I/Ddem+ NSg+ NPl/V3 D+ NPr+ NSg/VB+ NPr/VBP/J J/P I/J/R/Dq P D NPr+ ? N🅪Pl+ . > so the results are directly comparable . However , many significant taggers are # NSg/I/J/R/C D NPl/V3+ VLB R/C NSg/J . C . NSg/I/J/Dq NSg/J NPl VLB > not included ( perhaps because of the labor involved in reconfiguring them for # NSg/R/C VP/J . NSg/R C/P P D NPr🅪Sg/VB/Am/Au+ VP/J NPr/J/R/P Nᴹ/Vg/J NSg/IPl+ R/C/P > this particular dataset ) . Thus , it should not be assumed that the results # I/Ddem NSg/J NSg . . NSg . NPr/ISg+ VXB NSg/R/C NSg/VLXB VP/J NSg/I/C/Ddem D+ NPl/V3+ > reported here are the best that can be achieved with a given approach ; nor even # VP/J J/R VLB D NPr/VXB/JS NSg/I/C/Ddem+ NPr/VXB NSg/VLXB VP/J P D/P+ NSg/VPp/J/P+ N🅪Sg/VB+ . NSg/C NSg/VB/J/R > the best that have been achieved with a given approach . # D+ NPr/VXB/JS+ NSg/I/C/Ddem+ NSg/VXB NSg/VLPp VP/J P D/P+ NSg/VPp/J/P+ N🅪Sg/VB+ . > # > In 2014 , a paper reporting using the structure regularization method for # NPr/J/R/P # . D/P+ N🅪Sg/VB/J+ Nᴹ/Vg/J Nᴹ/Vg/J D N🅪Sg/VB+ N🅪Sg NSg/VB R/C/P > part - of - speech tagging , achieving 97.36 % on a standard benchmark dataset . # NSg/VB/J+ . P . N🅪Sg/VB+ NSg/Vg . Nᴹ/Vg/J # . J/P D/P NSg/J NSg/VB NSg . ================================================ FILE: harper-core/tests/text/tagged/Spell.US.md ================================================ > Spell # HeadingStart NSg/VB > # > This document contains a list of words spelled correctly in some dialects of English , but not American English . This is designed to test the spelling suggestions we give for such mistakes . # I/Ddem+ NSg/VB+ V3 D/P NSg/VB P NPl/V3+ VP/J R NPr/J/R/P I/J/R/Dq NPl P NPr🅪Sg/VB/J+ . NSg/C/P NSg/R/C NPr/J NPr🅪Sg/VB/J+ . I/Ddem+ VL3 VP/J P NSg/VB D+ Nᴹ/Vg/J+ NPl+ IPl+ NSg/VB R/C/P NSg/I+ NPl/V3+ . > # > To achieve this , the filename of this file contains `.US.` , which will tell the snapshot generator to use the American dialect , rather than trying to use an automatically detected dialect . # P VB I/Ddem+ . D NSg P I/Ddem NSg/VB+ V3 Unlintable . I/C+ NPr/VXB NPr/VB D NSg/VB+ NSg P N🅪Sg/VB D NPr/J NSg+ . NPr/VB/J/R C/P Nᴹ/Vg/J P N🅪Sg/VB D/P R VP/J NSg+ . > # > Words # HeadingStart NPl/V3+ > # > # > # > Afterwards . # R/Comm . > # > Centre . # NSg/VB/Comm+ . > # > Labelled . # VP/J/Comm . > # > Flavour . # N🅪Sg/VB/Comm+ . > # > Favoured . # VP/J/Comm . > # > Honour . # N🅪Sg/VB/Comm+ . > # > Grey . # NPr🅪Sg/VB/J/Comm . > # > Quarrelled . # VP/Comm . > # > Quarrelling . # Nᴹ/Vg/Comm . > # > Recognised . # VP/J/Au/Br . > # > Neighbour . # NSg/VB/J/Comm+ . > # > Neighbouring . # Nᴹ/Vg/J/Comm . > # > Clamour . # NSg/VB/Comm . > # > Theatre . # N🅪Sg/Comm+ . > # > Analyse . # VB/Au/Br . ================================================ FILE: harper-core/tests/text/tagged/Spell.md ================================================ > Spell # HeadingStart NSg/VB > # > This document contains example sentences with misspelled words that we want to test the spell checker on . # I/Ddem+ NSg/VB+ V3 NSg/VB+ NPl/V3+ P VP/J NPl/V3+ NSg/I/C/Ddem+ IPl+ NSg/VB P NSg/VB D NSg/VB NSg/VB J/P . > # > Example Sentences # HeadingStart NSg/VB+ NPl/V3+ > # > My favourite color is blu . # D$+ NSg/VB/J/Comm+ N🅪Sg/VB/J/Am+ VL3 W? . > I must defend my honour ! # ISg/#r+ NSg/VXB NSg/VB D$+ N🅪Sg/VB/Comm+ . > I recognize that you recognise me . # ISg/#r+ VB NSg/I/C/Ddem ISgPl+ VB/Au/Br NPr/ISg+ . > I analyze how you infantilize me . # ISg/#r+ VB NSg/C ISgPl+ VB NPr/ISg+ . > I analyse how you infantilise me . # ISg/#r+ VB/Au/Br NSg/C ISgPl+ ? NPr/ISg+ . > Careful , traveller ! # J . NSg/Comm+ . > At the centre of the theatre I dropped a litre of coke . # NSg/P D NSg/VB/Comm P D+ N🅪Sg/Comm+ ISg/#r+ VP/J D/P NSg/Comm P NPr🅪Sg/VB+ . ================================================ FILE: harper-core/tests/text/tagged/Swear.md ================================================ > Swears # HeadingStart NPl/V3 > # > This documents tests that different forms / variations of swears are tagged as such . # I/Ddem+ NPl/V3+ NPl/V3+ NSg/I/C/Ddem NSg/J+ NPl/V3+ . NPl P NPl/V3 VLB VP/J R/C/P NSg/I . > # > Examples # HeadingStart NPl/V3+ > # > One turd , two turds . # NSg/I/J+ NSg/VB+/B . NSg NPl/V3/B . > # > I fart , you're farting , he farts , she farted . # ISg/#r+ NSg/VB/B . + Nᴹ/Vg/J/B . NPr/ISg+ NPl/V3/B . ISg+ VP/J/B . ================================================ FILE: harper-core/tests/text/tagged/The Constitution of the United States.md ================================================ > # Unlintable > The Constitution Of The United States Of America # Unlintable HeadingStart D NPr+ P D VP/J NPrPl/V3 P NPr+ > # > We the People of the United States , in Order to form a more perfect Union , # IPl+ D NPl/VB P D+ VP/J NPrPl/V3+ . NPr/J/R/P N🅪Sg/VB+ P N🅪Sg/VB D/P NPr/I/J/R/Dq NSg/VB/J+ NPr/VB/J+ . > establish Justice , insure domestic Tranquility , provide for the common defence , # VB NPr🅪Sg+ . VB NSg/J NSg . VB R/C/P D NSg/VB/J N🅪Sg/Comm+ . > promote the general Welfare , and secure the Blessings of Liberty to ourselves # NSg/VB D NSg/VB/J Nᴹ/VB+ . VB/C VB/J D NPl/V3 P NSg+ P IPl+ > and our Posterity , do ordain and establish this Constitution for the United # VB/C D$+ Nᴹ+ . VXB VB VB/C VB I/Ddem NPr+ R/C/P D VP/J > States of America . # NPrPl/V3 P NPr+ . > # > Article . I. # HeadingStart NSg/VB+ . ? > # > Section . 1 . # HeadingStart NSg/VB+ . # . > # > All legislative Powers herein granted shall be vested in a # NSg/I/J/C/Dq+ NSg/J+ NPrPl/V3+ R VP/J VXB NSg/VLXB VP/J NPr/J/R/P D/P > Congress of the United States , which shall consist of a Senate and House of # NPr/VB P D+ VP/J NPrPl/V3+ . I/C+ VXB NSg/VB P D/P NPr+ VB/C NPr/VB P > Representatives . Congress shall make no law respecting an establishment of # NPl+ . NPr/VB+ VXB NSg/VB NSg/Dq/P+ N🅪Sg/VB+ Nᴹ/Vg/J D/P NSg P > religion , or prohibiting the free exercise thereof ; or abridging the freedom of # NSg/VB+ . NPr/C Nᴹ/Vg/J D+ NSg/VB/J N🅪Sg/VB+ R . NPr/C Nᴹ/Vg/J D N🅪Sg P > speech , or of the press ; or the right of the people peaceably to assemble , and # N🅪Sg/VB+ . NPr/C P D NSg/VB+ . NPr/C D NPr/VB/J P D NPl/VB+ R P VB . VB/C > to petition the government for a redress of grievances . # P NSg/VB D N🅪Sg+ R/C/P D/P NSg/VB P NPl . > # > No person shall be a Senator or Representative in Congress , or elector of # NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB D/P NSg NPr/C NSg/J NPr/J/R/P NPr/VB+ . NPr/C NSg P > President and Vice President , or hold any office , civil or military , under the # NSg/VB VB/C NSg/VB/J/P+ NSg/VB+ . NPr/C NSg/VB/J I/R/Dq NSg/VB+ . J NPr/C NSg/J . NSg/J/P D > United States , or under any State , who , having previously taken an oath , as a # VP/J NPrPl/V3+ . NPr/C NSg/J/P I/R/Dq N🅪Sg/VB+ . NPr/I+ . Nᴹ/Vg/J R VPp/J D/P NSg/VB+ . R/C/P D/P > member of Congress , or as an officer of the United States , or as a member of # NSg/VB P NPr/VB+ . NPr/C R/C/P D/P NSg/VB P D VP/J NPrPl/V3+ . NPr/C R/C/P D/P NSg/VB P > any State legislature , or as an executive or judicial officer of any State , to # I/R/Dq N🅪Sg/VB+ NSg+ . NPr/C R/C/P D/P NSg/J NPr/C NSg/J NSg/VB P I/R/Dq N🅪Sg/VB+ . P > support the Constitution of the United States , shall have engaged in # N🅪Sg/VB D NPr P D VP/J NPrPl/V3+ . VXB NSg/VXB VP/J NPr/J/R/P > insurrection or rebellion against the same , or given aid or comfort to the # N🅪Sg NPr/C N🅪Sg+ C/P D I/J . NPr/C NSg/VPp/J/P N🅪Sg/VB NPr/C N🅪Sg/VB+ P D > enemies thereof . But Congress may , by a vote of two - thirds of each House , # NPl/V3+ R . NSg/C/P NPr/VB+ NPr/VXB . NSg/P D/P NSg/VB P NSg . NPl/V3 P Dq+ NPr/VB+ . > remove such disability . # NSg/VB NSg/I+ N🅪Sg+ . > # > The terms of Senators and Representatives shall end at noon on the 3 d day of # D NPl/V3 P NPl VB/C NPl+ VXB NSg/VB NSg/P NSg/VB+ J/P D # NPr/J/#r+ NPr🅪Sg P > January , of the years in which such terms end ; and the terms of their # NPr+ . P D+ NPl+ NPr/J/R/P I/C+ NSg/I+ NPl/V3+ NSg/VB+ . VB/C D NPl/V3 P D$+ > successors shall then begin . # NPl+ VXB NSg/J/R/C NSg/VB . > # > Section . 2 . # HeadingStart NSg/VB+ . # . > # > The House of Representatives shall be composed of Members # D NPr/VB P NPl+ VXB NSg/VLXB VP/J P NPl/V3+ > chosen every second Year by the People of the several States , and the Electors # Nᴹ/VPp/J Dq+ NSg/VB/J+ NSg+ NSg/P D NPl/VB P D+ J/Dq+ NPrPl/V3+ . VB/C D NPl > in each State shall have the Qualifications requisite for Electors of the most # NPr/J/R/P Dq N🅪Sg/VB+ VXB NSg/VXB D NPl+ NSg/J+ R/C/P NPl P D NSg/I/J/R/Dq > numerous Branch of the State Legislature . # J NPr/VB P D N🅪Sg/VB+ NSg+ . > # > No Person shall be a Representative who shall not have attained to the Age of # NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB D/P+ NSg/J+ NPr/I+ VXB NSg/R/C NSg/VXB VP/J P D N🅪Sg/VB P > twenty five Years , and been seven Years a Citizen of the United States , and who # NSg NSg NPl+ . VB/C NSg/VLPp NSg NPl+ D/P NSg P D VP/J NPrPl/V3+ . VB/C NPr/I+ > shall not , when elected , be an Inhabitant of that State in which he shall be # VXB NSg/R/C . NSg/I/C NSg/VP/J . NSg/VLXB D/P NSg/J P NSg/I/C/Ddem N🅪Sg/VB+ NPr/J/R/P I/C+ NPr/ISg+ VXB NSg/VLXB > chosen . # Nᴹ/VPp/J . > # > Representatives shall be apportioned among the several States according to # NPl+ VXB NSg/VLXB VP/J P D J/Dq NPrPl/V3+ Nᴹ/Vg/J P > their respective numbers , counting the whole number of persons in each State , # D$+ J NPrPl/V3+ . Nᴹ/Vg/J D NSg/J N🅪Sg/VB/JC P NPl/V3+ NPr/J/R/P Dq N🅪Sg/VB+ . > excluding Indians not taxed . But when the right to vote at any election for the # Nᴹ/Vg/J NPrPl+ NSg/R/C VP/J . NSg/C/P NSg/I/C D+ NPr/VB/J+ P NSg/VB NSg/P I/R/Dq NSg+ R/C/P D > choice of electors for President and Vice President of the United States , # N🅪Sg/J P NPl R/C/P NSg/VB VB/C NSg/VB/J/P+ NSg/VB P D VP/J NPrPl/V3+ . > Representatives in Congress , the Executive and Judicial officers of a State , or # NPl+ NPr/J/R/P NPr/VB+ . D NSg/J VB/C NSg/J NPl/V3 P D/P N🅪Sg/VB+ . NPr/C > the members of the Legislature thereof , is denied to any of the male # D NPl/V3 P D NSg+ R . VL3 VP/J P I/R/Dq P D NPr/J+ > inhabitants of such State , being twenty - one years of age , and citizens of the # NPl P NSg/I N🅪Sg/VB+ . N🅪Sg/VLg/J/C+ NSg . NSg/I/J NPl P N🅪Sg/VB+ . VB/C NPl P D > United States , or in any way abridged , except for participation in rebellion , # VP/J NPrPl/V3+ . NPr/C NPr/J/R/P I/R/Dq NSg/J+ VP/J . VB/C/P R/C/P Nᴹ+ NPr/J/R/P N🅪Sg+ . > or other crime , the basis of representation therein shall be reduced in the # NPr/C NSg/VB/J N🅪Sg/VB+ . D NSg P NSg+ R VXB NSg/VLXB VP/J NPr/J/R/P D > proportion which the number of such male citizens shall bear to the whole # NSg/VB+ I/C+ D N🅪Sg/VB/JC P NSg/I NPr/J+ NPl+ VXB NSg/VB/J P D NSg/J > number of male citizens twenty - one years of age in such State . The actual # N🅪Sg/VB/JC P NPr/J+ NPl+ NSg . NSg/I/J NPl P N🅪Sg/VB+ NPr/J/R/P NSg/I N🅪Sg/VB+ . D NSg/J > Enumeration shall be made within three Years after the first Meeting of the # N🅪Sg VXB NSg/VLXB VP NSg/J/P NSg NPl+ P D NSg/J N🅪Sg/Vg/J P D > Congress of the United States , and within every subsequent Term of ten Years , # NPr/VB P D VP/J NPrPl/V3+ . VB/C NSg/J/P Dq NSg/J NSg/VB/J P NSg NPl+ . > in such Manner as they shall by Law direct . The Number of Representatives shall # NPr/J/R/P NSg/I NSg+ R/C/P IPl+ VXB NSg/P N🅪Sg/VB+ VB/J . D N🅪Sg/VB/JC P NPl+ VXB > not exceed one for every thirty Thousand , but each State shall have at Least # NSg/R/C VB NSg/I/J R/C/P Dq NSg NSg . NSg/C/P Dq+ N🅪Sg/VB+ VXB NSg/VXB NSg/P NSg/J/Dq+ > one Representative ; and until such enumeration shall be made , the State of New # NSg/I/J+ NSg/J+ . VB/C C/P NSg/I N🅪Sg VXB NSg/VLXB VP . D N🅪Sg/VB P NSg/J > Hampshire shall be entitled to chuse three , Massachusetts eight , Rhode - Island # NPr+ VXB NSg/VLXB VP/J P ? NSg . NPr+ NSg/J . NPr . NSg/VB > and Providence Plantations one , Connecticut five , New - York six , New Jersey # VB/C NPr+ NPl NSg/I/J . NPr+ NSg . NSg/J . NPr+ NSg . NSg/J NPr+ > four , Pennsylvania eight , Delaware one , Maryland six , Virginia ten , North # NSg . NPr+ NSg/J . NPr NSg/I/J . NPr NSg . NPr+ NSg . NPr/VB/J+ > Carolina five , South Carolina five , and Georgia three . # NPr+ NSg . NPr/VB/J+ NPr+ NSg . VB/C NPr+ NSg . > # > When vacancies happen in the Representation from any State , the Executive # NSg/I/C NPl VB NPr/J/R/P D NSg+ P I/R/Dq N🅪Sg/VB+ . D NSg/J > Authority thereof shall issue Writs of Election to fill such Vacancies . # N🅪Sg+ R VXB NSg/VB+ NPl/V3 P NSg+ P NSg/VB NSg/I NPl . > # > The House of Representatives shall chuse their Speaker and other Officers ; and # D NPr/VB P NPl+ VXB ? D$+ NSg VB/C NSg/VB/J NPl/V3+ . VB/C > shall have the sole Power of Impeachment . # VXB NSg/VXB D NSg/VB/J N🅪Sg/VB/J+ P N🅪Sg . > # > Section . 3 . # HeadingStart NSg/VB+ . # . > # > The Senate of the United States shall be composed of two # D NPr P D+ VP/J NPrPl/V3+ VXB NSg/VLXB VP/J P NSg > Senators from each State , elected by the people thereof , for six years ; and # NPl+ P Dq+ N🅪Sg/VB+ . NSg/VP/J NSg/P D+ NPl/VB+ R . R/C/P NSg NPl+ . VB/C > each Senator shall have one vote . The electors in each State shall have the # Dq NSg+ VXB NSg/VXB NSg/I/J NSg/VB+ . D NPl NPr/J/R/P Dq N🅪Sg/VB+ VXB NSg/VXB D > qualifications requisite for electors of the most numerous branch of the State # NPl+ NSg/J+ R/C/P NPl P D NSg/I/J/R/Dq J NPr/VB P D N🅪Sg/VB+ > legislatures . # NPl . > # > Immediately after they shall be assembled in Consequence of the first Election , # R P IPl+ VXB NSg/VLXB VP/J NPr/J/R/P NSg/VB P D+ NSg/J+ NSg+ . > they shall be divided as equally as may be into three Classes . The Seats of the # IPl+ VXB NSg/VLXB VP/J R/C/P R R/C/P NPr/VXB NSg/VLXB P NSg+ NPl/V3+ . D NPl/V3 P D > Senators of the first Class shall be vacated at the Expiration of the second # NPl P D+ NSg/J+ N🅪Sg/VB/J+ VXB NSg/VLXB VP/J NSg/P D N🅪Sg P D+ NSg/VB/J+ > Year , of the second Class at the Expiration of the fourth Year , and of the # NSg+ . P D NSg/VB/J N🅪Sg/VB/J+ NSg/P D N🅪Sg P D+ NPr/VB/J+ NSg+ . VB/C P D > third Class at the Expiration of the sixth Year , so that one third may be # NSg/VB/J N🅪Sg/VB/J+ NSg/P D N🅪Sg P D+ NSg/VB/J+ NSg+ . NSg/I/J/R/C NSg/I/C/Ddem NSg/I/J NSg/VB/J NPr/VXB NSg/VLXB > chosen every second Year ; and when vacancies happen in the representation of # Nᴹ/VPp/J Dq+ NSg/VB/J+ NSg+ . VB/C NSg/I/C NPl VB NPr/J/R/P D NSg P > any State in the Senate , the executive authority of such State shall issue # I/R/Dq N🅪Sg/VB+ NPr/J/R/P D NPr+ . D NSg/J N🅪Sg P NSg/I N🅪Sg/VB+ VXB NSg/VB+ > writs of election to fill such vacancies : Provided , That the legislature of any # NPl/V3 P NSg+ P NSg/VB NSg/I NPl . VP/J/C . NSg/I/C/Ddem D NSg P I/R/Dq > State may empower the executive thereof to make temporary appointments until # N🅪Sg/VB+ NPr/VXB VB D NSg/J R P NSg/VB NSg/J NPl+ C/P > the people fill the vacancies by election as the legislature may direct . # D NPl/VB+ NSg/VB D NPl NSg/P NSg+ R/C/P D NSg+ NPr/VXB VB/J . > # > No Person shall be a Senator who shall not have attained to the Age of thirty # NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB D/P+ NSg+ NPr/I+ VXB NSg/R/C NSg/VXB VP/J P D N🅪Sg/VB P NSg > Years , and been nine Years a Citizen of the United States , and who shall not , # NPl+ . VB/C NSg/VLPp NSg NPl+ D/P NSg P D VP/J NPrPl/V3+ . VB/C NPr/I+ VXB NSg/R/C . > when elected , be an Inhabitant of that State for which he shall be chosen . # NSg/I/C NSg/VP/J . NSg/VLXB D/P NSg/J P NSg/I/C/Ddem N🅪Sg/VB+ R/C/P I/C+ NPr/ISg+ VXB NSg/VLXB Nᴹ/VPp/J . > # > The Vice President of the United States shall be President of the Senate , but # D NSg/VB/J/P+ NSg/VB P D+ VP/J NPrPl/V3+ VXB NSg/VLXB NSg/VB P D+ NPr+ . NSg/C/P > shall have no Vote , unless they be equally divided . # VXB NSg/VXB NSg/Dq/P+ NSg/VB+ . C IPl+ NSg/VLXB R VP/J . > # > The Senate shall chuse their other Officers , and also a President pro tempore , # D+ NPr+ VXB ? D$+ NSg/VB/J NPl/V3+ . VB/C R/C D/P NSg/VB+ NSg/J/P ? . > in the Absence of the Vice President , or when he shall exercise the Office of # NPr/J/R/P D N🅪Sg P D NSg/VB/J/P+ NSg/VB+ . NPr/C NSg/I/C NPr/ISg+ VXB N🅪Sg/VB D NSg/VB P > President of the United States . # NSg/VB P D VP/J NPrPl/V3+ . > # > The Senate shall have the sole Power to try all Impeachments . When sitting for # D+ NPr+ VXB NSg/VXB D+ NSg/VB/J+ N🅪Sg/VB/J+ P NSg/VB/J NSg/I/J/C/Dq NPl . NSg/I/C NSg/Vg/J R/C/P > that Purpose , they shall be on Oath or Affirmation . When the President of the # NSg/I/C/Ddem+ N🅪Sg/VB+ . IPl+ VXB NSg/VLXB J/P NSg/VB+ NPr/C NSg . NSg/I/C D NSg/VB P D+ > United States is tried , the Chief Justice shall preside : And no Person shall be # VP/J NPrPl/V3+ VL3 VP/J . D+ NSg/VB/J+ NPr🅪Sg+ VXB VB . VB/C NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB > convicted without the Concurrence of two thirds of the Members present . # VP/J C/P D NSg P NSg NPl/V3 P D NPl/V3+ NSg/VB/J . > # > Judgment in Cases of impeachment shall not extend further than to removal from # NSg+ NPr/J/R/P NPl/V3+ P N🅪Sg VXB NSg/R/C NSg/VB VB/JC C/P P NSg P > Office , and disqualification to hold and enjoy any Office of honor , Trust or # NSg/VB+ . VB/C N🅪Sg P NSg/VB/J VB/C VB I/R/Dq NSg/VB P N🅪Sg/VB/Am+ . N🅪Sg/VB/J NPr/C > Profit under the United States : but the Party convicted shall nevertheless be # N🅪Sg/VBP/J+ NSg/J/P D VP/J NPrPl/V3+ . NSg/C/P D NSg/VB/J+ VP/J VXB R NSg/VLXB > liable and subject to Indictment , Trial , Judgment and Punishment , according to # J VB/C NSg/VB/J+ P NSg . NSg/VB/J+ . NSg VB/C N🅪Sg+ . Nᴹ/Vg/J P > Law . # N🅪Sg/VB . > # > Section . 4 . # HeadingStart NSg/VB+ . # . > # > The Times , Places and Manner of holding Elections for Senators # D+ NPl/V3+ . NPl/V3+ VB/C NSg P Nᴹ/Vg/J NPl+ R/C/P NPl > and Representatives , shall be prescribed in each State by the Legislature # VB/C NPl+ . VXB NSg/VLXB VP/J NPr/J/R/P Dq N🅪Sg/VB+ NSg/P D NSg+ > thereof ; but the Congress may at any time by Law make or alter such # R . NSg/C/P D NPr/VB+ NPr/VXB NSg/P I/R/Dq N🅪Sg/VB/J+ NSg/P N🅪Sg/VB+ NSg/VB NPr/C NSg/VB NSg/I > Regulations , except as to the Places of chusing Senators . # NPl+ . VB/C/P R/C/P P D NPl/V3 P ? NPl+ . > # > The Congress shall assemble at least once in every year , and such meeting shall # D+ NPr/VB+ VXB VB NSg/P NSg/J/Dq NSg/C NPr/J/R/P Dq+ NSg+ . VB/C NSg/I+ N🅪Sg/Vg/J+ VXB > begin at noon on the 3 d day of January , unless they shall by law appoint a # NSg/VB NSg/P NSg/VB+ J/P D # NPr/J/#r+ NPr🅪Sg P NPr+ . C IPl+ VXB NSg/P N🅪Sg/VB+ VB D/P+ > different day . # NSg/J NPr🅪Sg+ . > # > Section . 5 . # HeadingStart NSg/VB+ . # . > # > Each House shall be the Judge of the Elections , Returns and # Dq+ NPr/VB+ VXB NSg/VLXB D NSg/VB P D+ NPl+ . NPl/V3 VB/C > Qualifications of its own Members , and a Majority of each shall constitute a # NPl P ISg/D$+ NSg/VB/J+ NPl/V3+ . VB/C D/P NSg P Dq+ VXB NSg/VB D/P > Quorum to do Business ; but a smaller Number may adjourn from day to day , and # NSg P VXB N🅪Sg/J+ . NSg/C/P D/P NSg/JC N🅪Sg/VB/JC+ NPr/VXB VB P NPr🅪Sg+ P NPr🅪Sg . VB/C > may be authorized to compel the Attendance of absent Members , in such Manner , # NPr/VXB NSg/VLXB VP/J P VB D NSg P NSg/VB/J/P NPl/V3+ . NPr/J/R/P NSg/I NSg+ . > and under such Penalties as each House may provide . # VB/C NSg/J/P NSg/I NPl+ R/C/P Dq NPr/VB+ NPr/VXB VB . > # > Each House may determine the Rules of its Proceedings , punish its Members for # Dq+ NPr/VB+ NPr/VXB VB D NPl/V3 P ISg/D$+ NPl+ . VB ISg/D$+ NPl/V3+ R/C/P > disorderly Behaviour , and , with the Concurrence of two thirds , expel a Member . # R+ N🅪Sg/Comm+ . VB/C . P D NSg P NSg NPl/V3+ . VB D/P NSg/VB+ . > # > Each House shall keep a Journal of its Proceedings , and from time to time # Dq+ NPr/VB+ VXB NSg/VB D/P NSg/VB/J P ISg/D$+ NPl+ . VB/C P N🅪Sg/VB/J+ P N🅪Sg/VB/J > publish the same , excepting such Parts as may in their Judgment require # VB D I/J . Nᴹ/Vg/J NSg/I NPl/V3+ R/C/P NPr/VXB NPr/J/R/P D$+ NSg+ NSg/VB > Secrecy ; and the Yeas and Nays of the Members of either House on any question # Nᴹ . VB/C D NPl VB/C NPl/V3 P D NPl/V3 P I/C NPr/VB+ J/P I/R/Dq NSg/VB+ > shall , at the Desire of one fifth of those Present , be entered on the Journal . # VXB . NSg/P D N🅪Sg/VB P NSg/I/J NSg/VB/J P I/Ddem NSg/VB/J . NSg/VLXB VP/J J/P D NSg/VB/J+ . > # > Neither House , during the Session of Congress , shall , without the Consent of # I/C NPr/VB+ . VB/P D NSg/VB P NPr/VB+ . VXB . C/P D N🅪Sg/VP P > the other , adjourn for more than three days , nor to any other Place than that # D NSg/VB/J . VB R/C/P NPr/I/J/R/Dq C/P NSg NPl+ . NSg/C P I/R/Dq NSg/VB/J N🅪Sg/VB+ C/P NSg/I/C/Ddem+ > in which the two Houses shall be sitting . # NPr/J/R/P I/C+ D NSg NPl/V3+ VXB NSg/VLXB NSg/Vg/J . > # > Section . 6 . # HeadingStart NSg/VB+ . # . > # > The Senators and Representatives shall receive a Compensation # D NPl VB/C NPl+ VXB NSg/VB D/P N🅪Sg+ > for their Services , to be ascertained by Law , and paid out of the Treasury of # R/C/P D$+ NPl/V3+ . P NSg/VLXB VP/J NSg/P N🅪Sg/VB+ . VB/C VP/J NSg/VB/J/R/P P D NPr P > the United States . They shall in all Cases , except Treason , Felony and Breach # D VP/J NPrPl/V3+ . IPl+ VXB NPr/J/R/P NSg/I/J/C/Dq+ NPl/V3+ . VB/C/P NSg . NSg VB/C NSg/VB > of the Peace , be privileged from Arrest during their Attendance at the Session # P D NPr🅪Sg/VB+ . NSg/VLXB VP/J P N🅪Sg/VB+ VB/P D$+ NSg+ NSg/P D NSg/VB > of their respective Houses , and in going to and returning from the same ; and # P D$+ J NPl/V3+ . VB/C NPr/J/R/P Nᴹ/Vg/J P VB/C Nᴹ/Vg/J P D I/J . VB/C > for any Speech or Debate in either House , they shall not be questioned in any # R/C/P I/R/Dq N🅪Sg/VB NPr/C N🅪Sg/VB+ NPr/J/R/P I/C NPr/VB+ . IPl+ VXB NSg/R/C NSg/VLXB VP/J NPr/J/R/P I/R/Dq > other Place . # NSg/VB/J N🅪Sg/VB+ . > # > No Senator or Representative shall , during the Time for which he was elected , # NSg/Dq/P NSg NPr/C NSg/J+ VXB . VB/P D+ N🅪Sg/VB/J+ R/C/P I/C+ NPr/ISg+ VLPt NSg/VP/J . > be appointed to any civil Office under the Authority of the United States , # NSg/VLXB VP/J P I/R/Dq J+ NSg/VB+ NSg/J/P D N🅪Sg P D+ VP/J NPrPl/V3+ . > which shall have been created , or the Emoluments whereof shall have been # I/C+ VXB NSg/VXB NSg/VLPp VP/J . NPr/C D NPl C VXB NSg/VXB NSg/VLPp > encreased during such time ; and no Person holding any Office under the United # ? VB/P NSg/I N🅪Sg/VB/J+ . VB/C NSg/Dq/P NSg/VB+ Nᴹ/Vg/J I/R/Dq NSg/VB+ NSg/J/P D VP/J > States , shall be a Member of either House during his Continuance in Office . No # NPrPl/V3+ . VXB NSg/VLXB D/P NSg/VB P I/C NPr/VB+ VB/P ISg/D$+ NSg NPr/J/R/P NSg/VB+ . NSg/Dq/P+ > law , varying the compensation for the services of the Senators and # N🅪Sg/VB+ . Nᴹ/Vg/J D N🅪Sg+ R/C/P D NPl/V3 P D NPl VB/C > Representatives , shall take effect , until an election of Representatives shall # NPl+ . VXB NSg/VB NSg/VB+ . C/P D/P NSg P NPl+ VXB > have intervened . # NSg/VXB VP/J . > # > Section . 7 . # HeadingStart NSg/VB+ . # . > # > All Bills for raising Revenue shall originate in the House of # NSg/I/J/C/Dq NPl/V3+ R/C/P Nᴹ/Vg/J NSg+ VXB VB NPr/J/R/P D NPr/VB P > Representatives ; but the Senate may propose or concur with Amendments as on # NPl+ . NSg/C/P D+ NPr+ NPr/VXB NSg/VB NPr/C VB P NPl+ R/C/P J/P > other Bills . # NSg/VB/J+ NPl/V3+ . > # > Every Bill which shall have passed the House of Representatives and the Senate , # Dq+ NPr/VB+ I/C+ VXB NSg/VXB VP/J D NPr/VB P NPl VB/C D+ NPr+ . > shall , before it become a Law , be presented to the President of the United # VXB . C/P NPr/ISg+ VBPp D/P+ N🅪Sg/VB+ . NSg/VLXB VP/J P D NSg/VB P D+ VP/J > States ; If he approve he shall sign it , but if not he shall return it , with his # NPrPl/V3+ . NSg/C NPr/ISg+ VB NPr/ISg+ VXB NSg/VB NPr/ISg+ . NSg/C/P NSg/C NSg/R/C NPr/ISg+ VXB NSg/VB NPr/ISg+ . P ISg/D$+ > Objections to that House in which it shall have originated , who shall enter the # NPl+ P NSg/I/C/Ddem+ NPr/VB+ NPr/J/R/P I/C+ NPr/ISg+ VXB NSg/VXB VP/J . NPr/I+ VXB NSg/VB D+ > Objections at large on their Journal , and proceed to reconsider it . If after # NPl+ NSg/P NSg/J J/P D$+ NSg/VB/J+ . VB/C VB P VB NPr/ISg+ . NSg/C P > such Reconsideration two thirds of that House shall agree to pass the Bill , it # NSg/I N🅪Sg NSg NPl/V3 P NSg/I/C/Ddem NPr/VB+ VXB VB P NSg/VB D NPr/VB+ . NPr/ISg+ > shall be sent , together with the Objections , to the other House , by which it # VXB NSg/VLXB NSg/VP . J P D NPl+ . P D NSg/VB/J NPr/VB+ . NSg/P I/C+ NPr/ISg+ > shall likewise be reconsidered , and if approved by two thirds of that House , it # VXB R NSg/VLXB VP/J . VB/C NSg/C VP/J NSg/P NSg NPl/V3 P NSg/I/C/Ddem NPr/VB+ . NPr/ISg+ > shall become a Law . But in all such Cases the Votes of both Houses shall be # VXB VBPp D/P N🅪Sg/VB+ . NSg/C/P NPr/J/R/P NSg/I/J/C/Dq NSg/I NPl/V3+ D NPl/V3 P I/C/Dq NPl/V3+ VXB NSg/VLXB > determined by yeas and Nays , and the Names of the Persons voting for and # VP/J NSg/P NPl VB/C NPl/V3 . VB/C D NPl/V3 P D NPl/V3+ Nᴹ/Vg/J+ R/C/P VB/C > against the Bill shall be entered on the Journal of each House respectively . If # C/P D NPr/VB+ VXB NSg/VLXB VP/J J/P D NSg/VB/J P Dq NPr/VB+ R . NSg/C > any Bill shall not be returned by the President within ten Days ( Sundays # I/R/Dq+ NPr/VB+ VXB NSg/R/C NSg/VLXB VP/J NSg/P D NSg/VB NSg/J/P NSg NPl . NPl/V3+ > excepted ) after it shall have been presented to him , the Same shall be a Law , # VP/J . P NPr/ISg+ VXB NSg/VXB NSg/VLPp VP/J P ISg+ . D I/J VXB NSg/VLXB D/P N🅪Sg/VB . > in like Manner as if he had signed it , unless the Congress by their Adjournment # NPr/J/R/P NSg/VB/J/C/P NSg+ R/C/P NSg/C NPr/ISg+ VP VP/J NPr/ISg+ . C D+ NPr/VB+ NSg/P D$+ NSg > prevent its Return , in which Case it shall not be a Law . # VB ISg/D$+ NSg/VB . NPr/J/R/P I/C+ NPr🅪Sg/VB+ NPr/ISg+ VXB NSg/R/C NSg/VLXB D/P N🅪Sg/VB+ . > # > Every Order , Resolution , or Vote to which the Concurrence of the Senate and # Dq N🅪Sg/VB+ . + . NPr/C NSg/VB+ P I/C+ D NSg P D NPr+ VB/C > House of Representatives may be necessary ( except on a question of Adjournment ) # NPr/VB P NPl+ NPr/VXB NSg/VLXB NSg/J . VB/C/P J/P D/P NSg/VB+ P NSg . > shall be presented to the President of the United States ; and before the Same # VXB NSg/VLXB VP/J P D NSg/VB P D VP/J NPrPl/V3+ . VB/C C/P D I/J > shall take Effect , shall be approved by him , or being disapproved by him , shall # VXB NSg/VB NSg/VB+ . VXB NSg/VLXB VP/J NSg/P ISg+ . NPr/C N🅪Sg/VLg/J/C VP/J NSg/P ISg+ . VXB > be repassed by two thirds of the Senate and House of Representatives , according # NSg/VLXB ? NSg/P NSg NPl/V3 P D NPr+ VB/C NPr/VB P NPl+ . Nᴹ/Vg/J > to the Rules and Limitations prescribed in the Case of a Bill . # P D NPl/V3 VB/C NPl+ VP/J NPr/J/R/P D NPr🅪Sg/VB P D/P NPr/VB+ . > # > Section . 8 . # HeadingStart NSg/VB+ . # . > # > The Congress shall have Power To lay and collect Taxes , Duties , # D+ NPr/VB+ VXB NSg/VXB N🅪Sg/VB/J+ P NSg/VBPt/J VB/C NSg/VB/J NPl/V3+ . NPl+ . > Imposts and Excises , to pay the Debts and provide for the common Defence and # NPl VB/C NPl/V3 . P NSg/VB/J D NPl+ VB/C VB R/C/P D NSg/VB/J N🅪Sg/Comm+ VB/C > general Welfare of the United States ; but all Duties , Imposts and Excises shall # NSg/VB/J Nᴹ/VB P D VP/J NPrPl/V3+ . NSg/C/P NSg/I/J/C/Dq NPl+ . NPl VB/C NPl/V3 VXB > be uniform throughout the United States ; # NSg/VLXB NSg/VB/J P D VP/J NPrPl/V3+ . > # > # > # > To borrow Money on the credit of the United States ; # P NSg/VB N🅪Sg/J+ J/P D NSg/VB P D+ VP/J NPrPl/V3+ . > # > # > # > To regulate Commerce with foreign Nations , and among the several States , and # P VB Nᴹ/VB+ P NSg/J+ NPl+ . VB/C P D+ J/Dq+ NPrPl/V3+ . VB/C > with the Indian Tribes ; # P D+ NPr/J+ NPl/V3+ . > # > # > # > To establish an uniform Rule of Naturalization , and uniform Laws on the subject # P VB D/P NSg/VB/J NSg/VB P Nᴹ . VB/C NSg/VB/J NPl/V3+ J/P D NSg/VB/J > of Bankruptcies throughout the United States ; # P NPl+ P D VP/J NPrPl/V3+ . > # > # > # > To coin Money , regulate the Value thereof , and of foreign Coin , and fix the # P NSg/VB N🅪Sg/J+ . VB D+ N🅪Sg/VB+ R . VB/C P NSg/J NSg/VB+ . VB/C NSg/VB D > Standard of Weights and Measures ; # NSg/J P NPl/V3 VB/C NPl/V3+ . > # > # > # > To provide for the Punishment of counterfeiting the Securities and current Coin # P VB R/C/P D N🅪Sg P Nᴹ/Vg/J D NPl+ VB/C NSg/J NSg/VB > of the United States ; # P D VP/J NPrPl/V3+ . > # > # > # > To establish Post Offices and post Roads ; # P VB NPr🅪Sg/VB/P+ NPl/V3 VB/C NPr🅪Sg/VB/P+ NPl+ . > # > # > # > To promote the Progress of Science and useful Arts , by securing for limited # P NSg/VB D Nᴹ/VB P N🅪Sg/VB VB/C J+ NPl/V3+ . NSg/P Nᴹ/Vg/J R/C/P NSg/VP/J > Times to Authors and Inventors the exclusive Right to their respective Writings # NPl/V3+ P NPl/V3 VB/C NPl D NSg/J NPr/VB/J P D$+ J NPl/V3 > and Discoveries ; # VB/C NPl+ . > # > # > # > To constitute Tribunals inferior to the supreme Court ; # P NSg/VB NPl NSg/J P D NSg/VB/J N🅪Sg/VB/J+ . > # > # > # > To define and punish Piracies and Felonies committed on the high Seas , and # P NSg/VB/J VB/C VB ? VB/C NPl VP/J J/P D NSg/VB/J/R NPl+ . VB/C > Offences against the Law of Nations ; # NPl/Comm C/P D N🅪Sg/VB P NPl+ . > # > # > # > To declare War , grant Letters of Marque and Reprisal , and make Rules concerning # P VB N🅪Sg/VB+ . NPr/VB+ NPl/V3 P NSg VB/C NSg+ . VB/C NSg/VB NPl/V3+ NSg/Vg/J/P > Captures on Land and Water ; # NPl/V3 J/P NPr🅪Sg/VB VB/C N🅪Sg/VB+ . > # > # > # > To raise and support Armies , but no Appropriation of Money to that Use shall be # P NSg/VB VB/C N🅪Sg/VB+ NPl+ . NSg/C/P NSg/Dq/P NSg P N🅪Sg/J+ P NSg/I/C/Ddem+ N🅪Sg/VB VXB NSg/VLXB > for a longer Term than two Years ; # R/C/P D/P NSg/JC NSg/VB/J C/P NSg+ NPl+ . > # > # > # > To provide and maintain a Navy ; # P VB VB/C VB D/P+ N🅪Sg/J+ . > # > # > # > To make Rules for the Government and Regulation of the land and naval Forces ; # P NSg/VB NPl/V3+ R/C/P D N🅪Sg VB/C N🅪Sg/J P D NPr🅪Sg/VB VB/C J+ NPl/V3+ . > # > # > # > To provide for calling forth the Militia to execute the Laws of the Union , # P VB R/C/P Nᴹ/Vg/J R D NSg P VB D NPl/V3 P D NPr/VB/J+ . > suppress Insurrections and repel Invasions ; # VB NPl VB/C VB NPl . > # > # > # > To provide for organizing , arming , and disciplining , the Militia , and for # P VB R/C/P Nᴹ/Vg/J . Nᴹ/Vg/J . VB/C Nᴹ/Vg/J . D NSg . VB/C R/C/P > governing such Part of them as may be employed in the Service of the United # Nᴹ/Vg/J NSg/I NSg/VB/J P NSg/IPl+ R/C/P NPr/VXB NSg/VLXB VP/J NPr/J/R/P D NSg/VB P D VP/J > States , reserving to the States respectively , the Appointment of the Officers , # NPrPl/V3+ . Nᴹ/Vg/J P D NPrPl/V3+ R . D NSg P D NPl/V3+ . > and the Authority of training the Militia according to the discipline # VB/C D N🅪Sg P Nᴹ/Vg/J+ D NSg Nᴹ/Vg/J P D NSg/VB+ > prescribed by Congress ; # VP/J NSg/P NPr/VB+ . > # > # > # > To exercise exclusive Legislation in all Cases whatsoever , over such District # P N🅪Sg/VB NSg/J NSg+ NPr/J/R/P NSg/I/J/C/Dq+ NPl/V3+ I . NSg/J/P NSg/I NSg/VB/J+ > ( not exceeding ten Miles square ) as may , by Cession of particular States , and # . NSg/R/C Nᴹ/Vg/J NSg+ NPrPl+ NSg/VB/J . R/C/P NPr/VXB . NSg/P NSg P NSg/J NPrPl/V3+ . VB/C > the Acceptance of Congress , become the Seat of the Government of the United # D N🅪Sg P NPr/VB+ . VBPp D NSg/VB P D N🅪Sg P D VP/J > States , and to exercise like Authority over all Places purchased by the Consent # NPrPl/V3+ . VB/C P N🅪Sg/VB NSg/VB/J/C/P N🅪Sg+ NSg/J/P NSg/I/J/C/Dq NPl/V3+ VP/J NSg/P D N🅪Sg/VP > of the Legislature of the State in which the Same shall be , for the Erection of # P D NSg P D N🅪Sg/VB+ NPr/J/R/P I/C+ D I/J VXB NSg/VLXB . R/C/P D NSg P > Forts , Magazines , Arsenals , dock - Yards , and other needful Buildings ; — And # NPl/V3 . NPl+ . NPl+ . NSg/VB+ . NPl/V3+ . VB/C NSg/VB/J NSg/J NPl/V3+ . . VB/C > # > # > # > To make all Laws which shall be necessary and proper for carrying into # P NSg/VB NSg/I/J/C/Dq+ NPl/V3+ I/C+ VXB NSg/VLXB NSg/J VB/C NSg/J R/C/P Nᴹ/Vg/J P > Execution the foregoing Powers , and all other Powers vested by this # N🅪Sg+ D Nᴹ/Vg/J NPrPl/V3+ . VB/C NSg/I/J/C/Dq NSg/VB/J NPrPl/V3+ VP/J NSg/P I/Ddem > Constitution in the Government of the United States , or in any Department or # NPr+ NPr/J/R/P D N🅪Sg P D VP/J NPrPl/V3+ . NPr/C NPr/J/R/P I/R/Dq NSg NPr/C > Officer thereof . # NSg/VB+ R . > # > # > # > Section . 9 . # HeadingStart NSg/VB+ . # . > # > The Migration or Importation of such Persons as any of the # D NSg+ NPr/C N🅪Sg P NSg/I NPl/V3+ R/C/P I/R/Dq P D > States now existing shall think proper to admit , shall not be prohibited by the # NPrPl/V3+ NSg/J/R/C Nᴹ/Vg/J VXB NSg/VB NSg/J P VB . VXB NSg/R/C NSg/VLXB VP/J NSg/P D > Congress prior to the Year one thousand eight hundred and eight , but a Tax or # NPr/VB+ NSg/J P D NSg+ NSg/I/J+ NSg NSg/J NSg VB/C NSg/J . NSg/C/P D/P N🅪Sg/VB NPr/C > duty may be imposed on such Importation , not exceeding ten dollars for each # N🅪Sg+ NPr/VXB NSg/VLXB VP/J J/P NSg/I N🅪Sg . NSg/R/C Nᴹ/Vg/J NSg NPl+ R/C/P Dq > Person . # NSg/VB+ . > # > The Privilege of the Writ of Habeas Corpus shall not be suspended , unless when # D NSg/VB P D NSg/VB P ? NSg+ VXB NSg/R/C NSg/VLXB VP/J . C NSg/I/C > in Cases of Rebellion or Invasion the public Safety may require it . # NPr/J/R/P NPl/V3 P N🅪Sg+ NPr/C NSg D Nᴹ/VB/J N🅪Sg/VB+ NPr/VXB NSg/VB NPr/ISg+ . > # > No Bill of Attainder or ex post facto Law shall be passed . # NSg/Dq/P NPr/VB P NSg NPr/C NSg/VB/J+ NPr🅪Sg/VB/P+ ? N🅪Sg/VB+ VXB NSg/VLXB VP/J . > # > No Capitation , or other direct , Tax shall be laid , unless in Proportion to the # NSg/Dq/P NSg . NPr/C NSg/VB/J VB/J . N🅪Sg/VB+ VXB NSg/VLXB VP/J . C NPr/J/R/P NSg/VB+ P D > Census or Enumeration herein before directed to be taken . Congress shall have # NSg/VB+ NPr/C N🅪Sg R C/P VP/J P NSg/VLXB VPp/J . NPr/VB+ VXB NSg/VXB > power to lay and collect taxes on incomes , from whatever source derived , # N🅪Sg/VB/J+ P NSg/VBPt/J VB/C NSg/VB/J NPl/V3+ J/P NPl/V3+ . P NSg/I/J+ N🅪Sg/VB+ VP/J . > without apportionment among the several States , and without regard to any # C/P NSg P D J/Dq NPrPl/V3+ . VB/C C/P NSg/VB+ P I/R/Dq > census or enumeration . # NSg/VB+ NPr/C N🅪Sg . > # > No Tax or Duty shall be laid on Articles exported from any State . # NSg/Dq/P N🅪Sg/VB NPr/C N🅪Sg+ VXB NSg/VLXB VP/J J/P NPl/V3+ VP/J P I/R/Dq N🅪Sg/VB+ . > # > No Preference shall be given by any Regulation of Commerce or Revenue to the # NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB NSg/VPp/J/P NSg/P I/R/Dq N🅪Sg/J P Nᴹ/VB NPr/C NSg+ P D > Ports of one State over those of another : nor shall Vessels bound to , or from , # NPl/V3 P NSg/I/J N🅪Sg/VB+ NSg/J/P I/Ddem P I/D . NSg/C VXB NPl/V3+ NSg/VP/J P . NPr/C P . > one State , be obliged to enter , clear , or pay Duties in another . # NSg/I/J+ N🅪Sg/VB+ . NSg/VLXB VP/J P NSg/VB . NSg/VB/J . NPr/C NSg/VB/J NPl+ NPr/J/R/P I/D . > # > No Money shall be drawn from the Treasury , but in Consequence of Appropriations # NSg/Dq/P+ N🅪Sg/J+ VXB NSg/VLXB VPp/J P D NPr . NSg/C/P NPr/J/R/P NSg/VB P + > made by Law ; and a regular Statement and Account of the Receipts and # VP NSg/P N🅪Sg/VB+ . VB/C D/P NSg/J NSg/VB/J+ VB/C NSg/VB P D NPl/V3+ VB/C > Expenditures of all public Money shall be published from time to time . # NPl P NSg/I/J/C/Dq Nᴹ/VB/J N🅪Sg/J+ VXB NSg/VLXB VP/J P N🅪Sg/VB/J+ P N🅪Sg/VB/J . > # > No Title of Nobility shall be granted by the United States : And no Person # NSg/Dq/P NSg/VB+ P NSg VXB NSg/VLXB VP/J NSg/P D VP/J NPrPl/V3+ . VB/C NSg/Dq/P NSg/VB+ > holding any Office of Profit or Trust under them , shall , without the Consent of # Nᴹ/Vg/J I/R/Dq NSg/VB P N🅪Sg/VBP/J+ NPr/C N🅪Sg/VB/J NSg/J/P NSg/IPl+ . VXB . C/P D N🅪Sg/VP P > the Congress , accept of any present , Emolument , Office , or Title , of any kind # D NPr/VB+ . NSg/VB/J P I/R/Dq NSg/VB/J . NSg . NSg/VB+ . NPr/C NSg/VB+ . P I/R/Dq NSg/J+ > whatever , from any King , Prince , or foreign State . # NSg/I/J+ . P I/R/Dq NPr/VB/J+ . NPr/VB/J+ . NPr/C NSg/J N🅪Sg/VB+ . > # > The right of citizens of the United States to vote in any primary or other # D NPr/VB/J P NPl P D+ VP/J NPrPl/V3+ P NSg/VB NPr/J/R/P I/R/Dq NSg/VB/J NPr/C NSg/VB/J > election for President or Vice President , for electors for President or Vice # NSg R/C/P NSg/VB NPr/C NSg/VB/J/P+ NSg/VB+ . R/C/P NPl R/C/P NSg/VB NPr/C NSg/VB/J/P+ > President , or for Senator or Representative in Congress , shall not be denied or # NSg/VB+ . NPr/C R/C/P NSg NPr/C NSg/J+ NPr/J/R/P NPr/VB+ . VXB NSg/R/C NSg/VLXB VP/J NPr/C > abridged by the United States or any State by reason of failure to pay any poll # VP/J NSg/P D VP/J NPrPl/V3+ NPr/C I/R/Dq N🅪Sg/VB+ NSg/P N🅪Sg/VB P N🅪Sg+ P NSg/VB/J I/R/Dq NSg/VB/J+ > tax or other tax . # N🅪Sg/VB NPr/C NSg/VB/J N🅪Sg/VB+ . > # > Section . 10 . # HeadingStart NSg/VB+ . # . > # > No State shall enter into any Treaty , Alliance , or # NSg/Dq/P+ N🅪Sg/VB+ VXB NSg/VB P I/R/Dq NSg/VB+ . N🅪Sg/VB+ . NPr/C > Confederation ; grant Letters of Marque and Reprisal ; coin Money ; emit Bills of # NSg/J . NPr/VB+ NPl/V3 P NSg VB/C NSg+ . NSg/VB+ N🅪Sg/J+ . VB NPl/V3 P > Credit ; make any Thing but gold and silver Coin a Tender in Payment of Debts ; # NSg/VB+ . NSg/VB I/R/Dq NSg+ NSg/C/P Nᴹ/VB/J VB/C Nᴹ/VB/J+ NSg/VB+ D/P NSg/VB/J NPr/J/R/P N🅪Sg P NPl+ . > pass any Bill of Attainder , ex post facto Law , or Law impairing the Obligation # NSg/VB I/R/Dq NPr/VB P NSg . NSg/VB/J+ NPr🅪Sg/VB/P+ ? N🅪Sg/VB+ . NPr/C N🅪Sg/VB+ Nᴹ/Vg/J D N🅪Sg > of Contracts , or grant any Title of Nobility . # P NPl/V3+ . NPr/C NPr/VB I/R/Dq NSg/VB+ P NSg . > # > No State shall , without the Consent of the Congress , lay any Imposts or Duties # NSg/Dq/P+ N🅪Sg/VB+ VXB . C/P D N🅪Sg/VP P D+ NPr/VB+ . NSg/VBPt/J I/R/Dq NPl NPr/C NPl+ > on Imports or Exports , except what may be absolutely necessary for executing # J/P NPl/V3 NPr/C NPl/V3+ . VB/C/P NSg/I+ NPr/VXB NSg/VLXB R NSg/J R/C/P Nᴹ/Vg/J > it's inspection Laws : and the net Produce of all Duties and Imposts , laid by # + N🅪Sg+ NPl/V3+ . VB/C D NSg/VB/J+ Nᴹ/VB P NSg/I/J/C/Dq NPl+ VB/C NPl . VP/J NSg/P > any State on Imports or Exports , shall be for the Use of the Treasury of the # I/R/Dq N🅪Sg/VB+ J/P NPl/V3 NPr/C NPl/V3+ . VXB NSg/VLXB R/C/P D N🅪Sg/VB P D NPr P D > United States ; and all such Laws shall be subject to the Revision and Controul # VP/J NPrPl/V3+ . VB/C NSg/I/J/C/Dq NSg/I NPl/V3+ VXB NSg/VLXB NSg/VB/J P D NSg/VB+ VB/C ? > of the Congress . # P D NPr/VB+ . > # > No State shall , without the Consent of Congress , lay any Duty of Tonnage , keep # NSg/Dq/P+ N🅪Sg/VB+ VXB . C/P D N🅪Sg/VP P NPr/VB+ . NSg/VBPt/J I/R/Dq N🅪Sg P NSg+ . NSg/VB > Troops , or Ships of War in time of Peace , enter into any Agreement or Compact # NPl/V3+ . NPr/C NPl/V3 P N🅪Sg/VB+ NPr/J/R/P N🅪Sg/VB/J P NPr🅪Sg/VB+ . NSg/VB P I/R/Dq N🅪Sg+ NPr/C NSg/VB/J > with another State , or with a foreign Power , or engage in War , unless actually # P I/D+ N🅪Sg/VB+ . NPr/C P D/P+ NSg/J+ N🅪Sg/VB/J+ . NPr/C VB NPr/J/R/P N🅪Sg/VB+ . C R > invaded , or in such imminent Danger as will not admit of delay . # VP/J . NPr/C NPr/J/R/P NSg/I J N🅪Sg/VB/JC+ R/C/P NPr/VXB NSg/R/C VB P NSg/VBPt/J+ . > # > Article . II . # HeadingStart NSg/VB+ . #r . > # > Section . 1 . # HeadingStart NSg/VB+ . # . > # > The executive Power shall be vested in a President of the # D+ NSg/J+ N🅪Sg/VB/J+ VXB NSg/VLXB VP/J NPr/J/R/P D/P NSg/VB P D > United States of America . He shall hold his Office during the Term of four # VP/J NPrPl/V3 P NPr+ . NPr/ISg+ VXB NSg/VB/J ISg/D$+ NSg/VB+ VB/P D NSg/VB/J P NSg+ > Years ending at noon on the 20th day of January , and , together with the Vice # NPl+ Nᴹ/Vg/J NSg/P NSg/VB+ J/P D # NPr🅪Sg P NPr+ . VB/C . J P D+ NSg/VB/J/P+ > President , chosen for the same Term , be elected , as follows # NSg/VB+ . Nᴹ/VPp/J R/C/P D+ I/J+ NSg/VB/J+ . NSg/VLXB NSg/VP/J . R/C/P NPl/V3 > # > Each State shall appoint , in such Manner as the Legislature thereof may direct , # Dq+ N🅪Sg/VB+ VXB VB . NPr/J/R/P NSg/I NSg+ R/C/P D NSg+ R NPr/VXB VB/J . > a Number of Electors , equal to the whole Number of Senators and Representatives # D/P N🅪Sg/VB/JC+ P NPl . NSg/VB/J P D NSg/J N🅪Sg/VB/JC P NPl VB/C NPl+ > to which the State may be entitled in the Congress : but no Senator or # P I/C+ D N🅪Sg/VB+ NPr/VXB NSg/VLXB VP/J NPr/J/R/P D NPr/VB+ . NSg/C/P NSg/Dq/P NSg NPr/C > Representative , or Person holding an Office of Trust or Profit under the United # NSg/J+ . NPr/C NSg/VB+ Nᴹ/Vg/J D/P NSg/VB P N🅪Sg/VB/J NPr/C N🅪Sg/VBP/J+ NSg/J/P D VP/J > States , shall be appointed an Elector . # NPrPl/V3+ . VXB NSg/VLXB VP/J D/P NSg . > # > SubSection . 1 . # HeadingStart NSg/VB+ . # . > # > The Electors shall meet in their respective states , and vote # D NPl VXB NSg/VB/J NPr/J/R/P D$+ J NPrPl/V3+ . VB/C NSg/VB+ > by ballot for President and Vice - President , one of whom , at least , shall not be # NSg/P NSg/VB R/C/P NSg/VB VB/C NSg/VB/J/P+ . NSg/VB+ . NSg/I/J P I+ . NSg/P NSg/J/Dq . VXB NSg/R/C NSg/VLXB > an inhabitant of the same state with themselves ; they shall name in their # D/P NSg/J P D I/J N🅪Sg/VB+ P IPl+ . IPl+ VXB NSg/VB NPr/J/R/P D$+ > ballots the person voted for as President , and in distinct ballots the person # NPl/V3 D NSg/VB+ VP/J R/C/P R/C/P NSg/VB+ . VB/C NPr/J/R/P VB/J NPl/V3 D NSg/VB+ > voted for as Vice - President , and they shall make distinct lists of all persons # VP/J R/C/P R/C/P NSg/VB/J/P+ . NSg/VB+ . VB/C IPl+ VXB NSg/VB VB/J NPl/V3 P NSg/I/J/C/Dq NPl/V3+ > voted for as President , and all persons voted for as Vice - President and of the # VP/J R/C/P R/C/P NSg/VB+ . VB/C NSg/I/J/C/Dq NPl/V3+ VP/J R/C/P R/C/P NSg/VB/J/P+ . NSg/VB VB/C P D > number of votes for each , which lists they shall sign and certify , and transmit # N🅪Sg/VB/JC P NPl/V3+ R/C/P Dq . I/C+ NPl/V3+ IPl+ VXB NSg/VB+ VB/C VB . VB/C VB > sealed to the seat of the government of the United States , directed to the # VP/J P D NSg/VB P D N🅪Sg P D VP/J NPrPl/V3+ . VP/J P D > President of the Senate ; — The President of the Senate shall , in the presence of # NSg/VB P D NPr+ . . D NSg/VB P D NPr+ VXB . NPr/J/R/P D N🅪Sg/VB P > the Senate and House of Representatives , open all the certificates and the # D NPr+ VB/C NPr/VB P NPl+ . NSg/VB/J NSg/I/J/C/Dq D NPl/V3+ VB/C D > votes shall then be counted ; — The person having the greatest Number of votes for # NPl/V3+ VXB NSg/J/R/C NSg/VLXB VP/J . . D NSg/VB+ Nᴹ/Vg/J D JS N🅪Sg/VB/JC P NPl/V3+ R/C/P > President , shall be the President , if such number be a majority of the whole # NSg/VB+ . VXB NSg/VLXB D NSg/VB+ . NSg/C NSg/I N🅪Sg/VB/JC+ NSg/VLXB D/P NSg P D NSg/J > number of Electors appointed ; and if no person have such majority , then from # N🅪Sg/VB/JC+ P NPl VP/J . VB/C NSg/C NSg/Dq/P NSg/VB+ NSg/VXB NSg/I NSg+ . NSg/J/R/C P > the persons having the highest numbers not exceeding three on the list of those # D NPl/V3+ Nᴹ/Vg/J D JS NPrPl/V3+ NSg/R/C Nᴹ/Vg/J NSg J/P D NSg/VB P I/Ddem > voted for as President , the House of Representatives shall choose immediately , # VP/J+ R/C/P R/C/P NSg/VB+ . D NPr/VB P NPl+ VXB NSg/VB/C R . > by ballot , the President . But in choosing the President , the votes shall be # NSg/P NSg/VB+ . D NSg/VB+ . NSg/C/P NPr/J/R/P Nᴹ/Vg/J D+ NSg/VB+ . D+ NPl/V3+ VXB NSg/VLXB > taken by states , the representation from each state having one vote ; a quorum # VPp/J NSg/P NPrPl/V3+ . D NSg P Dq+ N🅪Sg/VB+ Nᴹ/Vg/J NSg/I/J+ NSg/VB+ . D/P NSg > for this purpose shall consist of a member or members from two - thirds of the # R/C/P I/Ddem N🅪Sg/VB+ VXB NSg/VB P D/P NSg/VB NPr/C NPl/V3+ P NSg . NPl/V3 P D > states , and a majority of all the states shall be necessary to a choice . [ If , # NPrPl/V3+ . VB/C D/P NSg P NSg/I/J/C/Dq D NPrPl/V3+ VXB NSg/VLXB NSg/J P D/P N🅪Sg/J+ . . NSg/C . > at the time fixed for the beginning of the term of the President , the President # NSg/P D+ N🅪Sg/VB/J+ VP/J R/C/P D NSg/Vg/J P D NSg/VB/J P D+ NSg/VB+ . D+ NSg/VB+ > elect shall have died , the Vice President elect shall become President . If a # NSg/VB/J VXB NSg/VXB VP/J . D NSg/VB/J/P+ NSg/VB+ NSg/VB/J VXB VBPp NSg/VB+ . NSg/C D/P+ > President shall not have been chosen before the time fixed for the beginning of # NSg/VB+ VXB NSg/R/C NSg/VXB NSg/VLPp Nᴹ/VPp/J C/P D+ N🅪Sg/VB/J+ VP/J R/C/P D NSg/Vg/J P > his term , or if the President elect shall have failed to qualify , then the Vice # ISg/D$+ NSg/VB/J+ . NPr/C NSg/C D+ NSg/VB+ NSg/VB/J VXB NSg/VXB VP/J P NSg/VB . NSg/J/R/C D NSg/VB/J/P+ > President elect shall act as President until a President shall have qualified ; # NSg/VB+ NSg/VB/J VXB NPr/VB+ R/C/P NSg/VB+ C/P D/P NSg/VB+ VXB NSg/VXB VP/J . > and the Congress may by law provide for the case wherein neither a President # VB/C D NPr/VB+ NPr/VXB NSg/P N🅪Sg/VB+ VB R/C/P D NPr🅪Sg/VB+ C I/C D/P NSg/VB+ > elect nor a Vice President elect shall have qualified , declaring who shall then # NSg/VB/J NSg/C D/P NSg/VB/J/P+ NSg/VB+ NSg/VB/J VXB NSg/VXB VP/J . Nᴹ/Vg/J NPr/I+ VXB NSg/J/R/C > act as President , or the manner in which one who is to act shall be selected , # NPr/VB+ R/C/P NSg/VB+ . NPr/C D NSg+ NPr/J/R/P I/C+ NSg/I/J NPr/I+ VL3 P NPr/VB VXB NSg/VLXB VP/J . > and such person shall act accordingly until a President or Vice President shall # VB/C NSg/I NSg/VB+ VXB NPr/VB+ R C/P D/P NSg/VB NPr/C NSg/VB/J/P+ NSg/VB+ VXB > have qualified . The Congress may by law provide for the case of the death of any # NSg/VXB VP/J . D+ NPr/VB+ NPr/VXB NSg/P N🅪Sg/VB+ VB R/C/P D NPr🅪Sg/VB P D NPr🅪Sg P I/R/Dq > of the persons from whom the House of Representatives may choose a President # P D NPl/V3+ P I+ D NPr/VB P NPl+ NPr/VXB NSg/VB/C D/P+ NSg/VB+ > whenever the right of choice shall have devolved upon them , and for the case of # C D NPr/VB/J P N🅪Sg/J+ VXB NSg/VXB VP/J P NSg/IPl+ . VB/C R/C/P D NPr🅪Sg/VB P > the death of any of the persons from whom the Senate may choose a Vice # D NPr🅪Sg P I/R/Dq P D NPl/V3+ P I+ D NPr+ NPr/VXB NSg/VB/C D/P NSg/VB/J/P+ > President whenever the right of choice shall have devolved upon them . ] The # NSg/VB+ C D NPr/VB/J P N🅪Sg/J+ VXB NSg/VXB VP/J P NSg/IPl+ . . D+ > person having the greatest number of votes as Vice - President , shall be the # NSg/VB+ Nᴹ/Vg/J D JS N🅪Sg/VB/JC P NPl/V3+ R/C/P NSg/VB/J/P+ . NSg/VB+ . VXB NSg/VLXB D > Vice - President , if such number be a majority of the whole number of Electors # NSg/VB/J/P+ . NSg/VB+ . NSg/C NSg/I+ N🅪Sg/VB/JC+ NSg/VLXB D/P NSg P D NSg/J N🅪Sg/VB/JC P NPl > appointed , and if no person have a majority , then from the two highest numbers # VP/J . VB/C NSg/C NSg/Dq/P NSg/VB+ NSg/VXB D/P NSg+ . NSg/J/R/C P D NSg JS NPrPl/V3+ > on the list , the Senate shall choose the Vice - President ; a quorum for the # J/P D NSg/VB+ . D NPr+ VXB NSg/VB/C D NSg/VB/J/P+ . NSg/VB+ . D/P NSg R/C/P D > purpose shall consist of two - thirds of the whole number of Senators , and a # N🅪Sg/VB+ VXB NSg/VB P NSg . NPl/V3 P D NSg/J N🅪Sg/VB/JC P NPl+ . VB/C D/P > majority of the whole number shall be necessary to a choice . But no person # NSg P D NSg/J N🅪Sg/VB/JC+ VXB NSg/VLXB NSg/J P D/P N🅪Sg/J+ . NSg/C/P NSg/Dq/P+ NSg/VB+ > constitutionally ineligible to the office of President shall be eligible to # R NSg/J P D NSg/VB P NSg/VB+ VXB NSg/VLXB NSg/J P > that of Vice - President of the United States . # NSg/I/C/Ddem P NSg/VB/J/P+ . NSg/VB P D VP/J NPrPl/V3+ . > # > The Congress may determine the Time of chusing the Electors , and the Day on # D+ NPr/VB+ NPr/VXB VB D N🅪Sg/VB/J P ? D NPl . VB/C D NPr🅪Sg+ J/P > which they shall give their Votes ; which Day shall be the same throughout the # I/C+ IPl+ VXB NSg/VB D$+ NPl/V3+ . I/C+ NPr🅪Sg+ VXB NSg/VLXB D I/J P D > United States . # VP/J NPrPl/V3+ . > # > SubSection . 2 # HeadingStart NSg/VB+ . # > # > No Person except a natural born Citizen , or a Citizen of the # NSg/Dq/P NSg/VB+ VB/C/P D/P+ NSg/J+ NPr/VB/J+ NSg+ . NPr/C D/P NSg P D+ > United States , at the time of the Adoption of this Constitution , shall be # VP/J NPrPl/V3+ . NSg/P D N🅪Sg/VB/J P D N🅪Sg P I/Ddem+ NPr+ . VXB NSg/VLXB > eligible to the Office of President ; neither shall any Person be eligible to # NSg/J P D NSg/VB P NSg/VB+ . I/C VXB I/R/Dq+ NSg/VB+ NSg/VLXB NSg/J P > that Office who shall not have attained to the Age of thirty five Years , and # NSg/I/C/Ddem NSg/VB+ NPr/I+ VXB NSg/R/C NSg/VXB VP/J P D N🅪Sg/VB P NSg NSg NPl+ . VB/C > been fourteen Years a Resident within the United States . # NSg/VLPp NSg NPl+ D/P NSg/J+ NSg/J/P D VP/J NPrPl/V3+ . > # > No person shall be elected to the office of the President more than twice , and # NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB NSg/VP/J P D NSg/VB P D+ NSg/VB+ NPr/I/J/R/Dq C/P R . VB/C > no person who has held the office of President , or acted as President , for more # NSg/Dq/P+ NSg/VB+ NPr/I+ V3 VP D NSg/VB P NSg/VB+ . NPr/C VP/J R/C/P NSg/VB+ . R/C/P NPr/I/J/R/Dq > than two years of a term to which some other person was elected President shall # C/P NSg NPl P D/P+ NSg/VB/J+ P I/C+ I/J/R/Dq+ NSg/VB/J+ NSg/VB+ VLPt NSg/VP/J NSg/VB+ VXB > be elected to the office of the President more than once . But this article # NSg/VLXB NSg/VP/J P D NSg/VB P D+ NSg/VB+ NPr/I/J/R/Dq C/P NSg/C . NSg/C/P I/Ddem+ NSg/VB+ > shall not apply to any person holding the office of President when this article # VXB NSg/R/C VB/J P I/R/Dq+ NSg/VB+ Nᴹ/Vg/J D NSg/VB P NSg/VB+ NSg/I/C I/Ddem+ NSg/VB+ > was proposed by the Congress , and shall not prevent any person who may be # VLPt VP/J NSg/P D+ NPr/VB+ . VB/C VXB NSg/R/C VB I/R/Dq+ NSg/VB+ NPr/I+ NPr/VXB NSg/VLXB > holding the office of President , or acting as President , during the term within # Nᴹ/Vg/J D NSg/VB P NSg/VB+ . NPr/C Nᴹ/Vg/J R/C/P NSg/VB+ . VB/P D NSg/VB/J+ NSg/J/P > which this article becomes operative from holding the office of President or # I/C+ I/Ddem+ NSg/VB+ V3 NSg/J+ P Nᴹ/Vg/J D NSg/VB P NSg/VB+ NPr/C > acting as President during the remainder of such term . # Nᴹ/Vg/J R/C/P NSg/VB+ VB/P D NSg/VB/J P NSg/I+ NSg/VB/J+ . > # > SubSection 3 . # HeadingStart NSg/VB+ # . > # > In case of the removal of the President from office or of his # NPr/J/R/P NPr🅪Sg/VB P D NSg P D NSg/VB+ P NSg/VB+ NPr/C P ISg/D$+ > death or resignation , the Vice President shall become President . # NPr🅪Sg NPr/C NSg+ . D+ NSg/VB/J/P+ NSg/VB+ VXB VBPp NSg/VB+ . > # > Whenever there is a vacancy in the office of the Vice President , the President # C R+ VL3 D/P N🅪Sg+ NPr/J/R/P D NSg/VB P D+ NSg/VB/J/P+ NSg/VB+ . D+ NSg/VB+ > shall nominate a Vice President who shall take office upon confirmation by a # VXB VB/J D/P+ NSg/VB/J/P+ NSg/VB+ NPr/I+ VXB NSg/VB NSg/VB+ P N🅪Sg+ NSg/P D/P > majority vote of both Houses of Congress . # NSg+ NSg/VB P I/C/Dq NPl/V3 P NPr/VB+ . > # > Whenever the President transmits to the President pro tempore of the Senate and # C D+ NSg/VB+ V3 P D NSg/VB+ NSg/J/P ? P D NPr+ VB/C > the Speaker of the House of Representatives his written declaration that he is # D NSg P D NPr/VB P NPl+ ISg/D$+ VPp/J NSg+ NSg/I/C/Ddem+ NPr/ISg+ VL3 > unable to discharge the powers and duties of his office , and until he transmits # NSg/VB/J P N🅪Sg/VB D NPrPl/V3+ VB/C NPl P ISg/D$+ NSg/VB+ . VB/C C/P NPr/ISg+ V3 > to them a written declaration to the contrary , such powers and duties shall be # P NSg/IPl+ D/P VPp/J NSg+ P D NSg/VB/J+ . NSg/I NPrPl/V3 VB/C NPl+ VXB NSg/VLXB > discharged by the Vice President as Acting President . # VP/J NSg/P D NSg/VB/J/P+ NSg/VB+ R/C/P Nᴹ/Vg/J NSg/VB+ . > # > Whenever the Vice President and a majority of either the principal officers of # C D NSg/VB/J/P+ NSg/VB+ VB/C D/P NSg P I/C D NSg/J NPl/V3 P > the executive departments or of such other body as Congress may by law provide , # D NSg/J NPl+ NPr/C P NSg/I NSg/VB/J+ NSg/VB+ R/C/P NPr/VB+ NPr/VXB NSg/P N🅪Sg/VB+ VB . > transmit to the President pro tempore of the Senate and the Speaker of the # VB P D+ NSg/VB+ NSg/J/P ? P D NPr+ VB/C D NSg P D > House of Representatives their written declaration that the President is unable # NPr/VB P NPl+ D$+ VPp/J NSg+ NSg/I/C/Ddem D NSg/VB+ VL3 NSg/VB/J > to discharge the powers and duties of his office , the Vice President shall # P N🅪Sg/VB D NPrPl/V3+ VB/C NPl P ISg/D$+ NSg/VB+ . D NSg/VB/J/P+ NSg/VB+ VXB > immediately assume the powers and duties of the office as Acting President . # R VB D NPrPl/V3+ VB/C NPl P D NSg/VB+ R/C/P Nᴹ/Vg/J NSg/VB+ . > # > Thereafter , when the President transmits to the President pro tempore of the # NSg . NSg/I/C D+ NSg/VB+ V3 P D NSg/VB+ NSg/J/P ? P D > Senate and the Speaker of the House of Representatives his written declaration # NPr+ VB/C D NSg P D NPr/VB P NPl+ ISg/D$+ VPp/J NSg+ > that no inability exists , he shall resume the powers and duties of his office # NSg/I/C/Ddem NSg/Dq/P N🅪Sg+ V3 . NPr/ISg+ VXB NSg/VB D NPrPl/V3+ VB/C NPl P ISg/D$+ NSg/VB+ > unless the Vice President and a majority of either the principal officers of # C D NSg/VB/J/P+ NSg/VB+ VB/C D/P NSg P I/C D NSg/J NPl/V3 P > the executive department or of such other body as Congress may by law provide , # D NSg/J NSg+ NPr/C P NSg/I NSg/VB/J NSg/VB+ R/C/P NPr/VB+ NPr/VXB NSg/P N🅪Sg/VB+ VB . > transmit within four days to the President pro tempore of the Senate and the # VB NSg/J/P NSg NPl+ P D NSg/VB+ NSg/J/P ? P D NPr+ VB/C D > Speaker of the House of Representatives their written declaration that the # NSg P D NPr/VB P NPl+ D$+ VPp/J NSg+ NSg/I/C/Ddem D > President is unable to discharge the powers and duties of his office . Thereupon # NSg/VB+ VL3 NSg/VB/J P N🅪Sg/VB D NPrPl/V3+ VB/C NPl P ISg/D$+ NSg/VB+ . R > Congress shall decide the issue , assembling within forty - eight hours for that # NPr/VB+ VXB VB D NSg/VB+ . Nᴹ/Vg/J NSg/J/P NSg/J . NSg/J NPl+ R/C/P NSg/I/C/Ddem > purpose if not in session . If the Congress , within twenty - one days after # N🅪Sg/VB+ NSg/C NSg/R/C NPr/J/R/P NSg/VB+ . NSg/C D+ NPr/VB+ . NSg/J/P NSg . NSg/I/J NPl P > receipt of the latter written declaration , or , if Congress is not in session , # NSg/VB P D+ NSg/J+ VPp/J NSg+ . NPr/C . NSg/C NPr/VB+ VL3 NSg/R/C NPr/J/R/P NSg/VB+ . > within twenty - one days after Congress is required to assemble , determines by # NSg/J/P NSg . NSg/I/J NPl P NPr/VB+ VL3 VP/J P VB . V3 NSg/P > two - thirds vote of both Houses that the President is unable to discharge the # NSg . NPl/V3 NSg/VB P I/C/Dq NPl/V3+ NSg/I/C/Ddem D+ NSg/VB+ VL3 NSg/VB/J P N🅪Sg/VB D > powers and duties of his office , the Vice President shall continue to discharge # NPrPl/V3 VB/C NPl P ISg/D$+ NSg/VB+ . D+ NSg/VB/J/P+ NSg/VB+ VXB NSg/VB P N🅪Sg/VB > the same as Acting President ; otherwise , the President shall resume the powers # D I/J R/C/P Nᴹ/Vg/J NSg/VB+ . J/R . D+ NSg/VB+ VXB NSg/VB D NPrPl/V3 > and duties of his office . # VB/C NPl P ISg/D$+ NSg/VB+ . > # > SubSection 4 . # HeadingStart NSg/VB+ # . > # > The President shall , at stated Times , receive for his # D+ NSg/VB+ VXB . NSg/P VP/J NPl/V3+ . NSg/VB R/C/P ISg/D$+ > Services , a Compensation , which shall neither be encreased nor diminished # NPl/V3+ . D/P+ N🅪Sg+ . I/C+ VXB I/C NSg/VLXB ? NSg/C VP/J > during the Period for which he shall have been elected , and he shall not # VB/P D NSg/VB/J+ R/C/P I/C+ NPr/ISg+ VXB NSg/VXB NSg/VLPp NSg/VP/J . VB/C NPr/ISg+ VXB NSg/R/C > receive within that Period any other Emolument from the United States , or any # NSg/VB NSg/J/P NSg/I/C/Ddem NSg/VB/J+ I/R/Dq NSg/VB/J NSg P D VP/J NPrPl/V3+ . NPr/C I/R/Dq > of them . # P NSg/IPl+ . > # > Before he enter on the Execution of his Office , he shall take the following # C/P NPr/ISg+ NSg/VB J/P D N🅪Sg P ISg/D$+ NSg/VB+ . NPr/ISg+ VXB NSg/VB D N🅪Sg/Vg/J/P > Oath or Affirmation : - - " I do solemnly swear ( or affirm ) that I will faithfully # NSg/VB+ NPr/C NSg . . . . ISg/#r+ VXB R NSg/VB/J . NPr/C VB . NSg/I/C/Ddem ISg/#r+ NPr/VXB R > execute the Office of President of the United States , and will to the best of # VB D NSg/VB P NSg/VB P D VP/J NPrPl/V3+ . VB/C NPr/VXB P D NPr/VXB/JS P > my Ability , preserve , protect and defend the Constitution of the United # D$+ N🅪Sg+ . NSg/VB . VB VB/C NSg/VB D NPr P D VP/J > States . " # NPrPl/V3+ . . > # > SubSection 5 . # HeadingStart NSg/VB+ # . > # > The District constituting the seat of Government of the # D+ NSg/VB/J+ Nᴹ/Vg/J D NSg/VB P N🅪Sg P D > United States shall appoint in such manner as the Congress may direct : # VP/J NPrPl/V3+ VXB VB NPr/J/R/P NSg/I NSg+ R/C/P D NPr/VB+ NPr/VXB VB/J . > # > A number of electors of President and Vice President equal to the whole number # D/P N🅪Sg/VB/JC P NPl P NSg/VB VB/C NSg/VB/J/P+ NSg/VB+ NSg/VB/J P D NSg/J N🅪Sg/VB/JC > of Senators and Representatives in Congress to which the District would be # P NPl+ VB/C NPl+ NPr/J/R/P NPr/VB+ P I/C+ D NSg/VB/J+ VXB NSg/VLXB > entitled if it were a State , but in no event more than the least populous # VP/J NSg/C NPr/ISg+ NSg/VLPt D/P N🅪Sg/VB+ . NSg/C/P NPr/J/R/P NSg/Dq/P NSg/VB+ NPr/I/J/R/Dq C/P D NSg/J/Dq J > State ; they shall be in addition to those appointed by the States , but they # N🅪Sg/VB+ . IPl+ VXB NSg/VLXB NPr/J/R/P NSg+ P I/Ddem VP/J+ NSg/P D NPrPl/V3+ . NSg/C/P IPl+ > shall be considered , for the purposes of the election of President and Vice # VXB NSg/VLXB VP/J . R/C/P D NPl/V3 P D NSg P NSg/VB VB/C NSg/VB/J/P+ > President , to be electors appointed by a State ; and they shall meet in the # NSg/VB+ . P NSg/VLXB NPl VP/J NSg/P D/P N🅪Sg/VB+ . VB/C IPl+ VXB NSg/VB/J NPr/J/R/P D > District and perform such duties as provided by this article of the # NSg/VB/J+ VB/C VB NSg/I NPl+ R/C/P VP/J/C NSg/P I/Ddem NSg/VB P D > Constitution . # NPr+ . > # > Section . 2 . # HeadingStart NSg/VB+ . # . > # > The President shall be Commander in Chief of the Army and Navy # D+ NSg/VB+ VXB NSg/VLXB NSg NPr/J/R/P NSg/VB/J P D NSg VB/C N🅪Sg/J > of the United States , and of the Militia of the several States , when called # P D+ VP/J NPrPl/V3+ . VB/C P D NSg P D J/Dq NPrPl/V3+ . NSg/I/C VP/J > into the actual Service of the United States ; he may require the Opinion , in # P D NSg/J NSg/VB P D VP/J NPrPl/V3+ . NPr/ISg+ NPr/VXB NSg/VB D N🅪Sg+ . NPr/J/R/P > writing , of the principal Officer in each of the executive Departments , upon # Nᴹ/Vg/J . P D NSg/J NSg/VB+ NPr/J/R/P Dq P D NSg/J NPl+ . P > any Subject relating to the Duties of their respective Offices , and he shall # I/R/Dq NSg/VB/J+ Nᴹ/Vg/J P D NPl P D$+ J NPl/V3+ . VB/C NPr/ISg+ VXB > have Power to grant Reprieves and Pardons for Offences against the United # NSg/VXB N🅪Sg/VB/J+ P NPr/VB NPl/V3 VB/C NPl/V3 R/C/P NPl/Comm C/P D VP/J > States , except in Cases of Impeachment . # NPrPl/V3+ . VB/C/P NPr/J/R/P NPl/V3+ P N🅪Sg . > # > He shall have Power , by and with the Advice and Consent of the Senate , to make # NPr/ISg+ VXB NSg/VXB N🅪Sg/VB/J+ . NSg/P VB/C P D+ Nᴹ+ VB/C N🅪Sg/VP P D+ NPr+ . P NSg/VB > Treaties , provided two thirds of the Senators present concur ; and he shall # NPl/V3+ . VP/J/C NSg NPl/V3 P D+ NPl+ NSg/VB/J+ VB+ . VB/C NPr/ISg+ VXB > nominate , and by and with the Advice and Consent of the Senate , shall appoint # VB/J . VB/C NSg/P VB/C P D Nᴹ+ VB/C N🅪Sg/VP P D NPr+ . VXB VB > Ambassadors , other public Ministers and Consuls , Judges of the supreme Court , # NPl+ . NSg/VB/J Nᴹ/VB/J NPl/V3+ VB/C NPl . NPrPl/V3 P D NSg/VB/J N🅪Sg/VB/J+ . > and all other Officers of the United States , whose Appointments are not herein # VB/C NSg/I/J/C/Dq NSg/VB/J NPl/V3 P D VP/J NPrPl/V3+ . I+ NPl+ VLB NSg/R/C R > otherwise provided for , and which shall be established by Law : but the Congress # J/R VP/J/C R/C/P . VB/C I/C+ VXB NSg/VLXB VP/J NSg/P N🅪Sg/VB+ . NSg/C/P D NPr/VB+ > may by Law vest the Appointment of such inferior Officers , as they think # NPr/VXB NSg/P N🅪Sg/VB+ NSg/VB D NSg P NSg/I NSg/J NPl/V3+ . R/C/P IPl+ NSg/VB > proper , in the President alone , in the Courts of Law , or in the Heads of # NSg/J . NPr/J/R/P D NSg/VB+ J . NPr/J/R/P D NPl/V3 P N🅪Sg/VB+ . NPr/C NPr/J/R/P D NPl/V3 P > Departments . # NPl+ . > # > The President shall have Power to fill up all Vacancies that may happen during # D+ NSg/VB+ VXB NSg/VXB N🅪Sg/VB/J+ P NSg/VB NSg/VB/J/P NSg/I/J/C/Dq NPl NSg/I/C/Ddem+ NPr/VXB VB VB/P > the Recess of the Senate , by granting Commissions which shall expire at the End # D NSg/VB/J P D NPr+ . NSg/P Nᴹ/Vg/J+ NPl/V3+ I/C+ VXB VB NSg/P D NSg/VB > of their next Session . # P D$+ NSg/J/P NSg/VB+ . > # > No soldier shall , in time of peace be quartered in any house , without the # NSg/Dq/P+ NSg/VB/J+ VXB . NPr/J/R/P N🅪Sg/VB/J P NPr🅪Sg/VB+ NSg/VLXB VP/J NPr/J/R/P I/R/Dq+ NPr/VB+ . C/P D > consent of the owner , nor in time of war , but in a manner to be prescribed by # N🅪Sg/VP P D+ NSg+ . NSg/C NPr/J/R/P N🅪Sg/VB/J P N🅪Sg/VB+ . NSg/C/P NPr/J/R/P D/P+ NSg+ P NSg/VLXB VP/J NSg/P > law . # N🅪Sg/VB+ . > # > Section . 3 . # HeadingStart NSg/VB+ . # . > # > He shall from time to time give to the Congress Information of # NPr/ISg+ VXB P N🅪Sg/VB/J+ P N🅪Sg/VB/J NSg/VB P D NPr/VB+ Nᴹ P > the State of the Union , and recommend to their Consideration such Measures as # D N🅪Sg/VB P D+ NPr/VB/J+ . VB/C NSg/VB P D$+ N🅪Sg+ NSg/I+ NPl/V3+ R/C/P > he shall judge necessary and expedient ; he may , on extraordinary Occasions , # NPr/ISg+ VXB NSg/VB+ NSg/J VB/C NSg/J . NPr/ISg+ NPr/VXB . J/P NSg/J NPl/V3+ . > convene both Houses , or either of them , and in Case of Disagreement between # VB I/C/Dq NPl/V3+ . NPr/C I/C P NSg/IPl+ . VB/C NPr/J/R/P NPr🅪Sg/VB P N🅪Sg+ NSg/P > them , with Respect to the Time of Adjournment , he may adjourn them to such Time # NSg/IPl+ . P Nᴹ/VB+ P D N🅪Sg/VB/J+ P NSg . NPr/ISg+ NPr/VXB VB NSg/IPl+ P NSg/I N🅪Sg/VB/J+ > as he shall think proper ; he shall receive Ambassadors and other public # R/C/P NPr/ISg+ VXB NSg/VB NSg/J . NPr/ISg+ VXB NSg/VB NPl VB/C NSg/VB/J Nᴹ/VB/J > Ministers ; he shall take Care that the Laws be faithfully executed , and shall # NPl/V3+ . NPr/ISg+ VXB NSg/VB N🅪Sg/VB+ NSg/I/C/Ddem D NPl/V3+ NSg/VLXB R VP/J . VB/C VXB > Commission all the Officers of the United States . # N🅪Sg/VB NSg/I/J/C/Dq D NPl/V3 P D VP/J NPrPl/V3+ . > # > Section . 4 . # HeadingStart NSg/VB+ . # . > # > The President , Vice President and all civil Officers of the # D+ NSg/VB+ . NSg/VB/J/P+ NSg/VB+ VB/C NSg/I/J/C/Dq J NPl/V3 P D+ > United States , shall be removed from Office on Impeachment for , and Conviction # VP/J NPrPl/V3+ . VXB NSg/VLXB VP/J P NSg/VB+ J/P N🅪Sg R/C/P . VB/C N🅪Sg+ > of , Treason , Bribery , or other high Crimes and Misdemeanors . # P . NSg . Nᴹ . NPr/C NSg/VB/J NSg/VB/J/R NPl/V3+ VB/C NPl . > # > Article . III . # HeadingStart NSg/VB+ . #r . > # > Section . 1 . # HeadingStart NSg/VB+ . # . > # > The judicial Power of the United States , shall be vested in # D NSg/J N🅪Sg/VB/J P D+ VP/J NPrPl/V3+ . VXB NSg/VLXB VP/J NPr/J/R/P > one supreme Court , and in such inferior Courts as the Congress may from time to # NSg/I/J NSg/VB/J N🅪Sg/VB/J+ . VB/C NPr/J/R/P NSg/I NSg/J+ NPl/V3+ R/C/P D+ NPr/VB+ NPr/VXB P N🅪Sg/VB/J+ P > time ordain and establish . The Judges , both of the supreme and inferior Courts , # N🅪Sg/VB/J VB VB/C VB . D+ NPrPl/V3+ . I/C/Dq P D NSg/VB/J VB/C NSg/J+ NPl/V3+ . > shall hold their Offices during good Behaviour , and shall , at stated Times , # VXB NSg/VB/J D$+ NPl/V3+ VB/P NPr/VB/J+ N🅪Sg/Comm+ . VB/C VXB . NSg/P VP/J NPl/V3+ . > receive for their Services , a Compensation , which shall not be diminished # NSg/VB R/C/P D$+ NPl/V3+ . D/P+ N🅪Sg+ . I/C+ VXB NSg/R/C NSg/VLXB VP/J > during their Continuance in Office . # VB/P D$+ NSg NPr/J/R/P NSg/VB+ . > # > Section . 2 . # HeadingStart NSg/VB+ . # . > # > The judicial Power shall extend to all Cases , in Law and # D+ NSg/J+ N🅪Sg/VB/J+ VXB NSg/VB P NSg/I/J/C/Dq+ NPl/V3+ . NPr/J/R/P N🅪Sg/VB VB/C > Equity , arising under this Constitution , the Laws of the United States , and # NSg+ . Nᴹ/Vg/J NSg/J/P I/Ddem+ NPr+ . D NPl/V3 P D+ VP/J NPrPl/V3+ . VB/C > Treaties made , or which shall be made , under their Authority ; — to all Cases # NPl/V3+ VP . NPr/C I/C+ VXB NSg/VLXB VP . NSg/J/P D$+ N🅪Sg+ . . P NSg/I/J/C/Dq+ NPl/V3+ > affecting Ambassadors , other public Ministers and Consuls ; — to all Cases of # Nᴹ/Vg/J NPl+ . NSg/VB/J+ Nᴹ/VB/J+ NPl/V3+ VB/C NPl . . P NSg/I/J/C/Dq NPl/V3 P > admiralty and maritime Jurisdiction ; — to Controversies to which the United # NPr VB/C J N🅪Sg+ . . P NPl P I/C+ D VP/J > States shall be a Party ; — to Controversies between two or more States ; — between # NPrPl/V3+ VXB NSg/VLXB D/P NSg/VB/J+ . . P NPl NSg/P NSg NPr/C NPr/I/J/R/Dq NPrPl/V3+ . . NSg/P > Citizens of different States , — between Citizens of the same State claiming # NPl P NSg/J NPrPl/V3+ . . NSg/P NPl P D I/J N🅪Sg/VB+ Nᴹ/Vg/J > Lands under Grants of different States . # NPl/V3+ NSg/J/P NPl/V3 P NSg/J NPrPl/V3+ . > # > In all Cases affecting Ambassadors , other public Ministers and Consuls , and # NPr/J/R/P NSg/I/J/C/Dq+ NPl/V3+ Nᴹ/Vg/J NPl+ . NSg/VB/J+ Nᴹ/VB/J+ NPl/V3+ VB/C NPl . VB/C > those in which a State shall be Party , the supreme Court shall have original # I/Ddem NPr/J/R/P I/C+ D/P N🅪Sg/VB+ VXB NSg/VLXB NSg/VB/J+ . D NSg/VB/J N🅪Sg/VB/J+ VXB NSg/VXB NSg/J > Jurisdiction . In all the other Cases before mentioned , the supreme Court shall # N🅪Sg+ . NPr/J/R/P NSg/I/J/C/Dq D+ NSg/VB/J+ NPl/V3+ C/P VP/J . D+ NSg/VB/J+ N🅪Sg/VB/J+ VXB > have appellate Jurisdiction , both as to Law and Fact , with such Exceptions , and # NSg/VXB J N🅪Sg+ . I/C/Dq R/C/P P N🅪Sg/VB VB/C NSg+ . P NSg/I NPl+ . VB/C > under such Regulations as the Congress shall make . # NSg/J/P NSg/I NPl+ R/C/P D NPr/VB+ VXB NSg/VB . > # > The Trial of all Crimes , except in Cases of Impeachment , shall be by Jury ; and # D NSg/VB/J P NSg/I/J/C/Dq+ NPl/V3+ . VB/C/P NPr/J/R/P NPl/V3+ P N🅪Sg . VXB NSg/VLXB NSg/P NSg/VB/J+ . VB/C > such Trial shall be held in the State where the said Crimes shall have been # NSg/I NSg/VB/J+ VXB NSg/VLXB VP NPr/J/R/P D N🅪Sg/VB+ NSg/R/C D VP/J NPl/V3+ VXB NSg/VXB NSg/VLPp > committed ; but when not committed within any State , the Trial shall be at such # VP/J . NSg/C/P NSg/I/C NSg/R/C VP/J NSg/J/P I/R/Dq N🅪Sg/VB+ . D NSg/VB/J+ VXB NSg/VLXB NSg/P NSg/I > Place or Places as the Congress may by Law have directed . # N🅪Sg/VB NPr/C NPl/V3+ R/C/P D NPr/VB+ NPr/VXB NSg/P N🅪Sg/VB+ NSg/VXB VP/J . > # > Section . 3 . # HeadingStart NSg/VB+ . # . > # > Treason against the United States , shall consist only in # NSg C/P D VP/J NPrPl/V3+ . VXB NSg/VB J/R/C NPr/J/R/P > levying War against them , or in adhering to their Enemies , giving them Aid and # Nᴹ/Vg/J N🅪Sg/VB+ C/P NSg/IPl+ . NPr/C NPr/J/R/P Nᴹ/Vg/J P D$+ NPl/V3+ . Nᴹ/Vg/J NSg/IPl+ N🅪Sg/VB VB/C > Comfort . No Person shall be convicted of Treason unless on the Testimony of two # N🅪Sg/VB+ . NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB VP/J P NSg C J/P D NSg P NSg > Witnesses to the same overt Act , or on Confession in open Court . # NPl/V3+ P D I/J NSg/J NPr/VB+ . NPr/C J/P N🅪Sg+ NPr/J/R/P NSg/VB/J N🅪Sg/VB/J+ . > # > The Congress shall have Power to declare the Punishment of Treason , but no # D+ NPr/VB+ VXB NSg/VXB N🅪Sg/VB/J+ P VB D N🅪Sg P NSg . NSg/C/P NSg/Dq/P > Attainder of Treason shall work Corruption of Blood , or Forfeiture except # NSg P NSg VXB N🅪Sg/VB+ N🅪Sg P Nᴹ/VB+ . NPr/C NSg VB/C/P > during the Life of the Person attainted . # VB/P D N🅪Sg/VB P D NSg/VB+ VP/J . > # > Section . 4 . # HeadingStart NSg/VB+ . # . > # > The right of the people to be secure in their persons , houses , # D NPr/VB/J P D+ NPl/VB+ P NSg/VLXB VB/J NPr/J/R/P D$+ NPl/V3+ . NPl/V3+ . > papers , and effects , against unreasonable searches and seizures , shall not be # NPl/V3+ . VB/C NPl/V3+ . C/P J NPl/V3 VB/C NPl/V3+ . VXB NSg/R/C NSg/VLXB > violated , and no warrants shall issue , but upon probable cause , supported by # VP/J . VB/C NSg/Dq/P NPl/V3+ VXB NSg/VB+ . NSg/C/P P NSg/J N🅪Sg/VB/C . VP/J NSg/P > oath or affirmation , and particularly describing the place to be searched , and # NSg/VB+ NPr/C NSg . VB/C R Nᴹ/Vg/J D N🅪Sg/VB+ P NSg/VLXB VP/J . VB/C > the persons or things to be seized . # D NPl/V3+ NPr/C NPl+ P NSg/VLXB VP/J . > # > No person shall be held to answer for a capital , or otherwise infamous crime , # NSg/Dq/P+ NSg/VB+ VXB NSg/VLXB VP P NSg/VB R/C/P D/P+ N🅪Sg/J+ . NPr/C J/R VB/J+ N🅪Sg/VB+ . > unless on a presentment or indictment of a grand jury , except in cases arising # C J/P D/P NSg NPr/C NSg P D/P NSg/J NSg/VB/J+ . VB/C/P NPr/J/R/P NPl/V3+ Nᴹ/Vg/J > in the land or naval forces , or in the militia , when in actual service in time # NPr/J/R/P D NPr🅪Sg/VB NPr/C J NPl/V3+ . NPr/C NPr/J/R/P D NSg . NSg/I/C NPr/J/R/P NSg/J NSg/VB+ NPr/J/R/P N🅪Sg/VB/J > of war or public danger ; nor shall any person be subject for the same offense # P N🅪Sg/VB NPr/C Nᴹ/VB/J N🅪Sg/VB/JC+ . NSg/C VXB I/R/Dq NSg/VB+ NSg/VLXB NSg/VB/J R/C/P D I/J N🅪Sg+ > to be twice put in jeopardy of life or limb ; nor shall be compelled in any # P NSg/VLXB R NSg/VBP NPr/J/R/P NSg/VB P N🅪Sg/VB NPr/C NSg/VB+ . NSg/C VXB NSg/VLXB VP/J NPr/J/R/P I/R/Dq > criminal case to be a witness against himself , nor be deprived of life , # NSg/J NPr🅪Sg/VB+ P NSg/VLXB D/P NSg/VB+ C/P ISg+ . NSg/C NSg/VLXB VP/J P N🅪Sg/VB+ . > liberty , or property , without due process of law ; nor shall private property be # NSg+ . NPr/C NSg/VB+ . C/P NSg/J NSg/VB P N🅪Sg/VB+ . NSg/C VXB NSg/VB/J NSg/VB+ NSg/VLXB > taken for public use , without just compensation . # VPp/J R/C/P Nᴹ/VB/J N🅪Sg/VB+ . C/P J/R N🅪Sg+ . > # > In all criminal prosecutions , the accused shall enjoy the right to a speedy and # NPr/J/R/P NSg/I/J/C/Dq NSg/J NPl . D+ VP/J+ VXB VB D NPr/VB/J P D/P VB/J VB/C > public trial , by an impartial jury of the state and district wherein the crime # Nᴹ/VB/J NSg/VB/J+ . NSg/P D/P J NSg/VB/J P D N🅪Sg/VB+ VB/C NSg/VB/J+ C D N🅪Sg/VB+ > shall have been committed , which district shall have been previously # VXB NSg/VXB NSg/VLPp VP/J . I/C+ NSg/VB/J+ VXB NSg/VXB NSg/VLPp R > ascertained by law , and to be informed of the nature and cause of the # VP/J NSg/P N🅪Sg/VB+ . VB/C P NSg/VLXB VP/J P D N🅪Sg/VB+ VB/C N🅪Sg/VB/C P D > accusation ; to be confronted with the witnesses against him ; to have compulsory # N🅪Sg . P NSg/VLXB VP/J P D NPl/V3+ C/P ISg+ . P NSg/VXB NSg/J > process for obtaining witnesses in his favor , and to have the assistance of # NSg/VB+ R/C/P Nᴹ/Vg/J NPl/V3+ NPr/J/R/P ISg/D$+ N🅪Sg/VB/Am+ . VB/C P NSg/VXB D Nᴹ P > counsel for his defense . # NSg/VB+ R/C/P ISg/D$+ N🅪Sg/VB/Am+ . > # > In suits at common law , where the value in controversy shall exceed twenty # NPr/J/R/P NPl/V3 NSg/P NSg/VB/J+ N🅪Sg/VB+ . NSg/R/C D N🅪Sg/VB+ NPr/J/R/P N🅪Sg+ VXB VB NSg+ > dollars , the right of trial by jury shall be preserved , and no fact tried by a # NPl+ . D NPr/VB/J P NSg/VB/J+ NSg/P NSg/VB/J+ VXB NSg/VLXB VP/J . VB/C NSg/Dq/P+ NSg+ VP/J NSg/P D/P+ > jury , shall be otherwise reexamined in any court of the United States , than # NSg/VB/J+ . VXB NSg/VLXB J/R VP/J NPr/J/R/P I/R/Dq N🅪Sg/VB/J P D VP/J NPrPl/V3+ . C/P > according to the rules of the common law . # Nᴹ/Vg/J P D NPl/V3 P D NSg/VB/J N🅪Sg/VB+ . > # > Excessive bail shall not be required , nor excessive fines imposed , nor cruel # J+ NSg/VB+ VXB NSg/R/C NSg/VLXB VP/J . NSg/C J NPl/V3 VP/J . NSg/C NSg/VB/J > and unusual punishments inflicted . # VB/C NSg/J NPl+ VP/J . > # > Article . IV . # HeadingStart NSg/VB+ . NSg/J/#r+ . > # > Section . 1 . # HeadingStart NSg/VB+ . # . > # > Full Faith and Credit shall be given in each State to the # NSg/VB/J NPr🅪Sg VB/C NSg/VB+ VXB NSg/VLXB NSg/VPp/J/P NPr/J/R/P Dq N🅪Sg/VB+ P D > public Acts , Records , and judicial Proceedings of every other State . And the # Nᴹ/VB/J NPrPl/V3 . NPl/V3+ . VB/C NSg/J NPl P Dq+ NSg/VB/J+ N🅪Sg/VB+ . VB/C D+ > Congress may by general Laws prescribe the Manner in which such Acts , Records # NPr/VB+ NPr/VXB NSg/P NSg/VB/J NPl/V3+ VB D+ NSg+ NPr/J/R/P I/C+ NSg/I NPrPl/V3+ . NPl/V3 > and Proceedings shall be proved , and the Effect thereof . # VB/C NPl+ VXB NSg/VLXB VP/J . VB/C D+ NSg/VB+ R . > # > Section . 2 . # HeadingStart NSg/VB+ . # . > # > All persons born or naturalized in the United States , and # NSg/I/J/C/Dq+ NPl/V3+ NPr/VB/J NPr/C VP/J NPr/J/R/P D VP/J NPrPl/V3+ . VB/C > subject to the jurisdiction thereof , are citizens of the United States and of # NSg/VB/J+ P D N🅪Sg+ R . VLB NPl P D VP/J NPrPl/V3+ VB/C P > the State wherein they reside . No State shall make or enforce any law which # D N🅪Sg/VB+ C IPl+ NSg/VB/J . NSg/Dq/P+ N🅪Sg/VB+ VXB NSg/VB NPr/C VB I/R/Dq+ N🅪Sg/VB+ I/C+ > shall abridge the privileges or immunities of citizens of the United States ; # VXB VB D NPl/V3+ NPr/C NPl P NPl P D VP/J NPrPl/V3+ . > nor shall any State deprive any person of life , liberty , or property , without # NSg/C VXB I/R/Dq N🅪Sg/VB+ VB I/R/Dq NSg/VB P N🅪Sg/VB+ . NSg+ . NPr/C NSg/VB+ . C/P > due process of law ; nor deny to any person within its jurisdiction the equal # NSg/J NSg/VB P N🅪Sg/VB+ . NSg/C VB P I/R/Dq NSg/VB+ NSg/J/P ISg/D$+ N🅪Sg D NSg/VB/J > protection of the laws . # N🅪Sg P D NPl/V3+ . > # > The right of citizens of the United States , who are eighteen years of age or # D NPr/VB/J P NPl P D+ VP/J NPrPl/V3+ . NPr/I+ VLB NSg NPl P N🅪Sg/VB+ NPr/C > older , to vote shall not be denied or abridged by the United States or by any # JC . P NSg/VB VXB NSg/R/C NSg/VLXB VP/J NPr/C VP/J NSg/P D VP/J NPrPl/V3+ NPr/C NSg/P I/R/Dq > State on account of age , sex , race , color , or previous condition of servitude . # N🅪Sg/VB+ J/P NSg/VB P N🅪Sg/VB+ . NSg/VB+ . N🅪Sg/VB+ . N🅪Sg/VB/J/Am+ . NPr/C NSg/J N🅪Sg/VB+ P NSg . > # > A Person charged in any State with Treason , Felony , or other Crime , who shall # D/P+ NSg/VB+ VP/J NPr/J/R/P I/R/Dq+ N🅪Sg/VB+ P NSg . NSg . NPr/C NSg/VB/J N🅪Sg/VB+ . NPr/I+ VXB > flee from Justice , and be found in another State , shall on Demand of the # VB P NPr🅪Sg+ . VB/C NSg/VLXB NSg/VP NPr/J/R/P I/D N🅪Sg/VB+ . VXB J/P N🅪Sg/VB P D > executive Authority of the State from which he fled , be delivered up , to be # NSg/J N🅪Sg P D N🅪Sg/VB+ P I/C+ NPr/ISg+ J . NSg/VLXB VP/J NSg/VB/J/P . P NSg/VLXB > removed to the State having Jurisdiction of the Crime . # VP/J P D N🅪Sg/VB+ Nᴹ/Vg/J N🅪Sg P D N🅪Sg/VB+ . > # > Neither slavery nor involuntary servitude , except as a punishment for crime # I/C NSg/J+ NSg/C J NSg . VB/C/P R/C/P D/P N🅪Sg R/C/P N🅪Sg/VB+ > whereof the party shall have been duly convicted , shall exist within the United # C D NSg/VB/J+ VXB NSg/VXB NSg/VLPp R VP/J . VXB VB NSg/J/P D VP/J > States , or any place subject to their jurisdiction . No Person held to Service # NPrPl/V3+ . NPr/C I/R/Dq N🅪Sg/VB+ NSg/VB/J+ P D$+ N🅪Sg+ . NSg/Dq/P+ NSg/VB+ VP P NSg/VB > or Labour in one State , under the Laws thereof , escaping into another , shall , # NPr/C NPr🅪Sg/VB/Comm+ NPr/J/R/P NSg/I/J+ N🅪Sg/VB+ . NSg/J/P D+ NPl/V3+ R . Nᴹ/Vg/J P I/D . VXB . > in Consequence of any Law or Regulation therein , be discharged from such # NPr/J/R/P NSg/VB P I/R/Dq N🅪Sg/VB NPr/C N🅪Sg/J+ R . NSg/VLXB VP/J P NSg/I > Service or Labour , but shall be delivered up on Claim of the Party to whom such # NSg/VB NPr/C NPr🅪Sg/VB/Comm+ . NSg/C/P VXB NSg/VLXB VP/J NSg/VB/J/P J/P NSg/VB P D NSg/VB/J+ P I+ NSg/I > Service or Labour may be due . # NSg/VB NPr/C NPr🅪Sg/VB/Comm+ NPr/VXB NSg/VLXB NSg/J . > # > Section . 3 . # HeadingStart NSg/VB+ . # . > # > New States may be admitted by the Congress into this Union ; but # NSg/J+ NPrPl/V3+ NPr/VXB NSg/VLXB VP/J NSg/P D+ NPr/VB+ P I/Ddem+ NPr/VB/J+ . NSg/C/P > no new State shall be formed or erected within the Jurisdiction of any other # NSg/Dq/P+ NSg/J+ N🅪Sg/VB+ VXB NSg/VLXB VP/J NPr/C VP/J NSg/J/P D N🅪Sg P I/R/Dq+ NSg/VB/J+ > State ; nor any State be formed by the Junction of two or more States , or Parts # N🅪Sg/VB+ . NSg/C I/R/Dq+ N🅪Sg/VB+ NSg/VLXB VP/J NSg/P D NSg/VB P NSg NPr/C NPr/I/J/R/Dq NPrPl/V3+ . NPr/C NPl/V3 > of States , without the Consent of the Legislatures of the States concerned as # P NPrPl/V3+ . C/P D N🅪Sg/VP P D NPl P D NPrPl/V3+ VP/J R/C/P > well as of the Congress . # NSg/VB/J/R R/C/P P D NPr/VB+ . > # > The Congress shall have Power to dispose of and make all needful Rules and # D+ NPr/VB+ VXB NSg/VXB N🅪Sg/VB/J+ P NSg/VB P VB/C NSg/VB NSg/I/J/C/Dq NSg/J NPl/V3 VB/C > Regulations respecting the Territory or other Property belonging to the United # NPl+ Nᴹ/Vg/J D N🅪Sg+ NPr/C NSg/VB/J NSg/VB+ N🅪Sg/Vg/J P D VP/J > States ; and nothing in this Constitution shall be so construed as to Prejudice # NPrPl/V3+ . VB/C NSg/I/J+ NPr/J/R/P I/Ddem NPr+ VXB NSg/VLXB NSg/I/J/R/C VP/J R/C/P P NSg/VB/J+ > any Claims of the United States , or of any particular State . # I/R/Dq NPl/V3 P D VP/J NPrPl/V3+ . NPr/C P I/R/Dq NSg/J N🅪Sg/VB+ . > # > Section . 4 . # HeadingStart NSg/VB+ . # . > # > The United States shall guarantee to every State in this Union # D+ VP/J NPrPl/V3+ VXB NSg/VB P Dq N🅪Sg/VB+ NPr/J/R/P I/Ddem+ NPr/VB/J+ > a Republican Form of Government , and shall protect each of them against # D/P NSg/J N🅪Sg/VB P N🅪Sg+ . VB/C VXB VB Dq P NSg/IPl+ C/P > Invasion ; and on Application of the Legislature , or of the Executive ( when the # NSg+ . VB/C J/P NSg P D+ NSg+ . NPr/C P D NSg/J . NSg/I/C D+ > Legislature cannot be convened ) against domestic Violence . # NSg+ NSg/VXB NSg/VLXB VP/J . C/P NSg/J Nᴹ/VB+ . > # > Section . 5 . # HeadingStart NSg/VB+ . # . > # > The validity of the public debt of the United States , # D NSg P D Nᴹ/VB/J N🅪Sg P D+ VP/J NPrPl/V3+ . > authorized by law , including debts incurred for payment of pensions and # VP/J NSg/P N🅪Sg/VB+ . Nᴹ/Vg/J NPl+ VP R/C/P N🅪Sg P NPl/V3 VB/C > bounties for services in suppressing insurrection or rebellion , shall not be # NPl/V3 R/C/P NPl/V3+ NPr/J/R/P Nᴹ/Vg/J N🅪Sg NPr/C N🅪Sg+ . VXB NSg/R/C NSg/VLXB > questioned . But neither the United States nor any State shall assume or pay any # VP/J . NSg/C/P I/C D VP/J NPrPl/V3+ NSg/C I/R/Dq+ N🅪Sg/VB+ VXB VB NPr/C NSg/VB/J I/R/Dq > debt or obligation incurred in aid of insurrection or rebellion against the # N🅪Sg NPr/C N🅪Sg+ VP NPr/J/R/P N🅪Sg/VB P N🅪Sg NPr/C N🅪Sg+ C/P D > United States , or any claim for the loss or emancipation of any slave ; but all # VP/J NPrPl/V3+ . NPr/C I/R/Dq NSg/VB+ R/C/P D N🅪Sg/VB+ NPr/C NSg P I/R/Dq NSg/VB+ . NSg/C/P NSg/I/J/C/Dq > such debts , obligations and claims shall be held illegal and void . # NSg/I NPl+ . NPl VB/C NPl/V3+ VXB NSg/VLXB VP NSg/J VB/C NSg/VB/J+ . > # > Article . V. # HeadingStart NSg/VB+ . ? > # > The Congress , whenever two thirds of both Houses shall deem it necessary , shall # D+ NPr/VB+ . C NSg NPl/V3 P I/C/Dq NPl/V3+ VXB NSg/VB NPr/ISg+ NSg/J . VXB > propose Amendments to this Constitution , or , on the Application of the # NSg/VB NPl+ P I/Ddem+ NPr+ . NPr/C . J/P D NSg P D > Legislatures of two thirds of the several States , shall call a Convention for # NPl P NSg NPl/V3 P D J/Dq NPrPl/V3+ . VXB NSg/VB D/P N🅪Sg+ R/C/P > proposing Amendments , which , in either Case , shall be valid to all Intents and # Nᴹ/Vg/J NPl+ . I/C+ . NPr/J/R/P I/C NPr🅪Sg/VB+ . VXB NSg/VLXB J P NSg/I/J/C/Dq NPl VB/C > Purposes , as Part of this Constitution , when ratified by the Legislatures of # NPl/V3+ . R/C/P NSg/VB/J P I/Ddem NPr+ . NSg/I/C VP/J NSg/P D NPl P > three fourths of the several States , or by Conventions in three fourths # NSg NSg P D J/Dq NPrPl/V3+ . NPr/C NSg/P NPl+ NPr/J/R/P NSg NSg > thereof , as the one or the other Mode of Ratification may be proposed by the # R . R/C/P D NSg/I/J+ NPr/C D NSg/VB/J NSg P NSg+ NPr/VXB NSg/VLXB VP/J NSg/P D > Congress ; Provided that no Amendment which may be made prior to the Year One # NPr/VB+ . VP/J/C NSg/I/C/Ddem NSg/Dq/P NSg+ I/C+ NPr/VXB NSg/VLXB VP NSg/J P D NSg+ NSg/I/J+ > thousand eight hundred and eight shall in any Manner affect the first and # NSg NSg/J NSg VB/C NSg/J VXB+ NPr/J/R/P I/R/Dq NSg+ NSg/VB D NSg/J VB/C > fourth Clauses in the Ninth Section of the first Article ; and that no State , # NPr/VB/J NPl/V3+ NPr/J/R/P D NSg/VB/J NSg/VB P D NSg/J NSg/VB+ . VB/C NSg/I/C/Ddem NSg/Dq/P N🅪Sg/VB+ . > without its Consent , shall be deprived of its equal Suffrage in the Senate . # C/P ISg/D$+ N🅪Sg/VP . VXB NSg/VLXB VP/J P ISg/D$+ NSg/VB/J NSg+ NPr/J/R/P D NPr+ . > # > Article . VI . # HeadingStart NSg/VB+ . NPr/#r . > # > All Debts contracted and Engagements entered into , before the Adoption of this # NSg/I/J/C/Dq+ NPl+ VP/J VB/C NPl VP/J P . C/P D N🅪Sg P I/Ddem > Constitution , shall be as valid against the United States under this # NPr+ . VXB NSg/VLXB R/C/P J C/P D VP/J NPrPl/V3+ NSg/J/P I/Ddem > Constitution , as under the Confederation . # NPr+ . R/C/P NSg/J/P D NSg/J . > # > This Constitution , and the Laws of the United States which shall be made in # I/Ddem+ NPr+ . VB/C D NPl/V3 P D+ VP/J NPrPl/V3+ I/C+ VXB NSg/VLXB VP NPr/J/R/P > Pursuance thereof ; and all Treaties made , or which shall be made , under the # NSg R . VB/C NSg/I/J/C/Dq NPl/V3+ VP . NPr/C I/C+ VXB NSg/VLXB VP . NSg/J/P D > Authority of the United States , shall be the supreme Law of the Land ; and the # N🅪Sg P D VP/J NPrPl/V3+ . VXB NSg/VLXB D NSg/VB/J N🅪Sg/VB P D NPr🅪Sg/VB+ . VB/C D > Judges in every State shall be bound thereby , any Thing in the Constitution or # NPrPl/V3+ NPr/J/R/P Dq N🅪Sg/VB+ VXB NSg/VLXB NSg/VP/J R . I/R/Dq NSg+ NPr/J/R/P D NPr+ NPr/C > Laws of any State to the Contrary notwithstanding . # NPl/V3 P I/R/Dq N🅪Sg/VB+ P D NSg/VB/J+ C/P . > # > The Senators and Representatives before mentioned , and the Members of the # D NPl VB/C NPl+ C/P VP/J . VB/C D NPl/V3 P D+ > several State Legislatures , and all executive and judicial Officers , both of # J/Dq+ N🅪Sg/VB+ NPl . VB/C NSg/I/J/C/Dq NSg/J VB/C NSg/J NPl/V3+ . I/C/Dq P > the United States and of the several States , shall be bound by Oath or # D VP/J NPrPl/V3+ VB/C P D J/Dq NPrPl/V3+ . VXB NSg/VLXB NSg/VP/J NSg/P NSg/VB+ NPr/C > Affirmation , to support this Constitution ; but no religious Test shall ever be # NSg . P N🅪Sg/VB I/Ddem NPr+ . NSg/C/P NSg/Dq/P NSg/J NSg/VB+ VXB J/R NSg/VLXB > required as a Qualification to any Office or public Trust under the United # VP/J R/C/P D/P N🅪Sg+ P I/R/Dq NSg/VB+ NPr/C Nᴹ/VB/J N🅪Sg/VB/J NSg/J/P D VP/J > States . # NPrPl/V3+ . > # > A well regulated militia , being necessary to the security of a free state , the # D/P NSg/VB/J/R VP/J NSg . N🅪Sg/VLg/J/C NSg/J P D Nᴹ P D/P NSg/VB/J N🅪Sg/VB+ . D > right of the people to keep and bear arms , shall not be infringed . # NPr/VB/J P D NPl/VB+ P NSg/VB VB/C NSg/VB/J+ NPl/V3+ . VXB NSg/R/C NSg/VLXB VP/J . > # > Section . 1 . # HeadingStart NSg/VB+ . # . > # > The enumeration in the Constitution , of certain rights , shall # D N🅪Sg NPr/J/R/P D NPr+ . P I/J NPl/V3+ . VXB > not be construed to deny or disparage others retained by the people . # NSg/R/C NSg/VLXB VP/J P VB NPr/C NSg/VB NPl/V3+ VP/J NSg/P D NPl/VB+ . > # > The powers not delegated to the United States by the Constitution , nor # D+ NPrPl/V3+ NSg/R/C VP/J P D VP/J NPrPl/V3+ NSg/P D NPr+ . NSg/C > prohibited by it to the states , are reserved to the states respectively , or to # VP/J NSg/P NPr/ISg+ P D NPrPl/V3+ . VLB VP/J P D NPrPl/V3+ R . NPr/C P > the people . # D NPl/VB+ . > # > Article . VII . # HeadingStart NSg/VB+ . NSg/#r . > # > The Ratification of the Conventions of nine States , shall be sufficient for the # D NSg P D NPl P NSg+ NPrPl/V3+ . VXB NSg/VLXB J R/C/P D > Establishment of this Constitution between the States so ratifying the Same . # NSg P I/Ddem NPr NSg/P D+ NPrPl/V3+ NSg/I/J/R/C Nᴹ/Vg/J D I/J . > # > The Word " the " , being interlined between the seventh and eight Lines of the # D+ NSg/VB+ . D . . N🅪Sg/VLg/J/C VP/J NSg/P D NSg/J VB/C NSg/J NPl/V3 P D > first Page , The Word " Thirty " being partly written on an Erazure in the # NSg/J NPr/VB+ . D NSg/VB+ . NSg . N🅪Sg/VLg/J/C R VPp/J J/P D/P ? NPr/J/R/P D > fifteenth Line of the first Page . The Words " is tried " being interlined between # NSg/J+ NSg/VB P D NSg/J NPr/VB+ . D+ NPl/V3+ . VL3 VP/J . N🅪Sg/VLg/J/C VP/J NSg/P > the thirty second and thirty third Lines of the first Page and the Word " the " # D NSg NSg/VB/J VB/C NSg NSg/VB/J NPl/V3 P D NSg/J NPr/VB VB/C D NSg/VB+ . D . > being interlined between the forty third and forty fourth Lines of the second # N🅪Sg/VLg/J/C VP/J NSg/P D NSg/J NSg/VB/J VB/C NSg/J NPr/VB/J NPl/V3 P D NSg/VB/J > Page . # NPr/VB+ . > # > done in Convention by the Unanimous Consent of the States present the # NSg/VPp/J NPr/J/R/P N🅪Sg+ NSg/P D J N🅪Sg/VP P D+ NPrPl/V3+ NSg/VB/J D > Seventeenth Day of September in the Year of our Lord one thousand seven hundred # NSg/J NPr🅪Sg P NPr+ NPr/J/R/P D NSg P D$+ NPr/VB/J+ NSg/I/J NSg NSg NSg > and Eighty seven and of the Independence of the United States of America the # VB/C NSg NSg VB/C P D NPrᴹ P D VP/J NPrPl/V3 P NPr+ D > Twelfth In witness whereof We have hereunto subscribed our Names , # NSg/J NPr/J/R/P NSg/VB C IPl+ NSg/VXB R VP/J D$+ NPl/V3+ . > # > Article . VIII . # HeadingStart NSg/VB+ . #r . > # > Section 1 . # HeadingStart NSg/VB+ # . > # > The transportation or importation into any State , Territory , or # D+ Nᴹ+ NPr/C N🅪Sg P I/R/Dq N🅪Sg/VB+ . N🅪Sg+ . NPr/C > possession of the United States for delivery or use therein of intoxicating # N🅪Sg/VB P D VP/J NPrPl/V3+ R/C/P NSg/VB/J+ NPr/C N🅪Sg/VB R P Nᴹ/Vg/J > liquors , in violation of the laws thereof , is hereby prohibited . # NPl/V3 . NPr/J/R/P NSg P D NPl/V3+ R . VL3 R VP/J . ================================================ FILE: harper-core/tests/text/tagged/The Great Gatsby.md ================================================ > The Great Gatsby # HeadingStart D NSg/J NPr > # > BY F. SCOTT FITZGERALD # NSg/P ? NPr+ NPr > # > CHAPTER I # HeadingStart NSg/VB+ ISg/#r+ > # > In my younger and more vulnerable years my father gave me some advice that I’ve # NPr/J/R/P D$+ NSg/JC VB/C NPr/I/J/R/Dq J+ NPl+ D$+ NPr/VB+ VPt NPr/ISg+ I/J/R/Dq+ Nᴹ+ NSg/I/C/Ddem+ K > been turning over in my mind ever since . # NSg/VLPp Nᴹ/Vg/J NSg/J/P NPr/J/R/P D$+ NSg/VB+ J/R C/P . > # > “ Whenever you feel like criticising any one , ” he told me , “ just remember that # . C ISgPl+ NSg/I/VB NSg/VB/J/C/P Nᴹ/Vg/J/Au/Br I/R/Dq+ NSg/I/J+ . . NPr/ISg+ VP NPr/ISg+ . . J/R NSg/VB NSg/I/C/Ddem > all the people in this world haven’t had the advantages that you’ve had . ” # NSg/I/J/C/Dq D NPl/VB NPr/J/R/P I/Ddem+ NSg/VB+ VXB VP D+ NPl/V3+ NSg/I/C/Ddem+ K VP . . > # > He didn’t say any more , but we’ve always been unusually communicative in a # NPr/ISg+ VXPt NSg/VB I/R/Dq NPr/I/J/R/Dq . NSg/C/P K R NSg/VLPp R J NPr/J/R/P D/P > reserved way , and I understood that he meant a great deal more than that . In # VP/J NSg/J+ . VB/C ISg/#r+ VP/J NSg/I/C/Ddem NPr/ISg+ VP D/P NSg/J NSg/VB/J+ NPr/I/J/R/Dq C/P NSg/I/C/Ddem+ . NPr/J/R/P > consequence , I’m inclined to reserve all judgments , a habit that has opened up # NSg/VB+ . K VP/J P NSg/VB NSg/I/J/C/Dq NPl+ . D/P NSg/VB+ NSg/I/C/Ddem+ V3 VP/J NSg/VB/J/P > many curious natures to me and also made me the victim of not a few veteran # NSg/I/J/Dq J NPl/V3 P NPr/ISg+ VB/C R/C VP NPr/ISg+ D NSg/VB+ P NSg/R/C D/P NSg/I/Dq NSg/J > bores . The abnormal mind is quick to detect and attach itself to this quality # NPl/V3 . D+ NSg/J+ NSg/VB+ VL3 NSg/VB/J P VB VB/C VB ISg+ P I/Ddem+ N🅪Sg/J+ > when it appears in a normal person , and so it came about that in college I was # NSg/I/C NPr/ISg+ V3 NPr/J/R/P D/P+ NSg/J+ NSg/VB+ . VB/C NSg/I/J/R/C NPr/ISg+ NSg/VPt/P J/P NSg/I/C/Ddem NPr/J/R/P NSg+ ISg/#r+ VLPt > unjustly accused of being a politician , because I was privy to the secret griefs # R VP/J P N🅪Sg/VLg/J/C D/P NSg+ . C/P ISg/#r+ VLPt NSg/J P D NSg/VB/J NPl/V3 > of wild , unknown men . Most of the confidences were unsought — frequently I have # P NSg/VB/J . NSg/VB/J NPl+ . NSg/I/J/R/Dq P D NPl NSg/VLPt VP . R ISg/#r+ NSg/VXB > feigned sleep , preoccupation , or a hostile levity when I realized by some # VP/J N🅪Sg/VB+ . NSg . NPr/C D/P NSg/J Nᴹ NSg/I/C ISg/#r+ VP/J/Comm/NoAm NSg/P I/J/R/Dq > unmistakable sign that an intimate revelation was quivering on the horizon ; for # J NSg/VB+ NSg/I/C/Ddem D/P NSg/VB/J NPr VLPt Nᴹ/Vg/J J/P D NSg+ . R/C/P > the intimate revelations of young men , or at least the terms in which they # D NSg/VB/J NPrPl P NPr/VB/J NPl+ . NPr/C NSg/P NSg/J/Dq D NPl/V3+ NPr/J/R/P I/C+ IPl+ > express them , are usually plagiaristic and marred by obvious suppressions . # NSg/VB/J NSg/IPl+ . VLB R J VB/C VP/J NSg/P J NPl . > Reserving judgments is a matter of infinite hope . I am still a little afraid of # Nᴹ/Vg/J NPl+ VL3 D/P N🅪Sg/VB P NSg/J NPr🅪Sg/VB+ . ISg/#r+ NPr/VLB/J NSg/VB/J/R D/P NPr/I/J/Dq J P > missing something if I forget that , as my father snobbishly suggested , and I # Nᴹ/Vg/J NSg/I/J+ NSg/C ISg/#r+ VB NSg/I/C/Ddem+ . R/C/P D$+ NPr/VB+ R VP/J . VB/C ISg/#r+ > snobbishly repeat , a sense of the fundamental decencies is parcelled out # R NSg/VB . D/P N🅪Sg/VB P D NSg/J NPl VL3 VP/Comm NSg/VB/J/R/P > unequally at birth . # R NSg/P NSg/VB/J+ . > # > And , after boasting this way of my tolerance , I come to the admission that it # VB/C . P Nᴹ/Vg/J I/Ddem NSg/J P D$+ N🅪Sg/VB+ . ISg/#r+ NSg/VBPp/P P D+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ > has a limit . Conduct may be founded on the hard rock or the wet marshes , but # V3 D/P+ NSg/VB/J+ . NSg/VB NPr/VXB NSg/VLXB VP/J J/P D N🅪Sg/J/R NPr🅪Sg/VB NPr/C D+ NSg/VP/J+ NPl+ . NSg/C/P > after a certain point I don’t care what it’s founded on . When I came back from # P D/P+ I/J+ NSg/VB+ ISg/#r+ VXB N🅪Sg/VB+ NSg/I+ K VP/J J/P . NSg/I/C ISg/#r+ NSg/VPt/P NSg/VB/J P > the East last autumn I felt that I wanted the world to be in uniform and at a # D+ NPr/J+ NSg/VB/J+ NPr🅪Sg/VB+ ISg/#r+ N🅪Sg/VP/J NSg/I/C/Ddem ISg/#r+ VP/J D+ NSg/VB+ P NSg/VLXB NPr/J/R/P NSg/VB/J VB/C NSg/P D/P > sort of moral attention forever ; I wanted no more riotous excursions with # NSg/VB P NSg/VB/J+ NSg+ NSg/J . ISg/#r+ VP/J NSg/Dq/P NPr/I/J/R/Dq J NPl/V3 P > privileged glimpses into the human heart . Only Gatsby , the man who gives his # VP/J NPl/V3+ P D NSg/VB/J N🅪Sg/VB+ . J/R/C NPr . D NPr/VB/J+ NPr/I+ NPl/V3 ISg/D$+ > name to this book , was exempt from my reaction — Gatsby , who represented # NSg/VB+ P I/Ddem NSg/VB+ . VLPt NSg/VB/J P D$+ N🅪Sg/VB/J+ . NPr . NPr/I+ VP/J > everything for which I have an unaffected scorn . If personality is an unbroken # NSg/I/VB+ R/C/P I/C+ ISg/#r+ NSg/VXB D/P J NSg/VB+ . NSg/C N🅪Sg+ VL3 D/P J > series of successful gestures , then there was something gorgeous about him , some # NSgPl P J+ NPl/V3+ . NSg/J/R/C R+ VLPt NSg/I/J+ J J/P ISg+ . I/J/R/Dq > heightened sensitivity to the promises of life , as if he were related to one of # VP/J N🅪Sg+ P D NPl/V3 P N🅪Sg/VB+ . R/C/P NSg/C NPr/ISg+ NSg/VLPt J P NSg/I/J P > those intricate machines that register earthquakes ten thousand miles away . This # I/Ddem VB/J NPl/V3+ NSg/I/C/Ddem+ NSg/VB NPl/V3+ NSg+ NSg NPrPl+ VB/J . I/Ddem+ > responsiveness had nothing to do with that flabby impressionability which is # Nᴹ+ VP NSg/I/J+ P VXB P NSg/I/C/Ddem J NSg I/C+ VL3 > dignified under the name of the “ creative temperament ” — it was an extraordinary # VP/J NSg/J/P D NSg/VB P D . NSg/J NSg+ . . NPr/ISg+ VLPt D/P NSg/J > gift for hope , a romantic readiness such as I have never found in any other # NSg/VB+ R/C/P NPr🅪Sg/VB . D/P NSg/J NSg NSg/I R/C/P ISg/#r+ NSg/VXB R NSg/VP NPr/J/R/P I/R/Dq NSg/VB/J > person and which it is not likely I shall ever find again . No — Gatsby turned out # NSg/VB+ VB/C I/C+ NPr/ISg+ VL3 NSg/R/C NSg/J ISg/#r+ VXB J/R NSg/VB P . NSg/Dq/P . NPr VP/J NSg/VB/J/R/P > all right at the end ; it is what preyed on Gatsby , what foul dust floated in the # NSg/I/J/C/Dq NPr/VB/J NSg/P D NSg/VB+ . NPr/ISg+ VL3 NSg/I+ VP/J J/P NPr . NSg/I+ NSg/VB/J Nᴹ/VB+ VP/J NPr/J/R/P D > wake of his dreams that temporarily closed out my interest in the abortive # NPr/VB P ISg/D$+ NPl/V3+ NSg/I/C/Ddem+ R VP/J NSg/VB/J/R/P D$+ N🅪Sg/VB+ NPr/J/R/P D NSg/J > sorrows and short - winded elations of men . # NPl/V3+ VB/C NPr/VB/J/P . VP/J NPl P NPl+ . > # > My family have been prominent , well - to - do people in this Middle Western city for # D$+ N🅪Sg/J+ NSg/VXB NSg/VLPp NSg/J . NSg/VB/J/R . P . VXB NPl/VB NPr/J/R/P I/Ddem NSg/VB/J NPr/J NSg R/C/P > three generations . The Carraways are something of a clan , and we have a # NSg+ NPl+ . D ? VLB NSg/I/J P D/P NSg+ . VB/C IPl+ NSg/VXB D/P > tradition that we’re descended from the Dukes of Buccleuch , but the actual # N🅪Sg/VB+ NSg/I/C/Ddem+ K VP/J P D NPl/V3 P ? . NSg/C/P D NSg/J > founder of my line was my grandfather’s brother , who came here in fifty - one , # NSg/VB P D$+ NSg/VB+ VLPt D$+ NSg$ NSg/VB/J+ . NPr/I+ NSg/VPt/P J/R NPr/J/R/P NSg . NSg/I/J . > sent a substitute to the Civil War , and started the wholesale hardware business # NSg/VP D/P NSg/VB+ P D J N🅪Sg/VB+ . VB/C VP/J D NSg/VB/J Nᴹ+ N🅪Sg/J+ > that my father carries on to - day . # NSg/I/C/Ddem+ D$+ NPr/VB+ NPl/V3 J/P P . NPr🅪Sg+ . > # > I never saw this great - uncle , but I’m supposed to look like him — with special # ISg/#r+ R NSg/VPt I/Ddem NSg/J . NSg/VB+ . NSg/C/P K VP/J P NSg/VB NSg/VB/J/C/P ISg+ . P NSg/VB/J > reference to the rather hard - boiled painting that hangs in father’s office . I # NSg/VB+ P D NPr/VB/J/R N🅪Sg/J/R . VP/J N🅪Sg/Vg/J+ NSg/I/C/Ddem+ NPl/V3 NPr/J/R/P NPr$ NSg/VB+ . ISg/#r+ > graduated from New Haven in 1915 , just a quarter of a century after my father , # VP/J P NSg/J+ NSg/VB+ NPr/J/R/P # . J/R D/P NSg/VB/J P D/P NSg+ P D$+ NPr/VB+ . > and a little later I participated in that delayed Teutonic migration known as # VB/C D/P NPr/I/J/Dq JC ISg/#r+ VP/J NPr/J/R/P NSg/I/C/Ddem+ VP/J NSg/J NSg+ VPp/J R/C/P > the Great War . I enjoyed the counter - raid so thoroughly that I came back # D NSg/J N🅪Sg/VB+ . ISg/#r+ VP/J D NSg/VB/J+ . NSg/VB+ NSg/I/J/R/C R NSg/I/C/Ddem ISg/#r+ NSg/VPt/P NSg/VB/J > restless . Instead of being the warm centre of the world , the Middle West now # J . R P N🅪Sg/VLg/J/C D NSg/VB/J NSg/VB/Comm P D+ NSg/VB+ . D+ NSg/VB/J+ NPr/VB/J+ NSg/J/R/C > seemed like the ragged edge of the universe — so I decided to go East and learn # VP/J NSg/VB/J/C/P D VP/J NSg/VB P D NPr+ . NSg/I/J/R/C ISg/#r+ NSg/VP/J P NSg/VB/J NPr/J+ VB/C NSg/VB > the bond business . Everybody I knew was in the bond business , so I supposed it # D NPr/VB/J+ N🅪Sg/J+ . NSg/I+ ISg/#r+ VPt VLPt NPr/J/R/P D+ NPr/VB/J+ N🅪Sg/J+ . NSg/I/J/R/C ISg/#r+ VP/J NPr/ISg+ > could support one more single man . All my aunts and uncles talked it over as if # NSg/VXB N🅪Sg/VB+ NSg/I/J NPr/I/J/R/Dq NSg/VB/J+ NPr/VB/J+ . NSg/I/J/C/Dq D$+ NPl VB/C NPl/V3 VP/J NPr/ISg+ NSg/J/P R/C/P NSg/C > they were choosing a prep school for me , and finally said , “ Why — ye - es , ” with # IPl+ NSg/VLPt Nᴹ/Vg/J D/P Nᴹ/VB+ N🅪Sg/VB+ R/C/P NPr/ISg+ . VB/C R VP/J . . NSg/VB . NSg/I/D+ . NPrPl . . P > very grave , hesitant faces . Father agreed to finance me for a year , and after # J/R NSg/VB/J+ . J NPl/V3+ . NPr/VB+ VP/J P N🅪Sg/VB NPr/ISg+ R/C/P D/P+ NSg+ . VB/C P > various delays I came East , permanently , I thought , in the spring of twenty - two . # J+ NPl/V3+ ISg/#r+ NSg/VPt/P NPr/J+ . R . ISg/#r+ N🅪Sg/VP . NPr/J/R/P D N🅪Sg/VB P NSg . NSg . > # > The practical thing was to find rooms in the city , but it was a warm season , and # D+ NSg/J+ NSg+ VLPt P NSg/VB NPl/V3+ NPr/J/R/P D+ NSg+ . NSg/C/P NPr/ISg+ VLPt D/P NSg/VB/J NSg/VB . VB/C > I had just left a country of wide lawns and friendly trees , so when a young man # ISg/#r+ VP J/R NPr/VP/J D/P NSg/J P NSg/J NPl/V3 VB/C NSg/J/R NPl/V3+ . NSg/I/J/R/C NSg/I/C D/P NPr/VB/J NPr/VB/J+ > at the office suggested that we take a house together in a commuting town , it # NSg/P D NSg/VB+ VP/J NSg/I/C/Ddem IPl+ NSg/VB D/P NPr/VB+ J NPr/J/R/P D/P Nᴹ/Vg/J NSg+ . NPr/ISg+ > sounded like a great idea . He found the house , a weatherbeaten cardboard # VP/J NSg/VB/J/C/P D/P NSg/J NSg+ . NPr/ISg+ NSg/VP D+ NPr/VB+ . D/P ? Nᴹ/J+ > bungalow at eighty a month , but at the last minute the firm ordered him to # NSg NSg/P NSg D/P NSg/J+ . NSg/C/P NSg/P D NSg/VB/J NSg/VB/J+ D NSg/VB/J+ VP/J ISg+ P > Washington , and I went out to the country alone . I had a dog — at least I had him # NPr+ . VB/C ISg/#r+ NSg/VPt NSg/VB/J/R/P P D NSg/J+ J . ISg/#r+ VP D/P+ NSg/VB/J+ . NSg/P NSg/J/Dq ISg/#r+ VP ISg+ > for a few days until he ran away — and an old Dodge and a Finnish woman , who made # R/C/P D/P+ NSg/I/Dq+ NPl+ C/P NPr/ISg+ NSg/VPt VB/J . VB/C D/P NSg/J NPr/VB/J VB/C D/P+ NSg/J+ NSg/VB+ . NPr/I+ VP > my bed and cooked breakfast and muttered Finnish wisdom to herself over the # D$+ NSg/VBP/J+ VB/C VP/J N🅪Sg/VB+ VB/C VP/J NSg/J+ Nᴹ+ P ISg+ NSg/J/P D+ > electric stove . # NSg/J+ NSg/VB+ . > # > It was lonely for a day or so until one morning some man , more recently arrived # NPr/ISg+ VLPt J/R R/C/P D/P+ NPr🅪Sg+ NPr/C NSg/I/J/R/C C/P NSg/I/J+ N🅪Sg/Vg/J+ I/J/R/Dq+ NPr/VB/J+ . NPr/I/J/R/Dq R VP/J > than I , stopped me on the road . # C/P ISg/#r+ . VP/J NPr/ISg+ J/P D+ N🅪Sg/J+ . > # > “ How do you get to West Egg village ? ” he asked helplessly . # . NSg/C VXB ISgPl+ NSg/VB P NPr/VB/J+ N🅪Sg/VB+ NSg+ . . NPr/ISg+ VP/J R . > # > I told him . And as I walked on I was lonely no longer . I was a guide , a # ISg/#r+ VP ISg+ . VB/C R/C/P ISg/#r+ VP/J J/P ISg/#r+ VLPt J/R NSg/Dq/P NSg/JC . ISg/#r+ VLPt D/P NSg/VB . D/P > pathfinder , an original settler . He had casually conferred on me the freedom of # NSg . D/P NSg/J NSg+ . NPr/ISg+ VP R VP J/P NPr/ISg+ D N🅪Sg P > the neighborhood . # D+ NSg/Am+ . > # > And so with the sunshine and the great bursts of leaves growing on the trees , # VB/C NSg/I/J/R/C P D Nᴹ/J+ VB/C D NSg/J NPl/V3 P NPl/V3+ Nᴹ/Vg/J J/P D+ NPl/V3+ . > just as things grow in fast movies , I had that familiar conviction that life was # J/R R/C/P NPl+ VB NPr/J/R/P NSg/VB/J/R+ NPl+ . ISg/#r+ VP NSg/I/C/Ddem NSg/J+ N🅪Sg+ NSg/I/C/Ddem+ N🅪Sg/VB+ VLPt > beginning over again with the summer . # NSg/Vg/J NSg/J/P P P D+ NPr🅪Sg/VB+ . > # > There was so much to read , for one thing , and so much fine health to be pulled # R+ VLPt NSg/I/J/R/C NSg/I/J/R/Dq P NSg/VBP . R/C/P NSg/I/J+ NSg+ . VB/C NSg/I/J/R/C NSg/I/J/R/Dq NSg/VB/J Nᴹ+ P NSg/VLXB VP/J > down out of the young breath - giving air . I bought a dozen volumes on banking and # N🅪Sg/VB/J/P NSg/VB/J/R/P P D+ NPr/VB/J+ N🅪Sg/VB/J+ . Nᴹ/Vg/J N🅪Sg/VB+ . ISg/#r+ NSg/VP D/P NSg NPl/V3 J/P Nᴹ/Vg/J VB/C > credit and investment securities , and they stood on my shelf in red and gold # NSg/VB VB/C N🅪Sg+ NPl+ . VB/C IPl+ VP J/P D$+ NSg+ NPr/J/R/P N🅪Sg/J VB/C Nᴹ/VB/J > like new money from the mint , promising to unfold the shining secrets that only # NSg/VB/J/C/P NSg/J+ N🅪Sg/J+ P D NSg/VB/J . Nᴹ/Vg/J P NSg/VB D Nᴹ/Vg/J NPl/V3+ NSg/I/C/Ddem J/R/C > Midas and Morgan and Mæcenas knew . And I had the high intention of reading many # NPr VB/C NPr+ VB/C ? VPt . VB/C ISg/#r+ VP D NSg/VB/J/R NSg/VB P NPrᴹ/Vg/J NSg/I/J/Dq+ > other books besides . I was rather literary in college — one year I wrote a series # NSg/VB/J+ NPl/V3+ R/P . ISg/#r+ VLPt NPr/VB/J/R J NPr/J/R/P NSg . NSg/I/J+ NSg+ ISg/#r+ VPt D/P NSgPl > of very solemn and obvious editorials for the Yale News — and now I was going to # P J/R J VB/C J NPl R/C/P D+ NPr+ Nᴹ/VB+ . VB/C NSg/J/R/C ISg/#r+ VLPt Nᴹ/Vg/J P > bring back all such things into my life and become again that most limited of # VB NSg/VB/J NSg/I/J/C/Dq NSg/I NPl+ P D$+ N🅪Sg/VB+ VB/C VBPp P NSg/I/C/Ddem NSg/I/J/R/Dq NSg/VP/J P > all specialists , the “ well - rounded man . ” This isn’t just an epigram — life is much # NSg/I/J/C/Dq NPl+ . D . NSg/VB/J/R . VP/J NPr/VB/J+ . . I/Ddem NSg/VX3 J/R D/P NSg . N🅪Sg/VB+ VL3 NSg/I/J/R/Dq > more successfully looked at from a single window , after all . # NPr/I/J/R/Dq R VP/J NSg/P P D/P NSg/VB/J NSg/VB+ . P NSg/I/J/C/Dq . > # > It was a matter of chance that I should have rented a house in one of the # NPr/ISg+ VLPt D/P N🅪Sg/VB P NPr/VB/J+ NSg/I/C/Ddem+ ISg/#r+ VXB NSg/VXB VP/J D/P+ NPr/VB+ NPr/J/R/P NSg/I/J P D > strangest communities in North America . It was on that slender riotous island # JS NPl NPr/J/R/P NPr/VB/J+ NPr+ . NPr/ISg+ VLPt J/P NSg/I/C/Ddem+ J J NSg/VB+ > which extends itself due east of New York — and where there are , among other # I/C+ NPl/V3 ISg+ NSg/J NPr/J P NSg/J NPr+ . VB/C NSg/R/C R+ VLB . P NSg/VB/J > natural curiosities , two unusual formations of land . Twenty miles from the city # NSg/J NPl . NSg NSg/J NPl P NPr🅪Sg/VB+ . NSg NPrPl+ P D+ NSg+ > a pair of enormous eggs , identical in contour and separated only by a courtesy # D/P NSg/VB P J+ NPl/V3+ . NSg/J NPr/J/R/P NSg/VB VB/C VP/J J/R/C NSg/P D/P NSg/VB/J+ > bay , jut out into the most domesticated body of salt water in the Western # NSg/VB/J+ . NSg/VB NSg/VB/J/R/P P D NSg/I/J/R/Dq VP/J NSg/VB P NPr🅪Sg/VB/J+ N🅪Sg/VB+ NPr/J/R/P D NPr/J > hemisphere , the great wet barnyard of Long Island Sound . They are not perfect # NSg+ . D NSg/J NSg/VP/J NSg/J P NPr/VB/J NSg/VB+ N🅪Sg/VB/J+ . IPl+ VLB NSg/R/C NSg/VB/J > ovals — like the egg in the Columbus story , they are both crushed flat at the # NPl . NSg/VB/J/C/P D N🅪Sg/VB+ NPr/J/R/P D NPr/VB+ NSg/VB+ . IPl+ VLB I/C/Dq VP/J NSg/VB/J NSg/P D > contact end — but their physical resemblance must be a source of perpetual wonder # N🅪Sg/VB+ NSg/VB+ . NSg/C/P D$+ NSg/J+ NSg+ NSg/VXB NSg/VLXB D/P N🅪Sg/VB P NSg/J N🅪Sg/VB > to the gulls that fly overhead . To the wingless a more interesting phenomenon is # P D NPl/V3 NSg/I/C/Ddem+ NSg/VB/J NSg/J/P+ . P D J D/P NPr/I/J/R/Dq Vg/J NSg+ VL3 > their dissimilarity in every particular except shape and size . # D$+ NSg NPr/J/R/P Dq NSg/J VB/C/P N🅪Sg/VB VB/C N🅪Sg/VB+ . > # > I lived at West Egg , the — well , the less fashionable of the two , though this is a # ISg/#r+ VP/J NSg/P NPr/VB/J+ N🅪Sg/VB+ . D . NSg/VB/J/R . D VB/J/R/C/P NSg/J P D NSg . C I/Ddem+ VL3 D/P > most superficial tag to express the bizarre and not a little sinister contrast # NSg/I/J/R/Dq NSg/J NSg/VB P NSg/VB/J D J VB/C NSg/R/C D/P NPr/I/J/Dq J NSg/VB > between them . My house was at the very tip of the egg , only fifty yards from the # NSg/P NSg/IPl+ . D$+ NPr/VB+ VLPt NSg/P D J/R NSg/VB P D+ N🅪Sg/VB+ . J/R/C NSg NPl/V3 P D+ > Sound , and squeezed between two huge places that rented for twelve or fifteen # N🅪Sg/VB/J+ . VB/C VP/J NSg/P NSg+ J+ NPl/V3+ NSg/I/C/Ddem+ VP/J R/C/P NSg NPr/C NSg > thousand a season . The one on my right was a colossal affair by any standard — it # NSg+ D/P+ NSg/VB+ . D NSg/I/J J/P D$+ NPr/VB/J VLPt D/P J NSg NSg/P I/R/Dq NSg/J . NPr/ISg+ > was a factual imitation of some Hôtel de Ville in Normandy , with a tower on one # VLPt D/P NSg/J N🅪Sg P I/J/R/Dq ? NPr+ ? NPr/J/R/P NPr . P D/P NSg/VB+ J/P NSg/I/J > side , spanking new under a thin beard of raw ivy , and a marble swimming pool , # NSg/VB/J+ . Nᴹ/Vg/J NSg/J NSg/J/P D/P NSg/VB/J NPr/VB P NSg/VB/J NPr+ . VB/C D/P NSg/VB/J+ NSg/Vg NSg/VB+ . > and more than forty acres of lawn and garden . It was Gatsby’s mansion . Or , # VB/C NPr/I/J/R/Dq C/P NSg/J NPl P NSg/VB VB/C NSg/VB/J+ . NPr/ISg+ VLPt NPr$ NSg+ . NPr/C . > rather , as I didn’t know Mr . Gatsby , it was a mansion inhabited by a gentleman # NPr/VB/J/R . R/C/P ISg/#r+ VXPt VB NSg+ . NPr . NPr/ISg+ VLPt D/P NSg+ VP/J NSg/P D/P NSg/J > of that name . My own house was an eyesore , but it was a small eyesore , and it # P NSg/I/C/Ddem NSg/VB+ . D$+ NSg/VB/J+ NPr/VB+ VLPt D/P NSg . NSg/C/P NPr/ISg+ VLPt D/P NPr/VB/J NSg . VB/C NPr/ISg+ > had been overlooked , so I had a view of the water , a partial view of my # VP NSg/VLPp VP/J . NSg/I/J/R/C ISg/#r+ VP D/P NSg/VB P D N🅪Sg/VB+ . D/P NSg/VB/J NSg/VB P D$+ > neighbor’s lawn , and the consoling proximity of millionaires — all for eighty # NSg$/Am NSg/VB+ . VB/C D Nᴹ/Vg/J Nᴹ P NPl . NSg/I/J/C/Dq R/C/P NSg > dollars a month . # NPl+ D/P NSg/J+ . > # > Across the courtesy bay the white palaces of fashionable East Egg glittered # NSg/P D+ NSg/VB/J+ NSg/VB/J+ D NPr🅪Sg/VB/J NPl/V3 P NSg/J+ NPr/J+ N🅪Sg/VB+ VP/J > along the water , and the history of the summer really begins on the evening I # P D N🅪Sg/VB+ . VB/C D N🅪Sg P D NPr🅪Sg/VB+ R NPl/V3 J/P D N🅪Sg/Vg/J+ ISg/#r+ > drove over there to have dinner with the Tom Buchanans . Daisy was my second # NSg/VPt NSg/J/P R+ P NSg/VXB N🅪Sg/VB+ P D NPr/VB+ ? . NPr+ VLPt D$+ NSg/VB/J+ > cousin once removed , and I’d known Tom in college . And just after the war I # NSg/VB+ NSg/C VP/J . VB/C K VPp/J NPr/VB+ NPr/J/R/P NSg+ . VB/C J/R P D+ N🅪Sg/VB+ ISg/#r+ > spent two days with them in Chicago . # VP/J NSg NPl+ P NSg/IPl+ NPr/J/R/P NPr+ . > # > Her husband , among various physical accomplishments , had been one of the most # ISg/D$+ NSg/VB+ . P J+ NSg/J+ NPl+ . VP NSg/VLPp NSg/I/J P D NSg/I/J/R/Dq > powerful ends that ever played football at New Haven — a national figure in a way , # J NPl/V3+ NSg/I/C/Ddem+ J/R VP/J NSg/VB+ NSg/P NSg/J+ NSg/VB+ . D/P NSg/J NSg/VB+ NPr/J/R/P D/P+ NSg/J+ . > one of those men who reach such an acute limited excellence at twenty - one that # NSg/I/J P I/Ddem+ NPl+ NPr/I+ NSg/VB NSg/I D/P+ NSg/VB/J+ NSg/VP/J+ NSg+ NSg/P NSg . NSg/I/J NSg/I/C/Ddem > everything afterward savors of anti - climax . His family were enormously # NSg/I/VB+ R/Am NPl/V3 P NSg/J/P . NSg/VB . ISg/D$+ N🅪Sg/J+ NSg/VLPt R > wealthy — even in college his freedom with money was a matter for reproach — but now # NSg/J . NSg/VB/J/R NPr/J/R/P NSg+ ISg/D$+ N🅪Sg P N🅪Sg/J+ VLPt D/P N🅪Sg/VB R/C/P NSg/VB . NSg/C/P NSg/J/R/C > he’d left Chicago and come East in a fashion that rather took your breath away : # K NPr/VP/J NPr+ VB/C NSg/VBPp/P NPr/J+ NPr/J/R/P D/P N🅪Sg/VB+ NSg/I/C/Ddem+ NPr/VB/J/R VPt D$+ N🅪Sg/VB/J+ VB/J . > for instance , he’d brought down a string of polo ponies from Lake Forest . It was # R/C/P NSg/VB+ . K VP N🅪Sg/VB/J/P D/P NSg/VB P NPrᴹ+ NPl/V3 P NSg/VB+ NPr/VB+ . NPr/ISg+ VLPt > hard to realize that a man in my own generation was wealthy enough to do that . # N🅪Sg/J/R P VB/Comm/NoAm NSg/I/C/Ddem D/P+ NPr/VB/J+ NPr/J/R/P D$+ NSg/VB/J+ NSg+ VLPt NSg/J NSg/I P VXB NSg/I/C/Ddem+ . > # > Why they came East I don’t know . They had spent a year in France for no # NSg/VB IPl+ NSg/VPt/P NPr/J+ ISg/#r+ VXB VB . IPl+ VP VP/J D/P NSg+ NPr/J/R/P NPr+ R/C/P NSg/Dq/P+ > particular reason , and then drifted here and there unrestfully wherever people # NSg/J+ N🅪Sg/VB+ . VB/C NSg/J/R/C VP/J J/R VB/C R+ R C NPl/VB+ > played polo and were rich together . This was a permanent move , said Daisy over # VP/J NPrᴹ+ VB/C NSg/VLPt NPr/VB/J J . I/Ddem+ VLPt D/P NSg/J NSg/VB . VP/J NPr+ NSg/J/P > the telephone , but I didn’t believe it — I had no sight into Daisy’s heart , but I # D+ NSg/VB+ . NSg/C/P ISg/#r+ VXPt VB NPr/ISg+ . ISg/#r+ VP NSg/Dq/P N🅪Sg/VB+ P NPr$ N🅪Sg/VB+ . NSg/C/P ISg/#r+ > felt that Tom would drift on forever seeking , a little wistfully , for the # N🅪Sg/VP/J NSg/I/C/Ddem NPr/VB+ VXB NSg/VB J/P NSg/J Nᴹ/Vg/J . D/P NPr/I/J/Dq R . R/C/P D > dramatic turbulence of some irrecoverable football game . # J NSg P I/J/R/Dq J NSg/VB+ NSg/VB/J+ . > # > And so it happened that on a warm windy evening I drove over to East Egg to see # VB/C NSg/I/J/R/C NPr/ISg+ VP/J NSg/I/C/Ddem J/P D/P+ NSg/VB/J+ NSg/J+ N🅪Sg/Vg/J+ ISg/#r+ NSg/VPt NSg/J/P P NPr/J+ N🅪Sg/VB+ P NSg/VB > two old friends whom I scarcely knew at all . Their house was even more elaborate # NSg+ NSg/J+ NPrPl/V3+ I+ ISg/#r+ R VPt NSg/P NSg/I/J/C/Dq . D$+ NPr/VB+ VLPt NSg/VB/J/R NPr/I/J/R/Dq VB/J > than I expected , a cheerful red - and - white Georgian Colonial mansion , overlooking # C/P ISg/#r+ NSg/VP/J . D/P J N🅪Sg/J . VB/C . NPr🅪Sg/VB/J NSg/J NSg/J+ NSg+ . Nᴹ/Vg/J > the bay . The lawn started at the beach and ran toward the front door for a # D NSg/VB/J+ . D+ NSg/VB+ VP/J NSg/P D+ NPr/VB+ VB/C NSg/VPt J/P D+ NSg/VB/J+ NSg/VB+ R/C/P D/P > quarter of a mile , jumping over sun - dials and brick walks and burning # NSg/VB/J P D/P+ NSg+ . Nᴹ/Vg/J NSg/J/P NPr/VB+ . NPl/V3 VB/C N🅪Sg/VB/J+ NPl/V3 VB/C Nᴹ/Vg/J > gardens — finally when it reached the house drifting up the side in bright vines # NPl/V3+ . R NSg/I/C NPr/ISg+ VP/J D+ NPr/VB+ Nᴹ/Vg/J NSg/VB/J/P D+ NSg/VB/J+ NPr/J/R/P NPr/VB/J NPl > as though from the momentum of its run . The front was broken by a line of French # R/C/P C P D N🅪Sg P ISg/D$+ NSg/VBPp . D+ NSg/VB/J+ VLPt VPp/J NSg/P D/P NSg/VB P NPr🅪Sg/VB/J+ > windows , glowing now with reflected gold and wide open to the warm windy # NPrPl/V3+ . Nᴹ/Vg/J NSg/J/R/C P VP/J Nᴹ/VB/J+ VB/C NSg/J NSg/VB/J P D+ NSg/VB/J+ NSg/J+ > afternoon , and Tom Buchanan in riding clothes was standing with his legs apart # N🅪Sg+ . VB/C NPr/VB+ NPr NPr/J/R/P Nᴹ/Vg/J+ NPl/V3+ VLPt Nᴹ/Vg/J P ISg/D$+ NPl/V3+ J > on the front porch . # J/P D+ NSg/VB/J+ NSg+ . > # > He had changed since his New Haven years . Now he was a sturdy straw - haired man # NPr/ISg+ VP VP/J C/P ISg/D$+ NSg/J+ NSg/VB+ NPl+ . NSg/J/R/C NPr/ISg+ VLPt D/P NSg/J N🅪Sg/VB/J . VP/J NPr/VB/J > of thirty with a rather hard mouth and a supercilious manner . Two shining # P NSg P D/P NPr/VB/J/R N🅪Sg/J/R NSg/VB+ VB/C D/P J NSg+ . NSg Nᴹ/Vg/J > arrogant eyes had established dominance over his face and gave him the # J+ NPl/V3+ VP VP/J Nᴹ+ NSg/J/P ISg/D$+ NSg/VB+ VB/C VPt ISg+ D > appearance of always leaning aggressively forward . Not even the effeminate swank # NSg P R Nᴹ/Vg/J R NSg/VB/J . NSg/R/C NSg/VB/J/R D NSg/VB/J NSg/VB/J > of his riding clothes could hide the enormous power of that body — he seemed to # P ISg/D$+ Nᴹ/Vg/J+ NPl/V3+ NSg/VXB NSg/VB D J N🅪Sg/VB/J P NSg/I/C/Ddem NSg/VB+ . NPr/ISg+ VP/J P > fill those glistening boots until he strained the top lacing , and you could see # NSg/VB I/Ddem Nᴹ/Vg/J NPl/V3+ C/P NPr/ISg+ VP/J D NSg/VB/J+ Nᴹ/Vg/J . VB/C ISgPl+ NSg/VXB NSg/VB > a great pack of muscle shifting when his shoulder moved under his thin coat . It # D/P NSg/J NSg/VB P N🅪Sg/VB+ Nᴹ/Vg/J+ NSg/I/C ISg/D$+ NSg/VB+ VP/J NSg/J/P ISg/D$+ NSg/VB/J NSg/VB+ . NPr/ISg+ > was a body capable of enormous leverage — a cruel body . # VLPt D/P NSg/VB J P J Nᴹ/VB . D/P+ NSg/VB/J+ NSg/VB+ . > # > His speaking voice , a gruff husky tenor , added to the impression of # ISg/D$+ Nᴹ/Vg/J NSg/VB+ . D/P NSg/VB/J NSg/J NSg/J . VP/J P D NSg/VB+ P > fractiousness he conveyed . There was a touch of paternal contempt in it , even # NSg NPr/ISg+ VP/J . R+ VLPt D/P N🅪Sg/VB P J Nᴹ NPr/J/R/P NPr/ISg+ . NSg/VB/J/R > toward people he liked — and there were men at New Haven who had hated his guts . # J/P NPl/VB+ NPr/ISg+ VP/J . VB/C R+ NSg/VLPt NPl+ NSg/P NSg/J+ NSg/VB+ NPr/I+ VP VP/J ISg/D$+ NPl/V3+ . > # > “ Now , don’t think my opinion on these matters is final , ” he seemed to say , “ just # . NSg/J/R/C . VXB NSg/VB D$+ N🅪Sg+ J/P I/Ddem NPl/V3+ VL3 NSg/VB/J . . NPr/ISg+ VP/J P NSg/VB . . J/R > because I’m stronger and more of a man than you are . ” We were in the same senior # C/P K JC VB/C NPr/I/J/R/Dq P D/P NPr/VB/J+ C/P ISgPl+ VLB . . IPl+ NSg/VLPt NPr/J/R/P D+ I/J+ NPr/J+ > society , and while we were never intimate I always had the impression that he # N🅪Sg+ . VB/C NSg/VB/C/P IPl+ NSg/VLPt R NSg/VB/J ISg/#r+ R VP D+ NSg/VB+ NSg/I/C/Ddem+ NPr/ISg+ > approved of me and wanted me to like him with some harsh , defiant wistfulness of # VP/J P NPr/ISg+ VB/C VP/J NPr/ISg+ P NSg/VB/J/C/P ISg+ P I/J/R/Dq VB/J . NSg/J Nᴹ P > his own . # ISg/D$+ NSg/VB/J . > # > We talked for a few minutes on the sunny porch . # IPl+ VP/J R/C/P D/P NSg/I/Dq+ NPl/V3+ J/P D+ NSg/J+ NSg+ . > # > “ I’ve got a nice place here , ” he said , his eyes flashing about restlessly . # . K VP D/P NPr/J N🅪Sg/VB+ J/R . . NPr/ISg+ VP/J . ISg/D$+ NPl/V3+ Nᴹ/Vg/J J/P R . > # > Turning me around by one arm , he moved a broad flat hand along the front vista , # Nᴹ/Vg/J NPr/ISg+ J/P NSg/P NSg/I/J+ NSg/VB/J+ . NPr/ISg+ VP/J D/P+ NSg/J+ NSg/VB/J+ NSg/VB+ P D+ NSg/VB/J+ NSg/VB+ . > including in its sweep a sunken Italian garden , a half acre of deep , pungent # Nᴹ/Vg/J NPr/J/R/P ISg/D$+ NSg/VB D/P VPp/J N🅪Sg/J NSg/VB/J . D/P+ N🅪Sg/J/P+ NSg P NSg/J . J > roses , and a snub - nosed motor - boat that bumped the tide offshore . # NPl/V3+ . VB/C D/P NSg/VB/J+ . VP/J NSg/VB/J+ . NSg/VB+ NSg/I/C/Ddem+ VP/J D NSg/VB+ NSg/VB/J . > # > “ It belonged to Demaine , the oil man . ” He turned me around again , politely and # . NPr/ISg+ VP/J P ? . D N🅪Sg/VB+ NPr/VB/J+ . . NPr/ISg+ VP/J NPr/ISg+ J/P P . R VB/C > abruptly . “ We'll go inside . ” # R . . K NSg/VB/J NSg/J/P . . > # > We walked through a high hallway into a bright rosy - colored space , fragilely # IPl+ VP/J NSg/J/P D/P+ NSg/VB/J/R+ NSg+ P D/P NPr/VB/J NSg/VB/J . NSg/VP/J/Am N🅪Sg/VB+ . R > bound into the house by French windows at either end . The windows were ajar and # NSg/VP/J P D NPr/VB+ NSg/P NPr🅪Sg/VB/J NPrPl/V3+ NSg/P I/C NSg/VB+ . D+ NPrPl/V3+ NSg/VLPt VB/J VB/C > gleaming white against the fresh grass outside that seemed to grow a little way # Nᴹ/Vg/J NPr🅪Sg/VB/J C/P D NSg/VB/J NPr🅪Sg/VB+ Nᴹ/VB/J/P NSg/I/C/Ddem+ VP/J P VB D/P NPr/I/J/Dq NSg/J+ > into the house . A breeze blew through the room , blew curtains in at one end and # P D NPr/VB+ . D/P+ NSg/VB+ NSg/VPt/J NSg/J/P D+ N🅪Sg/VB/J+ . NSg/VPt/J NPl/V3+ NPr/J/R/P NSg/P NSg/I/J+ NSg/VB+ VB/C > out the other like pale flags , twisting them up toward the frosted wedding - cake # NSg/VB/J/R/P D NSg/VB/J NSg/VB/J/C/P NSg/VB/J+ NPl/V3+ . Nᴹ/Vg/J NSg/IPl+ NSg/VB/J/P J/P D VP/J NSg/Vg+ . N🅪Sg/VB > of the ceiling , and then rippled over the wine - colored rug , making a shadow on # P D NSg/VB+ . VB/C NSg/J/R/C VP/J NSg/J/P D N🅪Sg/VB+ . NSg/VP/J/Am NSg/VB/J+ . Nᴹ/Vg/J D/P NSg/VB/J+ J/P > it as wind does on the sea . # NPr/ISg+ R/C/P N🅪Sg/VB+ NPl/VX3 J/P D NSg+ . > # > The only completely stationary object in the room was an enormous couch on which # D J/R/C R NSg/J NSg/VB+ NPr/J/R/P D N🅪Sg/VB/J+ VLPt D/P J NSg/VB+ J/P I/C+ > two young women were buoyed up as though upon an anchored balloon . They were # NSg NPr/VB/J NPl+ NSg/VLPt VP/J NSg/VB/J/P R/C/P C P D/P VP/J NSg/VB+ . IPl+ NSg/VLPt > both in white , and their dresses were rippling and fluttering as if they had # I/C/Dq NPr/J/R/P NPr🅪Sg/VB/J . VB/C D$+ NPl/V3+ NSg/VLPt Nᴹ/Vg/J VB/C Nᴹ/Vg/J R/C/P NSg/C IPl+ VP > just been blown back in after a short flight around the house . I must have stood # J/R NSg/VLPp VPp/J NSg/VB/J NPr/J/R/P P D/P NPr/VB/J/P N🅪Sg/VB/J+ J/P D NPr/VB+ . ISg/#r+ NSg/VXB NSg/VXB VP > for a few moments listening to the whip and snap of the curtains and the groan # R/C/P D/P+ NSg/I/Dq+ NPl+ Nᴹ/Vg/J P D NSg/VB VB/C NSg/VB/J P D NPl/V3+ VB/C D NSg/VB > of a picture on the wall . Then there was a boom as Tom Buchanan shut the rear # P D/P NSg/VB+ J/P D NPr/VB+ . NSg/J/R/C R+ VLPt D/P+ NSg/VB+ R/C/P NPr/VB+ NPr+ NSg/VBP/J D+ NSg/VB/J+ > windows and the caught wind died out about the room , and the curtains and the # NPrPl/V3+ VB/C D VP/J N🅪Sg/VB+ VP/J NSg/VB/J/R/P J/P D+ N🅪Sg/VB/J+ . VB/C D NPl/V3 VB/C D > rugs and the two young women ballooned slowly to the floor . # NPl/V3 VB/C D+ NSg+ NPr/VB/J+ NPl+ VP/J R P D NSg/VB+ . > # > The younger of the two was a stranger to me . She was extended full length at her # D NSg/JC P D+ NSg+ VLPt+ D/P+ NSg/VB/JC+ P NPr/ISg+ . ISg+ VLPt VP/J NSg/VB/J N🅪Sg/VB NSg/P ISg/D$+ > end of the divan , completely motionless , and with her chin raised a little , as # NSg/VB P D NSg . R J . VB/C P ISg/D$+ NPr/VB+ VP/J D/P NPr/I/J/Dq . R/C/P > if she were balancing something on it which was quite likely to fall . If she saw # NSg/C ISg+ NSg/VLPt Nᴹ/Vg/J NSg/I/J+ J/P NPr/ISg+ I/C+ VLPt R NSg/J P N🅪Sg/VB . NSg/C ISg+ NSg/VPt > me out of the corner of her eyes she gave no hint of it — indeed , I was almost # NPr/ISg+ NSg/VB/J/R/P P D NSg/VB P ISg/D$+ NPl/V3+ ISg+ VPt NSg/Dq/P NSg/VB P NPr/ISg+ . R . ISg/#r+ VLPt R > surprised into murmuring an apology for having disturbed her by coming in . # VP/J P Nᴹ/Vg/J D/P N🅪Sg+ R/C/P Nᴹ/Vg/J VP/J ISg/D$+ NSg/P Nᴹ/Vg/J NPr/J/R/P . > # > The other girl , Daisy , made an attempt to rise — she leaned slightly forward with # D+ NSg/VB/J+ NSg/VB+ . NPr+ . VP D/P NSg/VB+ P NSg/VB . ISg+ VP/J R NSg/VB/J P > a conscientious expression — then she laughed , an absurd , charming little laugh , # D/P+ J+ N🅪Sg+ . NSg/J/R/C ISg+ VP/J . D/P NSg/J . Nᴹ/Vg/J+ NPr/I/J/Dq+ NSg/VB+ . > and I laughed too and came forward into the room . # VB/C ISg/#r+ VP/J R VB/C NSg/VPt/P NSg/VB/J P D+ N🅪Sg/VB/J+ . > # > “ I’m p - paralyzed with happiness . ” # . K NSg/VB/P+ . VP/J P Nᴹ+ . . > # > She laughed again , as if she said something very witty , and held my hand for a # ISg+ VP/J P . R/C/P NSg/C ISg+ VP/J NSg/I/J+ J/R J . VB/C VP D$+ NSg/VB+ R/C/P D/P > moment , looking up into my face , promising that there was no one in the world # NSg+ . Nᴹ/Vg/J NSg/VB/J/P P D$+ NSg/VB+ . Nᴹ/Vg/J NSg/I/C/Ddem R+ VLPt NSg/Dq/P NSg/I/J+ NPr/J/R/P D NSg/VB+ > she so much wanted to see . That was a way she had . She hinted in a murmur that # ISg+ NSg/I/J/R/C NSg/I/J/R/Dq VP/J P NSg/VB . NSg/I/C/Ddem+ VLPt D/P NSg/J ISg+ VP . ISg+ VP/J NPr/J/R/P D/P NSg/VB NSg/I/C/Ddem > the surname of the balancing girl was Baker . ( I’ve heard it said that Daisy’s # D NSg/VB P D Nᴹ/Vg/J+ NSg/VB+ VLPt NPr+ . . K VP/J NPr/ISg+ VP/J NSg/I/C/Ddem NPr$ > murmur was only to make people lean toward her ; an irrelevant criticism that # NSg/VB VLPt J/R/C P NSg/VB NPl/VB+ NPr/VB/J J/P ISg/D$+ . D/P J N🅪Sg+ NSg/I/C/Ddem+ > made it no less charming . ) # VP NPr/ISg+ NSg/Dq/P VB/J/R/C/P Nᴹ/Vg/J . . > # > At any rate , Miss Baker’s lips fluttered , she nodded at me almost imperceptibly , # NSg/P I/R/Dq+ NSg/VB+ . NSg/VB NPr$ NPl/V3+ VP/J . ISg+ VP NSg/P NPr/ISg+ R R . > and then quickly tipped her head back again — the object she was balancing had # VB/C NSg/J/R/C R VP ISg/D$+ NPr/VB/J+ NSg/VB/J P . D NSg/VB+ ISg+ VLPt Nᴹ/Vg/J+ VP > obviously tottered a little and given her something of a fright . Again a sort of # R VP/J D/P NPr/I/J/Dq VB/C NSg/VPp/J/P ISg/D$+ NSg/I/J+ P D/P NSg/VB/J . P D/P NSg/VB P > apology arose to my lips . Almost any exhibition of complete self - sufficiency # N🅪Sg+ VPt P D$+ NPl/V3+ . R I/R/Dq NSg P NSg/VB/J+ NSg/I/VB/J+ . NSg > draws a stunned tribute from me . # NPl/V3 D/P VP/J NSg/VB P NPr/ISg+ . > # > I looked back at my cousin , who began to ask me questions in her low , thrilling # ISg/#r+ VP/J NSg/VB/J NSg/P D$+ NSg/VB+ . NPr/I+ VPt P NSg/VB NPr/ISg+ NPl/V3+ NPr/J/R/P ISg/D$+ NSg/VB/J/R . Nᴹ/Vg/J > voice . It was the kind of voice that the ear follows up and down , as if each # NSg/VB+ . NPr/ISg+ VLPt D NSg/J P NSg/VB+ NSg/I/C/Ddem D+ NSg/VB/J+ NPl/V3 NSg/VB/J/P VB/C N🅪Sg/VB/J/P . R/C/P NSg/C Dq+ > speech is an arrangement of notes that will never be played again . Her face was # N🅪Sg/VB+ VL3 D/P NSg P NPl/V3+ NSg/I/C/Ddem+ NPr/VXB R NSg/VLXB VP/J P . ISg/D$+ NSg/VB+ VLPt > sad and lovely with bright things in it , bright eyes and a bright passionate # NSg/VB/J VB/C NSg/J P NPr/VB/J NPl NPr/J/R/P NPr/ISg+ . NPr/VB/J NPl/V3 VB/C D/P+ NPr/VB/J+ NSg/VB/J+ > mouth , but there was an excitement in her voice that men who had cared for her # NSg/VB+ . NSg/C/P R+ VLPt D/P NSg NPr/J/R/P ISg/D$+ NSg/VB+ NSg/I/C/Ddem+ NPl+ NPr/I+ VP VP R/C/P ISg/D$+ > found difficult to forget : a singing compulsion , a whispered “ Listen , ” a promise # NSg/VP VB/J P VB . D/P Nᴹ/Vg/J NSg+ . D/P+ VP/J+ . NSg/VB . . D/P+ NSg/VB+ > that she had done gay , exciting things just a while since and that there were # NSg/I/C/Ddem+ ISg+ VP NSg/VPp/J NPr/VB/J . Nᴹ/Vg/J+ NPl+ J/R D/P+ NSg/VB/C/P+ C/P VB/C NSg/I/C/Ddem R+ NSg/VLPt > gay , exciting things hovering in the next hour . # NPr/VB/J . Nᴹ/Vg/J+ NPl+ Nᴹ/Vg/J NPr/J/R/P D NSg/J/P NSg+ . > # > I told her how I had stopped off in Chicago for a day on my way East , and how a # ISg/#r+ VP ISg/D$+ NSg/C ISg/#r+ VP VP/J NSg/VB/J/P NPr/J/R/P NPr+ R/C/P D/P+ NPr🅪Sg+ J/P D$+ NSg/J+ NPr/J+ . VB/C NSg/C D/P+ > dozen people had sent their love through me . # NSg+ NPl/VB+ VP NSg/VP D$+ NPr🅪Sg/VB NSg/J/P NPr/ISg+ . > # > “ Do they miss me ? ” she cried ecstatically . # . VXB IPl+ NSg/VB NPr/ISg+ . . ISg+ VP/J R . > # > “ The whole town is desolate . All the cars have the left rear wheel painted black # . D+ NSg/J+ NSg+ VL3 VB/J . NSg/I/J/C/Dq D+ NPl+ NSg/VXB D NPr/VP/J NSg/VB/J+ NSg/VB+ VP/J N🅪Sg/VB/J > as a mourning wreath , and there’s a persistent wail all night along the north # R/C/P D/P Nᴹ/Vg/J NSg/VB . VB/C K D/P J NSg/VB NSg/I/J/C/Dq N🅪Sg/VB+ P D NPr/VB/J+ > shore . ” # NSg/VB+ . . > # > “ How gorgeous ! Let’s go back , Tom . To - morrow ! ” Then she added irrelevantly : “ You # . NSg/C J . NSg$ NSg/VB/J NSg/VB/J . NPr/VB+ . P . NPr/VB . . NSg/J/R/C ISg+ VP/J R . . ISgPl+ > ought to see the baby . ” # NSg/I/VXB P NSg/VB D NSg/VB/J+ . . > # > “ I’d like to . ” # . K NSg/VB/J/C/P P . . > # > “ She’s asleep . She’s three years old . Haven’t you ever seen her ? ” # . K J . K NSg+ NPl+ NSg/J . VXB ISgPl+ J/R NSg/VPp ISg/D$+ . . > # > “ Never . ” # . R . . > # > “ Well , you ought to see her . She’s — ” # . NSg/VB/J/R . ISgPl+ NSg/I/VXB P NSg/VB ISg/D$+ . K . . > # > Tom Buchanan , who had been hovering restlessly about the room , stopped and # NPr/VB+ NPr+ . NPr/I+ VP NSg/VLPp Nᴹ/Vg/J R J/P D N🅪Sg/VB/J+ . VP/J VB/C > rested his hand on my shoulder . # VP/J ISg/D$+ NSg/VB+ J/P D$+ NSg/VB+ . > # > “ What you doing , Nick ? ” # . NSg/I+ ISgPl+ Nᴹ/Vg/J . NPr/VB+ . . > # > “ I’m a bond man . ” # . K D/P+ NPr/VB/J+ NPr/VB/J+ . . > # > " Who with ? ” # . NPr/I+ P . . > # > I told him . # ISg/#r+ VP ISg+ . > # > “ Never heard of them , ” he remarked decisively . # . R VP/J P NSg/IPl+ . . NPr/ISg+ VP/J R . > # > This annoyed me . # I/Ddem+ VP/J NPr/ISg+ . > # > “ You will , ” I answered shortly . “ You will if you stay in the East . ” # . ISgPl+ NPr/VXB . . ISg/#r+ VP/J R . . ISgPl+ NPr/VXB NSg/C ISgPl+ NSg/VB/J NPr/J/R/P D+ NPr/J+ . . > # > “ Oh , I’ll stay in the East , don’t you worry , ” he said , glancing at Daisy and # . NPr/VB . K NSg/VB/J NPr/J/R/P D NPr/J+ . VXB ISgPl+ N🅪Sg/VB . . NPr/ISg+ VP/J . Nᴹ/Vg/J NSg/P NPr+ VB/C > then back at me , as if he were alert for something more . “ I’d be a God damned # NSg/J/R/C NSg/VB/J NSg/P NPr/ISg+ . R/C/P NSg/C NPr/ISg+ NSg/VLPt NSg/VB/J+ R/C/P NSg/I/J+ NPr/I/J/R/Dq . . K NSg/VLXB D/P NPr/VB+ VP/J > fool to live anywhere else . ” # NSg/VB/J P VB/J NSg/I NSg/J/C . . > # > At this point Miss Baker said : “ Absolutely ! ” with such suddenness that I # NSg/P I/Ddem+ NSg/VB+ NSg/VB NPr+ VP/J . . R . . P NSg/I Nᴹ NSg/I/C/Ddem ISg/#r+ > started — it was the first word she had uttered since I came into the room . # VP/J . NPr/ISg+ VLPt D NSg/J NSg/VB+ ISg+ VP VP/J C/P ISg/#r+ NSg/VPt/P P D N🅪Sg/VB/J+ . > Evidently it surprised her as much as it did me , for she yawned and with a # R NPr/ISg+ VP/J ISg/D$+ R/C/P NSg/I/J/R/Dq R/C/P NPr/ISg+ VXPt NPr/ISg+ . R/C/P ISg+ VP/J VB/C P D/P > series of rapid , deft movements stood up into the room . # NSgPl P NSg/J . J NPl+ VP NSg/VB/J/P P D N🅪Sg/VB/J+ . > # > “ I’m stiff , ” she complained , “ I’ve been lying on that sofa for as long as I can # . K NSg/VB/J . . ISg+ VP/J . . K NSg/VLPp Nᴹ/Vg/J J/P NSg/I/C/Ddem NSg/VB+ R/C/P R/C/P NPr/VB/J R/C/P ISg/#r+ NPr/VXB > remember . ” # NSg/VB . . > # > “ Don’t look at me , ” Daisy retorted , “ ‘ I’ve been trying to get you to New York # . VXB NSg/VB NSg/P NPr/ISg+ . . NPr+ VP/J . . Unlintable K NSg/VLPp Nᴹ/Vg/J P NSg/VB ISgPl+ P NSg/J NPr+ > all afternoon . ” # NSg/I/J/C/Dq N🅪Sg+ . . > # > “ No , thanks , ” said Miss Baker to the four cocktails just in from the pantry , # . NSg/Dq/P . NPl/V3+ . . VP/J NSg/VB NPr+ P D+ NSg+ NPl/V3+ J/R NPr/J/R/P P D+ NSg+ . > “ I’m absolutely in training . ” # . K R NPr/J/R/P Nᴹ/Vg/J+ . . > # > Her host looked at her incredulously . # ISg/D$+ NSg/VB+ VP/J NSg/P ISg/D$+ R . > # > “ You are ! ” He took down his drink as if it were a drop in the bottom of a glass . # . ISgPl+ VLB . . NPr/ISg+ VPt N🅪Sg/VB/J/P ISg/D$+ NSg/VB+ R/C/P NSg/C NPr/ISg+ NSg/VLPt D/P NSg/VB NPr/J/R/P D NSg/VB/J P D/P+ NPr🅪Sg/VB+ . > “ How you ever get anything done is beyond me . ” # . NSg/C ISgPl+ J/R NSg/VB NSg/I/VB+ NSg/VPp/J VL3 NSg/P NPr/ISg+ . . > # > I looked at Miss Baker , wondering what it was she “ got done . ” I enjoyed looking # ISg/#r+ VP/J NSg/P NSg/VB NPr+ . Nᴹ/Vg/J NSg/I+ NPr/ISg+ VLPt ISg+ . VP NSg/VPp/J . . ISg/#r+ VP/J Nᴹ/Vg/J > at her . She was a slender , small - breasted girl , with an erect carriage , which # NSg/P ISg/D$+ . ISg+ VLPt D/P J . NPr/VB/J . VP/J NSg/VB+ . P D/P VB/J NSg . I/C+ > she accentuated by throwing her body backward at the shoulders like a young # ISg+ VP/J NSg/P Nᴹ/Vg/J ISg/D$+ NSg/VB+ NSg/J NSg/P D NPl/V3+ NSg/VB/J/C/P D/P NPr/VB/J > cadet . Her gray sun - strained eyes looked back at me with polite reciprocal # NSg . ISg/D$+ NPr🅪Sg/VB/J/Am+ NPr/VB+ . VP/J NPl/V3+ VP/J NSg/VB/J NSg/P NPr/ISg+ P VB/J NSg/J > curiosity out of a wan , charming , discontented face . It occurred to me now that # NSg+ NSg/VB/J/R/P P D/P NSg/VB/J+ . Nᴹ/Vg/J . VP/J NSg/VB+ . NPr/ISg+ VP P NPr/ISg+ NSg/J/R/C NSg/I/C/Ddem > I had seen her , or a picture of her , somewhere before . # ISg/#r+ VP NSg/VPp ISg/D$+ . NPr/C D/P NSg/VB P ISg/D$+ . NSg C/P . > # > “ You live in West Egg , ” she remarked contemptuously . “ I know somebody there . ” # . ISgPl+ VB/J NPr/J/R/P NPr/VB/J+ N🅪Sg/VB+ . . ISg+ VP/J R . . ISg/#r+ VB NSg/I+ R . . > # > “ I don’t know a single — ” # . ISg/#r+ VXB VB D/P NSg/VB/J . . > # > “ You must know Gatsby . ” # . ISgPl+ NSg/VXB VB NPr . . > # > “ Gatsby ? ” demanded Daisy . “ What Gatsby ? ” # . NPr . . VP/J NPr+ . . NSg/I+ NPr . . > # > Before I could reply that he was my neighbor dinner was announced ; wedging his # C/P ISg/#r+ NSg/VXB NSg/VB+ NSg/I/C/Ddem+ NPr/ISg+ VLPt D$+ NSg/VB/J/Am+ N🅪Sg/VB+ VLPt VP/J . Nᴹ/Vg/J ISg/D$+ > tense arm imperatively under mine , Tom Buchanan compelled me from the room as # NSg/VB/J NSg/VB/J+ R NSg/J/P NSg/I/VB+ . NPr/VB+ NPr+ VP/J NPr/ISg+ P D N🅪Sg/VB/J+ R/C/P > though he were moving a checker to another square . # C NPr/ISg+ NSg/VLPt Nᴹ/Vg/J D/P NSg/VB P I/D NSg/VB/J . > # > Slenderly , languidly , their hands set lightly on their hips , the two young women # R . R . D$+ NPl/V3+ NPr/VBP/J R J/P D$+ NPl/V3+ . D NSg NPr/VB/J NPl+ > preceded us out onto a rosy - colored porch , open toward the sunset , where four # VP/J NPr/IPl+ NSg/VB/J/R/P J/P D/P NSg/VB/J . NSg/VP/J/Am NSg+ . NSg/VB/J J/P D NSg/VB+ . NSg/R/C NSg > candles flickered on the table in the diminished wind . # NPl/V3+ VP/J J/P D NSg/VB+ NPr/J/R/P D VP/J N🅪Sg/VB+ . > # > “ Why candles ? ” objected Daisy , frowning . She snapped them out with her fingers . # . NSg/VB NPl/V3+ . . VP/J NPr+ . Nᴹ/Vg/J . ISg+ VP NSg/IPl+ NSg/VB/J/R/P P ISg/D$+ NPl/V3+ . > “ In two weeks it’ll be the longest day in the year . ” She looked at us all # . NPr/J/R/P NSg+ NPrPl+ K NSg/VLXB D JS NPr🅪Sg+ NPr/J/R/P D NSg+ . . ISg+ VP/J NSg/P NPr/IPl+ NSg/I/J/C/Dq > radiantly . “ Do you always watch for the longest day of the year and then miss # R . . VXB ISgPl+ R NSg/VB R/C/P D JS NPr🅪Sg P D+ NSg+ VB/C NSg/J/R/C NSg/VB > it ? I always watch for the longest day in the year and then miss it . ” # NPr/ISg+ . ISg/#r+ R NSg/VB R/C/P D JS+ NPr🅪Sg+ NPr/J/R/P D+ NSg+ VB/C NSg/J/R/C NSg/VB NPr/ISg+ . . > # > “ We ought to plan something , ” yawned Miss Baker , sitting down at the table as if # . IPl+ NSg/I/VXB P NSg/VB NSg/I/J+ . . VP/J NSg/VB NPr+ . NSg/Vg/J N🅪Sg/VB/J/P NSg/P D+ NSg/VB+ R/C/P NSg/C > she were getting into bed . # ISg+ NSg/VLPt NSg/Vg P NSg/VBP/J+ . > # > “ All right , ” said Daisy . ‘ ‘ What’ll we plan ? ” She turned to me helplessly : ‘ ‘ What # . NSg/I/J/C/Dq NPr/VB/J . . VP/J NPr+ . Unlintable Unlintable K IPl+ NSg/VB+ . . ISg+ VP/J P NPr/ISg+ R . Unlintable Unlintable NSg/I+ > do people plan ? ” # VXB NPl/VB+ NSg/VB+ . . > # > Before I could answer her eyes fastened with an awed expression on her little # C/P ISg/#r+ NSg/VXB NSg/VB ISg/D$+ NPl/V3+ VP/J P D/P VP/J N🅪Sg+ J/P ISg/D$+ NPr/I/J/Dq > finger . # NSg/VB+ . > # > “ Look ! ” she complained ; “ I hurt it . ” # . NSg/VB . . ISg+ VP/J . . ISg/#r+ NSg/VBP/J NPr/ISg+ . . > # > We all looked — the knuckle was black and blue . # IPl+ NSg/I/J/C/Dq+ VP/J+ . D NSg/VB VLPt N🅪Sg/VB/J VB/C N🅪Sg/VB/J . > # > “ You did it , Tom , ” she said accusingly . “ I know you didn’t mean to , but you did # . ISgPl+ VXPt NPr/ISg+ . NPr/VB+ . . ISg+ VP/J R . . ISg/#r+ VB ISgPl+ VXPt NSg/VB/J P . NSg/C/P ISgPl+ VXPt > do it . That’s what I get for marrying a brute of a man , a great , big , hulking # VXB NPr/ISg+ . NSg$ NSg/I+ ISg/#r+ NSg/VB R/C/P Nᴹ/Vg/J D/P NSg/VB/J P D/P NPr/VB/J+ . D/P NSg/J . NSg/J . Nᴹ/Vg/J > physical specimen of a — ” ’ # NSg/J NSg P D/P . . . > # > “ I hate that word hulking , ” objected Tom crossly , “ even in kidding . ” # . ISg/#r+ N🅪Sg/VB NSg/I/C/Ddem+ NSg/VB+ Nᴹ/Vg/J . . VP/J NPr/VB+ R . . NSg/VB/J/R NPr/J/R/P NSg/Vg . . > # > “ Hulking , ” insisted Daisy . # . Nᴹ/Vg/J . . VP/J NPr+ . > # > Sometimes she and Miss Baker talked at once , unobtrusively and with a bantering # R ISg+ VB/C NSg/VB NPr+ VP/J NSg/P NSg/C . R VB/C P D/P Nᴹ/Vg/J > inconsequence that was never quite chatter , that was as cool as their white # Nᴹ NSg/I/C/Ddem+ VLPt R R NSg/VB+ . NSg/I/C/Ddem+ VLPt R/C/P NSg/VB/J R/C/P D$+ NPr🅪Sg/VB/J > dresses and their impersonal eyes in the absence of all desire . They were here , # NPl/V3+ VB/C D$+ NSg/J NPl/V3+ NPr/J/R/P D N🅪Sg P NSg/I/J/C/Dq N🅪Sg/VB+ . IPl+ NSg/VLPt J/R . > and they accepted Tom and me , making only a polite pleasant effort to entertain # VB/C IPl+ VP/J NPr/VB+ VB/C NPr/ISg+ . Nᴹ/Vg/J J/R/C D/P VB/J NSg/J N🅪Sg/VB+ P NSg/VB > or to be entertained . They knew that presently dinner would be over and a little # NPr/C P NSg/VLXB VP/J . IPl+ VPt NSg/I/C/Ddem R N🅪Sg/VB+ VXB NSg/VLXB NSg/J/P VB/C D/P NPr/I/J/Dq > later the evening too would be over and casually put away . It was sharply # JC D+ N🅪Sg/Vg/J+ R VXB NSg/VLXB NSg/J/P VB/C R NSg/VBP VB/J . NPr/ISg+ VLPt R > different from the West , where an evening was hurried from phase to phase toward # NSg/J P D+ NPr/VB/J+ . NSg/R/C D/P+ N🅪Sg/Vg/J+ VLPt VP/J P NPr/VB+ P NPr/VB J/P > its close , in a continually disappointed anticipation or else in sheer nervous # ISg/D$+ NSg/VB/J . NPr/J/R/P D/P R VP/J Nᴹ+ NPr/C NSg/J/C NPr/J/R/P NSg/VB/J J > dread of the moment itself . # N🅪Sg/VB/J P D+ NSg+ ISg+ . > # > “ You make me feel uncivilized , Daisy , ” I confessed on my second glass of corky # . ISgPl+ NSg/VB NPr/ISg+ NSg/I/VB VB/J . NPr+ . . ISg/#r+ VP/J J/P D$+ NSg/VB/J NPr🅪Sg/VB+ P J > but rather impressive claret . “ Can’t you talk about crops or something ? ” # NSg/C/P NPr/VB/J/R J Nᴹ/VB/J . . VXB ISgPl+ N🅪Sg/VB J/P NPl/V3+ NPr/C NSg/I/J+ . . > # > I meant nothing in particular by this remark , but it was taken up in an # ISg/#r+ VP NSg/I/J+ NPr/J/R/P NSg/J NSg/P I/Ddem+ NSg/VB+ . NSg/C/P NPr/ISg+ VLPt VPp/J NSg/VB/J/P NPr/J/R/P D/P+ > unexpected way . # NSg/J+ NSg/J+ . > # > “ Civilization’s going to pieces , ” broke out Tom violently . “ I’ve gotten to be a # . NPr$ Nᴹ/Vg/J P NPl/V3 . . NSg/VPt/J NSg/VB/J/R/P NPr/VB+ R . . K VPp/J P NSg/VLXB D/P > terrible pessimist about things . Have you read ‘ The Rise of the Colored Empires ’ # J NSg J/P NPl+ . NSg/VXB ISgPl+ NSg/VBP Unlintable D NSg/VB P D+ NSg/VP/J/Am NPl+ . > by this man Goddard ? ” # NSg/P I/Ddem+ NPr/VB/J+ NPr+ . . > # > “ Why , no , ” I answered , rather surprised by his tone . # . NSg/VB . NSg/Dq/P . . ISg/#r+ VP/J . NPr/VB/J/R VP/J NSg/P ISg/D$+ N🅪Sg/I/VB+ . > # > “ Well , it’s a fine book , and everybody ought to read it . The idea is if we don’t # . NSg/VB/J/R . K D/P+ NSg/VB/J NSg/VB+ . VB/C NSg/I+ NSg/I/VXB P NSg/VBP NPr/ISg+ . D+ NSg+ VL3 NSg/C IPl+ VXB > look out the white race will be — will be utterly submerged . It’s all scientific # NSg/VB NSg/VB/J/R/P D NPr🅪Sg/VB/J N🅪Sg/VB+ NPr/VXB NSg/VLXB . NPr/VXB NSg/VLXB R VP/J . K NSg/I/J/C/Dq+ J > stuff ; it’s been proved . ” # Nᴹ/VB+ . K NSg/VLPp VP/J . . > # > “ Tom’s getting very profound , ” said Daisy , with an expression of unthoughtful # . NPr$ NSg/Vg J/R NSg/VB/J . . VP/J NPr+ . P D/P N🅪Sg P J > sadness . “ He reads deep books with long words in them . What was that word we — — — ” # Nᴹ+ . . NPr/ISg+ NPl/V3 NSg/J NPl/V3 P NPr/VB/J+ NPl/V3+ NPr/J/R/P NSg/IPl+ . NSg/I+ VLPt NSg/I/C/Ddem NSg/VB IPl+ . . . . > # > “ Well , these books are all scientific , ” insisted Tom , glancing at her # . NSg/VB/J/R . I/Ddem+ NPl/V3+ VLB NSg/I/J/C/Dq J . . VP/J NPr/VB+ . Nᴹ/Vg/J NSg/P ISg/D$+ > impatiently . “ This fellow has worked out the whole thing . It’s up to us , who are # R . . I/Ddem NSg V3 VP/J NSg/VB/J/R/P D+ NSg/J+ NSg+ . K NSg/VB/J/P P NPr/IPl+ . NPr/I+ VLB > the dominant race , to watch out or these other races will have control of # D NSg/J N🅪Sg/VB+ . P NSg/VB NSg/VB/J/R/P NPr/C I/Ddem NSg/VB/J NPl/V3+ NPr/VXB NSg/VXB N🅪Sg/VB P > things . ” # NPl+ . . > # > “ We’ve got to beat them down , ” whispered Daisy , winking ferociously toward the # . K VP P N🅪Sg/VB/J NSg/IPl+ N🅪Sg/VB/J/P . . VP/J NPr+ . Nᴹ/Vg/J R J/P D > fervent sun . # J NPr/VB+ . > # > “ You ought to live in California — ” began Miss Baker , but Tom interrupted her by # . ISgPl+ NSg/I/VXB P VB/J NPr/J/R/P NPr+ . . VPt NSg/VB NPr+ . NSg/C/P NPr/VB+ VP/J ISg/D$+ NSg/P > shifting heavily in his chair . # Nᴹ/Vg/J+ R NPr/J/R/P ISg/D$+ NSg/VB+ . > # > “ This idea is that we’re Nordics . I am , and you are , and you are , and — ” After an # . I/Ddem+ NSg+ VL3 NSg/I/C/Ddem+ K NPl . ISg/#r+ NPr/VLB/J . VB/C ISgPl+ VLB . VB/C ISgPl+ VLB . VB/C . . P D/P > infinitesimal hesitation he included Daisy with a slight nod , and she winked at # NSg/J NSg+ NPr/ISg+ VP/J NPr+ P D/P NSg/VB/J NSg/VB . VB/C ISg+ VP/J NSg/P > me again . ‘ ‘ — And we’ve produced all the things that go to make civilization — oh , # NPr/ISg+ P . Unlintable Unlintable . VB/C K VP/J NSg/I/J/C/Dq D NPl+ NSg/I/C/Ddem+ NSg/VB/J P NSg/VB NPr🅪Sg+ . NPr/VB . > science and art , and all that . Do you see ? ” # N🅪Sg/VB VB/C NPr🅪Sg/VB+ . VB/C NSg/I/J/C/Dq NSg/I/C/Ddem+ . VXB ISgPl+ NSg/VB . . > # > There was something pathetic in his concentration , as if his complacency , more # R+ VLPt NSg/I/J+ J NPr/J/R/P ISg/D$+ NSg+ . R/C/P NSg/C ISg/D$+ NSg . NPr/I/J/R/Dq > acute than of old , was not enough to him any more . When , almost immediately , the # NSg/VB/J C/P P NSg/J . VLPt NSg/R/C NSg/I P ISg+ I/R/Dq NPr/I/J/R/Dq . NSg/I/C . R R . D+ > telephone rang inside and the butler left the porch Daisy seized upon the # NSg/VB+ VPt NSg/J/P VB/C D NPr/VB NPr/VP/J D NSg+ NPr+ VP/J P D > momentary interruption and leaned toward me . # J N🅪Sg+ VB/C VP/J J/P NPr/ISg+ . > # > “ I’ll tell you a family secret , ” she whispered enthusiastically . “ It’s about the # . K NPr/VB ISgPl+ D/P N🅪Sg/J+ NSg/VB/J . . ISg+ VP/J R . . K J/P D > butler’s nose . Do you want to hear about the butler’s nose ? ” # NPr$ NSg/VB+ . VXB ISgPl+ NSg/VB P VB J/P D NPr$ NSg/VB+ . . > # > “ That’s why I came over to - night . ” # . NSg$ NSg/VB ISg/#r+ NSg/VPt/P NSg/J/P P . N🅪Sg/VB+ . . > # > “ Well , he wasn’t always a butler ; he used to be the silver polisher for some # . NSg/VB/J/R . NPr/ISg+ VPt R D/P NPr/VB . NPr/ISg+ VP/J P NSg/VLXB D Nᴹ/VB/J+ NSg/JC R/C/P I/J/R/Dq > people in New York that had a silver service for two hundred people . He had to # NPl/VB+ NPr/J/R/P NSg/J NPr+ NSg/I/C/Ddem+ VP D/P Nᴹ/VB/J+ NSg/VB+ R/C/P NSg NSg NPl/VB+ . NPr/ISg+ VP P > polish it from morning till night , until finally it began to affect his nose — — — ” # NSg/VB/J NPr/ISg+ P N🅪Sg/Vg/J+ NSg/VB/C/P N🅪Sg/VB+ . C/P R NPr/ISg+ VPt P NSg/VB ISg/D$+ NSg/VB+ . . . . > # > “ Things went from bad to worse , ” suggested Miss Baker . # . NPl+ NSg/VPt P NSg/VB/J P NSg/VB/JC . . VP/J NSg/VB NPr+ . > # > “ Yes . Things went from bad to worse , until finally he had to give up his # . NPl/VB . NPl+ NSg/VPt P NSg/VB/J P NSg/VB/JC . C/P R NPr/ISg+ VP P NSg/VB NSg/VB/J/P ISg/D$+ > position . ” # NSg/VB+ . . > # > For a moment the last sunshine fell with romantic affection upon her glowing # R/C/P D/P+ NSg+ D+ NSg/VB/J+ Nᴹ/J+ NSg/VPt/J P NSg/J+ Nᴹ+ P ISg/D$+ Nᴹ/Vg/J > face ; her voice compelled me forward breathlessly as I listened — then the glow # NSg/VB+ . ISg/D$+ NSg/VB+ VP/J NPr/ISg+ NSg/VB/J R R/C/P ISg/#r+ VP/J . NSg/J/R/C D NSg/VB+ > faded , each light deserting her with lingering regret , like children leaving a # J . Dq N🅪Sg/VB/J+ Nᴹ/Vg/J ISg/D$+ P Nᴹ/Vg/J N🅪Sg/VB+ . NSg/VB/J/C/P NPl+ Nᴹ/Vg/J D/P > pleasant street at dusk . # NSg/J NSg/VB/J+ NSg/P Nᴹ/VB/J+ . > # > The butler came back and murmured something close to Tom’s ear , whereupon Tom # D NPr/VB NSg/VPt/P NSg/VB/J VB/C VP/J NSg/I/J+ NSg/VB/J P NPr$ NSg/VB/J+ . C NPr/VB+ > frowned , pushed back his chair , and without a word went inside . As if his # VP/J . VP/J NSg/VB/J ISg/D$+ NSg/VB+ . VB/C C/P D/P NSg/VB+ NSg/VPt NSg/J/P . R/C/P NSg/C ISg/D$+ > absence quickened something within her , Daisy leaned forward again , her voice # N🅪Sg+ VP/J NSg/I/J+ NSg/J/P ISg/D$+ . NPr+ VP/J NSg/VB/J P . ISg/D$+ NSg/VB+ > glowing and singing . # Nᴹ/Vg/J VB/C Nᴹ/Vg/J . > # > “ I love to see you at my table , Nick . You remind me of a — of a rose , an absolute # . ISg/#r+ NPr🅪Sg/VB P NSg/VB ISgPl+ NSg/P D$+ NSg/VB+ . NPr/VB+ . ISgPl+ NSg/VB NPr/ISg+ P D/P . P D/P+ NPr/VPt/J+ . D/P+ NSg/J+ > rose . Doesn’t he ? ” She turned to Miss Baker for confirmation : “ An absolute # NPr/VPt/J+ . VX3 NPr/ISg+ . . ISg+ VP/J P NSg/VB NPr+ R/C/P N🅪Sg+ . . D/P+ NSg/J+ > rose ? ” # NPr/VPt/J+ . . > # > This was untrue . I am not even faintly like a rose . She was only extemporizing , # I/Ddem+ VLPt J . ISg/#r+ NPr/VLB/J NSg/R/C NSg/VB/J/R R NSg/VB/J/C/P D/P+ NPr/VPt/J+ . ISg+ VLPt J/R/C Nᴹ/Vg/J . > but a stirring warmth flowed from her , as if her heart was trying to come out to # NSg/C/P D/P NSg/Vg/J Nᴹ+ VP/J P ISg/D$+ . R/C/P NSg/C ISg/D$+ N🅪Sg/VB+ VLPt Nᴹ/Vg/J P NSg/VBPp/P NSg/VB/J/R/P P > you concealed in one of those breathless , thrilling words . Then suddenly she # ISgPl+ VP/J NPr/J/R/P NSg/I/J P I/Ddem J . Nᴹ/Vg/J NPl/V3+ . NSg/J/R/C R ISg+ > threw her napkin on the table and excused herself and went into the house . # VPt ISg/D$+ NSg+ J/P D+ NSg/VB+ VB/C VP/J ISg+ VB/C NSg/VPt P D+ NPr/VB+ . > # > Miss Baker and I exchanged a short glance consciously devoid of meaning . I was # NSg/VB NPr+ VB/C ISg/#r+ VP/J D/P+ NPr/VB/J/P+ NSg/VB+ R VB/J P N🅪Sg/Vg/J+ . ISg/#r+ VLPt > about to speak when she sat up alertly and said “ Sh ! ” in a warning voice . A # J/P P NSg/VB NSg/I/C ISg+ NSg/VP/J NSg/VB/J/P R VB/C VP/J . W? . . NPr/J/R/P D/P+ N🅪Sg/Vg/J+ NSg/VB+ . D/P > subdued impassioned murmur was audible in the room beyond , and Miss Baker leaned # VP/J J NSg/VB VLPt NSg/VB/J NPr/J/R/P D N🅪Sg/VB/J+ NSg/P . VB/C NSg/VB NPr+ VP/J > forward unashamed , trying to hear . The murmur trembled on the verge of # NSg/VB/J J . Nᴹ/Vg/J P VB . D NSg/VB VP/J J/P D NSg/VB P > coherence , sank down , mounted excitedly , and then ceased altogether . # NSg+ . VPt N🅪Sg/VB/J/P . VP/J R . VB/C NSg/J/R/C VP/J NSg . > # > “ This Mr . Gatsby you spoke of is my neighbor — ” ’ I began . # . I/Ddem+ NSg+ . NPr ISgPl+ NSg/VPt P VL3 D$+ NSg/VB/J/Am+ . . . ISg/#r+ VPt . > # > “ Don’t talk . I want to hear what happens . ” # . VXB N🅪Sg/VB . ISg/#r+ NSg/VB P VB NSg/I+ V3 . . > # > “ Is something happening ? ” I inquired innocently . # . VL3 NSg/I/J+ N🅪Sg/Vg/J . . ISg/#r+ VP/J R . > # > “ You mean to say you don’t know ? ” said Miss Baker , honestly surprised . “ I # . ISgPl+ NSg/VB/J P NSg/VB ISgPl+ VXB VB . . VP/J NSg/VB NPr+ . R VP/J . . ISg/#r+ > thought everybody knew . ” # N🅪Sg/VP NSg/I+ VPt . . > # > “ I don’t . ” # . ISg/#r+ VXB . . > # > “ Why — ” she said hesitantly , ‘ ‘ Tom’s got some woman in New York . ” # . NSg/VB . . ISg+ VP/J R . Unlintable Unlintable NPr$ VP I/J/R/Dq NSg/VB+ NPr/J/R/P NSg/J NPr+ . . > # > “ Got some woman ? ” I repeated blankly . # . VP I/J/R/Dq+ NSg/VB+ . . ISg/#r+ VP/J R . > # > Miss Baker nodded . # NSg/VB NPr+ VP . > # > “ She might have the decency not to telephone him at dinner time . Don’t you # . ISg+ Nᴹ/VXB/J NSg/VXB D NSg NSg/R/C P NSg/VB ISg+ NSg/P N🅪Sg/VB+ N🅪Sg/VB/J+ . VXB ISgPl+ > think ? ” # NSg/VB . . > # > Almost before I had grasped her meaning there was the flutter of a dress and the # R C/P ISg/#r+ VP VP/J ISg/D$+ N🅪Sg/Vg/J+ R+ VLPt D NSg/VB P D/P NSg/VB+ VB/C D > crunch of leather boots , and Tom and Daisy were back at the table . # NSg/VB P N🅪Sg/VB/J+ NPl/V3+ . VB/C NPr/VB VB/C NPr+ NSg/VLPt NSg/VB/J NSg/P D+ NSg/VB+ . > # > “ It couldn’t be helped ! ” cried Daisy with tense gayety . # . NPr/ISg+ VXB NSg/VLXB VP/J . . VP/J NPr+ P NSg/VB/J ? . > # > She sat down , glanced searchingly at Miss Baker and then at me , and continued : # ISg+ NSg/VP/J N🅪Sg/VB/J/P . VP/J R NSg/P NSg/VB NPr+ VB/C NSg/J/R/C NSg/P NPr/ISg+ . VB/C VP/J . > “ I looked outdoors for a minute , and it’s very romantic outdoors . There’s a bird # . ISg/#r+ VP/J NSg/V3 R/C/P D/P NSg/VB/J+ . VB/C K J/R NSg/J NSg/V3 . K D/P NPr/VB/J+ > on the lawn that I think must be a nightingale come over on the Cunard or White # J/P D NSg/VB+ NSg/I/C/Ddem+ ISg/#r+ NSg/VB NSg/VXB NSg/VLXB D/P NPr NSg/VBPp/P NSg/J/P J/P D NPr NPr/C NPr🅪Sg/VB/J > Star Line . He’s singing away — ” Her voice sang : “ It’s romantic , isn’t it , Tom ? ” # NSg/VB+ NSg/VB+ . NPr$ Nᴹ/Vg/J VB/J . . ISg/D$+ NSg/VB+ NPr/VPt . . K NSg/J . NSg/VX3 NPr/ISg+ . NPr/VB+ . . > # > “ Very romantic , ” he said , and then miserably to me : “ If it’s light enough after # . J/R NSg/J . . NPr/ISg+ VP/J . VB/C NSg/J/R/C R P NPr/ISg+ . . NSg/C K N🅪Sg/VB/J+ NSg/I P > dinner , I want to take you down to the stables . ” # N🅪Sg/VB+ . ISg/#r+ NSg/VB P NSg/VB ISgPl+ N🅪Sg/VB/J/P P D NPl/V3+ . . > # > The telephone rang inside , startingly , and as Daisy shook her head decisively at # D+ NSg/VB+ VPt NSg/J/P . R . VB/C R/C/P NPr+ NSg/VPt/J ISg/D$+ NPr/VB/J+ R NSg/P > Tom the subject of the stables , in fact all subjects , vanished into air . Among # NPr/VB+ D NSg/VB/J P D NPl/V3+ . NPr/J/R/P NSg+ NSg/I/J/C/Dq NPl/V3+ . VP/J P N🅪Sg/VB+ . P > the broken fragments of the last five minutes at table I remember the candles # D VPp/J NPl/V3 P D NSg/VB/J NSg NPl/V3+ NSg/P NSg/VB+ ISg/#r+ NSg/VB D+ NPl/V3+ > being lit again , pointlessly , and I was conscious of wanting to look squarely at # N🅪Sg/VLg/J/C NSg/VP/J P . R . VB/C ISg/#r+ VLPt NSg/J P Nᴹ/Vg/J P NSg/VB R NSg/P > every one , and yet to avoid all eyes . I couldn’t guess what Daisy and Tom were # Dq NSg/I/J+ . VB/C NSg/VB/C P VB NSg/I/J/C/Dq NPl/V3+ . ISg/#r+ VXB NSg/VB NSg/I+ NPr VB/C NPr/VB+ NSg/VLPt > thinking , but I doubt if even Miss Baker , who seemed to have mastered a certain # Nᴹ/Vg/J . NSg/C/P ISg/#r+ N🅪Sg/VB NSg/C NSg/VB/J/R NSg/VB NPr+ . NPr/I+ VP/J P NSg/VXB VP/J D/P I/J > hardy scepticism , was able utterly to put this fifth guest’s shrill metallic # NPr/J Nᴹ/Au/Br . VLPt NSg/VB/J R P NSg/VBP I/Ddem NSg/VB/J NSg$ NSg/VB/J NSg/J > urgency out of mind . To a certain temperament the situation might have seemed # NSg NSg/VB/J/R/P P NSg/VB+ . P D/P+ I/J+ NSg+ D+ NSg+ Nᴹ/VXB/J NSg/VXB VP/J > intriguing — my own instinct was to telephone immediately for the police . # Nᴹ/Vg/J . D$+ NSg/VB/J+ NSg/J+ VLPt P NSg/VB R R/C/P D+ Nᴹ/VB+ . > # > The horses , needless to say , were not mentioned again . Tom and Miss Baker , with # D+ NPl/V3+ . J P NSg/VB . NSg/VLPt NSg/R/C VP/J P . NPr/VB+ VB/C NSg/VB NPr+ . P > several feet of twilight between them , strolled back into the library , as if to # J/Dq NPl P Nᴹ/VB/J+ NSg/P NSg/IPl+ . VP/J NSg/VB/J P D+ NSg+ . R/C/P NSg/C P > a vigil beside a perfectly tangible body , while , trying to look pleasantly # D/P NSg/VB P D/P R NSg/J NSg/VB+ . NSg/VB/C/P . Nᴹ/Vg/J P NSg/VB R > interested and a little deaf , I followed Daisy around a chain of connecting # VP/J VB/C D/P NPr/I/J/Dq NSg/VB/J . ISg/#r+ VP/J NPr+ J/P D/P N🅪Sg/VB P Nᴹ/Vg/J > verandas to the porch in front . In its deep gloom we sat down side by side on a # NPl/NoAm/Br P D NSg+ NPr/J/R/P NSg/VB/J+ . NPr/J/R/P ISg/D$+ NSg/J+ Nᴹ/VB+ IPl+ NSg/VP/J N🅪Sg/VB/J/P NSg/VB/J+ NSg/P NSg/VB/J+ J/P D/P > wicker settee . # NSg/JC NSg . > # > Daisy took her face in her hands as if feeling its lovely shape , and her eyes # NPr+ VPt ISg/D$+ NSg/VB+ NPr/J/R/P ISg/D$+ NPl/V3+ R/C/P NSg/C+ N🅪Sg/Vg/J ISg/D$+ NSg/J+ N🅪Sg/VB+ . VB/C ISg/D$+ NPl/V3+ > moved gradually out into the velvet dusk . I saw that turbulent emotions # VP/J R NSg/VB/J/R/P P D+ Nᴹ/VB/J+ Nᴹ/VB/J+ . ISg/#r+ NSg/VPt NSg/I/C/Ddem J NPl+ > possessed her , so I asked what I thought would be some sedative questions about # VP/J ISg/D$+ . NSg/I/J/R/C ISg/#r+ VP/J NSg/I+ ISg/#r+ N🅪Sg/VP VXB NSg/VLXB I/J/R/Dq NSg/J NPl/V3+ J/P > her little girl . # ISg/D$+ NPr/I/J/Dq NSg/VB+ . > # > “ We don’t know each other very well , Nick , ” she said suddenly . “ Even if we are # . IPl+ VXB VB Dq NSg/VB/J J/R NSg/VB/J/R . NPr/VB+ . . ISg+ VP/J R . . NSg/VB/J/R NSg/C IPl+ VLB > cousins . You didn’t come to my wedding . ” # NPl/V3+ . ISgPl+ VXPt NSg/VBPp/P P D$+ NSg/Vg+ . . > # > “ I wasn’t back from the war . ” # . ISg/#r+ VPt NSg/VB/J P D N🅪Sg/VB+ . . > # > “ That’s true . ” She hesitated . “ Well , I’ve had a very bad time , Nick , and I’m # . NSg$ NSg/VB/J . . ISg+ VP/J . . NSg/VB/J/R . K VP D/P J/R NSg/VB/J N🅪Sg/VB/J+ . NPr/VB+ . VB/C K > pretty cynical about everything . ” # NSg/VB/J/R J J/P NSg/I/VB+ . . > # > Evidently she had reason to be . I waited but she didn’t say any more , and after # R ISg+ VP N🅪Sg/VB+ P NSg/VLXB . ISg/#r+ VP/J NSg/C/P ISg+ VXPt NSg/VB I/R/Dq NPr/I/J/R/Dq . VB/C P > a moment I returned rather feebly to the subject of her daughter . # D/P NSg+ ISg/#r+ VP/J NPr/VB/J/R R P D NSg/VB/J P ISg/D$+ NSg+ . > # > “ I suppose she talks , and — eats , and everything . ” # . ISg/#r+ VB ISg+ NPl/V3+ . VB/C . V3 . VB/C NSg/I/VB+ . . > # > “ Oh , yes . ” She looked at me absently . “ Listen , Nick ; let me tell you what I said # . NPr/VB . NPl/VB . . ISg+ VP/J NSg/P NPr/ISg+ R . . NSg/VB . NPr/VB+ . NSg/VBP NPr/ISg+ NPr/VB ISgPl+ NSg/I+ ISg/#r+ VP/J > when she was born . Would you like to hear ? ” # NSg/I/C ISg+ VLPt NPr/VB/J . VXB ISgPl+ NSg/VB/J/C/P P VB . . > # > “ Very much . ” # . J/R NSg/I/J/R/Dq . . > # > “ I’ll show you how I’ve gotten to feel about — things . Well , she was less than an # . K NSg/VB ISgPl+ NSg/C K VPp/J P NSg/I/VB J/P . NPl+ . NSg/VB/J/R . ISg+ VLPt VB/J/R/C/P C/P D/P > hour old and Tom was God knows where . I woke up out of the ether with an utterly # NSg NSg/J VB/C NPr/VB+ VLPt NPr/VB+ V3 NSg/R/C . ISg/#r+ NSg/VB/J NSg/VB/J/P NSg/VB/J/R/P P D Nᴹ/VB P D/P R > abandoned feeling , and asked the nurse right away if it was a boy or a girl . She # VP/J N🅪Sg/Vg/J . VB/C VP/J D NSg/VB+ NPr/VB/J VB/J NSg/C NPr/ISg+ VLPt D/P NSg/VB NPr/C D/P NSg/VB+ . ISg+ > told me it was a girl , and so I turned my head away and wept . ‘ All right , ’ I # VP NPr/ISg+ NPr/ISg+ VLPt D/P NSg/VB . VB/C NSg/I/J/R/C ISg/#r+ VP/J D$+ NPr/VB/J+ VB/J VB/C VB . Unlintable NSg/I/J/C/Dq NPr/VB/J . . ISg/#r+ > said , ‘ I’m glad it’s a girl . And I hope she’ll be a fool — that’s the best thing a # VP/J . Unlintable K NSg/VB/J K D/P NSg/VB+ . VB/C ISg/#r+ NPr🅪Sg/VB K NSg/VLXB D/P NSg/VB/J+ . NSg$ D NPr/VXB/JS NSg+ D/P > girl can be in this world , a beautiful little fool . ’ # NSg/VB+ NPr/VXB NSg/VLXB NPr/J/R/P I/Ddem NSg/VB+ . D/P NSg/J NPr/I/J/Dq NSg/VB/J+ . . > # > “ You see I think everything’s terrible anyhow , ” she went on in a convinced way . # . ISgPl+ NSg/VB ISg/#r+ NSg/VB NSg$ J J . . ISg+ NSg/VPt J/P NPr/J/R/P D/P VP/J NSg/J+ . > “ Everybody thinks so — the most advanced people . And I know . I’ve been everywhere # . NSg/I+ NPl/V3 NSg/I/J/R/C . D NSg/I/J/R/Dq VP/J+ NPl/VB+ . VB/C ISg/#r+ VB . K NSg/VLPp Nᴹ/R > and seen everything and done everything . ” Her eyes flashed around her in a # VB/C NSg/VPp NSg/I/VB+ VB/C NSg/VPp/J NSg/I/VB+ . . ISg/D$+ NPl/V3+ VP/J J/P ISg/D$+ NPr/J/R/P D/P > defiant way , rather like Tom’s , and she laughed with thrilling scorn . # NSg/J NSg/J+ . NPr/VB/J/R NSg/VB/J/C/P NPr$ . VB/C ISg+ VP/J P Nᴹ/Vg/J NSg/VB+ . > “ Sophisticated — God , I’m sophisticated ! ” # . VP/J . NPr/VB+ . K VP/J . . > # > The instant her voice broke off , ceasing to compel my attention , my belief , I # D+ NSg/VB/J+ ISg/D$+ NSg/VB+ NSg/VPt/J NSg/VB/J/P . Nᴹ/Vg/J P VB D$+ NSg+ . D$+ N🅪Sg+ . ISg/#r+ > felt the basic insincerity of what she had said . It made me uneasy , as though # N🅪Sg/VP/J D NPr/J Nᴹ P NSg/I+ ISg+ VP VP/J . NPr/ISg+ VP NPr/ISg+ NSg/VB/J . R/C/P C > the whole evening had been a trick of some sort to exact a contributary emotion # D+ NSg/J+ N🅪Sg/Vg/J+ VP NSg/VLPp D/P NSg/VB/J P I/J/R/Dq+ NSg/VB+ P VB/J D/P ? N🅪Sg+ > from me . I waited , and sure enough , in a moment she looked at me with an # P NPr/ISg+ . ISg/#r+ VP/J . VB/C J NSg/I . NPr/J/R/P D/P+ NSg+ ISg+ VP/J NSg/P NPr/ISg+ P D/P+ > absolute smirk on her lovely face , as if she had asserted her membership in a # NSg/J+ NSg/VB/J+ J/P ISg/D$+ NSg/J+ NSg/VB+ . R/C/P NSg/C ISg+ VP VP/J ISg/D$+ N🅪Sg/VB+ NPr/J/R/P D/P > rather distinguished secret society to which she and Tom belonged . # NPr/VB/J/R VP/J NSg/VB/J N🅪Sg P I/C+ ISg+ VB/C NPr/VB+ VP/J . > # > Inside , the crimson room bloomed with light . Tom and Miss Baker sat at either # NSg/J/P . D+ NSg/VB/J+ N🅪Sg/VB/J+ VP/J P N🅪Sg/VB/J+ . NPr/VB+ VB/C NSg/VB NPr+ NSg/VP/J NSg/P I/C > end of the long couch and she read aloud to him from the Saturday Evening # NSg/VB P D+ NPr/VB/J+ NSg/VB+ VB/C ISg+ NSg/VBP J P ISg+ P D+ NSg/VB+ N🅪Sg/Vg/J+ > Post — the words , murmurous and uninflected , running together in a soothing tune . # NPr🅪Sg/VB/P+ . D+ NPl/V3+ . J VB/C J . Nᴹ/Vg/J/P J NPr/J/R/P D/P Nᴹ/Vg/J NSg/VB+ . > The lamp - light , bright on his boots and dull on the autumn - leaf yellow of her # D NSg/VB+ . N🅪Sg/VB/J+ . NPr/VB/J J/P ISg/D$+ NPl/V3+ VB/C VB/J J/P D NPr🅪Sg/VB+ . NSg/VB NSg/VB/J P ISg/D$+ > hair , glinted along the paper as she turned a page with a flutter of slender # N🅪Sg/VB+ . VP/J P D+ N🅪Sg/VB/J+ R/C/P ISg+ VP/J D/P NPr/VB+ P D/P NSg/VB P J > muscles in her arms . # NPl/V3+ NPr/J/R/P ISg/D$+ NPl/V3+ . > # > When we came in she held us silent for a moment with a lifted hand . # NSg/I/C IPl+ NSg/VPt/P NPr/J/R/P ISg+ VP NPr/IPl+ NSg/J R/C/P D/P NSg+ P D/P+ VP/J NSg/VB+ . > # > “ To be continued , ” she said , tossing the magazine on the table , “ in our very # . P NSg/VLXB VP/J . . ISg+ VP/J . Nᴹ/Vg/J D NSg+ J/P D NSg/VB+ . . NPr/J/R/P D$+ J/R > next issue . ” # NSg/J/P NSg/VB+ . . > # > Her body asserted itself with a restless movement of her knee , and she stood up . # ISg/D$+ NSg/VB+ VP/J ISg+ P D/P J N🅪Sg P ISg/D$+ NSg/VB+ . VB/C ISg+ VP NSg/VB/J/P . > # > “ Ten o’clock , ” she remarked , apparently finding the time on the ceiling . “ Time # . NSg R . . ISg+ VP/J . R Nᴹ/Vg/J D N🅪Sg/VB/J+ J/P D+ NSg/VB+ . . N🅪Sg/VB/J > for this good girl to go to bed . ” # R/C/P I/Ddem+ NPr/VB/J NSg/VB+ P NSg/VB/J P NSg/VBP/J . . > # > “ Jordan’s going to play in the tournament tomorrow , ” explained Daisy , “ over at # . NPr$ Nᴹ/Vg/J P N🅪Sg/VB NPr/J/R/P D NSg+ NSg+ . . VP/J NPr+ . . NSg/J/P NSg/P > Westchester . ” # ? . . > # > “ Oh — you’re Jordan Baker . ” # . NPr/VB . K NPr+ NPr+ . . > # > I knew now why her face was familiar — its pleasing contemptuous expression had # ISg/#r+ VPt NSg/J/R/C NSg/VB ISg/D$+ NSg/VB+ VLPt NSg/J . ISg/D$+ Nᴹ/Vg/J J N🅪Sg+ VP > looked out at me from many rotogravure pictures of the sporting life at # VP/J NSg/VB/J/R/P NSg/P NPr/ISg+ P NSg/I/J/Dq NSg NPl/V3 P D Nᴹ/Vg/J N🅪Sg/VB+ NSg/P > Asheville and Hot Springs and Palm Beach . I had heard some story of her too , a # NPr VB/C NSg/VB/J NPl/V3 VB/C NSg/VB+ NPr/VB+ . ISg/#r+ VP VP/J I/J/R/Dq NSg/VB P ISg/D$+ R . D/P > critical , unpleasant story , but what it was I had forgotten long ago . # NSg/J . NSg/J+ NSg/VB+ . NSg/C/P NSg/I+ NPr/ISg+ VLPt ISg/#r+ VP NSg/VPp/J NPr/VB/J J/P . > # > “ Good night , ” she said softly . “ Wake me at eight , won’t you . ” # . NPr/VB/J+ N🅪Sg/VB+ . . ISg+ VP/J R . . NPr/VB NPr/ISg+ NSg/P NSg/J . VXB ISgPl+ . . > # > “ If you’ll get up . ” # . NSg/C K NSg/VB NSg/VB/J/P . . > # > “ I will . Good night , Mr . Carraway . See you anon . ” # . ISg/#r+ NPr/VXB . NPr/VB/J N🅪Sg/VB+ . NSg+ . ? . NSg/VB ISgPl+ NSg/J+ . . > # > “ Of course you will , ” confirmed Daisy . “ In fact I think I’ll arrange a marriage . # . P NSg/VB+ ISgPl+ NPr/VXB . . VP/J NPr+ . . NPr/J/R/P NSg+ ISg/#r+ NSg/VB K NSg/VB D/P N🅪Sg+ . > Come over often , Nick , and I’ll sort of — oh — fling you together . You know — lock you # NSg/VBPp/P NSg/J/P R . NPr/VB+ . VB/C K NSg/VB+ P . NPr/VB . Nᴹ/Vg/J ISgPl+ J . ISgPl+ VB . NSg/VB+ ISgPl+ > up accidentally in linen closets and push you out to sea in a boat , and all that # NSg/VB/J/P R NPr/J/R/P N🅪Sg/J+ NPl/V3 VB/C NSg/VB ISgPl+ NSg/VB/J/R/P P NSg NPr/J/R/P D/P NSg/VB+ . VB/C NSg/I/J/C/Dq NSg/I/C/Ddem > sort of thing — — — ” # NSg/VB P NSg+ . . . . > # > “ Good night , ” called Miss Baker from the stairs . “ I haven’t heard a word . ” # . NPr/VB/J+ N🅪Sg/VB+ . . VP/J NSg/VB NPr+ P D+ NPl+ . . ISg/#r+ VXB VP/J D/P NSg/VB+ . . > # > “ She’s a nice girl , ” said Tom after a moment . “ They oughtn’t to let her run # . K D/P+ NPr/J NSg/VB+ . . VP/J NPr/VB+ P D/P NSg+ . . IPl+ VXB P NSg/VBP ISg/D$+ NSg/VBPp > around the country this way . ” # J/P D NSg/J+ I/Ddem NSg/J+ . . > # > “ Who oughtn’t to ? ” inquired Daisy coldly . # . NPr/I+ VXB P . . VP/J NPr+ R . > # > “ Her family . ” # . ISg/D$+ N🅪Sg/J+ . . > # > “ Her family is one aunt about a thousand years old . Besides , Nick’s going to # . ISg/D$+ N🅪Sg/J+ VL3 NSg/I/J NSg J/P D/P+ NSg+ NPl+ NSg/J . R/P . NPr$ Nᴹ/Vg/J P > look after her , aren’t you , Nick ? She’s going to spend lots of week - ends out # NSg/VB P ISg/D$+ . VB ISgPl+ . NPr/VB+ . K Nᴹ/Vg/J P NSg/VB NPl/V3 P NSg/J+ . NPl/V3+ NSg/VB/J/R/P > here this summer . I think the home influence will be very good for her . ” # J/R I/Ddem NPr🅪Sg/VB+ . ISg/#r+ NSg/VB D+ NSg/VB/J+ N🅪Sg/VB+ NPr/VXB NSg/VLXB J/R NPr/VB/J R/C/P ISg/D$+ . . > # > Daisy and Tom looked at each other for a moment in silence . # NPr VB/C NPr/VB+ VP/J NSg/P Dq NSg/VB/J R/C/P D/P NSg NPr/J/R/P NSg/VB+ . > # > “ Is she from New York ? ” I asked quickly . # . VL3 ISg+ P NSg/J+ NPr+ . . ISg/#r+ VP/J R . > # > “ From Louisville . Our white girlhood was passed together there . Our beautiful # . P NPr . D$+ NPr🅪Sg/VB/J N🅪Sg VLPt VP/J J R . D$+ NSg/J > white — — — ” # NPr🅪Sg/VB/J . . . . > # > “ Did you give Nick a little heart to heart talk on the veranda ? ” demanded Tom # . VXPt ISgPl+ NSg/VB NPr/VB+ D/P NPr/I/J/Dq N🅪Sg/VB+ P N🅪Sg/VB N🅪Sg/VB J/P D+ NSg/NoAm/Br+ . . VP/J NPr/VB+ > suddenly . # R . > # > “ Did I ? ” She looked at me . “ I can’t seem to remember , but I think we talked # . VXPt ISg/#r+ . . ISg+ VP/J NSg/P NPr/ISg+ . . ISg/#r+ VXB VB P NSg/VB . NSg/C/P ISg/#r+ NSg/VB IPl+ VP/J > about the Nordic race . Yes , I’m sure we did . It sort of crept up on us and first # J/P D NSg/J N🅪Sg/VB+ . NPl/VB . K J IPl+ VXPt . NPr/ISg+ NSg/VB P VP NSg/VB/J/P J/P NPr/IPl+ VB/C NSg/J+ > thing you know — — — ” # NSg+ ISgPl+ VB . . . . > # > “ Don’t believe everything you hear , Nick , ” he advised me . # . VXB VB NSg/I/VB+ ISgPl+ VB . NPr/VB+ . . NPr/ISg+ VP/J NPr/ISg+ . > # > I said lightly that I had heard nothing at all , and a few minutes later I got up # ISg/#r+ VP/J R NSg/I/C/Ddem ISg/#r+ VP VP/J NSg/I/J+ NSg/P NSg/I/J/C/Dq . VB/C D/P+ NSg/I/Dq+ NPl/V3+ JC ISg/#r+ VP NSg/VB/J/P > to go home . They came to the door with me and stood side by side in a cheerful # P NSg/VB/J NSg/VB/J+ . IPl+ NSg/VPt/P P D+ NSg/VB+ P NPr/ISg+ VB/C VP NSg/VB/J+ NSg/P NSg/VB/J+ NPr/J/R/P D/P J > square of light . As I started my motor Daisy peremptorily called : “ Wait ! # NSg/VB/J P N🅪Sg/VB/J+ . R/C/P ISg/#r+ VP/J D$+ NSg/VB/J+ NPr+ R VP/J . . NSg/VB . > # > “ I forgot to ask you something , and it’s important . We heard you were engaged to # . ISg/#r+ VPt P NSg/VB ISgPl+ NSg/I/J+ . VB/C K J . IPl+ VP/J ISgPl+ NSg/VLPt VP/J P > a girl out West . ” # D/P+ NSg/VB+ NSg/VB/J/R/P NPr/VB/J+ . . > # > “ That’s right , ” corroborated Tom kindly . “ We heard that you were engaged . ” # . NSg$ NPr/VB/J . . VP/J NPr/VB+ J/R . . IPl+ VP/J NSg/I/C/Ddem ISgPl+ NSg/VLPt VP/J . . > # > “ It’s a libel . I’m too poor . ” # . K D/P+ NSg/VB+ . K R NSg/VB/J . . > # > “ But we heard it , ” insisted Daisy , surprising me by opening up again in a # . NSg/C/P IPl+ VP/J NPr/ISg+ . . VP/J NPr+ . Nᴹ/Vg/J NPr/ISg+ NSg/P Nᴹ/Vg/J NSg/VB/J/P P NPr/J/R/P D/P+ > flower - like way . “ We heard it from three people , so it must be true . ” # NSg/VB+ . NSg/VB/J/C/P NSg/J+ . . IPl+ VP/J NPr/ISg+ P NSg+ NPl/VB+ . NSg/I/J/R/C NPr/ISg+ NSg/VXB NSg/VLXB NSg/VB/J . . > # > Of course I knew what they were referring to , but I wasn’t even vaguely engaged . # P NSg/VB+ ISg/#r+ VPt NSg/I+ IPl+ NSg/VLPt NSg/Vg P . NSg/C/P ISg/#r+ VPt NSg/VB/J/R R VP/J . > The fact that gossip had published the banns was one of the reasons I had come # D+ NSg+ NSg/I/C/Ddem+ N🅪Sg/VB+ VP VP/J D NSg VLPt NSg/I/J P D NPl/V3+ ISg/#r+ VP NSg/VBPp/P > East . You can’t stop going with an old friend on account of rumors , and on the # NPr/J+ . ISgPl+ VXB NSg/VB Nᴹ/Vg/J P D/P NSg/J NPr/VB/J+ J/P NSg/VB P NPl/V3/Am+ . VB/C J/P D > other hand I had no intention of being rumored into marriage . # NSg/VB/J NSg/VB+ ISg/#r+ VP NSg/Dq/P NSg/VB P N🅪Sg/VLg/J/C VP/J/Am P N🅪Sg+ . > # > Their interest rather touched me and made them less remotely rich — nevertheless , # D$+ N🅪Sg/VB+ NPr/VB/J/R VP/J NPr/ISg+ VB/C VP NSg/IPl+ VB/J/R/C/P R NPr/VB/J . R . > I was confused and a little disgusted as I drove away . It seemed to me that the # ISg/#r+ VLPt VP/J VB/C D/P NPr/I/J/Dq VP/J R/C/P ISg/#r+ NSg/VPt VB/J . NPr/ISg+ VP/J P NPr/ISg+ NSg/I/C/Ddem D+ > thing for Daisy to do was to rush out of the house , child in arms — but apparently # NSg+ R/C/P NPr+ P VXB VLPt P NPr/VB/J NSg/VB/J/R/P P D+ NPr/VB+ . NSg/VB+ NPr/J/R/P NPl/V3+ . NSg/C/P R > there were no such intentions in her head . As for Tom , the fact that he “ had # R+ NSg/VLPt NSg/Dq/P NSg/I NPl/V3+ NPr/J/R/P ISg/D$+ NPr/VB/J+ . R/C/P R/C/P NPr/VB+ . D+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ . VP > some woman in New York ” was really less surprising than that he had been # I/J/R/Dq NSg/VB NPr/J/R/P NSg/J+ NPr+ . VLPt R VB/J/R/C/P Nᴹ/Vg/J C/P NSg/I/C/Ddem NPr/ISg+ VP NSg/VLPp > depressed by a book . Something was making him nibble at the edge of stale ideas # VP/J NSg/P D/P+ NSg/VB+ . NSg/I/J+ VLPt Nᴹ/Vg/J ISg+ NSg/VB NSg/P D NSg/VB P NSg/VB/J+ NPl+ > as if his sturdy physical egotism no longer nourished his peremptory heart . # R/C/P NSg/C ISg/D$+ NSg/J NSg/J NSg NSg/Dq/P NSg/JC VP/J+ ISg/D$+ NSg/J N🅪Sg/VB+ . > # > Already it was deep summer on roadhouse roofs and in front of wayside garages , # R NPr/ISg+ VLPt NSg/J NPr🅪Sg/VB J/P NSg+ NPl/V3+ VB/C NPr/J/R/P NSg/VB/J+ P NSg/J NPl/V3 . > where new red gaspumps sat out in pools of light , and when I reached my estate # NSg/R/C NSg/J N🅪Sg/J ? NSg/VP/J NSg/VB/J/R/P NPr/J/R/P NPl/V3 P N🅪Sg/VB/J+ . VB/C NSg/I/C ISg/#r+ VP/J D$+ NSg/VB/J+ > at West Egg I ran the car under its shed and sat for a while on an abandoned # NSg/P NPr/VB/J+ N🅪Sg/VB+ ISg/#r+ NSg/VPt D NSg+ NSg/J/P ISg/D$+ NSg/VP+ VB/C NSg/VP/J R/C/P D/P NSg/VB/C/P+ J/P D/P VP/J > grass roller in the yard . The wind had blown off , leaving a loud , bright night , # NPr🅪Sg/VB+ NSg/VB NPr/J/R/P D NSg/VB+ . D+ N🅪Sg/VB+ VP VPp/J NSg/VB/J/P . Nᴹ/Vg/J D/P NSg/J . NPr/VB/J N🅪Sg/VB+ . > with wings beating in the trees and a persistent organ sound as the full bellows # P NPl/V3+ Nᴹ/Vg/J NPr/J/R/P D+ NPl/V3+ VB/C D/P J NSg/VB N🅪Sg/VB/J+ R/C/P D NSg/VB/J NPl/V3 > of the earth blew the frogs full of life . The silhouette of a moving cat wavered # P D NPrᴹ/VB+ NSg/VPt/J D NPl/V3 NSg/VB/J P N🅪Sg/VB+ . D NSg/VB P D/P+ Nᴹ/Vg/J NSg/VB/J+ VP/J > across the moonlight , and turning my head to watch it , I saw that I was not # NSg/P D+ N🅪Sg/VB+ . VB/C Nᴹ/Vg/J D$+ NPr/VB/J+ P NSg/VB NPr/ISg+ . ISg/#r+ NSg/VPt NSg/I/C/Ddem ISg/#r+ VLPt NSg/R/C > alone — fifty feet away a figure had emerged from the shadow of my neighbor’s # J . NSg NPl+ VB/J D/P+ NSg/VB+ VP VP/J P D NSg/VB/J P D$+ NSg$/Am > mansion and was standing with his hands in his pockets regarding the silver # NSg+ VB/C VLPt Nᴹ/Vg/J P ISg/D$+ NPl/V3+ NPr/J/R/P ISg/D$+ NPl/V3+ Nᴹ/Vg/J D Nᴹ/VB/J+ > pepper of the stars . Something in his leisurely movements and the secure # N🅪Sg/VB P D NPl/V3+ . NSg/I/J+ NPr/J/R/P ISg/D$+ R+ NPl+ VB/C D VB/J > position of his feet upon the lawn suggested that it was Mr . Gatsby himself , # NSg/VB P ISg/D$+ NPl+ P D+ NSg/VB+ VP/J NSg/I/C/Ddem NPr/ISg+ VLPt NSg+ . NPr ISg+ . > come out to determine what share was his of our local heavens . # NSg/VBPp/P NSg/VB/J/R/P P VB NSg/I+ NSg/VB VLPt ISg/D$ P D$+ NSg/J NPl/V3+ . > # > I decided to call to him . Miss Baker had mentioned him at dinner , and that would # ISg/#r+ NSg/VP/J P NSg/VB P ISg+ . NSg/VB NPr+ VP VP/J ISg+ NSg/P N🅪Sg/VB+ . VB/C NSg/I/C/Ddem+ VXB > do for an introduction . But I didn’t call to him , for he gave a sudden # VXB R/C/P D/P+ NSg+ . NSg/C/P ISg/#r+ VXPt NSg/VB P ISg+ . R/C/P NPr/ISg+ VPt D/P NSg/J > intimation that he was content to be alone — he stretched out his arms toward the # NSg NSg/I/C/Ddem NPr/ISg+ VLPt N🅪Sg/VB/J+ P NSg/VLXB J . NPr/ISg+ VP/J NSg/VB/J/R/P ISg/D$+ NPl/V3+ J/P D > dark water in a curious way , and , far as I was from him , I could have sworn he # NSg/VB/J N🅪Sg/VB+ NPr/J/R/P D/P J NSg/J+ . VB/C . NSg/VB/J R/C/P ISg/#r+ VLPt P ISg+ . ISg/#r+ NSg/VXB NSg/VXB VB/J NPr/ISg+ > was trembling . Involuntarily I glanced seaward — and distinguished nothing except # VLPt Nᴹ/Vg/J . R ISg/#r+ VP/J NSg/J . VB/C VP/J NSg/I/J+ VB/C/P > a single green light , minute and far away , that might have been the end of a # D/P NSg/VB/J NPr🅪Sg/VB/J N🅪Sg/VB/J+ . NSg/VB/J+ VB/C NSg/VB/J VB/J . NSg/I/C/Ddem+ Nᴹ/VXB/J NSg/VXB NSg/VLPp D NSg/VB P D/P > dock . When I looked once more for Gatsby he had vanished , and I was alone again # NSg/VB+ . NSg/I/C ISg/#r+ VP/J NSg/C NPr/I/J/R/Dq R/C/P NPr NPr/ISg+ VP VP/J . VB/C ISg/#r+ VLPt J P > in the unquiet darkness . # NPr/J/R/P D VB/J Nᴹ+ . > # > CHAPTER II # HeadingStart NSg/VB+ #r > # > About half way between West Egg and New York the motor road hastily joins the # J/P N🅪Sg/J/P+ NSg/J NSg/P NPr/VB/J+ N🅪Sg/VB VB/C NSg/J+ NPr+ D+ NSg/VB/J+ N🅪Sg/J+ R NPl/V3 D+ > railroad and runs beside it for a quarter of a mile , so as to shrink away from a # NSg/VB+ VB/C NPl/V3 P NPr/ISg+ R/C/P D/P NSg/VB/J P D/P NSg+ . NSg/I/J/R/C R/C/P P NSg/VB VB/J P D/P > certain desolate area of land . This is a valley of ashes — a fantastic farm where # I/J VB/J N🅪Sg P NPr🅪Sg/VB+ . I/Ddem+ VL3 D/P NSg/VB P NPl/V3+ . D/P+ NSg/J+ NSg/VB+ NSg/R/C > ashes grow like wheat into ridges and hills and grotesque gardens ; where ashes # NPl/V3+ VB NSg/VB/J/C/P NSg/J+ P NPl/V3 VB/C NPl/V3 VB/C NSg/J NPl/V3+ . NSg/R/C NPl/V3+ > take the forms of houses and chimneys and rising smoke and , finally , with a # NSg/VB D NPl/V3 P NPl/V3 VB/C NPl/V3+ VB/C Nᴹ/Vg/J/P N🅪Sg/VB+ VB/C . R . P D/P > transcendent effort , of ash - gray men , who move dimly and already crumbling # NSg/J N🅪Sg/VB+ . P N🅪Sg/VB+ . NPr🅪Sg/VB/J/Am NPl+ . NPr/I+ NSg/VB R VB/C R Nᴹ/Vg/J > through the powdery air . Occasionally a line of gray cars crawls along an # NSg/J/P D J N🅪Sg/VB+ . R D/P NSg/VB P NPr🅪Sg/VB/J/Am+ NPl+ NPl/V3 P D/P+ > invisible track , gives out a ghastly creak , and comes to rest , and immediately # J+ NSg/VB+ . NPl/V3 NSg/VB/J/R/P D/P J NSg/VB . VB/C NPl/V3 P NSg/VB . VB/C R > the ash - gray men swarm up with leaden spades and stir up an impenetrable cloud , # D N🅪Sg/VB+ . NPr🅪Sg/VB/J/Am NPl+ NSg/VB NSg/VB/J/P P VB/J NPl/V3 VB/C NSg/VB NSg/VB/J/P D/P NSg/J N🅪Sg/VB+ . > which screens their obscure operations from your sight . # I/C+ NPl/V3+ D$+ VB/J NPl+ P D$+ N🅪Sg/VB+ . > # > But above the gray land and the spasms of bleak dust which drift endlessly over # NSg/C/P NSg/J/P D+ NPr🅪Sg/VB/J/Am+ NPr🅪Sg/VB+ VB/C D NPl/V3 P NSg/J Nᴹ/VB+ I/C+ NSg/VB R NSg/J/P > it , you perceive , after a moment , the eyes of Doctor T. J. Eckleburg . The eyes # NPr/ISg+ . ISgPl+ VB . P D/P NSg+ . D NPl/V3 P NSg/VB+ ? ? ? . D NPl/V3 > of Doctor T. J. Eckleburg are blue and gigantic — their retinas are one yard high . # P NSg/VB+ ? ? ? VLB N🅪Sg/VB/J VB/C J . D$+ NPl VLB NSg/I/J NSg/VB+ NSg/VB/J/R . > They look out of no face , but , instead , from a pair of enormous yellow # IPl+ NSg/VB NSg/VB/J/R/P P NSg/Dq/P+ NSg/VB+ . NSg/C/P . R . P D/P NSg/VB+ P J NSg/VB/J > spectacles which pass over a nonexistent nose . Evidently some wild wag of an # NPl I/C+ NSg/VB NSg/J/P D/P NSg/J NSg/VB+ . R I/J/R/Dq NSg/VB/J NSg/VB P D/P > oculist set them there to fatten his practice in the borough of Queens , and then # NSg NPr/VBP/J NSg/IPl+ R+ P VB ISg/D$+ NSg/VB+ NPr/J/R/P D NSg+ P NPrPl/V3 . VB/C NSg/J/R/C > sank down himself into eternal blindness , or forgot them and moved away . But his # VPt N🅪Sg/VB/J/P ISg+ P NSg/J NSg+ . NPr/C VPt NSg/IPl+ VB/C VP/J VB/J . NSg/C/P ISg/D$+ > eyes , dimmed a little by many paintless days , under sun and rain , brood on over # NPl/V3+ . VP D/P NPr/I/J/Dq NSg/P NSg/I/J/Dq J NPl+ . NSg/J/P NPr/VB VB/C N🅪Sg/VB+ . NSg/VB/J J/P NSg/J/P > the solemn dumping ground . # D J Nᴹ/Vg/J+ N🅪Sg/VB/J+ . > # > The valley of ashes is bounded on one side by a small foul river , and , when the # D NSg/VB P NPl/V3+ VL3 VP/J J/P NSg/I/J+ NSg/VB/J+ NSg/P D/P+ NPr/VB/J+ NSg/VB/J+ NSg/VB+ . VB/C . NSg/I/C D > drawbridge is up to let barges through , the passengers on waiting trains can # NSg VL3 NSg/VB/J/P P NSg/VBP NPl/V3+ NSg/J/P . D NPl/V3+ J/P Nᴹ/Vg/J NPl/V3+ NPr/VXB > stare at the dismal scene for as long as half an hour . There is always a halt # NSg/VB+ NSg/P D NSg/J NSg/VB+ R/C/P R/C/P NPr/VB/J R/C/P N🅪Sg/J/P+ D/P NSg+ . R+ VL3 R D/P+ NSg/VB/J+ > there of at least a minute , and it was because of this that I first met Tom # R P NSg/P NSg/J/Dq D/P+ NSg/VB/J+ . VB/C NPr/ISg+ VLPt C/P P I/Ddem NSg/I/C/Ddem ISg/#r+ NSg/J VP NPr/VB+ > Buchanan’s mistress . # NPr$ NSg/VB+ . > # > The fact that he had one was insisted upon wherever he was known . His # D+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ VP NSg/I/J+ VLPt VP/J P C NPr/ISg+ VLPt VPp/J . ISg/D$+ > acquaintances resented the fact that he turned up in popular cafés with her and , # NPl+ VP/J D+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ VP/J NSg/VB/J/P NPr/J/R/P NSg/J NPl P ISg/D$+ VB/C . > leaving her at a table , sauntered about , chatting with whomsoever he knew . # Nᴹ/Vg/J ISg/D$+ NSg/P D/P NSg/VB+ . VP/J J/P . NSg/Vg P I NPr/ISg+ VPt . > Though I was curious to see her , I had no desire to meet her — but I did . I went # C ISg/#r+ VLPt J P NSg/VB ISg/D$+ . ISg/#r+ VP NSg/Dq/P+ N🅪Sg/VB+ P NSg/VB/J ISg/D$+ . NSg/C/P ISg/#r+ VXPt . ISg/#r+ NSg/VPt > up to New York with Tom on the train one afternoon , and when we stopped by the # NSg/VB/J/P P NSg/J NPr+ P NPr/VB+ J/P D+ NSg/VB+ NSg/I/J+ N🅪Sg+ . VB/C NSg/I/C IPl+ VP/J NSg/P D > ashheaps he jumped to his feet and , taking hold of my elbow , literally forced me # ? NPr/ISg+ VP/J P ISg/D$+ NPl+ VB/C . NSg/Vg/J NSg/VB/J P D$+ NSg/VB+ . R VP/J NPr/ISg+ > from the car . # P D NSg+ . > # > “ We're getting off , ” he insisted . “ I want you to meet my girl . ” # . K NSg/Vg NSg/VB/J/P . . NPr/ISg+ VP/J . . ISg/#r+ NSg/VB ISgPl+ P NSg/VB/J D$+ NSg/VB+ . . > # > I think he’d tanked up a good deal at luncheon , and his determination to have my # ISg/#r+ NSg/VB K VP/J NSg/VB/J/P D/P NPr/VB/J NSg/VB/J+ NSg/P NSg/VB+ . VB/C ISg/D$+ NSg+ P NSg/VXB D$+ > company bordered on violence . The supercilious assumption was that on Sunday # N🅪Sg+ VP/J J/P Nᴹ/VB+ . D J N🅪Sg+ VLPt NSg/I/C/Ddem+ J/P NSg/VB+ > afternoon I had nothing better to do . # N🅪Sg+ ISg/#r+ VP NSg/I/J+ NSg/VXB/JC P VXB . > # > I followed him over a low whitewashed railroad fence , and we walked back a # ISg/#r+ VP/J ISg+ NSg/J/P D/P NSg/VB/J/R VP/J NSg/VB+ NSg/VB+ . VB/C IPl+ VP/J NSg/VB/J D/P > hundred yards along the road under Doctor Eckleburg’s persistent stare . The only # NSg NPl/V3+ P D N🅪Sg/J+ NSg/J/P NSg/VB+ ? J NSg/VB+ . D J/R/C > building in sight was a small block of yellow brick sitting on the edge of the # N🅪Sg/Vg/J NPr/J/R/P N🅪Sg/VB+ VLPt D/P NPr/VB/J NSg/VB P NSg/VB/J+ N🅪Sg/VB/J+ NSg/Vg/J J/P D NSg/VB P D+ > waste land , a sort of compact Main Street ministering to it , and contiguous to # NSg/VB/J+ NPr🅪Sg/VB+ . D/P NSg/VB P NSg/VB/J+ NSg/VB/J+ NSg/VB/J+ Nᴹ/Vg/J P NPr/ISg+ . VB/C J P > absolutely nothing . One of the three shops it contained was for rent and another # R NSg/I/J+ . NSg/I/J P D+ NSg+ NPl/V3+ NPr/ISg+ VP/J VLPt R/C/P Nᴹ/VB/J+ VB/C I/D+ > was an all - night restaurant , approached by a trail of ashes ; the third was a # VLPt D/P NSg/I/J/C/Dq . N🅪Sg/VB+ NSg+ . VP/J NSg/P D/P NSg/VB P NPl/V3+ . D NSg/VB/J VLPt D/P > garage — Repairs . George B. Wilson . Cars bought and sold . — and I followed Tom # NSg/VB . NPl/V3+ . NPr+ ? NPr+ . NPl+ NSg/VP VB/C NSg/VP . . VB/C ISg/#r+ VP/J NPr/VB+ > inside . # NSg/J/P . > # > The interior was unprosperous and bare ; the only car visible was the # D NSg/J VLPt J VB/C NSg/VB/J . D J/R/C NSg+ J VLPt D > dust - covered wreck of a Ford which crouched in a dim corner . It had occurred to # Nᴹ/VB+ . VP/J NSg/VB P D/P NPr/VB+ I/C+ VP/J NPr/J/R/P D/P NSg/VB/J NSg/VB+ . NPr/ISg+ VP VP P > me that this shadow of a garage must be a blind , and that sumptuous and romantic # NPr/ISg+ NSg/I/C/Ddem I/Ddem NSg/VB/J P D/P+ NSg/VB+ NSg/VXB NSg/VLXB D/P NSg/VB/J . VB/C NSg/I/C/Ddem+ J VB/C NSg/J > apartments were concealed overhead , when the proprietor himself appeared in the # NPl+ NSg/VLPt VP/J NSg/J/P+ . NSg/I/C D NSg ISg+ VP/J NPr/J/R/P D > door of an office , wiping his hands on a piece of waste . He was a blond , # NSg/VB P D/P NSg/VB+ . Nᴹ/Vg/J ISg/D$+ NPl/V3+ J/P D/P NSg/VB P NSg/VB/J+ . NPr/ISg+ VLPt D/P NSg/VB/J . > spiritless man , anæmic , and faintly handsome . When he saw us a damp gleam of # J NPr/VB/J+ . NSg/J . VB/C R VB/J . NSg/I/C NPr/ISg+ NSg/VPt NPr/IPl+ D/P Nᴹ/VB/J NSg/VB P > hope sprang into his light blue eyes . # NPr🅪Sg/VB VB P ISg/D$+ N🅪Sg/VB/J+ N🅪Sg/VB/J+ NPl/V3+ . > # > “ Hello , Wilson , old man , ” said Tom , slapping him jovially on the shoulder . # . NSg/VB . NPr+ . NSg/J+ NPr/VB/J+ . . VP/J NPr/VB+ . NSg/Vg/J ISg+ R J/P D NSg/VB+ . > ‘ ‘ How’s business ? ” # Unlintable Unlintable NSg$ N🅪Sg/J+ . . > # > “ I can’t complain , ” answered Wilson unconvincingly . “ When are you going to sell # . ISg/#r+ VXB VB . . VP/J NPr+ R . . NSg/I/C VLB ISgPl+ Nᴹ/Vg/J P NSg/VB > me that car ? ” # NPr/ISg+ NSg/I/C/Ddem+ NSg+ . . > # > “ Next week ; I’ve got my man working on it now . ” # . NSg/J/P+ NSg/J+ . K VP D$+ NPr/VB/J+ Nᴹ/Vg/J J/P NPr/ISg+ NSg/J/R/C . . > # > “ Works pretty slow , don’t he ? ” # . NPl/V3+ NSg/VB/J/R NSg/VB/J . VXB NPr/ISg+ . . > # > “ No , he doesn’t , ” said Tom coldly . “ And if you feel that way about it , maybe I’d # . NSg/Dq/P . NPr/ISg+ VX3 . . VP/J NPr/VB+ R . . VB/C NSg/C ISgPl+ NSg/I/VB NSg/I/C/Ddem+ NSg/J+ J/P NPr/ISg+ . NSg/J/R K > better sell it somewhere else after all . ” # NSg/VXB/JC NSg/VB NPr/ISg+ NSg NSg/J/C P NSg/I/J/C/Dq . . > # > “ I don’t mean that , ” explained Wilson quickly . “ I just meant — — — ” # . ISg/#r+ VXB NSg/VB/J NSg/I/C/Ddem+ . . VP/J NPr+ R . . ISg/#r+ J/R VP . . . . > # > His voice faded off and Tom glanced impatiently around the garage . Then I heard # ISg/D$+ NSg/VB+ J NSg/VB/J/P VB/C NPr/VB+ VP/J R J/P D+ NSg/VB+ . NSg/J/R/C ISg/#r+ VP/J > footsteps on a stairs , and in a moment the thickish figure of a woman blocked # NPl+ J/P D/P+ NPl+ . VB/C NPr/J/R/P D/P+ NSg+ D J NSg/VB P D/P NSg/VB+ VP/J > out the light from the office door . She was in the middle thirties , and faintly # NSg/VB/J/R/P D N🅪Sg/VB/J+ P D NSg/VB+ NSg/VB+ . ISg+ VLPt NPr/J/R/P D NSg/VB/J NPl+ . VB/C R > stout , but she carried her flesh sensuously as some women can . Her face , above a # NPr/VB/J+ . NSg/C/P ISg+ VP/J ISg/D$+ N🅪Sg/VB/J+ R R/C/P I/J/R/Dq+ NPl+ NPr/VXB . ISg/D$+ NSg/VB+ . NSg/J/P D/P > spotted dress of dark blue crêpe - de - chine , contained no facet or gleam of # VP/J NSg/VB P NSg/VB/J N🅪Sg/VB/J NSg/VB . NPr+ . NSg/VB . VP/J NSg/Dq/P NSg/VB+ NPr/C NSg/VB P > beauty , but there was an immediately perceptible vitality about her as if the # N🅪Sg/VB/J+ . NSg/C/P R+ VLPt D/P R NSg/J Nᴹ+ J/P ISg/D$+ R/C/P NSg/C D > nerves of her body were continually smouldering . She smiled slowly and , walking # NPl/V3 P ISg/D$+ NSg/VB+ NSg/VLPt R Nᴹ/Vg/J/Comm . ISg+ VP/J R VB/C . Nᴹ/Vg/J > through her husband as if he were a ghost , shook hands with Tom , looking him # NSg/J/P ISg/D$+ NSg/VB+ R/C/P NSg/C NPr/ISg+ NSg/VLPt D/P NSg/VB/J . NSg/VPt/J NPl/V3+ P NPr/VB+ . Nᴹ/Vg/J ISg+ > flush in the eye . Then she wet her lips , and without turning around spoke to her # NSg/VB/J+ NPr/J/R/P D+ NSg/VB+ . NSg/J/R/C ISg+ NSg/VP/J ISg/D$+ NPl/V3+ . VB/C C/P Nᴹ/Vg/J J/P NSg/VPt P ISg/D$+ > husband in a soft , coarse voice : # NSg/VB+ NPr/J/R/P D/P NSg/J . J+ NSg/VB+ . > # > “ Get some chairs , why don’t you , so somebody can sit down . ” # . NSg/VB I/J/R/Dq+ NPl/V3+ . NSg/VB VXB ISgPl+ . NSg/I/J/R/C NSg/I+ NPr/VXB NSg/VB N🅪Sg/VB/J/P . . > # > “ Oh , sure , ” agreed Wilson hurriedly , and went toward the little office , mingling # . NPr/VB . J . . VP/J NPr+ R . VB/C NSg/VPt J/P D NPr/I/J/Dq NSg/VB+ . Nᴹ/Vg/J+ > immediately with the cement color of the walls . A white ashen dust veiled his # R P D N🅪Sg/VB+ N🅪Sg/VB/J/Am P D NPrPl/V3+ . D/P NPr🅪Sg/VB/J J Nᴹ/VB+ VP/J ISg/D$+ > dark suit and his pale hair as it veiled everything in the vicinity — except his # NSg/VB/J NSg/VB+ VB/C ISg/D$+ NSg/VB/J N🅪Sg/VB+ R/C/P NPr/ISg+ VP/J NSg/I/VB+ NPr/J/R/P D NSg . VB/C/P ISg/D$+ > wife , who moved close to Tom . # NSg/VB/J+ . NPr/I+ VP/J NSg/VB/J P NPr/VB+ . > # > “ I want to see you , ” said Tom intently . “ Get on the next train . ” # . ISg/#r+ NSg/VB P NSg/VB ISgPl+ . . VP/J NPr/VB+ R . . NSg/VB J/P D+ NSg/J/P+ NSg/VB+ . . > # > “ All right . ” # . NSg/I/J/C/Dq NPr/VB/J . . > # > “ I’ll meet you by the news - stand on the lower level . ” # . K NSg/VB/J ISgPl+ NSg/P D Nᴹ/VB+ . NSg/VB J/P D NSg/VB/JC NSg/VB/J+ . . > # > She nodded and moved away from him just as George Wilson emerged with two chairs # ISg+ VP VB/C VP/J VB/J P ISg+ J/R R/C/P NPr+ NPr+ VP/J P NSg NPl/V3+ > from his office door . # P ISg/D$+ NSg/VB+ NSg/VB+ . > # > We waited for her down the road and out of sight . It was a few days before the # IPl+ VP/J R/C/P ISg/D$+ N🅪Sg/VB/J/P D+ N🅪Sg/J+ VB/C NSg/VB/J/R/P P N🅪Sg/VB+ . NPr/ISg+ VLPt D/P NSg/I/Dq NPl C/P D > Fourth of July , and a gray , scrawny Italian child was setting torpedoes in a row # NPr/VB/J P NPr+ . VB/C D/P NPr🅪Sg/VB/J/Am . J N🅪Sg/J NSg/VB+ VLPt N🅪Sg/Vg/J+ NPl/VB NPr/J/R/P D/P NSg/VB+ > along the railroad track . # P D NSg/VB+ NSg/VB+ . > # > “ Terrible place , isn’t it , ” said Tom , exchanging a frown with Doctor Eckleburg . # . J+ N🅪Sg/VB+ . NSg/VX3 NPr/ISg+ . . VP/J NPr/VB+ . Nᴹ/Vg/J D/P NSg/VB P NSg/VB+ ? . > # > “ Awful . ” # . J . . > # > “ It does her good to get away . ” # . NPr/ISg+ NPl/VX3 ISg/D$+ NPr/VB/J P NSg/VB VB/J . . > # > “ Doesn’t her husband object ? ” # . VX3 ISg/D$+ NSg/VB+ NSg/VB+ . . > # > “ Wilson ? He thinks she goes to see her sister in New York . He’s so dumb he # . NPr+ . NPr/ISg+ NPl/V3 ISg+ NPl/V3 P NSg/VB ISg/D$+ NSg/VB NPr/J/R/P NSg/J+ NPr+ . NPr$ NSg/I/J/R/C VB/J NPr/ISg+ > doesn’t know he’s alive . ” # VX3 VB NPr$ J . . > # > So Tom Buchanan and his girl and I went up together to New York — or not quite # NSg/I/J/R/C NPr/VB+ NPr+ VB/C ISg/D$+ NSg/VB+ VB/C ISg/#r+ NSg/VPt NSg/VB/J/P J P NSg/J+ NPr+ . NPr/C NSg/R/C R > together , for Mrs . Wilson sat discreetly in another car . Tom deferred that much # J . R/C/P NPl+ . NPr+ NSg/VP/J R NPr/J/R/P I/D NSg+ . NPr/VB+ NSg/VP/J NSg/I/C/Ddem+ NSg/I/J/R/Dq > to the sensibilities of those East Eggers who might be on the train . # P D NPl P I/Ddem NPr/J+ ? NPr/I+ Nᴹ/VXB/J NSg/VLXB J/P D NSg/VB+ . > # > She had changed her dress to a brown figured muslin , which stretched tight over # ISg+ VP VP/J ISg/D$+ NSg/VB+ P D/P+ NPr🅪Sg/VB/J+ VP/J+ NSg+ . I/C+ VP/J VB/J NSg/J/P > her rather wide hips as Tom helped her to the platform in New York . At the # ISg/D$+ NPr/VB/J/R NSg/J+ NPl/V3+ R/C/P NPr/VB+ VP/J ISg/D$+ P D NSg/VB NPr/J/R/P NSg/J+ NPr+ . NSg/P D+ > news - stand she bought a copy of Town Tattle and a moving - picture magazine , and # Nᴹ/VB+ . NSg/VB ISg+ NSg/VP D/P NSg/VB P NSg+ NSg/VB VB/C D/P Nᴹ/Vg/J+ . NSg/VB+ NSg+ . VB/C > in the station drug - store some cold cream and a small flask of perfume . # NPr/J/R/P D NSg/VB+ NSg/VB+ . NSg/VB+ I/J/R/Dq NSg/J N🅪Sg/VB/J+ VB/C D/P NPr/VB/J NSg/VB P N🅪Sg/VB+ . > Up - stairs , in the solemn echoing drive she let four taxicabs drive away before # NSg/VB/J/P . NPl+ . NPr/J/R/P D+ J+ Nᴹ/Vg/J+ N🅪Sg/VB ISg+ NSg/VBP NSg NPl/V3 N🅪Sg/VB VB/J C/P > she selected a new one , lavender - colored with gray upholstery , and in this we # ISg+ VP/J D/P NSg/J NSg/I/J+ . Nᴹ/VB/J . NSg/VP/J/Am P NPr🅪Sg/VB/J/Am NSg . VB/C NPr/J/R/P I/Ddem IPl+ > slid out from the mass of the station into the glowing sunshine . But immediately # VP NSg/VB/J/R/P P D NPr🅪Sg/VB/J P D NSg/VB+ P D Nᴹ/Vg/J Nᴹ/J+ . NSg/C/P R > she turned sharply from the window and , leaning forward , tapped on the front # ISg+ VP/J R P D+ NSg/VB+ VB/C . Nᴹ/Vg/J NSg/VB/J . VP/J J/P D NSg/VB/J+ > glass . # NPr🅪Sg/VB+ . > # > “ I want to get one of those dogs , ” she said earnestly . “ I want to get one for # . ISg/#r+ NSg/VB P NSg/VB NSg/I/J P I/Ddem+ NPl/V3+ . . ISg+ VP/J R . . ISg/#r+ NSg/VB P NSg/VB NSg/I/J R/C/P > the apartment . They’re nice to have — a dog . ” # D+ NSg+ . K NPr/J P NSg/VXB . D/P NSg/VB/J+ . . > # > We backed up to a gray old man who bore an absurd resemblance to John D. # IPl+ VP/J NSg/VB/J/P P D/P+ NPr🅪Sg/VB/J/Am+ NSg/J+ NPr/VB/J+ NPr/I+ NSg/VBPt D/P NSg/J NSg P NPr+ ? > Rockefeller . In a basket swung from his neck cowered a dozen very recent puppies # NPr . NPr/J/R/P D/P+ NSg/VB+ VPp P ISg/D$+ NSg/VB+ VP/J D/P NSg J/R NSg/J NPl/V3 > of an indeterminate breed . # P D/P NSg/J NSg/VB+ . > # > “ What kind are they ? ” asked Mrs . Wilson eagerly , as he came to the taxi - window . # . NSg/I+ NSg/J+ VLB IPl+ . . VP/J NPl+ . NPr+ R . R/C/P NPr/ISg+ NSg/VPt/P P D NSg/VB+ . NSg/VB+ . > # > “ All kinds . What kind do you want , lady ? ” # . NSg/I/J/C/Dq+ NPl+ . NSg/I+ NSg/J+ VXB ISgPl+ NSg/VB . NPr/VB+ . . > # > “ I’d like to get one of those police dogs ; I don’t suppose you got that kind ? ” # . K NSg/VB/J/C/P P NSg/VB NSg/I/J P I/Ddem Nᴹ/VB+ NPl/V3+ . ISg/#r+ VXB VB ISgPl+ VP NSg/I/C/Ddem NSg/J+ . . > # > The man peered doubtfully into the basket , plunged in his hand and drew one up , # D+ NPr/VB/J+ VP/J R P D NSg/VB+ . VP/J NPr/J/R/P ISg/D$+ NSg/VB+ VB/C NPr/VPt NSg/I/J NSg/VB/J/P . > wriggling , by the back of the neck . # Nᴹ/Vg/J . NSg/P D NSg/VB/J P D NSg/VB+ . > # > “ That’s no police dog , ” said Tom . # . NSg$ NSg/Dq/P+ Nᴹ/VB+ NSg/VB/J+ . . VP/J NPr/VB+ . > # > “ No , it’s not exactly a police dog , ” said the man with disappointment in his # . NSg/Dq/P . K NSg/R/C R D/P Nᴹ/VB+ NSg/VB/J+ . . VP/J D NPr/VB/J+ P NSg+ NPr/J/R/P ISg/D$+ > voice . “ It’s more of an Airedale . ” He passed his hand over the brown washrag of # NSg/VB+ . . K NPr/I/J/R/Dq P D/P NPr . . NPr/ISg+ VP/J ISg/D$+ NSg/VB+ NSg/J/P D NPr🅪Sg/VB/J NSg P > a back . “ Look at that coat . Some coat . That’s a dog that’ll never bother you # D/P NSg/VB/J+ . . NSg/VB NSg/P NSg/I/C/Ddem+ NSg/VB+ . I/J/R/Dq+ NSg/VB+ . NSg$ D/P+ NSg/VB/J+ K R Nᴹ/VB ISgPl+ > with catching cold . ” # P Nᴹ/Vg/J NSg/J . . > # > “ I think it’s cute , ” said Mrs . Wilson enthusiastically . “ How much is it ? ” # . ISg/#r+ NSg/VB K J . . VP/J NPl+ . NPr+ R . . NSg/C NSg/I/J/R/Dq VL3 NPr/ISg+ . . > # > “ That dog ? ” He looked at it admiringly . “ That dog will cost you ten dollars . ” # . NSg/I/C/Ddem+ NSg/VB/J+ . . NPr/ISg+ VP/J NSg/P NPr/ISg+ R . . NSg/I/C/Ddem NSg/VB/J+ NPr/VXB N🅪Sg/VBP/J ISgPl+ NSg+ NPl+ . . > # > The Airedale — undoubtedly there was an Airedale concerned in it somewhere , though # D NPr . R R+ VLPt D/P NPr VP/J NPr/J/R/P NPr/ISg+ NSg . C > its feet were startlingly white — changed hands and settled down into Mrs . # ISg/D$+ NPl+ NSg/VLPt R NPr🅪Sg/VB/J . VP/J NPl/V3+ VB/C VP/J N🅪Sg/VB/J/P P NPl+ . > Wilson’s lap , where she fondled the weatherproof coat with rapture . # NPr$ NSg/VB/J+ . NSg/R/C ISg+ VP/J D VB/J NSg/VB+ P NSg/VB . > # > “ Is it a boy or a girl ? ” she asked delicately . # . VL3 NPr/ISg+ D/P NSg/VB NPr/C D/P+ NSg/VB+ . . ISg+ VP/J R . > # > “ That dog ? That dog’s a boy . ” # . NSg/I/C/Ddem+ NSg/VB/J+ . NSg/I/C/Ddem+ NSg$ D/P NSg/VB+ . . > # > “ It’s a bitch , ” said Tom decisively . “ Here’s your money . Go and buy ten more # . K D/P+ NSg/VB+ . . VP/J NPr/VB+ R . . K D$+ N🅪Sg/J+ . NSg/VB/J VB/C NSg/VB NSg NPr/I/J/R/Dq > dogs with it . ” # NPl/V3+ P NPr/ISg+ . . > # > We drove over to Fifth Avenue , warm and soft , almost pastoral , on the summer # IPl+ NSg/VPt NSg/J/P P NSg/VB/J+ NSg+ . NSg/VB/J VB/C NSg/J . R NSg/J . J/P D NPr🅪Sg/VB+ > Sunday afternoon . I wouldn’t have been surprised to see a great flock of white # NSg/VB+ N🅪Sg+ . ISg/#r+ VXB NSg/VXB NSg/VLPp VP/J P NSg/VB D/P NSg/J NSg/VB P NPr🅪Sg/VB/J > sheep turn the corner . # NSgPl+ NSg/VB D NSg/VB+ . > # > “ Hold on , ” I said , “ I have to leave you here . ” # . NSg/VB/J J/P . . ISg/#r+ VP/J . . ISg/#r+ NSg/VXB P NSg/VB ISgPl+ J/R . . > # > “ No , you don’t , ” interposed Tom quickly . “ Myrtle’ll be hurt if you don’t come up # . NSg/Dq/P . ISgPl+ VXB . . VP/J NPr/VB+ R . . ? NSg/VLXB NSg/VBP/J NSg/C ISgPl+ VXB NSg/VBPp/P NSg/VB/J/P > to the apartment . Won’t you , Myrtle ? ” # P D NSg+ . VXB ISgPl+ . NPr . . > # > “ Come on , ” she urged . “ I'll telephone my sister Catherine . She’s said to be very # . NSg/VBPp/P J/P . . ISg+ VP/J . . K NSg/VB+ D$+ NSg/VB+ NPr+ . K VP/J P NSg/VLXB J/R > beautiful by people who ought to know . ” # NSg/J NSg/P NPl/VB+ NPr/I+ NSg/I/VXB P VB . . > # > “ Well , I’d like to , but — ” # . NSg/VB/J/R . K NSg/VB/J/C/P P . NSg/C/P . . > # > We went on , cutting back again over the Park toward the West Hundreds . At 158th # IPl+ NSg/VPt J/P . NSg/Vg/J NSg/VB/J P NSg/J/P D NPr/VB+ J/P D+ NPr/VB/J+ NPl+ . NSg/P # > Street the cab stopped at one slice in a long white cake of apartment - houses . # NSg/VB/J+ D NSg/VB+ VP/J NSg/P NSg/I/J NSg/VB/J+ NPr/J/R/P D/P NPr/VB/J NPr🅪Sg/VB/J N🅪Sg/VB P NSg+ . NPl/V3+ . > Throwing a regal homecoming glance around the neighborhood , Mrs . Wilson gathered # Nᴹ/Vg/J D/P NSg/J NSg NSg/VB+ J/P D NSg/Am+ . NPl+ . NPr+ VP/J > up her dog and her other purchases , and went haughtily in . # NSg/VB/J/P ISg/D$+ NSg/VB/J+ VB/C ISg/D$+ NSg/VB/J+ NPl/V3+ . VB/C NSg/VPt R NPr/J/R/P . > # > “ I’m going to have the McKees come up , ” she announced as we rose in the # . K Nᴹ/Vg/J P NSg/VXB D ? NSg/VBPp/P NSg/VB/J/P . . ISg+ VP/J R/C/P IPl+ NPr/VPt/J NPr/J/R/P D > elevator . “ And , of course , I got to call up my sister , too . ” # NSg/VB+ . . VB/C . P NSg/VB+ . ISg/#r+ VP P NSg/VB NSg/VB/J/P D$+ NSg/VB+ . R . . > # > The apartment was on the top floor — a small living - room , a small dining - room , a # D+ NSg+ VLPt J/P D NSg/VB/J+ NSg/VB+ . D/P NPr/VB/J Nᴹ/Vg/J+ . N🅪Sg/VB/J . D/P NPr/VB/J Nᴹ/Vg/J+ . N🅪Sg/VB/J . D/P+ > small bedroom , and a bath . The living - room was crowded to the doors with a set # NPr/VB/J+ NSg+ . VB/C D/P+ NSg/VB+ . D+ Nᴹ/Vg/J+ . N🅪Sg/VB/J+ VLPt VP/J P D NPl/V3 P D/P NPr/VBP/J > of tapestried furniture entirely too large for it , so that to move about was to # P J Nᴹ+ R R NSg/J R/C/P NPr/ISg+ . NSg/I/J/R/C NSg/I/C/Ddem+ P NSg/VB J/P VLPt P > stumble continually over scenes of ladies swinging in the gardens of Versailles . # NSg/VB R NSg/J/P NPl/V3 P NPl/V3+ Nᴹ/Vg/J NPr/J/R/P D NPl/V3 P NPr+ . > The only picture was an over - enlarged photograph , apparently a hen sitting on a # D+ J/R/C+ NSg/VB+ VLPt D/P NSg/J/P . VP/J NSg/VB+ . R D/P NSg/VB NSg/Vg/J J/P D/P > blurred rock . Looked at from a distance , however , the hen resolved itself into a # VP/J NPr🅪Sg/VB+ . VP/J NSg/P P D/P+ N🅪Sg/VB+ . C . D NSg/VB VP/J ISg+ P D/P > bonnet , and the countenance of a stout old lady beamed down into the room . # NSg/VB . VB/C D NSg/VB P D/P NPr/VB/J+ NSg/J NPr/VB+ VP/J N🅪Sg/VB/J/P P D N🅪Sg/VB/J+ . > Several old copies of Town Tattle lay on the table together with a copy of # J/Dq NSg/J NPl/V3 P NSg+ NSg/VB NSg/VBPt/J J/P D NSg/VB+ J P D/P NSg/VB P > “ Simon Called Peter , ” and some of the small scandal magazines of Broadway . Mrs . # . NPr+ VP/J NPr/VB/JC+ . . VB/C I/J/R/Dq P D NPr/VB/J N🅪Sg/VB+ NPl P NPr/J+ . NPl+ . > Wilson was first concerned with the dog . A reluctant elevator - boy went for a box # NPr+ VLPt NSg/J VP/J P D+ NSg/VB/J+ . D/P J NSg/VB+ . NSg/VB+ NSg/VPt R/C/P D/P NSg/VB > full of straw and some milk , to which he added on his own initiative a tin of # NSg/VB/J P N🅪Sg/VB/J VB/C I/J/R/Dq+ N🅪Sg/VB+ . P I/C+ NPr/ISg+ VP/J J/P ISg/D$+ NSg/VB/J NSg/J+ D/P N🅪Sg/VB/J P > large , hard dog - biscuits — one of which decomposed apathetically in the saucer of # NSg/J . N🅪Sg/J/R+ NSg/VB/J+ . NPl . NSg/I/J P I/C+ VP/J R NPr/J/R/P D NSg/VB P > milk all afternoon . Meanwhile Tom brought out a bottle of whiskey from a locked # N🅪Sg/VB+ NSg/I/J/C/Dq N🅪Sg+ . NSg NPr/VB+ VP NSg/VB/J/R/P D/P NSg/VB P N🅪Sg P D/P VP/J > bureau door . # NSg+ NSg/VB+ . > # > I have been drunk just twice in my life , and the second time was that afternoon ; # ISg/#r+ NSg/VXB NSg/VLPp NSg/VPp/J J/R R NPr/J/R/P D$+ N🅪Sg/VB+ . VB/C D+ NSg/VB/J+ N🅪Sg/VB/J+ VLPt NSg/I/C/Ddem N🅪Sg+ . > so everything that happened has a dim , hazy cast over it , although until after # NSg/I/J/R/C NSg/I/VB+ NSg/I/C/Ddem+ VP/J V3 D/P NSg/VB/J . NSg/J NSg/VB/J NSg/J/P NPr/ISg+ . C C/P P > eight o’clock the apartment was full of cheerful sun . Sitting on Tom’s lap Mrs . # NSg/J R D+ NSg+ VLPt NSg/VB/J P J+ NPr/VB+ . NSg/Vg/J J/P NPr$ NSg/VB/J+ NPl+ . > Wilson called up several people on the telephone ; then there were no cigarettes , # NPr+ VP/J NSg/VB/J/P J/Dq NPl/VB+ J/P D+ NSg/VB+ . NSg/J/R/C R+ NSg/VLPt NSg/Dq/P+ NPl/V3+ . > and I went out to buy some at the drugstore on the corner . When I came back they # VB/C ISg/#r+ NSg/VPt NSg/VB/J/R/P P NSg/VB I/J/R/Dq NSg/P D NSg J/P D NSg/VB+ . NSg/I/C ISg/#r+ NSg/VPt/P NSg/VB/J IPl+ > had both disappeared , so I sat down discreetly in the living - room and read a # VP I/C/Dq VP/J . NSg/I/J/R/C ISg/#r+ NSg/VP/J N🅪Sg/VB/J/P R NPr/J/R/P D Nᴹ/Vg/J+ . N🅪Sg/VB/J+ VB/C NSg/VBP D/P > chapter of “ Simon Called Peter ” — either it was terrible stuff or the whiskey # NSg/VB P . NPr+ VP/J NPr/VB/JC+ . . I/C NPr/ISg+ VLPt J Nᴹ/VB+ NPr/C D N🅪Sg > distorted things , because it didn’t make any sense to me . # VP/J NPl+ . C/P NPr/ISg+ VXPt NSg/VB I/R/Dq N🅪Sg/VB+ P NPr/ISg+ . > # > Just as Tom and Myrtle ( after the first drink Mrs . Wilson and I called each # J/R R/C/P NPr/VB+ VB/C NPr . P D NSg/J NSg/VB+ NPl+ . NPr+ VB/C ISg/#r+ VP/J Dq > other by our first names ) reappeared , company commenced to arrive at the # NSg/VB/J NSg/P D$+ NSg/J+ NPl/V3+ . VP/J . N🅪Sg+ VP/J P VB NSg/P D > apartment - door . # NSg+ . NSg/VB+ . > # > The sister , Catherine , was a slender , worldly girl of about thirty , with a # D+ NSg/VB+ . NPr+ . VLPt D/P J . J NSg/VB+ P J/P NSg . P D/P > solid , sticky bob of red hair , and a complexion powdered milky white . Her # NSg/J . NSg/VB/J NPr/VB P N🅪Sg/J N🅪Sg/VB+ . VB/C D/P NSg/VB+ VP/J J NPr🅪Sg/VB/J . ISg/D$+ > eyebrows had been plucked and then drawn on again at a more rakish angle , but # NPl/V3+ VP NSg/VLPp VP/J VB/C NSg/J/R/C VPp/J J/P P NSg/P D/P NPr/I/J/R/Dq J NSg/VB+ . NSg/C/P > the efforts of nature toward the restoration of the old alignment gave a blurred # D NPl/V3 P N🅪Sg/VB+ J/P D NPr🅪Sg P D NSg/J N🅪Sg+ VPt D/P VP/J > air to her face . When she moved about there was an incessant clicking as # N🅪Sg/VB+ P ISg/D$+ NSg/VB+ . NSg/I/C ISg+ VP/J J/P R+ VLPt D/P J Nᴹ/Vg/J R/C/P > innumerable pottery bracelets jingled up and down upon her arms . She came in # J N🅪Sg+ NPl/V3 VP/J NSg/VB/J/P VB/C N🅪Sg/VB/J/P P ISg/D$+ NPl/V3+ . ISg+ NSg/VPt/P NPr/J/R/P > with such a proprietary haste , and looked around so possessively at the # P NSg/I+ D/P+ NSg/J+ NSg/VB+ . VB/C VP/J J/P NSg/I/J/R/C R NSg/P D+ > furniture that I wondered if she lived here . But when I asked her she laughed # Nᴹ+ NSg/I/C/Ddem+ ISg/#r+ VP/J NSg/C ISg+ VP/J J/R . NSg/C/P NSg/I/C ISg/#r+ VP/J ISg/D$+ ISg+ VP/J > immoderately , repeated my question aloud , and told me she lived with a girl # R . VP/J D$+ NSg/VB+ J . VB/C VP NPr/ISg+ ISg+ VP/J P D/P NSg/VB+ > friend at a hotel . # NPr/VB/J+ NSg/P D/P NSg+ . > # > Mr . McKee was a pale , feminine man from the flat below . He had just shaved , for # NSg+ . NPr VLPt D/P NSg/VB/J . NSg/J NPr/VB/J+ P D NSg/VB/J P . NPr/ISg+ VP J/R VP/J . R/C/P > there was a white spot of lather on his cheekbone , and he was most respectful in # R+ VLPt D/P NPr🅪Sg/VB/J NSg/VB/J P Nᴹ/VB J/P ISg/D$+ NSg . VB/C NPr/ISg+ VLPt NSg/I/J/R/Dq J NPr/J/R/P > his greeting to every one in the room . He informed me that he was in the # ISg/D$+ Nᴹ/Vg/J+ P Dq NSg/I/J+ NPr/J/R/P D N🅪Sg/VB/J+ . NPr/ISg+ VP/J NPr/ISg+ NSg/I/C/Ddem NPr/ISg+ VLPt NPr/J/R/P D > “ artistic game , ” and I gathered later that he was a photographer and had made # . J+ NSg/VB/J+ . . VB/C ISg/#r+ VP/J JC NSg/I/C/Ddem NPr/ISg+ VLPt D/P NSg VB/C VP VP > the dim enlargement of Mrs . Wilson’s mother which hovered like an ectoplasm on # D NSg/VB/J NSg P NPl+ . NPr$ NSg/VB/J+ I/C+ VP/J NSg/VB/J/C/P D/P N🅪Sg J/P > the wall . His wife was shrill , languid , handsome , and horrible . She told me with # D NPr/VB+ . ISg/D$+ NSg/VB/J+ VLPt NSg/VB/J . NSg/J . VB/J . VB/C NSg/J . ISg+ VP NPr/ISg+ P > pride that her husband had photographed her a hundred and twenty - seven times # Nᴹ/VB+ NSg/I/C/Ddem+ ISg/D$+ NSg/VB+ VP VP/J ISg/D$+ D/P NSg VB/C NSg . NSg NPl/V3 > since they had been married . # C/P IPl+ VP NSg/VLPp NSg/VP/J . > # > Mrs . Wilson had changed her costume some time before , and was now attired in an # NPl+ . NPr+ VP VP/J ISg/D$+ NSg/VB I/J/R/Dq+ N🅪Sg/VB/J+ C/P . VB/C VLPt NSg/J/R/C VP/J NPr/J/R/P D/P > elaborate afternoon dress of cream - colored chiffon , which gave out a continual # VB/J N🅪Sg+ NSg/VB P N🅪Sg/VB/J+ . NSg/VP/J/Am NSg . I/C+ VPt NSg/VB/J/R/P D/P J > rustle as she swept about the room . With the influence of the dress her # NSg/VB R/C/P ISg+ VP/J J/P D N🅪Sg/VB/J+ . P D N🅪Sg/VB P D+ NSg/VB+ ISg/D$+ > personality had also undergone a change . The intense vitality that had been so # N🅪Sg+ VP R/C VB D/P+ N🅪Sg/VB+ . D+ J+ Nᴹ+ NSg/I/C/Ddem+ VP NSg/VLPp NSg/I/J/R/C > remarkable in the garage was converted into impressive hauteur . Her laughter , # J NPr/J/R/P D+ NSg/VB+ VLPt VP/J P J NSg . ISg/D$+ Nᴹ+ . > her gestures , her assertions became more violently affected moment by moment , # ISg/D$+ NPl/V3+ . ISg/D$+ NSg+ VPt NPr/I/J/R/Dq R NSg/VP/J NSg+ NSg/P NSg+ . > and as she expanded the room grew smaller around her , until she seemed to be # VB/C R/C/P ISg+ VP/J D+ N🅪Sg/VB/J+ VPt NSg/JC J/P ISg/D$+ . C/P ISg+ VP/J P NSg/VLXB > revolving on a noisy , creaking pivot through the smoky air . # Nᴹ/Vg/J J/P D/P J . Nᴹ/Vg/J+ NSg/VB NSg/J/P D J N🅪Sg/VB+ . > # > “ My dear , ” she told her sister in a high , mincing shout , “ most of these fellas # . D$+ NSg/VB/J . . ISg+ VP ISg/D$+ NSg/VB+ NPr/J/R/P D/P NSg/VB/J/R . Nᴹ/Vg/J NSg/VB . . NSg/I/J/R/Dq P I/Ddem NPl+ > will cheat you every time . All they think of is money . I had a woman up here # NPr/VXB NSg/VB ISgPl+ Dq N🅪Sg/VB/J+ . NSg/I/J/C/Dq IPl+ NSg/VB P VL3 N🅪Sg/J+ . ISg/#r+ VP D/P+ NSg/VB+ NSg/VB/J/P J/R > last week to look at my feet , and when she gave me the bill you’d of thought she # NSg/VB/J+ NSg/J+ P NSg/VB NSg/P D$+ NPl+ . VB/C NSg/I/C ISg+ VPt NPr/ISg+ D+ NPr/VB+ K P N🅪Sg/VP ISg+ > had my appendicitus out . ” # VP D$+ ? NSg/VB/J/R/P . . > # > “ What was the name of the woman ? ” asked Mrs . McKee . # . NSg/I+ VLPt D NSg/VB P D+ NSg/VB+ . . VP/J NPl+ . NPr . > # > “ Mrs . Eberhardt . She goes around looking at people’s feet in their own homes . ” # . NPl+ . ? . ISg+ NPl/V3 J/P Nᴹ/Vg/J NSg/P NSg$ NPl+ NPr/J/R/P D$+ NSg/VB/J+ NPl/V3+ . . > # > “ I like your dress , ” remarked Mrs . McKee , “ I think it’s adorable . ” # . ISg/#r+ NSg/VB/J/C/P D$+ NSg/VB+ . . VP/J NPl+ . NPr . . ISg/#r+ NSg/VB K J . . > # > Mrs . Wilson rejected the compliment by raising her eyebrow in disdain . # NPl+ . NPr+ VP/J D+ NSg/VB+ NSg/P Nᴹ/Vg/J ISg/D$+ NSg/VB NPr/J/R/P Nᴹ/VB+ . > # > “ It’s just a crazy old thing , ” she said . “ I just slip it on sometimes when I # . K J/R D/P NSg/J NSg/J NSg+ . . ISg+ VP/J . . ISg/#r+ J/R NSg/VB NPr/ISg+ J/P R NSg/I/C ISg/#r+ > don’t care what I look like . ” # VXB N🅪Sg/VB+ NSg/I+ ISg/#r+ NSg/VB NSg/VB/J/C/P . . > # > “ But it looks wonderful on you , if you know what I mean , ” pursued Mrs . McKee . # . NSg/C/P NPr/ISg+ NPl/V3 J J/P ISgPl+ . NSg/C ISgPl+ VB NSg/I+ ISg/#r+ NSg/VB/J . . VP/J NPl+ . NPr . > “ If Chester could only get you in that pose I think he could make something of # . NSg/C NPr+ NSg/VXB J/R/C NSg/VB ISgPl+ NPr/J/R/P NSg/I/C/Ddem+ NSg/VB ISg/#r+ NSg/VB NPr/ISg+ NSg/VXB NSg/VB NSg/I/J P > it . ” # NPr/ISg+ . . > # > We all looked in silence at Mrs . Wilson , who removed a strand of hair from over # IPl+ NSg/I/J/C/Dq VP/J NPr/J/R/P NSg/VB+ NSg/P NPl+ . NPr+ . NPr/I+ VP/J D/P NSg/VB P N🅪Sg/VB+ P NSg/J/P > her eyes and looked back at us with a brilliant smile . Mr . McKee regarded her # ISg/D$+ NPl/V3+ VB/C VP/J NSg/VB/J NSg/P NPr/IPl+ P D/P NSg/J NSg/VB+ . NSg+ . NPr VP/J ISg/D$+ > intently with his head on one side , and then moved his hand back and forth # R P ISg/D$+ NPr/VB/J+ J/P NSg/I/J+ NSg/VB/J+ . VB/C NSg/J/R/C VP/J ISg/D$+ NSg/VB+ NSg/VB/J VB/C R > slowly in front of his face . # R NPr/J/R/P NSg/VB/J P ISg/D$+ NSg/VB+ . > # > “ I should change the light , ” he said after a moment . “ I’d like to bring out the # . ISg/#r+ VXB N🅪Sg/VB D+ N🅪Sg/VB/J+ . . NPr/ISg+ VP/J P D/P+ NSg+ . . K NSg/VB/J/C/P P VB NSg/VB/J/R/P D > modelling of the features . And I’d try to get hold of all the back hair . ” # Nᴹ/Vg/Comm P D NPl/V3+ . VB/C K NSg/VB/J P NSg/VB NSg/VB/J P NSg/I/J/C/Dq D NSg/VB/J N🅪Sg/VB+ . . > # > “ I wouldn’t think of changing the light , ” cried Mrs . McKee . “ I think it’s — — — ” # . ISg/#r+ VXB NSg/VB P Nᴹ/Vg/J D N🅪Sg/VB/J+ . . VP/J NPl+ . NPr . . ISg/#r+ NSg/VB K . . . . > # > Her husband said “ Sh ! ” and we all looked at the subject again , whereupon Tom # ISg/D$+ NSg/VB+ VP/J . W? . . VB/C IPl+ NSg/I/J/C/Dq VP/J+ NSg/P D+ NSg/VB/J+ P . C NPr/VB+ > Buchanan yawned audibly and got to his feet . # NPr+ VP/J R VB/C VP P ISg/D$+ NPl+ . > # > “ You McKees have something to drink , ” he said . “ Get some more ice and mineral # . ISgPl+ ? NSg/VXB NSg/I/J+ P NSg/VB . . NPr/ISg+ VP/J . . NSg/VB I/J/R/Dq NPr/I/J/R/Dq NPr🅪Sg/VB VB/C NSg/J+ > water , Myrtle , before everybody goes to sleep . ” # N🅪Sg/VB+ . NPr . C/P NSg/I+ NPl/V3 P N🅪Sg/VB . . > # > “ I told that boy about the ice . ” Myrtle raised her eyebrows in despair at the # . ISg/#r+ VP NSg/I/C/Ddem NSg/VB J/P D+ NPr🅪Sg/VB+ . . NPr VP/J ISg/D$+ NPl/V3 NPr/J/R/P NSg/VB+ NSg/P D > shiftlessness of the lower orders . “ These people ! You have to keep after them # Nᴹ P D NSg/VB/JC NPl/V3+ . . I/Ddem+ NPl/VB+ . ISgPl+ NSg/VXB P NSg/VB P NSg/IPl+ > all the time . ” # NSg/I/J/C/Dq+ D+ N🅪Sg/VB/J+ . . > # > She looked at me and laughed pointlessly . Then she flounced over to the dog , # ISg+ VP/J NSg/P NPr/ISg+ VB/C VP/J R . NSg/J/R/C ISg+ VP/J NSg/J/P P D NSg/VB/J+ . > kissed it with ecstasy , and swept into the kitchen , implying that a dozen chefs # VP/J NPr/ISg+ P NSg/VB . VB/C VP/J P D NSg/VB+ . Nᴹ/Vg/J NSg/I/C/Ddem D/P NSg NPl/V3+ > awaited her orders there . # VP/J ISg/D$+ NPl/V3+ R . > # > “ I’ve done some nice things out on Long Island , ” asserted Mr . McKee . # . K NSg/VPp/J I/J/R/Dq NPr/J NPl+ NSg/VB/J/R/P J/P NPr/VB/J NSg/VB+ . . VP/J NSg+ . NPr . > # > Tom looked at him blankly . # NPr/VB+ VP/J NSg/P ISg+ R . > # > “ Two of them we have framed down - stairs . ” # . NSg P NSg/IPl+ IPl+ NSg/VXB VP/J N🅪Sg/VB/J/P . NPl+ . . > # > “ Two what ? ” demanded Tom . # . NSg NSg/I+ . . VP/J NPr/VB+ . > # > “ Two studies . One of them I call ‘ Montauk Point — The Gulls , ’ and the other I call # . NSg+ NPl/V3+ . NSg/I/J P NSg/IPl+ ISg/#r+ NSg/VB Unlintable ? NSg/VB+ . D NPl/V3 . . VB/C D NSg/VB/J ISg/#r+ NSg/VB > ‘ Montauk Point — The Sea . ’ ” # Unlintable ? NSg/VB+ . D NSg+ . . . > # > The sister Catherine sat down beside me on the couch . # D+ NSg/VB+ NPr+ NSg/VP/J N🅪Sg/VB/J/P P NPr/ISg+ J/P D+ NSg/VB+ . > # > “ Do you live down on Long Island , too , ” she inquired . # . VXB ISgPl+ VB/J N🅪Sg/VB/J/P J/P NPr/VB/J+ NSg/VB+ . R . . ISg+ VP/J . > # > “ I live at West Egg . ” # . ISg/#r+ VB/J NSg/P NPr/VB/J+ N🅪Sg/VB+ . . > # > “ Really ? I was down there at a party about a month ago . At a man named Gatsby’s . # . R . ISg/#r+ VLPt N🅪Sg/VB/J/P R NSg/P D/P NSg/VB/J J/P D/P+ NSg/J+ J/P . NSg/P D/P+ NPr/VB/J+ VP/J NPr$ . > Do you know him ? ” # VXB ISgPl+ VB ISg+ . . > # > “ I live next door to him . ” # . ISg/#r+ VB/J NSg/J/P+ NSg/VB+ P ISg+ . . > # > “ Well , they say he’s a nephew or a cousin of Kaiser Wilhelm’s . That’s where all # . NSg/VB/J/R . IPl+ NSg/VB NPr$ D/P NSg NPr/C D/P NSg/VB+ P NPr NPr$ . NSg$ NSg/R/C NSg/I/J/C/Dq > his money comes from . ” # ISg/D$+ N🅪Sg/J+ NPl/V3 P . . > # > “ Really ? ” # . R . . > # > She nodded . # ISg+ VP . > # > “ I’m scared of him . I’d hate to have him get anything on me . ” # . K VP/J P ISg+ . K N🅪Sg/VB P NSg/VXB ISg+ NSg/VB NSg/I/VB+ J/P NPr/ISg+ . . > # > This absorbing information about my neighbor was interrupted by Mrs . McKee’s # I/Ddem Nᴹ/Vg/J Nᴹ J/P D$+ NSg/VB/J/Am+ VLPt VP/J NSg/P NPl+ . NPr$ > pointing suddenly at Catherine : # Nᴹ/Vg/J R NSg/P NPr+ . > # > “ Chester , I think you could do something with her , ” she broke out , but Mr . McKee # . NPr+ . ISg/#r+ NSg/VB ISgPl+ NSg/VXB VXB NSg/I/J+ P ISg/D$+ . . ISg+ NSg/VPt/J NSg/VB/J/R/P . NSg/C/P NSg+ . NPr > only nodded in a bored way , and turned his attention to Tom . # J/R/C VP NPr/J/R/P D/P VP/J NSg/J+ . VB/C VP/J ISg/D$+ NSg+ P NPr/VB+ . > # > “ I’d like to do more work on Long Island , if I could get the entry . All I ask is # . K NSg/VB/J/C/P P VXB NPr/I/J/R/Dq N🅪Sg/VB+ J/P NPr/VB/J NSg/VB+ . NSg/C ISg/#r+ NSg/VXB NSg/VB D NSg+ . NSg/I/J/C/Dq ISg/#r+ NSg/VB VL3 > that they should give me a start . ” # NSg/I/C/Ddem IPl+ VXB NSg/VB NPr/ISg+ D/P+ NSg/VB+ . . > # > “ Ask Myrtle , ” said Tom , breaking into a short shout of laughter as Mrs . Wilson # . NSg/VB NPr . . VP/J NPr/VB+ . Nᴹ/Vg/J P D/P NPr/VB/J/P NSg/VB P Nᴹ+ R/C/P NPl+ . NPr+ > entered with a tray . “ She'll give you a letter of introduction , won’t you , # VP/J P D/P+ NSg/VB+ . . K NSg/VB ISgPl+ D/P NSg/VB P NSg+ . VXB ISgPl+ . > Myrtle ? ” # NPr . . > # > “ Do what ? ” she asked , startled . # . VXB NSg/I+ . . ISg+ VP/J . VP/J . > # > “ You'll give McKee a letter of introduction to your husband , so he can do some # . K NSg/VB NPr D/P NSg/VB P NSg+ P D$+ NSg/VB+ . NSg/I/J/R/C NPr/ISg+ NPr/VXB VXB I/J/R/Dq > studies of him . ” His lips moved silently for a moment as he invented . “ ‘ George # NPl/V3 P ISg+ . . ISg/D$+ NPl/V3+ VP/J R R/C/P D/P+ NSg+ R/C/P NPr/ISg+ VP/J . . Unlintable NPr+ > B. Wilson at the Gasoline Pump , ’ or something like that . ” # ? NPr+ NSg/P D Nᴹ NSg/VB+ . . NPr/C NSg/I/J+ NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > Catherine leaned close to me and whispered in my ear : # NPr+ VP/J NSg/VB/J P NPr/ISg+ VB/C VP/J NPr/J/R/P D$+ NSg/VB/J+ . > # > “ Neither of them can stand the person they’re married to . ” # . I/C P NSg/IPl+ NPr/VXB NSg/VB D+ NSg/VB+ K NSg/VP/J P . . > # > “ Can’t they ? ” # . VXB IPl+ . . > # > “ Can’t stand them . ” She looked at Myrtle and then at Tom . “ What I say is , why go # . VXB NSg/VB NSg/IPl+ . . ISg+ VP/J NSg/P NPr VB/C NSg/J/R/C NSg/P NPr/VB+ . . NSg/I+ ISg/#r+ NSg/VB VL3 . NSg/VB NSg/VB/J > on living with them if they can’t stand them ? If I was them I’d get a divorce # J/P Nᴹ/Vg/J P NSg/IPl+ NSg/C IPl+ VXB NSg/VB NSg/IPl+ . NSg/C ISg/#r+ VLPt NSg/IPl+ K NSg/VB D/P NSg/VB+ > and get married to each other right away . ” # VB/C NSg/VB NSg/VP/J P Dq NSg/VB/J NPr/VB/J VB/J . . > # > “ Doesn’t she like Wilson either ? ” # . VX3 ISg+ NSg/VB/J/C/P NPr+ I/C . . > # > The answer to this was unexpected . It came from Myrtle , who had overheard the # D+ NSg/VB+ P I/Ddem+ VLPt NSg/J . NPr/ISg+ NSg/VPt/P P NPr . NPr/I+ VP VB D > question , and it was violent and obscene . # NSg/VB+ . VB/C NPr/ISg+ VLPt NSg/VB/J VB/C VB/J . > # > “ You see , ” cried Catherine triumphantly . She lowered her voice again . “ It’s # . ISgPl+ NSg/VB . . VP/J NPr+ R . ISg+ VP/J ISg/D$+ NSg/VB+ P . . K > really his wife that’s keeping them apart . She’s a Catholic , and they don’t # R ISg/D$+ NSg/VB/J+ NSg$ Nᴹ/Vg/J NSg/IPl+ J . K D/P NSg/J . VB/C IPl+ VXB > believe in divorce . ” # VB NPr/J/R/P NSg/VB+ . . > # > Daisy was not a Catholic , and I was a little shocked at the elaborateness of the # NPr+ VLPt NSg/R/C D/P NSg/J . VB/C ISg/#r+ VLPt D/P NPr/I/J/Dq J NSg/P D NSg P D+ > lie . # NPr/VB+ . > # > “ When they do get married , ” continued Catherine , “ they’re going West to live for # . NSg/I/C IPl+ VXB NSg/VB NSg/VP/J . . VP/J NPr+ . . K Nᴹ/Vg/J NPr/VB/J+ P VB/J R/C/P > a while until it blows over . ” # D/P NSg/VB/C/P+ C/P NPr/ISg+ NPl/V3 NSg/J/P . . > # > “ It’d be more discreet to go to Europe . ” # . K NSg/VLXB NPr/I/J/R/Dq J P NSg/VB/J P NPr+ . . > # > “ Oh , do you like Europe ? ” she exclaimed surprisingly . “ I just got back from # . NPr/VB . VXB ISgPl+ NSg/VB/J/C/P NPr+ . . ISg+ VP/J R . . ISg/#r+ J/R VP NSg/VB/J P > Monte Carlo . ” # NPr NPr+ . . > # > “ Really . ” # . R . . > # > “ Just last year . I went over there with another girl . ” # . J/R NSg/VB/J+ NSg+ . ISg/#r+ NSg/VPt NSg/J/P R P I/D+ NSg/VB+ . . > # > “ Stay long ? ” # . NSg/VB/J NPr/VB/J . . > # > “ No , we just went to Monte Carlo and back . We went by way of Marseilles . We had # . NSg/Dq/P . IPl+ J/R NSg/VPt P NPr NPr+ VB/C NSg/VB/J . IPl+ NSg/VPt NSg/P NSg/J P NPr . IPl+ VP > over twelve hundred dollars when we started , but we got gyped out of it all in # NSg/J/P NSg+ NSg+ NPl+ NSg/I/C IPl+ VP/J . NSg/C/P IPl+ VP ? NSg/VB/J/R/P P NPr/ISg+ NSg/I/J/C/Dq NPr/J/R/P > two days in the private rooms . We had an awful time getting back , I can tell # NSg NPl+ NPr/J/R/P D NSg/VB/J NPl/V3+ . IPl+ VP D/P+ J+ N🅪Sg/VB/J+ NSg/Vg NSg/VB/J . ISg/#r+ NPr/VXB NPr/VB > you . God , how I hated that town ! ” # ISgPl+ . NPr/VB+ . NSg/C ISg/#r+ VP/J NSg/I/C/Ddem+ NSg+ . . > # > The late afternoon sky bloomed in the window for a moment like the blue honey of # D+ NSg/J+ N🅪Sg+ N🅪Sg/VB+ VP/J NPr/J/R/P D NSg/VB+ R/C/P D/P NSg+ NSg/VB/J/C/P D N🅪Sg/VB/J N🅪Sg/VB/J P > the Mediterranean — then the shrill voice of Mrs . McKee called me back into the # D NPr/J+ . NSg/J/R/C D NSg/VB/J NSg/VB P NPl+ . NPr VP/J NPr/ISg+ NSg/VB/J P D > room . # N🅪Sg/VB/J+ . > # > “ I almost made a mistake , too , ” she declared vigorously . “ I almost married a # . ISg/#r+ R VP D/P+ NSg/VB+ . R . . ISg+ VP/J R . . ISg/#r+ R NSg/VP/J D/P > little kyke who’d been after me for years . I knew he was below me . Everybody # NPr/I/J/Dq ? K NSg/VLPp P NPr/ISg+ R/C/P NPl+ . ISg/#r+ VPt NPr/ISg+ VLPt P NPr/ISg+ . NSg/I+ > kept saying to me : ‘ Lucille , that man’s ’ way below you ! ’ But if I hadn’t met # VP N🅪Sg/Vg/J P NPr/ISg+ . Unlintable NPr+ . NSg/I/C/Ddem+ NPr$/I/VB/J . NSg/J+ P ISgPl+ . . NSg/C/P NSg/C ISg/#r+ VPt VP > Chester , he’d of got me sure . ” # NPr+ . K P VP NPr/ISg+ J . . > # > “ Yes , but listen , ” said Myrtle Wilson , nodding her head up and down , “ at least # . NPl/VB . NSg/C/P NSg/VB . . VP/J NPr NPr+ . NSg/VP/J ISg/D$+ NPr/VB/J+ NSg/VB/J/P VB/C N🅪Sg/VB/J/P . . NSg/P NSg/J/Dq > you didn’t marry him . ” # ISgPl+ VXPt VB ISg+ . . > # > “ I know I didn’t . ” # . ISg/#r+ VB ISg/#r+ VXPt . . > # > “ Well , I married him , ” said Myrtle , ambiguously . “ And that’s the difference # . NSg/VB/J/R . ISg/#r+ NSg/VP/J ISg+ . . VP/J NPr . R . . VB/C NSg$ D N🅪Sg/VB > between your case and mine . ” # NSg/P D$+ NPr🅪Sg/VB+ VB/C NSg/I/VB+ . . > # > “ Why did you , Myrtle ? ” demanded Catherine . “ Nobody forced you to . ” # . NSg/VB VXPt ISgPl+ . NPr . . VP/J NPr+ . . NSg/I+ VP/J ISgPl+ P . . > # > Myrtle considered . # NPr VP/J . > # > “ I married him because I thought he was a gentleman , ” she said finally . “ I # . ISg/#r+ NSg/VP/J ISg+ C/P ISg/#r+ N🅪Sg/VP NPr/ISg+ VLPt D/P NSg/J . . ISg+ VP/J R . . ISg/#r+ > thought he knew something about breeding , but he wasn’t fit to lick my shoe . ” # N🅪Sg/VP NPr/ISg+ VPt NSg/I/J+ J/P Nᴹ/Vg/J+ . NSg/C/P NPr/ISg+ VPt NSg/VBP/J P NSg/VB D$+ NSg/VB+ . . > # > “ You were crazy about him for a while , ” said Catherine . # . ISgPl+ NSg/VLPt NSg/J J/P ISg+ R/C/P D/P+ NSg/VB/C/P+ . . VP/J NPr+ . > # > “ Crazy about him ! ” cried Myrtle incredulously . “ Who said I was crazy about him ? # . NSg/J J/P ISg+ . . VP/J NPr R . . NPr/I+ VP/J ISg/#r+ VLPt NSg/J J/P ISg+ . > I never was any more crazy about him than I was about that man there . ” # ISg/#r+ R VLPt I/R/Dq NPr/I/J/R/Dq NSg/J J/P ISg+ C/P ISg/#r+ VLPt J/P NSg/I/C/Ddem+ NPr/VB/J+ R . . > # > She pointed suddenly at me , and every one looked at me accusingly . I tried to # ISg+ VP/J R NSg/P NPr/ISg+ . VB/C Dq+ NSg/I/J+ VP/J NSg/P NPr/ISg+ R . ISg/#r+ VP/J P > show by my expression that I expected no affection . # NSg/VB NSg/P D$+ N🅪Sg+ NSg/I/C/Ddem+ ISg/#r+ NSg/VP/J NSg/Dq/P+ Nᴹ+ . > # > “ The only crazy I was was when I married him . I knew right away I made a # . D J/R/C NSg/J ISg/#r+ VLPt VLPt NSg/I/C ISg/#r+ NSg/VP/J ISg+ . ISg/#r+ VPt NPr/VB/J VB/J ISg/#r+ VP D/P+ > mistake . He borrowed somebody’s best suit to get married in , and never even told # NSg/VB+ . NPr/ISg+ VP/J NSg$ NPr/VXB/JS NSg/VB+ P NSg/VB NSg/VP/J NPr/J/R/P . VB/C R NSg/VB/J/R VP > me about it , and the man came after it one day when he was out : ‘ Oh , is that # NPr/ISg+ J/P NPr/ISg+ . VB/C D NPr/VB/J+ NSg/VPt/P P NPr/ISg+ NSg/I/J NPr🅪Sg+ NSg/I/C NPr/ISg+ VLPt NSg/VB/J/R/P . Unlintable NPr/VB . VL3 NSg/I/C/Ddem > your suit ? ’ I said . ‘ This is the first I ever heard about it . ’ But I gave it to # D$+ NSg/VB+ . . ISg/#r+ VP/J . Unlintable I/Ddem+ VL3 D NSg/J ISg/#r+ J/R VP/J J/P NPr/ISg+ . . NSg/C/P ISg/#r+ VPt NPr/ISg+ P > him and then I lay down and cried to beat the band all afternoon . ” # ISg+ VB/C NSg/J/R/C ISg/#r+ NSg/VBPt/J N🅪Sg/VB/J/P VB/C VP/J P N🅪Sg/VB/J D+ NSg/VB+ NSg/I/J/C/Dq+ N🅪Sg+ . . > # > “ She really ought to get away from him , ” resumed Catherine to me . “ They’ve been # . ISg+ R NSg/I/VXB P NSg/VB VB/J P ISg+ . . VP/J NPr+ P NPr/ISg+ . . K NSg/VLPp > living over that garage for eleven years . And Tom’s the first sweetie she ever # Nᴹ/Vg/J NSg/J/P NSg/I/C/Ddem NSg/VB+ R/C/P NSg NPl+ . VB/C NPr$ D NSg/J NSg ISg+ J/R > had . ” # VP . . > # > The bottle of whiskey — a second one — was now in constant demand by all present , # D NSg/VB P N🅪Sg . D/P NSg/VB/J NSg/I/J+ . VLPt NSg/J/R/C NPr/J/R/P NSg/J N🅪Sg/VB+ NSg/P NSg/I/J/C/Dq NSg/VB/J . > excepting Catherine , who “ felt just as good on nothing at all . ” Tom rang for the # Nᴹ/Vg/J NPr+ . NPr/I+ . N🅪Sg/VP/J J/R R/C/P NPr/VB/J J/P NSg/I/J+ NSg/P NSg/I/J/C/Dq . . NPr/VB+ VPt R/C/P D > janitor and sent him for some celebrated sandwiches , which were a complete # NSg VB/C NSg/VP ISg+ R/C/P I/J/R/Dq VP/J NPl/V3+ . I/C+ NSg/VLPt D/P NSg/VB/J > supper in themselves . I wanted to get out and walk eastward toward the park # NSg/VB+ NPr/J/R/P IPl+ . ISg/#r+ VP/J P NSg/VB NSg/VB/J/R/P VB/C NSg/VB NSg/J J/P D+ NPr/VB+ > through the soft twilight , but each time I tried to go I became entangled in # NSg/J/P D+ NSg/J+ Nᴹ/VB/J+ . NSg/C/P Dq+ N🅪Sg/VB/J+ ISg/#r+ VP/J P NSg/VB/J ISg/#r+ VPt VP/J NPr/J/R/P > some wild , strident argument which pulled me back , as if with ropes , into my # I/J/R/Dq NSg/VB/J . NSg/J N🅪Sg/VB+ I/C+ VP/J NPr/ISg+ NSg/VB/J . R/C/P NSg/C P NPl/V3 . P D$+ > chair . Yet high over the city our line of yellow windows must have contributed # NSg/VB+ . NSg/VB/C NSg/VB/J/R NSg/J/P D+ NSg+ D$+ NSg/VB P NSg/VB/J+ NPrPl/V3+ NSg/VXB NSg/VXB VP/J > their share of human secrecy to the casual watcher in the darkening streets , and # D$+ NSg/VB P NSg/VB/J Nᴹ P D NSg/J NSg+ NPr/J/R/P D Nᴹ/Vg/J NPl/V3+ . VB/C > I saw him too , looking up and wondering . I was within and without , # ISg/#r+ NSg/VPt ISg+ R . Nᴹ/Vg/J NSg/VB/J/P VB/C Nᴹ/Vg/J . ISg/#r+ VLPt NSg/J/P VB/C C/P . > simultaneously enchanted and repelled by the inexhaustible variety of life . # R VP/J VB/C VP NSg/P D J N🅪Sg P N🅪Sg/VB+ . > # > Myrtle pulled her chair close to mine , and suddenly her warm breath poured over # NPr VP/J ISg/D$+ NSg/VB+ NSg/VB/J P NSg/I/VB+ . VB/C R ISg/D$+ NSg/VB/J N🅪Sg/VB/J+ VP/J NSg/J/P > me the story of her first meeting with Tom . # NPr/ISg+ D NSg/VB P ISg/D$+ NSg/J N🅪Sg/Vg/J+ P NPr/VB+ . > # > “ It was on the two little seats facing each other that are always the last ones # . NPr/ISg+ VLPt J/P D+ NSg+ NPr/I/J/Dq+ NPl/V3+ Nᴹ/Vg/J Dq+ NSg/VB/J+ NSg/I/C/Ddem+ VLB R D NSg/VB/J NPl > left on the train . I was going up to New York to see my sister and spend the # NPr/VP/J J/P D+ NSg/VB+ . ISg/#r+ VLPt Nᴹ/Vg/J NSg/VB/J/P P NSg/J+ NPr+ P NSg/VB D$+ NSg/VB+ VB/C NSg/VB D+ > night . He had on a dress suit and patent leather shoes , and I couldn’t keep my # N🅪Sg/VB+ . NPr/ISg+ VP J/P D/P NSg/VB+ NSg/VB VB/C NSg/VB/J+ N🅪Sg/VB/J+ NPl/V3+ . VB/C ISg/#r+ VXB NSg/VB D$+ > eyes off him , but every time he looked at me I had to pretend to be looking at # NPl/V3+ NSg/VB/J/P ISg+ . NSg/C/P Dq N🅪Sg/VB/J+ NPr/ISg+ VP/J NSg/P NPr/ISg+ ISg/#r+ VP P NSg/VB/J P NSg/VLXB Nᴹ/Vg/J NSg/P > the advertisement over his head . When we came into the station he was next to # D NSg NSg/J/P ISg/D$+ NPr/VB/J+ . NSg/I/C IPl+ NSg/VPt/P P D+ NSg/VB+ NPr/ISg+ VLPt NSg/J/P P > me , and his white shirt - front pressed against my arm , and so I told him I’d have # NPr/ISg+ . VB/C ISg/D$+ NPr🅪Sg/VB/J NSg/VB+ . NSg/VB/J+ VP/J C/P D$+ NSg/VB/J+ . VB/C NSg/I/J/R/C ISg/#r+ VP ISg+ K NSg/VXB > to call a policeman , but he knew I lied . I was so excited that when I got into a # P NSg/VB D/P NSg+ . NSg/C/P NPr/ISg+ VPt ISg/#r+ NSg/VP/J . ISg/#r+ VLPt NSg/I/J/R/C VP/J NSg/I/C/Ddem NSg/I/C ISg/#r+ VP P D/P+ > taxi with him I didn’t hardly know I wasn’t getting into a subway train . All I # NSg/VB+ P ISg+ ISg/#r+ VXPt R VB ISg/#r+ VPt NSg/Vg P D/P NSg/VB+ NSg/VB+ . NSg/I/J/C/Dq ISg/#r+ > kept thinking about , over and over , was ‘ You can’t live forever ; you can’t live # VP Nᴹ/Vg/J J/P . NSg/J/P VB/C NSg/J/P . VLPt Unlintable ISgPl+ VXB VB/J NSg/J . ISgPl+ VXB VB/J > forever . ’ ” # NSg/J . . . > # > She turned to Mrs . McKee and the room rang full of her artificial laughter . # ISg+ VP/J P NPl . NPr VB/C D N🅪Sg/VB/J+ VPt NSg/VB/J P ISg/D$+ J Nᴹ+ . > # > “ My dear , ” she cried , “ I’m going to give you this dress as soon as I’m through # . D$+ NSg/VB/J . . ISg+ VP/J . . K Nᴹ/Vg/J P NSg/VB ISgPl+ I/Ddem NSg/VB+ R/C/P J/R R/C/P K NSg/J/P > with it . I’ve got to get another one to - morrow . I’m going to make a list of all # P NPr/ISg+ . K VP P NSg/VB I/D NSg/I/J+ P . NPr/VB . K Nᴹ/Vg/J P NSg/VB D/P NSg/VB P NSg/I/J/C/Dq > the things I’ve got to get . A massage and a wave , and a collar for the dog , and # D NPl+ K VP P NSg/VB . D/P NSg/VB VB/C D/P+ NSg/VB+ . VB/C D/P NSg/VB R/C/P D+ NSg/VB/J+ . VB/C > one of those cute little ash - trays where you touch a spring , and a wreath with a # NSg/I/J P I/Ddem J NPr/I/J/Dq N🅪Sg/VB+ . NPl/V3+ NSg/R/C ISgPl+ N🅪Sg/VB D/P+ N🅪Sg/VB+ . VB/C D/P NSg/VB P D/P > black silk bow for mother’s grave that’ll last all summer . I got to write down a # N🅪Sg/VB/J N🅪Sg/VB+ NSg/VB R/C/P NSg$ NSg/VB/J+ K NSg/VB/J NSg/I/J/C/Dq NPr🅪Sg/VB+ . ISg/#r+ VP P NSg/VB N🅪Sg/VB/J/P D/P+ > list so I won’t forget all the things I got to do . ” # NSg/VB+ NSg/I/J/R/C ISg/#r+ VXB VB NSg/I/J/C/Dq D NPl+ ISg/#r+ VP P VXB . . > # > It was nine o’clock — almost immediately afterward I looked at my watch and found # NPr/ISg+ VLPt NSg R . R R R/Am ISg/#r+ VP/J NSg/P D$+ NSg/VB VB/C NSg/VP > it was ten . Mr . McKee was asleep on a chair with his fists clenched in his lap , # NPr/ISg+ VLPt NSg . NSg+ . NPr VLPt J J/P D/P NSg/VB+ P ISg/D$+ NPl/V3+ VP/J NPr/J/R/P ISg/D$+ NSg/VB/J+ . > like a photograph of a man of action . Taking out my handkerchief I wiped from # NSg/VB/J/C/P D/P NSg/VB P D/P NPr/VB/J P N🅪Sg/VB/J+ . NSg/Vg/J NSg/VB/J/R/P D$+ NSg+ ISg/#r+ VP/J P > his cheek the spot of dried lather that had worried me all the afternoon . # ISg/D$+ NSg/VB D NSg/VB/J P VP/J Nᴹ/VB NSg/I/C/Ddem+ VP VP/J NPr/ISg+ NSg/I/J/C/Dq D N🅪Sg+ . > # > The little dog was sitting on the table looking with blind eyes through the # D+ NPr/I/J/Dq+ NSg/VB/J+ VLPt NSg/Vg/J J/P D+ NSg/VB+ Nᴹ/Vg/J P NSg/VB/J+ NPl/V3+ NSg/J/P D+ > smoke , and from time to time groaning faintly . People disappeared , reappeared , # N🅪Sg/VB+ . VB/C P N🅪Sg/VB/J+ P N🅪Sg/VB/J Nᴹ/Vg/J R . NPl/VB+ VP/J . VP/J . > made plans to go somewhere , and then lost each other , searched for each other , # VP NPl/V3+ P NSg/VB/J NSg . VB/C NSg/J/R/C VP/J Dq NSg/VB/J . VP/J R/C/P Dq NSg/VB/J . > found each other a few feet away . Some time toward midnight Tom Buchanan and # NSg/VP Dq NSg/VB/J D/P NSg/I/Dq NPl+ VB/J . I/J/R/Dq N🅪Sg/VB/J J/P NSg/J+ NPr/VB+ NPr VB/C > Mrs . Wilson stood face to face discussing , in impassioned voices , whether Mrs . # NPl+ . NPr+ VP NSg/VB+ P NSg/VB Nᴹ/Vg/J . NPr/J/R/P J NPl/V3+ . I/C NPl+ . > Wilson had any right to mention Daisy’s name . # NPr+ VP I/R/Dq NPr/VB/J+ P NSg/VB NPr$ NSg/VB+ . > # > “ Daisy ! Daisy ! Daisy ! ” shouted Mrs . Wilson . “ I’ll say it whenever I want to ! # . NPr+ . NPr+ . NPr+ . . VP/J NPl+ . NPr+ . . K NSg/VB NPr/ISg+ C ISg/#r+ NSg/VB P . > Daisy ! Dai — — — ” # NPr+ . ? . . . . > # > Making a short deft movement , Tom Buchanan broke her nose with his open hand . # Nᴹ/Vg/J D/P NPr/VB/J/P J N🅪Sg+ . NPr/VB+ NPr+ NSg/VPt/J ISg/D$+ NSg/VB+ P ISg/D$+ NSg/VB/J NSg/VB+ . > # > Then there were bloody towels upon the bathroom floor , and women’s voices # NSg/J/R/C R+ NSg/VLPt NSg/VB/J NPl/V3+ P D+ NSg/VB+ NSg/VB+ . VB/C NSg$ NPl/V3+ > scolding , and high over the confusion a long broken wail of pain . Mr . McKee # Nᴹ/Vg/J . VB/C NSg/VB/J/R NSg/J/P D N🅪Sg/VB+ D/P NPr/VB/J VPp/J+ NSg/VB P N🅪Sg/VB+ . NSg+ . NPr > awoke from his doze and started in a daze toward the door . When he had gone half # VPt P ISg/D$+ NSg/VB VB/C VP/J NPr/J/R/P D/P NSg/VB J/P D NSg/VB+ . NSg/I/C NPr/ISg+ VP VPp/J/P N🅪Sg/J/P+ > way he turned around and stared at the scene — his wife and Catherine scolding and # NSg/J+ NPr/ISg+ VP/J J/P VB/C VP/J NSg/P D NSg/VB . ISg/D$+ NSg/VB/J VB/C NPr+ Nᴹ/Vg/J VB/C > consoling as they stumbled here and there among the crowded furniture with # Nᴹ/Vg/J R/C/P IPl+ VP/J J/R VB/C R P D VP/J Nᴹ+ P > articles of aid , and the despairing figure on the couch , bleeding fluently , and # NPl/V3 P N🅪Sg/VB+ . VB/C D Nᴹ/Vg/J NSg/VB+ J/P D NSg/VB+ . Nᴹ/Vg/J R . VB/C > trying to spread a copy of Town Tattle over the tapestry scenes of Versailles . # Nᴹ/Vg/J P N🅪Sg/VBP D/P NSg/VB P NSg+ NSg/VB NSg/J/P D N🅪Sg/VB NPl/V3 P NPr+ . > Then Mr . McKee turned and continued on out the door . Taking my hat from the # NSg/J/R/C NSg+ . NPr VP/J VB/C VP/J J/P NSg/VB/J/R/P D NSg/VB+ . NSg/Vg/J D$+ NSg/VB+ P D+ > chandelier , I followed . # NSg+ . ISg/#r+ VP/J . > # > “ Come to lunch some day , ” he suggested , as we groaned down in the elevator . # . NSg/VBPp/P P N🅪Sg/VB I/J/R/Dq+ NPr🅪Sg+ . . NPr/ISg+ VP/J . R/C/P IPl+ VP/J N🅪Sg/VB/J/P NPr/J/R/P D+ NSg/VB+ . > # > “ Where ? ” # . NSg/R/C . . > # > “ Anywhere . ” # . NSg/I . . > # > “ Keep your hands off the lever , ” snapped the elevator boy . # . NSg/VB D$+ NPl/V3+ NSg/VB/J/P D+ NSg/VB+ . . VP D+ NSg/VB+ NSg/VB+ . > # > “ I beg your pardon , ” said Mr . McKee with dignity , “ I didn’t know I was touching # . ISg/#r+ NSg/VB D$+ NSg/VB . . VP/J NSg+ . NPr P NSg+ . . ISg/#r+ VXPt VB ISg/#r+ VLPt Nᴹ/Vg/J/P > it . ” # NPr/ISg+ . . > # > “ All right , ” I agreed , “ I’ll be glad to . ” # . NSg/I/J/C/Dq NPr/VB/J . . ISg/#r+ VP/J . . K NSg/VLXB NSg/VB/J P . . > # > . . . I was standing beside his bed and he was sitting up between the sheets , # . . . ISg/#r+ VLPt Nᴹ/Vg/J P ISg/D$+ NSg/VBP/J+ VB/C NPr/ISg+ VLPt NSg/Vg/J NSg/VB/J/P NSg/P D+ NPl/V3+ . > clad in his underwear , with a great portfolio in his hands . # VB/J NPr/J/R/P ISg/D$+ Nᴹ+ . P D/P NSg/J NSg NPr/J/R/P ISg/D$+ NPl/V3+ . > # > “ Beauty and the Beast . . . Loneliness . . . Old Grocery Horse . . . Brook’n # . N🅪Sg/VB/J VB/C D+ NSg/VB/J+ . . . Nᴹ . . . NSg/J+ NSg/VB+ NSg/VB+ . . . ? > Bridge . . . ” Then I was lying half asleep in the cold lower level of the # N🅪Sg/VB+ . . . . NSg/J/R/C ISg/#r+ VLPt Nᴹ/Vg/J N🅪Sg/J/P+ J NPr/J/R/P D NSg/J NSg/VB/JC NSg/VB/J P D+ > Pennsylvania Station , staring at the morning Tribune , and waiting for the four # NPr+ NSg/VB+ . Nᴹ/Vg/J NSg/P D+ N🅪Sg/Vg/J+ NSg . VB/C Nᴹ/Vg/J R/C/P D NSg > o’clock train . # R NSg/VB+ . > # > CHAPTER III # HeadingStart NSg/VB+ #r > # > There was music from my neighbor’s house through the summer nights . In his blue # R+ VLPt N🅪Sg/VB/J+ P D$+ NSg$/Am NPr/VB+ NSg/J/P D NPr🅪Sg/VB+ NPl/V3+ . NPr/J/R/P ISg/D$+ N🅪Sg/VB/J > gardens men and girls came and went like moths among the whisperings and the # NPl/V3+ NPl VB/C NPl/V3+ NSg/VPt/P VB/C NSg/VPt NSg/VB/J/C/P NPl/VB+ P D NPl/V3 VB/C D > champagne and the stars . At high tide in the afternoon I watched his guests # N🅪Sg/VB/J VB/C D NPl/V3+ . NSg/P NSg/VB/J/R NSg/VB NPr/J/R/P D+ N🅪Sg+ ISg/#r+ VP/J ISg/D$+ NPl/V3+ > diving from the tower of his raft , or taking the sun on the hot sand of his # Nᴹ/Vg/J+ P D NSg/VB P ISg/D$+ NSg/VB+ . NPr/C NSg/Vg/J D+ NPr/VB+ J/P D NSg/VB/J NSg/VB/J P ISg/D$+ > beach while his two motor - boats slit the waters of the Sound , drawing aquaplanes # NPr/VB+ NSg/VB/C/P ISg/D$+ NSg NSg/VB/J+ . NPl/V3 NSg/VB/J D NPrPl/V3 P D+ N🅪Sg/VB/J+ . N🅪Sg/Vg/J NPl/V3 > over cataracts of foam . On week - ends his Rolls - Royce became an omnibus , bearing # NSg/J/P NPl P N🅪Sg/VB+ . J/P NSg/J+ . NPl/V3+ ISg/D$+ NPl/V3+ . NPr VPt D/P NSg/VB/J+ . Nᴹ/Vg/J > parties to and from the city between nine in the morning and long past midnight , # NPl/V3+ P VB/C P D NSg+ NSg/P NSg NPr/J/R/P D N🅪Sg/Vg/J+ VB/C NPr/VB/J NSg/VB/J/P NSg/J+ . > while his station wagon scampered like a brisk yellow bug to meet all trains . # NSg/VB/C/P ISg/D$+ NSg/VB+ NSg/VB+ VP/J NSg/VB/J/C/P D/P VB/J NSg/VB/J NSg/VB+ P NSg/VB/J NSg/I/J/C/Dq NPl/V3+ . > And on Mondays eight servants , including an extra gardener , toiled all day with # VB/C J/P NPl NSg/J+ NPl/V3+ . Nᴹ/Vg/J D/P NSg/J NSg/JC . VP/J NSg/I/J/C/Dq NPr🅪Sg+ P > mops and scrubbing - brushes and hammers and garden - shears , repairing the ravages # NPl/V3 VB/C NSg/Vg . NPl/V3+ VB/C NPl/V3 VB/C NSg/VB/J+ . NPl/V3 . Nᴹ/Vg/J D NPl/V3 > of the night before . # P D N🅪Sg/VB+ C/P . > # > Every Friday five crates of oranges and lemons arrived from a fruiterer in New # Dq+ NSg+ NSg NPl/V3 P NPl/V3 VB/C NPl/V3+ VP/J P D/P NSg NPr/J/R/P NSg/J > York — every Monday these same oranges and lemons left his back door in a pyramid # NPr+ . Dq NSg+ I/Ddem I/J NPl/V3 VB/C NPl/V3+ NPr/VP/J ISg/D$+ NSg/VB/J NSg/VB+ NPr/J/R/P D/P NSg/VB > of pulpless halves . There was a machine in the kitchen which could extract the # P ? V3+ . R+ VLPt D/P NSg/VB+ NPr/J/R/P D+ NSg/VB+ I/C+ NSg/VXB NSg/VB D > juice of two hundred oranges in half an hour if a little button was pressed two # N🅪Sg/VB/J P NSg NSg NPl/V3 NPr/J/R/P N🅪Sg/J/P+ D/P NSg+ NSg/C D/P NPr/I/J/Dq NSg/VB+ VLPt VP/J NSg > hundred times by a butler’s thumb . # NSg NPl/V3+ NSg/P D/P NPr$ NSg/VB+ . > # > At least once a fortnight a corps of caterers came down with several hundred # NSg/P NSg/J/Dq NSg/C D/P NSg/J D/P NSg P + NSg/VPt/P N🅪Sg/VB/J/P P J/Dq NSg > feet of canvas and enough colored lights to make a Christmas tree of Gatsby’s # NPl P NSg/VB+ VB/C NSg/I NSg/VP/J/Am NPl/V3+ P NSg/VB D/P NPr/VB/J+ NSg/VB P NPr$ > enormous garden . On buffet tables , garnished with glistening hors - d’œuvre , # J+ NSg/VB/J+ . J/P NPr/VB+ NPl/V3+ . VP/J P Nᴹ/Vg/J ? . ? . > spiced baked hams crowded against salads of harlequin designs and pastry pigs # VP/J VP/J NPl/V3+ VP/J C/P NPl P NPr/VB/J NPl/V3 VB/C N🅪Sg+ NPl/V3+ > and turkeys bewitched to a dark gold . In the main hall a bar with a real brass # VB/C NPl VP/J P D/P NSg/VB/J Nᴹ/VB/J+ . NPr/J/R/P D+ NSg/VB/J+ NPr+ D/P NSg/VB/P+ P D/P+ NSg/J+ N🅪Sg/VB/J+ > rail was set up , and stocked with gins and liquors and with cordials so long # N🅪Sg/VB+ VLPt NPr/VBP/J NSg/VB/J/P . VB/C VP/J P NPl/V3 VB/C NPl/V3 VB/C P NPl NSg/I/J/R/C NPr/VB/J > forgotten that most of his female guests were too young to know one from # NSg/VPp/J NSg/I/C/Ddem NSg/I/J/R/Dq P ISg/D$+ NSg/J+ NPl/V3+ NSg/VLPt R NPr/VB/J P VB NSg/I/J P > another . # I/D . > # > By seven o’clock the orchestra has arrived , no thin five - piece affair , but a # NSg/P NSg R D+ NSg+ V3 VP/J . NSg/Dq/P NSg/VB/J NSg . NSg/VB+ NSg+ . NSg/C/P D/P > whole pitful of oboes and trombones and saxophones and viols and cornets and # NSg/J ? P NPl VB/C NPl/V3 VB/C NPl/V3 VB/C NPl/V3 VB/C NPl VB/C > piccolos , and low and high drums . The last swimmers have come in from the beach # NPl . VB/C NSg/VB/J/R VB/C NSg/VB/J/R NPl/V3+ . D NSg/VB/J NPl NSg/VXB NSg/VBPp/P NPr/J/R/P P D NPr/VB+ > now and are dressing up - stairs ; the cars from New York are parked five deep in # NSg/J/R/C VB/C VLB Nᴹ/Vg/J NSg/VB/J/P . NPl+ . D NPl+ P NSg/J NPr+ VLB VP/J NSg NSg/J NPr/J/R/P > the drive , and already the halls and salons and verandas are gaudy with primary # D N🅪Sg/VB+ . VB/C R D NPl VB/C NPl+ VB/C NPl/NoAm/Br VLB NSg/J P NSg/VB/J > colors , and hair bobbed in strange new ways , and shawls beyond the dreams of # NPl/V3/Am+ . VB/C N🅪Sg/VB+ VP/J NPr/J/R/P NSg/VB/J NSg/J NPl+ . VB/C NPl/V3 NSg/P D NPl/V3+ P > Castile . The bar is in full swing , and floating rounds of cocktails permeate the # ? . D+ NSg/VB/P+ VL3 NPr/J/R/P NSg/VB/J+ NSg/VB+ . VB/C Nᴹ/Vg/J NPl/V3 P NPl/V3+ NSg/VB D+ > garden outside , until the air is alive with chatter and laughter , and casual # NSg/VB/J+ Nᴹ/VB/J/P . C/P D+ N🅪Sg/VB+ VL3 J P NSg/VB VB/C Nᴹ+ . VB/C NSg/J > innuendo and introductions forgotten on the spot , and enthusiastic meetings # N🅪Sg/VB VB/C NPl+ NSg/VPp/J J/P D NSg/VB/J+ . VB/C J NPl/V3 > between women who never knew each other’s names . # NSg/P NPl+ NPr/I+ R VPt Dq NSg$ NPl/V3+ . > # > The lights grow brighter as the earth lurches away from the sun , and now the # D+ NPl/V3+ VB NSg/JC R/C/P D+ NPrᴹ/VB+ NPl/V3 VB/J P D NPr/VB+ . VB/C NSg/J/R/C D > orchestra is playing yellow cocktail music , and the opera of voices pitches a # NSg+ VL3 Nᴹ/Vg/J NSg/VB/J NSg/VB/J+ N🅪Sg/VB/J+ . VB/C D NSg P NPl/V3+ NPl/V3+ D/P > key higher . Laughter is easier minute by minute , spilled with prodigality , # NPr/VB/J NSg/JC . Nᴹ+ VL3 NSg/JC NSg/VB/J NSg/P NSg/VB/J+ . VP/J P Nᴹ . > tipped out at a cheerful word . The groups change more swiftly , swell with new # VP NSg/VB/J/R/P NSg/P D/P J NSg/VB+ . D+ NPl/V3+ N🅪Sg/VB+ NPr/I/J/R/Dq R . NSg/VB/J+ P NSg/J > arrivals , dissolve and form in the same breath ; already there are wanderers , # NPl . NSg/VB VB/C N🅪Sg/VB+ NPr/J/R/P D I/J N🅪Sg/VB/J+ . R R+ VLB NPl . > confident girls who weave here and there among the stouter and more stable , # NSg/J NPl/V3+ NPr/I+ NSg/VB J/R VB/C R P D NSg/JC VB/C NPr/I/J/R/Dq NSg/VB/J . > become for a sharp , joyous moment the centre of a group , and then , excited with # VBPp R/C/P D/P NPr/VB/J . J NSg+ D NSg/VB/Comm P D/P NSg/VB+ . VB/C NSg/J/R/C . VP/J P > triumph , glide on through the sea - change of faces and voices and color under the # N🅪Sg/VB+ . NSg/VB J/P NSg/J/P D NSg+ . N🅪Sg/VB P NPl/V3 VB/C NPl/V3 VB/C N🅪Sg/VB/J/Am+ NSg/J/P D > constantly changing light . # R Nᴹ/Vg/J N🅪Sg/VB/J+ . > # > Suddenly one of these gypsies , in trembling opal , seizes a cocktail out of the # R NSg/I/J P I/Ddem NPrPl/V3 . NPr/J/R/P Nᴹ/Vg/J NPr🅪Sg . V3 D/P NSg/VB/J+ NSg/VB/J/R/P P D > air , dumps it down for courage and , moving her hands like Frisco , dances out # N🅪Sg/VB+ . NPl/V3 NPr/ISg+ N🅪Sg/VB/J/P R/C/P NSg/VB+ VB/C . Nᴹ/Vg/J ISg/D$+ NPl/V3 NSg/VB/J/C/P NPr+ . NPl/V3+ NSg/VB/J/R/P > alone on the canvas platform . A momentary hush ; the orchestra leader varies his # J J/P D NSg/VB+ NSg/VB+ . D/P+ J+ NSg/VB+ . D+ NSg+ NSg/JC+ NPl/V3 ISg/D$+ > rhythm obligingly for her , and there is a burst of chatter as the erroneous news # N🅪Sg/VB+ R R/C/P ISg/D$+ . VB/C R+ VL3 D/P NSg/VB P NSg/VB+ R/C/P D J Nᴹ/VB+ > goes around that she is Gilda Gray’s understudy from the Follies . The party has # NPl/V3 J/P NSg/I/C/Ddem ISg+ VL3 NPr NPr$/Am NSg/VB P D NPl/V3 . D+ NSg/VB/J+ V3 > begun . # VPp . > # > I believe that on the first night I went to Gatsby’s house I was one of the few # ISg/#r+ VB NSg/I/C/Ddem J/P D+ NSg/J+ N🅪Sg/VB+ ISg/#r+ NSg/VPt P NPr$ NPr/VB+ ISg/#r+ VLPt NSg/I/J P D NSg/I/Dq > guests who had actually been invited . People were not invited — they went there . # NPl/V3+ NPr/I+ VP R NSg/VLPp NSg/VP/J . NPl/VB+ NSg/VLPt NSg/R/C NSg/VP/J . IPl+ NSg/VPt R . > They got into automobiles which bore them out to Long Island , and somehow they # IPl+ VP P NPl/V3 I/C+ NSg/VBPt NSg/IPl+ NSg/VB/J/R/P P NPr/VB/J NSg/VB+ . VB/C R IPl+ > ended up at Gatsby’s door . Once there they were introduced by somebody who knew # VP/J NSg/VB/J/P NSg/P NPr$ NSg/VB+ . NSg/C R+ IPl+ NSg/VLPt VP/J NSg/P NSg/I+ NPr/I+ VPt > Gatsby , and after that they conducted themselves according to the rules of # NPr . VB/C P NSg/I/C/Ddem IPl+ VP/J IPl+ Nᴹ/Vg/J P D NPl/V3 P > behavior associated with an amusement park . Sometimes they came and went without # N🅪Sg/Am+ VP/J P D/P NSg+ NPr/VB+ . R IPl+ NSg/VPt/P VB/C NSg/VPt C/P > having met Gatsby at all , came for the party with a simplicity of heart that was # Nᴹ/Vg/J VP NPr NSg/P NSg/I/J/C/Dq . NSg/VPt/P R/C/P D NSg/VB/J+ P D/P N🅪Sg P N🅪Sg/VB+ NSg/I/C/Ddem+ VLPt > its own ticket of admission . # ISg/D$+ NSg/VB/J NSg/VB P NSg+ . > # > I had been actually invited . A chauffeur in a uniform of robin’s - egg blue # ISg/#r+ VP NSg/VLPp R NSg/VP/J . D/P NSg/VB NPr/J/R/P D/P NSg/VB/J P NPr$ . N🅪Sg/VB+ N🅪Sg/VB/J > crossed my lawn early that Saturday morning with a surprisingly formal note from # VP/J D$+ NSg/VB+ NSg/J/R NSg/I/C/Ddem NSg/VB+ N🅪Sg/Vg/J+ P D/P R NSg/J NSg/VB+ P > his employer : the honor would be entirely Gatsby’s , it said , if I would attend # ISg/D$+ NSg+ . D N🅪Sg/VB/Am+ VXB NSg/VLXB R NPr$ . NPr/ISg+ VP/J . NSg/C ISg/#r+ VXB VB > his “ little party ” that night . He had seen me several times , and had intended to # ISg/D$+ . NPr/I/J/Dq NSg/VB/J+ . NSg/I/C/Ddem N🅪Sg/VB+ . NPr/ISg+ VP NSg/VPp NPr/ISg+ J/Dq+ NPl/V3+ . VB/C VP NSg/VP/J P > call on me long before , but a peculiar combination of circumstances had # NSg/VB J/P NPr/ISg+ NPr/VB/J C/P . NSg/C/P D/P NSg/J N🅪Sg P NPl/V3+ VP > prevented it — signed Jay Gatsby , in a majestic hand . # VP/J NPr/ISg+ . VP/J NPr+ NPr . NPr/J/R/P D/P J NSg/VB+ . > # > Dressed up in white flannels I went over to his lawn a little after seven , and # VP/J NSg/VB/J/P NPr/J/R/P NPr🅪Sg/VB/J NPl/V3 ISg/#r+ NSg/VPt NSg/J/P P ISg/D$+ NSg/VB D/P NPr/I/J/Dq P NSg . VB/C > wandered around rather ill at ease among swirls and eddies of people I didn’t # VP/J J/P NPr/VB/J/R NSg/VB/J NSg/P Nᴹ/VB+ P NPl/V3 VB/C NPl/V3 P NPl/VB+ ISg/#r+ VXPt > know — though here and there was a face I had noticed on the commuting train . I # VB . C J/R VB/C R+ VLPt D/P NSg/VB+ ISg/#r+ VP VP/J J/P D Nᴹ/Vg/J NSg/VB+ . ISg/#r+ > was immediately struck by the number of young Englishmen dotted about ; all well # VLPt R VB NSg/P D N🅪Sg/VB/JC+ P NPr/VB/J NPl VP/J J/P . NSg/I/J/C/Dq NSg/VB/J/R > dressed , all looking a little hungry , and all talking in low , earnest voices to # VP/J . NSg/I/J/C/Dq Nᴹ/Vg/J D/P NPr/I/J/Dq J . VB/C NSg/I/J/C/Dq Nᴹ/Vg/J+ NPr/J/R/P NSg/VB/J/R . NPr/VB/J+ NPl/V3+ P > solid and prosperous Americans . I was sure that they were selling something : # NSg/J VB/C J NPrPl+ . ISg/#r+ VLPt J NSg/I/C/Ddem IPl+ NSg/VLPt Nᴹ/Vg/J NSg/I/J+ . > bonds or insurance or automobiles . They were at least agonizingly aware of the # NPl/V3 NPr/C N🅪Sg+ NPr/C NPl/V3 . IPl+ NSg/VLPt NSg/P NSg/J/Dq R VB/J P D > easy money in the vicinity and convinced that it was theirs for a few words in # NSg/VB/J N🅪Sg/J+ NPr/J/R/P D NSg VB/C VP/J NSg/I/C/Ddem NPr/ISg+ VLPt I+ R/C/P D/P NSg/I/Dq NPl/V3+ NPr/J/R/P > the right key . # D NPr/VB/J NPr/VB/J . > # > As soon as I arrived I made an attempt to find my host , but the two or three # R/C/P J/R R/C/P ISg/#r+ VP/J ISg/#r+ VP D/P NSg/VB+ P NSg/VB D$+ NSg/VB+ . NSg/C/P D NSg NPr/C NSg > people of whom I asked his whereabouts stared at me in such an amazed way , and # NPl/VB P I+ ISg/#r+ VP/J ISg/D$+ NSg+ VP/J NSg/P NPr/ISg+ NPr/J/R/P NSg/I D/P VP/J NSg/J+ . VB/C > denied so vehemently any knowledge of his movements , that I slunk off in the # VP/J NSg/I/J/R/C R I/R/Dq Nᴹ P ISg/D$+ NPl+ . NSg/I/C/Ddem ISg/#r+ NSg/VB NSg/VB/J/P NPr/J/R/P D > direction of the cocktail table — the only place in the garden where a single man # N🅪Sg P D NSg/VB/J+ NSg/VB+ . D J/R/C N🅪Sg/VB+ NPr/J/R/P D NSg/VB/J+ NSg/R/C D/P NSg/VB/J NPr/VB/J+ > could linger without looking purposeless and alone . # NSg/VXB VB C/P Nᴹ/Vg/J J VB/C J . > # > I was on my way to get roaring drunk from sheer embarrassment when Jordan Baker # ISg/#r+ VLPt J/P D$+ NSg/J+ P NSg/VB Nᴹ/Vg/J NSg/VPp/J P NSg/VB/J N🅪Sg+ NSg/I/C NPr+ NPr+ > came out of the house and stood at the head of the marble steps , leaning a # NSg/VPt/P NSg/VB/J/R/P P D+ NPr/VB+ VB/C VP NSg/P D NPr/VB/J P D+ NSg/VB/J+ NPl/V3+ . Nᴹ/Vg/J D/P > little backward and looking with contemptuous interest down into the garden . # NPr/I/J/Dq NSg/J VB/C Nᴹ/Vg/J P J N🅪Sg/VB+ N🅪Sg/VB/J/P P D NSg/VB/J+ . > # > Welcome or not , I found it necessary to attach myself to some one before I # NSg/VB/J NPr/C NSg/R/C . ISg/#r+ NSg/VP NPr/ISg+ NSg/J P VB ISg+ P I/J/R/Dq+ NSg/I/J+ C/P ISg/#r+ > should begin to address cordial remarks to the passers - by . # VXB NSg/VB P NSg/VB NSg/J NPl/V3+ P D NPl . NSg/P . > # > “ Hello ! ” I roared , advancing toward her . My voice seemed unnaturally loud across # . NSg/VB . . ISg/#r+ VP/J . Nᴹ/Vg/J J/P ISg/D$+ . D$+ NSg/VB+ VP/J R NSg/J NSg/P > the garden . # D NSg/VB/J+ . > # > “ I thought you might be here , ” she responded absently as I came up . “ I # . ISg/#r+ N🅪Sg/VP ISgPl+ Nᴹ/VXB/J NSg/VLXB J/R . . ISg+ VP/J R R/C/P ISg/#r+ NSg/VPt/P NSg/VB/J/P . . ISg/#r+ > remembered you lived next door to — — ” # VP/J ISgPl+ VP/J NSg/J/P+ NSg/VB+ P . . . > # > She held my hand impersonally , as a promise that she’d take care of me in a # ISg+ VP D$+ NSg/VB+ R . R/C/P D/P NSg/VB+ NSg/I/C/Ddem+ K NSg/VB N🅪Sg/VB P NPr/ISg+ NPr/J/R/P D/P > minute , and gave ear to two girls in twin yellow dresses , who stopped at the # NSg/VB/J+ . VB/C VPt NSg/VB/J+ P NSg NPl/V3+ NPr/J/R/P NSg/VB/J+ NSg/VB/J+ NPl/V3+ . NPr/I+ VP/J NSg/P D > foot of the steps . # NSg/VB P D NPl/V3+ . > # > “ Hello ! ” they cried together . “ Sorry you didn’t win . ” # . NSg/VB . . IPl+ VP/J J . . NSg/VB/J ISgPl+ VXPt NSg/VB . . > # > That was for the golf tournament . She had lost in the finals the week before . # NSg/I/C/Ddem+ VLPt R/C/P D+ NSg/VB+ NSg+ . ISg+ VP VP/J NPr/J/R/P D+ NPl/V3+ D+ NSg/J+ C/P . > # > “ You don’t know who we are , ” said one of the girls in yellow , “ but we met you # . ISgPl+ VXB VB NPr/I+ IPl+ VLB . . VP/J NSg/I/J P D NPl/V3+ NPr/J/R/P NSg/VB/J . . NSg/C/P IPl+ VP ISgPl+ > here about a month ago . ” # J/R J/P D/P NSg/J+ J/P . . > # > “ You’ve dyed your hair since then , ” remarked Jordan , and I started , but the # . K VP/J D$+ N🅪Sg/VB+ C/P NSg/J/R/C . . VP/J NPr+ . VB/C ISg/#r+ VP/J . NSg/C/P D > girls had moved casually on and her remark was addressed to the premature moon , # NPl/V3+ VP VP/J R J/P VB/C ISg/D$+ NSg/VB+ VLPt VP/J P D NSg/J NPr/VB+ . > produced like the supper , no doubt , out of a caterer’s basket . With Jordan’s # VP/J NSg/VB/J/C/P D NSg/VB+ . NSg/Dq/P N🅪Sg/VB+ . NSg/VB/J/R/P P D/P NSg$ NSg/VB+ . P NPr$ > slender golden arm resting in mine , we descended the steps and sauntered about # J NPr/VB/J NSg/VB/J+ Nᴹ/Vg/J+ NPr/J/R/P NSg/I/VB+ . IPl+ VP/J D NPl/V3+ VB/C VP/J J/P > the garden . A tray of cocktails floated at us through the twilight , and we sat # D NSg/VB/J+ . D/P NSg/VB P NPl/V3+ VP/J NSg/P NPr/IPl+ NSg/J/P D+ Nᴹ/VB/J+ . VB/C IPl+ NSg/VP/J > down at a table with the two girls in yellow and three men , each one introduced # N🅪Sg/VB/J/P NSg/P D/P NSg/VB+ P D+ NSg+ NPl/V3+ NPr/J/R/P NSg/VB/J VB/C NSg+ NPl+ . Dq NSg/I/J+ VP/J > to us as Mr . Mumble . # P NPr/IPl+ R/C/P NSg+ . NSg/VB . > # > “ Do you come to these parties often ? ” inquired Jordan of the girl beside her . # . VXB ISgPl+ NSg/VBPp/P P I/Ddem+ NPl/V3+ R . . VP/J NPr P D+ NSg/VB+ P ISg/D$+ . > # > “ The last one was the one I met you at , ” answered the girl , in an alert # . D+ NSg/VB/J+ NSg/I/J+ VLPt D NSg/I/J ISg/#r+ VP ISgPl+ NSg/P . . VP/J D+ NSg/VB+ . NPr/J/R/P D/P+ NSg/VB/J+ > confident voice . She turned to her companion : “ Wasn’t it for you , Lucille ? ” # NSg/J+ NSg/VB+ . ISg+ VP/J P ISg/D$+ NSg/VB+ . . VPt NPr/ISg+ R/C/P ISgPl+ . NPr+ . . > # > It was for Lucille , too . # NPr/ISg+ VLPt R/C/P NPr+ . R . > # > “ I like to come , ” Lucille said . “ I never care what I do , so I always have a good # . ISg/#r+ NSg/VB/J/C/P P NSg/VBPp/P . . NPr+ VP/J . . ISg/#r+ R N🅪Sg/VB NSg/I+ ISg/#r+ VXB . NSg/I/J/R/C ISg/#r+ R NSg/VXB D/P+ NPr/VB/J+ > time . When I was here last I tore my gown on a chair , and he asked me my name # N🅪Sg/VB/J+ . NSg/I/C ISg/#r+ VLPt J/R NSg/VB/J ISg/#r+ NSg/VB/J D$+ NSg/VB+ J/P D/P+ NSg/VB+ . VB/C NPr/ISg+ VP/J NPr/ISg+ D$+ NSg/VB > and address — inside of a week I got a package from Croirier’s with a new evening # VB/C NSg/VB+ . NSg/J/P P D/P+ NSg/J+ ISg/#r+ VP D/P+ NSg/VB+ P ? P D/P NSg/J N🅪Sg/Vg/J+ > gown in it . ” # NSg/VB+ NPr/J/R/P NPr/ISg+ . . > # > “ Did you keep it ? ” asked Jordan . # . VXPt ISgPl+ NSg/VB NPr/ISg+ . . VP/J NPr+ . > # > “ Sure I did . I was going to wear it to - night , but it was too big in the bust and # . J ISg/#r+ VXPt . ISg/#r+ VLPt Nᴹ/Vg/J P NSg/VB NPr/ISg+ P . N🅪Sg/VB+ . NSg/C/P NPr/ISg+ VLPt R NSg/J NPr/J/R/P D NSg/VB/J VB/C > had to be altered . It was gas blue with lavender beads . Two hundred and # VP P NSg/VLXB NSg/VP/J . NPr/ISg+ VLPt NSg/VB/J N🅪Sg/VB/J P Nᴹ/VB/J NPl/V3+ . NSg NSg VB/C > sixty - five dollars . ” # NSg . NSg NPl+ . . > # > “ There’s something funny about a fellow that’ll do a thing like that , ” said the # . K NSg/I/J+ NSg/J J/P D/P NSg K VXB D/P NSg+ NSg/VB/J/C/P NSg/I/C/Ddem+ . . VP/J D > other girl eagerly . “ He doesn’t want any trouble with anybody . ” # NSg/VB/J NSg/VB+ R . . NPr/ISg+ VX3 NSg/VB I/R/Dq N🅪Sg/VB+ P NSg/I+ . . > # > “ Who doesn’t ? ” I inquired . # . NPr/I+ VX3 . . ISg/#r+ VP/J . > # > “ Gatsby . Somebody told me — — ” # . NPr . NSg/I+ VP NPr/ISg+ . . . > # > The two girls and Jordan leaned together confidentially . # D NSg NPl/V3 VB/C NPr+ VP/J J R . > # > “ Somebody told me they thought he killed a man once . ” # . NSg/I+ VP NPr/ISg+ IPl+ N🅪Sg/VP NPr/ISg+ VP/J D/P+ NPr/VB/J+ NSg/C . . > # > A thrill passed over all of us . The three Mr . Mumbles bent forward and listened # D/P NSg/VB VP/J NSg/J/P NSg/I/J/C/Dq P NPr/IPl+ . D+ NSg+ NSg+ . NPl/V3 NSg/VP/J NSg/VB/J VB/C VP/J > eagerly . # R . > # > “ I don’t think it’s so much that , ” argued Lucille sceptically ; “ it’s more that # . ISg/#r+ VXB NSg/VB K NSg/I/J/R/C NSg/I/J/R/Dq NSg/I/C/Ddem+ . . VP/J NPr+ R/Au/Br . . K NPr/I/J/R/Dq NSg/I/C/Ddem > he was a German spy during the war . ” # NPr/ISg+ VLPt D/P NPr🅪Sg/J NSg/VB VB/P D N🅪Sg/VB+ . . > # > One of the men nodded in confirmation . # NSg/I/J P D+ NPl+ VP NPr/J/R/P N🅪Sg+ . > # > “ I heard that from a man who knew all about him , grew up with him in Germany , ” # . ISg/#r+ VP/J NSg/I/C/Ddem P D/P+ NPr/VB/J+ NPr/I+ VPt NSg/I/J/C/Dq J/P ISg+ . VPt NSg/VB/J/P P ISg+ NPr/J/R/P NPr+ . . > he assured us positively . # NPr/ISg+ NSg/VP/J NPr/IPl+ R . > # > “ Oh , no , ” said the first girl , “ it couldn’t be that , because he was in the # . NPr/VB . NSg/Dq/P . . VP/J D+ NSg/J+ NSg/VB+ . . NPr/ISg+ VXB NSg/VLXB NSg/I/C/Ddem+ . C/P NPr/ISg+ VLPt NPr/J/R/P D > American army during the war . ” As our credulity switched back to her she leaned # NPr/J NSg+ VB/P D N🅪Sg/VB+ . . R/C/P D$+ NSg VP/J NSg/VB/J P ISg/D$+ ISg+ VP/J > forward with enthusiasm . “ You look at him sometimes when he thinks nobody’s # NSg/VB/J P NSg+ . . ISgPl+ NSg/VB NSg/P ISg+ R NSg/I/C NPr/ISg+ NPl/V3 NSg$ > looking at him . I’ll bet he killed a man . ” # Nᴹ/Vg/J NSg/P ISg+ . K NSg/VB/P+ NPr/ISg+ VP/J D/P NPr/VB/J+ . . > # > She narrowed her eyes and shivered . Lucille shivered . We all turned and looked # ISg+ VP/J ISg/D$+ NPl/V3+ VB/C VP/J . NPr+ VP/J . IPl+ NSg/I/J/C/Dq VP/J VB/C VP/J > around for Gatsby . It was testimony to the romantic speculation he inspired that # J/P R/C/P NPr . NPr/ISg+ VLPt NSg P D+ NSg/J+ Nᴹ+ NPr/ISg+ VP/J NSg/I/C/Ddem > there were whispers about him from those who had found little that it was # R+ NSg/VLPt NPl/V3 J/P ISg+ P I/Ddem NPr/I+ VP NSg/VP NPr/I/J/Dq NSg/I/C/Ddem NPr/ISg+ VLPt > necessary to whisper about in this world . # NSg/J P NSg/VB J/P NPr/J/R/P I/Ddem NSg/VB+ . > # > The first supper — there would be another one after midnight — was now being served , # D+ NSg/J+ NSg/VB+ . R+ VXB NSg/VLXB I/D NSg/I/J P NSg/J+ . VLPt NSg/J/R/C N🅪Sg/VLg/J/C VP/J . > and Jordan invited me to join her own party , who were spread around a table on # VB/C NPr+ NSg/VP/J NPr/ISg+ P NSg/VB ISg/D$+ NSg/VB/J+ NSg/VB/J+ . NPr/I+ NSg/VLPt N🅪Sg/VBP J/P D/P NSg/VB+ J/P > the other side of the garden . There were three married couples and Jordan’s # D NSg/VB/J NSg/VB/J P D+ NSg/VB/J+ . R+ NSg/VLPt NSg NSg/VP/J NPl/V3+ VB/C NPr$ > escort , a persistent undergraduate given to violent innuendo , and obviously # NSg/VB . D/P J NSg/J NSg/VPp/J/P P NSg/VB/J N🅪Sg/VB . VB/C R > under the impression that sooner or later Jordan was going to yield him up her # NSg/J/P D NSg/VB+ NSg/I/C/Ddem+ JC NPr/C JC NPr+ VLPt Nᴹ/Vg/J P NSg/VB ISg+ NSg/VB/J/P ISg/D$+ > person to a greater or lesser degree . Instead of rambling this party had # NSg/VB+ P D/P JC NPr/C NSg/JC NSg+ . R P Nᴹ/Vg/J I/Ddem+ NSg/VB/J+ VP > preserved a dignified homogeneity , and assumed to itself the function of # VP/J D/P VP/J NSg . VB/C VP/J P ISg+ D N🅪Sg/VB P > representing the staid nobility of the country - side — East Egg condescending to # Nᴹ/Vg/J D VB/J NSg P D NSg/J+ . NSg/VB/J . NPr/J+ N🅪Sg/VB+ Nᴹ/Vg/J P > West Egg , and carefully on guard against its spectroscopic gayety . # NPr/VB/J+ N🅪Sg/VB+ . VB/C R J/P NSg/VB+ C/P ISg/D$+ J ? . > # > “ Let’s get out , ” whispered Jordan , after a somehow wasteful and inappropriate # . NSg$ NSg/VB NSg/VB/J/R/P . . VP/J NPr+ . P D/P R J VB/C J > half - hour ; “ this is much too polite for me . ” # N🅪Sg/J/P+ . NSg+ . . I/Ddem+ VL3 NSg/I/J/R/Dq R VB/J R/C/P NPr/ISg+ . . > # > We got up , and she explained that we were going to find the host : I had never # IPl+ VP NSg/VB/J/P . VB/C ISg+ VP/J NSg/I/C/Ddem IPl+ NSg/VLPt Nᴹ/Vg/J P NSg/VB D+ NSg/VB+ . ISg/#r+ VP R > met him , she said , and it was making me uneasy . The undergraduate nodded in a # VP ISg+ . ISg+ VP/J . VB/C NPr/ISg+ VLPt Nᴹ/Vg/J NPr/ISg+ NSg/VB/J . D NSg/J VP NPr/J/R/P D/P > cynical , melancholy way . # J . NSg/J NSg/J+ . > # > The bar , where we glanced first , was crowded , but Gatsby was not there . She # D+ NSg/VB/P+ . NSg/R/C IPl+ VP/J NSg/J . VLPt VP/J . NSg/C/P NPr VLPt NSg/R/C R . ISg+ > couldn’t find him from the top of the steps , and he wasn’t on the veranda . On a # VXB NSg/VB ISg+ P D NSg/VB/J P D NPl/V3+ . VB/C NPr/ISg+ VPt J/P D NSg/NoAm/Br+ . J/P D/P+ > chance we tried an important - looking door , and walked into a high Gothic # NPr/VB/J+ IPl+ VP/J D/P J . Nᴹ/Vg/J NSg/VB+ . VB/C VP/J P D/P+ NSg/VB/J/R+ NPr/J+ > library , panelled with carved English oak , and probably transported complete # NSg+ . VP/J/Comm P VP/J NPr🅪Sg/VB/J+ N🅪Sg/VB/J+ . VB/C R VP/J NSg/VB/J > from some ruin overseas . # P I/J/R/Dq NSg/VB J/R . > # > A stout , middle - aged man , with enormous owl - eyed spectacles , was sitting # D/P+ NPr/VB/J+ . NSg/VB/J . VP/J NPr/VB/J . P J+ NSg/VB+ . VP/J NPl . VLPt NSg/Vg/J > somewhat drunk on the edge of a great table , staring with unsteady concentration # NSg/I/R NSg/VPp/J J/P D NSg/VB P D/P NSg/J NSg/VB+ . Nᴹ/Vg/J P VB/J NSg+ > at the shelves of books . As we entered he wheeled excitedly around and examined # NSg/P D NPl/V3 P NPl/V3+ . R/C/P IPl+ VP/J NPr/ISg+ VP/J R J/P VB/C VP/J > Jordan from head to foot . # NPr+ P NPr/VB/J+ P NSg/VB . > # > “ What do you think ? ” he demanded impetuously . # . NSg/I+ VXB ISgPl+ NSg/VB . . NPr/ISg+ VP/J R . > # > “ About what ? ” # . J/P NSg/I+ . . > # > He waved his hand toward the book - shelves . # NPr/ISg+ VP/J ISg/D$+ NSg/VB+ J/P D NSg/VB+ . NPl/V3+ . > # > “ About that . As a matter of fact you needn’t bother to ascertain . I ascertained . # . J/P NSg/I/C/Ddem+ . R/C/P D/P N🅪Sg/VB P NSg+ ISgPl+ VXB Nᴹ/VB P VB . ISg/#r+ VP/J . > They’re real . ” # K NSg/J . . > # > “ The books ? ” # . D+ NPl/V3+ . . > # > He nodded . # NPr/ISg+ VP . > # > “ Absolutely real — have pages and everything . I thought they’d be a nice durable # . R NSg/J . NSg/VXB NPl/V3+ VB/C NSg/I/VB+ . ISg/#r+ N🅪Sg/VP K NSg/VLXB D/P NPr/J NSg/J > cardboard . Matter of fact , they’re absolutely real . Pages and — Here ! Lemme show # Nᴹ/J+ . N🅪Sg/VB P NSg+ . K R NSg/J . NPl/V3+ VB/C . J/R . W? NSg/VB > you . ” # ISgPl+ . . > # > Taking our scepticism for granted , he rushed to the bookcases and returned with # NSg/Vg/J D$+ Nᴹ/Au/Br R/C/P VP/J . NPr/ISg+ VP/J P D NPl VB/C VP/J P > Volume One of the “ Stoddard Lectures . ” # N🅪Sg/VB+ NSg/I/J P D . ? NPl/V3+ . . > # > “ See ! ” he cried triumphantly . “ It’s a bona - fide piece of printed matter . It # . NSg/VB . . NPr/ISg+ VP/J R . . K D/P ? . ? NSg/VB P VP/J N🅪Sg/VB+ . NPr/ISg+ > fooled me . This fella’s a regular Belasco . It’s a triumph . What thoroughness ! # VP/J NPr/ISg+ . I/Ddem ? D/P NSg/J ? . K D/P+ N🅪Sg/VB+ . NSg/I+ Nᴹ . > What realism ! Knew when to stop , too — didn’t cut the pages . But what do you want ? # NSg/I+ Nᴹ+ . VPt NSg/I/C P NSg/VB . R . VXPt NSg/VBP/J D NPl/V3+ . NSg/C/P NSg/I+ VXB ISgPl+ NSg/VB . > What do you expect ? ” # NSg/I+ VXB ISgPl+ VB . . > # > He snatched the book from me and replaced it hastily on its shelf , muttering # NPr/ISg+ VP/J D+ NSg/VB+ P NPr/ISg+ VB/C VP/J NPr/ISg+ R J/P ISg/D$+ NSg+ . Nᴹ/Vg/J > that if one brick was removed the whole library was liable to collapse . # NSg/I/C/Ddem NSg/C NSg/I/J+ N🅪Sg/VB/J+ VLPt VP/J D+ NSg/J+ NSg+ VLPt J P N🅪Sg/VB . > # > “ Who brought you ? ” he demanded . “ Or did you just come ? I was brought . Most # . NPr/I+ VP ISgPl+ . . NPr/ISg+ VP/J . . NPr/C VXPt ISgPl+ J/R NSg/VBPp/P . ISg/#r+ VLPt VP . NSg/I/J/R/Dq > people were brought . ” # NPl/VB+ NSg/VLPt VP . . > # > Jordan looked at him alertly , cheerfully , without answering . # NPr+ VP/J NSg/P ISg+ R . R . C/P Nᴹ/Vg/J . > # > “ I was brought by a woman named Roosevelt , ” he continued . “ Mrs . Claud Roosevelt . # . ISg/#r+ VLPt VP NSg/P D/P+ NSg/VB+ VP/J NPr+ . . NPr/ISg+ VP/J . . NPl+ . ? NPr+ . > Do you know her ? I met her somewhere last night . I’ve been drunk for about a # VXB ISgPl+ VB ISg/D$+ . ISg/#r+ VP ISg/D$+ NSg NSg/VB/J+ N🅪Sg/VB+ . K NSg/VLPp NSg/VPp/J R/C/P J/P D/P > week now , and I thought it might sober me up to sit in a library . ” # NSg/J+ NSg/J/R/C . VB/C ISg/#r+ N🅪Sg/VP NPr/ISg+ Nᴹ/VXB/J VB/J NPr/ISg+ NSg/VB/J/P P NSg/VB NPr/J/R/P D/P NSg+ . . > # > “ Has it ? ” # . V3 NPr/ISg+ . . > # > “ A little bit , I think . I can’t tell yet . I’ve only been here an hour . Did I # . D/P+ NPr/I/J/Dq+ NSg/VPt+ . ISg/#r+ NSg/VB . ISg/#r+ VXB NPr/VB NSg/VB/C . K J/R/C NSg/VLPp J/R D/P NSg+ . VXPt ISg/#r+ > tell you about the books ? They’re real . They’re — ” # NPr/VB ISgPl+ J/P D+ NPl/V3+ . K NSg/J . K . . > # > “ You told us . ” # . ISgPl+ VP NPr/IPl+ . . > # > We shook hands with him gravely and went back outdoors . # IPl+ NSg/VPt/J NPl/V3+ P ISg+ R VB/C NSg/VPt NSg/VB/J NSg/V3 . > # > There was dancing now on the canvas in the garden ; old men pushing young girls # R+ VLPt Nᴹ/Vg/J NSg/J/R/C J/P D NSg/VB+ NPr/J/R/P D+ NSg/VB/J+ . NSg/J+ NPl+ Nᴹ/Vg/J NPr/VB/J+ NPl/V3+ > backward in eternal graceless circles , superior couples holding each other # NSg/J NPr/J/R/P NSg/J J NPl/V3+ . NPr/J NPl/V3+ Nᴹ/Vg/J Dq NSg/VB/J > tortuously , fashionably , and keeping in the corners — and a great number of single # R . R . VB/C Nᴹ/Vg/J NPr/J/R/P D NPl/V3+ . VB/C D/P NSg/J N🅪Sg/VB/JC P NSg/VB/J > girls dancing individualistically or relieving the orchestra for a moment of the # NPl/V3+ Nᴹ/Vg/J R NPr/C Nᴹ/Vg/J D NSg+ R/C/P D/P NSg P D > burden of the banjo or the traps . By midnight the hilarity had increased . A # NSg/VB P D NSg/VB NPr/C D NPl/V3 . NSg/P NSg/J+ D NSg VP VP/J . D/P > celebrated tenor had sung in Italian , and a notorious contralto had sung in # VP/J NSg/J VP NPr/VPp NPr/J/R/P N🅪Sg/J . VB/C D/P J NSg VP NPr/VPp NPr/J/R/P > jazz , and between the numbers people were doing ‘ ‘ stunts ” all over the garden , # NSg/VB+ . VB/C NSg/P D NPrPl/V3+ NPl/VB+ NSg/VLPt Nᴹ/Vg/J Unlintable Unlintable NPl/V3 . NSg/I/J/C/Dq NSg/J/P D NSg/VB/J+ . > while happy , vacuous bursts of laughter rose toward the summer sky . A pair of # NSg/VB/C/P NSg/VB/J . J NPl/V3 P Nᴹ+ NPr/VPt/J J/P D NPr🅪Sg/VB+ N🅪Sg/VB+ . D/P NSg/VB P > stage twins , who turned out to be the girls in yellow , did a baby act in # NSg/VB+ NPl/V3+ . NPr/I+ VP/J NSg/VB/J/R/P P NSg/VLXB D+ NPl/V3+ NPr/J/R/P NSg/VB/J . VXPt D/P+ NSg/VB/J+ NPr/VB+ NPr/J/R/P > costume , and champagne was served in glasses bigger than finger - bowls . The moon # NSg/VB . VB/C N🅪Sg/VB/J+ VLPt VP/J NPr/J/R/P NPl/V3+ JC C/P NSg/VB+ . NPl/V3+ . D+ NPr/VB+ > had risen higher , and floating in the Sound was a triangle of silver scales , # VP VPp/J NSg/JC . VB/C Nᴹ/Vg/J NPr/J/R/P D+ N🅪Sg/VB/J+ VLPt D/P NSg P Nᴹ/VB/J+ NPl/V3 . > trembling a little to the stiff , tinny drip of the banjoes on the lawn . # Nᴹ/Vg/J D/P NPr/I/J/Dq P D NSg/VB/J . NSg/J NSg/VB P D ? J/P D NSg/VB+ . > # > I was still with Jordan Baker . We were sitting at a table with a man of about my # ISg/#r+ VLPt NSg/VB/J/R P NPr+ NPr+ . IPl+ NSg/VLPt NSg/Vg/J NSg/P D/P NSg/VB P D/P NPr/VB/J P J/P D$+ > age and a rowdy little girl , who gave way upon the slightest provocation to # N🅪Sg/VB VB/C D/P+ NSg/J+ NPr/I/J/Dq+ NSg/VB+ . NPr/I+ VPt NSg/J+ P D JS NSg+ P > uncontrollable laughter . I was enjoying myself now . I had taken two finger - bowls # NSg/J Nᴹ+ . ISg/#r+ VLPt Nᴹ/Vg/J ISg+ NSg/J/R/C . ISg/#r+ VP VPp/J NSg NSg/VB+ . NPl/V3 > of champagne , and the scene had changed before my eyes into something # P N🅪Sg/VB/J+ . VB/C D+ NSg/VB+ VP VP/J C/P D$+ NPl/V3+ P NSg/I/J+ > significant , elemental , and profound . # NSg/J . NSg/J . VB/C NSg/VB/J . > # > At a lull in the entertainment the man looked at me and smiled . # NSg/P D/P NSg/VB NPr/J/R/P D+ N🅪Sg+ D+ NPr/VB/J+ VP/J NSg/P NPr/ISg+ VB/C VP/J . > # > “ Your face is familiar , ” he said , politely . “ Weren’t you in the First Division # . D$+ NSg/VB+ VL3 NSg/J . . NPr/ISg+ VP/J . R . . VPt ISgPl+ NPr/J/R/P D NSg/J NSg+ > during the war ? ” # VB/P D N🅪Sg/VB+ . . > # > “ Why , yes . I was in the Twenty - eighth Infantry . ” # . NSg/VB . NPl/VB . ISg/#r+ VLPt NPr/J/R/P D NSg . NSg/VB/J N🅪Sg+ . . > # > “ I was in the Sixteenth until June nineteen - eighteen . I knew I’d seen you # . ISg/#r+ VLPt NPr/J/R/P D NSg/J C/P NPr+ NSg . NSg . ISg/#r+ VPt K NSg/VPp ISgPl+ > somewhere before . ” # NSg C/P . . > # > We talked for a moment about some wet , gray little villages in France . Evidently # IPl+ VP/J R/C/P D/P+ NSg+ J/P I/J/R/Dq NSg/VP/J . NPr🅪Sg/VB/J/Am NPr/I/J/Dq NPl NPr/J/R/P NPr+ . R > he lived in this vicinity , for he told me that he had just bought a hydroplane , # NPr/ISg+ VP/J NPr/J/R/P I/Ddem NSg . R/C/P NPr/ISg+ VP NPr/ISg+ NSg/I/C/Ddem NPr/ISg+ VP J/R NSg/VP D/P NSg/VB . > and was going to try it out in the morning . # VB/C VLPt Nᴹ/Vg/J P NSg/VB/J NPr/ISg+ NSg/VB/J/R/P NPr/J/R/P D N🅪Sg/Vg/J+ . > # > “ Want to go with me , old sport ? Just near the shore along the Sound . ” # . NSg/VB P NSg/VB/J P NPr/ISg+ . NSg/J+ NSg/VB+ . J/R NSg/VB/J/P D+ NSg/VB+ P D+ N🅪Sg/VB/J+ . . > # > “ What time ? ” # . NSg/I+ N🅪Sg/VB/J+ . . > # > “ Any time that suits you best . ” # . I/R/Dq+ N🅪Sg/VB/J+ NSg/I/C/Ddem+ NPl/V3 ISgPl+ NPr/VXB/JS . . > # > It was on the tip of my tongue to ask his name when Jordan looked around and # NPr/ISg+ VLPt J/P D NSg/VB P D$+ N🅪Sg/VB+ P NSg/VB ISg/D$+ NSg/VB+ NSg/I/C NPr+ VP/J J/P VB/C > smiled . # VP/J . > # > “ Having a gay time now ? ” she inquired . # . Nᴹ/Vg/J D/P+ NPr/VB/J+ N🅪Sg/VB/J+ NSg/J/R/C . . ISg+ VP/J . > # > “ Much better . ” I turned again to my new acquaintance . “ This is an unusual party # . NSg/I/J/R/Dq NSg/VXB/JC . . ISg/#r+ VP/J P P D$+ NSg/J+ NSg+ . . I/Ddem+ VL3 D/P NSg/J NSg/VB/J > for me . I haven’t even seen the host . I live over there — ” I waved my hand at the # R/C/P NPr/ISg+ . ISg/#r+ VXB NSg/VB/J/R NSg/VPp D NSg/VB+ . ISg/#r+ VB/J NSg/J/P R . . ISg/#r+ VP/J D$+ NSg/VB+ NSg/P D > invisible hedge in the distance , “ and this man Gatsby sent over his chauffeur # J NSg/VB+ NPr/J/R/P D+ N🅪Sg/VB+ . . VB/C I/Ddem+ NPr/VB/J+ NPr NSg/VP NSg/J/P ISg/D$+ NSg/VB > with an invitation . ” # P D/P NSg+ . . > # > For a moment he looked at me as if he failed to understand . # R/C/P D/P+ NSg+ NPr/ISg+ VP/J NSg/P NPr/ISg+ R/C/P NSg/C NPr/ISg+ VP/J P VB . > # > “ I’m Gatsby , ” he said suddenly . # . K NPr . . NPr/ISg+ VP/J R . > # > “ What ! ” I exclaimed . “ Oh , I beg your pardon . ” # . NSg/I+ . . ISg/#r+ VP/J . . NPr/VB . ISg/#r+ NSg/VB D$+ NSg/VB . . > # > “ I thought you knew , old sport . I’m afraid I’m not a very good host . ” # . ISg/#r+ N🅪Sg/VP ISgPl+ VPt . NSg/J+ NSg/VB+ . K J K NSg/R/C D/P J/R NPr/VB/J NSg/VB+ . . > # > He smiled understandingly — much more than understandingly . It was one of those # NPr/ISg+ VP/J R . NSg/I/J/R/Dq NPr/I/J/R/Dq C/P R . NPr/ISg+ VLPt NSg/I/J P I/Ddem > rare smiles with a quality of eternal reassurance in it , that you may come # NSg/VB/J NPl/V3 P D/P N🅪Sg/J P NSg/J N🅪Sg+ NPr/J/R/P NPr/ISg+ . NSg/I/C/Ddem ISgPl+ NPr/VXB NSg/VBPp/P > across four or five times in life . It faced — or seemed to face — the whole eternal # NSg/P NSg NPr/C NSg NPl/V3 NPr/J/R/P N🅪Sg/VB+ . NPr/ISg+ VP/J . NPr/C VP/J P NSg/VB . D+ NSg/J+ NSg/J+ > world for an instant , and then concentrated on you with an irresistible # NSg/VB+ R/C/P D/P NSg/VB/J . VB/C NSg/J/R/C VP/J J/P ISgPl+ P D/P J > prejudice in your favor . It understood you just so far as you wanted to be # NSg/VB/J+ NPr/J/R/P D$+ N🅪Sg/VB/Am+ . NPr/ISg+ VP/J ISgPl+ J/R NSg/I/J/R/C NSg/VB/J R/C/P ISgPl+ VP/J P NSg/VLXB > understood , believed in you as you would like to believe in yourself , and # VP/J . VP/J NPr/J/R/P ISgPl+ R/C/P ISgPl+ VXB NSg/VB/J/C/P P VB NPr/J/R/P ISg+ . VB/C > assured you that it had precisely the impression of you that , at your best , you # NSg/VP/J ISgPl+ NSg/I/C/Ddem NPr/ISg+ VP R D NSg/VB P ISgPl+ NSg/I/C/Ddem+ . NSg/P D$+ NPr/VXB/JS . ISgPl+ > hoped to convey . Precisely at that point it vanished — and I was looking at an # VP/J P VB . R NSg/P NSg/I/C/Ddem+ NSg/VB+ NPr/ISg+ VP/J . VB/C ISg/#r+ VLPt Nᴹ/Vg/J NSg/P D/P > elegant young rough - neck , a year or two over thirty , whose elaborate formality # NSg/J NPr/VB/J NSg/Vg/J . NSg/VB . D/P+ NSg+ NPr/C NSg NSg/J/P NSg . I+ VB/J NSg > of speech just missed being absurd . Some time before he introduced himself I’d # P N🅪Sg/VB+ J/R VP/J N🅪Sg/VLg/J/C NSg/J . I/J/R/Dq+ N🅪Sg/VB/J+ C/P NPr/ISg+ VP/J ISg+ K > got a strong impression that he was picking his words with care . # VP D/P NPr/J NSg/VB+ NSg/I/C/Ddem+ NPr/ISg+ VLPt Nᴹ/Vg/J ISg/D$+ NPl/V3 P N🅪Sg/VB+ . > # > Almost at the moment when Mr . Gatsby identified himself a butler hurried toward # R NSg/P D+ NSg+ NSg/I/C NSg+ . NPr VP/J ISg+ D/P NPr/VB VP/J J/P > him with the information that Chicago was calling him on the wire . He excused # ISg+ P D Nᴹ+ NSg/I/C/Ddem+ NPr+ VLPt Nᴹ/Vg/J ISg+ J/P D N🅪Sg/VB+ . NPr/ISg+ VP/J > himself with a small bow that included each of us in turn . # ISg+ P D/P+ NPr/VB/J+ NSg/VB+ NSg/I/C/Ddem+ VP/J Dq P NPr/IPl+ NPr/J/R/P NSg/VB . > # > “ If you want anything just ask for it , old sport , ” he urged me . “ Excuse me . I # . NSg/C ISgPl+ NSg/VB NSg/I/VB+ J/R NSg/VB R/C/P NPr/ISg+ . NSg/J+ NSg/VB+ . . NPr/ISg+ VP/J NPr/ISg+ . . NSg/VB+ NPr/ISg+ . ISg/#r+ > will rejoin you later . ” # NPr/VXB NSg/VB ISgPl+ JC . . > # > When he was gone I turned immediately to Jordan — constrained to assure her of my # NSg/I/C NPr/ISg+ VLPt VPp/J/P ISg/#r+ VP/J R P NPr+ . VP/J P VB ISg/D$+ P D$+ > surprise . I had expected that Mr . Gatsby would be a florid and corpulent person # NSg/VB+ . ISg/#r+ VP NSg/VP/J NSg/I/C/Ddem+ NSg+ . NPr VXB NSg/VLXB D/P J VB/C J NSg/VB+ > in his middle years . # NPr/J/R/P ISg/D$+ NSg/VB/J NPl+ . > # > “ Who is he ? ” I demanded . “ Do you know ? ” # . NPr/I+ VL3 NPr/ISg+ . . ISg/#r+ VP/J . . VXB ISgPl+ VB . . > # > “ He’s just a man named Gatsby . ” # . NPr$ J/R D/P NPr/VB/J+ VP/J NPr . . > # > “ Where is he from , I mean ? And what does he do ? ” # . NSg/R/C VL3 NPr/ISg+ P . ISg/#r+ NSg/VB/J . VB/C NSg/I+ NPl/VX3 NPr/ISg+ VXB . . > # > “ Now you’re started on the subject , ” she answered with a wan smile . “ Well , he # . NSg/J/R/C K VP/J J/P D NSg/VB/J+ . . ISg+ VP/J P D/P NSg/VB/J NSg/VB+ . . NSg/VB/J/R . NPr/ISg+ > told me once he was an Oxford man . ” # VP NPr/ISg+ NSg/C NPr/ISg+ VLPt D/P NPr NPr/VB/J . . > # > A dim background started to take shape behind him , but at her next remark it # D/P+ NSg/VB/J+ NSg/VB/J+ VP/J P NSg/VB N🅪Sg/VB+ NSg/J/P ISg+ . NSg/C/P NSg/P ISg/D$+ NSg/J/P+ NSg/VB+ NPr/ISg+ > faded away . # J VB/J . > # > “ However , I don’t believe it . ” # . C . ISg/#r+ VXB VB NPr/ISg+ . . > # > “ Why not ? ” # . NSg/VB NSg/R/C . . > # > “ I don’t know , ” she insisted , “ I just don’t think he went there . ” # . ISg/#r+ VXB VB . . ISg+ VP/J . . ISg/#r+ J/R VXB NSg/VB NPr/ISg+ NSg/VPt R . . > # > Something in her tone reminded me of the other girl’s “ I think he killed a man , ” # NSg/I/J+ NPr/J/R/P ISg/D$+ N🅪Sg/I/VB+ VP/J NPr/ISg+ P D NSg/VB/J NSg$ . ISg/#r+ NSg/VB NPr/ISg+ VP/J D/P NPr/VB/J+ . . > and had the effect of stimulating my curiosity . I would have accepted without # VB/C VP D NSg/VB P Nᴹ/Vg/J D$+ NSg+ . ISg/#r+ VXB NSg/VXB VP/J C/P > question the information that Gatsby sprang from the swamps of Louisiana or from # NSg/VB+ D+ Nᴹ+ NSg/I/C/Ddem+ NPr VB P D NPl/V3 P NPr+ NPr/C P > the lower East Side of New York . That was comprehensible . But young men # D NSg/VB/JC NPr/J+ NSg/VB/J P NSg/J NPr+ . NSg/I/C/Ddem+ VLPt J . NSg/C/P NPr/VB/J+ NPl+ > didn’t — at least in my provincial inexperience I believed they didn’t — drift # VXPt . NSg/P NSg/J/Dq NPr/J/R/P D$+ NSg/J Nᴹ ISg/#r+ VP/J IPl+ VXPt . NSg/VB > coolly out of nowhere and buy a palace on Long Island Sound . # R NSg/VB/J/R/P P NSg/J VB/C NSg/VB D/P NSg/VB+ J/P NPr/VB/J NSg/VB+ N🅪Sg/VB/J+ . > # > “ Anyhow , he gives large parties , ” said Jordan , changing the subject with an # . J . NPr/ISg+ NPl/V3 NSg/J+ NPl/V3+ . . VP/J NPr+ . Nᴹ/Vg/J D NSg/VB/J+ P D/P > urban distaste for the concrete . “ And I like large parties . They’re so intimate . # NPr/J NSg/VB R/C/P D+ N🅪Sg/VB/J+ . . VB/C ISg/#r+ NSg/VB/J/C/P NSg/J+ NPl/V3+ . K NSg/I/J/R/C NSg/VB/J . > At small parties there isn’t any privacy . ” # NSg/P NPr/VB/J+ NPl/V3+ R+ NSg/VX3 I/R/Dq+ Nᴹ+ . . > # > There was the boom of a bass drum , and the voice of the orchestra leader rang # R+ VLPt D NSg/VB P D/P+ NPr/VB/J+ NSg/VB . VB/C D NSg/VB P D+ NSg+ NSg/JC+ VPt > out suddenly above the chatter of the garden . # NSg/VB/J/R/P R NSg/J/P D NSg/VB P D+ NSg/VB/J+ . > # > “ Ladies and gentlemen , ” he cried . “ At the request of Mr . Gatsby we are going to # . NPl/V3 VB/C NPl+ . . NPr/ISg+ VP/J . . NSg/P D NSg/VB P NSg+ . NPr IPl+ VLB Nᴹ/Vg/J P > play for you Mr . Vladmir Tostoff’s latest work , which attracted so much # N🅪Sg/VB R/C/P ISgPl+ NSg+ . ? ? NSg/JS+ N🅪Sg/VB+ . I/C+ VP/J NSg/I/J/R/C NSg/I/J/R/Dq > attention at Carnegie Hall last May . If you read the papers you know there was a # NSg+ NSg/P NPr+ NPr+ NSg/VB/J NPr/VXB . NSg/C ISgPl+ NSg/VBP D+ NPl/V3+ ISgPl+ VB R+ VLPt D/P+ > big sensation . ” He smiled with jovial condescension , and added : “ Some # NSg/J+ NSg+ . . NPr/ISg+ VP/J P J NSg . VB/C VP/J . . I/J/R/Dq > sensation ! ” Whereupon everybody laughed . # NSg+ . . C NSg/I+ VP/J . > # > “ The piece is known , ” he concluded lustily , “ as ‘ Vladmir Tostoff’s Jazz History # . D+ NSg/VB+ VL3 VPp/J . . NPr/ISg+ VP/J R . . R/C/P Unlintable ? ? NSg/VB+ N🅪Sg > of the World . ’ ” # P D NSg/VB+ . . . > # > The nature of Mr . Tostoff’s composition eluded me , because just as it began my # D N🅪Sg/VB P NSg+ . ? NSg+ VP/J NPr/ISg+ . C/P J/R R/C/P NPr/ISg+ VPt D$+ > eyes fell on Gatsby , standing alone on the marble steps and looking from one # NPl/V3+ NSg/VPt/J J/P NPr . Nᴹ/Vg/J J J/P D NSg/VB/J+ NPl/V3+ VB/C Nᴹ/Vg/J P NSg/I/J > group to another with approving eyes . His tanned skin was drawn attractively # NSg/VB+ P I/D P Nᴹ/Vg/J NPl/V3+ . ISg/D$+ VP/J+ N🅪Sg/VB+ VLPt VPp/J R > tight on his face and his short hair looked as though it were trimmed every day . # VB/J J/P ISg/D$+ NSg/VB+ VB/C ISg/D$+ NPr/VB/J/P N🅪Sg/VB+ VP/J R/C/P C NPr/ISg+ NSg/VLPt VP/J Dq NPr🅪Sg+ . > I could see nothing sinister about him . I wondered if the fact that he was not # ISg/#r+ NSg/VXB NSg/VB NSg/I/J+ J J/P ISg+ . ISg/#r+ VP/J NSg/C D+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ VLPt NSg/R/C > drinking helped to set him off from his guests , for it seemed to me that he grew # Nᴹ/Vg/J VP/J P NPr/VBP/J ISg+ NSg/VB/J/P P ISg/D$+ NPl/V3+ . R/C/P NPr/ISg+ VP/J P NPr/ISg+ NSg/I/C/Ddem NPr/ISg+ VPt > more correct as the fraternal hilarity increased . When the “ Jazz History of the # NPr/I/J/R/Dq NSg/VB/J R/C/P D NSg/J NSg VP/J . NSg/I/C D . NSg/VB N🅪Sg P D+ > World ” was over , girls were putting their heads on men’s shoulders in a # NSg/VB+ . VLPt NSg/J/P . NPl/V3+ NSg/VLPt Nᴹ/Vg/J D$+ NPl/V3+ J/P NSg$ NPl/V3+ NPr/J/R/P D/P > puppyish , convivial way , girls were swooning backward playfully into men’s arms , # ? . J NSg/J+ . NPl/V3+ NSg/VLPt Nᴹ/Vg/J NSg/J R P NSg$ NPl/V3+ . > even into groups , knowing that some one would arrest their falls — but no one # NSg/VB/J/R P NPl/V3+ . NSg/Vg/J/P NSg/I/C/Ddem I/J/R/Dq NSg/I/J+ VXB N🅪Sg/VB D$+ NPl/V3+ . NSg/C/P NSg/Dq/P NSg/I/J+ > swooned backward on Gatsby , and no French bob touched Gatsby’s shoulder , and no # VP/J NSg/J J/P NPr . VB/C NSg/Dq/P NPr🅪Sg/VB/J NPr/VB+ VP/J NPr$ NSg/VB+ . VB/C NSg/Dq/P > singing quartets were formed for Gatsby’s head for one link . # Nᴹ/Vg/J NPl NSg/VLPt VP/J R/C/P NPr$ NPr/VB/J+ R/C/P NSg/I/J NSg/VB+ . > # > “ I beg your pardon . ” # . ISg/#r+ NSg/VB D$+ NSg/VB . . > # > Gatsby’s butler was suddenly standing beside us . # NPr$ NPr/VB VLPt R Nᴹ/Vg/J P NPr/IPl+ . > # > “ Miss Baker ? ” he inquired . “ I beg your pardon , but Mr . Gatsby would like to # . NSg/VB NPr+ . . NPr/ISg+ VP/J . . ISg/#r+ NSg/VB D$+ NSg/VB . NSg/C/P NSg+ . NPr VXB NSg/VB/J/C/P P > speak to you alone . ” # NSg/VB P ISgPl+ J . . > # > “ With me ? ” she exclaimed in surprise . # . P NPr/ISg+ . . ISg+ VP/J NPr/J/R/P NSg/VB+ . > # > “ Yes , madame . ” # . NPl/VB . NSg+ . . > # > She got up slowly , raising her eyebrows at me in astonishment , and followed the # ISg+ VP NSg/VB/J/P R . Nᴹ/Vg/J ISg/D$+ NPl/V3+ NSg/P NPr/ISg+ NPr/J/R/P Nᴹ+ . VB/C VP/J D > butler toward the house . I noticed that she wore her evening - dress , all her # NPr/VB J/P D NPr/VB+ . ISg/#r+ VP/J NSg/I/C/Ddem ISg+ VPt ISg/D$+ N🅪Sg/Vg/J+ . NSg/VB+ . NSg/I/J/C/Dq ISg/D$+ > dresses , like sports clothes — there was a jauntiness about her movements as if # NPl/V3+ . NSg/VB/J/C/P NPl/V3+ NPl/V3+ . R+ VLPt D/P NSg J/P ISg/D$+ NPl+ R/C/P NSg/C > she had first learned to walk upon golf courses on clean , crisp mornings . # ISg+ VP NSg/J VP/J P NSg/VB P NSg/VB+ NPl/V3+ J/P NSg/VB/J . NSg/VB/J NPl/V3+ . > # > I was alone and it was almost two . For some time confused and intriguing sounds # ISg/#r+ VLPt J VB/C NPr/ISg+ VLPt R NSg . R/C/P I/J/R/Dq+ N🅪Sg/VB/J+ VP/J VB/C Nᴹ/Vg/J NPl/V3 > had issued from a long , many - windowed room which overhung the terrace . Eluding # VP VP/J P D/P NPr/VB/J . NSg/I/J/Dq . VP/J N🅪Sg/VB/J+ I/C+ VP/J D NSg/VB+ . Nᴹ/Vg/J > Jordan’s undergraduate , who was now engaged in an obstetrical conversation with # NPr$ NSg/J . NPr/I+ VLPt NSg/J/R/C VP/J NPr/J/R/P D/P J N🅪Sg/VB+ P > two chorus girls , and who implored me to join him , I went inside . # NSg NSg/VB+ NPl/V3+ . VB/C NPr/I+ VP/J NPr/ISg+ P NSg/VB ISg+ . ISg/#r+ NSg/VPt NSg/J/P . > # > The large room was full of people . One of the girls in yellow was playing the # D+ NSg/J+ N🅪Sg/VB/J+ VLPt NSg/VB/J P NPl/VB+ . NSg/I/J P D+ NPl/V3+ NPr/J/R/P NSg/VB/J VLPt Nᴹ/Vg/J D+ > piano , and beside her stood a tall , red - haired young lady from a famous chorus , # NSg/VB/J+ . VB/C P ISg/D$+ VP D/P NSg/J . N🅪Sg/J . VP/J NPr/VB/J NPr/VB P D/P VB/J NSg/VB+ . > engaged in song . She had drunk a quantity of champagne , and during the course of # VP/J NPr/J/R/P N🅪Sg+ . ISg+ VP NSg/VPp/J D/P N🅪Sg P N🅪Sg/VB/J+ . VB/C VB/P D NSg/VB P > her song she had decided , ineptly , that everything was very , very sad — she was # ISg/D$+ N🅪Sg+ ISg+ VP NSg/VP/J . R . NSg/I/C/Ddem NSg/I/VB+ VLPt J/R . J/R NSg/VB/J . ISg+ VLPt > not only singing , she was weeping too . Whenever there was a pause in the song # NSg/R/C J/R/C Nᴹ/Vg/J . ISg+ VLPt Nᴹ/Vg/J+ R . C R+ VLPt D/P NSg/VB NPr/J/R/P D+ N🅪Sg+ > she filled it with gasping , broken sobs , and then took up the lyric again in a # ISg+ VP/J NPr/ISg+ P Nᴹ/Vg/J . VPp/J NPl/V3 . VB/C NSg/J/R/C VPt NSg/VB/J/P D NSg/J P NPr/J/R/P D/P > quavering soprano . The tears coursed down her cheeks — not freely , however , for # Nᴹ/Vg/J NSg/VB+ . D+ NPl/V3+ VP/J N🅪Sg/VB/J/P ISg/D$+ NPl/V3+ . NSg/R/C R . C . R/C/P > when they came into contact with her heavily beaded eyelashes they assumed an # NSg/I/C IPl+ NSg/VPt/P P N🅪Sg/VB+ P ISg/D$+ R VP/J NPl IPl+ VP/J D/P > inky color , and pursued the rest of their way in slow black rivulets . A humorous # J N🅪Sg/VB/J/Am+ . VB/C VP/J D NSg/VB P D$+ NSg/J+ NPr/J/R/P NSg/VB/J N🅪Sg/VB/J NPl . D/P J > suggestion was made that she sing the notes on her face , whereupon she threw up # N🅪Sg+ VLPt VP NSg/I/C/Ddem ISg+ NSg/VB/J D NPl/V3+ J/P ISg/D$+ NSg/VB+ . C ISg+ VPt NSg/VB/J/P > her hands , sank into a chair , and went off into a deep vinous sleep . # ISg/D$+ NPl/V3+ . VPt P D/P NSg/VB+ . VB/C NSg/VPt NSg/VB/J/P P D/P NSg/J J N🅪Sg/VB+ . > # > “ She had a fight with a man who says he’s her husband , ” explained a girl at my # . ISg+ VP D/P NSg/VB P D/P+ NPr/VB/J+ NPr/I+ NPl/V3 NPr$ ISg/D$+ NSg/VB+ . . VP/J D/P NSg/VB+ NSg/P D$+ > elbow . # NSg/VB+ . > # > I looked around . Most of the remaining women were now having fights with men # ISg/#r+ VP/J J/P . NSg/I/J/R/Dq P D+ Nᴹ/Vg/J NPl+ NSg/VLPt NSg/J/R/C Nᴹ/Vg/J NPl/V3+ P NPl+ > said to be their husbands . Even Jordan’s party , the quartet from East Egg , were # VP/J P NSg/VLXB D$+ NPl/V3+ . NSg/VB/J/R NPr$ NSg/VB/J+ . D NSg+ P NPr/J+ N🅪Sg/VB+ . NSg/VLPt > rent asunder by dissension . One of the men was talking with curious intensity to # Nᴹ/VB/J+ R NSg/P NSg . NSg/I/J P D+ NPl+ VLPt Nᴹ/Vg/J P J Nᴹ+ P > a young actress , and his wife , after attempting to laugh at the situation in a # D/P+ NPr/VB/J+ NSg+ . VB/C ISg/D$+ NSg/VB/J+ . P Nᴹ/Vg/J P NSg/VB NSg/P D+ NSg+ NPr/J/R/P D/P > dignified and indifferent way , broke down entirely and resorted to flank # VP/J VB/C NSg/J+ NSg/J+ . NSg/VPt/J N🅪Sg/VB/J/P R VB/C VP/J P NSg/VB/J > attacks — at intervals she appeared suddenly at his side like an angry diamond , # NPl/V3+ . NSg/P NPl+ ISg+ VP/J R NSg/P ISg/D$+ NSg/VB/J+ NSg/VB/J/C/P D/P VB/J N🅪Sg/VB/J . > and hissed : “ You promised ! ” into his ear . # VB/C VP/J . . ISgPl+ VP/J . . P ISg/D$+ NSg/VB/J+ . > # > The reluctance to go home was not confined to wayward men . The hall was at # D NSg+ P NSg/VB/J NSg/VB/J+ VLPt NSg/R/C VP/J P J NPl+ . D+ NPr+ VLPt NSg/P > present occupied by two deplorably sober men and their highly indignant wives . # NSg/VB/J VP/J NSg/P NSg R VB/J NPl+ VB/C D$+ R J V3+ . > The wives were sympathizing with each other in slightly raised voices . # D+ V3+ NSg/VLPt Nᴹ/Vg/J P Dq NSg/VB/J NPr/J/R/P R VP/J NPl/V3+ . > # > “ Whenever he sees I’m having a good time he wants to go home . ” # . C NPr/ISg+ NPl/V3 K Nᴹ/Vg/J D/P+ NPr/VB/J N🅪Sg/VB/J+ NPr/ISg+ NPl/V3 P NSg/VB/J NSg/VB/J+ . . > # > “ Never heard anything so selfish in my life . ” # . R VP/J NSg/I/VB+ NSg/I/J/R/C J NPr/J/R/P D$+ N🅪Sg/VB+ . . > # > “ We're always the first ones to leave . ” # . K R D NSg/J NPl+ P NSg/VB . . > # > “ So are we . ” # . NSg/I/J/R/C VLB IPl+ . . > # > “ Well , we’re almost the last to - night , ” said one of the men sheepishly . “ The # . NSg/VB/J/R . K R D NSg/VB/J+ P . N🅪Sg/VB+ . . VP/J NSg/I/J P D NPl+ R . . D+ > orchestra left half an hour ago . ” # NSg+ NPr/VP/J N🅪Sg/J/P+ D/P+ NSg+ J/P . . > # > In spite of the wives ’ agreement that such malevolence was beyond credibility , # NPr/J/R/P NSg/VB/P P D+ V3+ . N🅪Sg+ NSg/I/C/Ddem NSg/I NSg VLPt NSg/P Nᴹ+ . > the dispute ended in a short struggle , and both wives were lifted , kicking , into # D NSg/VB+ VP/J NPr/J/R/P D/P NPr/VB/J/P NSg/VB+ . VB/C I/C/Dq V3+ NSg/VLPt VP/J . Nᴹ/Vg/J . P > the night . # D N🅪Sg/VB+ . > # > As I waited for my hat in the hall the door of the library opened and Jordan # R/C/P ISg/#r+ VP/J R/C/P D$+ NSg/VB+ NPr/J/R/P D+ NPr+ D NSg/VB P D+ NSg+ VP/J VB/C NPr+ > Baker and Gatsby came out together . He was saying some last word to her , but the # NPr+ VB/C NPr NSg/VPt/P NSg/VB/J/R/P J . NPr/ISg+ VLPt N🅪Sg/Vg/J I/J/R/Dq NSg/VB/J+ NSg/VB+ P ISg/D$+ . NSg/C/P D > eagerness in his manner tightened abruptly into formality as several people # NSg NPr/J/R/P ISg/D$+ NSg+ VP/J R P NSg+ R/C/P J/Dq NPl/VB+ > approached him to say good - by . # VP/J ISg+ P NSg/VB NPr/VB/J . NSg/P . > # > Jordan’s party were calling impatiently to her from the porch , but she lingered # NPr$ NSg/VB/J+ NSg/VLPt Nᴹ/Vg/J R P ISg/D$+ P D NSg+ . NSg/C/P ISg+ VP/J > for a moment to shake hands . # R/C/P D/P NSg+ P NSg/VB NPl/V3+ . > # > “ I’ve just heard the most amazing thing , ” she whispered . “ How long were we in # . K J/R VP/J D NSg/I/J/R/Dq Nᴹ/Vg/J NSg+ . . ISg+ VP/J . . NSg/C NPr/VB/J NSg/VLPt IPl+ NPr/J/R/P > there ? ” # R . . > # > “ Why , about an hour . ” # . NSg/VB . J/P D/P+ NSg+ . . > # > “ It was . . . simply amazing , ” she repeated abstractedly . “ But I swore I # . NPr/ISg+ VLPt . . . R Nᴹ/Vg/J . . ISg+ VP/J R . . NSg/C/P ISg/#r+ VB ISg/#r+ > wouldn’t tell it and here I am tantalizing you . ” She yawned gracefully in my # VXB NPr/VB NPr/ISg+ VB/C J/R ISg/#r+ NPr/VLB/J Nᴹ/Vg/J ISgPl+ . . ISg+ VP/J R NPr/J/R/P D$+ > face . “ Please come and see me . . . . Phone book . . . . Under the name of Mrs . # NSg/VB+ . . VB NSg/VBPp/P VB/C NSg/VB NPr/ISg+ . . . . NSg/VB+ NSg/VB+ . . . . NSg/J/P D NSg/VB P NPl+ . > Sigourney Howard . . . . My aunt . . . . ” She was hurrying off as she talked — her # ? NPr+ . . . . D$+ NSg+ . . . . . ISg+ VLPt Nᴹ/Vg/J NSg/VB/J/P R/C/P ISg+ VP/J . ISg/D$+ > brown hand waved a jaunty salute as she melted into her party at the door . # NPr🅪Sg/VB/J+ NSg/VB+ VP/J D/P+ NSg/J+ NSg/VB+ R/C/P ISg+ VP/J P ISg/D$+ NSg/VB/J+ NSg/P D+ NSg/VB+ . > # > Rather ashamed that on my first appearance I had stayed so late , I joined the # NPr/VB/J/R J NSg/I/C/Ddem+ J/P D$+ NSg/J+ NSg+ ISg/#r+ VP VP/J NSg/I/J/R/C NSg/J . ISg/#r+ VP/J D > last of Gatsby’s guests , who were clustered around him . I wanted to explain that # NSg/VB/J P NPr$ NPl/V3+ . NPr/I+ NSg/VLPt VP/J J/P ISg+ . ISg/#r+ VP/J P VB NSg/I/C/Ddem > I’d hunted for him early in the evening and to apologize for not having known # K VP/J R/C/P ISg+ NSg/J/R NPr/J/R/P D N🅪Sg/Vg/J+ VB/C P VB R/C/P NSg/R/C Nᴹ/Vg/J VPp/J > him in the garden . # ISg+ NPr/J/R/P D NSg/VB/J+ . > # > “ Don’t mention it , ” he enjoined me eagerly . “ Don’t give it another thought , old # . VXB NSg/VB NPr/ISg+ . . NPr/ISg+ VP/J NPr/ISg+ R . . VXB NSg/VB NPr/ISg+ I/D N🅪Sg/VP+ . NSg/J > sport . ” The familiar expression held no more familiarity than the hand which # NSg/VB+ . . D+ NSg/J+ N🅪Sg+ VP NSg/Dq/P NPr/I/J/R/Dq NSg+ C/P D+ NSg/VB+ I/C+ > reassuringly brushed my shoulder . “ And don’t forget we’re going up in the # R VP/J D$+ NSg/VB+ . . VB/C VXB VB K Nᴹ/Vg/J NSg/VB/J/P NPr/J/R/P D > hydroplane to - morrow morning , at nine o’clock . ” # NSg/VB P . NPr/VB N🅪Sg/Vg/J+ . NSg/P NSg R . . > # > Then the butler , behind his shoulder : # NSg/J/R/C D NPr/VB . NSg/J/P ISg/D$+ NSg/VB+ . > # > “ Philadelphia wants you on the ’ phone , sir . ” # . NPr+ NPl/V3 ISgPl+ J/P D . NSg/VB . NPr/VB+ . . > # > “ All right , in a minute . Tell them I’ll be right there . . . . Good night . ” # . NSg/I/J/C/Dq NPr/VB/J . NPr/J/R/P D/P+ NSg/VB/J+ . NPr/VB NSg/IPl+ K NSg/VLXB NPr/VB/J R . . . . NPr/VB/J+ N🅪Sg/VB+ . . > # > “ Good night . ” # . NPr/VB/J+ N🅪Sg/VB+ . . > # > “ Good night . ” He smiled — and suddenly there seemed to be a pleasant significance # . NPr/VB/J+ N🅪Sg/VB+ . . NPr/ISg+ VP/J . VB/C R R+ VP/J P NSg/VLXB D/P+ NSg/J+ NSg+ > in having been among the last to go , as if he had desired it all the time . “ Good # NPr/J/R/P Nᴹ/Vg/J NSg/VLPp P D+ NSg/VB/J+ P NSg/VB/J . R/C/P NSg/C NPr/ISg+ VP VP/J NPr/ISg+ NSg/I/J/C/Dq+ D+ N🅪Sg/VB/J+ . . NPr/VB/J > night , old sport . . . . Good night . ” # N🅪Sg/VB+ . NSg/J+ NSg/VB+ . . . . NPr/VB/J+ N🅪Sg/VB+ . . > # > But as I walked down the steps I saw that the evening was not quite over . Fifty # NSg/C/P R/C/P ISg/#r+ VP/J N🅪Sg/VB/J/P D+ NPl/V3+ ISg/#r+ NSg/VPt NSg/I/C/Ddem D+ N🅪Sg/Vg/J+ VLPt NSg/R/C R NSg/J/P . NSg > feet from the door a dozen headlights illuminated a bizarre and tumultuous # NPl P D+ NSg/VB+ D/P NSg NPl VP/J D/P J VB/C J > scene . In the ditch beside the road , right side up , but violently shorn of one # NSg/VB+ . NPr/J/R/P D+ NSg/VB+ P D+ N🅪Sg/J+ . NPr/VB/J+ NSg/VB/J+ NSg/VB/J/P . NSg/C/P R ? P NSg/I/J+ > wheel , rested a new coupé which had left Gatsby’s drive not two minutes before . # NSg/VB+ . VP/J D/P NSg/J ? I/C+ VP NPr/VP/J NPr$ N🅪Sg/VB NSg/R/C NSg NPl/V3+ C/P . > The sharp jut of a wall accounted for the detachment of the wheel , which was now # D NPr/VB/J NSg/VB P D/P NPr/VB+ VP/J R/C/P D N🅪Sg P D NSg/VB+ . I/C+ VLPt NSg/J/R/C > getting considerable attention from half a dozen curious chauffeurs . However , as # NSg/Vg NSg/J NSg+ P N🅪Sg/J/P+ D/P NSg J NPl/V3 . C . R/C/P > they had left their cars blocking the road , a harsh , discordant din from those # IPl+ VP NPr/VP/J D$+ NPl+ Nᴹ/Vg/J D+ N🅪Sg/J+ . D/P VB/J . J NSg/VB+ P I/Ddem > in the rear had been audible for some time , and added to the already violent # NPr/J/R/P D NSg/VB/J VP NSg/VLPp NSg/VB/J R/C/P I/J/R/Dq N🅪Sg/VB/J+ . VB/C VP/J P D R NSg/VB/J > confusion of the scene . # N🅪Sg/VB P D NSg/VB+ . > # > A man in a long duster had dismounted from the wreck and now stood in the middle # D/P NPr/VB/J+ NPr/J/R/P D/P+ NPr/VB/J+ NSg+ VP VP/J P D NSg/VB+ VB/C NSg/J/R/C VP NPr/J/R/P D NSg/VB/J > of the road , looking from the car to the tire and from the tire to the observers # P D N🅪Sg/J+ . Nᴹ/Vg/J P D NSg+ P D NSg/VB+ VB/C P D NSg/VB+ P D NPl+ > in a pleasant , puzzled way . # NPr/J/R/P D/P NSg/J . VP/J NSg/J+ . > # > “ See ! ” he explained . “ It went in the ditch . ” # . NSg/VB . . NPr/ISg+ VP/J . . NPr/ISg+ NSg/VPt NPr/J/R/P D+ NSg/VB+ . . > # > The fact was infinitely astonishing to him , and I recognized first the unusual # D+ NSg+ VLPt R Nᴹ/Vg/J P ISg+ . VB/C ISg/#r+ VP/J NSg/J D NSg/J > quality of wonder , and then the man — it was the late patron of Gatsby’s library . # N🅪Sg/J P N🅪Sg/VB+ . VB/C NSg/J/R/C D NPr/VB/J+ . NPr/ISg+ VLPt D NSg/J NSg/VB P NPr$ NSg+ . > # > “ How’d it happen ? ” # . K NPr/ISg+ VB . . > # > He shrugged his shoulders . # NPr/ISg+ VP ISg/D$+ NPl/V3+ . > # > “ I know nothing whatever about mechanics , ” he said decisively . # . ISg/#r+ VB NSg/I/J+ NSg/I/J+ J/P Nᴹ+ . . NPr/ISg+ VP/J R . > # > “ But how did it happen ? Did you run into the wall ? ” # . NSg/C/P NSg/C VXPt NPr/ISg+ VB . VXPt ISgPl+ NSg/VBPp P D+ NPr/VB+ . . > # > “ Don’t ask me , ” said Owl Eyes , washing his hands of the whole matter . “ I know # . VXB NSg/VB NPr/ISg+ . . VP/J NSg/VB+ NPl/V3+ . Nᴹ/Vg/J ISg/D$+ NPl/V3 P D NSg/J N🅪Sg/VB+ . . ISg/#r+ VB > very little about driving — next to nothing . It happened , and that’s all I know . ” # J/R NPr/I/J/Dq J/P Nᴹ/Vg/J . NSg/J/P P NSg/I/J+ . NPr/ISg+ VP/J . VB/C NSg$ NSg/I/J/C/Dq ISg/#r+ VB . . > # > “ Well , if you’re a poor driver you oughtn’t to try driving at night . ” # . NSg/VB/J/R . NSg/C K D/P+ NSg/VB/J NSg+ ISgPl+ VXB P NSg/VB/J Nᴹ/Vg/J NSg/P N🅪Sg/VB+ . . > # > “ But I wasn’t even trying , ” he explained indignantly , “ I wasn’t even trying . ” # . NSg/C/P ISg/#r+ VPt NSg/VB/J/R Nᴹ/Vg/J . . NPr/ISg+ VP/J R . . ISg/#r+ VPt NSg/VB/J/R Nᴹ/Vg/J . . > # > An awed hush fell upon the bystanders . # D/P VP/J NSg/VB+ NSg/VPt/J P D NPl . > # > “ Do you want to commit suicide ? ” # . VXB ISgPl+ NSg/VB P NSg/VB N🅪Sg/VB+ . . > # > “ You're lucky it was just a wheel ! A bad driver and not even trying ! ” # . + NSg/J NPr/ISg+ VLPt J/R D/P NSg/VB+ . D/P+ NSg/VB/J+ NSg+ VB/C NSg/R/C NSg/VB/J/R Nᴹ/Vg/J . . > # > “ You don’t understand , ” explained the criminal . “ I wasn’t driving . There’s # . ISgPl+ VXB VB . . VP/J D NSg/J . . ISg/#r+ VPt Nᴹ/Vg/J . K > another man in the car . ” # I/D NPr/VB/J+ NPr/J/R/P D NSg+ . . > # > The shock that followed this declaration found voice in a sustained “ Ah - h - h ! ” as # D+ N🅪Sg/J+ NSg/I/C/Ddem+ VP/J I/Ddem+ NSg+ NSg/VP NSg/VB+ NPr/J/R/P D/P VP/J . NSg/I/VB . NSg/J . NSg/J+ . . R/C/P > the door of the coupé swung slowly open . The crowd — it was now a crowd — stepped # D NSg/VB P D ? VPp R NSg/VB/J . D+ NSg/VB+ . NPr/ISg+ VLPt NSg/J/R/C D/P NSg/VB+ . J > back involuntarily , and when the door had opened wide there was a ghostly pause . # NSg/VB/J R . VB/C NSg/I/C D NSg/VB+ VP VP/J NSg/J R+ VLPt D/P J/R NSg/VB+ . > Then , very gradually , part by part , a pale , dangling individual stepped out of # NSg/J/R/C . J/R R . NSg/VB/J+ NSg/P NSg/VB/J+ . D/P NSg/VB/J . Nᴹ/Vg/J NSg/J J NSg/VB/J/R/P P > the wreck , pawing tentatively at the ground with a large uncertain dancing shoe . # D+ NSg/VB+ . Nᴹ/Vg/J R NSg/P D+ N🅪Sg/VB/J+ P D/P NSg/J I/J Nᴹ/Vg/J NSg/VB+ . > # > Blinded by the glare of the headlights and confused by the incessant groaning of # VP/J NSg/P D NSg/VB/J P D NPl VB/C VP/J NSg/P D J Nᴹ/Vg/J P > the horns , the apparition stood swaying for a moment before he perceived the man # D NPl/V3 . D NSg+ VP Nᴹ/Vg/J R/C/P D/P NSg+ C/P NPr/ISg+ VP/J D NPr/VB/J+ > in the duster . # NPr/J/R/P D NSg+ . > # > “ Wha’s matter ? ” he inquired calmly . “ Did we run outa gas ? ” # . ? N🅪Sg/VB+ . . NPr/ISg+ VP/J R . . VXPt IPl+ NSg/VBPp ? NSg/VB/J+ . . > # > “ Look ! ” # . NSg/VB . . > # > Half a dozen fingers pointed at the amputated wheel — he stared at it for a # N🅪Sg/J/P+ D/P+ NSg NPl/V3+ VP/J NSg/P D+ VP/J+ NSg/VB+ . NPr/ISg+ VP/J NSg/P NPr/ISg+ R/C/P D/P+ > moment , and then looked upward as though he suspected that it had dropped from # NSg+ . VB/C NSg/J/R/C VP/J NSg/J R/C/P C NPr/ISg+ VP/J NSg/I/C/Ddem NPr/ISg+ VP VP/J P > the sky . # D+ N🅪Sg/VB+ . > # > “ It came off , ” some one explained . # . NPr/ISg+ NSg/VPt/P NSg/VB/J/P . . I/J/R/Dq+ NSg/I/J+ VP/J . > # > He nodded . # NPr/ISg+ VP . > # > “ At first I din ’ notice we’d stopped . ” # . NSg/P NSg/J ISg/#r+ NSg/VB+ . NSg/VB K VP/J . . > # > A pause . Then , taking a long breath and straightening his shoulders , he remarked # D/P+ NSg/VB+ . NSg/J/R/C . NSg/Vg/J D/P+ NPr/VB/J+ N🅪Sg/VB/J+ VB/C Nᴹ/Vg/J ISg/D$+ NPl/V3+ . NPr/ISg+ VP/J > in a determined voice : # NPr/J/R/P D/P+ VP/J NSg/VB+ . > # > “ Wonder’ff tell me where there’s a gas’line station ? ” # . ? NPr/VB NPr/ISg+ NSg/R/C K D/P ? NSg/VB+ . . > # > At least a dozen men , some of them a little better off than he was , explained to # NSg/P NSg/J/Dq D/P+ NSg+ NPl+ . I/J/R/Dq P NSg/IPl+ D/P NPr/I/J/Dq NSg/VXB/JC NSg/VB/J/P C/P NPr/ISg+ VLPt . VP/J P > him that wheel and car were no longer joined by any physical bond . # ISg+ NSg/I/C/Ddem NSg/VB VB/C NSg+ NSg/VLPt NSg/Dq/P NSg/JC VP/J NSg/P I/R/Dq+ NSg/J+ NPr/VB/J+ . > # > “ Back out , ” he suggested after a moment . “ Put her in reverse . ” # . NSg/VB/J NSg/VB/J/R/P . . NPr/ISg+ VP/J P D/P+ NSg+ . . NSg/VBP ISg/D$+ NPr/J/R/P NSg/VB/J . . > # > “ But the wheel’s off ! ” # . NSg/C/P D NSg$ NSg/VB/J/P . . > # > He hesitated . # NPr/ISg+ VP/J . > # > “ No harm in trying , ” he said . # . NSg/Dq/P+ N🅪Sg/VB+ NPr/J/R/P Nᴹ/Vg/J . . NPr/ISg+ VP/J . > # > The caterwauling horns had reached a crescendo and I turned away and cut across # D Nᴹ/Vg/J NPl/V3 VP VP/J D/P NSg/VB VB/C ISg/#r+ VP/J VB/J VB/C NSg/VBP/J NSg/P > the lawn toward home . I glanced back once . A wafer of a moon was shining over # D NSg/VB+ J/P NSg/VB/J+ . ISg/#r+ VP/J NSg/VB/J NSg/C . D/P NSg/VB P D/P+ NPr/VB+ VLPt Nᴹ/Vg/J NSg/J/P > Gatsby’s house , making the night fine as before , and surviving the laughter and # NPr$ NPr/VB+ . Nᴹ/Vg/J D N🅪Sg/VB+ NSg/VB/J R/C/P C/P . VB/C Nᴹ/Vg/J D Nᴹ+ VB/C > the sound of his still glowing garden . A sudden emptiness seemed to flow now # D N🅪Sg/VB/J P ISg/D$+ NSg/VB/J/R Nᴹ/Vg/J NSg/VB/J+ . D/P+ NSg/J+ Nᴹ+ VP/J P NSg/VB NSg/J/R/C > from the windows and the great doors , endowing with complete isolation the # P D NPrPl/V3 VB/C D+ NSg/J+ NPl/V3+ . Nᴹ/Vg/J P NSg/VB/J Nᴹ+ D > figure of the host , who stood on the porch , his hand up in a formal gesture of # NSg/VB P D NSg/VB+ . NPr/I+ VP J/P D NSg+ . ISg/D$+ NSg/VB+ NSg/VB/J/P NPr/J/R/P D/P NSg/J NSg/VB P > farewell . # NSg/VB/J+ . > # > Reading over what I have written so far , I see I have given the impression that # NPrᴹ/Vg/J NSg/J/P NSg/I+ ISg/#r+ NSg/VXB VPp/J NSg/I/J/R/C NSg/VB/J . ISg/#r+ NSg/VB ISg/#r+ NSg/VXB NSg/VPp/J/P D+ NSg/VB+ NSg/I/C/Ddem > the events of three nights several weeks apart were all that absorbed me . On the # D NPl/V3 P NSg+ NPl/V3+ J/Dq+ NPrPl+ J NSg/VLPt NSg/I/J/C/Dq NSg/I/C/Ddem+ VP/J NPr/ISg+ . J/P D+ > contrary , they were merely casual events in a crowded summer , and , until much # NSg/VB/J+ . IPl+ NSg/VLPt R NSg/J NPl/V3 NPr/J/R/P D/P+ VP/J+ NPr🅪Sg/VB+ . VB/C . C/P NSg/I/J/R/Dq > later , they absorbed me infinitely less than my personal affairs . # JC . IPl+ VP/J NPr/ISg+ R VB/J/R/C/P C/P D$+ NSg/J NPl+ . > # > Most of the time I worked . In the early morning the sun threw my shadow westward # NSg/I/J/R/Dq P D+ N🅪Sg/VB/J+ ISg/#r+ VP/J . NPr/J/R/P D+ NSg/J/R+ N🅪Sg/Vg/J+ D+ NPr/VB+ VPt D$+ NSg/VB/J+ NSg/J > as I hurried down the white chasms of lower New York to the Probity Trust . I # R/C/P ISg/#r+ VP/J N🅪Sg/VB/J/P D NPr🅪Sg/VB/J NPl P NSg/VB/JC NSg/J NPr+ P D Nᴹ N🅪Sg/VB/J . ISg/#r+ > knew the other clerks and young bond - salesmen by their first names , and lunched # VPt D NSg/VB/J NPl/V3 VB/C NPr/VB/J+ NPr/VB/J+ . NPl NSg/P D$+ NSg/J NPl/V3+ . VB/C VP/J > with them in dark , crowded restaurants on little pig sausages and mashed # P NSg/IPl+ NPr/J/R/P NSg/VB/J . VP/J NPl+ J/P NPr/I/J/Dq NSg/VB+ NPl/V3+ VB/C VP/J > potatoes and coffee . I even had a short affair with a girl who lived in Jersey # NPl VB/C N🅪Sg/VB/J+ . ISg/#r+ NSg/VB/J/R VP D/P NPr/VB/J/P NSg P D/P+ NSg/VB+ NPr/I+ VP/J NPr/J/R/P NPr+ > City and worked in the accounting department , but her brother began throwing # NSg+ VB/C VP/J NPr/J/R/P D+ Nᴹ/Vg/J+ NSg+ . NSg/C/P ISg/D$+ NSg/VB/J+ VPt Nᴹ/Vg/J > mean looks in my direction , so when she went on her vacation in July I let it # NSg/VB/J NPl/V3 NPr/J/R/P D$+ N🅪Sg+ . NSg/I/J/R/C NSg/I/C ISg+ NSg/VPt J/P ISg/D$+ NSg/VB+ NPr/J/R/P NPr+ ISg/#r+ NSg/VBP NPr/ISg+ > blow quietly away . # NSg/VB/J R VB/J . > # > I took dinner usually at the Yale Club — for some reason it was the gloomiest # ISg/#r+ VPt N🅪Sg/VB+ R NSg/P D+ NPr+ NSg/VB+ . R/C/P I/J/R/Dq+ N🅪Sg/VB+ NPr/ISg+ VLPt D JS > event of my day — and then I went up - stairs to the library and studied investments # NSg/VB P D$+ NPr🅪Sg+ . VB/C NSg/J/R/C ISg/#r+ NSg/VPt NSg/VB/J/P . NPl+ P D NSg+ VB/C VP/J NPl+ > and securities for a conscientious hour . There were generally a few rioters # VB/C NPl+ R/C/P D/P J NSg+ . R+ NSg/VLPt R D/P NSg/I/Dq NPl > around , but they never came into the library , so it was a good place to work . # J/P . NSg/C/P IPl+ R NSg/VPt/P P D NSg+ . NSg/I/J/R/C NPr/ISg+ VLPt D/P NPr/VB/J N🅪Sg/VB+ P N🅪Sg/VB . > After that , if the night was mellow , I strolled down Madison Avenue past the old # P NSg/I/C/Ddem+ . NSg/C D+ N🅪Sg/VB+ VLPt NSg/VB/J . ISg/#r+ VP/J N🅪Sg/VB/J/P NPr+ NSg+ NSg/VB/J/P D+ NSg/J+ > Murray Hill Hotel , and over 33 d Street to the Pennsylvania Station . # NPr+ NPr/VB+ NSg+ . VB/C NSg/J/P # NPr/J/#r+ NSg/VB/J+ P D+ NPr+ NSg/VB+ . > # > I began to like New York , the racy , adventurous feel of it at night , and the # ISg/#r+ VPt P NSg/VB/J/C/P NSg/J+ NPr+ . D J . J NSg/I/VB P NPr/ISg+ NSg/P N🅪Sg/VB+ . VB/C D > satisfaction that the constant flicker of men and women and machines gives to # Nᴹ+ NSg/I/C/Ddem D NSg/J NSg/VB P NPl VB/C NPl+ VB/C NPl/V3+ NPl/V3 P > the restless eye . I liked to walk up Fifth Avenue and pick out romantic women # D J NSg/VB+ . ISg/#r+ VP/J P NSg/VB NSg/VB/J/P NSg/VB/J+ NSg+ VB/C NSg/VB NSg/VB/J/R/P NSg/J NPl+ > from the crowd and imagine that in a few minutes I was going to enter into their # P D+ NSg/VB+ VB/C NSg/VB NSg/I/C/Ddem NPr/J/R/P D/P+ NSg/I/Dq+ NPl/V3+ ISg/#r+ VLPt Nᴹ/Vg/J P NSg/VB P D$+ > lives , and no one would ever know or disapprove . Sometimes , in my mind , I # V3+ . VB/C NSg/Dq/P+ NSg/I/J+ VXB J/R VB NPr/C VB . R . NPr/J/R/P D$+ NSg/VB+ . ISg/#r+ > followed them to their apartments on the corners of hidden streets , and they # VP/J NSg/IPl+ P D$+ NPl+ J/P D NPl/V3 P VB/J NPl/V3+ . VB/C IPl+ > turned and smiled back at me before they faded through a door into warm # VP/J VB/C VP/J NSg/VB/J NSg/P NPr/ISg+ C/P IPl+ J NSg/J/P D/P+ NSg/VB+ P NSg/VB/J+ > darkness . At the enchanted metropolitan twilight I felt a haunting loneliness # Nᴹ+ . NSg/P D VP/J NSg/J+ Nᴹ/VB/J+ ISg/#r+ N🅪Sg/VP/J D/P Nᴹ/Vg/J Nᴹ > sometimes , and felt it in others — poor young clerks who loitered in front of # R . VB/C N🅪Sg/VP/J NPr/ISg+ NPr/J/R/P NPl/V3+ . NSg/VB/J NPr/VB/J NPl/V3+ NPr/I+ VP/J NPr/J/R/P NSg/VB/J P > windows waiting until it was time for a solitary restaurant dinner — young clerks # NPrPl/V3+ Nᴹ/Vg/J C/P NPr/ISg+ VLPt N🅪Sg/VB/J R/C/P D/P NSg/J NSg+ N🅪Sg/VB+ . NPr/VB/J NPl/V3+ > in the dusk , wasting the most poignant moments of night and life . # NPr/J/R/P D Nᴹ/VB/J+ . Nᴹ/Vg/J D NSg/I/J/R/Dq J NPl P N🅪Sg/VB VB/C N🅪Sg/VB+ . > # > Again at eight o’clock , when the dark lanes of the Forties were lined five deep # P NSg/P NSg/J R . NSg/I/C D NSg/VB/J NPl P D+ NPl+ NSg/VLPt VP/J NSg NSg/J > with throbbing taxicabs , bound for the theatre district , I felt a sinking in my # P NSg/Vg/J NPl/V3 . NSg/VP/J R/C/P D N🅪Sg/Comm+ NSg/VB/J+ . ISg/#r+ N🅪Sg/VP/J D/P Nᴹ/Vg/J+ NPr/J/R/P D$+ > heart . Forms leaned together in the taxis as they waited , and voices sang , and # N🅪Sg/VB+ . NPl/V3+ VP/J J NPr/J/R/P D+ NPl/V3+ R/C/P IPl+ VP/J . VB/C NPl/V3+ NPr/VPt . VB/C > there was laughter from unheard jokes , and lighted cigarettes made # R+ VLPt Nᴹ P VP/J+ NPl/V3+ . VB/C VP/J NPl/V3+ VP > unintelligible circles inside . Imagining that I , too , was hurrying toward gayety # J NPl/V3+ NSg/J/P . Nᴹ/Vg/J NSg/I/C/Ddem+ ISg/#r+ . R . VLPt Nᴹ/Vg/J J/P ? > and sharing their intimate excitement , I wished them well . # VB/C Nᴹ/Vg/J D$+ NSg/VB/J NSg+ . ISg/#r+ VP/J NSg/IPl+ NSg/VB/J/R . > # > For a while I lost sight of Jordan Baker , and then in midsummer I found her # R/C/P D/P+ NSg/VB/C/P+ ISg/#r+ VP/J N🅪Sg/VB P NPr+ NPr+ . VB/C NSg/J/R/C NPr/J/R/P NSg/J ISg/#r+ NSg/VP ISg/D$+ > again . At first I was flattered to go places with her , because she was a golf # P . NSg/P NSg/J ISg/#r+ VLPt VP/J P NSg/VB/J NPl/V3+ P ISg/D$+ . C/P ISg+ VLPt D/P NSg/VB > champion , and every one knew her name . Then it was something more . I wasn’t # NSg/VB/J . VB/C Dq+ NSg/I/J+ VPt ISg/D$+ NSg/VB+ . NSg/J/R/C NPr/ISg+ VLPt NSg/I/J+ NPr/I/J/R/Dq . ISg/#r+ VPt > actually in love , but I felt a sort of tender curiosity . The bored haughty face # R NPr/J/R/P NPr🅪Sg/VB . NSg/C/P ISg/#r+ N🅪Sg/VP/J D/P NSg/VB P NSg/VB/J NSg+ . D VP/J J NSg/VB+ > that she turned to the world concealed something — most affectations conceal # NSg/I/C/Ddem+ ISg+ VP/J P D NSg/VB+ VP/J NSg/I/J+ . NSg/I/J/R/Dq NPl VB > something eventually , even though they don’t in the beginning — and one day I # NSg/I/J+ R . NSg/VB/J/R C IPl+ VXB NPr/J/R/P D NSg/Vg/J+ . VB/C NSg/I/J NPr🅪Sg+ ISg/#r+ > found what it was . When we were on a house - party together up in Warwick , she # NSg/VP NSg/I+ NPr/ISg+ VLPt . NSg/I/C IPl+ NSg/VLPt J/P D/P NPr/VB+ . NSg/VB/J J NSg/VB/J/P NPr/J/R/P NPr+ . ISg+ > left a borrowed car out in the rain with the top down , and then lied about # NPr/VP/J D/P VP/J NSg+ NSg/VB/J/R/P NPr/J/R/P D N🅪Sg/VB P D+ NSg/VB/J+ N🅪Sg/VB/J/P . VB/C NSg/J/R/C NSg/VP/J J/P > it — and suddenly I remembered the story about her that had eluded me that night # NPr/ISg+ . VB/C R ISg/#r+ VP/J D+ NSg/VB+ J/P ISg/D$+ NSg/I/C/Ddem+ VP VP/J NPr/ISg+ NSg/I/C/Ddem+ N🅪Sg/VB+ > at Daisy’s . At her first big golf tournament there was a row that nearly reached # NSg/P NPr$ . NSg/P ISg/D$+ NSg/J+ NSg/J+ NSg/VB+ NSg+ R+ VLPt D/P+ NSg/VB+ NSg/I/C/Ddem+ R VP/J > the newspapers — a suggestion that she had moved her ball from a bad lie in the # D+ NPl/V3+ . D/P+ N🅪Sg+ NSg/I/C/Ddem+ ISg+ VP VP/J ISg/D$+ NPr/VB+ P D/P+ NSg/VB/J+ NPr/VB+ NPr/J/R/P D > semi - final round . The thing approached the proportions of a scandal — then died # NSg . NSg/VB/J NSg/VB/J/P . D+ NSg+ VP/J D NPl/V3 P D/P N🅪Sg/VB+ . NSg/J/R/C VP/J > away . A caddy retracted his statement , and the only other witness admitted that # VB/J . D/P NSg VP/J ISg/D$+ NSg/VB/J+ . VB/C D J/R/C NSg/VB/J NSg/VB+ VP/J NSg/I/C/Ddem > he might have been mistaken . The incident and the name had remained together in # NPr/ISg+ Nᴹ/VXB/J NSg/VXB NSg/VLPp VPp/J . D NSg/J VB/C D+ NSg/VB+ VP VP/J J NPr/J/R/P > my mind . # D$+ NSg/VB+ . > # > Jordan Baker instinctively avoided clever , shrewd men , and now I saw that this # NPr+ NPr+ R VP/J J . J+ NPl+ . VB/C NSg/J/R/C ISg/#r+ NSg/VPt NSg/I/C/Ddem I/Ddem+ > was because she felt safer on a plane where any divergence from a code would be # VLPt C/P ISg+ N🅪Sg/VP/J NSg/JC J/P D/P NSg/VB/J+ NSg/R/C I/R/Dq N🅪Sg P D/P N🅪Sg/VB+ VXB NSg/VLXB > thought impossible . She was incurably dishonest . She wasn’t able to endure being # N🅪Sg/VP NSg/J . ISg+ VLPt R VB/J . ISg+ VPt NSg/VB/J P VB N🅪Sg/VLg/J/C > at a disadvantage and , given this unwillingness , I suppose she had begun dealing # NSg/P D/P N🅪Sg/VB VB/C . NSg/VPp/J/P I/Ddem NSg+ . ISg/#r+ VB ISg+ VP VPp Nᴹ/Vg/J > in subterfuges when she was very young in order to keep that cool , insolent # NPr/J/R/P NPl NSg/I/C ISg+ VLPt J/R NPr/VB/J NPr/J/R/P N🅪Sg/VB+ P NSg/VB NSg/I/C/Ddem NSg/VB/J . NSg/J > smile turned to the world and yet satisfy the demands of her hard , jaunty body . # NSg/VB+ VP/J P D NSg/VB+ VB/C NSg/VB/C VB D NPl/V3 P ISg/D$+ N🅪Sg/J/R . NSg/J NSg/VB+ . > # > It made no difference to me . Dishonesty in a woman is a thing you never blame # NPr/ISg+ VP NSg/Dq/P+ N🅪Sg/VB+ P NPr/ISg+ . Nᴹ NPr/J/R/P D/P NSg/VB+ VL3 D/P NSg+ ISgPl+ R NSg/VB/J > deeply — I was casually sorry , and then I forgot . It was on that same house party # R . ISg/#r+ VLPt R NSg/VB/J . VB/C NSg/J/R/C ISg/#r+ VPt . NPr/ISg+ VLPt J/P NSg/I/C/Ddem+ I/J+ NPr/VB+ NSg/VB/J+ > that we had a curious conversation about driving a car . It started because she # NSg/I/C/Ddem+ IPl+ VP D/P J N🅪Sg/VB+ J/P Nᴹ/Vg/J D/P+ NSg+ . NPr/ISg+ VP/J C/P ISg+ > passed so close to some workmen that our fender flicked a button on one man’s # VP/J NSg/I/J/R/C NSg/VB/J P I/J/R/Dq+ NPl+ NSg/I/C/Ddem+ D$+ NSg/VB VP/J D/P NSg/VB+ J/P NSg/I/J NPr$/I/VB/J > coat . # NSg/VB+ . > # > “ You’re a rotten driver , ” I protested . “ Either you ought to be more careful , or # . K D/P+ J NSg+ . . ISg/#r+ VP/J . . I/C ISgPl+ NSg/I/VXB P NSg/VLXB NPr/I/J/R/Dq J . NPr/C > you oughtn’t to drive at all . ” # ISgPl+ VXB P N🅪Sg/VB NSg/P NSg/I/J/C/Dq . . > # > “ I am careful . ” # . ISg/#r+ NPr/VLB/J J . . > # > “ No , you’re not . ” # . NSg/Dq/P . K NSg/R/C . . > # > “ Well , other people are , ” she said lightly . # . NSg/VB/J/R . NSg/VB/J+ NPl/VB+ VLB . . ISg+ VP/J R . > # > “ What’s that got to do with it ? ” # . K NSg/I/C/Ddem+ VP P VXB P NPr/ISg+ . . > # > “ They’ll keep out of my way , ” she insisted . “ It takes two to make an accident . ” # . K NSg/VB NSg/VB/J/R/P P D$+ NSg/J+ . . ISg+ VP/J . . NPr/ISg+ NPl/V3 NSg P NSg/VB D/P+ NSg/J+ . . > # > “ Suppose you met somebody just as careless as yourself . ” # . VB ISgPl+ VP NSg/I+ J/R R/C/P J R/C/P ISg+ . . > # > “ I hope I never will , ” she answered . “ I hate careless people . That’s why I like # . ISg/#r+ NPr🅪Sg/VB ISg/#r+ R NPr/VXB . . ISg+ VP/J . . ISg/#r+ N🅪Sg/VB J NPl/VB+ . NSg$ NSg/VB ISg/#r+ NSg/VB/J/C/P > you . ” # ISgPl+ . . > # > Her gray , sun - strained eyes stared straight ahead , but she had deliberately # ISg/D$+ NPr🅪Sg/VB/J/Am . NPr/VB+ . VP/J NPl/V3+ VP/J NSg/VB/J/R R . NSg/C/P ISg+ VP R > shifted our relations , and for a moment I thought I loved her . But I am # VP/J D$+ + . VB/C R/C/P D/P NSg+ ISg/#r+ N🅪Sg/VP ISg/#r+ VP/J ISg/D$+ . NSg/C/P ISg/#r+ NPr/VLB/J > slow - thinking and full of interior rules that act as brakes on my desires , and I # NSg/VB/J . Nᴹ/Vg/J VB/C NSg/VB/J P NSg/J+ NPl/V3+ NSg/I/C/Ddem+ NPr/VB R/C/P NPl/V3+ J/P D$+ NPl/V3 . VB/C ISg/#r+ > knew that first I had to get myself definitely out of that tangle back home . I'd # VPt NSg/I/C/Ddem NSg/J ISg/#r+ VP P NSg/VB ISg+ R NSg/VB/J/R/P P NSg/I/C/Ddem+ NSg/VB NSg/VB/J NSg/VB/J+ . + > been writing letters once a week and signing them : “ Love , Nick , ” and all I could # NSg/VLPp Nᴹ/Vg/J NPl/V3+ NSg/C D/P+ NSg/J+ VB/C Nᴹ/Vg/J NSg/IPl+ . . NPr🅪Sg/VB . NPr/VB+ . . VB/C NSg/I/J/C/Dq ISg/#r+ NSg/VXB > think of was how , when that certain girl played tennis , a faint mustache of # NSg/VB P VLPt NSg/C . NSg/I/C NSg/I/C/Ddem+ I/J+ NSg/VB+ VP/J NSg/VB+ . D/P NSg/VB/J NSg P > perspiration appeared on her upper lip . Nevertheless there was a vague # Nᴹ+ VP/J J/P ISg/D$+ NSg/J+ NSg/VB+ . R R+ VLPt D/P+ NSg/VB/J+ > understanding that had to be tactfully broken off before I was free . # N🅪Sg/Vg/J+ NSg/I/C/Ddem+ VP P NSg/VLXB R VPp/J NSg/VB/J/P C/P ISg/#r+ VLPt NSg/VB/J . > # > Every one suspects himself of at least one of the cardinal virtues , and this is # Dq NSg/I/J NPl/V3 ISg+ P NSg/P NSg/J/Dq NSg/I/J P D+ NSg/J+ NPl+ . VB/C I/Ddem+ VL3 > mine : I am one of the few honest people that I have ever known . # NSg/I/VB+ . ISg/#r+ NPr/VLB/J NSg/I/J P D+ NSg/I/Dq+ VB/JS+ NPl/VB+ NSg/I/C/Ddem+ ISg/#r+ NSg/VXB J/R VPp/J . > # > CHAPTER IV # HeadingStart NSg/VB+ NSg/J/#r+ > # > On Sunday morning while church bells rang in the villages alongshore , the world # J/P NSg/VB+ N🅪Sg/Vg/J+ NSg/VB/C/P NPr🅪Sg/VB+ NPl/V3 VPt NPr/J/R/P D NPl+ J . D NSg/VB+ > and its mistress returned to Gatsby’s house and twinkled hilariously on his # VB/C ISg/D$+ NSg/VB+ VP/J P NPr$ NPr/VB+ VB/C VP/J R J/P ISg/D$+ > lawn . # NSg/VB+ . > # > “ He’s a bootlegger , ” said the young ladies , moving somewhere between his # . NPr$ D/P NSg . . VP/J D NPr/VB/J NPl/V3+ . Nᴹ/Vg/J NSg NSg/P ISg/D$+ > cocktails and his flowers . “ One time he killed a man who had found out that he # NPl/V3+ VB/C ISg/D$+ NPrPl/V3+ . . NSg/I/J+ N🅪Sg/VB/J+ NPr/ISg+ VP/J D/P+ NPr/VB/J+ NPr/I+ VP NSg/VP NSg/VB/J/R/P NSg/I/C/Ddem NPr/ISg+ > was nephew to Von Hindenburg and second cousin to the devil . Reach me a rose , # VLPt NSg P ? NPr VB/C NSg/VB/J NSg/VB+ P D NPr/VB+ . NSg/VB NPr/ISg+ D/P NPr/VPt/J+ . > honey , and pour me a last drop into that there crystal glass . ” # N🅪Sg/VB/J+ . VB/C NSg/VB NPr/ISg+ D/P+ NSg/VB/J+ NSg/VB+ P NSg/I/C/Ddem R+ NPr🅪Sg/J+ NPr🅪Sg/VB+ . . > # > Once I wrote down on the empty spaces of a timetable the names of those who came # NSg/C ISg/#r+ VPt N🅪Sg/VB/J/P J/P D NSg/VB/J NPl/V3 P D/P+ NSg/VB+ D NPl/V3 P I/Ddem+ NPr/I+ NSg/VPt/P > to Gatsby’s house that summer . It is an old time - table now , disintegrating at # P NPr$ NPr/VB+ NSg/I/C/Ddem+ NPr🅪Sg/VB+ . NPr/ISg+ VL3 D/P NSg/J N🅪Sg/VB/J . NSg/VB+ NSg/J/R/C . Nᴹ/Vg/J NSg/P > its folds , and headed “ This schedule in effect July 5th , 1922 . ” But I can still # ISg/D$+ NPl/V3+ . VB/C VP/J . I/Ddem NSg/VB+ NPr/J/R/P NSg/VB+ NPr+ # . # . . NSg/C/P ISg/#r+ NPr/VXB NSg/VB/J/R > read the gray names , and they will give you a better impression than my # NSg/VBP D+ NPr🅪Sg/VB/J/Am+ NPl/V3+ . VB/C IPl+ NPr/VXB NSg/VB ISgPl+ D/P+ NSg/VXB/JC+ NSg/VB+ C/P D$+ > generalities of those who accepted Gatsby’s hospitality and paid him the subtle # NPl P I/Ddem NPr/I+ VP/J NPr$ Nᴹ+ VB/C VP/J ISg+ D J > tribute of knowing nothing whatever about him . # NSg/VB P NSg/Vg/J/P NSg/I/J+ NSg/I/J+ J/P ISg+ . > # > From East Egg , then , came the Chester Beckers and the Leeches , and a man named # P NPr/J+ N🅪Sg/VB+ . NSg/J/R/C . NSg/VPt/P D+ NPr+ ? VB/C D NPl/V3 . VB/C D/P NPr/VB/J+ VP/J > Bunsen , whom I knew at Yale , and Doctor Webster Civet , who was drowned last # NPr . I+ ISg/#r+ VPt NSg/P NPr+ . VB/C NSg/VB+ NPr NSg+ . NPr/I+ VLPt VP/J NSg/VB/J > summer up in Maine . And the Hornbeams and the Willie Voltaires , and a whole clan # NPr🅪Sg/VB+ NSg/VB/J/P NPr/J/R/P NPr+ . VB/C D ? VB/C D NPr+ ? . VB/C D/P NSg/J NSg+ > named Blackbuck , who always gathered in a corner and flipped up their noses like # VP/J ? . NPr/I+ R VP/J NPr/J/R/P D/P NSg/VB+ VB/C VP NSg/VB/J/P D$+ NPl/V3 NSg/VB/J/C/P > goats at whosoever came near . And the Ismays and the Chrysties ( or rather Hubert # NPl/V3+ NSg/P I+ NSg/VPt/P NSg/VB/J/P . VB/C D ? VB/C D ? . NPr/C NPr/VB/J/R NPr > Auerbach and Mr . Chrystie’s wife ) , and Edgar Beaver , whose hair , they say , # ? VB/C NSg+ . ? NSg/VB/J+ . . VB/C NPr+ NSg/VB+ . I+ N🅪Sg/VB+ . IPl+ NSg/VB . > turned cotton - white one winter afternoon for no good reason at all . # VP/J NPr🅪Sg/VB/J+ . NPr🅪Sg/VB/J NSg/I/J N🅪Sg/VB+ N🅪Sg+ R/C/P NSg/Dq/P NPr/VB/J N🅪Sg/VB+ NSg/P NSg/I/J/C/Dq . > # > Clarence Endive was from East Egg , as I remember . He came only once , in white # NPr NSg VLPt P NPr/J+ N🅪Sg/VB+ . R/C/P ISg/#r+ NSg/VB . NPr/ISg+ NSg/VPt/P J/R/C NSg/C . NPr/J/R/P NPr🅪Sg/VB/J > knickerbockers , and had a fight with a bum named Etty in the garden . From # NSg . VB/C VP D/P NSg/VB+ P D/P NSg/VB/J VP/J ? NPr/J/R/P D NSg/VB/J+ . P > farther out on the Island came the Cheadles and the O. R. P. Schraeders , and the # VB/JC NSg/VB/J/R/P J/P D+ NSg/VB+ NSg/VPt/P D ? VB/C D ? ? ? ? . VB/C D > Stonewall Jackson Abrams of Georgia , and the Fishguards and the Ripley Snells . # NSg/VB/J NPr+ NPrPl P NPr+ . VB/C D ? VB/C D NPr ? . > Snell was there three days before he went to the penitentiary , so drunk out on # NPr VLPt R+ NSg NPl+ C/P NPr/ISg+ NSg/VPt P D NSg/J+ . NSg/I/J/R/C NSg/VPp/J NSg/VB/J/R/P J/P > the gravel drive that Mrs . Ulysses Swett’s automobile ran over his right hand . # D Nᴹ/VB/J+ N🅪Sg/VB NSg/I/C/Ddem NPl+ . NPr+ ? NSg/VB/J NSg/VPt NSg/J/P ISg/D$+ NPr/VB/J NSg/VB+ . > The Dancies came , too , and S. B. Whitebait , who was well over sixty , and Maurice # D ? NSg/VPt/P . R . VB/C ? ? NSg/VB . NPr/I+ VLPt NSg/VB/J/R NSg/J/P NSg . VB/C NPr > A. Flink , and the Hammerheads , and Beluga the tobacco importer , and Beluga’s # ? ? . VB/C D NPl . VB/C NSg D N🅪Sg+ NSg . VB/C NSg$ > girls . # NPl/V3+ . > # > From West Egg came the Poles and the Mulreadys and Cecil Roebuck and Cecil # P NPr/VB/J+ N🅪Sg/VB+ NSg/VPt/P D+ NPrPl/V3+ VB/C D ? VB/C NPr NSg VB/C NPr > Schoen and Gulick the State senator and Newton Orchid , who controlled Films Par # ? VB/C ? D N🅪Sg/VB+ NSg VB/C NPr+ NSg/J . NPr/I+ VP/J NPl/V3+ NSg/VB/J/P > Excellence , and Eckhaust and Clyde Cohen and Don S. Schwartze ( the son ) and # NSg+ . VB/C ? VB/C NPr NPr VB/C NPr/VB+ ? ? . D NPr/VB+ . VB/C > Arthur McCarty , all connected with the movies in one way or another . And the # NPr+ NPr . NSg/I/J/C/Dq VP/J+ P D NPl+ NPr/J/R/P NSg/I/J NSg/J+ NPr/C I/D . VB/C D > Catlips and the Bembergs and G. Earl Muldoon , brother to that Muldoon who # ? VB/C D ? VB/C ? NPr+ ? . NSg/VB/J+ P NSg/I/C/Ddem+ ? NPr/I+ > afterward strangled his wife . Da Fontano the promoter came there , and Ed Legros # R/Am VP/J ISg/D$+ NSg/VB/J+ . NPr/VB/J+ ? D NSg NSg/VPt/P R . VB/C NPr/J+ ? > and James B. ( “ Rot - Gut ” ) Ferret and the De Jongs and Ernest Lilly — they came to # VB/C NPrPl+ ? . . N🅪Sg/VB+ . N🅪Sg/VB/J+ . . NSg/VB VB/C D NPr+ ? VB/C NPr+ NPr . IPl+ NSg/VPt/P P > gamble , and when Ferret wandered into the garden it meant he was cleaned out and # NPr/VB . VB/C NSg/I/C NSg/VB VP/J P D NSg/VB/J+ NPr/ISg+ VP NPr/ISg+ VLPt VP/J NSg/VB/J/R/P VB/C > Associated Traction would have to fluctuate profitably next day . # VP/J Nᴹ/VB VXB NSg/VXB P VB R NSg/J/P NPr🅪Sg+ . > # > A man named Klipspringer was there so often and so long that he became known as # D/P+ NPr/VB/J+ VP/J ? VLPt R+ NSg/I/J/R/C R VB/C NSg/I/J/R/C NPr/VB/J NSg/I/C/Ddem NPr/ISg+ VPt VPp/J R/C/P > “ the boarder ” — I doubt if he had any other home . Of theatrical people there were # . D NSg+ . . ISg/#r+ N🅪Sg/VB NSg/C NPr/ISg+ VP I/R/Dq NSg/VB/J NSg/VB/J+ . P NSg/J+ NPl/VB+ R+ NSg/VLPt > Gus Waize and Horace O’Donavan and Lester Myer and George Duckweed and Francis # NPr+ ? VB/C NPr+ ? VB/C NPr ? VB/C NPr+ Nᴹ VB/C NPr+ > Bull . Also from New York were the Chromes and the Backhyssons and the Dennickers # NSg/VB/J+ . R/C P NSg/J+ NPr+ NSg/VLPt D NPl/V3 VB/C D ? VB/C D ? > and Russel Betty and the Corrigans and the Kellehers and the Dewars and the # VB/C NPr NPr+ VB/C D ? VB/C D ? VB/C D ? VB/C D > Scullys and S. W. Belcher and the Smirkes and the young Quinns , divorced now , # ? VB/C ? ? ? VB/C D ? VB/C D NPr/VB/J ? . VP/J NSg/J/R/C . > and Henry L. Palmetto , who killed himself by jumping in front of a subway train # VB/C NPr+ ? NSg . NPr/I+ VP/J ISg+ NSg/P Nᴹ/Vg/J NPr/J/R/P NSg/VB/J P D/P NSg/VB+ NSg/VB+ > in Times Square . # NPr/J/R/P NPl/V3+ NSg/VB/J . > # > Benny McClenahan arrived always with four girls . They were never quite the same # NPr ? VP/J R P NSg NPl/V3+ . IPl+ NSg/VLPt R R D I/J > ones in physical person , but they were so identical one with another that it # NPl NPr/J/R/P NSg/J+ NSg/VB+ . NSg/C/P IPl+ NSg/VLPt NSg/I/J/R/C NSg/J NSg/I/J P I/D NSg/I/C/Ddem NPr/ISg+ > inevitably seemed they had been there before . I have forgotten their # R VP/J IPl+ VP NSg/VLPp R+ C/P . ISg/#r+ NSg/VXB NSg/VPp/J D$+ > names — Jaqueline , I think , or else Consuela , or Gloria or Judy or June , and their # NPl/V3+ . ? . ISg/#r+ NSg/VB . NPr/C NSg/J/C ? . NPr/C NPr NPr/C NPr NPr/C NPr+ . VB/C D$+ > last names were either the melodious names of flowers and months or the sterner # NSg/VB/J NPl/V3+ NSg/VLPt I/C D J NPl/V3 P NPrPl/V3 VB/C NPl+ NPr/C D NSg/JC > ones of the great American capitalists whose cousins , if pressed , they would # NPl P D NSg/J NPr/J NPl I+ NPl/V3+ . NSg/C VP/J . IPl+ VXB > confess themselves to be . # NSg/VB/J IPl+ P NSg/VLXB . > # > In addition to all these I can remember that Faustina O’Brien came there at # NPr/J/R/P NSg+ P NSg/I/J/C/Dq I/Ddem+ ISg/#r+ NPr/VXB NSg/VB NSg/I/C/Ddem ? NPr NSg/VPt/P R NSg/P > least once and the Baedeker girls and young Brewer , who had his nose shot off in # NSg/J/Dq NSg/C VB/C D NPr NPl/V3+ VB/C NPr/VB/J NPr . NPr/I+ VP ISg/D$+ NSg/VB+ NSg/VP/J+ NSg/VB/J/P NPr/J/R/P > the war , and Mr . Albrucksburger and Miss Haag , his fiancée , and Ardita # D N🅪Sg/VB+ . VB/C NSg+ . ? VB/C NSg/VB ? . ISg/D$+ ? . VB/C ? > Fitz - Peters and Mr . P. Jewett , once head of the American Legion , and Miss # ? . NPr VB/C NSg+ . ? ? . NSg/C NPr/VB/J P D NPr/J NSg/VB/J+ . VB/C NSg/VB > Claudia Hip , with a man reputed to be her chauffeur , and a prince of something , # NPr+ NSg/VB/J+ . P D/P NPr/VB/J+ VP/J P NSg/VLXB ISg/D$+ NSg/VB . VB/C D/P NPr/VB/J P NSg/I/J+ . > whom we called Duke , and whose name , if I ever knew it , I have forgotten . # I+ IPl+ VP/J NPr/VB+ . VB/C I+ NSg/VB+ . NSg/C ISg/#r+ J/R VPt NPr/ISg+ . ISg/#r+ NSg/VXB NSg/VPp/J . > # > All these people came to Gatsby’s house in the summer . # NSg/I/J/C/Dq I/Ddem+ NPl/VB+ NSg/VPt/P P NPr$ NPr/VB+ NPr/J/R/P D NPr🅪Sg/VB+ . > # > At nine o’clock , one morning late in July , Gatsby’s gorgeous car lurched up the # NSg/P NSg R . NSg/I/J N🅪Sg/Vg/J+ NSg/J NPr/J/R/P NPr+ . NPr$ J+ NSg+ VP/J NSg/VB/J/P D > rocky drive to my door and gave out a burst of melody from its three - noted horn . # NPr/J N🅪Sg/VB P D$+ NSg/VB+ VB/C VPt NSg/VB/J/R/P D/P NSg/VB P NPr🅪Sg P ISg/D$+ NSg . VP/J NPr/VB+ . > It was the first time he had called on me , though I had gone to two of his # NPr/ISg+ VLPt D NSg/J N🅪Sg/VB/J NPr/ISg+ VP VP/J J/P NPr/ISg+ . C ISg/#r+ VP VPp/J/P P NSg P ISg/D$+ > parties , mounted in his hydroplane , and , at his urgent invitation , made frequent # NPl/V3+ . VP/J NPr/J/R/P ISg/D$+ NSg/VB . VB/C . NSg/P ISg/D$+ J NSg+ . VP VB/J > use of his beach . # N🅪Sg/VB P ISg/D$+ NPr/VB+ . > # > “ Good morning , old sport . You’re having lunch with me to - day and I thought we’d # . NPr/VB/J N🅪Sg/Vg/J+ . NSg/J+ NSg/VB+ . K Nᴹ/Vg/J N🅪Sg/VB+ P NPr/ISg+ P . NPr🅪Sg+ VB/C ISg/#r+ N🅪Sg/VP K > ride up together . ” # NSg/VB+ NSg/VB/J/P J . . > # > He was balancing himself on the dashboard of his car with that resourcefulness # NPr/ISg+ VLPt Nᴹ/Vg/J ISg+ J/P D NSg/VB P ISg/D$+ NSg+ P NSg/I/C/Ddem+ Nᴹ > of movement that is so peculiarly American — that comes , I suppose , with the # P N🅪Sg+ NSg/I/C/Ddem+ VL3 NSg/I/J/R/C R NPr/J . NSg/I/C/Ddem+ NPl/V3 . ISg/#r+ VB . P D > absence of lifting work in youth and , even more , with the formless grace of our # N🅪Sg P Nᴹ/Vg/J N🅪Sg/VB+ NPr/J/R/P NSg+ VB/C . NSg/VB/J/R NPr/I/J/R/Dq . P D J NPr🅪Sg/VB P D$+ > nervous , sporadic games . This quality was continually breaking through his # J . J NPl/V3+ . I/Ddem+ N🅪Sg/J+ VLPt R Nᴹ/Vg/J NSg/J/P ISg/D$+ > punctilious manner in the shape of restlessness . He was never quite still ; there # J NSg+ NPr/J/R/P D N🅪Sg/VB+ P NSg . NPr/ISg+ VLPt R R NSg/VB/J/R . R+ > was always a tapping foot somewhere or the impatient opening and closing of a # VLPt R D/P Nᴹ/Vg NSg/VB+ NSg NPr/C D+ J+ Nᴹ/Vg/J+ VB/C Nᴹ/Vg/J P D/P+ > hand . # NSg/VB+ . > # > He saw me looking with admiration at his car . # NPr/ISg+ NSg/VPt NPr/ISg+ Nᴹ/Vg/J P NSg+ NSg/P ISg/D$+ NSg+ . > # > “ It’s pretty , isn’t it , old sport ? ” He jumped off to give me a better view . # . K NSg/VB/J/R . NSg/VX3 NPr/ISg+ . NSg/J NSg/VB+ . . NPr/ISg+ VP/J NSg/VB/J/P P NSg/VB NPr/ISg+ D/P+ NSg/VXB/JC+ NSg/VB+ . > “ Haven’t you ever seen it before ? ” # . VXB ISgPl+ J/R NSg/VPp NPr/ISg+ C/P . . > # > I’d seen it . Everybody had seen it . It was a rich cream color , bright with # K NSg/VPp NPr/ISg+ . NSg/I+ VP NSg/VPp NPr/ISg+ . NPr/ISg+ VLPt D/P NPr/VB/J N🅪Sg/VB/J N🅪Sg/VB/J/Am . NPr/VB/J P > nickel , swollen here and there in its monstrous length with triumphant hat - boxes # NSg/VB/J . VB/J J/R VB/C R NPr/J/R/P ISg/D$+ J N🅪Sg/VB+ P J NSg/VB+ . NPl/V3 > and supper - boxes and tool - boxes , and terraced with a labyrinth of wind - shields # VB/C NSg/VB+ . NPl/V3 VB/C NSg/VB+ . NPl/V3+ . VB/C VP/J P D/P NSg/VB P N🅪Sg/VB+ . NPrPl/V3+ > that mirrored a dozen suns . Sitting down behind many layers of glass in a sort # NSg/I/C/Ddem VP/J D/P NSg NPrPl/V3 . NSg/Vg/J N🅪Sg/VB/J/P NSg/J/P NSg/I/J/Dq NPl/V3 P NPr🅪Sg/VB+ NPr/J/R/P D/P NSg/VB > of green leather conservatory , we started to town . # P NPr🅪Sg/VB/J+ N🅪Sg/VB/J+ NSg/J+ . IPl+ VP/J P NSg . > # > I had talked with him perhaps half a dozen times in the past month and found , to # ISg/#r+ VP VP/J P ISg+ NSg/R N🅪Sg/J/P D/P+ NSg+ NPl/V3+ NPr/J/R/P D+ NSg/VB/J/P+ NSg/J+ VB/C NSg/VP . P > my disappointment , that he had little to say . So my first impression , that he # D$+ NSg+ . NSg/I/C/Ddem NPr/ISg+ VP NPr/I/J/Dq P NSg/VB . NSg/I/J/R/C D$+ NSg/J+ NSg/VB+ . NSg/I/C/Ddem NPr/ISg+ > was a person of some undefined consequence , had gradually faded and he had # VLPt D/P NSg/VB P I/J/R/Dq VP/J NSg/VB+ . VP R J VB/C NPr/ISg+ VP > become simply the proprietor of an elaborate road - house next door . # VBPp R D NSg P D/P VB/J N🅪Sg/J+ . NPr/VB+ NSg/J/P+ NSg/VB+ . > # > And then came that disconcerting ride . We hadn’t reached West Egg Village before # VB/C NSg/J/R/C NSg/VPt/P NSg/I/C/Ddem Nᴹ/Vg/J NSg/VB+ . IPl+ VPt VP/J NPr/VB/J+ N🅪Sg/VB+ NSg+ C/P > Gatsby began leaving his elegant sentences unfinished and slapping himself # NPr VPt Nᴹ/Vg/J ISg/D$+ NSg/J NPl/V3+ VP/J VB/C NSg/Vg/J ISg+ > indecisively on the knee of his caramel - colored suit . # R J/P D NSg/VB P ISg/D$+ N🅪Sg/VB/J+ . NSg/VP/J/Am NSg/VB+ . > # > “ Look here , old sport , ” he broke out surprisingly , “ what’s your opinion of me , # . NSg/VB J/R . NSg/J+ NSg/VB+ . . NPr/ISg+ NSg/VPt/J NSg/VB/J/R/P R . . K D$+ N🅪Sg P NPr/ISg+ . > anyhow ? ” # J . . > # > A little overwhelmed , I began the generalized evasions which that question # D/P+ NPr/I/J/Dq+ VP/J+ . ISg/#r+ VPt D VP/J NPl I/C+ NSg/I/C/Ddem NSg/VB+ > deserves . # NPl/V3 . > # > “ Well , I’m going to tell you something about my life , ” he interrupted . “ I don’t # . NSg/VB/J/R . K Nᴹ/Vg/J P NPr/VB ISgPl+ NSg/I/J+ J/P D$+ N🅪Sg/VB+ . . NPr/ISg+ VP/J . . ISg/#r+ VXB > want you to get a wrong idea of me from all these stories you hear . ” # NSg/VB ISgPl+ P NSg/VB D/P NSg/VB/J/R NSg P NPr/ISg+ P NSg/I/J/C/Dq I/Ddem NPl/V3+ ISgPl+ VB . . > # > So he was aware of the bizarre accusations that flavored conversation in his # NSg/I/J/R/C NPr/ISg+ VLPt VB/J P D+ J+ NPl+ NSg/I/C/Ddem+ VP/J/Am N🅪Sg/VB NPr/J/R/P ISg/D$+ > halls . # NPl+ . > # > “ I’ll tell you God’s truth . ” His right hand suddenly ordered divine retribution # . K NPr/VB ISgPl+ NPr$ N🅪Sg/VB+ . . ISg/D$+ NPr/VB/J+ NSg/VB+ R VP/J NPr/VB/J NSg > to stand by . “ I am the son of some wealthy people in the Middle West — all dead # P NSg/VB NSg/P . . ISg/#r+ NPr/VLB/J D NPr/VB P I/J/R/Dq NSg/J NPl/VB NPr/J/R/P D+ NSg/VB/J+ NPr/VB/J+ . NSg/I/J/C/Dq NSg/VB/J > now . I was brought up in America but educated at Oxford , because all my # NSg/J/R/C . ISg/#r+ VLPt VP NSg/VB/J/P NPr/J/R/P NPr+ NSg/C/P VP/J NSg/P NPr+ . C/P NSg/I/J/C/Dq+ D$+ > ancestors have been educated there for many years . It is a family tradition . ” # NPl/V3+ NSg/VXB NSg/VLPp VP/J R R/C/P NSg/I/J/Dq+ NPl+ . NPr/ISg+ VL3 D/P N🅪Sg/J N🅪Sg/VB . . > # > He looked at me sideways — and I knew why Jordan Baker had believed he was lying . # NPr/ISg+ VP/J NSg/P NPr/ISg+ NSg/J . VB/C ISg/#r+ VPt NSg/VB NPr+ NPr+ VP VP/J NPr/ISg+ VLPt Nᴹ/Vg/J . > He hurried the phrase “ educated at Oxford , ” or swallowed it , or choked on it , as # NPr/ISg+ VP/J D+ NSg/VB+ . VP/J NSg/P NPr+ . . NPr/C VP/J NPr/ISg+ . NPr/C VP/J J/P NPr/ISg+ . R/C/P > though it had bothered him before . And with this doubt , his whole statement fell # C NPr/ISg+ VP VP/J ISg+ C/P . VB/C P I/Ddem+ N🅪Sg/VB+ . ISg/D$+ NSg/J+ NSg/VB/J+ NSg/VPt/J > to pieces , and I wondered if there wasn’t something a little sinister about him , # P NPl/V3 . VB/C ISg/#r+ VP/J NSg/C R+ VPt NSg/I/J+ D/P NPr/I/J/Dq J J/P ISg+ . > after all . # P NSg/I/J/C/Dq . > # > “ What part of the Middle West ? ” I inquired casually . # . NSg/I+ NSg/VB/J P D+ NSg/VB/J+ NPr/VB/J+ . . ISg/#r+ VP/J R . > # > “ San Francisco . ” # . NPr+ NPr+ . . > # > “ I see . ” # . ISg/#r+ NSg/VB . . > # > “ My family all died and I came into a good deal of money . ” # . D$+ N🅪Sg/J NSg/I/J/C/Dq VP/J VB/C ISg/#r+ NSg/VPt/P P D/P NPr/VB/J NSg/VB/J P N🅪Sg/J+ . . > # > His voice was solemn , as if the memory of that sudden extinction of a clan still # ISg/D$+ NSg/VB+ VLPt J . R/C/P NSg/C D N🅪Sg P NSg/I/C/Ddem NSg/J N🅪Sg P D/P+ NSg+ NSg/VB/J/R > haunted him . For a moment I suspected that he was pulling my leg , but a glance # VP/J ISg+ . R/C/P D/P+ NSg+ ISg/#r+ VP/J NSg/I/C/Ddem NPr/ISg+ VLPt Nᴹ/Vg/J D$+ NSg/VB/J+ . NSg/C/P D/P+ NSg/VB+ > at him convinced me otherwise . # NSg/P ISg+ VP/J NPr/ISg+ J/R . > # > “ After that I lived like a young rajah in all the capitals of Europe — Paris , # . P NSg/I/C/Ddem ISg/#r+ VP/J NSg/VB/J/C/P D/P NPr/VB/J NSg NPr/J/R/P NSg/I/J/C/Dq D NPl P NPr+ . NPr+ . > Venice , Rome — collecting jewels , chiefly rubies , hunting big game , painting a # NPr+ . NPr+ . Nᴹ/Vg/J NPl/V3+ . R NPl/V3 . Nᴹ/Vg/J NSg/J NSg/VB/J+ . N🅪Sg/Vg/J+ D/P > little , things for myself only , and trying to forget something very sad that had # NPr/I/J/Dq . NPl+ R/C/P ISg+ J/R/C . VB/C Nᴹ/Vg/J P VB NSg/I/J+ J/R NSg/VB/J NSg/I/C/Ddem+ VP > happened to me long ago . ” # VP/J P NPr/ISg+ NPr/VB/J J/P . . > # > With an effort I managed to restrain my incredulous laughter . The very phrases # P D/P+ N🅪Sg/VB+ ISg/#r+ VP/J P N🅪Sg/VB D$+ J Nᴹ+ . D+ J/R+ NPl/V3+ > were worn so threadbare that they evoked no image except that of a turbaned # NSg/VLPt VPp/J NSg/I/J/R/C J NSg/I/C/Ddem IPl+ VP/J NSg/Dq/P N🅪Sg/VB+ VB/C/P NSg/I/C/Ddem P D/P VP/J > “ character ” leaking sawdust at every pore as he pursued a tiger through the Bois # . N🅪Sg/VB+ . Nᴹ/Vg/J Nᴹ/VB+ NSg/P Dq NSg/VB R/C/P NPr/ISg+ VP/J D/P NSg+ NSg/J/P D ? > de Boulogne . # NPr+ ? . > # > “ Then came the war , old sport . It was a great relief , and I tried very hard to # . NSg/J/R/C NSg/VPt/P D+ N🅪Sg/VB+ . NSg/J+ NSg/VB+ . NPr/ISg+ VLPt D/P NSg/J NSg/J . VB/C ISg/#r+ VP/J J/R N🅪Sg/J/R P > die , but I seemed to bear an enchanted life . I accepted a commission as first # NSg/VB . NSg/C/P ISg/#r+ VP/J P NSg/VB/J D/P VP/J N🅪Sg/VB+ . ISg/#r+ VP/J D/P+ N🅪Sg/VB+ R/C/P NSg/J+ > lieutenant when it began . In the Argonne Forest I took the remains of my # NSg/J+ NSg/I/C NPr/ISg+ VPt . NPr/J/R/P D NPr NPr/VB+ ISg/#r+ VPt D NPl/V3 P D$+ > machine - gun battalion so far forward that there was a half mile gap on either # NSg/VB+ . NSg/VB+ NSg/VB NSg/I/J/R/C NSg/VB/J NSg/VB/J NSg/I/C/Ddem R+ VLPt D/P N🅪Sg/J/P+ NSg+ NPr/VB+ J/P I/C > side of us where the infantry couldn’t advance . We stayed there two days and two # NSg/VB/J P NPr/IPl+ NSg/R/C D N🅪Sg+ VXB NSg/VB/J+ . IPl+ VP/J R+ NSg NPl VB/C NSg+ > nights , a hundred and thirty men with sixteen Lewis guns , and when the infantry # NPl/V3+ . D/P NSg VB/C NSg NPl P NSg NPr+ NPl/V3+ . VB/C NSg/I/C D+ N🅪Sg+ > came up at last they found the insignia of three German divisions among the # NSg/VPt/P NSg/VB/J/P NSg/P NSg/VB/J IPl+ NSg/VP D NSg P NSg NPr🅪Sg/J NPl+ P D > piles of dead . I was promoted to be a major , and every Allied government gave me # NPl/V3 P NSg/VB/J . ISg/#r+ VLPt VP/J P NSg/VLXB D/P NPr/VB/J . VB/C Dq VP/J N🅪Sg+ VPt NPr/ISg+ > a decoration — even Montenegro , little Montenegro down on the Adriatic Sea ! ” # D/P N🅪Sg+ . NSg/VB/J/R NPr+ . NPr/I/J/Dq NPr+ N🅪Sg/VB/J/P J/P D NPr/J NSg+ . . > # > Little Montenegro ! He lifted up the words and nodded at them — with his smile . The # NPr/I/J/Dq+ NPr+ . NPr/ISg+ VP/J NSg/VB/J/P D+ NPl/V3+ VB/C VP NSg/P NSg/IPl+ . P ISg/D$+ NSg/VB+ . D+ > smile comprehended Montenegro’s troubled history and sympathized with the brave # NSg/VB+ VP/J NPr$ VP/J N🅪Sg+ VB/C VP/J P D NSg/VB/J > struggles of the Montenegrin people . It appreciated fully the chain of national # NPl/V3 P D NSg/J NPl/VB+ . NPr/ISg+ VP/J R D N🅪Sg/VB P NSg/J+ > circumstances which had elicited this tribute from Montenegro’s warm little # NPl/V3+ I/C+ VP VP/J I/Ddem NSg/VB P NPr$ NSg/VB/J+ NPr/I/J/Dq > heart . My incredulity was submerged in fascination now ; it was like skimming # N🅪Sg/VB+ . D$+ NSg+ VLPt VP/J NPr/J/R/P NSg+ NSg/J/R/C . NPr/ISg+ VLPt NSg/VB/J/C/P NSg/Vg > hastily through a dozen magazines . # R NSg/J/P D/P NSg NPl+ . > # > He reached in his pocket , and a piece of metal , slung on a ribbon , fell into my # NPr/ISg+ VP/J NPr/J/R/P ISg/D$+ NSg/VB/J+ . VB/C D/P NSg/VB P N🅪Sg/VB/J+ . VP J/P D/P+ NSg/VB+ . NSg/VPt/J P D$+ > palm . # NSg/VB+ . > # > “ That’s the one from Montenegro . ” # . NSg$ D NSg/I/J P NPr+ . . > # > To my astonishment , the thing had an authentic look . “ Orderi di Danilo , ” ran the # P D$+ Nᴹ+ . D+ NSg+ VP D/P+ J+ NSg/VB+ . . ? NPr/#r+ ? . . NSg/VPt D > circular legend , “ Montenegro , Nicolas Rex . ” # NSg/VB/J N🅪Sg/VB+ . . NPr+ . NPrPl NPr . . > # > “ Turn it . ” # . NSg/VB NPr/ISg+ . . > # > “ Major Jay Gatsby , ” I read , “ For Valour Extraordinary . ” # . NPr/VB/J+ NPr+ NPr . . ISg/#r+ NSg/VBP . . R/C/P Nᴹ/Comm NSg/J . . > # > “ Here’s another thing I always carry . A souvenir of Oxford days . It was taken in # . K I/D NSg+ ISg/#r+ R NSg/VB . D/P NSg/VB P NPr+ NPl+ . NPr/ISg+ VLPt VPp/J NPr/J/R/P > Trinity Quad — the man on my left is now the Earl of Doncaster . ” # NPr+ NSg/VB/J+ . D+ NPr/VB/J+ J/P D$+ NPr/VP/J VL3 NSg/J/R/C D NPr P ? . . > # > It was a photograph of half a dozen young men in blazers loafing in an archway # NPr/ISg+ VLPt D/P NSg/VB P N🅪Sg/J/P+ D/P+ NSg+ NPr/VB/J+ NPl+ NPr/J/R/P NPl Nᴹ/Vg/J NPr/J/R/P D/P NSg > through which were visible a host of spires . There was Gatsby , looking a little , # NSg/J/P I/C+ NSg/VLPt J D/P NSg/VB P NPl/V3+ . R+ VLPt NPr . Nᴹ/Vg/J D/P NPr/I/J/Dq . > not much , younger — with a cricket bat in his hand . # NSg/R/C NSg/I/J/R/Dq . NSg/JC . P D/P N🅪Sg/VB NSg/VB+ NPr/J/R/P ISg/D$+ NSg/VB+ . > # > Then it was all true . I saw the skins of tigers flaming in his palace on the # NSg/J/R/C NPr/ISg+ VLPt NSg/I/J/C/Dq NSg/VB/J . ISg/#r+ NSg/VPt D NPl/V3 P NPl+ Nᴹ/Vg/J NPr/J/R/P ISg/D$+ NSg/VB+ J/P D > Grand Canal ; I saw him opening a chest of rubies to ease , with their # NSg/J NSg/VB+ . ISg/#r+ NSg/VPt ISg+ Nᴹ/Vg/J D/P NSg/VB+ P NPl/V3 P Nᴹ/VB . P D$+ > crimson - lighted depths , the gnawings of his broken heart . # NSg/VB/J . VP/J NPl+ . D ? P ISg/D$+ VPp/J N🅪Sg/VB+ . > # > “ I’m going to make a big request of you to - day , ” he said , pocketing his # . K Nᴹ/Vg/J P NSg/VB D/P NSg/J NSg/VB P ISgPl+ P . NPr🅪Sg+ . . NPr/ISg+ VP/J . Nᴹ/Vg/J ISg/D$+ > souvenirs with satisfaction , “ so I thought you ought to know something about me . # NPl/V3+ P Nᴹ+ . . NSg/I/J/R/C ISg/#r+ N🅪Sg/VP ISgPl+ NSg/I/VXB P VB NSg/I/J+ J/P NPr/ISg+ . > I didn’t want you to think I was just some nobody . You see , I usually find # ISg/#r+ VXPt NSg/VB ISgPl+ P NSg/VB ISg/#r+ VLPt J/R I/J/R/Dq NSg/I+ . ISgPl+ NSg/VB . ISg/#r+ R NSg/VB > myself among strangers because I drift here and there trying to forget the sad # ISg+ P + C/P ISg/#r+ NSg/VB J/R VB/C R+ Nᴹ/Vg/J P VB D+ NSg/VB/J+ > thing that happened to me . ” He hesitated . “ You’ll hear about it this afternoon . ” # NSg+ NSg/I/C/Ddem+ VP/J P NPr/ISg+ . . NPr/ISg+ VP/J . . K VB J/P NPr/ISg+ I/Ddem N🅪Sg+ . . > # > “ At lunch ? ” # . NSg/P N🅪Sg/VB+ . . > # > “ No , this afternoon . I happened to find out that you’re taking Miss Baker to # . NSg/Dq/P . I/Ddem+ N🅪Sg+ . ISg/#r+ VP/J P NSg/VB NSg/VB/J/R/P NSg/I/C/Ddem K NSg/Vg/J NSg/VB NPr+ P > tea . ” # N🅪Sg/VB . . > # > “ Do you mean you’re in love with Miss Baker ? ” # . VXB ISgPl+ NSg/VB/J K NPr/J/R/P NPr🅪Sg/VB P NSg/VB NPr+ . . > # > “ No , old sport , I’m not . But Miss Baker has kindly consented to speak to you # . NSg/Dq/P . NSg/J+ NSg/VB+ . K NSg/R/C . NSg/C/P NSg/VB NPr+ V3 J/R VP/J P NSg/VB P ISgPl+ > about this matter . ” # J/P I/Ddem+ N🅪Sg/VB+ . . > # > I hadn’t the faintest idea what “ this matter ” was , but I was more annoyed than # ISg/#r+ VPt D JS NSg+ NSg/I+ . I/Ddem N🅪Sg/VB+ . VLPt . NSg/C/P ISg/#r+ VLPt NPr/I/J/R/Dq VP/J C/P > interested . I hadn’t asked Jordan to tea in order to discuss Mr . Jay Gatsby . I # VP/J . ISg/#r+ VPt VP/J NPr+ P N🅪Sg/VB NPr/J/R/P N🅪Sg/VB+ P NSg/VB NSg+ . NPr+ NPr . ISg/#r+ > was sure the request would be something utterly fantastic , and for a moment I # VLPt J D NSg/VB+ VXB NSg/VLXB NSg/I/J+ R NSg/J . VB/C R/C/P D/P+ NSg+ ISg/#r+ > was sorry I’d ever set foot upon his overpopulated lawn . # VLPt NSg/VB/J K J/R NPr/VBP/J NSg/VB+ P ISg/D$+ VP/J NSg/VB+ . > # > He wouldn’t say another word . His correctness grew on him as we neared the city . # NPr/ISg+ VXB NSg/VB I/D NSg/VB+ . ISg/D$+ NSg+ VPt J/P ISg+ R/C/P IPl+ VP/J D+ NSg+ . > We passed Port Roosevelt , where there was a glimpse of red - belted ocean - going # IPl+ VP/J NPr/VB/J+ NPr+ . NSg/R/C R+ VLPt D/P NSg/VB P N🅪Sg/J . VP/J NSg+ . Nᴹ/Vg/J > ships , and sped along a cobbled slum lined with the dark , undeserted saloons of # NPl/V3+ . VB/C NSg/VP P D/P VP/J NSg/VB+ VP/J P D NSg/VB/J . ? NPl P > the faded - gilt nineteen - hundreds . Then the valley of ashes opened out on both # D J+ . NSg/VB/J NSg . NPl+ . NSg/J/R/C D NSg/VB P NPl/V3+ VP/J NSg/VB/J/R/P J/P I/C/Dq > sides of us , and I had a glimpse of Mrs . Wilson straining at the garage pump # NPl/V3 P NPr/IPl+ . VB/C ISg/#r+ VP D/P NSg/VB P NPl+ . NPr+ Nᴹ/Vg/J NSg/P D+ NSg/VB+ NSg/VB+ > with panting vitality as we went by . # P Nᴹ/Vg/J Nᴹ+ R/C/P IPl+ NSg/VPt NSg/P . > # > With fenders spread like wings we scattered light through half Astoria — only # P + N🅪Sg/VBP NSg/VB/J/C/P NPl/V3+ IPl+ VP/J N🅪Sg/VB/J+ NSg/J/P N🅪Sg/J/P+ NPr . J/R/C > half , for as we twisted among the pillars of the elevated I heard the familiar # N🅪Sg/J/P+ . R/C/P R/C/P IPl+ VP/J P D NPl/V3 P D VP/J ISg/#r+ VP/J D NSg/J > “ jug - jug - spat ! ” of a motorcycle , and a frantic policeman rode alongside . # . NSg/VB+ . NSg/VB+ . NSg/VB . . P D/P+ NSg/VB+ . VB/C D/P+ NSg/J+ NSg+ NSg/VPt P . > # > “ All right , old sport , ” called Gatsby . We slowed down . Taking a white card from # . NSg/I/J/C/Dq NPr/VB/J . NSg/J+ NSg/VB+ . . VP/J NPr . IPl+ VP/J N🅪Sg/VB/J/P . NSg/Vg/J D/P NPr🅪Sg/VB/J N🅪Sg/VB+ P > his wallet , he waved it before the man’s eyes . # ISg/D$+ NSg+ . NPr/ISg+ VP/J NPr/ISg+ C/P D NPr$/I/VB/J NPl/V3+ . > # > “ Right you are , ” agreed the policeman , tipping his cap . “ Know you next time , Mr . # . NPr/VB/J ISgPl+ VLB . . VP/J D+ NSg+ . NSg/Vg ISg/D$+ NPr/VB+ . . VB ISgPl+ NSg/J/P N🅪Sg/VB/J+ . NSg+ . > Gatsby . Excuse me ! ” # NPr . NSg/VB+ NPr/ISg+ . . > # > “ What was that ? ” I inquired . “ The picture of Oxford ? ” # . NSg/I+ VLPt NSg/I/C/Ddem+ . . ISg/#r+ VP/J . . D NSg/VB P NPr+ . . > # > “ I was able to do the commissioner a favor once , and he sends me a Christmas # . ISg/#r+ VLPt NSg/VB/J P VXB D+ NSg+ D/P+ N🅪Sg/VB/Am+ NSg/C . VB/C NPr/ISg+ NPl/V3 NPr/ISg+ D/P+ NPr/VB/J+ > card every year . ” # N🅪Sg/VB Dq+ NSg+ . . > # > Over the great bridge , with the sunlight through the girders making a constant # NSg/J/P D+ NSg/J+ N🅪Sg/VB+ . P D+ NSg/VB+ NSg/J/P D NPl Nᴹ/Vg/J D/P NSg/J > flicker upon the moving cars , with the city rising up across the river in white # NSg/VB+ P D Nᴹ/Vg/J NPl+ . P D NSg+ Nᴹ/Vg/J/P NSg/VB/J/P NSg/P D NSg/VB+ NPr/J/R/P NPr🅪Sg/VB/J > heaps and sugar lumps all built with a wish out of non - olfactory money . The city # NPl/V3 VB/C N🅪Sg/VB+ NPl/V3 NSg/I/J/C/Dq VP/J+ P D/P NSg/VB+ NSg/VB/J/R/P P NSg . NSg/J N🅪Sg/J+ . D+ NSg+ > seen from the Queensboro Bridge is always the city seen for the first time , in # NSg/VPp P D ? N🅪Sg/VB+ VL3 R D NSg+ NSg/VPp R/C/P D NSg/J N🅪Sg/VB/J+ . NPr/J/R/P > its first wild promise of all the mystery and the beauty in the world . # ISg/D$+ NSg/J NSg/VB/J NSg/VB P NSg/I/J/C/Dq D N🅪Sg+ VB/C D N🅪Sg/VB/J+ NPr/J/R/P D NSg/VB+ . > # > A dead man passed us in a hearse heaped with blooms , followed by two carriages # D/P+ NSg/VB/J+ NPr/VB/J+ VP/J NPr/IPl+ NPr/J/R/P D/P NSg/VB VP/J P NPl/V3 . VP/J NSg/P NSg NPl > with drawn blinds , and by more cheerful carriages for friends . The friends # P VPp/J NPl/V3+ . VB/C NSg/P NPr/I/J/R/Dq J NPl R/C/P NPrPl/V3+ . D+ NPrPl/V3+ > looked out at us with the tragic eyes and short upper lips of southeastern # VP/J NSg/VB/J/R/P NSg/P NPr/IPl+ P D+ NSg/J+ NPl/V3+ VB/C NPr/VB/J/P NSg/J NPl/V3 P J+ > Europe , and I was glad that the sight of Gatsby’s splendid car was included in # NPr+ . VB/C ISg/#r+ VLPt NSg/VB/J NSg/I/C/Ddem D N🅪Sg/VB P NPr$ J NSg+ VLPt VP/J NPr/J/R/P > their sombre holiday . As we crossed Blackwell’s Island a limousine passed us , # D$+ NSg/VB/J/Comm NPr/VB+ . R/C/P IPl+ VP/J NPr$ NSg/VB+ D/P NSg VP/J NPr/IPl+ . > driven by a white chauffeur , in which sat three modish negroes , two bucks and a # VPp/J NSg/P D/P NPr🅪Sg/VB/J NSg/VB . NPr/J/R/P I/C+ NSg/VP/J NSg J NPl . NSg NPl/V3 VB/C D/P > girl . I laughed aloud as the yolks of their eyeballs rolled toward us in haughty # NSg/VB+ . ISg/#r+ VP/J J R/C/P D NPl/V3 P D$+ NPl/V3+ VP/J J/P NPr/IPl+ NPr/J/R/P J > rivalry . # NSg+ . > # > “ Anything can happen now that we’ve slid over this bridge , ” I thought ; “ anything # . NSg/I/VB+ NPr/VXB VB NSg/J/R/C NSg/I/C/Ddem K VP NSg/J/P I/Ddem N🅪Sg/VB+ . . ISg/#r+ N🅪Sg/VP . . NSg/I/VB+ > at all . . . . ” # NSg/P NSg/I/J/C/Dq . . . . . > # > Even Gatsby could happen , without any particular wonder . # NSg/VB/J/R NPr NSg/VXB VB . C/P I/R/Dq NSg/J N🅪Sg/VB+ . > # > Roaring noon . In a well - fanned Forty - second Street cellar I met Gatsby for # Nᴹ/Vg/J NSg/VB+ . NPr/J/R/P D/P+ NSg/VB/J/R+ . VP NSg/J . NSg/VB/J NSg/VB/J+ NSg/VB+ ISg/#r+ VP NPr R/C/P > lunch . Blinking away the brightness of the street outside , my eyes picked him # N🅪Sg/VB+ . Nᴹ/Vg/J VB/J D Nᴹ P D+ NSg/VB/J+ Nᴹ/VB/J/P . D$+ NPl/V3+ VP/J ISg+ > out obscurely in the anteroom , talking to another man . # NSg/VB/J/R/P R NPr/J/R/P D NSg . Nᴹ/Vg/J P I/D NPr/VB/J+ . > # > “ Mr . Carraway , this is my friend Mr . Wolfshiem . ” # . NSg+ . ? . I/Ddem+ VL3 D$+ NPr/VB/J+ NSg+ . ? . . > # > A small , flat - nosed Jew raised his large head and regarded me with two fine # D/P NPr/VB/J . NSg/VB/J . VP/J NPr/VB/J+ VP/J ISg/D$+ NSg/J NPr/VB/J+ VB/C VP/J NPr/ISg+ P NSg NSg/VB/J > growths of hair which luxuriated in either nostril . After a moment I discovered # NPl P N🅪Sg/VB+ I/C+ VP/J NPr/J/R/P I/C NSg . P D/P+ NSg+ ISg/#r+ VP/J > his tiny eyes in the half - darkness . # ISg/D$+ NSg/J+ NPl/V3+ NPr/J/R/P D+ N🅪Sg/J/P+ . Nᴹ+ . > # > “ So I took one look at him , ” said Mr . Wolfshiem , shaking my hand earnestly , “ and # . NSg/I/J/R/C ISg/#r+ VPt NSg/I/J NSg/VB NSg/P ISg+ . . VP/J NSg+ . ? . Nᴹ/Vg/J D$+ NSg/VB+ R . . VB/C > what do you think I did ? ” # NSg/I+ VXB ISgPl+ NSg/VB ISg/#r+ VXPt . . > # > “ What ? ” I inquired politely . # . NSg/I+ . . ISg/#r+ VP/J R . > # > But evidently he was not addressing me , for he dropped my hand and covered # NSg/C/P R NPr/ISg+ VLPt NSg/R/C Nᴹ/Vg/J NPr/ISg+ . R/C/P NPr/ISg+ VP/J D$+ NSg/VB+ VB/C VP/J > Gatsby with his expressive nose . # NPr P ISg/D$+ NSg/J NSg/VB+ . > # > “ I handed the money to Katspaugh and I sid : ‘ All right , Katspaugh , don’t pay him # . ISg/#r+ VP/J D+ N🅪Sg/J+ P ? VB/C ISg/#r+ NPr . Unlintable NSg/I/J/C/Dq NPr/VB/J . ? . VXB NSg/VB/J ISg+ > a penny till he shuts his mouth . ’ He shut it then and there . ” # D/P NPr/VB+ NSg/VB/C/P NPr/ISg+ NPl/V3 ISg/D$+ NSg/VB+ . . NPr/ISg+ NSg/VBP/J NPr/ISg+ NSg/J/R/C VB/C R . . > # > Gatsby took an arm of each of us and moved forward into the restaurant , # NPr VPt D/P NSg/VB/J P Dq P NPr/IPl+ VB/C VP/J NSg/VB/J P D NSg+ . > whereupon Mr . Wolfshiem swallowed a new sentence he was starting and lapsed into # C NSg+ . ? VP/J D/P NSg/J NSg/VB+ NPr/ISg+ VLPt Nᴹ/Vg/J VB/C VP/J P > a somnambulatory abstraction . # D/P ? N🅪Sg+ . > # > “ Highballs ? ” asked the head waiter . # . NPl/V3 . . VP/J D+ NPr/VB/J+ NSg/VB+ . > # > “ This is a nice restaurant here , ” said Mr . Wolfshiem , looking at the # . I/Ddem+ VL3 D/P NPr/J NSg J/R . . VP/J NSg+ . ? . Nᴹ/Vg/J NSg/P D > Presbyterian nymphs on the ceiling . “ But I like across the street better ! ” # NSg/J NPl/VB J/P D NSg/VB+ . . NSg/C/P ISg/#r+ NSg/VB/J/C/P NSg/P D+ NSg/VB/J+ NSg/VXB/JC . . > # > “ Yes , highballs , ” agreed Gatsby , and then to Mr . Wolfshiem : “ It’s too hot over # . NPl/VB . NPl/V3 . . VP/J NPr . VB/C NSg/J/R/C P NSg . ? . . K R NSg/VB/J NSg/J/P > there . ” # R . . > # > “ Hot and small — yes , ” said Mr . Wolfshiem , “ but full of memories . ” # . NSg/VB/J VB/C NPr/VB/J . NPl/VB . . VP/J NSg+ . ? . . NSg/C/P NSg/VB/J P NPl+ . . > # > “ What place is that ? ” I asked . # . NSg/I+ N🅪Sg/VB+ VL3 NSg/I/C/Ddem+ . . ISg/#r+ VP/J . > # > “ The old Metropole . ” # . D NSg/J ? . . > # > “ The old Metropole , ” brooded Mr . Wolfshiem gloomily . “ Filled with faces dead and # . D NSg/J ? . . VP/J NSg+ . ? R . . VP/J P NPl/V3+ NSg/VB/J VB/C > gone . Filled with friends gone now forever . I can’t forget so long as I live the # VPp/J/P . VP/J P NPrPl/V3+ VPp/J/P NSg/J/R/C NSg/J . ISg/#r+ VXB VB NSg/I/J/R/C NPr/VB/J R/C/P ISg/#r+ VB/J D > night they shot Rosy Rosenthal there . It was six of us at the table , and Rosy # N🅪Sg/VB+ IPl+ NSg/VP/J+ NSg/VB/J NPr R . NPr/ISg+ VLPt NSg P NPr/IPl+ NSg/P D+ NSg/VB+ . VB/C NSg/VB/J > had eat and drunk a lot all evening . When it was almost morning the waiter came # VP VB VB/C NSg/VPp/J+ D/P+ NPr/VB+ NSg/I/J/C/Dq+ N🅪Sg/Vg/J+ . NSg/I/C NPr/ISg+ VLPt R N🅪Sg/Vg/J D+ NSg/VB+ NSg/VPt/P > up to him with a funny look and says somebody wants to speak to him outside . # NSg/VB/J/P P ISg+ P D/P+ NSg/J+ NSg/VB+ VB/C NPl/V3 NSg/I+ NPl/V3 P NSg/VB P ISg+ Nᴹ/VB/J/P . > ‘ All right , ’ says Rosy , and begins to get up , and I pulled him down in his # Unlintable NSg/I/J/C/Dq NPr/VB/J . . NPl/V3 NSg/VB/J . VB/C NPl/V3 P NSg/VB NSg/VB/J/P . VB/C ISg/#r+ VP/J ISg+ N🅪Sg/VB/J/P NPr/J/R/P ISg/D$+ > chair . # NSg/VB+ . > # > “ ‘ Let the bastards come in here if they want you , Rosy , but don’t you , so help # . Unlintable NSg/VBP D NPl/V3 NSg/VBPp/P NPr/J/R/P J/R NSg/C IPl+ NSg/VB ISgPl+ . NSg/VB/J . NSg/C/P VXB ISgPl+ . NSg/I/J/R/C NSg/VB > me , move outside this room . ’ # NPr/ISg+ . NSg/VB Nᴹ/VB/J/P I/Ddem N🅪Sg/VB/J+ . . > # > “ It was four o’clock in the morning then , and if we’d of raised the blinds we’d # . NPr/ISg+ VLPt NSg R NPr/J/R/P D+ N🅪Sg/Vg/J+ NSg/J/R/C . VB/C NSg/C K P VP/J D+ NPl/V3+ K > of seen daylight . ” # P NSg/VPp N🅪Sg/VB . . > # > “ Did he go ? ” I asked innocently . # . VXPt NPr/ISg+ NSg/VB/J . . ISg/#r+ VP/J R . > # > “ Sure he went . ” Mr . Wolfshiem’s nose flashed at me indignantly . “ He turned # . J NPr/ISg+ NSg/VPt . . NSg+ . ? NSg/VB+ VP/J NSg/P NPr/ISg+ R . . NPr/ISg+ VP/J > around in the door and says : ‘ Don’t let that waiter take away my coffee ! ’ Then # J/P NPr/J/R/P D+ NSg/VB+ VB/C NPl/V3 . Unlintable VXB NSg/VBP NSg/I/C/Ddem NSg/VB+ NSg/VB VB/J D$+ N🅪Sg/VB/J+ . . NSg/J/R/C > he went out on the sidewalk , and they shot him three times in his full belly and # NPr/ISg+ NSg/VPt NSg/VB/J/R/P J/P D+ NSg+ . VB/C IPl+ NSg/VP/J+ ISg+ NSg+ NPl/V3+ NPr/J/R/P ISg/D$+ NSg/VB/J+ NSg/VB+ VB/C > drove away . ” # NSg/VPt VB/J . . > # > “ Four of them were electrocuted , ” I said , remembering . # . NSg P NSg/IPl+ NSg/VLPt VP/J . . ISg/#r+ VP/J . Nᴹ/Vg/J . > # > “ Five , with Becker . ” His nostrils turned to me in an interested way . “ I # . NSg . P NPr . . ISg/D$+ NPl+ VP/J P NPr/ISg+ NPr/J/R/P D/P+ VP/J+ NSg/J+ . . ISg/#r+ > understand you’re looking for a business gonnegtion . ” # VB K Nᴹ/Vg/J R/C/P D/P N🅪Sg/J+ ? . . > # > The juxtaposition of these two remarks was startling . Gatsby answered for me : # D NSg/VB P I/Ddem NSg NPl/V3+ VLPt Nᴹ/Vg/J . NPr VP/J R/C/P NPr/ISg+ . > # > “ Oh , no , ” he exclaimed , ‘ ‘ this isn’t the man . ” # . NPr/VB . NSg/Dq/P . . NPr/ISg+ VP/J . Unlintable Unlintable I/Ddem NSg/VX3 D+ NPr/VB/J+ . . > # > “ No ? ” Mr . Wolfshiem seemed disappointed . # . NSg/Dq/P . . NSg+ . ? VP/J VP/J . > # > “ This is just a friend . I told you we’d talk about that some other time . ” # . I/Ddem+ VL3 J/R D/P NPr/VB/J+ . ISg/#r+ VP ISgPl+ K N🅪Sg/VB J/P NSg/I/C/Ddem I/J/R/Dq NSg/VB/J N🅪Sg/VB/J+ . . > # > “ I beg your pardon , ” said Mr . Wolfshiem , “ I had a wrong man . ” # . ISg/#r+ NSg/VB D$+ NSg/VB . . VP/J NSg+ . ? . . ISg/#r+ VP D/P NSg/VB/J/R NPr/VB/J+ . . > # > A succulent hash arrived , and Mr . Wolfshiem , forgetting the more sentimental # D/P+ NSg/J+ NSg/VB+ VP/J . VB/C NSg+ . ? . NSg/Vg D NPr/I/J/R/Dq J > atmosphere of the old Metropole , began to eat with ferocious delicacy . His eyes , # N🅪Sg P D NSg/J ? . VPt P VB P J NSg+ . ISg/D$+ NPl/V3+ . > meanwhile , roved very slowly all around the room — he completed the arc by turning # NSg . VP/J J/R R NSg/I/J/C/Dq J/P D N🅪Sg/VB/J+ . NPr/ISg+ VP/J D NPr/VB/J+ NSg/P Nᴹ/Vg/J > to inspect the people directly behind . I think that , except for my presence , he # P VB D NPl/VB+ R/C NSg/J/P . ISg/#r+ NSg/VB NSg/I/C/Ddem+ . VB/C/P R/C/P D$+ N🅪Sg/VB+ . NPr/ISg+ > would have taken one short glance beneath our own table . # VXB NSg/VXB VPp/J NSg/I/J NPr/VB/J/P+ NSg/VB+ P D$+ NSg/VB/J+ NSg/VB+ . > # > “ Look here , old sport , ” said Gatsby , leaning toward me , “ I’m afraid I made you a # . NSg/VB J/R . NSg/J+ NSg/VB+ . . VP/J NPr . Nᴹ/Vg/J J/P NPr/ISg+ . . K J ISg/#r+ VP ISgPl+ D/P > little angry this morning in the car . ” # NPr/I/J/Dq VB/J I/Ddem N🅪Sg/Vg/J+ NPr/J/R/P D NSg+ . . > # > There was the smile again , but this time I held out against it . # R+ VLPt D+ NSg/VB+ P . NSg/C/P I/Ddem+ N🅪Sg/VB/J+ ISg/#r+ VP NSg/VB/J/R/P C/P NPr/ISg+ . > # > “ I don’t like mysteries , ” I answered , “ and I don’t understand why you won’t come # . ISg/#r+ VXB NSg/VB/J/C/P NPl+ . . ISg/#r+ VP/J . . VB/C ISg/#r+ VXB VB NSg/VB ISgPl+ VXB NSg/VBPp/P > out frankly and tell me what you want . Why has it all got to come through Miss # NSg/VB/J/R/P R VB/C NPr/VB NPr/ISg+ NSg/I+ ISgPl+ NSg/VB . NSg/VB V3 NPr/ISg+ NSg/I/J/C/Dq VP P NSg/VBPp/P NSg/J/P NSg/VB > Baker ? ” # NPr+ . . > # > “ Oh , it’s nothing underhand , ” he assured me . “ Miss Baker’s a great sportswoman , # . NPr/VB . K NSg/I/J+ NSg/VB/J . . NPr/ISg+ NSg/VP/J NPr/ISg+ . . NSg/VB NPr$ D/P NSg/J NSg . > you know , and she’d never do anything that wasn’t all right . ” # ISgPl+ VB . VB/C K R VXB NSg/I/VB+ NSg/I/C/Ddem+ VPt NSg/I/J/C/Dq NPr/VB/J . . > # > Suddenly he looked at his watch , jumped up , and hurried from the room , leaving # R NPr/ISg+ VP/J NSg/P ISg/D$+ NSg/VB . VP/J NSg/VB/J/P . VB/C VP/J P D+ N🅪Sg/VB/J+ . Nᴹ/Vg/J > me with Mr . Wolfshiem at the table . # NPr/ISg+ P NSg+ . ? NSg/P D NSg/VB+ . > # > “ He has to telephone , ” said Mr . Wolfshiem , following him with his eyes . “ Fine # . NPr/ISg+ V3 P NSg/VB . . VP/J NSg+ . ? . N🅪Sg/Vg/J/P ISg+ P ISg/D$+ NPl/V3+ . . NSg/VB/J > fellow , isn’t he ? Handsome to look at and a perfect gentleman . ” # NSg . NSg/VX3 NPr/ISg+ . VB/J P NSg/VB NSg/P VB/C D/P+ NSg/VB/J+ NSg/J+ . . > # > “ Yes . ” # . NPl/VB . . > # > “ He’s an Oggsford man . ” # . NPr$ D/P ? NPr/VB/J+ . . > # > “ Oh ! ” # . NPr/VB . . > # > “ He went to Oggsford College in England . You know Oggsford College ? ” # . NPr/ISg+ NSg/VPt P ? NSg+ NPr/J/R/P NPr+ . ISgPl+ VB ? NSg+ . . > # > “ I’ve heard of it . ” # . K VP/J P NPr/ISg+ . . > # > “ It’s one of the most famous colleges in the world . ” # . K NSg/I/J P D NSg/I/J/R/Dq VB/J NPl+ NPr/J/R/P D NSg/VB+ . . > # > “ Have you known Gatsby for a long time ? ” I inquired . # . NSg/VXB ISgPl+ VPp/J NPr R/C/P D/P+ NPr/VB/J N🅪Sg/VB/J+ . . ISg/#r+ VP/J . > # > “ Several years , ” he answered in a gratified way . # . J/Dq+ NPl+ . . NPr/ISg+ VP/J NPr/J/R/P D/P+ VP/J+ NSg/J+ . > # > “ I made the pleasure of his acquaintance just after the war . But I knew I had # . ISg/#r+ VP D NSg/VB P ISg/D$+ NSg+ J/R P D+ N🅪Sg/VB+ . NSg/C/P ISg/#r+ VPt ISg/#r+ VP > discovered a man of fine breeding after I talked with him an hour . I said to # VP/J D/P NPr/VB/J P NSg/VB/J+ Nᴹ/Vg/J+ P ISg/#r+ VP/J P ISg+ D/P+ NSg+ . ISg/#r+ VP/J P > myself : ‘ There’s the kind of man you’d like to take home and introduce to your # ISg+ . Unlintable K D NSg/J P NPr/VB/J+ K NSg/VB/J/C/P P NSg/VB NSg/VB/J+ VB/C VB P D$+ > mother and sister . ’ ” He paused . “ I see you’re looking at my cuff buttons . ” # NSg/VB/J VB/C NSg/VB+ . . . NPr/ISg+ VP/J . . ISg/#r+ NSg/VB K Nᴹ/Vg/J NSg/P D$+ NSg/VB NPl/V3+ . . > # > I hadn’t been looking at them , but I did now . They were composed of oddly # ISg/#r+ VPt NSg/VLPp Nᴹ/Vg/J NSg/P NSg/IPl+ . NSg/C/P ISg/#r+ VXPt NSg/J/R/C . IPl+ NSg/VLPt VP/J P R > familiar pieces of ivory . # NSg/J NPl/V3 P NPr🅪Sg/J+ . > # > “ Finest specimens of human molars , ” he informed me . # . JS NPl P NSg/VB/J NPl . . NPr/ISg+ VP/J NPr/ISg+ . > # > “ Well ! ” I inspected them . “ That’s a very interesting idea . ” # . NSg/VB/J/R . . ISg/#r+ VP/J NSg/IPl+ . . NSg$ D/P J/R Vg/J NSg+ . . > # > “ Yeah . ” He flipped his sleeves up under his coat . “ Yeah , Gatsby’s very careful # . NSg . . NPr/ISg+ VP ISg/D$+ NPl/V3+ NSg/VB/J/P NSg/J/P ISg/D$+ NSg/VB+ . . NSg . NPr$ J/R J > about women . He would never so much as look at a friend’s wife . ” # J/P NPl+ . NPr/ISg+ VXB R NSg/I/J/R/C NSg/I/J/R/Dq R/C/P NSg/VB NSg/P D/P NPr$ NSg/VB/J+ . . > # > When the subject of this instinctive trust returned to the table and sat down # NSg/I/C D NSg/VB/J P I/Ddem J N🅪Sg/VB/J VP/J P D NSg/VB+ VB/C NSg/VP/J N🅪Sg/VB/J/P > Mr . Wolfshiem drank his coffee with a jerk and got to his feet . # NSg+ . ? NSg/VPt ISg/D$+ N🅪Sg/VB/J+ P D/P NSg/VB+ VB/C VP P ISg/D$+ NPl+ . > # > “ I have enjoyed my lunch , ” he said , “ and I’m going to run off from you two young # . ISg/#r+ NSg/VXB VP/J D$+ N🅪Sg/VB+ . . NPr/ISg+ VP/J . . VB/C K Nᴹ/Vg/J P NSg/VBPp NSg/VB/J/P P ISgPl+ NSg NPr/VB/J > men before I outstay my welcome . ” # NPl+ C/P ISg/#r+ VB D$+ NSg/VB/J . . > # > “ Don’t hurry , Meyer , ” said Gatsby , without enthusiasm . Mr . Wolfshiem raised his # . VXB NSg/VB+ . NPr . . VP/J NPr . C/P NSg+ . NSg+ . ? VP/J ISg/D$+ > hand in a sort of benediction . # NSg/VB+ NPr/J/R/P D/P NSg/VB+ P N🅪Sg . > # > “ You’re very polite , but I belong to another generation , ” he announced solemnly . # . K J/R VB/J . NSg/C/P ISg/#r+ VB/P P I/D NSg+ . . NPr/ISg+ VP/J R . > “ You sit here and discuss your sports and your young ladies and your — ” He # . ISgPl+ NSg/VB J/R VB/C NSg/VB D$+ NPl/V3 VB/C D$+ NPr/VB/J+ NPl/V3+ VB/C D$+ . . NPr/ISg+ > supplied an imaginary noun with another wave of his hand . “ As for me , I am fifty # VP/J D/P NSg/J NSg/VB+ P I/D NSg/VB P ISg/D$+ NSg/VB+ . . R/C/P R/C/P NPr/ISg+ . ISg/#r+ NPr/VLB/J NSg+ > years old , and I won’t impose myself on you any longer . ” # NPl+ NSg/J . VB/C ISg/#r+ VXB NSg/VB ISg+ J/P ISgPl+ I/R/Dq NSg/JC . . > # > As he shook hands and turned away his tragic nose was trembling . I wondered if I # R/C/P NPr/ISg+ NSg/VPt/J NPl/V3+ VB/C VP/J VB/J ISg/D$+ NSg/J+ NSg/VB+ VLPt Nᴹ/Vg/J . ISg/#r+ VP/J NSg/C ISg/#r+ > had said anything to offend him . # VP VP/J NSg/I/VB+ P VB ISg+ . > # > “ He becomes very sentimental sometimes , ” explained Gatsby . “ This is one of his # . NPr/ISg+ V3 J/R J R . . VP/J NPr . . I/Ddem+ VL3 NSg/I/J P ISg/D$+ > sentimental days . He’s quite a character around New York — a denizen of Broadway . ” # J+ NPl+ . NPr$ R D/P N🅪Sg/VB+ J/P NSg/J NPr+ . D/P NSg/VB P NPr/J+ . . > # > “ Who is he , anyhow , an actor ? ” # . NPr/I+ VL3 NPr/ISg+ . J . D/P+ NSg+ . . > # > “ No . ” # . NSg/Dq/P . . > # > “ A dentist ? ” # . D/P+ NSg+ . . > # > “ Meyer Wolfshiem ? No , he’s a gambler . ” Gatsby hesitated , then added coolly : # . NPr ? . NSg/Dq/P . NPr$ D/P NSg . . NPr VP/J . NSg/J/R/C VP/J R . > “ He’s the man who fixed the World’s Series back in 1919 . ” # . NPr$ D NPr/VB/J+ NPr/I+ VP/J D NSg$ NSgPl+ NSg/VB/J NPr/J/R/P # . . > # > “ Fixed the World’s Series ? ” I repeated . # . VP/J D NSg$ NSgPl+ . . ISg/#r+ VP/J . > # > The idea staggered me . I remembered , of course , that the World’s Series had been # D+ NSg+ VP/J NPr/ISg+ . ISg/#r+ VP/J . P NSg/VB+ . NSg/I/C/Ddem D NSg$ NSgPl+ VP NSg/VLPp > fixed in 1919 , but if I had thought of it at all I would have thought of it as a # VP/J NPr/J/R/P # . NSg/C/P NSg/C ISg/#r+ VP N🅪Sg/VP P NPr/ISg+ NSg/P NSg/I/J/C/Dq ISg/#r+ VXB NSg/VXB N🅪Sg/VP P NPr/ISg+ R/C/P D/P > thing that merely happened , the end of some inevitable chain . It never occurred # NSg+ NSg/I/C/Ddem+ R VP/J . D NSg/VB P I/J/R/Dq NSg/J N🅪Sg/VB+ . NPr/ISg+ R VP > to me that one man could start to play with the faith of fifty million # P NPr/ISg+ NSg/I/C/Ddem+ NSg/I/J+ NPr/VB/J+ NSg/VXB NSg/VB P N🅪Sg/VB P D NPr🅪Sg P NSg NSg+ > people — with the single - mindedness of a burglar blowing a safe . # NPl/VB+ . P D NSg/VB/J . Nᴹ P D/P+ NSg/VB+ Nᴹ/Vg/J D/P NSg/VB/J . > # > “ How did he happen to do that ? ” I asked after a minute . # . NSg/C VXPt NPr/ISg+ VB P VXB NSg/I/C/Ddem+ . . ISg/#r+ VP/J P D/P+ NSg/VB/J+ . > # > “ He just saw the opportunity . ” # . NPr/ISg+ J/R NSg/VPt D+ N🅪Sg+ . . > # > “ Why isn’t he in jail ? ” # . NSg/VB NSg/VX3 NPr/ISg+ NPr/J/R/P N🅪Sg/VB+ . . > # > “ They can’t get him , old sport . He’s a smart man . ” # . IPl+ VXB NSg/VB ISg+ . NSg/J NSg/VB+ . NPr$ D/P+ NSg/VB/J NPr/VB/J+ . . > # > I insisted on paying the check . As the waiter brought my change I caught sight # ISg/#r+ VP/J J/P Nᴹ/Vg/J D+ NSg/VB/J+ . R/C/P D+ NSg/VB+ VP D$+ N🅪Sg/VB+ ISg/#r+ VP/J N🅪Sg/VB > of Tom Buchanan across the crowded room . # P NPr/VB+ NPr+ NSg/P D+ VP/J+ N🅪Sg/VB/J+ . > # > “ Come along with me for a minute , ” I said ; “ I’ve got to say hello to some one . ” # . NSg/VBPp/P P P NPr/ISg+ R/C/P D/P+ NSg/VB/J+ . . ISg/#r+ VP/J . . K VP P NSg/VB NSg/VB P I/J/R/Dq NSg/I/J+ . . > # > When he saw us Tom jumped up and took half a dozen steps in our direction . # NSg/I/C NPr/ISg+ NSg/VPt NPr/IPl+ NPr/VB+ VP/J NSg/VB/J/P VB/C VPt N🅪Sg/J/P+ D/P NSg NPl/V3+ NPr/J/R/P D$+ N🅪Sg+ . > # > “ Where’ve you been ? ” he demanded eagerly . “ Daisy’s furious because you haven’t # . ? ISgPl+ NSg/VLPp . . NPr/ISg+ VP/J R . . NPr$ J C/P ISgPl+ VXB > called up . ” # VP/J NSg/VB/J/P . . > # > “ This is Mr . Gatsby , Mr . Buchanan . ” # . I/Ddem+ VL3 NSg+ . NPr . NSg+ . NPr+ . . > # > They shook hands briefly , and a strained , unfamiliar look of embarrassment came # IPl+ NSg/VPt/J NPl/V3+ R . VB/C D/P VP/J . NSg/J NSg/VB P N🅪Sg+ NSg/VPt/P > over Gatsby’s face . # NSg/J/P NPr$ NSg/VB+ . > # > “ How’ve you been , anyhow ? ” demanded Tom of me . “ How’d you happen to come up this # . ? ISgPl+ NSg/VLPp . J . . VP/J NPr/VB P NPr/ISg+ . . K ISgPl+ VB P NSg/VBPp/P NSg/VB/J/P I/Ddem > far to eat ? ” # NSg/VB/J P VB . . > # > “ I’ve been having lunch with Mr . Gatsby . ” # . K NSg/VLPp Nᴹ/Vg/J N🅪Sg/VB+ P NSg+ . NPr . . > # > I turned toward Mr . Gatsby , but he was no longer there . # ISg/#r+ VP/J J/P NSg+ . NPr . NSg/C/P NPr/ISg+ VLPt NSg/Dq/P NSg/JC R . > # > One October day in nineteen - seventeen — # NSg/I/J+ NPr/VB+ NPr🅪Sg+ NPr/J/R/P NSg . NSg . > # > ( said Jordan Baker that afternoon , sitting up very straight on a straight chair # . VP/J NPr+ NPr+ NSg/I/C/Ddem+ N🅪Sg+ . NSg/Vg/J NSg/VB/J/P J/R NSg/VB/J/R J/P D/P NSg/VB/J/R NSg/VB > in the tea - garden at the Plaza Hotel ) # NPr/J/R/P D N🅪Sg/VB+ . NSg/VB/J NSg/P D+ NSg+ NSg+ . > # > — I was walking along from one place to another , half on the sidewalks and half # . ISg/#r+ VLPt Nᴹ/Vg/J P P NSg/I/J N🅪Sg/VB+ P I/D . N🅪Sg/J/P+ J/P D NPl VB/C N🅪Sg/J/P+ > on the lawns . I was happier on the lawns because I had on shoes from England # J/P D NPl/V3 . ISg/#r+ VLPt NSg/JC J/P D NPl/V3 C/P ISg/#r+ VP J/P NPl/V3+ P NPr > with rubber nobs on the soles that bit into the soft ground . I had on a new # P NSg/VB/J+ NPl/V3 J/P D NPl/V3+ NSg/I/C/Ddem+ NSg/VPt P D NSg/J N🅪Sg/VB/J+ . ISg/#r+ VP J/P D/P NSg/J > plaid skirt also that blew a little in the wind , and whenever this happened the # NSg/VB/J NSg/VB R/C NSg/I/C/Ddem+ NSg/VPt/J D/P NPr/I/J/Dq NPr/J/R/P D N🅪Sg/VB+ . VB/C C I/Ddem VP/J D > red , white , and blue banners in front of all the houses stretched out stiff and # N🅪Sg/J . NPr🅪Sg/VB/J . VB/C N🅪Sg/VB/J NPl/V3+ NPr/J/R/P NSg/VB/J P NSg/I/J/C/Dq D NPl/V3+ VP/J NSg/VB/J/R/P NSg/VB/J VB/C > said tut - tut - tut - tut , in a disapproving way . # VP/J NPr/VB . NPr/VB . NPr/VB . NPr/VB . NPr/J/R/P D/P Nᴹ/Vg/J NSg/J+ . > # > The largest of the banners and the largest of the lawns belonged to Daisy Fay’s # D JS P D+ NPl/V3+ VB/C D JS P D NPl/V3 VP/J P NPr NPr$ > house . She was just eighteen , two years older than me , and by far the most # NPr/VB+ . ISg+ VLPt J/R NSg . NSg+ NPl+ JC C/P NPr/ISg+ . VB/C NSg/P NSg/VB/J D NSg/I/J/R/Dq > popular of all the young girls in Louisville . She dressed in white , and had a # NSg/J P NSg/I/J/C/Dq D+ NPr/VB/J+ NPl/V3+ NPr/J/R/P NPr . ISg+ VP/J NPr/J/R/P NPr🅪Sg/VB/J . VB/C VP D/P > little white roadster , and all day long the telephone rang in her house and # NPr/I/J/Dq NPr🅪Sg/VB/J NSg . VB/C NSg/I/J/C/Dq NPr🅪Sg+ NPr/VB/J D NSg/VB+ VPt NPr/J/R/P ISg/D$+ NPr/VB+ VB/C > excited young officers from Camp Taylor demanded the privilege of monopolizing # VP/J NPr/VB/J NPl/V3 P NSg/VB/J+ NPr+ VP/J D NSg/VB P Nᴹ/Vg/J > her that night . “ Anyways , for an hour ! ” # ISg/D$+ NSg/I/C/Ddem N🅪Sg/VB+ . . R/NoAm . R/C/P D/P+ NSg+ . . > # > When I came opposite her house that morning her white roadster was beside the # NSg/I/C ISg/#r+ NSg/VPt/P NSg/J/P+ ISg/D$+ NPr/VB+ NSg/I/C/Ddem+ N🅪Sg/Vg/J+ ISg/D$+ NPr🅪Sg/VB/J NSg VLPt P D > curb , and she was sitting in it with a lieutenant I had never seen before . They # NSg/VB+ . VB/C ISg+ VLPt NSg/Vg/J NPr/J/R/P NPr/ISg+ P D/P NSg/J+ ISg/#r+ VP R NSg/VPp C/P . IPl+ > were so engrossed in each other that she didn’t see me until I was five feet # NSg/VLPt NSg/I/J/R/C VP/J NPr/J/R/P Dq NSg/VB/J NSg/I/C/Ddem ISg+ VXPt NSg/VB NPr/ISg+ C/P ISg/#r+ VLPt NSg NPl+ > away . # VB/J . > # > “ Hello , Jordan , ” she called unexpectedly . “ Please come here . ” # . NSg/VB . NPr+ . . ISg+ VP/J R . . VB NSg/VBPp/P J/R . . > # > I was flattered that she wanted to speak to me , because of all the older girls I # ISg/#r+ VLPt VP/J NSg/I/C/Ddem ISg+ VP/J P NSg/VB P NPr/ISg+ . C/P P NSg/I/J/C/Dq+ D+ JC+ NPl/V3+ ISg/#r+ > admired her most . She asked me if I was going to the Red Cross and make # VP/J ISg/D$+ NSg/I/J/R/Dq . ISg+ VP/J NPr/ISg+ NSg/C ISg/#r+ VLPt Nᴹ/Vg/J P D+ N🅪Sg/J+ NPr/VB/J/P+ VB/C NSg/VB > bandages . I was . Well , then , would I tell them that she couldn’t come that day ? # NPl/V3 . ISg/#r+ VLPt . NSg/VB/J/R . NSg/J/R/C . VXB ISg/#r+ NPr/VB NSg/IPl+ NSg/I/C/Ddem ISg+ VXB NSg/VBPp/P NSg/I/C/Ddem NPr🅪Sg+ . > The officer looked at Daisy while she was speaking , in a way that every young # D+ NSg/VB+ VP/J NSg/P NPr+ NSg/VB/C/P ISg+ VLPt Nᴹ/Vg/J . NPr/J/R/P D/P NSg/J+ NSg/I/C/Ddem Dq+ NPr/VB/J+ > girl wants to be looked at sometime , and because it seemed romantic to me I have # NSg/VB+ NPl/V3 P NSg/VLXB VP/J NSg/P J . VB/C C/P NPr/ISg+ VP/J NSg/J P NPr/ISg+ ISg/#r+ NSg/VXB > remembered the incident ever since . His name was Jay Gatsby , and I didn’t lay # VP/J D+ NSg/J+ J/R C/P . ISg/D$+ NSg/VB+ VLPt NPr+ NPr . VB/C ISg/#r+ VXPt NSg/VBPt/J > eyes on him again for over four years — even after I'd met him on Long Island I # NPl/V3+ J/P ISg+ P R/C/P NSg/J/P NSg NPl+ . NSg/VB/J/R P K VP ISg+ J/P NPr/VB/J NSg/VB+ ISg/#r+ > didn’t realize it was the same man . # VXPt VB/Comm/NoAm NPr/ISg+ VLPt D I/J NPr/VB/J+ . > # > That was nineteen - seventeen . By the next year I had a few beaux myself , and I # NSg/I/C/Ddem+ VLPt NSg . NSg . NSg/P D+ NSg/J/P+ NSg+ ISg/#r+ VP D/P NSg/I/Dq ? ISg+ . VB/C ISg/#r+ > began to play in tournaments , so I didn’t see Daisy very often . She went with a # VPt P N🅪Sg/VB NPr/J/R/P NPl . NSg/I/J/R/C ISg/#r+ VXPt NSg/VB NPr+ J/R R . ISg+ NSg/VPt P D/P > slightly older crowd — when she went with anyone at all . Wild rumors were # R JC+ NSg/VB+ . NSg/I/C ISg+ NSg/VPt P NSg/I+ NSg/P NSg/I/J/C/Dq . NSg/VB/J+ NPl/V3/Am+ NSg/VLPt > circulating about her — how her mother had found her packing her bag one winter # Nᴹ/Vg/J J/P ISg/D$+ . NSg/C ISg/D$+ NSg/VB/J+ VP NSg/VP ISg/D$+ Nᴹ/Vg/J ISg/D$+ NSg/VB+ NSg/I/J+ N🅪Sg/VB+ > night to go to New York and say good - by to a soldier who was going overseas . She # N🅪Sg/VB+ P NSg/VB/J P NSg/J+ NPr+ VB/C NSg/VB NPr/VB/J . NSg/P P D/P+ NSg/VB/J+ NPr/I+ VLPt Nᴹ/Vg/J J/R . ISg+ > was effectually prevented , but she wasn’t on speaking terms with her family for # VLPt R VP/J . NSg/C/P ISg+ VPt J/P Nᴹ/Vg/J NPl/V3+ P ISg/D$+ N🅪Sg/J+ R/C/P > several weeks . After that she didn’t play around with the soldiers any more , but # J/Dq+ NPrPl+ . P NSg/I/C/Ddem ISg+ VXPt N🅪Sg/VB J/P P D NPl/V3+ I/R/Dq NPr/I/J/R/Dq . NSg/C/P > only with a few flat - footed , shortsighted young men in town , who couldn’t get # J/R/C P D/P NSg/I/Dq NSg/VB/J . VP/J . J NPr/VB/J NPl+ NPr/J/R/P NSg+ . NPr/I+ VXB NSg/VB > into the army at all . # P D NSg+ NSg/P NSg/I/J/C/Dq . > # > By the next autumn she was gay again , gay as ever . She had a début after the # NSg/P D+ NSg/J/P+ NPr🅪Sg/VB+ ISg+ VLPt NPr/VB/J P . NPr/VB/J R/C/P J/R . ISg+ VP D/P ? P D > armistice , and in February she was presumably engaged to a man from New Orleans . # NPr🅪Sg . VB/C NPr/J/R/P NPr+ ISg+ VLPt R VP/J P D/P NPr/VB/J+ P NSg/J NPr+ . > In June she married Tom Buchanan of Chicago , with more pomp and circumstance # NPr/J/R/P NPr+ ISg+ NSg/VP/J NPr/VB+ NPr P NPr+ . P NPr/I/J/R/Dq NSg/VB VB/C NSg/VB > than Louisville ever knew before . He came down with a hundred people in four # C/P NPr J/R VPt C/P . NPr/ISg+ NSg/VPt/P N🅪Sg/VB/J/P P D/P NSg NPl/VB+ NPr/J/R/P NSg+ > private cars , and hired a whole floor of the Muhlbach Hotel , and the day before # NSg/VB/J+ NPl+ . VB/C VP/J D/P NSg/J NSg/VB P D ? NSg+ . VB/C D NPr🅪Sg+ C/P > the wedding he gave her a string of pearls valued at three hundred and fifty # D NSg/Vg+ NPr/ISg+ VPt ISg/D$+ D/P NSg/VB P NPl/V3+ VP/J NSg/P NSg NSg VB/C NSg > thousand dollars . # NSg NPl+ . > # > I was a bridesmaid . I came into her room half an hour before the bridal dinner , # ISg/#r+ VLPt D/P NSg/VB . ISg/#r+ NSg/VPt/P P ISg/D$+ N🅪Sg/VB/J+ N🅪Sg/J/P+ D/P+ NSg+ C/P D+ NSg/J+ N🅪Sg/VB+ . > and found her lying on her bed as lovely as the June night in her flowered # VB/C NSg/VP ISg/D$+ Nᴹ/Vg/J J/P ISg/D$+ NSg/VBP/J+ R/C/P NSg/J R/C/P D+ NPr+ N🅪Sg/VB+ NPr/J/R/P ISg/D$+ VP/J+ > dress — and as drunk as a monkey . She had a bottle of Sauterne in one hand and a # NSg/VB+ . VB/C R/C/P NSg/VPp/J R/C/P D/P+ NSg/VB+ . ISg+ VP D/P NSg/VB P ? NPr/J/R/P NSg/I/J NSg/VB VB/C D/P > letter in the other . # NSg/VB+ NPr/J/R/P D NSg/VB/J . > # > “ ’ Gratulate me , ” she muttered . “ Never had a drink before , but oh how I do enjoy # . . ? NPr/ISg+ . . ISg+ VP/J . . R VP D/P+ NSg/VB+ C/P . NSg/C/P NPr/VB NSg/C ISg/#r+ VXB VB > it . ” # NPr/ISg+ . . > # > “ What’s the matter , Daisy ? ” # . K D N🅪Sg/VB+ . NPr+ . . > # > I was scared , I can tell you ; I’d never seen a girl like that before . # ISg/#r+ VLPt VP/J . ISg/#r+ NPr/VXB NPr/VB ISgPl+ . K R NSg/VPp D/P NSg/VB+ NSg/VB/J/C/P NSg/I/C/Ddem+ C/P . > # > “ Here , deares ’ . ” She groped around in a wastebasket she had with her on the bed # . J/R . ? . . . ISg+ VP/J J/P NPr/J/R/P D/P NSg/VB ISg+ VP P ISg/D$+ J/P D NSg/VBP/J+ > and pulled out the string of pearls . ‘ Take ’ em down - stairs and give ’ em back to # VB/C VP/J NSg/VB/J/R/P D NSg/VB P NPl/V3+ . Unlintable NSg/VB . NSg/I/J+ N🅪Sg/VB/J/P . NPl+ VB/C NSg/VB . NSg/I/J+ NSg/VB/J P > whoever they belong to . Tell ’ em all Daisy’s change ’ her mine . Say : ‘ Daisy’s # I+ IPl+ VB/P P . NPr/VB . NSg/I/J+ NSg/I/J/C/Dq NPr$ N🅪Sg/VB+ . ISg/D$+ NSg/I/VB+ . NSg/VB . Unlintable NPr$ > change ’ her mine ! ’ ” # N🅪Sg/VB+ . ISg/D$+ NSg/I/VB+ . . . > # > She began to cry — she cried and cried . I rushed out and found her mother’s maid , # ISg+ VPt P NSg/VB . ISg+ VP/J VB/C VP/J . ISg/#r+ VP/J NSg/VB/J/R/P VB/C NSg/VP ISg/D$+ NSg$ NSg+ . > and we locked the door and got her into a cold bath . She wouldn’t let go of the # VB/C IPl+ VP/J D NSg/VB+ VB/C VP ISg/D$+ P D/P NSg/J NSg/VB+ . ISg+ VXB NSg/VBP NSg/VB/J P D > letter . She took it into the tub with her and squeezed it up into a wet ball , # NSg/VB+ . ISg+ VPt NPr/ISg+ P D+ NSg/VB+ P ISg/D$+ VB/C VP/J NPr/ISg+ NSg/VB/J/P P D/P+ NSg/VP/J+ NPr/VB+ . > and only let me leave it in the soap - dish when she saw that it was coming to # VB/C J/R/C NSg/VBP NPr/ISg+ NSg/VB NPr/ISg+ NPr/J/R/P D+ N🅪Sg/VB+ . NSg/VB+ NSg/I/C ISg+ NSg/VPt NSg/I/C/Ddem NPr/ISg+ VLPt Nᴹ/Vg/J P > pieces like snow . # NPl/V3 NSg/VB/J/C/P NPr🅪Sg/VB+ . > # > But she didn’t say another word . We gave her spirits of ammonia and put ice on # NSg/C/P ISg+ VXPt NSg/VB I/D NSg/VB+ . IPl+ VPt ISg/D$+ NPl/V3 P Nᴹ+ VB/C NSg/VBP NPr🅪Sg/VB+ J/P > her forehead and hooked her back into her dress , and half an hour later , when we # ISg/D$+ NSg+ VB/C VP/J ISg/D$+ NSg/VB/J P ISg/D$+ NSg/VB+ . VB/C N🅪Sg/J/P D/P+ NSg+ JC . NSg/I/C IPl+ > walked out of the room , the pearls were around her neck and the incident was # VP/J NSg/VB/J/R/P P D+ N🅪Sg/VB/J+ . D+ NPl/V3+ NSg/VLPt J/P ISg/D$+ NSg/VB VB/C D+ NSg/J+ VLPt > over . Next day at five o’clock she married Tom Buchanan without so much as a # NSg/J/P . NSg/J/P+ NPr🅪Sg+ NSg/P NSg R ISg+ NSg/VP/J NPr/VB+ NPr+ C/P NSg/I/J/R/C NSg/I/J/R/Dq R/C/P D/P > shiver , and started off on a three months ’ trip to the South Seas . # NSg/VB . VB/C VP/J NSg/VB/J/P J/P D/P NSg NPl+ . NSg/VB/J+ P D NPr/VB/J+ NPl+ . > # > I saw them in Santa Barbara when they came back , and I thought I’d never seen a # ISg/#r+ NSg/VPt NSg/IPl+ NPr/J/R/P NPr+ NPr+ NSg/I/C IPl+ NSg/VPt/P NSg/VB/J . VB/C ISg/#r+ N🅪Sg/VP K R NSg/VPp D/P > girl so mad about her husband . If he left the room for a minute she’d look # NSg/VB+ NSg/I/J/R/C NSg/VB/J J/P ISg/D$+ NSg/VB+ . NSg/C NPr/ISg+ NPr/VP/J D N🅪Sg/VB/J R/C/P D/P+ NSg/VB/J+ K NSg/VB > around uneasily , and say : ‘ ‘ Where’s Tom gone ? ” and wear the most abstracted # J/P R . VB/C NSg/VB . Unlintable Unlintable NSg$ NPr/VB+ VPp/J/P . . VB/C NSg/VB D NSg/I/J/R/Dq VP/J > expression until she saw him coming in the door . She used to sit on the sand # N🅪Sg+ C/P ISg+ NSg/VPt ISg+ Nᴹ/Vg/J NPr/J/R/P D NSg/VB+ . ISg+ VP/J P NSg/VB J/P D NSg/VB/J+ > with his head in her lap by the hour , rubbing her fingers over his eyes and # P ISg/D$+ NPr/VB/J+ NPr/J/R/P ISg/D$+ NSg/VB/J+ NSg/P D+ NSg+ . NSg/Vg ISg/D$+ NPl/V3+ NSg/J/P ISg/D$+ NPl/V3+ VB/C > looking at him with unfathomable delight . It was touching to see them # Nᴹ/Vg/J NSg/P ISg+ P J+ N🅪Sg/VB/J+ . NPr/ISg+ VLPt Nᴹ/Vg/J/P P NSg/VB NSg/IPl+ > together — it made you laugh in a hushed , fascinated way . That was in August . A # J . NPr/ISg+ VP ISgPl+ NSg/VB NPr/J/R/P D/P VP/J . VP/J NSg/J+ . NSg/I/C/Ddem+ VLPt NPr/J/R/P NPr/VB/J+ . D/P+ > week after I left Santa Barbara Tom ran into a wagon on the Ventura road one # NSg/J+ P ISg/#r+ NPr/VP/J NPr+ NPr+ NPr/VB+ NSg/VPt P D/P+ NSg/VB+ J/P D ? N🅪Sg/J+ NSg/I/J > night , and ripped a front wheel off his car . The girl who was with him got into # N🅪Sg/VB+ . VB/C VP/J D/P NSg/VB/J+ NSg/VB+ NSg/VB/J/P ISg/D$+ NSg+ . D+ NSg/VB+ NPr/I+ VLPt P ISg+ VP P > the papers , too , because her arm was broken — she was one of the chambermaids in # D+ NPl/V3+ . R . C/P ISg/D$+ NSg/VB/J+ VLPt VPp/J . ISg+ VLPt NSg/I/J P D NPl NPr/J/R/P > the Santa Barbara Hotel . # D NPr+ NPr+ NSg+ . > # > The next April Daisy had her little girl , and they went to France for a year . I # D+ NSg/J/P+ NPr+ NPr+ VP ISg/D$+ NPr/I/J/Dq+ NSg/VB+ . VB/C IPl+ NSg/VPt P NPr+ R/C/P D/P+ NSg+ . ISg/#r+ > saw them one spring in Cannes , and later in Deauville , and then they came back # NSg/VPt NSg/IPl+ NSg/I/J N🅪Sg/VB NPr/J/R/P NPr+ . VB/C JC NPr/J/R/P ? . VB/C NSg/J/R/C IPl+ NSg/VPt/P NSg/VB/J > to Chicago to settle down . Daisy was popular in Chicago , as you know . They moved # P NPr+ P NSg/VB N🅪Sg/VB/J/P . NPr+ VLPt NSg/J NPr/J/R/P NPr+ . R/C/P ISgPl+ VB . IPl+ VP/J > with a fast crowd , all of them young and rich and wild , but she came out with an # P D/P+ NSg/VB/J/R+ NSg/VB+ . NSg/I/J/C/Dq P NSg/IPl+ NPr/VB/J VB/C NPr/VB/J VB/C NSg/VB/J . NSg/C/P ISg+ NSg/VPt/P NSg/VB/J/R/P P D/P > absolutely perfect reputation . Perhaps because she doesn’t drink . It’s a great # R NSg/VB/J+ NSg+ . NSg/R C/P ISg+ VX3 NSg/VB+ . K D/P NSg/J > advantage not to drink among hard - drinking people . You can hold your tongue , # N🅪Sg/VB+ NSg/R/C P NSg/VB P N🅪Sg/J/R . Nᴹ/Vg/J NPl/VB+ . ISgPl+ NPr/VXB NSg/VB/J D$+ N🅪Sg/VB+ . > and , moreover , you can time any little irregularity of your own so that # VB/C . R . ISgPl+ NPr/VXB N🅪Sg/VB/J I/R/Dq NPr/I/J/Dq NSg P D$+ NSg/VB/J NSg/I/J/R/C NSg/I/C/Ddem > everybody else is so blind that they don’t see or care . Perhaps Daisy never went # NSg/I+ NSg/J/C VL3 NSg/I/J/R/C NSg/VB/J NSg/I/C/Ddem IPl+ VXB NSg/VB NPr/C N🅪Sg/VB+ . NSg/R NPr+ R NSg/VPt > in for amour at all — and yet there’s something in that voice of hers . . . . # NPr/J/R/P R/C/P NSg NSg/P NSg/I/J/C/Dq . VB/C NSg/VB/C K NSg/I/J+ NPr/J/R/P NSg/I/C/Ddem NSg/VB P ISg+ . . . . > # > Well , about six weeks ago , she heard the name Gatsby for the first time in # NSg/VB/J/R . J/P NSg+ NPrPl+ J/P . ISg+ VP/J D+ NSg/VB+ NPr R/C/P D NSg/J N🅪Sg/VB/J+ NPr/J/R/P > years . It was when I asked you — do you remember ? — if you knew Gatsby in West Egg . # NPl+ . NPr/ISg+ VLPt NSg/I/C ISg/#r+ VP/J ISgPl+ . VXB ISgPl+ NSg/VB . . NSg/C ISgPl+ VPt NPr NPr/J/R/P NPr/VB/J+ N🅪Sg/VB+ . > After you had gone home she came into my room and woke me up , and said : “ What # P ISgPl+ VP VPp/J/P NSg/VB/J+ ISg+ NSg/VPt/P P D$+ N🅪Sg/VB/J+ VB/C NSg/VB/J NPr/ISg+ NSg/VB/J/P . VB/C VP/J . . NSg/I+ > Gatsby ? ” and when I described him — I was half asleep — she said in the strangest # NPr . . VB/C NSg/I/C ISg/#r+ VP/J ISg+ . ISg/#r+ VLPt N🅪Sg/J/P J . ISg+ VP/J NPr/J/R/P D JS > voice that it must be the man she used to know . It wasn’t until then that I # NSg/VB+ NSg/I/C/Ddem+ NPr/ISg+ NSg/VXB NSg/VLXB D NPr/VB/J+ ISg+ VP/J P VB . NPr/ISg+ VPt C/P NSg/J/R/C NSg/I/C/Ddem ISg/#r+ > connected this Gatsby with the officer in her white car . # VP/J I/Ddem NPr P D NSg/VB+ NPr/J/R/P ISg/D$+ NPr🅪Sg/VB/J NSg+ . > # > When Jordan Baker had finished telling all this we had left the Plaza for half # NSg/I/C NPr+ NPr+ VP VP/J Nᴹ/Vg/J NSg/I/J/C/Dq+ I/Ddem+ IPl+ VP NPr/VP/J D NSg R/C/P N🅪Sg/J/P+ > an hour and were driving in a victoria through Central Park . The sun had gone # D/P+ NSg+ VB/C NSg/VLPt Nᴹ/Vg/J NPr/J/R/P D/P+ NPr+ NSg/J/P NPr/J+ NPr/VB+ . D+ NPr/VB+ VP VPp/J/P > down behind the tall apartments of the movie stars in the West Fifties , and the # N🅪Sg/VB/J/P NSg/J/P D NSg/J NPl P D+ NSg+ NPl/V3+ NPr/J/R/P D+ NPr/VB/J+ NPl . VB/C D > clear voices of children , already gathered like crickets on the grass , rose # NSg/VB/J NPl/V3 P NPl+ . R VP/J NSg/VB/J/C/P NPl/V3+ J/P D NPr🅪Sg/VB+ . NPr/VPt/J > through the hot twilight : # NSg/J/P D NSg/VB/J Nᴹ/VB/J+ . > # > “ I’m the Sheik of Araby . Your love belongs to me . At night when you’re asleep # . K D NSg/Ca P NPr . D$+ NPr🅪Sg/VB V3 P NPr/ISg+ . NSg/P N🅪Sg/VB+ NSg/I/C K J > Into your tent I’ll creep — ” # P D$+ NSg/VB+ K NSg/VB+ . . > # > “ It was a strange coincidence , ” I said . # . NPr/ISg+ VLPt D/P NSg/VB/J N🅪Sg . . ISg/#r+ VP/J . > # > “ But it wasn’t a coincidence at all . ” # . NSg/C/P NPr/ISg+ VPt D/P N🅪Sg+ NSg/P NSg/I/J/C/Dq . . > # > “ Why not ? ” # . NSg/VB NSg/R/C . . > # > “ Gatsby bought that house so that Daisy would be just across the bay . ” # . NPr NSg/VP NSg/I/C/Ddem NPr/VB+ NSg/I/J/R/C NSg/I/C/Ddem NPr+ VXB NSg/VLXB J/R NSg/P D NSg/VB/J+ . . > # > Then it had not been merely the stars to which he had aspired on that June # NSg/J/R/C NPr/ISg+ VP NSg/R/C NSg/VLPp R D+ NPl/V3+ P I/C+ NPr/ISg+ VP VP/J J/P NSg/I/C/Ddem NPr+ > night . He came alive to me , delivered suddenly from the womb of his purposeless # N🅪Sg/VB+ . NPr/ISg+ NSg/VPt/P J P NPr/ISg+ . VP/J R P D NSg/VB P ISg/D$+ J > splendor . # NSg/Am . > # > “ He wants to know , ” continued Jordan , “ if you'll invite Daisy to your house some # . NPr/ISg+ NPl/V3 P VB . . VP/J NPr+ . . NSg/C K NSg/VB NPr+ P D$+ NPr/VB I/J/R/Dq > afternoon and then let him come over . ” # N🅪Sg+ VB/C NSg/J/R/C NSg/VBP ISg+ NSg/VBPp/P NSg/J/P . . > # > The modesty of the demand shook me . He had waited five years and bought a # D Nᴹ P D N🅪Sg/VB+ NSg/VPt/J NPr/ISg+ . NPr/ISg+ VP VP/J NSg+ NPl+ VB/C NSg/VP D/P+ > mansion where he dispensed starlight to casual moths — so that he could “ come # NSg+ NSg/R/C NPr/ISg+ VP/J NSg P NSg/J NPl/VB+ . NSg/I/J/R/C NSg/I/C/Ddem NPr/ISg+ NSg/VXB . NSg/VBPp/P > over ” some afternoon to a stranger’s garden . # NSg/J/P . I/J/R/Dq N🅪Sg+ P D/P NSg$ NSg/VB/J+ . > # > “ Did I have to know all this before he could ask such a little thing ? ” # . VXPt ISg/#r+ NSg/VXB P VB NSg/I/J/C/Dq I/Ddem C/P NPr/ISg+ NSg/VXB NSg/VB NSg/I+ D/P+ NPr/I/J/Dq+ NSg+ . . > # > “ He’s afraid , he’s waited so long . He thought you might be offended . You see , # . NPr$ J . NPr$ VP/J NSg/I/J/R/C NPr/VB/J . NPr/ISg+ N🅪Sg/VP ISgPl+ Nᴹ/VXB/J NSg/VLXB VP/J . ISgPl+ NSg/VB . > he’s regular tough underneath it all . ” # NPr$ NSg/J NSg/VB/J NSg/J/P NPr/ISg+ NSg/I/J/C/Dq . . > # > Something worried me . # NSg/I/J+ VP/J NPr/ISg+ . > # > “ Why didn’t he ask you to arrange a meeting ? ” # . NSg/VB VXPt NPr/ISg+ NSg/VB ISgPl+ P NSg/VB D/P N🅪Sg/Vg/J+ . . > # > “ He wants her to see his house , ” she explained . “ And your house is right next # . NPr/ISg+ NPl/V3 ISg/D$+ P NSg/VB ISg/D$+ NPr/VB+ . . ISg+ VP/J . . VB/C D$+ NPr/VB+ VL3 NPr/VB/J NSg/J/P+ > door . ” # NSg/VB+ . . > # > “ Oh ! ” # . NPr/VB . . > # > “ I think he half expected her to wander into one of his parties , some night , ” # . ISg/#r+ NSg/VB NPr/ISg+ N🅪Sg/J/P+ NSg/VP/J ISg/D$+ P NSg/VB P NSg/I/J P ISg/D$+ NPl/V3+ . I/J/R/Dq+ N🅪Sg/VB+ . . > went on Jordan , “ but she never did . Then he began asking people casually if they # NSg/VPt J/P NPr+ . . NSg/C/P ISg+ R VXPt . NSg/J/R/C NPr/ISg+ VPt Nᴹ/Vg/J NPl/VB+ R NSg/C IPl+ > knew her , and I was the first one he found . It was that night he sent for me at # VPt ISg/D$+ . VB/C ISg/#r+ VLPt D NSg/J NSg/I/J NPr/ISg+ NSg/VP . NPr/ISg+ VLPt NSg/I/C/Ddem N🅪Sg/VB NPr/ISg+ NSg/VP R/C/P NPr/ISg+ NSg/P > his dance , and you should have heard the elaborate way he worked up to it . Of # ISg/D$+ N🅪Sg/VB+ . VB/C ISgPl+ VXB NSg/VXB VP/J D+ VB/J+ NSg/J+ NPr/ISg+ VP/J NSg/VB/J/P P NPr/ISg+ . P > course , I immediately suggested a luncheon in New York — and I thought he’d go # NSg/VB+ . ISg/#r+ R VP/J D/P NSg/VB NPr/J/R/P NSg/J+ NPr+ . VB/C ISg/#r+ N🅪Sg/VP K NSg/VB/J > mad : # NSg/VB/J . > # > “ ‘ I don’t want to do anything out of the way ! ’ he kept saying . ‘ I want to see # . Unlintable ISg/#r+ VXB NSg/VB P VXB NSg/I/VB+ NSg/VB/J/R/P P D NSg/J+ . . NPr/ISg+ VP N🅪Sg/Vg/J . Unlintable ISg/#r+ NSg/VB P NSg/VB > her right next door . ’ # ISg/D$+ NPr/VB/J+ NSg/J/P+ NSg/VB+ . . > # > “ When I said you were a particular friend of Tom’s , he started to abandon the # . NSg/I/C ISg/#r+ VP/J ISgPl+ NSg/VLPt D/P NSg/J NPr/VB/J P NPr$ . NPr/ISg+ VP/J P NSg/VB D > whole idea . He doesn’t know very much about Tom , though he says he’s read a # NSg/J NSg+ . NPr/ISg+ VX3 VB J/R NSg/I/J/R/Dq J/P NPr/VB+ . C NPr/ISg+ NPl/V3 NPr$ NSg/VBP D/P > Chicago paper for years just on the chance of catching a glimpse of Daisy’s # NPr+ N🅪Sg/VB/J R/C/P NPl+ J/R J/P D NPr/VB/J P Nᴹ/Vg/J D/P NSg/VB P NPr$ > name . ” # NSg/VB+ . . > # > It was dark now , and as we dipped under a little bridge I put my arm around # NPr/ISg+ VLPt NSg/VB/J NSg/J/R/C . VB/C R/C/P IPl+ VP/J NSg/J/P D/P+ NPr/I/J/Dq+ N🅪Sg/VB+ ISg/#r+ NSg/VBP D$+ NSg/VB/J+ J/P > Jordan’s golden shoulder and drew her toward me and asked her to dinner . # NPr$ NPr/VB/J+ NSg/VB+ VB/C NPr/VPt ISg/D$+ J/P NPr/ISg+ VB/C VP/J ISg/D$+ P N🅪Sg/VB . > Suddenly I wasn’t thinking of Daisy and Gatsby any more , but of this clean , # R ISg/#r+ VPt Nᴹ/Vg/J P NPr+ VB/C NPr I/R/Dq NPr/I/J/R/Dq . NSg/C/P P I/Ddem NSg/VB/J . > hard , limited person , who dealt in universal scepticism , and who leaned back # N🅪Sg/J/R . NSg/VP/J NSg/VB+ . NPr/I+ VB NPr/J/R/P NSg/J Nᴹ/Au/Br . VB/C NPr/I+ VP/J NSg/VB/J > jauntily just within the circle of my arm . A phrase began to beat in my ears # R J/R NSg/J/P D NSg/VB P D$+ NSg/VB/J+ . D/P+ NSg/VB+ VPt P N🅪Sg/VB/J NPr/J/R/P D$+ NPl/V3+ > with a sort of heady excitement : ‘ ‘ There are only the pursued , the pursuing , the # P D/P NSg/VB P J+ NSg+ . Unlintable Unlintable R+ VLB J/R/C D+ VP/J+ . D+ Nᴹ/Vg/J+ . D > busy and the tired . ” # NSg/VB/J VB/C D VP/J . . > # > “ And Daisy ought to have something in her life , ” murmured Jordan to me . # . VB/C NPr+ NSg/I/VXB P NSg/VXB NSg/I/J+ NPr/J/R/P ISg/D$+ N🅪Sg/VB+ . . VP/J NPr+ P NPr/ISg+ . > # > “ Does she want to see Gatsby ? ” # . NPl/VX3 ISg+ NSg/VB P NSg/VB NPr . . > # > “ She’s not to know about it . Gatsby doesn’t want her to know . You’re just # . K NSg/R/C P VB J/P NPr/ISg+ . NPr VX3 NSg/VB ISg/D$+ P VB . K J/R > supposed to invite her to tea . ” # VP/J P NSg/VB ISg/D$+ P N🅪Sg/VB . . > # > We passed a barrier of dark trees , and then the façade of Fifty - ninth Street , a # IPl+ VP/J D/P NSg/VB P NSg/VB/J+ NPl/V3+ . VB/C NSg/J/R/C D ? P NSg . NSg/VB/J NSg/VB/J . D/P > block of delicate pale light , beamed down into the park . Unlike Gatsby and Tom # NSg/VB P NSg/J+ NSg/VB/J+ N🅪Sg/VB/J+ . VP/J N🅪Sg/VB/J/P P D NPr/VB+ . NSg/VB/J/P NPr VB/C NPr/VB+ > Buchanan , I had no girl whose disembodied face floated along the dark cornices # NPr+ . ISg/#r+ VP NSg/Dq/P NSg/VB+ I+ VP/J NSg/VB+ VP/J P D NSg/VB/J NPl/V3 > and blinding signs , and so I drew up the girl beside me , tightening my arms . Her # VB/C Nᴹ/Vg/J NPl/V3+ . VB/C NSg/I/J/R/C ISg/#r+ NPr/VPt NSg/VB/J/P D NSg/VB+ P NPr/ISg+ . Nᴹ/Vg/J D$+ NPl/V3+ . ISg/D$+ > wan , scornful mouth smiled , and so I drew her up again closer , this time to my # NSg/VB/J . J NSg/VB+ VP/J . VB/C NSg/I/J/R/C ISg/#r+ NPr/VPt ISg/D$+ NSg/VB/J/P P NSg/JC . I/Ddem N🅪Sg/VB/J+ P D$+ > face . # NSg/VB+ . > # > CHAPTER V # HeadingStart NSg/VB+ NSg/P/#r+ > # > When I came home to West Egg that night I was afraid for a moment that my house # NSg/I/C ISg/#r+ NSg/VPt/P NSg/VB/J+ P NPr/VB/J+ N🅪Sg/VB+ NSg/I/C/Ddem+ N🅪Sg/VB+ ISg/#r+ VLPt J R/C/P D/P+ NSg+ NSg/I/C/Ddem+ D$+ NPr/VB+ > was on fire . Two o’clock and the whole corner of the peninsula was blazing with # VLPt J/P N🅪Sg/VB/J+ . NSg R VB/C D NSg/J NSg/VB P D+ NSg+ VLPt Nᴹ/Vg/J P > light , which fell unreal on the shrubbery and made thin elongating glints upon # N🅪Sg/VB/J+ . I/C+ NSg/VPt/J J J/P D NSg VB/C VP NSg/VB/J Nᴹ/Vg/J NPl/V3 P > the roadside wires . Turning a corner , I saw that it was Gatsby’s house , lit from # D NSg/J+ NPl/V3+ . Nᴹ/Vg/J D/P+ NSg/VB+ . ISg/#r+ NSg/VPt NSg/I/C/Ddem NPr/ISg+ VLPt NPr$ NPr/VB+ . NSg/VP/J P > tower to cellar . # NSg/VB+ P NSg/VB . > # > At first I thought it was another party , a wild rout that had resolved itself # NSg/P NSg/J ISg/#r+ N🅪Sg/VP NPr/ISg+ VLPt I/D NSg/VB/J . D/P+ NSg/VB/J+ NSg/VB+ NSg/I/C/Ddem+ VP VP/J ISg+ > into “ hide - and - go - seek ” or “ sardines - in - the - box ” with all the house thrown open # P . NSg/VB . VB/C . NSg/VB/J . NSg/VB . NPr/C . NPl/V3+ . NPr/J/R/P . D . NSg/VB . P NSg/I/J/C/Dq D+ NPr/VB+ VPp/J NSg/VB/J > to the game . But there wasn’t a sound . Only wind in the trees , which blew the # P D+ NSg/VB/J+ . NSg/C/P R+ VPt D/P N🅪Sg/VB/J+ . J/R/C N🅪Sg/VB+ NPr/J/R/P D+ NPl/V3+ . I/C+ NSg/VPt/J D+ > wires and made the lights go off and on again as if the house had winked into # NPl/V3+ VB/C VP D+ NPl/V3+ NSg/VB/J+ NSg/VB/J/P VB/C J/P P R/C/P NSg/C D+ NPr/VB+ VP VP/J P > the darkness . As my taxi groaned away I saw Gatsby walking toward me across his # D+ Nᴹ+ . R/C/P D$+ NSg/VB+ VP/J VB/J ISg/#r+ NSg/VPt NPr Nᴹ/Vg/J J/P NPr/ISg+ NSg/P ISg/D$+ > lawn . # NSg/VB+ . > # > “ Your place looks like the World’s Fair , ” I said . # . D$+ N🅪Sg/VB+ NPl/V3 NSg/VB/J/C/P D NSg$ NSg/VB/J . . ISg/#r+ VP/J . > # > “ Does it ? ” He turned his eyes toward it absently . “ I have been glancing into # . NPl/VX3 NPr/ISg+ . . NPr/ISg+ VP/J ISg/D$+ NPl/V3+ J/P NPr/ISg+ R . . ISg/#r+ NSg/VXB NSg/VLPp Nᴹ/Vg/J P > some of the rooms . Let’s go to Coney Island , old sport . In my car . ” # I/J/R/Dq P D+ NPl/V3+ . NSg$ NSg/VB/J P ? NSg/VB+ . NSg/J NSg/VB+ . NPr/J/R/P D$+ NSg+ . . > # > “ It’s too late . ” # . K R NSg/J . . > # > “ Well , suppose we take a plunge in the swimming - pool ? I haven’t made use of it # . NSg/VB/J/R . VB IPl+ NSg/VB D/P NSg/VB+ NPr/J/R/P D+ NSg/Vg+ . NSg/VB+ . ISg/#r+ VXB VP N🅪Sg/VB P NPr/ISg+ > all summer . ” # NSg/I/J/C/Dq NPr🅪Sg/VB+ . . > # > “ I’ve got to go to bed . ” # . K VP P NSg/VB/J P NSg/VBP/J . . > # > “ All right . ” # . NSg/I/J/C/Dq NPr/VB/J . . > # > He waited , looking at me with suppressed eagerness . # NPr/ISg+ VP/J . Nᴹ/Vg/J NSg/P NPr/ISg+ P VP/J NSg . > # > “ I talked with Miss Baker , ” I said after a moment . “ I’m going to call up Daisy # . ISg/#r+ VP/J P NSg/VB NPr+ . . ISg/#r+ VP/J P D/P+ NSg+ . . K Nᴹ/Vg/J P NSg/VB NSg/VB/J/P NPr+ > to - morrow and invite her over here to tea . ” # P . NPr/VB VB/C NSg/VB ISg/D$+ NSg/J/P J/R P N🅪Sg/VB . . > # > “ Oh , that’s all right , ” he said carelessly . “ I don’t want to put you to any # . NPr/VB . NSg$ NSg/I/J/C/Dq NPr/VB/J . . NPr/ISg+ VP/J R . . ISg/#r+ VXB NSg/VB P NSg/VBP ISgPl+ P I/R/Dq > trouble . ” # N🅪Sg/VB+ . . > # > “ What day would suit you ? ” # . NSg/I+ NPr🅪Sg+ VXB NSg/VB ISgPl+ . . > # > “ What day would suit you ? ” he corrected me quickly . “ I don’t want to put you to # . NSg/I+ NPr🅪Sg+ VXB NSg/VB ISgPl+ . . NPr/ISg+ VP/J NPr/ISg+ R . . ISg/#r+ VXB NSg/VB P NSg/VBP ISgPl+ P > any trouble , you see . ” # I/R/Dq N🅪Sg/VB+ . ISgPl+ NSg/VB . . > # > “ How about the day after to - morrow ? ” # . NSg/C J/P D+ NPr🅪Sg+ P P . NPr/VB . . > # > He considered for a moment . Then , with reluctance : # NPr/ISg+ VP/J R/C/P D/P+ NSg+ . NSg/J/R/C . P NSg+ . > # > “ I want to get the grass cut , ” he said . # . ISg/#r+ NSg/VB P NSg/VB D+ NPr🅪Sg/VB+ NSg/VBP/J . . NPr/ISg+ VP/J . > # > We both looked down at the grass — there was a sharp line where my ragged lawn # IPl+ I/C/Dq VP/J N🅪Sg/VB/J/P NSg/P D+ NPr🅪Sg/VB+ . R+ VLPt D/P+ NPr/VB/J+ NSg/VB+ NSg/R/C D$+ VP/J NSg/VB+ > ended and the darker , well - kept expanse of his began . I suspected that he meant # VP/J VB/C D NSg/JC . NSg/VB/J/R . VP NSg P ISg/D$+ VPt . ISg/#r+ VP/J NSg/I/C/Ddem NPr/ISg+ VP > my grass . # D$+ NPr🅪Sg/VB+ . > # > “ There’s another little thing , ” he said uncertainly , and hesitated . # . K I/D+ NPr/I/J/Dq NSg+ . . NPr/ISg+ VP/J ? . VB/C VP/J . > # > “ Would you rather put it off for a few days ? ” I asked . # . VXB ISgPl+ NPr/VB/J/R NSg/VBP NPr/ISg+ NSg/VB/J/P R/C/P D/P+ NSg/I/Dq+ NPl+ . . ISg/#r+ VP/J . > # > “ Oh , it isn’t about that . At least — ’ ’ He fumbled with a series of beginnings . # . NPr/VB . NPr/ISg+ NSg/VX3 J/P NSg/I/C/Ddem+ . NSg/P NSg/J/Dq . . . NPr/ISg+ VP/J P D/P NSgPl P NPl/V3+ . > “ Why , I thought — why , look here , old sport , you don’t make much money , do you ? ” # . NSg/VB . ISg/#r+ N🅪Sg/VP . NSg/VB . NSg/VB J/R . NSg/J+ NSg/VB+ . ISgPl+ VXB NSg/VB NSg/I/J/R/Dq N🅪Sg/J+ . VXB ISgPl+ . . > # > “ Not very much . ” # . NSg/R/C J/R NSg/I/J/R/Dq . . > # > This seemed to reassure him and he continued more confidently . # I/Ddem VP/J P VB ISg+ VB/C NPr/ISg+ VP/J NPr/I/J/R/Dq R . > # > “ I thought you didn’t , if you'll pardon my — you see , I carry on a little business # . ISg/#r+ N🅪Sg/VP ISgPl+ VXPt . NSg/C K NSg/VB D$+ . ISgPl+ NSg/VB . ISg/#r+ NSg/VB J/P D/P NPr/I/J/Dq N🅪Sg/J+ > on the side , a sort of side line , you understand . And I thought that if you # J/P D NSg/VB/J+ . D/P NSg/VB P NSg/VB/J+ NSg/VB+ . ISgPl+ VB . VB/C ISg/#r+ N🅪Sg/VP NSg/I/C/Ddem NSg/C ISgPl+ > don’t make very much — You’re selling bonds , aren’t you , old sport ? ” # VXB NSg/VB J/R NSg/I/J/R/Dq . K Nᴹ/Vg/J NPl/V3+ . VB ISgPl+ . NSg/J NSg/VB+ . . > # > “ Trying to . ” # . Nᴹ/Vg/J P . . > # > “ Well , this would interest you . It wouldn’t take up much of your time and you # . NSg/VB/J/R . I/Ddem+ VXB N🅪Sg/VB ISgPl+ . NPr/ISg+ VXB NSg/VB NSg/VB/J/P NSg/I/J/R/Dq P D$+ N🅪Sg/VB/J+ VB/C ISgPl+ > might pick up a nice bit of money . It happens to be a rather confidential sort # Nᴹ/VXB/J NSg/VB NSg/VB/J/P D/P NPr/J NSg/VPt P N🅪Sg/J+ . NPr/ISg+ V3 P NSg/VLXB D/P NPr/VB/J/R J NSg/VB > of thing . ” # P NSg+ . . > # > I realize now that under different circumstances that conversation might have # ISg/#r+ VB/Comm/NoAm NSg/J/R/C NSg/I/C/Ddem NSg/J/P NSg/J+ NPl/V3+ NSg/I/C/Ddem+ N🅪Sg/VB+ Nᴹ/VXB/J NSg/VXB > been one of the crises of my life . But , because the offer was obviously and # NSg/VLPp NSg/I/J P D NPl P D$+ N🅪Sg/VB+ . NSg/C/P . C/P D+ NSg/VB/JC+ VLPt R VB/C > tactlessly for a service to be rendered , I had no choice except to cut him off # R R/C/P D/P NSg/VB+ P NSg/VLXB VP/J . ISg/#r+ VP NSg/Dq/P N🅪Sg/J+ VB/C/P P NSg/VBP/J ISg+ NSg/VB/J/P > there . # R . > # > “ I’ve got my hands full , ” I said . “ I’m much obliged but I couldn’t take on any # . K VP D$+ NPl/V3+ NSg/VB/J . . ISg/#r+ VP/J . . K NSg/I/J/R/Dq VP/J NSg/C/P ISg/#r+ VXB NSg/VB J/P I/R/Dq > more work . ” # NPr/I/J/R/Dq N🅪Sg/VB+ . . > # > “ You wouldn’t have to do any business with Wolfshiem . ” Evidently he thought that # . ISgPl+ VXB NSg/VXB P VXB I/R/Dq N🅪Sg/J+ P ? . . R NPr/ISg+ N🅪Sg/VP NSg/I/C/Ddem > I was shying away from the “ gonnegtion ” mentioned at lunch , but I assured him he # ISg/#r+ VLPt Nᴹ/Vg/J VB/J P D . ? . VP/J NSg/P N🅪Sg/VB+ . NSg/C/P ISg/#r+ NSg/VP/J ISg+ NPr/ISg+ > was wrong . He waited a moment longer , hoping I’d begin a conversation , but I was # VLPt NSg/VB/J/R . NPr/ISg+ VP/J D/P+ NSg+ NSg/JC . Nᴹ/Vg/J K NSg/VB D/P+ N🅪Sg/VB+ . NSg/C/P ISg/#r+ VLPt > too absorbed to be responsive , so he went unwillingly home . # R VP/J P NSg/VLXB J . NSg/I/J/R/C NPr/ISg+ NSg/VPt R NSg/VB/J+ . > # > The evening had made me light - headed and happy ; I think I walked into a deep # D+ N🅪Sg/Vg/J+ VP VP NPr/ISg+ N🅪Sg/VB/J+ . VP/J VB/C NSg/VB/J . ISg/#r+ NSg/VB ISg/#r+ VP/J P D/P+ NSg/J+ > sleep as I entered my front door . So I don’t know whether or not Gatsby went to # N🅪Sg/VB+ R/C/P ISg/#r+ VP/J D$+ NSg/VB/J+ NSg/VB+ . NSg/I/J/R/C ISg/#r+ VXB VB I/C NPr/C NSg/R/C NPr NSg/VPt P > Coney Island , or for how many hours he “ glanced into rooms ” while his house # ? NSg/VB+ . NPr/C R/C/P NSg/C NSg/I/J/Dq NPl+ NPr/ISg+ . VP/J P NPl/V3+ . NSg/VB/C/P ISg/D$+ NPr/VB+ > blazed gaudily on . I called up Daisy from the office next morning , and invited # VP/J R J/P . ISg/#r+ VP/J NSg/VB/J/P NPr+ P D+ NSg/VB+ NSg/J/P+ N🅪Sg/Vg/J+ . VB/C NSg/VP/J > her to come to tea . # ISg/D$+ P NSg/VBPp/P P N🅪Sg/VB . > # > “ Don’t bring Tom , ” I warned her . # . VXB VB NPr/VB+ . . ISg/#r+ VP/J ISg/D$+ . > # > “ What ? ” # . NSg/I+ . . > # > “ Don’t bring Tom . ” # . VXB VB NPr/VB+ . . > # > “ Who is ‘ Tom ’ ? ” she asked innocently . # . NPr/I+ VL3 Unlintable NPr/VB+ . . . ISg+ VP/J R . > # > The day agreed upon was pouring rain . At eleven o’clock a man in a raincoat , # D+ NPr🅪Sg+ VP/J P VLPt Nᴹ/Vg/J N🅪Sg/VB+ . NSg/P NSg R D/P+ NPr/VB/J+ NPr/J/R/P D/P NSg . > dragging a lawn - mower , tapped at my front door and said that Mr . Gatsby had sent # NSg/Vg/J D/P NSg/VB+ . NSg . VP/J NSg/P D$+ NSg/VB/J+ NSg/VB+ VB/C VP/J NSg/I/C/Ddem NSg+ . NPr VP NSg/VP > him over to cut my grass . This reminded me that I had forgotten to tell my Finn # ISg+ NSg/J/P P NSg/VBP/J D$+ NPr🅪Sg/VB+ . I/Ddem VP/J NPr/ISg+ NSg/I/C/Ddem ISg/#r+ VP NSg/VPp/J P NPr/VB D$+ NPr+ > to come back , so I drove into West Egg Village to search for her among soggy # P NSg/VBPp/P NSg/VB/J . NSg/I/J/R/C ISg/#r+ NSg/VPt P NPr/VB/J+ N🅪Sg/VB+ NSg+ P N🅪Sg/VB R/C/P ISg/D$+ P J > whitewashed alleys and to buy some cups and lemons and flowers . # VP/J NPl VB/C P NSg/VB I/J/R/Dq NPl/V3 VB/C NPl/V3 VB/C NPrPl/V3+ . > # > The flowers were unnecessary , for at two o’clock a greenhouse arrived from # D+ NPrPl/V3+ NSg/VLPt J . R/C/P NSg/P NSg R D/P NSg/VB+ VP/J P > Gatsby’s , with innumerable receptacles to contain it . An hour later the front # NPr$ . P J NPl P VB NPr/ISg+ . D/P+ NSg+ JC D+ NSg/VB/J+ > door opened nervously , and Gatsby , in a white flannel suit , silver shirt , and # NSg/VB+ VP/J R . VB/C NPr . NPr/J/R/P D/P NPr🅪Sg/VB/J NSg/VB/J+ NSg/VB+ . Nᴹ/VB/J+ NSg/VB+ . VB/C > gold - colored tie , hurried in . He was pale , and there were dark signs of # Nᴹ/VB/J+ . NSg/VP/J/Am NSg/VB+ . VP/J NPr/J/R/P . NPr/ISg+ VLPt NSg/VB/J . VB/C R+ NSg/VLPt NSg/VB/J NPl/V3 P > sleeplessness beneath his eyes . # NSg P ISg/D$+ NPl/V3+ . > # > “ Is everything all right ? ” he asked immediately . # . VL3 NSg/I/VB+ NSg/I/J/C/Dq NPr/VB/J . . NPr/ISg+ VP/J R . > # > “ The grass looks fine , if that’s what you mean . ” # . D+ NPr🅪Sg/VB+ NPl/V3 NSg/VB/J . NSg/C NSg$ NSg/I+ ISgPl+ NSg/VB/J . . > # > “ What grass ? ” he inquired blankly . “ Oh , the grass in the yard . ” He looked out # . NSg/I+ NPr🅪Sg/VB+ . . NPr/ISg+ VP/J R . . NPr/VB . D NPr🅪Sg/VB NPr/J/R/P D+ NSg/VB+ . . NPr/ISg+ VP/J NSg/VB/J/R/P > the window at it , but , judging from his expression , I don’t believe he saw a # D+ NSg/VB+ NSg/P NPr/ISg+ . NSg/C/P . Nᴹ/Vg/J P ISg/D$+ N🅪Sg+ . ISg/#r+ VXB VB NPr/ISg+ NSg/VPt D/P > thing . # NSg+ . > # > “ Looks very good , ” he remarked vaguely . “ One of the papers said they thought the # . NPl/V3 J/R NPr/VB/J . . NPr/ISg+ VP/J R . . NSg/I/J P D+ NPl/V3+ VP/J IPl+ N🅪Sg/VP D+ > rain would stop about four . I think it was The Journal . Have you got everything # N🅪Sg/VB+ VXB NSg/VB J/P NSg . ISg/#r+ NSg/VB NPr/ISg+ VLPt D+ NSg/VB/J . NSg/VXB ISgPl+ VP NSg/I/VB+ > you need in the shape of — of tea ? ” # ISgPl+ N🅪Sg/VXB NPr/J/R/P D N🅪Sg/VB P . P N🅪Sg/VB+ . . > # > I took him into the pantry , where he looked a little reproachfully at the Finn . # ISg/#r+ VPt ISg+ P D+ NSg+ . NSg/R/C NPr/ISg+ VP/J D/P NPr/I/J/Dq R NSg/P D+ NPr+ . > Together we scrutinized the twelve lemon cakes from the delicatessen shop . # J IPl+ VP/J D NSg N🅪Sg/VB/J+ NPl/V3+ P D NSg NSg/VB+ . > # > “ Will they do ? ” I asked . # . NPr/VXB IPl+ VXB . . ISg/#r+ VP/J . > # > “ Of course , of course ! They’re fine ! ” and he added hollowly , “ . . . old sport . ” # . P NSg/VB+ . P NSg/VB+ . K NSg/VB/J . . VB/C NPr/ISg+ VP/J R . . . . . NSg/J+ NSg/VB+ . . > # > The rain cooled about half - past three to a damp mist , through which occasional # D+ N🅪Sg/VB+ VP/J J/P N🅪Sg/J/P+ . NSg/VB/J/P NSg P D/P+ Nᴹ/VB/J+ N🅪Sg/VB+ . NSg/J/P I/C+ NSg/J+ > thin drops swam like dew . Gatsby looked with vacant eyes through a copy of # NSg/VB/J+ NPl/V3+ VPt NSg/VB/J/C/P N🅪Sg/VB+ . NPr VP/J P J NPl/V3+ NSg/J/P D/P NSg/VB P > Clay’s “ Economics , ” starting at the Finnish tread that shook the kitchen floor , # NPr$ . Nᴹ+ . . Nᴹ/Vg/J NSg/P D NSg/J+ NSg/VB NSg/I/C/Ddem+ NSg/VPt/J D NSg/VB+ NSg/VB+ . > and peering toward the bleared windows from time to time as if a series of # VB/C Nᴹ/Vg/J J/P D ? NPrPl/V3+ P N🅪Sg/VB/J+ P N🅪Sg/VB/J R/C/P NSg/C D/P NSgPl+ P > invisible but alarming happenings were taking place outside . Finally he got up # J NSg/C/P Nᴹ/Vg/J NPl/V3 NSg/VLPt NSg/Vg/J N🅪Sg/VB Nᴹ/VB/J/P . R NPr/ISg+ VP NSg/VB/J/P > and informed me , in an uncertain voice , that he was going home . # VB/C VP/J NPr/ISg+ . NPr/J/R/P D/P+ I/J+ NSg/VB+ . NSg/I/C/Ddem NPr/ISg+ VLPt Nᴹ/Vg/J NSg/VB/J+ . > # > “ Why’s that ? ” # . NSg$ NSg/I/C/Ddem+ . . > # > “ Nobody’s coming to tea . It’s too late ! ” He looked at his watch as if there was # . NSg$ Nᴹ/Vg/J P N🅪Sg/VB . K R NSg/J . . NPr/ISg+ VP/J NSg/P ISg/D$+ NSg/VB R/C/P NSg/C R+ VLPt > some pressing demand on his time elsewhere . “ I can’t wait all day . ” # I/J/R/Dq Nᴹ/Vg/J N🅪Sg/VB+ J/P ISg/D$+ N🅪Sg/VB/J+ NSg . . ISg/#r+ VXB NSg/VB NSg/I/J/C/Dq NPr🅪Sg+ . . > # > “ Don’t be silly ; it’s just two minutes to four . ” # . VXB NSg/VLXB NSg/J . K J/R NSg NPl/V3+ P NSg . . > # > He sat down miserably , as if I had pushed him , and simultaneously there was the # NPr/ISg+ NSg/VP/J N🅪Sg/VB/J/P R . R/C/P NSg/C ISg/#r+ VP VP/J ISg+ . VB/C R R+ VLPt D > sound of a motor turning into my lane . We both jumped up , and , a little harrowed # N🅪Sg/VB/J P D/P+ NSg/VB/J+ Nᴹ/Vg/J P D$+ NPr+ . IPl+ I/C/Dq VP/J NSg/VB/J/P . VB/C . D/P NPr/I/J/Dq VP/J > myself , I went out into the yard . # ISg+ . ISg/#r+ NSg/VPt NSg/VB/J/R/P P D NSg/VB+ . > # > Under the dripping bare lilac - trees a large open car was coming up the drive . It # NSg/J/P D NSg/Vg NSg/VB/J N🅪Sg/J . NPl/V3+ D/P NSg/J NSg/VB/J NSg+ VLPt Nᴹ/Vg/J NSg/VB/J/P D N🅪Sg/VB+ . NPr/ISg+ > stopped . Daisy’s face , tipped sideways beneath a three - cornered lavender hat , # VP/J . NPr$ NSg/VB+ . VP NSg/J P D/P NSg . VP/J Nᴹ/VB/J NSg/VB+ . > looked out at me with a bright ecstatic smile . # VP/J NSg/VB/J/R/P NSg/P NPr/ISg+ P D/P NPr/VB/J NSg/J NSg/VB+ . > # > “ Is this absolutely where you live , my dearest one ? ” # . VL3 I/Ddem R NSg/R/C ISgPl+ VB/J . D$+ NSg/JS NSg/I/J . . > # > The exhilarating ripple of her voice was a wild tonic in the rain . I had to # D Nᴹ/Vg/J NSg/VB P ISg/D$+ NSg/VB+ VLPt D/P NSg/VB/J N🅪Sg/VB/J NPr/J/R/P D N🅪Sg/VB+ . ISg/#r+ VP P > follow the sound of it for a moment , up and down , with my ear alone , before any # NSg/VB D N🅪Sg/VB/J P NPr/ISg+ R/C/P D/P+ NSg+ . NSg/VB/J/P VB/C N🅪Sg/VB/J/P . P D$+ NSg/VB/J+ J . C/P I/R/Dq+ > words came through . A damp streak of hair lay like a dash of blue paint across # NPl/V3+ NSg/VPt/P NSg/J/P . D/P Nᴹ/VB/J NSg/VB P N🅪Sg/VB+ NSg/VBPt/J NSg/VB/J/C/P D/P NSg/VB P N🅪Sg/VB/J+ N🅪Sg/VB+ NSg/P > her cheek , and her hand was wet with glistening drops as I took it to help her # ISg/D$+ NSg/VB+ . VB/C ISg/D$+ NSg/VB+ VLPt NSg/VP/J P Nᴹ/Vg/J NPl/V3+ R/C/P ISg/#r+ VPt NPr/ISg+ P NSg/VB ISg/D$+ > from the car . # P D+ NSg+ . > # > “ Are you in love with me , ” she said low in my ear , “ or why did I have to come # . VLB ISgPl+ NPr/J/R/P NPr🅪Sg/VB P NPr/ISg+ . . ISg+ VP/J NSg/VB/J/R NPr/J/R/P D$+ NSg/VB/J+ . . NPr/C NSg/VB VXPt ISg/#r+ NSg/VXB P NSg/VBPp/P > alone ? ” # J . . > # > “ That’s the secret of Castle Rackrent . Tell your chauffeur to go far away and # . NSg$ D NSg/VB/J P NSg/VB+ ? . NPr/VB D$+ NSg/VB P NSg/VB/J NSg/VB/J VB/J VB/C > spend an hour . ” # NSg/VB D/P NSg+ . . > # > “ Come back in an hour , Ferdie . ” Then in a grave murmur : “ His name is Ferdie . ” # . NSg/VBPp/P NSg/VB/J NPr/J/R/P D/P+ NSg+ . ? . . NSg/J/R/C NPr/J/R/P D/P+ NSg/VB/J+ NSg/VB . . ISg/D$+ NSg/VB+ VL3 ? . . > # > “ Does the gasoline affect his nose ? ” # . NPl/VX3 D Nᴹ NSg/VB ISg/D$+ NSg/VB+ . . > # > “ I don’t think so , ” she said innocently . “ Why ? ” # . ISg/#r+ VXB NSg/VB NSg/I/J/R/C . . ISg+ VP/J R . . NSg/VB . . > # > We went in . To my overwhelming surprise the living - room was deserted . # IPl+ NSg/VPt NPr/J/R/P . P D$+ Nᴹ/Vg/J+ NSg/VB+ D+ Nᴹ/Vg/J+ . N🅪Sg/VB/J+ VLPt VP/J . > # > “ Well , that’s funny , ” I exclaimed . # . NSg/VB/J/R . NSg$ NSg/J . . ISg/#r+ VP/J . > # > “ What’s funny ? ” # . K NSg/J . . > # > She turned her head as there was a light dignified knocking at the front door . I # ISg+ VP/J ISg/D$+ NPr/VB/J+ R/C/P R+ VLPt D/P+ N🅪Sg/VB/J+ VP/J Nᴹ/Vg/J NSg/P D NSg/VB/J+ NSg/VB+ . ISg/#r+ > went out and opened it . Gatsby , pale as death , with his hands plunged like # NSg/VPt NSg/VB/J/R/P VB/C VP/J NPr/ISg+ . NPr . NSg/VB/J R/C/P NPr🅪Sg+ . P ISg/D$+ NPl/V3+ VP/J NSg/VB/J/C/P > weights in his coat pockets , was standing in a puddle of water glaring # NPl/V3+ NPr/J/R/P ISg/D$+ NSg/VB+ NPl/V3+ . VLPt Nᴹ/Vg/J NPr/J/R/P D/P NSg/VB P N🅪Sg/VB+ Nᴹ/Vg/J > tragically into my eyes . # R P D$+ NPl/V3+ . > # > With his hands still in his coat pockets he stalked by me into the hall , turned # P ISg/D$+ NPl/V3+ NSg/VB/J/R NPr/J/R/P ISg/D$+ NSg/VB+ NPl/V3+ NPr/ISg+ VP/J NSg/P NPr/ISg+ P D+ NPr+ . VP/J > sharply as if he were on a wire , and disappeared into the living - room . It wasn’t # R R/C/P NSg/C NPr/ISg+ NSg/VLPt J/P D/P+ N🅪Sg/VB+ . VB/C VP/J P D+ Nᴹ/Vg/J+ . N🅪Sg/VB/J+ . NPr/ISg+ VPt > a bit funny . Aware of the loud beating of my own heart I pulled the door to # D/P NSg/VPt+ NSg/J . VB/J P D NSg/J Nᴹ/Vg/J P D$+ NSg/VB/J+ N🅪Sg/VB+ ISg/#r+ VP/J D+ NSg/VB+ P > against the increasing rain . # C/P D+ Nᴹ/Vg/J N🅪Sg/VB+ . > # > For half a minute there wasn’t a sound . Then from the living - room I heard a sort # R/C/P N🅪Sg/J/P+ D/P+ NSg/VB/J+ R+ VPt D/P+ N🅪Sg/VB/J+ . NSg/J/R/C P D+ Nᴹ/Vg/J+ . N🅪Sg/VB/J+ ISg/#r+ VP/J D/P NSg/VB > of choking murmur and part of a laugh , followed by Daisy’s voice on a clear # P Nᴹ/Vg/J NSg/VB VB/C NSg/VB/J P D/P NSg/VB+ . VP/J NSg/P NPr$ NSg/VB+ J/P D/P NSg/VB/J > artificial note : # J NSg/VB+ . > # > “ I certainly am awfully glad to see you again . ” # . ISg/#r+ R NPr/VLB/J R NSg/VB/J P NSg/VB ISgPl+ P . . > # > A pause ; it endured horribly . I had nothing to do in the hall , so I went into # D/P+ NSg/VB+ . NPr/ISg+ VP/J R . ISg/#r+ VP NSg/I/J+ P VXB NPr/J/R/P D+ NPr+ . NSg/I/J/R/C ISg/#r+ NSg/VPt P > the room . # D+ N🅪Sg/VB/J+ . > # > Gatsby , his hands still in his pockets , was reclining against the mantelpiece in # NPr . ISg/D$+ NPl/V3+ NSg/VB/J/R NPr/J/R/P ISg/D$+ NPl/V3+ . VLPt Nᴹ/Vg/J C/P D NSg+ NPr/J/R/P > a strained counterfeit of perfect ease , even of boredom . His head leaned back so # D/P VP/J NSg/VB/J P NSg/VB/J Nᴹ/VB+ . NSg/VB/J/R P NSg . ISg/D$+ NPr/VB/J+ VP/J NSg/VB/J NSg/I/J/R/C > far that it rested against the face of a defunct mantelpiece clock , and from # NSg/VB/J NSg/I/C/Ddem NPr/ISg+ VP/J C/P D NSg/VB P D/P+ NSg/VB/J+ NSg+ NSg/VB+ . VB/C P > this position his distraught eyes stared down at Daisy , who was sitting , # I/Ddem+ NSg/VB+ ISg/D$+ J NPl/V3+ VP/J N🅪Sg/VB/J/P NSg/P NPr+ . NPr/I+ VLPt NSg/Vg/J . > frightened but graceful , on the edge of a stiff chair . # VP/J NSg/C/P J . J/P D NSg/VB P D/P NSg/VB/J NSg/VB+ . > # > “ We've met before , ” muttered Gatsby . His eyes glanced momentarily at me , and his # . K VP C/P . . VP/J NPr . ISg/D$+ NPl/V3+ VP/J R NSg/P NPr/ISg+ . VB/C ISg/D$+ > lips parted with an abortive attempt at a laugh . Luckily the clock took this # NPl/V3+ VP/J P D/P NSg/J NSg/VB+ NSg/P D/P NSg/VB+ . R D+ NSg/VB+ VPt I/Ddem+ > moment to tilt dangerously at the pressure of his head , whereupon he turned and # NSg+ P NSg/VB R NSg/P D N🅪Sg/VB P ISg/D$+ NPr/VB/J+ . C NPr/ISg+ VP/J VB/C > caught it with trembling fingers , and set it back in place . Then he sat down , # VP/J NPr/ISg+ P Nᴹ/Vg/J NPl/V3+ . VB/C NPr/VBP/J NPr/ISg+ NSg/VB/J NPr/J/R/P N🅪Sg/VB+ . NSg/J/R/C NPr/ISg+ NSg/VP/J N🅪Sg/VB/J/P . > rigidly , his elbow on the arm of the sofa and his chin in his hand . # R . ISg/D$+ NSg/VB+ J/P D NSg/VB/J P D NSg/VB+ VB/C ISg/D$+ NPr/VB+ NPr/J/R/P ISg/D$+ NSg/VB+ . > # > “ I’m sorry about the clock , ” he said . # . K NSg/VB/J J/P D NSg/VB+ . . NPr/ISg+ VP/J . > # > My own face had now assumed a deep tropical burn . I couldn’t muster up a single # D$+ NSg/VB/J+ NSg/VB+ VP NSg/J/R/C VP/J D/P+ NSg/J+ NSg/J+ NSg/VB+ . ISg/#r+ VXB NSg/VB+ NSg/VB/J/P D/P NSg/VB/J > commonplace out of the thousand in my head . # NSg/VB/J NSg/VB/J/R/P P D NSg NPr/J/R/P D$+ NPr/VB/J+ . > # > “ It’s an old clock , ” I told them idiotically . # . K D/P+ NSg/J NSg/VB+ . . ISg/#r+ VP NSg/IPl+ R . > # > I think we all believed for a moment that it had smashed in pieces on the floor . # ISg/#r+ NSg/VB IPl+ NSg/I/J/C/Dq VP/J R/C/P D/P+ NSg+ NSg/I/C/Ddem+ NPr/ISg+ VP VP/J NPr/J/R/P NPl/V3+ J/P D+ NSg/VB+ . > # > “ We haven’t met for many years , ” said Daisy , her voice as matter - of - fact as it # . IPl+ VXB VP R/C/P NSg/I/J/Dq NPl+ . . VP/J NPr+ . ISg/D$+ NSg/VB+ R/C/P N🅪Sg/VB+ . P . NSg+ R/C/P NPr/ISg+ > could ever be . # NSg/VXB J/R NSg/VLXB . > # > “ Five years next November . ” # . NSg+ NPl+ NSg/J/P+ NPr+ . . > # > The automatic quality of Gatsby’s answer set us all back at least another # D NSg/J N🅪Sg/J P NPr$ NSg/VB+ NPr/VBP/J NPr/IPl+ NSg/I/J/C/Dq NSg/VB/J NSg/P NSg/J/Dq I/D > minute . I had them both on their feet with the desperate suggestion that they # NSg/VB/J+ . ISg/#r+ VP NSg/IPl+ I/C/Dq J/P D$+ NPl+ P D+ NSg/J+ N🅪Sg+ NSg/I/C/Ddem+ IPl+ > help me make tea in the kitchen when the demoniac Finn brought it in on a tray . # NSg/VB NPr/ISg+ NSg/VB N🅪Sg/VB+ NPr/J/R/P D+ NSg/VB+ NSg/I/C D NSg/J NPr+ VP NPr/ISg+ NPr/J/R/P J/P D/P NSg/VB+ . > # > Amid the welcome confusion of cups and cakes a certain physical decency # NSg/P D NSg/VB/J N🅪Sg/VB P NPl/V3+ VB/C NPl/V3 D/P I/J NSg/J NSg > established itself . Gatsby got himself into a shadow and , while Daisy and I # VP/J ISg+ . NPr VP ISg+ P D/P NSg/VB/J+ VB/C . NSg/VB/C/P NPr+ VB/C ISg/#r+ > talked , looked conscientiously from one to the other of us with tense , unhappy # VP/J . VP/J R P NSg/I/J P D NSg/VB/J P NPr/IPl+ P NSg/VB/J . NSg/VB/J > eyes . However , as calmness wasn’t an end in itself , I made an excuse at the # NPl/V3+ . C . R/C/P Nᴹ+ VPt D/P NSg/VB+ NPr/J/R/P ISg+ . ISg/#r+ VP D/P NSg/VB+ NSg/P D > first possible moment , and got to my feet . # NSg/J NSg/J NSg+ . VB/C VP P D$+ NPl+ . > # > “ Where are you going ? ” demanded Gatsby in immediate alarm . # . NSg/R/C VLB ISgPl+ Nᴹ/Vg/J . . VP/J NPr NPr/J/R/P J N🅪Sg/VB+ . > # > “ I’ll be back . ” # . K NSg/VLXB NSg/VB/J . . > # > “ I’ve got to speak to you about something before you go . ” # . K VP P NSg/VB P ISgPl+ J/P NSg/I/J+ C/P ISgPl+ NSg/VB/J . . > # > He followed me wildly into the kitchen , closed the door , and whispered : “ Oh , # NPr/ISg+ VP/J NPr/ISg+ R P D+ NSg/VB+ . VP/J D+ NSg/VB+ . VB/C VP/J . . NPr/VB . > God ! ” in a miserable way . # NPr/VB+ . . NPr/J/R/P D/P+ J+ NSg/J+ . > # > “ What’s the matter ? ” # . K D+ N🅪Sg/VB+ . . > # > “ This is a terrible mistake , ” he said , shaking his head from side to side , ‘ ‘ a # . I/Ddem+ VL3 D/P J NSg/VB . . NPr/ISg+ VP/J . Nᴹ/Vg/J ISg/D$+ NPr/VB/J+ P NSg/VB/J+ P NSg/VB/J . Unlintable Unlintable D/P > terrible , terrible mistake . ” # J . J+ NSg/VB+ . . > # > “ You’re just embarrassed , that’s all , ” and luckily I added : “ Daisy’s embarrassed # . K J/R VP/J . NSg$ NSg/I/J/C/Dq . . VB/C R ISg/#r+ VP/J . . NPr$ VP/J > too . ” # R . . > # > “ She’s embarrassed ? ” he repeated incredulously . # . K VP/J . . NPr/ISg+ VP/J R . > # > “ Just as much as you are . ” # . J/R R/C/P NSg/I/J/R/Dq R/C/P ISgPl+ VLB . . > # > “ Don’t talk so loud . ” # . VXB N🅪Sg/VB NSg/I/J/R/C NSg/J . . > # > “ You're acting like a little boy , ” I broke out impatiently . “ Not only that , but # . + Nᴹ/Vg/J NSg/VB/J/C/P D/P+ NPr/I/J/Dq+ NSg/VB+ . . ISg/#r+ NSg/VPt/J NSg/VB/J/R/P R . . NSg/R/C J/R/C NSg/I/C/Ddem+ . NSg/C/P > you’re rude . Daisy’s sitting in there all alone . ” # K J . NPr$ NSg/Vg/J NPr/J/R/P R+ NSg/I/J/C/Dq J . . > # > He raised his hand to stop my words , looked at me with unforgettable reproach , # NPr/ISg+ VP/J ISg/D$+ NSg/VB+ P NSg/VB D$+ NPl/V3+ . VP/J NSg/P NPr/ISg+ P J NSg/VB . > and , opening the door cautiously , went back into the other room . # VB/C . Nᴹ/Vg/J D NSg/VB+ R . NSg/VPt NSg/VB/J P D NSg/VB/J N🅪Sg/VB/J+ . > # > I walked out the back way — just as Gatsby had when he had made his nervous # ISg/#r+ VP/J NSg/VB/J/R/P D+ NSg/VB/J+ NSg/J+ . J/R R/C/P NPr VP NSg/I/C NPr/ISg+ VP VP ISg/D$+ J > circuit of the house half an hour before — and ran for a huge black knotted tree , # NSg/VB P D NPr/VB+ N🅪Sg/J/P+ D/P NSg+ C/P . VB/C NSg/VPt R/C/P D/P J N🅪Sg/VB/J VP/J NSg/VB+ . > whose massed leaves made a fabric against the rain . Once more it was pouring , # I+ VP/J NPl/V3+ VP D/P N🅪Sg/VB+ C/P D N🅪Sg/VB+ . NSg/C NPr/I/J/R/Dq NPr/ISg+ VLPt Nᴹ/Vg/J . > and my irregular lawn , well - shaved by Gatsby’s gardener , abounded in small muddy # VB/C D$+ NSg/J NSg/VB+ . NSg/VB/J/R . VP/J NSg/P NPr$ NSg/JC . VP/J NPr/J/R/P NPr/VB/J NSg/VB/J > swamps and prehistoric marshes . There was nothing to look at from under the tree # NPl/V3 VB/C J NPl+ . R+ VLPt NSg/I/J+ P NSg/VB NSg/P P NSg/J/P D+ NSg/VB+ > except Gatsby’s enormous house , so I stared at it , like Kant at his church # VB/C/P NPr$ J+ NPr/VB+ . NSg/I/J/R/C ISg/#r+ VP/J NSg/P NPr/ISg+ . NSg/VB/J/C/P NPr+ NSg/P ISg/D$+ NPr🅪Sg/VB+ > steeple , for half an hour . A brewer had built it early in the “ period ” craze , a # NSg/VB . R/C/P N🅪Sg/J/P+ D/P NSg+ . D/P NPr VP VP/J NPr/ISg+ NSg/J/R NPr/J/R/P D . NSg/VB/J+ . NSg/VB . D/P > decade before , and there was a story that he’d agreed to pay five years ’ taxes # NSg+ C/P . VB/C R+ VLPt D/P NSg/VB+ NSg/I/C/Ddem+ K VP/J P NSg/VB/J NSg NPl+ . NPl/V3+ > on all the neighboring cottages if the owners would have their roofs thatched # J/P NSg/I/J/C/Dq D Nᴹ/Vg/J/Am NPl/V3+ NSg/C D NPl+ VXB NSg/VXB D$+ NPl/V3+ VP/J > with straw . Perhaps their refusal took the heart out of his plan to Found a # P N🅪Sg/VB/J+ . NSg/R D$+ NSg+ VPt D+ N🅪Sg/VB+ NSg/VB/J/R/P P ISg/D$+ NSg/VB+ P NSg/VP D/P+ > Family — he went into an immediate decline . His children sold his house with the # N🅪Sg/J+ . NPr/ISg+ NSg/VPt P D/P+ J+ NSg/VB+ . ISg/D$+ NPl+ NSg/VP ISg/D$+ NPr/VB+ P D > black wreath still on the door . Americans , while willing , even eager , to be # N🅪Sg/VB/J NSg/VB NSg/VB/J/R J/P D NSg/VB+ . NPrPl+ . NSg/VB/C/P NSg/Vg/J . NSg/VB/J/R NSg/VB/J . P NSg/VLXB > serfs , have always been obstinate about being peasantry . # NPl . NSg/VXB R NSg/VLPp J J/P N🅪Sg/VLg/J/C N🅪Sg . > # > After half an hour , the sun shone again , and the grocer’s automobile rounded # P N🅪Sg/J/P+ D/P+ NSg+ . D+ NPr/VB+ VB P . VB/C D NSg$ NSg/VB/J VP/J > Gatsby’s drive with the raw material for his servants ’ dinner — I felt sure he # NPr$ N🅪Sg/VB P D NSg/VB/J N🅪Sg/VB/J+ R/C/P ISg/D$+ NPl/V3+ . N🅪Sg/VB+ . ISg/#r+ N🅪Sg/VP/J J NPr/ISg+ > wouldn’t eat a spoonful . A maid began opening the upper windows of his house , # VXB VB D/P NSg . D/P+ NSg+ VPt Nᴹ/Vg/J D NSg/J NPrPl/V3 P ISg/D$+ NPr/VB+ . > appeared momentarily in each , and , leaning from the large central bay , spat # VP/J R NPr/J/R/P Dq . VB/C . Nᴹ/Vg/J P D NSg/J NPr/J NSg/VB/J+ . NSg/VB > meditatively into the garden . It was time I went back . While the rain continued # R P D NSg/VB/J+ . NPr/ISg+ VLPt N🅪Sg/VB/J ISg/#r+ NSg/VPt NSg/VB/J . NSg/VB/C/P D+ N🅪Sg/VB+ VP/J > it had seemed like the murmur of their voices , rising and swelling a little now # NPr/ISg+ VP VP/J NSg/VB/J/C/P D NSg/VB P D$+ NPl/V3+ . Nᴹ/Vg/J/P VB/C Nᴹ/Vg/J D/P NPr/I/J/Dq NSg/J/R/C > and then with gusts of emotion . But in the new silence I felt that silence had # VB/C NSg/J/R/C P NPl/V3 P N🅪Sg+ . NSg/C/P NPr/J/R/P D+ NSg/J+ NSg/VB+ ISg/#r+ N🅪Sg/VP/J NSg/I/C/Ddem NSg/VB+ VP > fallen within the house too . # VPp/J NSg/J/P D+ NPr/VB+ R . > # > I went in — after making every possible noise in the kitchen , short of pushing # ISg/#r+ NSg/VPt NPr/J/R/P . P Nᴹ/Vg/J Dq+ NSg/J N🅪Sg/VB+ NPr/J/R/P D+ NSg/VB+ . NPr/VB/J/P P Nᴹ/Vg/J > over the stove — but I don’t believe they heard a sound . They were sitting at # NSg/J/P D+ NSg/VB+ . NSg/C/P ISg/#r+ VXB VB IPl+ VP/J D/P N🅪Sg/VB/J+ . IPl+ NSg/VLPt NSg/Vg/J NSg/P > either end of the couch , looking at each other as if some question had been # I/C NSg/VB P D+ NSg/VB+ . Nᴹ/Vg/J NSg/P Dq NSg/VB/J R/C/P NSg/C I/J/R/Dq+ NSg/VB+ VP NSg/VLPp > asked , or was in the air , and every vestige of embarrassment was gone . Daisy’s # VP/J . NPr/C VLPt NPr/J/R/P D+ N🅪Sg/VB+ . VB/C Dq NSg P N🅪Sg+ VLPt VPp/J/P . NPr$ > face was smeared with tears , and when I came in she jumped up and began wiping # NSg/VB+ VLPt VP/J P NPl/V3+ . VB/C NSg/I/C ISg/#r+ NSg/VPt/P NPr/J/R/P ISg+ VP/J NSg/VB/J/P VB/C VPt Nᴹ/Vg/J > at it with her handkerchief before a mirror . But there was a change in Gatsby # NSg/P NPr/ISg+ P ISg/D$+ NSg+ C/P D/P NSg/VB+ . NSg/C/P R+ VLPt D/P+ N🅪Sg/VB+ NPr/J/R/P NPr > that was simply confounding . He literally glowed ; without a word or a gesture of # NSg/I/C/Ddem+ VLPt R Nᴹ/Vg/J . NPr/ISg+ R VP/J . C/P D/P NSg/VB+ NPr/C D/P NSg/VB P > exultation a new well - being radiated from him and filled the little room . # NSg D/P NSg/J NSg/VB/J/R . N🅪Sg/VLg/J/C VP/J P ISg+ VB/C VP/J D NPr/I/J/Dq N🅪Sg/VB/J+ . > # > “ Oh , hello , old sport , ” he said , as if he hadn’t seen me for years . I thought # . NPr/VB . NSg/VB . NSg/J+ NSg/VB+ . . NPr/ISg+ VP/J . R/C/P NSg/C NPr/ISg+ VPt NSg/VPp NPr/ISg+ R/C/P NPl+ . ISg/#r+ N🅪Sg/VP > for a moment he was going to shake hands . # R/C/P D/P+ NSg+ NPr/ISg+ VLPt Nᴹ/Vg/J P NSg/VB NPl/V3+ . > # > “ It’s stopped raining . ” # . K VP/J Nᴹ/Vg/J . . > # > “ Has it ? ” When he realized what I was talking about , that there were # . V3 NPr/ISg+ . . NSg/I/C NPr/ISg+ VP/J/Comm/NoAm NSg/I+ ISg/#r+ VLPt Nᴹ/Vg/J J/P . NSg/I/C/Ddem R+ NSg/VLPt > twinkle - bells of sunshine in the room , he smiled like a weather man , like an # NSg/VB . NPl/V3 P Nᴹ/J+ NPr/J/R/P D N🅪Sg/VB/J+ . NPr/ISg+ VP/J NSg/VB/J/C/P D/P Nᴹ/VB/J+ NPr/VB/J+ . NSg/VB/J/C/P D/P > ecstatic patron of recurrent light , and repeated the news to Daisy . “ What do you # NSg/J NSg/VB P NSg/J N🅪Sg/VB/J+ . VB/C VP/J D Nᴹ/VB+ P NPr . . NSg/I+ VXB ISgPl+ > think of that ? It’s stopped raining . ” # NSg/VB P NSg/I/C/Ddem+ . K VP/J Nᴹ/Vg/J . . > # > “ I’m glad , Jay . ” Her throat , full of aching , grieving beauty , told only of her # . K NSg/VB/J . NPr+ . . ISg/D$+ NSg/VB+ . NSg/VB/J P Nᴹ/Vg/J . Nᴹ/Vg/J N🅪Sg/VB/J+ . VP J/R/C P ISg/D$+ > unexpected joy . # NSg/J+ NPr🅪Sg/VB+ . > # > “ I want you and Daisy to come over to my house , ” ’ he said , “ ‘ I’d like to show # . ISg/#r+ NSg/VB ISgPl+ VB/C NPr+ P NSg/VBPp/P NSg/J/P P D$+ NPr/VB+ . . . NPr/ISg+ VP/J . . Unlintable K NSg/VB/J/C/P P NSg/VB > her around . ” # ISg/D$+ J/P . . > # > “ You’re sure you want me to come ? ” # . K J ISgPl+ NSg/VB NPr/ISg+ P NSg/VBPp/P . . > # > “ Absolutely , old sport . ” # . R . NSg/J+ NSg/VB+ . . > # > Daisy went up - stairs to wash her face — too late I thought with humiliation of my # NPr+ NSg/VPt NSg/VB/J/P . NPl+ P NPr/VB ISg/D$+ NSg/VB+ . R NSg/J ISg/#r+ N🅪Sg/VP P NSg P D$+ > towels — while Gatsby and I waited on the lawn . # NPl/V3+ . NSg/VB/C/P NPr VB/C ISg/#r+ VP/J J/P D NSg/VB+ . > # > “ My house looks well , doesn’t it ? ” he demanded . “ See how the whole front of it # . D$+ NPr/VB+ NPl/V3 NSg/VB/J/R . VX3 NPr/ISg+ . . NPr/ISg+ VP/J . . NSg/VB NSg/C D NSg/J NSg/VB/J P NPr/ISg+ > catches the light . ” # NPl/V3 D+ N🅪Sg/VB/J+ . . > # > I agreed that it was splendid . # ISg/#r+ VP/J NSg/I/C/Ddem NPr/ISg+ VLPt J . > # > “ Yes . ” His eyes went over it , every arched door and square tower . “ It took me # . NPl/VB . . ISg/D$+ NPl/V3+ NSg/VPt NSg/J/P NPr/ISg+ . Dq VP/J NSg/VB VB/C NSg/VB/J+ NSg/VB+ . . NPr/ISg+ VPt NPr/ISg+ > just three years to earn the money that bought it . ” # J/R NSg NPl+ P NSg/VB D+ N🅪Sg/J+ NSg/I/C/Ddem+ NSg/VP NPr/ISg+ . . > # > “ I thought you inherited your money . ” # . ISg/#r+ N🅪Sg/VP ISgPl+ VP/J D$+ N🅪Sg/J+ . . > # > “ I did , old sport , ” he said automatically , “ but I lost most of it in the big # . ISg/#r+ VXPt . NSg/J+ NSg/VB+ . . NPr/ISg+ VP/J R . . NSg/C/P ISg/#r+ VP/J NSg/I/J/R/Dq P NPr/ISg+ NPr/J/R/P D+ NSg/J+ > panic — the panic of the war . ” # N🅪Sg/VB/J+ . D N🅪Sg/VB/J P D+ N🅪Sg/VB+ . . > # > I think he hardly knew what he was saying , for when I asked him what business he # ISg/#r+ NSg/VB NPr/ISg+ R VPt NSg/I+ NPr/ISg+ VLPt N🅪Sg/Vg/J . R/C/P NSg/I/C ISg/#r+ VP/J ISg+ NSg/I+ N🅪Sg/J+ NPr/ISg+ > was in he answered : ‘ ‘ That’s my affair , ” before he realized that it wasn’t an # VLPt NPr/J/R/P NPr/ISg+ VP/J . Unlintable Unlintable NSg$ D$+ NSg+ . . C/P NPr/ISg+ VP/J/Comm/NoAm NSg/I/C/Ddem NPr/ISg+ VPt D/P > appropriate reply . # VB/J NSg/VB+ . > # > “ Oh , I’ve been in several things , ” he corrected himself . “ I was in the drug # . NPr/VB . K NSg/VLPp NPr/J/R/P J/Dq NPl+ . . NPr/ISg+ VP/J ISg+ . . ISg/#r+ VLPt NPr/J/R/P D+ NSg/VB+ > business and then I was in the oil business . But I’m not in either one now . ” He # N🅪Sg/J+ VB/C NSg/J/R/C ISg/#r+ VLPt NPr/J/R/P D+ N🅪Sg/VB+ N🅪Sg/J+ . NSg/C/P K NSg/R/C NPr/J/R/P I/C NSg/I/J NSg/J/R/C . . NPr/ISg+ > looked at me with more attention . “ Do you mean you’ve been thinking over what I # VP/J NSg/P NPr/ISg+ P NPr/I/J/R/Dq+ NSg+ . . VXB ISgPl+ NSg/VB/J K NSg/VLPp Nᴹ/Vg/J NSg/J/P NSg/I+ ISg/#r+ > proposed the other night ? ” # VP/J D NSg/VB/J N🅪Sg/VB+ . . > # > Before I could answer , Daisy came out of the house and two rows of brass buttons # C/P ISg/#r+ NSg/VXB NSg/VB+ . NPr+ NSg/VPt/P NSg/VB/J/R/P P D NPr/VB+ VB/C NSg NPl/V3 P N🅪Sg/VB/J+ NPl/V3+ > on her dress gleamed in the sunlight . # J/P ISg/D$+ NSg/VB+ VP/J NPr/J/R/P D NSg/VB+ . > # > “ That huge place there ? ” she cried pointing . # . NSg/I/C/Ddem+ J+ N🅪Sg/VB+ R . . ISg+ VP/J Nᴹ/Vg/J . > # > “ Do you like it ? ” # . VXB ISgPl+ NSg/VB/J/C/P NPr/ISg+ . . > # > “ I love it , but I don’t see how you live there all alone . ” # . ISg/#r+ NPr🅪Sg/VB NPr/ISg+ . NSg/C/P ISg/#r+ VXB NSg/VB NSg/C ISgPl+ VB/J R+ NSg/I/J/C/Dq J . . > # > “ I keep it always full of interesting people , night and day . People who do # . ISg/#r+ NSg/VB NPr/ISg+ R NSg/VB/J P Vg/J NPl/VB+ . N🅪Sg/VB VB/C NPr🅪Sg+ . NPl/VB+ NPr/I+ VXB > interesting things . Celebrated people . ” # Vg/J+ NPl+ . VP/J NPl/VB+ . . > # > Instead of taking the short cut along the Sound we went down to the road and # R P NSg/Vg/J D NPr/VB/J/P NSg/VBP/J P D+ N🅪Sg/VB/J+ IPl+ NSg/VPt N🅪Sg/VB/J/P P D+ N🅪Sg/J+ VB/C > entered by the big postern . With enchanting murmurs Daisy admired this aspect or # VP/J NSg/P D NSg/J ? . P Nᴹ/Vg/J NPl/V3 NPr+ VP/J I/Ddem N🅪Sg/VB+ NPr/C > that of the feudal silhouette against the sky , admired the gardens , the # NSg/I/C/Ddem P D J NSg/VB+ C/P D N🅪Sg/VB+ . VP/J D NPl/V3+ . D > sparkling odor of jonquils and the frothy odor of hawthorn and plum blossoms and # Nᴹ/Vg/J N🅪Sg/Am P NPl VB/C D NSg/J N🅪Sg/Am P N🅪Sg VB/C N🅪Sg/VB/J+ NPl/V3 VB/C > the pale gold odor of kiss - me - at - the - gate . It was strange to reach the marble # D NSg/VB/J Nᴹ/VB/J+ N🅪Sg/Am P NSg/VB+ . NPr/ISg+ . NSg/P . D . NSg/VB+ . NPr/ISg+ VLPt NSg/VB/J P NSg/VB D+ NSg/VB/J+ > steps and find no stir of bright dresses in and out the door , and hear no sound # NPl/V3+ VB/C NSg/VB NSg/Dq/P NSg/VB P NPr/VB/J NPl/V3+ NPr/J/R/P VB/C NSg/VB/J/R/P D+ NSg/VB+ . VB/C VB NSg/Dq/P N🅪Sg/VB/J+ > but bird voices in the trees . # NSg/C/P NPr/VB/J+ NPl/V3+ NPr/J/R/P D+ NPl/V3+ . > # > And inside , as we wandered through Marie Antoinette music - rooms and Restoration # VB/C NSg/J/P . R/C/P IPl+ VP/J NSg/J/P NPr+ NPr N🅪Sg/VB/J+ . NPl/V3 VB/C NPr🅪Sg+ > Salons , I felt that there were guests concealed behind every couch and table , # NPl+ . ISg/#r+ N🅪Sg/VP/J NSg/I/C/Ddem R+ NSg/VLPt NPl/V3+ VP/J NSg/J/P Dq NSg/VB VB/C NSg/VB+ . > under orders to be breathlessly silent until we had passed through . As Gatsby # NSg/J/P NPl/V3+ P NSg/VLXB R NSg/J C/P IPl+ VP VP/J NSg/J/P . R/C/P NPr > closed the door of ‘ ‘ the Merton College Library ” I could have sworn I heard the # VP/J D NSg/VB P Unlintable Unlintable D NPr NSg+ NSg+ . ISg/#r+ NSg/VXB NSg/VXB VB/J ISg/#r+ VP/J D > owl - eyed man break into ghostly laughter . # NSg/VB+ . VP/J NPr/VB/J+ NSg/VB+ P J/R Nᴹ+ . > # > We went up - stairs , through period bedrooms swathed in rose and lavender silk and # IPl+ NSg/VPt NSg/VB/J/P . NPl+ . NSg/J/P NSg/VB/J+ NPl+ J/Am NPr/J/R/P NPr/VPt/J VB/C Nᴹ/VB/J N🅪Sg/VB+ VB/C > vivid with new flowers , through dressing - rooms and poolrooms , and bathrooms with # NSg/J P NSg/J NPrPl/V3+ . NSg/J/P Nᴹ/Vg/J+ . NPl/V3+ VB/C NPl . VB/C NPl/V3+ P > sunken baths — intruding into one chamber where a dishevelled man in pajamas was # VPp/J NSg/VB+ . Nᴹ/Vg/J P NSg/I/J NSg/VB+ NSg/R/C D/P VP/J/Comm NPr/VB/J+ NPr/J/R/P NPl VLPt > doing liver exercises on the floor . It was Mr . Klipspringer , the ‘ ‘ boarder . ” I # Nᴹ/Vg/J N🅪Sg/J+ NPl/V3+ J/P D NSg/VB+ . NPr/ISg+ VLPt NSg+ . ? . D Unlintable Unlintable NSg+ . . ISg/#r+ > had seen him wandering hungrily about the beach that morning . Finally we came to # VP NSg/VPp ISg+ Nᴹ/Vg/J R J/P D+ NPr/VB+ NSg/I/C/Ddem+ N🅪Sg/Vg/J+ . R IPl+ NSg/VPt/P P > Gatsby’s own apartment , a bedroom and a bath , and an Adam’s study , where we sat # NPr$ NSg/VB/J NSg+ . D/P NSg VB/C D/P NSg/VB+ . VB/C D/P NPr$ NSg/VB+ . NSg/R/C IPl+ NSg/VP/J > down and drank a glass of some Chartreuse he took from a cupboard in the wall . # N🅪Sg/VB/J/P VB/C NSg/VPt D/P NPr🅪Sg/VB P I/J/R/Dq NSg/J NPr/ISg+ VPt P D/P NSg/VB+ NPr/J/R/P D NPr/VB+ . > # > He hadn’t once ceased looking at Daisy , and I think he revalued everything in # NPr/ISg+ VPt NSg/C VP/J Nᴹ/Vg/J NSg/P NPr+ . VB/C ISg/#r+ NSg/VB NPr/ISg+ VP/J NSg/I/VB+ NPr/J/R/P > his house according to the measure of response it drew from her well - loved eyes . # ISg/D$+ NPr/VB+ Nᴹ/Vg/J P D NSg/VB P NSg+ NPr/ISg+ NPr/VPt P ISg/D$+ NSg/VB/J/R . VP/J NPl/V3+ . > Sometimes , too , he stared around at his possessions in a dazed way , as though in # R . R . NPr/ISg+ VP/J J/P NSg/P ISg/D$+ NPl/V3+ NPr/J/R/P D/P+ VP/J+ NSg/J+ . R/C/P C NPr/J/R/P > her actual and astounding presence none of it was any longer real . Once he # ISg/D$+ NSg/J VB/C Nᴹ/Vg/J N🅪Sg/VB+ NSg/I P NPr/ISg+ VLPt I/R/Dq NSg/JC NSg/J . NSg/C NPr/ISg+ > nearly toppled down a flight of stairs . # R VP/J N🅪Sg/VB/J/P D/P N🅪Sg/VB/J P NPl+ . > # > His bedroom was the simplest room of all — except where the dresser was garnished # ISg/D$+ NSg+ VLPt D JS N🅪Sg/VB/J P NSg/I/J/C/Dq . VB/C/P NSg/R/C D+ NSg+ VLPt VP/J > with a toilet set of pure dull gold . Daisy took the brush with delight , and # P D/P NSg/VB+ NPr/VBP/J P NSg/VB/J+ VB/J Nᴹ/VB/J+ . NPr+ VPt D NSg/VB P N🅪Sg/VB/J+ . VB/C > smoothed her hair , whereupon Gatsby sat down and shaded his eyes and began to # VP/J ISg/D$+ N🅪Sg/VB+ . C NPr NSg/VP/J N🅪Sg/VB/J/P VB/C J ISg/D$+ NPl/V3+ VB/C VPt P > laugh . # NSg/VB . > # > “ It’s the funniest thing , old sport , ” he said hilariously . “ I can’t — When I try # . K D JS NSg+ . NSg/J NSg/VB+ . . NPr/ISg+ VP/J R . . ISg/#r+ VXB . NSg/I/C ISg/#r+ NSg/VB/J > to — ” # P . . > # > He had passed visibly through two states and was entering upon a third . After # NPr/ISg+ VP VP/J R NSg/J/P NSg+ NPrPl/V3+ VB/C VLPt Nᴹ/Vg/J P D/P NSg/VB/J . P > his embarrassment and his unreasoning joy he was consumed with wonder at her # ISg/D$+ N🅪Sg+ VB/C ISg/D$+ J NPr🅪Sg/VB+ NPr/ISg+ VLPt VP/J P N🅪Sg/VB NSg/P ISg/D$+ > presence . He had been full of the idea so long , dreamed it right through to the # N🅪Sg/VB+ . NPr/ISg+ VP NSg/VLPp NSg/VB/J P D+ NSg+ NSg/I/J/R/C NPr/VB/J . VP/J/NoAm/Au NPr/ISg+ NPr/VB/J NSg/J/P P D+ > end , waited with his teeth set , so to speak , at an inconceivable pitch of # NSg/VB+ . VP/J P ISg/D$+ NPl+ NPr/VBP/J . NSg/I/J/R/C P NSg/VB . NSg/P D/P J NSg/VB/J P > intensity . Now , in the reaction , he was running down like an overwound clock . # Nᴹ+ . NSg/J/R/C . NPr/J/R/P D+ N🅪Sg/VB/J+ . NPr/ISg+ VLPt Nᴹ/Vg/J/P N🅪Sg/VB/J/P NSg/VB/J/C/P D/P VP/J NSg/VB+ . > # > Recovering himself in a minute he opened for us two hulking patent cabinets # Nᴹ/Vg/J ISg+ NPr/J/R/P D/P+ NSg/VB/J+ NPr/ISg+ VP/J R/C/P NPr/IPl+ NSg Nᴹ/Vg/J NSg/VB/J+ NPl+ > which held his massed suits and dressing - gowns and ties , and his shirts , piled # I/C+ VP ISg/D$+ VP/J NPl/V3 VB/C Nᴹ/Vg/J+ . NPl/V3 VB/C NPl/V3+ . VB/C ISg/D$+ NPl/V3+ . VP/J > like bricks in stacks a dozen high . # NSg/VB/J/C/P NPl/V3+ NPr/J/R/P NPl/V3+ D/P NSg NSg/VB/J/R . > # > “ I’ve got a man in England who buys me clothes . He sends over a selection of # . K VP D/P NPr/VB/J+ NPr/J/R/P NPr+ NPr/I+ NPl/V3 NPr/ISg+ NPl/V3+ . NPr/ISg+ NPl/V3 NSg/J/P D/P N🅪Sg P > things at the beginning of each season , spring and fall . ” # NPl+ NSg/P D NSg/Vg/J P Dq+ NSg/VB+ . N🅪Sg/VB VB/C N🅪Sg/VB+ . . > # > He took out a pile of shirts and began throwing them , one by one , before us , # NPr/ISg+ VPt NSg/VB/J/R/P D/P NSg/VB P NPl/V3+ VB/C VPt Nᴹ/Vg/J NSg/IPl+ . NSg/I/J NSg/P NSg/I/J . C/P NPr/IPl+ . > shirts of sheer linen and thick silk and fine flannel , which lost their folds as # NPl/V3 P NSg/VB/J N🅪Sg/J VB/C NSg/VB/J N🅪Sg/VB VB/C NSg/VB/J+ NSg/VB/J+ . I/C+ VP/J D$+ NPl/V3+ R/C/P > they fell and covered the table in many colored disarray . While we admired he # IPl+ NSg/VPt/J VB/C VP/J D+ NSg/VB+ NPr/J/R/P NSg/I/J/Dq NSg/VP/J/Am NSg/VB . NSg/VB/C/P IPl+ VP/J NPr/ISg+ > brought more and the soft rich heap mounted higher — shirts with stripes and # VP NPr/I/J/R/Dq VB/C D NSg/J NPr/VB/J+ NSg/VB+ VP/J NSg/JC . NPl/V3 P NPl/V3+ VB/C > scrolls and plaids in coral and applegreen and lavender and faint orange , with # NPl/V3 VB/C NPl/V3 NPr/J/R/P N🅪Sg/J VB/C ? VB/C Nᴹ/VB/J VB/C NSg/VB/J NPr🅪Sg/VB/J . P > monograms of Indian blue . Suddenly , with a strained sound , Daisy bent her head # NPl/V3 P NPr/J N🅪Sg/VB/J . R . P D/P VP/J N🅪Sg/VB/J+ . NPr+ NSg/VP/J ISg/D$+ NPr/VB/J+ > into the shirts and began to cry stormily . # P D NPl/V3+ VB/C VPt P NSg/VB R . > # > “ They’re such beautiful shirts , ” she sobbed , her voice muffled in the thick # . K NSg/I NSg/J NPl/V3+ . . ISg+ VP . ISg/D$+ NSg/VB+ VP/J NPr/J/R/P D NSg/VB/J > folds . “ It makes me sad because I’ve never seen such — such beautiful shirts # NPl/V3+ . . NPr/ISg+ NPl/V3 NPr/ISg+ NSg/VB/J C/P K R NSg/VPp NSg/I . NSg/I NSg/J NPl/V3+ > before . ” # C/P . . > # > After the house , we were to see the grounds and the swimming - pool , and the # P D+ NPr/VB+ . IPl+ NSg/VLPt P NSg/VB D NPl/V3 VB/C D NSg/Vg+ . NSg/VB+ . VB/C D > hydroplane and the midsummer flowers — but outside Gatsby’s window it began to # NSg/VB VB/C D NSg/J NPrPl/V3+ . NSg/C/P Nᴹ/VB/J/P NPr$ NSg/VB+ NPr/ISg+ VPt P > rain again , so we stood in a row looking at the corrugated surface of the Sound . # N🅪Sg/VB P . NSg/I/J/R/C IPl+ VP NPr/J/R/P D/P NSg/VB+ Nᴹ/Vg/J NSg/P D VP/J NSg/VB P D N🅪Sg/VB/J+ . > # > “ If it wasn’t for the mist we could see your home across the bay , ” said Gatsby . # . NSg/C NPr/ISg+ VPt R/C/P D N🅪Sg/VB+ IPl+ NSg/VXB NSg/VB D$+ NSg/VB/J+ NSg/P D NSg/VB/J+ . . VP/J NPr . > “ You always have a green light that burns all night at the end of your dock . ” # . ISgPl+ R NSg/VXB D/P+ NPr🅪Sg/VB/J+ N🅪Sg/VB/J+ NSg/I/C/Ddem+ NPrPl/V3 NSg/I/J/C/Dq N🅪Sg/VB+ NSg/P D NSg/VB P D$+ NSg/VB+ . . > # > Daisy put her arm through his abruptly , but he seemed absorbed in what he had # NPr+ NSg/VBP ISg/D$+ NSg/VB/J+ NSg/J/P ISg/D$+ R . NSg/C/P NPr/ISg+ VP/J VP/J NPr/J/R/P NSg/I+ NPr/ISg+ VP > just said . Possibly it had occurred to him that the colossal significance of # J/R VP/J . R NPr/ISg+ VP VP P ISg+ NSg/I/C/Ddem D J NSg P > that light had now vanished forever . Compared to the great distance that had # NSg/I/C/Ddem N🅪Sg/VB/J+ VP NSg/J/R/C VP/J NSg/J . VP/J P D+ NSg/J+ N🅪Sg/VB+ NSg/I/C/Ddem+ VP > separated him from Daisy it had seemed very near to her , almost touching her . It # VP/J ISg+ P NPr+ NPr/ISg+ VP VP/J J/R NSg/VB/J/P P ISg/D$+ . R Nᴹ/Vg/J/P ISg/D$+ . NPr/ISg+ > had seemed as close as a star to the moon . Now it was again a green light on a # VP VP/J R/C/P NSg/VB/J R/C/P D/P NSg/VB P D+ NPr/VB+ . NSg/J/R/C NPr/ISg+ VLPt P D/P NPr🅪Sg/VB/J N🅪Sg/VB/J J/P D/P+ > dock . His count of enchanted objects had diminished by one . # NSg/VB+ . ISg/D$+ NSg/VB P VP/J NPl/V3+ VP VP/J NSg/P NSg/I/J . > # > I began to walk about the room , examining various indefinite objects in the half # ISg/#r+ VPt P NSg/VB J/P D+ N🅪Sg/VB/J+ . Nᴹ/Vg/J J NSg/J NPl/V3 NPr/J/R/P D+ N🅪Sg/J/P+ > darkness . A large photograph of an elderly man in yachting costume attracted me , # Nᴹ+ . D/P NSg/J NSg/VB P D/P+ R+ NPr/VB/J+ NPr/J/R/P Nᴹ/Vg/J NSg/VB VP/J NPr/ISg+ . > hung on the wall over his desk . # NPr/VP/J J/P D NPr/VB+ NSg/J/P ISg/D$+ NSg/VB+ . > # > “ Who’s this ? ” # . NPr$ I/Ddem+ . . > # > “ That ? That’s Mr . Dan Cody , old sport . ” # . NSg/I/C/Ddem+ . NSg$ NSg+ . NPr+ NPr . NSg/J+ NSg/VB+ . . > # > The name sounded faintly familiar . # D+ NSg/VB+ VP/J R NSg/J . > # > “ He’s dead now . He used to be my best friend years ago . ” # . NPr$ NSg/VB/J NSg/J/R/C . NPr/ISg+ VP/J P NSg/VLXB D$+ NPr/VXB/JS+ NPr/VB/J+ NPl+ J/P . . > # > There was a small picture of Gatsby , also in yachting costume , on the # R+ VLPt D/P NPr/VB/J NSg/VB P NPr . R/C NPr/J/R/P Nᴹ/Vg/J NSg/VB . J/P D > bureau — Gatsby with his head thrown back defiantly — taken apparently when he was # NSg+ . NPr P ISg/D$+ NPr/VB/J+ VPp/J NSg/VB/J R . VPp/J R NSg/I/C NPr/ISg+ VLPt > about eighteen . # J/P NSg . > # > “ I adore it , ” exclaimed Daisy . “ The pompadour ! You never told me you had a # . ISg/#r+ VB NPr/ISg+ . . VP/J NPr+ . . D NSg/VB . ISgPl+ R VP NPr/ISg+ ISgPl+ VP D/P > pompadour — or a yacht . ” # NSg/VB . NPr/C D/P NSg/VB+ . . > # > “ Look at this , ” said Gatsby quickly . “ Here’s a lot of clippings — about you . ” # . NSg/VB NSg/P I/Ddem+ . . VP/J NPr R . . K D/P NPr/VB P NPl/V3+ . J/P ISgPl+ . . > # > They stood side by side examining it . I was going to ask to see the rubies when # IPl+ VP NSg/VB/J+ NSg/P NSg/VB/J+ Nᴹ/Vg/J NPr/ISg+ . ISg/#r+ VLPt Nᴹ/Vg/J P NSg/VB P NSg/VB D NPl/V3 NSg/I/C > the phone rang , and Gatsby took up the receiver . # D NSg/VB+ VPt . VB/C NPr VPt NSg/VB/J/P D NSg+ . > # > “ Yes . . . . Well , I can’t talk now . . . . I can’t talk now , old sport . . . . I # . NPl/VB . . . . NSg/VB/J/R . ISg/#r+ VXB N🅪Sg/VB NSg/J/R/C . . . . ISg/#r+ VXB N🅪Sg/VB NSg/J/R/C . NSg/J NSg/VB+ . . . . ISg/#r+ > said a small town . . . . He must know what a small town is . . . . Well , he’s no # VP/J D/P+ NPr/VB/J+ NSg+ . . . . NPr/ISg+ NSg/VXB VB NSg/I+ D/P+ NPr/VB/J+ NSg+ VL3 . . . . NSg/VB/J/R . NPr$ NSg/Dq/P > use to us if Detroit is his idea of a small town . . . . ” He rang off . # N🅪Sg/VB+ P NPr/IPl+ NSg/C NPr+ VL3 ISg/D$+ NSg P D/P NPr/VB/J NSg+ . . . . . NPr/ISg+ VPt NSg/VB/J/P . > # > “ Come here quick ! ” cried Daisy at the window . # . NSg/VBPp/P J/R NSg/VB/J . . VP/J NPr+ NSg/P D+ NSg/VB+ . > # > The rain was still falling , but the darkness had parted in the west , and there # D+ N🅪Sg/VB+ VLPt NSg/VB/J/R Nᴹ/Vg/J . NSg/C/P D+ Nᴹ+ VP VP/J NPr/J/R/P D+ NPr/VB/J+ . VB/C R+ > was a pink and golden billow of foamy clouds above the sea . # VLPt D/P N🅪Sg/VB/J VB/C NPr/VB/J NSg/VB P NSg/J NPl/V3+ NSg/J/P D NSg+ . > # > “ Look at that , ” she whispered , and then after a moment : “ I’d like to just get # . NSg/VB NSg/P NSg/I/C/Ddem+ . . ISg+ VP/J . VB/C NSg/J/R/C P D/P+ NSg+ . . K NSg/VB/J/C/P P J/R NSg/VB > one of those pink clouds and put you in it and push you around . ” # NSg/I/J P I/Ddem N🅪Sg/VB/J NPl/V3+ VB/C NSg/VBP ISgPl+ NPr/J/R/P NPr/ISg+ VB/C NSg/VB ISgPl+ J/P . . > # > I tried to go then , but they wouldn’t hear of it ; perhaps my presence made them # ISg/#r+ VP/J P NSg/VB/J NSg/J/R/C . NSg/C/P IPl+ VXB VB P NPr/ISg+ . NSg/R D$+ N🅪Sg/VB+ VP NSg/IPl+ > feel more satisfactorily alone . # NSg/I/VB NPr/I/J/R/Dq R J . > # > “ I know what we'll do , ” said Gatsby , “ we'll have Klipspringer play the piano . ” # . ISg/#r+ VB NSg/I+ K VXB . . VP/J NPr . . K NSg/VXB ? N🅪Sg/VB D NSg/VB/J+ . . > # > He went out of the room calling “ Ewing ! ” and returned in a few minutes # NPr/ISg+ NSg/VPt NSg/VB/J/R/P P D+ N🅪Sg/VB/J+ Nᴹ/Vg/J . NPr . . VB/C VP/J NPr/J/R/P D/P+ NSg/I/Dq+ NPl/V3+ > accompanied by an embarrassed , slightly worn young man , with shell - rimmed # VP/J NSg/P D/P VP/J . R VPp/J NPr/VB/J NPr/VB/J+ . P NPr🅪Sg/VB+ . VP/J > glasses and scanty blond hair . He was now decently clothed in a “ sport shirt , ” # NPl/V3 VB/C J NSg/VB/J N🅪Sg/VB+ . NPr/ISg+ VLPt NSg/J/R/C R VP/J NPr/J/R/P D/P . NSg/VB+ NSg/VB+ . . > open at the neck , sneakers , and duck trousers of a nebulous hue . # NSg/VB/J NSg/P D NSg/VB+ . NPl+ . VB/C NSg/VB+ NPl/V3 P D/P J N🅪Sg+ . > # > “ Did we interrupt your exercises ? ” inquired Daisy politely . # . VXPt IPl+ NSg/VB D$+ NPl/V3+ . . VP/J NPr+ R . > # > “ I was asleep , ” cried Mr . Klipspringer , in a spasm of embarrassment . “ That is , # . ISg/#r+ VLPt J . . VP/J NSg+ . ? . NPr/J/R/P D/P NSg/VB P N🅪Sg+ . . NSg/I/C/Ddem+ VL3 . > I’d been asleep . Then I got up . . . ” # K NSg/VLPp J . NSg/J/R/C ISg/#r+ VP NSg/VB/J/P . . . . > # > “ Klipspringer plays the piano , ” said Gatsby , cutting him off . “ Don’t you , Ewing , # . ? NPl/V3 D NSg/VB/J+ . . VP/J NPr . NSg/Vg/J ISg+ NSg/VB/J/P . . VXB ISgPl+ . NPr . > old sport ? ” # NSg/J NSg/VB+ . . > # > “ I don’t play well . I don’t — I hardly play at all . I’m all out of prac — — — ” # . ISg/#r+ VXB N🅪Sg/VB NSg/VB/J/R . ISg/#r+ VXB . ISg/#r+ R N🅪Sg/VB NSg/P NSg/I/J/C/Dq . K NSg/I/J/C/Dq NSg/VB/J/R/P+ P ? . . . . > # > “ We’ll go down - stairs , ” interrupted Gatsby . He flipped a switch . The gray # . K NSg/VB/J N🅪Sg/VB/J/P . NPl+ . . VP/J NPr . NPr/ISg+ VP D/P+ NSg/VB/J+ . D+ NPr🅪Sg/VB/J/Am+ > windows disappeared as the house glowed full of light . # NPrPl/V3+ VP/J R/C/P D+ NPr/VB+ VP/J NSg/VB/J P N🅪Sg/VB/J+ . > # > In the music - room Gatsby turned on a solitary lamp beside the piano . He lit # NPr/J/R/P D+ N🅪Sg/VB/J+ . N🅪Sg/VB/J+ NPr VP/J J/P D/P NSg/J NSg/VB+ P D NSg/VB/J+ . NPr/ISg+ NSg/VP/J > Daisy’s cigarette from a trembling match , and sat down with her on a couch far # NPr$ NSg/VB+ P D/P Nᴹ/Vg/J NSg/VB+ . VB/C NSg/VP/J N🅪Sg/VB/J/P P ISg/D$+ J/P D/P NSg/VB+ NSg/VB/J > across the room , where there was no light save what the gleaming floor bounced # NSg/P D N🅪Sg/VB/J+ . NSg/R/C R+ VLPt NSg/Dq/P N🅪Sg/VB/J+ NSg/VB/C/P NSg/I+ D Nᴹ/Vg/J NSg/VB+ VP/J > in from the hall . # NPr/J/R/P P D NPr+ . > # > When Klipspringer had played “ The Love Nest ” he turned around on the bench and # NSg/I/C ? VP VP/J . D NPr🅪Sg/VB NSg/VB/JS+ . NPr/ISg+ VP/J J/P J/P D NSg/VB+ VB/C > searched unhappily for Gatsby in the gloom . # VP/J R R/C/P NPr NPr/J/R/P D Nᴹ/VB+ . > # > “ I’m all out of practice , you see . I told you I couldn’t play . I’m all out of # . K NSg/I/J/C/Dq NSg/VB/J/R/P P NSg/VB+ . ISgPl+ NSg/VB . ISg/#r+ VP ISgPl+ ISg/#r+ VXB N🅪Sg/VB . K NSg/I/J/C/Dq NSg/VB/J/R/P P > prac — ” # ? . . > # > “ Don’t talk so much , old sport , ” commanded Gatsby . “ Play ! ” # . VXB N🅪Sg/VB NSg/I/J/R/C NSg/I/J/R/Dq . NSg/J NSg/VB+ . . VP/J NPr . . N🅪Sg/VB . . > # > “ In the morning , In the evening , Ain’t we got fun — — — ” # . NPr/J/R/P D+ N🅪Sg/Vg/J+ . NPr/J/R/P D+ N🅪Sg/Vg/J+ . VXB IPl+ VP Nᴹ/VB/J . . . . > # > Outside the wind was loud and there was a faint flow of thunder along the Sound . # Nᴹ/VB/J/P D+ N🅪Sg/VB+ VLPt NSg/J VB/C R+ VLPt D/P NSg/VB/J NSg/VB P NSg/VB+ P D+ N🅪Sg/VB/J+ . > All the lights were going on in West Egg now ; the electric trains , men - carrying , # NSg/I/J/C/Dq+ D+ NPl/V3+ NSg/VLPt Nᴹ/Vg/J J/P NPr/J/R/P NPr/VB/J+ N🅪Sg/VB+ NSg/J/R/C . D NSg/J NPl/V3 . NPl+ . Nᴹ/Vg/J . > were plunging home through the rain from New York . It was the hour of a profound # NSg/VLPt Nᴹ/Vg/J NSg/VB/J+ NSg/J/P D N🅪Sg/VB+ P NSg/J NPr+ . NPr/ISg+ VLPt D NSg P D/P+ NSg/VB/J+ > human change , and excitement was generating on the air . # NSg/VB/J+ N🅪Sg/VB+ . VB/C NSg+ VLPt Nᴹ/Vg/J J/P D+ N🅪Sg/VB+ . > # > “ One thing’s sure and nothing’s surer The rich get richer and the poor # . NSg/I/J NSg$ J VB/C NSg$ JC D NPr/VB/J NSg/VB NSg/JC VB/C D NSg/VB/J > get — children . In the meantime , In between time — — — ” # NSg/VB . NPl+ . NPr/J/R/P D+ NSg+ . NPr/J/R/P NSg/P N🅪Sg/VB/J+ . . . . > # > As I went over to say good - by I saw that the expression of bewilderment had come # R/C/P ISg/#r+ NSg/VPt NSg/J/P P NSg/VB NPr/VB/J . NSg/P ISg/#r+ NSg/VPt NSg/I/C/Ddem D N🅪Sg+ P NSg VP NSg/VBPp/P > back into Gatsby’s face , as though a faint doubt had occurred to him as to the # NSg/VB/J P NPr$ NSg/VB+ . R/C/P C D/P NSg/VB/J N🅪Sg/VB+ VP VP P ISg+ R/C/P P D > quality of his present happiness . Almost five years ! There must have been # N🅪Sg/J P ISg/D$+ NSg/VB/J Nᴹ+ . R NSg+ NPl+ . R+ NSg/VXB NSg/VXB NSg/VLPp > moments even that afternoon when Daisy tumbled short of his dreams — not through # NPl+ NSg/VB/J/R NSg/I/C/Ddem+ N🅪Sg+ NSg/I/C NPr+ VP/J NPr/VB/J/P P ISg/D$+ NPl/V3+ . NSg/R/C NSg/J/P > her own fault , but because of the colossal vitality of his illusion . It had gone # ISg/D$+ NSg/VB/J+ NSg/VB+ . NSg/C/P C/P P D J Nᴹ P ISg/D$+ N🅪Sg+ . NPr/ISg+ VP VPp/J/P > beyond her , beyond everything . He had thrown himself into it with a creative # NSg/P ISg/D$+ . NSg/P NSg/I/VB+ . NPr/ISg+ VP VPp/J ISg+ P NPr/ISg+ P D/P+ NSg/J+ > passion , adding to it all the time , decking it out with every bright feather # NPrᴹ/VB+ . Nᴹ/Vg/J P NPr/ISg+ NSg/I/J/C/Dq D+ N🅪Sg/VB/J+ . Nᴹ/Vg/J+ NPr/ISg+ NSg/VB/J/R/P P Dq+ NPr/VB/J+ NSg/VB+ > that drifted his way . No amount of fire or freshness can challenge what a man # NSg/I/C/Ddem+ VP/J ISg/D$+ NSg/J+ . NSg/Dq/P NSg/VB P N🅪Sg/VB/J NPr/C NSg+ NPr/VXB N🅪Sg/VB NSg/I+ D/P+ NPr/VB/J+ > can store up in his ghostly heart . # NPr/VXB NSg/VB NSg/VB/J/P NPr/J/R/P ISg/D$+ J/R+ N🅪Sg/VB+ . > # > As I watched him he adjusted himself a little , visibly . His hand took hold of # R/C/P ISg/#r+ VP/J ISg+ NPr/ISg+ VP/J ISg+ D/P NPr/I/J/Dq . R . ISg/D$+ NSg/VB+ VPt NSg/VB/J P > hers , and as she said something low in his ear he turned toward her with a rush # ISg+ . VB/C R/C/P ISg+ VP/J NSg/I/J+ NSg/VB/J/R NPr/J/R/P ISg/D$+ NSg/VB/J+ NPr/ISg+ VP/J J/P ISg/D$+ P D/P NPr/VB/J > of emotion . I think that voice held him most , with its fluctuating , feverish # P N🅪Sg+ . ISg/#r+ NSg/VB NSg/I/C/Ddem+ NSg/VB+ VP ISg+ NSg/I/J/R/Dq . P ISg/D$+ Nᴹ/Vg/J . J > warmth , because it couldn’t be over - dreamed — that voice was a deathless song . # Nᴹ+ . C/P NPr/ISg+ VXB NSg/VLXB NSg/J/P . VP/J/NoAm/Au . NSg/I/C/Ddem NSg/VB+ VLPt D/P J N🅪Sg+ . > # > They had forgotten me , but Daisy glanced up and held out her hand ; Gatsby didn’t # IPl+ VP NSg/VPp/J NPr/ISg+ . NSg/C/P NPr+ VP/J NSg/VB/J/P VB/C VP NSg/VB/J/R/P ISg/D$+ NSg/VB+ . NPr VXPt > know me now at all . I looked once more at them and they looked back at me , # VB NPr/ISg+ NSg/J/R/C NSg/P NSg/I/J/C/Dq . ISg/#r+ VP/J NSg/C NPr/I/J/R/Dq NSg/P NSg/IPl+ VB/C IPl+ VP/J NSg/VB/J NSg/P NPr/ISg+ . > remotely , possessed by intense life . Then I went out of the room and down the # R . VP/J NSg/P J+ N🅪Sg/VB+ . NSg/J/R/C ISg/#r+ NSg/VPt NSg/VB/J/R/P P D+ N🅪Sg/VB/J+ VB/C N🅪Sg/VB/J/P D+ > marble steps into the rain , leaving them there together . # NSg/VB/J+ NPl/V3+ P D+ N🅪Sg/VB+ . Nᴹ/Vg/J NSg/IPl+ R+ J . > # > CHAPTER VI # HeadingStart NSg/VB+ NPr/#r > # > About this time an ambitious young reporter from New York arrived one morning at # J/P I/Ddem+ N🅪Sg/VB/J+ D/P J NPr/VB/J NSg/VB P NSg/J+ NPr+ VP/J NSg/I/J N🅪Sg/Vg/J+ NSg/P > Gatsby’s door and asked him if he had anything to say . # NPr$ NSg/VB+ VB/C VP/J ISg+ NSg/C NPr/ISg+ VP NSg/I/VB+ P NSg/VB . > # > “ Anything to say about what ? ” inquired Gatsby politely . # . NSg/I/VB+ P NSg/VB J/P NSg/I+ . . VP/J NPr R . > # > “ Why — any statement to give out . ” # . NSg/VB . I/R/Dq NSg/VB/J+ P NSg/VB NSg/VB/J/R/P . . > # > It transpired after a confused five minutes that the man had heard Gatsby’s name # NPr/ISg+ VP/J P D/P VP/J NSg NPl/V3+ NSg/I/C/Ddem D+ NPr/VB/J+ VP VP/J NPr$ NSg/VB+ > around his office in a connection which he either wouldn’t reveal or didn’t # J/P ISg/D$+ NSg/VB+ NPr/J/R/P D/P N🅪Sg+ I/C+ NPr/ISg+ I/C VXB NSg/VB NPr/C VXPt > fully understand . This was his day off and with laudable initiative he had # R VB . I/Ddem+ VLPt ISg/D$+ NPr🅪Sg+ NSg/VB/J/P VB/C P J+ NSg/J+ NPr/ISg+ VP > hurried out “ to see . ” # VP/J NSg/VB/J/R/P . P NSg/VB . . > # > It was a random shot , and yet the reporter’s instinct was right . Gatsby’s # NPr/ISg+ VLPt D/P NSg/VB/J NSg/VP/J . VB/C NSg/VB/C D NSg$ NSg/J+ VLPt NPr/VB/J . NPr$ > notoriety , spread about by the hundreds who had accepted his hospitality and so # Nᴹ . N🅪Sg/VBP J/P NSg/P D NPl+ NPr/I+ VP VP/J ISg/D$+ Nᴹ+ VB/C NSg/I/J/R/C > become authorities upon his past , had increased all summer until he fell just # VBPp NPl+ P ISg/D$+ NSg/VB/J/P . VP VP/J NSg/I/J/C/Dq NPr🅪Sg/VB+ C/P NPr/ISg+ NSg/VPt/J J/R > short of being news . Contemporary legends such as the “ underground pipe - line to # NPr/VB/J/P P N🅪Sg/VLg/J/C Nᴹ/VB+ . NSg/J NPl/V3 NSg/I R/C/P D . NSg/VB/J NSg/VB+ . NSg/VB P > Canada ” attached themselves to him , and there was one persistent story that he # NPr+ . VP/J IPl+ P ISg+ . VB/C R+ VLPt NSg/I/J J NSg/VB+ NSg/I/C/Ddem+ NPr/ISg+ > didn’t live in a house at all , but in a boat that looked like a house and was # VXPt VB/J NPr/J/R/P D/P NPr/VB+ NSg/P NSg/I/J/C/Dq . NSg/C/P NPr/J/R/P D/P NSg/VB+ NSg/I/C/Ddem+ VP/J NSg/VB/J/C/P D/P NPr/VB+ VB/C VLPt > moved secretly up and down the Long Island shore . Just why these inventions were # VP/J R NSg/VB/J/P VB/C N🅪Sg/VB/J/P D NPr/VB/J NSg/VB+ NSg/VB+ . J/R NSg/VB I/Ddem NPl NSg/VLPt > a source of satisfaction to James Gatz of North Dakota , isn’t easy to say . # D/P N🅪Sg/VB P Nᴹ+ P NPrPl+ ? P NPr/VB/J+ NPr+ . NSg/VX3 NSg/VB/J P NSg/VB . > # > James Gatz — that was really , or at least legally , his name . He had changed it at # NPrPl+ ? . NSg/I/C/Ddem+ VLPt R . NPr/C NSg/P NSg/J/Dq R . ISg/D$+ NSg/VB+ . NPr/ISg+ VP VP/J NPr/ISg+ NSg/P > the age of seventeen and at the specific moment that witnessed the beginning of # D N🅪Sg/VB P NSg VB/C NSg/P D+ NSg/J+ NSg+ NSg/I/C/Ddem+ VP/J D NSg/Vg/J P > his career — when he saw Dan Cody’s yacht drop anchor over the most insidious flat # ISg/D$+ NSg/VB/J+ . NSg/I/C NPr/ISg+ NSg/VPt NPr+ NPr$ NSg/VB+ NSg/VB+ NSg/VB+ NSg/J/P D NSg/I/J/R/Dq J NSg/VB/J > on Lake Superior . It was James Gatz who had been loafing along the beach that # J/P NSg/VB+ NPr/J . NPr/ISg+ VLPt NPrPl+ ? NPr/I+ VP NSg/VLPp Nᴹ/Vg/J P D NPr/VB+ NSg/I/C/Ddem+ > afternoon in a torn green jersey and a pair of canvas pants , but it was already # N🅪Sg NPr/J/R/P D/P VB/J NPr🅪Sg/VB/J NPr+ VB/C D/P NSg/VB P NSg/VB+ NPl/V3+ . NSg/C/P NPr/ISg+ VLPt R > Jay Gatsby who borrowed a rowboat , pulled out to the Tuolomee , and informed Cody # NPr+ NPr NPr/I+ VP/J D/P NSg/VB . VP/J NSg/VB/J/R/P P D ? . VB/C VP/J NPr > that a wind might catch him and break him up in half an hour . # NSg/I/C/Ddem D/P N🅪Sg/VB+ Nᴹ/VXB/J NSg/VB ISg+ VB/C NSg/VB+ ISg+ NSg/VB/J/P NPr/J/R/P N🅪Sg/J/P+ D/P NSg+ . > # > I suppose he’d had the name ready for a long time , even then . His parents were # ISg/#r+ VB K VP D NSg/VB+ NSg/VB/J R/C/P D/P NPr/VB/J N🅪Sg/VB/J+ . NSg/VB/J/R NSg/J/R/C . ISg/D$+ NPl/V3+ NSg/VLPt > shiftless and unsuccessful farm people — his imagination had never really accepted # J VB/C J NSg/VB+ NPl/VB+ . ISg/D$+ NSg+ VP R R VP/J > them as his parents at all . The truth was that Jay Gatsby of West Egg , Long # NSg/IPl+ R/C/P ISg/D$+ NPl/V3+ NSg/P NSg/I/J/C/Dq . D+ N🅪Sg/VB+ VLPt NSg/I/C/Ddem NPr+ NPr P NPr/VB/J+ N🅪Sg/VB+ . NPr/VB/J+ > Island , sprang from his Platonic conception of himself . He was a son of God — a # NSg/VB+ . VB P ISg/D$+ NSg/J N🅪Sg P ISg+ . NPr/ISg+ VLPt D/P NPr/VB P NPr/VB+ . D/P+ > phrase which , if it means anything , means just that — and he must be about His # NSg/VB+ I/C+ . NSg/C NPr/ISg+ NPl/V3 NSg/I/VB+ . NPl/V3 J/R NSg/I/C/Ddem+ . VB/C NPr/ISg+ NSg/VXB NSg/VLXB J/P ISg/D$+ > Father’s business , the service of a vast , vulgar , and meretricious beauty . So he # NPr$ N🅪Sg/J+ . D NSg/VB P D/P NSg/J . NSg/J . VB/C J N🅪Sg/VB/J+ . NSg/I/J/R/C NPr/ISg+ > invented just the sort of Jay Gatsby that a seventeen year - old boy would be # VP/J J/R D NSg/VB P NPr+ NPr NSg/I/C/Ddem D/P NSg NSg+ . NSg/J NSg/VB+ VXB NSg/VLXB > likely to invent , and to this conception he was faithful to the end . # NSg/J P VB . VB/C P I/Ddem N🅪Sg NPr/ISg+ VLPt NSg/J P D NSg/VB+ . > # > For over a year he had been beating his way along the south shore of Lake # R/C/P NSg/J/P D/P+ NSg+ NPr/ISg+ VP NSg/VLPp Nᴹ/Vg/J ISg/D$+ NSg/J+ P D NPr/VB/J+ NSg/VB P NSg/VB+ > Superior as a clam - digger and a salmon - fisher or in any other capacity that # NPr/J R/C/P D/P NSg/VB/J . NSg VB/C D/P N🅪SgPl/VB/J+ . NPr+ NPr/C NPr/J/R/P I/R/Dq NSg/VB/J N🅪Sg/J+ NSg/I/C/Ddem+ > brought him food and bed . His brown , hardening body lived naturally through the # VP ISg+ NSg VB/C NSg/VBP/J+ . ISg/D$+ NPr🅪Sg/VB/J . Nᴹ/Vg/J NSg/VB+ VP/J R NSg/J/P D > half - fierce , half - lazy work of the bracing days . He knew women early , and since # N🅪Sg/J/P+ . J . N🅪Sg/J/P+ . NSg/VB/J N🅪Sg/VB P D Nᴹ/Vg/J NPl+ . NPr/ISg+ VPt NPl+ NSg/J/R . VB/C C/P > they spoiled him he became contemptuous of them , of young virgins because they # IPl+ VP/J ISg+ NPr/ISg+ VPt J P NSg/IPl+ . P NPr/VB/J NPl C/P IPl+ > were ignorant , of the others because they were hysterical about things which in # NSg/VLPt NSg/J . P D NPl/V3+ C/P IPl+ NSg/VLPt J J/P NPl+ I/C+ NPr/J/R/P > his overwhelming self - absorbtion he took for granted . # ISg/D$+ Nᴹ/Vg/J NSg/I/VB/J+ . ? NPr/ISg+ VPt R/C/P VP/J . > # > But his heart was in a constant , turbulent riot . The most grotesque and # NSg/C/P ISg/D$+ N🅪Sg/VB+ VLPt NPr/J/R/P D/P NSg/J . J NSg/VB . D NSg/I/J/R/Dq NSg/J VB/C > fantastic conceits haunted him in his bed at night . A universe of ineffable # NSg/J NPl/V3 VP/J ISg+ NPr/J/R/P ISg/D$+ NSg/VBP/J+ NSg/P N🅪Sg/VB+ . D/P NPr P J > gaudiness spun itself out in his brain while the clock ticked on the wash - stand # Nᴹ VB ISg+ NSg/VB/J/R/P NPr/J/R/P ISg/D$+ NPr🅪Sg/VB+ NSg/VB/C/P D NSg/VB+ VP/J J/P D NPr/VB+ . NSg/VB > and the moon soaked with wet light his tangled clothes upon the floor . Each # VB/C D NPr/VB+ VP/J P NSg/VP/J N🅪Sg/VB/J+ ISg/D$+ VP/J NPl/V3+ P D NSg/VB+ . Dq+ > night he added to the pattern of his fancies until drowsiness closed down upon # N🅪Sg/VB+ NPr/ISg+ VP/J P D NSg/VB/J P ISg/D$+ NPl/V3 C/P Nᴹ VP/J N🅪Sg/VB/J/P P > some vivid scene with an oblivious embrace . For a while these reveries provided # I/J/R/Dq NSg/J NSg/VB+ P D/P J NSg/VB+ . R/C/P D/P+ NSg/VB/C/P+ I/Ddem NPl/V3 VP/J/C > an outlet for his imagination ; they were a satisfactory hint of the unreality of # D/P NSg+ R/C/P ISg/D$+ NSg+ . IPl+ NSg/VLPt D/P NSg/J NSg/VB P D N🅪Sg P > reality , a promise that the rock of the world was founded securely on a fairy’s # N🅪Sg+ . D/P NSg/VB+ NSg/I/C/Ddem D NPr🅪Sg/VB P D NSg/VB+ VLPt VP/J R J/P D/P NSg$ > wing . # NSg/VB+ . > # > An instinct toward his future glory had led him , some months before , to the # D/P NSg/J+ J/P ISg/D$+ NSg/J+ NSg/VB+ VP NSg/VP/J ISg+ . I/J/R/Dq+ NPl+ C/P . P D > small Lutheran College of St . Olaf’s in northern Minnesota . He stayed there two # NPr/VB/J NSg/J NSg P NPr/VB+ . NPr$ NPr/J/R/P NSg/J+ NPr+ . NPr/ISg+ VP/J R+ NSg+ > weeks , dismayed at its ferocious indifference to the drums of his destiny , to # NPrPl+ . VP/J NSg/P ISg/D$+ J N🅪Sg/VB+ P D NPl/V3 P ISg/D$+ N🅪Sg+ . P > destiny itself , and despising the janitor’s work with which he was to pay his # N🅪Sg ISg+ . VB/C Nᴹ/Vg/J D NSg$ N🅪Sg/VB+ P I/C+ NPr/ISg+ VLPt P NSg/VB/J ISg/D$+ > way through . Then he drifted back to Lake Superior , and he was still searching # NSg/J+ NSg/J/P . NSg/J/R/C NPr/ISg+ VP/J NSg/VB/J P NSg/VB+ NPr/J . VB/C NPr/ISg+ VLPt NSg/VB/J/R Nᴹ/Vg/J > for something to do on the day that Dan Cody’s yacht dropped anchor in the # R/C/P NSg/I/J+ P VXB J/P D+ NPr🅪Sg+ NSg/I/C/Ddem+ NPr+ NPr$ NSg/VB+ VP/J NSg/VB+ NPr/J/R/P D > shallows alongshore . # NPl/V3+ J . > # > Cody was fifty years old then , a product of the Nevada silver fields , of the # NPr VLPt NSg NPl+ NSg/J NSg/J/R/C . D/P NSg/VB P D NPr Nᴹ/VB/J+ NPrPl/V3+ . P D > Yukon , of every rush for metal since seventy - five . The transactions in Montana # NPr . P Dq NPr/VB/J+ R/C/P N🅪Sg/VB/J+ C/P NSg . NSg . D NPl NPr/J/R/P NPr+ > copper that made him many times a millionaire found him physically robust but on # N🅪Sg/VB/J+ NSg/I/C/Ddem+ VP ISg+ NSg/I/J/Dq+ NPl/V3+ D/P NSg NSg/VP ISg+ R J NSg/C/P J/P > the verge of soft - mindedness , and , suspecting this , an infinite number of women # D NSg/VB P NSg/J . Nᴹ+ . VB/C . Nᴹ/Vg/J I/Ddem+ . D/P NSg/J N🅪Sg/VB/JC P NPl+ > tried to separate him from his money . The none too savory ramifications by which # VP/J P NSg/VB/J ISg+ P ISg/D$+ N🅪Sg/J+ . D+ NSg/I+ R NSg/J + NSg/P I/C+ > Ella Kaye , the newspaper woman , played Madame de Maintenon to his weakness and # NPr NPr . D N🅪Sg/VB+ NSg/VB+ . VP/J NSg+ NPr+ ? P ISg/D$+ N🅪Sg+ VB/C > sent him to sea in a yacht , were common property of the turgid journalism # NSg/VP ISg+ P NSg NPr/J/R/P D/P NSg/VB+ . NSg/VLPt NSg/VB/J NSg/VB P D J Nᴹ+ > of 1902 . He had been coasting along all too hospitable shores for five years # P # . NPr/ISg+ VP NSg/VLPp Nᴹ/Vg/J P NSg/I/J/C/Dq R J NPl/V3+ R/C/P NSg NPl+ > when he turned up as James Gatz’s destiny in Little Girl Bay . # NSg/I/C NPr/ISg+ VP/J NSg/VB/J/P R/C/P NPrPl+ ? N🅪Sg+ NPr/J/R/P NPr/I/J/Dq NSg/VB+ NSg/VB/J+ . > # > To young Gatz , resting on his oars and looking up at the railed deck , that yacht # P NPr/VB/J ? . Nᴹ/Vg/J+ J/P ISg/D$+ NPl/V3 VB/C Nᴹ/Vg/J NSg/VB/J/P NSg/P D VP/J NSg/VB+ . NSg/I/C/Ddem NSg/VB+ > represented all the beauty and glamour in the world . I suppose he smiled at # VP/J NSg/I/J/C/Dq D N🅪Sg/VB/J VB/C NSg/VB+ NPr/J/R/P D NSg/VB+ . ISg/#r+ VB NPr/ISg+ VP/J NSg/P > Cody — he had probably discovered that people liked him when he smiled . At any # NPr . NPr/ISg+ VP R VP/J NSg/I/C/Ddem NPl/VB+ VP/J ISg+ NSg/I/C NPr/ISg+ VP/J . NSg/P I/R/Dq+ > rate Cody asked him a few questions ( one of them elicited the brand new name ) # NSg/VB+ NPr VP/J ISg+ D/P NSg/I/Dq NPl/V3+ . NSg/I/J P NSg/IPl+ VP/J D NSg/VB+ NSg/J NSg/VB+ . > and found that he was quick and extravagantly ambitious . A few days later he # VB/C NSg/VP NSg/I/C/Ddem NPr/ISg+ VLPt NSg/VB/J VB/C R J . D/P+ NSg/I/Dq+ NPl+ JC NPr/ISg+ > took him to Duluth and bought him a blue coat , six pair of white duck trousers , # VPt ISg+ P NPr VB/C NSg/VP ISg+ D/P N🅪Sg/VB/J NSg/VB+ . NSg NSg/VB P NPr🅪Sg/VB/J NSg/VB+ NPl/V3+ . > and a yachting cap . And when the Tuolomee left for the West Indies and the # VB/C D/P Nᴹ/Vg/J NPr/VB+ . VB/C NSg/I/C D ? NPr/VP/J R/C/P D NPr/VB/J+ NPrPl VB/C D > Barbary Coast Gatsby left too . # NPr NSg/VB+ NPr NPr/VP/J R . > # > He was employed in a vague personal capacity — while he remained with Cody he was # NPr/ISg+ VLPt VP/J NPr/J/R/P D/P+ NSg/VB/J+ NSg/J+ N🅪Sg/J+ . NSg/VB/C/P NPr/ISg+ VP/J P NPr NPr/ISg+ VLPt > in turn steward , mate , skipper , secretary , and even jailor , for Dan Cody sober # NPr/J/R/P NSg/VB NSg/VB+ . NSg/VB . NSg/VB+ . NPr/VB+ . VB/C NSg/VB/J/R ? . R/C/P NPr+ NPr VB/J > knew what lavish doings Dan Cody drunk might soon be about , and he provided for # VPt NSg/I+ NSg/VB/J NPl/V3 NPr+ NPr NSg/VPp/J Nᴹ/VXB/J J/R NSg/VLXB J/P . VB/C NPr/ISg+ VP/J/C R/C/P > such contingencies by reposing more and more trust in Gatsby . The arrangement # NSg/I NPl+ NSg/P Nᴹ/Vg/J NPr/I/J/R/Dq VB/C NPr/I/J/R/Dq N🅪Sg/VB/J NPr/J/R/P NPr . D+ NSg+ > lasted five years , during which the boat went three times around the Continent . # VP/J NSg+ NPl+ . VB/P I/C+ D+ NSg/VB+ NSg/VPt NSg NPl/V3+ J/P D+ NPr/J+ . > It might have lasted indefinitely except for the fact that Ella Kaye came on # NPr/ISg+ Nᴹ/VXB/J NSg/VXB VP/J R VB/C/P R/C/P D+ NSg+ NSg/I/C/Ddem+ NPr NPr NSg/VPt/P J/P > board one night in Boston and a week later Dan Cody inhospitably died . # N🅪Sg/VB+ NSg/I/J N🅪Sg/VB+ NPr/J/R/P NPr+ VB/C D/P NSg/J+ JC NPr+ NPr R VP/J . > # > I remember the portrait of him up in Gatsby’s bedroom , a gray , florid man with a # ISg/#r+ NSg/VB D NSg/VB/J P ISg+ NSg/VB/J/P NPr/J/R/P NPr$ NSg+ . D/P NPr🅪Sg/VB/J/Am . J NPr/VB/J+ P D/P > hard , empty face — the pioneer debauchee , who during one phase of American life # N🅪Sg/J/R . NSg/VB/J NSg/VB+ . D NSg/VB+ NSg . NPr/I+ VB/P NSg/I/J NPr/VB P NPr/J N🅪Sg/VB+ > brought back to the Eastern seaboard the savage violence of the frontier brothel # VP NSg/VB/J P D J NSg+ D NPr/VB/J+ Nᴹ/VB P D NSg/VB+ NSg > and saloon . It was indirectly due to Cody that Gatsby drank so little . Sometimes # VB/C NSg+ . NPr/ISg+ VLPt R NSg/J P NPr NSg/I/C/Ddem+ NPr NSg/VPt NSg/I/J/R/C NPr/I/J/Dq . R > in the course of gay parties women used to rub champagne into his hair ; for # NPr/J/R/P D NSg/VB P NPr/VB/J+ NPl/V3+ NPl+ VP/J P NSg/VB N🅪Sg/VB/J+ P ISg/D$+ N🅪Sg/VB+ . R/C/P > himself he formed the habit of letting liquor alone . # ISg+ NPr/ISg+ VP/J D NSg/VB P NSg/Vg N🅪Sg/VB+ J . > # > And it was from Cody that he inherited money — a legacy of twenty - five thousand # VB/C NPr/ISg+ VLPt P NPr NSg/I/C/Ddem NPr/ISg+ VP/J N🅪Sg/J+ . D/P NSg/J P NSg . NSg NSg > dollars . He didn’t get it . He never understood the legal device that was used # NPl+ . NPr/ISg+ VXPt NSg/VB NPr/ISg+ . NPr/ISg+ R VP/J D+ NSg/J+ NSg/VB/J/P+ NSg/I/C/Ddem+ VLPt VP/J > against him , but what remained of the millions went intact to Ella Kaye . He was # C/P ISg+ . NSg/C/P NSg/I+ VP/J P D+ NPl+ NSg/VPt J P NPr NPr . NPr/ISg+ VLPt > left with his singularly appropriate education ; the vague contour of Jay Gatsby # NPr/VP/J P ISg/D$+ R VB/J+ NSg+ . D NSg/VB/J NSg/VB P NPr+ NPr > had filled out to the substantiality of a man . # VP VP/J NSg/VB/J/R/P P D ? P D/P NPr/VB/J+ . > # > He told me all this very much later , but I’ve put it down here with the idea of # NPr/ISg+ VP NPr/ISg+ NSg/I/J/C/Dq I/Ddem J/R NSg/I/J/R/Dq JC . NSg/C/P K NSg/VBP NPr/ISg+ N🅪Sg/VB/J/P J/R P D NSg P > exploding those first wild rumors about his antecedents , which weren’t even # Nᴹ/Vg/J I/Ddem NSg/J NSg/VB/J NPl/V3/Am+ J/P ISg/D$+ NPl . I/C+ VPt NSg/VB/J/R > faintly true . Moreover he told it to me at a time of confusion , when I had # R NSg/VB/J . R NPr/ISg+ VP NPr/ISg+ P NPr/ISg+ NSg/P D/P N🅪Sg/VB/J P N🅪Sg/VB+ . NSg/I/C ISg/#r+ VP > reached the point of believing everything and nothing about him . So I take # VP/J D NSg/VB P Nᴹ/Vg/J NSg/I/VB+ VB/C NSg/I/J+ J/P ISg+ . NSg/I/J/R/C ISg/#r+ NSg/VB > advantage of this short halt , while Gatsby , so to speak , caught his breath , to # N🅪Sg/VB P I/Ddem+ NPr/VB/J/P+ NSg/VB/J+ . NSg/VB/C/P NPr . NSg/I/J/R/C P NSg/VB . VP/J ISg/D$+ N🅪Sg/VB/J+ . P > clear this set of misconceptions away . # NSg/VB/J I/Ddem NPr/VBP/J+ P NPl VB/J . > # > It was a halt , too , in my association with his affairs . For several weeks I # NPr/ISg+ VLPt D/P NSg/VB/J . R . NPr/J/R/P D$+ N🅪Sg+ P ISg/D$+ NPl+ . R/C/P J/Dq+ NPrPl+ ISg/#r+ > didn’t see him or hear his voice on the phone — mostly I was in New York , trotting # VXPt NSg/VB ISg+ NPr/C VB ISg/D$+ NSg/VB+ J/P D NSg/VB+ . R ISg/#r+ VLPt NPr/J/R/P NSg/J NPr+ . NSg/Vg/J > around with Jordan and trying to ingratiate myself with her senile aunt — but # J/P P NPr+ VB/C Nᴹ/Vg/J P VB ISg+ P ISg/D$+ NSg/J NSg+ . NSg/C/P > finally I went over to his house one Sunday afternoon . I hadn’t been there two # R ISg/#r+ NSg/VPt NSg/J/P P ISg/D$+ NPr/VB+ NSg/I/J+ NSg/VB+ N🅪Sg+ . ISg/#r+ VPt NSg/VLPp R+ NSg > minutes when somebody brought Tom Buchanan in for a drink . I was startled , # NPl/V3+ NSg/I/C NSg/I+ VP NPr/VB+ NPr+ NPr/J/R/P R/C/P D/P NSg/VB+ . ISg/#r+ VLPt VP/J . > naturally , but the really surprising thing was that it hadn’t happened before . # R . NSg/C/P D R Nᴹ/Vg/J+ NSg+ VLPt NSg/I/C/Ddem NPr/ISg+ VPt VP/J C/P . > # > They were a party of three on horseback — Tom and a man named Sloane and a pretty # IPl+ NSg/VLPt D/P NSg/VB/J P NSg J/P Nᴹ . NPr/VB VB/C D/P NPr/VB/J+ VP/J NPr VB/C D/P NSg/VB/J/R > woman in a brown riding - habit , who had been there previously . # NSg/VB+ NPr/J/R/P D/P NPr🅪Sg/VB/J Nᴹ/Vg/J+ . NSg/VB+ . NPr/I+ VP NSg/VLPp R+ R . > # > “ I’m delighted to see you , ” said Gatsby , standing on his porch . “ I’m delighted # . K VP/J P NSg/VB ISgPl+ . . VP/J NPr . Nᴹ/Vg/J J/P ISg/D$+ NSg+ . . K VP/J > that you dropped in . ” # NSg/I/C/Ddem ISgPl+ VP/J NPr/J/R/P . . > # > As though they cared ! # R/C/P C IPl+ VP . > # > “ Sit right down . Have a cigarette or a cigar . ” He walked around the room # . NSg/VB NPr/VB/J N🅪Sg/VB/J/P . NSg/VXB D/P NSg/VB NPr/C D/P+ NSg+ . . NPr/ISg+ VP/J J/P D+ N🅪Sg/VB/J+ > quickly , ringing bells . “ I’ll have something to drink for you in just a minute . ” # R . Nᴹ/Vg/J NPl/V3 . . K NSg/VXB NSg/I/J+ P NSg/VB R/C/P ISgPl+ NPr/J/R/P J/R D/P NSg/VB/J+ . . > # > He was profoundly affected by the fact that Tom was there . But he would be # NPr/ISg+ VLPt R NSg/VP/J NSg/P D+ NSg+ NSg/I/C/Ddem+ NPr/VB+ VLPt R . NSg/C/P NPr/ISg+ VXB NSg/VLXB > uneasy anyhow until he had given them something , realizing in a vague way that # NSg/VB/J J C/P NPr/ISg+ VP NSg/VPp/J/P NSg/IPl+ NSg/I/J+ . Nᴹ/Vg/J/Comm/NoAm NPr/J/R/P D/P+ NSg/VB/J+ NSg/J+ NSg/I/C/Ddem+ > that was all they came for . Mr . Sloane wanted nothing . A lemonade ? No , thanks . A # NSg/I/C/Ddem+ VLPt NSg/I/J/C/Dq IPl+ NSg/VPt/P R/C/P . NSg+ . NPr VP/J NSg/I/J+ . D/P+ N🅪Sg+ . NSg/Dq/P . NPl/V3+ . D/P+ > little champagne ? Nothing at all , thanks . . . . I’m sorry — — — # NPr/I/J/Dq+ N🅪Sg/VB/J+ . NSg/I/J+ NSg/P NSg/I/J/C/Dq . NPl/V3+ . . . . K NSg/VB/J . . . > # > “ Did you have a nice ride ? ” # . VXPt ISgPl+ NSg/VXB D/P+ NPr/J+ NSg/VB+ . . > # > “ Very good roads around here . ” # . J/R NPr/VB/J+ NPl+ J/P J/R . . > # > “ I suppose the automobiles — — — ” # . ISg/#r+ VB D NPl/V3 . . . . > # > “ Yeah . ” # . NSg . . > # > Moved by an irresistible impulse , Gatsby turned to Tom , who had accepted the # VP/J NSg/P D/P+ J+ NSg/VB+ . NPr VP/J P NPr/VB+ . NPr/I+ VP VP/J D > introduction as a stranger . # NSg+ R/C/P D/P NSg/VB/JC+ . > # > “ I believe we’ve met somewhere before , Mr . Buchanan . ” # . ISg/#r+ VB K VP NSg C/P . NSg+ . NPr+ . . > # > “ Oh , yes , ” said Tom , gruffly polite , but obviously not remembering . “ So we did . # . NPr/VB . NPl/VB . . VP/J NPr/VB+ . R VB/J . NSg/C/P R NSg/R/C Nᴹ/Vg/J . . NSg/I/J/R/C IPl+ VXPt . > I remember very well . ” # ISg/#r+ NSg/VB J/R NSg/VB/J/R . . > # > “ About two weeks ago . ” # . J/P NSg+ NPrPl+ J/P . . > # > “ That’s right . You were with Nick here . ” # . NSg$ NPr/VB/J . ISgPl+ NSg/VLPt P NPr/VB+ J/R . . > # > “ I know your wife , ” continued Gatsby , almost aggressively . # . ISg/#r+ VB D$+ NSg/VB/J+ . . VP/J NPr . R R . > # > “ That so ? ” # . NSg/I/C/Ddem+ NSg/I/J/R/C . . > # > Tom turned to me . # NPr/VB+ VP/J P NPr/ISg+ . > # > “ You live near here , Nick ? ” # . ISgPl+ VB/J NSg/VB/J/P J/R . NPr/VB+ . . > # > “ Next door . ” # . NSg/J/P+ NSg/VB+ . . > # > “ That so ? ” # . NSg/I/C/Ddem+ NSg/I/J/R/C . . > # > Mr . Sloane didn’t enter into the conversation , but lounged back haughtily in his # NSg+ . NPr VXPt NSg/VB P D N🅪Sg/VB+ . NSg/C/P VP/J NSg/VB/J R NPr/J/R/P ISg/D$+ > chair ; the woman said nothing either — until unexpectedly , after two highballs , # NSg/VB+ . D NSg/VB+ VP/J NSg/I/J+ I/C . C/P R . P NSg NPl/V3 . > she became cordial . # ISg+ VPt NSg/J . > # > “ We’ll all come over to your next party , Mr . Gatsby , ” she suggested . “ What do # . K NSg/I/J/C/Dq NSg/VBPp/P+ NSg/J/P P D$+ NSg/J/P NSg/VB/J+ . NSg+ . NPr . . ISg+ VP/J . . NSg/I+ VXB > you say ? ” # ISgPl+ NSg/VB . . > # > “ Certainly ; I’d be delighted to have you . ” # . R . K NSg/VLXB VP/J P NSg/VXB ISgPl+ . . > # > “ Be ver ’ nice , ” said Mr . Sloane , without gratitude . “ Well — think ought to be # . NSg/VLXB ? . NPr/J . . VP/J NSg+ . NPr . C/P NSg+ . . NSg/VB/J/R . NSg/VB NSg/I/VXB P NSg/VLXB > starting home . ” # Nᴹ/Vg/J NSg/VB/J+ . . > # > “ Please don’t hurry , ” Gatsby urged them . He had control of himself now , and he # . VB VXB NSg/VB+ . . NPr VP/J NSg/IPl+ . NPr/ISg+ VP N🅪Sg/VB P ISg+ NSg/J/R/C . VB/C NPr/ISg+ > wanted to see more of Tom . “ Why don’t you — why don’t you stay for supper ? I # VP/J P NSg/VB NPr/I/J/R/Dq P NPr/VB+ . . NSg/VB VXB ISgPl+ . NSg/VB VXB ISgPl+ NSg/VB/J R/C/P NSg/VB+ . ISg/#r+ > wouldn’t be surprised if some other people dropped in from New York . ” # VXB NSg/VLXB VP/J NSg/C I/J/R/Dq NSg/VB/J NPl/VB+ VP/J NPr/J/R/P P NSg/J NPr+ . . > # > “ You come to supper with me , ” said the lady enthusiastically . “ Both of you . ” # . ISgPl+ NSg/VBPp/P P NSg/VB P NPr/ISg+ . . VP/J D+ NPr/VB+ R . . I/C/Dq P ISgPl+ . . > # > This included me . Mr . Sloane got to his feet . # I/Ddem VP/J NPr/ISg+ . NSg+ . NPr VP P ISg/D$+ NPl+ . > # > “ Come along , ” he said — but to her only . # . NSg/VBPp/P P . . NPr/ISg+ VP/J . NSg/C/P P ISg/D$+ J/R/C . > # > “ I mean it , ” she insisted . “ I’d love to have you . Lots of room . ” # . ISg/#r+ NSg/VB/J NPr/ISg+ . . ISg+ VP/J . . K NPr🅪Sg/VB P NSg/VXB ISgPl+ . NPl/V3 P N🅪Sg/VB/J+ . . > # > Gatsby looked at me questioningly . He wanted to go , and he didn’t see that Mr . # NPr VP/J NSg/P NPr/ISg+ R . NPr/ISg+ VP/J P NSg/VB/J . VB/C NPr/ISg+ VXPt NSg/VB NSg/I/C/Ddem NSg+ . > Sloane had determined he shouldn’t . # NPr VP VP/J NPr/ISg+ VXB . > # > “ I’m afraid I won’t be able to , ” I said . # . K J ISg/#r+ VXB NSg/VLXB NSg/VB/J P . . ISg/#r+ VP/J . > # > “ Well , you come , ” she urged , concentrating on Gatsby . # . NSg/VB/J/R . ISgPl+ NSg/VBPp/P . . ISg+ VP/J . Nᴹ/Vg/J J/P NPr . > # > Mr . Sloane murmured something close to her ear . # NSg+ . NPr VP/J NSg/I/J+ NSg/VB/J P ISg/D$+ NSg/VB/J+ . > # > “ We won’t be late if we start now , ” she insisted aloud . # . IPl+ VXB NSg/VLXB NSg/J NSg/C IPl+ NSg/VB NSg/J/R/C . . ISg+ VP/J J . > # > “ I haven’t got a horse , ” said Gatsby . “ I used to ride in the army , but I’ve # . ISg/#r+ VXB VP D/P NSg/VB+ . . VP/J NPr . . ISg/#r+ VP/J P NSg/VB NPr/J/R/P D+ NSg+ . NSg/C/P K > never bought a horse . I’ll have to follow you in my car . Excuse me for just a # R NSg/VP D/P NSg/VB+ . K NSg/VXB P NSg/VB ISgPl+ NPr/J/R/P D$+ NSg+ . NSg/VB+ NPr/ISg+ R/C/P J/R D/P+ > minute . ” # NSg/VB/J+ . . > # > The rest of us walked out on the porch , where Sloane and the lady began an # D NSg/VB P NPr/IPl+ VP/J NSg/VB/J/R/P J/P D+ NSg+ . NSg/R/C NPr VB/C D NPr/VB+ VPt D/P > impassioned conversation aside . # J N🅪Sg/VB+ NSg/J . > # > “ My God , I believe the man’s coming , ” said Tom . “ Doesn’t he know she doesn’t # . D$+ NPr/VB+ . ISg/#r+ VB D NPr$/I/VB/J Nᴹ/Vg/J . . VP/J NPr/VB+ . . VX3 NPr/ISg+ VB ISg+ VX3 > want him ? ” # NSg/VB ISg+ . . > # > “ She says she does want him . ” # . ISg+ NPl/V3 ISg+ NPl/VX3 NSg/VB ISg+ . . > # > “ She has a big dinner party and he won’t know a soul there . ” He frowned . “ I # . ISg+ V3 D/P+ NSg/J+ N🅪Sg/VB+ NSg/VB/J+ VB/C NPr/ISg+ VXB VB D/P N🅪Sg/VB+ R . . NPr/ISg+ VP/J . . ISg/#r+ > wonder where in the devil he met Daisy . By God , I may be old - fashioned in my # N🅪Sg/VB NSg/R/C NPr/J/R/P D+ NPr/VB+ NPr/ISg+ VP NPr+ . NSg/P NPr/VB+ . ISg/#r+ NPr/VXB NSg/VLXB NSg/J . VP/J NPr/J/R/P D$+ > ideas , but women run around too much these days to suit me . They meet all kinds # NPl+ . NSg/C/P NPl+ NSg/VBPp J/P R NSg/I/J/R/Dq I/Ddem+ NPl+ P NSg/VB NPr/ISg+ . IPl+ NSg/VB/J NSg/I/J/C/Dq NPl > of crazy fish . ” # P NSg/J+ N🅪SgPl/VB+ . . > # > Suddenly Mr . Sloane and the lady walked down the steps and mounted their horses . # R NSg+ . NPr VB/C D NPr/VB+ VP/J N🅪Sg/VB/J/P D NPl/V3+ VB/C VP/J D$+ NPl/V3+ . > # > “ Come on , ” said Mr . Sloane to Tom , “ we’re late . We've got to go . ” And then to # . NSg/VBPp/P J/P . . VP/J NSg+ . NPr P NPr/VB+ . . K NSg/J . K VP P NSg/VB/J . . VB/C NSg/J/R/C P > me : “ Tell him we couldn’t wait , will you ? ” # NPr/ISg+ . . NPr/VB ISg+ IPl+ VXB NSg/VB . NPr/VXB ISgPl+ . . > # > Tom and I shook hands , the rest of us exchanged a cool nod , and they trotted # NPr/VB+ VB/C ISg/#r+ NSg/VPt/J NPl/V3+ . D NSg/VB P NPr/IPl+ VP/J D/P NSg/VB/J NSg/VB . VB/C IPl+ VP > quickly down the drive , disappearing under the August foliage just as Gatsby , # R N🅪Sg/VB/J/P D N🅪Sg/VB+ . Nᴹ/Vg/J NSg/J/P D NPr/VB/J+ Nᴹ+ J/R R/C/P NPr . > with hat and light overcoat in hand , came out the front door . # P NSg/VB VB/C N🅪Sg/VB/J+ NSg/VB NPr/J/R/P NSg/VB+ . NSg/VPt/P NSg/VB/J/R/P D NSg/VB/J+ NSg/VB+ . > # > Tom was evidently perturbed at Daisy’s running around alone , for on the # NPr/VB+ VLPt R VP/J NSg/P NPr$ Nᴹ/Vg/J/P J/P J . R/C/P J/P D > following Saturday night he came with her to Gatsby’s party . Perhaps his # N🅪Sg/Vg/J/P NSg/VB+ N🅪Sg/VB+ NPr/ISg+ NSg/VPt/P P ISg/D$+ P NPr$ NSg/VB/J+ . NSg/R ISg/D$+ > presence gave the evening its peculiar quality of oppressiveness — it stands out # N🅪Sg/VB+ VPt D+ N🅪Sg/Vg/J+ ISg/D$+ NSg/J N🅪Sg/J P Nᴹ . NPr/ISg+ NPl/V3 NSg/VB/J/R/P > in my memory from Gatsby’s other parties that summer . There were the same # NPr/J/R/P D$+ N🅪Sg P NPr$ NSg/VB/J+ NPl/V3+ NSg/I/C/Ddem+ NPr🅪Sg/VB+ . R+ NSg/VLPt D+ I/J+ > people , or at least the same sort of people , the same profusion of champagne , # NPl/VB+ . NPr/C NSg/P NSg/J/Dq D I/J NSg/VB P NPl/VB+ . D I/J N🅪Sg/VB P N🅪Sg/VB/J+ . > the same many - colored , many - keyed commotion , but I felt an unpleasantness in the # D I/J NSg/I/J/Dq . NSg/VP/J/Am . NSg/I/J/Dq . VP/J N🅪Sg . NSg/C/P ISg/#r+ N🅪Sg/VP/J D/P NSg NPr/J/R/P D > air , a pervading harshness that hadn’t been there before . Or perhaps I had # N🅪Sg/VB+ . D/P Nᴹ/Vg/J NSg NSg/I/C/Ddem+ VPt NSg/VLPp R+ C/P . NPr/C NSg/R ISg/#r+ VP > merely grown used to it , grown to accept West Egg as a world complete in itself , # R VB/J VP/J P NPr/ISg+ . VB/J P NSg/VB/J NPr/VB/J+ N🅪Sg/VB+ R/C/P D/P+ NSg/VB+ NSg/VB/J NPr/J/R/P ISg+ . > with its own standards and its own great figures , second to nothing because it # P ISg/D$+ NSg/VB/J NPl VB/C ISg/D$+ NSg/VB/J+ NSg/J+ NPl/V3+ . NSg/VB/J P NSg/I/J+ C/P NPr/ISg+ > had no consciousness of being so , and now I was looking at it again , through # VP NSg/Dq/P Nᴹ P N🅪Sg/VLg/J/C NSg/I/J/R/C . VB/C NSg/J/R/C ISg/#r+ VLPt Nᴹ/Vg/J NSg/P NPr/ISg+ P . NSg/J/P > Daisy’s eyes . It is invariably saddening to look through new eyes at things upon # NPr$ NPl/V3+ . NPr/ISg+ VL3 R Nᴹ/Vg/J P NSg/VB NSg/J/P NSg/J NPl/V3+ NSg/P NPl+ P > which you have expended your own powers of adjustment . # I/C+ ISgPl+ NSg/VXB VP/J D$+ NSg/VB/J NPrPl/V3 P NSg+ . > # > They arrived at twilight , and , as we strolled out among the sparkling hundreds , # IPl+ VP/J NSg/P Nᴹ/VB/J+ . VB/C . R/C/P IPl+ VP/J NSg/VB/J/R/P P D+ Nᴹ/Vg/J+ NPl+ . > Daisy’s voice was playing murmurous tricks in her throat . # NPr$ NSg/VB+ VLPt Nᴹ/Vg/J J NPl/V3+ NPr/J/R/P ISg/D$+ NSg/VB+ . > # > “ These things excite me so , ” she whispered . “ If you want to kiss me any time # . I/Ddem+ NPl+ VB NPr/ISg+ NSg/I/J/R/C . . ISg+ VP/J . . NSg/C ISgPl+ NSg/VB P NSg/VB NPr/ISg+ I/R/Dq N🅪Sg/VB/J+ > during the evening , Nick , just let me know and I'll be glad to arrange it for # VB/P D+ N🅪Sg/Vg/J+ . NPr/VB+ . J/R NSg/VBP NPr/ISg+ VB VB/C K NSg/VLXB NSg/VB/J P NSg/VB NPr/ISg+ R/C/P > you . Just mention my name . Or present a green card . I’m giving out green — ” # ISgPl+ . J/R NSg/VB D$+ NSg/VB+ . NPr/C NSg/VB/J D/P+ NPr🅪Sg/VB/J+ N🅪Sg/VB+ . K Nᴹ/Vg/J NSg/VB/J/R/P NPr🅪Sg/VB/J . . > # > “ Look around , ” suggested Gatsby # . NSg/VB J/P . . VP/J NPr > # > “ I’m looking around . I’m having a marvellous — ” # . K Nᴹ/Vg/J J/P . K Nᴹ/Vg/J D/P J/Comm . . > # > “ You must see the faces of many people you’ve heard about . ” # . ISgPl+ NSg/VXB NSg/VB D NPl/V3 P NSg/I/J/Dq+ NPl/VB+ K VP/J J/P . . > # > Tom’s arrogant eyes roamed the crowd . # NPr$ J NPl/V3+ VP/J D NSg/VB+ . > # > “ We don’t go around very much , ” he said ; “ in fact , I was just thinking I don’t # . IPl+ VXB NSg/VB/J J/P J/R NSg/I/J/R/Dq . . NPr/ISg+ VP/J . . NPr/J/R/P NSg+ . ISg/#r+ VLPt J/R Nᴹ/Vg/J ISg/#r+ VXB > know a soul here . ” # VB D/P N🅪Sg/VB+ J/R . . > # > “ Perhaps you know that lady , ” Gatsby indicated a gorgeous , scarcely human orchid # . NSg/R ISgPl+ VB NSg/I/C/Ddem+ NPr/VB+ . . NPr VP/J D/P J . R NSg/VB/J NSg/J > of a woman who sat in state under a white - plum tree . Tom and Daisy stared , with # P D/P NSg/VB+ NPr/I+ NSg/VP/J NPr/J/R/P N🅪Sg/VB+ NSg/J/P D/P NPr🅪Sg/VB/J . N🅪Sg/VB/J+ NSg/VB+ . NPr/VB VB/C NPr+ VP/J . P > that peculiarly unreal feeling that accompanies the recognition of a hitherto # NSg/I/C/Ddem+ R J N🅪Sg/Vg/J NSg/I/C/Ddem V3 D NSg P D/P J/R > ghostly celebrity of the movies . # J/R N🅪Sg P D NPl+ . > # > “ She’s lovely , ” said Daisy . # . K NSg/J . . VP/J NPr+ . > # > “ The man bending over her is her director . ” # . D+ NPr/VB/J+ Nᴹ/Vg/J NSg/J/P ISg/D$+ VL3 ISg/D$+ NSg+ . . > # > He took them ceremoniously from group to group : # NPr/ISg+ VPt NSg/IPl+ R P NSg/VB+ P NSg/VB . > # > “ Mrs . Buchanan . . . and Mr . Buchanan — ” After an instant’s hesitation he added : # . NPl+ . NPr+ . . . VB/C NSg+ . NPr+ . . P D/P NSg$ NSg+ NPr/ISg+ VP/J . > “ the polo player . ” # . D NPrᴹ+ NSg+ . . > # > “ Oh no , ” objected Tom quickly , “ not me . ” # . NPr/VB NSg/Dq/P . . VP/J NPr/VB+ R . . NSg/R/C NPr/ISg+ . . > # > But evidently the sound of it pleased Gatsby for Tom remained “ the polo player ” # NSg/C/P R D N🅪Sg/VB/J P NPr/ISg+ VP/J NPr R/C/P NPr/VB+ VP/J+ . D NPrᴹ+ NSg+ . > for the rest of the evening . # R/C/P D NSg/VB P D N🅪Sg/Vg/J+ . > # > “ I’ve never met so many celebrities , ” Daisy exclaimed , “ I liked that man — what # . K R VP NSg/I/J/R/C NSg/I/J/Dq NPl+ . . NPr+ VP/J . . ISg/#r+ VP/J NSg/I/C/Ddem NPr/VB/J+ . NSg/I+ > was his name ? — with the sort of blue nose . ” # VLPt ISg/D$+ NSg/VB+ . . P D NSg/VB P N🅪Sg/VB/J+ NSg/VB+ . . > # > Gatsby identified him , adding that he was a small producer . # NPr VP/J ISg+ . Nᴹ/Vg/J NSg/I/C/Ddem NPr/ISg+ VLPt D/P NPr/VB/J NSg+ . > # > “ Well , I liked him anyhow . ” # . NSg/VB/J/R . ISg/#r+ VP/J ISg+ J . . > # > “ I’d a little rather not be the polo player , ” said Tom pleasantly , “ I’d rather # . K D/P NPr/I/J/Dq NPr/VB/J/R NSg/R/C NSg/VLXB D NPrᴹ+ NSg+ . . VP/J NPr/VB+ R . . K NPr/VB/J/R > look at all these famous people in — in oblivion . ” # NSg/VB NSg/P NSg/I/J/C/Dq I/Ddem VB/J NPl/VB+ NPr/J/R/P . NPr/J/R/P NSg/VB+ . . > # > Daisy and Gatsby danced . I remember being surprised by his graceful , # NPr+ VB/C NPr VP/J . ISg/#r+ NSg/VB N🅪Sg/VLg/J/C VP/J NSg/P ISg/D$+ J . > conservative fox - trot — I had never seen him dance before . Then they sauntered # NSg/J NPr/VB+ . NSg/VB . ISg/#r+ VP R NSg/VPp ISg+ N🅪Sg/VB+ C/P . NSg/J/R/C IPl+ VP/J > over to my house and sat on the steps for half an hour , while at her request I # NSg/J/P P D$+ NPr/VB+ VB/C NSg/VP/J J/P D NPl/V3+ R/C/P N🅪Sg/J/P+ D/P NSg+ . NSg/VB/C/P NSg/P ISg/D$+ NSg/VB+ ISg/#r+ > remained watchfully in the garden . “ In case there’s a fire or a flood , ” she # VP/J R NPr/J/R/P D NSg/VB/J+ . . NPr/J/R/P NPr🅪Sg/VB+ K D/P N🅪Sg/VB/J NPr/C D/P NSg/VB+ . . ISg+ > explained , ‘ ‘ or any act of God . ” # VP/J . Unlintable Unlintable NPr/C I/R/Dq NPr/VB P NPr/VB+ . . > # > Tom appeared from his oblivion as we were sitting down to supper together . “ Do # NPr/VB+ VP/J P ISg/D$+ NSg/VB+ R/C/P IPl+ NSg/VLPt NSg/Vg/J N🅪Sg/VB/J/P P NSg/VB J . . VXB > you mind if I eat with some people over here ? ” he said . “ A fellow’s getting off # ISgPl+ NSg/VB+ NSg/C ISg/#r+ VB P I/J/R/Dq+ NPl/VB+ NSg/J/P J/R . . NPr/ISg+ VP/J . . D/P NSg$ NSg/Vg+ NSg/VB/J/P > some funny stuff . ” # I/J/R/Dq NSg/J Nᴹ/VB+ . . > # > “ Go ahead , ” answered Daisy genially , “ and if you want to take down any addresses # . NSg/VB/J R . . VP/J NPr+ R . . VB/C NSg/C ISgPl+ NSg/VB P NSg/VB N🅪Sg/VB/J/P I/R/Dq NPl/V3+ > here’s my little gold pencil . ” . . . She looked around after a moment and told # K D$+ NPr/I/J/Dq Nᴹ/VB/J+ NSg/VB+ . . . . . ISg+ VP/J J/P P D/P+ NSg+ VB/C VP > me the girl was “ common but pretty , ” and I knew that except for the half - hour # NPr/ISg+ D+ NSg/VB+ VLPt . NSg/VB/J NSg/C/P NSg/VB/J/R . . VB/C ISg/#r+ VPt NSg/I/C/Ddem VB/C/P R/C/P D+ N🅪Sg/J/P+ . NSg+ > she’d been alone with Gatsby she wasn’t having a good time . # K NSg/VLPp J P NPr ISg+ VPt Nᴹ/Vg/J D/P NPr/VB/J N🅪Sg/VB/J+ . > # > We were at a particularly tipsy table . That was my fault — Gatsby had been called # IPl+ NSg/VLPt NSg/P D/P R J NSg/VB+ . NSg/I/C/Ddem+ VLPt D$+ NSg/VB+ . NPr VP NSg/VLPp VP/J > to the phone , and I’d enjoyed these same people only two weeks before . But what # P D NSg/VB+ . VB/C K VP/J I/Ddem I/J NPl/VB+ J/R/C NSg NPrPl+ C/P . NSg/C/P NSg/I+ > had amused me then turned septic on the air now . # VP VP/J NPr/ISg+ NSg/J/R/C VP/J NSg/J J/P D+ N🅪Sg/VB+ NSg/J/R/C . > # > “ How do you feel , Miss Baedeker ? ” # . NSg/C VXB ISgPl+ NSg/I/VB . NSg/VB NPr . . > # > The girl addressed was trying , unsuccessfully , to slump against my shoulder . At # D+ NSg/VB+ VP/J VLPt Nᴹ/Vg/J . R . P NSg/VB C/P D$+ NSg/VB+ . NSg/P > this inquiry she sat up and opened her eyes . # I/Ddem+ NSg+ ISg+ NSg/VP/J NSg/VB/J/P VB/C VP/J ISg/D$+ NPl/V3+ . > # > “ Wha ’ ? ” # . ? . . . > # > A massive and lethargic woman , who had been urging Daisy to play golf with her # D/P NSg/J VB/C J NSg/VB+ . NPr/I+ VP NSg/VLPp Nᴹ/Vg/J+ NPr+ P N🅪Sg/VB NSg/VB+ P ISg/D$+ > at the local club to - morrow , spoke in Miss Baedeker’s defence : # NSg/P D NSg/J NSg/VB+ P . NPr/VB . NSg/VPt NPr/J/R/P NSg/VB NPr$ N🅪Sg/Comm+ . > # > “ Oh , she’s all right now . When she’s had five or six cocktails she always starts # . NPr/VB . K NSg/I/J/C/Dq NPr/VB/J NSg/J/R/C . NSg/I/C K VP NSg NPr/C NSg NPl/V3+ ISg+ R NPl/V3 > screaming like that . I tell her she ought to leave it alone . ” # Nᴹ/Vg/J NSg/VB/J/C/P NSg/I/C/Ddem+ . ISg/#r+ NPr/VB ISg/D$+ ISg+ NSg/I/VXB P NSg/VB NPr/ISg+ J . . > # > “ I do leave it alone , ” affirmed the accused hollowly . # . ISg/#r+ VXB NSg/VB NPr/ISg+ J . . VP/J D VP/J R . > # > “ We heard you yelling , so I said to Doc Civet here : ‘ There’s somebody that needs # . IPl+ VP/J ISgPl+ Nᴹ/Vg/J . NSg/I/J/R/C ISg/#r+ VP/J P NSg NSg+ J/R . Unlintable K NSg/I+ NSg/I/C/Ddem+ NPl/V3 > your help , Doc . ’ ” # D$+ NSg/VB . NSg+ . . . > # > “ She’s much obliged , I’m sure , ” said another friend , without gratitude , “ but you # . K NSg/I/J/R/Dq VP/J . K J . . VP/J I/D NPr/VB/J+ . C/P NSg+ . . NSg/C/P ISgPl+ > got her dress all wet when you stuck her head in the pool . ” # VP ISg/D$+ NSg/VB NSg/I/J/C/Dq NSg/VP/J NSg/I/C ISgPl+ NSg/VB/J ISg/D$+ NPr/VB/J+ NPr/J/R/P D NSg/VB+ . . > # > “ Anything I hate is to get my head stuck in a pool , ” mumbled Miss Baedeker . # . NSg/I/VB+ ISg/#r+ N🅪Sg/VB VL3 P NSg/VB D$+ NPr/VB/J+ NSg/VB/J NPr/J/R/P D/P+ NSg/VB+ . . VP/J NSg/VB NPr . > “ They almost drowned me once over in New Jersey . ” # . IPl+ R VP/J NPr/ISg+ NSg/C NSg/J/P NPr/J/R/P NSg/J+ NPr+ . . > # > “ Then you ought to leave it alone , ” countered Doctor Civet . # . NSg/J/R/C ISgPl+ NSg/I/VXB P NSg/VB NPr/ISg+ J . . VB NSg/VB+ NSg+ . > # > “ Speak for yourself ! ” cried Miss Baedeker violently . “ Your hand shakes . I # . NSg/VB R/C/P ISg+ . . VP/J NSg/VB NPr R . . D$+ NSg/VB+ NPl/V3 . ISg/#r+ > wouldn’t let you operate on me ! ” # VXB NSg/VBP ISgPl+ VB J/P NPr/ISg+ . . > # > It was like that . Almost the last thing I remember was standing with Daisy and # NPr/ISg+ VLPt NSg/VB/J/C/P NSg/I/C/Ddem+ . R D+ NSg/VB/J+ NSg+ ISg/#r+ NSg/VB VLPt Nᴹ/Vg/J P NPr+ VB/C > watching the moving - picture director and his Star . They were still under the # Nᴹ/Vg/J D Nᴹ/Vg/J+ . NSg/VB+ NSg VB/C ISg/D$+ NSg/VB+ . IPl+ NSg/VLPt NSg/VB/J/R NSg/J/P D > white - plum tree and their faces were touching except for a pale , thin ray of # NPr🅪Sg/VB/J . N🅪Sg/VB/J NSg/VB VB/C D$+ NPl/V3+ NSg/VLPt Nᴹ/Vg/J/P VB/C/P R/C/P D/P NSg/VB/J . NSg/VB/J NPr/VB P > moonlight between . It occurred to me that he had been very slowly bending toward # N🅪Sg/VB+ NSg/P . NPr/ISg+ VP P NPr/ISg+ NSg/I/C/Ddem NPr/ISg+ VP NSg/VLPp J/R R Nᴹ/Vg/J J/P > her all evening to attain this proximity , and even while I watched I saw him # ISg/D$+ NSg/I/J/C/Dq N🅪Sg/Vg/J+ P VB I/Ddem+ Nᴹ+ . VB/C NSg/VB/J/R NSg/VB/C/P ISg/#r+ VP/J ISg/#r+ NSg/VPt ISg+ > stoop one ultimate degree and kiss at her cheek . # NSg/VB NSg/I/J+ NSg/VB/J+ NSg+ VB/C NSg/VB NSg/P ISg/D$+ NSg/VB+ . > # > “ I like her , ” said Daisy , “ I think she’s lovely . ” # . ISg/#r+ NSg/VB/J/C/P ISg/D$+ . . VP/J NPr+ . . ISg/#r+ NSg/VB K NSg/J . . > # > But the rest offended her — and inarguably , because it wasn’t a gesture but an # NSg/C/P D+ NSg/VB+ VP/J ISg/D$+ . VB/C ? . C/P NPr/ISg+ VPt D/P NSg/VB+ NSg/C/P D/P > emotion . She was appalled by West Egg , this unprecedented “ place ” that Broadway # N🅪Sg+ . ISg+ VLPt VP/J NSg/P NPr/VB/J+ N🅪Sg/VB+ . I/Ddem J . N🅪Sg/VB . NSg/I/C/Ddem NPr/J+ > had begotten upon a Long Island fishing village — appalled by its raw vigor that # VP VPp/J P D/P NPr/VB/J NSg/VB+ Nᴹ/Vg/J+ NSg+ . VP/J NSg/P ISg/D$+ NSg/VB/J NSg+ NSg/I/C/Ddem+ > chafed under the old euphemisms and by the too obtrusive fate that herded its # VP/J NSg/J/P D NSg/J NPl VB/C NSg/P D R J NSg/VB+ NSg/I/C/Ddem+ VP/J ISg/D$+ > inhabitants along a short - cut from nothing to nothing . She saw something awful # NPl+ P D/P NPr/VB/J/P . NSg/VBP/J P NSg/I/J+ P NSg/I/J+ . ISg+ NSg/VPt NSg/I/J+ J > in the very simplicity she failed to understand . # NPr/J/R/P D+ J/R+ N🅪Sg+ ISg+ VP/J P VB . > # > I sat on the front steps with them while they waited for their car . It was dark # ISg/#r+ NSg/VP/J J/P D+ NSg/VB/J+ NPl/V3+ P NSg/IPl+ NSg/VB/C/P IPl+ VP/J R/C/P D$+ NSg+ . NPr/ISg+ VLPt NSg/VB/J > here in front ; only the bright door sent ten square feet of light volleying out # J/R NPr/J/R/P NSg/VB/J+ . J/R/C D NPr/VB/J NSg/VB+ NSg/VP NSg NSg/VB/J NPl P N🅪Sg/VB/J+ Nᴹ/Vg/J NSg/VB/J/R/P > into the soft black morning . Sometimes a shadow moved against a dressing - room # P D NSg/J N🅪Sg/VB/J N🅪Sg/Vg/J+ . R D/P+ NSg/VB/J+ VP/J C/P D/P Nᴹ/Vg/J+ . N🅪Sg/VB/J > blind above , gave way to another shadow , an indefinite procession of shadows , # NSg/VB/J NSg/J/P . VPt NSg/J+ P I/D+ NSg/VB/J+ . D/P NSg/J NSg/VB P NPl/V3+ . > who rouged and powdered in an invisible glass . # NPr/I+ VP/J VB/C VP/J NPr/J/R/P D/P J NPr🅪Sg/VB+ . > # > “ Who is this Gatsby anyhow ? ” demanded Tom suddenly . “ Some big bootlegger ? ” # . NPr/I+ VL3 I/Ddem NPr J . . VP/J NPr/VB+ R . . I/J/R/Dq NSg/J NSg . . > # > “ Where’d you hear that ? ” I inquired . # . K ISgPl+ VB NSg/I/C/Ddem+ . . ISg/#r+ VP/J . > # > “ I didn’t hear it . I imagined it . A lot of these newly rich people are just big # . ISg/#r+ VXPt VB NPr/ISg+ . ISg/#r+ VP/J NPr/ISg+ . D/P NPr/VB P I/Ddem R NPr/VB/J+ NPl/VB+ VLB J/R NSg/J > bootleggers , you know . ” # NPl . ISgPl+ VB . . > # > “ Not Gatsby , ” I said shortly . # . NSg/R/C NPr . . ISg/#r+ VP/J R . > # > He was silent for a moment . The pebbles of the drive crunched under his feet . # NPr/ISg+ VLPt NSg/J R/C/P D/P+ NSg+ . D NPl/V3 P D N🅪Sg/VB VP/J NSg/J/P ISg/D$+ NPl+ . > # > “ Well , he certainly must have strained himself to get this menagerie together . ” # . NSg/VB/J/R . NPr/ISg+ R NSg/VXB NSg/VXB VP/J ISg+ P NSg/VB I/Ddem NSg J . . > # > A breeze stirred the gray haze of Daisy’s fur collar . # D/P+ NSg/VB+ VP D NPr🅪Sg/VB/J/Am N🅪Sg/VB P NPr$ N🅪Sg/VB/C/P+ NSg/VB+ . > # > “ At least they are more interesting than the people we know , ” she said with an # . NSg/P NSg/J/Dq IPl+ VLB NPr/I/J/R/Dq Vg/J C/P D+ NPl/VB+ IPl+ VB . . ISg+ VP/J P D/P+ > effort . # N🅪Sg/VB+ . > # > “ You didn’t look so interested . ” # . ISgPl+ VXPt NSg/VB NSg/I/J/R/C VP/J . . > # > “ Well , I was . ” # . NSg/VB/J/R . ISg/#r+ VLPt . . > # > Tom laughed and turned to me . # NPr/VB+ VP/J VB/C VP/J P NPr/ISg+ . > # > “ Did you notice Daisy’s face when that girl asked her to put her under a cold # . VXPt ISgPl+ NSg/VB NPr$ NSg/VB+ NSg/I/C NSg/I/C/Ddem NSg/VB+ VP/J ISg/D$+ P NSg/VBP ISg/D$+ NSg/J/P D/P NSg/J > shower ? ” # NSg/VB+ . . > # > Daisy began to sing with the music in a husky , rythmic whisper , bringing out a # NPr+ VPt P NSg/VB/J P D+ N🅪Sg/VB/J+ NPr/J/R/P D/P NSg/J . ? NSg/VB . Nᴹ/Vg/J NSg/VB/J/R/P D/P > meaning in each word that it had never had before and would never have again . # N🅪Sg/Vg/J+ NPr/J/R/P Dq NSg/VB+ NSg/I/C/Ddem+ NPr/ISg+ VP R VP C/P VB/C VXB R NSg/VXB P . > When the melody rose her voice broke up sweetly , following it , in a way # NSg/I/C D NPr🅪Sg NPr/VPt/J ISg/D$+ NSg/VB+ NSg/VPt/J NSg/VB/J/P R . N🅪Sg/Vg/J/P NPr/ISg+ . NPr/J/R/P D/P NSg/J+ > contralto voices have , and each change tipped out a little of her warm human # NSg NPl/V3+ NSg/VXB . VB/C Dq N🅪Sg/VB+ VP NSg/VB/J/R/P D/P NPr/I/J/Dq P ISg/D$+ NSg/VB/J NSg/VB/J > magic upon the air . # N🅪Sg/VB/J+ P D N🅪Sg/VB+ . > # > “ Lots of people come who haven’t been invited , ” she said suddenly . “ That girl # . NPl/V3 P NPl/VB+ NSg/VBPp/P NPr/I+ VXB NSg/VLPp NSg/VP/J . . ISg+ VP/J R . . NSg/I/C/Ddem NSg/VB+ > hadn’t been invited . They simply force their way in and he’s too polite to # VPt NSg/VLPp NSg/VP/J . IPl+ R N🅪Sg/VB D$+ NSg/J+ NPr/J/R/P VB/C NPr$ R VB/J P > object . ” # NSg/VB . . > # > “ I’d like to know who he is and what he does , ” insisted Tom . “ And I think I’ll # . K NSg/VB/J/C/P P VB NPr/I+ NPr/ISg+ VL3 VB/C NSg/I+ NPr/ISg+ NPl/VX3 . . VP/J NPr/VB+ . . VB/C ISg/#r+ NSg/VB K > make a point of finding out . ” # NSg/VB D/P NSg/VB+ P Nᴹ/Vg/J NSg/VB/J/R/P . . > # > “ I can tell you right now , ” she answered . “ He owned some drug - stores , a lot of # . ISg/#r+ NPr/VXB NPr/VB ISgPl+ NPr/VB/J NSg/J/R/C . . ISg+ VP/J . . NPr/ISg+ VP/J I/J/R/Dq NSg/VB+ . NPl/V3 . D/P NPr/VB P > drug - stores . He built them up himself . ” # NSg/VB+ . NPl/V3+ . NPr/ISg+ VP/J NSg/IPl+ NSg/VB/J/P ISg+ . . > # > The dilatory limousine came rolling up the drive . # D J NSg NSg/VPt/P Nᴹ/Vg/J NSg/VB/J/P D N🅪Sg/VB+ . > # > “ Good night , Nick , ” said Daisy . # . NPr/VB/J N🅪Sg/VB+ . NPr/VB+ . . VP/J NPr+ . > # > Her glance left me and sought the lighted top of the steps , where “ Three o’Clock # ISg/D$+ NSg/VB+ NPr/VP/J NPr/ISg+ VB/C VP D VP/J NSg/VB/J P D+ NPl/V3+ . NSg/R/C . NSg R > in the Morning , ” a neat , sad little waltz of that year , was drifting out the # NPr/J/R/P D+ N🅪Sg/Vg/J+ . . D/P J . NSg/VB/J NPr/I/J/Dq NSg/VB P NSg/I/C/Ddem NSg+ . VLPt Nᴹ/Vg/J NSg/VB/J/R/P D > open door . After all , in the very casualness of Gatsby’s party there were # NSg/VB/J NSg/VB+ . P NSg/I/J/C/Dq . NPr/J/R/P D J/R Nᴹ P NPr$ NSg/VB/J+ R+ NSg/VLPt > romantic possibilities totally absent from her world . What was it up there in # NSg/J NPl+ R NSg/VB/J/P P ISg/D$+ NSg/VB+ . NSg/I+ VLPt NPr/ISg+ NSg/VB/J/P R NPr/J/R/P > the song that seemed to be calling her back inside ? What would happen now in the # D+ N🅪Sg+ NSg/I/C/Ddem+ VP/J P NSg/VLXB Nᴹ/Vg/J ISg/D$+ NSg/VB/J NSg/J/P . NSg/I+ VXB VB NSg/J/R/C NPr/J/R/P D > dim , incalculable hours ? Perhaps some unbelievable guest would arrive , a person # NSg/VB/J . J NPl+ . NSg/R I/J/R/Dq+ J+ NSg/VB+ VXB VB . D/P+ NSg/VB+ > infinitely rare and to be marvelled at , some authentically radiant young girl # R NSg/VB/J VB/C P NSg/VLXB VP/Comm NSg/P . I/J/R/Dq R NSg/J NPr/VB/J NSg/VB+ > who with one fresh glance at Gatsby , one moment of magical encounter , would blot # NPr/I+ P NSg/I/J NSg/VB/J NSg/VB+ NSg/P NPr . NSg/I/J NSg P J NSg/VB+ . VXB NSg/VB > out those five years of unwavering devotion . # NSg/VB/J/R/P I/Ddem NSg NPl P J NSg+ . > # > I stayed late that night , Gatsby asked me to wait until he was free , and I # ISg/#r+ VP/J NSg/J NSg/I/C/Ddem N🅪Sg/VB+ . NPr VP/J NPr/ISg+ P NSg/VB C/P NPr/ISg+ VLPt NSg/VB/J . VB/C ISg/#r+ > lingered in the garden until the inevitable swimming party had run up , chilled # VP/J NPr/J/R/P D NSg/VB/J+ C/P D NSg/J NSg/Vg NSg/VB/J+ VP NSg/VBPp NSg/VB/J/P . VP/J > and exalted , from the black beach , until the lights were extinguished in the # VB/C VP/J . P D N🅪Sg/VB/J NPr/VB+ . C/P D NPl/V3+ NSg/VLPt VP/J NPr/J/R/P D > guest - rooms overhead . When he came down the steps at last the tanned skin was # NSg/VB+ . NPl/V3+ NSg/J/P+ . NSg/I/C NPr/ISg+ NSg/VPt/P N🅪Sg/VB/J/P D+ NPl/V3+ NSg/P NSg/VB/J+ D+ VP/J+ N🅪Sg/VB+ VLPt > drawn unusually tight on his face , and his eyes were bright and tired . # VPp/J R VB/J J/P ISg/D$+ NSg/VB+ . VB/C ISg/D$+ NPl/V3+ NSg/VLPt NPr/VB/J VB/C VP/J . > # > “ She didn’t like it , ” he said immediately . # . ISg+ VXPt NSg/VB/J/C/P NPr/ISg+ . . NPr/ISg+ VP/J R . > # > “ Of course she did . ” # . P NSg/VB+ ISg+ VXPt . . > # > “ She didn’t like it , ” he insisted . “ She didn’t have a good time . ” # . ISg+ VXPt NSg/VB/J/C/P NPr/ISg+ . . NPr/ISg+ VP/J . . ISg+ VXPt NSg/VXB D/P NPr/VB/J N🅪Sg/VB/J+ . . > # > He was silent , and I guessed at his unutterable depression . # NPr/ISg+ VLPt NSg/J . VB/C ISg/#r+ VP/J NSg/P ISg/D$+ NSg/J NSg+ . > # > “ I feel far away from her , ” he said . “ It’s hard to make her understand . ” # . ISg/#r+ NSg/I/VB NSg/VB/J VB/J P ISg/D$+ . . NPr/ISg+ VP/J . . K N🅪Sg/J/R P NSg/VB ISg/D$+ VB . . > # > “ You mean about the dance ? ” # . ISgPl+ NSg/VB/J J/P D+ N🅪Sg/VB+ . . > # > “ The dance ? ” He dismissed all the dances he had given with a snap of his # . D+ N🅪Sg/VB+ . . NPr/ISg+ VP/J NSg/I/J/C/Dq+ D+ NPl/V3+ NPr/ISg+ VP NSg/VPp/J/P P D/P NSg/VB/J P ISg/D$+ > fingers . “ Old sport , the dance is unimportant . ” # NPl/V3+ . . NSg/J+ NSg/VB+ . D+ N🅪Sg/VB+ VL3 J . . > # > He wanted nothing less of Daisy than that she should go to Tom and say : “ I never # NPr/ISg+ VP/J NSg/I/J+ VB/J/R/C/P P NPr+ C/P NSg/I/C/Ddem ISg+ VXB NSg/VB/J P NPr/VB+ VB/C NSg/VB . . ISg/#r+ R > loved you . ” After she had obliterated four years with that sentence they could # VP/J ISgPl+ . . P ISg+ VP VP/J NSg NPl P NSg/I/C/Ddem NSg/VB+ IPl+ NSg/VXB > decide upon the more practical measures to be taken . One of them was that , after # VB P D NPr/I/J/R/Dq NSg/J NPl/V3 P NSg/VLXB VPp/J . NSg/I/J P NSg/IPl+ VLPt NSg/I/C/Ddem+ . P > she was free , they were to go back to Louisville and be married from her # ISg+ VLPt NSg/VB/J . IPl+ NSg/VLPt P NSg/VB/J NSg/VB/J P NPr VB/C NSg/VLXB NSg/VP/J P ISg/D$+ > house — just as if it were five years ago . # NPr/VB+ . J/R R/C/P NSg/C NPr/ISg+ NSg/VLPt NSg NPl+ J/P . > # > “ And she doesn’t understand , ” he said . “ She used to be able to understand . We’d # . VB/C ISg+ VX3 VB . . NPr/ISg+ VP/J . . ISg+ VP/J P NSg/VLXB NSg/VB/J P VB . K > sit for hours — ” # NSg/VB R/C/P NPl+ . . > # > He broke off and began to walk up and down a desolate path of fruit rinds and # NPr/ISg+ NSg/VPt/J NSg/VB/J/P VB/C VPt P NSg/VB NSg/VB/J/P VB/C N🅪Sg/VB/J/P D/P VB/J NSg/VB P N🅪Sg/VB+ NPl/V3 VB/C > discarded favors and crushed flowers . # VP/J NPl/V3/Am+ VB/C VP/J NPrPl/V3+ . > # > “ I wouldn’t ask too much of her , ” I ventured . “ You can’t repeat the past . ” # . ISg/#r+ VXB NSg/VB R NSg/I/J/R/Dq P ISg/D$+ . . ISg/#r+ VP/J . . ISgPl+ VXB NSg/VB D NSg/VB/J/P . . > # > “ Can’t repeat the past ? ” he cried incredulously . “ Why of course you can ! ” # . VXB NSg/VB D NSg/VB/J/P . . NPr/ISg+ VP/J R . . NSg/VB P NSg/VB+ ISgPl+ NPr/VXB . . > # > He looked around him wildly , as if the past were lurking here in the shadow of # NPr/ISg+ VP/J J/P ISg+ R . R/C/P NSg/C D NSg/VB/J/P NSg/VLPt Nᴹ/Vg/J J/R NPr/J/R/P D NSg/VB/J P > his house , just out of reach of his hand . # ISg/D$+ NPr/VB+ . J/R NSg/VB/J/R/P P NSg/VB P ISg/D$+ NSg/VB+ . > # > “ I’m going to fix everything just the way it was before , ” he said , nodding # . K Nᴹ/Vg/J P NSg/VB NSg/I/VB+ J/R D NSg/J+ NPr/ISg+ VLPt C/P . . NPr/ISg+ VP/J . NSg/VP/J > determinedly . “ She’ll see . ” # R . . K NSg/VB . . > # > He talked a lot about the past , and I gathered that he wanted to recover # NPr/ISg+ VP/J D/P+ NPr/VB+ J/P D NSg/VB/J/P . VB/C ISg/#r+ VP/J NSg/I/C/Ddem NPr/ISg+ VP/J P N🅪Sg/VB/J > something , some idea of himself perhaps , that had gone into loving Daisy . His # NSg/I/J+ . I/J/R/Dq NSg P ISg+ NSg/R . NSg/I/C/Ddem+ VP VPp/J/P P Nᴹ/Vg/J+ NPr+ . ISg/D$+ > life had been confused and disordered since then , but if he could once return to # N🅪Sg/VB+ VP NSg/VLPp VP/J VB/C VP/J C/P NSg/J/R/C . NSg/C/P NSg/C NPr/ISg+ NSg/VXB NSg/C NSg/VB P > a certain starting place and go over it all slowly , he could find out what that # D/P I/J Nᴹ/Vg/J+ N🅪Sg/VB+ VB/C NSg/VB/J NSg/J/P NPr/ISg+ NSg/I/J/C/Dq R . NPr/ISg+ NSg/VXB NSg/VB NSg/VB/J/R/P NSg/I+ NSg/I/C/Ddem > thing was . . . . # NSg+ VLPt . . . . > # > . . . One autumn night , five years before , they had been walking down the street # . . . NSg/I/J+ NPr🅪Sg/VB+ N🅪Sg/VB+ . NSg+ NPl+ C/P . IPl+ VP NSg/VLPp Nᴹ/Vg/J N🅪Sg/VB/J/P D+ NSg/VB/J+ > when the leaves were falling , and they came to a place where there were no trees # NSg/I/C D+ NPl/V3+ NSg/VLPt Nᴹ/Vg/J . VB/C IPl+ NSg/VPt/P P D/P+ N🅪Sg/VB+ NSg/R/C R+ NSg/VLPt NSg/Dq/P NPl/V3 > and the sidewalk was white with moonlight . They stopped here and turned toward # VB/C D+ NSg+ VLPt NPr🅪Sg/VB/J P N🅪Sg/VB+ . IPl+ VP/J J/R VB/C VP/J J/P > each other . Now it was a cool night with that mysterious excitement in it which # Dq NSg/VB/J . NSg/J/R/C NPr/ISg+ VLPt D/P NSg/VB/J N🅪Sg/VB P NSg/I/C/Ddem+ J+ NSg+ NPr/J/R/P NPr/ISg+ I/C+ > comes at the two changes of the year . The quiet lights in the houses were # NPl/V3 NSg/P D NSg NPl/V3 P D+ NSg+ . D N🅪Sg/VB/J NPl/V3+ NPr/J/R/P D+ NPl/V3+ NSg/VLPt > humming out into the darkness and there was a stir and bustle among the stars . # NSg/Vg/J NSg/VB/J/R/P P D+ Nᴹ+ VB/C R+ VLPt D/P NSg/VB VB/C NSg/VB P D+ NPl/V3+ . > Out of the corner of his eye Gatsby saw that the blocks of the sidewalks really # NSg/VB/J/R/P P D NSg/VB P ISg/D$+ NSg/VB+ NPr NSg/VPt NSg/I/C/Ddem D NPl/V3 P D NPl+ R > formed a ladder and mounted to a secret place above the trees — he could climb to # VP/J D/P NSg/VB+ VB/C VP/J P D/P NSg/VB/J N🅪Sg/VB+ NSg/J/P D NPl/V3+ . NPr/ISg+ NSg/VXB NSg/VB P > it , if he climbed alone , and once there he could suck on the pap of life , gulp # NPr/ISg+ . NSg/C NPr/ISg+ VP/J J . VB/C NSg/C R+ NPr/ISg+ NSg/VXB NSg/VB J/P D NSg/VB/J P N🅪Sg/VB+ . NSg/VB > down the incomparable milk of wonder . # N🅪Sg/VB/J/P D NSg/J N🅪Sg/VB P N🅪Sg/VB+ . > # > His heart beat faster and faster as Daisy’s white face came up to his own . He # ISg/D$+ N🅪Sg/VB+ N🅪Sg/VB/J NSg/JC VB/C NSg/JC R/C/P NPr$ NPr🅪Sg/VB/J+ NSg/VB+ NSg/VPt/P NSg/VB/J/P P ISg/D$+ NSg/VB/J . NPr/ISg+ > knew that when he kissed this girl , and forever wed his unutterable visions to # VPt NSg/I/C/Ddem NSg/I/C NPr/ISg+ VP/J I/Ddem+ NSg/VB+ . VB/C NSg/J NSg/VB ISg/D$+ NSg/J NPl/V3+ P > her perishable breath , his mind would never romp again like the mind of God . So # ISg/D$+ NSg/J N🅪Sg/VB/J+ . ISg/D$+ NSg/VB+ VXB R NSg/VB P NSg/VB/J/C/P D NSg/VB P NPr/VB+ . NSg/I/J/R/C > he waited , listening for a moment longer to the tuning - fork that had been struck # NPr/ISg+ VP/J . Nᴹ/Vg/J R/C/P D/P+ NSg+ NSg/JC P D+ Nᴹ/Vg/J+ . NSg/VB+ NSg/I/C/Ddem+ VP NSg/VLPp VB > upon a star . Then he kissed her . At his lips ’ touch she blossomed for him like a # P D/P+ NSg/VB+ . NSg/J/R/C NPr/ISg+ VP/J ISg/D$+ . NSg/P ISg/D$+ NPl/V3+ . N🅪Sg/VB ISg+ VP/J R/C/P ISg+ NSg/VB/J/C/P D/P > flower and the incarnation was complete . # NSg/VB+ VB/C D NSg/J VLPt NSg/VB/J . > # > Through all he said , even through his appalling sentimentality , I was reminded # NSg/J/P NSg/I/J/C/Dq NPr/ISg+ VP/J . NSg/VB/J/R NSg/J/P ISg/D$+ Nᴹ/Vg/J Nᴹ+ . ISg/#r+ VLPt VP/J > of something — an elusive rhythm , a fragment of lost words , that I had heard # P NSg/I/J+ . D/P J N🅪Sg/VB+ . D/P NSg/VB P VP/J NPl/V3+ . NSg/I/C/Ddem ISg/#r+ VP VP/J > somewhere a long time ago . For a moment a phrase tried to take shape in my mouth # NSg D/P NPr/VB/J N🅪Sg/VB/J+ J/P . R/C/P D/P+ NSg+ D/P+ NSg/VB+ VP/J P NSg/VB N🅪Sg/VB+ NPr/J/R/P D$+ NSg/VB+ > and my lips parted like a dumb man’s , as though there was more struggling upon # VB/C D$+ NPl/V3+ VP/J NSg/VB/J/C/P D/P VB/J NPr$/I/VB/J . R/C/P C R+ VLPt NPr/I/J/R/Dq Nᴹ/Vg/J P > them than a wisp of startled air . But they made no sound , and what I had almost # NSg/IPl+ C/P D/P NSg/VB P VP/J N🅪Sg/VB+ . NSg/C/P IPl+ VP NSg/Dq/P+ N🅪Sg/VB/J+ . VB/C NSg/I+ ISg/#r+ VP R > remembered was uncommunicable forever . # VP/J VLPt ? NSg/J . > # > CHAPTER VII # HeadingStart NSg/VB+ NSg/#r > # > It was when curiosity about Gatsby was at its highest that the lights in his # NPr/ISg+ VLPt NSg/I/C NSg+ J/P NPr VLPt NSg/P ISg/D$+ JS NSg/I/C/Ddem D NPl/V3+ NPr/J/R/P ISg/D$+ > house failed to go on one Saturday night — and , as obscurely as it had begun , his # NPr/VB+ VP/J P NSg/VB/J J/P NSg/I/J NSg/VB+ N🅪Sg/VB+ . VB/C . R/C/P R R/C/P NPr/ISg+ VP VPp . ISg/D$+ > career as Trimalchio was over . Only gradually did I become aware that the # NSg/VB/J+ R/C/P ? VLPt NSg/J/P . J/R/C R VXPt ISg/#r+ VBPp VB/J NSg/I/C/Ddem D > automobiles which turned expectantly into his drive stayed for just a minute and # NPl/V3 I/C+ VP/J R P ISg/D$+ N🅪Sg/VB VP/J R/C/P J/R D/P NSg/VB/J+ VB/C > then drove sulkily away . Wondering if he were sick I went over to find out — an # NSg/J/R/C NSg/VPt R VB/J . Nᴹ/Vg/J NSg/C NPr/ISg+ NSg/VLPt NSg/VB/J ISg/#r+ NSg/VPt NSg/J/P P NSg/VB NSg/VB/J/R/P . D/P > unfamiliar butler with a villainous face squinted at me suspiciously from the # NSg/J NPr/VB P D/P J NSg/VB+ VP/J NSg/P NPr/ISg+ R P D > door . # NSg/VB+ . > # > “ Is Mr . Gatsby sick ? ” # . VL3 NSg+ . NPr NSg/VB/J . . > # > “ Nope . ” After a pause he added “ sir ’ ’ in a dilatory , grudging way . # . NSg/VB . . P D/P+ NSg/VB+ NPr/ISg+ VP/J . NPr/VB+ . . NPr/J/R/P D/P J . Nᴹ/Vg/J NSg/J+ . > # > “ I hadn’t seen him around , and I was rather worried . Tell him Mr . Carraway came # . ISg/#r+ VPt NSg/VPp ISg+ J/P . VB/C ISg/#r+ VLPt NPr/VB/J/R VP/J . NPr/VB ISg+ NSg+ . ? NSg/VPt/P > over . ” # NSg/J/P . . > # > “ Who ? ” he demanded rudely . # . NPr/I+ . . NPr/ISg+ VP/J R . > # > “ Carraway . ” # . ? . . > # > “ Carraway . All right , I'll tell him . ” # . ? . NSg/I/J/C/Dq NPr/VB/J . K NPr/VB ISg+ . . > # > Abruptly he slammed the door . # R NPr/ISg+ VP/J D+ NSg/VB+ . > # > My Finn informed me that Gatsby had dismissed every servant in his house a week # D$+ NPr+ VP/J NPr/ISg+ NSg/I/C/Ddem NPr VP VP/J Dq NSg/VB+ NPr/J/R/P ISg/D$+ NPr/VB D/P NSg/J+ > ago and replaced them with half a dozen others , who never went into West Egg # J/P VB/C VP/J NSg/IPl+ P N🅪Sg/J/P+ D/P NSg NPl/V3+ . NPr/I+ R NSg/VPt P NPr/VB/J+ N🅪Sg/VB+ > Village to be bribed by the tradesmen , but ordered moderate supplies over the # NSg+ P NSg/VLXB VP/J NSg/P D NPl . NSg/C/P VP/J NSg/VB/J NPl/V3+ NSg/J/P D > telephone . The grocery boy reported that the kitchen looked like a pigsty , and # NSg/VB+ . D+ NSg/VB+ NSg/VB+ VP/J NSg/I/C/Ddem D+ NSg/VB+ VP/J NSg/VB/J/C/P D/P+ NSg+ . VB/C > the general opinion in the village was that the new people weren’t servants at # D NSg/VB/J N🅪Sg NPr/J/R/P D+ NSg+ VLPt NSg/I/C/Ddem D NSg/J NPl/VB+ VPt NPl/V3+ NSg/P > all . # NSg/I/J/C/Dq . > # > Next day Gatsby called me on the phone . # NSg/J/P+ NPr🅪Sg+ NPr VP/J NPr/ISg+ J/P D NSg/VB+ . > # > “ Going away ? ” I inquired . # . Nᴹ/Vg/J VB/J . . ISg/#r+ VP/J . > # > “ No , old sport . ” # . NSg/Dq/P . NSg/J+ NSg/VB+ . . > # > “ I hear you fired all your servants . ” # . ISg/#r+ VB ISgPl+ J NSg/I/J/C/Dq+ D$+ NPl/V3+ . . > # > “ I wanted somebody who wouldn’t gossip . Daisy comes over quite often — in the # . ISg/#r+ VP/J NSg/I+ NPr/I+ VXB N🅪Sg/VB+ . NPr+ NPl/V3 NSg/J/P R R . NPr/J/R/P D > afternoons . ” # NPl . . > # > So the whole caravansary had fallen in like a card house at the disapproval in # NSg/I/J/R/C D NSg/J NSg VP VPp/J NPr/J/R/P NSg/VB/J/C/P D/P N🅪Sg/VB+ NPr/VB+ NSg/P D N🅪Sg NPr/J/R/P > her eyes . # ISg/D$+ NPl/V3+ . > # > “ They’re some people Wolfshiem wanted to do something for . They’re all brothers # . K I/J/R/Dq+ NPl/VB+ ? VP/J P VXB NSg/I/J+ R/C/P . K NSg/I/J/C/Dq NPl/V3 > and sisters . They used to run a small hotel . ” # VB/C NPl/V3+ . IPl+ VP/J P NSg/VBPp D/P+ NPr/VB/J+ NSg+ . . > # > “ I see . ” # . ISg/#r+ NSg/VB . . > # > He was calling up at Daisy’s request — would I come to lunch at her house # NPr/ISg+ VLPt Nᴹ/Vg/J NSg/VB/J/P NSg/P NPr$ NSg/VB+ . VXB ISg/#r+ NSg/VBPp/P P N🅪Sg/VB NSg/P ISg/D$+ NPr/VB+ > to - morrow ? Miss Baker would be there . Half an hour later Daisy herself # P . NPr/VB . NSg/VB NPr+ VXB NSg/VLXB R . N🅪Sg/J/P+ D/P+ NSg+ JC NPr ISg+ > telephoned and seemed relieved to find that I was coming . Something was up . And # VP/J VB/C VP/J VP/J P NSg/VB NSg/I/C/Ddem ISg/#r+ VLPt Nᴹ/Vg/J . NSg/I/J+ VLPt NSg/VB/J/P . VB/C > yet I couldn’t believe that they would choose this occasion for a # NSg/VB/C ISg/#r+ VXB VB NSg/I/C/Ddem IPl+ VXB NSg/VB/C I/Ddem NSg/VB+ R/C/P D/P > scene — especially for the rather harrowing scene that Gatsby had outlined in the # NSg/VB+ . R R/C/P D NPr/VB/J/R Nᴹ/Vg/J NSg/VB NSg/I/C/Ddem+ NPr VP VP/J NPr/J/R/P D > garden . # NSg/VB/J+ . > # > The next day was broiling , almost the last , certainly the warmest , of the # D+ NSg/J/P+ NPr🅪Sg+ VLPt Nᴹ/Vg/J . R D NSg/VB/J . R D JS . P D > summer . As my train emerged from the tunnel into sunlight , only the hot whistles # NPr🅪Sg/VB+ . R/C/P D$+ NSg/VB+ VP/J P D+ NSg/VB+ P NSg/VB+ . J/R/C D NSg/VB/J NPl/V3 > of the National Biscuit Company broke the simmering hush at noon . The straw # P D NSg/J NSg N🅪Sg+ NSg/VPt/J D Nᴹ/Vg/J NSg/VB+ NSg/P NSg/VB+ . D N🅪Sg/VB/J+ > seats of the car hovered on the edge of combustion ; the woman next to me # NPl/V3 P D+ NSg+ VP/J J/P D NSg/VB P Nᴹ . D NSg/VB+ NSg/J/P P NPr/ISg+ > perspired delicately for a while into her white shirtwaist , and then , as her # VP/J R R/C/P D/P NSg/VB/C/P+ P ISg/D$+ NPr🅪Sg/VB/J NSg . VB/C NSg/J/R/C . R/C/P ISg/D$+ > newspaper dampened under her fingers , lapsed despairingly into deep heat with a # N🅪Sg/VB+ VP/J NSg/J/P ISg/D$+ NPl/V3+ . VP/J R P NSg/J Nᴹ/VB+ P D/P > desolate cry . Her pocket - book slapped to the floor . # VB/J NSg/VB+ . ISg/D$+ NSg/VB/J+ . NSg/VB VP P D+ NSg/VB+ . > # > “ Oh , my ! ” she gasped . # . NPr/VB . D$+ . . ISg+ VP/J . > # > I picked it up with a weary bend and handed it back to her , holding it at arm’s # ISg/#r+ VP/J NPr/ISg+ NSg/VB/J/P P D/P+ VB/J+ NPr/VB+ VB/C VP/J NPr/ISg+ NSg/VB/J P ISg/D$+ . Nᴹ/Vg/J NPr/ISg+ NSg/P K > length and by the extreme tip of the corners to indicate that I had no designs # N🅪Sg/VB+ VB/C NSg/P D NSg/J NSg/VB P D NPl/V3+ P VB NSg/I/C/Ddem ISg/#r+ VP NSg/Dq/P NPl/V3+ > upon it — but every one near by , including the woman , suspected me just the same . # P NPr/ISg+ . NSg/C/P Dq NSg/I/J+ NSg/VB/J/P NSg/P . Nᴹ/Vg/J D NSg/VB+ . VP/J NPr/ISg+ J/R D I/J . > # > “ Hot ! ” said the conductor to familiar faces . “ Some weather ! . . . Hot ! . . . # . NSg/VB/J . . VP/J D NSg P NSg/J NPl/V3+ . . I/J/R/Dq+ Nᴹ/VB/J+ . . . . NSg/VB/J . . . . > Hot ! . . . Hot ! . . . Is it hot enough for you ? Is it hot ? Is it . . . ? ” # NSg/VB/J . . . . NSg/VB/J . . . . VL3 NPr/ISg+ NSg/VB/J NSg/I R/C/P ISgPl+ . VL3 NPr/ISg+ NSg/VB/J . VL3 NPr/ISg+ . . . . . > # > My commutation ticket came back to me with a dark stain from his hand . That any # D$+ NSg NSg/VB+ NSg/VPt/P NSg/VB/J P NPr/ISg+ P D/P NSg/VB/J NSg/VB+ P ISg/D$+ NSg/VB+ . NSg/I/C/Ddem I/R/Dq+ > one should care in this heat whose flushed lips he kissed , whose head made damp # NSg/I/J+ VXB N🅪Sg/VB NPr/J/R/P I/Ddem+ Nᴹ/VB+ I+ VP/J NPl/V3+ NPr/ISg+ VP/J . I+ NPr/VB/J+ VP Nᴹ/VB/J > the pajama pocket over his heart ! # D NSg NSg/VB/J+ NSg/J/P ISg/D$+ N🅪Sg/VB+ . > # > . . . Through the hall of the Buchanans ’ house blew a faint wind , carrying the # . . . NSg/J/P D NPr P D ? . NPr/VB+ NSg/VPt/J D/P NSg/VB/J N🅪Sg/VB+ . Nᴹ/Vg/J D > sound of the telephone bell out to Gatsby and me as we waited at the door . # N🅪Sg/VB/J P D NSg/VB+ NPr/VB+ NSg/VB/J/R/P P NPr VB/C NPr/ISg+ R/C/P IPl+ VP/J NSg/P D NSg/VB+ . > # > “ The master’s body ! ” roared the butler into the mouthpiece . “ I’m sorry , madame , # . D NSg NSg/VB+ . . VP/J D NPr/VB P D NSg+ . . K NSg/VB/J . NSg+ . > but we can’t furnish it — it’s far too hot to touch this noon ! ” # NSg/C/P IPl+ VXB NSg/VB NPr/ISg+ . K NSg/VB/J R NSg/VB/J P N🅪Sg/VB I/Ddem NSg/VB+ . . > # > What he really said was : “ Yes . . . Yes . . . I’ll see . ” # NSg/I+ NPr/ISg+ R VP/J VLPt . . NPl/VB . . . NPl/VB . . . K NSg/VB . . > # > He set down the receiver and came toward us , glistening slightly , to take our # NPr/ISg+ NPr/VBP/J N🅪Sg/VB/J/P D+ NSg+ VB/C NSg/VPt/P J/P NPr/IPl+ . Nᴹ/Vg/J R . P NSg/VB D$+ > stiff straw hats . # NSg/VB/J N🅪Sg/VB/J+ NPl/V3+ . > # > “ Madame expects you in the salon ! ” he cried , needlessly indicating the # . NSg+ V3 ISgPl+ NPr/J/R/P D+ NSg+ . . NPr/ISg+ VP/J . R Nᴹ/Vg/J D > direction . In this heat every extra gesture was an affront to the common store # N🅪Sg+ . NPr/J/R/P I/Ddem+ Nᴹ/VB+ Dq+ NSg/J+ NSg/VB+ VLPt D/P NSg/VB P D NSg/VB/J NSg/VB > of life . # P N🅪Sg/VB+ . > # > The room , shadowed well with awnings , was dark and cool . Daisy and Jordan lay # D+ N🅪Sg/VB/J+ . VP/J NSg/VB/J/R P NPl/V3 . VLPt NSg/VB/J VB/C NSg/VB/J . NPr VB/C NPr+ NSg/VBPt/J > upon an enormous couch , like silver idols weighing down their own white dresses # P D/P+ J+ NSg/VB+ . NSg/VB/J/C/P Nᴹ/VB/J+ NPl+ Nᴹ/Vg/J N🅪Sg/VB/J/P D$+ NSg/VB/J NPr🅪Sg/VB/J NPl/V3+ > against the singing breeze of the fans . # C/P D Nᴹ/Vg/J NSg/VB P D NPl/V3+ . > # > “ We can’t move , ” they said together . # . IPl+ VXB NSg/VB . . IPl+ VP/J J . > # > Jordan’s fingers , powdered white over their tan , rested for a moment in mine . # NPr$ NPl/V3+ . VP/J NPr🅪Sg/VB/J NSg/J/P D$+ NSg/VB/J+ . VP/J R/C/P D/P NSg+ NPr/J/R/P NSg/I/VB+ . > # > “ And Mr . Thomas Buchanan , the athlete ? ” I inquired . # . VB/C NSg+ . NPr+ NPr+ . D+ NSg+ . . ISg/#r+ VP/J . > # > Simultaneously I heard his voice , gruff , muffled , husky , at the hall telephone . # R ISg/#r+ VP/J ISg/D$+ NSg/VB+ . NSg/VB/J . VP/J . NSg/J . NSg/P D NPr+ NSg/VB+ . > # > Gatsby stood in the centre of the crimson carpet and gazed around with # NPr VP NPr/J/R/P D NSg/VB/Comm P D NSg/VB/J NSg/VB+ VB/C VP/J J/P P > fascinated eyes . Daisy watched him and laughed , her sweet , exciting laugh ; a # VP/J NPl/V3+ . NPr+ VP/J ISg+ VB/C VP/J . ISg/D$+ NPr/VB/J . Nᴹ/Vg/J+ NSg/VB+ . D/P > tiny gust of powder rose from her bosom into the air . # NSg/J NSg/VB P N🅪Sg/VB+ NPr/VPt/J P ISg/D$+ NSg/VB/J+ P D N🅪Sg/VB+ . > # > “ The rumor is , ” whispered Jordan , “ that that’s Tom’s girl on the telephone . ” # . D+ N🅪Sg/VB/Am+ VL3 . . VP/J NPr+ . . NSg/I/C/Ddem+ NSg$ NPr$ NSg/VB+ J/P D NSg/VB+ . . > # > We were silent . The voice in the hall rose high with annoyance : “ Very well , # IPl+ NSg/VLPt NSg/J . D NSg/VB+ NPr/J/R/P D+ NPr+ NPr/VPt/J NSg/VB/J/R P N🅪Sg . . J/R NSg/VB/J/R . > then , I won’t sell you the car at all . . . . I’m under no obligations to you at # NSg/J/R/C . ISg/#r+ VXB NSg/VB ISgPl+ D NSg+ NSg/P NSg/I/J/C/Dq . . . . K NSg/J/P NSg/Dq/P NPl+ P ISgPl+ NSg/P > all . . . and as for your bothering me about it at lunch time , I won’t stand # NSg/I/J/C/Dq . . . VB/C R/C/P R/C/P D$+ Nᴹ/Vg/J NPr/ISg+ J/P NPr/ISg+ NSg/P N🅪Sg/VB+ N🅪Sg/VB/J+ . ISg/#r+ VXB NSg/VB > that at all ! ” # NSg/I/C/Ddem NSg/P NSg/I/J/C/Dq . . > # > “ Holding down the receiver , ” said Daisy cynically . # . Nᴹ/Vg/J N🅪Sg/VB/J/P D+ NSg+ . . VP/J NPr+ R . > # > “ No , he’s not , ” I assured her . “ It’s a bona - fide deal . I happen to know about # . NSg/Dq/P . NPr$ NSg/R/C . . ISg/#r+ NSg/VP/J ISg/D$+ . . K D/P ? . ? NSg/VB/J+ . ISg/#r+ VB P VB J/P > it . ” # NPr/ISg+ . . > # > Tom flung open the door , blocked out its space for a moment with his thick body , # NPr/VB+ VB NSg/VB/J+ D+ NSg/VB+ . VP/J NSg/VB/J/R/P ISg/D$+ N🅪Sg/VB+ R/C/P D/P NSg+ P ISg/D$+ NSg/VB/J+ NSg/VB+ . > and hurried into the room . # VB/C VP/J P D+ N🅪Sg/VB/J+ . > # > “ Mr . Gatsby ! ” He put out his broad , flat hand with well - concealed dislike . “ I’m # . NSg+ . NPr . . NPr/ISg+ NSg/VBP NSg/VB/J/R/P ISg/D$+ NSg/J . NSg/VB/J+ NSg/VB+ P NSg/VB/J/R . VP/J NSg/VB/J/C/P . . K > glad to see you , sir . . . . Nick . . . . ” # NSg/VB/J P NSg/VB ISgPl+ . NPr/VB+ . . . . NPr/VB+ . . . . . > # > “ Make us a cold drink , ” cried Daisy . # . NSg/VB NPr/IPl+ D/P+ NSg/J+ NSg/VB+ . . VP/J NPr+ . > # > As he left the room again she got up and went over to Gatsby and pulled his face # R/C/P NPr/ISg+ NPr/VP/J D+ N🅪Sg/VB/J+ P ISg+ VP NSg/VB/J/P VB/C NSg/VPt NSg/J/P P NPr VB/C VP/J ISg/D$+ NSg/VB+ > down , kissing him on the mouth . # N🅪Sg/VB/J/P . Nᴹ/Vg/J ISg+ J/P D NSg/VB+ . > # > “ You know I love you , ” she murmured . # . ISgPl+ VB ISg/#r+ NPr🅪Sg/VB ISgPl+ . . ISg+ VP/J . > # > “ You forget there’s a lady present , ” said Jordan . # . ISgPl+ VB K D/P NPr/VB+ NSg/VB/J . . VP/J NPr+ . > # > Daisy looked around doubtfully . # NPr+ VP/J J/P R . > # > “ You kiss Nick too . ” # . ISgPl+ NSg/VB NPr/VB+ R . . > # > “ What a low , vulgar girl ! ” # . NSg/I+ D/P NSg/VB/J/R . NSg/J NSg/VB+ . . > # > “ I don’t care ! ” cried Daisy , and began to clog on the brick fireplace . Then she # . ISg/#r+ VXB N🅪Sg/VB+ . . VP/J NPr+ . VB/C VPt P NSg/VB J/P D+ N🅪Sg/VB/J+ NSg+ . NSg/J/R/C ISg+ > remembered the heat and sat down guiltily on the couch just as a freshly # VP/J D+ Nᴹ/VB+ VB/C NSg/VP/J N🅪Sg/VB/J/P R J/P D+ NSg/VB+ J/R R/C/P D/P R > laundered nurse leading a little girl came into the room . # VP/J NSg/VB+ Nᴹ/Vg/J D/P NPr/I/J/Dq NSg/VB+ NSg/VPt/P P D N🅪Sg/VB/J+ . > # > “ Bles - sed pre - cious , ” she crooned , holding out her arms . “ Come to your own # . ? . NPr NSg/VB/P . ? . . ISg+ VP/J . Nᴹ/Vg/J NSg/VB/J/R/P ISg/D$+ NPl/V3+ . . NSg/VBPp/P P D$+ NSg/VB/J+ > mother that loves you . ” # NSg/VB/J+ NSg/I/C/Ddem+ NPl/V3 ISgPl+ . . > # > The child , relinquished by the nurse , rushed across the room and rooted shyly # D+ NSg/VB+ . VP/J NSg/P D+ NSg/VB+ . VP/J NSg/P D+ N🅪Sg/VB/J+ VB/C VP/J R > into her mother’s dress . # P ISg/D$+ NSg$ NSg/VB+ . > # > “ The bles - sed pre - cious ! Did mother get powder on your old yellowy hair ? Stand # . D ? . NPr NSg/VB/P . ? . VXPt NSg/VB/J+ NSg/VB N🅪Sg/VB+ J/P D$+ NSg/J J N🅪Sg/VB+ . NSg/VB > up now , and say — How - de - do . ” # NSg/VB/J/P NSg/J/R/C . VB/C NSg/VB . NSg/C . NPr+ . VXB . . > # > Gatsby and I in turn leaned down and took the small reluctant hand . Afterward he # NPr VB/C ISg/#r+ NPr/J/R/P NSg/VB VP/J N🅪Sg/VB/J/P VB/C VPt D NPr/VB/J J NSg/VB+ . R/Am NPr/ISg+ > kept looking at the child with surprise . I don’t think he had ever really # VP Nᴹ/Vg/J NSg/P D NSg/VB P NSg/VB+ . ISg/#r+ VXB NSg/VB NPr/ISg+ VP J/R R > believed in its existence before . # VP/J NPr/J/R/P ISg/D$+ NSg+ C/P . > # > “ I got dressed before luncheon , ” said the child , turning eagerly to Daisy . # . ISg/#r+ VP VP/J C/P NSg/VB+ . . VP/J D+ NSg/VB+ . Nᴹ/Vg/J R P NPr . > # > “ That’s because your mother wanted to show you off . ” Her face bent into the # . NSg$ C/P D$+ NSg/VB/J+ VP/J P NSg/VB ISgPl+ NSg/VB/J/P . . ISg/D$+ NSg/VB+ NSg/VP/J P D > single wrinkle of the small white neck . “ You dream , you . You absolute little # NSg/VB/J NSg/VB P D NPr/VB/J NPr🅪Sg/VB/J NSg/VB+ . . ISgPl+ NSg/VB/J+ . ISgPl+ . ISgPl+ NSg/J+ NPr/I/J/Dq+ > dream . ” # NSg/VB/J+ . . > # > “ Yes , ” admitted the child calmly . “ Aunt Jordan’s got on a white dress too . ” # . NPl/VB . . VP/J D+ NSg/VB+ R . . NSg+ NPr$ VP J/P D/P NPr🅪Sg/VB/J NSg/VB+ R . . > # > “ How do you like mother’s friends ? ” Daisy turned her around so that she faced # . NSg/C VXB ISgPl+ NSg/VB/J/C/P NSg$ NPrPl/V3+ . . NPr+ VP/J ISg/D$+ J/P NSg/I/J/R/C NSg/I/C/Ddem ISg+ VP/J > Gatsby . “ Do you think they’re pretty ? ” # NPr . . VXB ISgPl+ NSg/VB K NSg/VB/J/R . . > # > “ Where’s Daddy ? ” # . NSg$ NSg/VB/J+ . . > # > “ She doesn’t look like her father , ” explained Daisy . “ She looks like me . She’s # . ISg+ VX3 NSg/VB NSg/VB/J/C/P ISg/D$+ NPr/VB+ . . VP/J NPr+ . . ISg+ NPl/V3 NSg/VB/J/C/P NPr/ISg+ . K > got my hair and shape of the face . ” # VP D$+ N🅪Sg/VB VB/C N🅪Sg/VB P D NSg/VB+ . . > # > Daisy sat back upon the couch . The nurse took a step forward and held out her # NPr+ NSg/VP/J NSg/VB/J P D+ NSg/VB+ . D+ NSg/VB+ VPt D/P+ NSg/VB+ NSg/VB/J VB/C VP NSg/VB/J/R/P ISg/D$+ > hand . # NSg/VB+ . > # > “ Come , Pammy . ” # . NSg/VBPp/P . ? . . > # > “ Good - by , sweetheart ! ” # . NPr/VB/J . NSg/P . NSg . . > # > With a reluctant backward glance the well - disciplined child held to her nurse’s # P D/P J NSg/J NSg/VB D NSg/VB/J/R . VP/J+ NSg/VB VP P ISg/D$+ NSg$ > hand and was pulled out the door , just as Tom came back , preceding four gin # NSg/VB+ VB/C VLPt VP/J NSg/VB/J/R/P D NSg/VB+ . J/R R/C/P NPr/VB+ NSg/VPt/P NSg/VB/J . Nᴹ/Vg/J NSg N🅪Sg/VB/C+ > rickeys that clicked full of ice . # ? NSg/I/C/Ddem+ VP/J NSg/VB/J P NPr🅪Sg/VB+ . > # > Gatsby took up his drink . # NPr VPt NSg/VB/J/P ISg/D$+ NSg/VB+ . > # > “ They certainly look cool , ” he said , with visible tension . # . IPl+ R NSg/VB NSg/VB/J . . NPr/ISg+ VP/J . P J+ N🅪Sg/VB+ . > # > We drank in long , greedy swallows . # IPl+ NSg/VPt NPr/J/R/P NPr/VB/J . J+ NPl/V3+ . > # > “ I read somewhere that the sun’s getting hotter every year , ” said Tom genially . # . ISg/#r+ NSg/VBP NSg NSg/I/C/Ddem D NPr$ NSg/Vg NSg/VB/JC Dq NSg+ . . VP/J NPr/VB+ R . > “ It seems that pretty soon the earth’s going to fall into the sun — or wait a # . NPr/ISg+ V3 NSg/I/C/Ddem NSg/VB/J/R J/R D K Nᴹ/Vg/J P N🅪Sg/VB P D NPr/VB+ . NPr/C NSg/VB D/P > minute — it’s just the opposite — the sun’s getting colder every year . # NSg/VB/J+ . K J/R D NSg/J/P . D NPr$ NSg/Vg JC Dq NSg+ . > # > “ Come outside , ” he suggested to Gatsby , “ I’d like you to have a look at the # . NSg/VBPp/P Nᴹ/VB/J/P . . NPr/ISg+ VP/J P NPr . . K NSg/VB/J/C/P ISgPl+ P NSg/VXB D/P NSg/VB+ NSg/P D > place . ” # N🅪Sg/VB+ . . > # > I went with them out to the veranda . On the green Sound , stagnant in the heat , # ISg/#r+ NSg/VPt P NSg/IPl+ NSg/VB/J/R/P P D+ NSg/NoAm/Br+ . J/P D+ NPr🅪Sg/VB/J+ N🅪Sg/VB/J+ . J NPr/J/R/P D Nᴹ/VB+ . > one small sail crawled slowly toward the fresher sea . Gatsby’s eyes followed it # NSg/I/J NPr/VB/J NSg/VB+ VP/J R J/P D NSg/JC NSg+ . NPr$ NPl/V3+ VP/J NPr/ISg+ > momentarily ; he raised his hand and pointed across the bay . # R . NPr/ISg+ VP/J ISg/D$+ NSg/VB+ VB/C VP/J NSg/P D NSg/VB/J+ . > # > “ I’m right across from you . ” # . K NPr/VB/J NSg/P P ISgPl+ . . > # > “ So you are . ” # . NSg/I/J/R/C ISgPl+ VLB . . > # > Our eyes lifted over the rose - beds and the hot lawn and the weedy refuse of the # D$+ NPl/V3+ VP/J NSg/J/P D NPr/VPt/J+ . NPl/V3 VB/C D NSg/VB/J NSg/VB+ VB/C D J NSg/VB P D+ > dog - days alongshore . Slowly the white wings of the boat moved against the blue # NSg/VB/J+ . NPl+ J . R D NPr🅪Sg/VB/J NPl/V3 P D+ NSg/VB+ VP/J C/P D N🅪Sg/VB/J > cool limit of the sky . Ahead lay the scalloped ocean and the abounding blessed # NSg/VB/J NSg/VB/J P D+ N🅪Sg/VB+ . R NSg/VBPt/J D VP/J NSg+ VB/C D Nᴹ/Vg/J VP/J > isles . # NPl+ . > # > “ There’s sport for you , ” said Tom , nodding . “ I’d like to be out there with him # . K NSg/VB+ R/C/P ISgPl+ . . VP/J NPr/VB+ . NSg/VP/J . . K NSg/VB/J/C/P P NSg/VLXB NSg/VB/J/R/P R P ISg+ > for about an hour . ” # R/C/P J/P D/P NSg+ . . > # > We had luncheon in the dining - room , darkened too against the heat , and drank # IPl+ VP NSg/VB+ NPr/J/R/P D+ Nᴹ/Vg/J+ . N🅪Sg/VB/J+ . VP/J R C/P D+ Nᴹ/VB+ . VB/C NSg/VPt > down nervous gayety with the cold ale . # N🅪Sg/VB/J/P J ? P D NSg/J N🅪Sg+ . > # > “ What’ll we do with ourselves this afternoon ? ” cried Daisy , “ and the day after # . K IPl+ VXB P IPl+ I/Ddem N🅪Sg+ . . VP/J NPr+ . . VB/C D+ NPr🅪Sg+ P > that , and the next thirty years ? ” # NSg/I/C/Ddem+ . VB/C D+ NSg/J/P+ NSg+ NPl+ . . > # > “ Don’t be morbid , ” Jordan said . “ Life starts all over again when it gets crisp # . VXB NSg/VLXB J . . NPr+ VP/J . . N🅪Sg/VB+ NPl/V3 NSg/I/J/C/Dq NSg/J/P P NSg/I/C NPr/ISg+ NPl/V3 NSg/VB/J > in the fall . ” # NPr/J/R/P D+ N🅪Sg/VB+ . . > # > “ But it’s so hot , ” insisted Daisy , on the verge of tears , “ and everything’s so # . NSg/C/P K NSg/I/J/R/C NSg/VB/J . . VP/J NPr+ . J/P D NSg/VB P NPl/V3+ . . VB/C NSg$ NSg/I/J/R/C > confused . Let’s all go to town ! ” # VP/J . NSg$ NSg/I/J/C/Dq NSg/VB/J P NSg . . > # > Her voice struggled on through the heat , beating against it , molding its # ISg/D$+ NSg/VB+ VP/J J/P NSg/J/P D+ Nᴹ/VB+ . Nᴹ/Vg/J C/P NPr/ISg+ . N🅪Sg/Vg/J+ ISg/D$+ > senselessness into forms . # Nᴹ P NPl/V3+ . > # > “ I’ve heard of making a garage out of a stable , ” Tom was saying to Gatsby , “ but # . K VP/J P Nᴹ/Vg/J D/P NSg/VB+ NSg/VB/J/R/P P D/P NSg/VB/J . . NPr/VB+ VLPt N🅪Sg/Vg/J P NPr . . NSg/C/P > I’m the first man who ever made a stable out of a garage . ” # K D NSg/J NPr/VB/J+ NPr/I+ J/R VP D/P NSg/VB/J NSg/VB/J/R/P P D/P NSg/VB+ . . > # > “ Who wants to go to town ? ” demanded Daisy insistently . Gatsby’s eyes floated # . NPr/I+ NPl/V3 P NSg/VB/J P NSg . . VP/J NPr+ R . NPr$ NPl/V3+ VP/J > toward her . “ Ah , ” she cried , “ you look so cool . ” # J/P ISg/D$+ . . NSg/I/VB . . ISg+ VP/J . . ISgPl+ NSg/VB NSg/I/J/R/C NSg/VB/J . . > # > Their eyes met , and they stared together at each other , alone in space . With an # D$+ NPl/V3+ VP . VB/C IPl+ VP/J J NSg/P Dq NSg/VB/J . J NPr/J/R/P N🅪Sg/VB+ . P D/P+ > effort she glanced down at the table . # N🅪Sg/VB+ ISg+ VP/J N🅪Sg/VB/J/P NSg/P D+ NSg/VB+ . > # > “ You always look so cool , ” she repeated . # . ISgPl+ R NSg/VB NSg/I/J/R/C NSg/VB/J . . ISg+ VP/J . > # > She had told him that she loved him , and Tom Buchanan saw . He was astounded . His # ISg+ VP VP ISg+ NSg/I/C/Ddem ISg+ VP/J ISg+ . VB/C NPr/VB+ NPr+ NSg/VPt . NPr/ISg+ VLPt VP/J . ISg/D$+ > mouth opened a little , and he looked at Gatsby , and then back at Daisy as if he # NSg/VB+ VP/J D/P NPr/I/J/Dq . VB/C NPr/ISg+ VP/J NSg/P NPr . VB/C NSg/J/R/C NSg/VB/J NSg/P NPr+ R/C/P NSg/C NPr/ISg+ > had just recognized her as some one he knew a long time ago . # VP J/R VP/J ISg/D$+ R/C/P I/J/R/Dq NSg/I/J+ NPr/ISg+ VPt D/P NPr/VB/J N🅪Sg/VB/J+ J/P . > # > “ You resemble the advertisement of the man , ” she went on innocently . ‘ You know # . ISgPl+ VB D NSg P D NPr/VB/J+ . . ISg+ NSg/VPt J/P R . Unlintable ISgPl+ VB > the advertisement of the man — ” # D NSg P D NPr/VB/J+ . . > # > “ All right , ” broke in Tom quickly , “ I’m perfectly willing to go to town . Come # . NSg/I/J/C/Dq NPr/VB/J . . NSg/VPt/J NPr/J/R/P NPr/VB+ R . . K R NSg/Vg/J P NSg/VB/J P NSg . NSg/VBPp/P > on — we’re all going to town . ” # J/P . K NSg/I/J/C/Dq Nᴹ/Vg/J P NSg . . > # > He got up , his eyes still flashing between Gatsby and his wife . No one moved . # NPr/ISg+ VP NSg/VB/J/P . ISg/D$+ NPl/V3+ NSg/VB/J/R Nᴹ/Vg/J NSg/P NPr VB/C ISg/D$+ NSg/VB/J+ . NSg/Dq/P NSg/I/J VP/J . > # > “ Come on ! ” His temper cracked a little . “ What’s the matter , anyhow ? If we’re # . NSg/VBPp/P J/P . . ISg/D$+ NSg/VB/JC+ VP/J D/P NPr/I/J/Dq . . K D+ N🅪Sg/VB+ . J . NSg/C K > going to town , let’s start . ” # Nᴹ/Vg/J P NSg . NSg$ NSg/VB . . > # > His hand , trembling with his effort at self - control , bore to his lips the last # ISg/D$+ NSg/VB+ . Nᴹ/Vg/J P ISg/D$+ N🅪Sg/VB+ NSg/P NSg/I/VB/J+ . N🅪Sg/VB+ . NSg/VBPt P ISg/D$+ NPl/V3 D NSg/VB/J > of his glass of ale . Daisy’s voice got us to our feet and out on to the blazing # P ISg/D$+ NPr🅪Sg/VB P N🅪Sg+ . NPr$ NSg/VB+ VP NPr/IPl+ P D$+ NPl+ VB/C NSg/VB/J/R/P J/P P D Nᴹ/Vg/J > gravel drive . # Nᴹ/VB/J+ N🅪Sg/VB . > # > “ Are we just going to go ? ” she objected . “ Like this ? Aren’t we going to let any # . VLB IPl+ J/R Nᴹ/Vg/J P NSg/VB/J . . ISg+ VP/J . . NSg/VB/J/C/P I/Ddem+ . VB IPl+ Nᴹ/Vg/J P NSg/VBP I/R/Dq > one smoke a cigarette first ? ” # NSg/I/J N🅪Sg/VB+ D/P NSg/VB+ NSg/J . . > # > “ Everybody smoked all through lunch . ” # . NSg/I+ VP/J NSg/I/J/C/Dq NSg/J/P N🅪Sg/VB+ . . > # > “ Oh , let’s have fun , ” she begged him . “ It’s too hot to fuss . ” # . NPr/VB . NSg$ NSg/VXB Nᴹ/VB/J . . ISg+ VP ISg+ . . K R NSg/VB/J P N🅪Sg/VB . . > # > He didn’t answer . # NPr/ISg+ VXPt NSg/VB+ . > # > “ Have it your own way , ” she said . “ Come on , Jordan . ” # . NSg/VXB NPr/ISg+ D$+ NSg/VB/J+ NSg/J+ . . ISg+ VP/J . . NSg/VBPp/P J/P . NPr+ . . > # > They went up - stairs to get ready while we three men stood there shuffling the # IPl+ NSg/VPt NSg/VB/J/P . NPl+ P NSg/VB NSg/VB/J NSg/VB/C/P IPl+ NSg+ NPl+ VP R+ Nᴹ/Vg/J D > hot pebbles with our feet . A silver curve of the moon hovered already in the # NSg/VB/J NPl/V3+ P D$+ NPl+ . D/P Nᴹ/VB/J+ NSg/VB/J P D+ NPr/VB+ VP/J R NPr/J/R/P D+ > western sky . Gatsby started to speak , changed his mind , but not before Tom # NPr/J+ N🅪Sg/VB+ . NPr VP/J P NSg/VB . VP/J ISg/D$+ NSg/VB+ . NSg/C/P NSg/R/C C/P NPr/VB+ > wheeled and faced him expectantly . # VP/J VB/C VP/J ISg+ R . > # > “ Have you got your stables here ? ” asked Gatsby with an effort . # . NSg/VXB ISgPl+ VP D$+ NPl/V3+ J/R . . VP/J NPr P D/P N🅪Sg/VB+ . > # > “ About a quarter of a mile down the road . ” # . J/P D/P NSg/VB/J P D/P+ NSg+ N🅪Sg/VB/J/P D+ N🅪Sg/J+ . . > # > “ Oh . ” # . NPr/VB . . > # > A pause . # D/P+ NSg/VB+ . > # > “ I don’t see the idea of going to town , ” broke out Tom savagely . “ Women get # . ISg/#r+ VXB NSg/VB D NSg+ P Nᴹ/Vg/J P NSg . . NSg/VPt/J NSg/VB/J/R/P NPr/VB+ R . . NPl+ NSg/VB > these notions in their heads — — — ” # I/Ddem+ NPl+ NPr/J/R/P D$+ NPl/V3+ . . . . > # > “ Shall we take anything to drink ? ” called Daisy from an upper window . # . VXB IPl+ NSg/VB NSg/I/VB+ P NSg/VB . . VP/J NPr+ P D/P+ NSg/J+ NSg/VB+ . > # > “ I’ll get some whiskey , ” answered Tom . He went inside . # . K NSg/VB I/J/R/Dq N🅪Sg . . VP/J NPr/VB+ . NPr/ISg+ NSg/VPt NSg/J/P . > # > Gatsby turned to me rigidly : # NPr VP/J P NPr/ISg+ R . > # > “ I can’t say anything in his house , old sport . ” # . ISg/#r+ VXB NSg/VB NSg/I/VB+ NPr/J/R/P ISg/D$+ NPr/VB+ . NSg/J NSg/VB+ . . > # > “ She’s got an indiscreet voice , ” I remarked . “ It’s full of — ” I hesitated . # . K VP D/P J NSg/VB+ . . ISg/#r+ VP/J . . K NSg/VB/J P . . ISg/#r+ VP/J . > # > “ Her voice is full of money , ” he said suddenly . # . ISg/D$+ NSg/VB+ VL3 NSg/VB/J P N🅪Sg/J+ . . NPr/ISg+ VP/J R . > # > That was it . I’d never understood before . It was full of money — that was the # NSg/I/C/Ddem+ VLPt NPr/ISg+ . K R VP/J C/P . NPr/ISg+ VLPt NSg/VB/J P N🅪Sg/J+ . NSg/I/C/Ddem+ VLPt D > inexhaustible charm that rose and fell in it , the jingle of it , the cymbals ’ # J N🅪Sg/VB NSg/I/C/Ddem+ NPr/VPt/J VB/C NSg/VPt/J NPr/J/R/P NPr/ISg+ . D NSg/VB P NPr/ISg+ . D NPl . > song of it . . . . High in a white palace the king’s daughter , the golden girl . . # N🅪Sg P NPr/ISg+ . . . . NSg/VB/J/R NPr/J/R/P D/P NPr🅪Sg/VB/J NSg/VB+ D NPr$ NSg+ . D NPr/VB/J NSg/VB+ . . > . . # . . > # > Tom came out of the house wrapping a quart bottle in a towel , followed by Daisy # NPr/VB+ NSg/VPt/P NSg/VB/J/R/P P D+ NPr/VB+ N🅪Sg/Vg+ D/P+ NSg/VB/J+ NSg/VB+ NPr/J/R/P D/P+ NSg/VB+ . VP/J NSg/P NPr > and Jordan wearing small tight hats of metallic cloth and carrying light capes # VB/C NPr+ Nᴹ/Vg/J NPr/VB/J VB/J NPl/V3 P NSg/J+ NSg+ VB/C Nᴹ/Vg/J N🅪Sg/VB/J+ NPl/V3+ > over their arms . # NSg/J/P D$+ NPl/V3+ . > # > “ Shall we all go in my car ? ” suggested Gatsby . He felt the hot , green leather of # . VXB IPl+ NSg/I/J/C/Dq NSg/VB/J+ NPr/J/R/P D$+ NSg+ . . VP/J NPr . NPr/ISg+ N🅪Sg/VP/J D NSg/VB/J . NPr🅪Sg/VB/J N🅪Sg/VB/J P > the seat . “ I ought to have left it in the shade . ” # D+ NSg/VB+ . . ISg/#r+ NSg/I/VXB P NSg/VXB NPr/VP/J NPr/ISg+ NPr/J/R/P D+ N🅪Sg/VB+ . . > # > “ Is it standard shift ? ” demanded Tom . # . VL3 NPr/ISg+ NSg/J+ NSg/VB+ . . VP/J NPr/VB+ . > # > “ Yes . ” # . NPl/VB . . > # > “ Well , you take my coupé and let me drive your car to town . ” # . NSg/VB/J/R . ISgPl+ NSg/VB D$+ ? VB/C NSg/VBP NPr/ISg+ N🅪Sg/VB D$+ NSg+ P NSg . . > # > The suggestion was distasteful to Gatsby . # D+ N🅪Sg+ VLPt J P NPr . > # > “ I don’t think there’s much gas , ” he objected . # . ISg/#r+ VXB NSg/VB K NSg/I/J/R/Dq NSg/VB/J+ . . NPr/ISg+ VP/J . > # > “ Plenty of gas , ” said Tom boisterously . He looked at the gauge . “ And if it runs # . NSg/I/J P NSg/VB/J+ . . VP/J NPr/VB+ R . NPr/ISg+ VP/J NSg/P D+ NSg/VB+ . . VB/C NSg/C NPr/ISg+ NPl/V3 > out I can stop at a drug - store . You can buy anything at a drug - store nowadays . ” # NSg/VB/J/R/P ISg/#r+ NPr/VXB NSg/VB NSg/P D/P NSg/VB+ . NSg/VB+ . ISgPl+ NPr/VXB NSg/VB NSg/I/VB+ NSg/P D/P NSg/VB+ . NSg/VB+ NSg . . > # > A pause followed this apparently pointless remark . Daisy looked at Tom frowning , # D/P+ NSg/VB+ VP/J I/Ddem R J NSg/VB+ . NPr+ VP/J NSg/P NPr/VB+ Nᴹ/Vg/J . > and an indefinable expression , at once definitely unfamiliar and vaguely # VB/C D/P+ J+ N🅪Sg+ . NSg/P NSg/C R NSg/J VB/C R > recognizable , as if I had only heard it described in words , passed over Gatsby’s # J . R/C/P NSg/C ISg/#r+ VP J/R/C VP/J NPr/ISg+ VP/J NPr/J/R/P NPl/V3+ . VP/J NSg/J/P NPr$ > face . # NSg/VB+ . > # > “ Come on , Daisy , ” said Tom , pressing her with his hand toward Gatsby’s car . # . NSg/VBPp/P J/P . NPr+ . . VP/J NPr/VB+ . Nᴹ/Vg/J ISg/D$+ P ISg/D$+ NSg/VB+ J/P NPr$ NSg+ . > “ I’ll take you in this circus wagon . ” # . K NSg/VB ISgPl+ NPr/J/R/P I/Ddem NSg/VB+ NSg/VB+ . . > # > He opened the door , but she moved out from the circle of his arm . # NPr/ISg+ VP/J D+ NSg/VB+ . NSg/C/P ISg+ VP/J NSg/VB/J/R/P P D NSg/VB P ISg/D$+ NSg/VB/J+ . > # > “ You take Nick and Jordan . We’ll follow you in the coupé . ” # . ISgPl+ NSg/VB NPr/VB VB/C NPr+ . K NSg/VB ISgPl+ NPr/J/R/P D ? . . > # > She walked close to Gatsby , touching his coat with her hand . Jordan and Tom and # ISg+ VP/J NSg/VB/J P NPr . Nᴹ/Vg/J/P ISg/D$+ NSg/VB+ P ISg/D$+ NSg/VB+ . NPr VB/C NPr/VB+ VB/C > I got into the front seat of Gatsby’s car , Tom pushed the unfamiliar gears # ISg/#r+ VP P D NSg/VB/J+ NSg/VB P NPr$ NSg+ . NPr/VB+ VP/J D NSg/J NPl/V3+ > tentatively , and we shot off into the oppressive heat , leaving them out of sight # R . VB/C IPl+ NSg/VP/J+ NSg/VB/J/P P D J Nᴹ/VB+ . Nᴹ/Vg/J NSg/IPl+ NSg/VB/J/R/P P N🅪Sg/VB+ > behind . # NSg/J/P . > # > “ Did you see that ? ” demanded Tom . # . VXPt ISgPl+ NSg/VB NSg/I/C/Ddem+ . . VP/J NPr/VB+ . > # > “ See what ? ” # . NSg/VB NSg/I+ . . > # > He looked at me keenly , realizing that Jordan and I must have known all along . # NPr/ISg+ VP/J NSg/P NPr/ISg+ R . Nᴹ/Vg/J/Comm/NoAm NSg/I/C/Ddem NPr+ VB/C ISg/#r+ NSg/VXB NSg/VXB VPp/J NSg/I/J/C/Dq P . > # > “ You think I’m pretty dumb , don’t you ? ” he suggested . “ Perhaps I am , but I have # . ISgPl+ NSg/VB K NSg/VB/J/R VB/J . VXB ISgPl+ . . NPr/ISg+ VP/J . . NSg/R ISg/#r+ NPr/VLB/J . NSg/C/P ISg/#r+ NSg/VXB > a — almost a second sight , sometimes , that tells me what to do . Maybe you don’t # D/P . R D/P+ NSg/VB/J+ N🅪Sg/VB+ . R . NSg/I/C/Ddem+ NPl/V3 NPr/ISg+ NSg/I+ P VXB . NSg/J/R ISgPl+ VXB > believe that , but science — — — ” # VB NSg/I/C/Ddem+ . NSg/C/P N🅪Sg/VB+ . . . . > # > He paused . The immediate contingency overtook him , pulled him back from the edge # NPr/ISg+ VP/J . D J NSg NSg/VPt ISg+ . VP/J ISg+ NSg/VB/J P D NSg/VB > of the theoretical abyss . # P D J NSg+ . > # > “ I’ve made a small investigation of this fellow , ” he continued . “ I could have # . K VP D/P NPr/VB/J N🅪Sg P I/Ddem NSg . . NPr/ISg+ VP/J . . ISg/#r+ NSg/VXB NSg/VXB > gone deeper if I’d known — — — ” # VPp/J/P JC NSg/C K VPp/J . . . . > # > “ Do you mean you’ve been to a medium ? ” inquired Jordan humorously . # . VXB ISgPl+ NSg/VB/J K NSg/VLPp P D/P NSg/J . . VP/J NPr+ R . > # > “ What ? ” Confused , he stared at us as we laughed . “ A medium ? ” # . NSg/I+ . . VP/J . NPr/ISg+ VP/J NSg/P NPr/IPl+ R/C/P IPl+ VP/J . . D/P NSg/J . . > # > “ About Gatsby . ” # . J/P NPr . . > # > “ About Gatsby ! No , I haven’t . I said I’d been making a small investigation of # . J/P NPr . NSg/Dq/P . ISg/#r+ VXB . ISg/#r+ VP/J K NSg/VLPp Nᴹ/Vg/J D/P NPr/VB/J N🅪Sg P > his past . ” # ISg/D$+ NSg/VB/J/P . . > # > “ And you found he was an Oxford man , ” said Jordan helpfully . # . VB/C ISgPl+ NSg/VP NPr/ISg+ VLPt D/P NPr NPr/VB/J . . VP/J NPr+ R . > # > “ An Oxford man ! ” He was incredulous . “ Like hell he is ! He wears a pink suit . ” # . D/P+ NPr+ NPr/VB/J+ . . NPr/ISg+ VLPt J . . NSg/VB/J/C/P NPr/VB+ NPr/ISg+ VL3 . NPr/ISg+ NPl/V3 D/P+ N🅪Sg/VB/J+ NSg/VB+ . . > # > “ Nevertheless he’s an Oxford man . ” # . R NPr$ D/P+ NPr+ NPr/VB/J+ . . > # > “ Oxford , New Mexico , ” snorted Tom contemptuously , “ or something like that . ” # . NPr+ . NSg/J+ NPr+ . . VP/J NPr/VB+ R . . NPr/C NSg/I/J+ NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > “ Listen , Tom . If you’re such a snob , why did you invite him to lunch ? ” demanded # . NSg/VB . NPr/VB+ . NSg/C K NSg/I D/P NSg . NSg/VB VXPt ISgPl+ NSg/VB ISg+ P N🅪Sg/VB . . VP/J > Jordan crossly . # NPr+ R . > # > “ Daisy invited him ; she knew him before we were married — God knows where ! ” # . NPr+ NSg/VP/J ISg+ . ISg+ VPt ISg+ C/P IPl+ NSg/VLPt NSg/VP/J . NPr/VB+ V3 NSg/R/C . . > # > We were all irritable now with the fading ale , and aware of it we drove for a # IPl+ NSg/VLPt NSg/I/J/C/Dq J NSg/J/R/C P D+ Nᴹ/Vg/J N🅪Sg+ . VB/C VB/J P NPr/ISg+ IPl+ NSg/VPt R/C/P D/P > while in silence . Then as Doctor T. J. Eckleburg’s faded eyes came into sight # NSg/VB/C/P NPr/J/R/P NSg/VB+ . NSg/J/R/C R/C/P NSg/VB+ ? ? ? J NPl/V3+ NSg/VPt/P P N🅪Sg/VB+ > down the road , I remembered Gatsby’s caution about gasoline . # N🅪Sg/VB/J/P D N🅪Sg/J+ . ISg/#r+ VP/J NPr$ N🅪Sg/VB+ J/P Nᴹ . > # > “ We’ve got enough to get us to town , ” said Tom . # . K VP NSg/I P NSg/VB NPr/IPl+ P NSg . . VP/J NPr/VB+ . > # > “ But there’s a garage right here , ” objected Jordan . “ I don’t want to get stalled # . NSg/C/P K D/P+ NSg/VB+ NPr/VB/J J/R . . VP/J NPr+ . . ISg/#r+ VXB NSg/VB P NSg/VB VP/J > in this baking heat . ” # NPr/J/R/P I/Ddem Nᴹ/Vg/J+ Nᴹ/VB+ . . > # > Tom threw on both brakes impatiently , and we slid to an abrupt dusty spot under # NPr/VB+ VPt J/P I/C/Dq+ NPl/V3+ R . VB/C IPl+ VP P D/P NSg/VB/J NPr/J NSg/VB/J+ NSg/J/P > Wilson’s sign . After a moment the proprietor emerged from the interior of his # NPr$ NSg/VB+ . P D/P+ NSg+ D NSg VP/J P D NSg/J P ISg/D$+ > establishment and gazed hollow - eyed at the car . # NSg+ VB/C VP/J NSg/VB/J . VP/J NSg/P D NSg+ . > # > “ Let’s have some gas ! ” cried Tom roughly . “ What do you think we stopped for — to # . NSg$ NSg/VXB I/J/R/Dq+ NSg/VB/J+ . . VP/J NPr/VB+ R . . NSg/I+ VXB ISgPl+ NSg/VB IPl+ VP/J R/C/P . P > admire the view ? ” # VB D+ NSg/VB+ . . > # > “ I’m sick , ” said Wilson without moving . “ Been sick all day . ” # . K NSg/VB/J . . VP/J NPr+ C/P Nᴹ/Vg/J . . NSg/VLPp NSg/VB/J NSg/I/J/C/Dq+ NPr🅪Sg+ . . > # > “ What’s the matter ? ” # . K D+ N🅪Sg/VB+ . . > # > “ I’m all run down . ” # . K NSg/I/J/C/Dq NSg/VBPp N🅪Sg/VB/J/P . . > # > “ Well , shall I help myself ? ” Tom demanded . “ You sounded well enough on the # . NSg/VB/J/R . VXB ISg/#r+ NSg/VB ISg+ . . NPr/VB+ VP/J . . ISgPl+ VP/J NSg/VB/J/R NSg/I J/P D+ > phone . ” # NSg/VB+ . . > # > With an effort Wilson left the shade and support of the doorway and , breathing # P D/P+ N🅪Sg/VB+ NPr+ NPr/VP/J D N🅪Sg/VB VB/C N🅪Sg/VB P D+ NSg+ VB/C . Nᴹ/Vg/J > hard , unscrewed the cap of the tank . In the sunlight his face was green . # N🅪Sg/J/R . VP/J D NPr/VB P D NSg/VB+ . NPr/J/R/P D+ NSg/VB+ ISg/D$+ NSg/VB+ VLPt NPr🅪Sg/VB/J . > # > “ I didn’t mean to interrupt your lunch , ” he said . “ But I need money pretty bad , # . ISg/#r+ VXPt NSg/VB/J P NSg/VB D$+ N🅪Sg/VB+ . . NPr/ISg+ VP/J . . NSg/C/P ISg/#r+ N🅪Sg/VXB N🅪Sg/J+ NSg/VB/J/R NSg/VB/J . > and I was wondering what you were going to do with your old car . ” # VB/C ISg/#r+ VLPt Nᴹ/Vg/J NSg/I+ ISgPl+ NSg/VLPt Nᴹ/Vg/J P VXB P D$+ NSg/J+ NSg+ . . > # > “ How do you like this one ? ” inquired Tom . “ I bought it last week . ” # . NSg/C VXB ISgPl+ NSg/VB/J/C/P I/Ddem+ NSg/I/J+ . . VP/J NPr/VB+ . . ISg/#r+ NSg/VP NPr/ISg+ NSg/VB/J+ NSg/J+ . . > # > “ It’s a nice yellow one , ” said Wilson , as he strained at the handle . # . K D/P+ NPr/J NSg/VB/J NSg/I/J+ . . VP/J NPr+ . R/C/P NPr/ISg+ VP/J NSg/P D NSg/VB+ . > # > “ Like to buy it ? ” # . NSg/VB/J/C/P P NSg/VB NPr/ISg+ . . > # > “ Big chance , ” Wilson smiled faintly . “ No , but I could make some money on the # . NSg/J+ NPr/VB/J+ . . NPr+ VP/J R . . NSg/Dq/P . NSg/C/P ISg/#r+ NSg/VXB NSg/VB I/J/R/Dq+ N🅪Sg/J+ J/P D > other . ” # NSg/VB/J . . > # > “ What do you want money for , all of a sudden ? ” # . NSg/I+ VXB ISgPl+ NSg/VB N🅪Sg/J+ R/C/P . NSg/I/J/C/Dq P D/P NSg/J . . > # > “ I’ve been here too long . I want to get away . My wife and I want to go West . ” # . K NSg/VLPp J/R R NPr/VB/J . ISg/#r+ NSg/VB P NSg/VB VB/J . D$+ NSg/VB/J+ VB/C ISg/#r+ NSg/VB P NSg/VB/J NPr/VB/J+ . . > # > “ Your wife does , ” exclaimed Tom , startled . # . D$+ NSg/VB/J+ NPl/VX3 . . VP/J NPr/VB+ . VP/J . > # > “ She’s been talking about it for ten years . ” He rested for a moment against the # . K NSg/VLPp Nᴹ/Vg/J J/P NPr/ISg+ R/C/P NSg NPl+ . . NPr/ISg+ VP/J R/C/P D/P NSg+ C/P D+ > pump , shading his eyes . “ And now she’s going whether she wants to or not . I’m # NSg/VB+ . Nᴹ/Vg/J ISg/D$+ NPl/V3+ . . VB/C NSg/J/R/C K Nᴹ/Vg/J I/C ISg+ NPl/V3 P NPr/C NSg/R/C . K > going to get her away . ” # Nᴹ/Vg/J P NSg/VB ISg/D$+ VB/J . . > # > The coupé flashed by us with a flurry of dust and the flash of a waving hand . # D ? VP/J NSg/P NPr/IPl+ P D/P NSg/VB P Nᴹ/VB+ VB/C D NSg/VB/J P D/P Nᴹ/Vg/J NSg/VB+ . > # > “ What do I owe you ? ” demanded Tom harshly . # . NSg/I+ VXB ISg/#r+ VB ISgPl+ . . VP/J NPr/VB+ R . > # > “ I just got wised up to something funny the last two days , ” remarked Wilson . # . ISg/#r+ J/R VP VP/J NSg/VB/J/P P NSg/I/J+ NSg/J D NSg/VB/J NSg NPl+ . . VP/J NPr+ . > “ That’s why I want to get away . That’s why I been bothering you about the car . ” # . NSg$ NSg/VB ISg/#r+ NSg/VB P NSg/VB VB/J . NSg$ NSg/VB ISg/#r+ NSg/VLPp Nᴹ/Vg/J ISgPl+ J/P D NSg+ . . > # > “ What do I owe you ? ” # . NSg/I+ VXB ISg/#r+ VB ISgPl+ . . > # > “ Dollar twenty . ” # . NSg+ NSg . . > # > The relentless beating heat was beginning to confuse me and I had a bad moment # D+ J Nᴹ/Vg/J Nᴹ/VB+ VLPt NSg/Vg/J P NSg/VB NPr/ISg+ VB/C ISg/#r+ VP D/P+ NSg/VB/J+ NSg+ > there before I realized that so far his suspicions hadn’t alighted on Tom . He # R+ C/P ISg/#r+ VP/J/Comm/NoAm NSg/I/C/Ddem NSg/I/J/R/C NSg/VB/J ISg/D$+ NPl/V3 VPt VP/J J/P NPr/VB+ . NPr/ISg+ > had discovered that Myrtle had some sort of life apart from him in another # VP VP/J NSg/I/C/Ddem NPr VP I/J/R/Dq NSg/VB P N🅪Sg/VB+ J P ISg+ NPr/J/R/P I/D > world , and the shock had made him physically sick . I stared at him and then at # NSg/VB+ . VB/C D N🅪Sg/J+ VP VP ISg+ R NSg/VB/J . ISg/#r+ VP/J NSg/P ISg+ VB/C NSg/J/R/C NSg/P > Tom , who had made a parallel discovery less than an hour before — and it occurred # NPr/VB+ . NPr/I+ VP VP D/P NSg/VB/J+ N🅪Sg+ VB/J/R/C/P C/P D/P+ NSg+ C/P . VB/C NPr/ISg+ VP > to me that there was no difference between men , in intelligence or race , so # P NPr/ISg+ NSg/I/C/Ddem R+ VLPt NSg/Dq/P N🅪Sg/VB NSg/P NPl+ . NPr/J/R/P N🅪Sg NPr/C N🅪Sg/VB+ . NSg/I/J/R/C > profound as the difference between the sick and the well . Wilson was so sick # NSg/VB/J R/C/P D+ N🅪Sg/VB+ NSg/P D NSg/VB/J VB/C D NSg/VB/J/R . NPr+ VLPt NSg/I/J/R/C NSg/VB/J > that he looked guilty , unforgivably guilty — as if he had just got some poor girl # NSg/I/C/Ddem NPr/ISg+ VP/J NSg/J . R NSg/J . R/C/P NSg/C NPr/ISg+ VP J/R VP I/J/R/Dq NSg/VB/J NSg/VB+ > with child . # P NSg/VB+ . > # > “ I’ll let you have that car , ” said Tom . “ I’ll send it over to - morrow afternoon . ” # . K NSg/VBP ISgPl+ NSg/VXB NSg/I/C/Ddem NSg+ . . VP/J NPr/VB+ . . K NSg/VB NPr/ISg+ NSg/J/P P . NPr/VB N🅪Sg+ . . > # > That locality was always vaguely disquieting , even in the broad glare of # NSg/I/C/Ddem+ NSg VLPt R R Nᴹ/Vg/J . NSg/VB/J/R NPr/J/R/P D NSg/J NSg/VB/J P > afternoon , and now I turned my head as though I had been warned of something # N🅪Sg+ . VB/C NSg/J/R/C ISg/#r+ VP/J D$+ NPr/VB/J+ R/C/P C ISg/#r+ VP NSg/VLPp VP/J P NSg/I/J+ > behind . Over the ashheaps the giant eyes of Doctor T. J. Eckleburg kept their # NSg/J/P . NSg/J/P D ? D NSg/J NPl/V3 P NSg/VB+ ? ? ? VP D$+ > vigil , but I perceived , after a moment , that other eyes were regarding us with # NSg/VB . NSg/C/P ISg/#r+ VP/J . P D/P NSg+ . NSg/I/C/Ddem NSg/VB/J NPl/V3+ NSg/VLPt Nᴹ/Vg/J NPr/IPl+ P > peculiar intensity from less than twenty feet away . # NSg/J Nᴹ+ P VB/J/R/C/P C/P NSg NPl+ VB/J . > # > In one of the windows over the garage the curtains had been moved aside a # NPr/J/R/P NSg/I/J P D+ NPrPl/V3+ NSg/J/P D+ NSg/VB+ D+ NPl/V3+ VP NSg/VLPp VP/J NSg/J D/P > little , and Myrtle Wilson was peering down at the car . So engrossed was she that # NPr/I/J/Dq . VB/C NPr NPr+ VLPt Nᴹ/Vg/J N🅪Sg/VB/J/P NSg/P D NSg+ . NSg/I/J/R/C VP/J VLPt ISg+ NSg/I/C/Ddem > she had no consciousness of being observed , and one emotion after another crept # ISg+ VP NSg/Dq/P Nᴹ P N🅪Sg/VLg/J/C VP/J . VB/C NSg/I/J N🅪Sg+ P I/D VP+ > into her face like objects into a slowly developing picture . Her expression was # P ISg/D$+ NSg/VB NSg/VB/J/C/P NPl/V3+ P D/P R Nᴹ/Vg/J NSg/VB+ . ISg/D$+ N🅪Sg+ VLPt > curiously familiar — it was an expression I had often seen on women’s faces , but # R NSg/J . NPr/ISg+ VLPt D/P N🅪Sg ISg/#r+ VP R NSg/VPp J/P NSg$ NPl/V3+ . NSg/C/P > on Myrtle Wilson’s face it seemed purposeless and inexplicable until I realized # J/P NPr NPr$ NSg/VB+ NPr/ISg+ VP/J J VB/C J C/P ISg/#r+ VP/J/Comm/NoAm > that her eyes , wide with jealous terror , were fixed not on Tom , but on Jordan # NSg/I/C/Ddem ISg/D$+ NPl/V3+ . NSg/J P VB/J N🅪Sg+ . NSg/VLPt VP/J NSg/R/C J/P NPr/VB+ . NSg/C/P J/P NPr+ > Baker , whom she took to be his wife . # NPr+ . I+ ISg+ VPt P NSg/VLXB ISg/D$+ NSg/VB/J+ . > # > There is no confusion like the confusion of a simple mind , and as we drove away # R+ VL3 NSg/Dq/P N🅪Sg/VB NSg/VB/J/C/P D N🅪Sg/VB P D/P+ NSg/VB/J+ NSg/VB+ . VB/C R/C/P IPl+ NSg/VPt VB/J > Tom was feeling the hot whips of panic . His wife and his mistress , until an hour # NPr/VB+ VLPt N🅪Sg/Vg/J D NSg/VB/J NPl/V3 P N🅪Sg/VB/J+ . ISg/D$+ NSg/VB/J VB/C ISg/D$+ NSg/VB+ . C/P D/P+ NSg+ > ago secure and inviolate , were slipping precipitately from his control . Instinct # J/P VB/J VB/C J . NSg/VLPt NSg/Vg R P ISg/D$+ N🅪Sg/VB+ . NSg/J+ > made him step on the accelerator with the double purpose of overtaking Daisy and # VP ISg+ NSg/VB+ J/P D NSg+ P D NSg/VB/J N🅪Sg/VB P Nᴹ/Vg/J NPr+ VB/C > leaving Wilson behind , and we sped along toward Astoria at fifty miles an hour , # Nᴹ/Vg/J NPr+ NSg/J/P . VB/C IPl+ NSg/VP P J/P NPr NSg/P NSg NPrPl+ D/P NSg+ . > until , among the spidery girders of the elevated , we came in sight of the # C/P . P D J NPl P D VP/J+ . IPl+ NSg/VPt/P NPr/J/R/P N🅪Sg/VB P D > easy - going blue coupé . # NSg/VB/J . Nᴹ/Vg/J N🅪Sg/VB/J ? . > # > “ Those big movies around Fiftieth Street are cool , ” suggested Jordan . “ I love # . I/Ddem NSg/J NPl+ J/P NSg/J NSg/VB/J+ VLB NSg/VB/J . . VP/J NPr+ . . ISg/#r+ NPr🅪Sg/VB > New York on summer afternoons when every one’s away . There’s something very # NSg/J NPr+ J/P NPr🅪Sg/VB+ NPl NSg/I/C Dq NSg$ VB/J . K NSg/I/J+ J/R > sensuous about it — overripe , as if all sorts of funny fruits were going to fall # J J/P NPr/ISg+ . NSg/J . R/C/P NSg/C NSg/I/J/C/Dq NPl/V3 P NSg/J NPl/V3+ NSg/VLPt Nᴹ/Vg/J P N🅪Sg/VB > into your hands . ” # P D$+ NPl/V3+ . . > # > The word “ sensuous ” had the effect of further disquieting Tom , but before he # D+ NSg/VB+ . J . VP D NSg/VB P VB/JC Nᴹ/Vg/J NPr/VB+ . NSg/C/P C/P NPr/ISg+ > could invent a protest the coupé came to a stop , and Daisy signalled us to draw # NSg/VXB VB D/P N🅪Sg/VB+ D ? NSg/VPt/P P D/P NSg/VB+ . VB/C NPr+ VP/Comm NPr/IPl+ P NSg/VB > up alongside . # NSg/VB/J/P P . > # > “ Where are we going ? ” she cried . # . NSg/R/C VLB IPl+ Nᴹ/Vg/J . . ISg+ VP/J . > # > “ How about the movies ? ” # . NSg/C J/P D+ NPl+ . . > # > “ It’s so hot , ” she complained . “ You go . We'll ride around and meet you after . ” # . K NSg/I/J/R/C NSg/VB/J . . ISg+ VP/J . . ISgPl+ NSg/VB/J . K NSg/VB+ J/P VB/C NSg/VB/J ISgPl+ P . . > With an effort her wit rose faintly , “ We’ll meet you on some corner . I'll be the # P D/P+ N🅪Sg/VB+ ISg/D$+ N🅪Sg/VB/P+ NPr/VPt/J R . . K NSg/VB/J ISgPl+ J/P I/J/R/Dq NSg/VB+ . K NSg/VLXB D > man smoking two cigarettes . ” # NPr/VB/J+ Nᴹ/Vg/J+ NSg+ NPl/V3+ . . > # > “ We can’t argue about it here , ” Tom said impatiently , as a truck gave out a # . IPl+ VXB VB J/P NPr/ISg+ J/R . . NPr/VB+ VP/J R . R/C/P D/P NSg/VB+ VPt NSg/VB/J/R/P D/P > cursing whistle behind us . “ You follow me to the south side of Central Park , in # Nᴹ/Vg/J NSg/VB NSg/J/P NPr/IPl+ . . ISgPl+ NSg/VB NPr/ISg+ P D NPr/VB/J+ NSg/VB/J P NPr/J+ NPr/VB+ . NPr/J/R/P > front of the Plaza . ” # NSg/VB/J P D+ NSg+ . . > # > Several times he turned his head and looked back for their car , and if the # J/Dq+ NPl/V3+ NPr/ISg+ VP/J ISg/D$+ NPr/VB/J+ VB/C VP/J NSg/VB/J R/C/P D$+ NSg+ . VB/C NSg/C D+ > traffic delayed them he slowed up until they came into sight . I think he was # Nᴹ/VB/J+ VP/J NSg/IPl+ NPr/ISg+ VP/J NSg/VB/J/P C/P IPl+ NSg/VPt/P P N🅪Sg/VB+ . ISg/#r+ NSg/VB NPr/ISg+ VLPt > afraid they would dart down a side street and out of his life forever . # J IPl+ VXB NSg/VB N🅪Sg/VB/J/P D/P+ NSg/VB/J+ NSg/VB/J+ VB/C NSg/VB/J/R/P P ISg/D$+ N🅪Sg/VB+ NSg/J . > # > But they didn’t . And we all took the less explicable step of engaging the parlor # NSg/C/P IPl+ VXPt . VB/C IPl+ NSg/I/J/C/Dq VPt D VB/J/R/C/P J NSg/VB P Nᴹ/Vg/J D NSg > of a suite in the Plaza Hotel . # P D/P NSg+ NPr/J/R/P D NSg+ NSg+ . > # > The prolonged and tumultuous argument that ended by herding us into that room # D VP/J VB/C J N🅪Sg/VB+ NSg/I/C/Ddem+ VP/J NSg/P Nᴹ/Vg/J+ NPr/IPl+ P NSg/I/C/Ddem N🅪Sg/VB/J+ > eludes me , though I have a sharp physical memory that , in the course of it , my # V3 NPr/ISg+ . C ISg/#r+ NSg/VXB D/P NPr/VB/J NSg/J N🅪Sg+ NSg/I/C/Ddem+ . NPr/J/R/P D NSg/VB P NPr/ISg+ . D$+ > underwear kept climbing like a damp snake around my legs and intermittent beads # Nᴹ+ VP Nᴹ/Vg/J NSg/VB/J/C/P D/P Nᴹ/VB/J NPr/VB+ J/P D$+ NPl/V3+ VB/C NSg/J NPl/V3 > of sweat raced cool across my back . The notion originated with Daisy’s # P N🅪Sg/VB+ VP/J NSg/VB/J NSg/P D$+ NSg/VB/J . D+ NSg+ VP/J P NPr$ > suggestion that we hire five bathrooms and take cold baths , and then assumed # N🅪Sg+ NSg/I/C/Ddem+ IPl+ NSg/VB NSg NPl/V3+ VB/C NSg/VB NSg/J NSg/VB+ . VB/C NSg/J/R/C VP/J > more tangible form as “ a place to have a mint julep . ” Each of us said over and # NPr/I/J/R/Dq NSg/J N🅪Sg/VB+ R/C/P . D/P N🅪Sg/VB+ P NSg/VXB D/P NSg/VB/J NSg . . Dq P NPr/IPl+ VP/J NSg/J/P VB/C > over that it was a “ crazy idea ” — we all talked at once to a baffled clerk and # NSg/J/P NSg/I/C/Ddem NPr/ISg+ VLPt D/P . NSg/J NSg . . IPl+ NSg/I/J/C/Dq+ VP/J+ NSg/P NSg/C P D/P VP/J NSg/VB+ VB/C > thought , or pretended to think , that we were being very funny . . . # N🅪Sg/VP . NPr/C VP/J P NSg/VB . NSg/I/C/Ddem IPl+ NSg/VLPt N🅪Sg/VLg/J/C J/R NSg/J . . . > # > The room was large and stifling , and , though it was already four o’clock , # D+ N🅪Sg/VB/J+ VLPt NSg/J VB/C Nᴹ/Vg/J . VB/C . C NPr/ISg+ VLPt R NSg R . > opening the windows admitted only a gust of hot shrubbery from the Park . Daisy # Nᴹ/Vg/J D NPrPl/V3+ VP/J J/R/C D/P NSg/VB P NSg/VB/J NSg P D NPr/VB+ . NPr+ > went to the mirror and stood with her back to us , fixing her hair . # NSg/VPt P D+ NSg/VB+ VB/C VP P ISg/D$+ NSg/VB/J P NPr/IPl+ . Nᴹ/Vg/J ISg/D$+ N🅪Sg/VB+ . > # > “ It’s a swell suite , ” whispered Jordan respectfully , and every one laughed . # . K D/P+ NSg/VB/J+ NSg+ . . VP/J NPr+ R . VB/C Dq NSg/I/J+ VP/J . > # > “ Open another window , ” commanded Daisy , without turning around . # . NSg/VB/J I/D+ NSg/VB+ . . VP/J NPr+ . C/P Nᴹ/Vg/J J/P . > # > “ There aren’t any more . ” # . R+ VB I/R/Dq NPr/I/J/R/Dq . . > # > “ Well , we’d better telephone for an axe — — — ” # . NSg/VB/J/R . K NSg/VXB/JC NSg/VB+ R/C/P D/P NSg/VB/Br+ . . . . > # > “ The thing to do is to forget about the heat , ” said Tom impatiently . “ You make # . D+ NSg+ P VXB VL3 P VB J/P D+ Nᴹ/VB+ . . VP/J NPr/VB+ R . . ISgPl+ NSg/VB > it ten times worse by crabbing about it . ” # NPr/ISg+ NSg+ NPl/V3+ NSg/VB/JC NSg/P NSg/Vg J/P NPr/ISg+ . . > # > He unrolled the bottle of whiskey from the towel and put it on the table . # NPr/ISg+ VP/J D NSg/VB P N🅪Sg P D NSg/VB+ VB/C NSg/VBP NPr/ISg+ J/P D NSg/VB+ . > # > “ Why not let her alone , old sport ? ” remarked Gatsby . “ You’re the one that wanted # . NSg/VB NSg/R/C NSg/VBP ISg/D$+ J . NSg/J+ NSg/VB+ . . VP/J NPr . . K D+ NSg/I/J+ NSg/I/C/Ddem+ VP/J > to come to town . ” # P NSg/VBPp/P P NSg . . > # > There was a moment of silence . The telephone book slipped from its nail and # R+ VLPt D/P NSg P NSg/VB+ . D+ NSg/VB+ NSg/VB+ VP/J P ISg/D$+ NSg/VB+ VB/C > splashed to the floor , whereupon Jordan whispered , “ Excuse me ” — but this time no # VP/J P D+ NSg/VB+ . C NPr+ VP/J . . NSg/VB+ NPr/ISg+ . . NSg/C/P I/Ddem N🅪Sg/VB/J+ NSg/Dq/P > one laughed . # NSg/I/J+ VP/J . > # > “ I’ll pick it up , ” I offered . # . K NSg/VB NPr/ISg+ NSg/VB/J/P . . ISg/#r+ VP/J . > # > “ I’ve got it . ” Gatsby examined the parted string , muttered “ Hum ! ” in an # . K VP NPr/ISg+ . . NPr VP/J D VP/J NSg/VB+ . VP/J . NSg/VB . . NPr/J/R/P D/P+ > interested way , and tossed the book on a chair . # VP/J+ NSg/J+ . VB/C VP/J D NSg/VB+ J/P D/P+ NSg/VB+ . > # > “ That’s a great expression of yours , isn’t it ? ” said Tom sharply . # . NSg$ D/P NSg/J N🅪Sg P I+ . NSg/VX3 NPr/ISg+ . . VP/J NPr/VB+ R . > # > “ What is ? ” # . NSg/I+ VL3 . . > # > “ All this ‘ old sport ’ business . Where’d you pick that up ? ” # . NSg/I/J/C/Dq I/Ddem+ Unlintable NSg/J NSg/VB+ . N🅪Sg/J+ . K ISgPl+ NSg/VB NSg/I/C/Ddem+ NSg/VB/J/P . . > # > “ Now see here , Tom , ” said Daisy , turning around from the mirror , “ if you’re # . NSg/J/R/C NSg/VB J/R . NPr/VB+ . . VP/J NPr+ . Nᴹ/Vg/J J/P P D+ NSg/VB+ . . NSg/C K > going to make personal remarks I won’t stay here a minute . Call up and order # Nᴹ/Vg/J P NSg/VB NSg/J+ NPl/V3+ ISg/#r+ VXB NSg/VB/J J/R D/P NSg/VB/J+ . NSg/VB NSg/VB/J/P VB/C N🅪Sg/VB > some ice for the mint julep . ” # I/J/R/Dq+ NPr🅪Sg/VB+ R/C/P D NSg/VB/J NSg . . > # > As Tom took up the receiver the compressed heat exploded into sound and we were # R/C/P NPr/VB+ VPt NSg/VB/J/P D+ NSg+ D VP/J Nᴹ/VB+ VP/J P N🅪Sg/VB/J+ VB/C IPl+ NSg/VLPt > listening to the portentous chords of Mendelssohn’s Wedding March from the # Nᴹ/Vg/J P D J NPl/V3 P NPr$ NSg/Vg+ NPr/VB+ P D > ballroom below . # NSg/VB+ P . > # > “ Imagine marrying anybody in this heat ! ” cried Jordan dismally . # . NSg/VB Nᴹ/Vg/J NSg/I+ NPr/J/R/P I/Ddem+ Nᴹ/VB+ . . VP/J NPr+ R . > # > “ Still — I was married in the middle of June , ” Daisy remembered , “ Louisville in # . NSg/VB/J/R . ISg/#r+ VLPt NSg/VP/J NPr/J/R/P D NSg/VB/J P NPr+ . . NPr+ VP/J . . NPr NPr/J/R/P > June ! Somebody fainted . Who was it fainted , Tom ? ” # NPr+ . NSg/I+ VP/J . NPr/I+ VLPt NPr/ISg+ VP/J . NPr/VB+ . . > # > “ Biloxi , ” he answered shortly . # . ? . . NPr/ISg+ VP/J R . > # > “ A man named Biloxi . ‘ Blocks ’ Biloxi , and he made boxes — that’s a fact — and he was # . D/P+ NPr/VB/J+ VP/J ? . Unlintable NPl/V3+ . ? . VB/C NPr/ISg+ VP NPl/V3+ . NSg$ D/P+ NSg+ . VB/C NPr/ISg+ VLPt > from Biloxi , Tennessee . ” # P ? . NPr+ . . > # > “ They carried him into my house , ” appended Jordan , “ because we lived just two # . IPl+ VP/J ISg+ P D$+ NPr/VB+ . . VP/J NPr+ . . C/P IPl+ VP/J J/R NSg > doors from the church . And he stayed three weeks , until Daddy told him he had to # NPl/V3+ P D NPr🅪Sg/VB+ . VB/C NPr/ISg+ VP/J NSg+ NPrPl+ . C/P NSg/VB/J+ VP ISg+ NPr/ISg+ VP P > get out . The day after he left Daddy died . ” After a moment she added . ‘ ‘ There # NSg/VB NSg/VB/J/R/P . D+ NPr🅪Sg+ P NPr/ISg+ NPr/VP/J NSg/VB/J+ VP/J . . P D/P+ NSg+ ISg+ VP/J . Unlintable Unlintable R+ > wasn’t any connection . ” # VPt I/R/Dq N🅪Sg+ . . > # > “ I used to know a Bill Biloxi from Memphis , ” I remarked . # . ISg/#r+ VP/J P VB D/P+ NPr/VB+ ? P NPr+ . . ISg/#r+ VP/J . > # > “ That was his cousin . I knew his whole family history before he left . He gave me # . NSg/I/C/Ddem+ VLPt ISg/D$+ NSg/VB+ . ISg/#r+ VPt ISg/D$+ NSg/J+ N🅪Sg/J+ N🅪Sg+ C/P NPr/ISg+ NPr/VP/J . NPr/ISg+ VPt NPr/ISg+ > an aluminum putter that I use to - day . ” # D/P+ Nᴹ/NoAm+ NSg/VB NSg/I/C/Ddem ISg/#r+ N🅪Sg/VB P . NPr🅪Sg+ . . > # > The music had died down as the ceremony began and now a long cheer floated in at # D+ N🅪Sg/VB/J+ VP VP/J N🅪Sg/VB/J/P R/C/P D+ N🅪Sg+ VPt VB/C NSg/J/R/C D/P+ NPr/VB/J+ NSg/VB+ VP/J NPr/J/R/P NSg/P > the window , followed by intermittent cries of “ Yea — ea — ea ! ” and finally by a # D+ NSg/VB+ . VP/J NSg/P NSg/J NPl/V3 P . NSg/C . NSg . NSg . . VB/C R NSg/P D/P > burst of jazz as the dancing began . # NSg/VB P NSg/VB+ R/C/P D Nᴹ/Vg/J VPt . > # > “ We're getting old , ” said Daisy . “ lf we were young we’d rise and dance . ” # . K NSg/Vg NSg/J . . VP/J NPr+ . . ? IPl+ NSg/VLPt NPr/VB/J K NSg/VB VB/C N🅪Sg/VB+ . . > # > “ Remember Biloxi , ” Jordan warned her . ‘ ‘ Where’d you know him , Tom ? ” # . NSg/VB ? . . NPr+ VP/J ISg/D$+ . Unlintable Unlintable K ISgPl+ VB ISg+ . NPr/VB+ . . > # > “ Biloxi ? ” He concentrated with an effort . “ I didn’t know him . He was a friend of # . ? . . NPr/ISg+ VP/J P D/P+ N🅪Sg/VB+ . . ISg/#r+ VXPt VB ISg+ . NPr/ISg+ VLPt D/P NPr/VB/J P > Daisy’s . ” # NPr$ . . > # > “ He was not , ” she denied . “ I’d never seen him before . He came down in the # . NPr/ISg+ VLPt NSg/R/C . . ISg+ VP/J . . K R NSg/VPp ISg+ C/P . NPr/ISg+ NSg/VPt/P N🅪Sg/VB/J/P NPr/J/R/P D+ > private car . ” # NSg/VB/J+ NSg+ . . > # > “ Well , he said he knew you . He said he was raised in Louisville . Asa Bird # . NSg/VB/J/R . NPr/ISg+ VP/J NPr/ISg+ VPt ISgPl+ . NPr/ISg+ VP/J NPr/ISg+ VLPt VP/J NPr/J/R/P NPr . ? NPr/VB/J+ > brought him around at the last minute and asked if we had room for him . ” # VP ISg+ J/P NSg/P D NSg/VB/J NSg/VB/J+ VB/C VP/J NSg/C IPl+ VP N🅪Sg/VB/J+ R/C/P ISg+ . . > # > Jordan smiled . # NPr+ VP/J . > # > “ He was probably bumming his way home . He told me he was president of your class # . NPr/ISg+ VLPt R Vg ISg/D$+ NSg/J+ NSg/VB/J+ . NPr/ISg+ VP NPr/ISg+ NPr/ISg+ VLPt NSg/VB P D$+ N🅪Sg/VB/J+ > at Yale . ” # NSg/P NPr+ . . > # > Tom and I looked at each other blankly . # NPr/VB+ VB/C ISg/#r+ VP/J NSg/P Dq NSg/VB/J R . > # > “ Biloxi ? ” # . ? . . > # > “ First place , we didn’t have any president — — — ” # . NSg/J+ N🅪Sg/VB+ . IPl+ VXPt NSg/VXB I/R/Dq NSg/VB+ . . . . > # > Gatsby’s foot beat a short , restless tattoo and Tom eyed him suddenly . # NPr$ NSg/VB+ N🅪Sg/VB/J D/P NPr/VB/J/P . J NSg/VB VB/C NPr/VB+ VP/J ISg+ R . > # > “ By the way , Mr . Gatsby , I understand you’re an Oxford man . ” # . NSg/P D NSg/J+ . NSg+ . NPr . ISg/#r+ VB K D/P NPr+ NPr/VB/J+ . . > # > “ Not exactly . ” # . NSg/R/C R . . > # > “ Oh , yes , I understand you went to Oxford . ” # . NPr/VB . NPl/VB . ISg/#r+ VB ISgPl+ NSg/VPt P NPr+ . . > # > “ Yes — I went there . ” # . NPl/VB . ISg/#r+ NSg/VPt R . . > # > A pause . Then Tom’s voice , incredulous and insulting : # D/P+ NSg/VB+ . NSg/J/R/C NPr$ NSg/VB+ . J VB/C Nᴹ/Vg/J . > # > “ You must have gone there about the time Biloxi went to New Haven . ” # . ISgPl+ NSg/VXB NSg/VXB VPp/J/P R J/P D+ N🅪Sg/VB/J+ ? NSg/VPt P NSg/J+ NSg/VB+ . . > # > Another pause . A waiter knocked and came in with crushed mint and ice but the # I/D+ NSg/VB+ . D/P+ NSg/VB+ VP/J VB/C NSg/VPt/P NPr/J/R/P P VP/J NSg/VB/J VB/C NPr🅪Sg/VB+ NSg/C/P D > silence was unbroken by his “ thank you ” and the soft closing of the door . This # NSg/VB+ VLPt J NSg/P ISg/D$+ . NSg/VB ISgPl+ . VB/C D NSg/J Nᴹ/Vg/J P D NSg/VB+ . I/Ddem+ > tremendous detail was to be cleared up at last . # J+ N🅪Sg/VB/J+ VLPt P NSg/VLXB VP/J NSg/VB/J/P NSg/P NSg/VB/J . > # > “ I told you I went there , ” said Gatsby . # . ISg/#r+ VP ISgPl+ ISg/#r+ NSg/VPt R . . VP/J NPr . > # > “ I heard you , but I’d like to know when . ” # . ISg/#r+ VP/J ISgPl+ . NSg/C/P K NSg/VB/J/C/P P VB NSg/I/C . . > # > “ It was in nineteen - nineteen , I only stayed five months . That’s why I can’t # . NPr/ISg+ VLPt NPr/J/R/P NSg . NSg . ISg/#r+ J/R/C VP/J NSg+ NPl+ . NSg$ NSg/VB ISg/#r+ VXB > really call myself an Oxford man . ” # R NSg/VB ISg+ D/P NPr+ NPr/VB/J+ . . > # > Tom glanced around to see if we mirrored his unbelief . But we were all looking # NPr/VB+ VP/J J/P P NSg/VB NSg/C IPl+ VP/J+ ISg/D$+ N🅪Sg . NSg/C/P IPl+ NSg/VLPt NSg/I/J/C/Dq Nᴹ/Vg/J > at Gatsby . # NSg/P NPr . > # > “ It was an opportunity they gave to some of the officers after the armistice , ” # . NPr/ISg+ VLPt D/P N🅪Sg IPl+ VPt P I/J/R/Dq P D+ NPl/V3+ P D NPr🅪Sg . . > he continued . “ We could go to any of the universities in England or France . ” # NPr/ISg+ VP/J . . IPl+ NSg/VXB NSg/VB/J P I/R/Dq P D NPl+ NPr/J/R/P NPr NPr/C NPr+ . . > # > I wanted to get up and slap him on the back . I had one of those renewals of # ISg/#r+ VP/J P NSg/VB NSg/VB/J/P VB/C NSg/VB/J+ ISg+ J/P D NSg/VB/J . ISg/#r+ VP NSg/I/J P I/Ddem NPl P > complete faith in him that I’d experienced before . # NSg/VB/J NPr🅪Sg+ NPr/J/R/P ISg+ NSg/I/C/Ddem+ K VP/J C/P . > # > Daisy rose , smiling faintly , and went to the table . # NPr+ NPr/VPt/J . Nᴹ/Vg/J R . VB/C NSg/VPt P D+ NSg/VB+ . > # > “ Open the whiskey , Tom , ” she ordered , ‘ ‘ and I'll make you a mint julep . Then you # . NSg/VB/J D N🅪Sg . NPr/VB+ . . ISg+ VP/J . Unlintable Unlintable VB/C K NSg/VB ISgPl+ D/P NSg/VB/J NSg . NSg/J/R/C ISgPl+ > won’t seem so stupid to yourself . . . . Look at the mint ! ” # VXB VB NSg/I/J/R/C NSg/J P ISg+ . . . . NSg/VB NSg/P D NSg/VB/J . . > # > “ Wait a minute , ” snapped Tom , “ I want to ask Mr . Gatsby one more question . ” # . NSg/VB D/P+ NSg/VB/J+ . . VP NPr/VB+ . . ISg/#r+ NSg/VB P NSg/VB NSg+ . NPr NSg/I/J+ NPr/I/J/R/Dq NSg/VB+ . . > # > “ Go on , ” Gatsby said politely . # . NSg/VB/J J/P . . NPr VP/J R . > # > “ What kind of a row are you trying to cause in my house anyhow ? ” # . NSg/I+ NSg/J P D/P+ NSg/VB+ VLB ISgPl+ Nᴹ/Vg/J P N🅪Sg/VB/C NPr/J/R/P D$+ NPr/VB+ J . . > # > They were out in the open at last and Gatsby was content . # IPl+ NSg/VLPt NSg/VB/J/R/P NPr/J/R/P D NSg/VB/J NSg/P NSg/VB/J VB/C NPr VLPt N🅪Sg/VB/J+ . > # > “ He isn’t causing a row , ” Daisy looked desperately from one to the other . # . NPr/ISg+ NSg/VX3 Nᴹ/Vg/J D/P NSg/VB+ . . NPr+ VP/J R P NSg/I/J P D NSg/VB/J . > “ You’re causing a row . Please have a little self - control . ” # . K Nᴹ/Vg/J D/P NSg/VB+ . VB NSg/VXB D/P NPr/I/J/Dq NSg/I/VB/J+ . N🅪Sg/VB+ . . > # > “ Self - control ! ” repeated Tom incredulously . “ I suppose the latest thing is to # . NSg/I/VB/J+ . N🅪Sg/VB+ . . VP/J NPr/VB+ R . . ISg/#r+ VB D+ NSg/JS+ NSg+ VL3 P > sit back and let Mr . Nobody from Nowhere make love to your wife . Well , if that’s # NSg/VB NSg/VB/J VB/C NSg/VBP NSg+ . NSg/I+ P NSg/J NSg/VB NPr🅪Sg/VB P D$+ NSg/VB/J+ . NSg/VB/J/R . NSg/C NSg$ > the idea you can count me out . . . . Nowadays people begin by sneering at family # D+ NSg+ ISgPl+ NPr/VXB NSg/VB NPr/ISg+ NSg/VB/J/R/P . . . . NSg NPl/VB+ NSg/VB NSg/P Nᴹ/Vg/J NSg/P N🅪Sg/J+ > life and family institutions , and next they’ll throw everything overboard and # N🅪Sg/VB VB/C N🅪Sg/J+ + . VB/C NSg/J/P K NSg/VB NSg/I/VB+ VB/J VB/C > have intermarriage between black and white . ” # NSg/VXB N🅪Sg NSg/P N🅪Sg/VB/J VB/C NPr🅪Sg/VB/J . . > # > Flushed with his impassioned gibberish , he saw himself standing alone on the # VP/J P ISg/D$+ J NSg/J+ . NPr/ISg+ NSg/VPt ISg+ Nᴹ/Vg/J J J/P D > last barrier of civilization . # NSg/VB/J NSg/VB P NPr🅪Sg+ . > # > “ We’re all white here , ” murmured Jordan . # . K NSg/I/J/C/Dq NPr🅪Sg/VB/J J/R . . VP/J NPr+ . > # > “ I know I’m not very popular . I don’t give big parties . I suppose you’ve got to # . ISg/#r+ VB K NSg/R/C J/R NSg/J . ISg/#r+ VXB NSg/VB NSg/J NPl/V3+ . ISg/#r+ VB K VP P > make your house into a pigsty in order to have any friends — in the modern world . ” # NSg/VB D$+ NPr/VB+ P D/P NSg+ NPr/J/R/P N🅪Sg/VB+ P NSg/VXB I/R/Dq NPrPl/V3+ . NPr/J/R/P D NSg/J NSg/VB+ . . > # > Angry as I was , as we all were , I was tempted to laugh whenever he opened his # VB/J R/C/P ISg/#r+ VLPt . R/C/P IPl+ NSg/I/J/C/Dq NSg/VLPt . ISg/#r+ VLPt VP/J P NSg/VB C NPr/ISg+ VP/J ISg/D$+ > mouth . The transition from libertine to prig was so complete . # NSg/VB+ . D+ NSg/VB+ P NSg/J P NSg/VB VLPt NSg/I/J/R/C NSg/VB/J . > # > “ I’ve got something to tell you , old sport — ” began Gatsby . But Daisy guessed at # . K VP NSg/I/J+ P NPr/VB ISgPl+ . NSg/J NSg/VB+ . . VPt NPr . NSg/C/P NPr+ VP/J NSg/P > his intention . # ISg/D$+ NSg/VB+ . > # > “ Please don’t ! ” she interrupted helplessly . “ Please let’s all go home . Why don’t # . VB VXB . . ISg+ VP/J R . . VB NSg$ NSg/I/J/C/Dq NSg/VB/J NSg/VB/J+ . NSg/VB VXB > we all go home ? ” # IPl+ NSg/I/J/C/Dq NSg/VB/J NSg/VB/J+ . . > # > “ That’s a good idea . ” I got up . “ Come on , Tom . Nobody wants a drink . ” # . NSg$ D/P+ NPr/VB/J NSg+ . . ISg/#r+ VP NSg/VB/J/P . . NSg/VBPp/P J/P . NPr/VB+ . NSg/I+ NPl/V3 D/P+ NSg/VB+ . . > # > “ I want to know what Mr . Gatsby has to tell me . ” # . ISg/#r+ NSg/VB P VB NSg/I+ NSg+ . NPr V3 P NPr/VB NPr/ISg+ . . > # > “ Your wife doesn’t love you , ” said Gatsby . ‘ ‘ She’s never loved you . She loves # . D$+ NSg/VB/J+ VX3 NPr🅪Sg/VB ISgPl+ . . VP/J NPr . Unlintable Unlintable K R VP/J ISgPl+ . ISg+ NPl/V3 > me . ” # NPr/ISg+ . . > # > “ You must be crazy ! ” exclaimed Tom automatically . # . ISgPl+ NSg/VXB NSg/VLXB NSg/J . . VP/J NPr/VB+ R . > # > Gatsby sprang to his feet , vivid with excitement . # NPr VB P ISg/D$+ NPl+ . NSg/J P NSg+ . > # > “ She never loved you , do you hear ? ” he cried . “ She only married you because I # . ISg+ R VP/J ISgPl+ . VXB ISgPl+ VB . . NPr/ISg+ VP/J . . ISg+ J/R/C NSg/VP/J ISgPl+ C/P ISg/#r+ > was poor and she was tired of waiting for me . It was a terrible mistake , but in # VLPt NSg/VB/J VB/C ISg+ VLPt VP/J P Nᴹ/Vg/J R/C/P NPr/ISg+ . NPr/ISg+ VLPt D/P J NSg/VB . NSg/C/P NPr/J/R/P > her heart she never loved any one except me ! ” # ISg/D$+ N🅪Sg/VB+ ISg+ R VP/J I/R/Dq+ NSg/I/J+ VB/C/P NPr/ISg+ . . > # > At this point Jordan and I tried to go , but Tom and Gatsby insisted with # NSg/P I/Ddem+ NSg/VB+ NPr+ VB/C ISg/#r+ VP/J P NSg/VB/J . NSg/C/P NPr/VB+ VB/C NPr VP/J P > competitive firmness that we remain — as though neither of them had anything to # J Nᴹ NSg/I/C/Ddem IPl+ NSg/VB . R/C/P C I/C P NSg/IPl+ VP NSg/I/VB+ P > conceal and it would be a privilege to partake vicariously of their emotions . # VB VB/C NPr/ISg+ VXB NSg/VLXB D/P NSg/VB+ P VB R P D$+ NPl+ . > # > “ Sit down , Daisy , ” Tom’s voice groped unsuccessfully for the paternal note . # . NSg/VB N🅪Sg/VB/J/P . NPr+ . . NPr$ NSg/VB+ VP/J R R/C/P D J NSg/VB+ . > “ What’s been going on ? I want to hear all about it . ” # . K NSg/VLPp Nᴹ/Vg/J J/P . ISg/#r+ NSg/VB P VB NSg/I/J/C/Dq J/P NPr/ISg+ . . > # > “ I told you what’s been going on , ” said Gatsby . “ Going on for five years — and you # . ISg/#r+ VP ISgPl+ K NSg/VLPp Nᴹ/Vg/J J/P . . VP/J NPr . . Nᴹ/Vg/J J/P R/C/P NSg+ NPl+ . VB/C ISgPl+ > didn’t know . ” # VXPt VB . . > # > Tom turned to Daisy sharply . # NPr/VB+ VP/J P NPr R . > # > “ You’ve been seeing this fellow for five years ? ” # . K NSg/VLPp NSg/Vg/J/C I/Ddem NSg R/C/P NSg NPl+ . . > # > “ Not seeing , ” said Gatsby . “ No , we couldn’t meet . But both of us loved each # . NSg/R/C NSg/Vg/J/C . . VP/J NPr . . NSg/Dq/P . IPl+ VXB NSg/VB/J . NSg/C/P I/C/Dq P NPr/IPl+ VP/J Dq > other all that time , old sport , and you didn’t know . I used to laugh # NSg/VB/J NSg/I/J/C/Dq NSg/I/C/Ddem+ N🅪Sg/VB/J+ . NSg/J+ NSg/VB+ . VB/C ISgPl+ VXPt VB . ISg/#r+ VP/J P NSg/VB > sometimes ” — but there was no laughter in his eyes — “ to think that you didn’t # R . . NSg/C/P R+ VLPt NSg/Dq/P Nᴹ+ NPr/J/R/P ISg/D$+ NPl/V3+ . . P NSg/VB NSg/I/C/Ddem ISgPl+ VXPt > know . ” # VB . . > # > “ Oh — that’s all . ” Tom tapped his thick fingers together like a clergyman and # . NPr/VB . NSg$ NSg/I/J/C/Dq . . NPr/VB+ VP/J ISg/D$+ NSg/VB/J NPl/V3+ J NSg/VB/J/C/P D/P NSg VB/C > leaned back in his chair . # VP/J NSg/VB/J NPr/J/R/P ISg/D$+ NSg/VB+ . > # > “ You’re crazy ! ” he exploded . “ I can’t speak about what happened five years ago , # . K NSg/J . . NPr/ISg+ VP/J . . ISg/#r+ VXB NSg/VB J/P NSg/I+ VP/J NSg NPl+ J/P . > because I didn’t know Daisy then — and I’ll be damned if I see how you got within # C/P ISg/#r+ VXPt VB NPr+ NSg/J/R/C . VB/C K NSg/VLXB VP/J NSg/C ISg/#r+ NSg/VB NSg/C ISgPl+ VP NSg/J/P > a mile of her unless you brought the groceries to the back door . But all the # D/P NSg P ISg/D$+ C ISgPl+ VP D NPl/V3+ P D NSg/VB/J NSg/VB+ . NSg/C/P NSg/I/J/C/Dq D > rest of that’s a God damned lie . Daisy loved me when she married me and she # NSg/VB P NSg$ D/P+ NPr/VB+ VP/J NPr/VB+ . NPr+ VP/J NPr/ISg+ NSg/I/C ISg+ NSg/VP/J NPr/ISg+ VB/C ISg+ > loves me now . ” # NPl/V3 NPr/ISg+ NSg/J/R/C . . > # > “ No , ” said Gatsby , shaking his head . # . NSg/Dq/P . . VP/J NPr . Nᴹ/Vg/J ISg/D$+ NPr/VB/J+ . > # > “ She does , though . The trouble is that sometimes she gets foolish ideas in her # . ISg+ NPl/VX3 . C . D+ N🅪Sg/VB+ VL3 NSg/I/C/Ddem+ R ISg+ NPl/V3 J NPl+ NPr/J/R/P ISg/D$+ > head and doesn’t know what she’s doing . ” He nodded sagely . “ And what’s more , I # NPr/VB/J+ VB/C VX3 VB NSg/I+ K Nᴹ/Vg/J . . NPr/ISg+ VP R . . VB/C K NPr/I/J/R/Dq . ISg/#r+ > love Daisy too . Once in a while I go off on a spree and make a fool of myself , # NPr🅪Sg/VB NPr+ R . NSg/C NPr/J/R/P D/P+ NSg/VB/C/P+ ISg/#r+ NSg/VB/J NSg/VB/J/P J/P D/P+ NSg/VB+ VB/C NSg/VB D/P NSg/VB/J P ISg+ . > but I always come back , and in my heart I love her all the time . ” # NSg/C/P ISg/#r+ R NSg/VBPp/P NSg/VB/J . VB/C NPr/J/R/P D$+ N🅪Sg/VB+ ISg/#r+ NPr🅪Sg/VB ISg/D$+ NSg/I/J/C/Dq+ D+ N🅪Sg/VB/J+ . . > # > “ You're revolting , ” said Daisy . She turned to me , and her voice , dropping an # . + Nᴹ/Vg/J . . VP/J NPr+ . ISg+ VP/J P NPr/ISg+ . VB/C ISg/D$+ NSg/VB+ . NSg/Vg D/P > octave lower , filled the room with thrilling scorn : “ Do you know why we left # NSg/VB/J NSg/VB/JC . VP/J D N🅪Sg/VB/J+ P Nᴹ/Vg/J NSg/VB+ . . VXB ISgPl+ VB NSg/VB IPl+ NPr/VP/J > Chicago ? I’m surprised that they didn’t treat you to the story of that little # NPr+ . K VP/J NSg/I/C/Ddem IPl+ VXPt NSg/VB ISgPl+ P D NSg/VB P NSg/I/C/Ddem NPr/I/J/Dq > spree . ” # NSg/VB+ . . > # > Gatsby walked over and stood beside her . # NPr VP/J NSg/J/P VB/C VP P ISg/D$+ . > # > “ Daisy , that’s all over now , ” he said earnestly . “ It doesn’t matter any more . # . NPr+ . NSg$ NSg/I/J/C/Dq NSg/J/P NSg/J/R/C . . NPr/ISg+ VP/J R . . NPr/ISg+ VX3 N🅪Sg/VB+ I/R/Dq NPr/I/J/R/Dq . > Just tell him the truth — that you never loved him — and it’s all wiped out # J/R NPr/VB ISg+ D+ N🅪Sg/VB+ . NSg/I/C/Ddem ISgPl+ R VP/J ISg+ . VB/C K NSg/I/J/C/Dq+ VP/J+ NSg/VB/J/R/P > forever . ” # NSg/J . . > # > She looked at him blindly . “ Why — how could I love him — possibly ? ” # ISg+ VP/J NSg/P ISg+ R . . NSg/VB . NSg/C NSg/VXB ISg/#r+ NPr🅪Sg/VB ISg+ . R . . > # > “ You never loved him . ” # . ISgPl+ R VP/J ISg+ . . > # > She hesitated . Her eyes fell on Jordan and me with a sort of appeal , as though # ISg+ VP/J . ISg/D$+ NPl/V3+ NSg/VPt/J J/P NPr+ VB/C NPr/ISg+ P D/P NSg/VB P NSg/VB+ . R/C/P C > she realized at last what she was doing — and as though she had never , all along , # ISg+ VP/J/Comm/NoAm NSg/P NSg/VB/J+ NSg/I+ ISg+ VLPt Nᴹ/Vg/J . VB/C R/C/P C ISg+ VP R . NSg/I/J/C/Dq P . > intended doing anything at all . But it was done now . It was too late . # NSg/VP/J Nᴹ/Vg/J NSg/I/VB+ NSg/P NSg/I/J/C/Dq . NSg/C/P NPr/ISg+ VLPt NSg/VPp/J NSg/J/R/C . NPr/ISg+ VLPt R NSg/J . > # > “ I never loved him , ” she said , with perceptible reluctance . # . ISg/#r+ R VP/J ISg+ . . ISg+ VP/J . P NSg/J NSg+ . > # > “ Not at Kapiolani ? ” demanded Tom suddenly . # . NSg/R/C NSg/P ? . . VP/J NPr/VB+ R . > # > “ No . ” # . NSg/Dq/P . . > # > From the ballroom beneath , muffled and suffocating chords were drifting up on # P D+ NSg/VB+ P . VP/J VB/C Nᴹ/Vg/J NPl/V3+ NSg/VLPt Nᴹ/Vg/J NSg/VB/J/P J/P > hot waves of air . # NSg/VB/J NPl/V3 P N🅪Sg/VB+ . > # > “ Not that day I carried you down from the Punch Bowl to keep your shoes dry ? ” # . NSg/R/C NSg/I/C/Ddem+ NPr🅪Sg+ ISg/#r+ VP/J ISgPl+ N🅪Sg/VB/J/P P D+ NPr🅪Sg/VB+ NSg/VB+ P NSg/VB D$+ NPl/V3+ NSg/VB/J . . > There was a husky tenderness in his tone . . . . “ Daisy ? ” # R+ VLPt D/P NSg/J Nᴹ NPr/J/R/P ISg/D$+ N🅪Sg/I/VB+ . . . . . NPr+ . . > # > “ Please don’t . ” Her voice was cold , but the rancor was gone from it . She looked # . VB VXB . . ISg/D$+ NSg/VB+ VLPt NSg/J . NSg/C/P D NSg VLPt VPp/J/P P NPr/ISg+ . ISg+ VP/J > at Gatsby . “ There , Jay , ” she said — but her hand as she tried to light a cigarette # NSg/P NPr . . R . NPr+ . . ISg+ VP/J . NSg/C/P ISg/D$+ NSg/VB+ R/C/P ISg+ VP/J P N🅪Sg/VB/J D/P+ NSg/VB+ > was trembling . Suddenly she threw the cigarette and the burning match on the # VLPt Nᴹ/Vg/J . R ISg+ VPt D+ NSg/VB+ VB/C D Nᴹ/Vg/J NSg/VB J/P D+ > carpet . # NSg/VB+ . > # > “ Oh , you want too much ! ” she cried to Gatsby . “ I love you now — isn’t that enough ? # . NPr/VB . ISgPl+ NSg/VB R NSg/I/J/R/Dq . . ISg+ VP/J P NPr . . ISg/#r+ NPr🅪Sg/VB ISgPl+ NSg/J/R/C . NSg/VX3 NSg/I/C/Ddem+ NSg/I . > I can’t help what’s past . ” She began to sob helplessly . “ I did love him once — but # ISg/#r+ VXB NSg/VB K NSg/VB/J/P . . ISg+ VPt P NSg/VB R . . ISg/#r+ VXPt NPr🅪Sg/VB ISg+ NSg/C . NSg/C/P > I loved you too . ” # ISg/#r+ VP/J ISgPl+ R . . > # > Gatsby’s eyes opened and closed . # NPr$ NPl/V3+ VP/J VB/C VP/J . > # > “ You loved me too ? ” he repeated . # . ISgPl+ VP/J NPr/ISg+ R . . NPr/ISg+ VP/J . > # > “ Even that’s a lie , ” said Tom savagely . “ She didn’t know you were alive . # . NSg/VB/J/R NSg$ D/P+ NPr/VB+ . . VP/J NPr/VB+ R . . ISg+ VXPt VB ISgPl+ NSg/VLPt J . > Why — there’re things between Daisy and me that you’ll never know , things that # NSg/VB . ? NPl+ NSg/P NPr+ VB/C NPr/ISg+ NSg/I/C/Ddem+ K R VB . NPl+ NSg/I/C/Ddem+ > neither of us can ever forget . ” # I/C P NPr/IPl+ NPr/VXB J/R VB . . > # > The words seemed to bite physically into Gatsby . # D+ NPl/V3+ VP/J P NSg/VB R P NPr . > # > “ I want to speak to Daisy alone , ” he insisted . “ She’s all excited now — ” # . ISg/#r+ NSg/VB P NSg/VB P NPr J . . NPr/ISg+ VP/J . . K NSg/I/J/C/Dq VP/J NSg/J/R/C . . > # > “ Even alone I can’t say I never loved Tom , ” she admitted in a pitiful voice . “ It # . NSg/VB/J/R J ISg/#r+ VXB NSg/VB ISg/#r+ R VP/J NPr/VB+ . . ISg+ VP/J NPr/J/R/P D/P J NSg/VB+ . . NPr/ISg+ > wouldn’t be true . ” # VXB NSg/VLXB NSg/VB/J . . > # > “ Of course it wouldn’t , ” agreed Tom . # . P NSg/VB+ NPr/ISg+ VXB . . VP/J NPr/VB+ . > # > She turned to her husband . # ISg+ VP/J P ISg/D$+ NSg/VB+ . > # > “ As if it mattered to you , ” she said . # . R/C/P NSg/C NPr/ISg+ VP/J P ISgPl+ . . ISg+ VP/J . > # > “ Of course it matters . I’m going to take better care of you from now on . ” # . P NSg/VB+ NPr/ISg+ NPl/V3+ . K Nᴹ/Vg/J P NSg/VB NSg/VXB/JC N🅪Sg/VB P ISgPl+ P NSg/J/R/C J/P . . > # > “ You don’t understand , ” said Gatsby , with a touch of panic . “ You’re not going to # . ISgPl+ VXB VB . . VP/J NPr . P D/P N🅪Sg/VB P N🅪Sg/VB/J+ . . K NSg/R/C Nᴹ/Vg/J P > take care of her any more . ” # NSg/VB N🅪Sg/VB P ISg/D$+ I/R/Dq NPr/I/J/R/Dq . . > # > “ I’m not ? ” Tom opened his eyes wide and laughed . He could afford to control # . K NSg/R/C . . NPr/VB+ VP/J ISg/D$+ NPl/V3+ NSg/J VB/C VP/J . NPr/ISg+ NSg/VXB VB P N🅪Sg/VB > himself now . “ Why’s that ? ” # ISg+ NSg/J/R/C . . NSg$ NSg/I/C/Ddem+ . . > # > “ Daisy’s leaving you . ” # . NPr$ Nᴹ/Vg/J ISgPl+ . . > # > “ Nonsense . ” # . Nᴹ/VB/J+ . . > # > “ I am , though , ” she said with a visible effort . # . ISg/#r+ NPr/VLB/J . C . . ISg+ VP/J P D/P+ J+ N🅪Sg/VB+ . > # > “ She’s not leaving me ! ” Tom’s words suddenly leaned down over Gatsby . “ Certainly # . K NSg/R/C Nᴹ/Vg/J NPr/ISg+ . . NPr$ NPl/V3+ R VP/J N🅪Sg/VB/J/P NSg/J/P NPr . . R > not for a common swindler who’d have to steal the ring he put on her finger . ” # NSg/R/C R/C/P D/P NSg/VB/J NSg K NSg/VXB P NSg/VB D NSg/VB+ NPr/ISg+ NSg/VBP J/P ISg/D$+ NSg/VB+ . . > # > “ I won’t stand this ! ” cried Daisy . “ Oh , please let’s get out . ” # . ISg/#r+ VXB NSg/VB I/Ddem+ . . VP/J NPr+ . . NPr/VB . VB NSg$ NSg/VB NSg/VB/J/R/P . . > # > “ Who are you , anyhow ? ” broke out Tom . “ You’re one of that bunch that hangs # . NPr/I+ VLB ISgPl+ . J . . NSg/VPt/J NSg/VB/J/R/P NPr/VB+ . . K NSg/I/J P NSg/I/C/Ddem NSg/VB+ NSg/I/C/Ddem+ NPl/V3 > around with Meyer Wolfshiem — that much I happen to know . I’ve made a little # J/P P NPr ? . NSg/I/C/Ddem+ NSg/I/J/R/Dq ISg/#r+ VB P VB . K VP D/P NPr/I/J/Dq > investigation into your affairs — and I’ll carry it further to - morrow . ” # N🅪Sg+ P D$+ NPl+ . VB/C K NSg/VB NPr/ISg+ VB/JC P . NPr/VB . . > # > “ You can suit yourself about that , old sport . ” said Gatsby steadily . # . ISgPl+ NPr/VXB NSg/VB ISg+ J/P NSg/I/C/Ddem+ . NSg/J+ NSg/VB+ . . VP/J NPr R . > # > “ I found out what your ‘ drug - stores ’ were . ” He turned to us and spoke rapidly . # . ISg/#r+ NSg/VP NSg/VB/J/R/P NSg/I+ D$+ Unlintable NSg/VB+ . NPl/V3+ . NSg/VLPt . . NPr/ISg+ VP/J P NPr/IPl+ VB/C NSg/VPt R . > “ He and this Wolfshiem bought up a lot of side - street drug - stores here and in # . NPr/ISg+ VB/C I/Ddem ? NSg/VP NSg/VB/J/P D/P NPr/VB P NSg/VB/J+ . NSg/VB/J+ NSg/VB+ . NPl/V3+ J/R VB/C NPr/J/R/P > Chicago and sold grain alcohol over the counter . That’s one of his little # NPr+ VB/C NSg/VP N🅪Sg/VB+ N🅪Sg+ NSg/J/P D NSg/VB/J+ . NSg$ NSg/I/J P ISg/D$+ NPr/I/J/Dq > stunts . I picked him for a bootlegger the first time I saw him , and I wasn’t far # NPl/V3 . ISg/#r+ VP/J ISg+ R/C/P D/P NSg D+ NSg/J N🅪Sg/VB/J+ ISg/#r+ NSg/VPt ISg+ . VB/C ISg/#r+ VPt NSg/VB/J > wrong . ” # NSg/VB/J/R . . > # > “ What about it ? ” said Gatsby politely . “ I guess your friend Walter Chase wasn’t # . NSg/I+ J/P NPr/ISg+ . . VP/J NPr R . . ISg/#r+ NSg/VB D$+ NPr/VB/J+ NPr+ NPr/VB+ VPt > too proud to come in on it . ” # R J P NSg/VBPp/P NPr/J/R/P J/P NPr/ISg+ . . > # > “ And you left him in the lurch , didn’t you ? You let him go to jail for a month # . VB/C ISgPl+ NPr/VP/J ISg+ NPr/J/R/P D+ NSg/VB+ . VXPt ISgPl+ . ISgPl+ NSg/VBP ISg+ NSg/VB/J P N🅪Sg/VB R/C/P D/P+ NSg/J+ > over in New Jersey . God ! You ought to hear Walter on the subject of you . ” # NSg/J/P NPr/J/R/P NSg/J+ NPr+ . NPr/VB+ . ISgPl+ NSg/I/VXB P VB NPr+ J/P D NSg/VB/J P ISgPl+ . . > # > “ He came to us dead broke . He was very glad to pick up some money , old sport . ” # . NPr/ISg+ NSg/VPt/P P NPr/IPl+ NSg/VB/J+ NSg/VPt/J+ . NPr/ISg+ VLPt J/R NSg/VB/J P NSg/VB NSg/VB/J/P I/J/R/Dq+ N🅪Sg/J+ . NSg/J+ NSg/VB+ . . > # > “ Don’t you call me ‘ old sport ’ ! ” cried Tom . Gatsby said nothing . “ Walter could # . VXB ISgPl+ NSg/VB NPr/ISg+ Unlintable NSg/J NSg/VB+ . . . VP/J NPr/VB+ . NPr VP/J NSg/I/J+ . . NPr+ NSg/VXB > have you up on the betting laws too , but Wolfshiem scared him into shutting his # NSg/VXB ISgPl+ NSg/VB/J/P J/P D NSg/Vg/J NPl/V3+ R . NSg/C/P ? VP/J ISg+ P NSg/Vg ISg/D$+ > mouth . ” # NSg/VB+ . . > # > That unfamiliar yet recognizable look was back again in Gatsby’s face . # NSg/I/C/Ddem NSg/J NSg/VB/C J+ NSg/VB+ VLPt NSg/VB/J P NPr/J/R/P NPr$ NSg/VB+ . > # > “ That drug - store business was just small change , ” continued Tom slowly , “ but # . NSg/I/C/Ddem NSg/VB+ . NSg/VB+ N🅪Sg/J+ VLPt J/R NPr/VB/J+ N🅪Sg/VB+ . . VP/J NPr/VB+ R . . NSg/C/P > you’ve got something on now that Walter’s afraid to tell me about . ” # K VP NSg/I/J+ J/P NSg/J/R/C NSg/I/C/Ddem+ NPr$ J P NPr/VB NPr/ISg+ J/P . . > # > I glanced at Daisy , who was staring terrified between Gatsby and her husband , # ISg/#r+ VP/J NSg/P NPr+ . NPr/I+ VLPt Nᴹ/Vg/J VP/J NSg/P NPr VB/C ISg/D$+ NSg/VB+ . > and at Jordan , who had begun to balance an invisible but absorbing object on the # VB/C NSg/P NPr+ . NPr/I+ VP VPp P N🅪Sg/VB D/P J NSg/C/P Nᴹ/Vg/J NSg/VB+ J/P D > tip of her chin . Then I turned back to Gatsby — and was startled at his # NSg/VB P ISg/D$+ NPr/VB+ . NSg/J/R/C ISg/#r+ VP/J NSg/VB/J P NPr . VB/C VLPt VP/J NSg/P ISg/D$+ > expression . He looked — and this is said in all contempt for the babbled slander # N🅪Sg+ . NPr/ISg+ VP/J . VB/C I/Ddem+ VL3 VP/J NPr/J/R/P NSg/I/J/C/Dq Nᴹ+ R/C/P D VP/J NSg/VB > of his garden — as if he had “ killed a man . ” For a moment the set of his face # P ISg/D$+ NSg/VB/J+ . R/C/P NSg/C NPr/ISg+ VP . VP/J D/P NPr/VB/J+ . . R/C/P D/P+ NSg+ D NPr/VBP/J P ISg/D$+ NSg/VB+ > could be described in just that fantastic way . # NSg/VXB NSg/VLXB VP/J NPr/J/R/P J/R NSg/I/C/Ddem+ NSg/J+ NSg/J+ . > # > It passed , and he began to talk excitedly to Daisy , denying everything , # NPr/ISg+ VP/J . VB/C NPr/ISg+ VPt P N🅪Sg/VB R P NPr . Nᴹ/Vg/J NSg/I/VB+ . > defending his name against accusations that had not been made . But with every # Nᴹ/Vg/J ISg/D$+ NSg/VB+ C/P NPl+ NSg/I/C/Ddem+ VP NSg/R/C NSg/VLPp VP . NSg/C/P P Dq+ > word she was drawing further and further into herself , so he gave that up , and # NSg/VB+ ISg+ VLPt N🅪Sg/Vg/J VB/JC VB/C VB/JC P ISg+ . NSg/I/J/R/C NPr/ISg+ VPt NSg/I/C/Ddem+ NSg/VB/J/P . VB/C > only the dead dream fought on as the afternoon slipped away , trying to touch # J/R/C D+ NSg/VB/J+ NSg/VB/J+ VB J/P R/C/P D+ N🅪Sg+ VP/J VB/J . Nᴹ/Vg/J P N🅪Sg/VB > what was no longer tangible , struggling unhappily , undespairingly , toward that # NSg/I+ VLPt NSg/Dq/P NSg/JC NSg/J . Nᴹ/Vg/J R . ? . J/P NSg/I/C/Ddem+ > lost voice across the room . # VP/J NSg/VB+ NSg/P D N🅪Sg/VB/J+ . > # > The voice begged again to go . # D+ NSg/VB+ VP P P NSg/VB/J . > # > “ Please , Tom ! I can’t stand this any more . ” # . VB . NPr/VB+ . ISg/#r+ VXB NSg/VB I/Ddem I/R/Dq NPr/I/J/R/Dq . . > # > Her frightened eyes told that whatever intentions , whatever courage she had had , # ISg/D$+ VP/J NPl/V3+ VP NSg/I/C/Ddem NSg/I/J+ NPl/V3+ . NSg/I/J+ NSg/VB+ ISg+ VP VP . > were definitely gone . # NSg/VLPt R VPp/J/P . > # > “ You two start on home , Daisy , ” said Tom . “ In Mr . Gatsby’s car . ” # . ISgPl+ NSg NSg/VB J/P NSg/VB/J+ . NPr+ . . VP/J NPr/VB+ . . NPr/J/R/P NSg+ . NPr$ NSg+ . . > # > She looked at Tom , alarmed now , but he insisted with magnanimous scorn . # ISg+ VP/J NSg/P NPr/VB+ . VP/J NSg/J/R/C . NSg/C/P NPr/ISg+ VP/J P J NSg/VB+ . > # > “ Go on . He won’t annoy you . I think he realizes that his presumptuous little # . NSg/VB/J J/P . NPr/ISg+ VXB NSg/VB ISgPl+ . ISg/#r+ NSg/VB NPr/ISg+ V3/Comm/NoAm NSg/I/C/Ddem ISg/D$+ J NPr/I/J/Dq > flirtation is over . ” # NSg VL3 NSg/J/P . . > # > They were gone , without a word , snapped out , made accidental , isolated , like # IPl+ NSg/VLPt VPp/J/P . C/P D/P+ NSg/VB+ . VP NSg/VB/J/R/P . VP NSg/J . VP/J . NSg/VB/J/C/P > ghosts , even from our pity . # NPl/V3+ . NSg/VB/J/R P D$+ N🅪Sg/VB+ . > # > After a moment Tom got up and began wrapping the unopened bottle of whiskey in # P D/P+ NSg+ NPr/VB+ VP NSg/VB/J/P VB/C VPt N🅪Sg/Vg+ D VB/J NSg/VB P N🅪Sg NPr/J/R/P > the towel . # D NSg/VB+ . > # > “ Want any of this stuff ? Jordan ? . . . Nick ? ” # . NSg/VB I/R/Dq P I/Ddem+ Nᴹ/VB+ . NPr+ . . . . NPr/VB+ . . > # > I didn’t answer . # ISg/#r+ VXPt NSg/VB+ . > # > “ Nick ? ” He asked again . # . NPr/VB+ . . NPr/ISg+ VP/J P . > # > “ What ? ” # . NSg/I+ . . > # > “ Want any ? ” # . NSg/VB I/R/Dq . . > # > “ No . . . I just remembered that to - day’s my birthday . ” # . NSg/Dq/P . . . ISg/#r+ J/R VP/J NSg/I/C/Ddem+ P . NPr$ D$+ NSg/VB+ . . > # > I was thirty . Before me stretched the portentous , menacing road of a new decade . # ISg/#r+ VLPt NSg . C/P NPr/ISg+ VP/J D J . Nᴹ/Vg/J N🅪Sg/J P D/P NSg/J NSg+ . > # > It was seven o’clock when we got into the coupé with him and started for Long # NPr/ISg+ VLPt NSg R NSg/I/C IPl+ VP P D ? P ISg+ VB/C VP/J R/C/P NPr/VB/J > Island . Tom talked incessantly , exulting and laughing , but his voice was as # NSg/VB+ . NPr/VB+ VP/J R . Nᴹ/Vg/J VB/C Nᴹ/Vg/J . NSg/C/P ISg/D$+ NSg/VB+ VLPt R/C/P > remote from Jordan and me as the foreign clamor on the sidewalk or the tumult of # NSg/VB/J P NPr+ VB/C NPr/ISg+ R/C/P D NSg/J NSg/VB J/P D NSg+ NPr/C D NSg/VB P > the elevated overhead . Human sympathy has its limits , and we were content to let # D VP/J NSg/J/P+ . NSg/VB/J+ NSg+ V3 ISg/D$+ NPl/V3+ . VB/C IPl+ NSg/VLPt N🅪Sg/VB/J P NSg/VBP > all their tragic arguments fade with the city lights behind . Thirty — the promise # NSg/I/J/C/Dq+ D$+ NSg/J+ NPl/V3+ NSg/VB/J P D+ NSg+ NPl/V3+ NSg/J/P . NSg . D NSg/VB > of a decade of loneliness , a thinning list of single men to know , a thinning # P D/P NSg P Nᴹ . D/P NSg/Vg/J NSg/VB P NSg/VB/J NPl+ P VB . D/P NSg/Vg/J > brief - case of enthusiasm , thinning hair . But there was Jordan beside me , who , # NSg/VB/J . NPr🅪Sg/VB P NSg+ . NSg/Vg/J N🅪Sg/VB+ . NSg/C/P R+ VLPt NPr+ P NPr/ISg+ . NPr/I+ . > unlike Daisy , was too wise ever to carry well - forgotten dreams from age to age . # NSg/VB/J/P NPr+ . VLPt R NPr/VB/J J/R P NSg/VB NSg/VB/J/R . NSg/VPp/J NPl/V3+ P N🅪Sg/VB+ P N🅪Sg/VB . > As we passed over the dark bridge her wan face fell lazily against my coat’s # R/C/P IPl+ VP/J NSg/J/P D+ NSg/VB/J+ N🅪Sg/VB+ ISg/D$+ NSg/VB/J NSg/VB+ NSg/VPt/J R C/P D$+ NSg$ > shoulder and the formidable stroke of thirty died away with the reassuring # NSg/VB+ VB/C D J NSg/VB+ P NSg VP/J VB/J P D Nᴹ/Vg/J > pressure of her hand . # N🅪Sg/VB P ISg/D$+ NSg/VB+ . > # > So we drove on toward death through the cooling twilight . # NSg/I/J/R/C IPl+ NSg/VPt J/P J/P NPr🅪Sg+ NSg/J/P D+ Nᴹ/Vg/J+ Nᴹ/VB/J+ . > # > The young Greek , Michaelis , who ran the coffee joint beside the ashheaps was the # D NPr/VB/J NPr/VB/J . ? . NPr/I+ NSg/VPt D+ N🅪Sg/VB/J+ NSg/VB/J P D ? VLPt D > principal witness at the inquest . He had slept through the heat until after # NSg/J NSg/VB NSg/P D NSg/VB . NPr/ISg+ VP VP NSg/J/P D+ Nᴹ/VB+ C/P P > five , when he strolled over to the garage , and found George Wilson sick in his # NSg . NSg/I/C NPr/ISg+ VP/J NSg/J/P P D+ NSg/VB+ . VB/C NSg/VP NPr+ NPr+ NSg/VB/J NPr/J/R/P ISg/D$+ > office — really sick , pale as his own pale hair and shaking all over . Michaelis # NSg/VB+ . R NSg/VB/J . NSg/VB/J R/C/P ISg/D$+ NSg/VB/J+ NSg/VB/J+ N🅪Sg/VB+ VB/C Nᴹ/Vg/J NSg/I/J/C/Dq NSg/J/P . ? > advised him to go to bed , but Wilson refused , saying that he’d miss a lot of # VP/J ISg+ P NSg/VB/J P NSg/VBP/J . NSg/C/P NPr+ VP/J . N🅪Sg/Vg/J NSg/I/C/Ddem K NSg/VB D/P NPr/VB P > business if he did . While his neighbor was trying to persuade him a violent # N🅪Sg/J+ NSg/C NPr/ISg+ VXPt . NSg/VB/C/P ISg/D$+ NSg/VB/J/Am+ VLPt Nᴹ/Vg/J P VB ISg+ D/P+ NSg/VB/J+ > racket broke out overhead . # NSg/VB+ NSg/VPt/J NSg/VB/J/R/P NSg/J/P+ . > # > “ I’ve got my wife locked in up there , ” explained Wilson calmly . “ She’s going to # . K VP D$+ NSg/VB/J+ VP/J NPr/J/R/P NSg/VB/J/P R . . VP/J NPr+ R . . K Nᴹ/Vg/J P > stay there till the day after to - morrow , and then we’re going to move away . ” # NSg/VB/J R NSg/VB/C/P D NPr🅪Sg+ P P . NPr/VB . VB/C NSg/J/R/C K Nᴹ/Vg/J P NSg/VB VB/J . . > # > Michaelis was astonished ; they had been neighbors for four years , and Wilson had # ? VLPt VP/J . IPl+ VP NSg/VLPp NPl/V3/Am R/C/P NSg+ NPl+ . VB/C NPr+ VP > never seemed faintly capable of such a statement . Generally he was one of these # R VP/J R J P NSg/I D/P+ NSg/VB/J+ . R NPr/ISg+ VLPt NSg/I/J P I/Ddem+ > worn - out men : when he wasn’t working , he sat on a chair in the doorway and # VPp/J+ . NSg/VB/J/R/P NPl+ . NSg/I/C NPr/ISg+ VPt Nᴹ/Vg/J . NPr/ISg+ NSg/VP/J J/P D/P NSg/VB+ NPr/J/R/P D NSg+ VB/C > stared at the people and the cars that passed along the road . When any one spoke # VP/J NSg/P D NPl/VB+ VB/C D NPl+ NSg/I/C/Ddem+ VP/J P D N🅪Sg/J+ . NSg/I/C I/R/Dq NSg/I/J+ NSg/VPt > to him he invariably laughed in an agreeable , colorless way . He was his wife’s # P ISg+ NPr/ISg+ R VP/J NPr/J/R/P D/P J . J/Am NSg/J+ . NPr/ISg+ VLPt ISg/D$+ NSg$ > man and not his own . # NPr/VB/J+ VB/C NSg/R/C ISg/D$+ NSg/VB/J . > # > So naturally Michaelis tried to find out what had happened , but Wilson wouldn’t # NSg/I/J/R/C R ? VP/J P NSg/VB NSg/VB/J/R/P NSg/I+ VP VP/J . NSg/C/P NPr+ VXB > say a word — instead he began to throw curious , suspicious glances at his visitor # NSg/VB D/P NSg/VB+ . R NPr/ISg+ VPt P NSg/VB J . J NPl/V3+ NSg/P ISg/D$+ NSg+ > and ask him what he’d been doing at certain times on certain days . Just as the # VB/C NSg/VB ISg+ NSg/I+ K NSg/VLPp Nᴹ/Vg/J NSg/P I/J NPl/V3+ J/P I/J+ NPl+ . J/R R/C/P D > latter was getting uneasy , some workmen came past the door bound for his # NSg/J VLPt NSg/Vg NSg/VB/J . I/J/R/Dq+ NPl+ NSg/VPt/P NSg/VB/J/P D+ NSg/VB+ NSg/VP/J R/C/P ISg/D$+ > restaurant , and Michaelis took the opportunity to get away , intending to come # NSg+ . VB/C ? VPt D+ N🅪Sg+ P NSg/VB VB/J . Nᴹ/Vg/J P NSg/VBPp/P > back later . But he didn’t . He supposed he forgot to , that’s all . When he came # NSg/VB/J JC . NSg/C/P NPr/ISg+ VXPt . NPr/ISg+ VP/J NPr/ISg+ VPt P . NSg$ NSg/I/J/C/Dq . NSg/I/C NPr/ISg+ NSg/VPt/P > outside again , a little after seven , he was reminded of the conversation because # Nᴹ/VB/J/P P . D/P NPr/I/J/Dq P NSg . NPr/ISg+ VLPt VP/J P D+ N🅪Sg/VB+ C/P > he heard Mrs . Wilson’s voice , loud and scolding , down - stairs in the garage . # NPr/ISg+ VP/J NPl+ . NPr$ NSg/VB+ . NSg/J VB/C Nᴹ/Vg/J . N🅪Sg/VB/J/P . NPl+ NPr/J/R/P D NSg/VB+ . > # > “ Beat me ! ” he heard her cry . “ Throw me down and beat me , you dirty little # . N🅪Sg/VB/J NPr/ISg+ . . NPr/ISg+ VP/J ISg/D$+ NSg/VB . . NSg/VB NPr/ISg+ N🅪Sg/VB/J/P VB/C N🅪Sg/VB/J NPr/ISg+ . ISgPl+ VB/J NPr/I/J/Dq > coward ! ” # NPr/VB/J . . > # > A moment later she rushed out into the dusk , waving her hands and # D/P+ NSg+ JC ISg+ VP/J NSg/VB/J/R/P P D+ Nᴹ/VB/J+ . Nᴹ/Vg/J ISg/D$+ NPl/V3 VB/C > shouting — before he could move from his door the business was over . # Nᴹ/Vg/J+ . C/P NPr/ISg+ NSg/VXB NSg/VB P ISg/D$+ NSg/VB D+ N🅪Sg/J+ VLPt NSg/J/P . > # > The “ death car ” as the newspapers called it , didn’t stop ; it came out of the # D . NPr🅪Sg+ NSg+ . R/C/P D+ NPl/V3+ VP/J NPr/ISg+ . VXPt NSg/VB . NPr/ISg+ NSg/VPt/P NSg/VB/J/R/P P D > gathering darkness , wavered tragically for a moment , and then disappeared around # Nᴹ/Vg/J Nᴹ+ . VP/J R R/C/P D/P NSg+ . VB/C NSg/J/R/C VP/J J/P > the next bend . Mavromichaelis wasn’t even sure of its color — he told the first # D NSg/J/P NPr/VB+ . ? VPt NSg/VB/J/R J P ISg/D$+ N🅪Sg/VB/J/Am+ . NPr/ISg+ VP D NSg/J > policeman that it was light green . The other car , the one going toward New York , # NSg+ NSg/I/C/Ddem+ NPr/ISg+ VLPt N🅪Sg/VB/J+ NPr🅪Sg/VB/J . D+ NSg/VB/J+ NSg+ . D+ NSg/I/J+ Nᴹ/Vg/J J/P NSg/J+ NPr+ . > came to rest a hundred yards beyond , and it’s driver hurried back to where # NSg/VPt/P P NSg/VB D/P+ NSg+ NPl/V3+ NSg/P . VB/C K NSg+ VP/J NSg/VB/J P NSg/R/C > Myrtle Wilson , her life violently extinguished , knelt in the road and mingled # NPr NPr+ . ISg/D$+ N🅪Sg/VB+ R VP/J . VP NPr/J/R/P D N🅪Sg/J+ VB/C VP/J > her thick dark blood with the dust . # ISg/D$+ NSg/VB/J NSg/VB/J Nᴹ/VB+ P D Nᴹ/VB+ . > # > Michaelis and this man reached her first , but when they had torn open her # ? VB/C I/Ddem+ NPr/VB/J+ VP/J ISg/D$+ NSg/J . NSg/C/P NSg/I/C IPl+ VP VB/J NSg/VB/J ISg/D$+ > shirtwaist , still damp with perspiration , they saw that her left breast was # NSg . NSg/VB/J/R Nᴹ/VB/J P Nᴹ+ . IPl+ NSg/VPt NSg/I/C/Ddem ISg/D$+ NPr/VP/J NSg/VB+ VLPt > swinging loose like a flap , and there was no need to listen for the heart # Nᴹ/Vg/J NSg/VB/J NSg/VB/J/C/P D/P NSg/VB+ . VB/C R+ VLPt NSg/Dq/P N🅪Sg/VXB P NSg/VB R/C/P D N🅪Sg/VB+ > beneath . The mouth was wide open and ripped a little at the corners , as though # P . D+ NSg/VB+ VLPt NSg/J NSg/VB/J VB/C VP/J D/P NPr/I/J/Dq NSg/P D+ NPl/V3+ . R/C/P C > she had choked a little in giving up the tremendous vitality she had stored so # ISg+ VP VP/J D/P NPr/I/J/Dq NPr/J/R/P Nᴹ/Vg/J NSg/VB/J/P D J Nᴹ+ ISg+ VP VP/J NSg/I/J/R/C > long . # NPr/VB/J . > # > We saw the three or four automobiles and the crowd when we were still some # IPl+ NSg/VPt D NSg NPr/C NSg NPl/V3 VB/C D+ NSg/VB+ NSg/I/C IPl+ NSg/VLPt NSg/VB/J/R I/J/R/Dq > distance away # N🅪Sg/VB+ VB/J > # > “ Wreck ! ” said Tom . “ That’s good . Wilson’ll have a little business at last . ” # . NSg/VB+ . . VP/J NPr/VB+ . . NSg$ NPr/VB/J . ? NSg/VXB D/P NPr/I/J/Dq N🅪Sg/J+ NSg/P NSg/VB/J . . > # > He slowed down , but still without any intention of stopping , until , as we came # NPr/ISg+ VP/J N🅪Sg/VB/J/P . NSg/C/P NSg/VB/J/R C/P I/R/Dq NSg/VB P NSg/Vg+ . C/P . R/C/P IPl+ NSg/VPt/P > nearer , the hushed , intent faces of the people at the garage door made him # NSg/JC . D VP/J . NSg/J+ NPl/V3 P D NPl/VB+ NSg/P D NSg/VB+ NSg/VB+ VP ISg+ > automatically put on the brakes . # R NSg/VBP J/P D NPl/V3+ . > # > “ We'll take a look , ” he said doubtfully , “ just a look . ” # . K NSg/VB D/P NSg/VB+ . . NPr/ISg+ VP/J R . . J/R D/P NSg/VB+ . . > # > I became aware now of a hollow , wailing sound which issued incessantly from the # ISg/#r+ VPt VB/J NSg/J/R/C P D/P NSg/VB/J . Nᴹ/Vg/J N🅪Sg/VB/J+ I/C+ VP/J R P D > garage , a sound which as we got out of the coupé and walked toward the door # NSg/VB+ . D/P N🅪Sg/VB/J+ I/C+ R/C/P IPl+ VP NSg/VB/J/R/P P D ? VB/C VP/J J/P D NSg/VB+ > resolved itself into the words “ Oh , my God ! ” uttered over and over in a gasping # VP/J ISg+ P D NPl/V3+ . NPr/VB . D$+ NPr/VB+ . . VP/J NSg/J/P VB/C NSg/J/P NPr/J/R/P D/P Nᴹ/Vg/J > moan . # NSg/VB . > # > “ There’s some bad trouble here , ” said Tom excitedly . # . K I/J/R/Dq+ NSg/VB/J N🅪Sg/VB+ J/R . . VP/J NPr/VB+ R . > # > He reached up on tiptoes and peered over a circle of heads into the garage , # NPr/ISg+ VP/J NSg/VB/J/P J/P NPl/V3 VB/C VP/J NSg/J/P D/P NSg/VB P NPl/V3+ P D NSg/VB+ . > which was lit only by a yellow light in a swinging metal basket overhead . Then # I/C+ VLPt NSg/VP/J J/R/C NSg/P D/P NSg/VB/J N🅪Sg/VB/J+ NPr/J/R/P D/P Nᴹ/Vg/J N🅪Sg/VB/J+ NSg/VB+ NSg/J/P+ . NSg/J/R/C > he made a harsh sound in his throat , and with a violent thrusting movement of # NPr/ISg+ VP D/P VB/J N🅪Sg/VB/J+ NPr/J/R/P ISg/D$+ NSg/VB+ . VB/C P D/P NSg/VB/J Nᴹ/Vg/J+ N🅪Sg P > his powerful arms pushed his way through . # ISg/D$+ J+ NPl/V3+ VP/J ISg/D$+ NSg/J+ NSg/J/P . > # > The circle closed up again with a running murmur of expostulation ; it was a # D+ NSg/VB+ VP/J NSg/VB/J/P P P D/P Nᴹ/Vg/J/P NSg/VB P NSg+ . NPr/ISg+ VLPt D/P > minute before I could see anything at all . Then new arrivals deranged the line , # NSg/VB/J+ C/P ISg/#r+ NSg/VXB NSg/VB NSg/I/VB+ NSg/P NSg/I/J/C/Dq . NSg/J/R/C NSg/J NPl VP/J D NSg/VB+ . > and Jordan and I were pushed suddenly inside . # VB/C NPr+ VB/C ISg/#r+ NSg/VLPt VP/J R NSg/J/P . > # > Myrtle Wilson’s body , wrapped in a blanket , and then in another blanket , as # NPr NPr$ NSg/VB+ . VP/J NPr/J/R/P D/P NSg/VB/J+ . VB/C NSg/J/R/C NPr/J/R/P I/D NSg/VB/J+ . R/C/P > though she suffered from a chill in the hot night , lay on a work - table by the # C ISg+ VP/J P D/P N🅪Sg/VB/J+ NPr/J/R/P D NSg/VB/J N🅪Sg/VB+ . NSg/VBPt/J J/P D/P N🅪Sg/VB+ . NSg/VB+ NSg/P D > wall , and Tom , with his back to us , was bending over it , motionless . Next to him # NPr/VB+ . VB/C NPr/VB+ . P ISg/D$+ NSg/VB/J P NPr/IPl+ . VLPt Nᴹ/Vg/J NSg/J/P NPr/ISg+ . J . NSg/J/P P ISg+ > stood a motorcycle policeman taking down names with much sweat and correction in # VP D/P+ NSg/VB+ NSg+ NSg/Vg/J N🅪Sg/VB/J/P NPl/V3+ P NSg/I/J/R/Dq N🅪Sg/VB VB/C NSg+ NPr/J/R/P > a little book . At first I couldn’t find the source of the high , groaning words # D/P+ NPr/I/J/Dq+ NSg/VB+ . NSg/P NSg/J ISg/#r+ VXB NSg/VB D N🅪Sg/VB P D NSg/VB/J/R . Nᴹ/Vg/J NPl/V3+ > that echoed clamorously through the bare garage — then I saw Wilson standing on # NSg/I/C/Ddem VP/J ? NSg/J/P D NSg/VB/J NSg/VB+ . NSg/J/R/C ISg/#r+ NSg/VPt NPr+ Nᴹ/Vg/J J/P > the raised threshold of his office , swaying back and forth and holding to the # D VP/J NSg P ISg/D$+ NSg/VB+ . Nᴹ/Vg/J NSg/VB/J VB/C R VB/C Nᴹ/Vg/J P D > doorposts with both hands . Some man was talking to him in a low voice and # NPl P I/C/Dq NPl/V3+ . I/J/R/Dq+ NPr/VB/J+ VLPt Nᴹ/Vg/J P ISg+ NPr/J/R/P D/P+ NSg/VB/J/R+ NSg/VB+ VB/C > attempting , from time to time , to lay a hand on his shoulder , but Wilson neither # Nᴹ/Vg/J . P N🅪Sg/VB/J+ P N🅪Sg/VB/J . P NSg/VBPt/J D/P+ NSg/VB+ J/P ISg/D$+ NSg/VB+ . NSg/C/P NPr+ I/C > heard nor saw . His eyes would drop slowly from the swinging light to the laden # VP/J NSg/C NSg/VPt . ISg/D$+ NPl/V3+ VXB NSg/VB+ R P D Nᴹ/Vg/J N🅪Sg/VB/J+ P D+ VB/J+ > table by the wall , and then jerk back to the light again , and he gave out # NSg/VB+ NSg/P D+ NPr/VB+ . VB/C NSg/J/R/C NSg/VB+ NSg/VB/J P D+ N🅪Sg/VB/J+ P . VB/C NPr/ISg+ VPt NSg/VB/J/R/P > incessantly his high , horrible call : # R ISg/D$+ NSg/VB/J/R . NSg/J NSg/VB+ . > # > “ Oh , my Ga - od ! Oh , my Ga - od ! Oh , Ga - od ! Oh , my Ga - od ! ” # . NPr/VB . D$+ NPr+ . NSg/VB . NPr/VB . D$+ NPr+ . NSg/VB . NPr/VB . NPr+ . NSg/VB . NPr/VB . D$+ NPr+ . NSg/VB . . > # > Presently Tom lifted his head with a jerk and , after staring around the garage # R NPr/VB+ VP/J ISg/D$+ NPr/VB/J P D/P+ NSg/VB+ VB/C . P Nᴹ/Vg/J J/P D+ NSg/VB+ > with glazed eyes , addressed a mumbled incoherent remark to the policeman . # P VP/J NPl/V3+ . VP/J D/P VP/J J NSg/VB P D+ NSg+ . > # > “ M - a - v — ” the policeman was saying , “ — o — — — ” # . NPr/VB/J/#r . D/P . NSg/P/#r . . D+ NSg+ VLPt N🅪Sg/Vg/J . . . NPr/J/P . . . . > # > “ No , r — ” corrected the man , “ M - a - v - r - o — — — ” # . NSg/Dq/P . NPr/J . . VP/J D+ NPr/VB/J+ . . NPr/VB/J/#r . D/P . NSg/P/#r . NPr/J . NPr/J/P . . . . > # > “ Listen to me ! ” muttered Tom fiercely . # . NSg/VB P NPr/ISg+ . . VP/J NPr/VB+ R . > # > “ r — ” said the policeman , “ o — — — ” # . NPr/J . . VP/J D+ NSg+ . . NPr/J/P . . . . > # > “ g — — — ” # . NSg+ . . . . > # > “ g — ” He looked up as Tom’s broad hand fell sharply on his shoulder . “ What you # . NSg+ . . NPr/ISg+ VP/J NSg/VB/J/P R/C/P NPr$ NSg/J+ NSg/VB+ NSg/VPt/J R J/P ISg/D$+ NSg/VB+ . . NSg/I+ ISgPl+ > want , fella ? ” # NSg/VB . NSg . . > # > “ What happened ? — that’s what I want to know . ” # . NSg/I+ VP/J . . NSg$ NSg/I+ ISg/#r+ NSg/VB P VB . . > # > “ Auto hit her . Ins’antly killed . ” # . NSg/VB/J+ NSg/VBP/J ISg/D$+ . ? VP/J . . > # > “ Instantly killed , ” repeated Tom , staring . # . R VP/J . . VP/J NPr/VB+ . Nᴹ/Vg/J . > # > “ She ran out ina road . Son - of - a - bitch didn’t even stopus car . ” # . ISg+ NSg/VPt NSg/VB/J/R/P NPr N🅪Sg/J+ . NPr/VB+ . P . D/P . NSg/VB VXPt NSg/VB/J/R ? NSg+ . . > # > “ There was two cars , ” said Michaelis , “ one comin ’ , one goin ’ , see ? ” # . R+ VLPt NSg+ NPl+ . . VP/J ? . . NSg/I/J ? . . NSg/I/J ? . . NSg/VB . . > # > “ Going where ? ” asked the policeman keenly . # . Nᴹ/Vg/J NSg/R/C . . VP/J D+ NSg+ R . > # > “ One goin ’ each way . Well , she ” — his hand rose toward the blankets but stopped # . NSg/I/J ? . Dq NSg/J+ . NSg/VB/J/R . ISg+ . . ISg/D$+ NSg/VB+ NPr/VPt/J J/P D+ NPl/V3+ NSg/C/P VP/J > half way and fell to his side — “ she ran out there an ’ the one comin ’ from N’York # N🅪Sg/J/P+ NSg/J+ VB/C NSg/VPt/J P ISg/D$+ NSg/VB/J+ . . ISg+ NSg/VPt NSg/VB/J/R/P R+ D/P . D+ NSg/I/J+ ? . P ? > knock right into her , goin ’ thirty or forty miles an hour . ” # NSg/VB NPr/VB/J P ISg/D$+ . ? . NSg NPr/C NSg/J NPrPl+ D/P NSg+ . . > # > “ What’s the name of this place here ? ” demanded the officer . # . K D NSg/VB P I/Ddem N🅪Sg/VB+ J/R . . VP/J D+ NSg/VB+ . > # > “ Hasn’t got any name . ” # . V3 VP I/R/Dq NSg/VB+ . . > # > A pale well - dressed negro stepped near . # D/P NSg/VB/J NSg/VB/J/R . VP/J NSg/J J NSg/VB/J/P . > # > “ It was a yellow car , ” he said , “ big yellow car . New . ” # . NPr/ISg+ VLPt D/P NSg/VB/J NSg . . NPr/ISg+ VP/J . . NSg/J+ NSg/VB/J+ NSg+ . NSg/J . . > # > “ See the accident ? ” asked the policeman . # . NSg/VB D+ NSg/J+ . . VP/J D+ NSg+ . > # > “ No , but the car passed me down the road , going faster’n forty . Going fifty , # . NSg/Dq/P . NSg/C/P D+ NSg+ VP/J NPr/ISg+ N🅪Sg/VB/J/P D+ N🅪Sg/J+ . Nᴹ/Vg/J ? NSg/J . Nᴹ/Vg/J NSg . > sixty . ” # NSg . . > # > “ Come here and let’s have your name . Look out now . I want to get his name . ” # . NSg/VBPp/P J/R VB/C NSg$ NSg/VXB D$+ NSg/VB+ . NSg/VB NSg/VB/J/R/P NSg/J/R/C . ISg/#r+ NSg/VB P NSg/VB ISg/D$+ NSg/VB+ . . > # > Some words of this conversation must have reached Wilson , swaying in the office # I/J/R/Dq NPl/V3 P I/Ddem+ N🅪Sg/VB+ NSg/VXB NSg/VXB VP/J NPr+ . Nᴹ/Vg/J NPr/J/R/P D+ NSg/VB+ > door , for suddenly a new theme found voice among his gasping cries : # NSg/VB+ . R/C/P R D/P+ NSg/J+ NSg/VB+ NSg/VP NSg/VB+ P ISg/D$+ Nᴹ/Vg/J NPl/V3 . > # > “ You don’t have to tell me what kind of car it was ! I know what kind of car it # . ISgPl+ VXB NSg/VXB P NPr/VB NPr/ISg+ NSg/I+ NSg/J P NSg+ NPr/ISg+ VLPt . ISg/#r+ VB NSg/I+ NSg/J P NSg+ NPr/ISg+ > was ! ” # VLPt . . > # > Watching Tom , I saw the wad of muscle back of his shoulder tighten under his # Nᴹ/Vg/J NPr/VB+ . ISg/#r+ NSg/VPt D NSg/VB P N🅪Sg/VB+ NSg/VB/J P ISg/D$+ NSg/VB+ VB NSg/J/P ISg/D$+ > coat . He walked quickly over to Wilson and , standing in front of him seized him , # NSg/VB+ . NPr/ISg+ VP/J R NSg/J/P P NPr+ VB/C . Nᴹ/Vg/J NPr/J/R/P NSg/VB/J P ISg+ VP/J ISg+ . > firmly by the upper arms . # R NSg/P D+ NSg/J+ NPl/V3+ . > # > “ You've got to pull yourself together , ” he said with soothing gruffness . # . K VP P NSg/VB ISg+ J . . NPr/ISg+ VP/J P Nᴹ/Vg/J Nᴹ . > # > Wilson’s eyes fell upon Tom ; he started up on his tiptoes and then would have # NPr$ NPl/V3+ NSg/VPt/J P NPr/VB+ . NPr/ISg+ VP/J NSg/VB/J/P J/P ISg/D$+ NPl/V3 VB/C NSg/J/R/C VXB NSg/VXB > collapsed to his knees had not Tom held him upright . # VP/J P ISg/D$+ NPl/V3+ VP NSg/R/C NPr/VB+ VP ISg+ NSg/VB/J . > # > “ Listen , ” said Tom , shaking him a little . “ I just got here a minute ago , from # . NSg/VB . . VP/J NPr/VB+ . Nᴹ/Vg/J ISg+ D/P NPr/I/J/Dq . . ISg/#r+ J/R VP J/R D/P+ NSg/VB/J+ J/P . P > New York . I was bringing you that coupé we’ve been talking about . That yellow # NSg/J+ NPr+ . ISg/#r+ VLPt Nᴹ/Vg/J ISgPl+ NSg/I/C/Ddem ? K NSg/VLPp Nᴹ/Vg/J J/P . NSg/I/C/Ddem+ NSg/VB/J+ > car I was driving this afternoon wasn’t mine — do you hear ? I haven’t seen it all # NSg+ ISg/#r+ VLPt Nᴹ/Vg/J I/Ddem+ N🅪Sg+ VPt NSg/I/VB+ . VXB ISgPl+ VB . ISg/#r+ VXB NSg/VPp NPr/ISg+ NSg/I/J/C/Dq > afternoon . ” # N🅪Sg+ . . > # > Only the negro and I were near enough to hear what he said , but the policeman # J/R/C D NSg/J VB/C ISg/#r+ NSg/VLPt NSg/VB/J/P NSg/I P VB NSg/I+ NPr/ISg+ VP/J . NSg/C/P D+ NSg+ > caught something in the tone and looked over with truculent eyes . # VP/J NSg/I/J+ NPr/J/R/P D+ N🅪Sg/I/VB+ VB/C VP/J NSg/J/P P J NPl/V3+ . > # > “ What’s all that ? ” he demanded . # . K NSg/I/J/C/Dq NSg/I/C/Ddem+ . . NPr/ISg+ VP/J . > # > “ I’m a friend of his . ” Tom turned his head but kept his hands firm on Wilson’s # . K D/P NPr/VB/J P ISg/D$+ . . NPr/VB+ VP/J ISg/D$+ NPr/VB/J+ NSg/C/P VP ISg/D$+ NPl/V3+ NSg/VB/J+ J/P NPr$ > body . “ He says he knows the car that did it . . . . It was a yellow car . ” # NSg/VB+ . . NPr/ISg+ NPl/V3 NPr/ISg+ V3 D+ NSg+ NSg/I/C/Ddem+ VXPt NPr/ISg+ . . . . NPr/ISg+ VLPt D/P NSg/VB/J NSg . . > # > Some dim impulse moved the policeman to look suspiciously at Tom . # I/J/R/Dq+ NSg/VB/J+ NSg/VB+ VP/J D+ NSg+ P NSg/VB R NSg/P NPr/VB+ . > # > “ And what color’s your car ? ” # . VB/C NSg/I+ Am D$+ NSg+ . . > # > “ It’s a blue car , a coupé . ” # . K D/P+ N🅪Sg/VB/J+ NSg+ . D/P ? . . > # > “ We've come straight from New York , ” I said . # . K NSg/VBPp/P NSg/VB/J/R P NSg/J NPr+ . . ISg/#r+ VP/J . > # > Some one who had been driving a little behind us confirmed this , and the # I/J/R/Dq NSg/I/J NPr/I+ VP NSg/VLPp Nᴹ/Vg/J D/P NPr/I/J/Dq NSg/J/P NPr/IPl+ VP/J I/Ddem+ . VB/C D+ > policeman turned away . # NSg+ VP/J VB/J . > # > “ Now , if you'll let me have that name again correct — — — ” # . NSg/J/R/C . NSg/C K NSg/VBP NPr/ISg+ NSg/VXB NSg/I/C/Ddem NSg/VB+ P NSg/VB/J . . . . > # > Picking up Wilson like a doll , Tom carried him into the office , set him down in # Nᴹ/Vg/J NSg/VB/J/P NPr+ NSg/VB/J/C/P D/P+ NSg+ . NPr/VB+ VP/J ISg+ P D+ NSg/VB+ . NPr/VBP/J ISg+ N🅪Sg/VB/J/P NPr/J/R/P > a chair , and came back . # D/P+ NSg/VB+ . VB/C NSg/VPt/P NSg/VB/J . > # > “ If somebody’ll come here and sit with him , ” he snapped authoritatively . He # . NSg/C ? NSg/VBPp/P J/R VB/C NSg/VB P ISg+ . . NPr/ISg+ VP R . NPr/ISg+ > watched while the two men standing closest glanced at each other and went # VP/J NSg/VB/C/P D+ NSg+ NPl+ Nᴹ/Vg/J JS VP/J NSg/P Dq NSg/VB/J VB/C NSg/VPt > unwillingly into the room . Then Tom shut the door on them and came down the # R P D+ N🅪Sg/VB/J+ . NSg/J/R/C NPr/VB+ NSg/VBP/J D+ NSg/VB+ J/P NSg/IPl+ VB/C NSg/VPt/P N🅪Sg/VB/J/P D+ > single step , his eyes avoiding the table . As he passed close to me he whispered : # NSg/VB/J+ NSg/VB+ . ISg/D$+ NPl/V3+ Nᴹ/Vg/J D+ NSg/VB+ . R/C/P NPr/ISg+ VP/J NSg/VB/J P NPr/ISg+ NPr/ISg+ VP/J . > “ Let’s get out . ” # . NSg$ NSg/VB NSg/VB/J/R/P . . > # > Self - consciously , with his authoritative arms breaking the way , we pushed # NSg/I/VB/J+ . R . P ISg/D$+ J+ NPl/V3+ Nᴹ/Vg/J D+ NSg/J+ . IPl+ VP/J > through the still gathering crowd , passing a hurried doctor , case in hand , who # NSg/J/P D NSg/VB/J/R Nᴹ/Vg/J NSg/VB+ . Nᴹ/Vg/J D/P VP/J NSg/VB . NPr🅪Sg/VB+ NPr/J/R/P NSg/VB+ . NPr/I+ > had been sent for in wild hope half an hour ago . # VP NSg/VLPp NSg/VP R/C/P NPr/J/R/P NSg/VB/J NPr🅪Sg/VB N🅪Sg/J/P+ D/P+ NSg+ J/P . > # > Tom drove slowly until we were beyond the bend — then his foot came down hard , and # NPr/VB+ NSg/VPt R C/P IPl+ NSg/VLPt NSg/P D+ NPr/VB+ . NSg/J/R/C ISg/D$+ NSg/VB+ NSg/VPt/P N🅪Sg/VB/J/P N🅪Sg/J/R . VB/C > the coupé raced along through the night . In a little while I heard a low husky # D ? VP/J P NSg/J/P D N🅪Sg/VB+ . NPr/J/R/P D/P NPr/I/J/Dq NSg/VB/C/P ISg/#r+ VP/J D/P NSg/VB/J/R NSg/J > sob , and saw that the tears were overflowing down his face . # NSg/VB . VB/C NSg/VPt NSg/I/C/Ddem D NPl/V3+ NSg/VLPt Nᴹ/Vg/J N🅪Sg/VB/J/P ISg/D$+ NSg/VB+ . > # > “ The God damned coward ! ” he whimpered . “ He didn’t even stop his car . ” # . D+ NPr/VB+ VP/J NPr/VB/J . . NPr/ISg+ VP/J . . NPr/ISg+ VXPt NSg/VB/J/R NSg/VB ISg/D$+ NSg+ . . > # > The Buchanans ’ house floated suddenly toward us through the dark rustling trees . # D ? . NPr/VB+ VP/J R J/P NPr/IPl+ NSg/J/P D NSg/VB/J Nᴹ/Vg/J NPl/V3+ . > Tom stopped beside the porch and looked up at the second floor , where two # NPr/VB+ VP/J P D+ NSg+ VB/C VP/J NSg/VB/J/P NSg/P D+ NSg/VB/J+ NSg/VB+ . NSg/R/C NSg+ > windows bloomed with light among the vines . # NPrPl/V3+ VP/J P N🅪Sg/VB/J+ P D NPl . > # > “ Daisy’s home , ” he said . As we got out of the car he glanced at me and frowned # . NPr$ NSg/VB/J+ . . NPr/ISg+ VP/J . R/C/P IPl+ VP NSg/VB/J/R/P P D+ NSg+ NPr/ISg+ VP/J NSg/P NPr/ISg+ VB/C VP/J > slightly . # R . > # > “ I ought to have dropped you in West Egg , Nick . There’s nothing we can do # . ISg/#r+ NSg/I/VXB P NSg/VXB VP/J ISgPl+ NPr/J/R/P NPr/VB/J+ N🅪Sg/VB+ . NPr/VB+ . K NSg/I/J+ IPl+ NPr/VXB VXB > to - night . ” # P . N🅪Sg/VB+ . . > # > A change had come over him , and he spoke gravely , and with decision . As we # D/P+ N🅪Sg/VB+ VP NSg/VBPp/P NSg/J/P ISg+ . VB/C NPr/ISg+ NSg/VPt R . VB/C P NSg/VB+ . R/C/P IPl+ > walked across the moonlight gravel to the porch he disposed of the situation in # VP/J NSg/P D+ N🅪Sg/VB+ Nᴹ/VB/J+ P D+ NSg+ NPr/ISg+ VP/J P D+ NSg+ NPr/J/R/P > a few brisk phrases . # D/P NSg/I/Dq VB/J NPl/V3+ . > # > “ I’ll telephone for a taxi to take you home , and while you’re waiting you and # . K NSg/VB+ R/C/P D/P NSg/VB+ P NSg/VB ISgPl+ NSg/VB/J+ . VB/C NSg/VB/C/P K Nᴹ/Vg/J ISgPl+ VB/C > Jordan better go in the kitchen and have them get you some supper — if you want # NPr+ NSg/VXB/JC NSg/VB/J NPr/J/R/P D NSg/VB+ VB/C NSg/VXB NSg/IPl+ NSg/VB ISgPl+ I/J/R/Dq NSg/VB+ . NSg/C ISgPl+ NSg/VB > any . ” He opened the door . “ Come in . ” # I/R/Dq . . NPr/ISg+ VP/J D+ NSg/VB+ . . NSg/VBPp/P NPr/J/R/P . . > # > “ No , thanks . But I’d be glad if you’d order me the taxi . I’ll wait outside . ” # . NSg/Dq/P . NPl/V3+ . NSg/C/P K NSg/VLXB NSg/VB/J NSg/C K N🅪Sg/VB+ NPr/ISg+ D NSg/VB+ . K NSg/VB Nᴹ/VB/J/P . . > # > Jordan put her hand on my arm . # NPr+ NSg/VBP ISg/D$+ NSg/VB+ J/P D$+ NSg/VB/J+ . > # > “ Won’t you come in , Nick ? ” # . VXB ISgPl+ NSg/VBPp/P NPr/J/R/P . NPr/VB+ . . > # > “ No , thanks . ” # . NSg/Dq/P . NPl/V3+ . . > # > I was feeling a little sick and I wanted to be alone . But Jordan lingered for a # ISg/#r+ VLPt N🅪Sg/Vg/J D/P NPr/I/J/Dq NSg/VB/J VB/C ISg/#r+ VP/J P NSg/VLXB J . NSg/C/P NPr+ VP/J R/C/P D/P > moment more . # NSg+ NPr/I/J/R/Dq . > # > “ It’s only half - past nine , ” she said . # . K J/R/C N🅪Sg/J/P+ . NSg/VB/J/P NSg . . ISg+ VP/J . > # > I’d be damned if I’d go in ; I’d had enough of all of them for one day , and # K NSg/VLXB VP/J NSg/C K NSg/VB/J NPr/J/R/P . K VP NSg/I P NSg/I/J/C/Dq P NSg/IPl+ R/C/P NSg/I/J NPr🅪Sg+ . VB/C > suddenly that included Jordan too . She must have seen something of this in my # R NSg/I/C/Ddem+ VP/J NPr+ R . ISg+ NSg/VXB NSg/VXB NSg/VPp NSg/I/J+ P I/Ddem+ NPr/J/R/P D$+ > expression , for she turned abruptly away and ran up the porch steps into the # N🅪Sg+ . R/C/P ISg+ VP/J R VB/J VB/C NSg/VPt NSg/VB/J/P D+ NSg+ NPl/V3+ P D+ > house . I sat down for a few minutes with my head in my hands , until I heard the # NPr/VB+ . ISg/#r+ NSg/VP/J N🅪Sg/VB/J/P R/C/P D/P NSg/I/Dq+ NPl/V3+ P D$+ NPr/VB/J+ NPr/J/R/P D$+ NPl/V3+ . C/P ISg/#r+ VP/J D+ > phone taken up inside and the butler’s voice calling a taxi . Then I walked # NSg/VB+ VPp/J NSg/VB/J/P NSg/J/P VB/C D NPr$ NSg/VB+ Nᴹ/Vg/J D/P NSg/VB+ . NSg/J/R/C ISg/#r+ VP/J > slowly down the drive away from the house , intending to wait by the gate . # R N🅪Sg/VB/J/P D N🅪Sg/VB VB/J P D+ NPr/VB+ . Nᴹ/Vg/J P NSg/VB NSg/P D+ NSg/VB+ . > # > I hadn’t gone twenty yards when I heard my name and Gatsby stepped from between # ISg/#r+ VPt VPp/J/P NSg NPl/V3+ NSg/I/C ISg/#r+ VP/J D$+ NSg/VB+ VB/C NPr J P NSg/P > two bushes into the path . I must have felt pretty weird by that time , because I # NSg NPl/V3+ P D NSg/VB+ . ISg/#r+ NSg/VXB NSg/VXB N🅪Sg/VP/J NSg/VB/J/R NSg/VB/J NSg/P NSg/I/C/Ddem+ N🅪Sg/VB/J+ . C/P ISg/#r+ > could think of nothing except the luminosity of his pink suit under the moon . # NSg/VXB NSg/VB P NSg/I/J+ VB/C/P D Nᴹ P ISg/D$+ N🅪Sg/VB/J NSg/VB+ NSg/J/P D NPr/VB+ . > # > “ What are you doing ? ” I inquired . # . NSg/I+ VLB ISgPl+ Nᴹ/Vg/J . . ISg/#r+ VP/J . > # > “ Just standing here , old sport . ” # . J/R Nᴹ/Vg/J J/R . NSg/J+ NSg/VB+ . . > # > Somehow , that seemed a despicable occupation . For all I knew he was going to rob # R . NSg/I/C/Ddem+ VP/J D/P NSg/J N🅪Sg+ . R/C/P NSg/I/J/C/Dq+ ISg/#r+ VPt NPr/ISg+ VLPt Nᴹ/Vg/J P NPr/VB+ > the house in a moment ; I wouldn’t have been surprised to see sinister faces , the # D+ NPr/VB+ NPr/J/R/P D/P+ NSg+ . ISg/#r+ VXB NSg/VXB NSg/VLPp VP/J P NSg/VB J NPl/V3+ . D > faces of “ Wolfshiem’s people , ” behind him in the dark shrubbery . # NPl/V3 P . ? NPl/VB+ . . NSg/J/P ISg+ NPr/J/R/P D NSg/VB/J NSg . > # > “ Did you see any trouble on the road ? ” he asked after a minute . # . VXPt ISgPl+ NSg/VB I/R/Dq N🅪Sg/VB+ J/P D+ N🅪Sg/J+ . . NPr/ISg+ VP/J P D/P+ NSg/VB/J+ . > # > “ Yes . ” # . NPl/VB . . > # > He hesitated . # NPr/ISg+ VP/J . > # > “ Was she killed ? ” # . VLPt ISg+ VP/J . . > # > “ Yes . ” # . NPl/VB . . > # > “ I thought so ; I told Daisy I thought so . It’s better that the shock should all # . ISg/#r+ N🅪Sg/VP NSg/I/J/R/C . ISg/#r+ VP NPr+ ISg/#r+ N🅪Sg/VP NSg/I/J/R/C . K NSg/VXB/JC NSg/I/C/Ddem D N🅪Sg/J+ VXB NSg/I/J/C/Dq > come at once . She stood it pretty well . ” # NSg/VBPp/P+ NSg/P NSg/C . ISg+ VP NPr/ISg+ NSg/VB/J/R NSg/VB/J/R . . > # > He spoke as if Daisy’s reaction was the only thing that mattered . # NPr/ISg+ NSg/VPt R/C/P NSg/C NPr$ N🅪Sg/VB/J+ VLPt D J/R/C NSg+ NSg/I/C/Ddem+ VP/J . > # > “ I got to West Egg by a side road , ” he went on , “ and left the car in my garage . # . ISg/#r+ VP P NPr/VB/J+ N🅪Sg/VB+ NSg/P D/P+ NSg/VB/J+ N🅪Sg/J+ . . NPr/ISg+ NSg/VPt J/P . . VB/C NPr/VP/J D+ NSg+ NPr/J/R/P D$+ NSg/VB+ . > I don’t think anybody saw us , but of course I can’t be sure . ” # ISg/#r+ VXB NSg/VB NSg/I+ NSg/VPt NPr/IPl+ . NSg/C/P P NSg/VB+ ISg/#r+ VXB NSg/VLXB J . . > # > I disliked him so much by this time that I didn’t find it necessary to tell him # ISg/#r+ VP/J ISg+ NSg/I/J/R/C NSg/I/J/R/Dq NSg/P I/Ddem+ N🅪Sg/VB/J+ NSg/I/C/Ddem+ ISg/#r+ VXPt NSg/VB NPr/ISg+ NSg/J P NPr/VB ISg+ > he was wrong . # NPr/ISg+ VLPt NSg/VB/J/R . > # > “ Who was the woman ? ” he inquired . # . NPr/I+ VLPt D NSg/VB+ . . NPr/ISg+ VP/J . > # > “ Her name was Wilson . Her husband owns the garage . How the devil did it happen ? ” # . ISg/D$+ NSg/VB+ VLPt NPr+ . ISg/D$+ NSg/VB+ NPl/V3 D+ NSg/VB+ . NSg/C D+ NPr/VB+ VXPt NPr/ISg+ VB . . > # > “ Well , I tried to swing the wheel — ” He broke off , and suddenly I guessed at the # . NSg/VB/J/R . ISg/#r+ VP/J P NSg/VB D+ NSg/VB+ . . NPr/ISg+ NSg/VPt/J NSg/VB/J/P . VB/C R ISg/#r+ VP/J NSg/P D+ > truth . # N🅪Sg/VB+ . > # > “ Was Daisy driving ? ” # . VLPt NPr+ Nᴹ/Vg/J . . > # > “ Yes , ” he said after a moment , “ but of course I'll say I was . You see , when we # . NPl/VB . . NPr/ISg+ VP/J P D/P+ NSg+ . . NSg/C/P P NSg/VB+ K NSg/VB ISg/#r+ VLPt . ISgPl+ NSg/VB . NSg/I/C IPl+ > left New York she was very nervous and she thought it would steady her to # NPr/VP/J NSg/J+ NPr+ ISg+ VLPt J/R J VB/C ISg+ N🅪Sg/VP NPr/ISg+ VXB NSg/VB/J ISg/D$+ P > drive — and this woman rushed out at us just as we were passing a car coming the # N🅪Sg/VB . VB/C I/Ddem+ NSg/VB+ VP/J NSg/VB/J/R/P NSg/P NPr/IPl+ J/R R/C/P IPl+ NSg/VLPt Nᴹ/Vg/J D/P+ NSg+ Nᴹ/Vg/J D+ > other way . It all happened in a minute , but it seemed to me that she wanted to # NSg/VB/J+ NSg/J+ . NPr/ISg+ NSg/I/J/C/Dq VP/J NPr/J/R/P D/P+ NSg/VB/J+ . NSg/C/P NPr/ISg+ VP/J P NPr/ISg+ NSg/I/C/Ddem ISg+ VP/J P > speak to us , thought we were somebody she knew . Well , first Daisy turned away # NSg/VB P NPr/IPl+ . N🅪Sg/VP IPl+ NSg/VLPt NSg/I+ ISg+ VPt . NSg/VB/J/R . NSg/J+ NPr+ VP/J VB/J > from the woman toward the other car , and then she lost her nerve and turned # P D+ NSg/VB+ J/P D+ NSg/VB/J+ NSg+ . VB/C NSg/J/R/C ISg+ VP/J ISg/D$+ NSg/VB+ VB/C VP/J > back . The second my hand reached the wheel I felt the shock — it must have killed # NSg/VB/J . D+ NSg/VB/J+ D$+ NSg/VB+ VP/J D+ NSg/VB+ ISg/#r+ N🅪Sg/VP/J D+ N🅪Sg/J+ . NPr/ISg+ NSg/VXB NSg/VXB VP/J > her instantly . ” # ISg/D$+ R . . > # > “ It ripped her open — — — ” # . NPr/ISg+ VP/J ISg/D$+ NSg/VB/J . . . . > # > “ Don’t tell me , old sport . ” He winced . “ Anyhow — Daisy stepped on it . I tried to # . VXB NPr/VB NPr/ISg+ . NSg/J NSg/VB+ . . NPr/ISg+ VP/J . . J . NPr+ J J/P NPr/ISg+ . ISg/#r+ VP/J P > make her stop , but she couldn’t , so I pulled on the emergency brake . Then she # NSg/VB ISg/D$+ NSg/VB . NSg/C/P ISg+ VXB . NSg/I/J/R/C ISg/#r+ VP/J J/P D N🅪Sg+ NSg/VB . NSg/J/R/C ISg+ > fell over into my lap and I drove on . # NSg/VPt/J NSg/J/P P D$+ NSg/VB/J+ VB/C ISg/#r+ NSg/VPt J/P . > # > “ She'll be all right to - morrow , ” he said presently . “ I’m just going to wait here # . K NSg/VLXB NSg/I/J/C/Dq NPr/VB/J+ P . NPr/VB . . NPr/ISg+ VP/J R . . K J/R Nᴹ/Vg/J P NSg/VB J/R > and see if he tries to bother her about that unpleasantness this afternoon . # VB/C NSg/VB NSg/C NPr/ISg+ NPl/V3 P Nᴹ/VB ISg/D$+ J/P NSg/I/C/Ddem+ NSg I/Ddem N🅪Sg+ . > She’s locked herself into her room , and if he tries any brutality she’s going to # K VP/J ISg+ P ISg/D$+ N🅪Sg/VB/J+ . VB/C NSg/C NPr/ISg+ NPl/V3 I/R/Dq Nᴹ+ K Nᴹ/Vg/J P > turn the light out and on again . ” # NSg/VB D N🅪Sg/VB/J+ NSg/VB/J/R/P VB/C J/P P . . > # > “ He won’t touch her , ” I said . “ He’s not thinking about her . ” # . NPr/ISg+ VXB N🅪Sg/VB ISg/D$+ . . ISg/#r+ VP/J . . NPr$ NSg/R/C Nᴹ/Vg/J J/P ISg/D$+ . . > # > “ I don’t trust him , old sport . ” # . ISg/#r+ VXB N🅪Sg/VB/J ISg+ . NSg/J NSg/VB+ . . > # > “ How long are you going to wait ? ” # . NSg/C NPr/VB/J VLB ISgPl+ Nᴹ/Vg/J P NSg/VB . . > # > “ All night , if necessary . Anyhow , till they all go to bed . ” # . NSg/I/J/C/Dq+ N🅪Sg/VB+ . NSg/C NSg/J . J . NSg/VB/C/P IPl+ NSg/I/J/C/Dq NSg/VB/J P NSg/VBP/J . . > # > A new point of view occurred to me . Suppose Tom found out that Daisy had been # D/P NSg/J NSg/VB P NSg/VB+ VP P NPr/ISg+ . VB NPr/VB+ NSg/VP NSg/VB/J/R/P NSg/I/C/Ddem NPr+ VP NSg/VLPp > driving . He might think he saw a connection in it — he might think anything . I # Nᴹ/Vg/J . NPr/ISg+ Nᴹ/VXB/J NSg/VB NPr/ISg+ NSg/VPt D/P+ N🅪Sg+ NPr/J/R/P NPr/ISg+ . NPr/ISg+ Nᴹ/VXB/J NSg/VB NSg/I/VB+ . ISg/#r+ > looked at the house ; there were two or three bright windows down - stairs and the # VP/J NSg/P D+ NPr/VB+ . R+ NSg/VLPt NSg NPr/C NSg NPr/VB/J NPrPl/V3+ N🅪Sg/VB/J/P . NPl VB/C D > pink glow from Daisy’s room on the second floor . # N🅪Sg/VB/J NSg/VB P NPr$ N🅪Sg/VB/J+ J/P D NSg/VB/J NSg/VB+ . > # > “ You wait here , ” I said . “ I’ll see if there’s any sign of a commotion . ” # . ISgPl+ NSg/VB J/R . . ISg/#r+ VP/J . . K NSg/VB NSg/C K I/R/Dq NSg/VB P D/P N🅪Sg . . > # > I walked back along the border of the lawn , traversed the gravel softly , and # ISg/#r+ VP/J NSg/VB/J P D NSg/VB P D+ NSg/VB+ . VP/J D+ Nᴹ/VB/J+ R . VB/C > tiptoed up the veranda steps . The drawing - room curtains were open , and I saw # VP/J NSg/VB/J/P D NSg/NoAm/Br+ NPl/V3+ . D N🅪Sg/Vg/J+ . N🅪Sg/VB/J+ NPl/V3+ NSg/VLPt NSg/VB/J . VB/C ISg/#r+ NSg/VPt > that the room was empty . Crossing the porch where we had dined that June night # NSg/I/C/Ddem D+ N🅪Sg/VB/J+ VLPt NSg/VB/J . Nᴹ/Vg/J D+ NSg+ NSg/R/C IPl+ VP VP/J NSg/I/C/Ddem NPr+ N🅪Sg/VB+ > three months before , I came to a small rectangle of light which I guessed was # NSg+ NPl+ C/P . ISg/#r+ NSg/VPt/P P D/P NPr/VB/J NSg/J P N🅪Sg/VB/J+ I/C+ ISg/#r+ VP/J VLPt > the pantry window . The blind was drawn , but I found a rift at the sill . # D+ NSg+ NSg/VB+ . D NSg/VB/J VLPt VPp/J . NSg/C/P ISg/#r+ NSg/VP D/P NSg/VB+ NSg/P D+ NSg/J+ . > # > Daisy and Tom were sitting opposite each other at the kitchen table , with a # NPr VB/C NPr/VB+ NSg/VLPt NSg/Vg/J NSg/J/P Dq NSg/VB/J NSg/P D+ NSg/VB+ NSg/VB+ . P D/P > plate of cold fried chicken between them , and two bottles of ale . He was talking # NSg/VB P NSg/J VP/J N🅪Sg/VB/J NSg/P NSg/IPl+ . VB/C NSg NPl/V3 P N🅪Sg+ . NPr/ISg+ VLPt Nᴹ/Vg/J > intently across the table at her , and in his earnestness his hand had fallen # R NSg/P D NSg/VB+ NSg/P ISg/D$+ . VB/C NPr/J/R/P ISg/D$+ NSg ISg/D$+ NSg/VB+ VP VPp/J > upon and covered her own . Once in a while she looked up at him and nodded in # P VB/C VP/J ISg/D$+ NSg/VB/J . NSg/C NPr/J/R/P D/P+ NSg/VB/C/P+ ISg+ VP/J NSg/VB/J/P NSg/P ISg+ VB/C VP NPr/J/R/P > agreement . # N🅪Sg+ . > # > They weren’t happy , and neither of them had touched the chicken or the ale — and # IPl+ VPt NSg/VB/J . VB/C I/C P NSg/IPl+ VP VP/J D N🅪Sg/VB/J NPr/C D N🅪Sg+ . VB/C > yet they weren’t unhappy either . There was an unmistakable air of natural # NSg/VB/C IPl+ VPt NSg/VB/J I/C . R+ VLPt D/P J N🅪Sg/VB P NSg/J > intimacy about the picture , and anybody would have said that they were # Nᴹ J/P D+ NSg/VB+ . VB/C NSg/I+ VXB NSg/VXB VP/J NSg/I/C/Ddem IPl+ NSg/VLPt > conspiring together . # Nᴹ/Vg/J J . > # > As I tiptoed from the porch I heard my taxi feeling its way along the dark road # R/C/P ISg/#r+ VP/J P D NSg+ ISg/#r+ VP/J D$+ NSg/VB+ N🅪Sg/Vg/J ISg/D$+ NSg/J+ P D NSg/VB/J N🅪Sg/J+ > toward the house . Gatsby was waiting where I had left him in the drive . # J/P D NPr/VB+ . NPr VLPt Nᴹ/Vg/J NSg/R/C ISg/#r+ VP NPr/VP/J ISg+ NPr/J/R/P D N🅪Sg/VB+ . > # > “ Is it all quiet up there ? ” he asked anxiously . # . VL3 NPr/ISg+ NSg/I/J/C/Dq N🅪Sg/VB/J NSg/VB/J/P R . . NPr/ISg+ VP/J R . > # > “ Yes , it’s all quiet . ” I hesitated . “ You’d better come home and get some sleep . ” # . NPl/VB . K NSg/I/J/C/Dq N🅪Sg/VB/J . . ISg/#r+ VP/J . . K NSg/VXB/JC NSg/VBPp/P NSg/VB/J+ VB/C NSg/VB I/J/R/Dq N🅪Sg/VB+ . . > # > He shook his head . # NPr/ISg+ NSg/VPt/J ISg/D$+ NPr/VB/J+ . > # > “ I want to wait here till Daisy goes to bed . Good night , old sport . ” # . ISg/#r+ NSg/VB P NSg/VB J/R NSg/VB/C/P NPr+ NPl/V3 P NSg/VBP/J . NPr/VB/J+ N🅪Sg/VB+ . NSg/J+ NSg/VB+ . . > # > He put his hands in his coat pockets and turned back eagerly to his scrutiny of # NPr/ISg+ NSg/VBP ISg/D$+ NPl/V3+ NPr/J/R/P ISg/D$+ NSg/VB+ NPl/V3+ VB/C VP/J NSg/VB/J R P ISg/D$+ NSg/VB P > the house , as though my presence marred the sacredness of the vigil . So I walked # D NPr/VB+ . R/C/P C D$+ N🅪Sg/VB+ VP/J D NSg P D NSg/VB . NSg/I/J/R/C ISg/#r+ VP/J > away and left him standing there in the moonlight — watching over nothing . # VB/J VB/C NPr/VP/J ISg+ Nᴹ/Vg/J R NPr/J/R/P D+ N🅪Sg/VB+ . Nᴹ/Vg/J NSg/J/P NSg/I/J+ . > # > CHAPTER VIII # HeadingStart NSg/VB+ #r > # > I couldn’t sleep all night ; a fog - horn was groaning incessantly on the Sound , # ISg/#r+ VXB N🅪Sg/VB+ NSg/I/J/C/Dq N🅪Sg/VB+ . D/P N🅪Sg/VB+ . NPr/VB+ VLPt Nᴹ/Vg/J R J/P D N🅪Sg/VB/J+ . > and I tossed half - sick between grotesque reality and savage , frightening dreams . # VB/C ISg/#r+ VP/J N🅪Sg/J/P+ . NSg/VB/J NSg/P NSg/J N🅪Sg VB/C NPr/VB/J+ . Nᴹ/Vg/J NPl/V3+ . > Toward dawn I heard a taxi go up Gatsby’s drive , and immediately I jumped out of # J/P NPr🅪Sg/VB+ ISg/#r+ VP/J D/P+ NSg/VB+ NSg/VB/J NSg/VB/J/P NPr$ N🅪Sg/VB . VB/C R ISg/#r+ VP/J NSg/VB/J/R/P P > bed and began to dress — I felt that I had something to tell him , something to # NSg/VBP/J+ VB/C VPt P NSg/VB . ISg/#r+ N🅪Sg/VP/J NSg/I/C/Ddem ISg/#r+ VP NSg/I/J+ P NPr/VB ISg+ . NSg/I/J+ P > warn him about , and morning would be too late . # VB ISg+ J/P . VB/C N🅪Sg/Vg/J+ VXB NSg/VLXB R NSg/J . > # > Crossing his lawn , I saw that his front door was still open and he was leaning # Nᴹ/Vg/J ISg/D$+ NSg/VB+ . ISg/#r+ NSg/VPt NSg/I/C/Ddem ISg/D$+ NSg/VB/J+ NSg/VB+ VLPt NSg/VB/J/R NSg/VB/J VB/C NPr/ISg+ VLPt Nᴹ/Vg/J > against a table in the hall , heavy with dejection or sleep . # C/P D/P NSg/VB+ NPr/J/R/P D+ NPr+ . NSg/VB/J P Nᴹ NPr/C N🅪Sg/VB+ . > # > “ Nothing happened , ” he said wanly . “ I waited , and about four o’clock she came to # . NSg/I/J+ VP/J . . NPr/ISg+ VP/J R . . ISg/#r+ VP/J . VB/C J/P NSg R ISg+ NSg/VPt/P P > the window and stood there for a minute and then turned out the light . ” # D+ NSg/VB+ VB/C VP R R/C/P D/P+ NSg/VB/J+ VB/C NSg/J/R/C VP/J NSg/VB/J/R/P D+ N🅪Sg/VB/J+ . . > # > His house had never seemed so enormous to me as it did that night when we hunted # ISg/D$+ NPr/VB+ VP R VP/J NSg/I/J/R/C J P NPr/ISg+ R/C/P NPr/ISg+ VXPt NSg/I/C/Ddem+ N🅪Sg/VB+ NSg/I/C IPl+ VP/J > through the great rooms for cigarettes . We pushed aside curtains that were like # NSg/J/P D NSg/J NPl/V3 R/C/P NPl/V3+ . IPl+ VP/J NSg/J NPl/V3 NSg/I/C/Ddem+ NSg/VLPt NSg/VB/J/C/P > pavilions , and felt over innumerable feet of dark wall for electric light # NPl/V3 . VB/C N🅪Sg/VP/J NSg/J/P J NPl P NSg/VB/J NPr/VB+ R/C/P NSg/J N🅪Sg/VB/J+ > switches — once I tumbled with a sort of splash upon the keys of a ghostly piano . # NPl/V3+ . NSg/C ISg/#r+ VP/J P D/P NSg/VB P NSg/VB+ P D NPl/V3 P D/P J/R NSg/VB/J+ . > There was an inexplicable amount of dust everywhere , and the rooms were musty , # R+ VLPt D/P J NSg/VB P Nᴹ/VB+ Nᴹ/R . VB/C D NPl/V3+ NSg/VLPt NSg/VB/J . > as though they hadn’t been aired for many days . I found the humidor on an # R/C/P C IPl+ VPt NSg/VLPp VP/J R/C/P NSg/I/J/Dq NPl+ . ISg/#r+ NSg/VP D NSg J/P D/P > unfamiliar table , with two stale , dry cigarettes inside . Throwing open the # NSg/J NSg/VB+ . P NSg NSg/VB/J . NSg/VB/J NPl/V3+ NSg/J/P . Nᴹ/Vg/J NSg/VB/J D > French windows of the drawing - room , we sat smoking out into the darkness . # NPr🅪Sg/VB/J NPrPl/V3 P D N🅪Sg/Vg/J+ . N🅪Sg/VB/J+ . IPl+ NSg/VP/J Nᴹ/Vg/J+ NSg/VB/J/R/P P D+ Nᴹ+ . > # > “ You ought to go away , ” I said . “ It’s pretty certain they'll trace your car . ” # . ISgPl+ NSg/I/VXB P NSg/VB/J VB/J . . ISg/#r+ VP/J . . K NSg/VB/J/R I/J K NSg/VB+ D$+ NSg+ . . > # > “ Go away now , old sport ? ” # . NSg/VB/J VB/J NSg/J/R/C . NSg/J+ NSg/VB+ . . > # > “ Go to Atlantic City for a week , or up to Montreal . ” # . NSg/VB/J P NPr/J NSg+ R/C/P D/P+ NSg/J+ . NPr/C NSg/VB/J/P P NPr . . > # > He wouldn’t consider it . He couldn’t possibly leave Daisy until he knew what she # NPr/ISg+ VXB VB NPr/ISg+ . NPr/ISg+ VXB R NSg/VB NPr+ C/P NPr/ISg+ VPt NSg/I+ ISg+ > was going to do . He was clutching at some last hope and I couldn’t bear to shake # VLPt Nᴹ/Vg/J P VXB . NPr/ISg+ VLPt Nᴹ/Vg/J NSg/P I/J/R/Dq NSg/VB/J NPr🅪Sg/VB VB/C ISg/#r+ VXB NSg/VB/J+ P NSg/VB > him free . # ISg+ NSg/VB/J . > # > It was this night that he told me the strange story of his youth with Dan # NPr/ISg+ VLPt I/Ddem N🅪Sg/VB+ NSg/I/C/Ddem+ NPr/ISg+ VP NPr/ISg+ D NSg/VB/J NSg/VB P ISg/D$+ NSg P NPr+ > Cody — told it to me because “ Jay Gatsby ” had broken up like glass against Tom’s # NPr . VP NPr/ISg+ P NPr/ISg+ C/P . NPr+ NPr . VP VPp/J NSg/VB/J/P NSg/VB/J/C/P NPr🅪Sg/VB+ C/P NPr$ > hard malice , and the long secret extravaganza was played out . I think that he # N🅪Sg/J/R NSg/VB . VB/C D NPr/VB/J NSg/VB/J NSg VLPt VP/J NSg/VB/J/R/P . ISg/#r+ NSg/VB NSg/I/C/Ddem NPr/ISg+ > would have acknowledged anything now , without reserve , but he wanted to talk # VXB NSg/VXB VP/J NSg/I/VB+ NSg/J/R/C . C/P NSg/VB+ . NSg/C/P NPr/ISg+ VP/J P N🅪Sg/VB > about Daisy . # J/P NPr+ . > # > She was the first “ nice ” girl he had ever known . In various unrevealed # ISg+ VLPt D NSg/J . NPr/J . NSg/VB+ NPr/ISg+ VP J/R VPp/J . NPr/J/R/P J VP/J > capacities he had come in contact with such people , but always with # NPl+ NPr/ISg+ VP NSg/VBPp/P NPr/J/R/P N🅪Sg/VB+ P NSg/I NPl/VB+ . NSg/C/P R P > indiscernible barbed wire between . He found her excitingly desirable . He went to # J VP/J N🅪Sg/VB+ NSg/P . NPr/ISg+ NSg/VP ISg/D$+ R J . NPr/ISg+ NSg/VPt P > her house , at first with other officers from Camp Taylor , then alone . It amazed # ISg/D$+ NPr/VB+ . NSg/P NSg/J P NSg/VB/J NPl/V3 P NSg/VB/J+ NPr+ . NSg/J/R/C J . NPr/ISg+ VP/J > him — he had never been in such a beautiful house before . But what gave it an air # ISg+ . NPr/ISg+ VP R NSg/VLPp NPr/J/R/P NSg/I D/P+ NSg/J+ NPr/VB+ C/P . NSg/C/P NSg/I+ VPt NPr/ISg+ D/P N🅪Sg/VB > of breathless intensity , was that Daisy lived there — it was as casual a thing to # P J+ Nᴹ+ . VLPt NSg/I/C/Ddem+ NPr+ VP/J R . NPr/ISg+ VLPt R/C/P NSg/J D/P NSg P > her as his tent out at camp was to him . There was a ripe mystery about it , a # ISg/D$+ R/C/P ISg/D$+ NSg/VB+ NSg/VB/J/R/P NSg/P NSg/VB/J+ VLPt P ISg+ . R+ VLPt D/P NSg/VB/J N🅪Sg J/P NPr/ISg+ . D/P > hint of bedrooms up - stairs more beautiful and cool than other bedrooms , of gay # NSg/VB P NPl+ NSg/VB/J/P . NPl+ NPr/I/J/R/Dq NSg/J VB/C NSg/VB/J C/P NSg/VB/J+ NPl+ . P NPr/VB/J > and radiant activities taking place through its corridors , and of romances that # VB/C NSg/J+ NPl+ NSg/Vg/J N🅪Sg/VB+ NSg/J/P ISg/D$+ NPl+ . VB/C P NPl/V3 NSg/I/C/Ddem+ > were not musty and laid away already in lavender but fresh and breathing and # NSg/VLPt NSg/R/C NSg/VB/J VB/C VP/J VB/J R NPr/J/R/P Nᴹ/VB/J NSg/C/P NSg/VB/J VB/C Nᴹ/Vg/J VB/C > redolent of this year’s shining motor - cars and of dances whose flowers were # J P I/Ddem NSg$ Nᴹ/Vg/J NSg/VB/J+ . NPl VB/C P NPl/V3+ I+ NPrPl/V3+ NSg/VLPt > scarcely withered . It excited him , too , that many men had already loved Daisy — it # R VP/J . NPr/ISg+ VP/J ISg+ . R . NSg/I/C/Ddem NSg/I/J/Dq+ NPl+ VP R VP/J NPr+ . NPr/ISg+ > increased her value in his eyes . He felt their presence all about the house , # VP/J ISg/D$+ N🅪Sg/VB+ NPr/J/R/P ISg/D$+ NPl/V3+ . NPr/ISg+ N🅪Sg/VP/J D$+ N🅪Sg/VB NSg/I/J/C/Dq J/P D+ NPr/VB+ . > pervading the air with the shades and echoes of still vibrant emotions . # Nᴹ/Vg/J D N🅪Sg/VB+ P D NPl/V3+ VB/C NPl/VB P NSg/VB/J/R NSg/J NPl+ . > # > But he knew that he was in Daisy’s house by a colossal accident . However # NSg/C/P NPr/ISg+ VPt NSg/I/C/Ddem NPr/ISg+ VLPt NPr/J/R/P NPr$ NPr/VB+ NSg/P D/P J NSg/J+ . C > glorious might be his future as Jay Gatsby , he was at present a penniless young # J Nᴹ/VXB/J NSg/VLXB ISg/D$+ NSg/J+ R/C/P NPr+ NPr . NPr/ISg+ VLPt NSg/P NSg/VB/J D/P J NPr/VB/J > man without a past , and at any moment the invisible cloak of his uniform might # NPr/VB/J+ C/P D/P NSg/VB/J/P . VB/C NSg/P I/R/Dq NSg+ D J NSg/VB P ISg/D$+ NSg/VB/J Nᴹ/VXB/J > slip from his shoulders . So he made the most of his time . He took what he could # NSg/VB P ISg/D$+ NPl/V3+ . NSg/I/J/R/C NPr/ISg+ VP D NSg/I/J/R/Dq P ISg/D$+ N🅪Sg/VB/J+ . NPr/ISg+ VPt NSg/I+ NPr/ISg+ NSg/VXB > get , ravenously and unscrupulously — eventually he took Daisy one still October # NSg/VB . R VB/C R . R NPr/ISg+ VPt NPr+ NSg/I/J NSg/VB/J/R NPr/VB+ > night , took her because he had no real right to touch her hand . # N🅪Sg/VB+ . VPt ISg/D$+ C/P NPr/ISg+ VP NSg/Dq/P NSg/J NPr/VB/J P N🅪Sg/VB ISg/D$+ NSg/VB+ . > # > He might have despised himself , for he had certainly taken her under false # NPr/ISg+ Nᴹ/VXB/J NSg/VXB VP/J ISg+ . R/C/P NPr/ISg+ VP R VPp/J ISg/D$+ NSg/J/P NSg/VB/J > pretenses . I don’t mean that he had traded on his phantom millions , but he had # NPl . ISg/#r+ VXB NSg/VB/J NSg/I/C/Ddem NPr/ISg+ VP VP/J J/P ISg/D$+ NSg/J+ NPl+ . NSg/C/P NPr/ISg+ VP > deliberately given Daisy a sense of security ; he let her believe that he was a # R NSg/VPp/J/P NPr+ D/P N🅪Sg/VB P Nᴹ+ . NPr/ISg+ NSg/VBP ISg/D$+ VB NSg/I/C/Ddem NPr/ISg+ VLPt D/P > person from much the same strata as herself — that he was fully able to take care # NSg/VB+ P NSg/I/J/R/Dq D I/J NPl R/C/P ISg+ . NSg/I/C/Ddem NPr/ISg+ VLPt R NSg/VB/J P NSg/VB N🅪Sg/VB > of her . As a matter of fact , he had no such facilities — he had no comfortable # P ISg/D$+ . R/C/P D/P N🅪Sg/VB P NSg+ . NPr/ISg+ VP NSg/Dq/P+ NSg/I+ NPl+ . NPr/ISg+ VP NSg/Dq/P+ NSg/J+ > family standing behind him , and he was liable at the whim of an impersonal # N🅪Sg/J+ Nᴹ/Vg/J NSg/J/P ISg+ . VB/C NPr/ISg+ VLPt J NSg/P D NSg/VB P D/P NSg/J > government to be blown anywhere about the world . # N🅪Sg+ P NSg/VLXB VPp/J NSg/I J/P D NSg/VB+ . > # > But he didn’t despise himself and it didn’t turn out as he had imagined . He had # NSg/C/P NPr/ISg+ VXPt VB ISg+ VB/C NPr/ISg+ VXPt NSg/VB NSg/VB/J/R/P R/C/P NPr/ISg+ VP VP/J . NPr/ISg+ VP > intended , probably , to take what he could and go — but now he found that he had # NSg/VP/J . R . P NSg/VB NSg/I+ NPr/ISg+ NSg/VXB VB/C NSg/VB/J . NSg/C/P NSg/J/R/C NPr/ISg+ NSg/VP NSg/I/C/Ddem NPr/ISg+ VP > committed himself to the following of a grail . He knew that Daisy was # VP/J ISg+ P D N🅪Sg/Vg/J/P P D/P+ NSg+ . NPr/ISg+ VPt NSg/I/C/Ddem NPr+ VLPt > extraordinary , but he didn’t realize just how extraordinary a “ nice ” girl could # NSg/J . NSg/C/P NPr/ISg+ VXPt VB/Comm/NoAm J/R NSg/C NSg/J D/P . NPr/J . NSg/VB+ NSg/VXB > be . She vanished into her rich house , into her rich , full life , leaving # NSg/VLXB . ISg+ VP/J P ISg/D$+ NPr/VB/J+ NPr/VB+ . P ISg/D$+ NPr/VB/J . NSg/VB/J+ N🅪Sg/VB+ . Nᴹ/Vg/J > Gatsby — nothing . He felt married to her , that was all . # NPr . NSg/I/J+ . NPr/ISg+ N🅪Sg/VP/J NSg/VP/J P ISg/D$+ . NSg/I/C/Ddem+ VLPt NSg/I/J/C/Dq . > # > When they met again , two days later , it was Gatsby who was breathless , who was , # NSg/I/C IPl+ VP P . NSg+ NPl+ JC . NPr/ISg+ VLPt NPr NPr/I+ VLPt J . NPr/I+ VLPt . > somehow , betrayed . Her porch was bright with the bought luxury of star - shine ; # R . VP/J . ISg/D$+ NSg+ VLPt NPr/VB/J P D NSg/VP N🅪Sg/J P NSg/VB+ . N🅪Sg/VB+ . > the wicker of the settee squeaked fashionably as she turned toward him and he # D NSg/JC P D NSg VP/J R R/C/P ISg+ VP/J J/P ISg+ VB/C NPr/ISg+ > kissed her curious and lovely mouth . She had caught a cold , and it made her # VP/J ISg/D$+ J VB/C NSg/J NSg/VB+ . ISg+ VP VP/J D/P NSg/J . VB/C NPr/ISg+ VP ISg/D$+ > voice huskier and more charming than ever , and Gatsby was overwhelmingly aware # NSg/VB+ JC VB/C NPr/I/J/R/Dq Nᴹ/Vg/J C/P J/R . VB/C NPr VLPt R VB/J > of the youth and mystery that wealth imprisons and preserves , of the freshness # P D NSg VB/C N🅪Sg+ NSg/I/C/Ddem+ N🅪Sg+ V3 VB/C NPl/V3 . P D NSg > of many clothes , and of Daisy , gleaming like silver , safe and proud above the # P NSg/I/J/Dq NPl/V3+ . VB/C P NPr+ . Nᴹ/Vg/J NSg/VB/J/C/P Nᴹ/VB/J+ . NSg/VB/J VB/C J NSg/J/P D > hot struggles of the poor . # NSg/VB/J NPl/V3 P D NSg/VB/J . > # > “ I can’t describe to you how surprised I was to find out I loved her , old sport . # . ISg/#r+ VXB VB P ISgPl+ NSg/C VP/J ISg/#r+ VLPt P NSg/VB NSg/VB/J/R/P ISg/#r+ VP/J ISg/D$+ . NSg/J NSg/VB+ . > I even hoped for a while that she’d throw me over , but she didn’t , because she # ISg/#r+ NSg/VB/J/R VP/J R/C/P D/P+ NSg/VB/C/P+ NSg/I/C/Ddem+ K NSg/VB NPr/ISg+ NSg/J/P . NSg/C/P ISg+ VXPt . C/P ISg+ > was in love with me too . She thought I knew a lot because I knew different # VLPt NPr/J/R/P NPr🅪Sg/VB P NPr/ISg+ R . ISg+ N🅪Sg/VP ISg/#r+ VPt D/P+ NPr/VB+ C/P ISg/#r+ VPt NSg/J+ > things from her . . . Well , there I was , ’ way off my ambitions , getting deeper # NPl+ P ISg/D$+ . . . NSg/VB/J/R . R+ ISg/#r+ VLPt . . NSg/J+ NSg/VB/J/P D$+ NPl/V3+ . NSg/Vg JC > in love every minute , and all of a sudden I didn’t care . What was the use of # NPr/J/R/P NPr🅪Sg/VB Dq+ NSg/VB/J+ . VB/C NSg/I/J/C/Dq P D/P NSg/J ISg/#r+ VXPt N🅪Sg/VB+ . NSg/I+ VLPt D N🅪Sg/VB P > doing great things if I could have a better time telling her what I was going to # Nᴹ/Vg/J NSg/J+ NPl+ NSg/C ISg/#r+ NSg/VXB NSg/VXB D/P+ NSg/VXB/JC+ N🅪Sg/VB/J+ Nᴹ/Vg/J ISg/D$+ NSg/I+ ISg/#r+ VLPt Nᴹ/Vg/J P > do ? ” # VXB . . > # > On the last afternoon before he went abroad , he sat with Daisy in his arms for a # J/P D+ NSg/VB/J+ N🅪Sg+ C/P NPr/ISg+ NSg/VPt NSg/J/P . NPr/ISg+ NSg/VP/J P NPr+ NPr/J/R/P ISg/D$+ NPl/V3+ R/C/P D/P > long , silent time . It was a cold fall day , with fire in the room and her cheeks # NPr/VB/J . NSg/J+ N🅪Sg/VB/J+ . NPr/ISg+ VLPt D/P NSg/J N🅪Sg/VB NPr🅪Sg . P N🅪Sg/VB/J+ NPr/J/R/P D N🅪Sg/VB/J VB/C ISg/D$+ NPl/V3+ > flushed . Now and then she moved and he changed his arm a little , and once he # VP/J . NSg/J/R/C VB/C NSg/J/R/C ISg+ VP/J VB/C NPr/ISg+ VP/J ISg/D$+ NSg/VB/J D/P NPr/I/J/Dq . VB/C NSg/C NPr/ISg+ > kissed her dark shining hair . The afternoon had made them tranquil for a while , # VP/J ISg/D$+ NSg/VB/J+ Nᴹ/Vg/J N🅪Sg/VB+ . D+ N🅪Sg+ VP VP NSg/IPl+ J R/C/P D/P+ NSg/VB/C/P+ . > as if to give them a deep memory for the long parting the next day promised . # R/C/P NSg/C P NSg/VB NSg/IPl+ D/P NSg/J N🅪Sg+ R/C/P D NPr/VB/J N🅪Sg/Vg/J D+ NSg/J/P NPr🅪Sg+ VP/J . > They had never been closer in their month of love , nor communicated more # IPl+ VP R NSg/VLPp NSg/JC NPr/J/R/P D$+ NSg/J P NPr🅪Sg/VB+ . NSg/C VP/J NPr/I/J/R/Dq > profoundly one with another , than when she brushed silent lips against his # R NSg/I/J P I/D . C/P NSg/I/C ISg+ VP/J NSg/J NPl/V3+ C/P ISg/D$+ > coat’s shoulder or when he touched the end of her fingers , gently , as though she # NSg$ NSg/VB+ NPr/C NSg/I/C NPr/ISg+ VP/J D NSg/VB P ISg/D$+ NPl/V3+ . R . R/C/P C ISg+ > were asleep . # NSg/VLPt J . > # > He did extraordinarily well in the war . He was a captain before he went to the # NPr/ISg+ VXPt R NSg/VB/J/R NPr/J/R/P D+ N🅪Sg/VB+ . NPr/ISg+ VLPt D/P NSg/VB C/P NPr/ISg+ NSg/VPt P D+ > front , and following the Argonne battles he got his majority and the command of # NSg/VB/J+ . VB/C N🅪Sg/Vg/J/P D NPr NPl/V3+ NPr/ISg+ VP ISg/D$+ NSg+ VB/C D NSg/VB P > the divisional machine - guns . After the armistice he tried frantically to get # D NSg/J NSg/VB+ . NPl/V3+ . P D NPr🅪Sg NPr/ISg+ VP/J R P NSg/VB > home , but some complication or misunderstanding sent him to Oxford instead . He # NSg/VB/J+ . NSg/C/P I/J/R/Dq N🅪Sg NPr/C N🅪Sg/Vg/J+ NSg/VP ISg+ P NPr+ R . NPr/ISg+ > was worried now — there was a quality of nervous despair in Daisy’s letters . She # VLPt VP/J NSg/J/R/C . R+ VLPt D/P N🅪Sg/J P J NSg/VB+ NPr/J/R/P NPr$ NPl/V3+ . ISg+ > didn’t see why he couldn’t come . She was feeling the pressure of the world # VXPt NSg/VB NSg/VB NPr/ISg+ VXB NSg/VBPp/P . ISg+ VLPt N🅪Sg/Vg/J D N🅪Sg/VB P D+ NSg/VB+ > outside , and she wanted to see him and feel his presence beside her and be # Nᴹ/VB/J/P . VB/C ISg+ VP/J P NSg/VB ISg+ VB/C NSg/I/VB ISg/D$+ N🅪Sg/VB+ P ISg/D$+ VB/C NSg/VLXB > reassured that she was doing the right thing after all . # VP/J NSg/I/C/Ddem ISg+ VLPt Nᴹ/Vg/J D+ NPr/VB/J+ NSg+ P NSg/I/J/C/Dq . > # > For Daisy was young and her artificial world was redolent of orchids and # R/C/P NPr+ VLPt NPr/VB/J VB/C ISg/D$+ J+ NSg/VB+ VLPt J P NPl VB/C > pleasant , cheerful snobbery and orchestras which set the rhythm of the year , # NSg/J . J Nᴹ VB/C NPl+ I/C+ NPr/VBP/J D N🅪Sg/VB P D NSg+ . > summing up the sadness and suggestiveness of life in new tunes . All night the # NSg/Vg NSg/VB/J/P D Nᴹ+ VB/C NSg P N🅪Sg/VB+ NPr/J/R/P NSg/J NPl/V3 . NSg/I/J/C/Dq+ N🅪Sg/VB+ D > saxophones wailed the hopeless comment of the “ Beale Street Blues ” while a # NPl/V3 VP/J D J NSg/VB P D . ? NSg/VB/J+ NPl/V3+ . NSg/VB/C/P D/P > hundred pairs of golden and silver slippers shuffled the shining dust . At the # NSg NPl/V3 P NPr/VB/J VB/C Nᴹ/VB/J+ NPl/V3+ VP/J D Nᴹ/Vg/J Nᴹ/VB+ . NSg/P D+ > gray tea hour there were always rooms that throbbed incessantly with this low , # NPr🅪Sg/VB/J/Am+ N🅪Sg/VB+ NSg+ R+ NSg/VLPt R NPl/V3 NSg/I/C/Ddem+ VP R P I/Ddem NSg/VB/J/R . > sweet fever , while fresh faces drifted here and there like rose petals blown by # NPr/VB/J NSg/VB+ . NSg/VB/C/P NSg/VB/J NPl/V3+ VP/J J/R VB/C R+ NSg/VB/J/C/P NPr/VPt/J NPl/V3 VPp/J NSg/P > the sad horns around the floor . # D NSg/VB/J NPl/V3 J/P D NSg/VB+ . > # > Through this twilight universe Daisy began to move again with the season ; # NSg/J/P I/Ddem+ Nᴹ/VB/J+ NPr+ NPr+ VPt P NSg/VB P P D+ NSg/VB+ . > suddenly she was again keeping half a dozen dates a day with half a dozen men , # R ISg+ VLPt P Nᴹ/Vg/J N🅪Sg/J/P+ D/P+ NSg NPl/V3+ D/P NPr🅪Sg P N🅪Sg/J/P+ D/P+ NSg+ NPl+ . > and drowsing asleep at dawn with the beads and chiffon of an evening dress # VB/C Nᴹ/Vg/J J NSg/P NPr🅪Sg/VB+ P D NPl/V3+ VB/C NSg P D/P N🅪Sg/Vg/J+ NSg/VB+ > tangled among dying orchids on the floor beside her bed . And all the time # VP/J P Nᴹ/Vg/J NPl J/P D NSg/VB+ P ISg/D$+ NSg/VBP/J+ . VB/C NSg/I/J/C/Dq D+ N🅪Sg/VB/J+ > something within her was crying for a decision . She wanted her life shaped now , # NSg/I/J+ NSg/J/P ISg/D$+ VLPt Nᴹ/Vg/J R/C/P D/P+ NSg/VB+ . ISg+ VP/J ISg/D$+ N🅪Sg/VB+ VP/J NSg/J/R/C . > immediately — and the decision must be made by some force — of love , of money , of # R . VB/C D+ NSg/VB+ NSg/VXB NSg/VLXB VP NSg/P I/J/R/Dq+ N🅪Sg/VB+ . P NPr🅪Sg/VB+ . P N🅪Sg/J+ . P > unquestionable practicality — that was close at hand . # J NSg . NSg/I/C/Ddem+ VLPt NSg/VB/J NSg/P NSg/VB+ . > # > That force took shape in the middle of spring with the arrival of Tom Buchanan . # NSg/I/C/Ddem+ N🅪Sg/VB+ VPt N🅪Sg/VB+ NPr/J/R/P D NSg/VB/J P N🅪Sg/VB+ P D N🅪Sg P NPr/VB+ NPr+ . > There was a wholesome bulkiness about his person and his position , and Daisy was # R+ VLPt D/P J Nᴹ J/P ISg/D$+ NSg/VB VB/C ISg/D$+ NSg/VB+ . VB/C NPr+ VLPt > flattered . Doubtless there was a certain struggle and a certain relief . The # VP/J . J R+ VLPt D/P I/J NSg/VB VB/C D/P+ I/J+ NSg/J+ . D+ > letter reached Gatsby while he was still at Oxford . # NSg/VB+ VP/J NPr NSg/VB/C/P NPr/ISg+ VLPt NSg/VB/J/R NSg/P NPr+ . > # > It was dawn now on Long Island and we went about opening the rest of the windows # NPr/ISg+ VLPt NPr🅪Sg/VB+ NSg/J/R/C J/P NPr/VB/J+ NSg/VB+ VB/C IPl+ NSg/VPt J/P Nᴹ/Vg/J D NSg/VB P D+ NPrPl/V3+ > down - stairs , filling the house with gray - turning , gold - turning light . The shadow # N🅪Sg/VB/J/P . NPl+ . N🅪Sg/Vg/J D+ NPr/VB+ P NPr🅪Sg/VB/J/Am . Nᴹ/Vg/J . Nᴹ/VB/J+ . Nᴹ/Vg/J N🅪Sg/VB/J+ . D NSg/VB/J > of a tree fell abruptly across the dew and ghostly birds began to sing among the # P D/P+ NSg/VB+ NSg/VPt/J R NSg/P D N🅪Sg/VB+ VB/C J/R+ NPl/V3+ VPt P NSg/VB/J P D+ > blue leaves . There was a slow , pleasant movement in the air , scarcely a wind , # N🅪Sg/VB/J+ NPl/V3+ . R+ VLPt D/P NSg/VB/J . NSg/J N🅪Sg NPr/J/R/P D+ N🅪Sg/VB+ . R D/P+ N🅪Sg/VB+ . > promising a cool , lovely day . # Nᴹ/Vg/J D/P NSg/VB/J . NSg/J NPr🅪Sg+ . > # > “ I don’t think she ever loved him . ” Gatsby turned around from a window and # . ISg/#r+ VXB NSg/VB ISg+ J/R VP/J ISg+ . . NPr VP/J J/P P D/P NSg/VB+ VB/C > looked at me challengingly . “ You must remember , old sport , she was very excited # VP/J NSg/P NPr/ISg+ ? . . ISgPl+ NSg/VXB NSg/VB . NSg/J+ NSg/VB+ . ISg+ VLPt J/R VP/J > this afternoon . He told her those things in a way that frightened her — that made # I/Ddem+ N🅪Sg+ . NPr/ISg+ VP ISg/D$+ I/Ddem+ NPl+ NPr/J/R/P D/P+ NSg/J+ NSg/I/C/Ddem+ VP/J ISg/D$+ . NSg/I/C/Ddem+ VP > it look as if I was some kind of cheap sharper . And the result was she hardly # NPr/ISg+ NSg/VB R/C/P NSg/C ISg/#r+ VLPt I/J/R/Dq NSg/J P NSg/VB/J NSg/JC . VB/C D+ NSg/VB+ VLPt ISg+ R > knew what she was saying . ” # VPt NSg/I+ ISg+ VLPt N🅪Sg/Vg/J . . > # > He sat down gloomily . # NPr/ISg+ NSg/VP/J N🅪Sg/VB/J/P R . > # > “ Of course she might have loved him just for a minute , when they were first # . P NSg/VB+ ISg+ Nᴹ/VXB/J NSg/VXB VP/J ISg+ J/R R/C/P D/P+ NSg/VB/J+ . NSg/I/C IPl+ NSg/VLPt NSg/J+ > married — and loved me more even then , do you see ? ” # NSg/VP/J . VB/C VP/J NPr/ISg+ NPr/I/J/R/Dq NSg/VB/J/R NSg/J/R/C . VXB ISgPl+ NSg/VB . . > # > Suddenly he came out with a curious remark . # R NPr/ISg+ NSg/VPt/P NSg/VB/J/R/P P D/P+ J+ NSg/VB+ . > # > “ In any case , ” he said , “ it was just personal . ” # . NPr/J/R/P I/R/Dq+ NPr🅪Sg/VB+ . . NPr/ISg+ VP/J . . NPr/ISg+ VLPt J/R NSg/J . . > # > What could you make of that , except to suspect some intensity in his conception # NSg/I+ NSg/VXB ISgPl+ NSg/VB P NSg/I/C/Ddem+ . VB/C/P P NSg/VB/J I/J/R/Dq+ Nᴹ+ NPr/J/R/P ISg/D$+ N🅪Sg > of the affair that couldn’t be measured ? # P D NSg+ NSg/I/C/Ddem+ VXB NSg/VLXB VP/J . > # > He came back from France when Tom and Daisy were still on their wedding trip , # NPr/ISg+ NSg/VPt/P NSg/VB/J P NPr+ NSg/I/C NPr/VB VB/C NPr+ NSg/VLPt NSg/VB/J/R J/P D$+ NSg/Vg+ NSg/VB/J+ . > and made a miserable but irresistible journey to Louisville on the last of his # VB/C VP D/P J NSg/C/P J NSg/VB P NPr J/P D NSg/VB/J P ISg/D$+ > army pay . He stayed there a week , walking the streets where their footsteps had # NSg+ NSg/VB/J . NPr/ISg+ VP/J R+ D/P+ NSg/J+ . Nᴹ/Vg/J D+ NPl/V3+ NSg/R/C D$+ NPl+ VP > clicked together through the November night and revisiting the out - of - the - way # VP/J J NSg/J/P D+ NPr+ N🅪Sg/VB+ VB/C Nᴹ/Vg/J D NSg/VB/J/R/P . P . D . NSg/J+ > places to which they had driven in her white car . Just as Daisy’s house had # NPl/V3+ P I/C+ IPl+ VP VPp/J NPr/J/R/P ISg/D$+ NPr🅪Sg/VB/J NSg+ . J/R R/C/P NPr$ NPr/VB+ VP > always seemed to him more mysterious and gay than other houses , so his idea of # R VP/J P ISg+ NPr/I/J/R/Dq J VB/C NPr/VB/J C/P NSg/VB/J NPl/V3+ . NSg/I/J/R/C ISg/D$+ NSg P > the city itself , even though she was gone from it , was pervaded with a # D NSg+ ISg+ . NSg/VB/J/R C ISg+ VLPt VPp/J/P P NPr/ISg+ . VLPt VP/J P D/P > melancholy beauty . # NSg/J N🅪Sg/VB/J+ . > # > He left feeling that if he had searched harder , he might have found her — that he # NPr/ISg+ NPr/VP/J N🅪Sg/Vg/J NSg/I/C/Ddem NSg/C NPr/ISg+ VP VP/J JC . NPr/ISg+ Nᴹ/VXB/J NSg/VXB NSg/VP ISg/D$+ . NSg/I/C/Ddem NPr/ISg+ > was leaving her behind . The day - coach — he was penniless now — was hot . He went out # VLPt Nᴹ/Vg/J ISg/D$+ NSg/J/P . D+ NPr🅪Sg+ . NSg/VB+ . NPr/ISg+ VLPt J NSg/J/R/C . VLPt NSg/VB/J . NPr/ISg+ NSg/VPt NSg/VB/J/R/P > to the open vestibule and sat down on a folding - chair , and the station slid away # P D NSg/VB/J NSg/VB VB/C NSg/VP/J N🅪Sg/VB/J/P J/P D/P Nᴹ/Vg/J+ . NSg/VB+ . VB/C D NSg/VB+ VP VB/J > and the backs of unfamiliar buildings moved by . Then out into the spring fields , # VB/C D NPl/V3 P NSg/J NPl/V3+ VP/J NSg/P . NSg/J/R/C NSg/VB/J/R/P P D+ N🅪Sg/VB+ NPrPl/V3+ . > where a yellow trolley raced them for a minute with people in it who might once # NSg/R/C D/P NSg/VB/J NSg/VB VP/J NSg/IPl+ R/C/P D/P NSg/VB/J+ P NPl/VB+ NPr/J/R/P NPr/ISg+ NPr/I+ Nᴹ/VXB/J NSg/C > have seen the pale magic of her face along the casual street . # NSg/VXB NSg/VPp D NSg/VB/J N🅪Sg/VB/J P ISg/D$+ NSg/VB+ P D NSg/J NSg/VB/J+ . > # > The track curved and now it was going away from the sun , which , as it sank # D+ NSg/VB+ VP/J VB/C NSg/J/R/C NPr/ISg+ VLPt Nᴹ/Vg/J VB/J P D+ NPr/VB+ . I/C+ . R/C/P NPr/ISg+ VPt > lower , seemed to spread itself in benediction over the vanishing city where she # NSg/VB/JC . VP/J P N🅪Sg/VBP ISg+ NPr/J/R/P N🅪Sg NSg/J/P D Nᴹ/Vg/J NSg+ NSg/R/C ISg+ > had drawn her breath . He stretched out his hand desperately as if to snatch only # VP VPp/J ISg/D$+ N🅪Sg/VB/J+ . NPr/ISg+ VP/J NSg/VB/J/R/P ISg/D$+ NSg/VB+ R R/C/P NSg/C P NSg/VB J/R/C > a wisp of air , to save a fragment of the spot that she had made lovely for him . # D/P NSg/VB P N🅪Sg/VB+ . P NSg/VB/C/P D/P NSg/VB P D NSg/VB/J+ NSg/I/C/Ddem+ ISg+ VP VP NSg/J R/C/P ISg+ . > But it was all going by too fast now for his blurred eyes and he knew that he # NSg/C/P NPr/ISg+ VLPt NSg/I/J/C/Dq Nᴹ/Vg/J NSg/P R NSg/VB/J/R NSg/J/R/C R/C/P ISg/D$+ VP/J NPl/V3+ VB/C NPr/ISg+ VPt NSg/I/C/Ddem NPr/ISg+ > had lost that part of it , the freshest and the best , forever . # VP VP/J NSg/I/C/Ddem NSg/VB/J P NPr/ISg+ . D JS VB/C D NPr/VXB/JS . NSg/J . > # > It was nine o’clock when we finished breakfast and went out on the porch . The # NPr/ISg+ VLPt NSg R NSg/I/C IPl+ VP/J N🅪Sg/VB+ VB/C NSg/VPt NSg/VB/J/R/P J/P D+ NSg+ . D+ > night had made a sharp difference in the weather and there was an autumn flavor # N🅪Sg/VB+ VP VP D/P NPr/VB/J N🅪Sg/VB NPr/J/R/P D+ Nᴹ/VB/J+ VB/C R+ VLPt D/P NPr🅪Sg/VB+ N🅪Sg/VB/Am > in the air . The gardener , the last one of Gatsby’s former servants , came to the # NPr/J/R/P D+ N🅪Sg/VB+ . D NSg/JC . D NSg/VB/J NSg/I/J P NPr$ NSg/J NPl/V3+ . NSg/VPt/P P D > foot of the steps . # NSg/VB P D NPl/V3+ . > # > “ I’m going to drain the pool to - day , Mr . Gatsby . Leaves’ll start falling pretty # . K Nᴹ/Vg/J P NSg/VB D NSg/VB+ P . NPr🅪Sg+ . NSg+ . NPr . ? NSg/VB Nᴹ/Vg/J NSg/VB/J/R > soon , and then there’s always trouble with the pipes . ” # J/R . VB/C NSg/J/R/C K R N🅪Sg/VB+ P D NPl/V3+ . . > # > “ Don’t do it to - day , ” Gatsby answered . He turned to me apologetically . “ You # . VXB VXB NPr/ISg+ P . NPr🅪Sg+ . . NPr VP/J . NPr/ISg+ VP/J P NPr/ISg+ R . . ISgPl+ > know , old sport , I’ve never used that pool all summer ? ” # VB . NSg/J+ NSg/VB+ . K R VP/J NSg/I/C/Ddem NSg/VB+ NSg/I/J/C/Dq NPr🅪Sg/VB+ . . > # > I looked at my watch and stood up . # ISg/#r+ VP/J NSg/P D$+ NSg/VB VB/C VP NSg/VB/J/P . > # > “ Twelve minutes to my train , ” # . NSg NPl/V3+ P D$+ NSg/VB+ . . > # > I didn’t want to go to the city . I wasn’t worth a decent stroke of work , but it # ISg/#r+ VXPt NSg/VB P NSg/VB/J P D NSg+ . ISg/#r+ VPt NSg/VB/J D/P J NSg/VB P N🅪Sg/VB+ . NSg/C/P NPr/ISg+ > was more than that — I didn’t want to leave Gatsby . I missed that train , and then # VLPt NPr/I/J/R/Dq C/P NSg/I/C/Ddem+ . ISg/#r+ VXPt NSg/VB P NSg/VB NPr . ISg/#r+ VP/J NSg/I/C/Ddem+ NSg/VB+ . VB/C NSg/J/R/C > another , before I could get myself away . # I/D . C/P ISg/#r+ NSg/VXB NSg/VB ISg+ VB/J . > # > “ I’ll call you up , ” I said finally . # . K NSg/VB ISgPl+ NSg/VB/J/P . . ISg/#r+ VP/J R . > # > “ Do , old sport . ” # . VXB . NSg/J+ NSg/VB+ . . > # > “ I’ll call you about noon . ” # . K NSg/VB ISgPl+ J/P NSg/VB+ . . > # > We walked slowly down the steps . # IPl+ VP/J R N🅪Sg/VB/J/P D+ NPl/V3+ . > # > “ I suppose Daisy’ll call too . ” He looked at me anxiously , as if he hoped I’d # . ISg/#r+ VB ? NSg/VB R . . NPr/ISg+ VP/J NSg/P NPr/ISg+ R . R/C/P NSg/C NPr/ISg+ VP/J K > corroborate this . # VB I/Ddem+ . > # > “ I suppose so . ” # . ISg/#r+ VB NSg/I/J/R/C . . > # > “ Well , good - by . ” # . NSg/VB/J/R . NPr/VB/J . NSg/P . . > # > We shook hands and I started away . Just before I reached the hedge I remembered # IPl+ NSg/VPt/J NPl/V3+ VB/C ISg/#r+ VP/J VB/J . J/R C/P ISg/#r+ VP/J D+ NSg/VB+ ISg/#r+ VP/J > something and turned around . # NSg/I/J+ VB/C VP/J J/P . > # > “ They’re a rotten crowd , ” I shouted across the lawn . “ You’re worth the whole # . K D/P+ J NSg/VB+ . . ISg/#r+ VP/J NSg/P D NSg/VB+ . . K NSg/VB/J D NSg/J > damn bunch put together . ” # NSg/VB/J NSg/VB+ NSg/VBP J . . > # > I’ve always been glad I said that . It was the only compliment I ever gave him , # K R NSg/VLPp NSg/VB/J ISg/#r+ VP/J NSg/I/C/Ddem+ . NPr/ISg+ VLPt D J/R/C NSg/VB ISg/#r+ J/R VPt ISg+ . > because I disapproved of him from beginning to end . First he nodded politely , # C/P ISg/#r+ VP/J P ISg+ P NSg/Vg/J+ P NSg/VB . NSg/J NPr/ISg+ VP R . > and then his face broke into that radiant and understanding smile , as if we’d # VB/C NSg/J/R/C ISg/D$+ NSg/VB+ NSg/VPt/J P NSg/I/C/Ddem NSg/J VB/C N🅪Sg/Vg/J+ NSg/VB+ . R/C/P NSg/C K > been in ecstatic cahoots on that fact all the time . His gorgeous pink rag of a # NSg/VLPp NPr/J/R/P NSg/J NPl/V3 J/P NSg/I/C/Ddem NSg+ NSg/I/J/C/Dq D N🅪Sg/VB/J+ . ISg/D$+ J N🅪Sg/VB/J NSg/VB P D/P+ > suit made a bright spot of color against the white steps , and I thought of the # NSg/VB+ VP D/P NPr/VB/J NSg/VB/J P N🅪Sg/VB/J/Am+ C/P D+ NPr🅪Sg/VB/J+ NPl/V3+ . VB/C ISg/#r+ N🅪Sg/VP P D+ > night when I first came to his ancestral home , three months before . The lawn and # N🅪Sg/VB+ NSg/I/C ISg/#r+ NSg/J NSg/VPt/P P ISg/D$+ NSg/J+ NSg/VB/J+ . NSg+ NPl+ C/P . D+ NSg/VB+ VB/C > drive had been crowded with the faces of those who guessed at his corruption — and # N🅪Sg/VB VP NSg/VLPp VP/J P D NPl/V3 P I/Ddem+ NPr/I+ VP/J NSg/P ISg/D$+ N🅪Sg+ . VB/C > he had stood on those steps , concealing his incorruptible dream , as he waved # NPr/ISg+ VP VP J/P I/Ddem+ NPl/V3+ . Nᴹ/Vg/J ISg/D$+ NSg/J NSg/VB/J+ . R/C/P NPr/ISg+ VP/J > them good - by . # NSg/IPl+ NPr/VB/J . NSg/P . > # > I thanked him for his hospitality . We were always thanking him for that — I and # ISg/#r+ VP/J ISg+ R/C/P ISg/D$+ Nᴹ+ . IPl+ NSg/VLPt R Nᴹ/Vg/J ISg+ R/C/P NSg/I/C/Ddem+ . ISg/#r+ VB/C > the others . # D+ NPl/V3+ . > # > “ Good - by , ” I called . “ I enjoyed breakfast , Gatsby . ” # . NPr/VB/J . NSg/P . . ISg/#r+ VP/J . . ISg/#r+ VP/J N🅪Sg/VB+ . NPr . . > # > Up in the city , I tried for a while to list the quotations on an interminable # NSg/VB/J/P NPr/J/R/P D+ NSg+ . ISg/#r+ VP/J R/C/P D/P NSg/VB/C/P+ P NSg/VB D NPl J/P D/P J > amount of stock , then I fell asleep in my swivel - chair . Just before noon the # NSg/VB P N🅪Sg/VB/J+ . NSg/J/R/C ISg/#r+ NSg/VPt/J J NPr/J/R/P D$+ NSg/VB+ . NSg/VB+ . J/R C/P NSg/VB+ D+ > phone woke me , and I started up with sweat breaking out on my forehead . It was # NSg/VB+ NSg/VB/J NPr/ISg+ . VB/C ISg/#r+ VP/J NSg/VB/J/P P N🅪Sg/VB+ Nᴹ/Vg/J NSg/VB/J/R/P J/P D$+ NSg+ . NPr/ISg+ VLPt > Jordan Baker ; she often called me up at this hour because the uncertainty of her # NPr+ NPr+ . ISg+ R VP/J NPr/ISg+ NSg/VB/J/P NSg/P I/Ddem+ NSg+ C/P D NSg P ISg/D$+ > own movements between hotels and clubs and private houses made her hard to find # NSg/VB/J NPl NSg/P NPl VB/C NPl/V3 VB/C NSg/VB/J+ NPl/V3+ VP ISg/D$+ N🅪Sg/J/R P NSg/VB > in any other way . Usually her voice came over the wire as something fresh and # NPr/J/R/P I/R/Dq+ NSg/VB/J+ NSg/J+ . R ISg/D$+ NSg/VB+ NSg/VPt/P NSg/J/P D+ N🅪Sg/VB+ R/C/P NSg/I/J+ NSg/VB/J VB/C > cool , as if a divot from a green golf - links had come sailing in at the office # NSg/VB/J . R/C/P NSg/C D/P NSg/VB P D/P NPr🅪Sg/VB/J NSg/VB+ . NPl/V3+ VP NSg/VBPp/P Nᴹ/Vg/J NPr/J/R/P NSg/P D NSg/VB+ > window , but this morning it seemed harsh and dry . # NSg/VB+ . NSg/C/P I/Ddem N🅪Sg/Vg/J+ NPr/ISg+ VP/J VB/J VB/C NSg/VB/J . > # > “ I’ve left Daisy’s house , ” she said . “ I’m at Hempstead , and I’m going down to # . K NPr/VP/J NPr$ NPr/VB+ . . ISg+ VP/J . . K NSg/P ? . VB/C K Nᴹ/Vg/J N🅪Sg/VB/J/P P > Southampton this afternoon . ” # NPr+ I/Ddem N🅪Sg+ . . > # > Probably it had been tactful to leave Daisy’s house , but the act annoyed me , and # R NPr/ISg+ VP NSg/VLPp J P NSg/VB NPr$ NPr/VB+ . NSg/C/P D NPr/VB+ VP/J NPr/ISg+ . VB/C > her next remark made me rigid . # ISg/D$+ NSg/J/P NSg/VB+ VP NPr/ISg+ NSg/J . > # > “ You weren’t so nice to me last night . ” # . ISgPl+ VPt NSg/I/J/R/C NPr/J P NPr/ISg+ NSg/VB/J N🅪Sg/VB+ . . > # > “ How could it have mattered then ? ” # . NSg/C NSg/VXB NPr/ISg+ NSg/VXB VP/J NSg/J/R/C . . > # > Silence for a moment . Then : # NSg/VB R/C/P D/P+ NSg+ . NSg/J/R/C . > # > “ However — I want to see you . ” # . C . ISg/#r+ NSg/VB P NSg/VB ISgPl+ . . > # > “ I want to see you , too . ” # . ISg/#r+ NSg/VB P NSg/VB ISgPl+ . R . . > # > “ Suppose I don’t go to Southampton , and come into town this afternoon ? ” # . VB ISg/#r+ VXB NSg/VB/J P NPr+ . VB/C NSg/VBPp/P P NSg+ I/Ddem N🅪Sg+ . . > # > “ No — I don’t think this afternoon . ” # . NSg/Dq/P . ISg/#r+ VXB NSg/VB I/Ddem N🅪Sg+ . . > # > “ Very well . ” # . J/R NSg/VB/J/R . . > # > “ It’s impossible this afternoon . Various — — — ” # . K NSg/J I/Ddem N🅪Sg+ . J . . . . > # > We talked like that for a while , and then abruptly we weren’t talking any # IPl+ VP/J NSg/VB/J/C/P NSg/I/C/Ddem R/C/P D/P+ NSg/VB/C/P+ . VB/C NSg/J/R/C R IPl+ VPt Nᴹ/Vg/J I/R/Dq > longer . I don’t know which of us hung up with a sharp click , but I know I didn’t # NSg/JC . ISg/#r+ VXB VB I/C P NPr/IPl+ NPr/VP/J NSg/VB/J/P P D/P NPr/VB/J NSg/VB+ . NSg/C/P ISg/#r+ VB ISg/#r+ VXPt > care . I couldn’t have talked to her across a tea - table that day if I never # N🅪Sg/VB+ . ISg/#r+ VXB NSg/VXB VP/J P ISg/D$+ NSg/P D/P N🅪Sg/VB+ . NSg/VB+ NSg/I/C/Ddem+ NPr🅪Sg+ NSg/C ISg/#r+ R > talked to her again in this world . # VP/J P ISg/D$+ P NPr/J/R/P I/Ddem NSg/VB+ . > # > I called Gatsby’s house a few minutes later , but the line was busy . I tried four # ISg/#r+ VP/J NPr$ NPr/VB+ D/P NSg/I/Dq NPl/V3+ JC . NSg/C/P D NSg/VB+ VLPt NSg/VB/J . ISg/#r+ VP/J NSg+ > times ; finally an exasperated central told me the wire was being kept open for # NPl/V3+ . R D/P VP/J NPr/J VP NPr/ISg+ D N🅪Sg/VB+ VLPt N🅪Sg/VLg/J/C VP NSg/VB/J R/C/P > long distance from Detroit . Taking out my time - table , I drew a small circle # NPr/VB/J N🅪Sg/VB P NPr+ . NSg/Vg/J NSg/VB/J/R/P D$+ N🅪Sg/VB/J+ . NSg/VB+ . ISg/#r+ NPr/VPt D/P+ NPr/VB/J+ NSg/VB+ > around the three - fifty train . Then I leaned back in my chair and tried to think . # J/P D NSg . NSg NSg/VB+ . NSg/J/R/C ISg/#r+ VP/J NSg/VB/J NPr/J/R/P D$+ NSg/VB+ VB/C VP/J P NSg/VB . > It was just noon . # NPr/ISg+ VLPt J/R NSg/VB+ . > # > When I passed the ashheaps on the train that morning I had crossed deliberately # NSg/I/C ISg/#r+ VP/J D ? J/P D NSg/VB+ NSg/I/C/Ddem+ N🅪Sg/Vg/J+ ISg/#r+ VP VP/J R > to the other side of the car . I supposed there’d be a curious crowd around there # P D NSg/VB/J NSg/VB/J P D NSg+ . ISg/#r+ VP/J K NSg/VLXB D/P J NSg/VB+ J/P R+ > all day with little boys searching for dark spots in the dust , and some # NSg/I/J/C/Dq NPr🅪Sg+ P NPr/I/J/Dq NPl/V3+ Nᴹ/Vg/J R/C/P NSg/VB/J NPl/V3+ NPr/J/R/P D Nᴹ/VB+ . VB/C I/J/R/Dq > garrulous man telling over and over what had happened , until it became less and # J NPr/VB/J+ Nᴹ/Vg/J NSg/J/P VB/C NSg/J/P NSg/I+ VP VP/J . C/P NPr/ISg+ VPt VB/J/R/C/P VB/C > less real even to him and he could tell it no longer , and Myrtle Wilson’s tragic # VB/J/R/C/P NSg/J NSg/VB/J/R P ISg+ VB/C NPr/ISg+ NSg/VXB NPr/VB NPr/ISg+ NSg/Dq/P NSg/JC . VB/C NPr NPr$ NSg/J > achievement was forgotten . Now I want to go back a little and tell what happened # N🅪Sg+ VLPt NSg/VPp/J . NSg/J/R/C ISg/#r+ NSg/VB P NSg/VB/J NSg/VB/J D/P NPr/I/J/Dq VB/C NPr/VB NSg/I+ VP/J > at the garage after we left there the night before . # NSg/P D+ NSg/VB+ P IPl+ NPr/VP/J R+ D+ N🅪Sg/VB+ C/P . > # > They had difficulty in locating the sister , Catherine . She must have broken her # IPl+ VP N🅪Sg+ NPr/J/R/P Nᴹ/Vg/J D NSg/VB+ . NPr+ . ISg+ NSg/VXB NSg/VXB VPp/J ISg/D$+ > rule against drinking that night , for when she arrived she was stupid with # NSg/VB+ C/P Nᴹ/Vg/J NSg/I/C/Ddem+ N🅪Sg/VB+ . R/C/P NSg/I/C ISg+ VP/J ISg+ VLPt NSg/J P > liquor and unable to understand that the ambulance had already gone to Flushing . # N🅪Sg/VB+ VB/C NSg/VB/J P VB NSg/I/C/Ddem D+ NSg/VB+ VP R VPp/J/P P Nᴹ/Vg/J . > When they convinced her of this , she immediately fainted , as if that was the # NSg/I/C IPl+ VP/J ISg/D$+ P I/Ddem+ . ISg+ R VP/J . R/C/P NSg/C NSg/I/C/Ddem+ VLPt D > intolerable part of the affair . Some one , kind or curious , took her in his car # J NSg/VB/J P D NSg+ . I/J/R/Dq NSg/I/J . NSg/J+ NPr/C J . VPt ISg/D$+ NPr/J/R/P ISg/D$+ NSg+ > and drove her in the wake of her sister’s body . # VB/C NSg/VPt ISg/D$+ NPr/J/R/P D NPr/VB P ISg/D$+ NSg$ NSg/VB+ . > # > Until long after midnight a changing crowd lapped up against the front of the # C/P NPr/VB/J P NSg/J+ D/P Nᴹ/Vg/J NSg/VB+ VP/J NSg/VB/J/P C/P D NSg/VB/J P D+ > garage , while George Wilson rocked himself back and forth on the couch inside . # NSg/VB+ . NSg/VB/C/P NPr+ NPr+ VP/J ISg+ NSg/VB/J VB/C R J/P D+ NSg/VB+ NSg/J/P . > For a while the door of the office was open , and every one who came into the # R/C/P D/P NSg/VB/C/P+ D NSg/VB P D+ NSg/VB+ VLPt NSg/VB/J . VB/C Dq+ NSg/I/J+ NPr/I+ NSg/VPt/P P D+ > garage glanced irresistibly through it . Finally some one said it was a shame , # NSg/VB+ VP/J R NSg/J/P NPr/ISg+ . R I/J/R/Dq NSg/I/J+ VP/J NPr/ISg+ VLPt D/P N🅪Sg/VB/J . > and closed the door . Michaelis and several other men were with him ; first , four # VB/C VP/J D+ NSg/VB+ . ? VB/C J/Dq+ NSg/VB/J+ NPl+ NSg/VLPt P ISg+ . NSg/J . NSg > or five men , later two or three men . Still later Michaelis had to ask the last # NPr/C NSg+ NPl+ . JC NSg NPr/C NSg+ NPl+ . NSg/VB/J/R JC ? VP P NSg/VB D+ NSg/VB/J+ > stranger to wait there fifteen minutes longer , while he went back to his own # NSg/VB/JC+ P NSg/VB R+ NSg+ NPl/V3+ NSg/JC . NSg/VB/C/P NPr/ISg+ NSg/VPt NSg/VB/J P ISg/D$+ NSg/VB/J+ > place and made a pot of coffee . After that , he stayed there alone with Wilson # N🅪Sg/VB+ VB/C VP D/P N🅪Sg/VB P N🅪Sg/VB/J+ . P NSg/I/C/Ddem+ . NPr/ISg+ VP/J R J P NPr+ > until dawn . # C/P NPr🅪Sg/VB+ . > # > About three o’clock the quality of Wilson’s incoherent muttering changed — he grew # J/P NSg R D N🅪Sg/J P NPr$ J+ Nᴹ/Vg/J+ VP/J . NPr/ISg+ VPt > quieter and began to talk about the yellow car . He announced that he had a way # NSg/JC VB/C VPt P N🅪Sg/VB J/P D NSg/VB/J NSg+ . NPr/ISg+ VP/J NSg/I/C/Ddem NPr/ISg+ VP D/P NSg/J > of finding out whom the yellow car belonged to , and then he blurted out that a # P Nᴹ/Vg/J NSg/VB/J/R/P I+ D+ NSg/VB/J+ NSg+ VP/J P . VB/C NSg/J/R/C NPr/ISg+ VP/J NSg/VB/J/R/P NSg/I/C/Ddem D/P > couple of months ago his wife had come from the city with her face bruised and # NSg/VB/J P NPl+ J/P ISg/D$+ NSg/VB/J+ VP NSg/VBPp/P P D NSg+ P ISg/D$+ NSg/VB+ VP/J VB/C > her nose swollen . # ISg/D$+ NSg/VB+ VB/J . > # > But when he heard himself say this , he flinched and began to cry “ Oh , my God ! ” # NSg/C/P NSg/I/C NPr/ISg+ VP/J ISg+ NSg/VB I/Ddem+ . NPr/ISg+ VP/J VB/C VPt P NSg/VB . NPr/VB . D$+ NPr/VB+ . . > again in his groaning voice . Michaelis made a clumsy attempt to distract him . # P NPr/J/R/P ISg/D$+ Nᴹ/Vg/J NSg/VB+ . ? VP D/P NSg/J NSg/VB+ P NSg/VB/J ISg+ . > # > “ How long have you been married , George ? Come on there , try and sit still a # . NSg/C NPr/VB/J NSg/VXB ISgPl+ NSg/VLPp NSg/VP/J . NPr+ . NSg/VBPp/P J/P R . NSg/VB/J VB/C NSg/VB NSg/VB/J/R D/P > minute and answer my question . How long have you been married ? ” # NSg/VB/J VB/C NSg/VB+ D$+ NSg/VB+ . NSg/C NPr/VB/J NSg/VXB ISgPl+ NSg/VLPp NSg/VP/J . . > # > “ Twelve years . ” # . NSg+ NPl+ . . > # > “ Ever had any children ? Come on , George , sit still — I asked you a question . Did # . J/R VP I/R/Dq+ NPl+ . NSg/VBPp/P J/P . NPr+ . NSg/VB NSg/VB/J/R . ISg/#r+ VP/J ISgPl+ D/P+ NSg/VB+ . VXPt > you ever have any children ? ” # ISgPl+ J/R NSg/VXB I/R/Dq+ NPl+ . . > # > The hard brown beetles kept thudding against the dull light , and whenever # D+ N🅪Sg/J/R+ NPr🅪Sg/VB/J+ NPl/V3+ VP NSg/Vg C/P D VB/J N🅪Sg/VB/J+ . VB/C C > Michaelis heard a car go tearing along the road outside it sounded to him like # ? VP/J D/P NSg+ NSg/VB/J Nᴹ/Vg/J P D N🅪Sg/J+ Nᴹ/VB/J/P NPr/ISg+ VP/J P ISg+ NSg/VB/J/C/P > the car that hadn’t stopped a few hours before . He didn’t like to go into the # D NSg+ NSg/I/C/Ddem+ VPt VP/J D/P NSg/I/Dq NPl+ C/P . NPr/ISg+ VXPt NSg/VB/J/C/P P NSg/VB/J P D > garage , because the work bench was stained where the body had been lying , so he # NSg/VB+ . C/P D N🅪Sg/VB+ NSg/VB+ VLPt VP/J NSg/R/C D NSg/VB+ VP NSg/VLPp Nᴹ/Vg/J . NSg/I/J/R/C NPr/ISg+ > moved uncomfortably around the office — he knew every object in it before # VP/J R J/P D NSg/VB+ . NPr/ISg+ VPt Dq NSg/VB+ NPr/J/R/P NPr/ISg+ C/P > morning — and from time to time sat down beside Wilson trying to keep him more # N🅪Sg/Vg/J+ . VB/C P N🅪Sg/VB/J+ P N🅪Sg/VB/J NSg/VP/J N🅪Sg/VB/J/P P NPr+ Nᴹ/Vg/J P NSg/VB ISg+ NPr/I/J/R/Dq > quiet . # N🅪Sg/VB/J . > # > “ Have you got a church you go to sometimes , George ? Maybe even if you haven’t # . NSg/VXB ISgPl+ VP D/P+ NPr🅪Sg/VB+ ISgPl+ NSg/VB/J P R . NPr+ . NSg/J/R NSg/VB/J/R NSg/C ISgPl+ VXB > been there for a long time ? Maybe I could call up the church and get a priest to # NSg/VLPp R R/C/P D/P NPr/VB/J N🅪Sg/VB/J+ . NSg/J/R ISg/#r+ NSg/VXB NSg/VB NSg/VB/J/P D+ NPr🅪Sg/VB+ VB/C NSg/VB D/P NSg/VB/J+ P > come over and he could talk to you , see ? ” # NSg/VBPp/P NSg/J/P VB/C NPr/ISg+ NSg/VXB N🅪Sg/VB P ISgPl+ . NSg/VB . . > # > “ Don’t belong to any . ” # . VXB VB/P P I/R/Dq . . > # > “ You ought to have a church , George , for times like this . You must have gone to # . ISgPl+ NSg/I/VXB P NSg/VXB D/P+ NPr🅪Sg/VB+ . NPr+ . R/C/P NPl/V3+ NSg/VB/J/C/P I/Ddem+ . ISgPl+ NSg/VXB NSg/VXB VPp/J/P P > church once . Didn’t you get married in a church ? Listen , George , listen to me . # NPr🅪Sg/VB+ NSg/C . VXPt ISgPl+ NSg/VB NSg/VP/J NPr/J/R/P D/P NPr🅪Sg/VB+ . NSg/VB . NPr+ . NSg/VB P NPr/ISg+ . > Didn’t you get married in a church ? ” # VXPt ISgPl+ NSg/VB NSg/VP/J NPr/J/R/P D/P NPr🅪Sg/VB+ . . > # > “ That was a long time ago . ” # . NSg/I/C/Ddem+ VLPt D/P NPr/VB/J N🅪Sg/VB/J J/P . . > # > The effort of answering broke the rhythm of his rocking — for a moment he was # D N🅪Sg/VB P Nᴹ/Vg/J NSg/VPt/J D N🅪Sg/VB P ISg/D$+ Nᴹ/Vg/J . R/C/P D/P+ NSg+ NPr/ISg+ VLPt > silent . Then the same half - knowing , half - bewildered look came back into his # NSg/J . NSg/J/R/C D+ I/J+ N🅪Sg/J/P+ . NSg/Vg/J/P . N🅪Sg/J/P+ . VP/J NSg/VB NSg/VPt/P NSg/VB/J P ISg/D$+ > faded eyes . # J NPl/V3+ . > # > “ Look in the drawer there , ” he said , pointing at the desk . # . NSg/VB NPr/J/R/P D+ NSg+ R . . NPr/ISg+ VP/J . Nᴹ/Vg/J NSg/P D+ NSg/VB+ . > # > “ Which drawer ? ” # . I/C+ NSg+ . . > # > “ That drawer — that one . ” # . NSg/I/C/Ddem NSg . NSg/I/C/Ddem+ NSg/I/J+ . . > # > Michaelis opened the drawer nearest his hand . There was nothing in it but a # ? VP/J D+ NSg+ JS+ ISg/D$+ NSg/VB+ . R+ VLPt NSg/I/J+ NPr/J/R/P NPr/ISg+ NSg/C/P D/P > small , expensive dog - leash , made of leather and braided silver . It was # NPr/VB/J . J NSg/VB/J+ . NSg/VB+ . VP P N🅪Sg/VB/J VB/C VP/J Nᴹ/VB/J+ . NPr/ISg+ VLPt > apparently new . # R NSg/J . > # > “ This ? ” he inquired , holding it up . # . I/Ddem+ . . NPr/ISg+ VP/J . Nᴹ/Vg/J NPr/ISg+ NSg/VB/J/P . > # > Wilson stared and nodded . # NPr+ VP/J VB/C VP . > # > “ I found it yesterday afternoon . She tried to tell me about it , but I knew it # . ISg/#r+ NSg/VP NPr/ISg+ NSg+ N🅪Sg+ . ISg+ VP/J P NPr/VB NPr/ISg+ J/P NPr/ISg+ . NSg/C/P ISg/#r+ VPt NPr/ISg+ > was something funny . ” # VLPt NSg/I/J+ NSg/J . . > # > “ You mean your wife bought it ? ” # . ISgPl+ NSg/VB/J D$+ NSg/VB/J+ NSg/VP NPr/ISg+ . . > # > “ She had it wrapped in tissue paper on her bureau . ” # . ISg+ VP NPr/ISg+ VP/J NPr/J/R/P N🅪Sg/VB+ N🅪Sg/VB/J+ J/P ISg/D$+ NSg+ . . > # > Michaelis didn’t see anything odd in that , and he gave Wilson a dozen reasons # ? VXPt NSg/VB NSg/I/VB+ NSg/J NPr/J/R/P NSg/I/C/Ddem+ . VB/C NPr/ISg+ VPt NPr+ D/P NSg NPl/V3+ > why his wife might have bought the dog - leash . But conceivably Wilson had heard # NSg/VB ISg/D$+ NSg/VB/J+ Nᴹ/VXB/J NSg/VXB NSg/VP D NSg/VB/J+ . NSg/VB+ . NSg/C/P R NPr+ VP VP/J > some of these same explanations before , from Myrtle , because he began saying # I/J/R/Dq P I/Ddem+ I/J+ NPl+ C/P . P NPr . C/P NPr/ISg+ VPt N🅪Sg/Vg/J > “ Oh , my God ! ” again in a whisper — his comforter left several explanations in the # . NPr/VB . D$+ NPr/VB+ . . P NPr/J/R/P D/P NSg/VB+ . ISg/D$+ NSg+ NPr/VP/J J/Dq NPl NPr/J/R/P D+ > air . # N🅪Sg/VB+ . > # > “ Then he killed her , ” said Wilson . His mouth dropped open suddenly . # . NSg/J/R/C NPr/ISg+ VP/J ISg/D$+ . . VP/J NPr+ . ISg/D$+ NSg/VB+ VP/J NSg/VB/J R . > # > “ Who did ? ” # . NPr/I+ VXPt . . > # > “ I have a way of finding out . ” # . ISg/#r+ NSg/VXB D/P NSg/J P Nᴹ/Vg/J NSg/VB/J/R/P . . > # > “ You’re morbid , George , ” said his friend . “ This has been a strain to you and you # . K J . NPr+ . . VP/J ISg/D$+ NPr/VB/J+ . . I/Ddem+ V3 NSg/VLPp D/P N🅪Sg/VB P ISgPl+ VB/C ISgPl+ > don’t know what you're saying . You’d better try and sit quiet till morning . ” # VXB VB NSg/I+ + N🅪Sg/Vg/J . K NSg/VXB/JC+ NSg/VB/J+ VB/C NSg/VB N🅪Sg/VB/J NSg/VB/C/P N🅪Sg/Vg/J+ . . > # > “ He murdered her . ” # . NPr/ISg+ VP/J ISg/D$+ . . > # > “ It was an accident , George . ” # . NPr/ISg+ VLPt D/P NSg/J . NPr+ . . > # > Wilson shook his head . His eyes narrowed and his mouth widened slightly with the # NPr+ NSg/VPt/J ISg/D$+ NPr/VB/J+ . ISg/D$+ NPl/V3+ VP/J VB/C ISg/D$+ NSg/VB+ VP/J R P D > ghost of a superior “ Hm ! ” # NSg/VB/J+ P D/P NPr/J . NPr . . > # > “ I know , ” he said definitely , “ I’m one of these trusting fellas and I don’t # . ISg/#r+ VB . . NPr/ISg+ VP/J R . . K NSg/I/J P I/Ddem Nᴹ/Vg/J NPl+ VB/C ISg/#r+ VXB > think any harm to nobody , but when I get to know a thing I know it . It was the # NSg/VB I/R/Dq N🅪Sg/VB+ P NSg/I+ . NSg/C/P NSg/I/C ISg/#r+ NSg/VB P VB D/P NSg+ ISg/#r+ VB NPr/ISg+ . NPr/ISg+ VLPt D > man in that car . She ran out to speak to him and he wouldn’t stop . ” # NPr/VB/J NPr/J/R/P NSg/I/C/Ddem+ NSg+ . ISg+ NSg/VPt NSg/VB/J/R/P P NSg/VB P ISg+ VB/C NPr/ISg+ VXB NSg/VB . . > # > Michaelis had seen this too , but it hadn’t occurred to him that there was any # ? VP NSg/VPp I/Ddem R . NSg/C/P NPr/ISg+ VPt VP P ISg+ NSg/I/C/Ddem R+ VLPt I/R/Dq > special significance in it . He believed that Mrs . Wilson had been running away # NSg/VB/J NSg+ NPr/J/R/P NPr/ISg+ . NPr/ISg+ VP/J NSg/I/C/Ddem+ NPl+ . NPr+ VP NSg/VLPp Nᴹ/Vg/J/P VB/J > from her husband , rather than trying to stop any particular car . # P ISg/D$+ NSg/VB+ . NPr/VB/J/R C/P Nᴹ/Vg/J P NSg/VB I/R/Dq+ NSg/J+ NSg+ . > # > “ How could she of been like that ? ” # . NSg/C NSg/VXB ISg+ P NSg/VLPp NSg/VB/J/C/P NSg/I/C/Ddem+ . . > # > “ She’s a deep one , ” said Wilson , as if that answered the question . “ Ah - h - h — — — ” # . K D/P+ NSg/J NSg/I/J+ . . VP/J NPr+ . R/C/P NSg/C NSg/I/C/Ddem+ VP/J D NSg/VB+ . . NSg/I/VB . NSg/J+ . NSg/J+ . . . . > # > He began to rock again , and Michaelis stood twisting the leash in his hand . # NPr/ISg+ VPt P NPr🅪Sg/VB P . VB/C ? VP Nᴹ/Vg/J D+ NSg/VB+ NPr/J/R/P ISg/D$+ NSg/VB+ . > # > “ Maybe you got some friend that I could telephone for , George ? ” # . NSg/J/R ISgPl+ VP I/J/R/Dq+ NPr/VB/J+ NSg/I/C/Ddem+ ISg/#r+ NSg/VXB NSg/VB R/C/P . NPr+ . . > # > This was a forlorn hope — he was almost sure that Wilson had no friend : there was # I/Ddem+ VLPt D/P NSg/VB/J NPr🅪Sg/VB . NPr/ISg+ VLPt R J NSg/I/C/Ddem NPr+ VP NSg/Dq/P NPr/VB/J+ . R+ VLPt > not enough of him for his wife . He was glad a little later when he noticed a # NSg/R/C NSg/I P ISg+ R/C/P ISg/D$+ NSg/VB/J+ . NPr/ISg+ VLPt NSg/VB/J D/P NPr/I/J/Dq JC NSg/I/C NPr/ISg+ VP/J D/P > change in the room , a blue quickening by the window , and realized that dawn # N🅪Sg/VB+ NPr/J/R/P D+ N🅪Sg/VB/J+ . D/P N🅪Sg/VB/J+ Nᴹ/Vg/J+ NSg/P D+ NSg/VB+ . VB/C VP/J/Comm/NoAm NSg/I/C/Ddem+ NPr🅪Sg/VB+ > wasn’t far off . About five o’clock it was blue enough outside to snap off the # VPt NSg/VB/J NSg/VB/J/P . J/P NSg R NPr/ISg+ VLPt N🅪Sg/VB/J NSg/I Nᴹ/VB/J/P P NSg/VB/J+ NSg/VB/J/P D+ > light . # N🅪Sg/VB/J+ . > # > Wilson’s glazed eyes turned out to the ashheaps , where small gray clouds took on # NPr$ VP/J NPl/V3+ VP/J NSg/VB/J/R/P P D ? . NSg/R/C NPr/VB/J NPr🅪Sg/VB/J/Am NPl/V3+ VPt J/P > fantastic shapes and scurried here and there in the faint dawn wind . # NSg/J NPl/V3+ VB/C VP/J J/R VB/C R NPr/J/R/P D NSg/VB/J NPr🅪Sg/VB+ N🅪Sg/VB+ . > # > “ I spoke to her , ” he muttered , after a long silence . “ I told her she might fool # . ISg/#r+ NSg/VPt P ISg/D$+ . . NPr/ISg+ VP/J . P D/P+ NPr/VB/J+ NSg/VB+ . . ISg/#r+ VP ISg/D$+ ISg+ Nᴹ/VXB/J NSg/VB/J > me but she couldn’t fool God . I took her to the window ” — with an effort he got up # NPr/ISg+ NSg/C/P ISg+ VXB NSg/VB/J NPr/VB+ . ISg/#r+ VPt ISg/D$+ P D+ NSg/VB+ . . P D/P+ N🅪Sg/VB+ NPr/ISg+ VP NSg/VB/J/P > and walked to the rear window and leaned with his face pressed against it — “ and I # VB/C VP/J P D+ NSg/VB/J+ NSg/VB+ VB/C VP/J P ISg/D$+ NSg/VB+ VP/J C/P NPr/ISg+ . . VB/C ISg/#r+ > said ‘ God knows what you’ve been doing , everything you’ve been doing . You may # VP/J Unlintable NPr/VB+ V3 NSg/I+ K NSg/VLPp Nᴹ/Vg/J . NSg/I/VB+ K NSg/VLPp Nᴹ/Vg/J . ISgPl+ NPr/VXB > fool me , but you can’t fool God ! ’ ” # NSg/VB/J NPr/ISg+ . NSg/C/P ISgPl+ VXB NSg/VB/J NPr/VB+ . . . > # > Standing behind him , Michaelis saw with a shock that he was looking at the eyes # Nᴹ/Vg/J NSg/J/P ISg+ . ? NSg/VPt P D/P+ N🅪Sg/J+ NSg/I/C/Ddem+ NPr/ISg+ VLPt Nᴹ/Vg/J NSg/P D NPl/V3 > of Doctor T. J. Eckleburg , which had just emerged , pale and enormous , from the # P NSg/VB+ ? ? ? . I/C+ VP J/R VP/J . NSg/VB/J VB/C J . P D > dissolving night . # Nᴹ/Vg/J N🅪Sg/VB+ . > # > “ God sees everything , ” repeated Wilson . # . NPr/VB+ NPl/V3 NSg/I/VB+ . . VP/J NPr+ . > # > “ That’s an advertisement , ” Michaelis assured him . Something made him turn away # . NSg$ D/P NSg . . ? NSg/VP/J ISg+ . NSg/I/J+ VP ISg+ NSg/VB VB/J > from the window and look back into the room . But Wilson stood there a long time , # P D+ NSg/VB+ VB/C NSg/VB NSg/VB/J P D+ N🅪Sg/VB/J+ . NSg/C/P NPr+ VP R+ D/P+ NPr/VB/J+ N🅪Sg/VB/J+ . > his face close to the window pane , nodding into the twilight . # ISg/D$+ NSg/VB+ NSg/VB/J P D+ NSg/VB+ NSg/VB . NSg/VP/J P D Nᴹ/VB/J+ . > # > By six o’clock Michaelis was worn out , and grateful for the sound of a car # NSg/P NSg R ? VLPt VPp/J NSg/VB/J/R/P . VB/C J R/C/P D N🅪Sg/VB/J P D/P+ NSg+ > stopping outside . It was one of the watchers of the night before who had # NSg/Vg Nᴹ/VB/J/P . NPr/ISg+ VLPt NSg/I/J P D NPl P D+ N🅪Sg/VB+ C/P NPr/I+ VP > promised to come back , so he cooked breakfast for three , which he and the other # VP/J P NSg/VBPp/P NSg/VB/J . NSg/I/J/R/C NPr/ISg+ VP/J N🅪Sg/VB+ R/C/P NSg . I/C+ NPr/ISg+ VB/C D+ NSg/VB/J+ > man ate together . Wilson was quieter now , and Michaelis went home to sleep ; when # NPr/VB/J+ NSg/VPt J . NPr+ VLPt NSg/JC NSg/J/R/C . VB/C ? NSg/VPt NSg/VB/J+ P N🅪Sg/VB . NSg/I/C > he awoke four hours later and hurried back to the garage , Wilson was gone . # NPr/ISg+ VPt NSg+ NPl+ JC VB/C VP/J NSg/VB/J P D NSg/VB+ . NPr+ VLPt VPp/J/P . > # > His movements — he was on foot all the time — were afterward traced to Port # ISg/D$+ NPl+ . NPr/ISg+ VLPt J/P NSg/VB+ NSg/I/J/C/Dq D+ N🅪Sg/VB/J+ . NSg/VLPt R/Am VP/J P NPr/VB/J > Roosevelt and then to Gad’s Hill , where he bought a sandwich that he didn’t eat , # NPr+ VB/C NSg/J/R/C P ? NPr/VB+ . NSg/R/C NPr/ISg+ NSg/VP D/P NSg/VB/J+ NSg/I/C/Ddem+ NPr/ISg+ VXPt VB . > and a cup of coffee . He must have been tired and walking slowly , for he didn’t # VB/C D/P NSg/VB P N🅪Sg/VB/J+ . NPr/ISg+ NSg/VXB NSg/VXB NSg/VLPp VP/J VB/C Nᴹ/Vg/J R . R/C/P NPr/ISg+ VXPt > reach Gad’s Hill until noon . Thus far there was no difficulty in accounting for # NSg/VB ? NPr/VB+ C/P NSg/VB+ . NSg NSg/VB/J R+ VLPt NSg/Dq/P N🅪Sg NPr/J/R/P Nᴹ/Vg/J+ R/C/P > his time — there were boys who had seen a man “ acting sort of crazy , ” and # ISg/D$+ N🅪Sg/VB/J+ . R+ NSg/VLPt NPl/V3+ NPr/I+ VP NSg/VPp D/P+ NPr/VB/J+ . Nᴹ/Vg/J NSg/VB+ P NSg/J . . VB/C > motorists at whom he stared oddly from the side of the road . Then for three # NPl NSg/P I+ NPr/ISg+ VP/J R P D NSg/VB/J P D N🅪Sg/J+ . NSg/J/R/C R/C/P NSg+ > hours he disappeared from view . The police , on the strength of what he said to # NPl+ NPr/ISg+ VP/J P NSg/VB+ . D+ Nᴹ/VB+ . J/P D N🅪Sg/VB P NSg/I+ NPr/ISg+ VP/J P > Michaelis , that he “ had a way of finding out , ” supposed that he spent that time # ? . NSg/I/C/Ddem+ NPr/ISg+ . VP D/P NSg/J P Nᴹ/Vg/J NSg/VB/J/R/P . . VP/J NSg/I/C/Ddem NPr/ISg+ VP/J NSg/I/C/Ddem+ N🅪Sg/VB/J+ > going from garage to garage thereabout , inquiring for a yellow car . On the other # Nᴹ/Vg/J P NSg/VB+ P NSg/VB R . Nᴹ/Vg/J R/C/P D/P NSg/VB/J NSg+ . J/P D+ NSg/VB/J+ > hand , no garage man who had seen him ever came forward , and perhaps he had an # NSg/VB+ . NSg/Dq/P+ NSg/VB+ NPr/VB/J+ NPr/I+ VP NSg/VPp ISg+ J/R NSg/VPt/P NSg/VB/J . VB/C NSg/R NPr/ISg+ VP D/P > easier , surer way of finding out what he wanted to know . By half - past two he was # NSg/JC . JC NSg/J P Nᴹ/Vg/J NSg/VB/J/R/P NSg/I+ NPr/ISg+ VP/J P VB . NSg/P N🅪Sg/J/P+ . NSg/VB/J/P NSg NPr/ISg+ VLPt > in West Egg , where he asked some one the way to Gatsby’s house . So by that time # NPr/J/R/P NPr/VB/J+ N🅪Sg/VB+ . NSg/R/C NPr/ISg+ VP/J I/J/R/Dq+ NSg/I/J+ D NSg/J+ P NPr$ NPr/VB+ . NSg/I/J/R/C NSg/P NSg/I/C/Ddem+ N🅪Sg/VB/J+ > he knew Gatsby’s name . # NPr/ISg+ VPt NPr$ NSg/VB+ . > # > At two o’clock Gatsby put on his bathing - suit and left word with the butler that # NSg/P NSg R NPr NSg/VBP J/P ISg/D$+ Nᴹ/Vg/J . NSg/VB+ VB/C NPr/VP/J NSg/VB+ P D NPr/VB NSg/I/C/Ddem > if any one phoned word was to be brought to him at the pool . He stopped at the # NSg/C I/R/Dq NSg/I/J+ VP/J NSg/VB+ VLPt P NSg/VLXB VP P ISg+ NSg/P D NSg/VB+ . NPr/ISg+ VP/J NSg/P D+ > garage for a pneumatic mattress that had amused his guests during the summer , # NSg/VB+ R/C/P D/P NSg/J NSg/VB NSg/I/C/Ddem+ VP VP/J ISg/D$+ NPl/V3+ VB/P D NPr🅪Sg/VB+ . > and the chauffeur helped him pump it up . Then he gave instructions that the open # VB/C D NSg/VB VP/J ISg+ NSg/VB+ NPr/ISg+ NSg/VB/J/P . NSg/J/R/C NPr/ISg+ VPt NPl+ NSg/I/C/Ddem D+ NSg/VB/J+ > car wasn’t to be taken out under any circumstances — and this was strange , because # NSg+ VPt P NSg/VLXB VPp/J NSg/VB/J/R/P NSg/J/P I/R/Dq NPl/V3+ . VB/C I/Ddem+ VLPt NSg/VB/J . C/P > the front right fender needed repair . # D NSg/VB/J+ NPr/VB/J NSg/VB VP/J N🅪Sg/VB+ . > # > Gatsby shouldered the mattress and started for the pool . Once he stopped and # NPr VP/J D NSg/VB VB/C VP/J R/C/P D NSg/VB+ . NSg/C NPr/ISg+ VP/J VB/C > shifted it a little , and the chauffeur asked him if he needed help , but he shook # VP/J NPr/ISg+ D/P NPr/I/J/Dq . VB/C D NSg/VB VP/J ISg+ NSg/C NPr/ISg+ VP/J NSg/VB . NSg/C/P NPr/ISg+ NSg/VPt/J > his head and in a moment disappeared among the yellowing trees . # ISg/D$+ NPr/VB/J+ VB/C NPr/J/R/P D/P NSg+ VP/J P D Nᴹ/Vg/J NPl/V3+ . > # > No telephone message arrived , but the butler went without his sleep and waited # NSg/Dq/P+ NSg/VB+ NSg/VB+ VP/J . NSg/C/P D NPr/VB NSg/VPt C/P ISg/D$+ N🅪Sg/VB+ VB/C VP/J > for it until four o’clock — until long after there was any one to give it to if it # R/C/P NPr/ISg+ C/P NSg R . C/P NPr/VB/J P R+ VLPt I/R/Dq NSg/I/J+ P NSg/VB NPr/ISg+ P NSg/C NPr/ISg+ > came . I have an idea that Gatsby himself didn’t believe it would come , and # NSg/VPt/P . ISg/#r+ NSg/VXB D/P+ NSg+ NSg/I/C/Ddem+ NPr ISg+ VXPt VB NPr/ISg+ VXB NSg/VBPp/P . VB/C > perhaps he no longer cared . If that was true he must have felt that he had lost # NSg/R NPr/ISg+ NSg/Dq/P NSg/JC VP . NSg/C NSg/I/C/Ddem+ VLPt NSg/VB/J NPr/ISg+ NSg/VXB NSg/VXB N🅪Sg/VP/J NSg/I/C/Ddem NPr/ISg+ VP VP/J > the old warm world , paid a high price for living too long with a single dream . # D+ NSg/J+ NSg/VB/J+ NSg/VB+ . VP/J D/P+ NSg/VB/J/R+ NPr🅪Sg/VB+ R/C/P Nᴹ/Vg/J R NPr/VB/J P D/P+ NSg/VB/J+ NSg/VB/J+ . > He must have looked up at an unfamiliar sky through frightening leaves and # NPr/ISg+ NSg/VXB NSg/VXB VP/J NSg/VB/J/P NSg/P D/P+ NSg/J+ N🅪Sg/VB+ NSg/J/P Nᴹ/Vg/J+ NPl/V3+ VB/C > shivered as he found what a grotesque thing a rose is and how raw the sunlight # VP/J R/C/P NPr/ISg+ NSg/VP NSg/I+ D/P+ NSg/J+ NSg+ D/P+ NPr/VPt/J+ VL3 VB/C NSg/C NSg/VB/J D+ NSg/VB+ > was upon the scarcely created grass . A new world , material without being real , # VLPt P D R VP/J NPr🅪Sg/VB+ . D/P+ NSg/J NSg/VB+ . N🅪Sg/VB/J+ C/P N🅪Sg/VLg/J/C NSg/J . > where poor ghosts , breathing dreams like air , drifted fortuitously about . . . # NSg/R/C NSg/VB/J+ NPl/V3+ . Nᴹ/Vg/J NPl/V3+ NSg/VB/J/C/P N🅪Sg/VB+ . VP/J R J/P . . . > like that ashen , fantastic figure gliding toward him through the amorphous # NSg/VB/J/C/P NSg/I/C/Ddem+ J . NSg/J NSg/VB+ Nᴹ/Vg/J J/P ISg+ NSg/J/P D J > trees . # NPl/V3+ . > # > The chauffeur — he was one of Wolfshiem’s protégés — heard the shots — afterward he # D NSg/VB . NPr/ISg+ VLPt NSg/I/J P ? ? . VP/J D NPl/V3+ . R/Am NPr/ISg+ > could only say that he hadn’t thought anything much about them . I drove from the # NSg/VXB J/R/C NSg/VB NSg/I/C/Ddem NPr/ISg+ VPt N🅪Sg/VP NSg/I/VB+ NSg/I/J/R/Dq J/P NSg/IPl+ . ISg/#r+ NSg/VPt P D+ > station directly to Gatsby’s house and my rushing anxiously up the front steps # NSg/VB+ R/C P NPr$ NPr/VB+ VB/C D$+ Nᴹ/Vg/J R NSg/VB/J/P D NSg/VB/J+ NPl/V3+ > was the first thing that alarmed any one . But they knew then , I firmly believe . # VLPt D NSg/J NSg+ NSg/I/C/Ddem VP/J I/R/Dq NSg/I/J+ . NSg/C/P IPl+ VPt NSg/J/R/C . ISg/#r+ R VB . > With scarcely a word said , four of us , the chauffeur , butler , gardener , and I , # P R D/P+ NSg/VB+ VP/J . NSg P NPr/IPl+ . D NSg/VB . NPr/VB . NSg/JC . VB/C ISg/#r+ . > hurried down to the pool . # VP/J N🅪Sg/VB/J/P P D NSg/VB+ . > # > There was a faint , barely perceptible movement of the water as the fresh flow # R+ VLPt D/P NSg/VB/J . R NSg/J N🅪Sg P D N🅪Sg/VB+ R/C/P D NSg/VB/J NSg/VB+ > from one end urged its way toward the drain at the other . With little ripples # P NSg/I/J NSg/VB+ VP/J ISg/D$+ NSg/J+ J/P D NSg/VB+ NSg/P D NSg/VB/J . P NPr/I/J/Dq+ NPl/V3+ > that were hardly the shadows of waves , the laden mattress moved irregularly down # NSg/I/C/Ddem+ NSg/VLPt R D NPl/V3 P NPl/V3+ . D+ VB/J+ NSg/VB VP/J R N🅪Sg/VB/J/P > the pool . A small gust of wind that scarcely corrugated the surface was enough # D NSg/VB+ . D/P NPr/VB/J NSg/VB P N🅪Sg/VB+ NSg/I/C/Ddem+ R VP/J D NSg/VB+ VLPt NSg/I > to disturb its accidental course with its accidental burden . The touch of a # P NSg/VB ISg/D$+ NSg/J NSg/VB+ P ISg/D$+ NSg/J+ NSg/VB+ . D N🅪Sg/VB P D/P > cluster of leaves revolved it slowly , tracing , like the leg of transit , a thin # NSg/VB P NPl/V3+ VP/J NPr/ISg+ R . Nᴹ/Vg/J . NSg/VB/J/C/P D NSg/VB/J P NSg/VB+ . D/P NSg/VB/J > red circle in the water . # N🅪Sg/J NSg/VB+ NPr/J/R/P D N🅪Sg/VB+ . > # > It was after we started with Gatsby toward the house that the gardener saw # NPr/ISg+ VLPt P IPl+ VP/J P NPr J/P D NPr/VB+ NSg/I/C/Ddem D NSg/JC NSg/VPt > Wilson’s body a little way off in the grass , and the holocaust was complete . # NPr$ NSg/VB+ D/P NPr/I/J/Dq NSg/J+ NSg/VB/J/P NPr/J/R/P D NPr🅪Sg/VB+ . VB/C D NPr/VB+ VLPt NSg/VB/J . > # > CHAPTER IX # HeadingStart NSg/VB+ #r > # > After two years I remember the rest of that day , and that night and the next # P NSg+ NPl+ ISg/#r+ NSg/VB D NSg/VB P NSg/I/C/Ddem+ NPr🅪Sg+ . VB/C NSg/I/C/Ddem N🅪Sg/VB VB/C D+ NSg/J/P+ > day , only as an endless drill of police and photographers and newspaper men in # NPr🅪Sg+ . J/R/C R/C/P D/P J NSg/VB P Nᴹ/VB VB/C NPl VB/C N🅪Sg/VB+ NPl+ NPr/J/R/P > and out of Gatsby’s front door . A rope stretched across the main gate and a # VB/C NSg/VB/J/R/P P NPr$ NSg/VB/J+ NSg/VB+ . D/P+ NSg/VB+ VP/J NSg/P D NSg/VB/J NSg/VB VB/C D/P+ > policeman by it kept out the curious , but little boys soon discovered that they # NSg+ NSg/P NPr/ISg+ VP NSg/VB/J/R/P D J . NSg/C/P NPr/I/J/Dq+ NPl/V3+ J/R VP/J NSg/I/C/Ddem IPl+ > could enter through my yard , and there were always a few of them clustered # NSg/VXB NSg/VB NSg/J/P D$+ NSg/VB+ . VB/C R+ NSg/VLPt R D/P NSg/I/Dq P NSg/IPl+ VP/J > open - mouthed about the pool . Some one with a positive manner , perhaps a # NSg/VB/J . VP/J J/P D+ NSg/VB+ . I/J/R/Dq NSg/I/J P D/P+ NSg/J+ NSg+ . NSg/R D/P+ > detective , used the expression “ madman ” as he bent over Wilson’s body that # NSg/J+ . VP/J D+ N🅪Sg+ . NSg . R/C/P NPr/ISg+ NSg/VP/J NSg/J/P NPr$ NSg/VB+ NSg/I/C/Ddem+ > afternoon , and the adventitious authority of his voice set the key for the # N🅪Sg+ . VB/C D J N🅪Sg P ISg/D$+ NSg/VB+ NPr/VBP/J D NPr/VB/J R/C/P D > newspaper reports next morning . # N🅪Sg/VB+ NPl/V3+ NSg/J/P N🅪Sg/Vg/J+ . > # > Most of those reports were a nightmare — grotesque , circumstantial , eager , and # NSg/I/J/R/Dq P I/Ddem+ NPl/V3+ NSg/VLPt D/P+ NSg/VB+ . NSg/J . NSg/J . NSg/VB/J . VB/C > untrue . When Michaelis’s testimony at the inquest brought to light Wilson’s # J . NSg/I/C ? NSg+ NSg/P D NSg/VB VP P N🅪Sg/VB/J NPr$ > suspicions of his wife I thought the whole tale would shortly be served up in # NPl/V3 P ISg/D$+ NSg/VB/J+ ISg/#r+ N🅪Sg/VP D NSg/J NSg/VB+ VXB R NSg/VLXB VP/J NSg/VB/J/P NPr/J/R/P > racy pasquinade — but Catherine , who might have said anything , didn’t say a word . # J ? . NSg/C/P NPr+ . NPr/I+ Nᴹ/VXB/J NSg/VXB VP/J NSg/I/VB+ . VXPt NSg/VB D/P NSg/VB+ . > She showed a surprising amount of character about it too — looked at the coroner # ISg+ VP/J D/P Nᴹ/Vg/J NSg/VB P N🅪Sg/VB+ J/P NPr/ISg+ R . VP/J NSg/P D+ NSg+ > with determined eyes under that corrected brow of hers , and swore that her # P VP/J NPl/V3+ NSg/J/P NSg/I/C/Ddem+ VP/J NSg/VB P ISg+ . VB/C VB NSg/I/C/Ddem ISg/D$+ > sister had never seen Gatsby , that her sister was completely happy with her # NSg/VB+ VP R NSg/VPp NPr . NSg/I/C/Ddem ISg/D$+ NSg/VB+ VLPt R NSg/VB/J P ISg/D$+ > husband , that her sister had been into no mischief whatever . She convinced # NSg/VB+ . NSg/I/C/Ddem ISg/D$+ NSg/VB+ VP NSg/VLPp P NSg/Dq/P NSg/VB+ NSg/I/J+ . ISg+ VP/J > herself of it , and cried into her handkerchief , as if the very suggestion was # ISg+ P NPr/ISg+ . VB/C VP/J P ISg/D$+ NSg+ . R/C/P NSg/C D+ J/R+ N🅪Sg+ VLPt > more than she could endure . So Wilson was reduced to a man “ deranged by grief ” # NPr/I/J/R/Dq C/P ISg+ NSg/VXB VB . NSg/I/J/R/C NPr+ VLPt VP/J P D/P+ NPr/VB/J+ . VP/J NSg/P Nᴹ/VB+ . > in order that the case might remain in its simplest form . And it rested there . # NPr/J/R/P N🅪Sg/VB+ NSg/I/C/Ddem D NPr🅪Sg/VB+ Nᴹ/VXB/J NSg/VB NPr/J/R/P ISg/D$+ JS N🅪Sg/VB+ . VB/C NPr/ISg+ VP/J R . > # > But all this part of it seemed remote and unessential . I found myself on # NSg/C/P NSg/I/J/C/Dq I/Ddem NSg/VB/J P NPr/ISg+ VP/J NSg/VB/J VB/C J . ISg/#r+ NSg/VP ISg+ J/P > Gatsby’s side , and alone . From the moment I telephoned news of the catastrophe # NPr$ NSg/VB/J+ . VB/C J . P D+ NSg+ ISg/#r+ VP/J Nᴹ/VB P D NSg+ > to West Egg village , every surmise about him , and every practical question , was # P NPr/VB/J+ N🅪Sg/VB+ NSg+ . Dq NSg/VB J/P ISg+ . VB/C Dq NSg/J NSg/VB+ . VLPt > referred to me . At first I was surprised and confused ; then , as he lay in his # VP P NPr/ISg+ . NSg/P NSg/J ISg/#r+ VLPt VP/J VB/C VP/J . NSg/J/R/C . R/C/P NPr/ISg+ NSg/VBPt/J NPr/J/R/P ISg/D$+ > house and didn’t move or breathe or speak , hour upon hour , it grew upon me that # NPr/VB+ VB/C VXPt NSg/VB NPr/C VB NPr/C NSg/VB . NSg+ P NSg+ . NPr/ISg+ VPt P NPr/ISg+ NSg/I/C/Ddem > I was responsible , because no one else was interested — interested , I mean , with # ISg/#r+ VLPt NSg/J . C/P NSg/Dq/P NSg/I/J+ NSg/J/C VLPt VP/J . VP/J . ISg/#r+ NSg/VB/J . P > that intense personal interest to which every one has some vague right at the # NSg/I/C/Ddem J NSg/J N🅪Sg/VB+ P I/C+ Dq NSg/I/J+ V3 I/J/R/Dq NSg/VB/J NPr/VB/J NSg/P D > end . # NSg/VB+ . > # > I called up Daisy half an hour after we found him , called her instinctively and # ISg/#r+ VP/J NSg/VB/J/P NPr+ N🅪Sg/J/P+ D/P+ NSg+ P IPl+ NSg/VP ISg+ . VP/J ISg/D$+ R VB/C > without hesitation . But she and Tom had gone away early that afternoon , and # C/P NSg+ . NSg/C/P ISg+ VB/C NPr/VB+ VP VPp/J/P VB/J NSg/J/R NSg/I/C/Ddem N🅪Sg+ . VB/C > taken baggage with them . # VPp/J Nᴹ+ P NSg/IPl+ . > # > “ Left no address ? ” # . NPr/VP/J NSg/Dq/P+ NSg/VB+ . . > # > “ No . ” # . NSg/Dq/P . . > # > “ Say when they’d be back ? ” # . NSg/VB NSg/I/C K NSg/VLXB NSg/VB/J . . > # > “ No . ” # . NSg/Dq/P . . > # > “ Any idea where they are ? How I could reach them ? ” # . I/R/Dq+ NSg+ NSg/R/C IPl+ VLB . NSg/C ISg/#r+ NSg/VXB NSg/VB NSg/IPl+ . . > # > “ I don’t know . Can’t say . ” # . ISg/#r+ VXB VB . VXB NSg/VB . . > # > I wanted to get somebody for him . I wanted to go into the room where he lay and # ISg/#r+ VP/J P NSg/VB NSg/I+ R/C/P ISg+ . ISg/#r+ VP/J P NSg/VB/J P D+ N🅪Sg/VB/J+ NSg/R/C NPr/ISg+ NSg/VBPt/J VB/C > reassure him : “ I’ll get somebody for you , Gatsby . Don’t worry . Just trust me and # VB ISg+ . . K NSg/VB NSg/I+ R/C/P ISgPl+ . NPr . VXB N🅪Sg/VB . J/R N🅪Sg/VB/J NPr/ISg+ VB/C > I’ll get somebody for you — — — ” # K NSg/VB NSg/I+ R/C/P ISgPl+ . . . . > # > Meyer Wolfshiem’s name wasn’t in the phone book . The butler gave me his office # NPr ? NSg/VB+ VPt NPr/J/R/P D NSg/VB+ NSg/VB+ . D NPr/VB VPt NPr/ISg+ ISg/D$+ NSg/VB+ > address on Broadway , and I called Information , but by the time I had the number # NSg/VB+ J/P NPr/J+ . VB/C ISg/#r+ VP/J Nᴹ+ . NSg/C/P NSg/P D N🅪Sg/VB/J+ ISg/#r+ VP D N🅪Sg/VB/JC+ > it was long after five , and no one answered the phone . # NPr/ISg+ VLPt NPr/VB/J P NSg . VB/C NSg/Dq/P NSg/I/J+ VP/J D NSg/VB+ . > # > “ Will you ring again ? ” # . NPr/VXB ISgPl+ NSg/VB+ P . . > # > “ I’ve rung them three times . ” # . K NSg/VPp/J NSg/IPl+ NSg+ NPl/V3+ . . > # > “ It’s very important . ” # . K J/R J . . > # > “ Sorry . I’m afraid no one’s there . ” # . NSg/VB/J . K J NSg/Dq/P NSg$ R . . > # > I went back to the drawing - room and thought for an instant that they were chance # ISg/#r+ NSg/VPt NSg/VB/J P D+ N🅪Sg/Vg/J+ . N🅪Sg/VB/J+ VB/C N🅪Sg/VP R/C/P D/P NSg/VB/J NSg/I/C/Ddem IPl+ NSg/VLPt NPr/VB/J+ > visitors , all these official people who suddenly filled it . But , though they # NPl+ . NSg/I/J/C/Dq I/Ddem+ NSg/J+ NPl/VB+ NPr/I+ R VP/J NPr/ISg+ . NSg/C/P . C IPl+ > drew back the sheet and looked at Gatsby with shocked eyes , his protest # NPr/VPt NSg/VB/J D+ NSg/VB+ VB/C VP/J NSg/P NPr P J NPl/V3+ . ISg/D$+ N🅪Sg/VB+ > continued in my brain : # VP/J NPr/J/R/P D$+ NPr🅪Sg/VB+ . > # > “ Look here , old sport , you’ve got to get somebody for me . You’ve got to try # . NSg/VB J/R . NSg/J+ NSg/VB+ . K VP P NSg/VB NSg/I+ R/C/P NPr/ISg+ . K VP P NSg/VB/J > hard . I can’t go through this alone . ” # N🅪Sg/J/R . ISg/#r+ VXB NSg/VB/J NSg/J/P I/Ddem J . . > # > Some one started to ask me questions , but I broke away and going up - stairs # I/J/R/Dq NSg/I/J VP/J P NSg/VB NPr/ISg+ NPl/V3+ . NSg/C/P ISg/#r+ NSg/VPt/J VB/J VB/C Nᴹ/Vg/J NSg/VB/J/P . NPl+ > looked hastily through the unlocked parts of his desk — he’d never told me # VP/J R NSg/J/P D VP/J NPl/V3 P ISg/D$+ NSg/VB+ . K R VP NPr/ISg+ > definitely that his parents were dead . But there was nothing — only the picture of # R NSg/I/C/Ddem ISg/D$+ NPl/V3+ NSg/VLPt NSg/VB/J . NSg/C/P R+ VLPt NSg/I/J+ . J/R/C D NSg/VB P > Dan Cody , a token of forgotten violence , staring down from the wall . # NPr+ NPr . D/P NSg/VB/J P NSg/VPp/J Nᴹ/VB+ . Nᴹ/Vg/J N🅪Sg/VB/J/P P D NPr/VB+ . > # > Next morning I sent the butler to New York with a letter to Wolfshiem , which # NSg/J/P+ N🅪Sg/Vg/J+ ISg/#r+ NSg/VP D NPr/VB P NSg/J NPr+ P D/P NSg/VB+ P ? . I/C+ > asked for information and urged him to come out on the next train . That request # VP/J R/C/P Nᴹ+ VB/C VP/J ISg+ P NSg/VBPp/P NSg/VB/J/R/P J/P D NSg/J/P NSg/VB+ . NSg/I/C/Ddem+ NSg/VB+ > seemed superfluous when I wrote it . I was sure he’d start when he saw the # VP/J J NSg/I/C ISg/#r+ VPt NPr/ISg+ . ISg/#r+ VLPt J K NSg/VB NSg/I/C NPr/ISg+ NSg/VPt D > newspapers , just as I was sure there’d be a wire from Daisy before noon — but # NPl/V3+ . J/R R/C/P ISg/#r+ VLPt J K NSg/VLXB D/P N🅪Sg/VB+ P NPr+ C/P NSg/VB+ . NSg/C/P > neither a wire nor Mr . Wolfshiem arrived ; no one arrived except more police and # I/C D/P N🅪Sg/VB+ NSg/C NSg+ . ? VP/J . NSg/Dq/P NSg/I/J+ VP/J VB/C/P NPr/I/J/R/Dq Nᴹ/VB VB/C > photographers and newspaper men . When the butler brought back Wolfshiem’s answer # NPl VB/C N🅪Sg/VB+ NPl+ . NSg/I/C D NPr/VB VP NSg/VB/J ? NSg/VB+ > I began to have a feeling of defiance , of scornful solidarity between Gatsby and # ISg/#r+ VPt P NSg/VXB D/P N🅪Sg/Vg/J P NSg/VB+ . P J NSg+ NSg/P NPr VB/C > me against them all . # NPr/ISg+ C/P NSg/IPl+ NSg/I/J/C/Dq . > # > Dear Mr . Carraway . This has been one of the most terrible shocks of my life to # NSg/VB/J+ NSg+ . ? . I/Ddem+ V3 NSg/VLPp NSg/I/J P D NSg/I/J/R/Dq J NPl P D$+ N🅪Sg/VB+ P > me I hardly can believe it that it is true at all . Such a mad act as that man # NPr/ISg+ ISg/#r+ R NPr/VXB VB NPr/ISg+ NSg/I/C/Ddem NPr/ISg+ VL3 NSg/VB/J NSg/P NSg/I/J/C/Dq . NSg/I D/P NSg/VB/J NPr/VB+ R/C/P NSg/I/C/Ddem NPr/VB/J+ > did should make us all think . I cannot come down now as I am tied up in some # VXPt VXB NSg/VB NPr/IPl+ NSg/I/J/C/Dq+ NSg/VB+ . ISg/#r+ NSg/VXB NSg/VBPp/P N🅪Sg/VB/J/P NSg/J/R/C R/C/P ISg/#r+ NPr/VLB/J VP/J NSg/VB/J/P NPr/J/R/P I/J/R/Dq > very important business and cannot get mixed up in this thing now . If there is # J/R J N🅪Sg/J+ VB/C NSg/VXB NSg/VB VP/J NSg/VB/J/P NPr/J/R/P I/Ddem NSg+ NSg/J/R/C . NSg/C R+ VL3 > anything I can do a little later let me know in a letter by Edgar . I hardly know # NSg/I/VB+ ISg/#r+ NPr/VXB VXB D/P NPr/I/J/Dq JC NSg/VBP NPr/ISg+ VB NPr/J/R/P D/P NSg/VB+ NSg/P NPr+ . ISg/#r+ R VB > where I am when I hear about a thing like this and am completely knocked down # NSg/R/C ISg/#r+ NPr/VLB/J NSg/I/C ISg/#r+ VB J/P D/P+ NSg+ NSg/VB/J/C/P I/Ddem+ VB/C NPr/VLB/J R VP/J N🅪Sg/VB/J/P > and out . # VB/C NSg/VB/J/R/P . > # > Yours truly # I+ J/R > # > Meyer Wolfshiem # NPr ? > # > and then hasty addenda beneath : # VB/C NSg/J/R/C J NPl P . > # > Let me know about the funeral etc do not know his family at all . # NSg/VBP NPr/ISg+ VB J/P D+ NSg/J+ ? VXB NSg/R/C VB ISg/D$+ N🅪Sg/J+ NSg/P NSg/I/J/C/Dq . > # > When the phone rang that afternoon and Long Distance said Chicago was calling I # NSg/I/C D+ NSg/VB+ VPt NSg/I/C/Ddem N🅪Sg VB/C NPr/VB/J+ N🅪Sg/VB+ VP/J NPr+ VLPt Nᴹ/Vg/J ISg/#r+ > thought this would be Daisy at last . But the connection came through as a man’s # N🅪Sg/VP I/Ddem+ VXB NSg/VLXB NPr+ NSg/P NSg/VB/J . NSg/C/P D+ N🅪Sg+ NSg/VPt/P NSg/J/P R/C/P D/P NPr$/I/VB/J > voice , very thin and far away . # NSg/VB+ . J/R NSg/VB/J VB/C NSg/VB/J VB/J . > # > “ This is Slagle speaking . . . ” # . I/Ddem+ VL3 ? Nᴹ/Vg/J . . . . > # > “ Yes ? ” The name was unfamiliar . # . NPl/VB . . D+ NSg/VB+ VLPt NSg/J . > # > “ Hell of a note , isn’t it ? Get my wire ? ” # . NPr/VB P D/P+ NSg/VB+ . NSg/VX3 NPr/ISg+ . NSg/VB D$+ N🅪Sg/VB+ . . > # > “ There haven’t been any wires . ” # . R+ VXB NSg/VLPp I/R/Dq NPl/V3+ . . > # > “ Young Parke’s in trouble , ” he said rapidly . “ They picked him up when he handed # . NPr/VB/J ? NPr/J/R/P N🅪Sg/VB+ . . NPr/ISg+ VP/J R . . IPl+ VP/J ISg+ NSg/VB/J/P NSg/I/C NPr/ISg+ VP/J > the bonds over the counter . They got a circular from New York giving ’ em the # D+ NPl/V3+ NSg/J/P D+ NSg/VB/J+ . IPl+ VP D/P NSg/VB/J P NSg/J+ NPr+ Nᴹ/Vg/J . NSg/I/J+ D+ > numbers just five minutes before . What d’you know about that , hey ? You never can # NPrPl/V3+ J/R NSg+ NPl/V3+ C/P . NSg/I+ ? VB J/P NSg/I/C/Ddem+ . NSg . ISgPl+ R NPr/VXB > tell in these hick towns — — — ” # NPr/VB NPr/J/R/P I/Ddem NSg/VB NPl+ . . . . > # > “ Hello ! ” I interrupted breathlessly . “ Look here — this isn’t Mr . Gatsby . Mr . # . NSg/VB . . ISg/#r+ VP/J R . . NSg/VB J/R . I/Ddem NSg/VX3 NSg+ . NPr . NSg+ . > Gatsby’s dead . ” # NPr$ NSg/VB/J . . > # > There was a long silence on the other end of the wire , followed by an # R+ VLPt D/P NPr/VB/J NSg/VB+ J/P D NSg/VB/J NSg/VB P D+ N🅪Sg/VB+ . VP/J NSg/P D/P+ > exclamation . . . then a quick squawk as the connection was broken . # NSg+ . . . NSg/J/R/C D/P+ NSg/VB/J NSg/VB+ R/C/P D+ N🅪Sg+ VLPt VPp/J . > # > I think it was on the third day that a telegram signed Henry C. Gatz arrived # ISg/#r+ NSg/VB NPr/ISg+ VLPt J/P D NSg/VB/J NPr🅪Sg NSg/I/C/Ddem D/P+ NSg/VB+ VP/J NPr+ ? ? VP/J > from a town in Minnesota . It said only that the sender was leaving immediately # P D/P NSg+ NPr/J/R/P NPr+ . NPr/ISg+ VP/J J/R/C NSg/I/C/Ddem D+ NSg+ VLPt Nᴹ/Vg/J R > and to postpone the funeral until he came . # VB/C P VB D+ NSg/J+ C/P NPr/ISg+ NSg/VPt/P . > # > It was Gatsby’s father , a solemn old man , very helpless and dismayed , bundled up # NPr/ISg+ VLPt NPr$ NPr/VB+ . D/P J NSg/J NPr/VB/J+ . J/R J VB/C VP/J . VP/J NSg/VB/J/P > in a long cheap ulster against the warm September day . His eyes leaked # NPr/J/R/P D/P NPr/VB/J NSg/VB/J NPr+ C/P D NSg/VB/J NPr+ NPr🅪Sg+ . ISg/D$+ NPl/V3+ VP/J > continuously with excitement , and when I took the bag and umbrella from his # R P NSg+ . VB/C NSg/I/C ISg/#r+ VPt D NSg/VB VB/C NSg/VB+ P ISg/D$+ > hands he began to pull so incessantly at his sparse gray beard that I had # NPl/V3+ NPr/ISg+ VPt P NSg/VB NSg/I/J/R/C R NSg/P ISg/D$+ VB/J NPr🅪Sg/VB/J/Am+ NPr/VB+ NSg/I/C/Ddem+ ISg/#r+ VP > difficulty in getting off his coat . He was on the point of collapse , so I took # N🅪Sg+ NPr/J/R/P NSg/Vg+ NSg/VB/J/P ISg/D$+ NSg/VB+ . NPr/ISg+ VLPt J/P D NSg/VB P N🅪Sg/VB+ . NSg/I/J/R/C ISg/#r+ VPt > him into the music room and made him sit down while I sent for something to eat . # ISg+ P D+ N🅪Sg/VB/J+ N🅪Sg/VB/J+ VB/C VP ISg+ NSg/VB N🅪Sg/VB/J/P NSg/VB/C/P ISg/#r+ NSg/VP R/C/P NSg/I/J+ P VB . > But he wouldn’t eat , and the glass of milk spilled from his trembling hand . # NSg/C/P NPr/ISg+ VXB VB . VB/C D NPr🅪Sg/VB P N🅪Sg/VB+ VP/J P ISg/D$+ Nᴹ/Vg/J NSg/VB+ . > # > “ I saw it in the Chicago newspaper , ” he said . “ It was all in the Chicago # . ISg/#r+ NSg/VPt NPr/ISg+ NPr/J/R/P D+ NPr+ N🅪Sg/VB+ . . NPr/ISg+ VP/J . . NPr/ISg+ VLPt NSg/I/J/C/Dq NPr/J/R/P D+ NPr+ > newspaper . I started right away . ” # N🅪Sg/VB+ . ISg/#r+ VP/J NPr/VB/J VB/J . . > # > “ I didn’t know how to reach you . ” # . ISg/#r+ VXPt VB NSg/C P NSg/VB ISgPl+ . . > # > His eyes , seeing nothing , moved ceaselessly about the room . # ISg/D$+ NPl/V3+ . NSg/Vg/J/C NSg/I/J+ . VP/J R J/P D+ N🅪Sg/VB/J+ . > # > “ It was a madman , ” he said . “ He must have been mad . ” # . NPr/ISg+ VLPt D/P NSg . . NPr/ISg+ VP/J . . NPr/ISg+ NSg/VXB NSg/VXB NSg/VLPp NSg/VB/J . . > # > “ Wouldn’t you like some coffee ? ” I urged him . # . VXB ISgPl+ NSg/VB/J/C/P I/J/R/Dq N🅪Sg/VB/J+ . . ISg/#r+ VP/J ISg+ . > # > “ I don’t want anything . I’m all right now , Mr — — — ” # . ISg/#r+ VXB NSg/VB NSg/I/VB+ . K NSg/I/J/C/Dq NPr/VB/J NSg/J/R/C . NSg+ . . . . > # > “ Carraway . ” # . ? . . > # > “ Well , I’m all right now . Where have they got Jimmy ? ” # . NSg/VB/J/R . K NSg/I/J/C/Dq NPr/VB/J NSg/J/R/C . NSg/R/C NSg/VXB IPl+ VP NPr/VB+ . . > # > I took him into the drawing - room , where his son lay , and left him there . Some # ISg/#r+ VPt ISg+ P D N🅪Sg/Vg/J+ . N🅪Sg/VB/J+ . NSg/R/C ISg/D$+ NPr/VB+ NSg/VBPt/J . VB/C NPr/VP/J ISg+ R . I/J/R/Dq+ > little boys had come up on the steps and were looking into the hall ; when I told # NPr/I/J/Dq+ NPl/V3+ VP NSg/VBPp/P NSg/VB/J/P J/P D+ NPl/V3+ VB/C NSg/VLPt Nᴹ/Vg/J P D+ NPr+ . NSg/I/C ISg/#r+ VP > them who had arrived , they went reluctantly away . # NSg/IPl+ NPr/I+ VP VP/J . IPl+ NSg/VPt R VB/J . > # > After a little while Mr . Gatz opened the door and came out , his mouth ajar , his # P D/P NPr/I/J/Dq NSg/VB/C/P NSg+ . ? VP/J D NSg/VB+ VB/C NSg/VPt/P NSg/VB/J/R/P . ISg/D$+ NSg/VB+ VB/J . ISg/D$+ > face flushed slightly , his eyes leaking isolated and unpunctual tears . He had # NSg/VB+ VP/J R . ISg/D$+ NPl/V3+ Nᴹ/Vg/J VP/J VB/C ? NPl/V3+ . NPr/ISg+ VP > reached an age where death no longer has the quality of ghastly surprise , and # VP/J D/P+ N🅪Sg/VB+ NSg/R/C NPr🅪Sg NSg/Dq/P NSg/JC V3 D N🅪Sg/J P J NSg/VB+ . VB/C > when he looked around him now for the first time and saw the height and splendor # NSg/I/C NPr/ISg+ VP/J J/P ISg+ NSg/J/R/C R/C/P D NSg/J N🅪Sg/VB/J+ VB/C NSg/VPt D N🅪Sg+ VB/C NSg/Am > of the hall and the great rooms opening out from it into other rooms , his grief # P D NPr+ VB/C D NSg/J NPl/V3+ Nᴹ/Vg/J NSg/VB/J/R/P P NPr/ISg+ P NSg/VB/J NPl/V3+ . ISg/D$+ Nᴹ/VB+ > began to be mixed with an awed pride . I helped him to a bedroom up - stairs ; while # VPt P NSg/VLXB VP/J P D/P VP/J Nᴹ/VB+ . ISg/#r+ VP/J ISg+ P D/P+ NSg+ NSg/VB/J/P . NPl+ . NSg/VB/C/P > he took off his coat and vest I told him that all arrangements had been deferred # NPr/ISg+ VPt NSg/VB/J/P ISg/D$+ NSg/VB+ VB/C NSg/VB ISg/#r+ VP ISg+ NSg/I/C/Ddem NSg/I/J/C/Dq NPl+ VP NSg/VLPp NSg/VP/J > until he came . # C/P NPr/ISg+ NSg/VPt/P . > # > “ I didn’t know what you’d want , Mr . Gatsby — — — ” # . ISg/#r+ VXPt VB NSg/I+ K NSg/VB . NSg+ . NPr . . . . > # > “ Gatz is my name . ” # . ? VL3 D$+ NSg/VB+ . . > # > “ — Mr . Gatz . I thought you might want to take the body West . ” # . . NSg+ . ? . ISg/#r+ N🅪Sg/VP ISgPl+ Nᴹ/VXB/J NSg/VB P NSg/VB D+ NSg/VB+ NPr/VB/J+ . . > # > He shook his head . # NPr/ISg+ NSg/VPt/J ISg/D$+ NPr/VB/J+ . > # > “ Jimmy always liked it better down East . He rose up to his position in the East . # . NPr/VB+ R VP/J NPr/ISg+ NSg/VXB/JC N🅪Sg/VB/J/P NPr/J+ . NPr/ISg+ NPr/VPt/J NSg/VB/J/P P ISg/D$+ NSg/VB+ NPr/J/R/P D+ NPr/J+ . > Were you a friend of my boy’s , Mr . — — — ? ” # NSg/VLPt ISgPl+ D/P NPr/VB/J P D$+ NSg$ . NSg+ . . . . . . > # > “ We were close friends . ” # . IPl+ NSg/VLPt NSg/VB/J NPrPl/V3+ . . > # > “ He had a big future before him , you know . He was only a young man , but he had a # . NPr/ISg+ VP D/P+ NSg/J+ NSg/J+ C/P ISg+ . ISgPl+ VB . NPr/ISg+ VLPt J/R/C D/P NPr/VB/J NPr/VB/J . NSg/C/P NPr/ISg+ VP D/P > lot of brain power here . ” # NPr/VB P NPr🅪Sg/VB+ N🅪Sg/VB/J+ J/R . . > # > He touched his head impressively , and I nodded . # NPr/ISg+ VP/J ISg/D$+ NPr/VB/J+ R . VB/C ISg/#r+ VP . > # > “ If he’d of lived , he’d of been a great man . A man like James J. Hill . He’d of # . NSg/C K P VP/J+ . K P NSg/VLPp D/P NSg/J NPr/VB/J+ . D/P NPr/VB/J NSg/VB/J/C/P NPrPl+ ? NPr/VB+ . K P > helped build up the country . ” # VP/J NSg/VB NSg/VB/J/P D NSg/J+ . . > # > “ That’s true , ” I said , uncomfortably . # . NSg$ NSg/VB/J . . ISg/#r+ VP/J . R . > # > He fumbled at the embroidered coverlet , trying to take it from the bed , and lay # NPr/ISg+ VP/J NSg/P D VP/J NSg . Nᴹ/Vg/J P NSg/VB NPr/ISg+ P D NSg/VBP/J+ . VB/C NSg/VBPt/J > down stiffly — was instantly asleep . # N🅪Sg/VB/J/P R . VLPt R J . > # > That night an obviously frightened person called up , and demanded to know who I # NSg/I/C/Ddem+ N🅪Sg/VB+ D/P R VP/J NSg/VB+ VP/J NSg/VB/J/P . VB/C VP/J P VB NPr/I+ ISg/#r+ > was before he would give his name . # VLPt C/P NPr/ISg+ VXB NSg/VB ISg/D$+ NSg/VB+ . > # > “ This is Mr . Carraway , ” I said . # . I/Ddem+ VL3 NSg+ . ? . . ISg/#r+ VP/J . > # > “ Oh ! ” He sounded relieved . “ This is Klipspringer . ” # . NPr/VB . . NPr/ISg+ VP/J VP/J . . I/Ddem+ VL3 ? . . > # > I was relieved too , for that seemed to promise another friend at Gatsby’s grave . # ISg/#r+ VLPt VP/J R . R/C/P NSg/I/C/Ddem+ VP/J P NSg/VB I/D+ NPr/VB/J+ NSg/P NPr$ NSg/VB/J+ . > I didn’t want it to be in the papers and draw a sightseeing crowd , so I’d been # ISg/#r+ VXPt NSg/VB NPr/ISg+ P NSg/VLXB NPr/J/R/P D NPl/V3+ VB/C NSg/VB D/P NSg/Vg+ NSg/VB+ . NSg/I/J/R/C K NSg/VLPp > calling up a few people myself . They were hard to find . # Nᴹ/Vg/J NSg/VB/J/P D/P NSg/I/Dq NPl/VB+ ISg+ . IPl+ NSg/VLPt N🅪Sg/J/R P NSg/VB . > # > “ The funeral’s to - morrow , ” I said . “ Three o’clock , here at the house . I wish # . D NSg$ P . NPr/VB . . ISg/#r+ VP/J . . NSg R . J/R NSg/P D+ NPr/VB+ . ISg/#r+ NSg/VB > you’d tell anybody who’d be interested . ” # K NPr/VB NSg/I+ K NSg/VLXB VP/J . . > # > “ Oh , I will , ” he broke out hastily . “ Of course I’m not likely to see anybody , # . NPr/VB . ISg/#r+ NPr/VXB . . NPr/ISg+ NSg/VPt/J NSg/VB/J/R/P R . . P NSg/VB+ K NSg/R/C NSg/J P NSg/VB NSg/I+ . > but if I do . ” # NSg/C/P NSg/C ISg/#r+ VXB . . > # > His tone made me suspicious . # ISg/D$+ N🅪Sg/I/VB+ VP NPr/ISg+ J . > # > “ Of course you’ll be there yourself . ” # . P NSg/VB+ K NSg/VLXB R+ ISg+ . . > # > “ Well , I’ll certainly try . What I called up about is — — — ” # . NSg/VB/J/R . K R NSg/VB/J . NSg/I+ ISg/#r+ VP/J NSg/VB/J/P J/P VL3 . . . . > # > “ Wait a minute , ” I interrupted . “ How about saying you’ll come ? ” # . NSg/VB D/P+ NSg/VB/J+ . . ISg/#r+ VP/J . . NSg/C J/P N🅪Sg/Vg/J K NSg/VBPp/P . . > # > “ Well , the fact is — the truth of the matter is that I’m staying with some people # . NSg/VB/J/R . D+ NSg+ VL3 . D N🅪Sg/VB P D+ N🅪Sg/VB+ VL3 NSg/I/C/Ddem+ K Nᴹ/Vg/J P I/J/R/Dq NPl/VB+ > up here in Greenwich , and they rather expect me to be with them tomorrow . In # NSg/VB/J/P J/R NPr/J/R/P NPr+ . VB/C IPl+ NPr/VB/J/R VB NPr/ISg+ P NSg/VLXB P NSg/IPl+ NSg+ . NPr/J/R/P > fact , there’s a sort of picnic or something . Of course I’ll do my very best to # NSg+ . K D/P NSg/VB P NSg/VB+ NPr/C NSg/I/J+ . P NSg/VB+ K VXB D$+ J/R NPr/VXB/JS P > get away . ” # NSg/VB VB/J . . > # > I ejaculated an unrestrained “ Huh ! ” and he must have heard me , for he went on # ISg/#r+ VP/J D/P VP/J . W? . . VB/C NPr/ISg+ NSg/VXB NSg/VXB VP/J NPr/ISg+ . R/C/P NPr/ISg+ NSg/VPt J/P > nervously : # R . > # > “ What I called up about was a pair of shoes I left there . I wonder if it’d be # . NSg/I+ ISg/#r+ VP/J NSg/VB/J/P J/P VLPt D/P NSg/VB P NPl/V3+ ISg/#r+ NPr/VP/J R . ISg/#r+ N🅪Sg/VB NSg/C K NSg/VLXB > too much trouble to have the butler send them on . You see , they’re tennis shoes , # R NSg/I/J/R/Dq N🅪Sg/VB+ P NSg/VXB D NPr/VB NSg/VB NSg/IPl+ J/P . ISgPl+ NSg/VB . K NSg/VB+ NPl/V3+ . > and I’m sort of helpless without them . My address is care of B. F. — — — ” # VB/C K NSg/VB P J C/P NSg/IPl+ . D$+ NSg/VB+ VL3 N🅪Sg/VB P ? ? . . . . > # > I didn’t hear the rest of the name , because I hung up the receiver . # ISg/#r+ VXPt VB D NSg/VB P D NSg/VB+ . C/P ISg/#r+ NPr/VP/J NSg/VB/J/P D NSg+ . > # > After that I felt a certain shame for Gatsby — one gentleman to whom I telephoned # P NSg/I/C/Ddem ISg/#r+ N🅪Sg/VP/J D/P+ I/J+ N🅪Sg/VB/J+ R/C/P NPr . NSg/I/J NSg/J+ P I+ ISg/#r+ VP/J > implied that he had got what he deserved . However , that was my fault , for he was # VP/J NSg/I/C/Ddem NPr/ISg+ VP VP NSg/I+ NPr/ISg+ VP/J . C . NSg/I/C/Ddem+ VLPt D$+ NSg/VB+ . R/C/P NPr/ISg+ VLPt > one of those who used to sneer most bitterly at Gatsby on the courage of # NSg/I/J P I/Ddem NPr/I+ VP/J P NSg/VB NSg/I/J/R/Dq R NSg/P NPr J/P D NSg/VB P > Gatsby’s liquor , and I should have known better than to call him . # NPr$ N🅪Sg/VB+ . VB/C ISg/#r+ VXB NSg/VXB VPp/J NSg/VXB/JC C/P P NSg/VB ISg+ . > # > The morning of the funeral I went up to New York to see Meyer Wolfshiem ; I # D N🅪Sg/Vg/J P D+ NSg/J+ ISg/#r+ NSg/VPt NSg/VB/J/P P NSg/J+ NPr+ P NSg/VB NPr ? . ISg/#r+ > couldn’t seem to reach him any other way . The door that I pushed open , on the # VXB VB P NSg/VB ISg+ I/R/Dq NSg/VB/J NSg/J+ . D+ NSg/VB+ NSg/I/C/Ddem+ ISg/#r+ VP/J NSg/VB/J . J/P D > advice of an elevator boy , was marked “ The Swastika Holding Company , ” and at # Nᴹ P D/P+ NSg/VB+ NSg/VB+ . VLPt VP/J . D NSg Nᴹ/Vg/J N🅪Sg+ . . VB/C NSg/P > first there didn’t seem to be any one inside . But when I’d shouted “ hello ” # NSg/J R+ VXPt VB P NSg/VLXB I/R/Dq NSg/I/J+ NSg/J/P . NSg/C/P NSg/I/C K VP/J . NSg/VB . > several times in vain , an argument broke out behind a partition , and presently a # J/Dq NPl/V3+ NPr/J/R/P VB/J . D/P N🅪Sg/VB+ NSg/VPt/J NSg/VB/J/R/P NSg/J/P D/P N🅪Sg/VB+ . VB/C R D/P > lovely Jewess appeared at an interior door and scrutinized me with black hostile # NSg/J NSg VP/J NSg/P D/P NSg/J NSg/VB+ VB/C VP/J NPr/ISg+ P N🅪Sg/VB/J NSg/J > eyes . # NPl/V3+ . > # > “ Nobody’s in , ” she said . “ Mr . Wolfshiem’s gone to Chicago . ” # . NSg$ NPr/J/R/P . . ISg+ VP/J . . NSg+ . ? VPp/J/P P NPr+ . . > # > The first part of this was obviously untrue , for some one had begun to whistle # D NSg/J NSg/VB/J P I/Ddem+ VLPt R J . R/C/P I/J/R/Dq+ NSg/I/J+ VP VPp P NSg/VB > “ The Rosary , ” tunelessly , inside . # . D NSg . . R . NSg/J/P . > # > “ Please say that Mr . Carraway wants to see him . ” # . VB NSg/VB NSg/I/C/Ddem+ NSg+ . ? NPl/V3 P NSg/VB ISg+ . . > # > “ I can’t get him back from Chicago , can I ? ” # . ISg/#r+ VXB NSg/VB ISg+ NSg/VB/J P NPr+ . NPr/VXB ISg/#r+ . . > # > At this moment a voice , unmistakably Wolfshiem’s , called “ Stella ! ” from the # NSg/P I/Ddem+ NSg+ D/P+ NSg/VB+ . R ? . VP/J . NPr+ . . P D > other side of the door . # NSg/VB/J NSg/VB/J P D+ NSg/VB+ . > # > “ Leave your name on the desk , ” she said quickly . “ I’ll give it to him when he # . NSg/VB D$+ NSg/VB+ J/P D+ NSg/VB+ . . ISg+ VP/J R . . K NSg/VB NPr/ISg+ P ISg+ NSg/I/C NPr/ISg+ > gets back . ” # NPl/V3 NSg/VB/J . . > # > “ But I know he’s there . ” # . NSg/C/P ISg/#r+ VB NPr$ R . . > # > She took a step toward me and began to slide her hands indignantly up and down # ISg+ VPt D/P+ NSg/VB+ J/P NPr/ISg+ VB/C VPt P NSg/VB ISg/D$+ NPl/V3+ R NSg/VB/J/P VB/C N🅪Sg/VB/J/P > her hips . # ISg/D$+ NPl/V3+ . > # > “ You young men think you can force your way in here any time , ” she scolded . # . ISgPl+ NPr/VB/J+ NPl+ NSg/VB ISgPl+ NPr/VXB N🅪Sg/VB D$+ NSg/J+ NPr/J/R/P J/R I/R/Dq+ N🅪Sg/VB/J+ . . ISg+ VP/J . > “ We’re getting sick in tired of it . When I say he’s in Chicago , he’s in # . K NSg/Vg NSg/VB/J NPr/J/R/P VP/J P NPr/ISg+ . NSg/I/C ISg/#r+ NSg/VB NPr$ NPr/J/R/P NPr+ . NPr$ NPr/J/R/P > Chicago . ” # NPr+ . . > # > I mentioned Gatsby . # ISg/#r+ VP/J NPr . > # > “ Oh - h ! ” She looked at me over again . ‘ ‘ Will you just — What was your name ? ” # . NPr/VB . NSg/J+ . . ISg+ VP/J NSg/P NPr/ISg+ NSg/J/P P . Unlintable Unlintable NPr/VXB ISgPl+ J/R . NSg/I+ VLPt D$+ NSg/VB+ . . > # > She vanished . In a moment Meyer Wolfsheim stood solemnly in the doorway , holding # ISg+ VP/J . NPr/J/R/P D/P+ NSg+ NPr ? VP R NPr/J/R/P D NSg+ . Nᴹ/Vg/J > out both hands . He drew me into his office , remarking in a reverent voice that # NSg/VB/J/R/P I/C/Dq NPl/V3+ . NPr/ISg+ NPr/VPt NPr/ISg+ P ISg/D$+ NSg/VB+ . Nᴹ/Vg/J NPr/J/R/P D/P J NSg/VB+ NSg/I/C/Ddem+ > it was a sad time for all of us , and offered me a cigar . # NPr/ISg+ VLPt D/P NSg/VB/J N🅪Sg/VB/J+ R/C/P NSg/I/J/C/Dq P NPr/IPl+ . VB/C VP/J NPr/ISg+ D/P NSg+ . > # > “ My memory goes back to when first I met him , ” he said . “ A young major just out # . D$+ N🅪Sg+ NPl/V3 NSg/VB/J P NSg/I/C NSg/J ISg/#r+ VP ISg+ . . NPr/ISg+ VP/J . . D/P NPr/VB/J NPr/VB/J J/R NSg/VB/J/R/P > of the army and covered over with medals he got in the war . He was so hard up he # P D+ NSg+ VB/C VP/J NSg/J/P P NPl/V3+ NPr/ISg+ VP NPr/J/R/P D+ N🅪Sg/VB+ . NPr/ISg+ VLPt NSg/I/J/R/C N🅪Sg/J/R NSg/VB/J/P NPr/ISg+ > had to keep on wearing his uniform because he couldn’t buy some regular clothes . # VP P NSg/VB J/P Nᴹ/Vg/J ISg/D$+ NSg/VB/J C/P NPr/ISg+ VXB NSg/VB I/J/R/Dq NSg/J NPl/V3+ . > First time I saw him was when he come into Winebrenner’s poolroom at Forty - third # NSg/J+ N🅪Sg/VB/J+ ISg/#r+ NSg/VPt ISg+ VLPt NSg/I/C NPr/ISg+ NSg/VBPp/P P ? NSg NSg/P NSg/J . NSg/VB/J > Street and asked for a job . He hadn’t eat anything for a couple of days . ‘ Come # NSg/VB/J+ VB/C VP/J R/C/P D/P NPr/VB+ . NPr/ISg+ VPt VB NSg/I/VB+ R/C/P D/P NSg/VB/J P NPl+ . Unlintable NSg/VBPp/P > on have some lunch with me , ’ I sid . He ate more than four dollars ’ worth of food # J/P NSg/VXB I/J/R/Dq+ N🅪Sg/VB+ P NPr/ISg+ . . ISg/#r+ NPr . NPr/ISg+ NSg/VPt NPr/I/J/R/Dq C/P NSg NPl+ . NSg/VB/J P NSg > in half an hour . ” # NPr/J/R/P N🅪Sg/J/P+ D/P+ NSg+ . . > # > “ Did you start him in business ? ” I inquired . # . VXPt ISgPl+ NSg/VB ISg+ NPr/J/R/P N🅪Sg/J+ . . ISg/#r+ VP/J . > # > “ Start him ! I made him . ” # . NSg/VB ISg+ . ISg/#r+ VP ISg+ . . > # > “ Oh . ” # . NPr/VB . . > # > “ I raised him up out of nothing , right out of the gutter . I saw right away he # . ISg/#r+ VP/J ISg+ NSg/VB/J/P NSg/VB/J/R/P P NSg/I/J+ . NPr/VB/J NSg/VB/J/R/P P D NSg/VB . ISg/#r+ NSg/VPt NPr/VB/J VB/J NPr/ISg+ > was a fine - appearing , gentlemanly young man , and when he told me he was an # VLPt D/P NSg/VB/J . Nᴹ/Vg/J . J/R+ NPr/VB/J+ NPr/VB/J+ . VB/C NSg/I/C NPr/ISg+ VP NPr/ISg+ NPr/ISg+ VLPt D/P > Oggsford I knew I could use him good . I got him to join up in the American # ? ISg/#r+ VPt ISg/#r+ NSg/VXB N🅪Sg/VB ISg+ NPr/VB/J . ISg/#r+ VP ISg+ P NSg/VB NSg/VB/J/P NPr/J/R/P D+ NPr/J+ > Legion and he used to stand high there . Right off he did some work for a client # NSg/VB/J+ VB/C NPr/ISg+ VP/J P NSg/VB NSg/VB/J/R R . NPr/VB/J NSg/VB/J/P NPr/ISg+ VXPt I/J/R/Dq N🅪Sg/VB R/C/P D/P NSg > of mine up to Albany . We were so thick like that in everything ” — he held up two # P NSg/I/VB+ NSg/VB/J/P P NPr . IPl+ NSg/VLPt NSg/I/J/R/C NSg/VB/J NSg/VB/J/C/P NSg/I/C/Ddem+ NPr/J/R/P NSg/I/VB+ . . NPr/ISg+ VP NSg/VB/J/P NSg+ > bulbous fingers — “ always together . ” # J+ NPl/V3+ . . R J . . > # > I wondered if this partnership had included the World’s Series transaction # ISg/#r+ VP/J NSg/C I/Ddem+ N🅪Sg+ VP VP/J D NSg$ NSgPl+ NSg+ > in 1919 . # NPr/J/R/P # . > # > “ Now he’s dead , ” I said after a moment . “ You were his closest friend , so I know # . NSg/J/R/C NPr$ NSg/VB/J . . ISg/#r+ VP/J P D/P NSg+ . . ISgPl+ NSg/VLPt ISg/D$+ JS+ NPr/VB/J+ . NSg/I/J/R/C ISg/#r+ VB > you'll want to come to his funeral this afternoon . ” # K NSg/VB P NSg/VBPp/P P ISg/D$+ NSg/J I/Ddem N🅪Sg+ . . > # > “ I’d like to come . ” # . K NSg/VB/J/C/P P NSg/VBPp/P . . > # > “ Well , come then . ” # . NSg/VB/J/R . NSg/VBPp/P NSg/J/R/C . . > # > The hair in his nostrils quivered slightly , and as he shook his head his eyes # D+ N🅪Sg/VB+ NPr/J/R/P ISg/D$+ NPl+ VP/J R . VB/C R/C/P NPr/ISg+ NSg/VPt/J ISg/D$+ NPr/VB/J+ ISg/D$+ NPl/V3+ > filled with tears . # VP/J P NPl/V3+ . > # > “ I can’t do it — I can’t get mixed up in it , ” he said . # . ISg/#r+ VXB VXB NPr/ISg+ . ISg/#r+ VXB NSg/VB VP/J NSg/VB/J/P NPr/J/R/P NPr/ISg+ . . NPr/ISg+ VP/J . > # > “ There’s nothing to get mixed up in . It’s all over now . ” # . K NSg/I/J+ P NSg/VB VP/J NSg/VB/J/P NPr/J/R/P . K NSg/I/J/C/Dq NSg/J/P NSg/J/R/C . . > # > “ When a man gets killed I never like to get mixed up in it in any way . I keep # . NSg/I/C D/P+ NPr/VB/J+ NPl/V3 VP/J ISg/#r+ R NSg/VB/J/C/P P NSg/VB VP/J NSg/VB/J/P NPr/J/R/P NPr/ISg+ NPr/J/R/P I/R/Dq+ NSg/J+ . ISg/#r+ NSg/VB > out . When I was a young man it was different — if a friend of mine died , no matter # NSg/VB/J/R/P . NSg/I/C ISg/#r+ VLPt D/P NPr/VB/J NPr/VB/J NPr/ISg+ VLPt NSg/J . NSg/C D/P NPr/VB/J P NSg/I/VB+ VP/J . NSg/Dq/P+ N🅪Sg/VB+ > how , I stuck with them to the end . You may think that’s sentimental , but I mean # NSg/C . ISg/#r+ NSg/VB/J P NSg/IPl+ P D+ NSg/VB+ . ISgPl+ NPr/VXB NSg/VB NSg$ J . NSg/C/P ISg/#r+ NSg/VB/J > it — to the bitter end . ” # NPr/ISg+ . P D NSg/VB/J NSg/VB+ . . > # > I saw that for some reason of his own he was determined not to come , so I stood # ISg/#r+ NSg/VPt NSg/I/C/Ddem R/C/P I/J/R/Dq N🅪Sg/VB P ISg/D$+ NSg/VB/J NPr/ISg+ VLPt VP/J NSg/R/C P NSg/VBPp/P . NSg/I/J/R/C ISg/#r+ VP > up . # NSg/VB/J/P . > # > “ Are you a college man ? ” he inquired suddenly . # . VLB ISgPl+ D/P+ NSg+ NPr/VB/J+ . . NPr/ISg+ VP/J R . > # > For a moment I thought he was going to suggest a “ gonnegtion , ” but he only # R/C/P D/P+ NSg+ ISg/#r+ N🅪Sg/VP NPr/ISg+ VLPt Nᴹ/Vg/J P VB D/P . ? . . NSg/C/P NPr/ISg+ J/R/C > nodded and shook my hand . # VP VB/C NSg/VPt/J D$+ NSg/VB+ . > # > “ Let us learn to show our friendship for a man when he is alive and not after he # . NSg/VBP NPr/IPl+ NSg/VB P NSg/VB D$+ N🅪Sg R/C/P D/P+ NPr/VB/J+ NSg/I/C NPr/ISg+ VL3 J VB/C NSg/R/C P NPr/ISg+ > is dead , ” he suggested . “ After that my own rule is to let everything alone . ” # VL3 NSg/VB/J . . NPr/ISg+ VP/J . . P NSg/I/C/Ddem D$+ NSg/VB/J+ NSg/VB+ VL3 P NSg/VBP NSg/I/VB+ J . . > # > When I left his office the sky had turned dark and I got back to West Egg in a # NSg/I/C ISg/#r+ NPr/VP/J ISg/D$+ NSg/VB D+ N🅪Sg/VB+ VP VP/J NSg/VB/J VB/C ISg/#r+ VP NSg/VB/J P NPr/VB/J+ N🅪Sg/VB+ NPr/J/R/P D/P+ > drizzle . After changing my clothes I went next door and found Mr . Gatz walking # N🅪Sg/VB+ . P Nᴹ/Vg/J D$+ NPl/V3+ ISg/#r+ NSg/VPt NSg/J/P NSg/VB+ VB/C NSg/VP NSg+ . ? Nᴹ/Vg/J > up and down excitedly in the hall . His pride in his son and in his son’s # NSg/VB/J/P VB/C N🅪Sg/VB/J/P R NPr/J/R/P D NPr+ . ISg/D$+ Nᴹ/VB+ NPr/J/R/P ISg/D$+ NPr/VB+ VB/C NPr/J/R/P ISg/D$+ NPr$ > possessions was continually increasing and now he had something to show me . # NPl/V3+ VLPt R Nᴹ/Vg/J VB/C NSg/J/R/C NPr/ISg+ VP NSg/I/J+ P NSg/VB NPr/ISg+ . > # > “ Jimmy sent me this picture . ” He took out his wallet with trembling fingers . # . NPr/VB+ NSg/VP NPr/ISg+ I/Ddem+ NSg/VB+ . . NPr/ISg+ VPt NSg/VB/J/R/P ISg/D$+ NSg+ P Nᴹ/Vg/J NPl/V3+ . > “ Look there . ” # . NSg/VB R . . > # > It was a photograph of the house , cracked in the corners and dirty with many # NPr/ISg+ VLPt D/P NSg/VB P D+ NPr/VB+ . VP/J NPr/J/R/P D+ NPl/V3+ VB/C VB/J P NSg/I/J/Dq+ > hands . He pointed out every detail to me eagerly . “ Look there ! ” and then sought # NPl/V3+ . NPr/ISg+ VP/J NSg/VB/J/R/P Dq+ N🅪Sg/VB/J+ P NPr/ISg+ R . . NSg/VB R . . VB/C NSg/J/R/C VP > admiration from my eyes . He had shown it so often that I think it was more real # NSg+ P D$+ NPl/V3+ . NPr/ISg+ VP VPp NPr/ISg+ NSg/I/J/R/C R NSg/I/C/Ddem ISg/#r+ NSg/VB NPr/ISg+ VLPt NPr/I/J/R/Dq NSg/J > to him now than the house itself . # P ISg+ NSg/J/R/C C/P D+ NPr/VB+ ISg+ . > # > “ Jimmy sent it to me . I think it’s a very pretty picture . It shows up well . ” # . NPr/VB+ NSg/VP NPr/ISg+ P NPr/ISg+ . ISg/#r+ NSg/VB K D/P J/R NSg/VB/J/R NSg/VB+ . NPr/ISg+ NPl/V3 NSg/VB/J/P NSg/VB/J/R . . > # > “ Very well . Had you seen him lately ? ” # . J/R NSg/VB/J/R . VP ISgPl+ NSg/VPp ISg+ R . . > # > “ He come out to see me two years ago and bought me the house I live in now . Of # . NPr/ISg+ NSg/VBPp/P NSg/VB/J/R/P P NSg/VB NPr/ISg+ NSg+ NPl+ J/P VB/C NSg/VP NPr/ISg+ D+ NPr/VB+ ISg/#r+ VB/J NPr/J/R/P NSg/J/R/C . P > course we was broke up when he run off from home , but I see now there was a # NSg/VB+ IPl+ VLPt NSg/VPt/J NSg/VB/J/P NSg/I/C NPr/ISg+ NSg/VBPp NSg/VB/J/P P NSg/VB/J+ . NSg/C/P ISg/#r+ NSg/VB NSg/J/R/C R+ VLPt D/P > reason for it . He knew he had a big future in front of him . And ever since he # N🅪Sg/VB+ R/C/P NPr/ISg+ . NPr/ISg+ VPt NPr/ISg+ VP D/P NSg/J NSg/J NPr/J/R/P NSg/VB/J P ISg+ . VB/C J/R C/P NPr/ISg+ > made a success he was very generous with me . ” # VP D/P+ N🅪Sg+ NPr/ISg+ VLPt J/R J P NPr/ISg+ . . > # > He seemed reluctant to put away the picture , held it for another minute , # NPr/ISg+ VP/J J P NSg/VBP VB/J D+ NSg/VB+ . VP NPr/ISg+ R/C/P I/D+ NSg/VB/J+ . > lingeringly , before my eyes . Then he returned the wallet and pulled from his # R . C/P D$+ NPl/V3+ . NSg/J/R/C NPr/ISg+ VP/J D+ NSg+ VB/C VP/J P ISg/D$+ > pocket a ragged old copy of a book called “ Hopalong Cassidy . ” # NSg/VB/J D/P VP/J NSg/J NSg/VB P D/P NSg/VB+ VP/J . ? NPr . . > # > “ Look here , this is a book he had when he was a boy . It just shows you . ” # . NSg/VB J/R . I/Ddem+ VL3 D/P NSg/VB NPr/ISg+ VP NSg/I/C NPr/ISg+ VLPt D/P NSg/VB . NPr/ISg+ J/R NPl/V3 ISgPl+ . . > # > He opened it at the back cover and turned it around for me to see . On the last # NPr/ISg+ VP/J NPr/ISg+ NSg/P D NSg/VB/J N🅪Sg/VB/J VB/C VP/J NPr/ISg+ J/P R/C/P NPr/ISg+ P NSg/VB . J/P D NSg/VB/J > fly - leaf was printed the word SCHEDULE , and the date September 12 , 1906 . And # NSg/VB/J+ . NSg/VB+ VLPt VP/J D+ NSg/VB+ NSg/VB+ . VB/C D+ N🅪Sg/VB+ NPr+ # . # . VB/C > underneath : # NSg/J/P . > # > Rise from bed 6.00 a. m. # Unlintable > Dumbbell exercise and wall-scaling 6.15–6.30 „ # Unlintable > Study electricity, etc. 7.15–8.15 „ # Unlintable > Work 8.30–4.30 p. m. # Unlintable > Baseball and sports 4.30–5.00 „ # Unlintable > Practice elocution, poise and how to attain it 5.00–6.00 „ # Unlintable > Study needed inventions 7.00–9.00 „ # Unlintable > # Unlintable > # > GENERAL RESOLVES # NSg/VB/J NPl/V3 > # > No wasting time at Shafters or [ a name , indecipherable ] No more smokeing or # NSg/Dq/P Nᴹ/Vg/J N🅪Sg/VB/J+ NSg/P ? NPr/C . D/P NSg/VB+ . J . NSg/Dq/P NPr/I/J/R/Dq ? NPr/C > chewing . Bath every other day Read one improving book or magazine per week # Nᴹ/Vg/J . NSg/VB+ Dq+ NSg/VB/J+ NPr🅪Sg+ NSg/VBP NSg/I/J Nᴹ/Vg/J NSg/VB NPr/C NSg NSg NSg/J+ > Save $ 5.00 [ crossed out ] $ 3.00 per week Be better to parents # NSg/VB/C/P . # . VP/J NSg/VB/J/R/P . . # NSg NSg/J+ NSg/VLXB NSg/VXB/JC P NPl/V3 > # > “ I come across this book by accident , ” said the old man . “ It just shows you , # . ISg/#r+ NSg/VBPp/P NSg/P I/Ddem NSg/VB+ NSg/P NSg/J+ . . VP/J D+ NSg/J+ NPr/VB/J+ . . NPr/ISg+ J/R NPl/V3 ISgPl+ . > don’t it ? ” # VXB NPr/ISg+ . . > # > “ It just shows you . ” # . NPr/ISg+ J/R NPl/V3 ISgPl+ . . > # > “ Jimmy was bound to get ahead . He always had some resolves like this or # . NPr/VB+ VLPt NSg/VP/J P NSg/VB R . NPr/ISg+ R VP I/J/R/Dq NPl/V3 NSg/VB/J/C/P I/Ddem+ NPr/C > something . Do you notice what he’s got about improving his mind ? He was always # NSg/I/J+ . VXB ISgPl+ NSg/VB NSg/I+ NPr$ VP J/P Nᴹ/Vg/J ISg/D$+ NSg/VB+ . NPr/ISg+ VLPt R > great for that . He told me I et like a hog once , and I beat him for it . ” # NSg/J R/C/P NSg/I/C/Ddem+ . NPr/ISg+ VP NPr/ISg+ ISg/#r+ NSg+ NSg/VB/J/C/P D/P NSg/VB NSg/C . VB/C ISg/#r+ N🅪Sg/VB/J ISg+ R/C/P NPr/ISg+ . . > # > He was reluctant to close the book , reading each item aloud and then looking # NPr/ISg+ VLPt J P NSg/VB/J D+ NSg/VB+ . NPrᴹ/Vg/J Dq+ NSg/VB+ J VB/C NSg/J/R/C Nᴹ/Vg/J > eagerly at me . I think he rather expected me to copy down the list for my own # R NSg/P NPr/ISg+ . ISg/#r+ NSg/VB NPr/ISg+ NPr/VB/J/R NSg/VP/J NPr/ISg+ P NSg/VB N🅪Sg/VB/J/P D+ NSg/VB+ R/C/P D$+ NSg/VB/J+ > use . # N🅪Sg/VB+ . > # > A little before three the Lutheran minister arrived from Flushing , and I began # D/P NPr/I/J/Dq C/P NSg D+ NSg/J+ NSg/VB+ VP/J P Nᴹ/Vg/J . VB/C ISg/#r+ VPt > to look involuntarily out the windows for other cars . So did Gatsby’s father . # P NSg/VB R NSg/VB/J/R/P D NPrPl/V3+ R/C/P NSg/VB/J NPl+ . NSg/I/J/R/C VXPt NPr$ NPr/VB+ . > And as the time passed and the servants came in and stood waiting in the hall , # VB/C R/C/P D+ N🅪Sg/VB/J+ VP/J VB/C D+ NPl/V3+ NSg/VPt/P NPr/J/R/P VB/C VP Nᴹ/Vg/J NPr/J/R/P D+ NPr+ . > his eyes began to blink anxiously , and he spoke of the rain in a worried , # ISg/D$+ NPl/V3+ VPt P NSg/VB R . VB/C NPr/ISg+ NSg/VPt P D+ N🅪Sg/VB+ NPr/J/R/P D/P VP/J . > uncertain way . The minister glanced several times at his watch , so I took him # I/J+ NSg/J+ . D+ NSg/VB+ VP/J J/Dq+ NPl/V3+ NSg/P ISg/D$+ NSg/VB . NSg/I/J/R/C ISg/#r+ VPt ISg+ > aside and asked him to wait for half an hour . But it wasn’t any use . Nobody # NSg/J VB/C VP/J ISg+ P NSg/VB R/C/P N🅪Sg/J/P+ D/P+ NSg+ . NSg/C/P NPr/ISg+ VPt I/R/Dq N🅪Sg/VB+ . NSg/I+ > came . # NSg/VPt/P . > # > About five o’clock our procession of three cars reached the cemetery and stopped # J/P NSg R D$+ NSg/VB P NSg+ NPl+ VP/J D+ NSg+ VB/C VP/J > in a thick drizzle beside the gate — first a motor hearse , horribly black and wet , # NPr/J/R/P D/P NSg/VB/J N🅪Sg/VB+ P D+ NSg/VB+ . NSg/J+ D/P+ NSg/VB/J+ NSg/VB . R N🅪Sg/VB/J VB/C NSg/VP/J . > then Mr . Gatz and the minister and I in the limousine , and a little later four # NSg/J/R/C NSg+ . ? VB/C D NSg/VB+ VB/C ISg/#r+ NPr/J/R/P D NSg . VB/C D/P NPr/I/J/Dq JC NSg > or five servants and the postman from West Egg , in Gatsby’s station wagon , all # NPr/C NSg NPl/V3+ VB/C D NSg P NPr/VB/J+ N🅪Sg/VB+ . NPr/J/R/P NPr$ NSg/VB+ NSg/VB+ . NSg/I/J/C/Dq > wet to the skin . As we started through the gate into the cemetery I heard a car # NSg/VP/J P D N🅪Sg/VB+ . R/C/P IPl+ VP/J NSg/J/P D+ NSg/VB+ P D+ NSg+ ISg/#r+ VP/J D/P+ NSg+ > stop and then the sound of some one splashing after us over the soggy ground . I # NSg/VB VB/C NSg/J/R/C D N🅪Sg/VB/J P I/J/R/Dq+ NSg/I/J+ Nᴹ/Vg/J P NPr/IPl+ NSg/J/P D J N🅪Sg/VB/J+ . ISg/#r+ > looked around . It was the man with owl - eyed glasses whom I had found marvelling # VP/J J/P . NPr/ISg+ VLPt D NPr/VB/J P NSg/VB+ . VP/J+ NPl/V3+ I+ ISg/#r+ VP NSg/VP NSg/Vg/Comm > over Gatsby’s books in the library one night three months before . # NSg/J/P NPr$ NPl/V3+ NPr/J/R/P D NSg+ NSg/I/J+ N🅪Sg/VB+ NSg+ NPl+ C/P . > # > I'd never seen him since then . I don’t know how he knew about the funeral , or # K R NSg/VPp ISg+ C/P NSg/J/R/C . ISg/#r+ VXB VB NSg/C NPr/ISg+ VPt J/P D NSg/J+ . NPr/C > even his name . The rain poured down his thick glasses , and he took them off and # NSg/VB/J/R ISg/D$+ NSg/VB+ . D+ N🅪Sg/VB+ VP/J N🅪Sg/VB/J/P ISg/D$+ NSg/VB/J+ NPl/V3+ . VB/C NPr/ISg+ VPt NSg/IPl+ NSg/VB/J/P VB/C > wiped them to see the protecting canvas unrolled from Gatsby’s grave . # VP/J NSg/IPl+ P NSg/VB D+ Nᴹ/Vg/J NSg/VB+ VP/J P NPr$ NSg/VB/J+ . > # > I tried to think about Gatsby then for a moment , but he was already too far # ISg/#r+ VP/J P NSg/VB J/P NPr NSg/J/R/C R/C/P D/P NSg+ . NSg/C/P NPr/ISg+ VLPt R R NSg/VB/J > away , and I could only remember , without resentment , that Daisy hadn’t sent a # VB/J . VB/C ISg/#r+ NSg/VXB J/R/C NSg/VB . C/P NSg+ . NSg/I/C/Ddem NPr+ VPt NSg/VP D/P > message or a flower . Dimly I heard some one murmur “ Blessed are the dead that # NSg/VB NPr/C D/P NSg/VB+ . R ISg/#r+ VP/J I/J/R/Dq+ NSg/I/J+ NSg/VB . VP/J VLB D NSg/VB/J NSg/I/C/Ddem > the rain falls on , ” and then the owl - eyed man said “ Amen to that , ” in a brave # D N🅪Sg/VB+ NPl/V3+ J/P . . VB/C NSg/J/R/C D NSg/VB+ . VP/J NPr/VB/J+ VP/J . NPr/VB P NSg/I/C/Ddem+ . . NPr/J/R/P D/P NSg/VB/J > voice . # NSg/VB+ . > # > We straggled down quickly through the rain to the cars . Owl - eyes spoke to me by # IPl+ VP/J N🅪Sg/VB/J/P R NSg/J/P D N🅪Sg/VB+ P D NPl+ . NSg/VB+ . NPl/V3+ NSg/VPt P NPr/ISg+ NSg/P > the gate . # D+ NSg/VB+ . > # > “ I couldn’t get to the house , ” he remarked . # . ISg/#r+ VXB NSg/VB P D NPr/VB+ . . NPr/ISg+ VP/J . > # > “ Neither could anybody else . ” # . I/C NSg/VXB NSg/I+ NSg/J/C . . > # > “ Go on ! ” He started . “ Why , my God ! they used to go there by the hundreds . ” # . NSg/VB/J J/P . . NPr/ISg+ VP/J . . NSg/VB . D$+ NPr/VB+ . IPl+ VP/J P NSg/VB/J R NSg/P D+ NPl+ . . > # > He took off his glasses and wiped them again , outside and in . # NPr/ISg+ VPt NSg/VB/J/P ISg/D$+ NPl/V3+ VB/C VP/J NSg/IPl+ P . Nᴹ/VB/J/P VB/C NPr/J/R/P . > # > “ The poor son - of - a - bitch , ” he said . # . D NSg/VB/J NPr/VB+ . P . D/P . NSg/VB . . NPr/ISg+ VP/J . > # > One of my most vivid memories is of coming back West from prep school and later # NSg/I/J P D$+ NSg/I/J/R/Dq NSg/J+ NPl+ VL3 P Nᴹ/Vg/J NSg/VB/J NPr/VB/J+ P Nᴹ/VB+ N🅪Sg/VB+ VB/C JC > from college at Christmas time . Those who went farther than Chicago would gather # P NSg NSg/P NPr/VB/J+ N🅪Sg/VB/J+ . I/Ddem+ NPr/I+ NSg/VPt VB/JC C/P NPr+ VXB NSg/VB > in the old dim Union Street station at six o’clock of a December evening , with a # NPr/J/R/P D+ NSg/J+ NSg/VB/J+ NPr/VB/J+ NSg/VB/J+ NSg/VB+ NSg/P NSg R P D/P+ NPr+ N🅪Sg/Vg/J+ . P D/P+ > few Chicago friends , already caught up into their own holiday gayeties , to bid # NSg/I/Dq+ NPr+ NPrPl/V3+ . R VP/J NSg/VB/J/P P D$+ NSg/VB/J+ NPr/VB+ ? . P NSg/VBP > them a hasty good - by . I remember the fur coats of the girls returning from Miss # NSg/IPl+ D/P J NPr/VB/J . NSg/P . ISg/#r+ NSg/VB D N🅪Sg/VB/C/P+ NPl/V3 P D+ NPl/V3+ Nᴹ/Vg/J P NSg/VB > This - or - That’s and the chatter of frozen breath and the hands waving overhead as # I/Ddem+ . NPr/C . NSg$ VB/C D NSg/VB P VB/J N🅪Sg/VB/J+ VB/C D NPl/V3+ Nᴹ/Vg/J NSg/J/P+ R/C/P > we caught sight of old acquaintances , and the matchings of invitations : “ Are you # IPl+ VP/J N🅪Sg/VB P NSg/J NPl+ . VB/C D ? P NPl+ . . VLB ISgPl+ > going to the Ordways ’ ? the Herseys ’ ? the Schultzes ’ ? ” and the long green tickets # Nᴹ/Vg/J P D ? . . D ? . . D ? . . . VB/C D+ NPr/VB/J+ NPr🅪Sg/VB/J+ NPl/V3+ > clasped tight in our gloved hands . And last the murky yellow cars of the # VP/J VB/J NPr/J/R/P D$+ VP/J NPl/V3+ . VB/C NSg/VB/J D J NSg/VB/J NPl P D > Chicago , Milwaukee & St . Paul railroad looking cheerful as Christmas itself on # NPr+ . NPr . NPr/VB+ . NPr+ NSg/VB+ Nᴹ/Vg/J J R/C/P NPr/VB/J+ ISg+ J/P > the tracks beside the gate . # D+ NPl/V3+ P D+ NSg/VB+ . > # > When we pulled out into the winter night and the real snow , our snow , began to # NSg/I/C IPl+ VP/J NSg/VB/J/R/P P D+ N🅪Sg/VB+ N🅪Sg/VB+ VB/C D+ NSg/J+ NPr🅪Sg/VB+ . D$+ NPr🅪Sg/VB+ . VPt P > stretch out beside us and twinkle against the windows , and the dim lights of # N🅪Sg/VB NSg/VB/J/R/P P NPr/IPl+ VB/C NSg/VB C/P D NPrPl/V3+ . VB/C D NSg/VB/J NPl/V3 P > small Wisconsin stations moved by , a sharp wild brace came suddenly into the # NPr/VB/J NPr+ + VP/J NSg/P . D/P NPr/VB/J NSg/VB/J NSg/VB NSg/VPt/P R P D > air . We drew in deep breaths of it as we walked back from dinner through the # N🅪Sg/VB+ . IPl+ NPr/VPt NPr/J/R/P NSg/J NPl P NPr/ISg+ R/C/P IPl+ VP/J NSg/VB/J P N🅪Sg/VB+ NSg/J/P D > cold vestibules , unutterably aware of our identity with this country for one # NSg/J NPl/V3 . R VB/J P D$+ NSg+ P I/Ddem NSg/J+ R/C/P NSg/I/J > strange hour , before we melted indistinguishably into it again . # NSg/VB/J NSg+ . C/P IPl+ VP/J R P NPr/ISg+ P . > # > That’s my Middle West — not the wheat or the prairies or the lost Swede towns , but # NSg$ D$+ NSg/VB/J NPr/VB/J+ . NSg/R/C D NSg/J+ NPr/C D NPl NPr/C D VP/J NSg/VB+ NPl+ . NSg/C/P > the thrilling returning trains of my youth , and the street lamps and sleigh # D Nᴹ/Vg/J Nᴹ/Vg/J NPl/V3 P D$+ NSg+ . VB/C D NSg/VB/J+ NPl/V3 VB/C NSg/VB/J+ > bells in the frosty dark and the shadows of holly wreaths thrown by lighted # NPl/V3 NPr/J/R/P D J NSg/VB/J VB/C D NPl/V3 P NPr+ NPl/VB VPp/J NSg/P VP/J > windows on the snow . I am part of that , a little solemn with the feel of those # NPrPl/V3+ J/P D NPr🅪Sg/VB+ . ISg/#r+ NPr/VLB/J NSg/VB/J P NSg/I/C/Ddem+ . D/P NPr/I/J/Dq J P D NSg/I/VB P I/Ddem+ > long winters , a little complacent from growing up in the Carraway house in a # NPr/VB/J+ NPrPl/V3+ . D/P NPr/I/J/Dq J P Nᴹ/Vg/J NSg/VB/J/P NPr/J/R/P D ? NPr/VB NPr/J/R/P D/P > city where dwellings are still called through decades by a family’s name . I see # NSg+ NSg/R/C NPl/V3+ VLB NSg/VB/J/R VP/J NSg/J/P NPl+ NSg/P D/P NSg$ NSg/VB+ . ISg/#r+ NSg/VB > now that this has been a story of the West , after all — Tom and Gatsby , Daisy and # NSg/J/R/C NSg/I/C/Ddem I/Ddem+ V3 NSg/VLPp D/P NSg/VB P D+ NPr/VB/J+ . P NSg/I/J/C/Dq . NPr/VB+ VB/C NPr . NPr VB/C > Jordan and I , were all Westerners , and perhaps we possessed some deficiency in # NPr+ VB/C ISg/#r+ . NSg/VLPt NSg/I/J/C/Dq + . VB/C NSg/R IPl+ VP/J I/J/R/Dq NSg+ NPr/J/R/P > common which made us subtly unadaptable to Eastern life . # NSg/VB/J I/C+ VP NPr/IPl+ R ? P J N🅪Sg/VB+ . > # > Even when the East excited me most , even when I was most keenly aware of its # NSg/VB/J/R NSg/I/C D+ NPr/J+ VP/J NPr/ISg+ NSg/I/J/R/Dq . NSg/VB/J/R NSg/I/C ISg/#r+ VLPt NSg/I/J/R/Dq R VB/J P ISg/D$+ > superiority to the bored , sprawling , swollen towns beyond the Ohio , with their # NSg+ P D VP/J . Nᴹ/Vg/J . VB/J NPl+ NSg/P D NPr/J+ . P D$+ > interminable inquisitions which spared only the children and the very old — even # J NPl/V3 I/C+ VP/J J/R/C D NPl+ VB/C D J/R NSg/J . NSg/VB/J/R > then it had always for me a quality of distortion . West Egg , especially , still # NSg/J/R/C NPr/ISg+ VP R R/C/P NPr/ISg+ D/P N🅪Sg/J P NSg+ . NPr/VB/J+ N🅪Sg/VB+ . R . NSg/VB/J/R > figures in my more fantastic dreams . I see it as a night scene by El Greco : a # NPl/V3+ NPr/J/R/P D$+ NPr/I/J/R/Dq NSg/J+ NPl/V3+ . ISg/#r+ NSg/VB NPr/ISg+ R/C/P D/P N🅪Sg/VB+ NSg/VB NSg/P ? ? . D/P+ > hundred houses , at once conventional and grotesque , crouching under a sullen , # NSg+ NPl/V3+ . NSg/P NSg/C NSg/J VB/C NSg/J . Nᴹ/Vg/J NSg/J/P D/P NSg/VB/J . > overhanging sky and a lustreless moon . In the foreground four solemn men in # Nᴹ/Vg/J N🅪Sg/VB+ VB/C D/P J/Comm NPr/VB+ . NPr/J/R/P D+ NSg/VB+ NSg J NPl NPr/J/R/P > dress suits are walking along the sidewalk with a stretcher on which lies a # NSg/VB+ NPl/V3 VLB Nᴹ/Vg/J P D+ NSg+ P D/P NSg/VB J/P I/C+ NPl/V3 D/P > drunken woman in a white evening dress . Her hand , which dangles over the side , # VB/J NSg/VB+ NPr/J/R/P D/P NPr🅪Sg/VB/J N🅪Sg/Vg/J+ NSg/VB+ . ISg/D$+ NSg/VB+ . I/C+ NPl/V3 NSg/J/P D NSg/VB/J+ . > sparkles cold with jewels . Gravely the men turn in at a house — the wrong house . # NPl/V3 NSg/J P NPl/V3+ . R D+ NPl+ NSg/VB NPr/J/R/P NSg/P D/P NPr/VB+ . D NSg/VB/J/R NPr/VB+ . > But no one knows the woman’s name , and no one cares . # NSg/C/P NSg/Dq/P NSg/I/J+ V3 D NSg$ NSg/VB+ . VB/C NSg/Dq/P NSg/I/J+ NPl/V3 . > # > After Gatsby’s death the East was haunted for me like that , distorted beyond my # P NPr$ NPr🅪Sg+ D NPr/J+ VLPt VP/J R/C/P NPr/ISg+ NSg/VB/J/C/P NSg/I/C/Ddem+ . VP/J NSg/P D$+ > eyes ’ power of correction . So when the blue smoke of brittle leaves was in the # NPl/V3+ . N🅪Sg/VB/J P NSg+ . NSg/I/J/R/C NSg/I/C D N🅪Sg/VB/J N🅪Sg/VB P NSg/VB/J NPl/V3+ VLPt NPr/J/R/P D > air and the wind blew the wet laundry stiff on the line I decided to come back # N🅪Sg/VB VB/C D N🅪Sg/VB+ NSg/VPt/J D NSg/VP/J N🅪Sg+ NSg/VB/J J/P D NSg/VB+ ISg/#r+ NSg/VP/J P NSg/VBPp/P NSg/VB/J > home . # NSg/VB/J+ . > # > There was one thing to be done before I left , an awkward , unpleasant thing that # R+ VLPt NSg/I/J NSg+ P NSg/VLXB NSg/VPp/J C/P ISg/#r+ NPr/VP/J . D/P NSg/J . NSg/J+ NSg+ NSg/I/C/Ddem+ > perhaps had better have been let alone . But I wanted to leave things in order # NSg/R VP NSg/VXB/JC NSg/VXB NSg/VLPp NSg/VBP J . NSg/C/P ISg/#r+ VP/J P NSg/VB NPl+ NPr/J/R/P N🅪Sg/VB+ > and not just trust that obliging and indifferent sea to sweep my refuse away . I # VB/C NSg/R/C J/R N🅪Sg/VB/J NSg/I/C/Ddem Nᴹ/Vg/J VB/C NSg/J NSg+ P NSg/VB D$+ NSg/VB VB/J . ISg/#r+ > saw Jordan Baker and talked over and around what had happened to us together , # NSg/VPt NPr+ NPr+ VB/C VP/J NSg/J/P VB/C J/P NSg/I+ VP VP/J P NPr/IPl+ J . > and what had happened afterward to me , and she lay perfectly still , listening , # VB/C NSg/I+ VP VP/J R/Am P NPr/ISg+ . VB/C ISg+ NSg/VBPt/J R NSg/VB/J/R . Nᴹ/Vg/J . > in a big chair . # NPr/J/R/P D/P+ NSg/J+ NSg/VB+ . > # > She was dressed to play golf , and I remember thinking she looked like a good # ISg+ VLPt VP/J P N🅪Sg/VB NSg/VB+ . VB/C ISg/#r+ NSg/VB Nᴹ/Vg/J ISg+ VP/J NSg/VB/J/C/P D/P+ NPr/VB/J+ > illustration , her chin raised a little jauntily , her hair the color of an autumn # N🅪Sg+ . ISg/D$+ NPr/VB+ VP/J D/P NPr/I/J/Dq R . ISg/D$+ N🅪Sg/VB D N🅪Sg/VB/J/Am P D/P NPr🅪Sg/VB+ > leaf , her face the same brown tint as the fingerless glove on her knee . When I # NSg/VB+ . ISg/D$+ NSg/VB D I/J NPr🅪Sg/VB/J NSg/VB R/C/P D ? NSg/VB+ J/P ISg/D$+ NSg/VB+ . NSg/I/C ISg/#r+ > had finished she told me without comment that she was engaged to another man . I # VP VP/J ISg+ VP NPr/ISg+ C/P NSg/VB+ NSg/I/C/Ddem+ ISg+ VLPt VP/J P I/D+ NPr/VB/J+ . ISg/#r+ > doubted that , though there were several she could have married at a nod of her # VP/J NSg/I/C/Ddem+ . C R+ NSg/VLPt J/Dq ISg+ NSg/VXB NSg/VXB NSg/VP/J NSg/P D/P NSg/VB P ISg/D$+ > head , but I pretended to be surprised . For just a minute I wondered if I wasn’t # NPr/VB/J+ . NSg/C/P ISg/#r+ VP/J P NSg/VLXB VP/J . R/C/P J/R D/P+ NSg/VB/J+ ISg/#r+ VP/J NSg/C ISg/#r+ VPt > making a mistake , then I thought it all over again quickly and got up to say # Nᴹ/Vg/J D/P NSg/VB+ . NSg/J/R/C ISg/#r+ N🅪Sg/VP NPr/ISg+ NSg/I/J/C/Dq NSg/J/P P R VB/C VP NSg/VB/J/P P NSg/VB > good - by . # NPr/VB/J . NSg/P . > # > “ Nevertheless you did throw me over , ” said Jordan suddenly . ‘ ‘ You threw me over # . R ISgPl+ VXPt NSg/VB NPr/ISg+ NSg/J/P . . VP/J NPr+ R . Unlintable Unlintable ISgPl+ VPt NPr/ISg+ NSg/J/P > on the telephone . I don’t give a damn about you now , but it was a new experience # J/P D+ NSg/VB+ . ISg/#r+ VXB NSg/VB D/P NSg/VB/J J/P ISgPl+ NSg/J/R/C . NSg/C/P NPr/ISg+ VLPt D/P NSg/J N🅪Sg/VB > for me , and I felt a little dizzy for a while . ” # R/C/P NPr/ISg+ . VB/C ISg/#r+ N🅪Sg/VP/J D/P NPr/I/J/Dq NSg/VB/J R/C/P D/P NSg/VB/C/P+ . . > # > We shook hands . # IPl+ NSg/VPt/J NPl/V3+ . > # > “ Oh , and do you remember ” — she added — “ a conversation we had once about driving a # . NPr/VB . VB/C VXB ISgPl+ NSg/VB . . ISg+ VP/J . . D/P+ N🅪Sg/VB+ IPl+ VP NSg/C J/P Nᴹ/Vg/J D/P+ > car ? ” # NSg+ . . > # > “ Why — not exactly . ” # . NSg/VB . NSg/R/C R . . > # > “ You said a bad driver was only safe until she met another bad driver ? Well , I # . ISgPl+ VP/J D/P+ NSg/VB/J+ NSg+ VLPt J/R/C NSg/VB/J C/P ISg+ VP I/D+ NSg/VB/J+ NSg+ . NSg/VB/J/R . ISg/#r+ > met another bad driver , didn’t I ? I mean it was careless of me to make such a # VP I/D+ NSg/VB/J+ NSg+ . VXPt ISg/#r+ . ISg/#r+ NSg/VB/J NPr/ISg+ VLPt J P NPr/ISg+ P NSg/VB NSg/I D/P > wrong guess . I thought you were rather an honest , straightforward person . I # NSg/VB/J/R NSg/VB+ . ISg/#r+ N🅪Sg/VP ISgPl+ NSg/VLPt NPr/VB/J/R D/P VB/JS . J+ NSg/VB+ . ISg/#r+ > thought it was your secret pride . ” # N🅪Sg/VP NPr/ISg+ VLPt D$+ NSg/VB/J+ Nᴹ/VB+ . . > # > “ I’m thirty , ” I said . “ I’m five years too old to lie to myself and call it # . K NSg . . ISg/#r+ VP/J . . K NSg+ NPl+ R NSg/J P NPr/VB P ISg+ VB/C NSg/VB NPr/ISg+ > honor . ” # N🅪Sg/VB/Am+ . . > # > She didn’t answer . Angry , and half in love with her , and tremendously sorry , I # ISg+ VXPt NSg/VB+ . VB/J . VB/C N🅪Sg/J/P+ NPr/J/R/P NPr🅪Sg/VB P ISg/D$+ . VB/C R NSg/VB/J . ISg/#r+ > turned away . # VP/J VB/J . > # > One afternoon late in October I saw Tom Buchanan . He was walking ahead of me # NSg/I/J+ N🅪Sg+ NSg/J NPr/J/R/P NPr/VB+ ISg/#r+ NSg/VPt NPr/VB+ NPr+ . NPr/ISg+ VLPt Nᴹ/Vg/J R P NPr/ISg+ > along Fifth Avenue in his alert , aggressive way , his hands out a little from his # P NSg/VB/J NSg+ NPr/J/R/P ISg/D$+ NSg/VB/J+ . NSg/J+ NSg/J+ . ISg/D$+ NPl/V3+ NSg/VB/J/R/P D/P NPr/I/J/Dq P ISg/D$+ > body as if to fight off interference , his head moving sharply here and there , # NSg/VB+ R/C/P NSg/C P NSg/VB NSg/VB/J/P NSg/VB+ . ISg/D$+ NPr/VB/J+ Nᴹ/Vg/J R J/R VB/C R . > adapting itself to his restless eyes . Just as I slowed up to avoid overtaking # Nᴹ/Vg/J ISg+ P ISg/D$+ J NPl/V3+ . J/R R/C/P ISg/#r+ VP/J NSg/VB/J/P P VB Nᴹ/Vg/J > him he stopped and began frowning into the windows of a jewelry store . Suddenly # ISg+ NPr/ISg+ VP/J VB/C VPt Nᴹ/Vg/J P D NPrPl/V3 P D/P+ Nᴹ/VB+ NSg/VB+ . R > he saw me and walked back , holding out his hand . # NPr/ISg+ NSg/VPt NPr/ISg+ VB/C VP/J NSg/VB/J . Nᴹ/Vg/J NSg/VB/J/R/P ISg/D$+ NSg/VB+ . > # > “ What’s the matter , Nick ? Do you object to shaking hands with me ? ” # . K D N🅪Sg/VB+ . NPr/VB+ . VXB ISgPl+ NSg/VB+ P Nᴹ/Vg/J NPl/V3+ P NPr/ISg+ . . > # > “ Yes . You know what I think of you . ” # . NPl/VB . ISgPl+ VB NSg/I+ ISg/#r+ NSg/VB P ISgPl+ . . > # > “ You're crazy , Nick , ” he said quickly . “ Crazy as hell . I don’t know what’s the # . + NSg/J . NPr/VB+ . . NPr/ISg+ VP/J R . . NSg/J R/C/P NPr/VB+ . ISg/#r+ VXB VB K D > matter with you . ” # N🅪Sg/VB+ P ISgPl+ . . > # > “ Tom , ” I inquired , “ what did you say to Wilson that afternoon ? ” # . NPr/VB+ . . ISg/#r+ VP/J . . NSg/I+ VXPt ISgPl+ NSg/VB P NPr+ NSg/I/C/Ddem+ N🅪Sg+ . . > # > He stared at me without a word , and I knew I had guessed right about those # NPr/ISg+ VP/J NSg/P NPr/ISg+ C/P D/P+ NSg/VB+ . VB/C ISg/#r+ VPt ISg/#r+ VP VP/J NPr/VB/J J/P I/Ddem > missing hours . I started to turn away , but he took a step after me and grabbed # Nᴹ/Vg/J NPl+ . ISg/#r+ VP/J P NSg/VB VB/J . NSg/C/P NPr/ISg+ VPt D/P+ NSg/VB+ P NPr/ISg+ VB/C VP > my arm . # D$+ NSg/VB/J+ . > # > “ I told him the truth , ” he said . “ He came to the door while we were getting # . ISg/#r+ VP ISg+ D+ N🅪Sg/VB+ . . NPr/ISg+ VP/J . . NPr/ISg+ NSg/VPt/P P D+ NSg/VB+ NSg/VB/C/P IPl+ NSg/VLPt NSg/Vg > ready to leave , and when I sent down word that we weren’t in he tried to force # NSg/VB/J P NSg/VB . VB/C NSg/I/C ISg/#r+ NSg/VP N🅪Sg/VB/J/P NSg/VB NSg/I/C/Ddem IPl+ VPt NPr/J/R/P NPr/ISg+ VP/J P N🅪Sg/VB > his way up - stairs . He was crazy enough to kill me if I hadn’t told him who owned # ISg/D$+ NSg/J+ NSg/VB/J/P . NPl+ . NPr/ISg+ VLPt NSg/J NSg/I P NSg/VB NPr/ISg+ NSg/C ISg/#r+ VPt VP ISg+ NPr/I+ VP/J > the car . His hand was on a revolver in his pocket every minute he was in the # D NSg+ . ISg/D$+ NSg/VB+ VLPt J/P D/P NSg NPr/J/R/P ISg/D$+ NSg/VB/J Dq NSg/VB/J+ NPr/ISg+ VLPt NPr/J/R/P D > house — ” He broke off defiantly . “ What if I did tell him ? That fellow had it # NPr/VB+ . . NPr/ISg+ NSg/VPt/J NSg/VB/J/P R . . NSg/I+ NSg/C ISg/#r+ VXPt NPr/VB ISg+ . NSg/I/C/Ddem NSg VP NPr/ISg+ > coming to him . He threw dust into your eyes just like he did in Daisy’s , but he # Nᴹ/Vg/J P ISg+ . NPr/ISg+ VPt Nᴹ/VB+ P D$+ NPl/V3+ J/R NSg/VB/J/C/P NPr/ISg+ VXPt NPr/J/R/P NPr$ . NSg/C/P NPr/ISg+ > was a tough one . He ran over Myrtle like you’d run over a dog and never even # VLPt D/P NSg/VB/J NSg/I/J+ . NPr/ISg+ NSg/VPt NSg/J/P NPr NSg/VB/J/C/P K NSg/VBPp NSg/J/P D/P NSg/VB/J+ VB/C R NSg/VB/J/R > stopped his car . ” # VP/J ISg/D$+ NSg+ . . > # > There was nothing I could say , except the one unutterable fact that it wasn’t # R+ VLPt NSg/I/J+ ISg/#r+ NSg/VXB NSg/VB . VB/C/P D+ NSg/I/J+ NSg/J NSg+ NSg/I/C/Ddem+ NPr/ISg+ VPt > true . # NSg/VB/J . > # > “ And if you think I didn’t have my share of suffering — look here , when I went to # . VB/C NSg/C ISgPl+ NSg/VB ISg/#r+ VXPt NSg/VXB D$+ NSg/VB P Nᴹ/Vg/J+ . NSg/VB J/R . NSg/I/C ISg/#r+ NSg/VPt P > give up that flat and saw that damn box of dog biscuits sitting there on the # NSg/VB NSg/VB/J/P NSg/I/C/Ddem NSg/VB/J VB/C NSg/VPt NSg/I/C/Ddem NSg/VB/J NSg/VB P NSg/VB/J+ NPl NSg/Vg/J R J/P D > sideboard , I sat down and cried like a baby . By God it was awful — ” # NSg/VB . ISg/#r+ NSg/VP/J N🅪Sg/VB/J/P VB/C VP/J NSg/VB/J/C/P D/P NSg/VB/J+ . NSg/P NPr/VB+ NPr/ISg+ VLPt J . . > # > I couldn’t forgive him or like him , but I saw that what he had done was , to him , # ISg/#r+ VXB VB ISg+ NPr/C NSg/VB/J/C/P ISg+ . NSg/C/P ISg/#r+ NSg/VPt NSg/I/C/Ddem NSg/I+ NPr/ISg+ VP NSg/VPp/J VLPt . P ISg+ . > entirely justified . It was all very careless and confused . They were careless # R VP/J . NPr/ISg+ VLPt NSg/I/J/C/Dq J/R J VB/C VP/J . IPl+ NSg/VLPt J > people , Tom and Daisy — they smashed up things and creatures and then retreated # NPl/VB . NPr/VB VB/C NPr+ . IPl+ VP/J NSg/VB/J/P NPl VB/C NPl+ VB/C NSg/J/R/C VP/J > back into their money or their vast carelessness , or whatever it was that kept # NSg/VB/J P D$+ N🅪Sg/J+ NPr/C D$+ NSg/J Nᴹ . NPr/C NSg/I/J+ NPr/ISg+ VLPt NSg/I/C/Ddem+ VP > them together , and let other people clean up the mess they had made . . . . # NSg/IPl+ J . VB/C NSg/VBP NSg/VB/J NPl/VB+ NSg/VB/J NSg/VB/J/P D NSg/VB+ IPl+ VP VP . . . . > # > I shook hands with him ; it seemed silly not to , for I felt suddenly as though I # ISg/#r+ NSg/VPt/J NPl/V3+ P ISg+ . NPr/ISg+ VP/J NSg/J NSg/R/C P . R/C/P ISg/#r+ N🅪Sg/VP/J R R/C/P C ISg/#r+ > were talking to a child . Then he went into the jewelry store to buy a pearl # NSg/VLPt Nᴹ/Vg/J P D/P+ NSg/VB+ . NSg/J/R/C NPr/ISg+ NSg/VPt P D+ Nᴹ/VB+ NSg/VB+ P NSg/VB D/P+ NPr/VB+ > necklace — or perhaps only a pair of cuff buttons — rid of my provincial # NSg/VB+ . NPr/C NSg/R J/R/C D/P NSg/VB P NSg/VB NPl/V3+ . VB P D$+ NSg/J > squeamishness forever . # NSg NSg/J . > # > Gatsby’s house was still empty when I left — the grass on his lawn had grown as # NPr$ NPr/VB+ VLPt NSg/VB/J/R NSg/VB/J NSg/I/C ISg/#r+ NPr/VP/J . D NPr🅪Sg/VB+ J/P ISg/D$+ NSg/VB+ VP VB/J R/C/P > long as mine . One of the taxi drivers in the village never took a fare past the # NPr/VB/J R/C/P NSg/I/VB+ . NSg/I/J P D+ NSg/VB+ NPl+ NPr/J/R/P D+ NSg+ R VPt D/P+ N🅪Sg/VB+ NSg/VB/J/P D+ > entrance gate without stopping for a minute and pointing inside ; perhaps it was # NSg/VB+ NSg/VB+ C/P NSg/Vg R/C/P D/P+ NSg/VB/J+ VB/C Nᴹ/Vg/J NSg/J/P . NSg/R NPr/ISg+ VLPt > he who drove Daisy and Gatsby over to East Egg the night of the accident , and # NPr/ISg+ NPr/I+ NSg/VPt NPr+ VB/C NPr NSg/J/P P NPr/J+ N🅪Sg/VB D N🅪Sg/VB P D NSg/J+ . VB/C > perhaps he had made a story about it all his own . I didn’t want to hear it and I # NSg/R NPr/ISg+ VP VP D/P NSg/VB+ J/P NPr/ISg+ NSg/I/J/C/Dq ISg/D$+ NSg/VB/J . ISg/#r+ VXPt NSg/VB P VB NPr/ISg+ VB/C ISg/#r+ > avoided him when I got off the train . # VP/J ISg+ NSg/I/C ISg/#r+ VP NSg/VB/J/P D NSg/VB+ . > # > I spent my Saturday nights in New York because those gleaming , dazzling parties # ISg/#r+ VP/J D$+ NSg/VB+ NPl/V3+ NPr/J/R/P NSg/J+ NPr+ C/P I/Ddem+ Nᴹ/Vg/J+ . Nᴹ/Vg/J NPl/V3 > of his were with me so vividly that I could still hear the music and the # P ISg/D$+ NSg/VLPt P NPr/ISg+ NSg/I/J/R/C R NSg/I/C/Ddem ISg/#r+ NSg/VXB NSg/VB/J/R VB D N🅪Sg/VB/J VB/C D+ > laughter , faint and incessant , from his garden , and the cars going up and down # Nᴹ+ . NSg/VB/J VB/C J . P ISg/D$+ NSg/VB/J+ . VB/C D+ NPl+ Nᴹ/Vg/J NSg/VB/J/P VB/C N🅪Sg/VB/J/P > his drive . One night I did hear a material car there , and saw its lights stop at # ISg/D$+ N🅪Sg/VB . NSg/I/J+ N🅪Sg/VB+ ISg/#r+ VXPt VB D/P+ N🅪Sg/VB/J+ NSg+ R . VB/C NSg/VPt ISg/D$+ NPl/V3+ NSg/VB NSg/P > his front steps . But I didn’t investigate . Probably it was some final guest who # ISg/D$+ NSg/VB/J+ NPl/V3+ . NSg/C/P ISg/#r+ VXPt VB . R NPr/ISg+ VLPt I/J/R/Dq NSg/VB/J NSg/VB NPr/I+ > had been away at the ends of the earth and didn’t know that the party was over . # VP NSg/VLPp VB/J NSg/P D NPl/V3 P D+ NPrᴹ/VB+ VB/C VXPt VB NSg/I/C/Ddem D NSg/VB/J+ VLPt NSg/J/P . > # > On the last night , with my trunk packed and my car sold to the grocer , I went # J/P D+ NSg/VB/J+ N🅪Sg/VB+ . P D$+ NSg/VB+ VP/J VB/C D$+ NSg+ NSg/VP P D NSg/VB . ISg/#r+ NSg/VPt > over and looked at that huge incoherent failure of a house once more . On the # NSg/J/P VB/C VP/J NSg/P NSg/I/C/Ddem J J N🅪Sg P D/P NPr/VB+ NSg/C NPr/I/J/R/Dq . J/P D+ > white steps an obscene word , scrawled by some boy with a piece of brick , stood # NPr🅪Sg/VB/J+ NPl/V3+ D/P VB/J NSg/VB+ . VP/J NSg/P I/J/R/Dq NSg/VB+ P D/P NSg/VB P N🅪Sg/VB/J+ . VP > out clearly in the moonlight , and I erased it , drawing my shoe raspingly along # NSg/VB/J/R/P R NPr/J/R/P D N🅪Sg/VB+ . VB/C ISg/#r+ VP/J NPr/ISg+ . N🅪Sg/Vg/J D$+ NSg/VB+ ? P > the stone . Then I wandered down to the beach and sprawled out on the sand . # D NPr🅪SgPl/VB/J+ . NSg/J/R/C ISg/#r+ VP/J N🅪Sg/VB/J/P P D+ NPr/VB+ VB/C VP/J NSg/VB/J/R/P J/P D+ NSg/VB/J+ . > # > Most of the big shore places were closed now and there were hardly any lights # NSg/I/J/R/Dq P D+ NSg/J+ NSg/VB+ NPl/V3+ NSg/VLPt VP/J NSg/J/R/C VB/C R+ NSg/VLPt R I/R/Dq+ NPl/V3+ > except the shadowy , moving glow of a ferryboat across the Sound . And as the moon # VB/C/P D J . Nᴹ/Vg/J NSg/VB P D/P NSg NSg/P D N🅪Sg/VB/J+ . VB/C R/C/P D+ NPr/VB+ > rose higher the inessential houses began to melt away until gradually I became # NPr/VPt/J NSg/JC D NSg/J NPl/V3+ VPt P NSg/VB VB/J C/P R ISg/#r+ VPt > aware of the old island here that flowered once for Dutch sailors ’ eyes — a fresh , # VB/J P D NSg/J NSg/VB+ J/R NSg/I/C/Ddem VP/J NSg/C R/C/P NPrᴹ/VB/J NPl+ . NPl/V3+ . D/P NSg/VB/J . > green breast of the new world . Its vanished trees , the trees that had made way # NPr🅪Sg/VB/J NSg/VB P D NSg/J NSg/VB+ . ISg/D$+ VP/J NPl/V3+ . D+ NPl/V3+ NSg/I/C/Ddem+ VP VP NSg/J > for Gatsby’s house , had once pandered in whispers to the last and greatest of # R/C/P NPr$ NPr/VB+ . VP NSg/C VP/J NPr/J/R/P NPl/V3 P D NSg/VB/J VB/C JS P > all human dreams ; for a transitory enchanted moment man must have held his # NSg/I/J/C/Dq NSg/VB/J NPl/V3+ . R/C/P D/P J VP/J NSg+ NPr/VB/J+ NSg/VXB NSg/VXB VP ISg/D$+ > breath in the presence of this continent , compelled into an esthetic # N🅪Sg/VB/J+ NPr/J/R/P D N🅪Sg/VB P I/Ddem NPr/J+ . VP/J P D/P ? > contemplation he neither understood nor desired , face to face for the last time # Nᴹ NPr/ISg+ I/C VP/J NSg/C VP/J . NSg/VB+ P NSg/VB R/C/P D NSg/VB/J N🅪Sg/VB/J+ > in history with something commensurate to his capacity for wonder . # NPr/J/R/P N🅪Sg+ P NSg/I/J+ VB/J P ISg/D$+ N🅪Sg/J+ R/C/P N🅪Sg/VB . > # > And as I sat there brooding on the old , unknown world , I thought of Gatsby’s # VB/C R/C/P ISg/#r+ NSg/VP/J R Nᴹ/Vg/J J/P D NSg/J . NSg/VB/J+ NSg/VB+ . ISg/#r+ N🅪Sg/VP P NPr$ > wonder when he first picked out the green light at the end of Daisy’s dock . He # N🅪Sg/VB NSg/I/C NPr/ISg+ NSg/J VP/J NSg/VB/J/R/P D NPr🅪Sg/VB/J N🅪Sg/VB/J+ NSg/P D NSg/VB P NPr$ NSg/VB+ . NPr/ISg+ > had come a long way to this blue lawn , and his dream must have seemed so close # VP NSg/VBPp/P D/P NPr/VB/J NSg/J+ P I/Ddem+ N🅪Sg/VB/J+ NSg/VB+ . VB/C ISg/D$+ NSg/VB/J+ NSg/VXB NSg/VXB VP/J NSg/I/J/R/C NSg/VB/J > that he could hardly fail to grasp it . He did not know that it was already # NSg/I/C/Ddem NPr/ISg+ NSg/VXB R NSg/VB/J P NSg/VB NPr/ISg+ . NPr/ISg+ VXPt NSg/R/C VB NSg/I/C/Ddem NPr/ISg+ VLPt R > behind him , somewhere back in that vast obscurity beyond the city , where the # NSg/J/P ISg+ . NSg NSg/VB/J NPr/J/R/P NSg/I/C/Ddem+ NSg/J+ Nᴹ+ NSg/P D+ NSg+ . NSg/R/C D > dark fields of the republic rolled on under the night . # NSg/VB/J NPrPl/V3 P D+ Nᴹ/VB/J+ VP/J J/P NSg/J/P D+ N🅪Sg/VB+ . > # > Gatsby believed in the green light , the orgastic future that year by year # NPr VP/J NPr/J/R/P D NPr🅪Sg/VB/J N🅪Sg/VB/J+ . D ? NSg/J+ NSg/I/C/Ddem+ NSg NSg/P NSg+ > recedes before us . It eluded us then , but that’s no matter — to - morrow we will run # V3 C/P NPr/IPl+ . NPr/ISg+ VP/J NPr/IPl+ NSg/J/R/C . NSg/C/P NSg$ NSg/Dq/P+ N🅪Sg/VB+ . P . NPr/VB IPl+ NPr/VXB NSg/VBPp > faster , stretch out our arms farther . . . . And one fine morning — — — # NSg/JC . N🅪Sg/VB+ NSg/VB/J/R/P D$+ NPl/V3+ VB/JC . . . . VB/C NSg/I/J+ NSg/VB/J+ N🅪Sg/Vg/J+ . . . > # > So we beat on , boats against the current , borne back ceaselessly into the past . # NSg/I/J/R/C IPl+ N🅪Sg/VB/J J/P . NPl/V3+ C/P D NSg/J . VB/J NSg/VB/J R P D NSg/VB/J/P . ================================================ FILE: harper-core/tests/text/tagged/this and that.md ================================================ > " This " and " that " are common and fulfill multiple purposes in everyday English . # . I/Ddem+ . VB/C . NSg/I/C/Ddem+ . VLB NSg/VB/J VB/C VB/NoAm NSg/J/Dq NPl/V3 NPr/J/R/P NSg/J+ NPr🅪Sg/VB/J+ . > As such , disambiguating them is necessary . # R/C/P NSg/I . Nᴹ/Vg/J NSg/IPl+ VL3 NSg/J . > # > This document contains various sentences that use " this " , " that " , " these " , and # I/Ddem+ NSg/VB+ V3 J+ NPl/V3+ NSg/I/C/Ddem+ N🅪Sg/VB . I/Ddem+ . . . NSg/I/C/Ddem+ . . . I/Ddem . . VB/C > " those " in different contexts with a lot of edge cases . # . I/Ddem . NPr/J/R/P NSg/J NPl/V3 P D/P NPr/VB P NSg/VB+ NPl/V3+ . > # > Examples # HeadingStart NPl/V3+ > # > This triangle is nice . # I/Ddem NSg VL3 NPr/J . > This is nice . # I/Ddem+ VL3 NPr/J . > That triangle is nice . # NSg/I/C/Ddem+ NSg VL3 NPr/J . > That is nice . # NSg/I/C/Ddem+ VL3 NPr/J . > These triangles are nice . # I/Ddem NPl VLB NPr/J . > These are nice . # I/Ddem+ VLB NPr/J . > Those triangles are nice . # I/Ddem NPl VLB NPr/J . > Those are nice . # I/Ddem+ VLB NPr/J . > # > This massage is nice . # I/Ddem+ NSg/VB+ VL3 NPr/J . > That massage is nice . # NSg/I/C/Ddem NSg/VB+ VL3 NPr/J . > These massages are nice . # I/Ddem+ NPl/V3+ VLB NPr/J . > Those massages are nice . # I/Ddem+ NPl/V3+ VLB NPr/J . > This massages well . # I/Ddem+ NPl/V3+ NSg/VB/J/R . > That massages well . # NSg/I/C/Ddem+ NPl/V3+ NSg/VB/J/R . > These massage well . # I/Ddem+ NSg/VB+ NSg/VB/J/R . > Those massage well . # I/Ddem+ NSg/VB+ NSg/VB/J/R . > # > That could be a solution . # NSg/I/C/Ddem+ NSg/VXB NSg/VLXB D/P+ N🅪Sg+ . > Find all candidates that could be a solution . # NSg/VB NSg/I/J/C/Dq+ NPl/V3+ NSg/I/C/Ddem+ NSg/VXB NSg/VLXB D/P+ N🅪Sg+ . > # > This is all that I have . # I/Ddem+ VL3 NSg/I/J/C/Dq NSg/I/C/Ddem ISg/#r+ NSg/VXB . > This is all that solutions can do . # I/Ddem+ VL3 NSg/I/J/C/Dq NSg/I/C/Ddem NPl+ NPr/VXB VXB . > That solution can do . # NSg/I/C/Ddem N🅪Sg+ NPr/VXB VXB . > # > We can do this ! # IPl+ NPr/VXB VXB I/Ddem+ . > I can do this and that . # ISg/#r+ NPr/VXB VXB I/Ddem VB/C NSg/I/C/Ddem+ . > # > We unite to stand united in unity . # IPl+ NSg/VB P NSg/VB VP/J NPr/J/R/P Nᴹ+ . ================================================ FILE: harper-core/tests/text/this and that.md ================================================ "This" and "that" are common and fulfill multiple purposes in everyday English. As such, disambiguating them is necessary. This document contains various sentences that use "this", "that", "these", and "those" in different contexts with a lot of edge cases. ## Examples This triangle is nice. This is nice. That triangle is nice. That is nice. These triangles are nice. These are nice. Those triangles are nice. Those are nice. This massage is nice. That massage is nice. These massages are nice. Those massages are nice. This massages well. That massages well. These massage well. Those massage well. That could be a solution. Find all candidates that could be a solution. This is all that I have. This is all that solutions can do. That solution can do. We can do this! I can do this and that. We unite to stand united in unity. ================================================ FILE: harper-html/Cargo.toml ================================================ [package] name = "harper-html" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } tree-sitter-html = "0.23.2" tree-sitter = "0.25.10" [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-html/src/lib.rs ================================================ use harper_core::parsers::{self, Parser, PlainEnglish}; use harper_core::{Token, TokenKind}; use harper_tree_sitter::TreeSitterMasker; use tree_sitter::Node; pub struct HtmlParser { /// Used to grab the text nodes. inner: parsers::Mask, } impl HtmlParser { fn node_condition(n: &Node) -> bool { n.kind() == "text" } } impl Default for HtmlParser { fn default() -> Self { Self { inner: parsers::Mask::new( TreeSitterMasker::new(tree_sitter_html::LANGUAGE.into(), Self::node_condition), PlainEnglish, ), } } } impl Parser for HtmlParser { fn parse(&self, source: &[char]) -> Vec { let mut tokens = self.inner.parse(source); for token in &mut tokens { if let TokenKind::Space(v) = &mut token.kind { *v = (*v).clamp(0, 1); } } tokens } } ================================================ FILE: harper-html/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; /// Creates a unit test checking that the linting of a Markdown document (in /// `tests_sources`) produces the expected number of lints. macro_rules! create_test { ($filename:ident.html, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".html") ) ); let dict = FstDictionary::curated(); let document = Document::new_markdown_default(&source, &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(run_on.html, 0); create_test!(issue_156.html, 0); create_test!(issue_541.html, 0); ================================================ FILE: harper-html/tests/test_sources/issue_156.html ================================================

foo bar

================================================ FILE: harper-html/tests/test_sources/issue_541.html ================================================

This block contains multiple lines of HTML. If Harper is throwing a "too many spaces" lint, it's because harper-html isn't properly parsing the indent.

================================================ FILE: harper-html/tests/test_sources/run_on.html ================================================

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

Here is a paragraph

================================================ FILE: harper-ink/Cargo.toml ================================================ [package] name = "harper-ink" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } tree-sitter-ink-lbz = "0.0.1" tree-sitter = "0.25.10" [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-ink/src/lib.rs ================================================ use harper_core::parsers::{self, Parser, PlainEnglish}; use harper_core::{Token, TokenKind}; use harper_tree_sitter::TreeSitterMasker; use tree_sitter::Node; pub struct InkParser { inner: parsers::Mask, } impl InkParser { fn node_condition(n: &Node) -> bool { matches!(n.kind(), "contentText" | "blockComment" | "lineComment") } } impl Default for InkParser { fn default() -> Self { Self { inner: parsers::Mask::new( TreeSitterMasker::new(tree_sitter_ink_lbz::LANGUAGE.into(), Self::node_condition), PlainEnglish, ), } } } impl Parser for InkParser { fn parse(&self, source: &[char]) -> Vec { let mut tokens = self.inner.parse(source); for token in &mut tokens { if let TokenKind::Space(v) = &mut token.kind { *v = (*v).clamp(0, 1); } } tokens } } ================================================ FILE: harper-ink/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use harper_ink::InkParser; /// Creates a unit test checking that the linting of a Ink document (in /// `tests_sources`) produces the expected number of lints. macro_rules! create_test { ($filename:ident.ink, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".ink") ) ); let dict = FstDictionary::curated(); let document = Document::new(&source, &InkParser::default(), &FstDictionary::curated() ); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(good.ink, 0); create_test!(bad.ink, 5); ================================================ FILE: harper-ink/tests/test_sources/bad.ink ================================================ === Knot === text here is checked: chungus = Stitch ~identifiersAreNotchecked = "but strings are: chungus" // comments are also checked -> chungus /* chungus */ * choices are checked + chungus + normal text ================================================ FILE: harper-ink/tests/test_sources/good.ink ================================================ === Knot === this is a thing = Stitch * an option + another option + normal text + + indented choice + + another indented choice - gather = ThreeWordStitch test ================================================ FILE: harper-jjdescription/Cargo.toml ================================================ [package] name = "harper-jjdescription" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } tree-sitter-jjdescription = "0.0.1" tree-sitter = "0.25.10" [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-jjdescription/src/lib.rs ================================================ use harper_core::Token; use harper_core::parsers::{self, Markdown, MarkdownOptions, Parser}; use harper_tree_sitter::TreeSitterMasker; use tree_sitter::Node; pub struct JJDescriptionParser { /// Used to grab the text nodes, and parse them as markdown. inner: parsers::Mask, } impl JJDescriptionParser { fn node_condition(n: &Node) -> bool { n.kind() == "text" } pub fn new(markdown_options: MarkdownOptions) -> Self { Self { inner: parsers::Mask::new( TreeSitterMasker::new(tree_sitter_jjdescription::language(), Self::node_condition), Markdown::new(markdown_options), ), } } } impl Parser for JJDescriptionParser { fn parse(&self, source: &[char]) -> Vec { self.inner.parse(source) } } ================================================ FILE: harper-jjdescription/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::parsers::MarkdownOptions; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use harper_jjdescription::JJDescriptionParser; /// Creates a unit test checking that the linting of a git commit document (in /// `tests_sources`) produces the expected number of lints. macro_rules! create_test { ($filename:ident.txt, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".txt") ) ); let dict = FstDictionary::curated(); let document = Document::new(source, &JJDescriptionParser::new(MarkdownOptions::default()), &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(simple_description.txt, 1); create_test!(complex_verbose_description.txt, 2); create_test!(conventional_description.txt, 3); ================================================ FILE: harper-jjdescription/tests/test_sources/complex_verbose_description.txt ================================================ This is the the subject This is a first line without typos JJ: This is a comment with a typoo that should be ignored This is a line below the comment with typooos JJ: This commit contains the following changes: JJ: myfile.txt | 1 + JJ: 1 file changed, 1 insertion(+), 0 deletions(-) JJ: ignore-rest diff --git a/myfile.txt b/myfile.txt new file mode 100644 index 0000000000..54f266d2db --- /dev/null +++ b/myfile.txt @@ -0,0 +1,1 @@ +typooo in the file JJ: Lines starting with "JJ:" (like this one) will be removed. ================================================ FILE: harper-jjdescription/tests/test_sources/conventional_description.txt ================================================ feat(stuff): use session-based authentiation BREAKING CHANGE: JWT authentication removed. API clients mustt now use session cookies instead of Authorization headers with bearer tokens. Sessions expire after 24 hours of inactvity. Closes: #247 Reviewed-by: John Doe JJ: Change ID: qrutlxlw JJ: This commit contains the following changes: JJ: M Cargo.lock JJ: M Cargo.toml JJ: A harper-jjdescription/Cargo.toml JJ: A harper-jjdescription/src/lib.rs JJ: A harper-jjdescription/tests/run_tests.rs JJ: A harper-jjdescription/tests/test_sources/complex_verbose_description.txt JJ: A harper-jjdescription/tests/test_sources/conventional_description.txt JJ: A harper-jjdescription/tests/test_sources/simple_description.txt JJ: M harper-ls/Cargo.toml JJ: M harper-ls/src/backend.rs JJ: JJ: Lines starting with "JJ:" (like this one) will be removed. ================================================ FILE: harper-jjdescription/tests/test_sources/simple_description.txt ================================================ A simple description with a typo: descrption ================================================ FILE: harper-literate-haskell/Cargo.toml ================================================ [package] name = "harper-literate-haskell" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } harper-comments = { path = "../harper-comments", version = "1.0.0" } itertools = "0.14.0" paste = "1.0.14" ================================================ FILE: harper-literate-haskell/src/lib.rs ================================================ use harper_comments::CommentParser; use harper_core::{ Lrc, Masker, Token, parsers::{Markdown, MarkdownOptions, Mask, Parser}, }; mod masker; use harper_core::spell::MutableDictionary; use itertools::Itertools; use masker::LiterateHaskellMasker; /// Parses a Literate Haskell document by masking out the code and considering text as Markdown. pub struct LiterateHaskellParser { inner: Lrc, } impl LiterateHaskellParser { pub fn new(inner: Lrc) -> Self { Self { inner } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self { inner: Lrc::new(Markdown::new(markdown_options)), } } pub fn create_ident_dict( &self, source: &[char], markdown_options: MarkdownOptions, ) -> Option { let parser = CommentParser::new_from_language_id("haskell", markdown_options).unwrap(); let mask = LiterateHaskellMasker::code_only().create_mask(source); let code = mask .iter_allowed(source) .flat_map(|(_, src)| src.to_owned()) .collect_vec(); parser.create_ident_dict(&code) } } impl Parser for LiterateHaskellParser { fn parse(&self, source: &[char]) -> Vec { Mask::new(LiterateHaskellMasker::text_only(), self.inner.clone()).parse(source) } } ================================================ FILE: harper-literate-haskell/src/masker.rs ================================================ use harper_core::{CharStringExt, Mask, Masker, Span}; /// Masker for selecting portions of Literate Haskell documents. /// /// Based on the specifications outlined at https://wiki.haskell.org/Literate_programming. pub struct LiterateHaskellMasker { text: bool, code: bool, } impl LiterateHaskellMasker { pub fn text_only() -> Self { Self { text: true, code: false, } } pub fn code_only() -> Self { Self { text: false, code: true, } } } impl Masker for LiterateHaskellMasker { fn create_mask(&self, source: &[char]) -> harper_core::Mask { let mut mask = Mask::new_blank(); let mut location = 0; let mut in_code_env = false; let mut last_line_blank = false; for line in source.split(|c| *c == '\n') { let string_form = line.to_string(); let trimmed = string_form.trim(); let line_is_bird = line.first().is_some_and(|c| *c == '>'); // Code fencing let latex_style = matches!(trimmed, r"\begin{code}" | r"\end{code}"); let code_start = trimmed == r"\begin{code}" || (last_line_blank && line_is_bird); let code_end = trimmed == r"\end{code}" || trimmed.is_empty(); // Toggle on fence if (!in_code_env && code_start) || (in_code_env && code_end) { in_code_env = !in_code_env; // Exclude latex-style fence if latex_style { location += line.len() + 1; // +1 for the newline split on last_line_blank = trimmed.is_empty(); continue; } // Exclude newline after code for bird style if trimmed.is_empty() { location += line.len() + 1; // +1 for the newline split on last_line_blank = true; continue; } } let end_loc = location + line.len(); if (!in_code_env && self.text) || (in_code_env && self.code) { let start_loc = if line_is_bird { location + 2 } else { location }; mask.push_allowed(Span::new(start_loc, end_loc)); } location = end_loc + 1; // +1 for the newline split on last_line_blank = trimmed.is_empty(); } mask.merge_whitespace_sep(source); mask } } #[cfg(test)] mod tests { use harper_core::{Masker, Span}; use itertools::Itertools; use super::LiterateHaskellMasker; #[test] fn bird_format() { let source = r"Text here > fact :: Integer -> Integer > fact 0 = 1 > fact n = n * fact (n-1) Text here " .chars() .collect_vec(); let text_mask = LiterateHaskellMasker::text_only().create_mask(&source); assert_eq!( text_mask .iter_allowed(&source) .map(|(s, _)| s) .collect_vec(), vec![Span::new(0, 10), Span::new(80, 90)], ); let code_mask = LiterateHaskellMasker::code_only().create_mask(&source); assert_eq!( code_mask .iter_allowed(&source) .map(|(s, _)| s) .collect_vec(), vec![Span::new(13, 39), Span::new(42, 52), Span::new(55, 78)], ); } #[test] fn latex_format() { let source = r#"Text here \begin{code} main :: IO () main = print "just an example" \end{code} Text here "# .chars() .collect_vec(); let text_mask = LiterateHaskellMasker::text_only().create_mask(&source); assert_eq!( text_mask .iter_allowed(&source) .map(|(s, _)| s) .collect_vec(), vec![Span::new(0, 9), Span::new(79, 89)], ); let code_mask = LiterateHaskellMasker::code_only().create_mask(&source); assert_eq!( code_mask .iter_allowed(&source) .map(|(s, _)| s) .collect_vec(), vec![Span::new(23, 67)], ); } } ================================================ FILE: harper-literate-haskell/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::parsers::MarkdownOptions; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use harper_literate_haskell::LiterateHaskellParser; /// Creates a unit test checking that the linting of a Markdown document (in /// `tests_sources`) produces the expected number of lints. macro_rules! create_test { ($filename:ident.lhs, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".lhs") ) ); let dict = FstDictionary::curated(); let document = Document::new_curated(&source, &LiterateHaskellParser::new_markdown(MarkdownOptions::default())); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(bird_format.lhs, 2); create_test!(latex_format.lhs, 2); create_test!(mixed_format.lhs, 4); ================================================ FILE: harper-literate-haskell/tests/test_sources/bird_format.lhs ================================================ Sourced from https://wiki.haskell.org/Literate_programming. In Bird-style you have to leave a blnk before the code. > fact :: Integer -> Integer > fact 0 = 1 > fact n = n * fact (n-1) And you have to leave a blnk line after the code as well. ================================================ FILE: harper-literate-haskell/tests/test_sources/latex_format.lhs ================================================ Sourced from https://wiki.haskell.org/Literate_programming. And the definition of the following function would totally screw up my program, so I'm not definining it: \begin{code} main :: IO () main = print "just an example" \end{code} Seee? ================================================ FILE: harper-literate-haskell/tests/test_sources/mixed_format.lhs ================================================ Sourced from https://wiki.haskell.org/Literate_programming. In Bird-style you have to leave a blnk before the code. > fact :: Integer -> Integer > fact 0 = 1 > fact n = n * fact (n-1) And you have to leave a blnk line after the code as well. And the definition of the following function would totally screw up my program, so I'm not definining it: \begin{code} main :: IO () main = print "just an example" \end{code} Seee? ================================================ FILE: harper-ls/Cargo.toml ================================================ [package] name = "harper-ls" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" readme = "README.md" repository = "https://github.com/automattic/harper" [dependencies] harper-stats = { path = "../harper-stats", version = "1.0.0" } harper-literate-haskell = { path = "../harper-literate-haskell", version = "1.0.0" } harper-core = { path = "../harper-core", version = "1.0.0", features = ["concurrent"] } harper-comments = { path = "../harper-comments", version = "1.0.0" } harper-jjdescription = { path = "../harper-jjdescription", version = "1.0.0" } harper-typst = { path = "../harper-typst", version = "1.0.0" } harper-tex = { path = "../harper-tex", version = "1.0.0" } harper-html = { path = "../harper-html", version = "1.0.0" } harper-python = { path = "../harper-python", version = "1.0.0" } harper-asciidoc = { path = "../harper-asciidoc", version = "1.0.0" } tower-lsp-server = "0.22.1" tokio = { version = "1.50.0", default-features = false, features = ["fs", "io-std", "io-util", "macros", "net", "rt-multi-thread", "sync"] } clap = { version = "4.6.0", default-features = false, features = ["derive", "std"] } dirs = "6.0.0" anyhow = "1.0.102" serde_json = "1.0.149" itertools = "0.14.0" tracing = { version = "0.1.44", default-features = false, features = ["std"] } tracing-subscriber = { version = "0.3.22", default-features = false, features = ["fmt", "std"] } resolve-path = "0.1.0" open = "5.3.3" futures = "0.3.32" serde = { version = "1.0.228", features = ["derive"] } globset = "0.4.18" harper-ink = { version = "1.0.0", path = "../harper-ink" } [features] default = [] thesaurus = ["harper-core/thesaurus"] ================================================ FILE: harper-ls/README.md ================================================ # `harper-ls` Documentation for `harper-ls` has moved to the main [website](https://writewithharper.com/docs/integrations/language-server). ================================================ FILE: harper-ls/src/backend.rs ================================================ use std::collections::HashMap; use std::fs::OpenOptions; use std::io::{BufWriter, Write}; use std::path::PathBuf; use std::sync::Arc; use crate::config::Config; use crate::dictionary_io::{load_dict, save_dict}; use crate::document_state::DocumentState; use crate::git_commit_parser::GitCommitParser; use crate::ignored_lints_io::{load_ignored_lints, save_ignored_lints}; use crate::io_utils::fileify_path; use anyhow::{Context, Result, anyhow}; use futures::future::join; use harper_asciidoc::AsciidocParser; use harper_comments::CommentParser; use harper_core::linting::{LintGroup, LintGroupConfig}; use harper_core::parsers::{ CollapseIdentifiers, IsolateEnglish, Markdown, OrgMode, Parser, PlainEnglish, }; use harper_core::spell::{Dictionary, FstDictionary, MergedDictionary, MutableDictionary}; use harper_core::{Dialect, DictWordMetadata, Document, IgnoredLints}; use harper_html::HtmlParser; use harper_ink::InkParser; use harper_jjdescription::JJDescriptionParser; use harper_literate_haskell::LiterateHaskellParser; use harper_python::PythonParser; use harper_stats::{Record, Stats}; use harper_tex::TeX; use harper_typst::Typst; use serde_json::{Value, json}; use tokio::sync::{Mutex, RwLock}; use tower_lsp_server::jsonrpc::Result as JsonResult; use tower_lsp_server::lsp_types::notification::PublishDiagnostics; use tower_lsp_server::lsp_types::{ CodeActionOrCommand, CodeActionParams, CodeActionProviderCapability, CodeActionResponse, ConfigurationItem, Diagnostic, DidChangeConfigurationParams, DidChangeTextDocumentParams, DidChangeWatchedFilesParams, DidChangeWatchedFilesRegistrationOptions, DidCloseTextDocumentParams, DidOpenTextDocumentParams, ExecuteCommandOptions, ExecuteCommandParams, FileChangeType, FileSystemWatcher, GlobPattern, InitializeParams, InitializeResult, InitializedParams, MessageType, PublishDiagnosticsParams, Range, Registration, ServerCapabilities, ServerInfo, TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, TextDocumentSyncSaveOptions, Uri, WatchKind, }; use tower_lsp_server::{Client, LanguageServer, UriExt}; use tracing::{error, info, warn}; /// Return harper-ls version pub fn ls_version() -> &'static str { env!("CARGO_PKG_VERSION") } pub struct Backend { client: Client, root: RwLock, config: RwLock, stats: RwLock, doc_state: Mutex>, } impl Backend { pub fn new(client: Client, config: Config) -> Self { Self { client, root: RwLock::new(".".into()), stats: RwLock::new(Stats::new()), config: RwLock::new(config), doc_state: Mutex::new(HashMap::new()), } } /// Load a specific file's dictionary async fn load_file_dictionary(&self, uri: &Uri) -> anyhow::Result { // VS Code's unsaved documents have "untitled" scheme if uri .scheme() .is_some_and(|scheme| scheme.eq_lowercase("untitled")) { return Ok(MutableDictionary::new()); } let path = self .get_file_dict_path(uri) .await .context("Unable to get the file path.")?; load_dict(path, self.config.read().await.dialect) .await .map_err(|err| info!("{err}")) .or(Ok(MutableDictionary::new())) } /// Compute the location of the ignored lint's store. async fn get_ignored_lints_path(&self, uri: &Uri) -> anyhow::Result { let config = self.config.read().await; Ok(config.ignored_lints_path.join(fileify_path(uri)?)) } async fn save_ignored_lints(&self, uri: &Uri, ignored_lints: &IgnoredLints) -> Result<()> { save_ignored_lints( self.get_ignored_lints_path(uri) .await .context("Unable to get ignored lints path.")?, ignored_lints, ) .await .context("Unable to save ignored lints to path.") } async fn load_ignored_lints(&self, uri: &Uri) -> Result { // VS Code's unsaved documents have "untitled" scheme if uri .scheme() .is_some_and(|scheme| scheme.eq_lowercase("untitled")) { return Ok(IgnoredLints::new()); } Ok(load_ignored_lints( self.get_ignored_lints_path(uri) .await .context("Unable to get ignored lints path.")?, ) .await .map_err(|err| info!("{err}")) .unwrap_or(IgnoredLints::new())) } /// Compute the location of the file's specific dictionary async fn get_file_dict_path(&self, uri: &Uri) -> anyhow::Result { let config = self.config.read().await; Ok(config.file_dict_path.join(fileify_path(uri)?)) } async fn save_file_dictionary(&self, uri: &Uri, dict: impl Dictionary) -> Result<()> { save_dict( self.get_file_dict_path(uri) .await .context("Unable to get the file path.")?, dict, ) .await .context("Unable to save the dictionary to path.") } async fn load_user_dictionary(&self) -> MutableDictionary { let config = self.config.read().await; load_dict(&config.user_dict_path, self.config.read().await.dialect) .await .map_err(|err| info!("{err}")) .unwrap_or(MutableDictionary::new()) } async fn save_user_dictionary(&self, dict: impl Dictionary) -> Result<()> { let config = self.config.read().await; save_dict(&config.user_dict_path, dict) .await .map_err(|err| anyhow!("Unable to save the dictionary to file: {err}")) } async fn load_workspace_dictionary(&self) -> MutableDictionary { let config = self.config.read().await; load_dict( &config.workspace_dict_path, self.config.read().await.dialect, ) .await .map_err(|err| info!("{err}")) .unwrap_or(MutableDictionary::new()) } async fn save_workspace_dictionary(&self, dict: impl Dictionary) -> Result<()> { let config = self.config.read().await; save_dict(&config.workspace_dict_path, dict) .await .map_err(|err| anyhow!("Unable to save the dictionary to file: {err}")) } async fn save_stats(&self) -> Result<()> { let (config, stats) = join(self.config.read(), self.stats.read()).await; if let Some(parent) = config.stats_path.parent() { tokio::fs::create_dir_all(parent).await?; } let mut writer = BufWriter::new( OpenOptions::new() .read(true) .append(true) .create(true) .open(&config.stats_path)?, ); stats.write(&mut writer)?; writer.flush()?; Ok(()) } async fn generate_global_dictionary(&self) -> Result { let mut dict = MergedDictionary::new(); dict.add_dictionary(FstDictionary::curated()); let user_dict = self.load_user_dictionary().await; dict.add_dictionary(Arc::new(user_dict)); let ws_dict = self.load_workspace_dictionary().await; dict.add_dictionary(Arc::new(ws_dict)); Ok(dict) } async fn generate_file_dictionary(&self, uri: &Uri) -> Result { let (global_dictionary, file_dictionary) = tokio::join!( self.generate_global_dictionary(), self.load_file_dictionary(uri) ); let mut global_dictionary = global_dictionary.context("Unable to load the user dictionary.")?; global_dictionary.add_dictionary(Arc::new( file_dictionary.context("Unable to load the file dictionary.")?, )); Ok(global_dictionary) } async fn update_document_from_file(&self, uri: &Uri, language_id: Option<&str>) -> Result<()> { let content = tokio::fs::read_to_string( uri.to_file_path() .ok_or_else(|| anyhow!("Unable to convert URL to file path."))?, ) .await .with_context(|| format!("Unable to read from file {uri:?}"))?; self.update_document(uri, &content, language_id).await } async fn update_document( &self, uri: &Uri, text: &str, language_id: Option<&str>, ) -> Result<()> { self.pull_config().await; // Copy necessary configuration to avoid holding lock. let ( lint_config, markdown_options, isolate_english, dialect, max_file_length, exclude_patterns, ) = { let config = self.config.read().await; ( config.lint_config.clone(), config.markdown_options, config.isolate_english, config.dialect, config.max_file_length, config.exclude_patterns.clone(), ) }; let mut doc_lock = self.doc_state.lock().await; if !exclude_patterns.is_empty() && exclude_patterns.is_match( uri.to_file_path() .ok_or_else(|| anyhow!("Unable to convert URI to file path."))?, ) { doc_lock.remove(uri); return Ok(()); } let ignored_lints = self.load_ignored_lints(uri).await.unwrap_or_default(); let dict = Arc::new( self.generate_file_dictionary(uri) .await .context("Unable to generate the file dictionary.")?, ); let doc_state = doc_lock.entry(uri.clone()).or_insert_with(|| { info!("Constructing new LintGroup for new document."); DocumentState { ignored_lints, linter: LintGroup::new_curated(dict.clone(), dialect) .with_lint_config(lint_config.clone()), language_id: language_id.map(|v| v.to_string()), dict: dict.clone(), uri: uri.clone(), ..Default::default() } }); if doc_state.dict != dict { doc_state.dict = dict.clone(); info!("Constructing new linter because of modified dictionary."); doc_state.linter = LintGroup::new_curated(dict.clone(), dialect).with_lint_config(lint_config.clone()); } let Some(language_id) = &doc_state.language_id else { doc_lock.remove(uri); return Ok(()); }; async fn use_ident_dict<'a>( backend: &'a Backend, new_dict: Arc, parser: impl Parser + 'static, uri: &'a Uri, doc_state: &'a mut DocumentState, lint_config: &LintGroupConfig, dialect: Dialect, ) -> Result> { if doc_state.ident_dict != new_dict { info!("Constructing new linter because of modified ident dictionary."); doc_state.ident_dict = new_dict.clone(); let mut merged = backend.generate_file_dictionary(uri).await?; merged.add_dictionary(new_dict); let merged = Arc::new(merged); doc_state.linter = LintGroup::new_curated(merged.clone(), dialect) .with_lint_config(lint_config.clone()); doc_state.dict = merged.clone(); } Ok(Box::new(CollapseIdentifiers::new( Box::new(parser), Box::new(doc_state.dict.clone()), ))) } let source: Vec = text.chars().collect(); let ts_parser = CommentParser::new_from_language_id(language_id, markdown_options); let parser: Option> = match language_id.as_str() { _ if ts_parser.is_some() => { let ts_parser = ts_parser.unwrap(); if let Some(new_dict) = ts_parser.create_ident_dict(&Arc::new(source)) { Some( use_ident_dict( self, Arc::new(new_dict), ts_parser, uri, doc_state, &lint_config, dialect, ) .await?, ) } else { Some(Box::new(ts_parser)) } } "git-commit" | "gitcommit" | "octo" => { Some(Box::new(GitCommitParser::new_markdown(markdown_options))) } "html" => Some(Box::new(HtmlParser::default())), "asciidoc" => Some(Box::new(AsciidocParser::default())), "ink" => Some(Box::new(InkParser::default())), "jj-commit" | "jjdescription" => { Some(Box::new(JJDescriptionParser::new(markdown_options))) } "lhaskell" | "literate haskell" => { let parser = LiterateHaskellParser::new_markdown(markdown_options); if let Some(new_dict) = parser.create_ident_dict(&Arc::new(source), markdown_options) { Some( use_ident_dict( self, Arc::new(new_dict), parser, uri, doc_state, &lint_config, dialect, ) .await?, ) } else { Some(Box::new(parser)) } } "mail" => Some(Box::new(PlainEnglish)), "markdown" => Some(Box::new(Markdown::new(markdown_options))), "org" => Some(Box::new(OrgMode)), "plaintext" | "text" => Some(Box::new(PlainEnglish)), "python" => Some(Box::new(PythonParser::default())), "typst" => Some(Box::new(Typst)), "tex" | "plaintex" | "latex" => Some(Box::new(TeX::default())), _ => None, }; match parser { None => { doc_lock.remove(uri); } Some(mut parser) => { if isolate_english { parser = Box::new(IsolateEnglish::new(parser, doc_state.dict.clone())); } // Don't lint on documents larger than the configured maximum length. if text.len() <= max_file_length { doc_state.document = Document::new(text, &parser, &doc_state.dict); } else { // Ensures that existing lints are cleared when we stop linting the file. // Otherwise, prior lints will remain, and they will quickly fall out of sync // with the document when it is edited. doc_state.document = Document::default(); } } } Ok(()) } async fn generate_code_actions( &self, uri: &Uri, range: Range, ) -> JsonResult> { let (config, mut doc_states) = tokio::join!(self.config.read(), self.doc_state.lock()); let Some(doc_state) = doc_states.get_mut(uri) else { return Ok(Vec::new()); }; Ok(doc_state.generate_code_actions(range, &config.code_action_config)) } async fn generate_diagnostics(&self, uri: &Uri) -> Vec { // Copy necessary configuration to avoid holding lock. let diagnostic_severity = { let config = self.config.read().await; config.diagnostic_severity }; let mut doc_states = self.doc_state.lock().await; let Some(doc_state) = doc_states.get_mut(uri) else { return Vec::new(); }; doc_state.generate_diagnostics(diagnostic_severity) } async fn publish_diagnostics(&self, uri: &Uri) { let diagnostics = self.generate_diagnostics(uri).await; let result = PublishDiagnosticsParams { uri: uri.clone(), diagnostics, version: None, }; self.client .send_notification::(result) .await; } /// Update the configuration of the server and publish document updates that /// match it. async fn update_config_from_obj(&self, json_obj: Value) { if let Ok(new_config) = Config::from_lsp_config(&self.root.read().await, json_obj) .map_err(|err| error!("{err}")) { let mut config = self.config.write().await; *config = new_config; } } async fn pull_config(&self) { let mut new_config = self .client .configuration(vec![ConfigurationItem { scope_uri: None, section: None, }]) .await .unwrap_or(vec![json!({ "harper-ls": {} })]); if let Some(first) = new_config.pop() { self.update_config_from_obj(first).await; } } } impl LanguageServer for Backend { async fn initialize(&self, params: InitializeParams) -> JsonResult { if let Some(root) = params .workspace_folders .as_ref() // We take the first workspace folder .and_then(|v| v.first()) .map(|f| &f.uri) // Or failing that, the root_uri (which is deprecated in favour of workspace_folders) .or( #[allow(deprecated)] params.root_uri.as_ref(), ) .and_then(|u| u.to_file_path().map(PathBuf::from)) // Or failing that, the root_path (which is deprecated in favour of root_uri) .or( #[allow(deprecated)] params.root_path.as_deref().map(PathBuf::from), ) { // Save the workspace root away for use during the configuration step *self.root.write().await = root; } Ok(InitializeResult { server_info: Some(ServerInfo { name: "harper-ls".to_owned(), version: Some(ls_version().to_owned()), }), capabilities: ServerCapabilities { code_action_provider: Some(CodeActionProviderCapability::Simple(true)), execute_command_provider: Some(ExecuteCommandOptions { commands: vec![ "HarperRecordLint".to_owned(), "HarperAddToUserDict".to_owned(), "HarperAddToWSDict".to_owned(), "HarperAddToFileDict".to_owned(), "HarperOpen".to_owned(), "HarperIgnoreLint".to_owned(), ], ..Default::default() }), text_document_sync: Some(TextDocumentSyncCapability::Options( TextDocumentSyncOptions { open_close: Some(true), change: Some(TextDocumentSyncKind::FULL), will_save: None, will_save_wait_until: None, save: Some(TextDocumentSyncSaveOptions::Supported(true)), }, )), ..Default::default() }, }) } async fn initialized(&self, _: InitializedParams) { self.client .log_message(MessageType::INFO, "Server initialized!") .await; self.pull_config().await; let did_change_watched_files = Registration { id: "workspace/didChangeWatchedFiles".to_owned(), method: "workspace/didChangeWatchedFiles".to_owned(), register_options: Some( serde_json::to_value(DidChangeWatchedFilesRegistrationOptions { watchers: vec![FileSystemWatcher { glob_pattern: GlobPattern::String("**/*".to_owned()), kind: Some(WatchKind::Delete), }], }) .unwrap(), ), }; if let Err(err) = self .client .register_capability(vec![did_change_watched_files]) .await { warn!("Unable to register watch file capability: {}", err); } } async fn did_open(&self, params: DidOpenTextDocumentParams) { self.update_document( ¶ms.text_document.uri, ¶ms.text_document.text, Some(¶ms.text_document.language_id), ) .await .map_err(|err| error!("{err}")) .err(); self.publish_diagnostics(¶ms.text_document.uri).await; } async fn did_change(&self, params: DidChangeTextDocumentParams) { let Some(last) = params.content_changes.last() else { return; }; if let Err(err) = self .update_document(¶ms.text_document.uri, &last.text, None) .await { error!("{err}") } self.publish_diagnostics(¶ms.text_document.uri).await; } async fn did_close(&self, _params: DidCloseTextDocumentParams) { let uri = _params.text_document.uri; let mut doc_lock = self.doc_state.lock().await; doc_lock.remove(&uri); self.client .send_notification::(PublishDiagnosticsParams { uri: uri.clone(), diagnostics: vec![], version: None, }) .await; } async fn did_change_watched_files(&self, params: DidChangeWatchedFilesParams) { let mut doc_lock = self.doc_state.lock().await; let mut uris_to_clear = Vec::new(); for change in ¶ms.changes { if change.typ != FileChangeType::DELETED { continue; } doc_lock.retain(|uri, _| { // `change.uri` could be a directory so use `starts_with` instead of `==`. let to_remove = uri.as_str().starts_with(change.uri.as_str()); if to_remove { uris_to_clear.push(uri.clone()); } !to_remove }); } for uri in &uris_to_clear { self.client .send_notification::(PublishDiagnosticsParams { uri: uri.clone(), diagnostics: vec![], version: None, }) .await; } } async fn execute_command(&self, params: ExecuteCommandParams) -> JsonResult> { let mut string_args = params .arguments .iter() .map(|v| serde_json::from_value::(v.clone()).unwrap()); let Some(first) = string_args.next() else { return Ok(None); }; info!("Received command: \"{}\"", params.command.as_str()); match params.command.as_str() { "HarperRecordLint" => { let Ok(kind) = serde_json::from_str(&first) else { error!("Unable to deserialize RecordKind."); return Ok(None); }; let record = Record::now(kind); let mut stats = self.stats.write().await; stats.records.push(record); } "HarperAddToUserDict" => { let word = &first.chars().collect::>(); let Some(second) = string_args.next() else { return Ok(None); }; let file_uri = second.parse().unwrap(); let mut dict = self.load_user_dictionary().await; dict.append_word(word, DictWordMetadata::default()); self.save_user_dictionary(dict) .await .map_err(|err| error!("{err}")) .err(); self.update_document_from_file(&file_uri, None) .await .map_err(|err| error!("{err}")) .err(); self.publish_diagnostics(&file_uri).await; } "HarperAddToWSDict" => { let word = &first.chars().collect::>(); let Some(second) = string_args.next() else { return Ok(None); }; let file_uri = second.parse().unwrap(); let mut dict = self.load_workspace_dictionary().await; dict.append_word(word, DictWordMetadata::default()); self.save_workspace_dictionary(dict) .await .map_err(|err| error!("{err}")) .err(); self.update_document_from_file(&file_uri, None) .await .map_err(|err| error!("{err}")) .err(); self.publish_diagnostics(&file_uri).await; } "HarperAddToFileDict" => { let word = &first.chars().collect::>(); let Some(second) = string_args.next() else { return Ok(None); }; let file_uri = second.parse().unwrap(); let mut dict = match self .load_file_dictionary(&file_uri) .await .map_err(|err| error!("{err}")) { Ok(dict) => dict, Err(_) => { return Ok(None); } }; dict.append_word(word, DictWordMetadata::default()); self.save_file_dictionary(&file_uri, dict) .await .map_err(|err| error!("{err}")) .err(); self.update_document_from_file(&file_uri, None) .await .map_err(|err| error!("{err}")) .err(); self.publish_diagnostics(&file_uri).await; } "HarperOpen" => match open::that(&first) { Ok(()) => { let message = format!(r#"Opened "{first}""#); self.client.log_message(MessageType::INFO, &message).await; info!("{}", message); } Err(err) => { self.client .log_message(MessageType::ERROR, "Unable to open URL") .await; error!("Unable to open URL: {}", err); } }, "HarperIgnoreLint" => { let Ok(uri) = first.parse() else { error!("Unable to parse URL from command: {first}"); return Ok(None); }; let Some(second) = params.arguments.into_iter().nth(1) else { error!("Not enough arguments to HarperIgnoreLint"); return Ok(None); }; let Ok(lint) = serde_json::from_value(second) else { error!("Unable to parse lint."); return Ok(None); }; let mut doc_lock = self.doc_state.lock().await; let Some(doc_state) = doc_lock.get_mut(&uri) else { error!("Requested document has not been loaded."); return Ok(None); }; doc_state.ignore_lint(&lint); if let Err(_err) = self .save_ignored_lints(&uri, &doc_state.ignored_lints) .await { error!("Unable to save ignored lints."); return Ok(None); } drop(doc_lock); self.publish_diagnostics(&uri).await; } _ => (), } Ok(None) } async fn did_change_configuration(&self, params: DidChangeConfigurationParams) { self.update_config_from_obj(params.settings).await; let uris: Vec = { let mut doc_lock = self.doc_state.lock().await; let config_lock = self.config.read().await; for doc in doc_lock.values_mut() { info!("Constructing new LintGroup for updated configuration."); doc.linter = LintGroup::new_curated(doc.dict.clone(), config_lock.dialect) .with_lint_config(config_lock.lint_config.clone()); } doc_lock.keys().cloned().collect() }; for uri in uris { self.update_document_from_file(&uri, None) .await .map_err(|err| error!("{err}")) .err(); self.publish_diagnostics(&uri).await; } } async fn code_action( &self, params: CodeActionParams, ) -> JsonResult> { let actions = self .generate_code_actions(¶ms.text_document.uri, params.range) .await?; Ok(Some(actions)) } async fn shutdown(&self) -> JsonResult<()> { let doc_states = self.doc_state.lock().await; // Clears the diagnostics for open buffers. for uri in doc_states.keys() { let result = PublishDiagnosticsParams { uri: uri.clone(), diagnostics: vec![], version: None, }; self.client .send_notification::(result) .await; } if self.save_stats().await.is_err() { error!("Unable to save stats.") } Ok(()) } } ================================================ FILE: harper-ls/src/config.rs ================================================ use std::path::{Path, PathBuf}; use anyhow::{Result, bail}; use dirs::{config_dir, data_local_dir}; use globset::{Glob, GlobSet}; use harper_core::{Dialect, linting::LintGroupConfig, parsers::MarkdownOptions}; use resolve_path::PathResolveExt; use serde::{Deserialize, Serialize}; use serde_json::Value; #[derive(Debug, Serialize, Deserialize, Clone, Copy)] #[serde(rename_all = "camelCase")] pub enum DiagnosticSeverity { Error, Warning, Information, Hint, } impl DiagnosticSeverity { /// Converts `self` to the equivalent LSP type. pub fn to_lsp(self) -> tower_lsp_server::lsp_types::DiagnosticSeverity { match self { DiagnosticSeverity::Error => tower_lsp_server::lsp_types::DiagnosticSeverity::ERROR, DiagnosticSeverity::Warning => tower_lsp_server::lsp_types::DiagnosticSeverity::WARNING, DiagnosticSeverity::Information => { tower_lsp_server::lsp_types::DiagnosticSeverity::INFORMATION } DiagnosticSeverity::Hint => tower_lsp_server::lsp_types::DiagnosticSeverity::HINT, } } } /// Configuration for how code actions are displayed. /// Originally motivated by [#89](https://github.com/automattic/harper/issues/89). #[derive(Debug, Clone, Default)] pub struct CodeActionConfig { /// Instructs `harper-ls` to place unstable code actions last. /// In this case, "unstable" refers to their existence and action. /// /// For example, we always want to allow users to add "misspelled" elements /// to dictionary, regardless of the spelling suggestions. pub force_stable: bool, } impl CodeActionConfig { pub fn from_lsp_config(value: Value) -> Result { let mut base = CodeActionConfig::default(); let Value::Object(value) = value else { bail!("The code action configuration must be an object."); }; if let Some(force_stable_val) = value.get("ForceStable") { let Value::Bool(force_stable) = force_stable_val else { bail!("ForceStable must be a boolean value."); }; base.force_stable = *force_stable; }; Ok(base) } } #[derive(Debug, Clone)] pub struct Config { pub user_dict_path: PathBuf, pub file_dict_path: PathBuf, pub workspace_dict_path: PathBuf, pub ignored_lints_path: PathBuf, pub stats_path: PathBuf, pub lint_config: LintGroupConfig, pub diagnostic_severity: DiagnosticSeverity, pub code_action_config: CodeActionConfig, pub isolate_english: bool, pub markdown_options: MarkdownOptions, pub dialect: Dialect, /// Maximum length (in bytes) a file can have before it's skipped. /// Above this limit, the file will not be linted. pub max_file_length: usize, pub exclude_patterns: GlobSet, } impl Config { pub fn from_lsp_config(workspace_root: &Path, value: Value) -> Result { let mut base = Config::default(); let workspace_root = workspace_root.canonicalize()?; let workspace_root = workspace_root.as_path(); let Value::Object(value) = value else { bail!("Settings must be an object."); }; let Some(Value::Object(value)) = value.get("harper-ls") else { bail!("Settings must contain a \"harper-ls\" key."); }; if let Some(v) = value.get("userDictPath") { if !v.is_string() { bail!("userDict path must be a string."); } let path = v.as_str().unwrap(); if !path.is_empty() { base.user_dict_path = path.try_resolve_in(workspace_root)?.to_path_buf(); } } if let Some(v) = value.get("fileDictPath") { if !v.is_string() { bail!("fileDict path must be a string."); } let path = v.as_str().unwrap(); if !path.is_empty() { base.file_dict_path = path.try_resolve_in(workspace_root)?.to_path_buf(); } } if let Some(v) = value.get("workspaceDictPath") { if !v.is_string() { bail!("workspaceDict path must be a string."); } let path = v.as_str().unwrap(); if !path.is_empty() { base.workspace_dict_path = path.try_resolve_in(workspace_root)?.to_path_buf(); } } else { // Resolve the default path in the project root base.workspace_dict_path = base .workspace_dict_path .try_resolve_in(workspace_root)? .to_path_buf(); } if let Some(v) = value.get("ignoredLintsPath") { if !v.is_string() { bail!("ignoredLintsPath path must be a string."); } let path = v.as_str().unwrap(); if !path.is_empty() { base.ignored_lints_path = path.try_resolve_in(workspace_root)?.to_path_buf(); } } if let Some(v) = value.get("statsPath") { if let Value::String(path) = v { base.file_dict_path = path.try_resolve_in(workspace_root)?.to_path_buf(); } else { bail!("fileDict path must be a string."); } } if let Some(v) = value.get("linters") { base.lint_config = serde_json::from_value(v.clone())?; } if let Some(v) = value.get("diagnosticSeverity") { base.diagnostic_severity = serde_json::from_value(v.clone())?; } if let Some(v) = value.get("dialect") { base.dialect = serde_json::from_value(v.clone())?; } if let Some(v) = value.get("codeActions") { base.code_action_config = CodeActionConfig::from_lsp_config(v.clone())?; } if let Some(v) = value.get("isolateEnglish") { if let Value::Bool(v) = v { base.isolate_english = *v; } else { bail!("isolateEnglish path must be a boolean."); } } if let Some(v) = value.get("maxFileLength") { base.max_file_length = serde_json::from_value(v.clone())?; } if let Some(v) = value.get("markdown") && let Some(v) = v.get("IgnoreLinkTitle") { base.markdown_options.ignore_link_title = serde_json::from_value(v.clone())?; } if let Some(v) = value.get("excludePatterns") { let Some(a) = v.as_array() else { bail!("excludePatterns must be an array."); }; let patterns: Vec = a.to_vec(); if !patterns.is_empty() { let mut builder = GlobSet::builder(); for pattern in patterns { builder.add(Glob::new(pattern.as_str().unwrap())?); } base.exclude_patterns = builder.build()?; } } Ok(base) } } impl Default for Config { fn default() -> Self { Self { user_dict_path: config_dir().unwrap().join("harper-ls/dictionary.txt"), file_dict_path: data_local_dir() .unwrap() .join("harper-ls/file_dictionaries/"), workspace_dict_path: ".harper-dictionary.txt".into(), ignored_lints_path: data_local_dir().unwrap().join("harper-ls/ignored_lints/"), stats_path: data_local_dir().unwrap().join("harper-ls/stats.txt"), lint_config: LintGroupConfig::default(), diagnostic_severity: DiagnosticSeverity::Hint, code_action_config: CodeActionConfig::default(), isolate_english: false, markdown_options: MarkdownOptions::default(), dialect: Dialect::American, max_file_length: 120_000, exclude_patterns: GlobSet::empty(), } } } ================================================ FILE: harper-ls/src/diagnostics.rs ================================================ use std::collections::HashMap; use harper_core::linting::{Lint, Suggestion}; use harper_core::{CharStringExt, Document}; use harper_stats::RecordKind; use serde_json::Value; use tower_lsp_server::lsp_types::{ CodeAction, CodeActionKind, CodeActionOrCommand, Command, Diagnostic, NumberOrString, TextEdit, Uri, WorkspaceEdit, }; use crate::config::{CodeActionConfig, DiagnosticSeverity}; use crate::pos_conv::span_to_range; pub fn lints_to_diagnostics<'a>( source: &[char], lints: impl IntoIterator, severity: DiagnosticSeverity, ) -> Vec { lints .into_iter() .flat_map(|(origin_tag, lints)| { lints .iter() .map(|lint| lint_to_diagnostic(lint, source, origin_tag, severity)) }) .collect() } pub fn lint_to_code_actions<'a>( lint: &'a Lint, uri: &'a Uri, document: &Document, config: &CodeActionConfig, ) -> Vec { let mut results = Vec::new(); let source = document.get_source(); results.extend( lint.suggestions .iter() .flat_map(|suggestion| { let range = span_to_range(source, lint.span); let replace_string = match suggestion { Suggestion::ReplaceWith(with) => with.iter().collect(), Suggestion::Remove => "".to_string(), Suggestion::InsertAfter(with) => format!( "{}{}", lint.span.get_content_string(source), with.to_string() ), }; Some(CodeAction { title: suggestion.to_string(), kind: Some(CodeActionKind::QUICKFIX), diagnostics: None, edit: Some(WorkspaceEdit { changes: Some(HashMap::from([( uri.clone(), vec![TextEdit { range, new_text: replace_string, }], )])), document_changes: None, change_annotations: None, }), command: Some(Command { title: "Record lint statistic".to_owned(), command: "HarperRecordLint".to_owned(), arguments: Some(vec![Value::String( serde_json::to_string(&RecordKind::from_lint(lint, document)).unwrap(), )]), }), is_preferred: None, disabled: None, data: None, }) }) .map(CodeActionOrCommand::CodeAction), ); results.push(CodeActionOrCommand::Command(Command { title: "Ignore Harper error.".to_owned(), command: "HarperIgnoreLint".to_owned(), arguments: Some(vec![ serde_json::Value::String(uri.to_string()), serde_json::to_value(lint).unwrap(), ]), })); if lint.lint_kind.is_spelling() { let orig = lint.span.get_content_string(source); results.push(CodeActionOrCommand::Command(Command::new( format!("Add \"{orig}\" to the user dictionary."), "HarperAddToUserDict".to_string(), Some(vec![orig.clone().into(), uri.to_string().into()]), ))); results.push(CodeActionOrCommand::Command(Command::new( format!("Add \"{orig}\" to the workspace dictionary."), "HarperAddToWSDict".to_string(), Some(vec![orig.clone().into(), uri.to_string().into()]), ))); results.push(CodeActionOrCommand::Command(Command::new( format!("Add \"{orig}\" to the file dictionary."), "HarperAddToFileDict".to_string(), Some(vec![orig.into(), uri.to_string().into()]), ))); } if config.force_stable { results.reverse(); } results } fn lint_to_diagnostic( lint: &Lint, source: &[char], origin_tag: &str, severity: DiagnosticSeverity, ) -> Diagnostic { let range = span_to_range(source, lint.span); Diagnostic { range, severity: Some(severity.to_lsp()), code_description: None, source: Some("Harper".to_owned()), code: Some(NumberOrString::String(origin_tag.to_string())), message: lint.message.clone(), related_information: None, tags: None, data: None, } } ================================================ FILE: harper-ls/src/dictionary_io.rs ================================================ use harper_core::DialectFlags; use itertools::Itertools; use std::path::Path; use harper_core::spell::{Dictionary, MutableDictionary}; use harper_core::{Dialect, DictWordMetadata}; use tokio::fs::{self, File}; use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, BufReader, BufWriter, Result}; /// Save the contents of a dictionary to a file. /// Ensures that the path to the destination exists. pub async fn save_dict(path: impl AsRef, dict: impl Dictionary) -> Result<()> { if let Some(parent) = path.as_ref().parent() { fs::create_dir_all(parent).await?; } let file = File::create(path.as_ref()).await?; let mut write = BufWriter::new(file); write_word_list(dict, &mut write).await?; write.flush().await?; Ok(()) } /// Write a dictionary somewhere. async fn write_word_list(dict: impl Dictionary, mut w: impl AsyncWrite + Unpin) -> Result<()> { let mut cur_str = String::new(); for word in dict.words_iter().sorted() { cur_str.clear(); cur_str.extend(word); w.write_all(cur_str.as_bytes()).await?; w.write_all(b"\n").await?; } Ok(()) } /// Load a dictionary from a file on disk. pub async fn load_dict(path: impl AsRef, dialect: Dialect) -> Result { let file = File::open(path.as_ref()).await?; let read = BufReader::new(file); dict_from_word_list(read, dialect).await } /// Load a dictionary from a list of words. /// It could definitely be optimized to use less memory. /// Right now it isn't an issue. async fn dict_from_word_list( mut r: impl AsyncRead + Unpin, dialect: Dialect, ) -> Result { let mut str = String::new(); r.read_to_string(&mut str).await?; let mut dict = MutableDictionary::new(); dict.extend_words(str.lines().map(|l| { ( l.chars().collect::>(), DictWordMetadata { dialects: DialectFlags::from_dialect(dialect), ..Default::default() }, ) })); Ok(dict) } #[cfg(test)] mod tests { use super::*; use harper_core::spell::MutableDictionary; use std::io::Cursor; const TEST_UNSORTED_WORDS: [&str; 10] = [ "peafowl", "housebroken", "blackjack", "Žižek", "BMX", "icebox", "stetting", "ツ", "ASCII", "link", ]; const TEST_SORTED_WORDS: [&str; 10] = [ "ASCII", "BMX", "blackjack", "housebroken", "icebox", "link", "peafowl", "stetting", "Žižek", "ツ", ]; /// Creates an unsorted `MutableDictionary` for testing. fn get_test_unsorted_dict() -> MutableDictionary { let mut test_unsorted_dict = MutableDictionary::new(); test_unsorted_dict.extend_words( TEST_UNSORTED_WORDS .map(|w| (w.chars().collect::>(), DictWordMetadata::default())), ); test_unsorted_dict } #[tokio::test] async fn writes_sorted_word_list() { let test_unsorted_dict = get_test_unsorted_dict(); let mut test_writer = Cursor::new(Vec::new()); write_word_list(test_unsorted_dict, &mut test_writer) .await .expect("writing to Vec should not fail. (Unless OOM?)"); assert_eq!( // Append trailing newline to match write_word_list output format. TEST_SORTED_WORDS.join("\n") + "\n", String::from_utf8_lossy(&test_writer.into_inner()) ); } } ================================================ FILE: harper-ls/src/document_state.rs ================================================ use crate::config::{CodeActionConfig, DiagnosticSeverity}; use crate::diagnostics::{lint_to_code_actions, lints_to_diagnostics}; use crate::pos_conv::range_to_span; use harper_core::linting::{Lint, LintGroup, Linter}; use harper_core::spell::{MergedDictionary, MutableDictionary}; use harper_core::{Document, IgnoredLints, TokenKind, remove_overlaps_map}; use harper_core::{Lrc, Token}; use tower_lsp_server::lsp_types::{CodeActionOrCommand, Command, Diagnostic, Range, Uri}; pub struct DocumentState { pub document: Document, pub ident_dict: Lrc, pub dict: Lrc, pub linter: LintGroup, pub language_id: Option, pub ignored_lints: IgnoredLints, pub uri: Uri, } impl DocumentState { pub fn ignore_lint(&mut self, lint: &Lint) { self.ignored_lints.ignore_lint(lint, &self.document); } pub fn generate_diagnostics(&mut self, severity: DiagnosticSeverity) -> Vec { let temp = self.linter.config.clone(); self.linter.config.fill_with_curated(); let mut lints = self.linter.organized_lints(&self.document); self.linter.config = temp; for value in lints.values_mut() { self.ignored_lints.remove_ignored(value, &self.document); } remove_overlaps_map(&mut lints); lints_to_diagnostics( self.document.get_full_content(), lints .iter() .map(|(origin_tag, lints)| (origin_tag.as_str(), lints.as_slice())), severity, ) } /// Generate code actions results for a selected area. pub fn generate_code_actions( &mut self, range: Range, code_action_config: &CodeActionConfig, ) -> Vec { let temp = self.linter.config.clone(); self.linter.config.fill_with_curated(); let mut lints = self.linter.lint(&self.document); self.linter.config = temp; self.ignored_lints .remove_ignored(&mut lints, &self.document); lints.sort_by_key(|l| l.priority); let source_chars = self.document.get_full_content(); // Find lints whole span overlaps with range let span = range_to_span(source_chars, range).with_len(1); let mut actions: Vec = lints .into_iter() .filter(|lint| lint.span.overlaps_with(span)) .flat_map(|lint| { lint_to_code_actions(&lint, &self.uri, &self.document, code_action_config) }) .collect(); if let Some(Token { kind: TokenKind::Url, span, .. }) = self.document.get_token_at_char_index(span.start) { actions.push(CodeActionOrCommand::Command(Command::new( "Open URL".to_string(), "HarperOpen".to_string(), Some(vec![self.document.get_span_content_str(span).into()]), ))) } actions } } impl Default for DocumentState { fn default() -> Self { Self { document: Default::default(), ident_dict: Default::default(), dict: Default::default(), linter: Default::default(), language_id: Default::default(), ignored_lints: Default::default(), uri: "https://example.net".parse().unwrap(), } } } ================================================ FILE: harper-ls/src/git_commit_parser.rs ================================================ use harper_core::Lrc; use harper_core::parsers::{Markdown, MarkdownOptions, Parser}; /// A Harper parser for Git commit files #[derive(Clone)] pub struct GitCommitParser { inner: Lrc, } impl GitCommitParser { pub fn new(parser: Lrc) -> Self { Self { inner: parser } } pub fn new_markdown(markdown_options: MarkdownOptions) -> Self { Self::new(Lrc::new(Markdown::new(markdown_options))) } } impl Parser for GitCommitParser { /// Admittedly a somewhat naive implementation. /// We're going to get _something_ to work, before we polish it off. fn parse(&self, source: &[char]) -> Vec { // Locate the first `#` let end = source .iter() .position(|c| *c == '#') .unwrap_or(source.len()); self.inner.parse(&source[0..end]) } } ================================================ FILE: harper-ls/src/ignored_lints_io.rs ================================================ use std::path::Path; use anyhow::Result; use harper_core::IgnoredLints; use tokio::{ fs::{self, File}, io::{AsyncReadExt, AsyncWriteExt, BufReader, BufWriter}, }; /// Save the contents of a dictionary to a file. /// Ensures that the path to the destination exists. pub async fn save_ignored_lints( path: impl AsRef, ignored_lints: &IgnoredLints, ) -> Result<()> { if let Some(parent) = path.as_ref().parent() { fs::create_dir_all(parent).await?; } let file = File::create(path.as_ref()).await?; let mut write = BufWriter::new(file); let json = serde_json::to_string_pretty(ignored_lints)?; write.write_all(json.as_bytes()).await?; write.flush().await?; Ok(()) } /// Load ignored lints from a file on disk. pub async fn load_ignored_lints(path: impl AsRef) -> Result { let file = File::open(path.as_ref()).await?; let mut read = BufReader::new(file); let mut buf = String::new(); read.read_to_string(&mut buf).await?; Ok(serde_json::from_str(&buf)?) } ================================================ FILE: harper-ls/src/io_utils.rs ================================================ use anyhow::anyhow; use std::path::{Component, PathBuf}; use tower_lsp_server::{UriExt, lsp_types::Uri}; /// Rewrites a path to a filename using the same conventions as /// [Neovim's undo-files](https://neovim.io/doc/user/options.html#'undodir'). pub fn fileify_path(uri: &Uri) -> anyhow::Result { let mut rewritten = String::new(); // We assume all URLs are local files and have a base. for seg in uri .to_file_path() .ok_or_else(|| anyhow!("Unable to convert URI to file path."))? .components() { if !matches!(seg, Component::RootDir) { rewritten.push_str(&seg.as_os_str().to_string_lossy()); rewritten.push('%'); } } Ok(rewritten.into()) } ================================================ FILE: harper-ls/src/main.rs ================================================ #![doc = include_str!("../README.md")] use std::io::stderr; use config::Config; use tokio::net::TcpListener; mod backend; mod config; mod diagnostics; mod dictionary_io; mod document_state; mod git_commit_parser; mod ignored_lints_io; mod io_utils; mod pos_conv; use backend::Backend; use clap::Parser; use tower_lsp_server::{LspService, Server}; use tracing::Level; use tracing_subscriber::FmtSubscriber; static DEFAULT_ADDRESS: &str = "127.0.0.1:4000"; /// Start a language server to provide grammar checking inside of developer /// environments. /// /// Will listen on 127.0.0.1:4000 by default. #[derive(Debug, Parser)] #[command(version, about)] struct Args { /// Set to listen on standard input / output rather than TCP. #[arg(short, long, default_value_t = false)] stdio: bool, } // Setting worker threads to four means the process will use about five threads total // This is because worker threads do not include blocking threads #[tokio::main(worker_threads = 1)] async fn main() -> anyhow::Result<()> { let subscriber = FmtSubscriber::builder() .map_writer(move |_| stderr) .with_ansi(false) .with_max_level(Level::WARN) .finish(); tracing::subscriber::set_global_default(subscriber)?; let args = Args::parse(); let config = Config::default(); let (service, socket) = LspService::new(|client| Backend::new(client, config)); if args.stdio { let stdin = tokio::io::stdin(); let stdout = tokio::io::stdout(); Server::new(stdin, stdout, socket).serve(service).await; } else { let listener = TcpListener::bind(DEFAULT_ADDRESS).await.unwrap(); println!("Listening on {DEFAULT_ADDRESS}"); let (stream, _) = listener.accept().await.unwrap(); let (read, write) = tokio::io::split(stream); Server::new(read, write, socket).serve(service).await; } Ok(()) } ================================================ FILE: harper-ls/src/pos_conv.rs ================================================ //! This module includes various conversions from the index-based [`Span`]s that //! Harper uses, and the Ranges that the LSP uses. use harper_core::Span; use tower_lsp_server::lsp_types::{Position, Range}; pub fn span_to_range(source: &[char], span: Span) -> Range { let start = index_to_position(source, span.start); let end = index_to_position(source, span.end); Range { start, end } } fn index_to_position(source: &[char], index: usize) -> Position { let before = &source[0..index]; let newline_indices: Vec<_> = before .iter() .enumerate() .filter_map(|(idx, c)| if *c == '\n' { Some(idx + 1) } else { None }) .collect(); let lines = newline_indices.len(); let last_newline_idx = newline_indices.last().copied().unwrap_or(0); let cols: usize = source[last_newline_idx..index] .iter() .map(|c| c.len_utf16()) .sum(); Position { line: lines as u32, character: cols as u32, } } /// Converts a position to a (zero-based) character index within the source character array. /// /// The position is converted to an index using saturating arithmetic. If the requested line index /// is too high, the index of the last character in the source is returned. If the line is /// in-bounds but the requested character isn't, the last character of that line is returned. fn position_to_index(source: &[char], position: Position) -> usize { // Find target line. let Some(target_line) = source // Split including the newline character so we don't lose any characters. .split_inclusive(|char| *char == '\n') .nth(position.line as usize) else { // Requested line index is too high. // Return the last char in `source' as the closest approximation. // Uses `saturating_sub` to avoid underflow when `source` is empty. return source.len().saturating_sub(1); }; // Get a pointer to the char we seek. // Check if specified character index is within bounds of the target line. let target_char_pointer = if position.character < target_line .len() .try_into() .expect("target_line.len() can fit in u32") { // Character index is inside the bounds of the specified line. // Calculate pointer to the char we're looking for. target_line .as_ptr() .wrapping_add(position.character as usize) } else { // Character index is outside the bounds of the specified line. // Get pointer to the last character of the line. target_line.last().expect("line cannot be empty") }; // Convert the char pointer to its index within `source`. // Note: this could be simplified with `offset_from`, but that would require `unsafe`. (target_char_pointer as usize - source.as_ptr() as usize) / size_of::() } pub fn range_to_span(source: &[char], range: Range) -> Span { let start = position_to_index(source, range.start); let end = position_to_index(source, range.end); Span::new(start, end) } #[cfg(test)] mod tests { use tower_lsp_server::lsp_types::{Position, Range}; use super::{index_to_position, position_to_index, range_to_span}; #[test] fn first_line_correct() { let source: Vec<_> = "Hello there.".chars().collect(); let start = Position { line: 0, character: 4, }; let i = position_to_index(&source, start); assert_eq!(i, 4); let p = index_to_position(&source, i); assert_eq!(p, start) } #[test] fn reversible_position_conv() { let source: Vec<_> = "There was a man,\n his voice had timbre,\n unlike a boy." .chars() .collect(); let a = Position { line: 1, character: 2, }; let b = position_to_index(&source, a); assert_eq!(b, 19); let c = index_to_position(&source, b); let d = position_to_index(&source, a); assert_eq!(a, c); assert_eq!(b, d); } #[test] fn end_of_line() { let source: Vec<_> = "This is a short test\n".chars().collect(); let a = Position { line: 0, character: 20, }; assert_eq!(position_to_index(&source, a), 20); } #[test] fn end_of_file() { let source: Vec<_> = "This is a short test".chars().collect(); let a = Position { line: 0, character: 19, }; assert_eq!(position_to_index(&source, a), 19); } #[test] fn issue_250() { let source: Vec<_> = "Hello thur\n".chars().collect(); let range = Range { start: Position { line: 0, character: 9, }, end: Position { line: 0, character: 10, }, }; let out = range_to_span(&source, range); assert_eq!(out.start, 9); assert_eq!(out.end, 10); } /// Ensures that `position_to_index` does not produce an incorrect index of 0 for an input /// `Position` of `{ line: 1, character: 0 }`. /// Related to: https://github.com/Automattic/harper/issues/1253 #[test] fn pos_to_index_correct_for_l1_c0() { let source: Vec<_> = ". one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twenty-one twenty-two twenty-three twenty-four twenty-five twenty-six twenty-seven twenty-eight twenty-nine thirty thirty-one\n".chars().collect(); let position = Position { line: 1, character: 0, }; let out_index = position_to_index(&source, position); assert_ne!(out_index, 0); } /// Ensures `position_to_index` produces the correct result when indexing line 0 character 0. #[test] fn pos_to_index_off_by_one_check_l0_c0() { let source: Vec<_> = "abc\ndef\nghi\njkl".chars().collect(); let position = Position { line: 0, character: 0, }; let out_index = position_to_index(&source, position); assert_eq!(source[out_index], 'a'); } /// Ensures `position_to_index` produces the correct result when indexing a non-zero line and /// character. #[test] fn pos_to_index_off_by_one_check_l2_c1() { let source: Vec<_> = "abc\ndef\nghi\njkl".chars().collect(); let position = Position { line: 2, character: 1, }; let out_index = position_to_index(&source, position); assert_eq!(source[out_index], 'h'); } /// Ensures `position_to_index` produces an index of 0 when indexing line 0 character 0 of /// a source that contains only a newline (`\n`). #[test] fn pos_to_index_newline_only_l0_c0() { let source: Vec<_> = "\n".chars().collect(); let position = Position { line: 0, character: 0, }; let out_index = position_to_index(&source, position); assert_eq!(out_index, 0); } /// Ensures `position_to_index` produces the last character index when indexing an out of /// bounds line in a source that contains only newlines (`\n`). #[test] fn pos_to_index_newlines_only_l7_c0() { let source: Vec<_> = "\n\n\n".chars().collect(); let position = Position { line: 7, character: 0, }; let out_index = position_to_index(&source, position); assert_eq!(out_index, 2); } /// Ensures `position_to_index` gives the last character of the line when indexing an out of /// bounds character. #[test] fn pos_to_index_out_of_bounds_char() { let source: Vec<_> = "abc\ndef\nghi\njkl".chars().collect(); let position = Position { line: 3, // "jkl" character: 8, }; let out_index = position_to_index(&source, position); assert_eq!(source[out_index], 'l'); } } ================================================ FILE: harper-pos-utils/Cargo.toml ================================================ [package] name = "harper-pos-utils" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] rs-conllu = "0.3.0" hashbrown = { version = "0.16.1", features = ["serde"] } strum = "0.28.0" strum_macros = "0.28.0" serde = { version = "1.0.228", features = ["derive"] } is-macro = "0.3.7" rand = { version = "0.10.0", optional = true } burn = { version = "0.19.1", default-features = false, features = ["std"] } burn-ndarray = { version = "0.19.0", default-features = false } serde_json = "1.0.149" lru = "0.16.3" rayon = { version = "1.11.0", optional = true } [features] default = [] training = ["dep:rand", "burn/train", "burn/autodiff"] threaded = ["dep:rayon"] ================================================ FILE: harper-pos-utils/src/chunker/brill_chunker/mod.rs ================================================ mod patch; #[cfg(feature = "training")] use std::path::Path; #[cfg(feature = "training")] use crate::word_counter::WordCounter; use crate::{ UPOS, chunker::{Chunker, upos_freq_dict::UPOSFreqDict}, }; use patch::Patch; use serde::{Deserialize, Serialize}; /// A [`Chunker`] implementation based on the work by Eric Brill. /// /// Additional reading: /// /// - [Continuations on Transformation-based Learning](https://elijahpotter.dev/articles/more-transformation-based-learning) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BrillChunker { base: UPOSFreqDict, patches: Vec, } impl BrillChunker { pub fn new(base: UPOSFreqDict) -> Self { Self { base, patches: Vec::new(), } } fn apply_patches(&self, sentence: &[String], tags: &[Option], np_states: &mut [bool]) { for patch in &self.patches { for i in 0..sentence.len() { if patch.from == np_states[i] && patch.criteria.fulfils(sentence, tags, np_states, i) { np_states[i] = !np_states[i]; } } } } } impl Chunker for BrillChunker { fn chunk_sentence(&self, sentence: &[String], tags: &[Option]) -> Vec { let mut initial_pass = self.base.chunk_sentence(sentence, tags); self.apply_patches(sentence, tags, &mut initial_pass); initial_pass } } #[cfg(feature = "training")] type CandidateArgs = (Vec, Vec>, Vec); #[cfg(feature = "training")] impl BrillChunker { /// Tag a provided sentence with the tagger, providing the "correct" tags (from a dataset or /// other source), returning the number of errors. pub fn count_patch_errors( &self, sentence: &[String], tags: &[Option], base_flags: &[bool], correct_np_flags: &[bool], ) -> usize { let mut flags = base_flags.to_vec(); self.apply_patches(sentence, tags, &mut flags); let mut loss = 0; for (a, b) in flags.into_iter().zip(correct_np_flags) { if a != *b { loss += 1; } } loss } /// Tag a provided sentence with the tagger, providing the "correct" tags (from a dataset or /// other source), returning the number of errors. pub fn count_chunk_errors( &self, sentence: &[String], tags: &[Option], correct_np_flags: &[bool], relevant_words: &mut WordCounter, ) -> usize { let flags = self.chunk_sentence(sentence, tags); let mut loss = 0; for ((a, b), word) in flags.into_iter().zip(correct_np_flags).zip(sentence) { if a != *b { loss += 1; relevant_words.inc(word); } } loss } /// To speed up training, only try a subset of all possible candidates. /// How many to select is given by the `candidate_selection_chance`. A higher chance means a /// longer training time. fn epoch(&mut self, training_files: &[impl AsRef], candidate_selection_chance: f32) { use crate::conllu_utils::iter_sentences_in_conllu; use rs_conllu::Sentence; use std::time::Instant; assert!((0.0..=1.0).contains(&candidate_selection_chance)); let mut total_tokens = 0; let mut error_counter = 0; let sentences: Vec = training_files .iter() .flat_map(iter_sentences_in_conllu) .collect(); let mut sentences_flagged: Vec = Vec::new(); for sent in &sentences { use hashbrown::HashSet; use crate::chunker::np_extraction::locate_noun_phrases_in_sent; let mut toks: Vec = Vec::new(); let mut tags = Vec::new(); for token in &sent.tokens { let form = token.form.clone(); if let Some(last) = toks.last_mut() { match form.as_str() { "sn't" | "n't" | "'ll" | "'ve" | "'re" | "'d" | "'m" | "'s" => { last.push_str(&form); continue; } _ => {} } } toks.push(form); tags.push(token.upos.and_then(UPOS::from_conllu)); } let actual = locate_noun_phrases_in_sent(sent); let actual_flat = actual.into_iter().fold(HashSet::new(), |mut a, b| { a.extend(b.into_iter()); a }); let mut actual_seq = Vec::new(); for el in actual_flat { if el >= actual_seq.len() { actual_seq.resize(el + 1, false); } actual_seq[el] = true; } sentences_flagged.push((toks, tags, actual_seq)); } let mut relevant_words = WordCounter::default(); for (tok_buf, tag_buf, flag_buf) in &sentences_flagged { total_tokens += tok_buf.len(); error_counter += self.count_chunk_errors( tok_buf.as_slice(), tag_buf, flag_buf.as_slice(), &mut relevant_words, ); } println!("============="); println!("Total tokens in training set: {total_tokens}"); println!("Tokens incorrectly flagged: {error_counter}"); println!( "Error rate: {}%", error_counter as f32 / total_tokens as f32 * 100. ); // Before adding any patches, let's get a good base. let mut base_flags = Vec::new(); for (toks, tags, _) in &sentences_flagged { base_flags.push(self.chunk_sentence(toks, tags)); } let all_candidates = Patch::generate_candidate_patches(&relevant_words); let mut pruned_candidates: Vec = rand::seq::IndexedRandom::sample( all_candidates.as_slice(), &mut rand::rng(), (all_candidates.len() as f32 * candidate_selection_chance) as usize, ) .cloned() .collect(); let start = Instant::now(); #[cfg(feature = "threaded")] rayon::slice::ParallelSliceMut::par_sort_by_cached_key( pruned_candidates.as_mut_slice(), |candidate: &Patch| { self.score_candidate(candidate.clone(), &sentences_flagged, &base_flags) }, ); #[cfg(not(feature = "threaded"))] pruned_candidates.sort_by_cached_key(|candidate| { self.score_candidate(candidate.clone(), &sentences_flagged, &base_flags) }); let duration = start.elapsed(); let seconds = duration.as_secs(); let millis = duration.subsec_millis(); println!( "It took {} seconds and {} milliseconds to search through {} candidates at {} c/sec.", seconds, millis, pruned_candidates.len(), pruned_candidates.len() as f32 / seconds as f32 ); if let Some(best) = pruned_candidates.first() { self.patches.push(best.clone()); } } /// Lower is better fn score_candidate( &self, candidate: Patch, sentences_flagged: &[CandidateArgs], base_flags: &[Vec], ) -> usize { let mut tagger = BrillChunker::new(UPOSFreqDict::default()); tagger.patches.push(candidate); let mut errors = 0; for ((toks, tags, flags), base) in sentences_flagged.iter().zip(base_flags.iter()) { errors += tagger.count_patch_errors(toks.as_slice(), tags.as_slice(), base, flags); } errors } /// Train a brand-new tagger on a `.conllu` dataset, provided via a path. /// This does not do _any_ error handling, and should not run in production. /// It should be used for training a model that _will_ be used in production. pub fn train( training_files: &[impl AsRef], epochs: usize, candidate_selection_chance: f32, ) -> Self { let mut freq_dict = UPOSFreqDict::default(); for file in training_files { freq_dict.inc_from_conllu_file(file); } let mut chunker = Self::new(freq_dict); for _ in 0..epochs { chunker.epoch(training_files, candidate_selection_chance); } chunker } } ================================================ FILE: harper-pos-utils/src/chunker/brill_chunker/patch.rs ================================================ use serde::{Deserialize, Serialize}; use crate::patch_criteria::PatchCriteria; #[cfg(feature = "training")] use crate::word_counter::WordCounter; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Patch { pub from: bool, pub criteria: PatchCriteria, } #[cfg(feature = "training")] impl Patch { pub fn generate_candidate_patches(relevant_words: &WordCounter) -> Vec { use crate::UPOS; use strum::IntoEnumIterator; const TOP_N_WORDS: usize = 50; const REL_POS: [isize; 7] = [-3, -2, -1, 0, 1, 2, 3]; let mut atoms: Vec<(bool, PatchCriteria)> = Vec::new(); for from in [false, true] { for rel in REL_POS { for tag in UPOS::iter() { atoms.push(( from, PatchCriteria::WordIsTaggedWith { relative: rel, is_tagged: tag, }, )); } } for max_rel in 1..=5 { for tag in UPOS::iter() { atoms.push(( from, PatchCriteria::AnyWordIsTaggedWith { max_relative: max_rel, is_tagged: tag, }, )); } } for prev in UPOS::iter() { for post in UPOS::iter() { atoms.push(( from, PatchCriteria::SandwichTaggedWith { prev_word_tagged: prev, post_word_tagged: post, }, )); } } for rel in REL_POS { for is_np in [false, true] { atoms.push(( from, PatchCriteria::NounPhraseAt { is_np, relative: rel, }, )); } } } let tag_atom_count = atoms.len(); let mut word_atoms: Vec<(bool, PatchCriteria)> = Vec::new(); for from in [false, true] { for rel in REL_POS { for w in relevant_words.iter_top_n_words(TOP_N_WORDS) { word_atoms.push(( from, PatchCriteria::WordIs { relative: rel, word: w.clone(), }, )); } } } atoms.extend(word_atoms); let total_atoms = atoms.len(); let word_start = tag_atom_count; let word_atoms_ct = total_atoms - word_start; let combos_ct = word_atoms_ct * total_atoms - word_atoms_ct; let mut patches = Vec::with_capacity(total_atoms + combos_ct); for (from, crit) in &atoms { patches.push(Self { from: *from, criteria: crit.clone(), }); } for i in word_start..total_atoms { let (from_i, ref crit_i) = atoms[i]; for (j, (_from_j, crit_j)) in atoms.iter().enumerate() { if i == j { continue; } patches.push(Self { from: from_i, criteria: PatchCriteria::Combined { a: Box::new(crit_i.clone()), b: Box::new(crit_j.clone()), }, }); } } patches } } ================================================ FILE: harper-pos-utils/src/chunker/burn_chunker.rs ================================================ use crate::{UPOS, chunker::Chunker}; #[cfg(feature = "training")] use burn::backend::Autodiff; #[cfg(feature = "training")] use burn::nn::loss::{MseLoss, Reduction}; use burn::nn::{Dropout, DropoutConfig}; #[cfg(feature = "training")] use burn::optim::{GradientsParams, Optimizer}; use burn::record::{FullPrecisionSettings, NamedMpkBytesRecorder, NamedMpkFileRecorder, Recorder}; use burn::tensor::TensorData; #[cfg(feature = "training")] use burn::tensor::backend::AutodiffBackend; use burn::{ module::Module, nn::{BiLstmConfig, EmbeddingConfig, LinearConfig}, tensor::{Int, Tensor, backend::Backend}, }; use burn_ndarray::{NdArray, NdArrayDevice}; use hashbrown::HashMap; use std::path::Path; const UNK_IDX: usize = 1; #[derive(Module, Debug)] struct NpModel { embedding_words: burn::nn::Embedding, embedding_upos: burn::nn::Embedding, lstm: burn::nn::BiLstm, linear_out: burn::nn::Linear, dropout: Dropout, } impl NpModel { fn new(vocab: usize, word_embed_dim: usize, dropout: f32, device: &B::Device) -> Self { let upos_embed = 8; let total_embed = word_embed_dim + upos_embed; Self { embedding_words: EmbeddingConfig::new(vocab, word_embed_dim).init(device), embedding_upos: EmbeddingConfig::new(20, upos_embed).init(device), lstm: BiLstmConfig::new(total_embed, total_embed, false).init(device), // Multiply by two because the BiLSTM emits double the hidden parameters linear_out: LinearConfig::new(total_embed * 2, 1).init(device), dropout: DropoutConfig::new(dropout as f64).init(), } } fn forward( &self, word_tens: Tensor, tag_tens: Tensor, use_dropout: bool, ) -> Tensor { let word_embed = self.embedding_words.forward(word_tens); let tag_embed = self.embedding_upos.forward(tag_tens); let mut x = Tensor::cat(vec![word_embed, tag_embed], 2); if use_dropout { x = self.dropout.forward(x); } let (mut x, _) = self.lstm.forward(x, None); if use_dropout { x = self.dropout.forward(x); } let x = self.linear_out.forward(x); x.squeeze_dim::<2>(2) } } /// A [`Chunker`] that uses a BiLSTM and the Burn machine learning framework. /// /// Additional details in this [talk](https://elijahpotter.dev/articles/i-spoke-at-wordcamp-u.s.-in-2025) pub struct BurnChunker { vocab: HashMap, model: NpModel, device: B::Device, } impl BurnChunker { fn idx(&self, tok: &str) -> usize { *self.vocab.get(tok).unwrap_or(&UNK_IDX) } fn to_tensors( &self, sent: &[String], tags: &[Option], ) -> (Tensor, Tensor) { // Interleave with UPOS tags let idxs: Vec<_> = sent.iter().map(|t| self.idx(t) as i32).collect(); let upos: Vec<_> = tags .iter() .map(|t| t.map(|o| o as i32 + 2).unwrap_or(1)) .collect(); let word_tensor = Tensor::::from_data(TensorData::from(idxs.as_slice()), &self.device) .reshape([1, sent.len()]); let tag_tensor = Tensor::::from_data(TensorData::from(upos.as_slice()), &self.device) .reshape([1, sent.len()]); (word_tensor, tag_tensor) } pub fn save_to(&self, dir: impl AsRef) { let dir = dir.as_ref(); std::fs::create_dir_all(dir).unwrap(); let recorder = NamedMpkFileRecorder::::new(); self.model .clone() .save_file(dir.join("model.mpk"), &recorder) .unwrap(); let vocab_bytes = serde_json::to_vec(&self.vocab).unwrap(); std::fs::write(dir.join("vocab.json"), vocab_bytes).unwrap(); } pub fn load_from_bytes( model_bytes: impl AsRef<[u8]>, vocab_bytes: impl AsRef<[u8]>, embed_dim: usize, dropout: f32, device: B::Device, ) -> Self { let vocab: HashMap = serde_json::from_slice(vocab_bytes.as_ref()).unwrap(); let recorder = NamedMpkBytesRecorder::::new(); let owned_data = model_bytes.as_ref().to_vec(); let record = recorder.load(owned_data, &device).unwrap(); let model = NpModel::new(vocab.len(), embed_dim, dropout, &device); let model = model.load_record(record); Self { vocab, model, device, } } } #[cfg(feature = "training")] struct ExtractedSentences( Vec>, Vec>>, Vec>, HashMap, ); #[cfg(feature = "training")] impl BurnChunker { fn to_label(&self, labels: &[bool]) -> Tensor { let ys: Vec<_> = labels.iter().map(|b| if *b { 1. } else { 0. }).collect(); Tensor::::from_data(TensorData::from(ys.as_slice()), &self.device) .reshape([1, labels.len()]) } pub fn train( training_files: &[impl AsRef], test_file: &impl AsRef, word_embed_dim: usize, dropout: f32, epochs: usize, lr: f64, device: B::Device, ) -> Self { use burn::tensor::cast::ToElement; println!("Preparing datasets..."); let ExtractedSentences(sents, tags, labs, vocab) = Self::extract_sents_from_files(training_files); println!("Preparing model and training config..."); let mut model = NpModel::::new(vocab.len(), word_embed_dim, dropout, &device); let opt_config = burn::optim::AdamConfig::new(); let mut opt = opt_config.init(); let util = BurnChunker { vocab: vocab.clone(), model: model.clone(), device: device.clone(), }; let loss_fn = MseLoss::new(); let mut last_score = 0.; println!("Training..."); for _ in 0..epochs { let mut total_loss = 0.; let mut total_tokens = 0; let mut total_correct: usize = 0; for (i, ((x, w), y)) in sents.iter().zip(tags.iter()).zip(labs.iter()).enumerate() { let (word_tens, tag_tens) = util.to_tensors(x, w); let y_tensor = util.to_label(y); let logits = model.forward(word_tens, tag_tens, true); total_correct += logits .to_data() .iter() .map(|p: f32| p > 0.5) .zip(y) .map(|(a, b)| if a == *b { 1 } else { 0 }) .sum::(); let loss = loss_fn.forward(logits, y_tensor, Reduction::Mean); let grads = loss.backward(); let grads = GradientsParams::from_grads(grads, &model); model = opt.step(lr, model, grads); total_loss += loss.into_scalar().to_f64(); total_tokens += x.len(); if i % 1000 == 0 { println!("{i}/{}", sents.len()); } } println!( "Average loss for epoch: {}", total_loss / sents.len() as f64 * 100. ); println!( "{}% correct in training dataset", total_correct as f32 / total_tokens as f32 * 100. ); let score = util.score_model(&model, test_file); println!("{}% correct in test dataset", score * 100.); if score < last_score { println!("Overfitting detected. Stopping..."); break; } last_score = score; } Self { vocab, model, device, } } fn score_model(&self, model: &NpModel, dataset: &impl AsRef) -> f32 { let ExtractedSentences(sents, tags, labs, _) = Self::extract_sents_from_files(&[dataset]); let mut total_tokens = 0; let mut total_correct: usize = 0; for ((x, w), y) in sents.iter().zip(tags.iter()).zip(labs.iter()) { let (word_tens, tag_tens) = self.to_tensors(x, w); let logits = model.forward(word_tens, tag_tens, false); total_correct += logits .to_data() .iter() .map(|p: f32| p > 0.5) .zip(y) .map(|(a, b)| if a == *b { 1 } else { 0 }) .sum::(); total_tokens += x.len(); } total_correct as f32 / total_tokens as f32 } fn extract_sents_from_files(files: &[impl AsRef]) -> ExtractedSentences { use super::np_extraction::locate_noun_phrases_in_sent; use crate::conllu_utils::iter_sentences_in_conllu; let mut vocab: HashMap = HashMap::new(); vocab.insert("".into(), UNK_IDX); let mut sents: Vec> = Vec::new(); let mut sent_tags: Vec>> = Vec::new(); let mut labs: Vec> = Vec::new(); const CONTRACTIONS: &[&str] = &["sn't", "n't", "'ll", "'ve", "'re", "'d", "'m", "'s"]; for file in files { for sent in iter_sentences_in_conllu(file) { let spans = locate_noun_phrases_in_sent(&sent); let mut original_mask = vec![false; sent.tokens.len()]; for span in spans { for i in span { original_mask[i] = true; } } let mut toks: Vec = Vec::new(); let mut tags: Vec> = Vec::new(); let mut mask: Vec = Vec::new(); for (idx, tok) in sent.tokens.iter().enumerate() { let is_contraction = CONTRACTIONS.contains(&&tok.form[..]); if is_contraction && !toks.is_empty() { let prev_tok = toks.pop().unwrap(); let prev_mask = mask.pop().unwrap(); toks.push(format!("{prev_tok}{}", tok.form)); mask.push(prev_mask || original_mask[idx]); } else { toks.push(tok.form.clone()); tags.push(tok.upos.and_then(UPOS::from_conllu)); mask.push(original_mask[idx]); } } for t in &toks { if !vocab.contains_key(t) { let next = vocab.len(); vocab.insert(t.clone(), next); } } sents.push(toks); sent_tags.push(tags); labs.push(mask); } } ExtractedSentences(sents, sent_tags, labs, vocab) } } #[cfg(feature = "training")] pub type BurnChunkerCpu = BurnChunker>; #[cfg(not(feature = "training"))] pub type BurnChunkerCpu = BurnChunker; impl BurnChunkerCpu { pub fn load_from_bytes_cpu( model_bytes: impl AsRef<[u8]>, vocab_bytes: impl AsRef<[u8]>, embed_dim: usize, dropout: f32, ) -> Self { Self::load_from_bytes( model_bytes, vocab_bytes, embed_dim, dropout, NdArrayDevice::Cpu, ) } } #[cfg(feature = "training")] impl BurnChunkerCpu { pub fn train_cpu( training_files: &[impl AsRef], test_file: &impl AsRef, embed_dim: usize, dropout: f32, epochs: usize, lr: f64, ) -> Self { BurnChunker::>::train( training_files, test_file, embed_dim, dropout, epochs, lr, NdArrayDevice::Cpu, ) } } impl Chunker for BurnChunker { fn chunk_sentence(&self, sentence: &[String], tags: &[Option]) -> Vec { // Solves a divide-by-zero error in the linear layer. if sentence.is_empty() { return Vec::new(); } let (word_tens, tag_tens) = self.to_tensors(sentence, tags); let prob = self.model.forward(word_tens, tag_tens, false); prob.to_data().iter().map(|p: f32| p > 0.5).collect() } } ================================================ FILE: harper-pos-utils/src/chunker/cached_chunker.rs ================================================ use lru::LruCache; use std::hash::Hash; use std::num::NonZeroUsize; use std::sync::Mutex; use super::Chunker; use crate::UPOS; /// Wraps any chunker implementation to add an LRU Cache. /// Useful for incremental lints. pub struct CachedChunker { inner: C, cache: Mutex>>, } impl CachedChunker { pub fn new(inner: C, capacity: NonZeroUsize) -> Self { Self { inner, cache: Mutex::new(LruCache::new(capacity)), } } } impl Chunker for CachedChunker { fn chunk_sentence(&self, sentence: &[String], tags: &[Option]) -> Vec { let key = CacheKey::new(sentence, tags); // Attempt a cache hit. // We put this in the block so `read` gets dropped as early as possible. if let Ok(mut read) = self.cache.try_lock() && let Some(result) = read.get(&key) { return result.clone(); }; // We don't want to hold the lock since it may take a while to run the chunker. let result = self.inner.chunk_sentence(sentence, tags); if let Ok(mut cache) = self.cache.try_lock() { cache.put(key, result.clone()); } result } } #[derive(Hash, PartialEq, Eq)] struct CacheKey { sentence: Vec, tags: Vec>, } impl CacheKey { fn new(sentence: &[String], tags: &[Option]) -> Self { Self { sentence: sentence.to_vec(), tags: tags.to_vec(), } } } ================================================ FILE: harper-pos-utils/src/chunker/mod.rs ================================================ use crate::UPOS; mod brill_chunker; mod burn_chunker; mod cached_chunker; #[cfg(feature = "training")] mod np_extraction; mod upos_freq_dict; pub use brill_chunker::BrillChunker; pub use burn_chunker::{BurnChunker, BurnChunkerCpu}; pub use cached_chunker::CachedChunker; pub use upos_freq_dict::UPOSFreqDict; /// An implementer of this trait is capable of identifying the noun phrases in a provided sentence. /// [See here](https://en.wikipedia.org/wiki/Shallow_parsing) for more details on what this is and how it can work. pub trait Chunker { /// Iterate over the sentence, identifying the noun phrases contained within. /// A token marked `true` is a component of a noun phrase. /// A token marked `false` is not. fn chunk_sentence(&self, sentence: &[String], tags: &[Option]) -> Vec; } ================================================ FILE: harper-pos-utils/src/chunker/np_extraction.rs ================================================ //! Methods for extracting nominal phrases from datasets. use std::collections::VecDeque; use hashbrown::HashSet; use rs_conllu::{Sentence, Token, TokenID, UPOS}; pub fn locate_noun_phrases_in_sent(sent: &Sentence) -> Vec> { let mut found_noun_phrases = Vec::new(); for (i, token) in sent.tokens.iter().enumerate() { if token.upos.is_some_and(is_root_upos) { let noun_phrase = locate_noun_phrase_with_head_at(i, sent); found_noun_phrases.push(noun_phrase); } } found_noun_phrases.retain(is_contiguous); reduce_to_maximal_nonoverlapping(found_noun_phrases) } fn is_contiguous(indices: &HashSet) -> bool { if indices.is_empty() { return false; } let lo = *indices.iter().min().unwrap(); let hi = *indices.iter().max().unwrap(); hi - lo + 1 == indices.len() } fn reduce_to_maximal_nonoverlapping(mut phrases: Vec>) -> Vec> { phrases.sort_by_key(|s| usize::MAX - s.len()); let mut selected = Vec::new(); let mut occupied = HashSet::new(); for p in phrases { if p.is_disjoint(&occupied) { occupied.extend(&p); selected.push(p); } } selected } fn locate_noun_phrase_with_head_at(head_index: usize, sent: &Sentence) -> HashSet { let mut children = HashSet::new(); let mut queue = VecDeque::new(); queue.push_back(head_index); while let Some(c_i) = queue.pop_front() { if children.contains(&c_i) { continue; } let tok = &sent.tokens[c_i]; if is_noun_phrase_constituent(tok) || tok.upos.is_some_and(is_root_upos) { children.insert(c_i); queue.extend(get_children(sent, c_i)); } } children } fn is_root_upos(upos: UPOS) -> bool { use UPOS::*; matches!(upos, NOUN | PROPN | PRON) } /// Get the indices of the children of a given node. fn get_children(sent: &Sentence, of_node: usize) -> Vec { let mut children = Vec::new(); for (index, token) in sent.tokens.iter().enumerate() { if index == of_node { continue; } if let Some(head) = token.head { let is_child = match head { TokenID::Single(i) => i != 0 && i - 1 == of_node, TokenID::Range(start, end) => (start - 1..end - 1).contains(&of_node), TokenID::Empty(_, _) => false, }; if is_child { children.push(index) } } } children } fn is_noun_phrase_constituent(token: &Token) -> bool { let Some(ref deprel) = token.deprel else { return false; }; matches!( deprel.as_str(), "det" | "amod" | "nummod" | "compound" | "fixed" | "flat" | "acl" | "aux:pass" ) } ================================================ FILE: harper-pos-utils/src/chunker/upos_freq_dict.rs ================================================ #[cfg(feature = "training")] use std::path::Path; use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use crate::UPOS; use super::Chunker; /// Tracks the number of times any given UPOS is associated with a noun phrase. /// Used as the baseline for the chunker. #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct UPOSFreqDict { /// The # of times each [`UPOS`] was not part of an NP subtracted from the number of times it /// was. pub counts: HashMap, } impl UPOSFreqDict { pub fn is_likely_np_component(&self, upos: &UPOS) -> bool { self.counts.get(upos).cloned().unwrap_or_default() > 0 } } impl Chunker for UPOSFreqDict { fn chunk_sentence(&self, _sentence: &[String], tags: &[Option]) -> Vec { tags.iter() .map(|t| { t.as_ref() .map(|t| self.is_likely_np_component(t)) .unwrap_or(false) }) .collect() } } #[cfg(feature = "training")] impl UPOSFreqDict { /// Increment the count for a particular lint kind. pub fn inc_is_np(&mut self, upos: UPOS, is_np: bool) { self.counts .entry(upos) .and_modify(|counter| *counter += if is_np { 1 } else { -1 }) .or_insert(1); } /// Parse a `.conllu` file and use it to train a frequency dictionary. /// For error-handling purposes, this function should not be made accessible outside of training. pub fn inc_from_conllu_file(&mut self, path: impl AsRef) { use super::np_extraction::locate_noun_phrases_in_sent; use crate::conllu_utils::iter_sentences_in_conllu; for sent in iter_sentences_in_conllu(path) { use hashbrown::HashSet; let noun_phrases = locate_noun_phrases_in_sent(&sent); let flat = noun_phrases.into_iter().fold(HashSet::new(), |mut a, b| { a.extend(b); a }); for (i, token) in sent.tokens.iter().enumerate() { if let Some(upos) = token.upos.and_then(UPOS::from_conllu) { self.inc_is_np(upos, flat.contains(&i)) } } } } } ================================================ FILE: harper-pos-utils/src/conllu_utils.rs ================================================ use std::{fs::File, path::Path}; use rs_conllu::{Sentence, parse_file}; /// Produce an iterator over the sentences in a `.conllu` file. /// Will panic on error, so this should not be used outside of training. pub fn iter_sentences_in_conllu(path: impl AsRef) -> impl Iterator { let file = File::open(path).unwrap(); let doc = parse_file(file); doc.map(|v| v.unwrap()) } ================================================ FILE: harper-pos-utils/src/lib.rs ================================================ mod chunker; #[cfg(feature = "training")] mod conllu_utils; mod patch_criteria; mod tagger; mod upos; #[cfg(feature = "training")] mod word_counter; pub use chunker::{ BrillChunker, BurnChunker, BurnChunkerCpu, CachedChunker, Chunker, UPOSFreqDict, }; pub use tagger::{BrillTagger, FreqDict, FreqDictBuilder, Tagger}; pub use upos::{UPOS, UPOSIter}; ================================================ FILE: harper-pos-utils/src/patch_criteria.rs ================================================ use serde::{Deserialize, Serialize}; use crate::UPOS; #[derive(Debug, Clone, Serialize, Deserialize, Hash, PartialEq, Eq)] pub enum PatchCriteria { WordIsTaggedWith { /// Which token to inspect. relative: isize, is_tagged: UPOS, }, AnyWordIsTaggedWith { /// The farthest relative index to look max_relative: isize, is_tagged: UPOS, }, SandwichTaggedWith { prev_word_tagged: UPOS, post_word_tagged: UPOS, }, WordIs { relative: isize, word: String, }, /// Not applicable to the Brill Tagger, only the chunker NounPhraseAt { is_np: bool, relative: isize, }, Combined { a: Box, b: Box, }, } impl PatchCriteria { pub fn fulfils( &self, tokens: &[String], tags: &[Option], np_flags: &[bool], index: usize, ) -> bool { match self { PatchCriteria::WordIsTaggedWith { relative, is_tagged, } => { let Some(index) = add(index, *relative) else { return false; }; tags.get(index) .copied() .flatten() .is_some_and(|t| t == *is_tagged) } PatchCriteria::AnyWordIsTaggedWith { max_relative: relative, is_tagged, } => { let Some(farthest_index) = add(index, *relative) else { return false; }; (farthest_index.min(index)..farthest_index.max(index)).any(|i| { tags.get(i) .copied() .flatten() .is_some_and(|t| t == *is_tagged) }) } PatchCriteria::SandwichTaggedWith { prev_word_tagged, post_word_tagged, } => { if index == 0 { return false; } let prev_i = index - 1; let post_i = index + 1; tags.get(prev_i) .copied() .flatten() .is_some_and(|t| t == *prev_word_tagged) && tags .get(post_i) .copied() .flatten() .is_some_and(|t| t == *post_word_tagged) } Self::WordIs { relative, word } => { let Some(index) = add(index, *relative) else { return false; }; tokens.get(index).is_some_and(|w| { w.chars() .zip(word.chars()) .all(|(a, b)| a.eq_ignore_ascii_case(&b)) }) } Self::NounPhraseAt { is_np, relative } => { let Some(index) = add(index, *relative) else { return false; }; np_flags.get(index).is_some_and(|f| *is_np == *f) } Self::Combined { a, b } => { a.fulfils(tokens, tags, np_flags, index) && b.fulfils(tokens, tags, np_flags, index) } } } } fn add(u: usize, i: isize) -> Option { if i.is_negative() { u.checked_sub(i.wrapping_abs() as u32 as usize) } else { u.checked_add(i as usize) } } ================================================ FILE: harper-pos-utils/src/tagger/brill_tagger/mod.rs ================================================ mod patch; #[cfg(feature = "training")] use std::path::Path; use patch::Patch; use serde::{Deserialize, Serialize}; #[cfg(feature = "training")] use super::FreqDict; #[cfg(feature = "training")] use super::error_counter::{ErrorCounter, ErrorKind}; use crate::{Tagger, UPOS}; /// A [`Tagger`] implementation based on the work by Eric Brill. /// /// Additional reading: /// /// - [Brill tagger](https://en.wikipedia.org/wiki/Brill_tagger) /// - [Transformation-based Learning for POS Tagging](https://elijahpotter.dev/articles/transformation-based-learning) #[derive(Debug, Clone, Serialize, Deserialize)] pub struct BrillTagger where B: Tagger, { base: B, patches: Vec, } impl BrillTagger where B: Tagger, { pub fn new(base: B) -> Self { Self { base, patches: Vec::new(), } } fn apply_patches(&self, sentence: &[String], tags: &mut [Option]) { for patch in &self.patches { for i in 0..sentence.len() { let Some(i_tag) = tags.get(i).copied().flatten() else { continue; }; if patch.from == i_tag && patch.criteria.fulfils(sentence, tags, &[], i) { tags[i] = Some(patch.to); } } } } } impl Tagger for BrillTagger where B: Tagger, { /// Tag a sentence using the provided frequency dictionary and current patch set. /// If the tagger is unable to determine a POS, it returns [`None`] in that position. fn tag_sentence(&self, sentence: &[String]) -> Vec> { let mut tags = self.base.tag_sentence(sentence); self.apply_patches(sentence, &mut tags); tags } } #[cfg(feature = "training")] impl BrillTagger { /// Tag a provided sentence with patches, providing the "correct" tags (from a dataset or /// other source), returning the number of errors. pub fn locate_patch_errors( &self, sentence: &[String], correct_tags: &[Option], base_tags: &[Option], errors: &mut ErrorCounter, ) { let mut base_tags = base_tags.to_vec(); self.apply_patches(sentence, &mut base_tags); for ((tag, correct_tag), word) in base_tags.iter().zip(correct_tags.iter()).zip(sentence) { if let Some(tag) = tag && let Some(correct_tag) = correct_tag && tag != correct_tag { errors.inc( ErrorKind { was_tagged: *tag, correct_tag: *correct_tag, }, word.as_str(), ) } } } /// Tag a provided sentence with the tagger, providing the "correct" tags (from a dataset or /// other source), returning the number of errors. pub fn locate_tag_errors( &self, sentence: &[String], correct_tags: &[Option], ) -> ErrorCounter { let tags = self.tag_sentence(sentence); let mut errors = ErrorCounter::new(); for ((tag, correct_tag), word) in tags.iter().zip(correct_tags.iter()).zip(sentence) { if let Some(tag) = tag && let Some(correct_tag) = correct_tag && tag != correct_tag { errors.inc( ErrorKind { was_tagged: *tag, correct_tag: *correct_tag, }, word.as_str(), ) } } errors } /// To speed up training, only try a subset of all possible candidates. /// How many to select is given by the `candidate_selection_chance`. A higher chance means a /// longer training time. fn epoch(&mut self, training_files: &[impl AsRef], candidate_selection_chance: f32) { use crate::conllu_utils::iter_sentences_in_conllu; use rs_conllu::Sentence; use std::time::Instant; assert!((0.0..=1.0).contains(&candidate_selection_chance)); let mut total_tokens = 0; let mut error_counter = ErrorCounter::new(); let sentences: Vec = training_files .iter() .flat_map(iter_sentences_in_conllu) .collect(); let mut sentences_tagged: Vec<(Vec, Vec>)> = Vec::new(); for sent in &sentences { let mut toks: Vec = Vec::new(); let mut tags = Vec::new(); for token in &sent.tokens { let form = token.form.clone(); if let Some(last) = toks.last_mut() { match form.as_str() { "sn't" | "n't" | "'ll" | "'ve" | "'re" | "'d" | "'m" | "'s" => { last.push_str(&form); continue; } _ => {} } } toks.push(form); tags.push(token.upos.and_then(UPOS::from_conllu)); } sentences_tagged.push((toks, tags)); } for (tok_buf, tag_buf) in &sentences_tagged { total_tokens += tok_buf.len(); error_counter .merge_from(self.locate_tag_errors(tok_buf.as_slice(), tag_buf.as_slice())); } println!("============="); println!("Total tokens in training set: {total_tokens}"); println!( "Tokens incorrectly tagged: {}", error_counter.total_errors() ); println!( "Error rate: {}%", error_counter.total_errors() as f32 / total_tokens as f32 * 100. ); // Before adding any patches, let's get a good base. let mut base_tags = Vec::new(); for (toks, _) in &sentences_tagged { base_tags.push(self.tag_sentence(toks)); } let all_candidates = Patch::generate_candidate_patches(&error_counter); let mut pruned_candidates: Vec = rand::seq::IndexedRandom::sample( all_candidates.as_slice(), &mut rand::rng(), (all_candidates.len() as f32 * candidate_selection_chance) as usize, ) .cloned() .collect(); let start = Instant::now(); #[cfg(feature = "threaded")] rayon::slice::ParallelSliceMut::par_sort_by_cached_key( pruned_candidates.as_mut_slice(), |candidate: &Patch| { self.score_candidate(candidate.clone(), &sentences_tagged, &base_tags) }, ); #[cfg(not(feature = "threaded"))] pruned_candidates.sort_by_cached_key(|candidate| { self.score_candidate(candidate.clone(), &sentences_tagged, &base_tags) }); let duration = start.elapsed(); let seconds = duration.as_secs(); let millis = duration.subsec_millis(); println!( "It took {} seconds and {} milliseconds to search through {} candidates at {} c/sec.", seconds, millis, pruned_candidates.len(), pruned_candidates.len() as f32 / seconds as f32 ); if let Some(best) = pruned_candidates.first() { self.patches.push(best.clone()); } } /// Lower is better fn score_candidate( &self, candidate: Patch, sentences_tagged: &[(Vec, Vec>)], base_tags: &[Vec>], ) -> usize { let mut tagger = BrillTagger::new(FreqDict::default()); tagger.patches.push(candidate); let mut candidate_errors = ErrorCounter::new(); for ((toks, tags), base) in sentences_tagged.iter().zip(base_tags.iter()) { tagger.locate_patch_errors( toks.as_slice(), tags.as_slice(), base, &mut candidate_errors, ); } candidate_errors.total_errors() } /// Train a brand-new tagger on a `.conllu` dataset, provided via a path. /// This does not do _any_ error handling, and should not run in production. /// It should be used for training a model that _will_ be used in production. pub fn train( training_files: &[impl AsRef], epochs: usize, candidate_selection_chance: f32, ) -> Self { use crate::FreqDictBuilder; let mut freq_dict_builder = FreqDictBuilder::new(); for file in training_files { freq_dict_builder.inc_from_conllu_file(file); } let freq_dict = freq_dict_builder.build(); let mut tagger = Self::new(freq_dict); for _ in 0..epochs { tagger.epoch(training_files, candidate_selection_chance); } tagger } } ================================================ FILE: harper-pos-utils/src/tagger/brill_tagger/patch.rs ================================================ #[cfg(feature = "training")] use crate::tagger::error_counter::ErrorCounter; use crate::{UPOS, patch_criteria::PatchCriteria}; #[cfg(feature = "training")] use hashbrown::HashSet; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Patch { pub from: UPOS, pub to: UPOS, pub criteria: PatchCriteria, } #[cfg(feature = "training")] impl Patch { /// Given a list of tagging errors, generate a collection of candidate patches that _might_ fix /// them. Training involves determining which candidates actually work. pub fn generate_candidate_patches(error_counter: &ErrorCounter) -> Vec { let mut candidates = Vec::new(); for key in error_counter.error_counts.keys() { candidates.extend(Self::gen_simple_candidates().into_iter().map(|c| Patch { from: key.was_tagged, to: key.correct_tag, criteria: c, })); for c in &Self::gen_simple_candidates() { for word in error_counter.word_counts.iter_top_n_words(10) { for r in -3..3 { candidates.push(Patch { from: key.was_tagged, to: key.correct_tag, criteria: PatchCriteria::Combined { a: Box::new(PatchCriteria::WordIs { relative: r, word: word.to_string(), }), b: Box::new(c.clone()), }, }) } } } } candidates } /// Candidates to be tested against a dataset during training. fn gen_simple_candidates() -> Vec { use strum::IntoEnumIterator; let mut criteria = HashSet::new(); for upos in UPOS::iter() { for i in -4..=4 { criteria.insert(PatchCriteria::WordIsTaggedWith { relative: i, is_tagged: upos, }); } for i in -4..=4 { criteria.insert(PatchCriteria::AnyWordIsTaggedWith { max_relative: i, is_tagged: upos, }); } for upos_b in UPOS::iter() { criteria.insert(PatchCriteria::SandwichTaggedWith { prev_word_tagged: upos, post_word_tagged: upos_b, }); criteria.insert(PatchCriteria::Combined { a: Box::new(PatchCriteria::WordIsTaggedWith { relative: 1, is_tagged: upos, }), b: Box::new(PatchCriteria::WordIsTaggedWith { relative: -2, is_tagged: upos_b, }), }); } } criteria.into_iter().collect() } } ================================================ FILE: harper-pos-utils/src/tagger/error_counter.rs ================================================ use hashbrown::HashMap; use crate::{UPOS, word_counter::WordCounter}; #[derive(Debug, Default, Clone, Hash, PartialEq, Eq)] pub struct ErrorKind { pub was_tagged: UPOS, pub correct_tag: UPOS, } #[derive(Debug, Default)] pub struct ErrorCounter { pub error_counts: HashMap, /// The number of times a word is associated with an error. pub word_counts: WordCounter, } impl ErrorCounter { pub fn new() -> Self { Self::default() } /// Increment the count for a particular lint kind. pub fn inc(&mut self, kind: ErrorKind, word: &str) { self.error_counts .entry(kind) .and_modify(|counter| *counter += 1) .or_insert(1); self.word_counts.inc(word) } pub fn merge_from(&mut self, other: Self) { for (key, value) in other.error_counts { self.error_counts .entry(key) .and_modify(|counter| *counter += value) .or_insert(value); } for (key, value) in other.word_counts.word_counts { self.word_counts .word_counts .entry(key) .and_modify(|counter| *counter += value) .or_insert(value); } } pub fn total_errors(&self) -> usize { self.error_counts.values().sum() } } ================================================ FILE: harper-pos-utils/src/tagger/freq_dict.rs ================================================ use hashbrown::HashMap; use serde::{Deserialize, Serialize}; use super::Tagger; use crate::upos::UPOS; /// A mapping between words (normalized to lowercase) and their most common UPOS tag. /// Can be used as a minimally accurate [`Tagger`]. #[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct FreqDict { pub mapping: HashMap, } impl FreqDict { pub fn get(&self, word: &str) -> Option { let word_lower = word.to_lowercase(); self.mapping.get(word_lower.as_str()).copied() } } impl Tagger for FreqDict { fn tag_sentence(&self, sentence: &[String]) -> Vec> { let mut tags = Vec::new(); for word in sentence { let tag = self.get(word); tags.push(tag); } tags } } ================================================ FILE: harper-pos-utils/src/tagger/freq_dict_builder.rs ================================================ #[cfg(feature = "training")] use std::path::Path; use hashbrown::{Equivalent, HashMap}; use strum::IntoEnumIterator; use crate::{UPOS, tagger::FreqDict}; /// A mapping between words and the frequency of each UPOS. /// If an element is missing from the map, it's count is assumed to be zero. #[derive(Debug, Default)] pub struct FreqDictBuilder { mapping: HashMap, } impl FreqDictBuilder { pub fn new() -> Self { Default::default() } pub fn inc(&mut self, word: &str, tag: &UPOS) { let word_lower = word.to_lowercase(); let counter = self.mapping.get_mut(&(word_lower.as_str(), tag)); if let Some(counter) = counter { *counter += 1; } else { self.mapping.insert( FreqDictBuilderKey { word: word_lower.to_string(), pos: *tag, }, 1, ); } } // Inefficient, but effective method that gets the most used POS for a word in the map. // Returns none if the word does not exist in the map. fn most_freq_pos(&self, word: &str) -> Option { let word_lower = word.to_lowercase(); let mut max_found: Option<(UPOS, usize)> = None; for pos in UPOS::iter() { if let Some(count) = self.mapping.get(&(word_lower.as_str(), &pos)) { if let Some((_, max_count)) = max_found { if *count > max_count { max_found = Some((pos, *count)) } } else { max_found = Some((pos, *count)) } } } max_found.map(|v| v.0) } /// Parse a `.conllu` file and use it to train a frequency dictionary. /// For error-handling purposes, this function should not be made accessible outside of training. #[cfg(feature = "training")] pub fn inc_from_conllu_file(&mut self, path: impl AsRef) { use crate::conllu_utils::iter_sentences_in_conllu; for sent in iter_sentences_in_conllu(path) { for token in sent.tokens { if let Some(upos) = token.upos.and_then(UPOS::from_conllu) { self.inc(&token.form, &upos) } } } } pub fn build(self) -> FreqDict { let mut output = HashMap::new(); for key in self.mapping.keys() { if output.contains_key(&key.word) { continue; } output.insert(key.word.to_string(), self.most_freq_pos(&key.word).unwrap()); } FreqDict { mapping: output } } } #[derive(Debug, Eq, PartialEq, Hash)] struct FreqDictBuilderKey { word: String, pos: UPOS, } impl Equivalent for (&str, &UPOS) { fn equivalent(&self, key: &FreqDictBuilderKey) -> bool { self.0 == key.word && *self.1 == key.pos } } ================================================ FILE: harper-pos-utils/src/tagger/mod.rs ================================================ mod brill_tagger; #[cfg(feature = "training")] mod error_counter; mod freq_dict; mod freq_dict_builder; use crate::UPOS; pub use brill_tagger::BrillTagger; pub use freq_dict::FreqDict; pub use freq_dict_builder::FreqDictBuilder; /// An implementer of this trait is capable of assigned Part-of-Speech tags to a provided sentence. /// This is widely useful for various applications. [See here.](https://en.wikipedia.org/wiki/Part-of-speech_tagging) pub trait Tagger { fn tag_sentence(&self, sentence: &[String]) -> Vec>; } ================================================ FILE: harper-pos-utils/src/upos.rs ================================================ use std::fmt::Display; use is_macro::Is; use serde::{Deserialize, Serialize}; use strum_macros::{AsRefStr, EnumIter, EnumString}; /// Represents the universal parts of speech as outlined by [universaldependencies.org](https://universaldependencies.org/u/pos/index.html). #[derive( EnumString, Debug, Default, Hash, Eq, PartialEq, Clone, Copy, EnumIter, AsRefStr, Serialize, Deserialize, PartialOrd, Ord, Is, )] pub enum UPOS { /// Adjective ADJ, /// Adposition ADP, /// Adverb ADV, /// Auxiliary AUX, /// Coordinating conjunction CCONJ, /// Determiner DET, /// Interjection INTJ, /// Noun #[default] NOUN, /// Numeral NUM, /// Particle PART, /// Pronoun PRON, /// Proper noun PROPN, /// Punctuation PUNCT, /// Subordinating conjunction SCONJ, /// Symbol SYM, /// Verb VERB, } impl UPOS { pub fn from_conllu(other: rs_conllu::UPOS) -> Option { Some(match other { rs_conllu::UPOS::ADJ => UPOS::ADJ, rs_conllu::UPOS::ADP => UPOS::ADP, rs_conllu::UPOS::ADV => UPOS::ADV, rs_conllu::UPOS::AUX => UPOS::AUX, rs_conllu::UPOS::CCONJ => UPOS::CCONJ, rs_conllu::UPOS::DET => UPOS::DET, rs_conllu::UPOS::INTJ => UPOS::INTJ, rs_conllu::UPOS::NOUN => UPOS::NOUN, rs_conllu::UPOS::NUM => UPOS::NUM, rs_conllu::UPOS::PART => UPOS::PART, rs_conllu::UPOS::PRON => UPOS::PRON, rs_conllu::UPOS::PROPN => UPOS::PROPN, rs_conllu::UPOS::PUNCT => UPOS::PUNCT, rs_conllu::UPOS::SCONJ => UPOS::SCONJ, rs_conllu::UPOS::SYM => UPOS::SYM, rs_conllu::UPOS::VERB => UPOS::VERB, rs_conllu::UPOS::X => return None, }) } pub fn is_nominal(&self) -> bool { matches!(self, Self::NOUN | Self::PROPN | Self::PRON) } } impl Display for UPOS { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let desc = match self { UPOS::ADJ => "Adjective", UPOS::ADP => "Adposition", UPOS::ADV => "Adverb", UPOS::AUX => "Auxiliary", UPOS::CCONJ => "Coordinating conjunction", UPOS::DET => "Determiner", UPOS::INTJ => "Interjection", UPOS::NOUN => "Noun", UPOS::NUM => "Numeral", UPOS::PART => "Particle", UPOS::PRON => "Pronoun", UPOS::PROPN => "Proper noun", UPOS::PUNCT => "Punctuation", UPOS::SCONJ => "Subordinating conjunction", UPOS::SYM => "Symbol", UPOS::VERB => "Verb", }; write!(f, "{desc}") } } ================================================ FILE: harper-pos-utils/src/word_counter.rs ================================================ use hashbrown::HashMap; #[derive(Debug, Default)] pub struct WordCounter { /// The number of times a word is associated with an error. pub word_counts: HashMap, } impl WordCounter { pub fn new() -> Self { Self::default() } /// Increment the count for a particular word. pub fn inc(&mut self, word: &str) { self.word_counts .entry_ref(word) .and_modify(|counter| *counter += 1) .or_insert(1); } /// Get an iterator over the most frequent words associated with errors. pub fn iter_top_n_words(&self, n: usize) -> impl Iterator { let mut counts: Vec<(&String, &usize)> = self.word_counts.iter().collect(); counts.sort_unstable_by(|a, b| b.1.cmp(a.1)); counts.into_iter().take(n).map(|(a, _b)| a) } } ================================================ FILE: harper-python/Cargo.toml ================================================ [package] name = "harper-python" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } harper-tree-sitter = { path = "../harper-tree-sitter", version = "1.0.0" } tree-sitter-python = "0.25.0" tree-sitter = "0.25.10" [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-python/src/lib.rs ================================================ use harper_core::parsers::{self, Parser, PlainEnglish}; use harper_core::{Token, TokenKind}; use harper_tree_sitter::TreeSitterMasker; use tree_sitter::Node; pub struct PythonParser { /// Used to grab the text nodes. inner: parsers::Mask, } impl PythonParser { fn node_condition(n: &Node) -> bool { if n.kind().contains("comment") { return true; } if n.kind() == "string_content" && let Some(expr_stmt) = parent_is_expression_statement(n) && (is_module_level_docstring(&expr_stmt) || is_fn_or_class_docstrings(&expr_stmt) || is_attribute_docstring(&expr_stmt)) { return true; } false } } impl Default for PythonParser { fn default() -> Self { Self { inner: parsers::Mask::new( TreeSitterMasker::new(tree_sitter_python::LANGUAGE.into(), Self::node_condition), PlainEnglish, ), } } } impl Parser for PythonParser { fn parse(&self, source: &[char]) -> Vec { let mut tokens = self.inner.parse(source); let mut prev_kind: Option<&TokenKind> = None; for token in &mut tokens { if let TokenKind::Space(v) = &mut token.kind { if let Some(TokenKind::Newline(_)) = &prev_kind { // Lines in multiline docstrings are indented with spaces to match the current level. // We need to remove such spaces to avoid triggering French spaces rule. *v = 0; } else { *v = (*v).clamp(0, 1); } } prev_kind = Some(&token.kind); } tokens } } fn parent_is_expression_statement<'a>(node: &Node<'a>) -> Option> { node.parent() .filter(|n| n.kind() == "string") .and_then(|string_node| string_node.parent()) .filter(|n| n.kind() == "expression_statement") } #[inline] fn is_module_level_docstring(expr_stmt: &Node) -> bool { // (module . (expression_statement (string))) expr_stmt.parent().is_some_and(|n| n.kind() == "module") } #[inline] fn is_fn_or_class_docstrings(expr_stmt: &Node) -> bool { // (class/func_definition body: (block . (expression_statement (string)))) expr_stmt .parent() .filter(|n| n.kind() == "block") .and_then(|n| n.parent()) .is_some_and(|n| n.kind() == "function_definition" || n.kind() == "class_definition") } #[inline] fn is_attribute_docstring(expr_stmt: &Node) -> bool { // ((expression_statement (assignment)) . (expression_statement (string))) expr_stmt .prev_sibling() .filter(|s| s.kind() == "expression_statement") .and_then(|s| s.child(0)) .is_some_and(|c| c.kind() == "assignment") } ================================================ FILE: harper-python/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use harper_python::PythonParser; /// Creates a unit test checking Python source code parsing. macro_rules! create_test { ($filename:ident.$ext:ident, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!( stringify!($filename), ".", stringify!($ext)) ) ); let parser = PythonParser::default(); let dict = FstDictionary::curated(); let document = Document::new(&source, &parser, &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(docstrings.py, 4); create_test!(field_docstrings.py, 2); create_test!(comments.py, 1); ================================================ FILE: harper-python/tests/test_sources/comments.py ================================================ # This is a camment. header = "This is a haeder." def main(): welcome_message = "Hellom World!" ================================================ FILE: harper-python/tests/test_sources/docstrings.py ================================================ """Errors should never passs silently""" def main(): """Beautifull is better than ugly.""" class Main: """Explicit is better than implicet.""" def __init__(self): """Flat is bettter than nested.""" pass def multiline_docstring(action_name: str): """Perform the specified action. Available actions: - stop - start - pause """ ================================================ FILE: harper-python/tests/test_sources/field_docstrings.py ================================================ class Result: output_path: str """The path to the autput file.""" status: str """The stotus of the job.""" ================================================ FILE: harper-stats/Cargo.toml ================================================ [package] name = "harper-stats" version = "1.12.0" edition = "2021" description = "The language checker for developers." license = "Apache-2.0" readme = "README.md" repository = "https://github.com/automattic/harper" [dependencies] serde = { version = "1.0.228", features = ["derive"] } harper-core = { path = "../harper-core", version = "1.0.0", features = ["concurrent"] } uuid = { version = "1.22.0", features = ["serde", "v4"] } serde_json = "1.0.149" chrono = "0.4.44" [features] default = [] js = ["uuid/js"] ================================================ FILE: harper-stats/README.md ================================================ # `harper-stats` This crate contains the centralized logic for Harper's statistics logging. ================================================ FILE: harper-stats/src/lib.rs ================================================ mod record; mod summary; use std::io::{self, Read, Write}; use std::io::{BufRead, BufReader}; use harper_core::TokenKind; pub use record::Record; pub use record::RecordKind; use serde::Serialize; use serde_json::Serializer; pub use summary::Summary; /// A collection of logged statistics for the various Harper frontends. #[derive(Debug, Clone, Eq, PartialEq)] pub struct Stats { pub records: Vec, } impl Stats { pub fn new() -> Self { Self { records: Vec::new(), } } /// Count the number of each kind of lint applied. pub fn summarize(&self) -> Summary { let mut summary = Summary::new(); for record in &self.records { match &record.kind { RecordKind::Lint { kind, context } => { summary.inc_lint_count(*kind); for tok in context { if let TokenKind::Word(None) = tok.kind { summary.inc_misspelled_count(&tok.content); } } } RecordKind::LintConfigUpdate(lint_group_config) => { summary.final_config = lint_group_config.clone(); } } } summary } /// Write the records from `self`. /// Expects the target buffer to either be empty or already be terminated by a newline. pub fn write(&self, w: &mut impl Write) -> io::Result<()> { for record in &self.records { let mut serializer = Serializer::new(&mut *w); record.serialize(&mut serializer)?; writeln!(w)?; } Ok(()) } /// Read records from a buffer into `self`. /// Assumes the buffer is properly formatted and terminated with a newline. /// An empty buffer will result in no mutation to `self`. pub fn read(r: &mut impl Read) -> io::Result { let br = BufReader::new(r); let mut records = Vec::new(); for line_res in br.lines() { let line = line_res?; let record: Record = serde_json::from_str(&line)?; records.push(record); } Ok(Self { records }) } } impl Default for Stats { fn default() -> Self { Self::new() } } ================================================ FILE: harper-stats/src/record.rs ================================================ use harper_core::{ linting::{Lint, LintGroupConfig, LintKind}, Document, FatStringToken, }; use serde::{Deserialize, Serialize}; use uuid::Uuid; #[derive(Debug, Deserialize, Serialize, Clone, Eq, PartialEq)] pub struct Record { pub kind: RecordKind, /// Recorded as seconds from the Unix Epoch pub when: i64, pub uuid: Uuid, } impl Record { /// Record a new instance at the current system time. pub fn now(kind: RecordKind) -> Self { Self { kind, when: chrono::Utc::now().timestamp(), uuid: Uuid::new_v4(), } } } #[derive(Debug, Deserialize, Serialize, Clone, Eq, PartialEq)] pub enum RecordKind { Lint { kind: LintKind, context: Vec, }, LintConfigUpdate(LintGroupConfig), } impl RecordKind { pub fn from_lint(lint: &Lint, doc: &Document) -> Self { Self::Lint { kind: lint.lint_kind, context: doc .fat_tokens_intersecting(lint.span) .into_iter() .map(|t| t.into()) .collect(), } } } ================================================ FILE: harper-stats/src/summary.rs ================================================ use std::{collections::HashMap, fmt::Display}; use harper_core::linting::{LintGroupConfig, LintKind}; use serde::{Deserialize, Serialize}; #[derive(Debug, Default, Serialize, Deserialize)] pub struct Summary { pub lint_counts: HashMap, pub total_applied: u32, pub final_config: LintGroupConfig, // The most common misspelled words. pub misspelled: HashMap, } impl Summary { pub fn new() -> Self { Self::default() } /// Increment the count for a particular lint kind. pub fn inc_lint_count(&mut self, kind: LintKind) { self.lint_counts .entry(kind) .and_modify(|counter| *counter += 1) .or_insert(1); self.total_applied += 1; } /// Increment the count for a particular misspelled word. pub fn inc_misspelled_count(&mut self, word: impl AsRef) { if let Some(counter) = self.misspelled.get_mut(word.as_ref()) { *counter += 1 } else { self.misspelled.insert(word.as_ref().to_owned(), 1); } } /// Get the count for a particular lint kind. pub fn get_count(&self, kind: LintKind) -> u32 { self.lint_counts.get(&kind).copied().unwrap_or(0) } } impl Display for Summary { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { writeln!(f, "`LintKind` counts")?; writeln!(f, "=================")?; for (kind, count) in &self.lint_counts { writeln!(f, "{kind}\t{count}")?; } writeln!(f, "Misspelling counts")?; writeln!(f, "=================")?; let mut misspelled: Vec<_> = self .misspelled .iter() .map(|(a, b)| (a.clone(), *b)) .collect(); misspelled.sort_by_key(|(_a, b)| u32::MAX - b); for (kind, count) in &misspelled { writeln!(f, "{kind}\t{count}")?; } Ok(()) } } ================================================ FILE: harper-tex/Cargo.toml ================================================ [package] name = "harper-tex" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } [dev-dependencies] paste = "1.0.15" ================================================ FILE: harper-tex/src/lib.rs ================================================ mod masker; use harper_core::parsers::{Mask, Parser, PlainEnglish}; use harper_core::{Punctuation, Span, Token, TokenKind}; use self::masker::Masker; /// A parser for Harper that wraps the native `PlainEnglish` parser, allowing one use Harper on /// documents written in TeX, LaTeX, or any other TeX derivative. /// /// This parser is crude, and could definitely use work if all features of Harper wish to be /// supported for the language. pub struct TeX { inner: Mask, } impl Default for TeX { fn default() -> Self { Self { inner: Mask::new(Default::default(), PlainEnglish), } } } impl Parser for TeX { fn parse(&self, source: &[char]) -> Vec { let tokens = self.inner.parse(source); collapse_tex_dashes(tokens) } } fn collapse_tex_dashes(tokens: Vec) -> Vec { let mut out = Vec::with_capacity(tokens.len()); let mut i = 0; while i < tokens.len() { let is_triple_hyphen = i + 2 < tokens.len() && matches!(tokens[i].kind, TokenKind::Punctuation(Punctuation::Hyphen)) && matches!( tokens[i + 1].kind, TokenKind::Punctuation(Punctuation::Hyphen) ) && matches!( tokens[i + 2].kind, TokenKind::Punctuation(Punctuation::Hyphen) ) && tokens[i].span.end == tokens[i + 1].span.start && tokens[i + 1].span.end == tokens[i + 2].span.start; if is_triple_hyphen { out.push(Token::new( Span::new(tokens[i].span.start, tokens[i + 2].span.end), TokenKind::Punctuation(Punctuation::EmDash), )); i += 3; continue; } let is_double_hyphen = i + 1 < tokens.len() && matches!(tokens[i].kind, TokenKind::Punctuation(Punctuation::Hyphen)) && matches!( tokens[i + 1].kind, TokenKind::Punctuation(Punctuation::Hyphen) ) && tokens[i].span.end == tokens[i + 1].span.start; if is_double_hyphen { out.push(Token::new( Span::new(tokens[i].span.start, tokens[i + 1].span.end), TokenKind::Punctuation(Punctuation::EnDash), )); i += 2; continue; } out.push(tokens[i].clone()); i += 1; } out } #[cfg(test)] mod tests { use harper_core::TokenKind; use harper_core::parsers::StrParser; use crate::TeX; #[test] fn ignores_comment_characters() { let source = r"%!!%"; let toks = TeX::default().parse_str(source); let tok_kinds: Vec<_> = toks.into_iter().map(|t| t.kind).collect(); assert_eq!( tok_kinds, vec![ TokenKind::Punctuation(harper_core::Punctuation::Bang), TokenKind::Punctuation(harper_core::Punctuation::Bang), ] ) } #[test] fn passes_comment_characters_preceded_by_backslash() { let source = r"\%!!"; let toks = TeX::default().parse_str(source); let tok_kinds: Vec<_> = toks.into_iter().map(|t| t.kind).collect(); assert_eq!( tok_kinds, vec![ TokenKind::Punctuation(harper_core::Punctuation::Bang), TokenKind::Punctuation(harper_core::Punctuation::Bang) ] ) } #[test] fn parses_triple_hyphen_as_em_dash() { let source = "A---B"; let toks = TeX::default().parse_str(source); let tok_kinds: Vec<_> = toks.into_iter().map(|t| t.kind).collect(); assert_eq!( tok_kinds, vec![ TokenKind::Word(None), TokenKind::Punctuation(harper_core::Punctuation::EmDash), TokenKind::Word(None), ] ) } #[test] fn parses_double_hyphen_as_en_dash() { let source = "A--B"; let toks = TeX::default().parse_str(source); let tok_kinds: Vec<_> = toks.into_iter().map(|t| t.kind).collect(); assert_eq!( tok_kinds, vec![ TokenKind::Word(None), TokenKind::Punctuation(harper_core::Punctuation::EnDash), TokenKind::Word(None), ] ) } } ================================================ FILE: harper-tex/src/masker.rs ================================================ use std::collections::VecDeque; use harper_core::{CharStringExt, Mask, Span}; #[derive(Debug, Default)] pub struct Masker {} impl harper_core::Masker for Masker { fn create_mask(&self, source: &[char]) -> Mask { let mut cursor = 0; let mut mask = Mask::new_blank(); let mut cur_mask_start = 0; let mut actions = VecDeque::new(); loop { if cursor >= source.len() { break; } let c = source[cursor]; if matches!(c, '%') { actions.push_back(CursorAction::PushMaskAndIncBy(1)); } else if let Some(s) = math_mode_at_cursor(cursor, source) { actions.push_back(CursorAction::PushMaskAndIncBy(s)); } else if let Some(s) = equation_at_cursor(cursor, source) { actions.push_back(CursorAction::PushMaskAndIncBy(s)); } else if !command_at_cursor(cursor, source, &mut actions) { actions.push_back(CursorAction::IncBy(1)); } while let Some(action) = actions.pop_front() { match action { CursorAction::IncBy(n) => cursor = (cursor + n).min(source.len()), CursorAction::PushMaskAndIncBy(mut n) => { if cur_mask_start != cursor { mask.push_allowed(Span::new(cur_mask_start, cursor)); } n = (cursor + n).min(source.len()); cursor = n; cur_mask_start = n; } } } } if cur_mask_start != cursor { mask.push_allowed(Span::new(cur_mask_start, cursor)); } mask } } /// Check whether there is a math mode block at the current cursor. If so, this function will return the amount cursor needs to be incremented by in order to escape the block. fn math_mode_at_cursor(cursor: usize, source: &[char]) -> Option { if *source.get(cursor)? != '$' { return None; } Some( source .iter() .skip(cursor + 1) .take_while(|t| **t != '$') .count() + 2, ) } /// Check whether there is a command at the current cursor. If so, this function will update the action queue to mask out the hidden elements. /// Returns whether the action queue was modified. fn command_at_cursor(cursor: usize, source: &[char], actions: &mut VecDeque) -> bool { let Some(CommandComponents { name, square_content, curly_content, }) = deconstruct_command(&source[cursor..]) else { return false; }; let content_commands = [ "section", "title", "subsection", "subsubsection", "textbf", "textit", "emph", "author", "part", "chapter", "caption", ]; let is_content_command = content_commands .iter() .any(|c| name.iter().copied().eq(c.chars())); let diff = 1 + name.len() + square_content.map(|c| c.len() + 2).unwrap_or_default(); if let Some(curly_content) = curly_content { if is_content_command { actions.push_back(CursorAction::PushMaskAndIncBy(diff + 1)); actions.push_back(CursorAction::IncBy(curly_content.len())); actions.push_back(CursorAction::PushMaskAndIncBy(1)); true } else { actions.push_back(CursorAction::PushMaskAndIncBy( curly_content.len() + diff + 1, )); true } } else { actions.push_back(CursorAction::PushMaskAndIncBy(diff)); true } } fn equation_at_cursor(cursor: usize, source: &[char]) -> Option { let CommandComponents { name, square_content, curly_content, } = deconstruct_command(&source[cursor..])?; if name.eq_ignore_ascii_case_str("begin") && curly_content.is_some_and(|cc| cc.eq_ignore_ascii_case_str("equation")) { let mut diff = 1 + name.len() + curly_content.unwrap().len() + square_content.map(|sc| sc.len()).unwrap_or_default(); loop { if let Some(CommandComponents { name, curly_content, .. }) = deconstruct_command(&source[cursor + diff..]) && name.eq_ignore_ascii_case_str("end") && curly_content.is_some_and(|cc| cc.eq_ignore_ascii_case_str("equation")) { break; } diff += 1; } Some(diff) } else { None } } struct CommandComponents<'a> { /// The command's name. pub name: &'a [char], /// The content of the command's square bracket arguments. pub square_content: Option<&'a [char]>, /// The content of the command's curly bracket arguments. pub curly_content: Option<&'a [char]>, } /// Deconstruct a command into its constituent components. /// Assumes the command is at the beginning of the slice. /// Returns `None` if not command is present at the expected position. fn deconstruct_command<'a>(source: &'a [char]) -> Option> { let mut cursor = 0; if source.get(cursor) != Some(&'\\') { return None; } cursor += 1; // The name of the command let name_len = source .iter() .skip(cursor + 1) .take_while(|t| t.is_alphabetic()) .count(); let name = &source[cursor..cursor + 1 + name_len]; cursor += name_len + 1; // The optional square braces let square_content = if source.get(cursor) == Some(&'[') { cursor += 1; let brace_len = source .iter() .skip(cursor) .take_while(|t| **t != ']') .count(); let content = &source[cursor..cursor + brace_len]; cursor += brace_len + 1; Some(content) } else { None }; // The optional square braces let curly_content = if source.get(cursor) == Some(&'{') { cursor += 1; let brace_len = source .iter() .skip(cursor) .take_while(|t| **t != '}') .count(); let content = &source[cursor..cursor + brace_len]; Some(content) } else { None }; Some(CommandComponents { name, square_content, curly_content, }) } #[derive(Debug)] enum CursorAction { IncBy(usize), PushMaskAndIncBy(usize), } #[cfg(test)] mod tests { use harper_core::Masker as _; use crate::masker::CommandComponents; use super::{Masker, deconstruct_command}; #[test] fn ignores_many_comment_signs() { let source: Vec<_> = "%%%".chars().collect(); let mask = Masker::default().create_mask(&source); assert_eq!(mask.iter_allowed(&source).next(), None) } #[test] fn ignores_single_comment_sign() { let source: Vec<_> = "%".chars().collect(); let mask = Masker::default().create_mask(&source); assert_eq!(mask.iter_allowed(&source).next(), None) } #[test] fn ignores_single_comment_sign_in_phrase() { let source: Vec<_> = "this is a comment: % here it is!".chars().collect(); let mask = Masker::default().create_mask(&source); assert_eq!(mask.iter_allowed(&source).count(), 2) } #[test] fn ignores_latex_command() { let source: Vec<_> = r"this is a command: \LaTeX there it was!".chars().collect(); let mask = Masker::default().create_mask(&source); assert_eq!(mask.iter_allowed(&source).count(), 2) } #[test] fn emits_all_command_components_correctly() { let source: Vec<_> = r"\begin[some]{math}".chars().collect(); let CommandComponents { name, square_content, curly_content, } = deconstruct_command(&source).unwrap(); assert_eq!(name.iter().collect::(), "begin"); assert_eq!(square_content.unwrap().iter().collect::(), "some"); assert_eq!(curly_content.unwrap().iter().collect::(), "math"); } #[test] fn emits_command_curly_component_correctly() { let source: Vec<_> = r"\begin{math}".chars().collect(); let CommandComponents { name, square_content, curly_content, } = deconstruct_command(&source).unwrap(); assert_eq!(name.iter().collect::(), "begin"); assert_eq!(square_content, None); assert_eq!(curly_content.unwrap().iter().collect::(), "math"); } #[test] fn emits_command_square_component_correctly() { let source: Vec<_> = r"\begin[some]".chars().collect(); let CommandComponents { name, square_content, curly_content, } = deconstruct_command(&source).unwrap(); assert_eq!(name.iter().collect::(), "begin"); assert_eq!(square_content.unwrap().iter().collect::(), "some"); assert_eq!(curly_content, None); } #[test] fn emits_section_correctly() { let source: Vec<_> = r"\section{Energy and Environment}".chars().collect(); let CommandComponents { name, square_content, curly_content, } = deconstruct_command(&source).unwrap(); assert_eq!(name.iter().collect::(), "section"); assert_eq!(square_content, None); assert_eq!( curly_content.unwrap().iter().collect::(), "Energy and Environment" ); } } ================================================ FILE: harper-tex/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use harper_tex::TeX; /// Creates a unit test checking that the linting of a document in /// `tests_sources` produces the expected number of lints. macro_rules! create_test { ($filename:ident.$ext:ident, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".", stringify!($ext)) ) ); let dict = FstDictionary::curated(); let document = Document::new(&source, &TeX::default(), &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(clean.tex, 0); create_test!(simple.tex, 1); create_test!(heading.tex, 1); create_test!(title.tex, 1); create_test!(city.tex, 0); create_test!(many_tags.tex, 6); create_test!(many_more_tags.tex, 11); create_test!(em_dash.tex, 0); create_test!(issue_2835.tex, 3); ================================================ FILE: harper-tex/tests/test_sources/city.tex ================================================ \documentclass{article} \usepackage[margin=1in]{geometry} \title{Urban Development Report: The fictional city} \author{Department of Civic Studies} \date{\today} \begin{document} \maketitle \section{Executive Summary} The fictional city is a fictional coastal city known for its advanced infrastructure, cultural diversity, and sustainable urban planning. The city serves as a model for integrated transportation systems and renewable energy adoption. \section{Geography} The fictional city is located along a crescent-shaped bay bordered by low mountain ranges to the north and wetlands to the south. The natural harbor enables a strong shipping industry while also supporting marine biodiversity zones protected by city law. \section{Population} The population of The fictional city is approximately 2.3 million residents. The city has a balanced demographic distribution with strong representation across age groups and professional sectors. Over 40 percent of residents work in research, technology, or education fields. \section{Infrastructure} The transportation network consists of elevated rail, underground metro lines, and autonomous electric bus corridors. Private car ownership is low due to efficient public transit coverage and pedestrian-first city zoning. \section{Energy and Environment} The fictional city operates on a hybrid renewable grid powered by offshore wind farms, tidal generators, and urban solar arrays integrated into building materials. The city maintains a carbon-negative energy profile during most months of the year. \section{Culture} The city is known for its annual Festival of Lights, public waterfront amphitheaters, and a dense network of public libraries and maker spaces. Local policy requires that new construction projects allocate space for public art installations. \section{Economy} Major economic sectors include marine engineering, climate technology research, and digital education services. The city government provides tax incentives for companies developing environmental restoration technologies. \section{Conclusion} The fictional city represents a theoretical model of a future-oriented city balancing technological progress, environmental stewardship, and high quality of life for residents. \end{document} ================================================ FILE: harper-tex/tests/test_sources/clean.tex ================================================ \documentclass[12pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{geometry} \usepackage{amsmath} \usepackage{graphicx} \usepackage{hyperref} \geometry{margin=1in} \title{A Small Representative Document} \author{Author Name} \date{\today} \begin{document} \maketitle \begin{abstract} This document demonstrates a minimal but representative structure of a LaTeX article, including sections, mathematics, figures, and references. \end{abstract} \section{Introduction} LaTeX is widely used for scientific and technical documents because of its precision and typographic quality. This document provides a concise example of common elements. \section{Mathematics Example} Inline math example: $E = mc^2$. Displayed equation: \begin{equation} \int_0^\infty e^{-x^2} dx = \frac{\sqrt{\pi}}{2} \end{equation} \section{Lists} \subsection{Itemized List} \begin{itemize} \item First item \item Second item \item Third item \end{itemize} \subsection{Enumerated List} \begin{enumerate} \item Step one \item Step two \item Step three \end{enumerate} \section{Figures} \begin{figure}[h] \centering \includegraphics[width=0.5\textwidth]{example-image} \caption{Example placeholder image} \label{fig:example} \end{figure} \section{Conclusion} This sample illustrates a typical structure suitable for academic or technical writing. \end{document} ================================================ FILE: harper-tex/tests/test_sources/em_dash.tex ================================================ \documentclass{article} \begin{document} No one's expecting you to drink yourself under the table---no one's ever expected that---but maybe a tipple is what you need after today. \end{document} ================================================ FILE: harper-tex/tests/test_sources/heading.tex ================================================ \documentclass{article} \begin{document} \section{This is an test.} Hello, world. \end{document} ================================================ FILE: harper-tex/tests/test_sources/issue_2835.tex ================================================ \documentclass[11pt]{article} \begin{document} \section{TEST} errawr % this will work this is an \test errawr % this will work this is an $\test$ errawr % this will break \end{document} ================================================ FILE: harper-tex/tests/test_sources/many_more_tags.tex ================================================ \documentclass{report} \usepackage[margin=1in]{geometry} \title{Shwcase of Common Readable Content Commands} \author{Exmple Author} \date{\today} \begin{document} \maketitle \begin{abstract} This abstract demonstrates readable narrative text stored inside the abstract environment. \end{abstract} \part{Mjor Structural Content} \chapter{Chapter Level Contet} \section{ection Level Content} This is normal readable body text inside the document environment. Here is inline readable text using \emph{emphasized cntent} and \textbf{stongly highlighted content}. \subsection{Subsection Level Cntent} This subsection contains additional explanatory readable text that expands on the section above. \subsubsection{Sbsubsection Level Content} This level often contains very specific technical or descriptive readable information. \paragraph{Pragraph Command Content} This command typically introduces a short readable heading followed immediately by readable explanatory text. \begin{figure}[h] \centering \rule{6cm}{3cm} \caption{This cption demonstrates dense readable description explaining the figure meaning and Kontext.} \end{figure} \end{document} ================================================ FILE: harper-tex/tests/test_sources/many_tags.tex ================================================ \documentclass{article} \usepackage[margin=1in]{geometry} \title{Demonstration of Readable Content Structures} \author{Exmple Author} \date{\today} \begin{document} \maketitle \begin{abstract} This document demonstrates common LaTeX structures that typically contain readable content for humans rather than configuration or layout-only logic. \end{abstract} \section{Introduction} This is normal body text, which in LaTeX is already primary readable content. Here is some \textbf{bold readable text} and some \emph{emhasized readable text}. \subsection{Structured Environmnts} \begin{quote} Science is what we understnd well enough to explain to a computer. Art is everything else we do. \end{quote} \begin{quotation} Long-form quoted text often lives in qotation environments. These typically contain dense narrative or explanatory prose and are high-signal readable regions. \end{quotation} \begin{verse} In structured lines the meaning flows,\\ Between the commands the language grows. \end{verse} \section{Figures and capptions} \begin{figure}[h] \centering \rule{6cm}{3cm} \caption{This caption contains concise human-readable explanatory text describing the figure.} \end{figure} \end{document} ================================================ FILE: harper-tex/tests/test_sources/simple.tex ================================================ \documentclass{article} \begin{document} This is an test. \end{document} ================================================ FILE: harper-tex/tests/test_sources/title.tex ================================================ \documentclass{article} \title{This is an test.} \begin{document} Hello, world. \end{document} ================================================ FILE: harper-thesaurus/Cargo.toml ================================================ [package] name = "harper-thesaurus" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] hashbrown = "0.16.0" indexmap = "2.13.0" itertools = "0.14.0" ruzstd = "0.8.2" [build-dependencies] zstd = { version = "0.13.3", default-features = false } ================================================ FILE: harper-thesaurus/build.rs ================================================ #![warn(clippy::pedantic)] use std::env; use std::fs::File; use std::io::{BufReader, BufWriter}; use std::path::Path; const THESAURUS_PATH: &str = "thesaurus.txt"; fn main() { println!("cargo::rerun-if-changed={THESAURUS_PATH}"); let out_dir = env::var_os("OUT_DIR").unwrap(); let dest_path = Path::new(&out_dir).join("compressed-thesaurus.zst"); let in_file = File::open(THESAURUS_PATH).expect("Thesaurus file exists"); let out_file = File::create(dest_path).expect("Can create output file"); let reader = BufReader::new(in_file); let writer = BufWriter::new(out_file); // Use a lesser compression level to speed up debug builds. let compression_level = match env::var("OPT_LEVEL").unwrap().as_str() { "3" | "2" | "s" | "z" => zstd::zstd_safe::max_c_level(), // 3.84 MiB _ => 4, // 7.02 MiB }; zstd::stream::copy_encode(reader, writer, compression_level) .expect("Able to write compressed thesaurus"); } ================================================ FILE: harper-thesaurus/clippy.toml ================================================ disallowed-types = ["std::collections::HashMap", "std::collections::HashSet"] ================================================ FILE: harper-thesaurus/src/lib.rs ================================================ #![warn(clippy::pedantic)] mod thesaurus; pub use thesaurus::thesaurus; ================================================ FILE: harper-thesaurus/src/thesaurus.rs ================================================ use ruzstd::io::Read; use std::sync::OnceLock; use hashbrown::HashMap; use indexmap::IndexSet; use ruzstd::decoding::StreamingDecoder; static COMPRESSED_THESAURUS: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/compressed-thesaurus.zst")); static RAW_WORD_FREQUENCY_TEXT: &str = include_str!("../word-freq.txt"); /// Gets a read-only reference to the thesaurus. pub fn thesaurus() -> &'static Thesaurus { static THESAURUS: OnceLock = OnceLock::new(); THESAURUS.get_or_init(Thesaurus::new) } /// A list of words numbered by frequency of use. The most common word will have a number of 0, and /// rarer words count up from there. fn word_freq_map() -> &'static HashMap { static WORD_FREQ_LIST: OnceLock> = OnceLock::new(); WORD_FREQ_LIST.get_or_init(|| { RAW_WORD_FREQUENCY_TEXT .lines() .enumerate() .map(|(i, word)| (word.to_owned(), u32::try_from(i).unwrap())) .collect() }) } pub struct Thesaurus { /// Contains the words in the thesaurus and their corresponding synonyms, both as indices into /// [`Self::deduped_word_set`]. entries: HashMap>, /// Contains (and holds ownership of) all words that occur in the thesaurus, deduped. deduped_word_set: IndexSet, } impl Thesaurus { fn new() -> Thesaurus { let mut entries = HashMap::new(); let mut deduped_word_set = IndexSet::::new(); let mut decoder = StreamingDecoder::new(COMPRESSED_THESAURUS).unwrap(); let mut raw_thesaurus_text = Vec::new(); decoder .read_to_end(&mut raw_thesaurus_text) .expect("Compressed thesaurus is a valid ZSTD file"); let raw_thesaurus_text = str::from_utf8(&raw_thesaurus_text).expect("Thesaurus content is valid UTF-8"); for line in raw_thesaurus_text.lines() { let mut words = line.split(','); let Some(entry_word) = words.next() else { // Skip empty lines in thesaurus. continue; }; let word_idx = deduped_word_set.get_or_insert_word(entry_word); let synonym_indices = words.map(|word| deduped_word_set.get_or_insert_word(word)); entries .try_insert(word_idx, synonym_indices.collect()) .expect("Only one entry per word in thesaurus"); } Self { entries, deduped_word_set, } } /// Retrieves a list of synonyms for a given word. pub fn get_synonyms(&self, word: &str) -> Option> { Some( self.entries .get(&self.deduped_word_set.get_index_of(word)?)? .iter() .map(|word_idx| -> &str { self.deduped_word_set .get_index(*word_idx) .expect("Deduped word set contains all words in thesaurus") }) .collect(), ) } /// Retrieves a list of synonyms, sorted by the frequency of their use. pub fn get_synonyms_freq_sorted(&self, word: &str) -> Option> { let mut syns = self.get_synonyms(word)?; syns.sort_unstable_by_key(|syn| { word_freq_map() .get(&syn.to_ascii_lowercase()) .unwrap_or(&u32::MAX) }); Some(syns) } } trait DedupedWordSetExt { /// Gets or insert the provided word. /// /// Returns the index of the word. fn get_or_insert_word(&mut self, word: &str) -> usize; } impl DedupedWordSetExt for IndexSet { fn get_or_insert_word(&mut self, word: &str) -> usize { if let Some(idx) = self.get_index_of(word) { idx } else { // Avoid cloning unless we're inserting a new word. self.insert_full(word.to_owned()).0 } } } #[cfg(test)] mod tests { #[test] fn great_is_synonym_of_large() { assert!( super::thesaurus() .get_synonyms("large") .is_some_and(|syns| syns.contains(&"great")) ); } } ================================================ FILE: harper-thesaurus/thesaurus.txt ================================================ [File too large to display: 23.7 MB] ================================================ FILE: harper-thesaurus/word-freq.txt ================================================ link anchor en links title doc abstract of the external and in a also see c history is s to career category list pages life all with from by was short early for school new notes on description place e as united articles birth at other film an b national awards reading district further or station it world album personal states high international season state series notable john track different education american south people biography de music may name war football reception article bibliography listing railway university death college d park that i city song first background plot county f band television m refer north league works geography family one n olympics tv west election u australia personnel club years british born production summer are results video culture route members york game lacking team language group gallery battle political general william cup river type canada r characters media cast year t house council which v church development o games kingdom association statistics l service singles party parliament david james j area legacy places australian known schools system he sports later century men release union books england former english current island h east professional records military g public airport law work p company government major two post no his k class zealand town women championship road location air division second services end lake line country popular this after be western radio thomas live thumb time canadian day comics paul transport use best events w human constituency la present critical population art book center charles act overview india playing alumni novel central arts al san royal european research selected design right community economy science publications award politics london catholic baseball saint politician record society structure based its peter used virginia image french home stub court black march richard during basketball final performance summary star great rock up museum hall has bridge german literature king japanese ireland man under you date information between hockey were footballer northern region france hill published america species three athletics army part stadium texas modern coaching water non rugby henry japan facilities set activities province washington street academy red number mark subdivision surname white coordinates institute historical pacific roman indian business main order most april technology actor republic last august germany social bay joseph civil grand climate power green old health writer weekly distribution smith july love show eastern theatre field office long local cricket force tour can open electoral organization department sport racing le management honors historic character about valley special architecture network ice transportation map christian operation theory rights musical features provincial related names etymology mesh africa regional fiction construction x style round term federal appearances blue winter era not model have jersey festival version code southern story navy my medical building px located studio board florida controversy police return program into fm typhoon songs original highway top they administration digital entertainment me chart children over big member religion light little four mary period cultural china scotland aftermath re head origin regiment data composition common status europe fictional classification martin musician municipal point author mount been fort origins scottish third play index operations municipality regular project single y space director van russian pennsylvania frank joe assembly tom mike lee congressional more african nd land scott brown arms movement mountain middle bank castle out player foundation borough creek computer jack systems young bill recorded written action independent but side victoria cross news night pakistan text administrative academic mexico asia alexander carolina us control don magazine wrestling aircraft rail official released louis village jean tournament recognition when ship section genus legal el ground prince representatives additional since baron medal secondary writing engineering co criticism jim free empire deaths massachusetts singer test ancient trade bob founded small rd artist role senior now fire railroad chinese coast memorial publication golden conference jones she irish kong response technical hong credits some through columbia soviet relations campaign form super heritage such beach process usa earl sea am staff recording synopsis range competition car called pre corporation spanish stage before senate convention rules student italian late industry box missouri analysis stations race training campus tropical natural against hospital studies commercial andrew lord youth clubs broadcast diocese mission future spain five port security individual only groups do federation forest greek queen forces function named products foreign food unit democratic norway following formation where age containing religious habitat changes daniel cd today established hurricane volume junior paris storm format recent commonwealth stephen gold table given taxonomy nations marriage body metropolitan energy units back president collection cricketer impact indiana channel marine characteristics plan library temple z supreme minister ad dance capital economic commission effects made well register bishop branch retirement past held wars italy case horse harry her native committee policy solo site maryland singapore bc comic chief ray conservation twin dynasty santa minor real primary until tony edition producer pop asian what corps divisions korea near officer bus times duke within sound plant sir support faculty engine governance several mountains disc there metro many israel private arena properties length heart medicine netherlands walter way interest abbey ships territory reference garden lists generation brazil latin built like educational influence del significance leadership rural nuclear cover battalion tourism flight wilson global tree leader using grid squad label squadron jewish including ben ecology down sister tower lines others market than review ward naval standard du around infantry physical treatment level fleet composer go had literary opera environmental swimming created actress access square anti cape olympic governor sun change samuel both justice definition speed equipment son off method girl traditional wing authority electric hampshire press manager event congress stone matthew complex elevation compilation complete tennis run voice safety minnesota polish colorado call urban leaders layout usage parish soccer mathematics journal self days key earth stories simon coat metal silver content da famous formed rule block philosophy acts your poetry township lewis philadelphia stock boston boxing hotel iran left instruments dutch camp atlantic philippines episode legislative marvel base front lady candidates example exchange stars miss dead found meaning draft upper multiple discovery six living large classical being hot maria blood acting ministry grammar dc malaysia tax command course broadcasting position executive will active served syndrome machine recreation wildlife we gordon often miller nova good cathedral trial care expansion god boy seven presidential crime fox lower ski managerial sam details child tennessee poet associated palace geology founder played dark creation professor how di without kentucky financial murder full gardens swedish scout originally word sign tim these adam turkey defense include wood guard produced theorem orchestra saints rose numbers various elements orthodox shooting pro bell ten princess journalist holy revolution points effect train stakes wisconsin plants dog billy lost minutes angel labour domestic infrastructure settlement fourth zone sales circle issue athletic norwegian peace fame same falls portugal independence berlin contemporary study parties prize trail doubles hours des master environment cell industrial oil nature arrondissement ring powers alliance roger boundaries birds terms freedom each double allen sometimes bad peak letter mid concept trophy so parliamentary developed transit total czech similar grant highways fish amateur guest reserve ross juan ford communist southeast alternative partial moon intelligence iron christmas annual protection elected theater reaction formula oregon greater source sights limited animal ca mass joint usually aerodrome movie card views russell drama khan imperial introduction formerly workers ocean gas purpose coach postal activity premier low figure scientific any methods diagnosis les wild amenities jazz disease parts half flora border rome product constitution page count switzerland crisis belgium mobile web just opening trust deep resources yorkshire jonathan austria walker daily communications dr agency if secret vietnam conversion ba naming conflict brigade flag membership chemical match contest siege mexican harris fantasy along avenue portuguese lincoln statutory danish thompson operational magic cycle report commonly wine lyrics acid electronic ages doctor dam sex owned next person nick affairs brunswick then publishing luxembourg founding medieval application kings ownership newspaper view roy trek outside kelly nine mar census animals sur johnny growth functions learning bird tracks kent animation hungary graham passenger treaty marshall ac dean demography largest attack korean moore planning observatory biology behavior raf legend dj profile female clinical important dream genre canal golf debut cold bar mixed cuisine windows cycling aviation chemistry morris dd agriculture writings accidents reign male higher surface heat liberal woman victor prime resistance practice jesus channels another adventures criminal variations designed oxford ethnic defunct context vehicle promotion blues brother skiing evolution folk sky success mayor planet emperor comparison glass cleveland while warren challenge hunter relationship ken brand concert spring regions previous combat honor jimmy et multi basic classic ab tank fauna republican defence semi hand dragon baker nation transmission audio mechanism crown anime reform won start soul standards skating muhammad directors own ball colonial benjamin socialist geographic editor gun farm physics chapter phase advanced logo driver charlie friends teaching symphony bowl motor delaware jay bulgaria sunday oblast jane alpine working express arab universe protein operating mine comedy clan wright orange steel shopping runner signs distance establishment fund fair cinema prison lieutenant accomplishments nelson economics emergency drive captain property buffalo cruiser anna investigation money selection bonus price performing disaster rolling muscle fall material decline institution computing bands diet wall laws week result reproduction grey starring room lead closure symptoms roads problem preservation historian words size flying luke incident problems mans come ss cited rate nerve mythology invasion gene platform miles knight bible autonomous tales father terry rise opposition translation secretary baby insurance boat very alaska morgan housing wind casting running jerry junction massacre contents among proposed make piano gray search winston pan gymnastics eight leading influences specific our guy beyond per operated apple ancestry fiji ridge occupation visual adventure yellow wave poker dick mother color journalism decorations chess eagle ma martial principal satellite estate covers missing os classes transfer revolutionary welsh rob wide representation lane means chain surrounding adaptation trivia turkish here elementary mill fifth combination delta supporting extended jacob identity mall tunnel fighter interpretation sexual greatest circuit sr rick revival submarine derby crew thailand solar setting rev hope champion appearance get carter unknown cat eye closed beginnings fields referred il expedition connections fashion loan businessman engineer together technique finance robin colony scouting progressive ministers upon episcopal marketing li initial pat alpha figures painter isle saturday guide jordan glossary feature desert internal christianity wolf preparation indigenous theme talk materials gulf move marc zero reactions restoration beginning highlights universal yes guitar abilities traffic races ferry memory bobby collegiate extension cuba judicial never fighting far mining weapons quality na conditions value houses jo franklin ram devil heights traditions peninsula legislature needing motion ultimate file springs sale entry corporate conservative chamber bryan vice touring split screen northwest artery ng according sub austin direct actors rich ghost gabriel schedule programme judge hip families activism trinity ottoman personalities ne synthesis punk drug stand communication cancer tribe picture christ buddhism again them armed baronet alice interstate die rice pool coins across note citation artistic arrest mile collins strike sons began publisher considered fast lang analog depression guinea true sailing cabinet ranks nicholas algorithm rescue gilbert foster snake crossing calendar bear uniform seventh agreement rank underground destroyer charity still isaac residence chad broadway archaeology immigration monastery wife serving movies every commander spirit variety rowing prominent coverage take featured those bone hunt listed gate strategic personality involvement roster pass hop due choice possible nevada components factor commons mars core combined flow curriculum victory tommy sixth charter heavy truck ra host cook testing prefecture mac organ architect giant glacier differences spider crystal making faith qualifying brain est gender connection spin diamond cable face cause sequence labor guild cole muslim colombia pressure mathematical virgin tr scale subject maritime outstanding hell vermont documentary primarily laboratory venezuela chile roll frog better abraham orders mart interior wilderness optical foot away quarter otto let civic animated designer mind led te prior bass grace reservoir protocol miscellaneous logic bush vampire ap qualification experience subsequent belgian butterfly inter hard relation psychology charlotte empress vision fine terminal motto symbol store facility storage representative owner adult turner liberation equation device although funding letters instrument franchise arabic dna leo democracy shaw regulation terminology sacred received loss carbon headquarters recurring edge stop paper landing parker employment venue gang wheel legislation indices brad harvey scoring phonology organized marines session genesis childhood archaeological weather speech seat painting supply soldier morning enforcement sussex scandal chapel assistant activist patent heads confederation quantum coastal woods outline caption tradition philanthropy manufacturing jamaica pilot agent kenya hollywood bronze monument vol therapy superior steam agricultural object acquisition sisters knowledge josh winning processing factors persian highest fuel plans resort nationality hour decision cooper teacher botanical significant priest liberty slam mosque merger things phoenix hero associations derived opinion portland facts described continental shah auto armstrong pr would statistical persons debate geometry requirements canton bo mode cells bb teen arnold rogers ride pope enterprise signal shadow virtual tiger reports theories forum vienna photo grove procedure included profit extracurricular degree much applied zip renaissance bureau liturgics either assessment zoo grade travel fa ha fencing capture shore graduate ms angels via oldest justin crash once coup investment defined cave hurling competitive string measurement presidency lions credit truth leeds viscount mental breeding egyptian dispute constitutional mi grande gregory friday violence sweet se normal mason advertising fr expressway typically transition pattern principle fly close chairman beer principles populated subspecies worldwide pink noise contract refuge camera astronomy abuse finnish tours tea watson virus succession hundred bicycle theology sequel heaven relief strategy rhode evidence chase scholar maintenance throughout min durham arm southwest shield overall height previously income athens ran porter offices risk artillery scientist lives ho generally available sword protected affiliated molecular ko dame plus operator currency commerce weight kids eyes break bond sierra perry ranking julian having draw worship ups sporting indoor fisher electrical bailey sector daughter trilogy stores salt oak mostly manhattan dictionary implementation formal fan launch hardware cultivation anglo retired nancy condition surrey hindu es display assault manor gap frequency snow soil simple nearby know progress ibm courses chi diving photography villa coalition claims alternate select reed dual direction joel glen fate boundary aid rebellion mini cavalry score saga heath gauge factory tale potential custom voting reconstruction tourist afc symbols directed composed strip identification butler twenty monday scheme patrol attorney sugar newfoundland meeting matrix hart participation component collected partnership trinidad leg gear architectural verse styles him beautiful auxiliary senator pictures gay argentine experimental commissioner advantages escape dale because million lived drum too frame fight bengal trading summit electronics contact worked monster outer modeling disorder user hebrew bermuda skin philosopher locomotive geographical canyon biological variation medium inner incumbents basin arboretum portrait burial pinpoint situated performed neighborhood grounds certain canon solomon fishing situation interface iceland claude swiss polo chronology syria nickname approximately walk tools representing guitarist bottom ti ethics participating interests genetics volleyball rapid nomenclature jerusalem vale path earlier domain statement oscar insignia cost beat palmer noted got decade especially ceremony approach inside idol globe wings residential movements journey collaboration departure dominican alive sessions chronicles anniversary northwestern archives clay registration prevention holmes rocket print palm somerset juno shanghai pine budget reactor particular broke address started mainly gaelic execution hull involved ruth thunder seal stevens net monte devices allied ratio dialect cargo riding mystery pride sultan importance ni kiss evil practices resolution proof officials lion lebanon courts width turn artificial wireless unified bomb rally accident prayer linear framework anatomy stamps orbit monkey jam exhibition cove berkeley bracket dry cyclone citizens roots novelist marco capacity bruno ce carnival ballet sc telephone quotes plaza ge clock beta mechanical mean terror saxony algebra processes romance exit theological strong genetic rifle notre translator theatrical stages hit ecclesiastical clothing casino broad federalist deal un reunion hole emma behind appeal script rod northeast kirk wards basis experiment want severe paradise cox raaf permanent bodies server honorary ulster tobago loop levels degrees fruit flat dollar cadet batman shot reality scene chuck brook arc spiritual milan thought armenian ace triple suffolk lineage deputy randy initiative biblical responsible censorship above mad integration exile capitol benefits bang windsor quest mechanics focus ki buddhist motorcycle feeding cheshire sin shop roosevelt extra below springfield soft graphics archipelago warfare provinces jurisdiction bombing wednesday malta limits spaces dated continuity ex copper artwork tributary sandy manufacturer kit pipeline lawyer stint mp downtown civilian rulers mv snooker frontier automobile alexandria coal tucker oh jumping lights diameter berry roland plane handball graph foods evaluation conductor choir certification versus piece pi navigation dogs compounds vector temperature hosts overseas consisting carol pearl mail least abc differential carrier atomic turtle rocks gospel superman said measure holder grades forever declaration prelude rez rainbow goal step madonna lies ensemble belt parkway banking anthology reid negative charge salvador rocky duo door cut suicide regulations harbor diplomatic willie rivalry percy extreme waters simply seminary pioneer kerry doctrine affair happy deceased hybrid fear dancing croatian organic hinduism collective marathon ham thing replacement injury worth sutton poem lodge horror floor element peer daughters brewery troy terrorism flood descendants balance achievement laser actions roller goes availability aboriginal spectrum epidemiology adoption need lie heraldry ones variable mirror horn curve arabia say concerns mouth fijian dress circus rotation robot positive boulevard graphic flower fe chocolate partners ar alone sides recovery morphology landscape gothic prairie ever congo comes descent id holiday colors plains nordic blind threats rising preparations hands designs countess particularly moving functional alcohol target retail midland leisure vinyl territorial holdings archbishop rain few emblem diana cork beauty phantom damage creative rosa diesel designation corner automatic twelve restaurant lords jump hood folklore affiliation structural sprint matter presentation nothing kill integrated glory liquid reissue offensive survey speaking sold ngc leaf candy broken ant trials pay militia smart crazy consumer coffee testament im fixed papers din cyprus watch values strange row stream potentially maximum lateral edited dreams discontinued celebrity ban riot chen appearing unity oceania duties battery shape reasons postwar pieces latter interchange conspiracy comedian variant launched crater bull bath waste triangle less consequences burke tin standing plate walking cardinal perfect haven victorian sponsorship shire assassination expanded barton sanctuary kind acoustic silent popularity moses hunting gubernatorial distributed boxer become antarctica swan successor morocco task meat instrumental even counter ash res philosophical dedicated reporting dawn physician fat duty gamma plateau notation lyon efforts ag account warner tornado itself fortress reformation merchant griffin takes panama provide lineup commune brief bowie welfare particle look lawsuit killing tram solution average adjacent vocal sample measures magnetic pet kuwait savage mouse forward egg affiliates memorials false conquest win pa cooperation alphabet wonder something fusion canterbury save responsibility crest cash bin ur rest help going completed belle tailed tactical seen scholarship closing intermediate encyclopedia cliff shark mascot kyle involving tool spelled maple axis attempt soldiers rapper peruvian oriental dodge chapman ana inn fluid assignments mineral covered bowling sunshine presence photographer parallel lighthouse failure eu commentary rider parade jet halifax reputation archdiocese advocacy syntax potter nationalism midnight badge though sideman noble must midlands longest exodus resource rare layer earthquake surgery scope petroleum lancaster consent switch playwright legion conception nursing moss milk documents bas towards thursday successful subway pond lens pure lacrosse botswana samurai mix holding expression trio lotus latest lot diversity copenhagen citizenship sculpture raid pound neo literally geo duck curling aa stress migration admissions rat forests congregation cognitive quartet compact chair pain month falcon employees colonel rush billboard hawk galaxy dissolution conviction chip aerial dynamic dental slayer reconnaissance interaction guns designated sand reduction pole missile hearts cards apostolic items interactive highland ferdinand window sue read random niagara mo joshua worlds tag stick radar preparatory guests friend cream winner sheep sharp lock arch airline thomson elsewhere corruption boom basque venus error document cartoonist antarctic suit strength southwestern plantation exploration trent spy premise diplomat archive yan wrestler tribal strait mickey limit liberia hair electricity discrimination starting singing sidney ladder separate inventor herald taken mick divided sodium patterns abbreviated presenter partner outbreak jerome hypothesis bit waterloo tuesday preliminary chronicle tonight spoken message jenny duchess cap beliefs transformation suburban copyright constituent concentration carpenter battleship touch monitoring defensive automotive selling rather endemic cartoon flash drummer cherry ware skills enemy cannon widely pair gaming educator bach younger solid sense gates destruction specifically lithuanian theoretical static sleep runs passage intended governing buck electron den beck vista tomorrow renovation receptor ethiopia cotton marching psychological millennium lu feed computational bat warsaw wade ta sol clarence binding academia darkness withdrawal weapon publishers judaism indo dirty vegetation tell evangelical divine attendance administrator stroke silence collapse tenure reformed craft wanted goods destiny bal tactics surviving radiation manila extinct confederate speedway killed kid examination critic alleged unique reservation regulatory presented ga scores officially explorer difference byzantine root density taxation rn detection voyage dimensions coming bright tissue posterior hold poor plain honey fbi portion keep incorporated ideology deer casualties assistance tanzania omega maxwell inspiration eve equal concerto compound algebraic parent license controlled ambassador allegiance wa sainte sailor planets innovation dynamics baroque delivery churchill taking si radical postage phylogeny lands issued climbing acquired violin cedar burning accounts vessel practical killer everything accounting vertical sheriff shell relative cl arctic treasure speaker sonic sociology serial punishment po disk stones marsh horses holocaust attribution tibetan rolls chicken cheese remote prominence marina mansion larger elder easy bankruptcy armored wedding logistics limitations almost tube remains priory planned phrase objectives mercury files distinguished cry boards trick sp shift keys harper eden driving labrador entrance breaking why mon lance correctional suburbs southeastern ranch plymouth module costs ambassadors supported shrine purple heavyweight barker recreational pollution moment em translated pocket manufactured lynch inquiry firm drugs connected bee temporary rhythm neck kurdish infection grass collector carry yale plastic ideas cloud whole volunteer tan royce rhine highlands ecological cuban circulation provisions guiding debt deanery authorities veterans twentieth ruler fraud drop column changing vocabulary rabbit pipe oxygen job farmer demise chilean question ninth namesake monsters imaging hi promotional notability helicopter fritz freeman describe constant athlete appointed zambia tau squirrel inferior follow dove annually trump pregnancy jungle explosion diaspora sing partition numbering hampton gravity give cr toy symmetry majority fever faculties coaster chromosome providence approaches twilight steps narrative eighth dimensional coin albedo warning typical trap inhabitants comprehensive anterior tai lizard fern amendment ways unclear stem removal manual lighting franco audience toll surveillance sculptor regency recognized lay dorset wise systematics intervention dating older linguistics imprisonment advance skull occurrence noel hidden finite enrollment thoroughbred skater should ion filter wire warrior trouble straight revenge polar output epic dust counts cool beam barbados advisory slave rebirth prognosis nightmare joy hastings exercise ultra subjects slang saw sally chambers beast volumes seeds sanskrit portable nad hammer cake admiral fortune flowers tip feet echo coventry bronx barber relay narration illness drink booth appointments organizational simulation headed raven downs always shared roses bud boot specialized screenwriter revolt procedures predecessor judiciary hamburg efficiency continued addition thermal spelling seed protestant lorenzo equestrian wan subsidiary specification rhodesia missionary keyboard fountain gross bangalore utility toponymy suburb shock rehabilitation pyramid meet continuous tomb sharon ruby rabbi paraguay monthly appeals purposes pen initially fairy dolly admission shin nobility lac chaos cattle cancellation panel mighty linked aims uprising stark printing evening discussion caused borders undergraduate topography spread registered logos fossil comeback chronological brewing schism rings guyana contribution candidate baroness arcade voices resignation mormon flowering equivalent detector commissioned citizen breakthrough intellectual brussels resident legendary hammond growing fiber customs communal charges verb smooth signals reserves offered magnus earliest dangerous classics becoming viking share scots put expeditionary attention looking illegal dong skeleton revenue reporter ligament fi discipline au aerospace naked gymnasium cm vote twins thousand sat moor demand trip tone periods dimension yard wyoming weber sustainable pharmacology op numerous miracle curse witch soap romeo reach rates alma acquisitions welcome vocational physicist ecuador corridor pavilion mainland economist eclipse cruise bones actual tables surf specialist riverside merchandise litigation isles incomplete fundamental tracking hay dancer cherokee beaumont walls oval leave hancock eleven detention depot covering clear broadcaster berg assigned valve tunisia think patriot goddess fellowship darling crow archer sovereign placement palais marks haute grave funeral developing cia safe riley rides provided proposal lucky diary developer monk gone dei altitude sounds regina pier pack monitor melody handicap germanic feel essential antiquity alien symbolism studied signature infinite demon cooperative appointment volcano fury basilica vein oriented input humanitarian hale cats blade albatross vic nationale inch heather hardy gods con stanford slovak puzzle presents outdoor losses frigate flint elite elephant deficiency conventions vietnamese toxicity signed rite please narrow literacy ers comet telescope mont intelligent fuller ended ado pump mediterranean inlet editorial breed pierce governmental directly demolition statue slow mobility holstein dissolved cameroon ranger drums bills autobiography argument amazing parameter oral motivation marxist disappearance slavery knife instruction icc guru gloria proposals kr gecko bend absolute modes habits discovered craftsman centennial canonical bec arrival receiver preserve mc clause abortion tape prisoner poverty pitcher depth barrow und tang separation dear arguments venture valentine tribute tobacco thin sunset rouge packaging judgment idea tensor rna pretty nina hook existing responsibilities minimum lesser laurel fun cult atlas visa however guardian dell clara bypass voyager rating banknotes owl negro mapping lambert editing crescent create atmospheric zones wear rebel protest persecution ja guards creator check apollo wake temporal plasma pistol hare ending dad crane concrete bread benefit turbo suite holly existence tribunal required influenza friendship commodore modified lung explanation entrepreneur duchy winchester slavic servant sentence regent probability payment operative madness dependent wish unitary troubles ro feeder creating controller ruling mara lawn hiatus graduation galloway drawn cylinder bliss bias bachelor astronomical weekend russo passport meter mandate doo dialogue deaf chancellor sharing phone integral commemorative clergy arrow technological produce moved moral handling barrier ability nationalist ivy finish bike ashes troops struggle mutant moves married flame consortium ancestors smoking sm shipping securities feminist enzyme combatant sonata ingredients gateway danger conjecture certified associates visit stay sparrow raised influential empty bound tie pottery plural originated commemoration burn assets stoke sino honeycomb composite cluster bid arsenal needs muscles humanities controversial chance bow barons apocalypse yacht suspension survival premiership lift forming certificate softball shepherd seine placed oxfordshire merged mama flip dover deployment concerning bacteria armament spatial monarchy joined emmanuel salle regarding referendum raj nixon lam geological consul swing prostitution norm changed caesar armor aquarium seas remake questions purchase piper manuscript evolutionary baba acacia abolition tanks rough orchestral nurse icelandic hat diagram charleston believe beaver spectroscopy generator endurance charitable producing princes ph northeastern manifesto lone invention gathering futures everybody circled bluff providing pin mutual mint licensed holt flu complexity unionist printed minority fought detective constructed theologian talent stamp rubber rookie reader fife fabric corpus configuration bean aim transactions tolerance monroe merit laos dome berkshire wizard weeks transmitter sparks jill icon garrison failed enough catch talking rwanda might kick instrumentation effective dynamo branding umpire torture racial physiology occupied gp excellence distinct competitors birthday voluntary understanding ration neural lightning freight collaborative autumn atlantis abbot wheat throne pitch instead highly derivative brass stern sterling herb engagement devi colombo calculus uganda tate sixteen scholarly prose pronounced powered ping performer optics maya harmony fantastic exposure er biggest adopted pleasant oxide gill cologne celebration anthropology spectral serve pigeon penny interview belonging battlefield wheeler tract managing liturgical linguistic gazette easter constabulary canoeing airfield perspective pepper matters masculine fresh dock atom amount airlift veneration tail spa saving parry miniature favorite compression angle quiet pratt nucleus myth magical lunar lifetime increase hank feminine doll connector codex chloride advocate thus returns parameters objective fork eligibility directorate dances ville uncle subfamily panther extent compensation binary vault roma protect observation iris drake deck corn conventional consumption basil threat proper mainstream funk funds traditionally shaped onwards homer grants gandhi adverse toad provisional ideal graves chorus breakfast spike proprietary motorway medial marker improvement demos barney soup showing sheet posthumous ordinary occupational mercy innovations georgian coinage chef amazon alto vascular phenomenon historically curry consolidation commanding aria veronica quasi push pageant meridian gen forced determine tributes topology tongue sophia resurrection pastoral mls macedonian halls unification telegraph swift semantic salisbury reflex probably pirate norwich extinction boarding wartime trades tat smaller parable meadows dot ton platinum modification longer limerick knockout invisible expert done claim benedictine visiting unlimited transmitting revised retreat represent rage processor lab handed fatal embassy clean auction uranium thirty sum secrets raw proceedings paradox inscription flesh fishes drawing crimson convergence build worker survivor polis moray manufacture mandarin kangaroo gibraltar formally connecting biographical barracks badminton underwater spot pronunciation promise fitness estonian encoding cynthia cutting blast associate anthem adapted sexuality reverse inspired horizontal contrast vocalist trademark rivera gift gambling automated aurora pandemic clement smile rap palatine orbital frequently elimination dairy boots albanian upright shown relocation polytechnic farming cooking chin botany bed torpedo princely paso nasa modular metabolism groove credited closely yet scenes psychiatry otherwise methodology magnet landmark induced hydrogen generic choral authorship repair projection incorporating finch fact facial determination classified tooth thinking spacecraft selective homes dinner coliseum cobra civilization bells bag watershed venom tiling nomination goodman fallen calculation smoke ruled ritual rapids package orthography minute lorraine lily lex evergreen derivation bunny attraction wet shadows roof populations himself fell export cosmic amos ready jury flute fellow entity col bi neighboring log husband greenwood acres poll passed nutrition nervous membrane hawaiian findings find ethical driven daddy cure companion watts travels segment risks restrictions resonance remember privacy organs maker load frost balloon qualifications progression levy leaves hearing varsity surgical sultanate reached harvest gambia enfield electromagnetic einstein devils developmental deluxe concord compatibility colonization visitor slough micro continuing ariel accuracy abroad whether sage regression pleasure moth met honduras buddha vera vaccine truman propaganda principality passion hollow furniture eternal donna consolidated breakup bars thirteen stud spell senegal raphael phosphate financing ends eat ear cord cigarette woodland voltage vila reason quarterly passive essay equilibrium duff conservatory cinematography bloody ambulance alignment themselves rear philharmonic maiden hereditary fully fra bubble bon afro secular pony panic olive martyr knot indexing ghetto finances deputies cone cam bring asset aged till scheduling ribbon racecourse psychologist premiere juice gloucester genome ballad wooden wheels waiting tenth subcontinent squash sole perception manifold leaving lamb fee dylan collar automation auditorium urdu theft relevant passing particles oath feast cyril copy bye bauer astronomer arrangement toward sick romani regal napoleonic mud influenced guided distinctions chartered cain af added vanguard sunrise skyline pursuit powder pascal loch libertarian hector flux characterization blocks auburn speak rounds respect reef preceding lea kana chosen butcher breakdown bourbon awareness aquatic torah thesis quick hamlet terra sensor regime numerical infinity electrification dharma cs creole catalan alba affiliate yo trace titled sphere sonny promote pinball nobel nearly jade ins finn fer falling eyed coordination clinic attached watt tide taxes spent recruitment provider metric mccarthy harness entropy commissioning blessed rape offshore nearest nato lack kitchen intersection holds goose fathers competing cola tribune throw silk rhodesian propulsion patient mat managed hello finding emerald dying directory directing assyrian tier royalty pig peel orientation mound household genealogy drinking contain console conduct conclusion cellular cb accommodation zen weaver textual tall shan painted liability identified defeat willow viral terrorist stein spur roughly logical jesuit jennings insect costume collision carried antony velvet tragedy surgeon romantic liturgy hate goodbye creatures coral acute voodoo stranger someone noun neighbourhood dwarf deadly assumption acronym swamp solidarity sands mythos hubbard emergence drinks drag dish democrat delay breaks babylon wen veterinary tam shelter relativity neutron luck feminism fault characteristic ceremonial captivity barrel surrender predecessors penguin peerage oracle mal flemish equality bury banner attributed treasury rt respiratory prohibition parachute impacts companions claus brush believed belief visible transcription shine phrases pace mead inhabited grange forensic eggs circles cipher carriage worcestershire timing soon shooter none goat endangered crossover coronation completion client appear amber wrong whale waves trunk tire swimmer projective praise possibly planetary marshal galactic forty fool desire custos botanist yukon vintage terrace silicon prices opposed nickel mysteries lava floating disability confidence ammunition returned pseudonym poison pit offering nice largely knock indicator hercules freeway daytime calling afghan sent mirza madras ling gus foundations forgotten exterior cyclic coupling brought benedict vengeance valencia scenic papal opposing ongoing joining isolation grain gain finger diagnostic detailed derrick cite chandler buy buddy alcoholic vacuum twice showdown refugee racer pharmaceutical outcome orphaned moments lyrical hierarchy haunted grape ghosts claimed catalogue capabilities bumps tuning rogue renewal premium occur observations nicaragua measuring loose inventory bowls ara accepted truncated ticket sinus rope prussian pathology mortgage mixing kildare exist continent buzz brewer yearly transform rites relating packet entire wonderful verses subgroup pot mater invented hara feeling dentistry brotherhood bel asylum nominated monetary kara inheritance indirect equity dub demo circular bride allow twisted triumph shoe repertory qualified prehistoric outreach leninist interval electorate unofficial toed thyroid rhythmic resulting potassium willy spinal signaling reduced liberties lattice employee dinosaur creed boss blitz va synagogue suppression superstar suffrage successors portal ink havana foramen expo enhanced converted attributes velocity ugly quarry peabody nonfiction napoleon installations immaculate gridiron generalized doom worst vickers taste rover recently rational postgraduate penalty mer math luna knee induction hedgehog gorge dominion cycles campo bug amusement write shake salmon relegation petit patriotic parking neutral mafia inspector hoffmann giving distinctive ceremonies brick breaststroke bomber bobsleigh advantage adler superintendent serious screening moroccan margin lesbian historiography hiking hang fry culinary bacterial sauce sandwich rh pike meadow lover illusion gore formulation disposal anything sleeping shoulder saved relatives prototype prophet plexus pal merry mauritius fiat discharge destination consciousness bundle affect typeface synthetic relatively realism professors paisley goldberg comparative autism alumnae accessories wax spotted sheikh rays pentathlon mixture lonely experiences except effectiveness craven camping bluegrass alley yiddish wreck try takeover stella shoes sang sacrifice regarded powerful novi encounter eddy cage backstroke told redistribution rabbinic phases freemasonry dowager contested clerk chant announced synod rockies reported psycho luge ira hemisphere genocide follows feud executives effort compared bugs amor wedgwood utilities tertiary remaining punch pricing odyssey mongolia flooding drainage dracula diplomacy custody cubic chronic caucasus bloom battalions weir transaction scandinavian raising python percussion paddy insurgency desperate critique connect burgess builder violinist rooms moody innocent friendly denomination crusade covenant champ cafe bullet baton barking worms workshop weird surfing scarlet saddle rue que nickelodeon machinery locality gal educated dice deals constellation chemicals cardiac blanc vega slovenian setup revision quotations increasing hydrology heard elm dissent discrete corvette collecting arrangements appleton subordinate souls sirius reich nerves memoirs internationally hear correspondence charger brave alarm advisor upgrade safari metabolic marked levin latitude forks exclusive dixie cowboy constraint consecutive commissions bottle bamboo atmosphere anonymous vital substance sensory obsolete monarch milo ivory hunger diamonds confessions cavendish audit twain paperback mob manx immune hub hq glider geometric emerging dom daisy causeway capitalism aspect allocation able tractor salvation pulse patriarch paramount ordnance normally jeremiah frankenstein employed emission dauphin cha burmese alta trout sulfur spirits sad pick observer jaguar greens finished emeritus ea dirt decoration array specialty scanning rosemary registry reasoning raja marquis deception correction click banded advice zinc votes ties strain rhetoric repertoire realm ordained nightclub ministerial memories lemma graf controls congenital colliery browser aux activation wrath textile ranked portfolio offence kaiser inverse informal inclusion hawker forestry downfall computation cheap atkins alias accessibility turf terrain termination slide seasonal patronage pastor mercer greco gladstone fanny extraordinary dramatic diver dirk apprentice volcanic terrestrial subsequently salamander routing quiz petty liechtenstein laguna documentation decomposition butt billed badger approximation analogue sinking polynomial paint paid maze malay inequality distinction disclosure begin beetle unlike tiny strand scales resorts pub philanthropist morrow laid gale disbandment dining difficulties creature celebrations celebrated beacon yourself triangular thermodynamics slaughter pseudo matching illustration eucalyptus errors curves caucus catholicism bonds bet worm teeth streaming stack scar opposite negotiations midway madame lambeth instant installation incredible gliding fragile fracture exact eel criterion botanic bloc alphabetical acetate var syndication strawberry scheduled pp possession phenomena odd mystic lifeboat immediate fluoride edo container charted caste blow bare banker antenna abbreviation wetlands violent legality knox agenda warehouse vortex temperament symmetric stability snakes sized reorganization precedence lemon issuing getting fascist exception emigration differentiation comprising bugle breast arabian affected acclaim wonderland twist strictly rana pontifical momentum martini hen heating greenwich exposition eisenhower diabetes cutter buried bent astrology almanac wealth violet titular tears stable shorts secure propagation pension peacock mister lottery leather interim increased eleventh drilling bowman beverage basket workplace substances strings shia rodeo massive mae hellenic faced abandoned tor spherical secretariat relevance ranging pollard pie oxidation nose mounted immortal extraction emotional electro determined cascade apache amour airborne virtue stereo socialism revelation rearrangement pedigree nov lagoon info infectious immunity freedoms exam consultant consort colored avalon assignment protective mora iota enter dash conditional bunch temperance simulator readers pt perform par mask majesty magnum liquor hyperbolic harassment dresden venetian tumor physiological lazarus inhibition inaugural garage extant chow cassette bravo bison birch aesthetics woo witness warm visitors shed removed privilege notably mai magnificent latvian fur flames fixtures diverse customer atoms yeshiva tune trauma trained thor supernova striped siberian shoot sherlock servants promoting pharmacy misconduct knoll jockey hon gland franciscan establishing drift describing demonstration concern cent behavioral banknote snack pull prism perhaps metropolis mare loved lamp jubilee invitation inverness ideals functionality expeditions entered davenport cow citadel chemist burr brethren beau bearing vermilion telecommunication rancho portage pact mortal mermaid leach lap kernel grow genius explanatory badges yards trafficking screw menu harp guidance grim gravitational firefly crack concerned claw cavity arithmetic archaeologist absorption absence trustees sketch reduce qui orient opportunity natal mongolian mating maoist mao liver jewel humanist hogan gifted empirical detail dane counseling coordinate cookie compliance commentator columbian coffin chili approval anchorage allowed aeronautics titan testimony swords sportsman rand poetic maltese linn kidd hymn hydraulic hazel glover develop confusion confused compete bucks abdominal underwood sweat simplified ruins prediction offer necessary haitian executed eruption disputed commands cock chesterfield tarzan restricted request rationale profession pas mutiny marin manner linguist jock freshwater frequencies extensive carrying bordeaux bengali acceptance viva vatican syndicate spouse repatriation ore listening layers jehovah frontal entertainer decay crowned coating burgundy windmill wharf weak tristan slim sitting savings sanitation referring reducing punisher primitive parrot naturalist hereford graduated funny ecosystem demons dart alongside whatever skip preserved oyster nominative messenger mesa memoir fringe evacuation enhancement detachment decatur christi cartridge bolt victim pornography kilkenny injection incarnation hahn gabon deposition convent champagne chamberlain bulletin blank aztec ambrose alert ala ajax thriller signing remembered portrayal ordered meditation lightweight juvenile johansson foundry directions diffusion chains centered casa butte bounds armies andes adaptive viaduct sikh schemes saturn sahara psychiatric mono lent hormone everyday estimated cottage correlation capped capacitor ami sufi salary plum nile mummy inferno courthouse contra communism calcium breathing babe woody wicked umbrella turning seconds sail roar prosecution polling pm locke item ill hulk guidelines grateful gong gamble fifty despite denial clash bounded ballot ask amphibious vary sud stupid statute stance singular salvage sahib pathway moonlight likely forbidden fingers eating divinity cornish charley button blanche benito wound whitehead tight teller sentinel prevent observed marble lime legs jurist jacket ing incorporation fragments fake dow divorce confluence chestnut canoe cannot camel bench ark taught successes streetcar soprano sikhism retrospective peripheral pax paste ok mosaic fried eponymous dominance counting converter consistency zombie twinning threshold surprise sort roe retailer racism prophecy priority oversight orion jeep intensity inspection entering devoted cleaning bowler arcadia aquatics wait serpent precision luxury locks integrity instructor infrared hack greenland fires eventually dyke cosmology cooling carpet bohemian zion useful thief pulp pork pilgrimage medley garde frozen finale embedded cervical cart bandy approved adder worn sesame petrel orchid microscopy learn kitty keeper gorilla fallout exceptions confession conceptual chassis achieved verbal valuable therefore spine returning reflection percentage invitational iberian fed everyone defender catalog bonding boer bishopric aqua wisdom verification trainer solitaire rent poisoning pod photographic periodic patch nobleman metals manly lit helmet generalization fen excess deity comfort chromosomal bleeding autonomy usaf stuff spice spence shut sequential sanitary respectively reconciliation penal moose karate improved immediately horizon hee grappling funded expulsion dolphin cube convict clergyman bong bisexual bis beard backward amplifier tricks transistor traits tablet remembrance predator pooh pillar nazareth narrator kite kettle inland humor hound ginger downhill dealing cope biochemistry banana avant ago unmanned spiral rusty researcher reproductive option mirage mandatory lying kitchener kidney grandson garland gao fiscal elk cordillera convex cactus blackout asa apart traction sit pegasus maxim limestone join interference handbook gem fourteen duct divisional cyrillic counsel capability bor bm belong bellied ape alter veins topic skinner shuttle reserved quarters privy ida healing genealogical doors deacon crowd compass coefficient clouds celestial captive canvas blizzard beef ascension amalgamation tycoon thoughts sergeant ru masked guerrilla gage fold ensign balkan bald arteries vegetable turnpike tuck trojan tidal serra rye rituals precursor partisan pants opus onto neon margrave latent karma invasive emotion donation bombardment angular alps yoga waterfront veteran tun tango supplies sovereignty sect pest otter novella nobody magnolia kidnapping keeping granted fibers endowment coined carbonate bismarck wilton wedge vertigo symbolic semantics scotch provision nest magnesium humanity heraldic gemini discourse depending cortex convoy cerebral causing buster brake ayrshire argus accession tortoise switching scenario ryder rumble robbery refinery quote partially millionaire mg manipulation lecture irrigation extremely eternity dreaming depiction accountability traded sudden shelf saxe polls percent organizing medicinal lunch laird floral divide cooled brier boo affecting zoom valued transverse stops spectrometry spartan shining sap petition patty orchard mysterious magnitude kali ir identify halloween expressions erasure dungeon columnist attended accord varying saratoga reliability obtained marx mania inception grill granite fascism elliptic dispersion diploma curvature cousin clipper balls avatar assurance apparatus aimed admiralty timber tied standardization settled scalar rhyme referee recall prospects printer mood lore horticultural gentle disabled croft constraints ceramics butter bologna yours upcoming tender strict squeeze span sheets prep pops olympiad nightingale myself magician determining cuts cop contained constable aviator allowing uncertainty treatise sulfate rune rotary renowned palazzo octave nuts modernization leopard hurdles goldsmith fuck cosmos cisco cannabis benton yahoo valuation ulysses twelfth transporter trader syriac satisfaction potato polyhedron learned jupiter hose hanging fog finally fender establish escort duality doe displacement dingle caught boxes bard zebra valiant unusual thorn surveyor stunt smoky sampling sal regeneration reflections rebuilding predominantly polymer pol patron panda palau nasty mistress mag flats firing eighteenth edges completely circa barn ballads woodlands torch straits statesman shetland recruiting rcaf plague phosphorus pagan olympus mori licence impossible howitzer expected ester defeated canary backup asteroid alameda adobe weighted vapor troop toto sup streams sportscaster sorry rotor marking longitudinal iconography homosexuality harm grouping fence ecumenical donor directive ding croix condor cayman blossom bacon zodiac toxic taxonomic swallow structured rho ps photograph petrol payments nitrogen mortality minoan magna lantern interscholastic identifier hungry gym governorship franc federated explosive estimation committed coca banned babylonian avalanche already aging validity sos rust punjabi proposition plug piston operate occasionally newly mod livestock invariant happiness friction frequent ascent yield widespread walnut vicinity toilet texture tar sui spiders sentencing renal receiving rambler prospect pitchfork menace meant maxillary lobe kept jasper initiation fetal ego distillery crab congregational vowel ultraviolet supplement semiconductor sec probe pitching pile ordination malayalam listen hitchcock glue fatty duration conservancy commitment chew burgh actually yankee whig turned stimulation sight resurgence promoter procedural priesthood pneumonia panorama outlaw onion oceans occurring marches lounge livery lease innocence homestead himalayan hash delayed decree cypress cryptography cine chord centenary cartesian burden arbor winged watching turkic trend tnt strongest stony slot slightly restructuring plato pilgrim pali masses logging isis industrialist gypsy ganglion excavation erosion dollars colt blocking autoroute whiskey transitional throated thank switched spotlight sapphire retention requiem repeater reliable prevalence phonological permutation mitigation marketplace marijuana loyalist libre isaiah hog hoax hexagonal exclusively else donkey dedication cocktail cloth clearing billion analyst turk thirteenth tattoo sting shortly sensitivity parody panzer mausoleum lose jaw flexible fascia expressed equivalence distant discus concurrent analytical youngest vegetarianism trigger suture supplementary sniper slope shipyard shiny raise precious mule knitting implemented heron fit fistula finishing eyre emblems dominant dependency crop collier briefly bore bile archery warlord viceroy vicariate sturgeon shall refurbishment pour napa linking jewelry hummingbird homo farewell entirely domination commuter charged beneath assist announcer alligator visualization taxi standardized sociologist rum requirement programmer oblique oasis numerals novo neath mayflower mate loud losing humane hotspur euclidean esperanto dye dickens cruel consumers competence compatible bullock ballistic baghdad alveolar wesson uptown symphonic spirituality spending shortest restored replication optional opponent nun needle messiah lobby livelihood liaison juliet hut hence helped gut apartment waltz vulgaris underlying systematic slug segregation sargent salad rink reverend repetition regatta rama quantitative protectorate preacher parasitic oceanic naga lumber loving lm jail homology grown goldstein glacial germ footed equatorial epilepsy dose dioxide dealer courage corrosion chest chat bullying buffer breaker biologist beaufort beans warship viewing vacation unfinished treasurer talmud suspended stimulus stain skill shirt sensitive rival revolutions radial quantity pros prepared permit pale optic nab mute merlin maintained leukemia lethal lc khmer jp homeland heap facto doomsday dahl crafts combine classroom bulk bold boiler addiction zulu winery winds valence uncertain traveling tones thumbnail thoracic sickness sentiment scratch rug roach repeal pulmonary pease paw outfielder ontology lombard gala freedman earned clone boolean av abnormal whites vegetables trance synchronization supernatural submission steady specified serge rochdale replica prey pickup picasso partridge offerings monorail limitation leak jonah ic guilty gradient flagship fission exclusion efficient dive diffraction destroyed cleopatra clarinet ci cabin bleach authentication armageddon archival sensation satan sampler rub romano rediscovery octopus norma needed molecule lip lever kin improve forget fertility enduring dusty dexter decorative corresponding corona conjugation comparable colbert cardiovascular cadets anthropologist annex ade abba wool wee vine vertex treason suffix spark shear sell relational quickly pursuivant outlet orthodoxy oratory occipital nowhere node linden knows incidence inauguration homicide hickey forge font facing endless discontinuation diocesan dancers cuckoo crested bey artistry anarchism tuberculosis skeletal revealed peck optimal nautical mutation mecklenburg lyric holes grading gens forth fisherman dorsal detainee deleted defining declared crimean contributing combustion cantonese cameo bellevue therapeutic stampede separated runic riviera rendering really pupil propelled piercing narrows lakeland grapes grad governed funicular foam flies firsts faust extending excalibur emirate doctoral continuation ceramic capable bunker basics altar advancement wow widow vendetta tanner talks substrate steward sitcom protestantism pharyngeal nursery modulation immigrant hackney gi feather dozen davy contraction casualty butch breath ballroom backing aryan apartheid ahead titanic thick stationary starts shots rc rattlesnake publicity preview prayers pisa ou nutritional mortar minimal medication md lowest loading lithium libyan lexicon inflation handle filled defending defect correspondent charities cantata canals cache bra blink arranged aeronautical adding woodpecker wholesale update tough subcommittee spots spinning somebody similarity rag playhouse phd patches notice mole liner kc investor identical hydrography grassland gaza fluorescence fifteen draper dismissal disciples dietary cylindrical congressman bitter biosphere bays avoidance attitude wage viola utopia theorist template streak snub sixty shortened rook meters marathi lib kinetic indra imprint imaginary ignatius fruits fertilization fay estimate courier complaints closer carotid canning bun bats arrested zoology warrant verve ultrasound tomato terminus supermarket shallow secession scattering releasing radius psychedelic noteworthy niche nasal meal marge inflammatory idler horseshoe hatch freak focal feudal essayist endocrine elevated dunlop damned curt courtier corners commandments capsule browning breach birthplace attachment transliteration thanksgiving solving sham sans restriction rejection nouvelle moderate mess isolated hexagram harrow encore emu descriptive dagger cw courtesy colonialism cod cheetah bust boca bite atoll appraisal anger woolly transferred swim suggested stated sorrow shiva rotating residency radioactive pupa proving phylogenetic password motive inorganic hilltop hernia fixing fitch fin enlightenment eared drill delight daphne blanket armada amongst yam westland viper undercover thieves supports studying scream scholastic rim privately perennial outlook opossum oils mahatma lookout kern joke isotope intention indications gum enchanted deposits decimal curious criminals cops columba bootleg bilingual answer advent typology tweed turbine thousands tension tarn straw shrimp sclerosis reciprocal queue pumping meteorology median mau lyceum ionization festivities esp electors elbow crooked consulting concessions cinematic chalk carving breakers baptism archaic wearing sweets spear shapes shame salute puppet porcupine polly poles pennant nominal measured maintain larva irregular homecoming grizzly gram flour famine fabian exploitation evangelist enclosure deeds corrigan consultative ceres canine backed apex wagon vedic validation unicorn sunni statehood soda shares seating runway quaker pygmy pu proxy papa mythological interdisciplinary hindustani gunner focusing filtering ethanol efficacy dynastic deposit consensus compromise annexation ambient vaccination swat surroundings scot purity prolific poly ombudsman mock michelangelo messages intent goliath fortification exercises eponym documented conformal circumstances causal brandy boa batch ave adviser trolley treated treat throwing tendency tavern struck stigma smallest runaway roanoke preparedness loser intrinsic internment hydro grammatical foreman foraging espionage duel downing difficult coconut cents cartilage camouflage bitch ars supplemental sermon serena seaman sabbath qualifier quail protagonist pipes parental jolly interesting holm herring gettysburg funky disposition convocation contingent caucasian biscuit bark axe awakening australasia aqueduct antique accelerator warp vita unsolved thread ternary tent supremacy sn sleeve showcase satellites ritter preference powerhouse phoebe orchids mil lowland lite lister lexical lao instances insertion hung fired erotic enlisted embroidery define crossroads conducting cleanup cement boomerang accused writ unrest trident trailer somewhere socio segmentation rhino reel reaching pharaoh petite persistent pendulum pencil pahlavi omnibus nestor mysticism middleweight metaphysics maximus marlin mammal loyalty lecturer jug hershey grenade garner folding fix dragoon doubt cp cougar couch clearance carver bock bidding autobiographical antelope wolverine valor slick singleton shutdown scored ringing reopening raider proud poppy plagiarism pico phonetic patience oscillator milky lust lama impression hypothetical gentleman galley freed extract emery easily delivered degradation cutaneous cigar brilliant appropriate alchemy accessory slip screaming repeat rector propeller promenade ocular naturally moselle micah maturity inverted infirmary inactive holocene flotilla distributor compiler collateral climax catcher breathe beasts baths baritone annuity ancestral adjustment woodruff wiener spheres seeking romanticism rip revue repeated prentice pluto paradigm nosed ness mover misty madden hospitality gardening footwear filling essence elephants dig confirmed clemens cabaret ambiguous afterwards accept whip vogue turns tenor stretch skies siberia send semitic sac quay pea pad olympian nephew monastic mist localization leap kicks juniper insolvency horticulture habit furnace flowing contributor communion colleen chic bounty bingo behalf apparent apology aluminum wick viewed vicious transliterated taro stellar samson reformer psychiatrist positioning pays ornithology minds magistrate initiated indigo indicate identifying gully glow gastric footage followers firth fare everest estuary dial criminology clown chick charting cartel calculator bethel atheism arranger amino additive abandonment vineyard trench treasures tally spruce sorted senna remain pedestrian operatic notorious mystical murderer miner lees investigative inquisition gull grip fiddler distinguishing deus curl continue chips bullets blessing blaze blackbird bertha alloy add achieve workman wit tubes troupe tracker tort terrible tariff tackle smyth smash sixteenth shade seger robust replace relics reactive pistons pinto pawn panhandle orpheus nonlinear newborn neptune metaphor mala lightship lending kitten hume humanism heavily hazard goshen fill faithful exhibit eros enigma dynamical dew destroy debating crook cora consist compulsory combining cavalier bromide bourg betting axial aggression vis sunny styled sticks steering squire societal settler roc reaper perpetual penelope peach notification notch maroon maintaining lifts kinship interrupt imagery heavenly haunting harmonic familial engaged eldest dandy damages cu cobalt charm caribou cane bucket bombardier beep beating authenticity asymmetric wounded vitamin toe textbook superficial steppe sphinx soloist sexy sb receive profanity poplar northland mushroom lobster lineman libretto kinetics jar horned guarantee freelance forecasting flex fanning cyst coronary contamination commodity camino betrayal barley assumptions arbitration angry allegro ale whereby utilization troopers torsion technician tangerine sulcus stout stiff sink scripture scrabble quantities quad provost planetarium pelican patsy maharaja loaf lisle inclusive hydroelectric gospels fcc expanding dynamite consideration burnt bracelets avoid assay announcement wadi verdict trusted trips superlative sunk satirical saharan sacrament protector presenting pasta ox ordinance nudity mandibular mahdi lute littoral landau janus ist ironworks improvisation hobby gin garbage formalism extradition entomologist diva continuum conservatism confidential clippers chiefly catalyst bandit babel animator aloud airship villain vicar unsuccessful sumatra spill spanning sleeper sentimental rouse rib regulator poseidon parasite opium nomad morality monsieur lovely locomotion innovative indochina independently hidalgo glucose fist endgame dispersal dare couple conscription bump breeze borne bender beats barrage agrarian weasel wash vulcan sonora snap slogan shifting shelved shaping sentences seizure rufous rude ripple queer proton pneumatic palladium oscillation onward nauru mulligan jumper jew instructions instance idle het heir gadget frontiers expectancy entre earnings dockyard dobson dessert choose berserk ass antibody tragic tamarin stolen snowy shades seventy scorpion saxophone sander rosary regulated redemption query provenance primate practitioner offspring occasions objections notion neurological mythical kip kendal instinct hail gee forecast fearless employer emphasis drying domino doing digit cropped coupled concession checkmate carthage bray begum astronaut aesthetic addresses waterfall vehicular vase sundown stylized steak simultaneous resting publicly petter perch penitentiary pedal organism offset noir motivational mats massif malayan kraft kisses kingfisher intentional hooker helium hakim grandfather gel epoch engineered crocodile coptic congestion conclusions clocks candle boycott bordered bamboozle aramaic aortic werewolf void tuition tend talented supposed sucker speculative somewhat socket snoop shrew rupee runoff rot replacing recipient purse posse playboy overthrow ornithologist navigator mort labyrinth keen inherited hurt hoy header greenhouse godfather folded faction dough cosmopolitan controlling complement chinatown boulder adjusted abduction yeast surrounded stochastic sponsor skipper sis sack ruin redwood productivity postbellum pillars perihelion parakeet offense muse mosquito modernism migrant lyricist knob ita ibis honorific honeymoon hermes gentry fungi fragmentation fortuna fibre envelope eminent eminence dent councillor cocaine causation cant bait annals acceleration worry traumatic tick tempo survive subtropical stored solicitor solely sausage resistant remington rani rack precinct playa piranha peanut peaceful obituary normalization nexus missed militant midget meteorite mechanized marginal lemur lacy jurisprudence inflammation imitation fasting expenses entitled ecstasy drowned digestive dido dense deficit deed decathlon dab cub compressor cab brace avenger anxiety adjective yesterday wishing vest vaginal underworld striker steamship starred sociological snacks sheppard shaker searching scan psychotherapy psychic prefix possibility parole ogle moira mast masonry lad kierkegaard insight hydra hedge glove foul explicit doppler descendant depths conversation confectionery clauses binomial belly basement attic welterweight waterman urinary traveller totally sperm snapper saber pow piazza organizer nonstop mana legitimate jesu inversion indexed humble honored hillside gains freshman extend emmet elect dun distress daylight countryside cor clough cassation candidacy bode biochemical appalachian apostle afternoon afterlife wicket wealthy vishnu trey transient stranded sault rf reagent procurement practiced playground perceived pelham pancreatic mechanic mammoth lesson lancelot justification insulin inca hawthorn flaming firearm favor fatalities eurasian dusk diversification crypt crusades correct conjunction cochin clutch cheek catfish bravery bleu balancing baccalaureate australis ancestor anarchist accumulation zenith weed wanderer vries varied tivoli teach tanager swap superannuation striking staple splinter siren sinister silo protecting prodigy proclamation pomona peculiar osprey oldenburg nocturnal nirvana mime mention marxism jumbo intensive injured hittite herd gangster folly feedback eucharistic ensure engraving elevator eighty divergence dickey dependence curator coil blockade bess armadillo appliance anal alternatively wonders usher upland telling taxis tanker tack subjective strongly stallion shotgun sherry seismic regularly reflector quite prints philanthropic motel monde minus marque marchioness mandolin jointly jeans hazardous grind grasshopper gluteal gastronomy fugitive fraternity fraternal flock faw fallacy essentially electrons dorian dorado discount demands corneal communicative coke chromium caspian broom bikini ate aquinas apply angelica andaman amnesty almond ally advertisement wren unrelated sw stave staging solvent skate scaling satire revitalization reclamation puppy puff progeny priestly prestige predictive polaris persona periodical paragon occult newtonian maverick mangrove looks liberalism kicking junk interstitial instability hurst hostage gunboat gasp fungus flyer facade ethyl displaced dies commandant clothes cityscape bringing appliances woodcock wattle waterway wasted warhead volta variability unemployment uncredited transparency throat stanhope shady shack scooter samba require recursion rarely psalter polygon piracy pell nw newcomer mom meg lombardy lifting lick infamous ignition hustle horns hoard halfway grenadier gopher gent forensics elector edit curtain crag conti comprised cereal caliphate bland bits biennial barred arp anemia airing adulthood zoological vibration veil tap subscription spoofing sphenoid smell shaft salon royale quadrangle prosecutor peri pentagonal pardon oven np newsletter nativity milestone maternal masque jellyfish involuntary intestinal installed insider impaired heidelberg guadalcanal gnu gamelan fragrance flavor fable esplanade elizabethan edict edible dwelling dodecahedron docking designing decided conceived cognition calculating bonkers benevolent beech zeppelin whisper valid token terre tc tangent sweep swale substitution stew spaceship proximity prostate proportion prone prologue possessions peasant odds obtain northernmost noodle nemesis nails nail mauritania markings makeup loosely lips legally lavender kindergarten involve infertility horde histone gnome glycogen foremost filmed epa emancipation eau dreamer dilution devotion deportation default coordinated collectively clover cappella caballero branched bog bakery backbone awesome aunt appellate allergy actuarial accessible yeah xenon withdrawn wham tuna successive spectacular slender slate sedition saloon plaque perimeter participant orthogonal orphan nut nugget myrtle mba mallet malacca limb lessons laying interracial impedance heckler harvesting goon freeze fraction fail epidemic delegation defiance dea char cantor bras barony balloting ballooning babies authorized assassin amalgamated adductor waldorf visually unnamed undisputed spray splitting simplex scroll sandstone rigid retrieval regard pussycat proctor noodles motif melt mayday martyrdom lei irons intense integer humorous howler helix haut gregorian goth genuine garnet flyweight fiddle fantasia fairly fabulous expensive equinox donations dip coma choreographer capo cannibal burley blown batting barbarian azure anvil alaskan achieving vin traverse transplant torn templar stopped stealth shangri samos saki respective quarterback poster patriarchate olympians motorized mot metaphysical memorable manners madeira loco laughing ideological geyser gemma freud fang effectively duval dried dominated disciplinary cue cruelty continuously coastline clamp citrus brigadier boost bongo blend bagpipes ares analytic amplifiers aggressor affinity weaving unite uhf triton transported transparent torque tilt telephony tartan tarantula syllable sloth skyscraper shaggy seek rig rendered raspberry proportional premature pied nude modal mayhem kanji infringement icosahedral gazelle fond fidelity feline enjoy disarmament damaged curved convenience constructor colon chameleon cation bookstore bathymetry barbera backyard axiom affordable aboard vernacular ventilation urine tried tracing thrust supplier substitute stratigraphic starling shamrock rocker regents quadratic precipitation pentagon papyrus obstruction nouveau noon melting lordship lira libertarianism lazy infernal infant immanuel igneous hopes heartland hanuman halt grotto goody fjord exposed expectation detached cyclops cradle counterpart conditioning complaint choke casual automatically aura arroyo ante angles alternating alsace airplane zoologist wrecking whore weakness washing vela usual tsunami trying traces tierra temperate tad synchronous stretching speculation sided scrub sari samoan rhapsody repository realignment pup premises permitted pamphlets orchestration murdered martian mango levant lace knots investigator interested import hush hex hel halo fragment flamingo fairness extensively exponential evasion emotions cornerstone coordinator cleaner cello casket android algebras advances acoustics wishbone wildcat waking vox voiced ultimately tug tory tm thickness tense superlatives stained solstice sewer scam sanctioned sakai rosh rift retro ransom popularly pins photon partly palms minerva migratory microwave hornet heuristic haze grocery greyhound femme elastic ears drops defenses daydream covert convert chub chevalier celebrate canopy calm bowery bower blunt biographer balanced axle yearbook wired vulnerability venous tutor termed tempest suffering skunk sexually sender seater seaboard schooner schizophrenia rhododendron residue ramp puma programmed oratorio ops musicologist milt meteor melton laugh lasting landowner lag innings imagination hygiene homogeneous hive harlequin flycatcher felt fax fascination excelsior esoteric eligible descending crying crozier conner circumflex caravan bounce barrister artemis annihilation accredited abyss wasp vulture trash thistle tetrahedral tab supportive supervision stitch shun sedan scriptures reuse reflect raging quarantine prima pledge participate paranormal pang mustard memento lw loyal lonesome liquidation jingle intruder intercalated ingredient immersion hypertension hum housed herbs helping frieze fermentation excluding eton dodecahedral devotional degeneration confederacy concluded clip choreography capuchin branching brains bout bought boiled blackwater attach arid tops tile swaziland stool spit silas rpm riddle resilience replenishment renewed rembrandt refrigerator quintet parte palisades overlapping null multinational midtown meteorologist merge mere masjid longevity lithography jihad interurban insurrection improving healthy fixation fig elf drowning dropped dictatorship crossed courtyard corinthian conversations consider conglomerate cong conduit chaplain bred branco auditory arise aggregate woodman wayland warbler vast vanadium transforming trait thug teens sunlight sunflower spiny sleepy silly shy shorter senses ruff quo pheasant paleontology notebook muddy misuse microscope maybe manslaughter lakshmi kashmiri journeys islander hypnosis hyper historicity hermitage gaussian gastrointestinal frisian fishery facilitate fabrication experimentation excursion dressing distinguish declension deciduous cracking courtship constituents comprise coeducational cleansing cirque chit caterpillar bushranger bayonet basal accidental zirconium whiplash weighting waist variously unexpected trumpet transplantation thermometer suitable sloop simultaneously simulated significantly shrub septum scorer schiller saffron rhetorical rental quotation preschool overlap ordering orb occidental numeral naughty millstone medicines maid loaded literal impulse implant imam hotchkiss hepatitis gurney graveyard globally gar gag fights explain embrace elongated dm directional dieu deb curb cortical carousel burnet brahmin boyfriend bless bind bash bane authorization augustinian arbitrary approximate ambiguity aide agile affective walkway understood triennial sufficient substantial stove scent resisting reprise repression remainder rebuilt rainfall prosper polymerization naturalism mold mimicry majestic lullaby kola ishmael interceptor hertz gasoline fuzzy filing fatigue experienced equine epilogue emulation ducal deva crouch coyote constructive chihuahua carcinoma caliber blackjack amphibian accent visionary violation uno underneath topical thrill temptation tails systemic soar slovene sire silica siamese sculptoris removing relaxation rath prophets presiding pong pill picking persistence nike nebula moo mankind kodak jamboree ischemic interrogation interception insert indictment hitch herself hermit habeas gallant finest fancy dragonfly discoverer dinghy credentials corpse consonant condemned competitiveness comment childbirth buying boon baiting automaton assumed abdomen undertaken underpants typography trim triangles tandem sympathetic surge stripes stomach shuffle shattered schooling savoie pyramids picnic parity pago overhead occasional nitrate moisture modernist mixer minstrel memorandum maris jasmine icebreaker howling homeric hind hickory heyday greatly garment gad fourier felicity explicitly eurasia dissident defamation crush crude creativity contraception conqueror connective confrontation confirmation cinnamon cham carillon campaigning calico cad burst boogie bantamweight banjo auditor appreciation applying aorta amplification amore altered agua windward whistle turret transfiguration susceptibility sure sufism stocks steal staples spree spoon snail sidewalk sequestration scare rousseau rifleman refrigeration reasonable rasputin puritan prosperity perfection pediatric pavement parallax ortega noma namely montpellier moist malignant locus limburg learner lean laureate kelso inertia inductive illuminati howl hexagon gunfire grapevine glaciation gallium featherweight exotic enclave debris conscious colloquial chariot bum bop balmoral alright uplands toothed tonk timbers threatened sway similarly shout seems schema revolver remedy regardless privatization pillow paganism maneuver manage loudspeaker lobbying lindy lilac lengths legged layered largo judas javelin imposed hijacking heartbreak gunter grail gardener furious dosage differing defection decker crust creep conjugate commencement canonization broker boucher boron bonnet billiards bastard askari apparently antimony anthrax analogous advertiser wessex weekday wages vas tundra tons thrush thematic temporarily tabernacle suspected speckled someday solitary shoal ritz renegade remove rated quartz prejudice preaching pollination poisson plenty persuasion odin obtaining obsession musica mountaineering metrics melodic mature lough longhorn langer knives ionic insufficiency idiot hostel harvester grosso goo glee garlic fused formative fitted fannie fad envy dune dramatist distortion consultation construct communicate combe climb cleric cerebellar castaway carnivorous canceled cadre budgeting boll berber bello baked apostasy antagonist afrikaans adventurer advancing activated zeus yen wavelet wagoner vane swinging sour solitude slowly sedimentary sealed savanna royalist reservations quechua psychoanalysis projected posture philologist orang newt necessarily neapolitan multiplier monumental lumbar lingual keystone judgement intimate hurdle hoo heroic helm happen hamster glasses foil flavored everywhere epistemology elderly disruption corporal coney chopper catalytic bulb brood assembler anu amnesia algae accelerated absorbed wholly visitation vie vanishing usability torus tic thigh textiles subclass stagecoach sion shoulders shinto seaplane roly roadster resin quotient punt pullman pudding preparing pray patronymic packing overkill opal onset novelty muscular munitions mf meals mantle lancers kindred interstellar insulation incognito imported honorable gulden gifts freehold fouling exhaust exactly equitable disintegration digits daredevil constrictor commanded colossus closest cistercian chemotherapy chasing centred caustic carp calibration bubbles booster benoit benign barge barbecue arson arsenic anzac antecedents amtrak wrap winding updating trumpeter tramp toast tasting tabor swell stratigraphy stables specialization spanned smithsonian sel rondo riches remnant recipe primates phosphide payload patrician overnight overdrive ovarian od norms merchandising magpie locust locked lively lid levee laughter inflatable incumbent iceberg hysteria homeless friar fissure fink fiend facilitation endorsement enclosed drunk drain doctorate digest devised det desired dermatitis cockatoo chieftain charmed centaur cakes blimp batten atc applicable anthropological aec acclaimed zanzibar whitecaps wavelength watcher voter vocalization viewpoint viewer truncation toxicology theosophy suburbia stabilization shit salvo rotten rickey revere recommended properly procession primer preventive permeability oblivion noisy nil nawab mountainous methyl masson margins limbs lieder legions kala intercostal intake infiltration infielder imperium hooking hemoglobin handy fizz fireworks fetus feathers extraterrestrial excerpts etching escarpment dura dunning disturbance consecrated chorale chimney biking articulation algonquian akin wrongful woven whiting vandalism trough troubled transposition tabloid swallowtail successfully stratification stow spook sewing sewage risen revived replay recession reactivation raccoon puddle prohibited pressing precise pouch polynesian peg parti overdose outdoors neuter neonatal nee monsoon mentor meniscus mainline macaw joker initials hydroxide hardness grapefruit genie futurist fullerton familiar excessive elegy eaten ease dropping dp dementia defeating cutthroat compagnie colitis coated closet chrome choosing chevron checker bumper boating belvedere bayou asthma yule yama whitehall warden understand timeless thrash sympathy stormy stopping stonewall statistician squid snowman slab seeing roux reveal resolve relish regia reflecting rec planner picket pence peat overlay oriole nix neolithic multiplication moro moraine mineralogy merging meissen manic lulu launching lark jokes investigate intellectuals imperialism huff guggenheim gras getter geronimo functioning fireman filler feral eurythmics embryonic ead dreamland displayed digger detained depository deli definitive decrease cyprian cracker contracted concours colonist chimera chevy cerberus carved cairn bulldog bribery boswell bifurcation beretta bazaar alder wizardry whispering visibility vat uninhabited uncommon turnover tiller tickle tectonic tear specimen soy sophomore sonar sine sill shunting settling romney rejected recorder ravine rampage quantization psalm prosody palatal packed oud neuropathy necked monopoly millions mild microscopic mens longitude laden jugular judging informally humorist hoi granuloma glands getaway ethnography equipped epithelium earn dubbed devonshire deferred credential considerable communicating combo claiming chipmunk calypso bunting blenheim blasting blackface backlash avian attrition aggressive achilles abstraction yap unpublished therapeutics tamer talmudic synonymy synapse swine suspect supersonic sulfide strap spreading spitfire spectator sinn scattered sawtooth routine romanesque rode reptile regret reflected redeemer readiness preserving positivism plume parietal oni observance multilingual microphone mercenary mam lupus lisp leech jumps jd intervals hybridization hooks honest hide heel headland gander gallantry fiasco expertise estimator entomology duplicate dressed dilemma deux detect despair denote definite cumulative crichton constrained conscience chateau cantonment calvary barrio bandicoot baal astrophysics astrophysical ashur ascending anatolian ammonia alp adequate yak wrist wold windy wandering untold unconventional synchronized subtitle stardom stagnation sportive specifics southernmost serpentine sci sable quaternary primordial polymorphism pointed pep pate parthian orator necessity munition molten mn mellow mediation marais malice limiting leyden leftist kumari kama iq iodide indefinite imagine hostess homosexual handler grouped goldfish gnosticism gambler disruptive dielectric diagonal deprivation customary crusher craze crayon coordinating consistent compare cider charging brawl bonded bladder bassa barium barbary banning bacchus attire athena astrologer agony adagio witchcraft willi whereas vip vegetarian unseen unforgettable theosophical tart suspense supplied suisse spangled sic shortage scaled rushing roebuck reversal resist registrar raiding pronoun prom prestigious preamble porte ordinal obstacle nimbus nesting neglect nance moll medallion mauser malt lynx lux launcher laryngeal joss jewels jelly intrusion innate harsh halcyon guaranteed godless gladiator glad girder fortunate folks flagstaff extremes eventual encompassing enamel enable emporium ebony downstream dictator crucifixion conduction composing coadjutor chancery byte bourse argent antibiotic anion ancillary ambush allocated whipping welding waterfowl warming ventral upstairs unholy umbilical triassic transferable thorp thorns tether tabasco synonym supervisory strengths solve slice shrike shimmer settle serum sept separately roadway restraint reply razor prudential precautions porous pointer pleistocene pending peaked nominee needles mourning lug lien leibniz ironclad inference herpes heliport gravel geopolitical foreigner floppy flick flexibility filthy eschatology encourage emergent ell dressage dissenting disciple deemed damn cultivated crisp cosine compartment charismatic catering busby braking boiling biz beryl bedtime bastion attacked arterial anyone anonymity anniversaries ankle wardrobe vigilance vanilla uniting unable tympanic truss trotskyist transformer taboo supporter stomp stole stems starter splendor specially sorority situ singularity silicate shelly sheath serenade sediment requests recognize raptor rampart puss pogrom phoenician palette pagoda negotiation miscellany matador mantra malagasy loy lombardo kp juggernaut intuition implement hordes hiding havoc golem generate geiger forgot follower fitting ferris extremity enhance dipper difficulty denominational cystic cursed cryptographic cro contention constitute conquer colosseum coached climatology cigarettes cheat bolshevik blur auditing attested articulated analogy agreed abductor wires uneven transcript supper superfamily stripe steamer stationed solano sinner secured schizoid satrap restless residual qc promised projector profits principally plurality papuan overture octahedral oceanography occasion nip mullet mobilization mistake missy miscellanea medicare mastermind marital mach landgrave kindness internship incidental incarceration homologous hired hairy greetings grandmother gotha gossip geomorphology flake federalism etiquette environs electromagnetism dy decoy declined daft crucible corrupt cooked contender consequence competitor cochlear choo catching butyl burman braille bovine boreal bittersweet austral aspen argos analyzer adjoining adherence acorn academical wounds wheeling westward vixen vend vang uterine triptych torrent symposium syllables supervisor subterranean stabilizer smelt slime skepticism shareholder sax sabotage reigning reflective rapidly pumpkin polity platoon pivot pinch nada mica metamorphosis matched malicious maidenhead lipid koala kissing journeyman inherent grosbeak genital garter exceptional excellent everlasting eda earldom drunken dispatch darter congruence coloring charcoal centurion capitalization brahma bosworth bordering banquet bags awake attenuator armistice anarchy addressing viscountess virtues vanity vague ural turpin trustee triad tl thrower swain sutra surplus stepping stalker ssc splash spitz spawn sip shower shakedown scanner roan reward reversible rep reine refining radiant proved professorship pelvis participatory paddle packs ode mounting modernity midsummer microbiology mash mantua malaria loveless locale loader lis liar lauder kestrel katakana implicit hz hostilities hitting hiragana hem headwaters groovy glorious garo float fade expectations enlargement encephalitis dummy divination dilation deployed decks dative cwm cupid contractual comb collect chaser carrot busted bs brow brink breakaway blacksmith bismuth beware atonement aromatic appellation anselm absinthe yoruba yom whilst whaling weald veer variance traveled titanium tit tinker supersonics steeplechase statistic squared soleil sly slight slash shaman senatorial sefer rotational rosy rolled repercussions reeve reefer ratification raper rainy purification proven precincts pineapple phenomenology pebble methane macaque loci linkage librarian kachin jackrabbit ire introductory interacting hoc herbal hebrides headline gris geophysical futurism flap fiesta ethos dumping domesticated dingo debit custard curd couples consumed clerical chromosomes celebrating caution calculated bulbul bridging breakout boardwalk bedroom augmented asiatic annunciation annotated airy advisors absent wreath venomous tulip trespass timetable tiffin terrier tenant suppressed stripped steamboat sponge speedy sofa skid shunt rugged roundhouse retaliation resembling reliance punic prop precedent pornographic pickle pashto outsider optometry nmr nazism minotaur melanoma maternity littlest libel krupp jagannath integrating instrumentalist inflection infected indicating incremental immunology imago icing hydrocarbon hourglass herbaceous heal haystack harmful grandma gloom glade gita geisha foreground filament fashioned fab evaluating estrella essentials enumerated engraver distillation diner differ deadlock daffy cyanide crowds crawl corsair cooks conn condensation chromate checklist cataloging carte bramble bonny bodily boar bloodstone blame beg asteroids aristocratic arising apollon anglicized algorithmic algol acta zoned whittle virtually vertebrate urge tyrant tungsten tula tuba transfusion timon talon sustained strontium stork specificity snider slr sidecar saturation rumor revolving reset remedies relapsing refresh rectified rake rails pulling precisely polyester policeman placid pia pancake obscenity neutrality narcissus muscat mongoose metallic mercantile memo magenta loops locator lining latency kayak jinx imprisoned illumination hounds hopper harmonization glycoprotein gazetteer gainsborough fractional finder fibrous favorites excel eruptions enrichment elders duplex draco domesday demonstrated consolation condemnation concise chaldean cay canto calumet caffeine buzzard busy brunt boxed borrowed bookshop bola bleed bedlam barbershop axon assimilation armorial apparel antigen allowance alkali ait airs admitted adhesive acidification accomplished wishes whenever vignette useless uniformity unauthorized troll translate tee technicolor tagalog superseded superconductor suddenly substantive subgenus stimuli sticky stereotype spying spar snape sideshow sexton severity servitude scissors rockaway ricochet regulate rb quill prostitute proficiency possum pose porcelain polarity pixie peep pare olivet objection numeric nomadic neuron nepali menstrual manitou mamba mallard mace litter laundering landslide lamina interrupted insanity husky hoyle habitation grinder graft foothills famed exploding eugenics embryo echoes dram diversion destructive deserts delimitation deadline crucial critically cosmetics contingency cloak cirrus chill checks castor bulla buckle broadly braid bracelet blows blended bilateral autonomic aristocrat arcana aperture answers amplitude amity alteration agar afar adolescent addicted yogi warnings visceral undone traveler transcendental transcendence transatlantic toucan talisman stadt spoke sometime showmanship sheaf sensing scarecrow rugs ruddy romana retiring resemble rapture quicksilver putting promising possibilities planting pellet pee pb overload orphanage oriel nom nimrod nazarene moonshine mink milling methodism metacarpal marist marbled maniac maison lilith leviathan lawless latex kino kilt junta headgear haw gyrus gilt ghoul gait flaw exploring explore expense evert evaluate dump dogfish disulfide disappear deviation decorated daystar coupe cossack cocoa clandestine chinook catastrophe caritas bushy beatification avoiding attacking ashram aquarius aptitude ambition airman yip whipped wapentake wali vow vacancy unless tugboat tubercle tropics transactional tlc tested sylvan sufficiency stringed steroid sickle shook scriptwriter schematic rupture restore rendezvous reddish rectangular recovered reciprocity recherche pur prowler prophetic projectile pore popcorn politeness platelet plaster plantar pic perpendicular permission passions paralysis pant pancreas overtime overcome outpost outfit optimum ophthalmic octagon nutcracker notoriety nonsense nitride musk multiplex mountaineer mortuary modality mishnah misery mezzo magma laundry kingship jigsaw invader intransitive interpreted industrialization hyperactivity hydride huge hostility hoop heresy grounded fortunes footbridge flare factual exploratory erythema equally enhancing discover determinant declining decency daring conscientious confessor complementary coarse clubhouse cathode cassandra carta carboniferous canaan bushmaster beneficial bead bayard averages audubon asymptotic antiquarian anjou algonquin accountant absolutely vidar vet vertebral ulcer turmoil tractate syrup steep sorting snowball skeet shingle shifts shells separates roofed richer resemblance refused pulpit proximal probable primus pommel pluralism pinky perturbation paired outskirts obstacles observing nether neoplasm naturalization mural mundi motley mesoderm medea mavis mastery marl mambo maize logistic lenin landed jag iodine intonation interpreter influencing himalayas highness heritability heist hap guise griffon gig geneticist fray fortified forte financier fewer faa eucharist escuela elemental disposable discussed diminutive delegate cotter conciliation complicated communicator classicism circulated chipping checking castelo byway burner buff buccaneer brightness brie bondage bizarre bearer beadle bantam ballerina ballast bale apocalyptic anomalous angler allergic allegation agama adaption withholding vitae ventricle utensils undead typographical tombstone tidewater thrombosis thong thanks tb talents sunbeam stunner streptococcus stoned stayed stairs spontaneous spade sledge shoemaker serenity separating secrecy seafood scow scared remarkable rebuild proverbs propane pritchard plunder plasticity placing pelagic papacy pandora ophthalmology oats newer nave narcotics monocotyledons minded meritorious marquise magyar magdalen lobo lair isthmus ism ipa injustice improvisational imagined hyperion hun histology hemorrhage heathen hamburger gourmet freely forearm fluorescent flop fermented fatality expenditures excursions euthanasia euchre esprit drumming downward ditch dis deliver cookbook confinement classicist chances categorization bullion brig brat bleak biplane believer augmentation athanasius arrowhead armory aqueous ancien align aft acknowledgment abundance yew wherever wheelwright whammy welt waffen virgo vhf verte vaudeville ultima tubular trajectory tongued toes thrasher televised tapping succeeding stump stitching stair sphincter snoopy serif salaam ropes rhea retina rein rehearsal quickening quartermaster qualify psychotic psychoanalytic prenatal possessive poli peroxide paying origination officiating nectar nard munch morphological moors missal megalopolis massage maestro loneliness logarithmic loa lexicographer lampoon kodiak kiln journalistic jive interconnection inscribed inquest implied impeachment illegitimate holiness heroin healer gosport fibrosis exchequer empowerment electrochemical dole dialing detonator decoding contagion condenser collide coda climber chrysalis cheddar certainty cellulose caretaker capillary capacitance calculate beggar bailiff awe attending anecdotes anaconda amplified zoroastrianism zona zephyr whistler weigh weaponry vodka unnatural truly trotter thou thereafter tester supposedly suffragan std stainless socrates sisterhood shatter rundown rudder rower rien reborn proportions productive preliminaries prado polarization plating pitched parabolic onyx olfactory obscure obligation negligence musket miraculous migraine meaux lungs lucifer lotto lodging kook irradiation incarnate icosahedron herr gargoyle gaia futurity fugue frau foothill fleury flea fingerprint farina examiner evolving ether emulator dung dread dmz distal dissipated determinacy deliverance daze dahlia cretaceous coronet contiguous contextual condyle comptroller cellar carbide capita caning caddy burg brakes blister beak banshee assembled agni aerodynamic adjutant wildwood weighing warts virology vacant unrealized unnecessary truce trioxide toda texan testicular terminated tendon teleplay tapestry taoist symbiosis syllabary suicidal stiffness sorcerer solon simulcast sibling sheer seta sealing screwed scary savior ruined retained restrictive resolved residing recessive rave rasa radiance publish proteus propositions proclaimed processed primo preferred pons plover plank pictorial personification peptide pentagram paschal parochial paladin overlooking outback ornamental officio obelisk nominating nag molding melba mandated lush looting loads lined knighthood joggling interlude interferometer inspirational homogeneity hibiscus herpetologist hartmann harbinger graphite gambit funerary fours flue feelings faire expressionist eaves drought drafting drafted doubly disbanding diaeresis deriving depressive cryptanalysis contractor comparing cessation carnage calf burned bullhead bourgeois borderlands bodyguard blueprint bloodline blazing bevel beehive barbet baking aware auspices assisting arthritis airway adversary abundant abigail yank weathering voicing turbulent trivial ting testify surveying staining snipe sideways shears seraphim scuba satanic saltwater roulette richest respected rejuvenation raft pyramidal pubic propensity preface predicate polka penetration pedagogy pear partitioning palmetto osteopathic nutrient nubian nonesuch mower morgana moat misleading metathesis lunatic lumberjack larval lamprey labeled kaunas installment indium indicated increasingly incline incentive hurry hire heater heartbeat hatred granting gigantism geodesic flown fierce expenditure executioner eskimo equalization episcopacy epiphany ensigns elfin electrostatic electra dumb doodle dismissed dicotyledons diablo diabetic delilah cram cosmetic contestant constants consecration conformity conch cockroach clinch circulating chromatography chivalry challenging cava capri cadence cabbage bulldozer budge brutal birdy bereavement bast authentic audition attribute atomics appendix analyzing amorphous amine almighty allegedly alienation albinism aerodynamics actively accusation accurately abbess zeal willing voiceless victorious vedanta upstream unrecognized tuff transitive superb sundays stratum strains sterilization slavonic seduction schweinfurt roundup rooster rocketry recruit puffin primal possess positively pity parcel pantheon painful padre paddock odor obedience nilpotent molar modest modeled mariner manta manifest mallow louse lackey knocked inmate impairment hopping heterogeneity harmonica gymnast gulch grinding gravitation goya genetically furnishings framing fda extrajudicial excluded excerpt espresso eraser engage dravidian dispenser discovering disappeared delft cute cour counterintelligence counterfeit countable cough contesting collie cog charming categorical catamaran buckskin brutality briar billionaire billing benet bargaining astrakhan assess asker aristocracy amish alum albumin aggravated worse volatility vertebrae vassal uzbek urchin undergrad underdog unbound trekking treating trapeze topaz tome thinker thereby synonymous surround sunken stake stabbing shoreline shay sharpening seminars selenium scraping scoop saline rods retailing regulating rancheria quint quark quadruple quadrant punctuation promontory prinz predict pinnacle permanently patriarchs patria parentage ornament occupying objectivity nylon nb moulin mortis monasticism marmoset mantled lyra lucid lido leger leased lathe knowing introduce insulator insane infusion illyrian hump heavens gunpowder guarani greed grazing gradually gloves glide gila galilee funnel foolish flush florin firebrand faithless exhaustion exec examining escaped embryology electrode dystrophy directorial desolation curia cremona courbet converse constantia conspicuous concentrated commemorate chromatic cheeked castilian casanova buggy borderland boosters bigger becket beams barracuda barns backwards backhouse ax autostrada apportionment ammonium allegory agglomeration waterside viscosity utopian ultrasonic traps tonic tired swelling swampy superiority storing stoker stays stat stag squaw sprinkler spindle sodom smashing seller seeding scrutiny scissor saying sake rundle rubidium rounded robe righteous rhinoceros rewriting resumption remuneration refuse raving pushing purported publicist prepare plaid pip peregrine peking parting outward necrosis navigational moot monoxide mobster maw mates mantis mackerel louvre leakage ketone jeunesse jargon jacks jab islet intercept informed infanta hitter highwayman handful grundy gretna gantry fuzz fits farmhouse extremities extremism exhaustive enquiry doggy dodona dine deterioration denim deliberate deletion defendant damnation croton conjunctive condensed computable coherence clearly circulatory chose ceiling cease carburetor bund blunder blowout blot blackberry beulah bedchamber bearded autopsy assistants applicability anomaly alamein agitation aggregation advocated adonis accompaniment abstinence abort wrench wildflower watercraft wand vali upside unclassified unbroken tufa tenderness temps sweepstakes stupa stuck strengthening streeter standby sprite spectacle smuggling shocker shipwreck sending seigneur saucer sails sagittarius sag ruble rodman reinforced referral redesign realistic rationalist racket purely practicing potatoes porn plea peanuts pasture passionate ovary onslaught offender oceanographic notions nne nipple neat nanny motorcycling medusa lorry lifesaving ledger lax krait jardin irreversible inhabit incisor illuminated iconic ibex humidity hubble heirs headmaster harpsichord hallmark haired grooming grandeur gory geopolitics gather gam furs fuego footprint flicker fide failing faded excuse ewe escalation episodic ensuring embankment elliptical elective duet draught dividing dike diagnostics defiant debts deafness deactivation creeping crackdown cowl correlated copied cons concurrence collagen collaborator clio claimant cicero chubb cheer chaparral champaign cashmere caring buyer burp brackets boyhood bowed boring booty bonaventure bloomer bloodstain birdlife binder beveridge beaune bate arriving apathy amulet ambrosia acheron acadian yaw wits winger vulnerable vindication umbra throughput surya subsistence stratosphere stenosis staircase spotting spire spaghetti smack slant skilled shale sequoia seasoning scarf santon rubicon rota ripper remind reckoning rebound racist pythagorean psyche presumably possessed pom pointing philo permian penner paley numismatic nizam nit negation monger mig merely megaton masquerade marry madman lure legislator leaching intolerance interpolation intact incense hypersensitivity hogarth hf hatchet happily happens gosling goofy glycol garuda funnies freer forecasts foe figurine extrinsic equator envoy economies displaying disclaimer diogenes digestion despot delirium deformation deepest dawning curly crowded corridors contribute consular conestoga coaxial clue clarification clad chop cherish chastity causa cadmium breasted booby boggy blindness bimbo beheading battling bacterium attend atrophy astral archangel adoration adjudication accurate wallaby vows vestal tout tot tiara threads tet tec taurus tachycardia syllabus surrealist stamping stalking satin salty sadness rohr ringed respond resistor reprint reinforcement reckless readership radioactivity pulsar psychoanalyst protester positional portmanteau pokey plumbing plenipotentiary pleasures planter pertaining pedagogical passover palsy pageantry overhaul omen oecd occupancy nymph nous mottled morals mikado middleman manatee lode listener lasso lassie landfall lame kiowa kennelly jeopardy indexes iambic hustler hoof guilder goring gauntlet fudge framed forerunner footwork fastnacht extracted expressive expelled durga dory dissociation dirac deviance desk denied defend dap crashing counselor cormorant contour conger confucius confederated cond commitments collapsed colic chute chasm chairmanship centipede cavernous canned caerphilly bully bricks brew bole blitzkrieg blending benefactor baring bail austerlitz attract asbestos arbitrage arawakan announcing amigo aloha aligned agnosia adrenal abdal abandon zag wac vulgate volt virulence venerated unorganized uniqueness triumphal tranquillity tragopan theoretic suggest submerged submachine sublime subculture strata storyteller stetson splice spend solvable sodality silicone shortening shipwrecked shave sane sacraments ruse rigidity ribbons resigned rem reinforcements refusal reenactment rallying rainmaker quit quadrature puffy pressed posting plebiscite piccolo penis penicillin patented paroles outfield organize occupy obscura notices marrow manchu mackinaw lockout locking liabilities irreducible invincible intestine intermarriage indication incendiary imperfect hostile hera hausa guillotine grindstone grimaldi goalkeeper gneiss gears gearing gathered forged flashing finis fearsome fatherland eyewitness exponent exempt erato epistle enabling electrolysis effigy dusky drone disparity disguise dime dewan demonstrate decreasing decorator culmination cruising crowning crossfire criticality coward corton conserved comprehension commit coenzyme cleaver classifying chiropractic chaperone centrum catalysis blinding billiard bascule bambino asymmetry asp articular albino albertus affluent adhesion absurd abode yogurt wester weep waiver vicarious vibrato ventricular usaaf unilateral unconscious unbounded tyranny turnaround trove trillium toxin topper thirds thi thermoplastic tactic swings subsidy stutter stuffed stripper stradivarius spare sorceress snare severely sentry seminar seaport scum roxburgh rococo ripe remotely relate rectal rainwater quadrilateral purge purchasing prospective presto postulate populous pollen plutonium peril pathological pathfinder pastel parsley parallelism overpopulation opt oppression offshoot nightfall nigger mufti missa memorabilia mem mediator mastoid lipped lint knuckle justified jester jackal invalid intrusive interact inflow inbreeding hydrodynamic horseman hobbes handsome haldane haggard guess grit gradual gown goblin geographically gatekeeper gatehouse gasworks fright flounder flak fixture exploded expand ethnology episcopate enactment elasticity edged ecologist eater earthworm divers digging diaper devolution deuce detonation determinism dentition defector dally cunning cuneiform cretan coster conventionally commodities cognate civet cartography carmelite careful capitalist buyers bulge buckshot breeder bottoms bona bobble beginner barb bandstand balsam awful auxiliaries atop aside approaching anglicanism anesthesia anchored alderney alcoholism aegis acquittal accompanying accommodations zoroastrian zn veto valance uterus unc tuner troubadour transmit tow titania threatening tern takeoff tagged swarm superstition subpoena stronghold steer standoff spooky solemn slut shiver serbo seminal semen semaphore seaside seafarer satsuma sacks sabir rooted rhombic retroflex renunciation remodeling reinstatement reindeer recommendation recess recap ratchet rash rancher quicksand pursue psychosocial proponent probation presently practised polite pickled parsing pardoned outrageous oui osteitis oiler obsessed observe niter nicaea muskogee mommy marquee mandaeism magnate mackintosh lymph llano lesion kites iterative inward interferon injunction indeterminacy indemnity inches impossibility homage hemorrhagic heeled hebe heartless gunshot guarantees grease grating goby gaunt gator freya flashback fir filth exhibited eviction everyman euphoria esquire endowed drosophila downer dormancy discontinuous dimmer diffuse decent custodian corral conveyance convection consume constituted condensing concourse commutation coed clove chuvash chimpanzee cares cantabile cannibalism bronco blazer bien beholder bedouin basso baseman barnabas barely backstage aussie askew arrive arras armaments anorexia anaerobic altering altarpiece aeon adjuvant adc acceptable yon whitlow warped wantage wacky unrestricted tying tigre thieving tetrachloride taxing syntactic subacute streamline steels starving sporadic spellbinder specs sober slumber slipper skinned shrinking shortwave scenery salutation salina russet roaring riverhead repeating rendition regionalism reasoned rains quilting purgatory punishments pun pulled pubis principalities primrose prelate portraiture plumb phantasm parliamentarian orozco originate omission obligatory normative naturism mythic mussel motte moorish monolith moderation mistaken melford manpower malachi likelihood lenticular leek kippur kamarupa iteration irony intersecting implements idiom hoot hippo hilly highlight headless hangman granger glut girdle gasification ganja formulated foaled flamboyant famille falconry encoder elision electrodynamic dwellers dude droit draughts doubling dissemination disappointment diminished depend decreased decide ddt cuddy crystalline cryptology crucifix creeps correcting contraband contaminated confidentiality concha commandment cocker coagulation cloister clog clockwork clam cheers checked catastrophic carnal carmine bursting buoy brio brilliance bridle bookman blazon birdman bargain attractive assent arsenate armyworm ardennes archetypal aphrodite anyway ancona amen advisers zuni wildfire wig weevil weeds virtuoso vetch versatile vendor unusually unidentified turbulence tracer tenets taiga synergy superpower styling spades softly shielding semitism selene scrappy schoolhouse sauter ruthless ruthenium rhubarb restitution regicide regalia readable rah raga raffles quota psalms propositional proceeding prewar pretender preemption prank pounds popliteal phalanx pavlov pater paragraph pap packaged operetta operculum ohm observable nodular ninety moccasin mite mephisto meek mayan maneuvers mako mahogany lowlands localized lingua legitimacy lament lade lactate kosher keck karelian jumpers interlocking insular hypertensive hick heartache gravy glamour gallows gaining gaga gab fictitious feat estimating eradication epitaph endowments endorsed encyclical elaborate eclectic dues dreadnought doss discretion deterrence deny delicate crocus cornet compulsion compressed completing commemorating collage coherent cichlid chopped chard caller bream bran bothriolepis borax blocked berm banyan azar auld attracted ankh amphitheater amalgam alphabetic allegorical alderman airliner adjustable adjunct adherents acquiring acknowledged accordance worded widget whitefish whirlwind wander volunteering vindicator versatility vc unto unmade tripartite transformed touched topographic toasted thumbs tamping tailor suffer strands stockade stoa staring starch spheroidal sooty soma socratic sled slaty siva siding shrink shamanism semester selecting securing seashore searchlight samaritan salut sagebrush ribosome rial retain renew refinement rectory rectifier recapture ravel rationality ramadan quorum psychosis prostatic prominently prankster potty porphyry plasterwork pidgin perseverance perfusion pejorative partnered parson pampas pajamas overboard okrug oka mum multiplicity mould motoring meningoencephalitis maximal maxima mastodon masterpiece mardi manned malfunction lighter knuckles kairos juke juggling insurgent incubus incorrectly incontinence inconsistent inappropriate husbandry hostages hooked hooded holography heroine hearsay handwriting groom grizzled glassware frenzy fredericksburg fostering flyover flam excited enlarged echidna dukedom domestication dihedral diggers dene dempster daybreak daisies cucumber crawling contrasts confucianism competency circuitry chronicler bonfire blowing blindfold benchmark batty barnyard avion atua attachments amethyst wrapper wiggle whetstone wayward waterworks vespers vert veneer vain vagina vagabond urgent upbringing unused unsigned undersea tubing trombone triage transporting transduction topped thalia tequila sweetheart surreal stalinism spiritism spaniel sot snout smokeless slowdown sliding shove sheltered sheik shebang shag seemingly saturated sanhedrin rosette rodent riparian rewarded restoring repetitive rely reedy rebus prudent prevalent predatory poorly polished pliocene pita piping piety peony paternal pantomime pandit omitted octant numb novice neurology naturalistic naive myriad musicology motions moratorium moniker mentality measurable materialism mammary mailing locate limiter lifted lapwing kaleidoscope jaws jackpot itch interment inhuman incorrect imperative hammock halide grasses gnostic glossy glace generis gat galena fuse fundamentals fullback frey forfeiture fenian faro extermination exorcism exiled exemption ethylene eocene enforced ember effusion dunkirk dispersed disguised dey deregulation depletion deceiver cybernetics curlew cripple creations counted copying copley contrasted concentrating chinchilla chartreuse capon brougham bromine bogus biddy beside bearings bassoon attendant asm angina ambitions amadou agree afterward aeration ablation abbe waxy warring vena upward tyr twister treble toughness toccata tilling testa teal taupe taoism tangier swear suffixed sufficiently stringer stressed stead starlight stacks solace sinfonietta shellfish seriously seated satanism rocking remittance redundant rebate rarity rapprochement quadruplex provocation probate preserves presbytery postmortem polyphony plight planted pituitary pelt parsi parrott overseeing overs outcast outburst osmotic ornaments oar nowadays neverland nematode neighbor navel nationalization nadir multipurpose mulberry motivated montage moderato minter mineralogical meander mapped mandeville malformation magellanic luggage linen laddie labial labia komi knocking kidneys isthmian ironwood interpretive inshore incubator hunchback humid hologram hocking helios harum hardening gumbo gratification grandpa glazing gall futuristic forwarding folder fleece fled fiendish favored fates exhale etruscan emptiness emir emigrant dowel doctrinal dislocation disappearing demonstrative deeply darkest cremation cranberry corvus consulate considerably condiments cockpit clipping climatic cleavage classify chondrite catacombs capricorn canteen calvinism burying burgrave buckler brine brickyard bracken bowel bori bonito boatman bestowed belles beanstalk baronetage arica antiquary annular angling aller alike advocating adultery admittance yawning yachting xerox worthy wormwood whitening weary wager vent tutoring tutorial tricky treachery tonal timed tiles thrown throttle thereof tetracycline tasked tabula suction stretched stitches stir squamous spiller specify sparkling songbird snick smelter slobbovia skylark shopper shampoo shaken seeker secretion roughness rote reluctant realization quixote prong prodigal privileged privateer prescription pregnant predicted poultry postscript perilous percutaneous pedagogue pecan peacetime paroxysmal outrage outing orthopedic ogham octagonal obstetrics niobium negotiate murmur monoplane moline minted midwinter merits matin manifestation magus lsd loo lofty liquefied lipstick limbo lawmaking laches kirchner kicker jeune italic invocation intuitive interconnect integrative insensitive inhabiting individually incoming improvised imaginative hypersonic hydroxy hiring heterocyclic hessian happenstance happenings gung gunboats guardsmen grapple graces grab goldeneye gmt geranium gaze gallop frosty frith forwards fluctuations fingering fecal excitement ere epistemological environmentalist enrolled encouraging elegant eldorado efficiently efferent dizzy dismemberment disagreement dillinger diamondback dewberry deuterium detailing deceptive dazzle dalmatian cutoff crib cozy coroner continuance comply commutative coloration coded civitas circumstance chromatin chimes chewing causative cater cartographer carthusian caramel busting buckeye brunet brannigan birthright begotten beagle bauhaus barrels baggage authoritative austronesian athenaeum astrophysicist artifact arthropod amend ambrosian alia aisle adverbial adverb acropolis acquire acme acidity accursed zoning yogini wyandotte woolsey woodwind warranty wag vile valediction ursa upset unchained trivium tribulation tits tinning timer timely thule taxpayer symptom swahili summertime summation suborder stalk stacked sportswear spokesperson spectacled souvenir sotto snuff snowfield slap sextet separable sanity salish sainthood sailcloth rigging rigger ribs reside reliquary relic reimbursement refined recurrence recon realty rata ranunculus punching propellant printmaker prefer prefect poisonous pliers pimp pd parentheses ozone outlying nostalgia nameless murderous modus minuscule midwife mandible magnetism loudness lop loon longs lifelong lesbianism lemonade lemming leeward lagrangian lactic koran kantian invertebrate interregnum intermission insulated innovator informational improper illustrious hymnal hecate harpoon handicapped gush guilt groats gloss galilean furry frying frostbite fresco frascati fluke fluffy fleur fleeting filed fathom execute erotica epistles enriched eats drumhead dower dope dodger dividend disturbed dispensation disengagement deflection dearest cypher credo contrasting contrary confection concussion compose clues clockwise cheating categorized cantal calligraphy burrow brightly briefs bonanza bloodletting blasphemy bibliotheca bequest bending ats ataxia arresting argue archduke annexed alternately aeroplane zig wolfram vomiting unwanted unproduced unison tweak troyes trillo transcontinental tongues theistic tempered teenager swastika superconductivity substantially stealing stateless sprout spicy soaring skuld sinhalese simplification shoals seer sectarian scarp saturnalia sarcoma righteousness reversed reticular retainer reshuffle reputed regimen reciprocating receipt realizability randomness raglan quarrying quantification prove prescribed praying poona pomegranate poltergeist pigment picked physiologic pharmacist peroneus peccary pangasinan outgoing oppositional oerlikon oberon nozzle nitrite nightjar nap naik mutineer musicale multitude morbid minos mimic millennial mayonnaise martingale marly marbles mammy malnutrition mab locative limousine lifeguard lied licking lentigo leaky itinerary invested ingenious indirectly incorporate inconvenient impose illustrative hydrolysis huntress humanoid hoosier hesperus helpers hatchery harmonized guts govern gorgeous goaltender gaseous forthcoming formulaic flack filtration fertilizer excavator ethnologist estuarine enfant employ eliminate electrolyte dyeing dulcimer disordered dialectic dermatology dengue decentralization decadence cutie cuff creamery corrector corrective corning copernican coop cooler contrabass considering comma colorful cognac cocoon cleft clarion chaise cestui centrifugal censor capacities campanile bushveld bullfrog broccoli bolts besides benzene behold avionics attained attacker assorted arachnoid aphasia airspace agate adz adopt adolescence adjusting accumulated accordion accidentally accepting zap warmer vigil venturer valhalla unstable unequal undeclared uma typing turnout tripping trimmer tricycle trickster transducer totem tote toffee tingle timekeeping telegram taxable tambourine tableau suspicion sunglasses suan stylistic stray steelworks spitting spiritualism spawning socialization skirmish skew sideswipe shovel shakespearean sewerage sever seaweed scrap sanction robes riche revocation respiration reject regress refractive reflux redstone redoubt recurrent rectification recoil realschule rattle pushed provident proverb prospectus pronto profitability platypus phryne photojournalist pesticide penance passer papillary pains owe ogre nissen nihilism nightshade nieve nautch nashua muslin mura multilateral monsignor monarchist mende mayoralty manna mahayana lycian logics libra leukocyte lawful kui krypton kinky jezebel issuance isotopic intangible inert importing implosion ikon honky hinge helper heated gur guerre grudge grammarian gop glitter glebe gilded gearbox frantic frankfurter flooded flail fixer feist fabricated exfoliation excitation enjoyment elixir efta dunk draconian dormant doorway distribute discuss diarrhea dianetics deposed deformity dagon crux crank corvo consumerism conquering congratulations confiscation compliant colorist charms chanson centering celeste casus castelli capitata cannery camas bubba bronchiolitis bouche botticelli booting booking bony bloke blockhead blah biff bibliographies beads barrens baronetcy barnacle baldy autobahn audible araba appaloosa andante analyze alumnus alternation agora affirmation afferent yeoman xhosa wrapped workout widening vinegar vestibule ventilator vending variegated untamed unexplained undefined unassisted typographic turboprop trundle trousers treadle trainee toss tonality timbuktu thales tem synthesized strife steeple steamed spite spaced sounding slack skiff silvery sidewinder shouldered shaving severance sensations seized seize scurry scourge scavenger satisfy rut rumen rostral rialto retouch resolute republicanism reprieve remit reincarnation refit referential redundancy radon radiator puck prolonged proceeds pranks postcard poaching pippin pinning pew penitent parisian papoose overpower ourselves opposites octane oboe nighthawk niece muffin movable mouton mistral miocene minaret mentalism mechanically matriculation martyred marmot mantegna manganese manas malus madhouse madam likes lightly lexis larch lager jus juris jukebox jacky inventive interruption internally intermezzo insomnia inducing indecent inadequate idem humanistic hinterland hertha herder heartbreaker harem hades gaff foundling fosse forgiveness footnote folds flipper firma fireball feudalism fencer felony feasibility fatherhood farce fading ezekiel extremist exhumation excepted evaluated erhard engaging encampment empower emmental embodied easternmost droop dreux doughnut dorm diehard dace credibility creamy cordon cookery convolution contemporaneous conjunctivitis confined concluding circumscription cinque cholera chime chicane celery catawba cassel calorimeter burin brute briefing bozo bounding bod blooming blinky blain biopsy bight bhagavad benediction barren barong backcountry avulsion assessing arrogant aristotelian ardent appetite antidote anticipation angiography analogical amortization afterglow adrianople adiabatic wooded wipe winkle wiles whist voltameter vitalis victimization vibrations vial versicolor verity unlawful unintentional undesirable trinket triggering trestle thallium swordsman struma storybook stinky spun spars sorts sloppy slay sitter sider shutter shoring shogun shingles shilling seraph seem sedimentation seance scone sandstorm salivary sagging sachem ruthenian roast rishi reverie retraction repentance rcmp radiography radiative questioning purpura puller props porpoise placenta physique phaeton perforated peppermint peeping pastry parlor panoramic paleolithic paleo owing overline ossification oppose olden oceanographer obverse obligate nunnery normalized nona nocturne navigable mrna moveable motherhood montrachet monotone mondrian moderator misidentification minyan merl meningitis matsya masaccio marvelous martello lump loophole loom lobbyist lengthy lender lately lacing kink kilometer kibbutz khaki kame joyful jiva isolate intrinsically intertidal intercourse interconnected intercession ingle indicative inanimate inability impressionist immunization illicit hypertrophy hug hue hover hopeless homegrown holographic helicon headband hag guideline graded gesture geophysics gabby furies fuchsia frolic freezing fraudulent foxy forbidding footpath flutter fluent fleck fences explaining erstwhile enumeration enlistment endocarditis emerge embolism drinker dozens dods divisor distributive distorted dissonance dissertation disconnected diabolical desires deserter demi degenerate defective defeasible decimation dado cyclonic cutaway curiosity crushing crump crankshaft cot correggio convertible containment conquered conjugated concurring commendation codification claymore cima christen chopping celibacy casing cambrian bruiser breakwater bouillon bottleneck bosses booger bobcat biochemist bimonthly beater bathroom basilar ataraxia assemble armchair argued altimeter affirmative adrift yarn wink whitey whistling watercourse watchmaker wallpaper vp upgrading unspecified unpaid universally undine unconfirmed turquoise towing torso tollbooth thoroughfare thirst tautological tare tactile syllabic switchback sweeper styx strengthened streaked strategist stepped stencil steed staphylococcus spry specifying spanner spandau sower sophisticated sop socks soak skipping silkworm setback selector segregated seep seam sculptural sartre sanatorium ruck roundabout rivet rimmed reviewing repealed rented recovering recover rawhide radiotherapy quoted puffed pudendal pragmatic polyphonic placer pits phonetics pertussis pearly peacemaker payroll paved pathogen pastoralist pans occlusion newscast nevus narcissism mutualism motility monochrome modify modifier metered metallurgical meatus mattress mascara marechal marauder mandrake mammalian maelstrom machining lots linger leaflet kiwi kinematic khanum kale junkie judged interchangeable intercalation inspire inhalation infamy inaccessible impress imminent ides idealism ichthyology hyperparathyroidism hype howdah honeydew holism hiss heels headache hardback handcart hammered greeting goldstone globulin germinal generative gannet frater foundered forcing fireside finer figurative fiery fetish extracts expatriate enumerative enforce electrochemistry dropout drifting doorstep dogma disused distilled dill differentiated diamant diable detergent deposited decompression czar cyborg crybaby crunch crumb croce couture courtroom counterfeiting correctness coronal cords consuming constructivism constitutionality condom conditioned concave competent collapsible clustering clique chian chancel chained caveman cate carriageway carnation campaigner buttermilk browed brothel boutique bouquet bitty biophysics bicentennial biased bataan bankrupt aye auklet atheist asking argonaut archdeacon applicants anointing angelic ambler aircrew ainu agglutinin adept accolade absorber abdication zigzag yttrium yarrow wrecked wildest widen whiteness weave wealthiest watchman watchdog wahine veiled vaulter utilitarianism urea unifying undetermined underage twisting tusk tuned tum trigonometry trapping transformational transcendent tracked towel topping toft tiff telegraphy telecast tawny summons sully stunted stirred stilts stiletto sticker sterile sprinkle spleen sparse sow sonnet solder smock slinger skins situational sita siouan simplicity silurian shipman shakes secularism scorecard scimitar schola scented rounder ringmaster rigorous rhyming rfd revisionist responding repulsion repeatedly remembrancer remark reck reactance raincoat quaternion quartic projecting predominant prairies poule positioned pips piezoelectric photosensitivity perpetrator penthouse pectoral parfait pamphlet paleozoic oneself nonpartisan neurogenic neologism necrology mull mucky morphine monogram mogul mitzvah minnow microform mend melon medievalism magneto maggot macabre lubricant lovesick loft lash lapel kerosene keelboat joiner jetty intestines intermittent intensification installments informant iguana ideation icy hypertrophic hydrophobic hunted hoodlum homme homburg heterogeneous heretic hardly happening haida habitual gunning gunfight grouse groin granddaughter goggle gags forested flushing floats fleshy fives ferrous famously expect excite evolve erroneously epidermis ens enforcing embezzlement embargo ellipsoid economical econ drifter dredge dray distraction discretionary dim dietetics devonian demotic demobilization demeter delimit decisive decipherment dealings currant crystallography cryogenic crackers correctly coping consistently consignment conservationist conditioner completeness commute collusion clientele centralized cenotaph catwalk catbird carrion cajun bridal bourdon bolognese blight blackfoot biweekly biotic betterment besieged beloved beatified beaked batak barbed ayatollah awarding aversion atheling astray astounding associative archon archangels arabesque apt apocryphal aldehyde akkadian afterword afraid adolescents adjunction acrobatic yukaghir yell wrapping winch warn volatile vocation vizier visayan vigor urticaria unspoken underwear undercurrent unbreakable twining tuscan troche triumvirate triplet trickle tremor tray traitor touchdown thetis thermonuclear telemetry talker tagging swede suitability subtle submersible stumbling stratofreighter starry stalemate springtime spoils splicing spender southbound sodomy socially skinny silhouette sighted shiner secularization secretly scarer scarce scapular sapiens salience rustic rummy robustness roasting roadhouse rive reseda reparations remorse remembering realist rags ragged radioisotope pussy pulley ptolemaic prosperous prerogative preferential postman polyphemus polishing poetics plumage plosive pleat physiologist periodontal perfectly pentecost penology pedals paternity pascua pallid pall pail overdraft overcoat outlines ornamentation ophthalmologist olfaction octet obey novelette nonunion nares mutism moyen minimizing mileage metrical matron mane mademoiselle luminous looby legalization keeps jute jure juicy jig intramural instantaneous inertial imp immoral imbalance hurdler horizontally honesty hermetic heading hazy halibut haircut guaranty glycine glance gestures geometrical gentile gaucho furlough forester foliage flotation flawless fishhook fieldwork fid fatale faker expecting especial esophagus erection enteric emit elegance edema duster duplication driftwood draftee dormitory doomed dolce dixieland dit discomfort diorama dilatation devastation departed densely demoiselle delegated deciding dashboard cured cryptic crowding cracked counterattack cornered conspirator conflicting condominium condiment comsat compute compromised compendium cloaca chops chiton checkered chagrin celluloid cavern caveat caries carbine capote camper camellia byelorussian buffet brolly brim brazen brainchild boyne bother booklet boil blancmange beryllium beefsteak bedrock bagatelle baffle axiomatic auricular atypical assemblage assamese aspiration aporia apogee annotation ammo akan addendum adad accusative accountancy accommodate absorbent zygomatic zither yellowthroat wraith workhouse wallop viability versa vermicelli verify vantage urogenital uncanny ubiquitous twitter tractable tortured toreador tomahawk tithe tilting tideway tetrahedron testimonial telstar tellurium tedder tectonics taint symmetrical symbiotic swash swallowed supervising superposition stubborn strut stride strengthen streamlined storefront stepfather stamped splenic splendid spillway spectrometer southward sniffing smithy sludge sif shorthorn shocked servo separatism seneschal selectivity scribe scrapping scorched scandium scandalous sanitizer sanitarium rusk roam riff revive restatement regenerative reflexive reduplication recollection reclaiming recklessness readily react rattail rapier ranching rampant pylon puberty prunes protease proprietor problematic printmaking presumed prat potency pooling pompano polyglot polaroid polarized poitiers phonemes perceptual pentecostalism pederasty panties obvious oblate neurologist morn militaire midge metrology meridional merciless mercersburg medicaid medalist mastered madding luxurious lumen litmus limp liberator landlocked knez kinesiology jeu jasmin irreligion intravenous interrogative intentionally integrate inhibitory infinitive importation illustrate hydrogenation humain horus homeward highline hegemony haulage harmonics hardened hanky hallelujah hacienda guarding granular grandstand goof goodness gimmick gills gd gangland fuss freighter fowl foresight feu fertile fastener faraway fantail exploit existential excommunication excise euphonium etat err epithet enthusiast enlightened enjoining endeavor encapsulation embarrassment elysium elysian ellipsoidal ehf dutchman dull dug dresses dormouse diversified dire dinka dignity differentiate diem deviant devaki detainment desirability descend derive depart denotational demonstrator demonetization delinquency deformed defended danse daggers cursive craftsmanship coy courageous corti corrupted contradiction condorcet concentrate computerized compile colloquium cohesion choked chivalric chaotic centrist celebratory caviar catholicity careless camembert caged cafeteria bulletproof buildup bueno brutus borrowing booze bodied blotting blackness blackfish bigot bicolor benzoate beneficiary beet bauxite barter barrack bake ayurveda awning astrodome ascendancy arranging argumentation arcane apricot anytime angiosperm alight akinetic advise abscess zr yb westernmost vernal varuna utterance uto usurper upwards unpredictable undying twitch tumbling tufted triste triode trembling trapezoid trailing telly taffy tabular sworn succeed subcutaneous struggling stationery speciality spastic spank sorrel soluble soldering solan socialite smiles smashed skipped silencer shuffleboard shuck shrunk shorthand shank seto sauna satisfied sailboat rumba rowdy rounding rotator riser ridged reverberation revamp retribution retaining respectful representational render removable rejecting realize pyrenees proliferation proletarian proceed probes predictable praxis pounder pouched posh ponder polyhedral plowman pivotal pitfall pickerel photic persimmon peppercorn peavey patio passant parchment overturned overcoming outcasts ossian orbiting opaque oneness obsessive nurture noblewoman nkvd negus multiply mop moonstone monocled molybdenum metallurgist masculinity marigold manzanita madrigal macular machinist luchon leftover kwa keg kaid jointed jawbreaker interlinking intergalactic insufficient innovate inform immature icicle hypnotic hustings huckleberry householder horticulturist horseback horrible hobo hob hippy hike hemp hegel hazing hayfield haunt harlot handmade grappler gourd gist gilead galleon gadfly fum frightening freaky forehead forage folio flange flair fittings festive ferryman ferret farther expiration existentialism escrow epigraphy ephemeral energetic ecstatic economizer economically econometrics earthly durable durability duckling drowsy drove dowry dominate doble disjoint disinfection desirable designate delusion declaring damper culling crystallization cried crate covey copula converge constriction confounding conformation concordance colossal cluniac clarity cinder chimaera chalice chaining carling camber caliph cadeau busboy bowing borer borderline bobtail biomedicine belsen beena beano auk attendants atrial assuming apostrophe anticipatory antic annihilator animosity anguish amid ambling alms alise alibi ager agape affection additionally activating acidosis abused yelp workings wording womb witty watering walled walkabout vive vitreous vitality vesicle vagueness upi unverified unsustainable unlikely unjust unavailable transponder touching togetherness tigress theotokos tetrameter tapered syncope sustainment suspicions sucking subscriber stripping straps strangler stature stalwart spore spearman sowing sortable sore sonics somatic soi sod snowfall skirts shriek shard sensible seltzer sambo rubble romancing risky ribonuclease rheumatoid rewrite revel reusable retrial resume repellent renown remoteness reminiscent reluctance religiosity receptive recco ravager ranged ragtime radiated quivira quiver pusher purim progressivism precession potash postmaster polyvinyl pneumoconiosis pneumatics playwriting plat plasmodium pigments philology phallus permeation periodically pendragon peloponnesian patchwork parapsychology pairing pacifist pacification overturning overconfidence outcry outbound osmosis orthodontic ornate orderly openness northbound nod nevertheless nereus neodymium naturalized mylohyoid muzzle mutt mush modifying metropolitanate metronome metalwork mercator mensch matte macho luger lollipop localism liquefaction liana leveling ledge lass lapse kreis juiced jailbreak intimidation initiate initialism inflorescence infighting infancy indifferentism indeed impressionism impostor implication impending ignorance hypothesized hoe hod hoarse hibernation heaviside hearted hawking handgun hallowed gules grist graceful gonadal gnomic glorification giver gish gibbon germination georgette gently galahad fractured foreword foray fleeing flee fixedness finesse favorable fanfare falsely extortion examine evaporation evanescence equivalently entourage entanglement enchantress electromechanical elapsed egalitarianism effendi earthbound dynamically duper dryer dribbling drawback dowdy donjon dissipation dissection discernment dinky dingdong differently dermal demarcation deliberately decor dandelion damping daemon cumulus crispy creeper cpa cowling countermeasure cooker coo conurbation contempt consulship comrade colleague cockle cob clueless clever citron circumnavigation cheater cerebrospinal censored caudal cataract casement capping candlelight bureaucracy bumble bren borate bluecoat blubber blacklist bitten bisexuality bifrost belli beige behave baryon backgammon auntie aspirant arytenoid archivist apprenticeship annus annulus anhydride aneurysm allegretto administering adapt accents absorbing aberration zipper zillion xanadu wrestle wiretapping westerly weaker waterborne wares wallet waits waffle virago veal unwritten unregistered unintended undefeated unbelievable umbilicus typesetting tulu trefoil treacle tolerant thymus thunderbolt thirsty tetra testicles terminating technologist tantalus swirl supplicant sumerian suitcase suggestion subtribe subconscious strega streaky stimulate standpoint sprung spoof spokesman spoiled spinner sparkle smallpox sluice slowpoke skeptical sixpence simian silt sigmoid sieve shuffling sheepskin sexism serous semiotics secretory scoreboard schule scarred sancerre sailplane sacramental royalties rotunda ropeway roasted rigged ridden resolving realized razorback ravage ramage rackets quince quadrangular pvc punter prospector pretend poundage poulsen posterity posed polymorphous podium pleading plaintiff placard pitot piggy pharynx personally personae parvati paring parenthood palfrey ovoid overseer outpatient orgasm oration operandi nullah nth nodal nighttime nerd murillo moorland monism misfit minimize milanese mien mews metamorphic mellitus mell medic meaningful maori lyre lovejoy longue locating liquidator limelight librettist lem laterally lanthanum lancer laminated lagan kodagu janitor jailed invest invert interdenominational intelsat infinitely inconsistency incitement imprecise impetus hypothalamus hypostasis hovercraft hopeful haverhill hating hanukkah gramophone gnat glossopharyngeal glial gestalt garret gaol gangrene gamecock gamba fragrant fou flettner fibered faulty ethnomusicologist escalator eruptive eppes entirety entertain enslaved encouragement elation egghead effector educating echelon eccentric duress drover doses dormer donnybrook disparate disenchantment devotions destroying derogatory deduction declarative darn cruciate crossbow croquet cronk cotta corset corduroy coon convergent contours consequently consequential conductivity commoners clemency cic cassowary carefully carefree caprice caccia bureaucrat brigandage bridegroom breezy brae bookseller bonuses bombard blond bastille basset bagel babi autograph audiophile audacious arguing apron anus anthropomorphic anole angora anecdote amoroso amharic ageing admissible administer accuser abiotic aberrant yonder wretched wrecker witched windmills wily whitestone weld wasteland washer warty wakeful vulgar voyageur vizard vigorous videotape vermin veritable vanished vandal usable urethral unorthodox unofficially unlicensed universality unicameral uncontrolled tuberosity tuatara trow trimming transgression tope toleration tarragona tankard tame sycamore supplying suckling subaltern strides stradivari stoic stipe staying standstill stairway staggered spoil spines spiel spasm sorption soit snapping slipping sling silky shines sharpie shapeshifter serene sepia senseless sectional seaway scaffold savant sarge salmagundi safeguarding rube roadblock riper ringer rind rijksmuseum rhizome resurrected restraints remission relapse receivership receipts recast ratified raison radiology questionnaire pulses pronominal prickly prevailing premolar prawn polygonal polygamy plumber photochemical phoneme pert pershing pensioners penetrating pend peaking payable patella parabola pantry palisade palate pagano padding oversee outermost ostrich ostensibly openly okay nobby narcissistic mutually mucous monarchism mieux mezzanine meson melamed maturation marduk manhood malevolent mailman lowered logs locket locker limoges licensee letterer lend leer knees knapsack karakul jungian jerk jealous jawed irrational intrauterine intoxication interlock interlingua intellect inspiring informative infantilism indecency inaccurate impersonal immortality immaturity identifiable hydroelectricity hummer hoodwinked hone homunculus homemade hogging hew heidegger hater harmonium gust grot greenbrier gondola godspeed godhead germane ganesha fulfilled friary freezer foundational forebrain forager flooring fini fey feathered fathead eyebrow expressionism exoneration excretion etang entitlement enosis engraved encyclopedic encroachment encompass eames dwarfism duple dubious drunkard driller draining doorbell discounted discolor dexterity deserve demerit deemster deceit darkened curing crawler cps courtesan courser cottonseed convey concubine collectivization coincidence clockmaker cleves claws chutney chisel chiesa centralization cavalcade carbohydrate cantus campsite campground cableway butea bushman burnout brooding breeches brasserie bouncing bihari bibliopegy berth belladonna beekeeping beechwood backfire bacillus avis attracting attenuation assume assessed artisan arsenite aroma areal applause apologist antietam ail aerosol actualization absolution abrupt aardvark ytterbium wrought whirl weeping wafer voluntarily visuals venerable usn unsaturated unlucky unlock typewriter tutti tussler turntable tunneling trot treadmill treacherous traditionalism totality thrifty thorax thinner theoretician thalassemia tetragonal tektite taunting talus sync swipe suzerainty submersion stylist strum stocking stimulating steely starvation stalinist spoonful sorcery songbook sock soapy sneeze snatcher smoker slicing skateboard sideband sibyl shroud sheikhdom shaver sevenfold separatist sensibility segmental scramble sciatic scaly saumur sassy sartor saltation salinity salami sacrum rung rudra roommate rid reuters retrograde retardant restricting responsive researching refund redneck questioned quack pyrolysis pursuing psychogenic proviso pronounce prolegomena progenitor procrustes proconsul privates pressman preposition poulet polydipsia phrenology petrochemical persuaded perjury periodicity perceive patera pampa outage organometallic optimism occultism nudie nonconformist nephritis nein nco mutilation muskrat mow morgue moolah mignon mentally medico medica marrying mapper mandore mage lull lubrication lowlife lowering longing logician limbu lifter lice leaved larynx lapis langur kuki kriss kilowatt keener jour jewelers irrelevant intrigue interpol inositol inflectional infestation incubation incisive idealized icehouse hypochlorite hyacinth hopi holler holdfast hives hectare headstock halogen guardsman grower grisette grin grief gravedigger goldwasser goer gluteus gaudens gauche garments galvanic futility furthermore furlong functionalism ftc frisky fretting frege foursquare forwarder fortran fortitude forgery foreclosure fluctuation floss flammable fireproofing firepower fireless fides fiddling fata facies eyelid exposing exocrine existent euphemism ermine ergo erect epileptic encompassed emissary emf embalming egress eggshell eclecticism ecclesiastic eastward earshot domus dobbin disqualification disputation dispensary dibber desecration deprived delirious decagonal deadwood dazed datum cygnet cwt crt crossbreed crossbones crimp craving courting countertenor cottontail cotillion cote corliss continually comparatively comparability citrate chroma chlorine chipper cheque characterize chambermaid centric cassia carbonated capper caper cannonball candidature campfire campaniform cacique buttocks buttered businesswoman burlesque bundled bumblebee brindle bowlegs bonk blender blackbeard bisulfate biota biceps beret barring banishment balm balinese avocado assured assize archetype arboreal apprehension applicant apologies apocrypha anzio anechoic anathema altogether allotment allhallows agincourt ageless aerobic advised adapting acidic zephaniah yoke wreckage wordplay wobbler witching wicker weatherman watchful wart volley viscous violette veterinarian verifiable verge verdigris usurpation uplift uphill unveiled uniquely undergo typo tweeter turbojet trousseau tribulations tremors transept transceiver trailblazer tog tipped tinkle tightly ticking thunderball thraco thinning therapist terrapin teapot tasty tammany swindle susceptible supranational supernumerary suck subtraction subsonic subjunctive stewardship statistically spinney spasms souled sorbian snips sniping smoked smelly slumberland slugger slippage slapstick simba sigh sib shading septuagint septimal scud scriptural screened scratches scraper scram schoolmaster schoolgirl scapegoat scalp sayings saturnia satirist sandspit sanctioning salient salesman salers rubella rotate roost rookery roofing rhinitis revenant retrospect retracted resonant reminiscence relieve regulars regularization reformist recognizable recitation raisin rabble quenching quake putty purusha psaltery prudence proportionality propel pris princeps primum primacy priced pretzel predetermined positivist polyunsaturated polecat plotting plenary planer pineal piled physiography photovoltaic phoebus persephone permissive permissible penile pathologist participle paratyphoid paranoia pansy paleontological paints overlook outrun outlined osmium orangutan opener oligocene officeholder odysseus nones nominally nihilist newscaster netherworld negatively napkin nankeen myocardial myeloma munda mlle mistreatment misinformation minamata milieu maxilla masse lupine lsm lodger lioness liberated lexicography leverage levator leftovers langmuir kookaburra konkani kitsch kingfish kea johnnycake jealousy irritant ionizing invalidity introgression inheritors inexpensive inductance inactivity imposter hydrangea humanitarianism homelessness heteronuclear helical harrier hanger haiku hagiography gyre gunman guerilla guardianship grinning greatness gravelly grandchildren gournay gordian gomorrah girlie ghat gertrudis geochemistry genitive genealogist fusing fulfill fucus frisk footloose fondle fluorine flawed fistful fenland fane fandango eyeball extravasation expansive exciting exceeding esophagitis epoxy eponymy endothelium ender endangerment encode encephalomyelitis empathy elaboration egret eerie educationist educate edelweiss dyadic durance drip drawbridge downstairs donga disjunctive disassembly diaphragm dialectics despised desiring deserted depict demonstrating debtor dachshund cuttings cutis custodial crushed crescendo creosote cowherd coupon corrie correspond coronach contradictory contemplation conic conductive concurrently concatenation comrades compleat coalesce clank cinerama chirography chink charybdis charisma cerebellum ceded cartilages caricature cancel cameraman camelback caddie brownie brokerage broadside breathless brambly braided brahman brackish bombsight bocage blessings blemish bleacher blackthorn blackened bioluminescence biodegradation bice bewitched belted bellows beaten bathhouse bateau baptistery banked banister ballade bailie awaiting avid aviary auroral attestation asphalt appropriation apparition annalistic angra ammonite aides agriculturist agitator agee affirmed admiration acne achromatic abridged abate woogie windshield whaler ween weakening wavy wasting wane walrus walling vitriol vim vanish urination unspeakable ungulate unfaithful unconditional unchanged unbalanced unarmed umlaut twig turnip tupi triceratops tread trampled touraine toddy toaster thrilling thesaurus tessellation tantalum tangible taker tableland synergistic sustaining sustain sundial suited subsequence stylus studded stealer stater stab spoons spined spectacles specialize spasmodic soybean solipsism snide smudge smoothing skates simulate septal seductive seasoned scrambled scion scd satyr samarium safely rorschach roaming richness revs reversion retroactive reticulum retainers resolvent repudiation repayment regards reentry redeeming reconstitution quench quadrennial pyrotechnics pursuant protuberance prostatectomy profound prisms prismatic preheater potens positron poses porch plywood plow plotter platter piles phylum phrenic phobia phenol periphery penning patrimony pallet painfully overlord overhang outs outlander outflow outdated omnium occlusive obsidian obscurity nutmeg nonviolent nervosa naris narc multiplied motorboat mortals monograph monitorial monad molasses modulated mnemonic mire ministering midterm metastasis mesozoic merino megacolon maximize lutetium luster lusatian loki ligurian liege lepton lecher laminar laity ladino lactation kloof kiosk kidder keynote julienne judicature jitney jiffy interplanetary internationalism intermediary insist inquisitor inlay ingress infarction individualism indicted indeterminate indentured incest impurities implantation impervious ignite homeopathy hermaphroditism herding herbarium hemlock heiress hardcase hangover hanged handshake groundwork grassy grained gloaming glaucoma geodesy fundamentalist fulmar formulary forging forger forfeited foliation foggy flyleaf fling flattery firehouse figurehead ferment felid federalization farrow faerie factitious exceptionally epigenetic entente enquirer embark electrosurgery eisteddfod duodenum downside dovetail dosing dolmen discrepancy discarded directorship dingbat dichotomy deductions debug danica damselfly cyclopedia cumulate crustacean creepy crackerjack covenanter cortese cornea cordite corbel constituting congruent conductance compassion compaction colloid collineation coalescent clos claret clapping clabber chum chronicling checkout censure carton carpe cardamom capitulation camphor bx bunt bruit breech breastplate boxcar bottomed boozer boondocks bodkin billet bicentenary bavin bathing barricades authoritarianism authoritarian aurelia auger attain atelier astigmatism assertion asleep arsis antidepressant annulment angelus anarcho ananias amicus aerobics adjudicator accompany abnormally zilch yolk yep yellowtail yelling wraps wombat wishful windfall wigwam widgeon wellspring weakly watermark vomit violating vicarage viable urus untouchable unprecedented unmarried uniformly undersecretary twinned tuber triumphant trine triggerfish trappist translucent transect tranquil tramping traditionalist touchstone torticollis toponymic tongs tightrope temper telepathic technic tautology tartrate takelma tacit tablature systematically syndicalist swordfish swig swept sweeping sweater suspensory sufferer substructure substituted stylistics steppes stanza spoonbill spiritualist spiffy sparsely sounders souci solenoid snows sniff smelting slum slit slipknot slingshot slider sledgehammer slaying skirt signify sienna shrove shaper sextant selfish scrooge scatter scapula sash sanguine sanctity sancta salicylate rumored rotter robber rioting ringside rigor repairing reliant registering refutation recital reamer rapporteur purportedly pummel puffer provisioning propellers prepaid premonition powerboat pots porcine poke plump plumbago pious piling phonemic petrology persuader perron pericarditis patriarchal passerine parenthetical paraphrenia paparazzi paddling pacer oxbow overt osco orangery ont ogo oblong northward noire netting neoclassicism nebo musicianship murdering muntz morta morale monophony moderated mitral ministership minimization mercurial mentioning medlar medius mediate mayorship materia masthead marsupial marshmallow marooned mandingo macaroni lusty luminosity looker loin lingo liked lieu lichen liable lettuce legume lapin lait ladybug labiodental kiri kidnap keynesian kerb junkyard itty itchy intensified insipidus innuendo inning initio informer impressive imperialist immaterial hyaline hussar housewife hospice hoped hinder herod heliotrope hedonism hedging harden grunt grasp granule granny gnash germanium gauleiter gallbladder gales fundamentalism frogman frag flocculus flirt flank flamethrower flamenco fireplace fiduciary fez fetch femininity fanaticism facilitating eyeshield extravaganza externally extensible exerted evangelization euphoric eulogy erector enmity enchant electrocutioner elan ejector ejective eggplant eeyore dweller dunce ducky dualism drown dreaded draughtsman dramatis dragnet dogmatic distension distaff displace disobedience dismiss disgrace discounting disbelief diadem detritus detour deterrent deteriorating descender deluge definiteness debutante damsel damocles damaging dagoba daffodil cymbals cyan cushion cultured culminating cubes cringle crick crema crave costing corregidor copyist coot coolant convenient convected conjoint confetti concentric concealment compactness codon clutter clump clouded chubby chrysostom chrysanthemum choses chomp chiffon characterizing chandelier celiac catchpole cask burglary burglar broth brittle bonne bohr bogle blotto blackmail bellona bellboy batter bathysphere baguio bagpipe babbler awaken attainment astrobiology asserted assassinate ascendant arian apologetics aphid antithesis antenatal annuities animate amoral allure activator acknowledgments acanthus abusive abridgement abrasion abominable woolen woof weal watsonian warlock waddy vole vivendi vivace venturi vastness vapid valgus unfamiliar undertake underpass underdevelopment unconquered ultimatum uke tuxedo trunks trucker trna trews tress trente topsail tidings thrones thriving theoretically theatricals tetralogy telegraphic tehuantepec tegmentum tearing tannery talkie tailored syncretic symptomatic surcharge subalpine sturdy stumble stp stockman stirrup stinking stink stimulant statehouse stall spontaneously splint sparing soot soke socle sob skylight skips skeptic skald sitar simultaneity signer sidhe shillings sheen sharer shaded sequentially senhora sellars seldom scrim schoolboy satisfying salted sacrilege rustication runabout rumination rubdown rove romany rhesus respects resign rescued remover remonstrance relatedness redhead redeye redbird rearing radiological quizzing questionable queries putative pushcart psychotherapist psychopathology pseudotuberculosis prune privateering primavera precocious praised pox powerless posted possessor pontoon ponies polymorphic pocus plumper pitted piste pinscher pilsner piloting pica phytochemistry physicalism perky perks peristyle perilla perfume perforation pensionary penned pedestal peart pave patterning parasol panky pacemaker outlawed osiris orpington oleo obviative obstructive nock noblesse nicene naturalness mournful mots morph monotype monotheism monetization molded moderately misunderstood mismanagement miniver midas meteors mechanistic maul masted masking marten malayo madly machismo lunge lotion lorica lope lolly lobule lithic linga lief letting leaning lapsus lammas laconic kingmaker keel juste jungles joyous joinder jackboot jackass itai invisibility intrepid intracardiac intimacy interpret integument instinctive inglenook infectivity inelastic inclined incandescent impresario impersonator imperishable immunotherapy immense illiteracy humana hula horsepower hootenanny homing hohenlinden hocus hock hitchhiking hijack heterotopia hermaphrodite hellfire heightened heavier harmless handspring halves halter hackamore habitable gudgeon guar greener gravely gorgon gooseberry goober goldfinch godlike goblet glaze giraffe generous geared gasket gainer fusible frosted fractionation fortis foretold forename fore flexure flan finely feeble fashionable farthest farrago farmland faithfully factoring extrapolation externals expropriation exporting experimentally experiential exercised exegesis etymological etna ethane etcher esteem ephemera enforcer encrypted encirclement emulsion empyrean eloquence ellipse ejection easterly eastbound dwell downtime doubtful dossier doric doorman dominions domicile dobro divestment dialysis dialectal desireless deoxyribose dendritic demanding delinquent deliberative decoder decipher darwinism crypto cresol cowgirl countryman countercurrent councilman cottonmouth cosy cornucopia copyrighted conventual consenting confraternity conclave compensatory commemorated coeli civilized churchman chunk cholesterol chlorophyll chinquapin chaplaincy cellophane cartwheel cardboard canzone candlemas canard cadaver cabriolet buttress buttercup bung bulbous breasts branle bowled bookshelf boathouse blurred blunted birr biotin bilk bicorn behemoth baronial barger balder badly backdrop babbitt avifauna austere atman assortment assessor assembling asphyxia asio ashore asexual artificially artful arousal apse apologetic anzus anubis antimicrobial anschluss angostura anesthetic andalusian ancienne anatomic analgesic amoeba alkalosis algarve albeit affray advising adoptive adenovirus actuator acoustical abortive zoophilia zest wot wort wildebeest whiskered wed wcc watchtower wail vivid visage vibrating vested verified venter varmint vagrant utilitarian uranus upheld unreliable unipart unfair unexpectedly unemployed underweight underhanded undecided uncut tyrolean tussle tuckahoe tuberculous tubby trumpets trill trike trice trapper transference tossing topknot tipping tinting theism teardrop tarsus tarnished talos tailless tabulation syphilis symphysis superstructure sundry sumpter suggesting substituent subjected stubby structuralism striated strangeness straddling storehouse stonecutter stirk stimulator stepsister steinway staghound squeezing squeezed spurious spousal splashdown spectroscopic specie somnambulist sneak smuggler smoothness sleigh skinhead simplify siesta sidekick shortcut shedding shawl shader sere seabee screech scherzo scatterbrain sasak sardinian sanctus samadhi saddleback robbed ribosomal revoked retroactively restructure restrict respecting requesting repulse repressed relying regularity regain refraction reestablishment redwing rectilinear reconstructive reasonably ragamuffin radicalization quilt queenship quarrel pushdown puissance psychoactive psittacine proximate protestation prosecuting prohibitionism probing princesse primeval presumptive powdered pottage plotted pleased pique pining picturesque picker photostat photolysis pharos pharisee petronel pes permanence perching penfold pemphigus peekaboo pedophilia pastures pappy papillon paintbrush owning ouzel outspoken outset outfitter ossuary ordeal optician ophthalmia ontogeny objector oatmeal nutty nutans nuncio nucleotide novitiate novial notary nosebleed nodule neuritis neoplatonism necromancer mystik mycology mvd multiplying mottle misfortune millstream midriff mfa methionine masturbation massy marksman mantilla manchild magnificat madder longhouse loess loach limbic likeness licit leathernecks lactational laced kismet ket keepsake keening kaffir junco joule jazzy jacksonian isothermal ionosphere integrator insurer install inseparable infinitesimal infest inferred infantile inequitable indifference inattentive impurity impulsive improbable impersonation impartial illusory icrc hydraulics huck hooligan holistic hinged hideout heterosexual henna hemispheres hearse hawkshaw haul harvested handmaid hairstyle hairs hairless grotesque goosey goodwill goldilocks gleaming gatling fuselage frustration fruity freshly formalized forgiving fodder foal flattened flannel flagrant fieri festschrift fenny feller febrile feathering feasible fanon fanged factionalism factional extractive expiring exemplification evident etiology ethereal erratic epicurean endoplasm elastomer dumpy dumbbell duce dramatics downturn divorced disuse disturbing disorganization disjunct discontinuity diminishing detectable destined delicacy deficient deductive darkling cyanine cubist cubicle crucified cropper crock cribbing credible crayfish crass crankcase couleur cosmography cornel corkscrew cordial conforming conformance conform compurgation complicity complication communis coir coincide coexistence clothier clavier circumcision churning christened chock chiaroscuro cheeks chauvinist chauvin chalone cession candlewick cahors buckwheat bruise bristle breakage bossy bodhisattva bloodsucker bloodbath biogenesis billabong beluga bellow aymara augur asphyxiation argosy appealing antler antagonism annum anacrusis ampere ambulatory ambitious alphanumeric alluvial allele aldermen albinus affliction admired acrobat ache academician abelard abaddon yummy yielding wreathed wondrous wok windowpane whimper westbound welcoming waterproof warmth waiter wading voce violator viewfinder verifiability uroscopy uproar unpopular unpleasant unleash uninvited undiscovered uncensored twirling turistas tuareg triolet trinomial towhee torment topsy toothlessness tooling tonnage threshing thresher tentative tensile telltale telepathy tableware swoop swollen surveyed surrealism surfactant submit stretcher strath stockings stinger stilt stepmother stabile spud sportsmanship spiked speck spearmint sparrer sommelier sobriety snapshot slicker slaughterhouse shrouded shredded showers shellac sharper shaking septic separator sentiments sentient sensitization seizing segmenting seedling sedge secretarial seclusion sculptured scrivener sclerosing scientifically sayer saver sandglass sadistic roving rollback righting ridgeback ribbed rhombus rhomboid rhinarium rheumatic reviving revisionism reversing revealing retriever retread rethinking resuscitate respondent resplendent rerun replicate reinvestment reformatory reduplicative recapitulation recalled ream rationing rafter quietism quatrefoil pulverized puli pule publican pterosaur psychodynamic protozoan prolate prohibitory professorial principate preserver presentment preposterous prefab pragmatism postilion possessing polemics poco playmate plasmacytoma plaquette phrygian phonograph philander peyote peptic pentad peek payoff patter patriotism pathogenic particulars paranoid parang paramountcy panchen palpation pagination overweight outright outgrowth offload octahedron obstetric obsolescence obscene nucleolar norroy nonlinearity noix nitroglycerin newsreel newest netter nem negotiator neglected neanderthal nausea nascent naos nanna naif mutton mullion mug motivating moron moralistic moonglow monochromatic mockingbird mistakenly militarism midgut microcosm metaphorical mesial merrythought melodious melanism meiosis medulla mea mastic manure mannerist mannerism mannequin manichaeism manger mains luxuria lur lorelei longbow loggia linnaean lifeline licorice libido libertine lettres lethargy lethality lavatory lapp lactose kulak kneading killjoy kickapoo kennel jurisdictional junto isopropyl isomerism inverter invading intervene intersect interjection insurgents inflationary induce indiscreet indic indentation inclination incantation impromptu impeach immurement immanence illusionist hyphen hydrous hydrographic hydrogenated humpback humidification humbug hosea holystone hireling hid hest herbivore hedonic hasty hardwood haddock gyroscope grub grilled greaser grantee godmother gobe glazer girt ghosty ghostly genitals generalize gelling gaup gash gable funiculus fulfilling fringes formality foregut forecaster follicle flowered flax firmly firework fib felon fearing fastball expired exciter exceed exalted estrange erroneous erebus equiangular engram encapsulated empowered eastwards eager durante dreamboat dodo divider divergent disorganized discotheque dilute diller dibble desperation desperado dermatosis depleted departing demoniac delicious defocus declare dauntless damped curium culverin cul cryptogenic cretin cranium courant counterinsurgency corollary corky copycat coppersmith confidant compensate commensurability colorless coining cling clapper circumambulation chez cheeseburger chambertin cavil causey catechism cartilaginous carabao capsular capello cantina cantando camshaft calligrapher buttonhole bullshit budding brushfire breadth brassy borealis bookbinding bookbinder bombshell bolter bolshevism blockage blinded blanking blackhead blab bipartisan binet bets betrothal benthic bedding beauties beatnik bazooka bathtub basically basalt bandage balcony balaclava badman athapaskan aster assign ascetic arbiter appoint anticipated anthropometry anoxic annulled angelico androgynous anchorman amyotrophic amide altruism allowances alienated aleut aground agglutination affix adversity adhere acrylic acrobatics accrued abed wynd wristwatch whitsun wetting wellhead wechsler weatherly weathered waterline watered warpath warbling wanga wahoo volans viz visualize vise vestigial vermis verifying unveiling unsuccessfully unprotected unmoved unhappy undisclosed undeveloped uncontested unconstitutional uncompetitive unaffiliated ukulele ugric typographer twofold tumble trucking trimeter trimer trigonal trawling travail trampoline tramontane tourniquet totalitarianism tincture timekeeper timbrel thrive thickening thickened tenement telecasting technetium tarpon tapioca synoptic suspicious sunfish subversive structuring stroll striving strictness strays stile stereotypic steamroller statuary stately staker squawk sprue springe spoiler spinous speedup speeding speeder soulless sou sociolinguistics snowmobile snafu smiling sinopia sinful signifying signet shifty sharply shahzada shackle sexualis sext sexologist serine semilunar selfishness selenite seagoing seacliff scrubbing scrimmage scepticism scentless scarcity savarin sarcophagus sanctorum saeta saboteur rump rubbing roundel rootstock rooming rill rifling ridiculous rheum reticulated retelling resupply repute reproduce rejoice reins redfin redan recumbent rectum rectangle reciting rdf rationalization rara radicalism quirk quintuple quantify qadi pung psychopathia proterozoic proserpine progressively pretext predictor predicament pothole potent populist polytheistic plunge plumed plagued piss pigmentation pickpocket phytoplankton phytogeography phantasmagoria persecuted perplexity peritonitis peppered pentobarbital pellicle peacemaking payer parquet parlay parasitism pandemonium paisano packager paced overriding oso oscillatory onomatopoeia novus nots nostra nonsectarian nightly nicotine neutralization naturist mutilated muck mote monotonic monomer mitomycin misrepresentation mintage minimally mined methamphetamine merciful menagerie meerkat medially mechanician meaty maundy matrimonial matriarch marshland marmalade manobo malevolence malarkey lucretius lozenge losers lld literate lightness lieutenancy licked lettering legation lard laburnum knobkerrie kine keno jughead jodhpurs itinerant isometric isolde irritability irregularly invoke intrathecal interventor innermost inhabitation ingleside ineligible inducer individualist indispensable incompatibility incision ignorant hymnography hymnody huntsman hundredth humdrum huddle hothouse hopscotch honeypot homeostasis hombre hokey hoist hillbilly hiatal herbicide heirloom heinie handrail handicraft handicaps hairpin hacksaw gyron gusty guidon guarantor greasy grandparent grampa gondolier gluttony glottalization genitalia galloping furrow functionally fricative formidable footprints folie flatfoot flanks flagellum fins fingersmith finery fillet ffvs farmstead eyrie eyeless extremists exercising exemplary epistolary enyo entrust entrainment entombment enshrined enormous enlil enclosing embarras elrod ecumenism eakins dribble dragoman downy doughty dominoes dominating doge disturb disenfranchisement discredited discoloration disastrous directeur diminuendo dilated diarist demonic defer dazzler dangling crowbar crasis counterweight costumed cornice corgi conundrum contusion continual contentious constantly confirm concatenated compensator commonplace commencing combustible coffeehouse coercion cockade cluck cloudy cloudland cloudburst clef clairette circumference cilia chummy chiller chignon chatter chardonnay changeling chamfered chagres cenozoic cecum cavy cautionary carat caput capriccio canceling caelum bushing burl bullwhip bronchitis brokenhearted broiler brainstorm brac bovid bookkeeping blustery bludgeon bloodhound blooded blockhouse bleaching blasphemous bivalent bipartite binocular bicycling bibliographer bawbee bashkir barnstormer barf backside awl autre aural attaining atlantean athanasia assert ashen argand archduchess archbishopric append antiseptic antaeus answering amputation amicable alpen aleck aileron aerobatics adventurous adsorption adore accomplishment accelerate absorb abolishment yellowish wrinkly wrangler withdraw winnings wiesner whitechapel whippet vileness vex verd vegetative valet vajrayana urethra upheaval unwed unsung unsorted unruly unproven unforgiving undress undivided underside underpinnings uncovered unborn unanswered unanimously unaccompanied ulcerative turban tuberous triplex tricked transposed torturer tortilla toothpick toboggan tilted thyme thunderstruck thump theosophist textualism tetroxide tetrarch tenderloin taxed taw tartar tangled tangential tainted tadpoles syringe syne swirling surrogate superseding superhuman sunless suing stratified stooge stellarator steadfastness stargazer sputnik splat spirited spiced spellbound speculator sorter sordid sooner solemnity sociality smog slump slowing skit skillet skiffle sketchbook skein sirocco siphoning signatory siderosis shortfall shivers shipment shamanic shadowgraph shackled seq sedentary secessionist scorn scaring sawmill satchel salmonella saliva rustle rooftop roentgen riptide ripening rhinestone reticulate retardation responsory reputedly reprimand relaxed relax rejects rectifiable recreated reassembly reappraisal rayon ravenous rations rationalism rapidity ramrod raker rainstorm radiocommunication quixotic quid quickness quell quasar quadric qua pyrotechnic pyogenic purl punitive psych pruning provoked prosecute propulsive prompted prohibit principia presumption precognition pouring postponement portraying portcullis pooka polonaise polarizing pointless pint photoplay peseta permitting permeable perish pergola perfumed percussive peephole paving pause pauper parochialism pacifism oxalate ovum overlayer outlandish otolaryngology otherworld ostracism osteopathy orthogonality orgy optimus optimistic oppressed operant opacity oft offbeat oceanid oblation nuclide novena noonday nogai noddy nimble nigh nifty niacin nestle neckline necklace navigate narcotic nabu mythopoetic myology mutated musca muong mundane moulder morally monstrosity monocle mitigate misdemeanor miscarriage mildly midshipman michaelmas mew meursault melted matchless mastectomy maryknoll martyrology marquisate marimba mannered manipulated mangle mailer magnification lyricism luscious loopy livonian lippi lintel linnet layman landlord lancing lamia ladybird labyrinthine laborers khasi kaas juveniles juggler jarring irreconcilable intricate internist inferential infect ineffective incumbency incredibly inchoative inadequacy imperator idiophone ideally ichthyologist iced icebox hypnotism hyena hydrated humanized houseman hooray honeysuckle homonuclear holmium hippocampus hindsight hideaway hesitation helpful helminth heartthrob hearth headward headman haver gyp gusto gummy grievous gratuitous graphically gossamer golconda globus glasshouse gladden girth gestation gentian genotype geist gawain gasconade garamond gallic functionary fulfillment frutti froth frosting frontiersman frills frankly fortnightly formic foreland fontina flowerpot florists flatulence flatness fishtail fingered fief fawn fallback facula eyelids extragalactic expendable estrangement esterase erode equerry epidermal ensuing ensor enlarge enema endocrinology elongation electing eidolon egoism effluent eeg edifying edger eczema eclair eastland ducking drugstore downwards dotty doped dodecagonal disqualified disillusionment disequilibrium discriminatory discontent disallowance dionysos dilate desensitized derivational denture delete deism debatable dearth dalai cur cupboard culvert cultus cruciferous crevasse crestfallen cramp coulee cosmonaut cosa corpuscular corny coppery copperhead contracture contraceptive contemplative contagious consolidate conquistador compulsive compressible compelled communization commonality coils cockspur coalescence circumvention cinders christology chilly chickadee chapeau cervix centrally catheter catalpa cashier caraway canvass canker busty bureaucratic bumpy bullfinch bugging bubbling bronchial broach brindisi brawling brakeman bowline bountiful bough bottling bookmaker blower blockbuster bloat blinds blanch bigamy bicameral believing banzai balsa ballistics backpack backer babble azimuthal autoeroticism astonishing assimilated aspasia asco arbitrariness apperception antipodes antecedent aniline angled anchovy anatomist analeptic amok amidst amerind altmann alerting aidoneus agnus aggravation admixture adjust adduct acquitted acolyte accumulator accountable accomplish abnormality yucca yarns worsening workbench wolfish woe woden wiped wingman whirlpool weightlifter washed wanton wain waif wagering virtuous vino vingt villager vertebra vayu vagrancy usury unreal unmeasured unloading undercarriage unabridged tub trowel trooper troika tricolor triangulation trending transonic transitory tots titty tippet tidy thrift thiosulfate thalamus tetrafluoroethylene terran tenet tending tendai tempera teaser taunt tartarus tares taming tamandua tallow symbolist swoon swineherd swill swearing suspend supple superpatriot superiors sulfite sugarplum suffragette succulent subversion subsidence subjectivity stumpy strung stringent streetwise strathspey stranglehold straddle stowage stipulated stimulated squirt squeak springboard spoilt sphericity specter speckle speakeasy soybeans sourdough sorghum solvency sneaky smear slotted sleuth skipjack sisyphus simmering sigil shred servomotor serrated sequitur seniority seditious seaward seamstress scythe scylla scurrilous schuller schopenhauer schooled scheiner sceptical scepter savory sapping sanctum salesperson safeguard rostrum rondeau rime rightful rhetorician returnee resuscitation resonances resistive religieuse rehearsed referent reductive recycle reappearance rascal rapping randomly ramble raki quicken quantifying quakerism punish pulsating psychodynamics prophylaxis prohibitive prohibitionist prohibiting profane procurator prized priming prim preempt preeminent precautionary praising postulated ponceau pollyanna poacher poached plausible plaiting pinot pinna pilate picquet physic phonic philistine petticoat petrified pervasive perpetuity perfumer pensive penitential peepers peasantry paternoster parthenope parthenogenesis panelist pandura palooka outcrop outbreeding outboard ordinarily onshore oloron oculist octoroon occupant nudist nonetheless nominate nisi neurosurgery nettle neophyte nativism narrowly naphthalene musketoon muses mucus monotheist mongolic monceau molt molossus modulator modernized mitigating mississippian miserable mirroring minuet militancy midden midbrain micronesian microfilm methanol messy melchizedek medaille matrons manzanilla manliness manipulate maneuvering malignancy maire machiavelli lydian lunacy luminescence lucrative luciferase longboat lithographer lithograph lipoprotein lickerish lessee lenten legislate latitudes latch lande kurbash knocks kneel knave kipp kidding justify juror juridical jubilant jointer jeweler irenicism involution intrigues intervening interplay interlocked interfere insurrectionist insult insignificance initiator inhale inhabitant ingestion ingenuity inflated infallibilism inebriate inductee indefinitely incineration inarticulate imposition imply implicated impalement imagining ignored hyoid hydroponics humpy hospitalization hoodoo hoary hoagy hippodrome hint hexahedron hexadecimal heredity hellbender headphone hatter harleian haploid halting haeckel gunnery guidebook guenon grocer greet greasepaint graver gratitude grana glyph glowworm glottal glazed gizmo git gigolo geocentric gelatin gaulish garnish garnered galvanize futhark furthering fulani fruiting frugality fronting fraidy fragmentary formalist forgiven forelock foiled fishy fetlock fetishism feldspar falciform faint facsimile extramarital exterminator extensibility expose exclude eventful evaluator eunuch ethic etch errata eon envisioned encomium enchantment encamp emphasized emphasize embraced elongate elegantly eland elaborated echoing earwig dystopia dusting duppy dully druid dresser drained dragster dowse doubting doubled dorsum ditto displeased disperse diseased discreet discord discharging disadvantaged dionysus deter depressed deported denying denunciation denier demotion delphinium dehydration deference decommission debunking debacle dangerously cytoplasm cygne cutlery cusp curiously cubby crossword crippled cringer criminality couplet counteroffensive coulommiers convexity controllability consequent connotation connoisseur conjoined conifers conifer congreve confessional concordat comus colonnade collaborate cohort cogent cochlea cobble clumsy cloverleaf cleared clap circumstantial ciliate chthonic christmastime chowder chorister chiliarch chequered checkers changer certainly celesta cauliflower cathodic cascading carpal carnivore carcass caracara capitalistic caloric callus calando caduceus cabby cabal buzzer butane bushwhacker buoyancy brownstone breeks booming booked bolster bolero boatswain bluebell bled bistro biomechanics bini betacism beneficence bellman bedlington beaker beacons battler battleground barreled bananas backwash backlog aweigh autochthon auscultation atrophic atomism asymmetrical asshole aspiring aspire asparagus asceticism archway archdeaconry arcadian araucanian aqualung approving antipodean antics antiaircraft anodyne animus angst amputee americium americanism ambit ambergris amaurosis almonds alewife airburst agnosticism agility affectionately aeacus adequacy adamant acutance acknowledge accomplice acclamation abrasive abatement zing zemi zapped yawl yakut xebec worshipful woodblock wished willet wiggler whizzer welder webley waving watchword wassail wallflower voucher vom volstead voix vize vivarium vivacious vielle viator vesicular vegetal vag vacated utilize unsuspected unsatisfied uninterrupted unify unidirectional unearned unbeaten ump tyke tsetse tryst trypan trumps tromba trolling tricolored triaxial triatriatum tremulous tremolo trembles transmissible towner touristic toning tonicity tomcat toil titleholder tippler tinged timbre thunderbolts thoth theriac therein theocracy thaw tethered terminate tenoroon teamster teak taxidermy tattler tater tassie tackling syncopated swallowing surrendered surprising surely suppressor sunroom successively subnormal submitting sublimation storekeeper stoppage stonemason startle stabilized squatter sprezzatura sprawl sporty sporadically splurge splashy splanchnic spheroid speechless southwards sordo soothsayer sojourner sojourn softer snug snowcap snotty snot snoring slur sloping slicer slag skelter siphon silverware silencing signalman shimmy shekel sequin seesaw secor seawall scullion scrapper scour schoolteacher schmuck schizo scat sanding sandbank salutations salpinx sagacity sacrificing sacking sabbatical ruat ripped rhymer revolve revisit revels reveille retire responder resilient reservist reproduced renter remedial rejoining regrets refusing refill redemptive redaction recount rebroadcast rebellious reassessment radix radiometry radiating quits quisling quietly pythian pursuer pundit psychophysical psychologism psycholinguistics protruding protesting promethium proletariat profitable professed prittle preservative prepayment premonstratensian pousse posturing postnatal posada populace pooch polygraph polyconic pleiad platonic plankton pizzeria piscina pincher pillbox pickling phoney phlox philosophic perverted perfecta pentavalent pennies peerless pauvre patroness patristic parsonage parlance parishioners parched pallidus padlock pachyderm oxyacid overturn overloaded ophicleide operon onstage onomastics onomasticon obliteration obliged objet oas nymphet nuisance nudum northerly nonviolence nicely nay navarch narthex myopia muster mulatto muddle mru mossberg morose morbidity mooch momentary molehill moldy mohair modiste mnemosyne mistrial misguided mischief mindfulness millet midstream midday micronucleus metatarsal menstruation melodist matchmaker margarine marauding mantel manipulating mandrill mamma majordomo magnesia mackle macadamia lunchroom lowing lout lorgnette looped longcloth loaves lithosphere litany linsey liminal liking leprosy leaflets lazuli laxative lawman lavage laughs langue lamentation lactiferous lacquer kurma kunama kreuznach knotty kneeling knack kitchenware kirtle kinsman kingbird kilo khamsin justitia joust jinks jehu jawbone jaded intuitionism interviewer interrelated intern intermedium interline insatiable infrequently infidel incapacity inbound impractical importer iban hyperactive humongous humming housekeeper horsemanship horrific hoopoe hieroglyphics hg hermeneutics hep helter hastily hardboard hangar hajji haft gymnosperms guillemot gritty grabber gouge golgi glances geniculate generality gemsbok gauze garron gaea fundamentally fuddy fructose frontispiece freudian freshness freewheel franchised fragmented fount fortnight forsaken formalization forgetting forfeit forehand forbid foodstuffs fontainebleau folia flourishing floored flitch flanked fireproof filings fetter fenced feiner federative fazed familiaris fairing extensional exertion excision evidential euryale esse equilateral equate episcopalian endearment emphatic emcee elusive elopement electrostatics electrodeless eec ebb earthling earthenware earless dysautonomia duodenal duffel dripping dregs dolittle doberman dither distort disproportionate disorderly disgorge discouraged discoid dipping dictated dichromate diatonic dialectical diagnose dewdrops devastating deranged depopulation dendrite deme delimited delightful delacroix degas defy definitely decorum deceived deathblow darb cystitis cutback curfew crossness cribbage cress crambo crafting crafted crabby coven countering coulomb costly corpuscle cordiale corbeau copsewood copperplate controversialist contrition contrastive continuo consecutively conceptually conceptualization concealed conceal compress compost compos compensated communicable commingling commandeering colure columbine collusive colliding collation coinciding cognomen codicil clipped clicking clematis cinch chromite chlorate chloral cheval charwoman characteristically chandi cess caudle catches catarrhal cartman cardiology capitulary canvassing canuck cantilever campine calcification calabash caesarean cachet bunsen bungalow buds brotherly broadening breathtaking brassard brainwave bradstreet bows bouncy bookworm bolus bogeyman bluenose blowpipe bloomery bloods bloodless biting bilge bildungsroman bighead biconjugate biannual betray bangs baluster ballyhoo aztecan azazel avestan autumnal austerity attractiveness attaching atropos atherosclerosis asymptote astrolabe ascend arioso argon arginine arbela appropriately appeasement apnea antisubmarine animism anima angiosperms anemic amiable ambry ambassadorial alopecia alexandrite alentejo affusion afford aerials adjectival actinic ack acetic abyssal abridge abomination ================================================ FILE: harper-tree-sitter/Cargo.toml ================================================ [package] name = "harper-tree-sitter" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } tree-sitter = "0.25.10" ================================================ FILE: harper-tree-sitter/src/lib.rs ================================================ use std::collections::HashSet; use harper_core::spell::MutableDictionary; use harper_core::{DictWordMetadata, Mask, Masker, Span}; use tree_sitter::{Language, Node, Tree, TreeCursor}; /// A Harper [`Masker`] that wraps a given tree-sitter language and a condition, /// allowing you to selectively parse only specific tree-sitter nodes. pub struct TreeSitterMasker { language: Language, node_condition: fn(&Node) -> bool, } impl TreeSitterMasker { pub fn new(language: Language, node_condition: fn(&Node) -> bool) -> Self { Self { language, node_condition, } } fn parse_root(&self, text: &str) -> Option { let mut parser = tree_sitter::Parser::new(); parser.set_language(&self.language).unwrap(); // TODO: Use incremental parsing parser.parse(text, None) } pub fn create_ident_dict(&self, source: &[char]) -> Option { let text: String = source.iter().collect(); // Byte-indexed let mut ident_spans = Vec::new(); let tree = self.parse_root(&text)?; Self::visit_nodes(&mut tree.walk(), &mut |node: &Node| { if node.child_count() == 0 && node.kind().contains("ident") { ident_spans.push(node.byte_range().into()) } }); let ident_spans = byte_spans_to_char_spans(ident_spans, &text); let mut idents = HashSet::new(); for span in ident_spans { idents.insert(span.get_content(source)); } let idents: Vec<_> = idents .into_iter() .map(|ident| (ident, DictWordMetadata::default())) .collect(); let mut dictionary = MutableDictionary::new(); dictionary.extend_words(idents); Some(dictionary) } /// Visits the children of a TreeSitter node, searching for comments. /// /// Returns the BYTE spans of the comment position. fn extract_comments(&self, cursor: &mut TreeCursor, comments: &mut Vec>) { Self::visit_nodes(cursor, &mut |node: &Node| { if (self.node_condition)(node) { comments.push(node.byte_range().into()); } }); } fn visit_nodes(cursor: &mut TreeCursor, visit: &mut impl FnMut(&Node)) { if !cursor.goto_first_child() { return; } loop { let node = cursor.node(); visit(&node); Self::visit_nodes(cursor, visit); if !cursor.goto_next_sibling() { break; } } cursor.goto_parent(); } } impl Masker for TreeSitterMasker { fn create_mask(&self, source: &[char]) -> Mask { let text: String = source.iter().collect(); let Some(root) = self.parse_root(&text) else { return Mask::new_blank(); }; let mut comments_spans = Vec::new(); self.extract_comments(&mut root.walk(), &mut comments_spans); let comments_spans = byte_spans_to_char_spans(comments_spans, &text); let mut mask = Mask::new_blank(); for span in comments_spans { mask.push_allowed(span); } mask.merge_whitespace_sep(source); mask } } /// Converts a set of byte-indexed [`Span`]s to char-index Spans and returns them. /// NOTE: Will sort the given slice by their [`Span::start`]. /// /// If any spans overlap, it will merge them. fn byte_spans_to_char_spans(mut byte_spans: Vec>, source: &str) -> Vec> { byte_spans.sort_unstable_by_key(|s| s.start); // merge overlapping spans let mut spans = Vec::with_capacity(byte_spans.len()); for span in byte_spans { match spans.last_mut() { Some(last) if !span.overlaps_with(*last) => spans.push(span), Some(last) => { // ranges overlap, we can merge them last.end = span.end; } None => spans.push(span), } } // Convert byte spans to char spans. spans .iter() .scan((0, 0), |(last_byte_pos, last_char_pos), span| { let byte_span = *span; *last_char_pos += source[*last_byte_pos..byte_span.start].chars().count(); let start = *last_char_pos; *last_char_pos += source[byte_span.start..byte_span.end].chars().count(); let end = *last_char_pos; *last_byte_pos = byte_span.end; Some(Span::new(start, end)) }) .collect() } ================================================ FILE: harper-typst/Cargo.toml ================================================ [package] name = "harper-typst" version = "1.12.0" edition = "2024" description = "The language checker for developers." license = "Apache-2.0" repository = "https://github.com/automattic/harper" [dependencies] harper-core = { path = "../harper-core", version = "1.0.0" } typst-syntax = { version = "0.14.2" } ordered-float = { version = "5.1.0", features = ["serde"] } itertools = "0.14.0" paste = "1.0.14" ================================================ FILE: harper-typst/src/lib.rs ================================================ mod offset_cursor; mod typst_translator; use typst_translator::TypstTranslator; use harper_core::{Token, parsers::Parser}; use itertools::Itertools; use typst_syntax::{ Source, SyntaxNode, ast::{AstNode, Expr, Markup}, }; /// A parser that wraps Harper's `PlainEnglish` parser allowing one to ingest Typst files. pub struct Typst; impl Parser for Typst { fn parse(&self, source: &[char]) -> Vec { let source_str: String = source.iter().collect(); // Transform the source into an AST through the `typst_syntax` crate let typst_document = Source::detached(source_str); let typst_tree = Markup::from_untyped(typst_document.root()) .expect("Unable to create typst document from parsed tree!"); // Recurse through AST to create tokens let parse_helper = TypstTranslator::new(&typst_document); let mut buf = Vec::new(); let exprs = typst_tree.exprs().collect_vec(); let exprs = convert_parbreaks(&mut buf, &exprs); parse_helper.parse_exprs(&exprs) } } /// Converts newlines after certain elements to paragraph breaks /// This is accomplished here instead of in the translating module because at this point there is /// still semantic information associated with the elements. /// /// Newlines are separate expressions in the parse tree (as the Space variant) fn convert_parbreaks<'a>(buf: &'a mut Vec, exprs: &'a [Expr]) -> Vec> { // Owned collection of nodes forcibly casted to paragraph breaks *buf = exprs .iter() .map(|e| { let mut node = SyntaxNode::placeholder(typst_syntax::SyntaxKind::Parbreak); node.synthesize(e.span()); node }) .collect_vec(); let should_parbreak = |e1, e2, e3| { matches!(e2, Expr::Space(_)) && (matches!(e1, Expr::Heading(_) | Expr::ListItem(_)) || matches!(e3, Expr::Heading(_) | Expr::ListItem(_))) }; let mut res: Vec = Vec::new(); let mut last_element: Option = None; for ((i, expr), (_, next_expr)) in exprs.iter().enumerate().tuple_windows() { let mut current_expr = *expr; if let Some(last_element) = last_element && should_parbreak(last_element, *expr, *next_expr) { let pbreak = typst_syntax::ast::Parbreak::from_untyped(&buf[i]) .expect("Unable to convert expression to Parbreak"); current_expr = Expr::Parbreak(pbreak); } res.push(current_expr); last_element = Some(*expr) } // Push last element because it will be excluded by tuple_windows() above if let Some(last) = exprs.iter().last() { res.push(*last); } res } #[cfg(test)] mod tests { use super::*; use harper_core::parsers::StrParser; #[test] fn issue_1898() { Typst.parse_str("#for "); Typst.parse_str("#(.$#$$$. "); Typst.parse_str("=#{m\"\".'m\"\"#p#"); } } ================================================ FILE: harper-typst/src/offset_cursor.rs ================================================ use typst_syntax::Source; /// Encapsulation of the translation between byte-based spans and char-based spans. This is used to /// avoid recomputing the number of characters between the beginning of the file and the current /// byte since `typst_syntax` uses byte spans while we use char spans. #[derive(Debug, Clone, Copy)] pub struct OffsetCursor<'a> { doc: &'a Source, pub char: usize, pub byte: usize, } impl<'a> OffsetCursor<'a> { pub fn new(doc: &'a Source) -> Self { Self { doc, char: 0, byte: 0, } } /// Returns a new [`OffsetCursor`] at the given byte based on the current cursor. pub fn push_to(self, new_byte: usize) -> Option { assert!(new_byte >= self.byte); if new_byte == self.byte { return Some(self); } Some(Self { char: self.char + self.doc.text().get(self.byte..new_byte)?.chars().count(), byte: new_byte, ..self }) } /// Returns a new [`OffsetCursor`] at the beginning of the given [`typst_syntax::Span`] based /// on the current cursor. pub fn push_to_span(self, span: typst_syntax::Span) -> Option { let new_byte = self.doc.range(span)?.start; self.push_to(new_byte) } } ================================================ FILE: harper-typst/src/typst_translator.rs ================================================ use crate::offset_cursor::OffsetCursor; use harper_core::{ Punctuation, Token, TokenKind, parsers::{PlainEnglish, StrParser}, }; use itertools::Itertools; use typst_syntax::{ Source, ast::{ Arg, ArrayItem, AstNode, DestructuringItem, DictItem, Expr, FuncCall, Ident, LetBindingKind, Param, Pattern, Spread, }, }; /// Directly translate a span ($a) in a Typst source ($doc) to a token. macro_rules! def_token { ($doc:expr, $a:expr, $kind:expr, $offset:ident) => {{ let range = $doc.range($a.span())?; let start = $offset.push_to(range.start)?; let end_char_loc = start.push_to(range.end)?.char; Some(vec![Token { span: harper_core::Span::new(start.char, end_char_loc), kind: $kind, }]) }}; } /// Combine the results of multiple parsing calls. macro_rules! merge { [$($inner:expr),*] => { Some( [$($inner),*] .into_iter() .flatten() .flatten() .collect_vec(), ) }; } /// Contains values used in parsing so they don't have to be passed around so much. #[derive(Clone, Copy)] pub struct TypstTranslator<'a> { doc: &'a Source, } impl<'a> TypstTranslator<'a> { pub fn new(doc: &'a Source) -> Self { Self { doc } } pub fn parse_exprs(self, exprs: &[Expr]) -> Vec { let base_offset = OffsetCursor::new(self.doc); let mut tokens = Vec::new(); let mut index = 0; while index < exprs.len() { // Treat Text + apostrophe + Text as a single contraction token stream. if let Some((mut parsed, consumed)) = self.parse_contraction(exprs, index) { tokens.append(&mut parsed); index += consumed; continue; } if let Some(mut parsed) = self.parse_expr(exprs[index], base_offset) { tokens.append(&mut parsed); } index += 1; } tokens } fn parse_contraction(self, exprs: &[Expr], index: usize) -> Option<(Vec, usize)> { let exprs = exprs.get(index..index + 3)?; let [expr1, expr2, expr3] = exprs else { return None; }; let (Expr::Text(left), Expr::SmartQuote(quote), Expr::Text(right)) = (*expr1, *expr2, *expr3) else { return None; }; if quote.double() { return None; } let left_char = left.get().chars().last()?; let right_char = right.get().chars().next()?; if !left_char.is_alphabetic() || !right_char.is_alphabetic() { return None; } let left_range = self.doc.range(left.span())?; let quote_range = self.doc.range(quote.span())?; let right_range = self.doc.range(right.span())?; if left_range.end != quote_range.start || quote_range.end != right_range.start { return None; } let joined = self.doc.text().get(left_range.start..right_range.end)?; let offset = OffsetCursor::new(self.doc).push_to_span(left.span())?; let parsed = self.parse_english(joined, offset)?; Some((parsed, 3)) } /// Use the [`PlainEnglish`] parser to parse plain text from a Typst expression. fn parse_english(self, str: impl Into, offset: OffsetCursor) -> Option> { Some( PlainEnglish .parse_str(str.into()) .into_iter() .map(|mut t| { t.span.push_by(offset.char); t }) .collect_vec(), ) } /// Parse a pattern, one of the elements of Typst syntax fn parse_pattern(self, pat: Pattern, offset: OffsetCursor) -> Option> { /// Simplification of [`def_token!`] that bakes-in local variables macro_rules! token { ($a:expr, $kind:expr) => { def_token!(self.doc, $a, $kind, offset) }; } match pat { Pattern::Normal(expr) => self.parse_expr(expr, offset), Pattern::Placeholder(underscore) => token!(underscore, TokenKind::Unlintable), Pattern::Parenthesized(parenthesized) => merge![ self.parse_expr(parenthesized.expr(), offset), self.parse_pattern(parenthesized.pattern(), offset) ], Pattern::Destructuring(destructuring) => Some( destructuring .items() .filter_map(|item| match item { DestructuringItem::Pattern(pattern) => self.parse_pattern(pattern, offset), DestructuringItem::Named(named) => merge![ token!(named.name(), TokenKind::Word(None)), self.parse_pattern(named.pattern(), offset) ], DestructuringItem::Spread(spread) => merge![ spread .sink_ident() .and_then(|ident| self.parse_ident(ident, offset)), spread .sink_expr() .and_then(|expr| self.parse_expr(expr, offset)) ], }) .flatten() .collect(), ), } } /// Convenience wrapper of [`Self::parse_expr`] that packages the identifier as an expression fn parse_ident(self, ident: Ident, offset: OffsetCursor) -> Option> { self.parse_expr(Expr::Ident(ident), offset) } /// Do not use for spreads contained in DestructuringItem fn parse_spread(self, spread: Spread, offset: OffsetCursor) -> Option> { merge![ self.parse_expr(spread.expr(), offset), spread .sink_ident() .and_then(|ident| self.parse_ident(ident, offset)) ] } pub fn parse_expr(self, expr: Expr, offset: OffsetCursor) -> Option> { // Update the offset that will be passed to other functions by moving it to the beginning // of the current expression's span. let offset = offset.push_to_span(expr.span())?; /// Simplification of [`def_token!`] that bakes-in local variables macro_rules! token { ($a:expr, $kind:expr) => { def_token!(self.doc, $a, $kind, offset) }; } /// Quickly recurse without needing to pass in local variables. /// Matches both single and many expressions. macro_rules! recurse { ($inner:expr) => { self.parse_expr($inner, offset) }; ($($inner:expr),+) => { merge![ $(recurse!($inner)),* ] }; } macro_rules! get_text { ($expr:expr) => { self.doc .text() .get(self.doc.range($expr.span())?) .expect("Unable to get text from typst document span!") }; } fn parbreak(pos: usize) -> Option> { Some(vec![Token { span: harper_core::Span::empty(pos), kind: TokenKind::ParagraphBreak, }]) } fn isolate(inner: Option>) -> Option> { let start = inner.as_ref()?.first().map_or(0, |token| token.span.start); let end = inner.as_ref()?.last().map_or(0, |token| token.span.end); merge![parbreak(start), inner, parbreak(end)] } // Recurse on each element of an iterator let iter_recurse = |exprs: &mut dyn Iterator| { let mut buf = Vec::new(); let exprs = exprs.collect_vec(); let exprs = super::convert_parbreaks(&mut buf, &exprs); Some( exprs .into_iter() .filter_map(|e| recurse!(e)) .flatten() .collect_vec(), ) }; // Parse the parameters of a function or closure let parse_params = |params: &mut dyn Iterator| { Some( params .filter_map(|p| match p { Param::Pos(pattern) => self.parse_pattern(pattern, offset), Param::Named(named) => merge![ self.parse_ident(named.name(), offset), recurse!(named.expr()) ], Param::Spread(spread) => self.parse_spread(spread, offset), }) .flatten() .collect_vec(), ) }; // Parse the arguments passed to a function or closure call let parse_args = |params: &mut dyn Iterator| { Some( params .filter_map(|a| match a { Arg::Pos(expr) => recurse!(expr), Arg::Named(named) => merge![ self.parse_ident(named.name(), offset), recurse!(named.expr()) ], Arg::Spread(spread) => self.parse_spread(spread, offset), }) .flatten() .collect_vec(), ) }; // Parse a function call let parse_func_call = |func: FuncCall| { let parse_args_ignored = |ignore_pos: bool, ignore_nameds: &[&str]| { let (dead, alive): (Vec<_>, Vec<_>) = func.args().items().partition(|a| match a { Arg::Pos(_) => ignore_pos, Arg::Named(named) => ignore_nameds.contains(&named.name().as_str()), Arg::Spread(_) => false, }); Some( dead.iter() .flat_map(|a| token!(a, TokenKind::Unlintable)) .chain(parse_args(&mut alive.into_iter())) .flatten() .collect_vec(), ) }; let text = get_text!(func.callee()); merge![ token!(func.callee(), TokenKind::Unlintable), match text { "std.rgb" | "color.rgb" | "rgb" => parse_args_ignored(true, &[]), "std.plugin" | "plugin" => parse_args_ignored(true, &[]), "std.bibliography" | "bibliography" => parse_args_ignored(true, &["style"]), "std.cite" | "cite" => parse_args_ignored(true, &["style"]), "std.raw" | "raw" => parse_args_ignored(false, &["syntaxes", "theme"]), "std.image" | "image" => parse_args_ignored(true, &[]), "std.regex" | "regex" => parse_args_ignored(true, &[]), _ if text.ends_with(".display") => parse_args_ignored(true, &[]), _ => parse_args(&mut func.args().items()), } ] }; // Delegate parsing based on the kind of Typst expression. // Not all expression kinds have defined behavior, so the default behavior is // an [`harper_core::TokenKind::Unlintable`] token. // // A full list of variants is available in the [typst_syntax docs](https://docs.rs/typst/latest/typst/syntax/ast/enum.Expr.html) match expr { Expr::Text(text) => self.parse_english(text.get(), offset.push_to_span(text.span())?), Expr::Space(a) => { let mut chars = get_text!(a).chars(); let first_char = chars.next().unwrap(); let length = chars.count() + 1; if first_char == '\n' { token!(a, TokenKind::Newline(1)) } else { token!(a, TokenKind::Space(length)) } } Expr::Linebreak(a) => token!(a, TokenKind::Newline(1)), Expr::Parbreak(a) => token!(a, TokenKind::ParagraphBreak), Expr::SmartQuote(quote) => { if quote.double() { token!( quote, TokenKind::Punctuation(Punctuation::Quote(harper_core::Quote { twin_loc: None })) ) } else { token!(quote, TokenKind::Punctuation(Punctuation::Apostrophe)) } } Expr::Strong(strong) => iter_recurse(&mut strong.body().exprs()), Expr::Emph(emph) => iter_recurse(&mut emph.body().exprs()), Expr::Link(a) => token!(a, TokenKind::Url), Expr::Heading(heading) => iter_recurse(&mut heading.body().exprs()), Expr::ListItem(list_item) => iter_recurse(&mut list_item.body().exprs()), Expr::EnumItem(enum_item) => iter_recurse(&mut enum_item.body().exprs()), Expr::TermItem(term_item) => iter_recurse( &mut term_item .term() .exprs() .chain(term_item.description().exprs()), ), Expr::Str(text) => { let offset = offset.push_to_span(text.span())?.char + 1; let string = text.to_untyped().text(); Some( PlainEnglish .parse_str(&string[1..string.len() - 1]) .into_iter() .map(|mut t| { t.span.push_by(offset); t }) .collect_vec(), ) } Expr::ContentBlock(content_block) => { isolate(iter_recurse(&mut content_block.body().exprs())) } Expr::Parenthesized(parenthesized) => recurse!(parenthesized.expr()), Expr::Array(array) => Some( array .items() .filter_map(|i| { if let ArrayItem::Pos(e) = i { recurse!(e) } else { None } }) .flatten() .collect_vec(), ), Expr::Dict(dict) => Some( dict.items() .filter_map(|di| match di { DictItem::Named(named) => { merge![ self.parse_ident(named.name(), offset), recurse!(named.expr()) ] } DictItem::Keyed(keyed) => recurse!(keyed.key(), keyed.expr()), DictItem::Spread(spread) => self.parse_spread(spread, offset), }) .flatten() .collect_vec(), ), Expr::FieldAccess(field_access) => merge![ recurse!(field_access.target()), token!(field_access.field(), TokenKind::Word(None)) ], Expr::LetBinding(let_binding) => merge![ match let_binding.kind() { LetBindingKind::Normal(pattern) => self.parse_pattern(pattern, offset), LetBindingKind::Closure(ident) => self.parse_ident(ident, offset), }, let_binding.init().and_then(|e| recurse!(e)) ], Expr::DestructAssignment(destruct_assignment) => { recurse!(destruct_assignment.value()) } Expr::SetRule(set_rule) => merge![ recurse!(set_rule.target()), set_rule.condition().and_then(|expr| recurse!(expr)), parse_args(&mut set_rule.args().items()) ], Expr::ShowRule(show_rule) => merge![ recurse!(show_rule.transform()), show_rule.selector().and_then(|expr| recurse!(expr)) ], Expr::Contextual(contextual) => recurse!(contextual.body()), Expr::Conditional(conditional) => merge![ recurse!(conditional.condition(), conditional.if_body()), conditional.else_body().and_then(|expr| recurse!(expr)) ], Expr::WhileLoop(while_loop) => recurse!(while_loop.condition(), while_loop.body()), Expr::ForLoop(for_loop) => recurse!(for_loop.iterable(), for_loop.body()), Expr::CodeBlock(code) => iter_recurse(&mut code.body().exprs()), Expr::Closure(closure) => merge![ closure .name() .and_then(|ident| self.parse_ident(ident, offset)), parse_params(&mut closure.params().children()), recurse!(closure.body()) ], Expr::FuncCall(func) => parse_func_call(func), a => token!(a, TokenKind::Unlintable), } } } #[cfg(test)] mod tests { use super::*; use typst_syntax::ast::None; #[test] fn parse_none_returns_none() { let source = Source::detached(""); let translator = TypstTranslator::new(&source); assert!( translator .parse_expr(Expr::None(None::default()), OffsetCursor::new(&source)) .is_none() ) } } ================================================ FILE: harper-typst/tests/run_tests.rs ================================================ use harper_core::linting::{LintGroup, Linter}; use harper_core::spell::FstDictionary; use harper_core::{Dialect, Document}; use harper_typst::Typst; /// Creates a unit test checking that the linting of a document in /// `tests_sources` produces the expected number of lints. macro_rules! create_test { ($filename:ident.$ext:ident, $correct_expected:expr) => { paste::paste! { #[test] fn [](){ let source = include_str!( concat!( "./test_sources/", concat!(stringify!($filename), ".", stringify!($ext)) ) ); let dict = FstDictionary::curated(); let document = Document::new(&source, &Typst, &dict); let mut linter = LintGroup::new_curated(dict, Dialect::American); let lints = linter.lint(&document); dbg!(&lints); assert_eq!(lints.len(), $correct_expected); // Make sure that all generated tokens span real characters for token in document.tokens(){ assert!(token.span.try_get_content(document.get_source()).is_some()); } } } }; } create_test!(complex_document.typ, 0); create_test!(simplified_document.typ, 0); create_test!(complex_document_with_spelling_mistakes.typ, 4); // create_test!(issue_399.typ, 3); create_test!(function_with_ignorable_args.typ, 9); create_test!(issue_1926.typ, 1); create_test!(contractions.typ, 0); ================================================ FILE: harper-typst/tests/test_sources/complex_document.typ ================================================ #set page( paper: "us-letter", columns: 2, ) #let titleblock( title: "Default Title", authors: ("Author 1", "Author 2"), abstract: [*This is content*], body, ) = { set document(date: none) set par(justify: true) set page( header: context { if counter(page).get().first() > 1 [ #counter(page).get().first() of #counter(page).final().at(0) #h(1fr) #title ] }, ) place( top + center, float: true, scope: "parent", clearance: 2em, )[ #align(center, text(17pt)[ *#title* ]) #let authors = authors.filter(x => x.len() > 0) #let count = authors.len() #let authors_slice = authors.slice(0, calc.min(count, 3)) _#if count > 3 { // et al. isn't parsed properly, but this isn't the fault of the Typst // parser // authors_slice.push("et al.") authors_slice.join(", ") } else { authors_slice.join(", ", last: ", and ") } _ #par(justify: false)[ *Abstract* \ #abstract ] ] body } #show: doc => [ #titleblock( title: "A fluid dynamic model for glacier flow", authors: ("Grant Lemons", "John Doe", "Jane Doe"), abstract: lorem(80), doc, ) ] = Introduction #lorem(300) = Related Work #lorem(200) ================================================ FILE: harper-typst/tests/test_sources/complex_document_with_spelling_mistakes.typ ================================================ #set page( paper: "us-letter", columns: 2, ) #let titleblock( title: "Defalt Title", authors: ("Author 1", "Author 2"), abstract: [*This is contnt*], body, ) = { set document(date: none) set par(justify: true) set page( header: context { if counter(page).get().first() > 1 [ #counter(page).get().first() of #counter(page).final().at(0) #h(1fr) #title ] }, ) place( top + center, float: true, scope: "parent", clearance: 2em, )[ #align(center, text(17pt)[ *#title* ]) #let authors = authors.filter(x => x.len() > 0) #let count = authors.len() #let authors_slice = authors.slice(0, calc.min(count, 3)) _#if count > 3 { // et al. isn't parsed properly, but this isn't the fault of the Typst // parser // authors_slice.push("et al.") authors_slice.join(", ") } else { authors_slice.join(", ", last: ", and ") } _ #par(justify: false)[ *Abstract* \ #abstract ] ] body } #show: doc => [ #titleblock( title: "A fluid dynamic model for glaier flow", authors: ("Grant Lemons", "John Doe", "Jane Doe"), abstract: lorem(80), doc, ) ] = Introduction #lorem(300) = Related ork #lorem(200) ================================================ FILE: harper-typst/tests/test_sources/contractions.typ ================================================ Typst used to have problems with contractions. Doesn't it still? ================================================ FILE: harper-typst/tests/test_sources/function_with_ignorable_args.typ ================================================ #rgb("ffffff") #plugin("../a.wasm") #bibliography(("../a.bib", "../b.bib"), style: "../c.csl", title: [Errorz]) #cite(style: "../a.csl", supplement: [Errorz]) #raw(syntaxes: ("../a", "../b"), theme: "../c", [Errorz]) #image("../a", caption: [Errorz]) #regex("(?i)") #std.rgb("ffffff") #color.rgb("ffffff") #std.plugin("../a.wasm") #std.bibliography(("../a.bib", "../b.bib"), style: "../c.csl", title: [Errorz]) #std.cite(style: "../a.csl", supplement: [Errorz]) #std.raw(syntaxes: ("../a", "../b"), theme: "../c", [Errorz]) #std.image("../a", caption: [Errorz]) #std.regex("(?i)") #datetime.today().display("y:[year repr:last_two]") #context counter(heading).display("i", both: [Errorz]) ================================================ FILE: harper-typst/tests/test_sources/issue_1926.typ ================================================ No No #table( columns: 2, [No], [No] ) ================================================ FILE: harper-typst/tests/test_sources/issue_399.typ ================================================ #problem[ 4. Find all the $x$ values where the following function is discontinuous. ] #solution[ $x=-2,0,3$ ] #aside[ at $x=-2$ jump discontinuity. at $x=0$ infinite discontinuity. at $x=3$ removable discontinuity. (can be removed via re-defining the domain to exclude that) ] ================================================ FILE: harper-typst/tests/test_sources/simplified_document.typ ================================================ #let template( title: "Default Title", authors: ("Author 1", "Author 2"), abstract: [*This is content*], body, ) = { set document(date: none) set par(justify: true) set page( paper: "us-letter", columns: 2, number-align: top, numbering: (..n) => if n.pos().first() > 1 { n.pos().map(str).join(" of ") + h(1fr) + title }, ) place( top + center, float: true, scope: "parent", clearance: 2em, )[ #text(17pt, strong(title)) #let authors-line = if authors.len() > 3 { // "et al." isn't parsed properly, but this isn't the fault of the Typst // parser. // authors-max3.push("et al.") authors => authors.join(", ") } else { authors => authors.join(", ", last: ", and ") } #emph(authors-line(authors.slice(0, calc.min(authors.len(), 3)))) #par(justify: false)[ *Abstract* \ #abstract ] ] body } #show: template.with( title: "A fluid dynamic model for glacier flow", authors: ("Grant Lemons", "John Doe", "Jane Doe"), abstract: lorem(80), ) = Introduction #lorem(300) = Related Work #lorem(200) ================================================ FILE: harper-typst/tests/tests.rs ================================================ use itertools::Itertools; use ordered_float::OrderedFloat; use harper_core::{DictWordMetadata, Document, NounData, Number, Punctuation, TokenKind}; use harper_typst::Typst; #[test] fn number() { let source = "12 is larger than 11, but much less than 11!"; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Number(Number { value: OrderedFloat(12.0), suffix: None, .. }), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Number(Number { value: OrderedFloat(11.0), suffix: None, .. }), TokenKind::Punctuation(Punctuation::Comma), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Word(_), TokenKind::Space(1), TokenKind::Number(Number { value: OrderedFloat(11.0), suffix: None, .. }), TokenKind::Punctuation(Punctuation::Bang), ] )) } #[test] fn math_unlintable() { let source = "$12 > 11$, $12 << 11!$"; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Unlintable, TokenKind::Punctuation(Punctuation::Comma), TokenKind::Space(1), TokenKind::Unlintable, ] )) } #[test] fn dict_parsing() { let source = r#"#let dict = ( name: "Typst", born: 2019, )"#; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); let charslice = source.chars().collect_vec(); let tokens = document.tokens().collect_vec(); assert_eq!(tokens[2].span.get_content_string(&charslice), "Typst"); assert!(matches!( token_kinds.as_slice(), &[ TokenKind::Unlintable, // dict TokenKind::Unlintable, // name (key 1) TokenKind::Word(_), // Typst (value 1) TokenKind::Unlintable, // born (key 2) TokenKind::Unlintable, // 2019 (value 2) ] )) } #[test] fn str_parsing() { let source = r#"#let ident = "This is a string""#; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); assert!(matches!( &token_kinds.as_slice(), &[ TokenKind::Unlintable, // ident TokenKind::Word(_), // This TokenKind::Space(1), // TokenKind::Word(_), // is TokenKind::Space(1), // TokenKind::Word(_), // a TokenKind::Space(1), // TokenKind::Word(_), // string ] )) } #[test] fn non_adjacent_spaces_not_condensed() { let source = r#"#authors_slice.join(", ", last: ", and ") bob"#; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); assert!(matches!( &token_kinds.as_slice(), &[ TokenKind::Unlintable, // authors_slice.join TokenKind::Punctuation(Punctuation::Comma), TokenKind::Space(1), TokenKind::Unlintable, // last TokenKind::Punctuation(Punctuation::Comma), TokenKind::Space(1), TokenKind::Word(_), // and TokenKind::Space(1), TokenKind::Space(2), TokenKind::Word(_), // bob ] )) } #[test] fn header_parsing() { let source = "= Header Paragraph"; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); let charslice = source.chars().collect_vec(); let tokens = document.tokens().collect_vec(); assert_eq!(tokens[0].span.get_content_string(&charslice), "Header"); assert_eq!(tokens[2].span.get_content_string(&charslice), "Paragraph"); assert!(matches!( &token_kinds.as_slice(), &[ TokenKind::Word(_), TokenKind::ParagraphBreak, TokenKind::Word(_) ] )) } #[test] fn parbreak() { let source = "Paragraph Paragraph"; let document = Document::new_curated(source, &Typst); let token_kinds = document.tokens().map(|t| t.kind.clone()).collect_vec(); dbg!(&token_kinds); assert!(matches!( &token_kinds.as_slice(), &[ TokenKind::Word(_), TokenKind::ParagraphBreak, TokenKind::Word(_), ] )) } #[test] fn label_ref_unlintable() { let source = "= Header