Coder Social home page Coder Social logo

Use with stringstreams about termcolor HOT 14 CLOSED

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024
Use with stringstreams

from termcolor.

Comments (14)

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024 1

@gelldur well, I come up with a solution. will implement it pretty soon.

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

@stonier Hm.. Originally the idea was is to be protected from Unix pipes. For instance, if you run program that way -

$ ./my_program > out.txt

stdout is not a tty, and ASCII characters won't get to output file (which is desired behaviour in most case).

However, I think we need to think how to avoid it and fix with std::stringstream.

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

Well I think we can do the following things:

  • if stream is either stdout or stderr and is not atty -> strip ASCII escape sequences
  • otherwise - use them

In that case the case with redirection of standard io streams and having buffered string stream will be covered. However, I'm not very happy with such non obvious complexity. Need to think a bit more.

from termcolor.

stonier avatar stonier commented on June 1, 2024

Aha, I see.

Your logic sounds fine.

Though I do agree, with a stringstream you start moving into the realm of letting the user get himself into trouble (or not) and you cannot provide the protection there as he may eventually pipe that string out as you illustrated above.

Perhaps a better alternative is equipping the user with a tool that they can use to strip output from a termcolor enabled program? e.g.

$ ./my_program | strip_termcolor_sequences > out.txt

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

@stonier We can't be sure such a tool will be widely distributed. I start thinking about explicit manipulator, like:

std::cout << termcolor::force << termcolor::red << "RED message" << termcolor::reset << std::endl;

Or maybe it's better to make force mode by default, and use tty mode to strip colors if output isn't tied with tty:

std::cout << termcolor::tty << termcolor::red << "RED message" << termcolor::reset << std::endl;

Anyway, thank you very much for raising an important concern! I'll try to come up with solution.

from termcolor.

stonier avatar stonier commented on June 1, 2024

The manipulator approach is interesting.

I would offer one perspective. For a user of a program that utilises this library, there are many ways of stripping colour codes if you wish (google for 'bash strip terminal color sequences'), but there is no way of re-inserting colour codes if the library/programmer has decided to strip them for you.

A good example is cmake output getting redisplayed in jenkins. If cmake had decided to strip sequences for logging, there would be no way I could utilise the AnsiColor Plugin to get the colours re-discovered in a jenkins log view.

from termcolor.

davidvanlaatum avatar davidvanlaatum commented on June 1, 2024

should at least fix the crash for now ;) even if its just assume its not a tty. Just need to handle get_standard_stream returning NULL. as for determining if a stream is a tty I suggest some ability to provide a user function to determine if it is

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

@davidvanlaatum wow! nobody told be that there's a crash! it definitely needs to be fixed.

from termcolor.

davidvanlaatum avatar davidvanlaatum commented on June 1, 2024

yep fileno(NULL) goes boom at least on osx

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

I'll prepare a fix and add test to CI for that case. Thanks a lot!

as for determining if a stream is a tty I suggest some ability to provide a user function to determine if it is

I agree on this. I'll add it very soon.

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

Fixed segmentation fault in 519358f.

from termcolor.

gelldur avatar gelldur commented on June 1, 2024

Any updates on this :) ?

from termcolor.

ikalnytskyi avatar ikalnytskyi commented on June 1, 2024

@gelldur unfortunately didn't come up with a good solution. :( I'll think about it.

from termcolor.

gelldur avatar gelldur commented on June 1, 2024

Nice thx! Updating fork :)

from termcolor.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.