diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8412432
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+test/content/
diff --git a/conf/app.php b/conf/app.php
index 99788ef..fac0474 100644
--- a/conf/app.php
+++ b/conf/app.php
@@ -5,9 +5,14 @@
return array(
'default_timezone' => 'Asia/HonKong', //timezone
- 'content_directory' => 'content/', //directory of contents in /www/
- 'theme' => 'manual', //name of theme which is enabled
- //when it's empty, use layout and views in directory views/
+ //'content_directory' => 'content/', //directory of contents in /www/
+ //when it's empty, use layout and views in directory views/
+ //'theme' => 'manual', //name of theme which is enabled
+
+ //in developing
+ 'content_directory' => 'dogs/', //directory of contents in /www/
+ 'theme' => 'googleimage', //name of theme which is enabled
+
'default_layout' => 'main', //default layout
'error_layout' => 'error', //exception layout, show error title and content
diff --git a/lib/DirScanner.php b/lib/DirScanner.php
index eadfffe..6908d61 100644
--- a/lib/DirScanner.php
+++ b/lib/DirScanner.php
@@ -42,6 +42,7 @@ Class DirScanner {
'md', //纯文本
'url', //快捷方式
'jpg', //图片
+ 'jpeg', //图片
'png', //图片
'gif', //图片
'ico', //图标
@@ -54,6 +55,7 @@ Class DirScanner {
'md' => 5*1024*1024, //纯文本
'url' => 20*1024, //快捷方式
'jpg' => 500*1024, //图片
+ 'jpeg' => 500*1024, //图片
'png' => 500*1024, //图片
'gif' => 500*1024, //图片
'ico' => 50*1024, //图标
@@ -63,6 +65,7 @@ Class DirScanner {
];
protected $securedFileExtensions = [ //开启Nginx防盗链的文件类型
'jpg', //图片
+ 'jpeg', //图片
'png', //图片
'gif', //图片
'ico', //图标
@@ -299,6 +302,7 @@ Class DirScanner {
'url' => '/link/',
'm3u8' => '/m3u8/',
'jpg' => "{$webRoot}{$directory}{$filename}.{$extension}",
+ 'jpeg' => "{$webRoot}{$directory}{$filename}.{$extension}",
'png' => "{$webRoot}{$directory}{$filename}.{$extension}",
'gif' => "{$webRoot}{$directory}{$filename}.{$extension}",
'ico' => "{$webRoot}{$directory}{$filename}.{$extension}",
@@ -463,7 +467,7 @@ Class DirScanner {
if (empty($this->rootDir)) {
$this->rootDir = realpath($dir);
}
- $this->scanningDirLevel = $this->getScanningLevel($this->rootDir, $dir);
+ $this->scanningDirLevel = $this->getScanningLevel($this->rootDir, realpath($dir));
$nextLevels = $levels - $this->scanningDirLevel;
$files = scandir($dir);
diff --git a/test/DirScannerTest.php b/test/DirScannerTest.php
index 2b314d9..52673e7 100644
--- a/test/DirScannerTest.php
+++ b/test/DirScannerTest.php
@@ -3,6 +3,7 @@
* 类 DirScanner 测试
*/
require_once __DIR__ . '/../lib/DirScanner.php';
+require_once __DIR__ . '/../plugins/Parsedown.php';
class DirScannerTest extends DirScanner {
@@ -66,19 +67,23 @@ $scanner = new DirScannerTest();
//$dirTree = $scanner->scan('./');
//$dirTree = $scanner->scan(__DIR__);
-$scanner->setWebRoot('/content/');
-$dirTree = $scanner->scan(__DIR__ . '/content/', 4);
-//$dirTree = $scanner->scan(__DIR__ . '/../www/content/', 4);
+
+//$scanner->setWebRoot('/dogs/');
+//$dirTree = $scanner->scan(__DIR__ . '/../www/dogs/', 4);
+
+$scanner->setWebRoot('/dogs/');
+$dirTree = $scanner->scan(__DIR__ . '/../www/dogs/', 5);
echo "Time cost: {$scanner->scanTimeCost} ms\n";
echo "\n";
-//print_r($dirTree);
-//echo "\n";
-//echo "\n";
+print_r($dirTree);
+echo "\n";
+echo "\n";
+exit;
-$readmeFile = $scanner->getDefaultReadme('favs/');
-//$readmeFile = $scanner->getDefaultReadme();
+//$readmeFile = $scanner->getDefaultReadme('favs/');
+$readmeFile = $scanner->getDefaultReadme();
if (!empty($readmeFile)) {
$readme_id = $readmeFile['id'];
$readme_titles = $scanner->getMDTitles($readme_id);
@@ -87,7 +92,9 @@ if (!empty($readmeFile)) {
echo "\n";
echo "\n";
- $html = file_get_contents($readmeFile['realpath']);
+ $content = file_get_contents($readmeFile['realpath']);
+ $Parsedown = new Parsedown();
+ $html = $Parsedown->text($content);
$html = $scanner->fixMDUrls($readmeFile['realpath'], $html);
echo "{$html}\n";
echo "\n";
diff --git a/themes/googleimage/controller/SiteController.php b/themes/googleimage/controller/SiteController.php
new file mode 100644
index 0000000..630cd06
--- /dev/null
+++ b/themes/googleimage/controller/SiteController.php
@@ -0,0 +1,37 @@
+setWebRoot(FSC::$app['config']['content_directory']);
+ $dirTree = $scanner->scan(__DIR__ . '/../../../www/' . FSC::$app['config']['content_directory'], 4);
+
+ //获取目录
+ $menus = $scanner->getMenus();
+
+ $titles = [];
+ $html = '';
+ $readmeFile = $scanner->getDefaultReadme();
+ if (!empty($readmeFile)) {
+ $titles = $scanner->getMDTitles($readmeFile['id']);
+
+ $Parsedown = new Parsedown();
+ $content = file_get_contents($readmeFile['realpath']);
+ $html = $Parsedown->text($content);
+ $html = $scanner->fixMDUrls($readmeFile['realpath'], $html);
+ }
+
+ $pageTitle = !empty($titles) ? $titles[0]['name'] : "FileSite.io - 无数据库、基于文件和目录的Markdown文档、网址导航、图书、图片、视频网站PHP开源系统";
+ $viewName = 'index';
+ $params = compact('menus', 'html');
+ return $this->render($viewName, $params, $pageTitle);
+ }
+
+}
diff --git a/themes/googleimage/views/layout/main.php b/themes/googleimage/views/layout/main.php
new file mode 100644
index 0000000..72f5a62
--- /dev/null
+++ b/themes/googleimage/views/layout/main.php
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/googleimage/views/site/index.php b/themes/googleimage/views/site/index.php
new file mode 100644
index 0000000..6deec1e
--- /dev/null
+++ b/themes/googleimage/views/site/index.php
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/themes/manual/views/layout/main.php b/themes/manual/views/layout/main.php
index aba16e0..94ec6d3 100644
--- a/themes/manual/views/layout/main.php
+++ b/themes/manual/views/layout/main.php
@@ -5,7 +5,7 @@
-
+
diff --git a/www/css/github-markdown-dark.css b/www/css/github-markdown-dark.css
new file mode 100644
index 0000000..43dedc0
--- /dev/null
+++ b/www/css/github-markdown-dark.css
@@ -0,0 +1,941 @@
+.markdown-body {
+ color-scheme: dark;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+ margin: 0;
+ color: #c9d1d9;
+ background-color: #0d1117;
+ 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,");
+ mask-image: url("data:image/svg+xml,");
+}
+
+.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: #58a6ff;
+ 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 #21262d;
+}
+
+.markdown-body mark {
+ background-color: rgba(187,128,9,0.15);
+ color: #c9d1d9;
+}
+
+.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: #0d1117;
+}
+
+.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 #21262d;
+ height: .25em;
+ padding: 0;
+ margin: 24px 0;
+ background-color: #30363d;
+ 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: #c9d1d9;
+ vertical-align: middle;
+ background-color: #161b22;
+ border: solid 1px rgba(110,118,129,0.4);
+ border-bottom-color: rgba(110,118,129,0.4);
+ border-radius: 6px;
+ box-shadow: inset 0 -1px 0 rgba(110,118,129,0.4);
+}
+
+.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 #21262d;
+}
+
+.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: #8b949e;
+}
+
+.markdown-body p {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+
+.markdown-body blockquote {
+ margin: 0;
+ padding: 0 1em;
+ color: #8b949e;
+ border-left: .25em solid #30363d;
+}
+
+.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: #484f58;
+ 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: #8b949e;
+}
+
+.markdown-body .pl-c1,
+.markdown-body .pl-s .pl-v {
+ color: #79c0ff;
+}
+
+.markdown-body .pl-e,
+.markdown-body .pl-en {
+ color: #d2a8ff;
+}
+
+.markdown-body .pl-smi,
+.markdown-body .pl-s .pl-s1 {
+ color: #c9d1d9;
+}
+
+.markdown-body .pl-ent {
+ color: #7ee787;
+}
+
+.markdown-body .pl-k {
+ color: #ff7b72;
+}
+
+.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: #a5d6ff;
+}
+
+.markdown-body .pl-v,
+.markdown-body .pl-smw {
+ color: #ffa657;
+}
+
+.markdown-body .pl-bu {
+ color: #f85149;
+}
+
+.markdown-body .pl-ii {
+ color: #f0f6fc;
+ background-color: #8e1519;
+}
+
+.markdown-body .pl-c2 {
+ color: #f0f6fc;
+ background-color: #b62324;
+}
+
+.markdown-body .pl-sr .pl-cce {
+ font-weight: bold;
+ color: #7ee787;
+}
+
+.markdown-body .pl-ml {
+ color: #f2cc60;
+}
+
+.markdown-body .pl-mh,
+.markdown-body .pl-mh .pl-en,
+.markdown-body .pl-ms {
+ font-weight: bold;
+ color: #1f6feb;
+}
+
+.markdown-body .pl-mi {
+ font-style: italic;
+ color: #c9d1d9;
+}
+
+.markdown-body .pl-mb {
+ font-weight: bold;
+ color: #c9d1d9;
+}
+
+.markdown-body .pl-md {
+ color: #ffdcd7;
+ background-color: #67060c;
+}
+
+.markdown-body .pl-mi1 {
+ color: #aff5b4;
+ background-color: #033a16;
+}
+
+.markdown-body .pl-mc {
+ color: #ffdfb6;
+ background-color: #5a1e02;
+}
+
+.markdown-body .pl-mi2 {
+ color: #c9d1d9;
+ background-color: #1158c7;
+}
+
+.markdown-body .pl-mdr {
+ font-weight: bold;
+ color: #d2a8ff;
+}
+
+.markdown-body .pl-ba {
+ color: #8b949e;
+}
+
+.markdown-body .pl-sg {
+ color: #484f58;
+}
+
+.markdown-body .pl-corl {
+ text-decoration: underline;
+ color: #a5d6ff;
+}
+
+.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: #f85149;
+}
+
+.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: #c9d1d9;
+ 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 #30363d;
+}
+
+.markdown-body table tr {
+ background-color: #0d1117;
+ border-top: 1px solid #21262d;
+}
+
+.markdown-body table tr:nth-child(2n) {
+ background-color: #161b22;
+}
+
+.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 #30363d;
+}
+
+.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: #c9d1d9;
+}
+
+.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(110,118,129,0.4);
+ 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: #161b22;
+ 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: #0d1117;
+ border: 0;
+}
+
+.markdown-body .csv-data tr {
+ border-top: 0;
+}
+
+.markdown-body .csv-data th {
+ font-weight: 600;
+ background: #161b22;
+ border-top: 0;
+}
+
+.markdown-body .footnotes {
+ font-size: 12px;
+ color: #8b949e;
+ border-top: 1px solid #30363d;
+}
+
+.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 #1f6feb;
+ border-radius: 6px;
+}
+
+.markdown-body .footnotes li:target {
+ color: #c9d1d9;
+}
+
+.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%);
+}
diff --git a/www/css/googleimage.css b/www/css/googleimage.css
new file mode 100644
index 0000000..e9b029d
--- /dev/null
+++ b/www/css/googleimage.css
@@ -0,0 +1,21 @@
+/* for theme GoogleImage */
+body{background-color:#202124;color: #e8eaed;font-family: Roboto,HelveticaNeue,Arial,sans-serif;font-size: small;margin: 0}
+a{color: #aaadb2;text-decoration: none}
+.header{padding:10px;position: relative;}
+.header .logo{display: inline-block;margin:10px;font-size: 1.86em;color: #e8eaed}
+.header .logo img{vertical-align: middle;}
+.menu{max-width: 80%;white-space;nowrap;overflow-x:auto;overflow-y: hidden;margin: 0 auto}
+.menu a{display: inline-block;line-height: 16px;margin: 0 1px;padding: 16px 12px 12px 10px;text-align: center}
+.menu .selected{color: #8ab4f8;border-bottom: 3px solid #8ab4f8;padding: 20px 12px 11px 10px;}
+.hr{border-bottom: solid 1px #3c4043;margin-bottom: 11px}
+.about{position: absolute;right: 10px;top: 8px;width: 24px;height: 24px;padding: 8px;border-radius: 50%}
+.about:hover{background-color: #303134}
+.about svg{fill: currentColor;cursor: pointer;}
+.modal-mask{display: none;background: rgba(0,0,0,.6);position: fixed;left: 0;right: 0;top: 0;bottom: 0;overflow: hidden;z-index: 9000;}
+.modal-about{background: #202124;bottom: 0;overflow-y: auto;position: fixed;right: 0px;top: 0;width: 360px}
+.modal-about h3{color: #e8eaed;font-size: 24px;font-weight: 300;margin-top: 0;margin-bottom: 20px;text-align: left;}
+.modal-about .modal-head{padding: 20px 24px 0 24px}
+.modal-about .btn-close{color: #9aa0a6;cursor: pointer;display: block;float: right;position: relative;top: -45px;}
+.modal-about .btn-close svg{fill: currentColor;flex-shrink: 0;}
+.modal-body{padding: 10px;background-color: inherit;}
+.modal-about .modal-body h1{display: none;}
\ No newline at end of file
diff --git a/www/css/main.css b/www/css/main.css
index b162396..7b79c72 100644
--- a/www/css/main.css
+++ b/www/css/main.css
@@ -3,3 +3,4 @@
.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}
.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}
.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}
+.footer{margin:3em auto;text-align:center}
\ No newline at end of file
diff --git a/www/css/manual.css b/www/css/manual.css
index f814a05..5daa1ec 100644
--- a/www/css/manual.css
+++ b/www/css/manual.css
@@ -2,7 +2,6 @@
*,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:22%;position:fixed;top:0;bottom:0;text-align:left;padding:0.5em;overflow-y:auto}
.content{margin-left:23.5%;padding:0.5em}
-.footer{margin:3em auto;text-align:center}
.indexes h1,.indexes h2,.indexes h3,.indexes h4,.indexes h5,.indexes h6{padding:2px 0 3px 5px;font-size:1.2em;font-weight:normal;margin-bottom:0.35em}
.indexes h1{display:none}
.indexes h2{margin-top:1em;padding-top:4px;padding-bottom:4px;box-shadow:1px 1px 2px 1px rgba(0, 0, 0, 0.1)}
diff --git a/www/js/googleimage.js b/www/js/googleimage.js
new file mode 100644
index 0000000..e4ce813
--- /dev/null
+++ b/www/js/googleimage.js
@@ -0,0 +1 @@
+/* for theme GoogleImage */