trmnl_preview 0.3.1 → 0.4.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/README.md +55 -21
  4. data/bin/trmnlp +14 -0
  5. data/lib/trmnlp/api_client.rb +62 -0
  6. data/lib/trmnlp/app.rb +98 -0
  7. data/lib/trmnlp/cli.rb +51 -0
  8. data/lib/trmnlp/commands/base.rb +23 -0
  9. data/lib/trmnlp/commands/build.rb +22 -0
  10. data/lib/trmnlp/commands/login.rb +25 -0
  11. data/lib/trmnlp/commands/pull.rb +45 -0
  12. data/lib/trmnlp/commands/push.rb +43 -0
  13. data/lib/trmnlp/commands/serve.rb +25 -0
  14. data/lib/trmnlp/commands.rb +1 -0
  15. data/lib/trmnlp/config/app.rb +39 -0
  16. data/lib/trmnlp/config/plugin.rb +74 -0
  17. data/lib/trmnlp/config/project.rb +47 -0
  18. data/lib/trmnlp/config.rb +15 -0
  19. data/lib/trmnlp/context.rb +211 -0
  20. data/lib/trmnlp/custom_filters.rb +14 -0
  21. data/lib/trmnlp/paths.rb +50 -0
  22. data/lib/trmnlp/screen_generator.rb +137 -0
  23. data/lib/trmnlp/version.rb +5 -0
  24. data/lib/trmnlp.rb +13 -0
  25. data/trmnl_preview.gemspec +32 -14
  26. data/web/public/index.css +98 -0
  27. data/web/public/index.js +75 -0
  28. data/web/views/index.erb +15 -80
  29. data/web/views/{render_view.erb → render_html.erb} +1 -6
  30. metadata +148 -26
  31. data/.ruby-version +0 -1
  32. data/config.example.toml +0 -14
  33. data/docs/preview.png +0 -0
  34. data/exe/trmnlp +0 -12
  35. data/lib/trmnl_preview/app.rb +0 -78
  36. data/lib/trmnl_preview/cmd/build.rb +0 -25
  37. data/lib/trmnl_preview/cmd/serve.rb +0 -31
  38. data/lib/trmnl_preview/cmd/usage.rb +0 -10
  39. data/lib/trmnl_preview/context.rb +0 -129
  40. data/lib/trmnl_preview/liquid_filters.rb +0 -8
  41. data/lib/trmnl_preview/version.rb +0 -5
  42. data/lib/trmnl_preview.rb +0 -10
  43. data/web/public/live-render.js +0 -23
