highcarb 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile.lock +35 -27
- data/README.md +8 -37
- data/highcarb.gemspec +2 -3
- data/lib/highcarb/assets_controller.rb +0 -6
- data/lib/highcarb/command.rb +0 -2
- data/lib/highcarb/generator.rb +1 -4
- data/lib/highcarb/services.rb +0 -3
- data/lib/highcarb/slides_controller.rb +10 -12
- data/lib/highcarb/version.rb +1 -1
- data/lib/highcarb/views_controller.rb +0 -5
- data/resources/views/index.haml +9 -4
- metadata +64 -58
- data/lib/highcarb/sockets.rb +0 -47
- data/resources/views/index.coffee +0 -48
- data/resources/views/remote.coffee +0 -59
- data/resources/views/remote.haml +0 -61
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d9929cb6a55b1e5db242cf01b020a89a3eeda37a
|
4
|
+
data.tar.gz: 79409df9cd1ad9d993ecb9ea9dc2215daa02311c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4ef3b4f5ba7217d43d7d20cad4fa6660d1fe0f4b009a7e7f20ad80d1cfef74c6efa5a125305fd52e2bbce261a530c6fdff29f496dabd695fe5b72e9e53aafb30
|
7
|
+
data.tar.gz: 72c93b190216dbd6a2e61c22b1f8ec1f0cbd5242b58aeb97b5bc1124784570c48248a8916b34911b509118169e633504c2c319007bed436053d3a60da3b3bea5
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
highcarb (0.2)
|
5
|
-
coffee-script
|
6
|
-
em-websocket
|
4
|
+
highcarb (0.2.3)
|
7
5
|
haml
|
8
6
|
kramdown
|
9
7
|
mime-types
|
10
8
|
nokogiri
|
9
|
+
rouge
|
11
10
|
sass
|
12
11
|
thin
|
13
12
|
trollop
|
@@ -15,33 +14,42 @@ PATH
|
|
15
14
|
GEM
|
16
15
|
remote: http://rubygems.org/
|
17
16
|
specs:
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
sass (3.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
17
|
+
daemons (1.2.4)
|
18
|
+
eventmachine (1.2.3)
|
19
|
+
ffi (1.9.18)
|
20
|
+
haml (5.0.1)
|
21
|
+
temple (>= 0.8.0)
|
22
|
+
tilt
|
23
|
+
kramdown (1.14.0)
|
24
|
+
mime-types (3.1)
|
25
|
+
mime-types-data (~> 3.2015)
|
26
|
+
mime-types-data (3.2016.0521)
|
27
|
+
mini_portile2 (2.2.0)
|
28
|
+
nokogiri (1.8.0)
|
29
|
+
mini_portile2 (~> 2.2.0)
|
30
|
+
rack (2.0.3)
|
31
|
+
rb-fsevent (0.10.2)
|
32
|
+
rb-inotify (0.9.10)
|
33
|
+
ffi (>= 0.5.0, < 2)
|
34
|
+
rouge (2.1.1)
|
35
|
+
sass (3.5.1)
|
36
|
+
sass-listen (~> 4.0.0)
|
37
|
+
sass-listen (4.0.0)
|
38
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
39
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
40
|
+
temple (0.8.0)
|
41
|
+
thin (1.7.2)
|
42
|
+
daemons (~> 1.0, >= 1.0.9)
|
43
|
+
eventmachine (~> 1.0, >= 1.0.4)
|
44
|
+
rack (>= 1, < 3)
|
45
|
+
tilt (2.0.7)
|
46
|
+
trollop (2.1.2)
|
42
47
|
|
43
48
|
PLATFORMS
|
44
49
|
ruby
|
45
50
|
|
46
51
|
DEPENDENCIES
|
47
52
|
highcarb!
|
53
|
+
|
54
|
+
BUNDLED WITH
|
55
|
+
1.13.2
|
data/README.md
CHANGED
@@ -1,38 +1,21 @@
|
|
1
1
|
# HighCarb
|
2
2
|
|
3
|
-
HighCarb is a framework to create presentations
|
3
|
+
HighCarb is a framework to create presentations.
|
4
4
|
|
5
5
|
The presentation is based on Deck.js
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
9
|
```
|
10
|
-
|
10
|
+
$ gem install highcarb
|
11
11
|
```
|
12
12
|
|
13
|
-
### Dependencies
|
14
|
-
|
15
|
-
* You have to install Pygmentize if you want to highlight the code snippets.
|
16
|
-
* A JavaScript interpreter is needed to compile the CoffeeScript source. Rhino or JavaScript can be used with no problems.
|
17
|
-
|
18
|
-
In Debian (and derived) everything can be installed with
|
19
|
-
|
20
|
-
```
|
21
|
-
$ sudo apt-get install nodejs python-pygments
|
22
|
-
```
|
23
|
-
|
24
|
-
Mac OSX
|
25
|
-
|
26
|
-
```
|
27
|
-
$ brew install node.js
|
28
|
-
$ sudo easy_install Pygments
|
29
|
-
```
|
30
13
|
## Generate a presentation project
|
31
14
|
|
32
15
|
The `-g` flag generate a new tree with the base for the presentation
|
33
16
|
|
34
17
|
```
|
35
|
-
|
18
|
+
$ highcarb -g /my/slides/foobar
|
36
19
|
```
|
37
20
|
|
38
21
|
## Adding content
|
@@ -44,9 +27,7 @@ The generated tree is something like
|
|
44
27
|
├── assets
|
45
28
|
│ ├── README
|
46
29
|
│ ├── base.scss
|
47
|
-
│ ├──
|
48
|
-
│ ├── custom.coffee
|
49
|
-
│ ├── custom-remote.coffee
|
30
|
+
│ ├── custom.js
|
50
31
|
│ └── vendor
|
51
32
|
│ └── deck.js
|
52
33
|
│ ├── ...
|
@@ -65,9 +46,9 @@ The generator will concatenate all the files when the presentation is shown.
|
|
65
46
|
|
66
47
|
#### Special tags
|
67
48
|
|
68
|
-
`%snippet` is used to load a file from the `snippets` directory.
|
49
|
+
`%snippet` is used to load a file from the `snippets` directory.
|
69
50
|
|
70
|
-
`%asset` load a file from the `assets` directory. If the file is an image, an `img` will be created. If it is a CSS file (or SCSS), a `link` tag will be used. And, for JavaScript
|
51
|
+
`%asset` load a file from the `assets` directory. If the file is an image, an `img` will be created. If it is a CSS file (or SCSS), a `link` tag will be used. And, for JavaScript files, a `script` tag is used.
|
71
52
|
|
72
53
|
If type asset type can not be determined by the MIME type, a CSS class can be added to the `asset` tag to force the type. The class can be `image`, `style` or `javascript`
|
73
54
|
|
@@ -75,16 +56,10 @@ If the asset is something else, a link will be added with an anchor.
|
|
75
56
|
|
76
57
|
`%external` can be used to create link to external pages. The shown text is shorted to be less noisy.
|
77
58
|
|
78
|
-
#### Notes
|
79
|
-
|
80
|
-
Everything with the `note` CSS class will be removed from the slide. This content is accessible in the `remote` view.
|
81
|
-
|
82
59
|
## Assets
|
83
60
|
|
84
61
|
Every file from the `asset` directory is accessible from the `http://domain/asset/` URL.
|
85
62
|
|
86
|
-
If the file is a CoffeeScript source, it will be compiled as JavaScript before be sent. Same for SCSS.
|
87
|
-
|
88
63
|
## Example
|
89
64
|
|
90
65
|
With this files
|
@@ -92,7 +67,7 @@ With this files
|
|
92
67
|
```
|
93
68
|
/slide
|
94
69
|
├── assets
|
95
|
-
│ ├── hacks.
|
70
|
+
│ ├── hacks.js
|
96
71
|
└── first.png
|
97
72
|
└── snippets
|
98
73
|
└── README
|
@@ -102,7 +77,7 @@ We could write
|
|
102
77
|
|
103
78
|
```haml
|
104
79
|
|
105
|
-
%asset hacks.
|
80
|
+
%asset hacks.js
|
106
81
|
|
107
82
|
.slide
|
108
83
|
%h1 First slide
|
@@ -133,10 +108,6 @@ Some options are available with the `--help` flag.
|
|
133
108
|
With the defaults options the web server will listen on 9090, so the presentation can
|
134
109
|
be see at http://localhost:9090/
|
135
110
|
|
136
|
-
To control it from another browser go to http://localhost:9090/remote. The remote view
|
137
|
-
show the full slides, so you can see everything. Left and right keys can be used to move
|
138
|
-
the slide of the remote browser.
|
139
|
-
|
140
111
|
There is no need to restart the server if the content is changed. Everything will be regenerated
|
141
112
|
when reload the page in the browser. The HTML generated for the snippets is cached. The cached key
|
142
113
|
is the MD5 sum of the content.
|
data/highcarb.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.email = ["ayosec@gmail.com"]
|
11
11
|
s.homepage = "https://github.com/ayosec/highcarb"
|
12
12
|
s.summary = %q{Slides manager based on Deck.js }
|
13
|
-
s.description = %q{HighCarb can build a presentation based on HAML, Markdown or raw HTML
|
13
|
+
s.description = %q{HighCarb can build a presentation based on HAML, Markdown or raw HTML}
|
14
14
|
|
15
15
|
# Manifest
|
16
16
|
s.files = `git ls-files`.split("\n")
|
@@ -20,12 +20,11 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_runtime_dependency "thin"
|
22
22
|
s.add_runtime_dependency "mime-types"
|
23
|
-
s.add_runtime_dependency "em-websocket"
|
24
23
|
s.add_runtime_dependency "trollop"
|
25
24
|
s.add_runtime_dependency "nokogiri"
|
26
25
|
s.add_runtime_dependency "haml"
|
27
26
|
s.add_runtime_dependency "sass"
|
28
27
|
s.add_runtime_dependency "kramdown"
|
29
|
-
s.add_runtime_dependency "
|
28
|
+
s.add_runtime_dependency "rouge"
|
30
29
|
end
|
31
30
|
|
@@ -26,12 +26,6 @@ module HighCarb
|
|
26
26
|
mime_type = "text/css"
|
27
27
|
end
|
28
28
|
|
29
|
-
# Process CoffeeScript
|
30
|
-
if asset_path.extname == ".coffee"
|
31
|
-
output = CoffeeScript.compile(asset_path.read)
|
32
|
-
mime_type = "application/javascript"
|
33
|
-
end
|
34
|
-
|
35
29
|
if output == nil
|
36
30
|
mime_type = MIME::Types.type_for(asset_path.to_s).first || "application/octet-stream"
|
37
31
|
output = asset_path.read
|
data/lib/highcarb/command.rb
CHANGED
@@ -27,8 +27,6 @@ module HighCarb
|
|
27
27
|
opt "server", "Start the servers (default action). See --http-port and --ws-port"
|
28
28
|
|
29
29
|
opt "http-port", "HTTP server port", default: 9090
|
30
|
-
opt "ws-port", "WebSockets port", default: 9091
|
31
|
-
opt "ws", "Enable/Disable WebSockets", default: true
|
32
30
|
|
33
31
|
opt "skip-libs", "Don't download vendor libraries, like Deck.js and jQuery"
|
34
32
|
|
data/lib/highcarb/generator.rb
CHANGED
@@ -29,7 +29,6 @@ module HighCarb
|
|
29
29
|
|
30
30
|
create_file path.join("assets/README"),
|
31
31
|
"Put in this directory any file that you want to use in your presentation (images, et al)\n\n" +
|
32
|
-
"Files ending with .coffee will be compiled with CoffeeScript.\n" +
|
33
32
|
"Files ending with .scss will be compiled with SASS. Compass is available."
|
34
33
|
|
35
34
|
create_file path.join("assets/base.scss"),
|
@@ -47,12 +46,10 @@ module HighCarb
|
|
47
46
|
|
48
47
|
|
49
48
|
create_file path.join("assets/remote.scss"), "/* Add here your styles for the /remote view */"
|
50
|
-
create_file path.join("assets/custom
|
51
|
-
create_file path.join("assets/custom.coffee"), "# Add here your own code for the views"
|
49
|
+
create_file path.join("assets/custom.js"), "// Add here your own code for the views"
|
52
50
|
|
53
51
|
create_file path.join("snippets/README"),
|
54
52
|
"Put in this directory any snippet of code that you want to include in your presentation.\n" +
|
55
|
-
"You need to install Pygmentize if you want to format the code.\n" +
|
56
53
|
"The snippets are loaded with a <snippet>name.rb</snippet> tag.\n" +
|
57
54
|
"With Haml, you can use %snippet name.rb\n"
|
58
55
|
|
data/lib/highcarb/services.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
1
|
require "digest/md5"
|
3
2
|
require "nokogiri"
|
3
|
+
require "rouge"
|
4
4
|
|
5
5
|
module HighCarb
|
6
6
|
module SlidesController
|
@@ -76,18 +76,16 @@ module HighCarb
|
|
76
76
|
|
77
77
|
else
|
78
78
|
|
79
|
-
content =
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
79
|
+
content =
|
80
|
+
begin
|
81
|
+
formatter = Rouge::Formatters::HTMLInline.new(Rouge::Themes::Github)
|
82
|
+
lexer = Rouge::Lexer.guess_by_filename(snippet_name)
|
83
|
+
"<pre>" + formatter.format(lexer.lex(File.read(snippet_path))) + "</pre>"
|
84
|
+
rescue => e
|
85
|
+
STDERR.puts "\033[31mCould not render snippet #{snippet_name}: #{e}\033[m"
|
86
|
+
%[<pre class="raw-snippet">#{ERB::Util.h snippet_path.read}</pre>]
|
86
87
|
end
|
87
88
|
|
88
|
-
%[<pre class="raw-snippet">#{ERB::Util.h snippet_path.read}</pre>]
|
89
|
-
end
|
90
|
-
|
91
89
|
snippet_html_cached.dirname.mkpath
|
92
90
|
snippet_html_cached.open("w") {|f| f.write content }
|
93
91
|
content
|
@@ -112,7 +110,7 @@ module HighCarb
|
|
112
110
|
"image"
|
113
111
|
elsif mime_type.to_s == "text/css"
|
114
112
|
"style"
|
115
|
-
elsif mime_type.to_s == "application/javascript"
|
113
|
+
elsif mime_type.to_s == "application/javascript"
|
116
114
|
"javascript"
|
117
115
|
end
|
118
116
|
end
|
data/lib/highcarb/version.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
|
2
2
|
require "json"
|
3
|
-
require "coffee-script"
|
4
3
|
|
5
4
|
module HighCarb
|
6
5
|
module ViewsController
|
@@ -15,10 +14,6 @@ module HighCarb
|
|
15
14
|
@root = root
|
16
15
|
end
|
17
16
|
|
18
|
-
def load_coffe(source)
|
19
|
-
"<script>//<![CDATA[\n" + CoffeeScript.compile(root.join(source + ".coffee").read) + "\n//]]></script>"
|
20
|
-
end
|
21
|
-
|
22
17
|
def jquery_path
|
23
18
|
Dir.chdir(root) { Dir["assets/vendor/deck.js/jquery-*.js"].first }
|
24
19
|
end
|
data/resources/views/index.haml
CHANGED
@@ -14,9 +14,14 @@
|
|
14
14
|
%script{ src: "/assets/vendor/deck.js/extensions/status/deck.status.js" }
|
15
15
|
%script{ src: "/assets/vendor/deck.js/extensions/hash/deck.hash.js" }
|
16
16
|
|
17
|
+
%script{ src: "/assets/custom.js" }
|
18
|
+
|
17
19
|
:javascript
|
18
|
-
|
19
|
-
|
20
|
+
$(function() {
|
21
|
+
$.get("/slides", function(data) {
|
22
|
+
$(".slides").replaceWith(data);
|
23
|
+
$(".slides").find(".note").remove();
|
24
|
+
$.deck(".slide");
|
25
|
+
})
|
26
|
+
});
|
20
27
|
|
21
|
-
= load_coffe "index"
|
22
|
-
%script{ src: "/assets/custom.coffee" }
|
metadata
CHANGED
@@ -1,117 +1,128 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: highcarb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Ayose Cazorla
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2017-07-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: thin
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: mime-types
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - ">="
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: em-websocket
|
38
|
-
requirement: &22023340 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- -
|
38
|
+
- - ">="
|
42
39
|
- !ruby/object:Gem::Version
|
43
40
|
version: '0'
|
44
|
-
type: :runtime
|
45
|
-
prerelease: false
|
46
|
-
version_requirements: *22023340
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: trollop
|
49
|
-
requirement:
|
50
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
51
44
|
requirements:
|
52
|
-
- -
|
45
|
+
- - ">="
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: '0'
|
55
48
|
type: :runtime
|
56
49
|
prerelease: false
|
57
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
58
55
|
- !ruby/object:Gem::Dependency
|
59
56
|
name: nokogiri
|
60
|
-
requirement:
|
61
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
62
58
|
requirements:
|
63
|
-
- -
|
59
|
+
- - ">="
|
64
60
|
- !ruby/object:Gem::Version
|
65
61
|
version: '0'
|
66
62
|
type: :runtime
|
67
63
|
prerelease: false
|
68
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: haml
|
71
|
-
requirement:
|
72
|
-
none: false
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
73
72
|
requirements:
|
74
|
-
- -
|
73
|
+
- - ">="
|
75
74
|
- !ruby/object:Gem::Version
|
76
75
|
version: '0'
|
77
76
|
type: :runtime
|
78
77
|
prerelease: false
|
79
|
-
version_requirements:
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
80
83
|
- !ruby/object:Gem::Dependency
|
81
84
|
name: sass
|
82
|
-
requirement:
|
83
|
-
none: false
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
84
86
|
requirements:
|
85
|
-
- -
|
87
|
+
- - ">="
|
86
88
|
- !ruby/object:Gem::Version
|
87
89
|
version: '0'
|
88
90
|
type: :runtime
|
89
91
|
prerelease: false
|
90
|
-
version_requirements:
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
91
97
|
- !ruby/object:Gem::Dependency
|
92
98
|
name: kramdown
|
93
|
-
requirement:
|
94
|
-
none: false
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
95
100
|
requirements:
|
96
|
-
- -
|
101
|
+
- - ">="
|
97
102
|
- !ruby/object:Gem::Version
|
98
103
|
version: '0'
|
99
104
|
type: :runtime
|
100
105
|
prerelease: false
|
101
|
-
version_requirements:
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
102
111
|
- !ruby/object:Gem::Dependency
|
103
|
-
name:
|
104
|
-
requirement:
|
105
|
-
none: false
|
112
|
+
name: rouge
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
106
114
|
requirements:
|
107
|
-
- -
|
115
|
+
- - ">="
|
108
116
|
- !ruby/object:Gem::Version
|
109
117
|
version: '0'
|
110
118
|
type: :runtime
|
111
119
|
prerelease: false
|
112
|
-
version_requirements:
|
113
|
-
|
114
|
-
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: HighCarb can build a presentation based on HAML, Markdown or raw HTML
|
115
126
|
email:
|
116
127
|
- ayosec@gmail.com
|
117
128
|
executables:
|
@@ -119,8 +130,8 @@ executables:
|
|
119
130
|
extensions: []
|
120
131
|
extra_rdoc_files: []
|
121
132
|
files:
|
122
|
-
- .gitignore
|
123
|
-
- .rvmrc
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rvmrc"
|
124
135
|
- Gemfile
|
125
136
|
- Gemfile.lock
|
126
137
|
- README.md
|
@@ -133,35 +144,30 @@ files:
|
|
133
144
|
- lib/highcarb/rack_app.rb
|
134
145
|
- lib/highcarb/services.rb
|
135
146
|
- lib/highcarb/slides_controller.rb
|
136
|
-
- lib/highcarb/sockets.rb
|
137
147
|
- lib/highcarb/version.rb
|
138
148
|
- lib/highcarb/views_controller.rb
|
139
|
-
- resources/views/index.coffee
|
140
149
|
- resources/views/index.haml
|
141
|
-
- resources/views/remote.coffee
|
142
|
-
- resources/views/remote.haml
|
143
150
|
homepage: https://github.com/ayosec/highcarb
|
144
151
|
licenses: []
|
152
|
+
metadata: {}
|
145
153
|
post_install_message:
|
146
154
|
rdoc_options: []
|
147
155
|
require_paths:
|
148
156
|
- lib
|
149
157
|
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
158
|
requirements:
|
152
|
-
- -
|
159
|
+
- - ">="
|
153
160
|
- !ruby/object:Gem::Version
|
154
161
|
version: '0'
|
155
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
-
none: false
|
157
163
|
requirements:
|
158
|
-
- -
|
164
|
+
- - ">="
|
159
165
|
- !ruby/object:Gem::Version
|
160
166
|
version: '0'
|
161
167
|
requirements: []
|
162
168
|
rubyforge_project:
|
163
|
-
rubygems_version:
|
169
|
+
rubygems_version: 2.6.7
|
164
170
|
signing_key:
|
165
|
-
specification_version:
|
171
|
+
specification_version: 4
|
166
172
|
summary: Slides manager based on Deck.js
|
167
173
|
test_files: []
|
data/lib/highcarb/sockets.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
|
2
|
-
module HighCarb
|
3
|
-
class WSConnection
|
4
|
-
|
5
|
-
class <<self
|
6
|
-
attr_accessor :connected_clients
|
7
|
-
attr_accessor :last_client_id
|
8
|
-
end
|
9
|
-
|
10
|
-
self.connected_clients = []
|
11
|
-
self.last_client_id = 0
|
12
|
-
|
13
|
-
attr_reader :client_id
|
14
|
-
attr_reader :websocket
|
15
|
-
attr_reader :logger
|
16
|
-
|
17
|
-
def initialize(websocket, logger)
|
18
|
-
@logger = logger
|
19
|
-
@client_id = (self.class.last_client_id += 1)
|
20
|
-
|
21
|
-
@websocket = websocket
|
22
|
-
websocket.onopen &method(:on_open)
|
23
|
-
websocket.onclose &method(:on_close)
|
24
|
-
websocket.onmessage &method(:on_msg)
|
25
|
-
end
|
26
|
-
|
27
|
-
def on_open
|
28
|
-
logger.info { "[WS] Open client: #{client_id}" }
|
29
|
-
self.class.connected_clients << self
|
30
|
-
end
|
31
|
-
|
32
|
-
def on_close
|
33
|
-
logger.info { "[WS] Closed client: #{client_id}" }
|
34
|
-
self.class.connected_clients.delete self
|
35
|
-
end
|
36
|
-
|
37
|
-
def on_msg(msg)
|
38
|
-
logger.info { "[WS] Message from #{client_id}: #{msg}" }
|
39
|
-
|
40
|
-
self.class.connected_clients.each do |client|
|
41
|
-
if client != self
|
42
|
-
client.websocket.send msg
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
|
2
|
-
window.WebSocket = MozWebSocket if MozWebSocket?
|
3
|
-
|
4
|
-
$ ->
|
5
|
-
|
6
|
-
# Load slides and initialize Deck.js
|
7
|
-
$.get "/slides",
|
8
|
-
(data) ->
|
9
|
-
$(".slides").replaceWith data
|
10
|
-
$(".slides").find(".note").remove()
|
11
|
-
$.deck ".slide"
|
12
|
-
|
13
|
-
# Open a permanent connection to the server. With this channel
|
14
|
-
# we can receive commands to change the current slide
|
15
|
-
toJson = JSON.stringify
|
16
|
-
|
17
|
-
|
18
|
-
# Don't initialize the websocket if we don't have any URL
|
19
|
-
return unless EnableWebSocketsURL
|
20
|
-
|
21
|
-
|
22
|
-
channel = new WebSocket WebSocketsURL
|
23
|
-
channel.onmessage = (msgEvent) ->
|
24
|
-
msg = JSON.parse(msgEvent.data)
|
25
|
-
|
26
|
-
switch msg.action
|
27
|
-
when "next-slide" then $.deck('next')
|
28
|
-
when "prev-slide" then $.deck('prev')
|
29
|
-
when "go-to"
|
30
|
-
for slide, index in $.deck('getSlides')
|
31
|
-
if slide.data("slide-id") == msg.slideId
|
32
|
-
$.deck("go", index)
|
33
|
-
break
|
34
|
-
|
35
|
-
channel.onopen = ->
|
36
|
-
channel.send toJson(ack: true)
|
37
|
-
|
38
|
-
# Send a notification to every other client when the current slide has changed
|
39
|
-
lastSlideSelectedEvent = -1
|
40
|
-
$(document).bind 'deck.change', (event, from, to) ->
|
41
|
-
if lastSlideSelectedEvent != -1
|
42
|
-
clearTimeout lastSlideSelectedEvent
|
43
|
-
|
44
|
-
lastSlideSelectedEvent = \
|
45
|
-
setTimeout ->
|
46
|
-
lastSlideSelectedEvent = -1
|
47
|
-
channel.send toJson(action: "slide-selected", slideId: $.deck('getSlide').data("slide-id"))
|
48
|
-
100
|
@@ -1,59 +0,0 @@
|
|
1
|
-
|
2
|
-
window.WebSocket = MozWebSocket if MozWebSocket?
|
3
|
-
|
4
|
-
$ ->
|
5
|
-
# Don't initialize the websocket if we don't have any URL
|
6
|
-
return unless EnableWebSocketsURL
|
7
|
-
|
8
|
-
$(".slides").
|
9
|
-
load("/slides").
|
10
|
-
delegate(".slide", "click", (event) ->
|
11
|
-
node = event.target
|
12
|
-
while node
|
13
|
-
slideId = $(node).data("slide-id")
|
14
|
-
if slideId
|
15
|
-
event.preventDefault()
|
16
|
-
channel.send toJson(action: "go-to", slideId: slideId)
|
17
|
-
return false
|
18
|
-
|
19
|
-
node = node.parentNode
|
20
|
-
|
21
|
-
true
|
22
|
-
)
|
23
|
-
|
24
|
-
toJson = JSON.stringify
|
25
|
-
|
26
|
-
channel = new WebSocket WebSocketsURL
|
27
|
-
channel.onmessage = (msgEvent) ->
|
28
|
-
msg = JSON.parse(msgEvent.data)
|
29
|
-
|
30
|
-
# Set the remote-selected class to the new slide
|
31
|
-
$(".remote-selected").removeClass "remote-selected"
|
32
|
-
item = $(".slide[data-slide-id=#{msg.slideId}]").
|
33
|
-
addClass("remote-selected")
|
34
|
-
|
35
|
-
# Keep the selected item always in the center
|
36
|
-
offset = item.offset()
|
37
|
-
if offset
|
38
|
-
newTop = offset.top - ($(window).height() - item.height()) / 2
|
39
|
-
#$("html").scrollTop newTop
|
40
|
-
$("html").animate(scrollTop: newTop, 300)
|
41
|
-
|
42
|
-
channel.onopen = ->
|
43
|
-
channel.send toJson(ack: true)
|
44
|
-
|
45
|
-
# Send commands to the presenter
|
46
|
-
nextSlide = -> channel.send toJson(action: "next-slide")
|
47
|
-
prevSlide = -> channel.send toJson(action: "prev-slide")
|
48
|
-
$(".actions .next").click nextSlide
|
49
|
-
$(".actions .prev").click prevSlide
|
50
|
-
|
51
|
-
$(document).keypress (event) ->
|
52
|
-
switch(event.keyCode)
|
53
|
-
when 37 then prevSlide()
|
54
|
-
when 39 then nextSlide()
|
55
|
-
else return
|
56
|
-
|
57
|
-
event.preventDefault()
|
58
|
-
|
59
|
-
|
data/resources/views/remote.haml
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
!!! 5
|
2
|
-
%html
|
3
|
-
%head
|
4
|
-
%title Remote control
|
5
|
-
%script{ src: app.config["jquery"] }
|
6
|
-
%script{ src: "/assets/custom.coffee" }
|
7
|
-
%script{ src: "/assets/custom-remote.coffee" }
|
8
|
-
|
9
|
-
%style
|
10
|
-
:erb
|
11
|
-
body {
|
12
|
-
background: black;
|
13
|
-
color: white;
|
14
|
-
}
|
15
|
-
|
16
|
-
.slides > .slide {
|
17
|
-
background: white;
|
18
|
-
color: black;
|
19
|
-
border: 1px solid black;
|
20
|
-
padding: 1em;
|
21
|
-
margin: 1em;
|
22
|
-
}
|
23
|
-
|
24
|
-
.slide:hover {
|
25
|
-
cursor: pointer;
|
26
|
-
border: 1px solid black;
|
27
|
-
}
|
28
|
-
|
29
|
-
.remote-selected { background: #ffc !important; }
|
30
|
-
|
31
|
-
.actions {
|
32
|
-
position: fixed;
|
33
|
-
right: 1em;
|
34
|
-
top: 1em;
|
35
|
-
}
|
36
|
-
|
37
|
-
.actions span {
|
38
|
-
color: black;
|
39
|
-
background: gray;
|
40
|
-
display: inline-block;
|
41
|
-
font-size: 120%;
|
42
|
-
cursor: pointer;
|
43
|
-
margin: 0.1ex;
|
44
|
-
padding: 0.5ex;
|
45
|
-
}
|
46
|
-
|
47
|
-
%link{rel: "stylesheet", href: "/assets/remote.scss"}
|
48
|
-
|
49
|
-
%body.remote
|
50
|
-
.actions
|
51
|
-
%span.prev Prev
|
52
|
-
%span.next Next
|
53
|
-
|
54
|
-
.slides Loading ...
|
55
|
-
|
56
|
-
:javascript
|
57
|
-
window.EnableWebSocketsURL = #{!!options["ws"]};
|
58
|
-
window.WebSocketsURL = "ws://" + location.hostname + ":#{options["ws-port"].to_json}/";
|
59
|
-
|
60
|
-
= load_coffe "remote"
|
61
|
-
|