Compare commits
No commits in common. "v3.0.1" and "master" have entirely different histories.
14
.babelrc
Normal 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"]
|
||||
}
|
||||
}
|
||||
}
|
9
.dockerignore
Normal file
@ -0,0 +1,9 @@
|
||||
node_modules
|
||||
.git
|
||||
dist
|
||||
.history
|
||||
images
|
||||
docs
|
||||
Dockerfile
|
||||
README.md
|
||||
build.sh
|
9
.editorconfig
Normal 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
@ -0,0 +1,3 @@
|
||||
build/*.js
|
||||
config/*.js
|
||||
src/libs/*.js
|
44
.eslintrc.js
Normal 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
@ -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
@ -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
@ -0,0 +1,7 @@
|
||||
{
|
||||
"processors": ["stylelint-processor-html"],
|
||||
"extends": "stylelint-config-standard",
|
||||
"rules": {
|
||||
"no-empty-source": null
|
||||
}
|
||||
}
|
22
.travis.yml
Normal 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
|
21
Dockerfile
@ -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", "." ]
|
||||
|
275
Gruntfile.js
@ -1,275 +0,0 @@
|
||||
module.exports = function(grunt) {
|
||||
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
grunt.loadNpmTasks('grunt-contrib-requirejs');
|
||||
grunt.loadNpmTasks('grunt-contrib-less');
|
||||
grunt.loadNpmTasks('grunt-string-replace');
|
||||
grunt.loadNpmTasks('grunt-contrib-copy');
|
||||
grunt.loadNpmTasks('grunt-bower-requirejs');
|
||||
grunt.loadNpmTasks('grunt-bump');
|
||||
|
||||
/***************************************************************************
|
||||
* Configuration
|
||||
*/
|
||||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
jshint: {
|
||||
options: {
|
||||
curly: true,
|
||||
browser: true,
|
||||
devel: true,
|
||||
indent: 4,
|
||||
latedef: true,
|
||||
undef: true,
|
||||
unused: true,
|
||||
expr: true,
|
||||
globals: {
|
||||
"define": false,
|
||||
"require": false,
|
||||
},
|
||||
ignores: [
|
||||
'node_modules/**/*.js',
|
||||
'public/libs/**/*.js',
|
||||
'public/res/libs/**/*.js',
|
||||
'public/res/bower-libs/**/*.js',
|
||||
'public/res-min/**/*.js'
|
||||
]
|
||||
},
|
||||
client: ['public/**/*.js'],
|
||||
},
|
||||
requirejs: {
|
||||
compile: {
|
||||
options: {
|
||||
baseUrl: "public/res",
|
||||
name: "main",
|
||||
out: "public/res-min/main.js",
|
||||
mainConfigFile: 'public/res/main.js',
|
||||
optimize: "uglify2",
|
||||
inlineText: true,
|
||||
uglify2: {
|
||||
output: {
|
||||
beautify: true,
|
||||
indent_level: 1,
|
||||
},
|
||||
},
|
||||
excludeShallow: [
|
||||
'css/css-builder',
|
||||
'less/lessc-server',
|
||||
'less/lessc'
|
||||
],
|
||||
}
|
||||
}
|
||||
},
|
||||
less: {
|
||||
compile: {
|
||||
options: {
|
||||
compress: true,
|
||||
},
|
||||
files: [
|
||||
{
|
||||
expand: true,
|
||||
cwd: 'public/res/themes',
|
||||
src: [
|
||||
'*.less'
|
||||
],
|
||||
dest: 'public/res-min/themes',
|
||||
ext: '.css',
|
||||
},
|
||||
{
|
||||
src: 'public/res/styles/base.less',
|
||||
dest: 'public/res-min/themes/base.css',
|
||||
}
|
||||
],
|
||||
},
|
||||
},
|
||||
'string-replace': {
|
||||
'font-parameters': {
|
||||
files: {
|
||||
'./': 'public/res-min/themes/*.css',
|
||||
},
|
||||
options: {
|
||||
replacements: [
|
||||
{
|
||||
pattern: /(font\/fontello\.\w+)\?\w+/g,
|
||||
replacement: '$1'
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
'constants': {
|
||||
files: {
|
||||
'public/res/constants.js': 'public/res/constants.js'
|
||||
},
|
||||
options: {
|
||||
replacements: [
|
||||
{
|
||||
pattern: /constants\.VERSION = .*/,
|
||||
replacement: 'constants.VERSION = "<%= pkg.version %>";'
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
'cache-manifest': {
|
||||
files: {
|
||||
'public/cache.manifest': 'public/cache.manifest'
|
||||
},
|
||||
options: {
|
||||
replacements: [
|
||||
{
|
||||
pattern: /(#Date ).*/,
|
||||
replacement: '$1<%= grunt.template.today() %>'
|
||||
},
|
||||
{
|
||||
pattern: /(#DynamicResourcesBegin\n)[\s\S]*(\n#DynamicResourcesEnd)/,
|
||||
replacement: '$1<%= resources %>$2'
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
},
|
||||
copy: {
|
||||
resources: {
|
||||
files: [
|
||||
// Fonts
|
||||
{
|
||||
expand: true,
|
||||
cwd: 'public/res/font',
|
||||
src: [
|
||||
'**'
|
||||
],
|
||||
dest: 'public/res-min/font/'
|
||||
},
|
||||
// Images
|
||||
{
|
||||
expand: true,
|
||||
cwd: 'public/res/img',
|
||||
src: [
|
||||
'**'
|
||||
],
|
||||
dest: 'public/res-min/img/'
|
||||
},
|
||||
// Libraries
|
||||
{
|
||||
expand: true,
|
||||
cwd: 'public/res/bower-libs/requirejs',
|
||||
src: [
|
||||
'require.js'
|
||||
],
|
||||
dest: 'public/res-min/'
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
// Inject bower dependencies into RequireJS configuration
|
||||
bower: {
|
||||
target: {
|
||||
rjsConfig: 'public/res/main.js'
|
||||
}
|
||||
},
|
||||
bump: {
|
||||
options: {
|
||||
files: [
|
||||
'package.json',
|
||||
'bower.json'
|
||||
],
|
||||
updateConfigs: [
|
||||
'pkg'
|
||||
],
|
||||
commitFiles: [
|
||||
'-a'
|
||||
],
|
||||
pushTo: 'origin'
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
/***************************************************************************
|
||||
* Clean
|
||||
*/
|
||||
grunt.registerTask('clean', function() {
|
||||
|
||||
// Remove public/res-min folder
|
||||
grunt.file['delete']('public/res-min');
|
||||
|
||||
});
|
||||
|
||||
/***************************************************************************
|
||||
* Build JavaScript
|
||||
*/
|
||||
grunt.registerTask('build-js', function() {
|
||||
|
||||
// JSHint validation
|
||||
grunt.task.run('jshint');
|
||||
|
||||
// Run r.js optimization
|
||||
grunt.task.run('requirejs');
|
||||
|
||||
});
|
||||
|
||||
/***************************************************************************
|
||||
* Build CSS
|
||||
*/
|
||||
grunt.registerTask('build-css', function() {
|
||||
|
||||
// First compile less files
|
||||
grunt.task.run('less:compile');
|
||||
// Remove fontello checksum arguments
|
||||
grunt.task.run('string-replace:font-parameters');
|
||||
|
||||
});
|
||||
|
||||
/***************************************************************************
|
||||
* Resources
|
||||
*/
|
||||
grunt.registerTask('build-res', function() {
|
||||
|
||||
// Copy some resources (images, fonts...)
|
||||
grunt.task.run('copy:resources');
|
||||
|
||||
// List resources and inject them in cache.manifest
|
||||
var resFolderList = [
|
||||
'public/res-min',
|
||||
'public/libs/dictionaries',
|
||||
'public/libs/MathJax/extensions',
|
||||
'public/libs/MathJax/fonts/HTML-CSS/TeX/woff',
|
||||
'public/libs/MathJax/jax/element',
|
||||
'public/libs/MathJax/jax/output/HTML-CSS/autoload',
|
||||
'public/libs/MathJax/jax/output/HTML-CSS/fonts/TeX',
|
||||
'public/libs/MathJax/jax/output/HTML-CSS/fonts/STIX'
|
||||
];
|
||||
grunt.task.run('list-res:' + resFolderList.join(':'));
|
||||
grunt.task.run('string-replace:cache-manifest');
|
||||
|
||||
});
|
||||
|
||||
grunt.registerTask('list-res', function() {
|
||||
var resourceList = [];
|
||||
grunt.util.recurse(arguments, function(arg) {
|
||||
grunt.log.writeln('Listing resources: ' + arg);
|
||||
grunt.file.recurse(arg, function(abspath) {
|
||||
resourceList.push(abspath.replace(/^public\//, ''));
|
||||
});
|
||||
});
|
||||
grunt.config.set('resources', resourceList.join('\n'));
|
||||
});
|
||||
|
||||
/***************************************************************************
|
||||
* Default task
|
||||
*/
|
||||
grunt.registerTask('default', function() {
|
||||
grunt.task.run('clean');
|
||||
grunt.task.run('build-js');
|
||||
grunt.task.run('build-css');
|
||||
grunt.task.run('build-res');
|
||||
});
|
||||
|
||||
/***************************************************************************
|
||||
* Tag task
|
||||
*/
|
||||
grunt.registerTask('tag', function(versionType) {
|
||||
grunt.task.run('bump-only:' + (versionType || 'patch'));
|
||||
grunt.task.run('string-replace:constants');
|
||||
grunt.task.run('default');
|
||||
grunt.task.run('bump-commit');
|
||||
});
|
||||
};
|
5
public/libs/MathJax/LICENSE → LICENSE
Executable file → Normal file
@ -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.
|
@ -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)
|
218
README.md
@ -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:
|
||||
**支持的文档空间**
|
||||

|
||||
|
||||
- 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
|
||||
**拖拽粘贴上传图片**
|
||||

|
||||
|
||||
### Documentation:
|
||||
**支持文档搜索**
|
||||

|
||||
|
||||
- [Welcome document][2]
|
||||
- [Developer guide][3]
|
||||
- [Theming guide][4]
|
||||
**ChatGPT集成协助写作**
|
||||

|
||||
|
||||
### Support StackEdit:
|
||||
## 相比国外开源版本的区别:
|
||||
|
||||
[](https://www.gittip.com/stackedit/ "Fund me on Gittip")
|
||||
- 修复了Github授权登录问题
|
||||
- 支持了Gitee仓库(2022-05-25)
|
||||
- 支持了Gitea仓库(2022-05-25)
|
||||
- 汉化(2022-06-01)
|
||||
- 主文档空间从GoogleDrive切换为Gitee(2022-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和Secret(2022-10-03)
|
||||
- 支持编辑区域选择主题样式(2022-10-06)
|
||||
- 支持图片直接存储到当前文档空间(2022-10-29)
|
||||
- 支持MD文档之间链接跳转(2022-11-20)
|
||||
- 支持预览区域选择主题样式(2022-12-04)
|
||||
- Gitlab的支持优化(2023-02-23)
|
||||
- 导出HTML、PDF支持带预览主题导出(2023-02-26)
|
||||
- 支持分享文档(2023-03-30)
|
||||
- 支持ChatGPT生成内容(2023-04-10)
|
||||
- GitLab授权接口调整(2023-08-26)
|
||||
- 主文档空间支持GitHub登录(2023-10-19)
|
||||
|
||||
> **NOTE:** This page has been written and published with [StackEdit][5].
|
||||
## 国外开源版本弊端:
|
||||
|
||||
- 作者已经不维护了或很少维护了
|
||||
- 不支持国内常用Gitee
|
||||
- 强依赖GoogleDrive,而Google Drive在国内不能正常访问
|
||||
|
||||
[1]: https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Storage#localStorage
|
||||
[2]: https://github.com/benweet/stackedit/blob/master/public/res/WELCOME.md#welcome-to-stackedit---welcome "Welcome document"
|
||||
[3]: https://github.com/benweet/stackedit/blob/master/doc/developer-guide.md#developer-guide "Developer guide"
|
||||
[4]: https://github.com/benweet/stackedit/blob/master/doc/theming.md#stackedit-theming-guide "Theming guide"
|
||||
[5]: https://stackedit.io/ "StackEdit"
|
||||
## 部署说明
|
||||
|
||||
> 建议docker-compose方式部署,其他部署方式如遇到问题欢迎提issue。
|
||||
|
||||
docker官方仓库下载太慢可以使用阿里云的镜像仓库,镜像仓库地址:registry.cn-hangzhou.aliyuncs.com/mafgwo/stackedit:【版本号】
|
||||
|
||||
`docker-compose.yml`如下:
|
||||
|
||||
```yaml
|
||||
version: "3.7"
|
||||
services:
|
||||
stackedit:
|
||||
image: mafgwo/stackedit:【docker中央仓库找到最新版本】
|
||||
container_name: stackedit
|
||||
environment:
|
||||
- LISTENING_PORT=8080
|
||||
- ROOT_URL=/
|
||||
- USER_BUCKET_NAME=root
|
||||
- DROPBOX_APP_KEY=【不需要支持则删掉】
|
||||
- DROPBOX_APP_KEY_FULL=【不需要支持则删掉】
|
||||
- GITHUB_CLIENT_ID=【不需要支持则删掉】
|
||||
- GITHUB_CLIENT_SECRET=【不需要支持则删掉】
|
||||
- GITEE_CLIENT_ID=【不需要支持则删掉】
|
||||
- GITEE_CLIENT_SECRET=【不需要支持则删掉】
|
||||
- GOOGLE_CLIENT_ID=【不需要支持则删掉】
|
||||
- GOOGLE_API_KEY=【不需要支持则删掉】
|
||||
- GITEA_CLIENT_ID=【不需要支持则删掉】
|
||||
- GITEA_CLIENT_SECRET=【不需要支持则删掉】
|
||||
- GITEA_URL=【不需要支持则删掉】
|
||||
- GITLAB_CLIENT_ID=【不需要支持则删掉】
|
||||
- GITLAB_CLIENT_SECRET=【不需要支持则删掉】
|
||||
- GITLAB_URL=【不需要支持则删掉】
|
||||
ports:
|
||||
- 8080:8080/tcp
|
||||
network_mode: bridge
|
||||
restart: always
|
||||
```
|
||||
|
||||
docker-compose方式的启动或停止命令
|
||||
|
||||
```bash
|
||||
# 在 docker-compose.yml 文件目录下 启动命令
|
||||
docker-compose up -d
|
||||
# 在 docker-compose.yml 文件目录下 停止命令
|
||||
docker-compose down
|
||||
# 更新镜像只需要修改docker-compose.yml中镜像版本执行再停止、启动命令即可
|
||||
```
|
||||
|
||||
或者可以直接通过Docker命名直接启动,命令如下:
|
||||
|
||||
```bash
|
||||
docker run -itd --name stackedit \
|
||||
-p 8080:8080 \
|
||||
-e LISTENING_PORT=8080 \
|
||||
-e ROOT_URL=/ \
|
||||
-e USER_BUCKET_NAME=root \
|
||||
-e DROPBOX_APP_KEY=【不需要支持则删掉】 \
|
||||
-e DROPBOX_APP_KEY_FULL=【不需要支持则删掉】 \
|
||||
-e GITHUB_CLIENT_ID=【不需要支持则删掉】 \
|
||||
-e GITHUB_CLIENT_SECRET=【不需要支持则删掉】 \
|
||||
-e GITEE_CLIENT_ID=【不需要支持则删掉】 \
|
||||
-e GITEE_CLIENT_SECRET=【不需要支持则删掉】 \
|
||||
-e GOOGLE_CLIENT_ID=【不需要支持则删掉】 \
|
||||
-e GOOGLE_API_KEY=【不需要支持则删掉】 \
|
||||
-e GITEA_CLIENT_ID=【不需要支持则删掉】 \
|
||||
-e GITEA_CLIENT_SECRET=【不需要支持则删掉】 \
|
||||
-e GITEA_URL=【不需要支持则删掉】 \
|
||||
-e GITLAB_CLIENT_ID=【不需要支持则删掉】 \
|
||||
-e GITLAB_CLIENT_SECRET=【不需要支持则删掉】 \
|
||||
-e GITLAB_URL=【不需要支持则删掉】 \
|
||||
mafgwo/stackedit:【docker中央仓库找到最新版本】
|
||||
|
||||
```
|
||||
|
||||
## 如何创建三方平台应用
|
||||
|
||||
> 部署时,如果需要支持Gitee或GitHub,则需要自行到对应三方平台创建应用,获取到应用ID和秘钥,替换到以上的环境变量中,再启动应用。
|
||||
|
||||
- Gitee的环境变量:GITEE_CLIENT_ID、GITEE_CLIENT_SECRET,**[如何创建Gitee应用](./docs/部署之Gitee应用创建.md)**
|
||||
- GitHub的环境变量:GITHUB_CLIENT_ID、GITEE_CLIENT_SECRET,**[如何创建GitHub应用](./docs/部署之GitHub应用创建.md)**
|
||||
- Gitea可选择性配置环境变量(未配置则在关联时前端指定,有配置则仅允许配置的应用信息):GITEA_CLIENT_ID、GITEA_CLIENT_SECRET、GITEA_URL,**[如何创建Gitea应用](./docs/部署之Gitea应用创建.md)**
|
||||
- Gitlab可选择性配置环境变量(未配置则在关联时前端指定,有配置则仅允许配置的应用信息):GITLAB_CLIENT_ID、GITLAB_CLIENT_SECRET、GITLAB_URL **如何创建Gitlab应用(待补充文档)**
|
||||
|
||||
(特别说明:自建的Gitea、Gitlab要能接入stackedit必须支持跨域)
|
||||
|
||||
## 编译与运行
|
||||
|
||||
> 编译运行的nodejs版本选择11.15.0版本
|
||||
|
||||
```bash
|
||||
# 安装依赖
|
||||
npm install
|
||||
|
||||
# serve with hot reload at localhost:8080
|
||||
npm start
|
||||
|
||||
# build for production with minification
|
||||
npm run build
|
||||
|
||||
# build for production and view the bundle analyzer report
|
||||
npm run build --report
|
||||
```
|
||||
|
36
bower.json
@ -1,36 +0,0 @@
|
||||
{
|
||||
"name": "stackedit",
|
||||
"version": "3.0.1",
|
||||
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
|
||||
"dependencies": {
|
||||
"bootstrap": "v3.0.0",
|
||||
"jquery": "2.0.3",
|
||||
"underscore": "1.5.1",
|
||||
"requirejs": "~2.1.8",
|
||||
"require-css": "0.1.0",
|
||||
"require-less": "0.1.0",
|
||||
"mousetrap": "~1.4.4",
|
||||
"jgrowl": "~1.2.10",
|
||||
"google-code-prettify": "~1.0.0",
|
||||
"highlightjs": "~7.3.0",
|
||||
"jquery-ui": "~1.10.3",
|
||||
"FileSaver": "*",
|
||||
"stacktrace": "~0.5.3",
|
||||
"requirejs-text": "~2.0.10",
|
||||
"bootstrap-tour": "~0.7.1",
|
||||
"ace": "4bbe5346f2ae5ad35c0c47defa244ab27aedd451",
|
||||
"pagedown-ace": "https://github.com/benweet/pagedown-ace.git#72a27932f6f4f78e93a186aa2947d1f15c1cd7d5",
|
||||
"pagedown-extra": "https://github.com/jmcmanus/pagedown-extra.git#161c003a733b96644bf67eecc73296ab48558394",
|
||||
"crel": "git@github.com:KoryNunn/crel.git#8dbda04b129fc0aec01a2a080d1cab26816e11c1",
|
||||
"waitForImages": "git@github.com:alexanderdickson/waitForImages.git#~1.4.2",
|
||||
"to-markdown": "git@github.com:benweet/to-markdown.git#jquery",
|
||||
"Typo.js": "git@github.com:cfinke/Typo.js.git",
|
||||
"xregexp": "d06eff50f87d81d2dd3afc1e854784c38b17bcc4",
|
||||
"yaml.js": "git@github.com:jeremyfa/yaml.js.git#~0.1.4",
|
||||
"lz-string": "git@github.com:pieroxy/lz-string.git"
|
||||
},
|
||||
"resolutions": {
|
||||
"jquery": "2.0.3",
|
||||
"bootstrap": "v3.0.0"
|
||||
}
|
||||
}
|
37
build.sh
Normal file
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
@ -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
|
56
build/webpack.style.conf.js
Normal 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
@ -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
@ -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
@ -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 }}
|
45
chart/templates/_helpers.tpl
Normal 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 -}}
|
87
chart/templates/deployment.yaml
Normal 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 }}
|
39
chart/templates/ingress.yaml
Normal 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 }}
|
16
chart/templates/service.yaml
Normal 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 }}
|
15
chart/templates/tests/test-connection.yaml
Normal 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
@ -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
After Width: | Height: | Size: 12 KiB |
BIN
chrome-app/icon-16.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
chrome-app/icon-256.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
chrome-app/icon-32.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
chrome-app/icon-512.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
chrome-app/icon-64.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
28
chrome-app/manifest.json
Normal 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
@ -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
@ -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
@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
NODE_ENV: '"production"'
|
||||
}
|
@ -1,661 +0,0 @@
|
||||
Developer guide
|
||||
===============
|
||||
|
||||
Getting started
|
||||
---------------
|
||||
|
||||
### Pre-requisites
|
||||
|
||||
- [Git][1]
|
||||
- [node.js/npm][2]
|
||||
- [Grunt][3]
|
||||
- [Bower][4]
|
||||
|
||||
### Before debugging
|
||||
|
||||
- Download development tools:
|
||||
|
||||
npm install
|
||||
|
||||
- Download dependencies:
|
||||
|
||||
bower install
|
||||
|
||||
- Serve **StackEdit** at `http://localhost/`:
|
||||
|
||||
(export PORT=80 && node server.js)
|
||||
|
||||
- Run Chrome without application cache:
|
||||
|
||||
chrome --disable-application-cache
|
||||
|
||||
- Run **StackEdit** in debug mode (serve original files instead of minified):
|
||||
|
||||
http://localhost/?debug
|
||||
|
||||
### Add new dependencies
|
||||
|
||||
> **NOTE:** StackEdit uses [RequireJS][5] for asynchronous module definition ([AMD][6]).
|
||||
|
||||
- Install new dependencies using [Bower][7]:
|
||||
|
||||
bower install <library> --save
|
||||
|
||||
- Add the new dependency to [RequireJS][8] configuration file (`main.js`):
|
||||
|
||||
grunt bower
|
||||
|
||||
### Build/minify
|
||||
|
||||
grunt
|
||||
|
||||
### Deploy
|
||||
|
||||
- on Heroku:
|
||||
|
||||
heroku create
|
||||
heroku rename my-stackedit-instance
|
||||
git push heroku master
|
||||
|
||||
- in a Docker container:
|
||||
|
||||
docker build -t my-stackedit-image .
|
||||
docker run -p 3000 my-stackedit-image
|
||||
|
||||
> **NOTE:** OAuth authorizations work out of the box for address `http://localhost/` except for WordPress. To allow an other address, you have to add specific keys at the end of `constants.js` and eventually to set up specific proxies with the corresponding key/secret pairs ([WordPress Proxy][9], [Tumblr Proxy][10] and [Gatekeeper][11]).
|
||||
|
||||
|
||||
Architecture
|
||||
------------
|
||||
|
||||
![Architecture diagram][12]
|
||||
|
||||
The modules are loaded by RequireJS in the following order:
|
||||
|
||||
1. The 3rd party libraries (jQuery, underscore.js...)
|
||||
2. The `Extension` objects
|
||||
3. The `EventMgr` module
|
||||
4. The `core` module
|
||||
5. The `fileMgr` module and the `helpers` modules
|
||||
6. The `provider` modules
|
||||
7. The `publisher` and `synchronizer` modules
|
||||
|
||||
This is important to notice in order to avoid circular dependencies. For instance, if an `Extension` is declared with the `core` module as a dependency, RequireJS will inject `undefined` instead of the actual module.
|
||||
|
||||
Any module though can access any dependencies by implementing the proper [injection listener][13] provided by the `eventMgr`.
|
||||
|
||||
----------
|
||||
|
||||
|
||||
### core
|
||||
|
||||
The `core` module is responsible for:
|
||||
|
||||
- creating the [UI Layout][14], the [ACE][15] editor and the [PageDown][16] editor,
|
||||
- loading/saving the settings,
|
||||
- running periodic tasks,
|
||||
- detecting the user activity,
|
||||
- checking the offline status.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
- `isOffline`: indicates the offline status of the application.
|
||||
|
||||
**Methods:**
|
||||
|
||||
- `onReady(callback)`: sets a callback to be called when all modules have been loaded and the DOM is ready.
|
||||
> **NOTE:** This is preferred over [jQuery's `.ready()`][17] because it ensures that all AMD modules are loaded by [RequireJS][18].
|
||||
|
||||
- `runPeriodically(callback)`: sets a callback to be called every second.
|
||||
> **NOTE:** The callback will not run if the user is inactive or in StackEdit Viewer. User is considered inactive after 5 minutes of inactivity (mouse or keyboard).
|
||||
|
||||
- `setOffline()`: can be called by any other modules when a network timeout occurs for instance.
|
||||
> **NOTE:** the offline status is also set by detecting the window `offline` event. `core.isOffline` is automatically set to `false` when the network is recovered.
|
||||
|
||||
- `initEditor(fileDesc)`: creates or refreshes the [PageDown][19] editor with a given [`FileDescriptor`][20] object.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
|
||||
### fileMgr
|
||||
|
||||
The `fileMgr` module is responsible for:
|
||||
|
||||
- creating and deleting local files,
|
||||
- switching from one file to another.
|
||||
|
||||
**Attributes:**
|
||||
|
||||
- `currentFile`: the [`FileDescriptor`][21] object that is currently edited.
|
||||
|
||||
**Methods:**
|
||||
|
||||
- `createFile(title, content)`: creates a [`FileDescriptor`][22] object, add it in the [`fileSystem`][23] map and returns it.
|
||||
- `deleteFile(fileDesc)`: deletes a [`FileDescriptor`][24] object from the [`fileSystem`][25] map.
|
||||
- `selectFile(fileDesc)`: selects a [`FileDescriptor`][26] object for editing.
|
||||
|
||||
|
||||
#### FileDescriptor
|
||||
|
||||
The `FileDescriptor` class represents a local file. A `FileDescriptor` object has the following properties:
|
||||
|
||||
- `fileIndex`: the unique string index of the file in the file system.
|
||||
- `title`: the title of the document.
|
||||
- `content`: the content of the document.
|
||||
- `syncLocations`: a map containing all the associated [`syncAttributes`][27] objects with their `syncIndex` as a key.
|
||||
- `publishLocations`: a map containing all the associated [`publishAttributes`][28] objects with their `publishIndex` as a key.
|
||||
|
||||
And the following methods:
|
||||
|
||||
- `addSyncLocation(syncAttributes)`: associates a [`syncAttributes`][29] object with the file.
|
||||
- `removeSyncLocation(syncAttributes)`: unassociates a [`syncAttributes`][30] object with the file.
|
||||
- `addPublishLocation(publishAttributes)`: associates a [`publishAttributes`][31] object with the file.
|
||||
- `removePublishLocation(publishAttributes)`: unassociates a [`publishAttributes`][32] object with the file.
|
||||
|
||||
#### fileSystem
|
||||
|
||||
The `fileSystem` module is a map containing all the [`FileDescriptor`][33] objects with their `fileIndex` as a key.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
|
||||
### synchronizer
|
||||
|
||||
The `synchronizer` module is responsible for:
|
||||
|
||||
- creating a new local file from a sync location (import).
|
||||
- creating a new sync location from a local file (export).
|
||||
- running 2 ways synchronization (upload and download) for all sync locations.
|
||||
|
||||
#### synchronizer's providers
|
||||
|
||||
A [`provider`][34] module can be associated with the `synchronizer` module if it implements the following functions:
|
||||
|
||||
- `importFiles()`: downloads one or multiple files and create local files associated with the sync locations.
|
||||
- `exportFile()`: uploads a local file to a new sync location.
|
||||
- `syncDown()`: performs a download of all the changes operated on all sync locations.
|
||||
- `syncUp()`: performs an upload of a change to a sync location.
|
||||
|
||||
#### syncAttributes
|
||||
|
||||
A `syncAttributes` object is an object that describes a sync location. Attributes differ from one provider to another except for the following:
|
||||
|
||||
- `syncIndex`: the unique string index of the publish location.
|
||||
- `provider`: the [`provider`][35] module that handles the sync location.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
|
||||
### publisher
|
||||
|
||||
The `publisher` module is responsible for:
|
||||
|
||||
- creating new publish locations,
|
||||
- updating existing publish locations.
|
||||
|
||||
#### publisher's providers
|
||||
|
||||
A [`provider`][36] module can be associated with the `publisher` module if it implements the following functions:
|
||||
|
||||
- `newPublishAttributes()`: returns a new [`publishAttributes`][37] object in order to create a new publish location.
|
||||
- `publish()`: performs publishing of one publish location.
|
||||
|
||||
#### publishAttributes
|
||||
|
||||
A `publishAttributes` object is an object that describes a publish location. Attributes differ from one provider to another except for the following:
|
||||
|
||||
- `publishIndex`: the unique string index of the publish location.
|
||||
- `provider`: the [`provider`][38] module that handles the publish location.
|
||||
- `format`: the publishing format for the publish location. It can be:
|
||||
- `markdown` for Markdown format.
|
||||
- `html` for HTML format.
|
||||
- `template` for template format.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
|
||||
### eventMgr
|
||||
|
||||
The `eventMgr` module is responsible for receiving and dispatching events. Below is the list of all events signatures.
|
||||
|
||||
Most events (those that are triggered outside the `eventMgr` module) can be triggered by calling methods of the same name in the `eventMgr` module. For example:
|
||||
|
||||
```js
|
||||
eventMgr.onMessage('StackEdit is awesome!');
|
||||
```
|
||||
|
||||
The method `addListener(eventName, callback)` of the `eventMgr` module can be used to listen to these events (except those that can only be handled by `Extension` objects). For example:
|
||||
|
||||
```js
|
||||
eventMgr.addListener('onMessage', function(message) {
|
||||
alert(message);
|
||||
});
|
||||
```
|
||||
|
||||
`Extension` objects have the possibility to listen to those events by implementing methods of the same name. For example:
|
||||
|
||||
```js
|
||||
userCustom.onMessage = function(message) {
|
||||
alert(message);
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Core events
|
||||
|
||||
- **`onReady()`**
|
||||
|
||||
All the modules are loaded and the DOM is ready.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
> This is preferred over [jQuery's `.ready()`][39] because it ensures that all modules have been loaded by RequireJS.
|
||||
|
||||
- **`onMessage(message)`**
|
||||
|
||||
A message destined to the user has been produced.
|
||||
- `message`: the text string of the message.
|
||||
|
||||
- **`onError(error)`**
|
||||
|
||||
An error has been thrown.
|
||||
- `error`: an error object or a string.
|
||||
|
||||
- **`onOfflineChanged(isOffline)`**
|
||||
|
||||
The off-line status has changed.
|
||||
- `isOffline`: the off-line status.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onUserActive()`**
|
||||
|
||||
The user has just moved the mouse or pressed the keyboard.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onAsyncRunning(isRunning)`**
|
||||
|
||||
Some asynchronous tasks have just started or stopped.
|
||||
- `isRunning`: true if started, false if stopped.
|
||||
|
||||
> Triggered by the `AsyncTask` module.
|
||||
|
||||
- **`onPeriodicRun()`**
|
||||
|
||||
A hook that is called periodically (every 1 second if user is active).
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onLoadSettings()`**
|
||||
|
||||
A hook that is called when the settings dialog has to be refreshed. Each extension that has configuration inputs in the settings dialog has to implement a listener for this event.
|
||||
|
||||
> Triggered by the `core` module. Only `Extension` objects can handle this event.
|
||||
|
||||
- **`onSaveSettings(newConfig, event)`**
|
||||
|
||||
A hook that is called when the settings dialog has to be validated. Each extension that has configuration is the settings dialog has to implement a listener for this event.
|
||||
- `newConfig`: the new configuration object, deduced from the settings dialog inputs.
|
||||
- `event`: the submit event object. `stopPropagation` has to be called in case of an error when parsing settings dialog inputs.
|
||||
|
||||
> Triggered by the `core` module. Only `Extension` objects can handle this event.
|
||||
|
||||
- **`onInit()`**
|
||||
|
||||
A hook allowing enabled extensions to initialize.
|
||||
|
||||
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
|
||||
|
||||
> This event is triggered before `onReady` event and just after the `config` and `enabled` extensions properties have been set by the `eventMgr`.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Module injection
|
||||
|
||||
- **`onFileMgrCreated(fileMgr)`**
|
||||
|
||||
The `fileMgr` module has been created.
|
||||
- `fileMgr`: the `fileMgr` module.
|
||||
|
||||
> Triggered by the `fileMgr` module.
|
||||
|
||||
|
||||
- **`onSynchronizerCreated(synchronizer)`**
|
||||
|
||||
The `synchronizer` module has been created.
|
||||
- `synchronizer`: the `synchronizer` module.
|
||||
|
||||
> Triggered by the `synchronizer` module.
|
||||
|
||||
- **`onPublisherCreated(publisher)`**
|
||||
|
||||
The `publisher` module has been created.
|
||||
- `publisher`: the `publisher` module.
|
||||
|
||||
> Triggered by the `publisher` module.
|
||||
|
||||
- **`onEventMgrCreated()`**
|
||||
|
||||
The `eventMgr` module has been created.
|
||||
- `eventMgr`: the `eventMgr` module.
|
||||
|
||||
> Triggered by the `eventMgr` module.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Operations on files
|
||||
|
||||
- **`onFileCreated(fileDesc)`**
|
||||
|
||||
A [`FileDescriptor`][41] object has been created.
|
||||
- `fileDesc`: the [`FileDescriptor`][42] object.
|
||||
|
||||
> Triggered by the `fileMgr` module.
|
||||
|
||||
- **`onFileDeleted(fileDesc)`**
|
||||
|
||||
A [`FileDescriptor`][43] object has been removed from the `fileSystem` module.
|
||||
- `fileDesc`: the [`FileDescriptor`][44] object.
|
||||
|
||||
> Triggered by the `fileMgr` module.
|
||||
|
||||
- **`onFileSelected(fileDesc)`**
|
||||
|
||||
A [`FileDescriptor`][45] object has been selected.
|
||||
- `fileDesc`: the [`FileDescriptor`][46] object.
|
||||
|
||||
> Triggered by the `fileMgr` module. This event is triggered before `onFileClosed` (if another document is open) and `onFileOpen` events.
|
||||
|
||||
- **`onFileClosed(fileDesc)`**
|
||||
|
||||
The current [`FileDescriptor`][47] object is about to be detached from the editor.
|
||||
- `fileDesc`: the [`FileDescriptor`][48] object.
|
||||
|
||||
> Triggered by the `fileMgr` module. This event is triggered after `onFileSelected` event and before `onFileClosed` event.
|
||||
|
||||
- **`onFileOpen(fileDesc)`**
|
||||
|
||||
The selected [`FileDescriptor`][49] object has been attached to the editor.
|
||||
- `fileDesc`: the [`FileDescriptor`][50] object.
|
||||
|
||||
> Triggered by the `fileMgr` module. This event is triggered after `onFileSelected` and `onFileClosed` (if another document is open) events.
|
||||
|
||||
- **`onContentChanged(fileDesc)`**
|
||||
|
||||
The content of a [`FileDescriptor`][51] object has been modified.
|
||||
- `fileDesc`: the [`FileDescriptor`][52] object.
|
||||
|
||||
- **`onTitleChanged(fileDesc)`**
|
||||
|
||||
The content of a [`FileDescriptor`][53] object has been modified.
|
||||
- `fileDesc`: the [`FileDescriptor`][54] object.
|
||||
|
||||
- **`onFoldersChanged()`**
|
||||
|
||||
The folders structure has changed.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Sync events
|
||||
|
||||
- **`onSyncRunning(isRunning)`**
|
||||
|
||||
A synchronization job has just started or stopped.
|
||||
- `isRunning`: true if started, false if stopped.
|
||||
|
||||
> Triggered by the `synchronizer` module.
|
||||
|
||||
> A synchronization job is the action to download and upload all detected changes for all sync locations of all documents.
|
||||
|
||||
- **`onSyncSuccess()`**
|
||||
|
||||
A synchronization job has successfully finished.
|
||||
|
||||
> Triggered by the `synchronizer` module.
|
||||
|
||||
> A synchronization job is the action to download and upload all detected changes for all sync locations of all documents.
|
||||
|
||||
- **`onSyncImportSuccess(fileDescList, provider)`**
|
||||
|
||||
The import of documents has successfully finished.
|
||||
- `fileDescList`: the list of [`FileDescriptor`][55] objects that have been created.
|
||||
- `provider`: the [`provider`][56] module that handled the import.
|
||||
|
||||
> Triggered by the [`provider`][57] module that handled the import.
|
||||
|
||||
> An import is the action to download multiple files and to create, for each, one [`FileDescriptor`][55] objects with one sync location.
|
||||
|
||||
- **`onSyncExportSuccess(fileDesc, syncAttributes)`**
|
||||
|
||||
The export of one document has successfully finished.
|
||||
- `fileDesc`: the [`FileDescriptor`][58] object that has been exported.
|
||||
- `syncAttributes`: the descriptor object of the new sync location.
|
||||
|
||||
> Triggered by the `synchronizer` module.
|
||||
|
||||
> An export is the action to upload one file and to create one new sync location associated with one existing `FileDescriptor`][55] object.
|
||||
|
||||
- **`onSyncRemoved(fileDesc, syncAttributes)`**
|
||||
|
||||
A sync location has been removed from a [`FileDescriptor`][59] object.
|
||||
- `fileDesc`: the [`FileDescriptor`][60] object.
|
||||
- `syncAttributes`: the descriptor object of the removed sync location.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Publish events
|
||||
|
||||
- **`onPublishRunning(isRunning)`**
|
||||
|
||||
A document publication job has just started or stopped.
|
||||
- `isRunning`: true if started, false if stopped.
|
||||
|
||||
> Triggered by the `publisher` module.
|
||||
|
||||
> A publication job is the action to upload changes on multiple publish locations associated with one `FileDescriptor`][55] object.
|
||||
|
||||
- **`onPublishSuccess(fileDesc)`**
|
||||
|
||||
A document publication job has successfully finished.
|
||||
- `fileDesc`: the [`FileDescriptor`][60] object that has been published.
|
||||
|
||||
> Triggered by the `publisher` module.
|
||||
|
||||
> A publication job is the action to upload changes on multiple publish locations associated with one `FileDescriptor`][55] object.
|
||||
|
||||
- **`onNewPublishSuccess(fileDesc, publishAttributes)`**
|
||||
|
||||
A new publish location has been successfully created.
|
||||
- `fileDesc`: the [`FileDescriptor`][60] object that has been published.
|
||||
- `publishAttributes`: the descriptor object of the new publish location.
|
||||
|
||||
> Triggered by the `publisher` module.
|
||||
|
||||
- **`onPublishRemoved(fileDesc, publishAttributes)`**
|
||||
|
||||
A publish location has been removed from a [`FileDescriptor`][59] object.
|
||||
- `fileDesc`: the [`FileDescriptor`][60] object.
|
||||
- `publishAttributes`: the descriptor object of the removed publish location.
|
||||
|
||||
> Triggered by the `publisher` module.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Operations on UI Layout
|
||||
|
||||
- **`onLayoutConfigure(layoutConfig)`**
|
||||
|
||||
The layout is about to be configured.
|
||||
- `layoutConfig`: the configuration object of the UI Layout library.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onLayoutCreated(layout)`**
|
||||
|
||||
The layout has just been created.
|
||||
- `layout`: the layout object of the UI Layout library.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onLayoutResize(paneName)`**
|
||||
|
||||
One pane of the layout has been resized.
|
||||
- `paneName`: the name of the resized layout pane.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onCreateButton()`**
|
||||
|
||||
Allows extensions to add their own buttons in the navigation bar. Implemented listeners have to return an HTML button element. For example:
|
||||
|
||||
userCustom.onCreateButton = function() {
|
||||
var button = $('<button class="btn btn-success"><i class="icon-rocket"></i></button>');
|
||||
button.click(function() {
|
||||
eventMgr.onMessage('Booom!');
|
||||
});
|
||||
return button[0];
|
||||
};
|
||||
|
||||
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
|
||||
|
||||
- **`onCreateEditorButton()`**
|
||||
|
||||
Allows extensions to add their own buttons in the side bar. Implemented listeners have to return an HTML button element. See `onCreateButton` for a concrete example.
|
||||
|
||||
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
|
||||
|
||||
- **`onCreatePreviewButton()`**
|
||||
|
||||
Allows extensions to add their own buttons over the preview. Implemented listeners have to return an HTML button element. See `onCreateButton` for a concrete example.
|
||||
|
||||
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Operations on PageDown
|
||||
|
||||
- **`onPagedownConfigure(editor)`**
|
||||
|
||||
The Pagedown editor is about to be created.
|
||||
- `editor`: the Pagedown editor object before `run` has been called.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
- **`onAsyncPreview(callback)`**
|
||||
|
||||
Called after Pagedown's synchronous rendering to trigger extra asynchronous rendering (such as MathJax). Implemented listeners have to call the callback parameter after processing in order other `onAsyncPreview` listeners to run.
|
||||
- `callback`: the callback to call at the end of the asynchronous processing.
|
||||
|
||||
> Triggered by the `eventMgr` module. Only `Extension` objects can handle this event.
|
||||
|
||||
- **`onPreviewFinished(html)`**
|
||||
|
||||
Called after every `onAsyncPreview` listeners have been called.
|
||||
- `html`: the finally rendered HTML.
|
||||
|
||||
- **`onSectionsCreated(sectionList)`**
|
||||
|
||||
The Markdown has been split into sections before rendering.
|
||||
- `sectionList`: the list of section objects. Each section object contains:
|
||||
- `text`: the markdown substring contained in the section.
|
||||
- `textWithDelimiter`: the text with an added delimiter.
|
||||
|
||||
> Triggered by the `markdownSectionParser` extension.
|
||||
|
||||
- **`onMarkdownTrim(offset)`**
|
||||
|
||||
The Markdown has been left trimmed by a certain number of character.
|
||||
- `offset`: the number of characters that have been removed.
|
||||
|
||||
> Triggered by the `yamlFrontMatterParser` extension.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
#### Operation on ACE
|
||||
|
||||
- **`onAceCreated(aceEditor)`**
|
||||
|
||||
The ACE editor has just been created.
|
||||
- `aceEditor`: the ACE editor object.
|
||||
|
||||
> Triggered by the `core` module.
|
||||
|
||||
|
||||
|
||||
> Written with [StackEdit](https://stackedit.io/).
|
||||
|
||||
|
||||
[1]: http://git-scm.com/
|
||||
[2]: http://nodejs.org/
|
||||
[3]: http://gruntjs.com/
|
||||
[4]: http://bower.io/
|
||||
[5]: http://requirejs.org/ "RequireJS"
|
||||
[6]: http://en.wikipedia.org/wiki/Asynchronous_module_definition "Asynchronous module definition"
|
||||
[7]: http://bower.io/
|
||||
[8]: http://requirejs.org/ "RequireJS"
|
||||
[9]: https://github.com/benweet/stackedit-wordpress-proxy
|
||||
[10]: https://github.com/benweet/stackedit-tumblr-proxy
|
||||
[11]: https://github.com/prose/gatekeeper
|
||||
[12]: https://lh6.googleusercontent.com/-sr6zRtyaoUk/Un5qSakOzPI/AAAAAAAAFC0/oI5If5fI9Gw/s0/StackEdit%252520architecture%252520-%252520New%252520Page%252520%2525283%252529.png "StackEdit architecture"
|
||||
[13]: #module-injection
|
||||
[14]: http://layout.jquery-dev.net/ "UI Layout"
|
||||
[15]: http://ace.c9.io
|
||||
[16]: https://code.google.com/p/pagedown/ "PageDown"
|
||||
[17]: http://api.jquery.com/ready/
|
||||
[18]: http://requirejs.org/ "RequireJS"
|
||||
[19]: https://code.google.com/p/pagedown/ "PageDown"
|
||||
[20]: #filedescriptor
|
||||
[21]: #filedescriptor
|
||||
[22]: #filedescriptor
|
||||
[23]: #filesystem
|
||||
[24]: #filedescriptor
|
||||
[25]: #filesystem
|
||||
[26]: #filedescriptor
|
||||
[27]: #syncattributes
|
||||
[28]: #publishattributes
|
||||
[29]: #syncattributes
|
||||
[30]: #syncattributes
|
||||
[31]: #publishattributes
|
||||
[32]: #publishattributes
|
||||
[33]: #filedescriptor
|
||||
[34]: #provider
|
||||
[35]: #provider
|
||||
[36]: #provider
|
||||
[37]: #publishattributes
|
||||
[38]: #provider
|
||||
[39]: http://api.jquery.com/ready/
|
||||
[40]: http://requirejs.org/ "RequireJS"
|
||||
[41]: #filedescriptor
|
||||
[42]: #filedescriptor
|
||||
[43]: #filedescriptor
|
||||
[44]: #filedescriptor
|
||||
[45]: #filedescriptor
|
||||
[46]: #filedescriptor
|
||||
[47]: #filedescriptor
|
||||
[48]: #filedescriptor
|
||||
[49]: #filedescriptor
|
||||
[50]: #filedescriptor
|
||||
[51]: #filedescriptor
|
||||
[52]: #filedescriptor
|
||||
[53]: #filedescriptor
|
||||
[54]: #filedescriptor
|
||||
[55]: #filedescriptor
|
||||
[56]: #provider
|
||||
[57]: #provider
|
||||
[58]: #filedescriptor
|
||||
[59]: #filedescriptor
|
||||
[60]: #filedescriptor
|
Before Width: | Height: | Size: 30 KiB |
@ -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
|
10
docs/大文档导出PDF方式.md
Normal 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` 查看帮助文档。
|
||||
|
||||
|
||||
|
20
docs/部署之GitHub应用创建.md
Normal file
@ -0,0 +1,20 @@
|
||||
# GitHub应用配置说明
|
||||
|
||||
> StackEdit中文版部署如果需要支持GitHub,则需要到GitHub创建一个应用,并复制其中的clientId和clientSecret填充到环境变量 GITHUB_CLIENT_ID 和 GITHUB_CLIENT_SECRET 中。
|
||||
|
||||
|
||||
# 如何创建GitHub应用
|
||||
|
||||
按下面图的指示创建
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
35
docs/部署之Gitea应用创建.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Gitea应用配置说明
|
||||
|
||||
> StackEdit中文版支持Gitea,则需要到Gitea创建一个应用,在StackEdit中文版绑定Gitea账号的时候填入。
|
||||
|
||||
|
||||
# 如何创建Gitea应用
|
||||
|
||||
按下面图的指示创建
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
创建成功后即可看到应用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;
|
||||
}
|
||||
```
|
19
docs/部署之Gitee应用创建.md
Normal file
@ -0,0 +1,19 @@
|
||||
# Gitee应用配置说明
|
||||
|
||||
> StackEdit中文版部署如果需要支持Gitee,则需要到Gitee创建一个应用,并复制其中的clientId和clientSecret填充到环境变量 GITEE_CLIENT_ID 和 GITEE_CLIENT_SECRET 中。
|
||||
|
||||
|
||||
# 如何创建Gitee应用
|
||||
|
||||
按下面图的指示创建
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
创建成功后即可看到client id 和 client secret。
|
20
gulpfile.js
Normal 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
After Width: | Height: | Size: 175 KiB |
BIN
images/dark.png
Normal file
After Width: | Height: | Size: 793 KiB |
BIN
images/fileSearch.png
Normal file
After Width: | Height: | Size: 102 KiB |
BIN
images/gitea/gitea01.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
images/gitea/gitea02.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
images/gitea/gitea03.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
images/gitea/gitea04.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
images/gitee/gitee01.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
images/gitee/gitee02.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
images/gitee/gitee03.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
images/gitee/gitee04.png
Normal file
After Width: | Height: | Size: 121 KiB |
BIN
images/github/github01.png
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
images/github/github02.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
images/github/github03.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
images/github/github04.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
images/github/github05.png
Normal file
After Width: | Height: | Size: 109 KiB |
BIN
images/imageBed.png
Normal file
After Width: | Height: | Size: 339 KiB |
BIN
images/light.png
Normal file
After Width: | Height: | Size: 726 KiB |
BIN
images/qq.jpeg
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
images/search.gif
Normal file
After Width: | Height: | Size: 360 KiB |
BIN
images/theme.gif
Normal file
After Width: | Height: | Size: 937 KiB |
BIN
images/uploadimg.gif
Normal file
After Width: | Height: | Size: 761 KiB |
BIN
images/workspace.png
Normal file
After Width: | Height: | Size: 195 KiB |
BIN
img/icon-16.png
Before Width: | Height: | Size: 3.0 KiB |
BIN
img/icon-32.png
Before Width: | Height: | Size: 3.3 KiB |
BIN
img/icon.idraw
21
img/icon.svg
@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="192" height="192" viewBox="0, 0, 192, 192">
|
||||
<g id="Layer 4">
|
||||
<path d="M157.714,12 C165.803,11.992 173.176,14.746 179.523,19.34 C180.39,19.967 181.072,20.792 181.847,21.518 L96,102 L10.153,21.518 C17.006,14.843 24.608,12.458 34.286,12 z" fill="#FFD900"/>
|
||||
<path d="M10.153,21.518 L96,102 L10.153,182.482 C3.033,176.056 0.488,168.93 -0,159.857 L-0,44.143 C0.045,38.796 1.413,33.541 4.138,28.822 C5.185,27.009 6.599,25.405 7.829,23.697 z" fill="#8DC213"/>
|
||||
<path d="M96,102 L181.847,182.482 C174.993,189.157 167.392,191.542 157.714,192 L34.286,192 C26.197,192.008 18.824,189.254 12.477,184.66 C11.61,184.032 10.928,183.208 10.153,182.482 z" fill="#FF610D"/>
|
||||
<path d="M181.847,21.518 C188.968,27.944 191.511,35.07 192,44.143 L192,159.857 C192.008,167.441 189.071,174.353 184.171,180.303 C183.501,181.116 182.622,181.755 181.847,182.482 L96,102 z" fill="#3399FF"/>
|
||||
</g>
|
||||
<g id="Layer 2" display="none">
|
||||
<g>
|
||||
<path d="M38.9,62.694 L68.199,62.694 L76.19,24.5 L94.169,24.5 L86.179,62.694 L119.949,62.694 L127.75,24.5 L145.729,24.5 L137.928,62.694 L154.1,62.694 L154.1,81.542 L134.504,81.542 L128.511,111.758 L154.1,111.758 L154.1,130.605 L125.086,130.605 L117.285,168.5 L99.211,168.5 L107.107,130.605 L72.956,130.605 L65.536,168.5 L47.366,168.5 L55.072,130.605 L38.9,130.605 L38.9,111.758 L58.782,111.758 L64.775,81.542 L38.9,81.542 z M82.754,81.542 L76.761,111.658 L110.627,111.658 L116.524,81.542 z" fill="#737373"/>
|
||||
<path d="M38.9,62.694 L68.199,62.694 L76.19,24.5 L94.169,24.5 L86.179,62.694 L119.949,62.694 L127.75,24.5 L145.729,24.5 L137.928,62.694 L154.1,62.694 L154.1,81.542 L134.504,81.542 L128.511,111.758 L154.1,111.758 L154.1,130.605 L125.086,130.605 L117.285,168.5 L99.211,168.5 L107.107,130.605 L72.956,130.605 L65.536,168.5 L47.366,168.5 L55.072,130.605 L38.9,130.605 L38.9,111.758 L58.782,111.758 L64.775,81.542 L38.9,81.542 z M82.754,81.542 L76.761,111.658 L110.627,111.658 L116.524,81.542 z" fill-opacity="0" stroke="#737373" stroke-width="3"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Layer 5">
|
||||
<path d="M46.5,36 L145.5,36 C157.926,36 168,45.234 168,56.625 L168,147.375 C168,158.766 157.926,168 145.5,168 L46.5,168 C34.074,168 24,158.766 24,147.375 L24,56.625 C24,45.234 34.074,36 46.5,36 z" fill="#FFFFFF"/>
|
||||
<path d="M60,48 C60,48 60,60 60,60 C60,60 72,60 72,60 L72,48 L84,48 L84,60 L96,60 L96,72 L84,72 L84,84 L96,84 L96,96 L84,96 L84,108 L72,108 L72,96 L60,96 L60,108 L48,108 L48,96 L36,96 L36,84 C36,84 48,84 48,84 C48,84 48,72 48,72 L36,72 L36,60 L48,60 L48,48 z M72,72 C72,72 60,72 60,72 L60,84 L72,84 C72,84 72,72 72,72 z z" fill="#A8A8A8"/>
|
||||
</g>
|
||||
<defs/>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 22 KiB |
@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="912" height="192" viewBox="0, 0, 912, 192">
|
||||
<g id="Layer 1">
|
||||
<path d="M161.998,-1 C166.989,-0.961 171.893,0.237 176.298,2.621 C177.982,3.532 179.472,4.765 181.06,5.836 L95.998,71 L10.936,5.836 C17.447,0.982 21.94,-0.593 29.998,-1 z" fill="#FFD900"/>
|
||||
<path d="M181.06,5.836 L181.081,5.85 C188.441,12.552 191.497,19.084 191.998,29 L191.998,161 C192.055,166.392 190.865,169.411 188.853,174.173 L95.998,71 z" fill="#3399FF"/>
|
||||
<path d="M95.998,71 L188.853,174.173 C185.602,181.567 178.576,187.289 170.919,189.651 C166.842,190.909 165.625,190.817 161.998,191 L29.998,191 C22.984,190.954 16.383,188.529 10.915,184.149 C9.804,183.259 8.902,182.136 7.895,181.129 z" fill="#FF610D"/>
|
||||
<path d="M10.936,5.836 L95.998,71 L7.895,181.129 C2.392,175.671 0.377,168.517 -0.002,161 L-0.002,29 C0.084,22.039 2.399,15.314 6.849,9.917 C8.068,8.438 9.56,7.206 10.915,5.851 z" fill="#8DC213"/>
|
||||
</g>
|
||||
<g id="Layer 3">
|
||||
<path d="M46.5,12 L145.5,12 C157.926,12 168,22.074 168,34.5 L168,133.5 C168,145.926 157.926,156 145.5,156 L46.5,156 C34.074,156 24,145.926 24,133.5 L24,34.5 C24,22.074 34.074,12 46.5,12 z" fill="#FFFFFF"/>
|
||||
<g>
|
||||
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill="#737373"/>
|
||||
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill-opacity="0" stroke="#737373" stroke-width="2"/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<text transform="matrix(1, 0, 0, 1, 414.373, 84)">
|
||||
<tspan x="-189.727" y="55.5" font-family="Charter-Bold" font-size="160" fill="#4D4D4D">S</tspan>
|
||||
<tspan x="-98.867" y="55.5" font-family="Charter-Roman" font-size="160" fill="#4D4D4D">tack</tspan>
|
||||
</text>
|
||||
<path d="M234.099,135.984 L234.099,107 L246.209,107 L248.787,126.219 L250.896,128.641 Q254.412,129.734 257.888,130.281 Q261.365,130.828 264.959,130.828 Q274.334,130.828 279.959,126.687 Q285.584,122.547 285.584,115.672 Q285.584,109.578 281.638,104.852 Q277.693,100.125 268.474,95.516 Q266.99,94.734 263.943,93.328 Q253.006,88.25 247.537,83.641 Q242.146,79.109 239.256,73.406 Q236.365,67.703 236.365,61.766 Q236.365,48.016 246.873,39.109 Q257.381,30.203 274.099,30.203 Q281.365,30.203 288.865,31.57 Q296.365,32.937 304.177,35.672 L304.177,61.609 L292.615,61.609 L289.959,44.969 L287.693,42.703 Q285.427,41.531 282.537,40.984 Q279.646,40.437 275.974,40.437 Q267.459,40.437 262.302,44.656 Q257.146,48.875 257.146,55.672 Q257.146,60.672 260.076,64.695 Q263.006,68.719 270.115,72.937 Q271.834,74.031 279.685,77.508 Q287.537,80.984 292.927,84.422 Q299.881,88.875 303.631,95.125 Q307.381,101.375 307.381,108.484 Q307.381,123.172 295.74,132.234 Q284.099,141.297 264.959,141.297 Q257.146,141.297 249.256,139.93 Q241.365,138.562 234.099,135.984 z M329.568,72.156 L319.49,72.156 L319.49,67.156 L330.037,62.547 L336.912,47.625 L342.849,47.625 L342.849,64.656 L367.224,64.656 L367.224,72.156 L342.849,72.156 L342.849,114.344 Q342.849,124.734 345.74,128.289 Q348.631,131.844 356.131,131.844 Q358.709,131.844 361.482,131.531 Q364.256,131.219 367.224,130.516 L367.224,136.453 Q361.756,138.172 356.443,139.07 Q351.131,139.969 346.209,139.969 Q336.99,139.969 333.279,136.492 Q329.568,133.016 329.568,123.797 z M422.381,124.812 L422.381,96.609 Q402.302,102.156 396.013,106.766 Q389.724,111.375 389.724,118.875 Q389.724,124.891 393.201,128.445 Q396.677,132 402.537,132 Q406.287,132 411.17,130.203 Q416.052,128.406 422.381,124.812 z M422.381,130.203 Q414.646,135.516 408.201,138.055 Q401.756,140.594 396.131,140.594 Q386.834,140.594 381.248,134.969 Q375.662,129.344 375.662,120.125 Q375.662,109.891 384.06,104.031 Q392.459,98.172 422.381,90.984 L422.381,85.906 Q422.381,75.828 419.099,71.922 Q415.818,68.016 407.693,68.016 Q404.646,68.016 401.677,68.641 Q398.709,69.266 395.506,70.516 L395.506,83.953 L384.49,83.953 Q381.599,83.953 380.545,82.898 Q379.49,81.844 379.49,79.031 Q379.49,71.219 388.513,66.062 Q397.537,60.906 411.834,60.906 Q424.412,60.906 430.115,66.375 Q435.818,71.844 435.818,83.953 L435.818,130.359 L438.552,132.938 L446.99,133.719 L446.99,139.5 L424.49,139.5 z M518.006,132.781 Q511.287,136.688 504.802,138.641 Q498.318,140.594 491.99,140.594 Q475.74,140.594 465.857,129.695 Q455.974,118.797 455.974,100.906 Q455.974,83.172 466.482,72.039 Q476.99,60.906 493.865,60.906 Q505.037,60.906 511.443,65.164 Q517.849,69.422 517.849,76.609 Q517.849,80.437 515.427,82.781 Q513.006,85.125 508.943,85.125 Q507.146,85.125 505.349,84.5 Q503.552,83.875 501.756,82.703 L501.756,69.578 Q499.881,68.484 497.927,67.898 Q495.974,67.312 494.021,67.312 Q483.396,67.312 476.951,76.18 Q470.506,85.047 470.506,99.812 Q470.506,114.422 477.81,122.82 Q485.115,131.219 497.693,131.219 Q502.927,131.219 507.927,129.539 Q512.927,127.859 518.006,124.422 z M525.349,139.5 L525.349,133.719 L534.021,132.938 L536.756,130.359 L536.756,32.469 L524.412,32.469 L524.412,27.469 L543.943,21.766 L550.037,21.766 L550.037,98.719 L553.084,98.719 L577.537,71.375 L576.443,69.109 L569.177,68.484 L569.177,62.547 L599.568,62.547 L599.568,68.484 L589.334,69.734 L567.459,92.937 L595.584,132.625 L605.818,133.406 L605.818,139.5 L580.896,139.5 L580.896,134.188 L559.256,103.172 L550.037,103.172 L550.037,130.359 L552.849,132.938 L560.427,133.719 L560.427,139.5 z" fill-opacity="0" stroke="#4D4D4D" stroke-width="1"/>
|
||||
</g>
|
||||
<g>
|
||||
<text transform="matrix(1, 0, 0, 1, 757.367, 84)">
|
||||
<tspan x="-141.992" y="55.5" font-family="Charter-Bold" font-size="160" fill="#4D4D4D">E</tspan>
|
||||
<tspan x="-46.602" y="55.5" font-family="Charter-Roman" font-size="160" fill="#4D4D4D">dit</tspan>
|
||||
</text>
|
||||
<path d="M619.984,139.5 L619.984,131.688 L629.75,130.828 L632.328,128.328 L632.328,43.016 L629.75,40.75 L619.984,39.969 L619.984,32.156 L700.687,32.156 L700.687,57.234 L689.593,57.234 L686.859,43.172 L685.14,41.063 L653.109,41.063 L653.109,79.188 L673.968,79.188 L676.156,76.922 L677.797,65.438 L687.25,65.438 L687.25,102.547 L677.797,102.547 L676.156,90.984 L673.968,88.797 L653.109,88.797 L653.109,130.359 L690.453,130.359 L692.328,127.781 L694.906,110.828 L705.922,110.828 L705.922,139.5 z M772.015,125.281 L772.015,70.359 Q767.64,69.109 764.164,68.445 Q760.687,67.781 757.953,67.781 Q745.687,67.781 738.148,76.844 Q730.609,85.906 730.609,100.75 Q730.609,114.578 737.132,122.703 Q743.656,130.828 754.593,130.828 Q758.812,130.828 763.148,129.461 Q767.484,128.094 772.015,125.281 z M772.015,32.469 L759.75,32.469 L759.75,27.469 L779.281,21.766 L785.297,21.766 L785.297,130.359 L788.031,132.938 L795.687,133.719 L795.687,139.5 L772.015,139.5 L772.015,131.219 Q765.765,136.219 759.828,138.562 Q753.89,140.906 747.406,140.906 Q733.968,140.906 725.257,130.398 Q716.547,119.891 716.547,103.484 Q716.547,84.422 727.992,72.586 Q739.437,60.75 757.797,60.75 Q761,60.75 764.593,61.219 Q768.187,61.688 772.015,62.547 z M825.14,61.766 L831.39,61.766 L831.39,130.359 L834.125,132.938 L842.718,133.719 L842.718,139.5 L806.781,139.5 L806.781,133.719 L815.218,132.938 L817.953,130.359 L817.953,72.469 L806.781,72.469 L806.781,67.469 z M825.765,26.219 Q829.672,26.219 832.367,28.953 Q835.062,31.688 835.062,35.516 Q835.062,39.344 832.367,42 Q829.672,44.656 825.765,44.656 Q821.937,44.656 819.242,42 Q816.547,39.344 816.547,35.516 Q816.547,31.609 819.242,28.914 Q821.937,26.219 825.765,26.219 z M859.984,72.156 L849.906,72.156 L849.906,67.156 L860.453,62.547 L867.328,47.625 L873.265,47.625 L873.265,64.656 L897.64,64.656 L897.64,72.156 L873.265,72.156 L873.265,114.344 Q873.265,124.734 876.156,128.289 Q879.047,131.844 886.547,131.844 Q889.125,131.844 891.898,131.531 Q894.672,131.219 897.64,130.516 L897.64,136.453 Q892.172,138.172 886.859,139.07 Q881.547,139.969 876.625,139.969 Q867.406,139.969 863.695,136.492 Q859.984,133.016 859.984,123.797 z" fill-opacity="0" stroke="#4D4D4D" stroke-width="1"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<defs/>
|
||||
</svg>
|
Before Width: | Height: | Size: 8.7 KiB |
BIN
img/logo.idraw
18
img/logo.svg
@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="192" height="192" viewBox="0, 0, 192, 192">
|
||||
<g id="Layer 1">
|
||||
<path d="M161.999,-0 C166.99,0.039 171.894,1.237 176.299,3.621 C177.983,4.532 179.473,5.765 181.061,6.836 L95.999,72 L10.937,6.836 C17.448,1.982 21.941,0.407 29.999,-0 z" fill="#FFD900"/>
|
||||
<path d="M181.061,6.836 L181.082,6.85 C188.442,13.552 191.498,20.084 191.999,30 L191.999,162 C192.056,167.392 190.866,170.411 188.854,175.173 L95.999,72 z" fill="#3399FF"/>
|
||||
<path d="M95.999,72 L188.854,175.173 C185.603,182.567 178.577,188.289 170.92,190.651 C166.843,191.909 165.626,191.817 161.999,192 L29.999,192 C22.985,191.954 16.384,189.529 10.916,185.149 C9.805,184.259 8.903,183.136 7.896,182.129 z" fill="#FF610D"/>
|
||||
<path d="M10.937,6.836 L95.999,72 L7.896,182.129 C2.393,176.671 0.378,169.517 -0.001,162 L-0.001,30 C0.085,23.039 2.4,16.314 6.85,10.917 C8.069,9.438 9.561,8.206 10.916,6.851 z" fill="#8DC213"/>
|
||||
</g>
|
||||
<g id="Layer 3">
|
||||
<path d="M46.5,12 L145.5,12 C157.926,12 168,22.074 168,34.5 L168,133.5 C168,145.926 157.926,156 145.5,156 L46.5,156 C34.074,156 24,145.926 24,133.5 L24,34.5 C24,22.074 34.074,12 46.5,12 z" fill="#FFFFFF"/>
|
||||
<g>
|
||||
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill="#737373"/>
|
||||
<path d="M41.66,48.557 L56.13,48.557 L60.077,29.694 L68.956,29.694 L65.01,48.557 L81.688,48.557 L85.541,29.694 L94.42,29.694 L90.568,48.557 L98.555,48.557 L98.555,57.865 L88.876,57.865 L85.917,72.789 L98.555,72.789 L98.555,82.097 L84.225,82.097 L80.373,100.812 L71.446,100.812 L75.346,82.097 L58.479,82.097 L54.815,100.812 L45.841,100.812 L49.647,82.097 L41.66,82.097 L41.66,72.789 L51.479,72.789 L54.439,57.865 L41.66,57.865 z M63.318,57.865 L60.358,72.739 L77.084,72.739 L79.997,57.865 z" fill-opacity="0" stroke="#737373" stroke-width="2"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs/>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 5.3 KiB |
31
index.html
Normal 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
@ -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
160
package.json
@ -1,37 +1,141 @@
|
||||
{
|
||||
"name": "stackedit",
|
||||
"version": "3.0.1",
|
||||
"description": "StackEdit is a free, open-source Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites.",
|
||||
"main": "res/main.js",
|
||||
"directories": {
|
||||
"doc": "doc"
|
||||
"version": "5.15.21",
|
||||
"description": "免费, 开源, 功能齐全的 Markdown 编辑器",
|
||||
"author": "Benoit Schweblin, 豆萁",
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/mafgwo/stackedit/issues"
|
||||
},
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"postinstall": "gulp build-prism",
|
||||
"start": "node build/dev-server.js",
|
||||
"build": "node build/build.js && npm run build-style",
|
||||
"build-style": "webpack --config build/webpack.style.conf.js",
|
||||
"lint": "eslint --ext .js,.vue src server",
|
||||
"unit": "jest --config test/unit/jest.conf.js --runInBand",
|
||||
"unit-with-coverage": "jest --config test/unit/jest.conf.js --runInBand --coverage",
|
||||
"test": "npm run lint && npm run unit",
|
||||
"preversion": "npm run test",
|
||||
"postversion": "git push origin master --tags && npm publish",
|
||||
"patch": "npm version patch -m \"Tag v%s\"",
|
||||
"minor": "npm version minor -m \"Tag v%s\"",
|
||||
"major": "npm version major -m \"Tag v%s\"",
|
||||
"chart": "mkdir -p dist && rm -rf dist/stackedit && cp -r chart dist/stackedit && sed -i.bak -e s/STACKEDIT_VERSION/$npm_package_version/g dist/stackedit/*.yaml && rm dist/stackedit/*.yaml.bak"
|
||||
},
|
||||
"dependencies": {
|
||||
"express": "3.x",
|
||||
"ejs": "~0.8.4"
|
||||
"@vue/test-utils": "^1.0.0-beta.16",
|
||||
"abcjs": "^5.2.0",
|
||||
"babel-runtime": "^6.26.0",
|
||||
"bezier-easing": "^1.1.0",
|
||||
"body-parser": "^1.18.2",
|
||||
"clipboard": "^1.7.1",
|
||||
"compression": "^1.7.0",
|
||||
"diff-match-patch": "^1.0.0",
|
||||
"file-saver": "^1.3.8",
|
||||
"handlebars": "^4.0.10",
|
||||
"indexeddbshim": "^3.6.2",
|
||||
"js-yaml": "^3.11.0",
|
||||
"katex": "^0.16.2",
|
||||
"markdown-it": "^8.4.1",
|
||||
"markdown-it-abbr": "^1.0.4",
|
||||
"markdown-it-deflist": "^2.0.2",
|
||||
"markdown-it-emoji": "^1.3.0",
|
||||
"markdown-it-footnote": "^3.0.1",
|
||||
"markdown-it-imsize": "^2.0.1",
|
||||
"markdown-it-mark": "^2.0.0",
|
||||
"markdown-it-pandoc-renderer": "1.1.3",
|
||||
"markdown-it-sub": "^1.0.0",
|
||||
"markdown-it-sup": "^1.0.0",
|
||||
"mermaid": "^8.9.2",
|
||||
"mousetrap": "^1.6.1",
|
||||
"normalize-scss": "^7.0.1",
|
||||
"prismjs": "^1.6.0",
|
||||
"request": "^2.85.0",
|
||||
"serve-static": "^1.13.2",
|
||||
"tmp": "^0.0.33",
|
||||
"turndown": "^7.1.1",
|
||||
"vue": "^2.5.16",
|
||||
"vuex": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"grunt": "~0.4.1",
|
||||
"grunt-contrib-requirejs": "~0.4.1",
|
||||
"grunt-contrib-less": "~0.7.0",
|
||||
"grunt-string-replace": "~0.2.4",
|
||||
"grunt-contrib-copy": "~0.4.1",
|
||||
"bower": "~1.2.5",
|
||||
"grunt-bower-requirejs": "~0.7.1",
|
||||
"grunt-bower-task": "~0.3.1",
|
||||
"grunt-bump": "0.0.11",
|
||||
"grunt-contrib-jshint": "~0.7.1"
|
||||
"autoprefixer": "^6.7.2",
|
||||
"babel-core": "^6.26.3",
|
||||
"babel-eslint": "^8.2.3",
|
||||
"babel-jest": "^21.0.2",
|
||||
"babel-loader": "^7.1.4",
|
||||
"babel-plugin-dynamic-import-node": "^1.2.0",
|
||||
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
|
||||
"babel-plugin-transform-runtime": "^6.23.0",
|
||||
"babel-polyfill": "^6.23.0",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"babel-preset-stage-2": "^6.22.0",
|
||||
"babel-register": "^6.22.0",
|
||||
"chalk": "^1.1.3",
|
||||
"connect-history-api-fallback": "^1.3.0",
|
||||
"copy-webpack-plugin": "^4.5.1",
|
||||
"css-loader": "^0.28.11",
|
||||
"eslint": "^4.19.1",
|
||||
"eslint-config-airbnb-base": "^12.1.0",
|
||||
"eslint-friendly-formatter": "^4.0.1",
|
||||
"eslint-import-resolver-webpack": "^0.9.0",
|
||||
"eslint-loader": "^2.0.0",
|
||||
"eslint-plugin-html": "^4.0.3",
|
||||
"eslint-plugin-import": "^2.11.0",
|
||||
"eventsource-polyfill": "^0.9.6",
|
||||
"express": "^4.16.3",
|
||||
"extract-text-webpack-plugin": "^2.0.0",
|
||||
"favicons-webpack-plugin": "^0.0.9",
|
||||
"file-loader": "^1.1.11",
|
||||
"friendly-errors-webpack-plugin": "^1.7.0",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-concat": "^2.6.1",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"http-proxy-middleware": "^0.18.0",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"ignore-loader": "^0.1.2",
|
||||
"jest": "^23.0.0",
|
||||
"jest-raw-loader": "^1.0.1",
|
||||
"jest-serializer-vue": "^0.3.0",
|
||||
"js-md5": "^0.7.3",
|
||||
"node-sass": "^4.0.0",
|
||||
"npm-bump": "^0.0.23",
|
||||
"offline-plugin": "^5.0.3",
|
||||
"opn": "^4.0.2",
|
||||
"optimize-css-assets-webpack-plugin": "^1.3.2",
|
||||
"ora": "^1.2.0",
|
||||
"raw-loader": "^0.5.1",
|
||||
"replace-in-file": "^4.1.0",
|
||||
"rimraf": "^2.6.0",
|
||||
"sass-loader": "^7.0.1",
|
||||
"semver": "^5.5.0",
|
||||
"shelljs": "^0.8.1",
|
||||
"string-replace-loader": "^2.1.1",
|
||||
"stylelint": "^9.2.0",
|
||||
"stylelint-config-standard": "^16.0.0",
|
||||
"stylelint-processor-html": "^1.0.0",
|
||||
"stylelint-webpack-plugin": "^0.10.4",
|
||||
"url-loader": "^1.0.1",
|
||||
"vue-jest": "^1.0.2",
|
||||
"vue-loader": "^15.0.9",
|
||||
"vue-style-loader": "^4.1.0",
|
||||
"vue-template-compiler": "^2.5.16",
|
||||
"webpack": "^2.6.1",
|
||||
"webpack-bundle-analyzer": "^3.3.2",
|
||||
"webpack-dev-middleware": "^1.10.0",
|
||||
"webpack-hot-middleware": "^2.18.0",
|
||||
"webpack-merge": "^4.1.2",
|
||||
"webpack-pwa-manifest": "^3.7.1",
|
||||
"worker-loader": "^1.1.1"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
"engines": {
|
||||
"node": ">= 8.0.0",
|
||||
"npm": ">= 5.0.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/benweet/stackedit.git"
|
||||
},
|
||||
"author": "Benoit Schweblin",
|
||||
"license": "Apache License",
|
||||
"bugs": {
|
||||
"url": "https://github.com/benweet/stackedit/issues"
|
||||
}
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie <= 10"
|
||||
]
|
||||
}
|
||||
|
@ -1,418 +0,0 @@
|
||||
CACHE MANIFEST
|
||||
#Date Tue Dec 03 2013 23:11:58
|
||||
|
||||
CACHE:
|
||||
res/worker.js
|
||||
libs/MathJax/MathJax.js?config=TeX-AMS_HTML
|
||||
libs/MathJax/config/Safe.js
|
||||
libs/MathJax/config/TeX-AMS_HTML.js
|
||||
libs/MathJax/images/CloseX-31.png
|
||||
libs/MathJax/images/MenuArrow-15.png
|
||||
libs/MathJax/jax/output/HTML-CSS/jax.js
|
||||
|
||||
#DynamicResourcesBegin
|
||||
res-min/font/OpenSans-Bold.woff
|
||||
res-min/font/OpenSans-BoldItalic.woff
|
||||
res-min/font/OpenSans-Italic.woff
|
||||
res-min/font/OpenSans-Light.woff
|
||||
res-min/font/OpenSans.woff
|
||||
res-min/font/OpenSansLight-Italic.woff
|
||||
res-min/font/cursive_standard-webfont.eot
|
||||
res-min/font/cursive_standard-webfont.svg
|
||||
res-min/font/cursive_standard-webfont.ttf
|
||||
res-min/font/cursive_standard-webfont.woff
|
||||
res-min/font/fontello.eot
|
||||
res-min/font/fontello.svg
|
||||
res-min/font/fontello.ttf
|
||||
res-min/font/fontello.woff
|
||||
res-min/img/gittip.png
|
||||
res-min/img/icons.png
|
||||
res-min/img/icons2x.png
|
||||
res-min/img/logo-promo-128.png
|
||||
res-min/img/menu-icon.png
|
||||
res-min/img/school-line.png
|
||||
res-min/img/stackedit-32.ico
|
||||
res-min/main.js
|
||||
res-min/require.js
|
||||
res-min/themes/base.css
|
||||
res-min/themes/default.css
|
||||
res-min/themes/gray.css
|
||||
res-min/themes/night.css
|
||||
res-min/themes/school.css
|
||||
libs/dictionaries/de_DE.aff.lz
|
||||
libs/dictionaries/de_DE.dic.lz
|
||||
libs/dictionaries/en_US.aff.lz
|
||||
libs/dictionaries/en_US.dic.lz
|
||||
libs/dictionaries/es_ES.aff.lz
|
||||
libs/dictionaries/es_ES.dic.lz
|
||||
libs/dictionaries/fr_FR.aff.lz
|
||||
libs/dictionaries/fr_FR.dic.lz
|
||||
libs/MathJax/extensions/FontWarnings.js
|
||||
libs/MathJax/extensions/HTML-CSS/handle-floats.js
|
||||
libs/MathJax/extensions/HelpDialog.js
|
||||
libs/MathJax/extensions/MatchWebFonts.js
|
||||
libs/MathJax/extensions/MathEvents.js
|
||||
libs/MathJax/extensions/MathML/content-mathml.js
|
||||
libs/MathJax/extensions/MathMenu.js
|
||||
libs/MathJax/extensions/MathZoom.js
|
||||
libs/MathJax/extensions/Safe.js
|
||||
libs/MathJax/extensions/TeX/AMScd.js
|
||||
libs/MathJax/extensions/TeX/AMSmath.js
|
||||
libs/MathJax/extensions/TeX/AMSsymbols.js
|
||||
libs/MathJax/extensions/TeX/HTML.js
|
||||
libs/MathJax/extensions/TeX/action.js
|
||||
libs/MathJax/extensions/TeX/autobold.js
|
||||
libs/MathJax/extensions/TeX/autoload-all.js
|
||||
libs/MathJax/extensions/TeX/bbox.js
|
||||
libs/MathJax/extensions/TeX/begingroup.js
|
||||
libs/MathJax/extensions/TeX/boldsymbol.js
|
||||
libs/MathJax/extensions/TeX/cancel.js
|
||||
libs/MathJax/extensions/TeX/color.js
|
||||
libs/MathJax/extensions/TeX/enclose.js
|
||||
libs/MathJax/extensions/TeX/extpfeil.js
|
||||
libs/MathJax/extensions/TeX/mathchoice.js
|
||||
libs/MathJax/extensions/TeX/mhchem.js
|
||||
libs/MathJax/extensions/TeX/newcommand.js
|
||||
libs/MathJax/extensions/TeX/noErrors.js
|
||||
libs/MathJax/extensions/TeX/noUndefined.js
|
||||
libs/MathJax/extensions/TeX/unicode.js
|
||||
libs/MathJax/extensions/TeX/verb.js
|
||||
libs/MathJax/extensions/asciimath2jax.js
|
||||
libs/MathJax/extensions/jsMath2jax.js
|
||||
libs/MathJax/extensions/mml2jax.js
|
||||
libs/MathJax/extensions/tex2jax.js
|
||||
libs/MathJax/extensions/toMathML.js
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_AMS-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Bold.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Caligraphic-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Bold.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Fraktur-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Bold.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Italic.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Main-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-BoldItalic.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Italic.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Math-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Bold.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Italic.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_SansSerif-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Script-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size1-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size2-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size3-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Size4-Regular.woff
|
||||
libs/MathJax/fonts/HTML-CSS/TeX/woff/MathJax_Typewriter-Regular.woff
|
||||
libs/MathJax/jax/element/mml/jax.js
|
||||
libs/MathJax/jax/element/mml/optable/Arrows.js
|
||||
libs/MathJax/jax/element/mml/optable/BasicLatin.js
|
||||
libs/MathJax/jax/element/mml/optable/CombDiacritMarks.js
|
||||
libs/MathJax/jax/element/mml/optable/CombDiactForSymbols.js
|
||||
libs/MathJax/jax/element/mml/optable/Dingbats.js
|
||||
libs/MathJax/jax/element/mml/optable/GeneralPunctuation.js
|
||||
libs/MathJax/jax/element/mml/optable/GeometricShapes.js
|
||||
libs/MathJax/jax/element/mml/optable/GreekAndCoptic.js
|
||||
libs/MathJax/jax/element/mml/optable/Latin1Supplement.js
|
||||
libs/MathJax/jax/element/mml/optable/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/element/mml/optable/MathOperators.js
|
||||
libs/MathJax/jax/element/mml/optable/MiscMathSymbolsA.js
|
||||
libs/MathJax/jax/element/mml/optable/MiscMathSymbolsB.js
|
||||
libs/MathJax/jax/element/mml/optable/MiscSymbolsAndArrows.js
|
||||
libs/MathJax/jax/element/mml/optable/MiscTechnical.js
|
||||
libs/MathJax/jax/element/mml/optable/SpacingModLetters.js
|
||||
libs/MathJax/jax/element/mml/optable/SuppMathOperators.js
|
||||
libs/MathJax/jax/element/mml/optable/SupplementalArrowsA.js
|
||||
libs/MathJax/jax/element/mml/optable/SupplementalArrowsB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/annotation-xml.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/maction.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/menclose.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/mglyph.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/mmultiscripts.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/ms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/mtable.js
|
||||
libs/MathJax/jax/output/HTML-CSS/autoload/multiline.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Arrows.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BBBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/BoxDrawing.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Dingbats.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/EnclosedAlphanum.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GeometricShapes.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/GreekAndCoptic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LatinExtendedA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscMathSymbolsB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/MiscTechnical.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/PUA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/AMS/Regular/SuppMathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Caligraphic/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Bold/PUA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Fraktur/Regular/PUA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/BoldItalic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Italic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Greek/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Arrows.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/CombDiactForSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/GeometricShapes.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LatinExtendedB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscMathSymbolsA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/MiscTechnical.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SuppMathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Bold/SupplementalArrowsA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Italic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/GeometricShapes.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/MiscSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Main/Regular/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/BoldItalic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Math/Italic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Bold/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Italic/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/SansSerif/Regular/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Script/Regular/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size1/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size2/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size3/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Size4/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/Typewriter/Regular/Other.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinChrome/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/AMS.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Bold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/WinIE6/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata-extra.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/TeX/fontdata.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/AlphaPresentForms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Arrows.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BBBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoldFraktur.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/BoxDrawing.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CombDiactForSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/ControlPictures.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/CurrencySymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Cyrillic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/EnclosedAlphanum.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GeometricShapes.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekAndCoptic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/GreekSSBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/IPAExtensions.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedAdditional.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LatinExtendedD.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MathSSBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscMathSymbolsB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/MiscTechnical.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/NumberForms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/PhoneticExtensions.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuperAndSubscripts.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Bold/SuppMathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/AlphaPresentForms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BasicLatin.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/BoxDrawing.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CombDiactForSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/ControlPictures.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/CurrencySymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Cyrillic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/EnclosedAlphanum.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekAndCoptic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekBoldItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/GreekSSBoldItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/IPAExtensions.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedAdditional.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LatinExtendedB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathBoldScript.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/MathSSItalicBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/BoldItalic/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/AlphaPresentForms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/BoxDrawing.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CombDiactForSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ControlPictures.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/CurrencySymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Cyrillic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/EnclosedAlphanum.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekAndCoptic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/GreekItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/IPAExtensions.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedAdditional.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LatinExtendedB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathSSItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/MathScript.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Italic/ij.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/AlphaPresentForms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Arrows.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BBBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BlockElements.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoldFraktur.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/BoxDrawing.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CJK.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiacritMarks.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CombDiactForSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ControlPictures.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/CurrencySymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Cyrillic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Dingbats.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/EnclosedAlphanum.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Fraktur.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeneralPunctuation.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GeometricShapes.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekAndCoptic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekBoldItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/GreekSSBoldItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Hiragana.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/IPAExtensions.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Latin1Supplement.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedAdditional.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LatinExtendedD.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/LetterlikeSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathBoldScript.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSS.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalic.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathSSItalicBold.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathScript.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MathTT.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscMathSymbolsB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbols.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscSymbolsAndArrows.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/MiscTechnical.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/NumberForms.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/PhoneticExtensions.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SpacingModLetters.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/Specials.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuperAndSubscripts.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SuppMathOperators.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsA.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/SupplementalArrowsB.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/General/Regular/ij.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsD/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsSm/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUp/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpD/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/IntegralsUpSm/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Bold/PrivateUse.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/BoldItalic/PrivateUse.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Italic/PrivateUse.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/NonUnicode/Regular/PrivateUse.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFiveSym/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeFourSym/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeOneSym/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeThreeSym/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/SizeTwoSym/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Bold/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/All.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/Variants/Regular/Main.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-1.0.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-beta.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata-extra.js
|
||||
libs/MathJax/jax/output/HTML-CSS/fonts/STIX/fontdata.js
|
||||
#DynamicResourcesEnd
|
||||
|
||||
NETWORK:
|
||||
*
|
@ -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 — Page not found</p>
|
||||
</body>
|
||||
|
||||
</html>
|