讓我們一起來(lái)起花名吧

原文:https://xcoder.in/2016/02/24/lets-hua/

起因

起因是我一個(gè)叫『小龍』的好基友由于某些原因離職去了一家跟阿里一樣有著『花名文化』的公司裙士,于是開(kāi)始為花名犯愁妈候。

結(jié)合之前妹紙『弍紓』在起花名的時(shí)候也遇到了同樣的困擾敞斋,于是決定用 Node.js 寫個(gè)『一本正經(jīng)亂起花名』的程序碍脏。

準(zhǔn)備

Chinese Random Name

首先起花名的原理就是胡亂隨機(jī)一串字出來(lái)胡亂拼膀钠。

于是準(zhǔn)備應(yīng)該有 chinese-random-name弊琴,一個(gè)隨機(jī)生成中文名的包蛤育。

使用它很簡(jiǎn)單荷逞,先把它 require 進(jìn)來(lái):

const randomName = require("chinese-random-name");

基本用法

如果你需要隨機(jī)生成一個(gè)名字只需要 randomName.generate() 就可以了道伟;如果你要隨機(jī)一個(gè)姓那么就 randomName.surnames.getOne()迹缀;如果你只需要獲得名字使碾,這里面就有點(diǎn)門道了。

高級(jí)用法

你可以隨機(jī)生成一個(gè)名(不帶姓的) randomName.names.get()祝懂;你也可以指定名字的字?jǐn)?shù)票摇,一二三:

randomName.names.get1();
randomName.names.get2();
randomName.names.get3();

或者!

又或者砚蓬!

然后或者矢门!

你可以指定每個(gè)字的五行哦!

什么意思呢灰蛙?比如你想給孩子起個(gè)名祟剔,然后孩子命里五行缺金,那么就可以:

randomName.names.get2("金金");

然后你就可能得到一個(gè)『紫銓』摩梧,兩個(gè)字都是屬金的物延。那么如果你孩子姓李,就叫李紫銓仅父;如果孩子姓王叛薯,就叫王紫銓;如果姓愛(ài)新覺(jué)羅笙纤,那么就叫愛(ài)新覺(jué)羅·紫銓耗溜。

有木有想給我裝得這個(gè)逼打個(gè) 82 分呢?剩下的就交給 666 吧省容。(? ??_??)?

Nomnom

這個(gè)包是用來(lái)解析命令行參數(shù)的抖拴。雖然市面上有挺多別的的,比如 commander 等腥椒,不過(guò)我還是最習(xí)慣 nomnom城舞,用稱手了就不想換了。

雖然它的 GitHub Repo 下面有這么一段話寞酿。

Nomnom is deprecated. Check out https://github.com/tj/commander.js, which should have most, if not all of the capability that nomnom had. Thank you!

不過(guò)再怎么說(shuō) nomnom 也是當(dāng)年 substack 大神推薦的啊。(?ω?)

Colorful

這個(gè)包是用來(lái)上色的脱柱。

畢竟五行是有顏色的哇伐弹。

const color = require("colorful");
console.log(color.red("(*/?\*)"));

那么在你的終端就好看到一個(gè)紅色的 (*/?\*)

Is Chinese

用來(lái)判斷是不是中文的包榨为。

作為一個(gè)起名的命令行程序,你總得好好傳參才行吧随闺,總不能你隨便傳個(gè)咸鴨蛋??我也好好處理吧。

于是就用 is-chinese 來(lái)判斷某個(gè)字符串是不是純中文龄句。

這個(gè)包是由前阿里小伙伴回论,CNode 站長(zhǎng)唐少寫的。

用起來(lái)也很簡(jiǎn)單分歇,只要 isChinese("什么你要判斷什么") 就可以了。

集合

$ npm install --save -d chinese-random-name
$ npm install --save -d nomnom
$ npm install --save -d colorful
$ npm install --save -d is-chinese

開(kāi)工

其結(jié)果在這里葬燎。

解析命令行參數(shù)

首先效果是這樣的:

