A library to display rich (Markdown) snippets and texts in a rust terminal application

Overview

MIT Latest Version docs Chat on Miaou

A CLI utilities library leveraging Markdown to format terminal rendering, allowing separation of structure, data and skin.

Based on crossterm so works on most terminals (even on windows).

text

The goal isn't to display any markdown text with its various extensions (a terminal isn't really fit for that). The goal is rather to improve the display of texts in a terminal application when we want both the text and the skin to be easily configured.

Termimad also includes a few utilities helping efficient managing of events and user input in a multithread application.

Wrapping, table balancing, and scrolling are essential features of Termimad.

A text or a table can be displayed in an a priori unknown part of the screen, scrollable if desired, with a dynamically discovered width.

For example this markdown:

|:-:|:-:|-
|**feature**|**supported**|**details**|
|-:|:-:|-
| tables | yes | pipe based, with or without alignments
| italic, bold | yes | star based |
| inline code | yes | `with backquotes` (it works in tables too)
| code bloc | yes |with tabs or code fences
| syntax coloring | no |
| crossed text |  ~~not yet~~ | wait... now it works `~~like this~~`
| horizontal rule | yes | Use 3 or more dashes (`---`)
| lists | yes|* unordered lists supported
|  | |* ordered lists *not* supported
| quotes |  yes |> What a wonderful time to be alive!
| links | no | (but your terminal already handles raw URLs)
|-

will give different results depending on the width:

table

table

table

Usage

[dependencies]
termimad = "0.14"

With the default skin:

termimad::print_inline("**some** *nested **style*** and `some(code)`");

or

print!("{}", termimad::inline("**some** *nested **style*** and `some(code)`"));

Result:

simple example

Inline snippets with a custom skin:

Inline snippets are one line or less.

let mut skin = MadSkin::default();
skin.bold.set_fg(Yellow);
skin.print_inline("*Hey* **World!** Here's `some(code)`");
skin.paragraph.set_fgbg(Magenta, rgb(30, 30, 40));
skin.italic.add_attr(Underlined);
println!("\nand now {}\n", skin.inline("a little *too much* **style!** (and `some(code)` too)"));

Result:

too much style

Texts

Texts can be several lines. Tables and code blocks are automatically aligned, justified and consistently wrapped.

skin.print_text("# title\n* a list item\n* another item");

Scrollable TextView in a raw terminal:

scrollable

The code for this example is in examples/scrollable. To read the whole text just do

cargo run --example scrollable

Templates

In order to separate the rendering format from the content, you may want to have some constant markdown and fill some placeholders with dynamic items.

The format! macro is not always a good solution for that because you may not be sure the content is free of characters which may mess the markdown.

A solution is to use one of the templating functions or macros.

A template is to markdown what a prepared statement is to SQL: interpreted once and preventing the content to be interpreted as parts of the structure.

Inline Templates

Example:

mad_print_inline!(
    &skin,
    "**$0 formula:** *$1*", // the markdown template, interpreted once
    "Disk",  // fills $0
    "2*π*r", // fills $1. Note that the stars don't mess the markdown
);

mad_print_inline

Main difference with using skin.print_inline(format!( ... )) to build some markdown and parse it:

  • the markdown parsing and template building are done only once (using once_cell internally)
  • the given values aren't interpreted as markdown fragments and don't impact the style
  • arguments can be omited, repeated, given in any order
  • no support for fmt parameters or arguments other than &str (in the current version)

Inline templates are especially convenient combined with automated expansion or ellipsis, for filling a field in a terminal application.

You'll find more examples and advice in the inline-template example.

Text Template

When you want to fill a multi-line area, for example the help page of your terminal application, you may use a text template.

A template defines placeholders as ${name} which you may fill when using it.

For example

