wikicloth 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wikicloth/wiki_buffer/html_element.rb +28 -3
- data/lib/wikicloth/wiki_buffer/link.rb +18 -4
- data/lib/wikicloth/wiki_buffer/table.rb +2 -2
- data/lib/wikicloth/wiki_buffer.rb +100 -56
- data/lib/wikicloth/wiki_link_handler.rb +61 -16
- data/lib/wikicloth.rb +40 -5
- data/run_tests.rb +1 -0
- data/sample_documents/klaus_schulze.wiki +293 -0
- data/test/wiki_cloth_test.rb +59 -4
- metadata +6 -5
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'builder'
|
3
|
+
require 'rexml/document'
|
3
4
|
|
4
5
|
module WikiCloth
|
5
6
|
|
@@ -13,6 +14,7 @@ class WikiBuffer::HTMLElement < WikiBuffer
|
|
13
14
|
ESCAPED_TAGS = [ 'nowiki', 'pre', 'code' ]
|
14
15
|
SHORT_TAGS = [ 'meta','br','hr']
|
15
16
|
NO_NEED_TO_CLOSE = ['li','p'] + SHORT_TAGS
|
17
|
+
DISABLE_GLOBALS_FOR = ESCAPED_TAGS + [ 'math' ]
|
16
18
|
|
17
19
|
def initialize(d="",options={},check=nil)
|
18
20
|
super("",options)
|
@@ -28,15 +30,16 @@ class WikiBuffer::HTMLElement < WikiBuffer
|
|
28
30
|
when "template"
|
29
31
|
self.get_param("__name")
|
30
32
|
else
|
31
|
-
ret = self.
|
33
|
+
ret = self.class.to_s + "["
|
34
|
+
ret += self.element_name
|
32
35
|
tmp = self.get_param("id")
|
33
36
|
ret += tmp.nil? ? "" : "##{tmp}"
|
34
|
-
ret
|
37
|
+
ret + "]"
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
38
41
|
def run_globals?
|
39
|
-
return
|
42
|
+
return DISABLE_GLOBALS_FOR.include?(self.element_name) ? false : true
|
40
43
|
end
|
41
44
|
|
42
45
|
def to_s
|
@@ -54,6 +57,28 @@ class WikiBuffer::HTMLElement < WikiBuffer
|
|
54
57
|
|
55
58
|
lhandler = @options[:link_handler]
|
56
59
|
case self.element_name
|
60
|
+
when "math"
|
61
|
+
blahtex_path = @options[:blahtex_path] || '/usr/bin/blahtex'
|
62
|
+
blahtex_png_path = @options[:blahtex_png_path] || '/tmp'
|
63
|
+
|
64
|
+
if File.exists?(blahtex_path)
|
65
|
+
begin
|
66
|
+
response = `echo '#{self.element_content}' | #{blahtex_path} --png --mathml --png-directory #{blahtex_png_path}`
|
67
|
+
xml_response = REXML::Document.new(response).root
|
68
|
+
if @options[:blahtex_html_prefix]
|
69
|
+
file_md5 = xml_response.elements["png/md5"].text
|
70
|
+
return "<img src=\"#{File.join(@options[:blahtex_html_prefix],"#{file_md5}.png")}\" />"
|
71
|
+
else
|
72
|
+
html = xml_response.elements["mathml/markup"].text
|
73
|
+
eattr = { "xmlns" => "http://www.w3.org/1998/Math/MathML" }.merge(self.element_attributes)
|
74
|
+
return elem.tag!(self.element_name, eattr) { |x| x << xml_response.elements["mathml/markup"].children.to_s }
|
75
|
+
end
|
76
|
+
rescue => err
|
77
|
+
return "<span class=\"error\">Unable to parse MathML: #{err}</span>"
|
78
|
+
end
|
79
|
+
else
|
80
|
+
return "<span class=\"error\">blatex binary not found</span>"
|
81
|
+
end
|
57
82
|
when "template"
|
58
83
|
return self.element_content
|
59
84
|
when "noinclude"
|
@@ -5,6 +5,7 @@ class WikiBuffer::Link < WikiBuffer
|
|
5
5
|
def initialize(data="",options={})
|
6
6
|
super(data,options)
|
7
7
|
@in_quotes = false
|
8
|
+
@checktrailing = false
|
8
9
|
end
|
9
10
|
|
10
11
|
def internal_link
|
@@ -29,6 +30,10 @@ class WikiBuffer::Link < WikiBuffer
|
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
33
|
+
def eof()
|
34
|
+
self.current_param = self.data
|
35
|
+
end
|
36
|
+
|
32
37
|
protected
|
33
38
|
def internal_link=(val)
|
34
39
|
@internal_link = (val == true ? true : false)
|
@@ -36,6 +41,11 @@ class WikiBuffer::Link < WikiBuffer
|
|
36
41
|
|
37
42
|
def new_char()
|
38
43
|
case
|
44
|
+
when @checktrailing && current_char !~ /\w/
|
45
|
+
self.current_param = self.data
|
46
|
+
self.data = current_char == '{' ? "" : current_char
|
47
|
+
return false
|
48
|
+
|
39
49
|
# check if this link is internal or external
|
40
50
|
when previous_char.blank? && current_char == '['
|
41
51
|
self.internal_link = true
|
@@ -55,11 +65,15 @@ class WikiBuffer::Link < WikiBuffer
|
|
55
65
|
|
56
66
|
# end of link
|
57
67
|
when current_char == ']' && ((previous_char == ']' && self.internal_link == true) || self.internal_link == false) && @in_quotes == false
|
58
|
-
self.data.chop! if self.internal_link == true
|
59
68
|
self.current_param = self.data
|
60
|
-
self.
|
61
|
-
|
62
|
-
|
69
|
+
if self.internal_link == true
|
70
|
+
self.data.chop!.rstrip!
|
71
|
+
self.params << "" unless self.params.size > 1
|
72
|
+
@checktrailing = true
|
73
|
+
else
|
74
|
+
self.data = ""
|
75
|
+
return false
|
76
|
+
end
|
63
77
|
else
|
64
78
|
self.data += current_char unless current_char == ' ' && self.data.blank?
|
65
79
|
end
|
@@ -36,7 +36,7 @@ class WikiBuffer::Table < WikiBuffer
|
|
36
36
|
for cell in row
|
37
37
|
cell_attributes = cell[:style].blank? ? "" : parse_attributes(cell[:style].strip).collect { |k,v| "#{k}=\"#{v}\"" }.join(" ")
|
38
38
|
cell_attributes = cell_attributes.blank? ? "" : " #{cell_attributes}"
|
39
|
-
ret += "<#{cell[:type]}#{cell_attributes}
|
39
|
+
ret += "<#{cell[:type]}#{cell_attributes}>\n#{cell[:value].strip}\n</#{cell[:type]}>"
|
40
40
|
end
|
41
41
|
ret += "</tr>"
|
42
42
|
end
|
@@ -142,7 +142,7 @@ class WikiBuffer::Table < WikiBuffer
|
|
142
142
|
|
143
143
|
# Table cell might have attributes
|
144
144
|
when current_char == '|' && previous_char != "\n" && @in_quotes == false
|
145
|
-
@check_cell_data = 1
|
145
|
+
@check_cell_data = 1 unless @start_table
|
146
146
|
|
147
147
|
# End table caption
|
148
148
|
when current_char == "\n" && @start_caption == true && @in_quotes == false
|
@@ -12,10 +12,12 @@ class WikiBuffer
|
|
12
12
|
@list_data = []
|
13
13
|
@check_new_tag = false
|
14
14
|
@indent = nil
|
15
|
+
@previous_line_empty = false
|
16
|
+
@paragraph_open = false
|
15
17
|
end
|
16
18
|
|
17
19
|
def debug
|
18
|
-
self.params[0]
|
20
|
+
self.params[0].blank? ? self.class.to_s : self.params[0]
|
19
21
|
end
|
20
22
|
|
21
23
|
def run_globals?
|
@@ -62,7 +64,7 @@ class WikiBuffer
|
|
62
64
|
end
|
63
65
|
|
64
66
|
def to_s
|
65
|
-
self.params.join("\n")
|
67
|
+
self.params.join("\n") + (@list_data.empty? ? "" : render_list_data()) + (@paragraph_open ? "</p>" : "")
|
66
68
|
end
|
67
69
|
|
68
70
|
def check_globals()
|
@@ -101,7 +103,7 @@ class WikiBuffer
|
|
101
103
|
if @buffers[-1].instance_of?(WikiBuffer::Var) && @buffers[-1].tag_start == true
|
102
104
|
@buffers[-1].tag_size += 1
|
103
105
|
else
|
104
|
-
@buffers[-1].data.chop!
|
106
|
+
@buffers[-1].data.chop! if @buffers[-1].data[-1,1] == '{'
|
105
107
|
@buffers << WikiBuffer::Var.new("",@options)
|
106
108
|
end
|
107
109
|
return true
|
@@ -123,6 +125,29 @@ class WikiBuffer
|
|
123
125
|
return false
|
124
126
|
end
|
125
127
|
|
128
|
+
def add_word(w)
|
129
|
+
self.previous_char = w[-2,1]
|
130
|
+
self.current_char = w[-1,1]
|
131
|
+
@buffers[-1].data += w
|
132
|
+
end
|
133
|
+
|
134
|
+
def eof()
|
135
|
+
return if @buffers.size == 1
|
136
|
+
|
137
|
+
if self.class == WikiBuffer
|
138
|
+
while @buffers.size > 1
|
139
|
+
@buffers[-1].eof()
|
140
|
+
tmp = @buffers.pop
|
141
|
+
@buffers[-1].data += tmp.to_s
|
142
|
+
unless tmp.data.blank?
|
143
|
+
tmp.data.each_char { |x| self.add_char(x) }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
else
|
147
|
+
# default cleanup tasks
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
126
151
|
def add_char(c)
|
127
152
|
self.previous_char = self.current_char
|
128
153
|
self.current_char = c
|
@@ -147,10 +172,13 @@ class WikiBuffer
|
|
147
172
|
def new_char()
|
148
173
|
case
|
149
174
|
when current_char == "\n"
|
175
|
+
# Underline, and Strikethrough
|
150
176
|
if @options[:extended_markup] == true
|
151
177
|
self.data.gsub!(/---([^-]+)---/,"<strike>\\1</strike>")
|
152
178
|
self.data.gsub!(/_([^_]+)_/,"<u>\\1</u>")
|
153
179
|
end
|
180
|
+
|
181
|
+
# Magic Words
|
154
182
|
self.data.gsub!(/__([A-Z]+)__/) { |r|
|
155
183
|
case $1
|
156
184
|
when "TOC"
|
@@ -159,10 +187,11 @@ class WikiBuffer
|
|
159
187
|
""
|
160
188
|
end
|
161
189
|
}
|
190
|
+
|
191
|
+
# Horizontal Rule
|
162
192
|
self.data.gsub!(/^([-]{4,})/) { |r| "<hr />" }
|
163
|
-
|
164
|
-
|
165
|
-
}
|
193
|
+
|
194
|
+
# Bold, Italic
|
166
195
|
self.data.gsub!(/([\']{2,5})(.*?)(\1)/) { |r|
|
167
196
|
tmp = "<i>#{$2}</i>" if $1.length == 2
|
168
197
|
tmp = "<b>#{$2}</b>" if $1.length == 3
|
@@ -170,58 +199,40 @@ class WikiBuffer
|
|
170
199
|
tmp = "<b><i>#{$2}</i></b>" if $1.length == 5
|
171
200
|
tmp
|
172
201
|
}
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
@list_data
|
180
|
-
|
181
|
-
|
202
|
+
|
203
|
+
# Lists
|
204
|
+
tmp = ''
|
205
|
+
self.data.each_line do |line|
|
206
|
+
if line =~ /^([#\*:;]+)/
|
207
|
+
# Add current line to list data
|
208
|
+
@list_data << line
|
209
|
+
else
|
210
|
+
# render list if list data was just closed
|
211
|
+
tmp += render_list_data() unless @list_data.empty?
|
212
|
+
tmp += line
|
182
213
|
end
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
unless (@list_data.last == ';' || @list_data.last == ':') && (cdata.last == ';' || cdata.last == ':')
|
204
|
-
tmp += "</#{list_tag_for(@list_data.pop)}>"
|
205
|
-
tmp += "<#{list_tag_for(cdata.last)}>"
|
206
|
-
end
|
207
|
-
else
|
208
|
-
tmp += "</" + list_inner_tag_for(@list_data.last) + ">"
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
# FIXME: still probably does not detect the : properly
|
213
|
-
peices = cdata.last == ";" ? $2.smart_split(":") : [ $2 ]
|
214
|
-
if peices.size > 1
|
215
|
-
tmp += "<#{list_inner_tag_for(cdata.last)}>#{peices[0]}</#{list_inner_tag_for(cdata.last)}>"
|
216
|
-
tmp += "<dd>#{peices[1..-1].join(":")}</dd>"
|
217
|
-
cdata[-1] = ":"
|
218
|
-
else
|
219
|
-
tmp += "<#{list_inner_tag_for(cdata.last)}>#{peices[0]}"
|
214
|
+
end
|
215
|
+
self.data = tmp
|
216
|
+
|
217
|
+
# Headings
|
218
|
+
is_heading = false
|
219
|
+
self.data.gsub!(/^([=]{1,6})\s*(.*?)\s*(\1)/) { |r|
|
220
|
+
is_heading = true
|
221
|
+
(@paragraph_open ? "</p>" : "") + "<h#{$1.length}>#{$2}</h#{$1.length}>"
|
222
|
+
}
|
223
|
+
|
224
|
+
# Paragraphs
|
225
|
+
if is_heading
|
226
|
+
@paragraph_open = false
|
227
|
+
else
|
228
|
+
if self.data =~ /^\s*$/ && @paragraph_open && @list_data.empty?
|
229
|
+
self.data = "</p>"
|
230
|
+
@paragraph_open = false
|
231
|
+
else
|
232
|
+
if self.data !~ /^\s*$/
|
233
|
+
self.data = "<p>#{self.data}" and @paragraph_open = true unless @paragraph_open
|
220
234
|
end
|
221
|
-
|
222
|
-
tmp
|
223
|
-
}
|
224
|
-
self.data += line + ""
|
235
|
+
end
|
225
236
|
end
|
226
237
|
|
227
238
|
self.params << self.data.auto_link
|
@@ -280,6 +291,39 @@ class WikiBuffer
|
|
280
291
|
@current_line ||= ""
|
281
292
|
end
|
282
293
|
|
294
|
+
def render_list_data()
|
295
|
+
ret = ""
|
296
|
+
depth = 0
|
297
|
+
peices = ""
|
298
|
+
|
299
|
+
@list_data.each do |l|
|
300
|
+
if l =~ /^([#\*:;]+)\s*(.*)$/
|
301
|
+
peices = $1
|
302
|
+
content = $2
|
303
|
+
if peices.length > depth
|
304
|
+
while peices.length > depth
|
305
|
+
ret += "<#{list_tag_for(peices[depth,1])}><#{list_inner_tag_for(peices[depth,1])}>"
|
306
|
+
depth += 1
|
307
|
+
end
|
308
|
+
elsif peices.length == depth
|
309
|
+
ret += "</#{list_inner_tag_for(peices[depth-1,1])}><#{list_inner_tag_for(peices[depth-1,1])}>"
|
310
|
+
else
|
311
|
+
while peices.length < depth
|
312
|
+
depth -= 1
|
313
|
+
ret += "</#{list_inner_tag_for(peices[depth-1,1])}></#{list_tag_for(peices[depth-1,1])}><#{list_inner_tag_for(peices[depth-1,1])}>"
|
314
|
+
end
|
315
|
+
end
|
316
|
+
ret += "#{content}"
|
317
|
+
end
|
318
|
+
end
|
319
|
+
while depth > 0
|
320
|
+
depth -= 1
|
321
|
+
ret += "</#{list_inner_tag_for(peices[depth,1])}></#{list_tag_for(peices[depth,1])}>"
|
322
|
+
end
|
323
|
+
@list_data = []
|
324
|
+
ret + "\n"
|
325
|
+
end
|
326
|
+
|
283
327
|
def list_tag_for(tag)
|
284
328
|
case tag
|
285
329
|
when "#" then "ol"
|
@@ -5,6 +5,16 @@ module WikiCloth
|
|
5
5
|
|
6
6
|
class WikiLinkHandler
|
7
7
|
|
8
|
+
FILE_NAMESPACES = ["datei","image","file","media"]
|
9
|
+
CATEGORY_NAMESPACES = ['kategorie','category']
|
10
|
+
LANGUAGE_NAMESPACES = ['af','am','ang','ar','arc','ast','az','bn','zh-min-nan','ba','be','be-x-old','bar','bs','br','bg','ca',
|
11
|
+
'ceb','cs','co','cy','da','de','dv','et','el','es','eo','eu','fa','fo','fr','fy','ga','gd','gl','gan','ko','hy','hi','hr',
|
12
|
+
'io','id','is','it','he','jv','kn','pam','ka','sw','ku','la','lv','lb','lt','hu','mk','mg','ml','mr','arz','ms','nah','nl',
|
13
|
+
'ja','no','nn','oc','uz','pap','nds','pl','pt','ksh','ro','qu','ru','sa','sco','sq','scn','simple','sk','sl','sr','sh',
|
14
|
+
'fi','sv','tl','ta','th','tg','tr','uk','ur','vi','zh-classical','yi','bat-smg','zh','lo','en','gn','map-bms','pdc','eml',
|
15
|
+
'ki','hak','ia','ky','lad','nds-nl','ne','nrm','nov','sm','si','su','kab','te','vec','fiu-vro','wa','war','wuu','zh-yue',
|
16
|
+
'diq']
|
17
|
+
|
8
18
|
def references
|
9
19
|
@references ||= []
|
10
20
|
end
|
@@ -21,24 +31,39 @@ class WikiLinkHandler
|
|
21
31
|
nil
|
22
32
|
end
|
23
33
|
|
24
|
-
def
|
25
|
-
ret =
|
26
|
-
|
27
|
-
|
28
|
-
ret
|
29
|
-
|
34
|
+
def section_list(root=nil)
|
35
|
+
ret = []
|
36
|
+
root = sections[0].children if root.nil?
|
37
|
+
root.each do |child|
|
38
|
+
ret << child
|
39
|
+
unless child.children.empty?
|
40
|
+
ret << [section_list(child.children)]
|
41
|
+
end
|
30
42
|
end
|
31
|
-
|
43
|
+
ret.flatten
|
32
44
|
end
|
33
45
|
|
34
46
|
def toc(sections)
|
35
|
-
ret = "<table id=\"toc\" class=\"toc\" summary=\"Contents\"><tr><td><div style=\"font-weight:bold\">Table of Contents</div
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
47
|
+
ret = "<table id=\"toc\" class=\"toc\" summary=\"Contents\"><tr><td><div style=\"font-weight:bold\">Table of Contents</div>"
|
48
|
+
previous_depth = 1
|
49
|
+
section_list.each do |section|
|
50
|
+
if section.depth > previous_depth
|
51
|
+
c = section.depth - previous_depth
|
52
|
+
c.times { ret += "<ul>" }
|
53
|
+
ret += "<li><a href=\"##{section.id}\">#{section.title}</a>"
|
54
|
+
elsif section.depth == previous_depth
|
55
|
+
ret += "</li><li><a href=\"##{section.id}\">#{section.title}</a>"
|
56
|
+
else
|
57
|
+
ret += "</li>" unless previous_depth == 1
|
58
|
+
c = previous_depth - section.depth
|
59
|
+
c.times { ret += "</ul>" }
|
60
|
+
ret += "<li><a href=\"##{section.id}\">#{section.title}</a>"
|
61
|
+
end
|
62
|
+
previous_depth = section.depth
|
40
63
|
end
|
41
|
-
"
|
64
|
+
ret += "</li>"
|
65
|
+
(previous_depth-1).times { ret += "</ul>" }
|
66
|
+
"#{ret}</td></tr></table>"
|
42
67
|
end
|
43
68
|
|
44
69
|
def external_links
|
@@ -49,6 +74,14 @@ class WikiLinkHandler
|
|
49
74
|
@internal_links ||= []
|
50
75
|
end
|
51
76
|
|
77
|
+
def languages
|
78
|
+
@languages ||= {}
|
79
|
+
end
|
80
|
+
|
81
|
+
def categories
|
82
|
+
@categories ||= []
|
83
|
+
end
|
84
|
+
|
52
85
|
def find_reference_by_name(n)
|
53
86
|
references.each { |r| return r if !r[:name].nil? && r[:name].strip == n }
|
54
87
|
return nil
|
@@ -59,6 +92,14 @@ class WikiLinkHandler
|
|
59
92
|
return nil
|
60
93
|
end
|
61
94
|
|
95
|
+
def categories=(val)
|
96
|
+
@categories = val
|
97
|
+
end
|
98
|
+
|
99
|
+
def languages=(val)
|
100
|
+
@languages = val
|
101
|
+
end
|
102
|
+
|
62
103
|
def references=(val)
|
63
104
|
@references = val
|
64
105
|
end
|
@@ -128,8 +169,12 @@ class WikiLinkHandler
|
|
128
169
|
ret = ""
|
129
170
|
prefix.downcase!
|
130
171
|
case
|
131
|
-
when
|
172
|
+
when FILE_NAMESPACES.include?(prefix)
|
132
173
|
ret += wiki_image(resource,options)
|
174
|
+
when CATEGORY_NAMESPACES.include?(prefix)
|
175
|
+
self.categories << resource
|
176
|
+
when LANGUAGE_NAMESPACES.include?(prefix)
|
177
|
+
self.languages[prefix] = resource
|
133
178
|
else
|
134
179
|
title = options[0] ? options[0] : "#{prefix}:#{resource}"
|
135
180
|
ret += link_for("#{prefix}:#{resource}",title)
|
@@ -158,7 +203,7 @@ class WikiLinkHandler
|
|
158
203
|
|
159
204
|
options.each do |x|
|
160
205
|
case
|
161
|
-
when ["thumb","thumbnail","frame","border"].include?(x.strip)
|
206
|
+
when ["miniatur","thumb","thumbnail","frame","border"].include?(x.strip)
|
162
207
|
type = x.strip
|
163
208
|
when ["left","right","center","none"].include?(x.strip)
|
164
209
|
ffloat = true
|
@@ -179,7 +224,7 @@ class WikiLinkHandler
|
|
179
224
|
css << "border:1px solid #000" if type == "border"
|
180
225
|
|
181
226
|
sane_title = title.nil? ? "" : title.gsub(/<\/?[^>]*>/, "")
|
182
|
-
if
|
227
|
+
if ["thumb","thumbnail","frame","miniatur"].include?(type)
|
183
228
|
pre_img = '<div class="thumb t' + loc + '"><div class="thumbinner" style="width: ' + w.to_s +
|
184
229
|
'px;"><a href="" class="image" title="' + sane_title + '">'
|
185
230
|
post_img = '</a><div class="thumbcaption">' + title + '</div></div></div>'
|
data/lib/wikicloth.rb
CHANGED
@@ -10,13 +10,15 @@ String.send(:include, ExtendedString)
|
|
10
10
|
|
11
11
|
module WikiCloth
|
12
12
|
|
13
|
-
VERSION = "0.
|
13
|
+
VERSION = "0.7.0"
|
14
14
|
|
15
15
|
class WikiCloth
|
16
16
|
|
17
17
|
def initialize(opt={})
|
18
18
|
self.options[:link_handler] = opt[:link_handler] unless opt[:link_handler].nil?
|
19
19
|
self.load(opt[:data],opt[:params]) unless opt[:data].nil?
|
20
|
+
@current_line = 1
|
21
|
+
@current_row = 0
|
20
22
|
end
|
21
23
|
|
22
24
|
def load(data,p={})
|
@@ -55,16 +57,49 @@ module WikiCloth
|
|
55
57
|
def render(opt={})
|
56
58
|
noedit = false
|
57
59
|
self.params.merge!({ 'WIKI_VERSION' => ::WikiCloth::VERSION, 'RUBY_VERSION' => RUBY_VERSION })
|
58
|
-
self.options = { :output => :html, :link_handler => self.link_handler, :params => self.params, :sections => self.sections }.merge(opt)
|
60
|
+
self.options = { :fast => true, :output => :html, :link_handler => self.link_handler, :params => self.params, :sections => self.sections }.merge(opt)
|
59
61
|
self.options[:link_handler].params = options[:params]
|
60
62
|
data = self.sections.collect { |s| s.render(self.options) }.join
|
61
63
|
data.gsub!(/<!--(.|\s)*?-->/,"")
|
62
|
-
data << "\
|
64
|
+
data << "\ngarbage" if data.last(1) != "\n"
|
65
|
+
|
63
66
|
buffer = WikiBuffer.new("",options)
|
64
|
-
|
65
|
-
|
67
|
+
|
68
|
+
begin
|
69
|
+
if self.options[:fast]
|
70
|
+
until data.empty?
|
71
|
+
case data
|
72
|
+
when /\A\w+/
|
73
|
+
data = $'
|
74
|
+
@current_row += $&.length
|
75
|
+
buffer.add_word($&)
|
76
|
+
when /\A[^\w]+(\w|)/m
|
77
|
+
data = $'
|
78
|
+
$&.each_char { |c| add_current_char(buffer,c) }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
else
|
82
|
+
data.each_char { |c| add_current_char(buffer,c) }
|
83
|
+
end
|
84
|
+
rescue => err
|
85
|
+
debug_tree = buffer.buffers.collect { |b| b.debug }.join("-->")
|
86
|
+
puts "Unknown error on line #{@current_line} row #{@current_row}: #{debug_tree}"
|
87
|
+
raise err
|
88
|
+
end
|
89
|
+
|
90
|
+
buffer.eof()
|
91
|
+
buffer.to_s
|
66
92
|
end
|
67
93
|
|
94
|
+
def add_current_char(buffer,c)
|
95
|
+
if c == "\n"
|
96
|
+
@current_line += 1
|
97
|
+
@current_row = 1
|
98
|
+
else
|
99
|
+
@current_row += 1
|
100
|
+
end
|
101
|
+
buffer.add_char(c)
|
102
|
+
end
|
68
103
|
def to_html(opt={})
|
69
104
|
self.render(opt)
|
70
105
|
end
|
data/run_tests.rb
CHANGED
@@ -0,0 +1,293 @@
|
|
1
|
+
{{Begriffsklärungshinweis}}
|
2
|
+
[[Datei:Schulze and Gerard 01.jpg|miniatur|Klaus Schulze während eines Konzerts mit [[Lisa Gerrard]]]]
|
3
|
+
'''Klaus Schulze''' (* [[4. August]] [[1947]] in [[Berlin]]) ist ein deutscher [[Komponist]], [[Musiker]] und [[Musikproduzent|Produzent]]. Er gilt als einer der bedeutendsten Vertreter der [[Elektronische Musik|elektronischen Musik]].
|
4
|
+
|
5
|
+
== Werdegang ==
|
6
|
+
Klaus Schulze war zunächst Schlagzeuger der Berliner Formation [[Psy Free]] mit [[Alex Conti]]. Bekannt wurde er als Schlagzeuger bei [[Tangerine Dream]] um [[Edgar Froese]] und wirkte an deren erstem Album ''Electronic Meditation'' mit. Inspiriert wurde Klaus Schulze unter anderem durch die Minimalisten [[Terry Riley]] und [[Steve Reich]] sowie den amerikanischen Komponisten [[Morton Subotnick]] und durch [[Kunstmusik|klassisch-romantische Musik]] (unter anderem [[Richard Wagner]]). Er gründete zusammen mit [[Manuel Göttsching]] und [[Hartmut Enke ]] die Band [[Ash Ra Tempel]]. Auch von dieser trennte er sich jedoch, da es kaum möglich war, mit dem damaligen elektronischen Equipment live aufzutreten. Er widmete sich von nun an der Komposition atmosphärischer Klangteppiche wie ''Timewind'', ''Moondawn'' oder ''Mirage – Eine elektronische Winterlandschaft'', mit denen er - zusammen mit Tangerine Dream - zu einem der einflussreichsten Wegbereiter der Berliner Schule wurde. Diese Machart zeichnet sich – durchaus widersprüchlich – einerseits durch für heutige Maßstäbe (nach den Gewohnheiten der populären Musik) ungewöhnlich lange, von der kompositionstechnischen Seite aus eher simpel repetitiv „hypnotisch“ angelegte, und andererseits durch schroffe, geräuschhafte, oder die [[Tonalität (Musik)|Tonalität]] übersteigende Passagen aus. Besonders letztere gehen in ihrem künstlerischen Anspruch deutlich über populäre Musik hinaus in Richtung [[Kunstmusik]] und haben Schulze Anerkennung über die Grenzen der Szene hinaus eingebracht. Der lange anhaltende Markterfolg der Musik wäre somit überraschend, wenn nicht durch Technikbegeisterung, Soundeffekte oder durchgehenden Beat eine Kompensation für den Normalhörer erfolgen würde. Zu Anfang spielten die Musiker in Museen und bei Kunst-Events. 1971 entschied sich der Elektronikpionier, in Zukunft nicht mehr in Gruppen zu spielen und eigene Wege einzuschlagen. „Ich war von den Diskussionen in den Gruppen, die oft länger andauerten als die Zeit, in der wir Musik machten, genervt“, so Schulze in einem Interview von 2004. Trotzdem arbeitet Schulze mit anderen Musikern zusammen, so etwa mit dem Cellisten Wolfgang Tiepold (Trancefer), oder einer Streichergruppe („X“). Mit Harald Großkopf am Schlagzeug schuf er mehrere Alben, darunter ''Body Love Vol. 2''.
|
7
|
+
|
8
|
+
1973 gab Schulze sein erstes Solo-Konzert. Für seine LP ''Timewind'' erhielt er 1975 den französischen „Grand Prix International“. Eine ausgedehnte Tour führte ihn im selben Jahr durch [[Deutschland]] und [[Italien]]. Es folgten 1976 Konzerte mit der international besetzten Gruppe „Go“ in [[Paris]] und [[London]]. 1977 komponierte er die Filmmusik zum Pornofilm ''[[Body Love]]'' von Regisseur [[Lasse Braun]]. Die gleichnamige Soundtrack-LP erreichte den 2. Platz in den Import-Charts des [[Vereinigte Staaten|US]]-Magazin [[Billboard (Magazin)|Billboard]].
|
9
|
+
|
10
|
+
1978 gründete Schulze das [[Plattenlabel]] [[Innovative Communication]] und produzierte neben der Band [[Ideal (Band)|Ideal]] u.a. auch [[Robert Schroeder]], [[DIN A Testbild]], [[Lorry]] und [[Baffo Banfi]]. 1979 baute er ein zweites Studio und ein Video-Studio auf für Innovative Communication. Dann folgte eine zweimonatige Tour durch Europa mit dem Sänger [[Arthur Brown (Musiker)|Arthur Brown]]. 1980 gab Klaus das Eröffnungskonzert der [[ars electronica]] mit der ''Linzer Stahlsinfonie'', die überwiegend negatives Presseecho fand. Hierbei baute er seine Musik auf live aus dem Linzer Stahlwerk der VOEST-ALPINE AG eingespielten Werksgeräuschen auf. Die LP ''Dig It'', das erste vollständig digital produzierte Album überhaupt, erscheint im gleichen Jahr. ''Dig It'' wurde von der Fachzeitschrift „stereoplay“ 1981 als „bestes Klaus Schulze-Album überhaupt“ sowie als Referenzaufnahme für moderne [[Synthesizer]]-Produktionen als „LP des Monats“ gewertet. Schulze war damals der erste Besitzer des zu dieser Zeit revolutionären „GDS/GDS-Synergy“-Computersystems von „CRUMAR General Development System (GDS) und Digital Keyboard Inc.“, mit dem man verschiedene Tonspuren erstmals parallel aufnehmen konnte. „Die Zeit der analogen Rollstuhl-Elektronik ist endgültig vorbei“, so das Fachmagazin.
|
11
|
+
|
12
|
+
1983 wurde das Plattenlabel Innovative Communication verkauft und im darauffolgenden Jahr das Plattenlabel [[INTEAM]] gegründet, auf dem noch 1984 Manuel Göttschings Album [[E2-E4]] in einer limitierten Pressung erschien. Im gleichen Jahr schrieb Schulze den [[Soundtrack]] für den Film ''Angst''.
|
13
|
+
|
14
|
+
Ab 1986 setzte Schulze verstärkt auf den Einsatz von [[Musical Instrument Digital Interface|Midi]] und [[Sampling (Musik)|Sampling]]. Ebenfalls 1986 erstellte Schulze einen Remix für [[Frankie goes to Hollywood]]: Watching the Wildlife „Beobachtungen im Wilden Leben (Die Letzten Tage der Menschheit Mix)“. Auf der 12" wurde Schulze als Remixer dieses Projekts genannt. Später stellte sich heraus, dass er möglicherweise doch nicht für diesen Mix verantwortlich war. Klarheit darüber gibt es leider bisher nicht.
|
15
|
+
|
16
|
+
1988 folgte eine Co-Produktion mit der Pop-Gruppe [[Alphaville (Band)|Alphaville]]. In [[Dresden]] gab Schulze 1989 ein Konzert vor 6800 Zuhörern, 1991 ein Konzert vor dem [[Kölner Dom]] und ein Konzert in der [[London]]er [[Royal Festival Hall]]. Außerdem produzierte er in diesem Jahr seine letzte [[Schallplatte|Vinyl]]-LP.
|
17
|
+
|
18
|
+
Schulze gab 1994 Solo-Konzerte in [[Lille]], [[Paris]] und [[Rom]] (mit Standing Ovation in Paris, bevor Schulze auch nur eine Note gespielt hatte). 1995 erfolgten Produktionen und Aufnahmen mit der Pop-Gruppe [[SNAP!]].
|
19
|
+
|
20
|
+
1996 gab Schulze ein Konzert in [[Derby (Derbyshire)|Derby]], [[England]]; 1999 gab er Konzerte auf einem [[Jazz]]-Festival in [[Hamburg]] (gemeinsam mit Pete Namlook) und auf einem [[Techno]]- & [[Ambient]]-Festival in [[Köln]].
|
21
|
+
|
22
|
+
Im Jahre 2000 komponierte Klaus Schulze die Musik für die [[Jahrtausendwende|Millennium]]-Feier in [[Peking]], [[Volksrepublik China]].
|
23
|
+
|
24
|
+
2001 entstand in [[Osnabrück]] im Rahmen eines viel gelobten Live-Konzertes die Aufnahme ''Live at KlangArt, Teil 1 und 2''.
|
25
|
+
|
26
|
+
Im November 2003 gab Schulze in [[Polen]] ein Konzert gemeinsam mit dem Licht-Künstler [[Gert Hof]].
|
27
|
+
[[Datei:Schulze and Gerard 02.jpg|thumb|Lisa Gerrard und Klaus Schulze]]
|
28
|
+
Schulze erhielt im Jahre 2004 die Rechte früherer Alben von den damaligen Labels zurück und veröffentlicht nun über einen Zeitraum von mehreren Jahren insgesamt 100 Alben als Deluxe-Editionen auf dem deutschen Label [[SPV (Unternehmen)|SPV]] neu. Unter anderem erschien auch ''Dig It'' im aufwändigen Remastering-Gewand neu, enthalten ist auch eine DVD mit Aufnahmen der legendären ''Linzer Stahlsinfonie'' von 1980 sowie ein zusätzliches, bislang unveröffentlichtes Stück von Klaus Schulze. Im Rahmen der Deluxe-Edition erscheinen ebenfalls einzelne CDs aus den Boxen der ''Contemporary Works''-Serie. Im Oktober 2005 erschien, ebenfalls auf dem SPV-Label, das neue Studioalbum ''Moonlake'', das positiven Anklang unter Musikjournalisten fand.
|
29
|
+
|
30
|
+
Im Jahre 2006 war Schulze mehrmals in Filmausschnitten sowie als Interviewpartner in der sechsteiligen Serie „Kraut und Rüben“ im [[Westdeutscher Rundfunk|WDR]] zu sehen. Am 17. März 2006 zeigte das WDR-Programm ein ausführliches Interview mit Schulze sowie Ausschnitte eines seltenen Konzertes im Rahmen einer ausführlichen Dokumentation über die Entstehung der bekannteren Richtungen der elektronischen Musik in Deutschland, in der auch andere Synthesizer-Pioniere wie [[Edgar Froese]], [[Michael Rother]], Mitglieder der Gruppen [[Kraftwerk (Band)|Kraftwerk]], [[La Düsseldorf]], [[Neu!]], [[Cluster (Band)|Cluster]], [[Popol Vuh (Musik)|Popol Vuh]], der Rockmusiker [[Achim Reichel]] und andere zu Wort kommen. Diese Serie befasste sich mit der deutschen Rock- und Popgeschichte in den 1970er Jahren.
|
31
|
+
|
32
|
+
Für das Anfang 2008 erschienene Album ''Sehnsucht'' des Projektes [[Schiller (Musikprojekt)|Schiller]] steuerte Klaus Schulze das Stück ''Zenit'' bei. Ein Auszug von über zwölf Minuten Länge fand sich auf der CD; komplette, 35 Minuten lange Fassung wurde auf der DVD sowie als Bonustitel des Albums ''Sehnsucht live'' veröffentlicht.
|
33
|
+
|
34
|
+
Im November 2007 nahm Schulze Kontakt mit der australischen Künstlerin [[Lisa Gerrard]] auf. Es entstand das Doppelalbum „Farscape“, das Anfang Juli 2008 erschien. Aufgrund der guten Zusammenarbeit lud Schulze Gerrard dazu ein, am 18. Juli 2008 gemeinsam mit ihm im Rahmen eines [[Progressive Rock|Progressive-Rock]]-Festivals gemeinsam auf der Freilichtbühne [[Loreley]] aufzutreten. Ein Mitschnitt des Konzerts wurde unter dem Titel ''Rheingold'' als Doppel-CD sowie als DVD veröffentlicht. Im November 2008 folgten weitere Konzerte von Schulze und Gerrard in [[Berlin]] und [[Warschau]], welche im Juni 2009 als DVD und CD ''Dziekuje Bardzo'' erschienen.
|
35
|
+
|
36
|
+
Die meisten Stücke der in der ''Ultimate Edition'' erschienenen (und komplett vergriffenen) 50 CDs werden ab Februar 2009 als 3-fach CDs unter dem Namen ''La Vie Electronique'' (LVE) neu veröffentlicht.
|
37
|
+
|
38
|
+
Im März 2010 spielte Klaus Schulze zum ersten mal in Japan. Von den vom Tokyo Wax Museum inititiierten 2 Konzerten erschien im November die 2CD+DVD-Box "Big In Japan - Live in Tokyo 2010".
|
39
|
+
|
40
|
+
== Klaus Schulzes Big Moog ==
|
41
|
+
Klaus Schulzes ''Big [[Robert Moog|Moog]]'' Modularsystem ist einer der legendären Synthesizer der 1970er Jahre. Das aus den Händen von [[Florian Fricke]] stammende etwa 100 kg schwere System war während der zweiten Hälfte der 1970er Jahre bis zum Erscheinen des Albums ''Dig It'' Schulzes Hauptsynthesizer. Dieser Moog Modularsynthesizer III p mit [[Sequenzer (Musik)|Sequenzer]]-Ergänzung B besitzt auf einer Fläche von 1,16 Quadratmeter mehr als 100 Drehknöpfe, Schalter und Buchsen für Verbindungskabel. Durch das programmierbare [[Doepfer]]-Interface MCV 24 wurde das System weitgehend midifiziert.
|
42
|
+
|
43
|
+
Das System war noch Anfang März 2005 für die ''The Dark Side of the Moog X'' in vollem Einsatz. Am 23. März 2005 wurde es auf [[Ebay]] versteigert.
|
44
|
+
|
45
|
+
== Bibliographie ==
|
46
|
+
* Michael Schwinn: ''Klaus Schulze. … eine musikalische Gratwanderung.'' Buchverlag Michael Schwinn, Neustadt 1986, ISBN 3-925077-04-9
|
47
|
+
* Klaus Schulze: ''The Works'' (ständig aktualisierte kostenpflichtige Sammlung aller KS-Aktivität. Erhältlich über die KS-Webseite)
|
48
|
+
* ''KS-Circle'' (per Post verschickter kostenpflichtiger Newsletter zum Abonnieren. Erhältlich über die KS-Webseite)
|
49
|
+
|
50
|
+
== Diskographie ==
|
51
|
+
=== Soloalben ===
|
52
|
+
{|width="100%" align="center"|
|
53
|
+
|width="50%" valign="50%"|
|
54
|
+
* ''Irrlicht'' (1972)
|
55
|
+
* ''Cyborg'' (1973)
|
56
|
+
* ''Blackdance'' (1974)
|
57
|
+
* ''Picture Music'' (1975)
|
58
|
+
* ''Timewind'' (1975)
|
59
|
+
* ''Moondawn'' (1976)
|
60
|
+
* ''Body Love'' (Soundtrack) (1977)
|
61
|
+
* ''Mirage'' (1977)
|
62
|
+
* ''Body Love Vol. 2'' (1977)
|
63
|
+
* ''X'' (1978)
|
64
|
+
* ''Dune'' (1979)
|
65
|
+
* ''...Live...'' (Live) (1980)
|
66
|
+
* ''Dig It'' (1980)
|
67
|
+
* ''Trancefer'' (1981)
|
68
|
+
* ''Audentity'' (1983)
|
69
|
+
* ''Dziekuje Poland'' (live) (1983)
|
70
|
+
* ''Angst'' (Soundtrack) (1984)
|
71
|
+
* ''Inter*Face'' (1985)
|
72
|
+
* ''Dreams'' (1986)
|
73
|
+
* ''En=Trance'' (1988)
|
74
|
+
* ''Miditerranean Pads'' (1990)
|
75
|
+
* ''The Dresden Performance'' (Live) (1990)
|
76
|
+
* ''Beyond Recall'' (1991)
|
77
|
+
|width="50%" valign="50%"|
|
78
|
+
* ''Royal Festival Hall Vol. 1'' (Live) (1992)
|
79
|
+
* ''Royal Festival Hall Vol. 2'' (Live) (1992)
|
80
|
+
* ''The Dome Event'' (Live) (1993)
|
81
|
+
* ''Le Moulin de Daudet'' (Soundtrack) (1994)
|
82
|
+
* ''Goes Classic'' (1994)
|
83
|
+
* ''Totentag'' (Oper) (1994)
|
84
|
+
* ''Das Wagner Desaster – Live –'' (Live) (1994)
|
85
|
+
* ''In Blue'' (1995)
|
86
|
+
* ''Are You Sequenced?'' (1996)
|
87
|
+
* ''Dosburg Online'' (1997)
|
88
|
+
* ''Live @ KlangArt 1'' (Live) (2001)
|
89
|
+
* ''Live @ KlangArt 2'' (Live) (2001)
|
90
|
+
* ''Andromeda (Promo-CD)'' (2003)
|
91
|
+
* ''Ion (Promo-CD)'' (2004)
|
92
|
+
* ''Moonlake'' (2005)
|
93
|
+
* ''Kontinuum'' (2007)
|
94
|
+
* ''Farscape'' (2008) mit [[Lisa Gerrard]]
|
95
|
+
* ''Rheingold'' (2008) mit [[Lisa Gerrard]]
|
96
|
+
* ''Dziekuje Bardzo'' (2009) mit [[Lisa Gerrard]]
|
97
|
+
* ''La Vie Electronique 1 - 4'' (2009)
|
98
|
+
* ''La Vie Electronique 5 - 8'' (2010)
|
99
|
+
* ''Big in Japan'' (Live) (2010)
|
100
|
+
* ''La Vie Electronique 9 - 10'' (2011)
|
101
|
+
|-
|
102
|
+
|}
|
103
|
+
|
104
|
+
=== Wahnfried-Alben ===
|
105
|
+
{|width="100%" align="center"|
|
106
|
+
|width="50%" valign="50%"|
|
107
|
+
* ''Time Actor'' (1979)
|
108
|
+
* ''Tonwelle'' (1981)
|
109
|
+
* ''Megatone'' (1984)
|
110
|
+
* ''Miditation'' (1986)
|
111
|
+
|width="50%" valign="50%"|
|
112
|
+
* ''Trancelation'' (1994)
|
113
|
+
* ''Trance Appeal'' (1996)
|
114
|
+
* ''Drums 'n' Balls (The Gancha Dub)'' (1997)
|
115
|
+
|-
|
116
|
+
|}
|
117
|
+
|
118
|
+
=== Weitere Veröffentlichungen ===
|
119
|
+
{|width="100%" align="center"|
|
120
|
+
|width="50%" valign="50%"|
|
121
|
+
* ''Land'' (1971)
|
122
|
+
* ''Macksy'' (1985)
|
123
|
+
* ''Berlin 1'' (1986)
|
124
|
+
* ''Unikat'' (1989)
|
125
|
+
* ''Face of Mae West'' (1990)
|
126
|
+
* ''Große Gaukler Gottes'' (1994)
|
127
|
+
* ''Vas Insigne Electionis'' (1994)
|
128
|
+
* ''Conquest Of Paradise'' (1994)
|
129
|
+
* ''Soirée Académique'' (1996)
|
130
|
+
* ''Les Bruits des Origines'' (1996)
|
131
|
+
* ''Dédié à Hartmut'' (1996)
|
132
|
+
|width="50%" valign="50%"|
|
133
|
+
* ''Ooze Away'' (1996)
|
134
|
+
* ''Ein würdiger Abschluß<!--sic-->'' (1996)
|
135
|
+
* ''Dreieinhalb Stunden'' (1996)
|
136
|
+
* ''Himmel und Erde'' (1996)
|
137
|
+
* ''Der vierte Kuss'' (1996)
|
138
|
+
* ''The Schulzendorf Groove'' (1998)
|
139
|
+
* ''Manikin Jubilee'' (2002)
|
140
|
+
* ''Schrittmacher'' (2004)
|
141
|
+
* ''Invisible Musik'' (2007)
|
142
|
+
|-
|
143
|
+
|}
|
144
|
+
|
145
|
+
=== 'Dark Side of the Moog'-Serie (mit [[Peter Kuhlmann (Musikproduzent)|Pete Namlook]]) ===
|
146
|
+
{|width="100%" align="center"|
|
147
|
+
|width="50%" valign="50%"|
|
148
|
+
* ''The Dark Side of the Moog I'' (1994)
|
149
|
+
* ''The Dark Side of the Moog II'' (1994)
|
150
|
+
* ''The Dark Side of the Moog III'' (1995)
|
151
|
+
* ''The Dark Side of the Moog IV'' (1996) (mit [[Bill Laswell]])
|
152
|
+
* ''The Dark Side of the Moog V'' (1996)
|
153
|
+
* ''The Dark Side of the Moog VI'' (1997)
|
154
|
+
|width="50%" valign="50%"|
|
155
|
+
* ''The Dark Side of the Moog VII'' (1998)
|
156
|
+
* ''The Dark Side of the Moog VIII'' (1999)
|
157
|
+
* ''The Dark Side of the Moog IX'' (2002)
|
158
|
+
* ''The Dark Side of the Moog X'' (2005)
|
159
|
+
* ''The Dark Side of the Moog XI'' (2008)
|
160
|
+
|-
|
161
|
+
|}
|
162
|
+
|
163
|
+
=== Sampler ===
|
164
|
+
{|width="100%" align="center"|
|
165
|
+
|width="50%" valign="50%"|
|
166
|
+
* ''Mindphaser'' (1981)
|
167
|
+
* ''Star Action'' (1982)
|
168
|
+
* ''2001'' (1991)
|
169
|
+
* ''History'' (1988)
|
170
|
+
|width="50%" valign="50%"|
|
171
|
+
* ''The Essential 72–93'' (1994)
|
172
|
+
* ''Trailer'' (1999)
|
173
|
+
* ''The Evolution of The Dark Side of the Moog (mit [[Peter Kuhlmann (Musikproduzent)|Pete Namlook]])'' (2002)
|
174
|
+
|-
|
175
|
+
|}
|
176
|
+
|
177
|
+
=== CD-Sets ===
|
178
|
+
{|width="100%" align="center"|
|
179
|
+
|width="50%" valign="50%"|
|
180
|
+
* ''Silver Edition'' (10 CDs) (1993)
|
181
|
+
* ''Historic Edition'' (10 CDs) (1995)
|
182
|
+
* ''Jubilee Edition'' (25 CDs) (1997)
|
183
|
+
|width="50%" valign="50%"|
|
184
|
+
* ''The Ultimate Edition'' (Sampler) (50 CDs) (2000)
|
185
|
+
* ''Contemporary Works I'' (10 CDs) (2000) – CD „Vanity of Sounds“ als „Deluxe Edition“ im Dezember 2005
|
186
|
+
* ''Contemporary Works II'' (5 CDs, ggf. mit sechster, limitierter Bonus-CD) (2002)
|
187
|
+
|-
|
188
|
+
|}
|
189
|
+
|
190
|
+
=== DVD ===
|
191
|
+
{|width="100%" align="center"|
|
192
|
+
|width="50%" valign="50%"|
|
193
|
+
* ''Rheingold – Live At The Loreley'' (mit [[Lisa Gerrard]]) (2 DVDs) (2008)
|
194
|
+
* ''Dziękuję Bardzo – Vielen Dank (Live in Warschau)'' (mit [[Lisa Gerrard]]) (2009)
|
195
|
+
|width="50%" valign="50%"|
|
196
|
+
|-
|
197
|
+
|}
|
198
|
+
|
199
|
+
=== Zusammenarbeiten mit anderen Künstlern ===
|
200
|
+
{|width="100%" align="center"|
|
201
|
+
|width="50%" valign="50%"|
|
202
|
+
* ''Electronic Meditation (mit [[Tangerine Dream]])'' (1970)
|
203
|
+
* ''Ash Ra Tempel (mit [[Ash Ra Tempel]])'' (1971)
|
204
|
+
* ''Join Inn (mit Ash Ra Tempel)'' (1973)
|
205
|
+
* ''Tarot (mit [[Walter Wegmüller]])'' (1973)
|
206
|
+
* ''Lord Krishna von Goloka (mit [[Sergius Golowin]])'' (1973)
|
207
|
+
* ''The Cosmic Jokers (mit [[The Cosmic Jokers]])'' (1974)
|
208
|
+
* ''Planeten Sit In (mit The Cosmic Jokers)'' (1974)
|
209
|
+
* ''Galactic Supermarket (mit The Cosmic Jokers)'' (1974)
|
210
|
+
* ''Sci Fi Party (mit The Cosmic Jokers)'' (1974)
|
211
|
+
* ''Gilles Zeitschiff (mit The Cosmic Jokers)'' (1974)
|
212
|
+
* ''Go (mit [[Stomu Yamashta]])'' (1976)
|
213
|
+
* ''Go Live From Paris (mit Stomu Yamashta)'' (1976)
|
214
|
+
* ''[[Go Too]] (mit Stomu Yamashta)'' (1977)
|
215
|
+
|width="50%" valign="50%"|
|
216
|
+
* ''Programm 2 [[DIN A Testbild]] (1981)
|
217
|
+
* ''Dziekuje Poland (Live, mit [[Rainer Bloss]])'' (1983)
|
218
|
+
* ''Aphrica (mit Rainer Bloss und [[Ernst Fuchs (Maler)|Ernst Fuchs]])'' (1984)
|
219
|
+
* ''Drive Inn (mit Rainer Bloss)'' (1984)
|
220
|
+
* ''Transfer Station Blue (mit [[Michael Shrieve]] und [[Kevin Shrieve]])'' (1984)
|
221
|
+
* ''Babel (mit [[Andreas Grosser]])'' (1987)
|
222
|
+
* ''The Breathtaking Blue (mit [[Alphaville (Band)|Alphaville]])'' (1989)
|
223
|
+
* ''Friendship (mit Ash Ra Tempel)'' (2000)
|
224
|
+
* ''Gin Rosé at the Royal Festival Hall (mit Ash Ra Tempel)'' (2000)
|
225
|
+
* ''tvs2 (mit [[tvs]])'' (2002)
|
226
|
+
* ''Guestbook (mit [[Solar Moon System]])'' (2003)
|
227
|
+
* ''Zenit (mit [[Schiller (Musikprojekt)|Schiller]])'' (2008)
|
228
|
+
* ''Farscape (mit [[Lisa Gerrard]])'' (2008)
|
229
|
+
* ''Come Quietly (mit Lisa Gerrard)'' (2009)
|
230
|
+
|-
|
231
|
+
|}
|
232
|
+
|
233
|
+
=== Remixes von Stücken anderer Künstler ===
|
234
|
+
{|width="100%" align="center"|
|
235
|
+
|width="50%" valign="50%"|
|
236
|
+
* ''Big In Japan (Alphaville)'' (1988)
|
237
|
+
* ''Die Sonne ([[Gudrun Gut]] & [[Blixa Bargeld]])'' (1996)
|
238
|
+
* ''We are what we are ([[Armageddon Dildos]])'' (1996)
|
239
|
+
* ''Electrosonic ([[Associated Music Publishers|AMP]])'' (1998)
|
240
|
+
|width="50%" valign="50%"|
|
241
|
+
* ''Outer Canal Street (Solar Moon System)'' (2000)
|
242
|
+
* ''Trasyyqhu ([[Wave World]])'' (2002)
|
243
|
+
* ''Let Me Love You ([[Schiller (Musikprojekt)|Schiller]])'' (2008)
|
244
|
+
|-
|
245
|
+
|}
|
246
|
+
|
247
|
+
== Weblinks ==
|
248
|
+
{{Commonscat}}
|
249
|
+
* http://www.klaus-schulze.com/ – Offizielle Homepage
|
250
|
+
* [http://ks.synthmusic.info/ Elektronische Musik] – Deutsches Fan Forum über Klaus Schulze
|
251
|
+
* {{DNB-Portal|118832425}}
|
252
|
+
* [http://www.laut.de/wortlaut/artists/s/schulze_klaus/index.htm Klaus Schulze] bei [[laut.de]]
|
253
|
+
* [http://www.rainhorse.de rainhorse.de] – Plattenlabel mit Aufnahmen von Klaus Schulze
|
254
|
+
* [http://www.insideout.de/indexx.php?arg=AxcAAg8ES0FSVAEES0FSM4I InsideOut] – Plattenlabel SPV (Deluxe Edition)
|
255
|
+
|
256
|
+
{{Normdaten|PND=118832425|LCCN=n/82/102317|VIAF=22938501}}
|
257
|
+
|
258
|
+
{{SORTIERUNG:Schulze, Klaus}}
|
259
|
+
[[Kategorie:Synthesizer-Spieler]]
|
260
|
+
[[Kategorie:Person (Berlin)]]
|
261
|
+
[[Kategorie:Deutscher Musiker]]
|
262
|
+
[[Kategorie:Geboren 1947]]
|
263
|
+
[[Kategorie:Mann]]
|
264
|
+
|
265
|
+
{{Personendaten
|
266
|
+
|NAME=Schulze, Klaus
|
267
|
+
|ALTERNATIVNAMEN=Wahnfried, Richard (Pseudonym)
|
268
|
+
|KURZBESCHREIBUNG=deutscher Komponist, Musiker, Produzent, Pionier der Elektronischen Musik
|
269
|
+
|GEBURTSDATUM=4. August 1947
|
270
|
+
|GEBURTSORT=[[Berlin]], Deutschland
|
271
|
+
|STERBEDATUM=
|
272
|
+
|STERBEORT=
|
273
|
+
}}
|
274
|
+
|
275
|
+
[[ar:كلاوس شولتزه]]
|
276
|
+
[[ca:Klaus Schulze]]
|
277
|
+
[[en:Klaus Schulze]]
|
278
|
+
[[es:Klaus Schulze]]
|
279
|
+
[[fa:کلاوس شولتز]]
|
280
|
+
[[fi:Klaus Schulze]]
|
281
|
+
[[fr:Klaus Schulze]]
|
282
|
+
[[gl:Klaus Schulze]]
|
283
|
+
[[it:Klaus Schulze]]
|
284
|
+
[[ja:クラウス・シュルツェ]]
|
285
|
+
[[ka:კლაუს შულცე]]
|
286
|
+
[[nl:Klaus Schulze]]
|
287
|
+
[[pl:Klaus Schulze]]
|
288
|
+
[[pt:Klaus Schulze]]
|
289
|
+
[[ro:Klaus Schulze]]
|
290
|
+
[[ru:Шульце, Клаус]]
|
291
|
+
[[sv:Klaus Schulze]]
|
292
|
+
[[uk:Клаус Шульце]]
|
293
|
+
|
data/test/wiki_cloth_test.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.expand_path(File.join(File.dirname(__FILE__),'test_helper'))
|
2
3
|
|
3
4
|
class WikiParser < WikiCloth::Parser
|
5
|
+
url_for do |page|
|
6
|
+
page
|
7
|
+
end
|
8
|
+
|
4
9
|
template do |template|
|
5
10
|
case template
|
6
11
|
when "noinclude"
|
@@ -15,6 +20,12 @@ class WikiParser < WikiCloth::Parser
|
|
15
20
|
"{{{{{test|bla}}|wtf}}}"
|
16
21
|
when "loop"
|
17
22
|
"{{loop}}"
|
23
|
+
when "tablebegin"
|
24
|
+
"<table>"
|
25
|
+
when "tablemid"
|
26
|
+
"<tr><td>test</td></tr>"
|
27
|
+
when "tableend"
|
28
|
+
"</table>"
|
18
29
|
end
|
19
30
|
end
|
20
31
|
external_link do |url,text|
|
@@ -24,12 +35,49 @@ end
|
|
24
35
|
|
25
36
|
class WikiClothTest < ActiveSupport::TestCase
|
26
37
|
|
38
|
+
test "math tag" do
|
39
|
+
wiki = WikiParser.new(:data => "<math>1-\frac{k}{|E(G_j)|}</math>")
|
40
|
+
begin
|
41
|
+
data = wiki.to_html
|
42
|
+
assert true
|
43
|
+
rescue
|
44
|
+
assert false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
27
48
|
test "links and references" do
|
28
49
|
wiki = WikiCloth::Parser.new(:data => File.open(File.join(File.dirname(__FILE__), '../sample_documents/george_washington.wiki'), READ_MODE) { |f| f.read })
|
29
50
|
data = wiki.to_html
|
30
51
|
assert wiki.external_links.size == 38
|
31
52
|
assert wiki.references.size == 76
|
32
|
-
assert wiki.internal_links.size ==
|
53
|
+
assert wiki.internal_links.size == 322
|
54
|
+
assert wiki.categories.size == 27
|
55
|
+
assert wiki.languages.size == 101
|
56
|
+
end
|
57
|
+
|
58
|
+
test "links with imbedded links" do
|
59
|
+
wiki = WikiParser.new(:data => "[[Datei:Schulze and Gerard 01.jpg|miniatur|Klaus Schulze während eines Konzerts mit [[Lisa Gerrard]]]] hello world")
|
60
|
+
data = wiki.to_html
|
61
|
+
assert data =~ /Lisa Gerrard/
|
62
|
+
end
|
63
|
+
|
64
|
+
test "links with trailing letters" do
|
65
|
+
wiki = WikiParser.new(:data => "[[test]]s [[rawr]]alot [[some]]thi.ng [[a]] space")
|
66
|
+
data = wiki.to_html
|
67
|
+
assert data =~ /tests/
|
68
|
+
assert data =~ /href="test"/
|
69
|
+
assert data =~ /rawralot/
|
70
|
+
assert data !~ /something/
|
71
|
+
assert data !~ /aspace/
|
72
|
+
end
|
73
|
+
|
74
|
+
test "piped links with trailing letters" do
|
75
|
+
wiki = WikiParser.new(:data => "[[a|b]]c [[b|c]]d<nowiki>e</nowiki>")
|
76
|
+
data = wiki.to_html
|
77
|
+
assert data =~ /bc/
|
78
|
+
assert data =~ /href="a"/
|
79
|
+
assert data =~ /cd/
|
80
|
+
assert data !~ /cde/
|
33
81
|
end
|
34
82
|
|
35
83
|
test "Embedded images with no explicit title" do
|
@@ -107,6 +155,13 @@ EOS
|
|
107
155
|
data = wiki.to_html
|
108
156
|
assert data =~ /whoo/
|
109
157
|
end
|
158
|
+
|
159
|
+
test "table spanning template" do
|
160
|
+
wiki = WikiParser.new(:data => "{{tablebegin}}{{tablemid}}{{tableend}}")
|
161
|
+
data = wiki.to_html
|
162
|
+
puts data
|
163
|
+
assert data =~ /test/
|
164
|
+
end
|
110
165
|
|
111
166
|
test "horizontal rule" do
|
112
167
|
wiki = WikiParser.new(:data => "----\n")
|
@@ -136,7 +191,7 @@ EOS
|
|
136
191
|
count += 1
|
137
192
|
ret
|
138
193
|
}
|
139
|
-
|
194
|
+
assert_equal count.to_s, "6"
|
140
195
|
end
|
141
196
|
|
142
197
|
test "noinclude and includeonly tags" do
|
@@ -173,10 +228,10 @@ EOS
|
|
173
228
|
test "disable edit stuff" do
|
174
229
|
wiki = WikiParser.new(:data => "= Hallo =")
|
175
230
|
data = wiki.to_html
|
176
|
-
assert_equal data, "<p
|
231
|
+
assert_equal data, "\n<p><h1><span class=\"editsection\">[<a href=\"?section=Hallo\" title=\"Edit section: Hallo\">edit</a>]</span> <span class=\"mw-headline\" id=\"Hallo\"><a name=\"Hallo\">Hallo</a></span></h1></p>"
|
177
232
|
|
178
233
|
data = wiki.to_html(:noedit => true)
|
179
|
-
assert_equal data, "<p
|
234
|
+
assert_equal data, "\n<p><h1><span class=\"mw-headline\" id=\"Hallo\"><a name=\"Hallo\">Hallo</a></span></h1></p>"
|
180
235
|
|
181
236
|
end
|
182
237
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wikicloth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 7
|
9
|
+
- 0
|
10
|
+
version: 0.7.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Ricciardi
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-07-19 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- sample_documents/lists.wiki
|
104
104
|
- sample_documents/elements.wiki
|
105
105
|
- sample_documents/tv.wiki
|
106
|
+
- sample_documents/klaus_schulze.wiki
|
106
107
|
- sample_documents/random.wiki
|
107
108
|
- sample_documents/air_force_one.wiki
|
108
109
|
- sample_documents/cheatsheet.wiki
|