• Stars
    star
    628
  • Rank 68,824 (Top 2 %)
  • Language
    Ruby
  • License
    MIT License
  • Created over 9 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Terminal output styling with intuitive and clean API.
pastel logo

Pastel

Gem Version Actions CI Build status Code Climate Coverage Status

Terminal output styling with intuitive and clean API that doesn't monkey patch String class.

Pastel is minimal and focused to work in all terminal emulators.

screenshot

Pastel provides independent coloring component for TTY toolkit.

Features

  • Doesn't monkey patch String
  • Intuitive and expressive API
  • Minimal and focused to work on all terminal emulators
  • Auto-detection of color support
  • Allows nested styles
  • Performant

Installation

Add this line to your application's Gemfile:

gem "pastel"

And then execute:

$ bundle

Or install it yourself as:

$ gem install pastel

Contents

1 Usage

Pastel provides a simple, minimal and intuitive API for styling your strings:

pastel = Pastel.new

puts pastel.red("Unicorns!")

Pastel doesn't print the colored string out, just returns it, you'll have to print it yourself.

You can compose multiple styles through chainable API:

pastel.red.on_green.bold("Unicorns!")

It allows you to combine styled strings with unstyled ones:

pastel.red("Unicorns") + " will rule " + pastel.green("the World!")

It supports variable number of arguments:

pastel.red("Unicorns", "are", "running", "everywhere!")

You can also nest styles as follows:

pastel.red("Unicorns ", pastel.on_green("everywhere!"))

Nesting is smart enough to know where one color ends and another one starts:

pastel.red("Unicorns " + pastel.green("everywhere") + pastel.on_yellow("!"))

You can also nest styles inside blocks:

pastel.red.on_green("Unicorns") {
  green.on_red("will ", "dominate") {
    yellow("the world!")
  }
}

When dealing with multiline strings you can set eachline option(more info see eachline):

pastel = Pastel.new(eachline: "\n")

You can also predefine needed styles and reuse them:

error    = pastel.red.bold.detach
warning  = pastel.yellow.detach

puts error.("Error!")
puts warning.("Warning")

If your output is redirected to a file, you probably don't want Pastel to add color to your text. See https://github.com/piotrmurach/pastel#210-enabled for a way to easily accomplish this.

Pastel has companion library called pastel-cli that allows you to style text in terminal via pastel executable:

$ pastel green "Unicorns & rainbows!"

2 Interface

2.1 Color

pastel.<color>[.<color>...](string, [string...])

Color styles are invoked as method calls with a string argument. A given color can take any number of strings as arguments. Then it returns a colored string which isn't printed out to terminal. You need to print it yourself if you need to. This is done so that you can save it as a string, pass to something else, send it to a file handle and so on.

pastel.red("Unicorns ", pastel.bold.underline("everywhere"), "!")

Please refer to 3. Supported Colors section for full list of supported styles.

2.2 Decorate

This method is a lower level string styling call that takes as the first argument the string to style followed by any number of color attributes, and returns string wrapped in styles.

pastel.decorate("Unicorn", :green, :on_blue, :bold)

This method will be useful in situations where colors are provided as a list of parameters that have been generated dynamically.

2.3 Undecorate

It performs the opposite to decorate method by turning color escape sequences found in the string into a list of hash objects corresponding with the attribute names set by those sequences. Depending on the parsed string, each hash object may contain :foreground, :background, :text and/or :style keys.

pastel.undecorate("\e[32mfoo\e[0m \e[31mbar\e[0m")
# => [{foreground: :green, text: "foo"}, {text: " "}, {foreground: :red, text: "bar"}]

To translate the color name into sequence use lookup

2.4 Detach

The detach method allows to keep all the associated colors with the detached instance for later reference. This method is useful when detached colors are being reused frequently and thus shorthand version is preferred. The detached object can be invoked using call method or it's shorthand .(), as well as array like access []. For example, the following are equivalent examples of detaching colors:

notice = pastel.blue.bold.detach

notice.call("Unicorns running")
notice.("Unicorns running")
notice["Unicorns running"]

2.5 Strip

Strip only color sequence characters from the provided strings and preserve any movement codes or other escape sequences. The return value will be either array of modified strings or a single string. The arguments are not modified.

pastel.strip("\e[1A\e[1m\e[34mbold blue text\e[0m")  # => "\e[1Abold blue text"

2.6 Styles

To get a full list of supported styles with the corresponding color codes do:

pastel.styles

2.7 Lookup

To perform translation of color name into ansi escape code use lookup:

pastel.lookup(:red)   # => "\e[31m"
pastel.lookup(:reset) # => "\e[0m"

2.8 Valid?

Determine whether a color or a list of colors are valid. valid? takes one or more attribute strings or symbols and returns true if all attributes are known and false otherwise.

pastel.valid?(:red, :blue) # => true
pastel.valid?(:unicorn)    # => false

2.9 Colored?

In order to determine if string has color escape codes use colored? like so

pastel.colored?("\e[31mcolorful\e[0m")  # => true

