Mercurial > hg > soundsoftware-site
comparison vendor/gems/coderay-1.0.0/lib/coderay/encoders/html/output.rb @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
1 module CodeRay | |
2 module Encoders | |
3 | |
4 class HTML | |
5 | |
6 # This module is included in the output String of the HTML Encoder. | |
7 # | |
8 # It provides methods like wrap, div, page etc. | |
9 # | |
10 # Remember to use #clone instead of #dup to keep the modules the object was | |
11 # extended with. | |
12 # | |
13 # TODO: Rewrite this without monkey patching. | |
14 module Output | |
15 | |
16 attr_accessor :css | |
17 | |
18 class << self | |
19 | |
20 # Raises an exception if an object that doesn't respond to to_str is extended by Output, | |
21 # to prevent users from misuse. Use Module#remove_method to disable. | |
22 def extended o # :nodoc: | |
23 warn "The Output module is intended to extend instances of String, not #{o.class}." unless o.respond_to? :to_str | |
24 end | |
25 | |
26 def make_stylesheet css, in_tag = false # :nodoc: | |
27 sheet = css.stylesheet | |
28 sheet = <<-'CSS' if in_tag | |
29 <style type="text/css"> | |
30 #{sheet} | |
31 </style> | |
32 CSS | |
33 sheet | |
34 end | |
35 | |
36 def page_template_for_css css # :nodoc: | |
37 sheet = make_stylesheet css | |
38 PAGE.apply 'CSS', sheet | |
39 end | |
40 | |
41 end | |
42 | |
43 def wrapped_in? element | |
44 wrapped_in == element | |
45 end | |
46 | |
47 def wrapped_in | |
48 @wrapped_in ||= nil | |
49 end | |
50 attr_writer :wrapped_in | |
51 | |
52 def wrap_in! template | |
53 Template.wrap! self, template, 'CONTENT' | |
54 self | |
55 end | |
56 | |
57 def apply_title! title | |
58 self.sub!(/(<title>)(<\/title>)/) { $1 + title + $2 } | |
59 self | |
60 end | |
61 | |
62 def wrap! element, *args | |
63 return self if not element or element == wrapped_in | |
64 case element | |
65 when :div | |
66 raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? nil | |
67 wrap_in! DIV | |
68 when :span | |
69 raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? nil | |
70 wrap_in! SPAN | |
71 when :page | |
72 wrap! :div if wrapped_in? nil | |
73 raise "Can't wrap %p in %p" % [wrapped_in, element] unless wrapped_in? :div | |
74 wrap_in! Output.page_template_for_css(@css) | |
75 if args.first.is_a?(Hash) && title = args.first[:title] | |
76 apply_title! title | |
77 end | |
78 self | |
79 when nil | |
80 return self | |
81 else | |
82 raise "Unknown value %p for :wrap" % element | |
83 end | |
84 @wrapped_in = element | |
85 self | |
86 end | |
87 | |
88 def stylesheet in_tag = false | |
89 Output.make_stylesheet @css, in_tag | |
90 end | |
91 | |
92 #-- don't include the templates in docu | |
93 | |
94 class Template < String # :nodoc: | |
95 | |
96 def self.wrap! str, template, target | |
97 target = Regexp.new(Regexp.escape("<%#{target}%>")) | |
98 if template =~ target | |
99 str[0,0] = $` | |
100 str << $' | |
101 else | |
102 raise "Template target <%%%p%%> not found" % target | |
103 end | |
104 end | |
105 | |
106 def apply target, replacement | |
107 target = Regexp.new(Regexp.escape("<%#{target}%>")) | |
108 if self =~ target | |
109 Template.new($` + replacement + $') | |
110 else | |
111 raise "Template target <%%%p%%> not found" % target | |
112 end | |
113 end | |
114 | |
115 end | |
116 | |
117 SPAN = Template.new '<span class="CodeRay"><%CONTENT%></span>' | |
118 | |
119 DIV = Template.new <<-DIV | |
120 <div class="CodeRay"> | |
121 <div class="code"><pre><%CONTENT%></pre></div> | |
122 </div> | |
123 DIV | |
124 | |
125 TABLE = Template.new <<-TABLE | |
126 <table class="CodeRay"><tr> | |
127 <td class="line-numbers" title="double click to toggle" ondblclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre><%LINE_NUMBERS%></pre></td> | |
128 <td class="code"><pre><%CONTENT%></pre></td> | |
129 </tr></table> | |
130 TABLE | |
131 | |
132 PAGE = Template.new <<-PAGE | |
133 <!DOCTYPE html> | |
134 <html> | |
135 <head> | |
136 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |
137 <title></title> | |
138 <style type="text/css"> | |
139 .CodeRay .line-numbers a { | |
140 text-decoration: inherit; | |
141 color: inherit; | |
142 } | |
143 <%CSS%> | |
144 </style> | |
145 </head> | |
146 <body style="background-color: white;"> | |
147 | |
148 <%CONTENT%> | |
149 </body> | |
150 </html> | |
151 PAGE | |
152 | |
153 end | |
154 | |
155 end | |
156 | |
157 end | |
158 end |