././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/LICENSE.md 0000644 0000000 0000000 00000002764 14611571711 012162 0 ustar 00 Copyright © 2014–2015, Jordan Suchow, Michael Pacer, and Lara A. Ross
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4633596
proselint-0.14.0/README.md 0000644 0000000 0000000 00000027514 14554312110 012025 0 ustar 00

[](https://houndci.com)
[](https://codeclimate.com/repos/5538989ee30ba0793100090f/feed)
[](https://codecov.io/gh/amperser/proselint)
[](https://en.wikipedia.org/wiki/BSD_licenses)
Writing is notoriously hard, even for the best writers, and it's not for lack of good advice — a tremendous amount of knowledge about the craft is strewn across usage guides, dictionaries, technical manuals, essays, pamphlets, websites, and the hearts and minds of great authors and editors. But poring over Strunk & White hardly makes one a better writer — it turns you into neither Strunk nor White. And nobody has the capacity to apply all the advice from *Garner’s Modern English Usage*, an 1100-page usage guide, to everything they write. In fact, the whole notion that one becomes a better writer by reading advice on writing rests on untenable assumptions about learning and memory. The traditional formats of knowledge about writing are thus essentially inert, waiting to be transformed.
We devised a simple solution: `proselint`, a linter for English prose. A linter is a computer program that, akin to a spell checker, scans through a file and detects issues — like how a real lint roller helps you get unwanted lint off of your shirt.
`proselint` places the world's greatest writers and editors by your side, where they whisper suggestions on how to improve your prose. You’ll be guided by advice inspired by Bryan Garner, David Foster Wallace, Chuck Palahniuk, Steve Pinker, Mary Norris, Mark Twain, Elmore Leonard, George Orwell, Matthew Butterick, William Strunk, Elwyn White, Philip Corbett, Ernest Gowers, and the editorial staff of the world’s finest literary magazines and newspapers, among others. Our goal is to aggregate knowledge about best practices in writing and to make that knowledge immediately accessible to all authors in the form of a linter for prose; all in a neat command-line utility that you can integrate into other tools, scripts, and workflows.
### Installation
To get this up and running, install it using [pip]:
```bash
pip install proselint
```
[pip]: https://packaging.python.org/installing/#use-pip-for-installing
#### Fedora
```bash
sudo dnf install proselint
```
#### Debian
```bash
sudo apt install python3-proselint
```
#### Ubuntu
```bash
sudo add-apt-repository universe
sudo apt install python3-proselint
```
### Plugins for other software
`proselint` is available on:
- A [demo editor](http://proselint.com/write)
- [Sublime Text](https://github.com/amperser/proselint/tree/main/plugins/sublime/SublimeLinter-contrib-proselint)
- [Atom Editor](https://github.com/smockle/linter-proselint) (thanks to [Clay Miller](https://github.com/smockle)).
- Emacs via [Flycheck](http://www.flycheck.org/) or via [Flymake](https://sr.ht/~manuel-uberti/flymake-proselint/)
- Vim via [ALE](https://github.com/w0rp/ale) or [Syntastic](https://github.com/vim-syntastic/syntastic) (thanks to @lcd047, @Carreau, and [Daniel M. Capella](https://github.com/polyzen))
- Neovim via [null-ls](https://github.com/jose-elias-alvarez/null-ls.nvim) (null-ls has [diagnostics](https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/lua/null-ls/builtins/diagnostics/proselint.lua) and [code actions](https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/lua/null-ls/builtins/code_actions/proselint.lua) for proselint)
- [Phabricator's `arc` CLI](https://github.com/google/arc-proselint) (thanks to [Jeff Verkoeyen](https://github.com/jverkoey))
- [Danger](https://github.com/dbgrandi/danger-prose) (thanks to [David Grandinetti](https://github.com/dbgrandi) and [Orta Therox](https://github.com/orta))
- [Visual Studio Code](https://github.com/ppeszko/vscode-proselint) (thanks to [Patryk Peszko](https://github.com/ppeszko))
- [coala](https://github.com/coala-analyzer/bear-docs/blob/master/docs/ProseLintBear.rst) (thanks to the [coala Development Group](https://github.com/coala-analyzer))
- [IntelliJ](https://github.com/kropp/intellij-proselint) (by [Victor Kropp](https://github.com/kropp))
- [pre-commit](https://pre-commit.com/) (by [Andy Airey](https://github.com/aairey))
- [Statick](https://github.com/sscpac/statick-md)
- [MegaLinter](https://oxsecurity.github.io/megalinter/latest/descriptors/spell_proselint/)
### Usage
Suppose you have a document `text.md` with the following text:
```
John is very unique.
```
You can run `proselint` over the document using the command line:
```bash
proselint text.md
```
This prints a list of suggestions to stdout, one per line. Each suggestion has the form:
```bash
text.md:::
```
For example,
```bash
text.md:0:10: wallace.uncomparables Comparison of an uncomparable: 'unique' cannot be compared.
```
The command-line utility can also print suggestions in JSON using the `--json` flag. In this case, the output is considerably richer:
```jsonc
{
// Type of check that output this suggestion.
check: "wallace.uncomparables",
// Message to describe the suggestion.
message: "Comparison of an uncomparable: 'unique' cannot be compared.",
// The person or organization giving the suggestion.
source: "David Foster Wallace"
// URL pointing to the source material.
source_url: "http://www.telegraph.co.uk/a/9715551"
// Line where the error starts.
line: 0,
// Column where the error starts.
column: 10,
// Index in the text where the error starts.
start: 10,
// Index in the text where the error ends.
end: 21,
// length from start -> end
extent: 11,
// How important is this? Can be "suggestion", "warning", or "error".
severity: "warning",
// Possible replacements.
replacements: [
{
value: "unique"
}
]
}
```
To run the linter as part of another Python program, you can use the `lint` function in `proselint.tools`:
```python
import proselint
suggestions = proselint.tools.lint("This sentence is very unique")
```
This will return a list of suggestions:
```python
[('weasel_words.very', "Substitute 'damn' every time you're inclined to write 'very;' your editor will delete it and the writing will be just as it should be.", 0, 17, 17, 22, 5, 'warning', None), ('uncomparables.misc', "Comparison of an uncomparable: 'very unique.' is not comparable.", 0, 17, 17, 29, 12, 'warning', None)]
```
### Checks
You can disable any of the checks by modifying `$XDG_CONFIG_HOME/proselint/config.json`.
If `$XDG_CONFIG_HOME` is not set or empty, `~/.config/proselint/config.json` will be used.
Additionally, for compatibility reasons, the legacy configurations `~/.proselintrc` and `$XDG_CONFIG_HOME/proselint/config` will be checked if `$XDG_CONFIG_HOME/proselint/config.json` does not exist.
```json
{
"checks": {
"typography.diacritical_marks": false
}
}
```
| ID | Description |
| ----- | --------------- |
| `airlinese.misc` | Avoiding jargon of the airline industry |
| `annotations.misc` | Catching annotations left in the text |
| `archaism.misc` | Avoiding archaic forms |
| `cliches.hell` | Avoiding a common cliché |
| `cliches.misc` | Avoiding clichés |
| `consistency.spacing` | Consistent sentence spacing |
| `consistency.spelling` | Consistent spelling |
| `corporate_speak.misc` | Avoiding corporate buzzwords |
| `cursing.filth` | Words to avoid |
| `cursing.nfl` | Avoiding words banned by the NFL |
| `dates_times.am_pm` | Using the right form for the time of day |
| `dates_times.dates` | Stylish formatting of dates |
| `hedging.misc` | Not hedging |
| `hyperbole.misc` | Not being hyperbolic |
| `jargon.misc` | Avoiding miscellaneous jargon |
| `lgbtq.offensive_terms` | Avoding offensive LGBTQ terms |
| `lgbtq.terms` | Misused LGBTQ terms |
| `lexical_illusions.misc` | Avoiding lexical illusions |
| `links.broken` | Linking only to existing sites |
| `malapropisms.misc` | Avoiding common malapropisms |
| `misc.apologizing` | Being confident |
| `misc.back_formations` | Avoiding needless backformations |
| `misc.bureaucratese` | Avoiding bureaucratese |
| `misc.but` | Avoid starting a paragraph with "But..." |
| `misc.capitalization` | Capitalizing only what ought to be capitalized |
| `misc.chatspeak` | Avoiding lolling and other chatspeak |
| `misc.commercialese` | Avoiding jargon of the commercial world |
| `misc.currency` | Avoiding redundant currency symbols |
| `misc.debased` | Avoiding debased language |
| `misc.false_plurals` | Avoiding false plurals |
| `misc.illogic` | Avoiding illogical forms |
| `misc.inferior_superior` | Superior to, not than |
| `misc.latin` | Avoiding overuse of Latin phrases |
| `misc.many_a` | Many a singular |
| `misc.metaconcepts` | Avoiding overuse of metaconcepts |
| `misc.narcissism` | Talking about the subject, not its study |
| `misc.phrasal_adjectives` | Hyphenating phrasal adjectives |
| `misc.preferred_forms` | Miscellaneous preferred forms |
| `misc.pretension` | Avoiding being pretentious |
| `misc.professions` | Calling jobs by the right name |
| `misc.punctuation` | Using punctuation assiduously |
| `misc.scare_quotes` | Using scare quotes only when needed |
| `misc.suddenly` | Avoiding the word suddenly |
| `misc.tense_present` | Advice from Tense Present |
| `misc.waxed` | Waxing poetic |
| `misc.whence` | Using "whence" |
| `mixed_metaphors.misc` | Not mixing metaphors |
| `mondegreens.misc` | Avoiding mondegreen |
| `needless_variants.misc` | Using the preferred form |
| `nonwords.misc` | Avoid using nonwords |
| `oxymorons.misc` | Avoiding oxymorons |
| `psychology.misc` | Avoiding misused psychological terms |
| `redundancy.misc` | Avoiding redundancy and saying things twice |
| `redundancy.ras_syndrome` | Avoiding RAS syndrome |
| `skunked_terms.misc` | Avoid using skunked terms |
| `spelling.able_atable` | -able vs. -atable |
| `spelling.able_ible` | -able vs. -ible |
| `spelling.athletes` | Spelling of athlete names |
| `spelling.em_im_en_in` | -em vs. -im and -en vs. -in |
| `spelling.er_or` | -er vs. -or |
| `spelling.in_un` | in- vs. un- |
| `spelling.misc` | Spelling words correctly |
| `security.credit_card` | Keeping credit card numbers secret |
| `security.password` | Keeping passwords secret |
| `sexism.misc` | Avoiding sexist language |
| `terms.animal_adjectives` | Animal adjectives |
| `terms.denizen_labels` | Calling denizens by the right name |
| `terms.eponymous_adjectives` | Calling people by the right name |
| `terms.venery` | Call groups of animals by the right name |
| `typography.diacritical_marks` | Using dïacríticâl marks |
| `typography.exclamation` | Avoiding overuse of exclamation |
| `typography.symbols` | Using the right symbols |
| `uncomparables.misc` | Not comparing uncomparables |
| `weasel_words.misc` | Avoiding weasel words |
| `weasel_words.very` | Avoiding the word "very" |
### Contributing
Interested in contributing to `proselint`? Great — there are plenty of ways you can help. Read more on [our website], where we describe how you can help us build `proselint` into the greatest writing tool in the world.
- [Issue Tracker](http://github.com/amperser/proselint/issues)
- [Source Code](http://github.com/amperser/proselint)
[our website]: http://proselint.com/contributing/
### Support
If you run into a problem, please [open an issue](http://github.com/amperser/proselint/issues) in or send an email to hello@amperser.com.
### Running Automated Tests
Automated tests are included in the `proselint/tests` directory. To run these tests locally, you can use `./utils`.
### License
The project is licensed under the BSD license.
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/__init__.py 0000644 0000000 0000000 00000000174 14611571711 014677 0 ustar 00 # flake8: noqa
"""Proselint applies advice from great writers to your writing."""
from . import tools
__all__ = ("tools")
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/__main__.py 0000644 0000000 0000000 00000000216 14611571711 014655 0 ustar 00 """
__main__.py.
This lets you run python -m proselint.
"""
from .command_line import proselint
if __name__ == '__main__':
proselint()
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/__init__.py 0000644 0000000 0000000 00000000101 14611571711 016125 0 ustar 00 """All the checks are organized into modules and places here."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/airlinese/__init__.py 0000644 0000000 0000000 00000000021 14554312110 020071 0 ustar 00 """Airlinese."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/airlinese/misc.py 0000644 0000000 0000000 00000001057 14611571711 017307 0 ustar 00 """Airlinese.
---
layout: post
source: Garner's Modern American Usage
source_url: http://bit.ly/1T4alrY
title: Airlinese
date: 2014-06-10 12:31:19
categories: writing
---
Airlinese.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "airlinese.misc"
msg = "'{}' is airlinese."
airlinese = [
"enplan(?:e|ed|ing|ement)",
"deplan(?:e|ed|ing|ement)",
"taking off momentarily",
]
return existence_check(text, airlinese, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/annotations/__init__.py 0000644 0000000 0000000 00000000023 14554312110 020455 0 ustar 00 """Annotations."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/annotations/misc.py 0000644 0000000 0000000 00000001173 14611571711 017670 0 ustar 00 """Annotation left in text.
---
layout: post
source: SublimeLinter-annotations
source_url: http://bit.ly/16Q7H41
title: archaism
date: 2014-06-10 12:31:19
categories: writing
---
Annotation left in text.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "annotations.misc"
msg = "Annotation left in text."
annotations = [
"FIXME",
"FIX ME",
"TODO",
"todo",
"ERASE THIS",
"FIX THIS",
]
return existence_check(
text, annotations, err, msg, ignore_case=False, join=True)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/archaism/__init__.py 0000644 0000000 0000000 00000000020 14554312110 017704 0 ustar 00 """Archaism."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/archaism/misc.py 0000644 0000000 0000000 00000003436 14611571711 017126 0 ustar 00 """Archaism.
---
layout: post
source: Garner's Modern American Usage
source_url: http://bit.ly/1T4alrY
title: archaism
date: 2014-06-10 12:31:19
categories: writing
---
Archaism.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "archaism.misc"
msg = "'{}' is archaic."
archaisms = [
"alack",
"anent",
# "anon",
"begat",
"belike",
"betimes",
"boughten",
"brocage",
"brokage",
"camarade",
"chiefer",
"chiefest",
"Christiana",
"completely obsolescent",
"cozen",
"divers",
"deflexion",
"durst",
"fain",
"forsooth",
"foreclose from",
"haply",
"howbeit",
"illumine",
"in sooth",
"maugre",
"meseems",
"methinks",
"nigh",
"peradventure",
"perchance",
"saith",
"shew",
"sistren",
"spake",
"to wit",
"verily",
"whilom",
"withal",
"wot",
"enclosed please find",
"please find enclosed",
"enclosed herewith",
"enclosed herein",
"inforce",
"ex postfacto",
"foreclose from",
"forewent",
"for ever",
# "designer", when used to mean a plotter against Christ
# "demean", when used to mean "to behave" in legal contexts
# "by the bye", # variant, modern is "by the by"
# "comptroller" # in British English
# "abortive" Abortive is archaic in reference to abortions of fetuses,
# except in the sense “causing an abortion.”
]
return existence_check(text, archaisms, err, msg, join=True)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/cliches/__init__.py 0000644 0000000 0000000 00000000025 14554312110 017534 0 ustar 00 """Avoid cliches."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/cliches/hell.py 0000644 0000000 0000000 00000001021 14611571711 016726 0 ustar 00 """Too much yelling.
---
layout: post
source: ???
source_url: ???
title: yelling
date: 2014-06-10 12:31:19
categories: writing
---
Never use the phrase 'all hell broke loose'.
"""
from proselint.tools import existence_check, max_errors, memoize
@max_errors(1)
@memoize
def check_repeated_exclamations(text):
"""Check the text."""
err = "leonard.hell"
msg = "Never use the words 'all hell broke loose'."
regex = r"all hell broke loose"
return existence_check(text, [regex], err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/cliches/misc.py 0000644 0000000 0000000 00000061366 14611571711 016757 0 ustar 00 """Cliches are cliché."""
from proselint.tools import existence_check, memoize
@memoize
def check_cliches_garner(text):
"""Check the text.
source: Garner's Modern American Usage
source_url: http://bit.ly/1T4alrY
"""
err = "cliches.garner"
msg = "'{}' is cliché."
cliches = [
"a fate worse than death",
"alas and alack",
"at the end of the day",
"bald-faced lie",
"between a rock and a hard place",
"between Scylla and Charybdis",
"between the devil and the deep blue sea",
"betwixt and between",
"blissful ignorance",
"blow a fuse",
"bulk large",
"but that's another story",
"cast aspersions",
"chase a red herring",
"comparing apples and oranges",
"compleat",
"conspicuous by its absence",
"crystal clear",
"cutting edge",
"decision-making process",
"dubious distinction",
"duly authorized",
"eyes peeled",
"far be it from me",
"fast and loose",
"fills the bill",
"first and foremost",
"for free",
"get with the program",
"gilding the lily",
"have a short fuse",
"he's got his hands full",
"his own worst enemy",
"his work cut out for him",
"hither and yon",
"Hobson's choice",
"horns of a dilemma",
"if you catch my drift",
"in light of",
"in the final analysis",
"in the last analysis",
"innocent bystander",
"it's not what you know, it's who you know",
"last but not least",
"make a mockery of",
"male chauvinism",
"moment of truth",
"more in sorrow than in anger",
"more sinned against than sinning",
"my better half",
"nip in the bud",
"olden days",
"on the same page",
"presidential timber",
"pulled no punches",
"quantum jump",
"quantum leap",
"redound to one's credit",
"redound to the benefit of",
"sea change",
"shirked his duties",
"six of one, half a dozen of the other",
"stretched to the breaking point",
"than you can shake a stick at",
"the cream of the crop",
"the cream rises to the top",
"the straw that broke the camel's back",
"thick as thieves",
"thinking outside the box",
"thought leaders?",
"throw the baby out with the bathwater",
"various and sundry",
"viable alternative",
"wax eloquent",
"wax poetic",
"we've got a situation here",
"whet (?:the|your) appetite",
"wool pulled over our eyes",
"writ large",
]
return existence_check(text, cliches, err, msg, join=True)
@memoize
def check_cliches_write_good(text):
"""Check the text.
source: write-good
source_url: https://github.com/btford/write-good
"""
err = "cliches.write_good"
msg = "'{}' is a cliché."
cliches = [
"a chip off the old block",
"a clean slate",
"a dark and stormy night",
"a far cry",
"a fine kettle of fish",
"a loose cannon",
"a penny saved is a penny earned",
"a tough row to hoe",
"a word to the wise",
"ace in the hole",
"acid test",
"add insult to injury",
"against all odds",
"air your dirty laundry",
"all fun and games",
"all in a day's work",
"all talk, no action",
"all thumbs",
"all your eggs in one basket",
"all's fair in love and war",
"all's well that ends well",
"almighty dollar",
"American as apple pie",
"an axe to grind",
"another day, another dollar",
"armed to the teeth",
"as luck would have it",
"as old as time",
"as the crow flies",
"at loose ends",
"at my wits end",
"avoid like the plague",
"babe in the woods",
"back against the wall",
"back in the saddle",
"back to square one",
"back to the drawing board",
"bad to the bone",
"badge of honor",
"bald faced liar",
"ballpark figure",
"banging your head against a brick wall",
"baptism by fire",
"barking up the wrong tree",
"bat out of hell",
"be all and end all",
"beat a dead horse",
"beat around the bush",
"been there, done that",
"beggars can't be choosers",
"behind the eight ball",
"bend over backwards",
"benefit of the doubt",
"bent out of shape",
"best thing since sliced bread",
"bet your bottom dollar",
"better half",
"better late than never",
"better mousetrap",
"better safe than sorry",
"between a rock and a hard place",
"beyond the pale",
"bide your time",
"big as life",
"big cheese",
"big fish in a small pond",
"big man on campus",
"bigger they are the harder they fall",
"bird in the hand",
"bird's eye view",
"birds and the bees",
"birds of a feather flock together",
"bit the hand that feeds you",
"bite the bullet",
"bite the dust",
"bitten off more than he can chew",
"black as coal",
"black as pitch",
"black as the ace of spades",
"blast from the past",
"bleeding heart",
"blessing in disguise",
"blind ambition",
"blind as a bat",
"blind leading the blind",
"blood is thicker than water",
"blood sweat and tears",
"blow off steam",
"blow your own horn",
"blushing bride",
"boils down to",
"bolt from the blue",
"bone to pick",
"bored stiff",
"bored to tears",
"bottomless pit",
"boys will be boys",
"bright and early",
"brings home the bacon",
"broad across the beam",
"broken record",
"brought back to reality",
"bull by the horns",
"bull in a china shop",
"burn the midnight oil",
"burning question",
"burning the candle at both ends",
"burst your bubble",
"bury the hatchet",
"busy as a bee",
"by hook or by crook",
"call a spade a spade",
"called onto the carpet",
"calm before the storm",
"can of worms",
"can't cut the mustard",
"can't hold a candle to",
"case of mistaken identity",
"cat got your tongue",
"cat's meow",
"caught in the crossfire",
"caught red-handed",
"checkered past",
"chomping at the bit",
"cleanliness is next to godliness",
"clear as a bell",
"clear as mud",
"close to the vest",
"cock and bull story",
"cold shoulder",
"come hell or high water",
"cool as a cucumber",
"cool, calm, and collected",
"cost a king's ransom",
"count your blessings",
"crack of dawn",
"crash course",
"creature comforts",
"cross that bridge when you come to it",
"crushing blow",
"cry like a baby",
"cry me a river",
"cry over spilt milk",
"crystal clear",
"curiosity killed the cat",
"cut and dried",
"cut through the red tape",
"cut to the chase",
"cute as a bugs ear",
"cute as a button",
"cute as a puppy",
"cuts to the quick",
"dark before the dawn",
"day in, day out",
"dead as a doornail",
"devil is in the details",
"dime a dozen",
"divide and conquer",
"dog and pony show",
"dog days",
"dog eat dog",
"dog tired",
"don't burn your bridges",
"don't count your chickens",
"don't look a gift horse in the mouth",
"don't rock the boat",
"don't step on anyone's toes",
"don't take any wooden nickels",
"down and out",
"down at the heels",
"down in the dumps",
"down the hatch",
"down to earth",
"draw the line",
"dressed to kill",
"dressed to the nines",
"drives me up the wall",
"dull as dishwater",
"dyed in the wool",
"eagle eye",
"ear to the ground",
"early bird catches the worm",
"easier said than done",
"easy as pie",
"eat your heart out",
"eat your words",
"eleventh hour",
"even the playing field",
"every dog has its day",
"every fiber of my being",
"everything but the kitchen sink",
"eye for an eye",
"face the music",
"facts of life",
"fair weather friend",
"fall by the wayside",
"fan the flames",
"feast or famine",
"feather your nest",
"feathered friends",
"few and far between",
"fifteen minutes of fame",
"filthy vermin",
"fine kettle of fish",
"fish out of water",
"fishing for a compliment",
"fit as a fiddle",
"fit the bill",
"fit to be tied",
"flash in the pan",
"flat as a pancake",
"flip your lid",
"flog a dead horse",
"fly by night",
"fly the coop",
"follow your heart",
"for all intents and purposes",
"for the birds",
"for what it's worth",
"force of nature",
"force to be reckoned with",
"forgive and forget",
"fox in the henhouse",
"free and easy",
"free as a bird",
"fresh as a daisy",
"full steam ahead",
"fun in the sun",
"garbage in, garbage out",
"gentle as a lamb",
"get a kick out of",
"get a leg up",
"get down and dirty",
"get the lead out",
"get to the bottom of",
"get your feet wet",
"gets my goat",
"gilding the lily",
"give and take",
"go against the grain",
"go at it tooth and nail",
"go for broke",
"go him one better",
"go the extra mile",
"go with the flow",
"goes without saying",
"good as gold",
"good deed for the day",
"good things come to those who wait",
"good time was had by all",
"good times were had by all",
"greased lightning",
"greek to me",
"green thumb",
"green-eyed monster",
"grist for the mill",
"growing like a weed",
"hair of the dog",
"hand to mouth",
"happy as a clam",
"happy as a lark",
"hasn't a clue",
"have a nice day",
"have high hopes",
"have the last laugh",
"haven't got a row to hoe",
"head honcho",
"head over heels",
"hear a pin drop",
"heard it through the grapevine",
"heart's content",
"heavy as lead",
"hem and haw",
"high and dry",
"high and mighty",
"high as a kite",
"hit paydirt",
"hold your head up high",
"hold your horses",
"hold your own",
"hold your tongue",
"honest as the day is long",
"horns of a dilemma",
"horse of a different color",
"hot under the collar",
"hour of need",
"I beg to differ",
"icing on the cake",
"if the shoe fits",
"if the shoe were on the other foot",
"in a jam",
"in a jiffy",
"in a nutshell",
"in a pig's eye",
"in a pinch",
"in a word",
"in hot water",
"in the gutter",
"in the nick of time",
"in the thick of it",
"in your dreams",
"it ain't over till the fat lady sings",
"it goes without saying",
"it takes all kinds",
"it takes one to know one",
"it's a small world",
"it's only a matter of time",
"ivory tower",
"Jack of all trades",
"jockey for position",
"jog your memory",
"joined at the hip",
"judge a book by its cover",
"jump down your throat",
"jump in with both feet",
"jump on the bandwagon",
"jump the gun",
"jump to conclusions",
"just a hop, skip, and a jump",
"just the ticket",
"justice is blind",
"keep a stiff upper lip",
"keep an eye on",
"keep it simple, stupid",
"keep the home fires burning",
"keep up with the Joneses",
"keep your chin up",
"keep your fingers crossed",
"kick the bucket",
"kick up your heels",
"kick your feet up",
"kid in a candy store",
"kill two birds with one stone",
"kiss of death",
"knock it out of the park",
"knock on wood",
"knock your socks off",
"know him from Adam",
"know the ropes",
"know the score",
"knuckle down",
"knuckle sandwich",
"knuckle under",
"labor of love",
"ladder of success",
"land on your feet",
"lap of luxury",
"last but not least",
"last hurrah",
"last-ditch effort",
"law of the jungle",
"law of the land",
"lay down the law",
"leaps and bounds",
"let sleeping dogs lie",
"let the cat out of the bag",
"let the good times roll",
"let your hair down",
"let's talk turkey",
"letter perfect",
"lick your wounds",
"lies like a rug",
"life's a bitch",
"life's a grind",
"light at the end of the tunnel",
"lighter than a feather",
"lighter than air",
"like clockwork",
"like father like son",
"like taking candy from a baby",
"like there's no tomorrow",
"lion's share",
"live and learn",
"live and let live",
"long and short of it",
"long lost love",
"look before you leap",
"look down your nose",
"look what the cat dragged in",
"looking a gift horse in the mouth",
"looks like death warmed over",
"loose cannon",
"lose your head",
"lose your temper",
"loud as a horn",
"lounge lizard",
"loved and lost",
"low man on the totem pole",
"luck of the draw",
"luck of the Irish",
"make hay while the sun shines",
"make money hand over fist",
"make my day",
"make the best of a bad situation",
"make the best of it",
"make your blood boil",
"man of few words",
"man's best friend",
"mark my words",
"meaningful dialogue",
"missed the boat on that one",
"moment in the sun",
"moment of glory",
"moment of truth",
"money to burn",
"more power to you",
"more than one way to skin a cat",
"movers and shakers",
"moving experience",
"naked as a jaybird",
"naked truth",
"neat as a pin",
"needle in a haystack",
"needless to say",
"neither here nor there",
"never look back",
"never say never",
"nip and tuck",
"nip it in the bud",
"no guts, no glory",
"no love lost",
"no pain, no gain",
"no skin off my back",
"no stone unturned",
"no time like the present",
"no use crying over spilled milk",
"nose to the grindstone",
"not a hope in hell",
"not a minute's peace",
"not in my backyard",
"not playing with a full deck",
"not the end of the world",
"not written in stone",
"nothing to sneeze at",
"nothing ventured nothing gained",
"now we're cooking",
"off the top of my head",
"off the wagon",
"off the wall",
"old hat",
"older and wiser",
"older than dirt",
"older than Methuselah",
"on a roll",
"on cloud nine",
"on pins and needles",
"on the bandwagon",
"on the money",
"on the nose",
"on the rocks",
"on the spot",
"on the tip of my tongue",
"on the wagon",
"on thin ice",
"once bitten, twice shy",
"one bad apple doesn't spoil the bushel",
"one born every minute",
"one brick short",
"one foot in the grave",
"one in a million",
"one red cent",
"only game in town",
"open a can of worms",
"open and shut case",
"open the flood gates",
"opportunity doesn't knock twice",
"out of pocket",
"out of sight, out of mind",
"out of the frying pan into the fire",
"out of the woods",
"out on a limb",
"over a barrel",
"over the hump",
"pain and suffering",
"pain in the",
"panic button",
"par for the course",
"part and parcel",
"party pooper",
"pass the buck",
"patience is a virtue",
"pay through the nose",
"penny pincher",
"perfect storm",
"pig in a poke",
"pile it on",
"pillar of the community",
"pin your hopes on",
"pitter patter of little feet",
"plain as day",
"plain as the nose on your face",
"play by the rules",
"play your cards right",
"playing the field",
"playing with fire",
"pleased as punch",
"plenty of fish in the sea",
"point with pride",
"poor as a church mouse",
"pot calling the kettle black",
"pretty as a picture",
"pull a fast one",
"pull your punches",
"pulling your leg",
"pure as the driven snow",
"put it in a nutshell",
"put one over on you",
"put the cart before the horse",
"put the pedal to the metal",
"put your best foot forward",
"put your foot down",
"quick as a bunny",
"quick as a lick",
"quick as a wink",
"quick as lightning",
"quiet as a dormouse",
"rags to riches",
"raining buckets",
"raining cats and dogs",
"rank and file",
"rat race",
"reap what you sow",
"red as a beet",
"red herring",
"reinvent the wheel",
"rich and famous",
"rings a bell",
"ripe old age",
"ripped me off",
"rise and shine",
"road to hell is paved with good intentions",
"rob Peter to pay Paul",
"roll over in the grave",
"rub the wrong way",
"ruled the roost",
"running in circles",
"sad but true",
"sadder but wiser",
"salt of the earth",
"scared stiff",
"scared to death",
"sealed with a kiss",
"second to none",
"see eye to eye",
"seen the light",
"seize the day",
"set the record straight",
"set the world on fire",
"set your teeth on edge",
"sharp as a tack",
"shoot for the moon",
"shoot the breeze",
"shot in the dark",
"shoulder to the wheel",
"sick as a dog",
"sigh of relief",
"signed, sealed, and delivered",
"sink or swim",
"six of one, half a dozen of another",
"skating on thin ice",
"slept like a log",
"slinging mud",
"slippery as an eel",
"slow as molasses",
"smart as a whip",
"smooth as a baby's bottom",
"sneaking suspicion",
"snug as a bug in a rug",
"sow wild oats",
"spare the rod, spoil the child",
"speak of the devil",
"spilled the beans",
"spinning your wheels",
"spitting image of",
"spoke with relish",
"spread like wildfire",
"spring to life",
"squeaky wheel gets the grease",
"stands out like a sore thumb",
"start from scratch",
"stick in the mud",
"still waters run deep",
"stitch in time",
"stop and smell the roses",
"straight as an arrow",
"straw that broke the camel's back",
"strong as an ox",
"stubborn as a mule",
"stuff that dreams are made of",
"stuffed shirt",
"sweating blood",
"sweating bullets",
"take a load off",
"take one for the team",
"take the bait",
"take the bull by the horns",
"take the plunge",
"takes one to know one",
"takes two to tango",
"the more the merrier",
"the real deal",
"the real McCoy",
"the red carpet treatment",
"the same old story",
"there is no accounting for taste",
"thick as a brick",
"thick as thieves",
"thin as a rail",
"think outside of the box",
"third time's the charm",
"this day and age",
"this hurts me worse than it hurts you",
"this point in time",
"three sheets to the wind",
"through thick and thin",
"throw in the towel",
"tie one on",
"tighter than a drum",
"time and time again",
"time is of the essence",
"tip of the iceberg",
"tired but happy",
"to coin a phrase",
"to each his own",
"to make a long story short",
"to the best of my knowledge",
"toe the line",
"tongue in cheek",
"too good to be true",
"too hot to handle",
"too numerous to mention",
"touch with a ten foot pole",
"tough as nails",
"trial and error",
"trials and tribulations",
"tried and true",
"trip down memory lane",
"twist of fate",
"two cents worth",
"two peas in a pod",
"ugly as sin",
"under the counter",
"under the gun",
"under the same roof",
"under the weather",
"until the cows come home",
"unvarnished truth",
"up the creek",
"uphill battle",
"upper crust",
"upset the applecart",
"vain attempt",
"vain effort",
"vanquish the enemy",
"vested interest",
"waiting for the other shoe to drop",
"wakeup call",
"warm welcome",
"watch your p's and q's",
"watch your tongue",
"watching the clock",
"water under the bridge",
"weather the storm",
"weed them out",
"week of Sundays",
"went belly up",
"wet behind the ears",
"what goes around comes around",
"what you see is what you get",
"when it rains, it pours",
"when push comes to shove",
"when the cat's away",
"when the going gets tough, the tough get going",
"white as a sheet",
"whole ball of wax",
"whole hog",
"whole nine yards",
"wild goose chase",
"will wonders never cease?",
"wisdom of the ages",
"wise as an owl",
"wolf at the door",
"words fail me",
"work like a dog",
"world weary",
"worst nightmare",
"worth its weight in gold",
"wrong side of the bed",
"yanking your chain",
"yappy as a dog",
"years young",
"you are what you eat",
"you can run but you can't hide",
"you only live once",
"you're the boss ",
"young and foolish",
"young and vibrant",
]
return existence_check(text, cliches, err, msg, join=True)
@memoize
def check_cliches_gnu_diction(text):
"""Check the text.
source: GNU diction
source_url: https://directory.fsf.org/wiki/Diction
"""
err = "cliches.gnu_diction"
msg = "'{}' is a cliché."
list = [
"a matter of concern",
"all things being equal",
"as a last resort",
"attached hereto",
"by no means",
"conspicuous by its absence",
"easier said than done",
"enclosed herewith",
"if and when",
"in reference to",
"in short supply",
"in the foreseeable future",
"in the long run",
"in the matter of",
"it stands to reason",
"many and diverse",
"on the right track",
"par for the course",
"please feel free to",
"pursuant to your request",
"regarding the matter of",
"slowly but surely",
"this will acknowledge",
"we are pleased to advice",
"we regret to inform you",
"we wish to state",
"you are hereby advised that",
]
return existence_check(text, list, err, msg, join=True, ignore_case=True)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/consistency/__init__.py 0000644 0000000 0000000 00000000042 14554312110 020462 0 ustar 00 """Various consistency checks."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/consistency/spacing.py 0000644 0000000 0000000 00000001202 14611571711 020356 0 ustar 00 """Mixed one vs. two spaces after a period.
---
layout: post
source: Consistency.
source_url: ???
title: Mixed use of 1 vs. 2 spaces after a period.
date: 2014-06-10 12:31:19
categories: writing
---
Points out instances where there are two conventions, 1 vs. 2 spaces after
a period, in the same document.
"""
from proselint.tools import consistency_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "consistency.spacing"
msg = "Inconsistent spacing after period (1 vs. 2 spaces)."
regex = [r"[\.\?!] [A-Z]", r"[\.\?!] [A-Z]"]
return consistency_check(text, [regex], err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/consistency/spelling.py 0000644 0000000 0000000 00000002652 14611571711 020561 0 ustar 00 """Inconsistent spelling.
---
layout: post
source: Intelligent Editing Ltd.
source_url: http://bit.ly/1x3hYj7
title: Inconsistent spelling
date: 2014-06-10 12:31:19
categories: writing
---
Intelligent Editing Ltd. says:
> Some words have more than one correct spelling. American, British, Australian
and Canadian English all have their own preferences. Even within those, there
can be multiple spellings. For example, in the UK 'realise' is often preferred.
However, 'realize' has been used in British-English for centuries and is
preferred in the Oxford English Dictionary. However, no matter which spelling
is preferred, one thing is always wrong: you mustn't use two different
spellings in the same document.
"""
from proselint.tools import consistency_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "consistency.spelling"
msg = "Inconsistent spelling of '{}' (vs. '{}')."
word_pairs = [
["advisor", "adviser"],
# ["analyse", "analyze"],
["centre", "center"],
["colour", "color"],
["emphasise", "emphasize"],
["finalise", "finalize"],
["focussed", "focused"],
["labour", "labor"],
["learnt", "learned"],
["organise", "organize"],
["organised", "organized"],
["organising", "organizing"],
["recognise", "recognize"],
]
return consistency_check(text, word_pairs, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/corporate_speak/__init__.py 0000644 0000000 0000000 00000000027 14554312110 021305 0 ustar 00 """Corporate-speak."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/corporate_speak/misc.py 0000644 0000000 0000000 00000002363 14611571711 020516 0 ustar 00 """Corporate speak.
---
layout: post
source: Travis Bradberry for Inc.com
source_url: http://bit.ly/1IxWnto
title: corporate speak
date: 2014-06-10 12:31:19
categories: writing
---
Avoid these cases of business jargon.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "corporate_speak.misc"
msg = "Minimize your use of corporate catchphrases like this one."
list = [
"at the end of the day",
"back to the drawing board",
"hit the ground running",
"get the ball rolling",
"low-hanging fruit",
"thrown under the bus",
"think outside the box",
"let's touch base",
"get my manager's blessing",
"it's on my radar",
"ping me",
"i don't have the bandwidth",
"no brainer",
"par for the course",
"bang for your buck",
"synergy",
"move the goal post",
"apples to apples",
"win-win",
"circle back around",
"all hands on deck",
"take this offline",
"drill-down",
"elephant in the room",
"on my plate",
]
return existence_check(text, list, err, msg, ignore_case=True)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/cursing/__init__.py 0000644 0000000 0000000 00000000017 14554312110 017575 0 ustar 00 """Cursing."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/cursing/filth.py 0000644 0000000 0000000 00000001255 14611571711 017161 0 ustar 00 """Filthy words.
---
layout: post
source: George Carlin
source_url: https://youtu.be/kyBH5oNQOS0
title: filthy words
date: 2014-06-10 12:31:19
categories: writing
---
Filthy words.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "cursing.filth"
msg = """Nobody ever tells you this as a kid, but you're supposed to avoid
this word."""
list = [
"shit",
"piss",
"fuck",
"cunt",
"cocksucker",
"motherfucker",
"tits",
"fart",
"turd",
"twat",
]
return existence_check(text, list, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/cursing/nfl.py 0000644 0000000 0000000 00000057175 14611571711 016646 0 ustar 00 """Words the NFL won't print on a jersey.
---
layout: post
source: The National Football League
source_url: http://bit.ly/1ISK0rb
title: words the NFL won't print on a jersey
date: 2014-06-10 12:31:19
categories: writing
---
Words the NFL won't print on a jersey.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "cursing.nfl"
msg = "The NFL won't print this word on a jersey."
list = [
"420",
"666",
"2 on 1",
"3rd eye",
"3rd leg",
"3rdeye",
"3rdleg",
"3some",
"4 twenty",
"4twenty",
"60 nine",
"60nine",
"a.s.s.",
"anal",
"anal annie",
"anal sex",
"analannie",
"analsex",
"anus",
"arse",
"ass",
"ass bagger",
"ass blaster",
"ass clown",
"ass cowboy",
"ass fuck",
"ass fucker",
"ass hole",
"ass holes",
"ass hore",
"ass jockey",
"ass kiss",
"ass kisser",
"ass klown",
"ass lick",
"ass licker",
"ass lover",
"ass man",
"ass monkey",
"ass munch",
"ass muncher",
"ass packer",
"ass pirate",
"ass puppies",
"ass ranger",
"ass whore",
"ass wipe",
"assbagger",
"assblaster",
"assclown",
"asscowboy",
"assfuck",
"assfucker",
"asshole",
"assholes",
"asshore",
"assjockey",
"asskiss",
"asskisser",
"assklown",
"asslick",
"asslicker",
"asslover",
"assman",
"assmonkey",
"assmunch",
"assmuncher",
"asspacker",
"asspirate",
"asspuppies",
"assranger",
"asswhore",
"asswipe",
"athletes foot",
"athletesfoot",
"axing the weasel",
"b hard",
"back door",
"back door man",
"backdoor",
"backdoorman",
"backseat",
"bad ass",
"bad fuck",
"badfuck",
"ball licker",
"ball sack",
"balllicker",
"balls",
"ballsack",
"banging",
"barely legal",
"barelylegal",
"barf",
"barf face",
"barface",
"barfface",
"bastard",
"bazongas",
"bazooms",
"beastality",
"beastiality",
"beat off",
"beat your meat",
"beatoff",
"beat-off",
"beatyourmeat",
"bi",
"bi sexual",
"biatch",
"big ass",
"big bitch",
"big bitch",
"big butt",
"bigass",
"bigbastard",
"bigbutt",
"bisexual",
"bi-sexual",
"bitch",
"bitches",
"bitchin",
"bitchy",
"bite me",
"biteme",
"black out",
"blackout",
"blow job",
"blowjob",
"bm",
"boner",
"bong",
"boobies",
"boobs",
"boody",
"breast",
"breast job",
"breast lover",
"breast man",
"breastjob",
"breastlover",
"breastman",
"budweiser",
"bull crap",
"bull dike",
"bull dyke",
"bull shit",
"bullcrap",
"bulldike",
"bulldyke",
"bullshit",
"bumble fuck",
"bumblefuck",
"bumfuck",
"bunghole",
"butch babes",
"butch dike",
"butch dyke",
"butchbabes",
"butchdike",
"butchdyke",
"butt bang",
"butt fuck",
"butt fucker",
"butt fuckers",
"butt head",
"butt man",
"butt plug",
"butt stain",
"buttbang",
"butt-bang",
"buttface",
"buttfuck",
"butt-fuck",
"buttfucker",
"butt-fucker",
"buttfuckers",
"butt-fuckers",
"butthead",
"buttman",
"buttpirate",
"buttplug",
"buttstain",
"camel toe",
"cameltoe",
"carpet muncher",
"carpetmuncher",
"carruth",
"cherry popper",
"cherrypopper",
"chick slick",
"chickslick",
"clam digger",
"clam diver",
"clamdigger",
"clamdiver",
"clit",
"clitoris",
"cock",
"cock block",
"cock blocker",
"cock cowboy",
"cock fight",
"cock knob",
"cock licker",
"cock lover",
"cock nob",
"cock queen",
"cock rider",
"cock smith",
"cock sucker",
"cock tail",
"cock tease",
"cockblock",
"cockblocker",
"cockcowboy",
"cockfight",
"cockhead",
"cockknob",
"cocklicker",
"cocklover",
"cocknob",
"cockqueen",
"cockrider",
"cocks man",
"cocksman",
"cocksmith",
"cocksucer",
"cocksucker",
"cocktail",
"cocktease",
"cocky",
"condom",
"copulate",
"corn hole",
"cornhole",
"crabs",
"crack",
"crack pipe",
"crack whore",
"crackpipe",
"crackwhore",
"crack-whore",
"crap",
"crappy",
"creamy",
"crotch",
"crotch jockey",
"crotch monkey",
"crotch rot",
"crotchjockey",
"crotchmonkey",
"crotchrot",
"cum",
"cum bubble",
"cum fest",
"cum jockey",
"cum quat",
"cum queen",
"cum shot",
"cumbubble",
"cumfest",
"cumjockey",
"cumm",
"cumming",
"cumquat",
"cumqueen",
"cumshot",
"cunnilingus",
"cunt",
"cunt fuck",
"cunt fucker",
"cunt licker",
"cuntfuck",
"cuntfucker",
"cuntlicker",
"cyber sex",
"cyber slimer",
"cybersex",
"cyberslimer",
"dahmer",
"damn",
"damn it",
"damnit",
"datnigga",
"dd",
"deap throat",
"deaper",
"deapthroat",
"deep throat",
"deeper",
"deepthroat",
"defecate",
"deposit",
"devil",
"dick brain",
"dick fart",
"dick for brains",
"dick head",
"dick lick",
"dick licker",
"dick likcer",
"dick wad",
"dick weed",
"dickbrain",
"dickforbrains",
"dickhead",
"dickless",
"dicklick",
"dicklicker",
"dickman",
"dickwad",
"dickweed",
"dike",
"dildo",
"dip stick",
"dipstick",
"dirty ho",
"dix",
"dixie dike",
"dixie dyke",
"dixiedike",
"dixiedyke",
"do me",
"doggie style",
"doggiestyle",
"doggy stlye",
"doggystyle",
"dome",
"dong",
"dope",
"double d",
"doubled",
"drag queen",
"dragqueen",
"dragqween",
"dre",
"drip dick",
"dripdick",
"drunk",
"drunken",
"dumb ass",
"dumb bitch",
"dumb fuck",
"dumbass",
"dumbbitch",
"dumbfuck",
"easy slut",
"easyslut",
"eat me",
"eat pussy",
"eatballs",
"eatme",
"eatpussy",
"ejaculate",
"erection",
"evl",
"excrement",
"f toyota",
"f.i.n.e.",
"f.u.c.k.",
"face fucker",
"facefucker",
"faggot",
"fagot",
"fairy",
"fanny fucker",
"fannyfucker",
"fart",
"fast fuck",
"fastfuck",
"fat ass",
"fat fuck",
"fat fucker",
"fatass",
"fatfuck",
"fatfucker",
"fatso",
"fellatio",
"femme",
"finger food",
"finger fuck",
"finger fucker",
"fingerfood",
"fingerfuck",
"fingerfucker",
"fist fuck",
"fist fucker",
"fistfuck",
"fistfucker",
"fisting",
"flasher",
"flatulence",
"floggin the dolphin",
"fondle",
"foot fuck",
"foot fucker",
"foot licker",
"footaction",
"footfuck",
"footfucker",
"footlicker",
"footstar",
"fore skin",
"foreskin",
"fornicate",
"four 20",
"four twenty",
"four20",
"fourtwenty",
"freak fuck",
"freakfuck",
"freaky fucker",
"freakyfucker",
"free 4 all",
"free for all",
"free fuck",
"free4all",
"freeforall",
"freefuck",
"fuck",
"fuck bag",
"fuck buddy",
"fuck face",
"fuck fest",
"fuck freak",
"fuck friend",
"fuck head",
"fuck her",
"fuck it",
"fuck knob",
"fuck me",
"fuck me hard",
"fuck monkey",
"fuck off",
"fuck pig",
"fuck them",
"fuck whore",
"fuck you",
"fucka",
"fuckable",
"fuckbag",
"fuckbuddy",
"fucked",
"fucked up",
"fuckedup",
"fucker",
"fuckers",
"fuckface",
"fuckfest",
"fuckfreak",
"fuckfriend",
"fuckhead",
"fuckher",
"fuckin",
"fuckin a",
"fuckin nuts",
"fuckin right",
"fuckina",
"fucking",
"fucking a",
"fucking bitch",
"fucking nuts",
"fuckingbitch",
"fuckinnuts",
"fuckinright",
"fuckit",
"fuckknob",
"fuckme",
"fuckmehard",
"fuckmonkey",
"fuckoff",
"fuckpig",
"fuckwhore",
"fuckyou",
"fudge pakcers",
"fun fuck",
"funfuck",
"fuuck",
"g unit",
"gang bang",
"gang banger",
"gangbang",
"gangbanger",
"gay",
"gay ass",
"gay mutha fuckin queer",
"gay pride",
"gaymuthafuckinwhore",
"genital",
"get it on",
"getiton",
"giehn",
"give head",
"givehead",
"glazed donut",
"glazeddonut",
"go me",
"go to hell",
"god",
"god damed mutha fucka",
"god damit",
"god damn",
"god damned",
"god manit",
"goddamit",
"goddamn",
"goddamned",
"goddamnes",
"goddamnit",
"goddamnmuthafucker",
"gonorrehea",
"gonzagas",
"gook",
"got jesus",
"got2haveit",
"gotohell",
"g-unit",
"hand job",
"handjob",
"hard on",
"harder",
"hardon",
"harem",
"he hate me",
"head fuck",
"head lights",
"headfuck",
"headlights",
"hehateme",
"hell",
"hell no",
"hell yes",
"hellno",
"hellyes",
"hen house",
"henhouse",
"herpes",
"hershey hi way",
"hersheyhighway",
"hersheyhiway",
"hershy high way",
"ho",
"ho mo",
"hobo",
"hole",
"hole stuffer",
"holestuffer",
"homo",
"homo bangers",
"homo sexual",
"homobangers",
"homosexual",
"honkers",
"honkey",
"hooker",
"hookers",
"hooters",
"hore",
"horney",
"horny",
"horseshit",
"hose job",
"hosejob",
"hoser",
"hostage",
"hot damn",
"hot pussy",
"hot to trot",
"hot2trot",
"hotdamn",
"hotpussy",
"hottotrot",
"hussy",
"hustler",
"i love beer",
"i luv beer",
"id ten t",
"id10t",
"idiot",
"idoit",
"in the ass",
"in the buff",
"ingin",
"insest",
"inter course",
"inter racial",
"intercourse",
"interracial",
"intheass",
"inthebuff",
"jack the ripper",
"jackass",
"jackoff",
"jacktheripper",
"jap",
"jap crap",
"japcrap",
"jerk off",
"jerkoff",
"jesus chirst",
"jesuschrist",
"jism",
"jiz",
"jiz juice",
"jizim",
"jizjuice",
"jizz",
"jizzim",
"joint",
"juggalo",
"jugs",
"k mart",
"kill",
"killer",
"killing",
"kiss ass",
"kissass",
"kkk",
"kmart",
"knockers",
"koon",
"kotex",
"krap",
"krappy",
"kum",
"kum bubble",
"kum quat",
"kumbubble",
"kumbullbe",
"kumquat",
"kunt",
"ky",
"ky jelly",
"lactate",
"lady boog",
"laid",
"lap dance",
"lapdance",
"lesbain",
"lesbayn",
"lesbian",
"lesbin",
"lesbo",
"lez",
"lez be",
"lez be friends",
"lezbe",
"lezbefriends",
"lezbo",
"lezz",
"lezzo",
"lick me",
"licker",
"lickme",
"limp dick",
"limpdick",
"limy",
"live sex",
"livesex",
"loaded gun",
"loadedgun",
"lolita",
"looser",
"lotion",
"love bone",
"love goo",
"love gun",
"love juice",
"love muscle",
"love pistol",
"love rocket",
"lovebone",
"lovegoo",
"lovegun",
"lovejuice",
"lovemuscle",
"lovepistol",
"loverocket",
"low life",
"lowlife",
"lube job",
"lubejob",
"lucky camel toe",
"luckycammeltoe",
"magic wand",
"magicwand",
"mams",
"man hater",
"man paste",
"manhater",
"manpaste",
"mary jane",
"maryjane",
"mastabate",
"mastabater",
"master blaster",
"masterbate",
"masterblaster",
"mastrabator",
"mattress princess",
"mattressprincess",
"meat beatter",
"meatbeatter",
"molest",
"molester",
"molestor",
"money shot",
"moneyshot",
"mother fucker",
"mother love bone",
"motherfuck",
"motherfucker",
"motherlovebone",
"muff",
"muff dive",
"muff diver",
"muff licker",
"muffdive",
"muffdiver",
"muffin diver",
"muffindiver",
"mufflikcer",
"murder",
"mutha fucker",
"naked",
"nasty bitch",
"nasty ho",
"nasty slut",
"nasty whore",
"nastybitch",
"nastyho",
"nastyslut",
"nastywhore",
"neon deon",
"nig",
"niger",
"nigga",
"nigger",
"nipple",
"nipple ring",
"nipplering",
"nit tit",
"nittit",
"no fucking way",
"no sex",
"nofuckingway",
"nookie",
"nooner",
"nude",
"nut fucker",
"nutfucker",
"oicu812",
"on the rag",
"ontherag",
"orgasm",
"orgy",
"ou812",
"oui",
"p i m p",
"pearl necklace",
"pearlnecklace",
"pecker",
"pee",
"peep show",
"peepshow",
"peepshpw",
"penetration",
"penis",
"penthouse",
"period",
"phque",
"pimp",
"pimp simp",
"pimped",
"pimper",
"pimpjuic",
"pimpjuice",
"pimpsimp",
"piss",
"piss head",
"pissed",
"pisser",
"pisshead",
"play boy",
"play girl",
"playboy",
"playgirl",
"pocket pool",
"pocketpool",
"polack",
"poon tang",
"poontang",
"poop",
"pooper",
"poor white trash",
"poorwhitetrash",
"popimp",
"porch monkey",
"porchmonkey",
"porn",
"porn flick",
"porn king",
"porn princess",
"pornflick",
"pornking",
"porno",
"pornprincess",
"pot",
"premature",
"prick",
"prick head",
"prickhead",
"primetime",
"prostitute",
"pubic",
"pubic lice",
"pubiclice",
"pud",
"pud boy",
"pudboy",
"pudd",
"pudd boy",
"puddboy",
"pun tang",
"puntang",
"purina princess",
"purinapricness",
"pussy",
"pussy cat",
"pussy eater",
"pussy fucker",
"pussy licker",
"pussy lips",
"pussy lover",
"pussy pounder",
"pussycat",
"pussyeater",
"pussyfucker",
"pussylicker",
"pussylips",
"pussylover",
"pussypounder",
"putt pirate",
"pwt",
"queef",
"queer",
"quickie",
"rae carruth",
"rape",
"rapist",
"rear end",
"rear entry",
"rearend",
"rearentry",
"rectum",
"red light",
"redlight",
"reefer",
"rent a fuck",
"rentafuck",
"retard",
"retarded",
"ribbed",
"rim job",
"rimjob",
"roach",
"robber",
"s and m",
"s&m",
"samckdaddy",
"sandm",
"satan",
"schlong",
"screw",
"screw you",
"screwyou",
"scrotum",
"semen",
"sex",
"sex farm",
"sex hound",
"sex house",
"sex kitten",
"sex pot",
"sex slave",
"sex to go",
"sex toy",
"sex toys",
"sex whore",
"sexfarm",
"sexhound",
"sexhouse",
"sexkitten",
"sexpot",
"sexslave",
"sextogo",
"sextoy",
"sextoys",
"sexual",
"sexwhore",
"sexy",
"sexy biatch",
"sexy bitch",
"sexy moma",
"sexy slim",
"sexymoma",
"sexy-slim",
"shag",
"shaggin",
"shagging",
"shawtypimp",
"shit",
"shit dick",
"shit eater",
"shit face",
"shit for brains",
"shit fuck",
"shit fucker",
"shit happens",
"shit head",
"shit out of luck",
"shit stain",
"shit4brains",
"shitdick",
"shiteater",
"shitface",
"shitforbrains",
"shitfuck",
"shitfucker",
"shithapens",
"shithappens",
"shithead",
"shitoutofluck",
"shits",
"shitstain",
"shitter",
"shitting",
"shitty",
"short fuck",
"shortfuck",
"showtime",
"six six six",
"sixsixsix",
"sixty 9",
"sixty nine",
"sixty9",
"sixtynine",
"skank",
"skank bitch",
"skank fuck",
"skank whore",
"skankbitch",
"skankfuck",
"skankwhore",
"skanky bitch",
"skanky whore",
"skankybitch",
"skankywhore",
"skin flute",
"skinflute",
"skum",
"skum bag",
"skumbag",
"slant",
"slant eye",
"slanteye",
"slave",
"slave driver",
"slavedriver",
"sleeze bag",
"sleeze ball",
"sleezebag",
"sleezeball",
"slide it in",
"slideitin",
"slime",
"slime ball",
"slime bucket",
"slimeball",
"slimebucket",
"slut",
"slut wear",
"slut whore",
"sluts",
"slutt",
"slutting",
"slutty",
"slutwear",
"slutwhore",
"smack daddy",
"smack the monkey",
"smackthemonkey",
"smagma",
"smart ass",
"snatch",
"snatch patch",
"snatchpatch",
"sniper",
"snot",
"sob",
"sodomite",
"sodomy",
"son of a bitch",
"sonofabitch",
"sonofbitch",
"spank the monkey",
"spankthemonkey",
"sperm",
"sperm bag",
"sperm hearder",
"sperm herder",
"spermacide",
"spermbag",
"spermhearder",
"spermherder",
"spic",
"spick",
"spit",
"spitter",
"split tail",
"split tial",
"splittail",
"stagg",
"strap on",
"strapon",
"stringer",
"strip club",
"stripclub",
"stroke",
"stroking",
"stupid",
"stupid fuck",
"stupid fucker",
"stupidfuck",
"stupidfucker",
"suck",
"suck dick",
"suck me",
"suck my ass",
"suck my dick",
"suck my tit",
"suck off",
"suckdick",
"sucker",
"suckme",
"suckmyass",
"suckmydick",
"suckmytit",
"suckoff",
"suicide",
"swallow",
"swallower",
"swalow",
"sweetness",
"swign dixx",
"swing dixx",
"swingin dixx",
"swinging dicks",
"syphilis",
"tampon",
"tang",
"testicle",
"testicles",
"third eye",
"third leg",
"thirdeye",
"thirdleg",
"three some",
"threesome",
"tit",
"tit bit nipply",
"tit fuck",
"tit fucker",
"tit fuckin",
"tit job",
"tit licker",
"tit lover",
"titbitnipply",
"titfuck",
"titfucker",
"titfuckin",
"titjob",
"titlicker",
"titlover",
"tits",
"titties",
"titty",
"toilet",
"toilet bowl",
"tongethruster",
"tongue",
"tongue thruster",
"tongue tramp",
"tonguethrust",
"tonguetramp",
"toung thruster",
"tounge baller",
"tounge thrust",
"trailer trash",
"trailertrash",
"tramp",
"tri sexual",
"triple x",
"triplex",
"trisexual",
"trojan",
"trots",
"tunnel of love",
"tunneloflove",
"turd",
"two bit whore",
"two on one",
"twobitwhore",
"unfuckable",
"up the ass",
"up the butt",
"upskirt",
"uptheass",
"upthebutt",
"urinate",
"urine",
"uterus",
"vagina",
"vaginal",
"vd",
"vibrater",
"vibrator",
"virgin",
"virgin breaker",
"virginbreaker",
"vulva",
"waysted",
"weenie",
"wet spot",
"wetspot",
"whacker",
"whiskey dick",
"whiskeydick",
"whisky dick",
"whiskydick",
"white trash",
"whitetrash",
"whore",
"whore fucker",
"whore house",
"whorefucker",
"whorehouse",
"wigger",
"willie wanker",
"williewanker",
"wuutang",
"xxx",
"yellow man",
"yellowman"
]
return existence_check(text, list, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/cursing/nword.py 0000644 0000000 0000000 00000001045 14611571711 017201 0 ustar 00 """On 'the N word'.
---
layout: post
source: Louis CK
source_url: https://youtu.be/dF1NUposXVQ?t=30s
title: the 'n-word'
date: 2014-06-10 12:31:19
categories: writing
---
Take responsibility with the shitty words you wanna say.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "cursing.nword"
msg = "Take responsibility for the shitty words you want to say."
list = [
"the n-word",
]
return existence_check(text, list, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/dates_times/__init__.py 0000644 0000000 0000000 00000000027 14554312110 020425 0 ustar 00 """Dates and times."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/dates_times/am_pm.py 0000644 0000000 0000000 00000002717 14611571711 017777 0 ustar 00 """a.m. / p.m.
---
layout: post
source: Garner's Modern American Usage
source_url: http://bit.ly/1T4alrY
title: a.m. & p.m.
date: 2014-06-10 12:31:19
categories: writing
---
"""
from proselint.tools import existence_check, memoize
@memoize
def check_lowercase_periods(text):
"""Check the text."""
err = "dates_times.am_pm.lowercase_periods"
msg = "With lowercase letters, the periods are standard."
return existence_check(text, [r"\d{1,2} ?[ap]m"], err, msg,
ignore_case=False)
@memoize
def check_spacing(text):
"""Check the text."""
err = "dates_times.am_pm.spacing"
msg = "It's standard to put a space before 'a.m.' or 'p.m.'."
return existence_check(text, [r"\d{1,2}[ap]\.?m\.?"], err, msg)
@memoize
def check_midnight_noon(text):
"""Check the text."""
err = "dates_times.am_pm.midnight_noon"
msg = ("12 a.m. and 12 p.m. are wrong and confusing."
" Use 'midnight' or 'noon'.")
return existence_check(text, [r"12 ?[ap]\.?m\.?"], err, msg)
@memoize
def check_redundancy(text):
"""Check the text."""
err = "dates_times.am_pm.midnight_noon"
msg = ("'a.m.' is always morning; 'p.m.' is always night.")
list = [
r"\d{1,2} ?a\.?m\.? in the morning",
r"\d{1,2} ?p\.?m\.? in the evening",
r"\d{1,2} ?p\.?m\.? at night",
r"\d{1,2} ?p\.?m\.? in the afternoon",
]
return existence_check(text, list, err, msg, join=True)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/dates_times/dates.py 0000644 0000000 0000000 00000003213 14611571711 017776 0 ustar 00 """Dates.
---
layout: post
source: Garner's Modern American Usage
source_url: http://bit.ly/1T4alrY
title: dates
date: 2014-06-10 12:31:19
categories: writing
---
Dates.
"""
import calendar
from proselint.tools import existence_check, memoize
@memoize
def check_decade_apostrophes_short(text):
"""Check the text for dates of the form X0's."""
err = "dates_times.dates"
msg = "Apostrophes aren't needed for decades."
regex = r"\d0\'s"
return existence_check(
text, [regex], err, msg, excluded_topics=["50 Cent"])
@memoize
def check_decade_apostrophes_long(text):
"""Check the text for dates of the form XXX0's."""
err = "dates_times.dates"
msg = "Apostrophes aren't needed for decades."
regex = r"\d\d\d0\'s"
return existence_check(text, [regex], err, msg)
@memoize
def check_dash_and_from(text):
"""Check the text."""
err = "dates_times.dates"
msg = "When specifying a date range, write 'from X to Y'."
regex = r"[fF]rom \d+[^ \t\n\r\f\va-zA-Z0-9_\.]\d+"
return existence_check(text, [regex], err, msg)
def check_month_year_comma(text):
"""Check the text."""
err = "dates_times.dates"
msg = "When specifying a month and year, no comma is needed."
regex = r"(?:" + "|".join(calendar.month_name[1:]) + r"), \d{3,}"
return existence_check(text, [regex], err, msg)
@memoize
def check_month_of_year(text):
"""Check the text."""
err = "dates_times.dates"
msg = "When specifying a month and year, 'of' is unnecessary."
regex = r"(?:" + "|".join(calendar.month_name[1:]) + r") of \d{3,}"
return existence_check(text, [regex], err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/hedging/__init__.py 0000644 0000000 0000000 00000000017 14554312110 017530 0 ustar 00 """Hedging."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/hedging/misc.py 0000644 0000000 0000000 00000001030 14611571711 016730 0 ustar 00 """Hedging.
---
layout: post
source: Pinker's book on writing
source_url: ???
title: hedging
date: 2014-06-10 12:31:19
categories: writing
---
Points out hedging.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Suggest the preferred forms."""
err = "hedging.misc"
msg = "Hedging. Just say it."
narcissism = [
"I would argue that",
", so to speak",
"to a certain degree",
]
return existence_check(text, narcissism, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/hyperbole/__init__.py 0000644 0000000 0000000 00000000021 14554312110 020107 0 ustar 00 """Hyperbole."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/hyperbole/misc.py 0000644 0000000 0000000 00000000742 14611571711 017325 0 ustar 00 """Hyperbolic language.
---
layout: post
source: ???
source_url: ???
title: hyperbolic language
date: 2014-06-10 12:31:19
categories: writing
---
Hyperbolic language.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "hyperbolic.misc"
msg = "'{}' is hyperbolic."
words = [
r"[a-z]*[!]{2,}",
r"[a-z]*\?{2,}"
]
return existence_check(text, words, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/inprogress/capitalization_errors.py 0000644 0000000 0000000 00000001315 14611571711 023200 0 ustar 00 """Password in plain text.
---
layout: post
source: ???
source_url: ???
title: Capitalization of abbreviations
date: 2014-06-10 12:31:19
categories: writing
---
In Hybrid Zones, p 255 in a citation Hughes & Huges Systems Experts and
Computers: The Systems Approach in Management and Engineering: World War Ii
and After.
World War Ii should have correct capitalization.
"""
from proselint.tools import blacklist, memoize
@memoize
def check(text):
"""Check the text."""
err = "MSC104"
msg = "Don't fail to capitalize roman numeral abbreviations."
pwd_regex = " (I(i*)|i*)"
password = [
f"World War{pwd_regex}",
]
return blacklist(text, password, err, msg)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/inprogress/example_check.py 0000644 0000000 0000000 00000000674 14611571711 021370 0 ustar 00 """First line is always wrong.
---
layout: post
source: Nobody
source_url: ???
title: Firse line is always wrong.
date: 2014-06-10 12:31:19
categories: writing
---
The first line always is always wrong.
"""
from proselint.tools import reverse
def check(text):
"""Check the text."""
error_code = "example.first"
msg = "First line always has an error."
reverse(text)
return [(1, 1, error_code, msg)]
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/jargon/__init__.py 0000644 0000000 0000000 00000000016 14554312110 017402 0 ustar 00 """Jargon."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/jargon/misc.py 0000644 0000000 0000000 00000001231 14611571711 016606 0 ustar 00 """Cliches.
---
layout: post
source: Garner's Modern American Usage
source_url: http://bit.ly/1T4alrY
title: a vs. an
date: 2014-06-10 12:31:19
categories: writing
---
Cliches are cliché.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "jargon.misc"
msg = "'{}' is jargon. Can you replace it with something more standard?"
jargon = [
"in the affirmative",
"in the negative",
"agendize",
"per your order",
"per your request",
"disincentivize",
]
return existence_check(text, jargon, err, msg, join=True)
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1706136648.4933596
proselint-0.14.0/proselint/checks/lexical_illusions/__init__.py 0000644 0000000 0000000 00000000031 14554312110 021641 0 ustar 00 """Lexical illusions."""
././@PaxHeader 0000000 0000000 0000000 00000000034 00000000000 010212 x ustar 00 28 mtime=1713828808.8087072
proselint-0.14.0/proselint/checks/lexical_illusions/misc.py 0000644 0000000 0000000 00000001374 14611571711 021060 0 ustar 00 """Lexical illusions.
---
layout: post
source: write-good
source_url: https://github.com/btford/write-good
title: Lexical illusion present
date: 2014-06-10 12:31:19
categories: writing
---
A lexical illusion is when a word word is unintentionally repeated twice, and
and this happens most often between line breaks.
"""
from proselint.tools import existence_check, memoize
@memoize
def check(text):
"""Check the text."""
err = "lexical_illusions.misc"
msg = "There's a lexical illusion here: a word is repeated."
regex = r"\b(?