leijun 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- leijun/__init__.py +5 -0
- leijun/cli.py +130 -0
- leijun/quotes.py +198 -0
- leijun-0.1.0.dist-info/METADATA +82 -0
- leijun-0.1.0.dist-info/RECORD +9 -0
- leijun-0.1.0.dist-info/WHEEL +5 -0
- leijun-0.1.0.dist-info/entry_points.txt +3 -0
- leijun-0.1.0.dist-info/licenses/LICENSE +21 -0
- leijun-0.1.0.dist-info/top_level.txt +1 -0
leijun/__init__.py
ADDED
leijun/cli.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"""命令行入口:雷军 <语录前半句> → 输出后半句。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import io
|
|
7
|
+
import random
|
|
8
|
+
import sys
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from difflib import get_close_matches
|
|
11
|
+
from typing import Iterable, List, Optional
|
|
12
|
+
|
|
13
|
+
from . import __version__
|
|
14
|
+
from .quotes import PUNCTUATION, QUOTES
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Quote:
|
|
19
|
+
full: str
|
|
20
|
+
norm: str # 去掉标点空白后的句子,用于匹配
|
|
21
|
+
positions: List[int] # norm 中第 i 个字符在 full 中的下标
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _normalize(text: str) -> tuple[str, List[int]]:
|
|
25
|
+
chars: List[str] = []
|
|
26
|
+
positions: List[int] = []
|
|
27
|
+
for index, char in enumerate(text):
|
|
28
|
+
if char in PUNCTUATION:
|
|
29
|
+
continue
|
|
30
|
+
chars.append(char.lower())
|
|
31
|
+
positions.append(index)
|
|
32
|
+
return "".join(chars), positions
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
QUOTE_BANK: List[Quote] = []
|
|
36
|
+
for _full in QUOTES:
|
|
37
|
+
_norm, _positions = _normalize(_full)
|
|
38
|
+
QUOTE_BANK.append(Quote(full=_full, norm=_norm, positions=_positions))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _cut(quote: Quote, matched_len: int) -> str:
|
|
42
|
+
"""从 full 中截掉前 matched_len 个(归一化后的)字符,返回剩下的部分。"""
|
|
43
|
+
if matched_len >= len(quote.positions):
|
|
44
|
+
return quote.full
|
|
45
|
+
return quote.full[quote.positions[matched_len]:].lstrip("".join(PUNCTUATION))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def find_quote(prefix: str, bank: Iterable[Quote] = QUOTE_BANK) -> Optional[str]:
|
|
49
|
+
"""按前半句匹配,返回后文;匹配不到返回 None。"""
|
|
50
|
+
key, _ = _normalize(prefix)
|
|
51
|
+
if not key:
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
bank = list(bank)
|
|
55
|
+
|
|
56
|
+
# 1) 从头匹配;多条命中取最短的那条(最具体)
|
|
57
|
+
hits = [q for q in bank if q.norm.startswith(key)]
|
|
58
|
+
if hits:
|
|
59
|
+
best = min(hits, key=lambda q: len(q.norm))
|
|
60
|
+
return _cut(best, len(key))
|
|
61
|
+
|
|
62
|
+
# 2) 中间命中(用户只记得关键词)
|
|
63
|
+
hits = [q for q in bank if key in q.norm]
|
|
64
|
+
if hits:
|
|
65
|
+
best = min(hits, key=lambda q: len(q.norm))
|
|
66
|
+
start = best.norm.index(key)
|
|
67
|
+
return _cut(best, start + len(key))
|
|
68
|
+
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def suggest(prefix: str, bank: Iterable[Quote] = QUOTE_BANK, limit: int = 5) -> List[str]:
|
|
73
|
+
key, _ = _normalize(prefix)
|
|
74
|
+
if not key:
|
|
75
|
+
return []
|
|
76
|
+
candidates = [q.norm for q in bank]
|
|
77
|
+
norm_map = {q.norm: q.full for q in bank}
|
|
78
|
+
return [norm_map[n] for n in get_close_matches(key, candidates, n=limit, cutoff=0.3)]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
82
|
+
parser = argparse.ArgumentParser(
|
|
83
|
+
prog="雷军",
|
|
84
|
+
description="给出雷军语录的前半句,还你后半句。",
|
|
85
|
+
epilog="示例:雷军 金光闪闪的五个字 → 友商是傻逼",
|
|
86
|
+
)
|
|
87
|
+
parser.add_argument("prefix", nargs="*", help="语录的前半部分,可以不带引号直接写")
|
|
88
|
+
parser.add_argument("-l", "--list", action="store_true", help="列出全部语录")
|
|
89
|
+
parser.add_argument("-r", "--random", action="store_true", help="随机说一句")
|
|
90
|
+
parser.add_argument("-V", "--version", action="version", version=f"雷军 {__version__}")
|
|
91
|
+
return parser
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _use_utf8_output() -> None:
|
|
95
|
+
"""重定向到管道/文件时 Windows 默认用 GBK 编码,中文会乱码,统一成 UTF-8。"""
|
|
96
|
+
for stream in (sys.stdout, sys.stderr):
|
|
97
|
+
if isinstance(stream, io.TextIOWrapper):
|
|
98
|
+
stream.reconfigure(encoding="utf-8")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def main(argv: Optional[List[str]] = None) -> int:
|
|
102
|
+
_use_utf8_output()
|
|
103
|
+
args = build_parser().parse_args(argv)
|
|
104
|
+
|
|
105
|
+
if args.list:
|
|
106
|
+
for quote in QUOTE_BANK:
|
|
107
|
+
print(quote.full)
|
|
108
|
+
return 0
|
|
109
|
+
|
|
110
|
+
if args.random or not args.prefix:
|
|
111
|
+
print(random.choice(QUOTE_BANK).full)
|
|
112
|
+
return 0
|
|
113
|
+
|
|
114
|
+
prefix = " ".join(args.prefix)
|
|
115
|
+
answer = find_quote(prefix)
|
|
116
|
+
if answer is not None:
|
|
117
|
+
print(answer)
|
|
118
|
+
return 0
|
|
119
|
+
|
|
120
|
+
print(f"雷总没说过「{prefix}」。", file=sys.stderr)
|
|
121
|
+
hints = suggest(prefix)
|
|
122
|
+
if hints:
|
|
123
|
+
print("相近的有:", file=sys.stderr)
|
|
124
|
+
for hint in hints:
|
|
125
|
+
print(f" {hint}", file=sys.stderr)
|
|
126
|
+
return 1
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if __name__ == "__main__":
|
|
130
|
+
raise SystemExit(main())
|
leijun/quotes.py
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""雷军语录库。
|
|
2
|
+
|
|
3
|
+
每条语录存完整句子,CLI 通过"前半句"匹配,输出后面的部分。
|
|
4
|
+
改语录只改这个文件,匹配逻辑不用动。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# 标点与空白:匹配时一律忽略,输出时从原句里取,保留原有标点
|
|
8
|
+
PUNCTUATION = set(
|
|
9
|
+
",。!?、;:“”‘’()《》【】…—·,.!?;:\"'()<>[]-_~/\\ \t\n\r"
|
|
10
|
+
" "
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
QUOTES = [
|
|
14
|
+
"金光闪闪的五个字,友商是傻逼",
|
|
15
|
+
"站在风口上,猪都能飞起来",
|
|
16
|
+
"永远相信美好的事情即将发生",
|
|
17
|
+
"厚道的人运气不会太差",
|
|
18
|
+
"小米为发烧而生",
|
|
19
|
+
"让每个人都能享受科技的乐趣",
|
|
20
|
+
"感动人心,价格厚道",
|
|
21
|
+
"生死看淡,不服就干",
|
|
22
|
+
"专注、极致、口碑、快",
|
|
23
|
+
"性价比是商业圣经",
|
|
24
|
+
"不服跑个分",
|
|
25
|
+
"Are you OK? I'm fine, thank you, and you?",
|
|
26
|
+
"这是我人生中最后一次创业,我愿意押上我人生全部的声誉",
|
|
27
|
+
"我40岁之前一事无成",
|
|
28
|
+
"梦想还是要有的,因为40岁那年我实现了它",
|
|
29
|
+
"小米要做的不是一家硬件公司,而是一家互联网公司",
|
|
30
|
+
"库存是万恶之源",
|
|
31
|
+
"硬件综合净利率永远不超过5%",
|
|
32
|
+
"要做一家伟大的公司,顺便赚点钱",
|
|
33
|
+
"我们只做一款产品,把它做到极致",
|
|
34
|
+
"产品是王道,其他都是扯淡",
|
|
35
|
+
"快,是一种态度",
|
|
36
|
+
"屌爆了",
|
|
37
|
+
"碉堡了",
|
|
38
|
+
"我不是天才,我只是一个普通人",
|
|
39
|
+
"努力到无能为力,拼搏到感动自己",
|
|
40
|
+
"永远不要低估一颗想赢的心",
|
|
41
|
+
"我这个人比较较真",
|
|
42
|
+
"风口上的猪也能飞,但风停了摔死的还是猪",
|
|
43
|
+
"小米要做中国的无印良品",
|
|
44
|
+
"50万以内最好看、最好开、最智能的车",
|
|
45
|
+
"我决定造车,是深思熟虑的结果",
|
|
46
|
+
"和用户交朋友,做用户心中最酷的公司",
|
|
47
|
+
"我们的征途是星辰大海",
|
|
48
|
+
"手机行业没有秘密,只有效率",
|
|
49
|
+
"把朋友搞得多多的,把敌人搞得少少的",
|
|
50
|
+
"小米的使命是让全球每个人都能享受科技带来的美好生活",
|
|
51
|
+
"我所有的向往,都在这个产品里",
|
|
52
|
+
"这TM是我做过最好的产品",
|
|
53
|
+
"我All in了",
|
|
54
|
+
"年轻人的第一台电视,年轻人的第一台空调",
|
|
55
|
+
"不要用战术上的勤奋,掩盖战略上的懒惰",
|
|
56
|
+
"一年干一件事,十年干十件事",
|
|
57
|
+
"天下武功,唯快不破",
|
|
58
|
+
"做产品要克制,少即是多",
|
|
59
|
+
"我们不是为了打败谁,我们是为了做出好产品",
|
|
60
|
+
"感谢友商,让我们变得更强",
|
|
61
|
+
"我雷军,说到做到",
|
|
62
|
+
"50万以内最好的,之一",
|
|
63
|
+
"晚安,敖鲁古雅",
|
|
64
|
+
"这个世界终究不是强者恒强,后来者总有机会",
|
|
65
|
+
"这他妈绝对是来捣乱的",
|
|
66
|
+
"要大成,一定要找到能让猪飞上天的台风口。勤奋、努力加坚持等等,这些只是成功的必要条件,最关键的是在对的时候做对的事情。",
|
|
67
|
+
"我有一句话被大量误读,我说站在台风口猪都会飞。所以,大家把我定位成机会主义者。我说你见过一个 27 年永远在 IT 潮头的机会主义者吗?",
|
|
68
|
+
"我说我这个人是以执着见长,以坚持见长,绝对不是一个机会主义者。",
|
|
69
|
+
"光有勤奋和努力是远远不够的,还需要多花时间琢磨风向。",
|
|
70
|
+
"所有成功的背后 85% 是运气。如果你没有成功,只是运气不好,你要坚持不懈。",
|
|
71
|
+
"顺势而为,不要强求,不要蛮干,顺了,自然就成了。",
|
|
72
|
+
"我们一定要办一个轻轻松松的公司。顺势而为,登到山顶看到风景很漂亮,将山顶上的石头往下踢,这是小米要做的事情。",
|
|
73
|
+
"如果小米是把一个一千公斤的石头运到山顶上,那一定没有现在的精神面貌。",
|
|
74
|
+
"智能电动汽车,智能才是灵魂,汽车的智能化才刚刚开始。",
|
|
75
|
+
"其实,汽车是百年赛道,只要真心想干,任何时候开始,都是最好的时机。",
|
|
76
|
+
"我们不干肯定输;不试试,怎么就知道我们干不成呢?",
|
|
77
|
+
"55 岁,正是闯的年纪。",
|
|
78
|
+
"你只需努力,其他的交给天意。",
|
|
79
|
+
"从迷茫到蜕变,有时隔着万水千山,有时只隔了一层窗户纸。",
|
|
80
|
+
"极致,就是把自己逼疯,把别人憋死。",
|
|
81
|
+
"口碑的真谛是超越用户的期望值。",
|
|
82
|
+
"免费就是价格战的极致。",
|
|
83
|
+
"互联网不是一种技术,而是一种方法论。",
|
|
84
|
+
"做 100 款手机的风险远远大于做 1 款手机的风险。",
|
|
85
|
+
"快速迭代,不断试错,逐步走向成功的彼岸。这是互联网时代的王道。",
|
|
86
|
+
"创业初期,海量广告容易砸出虚假繁荣,掩盖一些本质问题。坚持口碑传播,相信好产品会说话!",
|
|
87
|
+
"公司一旦慢下来,很多问题都会暴露出来。",
|
|
88
|
+
"一百份报告也替代不了与一个真实用户面对面沟通。",
|
|
89
|
+
"优秀的公司赚取利润,伟大的公司赢得人心。",
|
|
90
|
+
"小米三大铁律:技术为本、性价比为纲、做最酷的产品。",
|
|
91
|
+
"竞争并非你死我活,而是让用户有更好体验。",
|
|
92
|
+
"用户喜欢才最重要,把东西做好最重要。",
|
|
93
|
+
"做高端一定要有耐心,用户认可需要一个过程!",
|
|
94
|
+
"高端无短板,从参数领先到体验优先,软硬件深度融合。",
|
|
95
|
+
"参数到顶、DXO 全球第一,并不代表拍照好,更不代表用户满意。",
|
|
96
|
+
"手感是最重要的用户体验,虽然不在参数表上,也很难说清楚好在哪里,但用户一上手,就能立刻体会到。",
|
|
97
|
+
"只有懂摄影、爱摄影,才能真正做好影像。",
|
|
98
|
+
"懂一行,爱一行,才能做好这一行。",
|
|
99
|
+
"小米努力的方向是“易上手,难精通”,全力设计高品质高性能的发烧手机。",
|
|
100
|
+
"小米也绝对成不了苹果,因为乔爷是神,是我们顶礼膜拜的偶像。",
|
|
101
|
+
"我 18 岁的时候就是乔粉,我从来没有奢望过自己能成为乔爷第二。",
|
|
102
|
+
"找人不是三顾茅庐,找人要三十次顾茅庐。",
|
|
103
|
+
"如果找不到人,首先应该反思一下,找人在自己的时间表里占了多大的比重。",
|
|
104
|
+
"创始人每天要花足够多的时间去找人。",
|
|
105
|
+
"一个人可能走得更快,但一群人走,才能走得更远。",
|
|
106
|
+
"一个人能力再强,也是有限的,找互补的朋友一起干,更容易成功。",
|
|
107
|
+
"你在面试牛人的时候,牛人也在面试你。",
|
|
108
|
+
"我们尽量少雇人,对这些人却有一个要求:前两三百人,全部十年以上经验。因为只有这样的经验,才能使一个公司高速发展而不翻车。",
|
|
109
|
+
"人,对于我们这样一个高效率的公司来说,是我们最重要的资产。",
|
|
110
|
+
"董事长该干啥?主要有三点:什么时候点做什么样的事情,这决定了公司的方向和战略;用什么样的人来干这件事情,寻找德才兼备的人不容易;怎么让人有动力愿意打仗,怎么样能够把事情做成。",
|
|
111
|
+
"做好这个位置,最重要的是看人看事的眼光,是经验、阅历和胸怀。",
|
|
112
|
+
"留住人要做好四点:打造利益共同体;将培养真正落到实处;用人要懂得包容;要能取信于团队。",
|
|
113
|
+
"一支真心热爱汽车的团队,一定有能力把车做好。",
|
|
114
|
+
"可以背靠背信任,才能应对之后无数的考验。",
|
|
115
|
+
"无论什么样的企业,要想找到优秀的人都很困难,解决这个问题只有两种办法:创始人每天花足够多时间去找人;把现有产品和业务做好,展示公司未来的发展空间。",
|
|
116
|
+
"办公司太不容易了,光有技术是不够的,还有太多东西要学,尤其是商业方面的基本功。",
|
|
117
|
+
"虽千万人,吾往矣。",
|
|
118
|
+
"破釜沉舟的勇气,才是我们冲出重围的关键。",
|
|
119
|
+
"勇气不是喊口号,而是每一步脚踏实地的行动。",
|
|
120
|
+
"勇气,并非没有恐惧,而是面对恐惧,依然坚定不移。",
|
|
121
|
+
"勇气,来自坚定的信念,奔涌不息的热情,还有,每一步的脚踏实地。",
|
|
122
|
+
"勇气,就是人类最伟大的赞歌!",
|
|
123
|
+
"如果这件事必须干,如果大家觉得我合适,为了小米,我愿意挺身而出!",
|
|
124
|
+
"每个深夜,当我鼓足勇气,准备大干一场;第二天早上醒来,太阳升起的时候,我又迷茫了。",
|
|
125
|
+
"创业这么苦,我真的还要从头再干一次吗?创业风险这么大,万一输了,我这辈子就要灰溜溜的收场吗?",
|
|
126
|
+
"一个人对奇迹的信念,永远是一个奇迹能够产生的首要前提。",
|
|
127
|
+
"无论面对何等巨大的危机,都不能被吓倒。",
|
|
128
|
+
"只有坚持做难而正确的事情,我们才能走得更远,小米汽车才能真正成功。",
|
|
129
|
+
"小米造车,要尊重行业规律,先守正,再出奇,不要盲目追求颠覆。",
|
|
130
|
+
"不要一上来就颠覆,一上来就掀桌子。",
|
|
131
|
+
"不走捷径,不收购、不代工,从核心技术做起,十倍投入,认认真真造一辆好车。",
|
|
132
|
+
"钱,全部自己掏;风险,全部自己扛。",
|
|
133
|
+
"我们要有勇气把价钱定到 21.59 万,这个价钱比 Model 3 已经便宜 3 万,非常有竞争力。",
|
|
134
|
+
"小米作为一个新来者,只要能顺利上牌桌,就是巨大的成功。",
|
|
135
|
+
"人生值得被奖励,这就是 Dream Car 的意义。",
|
|
136
|
+
"他们不甘于平庸,还在为梦想奋斗;他们向往先进的科技,渴望幸福的生活;他们心中有火,眼里有光。",
|
|
137
|
+
"人生从来不是爽文,而是不断突围的历程。靠什么披荆斩棘?我的答案是——勇气。",
|
|
138
|
+
"我们选择了做最难的纯电轿车,我们选择了从底层核心技术做起,我们选择在项目压力最大的时候,停下来开 21 天的会,这一切,都需要巨大的勇气与决心。",
|
|
139
|
+
"我还有足够的体力和精力,杀入一个全新的行业吗?",
|
|
140
|
+
"99% 的问题,都有标准答案,找个懂的人问问。",
|
|
141
|
+
"遇到问题,第一时间找个懂的人问问。",
|
|
142
|
+
"知识不全是线性的,大部分是网状的,知识点之间不一定有绝对的先后关系。",
|
|
143
|
+
"遇到实在看不懂的,先跳过去,咬着牙往下读,像看小说一样,坚持从头读到尾。",
|
|
144
|
+
"敢想敢干非常重要,年轻人要有年轻人的魄力,很多事情没有想象得那么复杂,去试试就知道了。",
|
|
145
|
+
"只有认知突破,才能带来真正的成长。这就是近十年来我最大的收获。",
|
|
146
|
+
"人生是一场马拉松,一时一刻的成败得失,都不那么重要。",
|
|
147
|
+
"所有的人生难题,你都将在成长中找到答案。",
|
|
148
|
+
"人因梦想而伟大,又因坚持梦想而成长。",
|
|
149
|
+
"愿你历经岁月洗礼,梦想依旧熠熠生辉。",
|
|
150
|
+
"只有脚踏实地的成长,才有足够的自信、勇气与决心,去迎接所有未知的挑战。",
|
|
151
|
+
"梦想的力量极其强大,我想尽办法,把各种不可能的事情,变成了可能。",
|
|
152
|
+
"终身学习就是要靠自学能力。",
|
|
153
|
+
"梦想得想办法拆解成一个又一个可实现的目标,然后竭尽全力去实现。",
|
|
154
|
+
"复盘就是回答三个关键问题:“做对了什么?做错了什么?重来一遍,该怎么做?”",
|
|
155
|
+
"你所经历的所有挫折、失败,甚至那些看似毫无意义消磨时间的事情,都将成为你最宝贵的财富。",
|
|
156
|
+
"人生很长,无论如何,让我们保持信念:永远相信美好的事情即将发生。",
|
|
157
|
+
"成功往往不是规划出来的,危机是你想不到的机会。",
|
|
158
|
+
"人在压力大的时候,会经常走歪路。",
|
|
159
|
+
"失败本身不可怕,正视自己内心的恐惧,才是关键。",
|
|
160
|
+
"真正的阻碍,往往是我们内心对失败的恐惧。",
|
|
161
|
+
"对我们来说,难的不仅仅是技术,更难的是,经历惨败后,如何克服内心的恐惧,如何鼓起勇气重新开始干。",
|
|
162
|
+
"只有发自内心的热爱,百折不挠的坚持,才能创造奇迹。",
|
|
163
|
+
"改变,本身就是希望——路可以重新走,梦可以重新做,未来可以重新书写。",
|
|
164
|
+
"改变,更是一种信念——敢于破局,豁达乐观,始终相信更美好的明天。",
|
|
165
|
+
"最好的投资,就是投资自己。",
|
|
166
|
+
"不要怕做选择,干了再说。",
|
|
167
|
+
"好的选择,往往不那么理智或精明,现实之外,不妨多一点天真。",
|
|
168
|
+
"不要在乎别人的冷嘲热讽,相信你选择的最重要的事。",
|
|
169
|
+
"焦虑是因为你看到了更大的世界,而你的能力还不足以应对。",
|
|
170
|
+
"芯片是小米走向成功的必由之路。",
|
|
171
|
+
"自研手机 SoC,做中低端完全没机会;只有做最高端,才有一线生机。",
|
|
172
|
+
"假如现在放弃,10 年后我们是会为公司的账上多了几百个亿而庆幸?还是会为小米这家公司永远失去芯片业务而后悔?",
|
|
173
|
+
"退一万步,最终我们没有成功,也将为小米培养一支强大的芯片研发队伍,也将彻底地改变这家公司的质地。",
|
|
174
|
+
"凭实力赢得尊重,改变全球汽车工业对中国汽车的印象。",
|
|
175
|
+
"全球顶尖的科技巨头,最终几乎都成了芯片的巨头。",
|
|
176
|
+
"这两天像一场梦。",
|
|
177
|
+
"机会一定要试一试,其实试错的成本并不高,而错过的成本非常高。",
|
|
178
|
+
"人生是艺术品,所以根本不存在完美的人生,因为每个人对于完美的定义不尽相同。",
|
|
179
|
+
"创业就是干别人没有干过的事情,干别人干过了但没有干成的事情。",
|
|
180
|
+
"一个非常优秀的创业者往往都是离经叛道的、那种很夸张的人。他有挑战一切的勇气。",
|
|
181
|
+
"我鼓励创业者要能够挑战权威,颠覆现有规则,这才是成功的经验。",
|
|
182
|
+
"很多创业者想轻轻松松成功,如果你想过很舒服的日子,最好不要创业。",
|
|
183
|
+
"创新的本质是不惧失败的勇气!",
|
|
184
|
+
"创新还需要一个大环境:全社会理解失败者,宽容失败者。",
|
|
185
|
+
"我不需要反思,我只需要用 20 年时间证明。",
|
|
186
|
+
"柳传志 40 岁创业,任正非 43 岁创业,我 40 岁重新开始,也没什么大不了的。",
|
|
187
|
+
"我不认为自己是成功者,也不认为自己是失败者,我只是在追求内心的一些东西,在路上。",
|
|
188
|
+
"成功不是别人觉得你成功就是成功,成功是一种内心深处的自我感受。",
|
|
189
|
+
"创业三原则:热爱你所做的事;做事情时要挑选足够大的池塘、足够大的事;勤奋和努力是必要条件。",
|
|
190
|
+
"任何成功,勤奋和努力是必要条件。如果没有一个最低 6×12 小时的勤奋和努力,为什么你会成功呢?",
|
|
191
|
+
"这就应了中国的古话:天道酬勤。",
|
|
192
|
+
"谷歌很伟大,但谷歌不懂电商,我自己已经做了十年电商。",
|
|
193
|
+
"长江后浪推前浪,前浪死在沙滩上,这就是人类社会进步的动力。",
|
|
194
|
+
"1999,交个朋友。",
|
|
195
|
+
"军儿,收手吧,外面都是 XX。",
|
|
196
|
+
"千亿 CEO 给我开车门。",
|
|
197
|
+
"这真徕卡!",
|
|
198
|
+
]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: leijun
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: 雷军语录命令行工具:给出前半句,还你后半句
|
|
5
|
+
Author: YG
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/YG/leijun
|
|
8
|
+
Keywords: leijun,leijun-quotes,quotes,cli,雷军,语录
|
|
9
|
+
Classifier: Environment :: Console
|
|
10
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
11
|
+
Classifier: Natural Language :: Chinese (Simplified)
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Games/Entertainment
|
|
14
|
+
Classifier: Topic :: Utilities
|
|
15
|
+
Requires-Python: >=3.9
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Dynamic: license-file
|
|
19
|
+
|
|
20
|
+
# 雷军 · leijun
|
|
21
|
+
|
|
22
|
+
雷军语录命令行工具。给它一句语录的前半句,它把后半句还给你。
|
|
23
|
+
|
|
24
|
+
```shell
|
|
25
|
+
$ 雷军 金光闪闪的五个字
|
|
26
|
+
友商是傻逼
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 安装
|
|
30
|
+
|
|
31
|
+
```shell
|
|
32
|
+
pip install leijun
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
装完同时得到两个命令:`雷军` 和 `leijun`(`雷军` 在某些终端里不好打,用 `leijun` 一样)。
|
|
36
|
+
|
|
37
|
+
## 用法
|
|
38
|
+
|
|
39
|
+
```shell
|
|
40
|
+
雷军 金光闪闪的五个字 # 友商是傻逼
|
|
41
|
+
雷军 站在风口上 # 猪都能飞起来
|
|
42
|
+
雷军 永远相信美好的事情 # 即将发生
|
|
43
|
+
雷军 生死看淡 # 不服就干
|
|
44
|
+
雷军 are you ok # I'm fine, thank you, and you?
|
|
45
|
+
雷军 -l # 列出全部语录
|
|
46
|
+
雷军 -r # 随机说一句
|
|
47
|
+
雷军 -V # 版本
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
匹配规则:
|
|
51
|
+
|
|
52
|
+
- 忽略标点、空格、大小写,`站 在风口上!` 一样能对上。
|
|
53
|
+
- 只给关键词也行,比如 `雷军 猪都能飞起来` 会把整句还给你。
|
|
54
|
+
- 前半句同时命中多条时,取最短那条(最具体的那条)。
|
|
55
|
+
- 没这句的时候退出码为 1,并给出相近语录提示。
|
|
56
|
+
|
|
57
|
+
## 加语录
|
|
58
|
+
|
|
59
|
+
改 `src/leijun/quotes.py` 里的 `QUOTES` 列表就行,一条一个完整句子,标点怎么写输出就怎么出。
|
|
60
|
+
|
|
61
|
+
## 开发
|
|
62
|
+
|
|
63
|
+
```shell
|
|
64
|
+
python -m venv .venv
|
|
65
|
+
.venv\Scripts\python -m pip install -e . # Windows
|
|
66
|
+
python -m unittest discover -s tests # 测试
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 发布到 PyPI
|
|
70
|
+
|
|
71
|
+
```shell
|
|
72
|
+
pip install build twine
|
|
73
|
+
python -m build # 产出 dist/*.tar.gz 和 dist/*.whl
|
|
74
|
+
twine check dist/*
|
|
75
|
+
twine upload dist/* # 需要 PyPI API token
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`pyproject.toml` 里 `name = "leijun"` 是 PyPI 上的包名,到 pypi.org 搜一下有没有被占;被占了就改成 `leijun-cli` 之类,命令名不受影响。
|
|
79
|
+
|
|
80
|
+
## License
|
|
81
|
+
|
|
82
|
+
MIT
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
leijun/__init__.py,sha256=SdehpOzhvxESCZAEj-eTykj6zCWzcvqJu9-sXHz0Ixs,87
|
|
2
|
+
leijun/cli.py,sha256=9JYUSbUvjCLjj7SMh3FbaqzfJJ7i-QwbcKCo7is7Pf0,4090
|
|
3
|
+
leijun/quotes.py,sha256=hMmgjyYlsGaI35CZgwDLnK4cxDtdWKVd4O5GINiV2so,15159
|
|
4
|
+
leijun-0.1.0.dist-info/licenses/LICENSE,sha256=2JYKj4Uei1JHvKDY5iA9WReUkyPZG55P6r0GPK1cfB0,1059
|
|
5
|
+
leijun-0.1.0.dist-info/METADATA,sha256=Yl-D3e2-3S7_HyHzdzwKpVTWqj5l_4YDOK7RTFo3z2M,2560
|
|
6
|
+
leijun-0.1.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
|
|
7
|
+
leijun-0.1.0.dist-info/entry_points.txt,sha256=M0wzR9HOegm7R9mRs7xeGLxJs1QhBf3BjJYMRg6xcUg,68
|
|
8
|
+
leijun-0.1.0.dist-info/top_level.txt,sha256=zyFGFhBt9dCYI7xMreUUmr6ryInSlDgoYfggdrWun68,7
|
|
9
|
+
leijun-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 YG
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
leijun
|