Пример #1
0
  const findHref = (node, href, returnOnFirst)=>{
    let ans = returnOnFirst ? undefined : [];
    Dom.walkNode(node, node => {
      switch(node.nodeType) {
      case document.TEXT_NODE: case document.COMMENT_NODE:
        return false;
      default:
        if (node.tagName === 'A' && node.getAttribute('href') === href) {
          if (returnOnFirst) {
            ans = node;
            return true;
          } else
            ans.push(node);
        }
      }
    });

    return ans;
  };
Пример #2
0
  const apiToHtml = (title, json, sourceHtml)=>{
    const index = document.createElement('div');

    index.innerHTML = sourceHtml;

    const tags = {};

    Dom.walkNode(index, node => {
      switch(node.nodeType) {
      case document.TEXT_NODE: case document.COMMENT_NODE:
        return false;
      default:
        const tag = node.getAttribute('data-api');
        if (tag) tags[tag] = node;
      }
    });

    const {header, links, pages} = tags;
    const linkModules = [];

    Object.keys(json).sort((a,b)=>{
      a = a.replace(/\/main$/, '');
      b = b.replace(/\/main$/, '');
      return a === b ? 0 : a < b ? -1 : 1;
    }).forEach(id => {
      const api = json[id]; api.id = id; api.parent = json;
      const {subject, newInstance, methods, customMethods, protoMethods, innerSubjects} = api;

      const aside = [];

      const addModuleList = (heading, list)=>{
        if (list) {
          aside.push({div: [
            {h1: heading},

            {class: 'jsdoc-list', div: list.map(id => {
              const m = id.split('!');
              if (m.length === 2) {
                if (m[0] === 'koru/env') {
                  const idc = m[1]+'-client';
                  const ids = m[1]+'-server';
                  return {span: [
                    {class: 'jsdoc-link', a: idc, $href: '#'+idc},
                    {br: ''},
                    {class: 'jsdoc-link', a: ids, $href: '#'+ids},
                  ]};
                }
                return id;
              }
              return {class: 'jsdoc-link', a: id, $href: '#'+id};
            })},
          ]});
        }
      };
      //      addModuleList('Modules required', api.requires);
      addModuleList('Modifies modules', api.modifies);
      addModuleList('Modified by modules', api.modifiedBy);

      const idParts = /^([^:.]+)([.:]*)(.*)$/.exec(id);
      const reqParts = [
        hl('const', 'kd'), ' ', hl(subject.name, 'no'), ' ', hl('=', 'o'), ' ',
        hl('require', 'k'), '(', hl(`"${idParts[1]}"`, 's'), ')'
      ];
      switch (idParts[2]) {
      case '.':
        reqParts.push('.', hl(idParts[3], 'na'));
        break;
      case '::':
        const ref = json[idParts[1]];
        if (ref)
          reqParts[2].textContent = ref.subject.name;
      }
      reqParts.push(';');
      const requireLine = Dom.h({class: 'jsdoc-require highlight', div: reqParts});

      const functions = newInstance ? [buildConstructor(
        api, subject, newInstance, requireLine
      )] : [];

      util.isObjEmpty(customMethods) ||
        util.append(functions, buildMethods(api, subject, customMethods, requireLine, 'custom'));
      util.isObjEmpty(methods) ||
        util.append(functions, buildMethods(api, subject, methods, requireLine));
      util.isObjEmpty(protoMethods) ||
        util.append(functions, buildMethods(api, subject, protoMethods, requireLine, 'proto'));

      const linkNav = {nav: functions.map(
        func => func && Dom.h({a: func.$name, $href: '#'+func.id})
      )};

      linkModules.push([id, linkNav]);
      const abstractMap = {};
      const abstract = jsdocToHtml(api, subject.abstract, abstractMap);
      const configMap = abstractMap[':config:'];
      let config;
      if (configMap) {
        config = {class: 'jsdoc-config', table: [
          {tr: {$colspan: 2, td: {h1: 'Config'}}},
          ...Object.keys(configMap).sort().map(key => Dom.h({
            class: 'jsdoc-config-item',
            tr: [{td: key}, {td: configMap[key]}]
          }))
        ]};
      }

      let properties = util.isObjEmpty(api.properties) ? [] :
            buildProperties(api, subject, api.properties);

      util.isObjEmpty(api.protoProperties) ||
        (properties = properties.concat(buildProperties(api, subject, api.protoProperties, 'proto')));

      pages.appendChild(Dom.h({
        id,
        '$data-env': env(api),
        class: /::/.test(id) ? "jsdoc-module jsdoc-innerSubject" : "jsdoc-module",
        section: [
          {class: 'jsdoc-module-path', a: id, $href: '#'+id},
          {class: 'jsdoc-module-title searchable', h1: subject.name},
          {abstract},
          {class: 'jsdoc-module-sidebar', aside},
          {div: [
            config,
            properties.length && {class: 'jsdoc-properties', div: [
              {h1: 'Properties'},
              {table: {tbody: properties}}
            ]},
            functions.length && {class: 'jsdoc-methods', div: [
              {h1: "Methods"},
              {div: functions},
            ]},
            innerSubjects && buildInnerSubjects(api, innerSubjects, linkNav),
          ]},
          // {pre: JSON.stringify(json, null, 2)}
        ],
      }));
    });

    buildLinks(links, linkModules);

    return index.innerHTML;
  };