@@ -0,0 +1,98 @@
1
+ body {
2
+ font-family: sans-serif;
3
+ margin: 10px;
4
+ }
5
+
6
+ main {
7
+ display: flex;
8
+ flex-direction: column;
9
+ width: fit-content;
10
+ }
11
+
12
+ menu {
13
+ padding: 0;
14
+ margin: 0;
15
+ display: flex;
16
+ justify-content: space-between;
17
+ }
18
+
19
+ menu a {
20
+ padding: 0.5em 1em;
21
+ background: #ddd;
22
+ border-radius: 0.5em;
23
+ display: inline-block;
24
+ text-decoration: none;
25
+ color: black;
26
+ }
27
+
28
+ menu a:hover {
29
+ background: #ccc;
30
+ }
31
+
32
+ menu a.active {
33
+ background: #333;
34
+ color: white;
35
+ }
36
+
37
+ .case {
38
+ width: 1000px;
39
+ height: 680px;
40
+ position: relative;
41
+ }
42
+
43
+ iframe {
44
+ position: absolute;
45
+ border: none;
46
+ left: 98px;
47
+ top: 65px;
48
+ filter: grayscale(100%);
49
+ }
50
+
51
+ .case .case-overlay {
52
+ position: absolute;
53
+ width: 100%;
54
+ height: 100%;
55
+ top: 0;
56
+ left: 0;
57
+ background-size: cover;
58
+ mix-blend-mode: multiply;
59
+ pointer-events: none;
60
+ }
61
+
62
+ .case--none .case-overlay {
63
+ background: none;
64
+ }
65
+
66
+ .case--white .case-overlay {
67
+ background-image: url("white-case.jpg");
68
+ }
69
+
70
+ .case--black .case-overlay {
71
+ background-image: url("black-case.jpg");
72
+ }
73
+
74
+ .case--clear .case-overlay {
75
+ background-image: url("clear-case.jpg");
76
+ }
77
+
78
+ .case--none iframe {
79
+ border: 1px solid black;
80
+ }
81
+
82
+ .spinner {
83
+ width: 22px;
84
+ height: 22px;
85
+ border: 5px solid #f3f3f3; /* Light gray */
86
+ border-top: 5px solid #3498db; /* Blue */
87
+ border-radius: 50%;
88
+ animation: spin 1s linear infinite;
89
+ }
90
+
91
+ @keyframes spin {
92
+ 0% {
93
+ transform: rotate(0deg);
94
+ }
95
+ 100% {
96
+ transform: rotate(360deg);
97
+ }
98
+ }
@@ -0,0 +1,75 @@
1
+ const trmnlp = {};
2
+
3
+ trmnlp.connectLiveRender = function () {
4
+ const ws = new WebSocket("/live_reload");
5
+
6
+ ws.onopen = function () {
7
+ console.log("Connected to live reload socket");
8
+ };
9
+
10
+ ws.onmessage = function (msg) {
11
+ const payload = JSON.parse(msg.data);
12
+
13
+ if (payload.type === "reload") {
14
+ trmnlp.setIframeSrc(trmnlp.iframe.src);
15
+ trmnlp.userData.textContent = JSON.stringify(payload.user_data, null, 2);
16
+ }
17
+ };
18
+
19
+ ws.onclose = function () {
20
+ console.log("Reconnecting to live reload socket...");
21
+ setTimeout(trmnlp.connectLiveRender, 1000);
22
+ };
23
+ };
24
+
25
+ trmnlp.setCaseImage = function () {
26
+ const value = trmnlp.caseSelect.value;
27
+ document.querySelector(".case").className = `case case--${value}`;
28
+ localStorage.setItem("trmnlp-case", value);
29
+ };
30
+
31
+ trmnlp.setPreviewFormat = function () {
32
+ const value = trmnlp.formatSelect.value;
33
+ localStorage.setItem("trmnlp-format", value);
34
+
35
+ trmnlp.setIframeSrc(`/render/${trmnlp.view}.${value}`);
36
+ };
37
+
38
+ trmnlp.setIframeSrc = function (src) {
39
+ document.querySelector(".spinner").style.display = "inline-block";
40
+ trmnlp.iframe.src = src;
41
+ };
42
+
43
+ document.addEventListener("DOMContentLoaded", function () {
44
+ trmnlp.view = document.querySelector("meta[name='trmnl-view']").content;
45
+ trmnlp.iframe = document.querySelector("iframe");
46
+ trmnlp.caseSelect = document.querySelector(".select-case");
47
+ trmnlp.formatSelect = document.querySelector(".select-format");
48
+ trmnlp.userData = document.getElementById("user-data");
49
+ trmnlp.isLiveReloadEnabled =
50
+ document.querySelector("meta[name='live-reload']").content === "true";
51
+
52
+ if (trmnlp.isLiveReloadEnabled) {
53
+ trmnlp.connectLiveRender();
54
+ }
55
+
56
+ const caseValue = localStorage.getItem("trmnlp-case") || "black";
57
+ const formatValue = localStorage.getItem("trmnlp-format") || "html";
58
+
59
+ trmnlp.caseSelect.value = caseValue;
60
+ trmnlp.caseSelect.addEventListener("change", () => {
61
+ trmnlp.setCaseImage();
62
+ });
63
+
64
+ trmnlp.formatSelect.value = formatValue;
65
+ trmnlp.formatSelect.addEventListener("change", () => {
66
+ trmnlp.setPreviewFormat();
67
+ });
68
+
69
+ trmnlp.iframe.addEventListener("load", () => {
70
+ document.querySelector(".spinner").style.display = "none";
71
+ });
72
+
73
+ trmnlp.setCaseImage();
74
+ trmnlp.setPreviewFormat();
75
+ });
data/web/views/index.erb CHANGED
@@ -3,85 +3,13 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="trmnl-view" content="<%= @view %>">
7
+ <meta name="live-reload" content="<%= @live_reload %>">
8
+
6
9
  <title>TRMNL Preview</title>
