From ab397c18dd5f31c3365a363803f96c8d3b4c918a Mon Sep 17 00:00:00 2001 From: Anthony Correa Date: Fri, 16 Jan 2026 15:56:03 -0600 Subject: [PATCH] cleanup, migrate to mkdocs --- .github/workflows/release-docs.yml | 137 +++------------------ .gitignore | 5 + assets/favicon.png | Bin 0 -> 44904 bytes cmba-bylaws.md | 3 +- js/quote.js | 185 ----------------------------- metadata.yml | 5 - mkdocs/index.md | 3 + mkdocs/mkdocs.yml | 48 ++++++++ mkdocs/requirements.txt | 2 + mkdocs/styles/extra.css | 10 ++ pandoc-filters/shift-numbering.lua | 20 ---- 11 files changed, 84 insertions(+), 334 deletions(-) create mode 100644 assets/favicon.png delete mode 100644 js/quote.js delete mode 100644 metadata.yml create mode 100644 mkdocs/index.md create mode 100644 mkdocs/mkdocs.yml create mode 100644 mkdocs/requirements.txt create mode 100644 mkdocs/styles/extra.css delete mode 100644 pandoc-filters/shift-numbering.lua diff --git a/.github/workflows/release-docs.yml b/.github/workflows/release-docs.yml index ba583d5..a36429f 100644 --- a/.github/workflows/release-docs.yml +++ b/.github/workflows/release-docs.yml @@ -8,128 +8,21 @@ on: jobs: build-release: runs-on: ubuntu-latest - steps: - name: Checkout - uses: actions/checkout@v4 - - - name: Install dependencies + uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: '3.13' + - run: pip install -r mkdocs/requirements.txt + - run: mkdocs build -f mkdocs/mkdocs.yml -d $RUNNER_TEMP/${{ github.ref_name }} + # - run: mkdocs gh-deploy --force + - name: Zip Folder run: | - sudo apt-get update - - # texlive-latex-recommended \ - # texlive-fonts-recommended \ - # texlive-latex-extra \ - - sudo apt-get install -y pandoc \ - jq \ - curl - - name: Build pandoc after-body include from .js files - run: | - set -euo pipefail - - mkdir -p build - out="build/after-body.html" - : > "$out" # truncate - - # Ensure deterministic order - shopt -s nullglob - files=(js/*.js) - if [ ${#files[@]} -eq 0 ]; then - echo "No JS files found in js/; generating empty after-body.html" - exit 0 - fi - - for f in "${files[@]}"; do - { - echo "" - } >> "$out" - done - - name: Build artifacts - run: | - set -euo pipefail - mkdir -p dist - - for doc in *.md; do - # Skip README.md - [[ "$doc" == "README.md" ]] && continue - basename="${doc%.md}" - # Mobile-friendly HTML with TOC + serif styling - pandoc "${doc}" \ - --toc \ - --standalone \ - --number-sections \ - --toc-depth=2 \ - --lua-filter pandoc-filters/shift-numbering.lua \ - --metadata-file metadata.yml \ - --embed-resources \ - --metadata title="CMBA ${basename}" \ - --include-after-body=build/after-body.html \ - --css styles/style.css \ - -o "dist/${basename}.html" - - # PDF - # pandoc "${doc}" \ - # --metadata title="CMBA ${doc}" \ - # -o "dist/${doc}.pdf" - - # Include source markdown for transparency - cp ${doc} dist/ - done - - - - name: Create or update Gitea Release and upload assets - env: - GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} - GITEA_BASE_URL: ${{ secrets.GITEA_BASE_URL }} - # Gitea provides these variables in Actions: - REPO: ${{ gitea.repository }} # "owner/repo" - TAG: ${{ gitea.ref_name }} # e.g. "v2026.0" - run: | - set -euo pipefail - - OWNER="$(echo "$REPO" | cut -d/ -f1)" - NAME="$(echo "$REPO" | cut -d/ -f2)" - API="${GITHUB_API_URL}" - AUTH="Authorization: token ${GITEA_TOKEN}" - - echo "Repo: $OWNER/$NAME" - echo "Tag: $TAG" - echo "API: $API" - - # Check if release exists for this tag - existing_release_json="$(curl -sS -H "$AUTH" \ - "$API/repos/$OWNER/$NAME/releases/tags/$TAG" || true)" - - if echo "$existing_release_json" | jq -e '.id' >/dev/null 2>&1; then - RELEASE_ID="$(echo "$existing_release_json" | jq -r '.id')" - echo "Release exists (id=$RELEASE_ID)." - else - echo "Creating release for tag $TAG..." - create_json="$(curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \ - "$API/repos/$OWNER/$NAME/releases" \ - -d "$(jq -n --arg tag "$TAG" --arg name "$TAG" \ - '{tag_name:$tag, name:$name, draft:false, prerelease:false, body:"CMBA rulebooks release."}')")" - RELEASE_ID="$(echo "$create_json" | jq -r '.id')" - echo "Created release (id=$RELEASE_ID)." - fi - - # Upload each file as an asset. If an asset already exists with same name, delete then re-upload. - assets_json="$(curl -sS -H "$AUTH" "$API/repos/$OWNER/$NAME/releases/$RELEASE_ID/assets" || echo '[]')" - - for f in dist/*; do - filename="$(basename "$f")" - existing_asset_id="$(echo "$assets_json" | jq -r --arg n "$filename" '.[] | select(.name==$n) | .id' | head -n1 || true)" - - if [ -n "${existing_asset_id:-}" ] && [ "$existing_asset_id" != "null" ]; then - echo "Deleting existing asset: $filename (id=$existing_asset_id)" - curl -sS -X DELETE -H "$AUTH" \ - "$API/repos/$OWNER/$NAME/releases/$RELEASE_ID/assets/$existing_asset_id" >/dev/null - fi - echo "Uploading $filename" - curl -sS --fail -X POST -H "$AUTH" -H "Accept: application/json" -F "attachment=@$f" "$API/repos/$OWNER/$NAME/releases/$RELEASE_ID/assets?name=$filename" >/dev/null - done - - echo "Done. Release page: ${GITEA_BASE_URL}/${OWNER}/${NAME}/releases/tag/${TAG}" \ No newline at end of file + zip -r dist/{{ github.ref_name }}.zip $RUNNER_TEMP/${{ github.ref_name }} + - name: Release + if: ${{ !env.ACT }} + uses: softprops/action-gh-release@v2 + with: + files: | + dist/*.zip \ No newline at end of file diff --git a/.gitignore b/.gitignore index 946330a..be6d31f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,8 +7,13 @@ /dataSources/ /dataSources.local.xml +# Vitrtual Environments +.venv/ +venv/ + .idea/ *.bbprojectd +.vscode # Backups created by aspell *.md.bak* diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2455d2761da58e33364acc6fb7539a7903de992 GIT binary patch literal 44904 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%0A#Ko<4x} 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 literal 0 HcmV?d00001 diff --git a/cmba-bylaws.md b/cmba-bylaws.md index 0722474..7af327d 100644 --- a/cmba-bylaws.md +++ b/cmba-bylaws.md @@ -1,5 +1,4 @@ -# By-Laws {.unnumbered} - +# Bylaws ## Definition; Amendments These By-Laws shall stand as the official rules of the CMBA. All Association members shall abide by and are subject to, without exception, all rules and regulations as outlined in the Constitution and By-Laws as well as the authority of the Association President, in accordance with [Subjectivity](#subjectivity) diff --git a/js/quote.js b/js/quote.js deleted file mode 100644 index 8993d44..0000000 --- a/js/quote.js +++ /dev/null @@ -1,185 +0,0 @@ -(() => { - // Inject Quote buttons into Pandoc-style headings and copy a section-range quote to clipboard. - // - // Assumptions (matches your sample): - // - Headings are h1/h2 with stable ids (anchors). - // - A "section" is: the heading + all following sibling elements until the next heading - // of the same or higher level (H2 stops at next H2 or H1; H1 stops at next H1). - // - // Primary target: GroupMe. We optimize text/plain to be readable and "quote-like". - // We still provide text/html for rich paste targets (Docs/Email). - // - // No dependencies. - - const HEADING_SELECTOR = "h1[id], h2[id]"; // change to "h2[id]" if you only want section-level - - document.addEventListener("DOMContentLoaded", () => { - injectQuoteButtons(); - }); - - function injectQuoteButtons() { - document.querySelectorAll(HEADING_SELECTOR).forEach((heading) => { - // Avoid double-injection - if (heading.querySelector(":scope > .quote-btn")) return; - - const btn = document.createElement("button"); - btn.type = "button"; - btn.className = "quote-btn"; - btn.textContent = ""; - btn.innerHTML = ` - - `; - btn.addEventListener("click", (e) => { - e.preventDefault(); - e.stopPropagation(); - onQuoteClick(btn, heading); - }); - - // Add a little separation from heading text - heading.appendChild(document.createTextNode(" ")); - heading.appendChild(btn); - }); - } - - async function onQuoteClick(btn, heading) { - const originalText = btn.textContent; - - try { - btn.textContent = "Copying…"; - btn.disabled = true; - - await copyQuotedSection(heading); - - btn.textContent = "Copied"; - setTimeout(() => { - btn.textContent = originalText; - btn.disabled = false; - }, 800); - } catch (err) { - console.error(err); - btn.textContent = "Failed"; - setTimeout(() => { - btn.textContent = originalText; - btn.disabled = false; - }, 1200); - } - } - - async function copyQuotedSection(heading) { - if (!heading.id) throw new Error("Heading missing id."); - - const level = heading.tagName; // H1 or H2 - - // Clone heading + subsequent siblings for the quote range - const nodes = []; - nodes.push(heading.cloneNode(true)); - - let el = heading.nextElementSibling; - while (el) { - if (isBoundary(level, el)) break; - nodes.push(el.cloneNode(true)); - el = el.nextElementSibling; - } - - // Remove injected button from cloned heading (so it doesn't show up in pasted content) - nodes[0].querySelector(".quote-btn")?.remove(); - - const container = document.createElement("div"); - nodes.forEach((n) => container.appendChild(n)); - - const href = buildAnchorUrl(heading.id); - - // HTML (for rich paste targets) - const html = buildHtmlQuote(container.innerHTML, href); - - // Plain text (optimized for GroupMe) - const plain = buildGroupMePlainQuote(container, href); - - await writeClipboardMultiFormat({ html, plain, url: href }); - } - - function isBoundary(level, el) { - // Stop at next heading of same or higher rank. - // H2 stops at next H1 or H2. - // H1 stops at next H1. - if (level === "H1") return el.tagName === "H1"; - if (level === "H2") return el.tagName === "H1" || el.tagName === "H2"; - return false; - } - - function buildAnchorUrl(id) { - const url = new URL(window.location.href); - url.hash = id; - return url.toString(); - } - - function buildHtmlQuote(innerHtml, href) { - const safeHref = escapeHtmlAttr(href); - const safeText = escapeHtml(href); - - return ` -
- ${innerHtml} -

