2025-05-16 18:00:22 +04:00

244 lines
6.5 KiB
Python

import argparse
from .random_word import RandomWord, NoWordsToChoseFrom
from .random_sentence import RandomSentence
from .cmdline import WonderwordsCommandLine
def main():
parser = argparse.ArgumentParser(
prog="wonderwords",
description="""Generate random words and sentences from the command line.
Here is a full list of available commands. To learn more about each
command, go to the documentation at https://wonderwords.readthedocs.io
""",
epilog="""Thanks to all contributors who made this possible.
To contribute, go to https://github.com/mrmaxguns/wonderwordsmodule
""",
)
#
# Base commands
#
parser.add_argument(
"-w",
"--word",
"--random-word",
action="store_true",
help="generate a random word",
)
parser.add_argument(
"-f",
"--filter",
action="store_true",
help="filter a list of words matching the criteria specified",
)
parser.add_argument(
"-l",
"--list",
action="store",
type=int,
help="return a list of words of a certain length",
)
parser.add_argument(
"-s",
"--sentence",
action="store",
type=str,
choices=[
"bb",
"ss",
"bba",
"s",
],
help="return a sentence based on the structure chosen",
)
parser.add_argument(
"-v",
"--version",
action="store_true",
help="Print the version number and exit"
)
#
# Settings and modifiers
#
parser.add_argument(
"-sw",
"--starts-with",
action="store",
default="",
type=str,
help="specify what string the random word(s) should start with",
)
parser.add_argument(
"-ew",
"--ends-with",
action="store",
default="",
type=str,
help="specify what string the random word(s) should end with",
)
parser.add_argument(
"-p",
"--parts-of-speech",
action="store",
type=str,
nargs="+",
# The plural forms will be removed in version 3
choices=["noun", "verb", "adjective", "nouns", "verbs", "adjectives"],
help=(
"specify to only include certain parts of speech (by default all"
" parts of speech are included)"
),
)
parser.add_argument(
"-min",
"--word-min-length",
action="store",
type=int,
help="specify the minimum length of the word(s)",
)
parser.add_argument(
"-max",
"--word-max-length",
action="store",
type=int,
help="specify the maximum length of the word(s)",
)
parser.add_argument(
"-r",
"--regex",
"--re",
"--regular-expression",
action="store",
type=str,
help=(
"specify a python-style regular expression that every word must"
" match"
),
)
parser.add_argument(
"-d",
"--delimiter",
default=", ",
type=str,
help=(
"Specify the delimiter to put between a list of words, default is"
" ', '"
),
)
args = parser.parse_args()
mode = get_mode(args)
handle_mode(mode, args)
def get_mode(arguments):
if arguments.version:
MODE = "version"
elif arguments.word:
MODE = "word"
elif arguments.filter:
MODE = "filter"
elif arguments.list is not None:
MODE = "list"
elif arguments.sentence is not None:
MODE = "sentence"
else:
MODE = None
return MODE
def handle_mode(mode, arguments): # noqa: C901
command_line = WonderwordsCommandLine()
if mode == "version":
command_line.version()
quit()
if mode == "word" or mode == "filter" or mode == "list":
word_parser = RandomWord()
if mode == "sentence":
sent_parser = RandomSentence()
if mode == "word":
try:
word = word_parser.word(
starts_with=arguments.starts_with,
ends_with=arguments.ends_with,
include_categories=arguments.parts_of_speech,
word_min_length=arguments.word_min_length,
word_max_length=arguments.word_max_length,
regex=arguments.regex,
)
except NoWordsToChoseFrom:
command_line.no_word()
quit()
command_line.word(word)
elif mode == "filter":
words = word_parser.filter(
starts_with=arguments.starts_with,
ends_with=arguments.ends_with,
include_categories=arguments.parts_of_speech,
word_min_length=arguments.word_min_length,
word_max_length=arguments.word_max_length,
regex=arguments.regex,
)
command_line.words(words, delimiter=arguments.delimiter)
elif mode == "list":
try:
words = word_parser.random_words(
amount=arguments.list,
starts_with=arguments.starts_with,
ends_with=arguments.ends_with,
include_categories=arguments.parts_of_speech,
word_min_length=arguments.word_min_length,
word_max_length=arguments.word_max_length,
regex=arguments.regex,
)
except NoWordsToChoseFrom:
command_line.no_words()
words = word_parser.random_words(
amount=arguments.list,
starts_with=arguments.starts_with,
ends_with=arguments.ends_with,
include_categories=arguments.parts_of_speech,
word_min_length=arguments.word_min_length,
word_max_length=arguments.word_max_length,
return_less_if_necessary=True,
regex=arguments.regex,
)
command_line.words(words, delimiter=arguments.delimiter)
elif mode == "sentence":
if arguments.sentence == "bb":
command_line.sentence(sent_parser.bare_bone_sentence())
elif arguments.sentence == "ss":
command_line.sentence(sent_parser.simple_sentence())
elif arguments.sentence == "bba":
command_line.sentence(sent_parser.bare_bone_with_adjective())
else:
command_line.sentence(sent_parser.sentence())
else:
command_line.intro()
if __name__ == "__main__":
main()