20 KiB
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 = ""; let description = document.getElementById('description').value; if (updatedYear && currentYear - updatedYear > 5) { maintenance = "Not Maintained"; maintenance_year = `updated_year = ${updatedYear}\n`; description = `\{\{\}\}\n\n` + description } 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 NASA Open-Source 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{{}}