199 lines
4.7 KiB
Markdown
199 lines
4.7 KiB
Markdown
# Big Chef
|
|
|
|
A Go-based tool for modifying XML, JSON, and text documents using XPath/JSONPath/Regex expressions and Lua transformations.
|
|
|
|
## Features
|
|
|
|
- **Multi-Format Processing**:
|
|
- XML (XPath)
|
|
- JSON (JSONPath)
|
|
- Text (Regex)
|
|
- **Node Value Modification**: Update text values in XML elements, JSON properties or text matches
|
|
- **Attribute Manipulation**: Modify XML attributes, JSON object keys or regex capture groups
|
|
- **Conditional Logic**: Apply transformations based on document content
|
|
- **Complex Operations**:
|
|
- Mathematical calculations
|
|
- String manipulations
|
|
- Date conversions
|
|
- Structural changes
|
|
- CSV/TSV parsing with comments and headers
|
|
- Whole ass Lua environment
|
|
- **Error Handling**: Comprehensive error detection for:
|
|
- Invalid XML/JSON
|
|
- Malformed XPath/JSONPath
|
|
- Lua syntax errors
|
|
|
|
## Usage Examples
|
|
|
|
### 1. Basic field modification
|
|
```xml
|
|
<!-- Input -->
|
|
<price>44.95</price>
|
|
|
|
<!-- Command -->
|
|
chef -xml "//price" "v=v*2" input.xml
|
|
|
|
<!-- Output -->
|
|
<price>89.9</price>
|
|
```
|
|
|
|
### 2. Supports glob patterns
|
|
```xml
|
|
chef -xml "//price" "v=v*2" data/**.xml
|
|
```
|
|
|
|
### 3. Attribute Update
|
|
```xml
|
|
<!-- Input -->
|
|
<item price="10.50"/>
|
|
|
|
<!-- Command -->
|
|
chef -xml "//item/@price" "v=v*2" input.xml
|
|
|
|
<!-- Output -->
|
|
<item price="21"/>
|
|
```
|
|
|
|
### 3. JSONPath Transformation
|
|
```json
|
|
// Input
|
|
{
|
|
"products": [
|
|
{"name": "Widget", "price": 19.99},
|
|
{"name": "Gadget", "price": 29.99}
|
|
]
|
|
}
|
|
|
|
// Command
|
|
chef -json "$.products[*].price" "v=v*0.75" input.json
|
|
|
|
// Output
|
|
{
|
|
"products": [
|
|
{"name": "Widget", "price": 14.99},
|
|
{"name": "Gadget", "price": 22.49}
|
|
]
|
|
}
|
|
```
|
|
|
|
### 4. Regex Text Replacement
|
|
Regex works slightly differently, up to 12 match groups are provided as v1..v12 and s1..s12 for numbers and strings respectively.
|
|
A special shorthand "!num" is also provided that simply expands to `(\d*\.?\d+)`.
|
|
```xml
|
|
<!-- Input -->
|
|
<description>Price: $15.00 Special Offer</description>
|
|
|
|
<!-- Command -->
|
|
chef "Price: $!num Special Offer" "v1 = v1 * 0.92" input.xml
|
|
|
|
<!-- Output -->
|
|
<description>Price: $13.80 Special Offer</description>
|
|
```
|
|
|
|
### 5. Conditional Transformation
|
|
```xml
|
|
<!-- Input -->
|
|
<item stock="5" price="10.00"/>
|
|
|
|
<!-- Command -->
|
|
chef -xml "//item" "if tonumber(v.stock) > 0 then v.price = v.price * 0.8 end" input.xml
|
|
|
|
<!-- Output -->
|
|
<item stock="5" price="8.00"/>
|
|
```
|
|
|
|
### 6. CSV/TSV Processing
|
|
The Lua environment includes CSV parsing functions that support comments, headers, and custom delimiters.
|
|
|
|
```lua
|
|
-- Basic CSV parsing
|
|
local rows = fromCSV(csvText)
|
|
|
|
-- With options
|
|
local rows = fromCSV(csvText, {
|
|
delimiter = "\t", -- Tab delimiter for TSV (default: ",")
|
|
hasHeaders = true, -- First row is headers (default: false)
|
|
hasComments = true -- Filter lines starting with # (default: false)
|
|
})
|
|
|
|
-- Access by index
|
|
local value = rows[1][2]
|
|
|
|
-- Access by header name (when hasHeaders = true)
|
|
local value = rows[1].Name
|
|
|
|
-- Convert back to CSV
|
|
local csv = toCSV(rows, "\t") -- Optional delimiter parameter
|
|
```
|
|
|
|
**Example with commented TSV file:**
|
|
```lua
|
|
-- Input file:
|
|
-- #mercenary_profiles
|
|
-- Id Name Value
|
|
-- 1 Test 100
|
|
-- 2 Test2 200
|
|
|
|
local csv = readFile("mercenaries.tsv")
|
|
local rows = fromCSV(csv, {
|
|
delimiter = "\t",
|
|
hasHeaders = true,
|
|
hasComments = true
|
|
})
|
|
|
|
-- Access data
|
|
rows[1].Name -- "Test"
|
|
rows[2].Value -- "200"
|
|
```
|
|
|
|
## Lua Helper Functions
|
|
|
|
The Lua environment includes many helper functions:
|
|
|
|
### Math Functions
|
|
- `min(a, b)`, `max(a, b)` - Min/max of two numbers
|
|
- `round(x, n)` - Round to n decimal places
|
|
- `floor(x)`, `ceil(x)` - Floor/ceiling functions
|
|
|
|
### String Functions
|
|
- `upper(s)`, `lower(s)` - Case conversion
|
|
- `trim(s)` - Remove leading/trailing whitespace
|
|
- `format(s, ...)` - String formatting
|
|
- `strsplit(inputstr, sep)` - Split string by separator
|
|
|
|
### CSV Functions
|
|
- `fromCSV(csv, options)` - Parse CSV/TSV text into table of rows
|
|
- Options: `delimiter` (default: ","), `hasHeaders` (default: false), `hasComments` (default: false)
|
|
- `toCSV(rows, delimiter)` - Convert table of rows back to CSV text
|
|
|
|
### Conversion Functions
|
|
- `num(str)` - Convert string to number (returns 0 if invalid)
|
|
- `str(num)` - Convert number to string
|
|
- `is_number(str)` - Check if string is numeric
|
|
|
|
### Table Functions
|
|
- `isArray(t)` - Check if table is a sequential array
|
|
- `dump(table, depth)` - Print table structure recursively
|
|
|
|
### HTTP Functions
|
|
- `fetch(url, options)` - Make HTTP request, returns response table
|
|
- Options: `method`, `headers`, `body`
|
|
- Returns: `{status, statusText, ok, body, headers}`
|
|
|
|
### Regex Functions
|
|
- `re(pattern, input)` - Apply regex pattern, returns table with matches
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
go build -o chef main.go
|
|
```
|
|
|
|
```bash
|
|
# Process XML file
|
|
./chef -xml "//price" "v=v*1.2" input.xml
|
|
|
|
# Process JSON file
|
|
./chef -json "$.prices[*]" "v=v*0.9" input.json
|
|
```
|