| ... | ... | @@ -1,34 +1,42 @@ |
| 1 | 1 | "use strict"; |
| 2 | 2 | |
| 3 | 3 | var zigAnalysis; |
| 4 | let skipNextHashChange = null; |
| 4 | 5 | |
| 5 | 6 | const NAV_MODES = { |
| 6 | 7 | API: "#A;", |
| 7 | 8 | GUIDES: "#G;", |
| 8 | 9 | }; |
| 9 | 10 | |
| 11 | |
| 12 | var scrollHistory = {}; |
| 13 | |
| 10 | 14 | (function() { |
| 11 | 15 | const domBanner = document.getElementById("banner"); |
| 12 | 16 | const domMain = document.getElementById("main"); |
| 13 | 17 | const domStatus = document.getElementById("status"); |
| 14 | | const domSectNav = document.getElementById("sectNav"); |
| 15 | | const domListNav = document.getElementById("listNav"); |
| 18 | const domSectNavAPI = document.getElementById("sectNavAPI"); |
| 19 | const domListNavAPI = document.getElementById("listNavAPI"); |
| 20 | const domSectNavGuides = document.getElementById("sectNavGuides"); |
| 21 | const domListNavGuides = document.getElementById("listNavGuides"); |
| 16 | 22 | const domApiSwitch = document.getElementById("ApiSwitch"); |
| 17 | 23 | const domGuideSwitch = document.getElementById("guideSwitch"); |
| 18 | 24 | const domGuidesMenu = document.getElementById("guidesMenu"); |
| 19 | | const domApiMenu = document.getElementById("apiMenu"); |
| 20 | | const domGuidesList = document.getElementById("guidesList"); |
| 21 | | const domSectMainMod = document.getElementById("sectMainMod"); |
| 22 | | const domSectMods = document.getElementById("sectMods"); |
| 25 | const domGuidesMenuTitle = document.getElementById("guidesMenuTitle"); |
| 26 | const domGuideTocList = document.getElementById("guideTocList"); |
| 27 | const domGuideTocListEmtpy = document.getElementById("guideTocListEmpty"); |
| 23 | 28 | const domListMods = document.getElementById("listMods"); |
| 24 | 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 | 32 | const domSectTests = document.getElementById("sectTests"); |
| 27 | 33 | const domListTests = document.getElementById("listTests"); |
| 28 | 34 | const domSectDocTests = document.getElementById("sectDocTests"); |
| 29 | 35 | const domDocTestsCode = document.getElementById("docTestsCode"); |
| 30 | 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 | 40 | const domSectErrSets = document.getElementById("sectErrSets"); |
| 33 | 41 | const domListErrSets = document.getElementById("listErrSets"); |
| 34 | 42 | const domSectFns = document.getElementById("sectFns"); |
| ... | ... | @@ -54,16 +62,17 @@ const NAV_MODES = { |
| 54 | 62 | const domFnNoExamples = document.getElementById("fnNoExamples"); |
| 55 | 63 | const domDeclNoRef = document.getElementById("declNoRef"); |
| 56 | 64 | const domSearch = document.getElementById("search"); |
| 65 | const domSearchHelp = document.getElementById("searchHelp"); |
| 57 | 66 | const domSearchHelpSummary = document.getElementById("searchHelpSummary"); |
| 58 | 67 | const domSectSearchResults = document.getElementById("sectSearchResults"); |
| 59 | 68 | const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink"); |
| 60 | 69 | const domDocs = document.getElementById("docs"); |
| 70 | const domDocsScroll = document.getElementById("docs-scroll"); |
| 61 | 71 | const domGuidesSection = document.getElementById("guides"); |
| 62 | 72 | const domActiveGuide = document.getElementById("activeGuide"); |
| 63 | 73 | |
| 64 | 74 | const domListSearchResults = document.getElementById("listSearchResults"); |
| 65 | 75 | const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); |
| 66 | | const domSectInfo = document.getElementById("sectInfo"); |
| 67 | 76 | // const domTdTarget = (document.getElementById("tdTarget")); |
| 68 | 77 | const domTdZigVer = document.getElementById("tdZigVer"); |
| 69 | 78 | const domHdrName = document.getElementById("hdrName"); |
| ... | ... | @@ -80,6 +89,15 @@ const NAV_MODES = { |
| 80 | 89 | |
| 81 | 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 | 101 | let searchTimer = null; |
| 84 | 102 | let searchTrimResults = true; |
| 85 | 103 | |
| ... | ... | @@ -107,8 +125,10 @@ const NAV_MODES = { |
| 107 | 125 | let canonTypeDecls = null; // lazy; use getCanonTypeDecl |
| 108 | 126 | |
| 109 | 127 | let curNav = { |
| 128 | hash: "", |
| 110 | 129 | mode: NAV_MODES.API, |
| 111 | 130 | activeGuide: "", |
| 131 | activeGuideScrollTo: null, |
| 112 | 132 | // each element is a module name, e.g. @import("a") then within there @import("b") |
| 113 | 133 | // starting implicitly from root module |
| 114 | 134 | modNames: [], |
| ... | ... | @@ -423,6 +443,71 @@ const NAV_MODES = { |
| 423 | 443 | // console.assert(false); |
| 424 | 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 | 511 | function renderGuides() { |
| 427 | 512 | renderTitle(); |
| 428 | 513 | |
| ... | ... | @@ -430,46 +515,17 @@ const NAV_MODES = { |
| 430 | 515 | domGuideSwitch.classList.add("active"); |
| 431 | 516 | domApiSwitch.classList.remove("active"); |
| 432 | 517 | domDocs.classList.add("hidden"); |
| 518 | domSectNavAPI.classList.add("hidden"); |
| 519 | domSectNavGuides.classList.remove("hidden"); |
| 433 | 520 | domGuidesSection.classList.remove("hidden"); |
| 434 | 521 | domActiveGuide.classList.add("hidden"); |
| 435 | | domApiMenu.classList.add("hidden"); |
| 436 | 522 | domSectSearchResults.classList.add("hidden"); |
| 437 | 523 | domSectSearchAllResultsLink.classList.add("hidden"); |
| 438 | 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 | 525 | if (curNavSearch !== "") { |
| 469 | 526 | return renderSearchGuides(); |
| 470 | 527 | } |
| 471 | 528 | |
| 472 | | // main content |
| 473 | 529 | let activeGuide = undefined; |
| 474 | 530 | outer: for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) { |
| 475 | 531 | const section = zigAnalysis.guide_sections[i]; |
| ... | ... | @@ -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 | 667 | const root_file_idx = zigAnalysis.modules[zigAnalysis.rootMod].file; |
| 487 | 668 | const root_file_name = getFile(root_file_idx).name; |
| 488 | | domActiveGuide.innerHTML = markdown(` |
| 489 | | # Zig Guides |
| 669 | let reader = new commonmark.Parser({smart: true}); |
| 670 | let ast = reader.parse(` |
| 671 | # No Guides |
| 490 | 672 | These autodocs don't contain any guide. |
| 491 | 673 | |
| 492 | 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 | 702 | |
| 521 | 703 | Happy writing! |
| 522 | 704 | `); |
| 523 | | } else { |
| 524 | | domActiveGuide.innerHTML = markdown(activeGuide.body); |
| 525 | | } |
| 526 | | domActiveGuide.classList.remove("hidden"); |
| 705 | |
| 706 | let writer = new commonmark.HtmlRenderer(); |
| 707 | let result = writer.render(ast); |
| 708 | domActiveGuide.innerHTML = result; |
| 709 | |
| 527 | 710 | } |
| 528 | 711 | |
| 529 | 712 | function renderApi() { |
| ... | ... | @@ -531,29 +714,28 @@ Happy writing! |
| 531 | 714 | domApiSwitch.classList.add("active"); |
| 532 | 715 | domGuideSwitch.classList.remove("active"); |
| 533 | 716 | domGuidesSection.classList.add("hidden"); |
| 717 | domSectNavAPI.classList.remove("hidden"); |
| 718 | domSectNavGuides.classList.add("hidden"); |
| 534 | 719 | domDocs.classList.remove("hidden"); |
| 535 | | domApiMenu.classList.remove("hidden"); |
| 536 | 720 | domGuidesMenu.classList.add("hidden"); |
| 537 | | |
| 538 | 721 | domStatus.classList.add("hidden"); |
| 539 | 722 | domFnProto.classList.add("hidden"); |
| 540 | 723 | domSectParams.classList.add("hidden"); |
| 541 | 724 | domTldDocs.classList.add("hidden"); |
| 542 | | domSectMainMod.classList.add("hidden"); |
| 543 | | domSectMods.classList.add("hidden"); |
| 544 | 725 | domSectTypes.classList.add("hidden"); |
| 545 | 726 | domSectTests.classList.add("hidden"); |
| 546 | 727 | domSectDocTests.classList.add("hidden"); |
| 547 | 728 | domSectNamespaces.classList.add("hidden"); |
| 729 | domListNamespacesLeft.classList.add("hidden"); |
| 730 | domListNamespacesRight.classList.add("hidden"); |
| 731 | domNoDocsNamespaces.classList.add("hidden"); |
| 548 | 732 | domSectErrSets.classList.add("hidden"); |
| 549 | 733 | domSectFns.classList.add("hidden"); |
| 550 | 734 | domSectFields.classList.add("hidden"); |
| 551 | 735 | domSectSearchResults.classList.add("hidden"); |
| 552 | 736 | domSectSearchAllResultsLink.classList.add("hidden"); |
| 553 | 737 | domSectSearchNoResults.classList.add("hidden"); |
| 554 | | domSectInfo.classList.add("hidden"); |
| 555 | 738 | domHdrName.classList.add("hidden"); |
| 556 | | domSectNav.classList.add("hidden"); |
| 557 | 739 | domSectFnErrors.classList.add("hidden"); |
| 558 | 740 | domFnExamples.classList.add("hidden"); |
| 559 | 741 | domFnNoExamples.classList.add("hidden"); |
| ... | ... | @@ -564,8 +746,6 @@ Happy writing! |
| 564 | 746 | domSectValues.classList.add("hidden"); |
| 565 | 747 | |
| 566 | 748 | renderTitle(); |
| 567 | | renderInfo(); |
| 568 | | renderModList(); |
| 569 | 749 | |
| 570 | 750 | if (curNavSearch !== "") { |
| 571 | 751 | return renderSearchAPI(); |
| ... | ... | @@ -870,7 +1050,7 @@ Happy writing! |
| 870 | 1050 | |
| 871 | 1051 | function renderNav() { |
| 872 | 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 | 1054 | let list = []; |
| 875 | 1055 | let hrefModNames = []; |
| 876 | 1056 | let hrefDeclNames = []; |
| ... | ... | @@ -891,7 +1071,7 @@ Happy writing! |
| 891 | 1071 | } |
| 892 | 1072 | |
| 893 | 1073 | for (let i = 0; i < list.length; i += 1) { |
| 894 | | let liDom = domListNav.children[i]; |
| 1074 | let liDom = domListNavAPI.children[i]; |
| 895 | 1075 | let aDom = liDom.children[0]; |
| 896 | 1076 | aDom.textContent = list[i].name; |
| 897 | 1077 | aDom.setAttribute("href", list[i].link); |
| ... | ... | @@ -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 | 1088 | function render404() { |
| 916 | 1089 | domStatus.textContent = "404 Not Found"; |
| 917 | 1090 | domStatus.classList.remove("hidden"); |
| 918 | 1091 | } |
| 919 | 1092 | |
| 920 | | function renderModList() { |
| 921 | | const rootMod = zigAnalysis.modules[zigAnalysis.rootMod]; |
| 922 | | let list = []; |
| 923 | | for (let key in rootMod.table) { |
| 924 | | let modIndex = rootMod.table[key]; |
| 925 | | if (zigAnalysis.modules[modIndex] == null) continue; |
| 926 | | if (key == rootMod.name) continue; |
| 927 | | list.push({ |
| 928 | | name: key, |
| 929 | | mod: modIndex, |
| 930 | | }); |
| 931 | | } |
| 932 | | |
| 933 | | { |
| 934 | | let aDom = domSectMainMod.children[1].children[0].children[0]; |
| 935 | | aDom.textContent = rootMod.name; |
| 936 | | aDom.setAttribute("href", navLinkMod(zigAnalysis.rootMod)); |
| 937 | | if (rootMod.name === curNav.modNames[0]) { |
| 938 | | aDom.classList.add("active"); |
| 939 | | } else { |
| 940 | | aDom.classList.remove("active"); |
| 941 | | } |
| 942 | | domSectMainMod.classList.remove("hidden"); |
| 943 | | } |
| 944 | | |
| 945 | | list.sort(function(a, b) { |
| 946 | | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 947 | | }); |
| 948 | | |
| 949 | | if (list.length !== 0) { |
| 950 | | resizeDomList(domListMods, list.length, '<li><a href="#"></a></li>'); |
| 951 | | for (let i = 0; i < list.length; i += 1) { |
| 952 | | let liDom = domListMods.children[i]; |
| 953 | | let aDom = liDom.children[0]; |
| 954 | | aDom.textContent = list[i].name; |
| 955 | | aDom.setAttribute("href", navLinkMod(list[i].mod)); |
| 956 | | if (list[i].name === curNav.modNames[0]) { |
| 957 | | aDom.classList.add("active"); |
| 958 | | } else { |
| 959 | | aDom.classList.remove("active"); |
| 960 | | } |
| 961 | | } |
| 1093 | // function renderModList() { |
| 1094 | // const rootMod = zigAnalysis.modules[zigAnalysis.rootMod]; |
| 1095 | // let list = []; |
| 1096 | // for (let key in rootMod.table) { |
| 1097 | // let modIndex = rootMod.table[key]; |
| 1098 | // if (zigAnalysis.modules[modIndex] == null) continue; |
| 1099 | // if (key == rootMod.name) continue; |
| 1100 | // list.push({ |
| 1101 | // name: key, |
| 1102 | // mod: modIndex, |
| 1103 | // }); |
| 1104 | // } |
| 1105 | |
| 1106 | // { |
| 1107 | // let aDom = domSectMainMod.children[1].children[0].children[0]; |
| 1108 | // aDom.textContent = rootMod.name; |
| 1109 | // aDom.setAttribute("href", navLinkMod(zigAnalysis.rootMod)); |
| 1110 | // if (rootMod.name === curNav.modNames[0]) { |
| 1111 | // aDom.classList.add("active"); |
| 1112 | // } else { |
| 1113 | // aDom.classList.remove("active"); |
| 1114 | // } |
| 1115 | // domSectMainMod.classList.remove("hidden"); |
| 1116 | // } |
| 1117 | |
| 1118 | // list.sort(function (a, b) { |
| 1119 | // return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 1120 | // }); |
| 1121 | |
| 1122 | // if (list.length !== 0) { |
| 1123 | // resizeDomList(domListMods, list.length, '<li><a href="#"></a></li>'); |
| 1124 | // for (let i = 0; i < list.length; i += 1) { |
| 1125 | // let liDom = domListMods.children[i]; |
| 1126 | // let aDom = liDom.children[0]; |
| 1127 | // aDom.textContent = list[i].name; |
| 1128 | // aDom.setAttribute("href", navLinkMod(list[i].mod)); |
| 1129 | // if (list[i].name === curNav.modNames[0]) { |
| 1130 | // aDom.classList.add("active"); |
| 1131 | // } else { |
| 1132 | // aDom.classList.remove("active"); |
| 1133 | // } |
| 1134 | // } |
| 962 | 1135 | |
| 963 | | domSectMods.classList.remove("hidden"); |
| 964 | | } |
| 965 | | } |
| 1136 | // domSectMods.classList.remove("hidden"); |
| 1137 | // } |
| 1138 | // } |
| 966 | 1139 | |
| 967 | 1140 | function navLink(modNames, declNames, callName) { |
| 968 | 1141 | let base = curNav.mode; |
| ... | ... | @@ -2525,7 +2698,8 @@ Happy writing! |
| 2525 | 2698 | function categorizeDecls( |
| 2526 | 2699 | decls, |
| 2527 | 2700 | typesList, |
| 2528 | | namespacesList, |
| 2701 | namespacesWithDocsList, |
| 2702 | namespacesNoDocsList, |
| 2529 | 2703 | errSetsList, |
| 2530 | 2704 | fnsList, |
| 2531 | 2705 | varsList, |
| ... | ... | @@ -2562,7 +2736,11 @@ Happy writing! |
| 2562 | 2736 | if (typeIsErrSet(declValue.expr.type)) { |
| 2563 | 2737 | errSetsList.push(decl); |
| 2564 | 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 | 2744 | } else { |
| 2567 | 2745 | typesList.push(decl); |
| 2568 | 2746 | } |
| ... | ... | @@ -2573,7 +2751,11 @@ Happy writing! |
| 2573 | 2751 | if (typeIsErrSet(declValue.expr.type)) { |
| 2574 | 2752 | errSetsList.push(decl); |
| 2575 | 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 | 2759 | } else { |
| 2578 | 2760 | typesList.push(decl); |
| 2579 | 2761 | } |
| ... | ... | @@ -2608,7 +2790,8 @@ Happy writing! |
| 2608 | 2790 | function renderContainer(container) { |
| 2609 | 2791 | let typesList = []; |
| 2610 | 2792 | |
| 2611 | | let namespacesList = []; |
| 2793 | let namespacesWithDocsList = []; |
| 2794 | let namespacesNoDocsList = []; |
| 2612 | 2795 | |
| 2613 | 2796 | let errSetsList = []; |
| 2614 | 2797 | |
| ... | ... | @@ -2625,7 +2808,8 @@ Happy writing! |
| 2625 | 2808 | categorizeDecls( |
| 2626 | 2809 | container.pubDecls, |
| 2627 | 2810 | typesList, |
| 2628 | | namespacesList, |
| 2811 | namespacesWithDocsList, |
| 2812 | namespacesNoDocsList, |
| 2629 | 2813 | errSetsList, |
| 2630 | 2814 | fnsList, |
| 2631 | 2815 | varsList, |
| ... | ... | @@ -2637,7 +2821,8 @@ Happy writing! |
| 2637 | 2821 | categorizeDecls( |
| 2638 | 2822 | container.privDecls, |
| 2639 | 2823 | typesList, |
| 2640 | | namespacesList, |
| 2824 | namespacesWithDocsList, |
| 2825 | namespacesNoDocsList, |
| 2641 | 2826 | errSetsList, |
| 2642 | 2827 | fnsList, |
| 2643 | 2828 | varsList, |
| ... | ... | @@ -2655,7 +2840,8 @@ Happy writing! |
| 2655 | 2840 | categorizeDecls( |
| 2656 | 2841 | uns_container.pubDecls, |
| 2657 | 2842 | typesList, |
| 2658 | | namespacesList, |
| 2843 | namespacesWithDocsList, |
| 2844 | namespacesNoDocsList, |
| 2659 | 2845 | errSetsList, |
| 2660 | 2846 | fnsList, |
| 2661 | 2847 | varsList, |
| ... | ... | @@ -2667,7 +2853,8 @@ Happy writing! |
| 2667 | 2853 | categorizeDecls( |
| 2668 | 2854 | uns_container.privDecls, |
| 2669 | 2855 | typesList, |
| 2670 | | namespacesList, |
| 2856 | namespacesWithDocsList, |
| 2857 | namespacesNoDocsList, |
| 2671 | 2858 | errSetsList, |
| 2672 | 2859 | fnsList, |
| 2673 | 2860 | varsList, |
| ... | ... | @@ -2678,7 +2865,8 @@ Happy writing! |
| 2678 | 2865 | } |
| 2679 | 2866 | |
| 2680 | 2867 | typesList.sort(byNameProperty); |
| 2681 | | namespacesList.sort(byNameProperty); |
| 2868 | namespacesWithDocsList.sort(byNameProperty); |
| 2869 | namespacesNoDocsList.sort(byNameProperty); |
| 2682 | 2870 | errSetsList.sort(byNameProperty); |
| 2683 | 2871 | fnsList.sort(byNameProperty); |
| 2684 | 2872 | varsList.sort(byNameProperty); |
| ... | ... | @@ -2694,36 +2882,91 @@ Happy writing! |
| 2694 | 2882 | } |
| 2695 | 2883 | |
| 2696 | 2884 | if (typesList.length !== 0) { |
| 2697 | | resizeDomList( |
| 2698 | | domListTypes, |
| 2699 | | typesList.length, |
| 2700 | | '<li><a href=""></a></li>' |
| 2701 | | ); |
| 2885 | const splitPoint = Math.ceil(typesList.length / 2); |
| 2886 | const template = '<li><a href="#"></a><div></div></li>'; |
| 2887 | resizeDomList(domListTypesLeft, splitPoint, template); |
| 2888 | resizeDomList(domListTypesRight, typesList.length - splitPoint, template); |
| 2889 | |
| 2890 | let activeList = domListTypesLeft; |
| 2891 | let offset = 0; |
| 2702 | 2892 | for (let i = 0; i < typesList.length; i += 1) { |
| 2703 | | let liDom = domListTypes.children[i]; |
| 2893 | let liDom = activeList.children[i - offset]; |
| 2704 | 2894 | let aDom = liDom.children[0]; |
| 2705 | 2895 | let decl = typesList[i]; |
| 2706 | 2896 | aDom.textContent = decl.name; |
| 2707 | 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 | 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 | 2945 | resizeDomList( |
| 2713 | | domListNamespaces, |
| 2714 | | namespacesList.length, |
| 2715 | | '<li><a href="#"></a></li>' |
| 2946 | domNoDocsNamespaces, |
| 2947 | namespacesNoDocsList.length, |
| 2948 | '<span><a href="#"></a><span></span></span>' |
| 2716 | 2949 | ); |
| 2717 | | for (let i = 0; i < namespacesList.length; i += 1) { |
| 2718 | | let liDom = domListNamespaces.children[i]; |
| 2719 | | let aDom = liDom.children[0]; |
| 2720 | | let decl = namespacesList[i]; |
| 2950 | for (let i = 0; i < namespacesNoDocsList.length; i += 1) { |
| 2951 | let aDom = domNoDocsNamespaces.children[i].children[0]; |
| 2952 | let decl = namespacesNoDocsList[i]; |
| 2721 | 2953 | aDom.textContent = decl.name; |
| 2722 | 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 | 2964 | domSectNamespaces.classList.remove("hidden"); |
| 2725 | 2965 | } |
| 2726 | 2966 | |
| 2967 | |
| 2968 | |
| 2969 | |
| 2727 | 2970 | if (errSetsList.length !== 0) { |
| 2728 | 2971 | resizeDomList( |
| 2729 | 2972 | domListErrSets, |
| ... | ... | @@ -2778,7 +3021,7 @@ Happy writing! |
| 2778 | 3021 | tdDesc.innerHTML = markdown(short, container); |
| 2779 | 3022 | } |
| 2780 | 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 | 3027 | domSectFns.classList.remove("hidden"); |
| ... | ... | @@ -3013,12 +3256,15 @@ Happy writing! |
| 3013 | 3256 | |
| 3014 | 3257 | function updateCurNav() { |
| 3015 | 3258 | curNav = { |
| 3259 | hash: location.hash, |
| 3016 | 3260 | mode: NAV_MODES.API, |
| 3017 | 3261 | modNames: [], |
| 3018 | 3262 | modObjs: [], |
| 3019 | 3263 | declNames: [], |
| 3020 | 3264 | declObjs: [], |
| 3021 | 3265 | callName: null, |
| 3266 | activeGuide: null, |
| 3267 | activeGuideScrollTo: null, |
| 3022 | 3268 | }; |
| 3023 | 3269 | curNavSearch = ""; |
| 3024 | 3270 | |
| ... | ... | @@ -3039,7 +3285,7 @@ Happy writing! |
| 3039 | 3285 | case NAV_MODES.API: |
| 3040 | 3286 | // #A;MODULE:decl.decl.decl?search-term |
| 3041 | 3287 | curNav.mode = mode; |
| 3042 | | |
| 3288 | { |
| 3043 | 3289 | let parts = nonSearchPart.split(":"); |
| 3044 | 3290 | if (parts[0] == "") { |
| 3045 | 3291 | location.hash = DEFAULT_HASH; |
| ... | ... | @@ -3050,22 +3296,18 @@ Happy writing! |
| 3050 | 3296 | if (parts[1] != null) { |
| 3051 | 3297 | curNav.declNames = decodeURIComponent(parts[1]).split("."); |
| 3052 | 3298 | } |
| 3053 | | |
| 3299 | } |
| 3054 | 3300 | return; |
| 3055 | 3301 | case NAV_MODES.GUIDES: |
| 3302 | curNav.mode = mode; |
| 3056 | 3303 | |
| 3057 | | const sections = zigAnalysis.guide_sections; |
| 3058 | | if (sections.length != 0 && sections[0].guides.length != 0 && nonSearchPart == "") { |
| 3059 | | location.hash = NAV_MODES.GUIDES + sections[0].guides[0].name; |
| 3060 | | if (qpos != -1) { |
| 3061 | | location.hash += query.substring(qpos); |
| 3304 | { |
| 3305 | let parts = nonSearchPart.split(":"); |
| 3306 | curNav.activeGuide = parts[0]; |
| 3307 | if (parts[1] != null) { |
| 3308 | curNav.activeGuideScrollTo = decodeURIComponent(":" + parts[1]); |
| 3062 | 3309 | } |
| 3063 | | return; |
| 3064 | 3310 | } |
| 3065 | | |
| 3066 | | curNav.mode = mode; |
| 3067 | | curNav.activeGuide = nonSearchPart; |
| 3068 | | |
| 3069 | 3311 | return; |
| 3070 | 3312 | default: |
| 3071 | 3313 | location.hash = DEFAULT_HASH; |
| ... | ... | @@ -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 | 3328 | updateCurNav(); |
| 3329 | |
| 3078 | 3330 | if (domSearch.value !== curNavSearch) { |
| 3079 | 3331 | domSearch.value = curNavSearch; |
| 3080 | 3332 | if (domSearch.value.length == 0) |
| ... | ... | @@ -3087,6 +3339,22 @@ Happy writing! |
| 3087 | 3339 | imFeelingLucky = false; |
| 3088 | 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 | 3360 | function findSubDecl(parentTypeOrDecl, childName) { |
| ... | ... | @@ -3384,9 +3652,9 @@ Happy writing! |
| 3384 | 3652 | let index = trimmed_docs.indexOf("\n\n"); |
| 3385 | 3653 | let cut = false; |
| 3386 | 3654 | |
| 3387 | | if (index < 0 || index > 80) { |
| 3388 | | if (trimmed_docs.length > 80) { |
| 3389 | | index = 80; |
| 3655 | if (index < 0 || index > 130) { |
| 3656 | if (trimmed_docs.length > 130) { |
| 3657 | index = 130; |
| 3390 | 3658 | cut = true; |
| 3391 | 3659 | } else { |
| 3392 | 3660 | index = trimmed_docs.length; |
| ... | ... | @@ -3408,31 +3676,118 @@ Happy writing! |
| 3408 | 3676 | for (let i = 0; i < section.guides.length; i += 1) { |
| 3409 | 3677 | let reader = new commonmark.Parser({ smart: true }); |
| 3410 | 3678 | const guide = section.guides[i]; |
| 3411 | | const ast = reader.parse(guide.body); |
| 3412 | 3679 | |
| 3413 | 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 | 3688 | let walker = ast.walker(); |
| 3417 | | let event, node; |
| 3689 | let heading_idx = 0; |
| 3690 | let event, node, doc, last, last_ul; |
| 3418 | 3691 | while ((event = walker.next())) { |
| 3419 | 3692 | node = event.node; |
| 3420 | | if (node.type === 'text') { |
| 3421 | | guide.title = node.literal; |
| 3422 | | break; |
| 3693 | if (event.entering) { |
| 3694 | if (node.type === 'document') { |
| 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 | 3781 | // Index this guide |
| 3427 | 3782 | { |
| 3428 | | let walker = ast.walker(); |
| 3429 | | let event, node; |
| 3430 | | while ((event = walker.next())) { |
| 3431 | | node = event.node; |
| 3432 | | if (event.entering == true && node.type === 'text') { |
| 3433 | | indexTextForGuide(j, i, node); |
| 3434 | | } |
| 3435 | | } |
| 3783 | // let walker = guide.ast.walker(); |
| 3784 | // let event, node; |
| 3785 | // while ((event = walker.next())) { |
| 3786 | // node = event.node; |
| 3787 | // if (event.entering == true && node.type === 'text') { |
| 3788 | // indexTextForGuide(j, i, node); |
| 3789 | // } |
| 3790 | // } |
| 3436 | 3791 | } |
| 3437 | 3792 | } |
| 3438 | 3793 | } |
| ... | ... | @@ -3474,70 +3829,70 @@ Happy writing! |
| 3474 | 3829 | |
| 3475 | 3830 | |
| 3476 | 3831 | |
| 3477 | | function detectDeclPath(text, context) { |
| 3478 | | let result = ""; |
| 3479 | | let separator = ":"; |
| 3480 | | const components = text.split("."); |
| 3481 | | let curDeclOrType = undefined; |
| 3832 | // function detectDeclPath(text, context) { |
| 3833 | // let result = ""; |
| 3834 | // let separator = ":"; |
| 3835 | // const components = text.split("."); |
| 3836 | // let curDeclOrType = undefined; |
| 3482 | 3837 | |
| 3483 | | let curContext = context; |
| 3484 | | let limit = 10000; |
| 3485 | | while (curContext) { |
| 3486 | | limit -= 1; |
| 3838 | // let curContext = context; |
| 3839 | // let limit = 10000; |
| 3840 | // while (curContext) { |
| 3841 | // limit -= 1; |
| 3487 | 3842 | |
| 3488 | | if (limit == 0) { |
| 3489 | | throw "too many iterations"; |
| 3490 | | } |
| 3491 | | |
| 3492 | | curDeclOrType = findSubDecl(curContext, components[0]); |
| 3843 | // if (limit == 0) { |
| 3844 | // throw "too many iterations"; |
| 3845 | // } |
| 3493 | 3846 | |
| 3494 | | if (!curDeclOrType) { |
| 3495 | | if (curContext.parent_container == null) break; |
| 3496 | | curContext = getType(curContext.parent_container); |
| 3497 | | continue; |
| 3498 | | } |
| 3847 | // curDeclOrType = findSubDecl(curContext, components[0]); |
| 3499 | 3848 | |
| 3500 | | if (curContext == context) { |
| 3501 | | separator = '.'; |
| 3502 | | result = location.hash + separator + components[0]; |
| 3503 | | } else { |
| 3504 | | // We had to go up, which means we need a new path! |
| 3505 | | const canonPath = getCanonDeclPath(curDeclOrType.find_subdecl_idx); |
| 3506 | | if (!canonPath) return; |
| 3849 | // if (!curDeclOrType) { |
| 3850 | // if (curContext.parent_container == null) break; |
| 3851 | // curContext = getType(curContext.parent_container); |
| 3852 | // continue; |
| 3853 | // } |
| 3507 | 3854 | |
| 3508 | | let lastModName = canonPath.modNames[canonPath.modNames.length - 1]; |
| 3509 | | let fullPath = lastModName + ":" + canonPath.declNames.join("."); |
| 3855 | // if (curContext == context) { |
| 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 = '.'; |
| 3512 | | result = "#A;" + fullPath; |
| 3513 | | } |
| 3863 | // let lastModName = canonPath.modNames[canonPath.modNames.length - 1]; |
| 3864 | // let fullPath = lastModName + ":" + canonPath.declNames.join("."); |
| 3514 | 3865 | |
| 3515 | | break; |
| 3516 | | } |
| 3866 | // separator = '.'; |
| 3867 | // result = "#A;" + fullPath; |
| 3868 | // } |
| 3517 | 3869 | |
| 3518 | | if (!curDeclOrType) { |
| 3519 | | for (let i = 0; i < zigAnalysis.modules.length; i += 1) { |
| 3520 | | const p = zigAnalysis.modules[i]; |
| 3521 | | if (p.name == components[0]) { |
| 3522 | | curDeclOrType = getType(p.main); |
| 3523 | | result += "#A;" + components[0]; |
| 3524 | | break; |
| 3525 | | } |
| 3526 | | } |
| 3527 | | } |
| 3870 | // break; |
| 3871 | // } |
| 3872 | |
| 3873 | // if (!curDeclOrType) { |
| 3874 | // for (let i = 0; i < zigAnalysis.modules.length; i += 1) { |
| 3875 | // const p = zigAnalysis.modules[i]; |
| 3876 | // if (p.name == components[0]) { |
| 3877 | // curDeclOrType = getType(p.main); |
| 3878 | // result += "#A;" + components[0]; |
| 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) { |
| 3532 | | curDeclOrType = findSubDecl(curDeclOrType, components[i]); |
| 3533 | | if (!curDeclOrType) return null; |
| 3534 | | result += separator + components[i]; |
| 3535 | | separator = '.'; |
| 3536 | | } |
| 3886 | // for (let i = 1; i < components.length; i += 1) { |
| 3887 | // curDeclOrType = findSubDecl(curDeclOrType, components[i]); |
| 3888 | // if (!curDeclOrType) return null; |
| 3889 | // result += separator + components[i]; |
| 3890 | // separator = '.'; |
| 3891 | // } |
| 3537 | 3892 | |
| 3538 | | return result; |
| 3893 | // return result; |
| 3539 | 3894 | |
| 3540 | | } |
| 3895 | // } |
| 3541 | 3896 | |
| 3542 | 3897 | function activateSelectedResult() { |
| 3543 | 3898 | if (domSectSearchResults.classList.contains("hidden")) { |
| ... | ... | @@ -3618,9 +3973,10 @@ Happy writing! |
| 3618 | 3973 | function onSearchInput(ev) { |
| 3619 | 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 | 3979 | if (replaced != domSearch.value) { |
| 3623 | | domSearch.value = replaced; |
| 3624 | 3980 | domSearchHelpSummary.classList.remove("normal"); |
| 3625 | 3981 | if (domDotsToggleTimeout != null) { |
| 3626 | 3982 | clearTimeout(domDotsToggleTimeout); |
| ... | ... | @@ -3629,7 +3985,13 @@ Happy writing! |
| 3629 | 3985 | domDotsToggleTimeout = setTimeout(function () { |
| 3630 | 3986 | domSearchHelpSummary.classList.add("normal"); |
| 3631 | 3987 | }, 1000); |
| 3988 | } |
| 3989 | |
| 3990 | replaced = replaced.replace(/ +/g, ' '); |
| 3991 | if (replaced != domSearch.value) { |
| 3992 | domSearch.value = replaced; |
| 3632 | 3993 | } |
| 3994 | |
| 3633 | 3995 | startAsyncSearch(); |
| 3634 | 3996 | } |
| 3635 | 3997 | |
| ... | ... | @@ -3832,6 +4194,9 @@ Happy writing! |
| 3832 | 4194 | } |
| 3833 | 4195 | |
| 3834 | 4196 | function renderSearchAPI() { |
| 4197 | domSectSearchResults.prepend( |
| 4198 | domSearchHelp.parentElement.removeChild(domSearchHelp) |
| 4199 | ); |
| 3835 | 4200 | if (canonDeclPaths == null) { |
| 3836 | 4201 | canonDeclPaths = computeCanonDeclPaths(); |
| 3837 | 4202 | } |
| ... | ... | @@ -3845,7 +4210,11 @@ Happy writing! |
| 3845 | 4210 | let term = term_list[i]; |
| 3846 | 4211 | let result = declSearchIndex.search(term.toLowerCase()); |
| 3847 | 4212 | if (result == null) { |
| 4213 | domSectSearchNoResults.prepend( |
| 4214 | domSearchHelp.parentElement.removeChild(domSearchHelp) |
| 4215 | ); |
| 3848 | 4216 | domSectSearchNoResults.classList.remove("hidden"); |
| 4217 | |
| 3849 | 4218 | domSectSearchResults.classList.add("hidden"); |
| 3850 | 4219 | return; |
| 3851 | 4220 | } |
| ... | ... | @@ -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 | 4385 | // function indexNodesToCalls() { |
| 3996 | 4386 | // let map = {}; |
| 3997 | 4387 | // for (let i = 0; i < zigAnalysis.calls.length; i += 1) { |
| ... | ... | @@ -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 | |