在Mac电脑上为Dash制作docSet文档

Dash是mac上的一款查看API的工具,里面可以直接下载大部分的API文档,但是有时候我们如果想把自己手里已有的文档也集成到Dash中,就需要我们自己动手了,其实Dash官方也有教程如何制作docSet的,地址是:http://kapeli.com/docsets  (7. Any HTML Documentation)
, 本文是我照着官方的教程,把流程步骤一步一步的记录下来的,大家可以参考一下。

Dash所需的文档都是docSet文件,其实docSet文件就是一个文件夹而已,这个文件夹里面放了最终的html文档,以及根据这些html建好的索引(索引是放在sqlite数据库中),很简单。

下文我以mysql5.1官方的中文文档(html)为例,来说明如何根据html文档一步步创建docSet

1. 从mysql的官网上下载5.1的html中文文档,下载地址为: http://downloads.mysql.com/docs/refman-5.1-zh.html-chapter.zip , 下载后解压缩,会发现里面全都是一些html文件,其中有2个需要关注,一个index.html,一个是ix01.html,第一个是首页的目录,第二个是所有的索引列表,这2个文件里基本上包括了所有的mysql索引,我们后面就要把这2个文件里的内容按dash要求的格式来建立索引。

2. 建立文件夹。本例中我们创建的文档就叫mysql51吧,所以按下列结构创建目录:

mkdir -p mysql51.docset/Contents/Resources/Documents/

3. 把所有的html文档拷贝到Documents文件夹中。

4. 在mysql51.docset/Contents/中创建Info.plist文件,注意文件名的大小写,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>dashIndexFilePath</key>
	<string>index.html</string>
	<key>CFBundleIdentifier</key>
	<string>mysql51</string>
	<key>CFBundleName</key>
	<string>mysql51</string>
	<key>DocSetPlatformFamily</key>
	<string>mysql51</string>
	<key>isDashDocset</key>
	<true/>
</dict>
</plist>

可以看到这个文件就是一个xml文件,里面都是一对一对的key-string配置项,其中:dashIndexFilePath这个key对应的string是index.html,表示在Dash中点击你的文档后,默认的主页是什么,其他的key表示你创建的文档名字和关键字之类的,我这里都写成了mysql51.

5. 创建sqlite索引。索引文件的位置是:mysql51.docset/Contents/Resources/docSet.dsidx
,Mac电脑已经预装了sqlite,所以直接从命令行进入Resources文件夹,在命令行中敲:

sqlite3 docSet.dsidx

这样就进入了sqlite数据库,接下来,创建数据表:

CREATE TABLE searchIndex(id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT);

完成以后敲:.exit 就可以退出sqlite了,这时候你会看到在Resources目录下已经有了一个docSet.dsidx文件,后续我们的索引都会放到刚才创建的searchIndex表中。(在sqlite中输入".exit"就可以退出了,其他命令可以输入".help"查看)

官方教程中其实在创建表以后还创建了一个unique index,我们这里不能这么搞,后面会讲到,我们的文档一个key有多个索引,所以不能是unique。

6. 接下来就是往searchIndex表中插数据了,SQL模板是:

INSERT OR IGNORE INTO searchIndex(name, type, path) VALUES (‘name‘, ‘type‘, ‘path‘);

其中name就是我们的关键字,比如你想在dash中输入一个select就可以查询,那这个select就是关键字;type是关键字的类型,官方支持的有很多,什么Class,Function,Keyword等,我这里偷了个懒,全部用Keyword了;path就是我们的具体文件名称了,可以是带锚点的形式,如:client-side-scripts.html#mysqladmin。

7. 把所有的索引数据都插入到searchIndex以后,docSet文档就制作好了,直接双击mysql51.docSet就可以导入Dash了。

下面说说怎么通过html文件制作索引并插入到sqlite数据库,Dash的官方教程中提供了很多脚本,有python,ruby,php,oc,nodejs等,其实你用什么语言都可以,只要能生成一份sql文件,在sqlite中通过.read 命令导入就行。 让我们用php来尝试一次吧,因为mysql有2个索引文件,一个index.html,一个是ix01.html,我写了2个php的脚本,就是输出一大堆sql:

<?php

header('Content-type: text/html; charset=utf-8');
echo "<meta charset='utf-8'/>";
$dom = new DomDocument;
@$dom->loadHTMLFile("/Users/xxx/Desktop/docSet/mysql51.docset/Contents/Resources/Documents/index.html");

