个人项目WordCount(C++/QT)

GitHub项目地址:https://github.com/Nova-cjp/Word-Count

百度云链接:https://pan.baidu.com/s/1MSOXu0KbuUMJfJ8p8bwMwQ 提取码:jef2

已同步至个人博客:http://www.jpblog.xyz/Word-Count-WC-%E9%A1%B9%E7%9B%AE/

一、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 15
· Estimate · 估计这个任务需要多少时间 10 15
Development 开发 380 1240
· Analysis · 需求分析 (包括学习新技术) 90 150
· Design Spec · 生成设计文档 ---- 10
· Design Review · 设计复审 (和同事审核设计文档) 5 5
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 15
· Design · 具体设计 30 60
· Coding · 具体编码 150 240
· Code Review · 代码复审 30 10
· Test · 测试(自我测试,修改代码,提交修改) 60 270
Reporting 报告 100 40
· Test Report · 测试报告 60 15
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 15
合计   515 1295

二、解题思路

2.1 基本需求分析
wc.exe -x //显示图形界面
wc.exe -s //递归处理目录下符合条件的文件(file.c /file.txt)。
wc.exe -a //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -l //返回文件 file.c /file.txt的行数
wc.exe -w //返回文件file.c /file.txt的词的数目
wc.exe -c //返回文件file.c /file.txt 的字符数

2.2 实现思路

因为在学校团队使用c++进行开发,对c++比较熟悉,所以选择使用c++进行开发。由于之前从来没有进行过GUI图形界面的开发,一开始并不打算实现高级功能。-l -s -a -w -c都是对文件内容进行处理计算,因此可以针对不同参数的选择对应不同的函数实现,并把函数和计算得出的文件内部属性(行数、字符数等)封装为一个类,属性设置为private,仅允许类函数访问,类函数设置为public,允许外部调用。在程序一开始实例化类对象,然后调用类函数进行处理,避免了多余参数的传递。

后来把基本功能、扩展功能实现完成后考虑进行图形界面的开发,才发现c++可用的图形库并不多(相比于java和python),而且考虑到用高级的图形库进行开发学习时间会较长。经过查阅资料和向同学了解,有三种方案看似可行,第一种是用easyxC++图形库开发,easyx面向初学者简单易上手,第二种是用python进行图形界面的开发(我不熟悉java),然后调用已经写好的C++程序,最后一种借用于Qt Creater中内置的Qt designer进行设计。经过考虑,我最后选择了Qt,easyx实现按键事件并没有对应的函数,虽然易上手但是难实现需求;python只能调用c语言程序,调用c++代码要进行复杂的转换和函数封装。而Qt正是为桌面应用而生,借助于布局界面自动生成部分图形代码,使开发周期大大缩短。

三、设计实现过程

3.1 类和函数

class Twc{
private:
  int num_of_characters;//字符数量
  int num_of_words;//词数
  int num_of_rows;//行数
  int num_of_codeLines;//代码行数
  int num_of_blankLines;//空白行数
  int num_of_commentLines;//注释行数
  struct Topt opt;
public:
  Twc(){
      num_of_characters=num_of_words=num_of_rows\
=num_of_codeLines=num_of_blankLines=num_of_commentLines=0;
      opt.s=opt.c=opt.w=opt.l=opt.a=false;
  };
  void CalRows(FILE *fp);
  void CalCharacters(FILE*fp);
  void CalWords(FILE*fp);
  void CalCodelines(FILE*fp);
  void CalCommentlines(FILE*fp);
  void ListFiles(string path,string mode);
  void Work(char*filename);
  void Choose(int argc,char*argv[]);
};

3.2 系统流程图

四、核心代码说明

4.1 统计函数


bool IsCharacter(char ch){//用于判断除制表符、空格、回车之外可见的字符
  if(ch=='\t'||ch==' '||ch=='\n')return false;
  else return true;
};

bool IsCharacter_(char ch){//用于判断英文字母
  if(ch>='0'&&ch<='9')return true;
  if(ch>='a'&&ch<='z')return true;
  if(ch>='A'&&ch<='Z')return true;
  return false;
};

void Twc::CalRows(FILE *fp){//计算行数
  char flag=0;int count=0;
  while(!feof(fp)){
      flag=fgetc(fp);
      if(flag=='\n')
          count++;
  }
  num_of_rows=count+1;
  cout<<"the number of rows is "<<num_of_rows<<endl;
  rewind(fp);//重置文件指针到文件开头准备进行下一步操作
  return;
}