7
- <style>
8
- body {
9
- font-family: sans-serif;
10
- margin: 10px;
11
- }
12
- main {
13
- display: flex;
14
- flex-direction: column;
15
- width: fit-content;
16
- }
17
- menu {
18
- padding: 0;
19
- margin: 0;
20
- display: flex;
21
- justify-content: space-between;
22
- }
23
- menu a {
24
- padding: 0.5em 1em;
25
- background: #ddd;
26
- border-radius: 0.5em;
27
- display: inline-block;
28
- text-decoration: none;
29
- color: black;
30
- }
31
- menu a:hover {
32
- background: #ccc;
33
- }
34
- menu a.active {
35
- background: #333;
36
- color: white;
37
- }
38
- .case {
39
- width: 1000px;
40
- height: 680px;
41
- position: relative;
42
- }
43
- iframe {
44
- position: absolute;
45
- border: none;
46
- left: 98px;
47
- top: 65px;
48
- filter: grayscale(100%);
49
- }
50
- .case .case-overlay {
51
- position: absolute;
52
- width: 100%;
53
- height: 100%;
54
- top: 0;
55
- left: 0;
56
- background-size: cover;
57
- mix-blend-mode: multiply;
58
- pointer-events: none;
59
- }
60
- .case--none .case-overlay { background: none; }
61
- .case--white .case-overlay { background-image: url('white-case.jpg') }
62
- .case--black .case-overlay { background-image: url('black-case.jpg') }
63
- .case--clear .case-overlay { background-image: url('clear-case.jpg') }
64
- .case--none iframe {
65
- border: 1px solid black;
66
- }
67
- </style>
68
- <script>
69
- function updateCase() {
70
- const value = document.querySelector('.select-case').value;
71
- document.querySelector('.case').className = `case case--${value}`;
72
- localStorage.setItem('trmnlp-case', value);
73
- }
74
-
75
- document.addEventListener('DOMContentLoaded', () => {
76
- const caseValue = localStorage.getItem('trmnlp-case') || 'black';
77
-
78
- const select = document.querySelector('.select-case');
79
- select.value = caseValue;
80
- select.addEventListener('change', () => { updateCase() });
81
-
82
- updateCase();
83
- });
84
- </script>
10
+
11
+ <link rel="stylesheet" href="/index.css">
12
+ <script src="/index.js"></script>
85
13
  </head>
86
14
  <body>
87
15
  <main>
@@ -92,7 +20,12 @@
92
20
  <a class="<%= 'active' if @view == 'half_vertical' %>" href="/half_vertical">Half Vertical</a>
93
21
  <a class="<%= 'active' if @view == 'quadrant' %>" href="/quadrant">Quadrant</a>
94
22
  </div>
95
- <div>
23
+ <div style="display: flex; gap: 0.3em;">
24
+ <div class="spinner" style="display: none;"></div>
25
+ <select class="select-format">
26
+ <option value="bmp">BMP</option>
27
+ <option value="html" selected>HTML</option>
28
+ </select>
96
29
  <select class="select-case">
97
30
  <option value="none">None</option>
98
31
  <option value="white">White</option>
@@ -105,9 +38,11 @@
105
38
  </menu>
106
39
 
107
40
  <div class="case case--black">
108
- <iframe src="/render/<%= @view %>" width="800" height="480"></iframe>
41
+ <iframe width="800" height="480"></iframe>
109
42
  <div class="case-overlay"></div>
110
43
  </div>
44
+
45
+ <pre id="user-data"><%= @user_data %></pre>
111
46
  </main>
112
47
  </body>
113
48
  </html>
@@ -9,14 +9,9 @@
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap" rel="stylesheet">
11
11
  <!-- End Inter font -->
12
-
13
- <% if @live_render %>
14
- <meta name="trmnl-view" content="<%= @view %>">
15
- <script src="/live-render.js"></script>
16
- <% end %>
17
12
  </head>
18
13
  <body class="environment trmnl">
19
- <div class="screen">
14
+ <div class="<%= @screen_classes %>">
20
15
  <div class="view view--<%= @view %>">
21
16
  <%= yield %>
22
17
  </div>
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trmnl_preview
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rockwell Schrock
8
- bindir: exe
8
+ bindir: bin
9
9
  cert_chain: []
10
- date: 2025-01-06 00:00:00.000000000 Z
10
+ date: 2025-04-09 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: sinatra
@@ -51,6 +51,20 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '6.5'
54
+ - !ruby/object:Gem::Dependency
55
+ name: faye-websocket
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.11.3
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 0.11.3
54
68
  - !ruby/object:Gem::Dependency
55
69
  name: liquid
56
70
  requirement: !ruby/object:Gem::Requirement
@@ -66,19 +80,61 @@ dependencies:
66
80
  - !ruby/object:Gem::Version
67
81
  version: '5.6'
68
82
  - !ruby/object:Gem::Dependency
69
- name: toml-rb
83
+ name: activesupport
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '8.0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '8.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: ferrum
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.16'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.16'
110
+ - !ruby/object:Gem::Dependency
111
+ name: puppeteer-ruby
70
112
  requirement: !ruby/object:Gem::Requirement
71
113
  requirements:
72
114
  - - "~>"
73
115
  - !ruby/object:Gem::Version