let text_template = TextTemplate::from(r#"
    # ${app-name} v${app-version}
    It is *very* ${adj}.
    "#);
let mut expander = text_template.expander();
expander
    .set("app-name", "MyApp")
    .set("adj", "pretty")
    .set("app-version", "42.5.3");
skin.print_expander(expander);

This would render like this:

text_template_01

The values you set with set aren't parsed as markdown, so they may freely contain stars or backquotes.

A template is reusable and can be defined from a text content or any string.

By using sub-templates, you may handle repetitions. They're handy for lists or tables.

For example

let text_template = TextTemplate::from(r#"
    |:-:|:-:|:-:|
    |**name**|**path**|**description**|
    |-:|:-:|:-|
    ${module-rows
    |**${module-name}**|`${app-version}/${module-key}`|${module-description}|
    }
    |-|-|-|
    "#);
let mut expander = text_template.expander();
expander
    .set("app-version", "2");
expander.sub("module-rows")
    .set("module-name", "lazy-regex")
    .set("module-key", "lrex")
    .set("module-description", "eases regexes");
expander.sub("module-rows")
    .set("module-name", "termimad")
    .set("module-key", "tmd")
    .set_md("module-description", "do things on *terminal*");
skin.print_expander(expander);

to get

text_template_02

On this example, you can note that

  • sub("module-rows") gets an expander for the sub template called module-rows
  • set_md can be used when you want to insert not just a raw uninterpreted string but some inline markdown.
  • you don't need to fill global placeholders again (here ${app-version}).

If you want to insert a block of code, you may use set_lines which applies the line style to all passed lines.

For example

let text_template = TextTemplate::from(r#"
    ## Example of a code block
        ${some-function}
    "#);
let mut expander = text_template.expander();
expander.set_lines("some-function", r#"
    fun test(a rational) {
    irate(a)
    }
    "#);
skin.print_expander(expander);

to get

text_template_03

You'll find more text template functions in the documentation and in the example (run cargo run --example text-template).

You may also be interested in OwningTemplateExpander: an alternative expander owning the values which may be handy when you build them while iterating in sub templates.

Asking questions

A frequent need in CLI apps is to ask the user to select an answer. The Question API and the ask! macros cover most basic needs.

Here's an example of asking with a default choice (that you get by hitting enter) and a returned value:

let choice = ask!(skin, "Do you want to drink something ?", ('n') {
    ('w', "I'd like some **w**ater, please.") => {
        mad_print_inline!(skin, "*Wait a minute, please, I'll fetch some.*\n");
        Some("water")
    }
    ('b', "Could I get a **b**eer glass ?") => {
        mad_print_inline!(skin, "We have no glass, so here's a *bottle*.\n");
        Some("beer")
    }
    ('n', "*No*, thank you.") => {
        None
    }
});
dbg!(choice);

ask example

Advices to get started

  • Start by reading the examples (in /examples): they cover almost the whole API, including templates, how to use an alternate screen or scroll the page, etc.
  • Be careful that some colors aren't displayable on all terminals. The default color set of your application should not include arbitrary RGB colors.
  • The event / event-source part of Termimad is currently tailored for a short number of applications. If you use it or want to use it, please come and tell me so that your needs are taken into account!
  • If your goal is to format some CLI application output, for example a few tables, have a look at lfs which is one of the simplest possible uses
  • If a feature is missing, or you don't know how to use some part, come and ping me on my chat during West European hours.

Open-source applications using termimad

  • broot is a file manager and uses termimad for its help screen, status information and event management

  • lfs is a linux utility displaying file systems. Termimad templates are used to show the data in tables

  • SafeCloset is a secret safe. Its TUI uses Termimad a lot, especially inputs

  • Rhit is a nginx log analyzer. Termimad templates are used to show the data in tables

  • bacon is a background Rust compiler. It uses Termimad for display and event management

  • lapin is a terminal game. It uses Termimad for display and event management

  • backdown is a file deduplicator. It uses Termimad to print on screen and ask questions

If you're the author of another application using Termimad, please tell me.

Comments
  • [Feature] Provide a Way to Escape Blocks of Content

    [Feature] Provide a Way to Escape Blocks of Content

    I am trying to create manpage-like help pages using Termimad and I want to be able to inline the Clap commandline argument help into the document, but the styling for the help message gets a little confused because Termimad is interpreting the indentation in the help message as code blocks.

    Could there be a way to make a whole block of the document so that it is taken literally instead of interpreted as Markdown syntax?

    Maybe something like this:

    \\\
    Literal block here.
    
        This won't be interpreted as a codeblock because it is in the literal block section
    \\\
    
    opened by zicklag 24
  • Upgrade to Crossterm 0.14

    Upgrade to Crossterm 0.14

    Crossterm 0.14 was just released and it has a new event system along with support for resize events. These are features I'd like to use in my project, but Termimad would need to update to 0.14 first.

    Would it help if I were to submit a PR for this? I haven't yet looked into how hard that might be, but I'm thinking it would be simple.

    opened by zicklag 10
  • chore: re-export crossterm as module

    chore: re-export crossterm as module

    This PR re-exports the crossterm crate as a module. This allows you to configure and use the termimad crate directly without needing to specify two separate dependencies and look in the README to see which version of crossterm we should use in order to compile this crate.

    opened by EverlastingBugstopper 5
  • Pass InputField into a MadSkin

    Pass InputField into a MadSkin

    GIven an input field

     Input: InputField::default(),
    

    How do i get the input rendered as MD with a skin like so ?

    skin.write_in_area_on(w, Input, &self.area);
    

    I am just trying to render MD directly from the input

    opened by ahmedsaheed 5
  • Update to crossterm 0.20.0

    Update to crossterm 0.20.0

    When using crossterm 0.20.0 with termimad 0.11.1, I get the following error:

    error[E0308]: mismatched types
       --> src/command/output.rs:125:36
        |
    125 |                 skin.bold.add_attr(Underlined);
        |                                    ^^^^^^^^^^ expected enum `crossterm::style::types::attribute::Attribute`, found enum `crossterm::style::Attribute`
        |
        = note: perhaps two different versions of crate `crossterm` are being used?
    
    error[E0308]: mismatched types
       --> src/command/output.rs:125:36
        |
    125 |                 skin.bold.add_attr(Underlined);
        |                                    ^^^^^^^^^^ expected enum `crossterm::style::types::attribute::Attribute`, found enum `crossterm::style::Attribute`
        |
        = note: perhaps two different versions of crate `crossterm` are being used?
    

    It looks to me as if there were some breaking changes in the crossterm crate that just moved where the types live. termimad should update their API to accept this new type, and possibly consider re-exporting the types that are expected to be used within the skin builder API so consumer crates don't have to worry about matching dependency versions.

    opened by EverlastingBugstopper 5
  • Cannot escape markdown characters

    Cannot escape markdown characters

    I'm using this crate in my compiler to automatically generate documentation, and I've run into an issue where I cannot escape (use as regular characters) * characters, or other characters such as `. We've tried \*, \\*, and \\\*, and nothing works. Is there a way to display asterisks and other markdown command characters?

    opened by adam-mcdaniel 5
  • MadSkin.print_text() Can Panic on Broken Pipe!

    MadSkin.print_text() Can Panic on Broken Pipe!

    Hey there, thanks for this awesome library. I'm using it for my organization's new Lucky project.

    Would it be possible to have a version of MadSkin.print_text that returns a result instead of panicking? I would much prefer to print a proper error message than to panic.

    opened by zicklag 5
  • [Feature] Code Fences

    [Feature] Code Fences

    Would it be possible to support code fences? The README says that they are not supported and I was not sure if that was a intentional design decision.

    The purpose for supporting code fences, in my case, is that I am taking the same markdown that I am using for Termimad and using it to power my online documentation with mdbook. mdbook supports syntax highlighting when using code fences, so if Termimad allowed them, even without syntax highlighting, it will allow me to use syntax highlighting in mdbook.


    On a side note, only because of Termimad am I able to use the same documentation for the CLI and the web documentation and it is awesome. Thanks a lot for helping enable this for my project:

    image

    enhancement 
    opened by zicklag 4
  • Executable

    Executable

    Is there a simple way to use this as an executable?

    One workflow I'd like to have is the following:

    Having open a text editor to edit markdown and termimad in another window, outputting the formatted markdown and watching for file changes (in order to update the markdown, whenever I hit safe

    opened by nilsmartel 4
  • Panic from `print_text`

    Panic from `print_text`

    Someone has observed thread 'main' panicked at 'attempt to subtract with overflow' coming from a skin.print_text call (ref samtay/so#8), and also found that such panic goes away when using skin.print_inline. ~~Unfortunately I couldn't repo this myself~~, but the relevant details from that issue are:

    • OS: Ubuntu 18.04
    • Terminal: gnome-terminal
    • Terminal size when rendering: (190, 51)
    • Relevant part of the stack trace:
        13:     0x55f43543f6ed - core::panicking::panic::h68e56c2eeba99c8c
                                   at src/libcore/panicking.rs:50
      14:     0x55f434c96c0d - minimad::compound::Compound::cut_tail::h65a621fcce14ec17
                                   at /home/e/.cargo/registry/src/github.com-1ecc6299db9ec823/minimad-0.6.4/src/compound.rs:117
      15:     0x55f434c7062c - termimad::wrap::hard_wrap_composite::ha144c51dfb0493a2
                                   at /home/eyehuda/.cargo/registry/src/github.com-1ecc6299db9ec823/termimad-0.8.24/src/wrap.rs:137
      16:     0x55f434c71116 - termimad::wrap::hard_wrap_lines::hcc2fff69ff958a06
                                   at /home/eyehuda/.cargo/registry/src/github.com-1ecc6299db9ec823/termimad-0.8.24/src/wrap.rs:172
      17:     0x55f434c72f2e - termimad::text::FmtText::from_text::hdd93418c5a6ceb6b
                                   at /home/eyehuda/.cargo/registry/src/github.com-1ecc6299db9ec823/termimad-0.8.24/src/text.rs:44
      18:     0x55f434c72de0 - termimad::text::FmtText::from::h5006d4ececb9711c
                                   at /home/eyehuda/.cargo/registry/src/github.com-1ecc6299db9ec823/termimad-0.8.24/src/text.rs:32
      19:     0x55f434c7f0eb - termimad::skin::MadSkin::term_text::hd65d68486384d1a9
                                   at /home/eyehuda/.cargo/registry/src/github.com-1ecc6299db9ec823/termimad-0.8.24/src/skin.rs:208
      20:     0x55f434c7f160 - termimad::skin::MadSkin::print_text::h1276bb441ef97417
                                   at /home/eyehuda/.cargo/registry/src/github.com-1ecc6299db9ec823/termimad-0.8.24/src/skin.rs:243
      
    • Input causing panic: gist link

    Note the markdown input is quite large, so I put it in a gist. I also embedded it within the ./examples/text/main.rs file so that it would be easier to run.

    EDIT: I was able to repro this. At terminal width 112 there is no panic. If the terminal width is greater than or equal to 117, you can observe this panic.

    I think if you make sure your terminal width is that wide (e.g. go full screen), and run this:

    cd /path/to/termimad
    curl -o "examples/text/main.rs" "https://gist.githubusercontent.com/samtay/cf9d1b8c0c7935baf6f6971101bd567e/raw/dff5e762f9a56f76aa64e9c61b57311c42c7a0f0/example-panic.rs"
    RUST_BACKTRACE=1 cargo run --example text
    

    you should be able to observe it.

    opened by samtay 3
  • No bug in `crossterm`?

    No bug in `crossterm`?

    I was chasing a bug in cargo crev verify -1 - the display would be blinking / wrong. Eventually I've found:

    /// Return a (width, height) with the dimensions of the available
    /// terminal in characters.
    pub fn terminal_size() -> (u16, u16) {
        let (w, h) = Terminal::new().terminal_size();
        // there's a bug in crossterm 0.9.6. It reports a size smaller by
        //  one in both directions
        (w + 1, h + 1)
    }
    

    I don't think that's the case, at least on my system (Linux). After I got rid of this additional +1s the problem is gone.

    opened by dpc 3
  • Cannot compile inputs or render-input-markdown examples

    Cannot compile inputs or render-input-markdown examples

    Description

    Received a linker error when attempting to compile inputs and render-input-markdown examples

    Steps to reproduce

    • Clone v0.20.6 (current main)
    • Run cargo run --example inputs

    System Info

    OS: macOS Monteray v12.3 Chipset: Apple Silicon (M1 Pro) rustc: 1.65.0 (897e37553 2022-11-02)

    Expected Result

    Should build and run inputs example

    Actual Result

    **Linker Error: **

    cargo run --example inputs -v
           Fresh autocfg v1.1.0
           Fresh cfg-if v1.0.0
           Fresh unicode-ident v1.0.6
           Fresh scopeguard v1.1.0
           Fresh libc v0.2.138
           Fresh proc-macro2 v1.0.49
           Fresh log v0.4.17
           Fresh quote v1.0.23
           Fresh signal-hook-registry v1.4.0
           Fresh crossbeam-utils v0.8.14
           Fresh memchr v2.5.0
           Fresh smallvec v1.10.0
           Fresh lock_api v0.4.9
           Fresh mio v0.8.5
           Fresh syn v1.0.107
           Fresh parking_lot_core v0.9.5
           Fresh quick-xml v0.22.0
           Fresh signal-hook v0.3.14
           Fresh memoffset v0.7.1
           Fresh signal-hook-mio v0.2.3
           Fresh thiserror-impl v1.0.38
           Fresh parking_lot v0.12.1
           Fresh bitflags v1.3.2
           Fresh once_cell v1.16.0
           Fresh thiserror v1.0.38
           Fresh crossterm v0.23.2
           Fresh num-traits v0.2.15
           Fresh core-foundation-sys v0.8.3
           Fresh crossbeam-epoch v0.9.13
           Fresh iana-time-zone v0.1.53
           Fresh serde_derive v1.0.151
           Fresh crossbeam-deque v0.8.2
           Fresh crossbeam-queue v0.3.8
           Fresh xcb v0.10.1
           Fresh num-integer v0.1.45
           Fresh crossbeam-channel v0.5.6
           Fresh time v0.1.45
           Fresh chrono v0.4.23
           Fresh crossbeam v0.8.2
           Fresh x11-clipboard v0.5.3
           Fresh coolor v0.5.0
           Fresh minimad v0.9.1
           Fresh proc-status v0.1.1
           Fresh crokey-proc_macros v0.4.0
           Fresh file-size v1.0.3
           Fresh serde v1.0.151
           Fresh unicode-width v0.1.10
           Fresh anyhow v1.0.68
           Fresh cli-log v2.0.0
           Fresh terminal-clipboard v0.3.1
           Fresh crokey v0.4.3
       Compiling termimad v0.20.6 (/Users/cardamom/src/personal/termimad)
         Running `rustc --crate-name inputs --edition=2021 examples/inputs/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C split-debuginfo=unpacked -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="special-renders"' -C metadata=c5e207a04cd84114 -C extra-filename=-c5e207a04cd84114 --out-dir /Users/cardamom/src/personal/termimad/target/debug/examples -C incremental=/Users/cardamom/src/personal/termimad/target/debug/incremental -L dependency=/Users/cardamom/src/personal/termimad/target/debug/deps --extern anyhow=/Users/cardamom/src/personal/termimad/target/debug/deps/libanyhow-21978be410a2fbf0.rlib --extern cli_log=/Users/cardamom/src/personal/termimad/target/debug/deps/libcli_log-7017e0c0864902d9.rlib --extern coolor=/Users/cardamom/src/personal/termimad/target/debug/deps/libcoolor-d1f48a62f08063b6.rlib --extern crokey=/Users/cardamom/src/personal/termimad/target/debug/deps/libcrokey-743332353c50acdb.rlib --extern crossbeam=/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam-b70ab4c4cabb1784.rlib --extern crossterm=/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossterm-b8ddcaf17b7be669.rlib --extern minimad=/Users/cardamom/src/personal/termimad/target/debug/deps/libminimad-fa7d8038005ee9e5.rlib --extern termimad=/Users/cardamom/src/personal/termimad/target/debug/deps/libtermimad-a46e755f18bc2231.rlib --extern terminal_clipboard=/Users/cardamom/src/personal/termimad/target/debug/deps/libterminal_clipboard-e8f3d74634f60fc9.rlib --extern thiserror=/Users/cardamom/src/personal/termimad/target/debug/deps/libthiserror-72a4dbe2d40f3703.rlib --extern unicode_width=/Users/cardamom/src/personal/termimad/target/debug/deps/libunicode_width-3d01bf217eabcebb.rlib`
    error: linking with `cc` failed: exit status: 1
      |
      = note: "cc" "-arch" "arm64" "/var/folders/46/xxvfd9m166x8j9kstkxbm9xr0000gn/T/rustc2acZID/symbols.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.100wk0928zbr9qp9.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.11526cri3pxdtmeo.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.12orupzludbpt9wn.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.18qlhyaoio8i4m93.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.19qwxxfphj4e77zo.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1c6trk4b8bjb3r1l.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1fp5ttonuy94d12y.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1ifpok2va4vvm0ov.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1ivj76btxn1j7owi.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1j1g5veabfupbnwr.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1je6wkxg2kzp6z52.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1ou6z336jyly3afw.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1rrjefc6j9lv8vh3.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1uy8pfz5e8y9v1v4.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1y0l4yorw63i14hz.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1ya9bqkat78p259o.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.1zpnz0kkyjb2y22o.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.227jlkz2ltqqjtvl.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.26fuu88e0a70c5l2.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2cdc4xi8vfw05kvz.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2cnlabugax8a4pud.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2fsg0h8uk1xjtn2h.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2kn4c9bg4s2m196h.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2mmkbu4vxxx5jrci.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2oig49tqjbi5y09d.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2oq4x2pyj6q6b7z0.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2pvv2peukt8l4gxw.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2qklzvyzufzb11m5.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2s536ollch7lpoms.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2tvnhlasozl6kl61.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.2w73qydkh0giseyk.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.30duuwp7z5bhcm87.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.31xoaatzybi8fnsx.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.32v0nfftmyt2lpkd.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.34dxpv5srvcsfsjd.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.365d2gb4cr0vgsff.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3cta7nbz79y70oly.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3irv965p0z9alueo.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3ivaggie58janes9.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3ixzfxno095jmky5.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3mlugzpnvr12r5cj.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3nsqare3wlhc3h3x.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3o2802ch35cjvbrn.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.3tze6ih00xtsaw88.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4099g8n0t565b5n7.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.422uvxxf8dovk4ad.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.436i0k88vyd25phc.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.445xs51hz2zsiy1w.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4gmg8zrhddp49x4g.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4kdmd42qe5os18fk.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4kjlzmf7zigrortb.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4lrwndb2ra1rnjfs.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4neqg4typ4p8uw5r.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4pkb1x383bg53073.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4qgidpo754isg24x.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4t5o1clzs00v1ged.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4vma69d2w4pl26a9.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4wf7o2c5stv2ygmj.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.4z8bpwnaeokvowo0.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.51jdvnn7gk2fhodq.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.5a14ut7wk28l66jn.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.5an62l8jowkyjfj9.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.5cot473u3o4ycelk.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.5e9nb2l15qussca.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.5eklxdwm17c643gp.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.5fuzt20ag5k3y2eo.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.8es9qp1gacwurye.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.9qxkrvpl6iztj0d.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.ab4y3d7fa4810j0.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.ck53ctc4sc65zx3.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.dzrjr2tfrqidp60.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.fwzdy8x7t08w0i4.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.iscvfgm3wf00je0.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.mc8swht2vmk55t1.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.na7we0syhuidue.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.osrl2zo7p8syqkq.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.r8v3a7d9og36c0l.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.tgyndqtjqh3vcxx.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.uumo0a7navb1jaf.rcgu.o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114.xamaif9grz4ptws.rcgu.o" "-L" "/Users/cardamom/src/personal/termimad/target/debug/deps" "-L" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libterminal_clipboard-e8f3d74634f60fc9.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libx11_clipboard-1d914fc39d270104.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libxcb-6b560f2e462d6589.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrokey-743332353c50acdb.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libserde-ddd2a52f4cd7c7c2.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libanyhow-21978be410a2fbf0.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libtermimad-a46e755f18bc2231.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcoolor-d1f48a62f08063b6.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam-b70ab4c4cabb1784.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam_channel-59f4eaf1aaa6da17.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam_deque-b3ebade16322fe17.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam_queue-f4b4a720b50e6c01.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam_epoch-0390e0098c63e91a.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libmemoffset-8cedb80e7952119f.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam_utils-8dcf4d53da288f8f.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libunicode_width-3d01bf217eabcebb.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libminimad-fa7d8038005ee9e5.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libonce_cell-a50890e42af3f299.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossterm-b8ddcaf17b7be669.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libsignal_hook_mio-289c35cbba69b450.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libsignal_hook-6e86e8460ac1361e.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libsignal_hook_registry-ffbfb85aa8a13b5c.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libmio-5700baba73e9ba09.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libparking_lot-7ba3afe11365a716.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libparking_lot_core-710141fb9189b898.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libsmallvec-2f02ddcbd54d9ddc.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/liblock_api-aefd6ed82f4ed634.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libscopeguard-eb1e61010332a1cf.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libbitflags-295066ef4f1a08fb.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcli_log-7017e0c0864902d9.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libfile_size-b432198dda13496c.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libproc_status-42aa69f5653e62b0.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libthiserror-72a4dbe2d40f3703.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libchrono-3f7e9f14b1d42cc2.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libiana_time_zone-c194462dbf7ec684.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcore_foundation_sys-a98884409e1a2efe.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libnum_integer-bc6e2a572eaceb6a.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libnum_traits-699c286c440bab1f.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libtime-b59c77b9afbdf5ba.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/liblibc-1296c5a414011619.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/liblog-8aaf2fada90fd261.rlib" "/Users/cardamom/src/personal/termimad/target/debug/deps/libcfg_if-e6509c5f025d8702.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd-0ea869fe6cd419aa.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libpanic_unwind-cec68d6b04523a7c.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libobject-63f595d80ff58213.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libmemchr-8763a2dbee186cdb.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libaddr2line-5c062bda19d9d8ff.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libgimli-f661f75085be205d.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_demangle-778598e0d10758f6.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd_detect-aa27b90bf7fd1432.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libhashbrown-3e59a62b515378ce.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libminiz_oxide-2d9579d5c16d038c.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libadler-68620bbed0e743bb.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_std_workspace_alloc-af17eba547e34f93.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libunwind-7309143273eafd44.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcfg_if-d1a0ff487d6d4d55.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/liblibc-1432fbf85665684e.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/liballoc-e26d2fb48c01825f.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_std_workspace_core-a8a859a864856684.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcore-908209eee60fb642.rlib" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcompiler_builtins-d567ed3625eefebc.rlib" "-lxcb" "-lxcb-render" "-lxcb-shape" "-lxcb-xfixes" "-framework" "CoreFoundation" "-liconv" "-lSystem" "-lc" "-lm" "-L" "/Users/cardamom/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "-o" "/Users/cardamom/src/personal/termimad/target/debug/examples/inputs-c5e207a04cd84114" "-Wl,-dead_strip" "-nodefaultlibs"
      = note: ld: library not found for -lxcb
              clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    
    error: could not compile `termimad` due to previous error
    
    Caused by:
      process didn't exit successfully: `rustc --crate-name inputs --edition=2021 examples/inputs/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C split-debuginfo=unpacked -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="special-renders"' -C metadata=c5e207a04cd84114 -C extra-filename=-c5e207a04cd84114 --out-dir /Users/cardamom/src/personal/termimad/target/debug/examples -C incremental=/Users/cardamom/src/personal/termimad/target/debug/incremental -L dependency=/Users/cardamom/src/personal/termimad/target/debug/deps --extern anyhow=/Users/cardamom/src/personal/termimad/target/debug/deps/libanyhow-21978be410a2fbf0.rlib --extern cli_log=/Users/cardamom/src/personal/termimad/target/debug/deps/libcli_log-7017e0c0864902d9.rlib --extern coolor=/Users/cardamom/src/personal/termimad/target/debug/deps/libcoolor-d1f48a62f08063b6.rlib --extern crokey=/Users/cardamom/src/personal/termimad/target/debug/deps/libcrokey-743332353c50acdb.rlib --extern crossbeam=/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossbeam-b70ab4c4cabb1784.rlib --extern crossterm=/Users/cardamom/src/personal/termimad/target/debug/deps/libcrossterm-b8ddcaf17b7be669.rlib --extern minimad=/Users/cardamom/src/personal/termimad/target/debug/deps/libminimad-fa7d8038005ee9e5.rlib --extern termimad=/Users/cardamom/src/personal/termimad/target/debug/deps/libtermimad-a46e755f18bc2231.rlib --extern terminal_clipboard=/Users/cardamom/src/personal/termimad/target/debug/deps/libterminal_clipboard-e8f3d74634f60fc9.rlib --extern thiserror=/Users/cardamom/src/personal/termimad/target/debug/deps/libthiserror-72a4dbe2d40f3703.rlib --extern unicode_width=/Users/cardamom/src/personal/termimad/target/debug/deps/libunicode_width-3d01bf217eabcebb.rlib` (exit status: 1)
    

    Attempted Resolutions

    • Installed libxcb
    • Installed x11
    • Tried both stable & nightly
    • Tried updating rust (1.66)
    mac 
    opened by chanq-io 6
  • Crossterm 0.25.0 breaking changes

    Crossterm 0.25.0 breaking changes

    When using crossterm 0.25.0 with termimad 0.20.3, I get the following error when I followed the code example in the docs:

    error[E0308]: mismatched types
     --> src/theme.rs:9:46
      |
    9 |     skin.strikeout = CompoundStyle::new(Some(Red), None, Bold.into());
      |                                              ^^^ expected enum `crossterm::style::types::color::Color`, found enum `Color`
      |
      = note: perhaps two different versions of crate `crossterm` are being used?
    
    error[E0277]: the trait bound `crossterm::style::attributes::Attributes: From<Attribute>` is not satisfied
     --> src/theme.rs:9:63
      |
    9 |     skin.strikeout = CompoundStyle::new(Some(Red), None, Bold.into());
      |                                                               ^^^^ the trait `From<Attribute>` is not implemented for `crossterm::style::attributes::Attributes`
      |
      = help: the following implementations were found:
                <crossterm::style::attributes::Attributes as From<&[crossterm::style::types::attribute::Attribute]>>
                <crossterm::style::attributes::Attributes as From<crossterm::style::types::attribute::Attribute>>
      = note: required because of the requirements on the impl of `Into<crossterm::style::attributes::Attributes>` for `Attribute`
    

    From this answer, it seems there there is a breaking change between crossterm 0.23 and crossterm 0.25. https://stackoverflow.com/questions/74141606/cannot-compile-rust-program-due-to-e0308-error/74144038#74144038

    Is it possible to state what version of crossterm supported by termimad or update the library to accept the newest version of crossterm?

    opened by fangpinsern 3
  • wrapping bulleted text -- bug?

    wrapping bulleted text -- bug?

    Hi,

    I have this when I wrap bulleted text:

    - [x] gfsdsdfsdfsdfsdf sdf sd fsd fsdf 
    sdfsdf
    

    Can the 2nd+ lines also be made to be as indented as the first, like so:

    - [x] gfsdsdfsdfsdfsdf sdf sd fsd fsdf 
          sdfsdf
    

    thanks!

    opened by bradwood 2
  • Question: Indented output to terminal?

    Question: Indented output to terminal?

    Hi,

    Is there a way to print rendered markdown to the terminal with everything indented, say a few spaces? I don't want to use an alternate screen, or scrollable frame, just the text printed directly to the terminal.

    This is what I have so far:

    let desc_text =  i.description.unwrap();
        let mut area = Area::full_screen();
        area.pad(6,0);
        let md = skin.area_text(desc_text.as_str(), &area);
        print!("{}", &md);
    

    This renders the text 6 characters narrower than the terminal width, now all I need to do is figure out how to indent this by 3 characters..

    Any help is much appreciated. Thanks.

    enhancement 
    opened by bradwood 3
  • Trait implementations for serialization

    Trait implementations for serialization

    I'd like to have my MadSkin come from a user-supplied theme, like colors.yml. I don't mind just making a newtype around MadSkin to do so, but I noticed the code in broot that handles parsing some user-friendlier keywords, etc., and just wanted to check if you plan on moving that back out to minimad or termimad.

    I also thought, to minimize effort, perhaps you'd be interested in just adding a package flag serialization which if set, would add serde dependency and provide serialize/deserialize traits. (To avoid users having to deal with orphan problems when they want to have theme configuration.)

    Just opening this issue for your awareness; if you don't feel that serialization should be a part of the library, feel free to close it! Thanks.

    opened by samtay 2
Owner
Canop
Denys Séguret - Freelance Rust programmer - contact me for rates
Canop
Yet Another Parser library for Rust. A lightweight, dependency free, parser combinator inspired set of utility methods to help with parsing strings and slices.

Yap: Yet another (rust) parsing library A lightweight, dependency free, parser combinator inspired set of utility methods to help with parsing input.

James Wilson 117 Dec 14, 2022
A parser combinator library for Rust

combine An implementation of parser combinators for Rust, inspired by the Haskell library Parsec. As in Parsec the parsers are LL(1) by default but th

Markus Westerlind 1.1k Dec 28, 2022
A Rust library for zero-allocation parsing of binary data.

Zero A Rust library for zero-allocation parsing of binary data. Requires Rust version 1.6 or later (requires stable libcore for no_std). See docs for

Nick Cameron 45 Nov 27, 2022
Rust library for parsing configuration files

configster Rust library for parsing configuration files Config file format The 'option' can be any string with no whitespace. arbitrary_option = false

The Impossible Astronaut 19 Jan 5, 2022
rbdt is a python library (written in rust) for parsing robots.txt files for large scale batch processing.

rbdt ?? ?? ?? ?? rbdt is a work in progress, currently being extracted out of another (private) project for the purpose of open sourcing and better so

Knuckleheads' Club 0 Nov 9, 2021
xml-rs is an XML library for Rust programming language

xml-rs, an XML library for Rust Documentation xml-rs is an XML library for Rust programming language. It is heavily inspired by Java Streaming API for

Vladimir Matveev 417 Jan 3, 2023
The Simplest Parser Library (that works) in Rust

The Simplest Parser Library (TSPL) TSPL is the The Simplest Parser Library that works in Rust. Concept In pure functional languages like Haskell, a Pa

HigherOrderCO 28 Mar 1, 2024
Universal configuration library parser

LIBUCL Table of Contents generated with DocToc Introduction Basic structure Improvements to the json notation General syntax sugar Automatic arrays cr

Vsevolod Stakhov 1.5k Jan 7, 2023
Pure, simple and elegant HTML parser and editor.

HTML Editor Pure, simple and elegant HTML parser and editor. Examples Parse HTML segment/document let document = parse("<!doctype html><html><head></h

Lomirus 16 Nov 8, 2022
JsonPath engine written in Rust. Webassembly and Javascript support too

jsonpath_lib Rust 버전 JsonPath 구현으로 Webassembly와 Javascript에서도 유사한 API 인터페이스를 제공 한다. It is JsonPath JsonPath engine written in Rust. it provide a simil

Changseok Han 95 Dec 29, 2022
Parsing and inspecting Rust literals (particularly useful for proc macros)

litrs: parsing and inspecting Rust literals litrs offers functionality to parse Rust literals, i.e. tokens in the Rust programming language that repre

Lukas Kalbertodt 31 Dec 26, 2022
A Rust crate for RDF parsing and inferencing.

RDF-rs This crate provides the tools necessary to parse RDF graphs. It currently contains a full (with very few exceptions) Turtle parser that can par

null 2 May 29, 2022
🕑 A personal git log and MacJournal output parser, written in rust.

?? git log and MacJournal export parser A personal project, written in rust. WORK IN PROGRESS; NOT READY This repo consolidates daily activity from tw

Steven Black 4 Aug 17, 2022
Sqllogictest parser and runner in Rust.

Sqllogictest-rs Sqllogictest parser and runner in Rust. License Licensed under either of Apache License, Version 2.0 (LICENSE-APACHE or http://www.apa

Singularity Data Inc. 101 Dec 21, 2022
A CSS parser, transformer, and minifier written in Rust.

@parcel/css A CSS parser, transformer, and minifier written in Rust. Features Extremely fast – Parsing and minifying large files is completed in milli

Parcel 3.1k Jan 9, 2023
Rust grammar tool libraries and binaries

Grammar and parsing libraries for Rust grmtools is a suite of Rust libraries and binaries for parsing text, both at compile-time, and run-time. Most u

Software Development Team 318 Dec 26, 2022
An IRC (RFC1459) parser and formatter, built in Rust.

ircparser An IRC (RFC1459) parser and formatter, built in Rust. ircparser should work on basically any Rust version, but the earliest version checked

Ethan Henderson 2 Oct 18, 2022
A WIP svelte parser written in rust. Designed with error recovery and reporting in mind

Svelte(rs) A WIP parser for svelte files that is designed with error recovery and reporting in mind. This is mostly a toy project for now, with some v

James Birtles 3 Apr 19, 2023
A rusty, dual-wielding Quake and Half-Life texture WAD parser.

Ogre   A rusty, dual-wielding Quake and Half-Life texture WAD parser ogre is a rust representation and nom parser for Quake and Half-Life WAD files. I

Josh Palmer 16 Dec 5, 2022