Commit 5646304b authored by 魔法少女赵志辉's avatar 魔法少女赵志辉 🍊
Browse files

完成了文档预览器的Project1的草稿。

parent df9ca65c
\documentclass{dreamClass}
\def\CC{ {C\nolinebreak[4]\hspace{-.05em}\raisebox{.4ex}{\small\bf ++}} }
\usepackage[most]{tcolorbox}
\newenvironment{note}
{\begin{center}
\em
\begin{tcolorbox}[colback=gray!5,
colframe=black,
width=.9\textwidth,
arc=1mm, auto outer arc,
boxrule=0.5pt,
]
}
{
\end{tcolorbox}
\end{center}
}
\title{
\vspace{-50pt}
\textbf{\Huge Project1}\\
\textbf{\huge 文档预览器}\\
\small Version 0.1.0\\
\text{\color{red}此文档尚未经过助教和老师的审核,只作草稿使用。}
}
\author{刘添翼\thanks{\href{mailto:tyi.liu@outlook.com}{tyi.liu@outlook.com}}}
\affil{计算机科学与技术系,南京大学}
\date{\today}
\begin{document}
\maketitle
\thispagestyle{empty}
\section{最后期限}
Project1的最后期限是\textbf{北京时间2021年10月10日23时59分}
在此之前,每位同学需要提交课程项目的源码、可执行文件和项目报告到待定的某个指定地点。
\section{概述}
各位同学来到南京大学计算机系学习,想必写过很多课程作业和实验报告。
这些作业和报告,可以统称是文档。
写文档时所用的语言,
可能是纯文本;
可能是某种带标记的文本,即所谓标记语言,比如Markdown或者\LaTeX{}
也可能是(看起来就不像一般文本的)Microsoft Word…
而用这些语言写成的文档,则分别有不同的扩展名,如\texttt{.txt}\texttt{.md}\texttt{.tex}\texttt{.docx}
考虑预览这些文档的正确姿势。
纯文本的话可以用任何一个文本编辑器,比如\emph{记事本}
Markdown和\LaTeX{}格式的文件虽然也可以用记事本打开,但文档中夹杂有很多(看起来意义不明的)标记。对于Markdown,可能需要Typora之类的软件才能正确地渲染这些标记;对于\LaTeX{},可能只有编译成PDF才能愉快地阅读了。
Word格式的话看起来则更加困难:记事本打不开它们了。
(好吧,悄悄地说一句:其实\texttt{.docx}是一个\texttt{.zip}压缩包,解开之后能在\texttt{word/document.xml}里找到用XML格式描述的文档内容。)
这样,我们可以发现,虽然这些文档的格式并不相同,但从主体上看,它们都是带标记的文本文件。于是我们可以畅想,如果有这样一个(我们自己写的)程序,能够预览这些格式的文档,那该多有趣啊!
所以,让我们写一个文档预览器吧!
\section{原则}
预览器必须是从第一行代码开始写成的,符合面向对象和泛型程序设计范式的,\CC{}程序。推荐使用第三方的\CC{}图形库来完成界面的绘制,键盘鼠标事件的捕获和处理等等内容,这样可以集中精力设计和实现预览器的架构。
\section{技术指标}
我们参考带提供Markdown预览支持插件的Visual Studio Code,制订了这份技术指标。本节是Project1的基本要求,显式标注成
\begin{note}
可选的
\end{note}
内容之外的所有内容都需要完成。
\subsection{工作流程}
预览器应该接受一个文件(的路径)作为参数。它将打开传入的文件,根据其扩展名确定文件使用的语言,然后分别进行渲染,最终把渲染得到的结果展示在预览界面中。
\begin{note}
为了使用上的方便,当然可以加入一个图形化的文件选择界面——这应该是每个图形库都会提供的设施,所以应该并不困难。
\end{note}
\begin{note}
可以考虑加入一个编辑界面。对于可以直接编辑的文本,在编辑界面中进行修改,则可以在预览界面中看到修改后的文档的渲染结果。编辑功能\text{\color{red}在Project1中}不做要求。
\end{note}
\begin{note}
可以考虑加入一个文件搜索器。可以通过文档的名字对其进行搜索,也可以用正则表达式进行模糊匹配和重命名。文件搜索器\text{\color{red}在Project1中}不做要求。
\end{note}
预览器对文档的渲染结果应该是一个标准的HTML文件。这样,可以方便地使用浏览器或者图形库内置的WebView之类的设施把渲染的结果用网页的方式展现出来。
如果感到困惑,可以这样理解:
\textbf{我们要实现的,是一个解析器/转换器/编译器。}
输入是一种带\emph{给人读的}标记的文本,比如Markdown;
输出是另一种\emph{给程序读的}带标记的文本,即HTML(\textbf{H}yper \textbf{T}ext \textbf{M}arkup \textbf{L}anguage)。这种文本被广泛地用于互联网页面的展示。
\begin{note}
是的,完全没有必要重新造一个HTML渲染器。那样的话太无聊了,一点也不有趣。
\end{note}
\subsection{支持的语言}
预览器需要支持使用下列常规语法的Markdown\footnote{可以参考\url{https://www.markdown.xyz/basic-syntax}中给出的语法。}
\begin{description}
\item[标题] 在一行的起始位置连用若干个\mintinline{md}{#},表示不同级别的标题。也可以使用连续的\mintinline{md}{=}或者\mintinline{md}{-}
\item[段落] 使用一个空行来开启新的段落。
\item[换行] 在一行的末尾使用多于两个空格来换行。
\item[强调] 使用一对\mintinline{md}{*}或者\mintinline{md}{_}包围的内容需要渲染成斜体;两对的则是粗体。
\item[列表] 使用\mintinline{md}{+}\mintinline{md}{-}或者\mintinline{md}{*}作为一行的起始,后续的文本将成为无序列表的一项;使用数字和点号的话,后续的文本将成为有序列表的一项;通过缩进列表项可以创建嵌套的列表。
\item[引用] 在一行的起始位置使用\mintinline{md}{>}来创建引用。引用也可以嵌套。
\item[代码] 用一对\mintinline{md}{`}包裹的内容成为行内代码;用额外的至少四个空格宽的缩进表示一个代码块。也可以使用一对\mintinline{md}{```}或者\mintinline{md}{~~~}包裹一个代码块。
\item[链接]\mintinline{md}{[]}括起链接的文本,随后用\mintinline{md}{()}括起链接的URL。
\item[图片] 首先用\mintinline{md}{!},随后紧跟一个链接,其中文本部分是图片的描述,URL部分则是图片的URL。
\item[HTML标签] 可以直接在Markdown文本中使用HTML的语法。
\end{description}
\begin{note}
\LaTeX{}和Word的支持\text{\color{red}在Project1中}不做要求。Markdown的高级语法也不必强求,开心就好。
\end{note}
\end{document}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment