Go to Sign up
Note: Your files never leave your device. We don't upload, transfer, or store your data.
|
|
|
|
|---|---|---|
|
|
|
The Markdown To Custom Template Converter on A.Tools transforms Markdown pipe-delimited tables into any text format you define — SQL statements, HTML select tags, PHP arrays, C arrays, JSON objects, JIRA tables, LDIF entries, URL query parameters, shell commands, and more. All processing runs in your browser. No data leaves your device.
Unlike fixed-format converters, this tool gives you full control over the output through a template engine with three template fields (Header, Row, Footer) and a powerful variable syntax. Choose from 18 built-in templates or write your own.
Click Enter Data to paste a Markdown table into the input area, or click Choose File to drag and drop a .md file. Press Sample to load example data.
Once parsed, an interactive spreadsheet appears. Use the toolbar to:
Add or delete rows and columns
Transpose the table (swap rows and columns)
Remove duplicate rows
Delete empty rows and columns
Change text case (UPPERCASE, lowercase, Capitalize)
Find and replace values — supports case-sensitive search and regex
Toggle First Row as Header to define column names (used in {hN} variables)
Right-click any cell for context-menu operations.
In the Properties panel:
Built-in Template: Select from 18 pre-built formats, or choose "Make your Magic" for a blank template
Row Template (required): The pattern applied to every data row
Header Template (optional): Applied once before all rows (using the first row's data)
Footer Template (optional): Applied once after all rows (using the last row's data)
Click Convert to generate output. Use Copy to Clipboard or Download File to save the result.
Two input modes: Paste Markdown directly or upload a .md file via drag-and-drop
Full table editor: Edit, transpose, deduplicate, find-and-replace before converting
18 built-in templates: SQL, PHP, C, JSON, HTML, JIRA, LDIF, CSV, URL params, and more
Custom template engine: Define your own output format with header, row, and footer templates
Powerful variable syntax: {$N} for values, {hN} for headers, {NR} for row numbers, {x expr} for JS expressions
Method chaining: .upper, .lower, .trim, .replace() on any variable
Client-side processing: Files never leave the browser — zero data upload
Undo/Redo: Full edit history with revert support
Context menu: Right-click for quick row/column/cell operations
Header toggle: Treat the first row as column names or regular data
Validation indicator: Real-time feedback on input validity
| Syntax | Description | Example |
|---|---|---|
{$1} | Value of column 1 (1-indexed) | Alice |
{$2} | Value of column 2 | 30 |
{$N} | Value of column N | Any column |
{h1} | Header of column 1 | Name |
{h2} | Header of column 2 | Age |
{hN} | Header of column N | Any column header |
{NR} | Current row number (1-indexed) | 1, 2, 3 |
{NR+5} | Row number plus offset | 6 for row 1 |
{ENR} | Total number of data rows | 4 |
{x expr} | Evaluate JavaScript expression | {x $1 + $2} |
\{ / \} | Literal { or } character | \{$1\} → {$1} |
Append a dot-method to any variable:
| Method | Effect | Example |
|---|---|---|
.upper | Convert to UPPERCASE | {$1.upper} → ALICE |
.lower | Convert to lowercase | {$1.lower} → alice |
.trim | Remove leading/trailing whitespace | {$1.trim} |
.replace("a","b") | Replace text | {$1.replace(" ","_")} → New_York |
Columns can be referenced by number (1, 2, 3) or letter (A, B, C, ..., Z, AA, AB).
| Field | Required | Applied To |
|---|---|---|
| Row Template | Yes | Every data row |
| Header Template | No | Once, before all rows (uses first row's data) |
| Footer Template | No | Once, after all rows (uses last row's data) |
Use \{ and \} to output literal curly braces without triggering variable substitution.
UPDATE table SET {h2} = '{$2}' WHERE {h1} = '{$1}';Output:
UPDATE table SET Age = '30' WHERE Name = 'Alice';
UPDATE table SET Age = '25' WHERE Name = 'Bob';
<?php$array = [
['Alice', '30', 'NY'],
['Bob', '25', 'London'],
];
char *array[] = {
"Alice",
"Bob",
};
<select>
<option value="Alice">30</option>
<option value="Bob">25</option>
</select>
||Name||Age||City||
|Alice|30|NY|
|Bob|25|London|
{"Alice": "30"}
{"Bob": "25"}
dn: Alice
Age: 30
City: NY
Name=Alice&Age=30&City=NYAlice;30;NY
Bob;25;London
"Alice" "30" "NY"'Alice' '30' 'NY'rename "Alice" "30"RENAME COLUMN Alice TO 30touch Alice
touch Bob
echo "30" > Alice
echo "25" > Bob
Alice
30
NY
Blank template — fill in your own Row Template, Header Template, and Footer Template.
| Scenario | Template Pattern |
|---|---|
| SQL INSERT statements | INSERT INTO table ({h1},{h2}) VALUES ('{$1}','{$2}'); |
| SQL UPDATE statements | Built-in template available |
| HTML dropdowns | Built-in template available |
| JIRA table markup | Built-in template available |
| PHP arrays | Built-in template available |
| C string arrays | Built-in template available |
| JSON key-value pairs | Built-in template available |
| LDIF directory entries | Built-in template available |
| URL query strings | Built-in template available |
| Shell scripts | echo "Processing {$1}..." && ./script --name "{$1}" |
| Configuration files | {$1}={$2} (key=value format) |
| Batch file creation | Built-in template available |
| Email merge templates | Dear {$1}, your {$2} is {$3}. |
| Docker commands | docker run --name {$1} -p {$2} {$3} |
| curl commands | curl -X POST -d '{$1}={$2}' http://api.example.com |
| Python dictionaries | '{$1}': '{$2}', |
| CSS custom properties | --{h1.lower}: {$1}; |
| Markdown links | [{$1}]({$2}) |
Row Template:
INSERT INTO users ({h1}, {h2}, {h3}) VALUES ('{$1}', '{$2}', '{$3}');Output:
INSERT INTO users (Name, Age, City) VALUES ('Alice', '30', 'NY');
INSERT INTO users (Name, Age, City) VALUES ('Bob', '25', 'London');
Row Template:
docker run -d --name {$1.lower} -p {$2}:80 {$3}Output:
docker run -d --name webapp -p 8080:80 nginx:latest
docker run -d --name api -p 3000:80 node:18
Header Template:
Subject: {h1} Report - {h2}Row Template:
Dear {$1},
Your score on the {$2} exam is {$3}.
No. All file parsing and conversion runs in your browser using JavaScript. Your data stays on your device. A.Tools never receives, stores, or transmits your file contents.
The tool supports standard pipe-delimited Markdown tables following the CommonMark specification, including tables with or without leading/trailing pipes and alignment indicators.
Use {$1} for the first column's value, {$2} for the second, and so on. Use {h1}, {h2} for column headers. See the Template Syntax Reference above for the complete variable list.
{NR} mean? {NR} is the current row number, starting from 1. Use {NR+5} to add an offset (e.g., for field numbers in a protobuf definition starting at 6).
{ENR} mean? {ENR} is the total number of data rows. Useful for progress indicators or summary lines in the footer template.
Yes. Use the {x expr} syntax to evaluate JavaScript. For example, {x $1 + $2} adds the values of columns 1 and 2.
The Header Template is processed once before all rows (using the first row's data). The Footer Template is processed once after all rows (using the last row's data). Both are optional. Use them for opening/closing syntax like char *array[] = { and };.
Use \{ and \} to output literal curly braces. For example, \{$1\} produces the literal text {$1} without variable substitution.
Yes. After parsing, the full table editor lets you modify cells, add or remove rows and columns, transpose, deduplicate, change text case, and find-and-replace values.
Processing is client-side, so the limit depends on your browser's memory. Tables with tens of thousands of rows work reliably on modern browsers.