card-mod-format 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/lib/card/format/css_format.rb +17 -0
  3. data/lib/card/format/csv_format.rb +19 -0
  4. data/lib/card/format/data_format.rb +6 -0
  5. data/lib/card/format/file_format.rb +8 -0
  6. data/lib/card/format/html_format.rb +45 -0
  7. data/lib/card/format/js_format.rb +17 -0
  8. data/lib/card/format/json_format.rb +24 -0
  9. data/lib/card/format/rss_format.rb +9 -0
  10. data/lib/card/format/text_format.rb +16 -0
  11. data/lib/card/format/xml_format.rb +13 -0
  12. data/lib/card/path.rb +127 -0
  13. data/set/all/active_card.rb +6 -0
  14. data/set/all/base.rb +137 -0
  15. data/set/all/css.rb +37 -0
  16. data/set/all/csv.rb +93 -0
  17. data/set/all/error.rb +79 -0
  18. data/set/all/export.rb +68 -0
  19. data/set/all/file.rb +9 -0
  20. data/set/all/frame.rb +53 -0
  21. data/set/all/haml.rb +75 -0
  22. data/set/all/head.rb +148 -0
  23. data/set/all/header.rb +62 -0
  24. data/set/all/header/header_wrap.haml +4 -0
  25. data/set/all/html_content.rb +168 -0
  26. data/set/all/html_content/labeled.haml +4 -0
  27. data/set/all/html_error.rb +193 -0
  28. data/set/all/html_error/debug_server_error.haml +1015 -0
  29. data/set/all/html_error/not_found.haml +7 -0
  30. data/set/all/html_error/server_error.haml +5 -0
  31. data/set/all/html_show.rb +53 -0
  32. data/set/all/html_title.rb +47 -0
  33. data/set/all/html_wrapper.rb +159 -0
  34. data/set/all/js.rb +10 -0
  35. data/set/all/json.rb +166 -0
  36. data/set/all/links.rb +149 -0
  37. data/set/all/menu.rb +129 -0
  38. data/set/all/meta_tags.haml +4 -0
  39. data/set/all/path.rb +78 -0
  40. data/set/all/rich_html.rb +4 -0
  41. data/set/all/rss.rb +76 -0
  42. data/set/all/text.rb +7 -0
  43. data/set/self/home.rb +9 -0
  44. data/set/type/html.rb +27 -0
  45. data/set/type/json.rb +41 -0
  46. data/set/type/number.rb +22 -0
  47. data/set/type/phrase.rb +5 -0
  48. data/set/type/plain_text.rb +9 -0
  49. data/set/type/toggle.rb +38 -0
  50. data/set/type/uri.rb +15 -0
  51. metadata +123 -0
