all repos — mdget @ 63f853a78d2ccc9d6f69305e6b1eac7ec5012270

Unnamed repository; edit this file 'description' to name the repository.

feat: initial commit of mdget

- Add core implementation (`cmd/mdget.go`)
  - Fetch webpages with configurable timeout and User-Agent
  - Convert HTML to Markdown using `html-to-markdown/v2`
  - Support output to stdout or file via `-o/--output`
  - Automatically prepend `https://` to bare domains
  - Provide `--version` and `--help` via `go-arg`

- Add project metadata
  - `go.mod` / `go.sum` with dependencies: `req/v3`,
    `html-to-markdown/v2`, `go-arg`
  - `LICENCE.txt` (EUPL 1.2) with full legal text
  - `README.md` with usage, examples, build instructions

- Add assets
  - `assets/logo.png` and `assets/screenshot.png`
  - `assets/eupl-12-badge.svg` for licence badge

- Configure `.gitignore` for Go binaries, test artifacts, coverage, and
  environment files
Maxwell Jensen 85795372+maxwelljens@users.noreply.github.com
Mon, 20 Apr 2026 13:42:49 +0200
commit

63f853a78d2ccc9d6f69305e6b1eac7ec5012270

A .gitignore

@@ -0,0 +1,32 @@

+# Binaries for programs and plugins +mdget +mdget*linux +mdget*x86_64 +mdget*amd64 +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Code coverage profiles and other test artifacts +*.out +coverage.* +*.coverprofile +profile.cov + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + +# env file +.env + +# Honk +.goosehints
A LICENCE.txt

@@ -0,0 +1,287 @@

