diff --git a/.prettierrc b/.prettierrc index e69de29..764fbde 100644 --- a/.prettierrc +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "printWidth": 120, + "overrides": [ + { + "files": ".prettierrc", + "options": { "parser": "json" } + } + ] +} diff --git a/core/README-zh.md b/core/README-zh.md new file mode 100644 index 0000000..93115d5 --- /dev/null +++ b/core/README-zh.md @@ -0,0 +1,101 @@ +Layout 布局 +=== + +协助进行页面级整体布局。 + +> ⚠️ 注意:采用 flex 布局实现,请注意[浏览器兼容性](http://caniuse.com/#search=flex)问题。 + + + +```jsx +import { Layout } from 'uiw'; +// or +import Layout from '@uiw/react-layout'; +const { Header, Footer, Sider, Content } = Layout; +``` + +## 基本用法 + + +```jsx +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Layout } from '@uiw/react-layout'; +const { Header, Footer, Sider, Content } = Layout; + +const stylHeader = { color: '#fff' } +const stylSider = { background: '#484a4e', color: '#fff', lineHeight: `120px`, textAlign: 'center' } +const stylConten = { textAlign: 'center', background: 'rgba(16, 142, 233, 1)', minHeight: 120, lineHeight: '120px', color: '#fff' } + +function Demo() { + const [collapsed, setCollapsed] = React.useState(false) + return ( +
+ + Sider + +
+ +
+ Content +
Footer
+
+
+ + +
Header
+ Content +
Footer
+
+ + +
Header
+ + Sider + Content + +
Footer
+
+ + +
Header
+ + Content + Sider + + +
+
+ ); +} + +ReactDOM.render(, _mount_); +``` + + +## Layout + +布局容器,其下可嵌套 `Header` `Sider` `Content` `Footer` 或 `Layout` 本身,可以放在任何父容器中。 + +* `Header`:顶部布局,自带默认样式,其下可嵌套任何元素,只能放在 `Layout` 中。 +* `Sider`:侧边栏,自带默认样式及基本功能,其下可嵌套任何元素,只能放在 `Layout` 中。 +* `Content`:内容部分,自带默认样式,其下可嵌套任何元素,只能放在 `Layout` 中。 +* `Footer`:底部布局,自带默认样式,其下可嵌套任何元素,只能放在 `Layout` 中。 + +| 参数 | 说明 | 类型 | 默认值 | +|--------- |-------- |--------- |-------- | +| className | 容器 className | string | - | +| style | 指定样式 | CSSProperties | - | +| theme | 主题颜色 | `light`、`dark` | `dark` | +| hasSider | 表示子元素里有 Sider,一般不用指定。可用于服务端渲染时避免样式闪动 | boolean | - | + +## Layout.Sider + +| 参数 | 说明 | 类型 | 默认值 | +|--------- |-------- |--------- |-------- | +| className | 容器 className | string | - | +| style | 指定样式 | CSSProperties | - | +| collapsed | 当前收起状态 | boolean | - | +| collapsedWidth | 收缩宽度,设置为 `0` | boolean | `80` | +| width | 宽度 | number/string | 200 | + diff --git a/core/README.md b/core/README.md index 885064b..fb33590 100644 --- a/core/README.md +++ b/core/README.md @@ -1,66 +1,100 @@ -react-monorepo-template +Layout === -Simple [React](https://github.com/facebook/react) package development project example template. - -## Directory Structure - -```bash -├── LICENSE -├── README.md -> core/README.md -├── core # 📦 package @uiw/react-monorepo-template -│ ├── README.md -│ ├── cjs # 🔄 Compiled cjs directory -│ ├── esm # 🔄 Compiled esm directory -│ ├── src # Package source directory -│ ├── dist.css # 🔄 compile less to css -│ ├── package.json # name => @uiw/react-monorepo-template -│ └── tsconfig.json -├── lerna.json -├── package.json -├── tsconfig.json -├── test # ⛑ test case -└── website # 🐝 Package example test, website - ├── README.md - ├── package.json - ├── public - ├── src - └── tsconfig.json -``` - -## Development +Handling the overall layout of a page. -1. Install +> ⚠️ Note: Implemented with flex layout, please pay attention to [browser compatibility](http://caniuse.com/#search=flex) issues. + -```bash -npm install + +```jsx +import { Layout } from 'uiw'; +// or +import Layout from '@uiw/react-layout'; +const { Header, Footer, Sider, Content } = Layout; ``` -2. Dependencies in the installation package and example - -```bash -npm run hoist +## Basic Usage + + +```jsx +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Layout } from '@uiw/react-layout'; +const { Header, Footer, Sider, Content } = Layout; + +const stylHeader = { color: '#fff' } +const stylSider = { background: '#484a4e', color: '#fff', lineHeight: `120px`, textAlign: 'center' } +const stylConten = { textAlign: 'center', background: 'rgba(16, 142, 233, 1)', minHeight: 120, lineHeight: '120px', color: '#fff' } + +function Demo() { + const [collapsed, setCollapsed] = React.useState(false) + return ( +
+ + Sider + +
+ +
+ Content +
Footer
+
+
+ + +
Header
+ Content +
Footer
+
+ + +
Header
+ + Sider + Content + +
Footer
+
+ + +
Header
+ + Content + Sider + +
Footer
+
+
+ ); +} + +ReactDOM.render(, _mount_); ``` -3. To develop, run the self-reloading build: - -```bash -npm run build # Compile packages 📦 @uiw/react-monorepo-template -npm run watch # Real-time compilation 📦 @uiw/react-monorepo-template -``` +## Layout -4. Run Document Website Environment: +布局容器,其下可嵌套 `Header` `Sider` `Content` `Footer` 或 `Layout` 本身,可以放在任何父容器中。 -```bash -npm run start -``` +* `Header`:顶部布局,自带默认样式,其下可嵌套任何元素,只能放在 `Layout` 中。 +* `Sider`:侧边栏,自带默认样式及基本功能,其下可嵌套任何元素,只能放在 `Layout` 中。 +* `Content`:内容部分,自带默认样式,其下可嵌套任何元素,只能放在 `Layout` 中。 +* `Footer`:底部布局,自带默认样式,其下可嵌套任何元素,只能放在 `Layout` 中。 -5. To contribute, please fork repos, add your patch and tests for it (in the `test/` folder) and submit a pull request. +| 参数 | 说明 | 类型 | 默认值 | +|--------- |-------- |--------- |-------- | +| className | 容器 className | string | - | +| style | 指定样式 | CSSProperties | - | +| theme | 主题颜色 | `light`、`dark` | `dark` | +| hasSider | 表示子元素里有 Sider,一般不用指定。可用于服务端渲染时避免样式闪动 | boolean | - | -``` -npm run test -``` +## Layout.Sider -## License +| 参数 | 说明 | 类型 | 默认值 | +|--------- |-------- |--------- |-------- | +| className | 容器 className | string | - | +| style | 指定样式 | CSSProperties | - | +| collapsed | 当前收起状态 | boolean | - | +| collapsedWidth | 收缩宽度,设置为 `0` | boolean | `80` | +| width | 宽度 | number/string | 200 | -Licensed under the MIT License. \ No newline at end of file diff --git a/core/package.json b/core/package.json index e681f03..50628d7 100644 --- a/core/package.json +++ b/core/package.json @@ -1,12 +1,12 @@ { - "name": "@uiw/react-monorepo-template", - "version": "1.0.0", - "description": "React Monorepo Template.", + "name": "@uiw/react-layout", + "version": "4.9.9", + "description": "React layout component.", "author": "Kenny Wong ", - "homepage": "https://uiwjs.github.io/react-monorepo-template", + "homepage": "https://uiwjs.github.io/react-layout", "repository": { "type": "git", - "url": "https://github.com/uiwjs/react-monorepo-template.git" + "url": "https://github.com/uiwjs/react-layout.git" }, "license": "MIT", "main": "./cjs/index.js", @@ -21,14 +21,13 @@ "access": "public" }, "keywords": [ - "react-monorepo-template", - "react.js", - "react", - "template", - "monorepo", - "monorepo-template", + "layout", + "react-layout", + "design", "uiw", "uiw-react", + "react.js", + "react", "react-component", "component", "components", @@ -36,7 +35,9 @@ "css", "uikit", "react-ui", - "framework" + "framework", + "front-end", + "frontend" ], "peerDependencies": { "react": ">=16.9.0", diff --git a/core/src/Content.tsx b/core/src/Content.tsx new file mode 100644 index 0000000..1af0bb1 --- /dev/null +++ b/core/src/Content.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +export interface ContentProps extends React.HTMLAttributes { + prefixCls?: string; + children?: React.ReactNode; +} + +export default (props: ContentProps = {}) => { + const { prefixCls = 'w-layout-content', className, children, ...other } = props; + return ( +
+ {children} +
+ ); +}; diff --git a/core/src/Footer.tsx b/core/src/Footer.tsx new file mode 100644 index 0000000..61f9ac8 --- /dev/null +++ b/core/src/Footer.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +export interface FooterProps extends React.HTMLAttributes { + prefixCls?: string; + children?: React.ReactNode; +} + +export default (props: FooterProps = {}) => { + const { prefixCls = 'w-layout-footer', className, children, ...other } = props; + return ( +
+ {children} +
+ ); +}; diff --git a/core/src/Header.tsx b/core/src/Header.tsx new file mode 100644 index 0000000..f9116f9 --- /dev/null +++ b/core/src/Header.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +export interface HeaderProps extends React.HTMLAttributes { + prefixCls?: string; + children?: React.ReactNode; +} + +export default (props: HeaderProps = {}) => { + const { prefixCls = 'w-layout-header', className, children, ...other } = props; + return ( +
+ {children} +
+ ); +}; diff --git a/core/src/Layout.tsx b/core/src/Layout.tsx new file mode 100644 index 0000000..1624c7b --- /dev/null +++ b/core/src/Layout.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import Header from './Header'; +import Footer from './Footer'; +import Sider from './Sider'; +import Content from './Content'; + +export interface LayoutContextProps { + siderHook: { + addSider: (id: string) => void; + removeSider: (id: string) => void; + }; +} +export const LayoutContext = React.createContext({ + siderHook: { + addSider: () => null, + removeSider: () => null, + }, +}); + +export interface LayoutProps extends React.HTMLAttributes { + prefixCls?: string; + hasSider?: boolean; +} +export interface LayoutState { + siders: string[]; +} + +export default class Layout extends React.Component { + static Header: typeof Header; + static Footer: typeof Footer; + static Sider: typeof Sider; + static Content: typeof Content; + public static defaultProps: LayoutProps = { + prefixCls: 'w-layout', + }; + state = { siders: [] }; + getSiderHook() { + return { + addSider: (id: string) => { + this.setState((state) => ({ + siders: [...state.siders, id], + })); + }, + removeSider: (id: string) => { + this.setState((state) => ({ + siders: state.siders.filter((currentId) => currentId !== id), + })); + }, + }; + } + render() { + const { prefixCls, className, hasSider, children, ...other } = this.props; + return ( + +
0) ? `${prefixCls}-has-sider` : null, + ] + .filter(Boolean) + .join(' ') + .trim()} + {...other} + > + {children} +
+
+ ); + } +} diff --git a/core/src/Sider.tsx b/core/src/Sider.tsx new file mode 100644 index 0000000..38b5923 --- /dev/null +++ b/core/src/Sider.tsx @@ -0,0 +1,64 @@ +import React, { useEffect, useState, useMemo } from 'react'; +import { LayoutContext, LayoutContextProps } from './Layout'; + +export function randomid(): string { + return parseInt(String(Math.random() * 1e15), 10).toString(36); +} + +export interface SiderProps extends React.HTMLAttributes { + prefixCls?: string; + children?: React.ReactNode; + width?: number | string; + collapsedWidth?: number; + collapsed?: boolean; +} + +function Sider(props = {} as SiderProps & LayoutContextProps) { + const { + prefixCls = 'w-layout-sider', + className, + style, + children, + width = 200, + collapsedWidth = 80, + collapsed = false, + siderHook, + ...other + } = props; + const [sliderId] = useState(`w-layout-${randomid()}`); + const [rawWidth, setRawWidth] = useState(collapsed ? collapsedWidth : width); + + useEffect(() => { + if (siderHook && !!siderHook.addSider) { + siderHook.addSider(sliderId); + } + return () => { + if (siderHook && !!siderHook.removeSider) { + siderHook.removeSider(sliderId); + } + }; + }, []); + + useMemo(() => setRawWidth(collapsed ? collapsedWidth : width), [width, collapsedWidth, collapsed]); + + const divStyle = { + ...style, + flex: `0 0 ${rawWidth}`, + maxWidth: rawWidth, + minWidth: rawWidth, + width: rawWidth, + }; + return ( +
+ {children} +
+ ); +} + +export default (props = {} as SiderProps) => { + return ( + + {(context: LayoutContextProps) => } + + ); +}; diff --git a/core/src/index.tsx b/core/src/index.tsx index 7f388bd..99ed947 100644 --- a/core/src/index.tsx +++ b/core/src/index.tsx @@ -1,21 +1,18 @@ -import React from "react"; -import "./style/index.less"; +import Layout from './Layout'; +import Header from './Header'; +import Footer from './Footer'; +import Sider from './Sider'; +import Content from './Content'; +import './style/index.less'; -export interface MonorepoTemplateProps - extends React.AllHTMLAttributes { - prefixCls?: string; -} +Layout.Header = Header; +Layout.Footer = Footer; +Layout.Sider = Sider; +Layout.Content = Content; -export default function MonorepoTemplate(props: MonorepoTemplateProps = {}) { - const { className, prefixCls = "w-template", children, ...others } = props; - const cls = [className, prefixCls].filter(Boolean).join(" "); - return ( -
- {children && - React.Children.map(children, (child) => { - if (React.isValidElement(child)) return child; - return {child} ; - })} -
- ); -} +export * from './Layout'; +export * from './Header'; +export * from './Footer'; +export * from './Sider'; +export * from './Content'; +export default Layout; diff --git a/core/src/style/index.less b/core/src/style/index.less new file mode 100644 index 0000000..595761d --- /dev/null +++ b/core/src/style/index.less @@ -0,0 +1,55 @@ +@layout-prefix: ~'w-layout'; + +.@{layout-prefix}, +.@{layout-prefix} * { + box-sizing: border-box; +} +.@{layout-prefix} { + display: flex; + flex: auto; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + min-height: 0; + background: #f0f2f5; + margin: 0; + padding: 0; + + &&-has-sider > &, + &&-has-sider > &-content { + width: 0; + } + &-header, + &-footer { + -webkit-box-flex: 0; + flex: 0 0 auto; + } + &-header { + height: 53px; + padding: 0 23px; + color: rgba(0, 0, 0, 0.65); + line-height: 53px; + background: #202225; + } + &-footer { + padding: 16px 23px; + color: rgba(0, 0, 0, 0.65); + font-size: 14px; + background: #f0f2f5; + } + &-content { + -webkit-box-flex: 1; + flex: auto; + } + &&-has-sider { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + flex-direction: row; + } + &-sider { + position: relative; + min-width: 0; + background: #343a40; + transition: all 0.2s; + } +} diff --git a/core/src/styles/index.less b/core/src/styles/index.less deleted file mode 100644 index 763a434..0000000 --- a/core/src/styles/index.less +++ /dev/null @@ -1,5 +0,0 @@ -@w-template:~ "w-template"; - -.@{w-template} { - color: red; -} diff --git a/coverage/coverage-summary.json b/coverage/coverage-summary.json new file mode 100644 index 0000000..be5bad8 --- /dev/null +++ b/coverage/coverage-summary.json @@ -0,0 +1,9 @@ +{ + "total": { + "lines": { "total": 0, "covered": 0, "skipped": 0, "pct": "Unknown" }, + "statements": { "total": 0, "covered": 0, "skipped": 0, "pct": "Unknown" }, + "functions": { "total": 0, "covered": 0, "skipped": 0, "pct": "Unknown" }, + "branches": { "total": 0, "covered": 0, "skipped": 0, "pct": "Unknown" }, + "branchesTrue": { "total": 0, "covered": 0, "skipped": 0, "pct": "Unknown" } + } +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..495a10b --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,75 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = fileListingElements.join(', ') + ', ' + notSelector + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements.item(currentIndex).classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center', + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if (typeof currentIndex === 'number' && currentIndex < missingCoverageElements.length - 1) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if (document.getElementById('fileSearch') === document.activeElement && document.activeElement != null) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000..6691817 Binary files /dev/null and b/coverage/lcov-report/favicon.png differ diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..2c154be --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,101 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..e1e36d3 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,896 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION = true; +(function () { + var h = ['break,continue,do,else,for,if,return,while']; + var u = [ + h, + 'auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile', + ]; + var p = [u, 'catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof']; + var l = [ + p, + 'alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where', + ]; + var x = [ + p, + 'abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient', + ]; + var R = [ + x, + 'as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var', + ]; + var r = + 'all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes'; + var w = [p, 'debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN']; + var s = + 'caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END'; + var I = [ + h, + 'and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None', + ]; + var f = [ + h, + 'alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END', + ]; + var H = [h, 'case,done,elif,esac,eval,fi,function,in,local,set,then,until']; + var A = [l, R, w, s + I, f, H]; + var e = + /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/; + var C = 'str'; + var z = 'kwd'; + var j = 'com'; + var O = 'typ'; + var G = 'lit'; + var L = 'pun'; + var F = 'pln'; + var m = 'tag'; + var E = 'dec'; + var J = 'src'; + var P = 'atn'; + var n = 'atv'; + var N = 'nocode'; + var M = + '(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*'; + function k(Z) { + var ad = 0; + var S = false; + var ac = false; + for (var V = 0, U = Z.length; V < U; ++V) { + var ae = Z[V]; + if (ae.ignoreCase) { + ac = true; + } else { + if (/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) { + S = true; + ac = false; + break; + } + } + } + var Y = { b: 8, t: 9, n: 10, v: 11, f: 12, r: 13 }; + function ab(ah) { + var ag = ah.charCodeAt(0); + if (ag !== 92) { + return ag; + } + var af = ah.charAt(1); + ag = Y[af]; + if (ag) { + return ag; + } else { + if ('0' <= af && af <= '7') { + return parseInt(ah.substring(1), 8); + } else { + if (af === 'u' || af === 'x') { + return parseInt(ah.substring(2), 16); + } else { + return ah.charCodeAt(1); + } + } + } + } + function T(af) { + if (af < 32) { + return (af < 16 ? '\\x0' : '\\x') + af.toString(16); + } + var ag = String.fromCharCode(af); + if (ag === '\\' || ag === '-' || ag === '[' || ag === ']') { + ag = '\\' + ag; + } + return ag; + } + function X(am) { + var aq = am + .substring(1, am.length - 1) + .match( + new RegExp( + '\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]', + 'g', + ), + ); + var ak = []; + var af = []; + var ao = aq[0] === '^'; + for (var ar = ao ? 1 : 0, aj = aq.length; ar < aj; ++ar) { + var ah = aq[ar]; + if (/\\[bdsw]/i.test(ah)) { + ak.push(ah); + } else { + var ag = ab(ah); + var al; + if (ar + 2 < aj && '-' === aq[ar + 1]) { + al = ab(aq[ar + 2]); + ar += 2; + } else { + al = ag; + } + af.push([ag, al]); + if (!(al < 65 || ag > 122)) { + if (!(al < 65 || ag > 90)) { + af.push([Math.max(65, ag) | 32, Math.min(al, 90) | 32]); + } + if (!(al < 97 || ag > 122)) { + af.push([Math.max(97, ag) & ~32, Math.min(al, 122) & ~32]); + } + } + } + } + af.sort(function (av, au) { + return av[0] - au[0] || au[1] - av[1]; + }); + var ai = []; + var ap = [NaN, NaN]; + for (var ar = 0; ar < af.length; ++ar) { + var at = af[ar]; + if (at[0] <= ap[1] + 1) { + ap[1] = Math.max(ap[1], at[1]); + } else { + ai.push((ap = at)); + } + } + var an = ['[']; + if (ao) { + an.push('^'); + } + an.push.apply(an, ak); + for (var ar = 0; ar < ai.length; ++ar) { + var at = ai[ar]; + an.push(T(at[0])); + if (at[1] > at[0]) { + if (at[1] + 1 > at[0]) { + an.push('-'); + } + an.push(T(at[1])); + } + } + an.push(']'); + return an.join(''); + } + function W(al) { + var aj = al.source.match( + new RegExp( + '(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)', + 'g', + ), + ); + var ah = aj.length; + var an = []; + for (var ak = 0, am = 0; ak < ah; ++ak) { + var ag = aj[ak]; + if (ag === '(') { + ++am; + } else { + if ('\\' === ag.charAt(0)) { + var af = +ag.substring(1); + if (af && af <= am) { + an[af] = -1; + } + } + } + } + for (var ak = 1; ak < an.length; ++ak) { + if (-1 === an[ak]) { + an[ak] = ++ad; + } + } + for (var ak = 0, am = 0; ak < ah; ++ak) { + var ag = aj[ak]; + if (ag === '(') { + ++am; + if (an[am] === undefined) { + aj[ak] = '(?:'; + } + } else { + if ('\\' === ag.charAt(0)) { + var af = +ag.substring(1); + if (af && af <= am) { + aj[ak] = '\\' + an[am]; + } + } + } + } + for (var ak = 0, am = 0; ak < ah; ++ak) { + if ('^' === aj[ak] && '^' !== aj[ak + 1]) { + aj[ak] = ''; + } + } + if (al.ignoreCase && S) { + for (var ak = 0; ak < ah; ++ak) { + var ag = aj[ak]; + var ai = ag.charAt(0); + if (ag.length >= 2 && ai === '[') { + aj[ak] = X(ag); + } else { + if (ai !== '\\') { + aj[ak] = ag.replace(/[a-zA-Z]/g, function (ao) { + var ap = ao.charCodeAt(0); + return '[' + String.fromCharCode(ap & ~32, ap | 32) + ']'; + }); + } + } + } + } + return aj.join(''); + } + var aa = []; + for (var V = 0, U = Z.length; V < U; ++V) { + var ae = Z[V]; + if (ae.global || ae.multiline) { + throw new Error('' + ae); + } + aa.push('(?:' + W(ae) + ')'); + } + return new RegExp(aa.join('|'), ac ? 'gi' : 'g'); + } + function a(V) { + var U = /(?:^|\s)nocode(?:\s|$)/; + var X = []; + var T = 0; + var Z = []; + var W = 0; + var S; + if (V.currentStyle) { + S = V.currentStyle.whiteSpace; + } else { + if (window.getComputedStyle) { + S = document.defaultView.getComputedStyle(V, null).getPropertyValue('white-space'); + } + } + var Y = S && 'pre' === S.substring(0, 3); + function aa(ab) { + switch (ab.nodeType) { + case 1: + if (U.test(ab.className)) { + return; + } + for (var ae = ab.firstChild; ae; ae = ae.nextSibling) { + aa(ae); + } + var ad = ab.nodeName; + if ('BR' === ad || 'LI' === ad) { + X[W] = '\n'; + Z[W << 1] = T++; + Z[(W++ << 1) | 1] = ab; + } + break; + case 3: + case 4: + var ac = ab.nodeValue; + if (ac.length) { + if (!Y) { + ac = ac.replace(/[ \t\r\n]+/g, ' '); + } else { + ac = ac.replace(/\r\n?/g, '\n'); + } + X[W] = ac; + Z[W << 1] = T; + T += ac.length; + Z[(W++ << 1) | 1] = ab; + } + break; + } + } + aa(V); + return { sourceCode: X.join('').replace(/\n$/, ''), spans: Z }; + } + function B(S, U, W, T) { + if (!U) { + return; + } + var V = { sourceCode: U, basePos: S }; + W(V); + T.push.apply(T, V.decorations); + } + var v = /\S/; + function o(S) { + var V = undefined; + for (var U = S.firstChild; U; U = U.nextSibling) { + var T = U.nodeType; + V = T === 1 ? (V ? S : U) : T === 3 ? (v.test(U.nodeValue) ? S : V) : V; + } + return V === S ? undefined : V; + } + function g(U, T) { + var S = {}; + var V; + (function () { + var ad = U.concat(T); + var ah = []; + var ag = {}; + for (var ab = 0, Z = ad.length; ab < Z; ++ab) { + var Y = ad[ab]; + var ac = Y[3]; + if (ac) { + for (var ae = ac.length; --ae >= 0; ) { + S[ac.charAt(ae)] = Y; + } + } + var af = Y[1]; + var aa = '' + af; + if (!ag.hasOwnProperty(aa)) { + ah.push(af); + ag[aa] = null; + } + } + ah.push(/[\0-\uffff]/); + V = k(ah); + })(); + var X = T.length; + var W = function (ah) { + var Z = ah.sourceCode, + Y = ah.basePos; + var ad = [Y, F]; + var af = 0; + var an = Z.match(V) || []; + var aj = {}; + for (var ae = 0, aq = an.length; ae < aq; ++ae) { + var ag = an[ae]; + var ap = aj[ag]; + var ai = void 0; + var am; + if (typeof ap === 'string') { + am = false; + } else { + var aa = S[ag.charAt(0)]; + if (aa) { + ai = ag.match(aa[1]); + ap = aa[0]; + } else { + for (var ao = 0; ao < X; ++ao) { + aa = T[ao]; + ai = ag.match(aa[1]); + if (ai) { + ap = aa[0]; + break; + } + } + if (!ai) { + ap = F; + } + } + am = ap.length >= 5 && 'lang-' === ap.substring(0, 5); + if (am && !(ai && typeof ai[1] === 'string')) { + am = false; + ap = J; + } + if (!am) { + aj[ag] = ap; + } + } + var ab = af; + af += ag.length; + if (!am) { + ad.push(Y + ab, ap); + } else { + var al = ai[1]; + var ak = ag.indexOf(al); + var ac = ak + al.length; + if (ai[2]) { + ac = ag.length - ai[2].length; + ak = ac - al.length; + } + var ar = ap.substring(5); + B(Y + ab, ag.substring(0, ak), W, ad); + B(Y + ab + ak, al, q(ar, al), ad); + B(Y + ab + ac, ag.substring(ac), W, ad); + } + } + ah.decorations = ad; + }; + return W; + } + function i(T) { + var W = [], + S = []; + if (T.tripleQuotedStrings) { + W.push([ + C, + /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, + null, + '\'"', + ]); + } else { + if (T.multiLineStrings) { + W.push([ + C, + /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/, + null, + '\'"`', + ]); + } else { + W.push([C, /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/, null, '"\'']); + } + } + if (T.verbatimStrings) { + S.push([C, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]); + } + var Y = T.hashComments; + if (Y) { + if (T.cStyleComments) { + if (Y > 1) { + W.push([j, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']); + } else { + W.push([ + j, + /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/, + null, + '#', + ]); + } + S.push([C, /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, null]); + } else { + W.push([j, /^#[^\r\n]*/, null, '#']); + } + } + if (T.cStyleComments) { + S.push([j, /^\/\/[^\r\n]*/, null]); + S.push([j, /^\/\*[\s\S]*?(?:\*\/|$)/, null]); + } + if (T.regexLiterals) { + var X = '/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/'; + S.push(['lang-regex', new RegExp('^' + M + '(' + X + ')')]); + } + var V = T.types; + if (V) { + S.push([O, V]); + } + var U = ('' + T.keywords).replace(/^ | $/g, ''); + if (U.length) { + S.push([z, new RegExp('^(?:' + U.replace(/[\s,]+/g, '|') + ')\\b'), null]); + } + W.push([F, /^\s+/, null, ' \r\n\t\xA0']); + S.push( + [G, /^@[a-z_$][a-z_$@0-9]*/i, null], + [O, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null], + [F, /^[a-z_$][a-z_$@0-9]*/i, null], + [ + G, + new RegExp('^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*', 'i'), + null, + '0123456789', + ], + [F, /^\\[\s\S]?/, null], + [L, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null], + ); + return g(W, S); + } + var K = i({ keywords: A, hashComments: true, cStyleComments: true, multiLineStrings: true, regexLiterals: true }); + function Q(V, ag) { + var U = /(?:^|\s)nocode(?:\s|$)/; + var ab = /\r\n?|\n/; + var ac = V.ownerDocument; + var S; + if (V.currentStyle) { + S = V.currentStyle.whiteSpace; + } else { + if (window.getComputedStyle) { + S = ac.defaultView.getComputedStyle(V, null).getPropertyValue('white-space'); + } + } + var Z = S && 'pre' === S.substring(0, 3); + var af = ac.createElement('LI'); + while (V.firstChild) { + af.appendChild(V.firstChild); + } + var W = [af]; + function ae(al) { + switch (al.nodeType) { + case 1: + if (U.test(al.className)) { + break; + } + if ('BR' === al.nodeName) { + ad(al); + if (al.parentNode) { + al.parentNode.removeChild(al); + } + } else { + for (var an = al.firstChild; an; an = an.nextSibling) { + ae(an); + } + } + break; + case 3: + case 4: + if (Z) { + var am = al.nodeValue; + var aj = am.match(ab); + if (aj) { + var ai = am.substring(0, aj.index); + al.nodeValue = ai; + var ah = am.substring(aj.index + aj[0].length); + if (ah) { + var ak = al.parentNode; + ak.insertBefore(ac.createTextNode(ah), al.nextSibling); + } + ad(al); + if (!ai) { + al.parentNode.removeChild(al); + } + } + } + break; + } + } + function ad(ak) { + while (!ak.nextSibling) { + ak = ak.parentNode; + if (!ak) { + return; + } + } + function ai(al, ar) { + var aq = ar ? al.cloneNode(false) : al; + var ao = al.parentNode; + if (ao) { + var ap = ai(ao, 1); + var an = al.nextSibling; + ap.appendChild(aq); + for (var am = an; am; am = an) { + an = am.nextSibling; + ap.appendChild(am); + } + } + return aq; + } + var ah = ai(ak.nextSibling, 0); + for (var aj; (aj = ah.parentNode) && aj.nodeType === 1; ) { + ah = aj; + } + W.push(ah); + } + for (var Y = 0; Y < W.length; ++Y) { + ae(W[Y]); + } + if (ag === (ag | 0)) { + W[0].setAttribute('value', ag); + } + var aa = ac.createElement('OL'); + aa.className = 'linenums'; + var X = Math.max(0, (ag - 1) | 0) || 0; + for (var Y = 0, T = W.length; Y < T; ++Y) { + af = W[Y]; + af.className = 'L' + ((Y + X) % 10); + if (!af.firstChild) { + af.appendChild(ac.createTextNode('\xA0')); + } + aa.appendChild(af); + } + V.appendChild(aa); + } + function D(ac) { + var aj = /\bMSIE\b/.test(navigator.userAgent); + var am = /\n/g; + var al = ac.sourceCode; + var an = al.length; + var V = 0; + var aa = ac.spans; + var T = aa.length; + var ah = 0; + var X = ac.decorations; + var Y = X.length; + var Z = 0; + X[Y] = an; + var ar, aq; + for (aq = ar = 0; aq < Y; ) { + if (X[aq] !== X[aq + 2]) { + X[ar++] = X[aq++]; + X[ar++] = X[aq++]; + } else { + aq += 2; + } + } + Y = ar; + for (aq = ar = 0; aq < Y; ) { + var at = X[aq]; + var ab = X[aq + 1]; + var W = aq + 2; + while (W + 2 <= Y && X[W + 1] === ab) { + W += 2; + } + X[ar++] = at; + X[ar++] = ab; + aq = W; + } + Y = X.length = ar; + var ae = null; + while (ah < T) { + var af = aa[ah]; + var S = aa[ah + 2] || an; + var ag = X[Z]; + var ap = X[Z + 2] || an; + var W = Math.min(S, ap); + var ak = aa[ah + 1]; + var U; + if (ak.nodeType !== 1 && (U = al.substring(V, W))) { + if (aj) { + U = U.replace(am, '\r'); + } + ak.nodeValue = U; + var ai = ak.ownerDocument; + var ao = ai.createElement('SPAN'); + ao.className = X[Z + 1]; + var ad = ak.parentNode; + ad.replaceChild(ao, ak); + ao.appendChild(ak); + if (V < S) { + aa[ah + 1] = ak = ai.createTextNode(al.substring(W, S)); + ad.insertBefore(ak, ao.nextSibling); + } + } + V = W; + if (V >= S) { + ah += 2; + } + if (V >= ap) { + Z += 2; + } + } + } + var t = {}; + function c(U, V) { + for (var S = V.length; --S >= 0; ) { + var T = V[S]; + if (!t.hasOwnProperty(T)) { + t[T] = U; + } else { + if (window.console) { + console.warn('cannot override language handler %s', T); + } + } + } + } + function q(T, S) { + if (!(T && t.hasOwnProperty(T))) { + T = /^\s*]*(?:>|$)/], + [j, /^<\!--[\s\S]*?(?:-\->|$)/], + ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/], + ['lang-', /^<%([\s\S]+?)(?:%>|$)/], + [L, /^(?:<[%?]|[%?]>)/], + ['lang-', /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], + ['lang-js', /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], + ['lang-css', /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], + ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i], + ], + ), + ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl'], + ); + c( + g( + [ + [F, /^[\s]+/, null, ' \t\r\n'], + [n, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '"\''], + ], + [ + [m, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i], + [P, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i], + ['lang-uq.val', /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/], + [L, /^[=<>\/]+/], + ['lang-js', /^on\w+\s*=\s*\"([^\"]+)\"/i], + ['lang-js', /^on\w+\s*=\s*\'([^\']+)\'/i], + ['lang-js', /^on\w+\s*=\s*([^\"\'>\s]+)/i], + ['lang-css', /^style\s*=\s*\"([^\"]+)\"/i], + ['lang-css', /^style\s*=\s*\'([^\']+)\'/i], + ['lang-css', /^style\s*=\s*([^\"\'>\s]+)/i], + ], + ), + ['in.tag'], + ); + c(g([], [[n, /^[\s\S]+/]]), ['uq.val']); + c(i({ keywords: l, hashComments: true, cStyleComments: true, types: e }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']); + c(i({ keywords: 'null,true,false' }), ['json']); + c(i({ keywords: R, hashComments: true, cStyleComments: true, verbatimStrings: true, types: e }), ['cs']); + c(i({ keywords: x, cStyleComments: true }), ['java']); + c(i({ keywords: H, hashComments: true, multiLineStrings: true }), ['bsh', 'csh', 'sh']); + c(i({ keywords: I, hashComments: true, multiLineStrings: true, tripleQuotedStrings: true }), ['cv', 'py']); + c(i({ keywords: s, hashComments: true, multiLineStrings: true, regexLiterals: true }), ['perl', 'pl', 'pm']); + c(i({ keywords: f, hashComments: true, multiLineStrings: true, regexLiterals: true }), ['rb']); + c(i({ keywords: w, cStyleComments: true, regexLiterals: true }), ['js']); + c( + i({ + keywords: r, + hashComments: 3, + cStyleComments: true, + multilineStrings: true, + tripleQuotedStrings: true, + regexLiterals: true, + }), + ['coffee'], + ); + c(g([], [[C, /^[\s\S]+/]]), ['regex']); + function d(V) { + var U = V.langExtension; + try { + var S = a(V.sourceNode); + var T = S.sourceCode; + V.sourceCode = T; + V.spans = S.spans; + V.basePos = 0; + q(U, T)(V); + D(V); + } catch (W) { + if ('console' in window) { + console.log(W && W.stack ? W.stack : W); + } + } + } + function y(W, V, U) { + var S = document.createElement('PRE'); + S.innerHTML = W; + if (U) { + Q(S, U); + } + var T = { langExtension: V, numberLines: U, sourceNode: S }; + d(T); + return S.innerHTML; + } + function b(ad) { + function Y(af) { + return document.getElementsByTagName(af); + } + var ac = [Y('pre'), Y('code'), Y('xmp')]; + var T = []; + for (var aa = 0; aa < ac.length; ++aa) { + for (var Z = 0, V = ac[aa].length; Z < V; ++Z) { + T.push(ac[aa][Z]); + } + } + ac = null; + var W = Date; + if (!W.now) { + W = { + now: function () { + return +new Date(); + }, + }; + } + var X = 0; + var S; + var ab = /\blang(?:uage)?-([\w.]+)(?!\S)/; + var ae = /\bprettyprint\b/; + function U() { + var ag = window.PR_SHOULD_USE_CONTINUATION ? W.now() + 250 : Infinity; + for (; X < T.length && W.now() < ag; X++) { + var aj = T[X]; + var ai = aj.className; + if (ai.indexOf('prettyprint') >= 0) { + var ah = ai.match(ab); + var am; + if (!ah && (am = o(aj)) && 'CODE' === am.tagName) { + ah = am.className.match(ab); + } + if (ah) { + ah = ah[1]; + } + var al = false; + for (var ak = aj.parentNode; ak; ak = ak.parentNode) { + if ( + (ak.tagName === 'pre' || ak.tagName === 'code' || ak.tagName === 'xmp') && + ak.className && + ak.className.indexOf('prettyprint') >= 0 + ) { + al = true; + break; + } + } + if (!al) { + var af = aj.className.match(/\blinenums\b(?::(\d+))?/); + af = af ? (af[1] && af[1].length ? +af[1] : true) : false; + if (af) { + Q(aj, af); + } + S = { langExtension: ah, sourceNode: aj, numberLines: af }; + d(S); + } + } + } + if (X < T.length) { + setTimeout(U, 250); + } else { + if (ad) { + ad(); + } + } + } + U(); + } + window.prettyPrintOne = y; + window.prettyPrint = b; + window.PR = { + createSimpleLexer: g, + registerLangHandler: c, + sourceDecorator: i, + PR_ATTRIB_NAME: P, + PR_ATTRIB_VALUE: n, + PR_COMMENT: j, + PR_DECLARATION: E, + PR_KEYWORD: z, + PR_LITERAL: G, + PR_NOCODE: N, + PR_PLAIN: F, + PR_PUNCTUATION: L, + PR_SOURCE: J, + PR_STRING: C, + PR_TAG: m, + PR_TYPE: O, + }; +})(); +PR.registerLangHandler( + PR.createSimpleLexer( + [], + [ + [PR.PR_DECLARATION, /^]*(?:>|$)/], + [PR.PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/], + [PR.PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/], + ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/], + ['lang-', /^<%([\s\S]+?)(?:%>|$)/], + ['lang-', /^]*>([\s\S]+?)<\/xmp\b[^>]*>/i], + [ + 'lang-handlebars', + /^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i, + ], + ['lang-js', /^]*>([\s\S]*?)(<\/script\b[^>]*>)/i], + ['lang-css', /^]*>([\s\S]*?)(<\/style\b[^>]*>)/i], + ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i], + [PR.PR_DECLARATION, /^{{[#^>/]?\s*[\w.][^}]*}}/], + [PR.PR_DECLARATION, /^{{&?\s*[\w.][^}]*}}/], + [PR.PR_DECLARATION, /^{{{>?\s*[\w.][^}]*}}}/], + [PR.PR_COMMENT, /^{{![^}]*}}/], + ], + ), + ['handlebars', 'hbs'], +); +PR.registerLangHandler( + PR.createSimpleLexer( + [[PR.PR_PLAIN, /^[ \t\r\n\f]+/, null, ' \t\r\n\f']], + [ + [PR.PR_STRING, /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null], + [PR.PR_STRING, /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null], + ['lang-css-str', /^url\(([^\)\"\']*)\)/i], + [PR.PR_KEYWORD, /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i, null], + ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i], + [PR.PR_COMMENT, /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//], + [PR.PR_COMMENT, /^(?:)/], + [PR.PR_LITERAL, /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i], + [PR.PR_LITERAL, /^#(?:[0-9a-f]{3}){1,2}/i], + [PR.PR_PLAIN, /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i], + [PR.PR_PUNCTUATION, /^[^\s\w\'\"]+/], + ], + ), + ['css'], +); +PR.registerLangHandler( + PR.createSimpleLexer([], [[PR.PR_KEYWORD, /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]), + ['css-kw'], +); +PR.registerLangHandler(PR.createSimpleLexer([], [[PR.PR_STRING, /^[^\)\"\']+/]]), ['css-str']); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000..03f704a Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..ade79a7 --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,189 @@ +/* eslint-disable */ +var addSorting = (function () { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false, + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if (row.textContent.toLowerCase().includes(searchValue.toLowerCase())) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string', + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index 7569026..bd95fe8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "scripts": { "⬇️⬇️⬇️⬇️⬇️ package ⬇️⬇️⬇️⬇️⬇️": "▼▼▼▼▼ package ▼▼▼▼▼", "build": "lerna exec --scope @uiw/* -- tsbb build && npm run css:build && npm run css:build:dist", - "watch": "lerna exec \"tsbb watch\" --scope @uiw/* && npm run css:watch", + "watch": "lerna exec \"tsbb watch\" --scope @uiw/* & npm run css:watch", "css:build": "lerna exec --scope @uiw/* -- compile-less -d src -o esm", "css:watch": "lerna exec --scope @uiw/* -- compile-less -d src -o esm --watch", "css:build:dist": "lerna exec --scope @uiw/* -- compile-less -d src -o lib --combine=dist.css", diff --git a/tsconfig.json b/tsconfig.json index 81fce96..75046b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,6 @@ "declaration": true, "baseUrl": ".", "noFallthroughCasesInSwitch": true, - "noEmit": true, - "types": ["jest", "node"] + "noEmit": true } } diff --git a/website/.kktrc.ts b/website/.kktrc.ts index 5afb5ee..b0f4840 100644 --- a/website/.kktrc.ts +++ b/website/.kktrc.ts @@ -1,46 +1,42 @@ -import path from "path"; -import webpack, { Configuration } from "webpack"; -import lessModules from "@kkt/less-modules"; -import rawModules from "@kkt/raw-modules"; -import scopePluginOptions from "@kkt/scope-plugin-options"; -import { LoaderConfOptions } from "kkt"; -import pkg from "./package.json"; +import path from 'path'; +import webpack, { Configuration } from 'webpack'; +import lessModules from '@kkt/less-modules'; +import rawModules from '@kkt/raw-modules'; +import scopePluginOptions from '@kkt/scope-plugin-options'; +import { LoaderConfOptions } from 'kkt'; +import pkg from './package.json'; -export default ( - conf: Configuration, - env: "development" | "production", - options: LoaderConfOptions -) => { +export default (conf: Configuration, env: 'development' | 'production', options: LoaderConfOptions) => { conf = lessModules(conf, env, options); conf = rawModules(conf, env, options); conf = scopePluginOptions(conf, env, { ...options, - allowedFiles: [ - path.resolve(process.cwd(), "README.md"), - path.resolve(process.cwd(), "src"), - ], + allowedFiles: [path.resolve(process.cwd(), 'README.md'), path.resolve(process.cwd(), 'src')], }); conf.plugins!.push( new webpack.DefinePlugin({ VERSION: JSON.stringify(pkg.version), - }) + }), ); - if (env === "production") { - conf.output = { ...conf.output, publicPath: "./" }; + if (env === 'production') { + /** https://github.com/uiwjs/react-code-preview/issues/94 */ + conf.module!.exprContextCritical = true; + // conf.module!.exprContextRecursive = false; + conf.output = { ...conf.output, publicPath: './' }; conf.optimization = { ...conf.optimization, splitChunks: { cacheGroups: { reactvendor: { test: /[\\/]node_modules[\\/](react|react-dom)[\\/]/, - name: "react-vendor", - chunks: "all", + name: 'react-vendor', + chunks: 'all', }, refractor: { test: /[\\/]node_modules[\\/](refractor)[\\/]/, - name: "refractor-prismjs-vendor", - chunks: "all", + name: 'refractor-prismjs-vendor', + chunks: 'all', }, }, }, diff --git a/website/README.md b/website/README.md index c4d918c..e01d4d7 100644 --- a/website/README.md +++ b/website/README.md @@ -1,4 +1,4 @@ Document Website === -https://uiwjs.github.io/react-monorepo-template \ No newline at end of file +https://uiwjs.github.io/react-layout \ No newline at end of file diff --git a/website/package.json b/website/package.json index 9dcbc89..5f2f7dc 100644 --- a/website/package.json +++ b/website/package.json @@ -7,25 +7,21 @@ "start": "kkt start", "build": "kkt build" }, - "repository": { - "type": "git", - "url": "https://github.com/uiwjs/react-monorepo-template.git" - }, - "license": "MIT", "dependencies": { - "@uiw/react-monorepo-template": "1.0.0", + "@uiw/react-layout": "4.9.9", "@uiw/react-github-corners": "1.5.3", + "@uiw/react-code-preview": "4.0.2", "@uiw/react-markdown-preview": "3.4.7", "react": "17.0.2", "react-dom": "17.0.2" }, "devDependencies": { - "@kkt/less-modules": "7.0.5", - "@kkt/raw-modules": "7.0.5", - "@kkt/scope-plugin-options": "7.0.5", + "@kkt/less-modules": "7.0.6", + "@kkt/raw-modules": "7.0.6", + "@kkt/scope-plugin-options": "7.0.6", "@types/react": "17.0.38", "@types/react-dom": "17.0.11", - "kkt": "7.0.5" + "kkt": "7.0.6" }, "eslintConfig": { "extends": [ diff --git a/website/src/App.tsx b/website/src/App.tsx index 7be3994..5c95aed 100644 --- a/website/src/App.tsx +++ b/website/src/App.tsx @@ -1,29 +1,30 @@ -import React from "react"; -import GitHubCorners from "@uiw/react-github-corners"; -import MarkdownPreview from "@uiw/react-markdown-preview"; -import styles from "./App.module.less"; -import logo from "./logo.svg"; -import MDStr from "@uiw/react-monorepo-template/README.md"; +import React from 'react'; +import GitHubCorners from '@uiw/react-github-corners'; +import Layout from '@uiw/react-layout'; +import Markdown from './Markdown'; +import styles from './App.module.less'; +import logo from './logo.svg'; export default function App() { // @ts-ignore const version = VERSION; return (
- +
react logo

React Monorepo Template {version}

-

- Simple React package development project example template. -

+

Simple React package development project example template.

- + { + const md = await import('@uiw/react-layout/README.md'); + return md.default; + }} + />
); } diff --git a/website/src/Markdown/Code.tsx b/website/src/Markdown/Code.tsx new file mode 100644 index 0000000..a3c09cf --- /dev/null +++ b/website/src/Markdown/Code.tsx @@ -0,0 +1,71 @@ +import CodePreview, { CodePreviewProps } from '@uiw/react-code-preview'; + +export interface CodeProps extends CodePreviewProps { + code: string; + version: string; + codePen: boolean; + codeSandbox?: boolean; + dependencies: any; +} + +export default function Code({ version, dependencies, codePen, codeSandbox, ...other }: CodeProps) { + const props: CodePreviewProps = { ...other }; + if (codePen) { + props.codePenOption = { + title: `uiw${version} - demo`, + includeModule: ['uiw'], + js: (props.code || '').replace('_mount_', 'document.getElementById("container")'), + html: '
', + css_external: `https://unpkg.com/uiw@${version}/dist/uiw.min.css`, + js_external: `https://unpkg.com/react@16.x/umd/react.development.js;https://unpkg.com/react-dom@16.x/umd/react-dom.development.js;https://unpkg.com/classnames@2.2.6/index.js;https://unpkg.com/uiw@${version}/dist/uiw.min.js;https://unpkg.com/@uiw/codepen-require-polyfill@1.0.2/index.js`, + }; + } + if (codeSandbox) { + props.codeSandboxOption = { + files: { + 'sandbox.config.json': { + content: `{ + "template": "node", + "container": { + "startScript": "start", + "node": "14" + } + }`, + }, + 'public/index.html': { + content: `
`, + }, + 'src/index.js': { + content: (props.code || '').replace('_mount_', 'document.getElementById("container")'), + }, + '.kktrc.js': { + content: `import webpack from "webpack";\nimport lessModules from "@kkt/less-modules";\nexport default (conf, env, options) => {\nconf = lessModules(conf, env, options);\nreturn conf;\n};`, + }, + 'package.json': { + content: { + name: 'uiw-demo', + description: `uiw v${version} - demo`, + dependencies: { + react: 'latest', + 'react-dom': 'latest', + uiw: 'latest', + }, + devDependencies: { + '@kkt/less-modules': '6.9.0', + kkt: '6.9.0', + typescript: '4.1.3', + }, + license: 'MIT', + scripts: { + start: 'kkt start', + build: 'kkt build', + test: 'kkt test --env=jsdom', + }, + browserslist: ['>0.2%', 'not dead', 'not ie <= 11', 'not op_mini all'], + }, + }, + }, + }; + } + return ; +} diff --git a/website/src/Markdown/Footer.tsx b/website/src/Markdown/Footer.tsx new file mode 100644 index 0000000..ac9ebaf --- /dev/null +++ b/website/src/Markdown/Footer.tsx @@ -0,0 +1,40 @@ +import React, { Fragment } from 'react'; +// import { Divider } from 'uiw'; + +export type FooterProps = { + path?: string; +}; + +export default function Footer(props: FooterProps = {}) { + const { path } = props; + const url = /^http/.test(path || '') ? path : `https://github.com/uiwjs/uiw/blob/master/${path}`; + return ( + + 犯了错误还是想对文件做出贡献? + {url && ( + + 在Github上编辑本页! + + )} +
+ + 反馈建议 + + + 提交bug + + + Github + + + kkt + + + @kkt/ssr + + + 国内镜像 + +
+ ); +} diff --git a/website/src/Markdown/index.module.less b/website/src/Markdown/index.module.less new file mode 100644 index 0000000..61ec541 --- /dev/null +++ b/website/src/Markdown/index.module.less @@ -0,0 +1,30 @@ +.docinfo { + padding: 30px 0 10px 0; + line-height: 24px; + color: #909090; +} + +.markdown { + font-size: inherit; + line-height: initial; + h1, + h2, + h3, + h4, + h5, + h6 { + a { + display: none; + } + } + pre[data-type='rehyp'] { + overflow: initial; + font-size: inherit; + line-height: initial; + + white-space: initial; + word-spacing: initial; + word-break: initial; + word-wrap: initial; + } +} diff --git a/website/src/Markdown/index.tsx b/website/src/Markdown/index.tsx new file mode 100644 index 0000000..8c65c23 --- /dev/null +++ b/website/src/Markdown/index.tsx @@ -0,0 +1,84 @@ +import { useEffect, useState } from 'react'; +import MarkdownPreview from '@uiw/react-markdown-preview'; +import Code from './Code'; +import Footer from './Footer'; +import styles from './index.module.less'; + +export interface CreatePageProps extends React.HTMLAttributes { + dependencies?: T; + path: string; + renderPage?: () => Promise; +} + +const getCodeStr = (data: any[] = [], code: string = '') => { + data.forEach((node) => { + if (node.type === 'text') { + code += node.value; + } else if (node.children && Array.isArray(node.children)) { + code += getCodeStr(node.children); + } + }); + return code; +}; + +export default function CreatePage(props: CreatePageProps) { + const { renderPage, dependencies, path, ...other } = props; + const [mdStr, setMdStr] = useState(''); + + // @ts-ignore + // eslint-disable-next-line + const version = VERSION || '2.0.0'; + useEffect(() => { + if (renderPage) { + renderPage() + .then((str) => { + setMdStr(str); + }) + .catch(() => {}); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + if (!mdStr) { + return null; + } + + return ( +
+ { + const { noPreview, noScroll, bgWhite, noCode, codePen } = props as any; + if (inline) { + return ; + } + const config = { + noPreview, + noScroll, + bgWhite, + noCode, + codePen, + } as any; + if (Object.keys(config).filter((name) => config[name] !== undefined).length === 0) { + return ; + } + console.log('>>>', getCodeStr(node.children)); + return ; + }, + }} + /> +
+
+
+
+ ); +}