${safeText}

-
- `.trim(); - } - - function buildGroupMePlainQuote(container, href) { - // Create a readable quote-like block: - // - Prefix lines with "> " to visually indicate quoting (works even if not rendered specially) - // - Include Source link - const text = normalizePlainText(container); - - const quoted = text - .split("\n") - .map((line) => (line.trim().length ? `> ${line}` : `>`)) - .join("\n"); - - return `${quoted}\n> \n> Source: ${href}`; - } - - function normalizePlainText(container) { - // Use innerText to approximate what the user sees (captures list numbering reasonably in many browsers). - // Then normalize spacing. - return (container.innerText || "") - .replace(/\r\n/g, "\n") - .replace(/\n{3,}/g, "\n\n") - .trim(); - } - - async function writeClipboardMultiFormat({ html, plain, url }) { - // Best path: multi-format clipboard write (Chromium/Edge, etc.) - if (navigator.clipboard?.write) { - const item = new ClipboardItem({ - "text/html": new Blob([html], { type: "text/html" }), - "text/plain": new Blob([plain], { type: "text/plain" }), - // Best-effort URL type; some paste targets prefer this - "text/uri-list": new Blob([url], { type: "text/uri-list" }), - }); - await navigator.clipboard.write([item]); - return; - } - - // Fallback: plain text only - if (navigator.clipboard?.writeText) { - await navigator.clipboard.writeText(plain); - return; - } - - throw new Error("Clipboard API unavailable."); - } - - function escapeHtml(s) { - return String(s) - .replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll('"', """) - .replaceAll("'", "'"); - } - - function escapeHtmlAttr(s) { - return escapeHtml(s); - } -})(); \ No newline at end of file diff --git a/metadata.yml b/metadata.yml deleted file mode 100644 index efa2263..0000000 --- a/metadata.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- - title: Chicago Metropolitan Baseball Association - subtitle: Constitution and By-Laws - date: 2024-06-06 ---- \ No newline at end of file diff --git a/mkdocs/index.md b/mkdocs/index.md new file mode 100644 index 0000000..586f560 --- /dev/null +++ b/mkdocs/index.md @@ -0,0 +1,3 @@ +# CMBA Rulebooks + +Use the navigation to view the documents. diff --git a/mkdocs/mkdocs.yml b/mkdocs/mkdocs.yml new file mode 100644 index 0000000..8f47d62 --- /dev/null +++ b/mkdocs/mkdocs.yml @@ -0,0 +1,48 @@ +site_name: CMBA Rulebook +docs_dir: .. +site_dir: ./dist + +# Prevent accidental publishing of repo/CI/dev clutter +exclude_docs: | + .github/ + .git/ + .venv/ + venv/ + "*.sh" + "*.py" + "*.yml" + "*.yaml" + "README.md" +theme: + name: material + palette: + scheme: default + primary: blue + accent: red + logo: ../assets/cmba-logo.svg + favicon: ../assets/favicon.png + features: + - navigation.instant + - navigation.tracking + - navigation.top + - toc.integrate + - search.highlight + - search.suggest +extra_css: + - mkdocs/styles/extra.css +markdown_extensions: + - toc: + permalink: true + - admonition: + # - tables +nav: + - Home: mkdocs/index.md + - Constitution: cmba-constitution.md + - Bylaws: cmba-bylaws.md + +plugins: + - search + - enumerate-headings: + toc_depth: 2 + exclude: + - mkdocs/index.md \ No newline at end of file diff --git a/mkdocs/requirements.txt b/mkdocs/requirements.txt new file mode 100644 index 0000000..bd08198 --- /dev/null +++ b/mkdocs/requirements.txt @@ -0,0 +1,2 @@ +mkdocs-enumerate-headings-plugin==0.6 +mkdocs-material==9.7 \ No newline at end of file diff --git a/mkdocs/styles/extra.css b/mkdocs/styles/extra.css new file mode 100644 index 0000000..4c08ea0 --- /dev/null +++ b/mkdocs/styles/extra.css @@ -0,0 +1,10 @@ +@import url('https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Merriweather:ital,opsz,wght@0,18..144,300..900;1,18..144,300..900&display=swap'); + +:root { + --md-text-font: "Merriweather" +} + +.md-nav__title { + font-family: "Nunito Sans"; +} \ No newline at end of file diff --git a/pandoc-filters/shift-numbering.lua b/pandoc-filters/shift-numbering.lua deleted file mode 100644 index 5007535..0000000 --- a/pandoc-filters/shift-numbering.lua +++ /dev/null @@ -1,20 +0,0 @@ --- Based on https://github.com/jgm/pandoc/issues/5071#issuecomment-856918980 --- For LaTeX documents, shift all headings down by one. --- Make Level 1 unnumbered, or remove it if it contains the "hidden" class. (`# Title {.hidden}`) -function Header(el) - if el.level == 1 then - --check for hidden class. (Why didn't pandoc make this a set? `{class_name = true}`) - for i, v in ipairs(el.classes) do - if v == "hidden" then - --The empty list means remove the element - return {} - end - end - -- this may mean that there are two unnumbered classes, but that doesn't matter. - el.classes[#el.classes + 1] = "unnumbered" - else - -- all headings > 1 are shifted down so that you don't end up with 0.x.y headings. - el.level = el.level - 1 - end - return el -end \ No newline at end of file