74
- version: '3.0'
116
+ version: 0.45.6
75
117
  type: :runtime
76
118
  prerelease: false
77
119
  version_requirements: !ruby/object:Gem::Requirement
78
120
  requirements:
79
121
  - - "~>"
80
122
  - !ruby/object:Gem::Version
81
- version: '3.0'
123
+ version: 0.45.6
124
+ - !ruby/object:Gem::Dependency
125
+ name: mini_magick
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: 4.12.0
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 4.12.0
82
138
  - !ruby/object:Gem::Dependency
83
139
  name: filewatcher
84
140
  requirement: !ruby/object:Gem::Requirement
@@ -94,19 +150,75 @@ dependencies:
94
150
  - !ruby/object:Gem::Version
95
151
  version: '2.1'
96
152
  - !ruby/object:Gem::Dependency
97
- name: faye-websocket
153
+ name: faraday
98
154
  requirement: !ruby/object:Gem::Requirement
99
155
  requirements:
100
156
  - - "~>"
101
157
  - !ruby/object:Gem::Version
102
- version: 0.11.3
158
+ version: '2.1'
103
159
  type: :runtime
104
160
  prerelease: false
105
161
  version_requirements: !ruby/object:Gem::Requirement
106
162
  requirements:
107
163
  - - "~>"
108
164
  - !ruby/object:Gem::Version
109
- version: 0.11.3
165
+ version: '2.1'
166
+ - !ruby/object:Gem::Dependency
167
+ name: faraday-multipart
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.1'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '1.1'
180
+ - !ruby/object:Gem::Dependency
181
+ name: xdg
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '9.1'
187
+ type: :runtime
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '9.1'
194
+ - !ruby/object:Gem::Dependency
195
+ name: rubyzip
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: 2.3.0
201
+ type: :runtime
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: 2.3.0
208
+ - !ruby/object:Gem::Dependency
209
+ name: thor
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '1.3'
215
+ type: :runtime
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.3'
110
222
  description: Automatically rebuild and preview TRNML plugins in multiple views
111
223
  email:
112
224
  - rockwell@schrock.me
@@ -115,35 +227,45 @@ executables:
115
227
  extensions: []
116
228
  extra_rdoc_files: []
117
229
  files:
118
- - ".ruby-version"
119
230
  - CHANGELOG.md
120
231
  - LICENSE.txt
121
232
  - README.md
122
- - config.example.toml
123
- - docs/preview.png
124
- - exe/trmnlp
125
- - lib/trmnl_preview.rb
126
- - lib/trmnl_preview/app.rb
127
- - lib/trmnl_preview/cmd/build.rb
128
- - lib/trmnl_preview/cmd/serve.rb
129
- - lib/trmnl_preview/cmd/usage.rb
130
- - lib/trmnl_preview/context.rb
131
- - lib/trmnl_preview/liquid_filters.rb
132
- - lib/trmnl_preview/version.rb
233
+ - bin/trmnlp
234
+ - lib/trmnlp.rb
235
+ - lib/trmnlp/api_client.rb
236
+ - lib/trmnlp/app.rb
237
+ - lib/trmnlp/cli.rb
238
+ - lib/trmnlp/commands.rb
239
+ - lib/trmnlp/commands/base.rb
240
+ - lib/trmnlp/commands/build.rb
241
+ - lib/trmnlp/commands/login.rb
242
+ - lib/trmnlp/commands/pull.rb
243
+ - lib/trmnlp/commands/push.rb
244
+ - lib/trmnlp/commands/serve.rb
245
+ - lib/trmnlp/config.rb
246
+ - lib/trmnlp/config/app.rb
247
+ - lib/trmnlp/config/plugin.rb
248
+ - lib/trmnlp/config/project.rb
249
+ - lib/trmnlp/context.rb
250
+ - lib/trmnlp/custom_filters.rb
251
+ - lib/trmnlp/paths.rb
252
+ - lib/trmnlp/screen_generator.rb
253
+ - lib/trmnlp/version.rb
133
254
  - trmnl_preview.gemspec
134
255
  - web/public/black-case.jpg
135
256
  - web/public/clear-case.jpg
136
- - web/public/live-render.js
257
+ - web/public/index.css
258
+ - web/public/index.js
137
259
  - web/public/white-case.jpg
138
260
  - web/views/index.erb
139
- - web/views/render_view.erb
140
- homepage: https://github.com/schrockwell/trmnl_preview
261
+ - web/views/render_html.erb
262
+ homepage: https://github.com/usetrmnl/trmnlp
141
263
  licenses:
142
264
  - MIT