$ hua --help

Usage: hua [options]

Options:
-p PREFIX, --prefix PREFIX          to specify a prefix.
-s SUFFIX, --suffix SUFFIX          to specify a suffix.
-5 WUXING, --five-elements WUXING   the file elements (Wuxing) of huaming.
-c COUNT, --count COUNT             the count of huaming  [10]

使用者可以自己想一個(gè)前綴或者后綴,然后自定義(或者也可以不指定)兩個(gè)字的五行缚甩,以及指定一次性生成多少個(gè)花名谱净。

比如想要生成以 字為前綴的花名擅威,就可以 $ hua --prefix 龍,得到結(jié)果可以是這樣的:

 * 龍幼
 * 龍巡
 * 龍躬
 * 龍仇
 * 龍錘
 * 龍鎰
 * 龍拾
 * 龍央
 * 龍些
 * 龍悠

如果想兩個(gè)字分別所屬金和誰(shuí)裕寨,就可以 $ hua --five-elements 金水 來(lái)起花名:

 * 倩娥
 * 雀效
 * 黍棓
 * 姹溶
 * 馨沙
 * 宮閑
 * 裕混
 * 俗封
 * 綢娥
 * 瑞淦

想要得到這樣一個(gè)命令行參數(shù)捻艳,我們可以用 nomnom 來(lái)解決庆猫。

var opts = require("nomnom")
    .script("hua")
    .option("prefix", {
        abbr: "p",
        help: "to specify a prefix.",
        metavar: "PREFIX"
    })
    .option("suffix", {
        abbr: "s",
        help: "to specify a suffix.",
        metavar: "SUFFIX"
    })
    .option("five-elements", {
        abbr: "5",
        help: "the file elements (Wuxing) of huaming.",
        metavar: "WUXING"
    })
    .option("count", {
        abbr: "c",
        help: "the count of huaming",
        metavar: "COUNT",
        default: 10
    })
    .parse();

上面的這段代碼分別指定了腳本名為 hua,然后指定了 prefix / suffix / five-elementscount 四個(gè)參數(shù)嘁字,并把解析好的參數(shù)賦值給 opts 變量杉畜。

由于我希望這個(gè)包在通常的 Node.js 下都可以跑,所以沒(méi)有用 let 之類的東西此叠。

花名類

接下去要寫一個(gè)花名類,這個(gè)類不只是可以在 CLI 之中使用猬错,也可以讓別人作為一個(gè)包來(lái)引入茸歧。然后實(shí)際上這個(gè)類就是要對(duì) chinese-random-name 進(jìn)行一個(gè)封裝。

構(gòu)造函數(shù)

var Hua = function(options) {
    this.options = options;

    // Do something...
};

首先這個(gè) options 就是之前由 nomnom 解析出來(lái)的參數(shù)逢唤,當(dāng)然有些參數(shù)是可選的。

接下去我們要在構(gòu)造函數(shù)也就是 Hua 里面格式化前綴或者后綴(如果有的話)智玻,將他們弄成只有一個(gè)漢字的格式遂唧。

if(options.prefix) {
    options.prefix = options.prefix[0];
    if(!isChinese(options.prefix)) delete options.prefix;
}

if(options.suffix) {
    options.suffix = options.suffix[0];
    if(!isChinese(options.suffix)) delete options.suffix;
}

前后綴弄好之后要對(duì)五行進(jìn)行分析了。

如果有前后綴那么忽略五行參數(shù)吊奢。

if(options.prefix && options.suffix) {
    delete options["file-elements"];
}

如果有前綴,那么忽略傳進(jìn)來(lái)的五行的第一個(gè)五行召边;如果有后綴那么忽略第二個(gè)字的五行裹驰。

var wuxing = "金木水火土";

.
.
.

} else if(options.prefix) {
    options["five-elements"] = options["five-elements"].substr(1, 1);
    if(-1 === wuxing.indexOf(options["five-elements"])) {
        delete options["five-elements"];
    }
} else if(options.suffix) {
    options["five-elements"] = options["five-elements"].substr(0, 1);
    if(-1 === wuxing.indexOf(options["five-elements"])) {
        delete options["five-elements"];
    }
}

