Compare commits

..

No commits in common. "v2.3.2" and "master" have entirely different histories.

1573 changed files with 67204 additions and 86266 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,309 +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: {
files: [
{
expand: true,
cwd: 'public/res/themes',
src: [
'*.less'
],
dest: 'public/res-min/themes',
ext: '.css',
}
]
},
compress: {
options: {
compress: true,
paths: 'public/res/styles'
},
files: [
{
expand: true,
cwd: 'public/res-min/themes',
src: [
'*.css'
],
dest: 'public/res-min/themes',
}
]
},
},
'string-replace': {
'css-import': {
files: {
'./': 'public/res-min/themes/*.css',
},
options: {
replacements: [
{
pattern: /@import /g,
replacement: '@import (less) '
},
]
}
},
'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/'
},
{
expand: true,
cwd: 'public/res/libs/fontello/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');
// Then force evaluation of CSS imports
grunt.task.run('string-replace:css-import');
// Run less another time with CSS evaluation and compression
grunt.task.run('less:compress');
// 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

220
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
## 截图
### Features:
**亮暗主题切换、编辑主题切换**
![](./images/theme.gif)
- 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/workspace.png)
### Documentation:
**拖拽粘贴上传图片**
![](./images/uploadimg.gif)
- [Welcome document][2]
- [Developer guide][3]
- [Theming guide][4]
**支持文档搜索**
![](./images/search.gif)
### Support StackEdit:
**ChatGPT集成协助写作**
![](./images/chatgpt.gif)
[![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")
## 相比国外开源版本的区别:
> **NOTE:** This page has been written and published with [StackEdit][5].
- 修复了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
## 国外开源版本弊端:
[1]: https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Storage#localStorage
[2]: https://github.com/benweet/stackedit/blob/master/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"
- 作者已经不维护了或很少维护了
- 不支持国内常用Gitee
- 强依赖GoogleDrive而Google Drive在国内不能正常访问
## 部署说明
> 建议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,35 +0,0 @@
{
"name": "stackedit",
"version": "2.3.2",
"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": "3.0.0",
"jquery": "2.0.3",
"underscore": "1.5.1",
"requirejs": "~2.1.8",
"require-css": "~0.0.7",
"require-less": "~0.0.7",
"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.6.0",
"ace": "4bbe5346f2ae5ad35c0c47defa244ab27aedd451",
"pagedown-ace": "https://github.com/benweet/pagedown-ace.git#72a27932f6f4f78e93a186aa2947d1f15c1cd7d5",
"pagedown-extra": "https://github.com/jmcmanus/pagedown-extra.git#c7f99ad0b8abfa0b9c9b8d406253b6d6695c4fb3",
"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"
}
}

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,454 +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][13]
The modules are loaded in the following order:
1. 3rd party libraries (jQuery, underscore.js...)
2. `Extension` class and objects
3.
----------
### 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 in **StackEdit**. The following functions of the `eventMgr` module will trigger events of the same name. Extensions can listen to these events by implementing functions with the same name. The function `addListener(eventName, callback)` of the `eventMgr` module can be used by any other module to listen to these events.
#### 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 are loaded by [RequireJS][40].
- **`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()`**
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.
#### Module creation events:
- **`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.
- **`onTitleChanged()`**
The content of a [`FileDescriptor`][52] object has been modified.
#### Operations on folders:
- `onFoldersChanged()`:
#### Sync events:
- `onSyncRunning()`:
- `onSyncSuccess()`:
- `onSyncImportSuccess()`:
- `onSyncExportSuccess()`:
- `onSyncRemoved()`:
#### Publish events:
- `onPublishRunning()`:
- `onPublishSuccess()`:
- `onNewPublishSuccess()`:
- `onPublishRemoved()`:
#### Operations on Layout:
- `onLayoutConfigure()`:
- `onLayoutCreated()`:
- `onLayoutResize()`:
- `onCreateButton()`:
- `onCreateEditorButton()`:
- `onCreatePreviewButton()`:
#### Operations on PageDown:
- `onPagedownConfigure()`:
- `onSectionsCreated()`:
- `onMarkdownTrim()`:
#### Operation on ACE:
- `onAceCreated()`:
> 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]: http://benweet.github.io/stackedit/doc/img/architecture.png "Architecture diagram"
[13]: https://lh6.googleusercontent.com/-sr6zRtyaoUk/Un5qSakOzPI/AAAAAAAAFC0/oI5If5fI9Gw/s0/StackEdit%252520architecture%252520-%252520New%252520Page%252520%2525283%252529.png "StackEdit architecture"
[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

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: 639 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,125 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="800"
height="200"
id="svg2"
version="1.1"
inkscape:version="0.48.2 r9819"
sodipodi:docname="stackedit-promo.svg"
inkscape:export-filename="/Users/g550003/workspace/stackedit/img/stackedit-promo.png"
inkscape:export-xdpi="54"
inkscape:export-ydpi="54">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710678"
inkscape:cx="681.08785"
inkscape:cy="-71.421139"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1680"
inkscape:window-height="918"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid3000"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-852.36217)">
<text
xml:space="preserve"
style="font-size:144px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Corbel;-inkscape-font-specification:Corbel"
x="221.88937"
y="1021.7139"
id="text2991"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2993"
x="221.88937"
y="1021.7139">stack<tspan
style="font-size:144px;font-weight:bold;-inkscape-font-specification:Corbel Bold"
id="tspan2995">edit</tspan></tspan></text>
<g
id="g3013"
transform="matrix(5.4895348,0,0,5.4895348,-409.28558,-4529.9871)">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path3001"
d="m 80,998.86217 0,12.00003 28,0 0,-12.00003"
style="fill:none;stroke:#626265;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3789"
d="m 84,1005.8622 18,0"
style="fill:none;stroke:#6c6c70;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3791"
d="m 84,1001.8622 16,0"
style="fill:none;stroke:#95785b;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3793"
d="m 84,997.86217 8,0"
style="fill:none;stroke:#bc8e48;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3795"
d="m 84,993.86217 20,0"
style="fill:none;stroke:#d38b28;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3797"
d="m 84,989.86217 14,0"
style="fill:none;stroke:#fd8a07;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
inkscape:connector-curvature="0"
id="path3799"
d="m 84,985.86217 20,0"
style="fill:none;stroke:#fe7a15;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -1,115 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="stackedit.svg"
inkscape:export-filename="C:\Documents and Settings\g550003\Mes documents\Mes images\stackedit-96.png"
inkscape:export-xdpi="270"
inkscape:export-ydpi="270">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="6.9921875"
inkscape:cx="92.512694"
inkscape:cy="-9.5071361"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:window-width="1920"
inkscape:window-height="1143"
inkscape:window-x="-4"
inkscape:window-y="-4"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid3000"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1020.3622)">
<path
style="fill:none;stroke:#626265;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 2,0 2,12 30,12 30,0"
id="path3001"
inkscape:connector-curvature="0"
transform="translate(0,1036.3622)"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#6c6c70;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 6,23 18,0"
id="path3789"
inkscape:connector-curvature="0"
transform="translate(0,1020.3622)"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#95785b;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 6,19 16,0"
id="path3791"
inkscape:connector-curvature="0"
transform="translate(0,1020.3622)"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#bc8e48;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 6,15 8,0"
id="path3793"
inkscape:connector-curvature="0"
transform="translate(0,1020.3622)"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#d38b28;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 6,11 20,0"
id="path3795"
inkscape:connector-curvature="0"
transform="translate(0,1020.3622)"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#fd8a07;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 6,7 20,7"
id="path3797"
inkscape:connector-curvature="0"
transform="translate(0,1020.3622)"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#fe7a15;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 6,3 26,3"
id="path3799"
inkscape:connector-curvature="0"
transform="translate(0,1020.3622)" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.1 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": "2.3.2",
"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,413 +0,0 @@
CACHE MANIFEST
#Date Thu Nov 21 2013 17:49:45
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/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/glyphicons-halflings-white.png
res-min/img/glyphicons-halflings.png
res-min/img/icons.png
res-min/img/icons2x.png
res-min/img/school-line.png
res-min/img/stackedit-32.ico
res-min/img/stackedit-64.png
res-min/img/stackedit-promo.png
res-min/main.js
res-min/require.js
res-min/themes/blue-gray.css
res-min/themes/default.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>

View File

@ -1 +0,0 @@
google-site-verification: google4971b5a4d775691a.html

View File

@ -1,11 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script src="../libs/dropbox.min.js"></script>
<script type="text/javascript">
Dropbox.AuthDriver.Popup.oauthReceiver();
</script>
</head>
<body>
</body>
</html>

View File

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html manifest="cache.manifest">
<head>
<script type="text/javascript">
var redirectUrl = location.href.substring(0, location.href.indexOf("html/gdrive-action.html"));
var state = decodeURI((/state=(.+?)(&|$)/
.exec(location.search) || [ , null ])[1]);
if(state) {
localStorage["gdrive.state"] = state;
}
window.location.replace(redirectUrl);
</script>
</head>
</html>

View File

@ -1,26 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript">
function getParameter(name) {
var regex = new RegExp(name + "=(.+?)(&|$)");
try {
return decodeURI(regex.exec(location.search)[1]);
} catch (e) {
return undefined;
}
}
var client_id = getParameter("client_id");
var code = getParameter("code");
if (client_id) {
window.location.href = "https://github.com/login/oauth/authorize?client_id="
+ client_id + "&scope=repo,gist";
} else {
if (code) {
localStorage["githubCode"] = code;
}
window.close();
}
</script>
</head>
</html>

View File

@ -1,26 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript">
function getParameter(name) {
var regex = new RegExp(name + "=(.+?)(&|$)");
try {
return decodeURI(regex.exec(location.search)[1]);
} catch (e) {
return undefined;
}
}
var oauth_token = getParameter("oauth_token");
var oauth_verifier = getParameter("oauth_verifier");
if (oauth_token && !oauth_verifier) {
window.location.href = "http://www.tumblr.com/oauth/authorize?oauth_token="
+ oauth_token;
} else {
if (oauth_verifier) {
localStorage["tumblrVerifier"] = oauth_verifier;
}
window.close();
}
</script>
</head>
</html>

View File

@ -1,27 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<script type="text/javascript">
function getParameter(name) {
var regex = new RegExp(name + "=(.+?)(&|$)");
try {
return decodeURI(regex.exec(location.search)[1]);
} catch (e) {
return undefined;
}
}
var client_id = getParameter("client_id");
var code = getParameter("code");
if (client_id) {
var redirectURI = location.href.substring(0, location.href.indexOf("?"));
window.location.href = "https://public-api.wordpress.com/oauth2/authorize?response_type=code&client_id="
+ client_id + "&redirect_uri=" + redirectURI;
} else {
if (code) {
localStorage["wordpressCode"] = code;
}
window.close();
}
</script>
</head>
</html>

View File

@ -1,30 +0,0 @@
<!DOCTYPE html>
<html manifest="cache.manifest">
<head>
<title>StackEdit - Markdown editor</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="description" content="StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.">
<meta name="author" content="Benoit Schweblin">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="msvalidate.01" content="5E47EE6F67B069C17E3CDD418351A612"
/>
<script>
// Use ?debug to serve original JavaScript files instead of minified
window.baseDir = 'res';
if (!/(\?|&)debug($|&)/.test(location.search)) {
window.baseDir += '-min';
}
window.require = {
baseUrl: window.baseDir,
deps: ['main']
};
</script>
<script src="res-min/require.js"></script>
</head>
<body></body>
</html>

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