+ EUROPEAN UNION PUBLIC LICENCE v. 1.2 + EUPL © the European Union 2007, 2016 + +This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined +below) which is provided under the terms of this Licence. Any use of the Work, +other than as authorised under this Licence is prohibited (to the extent such +use is covered by a right of the copyright holder of the Work). + +The Work is provided under the terms of this Licence when the Licensor (as +defined below) has placed the following notice immediately following the +copyright notice for the Work: + + Licensed under the EUPL + +or has expressed by any other means his willingness to license under the EUPL. + +1. Definitions + +In this Licence, the following terms have the following meaning: + +- ‘The Licence’: this Licence. + +- ‘The Original Work’: the work or software distributed or communicated by the + Licensor under this Licence, available as Source Code and also as Executable + Code as the case may be. + +- ‘Derivative Works’: the works or software that could be created by the + Licensee, based upon the Original Work or modifications thereof. This Licence + does not define the extent of modification or dependence on the Original Work + required in order to classify a work as a Derivative Work; this extent is + determined by copyright law applicable in the country mentioned in Article 15. + +- ‘The Work’: the Original Work or its Derivative Works. + +- ‘The Source Code’: the human-readable form of the Work which is the most + convenient for people to study and modify. + +- ‘The Executable Code’: any code which has generally been compiled and which is + meant to be interpreted by a computer as a program. + +- ‘The Licensor’: the natural or legal person that distributes or communicates + the Work under the Licence. + +- ‘Contributor(s)’: any natural or legal person who modifies the Work under the + Licence, or otherwise contributes to the creation of a Derivative Work. + +- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of + the Work under the terms of the Licence. + +- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending, + renting, distributing, communicating, transmitting, or otherwise making + available, online or offline, copies of the Work or providing access to its + essential functionalities at the disposal of any other natural or legal + person. + +2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +sublicensable licence to do the following, for the duration of copyright vested +in the Original Work: + +- use the Work in any circumstance and for all usage, +- reproduce the Work, +- modify the Work, and make Derivative Works based upon the Work, +- communicate to the public, including the right to make available or display + the Work or copies thereof to the public and perform publicly, as the case may + be, the Work, +- distribute the Work or copies thereof, +- lend and rent the Work or copies thereof, +- sublicense rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether now +known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right to +exercise his moral right to the extent allowed by law in order to make effective +the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to +any patents held by the Licensor, to the extent necessary to make use of the +rights granted on the Work under this Licence. + +3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as +Executable Code. If the Work is provided as Executable Code, the Licensor +provides in addition a machine-readable copy of the Source Code of the Work +along with each copy of the Work that the Licensor distributes or indicates, in +a notice following the copyright notice attached to the Work, a repository where +the Source Code is easily and freely accessible for as long as the Licensor +continues to distribute or communicate the Work. + +4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the benefits from +any exception or limitation to the exclusive rights of the rights owners in the +Work, of the exhaustion of those rights or of other applicable limitations +thereto. + +5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions and +obligations imposed on the Licensee. Those obligations are the following: + +Attribution right: The Licensee shall keep intact all copyright, patent or +trademarks notices and all notices that refer to the Licence and to the +disclaimer of warranties. The Licensee must include a copy of such notices and a +copy of the Licence with every copy of the Work he/she distributes or +communicates. The Licensee must cause any Derivative Work to carry prominent +notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes or communicates copies of the +Original Works or Derivative Works, this Distribution or Communication will be +done under the terms of this Licence or of a later version of this Licence +unless the Original Work is expressly distributed only under this version of the +Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee +(becoming Licensor) cannot offer or impose any additional terms or conditions on +the Work or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes or Communicates Derivative +Works or copies thereof based upon both the Work and another work licensed under +a Compatible Licence, this Distribution or Communication can be done under the +terms of this Compatible Licence. For the sake of this clause, ‘Compatible +Licence’ refers to the licences listed in the appendix attached to this Licence. +Should the Licensee's obligations under the Compatible Licence conflict with +his/her obligations under this Licence, the obligations of the Compatible +Licence shall prevail. + +Provision of Source Code: When distributing or communicating copies of the Work, +the Licensee will provide a machine-readable copy of the Source Code or indicate +a repository where this Source will be easily and freely available for as long +as the Licensee continues to distribute or communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade names, +trademarks, service marks, or names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the copyright notice. + +6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work granted +hereunder is owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she brings +to the Work are owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each time You accept the Licence, the original Licensor and subsequent +Contributors grant You a licence to their contributions to the Work, under the +terms of this Licence. + +7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by numerous +Contributors. It is not a finished work and may therefore contain defects or +‘bugs’ inherent to this type of development. + +For the above reason, the Work is provided under the Licence on an ‘as is’ basis +and without warranties of any kind concerning the Work, including without +limitation merchantability, fitness for a particular purpose, absence of defects +or errors, accuracy, non-infringement of intellectual property rights other than +copyright as stated in Article 6 of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a condition +for the grant of any rights to the Work. + +8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to natural +persons, the Licensor will in no event be liable for any direct or indirect, +material or moral, damages of any kind, arising out of the Licence or of the use +of the Work, including without limitation, damages for loss of goodwill, work +stoppage, computer failure or malfunction, loss of data or any commercial +damage, even if the Licensor has been advised of the possibility of such damage. +However, the Licensor will be liable under statutory product liability laws as +far such laws apply to the Work. + +9. Additional agreements + +While distributing the Work, You may choose to conclude an additional agreement, +defining obligations or services consistent with this Licence. However, if +accepting obligations, You may act only on your own behalf and on your sole +responsibility, not on behalf of the original Licensor or any other Contributor, +and only if You agree to indemnify, defend, and hold each Contributor harmless +for any liability incurred by, or claims asserted against such Contributor by +the fact You have accepted any warranty or additional liability. + +10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ +placed under the bottom of a window displaying the text of this Licence or by +affirming consent in any other similar way, in accordance with the rules of +applicable law. Clicking on that icon indicates your clear and irrevocable +acceptance of this Licence and all of its terms and conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and +conditions by exercising any rights granted to You by Article 2 of this Licence, +such as the use of the Work, the creation by You of a Derivative Work or the +Distribution or Communication by You of the Work or copies thereof. + +11. Information to the public + +In case of any Distribution or Communication of the Work by means of electronic +communication by You (for example, by offering to download the Work from a +remote location) the distribution channel or media (for example, a website) must +at least provide to the public the information requested by the applicable law +regarding the Licensor, the Licence and the way it may be accessible, concluded, +stored and reproduced by the Licensee. + +12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically upon +any breach by the Licensee of the terms of the Licence. + +Such a termination will not terminate the licences of any person who has +received the Work from the Licensee under the Licence, provided such persons +remain in full compliance with the Licence. + +13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete +agreement between the Parties as to the Work. + +If any provision of the Licence is invalid or unenforceable under applicable +law, this will not affect the validity or enforceability of the Licence as a +whole. Such provision will be construed or reformed so as necessary to make it +valid and enforceable. + +The European Commission may publish other linguistic versions or new versions of +this Licence or updated versions of the Appendix, so far this is required and +reasonable, without reducing the scope of the rights granted by the Licence. New +versions of the Licence will be published with a unique version number. + +All linguistic versions of this Licence, approved by the European Commission, +have identical value. Parties can take advantage of the linguistic version of +their choice. + +14. Jurisdiction + +Without prejudice to specific agreement between parties, + +- any litigation resulting from the interpretation of this License, arising + between the European Union institutions, bodies, offices or agencies, as a + Licensor, and any Licensee, will be subject to the jurisdiction of the Court + of Justice of the European Union, as laid down in article 272 of the Treaty on + the Functioning of the European Union, + +- any litigation arising between other parties and resulting from the + interpretation of this License, will be subject to the exclusive jurisdiction + of the competent court where the Licensor resides or conducts its primary + business. + +15. Applicable Law + +Without prejudice to specific agreement between parties, + +- this Licence shall be governed by the law of the European Union Member State + where the Licensor has his seat, resides or has his registered office, + +- this licence shall be governed by Belgian law if the Licensor has no seat, + residence or registered office inside a European Union Member State. + +Appendix + +‘Compatible Licences’ according to Article 5 EUPL are: + +- GNU General Public License (GPL) v. 2, v. 3 +- GNU Affero General Public License (AGPL) v. 3 +- Open Software License (OSL) v. 2.1, v. 3.0 +- Eclipse Public License (EPL) v. 1.0 +- CeCILL v. 2.0, v. 2.1 +- Mozilla Public Licence (MPL) v. 2 +- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 +- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for + works other than software +- European Union Public Licence (EUPL) v. 1.1, v. 1.2 +- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong + Reciprocity (LiLiQ-R+). + +The European Commission may update this Appendix to later versions of the above +licences without producing a new version of the EUPL, as long as they provide +the rights granted in Article 2 of this Licence and protect the covered Source +Code from exclusive appropriation. + +All other changes or additions to this Appendix require the production of a new +EUPL version.
A README.md

