Coder Social home page Coder Social logo

termdown's Introduction

termdown demo

Usage: termdown [OPTIONS] [TIME]

  Starts a countdown to TIME. Example values for TIME:
  10, '1h 5m 30s', '12:00', '2020-01-01', '2020-01-01 14:00 UTC'.

  If TIME is not given, termdown will operate in stopwatch mode
  and count forward.

  Hotkeys:
      E       Show end time (countdown mode only)
      L       Lap (stopwatch mode only)
      R       Reset
      SPACE   Pause (will delay absolute TIME)
      +       Plus (will add 10 seconds)
      -       Minus (will subtract 10 seconds)
      Q       Quit

Options:
  -a, --alt-format              Use colon-separated time format
  -b, --blink                   Flash terminal at end of countdown
  -B, --no-bell                 Don't ring terminal bell at end of countdown
  -c, --critical N              Draw final N seconds in red and announce them
                                individually with --voice or --exec-cmd
                                (defaults to 3)

  -e, --end                     Display target datetime of unpaused countdown
  -f, --font FONT               Choose from
                                http://www.figlet.org/examples.html

  -p, --voice-prefix TEXT       Add TEXT to the beginning of --voice and
                                --exec annunciations (except per-second ones)

  -q, --quit-after N            Quit N seconds after countdown (use with -b or
                                -t) or terminate stopwatch after N seconds

  -s, --no-seconds              Don't show seconds (except for last minute of
                                countdown and first minute of stopwatch)

  -t, --text TEXT               Text to display at end of countdown
  -T, --title TEXT              Text to display on top of countdown/stopwatch
  -W, --no-window-title         Don't update terminal title with
                                remaining/elapsed time

  -v, --voice VOICE             Spoken countdown (at fixed intervals with per-
                                second annunciations starting at --critical;
                                requires `espeak` on Linux or `say` on macOS;
                                choose VOICE from `say -v '?'` or `espeak
                                --voices`)

  -o, --outfile PATH            File to write current remaining/elapsed time
                                to

  --exec-cmd CMD                Runs CMD every second. '{0}' and '{1}' in CMD
                                will be replaced with the remaining/elapsed
                                number of seconds and a more sparse
                                annunciation as in --voice, respectively. For
                                example, to get a callout at five seconds
                                only, use: --exec-cmd "if [ '{0}' == '5' ];
                                then say -v Alex {1}; fi"

  --no-figlet                   Don't use ASCII art for display
  --no-figlet-y-offset INTEGER  Vertical offset within the terminal (only for
                                --no-figlet)

  --no-text-magic               Don't try to replace non-ASCII characters (use
                                with -t)

  --version                     Show version and exit
  -z, --time                    Show current time instead of
                                countdown/stopwatch

  -Z, --time-format TEXT        Format for --time/--end (defaults to
                                "%H:%M:%S", ignores --no-seconds)

  -D, --date-format TEXT        Format for --end (defaults to "%Y-%m-%d")
  --help                        Show this message and exit.
pip install termdown

PyPI version   Python 3.x   PyPI license

termdown's People

Contributors

actionless avatar adrianrocamora avatar clawoflight avatar dther avatar evansjahja avatar geeklhem avatar jokeneversoke avatar lasers avatar matedealer avatar mosbasik avatar mxr avatar narthorn avatar polyzen avatar shadowkyogre avatar shlomif avatar trehn avatar vain avatar waynew avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

termdown's Issues

Curse error when the terminal window is too small

I get an error (_curses.error: insstr() returned ERR) if the terminal window is too small to display everything. I was able to reproduce this error:

  • By giving a high number (1h30m) in an already small window,
  • By reducing the window size of an already running countdown,
  • By using a big font (-f doh),
  • In several terminal emulator (terminator and (u)xterm).