143
265
  metadata:
144
266
  allowed_push_host: https://rubygems.org
145
- homepage_uri: https://github.com/schrockwell/trmnl_preview
146
- source_code_uri: https://github.com/schrockwell/trmnl_preview
267
+ homepage_uri: https://github.com/usetrmnl/trmnlp
268
+ source_code_uri: https://github.com/usetrmnl/trmnlp
147
269
  rdoc_options: []
148
270
  require_paths:
149
271
  - lib
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 3.4.1
data/config.example.toml DELETED
@@ -1,14 +0,0 @@
1
- # strategy = "polling" ==> the data will be fetched once, at server start-up
2
- # strategy = "webhook" ==> POST new data to /webhook
3
- strategy = "polling"
4
-
5
- # Poll URL (required for polling strategy)
6
- url = "https://example.com/data.json"
7
-
8
- # Automatically re-render the view when Liquid templates change (default: true)
9
- live_render = true
10
-
11
- # Polling headers (optional, for polling strategy)
12
- [polling_headers]
13
- authorization = "bearer 123"
14
- content-type = "application/json"
data/docs/preview.png DELETED
Binary file
data/exe/trmnlp DELETED
@@ -1,12 +0,0 @@
1
- #! /usr/bin/env ruby
2
-
3
- require_relative '../lib/trmnl_preview'
4
-
5
- case ARGV[0].to_s.downcase
6
- when 'serve'
7
- require_relative '../lib/trmnl_preview/cmd/serve'
8
- when 'build'
9
- require_relative '../lib/trmnl_preview/cmd/build'
10
- else
11
- require_relative '../lib/trmnl_preview/cmd/usage'
12
- end
@@ -1,78 +0,0 @@
1
-
2
- require 'faye/websocket'
3
- require 'sinatra'
4
- require 'sinatra/base'
5
-
6
- require_relative 'context'
7
-
8
- module TRMNLPreview
9
- class App < Sinatra::Base
10
- # Sinatra settings
11
- set :views, File.join(File.dirname(__FILE__), '..', '..', 'web', 'views')
12
- set :public_folder, File.join(File.dirname(__FILE__), '..', '..', 'web', 'public')
13
-
14
- def initialize(*args)
15
- super
16
-
17
- begin
18
- @context = Context.new(settings.user_dir)
19
- rescue StandardError => e
20
- puts e.message
21
- exit 1
22
- end
23
-
24
- @context.poll_data if @context.strategy == 'polling'
25
-
26
- @live_render_clients = VIEWS.each_with_object({}) { |view, hash| hash[view] = [] }
27
- @context.on_view_change do |view|
28
- @live_render_clients[view].each do |ws|
29
- ws.send(@context.render_template(view))
30
- end
31
- end
32
- end
33
-
34
- post '/webhook' do
35
- @context.set_data(request.body.read)
36
- "OK"
37
- end
38
-
39
- get '/' do
40
- redirect '/full'
41
- end
42
-
43
- get '/live_render/:view' do
44
- ws = Faye::WebSocket.new(request.env)
45
- view = params['view']
46
-
47
- ws.on(:open) do |event|
48
- @live_render_clients[view] << ws
49
- end
50
-
51
- ws.on(:close) do |event|
52
- @live_render_clients[view].delete(ws)
53
- end
54
-
55
- ws.rack_response
56
- end
57
-
58
- get '/poll' do
59
- @context.poll_data
60
- redirect back
61
- end
62
-
63
- VIEWS.each do |view|
64
- get "/#{view}" do
65
- @view = view
66
- erb :index
67
- end
68
-
69
- get "/render/#{view}" do
70
- @view = view
71
- @live_render = @context.live_render
72
- erb :render_view do
73
- @context.render_template(view)
74
- end
75
- end
76
- end
77
- end
78
- end
@@ -1,25 +0,0 @@
1
- require 'optionparser'
2
-
3
- require_relative '../context'
4
-
5
- OptionParser.new do |opts|
6
- opts.banner = "Usage: trmnlp build [directory]"
7
- end.parse!
8
-
9
- root = ARGV[1] || Dir.pwd
10
- begin
11
- context = TRMNLPreview::Context.new(root)
12
- rescue StandardError => e
13
- puts e.message
14
- exit 1
15
- end
16
-
17
- context.poll_data
18
-
19
- TRMNLPreview::VIEWS.each do |view|
20
- output_path = File.join(context.temp_dir, "#{view}.html")
21
- puts "Creating #{output_path}..."
22
- File.write(output_path, context.render_full_page(view))
23
- end
24
-
25
- puts "Done!"