@@ -0,0 +1,90 @@

+<h1 align="center"> + <img src="assets/logo.png" alt="mdget logo"> + <img src="assets/screenshot.png" alt="mdget screenshot"> +</h1> + +![Codeberg Release](https://img.shields.io/gitea/v/release/maxwelljensen/mdget?gitea_url=https%3A%2F%2Fcodeberg.org&style=for-the-badge) +![Codeberg License](assets/eupl-12-badge.svg) + +--- + +## What is mdget? + +`mdget` ("markdown get" or "midget") is a simple command‑line utility that +fetches a webpage and converts its HTML content to clean Markdown. It’s +designed for quick, scriptable extraction of content from the web into a +readable, portable format. + +## How do I use mdget? + + mdget [OPTIONS]... [URL] + +By default, `mdget` fetches the given URL and outputs the converted Markdown to +standard output. + +### Options + + -o, --output FILE Write output to FILE instead of stdout + -t, --timeout SECONDS Request timeout in seconds (default: 30) + -u, --user-agent AGENT Custom User‑Agent header (default: "mdget/0.1.0") + -h, --help Show this help message and exit + -v, --version Show version information and exit + +### Examples + + # Basic usage: fetch a webpage and print Markdown to stdout + mdget https://example.com + + # Save the output to a file + mdget --output page.md https://example.com + + # Use a custom timeout and User‑Agent + mdget --timeout 10 --user-agent "MyBot/1.0" example.com + + # Automatically add https:// prefix to bare domains + mdget github.com > github.md + + # Show version information + mdget --version + + # Show help message + mdget --help + +## How does `mdget` work? + +`mdget` performs the following steps for each request: + +1. Parse command‑line arguments +2. Validate and normalise the URL; if the provided URL does not start with + `http://` or `https://`, `https://` is prepended. +3. Fetch the HTML using the [`req` HTTP client library](https://req.cool/), + with configurable timeout and an optional User‑Agent. +4. Convert HTML to Markdown using the `html‑to‑markdown` library, which + preserves semantic structure and handles relative URLs correctly. +5. Output the result to `STDOUT` or `-o/--output` if specified. + +The program exits with a non‑zero status if the HTTP request fails, the server +returns an error, or the HTML‑to‑Markdown conversion fails for whatever reason. + +## Dependencies + +`mdget` is written in Go and uses the following libraries: + +* [`req`](https://github.com/imroc/req) – a modern, feature‑rich HTTP client +* [`html‑to‑markdown`](https://github.com/JohannesKaufmann/html-to-markdown) – a robust HTML‑to‑Markdown converter +* [`go‑arg`](https://github.com/alexflint/go-arg) – struct‑based argument parsing with automatic help and version flags + +## How do I build mdget? + +`mdget` can be built with a standard Go toolchain: + + go build ./cmd/mdget.go + +Or installed globally: + + go install ./cmd/mdget.go + +## Licence + +This project is licensed under [European Union Public Licence +1.2](https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12).
A assets/eupl-12-badge.svg

@@ -0,0 +1,1 @@

+<svg xmlns="http://www.w3.org/2000/svg" width="175.75" height="28" role="img" aria-label="LICENCE: EUPL 1.2"><title>LICENCE: EUPL 1.2</title><a target="_blank" href="https://interoperable-europe.ec.europa.eu/collection/eupl/eupl-text-eupl-12"><g shape-rendering="crispEdges"><rect width="92.75" height="28" fill="#555"/><rect x="92.75" width="83" height="28" fill="#4c1"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="100"><image x="9" y="7" width="14" height="14" href="data:image/svg+xml;base64,PHN2ZyBmaWxsPSJ3aGl0ZXNtb2tlIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RXVyb3BlYW4gVW5pb248L3RpdGxlPjxwYXRoIGQ9Ik0xMS4zNzMgMS45NCAxMC4zNiAxLjJoMS4yNTNMMTIgMGwuMzg3IDEuMmgxLjI1M2wtMS4wMTMuNzQuMzg2IDEuMjA3TDEyIDIuNGwtMS4wMTMuNzQ3Wm0xLjI1NCAyMC44Ni4zODYgMS4yTDEyIDIzLjI2bC0xLjAxMy43NC4zODYtMS4yLTEuMDEzLS43NGgxLjI1M0wxMiAyMC44NTNsLjM4NyAxLjIwN2gxLjI1M1pNMS42NCAxMi44bC0xLjAxMy43NDcuMzg2LTEuMkwwIDExLjYyN2gxLjI1M2wuMzg3LTEuMi4zODcgMS4yaDEuMjZsLTEuMDIuNzQ2LjM4NiAxLjItMS4wMTMtLjc0NlptNS44MDctOS40NjcuMzg2IDEuMkw2LjgyIDMuOGwtMS4wMTMuNzQuMzg2LTEuMkw1LjE4IDIuNmgxLjI1M2wuMzg3LTEuMi4zODcgMS4ySDguNDZabS00Ljc4IDMuMDguMzg2LTEuMi4zOTQgMS4yaDEuMjJsLTEuMDE0Ljc0Ny4zODcgMS4yLTEuMDItLjc0N0wyIDguMzZsLjM4Ny0xLjItMS4wMTQtLjc0N1pNMS4zODcgMTYuODRoMS4yOGwuMzg2LTEuMi4zOTQgMS4yaDEuMjJsLTEuMDE0Ljc0Ny4zODcgMS4yLTEuMDItLjc0LTEuMDIuNzQuMzg3LTEuMi0xLjAxNC0uNzQ3Wm00LjgwNiA0LjU2LTEuMDEzLS43MzNoMS4yNTNsLjM4Ny0xLjIuMzg3IDEuMkg4LjQ2bC0xLjAxMy43MzMuMzg2IDEuMi0xLjAxMy0uNzQtMS4wMTMuNzRabTE2Ljc5NC05LjAyNy4zODYgMS4yLTEuMDEzLS43NDYtMS4wMjcuNzQ2LjM4Ny0xLjItMS4wMi0uNzQ2SDIybC4zODctMS4yLjM4NiAxLjJIMjRabS02LjQzNC05LjA0TDE1LjU0IDIuNmgxLjI1M2wuMzg3LTEuMi4zODcgMS4yaDEuMjUzbC0xLjAxMy43MzMuMzg2IDEuMkwxNy4xOCAzLjhsLTEuMDEzLjc0LjM4Ni0xLjJabTQgMy4wNzQuMzk0LTEuMi4zODYgMS4yaDEuMjU0bC0uOTg3Ljc1My4zODcgMS4yLTEuMDE0LS43NDctMS4wMi43NDcuMzg3LTEuMi0xLjAwNy0uNzQ3Wm0uNzggMTAuNDMzaDEuMjU0bC0uOTg3Ljc0Ny4zODcgMS4yLTEuMDE0LS43NC0xLjAyLjc0LjM4Ny0xLjItMS4wMDctLjc0N2gxLjI1NGwuMzkzLTEuMi4zODcgMS4yem0tMi41MTMgMy44MjctMS4wMTMuNzMzLjM4NiAxLjItMS4wMTMtLjc0LTEuMDEzLjc0LjM4Ni0xLjItMS4wMTMtLjczM2gxLjI1M2wuMzg3LTEuMi4zODcgMS4yeiIvPjwvc3ZnPg=="/><text transform="scale(.1)" x="548.75" y="175" textLength="517.5" fill="#fff">LICENCE</text><text transform="scale(.1)" x="1342.5" y="175" textLength="590" fill="#fff" font-weight="bold">EUPL 1.2</text></g></a></svg>
A cmd/mdget.go

@@ -0,0 +1,110 @@

+package main + +import ( + "fmt" + "os" + "strings" + "time" + + htmltomarkdown "github.com/JohannesKaufmann/html-to-markdown/v2" + "github.com/JohannesKaufmann/html-to-markdown/v2/converter" + "github.com/alexflint/go-arg" + "github.com/imroc/req/v3" +) + +var ( + version = "0.1.0" + buildDate = "2026-04-20" +) + +// Args defines the command-line arguments for mdget +type Args struct { + URL string `arg:"positional" help:"URL to fetch and convert to markdown"` + Output string `arg:"-o,--output" help:"Output file (default: stdout)" default:""` + Timeout int `arg:"-t,--timeout" help:"Request timeout in seconds" default:"30"` + UserAgent string `arg:"-u,--user-agent" help:"Custom User-Agent header" default:"mdget/0.1.0"` +} + +// Version implements the Versioned interface for go-arg +func (Args) Version() string { + return fmt.Sprintf("mdget v%s (built %s)", version, buildDate) +} + +// Description returns the program description for help text +func (Args) Description() string { + return "Fetch a URL and convert its HTML content to Markdown." +} + +// Epilogue returns the help text epilogue +func (Args) Epilogue() string { + return `Examples: + mdget https://example.com + mdget --output page.md https://example.com + mdget --timeout 10 --user-agent "MyBot/1.0" example.com` +} + +func main() { + // Parse command-line arguments + var args Args + + // Use MustParse which handles --help and --version automatically + parser := arg.MustParse(&args) + + // Check if URL is provided (help/version flags are already handled by MustParse) + if args.URL == "" { + fmt.Fprintf(os.Stderr, "Error: URL is required\n\n") + parser.WriteUsage(os.Stderr) + os.Exit(1) + } + + // Validate URL starts with http:// or https:// + url := args.URL + if !strings.HasPrefix(url, "http://") && !strings.HasPrefix(url, "https://") { + url = "https://" + url + } + + // Determine output destination + var output *os.File = os.Stdout + if args.Output != "" { + f, err := os.Create(args.Output) + if err != nil { + fmt.Fprintf(os.Stderr, "Error creating output file: %v\n", err) + os.Exit(1) + } + defer f.Close() + output = f + } + + // Fetch the URL using req with timeout and custom User-Agent + client := req.C(). + SetTimeout(time.Duration(args.Timeout) * time.Second). + SetUserAgent(args.UserAgent) + + resp, err := client.R().Get(url) + if err != nil { + fmt.Fprintf(os.Stderr, "Error fetching URL: %v\n", err) + os.Exit(1) + } + + if !resp.IsSuccessState() { + fmt.Fprintf(os.Stderr, "HTTP error: %s\n", resp.Status) + os.Exit(1) + } + + // Get HTML content + html := resp.String() + + // Convert HTML to Markdown with domain context for relative URLs + markdown, err := htmltomarkdown.ConvertString( + html, + converter.WithDomain(url), + ) + if err != nil { + fmt.Fprintf(os.Stderr, "Error converting HTML to Markdown: %v\n", err) + os.Exit(1) + } + + // Output Markdown to destination + fmt.Fprint(output, markdown) +} +
A go.mod

@@ -0,0 +1,25 @@

+module maxwelljensen/mdget + +go 1.25.8 + +require ( + github.com/JohannesKaufmann/html-to-markdown/v2 v2.5.0 + github.com/imroc/req/v3 v3.57.0 +) + +require ( + github.com/JohannesKaufmann/dom v0.2.0 // indirect + github.com/alexflint/go-arg v1.6.1 + github.com/alexflint/go-scalar v1.2.0 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/icholy/digest v1.1.0 // indirect + github.com/klauspost/compress v1.18.2 // indirect + github.com/quic-go/qpack v0.6.0 // indirect + github.com/quic-go/quic-go v0.57.1 // indirect + github.com/refraction-networking/utls v1.8.1 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect +)
A go.sum

@@ -0,0 +1,59 @@

+github.com/JohannesKaufmann/dom v0.2.0 h1:1bragmEb19K8lHAqgFgqCpiPCFEZMTXzOIEjuxkUfLQ= +github.com/JohannesKaufmann/dom v0.2.0/go.mod h1:57iSUl5RKric4bUkgos4zu6Xt5LMHUnw3TF1l5CbGZo= +github.com/JohannesKaufmann/html-to-markdown/v2 v2.5.0 h1:mklaPbT4f/EiDr1Q+zPrEt9lgKAkVrIBtWf33d9GpVA= +github.com/JohannesKaufmann/html-to-markdown/v2 v2.5.0/go.mod h1:D56Cl9r8M5i3UwAchE+LlLc5hPN3kJtdZNVJn06lSHU= +github.com/alexflint/go-arg v1.6.1 h1:uZogJ6VDBjcuosydKgvYYRhh9sRCusjOvoOLZopBlnA= +github.com/alexflint/go-arg v1.6.1/go.mod h1:nQ0LFYftLJ6njcaee0sU+G0iS2+2XJQfA8I062D0LGc= +github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw= +github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/icholy/digest v1.1.0 h1:HfGg9Irj7i+IX1o1QAmPfIBNu/Q5A5Tu3n/MED9k9H4= +github.com/icholy/digest v1.1.0/go.mod h1:QNrsSGQ5v7v9cReDI0+eyjsXGUoRSUZQHeQ5C4XLa0Y= +github.com/imroc/req/v3 v3.57.0 h1:LMTUjNRUybUkTPn8oJDq8Kg3JRBOBTcnDhKu7mzupKI= +github.com/imroc/req/v3 v3.57.0/go.mod h1:JL62ey1nvSLq81HORNcosvlf7SxZStONNqOprg0Pz00= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= +github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= +github.com/quic-go/quic-go v0.57.1 h1:25KAAR9QR8KZrCZRThWMKVAwGoiHIrNbT72ULHTuI10= +github.com/quic-go/quic-go v0.57.1/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= +github.com/refraction-networking/utls v1.8.1 h1:yNY1kapmQU8JeM1sSw2H2asfTIwWxIkrMJI0pRUOCAo= +github.com/refraction-networking/utls v1.8.1/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM= +github.com/sebdah/goldie/v2 v2.8.0 h1:dZb9wR8q5++oplmEiJT+U/5KyotVD+HNGCAc5gNr8rc= +github.com/sebdah/goldie/v2 v2.8.0/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= +github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=