Example of traceback:

 Traceback (most recent call last):
  File "/usr/local/bin/termdown", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 716, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 696, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 889, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 534, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/termdown.py", line 531, in main
    curses.wrapper(stopwatch, **kwargs)
  File "/usr/lib/python2.7/curses/wrapper.py", line 43, in wrapper
    return func(stdscr, *args, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/termdown.py", line 133, in wrapper
    func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/termdown.py", line 434, in stopwatch
    title=title,
  File "/usr/local/lib/python2.7/dist-packages/termdown.py", line 79, in draw_text
    stdscr.insstr(i, 0, line, curses.color_pair(color))
_curses.error: insstr() returned ERR
termdown --version
1.9.0

Maybe it should fallback to --no-figlet if this kind of exception is caught ?

Allow for more text per line with -T

First of all, thanks for this nifty piece of software!

When specifying some text with -T, the text breaks to a new line whenever if is longer than (I think) the max length occupied by the timer. Would it be possible to allow for more characters per line, just like with the -t option? Thanks!

outfile option does not work in stopwatch mode

I tried termdown (installed via pip) on Python 3.6.9 on an Ubuntu 18.04 system, and when I use the -o or --outfile options with stopwatch mode, the lap data and average are written to std out after exiting the program, but nothing is ever written to the filename I pass after the o/outfile switch.

There is an error reported if I supply an outfile name that already exists, however.

Abnormal CPU utilization for stopwatch

Hello

I noticed that when I use stopwatch / clock mode, termdown loads CPU almost to 100%. This is not how a simple stopwatch should behave. Timer mode is fine.

Below see some profiling data obtained using perf tool for stopwatch, timer and bash sleep function.
Note the task-clock and CPU clock frequency. The difference is also noticable for cooler fan noise.

⟩ perf stat termdown -z

 Performance counter stats for 'termdown -z':

          14274.19 msec task-clock:u              #    0.855 CPUs utilized
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
              3777      page-faults:u             #    0.265 K/sec
       42938581915      cycles:u                  #    3.008 GHz
       67333349803      instructions:u            #    1.57  insn per cycle
       10616874674      branches:u                #  743.781 M/sec
          83548787      branch-misses:u           #    0.79% of all branches

      16.686076853 seconds time elapsed

      13.758134000 seconds user
       0.515512000 seconds sys


⟩ perf stat sleep 5

 Performance counter stats for 'sleep 5':

              3.34 msec task-clock:u              #    0.001 CPUs utilized
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
                58      page-faults:u             #    0.017 M/sec
            344081      cycles:u                  #    0.103 GHz
            240960      instructions:u            #    0.70  insn per cycle
             53836      branches:u                #   16.137 M/sec
              4084      branch-misses:u           #    7.59% of all branches

       5.009497461 seconds time elapsed

       0.000000000 seconds user
       0.005746000 seconds sys


⟩ perf stat termdown 5

 Performance counter stats for 'termdown 5':

            450.24 msec task-clock:u              #    0.084 CPUs utilized
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
              3775      page-faults:u             #    0.008 M/sec
         823480722      cycles:u                  #    1.829 GHz
        1074623603      instructions:u            #    1.30  insn per cycle
         220645709      branches:u                #  490.064 M/sec
           5177317      branch-misses:u           #    2.35% of all branches

       5.358574635 seconds time elapsed

       0.343564000 seconds user
       0.112419000 seconds sys

I managed to fix it by putting sleep(.2) in while loop in stopwatch. I'm not sure this is the right way to mitigate the problem, though.

Here're the stats for the modified termdown installed from source:

⟩ perf stat termdown -z

 Performance counter stats for 'termdown -z':

            685.45 msec task-clock:u              #    0.074 CPUs utilized
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
              6648      page-faults:u             #    0.010 M/sec
         896813441      cycles:u                  #    1.308 GHz
        1270088395      instructions:u            #    1.42  insn per cycle
         253694359      branches:u                #  370.114 M/sec
           5930235      branch-misses:u           #    2.34% of all branches

       9.240416002 seconds time elapsed

       0.561054000 seconds user
       0.136016000 seconds sys

My system:

⟩ termdown --version
1.17.0
⟩ python -V
Python 3.8.3
⟩ uname -a
Linux archlinux 5.6.15-arch1-1 #1 SMP PREEMPT Wed, 27 May 2020 23:42:26 +0000 x86_64 GNU/Linux

Add Support for Looping?

Hi @trehn -

This is a fantastic tool and I greatly love it! I have even incorporated it into my live streaming setup here:

image

I am a huge fan of the pomodoro technique and would love to have some sort of looping mechanism available in termdown. Right now, I get around it by using a shell loop like this:

for i in {1..5} 
do 
    termdown 2s -c 60 -t BREAK -q 2
done

However, it is not perfect as it stutters for a moment before reopening termdown. Perhaps there could be syntax like:

termdown 25m -c 60 -t BREAK -q 300 --loops 5 
# or alternatively
termdown 25m -c 60 -t BREAK -q 300 -l 5

Would this be feasible/doable to add? Thank you!

Support arbitrary script execution during countdown

I would like the ability to play sounds at certain intervals during the countdown. Basically, I like the --voice option, but rather than actually calling voice_cmd I want to specify a different program.

I think the most flexible way to achieve this is to add a new argument to termdown that accepts the path to an executable script. During each iteration of the countdown loop, termdown can call this script and pass it seconds_left as an argument.

So executing termdown would look something like:

$ termdown -x ~/bin/foo.sh 60

Which will have the effect of termdown doing its normal 60 second countdown, plus on each second executing:

~/bin/foo.sh 60
~/bin/foo.sh 59
~/bin/foo.sh 58
~/bin/foo.sh 57
...

If I wanted to reimplement the current --voice behaviour, my ~/bin/foo.sh would look like:

#!/bin/bash
case $1 in
    5|10|20|30|60)
        espeak "$1 seconds"
        ;;
    300|600|1800)
        min=$(($1/60))
        espeak "$min minutes"
        ;;
