diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..99cf5ff --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.*~ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git "a/CuteMarkEd\345\256\236\347\216\260.html" "b/CuteMarkEd\345\256\236\347\216\260.html" new file mode 100644 index 0000000..10255c4 --- /dev/null +++ "b/CuteMarkEd\345\256\236\347\216\260.html" @@ -0,0 +1,260 @@ + + + + +CuteMarkEd markdown编辑器实现(一) + + + + + + + + + +
+

CuteMarkEd markdown编辑器实现(一)

+
+

Table of Contents

+ +
+ +
+

界面

+
+
+

主界面

+
+

+通过主界面文件mainwindow.ui,可以看到主界面由文件浏览界面,markdown编辑器部件,HTML preview(source view),目录结构部件及 +及markdown语法帮助部件组成,其中, +

+ +
    +
  • 文件浏览界面,目录结构部件及markdown 语法帮助部件都是docWidget,可以移动隐藏的 +
  • +
  • Html preview和source view是个tabWdiget,只可以同时显示一个,通过点击状态栏实现切换。 +
  • +
  • markdown编辑器继承自QPlainTextEdit,编辑器的功能比较简洁(弱)。 +
  • +
  • 实现了常见的菜单,比如文件,编辑,查看,其他额外功能菜单和帮助菜单。文件菜单里,缺少一个最近打开 +文件的菜单,后面可以看到是通过代码加进去的。 +
  • +
  • 通过比对,CuteMarkEd最终运行的主界面,可以发现还有显示行号,自动补全,markdown语法高亮等功能 +
  • +
+

+后面继续分析代码实现。 +

+ +
    +
  • markdown editor的textChanged信号连接到了MainWindow的plainTextChanged槽。 +
  • +
+ +

+*主界面代码实现 +

+
+
+ +
+

mainwindow的构造函数

+
+
    +
  • 首先调用ui->setupUi构建ui文件生成的部件 +
  • +
  • 调用MainWindow的成员函数setupUi连接MainWindow内部件之间的信号槽,设置菜单栏Action的快捷键 +
  • +
+

+,设置状态栏,设置各docWdiget的初始显示状态,读取配置 +

+
    +
  • 最后根据配置初始化程序 +
  • +
+
+
+ +
+

plainTextChanged槽

+
+

+plainTextChanged槽在editor的textChanged信号被触发后被调用,先来看看它的大致实现。 +

+ +
    +
  • 获取editor的内容 +
  • +
  • 设置统计单词标签 +
  • +
  • 调用html生成器(generator)的markdownTextChanged成员函数,生成HTML。(后面继续分析) +
  • +
  • 设置文档被修改 +
  • +
+
+
+ +
+

显示html文档

+
+

+generator生成完html后,会发送htmlResultReady的信号,调用MainWindow的htmlResultReady +槽,设置html文档现实在webveiw和htmlSourceTextEdit中。 +

+ + +

+以上就是markdown editor最简单的结构流程,后续继续分析其他功能,比如editor的语法高亮,generator +生成Html的过程,editor的单词自动补全,html的语法高亮,editor和webview之间的位置同步等。 +

+
+
+
+
+
+

Author: walter

+

Created: 2015-11-21 六 22:08

+

Emacs 24.5.1 (Org mode 8.2.10)

+

Validate

+
+ + diff --git "a/CuteMarkEd\345\256\236\347\216\260\344\272\214.html" "b/CuteMarkEd\345\256\236\347\216\260\344\272\214.html" new file mode 100644 index 0000000..a517ce1 --- /dev/null +++ "b/CuteMarkEd\345\256\236\347\216\260\344\272\214.html" @@ -0,0 +1,246 @@ + + + + +CuteMarkEd HTML生成器实现 + + + + + + + + + +
+

CuteMarkEd HTML生成器实现

+
+

Table of Contents

+ +
+ + +
+

HtmlPreviewGenerator类实现

+
+

+HtmlPreviewGenerator继承自QThread类,重新实现了run成员函数。在MainWindow初始化时,调用了 +generator的start成员函数,自此生成HTML的动作在新线程里完成。根据配置选用不同的markdown编译器。 +成员: +

