intranet-core 2.3.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76f13ef8a3ab5032152a1a6d5c4a94fca53f02a74492ae02fe3e0af354e06e2c
4
- data.tar.gz: ee7c7404de4b6c417ff25f1d39d94eef2adc8a482e0a9b1ed5f7817f6b62a5e8
3
+ metadata.gz: ba7fae26118e05ab115341089026cbbff79721a77bccb8412a6db8713c048d36
4
+ data.tar.gz: d759168cea8f4500321fec20e1bd555a54033e1ccebbcdb335596b1b55c5b211
5
5
  SHA512:
6
- metadata.gz: d5e60003e1e2071a6da97d46d54a116cafd4b66d171d98914f0fb6c88ebee962a700681e96dd5ffbfdf2799a49677148840c49443aa1e31d0c4085688678a0d2
7
- data.tar.gz: 2c40affb90abccfca11a0c38032f03f094c8fa9f907cf60cf1815a93a35c51b0736b9572bb4e249ed71462305e2a834ba245c73bb2aa387a7123f15dd17d7ee4
6
+ metadata.gz: 8c3c35cd768e6eed859d44343f40b93293ac3bd11f5b13cb9586e85cff96de7bef93a83774c5f2479397c15c16f2a3de0b571d3d5453454e847dbdff04ff4711
7
+ data.tar.gz: 7e26eb4903abd95964ae9ecf1f810d631043a92d32974ffbc81ee6ebf62c670b8427f65fb2feee6798899a18c542c40154acd26b7a77beecbe28a10cf23a40bc
@@ -37,30 +37,44 @@ module Intranet
37
37
  # nothing to do
38
38
  end
39
39
 
40
- # Generates the HTML content associated to the given +path+ and +query+.
40
+ # Generates the HTML answer (HTTP return code, MIME type and body) associated to the given
41
+ # +path+ and +query+.
42
+ #
43
+ # The function may return a partial content, in which case the HTTP return code must be 206 and
44
+ # the answer body is expected to be a +Hash+ with the following keys:
45
+ # * +:title+ (mandatory): the page title
46
+ # * +:content+ (mandatory): the partial content
47
+ # * +:stylesheets+ (optional): an array of the required Cascade Style Sheets (CSS) files, either
48
+ # absolute or relative to the module root
49
+ # * +:scripts+ (optional): an array of hashes, each representing a <script> element to be
50
+ # included in the generated page. Keys are the one accepted by the HTML <script> tag. The
51
+ # +:src+ key may be either absolute or relative to the module root
41
52
  # @param path [String] The requested URI, relative to that module root URI
42
53
  # @param query [Hash] The URI variable/value pairs, if any
43
- # @return [Array] The HTTP return code, the MIME type and the answer body.
54
+ # @return [Array<Integer, String, String> or Array<Integer, String, Hash>] The HTTP return code,
55
+ # the MIME type and the answer body (partial if return code is 206).
44
56
  def generate_page(path, query)
45
57
  [404, '', '']
46
58
  end
47
59
 
48
60
  # Provides the list of Cascade Style Sheets (CSS) dependencies for this module, either using
49
61
  # absolute or relative (from the module root) paths.
50
- # If redefined, this method should probably append dependencies rather than overwriting them.
62
+ # @deprecated Use {generate_page} partial content feature, setting +:stylesheets+ attribute of
63
+ # the returned body.
51
64
  # @return [Array] The list of CSS dependencies, as absolute path or relative to the module root
52
65
  # URL.
53
66
  def css_dependencies
54
- ['/design/style.css']
67
+ []
55
68
  end
56
69
 
57
70
  # Provides the list of Javascript files (JS) dependencies for this module, either using
58
71
  # absolute or relative (from the module root) paths.
59
- # If redefined, this method should probably append dependencies rather than overwriting them.
72
+ # @deprecated Use {generate_page} partial content feature, setting +:scripts+ attribute of the
73
+ # returned body.
60
74
  # @return [Array] The list of JS dependencies, as absolute path or relative to the module root
61
75
  # URL.
62
76
  def js_dependencies
63
- ['/design/nav.js']
77
+ []
64
78
  end
65
79
  end
66
80
  end
@@ -117,8 +117,9 @@ module Intranet
117
117
  # @param responder [Intranet::AbstractResponder] The responder that produced the body
118
118
  # @param path [String] The path to the responder
119
119
  def add_header_and_footer(body, responder, path)
