Merge branches 'dev_aliyun' and 'dev_aliyun2' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun2
commit
8eef510ceb
@ -0,0 +1 @@
|
|||||||
|
GENERATE_SOURCEMAP=false
|
@ -0,0 +1,23 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
/node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
/dist
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
@ -0,0 +1,83 @@
|
|||||||
|
const {
|
||||||
|
override,
|
||||||
|
addLessLoader,
|
||||||
|
disableEsLint,
|
||||||
|
addBundleVisualizer,
|
||||||
|
addWebpackAlias,
|
||||||
|
fixBabelImports,
|
||||||
|
addWebpackPlugin
|
||||||
|
} = require("customize-cra")
|
||||||
|
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin')
|
||||||
|
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin')
|
||||||
|
const HardSourceWebpackPlugin = require('hard-source-webpack-plugin')
|
||||||
|
|
||||||
|
let instance = new HardSourceWebpackPlugin({
|
||||||
|
// Either an absolute path or relative to webpack's options.context.
|
||||||
|
cacheDirectory: 'node_modules/.cache/hard-source/[confighash]',
|
||||||
|
// Either a string of object hash function given a webpack config.
|
||||||
|
configHash: function (webpackConfig) {
|
||||||
|
// node-object-hash on npm can be used to build this.
|
||||||
|
return require('node-object-hash')({ sort: false }).hash(webpackConfig);
|
||||||
|
},
|
||||||
|
// Either false, a string, an object, or a project hashing function.
|
||||||
|
environmentHash: {
|
||||||
|
root: process.cwd(),
|
||||||
|
directories: [],
|
||||||
|
files: ['package-lock.json', 'yarn.lock'],
|
||||||
|
},// How to launch the extra processes. Default:
|
||||||
|
fork: (fork, compiler, webpackBin) => fork(
|
||||||
|
webpackBin(),
|
||||||
|
['--config', __filename], {
|
||||||
|
silent: true,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
// Number of workers to spawn. Default:
|
||||||
|
numWorkers: () => require('os').cpus().length,
|
||||||
|
// Number of modules built before launching parallel building. Default:
|
||||||
|
minModules: 10,
|
||||||
|
// An object.
|
||||||
|
info: {
|
||||||
|
// 'none' or 'test'.
|
||||||
|
mode: 'none',
|
||||||
|
// 'debug', 'log', 'info', 'warn', or 'error'.
|
||||||
|
level: 'debug',
|
||||||
|
},
|
||||||
|
// Clean up large, old caches automatically.
|
||||||
|
cachePrune: {
|
||||||
|
// Caches younger than `maxAge` are not considered for deletion. They must
|
||||||
|
// be at least this (default: 2 days) old in milliseconds.
|
||||||
|
maxAge: 2 * 24 * 60 * 60 * 1000,
|
||||||
|
// All caches together must be larger than `sizeThreshold` before any
|
||||||
|
// caches will be deleted. Together they must be at least this
|
||||||
|
// (default: 50 MB) big in bytes.
|
||||||
|
sizeThreshold: 50 * 1024 * 1024
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
module.exports = override(
|
||||||
|
disableEsLint(),
|
||||||
|
// addBundleVisualizer(),
|
||||||
|
addWebpackAlias({
|
||||||
|
"educoder": path.resolve(__dirname, 'src/common/educoder.js')
|
||||||
|
}),
|
||||||
|
addLessLoader({
|
||||||
|
javascriptEnabled: true
|
||||||
|
}),
|
||||||
|
fixBabelImports('import', {
|
||||||
|
libraryName: 'antd',
|
||||||
|
libraryDirectory: 'es',
|
||||||
|
style: true
|
||||||
|
}),
|
||||||
|
addWebpackPlugin(new MonacoWebpackPlugin({})),
|
||||||
|
// addWebpackPlugin(instance),
|
||||||
|
(config) => {
|
||||||
|
config.resolve.plugins = config.resolve.plugins.filter(plugin => !(plugin instanceof ModuleScopePlugin));
|
||||||
|
if (process.env.NODE_ENV !== "development") {
|
||||||
|
config.output.publicPath = `/react/build/`;
|
||||||
|
}
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
);
|
@ -1,14 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
// This is a custom Jest transformer turning style imports into empty objects.
|
|
||||||
// http://facebook.github.io/jest/docs/en/webpack.html
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
process() {
|
|
||||||
return 'module.exports = {};';
|
|
||||||
},
|
|
||||||
getCacheKey() {
|
|
||||||
// The output is always the same.
|
|
||||||
return 'cssTransform';
|
|
||||||
},
|
|
||||||
};
|
|
@ -1,12 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
// This is a custom Jest transformer turning file imports into filenames.
|
|
||||||
// http://facebook.github.io/jest/docs/en/webpack.html
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
process(src, filename) {
|
|
||||||
return `module.exports = ${JSON.stringify(path.basename(filename))};`;
|
|
||||||
},
|
|
||||||
};
|
|
@ -1,55 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const fs = require('fs');
|
|
||||||
const url = require('url');
|
|
||||||
|
|
||||||
// Make sure any symlinks in the project folder are resolved:
|
|
||||||
// https://github.com/facebookincubator/create-react-app/issues/637
|
|
||||||
const appDirectory = fs.realpathSync(process.cwd());
|
|
||||||
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
|
|
||||||
|
|
||||||
const envPublicUrl = process.env.PUBLIC_URL;
|
|
||||||
|
|
||||||
function ensureSlash(path, needsSlash) {
|
|
||||||
const hasSlash = path.endsWith('/');
|
|
||||||
if (hasSlash && !needsSlash) {
|
|
||||||
return path.substr(path, path.length - 1);
|
|
||||||
} else if (!hasSlash && needsSlash) {
|
|
||||||
return `${path}/`;
|
|
||||||
} else {
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const getPublicUrl = appPackageJson =>
|
|
||||||
envPublicUrl || require(appPackageJson).homepage;
|
|
||||||
|
|
||||||
// We use `PUBLIC_URL` environment variable or "homepage" field to infer
|
|
||||||
// "public path" at which the app is served.
|
|
||||||
// Webpack needs to know it to put the right <script> hrefs into HTML even in
|
|
||||||
// single-page apps that may serve index.html for nested URLs like /todos/42.
|
|
||||||
// We can't use a relative path in HTML because we don't want to load something
|
|
||||||
// like /todos/42/static/js/bundle.7289d.js. We have to know the root.
|
|
||||||
function getServedPath(appPackageJson) {
|
|
||||||
const publicUrl = getPublicUrl(appPackageJson);
|
|
||||||
const servedUrl =
|
|
||||||
envPublicUrl || (publicUrl ? url.parse(publicUrl).pathname : '/');
|
|
||||||
return ensureSlash(servedUrl, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// config after eject: we're in ./config/
|
|
||||||
module.exports = {
|
|
||||||
dotenv: resolveApp('.env'),
|
|
||||||
appBuild: resolveApp('build'),
|
|
||||||
appPublic: resolveApp('public'),
|
|
||||||
appHtml: resolveApp('public/index.html'),
|
|
||||||
appIndexJs: resolveApp('src/index.js'),
|
|
||||||
appPackageJson: resolveApp('package.json'),
|
|
||||||
appSrc: resolveApp('src'),
|
|
||||||
yarnLockFile: resolveApp('yarn.lock'),
|
|
||||||
testsSetup: resolveApp('src/setupTests.js'),
|
|
||||||
appNodeModules: resolveApp('node_modules'),
|
|
||||||
publicUrl: getPublicUrl(resolveApp('package.json')),
|
|
||||||
servedPath: getServedPath(resolveApp('package.json')),
|
|
||||||
};
|
|
@ -1,22 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
if (typeof Promise === 'undefined') {
|
|
||||||
// Rejection tracking prevents a common issue where React gets into an
|
|
||||||
// inconsistent state due to an error, but it gets swallowed by a Promise,
|
|
||||||
// and the user has no idea what causes React's erratic future behavior.
|
|
||||||
require('promise/lib/rejection-tracking').enable();
|
|
||||||
window.Promise = require('promise/lib/es6-extensions.js');
|
|
||||||
}
|
|
||||||
|
|
||||||
// fetch() polyfill for making API calls.
|
|
||||||
require('whatwg-fetch');
|
|
||||||
|
|
||||||
// Object.assign() is commonly used with React.
|
|
||||||
// It will use the native implementation if it's present and isn't buggy.
|
|
||||||
Object.assign = require('object-assign');
|
|
||||||
|
|
||||||
// In tests, polyfill requestAnimationFrame since jsdom doesn't provide it yet.
|
|
||||||
// We don't polyfill it in the browser--this is user's responsibility.
|
|
||||||
if (process.env.NODE_ENV === 'test') {
|
|
||||||
require('raf').polyfill(global);
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import ReactDOM from 'react-dom';
|
|
||||||
|
|
||||||
import './index.css';
|
|
||||||
import './indexPlus.css';
|
|
||||||
import App from './App';
|
|
||||||
|
|
||||||
// 加之前main.js 18.1MB
|
|
||||||
// import { message } from 'antd';
|
|
||||||
import message from 'antd/lib/message';
|
|
||||||
import 'antd/lib/message/style/css';
|
|
||||||
|
|
||||||
import { AppContainer } from 'react-hot-loader';
|
|
||||||
|
|
||||||
import registerServiceWorker from './registerServiceWorker';
|
|
||||||
|
|
||||||
import { configureUrlQuery } from 'react-url-query';
|
|
||||||
|
|
||||||
import history from './history';
|
|
||||||
|
|
||||||
// link the history used in our app to url-query so it can update the URL with it.
|
|
||||||
configureUrlQuery({ history });
|
|
||||||
// ----------------------------------------------------------------------------------- 请求配置
|
|
||||||
|
|
||||||
window.__useKindEditor = false;
|
|
||||||
|
|
||||||
|
|
||||||
const render = (Component) => {
|
|
||||||
ReactDOM.render(
|
|
||||||
<AppContainer {...this.props} {...this.state}>
|
|
||||||
<Component {...this.props} {...this.state}/>
|
|
||||||
</AppContainer>,
|
|
||||||
document.getElementById('root')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ReactDOM.render(
|
|
||||||
// ,
|
|
||||||
// document.getElementById('root'));
|
|
||||||
// registerServiceWorker();
|
|
||||||
|
|
||||||
render(App);
|
|
||||||
if (module.hot) {
|
|
||||||
module.hot.accept('./App', () => { render(App) });
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,192 +1,94 @@
|
|||||||
{
|
{
|
||||||
"name": "educoder",
|
"name": "h5",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"homepage": "/react/build/",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@icedesign/base": "^0.2.5",
|
"@loadable/component": "^5.12.0",
|
||||||
"@monaco-editor/react": "^2.3.0",
|
|
||||||
"@novnc/novnc": "^1.1.0",
|
"@novnc/novnc": "^1.1.0",
|
||||||
"antd": "^3.23.2",
|
"antd": "^3.26.12",
|
||||||
"array-flatten": "^2.1.2",
|
"axios": "^0.19.2",
|
||||||
"autoprefixer": "7.1.6",
|
|
||||||
"axios": "^0.18.0",
|
|
||||||
"babel-core": "6.26.0",
|
|
||||||
"babel-eslint": "7.2.3",
|
|
||||||
"babel-jest": "20.0.3",
|
|
||||||
"babel-loader": "7.1.2",
|
|
||||||
"babel-plugin-syntax-dynamic-import": "^6.18.0",
|
|
||||||
"babel-preset-react-app": "^3.1.1",
|
|
||||||
"babel-runtime": "6.26.0",
|
|
||||||
"bizcharts": "^3.5.5",
|
"bizcharts": "^3.5.5",
|
||||||
"bundle-loader": "^0.5.6",
|
|
||||||
"case-sensitive-paths-webpack-plugin": "2.1.1",
|
|
||||||
"chalk": "1.1.3",
|
"chalk": "1.1.3",
|
||||||
"classnames": "^2.2.5",
|
"classnames": "^2.2.5",
|
||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.4",
|
||||||
"codemirror": "^5.46.0",
|
"codemirror": "^5.52.2",
|
||||||
"connected-react-router": "4.4.1",
|
"echarts": "^4.7.0",
|
||||||
"css-loader": "0.28.7",
|
|
||||||
"dotenv": "4.0.0",
|
|
||||||
"dotenv-expand": "4.2.0",
|
|
||||||
"echarts": "^4.2.0-rc.2",
|
|
||||||
"editor.md": "^1.5.0",
|
"editor.md": "^1.5.0",
|
||||||
"eslint": "4.10.0",
|
"flvplayer": "^1.1.5",
|
||||||
"eslint-config-react-app": "^2.1.0",
|
"immutability-helper": "^3.0.1",
|
||||||
"eslint-loader": "1.9.0",
|
"js-base64": "^2.5.2",
|
||||||
"eslint-plugin-flowtype": "2.39.1",
|
|
||||||
"eslint-plugin-import": "2.8.0",
|
|
||||||
"eslint-plugin-jsx-a11y": "5.1.1",
|
|
||||||
"eslint-plugin-react": "7.4.0",
|
|
||||||
"extract-text-webpack-plugin": "3.0.2",
|
|
||||||
"file-loader": "1.1.5",
|
|
||||||
"flv.js": "^1.5.0",
|
|
||||||
"fs-extra": "3.0.1",
|
|
||||||
"html-webpack-plugin": "2.29.0",
|
|
||||||
"immutability-helper": "^2.6.6",
|
|
||||||
"install": "^0.12.2",
|
|
||||||
"jest": "20.0.4",
|
|
||||||
"js-base64": "^2.5.1",
|
|
||||||
"katex": "^0.11.1",
|
"katex": "^0.11.1",
|
||||||
"lodash": "^4.17.5",
|
"lodash": "^4.17.5",
|
||||||
"loglevel": "^1.6.1",
|
"loglevel": "^1.6.1",
|
||||||
"material-ui": "^1.0.0-beta.40",
|
|
||||||
"md5": "^2.2.1",
|
"md5": "^2.2.1",
|
||||||
"moment": "^2.23.0",
|
"moment": "^2.23.0",
|
||||||
"monaco-editor": "^0.15.6",
|
"monaco-editor": "^0.20.0",
|
||||||
"monaco-editor-webpack-plugin": "^1.7.0",
|
"monaco-editor-webpack-plugin": "^1.9.0",
|
||||||
"npm": "^6.10.1",
|
|
||||||
"numeral": "^2.0.6",
|
"numeral": "^2.0.6",
|
||||||
"object-assign": "4.1.1",
|
"object-assign": "4.1.1",
|
||||||
"postcss-flexbugs-fixes": "3.2.0",
|
|
||||||
"postcss-loader": "2.0.8",
|
|
||||||
"promise": "8.0.1",
|
"promise": "8.0.1",
|
||||||
"prop-types": "^15.6.1",
|
"prop-types": "^15.6.1",
|
||||||
"qrcode.react": "^1.0.0",
|
"qrcode.react": "^1.0.0",
|
||||||
"qs": "^6.6.0",
|
"qs": "^6.9.2",
|
||||||
"quill": "^1.3.7",
|
"quill": "^1.3.7",
|
||||||
"quill-delta-to-html": "^0.11.0",
|
"quill-delta-to-html": "^0.11.0",
|
||||||
"raf": "3.4.0",
|
"react": "^16.13.1",
|
||||||
"rc-form": "^2.1.7",
|
|
||||||
"rc-pagination": "^1.16.2",
|
|
||||||
"rc-rate": "^2.4.0",
|
|
||||||
"rc-select": "^8.0.12",
|
|
||||||
"rc-tree": "^1.7.11",
|
|
||||||
"rc-upload": "^2.5.1",
|
|
||||||
"react": "^16.9.0",
|
|
||||||
"react-beautiful-dnd": "^10.0.4",
|
"react-beautiful-dnd": "^10.0.4",
|
||||||
"react-codemirror": "^1.0.0",
|
"react-codemirror2": "^6.0.1",
|
||||||
"react-codemirror2": "^6.0.0",
|
|
||||||
"react-content-loader": "^3.1.1",
|
"react-content-loader": "^3.1.1",
|
||||||
|
"react-cookie": "^4.0.3",
|
||||||
"react-cookies": "^0.1.1",
|
"react-cookies": "^0.1.1",
|
||||||
"react-datepicker": "^2.14.0",
|
"react-dom": "^16.13.1",
|
||||||
"react-dev-utils": "^5.0.0",
|
|
||||||
"react-dom": "^16.9.0",
|
|
||||||
"react-hot-loader": "^4.0.0",
|
|
||||||
"react-infinite-scroller": "^1.2.4",
|
"react-infinite-scroller": "^1.2.4",
|
||||||
"react-loadable": "^5.3.1",
|
|
||||||
"react-monaco-editor": "^0.25.1",
|
|
||||||
"react-player": "^1.11.1",
|
"react-player": "^1.11.1",
|
||||||
"react-redux": "5.0.7",
|
"react-redux": "5.0.7",
|
||||||
"react-router": "^4.2.0",
|
"react-router": "^5.1.2",
|
||||||
"react-router-dom": "^4.2.2",
|
"react-router-dom": "^5.1.2",
|
||||||
|
"react-scripts": "3.4.0",
|
||||||
"react-split-pane": "^0.1.89",
|
"react-split-pane": "^0.1.89",
|
||||||
"react-url-query": "^1.4.0",
|
"react-url-query": "^1.4.0",
|
||||||
"react-zmage": "^0.8.5-beta.31",
|
"react-zmage": "^0.8.5-beta.31",
|
||||||
"redux": "^4.0.0",
|
"redux": "^4.0.0",
|
||||||
"redux-thunk": "2.3.0",
|
"redux-thunk": "^2.3.0",
|
||||||
"rsuite": "^4.0.1",
|
"rsuite": "^4.3.2",
|
||||||
"sass-loader": "7.3.1",
|
|
||||||
"scroll-into-view": "^1.12.3",
|
"scroll-into-view": "^1.12.3",
|
||||||
"showdown": "^1.9.1",
|
"showdown": "^1.9.1",
|
||||||
"showdown-katex": "^0.6.0",
|
"showdown-katex": "^0.6.0",
|
||||||
"store": "^2.0.12",
|
"store": "^2.0.12",
|
||||||
"style-loader": "0.19.0",
|
"styled-components": "^5.0.1",
|
||||||
"styled-components": "^4.1.3",
|
|
||||||
"sw-precache-webpack-plugin": "0.11.4",
|
|
||||||
"url-loader": "0.6.2",
|
|
||||||
"webpack": "3.8.1",
|
|
||||||
"webpack-dev-server": "2.9.4",
|
|
||||||
"webpack-manifest-plugin": "1.3.2",
|
|
||||||
"webpack-parallel-uglify-plugin": "^1.1.0",
|
|
||||||
"whatwg-fetch": "2.0.3",
|
"whatwg-fetch": "2.0.3",
|
||||||
"wrap-md-editor": "^0.2.20"
|
"wrap-md-editor": "^0.2.20"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node --max_old_space_size=15360 scripts/start.js",
|
"start": "PORT=3007 react-app-rewired start",
|
||||||
"build": "node --max_old_space_size=15360 scripts/build.js",
|
"build": "react-app-rewired --max_old_space_size=8192 build ",
|
||||||
"concat": "node scripts/concat.js",
|
"test": "react-scripts test",
|
||||||
"gen_stats": "NODE_ENV=production webpack --profile --config=./config/webpack.config.prod.js --json > stats.json",
|
"eject": "react-scripts eject"
|
||||||
"ana": "webpack-bundle-analyzer ./stats.json",
|
|
||||||
"analyze": "npm run build -- --stats && webpack-bundle-analyzer build/bundle-stats.json",
|
|
||||||
"analyz": "NODE_ENV=production npm_config_report=true npm run build"
|
|
||||||
},
|
},
|
||||||
"jest": {
|
"eslintConfig": {
|
||||||
"collectCoverageFrom": [
|
"extends": "react-app"
|
||||||
"src/**/*.{js,jsx,mjs}"
|
|
||||||
],
|
|
||||||
"setupFiles": [
|
|
||||||
"<rootDir>/config/polyfills.js"
|
|
||||||
],
|
|
||||||
"testMatch": [
|
|
||||||
"<rootDir>/src/**/__tests__/**/*.{js,jsx,mjs}",
|
|
||||||
"<rootDir>/src/**/?(*.)(spec|test).{js,jsx,mjs}"
|
|
||||||
],
|
|
||||||
"testEnvironment": "node",
|
|
||||||
"testURL": "http://localhost",
|
|
||||||
"transform": {
|
|
||||||
"^.+\\.(js|jsx|mjs)$": "<rootDir>/node_modules/babel-jest",
|
|
||||||
"^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",
|
|
||||||
"^(?!.*\\.(js|jsx|mjs|css|json)$)": "<rootDir>/config/jest/fileTransform.js"
|
|
||||||
},
|
|
||||||
"transformIgnorePatterns": [
|
|
||||||
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs)$"
|
|
||||||
],
|
|
||||||
"moduleNameMapper": {
|
|
||||||
"^react-native$": "react-native-web"
|
|
||||||
},
|
|
||||||
"moduleFileExtensions": [
|
|
||||||
"web.js",
|
|
||||||
"mjs",
|
|
||||||
"js",
|
|
||||||
"json",
|
|
||||||
"web.jsx",
|
|
||||||
"jsx",
|
|
||||||
"node"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"babel": {
|
|
||||||
"presets": [
|
|
||||||
"react",
|
|
||||||
"react-app"
|
|
||||||
],
|
|
||||||
"plugins": [
|
|
||||||
[
|
|
||||||
"import",
|
|
||||||
{
|
|
||||||
"libraryName": "antd",
|
|
||||||
"libraryDirectory": "lib",
|
|
||||||
"style": "css"
|
|
||||||
},
|
},
|
||||||
"ant"
|
"browserslist": {
|
||||||
|
"production": [
|
||||||
|
">0.2%",
|
||||||
|
"not dead",
|
||||||
|
"not op_mini all"
|
||||||
],
|
],
|
||||||
"syntax-dynamic-import"
|
"development": [
|
||||||
|
"last 1 chrome version",
|
||||||
|
"last 1 firefox version",
|
||||||
|
"last 1 safari version"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
|
||||||
"extends": "react-app"
|
|
||||||
},
|
|
||||||
"proxy": "http://localhost:3000",
|
|
||||||
"port": "3007",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/runtime": "7.0.0-beta.51",
|
"babel-plugin-import": "^1.13.0",
|
||||||
"babel-plugin-import": "^1.11.0",
|
"customize-cra": "^0.5.0",
|
||||||
"compression-webpack-plugin": "^1.1.12",
|
"hard-source-webpack-plugin": "^0.13.1",
|
||||||
"concat": "^1.0.3",
|
"less": "^3.11.1",
|
||||||
"happypack": "^5.0.1",
|
"less-loader": "^5.0.0",
|
||||||
"mockjs": "^1.1.0",
|
"react-app-rewired": "^2.1.5",
|
||||||
"node-sass": "^4.12.0",
|
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||||
"reqwest": "^2.0.5",
|
"webpack-bundle-analyzer": "^3.6.0"
|
||||||
"webpack-bundle-analyzer": "^3.0.3",
|
|
||||||
"webpack-parallel-uglify-plugin": "^1.1.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 410 KiB After Width: | Height: | Size: 412 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,98 +0,0 @@
|
|||||||
var fs = require('fs');
|
|
||||||
var uglify = require("uglify-js");
|
|
||||||
var path = require('path');
|
|
||||||
var concat = require('concat')
|
|
||||||
|
|
||||||
var results = [];
|
|
||||||
var walk = function(dir, done) {
|
|
||||||
|
|
||||||
fs.readdir(dir, function(err, list) {
|
|
||||||
console.log(list)
|
|
||||||
if (err) return done(err);
|
|
||||||
var pending = list.length;
|
|
||||||
if (!pending) return done(null, results);
|
|
||||||
list.forEach(function(file) {
|
|
||||||
file = path.resolve(dir, file);
|
|
||||||
fs.stat(file, function(err, stat) {
|
|
||||||
if (stat && stat.isDirectory()) {
|
|
||||||
walk(file, function(err, res) {
|
|
||||||
// results = results.concat(res);
|
|
||||||
if (!--pending) done(null, results);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
results.push(file);
|
|
||||||
if (!--pending) done(null, results);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// 需要输出文件名数组时改为true
|
|
||||||
var jsDir = './public/js/';
|
|
||||||
var cssDir = './public/css'
|
|
||||||
|
|
||||||
// true &&
|
|
||||||
false &&
|
|
||||||
walk(cssDir, function() {
|
|
||||||
console.log('results', results.length, results)
|
|
||||||
})
|
|
||||||
// return;
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- CSS
|
|
||||||
var cssResults = [
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\css\\edu-common.css',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\css\\edu-public.css',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\css\\taskstyle.css' ,
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\css\\font-awesome.css',
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\css\\editormd.min.css',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\css\\merge.css',
|
|
||||||
|
|
||||||
]
|
|
||||||
concat(cssResults, './public/css/css_min_all.css')
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------- JS
|
|
||||||
var _results = [
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\jquery-1.8.3.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\underscore.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\marked.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\prettify.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\raphael.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\sequence-diagram.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\flowchart.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\jquery.flowchart.min.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\editormd\\editormd.min.js',
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\codemirror\\codemirror.js',
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\codemirror\\mode\\javascript.js',
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\diff_match_patch.js',
|
|
||||||
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\merge.js',
|
|
||||||
|
|
||||||
'D:\\Code\\trustieplus\\public\\react\\public\\js\\edu_tpi.js',
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
concat(_results, './public/js/js_min_all.js')
|
|
||||||
|
|
||||||
// var uglified = uglify.minify(['./public/js/merge.js']);
|
|
||||||
// console.log('uglified', uglified)
|
|
||||||
// fs.writeFile('concat.min.js', uglified.code, function (err){
|
|
||||||
// if(err) {
|
|
||||||
// console.log(err);
|
|
||||||
// } else {
|
|
||||||
// console.log("Script generated and saved:", 'concat.min.js');
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
|
|
||||||
// var uglified = uglify.minify(['file1.js', 'file2.js', 'file3.js']);
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
var fs2 = require('fs');
|
|
||||||
|
|
||||||
function generateNewIndexJsp() {
|
|
||||||
|
|
||||||
var filePath = './build/index.html';
|
|
||||||
|
|
||||||
var outputPath = filePath
|
|
||||||
fs2.readFile(filePath, 'utf8', function (err,data) {
|
|
||||||
if (err) {
|
|
||||||
return console.log(err);
|
|
||||||
}
|
|
||||||
var result = data
|
|
||||||
.replace('/js/create_kindeditor.js', '/react/build/js/create_kindeditor.js')
|
|
||||||
.replace(/https:\/\/testeduplus2.educoder.net/g, '');
|
|
||||||
// .replace(/http:\/\/testbdweb.educoder.net/g, '');
|
|
||||||
|
|
||||||
.replace('/css/css_min_all.css', '/react/build/css/css_min_all.css');
|
|
||||||
|
|
||||||
fs2.writeFile(outputPath, result, 'utf8', function (err) {
|
|
||||||
if (err) return console.log(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
@ -1,114 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
// Do this as the first thing so that any code reading it knows the right env.
|
|
||||||
process.env.BABEL_ENV = 'development';
|
|
||||||
process.env.NODE_ENV = 'development';
|
|
||||||
|
|
||||||
|
|
||||||
// Makes the script crash on unhandled rejections instead of silently
|
|
||||||
// ignoring them. In the future, promise rejections that are not handled will
|
|
||||||
// terminate the Node.js process with a non-zero exit code.
|
|
||||||
process.on('unhandledRejection', err => {
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Ensure environment variables are read.
|
|
||||||
require('../config/env');
|
|
||||||
|
|
||||||
const fs = require('fs');
|
|
||||||
const chalk = require('chalk');
|
|
||||||
const webpack = require('webpack');
|
|
||||||
const WebpackDevServer = require('webpack-dev-server');
|
|
||||||
const clearConsole = require('react-dev-utils/clearConsole');
|
|
||||||
const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles');
|
|
||||||
const {
|
|
||||||
choosePort,
|
|
||||||
createCompiler,
|
|
||||||
prepareProxy,
|
|
||||||
prepareUrls,
|
|
||||||
} = require('react-dev-utils/WebpackDevServerUtils');
|
|
||||||
const openBrowser = require('react-dev-utils/openBrowser');
|
|
||||||
const paths = require('../config/paths');
|
|
||||||
const config = require('../config/webpack.config.dev');
|
|
||||||
const createDevServerConfig = require('../config/webpackDevServer.config');
|
|
||||||
|
|
||||||
const useYarn = fs.existsSync(paths.yarnLockFile);
|
|
||||||
const isInteractive = process.stdout.isTTY;
|
|
||||||
|
|
||||||
const portSetting = require(paths.appPackageJson).port
|
|
||||||
if ( portSetting ) {
|
|
||||||
process.env.port = portSetting
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn and crash if required files are missing
|
|
||||||
if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) {
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tools like Cloud9 rely on this.
|
|
||||||
const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3007;
|
|
||||||
const HOST = process.env.HOST || '0.0.0.0';
|
|
||||||
|
|
||||||
if (process.env.HOST) {
|
|
||||||
console.log(
|
|
||||||
chalk.cyan(
|
|
||||||
`Attempting to bind to HOST environment variable: ${chalk.yellow(
|
|
||||||
chalk.bold(process.env.HOST)
|
|
||||||
)}`
|
|
||||||
)
|
|
||||||
);
|
|
||||||
console.log(
|
|
||||||
`If this was unintentional, check that you haven't mistakenly set it in your shell.`
|
|
||||||
);
|
|
||||||
console.log(`Learn more here: ${chalk.yellow('http://bit.ly/2mwWSwH')}`);
|
|
||||||
console.log();
|
|
||||||
}
|
|
||||||
|
|
||||||
// We attempt to use the default port but if it is busy, we offer the user to
|
|
||||||
// run on a different port. `choosePort()` Promise resolves to the next free port.
|
|
||||||
choosePort(HOST, DEFAULT_PORT)
|
|
||||||
.then(port => {
|
|
||||||
if (port == null) {
|
|
||||||
// We have not found a port.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
|
|
||||||
const appName = require(paths.appPackageJson).name;
|
|
||||||
const urls = prepareUrls(protocol, HOST, port);
|
|
||||||
// Create a webpack compiler that is configured with custom messages.
|
|
||||||
const compiler = createCompiler(webpack, config, appName, urls, useYarn);
|
|
||||||
// Load proxy config
|
|
||||||
const proxySetting = require(paths.appPackageJson).proxy;
|
|
||||||
console.log('-------------------------proxySetting:', proxySetting)
|
|
||||||
const proxyConfig = prepareProxy(proxySetting, paths.appPublic);
|
|
||||||
// Serve webpack assets generated by the compiler over a web sever.
|
|
||||||
const serverConfig = createDevServerConfig(
|
|
||||||
proxyConfig,
|
|
||||||
urls.lanUrlForConfig
|
|
||||||
);
|
|
||||||
const devServer = new WebpackDevServer(compiler, serverConfig);
|
|
||||||
// Launch WebpackDevServer.
|
|
||||||
devServer.listen(port, HOST, err => {
|
|
||||||
if (err) {
|
|
||||||
return console.log(err);
|
|
||||||
}
|
|
||||||
if (isInteractive) {
|
|
||||||
clearConsole();
|
|
||||||
}
|
|
||||||
console.log(chalk.cyan('Starting the development server...\n'));
|
|
||||||
openBrowser(urls.localUrlForBrowser);
|
|
||||||
});
|
|
||||||
|
|
||||||
['SIGINT', 'SIGTERM'].forEach(function(sig) {
|
|
||||||
process.on(sig, function() {
|
|
||||||
devServer.close();
|
|
||||||
process.exit();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
if (err && err.message) {
|
|
||||||
console.log(err.message);
|
|
||||||
}
|
|
||||||
process.exit(1);
|
|
||||||
});
|
|
@ -1,27 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
// Do this as the first thing so that any code reading it knows the right env.
|
|
||||||
process.env.BABEL_ENV = 'test';
|
|
||||||
process.env.NODE_ENV = 'test';
|
|
||||||
process.env.PUBLIC_URL = '';
|
|
||||||
|
|
||||||
// Makes the script crash on unhandled rejections instead of silently
|
|
||||||
// ignoring them. In the future, promise rejections that are not handled will
|
|
||||||
// terminate the Node.js process with a non-zero exit code.
|
|
||||||
process.on('unhandledRejection', err => {
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Ensure environment variables are read.
|
|
||||||
require('../config/env');
|
|
||||||
|
|
||||||
const jest = require('jest');
|
|
||||||
const argv = process.argv.slice(2);
|
|
||||||
|
|
||||||
// Watch unless on CI or in coverage mode
|
|
||||||
if (!process.env.CI && argv.indexOf('--coverage') < 0) {
|
|
||||||
argv.push('--watch');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
jest.run(argv);
|
|
@ -1,9 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import ReactDOM from 'react-dom';
|
|
||||||
import App from './App';
|
|
||||||
|
|
||||||
it('renders without crashing', () => {
|
|
||||||
const div = document.createElement('div');
|
|
||||||
ReactDOM.render(<App />, div);
|
|
||||||
ReactDOM.unmountComponentAtNode(div);
|
|
||||||
});
|
|
@ -1,12 +0,0 @@
|
|||||||
import Loadable from 'react-loadable';
|
|
||||||
|
|
||||||
import Loading from "./Loading";
|
|
||||||
|
|
||||||
const CustomLoadable = (loader, loading = Loading) => {
|
|
||||||
return Loadable({
|
|
||||||
loader,
|
|
||||||
loading
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export default CustomLoadable
|
|
@ -1,5 +1,5 @@
|
|||||||
import md5 from 'md5';
|
import md5 from 'md5';
|
||||||
export function setmiyah(logins){
|
export default function setmiyah(logins) {
|
||||||
const opens ="79e33abd4b6588941ab7622aed1e67e8";
|
const opens = "79e33abd4b6588941ab7622aed1e67e8";
|
||||||
return md5(opens+logins);
|
return md5(opens + logins);
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,28 @@
|
|||||||
|
import test from 'ava';
|
||||||
|
import asciimathToTex from './asciimath-to-tex';
|
||||||
|
|
||||||
|
test('just a number', t => {
|
||||||
|
t.is(asciimathToTex('5'), '{5}');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('x=5', t => {
|
||||||
|
t.is(asciimathToTex('x=5'), '{x}={5}');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('x=5+2', t => {
|
||||||
|
t.is(asciimathToTex('x=5+2'), '{x}={5}+{2}');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('x = (-b+-sqrt(b^2-4ac))/(2a)', t => {
|
||||||
|
t.is(
|
||||||
|
asciimathToTex('x = (-b+-sqrt(b^2-4ac))/(2a)'),
|
||||||
|
'{x}=\\frac{{-{b}\\pm\\sqrt{{{b}^{{2}}-{4}{a}{c}}}}}{{{2}{a}}}',
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('{x}=(-b+-sqrt(b^2-4ac))/(2a)', t => {
|
||||||
|
t.is(
|
||||||
|
asciimathToTex('{x}=(-b+-sqrt(b^2-4ac))/(2a)'),
|
||||||
|
'{\\left\\lbrace{x}\\right\\rbrace}=\\frac{{-{b}\\pm\\sqrt{{{b}^{{2}}-{4}{a}{c}}}}}{{{2}{a}}}',
|
||||||
|
);
|
||||||
|
});
|
@ -0,0 +1,121 @@
|
|||||||
|
import katex from 'katex';
|
||||||
|
import renderMathInElement from 'katex/dist/contrib/auto-render';
|
||||||
|
import showdown from 'showdown';
|
||||||
|
import asciimathToTex from './asciimath-to-tex';
|
||||||
|
|
||||||
|
if (process.env.TARGET === 'cjs') {
|
||||||
|
const { JSDOM } = require('jsdom');
|
||||||
|
const jsdom = new JSDOM();
|
||||||
|
global.DOMParser = jsdom.window.DOMParser;
|
||||||
|
global.document = jsdom.window.document;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {object} opts
|
||||||
|
* @param {NodeListOf<Element>} opts.elements
|
||||||
|
* @param opts.config
|
||||||
|
* @param {boolean} opts.isAsciimath
|
||||||
|
*/
|
||||||
|
function renderBlockElements({ elements, config, isAsciimath }) {
|
||||||
|
if (!elements.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.forEach(element => {
|
||||||
|
const input = element.textContent || element.innerText;
|
||||||
|
const latex = isAsciimath ? asciimathToTex(input) : input;
|
||||||
|
const html = katex.renderToString(latex, config);
|
||||||
|
element.parentNode.outerHTML = `<span title="${input.trim()}">${html}</span>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
|
||||||
|
* @param {string} str
|
||||||
|
* @returns {string} regexp escaped string
|
||||||
|
*/
|
||||||
|
function escapeRegExp(str) {
|
||||||
|
return str.replace(/[-[\]/{}()*+?.\\$^|]/g, '\\$&');
|
||||||
|
}
|
||||||
|
|
||||||
|
// katex config
|
||||||
|
const getConfig = (config = {}) => ({
|
||||||
|
displayMode: true,
|
||||||
|
throwOnError: false, // fail silently
|
||||||
|
errorColor: '#ff0000',
|
||||||
|
...config,
|
||||||
|
delimiters: [
|
||||||
|
{ left: '$$', right: '$$', display: false, asciimath: false },
|
||||||
|
{ left: '~', right: '~', display: false, asciimath: true },
|
||||||
|
].concat(config.delimiters || []),
|
||||||
|
});
|
||||||
|
|
||||||
|
const showdownKatex = userConfig => () => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const config = getConfig(userConfig);
|
||||||
|
const asciimathDelimiters = config.delimiters
|
||||||
|
.filter(item => item.asciimath)
|
||||||
|
.map(({ left, right }) => {
|
||||||
|
const l = escapeRegExp(left)
|
||||||
|
const r = escapeRegExp(right)
|
||||||
|
const test = new RegExp(
|
||||||
|
`(?:${l})([^${l}${r}]+)(?:${r})`,
|
||||||
|
'g',
|
||||||
|
);
|
||||||
|
const replacer = (match, asciimath) => {
|
||||||
|
return `${left}${asciimathToTex(asciimath)}${right}`;
|
||||||
|
};
|
||||||
|
return { test, replacer };
|
||||||
|
});
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
type: 'output',
|
||||||
|
filter(html = '') {
|
||||||
|
const wrapper = parser.parseFromString(html, 'text/html').body;
|
||||||
|
if (asciimathDelimiters.length) {
|
||||||
|
wrapper.querySelectorAll(':not(code):not(pre)').forEach(el => {
|
||||||
|
const textNodes = [...el.childNodes].filter(
|
||||||
|
node => {
|
||||||
|
if (node.nodeName === '#text') {
|
||||||
|
return node.nodeValue.trim()
|
||||||
|
}
|
||||||
|
if (node.nodeName === 'CODE') {
|
||||||
|
return node.innerText.trim()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
textNodes.forEach(node => {
|
||||||
|
const newText = asciimathDelimiters.reduce(
|
||||||
|
(acc, { test, replacer }) => acc.replace(test, replacer),
|
||||||
|
node.nodeValue || node.innerText
|
||||||
|
)
|
||||||
|
if (node.nodeName === '#text') {
|
||||||
|
node.nodeValue = newText
|
||||||
|
} else {
|
||||||
|
node.innerText = newText;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// find the math in code blocks
|
||||||
|
const latex = wrapper.querySelectorAll('code.latex.language-latex');
|
||||||
|
const asciimath = wrapper.querySelectorAll(
|
||||||
|
'code.asciimath.language-asciimath',
|
||||||
|
);
|
||||||
|
|
||||||
|
renderBlockElements({ elements: latex, config });
|
||||||
|
renderBlockElements({ elements: asciimath, config, isAsciimath: true });
|
||||||
|
renderMathInElement(wrapper, config);
|
||||||
|
|
||||||
|
return wrapper.innerHTML;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
// register extension with default config
|
||||||
|
showdown.extension('showdown-katex', showdownKatex());
|
||||||
|
|
||||||
|
export default showdownKatex;
|
@ -0,0 +1,21 @@
|
|||||||
|
import test from 'ava';
|
||||||
|
import showdown from 'showdown';
|
||||||
|
import katex from '../lib/showdown-katex';
|
||||||
|
|
||||||
|
const input = '# hello, markdown!';
|
||||||
|
const output = '<h1 id="hellomarkdown">hello, markdown!</h1>';
|
||||||
|
|
||||||
|
test('string extension', t => {
|
||||||
|
const converter = new showdown.Converter({
|
||||||
|
extensions: ['showdown-katex'],
|
||||||
|
});
|
||||||
|
t.is(converter.makeHtml(input), output);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('function extension', t => {
|
||||||
|
const converter = new showdown.Converter({
|
||||||
|
extensions: [katex()],
|
||||||
|
});
|
||||||
|
|
||||||
|
t.is(converter.makeHtml(input), output);
|
||||||
|
});
|
@ -0,0 +1,13 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import './index.less'
|
||||||
|
|
||||||
|
export default ({ children, style = {} }) => {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="dialog-container-wrapper">
|
||||||
|
<div className="dialog-body" style={style}>
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
.dialog-container-wrapper {
|
||||||
|
display: flex;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 300;
|
||||||
|
background: rgba(0, 0, 0, .7);
|
||||||
|
|
||||||
|
flex-flow: column nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-body {
|
||||||
|
width: 405px;
|
||||||
|
height: auto;
|
||||||
|
background: #fff;
|
||||||
|
position: relative;
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
import React from 'react'
|
||||||
|
export default class ErrorBoundary extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
this.state = { hasError: false }
|
||||||
|
}
|
||||||
|
|
||||||
|
static getDerivedStateFromError(error) {
|
||||||
|
// Update state so the next render will show the fallback UI.
|
||||||
|
return { hasError: true }
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidCatch(error, errorInfo) {
|
||||||
|
// You can also log the error to an error reporting service
|
||||||
|
console.log(error, errorInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if (this.state.hasError) {
|
||||||
|
// You can render any custom fallback UI
|
||||||
|
return <h1>Something went wrong.</h1>
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.props.children
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import './loading.less'
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
return <div className="loading-tip">
|
||||||
|
<p>
|
||||||
|
loading ...
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
.loading-tip {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
|
background: #213857;
|
||||||
|
color: #fff;
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
.mini-pagination {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
padding: 0 10px 0 22px;
|
||||||
|
border-width: 1px;
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-right: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 30px;
|
||||||
|
cursor: pointer;
|
||||||
|
border-style: solid;
|
||||||
|
outline: none;
|
||||||
|
border-color: #c4c6cf;
|
||||||
|
background: #fff;
|
||||||
|
color: #333;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #f2f3f7;
|
||||||
|
border-color: #a0a2ad;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
position: absolute;
|
||||||
|
content: ' ';
|
||||||
|
width: 8px;
|
||||||
|
top: 10px;
|
||||||
|
left: 10px;
|
||||||
|
height: 8px;
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
border-top: 1px solid #333;
|
||||||
|
border-left: 1px solid #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
padding: 0 22px 0 10px;
|
||||||
|
margin: 0 0 0 4px;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
left: auto;
|
||||||
|
right: 10px;
|
||||||
|
transform: rotate(135deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
background-color: #f7f8fa;
|
||||||
|
border-color: #e6e7eb;
|
||||||
|
color: #e0e0e0;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
border-top: 1px solid #e0e0e0;
|
||||||
|
border-left: 1px solid #e0e0e0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { createPortal } from 'react-dom'
|
||||||
|
|
||||||
|
export default class Dialog extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
|
||||||
|
const doc = window.document
|
||||||
|
this.node = doc.createElement('div')
|
||||||
|
doc.body.appendChild(this.node)
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { children } = this.props
|
||||||
|
return createPortal(children, this.node)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
window.document.body.removeChild(this.node);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
.nodata-panel-wrapper {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column nowrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.nodata-panel {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto 20px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
.tag-green {
|
||||||
|
position: absolute;
|
||||||
|
left: 10px;
|
||||||
|
bottom: 125px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-org {
|
||||||
|
position: absolute;
|
||||||
|
left: 0px;
|
||||||
|
top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-org-name {
|
||||||
|
width: 66px;
|
||||||
|
height: 28px;
|
||||||
|
background: #FF6802;
|
||||||
|
width: 66px;
|
||||||
|
height: 28px;
|
||||||
|
border-radius: 0px 20px 20px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag-org-name-test {
|
||||||
|
width: 45px;
|
||||||
|
height: 23px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #FFFFFF;
|
||||||
|
line-height: 19px;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intermediatecenter {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
import React, { Fragment } from 'react';
|
||||||
|
import TPMMDEditor from '../modules/tpm/challengesnew/TPMMDEditor';
|
||||||
|
|
||||||
|
export default () => {
|
||||||
|
return (
|
||||||
|
<Fragment >
|
||||||
|
<TPMMDEditor />
|
||||||
|
</Fragment>
|
||||||
|
)
|
||||||
|
}
|
@ -1,46 +1,13 @@
|
|||||||
import React from 'react';
|
import React from 'react'
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom'
|
||||||
|
import './index.css'
|
||||||
import './index.css';
|
import App from './App'
|
||||||
import './indexPlus.css';
|
import * as serviceWorker from './serviceWorker'
|
||||||
import App from './App';
|
|
||||||
|
|
||||||
// 加之前main.js 18.1MB
|
|
||||||
// import { message } from 'antd';
|
|
||||||
import message from 'antd/lib/message';
|
|
||||||
import 'antd/lib/message/style/css';
|
|
||||||
|
|
||||||
import { AppContainer } from 'react-hot-loader';
|
|
||||||
|
|
||||||
import registerServiceWorker from './registerServiceWorker';
|
|
||||||
|
|
||||||
import { configureUrlQuery } from 'react-url-query';
|
|
||||||
|
|
||||||
import history from './history';
|
|
||||||
|
|
||||||
// link the history used in our app to url-query so it can update the URL with it.
|
|
||||||
configureUrlQuery({ history });
|
|
||||||
// ----------------------------------------------------------------------------------- 请求配置
|
|
||||||
|
|
||||||
window.__useKindEditor = false;
|
window.__useKindEditor = false;
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'))
|
||||||
|
|
||||||
|
// If you want your app to work offline and load faster, you can change
|
||||||
const render = (Component) => {
|
// unregister() to register() below. Note this comes with some pitfalls.
|
||||||
ReactDOM.render(
|
// Learn more about service workers: https://bit.ly/CRA-PWA
|
||||||
<AppContainer {...this.props} {...this.state}>
|
serviceWorker.unregister()
|
||||||
<Component {...this.props} {...this.state}/>
|
|
||||||
</AppContainer>,
|
|
||||||
document.getElementById('root')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ReactDOM.render(
|
|
||||||
// ,
|
|
||||||
// document.getElementById('root'));
|
|
||||||
// registerServiceWorker();
|
|
||||||
|
|
||||||
render(App);
|
|
||||||
if (module.hot) {
|
|
||||||
module.hot.accept('./App', () => { render(App) });
|
|
||||||
}
|
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
/* material ui 给body加了个6px padding */
|
|
||||||
body {
|
|
||||||
padding-right: 0px !important;
|
|
||||||
}
|
|
After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
@ -1,72 +0,0 @@
|
|||||||
import React, { Component } from 'react';
|
|
||||||
import { Redirect } from 'react-router';
|
|
||||||
|
|
||||||
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
|
|
||||||
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
|
|
||||||
import classNames from 'classnames'
|
|
||||||
|
|
||||||
const $ = window.$;
|
|
||||||
const _origin = window.location.origin;
|
|
||||||
|
|
||||||
class CommentItemKEEditor extends Component {
|
|
||||||
|
|
||||||
componentDidUpdate(prevProps) {
|
|
||||||
const { item, currentReplyComment } = this.props;
|
|
||||||
if ( prevProps.showReplyEditorFlag != this.props.showReplyEditorFlag &&
|
|
||||||
currentReplyComment && currentReplyComment.id == item.id ) {
|
|
||||||
this.showOrHideEditor(currentReplyComment)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 如果未初始化,会先初始化
|
|
||||||
showOrHideEditor = (comment) => {
|
|
||||||
const { user } = this.props;
|
|
||||||
console.log('initReply ', comment)
|
|
||||||
|
|
||||||
const $ = window.$;
|
|
||||||
var id = comment.id
|
|
||||||
var reply_message_el = `#reply_message_${id}`
|
|
||||||
var reply_iconup_el = `#reply_iconup_${id}`
|
|
||||||
if($(reply_message_el).html() == "") {
|
|
||||||
$(".reply_to_message").html("");
|
|
||||||
$(reply_message_el).html(`<div className=\"orig_reply_box borderBottomNone reply_to_message\" id=\"reply_to_message_${id}\">\n <div class=\"homepagePostReplyPortrait mr15 imageFuzzy fl\" id=\"reply_image_${id}\"><a href=\"${user.user_url}\" target=\"_blank\" alt=\"用户头像\"><img alt=\"0?1442652658\" height=\"33\" src=\"${_origin}/images/${user.image_url}\" width=\"33\" /><\/a><\/div>\n <div class=\"orig_textarea fl\" style=\"margin-bottom: 0px\">\n <div nhname=\'new_message_${id}\'>\n <form accept-charset=\"UTF-8\" action=\"/discusses?challenge_id=118&dis_id=61&dis_type=Shixun\" data-remote=\"true\" id=\"new_comment_form\" method=\"post\"><div style=\"margin:0;padding:0;display:inline\"><input name=\"utf8\" type=\"hidden\" value=\"✓\" /><input name=\"authenticity_token\" type=\"hidden\" value=\"HJTbMpfI8LKUpwghfkvgB2SaMmcIVyVdAezyKmzJ7FU=\" /><\/div>\n <input type=\"hidden\" id=\"dis_reply_id\" name=\"reply_id\" value=\"${id}\">\n <div nhname=\'toolbar_container_${id}\'><\/div>\n <textarea placeholder=\"有问题或有建议,请直接给我留言吧!\" id=\"comment_news_${id}\" style=\"display: none\" nhname=\'new_message_textarea_${id}\' name=\"content\"><\/textarea>\n <a id=\"new_message_submit_btn_${id}\" href=\"javascript:void(0)\" onclick=\"this.style.display=\'none\'\" class=\"mt10 task-btn task-btn-orange fr\">发送<\/a>\n <div class=\"cl\"><\/div>\n <p nhname=\'contentmsg_${id}\'><\/p>\n<\/form> <\/div>\n <div class=\"cl\"><\/div>\n <\/div>\n <div class=\"cl\"><\/div>\n<\/div>\n`); //" ide语法识别
|
|
||||||
$(reply_iconup_el).show();
|
|
||||||
$(function(){
|
|
||||||
window.sd_create_editor_from_data(id ,null,"100%", "Discuss");
|
|
||||||
});
|
|
||||||
|
|
||||||
}else {
|
|
||||||
if ($(reply_message_el).is(':visible')) {
|
|
||||||
$(reply_message_el).hide();
|
|
||||||
} else {
|
|
||||||
$(reply_message_el).show();
|
|
||||||
}
|
|
||||||
// $(reply_message_el).html("");
|
|
||||||
|
|
||||||
// $(reply_iconup_el).hide();
|
|
||||||
}
|
|
||||||
// 自动focus
|
|
||||||
setTimeout(()=>{
|
|
||||||
var iframe =$(`#reply_to_message_${id}`).find('iframe')[0]
|
|
||||||
iframe && iframe.contentDocument.body.focus()
|
|
||||||
}, 200)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { match, history, item, user } = this.props
|
|
||||||
if (!item) {
|
|
||||||
return <div></div>
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<div className="cl"></div>
|
|
||||||
<div id={`reply_message_${item.id}`} className="reply_to_message"></div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default ( CommentItemKEEditor );
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue