Class: Scriptorium::Widget::Pages

Inherits:
ListWidget show all
Includes:
Contract
Defined in:
lib/scriptorium/widgets/pages.rb

Constant Summary collapse

Title =
"Pages"

Instance Attribute Summary collapse

Attributes inherited from Scriptorium::Widget

#config, #name, #path, #repo, #view

Instance Method Summary collapse

Methods included from Contract

#assume, #check_invariants, enabled?, #invariant, #verify

Methods inherited from ListWidget

#load_data

Methods inherited from Scriptorium::Widget

#html_body, #html_card, #html_container

Methods included from Helpers

#cf_time, #change_config, #clean_slugify, #copy_gem_asset_to_user, #copy_to_clipboard, #d4, #escape_html, #generate_missing_asset_svg, #get_asset_path, #get_from_clipboard, #getvars, #list_gem_assets, #make_dir, #make_tree, #need, #read_commented_file, #read_file, #see, #see_file, #slugify, #substitute, #system!, #view_dir, #write_file, #write_file!, #ymdhms

Methods included from Exceptions

#make_exception

Constructor Details

#initialize(repo, view) ⇒ Pages

Returns a new instance of Pages.



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/scriptorium/widgets/pages.rb', line 14

def initialize(repo, view)
  assume { repo.is_a?(Scriptorium::Repo) }
  assume { view.is_a?(Scriptorium::View) }
  
  super(repo, view)
  @pages_dir = "#{@view.dir}/pages"
  
  define_invariants
  verify { @pages_dir.include?("pages") }
  check_invariants
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



5
6
7
# File 'lib/scriptorium/widgets/pages.rb', line 5

def data
  @data
end

Instance Method Details

#cardObject



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/scriptorium/widgets/pages.rb', line 53

def card
  check_invariants
  assume { @view.is_a?(Scriptorium::View) }
  assume { @name.is_a?(String) && !@name.empty? }
  
  file = "#{@view.dir}/widgets/#@name/#@name-card.html"
  result = read_file(file)
  
  verify { result.is_a?(String) }
  check_invariants
  result
end

#define_invariantsObject

Invariants



8
9
10
11
12
# File 'lib/scriptorium/widgets/pages.rb', line 8

def define_invariants
  invariant { @pages_dir.is_a?(String) && !@pages_dir.empty? }
  invariant { @data.is_a?(Array) }
  invariant { Title.is_a?(String) && !Title.empty? }
end

#extract_title_from_html(html_content) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/scriptorium/widgets/pages.rb', line 72

def extract_title_from_html(html_content)
  check_invariants
  assume { html_content.is_a?(String) }
  
  # Try to extract title from <title> tag first
  if match = html_content.match(/<title[^>]*>(.*?)<\/title>/i)
    result = match[1].strip
  elsif match = html_content.match(/<h1[^>]*>(.*?)<\/h1>/i)
    # Fall back to first <h1> tag
    result = match[1].strip
  else
    # Last resort: use filename
    result = "Untitled"
  end
  
  verify { result.is_a?(String) && !result.empty? }
  check_invariants
  result
end

#generateObject



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/scriptorium/widgets/pages.rb', line 32

def generate
  check_invariants
  assume { @view.is_a?(Scriptorium::View) }
  
  write_main
  write_card
  result = true
  
  verify { result == true }
  check_invariants
  result
end

#load_configObject



26
27
28
29
30
# File 'lib/scriptorium/widgets/pages.rb', line 26

def load_config
  check_invariants
  # No configuration needed for this widget
  check_invariants
end

#page_item(filename, title) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/scriptorium/widgets/pages.rb', line 92

def page_item(filename, title)
  check_invariants
  assume { filename.is_a?(String) && !filename.empty? }
  assume { title.is_a?(String) && !title.empty? }
  
  anchor = %[<a href="javascript:void(0)" onclick="load_main('pages/#{filename}.html')" style="text-decoration: none;">#{title}</a>]
  result = %[<li class="list-group-item">#{anchor}</li>]
  
  verify { result.is_a?(String) && result.include?("list-group-item") }
  check_invariants
  result
end

#widget_titleObject



45
46
47
48
49
50
51
# File 'lib/scriptorium/widgets/pages.rb', line 45

def widget_title
  check_invariants
  result = Title
  verify { result.is_a?(String) && !result.empty? }
  check_invariants
  result
end

#write_cardObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/scriptorium/widgets/pages.rb', line 105

def write_card
  check_invariants
  assume { @view.is_a?(Scriptorium::View) }
  assume { @name.is_a?(String) && !@name.empty? }
  assume { @data.is_a?(Array) }
  assume { @pages_dir.is_a?(String) && !@pages_dir.empty? }
  
  tag = @name
  cardout = "#{@view.dir}/widgets/#@name/#@name-card.html"
  card_title = Title
  content = ""
  
  @data.each do |filename|
    html_file = "#{@pages_dir}/#{filename}.html"
    
    if File.exist?(html_file)
      html_content = read_file(html_file)
      title = extract_title_from_html(html_content)
      content << page_item(filename, title)
    else
      # Page doesn't exist, skip it
      next
    end
  end
  
  write_file(cardout, html_card(card_title, tag, content))
  check_invariants
end

#write_mainObject



66
67
68
69
70
# File 'lib/scriptorium/widgets/pages.rb', line 66

def write_main
  check_invariants
  # Nothing in this case
  check_invariants
end