120
- to_markup('skeleton', body: body, css: responder.css_dependencies,
121
- js: responder.js_dependencies, current_path: path)
120
+ body[:stylesheets] ||= responder.css_dependencies
121
+ body[:scripts] ||= responder.js_dependencies.map { |url| { src: url, defer: 'defer' } }
122
+ to_markup('skeleton', body: body, current_path: path)
122
123
  end
123
124
 
124
125
  # Check whether a path is valid. In particular, this function excludes a path containing an
@@ -6,7 +6,7 @@ module Intranet
6
6
  NAME = 'intranet-core'
7
7
 
8
8
  # The version of the gem, according to semantic versionning.
9
- VERSION = '2.3.3'
9
+ VERSION = '2.4.0'
10
10
 
11
11
  # The URL of the gem homepage.
12
12
  HOMEPAGE_URL = 'https://rubygems.org/gems/intranet-core'
@@ -4,23 +4,21 @@
4
4
  %title= Socket.gethostname.capitalize + ' | ' + body[:title]
5
5
  %meta{charset: 'utf-8'}
6
6
  %link{rel: 'icon', type: 'image/x-icon', href: '/design/favicon.ico'}
7
- - css.each do |url|
8
- - if url.start_with?('/')
9
- %link{rel: 'stylesheet', type: 'text/css', href: url}
10
- - else
11
- %link{rel: 'stylesheet', type: 'text/css', href: current_path + '/' + url}
12
- - js.each do |url|
13
- - if url.start_with?('/')
14
- %script{src: url, defer: 'defer'}
15
- - else
16
- %script{src: current_path + '/' + url, defer: 'defer'}
7
+ %link{rel: 'stylesheet', type: 'text/css', href: '/design/style.css'}
8
+ - body[:stylesheets].each do |url|
9
+ - url = current_path + '/' + url unless url.start_with?('/')
10
+ %link{rel: 'stylesheet', type: 'text/css', href: url}
11
+ %script{type: 'module', src: '/design/nav.js'}
12
+ - body[:scripts].each do |script|
13
+ - script[:src] = current_path + '/' + script[:src] unless script[:src].start_with?('/')
14
+ %script{script}
17
15
  %body
18
16
  %header
19
- %a{id: 'openmenu', onclick: 'openNavMenu();'}= '&#9776;'
17
+ %a{id: 'openmenu'}= '&#9776;'
20
18
  %h1
21
19
  %a{href: '/index.html', title: I18n.t('nav.back.home')}= Socket.gethostname.capitalize
22
20
  %nav
23
- %a{id: 'closemenu', onclick: 'closeNavMenu();'}= '&times;'
21
+ %a{id: 'closemenu'}= '&times;'
24
22
  %ul
25
23
  - responders.children_nodes.each do |path, node|
26
24
  - if node.children?
@@ -48,7 +46,7 @@
48
46
  = ' ' + I18n.t('nav.generated.on_date') + ' ' + Time.now.strftime(I18n.t('date_format'))
49
47
  = ' ' + I18n.t('date_time_separator') + Time.now.strftime(I18n.t('time_format'))
50
48
  %br
51
- %a{onclick: 'openModal();'}= I18n.t('nav.about')
49
+ %a{id: 'openmodal'}= I18n.t('nav.about')
52
50
  %aside#modal
53
51
  %div#modal-content
54
52
  %h2= 'Intranet'
@@ -4,23 +4,13 @@
4
4
  * and for the modal box.
5
5
  */
6
6
 
7
+ const openMenu = document.getElementById('openmenu');
8
+ const closeMenu = document.getElementById('closemenu');
9
+ const navMenu = document.querySelectorAll('header nav')[0];
10
+ openMenu.addEventListener('click', function() { navMenu.style.width = 'auto'; });
11
+ closeMenu.addEventListener('click', function() { navMenu.style.width = ''; });
7
12
 
8
- function openNavMenu() {
9
- document.querySelectorAll('header nav')[0].style.width = 'auto';
10
- }
11
-
12
- function closeNavMenu() {
13
- /* Remove value property set in openNavMenu() */
14
- document.querySelectorAll('header nav')[0].style.width = '';
15
- }
16
-
17
- function openModal() {
18
- document.getElementById('modal').style.display = 'block';
19
- }
20
-
21
- window.onclick = function(event) {
22
- if (event.target == document.getElementById('modal')) {
23
- document.getElementById('modal').style.display = 'none';
24
- }
25
- }
26
-
13
+ const openModal = document.getElementById('openmodal');
14
+ const modal = document.getElementById('modal');
15
+ openModal.addEventListener('click', function() { modal.style.display = 'block'; });
16
+ modal.addEventListener('click', function() { modal.style.display = 'none'; });
@@ -244,13 +244,21 @@ RSpec.describe Intranet::Core do
244
244
  it 'should be called to retrieve the body of the page' do
