Browse Source

add markdown html parser and css

master
filesite 3 years ago
parent
commit
9301361d34
  1. 47
      lib/DirScanner.php
  2. 1712
      plugins/Parsedown.php
  3. 28
      test/DirScannerTest.php
  4. 34
      themes/manual/controller/SiteController.php
  5. 5
      themes/manual/views/layout/main.php
  6. 21
      themes/manual/views/site/index.php
  7. 323
      www/content/README.md
  8. 940
      www/css/github-markdown-light.css
  9. 14
      www/css/manual.css
  10. 1
      www/js/manual.js

47
lib/DirScanner.php

@ -559,8 +559,8 @@ Class DirScanner { @@ -559,8 +559,8 @@ Class DirScanner {
//获取.md文件中的h1-h6标题
public function getMDTitles($id) {
if (empty($this->scanResults[$id])) {return [];}
$file = $this->scanResults[$id];
if (empty($file)) {return [];}
$titles = [];
$content = file_get_contents($file['realpath']);
@ -621,4 +621,49 @@ Class DirScanner { @@ -621,4 +621,49 @@ Class DirScanner {
return $html;
}
//获取指定目录下名称为README.md的文件
public function getDefaultReadme($dirpath = '') {
$readme = null;
$md = null;
if (empty($dirpath) && !empty($this->tree)) {
foreach($this->tree as $id => $file) {
if (!empty($file['extension']) && $file['extension'] == 'md') {
$md = $file;
if (strtoupper($file['filename']) == 'README') {
$readme = $file;
break;
}
}
}
}else if (!empty($this->scanResults)) {
$dir_realpath = realpath("{$this->rootDir}/{$dirpath}");
$directory = null;
foreach($this->scanResults as $id => $file) {
if (!empty($file['directory']) && $dir_realpath == $file['realpath']) {
$directory = $file;
break;
}
}
if (!empty($directory) && !empty($directory['files'])) {
foreach($directory['files'] as $id => $file) {
if (!empty($file['extension']) && $file['extension'] == 'md') {
$md = $file;
if (strtoupper($file['filename']) == 'README') {
$readme = $file;
break;
}
}
}
}
}
if (empty($readme) && !empty($md)) {
$readme = $md;
}
return $readme;
}
}

1712
plugins/Parsedown.php

File diff suppressed because it is too large Load Diff

28
test/DirScannerTest.php

@ -71,13 +71,30 @@ $dirTree = $scanner->scan(__DIR__ . '/content/', 4); @@ -71,13 +71,30 @@ $dirTree = $scanner->scan(__DIR__ . '/content/', 4);
echo "Time cost: {$scanner->scanTimeCost} ms\n";
echo "\n";
$readme_id = 'cd3075de9c038921184388bbdd1f08c2';
//print_r($dirTree);
//echo "\n";
//echo "\n";
$readmeFile = $scanner->getDefaultReadme('favs/');
if (!empty($readmeFile)) {
$readme_id = $readmeFile['id'];
$readme_titles = $scanner->getMDTitles($readme_id);
echo "Titles of MD file {$readme_id}:\n";
print_r($readme_titles);
echo "\n";
echo "\n";
$html = file_get_contents($readmeFile['realpath']);
$html = $scanner->fixMDUrls($readmeFile['realpath'], $html);
echo "{$html}\n";
echo "\n";
echo "\n";
}else {
echo "No readme file.\n\n";
}
//$menus = $scanner->getMenus();
//echo "Directories:\n";
//print_r($menus);
@ -91,15 +108,10 @@ echo "\n"; @@ -91,15 +108,10 @@ echo "\n";
//echo "\n";
$scanResults = $scanner->getScanResults();
//$scanResults = $scanner->getScanResults();
//print_r($scanResults);
//echo "\n";
//echo "\n";
$readmeFile = $scanResults[$readme_id];
$html = file_get_contents($readmeFile['realpath']);
$html = $scanner->fixMDUrls($readmeFile['realpath'], $html);
echo "{$html}\n";
echo "\n";
echo "\n";

34
themes/manual/controller/SiteController.php

@ -2,21 +2,39 @@ @@ -2,21 +2,39 @@
/**
* Site Controller
*/
require_once __DIR__ . '/../../../lib/DirScanner.php';
require_once __DIR__ . '/../../../plugins/Parsedown.php';
Class SiteController extends Controller {
public function actionIndex() {
//获取数据
$scanner = new DirScanner();
$scanner->setWebRoot('/content/');
$dirTree = $scanner->scan(__DIR__ . '/../../../www/content/', 4);
$readmeFile = $scanner->getDefaultReadme();
$titles = [];
$content = '';
$html = '';
if (!empty($readmeFile)) {
$titles = $scanner->getMDTitles($readmeFile['id']);
$content = file_get_contents($readmeFile['realpath']);
$Parsedown = new Parsedown();
$html = $Parsedown->text($content);
$html = $scanner->fixMDUrls($readmeFile['realpath'], $html);
}
//alert message test
$this->sendMsgToClient('Alert message - danger', 'danger');
$this->sendMsgToClient('Alert message - warning', 'warning');
$this->sendMsgToClient('Alert message - success', 'success');
$this->sendMsgToClient('Alert message - info', 'info');
//$this->sendMsgToClient('Alert message - danger', 'danger');
//$this->sendMsgToClient('Alert message - warning', 'warning');
//$this->sendMsgToClient('Alert message - success', 'success');
//$this->sendMsgToClient('Alert message - info', 'info');
$pageTitle = "Welcome to FSC";
$pageTitle = "FileSite.io - 无数据库、基于文件和目录的网址导航、图书、图片、视频网站PHP开源系统";
$viewName = 'index';
$params = array(
'foo' => 'bar',
);
$params = compact('dirTree', 'readmeFile', 'titles', 'content', 'html');
return $this->render($viewName, $params, $pageTitle);
}

5
themes/manual/views/layout/main.php

@ -6,6 +6,9 @@ @@ -6,6 +6,9 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link href="/css/main.css?v.1.0" rel="stylesheet">
<!--for theme manual-->
<link href="/css/github-markdown-light.css" rel="stylesheet">
<link href="/css/manual.css?v<?=time()?>" rel="stylesheet">
</head>
<body>
@ -22,5 +25,7 @@ include_once $viewFile; @@ -22,5 +25,7 @@ include_once $viewFile;
<script src="/js/js.cookie.min.js"></script>
<script src="/js/main.js?v.1.0"></script>
<!--for theme manual-->
<script src="/js/manual.js?v<?=time()?>"></script>
</body>
</html>

21
themes/manual/views/site/index.php

@ -1,10 +1,13 @@ @@ -1,10 +1,13 @@
<style>
body{padding:10px;max-width:720px;margin:0 auto}
code{background-color:#EEE}
pre{padding:10px;background-color:#DDD}
.footer{text-align:center}
</style>
<h1>欢迎使用FileSite的皮肤Manual</h1>
<p><a href="https://filesite.io" target="_blank">FileSite.io</a>是一个帮助你快速创建文档、导航、图片、书籍、视频网站的PHP开源系统。</p>
<hr>
<div class="indexes">
<?php
if (!empty($viewData['titles'])) {
foreach($viewData['titles'] as $title) {
echo "<{$title['heading']}>{$title['name']}</{$title['heading']}>";
}
}
?>
</div>
<div class="content markdown-body">
<?php echo $viewData['html']; ?>
</div>

323
www/content/README.md

@ -1 +1,322 @@ @@ -1 +1,322 @@
# 内容目录
# filesite.io使用手册
## 目录和文件说明
### 命名规则
目录和文件名可以包含中文、英文、数字和下划线、中划线等字符,
符合Windows、Linux、MacOS操作系统文件命名规范即可。
### 文件类型及其说明
文件类型及其最大文件大小建议:
| 后缀 | 类型 | 最大建议 |
| ---- | ---- | ---- |
| .txt | 纯文本 | 100K |
| .md | 纯文本 | 5M |
| .url | 快捷方式 | 20K |
| .jpg | 图片 | 500K |
| .png | 图片 | 500K |
| .gif | 图片 | 500K |
| .ico | 图标 | 50K |
| .mp4 | 视频 | 100M |
| .ts | 视频 | 10M |
| .m3u8 | 视频 | 10M |
文件类型及其可用范围说明:
| 后缀 | 类型 | 读取内容 | 内容可用范围 | 网址可用范围 | 防盗链 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| .txt | 纯文本 | 是 | 全局 | 无 | 无 |
| .md | 纯文本 | 是 | 详情页 | 无 | 无 |
| .url | 快捷方式 | 是 | 列表页 | 无 | 无 |
| .jpg | 图片| 否 | 无 | 全局 | 是 |
| .png | 图片| 否 | 无 | 全局 | 是 |
| .gif | 图片| 否 | 无 | 全局 | 是 |
| .ico | 图标| 否 | 无 | 全局 | 是 |
| .mp4 | 视频| 否 | 无 | 全局 | 是 |
| .ts | 视频| 否 | 无 | 全局 | 是 |
| .m3u8 | 视频| 否 | 无 | 全局 | 是 |
其中:
* .txt纯文本文件为说明性文件,可以用来包含标题、描述、关键词等信息;
* .md纯文本文件为详细内容文件,如:文章内容、视频详细介绍等;
* .url快捷方式文件请遵守URL文件格式规范;
只有.txt,.md和.url格式的文件会在网页展示它的内容,
其它格式的文件则以相对网址形式展示,不读取文件内容。
## 数据结构
### 目录
```
[
'id' => '根据完整路径生成的唯一编号',
'directory' => '倚天屠龙记',
'realpath' => '/www/webroot/content/倚天屠龙记/',
'path' => '/list/?id={id}',
'snapshot' => '/content/倚天屠龙记封面图.jpg',
'files' => [...], //文件列表
'directories' => [...] //目录列表
]
```
### 文件
```
[
'id' => '根据完整路径生成的唯一编号',
'filename' => '第一章',
'realpath' => '/www/webroot/content/倚天屠龙记/第一章.md',
'path' => '/view/?id={id}',
'extension' => 'md',
'fstat' => [...], //同php方法fstat: https://www.php.net/manual/en/function.fstat.php
'content' => '文章内容...',
'description' => '文章简介...',
'keywords' => '文章关键词...',
'snapshot' => '/content/倚天屠龙记/第一章封面图.jpg',
]
```
不同类型文件的path相对网址不一样,详情对照文件类型与path网址对照表:
| 后缀 | path网址 |
| ---- | ---- |
| .md | /view/?id={id} |
| .url | /link/?id={id} |
| .m3u8 | /m3u8/?id={id}&{防盗链参数}&ver={更新时间戳} |
| .jpg | /{相对路径}/{filename}.{extension}?{防盗链参数}&ver={更新时间戳} |
| .png | /{相对路径}/{filename}.{extension}?{防盗链参数}&ver={更新时间戳} |
| .gif | /{相对路径}/{filename}.{extension}?{防盗链参数}&ver={更新时间戳} |
| .ico | /{相对路径}/{filename}.{extension}?{防盗链参数}&ver={更新时间戳} |
| .mp4 | /{相对路径}/{filename}.{extension}?{防盗链参数}&ver={更新时间戳} |
| .ts | /{相对路径}/{filename}.{extension}?{防盗链参数}&ver={更新时间戳} |
.txt,.md和.url 3 种特殊文件类型:
* .txt文件是其它所有文件的描述文件,不会出现在文件列表里;
* .md会读取文件内容并存储在content字段里;
* .url读取文件内容并存储在shortcut字段里;
### URL快捷方式
```
[
'id' => '根据完整路径生成的唯一编号',
'filename' => 'filesite.io',
'realpath' => '/www/webroot/content/网址导航/filesite.io.url',
'path' => '/link/?id={id}',
'extension' => 'url',
'fstat' => [...], //同php方法fstat: https://www.php.net/manual/en/function.fstat.php
'shortcut' => [
'name' => 'filesite.io',
'url' => 'https://filesite.io',
],
]
```
URL快捷方式文件是一类特殊的文件,它比一般的文件多了一个字段:shortcut。
## 字段说明
字段名采用小写英文字符串,除了下面列出来的还可以自定义。
描述文件和被描述的文件命名规则:
```
被描述文件名_{字段名}.txt
```
示例:
```
|_d_ 金庸小说
|_f_ 第一章.md
|_f_ 第一章_description.txt
|_f_ 第一章_keywords.txt
|_f_ 第二章.md
|_f_ 第二章_price.txt
```
对整个目录数据读取后所有资源跟数据字段对照表:
| 资源 | 字段 |
| ---- | ---- |
| 目录名 | directory |
| 文件名 | filename |
| 完整路径 | realpath |
| 相对网址 | path |
| 文件后缀 | extension |
| 资源状态 | fstat |
| MD文件内容 | content |
| URL快捷方式 | shortcut |
特殊描述文件名称和字段对照表:
| 文件名 | 用途 | 字段 |
| ---- | ---- | ---- |
| description.txt | 描述信息 | description |
| keywords.txt | 关键词信息 | keywords |
| snapshot.txt | 快照图片 | snapshot |
特殊描述文件都是可选的,如果有则优先使用里面的内容。
说明:
其中snapshot.txt里的内容为跟当前txt文件**同目录的图片文件名**,
如下面示例中snapshot.txt的内容为:
```
金庸小说封面图_new.png
```
示例:
```
|_d_ 金庸小说
|_f_ description.txt
|_f_ keywords.txt
|_f_ snapshot.txt
|_f_ 金庸小说封面图_1.jpg
|_f_ 金庸小说封面图_new.png
```
## 目录结构约定
### 示例说明
* 用字母**d**代表目录,字母**f**代表文件
* 文件或目录名从空格字符后一位开始到行末
### 导航目录和文件结构示例
示例:
```
-d- 小说
|_d_ 金庸小说
|_f_ 最爱金庸网站图标.ico
|_f_ 最爱金庸.url
|_d_ 古龙小说
|_f_ 最爱古龙网站图标.ico
|_f_ 最爱古龙.url
-d- 图片
|_d_ 图片搜索
|_f_ 谷歌图片搜索图标.ico
|_f_ 谷歌图片搜索.url
|_f_ description.txt
|_d_ 必应图片搜索
|_f_ bing图标.ico
|_f_ bing.url
|_f_ title.txt
```
### 图书目录和文件结构示例
示例:
```
-d- 金庸小说
|_f_ 金庸封面.jpg
|_d_ 天龙八部
|_d_ 射雕英雄传
|_f_ 射雕英雄传封面.jpg
|_f_ 第一章.md
|_f_ 第二章.md
|_f_ 第三章.md
-d- 古龙小说
|_f_ 古龙封面.jpg
|_d_ 多情剑客无情剑
|_d_ 楚留香
|_f_ 楚留香封面.jpg
|_f_ 第一章.md
|_f_ 第二章.md
|_f_ 第三章.md
.
.
.
```
### 图片目录和文件结构示例
示例:
```
-d- 动物
|_d_ 宠物狗
|_f_ 吉娃娃01.jpg
|_f_ 吉娃娃02.jpg
|_f_ 吉娃娃03.jpg
|_d_ 兔子
|_f_ 大白兔01.jpg
|_f_ 大白兔02.jpg
|_f_ 大白兔03.jpg
.
.
.
-d- 植物
|_d_ 鲜花
|_d_ 玫瑰花
|_f_ 玫瑰01.jpg
|_f_ 玫瑰02.jpg
|_f_ 玫瑰03.jpg
|_d_ 菊花
|_f_ 菊花01.jpg
|_f_ 菊花02.jpg
|_f_ 菊花03.jpg
.
.
.
```
### 视频目录和文件结构示例
示例:
```
-d- 电影
|_d_ 科幻片
|_d_ 钢铁侠
|_f_ 钢铁侠.mp4
|_f_ 封面图.jpg
|_f_ 简介.md
|_f_ title.txt
|_f_ description.txt
|_f_ keywords.txt
|_d_ 战争片
|_d_ 拯救大兵瑞恩
|_f_ 拯救大兵瑞恩.m3u8
|_f_ 封面图.jpg
|_f_ 简介.md
|_f_ 001.ts
|_f_ 002.ts
|_f_ 003.ts
.
.
.
-d- 综艺
.
.
.
```
## 皮肤设计
### 皮肤设计规范
### 皮肤共享提交

940
www/css/github-markdown-light.css

@ -0,0 +1,940 @@ @@ -0,0 +1,940 @@
.markdown-body {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
margin: 0;
color: #24292f;
background-color: #ffffff;
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";
font-size: 16px;
line-height: 1.5;
word-wrap: break-word;
}
.markdown-body .octicon {
display: inline-block;
fill: currentColor;
vertical-align: text-bottom;
}
.markdown-body h1:hover .anchor .octicon-link:before,
.markdown-body h2:hover .anchor .octicon-link:before,
.markdown-body h3:hover .anchor .octicon-link:before,
.markdown-body h4:hover .anchor .octicon-link:before,
.markdown-body h5:hover .anchor .octicon-link:before,
.markdown-body h6:hover .anchor .octicon-link:before {
width: 16px;
height: 16px;
content: ' ';
display: inline-block;
background-color: currentColor;
-webkit-mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
mask-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");
}
.markdown-body details,
.markdown-body figcaption,
.markdown-body figure {
display: block;
}
.markdown-body summary {
display: list-item;
}
.markdown-body [hidden] {
display: none !important;
}
.markdown-body a {
background-color: transparent;
color: #0969da;
text-decoration: none;
}
.markdown-body a:active,
.markdown-body a:hover {
outline-width: 0;
}
.markdown-body abbr[title] {
border-bottom: none;
text-decoration: underline dotted;
}
.markdown-body b,
.markdown-body strong {
font-weight: 600;
}
.markdown-body dfn {
font-style: italic;
}
.markdown-body h1 {
margin: .67em 0;
font-weight: 600;
padding-bottom: .3em;
font-size: 2em;
border-bottom: 1px solid hsla(210,18%,87%,1);
}
.markdown-body mark {
background-color: #fff8c5;
color: #24292f;
}
.markdown-body small {
font-size: 90%;
}
.markdown-body sub,
.markdown-body sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
.markdown-body sub {
bottom: -0.25em;
}
.markdown-body sup {
top: -0.5em;
}
.markdown-body img {
border-style: none;
max-width: 100%;
box-sizing: content-box;
background-color: #ffffff;
}
.markdown-body code,
.markdown-body kbd,
.markdown-body pre,
.markdown-body samp {
font-family: monospace,monospace;
font-size: 1em;
}
.markdown-body figure {
margin: 1em 40px;
}
.markdown-body hr {
box-sizing: content-box;
overflow: hidden;
background: transparent;
border-bottom: 1px solid hsla(210,18%,87%,1);
height: .25em;
padding: 0;
margin: 24px 0;
background-color: #d0d7de;
border: 0;
}
.markdown-body input {
font: inherit;
margin: 0;
overflow: visible;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
.markdown-body [type=button],
.markdown-body [type=reset],
.markdown-body [type=submit] {
-webkit-appearance: button;
}
.markdown-body [type=button]::-moz-focus-inner,
.markdown-body [type=reset]::-moz-focus-inner,
.markdown-body [type=submit]::-moz-focus-inner {
border-style: none;
padding: 0;
}
.markdown-body [type=button]:-moz-focusring,
.markdown-body [type=reset]:-moz-focusring,
.markdown-body [type=submit]:-moz-focusring {
outline: 1px dotted ButtonText;
}
.markdown-body [type=checkbox],
.markdown-body [type=radio] {
box-sizing: border-box;
padding: 0;
}
.markdown-body [type=number]::-webkit-inner-spin-button,
.markdown-body [type=number]::-webkit-outer-spin-button {
height: auto;
}
.markdown-body [type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
.markdown-body [type=search]::-webkit-search-cancel-button,
.markdown-body [type=search]::-webkit-search-decoration {
-webkit-appearance: none;
}
.markdown-body ::-webkit-input-placeholder {
color: inherit;
opacity: .54;
}
.markdown-body ::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
.markdown-body a:hover {
text-decoration: underline;
}
.markdown-body hr::before {
display: table;
content: "";
}
.markdown-body hr::after {
display: table;
clear: both;
content: "";
}
.markdown-body table {
border-spacing: 0;
border-collapse: collapse;
display: block;
width: max-content;
max-width: 100%;
overflow: auto;
}
.markdown-body td,
.markdown-body th {
padding: 0;
}
.markdown-body details summary {
cursor: pointer;
}
.markdown-body details:not([open])>*:not(summary) {
display: none !important;
}
.markdown-body kbd {
display: inline-block;
padding: 3px 5px;
font: 11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
line-height: 10px;
color: #24292f;
vertical-align: middle;
background-color: #f6f8fa;
border: solid 1px rgba(175,184,193,0.2);
border-bottom-color: rgba(175,184,193,0.2);
border-radius: 6px;
box-shadow: inset 0 -1px 0 rgba(175,184,193,0.2);
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 600;
line-height: 1.25;
}
.markdown-body h2 {
font-weight: 600;
padding-bottom: .3em;
font-size: 1.5em;
border-bottom: 1px solid hsla(210,18%,87%,1);
}
.markdown-body h3 {
font-weight: 600;
font-size: 1.25em;
}
.markdown-body h4 {
font-weight: 600;
font-size: 1em;
}
.markdown-body h5 {
font-weight: 600;
font-size: .875em;
}
.markdown-body h6 {
font-weight: 600;
font-size: .85em;
color: #57606a;
}
.markdown-body p {
margin-top: 0;
margin-bottom: 10px;
}
.markdown-body blockquote {
margin: 0;
padding: 0 1em;
color: #57606a;
border-left: .25em solid #d0d7de;
}
.markdown-body ul,
.markdown-body ol {
margin-top: 0;
margin-bottom: 0;
padding-left: 2em;
}
.markdown-body ol ol,
.markdown-body ul ol {
list-style-type: lower-roman;
}
.markdown-body ul ul ol,
.markdown-body ul ol ol,
.markdown-body ol ul ol,
.markdown-body ol ol ol {
list-style-type: lower-alpha;
}
.markdown-body dd {
margin-left: 0;
}
.markdown-body tt,
.markdown-body code {
font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
font-size: 12px;
}
.markdown-body pre {
margin-top: 0;
margin-bottom: 0;
font-family: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
font-size: 12px;
word-wrap: normal;
}
.markdown-body .octicon {
display: inline-block;
overflow: visible !important;
vertical-align: text-bottom;
fill: currentColor;
}
.markdown-body ::placeholder {
color: #6e7781;
opacity: 1;
}
.markdown-body input::-webkit-outer-spin-button,
.markdown-body input::-webkit-inner-spin-button {
margin: 0;
-webkit-appearance: none;
appearance: none;
}
.markdown-body .pl-c {
color: #6e7781;
}
.markdown-body .pl-c1,
.markdown-body .pl-s .pl-v {
color: #0550ae;
}
.markdown-body .pl-e,
.markdown-body .pl-en {
color: #8250df;
}
.markdown-body .pl-smi,
.markdown-body .pl-s .pl-s1 {
color: #24292f;
}
.markdown-body .pl-ent {
color: #116329;
}
.markdown-body .pl-k {
color: #cf222e;
}
.markdown-body .pl-s,
.markdown-body .pl-pds,
.markdown-body .pl-s .pl-pse .pl-s1,
.markdown-body .pl-sr,
.markdown-body .pl-sr .pl-cce,
.markdown-body .pl-sr .pl-sre,
.markdown-body .pl-sr .pl-sra {
color: #0a3069;
}
.markdown-body .pl-v,
.markdown-body .pl-smw {
color: #953800;
}
.markdown-body .pl-bu {
color: #82071e;
}
.markdown-body .pl-ii {
color: #f6f8fa;
background-color: #82071e;
}
.markdown-body .pl-c2 {
color: #f6f8fa;
background-color: #cf222e;
}
.markdown-body .pl-sr .pl-cce {
font-weight: bold;
color: #116329;
}
.markdown-body .pl-ml {
color: #3b2300;
}
.markdown-body .pl-mh,
.markdown-body .pl-mh .pl-en,
.markdown-body .pl-ms {
font-weight: bold;
color: #0550ae;
}
.markdown-body .pl-mi {
font-style: italic;
color: #24292f;
}
.markdown-body .pl-mb {
font-weight: bold;
color: #24292f;
}
.markdown-body .pl-md {
color: #82071e;
background-color: #FFEBE9;
}
.markdown-body .pl-mi1 {
color: #116329;
background-color: #dafbe1;
}
.markdown-body .pl-mc {
color: #953800;
background-color: #ffd8b5;
}
.markdown-body .pl-mi2 {
color: #eaeef2;
background-color: #0550ae;
}
.markdown-body .pl-mdr {
font-weight: bold;
color: #8250df;
}
.markdown-body .pl-ba {
color: #57606a;
}
.markdown-body .pl-sg {
color: #8c959f;
}
.markdown-body .pl-corl {
text-decoration: underline;
color: #0a3069;
}
.markdown-body [data-catalyst] {
display: block;
}
.markdown-body g-emoji {
font-family: "Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";
font-size: 1em;
font-style: normal !important;
font-weight: 400;
line-height: 1;
vertical-align: -0.075em;
}
.markdown-body g-emoji img {
width: 1em;
height: 1em;
}
.markdown-body::before {
display: table;
content: "";
}
.markdown-body::after {
display: table;
clear: both;
content: "";
}
.markdown-body>*:first-child {
margin-top: 0 !important;
}
.markdown-body>*:last-child {
margin-bottom: 0 !important;
}
.markdown-body a:not([href]) {
color: inherit;
text-decoration: none;
}
.markdown-body .absent {
color: #cf222e;
}
.markdown-body .anchor {
float: left;
padding-right: 4px;
margin-left: -20px;
line-height: 1;
}
.markdown-body .anchor:focus {
outline: none;
}
.markdown-body p,
.markdown-body blockquote,
.markdown-body ul,
.markdown-body ol,
.markdown-body dl,
.markdown-body table,
.markdown-body pre,
.markdown-body details {
margin-top: 0;
margin-bottom: 16px;
}
.markdown-body blockquote>:first-child {
margin-top: 0;
}
.markdown-body blockquote>:last-child {
margin-bottom: 0;
}
.markdown-body sup>a::before {
content: "[";
}
.markdown-body sup>a::after {
content: "]";
}
.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
color: #24292f;
vertical-align: middle;
visibility: hidden;
}
.markdown-body h1:hover .anchor,
.markdown-body h2:hover .anchor,
.markdown-body h3:hover .anchor,
.markdown-body h4:hover .anchor,
.markdown-body h5:hover .anchor,
.markdown-body h6:hover .anchor {
text-decoration: none;
}
.markdown-body h1:hover .anchor .octicon-link,
.markdown-body h2:hover .anchor .octicon-link,
.markdown-body h3:hover .anchor .octicon-link,
.markdown-body h4:hover .anchor .octicon-link,
.markdown-body h5:hover .anchor .octicon-link,
.markdown-body h6:hover .anchor .octicon-link {
visibility: visible;
}
.markdown-body h1 tt,
.markdown-body h1 code,
.markdown-body h2 tt,
.markdown-body h2 code,
.markdown-body h3 tt,
.markdown-body h3 code,
.markdown-body h4 tt,
.markdown-body h4 code,
.markdown-body h5 tt,
.markdown-body h5 code,
.markdown-body h6 tt,
.markdown-body h6 code {
padding: 0 .2em;
font-size: inherit;
}
.markdown-body ul.no-list,
.markdown-body ol.no-list {
padding: 0;
list-style-type: none;
}
.markdown-body ol[type="1"] {
list-style-type: decimal;
}
.markdown-body ol[type=a] {
list-style-type: lower-alpha;
}
.markdown-body ol[type=i] {
list-style-type: lower-roman;
}
.markdown-body div>ol:not([type]) {
list-style-type: decimal;
}
.markdown-body ul ul,
.markdown-body ul ol,
.markdown-body ol ol,
.markdown-body ol ul {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body li>p {
margin-top: 16px;
}
.markdown-body li+li {
margin-top: .25em;
}
.markdown-body dl {
padding: 0;
}
.markdown-body dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-weight: 600;
}
.markdown-body dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.markdown-body table th {
font-weight: 600;
}
.markdown-body table th,
.markdown-body table td {
padding: 6px 13px;
border: 1px solid #d0d7de;
}
.markdown-body table tr {
background-color: #ffffff;
border-top: 1px solid hsla(210,18%,87%,1);
}
.markdown-body table tr:nth-child(2n) {
background-color: #f6f8fa;
}
.markdown-body table img {
background-color: transparent;
}
.markdown-body img[align=right] {
padding-left: 20px;
}
.markdown-body img[align=left] {
padding-right: 20px;
}
.markdown-body .emoji {
max-width: none;
vertical-align: text-top;
background-color: transparent;
}
.markdown-body span.frame {
display: block;
overflow: hidden;
}
.markdown-body span.frame>span {
display: block;
float: left;
width: auto;
padding: 7px;
margin: 13px 0 0;
overflow: hidden;
border: 1px solid #d0d7de;
}
.markdown-body span.frame span img {
display: block;
float: left;
}
.markdown-body span.frame span span {
display: block;
padding: 5px 0 0;
clear: both;
color: #24292f;
}
.markdown-body span.align-center {
display: block;
overflow: hidden;
clear: both;
}
.markdown-body span.align-center>span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: center;
}
.markdown-body span.align-center span img {
margin: 0 auto;
text-align: center;
}
.markdown-body span.align-right {
display: block;
overflow: hidden;
clear: both;
}
.markdown-body span.align-right>span {
display: block;
margin: 13px 0 0;
overflow: hidden;
text-align: right;
}
.markdown-body span.align-right span img {
margin: 0;
text-align: right;
}
.markdown-body span.float-left {
display: block;
float: left;
margin-right: 13px;
overflow: hidden;
}
.markdown-body span.float-left span {
margin: 13px 0 0;
}
.markdown-body span.float-right {
display: block;
float: right;
margin-left: 13px;
overflow: hidden;
}
.markdown-body span.float-right>span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: right;
}
.markdown-body code,
.markdown-body tt {
padding: .2em .4em;
margin: 0;
font-size: 85%;
background-color: rgba(175,184,193,0.2);
border-radius: 6px;
}
.markdown-body code br,
.markdown-body tt br {
display: none;
}
.markdown-body del code {
text-decoration: inherit;
}
.markdown-body pre code {
font-size: 100%;
}
.markdown-body pre>code {
padding: 0;
margin: 0;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.markdown-body .highlight {
margin-bottom: 16px;
}
.markdown-body .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.markdown-body .highlight pre,
.markdown-body pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: #f6f8fa;
border-radius: 6px;
}
.markdown-body pre code,
.markdown-body pre tt {
display: inline;
max-width: auto;
padding: 0;
margin: 0;
overflow: visible;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0;
}
.markdown-body .csv-data td,
.markdown-body .csv-data th {
padding: 5px;
overflow: hidden;
font-size: 12px;
line-height: 1;
text-align: left;
white-space: nowrap;
}
.markdown-body .csv-data .blob-num {
padding: 10px 8px 9px;
text-align: right;
background: #ffffff;
border: 0;
}
.markdown-body .csv-data tr {
border-top: 0;
}
.markdown-body .csv-data th {
font-weight: 600;
background: #f6f8fa;
border-top: 0;
}
.markdown-body .footnotes {
font-size: 12px;
color: #57606a;
border-top: 1px solid #d0d7de;
}
.markdown-body .footnotes ol {
padding-left: 16px;
}
.markdown-body .footnotes li {
position: relative;
}
.markdown-body .footnotes li:target::before {
position: absolute;
top: -8px;
right: -8px;
bottom: -8px;
left: -24px;
pointer-events: none;
content: "";
border: 2px solid #0969da;
border-radius: 6px;
}
.markdown-body .footnotes li:target {
color: #24292f;
}
.markdown-body .footnotes .data-footnote-backref g-emoji {
font-family: monospace;
}
.markdown-body .task-list-item {
list-style-type: none;
}
.markdown-body .task-list-item label {
font-weight: 400;
}
.markdown-body .task-list-item.enabled label {
cursor: pointer;
}
.markdown-body .task-list-item+.task-list-item {
margin-top: 3px;
}
.markdown-body .task-list-item .handle {
display: none;
}
.markdown-body .task-list-item-checkbox {
margin: 0 .2em .25em -1.6em;
vertical-align: middle;
}
.markdown-body .contains-task-list:dir(rtl) .task-list-item-checkbox {
margin: 0 -1.6em .25em .2em;
}
.markdown-body ::-webkit-calendar-picker-indicator {
filter: invert(50%);
}

14
www/css/manual.css

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
/* for theme manual */
*,html,body{padding:0:;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"}
.indexes{width:23%;position:fixed;padding-left:0.5em;padding-top:1em}
.content{margin-left:23.8%;padding:0.5em}
.footer{margin:1em auto;text-align:center}
.indexes h1,.indexes h2,.indexes h3,.indexes h4,.indexes h5,.indexes h6{font-size:1.2em;font-weight:normal;margin-bottom:0.35em}
.indexes h1{display:none}
.indexes h2{margin-top:1em}
.indexes h3{text-indent:1em}
@media (max-width: 640px) {
.indexes{position:static;width:auto}
.indexes h1{display:block;padding-bottom:0.3em;text-align:center;font-size:2em;border-bottom:1px solid hsla(210,18%,87%,1)}
.content{margin-left:0;}
}

1
www/js/manual.js

@ -0,0 +1 @@ @@ -0,0 +1 @@
/* for theme manual */
Loading…
Cancel
Save