esac

More realistically, I want a 10 minute timer that gives me a 60 second and 10 second audible warning that is more pleasant than espeak's voice. So my script would be:

#!/bin/bash
case $1 in
    60)
        mpv ~/path/to/bell.mp3
        ;;
    10)
        mpv ~/path/to/klaxon.mp3
        ;;
esac

It might be nice if termdown also informed the script if seconds_left <= critical, similar to how the voice support currently works.

Maybe it would be cleaner if termdown provided this information to the script as environment variables rather than as positional arguments? Such that termdown is executing:

SECONDS_LEFT=12 IS_CRITICAL=false ~/bin/foo.sh
SECONDS_LEFT=11 IS_CRITICAL=false ~/bin/foo.sh
SECONDS_LEFT=10 IS_CRITICAL=true ~/bin/foo.sh
...

This would also solve #42.

Specifying both -v and --exec-cmd throws an execption and crashes

I suppose with --exec-cmd you can do everything you can do with -v. Maybe it should just print out a "these flags aren't compatible" error and quit.

termdown -v Daniel --exec-cmd 'say hello' 10s                                    <<<
Traceback (most recent call last):
  File "/Users/frog/.local/bin/termdown", line 8, in <module>
    sys.exit(main())
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/termdown.py", line 744, in main
    curses.wrapper(countdown, **kwargs)
  File "/usr/local/Cellar/[email protected]/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/curses/__init__.py", line 105, in wrapper
    return func(stdscr, *args, **kwds)
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/termdown.py", line 141, in wrapper
    return func(*args, **kwargs)
  File "/Users/frog/.local/pipx/venvs/termdown/lib/python3.8/site-packages/termdown.py", line 362, in countdown
    [voice_cmd, "-v", voice, annunciation.strip()],
AttributeError: 'NoneType' object has no attribute 'strip'

Config for default values

Hi,

I like termdown and want to use it on a regular basis. Is it possible to specify a config file where some things - e.g. the default font - is specified?

Best

flo2k

setup.py, PyPI, and Python 3

This is a good program, please upload to PyPI, that might get more people use your timer.

By the way, this project self is Python 3, I have tried with latest pyfiglet from Git repository, which might get a new release soon, please do keep an eye on that and update the README and setup.py when there is one, as well as the dependency information, especially pyfiglet, which I'd like to see being mentioned. I only learned about it via this timer.

This issue is just some simple suggestions.

Make it possible to know whether termdown was closed manually.

I chain termdown with an alarm command.
When termdown is closed manually or crashed, I don't want the alarm command to be executed.

When termdown is crashed, exit status is not 0.
Thus, if termdown exits with non-zero exit status when I close it manually, I'd be able to detect whether termdown was closed manually or crashed.

There could be other ways to detect whether termdown was closed manually.

Display title while paused

While paused, a countdown’s title is hidden. I suggest to keep the title visible.

For example, when I pause two countdowns running side-by-side, I cannot easily see which one I want to resume as their titles are not displayed.

Use SI symbol for minutes (min) instead of "m"

I love the project! 🙂

My only small complaint is that the time does not respect the SI symbol for minutes, which is "min". I would much rather see that. "m" is the unit for meters and while, admittedly, there is little risk of confusion, I think that it'd be better.

Thanks for the project and for your time! 🙂