如果前后綴都沒(méi)有,那么要格式化一下該參數(shù)贞盯,使其僅剩兩個(gè)有效的五行漢字沪饺。

} else {
    options["five-elements"] = options["five-elements"].substr(0, 2).split("");
    for(var i = 0; i < options["five-elements"].length; i++) {
        // 如果是無(wú)效五行或者冰沒(méi)有這個(gè)字的話,隨機(jī)一個(gè)五行出來(lái)
        if(-1 === wuxing.indexOf(options["five-elements"][i])) {
            options["five-elements"][i] = wuxing[Math.floor(Math.random() * 5)];
        }
    }

    // 字?jǐn)?shù)不夠件余,隨機(jī)來(lái)湊
    while(options["five-elements"].length < 2) {
        options["five-elements"].push(wuxing[Math.floor(Math.random() * 5)]);
    }

    options["five-elements"] = options["five-elements"].join("");
}

以上的這些邏輯都寫在構(gòu)造函數(shù)里面遭居,如果想要完整的構(gòu)造函數(shù)可以看 huahua.js 文件。

生成一個(gè)花名

生成一個(gè)花名其實(shí)就是調(diào)用 randomName.names.get 系列函數(shù)們了端壳。

  • 有前后綴:直接返回前綴加后綴枪蘑。
  • 有前綴:返回前綴加 get1
  • 有后綴:返回 get1 加后綴。
  • 沒(méi)有前后綴:直接返回 get2觅捆。

注意:以上情況都會(huì)傳進(jìn)(哪怕是 undefined)五行參數(shù)栅炒。

所以 generateOne 函數(shù)長(zhǎng)這樣

Hua.prototype.generateOne = function() {
    if(this.options.prefix && this.options.suffix) {
        return this.options.prefix + this.options.suffix;
    }

    if(this.options.prefix) {
        debug(this.options["five-elements"]);
        return this.options.prefix + randomName.names.get1(this.options["five-elements"]);
    }

    if(this.options.suffix) {
        debug(this.options["five-elements"]);
        return randomName.names.get1(this.options["five-elements"]) + this.options.suffix;
    }

    return randomName.names.get2(this.options["five-elements"]);
};

生成 Count 個(gè)花名

還記得 CLI 的 count 參數(shù)么术羔?因?yàn)闉榱朔奖阋依欤覀兛梢耘可苫跃托枰?Count 個(gè)花名的函數(shù)了寥殖。

實(shí)際上就是一個(gè)循環(huán)調(diào)用 generateOne 的函數(shù)而已涩蜘。

Hua.prototype.generate = function(count) {
    if(!count) count = this.options.count || 10;

    var result = [];
    for(var i = 0; i < count; i++) {
        result.push(this.generateOne());
    }
    return result;
};

CLI 文件

剛剛那個(gè) nomnom 解析就在這個(gè)文件里面,然后接下去就是實(shí)例化一個(gè) Hua 對(duì)象粤策,然后生成 count 個(gè)花名误窖。

var hua = new Hua(opts);
var result = hua.generate();

最后把花名輸出來(lái)就好了。

for(var i = 0; i < result.length; i++) {
    console.log(" * " + result[i]);
}

橋豆麻袋柔吼!

說(shuō)好的五行顏色呢吭服?!

好像是的哦艇棕,我們要在輸出之前給 result 上個(gè)色兒沼琉。

遍歷 result 里面的花名每個(gè)字,獲取它的五行屬性打瘪,然后涮上色兒。

chinese-random-name 暴露了字典中每個(gè)字的五行屬性彩扔,只需要賦值一下就好了僻爽。

var dict = require("chinese-random-name").names.dict;

然后逐一對(duì)比。最后對(duì)應(yīng)金木水火土的顏色值分別為:

var definedColors = [
    220, 83, 26, 197, 59
];

