Compare commits

...

No commits in common. "v3.0.1" and "master" have entirely different histories.

1593 changed files with 67203 additions and 87462 deletions

14
.babelrc Normal file
View File

@ -0,0 +1,14 @@
{
"presets": [
["env", { "modules": false }],
"stage-2"
],
"plugins": ["transform-runtime"],
"comments": false,
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"]
}
}
}

View File

@ -1,3 +0,0 @@
{
"directory": "public/res/bower-libs"
}

9
.dockerignore Normal file
View File

@ -0,0 +1,9 @@
node_modules
.git
dist
.history
images
docs
Dockerfile
README.md
build.sh

9
.editorconfig Normal file
View File

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

3
.eslintignore Normal file
View File

@ -0,0 +1,3 @@
build/*.js
config/*.js
src/libs/*.js

44
.eslintrc.js Normal file
View File

@ -0,0 +1,44 @@
// http://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parser: 'babel-eslint',
parserOptions: {
sourceType: 'module'
},
env: {
browser: true,
},
extends: 'airbnb-base',
// required to lint *.vue files
plugins: [
'html'
],
globals: {
"NODE_ENV": false,
"VERSION": false
},
// check if imports actually resolve
'settings': {
'import/resolver': {
'webpack': {
'config': 'build/webpack.base.conf.js'
}
}
},
// add your custom rules here
'rules': {
'no-param-reassign': [2, { 'props': false }],
// don't require .vue extension when importing
'import/extensions': ['error', 'always', {
'js': 'never',
'vue': 'never'
}],
// allow optionalDependencies
'import/no-extraneous-dependencies': ['error', {
'optionalDependencies': ['test/unit/index.js']
}],
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
}
}

16
.gitignore vendored
View File

@ -1,6 +1,10 @@
chrome-app*
.project
.settings
node_modules
Thumbs.db
public/res/bower-libs
.DS_Store
node_modules/
dist/
.history
.idea
npm-debug.log*
.vscode
stackedit_v4
chrome-app/*.zip
/test/unit/coverage/

8
.postcssrc.js Normal file
View File

@ -0,0 +1,8 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
// to edit target browsers: use "browserlist" field in package.json
"autoprefixer": {}
}
}

7
.stylelintrc Normal file
View File

@ -0,0 +1,7 @@
{
"processors": ["stylelint-processor-html"],
"extends": "stylelint-config-standard",
"rules": {
"no-empty-source": null
}
}

22
.travis.yml Normal file
View File

@ -0,0 +1,22 @@
language: node_js
node_js:
- "12"
services:
- docker
before_deploy:
# Run docker build
- docker build -t benweet/stackedit .
# Install Helm
- curl -SL -o /tmp/get_helm.sh https://git.io/get_helm.sh
- chmod 700 /tmp/get_helm.sh
- /tmp/get_helm.sh
- helm init --client-only
deploy:
provider: script
script: bash build/deploy.sh
on:
tags: true

View File

@ -1,15 +1,16 @@
# Dockerfile for StackEdit
FROM mafgwo/wkhtmltopdf-nodejs:11.15.0
FROM shykes/nodejs
WORKDIR /opt/stackedit
RUN apt-get update
RUN apt-get upgrade
COPY package*json /opt/stackedit/
COPY gulpfile.js /opt/stackedit/
RUN apt-get install -y git-core
RUN npm install --unsafe-perm \
&& npm cache clean --force
COPY . /opt/stackedit
ENV NODE_ENV production
RUN npm run build
RUN git clone https://github.com/benweet/stackedit.git
EXPOSE 8080
RUN (cd /stackedit/ && npm install)
EXPOSE 3000
CMD (cd /stackedit/ && node server.js)
CMD [ "node", "." ]

View File

@ -1,275 +0,0 @@
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-string-replace');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-bower-requirejs');
grunt.loadNpmTasks('grunt-bump');
/***************************************************************************
* Configuration
*/
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
jshint: {
options: {
curly: true,
browser: true,
devel: true,
indent: 4,
latedef: true,
undef: true,
unused: true,
expr: true,
globals: {
"define": false,
"require": false,
},
ignores: [
'node_modules/**/*.js',
'public/libs/**/*.js',
'public/res/libs/**/*.js',
'public/res/bower-libs/**/*.js',
'public/res-min/**/*.js'
]
},
client: ['public/**/*.js'],
},
requirejs: {
compile: {
options: {
baseUrl: "public/res",
name: "main",
out: "public/res-min/main.js",
mainConfigFile: 'public/res/main.js',
optimize: "uglify2",
inlineText: true,
uglify2: {
output: {
beautify: true,
indent_level: 1,
},
},
excludeShallow: [
'css/css-builder',
'less/lessc-server',
'less/lessc'
],
}
}
},
less: {
compile: {
options: {
compress: true,
},
files: [
{
expand: true,
cwd: 'public/res/themes',
src: [
'*.less'
],
dest: 'public/res-min/themes',
ext: '.css',
},
{
src: 'public/res/styles/base.less',
dest: 'public/res-min/themes/base.css',
}
],
},
},
'string-replace': {
'font-parameters': {
files: {
'./': 'public/res-min/themes/*.css',
},
options: {
replacements: [
{
pattern: /(font\/fontello\.\w+)\?\w+/g,
replacement: '$1'
}
]
}
},
'constants': {
files: {
'public/res/constants.js': 'public/res/constants.js'
},
options: {
replacements: [
{
pattern: /constants\.VERSION = .*/,
replacement: 'constants.VERSION = "<%= pkg.version %>";'
},
]
}
},
'cache-manifest': {
files: {
'public/cache.manifest': 'public/cache.manifest'
},
options: {
replacements: [
{
pattern: /(#Date ).*/,
replacement: '$1<%= grunt.template.today() %>'
},
{
pattern: /(#DynamicResourcesBegin\n)[\s\S]*(\n#DynamicResourcesEnd)/,
replacement: '$1<%= resources %>$2'
},
]
}
},
},
copy: {
resources: {
files: [
// Fonts
{
expand: true,
cwd: 'public/res/font',
src: [
'**'
],
dest: 'public/res-min/font/'
},
// Images
{
expand: true,
cwd: 'public/res/img',
src: [
'**'
],
dest: 'public/res-min/img/'
},
// Libraries
{
expand: true,
cwd: 'public/res/bower-libs/requirejs',
src: [
'require.js'
],
dest: 'public/res-min/'
},
]
}
},
// Inject bower dependencies into RequireJS configuration
bower: {
target: {
rjsConfig: 'public/res/main.js'
}
},
bump: {
options: {
files: [
'package.json',
'bower.json'
],
updateConfigs: [
'pkg'
],
commitFiles: [
'-a'
],
pushTo: 'origin'
}
},
});
/***************************************************************************
* Clean
*/
grunt.registerTask('clean', function() {
// Remove public/res-min folder
grunt.file['delete']('public/res-min');
});
/***************************************************************************
* Build JavaScript
*/
grunt.registerTask('build-js', function() {
// JSHint validation
grunt.task.run('jshint');
// Run r.js optimization
grunt.task.run('requirejs');
});
/***************************************************************************
* Build CSS
*/
grunt.registerTask('build-css', function() {
// First compile less files
grunt.task.run('less:compile');
// Remove fontello checksum arguments
grunt.task.run('string-replace:font-parameters');
});
/***************************************************************************
* Resources
*/
grunt.registerTask('build-res', function() {
// Copy some resources (images, fonts...)
grunt.task.run('copy:resources');
// List resources and inject them in cache.manifest
var resFolderList = [
'public/res-min',
'public/libs/dictionaries',
'public/libs/MathJax/extensions',
'public/libs/MathJax/fonts/HTML-CSS/TeX/woff',
'public/libs/MathJax/jax/element',
'public/libs/MathJax/jax/output/HTML-CSS/autoload',
'public/libs/MathJax/jax/output/HTML-CSS/fonts/TeX',
'public/libs/MathJax/jax/output/HTML-CSS/fonts/STIX'
];
grunt.task.run('list-res:' + resFolderList.join(':'));
grunt.task.run('string-replace:cache-manifest');
});
grunt.registerTask('list-res', function() {
var resourceList = [];
grunt.util.recurse(arguments, function(arg) {
grunt.log.writeln('Listing resources: ' + arg);
grunt.file.recurse(arg, function(abspath) {
resourceList.push(abspath.replace(/^public\//, ''));
});
});
grunt.config.set('resources', resourceList.join('\n'));
});
/***************************************************************************
* Default task
*/
grunt.registerTask('default', function() {
grunt.task.run('clean');
grunt.task.run('build-js');
grunt.task.run('build-css');
grunt.task.run('build-res');
});
/***************************************************************************
* Tag task
*/
grunt.registerTask('tag', function(versionType) {
grunt.task.run('bump-only:' + (versionType || 'patch'));
grunt.task.run('string-replace:constants');
grunt.task.run('default');
grunt.task.run('bump-commit');
});
};

5
public/libs/MathJax/LICENSE → LICENSE Executable file → Normal file
View File

@ -1,4 +1,3 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
@ -179,7 +178,7 @@
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
@ -187,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.

View File

@ -1,4 +0,0 @@
StackEdit - The Markdown editor powered by PageDown.
Copyright 2013 Benoit Schweblin (http://www.benoitschweblin.com)
Licensed under an Apache License (http://www.apache.org/licenses/LICENSE-2.0)

View File

@ -1 +0,0 @@
web: node server.js

218
README.md
View File

@ -1,53 +1,191 @@
StackEdit
=========
<h1 align="center" style="text-align:center;">
<img src="chrome-app/icon-512.png" width="128" />
<br />
StackEdit中文版
</h1>
<p align="center">
<strong>笔记利器在线Markdown编辑器。</strong><br>
项目clone自<a href="https://gitee.com/mafgwo/stackedit" target="_blank" title="豆萁">豆萁/stackedit</a>如果你喜欢该项目请过去点一下Star您的肯定是作者最大的动力
</p>
<p align="center">
<a href="https://stackedit.cn/">https://stackedit.cn</a>
</p>
<p align="center">
<a target="_blank" href="https://www.apache.org/licenses/LICENSE-2.0.txt">
<img src="https://img.shields.io/:license-Apache2-blue.svg" alt="Apache 2" />
</a>
<a target="_blank" href="https://hub.docker.com/r/mafgwo/stackedit">
<img src="https://img.shields.io/docker/pulls/mafgwo/stackedit.svg" alt="Docker Pulls" />
</a>
<a target="_blank" href='https://gitee.com/mafgwo/stackedit/stargazers'>
<img src='https://gitee.com/mafgwo/stackedit/badge/star.svg' alt='gitee star'/>
</a>
</p>
<br/>
<hr />
1 笔记支持Gitee、GitHub、Gitea等Git仓库存储。<br>
2 支持直接上传图片也支持多种外部图床GitHub、Gitea、SM.MS、自定义图床粘贴或拖拽上传。<br>
3 编辑区域支持选择主题或自定义,总有你喜欢的主题。<br>
4 支持历史版本管理,不用担心编辑覆盖后无法回滚。<br>
5 支持ChatGPT辅助写作。<br>
6 支持KaTeX数学表达式、Mermaid UML图、乐谱等扩展。
<hr />
StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.
## 说明
> **NOTE:**
>
> - Documents are stored in the [browser's local storage][1], which means they are not shared between different browsers/computers. Furthermore, clearing your browser's data may delete all your local documents.
> - Full access to Dropbox or Google Drive is required to be able to import any document in StackEdit. Imported documents are downloaded in your browser and are not transmitted to a server.
本项目为本人clone修改自用如果你也喜欢请至原作者处获取及交流。
### StackEdit can:
## 截图
- Manage multiple Markdown documents online or offline
- Export your documents in Markdown, HTML or PDF and format it using a template
- Synchronize your Markdown documents in the Cloud
- Edit existing Markdown documents from Google Drive, Dropbox and your local hard drive
- Post your Markdown document on Blogger/Blogspot, WordPress, Tumblr
- Publish your Markdown document on GitHub, Gist, Google Drive, Dropbox or any SSH server
- Share a link to a Markdown document that renders it in a nice viewer
- Show statistics about your document
- Convert HTML to Markdown
**亮暗主题切换、编辑主题切换**
![](./images/theme.gif)
### Features:
**支持的文档空间**
![](./images/workspace.png)
- Real-time HTML preview with Scroll Link feature to bind editor and preview scrollbars
- Markdown Extra support and Prettify/Highlight.js syntax highlighting
- LaTeX mathematical expressions using MathJax
- WYSIWYG control buttons
- Configurable layout
- Theming support with different themes available
- A la carte extensions
- Offline editing
- Online synchronization using Google Drive and Dropbox
- One click publish on Blogger, Dropbox, Gist, GitHub, Google Drive, SSH server, Tumblr, WordPress
**拖拽粘贴上传图片**
![](./images/uploadimg.gif)
### Documentation:
**支持文档搜索**
![](./images/search.gif)
- [Welcome document][2]
- [Developer guide][3]
- [Theming guide][4]
**ChatGPT集成协助写作**
![](./images/chatgpt.gif)
### Support StackEdit:
## 相比国外开源版本的区别:
[![Fund me on Gittip](https://raw.github.com/gittip/www.gittip.com/master/www/assets/gittip.png)](https://www.gittip.com/stackedit/ "Fund me on Gittip")
- 修复了Github授权登录问题
- 支持了Gitee仓库2022-05-25
- 支持了Gitea仓库2022-05-25
- 汉化2022-06-01
- 主文档空间从GoogleDrive切换为Gitee2022-06-04
- 支持SM.MS图床粘贴/拖拽图片自动上传2022-07-01
- 支持Gitea图床粘贴/拖拽图片自动上传2022-07-02
- 支持自定义图床粘贴/拖拽图片自动上传2022-07-04
- 支持GitHub图床粘贴/拖拽图片自动上传2022-07-31
- 支持了右上角一键切换主题补全了深色主题的样式2022-08-07
- 编辑与预览区域样式优化2022-08-10
- 左边栏文件资源管理支持搜索文件2022-08-17
- 支持[TOC]目录2022-09-04
- 发布支持填写提交信息[针对Gitee、GitHub、Gitea、Gitlab]2022-09-10
- 支持文档空间关闭自动同步[针对Gitee、GitHub、Gitea、Gitlab]关闭后可自定义提交信息2022-09-23
- Gitea支持后端配置指定应用ID和Secret2022-10-03
- 支持编辑区域选择主题样式2022-10-06
- 支持图片直接存储到当前文档空间2022-10-29
- 支持MD文档之间链接跳转2022-11-20
- 支持预览区域选择主题样式2022-12-04
- Gitlab的支持优化2023-02-23
- 导出HTML、PDF支持带预览主题导出2023-02-26
- 支持分享文档2023-03-30
- 支持ChatGPT生成内容2023-04-10
- GitLab授权接口调整2023-08-26
- 主文档空间支持GitHub登录2023-10-19
> **NOTE:** This page has been written and published with [StackEdit][5].
## 国外开源版本弊端:
- 作者已经不维护了或很少维护了
- 不支持国内常用Gitee
- 强依赖GoogleDrive而Google Drive在国内不能正常访问
[1]: https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Storage#localStorage
[2]: https://github.com/benweet/stackedit/blob/master/public/res/WELCOME.md#welcome-to-stackedit---welcome "Welcome document"
[3]: https://github.com/benweet/stackedit/blob/master/doc/developer-guide.md#developer-guide "Developer guide"
[4]: https://github.com/benweet/stackedit/blob/master/doc/theming.md#stackedit-theming-guide "Theming guide"
[5]: https://stackedit.io/ "StackEdit"
## 部署说明
> 建议docker-compose方式部署其他部署方式如遇到问题欢迎提issue。
docker官方仓库下载太慢可以使用阿里云的镜像仓库镜像仓库地址registry.cn-hangzhou.aliyuncs.com/mafgwo/stackedit:【版本号】
`docker-compose.yml`如下:
```yaml
version: "3.7"
services:
stackedit:
image: mafgwo/stackedit:【docker中央仓库找到最新版本】
container_name: stackedit
environment:
- LISTENING_PORT=8080
- ROOT_URL=/
- USER_BUCKET_NAME=root
- DROPBOX_APP_KEY=【不需要支持则删掉】
- DROPBOX_APP_KEY_FULL=【不需要支持则删掉】
- GITHUB_CLIENT_ID=【不需要支持则删掉】
- GITHUB_CLIENT_SECRET=【不需要支持则删掉】
- GITEE_CLIENT_ID=【不需要支持则删掉】
- GITEE_CLIENT_SECRET=【不需要支持则删掉】
- GOOGLE_CLIENT_ID=【不需要支持则删掉】
- GOOGLE_API_KEY=【不需要支持则删掉】
- GITEA_CLIENT_ID=【不需要支持则删掉】
- GITEA_CLIENT_SECRET=【不需要支持则删掉】
- GITEA_URL=【不需要支持则删掉】
- GITLAB_CLIENT_ID=【不需要支持则删掉】
- GITLAB_CLIENT_SECRET=【不需要支持则删掉】
- GITLAB_URL=【不需要支持则删掉】
ports:
- 8080:8080/tcp
network_mode: bridge
restart: always
```
docker-compose方式的启动或停止命令
```bash
# 在 docker-compose.yml 文件目录下 启动命令
docker-compose up -d
# 在 docker-compose.yml 文件目录下 停止命令
docker-compose down
# 更新镜像只需要修改docker-compose.yml中镜像版本执行再停止、启动命令即可
```
或者可以直接通过Docker命名直接启动命令如下
```bash
docker run -itd --name stackedit \
-p 8080:8080 \
-e LISTENING_PORT=8080 \
-e ROOT_URL=/ \
-e USER_BUCKET_NAME=root \
-e DROPBOX_APP_KEY=【不需要支持则删掉】 \
-e DROPBOX_APP_KEY_FULL=【不需要支持则删掉】 \
-e GITHUB_CLIENT_ID=【不需要支持则删掉】 \
-e GITHUB_CLIENT_SECRET=【不需要支持则删掉】 \
-e GITEE_CLIENT_ID=【不需要支持则删掉】 \
-e GITEE_CLIENT_SECRET=【不需要支持则删掉】 \
-e GOOGLE_CLIENT_ID=【不需要支持则删掉】 \
-e GOOGLE_API_KEY=【不需要支持则删掉】 \
-e GITEA_CLIENT_ID=【不需要支持则删掉】 \
-e GITEA_CLIENT_SECRET=【不需要支持则删掉】 \
-e GITEA_URL=【不需要支持则删掉】 \
-e GITLAB_CLIENT_ID=【不需要支持则删掉】 \
-e GITLAB_CLIENT_SECRET=【不需要支持则删掉】 \
-e GITLAB_URL=【不需要支持则删掉】 \
mafgwo/stackedit:【docker中央仓库找到最新版本】
```
## 如何创建三方平台应用
> 部署时如果需要支持Gitee或GitHub则需要自行到对应三方平台创建应用获取到应用ID和秘钥替换到以上的环境变量中再启动应用。
- Gitee的环境变量GITEE_CLIENT_ID、GITEE_CLIENT_SECRET**[如何创建Gitee应用](./docs/部署之Gitee应用创建.md)**
- GitHub的环境变量GITHUB_CLIENT_ID、GITEE_CLIENT_SECRET**[如何创建GitHub应用](./docs/部署之GitHub应用创建.md)**
- Gitea可选择性配置环境变量未配置则在关联时前端指定有配置则仅允许配置的应用信息GITEA_CLIENT_ID、GITEA_CLIENT_SECRET、GITEA_URL**[如何创建Gitea应用](./docs/部署之Gitea应用创建.md)**
- Gitlab可选择性配置环境变量未配置则在关联时前端指定有配置则仅允许配置的应用信息GITLAB_CLIENT_ID、GITLAB_CLIENT_SECRET、GITLAB_URL **如何创建Gitlab应用(待补充文档)**
特别说明自建的Gitea、Gitlab要能接入stackedit必须支持跨域
## 编译与运行
> 编译运行的nodejs版本选择11.15.0版本
```bash
# 安装依赖
npm install
# serve with hot reload at localhost:8080
npm start
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
```

View File

@ -1,36 +0,0 @@
{
"name": "stackedit",
"version": "3.0.1",
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
"dependencies": {
"bootstrap": "v3.0.0",
"jquery": "2.0.3",
"underscore": "1.5.1",
"requirejs": "~2.1.8",
"require-css": "0.1.0",
"require-less": "0.1.0",
"mousetrap": "~1.4.4",
"jgrowl": "~1.2.10",
"google-code-prettify": "~1.0.0",
"highlightjs": "~7.3.0",
"jquery-ui": "~1.10.3",
"FileSaver": "*",
"stacktrace": "~0.5.3",
"requirejs-text": "~2.0.10",
"bootstrap-tour": "~0.7.1",
"ace": "4bbe5346f2ae5ad35c0c47defa244ab27aedd451",
"pagedown-ace": "https://github.com/benweet/pagedown-ace.git#72a27932f6f4f78e93a186aa2947d1f15c1cd7d5",
"pagedown-extra": "https://github.com/jmcmanus/pagedown-extra.git#161c003a733b96644bf67eecc73296ab48558394",
"crel": "git@github.com:KoryNunn/crel.git#8dbda04b129fc0aec01a2a080d1cab26816e11c1",
"waitForImages": "git@github.com:alexanderdickson/waitForImages.git#~1.4.2",
"to-markdown": "git@github.com:benweet/to-markdown.git#jquery",
"Typo.js": "git@github.com:cfinke/Typo.js.git",
"xregexp": "d06eff50f87d81d2dd3afc1e854784c38b17bcc4",
"yaml.js": "git@github.com:jeremyfa/yaml.js.git#~0.1.4",
"lz-string": "git@github.com:pieroxy/lz-string.git"
},
"resolutions": {
"jquery": "2.0.3",
"bootstrap": "v3.0.0"
}
}

37
build.sh Normal file
View File

@ -0,0 +1,37 @@
#!/bin/bash
# 检查参数是否提供版本号
if [ -z "$1" ]; then
echo "请提供版本号作为参数"
exit 1
fi
# 定义版本号变量
VERSION="$1"
IMAGE_NAME="mafgwo/stackedit"
# 构建 Docker 镜像
build_image() {
docker build -t "$IMAGE_NAME" .
}
# 标记 Docker 镜像
tag_image() {
docker tag "$IMAGE_NAME" "$IMAGE_NAME:$VERSION"
docker tag "$IMAGE_NAME" "registry.cn-hangzhou.aliyuncs.com/$IMAGE_NAME:$VERSION"
}
# 推送 Docker 镜像
push_image() {
docker push "$IMAGE_NAME"
docker push "registry.cn-hangzhou.aliyuncs.com/$IMAGE_NAME"
docker push "$IMAGE_NAME:$VERSION"
docker push "registry.cn-hangzhou.aliyuncs.com/$IMAGE_NAME:$VERSION"
}
# 执行构建、标记和推送
build_image
tag_image
push_image
echo "操作完成"

35
build/build.js Normal file
View File

@ -0,0 +1,35 @@
require('./check-versions')()
process.env.NODE_ENV = 'production'
var ora = require('ora')
var rm = require('rimraf')
var path = require('path')
var chalk = require('chalk')
var webpack = require('webpack')
var config = require('../config')
var webpackConfig = require('./webpack.prod.conf')
var spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, function (err, stats) {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n')
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})

48
build/check-versions.js Normal file
View File

@ -0,0 +1,48 @@
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
var shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}

24
build/deploy.sh Normal file
View File

@ -0,0 +1,24 @@
#!/bin/bash
set -e
# Tag and push docker image
docker login -u benweet -p "$DOCKER_PASSWORD"
docker tag benweet/stackedit "benweet/stackedit:$TRAVIS_TAG"
docker push benweet/stackedit:$TRAVIS_TAG
docker tag benweet/stackedit:$TRAVIS_TAG benweet/stackedit:latest
docker push benweet/stackedit:latest
# Build the chart
cd "$TRAVIS_BUILD_DIR"
npm run chart
# Add chart to helm repository
git clone --branch master "https://benweet:$GITHUB_TOKEN@github.com/benweet/stackedit-charts.git" /tmp/charts
cd /tmp/charts
helm package "$TRAVIS_BUILD_DIR/dist/stackedit"
helm repo index --url https://benweet.github.io/stackedit-charts/ .
git config user.name "Benoit Schweblin"
git config user.email "benoit.schweblin@gmail.com"
git add .
git commit -m "Added $TRAVIS_TAG"
git push origin master

9
build/dev-client.js Normal file
View File

@ -0,0 +1,9 @@
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})

94
build/dev-server.js Normal file
View File

@ -0,0 +1,94 @@
require('./check-versions')()
var config = require('../config')
Object.keys(config.dev.env).forEach((key) => {
if (!process.env[key]) {
process.env[key] = JSON.parse(config.dev.env[key]);
}
});
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
// StackEdit custom middlewares
require('../server')(app);
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port
var _resolve
var readyPromise = new Promise(resolve => {
_resolve = resolve
})
console.log('> Starting dev server...')
devMiddleware.waitUntilValid(() => {
console.log('> Listening at ' + uri + '\n')
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
_resolve()
})
var server = app.listen(port)
module.exports = {
ready: readyPromise,
close: () => {
server.close()
}
}

71
build/utils.js Normal file
View File

@ -0,0 +1,71 @@
var path = require('path')
var config = require('../config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
var cssLoader = {
loader: 'css-loader',
options: {
minimize: process.env.NODE_ENV === 'production',
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
var loaders = [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
var output = []
var loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}

12
build/vue-loader.conf.js Normal file
View File

@ -0,0 +1,12 @@
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
})
}

109
build/webpack.base.conf.js Normal file
View File

@ -0,0 +1,109 @@
var path = require('path')
var webpack = require('webpack')
var utils = require('./utils')
var config = require('../config')
var VueLoaderPlugin = require('vue-loader/lib/plugin')
var vueLoaderConfig = require('./vue-loader.conf')
var StylelintPlugin = require('stylelint-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: './src/'
},
node: {
// For mermaid
fs: 'empty' // jison generated code requires 'fs'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('src')
}
},
module: {
rules: [
{
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter')
}
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
// We can't pass graphlibrary to babel
{
test: /\.js$/,
loader: 'string-replace-loader',
include: [
resolve('node_modules/graphlibrary')
],
options: {
search: '^\\s*(?:let|const) ',
replace: 'var ',
flags: 'gm'
}
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [
resolve('src'),
resolve('test'),
resolve('node_modules/mermaid')
],
exclude: [
resolve('node_modules/mermaid/src/diagrams/class/parser'),
resolve('node_modules/mermaid/src/diagrams/flowchart/parser'),
resolve('node_modules/mermaid/src/diagrams/gantt/parser'),
resolve('node_modules/mermaid/src/diagrams/git/parser'),
resolve('node_modules/mermaid/src/diagrams/sequence/parser')
],
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(ttf|eot|otf|woff2?)(\?.*)?$/,
loader: 'file-loader',
options: {
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
},
{
test: /\.(md|yml|html)$/,
loader: 'raw-loader'
}
]
},
plugins: [
new VueLoaderPlugin(),
new StylelintPlugin({
files: ['**/*.vue', '**/*.scss']
}),
new webpack.DefinePlugin({
VERSION: JSON.stringify(require('../package.json').version)
})
]
}

35
build/webpack.dev.conf.js Normal file
View File

@ -0,0 +1,35 @@
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: 'source-map',
plugins: [
new webpack.DefinePlugin({
NODE_ENV: config.dev.env.NODE_ENV
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin()
]
})

154
build/webpack.prod.conf.js Normal file
View File

@ -0,0 +1,154 @@
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var CopyWebpackPlugin = require('copy-webpack-plugin')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
var OfflinePlugin = require('offline-plugin');
var WebpackPwaManifest = require('webpack-pwa-manifest')
var FaviconsWebpackPlugin = require('favicons-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
var env = config.build.env
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
NODE_ENV: env.NODE_ENV,
GOOGLE_CLIENT_ID: env.GOOGLE_CLIENT_ID,
GITHUB_CLIENT_ID: env.GITHUB_CLIENT_ID
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true
}
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
]),
new FaviconsWebpackPlugin({
logo: resolve('src/assets/favicon.png'),
title: 'StackEdit',
}),
new WebpackPwaManifest({
name: 'StackEdit',
description: 'Full-featured, open-source Markdown editor',
display: 'standalone',
orientation: 'any',
start_url: 'app',
background_color: '#ffffff',
crossorigin: 'use-credentials',
icons: [{
src: resolve('src/assets/favicon.png'),
sizes: [96, 128, 192, 256, 384, 512]
}]
}),
new OfflinePlugin({
ServiceWorker: {
events: true
},
AppCache: true,
excludes: ['**/.*', '**/*.map', '**/index.html', '**/static/oauth2/callback.html', '**/icons-*/*.png', '**/static/fonts/KaTeX_*'],
externals: ['/', '/app', '/oauth2/callback']
}),
]
})
if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig

View File

@ -0,0 +1,56 @@
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var utils = require('./utils')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
var StylelintPlugin = require('stylelint-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
style: './src/styles/'
},
module: {
rules: [{
test: /\.(ttf|eot|otf|woff2?)(\?.*)?$/,
loader: 'file-loader',
options: {
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}]
.concat(utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})),
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: config.build.assetsPublicPath
},
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: '[name].css',
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true
}
}),
]
}

22
chart/.helmignore Normal file
View File

@ -0,0 +1,22 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

5
chart/Chart.yaml Normal file
View File

@ -0,0 +1,5 @@
apiVersion: v1
appVersion: vSTACKEDIT_VERSION
description: In-browser Markdown editor
name: stackedit
version: STACKEDIT_VERSION

21
chart/templates/NOTES.txt Normal file
View File

@ -0,0 +1,21 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "stackedit.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "stackedit.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "stackedit.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "stackedit.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
{{- end }}

View File

@ -0,0 +1,45 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "stackedit.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "stackedit.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "stackedit.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Common labels
*/}}
{{- define "stackedit.labels" -}}
app.kubernetes.io/name: {{ include "stackedit.name" . }}
helm.sh/chart: {{ include "stackedit.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}

View File

@ -0,0 +1,87 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "stackedit.fullname" . }}
labels:
{{ include "stackedit.labels" . | indent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "stackedit.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "stackedit.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
volumeMounts:
- mountPath: /run
name: run-volume
- mountPath: /tmp
name: tmp-volume
env:
- name: PORT
value: "80"
- name: PAYPAL_RECEIVER_EMAIL
value: {{ .Values.paypalReceiverEmail }}
- name: AWS_ACCESS_KEY_ID
value: {{ .Values.awsAccessKeyId }}
- name: AWS_SECRET_ACCESS_KEY
value: {{ .Values.awsSecretAccessKey }}
- name: DROPBOX_APP_KEY
value: {{ .Values.dropboxAppKey }}
- name: DROPBOX_APP_KEY_FULL
value: {{ .Values.dropboxAppKeyFull }}
- name: GOOGLE_CLIENT_ID
value: {{ .Values.googleClientId }}
- name: GOOGLE_API_KEY
value: {{ .Values.googleApiKey }}
- name: GITHUB_CLIENT_ID
value: {{ .Values.githubClientId }}
- name: GITHUB_CLIENT_SECRET
value: {{ .Values.githubClientSecret }}
- name: WORDPRESS_CLIENT_ID
value: {{ .Values.wordpressClientId }}
- name: WORDPRESS_SECRET
value: {{ .Values.wordpressSecret }}
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumes:
- name: run-volume
emptyDir: {}
- name: tmp-volume
emptyDir: {}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

View File

@ -0,0 +1,39 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "stackedit.fullname" . -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{ include "stackedit.labels" . | indent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ . }}
pathType: Prefix
backend:
service:
name: {{ $fullName }}
port:
name: http
{{- end }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "stackedit.fullname" . }}
labels:
{{ include "stackedit.labels" . | indent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: {{ include "stackedit.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}

View File

@ -0,0 +1,15 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "stackedit.fullname" . }}-test-connection"
labels:
{{ include "stackedit.labels" . | indent 4 }}
annotations:
"helm.sh/hook": test-success
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "stackedit.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

71
chart/values.yaml Normal file
View File

@ -0,0 +1,71 @@
# Default values for stackedit.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
dropboxAppKey: ""
dropboxAppKeyFull: ""
googleClientId: ""
googleApiKey: ""
githubClientId: ""
githubClientSecret: ""
giteeClientId: ""
giteeClientSecret: ""
wordpressClientId: ""
wordpressSecret: ""
paypalReceiverEmail: ""
awsAccessKeyId: ""
awsSecretAccessKey: ""
giteaClientId: ""
giteaClientSecret: ""
giteaUrl: ""
gitlabClientId: ""
gitlabUrl: ""
replicaCount: 1
image:
repository: benweet/stackedit
tag: vSTACKEDIT_VERSION
pullPolicy: IfNotPresent
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
service:
type: ClusterIP
port: 80
ingress:
enabled: false
annotations:
# kubernetes.io/ingress.class: nginx
# certmanager.k8s.io/issuer: letsencrypt-prod
# certmanager.k8s.io/acme-challenge-type: http01
hosts: []
# - host: stackedit.example.com
# paths:
# - /
tls: []
# - secretName: stackedit-tls
# hosts:
# - stackedit.example.com
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
affinity: {}

BIN
chrome-app/icon-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
chrome-app/icon-16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
chrome-app/icon-256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
chrome-app/icon-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
chrome-app/icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
chrome-app/icon-64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

28
chrome-app/manifest.json Normal file
View File

@ -0,0 +1,28 @@
{
"name": "StackEdit中文版",
"description": "支持Gitee仓库/粘贴图片自动上传的浏览器内 Markdown 编辑器",
"version": "5.15.17",
"manifest_version": 2,
"container": "GITEE",
"api_console_project_id": "241271498917",
"icons": {
"16": "icon-16.png",
"32": "icon-32.png",
"64": "icon-64.png",
"128": "icon-128.png",
"256": "icon-256.png",
"512": "icon-512.png"
},
"app": {
"urls": [
"https://md.jonylee.top/"
],
"launch": {
"web_url": "https://md.jonylee.top/app"
}
},
"offline_enabled": true,
"permissions": [
"unlimitedStorage"
]
}

18
config/dev.env.js Normal file
View File

@ -0,0 +1,18 @@
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
// 以下配置是开发临时用的配置 随时可能失效 请替换为自己的
GITHUB_CLIENT_ID: '"845b8f75df48f2ee0563"',
GITHUB_CLIENT_SECRET: '"80df676597abded1450926861965cc3f9bead6a0"',
GITEE_CLIENT_ID: '"925ba7c78b85dec984f7877e4aca5cab10ae333c6d68e761bdb0b9dfb8f55672"',
GITEE_CLIENT_SECRET: '"f05731066e42d307339dc8ebbb037a103881dafc7207a359a393b87749f1c562"',
CLIENT_ID: '"thF3qCGLN39OtafjGnqHyj6n02WwE6xD"',
// GITEA_CLIENT_ID: '"fe30f8f9-b1e8-4531-8f72-c1a5d3912805"',
// GITEA_CLIENT_SECRET: '"lus7oMnb3H6M1hsChndphArE20Txr7erwJLf7SDBQWTw"',
// GITEA_URL: '"https://gitea.test.com"',
GITLAB_CLIENT_ID: '"074cd5103c62dea0f479dac861039656ac80935e304c8113a02cc64c629496ae"',
GITLAB_CLIENT_SECRET: '"6f406f24216b686d55d28313dec1913c2a8e599afdb08380d5e8ce838e16e41e"',
GITLAB_URL: '"http://gitlab.qicoder.com"',
})