2.10 Enabled?

In order to detect if your terminal supports coloring do:

pastel.enabled?   # => false

In cases when the color support is not provided no styling will be applied to the colored string. Moreover, you can force Pastel to always print out string with coloring switched on:

pastel = Pastel.new(enabled: true)
pastel.enabled?   # => true

If you are outputting to stdout or stderr, and want to suppress color if output is redirected to a file, you can set the enabled attribute dynamically, as in:

stdout_pastel = Pastel.new(enabled: $stdout.tty?)
stderr_pastel = Pastel.new(enabled: $stderr.tty?)

2.11 Eachline

Normally Pastel colors string by putting color codes at the beginning and end of the string, but if you provide eachline option set to some string, that string will be considered the line delimiter. Consequently, each line will be separately colored with escape sequence and reset code at the end. This option is desirable if the output string contains newlines and you're using background colors. Since color code that spans more than one line is often interpreted by terminal as providing background for all the lines that follow. This in turn may cause programs such as pagers to spill the colors throughout the text. In most cases you will want to set eachline to \n character like so:

pastel = Pastel.new(eachline: "\n")
pastel.red("foo\nbar")  # => "\e[31mfoo\e[0m\n\e[31mbar\e[0m"

2.12 Alias Color

In order to setup an alias for standard colors do:

pastel.alias_color(:funky, :red, :bold)

From that point forward, :funky alias can be passed to decorate, valid? with the same meaning as standard colors:

pastel.funky.on_green("unicorn")   # => will use :red, :bold color

This method allows you to give more meaningful names to existing colors.

You can also use the PASTEL_COLORS_ALIASES environment variable (see Environment) to specify aliases.

Note: Aliases are global and affect all callers in the same process.

3 Supported Colors

Pastel works with terminal emulators that support minimum sixteen colors. It provides 16 basic colors and 8 styles with further 16 bright color pairs. The corresponding bright color is obtained by prepending the bright to the normal color name. For example, color red will have bright_red as its pair.

The variant with on_ prefix will style the text background color.

The foreground colors:

  • black
  • red
  • green
  • yellow
  • blue
  • magenta
  • cyan
  • white
  • bright_black
  • bright_red
  • bright_green
  • bright_yellow
  • bright_blue
  • bright_magenta
  • bright_cyan
  • bright_white

The background colors:

  • on_black
  • on_red
  • on_green
  • on_yellow
  • on_blue
  • on_magenta
  • on_cyan
  • on_white
  • on_bright_black
  • on_bright_red
  • on_bright_green
  • on_bright_yellow
  • on_bright_blue
  • on_bright_magenta
  • on_bright_cyan
  • on_bright_white

Generic styles:

  • clear
  • bold
  • dim
  • italic
  • underline
  • inverse
  • hidden
  • strikethrough

4 Environment

4.1 PASTEL_COLORS_ALIASES

This environment variable allows you to specify custom color aliases at runtime that will be understood by Pastel. The environment variable is read and used when the instance of Pastel is created. You can also use alias_color to create aliases.

Only alphanumeric and _ and . are allowed in the alias names with the following format:

PASTEL_COLORS_ALIASES="newcolor_1=red,newcolor_2=on_green,funky=red.bold"

5. Command line

You can also install pastel-cli to use pastel executable in terminal:

$ pastel green 'Unicorns & rainbows!'

