From c4f0fd40f2a6b7017ad5c9e0fda2fb6b72c52764 Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Mon, 6 Apr 2026 18:47:41 -0400 Subject: [PATCH] Initial commit --- .github/dependabot.yml | 19 +++++ .github/workflows/build.yml | 43 ++++++++++ .github/workflows/deploy.yml | 54 +++++++++++++ .gitignore | 143 +++++++-------------------------- .pre-commit-config.yaml | 32 ++++++++ CNAME | 1 + CONDUCT.md | 40 +++++++++ CONTRIBUTING.md | 43 ++++++++++ LICENSE | 2 +- README.md | 94 +++++++++++++++++++++- book/images/.gitkeep | 0 book/images/sample_figure.png | Bin 0 -> 24904 bytes book/jupytext.toml | 9 +++ book/part01/getting-started.md | 60 ++++++++++++++ book/part01/installation.md | 40 +++++++++ book/part02/first-example.md | 59 ++++++++++++++ book/preface.md | 35 ++++++++ book/references.bib | 6 ++ fav.ico | Bin 0 -> 1537 bytes index.md | 32 ++++++++ logo.png | Bin 0 -> 1515 bytes myst.yml | 43 ++++++++++ requirements.txt | 6 ++ robots.txt | 2 + 24 files changed, 647 insertions(+), 116 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 .pre-commit-config.yaml create mode 100644 CNAME create mode 100644 CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 book/images/.gitkeep create mode 100644 book/images/sample_figure.png create mode 100644 book/jupytext.toml create mode 100644 book/part01/getting-started.md create mode 100644 book/part01/installation.md create mode 100644 book/part02/first-example.md create mode 100644 book/preface.md create mode 100644 book/references.bib create mode 100644 fav.ico create mode 100644 index.md create mode 100644 logo.png create mode 100644 myst.yml create mode 100644 requirements.txt create mode 100644 robots.txt diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..0372e10 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..b3ef0e4 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,43 @@ +name: build + +on: + pull_request: + branches: + - main + +permissions: + contents: read + pull-requests: write + +jobs: + build-the-book: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v6 + with: + node-version: 18.x + + - name: Install MyST Markdown + run: npm install -g mystmd + + - name: Build HTML Assets + run: myst build --html + + # - name: Deploy to Netlify + # uses: nwtgck/actions-netlify@v3.0 + # with: + # publish-dir: "./_build/html" + # production-branch: main + # github-token: ${{ secrets.GITHUB_TOKEN }} + # deploy-message: "Deploy from GitHub Actions" + # enable-pull-request-comment: true + # enable-commit-comment: false + # overwrites-pull-request-comment: true + # env: + # NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + # NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..e66fa23 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,54 @@ +name: deploy + +on: + push: + branches: + - main + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Setup Pages + uses: actions/configure-pages@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 18.x + + - name: Install MyST Markdown + run: npm install -g mystmd + + - name: Build HTML Assets + run: myst build --html + + # - name: Copy static files + # run: | + # cp robots.txt ./_build/html/ + # # cp CNAME ./_build/html/ + + - name: Upload artifact + uses: actions/upload-pages-artifact@v4 + with: + path: "./_build/html" + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.gitignore b/.gitignore index b7faf40..de8dda0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Byte-compiled / optimized / DLL files __pycache__/ -*.py[codz] +*.py[cod] *$py.class # C extensions @@ -20,15 +20,12 @@ parts/ sdist/ var/ wheels/ -share/python-wheels/ *.egg-info/ .installed.cfg *.egg -MANIFEST +private/ # PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec @@ -49,7 +46,6 @@ coverage.xml *.py.cover .hypothesis/ .pytest_cache/ -cover/ # Translations *.mo @@ -58,8 +54,6 @@ cover/ # Django stuff: *.log local_settings.py -db.sqlite3 -db.sqlite3-journal # Flask stuff: instance/ @@ -72,77 +66,28 @@ instance/ docs/_build/ # PyBuilder -.pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints -# IPython -profile_default/ -ipython_config.py - # pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# UV -# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -#uv.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock -#poetry.toml - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. -# https://pdm-project.org/en/latest/usage/project/#working-with-version-control -#pdm.lock -#pdm.toml -.pdm-python -.pdm-build/ - -# pixi -# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. -#pixi.lock -# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one -# in the .venv directory. It is recommended not to include this directory in version control. -.pixi - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff +.python-version + +# celery beat schedule file celerybeat-schedule -celerybeat.pid # SageMath parsed files *.sage.py -# Environments +# dotenv .env -.envrc + +# virtualenv .venv -env/ venv/ +env/ ENV/ -env.bak/ -venv.bak/ # Spyder project settings .spyderproject @@ -156,52 +101,24 @@ venv.bak/ # mypy .mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ - -# Abstra -# Abstra is an AI-powered process automation framework. -# Ignore directories containing user credentials, local state, and settings. -# Learn more at https://abstra.io/docs -.abstra/ - -# Visual Studio Code -# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore -# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore -# and can be added to the global gitignore or merged into this file. However, if you prefer, -# you could uncomment the following to ignore the entire vscode folder -# .vscode/ - -# Ruff stuff: -.ruff_cache/ - -# PyPI configuration file -.pypirc - -# Cursor -# Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to -# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data -# refer to https://docs.cursor.com/context/ignore-files -.cursorignore -.cursorindexingignore - -# Marimo -marimo/_static/ -marimo/_lsp/ -__marimo__/ + +# IDE settings +.vscode/ + +# MyST / Jupyter Book build outputs +_build/ +book-clean/ + +# Translation image directories (images are copied from book/images/ at build time) +book-*/images/ + +# Large data files +*.tif +*.geojson +*.xml +*.gpkg +*.mp4 +*.zip + +# Private / local files +private/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..c5027d9 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,32 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + types: [python] + - id: trailing-whitespace + - id: requirements-txt-fixer + - id: check-added-large-files + args: ["--maxkb=3500"] + + - repo: https://github.com/psf/black + rev: 25.1.0 + hooks: + - id: black-jupyter + + - repo: https://github.com/codespell-project/codespell + rev: v2.4.1 + hooks: + - id: codespell + args: + [ + "--ignore-words-list=previos", + "--skip=*.csv,*.geojson,*.json,*.yml,*.js,*.html,*cff,*.pdf", + ] + + - repo: https://github.com/kynan/nbstripout + rev: 0.8.1 + hooks: + - id: nbstripout diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..26781ab --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +myst-template.opengeos.org diff --git a/CONDUCT.md b/CONDUCT.md new file mode 100644 index 0000000..ae95d60 --- /dev/null +++ b/CONDUCT.md @@ -0,0 +1,40 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the project maintainers. All complaints will be reviewed and +investigated promptly and fairly. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), +version 2.0. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..94397b6 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,43 @@ +# Contributing + +Thank you for your interest in contributing to this book project! + +## How to Contribute + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/my-contribution`) +3. Make your changes +4. Run `pre-commit run --all-files` to ensure code quality +5. Commit your changes (`git commit -m 'Add my contribution'`) +6. Push to the branch (`git push origin feature/my-contribution`) +7. Open a Pull Request + +## Development Setup + +1. Clone the repository +2. Install dependencies: `pip install -r requirements.txt` +3. Install pre-commit hooks: `pre-commit install` + +## Building the Book + +### HTML (for web) + +```bash +myst build --html +``` + +### PDF and EPUB (via Typst) + +```bash +python build_translation.py en +``` + +## Code Style + +- Python code follows [Black](https://black.readthedocs.io/) formatting +- Markdown files use [MyST Markdown](https://mystmd.org/) syntax +- All code is spell-checked with [codespell](https://github.com/codespell-project/codespell) + +## Reporting Issues + +Please use the GitHub issue tracker to report bugs or suggest features. diff --git a/LICENSE b/LICENSE index a0705f0..8e06999 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Open Geospatial Solutions +Copyright (c) 2026 Qiusheng Wu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 7b52430..29b6b0e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,92 @@ -# myst-website-template -A template for MyST websites +# MyST Website Template + +A reusable template for building websites with [MyST Markdown](https://mystmd.org/) and automated deployment via GitHub Actions. + +## Features + +- **MyST Markdown** source format with Jupyter notebook integration +- **GitHub Pages** deployment on push to `main` +- **Netlify PR previews** for pull request review +- **Pre-commit hooks**: Black, codespell, nbstripout for code quality + +## Quick Start + +1. Click **Use this template** on GitHub to create a new repository +2. Update `myst.yml` with your site title, author, and table of contents +3. Replace placeholder content in `book/` with your own pages +4. Push to GitHub to trigger automated builds + +## Project Structure + +``` +. +├── myst.yml # MyST configuration +├── index.md # Landing page +├── requirements.txt # Python dependencies +├── logo.png # Site logo +├── fav.ico # Favicon +├── CNAME # Custom domain (optional) +├── robots.txt # Search engine directives +├── book/ # Site content +│ ├── preface.md +│ ├── part01/ +│ │ ├── getting-started.md +│ │ └── installation.md +│ ├── part02/ +│ │ └── first-example.md +│ ├── references.bib # Bibliography +│ ├── jupytext.toml +│ └── images/ # Shared images +├── .pre-commit-config.yaml # Pre-commit hook configuration +├── CONTRIBUTING.md # Contribution guidelines +├── CONDUCT.md # Code of conduct +└── .github/workflows/ + ├── build.yml # PR preview builds (Netlify) + └── deploy.yml # Production deployment (GitHub Pages) +``` + +## Customization + +### Site Metadata + +Edit `myst.yml`: +- `project.title`: your site title +- `project.authors`: author name(s) +- `project.github`: your GitHub `username/repo` +- `project.toc`: table of contents structure + +### Adding Pages + +1. Create a new `.md` file in the appropriate `book/` subdirectory +2. Add the file to `project.toc` in `myst.yml` + +## Building Locally + +```bash +pip install -r requirements.txt +npm install -g mystmd +myst build --html +``` + +The built site will be in `_build/html/`. + +## Deployment + +### GitHub Pages (production) + +Pushes to `main` automatically trigger the `deploy.yml` workflow, which builds the HTML site and deploys to GitHub Pages. + +### Netlify (PR previews) + +Pull requests trigger the `build.yml` workflow, which builds a preview and posts the URL as a PR comment. Requires `NETLIFY_AUTH_TOKEN` and `NETLIFY_SITE_ID` secrets. + +## GitHub Secrets + +| Secret | Purpose | +|--------|---------| +| `NETLIFY_AUTH_TOKEN` | Netlify authentication for PR previews | +| `NETLIFY_SITE_ID` | Netlify site ID for PR previews | + +## License + +[MIT](LICENSE) diff --git a/book/images/.gitkeep b/book/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/book/images/sample_figure.png b/book/images/sample_figure.png new file mode 100644 index 0000000000000000000000000000000000000000..79abdb4737f32660ed11a04bc1bb34a329d6e39e GIT binary patch literal 24904 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

