import React from 'react'; import rehypeReact from 'rehype-react'; import {graphql} from 'gatsby'; import "katex/dist/katex.min.css" // note - these typographic elements are taken directly from baseui. // we can consider customizing them by first importing in styled/index, then // giving them special parameters import { A, CodeBlock, H1, H2, H3, H4, H5, H6, InlineCode, P, List, ListItem, Pre, BlockQuote, Table, TableHeaderCell, TableBodyCell, MarkdownBody } from 'gatsby-theme-ocular/components'; const CustomLinkWrapper = relativeLinks => { const CustomLink = ({href, ...props}) => { if (href.startsWith('http') || href.startsWith('#')) { // TODO - we could style them differently though return ; } const hrefWithoutLeadingSlash = href.startsWith('/') ? href.slice(1) : href; return ; }; return CustomLink; }; const CustomPre = props => { // the point of this component is to distinguish styling of inline elements // with code blocks (ie
...
). const {children, ...otherProps} = props; return (
      {React.Children.map(children, child => {
        // this means a child of this 
 element is a  element, or  element styled
        // by Styletron
        if (
          child.type === 'code' ||
          child.type.displayName === 'Styled(code)'
        ) {
          return ;
        }
        // else we just clone the element as is
        return React.cloneElement(child);
      })}
    
); }; // Query for the markdown doc by slug // (Note: We could just search the allMarkdown from WebsiteConfig ourselves) export const query = graphql` query DocBySlug2($slug: String!) { docBySlug2: markdownRemark(fields: {slug: {eq: $slug}}) { htmlAst timeToRead excerpt frontmatter { title } } } `; export default class DocTemplate extends React.Component { constructor(props) { super(props); const {relativeLinks} = props.pageContext; // note - we can add many other custom components. // without rehypeReact, we'd just render the content of the markdown as generated by gatsby. // what this does is that instead we work on the Abstract Syntax Tree (htmlAST). // this allows us to replace certain elements by custom components. For instance, if we // detect an

element, we will replace it with an H1 custom component. In that case // H1 is just a styled version of h1. However, with that process we can implement custom // logic. For instance we can rewrite the contents of the link on the fly (CustomLinkWrapper). // we can style differently code tags which are within or without a
 element. And we can
    // add many more such custom components as needed.
    const renderAst = new rehypeReact({
      createElement: React.createElement,
      components: {
        h1: H1,
        h2: H2,
        h3: H3,
        h4: H4,
        h5: H5,
        h6: H6,
        p: P,
        ul: List,
        li: ListItem,
        pre: CustomPre,
        code: InlineCode,
        table: Table,
        th: TableHeaderCell,
        td: TableBodyCell,
        blockquote: BlockQuote,
        a: CustomLinkWrapper(relativeLinks)
      }
    }).Compiler;
    this.state = {renderAst};
  }

  render() {
    const {htmlAst} = this.props.data.docBySlug2;
    const {renderAst} = this.state;
    return (
      
{renderAst(htmlAst)}
); } }