39
config/index.js Normal file
View File

@ -0,0 +1,39 @@
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
productionSourceMap: true,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
},
dev: {
env: require('./dev.env'),
port: 80,
autoOpenBrowser: false,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
// cssSourceMap: false
cssSourceMap: true
}
}

3
config/prod.env.js Normal file
View File

@ -0,0 +1,3 @@
module.exports = {
NODE_ENV: '"production"'
}

View File

@ -1,661 +0,0 @@
Developer guide
===============
Getting started
---------------
### Pre-requisites
- [Git][1]
- [node.js/npm][2]
- [Grunt][3]
- [Bower][4]
### Before debugging
- Download development tools:
npm install
- Download dependencies:
bower install
- Serve **StackEdit** at `http://localhost/`:
(export PORT=80 && node server.js)
- Run Chrome without application cache:
chrome --disable-application-cache
- Run **StackEdit** in debug mode (serve original files instead of minified):
http://localhost/?debug
### Add new dependencies
> **NOTE:** StackEdit uses [RequireJS][5] for asynchronous module definition ([AMD][6]).
- Install new dependencies using [Bower][7]:
bower install <library> --save
- Add the new dependency to [RequireJS][8] configuration file (`main.js`):
grunt bower
### Build/minify
grunt
### Deploy
- on Heroku:
heroku create
heroku rename my-stackedit-instance
git push heroku master
- in a Docker container:
docker build -t my-stackedit-image .
docker run -p 3000 my-stackedit-image
> **NOTE:** OAuth authorizations work out of the box for address `http://localhost/` except for WordPress. To allow an other address, you have to add specific keys at the end of `constants.js` and eventually to set up specific proxies with the corresponding key/secret pairs ([WordPress Proxy][9], [Tumblr Proxy][10] and [Gatekeeper][11]).
Architecture
------------
![Architecture diagram][12]
The modules are loaded by RequireJS in the following order:
1. The 3rd party libraries (jQuery, underscore.js...)
2. The `Extension` objects
3. The `EventMgr` module
4. The `core` module
5. The `fileMgr` module and the `helpers` modules
6. The `provider` modules
7. The `publisher` and `synchronizer` modules
This is important to notice in order to avoid circular dependencies. For instance, if an `Extension` is declared with the `core` module as a dependency, RequireJS will inject `undefined` instead of the actual module.
Any module though can access any dependencies by implementing the proper [injection listener][13] provided by the `eventMgr`.
----------
### core
The `core` module is responsible for:
- creating the [UI Layout][14], the [ACE][15] editor and the [PageDown][16] editor,
- loading/saving the settings,
- running periodic tasks,
- detecting the user activity,
- checking the offline status.
**Attributes:**
- `isOffline`: indicates the offline status of the application.
**Methods:**
- `onReady(callback)`: sets a callback to be called when all modules have been loaded and the DOM is ready.
> **NOTE:** This is preferred over [jQuery's `.ready()`][17] because it ensures that all AMD modules are loaded by [RequireJS][18].
- `runPeriodically(callback)`: sets a callback to be called every second.
> **NOTE:** The callback will not run if the user is inactive or in StackEdit Viewer. User is considered inactive after 5 minutes of inactivity (mouse or keyboard).
- `setOffline()`: can be called by any other modules when a network timeout occurs for instance.
> **NOTE:** the offline status is also set by detecting the window `offline` event. `core.isOffline` is automatically set to `false` when the network is recovered.
- `initEditor(fileDesc)`: creates or refreshes the [PageDown][19] editor with a given [`FileDescriptor`][20] object.
----------
### fileMgr
The `fileMgr` module is responsible for:
- creating and deleting local files,
- switching from one file to another.
**Attributes:**
- `currentFile`: the [`FileDescriptor`][21] object that is currently edited.
**Methods:**
- `createFile(title, content)`: creates a [`FileDescriptor`][22] object, add it in the [`fileSystem`][23] map and returns it.
- `deleteFile(fileDesc)`: deletes a [`FileDescriptor`][24] object from the [`fileSystem`][25] map.
- `selectFile(fileDesc)`: selects a [`FileDescriptor`][26] object for editing.
#### FileDescriptor
The `FileDescriptor` class represents a local file. A `FileDescriptor` object has the following properties:
- `fileIndex`: the unique string index of the file in the file system.
- `title`: the title of the document.
- `content`: the content of the document.
- `syncLocations`: a map containing all the associated [`syncAttributes`][27] objects with their `syncIndex` as a key.
- `publishLocations`: a map containing all the associated [`publishAttributes`][28] objects with their `publishIndex` as a key.
And the following methods:
- `addSyncLocation(syncAttributes)`: associates a [`syncAttributes`][29] object with the file.
- `removeSyncLocation(syncAttributes)`: unassociates a [`syncAttributes`][30] object with the file.
- `addPublishLocation(publishAttributes)`: associates a [`publishAttributes`][31] object with the file.
- `removePublishLocation(publishAttributes)`: unassociates a [`publishAttributes`][32] object with the file.
#### fileSystem
The `fileSystem` module is a map containing all the [`FileDescriptor`][33] objects with their `fileIndex` as a key.
----------
### synchronizer
The `synchronizer` module is responsible for:
- creating a new local file from a sync location (import).
- creating a new sync location from a local file (export).
- running 2 ways synchronization (upload and download) for all sync locations.
#### synchronizer's providers
A [`provider`][34] module can be associated with the `synchronizer` module if it implements the following functions:
- `importFiles()`: downloads one or multiple files and create local files associated with the sync locations.
- `exportFile()`: uploads a local file to a new sync location.
- `syncDown()`: performs a download of all the changes operated on all sync locations.
- `syncUp()`: performs an upload of a change to a sync location.
#### syncAttributes
A `syncAttributes` object is an object that describes a sync location. Attributes differ from one provider to another except for the following:
- `syncIndex`: the unique string index of the publish location.
- `provider`: the [`provider`][35] module that handles the sync location.
----------
### publisher
The `publisher` module is responsible for:
- creating new publish locations,
- updating existing publish locations.
#### publisher's providers
A [`provider`][36] module can be associated with the `publisher` module if it implements the following functions:
- `newPublishAttributes()`: returns a new [`publishAttributes`][37] object in order to create a new publish location.
- `publish()`: performs publishing of one publish location.
#### publishAttributes
A `publishAttributes` object is an object that describes a publish location. Attributes differ from one provider to another except for the following:
- `publishIndex`: the unique string index of the publish location.
- `provider`: the [`provider`][38] module that handles the publish location.
- `format`: the publishing format for the publish location. It can be:
- `markdown` for Markdown format.
- `html` for HTML format.
- `template` for template format.
----------
### eventMgr
The `eventMgr` module is responsible for receiving and dispatching events. Below is the list of all events signatures.
Most events (those that are triggered outside the `eventMgr` module) can be triggered by calling methods of the same name in the `eventMgr` module. For example:
```js
eventMgr.onMessage('StackEdit is awesome!');
```
The method `addListener(eventName, callback)` of the `eventMgr` module can be used to listen to these events (except those that can only be handled by `Extension` objects). For example:
```js
eventMgr.addListener('onMessage', function(message) {
alert(message);
});
```
`Extension` objects have the possibility to listen to those events by implementing methods of the same name. For example:
```js
userCustom.onMessage = function(message) {
alert(message);
};
```
----------
#### Core events
- **`onReady()`**
All the modules are loaded and the DOM is ready.
> Triggered by the `core` module.
> This is preferred over [jQuery's `.ready()`][39] because it ensures that all modules have been loaded by RequireJS.
- **`onMessage(message)`**
A message destined to the user has been produced.
- `message`: the text string of the message.
- **`onError(error)`**
An error has been thrown.
- `error`: an error object or a string.
- **`onOfflineChanged(isOffline)`**
The off-line status has changed.
- `isOffline`: the off-line status.
> Triggered by the `core` module.
- **`onUserActive()`**
The user has just moved the mouse or pressed the keyboard.
> Triggered by the `core` module.
- **`onAsyncRunning(isRunning)`**
Some asynchronous tasks have just started or stopped.
- `isRunning`: true if started, false if stopped.
> Triggered by the `AsyncTask` module.
- **`onPeriodicRun()`**
A hook that is called periodically (every 1 second if user is active).
> Triggered by the `core` module.
- **`onLoadSettings()`**
A hook that is called when the settings dialog has to be refreshed. Each extension that has configuration inputs in the settings dialog has to implement a listener for this event.
> Triggered by the `core` module. Only `Extension` objects can handle this event.
- **`onSaveSettings(newConfig, event)`**
A hook that is called when the settings dialog has to be validated. Each extension that has configuration is the settings dialog has to implement a listener for this event.
- `newConfig`: the new configuration object, deduced from the settings dialog inputs.
- `event`: the submit event object. `stopPropagation` has to be called in case of an error when parsing settings dialog inputs.
> Triggered by the `core` module. Only `Extension` objects can handle this event.
- **`onInit()`**
A hook allowing enabled extensions to initialize.
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
> This event is triggered before `onReady` event and just after the `config` and `enabled` extensions properties have been set by the `eventMgr`.
----------
#### Module injection
- **`onFileMgrCreated(fileMgr)`**
The `fileMgr` module has been created.
- `fileMgr`: the `fileMgr` module.
> Triggered by the `fileMgr` module.
- **`onSynchronizerCreated(synchronizer)`**
The `synchronizer` module has been created.
- `synchronizer`: the `synchronizer` module.
> Triggered by the `synchronizer` module.
- **`onPublisherCreated(publisher)`**
The `publisher` module has been created.
- `publisher`: the `publisher` module.
> Triggered by the `publisher` module.
- **`onEventMgrCreated()`**
The `eventMgr` module has been created.
- `eventMgr`: the `eventMgr` module.
> Triggered by the `eventMgr` module.
----------
#### Operations on files
- **`onFileCreated(fileDesc)`**
A [`FileDescriptor`][41] object has been created.
- `fileDesc`: the [`FileDescriptor`][42] object.
> Triggered by the `fileMgr` module.
- **`onFileDeleted(fileDesc)`**
A [`FileDescriptor`][43] object has been removed from the `fileSystem` module.
- `fileDesc`: the [`FileDescriptor`][44] object.
> Triggered by the `fileMgr` module.
- **`onFileSelected(fileDesc)`**
A [`FileDescriptor`][45] object has been selected.
- `fileDesc`: the [`FileDescriptor`][46] object.
> Triggered by the `fileMgr` module. This event is triggered before `onFileClosed` (if another document is open) and `onFileOpen` events.
- **`onFileClosed(fileDesc)`**
The current [`FileDescriptor`][47] object is about to be detached from the editor.
- `fileDesc`: the [`FileDescriptor`][48] object.
> Triggered by the `fileMgr` module. This event is triggered after `onFileSelected` event and before `onFileClosed` event.
- **`onFileOpen(fileDesc)`**
The selected [`FileDescriptor`][49] object has been attached to the editor.
- `fileDesc`: the [`FileDescriptor`][50] object.
> Triggered by the `fileMgr` module. This event is triggered after `onFileSelected` and `onFileClosed` (if another document is open) events.
- **`onContentChanged(fileDesc)`**
The content of a [`FileDescriptor`][51] object has been modified.
- `fileDesc`: the [`FileDescriptor`][52] object.
- **`onTitleChanged(fileDesc)`**
The content of a [`FileDescriptor`][53] object has been modified.
- `fileDesc`: the [`FileDescriptor`][54] object.
- **`onFoldersChanged()`**
The folders structure has changed.
----------
#### Sync events
- **`onSyncRunning(isRunning)`**
A synchronization job has just started or stopped.
- `isRunning`: true if started, false if stopped.
> Triggered by the `synchronizer` module.
> A synchronization job is the action to download and upload all detected changes for all sync locations of all documents.
- **`onSyncSuccess()`**
A synchronization job has successfully finished.
> Triggered by the `synchronizer` module.
> A synchronization job is the action to download and upload all detected changes for all sync locations of all documents.
- **`onSyncImportSuccess(fileDescList, provider)`**
The import of documents has successfully finished.
- `fileDescList`: the list of [`FileDescriptor`][55] objects that have been created.
- `provider`: the [`provider`][56] module that handled the import.
> Triggered by the [`provider`][57] module that handled the import.
> An import is the action to download multiple files and to create, for each, one [`FileDescriptor`][55] objects with one sync location.
- **`onSyncExportSuccess(fileDesc, syncAttributes)`**
The export of one document has successfully finished.
- `fileDesc`: the [`FileDescriptor`][58] object that has been exported.
- `syncAttributes`: the descriptor object of the new sync location.
> Triggered by the `synchronizer` module.
> An export is the action to upload one file and to create one new sync location associated with one existing `FileDescriptor`][55] object.
- **`onSyncRemoved(fileDesc, syncAttributes)`**
A sync location has been removed from a [`FileDescriptor`][59] object.
- `fileDesc`: the [`FileDescriptor`][60] object.
- `syncAttributes`: the descriptor object of the removed sync location.
----------
#### Publish events
- **`onPublishRunning(isRunning)`**
A document publication job has just started or stopped.
- `isRunning`: true if started, false if stopped.
> Triggered by the `publisher` module.
> A publication job is the action to upload changes on multiple publish locations associated with one `FileDescriptor`][55] object.
- **`onPublishSuccess(fileDesc)`**
A document publication job has successfully finished.
- `fileDesc`: the [`FileDescriptor`][60] object that has been published.
> Triggered by the `publisher` module.
> A publication job is the action to upload changes on multiple publish locations associated with one `FileDescriptor`][55] object.
- **`onNewPublishSuccess(fileDesc, publishAttributes)`**
A new publish location has been successfully created.
- `fileDesc`: the [`FileDescriptor`][60] object that has been published.
- `publishAttributes`: the descriptor object of the new publish location.
> Triggered by the `publisher` module.
- **`onPublishRemoved(fileDesc, publishAttributes)`**
A publish location has been removed from a [`FileDescriptor`][59] object.
- `fileDesc`: the [`FileDescriptor`][60] object.
- `publishAttributes`: the descriptor object of the removed publish location.
> Triggered by the `publisher` module.
----------
#### Operations on UI Layout
- **`onLayoutConfigure(layoutConfig)`**
The layout is about to be configured.
- `layoutConfig`: the configuration object of the UI Layout library.
> Triggered by the `core` module.
- **`onLayoutCreated(layout)`**
The layout has just been created.
- `layout`: the layout object of the UI Layout library.
> Triggered by the `core` module.
- **`onLayoutResize(paneName)`**
One pane of the layout has been resized.
- `paneName`: the name of the resized layout pane.
> Triggered by the `core` module.
- **`onCreateButton()`**
Allows extensions to add their own buttons in the navigation bar. Implemented listeners have to return an HTML button element. For example:
userCustom.onCreateButton = function() {
var button = $('<button class="btn btn-success"><i class="icon-rocket"></i></button>');
button.click(function() {
eventMgr.onMessage('Booom!');
});
return button[0];
};
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
- **`onCreateEditorButton()`**
Allows extensions to add their own buttons in the side bar. Implemented listeners have to return an HTML button element. See `onCreateButton` for a concrete example.
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
- **`onCreatePreviewButton()`**
Allows extensions to add their own buttons over the preview. Implemented listeners have to return an HTML button element. See `onCreateButton` for a concrete example.
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
----------
#### Operations on PageDown
- **`onPagedownConfigure(editor)`**
The Pagedown editor is about to be created.
- `editor`: the Pagedown editor object before `run` has been called.
> Triggered by the `core` module.
- **`onAsyncPreview(callback)`**
Called after Pagedown's synchronous rendering to trigger extra asynchronous rendering (such as MathJax). Implemented listeners have to call the callback parameter after processing in order other `onAsyncPreview` listeners to run.
- `callback`: the callback to call at the end of the asynchronous processing.
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
- **`onPreviewFinished(html)`**
Called after every `onAsyncPreview` listeners have been called.
- `html`: the finally rendered HTML.
- **`onSectionsCreated(sectionList)`**
The Markdown has been split into sections before rendering.
- `sectionList`: the list of section objects. Each section object contains:
- `text`: the markdown substring contained in the section.
- `textWithDelimiter`: the text with an added delimiter.
> Triggered by the `markdownSectionParser` extension.
- **`onMarkdownTrim(offset)`**
The Markdown has been left trimmed by a certain number of character.
- `offset`: the number of characters that have been removed.
> Triggered by the `yamlFrontMatterParser` extension.
----------
#### Operation on ACE
- **`onAceCreated(aceEditor)`**
The ACE editor has just been created.
- `aceEditor`: the ACE editor object.
> Triggered by the `core` module.
> Written with [StackEdit](https://stackedit.io/).
[1]: http://git-scm.com/
[2]: http://nodejs.org/
[3]: http://gruntjs.com/
[4]: http://bower.io/
[5]: http://requirejs.org/ "RequireJS"
[6]: http://en.wikipedia.org/wiki/Asynchronous_module_definition "Asynchronous module definition"
[7]: http://bower.io/
[8]: http://requirejs.org/ "RequireJS"
[9]: https://github.com/benweet/stackedit-wordpress-proxy
[10]: https://github.com/benweet/stackedit-tumblr-proxy
[11]: https://github.com/prose/gatekeeper
[12]: https://lh6.googleusercontent.com/-sr6zRtyaoUk/Un5qSakOzPI/AAAAAAAAFC0/oI5If5fI9Gw/s0/StackEdit%252520architecture%252520-%252520New%252520Page%252520%2525283%252529.png "StackEdit architecture"
[13]: #module-injection
[14]: http://layout.jquery-dev.net/ "UI Layout"
[15]: http://ace.c9.io
[16]: https://code.google.com/p/pagedown/ "PageDown"
[17]: http://api.jquery.com/ready/
[18]: http://requirejs.org/ "RequireJS"
[19]: https://code.google.com/p/pagedown/ "PageDown"
[20]: #filedescriptor
[21]: #filedescriptor
[22]: #filedescriptor
[23]: #filesystem
[24]: #filedescriptor
[25]: #filesystem
[26]: #filedescriptor
[27]: #syncattributes
[28]: #publishattributes
[29]: #syncattributes
[30]: #syncattributes
[31]: #publishattributes
[32]: #publishattributes
[33]: #filedescriptor
[34]: #provider
[35]: #provider
[36]: #provider
[37]: #publishattributes
[38]: #provider
[39]: http://api.jquery.com/ready/
[40]: http://requirejs.org/ "RequireJS"
[41]: #filedescriptor
[42]: #filedescriptor
[43]: #filedescriptor
[44]: #filedescriptor
[45]: #filedescriptor
[46]: #filedescriptor
[47]: #filedescriptor
[48]: #filedescriptor
[49]: #filedescriptor
[50]: #filedescriptor
[51]: #filedescriptor
[52]: #filedescriptor
[53]: #filedescriptor
[54]: #filedescriptor
[55]: #filedescriptor
[56]: #provider
[57]: #provider
[58]: #filedescriptor
[59]: #filedescriptor
[60]: #filedescriptor

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,34 +0,0 @@
StackEdit theming guide
=======================
In **StackEdit**, a theme is pretty much a [LESS][1] file that overrides the default look and feel.
### Create your special theme very quickly by following these steps
1. Fork **StackEdit** on [GitHub][2] and clone the repository localy.
2. Install the development tools as described in the [Developer guide][3].
3. In `res/themes`, create a LESS file, just like the other themes.
> You can put images in `res/img`.
4. Add an entry in `THEME_LIST` at the end of `config.js` with the filename as a key and the name of your theme as a value.
> **Example:** `"cool": "The coolest ever"`
5. Run the application on your machine using the `?debug` flag. Basically:
http://localhost/stackedit/?debug
6. Go to `Settings -> Editor -> Theme` and select your theme. Check that everything is fine.
7. Commit, push, create a pull request and wait for publishing.
> Written with [StackEdit](http://benweet.github.io/stackedit/).
[1]: http://lesscss.org/
[2]: https://github.com/benweet/stackedit
[3]: https://github.com/benweet/stackedit/blob/master/doc/developer-guide.md#getting-started

View File

@ -0,0 +1,10 @@
# 大文档导出PDF方式说明
> 由于大文档导出PDF需要消费非常多的服务器资源而且很容易导致导出超时故导出PDF的MD文档过大时可以使用 **[wkhtmltopdf](https://wkhtmltopdf.org/downloads.html)** 工具导出。
# 操作步骤
- 先在 **[StackEdit中文版](https://stackedit.cn/app)** 中使用 `导出为HTML` 功能导出MD文档导出后可以得到一个HTML文档。
- 到 **[wkhtmltopdf](https://wkhtmltopdf.org/downloads.html)** 官网下载安装程序。
- 使用 wkhtmltopdf 的导出PDF的命令 `wkhtmltopdf [GLOBAL OPTION]... [OBJECT]... <output file>` 把HTML导出为PDF如简单的导出命令`wkhtmltopdf test.html test.pdf`,具体的 `GLOBAL OPTION` 参数说明可以通过 `wkhtmltopdf -H` 查看帮助文档。

View File

@ -0,0 +1,20 @@
# GitHub应用配置说明
> StackEdit中文版部署如果需要支持GitHub则需要到GitHub创建一个应用并复制其中的clientId和clientSecret填充到环境变量 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET 中。
# 如何创建GitHub应用
按下面图的指示创建
![](../images/github/github01.png)
![](../images/github/github02.png)
![](../images/github/github03.png)
![](../images/github/github04.png)
![](../images/github/github05.png)

View File

@ -0,0 +1,35 @@
# Gitea应用配置说明
> StackEdit中文版支持Gitea则需要到Gitea创建一个应用在StackEdit中文版绑定Gitea账号的时候填入。
# 如何创建Gitea应用
按下面图的指示创建
![](../images/gitea/gitea01.png)
![](../images/gitea/gitea02.png)
![](../images/gitea/gitea03.png)
![](../images/gitea/gitea04.png)
创建成功后即可看到应用ID 和 应用秘钥。
# Gitea跨域问题
由于StackEdit中文版是从浏览器直接访问Gitea接口故个人部署的Gitea需要支持跨域至于如何支持跨域请参考官方文档https://docs.gitea.io/en-us/config-cheat-sheet/#cors-cors (官方跨域的支持好像存在问题我个人包括很多网友通过这个配置支持跨域都失败了如果你也失败了可以试试用nginx代理实现跨域)
nginx配置实现跨域的配置如下
```
add_header Access-Control-Allow-Headers *;
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
if ($request_method = 'OPTIONS') {
return 204;
}
```

View File

@ -0,0 +1,19 @@
# Gitee应用配置说明
> StackEdit中文版部署如果需要支持Gitee则需要到Gitee创建一个应用并复制其中的clientId和clientSecret填充到环境变量 GITEE_CLIENT_ID 和 GITEE_CLIENT_SECRET 中。
# 如何创建Gitee应用
按下面图的指示创建
![](../images/gitee/gitee01.png)
![](../images/gitee/gitee02.png)
![](../images/gitee/gitee03.png)
![](../images/gitee/gitee04.png)
创建成功后即可看到client id 和 client secret。

20
gulpfile.js Normal file
View File

@ -0,0 +1,20 @@
const path = require('path');
const gulp = require('gulp');
const concat = require('gulp-concat');
const prismScripts = [
'prismjs/components/prism-core',
'prismjs/components/prism-markup',
'prismjs/components/prism-clike',
'prismjs/components/prism-c',
'prismjs/components/prism-javascript',
'prismjs/components/prism-css',
'prismjs/components/prism-ruby',
'prismjs/components/prism-cpp',
].map(require.resolve);
prismScripts.push(
path.join(path.dirname(require.resolve('prismjs/components/prism-core')), 'prism-!(*.min).js'));
gulp.task('build-prism', () => gulp.src(prismScripts)
.pipe(concat('prism.js'))
.pipe(gulp.dest(path.dirname(require.resolve('prismjs')))));

BIN
images/chatgpt.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
images/dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 KiB

BIN
images/fileSearch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
images/gitea/gitea01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
images/gitea/gitea02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
images/gitea/gitea03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
images/gitea/gitea04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
images/gitee/gitee01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
images/gitee/gitee02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
images/gitee/gitee03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
images/gitee/gitee04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
images/github/github01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
images/github/github02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
images/github/github03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
images/github/github04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
images/github/github05.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
images/imageBed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

BIN
images/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 KiB

BIN
images/qq.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
images/search.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

BIN
images/theme.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 KiB

BIN
images/uploadimg.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB

BIN
images/workspace.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="192" height="192" viewBox="0, 0, 192, 192">
<g id="Layer 4">
<path d="M157.714,12 C165.803,11.992 173.176,14.746 179.523,19.34 C180.39,19.967 181.072,20.792 181.847,21.518 L96,102 L10.153,21.518 C17.006,14.843 24.608,12.458 34.286,12 z" fill="#FFD900"/>
<path d="M10.153,21.518 L96,102 L10.153,182.482 C3.033,176.056 0.488,168.93 -0,159.857 L-0,44.143 C0.045,38.796 1.413,33.541 4.138,28.822 C5.185,27.009 6.599,25.405 7.829,23.697 z" fill="#8DC213"/>
<path d="M96,102 L181.847,182.482 C174.993,189.157 167.392,191.542 157.714,192 L34.286,192 C26.197,192.008 18.824,189.254 12.477,184.66 C11.61,184.032 10.928,183.208 10.153,182.482 z" fill="#FF610D"/>
<path d="M181.847,21.518 C188.968,27.944 191.511,35.07 192,44.143 L192,159.857 C192.008,167.441 189.071,174.353 184.171,180.303 C183.501,181.116 182.622,181.755 181.847,182.482 L96,102 z" fill="#3399FF"/>
</g>
<g id="Layer 2" display="none">
<g>
<path d="M38.9,62.694 L68.199,62.694 L76.19,24.5 L94.169,24.5 L86.179,62.694 L119.949,62.694 L127.75,24.5 L145.729,24.5 L137.928,62.694 L154.1,62.694 L154.1,81.542 L134.504,81.542 L128.511,111.758 L154.1,111.758 L154.1,130.605 L125.086,130.605 L117.285,168.5 L99.211,168.5 L107.107,130.605 L72.956,130.605 L65.536,168.5 L47.366,168.5 L55.072,130.605 L38.9,130.605 L38.9,111.758 L58.782,111.758 L64.775,81.542 L38.9,81.542 z M82.754,81.542 L76.761,111.658 L110.627,111.658 L116.524,81.542 z" fill="#737373"/>
<path d="M38.9,62.694 L68.199,62.694 L76.19,24.5 L94.169,24.5 L86.179,62.694 L119.949,62.694 L127.75,24.5 L145.729,24.5 L137.928,62.694 L154.1,62.694 L154.1,81.542 L134.504,81.542 L128.511,111.758 L154.1,111.758 L154.1,130.605 L125.086,130.605 L117.285,168.5 L99.211,168.5 L107.107,130.605 L72.956,130.605 L65.536,168.5 L47.366,168.5 L55.072,130.605 L38.9,130.605 L38.9,111.758 L58.782,111.758 L64.775,81.542 L38.9,81.542 z M82.754,81.542 L76.761,111.658 L110.627,111.658 L116.524,81.542 z" fill-opacity="0" stroke="#737373" stroke-width="3"/>
</g>
</g>
<g id="Layer 5">
<path d="M46.5,36 L145.5,36 C157.926,36 168,45.234 168,56.625 L168,147.375 C168,158.766 157.926,168 145.5,168 L46.5,168 C34.074,168 24,158.766 24,147.375 L24,56.625 C24,45.234 34.074,36 46.5,36 z" fill="#FFFFFF"/>
<path d="M60,48 C60,48 60,60 60,60 C60,60 72,60 72,60 L72,48 L84,48 L84,60 L96,60 L96,72 L84,72 L84,84 L96,84 L96,96 L84,96 L84,108 L72,108 L72,96 L60,96 L60,108 L48,108 L48,96 L36,96 L36,84 C36,84 48,84 48,84 C48,84 48,72 48,72 L36,72 L36,60 L48,60 L48,48 z M72,72 C72,72 60,72 60,72 L60,84 L72,84 C72,84 72,72 72,72 z z" fill="#A8A8A8"/>
</g>
<defs/>
</svg>

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

View File

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="912" height="192" viewBox="0, 0, 912, 192">
<g id="Layer 1">
<path d="M161.998,-1 C166.989,-0.961 171.893,0.237 176.298,2.621 C177.982,3.532 179.472,4.765 181.06,5.836 L95.998,71 L10.936,5.836 C17.447,0.982 21.94,-0.593 29.998,-1 z" fill="#FFD900"/>
<path d="M181.06,5.836 L181.081,5.85 C188.441,12.552 191.497,19.084 191.998,29 L191.998,161 C192.055,166.392 190.865,169.411 188.853,174.173 L95.998,71 z" fill="#3399FF"/>
<path d="M95.998,71 L188.853,174.173 C185.602,181.567 178.576,187.289 170.919,189.651 C166.842,190.909 165.625,190.817 161.998,191 L29.998,191 C22.984,190.954 16.383,188.529 10.915,184.149 C9.804,183.259 8.902,182.136 7.895,181.129 z" fill="#FF610D"/>
<path d="M10.936,5.836 L95.998,71 L7.895,181.129 C2.392,175.671 0.377,168.517 -0.002,161 L-0.002,29 C0.084,22.039 2.399,15.314 6.849,9.917 C8.068,8.438 9.56,7.206 10.915,5.851 z" fill="#8DC213"/>
</g>
<g id="Layer 3">
<path d="M46.5,12 L145.5,12 C157.926,12 168,22.074 168,34.5 L168,133.5 C168,145.926 157.926,156 145.5,156 L46.5,156 C34.074,156 24,145.926 24,133.5 L24,34.5 C24,22.074 34.074,12 46.5,12 z" fill="#FFFFFF"/>
<g>
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill="#737373"/>
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill-opacity="0" stroke="#737373" stroke-width="2"/>
</g>
<g>
<g>
<text transform="matrix(1, 0, 0, 1, 414.373, 84)">
<tspan x="-189.727" y="55.5" font-family="Charter-Bold" font-size="160" fill="#4D4D4D">S</tspan>
<tspan x="-98.867" y="55.5" font-family="Charter-Roman" font-size="160" fill="#4D4D4D">tack</tspan>
</text>
<path d="M234.099,135.984 L234.099,107 L246.209,107 L248.787,126.219 L250.896,128.641 Q254.412,129.734 257.888,130.281 Q261.365,130.828 264.959,130.828 Q274.334,130.828 279.959,126.687 Q285.584,122.547 285.584,115.672 Q285.584,109.578 281.638,104.852 Q277.693,100.125 268.474,95.516 Q266.99,94.734 263.943,93.328 Q253.006,88.25 247.537,83.641 Q242.146,79.109 239.256,73.406 Q236.365,67.703 236.365,61.766 Q236.365,48.016 246.873,39.109 Q257.381,30.203 274.099,30.203 Q281.365,30.203 288.865,31.57 Q296.365,32.937 304.177,35.672 L304.177,61.609 L292.615,61.609 L289.959,44.969 L287.693,42.703 Q285.427,41.531 282.537,40.984 Q279.646,40.437 275.974,40.437 Q267.459,40.437 262.302,44.656 Q257.146,48.875 257.146,55.672 Q257.146,60.672 260.076,64.695 Q263.006,68.719 270.115,72.937 Q271.834,74.031 279.685,77.508 Q287.537,80.984 292.927,84.422 Q299.881,88.875 303.631,95.125 Q307.381,101.375 307.381,108.484 Q307.381,123.172 295.74,132.234 Q284.099,141.297 264.959,141.297 Q257.146,141.297 249.256,139.93 Q241.365,138.562 234.099,135.984 z M329.568,72.156 L319.49,72.156 L319.49,67.156 L330.037,62.547 L336.912,47.625 L342.849,47.625 L342.849,64.656 L367.224,64.656 L367.224,72.156 L342.849,72.156 L342.849,114.344 Q342.849,124.734 345.74,128.289 Q348.631,131.844 356.131,131.844 Q358.709,131.844 361.482,131.531 Q364.256,131.219 367.224,130.516 L367.224,136.453 Q361.756,138.172 356.443,139.07 Q351.131,139.969 346.209,139.969 Q336.99,139.969 333.279,136.492 Q329.568,133.016 329.568,123.797 z M422.381,124.812 L422.381,96.609 Q402.302,102.156 396.013,106.766 Q389.724,111.375 389.724,118.875 Q389.724,124.891 393.201,128.445 Q396.677,132 402.537,132 Q406.287,132 411.17,130.203 Q416.052,128.406 422.381,124.812 z M422.381,130.203 Q414.646,135.516 408.201,138.055 Q401.756,140.594 396.131,140.594 Q386.834,140.594 381.248,134.969 Q375.662,129.344 375.662,120.125 Q375.662,109.891 384.06,104.031 Q392.459,98.172 422.381,90.984 L422.381,85.906 Q422.381,75.828 419.099,71.922 Q415.818,68.016 407.693,68.016 Q404.646,68.016 401.677,68.641 Q398.709,69.266 395.506,70.516 L395.506,83.953 L384.49,83.953 Q381.599,83.953 380.545,82.898 Q379.49,81.844 379.49,79.031 Q379.49,71.219 388.513,66.062 Q397.537,60.906 411.834,60.906 Q424.412,60.906 430.115,66.375 Q435.818,71.844 435.818,83.953 L435.818,130.359 L438.552,132.938 L446.99,133.719 L446.99,139.5 L424.49,139.5 z M518.006,132.781 Q511.287,136.688 504.802,138.641 Q498.318,140.594 491.99,140.594 Q475.74,140.594 465.857,129.695 Q455.974,118.797 455.974,100.906 Q455.974,83.172 466.482,72.039 Q476.99,60.906 493.865,60.906 Q505.037,60.906 511.443,65.164 Q517.849,69.422 517.849,76.609 Q517.849,80.437 515.427,82.781 Q513.006,85.125 508.943,85.125 Q507.146,85.125 505.349,84.5 Q503.552,83.875 501.756,82.703 L501.756,69.578 Q499.881,68.484 497.927,67.898 Q495.974,67.312 494.021,67.312 Q483.396,67.312 476.951,76.18 Q470.506,85.047 470.506,99.812 Q470.506,114.422 477.81,122.82 Q485.115,131.219 497.693,131.219 Q502.927,131.219 507.927,129.539 Q512.927,127.859 518.006,124.422 z M525.349,139.5 L525.349,133.719 L534.021,132.938 L536.756,130.359 L536.756,32.469 L524.412,32.469 L524.412,27.469 L543.943,21.766 L550.037,21.766 L550.037,98.719 L553.084,98.719 L577.537,71.375 L576.443,69.109 L569.177,68.484 L569.177,62.547 L599.568,62.547 L599.568,68.484 L589.334,69.734 L567.459,92.937 L595.584,132.625 L605.818,133.406 L605.818,139.5 L580.896,139.5 L580.896,134.188 L559.256,103.172 L550.037,103.172 L550.037,130.359 L552.849,132.938 L560.427,133.719 L560.427,139.5 z" fill-opacity="0" stroke="#4D4D4D" stroke-width="1"/>
</g>
<g>
<text transform="matrix(1, 0, 0, 1, 757.367, 84)">
<tspan x="-141.992" y="55.5" font-family="Charter-Bold" font-size="160" fill="#4D4D4D">E</tspan>
<tspan x="-46.602" y="55.5" font-family="Charter-Roman" font-size="160" fill="#4D4D4D">dit</tspan>
</text>
<path d="M619.984,139.5 L619.984,131.688 L629.75,130.828 L632.328,128.328 L632.328,43.016 L629.75,40.75 L619.984,39.969 L619.984,32.156 L700.687,32.156 L700.687,57.234 L689.593,57.234 L686.859,43.172 L685.14,41.063 L653.109,41.063 L653.109,79.188 L673.968,79.188 L676.156,76.922 L677.797,65.438 L687.25,65.438 L687.25,102.547 L677.797,102.547 L676.156,90.984 L673.968,88.797 L653.109,88.797 L653.109,130.359 L690.453,130.359 L692.328,127.781 L694.906,110.828 L705.922,110.828 L705.922,139.5 z M772.015,125.281 L772.015,70.359 Q767.64,69.109 764.164,68.445 Q760.687,67.781 757.953,67.781 Q745.687,67.781 738.148,76.844 Q730.609,85.906 730.609,100.75 Q730.609,114.578 737.132,122.703 Q743.656,130.828 754.593,130.828 Q758.812,130.828 763.148,129.461 Q767.484,128.094 772.015,125.281 z M772.015,32.469 L759.75,32.469 L759.75,27.469 L779.281,21.766 L785.297,21.766 L785.297,130.359 L788.031,132.938 L795.687,133.719 L795.687,139.5 L772.015,139.5 L772.015,131.219 Q765.765,136.219 759.828,138.562 Q753.89,140.906 747.406,140.906 Q733.968,140.906 725.257,130.398 Q716.547,119.891 716.547,103.484 Q716.547,84.422 727.992,72.586 Q739.437,60.75 757.797,60.75 Q761,60.75 764.593,61.219 Q768.187,61.688 772.015,62.547 z M825.14,61.766 L831.39,61.766 L831.39,130.359 L834.125,132.938 L842.718,133.719 L842.718,139.5 L806.781,139.5 L806.781,133.719 L815.218,132.938 L817.953,130.359 L817.953,72.469 L806.781,72.469 L806.781,67.469 z M825.765,26.219 Q829.672,26.219 832.367,28.953 Q835.062,31.688 835.062,35.516 Q835.062,39.344 832.367,42 Q829.672,44.656 825.765,44.656 Q821.937,44.656 819.242,42 Q816.547,39.344 816.547,35.516 Q816.547,31.609 819.242,28.914 Q821.937,26.219 825.765,26.219 z M859.984,72.156 L849.906,72.156 L849.906,67.156 L860.453,62.547 L867.328,47.625 L873.265,47.625 L873.265,64.656 L897.64,64.656 L897.64,72.156 L873.265,72.156 L873.265,114.344 Q873.265,124.734 876.156,128.289 Q879.047,131.844 886.547,131.844 Q889.125,131.844 891.898,131.531 Q894.672,131.219 897.64,130.516 L897.64,136.453 Q892.172,138.172 886.859,139.07 Q881.547,139.969 876.625,139.969 Q867.406,139.969 863.695,136.492 Q859.984,133.016 859.984,123.797 z" fill-opacity="0" stroke="#4D4D4D" stroke-width="1"/>
</g>
</g>
</g>
<defs/>
</svg>

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="192" height="192" viewBox="0, 0, 192, 192">
<g id="Layer 1">
<path d="M161.999,-0 C166.99,0.039 171.894,1.237 176.299,3.621 C177.983,4.532 179.473,5.765 181.061,6.836 L95.999,72 L10.937,6.836 C17.448,1.982 21.941,0.407 29.999,-0 z" fill="#FFD900"/>
<path d="M181.061,6.836 L181.082,6.85 C188.442,13.552 191.498,20.084 191.999,30 L191.999,162 C192.056,167.392 190.866,170.411 188.854,175.173 L95.999,72 z" fill="#3399FF"/>
<path d="M95.999,72 L188.854,175.173 C185.603,182.567 178.577,188.289 170.92,190.651 C166.843,191.909 165.626,191.817 161.999,192 L29.999,192 C22.985,191.954 16.384,189.529 10.916,185.149 C9.805,184.259 8.903,183.136 7.896,182.129 z" fill="#FF610D"/>
<path d="M10.937,6.836 L95.999,72 L7.896,182.129 C2.393,176.671 0.378,169.517 -0.001,162 L-0.001,30 C0.085,23.039 2.4,16.314 6.85,10.917 C8.069,9.438 9.561,8.206 10.916,6.851 z" fill="#8DC213"/>
</g>
<g id="Layer 3">
<path d="M46.5,12 L145.5,12 C157.926,12 168,22.074 168,34.5 L168,133.5 C168,145.926 157.926,156 145.5,156 L46.5,156 C34.074,156 24,145.926 24,133.5 L24,34.5 C24,22.074 34.074,12 46.5,12 z" fill="#FFFFFF"/>
<g>
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill="#737373"/>
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill-opacity="0" stroke="#737373" stroke-width="2"/>
</g>
</g>
<defs/>
</svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

31
index.html Normal file
View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Markdown编辑器-JonyLee的设计导航</title>
<link rel="canonical" href="https://md.jonylee.top">
<meta name="description" content="StackEdit中文版免费开源功能全面的Markdown编辑器。">
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
<!-- baidu统计 -->
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?dad4b4383b13eedea1ab45ee323df1c3";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<!-- baidu统计结束 -->
</body>
</html>

27
index.js Normal file
View File

@ -0,0 +1,27 @@
const env = require('./config/prod.env');
Object.keys(env).forEach((key) => {
if (!process.env[key]) {
process.env[key] = JSON.parse(env[key]);
}
});
const http = require('http');
const express = require('express');
const app = express();
require('./server')(app);
const port = parseInt(process.env.PORT || 8080, 10);
const httpServer = http.createServer(app);
httpServer.listen(port, null, () => {
console.log(`HTTP server started: http://localhost:${port}`);
});
// Handle graceful shutdown
process.on('SIGTERM', () => {
httpServer.close(() => {
process.exit(0);
});
});

22028
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,37 +1,141 @@
{
"name": "stackedit",
"version": "3.0.1",
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
"main": "res/main.js",
"directories": {
"doc": "doc"
"version": "5.15.21",
"description": "免费, 开源, 功能齐全的 Markdown 编辑器",
"author": "Benoit Schweblin, 豆萁",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/mafgwo/stackedit/issues"
},
"main": "index.js",
"scripts": {
"postinstall": "gulp build-prism",
"start": "node build/dev-server.js",
"build": "node build/build.js && npm run build-style",
"build-style": "webpack --config build/webpack.style.conf.js",
"lint": "eslint --ext .js,.vue src server",
"unit": "jest --config test/unit/jest.conf.js --runInBand",
"unit-with-coverage": "jest --config test/unit/jest.conf.js --runInBand --coverage",
"test": "npm run lint && npm run unit",
"preversion": "npm run test",
"postversion": "git push origin master --tags && npm publish",
"patch": "npm version patch -m \"Tag v%s\"",
"minor": "npm version minor -m \"Tag v%s\"",
"major": "npm version major -m \"Tag v%s\"",
"chart": "mkdir -p dist && rm -rf dist/stackedit && cp -r chart dist/stackedit && sed -i.bak -e s/STACKEDIT_VERSION/$npm_package_version/g dist/stackedit/*.yaml && rm dist/stackedit/*.yaml.bak"
},
"dependencies": {
"express": "3.x",
"ejs": "~0.8.4"
"@vue/test-utils": "^1.0.0-beta.16",
"abcjs": "^5.2.0",
"babel-runtime": "^6.26.0",
"bezier-easing": "^1.1.0",
"body-parser": "^1.18.2",
"clipboard": "^1.7.1",
"compression": "^1.7.0",
"diff-match-patch": "^1.0.0",
"file-saver": "^1.3.8",
"handlebars": "^4.0.10",
"indexeddbshim": "^3.6.2",
"js-yaml": "^3.11.0",
"katex": "^0.16.2",
"markdown-it": "^8.4.1",
"markdown-it-abbr": "^1.0.4",
"markdown-it-deflist": "^2.0.2",
"markdown-it-emoji": "^1.3.0",
"markdown-it-footnote": "^3.0.1",
"markdown-it-imsize": "^2.0.1",
"markdown-it-mark": "^2.0.0",
"markdown-it-pandoc-renderer": "1.1.3",
"markdown-it-sub": "^1.0.0",
"markdown-it-sup": "^1.0.0",
"mermaid": "^8.9.2",
"mousetrap": "^1.6.1",
"normalize-scss": "^7.0.1",
"prismjs": "^1.6.0",
"request": "^2.85.0",
"serve-static": "^1.13.2",
"tmp": "^0.0.33",
"turndown": "^7.1.1",
"vue": "^2.5.16",
"vuex": "^3.0.1"
},
"devDependencies": {
"grunt": "~0.4.1",
"grunt-contrib-requirejs": "~0.4.1",
"grunt-contrib-less": "~0.7.0",
"grunt-string-replace": "~0.2.4",
"grunt-contrib-copy": "~0.4.1",
"bower": "~1.2.5",
"grunt-bower-requirejs": "~0.7.1",
"grunt-bower-task": "~0.3.1",
"grunt-bump": "0.0.11",
"grunt-contrib-jshint": "~0.7.1"
"autoprefixer": "^6.7.2",
"babel-core": "^6.26.3",
"babel-eslint": "^8.2.3",
"babel-jest": "^21.0.2",
"babel-loader": "^7.1.4",
"babel-plugin-dynamic-import-node": "^1.2.0",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-polyfill": "^6.23.0",
"babel-preset-env": "^1.7.0",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^1.1.3",
"connect-history-api-fallback": "^1.3.0",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"eslint": "^4.19.1",
"eslint-config-airbnb-base": "^12.1.0",
"eslint-friendly-formatter": "^4.0.1",
"eslint-import-resolver-webpack": "^0.9.0",
"eslint-loader": "^2.0.0",
"eslint-plugin-html": "^4.0.3",
"eslint-plugin-import": "^2.11.0",
"eventsource-polyfill": "^0.9.6",
"express": "^4.16.3",
"extract-text-webpack-plugin": "^2.0.0",
"favicons-webpack-plugin": "^0.0.9",
"file-loader": "^1.1.11",
"friendly-errors-webpack-plugin": "^1.7.0",
"gulp": "^4.0.2",
"gulp-concat": "^2.6.1",
"html-webpack-plugin": "^3.2.0",
"http-proxy-middleware": "^0.18.0",
"identity-obj-proxy": "^3.0.0",
"ignore-loader": "^0.1.2",
"jest": "^23.0.0",
"jest-raw-loader": "^1.0.1",
"jest-serializer-vue": "^0.3.0",
"js-md5": "^0.7.3",
"node-sass": "^4.0.0",
"npm-bump": "^0.0.23",
"offline-plugin": "^5.0.3",
"opn": "^4.0.2",
"optimize-css-assets-webpack-plugin": "^1.3.2",
"ora": "^1.2.0",
"raw-loader": "^0.5.1",
"replace-in-file": "^4.1.0",
"rimraf": "^2.6.0",
"sass-loader": "^7.0.1",
"semver": "^5.5.0",
"shelljs": "^0.8.1",
"string-replace-loader": "^2.1.1",
"stylelint": "^9.2.0",
"stylelint-config-standard": "^16.0.0",
"stylelint-processor-html": "^1.0.0",
"stylelint-webpack-plugin": "^0.10.4",
"url-loader": "^1.0.1",
"vue-jest": "^1.0.2",
"vue-loader": "^15.0.9",
"vue-style-loader": "^4.1.0",
"vue-template-compiler": "^2.5.16",
"webpack": "^2.6.1",
"webpack-bundle-analyzer": "^3.3.2",
"webpack-dev-middleware": "^1.10.0",
"webpack-hot-middleware": "^2.18.0",
"webpack-merge": "^4.1.2",
"webpack-pwa-manifest": "^3.7.1",
"worker-loader": "^1.1.1"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"engines": {
"node": ">= 8.0.0",
"npm": ">= 5.0.0"
},
"repository": {
"type": "git",
"url": "git://github.com/benweet/stackedit.git"
},
"author": "Benoit Schweblin",
"license": "Apache License",
"bugs": {
"url": "https://github.com/benweet/stackedit/issues"
}
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 10"
]
}

View File

@ -1,418 +0,0 @@
CACHE MANIFEST
#Date Tue Dec 03 2013 23:11:58
CACHE:
res/worker.js
libs/MathJax/MathJax.js?config=TeX-AMS_HTML
libs/MathJax/config/Safe.js
libs/MathJax/config/TeX-AMS_HTML.js
libs/MathJax/images/CloseX-31.png
libs/MathJax/images/MenuArrow-15.png
libs/MathJax/jax/output/HTML-CSS/jax.js
#DynamicResourcesBegin
res-min/font/OpenSans-Bold.woff
res-min/font/OpenSans-BoldItalic.woff
res-min/font/OpenSans-Italic.woff
res-min/font/OpenSans-Light.woff
res-min/font/OpenSans.woff
res-min/font/OpenSansLight-Italic.woff
res-min/font/cursive_standard-webfont.eot
res-min/font/cursive_standard-webfont.svg
res-min/font/cursive_standard-webfont.ttf
res-min/font/cursive_standard-webfont.woff
res-min/font/fontello.eot
res-min/font/fontello.svg
res-min/font/fontello.ttf
res-min/font/fontello.woff
res-min/img/gittip.png
res-min/img/icons.png
res-min/img/icons2x.png
res-min/img/logo-promo-128.png
res-min/img/menu-icon.png
res-min/img/school-line.png
res-min/img/stackedit-32.ico
res-min/main.js
res-min/require.js
res-min/themes/base.css
res-min/themes/default.css
res-min/themes/gray.css
res-min/themes/night.css
res-min/themes/school.css
libs/dictionaries/de_DE.aff.lz
libs/dictionaries/de_DE.dic.lz
libs/dictionaries/en_US.aff.lz
libs/dictionaries/en_US.dic.lz
libs/dictionaries/es_ES.aff.lz
libs/dictionaries/es_ES.dic.lz
libs/dictionaries/fr_FR.aff.lz
libs/dictionaries/fr_FR.dic.lz
libs/MathJax/extensions/FontWarnings.js
libs/MathJax/extensions/HTML-CSS/handle-floats.js
libs/MathJax/extensions/HelpDialog.js
libs/MathJax/extensions/MatchWebFonts.js
libs/MathJax/extensions/MathEvents.js
libs/MathJax/extensions/MathML/content-mathml.js
libs/MathJax/extensions/MathMenu.js
libs/MathJax/extensions/MathZoom.js
libs/MathJax/extensions/Safe.js
libs/MathJax/extensions/TeX/AMScd.js
libs/MathJax/extensions/TeX/AMSmath.js
libs/MathJax/extensions/TeX/AMSsymbols.js
libs/MathJax/extensions/TeX/HTML.js
libs/MathJax/extensions/TeX/action.js
libs/MathJax/extensions/TeX/autobold.js
libs/MathJax/extensions/TeX/autoload-all.js
libs/MathJax/extensions/TeX/bbox.js
libs/MathJax/extensions/TeX/begingroup.js
libs/MathJax/extensions/TeX/boldsymbol.js
libs/MathJax/extensions/TeX/cancel.js
libs/MathJax/extensions/TeX/color.js
libs/MathJax/extensions/TeX/enclose.js
libs/MathJax/extensions/TeX/extpfeil.js
libs/MathJax/extensions/TeX/mathchoice.js
libs/MathJax/extensions/TeX/mhchem.js
libs/MathJax/extensions/TeX/newcommand.js
libs/MathJax/extensions/TeX/noErrors.js
libs/MathJax/extensions/TeX/noUndefined.js
libs/MathJax/extensions/TeX/unicode.js
libs/MathJax/extensions/TeX/verb.js
libs/MathJax/extensions/asciimath2jax.js
libs/MathJax/extensions/jsMath2jax.js
libs/MathJax/extensions/mml2jax.js
libs/MathJax/extensions/tex2jax.js
libs/MathJax/extensions/toMathML.js
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Bold.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Bold.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Italic.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-BoldItalic.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Bold.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Italic.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Script-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size1-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size2-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size3-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size4-Regular.woff
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Typewriter-Regular.woff
libs/MathJax/jax/element/mml/jax.js
libs/MathJax/jax/element/mml/optable/Arrows.js
libs/MathJax/jax/element/mml/optable/BasicLatin.js
libs/MathJax/jax/element/mml/optable/CombDiacritMarks.js
libs/MathJax/jax/element/mml/optable/CombDiactForSymbols.js
libs/MathJax/jax/element/mml/optable/Dingbats.js
libs/MathJax/jax/element/mml/optable/GeneralPunctuation.js
libs/MathJax/jax/element/mml/optable/GeometricShapes.js
libs/MathJax/jax/element/mml/optable/GreekAndCoptic.js
libs/MathJax/jax/element/mml/optable/Latin1Supplement.js
libs/MathJax/jax/element/mml/optable/LetterlikeSymbols.js
libs/MathJax/jax/element/mml/optable/MathOperators.js
libs/MathJax/jax/element/mml/optable/MiscMathSymbolsA.js
libs/MathJax/jax/element/mml/optable/MiscMathSymbolsB.js
libs/MathJax/jax/element/mml/optable/MiscSymbolsAndArrows.js
libs/MathJax/jax/element/mml/optable/MiscTechnical.js
libs/MathJax/jax/element/mml/optable/SpacingModLetters.js
libs/MathJax/jax/element/mml/optable/SuppMathOperators.js
libs/MathJax/jax/element/mml/optable/SupplementalArrowsA.js
libs/MathJax/jax/element/mml/optable/SupplementalArrowsB.js
libs/MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js
libs/MathJax/jax/output/HTML-CSS/autoload/maction.js
libs/MathJax/jax/output/HTML-CSS/autoload/menclose.js
libs/MathJax/jax/output/HTML-CSS/autoload/mglyph.js
libs/MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js
libs/MathJax/jax/output/HTML-CSS/autoload/ms.js
libs/MathJax/jax/output/HTML-CSS/autoload/mtable.js
libs/MathJax/jax/output/HTML-CSS/autoload/multiline.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata-extra.js
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BBBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedD.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-1.0.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-extra.js
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js
#DynamicResourcesEnd
NETWORK:
*

View File

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>StackEdit - 404</title>
<link rel="canonical" href="https://stackedit.io/">
<link rel="icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<link rel="shortcut icon" href="res-min/img/stackedit-32.ico" type="image/x-icon">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="res-min/themes/default.css">
</head>
<body class="text-center">
<br/>
<p>
<a href="https://stackedit.io"><img src="res-min/img/stackedit-promo.png" width="240" height="60" /></a>
</p>
<p>404 &mdash; Page not found</p>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More