Browse Source

site: migrate practice pattern spec to bisheng

pull/1745/head
Benjy Cui 9 years ago
parent
commit
a97e54e253
  1. 2
      .gitignore
  2. 1
      bisheng.config.js
  3. 0
      site/bisheng-plugin-antd/lib/ImagePreview.jsx
  4. 0
      site/bisheng-plugin-antd/lib/VideoPlayer.jsx
  5. 41
      site/bisheng-plugin-antd/lib/browser.js
  6. 80
      site/component/utils.js
  7. 6
      site/theme/index.js
  8. 0
      site/theme/static/preview-img.less
  9. 2
      site/theme/static/style.js
  10. 0
      site/theme/static/toc.less
  11. 4
      site/theme/template/Content/MainContent.jsx
  12. 3
      site/theme/template/utils.jsx

2
.gitignore

@ -23,6 +23,6 @@ nohup.out
_site
_data
dist
lib
/lib
elasticsearch-*
config/base.yaml

1
bisheng.config.js

@ -1,6 +1,7 @@
module.exports = {
source: ['./components', './docs'],
theme: './site/theme',
plugins: ['./site/bisheng-plugin-antd'],
webpackConfig(config) {
config.resolve.alias = {
antd: process.cwd(),

0
site/component/ImagePreview/index.jsx → site/bisheng-plugin-antd/lib/ImagePreview.jsx

0
site/component/VideoPlayer/index.jsx → site/bisheng-plugin-antd/lib/VideoPlayer.jsx

41
site/bisheng-plugin-antd/lib/browser.js

@ -0,0 +1,41 @@
const React = require('react');
const ReactDOM = require('react-dom');
const Link = require('react-router').Link;
const toReactComponent = require('jsonml-to-react-component');
const JsonML = require('jsonml.js/lib/utils');
const VideoPlayer = require('./VideoPlayer');
const ImagePreview = require('./ImagePreview');
module.exports = () => {
return {
converters: [
[(node) => React.isValidElement(node), (node, index) => {
return React.cloneElement(node, { key: index });
}],
[(node) => typeof node === 'function', (node, index) => {
return React.cloneElement(node(React, ReactDOM), { key: index });
}],
[(node) => JsonML.getTagName(node) === 'video', (node, index) =>
<VideoPlayer video={JsonML.getAttributes(node)} key={index} />,
],
[(node) => JsonML.isElement(node) && JsonML.getTagName(node) === 'a' && !(
JsonML.getAttributes(node).class ||
(JsonML.getAttributes(node).href &&
JsonML.getAttributes(node).href.indexOf('http') === 0)
), (node, index) => {
return <Link to={JsonML.getAttributes(node).href} key={index}>{toReactComponent(JsonML.getChildren(node)[0])}</Link>;
}],
[(node) => {
return JsonML.isElement(node) &&
JsonML.getTagName(node) === 'p' &&
JsonML.getTagName(JsonML.getChildren(node)[0]) === 'img' &&
/preview-img/gi.test(JsonML.getAttributes(JsonML.getChildren(node)[0]).class);
}, (node, index) => {
const imgs = JsonML.getChildren(node)
.filter((img) => JsonML.isElement(img) && Object.keys(JsonML.getAttributes(img)).length > 0)
.map((img) => JsonML.getAttributes(img));
return <ImagePreview imgs={imgs} key={index} />;
}],
],
};
};

80
site/component/utils.js

@ -1,80 +0,0 @@
import React from 'react';
import ReactDOM from 'react-dom';
import { Link } from 'react-router';
import { getTagName, getAttributes, getChildren, isElement } from 'jsonml.js/lib/utils';
import toReactComponent from 'jsonml-to-react-component';
import VideoPlayer from './VideoPlayer';
import ImagePreview from './ImagePreview';
function isHeading(type) {
return /h[1-6]/i.test(type);
}
export function jsonmlToComponent(pathname, jsonml) {
return toReactComponent(jsonml, [
[(node) => React.isValidElement(node), (node, index) => {
return React.cloneElement(node, { key: index });
}],
[(node) => typeof node === 'function', (node, index) => {
return React.cloneElement(node(React, ReactDOM), { key: index });
}],
[(node) => isHeading(getTagName(node)), (node, index) => {
const children = getChildren(node);
return React.createElement(getTagName(node), {
key: index,
id: children,
...getAttributes(node),
}, [
<span key="title">{children.map((child) => toReactComponent(child))}</span>,
<Link to={{ pathname, query: { scrollTo: children } }} className="anchor" key="anchor">#</Link>,
]);
}],
[(node) => getTagName(node) === 'pre' && getAttributes(node).highlighted, (node, index) => {
return React.createElement('pre', { key: index, lang: getAttributes(node).lang }, React.createElement(
'code',
{ dangerouslySetInnerHTML: { __html: getChildren(getChildren(node)[0])[0] } }
));
}],
[(node) => getTagName(node) === 'video', (node, index) =>
<VideoPlayer video={getAttributes(node)} key={index} />,
],
[(node) => isElement(node) && getTagName(node) === 'a' && !(
getAttributes(node).class ||
(getAttributes(node).href &&
getAttributes(node).href.indexOf('http') === 0)
), (node, index) => {
return <Link to={getAttributes(node).href} key={index}>{toReactComponent(getChildren(node)[0])}</Link>;
}],
[(node) => {
return isElement(node) &&
getTagName(node) === 'p' &&
getTagName(getChildren(node)[0]) === 'img' &&
/preview-img/gi.test(getAttributes(getChildren(node)[0]).class);
}, (node, index) => {
const imgs = getChildren(node)
.filter((img) => isElement(img) && Object.keys(getAttributes(img)).length > 0)
.map((img) => getAttributes(img));
return <ImagePreview imgs={imgs} key={index} />;
}],
]);
}
export function setTitle(title) {
document.title = title;
}
export function ping(url, callback) {
const img = new Image();
let done;
const finish = (status) => {
if (!done) {
done = true;
img.src = '';
callback(status);
}
};
img.onload = () => finish('responded');
img.onerror = () => finish('error');
img.src = url;
setTimeout(() => finish('timeout'), 1500);
}

6
site/theme/index.js

@ -20,9 +20,15 @@ export default {
},
routes: {
'/': './template/Home/index',
'/docs/practice/:children': './template/Content/index',
'/docs/pattern/:children': './template/Content/index',
'/docs/spec/:children': './template/Content/index',
'/docs/resource/:children': './template/Content/index',
},
redirects: {
'/docs/practice': '/docs/practice/cases',
'/docs/pattern': '/docs/pattern/navigation',
'/docs/spec': '/docs/spec/introduce',
'/docs/resource': '/docs/resource/download',
},
};

0
site/common/styles/preview-img.less → site/theme/static/preview-img.less

2
site/theme/static/style.js

@ -6,4 +6,6 @@ import './page-nav.less';
import './markdown.less';
import './resource.less';
import './responsive.less';
import './preview-img.less';
import './toc.less';
import './not-found.less';

0
site/common/styles/toc.less → site/theme/static/toc.less

4
site/theme/template/Content/MainContent.jsx

@ -101,8 +101,8 @@ export default class MainContent extends React.Component {
getMenuItems() {
const props = this.props;
// TODO: data
const menuItems = utils.getMenuItems(props.data.docs.resource, this.context.intl.locale);
const moduleData = props.utils.get(props.data, props.location.pathname.split('/').slice(0, 2));
const menuItems = utils.getMenuItems(moduleData, this.context.intl.locale);
const topLevel = this.generateSubMenuItems(menuItems.topLevel);
const subMenu = Object.keys(menuItems).filter(this.isNotTopLevel)
.sort((a, b) => {

3
site/theme/template/utils.jsx

@ -1,7 +1,8 @@
export function getMenuItems(data, locale) {
const menuMeta = Object.keys(data)
.map((key) => data[key])
.map((file) => {
.map((item) => {
const file = item.index || item;
if (file.meta) {
return file.meta;
}

Loading…
Cancel
Save