foreach ($dom->getElementsByTagName("a") as $a) {
	$href = $a->getAttribute("href");
	if (substr($href, 0, 1) == ".") continue;
	if (substr($href, 0, 5) == "http:") continue;

	$name = trim($a->nodeValue);
	$name = trim(preg_replace("#\s+#", "", preg_replace("#^([A-Z0-9–]+\.)+#", "", $name)));
	if (empty($name)) continue;
	$class = "Keyword";
	$links[$name] = true;
	echo "INSERT INTO searchIndex(name, type, path) VALUES ('". $name . "','". $class ."','". $href ."');<br/>";
}
?>

<?php

header('Content-type: text/html; charset=utf-8');
echo "<meta charset='utf-8'/>";
$dom = new DomDocument;
@$dom->loadHTMLFile("/Users/bokix/Desktop/docSet/mysql51.docset/Contents/Resources/Documents/ix01.html");

foreach ($dom->getElementsByTagName("dt") as $a) {
	$name = $a->nodeValue;
	//echo "$name";
	//echo "<br/>";
	//echo "===================$name <br/>";
	$children = $a->childNodes;
	if($children->length == 1){
		//echo $name . "has no child <br/>";
		continue;
	}
	 for($i = 0; $i < $children->length; $i++)
    	{
            	$child = $children->item($i);
    		if($i==0){
    			$name = trim($child->nodeValue);
    			if(substr($name,-3) == ","){
    				$name = substr($name,0,$name->length-3);
    			}
                                    //$name = mysql_real_escape_string($name);
    		}
            	if($child->nodeName !="a"){
            		//echo "[".$child->nodeValue . "]not a anchor <br/>";
            		continue;
            	}

            	 $href = $child->getAttribute("href");
            	 $hrefName=trim($child->nodeValue);
            	 $class = "Keyword";

                        //$hrefName = mysql_real_escape_string($hrefName);

            	 echo "INSERT  INTO searchIndex(name, type, path) VALUES ('". $name . "','". $class ."','". $href ."');<br/>";
            	 echo "INSERT  INTO searchIndex(name, type, path) VALUES ('". $hrefName . "','". $class ."','". $href ."');<br/>";

      	}

}

?>

运行以后屏幕上会输出一堆堆sql语句,分别保存到2个文件里,比如说1.sql和2.sql,这里需要注意下,sqlite对于单引号的转义是在单引号前面再加一个单引号,和其他sql不同,而我们的索引html里面,有些name本身就是带有"\‘"(斜杠加单引号)的,所以你要手工改一下,还好就2个地方,在sql文件里搜索:\‘ , 在单引号前再加一个单引号。

sql文件生成以后,把2个sql文件拷贝到docSet.dsidx的目录,开始导入sqlite吧:

sqlite3 docSet.dsidx
.read 1.sql
.read 2.sql

如果sql正确执行,屏幕上不会输出什么,如果输出一大堆sql语句,那说明sql有问题,翻到第一条,看看什么错误,然后修改下重新导入,如果你怕导重复了,也可以把searchIndex表清空然后重新导入。

这是我生成的几个sql例子:

INSERT INTO searchIndex(name, type, path) VALUES ('OCT()','Keyword','functions.html#string-functions');
INSERT INTO searchIndex(name, type, path) VALUES ('字符串函数','Keyword','functions.html#string-functions');
INSERT INTO searchIndex(name, type, path) VALUES ('OCTET_LENGTH()','Keyword','functions.html#string-functions');
INSERT INTO searchIndex(name, type, path) VALUES ('字符串函数','Keyword','functions.html#string-functions');
INSERT INTO searchIndex(name, type, path) VALUES ('ODBC','Keyword','connectors.html#odbc-connector');
INSERT INTO searchIndex(name, type, path) VALUES ('MySQL Connector/ODBC','Keyword','connectors.html#odbc-connector');
INSERT INTO searchIndex(name, type, path) VALUES ('partitioning types','Keyword','partitioning.html#partitioning-types');
INSERT INTO searchIndex(name, type, path) VALUES ('分区类型','Keyword','partitioning.html#partitioning-types');
时间: 2024-07-30 13:51:54

在Mac电脑上为Dash制作docSet文档的相关文章

在mac电脑上写入文件到NTFS格式的移动硬盘的解决办法

需求背景: 今天我在Mac电脑A上下载了11G的资料,想传给Mac电脑B,试用了AirPort.文件共享.远程操作等,传输速度都慢得要死,虽然是在同一个局域网下,两台电脑挨的非常的近,但是还是传得超级慢,慢到无法忍受,因此就想我何不用移动硬盘拷贝呢,于是乎找来移动硬盘. 复制资料.向移动硬盘里粘贴,发现无效,粘贴不进去,无法在移动硬盘里创建文件夹.于是google了一番,原来硬盘是NTFS格式的,mac os原生不支持写入权限.继续寻找解决办法,发下如下2篇文章最靠谱: 这2个文章中一个就可以解

