/* eslint-disable no-unused-vars */ import React from 'react'; import ReactDOM from 'react-dom'; import {render} from '../../src/index'; import axios from 'axios'; import TitleBar from '../../src/components/TitleBar'; import LazyComponent from '../../src/components/LazyComponent'; import Overlay from '../../src/components/Overlay'; import PopOver from '../../src/components/PopOver'; import NestedLinks from '../../src/components/AsideNav'; import {Portal} from 'react-overlays'; import classnames from 'classnames'; import {Link} from 'react-router'; class CodePreview extends React.Component { state = { PlayGround: null }; componentDidMount() { require(['./Play'], component => this.setState({ PlayGround: component.default })); } render() { const { container, height, setAsideFolded, setHeaderVisible, ...rest } = this.props; const PlayGround = this.state.PlayGround; // 不要放在 .markdown-body 下面,因为样式会干扰,复写又麻烦,所以通过 Overlay 渲染到同级 return (
{PlayGround ? ( this.refs.span} placement="bottom" show >
) : null}
); } } class Preview extends React.Component { static displayName = 'MarkdownRenderer'; ref = null; doms = []; constructor(props) { super(props); this.divRef = this.divRef.bind(this); this.handleClick = this.handleClick.bind(this); } componentDidMount() { this.renderSchema(); if (location.hash && location.hash.length > 1) { // 禁用自动跳转 if (window.history && 'scrollRestoration' in window.history) { window.history.scrollRestoration = 'manual'; } const dom = document.querySelector( `[name="${location.hash.substring(1)}"]` ); dom && dom.scrollIntoView(); } } componentDidUpdate() { this.renderSchema(); } componentWillUnmount() { this.doms.forEach(dom => ReactDOM.unmountComponentAtNode(dom)); } handleClick(e) { const href = e.target.getAttribute('href'); if (href && href[0] !== '#' && !/^http/.test(href)) { e.preventDefault(); this.props.push(href); } } divRef(ref) { this.ref = ref; if (ref) { ref.innerHTML = this.props.doc.html; } } renderSchema() { const scripts = document.querySelectorAll('script[type="text/schema"]'); if (!scripts && !scripts.length) { return; } for (let i = 0, len = scripts.length; i < len; i++) { let script = scripts[i]; let props = {}; [].slice.apply(script.attributes).forEach(item => { props[item.name] = item.value; }); let dom = document.createElement('div'); let height = props.height ? parseInt(props.height, 10) : 200; dom.setAttribute('class', 'doc-play-ground'); dom.setAttribute('style', `height: ${height}px;`); script.parentNode.replaceChild(dom, script); this.doms.push(dom); ReactDOM.unstable_renderSubtreeIntoContainer( this, ReactDOM.findDOMNode(this)} component={CodePreview} code={script.innerText} scope={props.scope} unMountOnHidden placeholder="加载中,请稍后。。。" />, dom ); } } render() { return (
Doc
); } } export default function (doc) { return class extends React.Component { popoverDom = null; state = { headingPopover: false }; popoverRef = (ref: HTMLDivElement) => { this.popoverDom = ref; }; renderHeading(children) { return children.map((child, idx) => (
{child.label} {child.children && child.children.length ? this.renderHeading(child.children) : null}
)); } handlePopOverClick(e: React.MouseEvent) { this.setState({headingPopover: false}); e.stopPropagation(); e.preventDefault(); } renderHeadingPopover() { return this.state.headingPopover ? ( this.setState({headingPopover: false})} overlay onClick={this.handlePopOverClick} > {this.renderHeading(doc.toc.children)} ) : null; } render() { const {prevDoc, nextDoc, ContextPath} = this.props; return ( <>
{doc.title ? (

{doc.title}

{doc?.toc.children?.length ? (
this.setState({ headingPopover: !this.state.headingPopover }) } className="Doc-headingPopBtn visible-xs" > {this.renderHeadingPopover()}
) : null}
) : null}
{prevDoc ? (
上一篇 - {prevDoc.group || '其他'}
{prevDoc.label}
) : null} {nextDoc ? (
下一篇 - {nextDoc.group || '其他'}
{nextDoc.label}
) : null}
{doc.toc && doc.toc.children && doc.toc.children.length > 0 ? (
{this.renderHeading(doc.toc.children)}
) : null} ); } }; }