Contributing

  1. Fork it ( https://github.com/piotrmurach/pastel/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Code of Conduct

Everyone interacting in the Pastel project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

Copyright

Copyright (c) 2014 Piotr Murach. See LICENSE for further details.

More Repositories

1

tty

Toolkit for developing sleek command line apps.
Ruby
2,472
star
2

tty-prompt

A beautiful and powerful interactive command line prompt
Ruby
1,418
star
3

github

Ruby interface to GitHub API
Ruby
1,132
star
4

finite_machine

A minimal finite state machine with a straightforward syntax.
Ruby
802
star
5

rspec-benchmark

Performance testing matchers for RSpec
Ruby
584
star
6

tty-spinner

A terminal spinner for tasks that have non-deterministic time frame.
Ruby
421
star
7

tty-progressbar

Display a single or multiple progress bars in the terminal.
Ruby
415
star
8

loaf

Manages and displays breadcrumb trails in Rails app - lean & mean.
Ruby
404
star
9

tty-command

Execute shell commands with pretty output logging and capture stdout, stderr and exit status.
Ruby
397
star
10

tty-markdown

Convert a markdown document or text into a terminal friendly output.
Ruby
303
star
11

tty-logger

A readable, structured and beautiful logging for the terminal
Ruby
291
star
12

github_cli

GitHub on your command line. Use your terminal, not the browser.
Ruby
264
star
13

tty-table

A flexible and intuitive table generator
Ruby
183
star
14

tty-box

Draw various frames and boxes in your terminal window
Ruby
177
star
15

awesome-ruby-cli-apps

A curated list of awesome command-line applications in Ruby.
Ruby
159
star
16

rack-policy

Rack middleware for the EU ePrivacy Directive compliance in Ruby Web Apps
Ruby
147
star
17

tty-pie

Draw pie charts in your terminal window
Ruby
138
star
18

necromancer

Conversion from one object type to another with a bit of black magic.
Ruby
135
star
19

strings

A set of useful functions for transforming strings.
Ruby
127
star
20

coinpare

Compare cryptocurrency trading data across multiple exchanges and blockchains in the comfort of your terminal
Ruby
109
star
21

tty-exit

Terminal exit codes.
Ruby
100
star
22

strings-case

Convert strings between different cases.
Ruby
95
star
23

tty-reader

A set of methods for processing keyboard input in character, line and multiline modes.
Ruby
85
star
24

tty-option

A declarative command-line parser
Ruby
84
star
25

merkle_tree

A merkle tree is a data structure used for efficiently summarizing sets of data, often one-time signatures.
Ruby
83
star
26

tty-screen

Terminal screen detection - cross platform, major ruby interpreters
Ruby
83
star
27

verse

[DEPRECATED] Text transformations
Ruby
71
star
28

tty-cursor

Terminal cursor movement and manipulation of cursor properties such as visibility
Ruby
68
star
29

supervision

Write distributed systems that are resilient and self-heal.
Ruby
66
star
30

tty-file

File manipulation utility methods
Ruby
65
star
31

tty-config

A highly customisable application configuration interface for building terminal tools.
Ruby
61
star
32

benchmark-trend

Measure performance trends of Ruby code
Ruby
59
star
33

tty-font

Terminal fonts
Ruby
58
star
34

lex

Lex is an implementation of lex tool in Ruby.
Ruby
56
star
35

tty-tree

Print directory or structured data in a tree like format
Ruby
56
star
36

strings-truncation

Truncate strings with fullwidth characters and ANSI codes.
Ruby
49
star
37

tty-pager

Terminal output paging - cross-platform, major ruby interpreters
Ruby
39
star
38

tty-color

Terminal color capabilities detection
Ruby
35
star
39

slideck

Present Markdown-powered slide decks in the terminal.
Ruby
34
star
40

strings-inflection

Convert between singular and plural forms of English nouns
Ruby
31
star
41

tty-link

Hyperlinks in your terminal
Ruby
31
star
42

tty-platform

Operating system detection
Ruby
29
star
43

tty-sparkline

Sparkline charts for terminal applications.
Ruby
29
star
44

tty-editor

Opens a file or text in the user's preferred editor
Ruby
27
star
45

communist

Library for mocking CLI calls to external APIs
Ruby
25
star
46

splay_tree

A self-balancing binary tree optimised for fast access to frequently used nodes.
Ruby
24
star
47

equatable

Allows ruby objects to implement equality comparison and inspection methods.
Ruby
24
star
48

minehunter

Terminal mine hunting game.
Ruby
23
star
49

rotation.js

Responsive and mobile enabled jQuery plugin to help create rotating content.
JavaScript
22
star
50

strings-numeral

Express numbers as string numerals
Ruby
20
star
51

strings-ansi

Handle ANSI escape codes in strings
Ruby
19
star
52

benchmark-malloc

Trace memory allocations and collect stats
Ruby
19
star
53

tty-which

Cross-platform implementation of Unix `which` command
Ruby
17
star
54

tty-runner

A command routing tree for terminal applications
Ruby
12
star
55

benchmark-perf

Benchmark execution time and iterations per second
Ruby
12
star
56

impact

Ruby backend for Impact.js framework
Ruby
8
star
57

queen

English language linter to hold your files in high esteem.
Ruby
8
star
58

pastel-cli

CLI tool for intuitive terminal output styling
Ruby
7
star
59

dotfiles

Configuration files for Unix tools
Vim Script
7
star
60

tty-markdown-cli

CLI tool for displaying nicely formatted Markdown documents in the terminal
Ruby
7
star
61

static_deploy

Automate deployment of static websites
Ruby
6
star
62

tenpin

Terminal tenpin bowling game
Ruby
4
star
63

tytus

Helps you manage page titles in your Rails app.
Ruby
3
star
64

tty.github.io

TTY toolkit website.
SCSS
2
star
65

peter-murach.github.com

Personal webpage
JavaScript
2
star
66

wc.rb

A Ruby clone of Unix wc utility.
Ruby
2
star
67

exportable

Rails plugin to ease exporting tasks.
Ruby
1
star
68

capistrano-git-stages

Multistage capistrano git tags
Ruby
1
star
69

tabster

Ruby
1
star
70

leek

Cucumber steps and RSpec expectations for command line apps
Ruby
1
star
71

unicorn.github.io

Website for the github_api and github_cli ruby gems.
CSS
1
star
72

tty-color-cli

CLI tool for terminal color capabilities detection
Ruby
1
star
73

finite_machine.github.io

Website for finite_machine Ruby gem
SCSS
1
star
74

strings-wrapping

Wrap strings with fullwidth characters and ANSI codes
Ruby
1
star