void Twc::CalCharacters(FILE *fp){//计算字符数
  char flag=0;int count=0;
  while(!feof(fp)){
      flag=fgetc(fp);
      if(IsCharacter(flag))
          count++;
  }
  num_of_characters=count-1;
  cout<<"the number of characters is "<<num_of_characters<<endl;
  rewind(fp);
  return;
}

void Twc::CalWords(FILE*fp){//计算词数
  char str[bufsize];
  int len;//每行的字符数
  int count=0;
  while(!feof(fp)){
      fgets(str,bufsize,fp);
      len=strlen(str);
      for(int i=0;i<len;i++)
      {
          if(IsCharacter_(str[i])){
              if(i==0||!IsCharacter_(str[i-1]))
                  count++;
          }
      }
  }
  num_of_words=count;
  cout<<"the number of words is "<<num_of_words<<endl;
  rewind(fp);
  return;
}

void Twc::CalCodelines(FILE*fp){//计算代码行数和空行
  char str[bufsize];
  int len;
  int show_code,code_line,blank_line;//每行可见字符数
  show_code=code_line=blank_line=0;
  while(!feof(fp)){
      fgets(str,bufsize,fp);
      len=strlen(str);
      for(int i=0;i<len;i++){
          if(IsCharacter(str[i]))
              show_code++;
      }
      if(show_code>1)
          code_line++;
      else
          blank_line++;
      show_code=0;//置零,计算下一行
  }
  num_of_codeLines=code_line;
  num_of_blankLines=blank_line;
  cout<<"the number of code lines is "<<num_of_codeLines<<endl;
  cout<<"the number of blank lines is "<<num_of_blankLines<<endl;
  rewind(fp);
  return;
}

void Twc::CalCommentlines(FILE*fp){//计算注释行
  char str[bufsize];
  int len;//每行的字符数
  int count=0;
  int show_comment=0;
  bool is_commentline= false;
  while(!feof(fp)){
      fgets(str,bufsize,fp);
      len=strlen(str);
      for(int i=0;i<len;i++){
          if(IsCharacter(str[i])){
              show_comment++;
              if(str[i]=='/'){
                  if(i+1<len&&str[i+1]=='/')
                      is_commentline= true;
                  break;
              }
              if(show_comment>1)
                  break;
          }
      }
      if(is_commentline==true)
          count++;
  }
  num_of_commentLines =count;
  cout<<"the number of comment lines is "<<num_of_commentLines<<endl;
  rewind(fp);
  return;
}

void Twc::Work(char *filename) {//运行函数
  if(opt.s== true){
      string mode = filename;
      string path=".\\";
      ListFiles(path,mode);
      return;
  }
  FILE *fp=fopen(filename,"r");
  if(fp==NULL){
      cout<<"open file error!"<<endl;
      cout<<"Press any key to continue"<<endl;
      getchar();
      exit(0);
  }
  if(opt.l==true){
      CalRows(fp);
  }
  if(opt.c== true){
      CalCharacters(fp);
  }
  if(opt.a==true){
      CalCodelines(fp);
      CalCommentlines(fp);
  }
  if(opt.w== true){
      CalWords(fp);
  }
}

void Twc::ListFiles(string path,string mode){//递归处理目录下符合条件的文件
  _finddata_t file;
  intptr_t HANDLE;
  string Onepath = path + mode;
  HANDLE = _findfirst(Onepath.c_str(), &file);
  if (HANDLE == -1L)
  {
      cout << "can not match the folder path" << endl;
      system("pause");
  }
  do {
      //判断是否有子目录
      if (file.attrib & _A_SUBDIR)
      {
          //判断是否为"."当前目录,".."上一层目录
          if ((strcmp(file.name, ".") != 0) && (strcmp(file.name, "..") != 0))
          {
              string newPath = path +"\\" + file.name;
              ListFiles(newPath,mode);
          }
      }
      else
      {
          cout << file.name << " " << endl;
          FILE *fp=fopen(&file.name[0],"r");
          if(fp==NULL){
              cout<<"open file error!"<<endl;
              cout<<"Press any key to continue"<<endl;
              getchar();
              exit(0);
          }
          if(opt.l==true){
              CalRows(fp);
          }
          if(opt.c== true){
              CalCharacters(fp);
          }
          if(opt.a==true){
              CalCodelines(fp);
              CalCommentlines(fp);
          }
          if(opt.w== true){
              CalWords(fp);
          }
          cout<<"------------------------------"<<endl;
      }
  } while (_findnext(HANDLE, &file) == 0);
  _findclose(HANDLE);
}

