bcat 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bcat.gemspec +7 -2
- data/bin/bcat +34 -24
- data/bin/bcat-encodehtml +14 -0
- data/bin/btee +2 -0
- data/lib/bcat.rb +31 -31
- data/lib/bcat/browser.rb +24 -0
- data/lib/bcat/reader.rb +50 -0
- data/man/bcat.1.ronn +27 -12
- data/man/btee.1.ronn +52 -0
- metadata +9 -4
data/bcat.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'bcat'
|
3
|
-
s.version = '0.0
|
4
|
-
s.date = '2010-06-
|
3
|
+
s.version = '0.2.0'
|
4
|
+
s.date = '2010-06-20'
|
5
5
|
|
6
6
|
s.summary = "browser cat"
|
7
7
|
s.description =
|
@@ -17,9 +17,14 @@ Gem::Specification.new do |s|
|
|
17
17
|
Rakefile
|
18
18
|
bcat.gemspec
|
19
19
|
bin/bcat
|
20
|
+
bin/bcat-encodehtml
|
21
|
+
bin/btee
|
20
22
|
lib/bcat.rb
|
23
|
+
lib/bcat/browser.rb
|
21
24
|
lib/bcat/kidgloves.rb
|
25
|
+
lib/bcat/reader.rb
|
22
26
|
man/bcat.1.ronn
|
27
|
+
man/btee.1.ronn
|
23
28
|
]
|
24
29
|
# = MANIFEST =
|
25
30
|
|
data/bin/bcat
CHANGED
@@ -1,53 +1,63 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#/ Usage: bcat [-h] [<file>]...
|
3
|
-
#/
|
2
|
+
#/ Usage: bcat [-h] [-t <title>] [<file>]...
|
3
|
+
#/ btee <options> [<file>]...
|
4
|
+
#/ Read standard input, or one or more <file>s, and write to browser. When
|
5
|
+
#/ invoked as btee, also write input to standard output.
|
4
6
|
#/
|
5
7
|
#/ Options
|
6
8
|
#/ -h, --html input is html encoded
|
7
9
|
#/ -t, --title=<text> use <text> as the page title
|
10
|
+
#/ -d, --debug enable verbose debug logging on stderr
|
8
11
|
require 'optparse'
|
9
|
-
require 'bcat'
|
10
12
|
|
11
13
|
options = {
|
12
14
|
:html => false,
|
13
15
|
:title => Dir.pwd,
|
14
|
-
:Host => '
|
15
|
-
:Port => 8091
|
16
|
+
:Host => '127.0.0.1',
|
17
|
+
:Port => 8091,
|
18
|
+
:debug => false
|
16
19
|
}
|
17
20
|
|
21
|
+
(class <<self;self;end).send(:define_method, :notice) { |message|
|
22
|
+
warn "#{File.basename($0)}: #{message}" if options[:debug] }
|
23
|
+
|
18
24
|
ARGV.options do |argv|
|
19
25
|
argv.on('-h', '--html') { options[:html] = true }
|
26
|
+
argv.on('-a', '--app=v') { |app| ENV['BCAT_APPLICATION'] = app }
|
20
27
|
argv.on('-t', '--title=v') { |text| options[:title] = text }
|
28
|
+
argv.on('-d', '--debug') { options[:debug] = true }
|
21
29
|
argv.on_tail('--help') { exec "grep ^#/ <#{__FILE__} | cut -c4-" }
|
22
30
|
argv.parse!
|
23
31
|
end
|
32
|
+
ARGV.push '-' if ARGV.empty?
|
24
33
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
fds = [$stdin] if fds.empty?
|
34
|
+
require 'bcat'
|
35
|
+
notice "loaded bcat v#{Bcat::VERSION}"
|
36
|
+
|
37
|
+
include Bcat::Browser
|
38
|
+
notice "env BCAT_APPLICATION=#{ENV['BCAT_APPLICATION'].inspect}"
|
39
|
+
notice "env BCAT_COMMAND=#{browser_command.inspect}"
|
34
40
|
|
35
|
-
|
41
|
+
reader =
|
42
|
+
if File.basename($0) =~ /tee$/
|
43
|
+
Bcat::TeeReader.new(ARGV, $stdout)
|
44
|
+
else
|
45
|
+
Bcat::Reader.new(ARGV)
|
46
|
+
end
|
36
47
|
|
48
|
+
notice "starting server"
|
37
49
|
pid = nil
|
38
50
|
begin
|
39
|
-
bcat = Bcat.new(
|
51
|
+
bcat = Bcat.new(reader, options)
|
40
52
|
bcat.serve! do |sock|
|
41
|
-
|
42
|
-
|
43
|
-
(fds + [sock, $stdin, $stdout]).uniq.each { |fd| fd.close }
|
44
|
-
ENV['BCAT_URL'] = "http://#{bcat[:Host]}:#{bcat[:Port]}/#{File.basename(Dir.pwd)}"
|
45
|
-
ENV['BCAT_ARGS'] = "-a '#{ENV['BCAT_APPLICATION']}'" if !ENV['BCAT_APPLICATION'].to_s.empty?
|
46
|
-
exec "/bin/sh -c \"#{command}\""
|
47
|
-
end
|
53
|
+
url = "http://#{bcat[:Host]}:#{bcat[:Port]}/#{File.basename(Dir.pwd)}"
|
54
|
+
pid = browser(url)
|
48
55
|
end
|
49
56
|
rescue Interrupt
|
57
|
+
notice "interrupt"
|
50
58
|
end
|
51
59
|
|
52
60
|
Process.wait(pid) if pid
|
53
|
-
|
61
|
+
status = $?
|
62
|
+
notice "open exited with #{status}"
|
63
|
+
exit status
|
data/bin/bcat-encodehtml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Usage: bcat-encodehtml
|
3
|
+
# Read text from stdin and write HTML encoded result to stdout.
|
4
|
+
|
5
|
+
while char = $stdin.getc
|
6
|
+
case char
|
7
|
+
when ?<
|
8
|
+
$stdout.write('<')
|
9
|
+
when ?&
|
10
|
+
$stdout.write('&')
|
11
|
+
else
|
12
|
+
$stdout.putc(char)
|
13
|
+
end
|
14
|
+
end
|
data/bin/btee
ADDED
data/lib/bcat.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'rack'
|
2
|
+
require 'bcat/reader'
|
2
3
|
require 'bcat/kidgloves'
|
4
|
+
require 'bcat/browser'
|
3
5
|
|
4
6
|
class Bcat
|
5
|
-
VERSION = '0.0
|
7
|
+
VERSION = '0.2.0'
|
6
8
|
include Rack::Utils
|
7
9
|
|
8
|
-
def initialize(
|
9
|
-
@
|
10
|
+
def initialize(reader, config={})
|
11
|
+
@reader = reader
|
10
12
|
@config = {:Host => '127.0.0.1', :Port => 8091}.merge(config)
|
11
13
|
end
|
12
14
|
|
@@ -15,9 +17,29 @@ class Bcat
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def call(env)
|
20
|
+
notice "#{env['REQUEST_METHOD']} #{env['PATH_INFO'].inspect}"
|
18
21
|
[200, {"Content-Type" => "text/html;charset=utf-8"}, self]
|
19
22
|
end
|
20
23
|
|
24
|
+
def each
|
25
|
+
yield "\n" * 1000
|
26
|
+
yield "<!DOCTYPE html>\n"
|
27
|
+
yield head
|
28
|
+
yield "<pre>" if !self[:html]
|
29
|
+
|
30
|
+
@reader.each do |buf|
|
31
|
+
if !self[:html]
|
32
|
+
buf = escape_html(buf)
|
33
|
+
buf.gsub!(/\n/, "<br>")
|
34
|
+
end
|
35
|
+
buf = escape_js(buf)
|
36
|
+
yield "<script>document.write('#{buf}');</script>"
|
37
|
+
end
|
38
|
+
|
39
|
+
yield "</pre>" if !self[:html]
|
40
|
+
yield foot
|
41
|
+
end
|
42
|
+
|
21
43
|
def head
|
22
44
|
["<html>",
|
23
45
|
"<head><title>#{self[:title] || 'bcat'}</title></head>",
|
@@ -34,35 +56,8 @@ class Bcat
|
|
34
56
|
string
|
35
57
|
end
|
36
58
|
|
37
|
-
def each
|
38
|
-
yield "\n" * 1000
|
39
|
-
yield "<!DOCTYPE html>\n"
|
40
|
-
yield head
|
41
|
-
yield "<pre>" if !self[:html]
|
42
|
-
|
43
|
-
begin
|
44
|
-
@fds.each do |fd|
|
45
|
-
begin
|
46
|
-
while buf = fd.readpartial(4096)
|
47
|
-
if !self[:html]
|
48
|
-
buf = escape_html(buf)
|
49
|
-
buf.gsub!(/\n/, "<br>")
|
50
|
-
end
|
51
|
-
buf = escape_js(buf)
|
52
|
-
yield "<script>document.write('#{buf}');</script>"
|
53
|
-
end
|
54
|
-
rescue EOFError
|
55
|
-
ensure
|
56
|
-
fd.close rescue nil
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
yield "</pre>" if !self[:html]
|
62
|
-
yield foot
|
63
|
-
end
|
64
|
-
|
65
59
|
def close
|
60
|
+
notice "closing with interrupt"
|
66
61
|
raise Interrupt
|
67
62
|
end
|
68
63
|
|
@@ -77,4 +72,9 @@ class Bcat
|
|
77
72
|
def serve!(&bk)
|
78
73
|
Rack::Handler::KidGloves.run to_app, @config, &bk
|
79
74
|
end
|
75
|
+
|
76
|
+
def notice(message)
|
77
|
+
return if !@config[:debug]
|
78
|
+
warn "#{File.basename($0)}: #{message}"
|
79
|
+
end
|
80
80
|
end
|
data/lib/bcat/browser.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Bcat
|
2
|
+
module Browser
|
3
|
+
def browser(url, application=ENV['BCAT_APPLICATION'])
|
4
|
+
command = browser_command
|
5
|
+
fork do
|
6
|
+
[$stdin, $stdout].each { |fd| fd.close }
|
7
|
+
ENV['BCAT_ARGS'] = "-a '#{application}'" if !application.to_s.empty?
|
8
|
+
ENV['BCAT_URL'] = url
|
9
|
+
ENV['BCAT_COMMAND'] = command
|
10
|
+
exec "/bin/sh -c \"#{command.gsub(/"/, '\"')}\""
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def browser_command
|
15
|
+
return ENV['BCAT_COMMAND'] if !ENV['BCAT_COMMAND'].to_s.empty?
|
16
|
+
|
17
|
+
case `uname`
|
18
|
+
when /Darwin/ ; 'open $BCAT_ARGS "$BCAT_URL"'
|
19
|
+
when /Linux/, /BSD/ ; 'xdg-open $BCAT_ARGS "$BCAT_URL"'
|
20
|
+
else ; 'xdg-open "$BCAT_URL"'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/bcat/reader.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
class Bcat
|
2
|
+
# ARGF style multi-file streaming interface. Input is read with IO#readpartial
|
3
|
+
# to avoid buffering.
|
4
|
+
class Reader
|
5
|
+
attr_reader :files
|
6
|
+
attr_reader :fds
|
7
|
+
|
8
|
+
def initialize(files=[])
|
9
|
+
@files = files
|
10
|
+
@fds =
|
11
|
+
files.map do |f|
|
12
|
+
if f == '-'
|
13
|
+
$stdin
|
14
|
+
else
|
15
|
+
File.open(f, 'rb')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def each
|
21
|
+
fds.each do |fd|
|
22
|
+
fd.sync = true
|
23
|
+
begin
|
24
|
+
while buf = fd.readpartial(4096)
|
25
|
+
yield buf
|
26
|
+
end
|
27
|
+
rescue EOFError
|
28
|
+
ensure
|
29
|
+
fd.close
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Like Reader but writes all input to an output IO object in addition to
|
36
|
+
# yielding to the block.
|
37
|
+
class TeeReader < Reader
|
38
|
+
def initialize(files=[], out=$stdout)
|
39
|
+
@out = out
|
40
|
+
super(files)
|
41
|
+
end
|
42
|
+
|
43
|
+
def each
|
44
|
+
super() do |chunk|
|
45
|
+
@out.write chunk
|
46
|
+
yield chunk
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/man/bcat.1.ronn
CHANGED
@@ -3,13 +3,23 @@ bcat(1) -- browser cat
|
|
3
3
|
|
4
4
|
## SYNOPSIS
|
5
5
|
|
6
|
-
`bcat` [-
|
6
|
+
`bcat` [-htad] [<file>...]<br>
|
7
|
+
`btee` [-htad] [<file>...]
|
7
8
|
|
8
9
|
## DESCRIPTION
|
9
10
|
|
10
|
-
The `bcat` utility reads from standard input, or one or more <file>s, and
|
11
|
-
output
|
12
|
-
|
11
|
+
The `bcat` utility reads from standard input, or one or more <file>s, and pipes
|
12
|
+
output into a web browser. <file> may be '-', in which case standard input is
|
13
|
+
concatenated at that position.
|
14
|
+
|
15
|
+
When invoked as `btee`, all input is written immediately to standard output in
|
16
|
+
addition to being piped into the browser.
|
17
|
+
|
18
|
+
## OPTIONS
|
19
|
+
|
20
|
+
* `-t`, `--title`=<text>:
|
21
|
+
Use <text> as the page `<title>`. By default, the path to the current working
|
22
|
+
directory is used as the title.
|
13
23
|
|
14
24
|
* `-h`, `--html`:
|
15
25
|
Do not HTML encode input. By default, `bcat` assumes input is plain text
|
@@ -17,9 +27,14 @@ standard input is concatenated at the position specified.
|
|
17
27
|
characters (`\n`) to `<br>` tags, and wraps output in a `<pre>` block. The
|
18
28
|
`--html` option disables all of these conversions, causing the input text
|
19
29
|
to be written directly as HTML.
|
20
|
-
|
21
|
-
|
22
|
-
|
30
|
+
|
31
|
+
* `-a`, `--app`=`Safari`|`Google Chrome`|`Firefox`:
|
32
|
+
MacOS only. The name of the browser application. This can also be set using
|
33
|
+
the `BCAT_APPLICATION` environment variable.
|
34
|
+
|
35
|
+
* `-d`, `--debug`:
|
36
|
+
Turn on verbose debug logging to standard error. Include this output when
|
37
|
+
reporting defects if applicable.
|
23
38
|
|
24
39
|
## ENVIRONMENT
|
25
40
|
|
@@ -27,11 +42,11 @@ standard input is concatenated at the position specified.
|
|
27
42
|
* `BCAT_COMMAND`=`xdg-open "$url"`:
|
28
43
|
The command used to launch to the browser application.
|
29
44
|
|
30
|
-
* `BCAT_APPLICATION`=[`Safari | Google Chrome | Firefox`]:
|
31
|
-
MacOS X only. The name of the
|
32
|
-
the `-a` argument to open(1). When `BCAT_APPLICATION` is undefined,
|
33
|
-
system default browser is used.
|
45
|
+
* `BCAT_APPLICATION`=[`Safari` | `Google Chrome` | `Firefox`]:
|
46
|
+
MacOS X only. The name of the browser application . This is given as the
|
47
|
+
value of the `-a` argument to open(1). When `BCAT_APPLICATION` is undefined,
|
48
|
+
the system default browser is used.
|
34
49
|
|
35
50
|
## SEE ALSO
|
36
51
|
|
37
|
-
cat(1), open(1)
|
52
|
+
cat(1), tee(1), open(1)
|
data/man/btee.1.ronn
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
bcat(1) -- browser cat
|
2
|
+
======================
|
3
|
+
|
4
|
+
## SYNOPSIS
|
5
|
+
|
6
|
+
`bcat` [-htad] [<file>...]<br>
|
7
|
+
`btee` [-htad] [<file>...]
|
8
|
+
|
9
|
+
## DESCRIPTION
|
10
|
+
|
11
|
+
The `bcat` utility reads from standard input, or one or more <file>s, and pipes
|
12
|
+
output into a web browser. <file> may be '-', in which case standard input is
|
13
|
+
concatenated at that position.
|
14
|
+
|
15
|
+
When invoked as `btee`, all input is written immediately to standard output in
|
16
|
+
addition to being piped into the browser.
|
17
|
+
|
18
|
+
## OPTIONS
|
19
|
+
|
20
|
+
* `-t`, `--title`=<text>:
|
21
|
+
Use <text> as the page `<title>`. By default, the path to the current working
|
22
|
+
directory is used as the title.
|
23
|
+
|
24
|
+
* `-h`, `--html`:
|
25
|
+
Do not HTML encode input. By default, `bcat` assumes input is plain text
|
26
|
+
and entity encodes any `<` or `&` characters, converts raw end-of-line
|
27
|
+
characters (`\n`) to `<br>` tags, and wraps output in a `<pre>` block. The
|
28
|
+
`--html` option disables all of these conversions, causing the input text
|
29
|
+
to be written directly as HTML.
|
30
|
+
|
31
|
+
* `-a`, `--app`=`Safari`|`Google Chrome`|`Firefox`:
|
32
|
+
MacOS only. The name of the browser application. This can also be set using
|
33
|
+
the `BCAT_APPLICATION` environment variable.
|
34
|
+
|
35
|
+
* `-d`, `--debug`:
|
36
|
+
Turn on verbose debug logging to standard error. Include this output when
|
37
|
+
reporting defects if applicable.
|
38
|
+
|
39
|
+
## ENVIRONMENT
|
40
|
+
|
41
|
+
* `BCAT_COMMAND`=`open -a $BCAT_APPLICATION $url`:
|
42
|
+
* `BCAT_COMMAND`=`xdg-open "$url"`:
|
43
|
+
The command used to launch to the browser application.
|
44
|
+
|
45
|
+
* `BCAT_APPLICATION`=[`Safari` | `Google Chrome` | `Firefox`]:
|
46
|
+
MacOS X only. The name of the browser application . This is given as the
|
47
|
+
value of the `-a` argument to open(1). When `BCAT_APPLICATION` is undefined,
|
48
|
+
the system default browser is used.
|
49
|
+
|
50
|
+
## SEE ALSO
|
51
|
+
|
52
|
+
cat(1), tee(1), open(1)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bcat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 2
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.1
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ryan Tomayko
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-20 00:00:00 -07:00
|
19
19
|
default_executable: bcat
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -45,9 +45,14 @@ files:
|
|
45
45
|
- Rakefile
|
46
46
|
- bcat.gemspec
|
47
47
|
- bin/bcat
|
48
|
+
- bin/bcat-encodehtml
|
49
|
+
- bin/btee
|
48
50
|
- lib/bcat.rb
|
51
|
+
- lib/bcat/browser.rb
|
49
52
|
- lib/bcat/kidgloves.rb
|
53
|
+
- lib/bcat/reader.rb
|
50
54
|
- man/bcat.1.ronn
|
55
|
+
- man/btee.1.ronn
|
51
56
|
- COPYING
|
52
57
|
has_rdoc: true
|
53
58
|
homepage: http://github.com/rtomayko/bcat/
|