Figlet font shown in terminal window with 1 line height

Problem

When I start termdown in a terminal emulator window that has only a height of 1 line, termdown tries to render the numbers in figlet ASCII art. Obviously, that is not readable.

When I resize the window to many lines and back to 1 line, termdown switches correctly back and forth between ASCII art and normal text.

If the terminal window has 2 lines or more, termdown automatically switches to printing normal text (e.g. 2m 10s), as I would expect.

Expected Behavior

termdown doesn’t try to render figlet ASCII art when being started in a one-line terminal, but prints normal text.

System Info

  • Archlinux
  • termdown version: 1.17.0
  • Terminal emulator: termite v15
  • Window manager: sway 1.5.1

ImportError: cannot import name DEVNULL

Mac Catalina 10.15.6 upgrade from 10.15.5 seems to have broken termdown.

No amount of fiddling with Python or Pip helped. Nuked termdown, reinstalled, apparently successfully except the Python 2.7 deprecation warning (a clue, perhaps? ;) but running termdown only returns this:

Traceback (most recent call last):
  File "/Users/joel/Library/Python/2.7/bin/termdown", line 5, in <module>
    from termdown import main
  File "/Users/joel/Library/Python/2.7/lib/python/site-packages/termdown.py", line 12, in <module>
    from subprocess import DEVNULL, Popen, STDOUT
ImportError: cannot import name DEVNULL

[Bug] Countdown to a specific time (e.g. 12:00) becomes invalid after pause

Issue

The stopwatch function is being used in two cases: for a time period (20s) or to a specific time (12:30). However, in both cases the target datetime object is extended when paused, as line 414

termdown/termdown.py

Lines 411 to 414 in 660b30f

if input_action == INPUT_PAUSE:
time_paused = datetime.now() - pause_start
sync_start += time_paused
target += time_paused

This may not be the intended behavior for the user.

Possible Solutions

  • Create an extra function (not recommended as code duplication)
  • Add an extra flag to not add the time delta when passed

Breaks on small terminal windows

  ...
  File "/usr/local/lib/python2.7/dist-packages/termdown.py", line 137, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/termdown.py", line 299, in countdown
    countdown_text if no_figlet else figlet.renderText(countdown_text),
  File "/usr/local/lib/python2.7/dist-packages/pyfiglet/__init__.py", line 748, in renderText
    return self.engine.render(text)
  File "/usr/local/lib/python2.7/dist-packages/pyfiglet/__init__.py", line 326, in render
    builder.addCharToProduct()
  File "/usr/local/lib/python2.7/dist-packages/pyfiglet/__init__.py", line 395, in addCharToProduct
    raise CharNotPrinted("Width is not enough to print this character")
pyfiglet.CharNotPrinted: Width is not enough to print this character

I sometimes display the timer on a very small window, as a tile in a tiling window manager. If I don't get the font size right termdown might break. I propose the exception is caught, acknowledged somehow but the program doesn't stop.

Should be trivial to implement.

Number 1 not properly spaced from colon when using alt-format (-a)

Hello, and thank you for this amazing tool!
This is more like a visually annoying issue, but I'm reporting it nonetheless.
When the -a option is used, the 1-character kinda merges with the colon, as it's not properly spaced.
Would this be an easy fix?
image

EDIT: I'm using xfce4-terminal

A key to add minutes

I think an useful feature would be, when in countdown mode, to have an option to add a minute (e.g. a short interuption of work took place), as seen on some Android timers.

ModuleNotFoundError: No module named '_curses' on Python 3.10.0 (Windows)

Platform

Windows 10

PS <redacted>> py --version
Python 3.10.0
PS <redacted>> py -m pip install --user termdown

Symptom

PS <redacted>> termdown --version
Traceback (most recent call last):
  File "C:\Users\Microsoft\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196,
 in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\Microsoft\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86,
in _run_code
    exec(code, run_globals)
  File "C:\Users\Microsoft\AppData\Roaming\Python\Python310\Scripts\termdown.exe\__main__.p
y", line 4, in <module>
  File "C:\Users\Microsoft\AppData\Roaming\Python\Python310\site-packages\termdown.py", lin
e 7, in <module>
    import curses
  File "C:\Users\Microsoft\AppData\Local\Programs\Python\Python310\lib\curses\__init__.py",
 line 13, in <module>
    from _curses import *