void Twc::Choose(int argc,char*argv[]){//参数选择
  for(int i=0;i<argc-1;i++){

      if(strcmp(argv[i],"-s")==0){
          opt.s=true;
      }
      if(strcmp(argv[i],"-c")==0){
          opt.c=true;
      }
      if(strcmp(argv[i],"-w")==0){
          opt.w=true;
      }
      if(strcmp(argv[i],"-l")==0){
          opt.l=true;
      }
      if(strcmp(argv[i],"-a")==0){
          opt.a=true;
      }
  }
}

4.2 Main函数,是否启用图形界面

int main(int argc, char *argv[])
{
  char filename[maxlen_filename];
  strcpy(filename,argv[argc-1]);
  Twc filefp;
  filefp.Choose(argc,argv);
  if(filefp.SomethingTrue()){
  filefp.Work(filename);
  return 0;
  }

  QApplication a(argc, argv);
  MainWindow w;
  w.setWindowTitle(QString("word count"));
  w.show();
  w.setAutoFillBackground(true);
  QPalette palette=w.palette();
  palette.setBrush(QPalette::Window,QBrush(QPixmap("C:\\Users\\24277\
\\Documents\\WC\\a.PNG").scaled(w.size()\
,Qt::IgnoreAspectRatio,Qt::SmoothTransformation)));
  w.setPalette(palette);
  return a.exec();
}

五、测试运行

5.1 单文件测试

test.c

运行结果:

5.2 多文件测试

文件夹test

运行结果:

5.3 GUI测试

WC.exe -x打开GUI程序

输入框输入文件路径或点击选择文件按钮调出文件对话框选择文件

连续查询多个文件

六、项目小结

通过这次个人项目,我意识到软件工程学科的重要性(因为开始没有规划GUI扩展导致最后把项目的代码重写了一遍,分出了非GUI界面wc和GUI界面wc两个项目)。软件工程开始时的整体规划对项目的影响非常大,随着我们学习的深入,我们应该多花时间在分析规则上,从而减少开发、debug的时间。借助本次项目,我也学习到了图形界面的开发、main参数的使用、c与python之间的相互调用等,十分难得。

figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 2; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; }
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
html.blink-to-pdf { font-size: 13px; }
.typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
.typora-export #write::after { height: 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
svg[id^="mermaidChart"] { line-height: 1em; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }

.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}

:root {
--side-bar-bg-color: #fafafa;
--control-text-color: #777;
}

@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);

html {
font-size: 16px;
}

body {
font-family: "Open Sans","Clear Sans","Helvetica Neue",Helvetica,Arial,sans-serif;
color: rgb(51, 51, 51);
line-height: 1.6;
}

#write {
max-width: 860px;
margin: 0 auto;
padding: 30px;
padding-bottom: 100px;
}
#write > ul:first-child,
#write > ol:first-child{
margin-top: 30px;
}

a {
color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
position: relative;
margin-top: 1rem;
margin-bottom: 1rem;
font-weight: bold;
line-height: 1.4;
cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
text-decoration: none;
}
h1 tt,
h1 code {
font-size: inherit;
}
h2 tt,
h2 code {
font-size: inherit;
}
h3 tt,
h3 code {
font-size: inherit;
}
h4 tt,
h4 code {
font-size: inherit;
}
h5 tt,
h5 code {
font-size: inherit;
}
h6 tt,
h6 code {
font-size: inherit;
}
h1 {
padding-bottom: .3em;
font-size: 2.25em;
line-height: 1.2;
border-bottom: 1px solid #eee;
}
h2 {
padding-bottom: .3em;
font-size: 1.75em;
line-height: 1.225;
border-bottom: 1px solid #eee;
}
h3 {
font-size: 1.5em;
line-height: 1.43;
}
h4 {
font-size: 1.25em;
}
h5 {
font-size: 1em;
}
h6 {
font-size: 1em;
color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
margin: 0.8em 0;
}
li>ol,
li>ul {
margin: 0 0;
}
hr {
height: 2px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
overflow: hidden;
box-sizing: content-box;
}

li p.first {
display: inline-block;
}
ul,
ol {
padding-left: 30px;
}
ul:first-child,
ol:first-child {
margin-top: 0;
}
ul:last-child,
ol:last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dfe2e5;
padding: 0 15px;
color: #777777;
}
blockquote blockquote {
padding-right: 0;
}
table {
padding: 0;
word-break: initial;
}
table tr {
border-top: 1px solid #dfe2e5;
margin: 0;
padding: 0;
}
table tr:nth-child(2n),
thead {
background-color: #f8f8f8;
}
table tr th {
font-weight: bold;
border: 1px solid #dfe2e5;
border-bottom: 0;
margin: 0;
padding: 6px 13px;
}
table tr td {
border: 1px solid #dfe2e5;
margin: 0;
padding: 6px 13px;
}
table tr th:first-child,
table tr td:first-child {
margin-top: 0;
}
table tr th:last-child,
table tr td:last-child {
margin-bottom: 0;
}