在Mac电脑上为iPhone或iPad录屏的方法

在以前的Mac和iOS版本下,录制iPhone或者iPad屏幕操作是一件稍微复杂的事情.但是随着Yosemite的出现,在Mac电脑上为iPhone或iPad录屏的方法就变得简单了.下面就介绍一下具体的操作步骤: 操作系统的准备 Mac电脑:需要升级到Yosemite及其以上版本; iPhone或者iPad:需要升级到iOS8及其以上版本; 操作的步骤 1.首先将iPhone设备与Mac电脑连接; 2.打开QuickTime,选择“文件->新建影片录制”;或者快捷键“Option + Comma

mac电脑上的卸载工具?iTrash附注册机的macOS卸载程序

mac电脑上的卸载工具?iTrash是一个macOS卸载程序,点击这里可以安装附带注册机的版本,它使用称为"Levenshtein距离算法"的特殊搜索算法来查找所有相关文件并将其删除.这是因为许多(尽管不是全部)应用程序在整个系统中安装了多个文件和文件夹,这意味着删除应用程序本身并不足以确保您摆脱一切. iTrash Mac特色 1.鬼模式背景模式.将东西放入垃圾桶并弹出iTrash.2.专家模式使用Levenshtein距离搜索算法,它可以追踪更多可能的相关文件.3.简单的拖放将应用

PHP制作pdf文档方法

本篇博客是在看完 php+mysql web书以后自己的测试代码,虽然是测试代码,但不是简单的粘贴复制,为了学习thinkPHP框架,自己就用这个来做的,而且这本书已经有年头了.原书的代码中的方法,在查阅手册的时候,很多都已经弃用了,所以分享给大家还是有必要的.php制作pdf文档的方法有很多,我写的只是其中一种,大家有时间可以多看看.好了,进入正题 准备工作: 1.php手册(在线php关于pdf地址: http://php.net/manual/zh/intro.pdf.php ) 2.PD

Core Web API上使用Swagger提供API文档

在ASP.NET Core Web API上使用Swagger提供API文档 我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页面后,在IISExpress启动Web API站点后,会自动重定向到API文档页面,非常方便.这不仅让我能够快速省查API设计的合理性,同时从API的使用角度也为我自己提供了便捷.下图就是我的博客系统RESTful API

反射机制--调用构造函数和成员方法、制作帮助文档

今天学习了关于反射的相关知识,通过反射可以找到类中的构造方法和所有的成员方法.而并不了解这个类的构造的人可以很方便的运用反射机制. 掌握发射主要了解这几个类,类位于java.long.reflect包中: Class类:代表一个 类 Constructor类:代表累的构造方法 Field类:代表类中的成员变量 Method类:代表类的方法 import java.lang.reflect.*; /** 这是一个反射机制的例子实例,包括如何利用反射找到无参.有参的构造方法,以及其他方法. @aut

关于如何利用Pocket CHM Pro制作帮助文档

关于如何利用Pocket CHM Pro制作帮助文档 编写人:CC阿爸 2015-4-6 今天在这里,我想与大家一起分享如何利用Pocket CHM Pro制作软件系统的帮助文档,在此做个小结,以供参考.有兴趣的同学,可以一同探讨与学习一下,否则就略过吧.   1. 首先给大家看看我制作好后的帮助文档.   如何还算漂亮吧.很多代码在里面,很方便查阅. 2. 下面我们就看看如何利用这个工具制作自己满意的帮助文档 1)         首先大家可以在我们的技术群中,找到该软件. 2)       

zedboard zynq 学习 sobel 边缘检测 IP核 制作 根据 文档 Xapp890

官方文档http://www.xilinx.com/support/documentation/application_notes/xapp890-zynq-sobel-vivado-hls.pdf 准备工作 下载 工程文件 http://pan.baidu.com/s/1eQqwjBk 这是我用百度云分享的 如果不行了, 可以用 官方链接 https://secure.xilinx.com/webreg/clickthrough.do?cid=193509 sobel 算子边缘检测原理 这里不

[转载]linux上用PHP读取WORD文档

在linux上用PHP读取WORD文档,其实是使用了 antiword程序把word文档转化为txt文档. 再使用php执行系统命令调用而已. 具体操作如下: 1.安装antiword 官方站:http://www.winfield.demon.nl/ 下载地:http://www.winfield.demon.nl/linux/antiword-0.37.tar.gz 下载完,解压,进入目录 使用命令 make && make install 即可完成安装. 安装时,自动安装到了/roo