| ... | @@ -1,34 +1,42 @@ | ... | @@ -1,34 +1,42 @@ |
| 1 | "use strict"; | 1 | "use strict"; |
| 2 | | 2 | |
| 3 | var zigAnalysis; | 3 | var zigAnalysis; |
| | 4 | let skipNextHashChange = null; |
| 4 | | 5 | |
| 5 | const NAV_MODES = { | 6 | const NAV_MODES = { |
| 6 | API: "#A;", | 7 | API: "#A;", |
| 7 | GUIDES: "#G;", | 8 | GUIDES: "#G;", |
| 8 | }; | 9 | }; |
| 9 | | 10 | |
| | 11 | |
| | 12 | var scrollHistory = {}; |
| | 13 | |
| 10 | (function() { | 14 | (function() { |
| 11 | const domBanner = document.getElementById("banner"); | 15 | const domBanner = document.getElementById("banner"); |
| 12 | const domMain = document.getElementById("main"); | 16 | const domMain = document.getElementById("main"); |
| 13 | const domStatus = document.getElementById("status"); | 17 | const domStatus = document.getElementById("status"); |
| 14 | const domSectNav = document.getElementById("sectNav"); | 18 | const domSectNavAPI = document.getElementById("sectNavAPI"); |
| 15 | const domListNav = document.getElementById("listNav"); | 19 | const domListNavAPI = document.getElementById("listNavAPI"); |
| | 20 | const domSectNavGuides = document.getElementById("sectNavGuides"); |
| | 21 | const domListNavGuides = document.getElementById("listNavGuides"); |
| 16 | const domApiSwitch = document.getElementById("ApiSwitch"); | 22 | const domApiSwitch = document.getElementById("ApiSwitch"); |
| 17 | const domGuideSwitch = document.getElementById("guideSwitch"); | 23 | const domGuideSwitch = document.getElementById("guideSwitch"); |
| 18 | const domGuidesMenu = document.getElementById("guidesMenu"); | 24 | const domGuidesMenu = document.getElementById("guidesMenu"); |
| 19 | const domApiMenu = document.getElementById("apiMenu"); | 25 | const domGuidesMenuTitle = document.getElementById("guidesMenuTitle"); |
| 20 | const domGuidesList = document.getElementById("guidesList"); | 26 | const domGuideTocList = document.getElementById("guideTocList"); |
| 21 | const domSectMainMod = document.getElementById("sectMainMod"); | 27 | const domGuideTocListEmtpy = document.getElementById("guideTocListEmpty"); |
| 22 | const domSectMods = document.getElementById("sectMods"); | | |
| 23 | const domListMods = document.getElementById("listMods"); | 28 | const domListMods = document.getElementById("listMods"); |
| 24 | const domSectTypes = document.getElementById("sectTypes"); | 29 | const domSectTypes = document.getElementById("sectTypes"); |
| 25 | const domListTypes = document.getElementById("listTypes"); | 30 | const domListTypesLeft = document.getElementById("listTypesLeft"); |
| | 31 | const domListTypesRight = document.getElementById("listTypesRight"); |
| 26 | const domSectTests = document.getElementById("sectTests"); | 32 | const domSectTests = document.getElementById("sectTests"); |
| 27 | const domListTests = document.getElementById("listTests"); | 33 | const domListTests = document.getElementById("listTests"); |
| 28 | const domSectDocTests = document.getElementById("sectDocTests"); | 34 | const domSectDocTests = document.getElementById("sectDocTests"); |
| 29 | const domDocTestsCode = document.getElementById("docTestsCode"); | 35 | const domDocTestsCode = document.getElementById("docTestsCode"); |
| 30 | const domSectNamespaces = document.getElementById("sectNamespaces"); | 36 | const domSectNamespaces = document.getElementById("sectNamespaces"); |
| 31 | const domListNamespaces = document.getElementById("listNamespaces"); | 37 | const domListNamespacesLeft = document.getElementById("listNamespacesLeft"); |
| | 38 | const domListNamespacesRight = document.getElementById("listNamespacesRight"); |
| | 39 | const domNoDocsNamespaces = document.getElementById("noDocsNamespaces"); |
| 32 | const domSectErrSets = document.getElementById("sectErrSets"); | 40 | const domSectErrSets = document.getElementById("sectErrSets"); |
| 33 | const domListErrSets = document.getElementById("listErrSets"); | 41 | const domListErrSets = document.getElementById("listErrSets"); |
| 34 | const domSectFns = document.getElementById("sectFns"); | 42 | const domSectFns = document.getElementById("sectFns"); |
| ... | @@ -54,16 +62,17 @@ const NAV_MODES = { | ... | @@ -54,16 +62,17 @@ const NAV_MODES = { |
| 54 | const domFnNoExamples = document.getElementById("fnNoExamples"); | 62 | const domFnNoExamples = document.getElementById("fnNoExamples"); |
| 55 | const domDeclNoRef = document.getElementById("declNoRef"); | 63 | const domDeclNoRef = document.getElementById("declNoRef"); |
| 56 | const domSearch = document.getElementById("search"); | 64 | const domSearch = document.getElementById("search"); |
| | 65 | const domSearchHelp = document.getElementById("searchHelp"); |
| 57 | const domSearchHelpSummary = document.getElementById("searchHelpSummary"); | 66 | const domSearchHelpSummary = document.getElementById("searchHelpSummary"); |
| 58 | const domSectSearchResults = document.getElementById("sectSearchResults"); | 67 | const domSectSearchResults = document.getElementById("sectSearchResults"); |
| 59 | const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink"); | 68 | const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink"); |
| 60 | const domDocs = document.getElementById("docs"); | 69 | const domDocs = document.getElementById("docs"); |
| | 70 | const domDocsScroll = document.getElementById("docs-scroll"); |
| 61 | const domGuidesSection = document.getElementById("guides"); | 71 | const domGuidesSection = document.getElementById("guides"); |
| 62 | const domActiveGuide = document.getElementById("activeGuide"); | 72 | const domActiveGuide = document.getElementById("activeGuide"); |
| 63 | | 73 | |
| 64 | const domListSearchResults = document.getElementById("listSearchResults"); | 74 | const domListSearchResults = document.getElementById("listSearchResults"); |
| 65 | const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); | 75 | const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); |
| 66 | const domSectInfo = document.getElementById("sectInfo"); | | |
| 67 | // const domTdTarget = (document.getElementById("tdTarget")); | 76 | // const domTdTarget = (document.getElementById("tdTarget")); |
| 68 | const domTdZigVer = document.getElementById("tdZigVer"); | 77 | const domTdZigVer = document.getElementById("tdZigVer"); |
| 69 | const domHdrName = document.getElementById("hdrName"); | 78 | const domHdrName = document.getElementById("hdrName"); |
| ... | @@ -80,6 +89,15 @@ const NAV_MODES = { | ... | @@ -80,6 +89,15 @@ const NAV_MODES = { |
| 80 | | 89 | |
| 81 | domPrefSlashSearch.addEventListener("change", () => setPrefSlashSearch(domPrefSlashSearch.checked)); | 90 | domPrefSlashSearch.addEventListener("change", () => setPrefSlashSearch(domPrefSlashSearch.checked)); |
| 82 | | 91 | |
| | 92 | const scrollMonitor = [ |
| | 93 | domActiveGuide, |
| | 94 | domGuideTocList, |
| | 95 | domDocsScroll, |
| | 96 | domSectSearchResults, |
| | 97 | ]; |
| | 98 | |
| | 99 | computeGuideHashes(); |
| | 100 | |
| 83 | let searchTimer = null; | 101 | let searchTimer = null; |
| 84 | let searchTrimResults = true; | 102 | let searchTrimResults = true; |
| 85 | | 103 | |
| ... | @@ -107,8 +125,10 @@ const NAV_MODES = { | ... | @@ -107,8 +125,10 @@ const NAV_MODES = { |
| 107 | let canonTypeDecls = null; // lazy; use getCanonTypeDecl | 125 | let canonTypeDecls = null; // lazy; use getCanonTypeDecl |
| 108 | | 126 | |
| 109 | let curNav = { | 127 | let curNav = { |
| | 128 | hash: "", |
| 110 | mode: NAV_MODES.API, | 129 | mode: NAV_MODES.API, |
| 111 | activeGuide: "", | 130 | activeGuide: "", |
| | 131 | activeGuideScrollTo: null, |
| 112 | // each element is a module name, e.g. @import("a") then within there @import("b") | 132 | // each element is a module name, e.g. @import("a") then within there @import("b") |
| 113 | // starting implicitly from root module | 133 | // starting implicitly from root module |
| 114 | modNames: [], | 134 | modNames: [], |
| ... | @@ -423,6 +443,71 @@ const NAV_MODES = { | ... | @@ -423,6 +443,71 @@ const NAV_MODES = { |
| 423 | // console.assert(false); | 443 | // console.assert(false); |
| 424 | // return ({}); | 444 | // return ({}); |
| 425 | // } | 445 | // } |
| | 446 | function detectDeclPath(text, context) { |
| | 447 | let result = ""; |
| | 448 | let separator = ":"; |
| | 449 | const components = text.split("."); |
| | 450 | let curDeclOrType = undefined; |
| | 451 | |
| | 452 | let curContext = context; |
| | 453 | let limit = 10000; |
| | 454 | while (curContext) { |
| | 455 | limit -= 1; |
| | 456 | |
| | 457 | if (limit == 0) { |
| | 458 | throw "too many iterations"; |
| | 459 | } |
| | 460 | |
| | 461 | curDeclOrType = findSubDecl(curContext, components[0]); |
| | 462 | |
| | 463 | if (!curDeclOrType) { |
| | 464 | if (curContext.parent_container == null) break; |
| | 465 | curContext = getType(curContext.parent_container); |
| | 466 | continue; |
| | 467 | } |
| | 468 | |
| | 469 | if (curContext == context) { |
| | 470 | separator = '.'; |
| | 471 | result = location.hash + separator + components[0]; |
| | 472 | } else { |
| | 473 | // We had to go up, which means we need a new path! |
| | 474 | const canonPath = getCanonDeclPath(curDeclOrType.find_subdecl_idx); |
| | 475 | if (!canonPath) return; |
| | 476 | |
| | 477 | let lastModName = canonPath.modNames[canonPath.modNames.length - 1]; |
| | 478 | let fullPath = lastModName + ":" + canonPath.declNames.join("."); |
| | 479 | |
| | 480 | separator = '.'; |
| | 481 | result = "#A;" + fullPath; |
| | 482 | } |
| | 483 | |
| | 484 | break; |
| | 485 | } |
| | 486 | |
| | 487 | if (!curDeclOrType) { |
| | 488 | for (let i = 0; i < zigAnalysis.modules.length; i += 1){ |
| | 489 | const p = zigAnalysis.modules[i]; |
| | 490 | if (p.name == components[0]) { |
| | 491 | curDeclOrType = getType(p.main); |
| | 492 | result += "#A;" + components[0]; |
| | 493 | break; |
| | 494 | } |
| | 495 | } |
| | 496 | } |
| | 497 | |
| | 498 | if (!curDeclOrType) return null; |
| | 499 | |
| | 500 | for (let i = 1; i < components.length; i += 1) { |
| | 501 | curDeclOrType = findSubDecl(curDeclOrType, components[i]); |
| | 502 | if (!curDeclOrType) return null; |
| | 503 | result += separator + components[i]; |
| | 504 | separator = '.'; |
| | 505 | } |
| | 506 | |
| | 507 | return result; |
| | 508 | |
| | 509 | } |
| | 510 | |
| 426 | function renderGuides() { | 511 | function renderGuides() { |
| 427 | renderTitle(); | 512 | renderTitle(); |
| 428 | | 513 | |
| ... | @@ -430,46 +515,17 @@ const NAV_MODES = { | ... | @@ -430,46 +515,17 @@ const NAV_MODES = { |
| 430 | domGuideSwitch.classList.add("active"); | 515 | domGuideSwitch.classList.add("active"); |
| 431 | domApiSwitch.classList.remove("active"); | 516 | domApiSwitch.classList.remove("active"); |
| 432 | domDocs.classList.add("hidden"); | 517 | domDocs.classList.add("hidden"); |
| | 518 | domSectNavAPI.classList.add("hidden"); |
| | 519 | domSectNavGuides.classList.remove("hidden"); |
| 433 | domGuidesSection.classList.remove("hidden"); | 520 | domGuidesSection.classList.remove("hidden"); |
| 434 | domActiveGuide.classList.add("hidden"); | 521 | domActiveGuide.classList.add("hidden"); |
| 435 | domApiMenu.classList.add("hidden"); | | |
| 436 | domSectSearchResults.classList.add("hidden"); | 522 | domSectSearchResults.classList.add("hidden"); |
| 437 | domSectSearchAllResultsLink.classList.add("hidden"); | 523 | domSectSearchAllResultsLink.classList.add("hidden"); |
| 438 | domSectSearchNoResults.classList.add("hidden"); | 524 | domSectSearchNoResults.classList.add("hidden"); |
| 439 | | | |
| 440 | // sidebar guides list | | |
| 441 | const section_list = zigAnalysis.guide_sections; | | |
| 442 | resizeDomList(domGuidesList, section_list.length, '<div><h2><span></span></h2><ul class="modules"></ul></div>'); | | |
| 443 | for (let j = 0; j < section_list.length; j += 1) { | | |
| 444 | const section = section_list[j]; | | |
| 445 | const domSectionName = domGuidesList.children[j].children[0].children[0]; | | |
| 446 | const domGuides = domGuidesList.children[j].children[1]; | | |
| 447 | domSectionName.textContent = section.name; | | |
| 448 | resizeDomList(domGuides, section.guides.length, '<li><a href="#"></a></li>'); | | |
| 449 | for (let i = 0; i < section.guides.length; i += 1) { | | |
| 450 | const guide = section.guides[i]; | | |
| 451 | let liDom = domGuides.children[i]; | | |
| 452 | let aDom = liDom.children[0]; | | |
| 453 | aDom.textContent = guide.title; | | |
| 454 | aDom.setAttribute("href", NAV_MODES.GUIDES + guide.name); | | |
| 455 | if (guide.name === curNav.activeGuide) { | | |
| 456 | aDom.classList.add("active"); | | |
| 457 | } else { | | |
| 458 | aDom.classList.remove("active"); | | |
| 459 | } | | |
| 460 | } | | |
| 461 | } | | |
| 462 | | | |
| 463 | if (section_list.length > 0) { | | |
| 464 | domGuidesMenu.classList.remove("hidden"); | | |
| 465 | } | | |
| 466 | | | |
| 467 | | | |
| 468 | if (curNavSearch !== "") { | 525 | if (curNavSearch !== "") { |
| 469 | return renderSearchGuides(); | 526 | return renderSearchGuides(); |
| 470 | } | 527 | } |
| 471 | | 528 | |
| 472 | // main content | | |
| 473 | let activeGuide = undefined; | 529 | let activeGuide = undefined; |
| 474 | outer: for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) { | 530 | outer: for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) { |
| 475 | const section = zigAnalysis.guide_sections[i]; | 531 | const section = zigAnalysis.guide_sections[i]; |
| ... | @@ -482,11 +538,137 @@ const NAV_MODES = { | ... | @@ -482,11 +538,137 @@ const NAV_MODES = { |
| 482 | } | 538 | } |
| 483 | } | 539 | } |
| 484 | | 540 | |
| 485 | if (activeGuide == undefined) { | 541 | |
| | 542 | // navigation bar |
| | 543 | |
| | 544 | const guideIndexDom = domListNavGuides.children[0].children[0]; |
| | 545 | const guideDom = domListNavGuides.children[1].children[0]; |
| | 546 | if (activeGuide){ |
| | 547 | guideDom.textContent = activeGuide.title; |
| | 548 | guideDom.setAttribute("href", location.hash); |
| | 549 | guideDom.classList.remove("hidden"); |
| | 550 | guideIndexDom.classList.remove("active"); |
| | 551 | } else { |
| | 552 | guideDom.classList.add("hidden"); |
| | 553 | guideIndexDom.classList.add("active"); |
| | 554 | } |
| | 555 | |
| | 556 | // main content |
| | 557 | domGuidesMenuTitle.textContent = "Table of Contents"; |
| | 558 | if (activeGuide) { |
| | 559 | if (activeGuide.toc != "") { |
| | 560 | domGuideTocList.innerHTML = activeGuide.toc; |
| | 561 | // add js callbacks to all links |
| | 562 | function onLinkClick(ev) { |
| | 563 | const link = ev.target.getAttribute("href"); |
| | 564 | skipNextHashChange = link; |
| | 565 | location.replace(link); |
| | 566 | scrollToHeading(":" + link.split(":")[1], true); |
| | 567 | ev.preventDefault(); |
| | 568 | ev.stopPropagation(); |
| | 569 | } |
| | 570 | for (let a of domGuideTocList.querySelectorAll("a")) { |
| | 571 | a.addEventListener('click', onLinkClick, false); |
| | 572 | } |
| | 573 | domGuideTocList.classList.remove("hidden"); |
| | 574 | domGuideTocListEmtpy.classList.add("hidden"); |
| | 575 | } else { |
| | 576 | domGuideTocListEmtpy.classList.remove("hidden"); |
| | 577 | domGuideTocList.classList.add("hidden"); |
| | 578 | } |
| | 579 | |
| | 580 | let reader = new commonmark.Parser({ |
| | 581 | smart: true, |
| | 582 | autoDoc: { |
| | 583 | detectDeclPath: detectDeclPath, |
| | 584 | } |
| | 585 | }); |
| | 586 | let ast = reader.parse(activeGuide.body); |
| | 587 | let writer = new commonmark.HtmlRenderer(); |
| | 588 | let result = writer.render(ast); |
| | 589 | domActiveGuide.innerHTML = result; |
| | 590 | if (curNav.activeGuideScrollTo !== null) { |
| | 591 | scrollToHeading(curNav.activeGuideScrollTo, false); |
| | 592 | } |
| | 593 | } else { |
| | 594 | domGuideTocList.classList.add("hidden"); |
| | 595 | domGuideTocListEmtpy.classList.remove("hidden"); |
| | 596 | |
| | 597 | if (zigAnalysis.guide_sections.length > 1 || (zigAnalysis.guide_sections[0].guides.length > 0)) { |
| | 598 | renderGuidesIndex(); |
| | 599 | } else { |
| | 600 | noGuidesAtAll(); |
| | 601 | } |
| | 602 | } |
| | 603 | |
| | 604 | domGuidesMenu.classList.remove("hidden"); |
| | 605 | domActiveGuide.classList.remove("hidden"); |
| | 606 | } |
| | 607 | |
| | 608 | // TODO: ensure unique hashes |
| | 609 | // TODO: hash also guides and their headings |
| | 610 | function computeGuideHashes() { |
| | 611 | for (let i = 1; i < zigAnalysis.guide_sections.length; i += 1) { |
| | 612 | const section = zigAnalysis.guide_sections[i]; |
| | 613 | section.hash = "section-" + slugify(section.name || i); |
| | 614 | } |
| | 615 | } |
| | 616 | |
| | 617 | function renderGuidesIndex() { |
| | 618 | // main content |
| | 619 | { |
| | 620 | let html = ""; |
| | 621 | for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) { |
| | 622 | const section = zigAnalysis.guide_sections[i]; |
| | 623 | if (i != 0) { // first section is the default section |
| | 624 | html += "<h2 id='"+ section.hash +"'>" + section.name + "</h2>"; |
| | 625 | } |
| | 626 | for (let guide of section.guides) { |
| | 627 | html += "<ol><li><a href='"+ NAV_MODES.GUIDES + guide.name +"'>" + (guide.title || guide.name) + "</a></li>"; |
| | 628 | html += guide.toc + "</ol>"; |
| | 629 | } |
| | 630 | } |
| | 631 | domActiveGuide.innerHTML = html; |
| | 632 | } |
| | 633 | |
| | 634 | // sidebar / fast navigation |
| | 635 | { |
| | 636 | domGuidesMenuTitle.textContent = "Sections"; |
| | 637 | if (zigAnalysis.guide_sections.length > 1) { |
| | 638 | let html = ""; |
| | 639 | for (let i = 1; i < zigAnalysis.guide_sections.length; i += 1) { |
| | 640 | const section = zigAnalysis.guide_sections[i]; |
| | 641 | html += "<li><a href='"+ NAV_MODES.GUIDES + ":" + section.hash +"'>" + section.name + "</a></li>"; |
| | 642 | } |
| | 643 | domGuideTocList.innerHTML = "<ul>"+html+"</ul>"; |
| | 644 | |
| | 645 | function onLinkClick(ev) { |
| | 646 | const link = ev.target.getAttribute("href"); |
| | 647 | skipNextHashChange = link; |
| | 648 | location.replace(link); |
| | 649 | scrollToHeading(link.split(":")[1], true); |
| | 650 | ev.preventDefault(); |
| | 651 | ev.stopPropagation(); |
| | 652 | } |
| | 653 | for (let a of domGuideTocList.querySelectorAll("a")) { |
| | 654 | a.addEventListener('click', onLinkClick, false); |
| | 655 | } |
| | 656 | |
| | 657 | domGuideTocList.classList.remove("hidden"); |
| | 658 | domGuideTocListEmtpy.classList.add("hidden"); |
| | 659 | } else { |
| | 660 | domGuideTocList.classList.add("hidden"); |
| | 661 | domGuideTocListEmtpy.classList.remove("hidden"); |
| | 662 | } |
| | 663 | } |
| | 664 | } |
| | 665 | |
| | 666 | function noGuidesAtAll() { |
| 486 | const root_file_idx = zigAnalysis.modules[zigAnalysis.rootMod].file; | 667 | const root_file_idx = zigAnalysis.modules[zigAnalysis.rootMod].file; |
| 487 | const root_file_name = getFile(root_file_idx).name; | 668 | const root_file_name = getFile(root_file_idx).name; |
| 488 | domActiveGuide.innerHTML = markdown(` | 669 | let reader = new commonmark.Parser({smart: true}); |
| 489 | # Zig Guides | 670 | let ast = reader.parse(` |
| | 671 | # No Guides |
| 490 | These autodocs don't contain any guide. | 672 | These autodocs don't contain any guide. |
| 491 | | 673 | |
| 492 | While the API section is a reference guide autogenerated from Zig source code, | 674 | While the API section is a reference guide autogenerated from Zig source code, |
| ... | @@ -520,10 +702,11 @@ You can also create sections to group guides together: | ... | @@ -520,10 +702,11 @@ You can also create sections to group guides together: |
| 520 | | 702 | |
| 521 | Happy writing! | 703 | Happy writing! |
| 522 | `); | 704 | `); |
| 523 | } else { | 705 | |
| 524 | domActiveGuide.innerHTML = markdown(activeGuide.body); | 706 | let writer = new commonmark.HtmlRenderer(); |
| 525 | } | 707 | let result = writer.render(ast); |
| 526 | domActiveGuide.classList.remove("hidden"); | 708 | domActiveGuide.innerHTML = result; |
| | 709 | |
| 527 | } | 710 | } |
| 528 | | 711 | |
| 529 | function renderApi() { | 712 | function renderApi() { |
| ... | @@ -531,29 +714,28 @@ Happy writing! | ... | @@ -531,29 +714,28 @@ Happy writing! |
| 531 | domApiSwitch.classList.add("active"); | 714 | domApiSwitch.classList.add("active"); |
| 532 | domGuideSwitch.classList.remove("active"); | 715 | domGuideSwitch.classList.remove("active"); |
| 533 | domGuidesSection.classList.add("hidden"); | 716 | domGuidesSection.classList.add("hidden"); |
| | 717 | domSectNavAPI.classList.remove("hidden"); |
| | 718 | domSectNavGuides.classList.add("hidden"); |
| 534 | domDocs.classList.remove("hidden"); | 719 | domDocs.classList.remove("hidden"); |
| 535 | domApiMenu.classList.remove("hidden"); | | |
| 536 | domGuidesMenu.classList.add("hidden"); | 720 | domGuidesMenu.classList.add("hidden"); |
| 537 | | | |
| 538 | domStatus.classList.add("hidden"); | 721 | domStatus.classList.add("hidden"); |
| 539 | domFnProto.classList.add("hidden"); | 722 | domFnProto.classList.add("hidden"); |
| 540 | domSectParams.classList.add("hidden"); | 723 | domSectParams.classList.add("hidden"); |
| 541 | domTldDocs.classList.add("hidden"); | 724 | domTldDocs.classList.add("hidden"); |
| 542 | domSectMainMod.classList.add("hidden"); | | |
| 543 | domSectMods.classList.add("hidden"); | | |
| 544 | domSectTypes.classList.add("hidden"); | 725 | domSectTypes.classList.add("hidden"); |
| 545 | domSectTests.classList.add("hidden"); | 726 | domSectTests.classList.add("hidden"); |
| 546 | domSectDocTests.classList.add("hidden"); | 727 | domSectDocTests.classList.add("hidden"); |
| 547 | domSectNamespaces.classList.add("hidden"); | 728 | domSectNamespaces.classList.add("hidden"); |
| | 729 | domListNamespacesLeft.classList.add("hidden"); |
| | 730 | domListNamespacesRight.classList.add("hidden"); |
| | 731 | domNoDocsNamespaces.classList.add("hidden"); |
| 548 | domSectErrSets.classList.add("hidden"); | 732 | domSectErrSets.classList.add("hidden"); |
| 549 | domSectFns.classList.add("hidden"); | 733 | domSectFns.classList.add("hidden"); |
| 550 | domSectFields.classList.add("hidden"); | 734 | domSectFields.classList.add("hidden"); |
| 551 | domSectSearchResults.classList.add("hidden"); | 735 | domSectSearchResults.classList.add("hidden"); |
| 552 | domSectSearchAllResultsLink.classList.add("hidden"); | 736 | domSectSearchAllResultsLink.classList.add("hidden"); |
| 553 | domSectSearchNoResults.classList.add("hidden"); | 737 | domSectSearchNoResults.classList.add("hidden"); |
| 554 | domSectInfo.classList.add("hidden"); | | |
| 555 | domHdrName.classList.add("hidden"); | 738 | domHdrName.classList.add("hidden"); |
| 556 | domSectNav.classList.add("hidden"); | | |
| 557 | domSectFnErrors.classList.add("hidden"); | 739 | domSectFnErrors.classList.add("hidden"); |
| 558 | domFnExamples.classList.add("hidden"); | 740 | domFnExamples.classList.add("hidden"); |
| 559 | domFnNoExamples.classList.add("hidden"); | 741 | domFnNoExamples.classList.add("hidden"); |
| ... | @@ -564,8 +746,6 @@ Happy writing! | ... | @@ -564,8 +746,6 @@ Happy writing! |
| 564 | domSectValues.classList.add("hidden"); | 746 | domSectValues.classList.add("hidden"); |
| 565 | | 747 | |
| 566 | renderTitle(); | 748 | renderTitle(); |
| 567 | renderInfo(); | | |
| 568 | renderModList(); | | |
| 569 | | 749 | |
| 570 | if (curNavSearch !== "") { | 750 | if (curNavSearch !== "") { |
| 571 | return renderSearchAPI(); | 751 | return renderSearchAPI(); |
| ... | @@ -870,7 +1050,7 @@ Happy writing! | ... | @@ -870,7 +1050,7 @@ Happy writing! |
| 870 | | 1050 | |
| 871 | function renderNav() { | 1051 | function renderNav() { |
| 872 | let len = curNav.modNames.length + curNav.declNames.length; | 1052 | let len = curNav.modNames.length + curNav.declNames.length; |
| 873 | resizeDomList(domListNav, len, '<li><a href="#"></a></li>'); | 1053 | resizeDomList(domListNavAPI, len, '<li><a href="#"></a></li>'); |
| 874 | let list = []; | 1054 | let list = []; |
| 875 | let hrefModNames = []; | 1055 | let hrefModNames = []; |
| 876 | let hrefDeclNames = []; | 1056 | let hrefDeclNames = []; |
| ... | @@ -891,7 +1071,7 @@ Happy writing! | ... | @@ -891,7 +1071,7 @@ Happy writing! |
| 891 | } | 1071 | } |
| 892 | | 1072 | |
| 893 | for (let i = 0; i < list.length; i += 1) { | 1073 | for (let i = 0; i < list.length; i += 1) { |
| 894 | let liDom = domListNav.children[i]; | 1074 | let liDom = domListNavAPI.children[i]; |
| 895 | let aDom = liDom.children[0]; | 1075 | let aDom = liDom.children[0]; |
| 896 | aDom.textContent = list[i].name; | 1076 | aDom.textContent = list[i].name; |
| 897 | aDom.setAttribute("href", list[i].link); | 1077 | aDom.setAttribute("href", list[i].link); |
| ... | @@ -902,67 +1082,60 @@ Happy writing! | ... | @@ -902,67 +1082,60 @@ Happy writing! |
| 902 | } | 1082 | } |
| 903 | } | 1083 | } |
| 904 | | 1084 | |
| 905 | domSectNav.classList.remove("hidden"); | | |
| 906 | } | 1085 | } |
| 907 | | 1086 | |
| 908 | function renderInfo() { | | |
| 909 | domTdZigVer.textContent = zigAnalysis.params.zigVersion; | | |
| 910 | //domTdTarget.textContent = zigAnalysis.params.builds[0].target; | | |
| 911 | | | |
| 912 | domSectInfo.classList.remove("hidden"); | | |
| 913 | } | | |
| 914 | | 1087 | |
| 915 | function render404() { | 1088 | function render404() { |
| 916 | domStatus.textContent = "404 Not Found"; | 1089 | domStatus.textContent = "404 Not Found"; |
| 917 | domStatus.classList.remove("hidden"); | 1090 | domStatus.classList.remove("hidden"); |
| 918 | } | 1091 | } |
| 919 | | 1092 | |
| 920 | function renderModList() { | 1093 | // function renderModList() { |
| 921 | const rootMod = zigAnalysis.modules[zigAnalysis.rootMod]; | 1094 | // const rootMod = zigAnalysis.modules[zigAnalysis.rootMod]; |
| 922 | let list = []; | 1095 | // let list = []; |
| 923 | for (let key in rootMod.table) { | 1096 | // for (let key in rootMod.table) { |
| 924 | let modIndex = rootMod.table[key]; | 1097 | // let modIndex = rootMod.table[key]; |
| 925 | if (zigAnalysis.modules[modIndex] == null) continue; | 1098 | // if (zigAnalysis.modules[modIndex] == null) continue; |
| 926 | if (key == rootMod.name) continue; | 1099 | // if (key == rootMod.name) continue; |
| 927 | list.push({ | 1100 | // list.push({ |
| 928 | name: key, | 1101 | // name: key, |
| 929 | mod: modIndex, | 1102 | // mod: modIndex, |
| 930 | }); | 1103 | // }); |
| 931 | } | 1104 | // } |
| 932 | | 1105 | |
| 933 | { | 1106 | // { |
| 934 | let aDom = domSectMainMod.children[1].children[0].children[0]; | 1107 | // let aDom = domSectMainMod.children[1].children[0].children[0]; |
| 935 | aDom.textContent = rootMod.name; | 1108 | // aDom.textContent = rootMod.name; |
| 936 | aDom.setAttribute("href", navLinkMod(zigAnalysis.rootMod)); | 1109 | // aDom.setAttribute("href", navLinkMod(zigAnalysis.rootMod)); |
| 937 | if (rootMod.name === curNav.modNames[0]) { | 1110 | // if (rootMod.name === curNav.modNames[0]) { |
| 938 | aDom.classList.add("active"); | 1111 | // aDom.classList.add("active"); |
| 939 | } else { | 1112 | // } else { |
| 940 | aDom.classList.remove("active"); | 1113 | // aDom.classList.remove("active"); |
| 941 | } | 1114 | // } |
| 942 | domSectMainMod.classList.remove("hidden"); | 1115 | // domSectMainMod.classList.remove("hidden"); |
| 943 | } | 1116 | // } |
| 944 | | 1117 | |
| 945 | list.sort(function(a, b) { | 1118 | // list.sort(function (a, b) { |
| 946 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); | 1119 | // return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 947 | }); | 1120 | // }); |
| 948 | | 1121 | |
| 949 | if (list.length !== 0) { | 1122 | // if (list.length !== 0) { |
| 950 | resizeDomList(domListMods, list.length, '<li><a href="#"></a></li>'); | 1123 | // resizeDomList(domListMods, list.length, '<li><a href="#"></a></li>'); |
| 951 | for (let i = 0; i < list.length; i += 1) { | 1124 | // for (let i = 0; i < list.length; i += 1) { |
| 952 | let liDom = domListMods.children[i]; | 1125 | // let liDom = domListMods.children[i]; |
| 953 | let aDom = liDom.children[0]; | 1126 | // let aDom = liDom.children[0]; |
| 954 | aDom.textContent = list[i].name; | 1127 | // aDom.textContent = list[i].name; |
| 955 | aDom.setAttribute("href", navLinkMod(list[i].mod)); | 1128 | // aDom.setAttribute("href", navLinkMod(list[i].mod)); |
| 956 | if (list[i].name === curNav.modNames[0]) { | 1129 | // if (list[i].name === curNav.modNames[0]) { |
| 957 | aDom.classList.add("active"); | 1130 | // aDom.classList.add("active"); |
| 958 | } else { | 1131 | // } else { |
| 959 | aDom.classList.remove("active"); | 1132 | // aDom.classList.remove("active"); |
| 960 | } | 1133 | // } |
| 961 | } | 1134 | // } |
| 962 | | 1135 | |
| 963 | domSectMods.classList.remove("hidden"); | 1136 | // domSectMods.classList.remove("hidden"); |
| 964 | } | 1137 | // } |
| 965 | } | 1138 | // } |
| 966 | | 1139 | |
| 967 | function navLink(modNames, declNames, callName) { | 1140 | function navLink(modNames, declNames, callName) { |
| 968 | let base = curNav.mode; | 1141 | let base = curNav.mode; |
| ... | @@ -2525,7 +2698,8 @@ Happy writing! | ... | @@ -2525,7 +2698,8 @@ Happy writing! |
| 2525 | function categorizeDecls( | 2698 | function categorizeDecls( |
| 2526 | decls, | 2699 | decls, |
| 2527 | typesList, | 2700 | typesList, |
| 2528 | namespacesList, | 2701 | namespacesWithDocsList, |
| | 2702 | namespacesNoDocsList, |
| 2529 | errSetsList, | 2703 | errSetsList, |
| 2530 | fnsList, | 2704 | fnsList, |
| 2531 | varsList, | 2705 | varsList, |
| ... | @@ -2562,7 +2736,11 @@ Happy writing! | ... | @@ -2562,7 +2736,11 @@ Happy writing! |
| 2562 | if (typeIsErrSet(declValue.expr.type)) { | 2736 | if (typeIsErrSet(declValue.expr.type)) { |
| 2563 | errSetsList.push(decl); | 2737 | errSetsList.push(decl); |
| 2564 | } else if (typeIsStructWithNoFields(declValue.expr.type)) { | 2738 | } else if (typeIsStructWithNoFields(declValue.expr.type)) { |
| 2565 | namespacesList.push(decl); | 2739 | if (getAstNode(decl.src).docs) { |
| | 2740 | namespacesWithDocsList.push(decl); |
| | 2741 | } else { |
| | 2742 | namespacesNoDocsList.push(decl); |
| | 2743 | } |
| 2566 | } else { | 2744 | } else { |
| 2567 | typesList.push(decl); | 2745 | typesList.push(decl); |
| 2568 | } | 2746 | } |
| ... | @@ -2573,7 +2751,11 @@ Happy writing! | ... | @@ -2573,7 +2751,11 @@ Happy writing! |
| 2573 | if (typeIsErrSet(declValue.expr.type)) { | 2751 | if (typeIsErrSet(declValue.expr.type)) { |
| 2574 | errSetsList.push(decl); | 2752 | errSetsList.push(decl); |
| 2575 | } else if (typeIsStructWithNoFields(declValue.expr.type)) { | 2753 | } else if (typeIsStructWithNoFields(declValue.expr.type)) { |
| 2576 | namespacesList.push(decl); | 2754 | if (getAstNode(decl.src).docs) { |
| | 2755 | namespacesWithDocsList.push(decl); |
| | 2756 | } else { |
| | 2757 | namespacesNoDocsList.push(decl); |
| | 2758 | } |
| 2577 | } else { | 2759 | } else { |
| 2578 | typesList.push(decl); | 2760 | typesList.push(decl); |
| 2579 | } | 2761 | } |
| ... | @@ -2608,7 +2790,8 @@ Happy writing! | ... | @@ -2608,7 +2790,8 @@ Happy writing! |
| 2608 | function renderContainer(container) { | 2790 | function renderContainer(container) { |
| 2609 | let typesList = []; | 2791 | let typesList = []; |
| 2610 | | 2792 | |
| 2611 | let namespacesList = []; | 2793 | let namespacesWithDocsList = []; |
| | 2794 | let namespacesNoDocsList = []; |
| 2612 | | 2795 | |
| 2613 | let errSetsList = []; | 2796 | let errSetsList = []; |
| 2614 | | 2797 | |
| ... | @@ -2625,7 +2808,8 @@ Happy writing! | ... | @@ -2625,7 +2808,8 @@ Happy writing! |
| 2625 | categorizeDecls( | 2808 | categorizeDecls( |
| 2626 | container.pubDecls, | 2809 | container.pubDecls, |
| 2627 | typesList, | 2810 | typesList, |
| 2628 | namespacesList, | 2811 | namespacesWithDocsList, |
| | 2812 | namespacesNoDocsList, |
| 2629 | errSetsList, | 2813 | errSetsList, |
| 2630 | fnsList, | 2814 | fnsList, |
| 2631 | varsList, | 2815 | varsList, |
| ... | @@ -2637,7 +2821,8 @@ Happy writing! | ... | @@ -2637,7 +2821,8 @@ Happy writing! |
| 2637 | categorizeDecls( | 2821 | categorizeDecls( |
| 2638 | container.privDecls, | 2822 | container.privDecls, |
| 2639 | typesList, | 2823 | typesList, |
| 2640 | namespacesList, | 2824 | namespacesWithDocsList, |
| | 2825 | namespacesNoDocsList, |
| 2641 | errSetsList, | 2826 | errSetsList, |
| 2642 | fnsList, | 2827 | fnsList, |
| 2643 | varsList, | 2828 | varsList, |
| ... | @@ -2655,7 +2840,8 @@ Happy writing! | ... | @@ -2655,7 +2840,8 @@ Happy writing! |
| 2655 | categorizeDecls( | 2840 | categorizeDecls( |
| 2656 | uns_container.pubDecls, | 2841 | uns_container.pubDecls, |
| 2657 | typesList, | 2842 | typesList, |
| 2658 | namespacesList, | 2843 | namespacesWithDocsList, |
| | 2844 | namespacesNoDocsList, |
| 2659 | errSetsList, | 2845 | errSetsList, |
| 2660 | fnsList, | 2846 | fnsList, |
| 2661 | varsList, | 2847 | varsList, |
| ... | @@ -2667,7 +2853,8 @@ Happy writing! | ... | @@ -2667,7 +2853,8 @@ Happy writing! |
| 2667 | categorizeDecls( | 2853 | categorizeDecls( |
| 2668 | uns_container.privDecls, | 2854 | uns_container.privDecls, |
| 2669 | typesList, | 2855 | typesList, |
| 2670 | namespacesList, | 2856 | namespacesWithDocsList, |
| | 2857 | namespacesNoDocsList, |
| 2671 | errSetsList, | 2858 | errSetsList, |
| 2672 | fnsList, | 2859 | fnsList, |
| 2673 | varsList, | 2860 | varsList, |
| ... | @@ -2678,7 +2865,8 @@ Happy writing! | ... | @@ -2678,7 +2865,8 @@ Happy writing! |
| 2678 | } | 2865 | } |
| 2679 | | 2866 | |
| 2680 | typesList.sort(byNameProperty); | 2867 | typesList.sort(byNameProperty); |
| 2681 | namespacesList.sort(byNameProperty); | 2868 | namespacesWithDocsList.sort(byNameProperty); |
| | 2869 | namespacesNoDocsList.sort(byNameProperty); |
| 2682 | errSetsList.sort(byNameProperty); | 2870 | errSetsList.sort(byNameProperty); |
| 2683 | fnsList.sort(byNameProperty); | 2871 | fnsList.sort(byNameProperty); |
| 2684 | varsList.sort(byNameProperty); | 2872 | varsList.sort(byNameProperty); |
| ... | @@ -2694,36 +2882,91 @@ Happy writing! | ... | @@ -2694,36 +2882,91 @@ Happy writing! |
| 2694 | } | 2882 | } |
| 2695 | | 2883 | |
| 2696 | if (typesList.length !== 0) { | 2884 | if (typesList.length !== 0) { |
| 2697 | resizeDomList( | 2885 | const splitPoint = Math.ceil(typesList.length / 2); |
| 2698 | domListTypes, | 2886 | const template = '<li><a href="#"></a><div></div></li>'; |
| 2699 | typesList.length, | 2887 | resizeDomList(domListTypesLeft, splitPoint, template); |
| 2700 | '<li><a href=""></a></li>' | 2888 | resizeDomList(domListTypesRight, typesList.length - splitPoint, template); |
| 2701 | ); | 2889 | |
| | 2890 | let activeList = domListTypesLeft; |
| | 2891 | let offset = 0; |
| 2702 | for (let i = 0; i < typesList.length; i += 1) { | 2892 | for (let i = 0; i < typesList.length; i += 1) { |
| 2703 | let liDom = domListTypes.children[i]; | 2893 | let liDom = activeList.children[i - offset]; |
| 2704 | let aDom = liDom.children[0]; | 2894 | let aDom = liDom.children[0]; |
| 2705 | let decl = typesList[i]; | 2895 | let decl = typesList[i]; |
| 2706 | aDom.textContent = decl.name; | 2896 | aDom.textContent = decl.name; |
| 2707 | aDom.setAttribute("href", navLinkDecl(decl.name)); | 2897 | aDom.setAttribute("href", navLinkDecl(decl.name)); |
| | 2898 | |
| | 2899 | let descDom = liDom.children[1]; |
| | 2900 | let docs = getAstNode(decl.src).docs; |
| | 2901 | if (docs) { |
| | 2902 | descDom.innerHTML = markdown(shortDesc(getAstNode(decl.src).docs)); |
| | 2903 | } else { |
| | 2904 | descDom.innerHTML = "<p class='understated'><i>No documentation provided.</i></p>"; |
| | 2905 | } |
| | 2906 | if (i == splitPoint - 1) { |
| | 2907 | activeList = domListTypesRight; |
| | 2908 | offset = splitPoint; |
| | 2909 | } |
| 2708 | } | 2910 | } |
| 2709 | domSectTypes.classList.remove("hidden"); | 2911 | domSectTypes.classList.remove("hidden"); |
| 2710 | } | 2912 | } |
| 2711 | if (namespacesList.length !== 0) { | 2913 | |
| | 2914 | if (namespacesWithDocsList.length !== 0) { |
| | 2915 | const splitPoint = Math.ceil(namespacesWithDocsList.length / 2); |
| | 2916 | const template = '<li><a href="#"></a><div></div></li>'; |
| | 2917 | resizeDomList(domListNamespacesLeft, splitPoint, template); |
| | 2918 | resizeDomList(domListNamespacesRight, |
| | 2919 | namespacesWithDocsList.length - splitPoint, |
| | 2920 | template); |
| | 2921 | |
| | 2922 | let activeList = domListNamespacesLeft; |
| | 2923 | let offset = 0; |
| | 2924 | for (let i = 0; i < namespacesWithDocsList.length; i += 1) { |
| | 2925 | let liDom = activeList.children[i - offset]; |
| | 2926 | let aDom = liDom.children[0]; |
| | 2927 | let decl = namespacesWithDocsList[i]; |
| | 2928 | aDom.textContent = decl.name; |
| | 2929 | aDom.setAttribute("href", navLinkDecl(decl.name)); |
| | 2930 | |
| | 2931 | let descDom = liDom.children[1]; |
| | 2932 | descDom.innerHTML = markdown(shortDesc(getAstNode(decl.src).docs)); |
| | 2933 | if (i == splitPoint - 1) { |
| | 2934 | activeList = domListNamespacesRight; |
| | 2935 | offset = splitPoint; |
| | 2936 | } |
| | 2937 | } |
| | 2938 | |
| | 2939 | domListNamespacesLeft.classList.remove("hidden"); |
| | 2940 | domListNamespacesRight.classList.remove("hidden"); |
| | 2941 | domSectNamespaces.classList.remove("hidden"); |
| | 2942 | } |
| | 2943 | |
| | 2944 | if (namespacesNoDocsList.length !== 0) { |
| 2712 | resizeDomList( | 2945 | resizeDomList( |
| 2713 | domListNamespaces, | 2946 | domNoDocsNamespaces, |
| 2714 | namespacesList.length, | 2947 | namespacesNoDocsList.length, |
| 2715 | '<li><a href="#"></a></li>' | 2948 | '<span><a href="#"></a><span></span></span>' |
| 2716 | ); | 2949 | ); |
| 2717 | for (let i = 0; i < namespacesList.length; i += 1) { | 2950 | for (let i = 0; i < namespacesNoDocsList.length; i += 1) { |
| 2718 | let liDom = domListNamespaces.children[i]; | 2951 | let aDom = domNoDocsNamespaces.children[i].children[0]; |
| 2719 | let aDom = liDom.children[0]; | 2952 | let decl = namespacesNoDocsList[i]; |
| 2720 | let decl = namespacesList[i]; | | |
| 2721 | aDom.textContent = decl.name; | 2953 | aDom.textContent = decl.name; |
| 2722 | aDom.setAttribute("href", navLinkDecl(decl.name)); | 2954 | aDom.setAttribute("href", navLinkDecl(decl.name)); |
| | 2955 | let comma = domNoDocsNamespaces.children[i].children[1]; |
| | 2956 | if (i == namespacesNoDocsList.length - 1) { |
| | 2957 | comma.textContent = ""; |
| | 2958 | } else { |
| | 2959 | comma.textContent = ", "; |
| | 2960 | } |
| 2723 | } | 2961 | } |
| | 2962 | |
| | 2963 | domNoDocsNamespaces.classList.remove("hidden"); |
| 2724 | domSectNamespaces.classList.remove("hidden"); | 2964 | domSectNamespaces.classList.remove("hidden"); |
| 2725 | } | 2965 | } |
| 2726 | | 2966 | |
| | 2967 | |
| | 2968 | |
| | 2969 | |
| 2727 | if (errSetsList.length !== 0) { | 2970 | if (errSetsList.length !== 0) { |
| 2728 | resizeDomList( | 2971 | resizeDomList( |
| 2729 | domListErrSets, | 2972 | domListErrSets, |
| ... | @@ -2778,7 +3021,7 @@ Happy writing! | ... | @@ -2778,7 +3021,7 @@ Happy writing! |
| 2778 | tdDesc.innerHTML = markdown(short, container); | 3021 | tdDesc.innerHTML = markdown(short, container); |
| 2779 | } | 3022 | } |
| 2780 | } else { | 3023 | } else { |
| 2781 | tdDesc.innerHTML = "<p><i>No documentation provided.</i><p>"; | 3024 | tdDesc.innerHTML = "<p class='understated'><i>No documentation provided.</i><p>"; |
| 2782 | } | 3025 | } |
| 2783 | } | 3026 | } |
| 2784 | domSectFns.classList.remove("hidden"); | 3027 | domSectFns.classList.remove("hidden"); |
| ... | @@ -3013,12 +3256,15 @@ Happy writing! | ... | @@ -3013,12 +3256,15 @@ Happy writing! |
| 3013 | | 3256 | |
| 3014 | function updateCurNav() { | 3257 | function updateCurNav() { |
| 3015 | curNav = { | 3258 | curNav = { |
| | 3259 | hash: location.hash, |
| 3016 | mode: NAV_MODES.API, | 3260 | mode: NAV_MODES.API, |
| 3017 | modNames: [], | 3261 | modNames: [], |
| 3018 | modObjs: [], | 3262 | modObjs: [], |
| 3019 | declNames: [], | 3263 | declNames: [], |
| 3020 | declObjs: [], | 3264 | declObjs: [], |
| 3021 | callName: null, | 3265 | callName: null, |
| | 3266 | activeGuide: null, |
| | 3267 | activeGuideScrollTo: null, |
| 3022 | }; | 3268 | }; |
| 3023 | curNavSearch = ""; | 3269 | curNavSearch = ""; |
| 3024 | | 3270 | |
| ... | @@ -3039,7 +3285,7 @@ Happy writing! | ... | @@ -3039,7 +3285,7 @@ Happy writing! |
| 3039 | case NAV_MODES.API: | 3285 | case NAV_MODES.API: |
| 3040 | // #A;MODULE:decl.decl.decl?search-term | 3286 | // #A;MODULE:decl.decl.decl?search-term |
| 3041 | curNav.mode = mode; | 3287 | curNav.mode = mode; |
| 3042 | | 3288 | { |
| 3043 | let parts = nonSearchPart.split(":"); | 3289 | let parts = nonSearchPart.split(":"); |
| 3044 | if (parts[0] == "") { | 3290 | if (parts[0] == "") { |
| 3045 | location.hash = DEFAULT_HASH; | 3291 | location.hash = DEFAULT_HASH; |
| ... | @@ -3050,22 +3296,18 @@ Happy writing! | ... | @@ -3050,22 +3296,18 @@ Happy writing! |
| 3050 | if (parts[1] != null) { | 3296 | if (parts[1] != null) { |
| 3051 | curNav.declNames = decodeURIComponent(parts[1]).split("."); | 3297 | curNav.declNames = decodeURIComponent(parts[1]).split("."); |
| 3052 | } | 3298 | } |
| 3053 | | 3299 | } |
| 3054 | return; | 3300 | return; |
| 3055 | case NAV_MODES.GUIDES: | 3301 | case NAV_MODES.GUIDES: |
| | 3302 | curNav.mode = mode; |
| 3056 | | 3303 | |
| 3057 | const sections = zigAnalysis.guide_sections; | 3304 | { |
| 3058 | if (sections.length != 0 && sections[0].guides.length != 0 && nonSearchPart == "") { | 3305 | let parts = nonSearchPart.split(":"); |
| 3059 | location.hash = NAV_MODES.GUIDES + sections[0].guides[0].name; | 3306 | curNav.activeGuide = parts[0]; |
| 3060 | if (qpos != -1) { | 3307 | if (parts[1] != null) { |
| 3061 | location.hash += query.substring(qpos); | 3308 | curNav.activeGuideScrollTo = decodeURIComponent(":" + parts[1]); |
| 3062 | } | 3309 | } |
| 3063 | return; | | |
| 3064 | } | 3310 | } |
| 3065 | | | |
| 3066 | curNav.mode = mode; | | |
| 3067 | curNav.activeGuide = nonSearchPart; | | |
| 3068 | | | |
| 3069 | return; | 3311 | return; |
| 3070 | default: | 3312 | default: |
| 3071 | location.hash = DEFAULT_HASH; | 3313 | location.hash = DEFAULT_HASH; |
| ... | @@ -3073,8 +3315,18 @@ Happy writing! | ... | @@ -3073,8 +3315,18 @@ Happy writing! |
| 3073 | } | 3315 | } |
| 3074 | } | 3316 | } |
| 3075 | | 3317 | |
| 3076 | function onHashChange() { | 3318 | function onHashChange(ev) { |
| | 3319 | scrollHistory[curNav.hash] = scrollMonitor.map(function (x) { |
| | 3320 | return [x, x.scrollTop] |
| | 3321 | }); |
| | 3322 | |
| | 3323 | if (skipNextHashChange == decodeURIComponent(location.hash)) { |
| | 3324 | skipNextHashChange = null; |
| | 3325 | return; |
| | 3326 | } |
| | 3327 | skipNextHashChange = null; |
| 3077 | updateCurNav(); | 3328 | updateCurNav(); |
| | 3329 | |
| 3078 | if (domSearch.value !== curNavSearch) { | 3330 | if (domSearch.value !== curNavSearch) { |
| 3079 | domSearch.value = curNavSearch; | 3331 | domSearch.value = curNavSearch; |
| 3080 | if (domSearch.value.length == 0) | 3332 | if (domSearch.value.length == 0) |
| ... | @@ -3087,6 +3339,22 @@ Happy writing! | ... | @@ -3087,6 +3339,22 @@ Happy writing! |
| 3087 | imFeelingLucky = false; | 3339 | imFeelingLucky = false; |
| 3088 | activateSelectedResult(); | 3340 | activateSelectedResult(); |
| 3089 | } | 3341 | } |
| | 3342 | |
| | 3343 | scroll(); |
| | 3344 | } |
| | 3345 | |
| | 3346 | function scroll() { |
| | 3347 | const cur = scrollHistory[location.hash]; |
| | 3348 | if (cur) { |
| | 3349 | for (let [elem, offset] of cur) { |
| | 3350 | elem.scrollTo(0, offset); |
| | 3351 | } |
| | 3352 | } else { |
| | 3353 | if (curNav.activeGuideScrollTo) return; |
| | 3354 | for (let elem of scrollMonitor) { |
| | 3355 | elem.scrollTo(0, 0); |
| | 3356 | } |
| | 3357 | } |
| 3090 | } | 3358 | } |
| 3091 | | 3359 | |
| 3092 | function findSubDecl(parentTypeOrDecl, childName) { | 3360 | function findSubDecl(parentTypeOrDecl, childName) { |
| ... | @@ -3384,9 +3652,9 @@ Happy writing! | ... | @@ -3384,9 +3652,9 @@ Happy writing! |
| 3384 | let index = trimmed_docs.indexOf("\n\n"); | 3652 | let index = trimmed_docs.indexOf("\n\n"); |
| 3385 | let cut = false; | 3653 | let cut = false; |
| 3386 | | 3654 | |
| 3387 | if (index < 0 || index > 80) { | 3655 | if (index < 0 || index > 130) { |
| 3388 | if (trimmed_docs.length > 80) { | 3656 | if (trimmed_docs.length > 130) { |
| 3389 | index = 80; | 3657 | index = 130; |
| 3390 | cut = true; | 3658 | cut = true; |
| 3391 | } else { | 3659 | } else { |
| 3392 | index = trimmed_docs.length; | 3660 | index = trimmed_docs.length; |
| ... | @@ -3408,31 +3676,118 @@ Happy writing! | ... | @@ -3408,31 +3676,118 @@ Happy writing! |
| 3408 | for (let i = 0; i < section.guides.length; i += 1) { | 3676 | for (let i = 0; i < section.guides.length; i += 1) { |
| 3409 | let reader = new commonmark.Parser({ smart: true }); | 3677 | let reader = new commonmark.Parser({ smart: true }); |
| 3410 | const guide = section.guides[i]; | 3678 | const guide = section.guides[i]; |
| 3411 | const ast = reader.parse(guide.body); | | |
| 3412 | | 3679 | |
| 3413 | // Find the first text thing to use as a sidebar title | 3680 | // Find the first text thing to use as a sidebar title |
| 3414 | guide.title = "[empty guide]"; | 3681 | guide.title = null; |
| | 3682 | guide.toc = ""; |
| | 3683 | |
| | 3684 | // Discover Title & TOC for this guide |
| 3415 | { | 3685 | { |
| | 3686 | let reader = new commonmark.Parser({smart: true}); |
| | 3687 | let ast = reader.parse(guide.body); |
| 3416 | let walker = ast.walker(); | 3688 | let walker = ast.walker(); |
| 3417 | let event, node; | 3689 | let heading_idx = 0; |
| | 3690 | let event, node, doc, last, last_ul; |
| 3418 | while ((event = walker.next())) { | 3691 | while ((event = walker.next())) { |
| 3419 | node = event.node; | 3692 | node = event.node; |
| 3420 | if (node.type === 'text') { | 3693 | if (event.entering) { |
| 3421 | guide.title = node.literal; | 3694 | if (node.type === 'document') { |
| 3422 | break; | 3695 | doc = node; |
| | 3696 | continue; |
| | 3697 | } |
| | 3698 | |
| | 3699 | |
| | 3700 | if (node.next) { |
| | 3701 | walker.resumeAt(node.next, true); |
| | 3702 | } else { |
| | 3703 | walker.resumeAt(node, false); |
| | 3704 | } |
| | 3705 | node.unlink(); |
| | 3706 | |
| | 3707 | if (node.type === 'heading') { |
| | 3708 | if (node.level == 1) { |
| | 3709 | if (guide.title == null) { |
| | 3710 | let doc_node = new commonmark.Node("document", node.sourcepos); |
| | 3711 | while (node.firstChild) { |
| | 3712 | doc_node.appendChild(node.firstChild); |
| | 3713 | } |
| | 3714 | let writer = new commonmark.HtmlRenderer(); |
| | 3715 | let result = writer.render(doc_node); |
| | 3716 | guide.title = result; |
| | 3717 | } |
| | 3718 | |
| | 3719 | continue; // don't index H1 |
| | 3720 | } |
| | 3721 | |
| | 3722 | // turn heading node into list item & add link node to it |
| | 3723 | { |
| | 3724 | node._type = "link"; |
| | 3725 | node.destination = NAV_MODES.GUIDES + guide.name + ":" + heading_idx; |
| | 3726 | heading_idx += 1; |
| | 3727 | let listItem = new commonmark.Node("item", node.sourcepos); |
| | 3728 | // TODO: strip links from inside node |
| | 3729 | listItem.appendChild(node); |
| | 3730 | listItem.level = node.level; |
| | 3731 | node = listItem; |
| | 3732 | } |
| | 3733 | |
| | 3734 | if (last_ul) { |
| | 3735 | // are we inside or outside of it? |
| | 3736 | |
| | 3737 | let target_ul = last_ul; |
| | 3738 | while(target_ul.level > node.level) { |
| | 3739 | target_ul = target_ul.parent; |
| | 3740 | } |
| | 3741 | while(target_ul.level < node.level) { |
| | 3742 | let ul_node = new commonmark.Node("list", node.sourcepos); |
| | 3743 | ul_node.level = target_ul.level + 1; |
| | 3744 | ul_node.listType = "bullet"; |
| | 3745 | ul_node.listStart = null; |
| | 3746 | target_ul.appendChild(ul_node); |
| | 3747 | target_ul = ul_node; |
| | 3748 | } |
| | 3749 | |
| | 3750 | target_ul.appendChild(node); |
| | 3751 | last_ul = target_ul; |
| | 3752 | } else { |
| | 3753 | let ul_node = new commonmark.Node("list", node.sourcepos); |
| | 3754 | ul_node.level = 2; |
| | 3755 | ul_node.listType = "bullet"; |
| | 3756 | ul_node.listStart = null; |
| | 3757 | doc.prependChild(ul_node); |
| | 3758 | |
| | 3759 | while (ul_node.level < node.level) { |
| | 3760 | let current_ul_node = new commonmark.Node("list", node.sourcepos); |
| | 3761 | current_ul_node.level = ul_node.level + 1; |
| | 3762 | current_ul_node.listType = "bullet"; |
| | 3763 | current_ul_node.listStart = null; |
| | 3764 | ul_node.appendChild(current_ul_node); |
| | 3765 | ul_node = current_ul_node; |
| | 3766 | } |
| | 3767 | |
| | 3768 | last_ul = ul_node; |
| | 3769 | |
| | 3770 | ul_node.appendChild(node); |
| 3423 | } | 3771 | } |
| 3424 | } | 3772 | } |
| 3425 | } | 3773 | } |
| | 3774 | } |
| | 3775 | |
| | 3776 | let writer = new commonmark.HtmlRenderer(); |
| | 3777 | let result = writer.render(ast); |
| | 3778 | guide.toc = result; |
| | 3779 | } |
| | 3780 | |
| 3426 | // Index this guide | 3781 | // Index this guide |
| 3427 | { | 3782 | { |
| 3428 | let walker = ast.walker(); | 3783 | // let walker = guide.ast.walker(); |
| 3429 | let event, node; | 3784 | // let event, node; |
| 3430 | while ((event = walker.next())) { | 3785 | // while ((event = walker.next())) { |
| 3431 | node = event.node; | 3786 | // node = event.node; |
| 3432 | if (event.entering == true && node.type === 'text') { | 3787 | // if (event.entering == true && node.type === 'text') { |
| 3433 | indexTextForGuide(j, i, node); | 3788 | // indexTextForGuide(j, i, node); |
| 3434 | } | 3789 | // } |
| 3435 | } | 3790 | // } |
| 3436 | } | 3791 | } |
| 3437 | } | 3792 | } |
| 3438 | } | 3793 | } |
| ... | @@ -3474,70 +3829,70 @@ Happy writing! | ... | @@ -3474,70 +3829,70 @@ Happy writing! |
| 3474 | | 3829 | |
| 3475 | | 3830 | |
| 3476 | | 3831 | |
| 3477 | function detectDeclPath(text, context) { | 3832 | // function detectDeclPath(text, context) { |
| 3478 | let result = ""; | 3833 | // let result = ""; |
| 3479 | let separator = ":"; | 3834 | // let separator = ":"; |
| 3480 | const components = text.split("."); | 3835 | // const components = text.split("."); |
| 3481 | let curDeclOrType = undefined; | 3836 | // let curDeclOrType = undefined; |
| 3482 | | 3837 | |
| 3483 | let curContext = context; | 3838 | // let curContext = context; |
| 3484 | let limit = 10000; | 3839 | // let limit = 10000; |
| 3485 | while (curContext) { | 3840 | // while (curContext) { |
| 3486 | limit -= 1; | 3841 | // limit -= 1; |
| 3487 | | 3842 | |
| 3488 | if (limit == 0) { | 3843 | // if (limit == 0) { |
| 3489 | throw "too many iterations"; | 3844 | // throw "too many iterations"; |
| 3490 | } | 3845 | // } |
| 3491 | | | |
| 3492 | curDeclOrType = findSubDecl(curContext, components[0]); | | |
| 3493 | | 3846 | |
| 3494 | if (!curDeclOrType) { | 3847 | // curDeclOrType = findSubDecl(curContext, components[0]); |
| 3495 | if (curContext.parent_container == null) break; | | |
| 3496 | curContext = getType(curContext.parent_container); | | |
| 3497 | continue; | | |
| 3498 | } | | |
| 3499 | | 3848 | |
| 3500 | if (curContext == context) { | 3849 | // if (!curDeclOrType) { |
| 3501 | separator = '.'; | 3850 | // if (curContext.parent_container == null) break; |
| 3502 | result = location.hash + separator + components[0]; | 3851 | // curContext = getType(curContext.parent_container); |
| 3503 | } else { | 3852 | // continue; |
| 3504 | // We had to go up, which means we need a new path! | 3853 | // } |
| 3505 | const canonPath = getCanonDeclPath(curDeclOrType.find_subdecl_idx); | | |
| 3506 | if (!canonPath) return; | | |
| 3507 | | 3854 | |
| 3508 | let lastModName = canonPath.modNames[canonPath.modNames.length - 1]; | 3855 | // if (curContext == context) { |
| 3509 | let fullPath = lastModName + ":" + canonPath.declNames.join("."); | 3856 | // separator = '.'; |
| | 3857 | // result = location.hash + separator + components[0]; |
| | 3858 | // } else { |
| | 3859 | // // We had to go up, which means we need a new path! |
| | 3860 | // const canonPath = getCanonDeclPath(curDeclOrType.find_subdecl_idx); |
| | 3861 | // if (!canonPath) return; |
| 3510 | | 3862 | |
| 3511 | separator = '.'; | 3863 | // let lastModName = canonPath.modNames[canonPath.modNames.length - 1]; |
| 3512 | result = "#A;" + fullPath; | 3864 | // let fullPath = lastModName + ":" + canonPath.declNames.join("."); |
| 3513 | } | | |
| 3514 | | 3865 | |
| 3515 | break; | 3866 | // separator = '.'; |
| 3516 | } | 3867 | // result = "#A;" + fullPath; |
| | 3868 | // } |
| 3517 | | 3869 | |
| 3518 | if (!curDeclOrType) { | 3870 | // break; |
| 3519 | for (let i = 0; i < zigAnalysis.modules.length; i += 1) { | 3871 | // } |
| 3520 | const p = zigAnalysis.modules[i]; | 3872 | |
| 3521 | if (p.name == components[0]) { | 3873 | // if (!curDeclOrType) { |
| 3522 | curDeclOrType = getType(p.main); | 3874 | // for (let i = 0; i < zigAnalysis.modules.length; i += 1) { |
| 3523 | result += "#A;" + components[0]; | 3875 | // const p = zigAnalysis.modules[i]; |
| 3524 | break; | 3876 | // if (p.name == components[0]) { |
| 3525 | } | 3877 | // curDeclOrType = getType(p.main); |
| 3526 | } | 3878 | // result += "#A;" + components[0]; |
| 3527 | } | 3879 | // break; |
| | 3880 | // } |
| | 3881 | // } |
| | 3882 | // } |
| 3528 | | 3883 | |
| 3529 | if (!curDeclOrType) return null; | 3884 | // if (!curDeclOrType) return null; |
| 3530 | | 3885 | |
| 3531 | for (let i = 1; i < components.length; i += 1) { | 3886 | // for (let i = 1; i < components.length; i += 1) { |
| 3532 | curDeclOrType = findSubDecl(curDeclOrType, components[i]); | 3887 | // curDeclOrType = findSubDecl(curDeclOrType, components[i]); |
| 3533 | if (!curDeclOrType) return null; | 3888 | // if (!curDeclOrType) return null; |
| 3534 | result += separator + components[i]; | 3889 | // result += separator + components[i]; |
| 3535 | separator = '.'; | 3890 | // separator = '.'; |
| 3536 | } | 3891 | // } |
| 3537 | | 3892 | |
| 3538 | return result; | 3893 | // return result; |
| 3539 | | 3894 | |
| 3540 | } | 3895 | // } |
| 3541 | | 3896 | |
| 3542 | function activateSelectedResult() { | 3897 | function activateSelectedResult() { |
| 3543 | if (domSectSearchResults.classList.contains("hidden")) { | 3898 | if (domSectSearchResults.classList.contains("hidden")) { |
| ... | @@ -3618,9 +3973,10 @@ Happy writing! | ... | @@ -3618,9 +3973,10 @@ Happy writing! |
| 3618 | function onSearchInput(ev) { | 3973 | function onSearchInput(ev) { |
| 3619 | curSearchIndex = -1; | 3974 | curSearchIndex = -1; |
| 3620 | | 3975 | |
| 3621 | let replaced = domSearch.value.replaceAll(".", " "); | 3976 | let replaced = domSearch.value.replaceAll(".", " ") |
| | 3977 | |
| | 3978 | // Ping red the help text if the user typed a dot. |
| 3622 | if (replaced != domSearch.value) { | 3979 | if (replaced != domSearch.value) { |
| 3623 | domSearch.value = replaced; | | |
| 3624 | domSearchHelpSummary.classList.remove("normal"); | 3980 | domSearchHelpSummary.classList.remove("normal"); |
| 3625 | if (domDotsToggleTimeout != null) { | 3981 | if (domDotsToggleTimeout != null) { |
| 3626 | clearTimeout(domDotsToggleTimeout); | 3982 | clearTimeout(domDotsToggleTimeout); |
| ... | @@ -3629,7 +3985,13 @@ Happy writing! | ... | @@ -3629,7 +3985,13 @@ Happy writing! |
| 3629 | domDotsToggleTimeout = setTimeout(function () { | 3985 | domDotsToggleTimeout = setTimeout(function () { |
| 3630 | domSearchHelpSummary.classList.add("normal"); | 3986 | domSearchHelpSummary.classList.add("normal"); |
| 3631 | }, 1000); | 3987 | }, 1000); |
| | 3988 | } |
| | 3989 | |
| | 3990 | replaced = replaced.replace(/ +/g, ' '); |
| | 3991 | if (replaced != domSearch.value) { |
| | 3992 | domSearch.value = replaced; |
| 3632 | } | 3993 | } |
| | 3994 | |
| 3633 | startAsyncSearch(); | 3995 | startAsyncSearch(); |
| 3634 | } | 3996 | } |
| 3635 | | 3997 | |
| ... | @@ -3832,6 +4194,9 @@ Happy writing! | ... | @@ -3832,6 +4194,9 @@ Happy writing! |
| 3832 | } | 4194 | } |
| 3833 | | 4195 | |
| 3834 | function renderSearchAPI() { | 4196 | function renderSearchAPI() { |
| | 4197 | domSectSearchResults.prepend( |
| | 4198 | domSearchHelp.parentElement.removeChild(domSearchHelp) |
| | 4199 | ); |
| 3835 | if (canonDeclPaths == null) { | 4200 | if (canonDeclPaths == null) { |
| 3836 | canonDeclPaths = computeCanonDeclPaths(); | 4201 | canonDeclPaths = computeCanonDeclPaths(); |
| 3837 | } | 4202 | } |
| ... | @@ -3845,7 +4210,11 @@ Happy writing! | ... | @@ -3845,7 +4210,11 @@ Happy writing! |
| 3845 | let term = term_list[i]; | 4210 | let term = term_list[i]; |
| 3846 | let result = declSearchIndex.search(term.toLowerCase()); | 4211 | let result = declSearchIndex.search(term.toLowerCase()); |
| 3847 | if (result == null) { | 4212 | if (result == null) { |
| | 4213 | domSectSearchNoResults.prepend( |
| | 4214 | domSearchHelp.parentElement.removeChild(domSearchHelp) |
| | 4215 | ); |
| 3848 | domSectSearchNoResults.classList.remove("hidden"); | 4216 | domSectSearchNoResults.classList.remove("hidden"); |
| | 4217 | |
| 3849 | domSectSearchResults.classList.add("hidden"); | 4218 | domSectSearchResults.classList.add("hidden"); |
| 3850 | return; | 4219 | return; |
| 3851 | } | 4220 | } |
| ... | @@ -3992,6 +4361,27 @@ Happy writing! | ... | @@ -3992,6 +4361,27 @@ Happy writing! |
| 3992 | } | 4361 | } |
| 3993 | } | 4362 | } |
| 3994 | | 4363 | |
| | 4364 | function scrollGuidesTop(ev) { |
| | 4365 | document.getElementById("activeGuide").children[0].scrollIntoView({ |
| | 4366 | behavior: "smooth", |
| | 4367 | }); |
| | 4368 | ev.preventDefault(); |
| | 4369 | ev.stopPropagation(); |
| | 4370 | } |
| | 4371 | document.scrollGuidesTop = scrollGuidesTop; |
| | 4372 | |
| | 4373 | function scrollToHeading(id, alreadyThere) { |
| | 4374 | // Don't scroll if the current location has a scrolling history. |
| | 4375 | if (scrollHistory[location.hash]) return; |
| | 4376 | |
| | 4377 | const c = document.getElementById(id); |
| | 4378 | if (c && alreadyThere) { |
| | 4379 | requestAnimationFrame(() => c.scrollIntoView({behavior: "smooth"})); |
| | 4380 | } else { |
| | 4381 | requestAnimationFrame(() => c.scrollIntoView()); |
| | 4382 | } |
| | 4383 | return; |
| | 4384 | } |
| 3995 | // function indexNodesToCalls() { | 4385 | // function indexNodesToCalls() { |
| 3996 | // let map = {}; | 4386 | // let map = {}; |
| 3997 | // for (let i = 0; i < zigAnalysis.calls.length; i += 1) { | 4387 | // for (let i = 0; i < zigAnalysis.calls.length; i += 1) { |
| ... | @@ -4473,3 +4863,8 @@ function RadixTree() { | ... | @@ -4473,3 +4863,8 @@ function RadixTree() { |
| 4473 | } | 4863 | } |
| 4474 | } | 4864 | } |
| 4475 | | 4865 | |
| | 4866 | |
| | 4867 | function slugify(str) { |
| | 4868 | return str.toLowerCase().trim().replace(/[^\w\s-]/g, '').replace(/[\s_-]+/g, '-').replace(/^-+|-+$/g, ''); |
| | 4869 | } |
| | 4870 | |