@@ -16,7 +16,7 @@ Inspired by [Simon Willison's tools collection](https://github.com/simonw/tools)
1616<!-- TOOLS_START -->
1717
1818<details >
19- <summary ><strong >📊 Data</strong > (2 tools)</summary >
19+ <summary ><strong >📊 Data Processing </strong > (7 tools)</summary >
2020
2121<details >
2222<summary ><a href =" python/convert_arrow_to_parquet_streaming.py " ><code >convert_arrow_to_parquet_streaming.py</code ></a ></summary >
@@ -92,50 +92,6 @@ Options:
9292
9393</details >
9494
95- </details >
96-
97- <details >
98- <summary ><strong >🛠️ Dev</strong > (1 tool)</summary >
99-
100- <details >
101- <summary ><a href =" python/ipynb_to_py_sphinx.py " ><code >ipynb_to_py_sphinx.py</code ></a ></summary >
102-
103- Output of <code >uv run https://tools.ricardodecal.com/python/ipynb_to_py_sphinx.py --help</code >:
104-
105- <pre ><code >Usage: ipynb_to_py_sphinx.py [OPTIONS] NOTEBOOK
106-
107- Convert a Jupyter notebook to a Sphinx Gallery Python script.
108-
109- This tool converts a .ipynb file to a .py file formatted for Sphinx Gallery.
110- It converts Markdown cells to RST (using pypandoc) and comments them out,
111- while preserving code cells. It also handles magic commands by commenting
112- them out.
113-
114- Based on: https://gist.github.com/chsasank/7218ca16f8d022e02a9c0deb94a310fe
115-
116- Arguments: NOTEBOOK: The path to the input Jupyter notebook (.ipynb).
117-
118- Examples:
119-
120- uv run https://tools.ricardodecal.com/python/ipynb_to_py_sphinx.py
121- notebook.ipynb
122-
123- uv run https://tools.ricardodecal.com/python/ipynb_to_py_sphinx.py
124- notebook.ipynb --output my_gallery_script.py
125-
126- Options:
127- -o, --output PATH Output Python file path. Defaults to notebook name with
128- .py extension.
129- --help Show this message and exit.
130- </code ></pre >
131-
132- </details >
133-
134- </details >
135-
136- <details >
137- <summary ><strong >📁 Files</strong > (2 tools)</summary >
138-
13995<details >
14096<summary ><a href =" python/dedup_dirs.py " ><code >dedup_dirs.py</code ></a ></summary >
14197
@@ -179,28 +135,6 @@ Options:
179135
180136</details >
181137
182- <details >
183- <summary ><a href =" python/strip_pdf_metadata.py " ><code >strip_pdf_metadata.py</code ></a ></summary >
184-
185- Output of <code >uv run https://tools.ricardodecal.com/python/strip_pdf_metadata.py --help</code >:
186-
187- <pre ><code >Usage: strip_pdf_metadata.py [OPTIONS] INPUT_FILE [OUTPUT_FILE]
188-
189- Strip metadata from a PDF file.
190-
191- If OUTPUT_FILE is not provided, writes to 'stripped_<INPUT_FILE >'.
192-
193- Options:
194- --help Show this message and exit.
195- </code ></pre >
196-
197- </details >
198-
199- </details >
200-
201- <details >
202- <summary ><strong >🎬 Media</strong > (2 tools)</summary >
203-
204138<details >
205139<summary ><a href =" python/download_video.py " ><code >download_video.py</code ></a ></summary >
206140
@@ -234,6 +168,59 @@ Options:
234168
235169</details >
236170
171+ <details >
172+ <summary ><a href =" python/html_to_text.py " ><code >html_to_text.py</code ></a ></summary >
173+
174+ Output of <code >uv run https://tools.ricardodecal.com/python/html_to_text.py --help</code >:
175+
176+ <pre ><code >Usage: html_to_text.py [OPTIONS] URL
177+
178+ Fetch a webpage and convert its readable content to plain text.
179+
180+ Uses inscriptis to extract text from HTML while preserving basic structure.
181+ Automatically adds https:// if no scheme is provided.
182+
183+ Arguments:
184+
185+ URL: The webpage URL to fetch (e.g., example.com or
186+ https://example.com).
187+
188+ Examples:
189+
190+ uv run https://tools.ricardodecal.com/python/html_to_text.py example.com
191+
192+ uv run https://tools.ricardodecal.com/python/html_to_text.py
193+ https://news.ycombinator.com --timeout 30
194+
195+ uv run https://tools.ricardodecal.com/python/html_to_text.py
196+ wikipedia.org/wiki/Python --raw
197+
198+ Options:
199+ -t, --timeout INTEGER Request timeout in seconds.
200+ --raw Skip whitespace cleanup (preserve original
201+ formatting).
202+ --help Show this message and exit.
203+ </code ></pre >
204+
205+ </details >
206+
207+ <details >
208+ <summary ><a href =" python/strip_pdf_metadata.py " ><code >strip_pdf_metadata.py</code ></a ></summary >
209+
210+ Output of <code >uv run https://tools.ricardodecal.com/python/strip_pdf_metadata.py --help</code >:
211+
212+ <pre ><code >Usage: strip_pdf_metadata.py [OPTIONS] INPUT_FILE [OUTPUT_FILE]
213+
214+ Strip metadata from a PDF file.
215+
216+ If OUTPUT_FILE is not provided, writes to 'stripped_<INPUT_FILE >'.
217+
218+ Options:
219+ --help Show this message and exit.
220+ </code ></pre >
221+
222+ </details >
223+
237224<details >
238225<summary ><a href =" python/yt_transcript.py " ><code >yt_transcript.py</code ></a ></summary >
239226
@@ -262,6 +249,84 @@ Options:
262249
263250</details >
264251
252+ <details >
253+ <summary ><strong >🛠️ Development</strong > (2 tools)</summary >
254+
255+ <details >
256+ <summary ><a href =" python/burn_iso.py " ><code >burn_iso.py</code ></a ></summary >
257+
258+ Output of <code >uv run https://tools.ricardodecal.com/python/burn_iso.py --help</code >:
259+
260+ <pre ><code >Usage: burn_iso.py [OPTIONS] ISO_FILE
261+
262+ Burn an ISO file to a USB drive with safety checks and progress monitoring.
263+
264+ This tool will verify the ISO file, check the target device, unmount any
265+ mounted partitions, and burn the ISO using dd with progress reporting.
266+
267+ DANGER: This will completely erase all data on the target USB device!
268+
269+ Arguments:
270+
271+ ISO_FILE: Path to the ISO file to burn.
272+
273+ Examples:
274+
275+ uv run https://tools.ricardodecal.com/python/burn_iso.py --list
276+
277+ uv run https://tools.ricardodecal.com/python/burn_iso.py ubuntu.iso
278+ --device /dev/sdb --dry-run
279+
280+ uv run https://tools.ricardodecal.com/python/burn_iso.py
281+ ~/Downloads/debian.iso -d /dev/sdc
282+
283+ Options:
284+ -d, --device TEXT USB device path (e.g., /dev/sdb). Use --list to see
285+ available devices. [required]
286+ --list List available block devices and exit.
287+ -n, --dry-run Show what would be done without actually doing it.
288+ -f, --force Skip confirmation prompts.
289+ --help Show this message and exit.
290+ </code ></pre >
291+
292+ </details >
293+
294+ <details >
295+ <summary ><a href =" python/ipynb_to_py_sphinx.py " ><code >ipynb_to_py_sphinx.py</code ></a ></summary >
296+
297+ Output of <code >uv run https://tools.ricardodecal.com/python/ipynb_to_py_sphinx.py --help</code >:
298+
299+ <pre ><code >Usage: ipynb_to_py_sphinx.py [OPTIONS] NOTEBOOK
300+
301+ Convert a Jupyter notebook to a Sphinx Gallery Python script.
302+
303+ This tool converts a .ipynb file to a .py file formatted for Sphinx Gallery.
304+ It converts Markdown cells to RST (using pypandoc) and comments them out,
305+ while preserving code cells. It also handles magic commands by commenting
306+ them out.
307+
308+ Based on: https://gist.github.com/chsasank/7218ca16f8d022e02a9c0deb94a310fe
309+
310+ Arguments: NOTEBOOK: The path to the input Jupyter notebook (.ipynb).
311+
312+ Examples:
313+
314+ uv run https://tools.ricardodecal.com/python/ipynb_to_py_sphinx.py
315+ notebook.ipynb
316+
317+ uv run https://tools.ricardodecal.com/python/ipynb_to_py_sphinx.py
318+ notebook.ipynb --output my_gallery_script.py
319+
320+ Options:
321+ -o, --output PATH Output Python file path. Defaults to notebook name with
322+ .py extension.
323+ --help Show this message and exit.
324+ </code ></pre >
325+
326+ </details >
327+
328+ </details >
329+
265330<!-- TOOLS_END -->
266331
267332## License
0 commit comments