在Freenom注册了几个免费域名,域名必须正常使用状态才可以免费使用,否则有可能被官方强制收回。所以就用Scala写了这个小项目,用来生成符合Hexo标准的Markdown文章,使用Hexo渲染层HTML后,把网站文件上传到Github并绑定域名,这样就算域名是正常使用了。

首先从网上找了一个词典的文件,可以看到这个词典文件每一行是一个词,有三列,分别是词语,拼音,编号。我们需要的仅仅是词,拼音和编号可以抛弃不用。

image-20200530120155177

实际思路是,把每一行放在作为一个元素放在一个List中,然后单个元素按照’\t’分隔,取第一个元素,其他的丢弃。这样就组成了一个List词典,只需要随机取用即可。实现代码如下:

1
2
3
4
5
6
7
8
val stream = TitleMock.getClass.getResourceAsStream("/1.txt")

// 剥离出词语组成一个List
val list: List[String] = Source.fromInputStream(stream)("UTF8").getLines.toList.map {
f => {
f.split("\t").toList.head
}
}

既然是文言文那肯定离不开之乎者也这类的虚词,找了一些虚词放到数组中:

1
val array: Array[String] = Array("而", "何", "乎", "乃", "其", "且", "然", "若", "所", "为", "焉", "也", "以", "矣", "于", "之", "则", "者", "与", "欤", "因", "兮")

把实词和虚词拼接,组成句子,句子组成段落,段落组成文章。关键实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (j <- 1 to para) {
var article: String = ""
for (i <- 1 to 100) {

article += list(math.abs(Random.nextInt) % shiSize) + array(math.abs(Random.nextInt) % xuSize)
if (i != 100 && math.abs(Random.nextInt) % 2 == 0) {
if (math.abs(Random.nextInt) % 3 == 0)
article += ","
else
article += "。"
}
}
article = prefix + article + suffix + "\n\n"
cont += article
}

生成文章的标题:

1
2
3
4
5
6
7
8
9
10
//文言文虚词
val array: Array[String] = Array("论", "行", "说", "颂", "学", "经", "序", "辞", "铭", "记", "赋")
//虚词的数量
val xuSize = array.length

var title: String = ""
while (title.length == 0 || title.length >= 3) {
title = list(math.abs(Random.nextInt) % shiSize)
}
title + array(math.abs(Random.nextInt) % xuSize)

标题和文章都有了,那么拼接在一起写入一个文本文件中即可,引入Java的IO的三个类,java.io.{File, FileOutputStream, OutputStreamWriter},关键实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 随机出来一个近20年的时间点
val ran = Random.nextInt()
val year = 1980 + math.abs(ran % 39)
val month = 1 + math.abs(ran % 12)
val day = 1 + math.abs(ran % 28)

val now = LocalDate.of(year, month, day) + " " + LocalTime.now().toString.dropRight(4)


// 这是markdown文章的前缀
val pre = "---\n" + "title: " + title + "\ndate: " + now + "\ntags: \n" + "---\n\n"

// 输出文章路径output文件夹,如果没有就创建
val myPath: File = new File("./output")
if (!myPath.exists()){//若此目录不存在,则创建之
myPath.mkdir()
}

val fos : FileOutputStream = new FileOutputStream(s"./$myPath/$title.md")
val osw : OutputStreamWriter = new OutputStreamWriter(fos, "UTF-8")

// 写入文章
osw.write(pre + totalArticle)
osw.close()
fos.close()

具体生成文章效果:

image-20200530122545640

使用Hexo渲染后(具体实现查考Hexo官网),网站代码放到Github并开启gh-pages服务,预览文章 https://impn.github.io/ClassicalChineseGenerator/

到此为止,一个完整的文言文网站已经生成。

image-20200530123103874

项目已经开源,完整代码放在Github,项目地址 ,可以直接下载在Release页面下载Jar包使用。

具体使用方法:

1
javr -jar ClassicalChineseGenerator-0.1.1.jar 10

后面的数值参数是生成10篇文章,如果不加参数默认是生成1篇。