+
    +
  • tasks 是一个QString队列,用于存储editor送过来的文本 +
  • +
  • tasksMutex 是一个QMutex互斥量,用于保护对tasks的访问 +
  • +
  • bufferNotEmpty 是QWaitCondition对象,用于在队列为空时,阻塞,队列有数据时,唤醒线程。 +
  • +
+
+ +
+

run函数

+
+

+run函数本身是个死循环。 +

+
    +
  • 首先通过通过QMutexLocker对taskMutex加锁,QMutexLocker的实现遵循了RAII,在函数推出时, +
  • +
+

+自动释放锁。 +

+
    +
  • 如果tasks为空,则调用bufferNotEmpty的wait成员函数,线程阻塞,同时释放taskMutex。 +
  • +
  • 如果tasks不为空,则文本出队。 +
  • +
  • 如果对列为空,删除原来的文本,重新生成文本(document) +
  • +
  • 根据生成的文本,生成Html和TOC(目录) +
  • +
+
+
+ +
+

生成文本队列

+
+

+根据之前阅读代码,在editor的textChanged信号发出后,MainWindow的plainTextChanged被调用 +,这个SLOT调用了generator的markdownTextChanged成员函数。这个函数首先对tasksMutex加锁, +然后把文本入对,唤醒阻塞的线程。 +

+
+
+
+ +
+

converter类的实现

+
+

+以DiscountMarkdownConverter为例: +构造函数什么也没做,实现了继承自MarkdownConverter的虚函数createDocument,此函数返回一个 +DiscountMarkdownDocument对象。DiscountMarkdownDocument的实现也遵循RAII,在析构函数中 +mkdcleanup生成的文本。DiscountmarkdownDoucument继承自MarkdownDocument,其中 +MarkdownDocument的析构函数为虚函数,在销毁MarkdownDocument(delete document)的时候,会 +调用子类的析构函数。 +

+ +

+generator的generateHtmlFromMarkdown成员函数根据mkdcompile返回的document,生成html +字符串,这个字符串其实只包含html的body,并不包含最终的html头部。 +

+ +

+HtmlTemplate的renderAsHtml最终把用到的js及css和html头全部汇合到一起。生成完完整的html后, +发送htmlResultReady信号。这个信号由MainWindow接着,开始设置webView和htmlSourceTextEdit +,显示出来。 +

+
+
+
+
+

Author: walter

+

Created: 2015-11-25 三 19:41

+

Emacs 24.5.1 (Org mode 8.2.10)

+

Validate

+
+ + diff --git a/Qt5_Ui.html b/Qt5_Ui.html index 44ba57d..7b7a3e8 100644 --- a/Qt5_Ui.html +++ b/Qt5_Ui.html @@ -4,7 +4,7 @@ Qt5 UI文件使用 - + @@ -252,7 +252,7 @@

signal-slot自动关联

Author: walter

-

Created: 2015-11-01 日 19:57

+

Created: 2015-11-21 六 22:08

Emacs 24.5.1 (Org mode 8.2.10)

Validate

diff --git a/index.html b/index.html index 3819165..d691645 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ 首页 - + @@ -140,6 +140,10 @@

首页

Author: walter

-

Created: 2015-11-01 日 19:57

+

Created: 2015-11-25 三 19:41

Emacs 24.5.1 (Org mode 8.2.10)

Validate

diff --git "a/\347\254\254\344\270\200\347\257\207\345\215\232\345\256\242.html" "b/\347\254\254\344\270\200\347\257\207\345\215\232\345\256\242.html" index fc54b2c..01a647a 100644 --- "a/\347\254\254\344\270\200\347\257\207\345\215\232\345\256\242.html" +++ "b/\347\254\254\344\270\200\347\257\207\345\215\232\345\256\242.html" @@ -4,7 +4,7 @@ 第一篇博客 - + @@ -145,7 +145,7 @@

第一篇博客

Author: walter

-

Created: 2015-11-01 日 19:57

+

Created: 2015-11-21 六 22:08

Emacs 24.5.1 (Org mode 8.2.10)

Validate