动机
markdown的表格是有|符号和-符号的,而tsv文件是由Tab分隔的,每次复制tsv格式的内容来制作md表格时都需要添加|和-符号,因此写了一个小脚本来实现这一个过程。
基本思路
先用\n
切分得到每一行,对于每一行,用\t
切分,\t
可以换成其他的;
对于每一行切分后的每一个元素,使用|
连接成一个字符串,然后在字符串两端加上|
;
接着计算表格的列数,记为cols
,然后在表头下面加上cols
个对齐符号,然后用|
将这些对齐符号连接成一个字符串,最后两端各加上一个|
;
实现语言
因为我要在web端实现这个功能,通过表单接收输入,然后展示制作后的输出,所以采用PHP来实现这个功能。
输入输出与效果
输入为:
庙号姓名 年号与在位起止时间 在位时间(年) 主要事迹
太祖朱元璋 洪武(1368年——1398年) 31 建国
明惠帝朱允炆 建文(1399年——1402年) 4 削藩
输出为:
| 庙号姓名 | 年号与在位起止时间 | 在位时间(年) | 主要事迹 |
| ----- | ----- | ----- | ----- |
| 太祖朱元璋 | 洪武(1368年——1398年) | 31 | 建国 |
| 明惠帝朱允炆 | 建文(1399年——1402年) | 4 | 削藩 |
将输出复制到markdown编辑器中即可以显示成md表格了,显示效果如下:
庙号姓名 | 年号与在位起止时间 | 在位时间(年) | 主要事迹 |
---|---|---|---|
太祖朱元璋 | 洪武(1368年——1398年) | 31 | 建国 |
明惠帝朱允炆 | 建文(1399年——1402年) | 4 | 削藩 |
实现代码
/**
* return a array, each element is a array
* storing a line of the tsv file
*/
function read_tsv($file, $sep = "\t")
{
$data = [];
if (($handle = fopen($file, 'r')) != false) {
while (($line = fgetcsv($handle, 0, $sep)) != false) { // 若第一行为空,则$line中第一个元素为NULL
if(!empty($line[0])){
$data[] = $line;
}
}
fclose($handle);
}
return $data;
}
// 将内容存入tsv文件并读为二维数组
$content = $_POST['content']; //通过表单接收的输入,
$tmpfile = "tmp000000.tsv"; //存入tsv文件中
file_put_contents($tmpfile, $content);
$con = read_tsv($tmpfile); // read_tsv是我定义的函数
// 删除临时文件
$status = unlink($tmpfile);
$cols = count($con[0]);
//这里定义了markdown中左对齐、右对齐和居中对齐的三种写法
$center_align = '-----';
$left_align = ':-----';
$right_align = '-----:';
$result_array = array();
// 对每一行的每一个元素添加|
foreach($con as $line){
$tmp = implode(' | ', $line);
$tmp = '| '.$tmp.' |';
$result_array[] = $tmp;
}
// 获取md表格的第二行,即控制列数和对齐规则的那一行
$second_line = array_fill(0, $cols, $center_align);
$second_line = implode(' | ', $second_line);
$second_line = '| '.$second_line.' |';
// 将md表格第二行加入到result_array中
array_splice($result_array, 1, 0, $second_line);
// 输出原始输入的数组
echo "<br><b>您的输入表格为:</b><br>";
echo "<pre>$content</pre>";
// 输出结果数组
echo "<br><b>转换后的md表格为:</b><br>";
foreach ($result_array as $d) {
echo "<br> $d";
}