245
245
  @intranet = described_class.new(Intranet::Logger.new(Intranet::Logger::FATAL))
246
246
 
247
- responder = Intranet::TestResponder.new(
248
- {
249
- '/index.html' => [206, 'text/html', { content: 'PARTIAL_CONTENT', title: 'MyTitle' }]
250
- },
251
- ['/responder.css', 'nav.css'],
252
- ['module.js', '/js/interactive.js']
253
- )
247
+ responder = Intranet::TestResponder.new({
248
+ '/index.html' => [
249
+ 206,
250
+ 'text/html',
251
+ {
252
+ content: 'PARTIAL_CONTENT',
253
+ title: 'MyTitle',
254
+ stylesheets: ['/resp.css', 'nav.css'],
255
+ scripts: [
256
+ { src: 'module.js', type: 'module' },
257
+ { src: '/js/interactive.js', defer: 'defer' }
258
+ ]
259
+ }
260
+ ]
261
+ })
254
262
  @intranet.register_module(responder, ['r'], responder.resources_dir)
255
263
 
256
264
  thread = Thread.new { @intranet.start }
@@ -280,11 +288,11 @@ RSpec.describe Intranet::Core do
280
288
  expect(html).to match(%r{<footer>.*#{hostname}.*</footer>}m)
281
289
 
282
290
  # Returned HTML document: includes all CSS dependencies, relative or absolute path
283
- expect(html).to match(%r{<link href='/responder.css' rel='stylesheet' type='text/css'})
291
+ expect(html).to match(%r{<link href='/resp.css' rel='stylesheet' type='text/css'})
284
292
  expect(html).to match(%r{<link href='/r/nav.css' rel='stylesheet' type='text/css'})
285
293
 
286
294
  # Returned HTML document: includes all JS dependencies
287
- expect(html).to match(%r{<script defer='defer' src='/r/module.js'></script>})
295
+ expect(html).to match(%r{<script src='/r/module.js' type='module'></script>})
288
296
  expect(html).to match(%r{<script defer='defer' src='/js/interactive.js'></script>})
289
297
 
290
298
  # Returned HTML document: includes Intranet Core name, version and URL
@@ -306,7 +314,7 @@ RSpec.describe Intranet::Core do
306
314
  responder = Intranet::TestResponder.new(
307
315
  '/index.html' => [206, 'text/html', { content: 'PARTIAL_CONTENT', title: 'MyTitle' }]
308
316
  )
309
- other_responder = Intranet::TestResponder.new({}, [], [], true)
317
+ other_responder = Intranet::TestResponder.new({}, true)
310
318
  @intranet.register_module(responder, %w[r], responder.resources_dir)
311
319
  @intranet.register_module(responder, %w[dep_th1], responder.resources_dir)
312
320
  @intranet.register_module(responder, %w[depth2 res_p1], responder.resources_dir)
@@ -6,10 +6,8 @@ module Intranet
6
6
  class TestResponder < AbstractResponder
7
7
  attr_reader :finalized
8
8
 
9
- def initialize(responses = {}, extra_css = [], extra_js = [], hide_from_menu = false) # rubocop:disable Metrics/ParameterLists
9
+ def initialize(responses = {}, hide_from_menu = false)
10
10
  @responses = responses
11
- @extra_css = extra_css
12
- @extra_js = extra_js
13
11
  @finalized = false
14
12
  @hide_from_menu = hide_from_menu
15
13
  end
@@ -47,14 +45,6 @@ module Intranet
47
45
  super(path, query)
48
46
  end
49
47
 
50
- def css_dependencies
51
- super + @extra_css
52
- end
53
-
54
- def js_dependencies
55
- super + @extra_js
56
- end
57
-
58
48
  private
59
49
 
60
50
  def dump_with_encoding(path, query)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: intranet-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ebling Mis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-30 00:00:00.000000000 Z
11
+ date: 2021-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: haml
@@ -211,8 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
211
  - !ruby/object:Gem::Version
212
212
  version: '0'
213
213
  requirements: []
214
- rubyforge_project:
215
- rubygems_version: 2.7.6.2
214
+ rubygems_version: 3.2.5
216
215
  signing_key:
217
216
  specification_version: 4
218
217
  summary: Core component to build a custom intranet.