.CodeMirror-lines {
padding-left: 4px;
}

.code-tooltip {
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
border-top: 1px solid #eef2f2;
}

.md-fences,
code,
tt {
border: 1px solid #e7eaed;
background-color: #f8f8f8;
border-radius: 3px;
padding: 0;
padding: 2px 4px 0px 4px;
font-size: 0.9em;
}

code {
background-color: #f3f4f4;
padding: 0 2px 0 2px;
}

.md-fences {
margin-bottom: 15px;
margin-top: 15px;
padding-top: 8px;
padding-bottom: 6px;
}

.md-task-list-item > input {
margin-left: -1.3em;
}

@media print {
html {
font-size: 13px;
}
table,
pre {
page-break-inside: avoid;
}
pre {
word-wrap: break-word;
}
}

.md-fences {
background-color: #f8f8f8;
}
#write pre.md-meta-block {
padding: 1rem;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border: 0;
border-radius: 3px;
color: #777777;
margin-top: 0 !important;
}

.mathjax-block>.code-tooltip {
bottom: .375rem;
}

.md-mathjax-midline {
background: #fafafa;
}

#write>h3.md-focus:before{
left: -1.5625rem;
top: .375rem;
}
#write>h4.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h5.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h6.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
.md-image>.md-meta {
/*border: 1px solid #ddd;*/
border-radius: 3px;
padding: 2px 0px 0px 4px;
font-size: 0.9em;
color: inherit;
}

.md-tag {
color: #a7a7a7;
opacity: 1;
}

.md-toc {
margin-top:20px;
padding-bottom:20px;
}

.sidebar-tabs {
border-bottom: none;
}

#typora-quick-open {
border: 1px solid #ddd;
background-color: #f8f8f8;
}

#typora-quick-open-item {
background-color: #FAFAFA;
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
border-style: solid;
border-width: 1px;
}

/** focus mode */
.on-focus-mode blockquote {
border-left-color: rgba(85, 85, 85, 0.12);
}

header, .context-menu, .megamenu-content, footer{
font-family: "Segoe UI", "Arial", sans-serif;
}

.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
visibility: visible;
}

.mac-seamless-mode #typora-sidebar {
background-color: #fafafa;
background-color: var(--side-bar-bg-color);
}

.md-lang {
color: #b4654d;
}

.html-for-mac .context-menu {
--item-hover-bg-color: #E6F0FE;
}

#md-notification .btn {
border: 0;
}

.dropdown-menu .divider {
border-color: #e5e5e5;
}

.ty-preferences .window-content {
background-color: #fafafa;
}

.ty-preferences .nav-group-item.active {
color: white;
background: #999;
}
-->

最新文章

  1. PHP-GTK 扩展(用PHP编写桌面应用程序)
  2. python--django项目如何设置用自己的iP地址访问项目
  3. table清除样式大全
  4. js算出生日是当年第多少天
  5. linux-8 基本命令---date
  6. linux 清除驱动对网卡的记录
  7. HTML5 拖放
  8. 选择年份 php的写法要比js简洁一些
  9. HttpContext.Current.Cache在控制台下不工作
  10. js javascript:void(0) 真正含义
  11. Oracle- PL/SQL DEV工具的使用收集
  12. 2016/9/7 jdbc.properties配置数据库相关
  13. DataTables自定义事件
  14. Eric的第一天
  15. RHCE认证过程
  16. C语言数据在内存分配
  17. CentOS7.4下的 JDK1.8 安装
  18. 九,微信小程序开发浅谈
  19. 社团的CTF逆向题WriteUp
  20. xpath 选取指定文本内容可能是多种情况下的语法

热门文章

  1. PHP 命名空间(namespace)定义
  2. PHP in_array() 函数
  3. js的栈内存和堆内存
  4. cobbler多机定制安装
  5. python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
  6. [转]HashMap 和 currentHashMap 总结
  7. Flink状态妙用
  8. CI4框架应用三 - app目录
  9. Html视频播放同时获取当前帧下的图片
  10. 申请支付宝app支付签约综合评分不足,拒绝不通过快速强开通支付宝App支付强开,强开支付宝App支付产品权限!