Запросы. Фильтрация. Трансформация Markdown.
mq — это инструмент командной строки для обработки Markdown с синтаксисом, схожим с jq. Написан на Rust и позволяет легко нарезать, фильтровать, трансформировать и преобразовывать структурированные данные.
|
Важно
|
Проект находится в активной разработке. |
mq делает работу с Markdown-файлами такой же удобной, как jq — с JSON. Инструмент особенно полезен в следующих сценариях:
-
Рабочие процессы с LLM: эффективная обработка Markdown, используемого в промптах и ответах языковых моделей.
-
Подготовка входных данных для LLM: генерация структурированного Markdown-контента, оптимизированного для потребления языковыми моделями, поскольку Markdown является основным форматом входных данных для большинства из них.
-
Управление документацией: извлечение, преобразование и организация контента из множества документационных файлов.
-
Анализ содержимого: быстрое извлечение конкретных разделов или паттернов из Markdown-документов.
-
Пакетная обработка: применение единообразных преобразований к множеству Markdown-файлов.
Поскольку входные данные для LLM преимущественно представлены в формате Markdown, mq предоставляет эффективные инструменты для генерации и обработки структурированного Markdown-контента, необходимого языковым моделям.
-
Нарезка и фильтрация: легко извлекайте нужные части Markdown-документов.
-
Трансформация и преобразование: применяйте любые преобразования к Markdown-контенту.
-
Интерфейс командной строки: простой и интуитивный CLI для быстрых операций.
-
Расширяемость: легко расширяется пользовательскими функциями.
-
Встроенная поддержка: фильтрация и трансформация контента с помощью множества встроенных функций и селекторов.
-
Поддержка REPL: интерактивный REPL командной строки для тестирования и экспериментов.
-
Поддержка IDE: расширение для VSCode и поддержка Language Server Protocol (LSP) для разработки пользовательских функций.
-
Отладчик: экспериментальный отладчик (
mq-dbg) для пошагового выполнения и инспекции запросов mq. -
Внешние подкоманды: расширяйте
mqсобственными подкомандами — достаточно разместить исполняемые файлы с префиксомmq-в~/.local/bin/.
Установка
Установка через скрипт
curl -sSL https://mqlang.org/install.sh | bash
Скрипт установщика выполняет следующее:
-
скачивает актуальный бинарный файл
mqдля вашей платформы; -
устанавливает его в
~/.local/bin/; -
обновляет профиль оболочки, добавляя
mqвPATH.
Установка через Cargo
# Установка из crates.io
cargo install mq-run
# Установка из GitHub
cargo install --git https://github.com/harehare/mq.git mq-run --tag v0.6.0
# Последняя версия из ветки разработки
cargo install --git https://github.com/harehare/mq.git mq-run --bin mq
# Установка отладчика
cargo install --git https://github.com/harehare/mq.git mq-run --bin mq-dbg --features="debugger"
# Установка через binstall
cargo binstall mq-run@0.6.0
Готовые бинарные файлы
Готовые бинарные файлы можно скачать со страницы релизов на GitHub:
# macOS (Apple Silicon)
curl -L https://github.com/harehare/mq/releases/download/v0.6.0/mq-aarch64-apple-darwin -o /usr/local/bin/mq && chmod +x /usr/local/bin/mq
# Linux x86_64
curl -L https://github.com/harehare/mq/releases/download/v0.6.0/mq-x86_64-unknown-linux-gnu -o /usr/local/bin/mq && chmod +x /usr/local/bin/mq
# Linux arm64
curl -L https://github.com/harehare/mq/releases/download/v0.6.0/mq-aarch64-unknown-linux-gnu -o /usr/local/bin/mq && chmod +x /usr/local/bin/mq
# Windows (PowerShell)
Invoke-WebRequest -Uri https://github.com/harehare/mq/releases/download/v0.6.0/mq-x86_64-pc-windows-msvc.exe -OutFile "$env:USERPROFILE\bin\mq.exe"
Homebrew
# Для macOS и Linux
brew install mq
AUR (ArchLinux)
# С помощью yay
yay -S mq-bin
Docker
docker run --rm ghcr.io/harehare/mq:0.6.0
Интеграция с редакторами
VSCode
Расширение для VSCode можно установить из Visual Studio Marketplace. Для редакторов, совместимых с VS Code, расширение также доступно в Open VSX Registry.
Neovim
Плагин для Neovim устанавливается по инструкции из README mq.nvim.
Zed
Расширение для Zed доступно в репозитории harehare/zed-mq.
Использование в GitHub Actions
mq можно использовать в рабочих процессах GitHub Actions с помощью действия Setup mq:
steps:
- uses: actions/checkout@v6
- uses: harehare/setup-mq@v1
- run: mq '.code' README.md
Песочница и веб
Языковые привязки
Языковые привязки (language bindings) доступны для Elixir, Python, Ruby, Java и Go. Подробнее — в документации по языковым привязкам.
Документация и примеры
Подробное описание использования и примеры приведены в документации.
Исчерпывающую коллекцию практических примеров можно найти в руководстве по примерам.
Полный список параметров
Usage: mq [OPTIONS] [QUERY OR FILE] [FILES]... [COMMAND]
Commands:
repl Start a REPL session for interactive query execution
help Print this message or the help of the given subcommand(s)
Arguments:
[QUERY OR FILE]
[FILES]...
Options:
-A, --aggregate
Aggregate all input files/content into a single array
-f, --from-file
load filter from the file
-I, --input-format <INPUT_FORMAT>
Set input format [possible values: markdown, mdx, html, text, null, raw, bytes, cbor, csv, hcl, json, psv, toml, toon, tsv, xml, yaml]
-L, --directory <MODULE_DIRECTORIES>
Search modules from the directory
-M, --module-names <MODULE_NAMES>
Load additional modules from specified files
-m, --import-module-names <IMPORT_MODULE_NAMES>
Import modules by name, making them available as `name::fn()` in queries
--args <NAME> <VALUE>
Sets a named string argument. NAME is accessible directly in queries, and also via ARGS."named" when --args or --argv is given
--rawfile <NAME> <FILE>
Sets file contents that can be referenced at runtime
--stream
Enable streaming mode for processing large files line by line
-F, --output-format <OUTPUT_FORMAT>
Set output format [default: markdown] [possible values: markdown, html, text, json, table, grep, raw, none]
-U, --update
Update the input markdown (aliases: -i, --in-place, --inplace)
--unbuffered
Unbuffered output
--list-style <LIST_STYLE>
Set the list style for markdown output [default: dash] [possible values: dash, plus, star]
--link-title-style <LINK_TITLE_STYLE>
Set the link title surround style for markdown output [default: double] [possible values: double, single, paren]
--link-url-style <LINK_URL_STYLE>
Set the link URL surround style for markdown links [default: none] [possible values: none, angle]
-S, --separator <QUERY>
Specify a query to insert between files as a separator
-o, --output <FILE>
Output to the specified file
-C, --color-output
Colorize markdown output
-B, --before-context <NUM>
Show NUM nodes before each match. Only effective with -F grep
--after-context <NUM>
Show NUM nodes after each match. Only effective with -F grep
--context <NUM>
Show NUM nodes before and after each match. Only effective with -F grep
--list
List all available subcommands (built-in and external)
--doc
Use the built-in reference document as input instead of a file
-P <PARALLEL_THRESHOLD>
Number of files to process before switching to parallel processing [default: 10]
--argv [<ARGV>...]
Positional string arguments, available as ARGS."positional" in queries
-O, --optimize-level <OPTIMIZE_LEVEL>
Optimization level for AST transformations (none = no changes, basic = constant folding and dead-branch elimination, full = all passes) [default: none] [possible values: none, basic, full]
-h, --help
Print help
-V, --version
Print version
# Examples
mq 'query' file.md
mq -f 'file' file.md # read query from file
mq repl # start a REPL session
# Auto-parsing by file extension or -I flag
mq automatically imports the matching module based on the file extension.
Use -I <format> to force a specific format:
.cbor / -I cbor import "cbor" | cbor::cbor_parse() (reads as bytes)
.csv / -I csv import "csv" | csv::csv_parse(true)
.hcl / -I hcl import "hcl" | hcl::hcl_parse()
.json / -I json import "json" | json::json_parse()
.psv / -I psv import "csv" | csv::psv_parse(true)
.toml / -I toml import "toml" | toml::toml_parse()
.toon / -I toon import "toon" | toon::toon_parse()
.tsv / -I tsv import "csv" | csv::tsv_parse(true)
.xml / -I xml import "xml" | xml::xml_parse()
.yaml / -I yaml import "yaml" | yaml::yaml_parse()
Use -I raw to disable auto-parsing and receive the raw string.
Use -I bytes to read input as raw bytes without parsing.
# Passing arguments to queries (ARGS)
When --args or --argv is given, ARGS = {"positional": [...], "named": {...}}
mq -I null 'name' --args name Alice
mq -I null 'ARGS | ."named"' --args name Alice
# => {"name": "Alice"}
mq -I null 'ARGS | ."positional"' --argv x y z # must come after query and files
# => ["x", "y", "z"]
mq -I null 'ARGS' file.md --args name Alice --argv x y z
# => {"positional": ["x","y","z"], "named": {"name": "Alice"}}
Примеры использования
Ниже приведены базовые примеры работы с mq:
# Извлечь все заголовки из документа
mq '.h' README.md
# Извлечь только заголовки h1
mq '.h(1)' README.md
# Извлечь заголовки h1 и h2
mq '.h(1, 2)' README.md
# Извлечь заголовки с уровня 1 по 3 с помощью диапазона
mq '.h(1..3)' README.md
# Извлечь только блоки кода на Rust
mq '.code("rust")' example.md
# Извлечь блоки кода, содержащие "name"
mq '.code | select(contains("name"))' example.md
# Извлечь значения из блоков кода
mq -A 'pluck(.code.value)' example.md
# Извлечь названия языков из блоков кода
mq '.code.lang' documentation.md
# Извлечь URL из всех ссылок
mq '.link.url' README.md
# Отфильтровать ячейки таблицы, содержащие "name"
mq '.[][] | select(contains("name"))' data.md
# Выбрать списки или заголовки, содержащие "name"
mq 'select(.[] || .h) | select(contains("name"))' docs.md
# Исключить блоки кода на JavaScript
mq '.code | select(.code.lang != "js")' examples.md
# Преобразовать CSV в таблицу Markdown
mq 'include "csv" | csv_parse(true) | csv_to_markdown_table()' example.csv
# Извлечь раздел по заголовку
mq -A 'section::section("Installation")' README.md
# Отфильтровать разделы по уровню заголовка (скаляр или диапазон)
mq -A 'section::sections() | section::by_level(2)' README.md
mq -A 'section::sections() | section::by_level(1..2)' README.md
Конвейерная обработка
Подкоманды mq можно объединять через Unix-каналы (pipes):
# Конвертировать отчёт Excel в Markdown, затем извлечь все заголовки
mq conv report.xlsx | mq '.h'
# Конвертировать документ Word и извлечь определённый раздел
mq conv document.docx | mq -A 'section::section("Summary")'
# Конвертировать и просмотреть Markdown прямо в терминале
mq conv slides.pdf | mq view
Запустите mq --list, чтобы увидеть все доступные подкоманды — встроенные и внешние.
Вы можете расширить mq собственными подкомандами: достаточно разместить исполняемые файлы с именами, начинающимися на mq-, в директории ~/.local/bin/ или в любом другом месте из PATH. Это позволяет добавлять собственные инструменты и рабочие процессы в mq без изменения основного бинарного файла.
Полный список и подробности — в документации по внешним подкомандам.
Участие в проекте
-
⭐ Поставить звезду проекту, если он оказался полезным!
Лицензия
Проект распространяется под лицензией MIT. Подробности — в файле LICENSE.