wikicloth 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.element_name
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 ESCAPED_TAGS.include?(self.element_name) ? false : true
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.data = ""
61
- return false
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}> #{cell[:value].strip}\n</#{cell[:type]}>"
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
- self.data.gsub!(/^([=]{1,6})\s*(.*?)\s*(\1)/) { |r|
164
- "<h#{$1.length}>#{$2}</h#{$1.length}>"
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
- lines = self.data.split("\n")
174
- self.data = ""
175
- for line in lines
176
- if !@list_data.empty? && (line.blank? || line =~ /^([^#\*:;]+)/)
177
- tmp = ""
178
- @list_data.reverse!
179
- @list_data.each { |x| tmp += "</" + list_inner_tag_for(x) + "></#{list_tag_for(x)}>" }
180
- line = "#{tmp} #{line}"
181
- @list_data = []
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
- line.gsub!(/^([#\*:;]+)(.*)$/) { |r|
184
- cdata = []
185
- tmp = ""
186
- $1.each_char { |c| cdata << c }
187
- if @list_data.empty?
188
- tmp += "<#{list_tag_for(cdata[0])}>"
189
- cdata[1..-1].each { |x| tmp += "<" + list_inner_tag_for(cdata[0]) + "><#{list_tag_for(x)}>" } if cdata.size > 1
190
- else
191
- case
192
- when cdata.size > @list_data.size
193
- i = cdata.size-@list_data.size
194
- cdata[-i,i].each { |x| tmp += "<#{list_tag_for(x)}>" }
195
- when cdata.size < @list_data.size
196
- i = @list_data.size-cdata.size
197
- nlist = @list_data[-i,i].reverse
198
- nlist.each { |x| tmp += "</" + list_inner_tag_for(x) + "></#{list_tag_for(x)}>" }
199
- tmp += "</#{list_inner_tag_for(cdata.last)}>"
200
- else
201
- if cdata != @list_data
202
- # FIXME: this will only work if the change depth is one level
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
- @list_data = cdata
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 toc_children(children)
25
- ret = "<ul>"
26
- for child in children
27
- ret += "<li><a href=\"##{child.id}\">#{child.title}</a>"
28
- ret += toc_children(child.children) unless child.children.empty?
29
- ret += "</li>"
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
- "#{ret}</ul>"
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><ul>"
36
- for section in sections[0].children
37
- ret += "<li><a href=\"##{section.id}\">#{section.title}</a>"
38
- ret += toc_children(section.children) unless section.children.empty?
39
- ret += "</li>"
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
- "#{ret}</ul></td></tr></table>"
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 ["image","file","media"].include?(prefix)
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 type == "thumb" || type == "thumbnail" || type == "frame"
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.6.3"
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 << "\n" if data.last(1) != "\n"
64
+ data << "\ngarbage" if data.last(1) != "\n"
65
+
63
66
  buffer = WikiBuffer.new("",options)
64
- data.each_char { |c| buffer.add_char(c) }
65
- "<p>"+buffer.to_s.gsub(/\n\s*\n/m) { |p| "</p>\n\n<p>" }+"</p>"
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
@@ -35,6 +35,7 @@ puts @wiki.to_html
35
35
 
36
36
  Dir.glob("sample_documents/*.wiki").each do |x|
37
37
 
38
+ puts "starting #{x}"
38
39
  start_time = Time.now
39
40
  out_name = "#{x}.html"
40
41
  data = File.open(x, READ_MODE) { |x| x.read }
@@ -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.&nbsp;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
+
@@ -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 == 450
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
- assert count == 6
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>\n<h1><span class=\"editsection\">&#91;<a href=\"?section=Hallo\" title=\"Edit section: Hallo\">edit</a>&#93;</span> <span class=\"mw-headline\" id=\"Hallo\"><a name=\"Hallo\">Hallo</a></span></h1></p>"
231
+ assert_equal data, "\n<p><h1><span class=\"editsection\">&#91;<a href=\"?section=Hallo\" title=\"Edit section: Hallo\">edit</a>&#93;</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>\n<h1><span class=\"mw-headline\" id=\"Hallo\"><a name=\"Hallo\">Hallo</a></span></h1></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: 1
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 3
10
- version: 0.6.3
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-01-31 00:00:00 +00:00
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