Files
content/new-tool.md
2025-08-21 17:34:44 -06:00

20 KiB

+++ title = 'New Tool Page Generator' subtitle = "Creates nicely formatted markdown for a new tool, so you don't have to" date = 2025-08-21 +++

This page is useful to generate copy-and-paste source code in Markdown for a new tool. Publications: Coming soon.

Reset the form with Double Click on reset button for safety.

{{}}

<script> function arr(str) { return str.split(',').map(s => s.trim()).filter(Boolean); } function bool(val) { return val ? 'false' : 'true'; } function generateMarkdown() { const title = document.getElementById('title').value; const subtitle = document.getElementById('subtitle').value; const date = new Date().toISOString().slice(0, 10); const homepage = arr(document.getElementById('homepage').value); const sourcecode = arr(document.getElementById('sourcecode').value); const playground = arr(document.getElementById('playground').value); const applications = arr(document.getElementById('applications').value); const developers = arr(document.getElementById('developers').value); const licenses = arr(document.getElementById('licenses').value); const inputs = arr(document.getElementById('inputs').value); const interfaces = arr(document.getElementById('interfaces').value); const updatedYear = parseInt(document.getElementById('updated-year').value, 10); const currentYear = new Date().getFullYear(); let maintenance = "Actively Maintained"; let maintenance_year = ""; if (updatedYear && currentYear - updatedYear > 5) { maintenance = "Not Maintained"; maintenance_year = `updated_year = ${updatedYear}\n`; } const description = document.getElementById('description').value; let md = `+++ title = '${title}' subtitle = '${subtitle}' links = [${homepage.length ? `\n\t{ title = "Homepage", url = "${homepage}", icon = 'fa-solid fa-home' },\n` : ''}${sourcecode.length ? `\t{ title = "Source Code", url = "${sourcecode}", icon = 'fa-solid fa-code' },\n` : ''}${playground.length ? `\t{ title = "Playground", url = "${playground}", icon = 'fa-solid fa-gamepad' }\n` : ''}] applications = ${JSON.stringify(applications)} developers = ${JSON.stringify(developers)} licenses = ${JSON.stringify(licenses)} inputs = ${JSON.stringify(inputs)} interfaces = ${JSON.stringify(interfaces)} maintenance = ${JSON.stringify(maintenance)} ${maintenance_year}draft = false date = ${date} +++\n\n`; md += description; document.getElementById('output').textContent = md; } </script> <style> input[type="text"], input[type="url"], input[type="date"], textarea { width: 100%; box-sizing: border-box; } input,textarea { margin: 0.2rem 0.2rem; font-weight: 500; } table { border-collapse: collapse; width: 100%; background: #eee; color: #000; border-radius: 0.5rem; } th, td { padding: 8px; text-align: left; } tr:nth-child(even) { background: #ccc; } label { color: #000; font-weight: 600; margin-right: 0.5rem; } input, textarea, select { background: #fff; color: #000; border: 2px solid #888; padding: 4px; padding: 0.2rem 1rem; font-size: 0.9rem; } button { background: #000; color: #ccc; border: 2px solid white; padding: 8px 38px; font-size: 1rem; font-weight: bold; cursor: pointer; } button:hover { background: #444; } </style> <script> function getCheckedApplications() { return Array.from(document.querySelectorAll('#applications-checkboxes input[type="checkbox"]:checked')) .map(cb => cb.value); } </script> <script> function getCheckedInputs() { return Array.from(document.querySelectorAll('#inputs-checkboxes input[type="checkbox"]:checked')) .map(cb => cb.value); } </script> <script> function getCheckedInterfaces() { return Array.from(document.querySelectorAll('#interfaces-checkboxes input[type="checkbox"]:checked')) .map(cb => cb.value); } </script>
Theorem Prover   SMT Solver   SAT Solver Constraint Solver
Model Checker   Runtime Verifier   Proof Assistant   Program Prover   Protocol Verifier  
Static Analyzer   Type Checker   Code Synthesizer Parameter Synthesizer  
Test Generator   Model Simulator   Counterexample Generator  
Specification Language   Refinement Tool   Visualizer  
Probabilistic Program Prover   Probabilistic Model Checker   Stochastic Simulator
<script> document.getElementById('other-applications').addEventListener('input', updateApplications); Array.from(document.querySelectorAll('#applications-checkboxes input[type="checkbox"]')).forEach(cb => { cb.addEventListener('change', updateApplications); }); function updateApplications() { const otherValue = document.getElementById('other-applications').value.trim(); const checkboxes = Array.from(document.querySelectorAll('#applications-checkboxes input[type="checkbox"]:checked')).map(cb => cb.value); const applications = otherValue ? [...checkboxes, otherValue] : checkboxes; document.getElementById('applications').value = applications.join(', '); } </script> </script>
GPL-1.0 GPL-2.0 GPL-3.0 AGPL-3.0 LGPL-2.1 LGPL-3.0 EPL-2.0 CDDL-1.0 OSL-3.0 CECILL-2.1 Artistic-2.0 IPL-1.0 OCamlPro Non-Commercial MIT Apache-1.1 Apache-2.0 BSD-2-Clause BSD-3-Clause ISC MPL-2.0 Zlib Unlicense CC0-1.0 All Rights Reserved Select a license document.getElementById('licenses').addEventListener('change', function() { document.getElementById('licenses-hidden').value = this.value; }); </script>
SMT-LIB   DIMACS CNF   AIGER   TPTP   SyGuS   WhyML  
Promela   NuSMV   LTL   CTL  
Verilog   VHDL  
B   Z   Alloy   TLA+  
Coq   Isabelle/HOL   HOL Light   ACL2   PVS  
Maude   CASL  
SPIN   DOT (Graphviz)  
JSON   XML   CSV  
<script> document.getElementById('other-inputs').addEventListener('input', function() { const otherValues = this.value.split(',').map(s => s.trim()).filter(Boolean); const checkboxes = Array.from(document.querySelectorAll('#inputs-checkboxes input[type="checkbox"]:checked')) .map(cb => cb.value); const inputs = otherValues.length ? [...checkboxes, ...otherValues] : checkboxes; document.getElementById('inputs').value = inputs.join(', '); }); </script> <script> document.getElementById('other-inputs').addEventListener('input', function() { const otherValue = this.value.trim(); const checkboxes = Array.from(document.querySelectorAll('#inputs-checkboxes input[type="checkbox"]:checked')) .map(cb => cb.value); const inputs = otherValue ? [...checkboxes, otherValue] : checkboxes; document.getElementById('inputs').value = inputs.join(', '); }); </script>
Web   REST   gRPC   API  
CLI (Command Line)   GUI (Graphical)   REPL  
Toolset Integration   Library   Plugin   IDE Integration  
<script> document.getElementById('other-interfaces').addEventListener('input', updateInterfaces); Array.from(document.querySelectorAll('#interfaces-checkboxes input[type="checkbox"]')).forEach(cb => { cb.addEventListener('change', updateInterfaces); }); function updateInterfaces() { const otherValues = document.getElementById('other-interfaces').value.split(',').map(s => s.trim()).filter(Boolean); const checkboxes = Array.from(document.querySelectorAll('#interfaces-checkboxes input[type="checkbox"]:checked')).map(cb => cb.value); const interfaces = otherValues.length ? [...checkboxes, ...otherValues] : checkboxes; document.getElementById('interfaces').value = interfaces.join(', '); } </script>
<script> document.getElementById('updated-year').addEventListener('input', function() { const year = parseInt(this.value, 10); const currentYear = new Date().getFullYear(); let status = "Actively Maintained"; if (currentYear - year > 5) { status = "Not Maintained"; } }); // Update hidden input when radio changes Array.from(document.getElementsByName('maintenance')).forEach(radio => { radio.addEventListener('change', function() { document.getElementById('maintenance').value = this.value; }); }); </script>
Generate Markdown Reset Form <script> function resetForm() { document.getElementById('title').value = ''; document.getElementById('subtitle').value = ''; document.getElementById('homepage').value = ''; document.getElementById('sourcecode').value = ''; document.getElementById('playground').value = ''; document.getElementById('developers').value = ''; document.getElementById('licenses').value = ''; document.getElementById('licenses-hidden').value = ''; document.getElementById('inputs').value = ''; document.getElementById('interfaces').value = ''; document.getElementById('updated-year').value = ''; document.getElementById('description').value = ''; document.getElementById('other-applications').value = ''; document.getElementById('other-inputs').value = ''; // Uncheck all checkboxes Array.from(document.querySelectorAll('input[type="checkbox"]')).forEach(cb => cb.checked = false); // Clear output document.getElementById('output').textContent = ''; } // Accept "Enter" to trigger Generate Markdown in any field Array.from(document.querySelectorAll('input,select,number')).forEach(el => { el.addEventListener('keydown', function(e) { if (e.key === 'Enter') { e.preventDefault(); generateMarkdown(); } }); }); </script>

Output Markdown:

Copy to Clipboard

{{}}