colored-rs / colored

(Rust) Coloring terminal so simple you already know how to do it !
Mozilla Public License 2.0
1.73k stars 83 forks source link

Support for WASM #169

Open hseager opened 6 months ago

hseager commented 6 months ago

Firstly, thanks for the crate!

Would it be possible to get this crate working when building for WASM?

I've built a text based adventure game which I'm also building for WASM and it's a shame for the colored text not to work: https://github.com/hseager/you-are-merlin

I thought I'd ask for some advice before diving in and to see if it's a terrible idea or not as I apprectiate this crate is built with the terminal in mind. Thanks!

hseager commented 6 months ago

I've created a wrapper module which detects WASM builds and isn't perfect, but is working well enough for my needs.

pub trait TextFormatter {
    fn format_bold(self) -> String;
}

impl TextFormatter for &str {
    #[cfg(target_arch = "wasm32")]
    fn format_bold(self) -> String {
        format!("<span style='font-weight: bold;'>{}</span>", self)
    }

    #[cfg(not(target_arch = "wasm32"))]
    fn format_bold(self) -> String {
        use colored::Colorize;

        self.bold().to_string()
    }
}

I wonder if there would be interest in integrating this into this crate, or if it better separated out into another crate.

spenserblack commented 6 months ago

IMO a tool that does what you're asking, wrapping text in <span style="STYLE"></span>, should be a separate crate. This could also be useful even when not used in WASM. For example, a server rendering an HTML response.

BTW, such a tool should probably use the appropriate HTML elements. As a usage example, perhaps something like this:

assert_eq!("foo".strong().style("color: red;").to_string(), "<strong style=\"color: red;\">foo</strong>");

This could be achieved, for example, if str implements fn strong(&self) -> SomeHTMLType and SomeHTMLType implements fn style(mut self, style: SomeStyleType) -> Self.

You might want to check if a crate that does this already exists, because this usage I'm making up does feel vaguely familiar.