@@ -0,0 +1,7 @@
1
+ %h2
2
+ Could not find
3
+ - if card.name.present?
4
+ %em
5
+ = safe_name
6
+ - else
7
+ that
@@ -0,0 +1,5 @@
1
+ .border.border-danger.text-center.p-3
2
+ %h1 Wild Card!
3
+ %h2.alert-danger 500 Server Error
4
+ %h4.p-3
5
+ Yuck, sorry about that.
@@ -0,0 +1,53 @@
1
+ format :html do
2
+ def show view, args
3
+ capture_the_freak do
4
+ content = send show_method, view, args
5
+ show_full_page? ? wrap_with_html_page(content) : content
6
+ end
7
+ end
8
+
9
+ def show_method
10
+ "show_#{show_layout? ? :with : :without}_page_layout"
11
+ end
12
+
13
+ def show_without_page_layout view, args
14
+ @main = true if params[:is_main] || args[:main]
15
+ args.delete(:layout)
16
+ view ||= args[:home_view] || :open # default_nest_view
17
+ render! view, args
18
+ end
19
+
20
+ def show_full_page?
21
+ !Env.ajax?
22
+ end
23
+
24
+ wrapper :html_page do
25
+ <<-HTML.strip_heredoc
26
+ <!DOCTYPE HTML>
27
+ <html class="h-100">
28
+ <head>
29
+ #{head_content}
30
+ </head>
31
+ #{interior}
32
+ </html>
33
+ HTML
34
+ end
35
+
36
+ def head_content
37
+ nest card.rule_card(:head), view: :head_content
38
+ end
39
+
40
+ private
41
+
42
+ # this is a temporary fix to try to debug a recurring encoding-related error
43
+ # TODO: remove the following after tracking down wikirate encoding bug
44
+ def capture_the_freak
45
+ yield
46
+ rescue Card::Error::ServerError => e
47
+ if e.message.match?(/invalid byte sequence/)
48
+ Card::Lexicon.cache.reset
49
+ Rails.logger.info "reset name cache to prevent encoding freakiness"
50
+ end
51
+ raise e
52
+ end
53
+ end
@@ -0,0 +1,47 @@
1
+ format do
2
+ view :title, compact: true, perms: :none do
3
+ standard_title
4
+ end
5
+
6
+ def standard_title
7
+ name_variant title_in_context(voo.title)
8
+ end
9
+ end
10
+
11
+ format :html do
12
+ view :title do
13
+ show_view?(:title_link, :hide) ? render_title_link : render_title_no_link
14
+ end
15
+
16
+ view :title_link, compact: true, perms: :none do
17
+ link_to_card card.name, render_title_no_link
18
+ end
19
+
20
+ view :title_no_link, compact: true, perms: :none do
21
+ wrapped_title standard_title
22
+ end
23
+
24
+ def title_with_link link_text
25
+ link_to_card card.name, link_text
26
+ end
27
+
28
+ def safe_name
29
+ h super
30
+ end
31
+
32
+ def title_in_context title=nil
33
+ title = title&.html_safe
34
+ # escape titles generated from card names, but not those set explicitly
35
+ h super(title)
36
+ end
37
+
38
+ def wrapped_title title
39
+ wrap_with :span, class: classy("card-title"), title: title do
40
+ title.to_name.parts.join wrapped_joint
41
+ end
42
+ end
43
+
44
+ def wrapped_joint
45
+ wrap_with :span, "+", classy("joint")
46
+ end
47
+ end
@@ -0,0 +1,159 @@
1
+ format :html do
2
+ # Does two main things:
3
+ # (1) gives CSS classes for styling and
4
+ # (2) adds card data for javascript - including the "card-slot" class,
5
+ # which in principle is not supposed to be in styles
6
+ def wrap slot=true, slot_attr={}, tag=:div, &block
7
+ attrib = slot_attributes slot, slot_attr
8
+ method_wrap :wrap_with, tag, attrib, &block
9
+ end
10
+
11
+ wrapper :slot do |opts|
12
+ class_up "card-slot", opts[:class] if opts[:class]
13
+ attrib = slot_attributes true, opts
14
+ method_wrap(:wrap_with, :div, attrib) { interior }
15
+ end
16
+
17
+ def haml_wrap slot=true, slot_attr={}, tag=:div, &block
18
+ attrib = slot_attributes slot, slot_attr
19
+ method_wrap :haml_tag, tag, attrib, &block
20
+ end
21
+
22
+ def method_wrap method, tag, attrib, &block
23
+ @slot_view = @current_view
24
+ debug_slot { send method, tag, attrib, &block }
25
+ end
26
+
27
+ def slot_attributes slot, slot_attr
28
+ { id: slot_id, class: wrap_classes(slot), data: wrap_data }.tap do |hash|
29
+ add_class hash, slot_attr.delete(:class)
30
+ hash.deep_merge! slot_attr
31
+ end
32
+ end
33
+
34
+ def slot_id
35
+ "#{card.name.safe_key}-#{@current_view}-view"
36
+ end
37
+
38
+ def wrap_data slot=true
39
+ with_slot_data slot do
40
+ { "card-id": card.id, "card-name": slot_cardname, "slot-id": SecureRandom.hex(10) }
41
+ end
42
+ end
43
+
44
+ def slot_cardname
45
+ name = card.name
46
+ name = card.new? && name.compound? ? name.url_key : name
47
+ h name
48
+ end
49
+
50
+ def with_slot_data slot
51
+ hash = yield
52
+ # rails helper convert slot hash to json
53
+ # but haml joins nested keys with a dash
54
+ hash[:slot] = slot_options_json if slot
55
+ hash
56
+ end
57
+
58
+ def slot_options_json
59
+ html_escape_except_quotes JSON(slot_options)
60
+ end
61
+
62
+ def slot_options
63
+ options = voo ? voo.slot_options : {}
64
+ name_context_slot_option options
65
+ options
66
+ end
67
+
68
+ def name_context_slot_option opts
69
+ return unless initial_context_names.present?
70
+
71
+ opts[:name_context] = initial_context_names.map(&:key) * ","
72
+ end
73
+
74
+ def debug_slot
75
+ debug_slot? ? debug_slot_wrap { yield } : yield
76
+ end
77
+
78
+ def debug_slot?
79
+ params[:debug] == "slot"
80
+ end
81
+
82
+ def debug_slot_wrap
83
+ pre = "<!--\n\n#{' ' * depth}"
84
+ post = " SLOT: #{h card.name}\n\n-->"
85
+ [pre, "BEGIN", post, yield, pre, "END", post].join
86
+ end
87
+
88
+ def wrap_classes slot
89
+ list = slot ? ["card-slot"] : []
90
+ list += ["#{@current_view}-view", card.safe_set_keys]
91
+ list << "STRUCTURE-#{voo.structure.to_name.key}" if voo&.structure
92
+ classy list
93
+ end
94
+
95
+ def wrap_body
96
+ wrap_with(:div, class: body_css_classes) { yield }
97
+ end
98
+
99
+ def haml_wrap_body
100
+ wrap_body do
101
+ capture_haml { yield }
102
+ end
103
+ end
104
+
105
+ def body_css_classes
106
+ css_classes = ["d0-card-body"]
107
+ css_classes += ["d0-card-content", card.safe_set_keys] if @content_body
108
+ classy(*css_classes)
109
+ end
110
+
111
+ def wrap_main
112
+ return yield if no_main_wrap?
113
+
114
+ wrap_with :div, yield, id: "main"
115
+ end
116
+
117
+ def no_main_wrap?
118
+ Env.ajax? || params[:layout] == "none"
119
+ end
120
+
121
+ def wrap_with tag, content_or_args={}, html_args={}, &block
122
+ tag_args = block_given? ? content_or_args : html_args
123
+ content_tag(tag, tag_args) { content_within_wrap content_or_args, &block }
124
+ end
125
+
126
+ def wrap_each_with tag, content_or_args={}, args={}, &block
127
+ tag_args = block_given? ? content_or_args : args
128
+ content_items_within_wrap(content_or_args, args, &block).map do |item|
129
+ wrap_with(tag, tag_args) { item }
130
+ end.join "\n"
131
+ end
132
+
133
+ private
134
+
135
+ def content_items_within_wrap content, args
136
+ content = block_given? ? yield(args) : content
137
+ content.compact
138
+ end
139
+
140
+ def content_within_wrap content
141
+ content = block_given? ? yield : content
142
+ output(content).to_s.html_safe
143
+ end
144
+
145
+ def html_escape_except_quotes string
146
+ # to be used inside single quotes (makes for readable json attributes)
147
+ string.to_s.gsub(/&/, "&amp;")
148
+ .gsub(/\'/, "&apos;")
149
+ .gsub(/>/, "&gt;")
150
+ .gsub(/</, "&lt;")
151
+ end
152
+
153
+ wrapper :div, :div
154
+ wrapper :em, :em
155
+
156
+ wrapper :none do
157
+ interior
158
+ end
159
+ end
@@ -0,0 +1,10 @@
1
+
2
+ format :js do
3
+ def default_item_view
4
+ :core
5
+ end
6
+
7
+ view :source do
8
+ path format: :js
9
+ end
10
+ end
@@ -0,0 +1,166 @@
1
+ format :json do
2
+ # because card.item_cards returns "[[#{self}]]"
3
+ def item_cards
4
+ nested_cards
5
+ end
6
+
7
+ def default_nest_view
8
+ :atom
9
+ end
10
+
11
+ def default_item_view
12
+ params[:item] || :name
13
+ end
14
+
15
+ def max_depth
16
+ params[:max_depth].present? ? params[:max_depth].to_i : 1
17
+ end
18
+
19
+ # TODO: support layouts in json
20
+ # eg layout=stamp gives you the metadata currently in "page" view
21
+ # and layout=none gives you ONLY the requested view (default atom)
22
+ def show view, args
23
+ view ||= :molecule
24
+ string_with_page_details do
25
+ render! view, args
26
+ end
27
+ end
28
+
29
+ def string_with_page_details
30
+ raw = yield
31
+ return raw if raw.is_a? String
32
+
33
+ stringify page_details(raw)
34
+ end
35
+
36
+ def stringify raw
37
+ method = params[:compress] ? :generate : :pretty_generate
38
+ JSON.send method, raw
39
+ end
40
+
41
+ def page_details obj
42
+ return obj unless obj.is_a? Hash
43
+
44
+ obj.merge url: request_url, timestamp: Time.now.to_s
45
+ end
46
+
47
+ view :status, unknown: true, perms: :none do
48
+ { key: card.key,
49
+ url_key: card.name.url_key,
50
+ status: card.state }.tap do |h|
51
+
52
+ h[:id] = card.id if h[:status] == :real
53
+ end
54
+ end
55
+
56
+ def request_url
57
+ controller.request&.original_url || path
58
+ end
59
+
60
+ view :core, unknown: true do
61
+ card.known? ? render_content : nil
62
+ end
63
+
64
+ view :content do
65
+ card.content
66
+ end
67
+
68
+ view :nucleus do
69
+ nucleus
70
+ end
71
+
72
+ # TODO: add simple values for fields
73
+ view :atom, unknown: true do
74
+ atom
75
+ end
76
+
77
+ view :molecule do
78
+ molecule
79
+ end
80
+
81
+ view :page, cache: :never do
82
+ page_details card: render_atom
83
+ end
84
+
85
+ # NOCACHE because sometimes item_cards is dynamic.
86
+ # could be safely cached for non-dynamic lists
87
+ view :items, cache: :never do
88
+ listing item_cards, view: :atom
89
+ end
90
+
91
+ view :links do
92
+ card.link_chunks.map do |chunk|
93
+ if chunk.referee_name
94
+ path mark: chunk.referee_name, format: :json
95
+ else
96
+ link_to_resource chunk.link_target
97
+ end
98
+ end
99
+ end
100
+
101
+ view :ancestors do
102
+ card.name.ancestors.map do |name|
103
+ nest name, view: :nucleus
104
+ end
105
+ end
106
+
107
+ # minimum needed to re-fetch card
108
+ view :cast do
109
+ card.cast
110
+ end
111
+
112
+ ## DEPRECATED
113
+ view :marks do
114
+ {
115
+ id: card.id,
116
+ name: card.name,
117
+ key: card.key,
118
+ url: path
119
+ }
120
+ end
121
+
122
+ view :essentials do
123
+ if voo.show? :marks
124
+ render_marks.merge(essentials)
125
+ else
126
+ essentials
127
+ end
128
+ end
129
+
130
+ def essentials
131
+ return {} if card.structure
132
+ { content: card.db_content }
133
+ end
134
+
135
+ # NOTE: moving these to methods prevents potential caching problems, because other
136
+ # views manipulate their hashes.
137
+ #
138
+ def nucleus
139
+ { id: card.id,
140
+ name: card.name,
141
+ type: card.type_name,
142
+ url: path(format: :json) }.tap do |h|
143
+
144
+ h[:codename] = card.codename if card.codename
145
+ end
146
+ end
147
+
148
+ def atom
149
+ nucleus.tap do |h|
150
+ h[:content] = render_content if card.known? && !card.structure
151
+ end
152
+ end
153
+
154
+ def molecule
155
+ atom.merge items: _render_items,
156
+ links: _render_links,
157
+ ancestors: _render_ancestors,
158
+ html_url: path,
159
+ type: nest(card.type_card, view: :nucleus)
160
+ end
161
+ end
162
+
163
+ # TODO: perhaps this should be in a general "data" module.
164
+ def cast
165
+ real? ? { id: id } : { name: name, type_id: type_id, content: db_content }
166
+ end