220 為黃色敦捧,代表金;83 為綠色习瑰,代表木秽荤;26 藍(lán)色代表水;197 紅色代表火王滤;59 灰色代表土。

如果那個(gè)字無(wú)法找到屬性第喳,則不上色踱稍,保持默認(rèn)。

result = result.map(function(name) {
    var withColor = "";

    for(var i = 0; i < 2; i++) {
        for(var j = 0; j < wuxing.length; j++) {
            var wx = wuxing[j];
            if(wx === " ") {
                withColor += name[i];
                break;
            }

            if(dict[wx].indexOf(name[i]) !== -1) {
                var color = new Color(name[i]);
                color.fgcolor = definedColors[j];
                withColor += color.toString();
                break;
            }
        }
    }

    return withColor;
});

至此我們的 CLI 就寫好了扩淀,最后別忘了在 hua 這個(gè) CLI 文件頂部加上一句話啤挎。

#!/usr/bin/env node

這代表到時(shí)候如果要 ./hua 的時(shí)候這個(gè)腳本是用 Node.js 來(lái)跑的。

收拾

本來(lái)想好好寫篇起花名的牢騷胜臊,結(jié)果不知不覺(jué)寫成了給初心者看的初級(jí)教程了伙判,淚目 ( ??? ? ??? )

不嫌棄的就這么看看吧。

最后這里給出我寫好的這個(gè) hua 程序勒魔。

$ [sudo] npm install -g huaming

然后就能在命令行下面跑了菇曲,跑法上面幾章有介紹過(guò)。它的 Repo 在這里弟胀。

最后希望這個(gè)包在你們起花名的時(shí)候還真有那么一丟丟的用處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垃帅,隨后出現(xiàn)的幾起案子贸诚,更是在濱河造成了極大的恐慌,老刑警劉巖酱固,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件运悲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡班眯,警方通過(guò)查閱死者的電腦和手機(jī)署隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)违崇,“玉大人羞延,你說(shuō)我怎么就攤上這事肴楷≤牛” “怎么了臭家?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渗钉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)声离,這世上最難降的妖魔是什么瘫怜? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮赠涮,結(jié)果婚禮上笋除,老公的妹妹穿的比我還像新娘炸裆。我一直安慰自己,他們只是感情好嗤瞎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布贝奇。 她就那樣靜靜地躺著靠胜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陕习。 梳的紋絲不亂的頭發(fā)上址愿,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音损合,去河邊找鬼娘纷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛律适,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捂贿,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厂僧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起白魂,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤福荸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后敬锐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體径玖,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颤介,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年滚朵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韵吨。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡移宅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盏浇,到底是詐尸還是另有隱情芽狗,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布滴劲,位于F島的核電站,受9級(jí)特大地震影響鲁捏,放射性物質(zhì)發(fā)生泄漏萧芙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一动羽、第九天 我趴在偏房一處隱蔽的房頂上張望渔期。 院中可真熱鬧,春花似錦疯趟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至磷账,卻和暖如春贾虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓬豁。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工地粪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玩敏。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像织阳,于是被迫代替她去往敵國(guó)和親砰粹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理弄痹,服務(wù)發(fā)現(xiàn)嵌器,斷路器,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • 1庇谆、引言 數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中表、字段等的命名規(guī)范也算是設(shè)計(jì)規(guī)范的一部分饭耳,不過(guò)設(shè)計(jì)規(guī)范更多的是為了確保數(shù)據(jù)庫(kù)設(shè)計(jì)的合理...
    SnowflakeCloud閱讀 40,961評(píng)論 0 48
  • 前言 人生苦多寞肖,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin新蟆! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,163評(píng)論 9 118
  • 哈哈哈哈哈 人臉毀所有吮螺,請(qǐng)忽略不計(jì) 學(xué)以致用是我學(xué)習(xí)思維導(dǎo)圖的目標(biāo) 本周就依然按照此方法練習(xí)新概念課文背誦 感覺(jué)比...
    RubyWei1314閱讀 1,049評(píng)論 0 0