ModuleNotFoundError: No module named '_curses'

Exit status

Would be nice to have different exit status codes for the different ways that the program terminated.

Something simple like a 0 for running to completion in countdown mode and 1 for Q being pressed. Maybe others would disagree or want a different output.

My motivation is using it in a script as a pomdoro tracker to automatically updated a count at the end only if it ran to completion. But certainly could be useful in other situations.

Really nice interface overall. Thank you!

Problems with terminal size?

My terminal size is reasonably large:

⚘ python -c 'import shutil; print(shutil.get_terminal_size())'                                                                                                                                                                                 $? 1  13:00:18
os.terminal_size(columns=254, lines=48)

However Termdown has some problems actually displaying it that wide :(

Wrapping 22m 55s as

22m
55s

Like so:
Why so small

That's just silly. Any ideas what the problem is here?

Issue starting termdown

I'm getting this issue when trying to start termdown;

Traceback (most recent call last):
  File "termdown.py", line 647, in <module>
    main()
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 716, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 696, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 889, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 534, in invoke
    return callback(*args, **kwargs)
  File "termdown.py", line 612, in main
    seconds_elapsed, laps = curses.wrapper(stopwatch, **kwargs)
  File "/usr/lib/python2.7/curses/wrapper.py", line 43, in wrapper
    return func(stdscr, *args, **kwds)
  File "termdown.py", line 138, in wrapper
    return func(*args, **kwargs)
  File "termdown.py", line 459, in stopwatch
    curses_lock, input_queue, quit_event = setup(stdscr)
  File "termdown.py", line 50, in setup
    curses.curs_set(False)
_curses.error: curs_set() returned ERR

I've tried both python 2.7 and 3.5.2 under debian testing. I've also cloned the repo and tried the following;

python setup.py install
python termdown.py

I'm not a python programmer so I might be missing something obvious here.

Rationale behind CursesReturnValue?

The termdown source code says:

curses.wrapper() does not provide the return value of the called
function, so we use this hack to pass something through.

Agreed, it's not explicitly documented, but curses.wrapper() does indeed provide a return value. I'm using that in several scripts, such as choose. Works in Python 2 and 3.

IIUC, you could use a simple return in stopwatch(). Am I missing something?

Question / Proposal: Config File

Is there any implementation or plans for a config file for things like default font, default use of alt-format, display or non-display of seconds, etc....

Add feature: - to subtract 10 seconds

I use this as a teacher for the whole class, and sometimes it would be helpful to subtract time from the timer in addition to adding time to the timer. The '-' key would be perfect for this.

ImportError: No module named queque

Traceback (most recent call last):
  File "/home/porter14/.local/bin/termdown", line 6, in <module>
    from termdown import main
  File "/home/porter14/.local/lib/python2.7/site-packages/termdown.py", line 8, in <module>
    from queue import Empty, Queue
ImportError: No module named queue

I added termdown temporarily to my $PATH by running PATH=$PATH:/home/porter14/.local/bin
Then I ran ' termdown 5m' in my terminal and I got the above mentioned error.
I googled the error and I saw a post: https://stackoverflow.com/questions/33432426/importerror-no-module-named-queue

Problem is that I have no experience at all with Python and using the solutions mentioned in the webpage I got nowhere.

Feature requests: spoken countdown interval and options

I've used this tool for the first time today. Very useful.

One minor suggestion for change, though. When counting with a "real" stopwatch, people tend to only say every 10th second or so out loud, untill --critical, which is also counted. I'm not sure how you'd like your program to behave. Please consider adding an --interval option and an option --onlyspeak (-o) to go with --voice. --onlyspeak could, for example, have three values: critical, interval and/or text.

So the command

termdown -c 10 -i 10 -t stop 60 -v 'en-gb' -o 'critical,interval,text'

would trigger espeak to read "60..., 50..., 40..., 30..., 20..., 10,9,8,7,6,5,4,3,2,1,stop", and show the spoken numbers in red.

As an extra, a prefix would be nice: -p 'T minus' which would appear before the number until the count becomes --critical.

So the command

termdown -c 10 -i 10 -t launch 60 -v 'en-gb' -o 'critical,interval,text'

would effectively turn it into a simple rocket launch counter, because we need that, don't we? Espeak should read "tee minus 60 [...] tee minus 20..., 10,9,8,7,6,5,4,3,2,1,launch". 😄 🚀

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.