EA2>}+1sn?5{?CH@qe~#tf%0Ai=m%s(f0w8-6%UNNrMpqK1Ah*R` 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 QU7+IL)78&qol`;+0K4r5jsO4v literal 0 HcmV?d00001 diff --git a/index.md b/index.md new file mode 100644 index 0000000..fe0f567 --- /dev/null +++ b/index.md @@ -0,0 +1,32 @@ +# Website Title + +## Introduction + +Welcome to the official repository for _**Website Title**_. This repository contains all the code examples featured in the book. + +## About This Book + +Describe your book here. + +## Table of Contents + +### Preface + +- [Preface](book/preface.md) + +### Part I: Getting Started + +1. [Getting Started](book/part01/getting-started.md) +2. [Installation](book/part01/installation.md) + +### Part II: Examples + +3. [First Example](book/part02/first-example.md) + +## About the Author + +Add author information here. + +## Licensing and Copyright + +Add licensing information here. diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..031c2f3e55879470ae45613395e146fbb64ad64f GIT binary patch literal 1515 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFNO`a}}Ar*7p-q~9?+g+kH z@bcmoRgFSvuYeZof<3SSFf?&8un047s4)omFeuDma4^7>cysv$d&S!Vo1aZg z+rIrMs5k#5Iqy#IKPQ1^^}8n&c(@xL9`;stx?s!D#y|ZlkK^@tCMo+pYoGh=n!~^& zzb?2|O2eK}!ainwmHkpigSs8DPy0?WCH%SIcXgf@h>knDE{3%&;VkomtMae5+zY?V zAYp$cd#ABIlf#BI#t*Of|8BW8TbO|*TZm!(zYFo*cP$xVuFT_WnEyX|NqnE7h~EtE2j3xFF&tHf0)ekua@NjGfQF|TfHpf zjz)!^bnG9C`Vmj4j@u!Ah`YyJSs0lR<}q#2+4(1R+jGgC9RR z4lF6-XgYY_pFwP+lK@YhEz^b-l1&L8UJEz)e%aNW@TFR?fp@Eoti+#tED8tQfijUS z3KxO}_>N!hUvB^V+t+{nh5ko0_VE)FuP`rb6j;pL*I&n0!GE7U;7Je*(1-uud{_C9 z%@pw9(gFVCm&*$i#F#G3v@j56oY7%%VK#$~lgtVQ2I&fIzQ6NYu2x7F6vzGD>4GEu zu*U356wPB2D>R)h%HhEH{aa)!Lx~#S85agMCB83e4BZ0kS{w)1YGh_)SB_+pFf!mz zix2uTeap|E|Nr;n!++0#$;+z#@83`FC;S&`C>Lt^Df#C(=Ygp#i8jsq=Q5alvf)Sy zIR4_cPy>@6`&)?`UB(v<0{6~8_$}1H$nr3r&3+n#kAfx#o4q*Wj0=9i#I}?308pWhRTl z?dcc!4@B$}U?HOHfTc0~rA;2+fyamc#&)wa+P%B>7m>ebu^f2MxM087?qa5fgtJT! zL>ORYffU1Xh85R~($D%cC^3{qy+7U0Ah1S-!H*GCoSgCl3cd|_yYh=WgJ8q$(042T zlmkVsufBKw?$4Taf8Os0rubif&nG1AjkDOjkNbfML;mZXlh>&?JfFk%V5y+~gu_f9 zTsS<;Kc(2%Fs$cf+CBTF`@@$^3|}5=84xNh5kCIUa6&=7(eQlNE?^{xC1!e#M literal 0 HcmV?d00001 diff --git a/myst.yml b/myst.yml new file mode 100644 index 0000000..57701f0 --- /dev/null +++ b/myst.yml @@ -0,0 +1,43 @@ +version: 1 +project: + title: Website Title + authors: + - name: Author Name + copyright: '2026' + exclude: + - _build + - Thumbs.db + - .DS_Store + - '**.ipynb_checkpoints' + github: username/book-template + # thebe: + # binder: + # repo: username/book-template + # provider: github + # url: https://mybinder.org + # ref: main + bibliography: + - book/references.bib + toc: + - file: index.md + - title: Preface + children: + - file: book/preface.md + - title: Getting Started + children: + - file: book/part01/getting-started.md + - file: book/part01/installation.md + - title: Examples + children: + - file: book/part02/first-example.md +site: + options: + logo: logo.png + logo_dark: logo.png + favicon: fav.ico + folders: true + # style: custom.css + # analytics_google: G-XXX + template: book-theme + parts: + primary_sidebar_footer: '' diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b2e0cc2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +ghp-import +jupyter-book +jupytext +matplotlib +mystmd +numpy diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..1f53798 --- /dev/null +++ b/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /