<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://workspace.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Redmine_ultraviolet_plugin_debug</id>
	<title>Redmine ultraviolet plugin debug - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://workspace.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Redmine_ultraviolet_plugin_debug"/>
	<link rel="alternate" type="text/html" href="https://workspace.onionmixer.net/wiki/index.php?title=Redmine_ultraviolet_plugin_debug&amp;action=history"/>
	<updated>2026-04-19T19:39:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://workspace.onionmixer.net/wiki/index.php?title=Redmine_ultraviolet_plugin_debug&amp;diff=538&amp;oldid=prev</id>
		<title>Onionmixer at 01:15, 8 April 2014</title>
		<link rel="alternate" type="text/html" href="https://workspace.onionmixer.net/wiki/index.php?title=Redmine_ultraviolet_plugin_debug&amp;diff=538&amp;oldid=prev"/>
		<updated>2014-04-08T01:15:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;redmine_ultraviolet 실패한 디버깅노트&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==시작은 이랬다==&lt;br /&gt;
&lt;br /&gt;
redmine 에서 저장소 보기 &amp;gt; 파일보기 를 누르는 경우. 웹페이지에서....&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
Internal error&lt;br /&gt;
&lt;br /&gt;
An error occurred on the page you were trying to access.&lt;br /&gt;
If you continue to experience problems please contact your Redmine administrator for assistance.&lt;br /&gt;
&lt;br /&gt;
If you are the Redmine administrator, check your log files for details about the error.&lt;br /&gt;
&lt;br /&gt;
Back&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
위와같은 에러가 나온다. 뭔가 이상해서 redmine의 log를 뒤지기 시작. 본인의 경우는 production.log 파일이었음. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 에러에서 refresh 를 하면 아래와 같은 에러가 나옴.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Processing RepositoriesController#entry (for 180.191.6.73 at 2013-05-05 22:00:10) [GET]&lt;br /&gt;
  Parameters: {&amp;quot;id&amp;quot;=&amp;gt;&amp;quot;yourID&amp;quot;, &amp;quot;action&amp;quot;=&amp;gt;&amp;quot;entry&amp;quot;, &amp;quot;controller&amp;quot;=&amp;gt;&amp;quot;repositories&amp;quot;, &amp;quot;rev&amp;quot;=&amp;gt;&amp;quot;ktour_dev&amp;quot;, &amp;quot;path&amp;quot;=&amp;gt;[&amp;quot;composer.json&amp;quot;]}&lt;br /&gt;
Rendering template within layouts/base&lt;br /&gt;
Rendering repositories/entry&lt;br /&gt;
&lt;br /&gt;
ActionView::TemplateError (Output for xhtml in  style is not yet implemented) on line #15 of vendor/plugins/redmine_ultraviolet/app/views/common/_file.rhtml:&lt;br /&gt;
12: &amp;lt;/style&amp;gt;&lt;br /&gt;
13: &lt;br /&gt;
14: &amp;lt;div class=&amp;quot;uv-file&amp;quot;&amp;gt;&lt;br /&gt;
15:   &amp;lt;%= syntax_highlight( filename, Redmine::CodesetUtil.to_utf8_by_setting(content) ) %&amp;gt;&lt;br /&gt;
16: &amp;lt;/div&amp;gt;&lt;br /&gt;
17: &lt;br /&gt;
18: &amp;lt;% content_for :header_tags do %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ultraviolet (1.0.0) lib/uv/render_processor.rb:14:in `load&amp;#039;&lt;br /&gt;
    ultraviolet (1.0.0) lib/uv.rb:84:in `parse&amp;#039;&lt;br /&gt;
    vendor/plugins/redmine_ultraviolet/app/views/common/_file.rhtml:15:in `_run_rhtml_vendor47plugins47redmine_ultraviolet47app47views47common47_file46rhtml_locals_content_file_filename_object&amp;#039;&lt;br /&gt;
    app/views/repositories/entry.html.erb:11&lt;br /&gt;
    thin (1.3.1) lib/thin/connection.rb:80:in `pre_process&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/connection.rb:78:in `catch&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/connection.rb:78:in `pre_process&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/connection.rb:53:in `process&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/connection.rb:38:in `receive_data&amp;#039;&lt;br /&gt;
    eventmachine (0.12.10) lib/eventmachine.rb:256:in `run_machine&amp;#039;&lt;br /&gt;
    eventmachine (0.12.10) lib/eventmachine.rb:256:in `run&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/backends/base.rb:61:in `start&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/server.rb:159:in `start&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/controllers/controller.rb:86:in `start&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/runner.rb:185:in `send&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/runner.rb:185:in `run_command&amp;#039;&lt;br /&gt;
    thin (1.3.1) lib/thin/runner.rb:151:in `run!&amp;#039;&lt;br /&gt;
    thin (1.3.1) bin/thin:6&lt;br /&gt;
    /usr/bin/thin:8:in `load&amp;#039;&lt;br /&gt;
    /usr/bin/thin:8&lt;br /&gt;
&lt;br /&gt;
Rendering /var/lib/redmine/public/500.html (500 Internal Server Error)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호라....... 그럼 지금부터 에러의 내용을 따라 관련된 파일들을 살펴보기로 한다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==에러처리를 위한 디버깅==&lt;br /&gt;
&lt;br /&gt;
저 에러에서 보면 &amp;#039;&amp;#039;&amp;#039;ultraviolet (1.0.0) lib/uv/render_processor.rb:14:in `load&amp;#039;&amp;#039;&amp;#039;&amp;#039; 부분이 있다.&lt;br /&gt;
&lt;br /&gt;
그래서 &amp;#039;&amp;#039;&amp;#039;/usr/lib64/ruby/gems/1.8/gems/ultraviolet-1.0.0/lib/uv/render_processor.rb&amp;#039;&amp;#039;&amp;#039; 파일을 살펴보기로 했다.&lt;br /&gt;
&lt;br /&gt;
그랬더니 13번째 줄에&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
renderer = File.join( Uv.render_path, output,&amp;quot;#{style}.render&amp;quot;)&lt;br /&gt;
raise( ArgumentError, &amp;quot;Output for #{output} in #{style} style is not yet implemented&amp;quot; ) unless File.exists?(renderer)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
위와같은 부분이 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
에러메세지를 다시 살펴보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
Output for xhtml in  style is not yet implemented&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
위의와같은 부분을 분명히 확인할 수 있다. 아마도 #{style} 에 해당하는 부분이 안넘어가는듯?&amp;lt;ref name=&amp;quot;주석1&amp;quot;&amp;gt;Ruby 에서는 문자열(String) 을 &amp;#039; &amp;#039; 또는 &amp;quot; &amp;quot; 으로 표현을 하는데 이 &amp;quot; &amp;quot; 안쪽에 변수를 집어넣으려면 변수를 #{} 문법 안에 넣으면 된다. &amp;quot;abcd #{변수명}&amp;quot; 같은 사용법이라고 보면 된다. 마치 shell script 처럼 동작한다고 생각하면 된다.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이제 다시 redmine 안의 &amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/app/views/common/_file.rhtml&amp;#039;&amp;#039;&amp;#039; 파일을 살펴보자.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.uv-file pre {&lt;br /&gt;
  font-size: 12px;&lt;br /&gt;
  margin: 0 0 0 0;&lt;br /&gt;
  padding: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.uv-file {&lt;br /&gt;
  overflow-x: auto;&lt;br /&gt;
  border: 4px solid black;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;uv-file&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;%= syntax_highlight( filename, Redmine::CodesetUtil.to_utf8_by_setting(content) ) %&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;% content_for :header_tags do %&amp;gt;&lt;br /&gt;
  &amp;lt;%= stylesheet_link_tag &amp;quot;uv_themes/#{@uv_theme_name}&amp;quot;, :plugin =&amp;gt; &amp;#039;redmine_ultraviolet&amp;#039; %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
내용은 이렇게 된다... 어? style을 받기는 받는데 뭔가 좀 동작이 이상한 느낌이 든다.&lt;br /&gt;
&lt;br /&gt;
다시 &amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/lib/ultraviolet_syntax_patch.rb&amp;#039;&amp;#039;&amp;#039; 파일을 살펴보자. 100번 줄에 이런게 있음&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
# Usage: Uv.parse(text, output=&amp;quot;xhtml&amp;quot;, syntax_name=nil, line_numbers=false, render_style=&amp;quot;classic&amp;quot;, headers=false)&lt;br /&gt;
return Uv.parse(content, &amp;quot;xhtml&amp;quot;, syntax_name, true, @uv_theme_name)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
어.. 뭔가 이상하다... 아무래도 render_processor.rb 파일의 self.load 관련된 부분인거같은데.. 저 syntax_name 을 넘기는 부분이 애매한 느낌이 든다.&lt;br /&gt;
&lt;br /&gt;
관련된 용법을 찾아보니.... 이거이거...&lt;br /&gt;
&lt;br /&gt;
:http://blog.alno.name/en/2009/02/code-highlighters-ruby&lt;br /&gt;
&lt;br /&gt;
위의 링크부분을 살펴보면 다음과같은 용법이 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
result = Uv.parse( text, &amp;quot;xhtml&amp;quot;, &amp;quot;ruby&amp;quot;, true, &amp;quot;amy&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
어? 파일명을 기준으로 뭔가를 넘기는데 아마도 지금의 에러는 &amp;quot;ruby&amp;quot; 에 해당되는 부분이 똑바로 안넘어가서 생기는 문제인거같다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==급한대로 문제해결==&lt;br /&gt;
&lt;br /&gt;
정신차리고&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/lib/ultraviolet_syntax_patch.rb&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
위의 파일을 다시 보면 이런 내용이 있다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
    def syntax_highlight_with_uv_syntax_highlight(name, content)&lt;br /&gt;
      ## See: http://ultraviolet.rubyforge.org/svn/lib/uv.rb &lt;br /&gt;
      ## See: http://ultraviolet.rubyforge.org/themes.xhtml&lt;br /&gt;
&lt;br /&gt;
      ## User selection of UV Theme&lt;br /&gt;
      selected_theme = User.current.custom_value_for(CustomField.first(:conditions =&amp;gt; {:name =&amp;gt; &amp;#039;Ultraviolet Theme&amp;#039;}))&lt;br /&gt;
      @uv_theme_name = selected_theme || Uv::DEFAULT_THEME&lt;br /&gt;
&lt;br /&gt;
      syntaxes = Uv.syntax_for_file(name, content)&lt;br /&gt;
&lt;br /&gt;
      if syntaxes.empty?&lt;br /&gt;
        syntax_name = &amp;quot;plain_text&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        syntax_name = syntaxes.first.first&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      # Usage: Uv.parse(text, output=&amp;quot;xhtml&amp;quot;, syntax_name=nil, line_numbers=false, render_style=&amp;quot;classic&amp;quot;, headers=false)&lt;br /&gt;
      return Uv.parse(content, &amp;quot;xhtml&amp;quot;, syntax_name, true, @uv_theme_name)&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
오호라... syntax_name 이라는 변수에 값이 똑바로 안들어가는듯 하다.. 그럼 이걸 강제로 plain_text 로 지정해주면 어떨까?&lt;br /&gt;
&lt;br /&gt;
...........&lt;br /&gt;
&lt;br /&gt;
오호 안되는군요..(젠장)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
어라.. 소스를 잘 보니깐.... @uv_theme_name 이 부분이 문제인거같네요.&lt;br /&gt;
&lt;br /&gt;
ultraviolet 이 설치된곳을 찾아보니&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;/usr/lib64/ruby/gems/1.8/gems/ultraviolet-1.0.0/render/xhtml/&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이런 디렉토리가 있네요. 이중에서 cobalt 라는게 일단 눈에 띄는거같으니 다음과같이 세팅해보도록 하자&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
return Uv.parse(content, &amp;quot;xhtml&amp;quot;, syntax_name, true, &amp;quot;cobalt&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이번에는 될려나....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
에러메세지가 바꼈군. 바뀐 에러메시지는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ActionView::TemplateError (No syntax found for plain_text) on line #15 of vendor/plugins/redmine_ultraviolet/app/views/common/_file.rhtml:&lt;br /&gt;
12: &amp;lt;/style&amp;gt;&lt;br /&gt;
13: &lt;br /&gt;
14: &amp;lt;div class=&amp;quot;uv-file&amp;quot;&amp;gt;&lt;br /&gt;
15:   &amp;lt;%= syntax_highlight( filename, Redmine::CodesetUtil.to_utf8_by_setting(content) ) %&amp;gt;&lt;br /&gt;
16: &amp;lt;/div&amp;gt;&lt;br /&gt;
17: &lt;br /&gt;
18: &amp;lt;% content_for :header_tags do %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    ultraviolet (1.0.0) lib/uv.rb:28:in `syntax_node_for&amp;#039;&lt;br /&gt;
    ultraviolet (1.0.0) lib/uv.rb:85:in `parse&amp;#039;&lt;br /&gt;
    ultraviolet (1.0.0) lib/uv/render_processor.rb:17:in `load&amp;#039;&lt;br /&gt;
    ultraviolet (1.0.0) lib/uv.rb:84:in `parse&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
웅? 이번에는 plain_text 라는 강조문법을 못찾았다고 나오는군.&lt;br /&gt;
&lt;br /&gt;
그래 누가 이기나 해보자....&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이번에는 에러가 나는 위치가 바꼈습니다?&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;/usr/lib64/ruby/gems/1.8/gems/ultraviolet-1.0.0/lib/uv.rb&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
위 파일의 28번째 줄을 보도록 하겠음.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
@syntaxes[syntax] = Textpow.syntax(syntax) || raise(ArgumentError, &amp;quot;No syntax found for #{syntax}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
오호 어떤 문법인지에 대한 판단은 Textpow 라는놈이 하는거같네.... gems를 뒤지고 뒤지다보면 다음과같은 디렉토리를 찾을 수 있지. (아싸)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: &amp;#039;&amp;#039;&amp;#039;/usr/lib64/ruby/gems/1.8/gems/textpow-1.3.0/lib/textpow/syntax&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의  디렉토리의 파일들을 대략 보면 말이죠....&lt;br /&gt;
&lt;br /&gt;
파일의 type을 판명할 수 없는 경우에는 강제로 plain 이라는걸 쓰면 될거같은 느낌이 드네?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/lib/ultraviolet_syntax_patch.rb&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위의 파일내에서 다음의 부분을 살펴봅시다?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
      if syntaxes.empty?&lt;br /&gt;
        syntax_name = &amp;quot;plain_text&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        syntax_name = syntaxes.first.first&lt;br /&gt;
      end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
느낌 오네요. 조아쓰 plain_text 부분을 plain 으로 한번 바꿔볼까요?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
어.......&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
잘된다...? (뭐 일단 에러가 안난다는 정도지만....)&lt;br /&gt;
&lt;br /&gt;
여기서 삽질을 일단락 할까 했으나........&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===하다가만 추가삽질===&lt;br /&gt;
&lt;br /&gt;
파일의 확장자에 따른 부분이 제대로 반환이 안되는듯 하다. 그럼 이제부터 변수를 슬슬 디버깅해보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/lib/ultraviolet_syntax_patch.rb&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
문제가 되는 부분은 위의 파일에서&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
syntaxes = Uv.syntax_for_file(name, content)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 return 값이 제대로 안되는게 문제. 이제부터 예제를 만들어서 Uv.syntax_for_file 이 어떤식으로 동작하는지를 살펴보도록 한다.&lt;br /&gt;
&lt;br /&gt;
thin/redmine 의 plugin 내에서는 제대로 log가 찍히지 않는다. (10번 refresh 하면 3번정도 log에 찍히니 원....)&lt;br /&gt;
&lt;br /&gt;
일단 위의 메서드 사용에서 name은 파일이름, content 는 파일의 내용으로 보면 되겠다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
웬지는 모르겠지만 puts 로 변수를 찍으면 thin의 log에 &amp;#039;&amp;#039;&amp;#039;간헐적&amp;#039;&amp;#039;&amp;#039; 으로만 나온다.&lt;br /&gt;
&lt;br /&gt;
(이제부터 루비를 눈꼽만큼 알아야 하는 필요가 있음)&lt;br /&gt;
&lt;br /&gt;
# sample을 만들고&lt;br /&gt;
# method 의 return 값이 어떤 타입인지를 확인한다음&lt;br /&gt;
# return 값을 출력해보고 함수의 동작을 이해한다&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 UltraViolet 의 &amp;#039;&amp;#039;&amp;#039;/usr/lib64/ruby/gems/1.8/gems/ultraviolet-1.0.0/lib/uv.rb&amp;#039;&amp;#039;&amp;#039; 파일을 살펴본다.&lt;br /&gt;
&lt;br /&gt;
그리고 테스트용 루비프로그램을 짜서 해보는데.......어라 뭔가 이상하다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def self.syntax_for_file(file_name)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
메서드 선언부분을 보면..... 인수가 하나네? (사실 이때 이미 알았어야 했다)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
이후 이런저런 디버깅을 해봤는데 기본적인걸 잊고있었다. 다시한번 아래의 파일을 전부 살펴본다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/lib/ultraviolet_syntax_patch.rb&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require_dependency &amp;#039;application_helper&amp;#039;&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# Monkeypatches for the Ultraviolet (Uv) module:&lt;br /&gt;
# * Allow Uv.syntax_for_file to handle blobs of content (without existing files)&lt;br /&gt;
# * Add THEMES and DEFAULT_THEME&lt;br /&gt;
#&lt;br /&gt;
module Uv&lt;br /&gt;
&lt;br /&gt;
  DEFAULT_THEME = &amp;quot;pastels_on_dark&amp;quot;&lt;br /&gt;
  THEMES = %w[&lt;br /&gt;
    active4d&lt;br /&gt;
    all_hallows_eve&lt;br /&gt;
    amy&lt;br /&gt;
    blackboard&lt;br /&gt;
    brilliance_black&lt;br /&gt;
    brilliance_dull&lt;br /&gt;
    cobalt&lt;br /&gt;
    dawn&lt;br /&gt;
    eiffel&lt;br /&gt;
    espresso_libre&lt;br /&gt;
    idle&lt;br /&gt;
    iplastic&lt;br /&gt;
    lazy&lt;br /&gt;
    mac_classic&lt;br /&gt;
    magicwb_amiga&lt;br /&gt;
    pastels_on_dark&lt;br /&gt;
    slush_poppies&lt;br /&gt;
    spacecadet&lt;br /&gt;
    sunburst&lt;br /&gt;
    twilight&lt;br /&gt;
    zenburnesque&lt;br /&gt;
  ]&lt;br /&gt;
&lt;br /&gt;
  def Uv.syntax_for_file file_name, content=nil&lt;br /&gt;
    init_syntaxes unless @syntaxes&lt;br /&gt;
&lt;br /&gt;
    f = content ? StringIO.new(content) : open(file_name)&lt;br /&gt;
    first_line = f.find { |line| line.strip.size &amp;gt; 0 }  # first non-empty line&lt;br /&gt;
    f.close&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
&lt;br /&gt;
    @syntaxes.each do |key, value|&lt;br /&gt;
      assigned = false&lt;br /&gt;
&lt;br /&gt;
      if value.fileTypes&lt;br /&gt;
        value.fileTypes.each do |t|&lt;br /&gt;
          if t == File.basename( file_name ) || t == File.extname( file_name )[1..-1]&lt;br /&gt;
            result &amp;lt;&amp;lt; [key, value]&lt;br /&gt;
            assigned = true&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      unless assigned&lt;br /&gt;
        if value.firstLineMatch &amp;amp;&amp;amp; value.firstLineMatch =~ first_line&lt;br /&gt;
          result &amp;lt;&amp;lt; [key, value]&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# UV Syntax highlighting for Redmine&lt;br /&gt;
#&lt;br /&gt;
module UltravioletSyntaxPatch&lt;br /&gt;
&lt;br /&gt;
  def self.included(base) # :nodoc:&lt;br /&gt;
    base.send(:include, InstanceMethods)&lt;br /&gt;
&lt;br /&gt;
    base.class_eval do&lt;br /&gt;
      alias_method_chain :syntax_highlight, :uv_syntax_highlight&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  module InstanceMethods&lt;br /&gt;
&lt;br /&gt;
    def syntax_highlight_with_uv_syntax_highlight(name, content)&lt;br /&gt;
      ## See: http://ultraviolet.rubyforge.org/svn/lib/uv.rb &lt;br /&gt;
      ## See: http://ultraviolet.rubyforge.org/themes.xhtml&lt;br /&gt;
&lt;br /&gt;
      ## User selection of UV Theme&lt;br /&gt;
      selected_theme = User.current.custom_value_for(CustomField.first(:conditions =&amp;gt; {:name =&amp;gt; &amp;#039;Ultraviolet Theme&amp;#039;}))&lt;br /&gt;
      @uv_theme_name = selected_theme || Uv::DEFAULT_THEME&lt;br /&gt;
&lt;br /&gt;
      syntaxes = Uv.syntax_for_file(name, content)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      if syntaxes.empty?&lt;br /&gt;
        syntax_name = &amp;quot;plain&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        syntax_name = syntaxes.first.first&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      puts &amp;quot;name is #{name} \n&amp;quot;;&lt;br /&gt;
      #puts &amp;quot;content is #{content} \n&amp;quot;;&lt;br /&gt;
      puts &amp;quot;syntaxes is #{syntaxes.first.first} \n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      # Usage: Uv.parse(text, output=&amp;quot;xhtml&amp;quot;, syntax_name=nil, line_numbers=false, render_style=&amp;quot;classic&amp;quot;, headers=false)&lt;br /&gt;
      # return Uv.parse(content, &amp;quot;xhtml&amp;quot;, syntax_name, true, @uv_theme_name)&lt;br /&gt;
      return Uv.parse(content, &amp;quot;xhtml&amp;quot;, syntax_name, true, &amp;quot;cobalt&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
ApplicationHelper.send(:include, UltravioletSyntaxPatch)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
내용은 좀 길지만... 사실 중요한건 다른게 아니라 다음의 한줄이다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
def Uv.syntax_for_file file_name, content=nil&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
응? 어이.. 이봐요... 새로 class 를 선언해버린겁니까...?...... 인수의 개수가 틀리네?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
자 이제 이 class의 이름을 살짝 바꿔서 파일을 로딩한다음 메서드를 실제로 작동시키는 Sample 을 다시 만들어서 내용을 테스트해보겠다.&lt;br /&gt;
&lt;br /&gt;
(이제부터는 간단히 아는 수준을 좀 넘게되는거같네?)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
일단 간단한 파일 입출력 예제를 만들어서 원래 plugin 에서 사용하던 contents 에 해당하는 변수를 만들어보도록 한다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
file_name = &amp;quot;파일이름&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# aFile = File.new(&amp;quot;filename&amp;quot;, &amp;quot;mode&amp;quot;)&lt;br /&gt;
aFile = File.new(file_name, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
temp_string = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if aFile&lt;br /&gt;
    aFile.each do | ch |&lt;br /&gt;
        temp_string = &amp;quot;#{temp_string}&amp;quot; + &amp;quot;#{ch}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
else&lt;br /&gt;
    puts &amp;#039;Unable open file&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
aFile.close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
오호.. 파일의 이름을 읽어들여 화면상에 puts 로 표시하는게 잘된다.&lt;br /&gt;
&lt;br /&gt;
사실.. 그래서 &amp;#039;&amp;#039;&amp;#039;~/vendor/plugins/redmine_ultraviolet/lib/ultraviolet_syntax_patch.rb&amp;#039;&amp;#039;&amp;#039; 파일에 있는 메서드 선언 부분만 새로 복사해서...&lt;br /&gt;
&lt;br /&gt;
예제 파일을 만들어봤으나.. 결국은 아래와 같은 메세지가 나오며 실패되었다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ruby ./sample.rb &lt;br /&gt;
./sample.rb:31:in `syntax_for_file&amp;#039;: undefined local variable or method `init_syntaxes&amp;#039; for Uv:Module (NameError)&lt;br /&gt;
	from ./sample.rb:82&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
에이........... 이제는 모르겠다......&lt;br /&gt;
&lt;br /&gt;
뭔가 루비 문법을 더 알면 될거같은데... 나는 여기서 그만 삽질을 접기로 했다.&lt;br /&gt;
&lt;br /&gt;
아래쪽에 삽질한 예제프로그램의 전문을 올린다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/ruby&lt;br /&gt;
&lt;br /&gt;
module Uv&lt;br /&gt;
&lt;br /&gt;
  DEFAULT_THEME = &amp;quot;pastels_on_dark&amp;quot;&lt;br /&gt;
  THEMES = %w[&lt;br /&gt;
    active4d&lt;br /&gt;
    all_hallows_eve&lt;br /&gt;
    amy&lt;br /&gt;
    blackboard&lt;br /&gt;
    brilliance_black&lt;br /&gt;
    brilliance_dull&lt;br /&gt;
    cobalt&lt;br /&gt;
    dawn&lt;br /&gt;
    eiffel&lt;br /&gt;
    espresso_libre&lt;br /&gt;
    idle&lt;br /&gt;
    iplastic&lt;br /&gt;
    lazy&lt;br /&gt;
    mac_classic&lt;br /&gt;
    magicwb_amiga&lt;br /&gt;
    pastels_on_dark&lt;br /&gt;
    slush_poppies&lt;br /&gt;
    spacecadet&lt;br /&gt;
    sunburst&lt;br /&gt;
    twilight&lt;br /&gt;
    zenburnesque&lt;br /&gt;
  ]&lt;br /&gt;
&lt;br /&gt;
  def Uv.syntax_for_file file_name, content=nil&lt;br /&gt;
    init_syntaxes unless @syntaxes&lt;br /&gt;
&lt;br /&gt;
    f = content ? StringIO.new(content) : open(file_name)&lt;br /&gt;
    first_line = f.find { |line| line.strip.size &amp;gt; 0 }  # first non-empty line&lt;br /&gt;
    f.close&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
&lt;br /&gt;
    @syntaxes.each do |key, value|&lt;br /&gt;
      assigned = false&lt;br /&gt;
&lt;br /&gt;
      if value.fileTypes&lt;br /&gt;
        value.fileTypes.each do |t|&lt;br /&gt;
          if t == File.basename( file_name ) || t == File.extname( file_name )[1..-1]&lt;br /&gt;
            result &amp;lt;&amp;lt; [key, value]&lt;br /&gt;
            assigned = true&lt;br /&gt;
            break&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
      unless assigned&lt;br /&gt;
        if value.firstLineMatch &amp;amp;&amp;amp; value.firstLineMatch =~ first_line&lt;br /&gt;
          result &amp;lt;&amp;lt; [key, value]&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
file_name = &amp;quot;/root/test/sample.php&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# aFile = File.new(&amp;quot;filename&amp;quot;, &amp;quot;mode&amp;quot;)&lt;br /&gt;
aFile = File.new(file_name, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
temp_string = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if aFile&lt;br /&gt;
    aFile.each do | ch |&lt;br /&gt;
        temp_string = &amp;quot;#{temp_string}&amp;quot; + &amp;quot;#{ch}&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
else&lt;br /&gt;
    puts &amp;#039;Unable open file&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
aFile.close&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
syntaxes = Uv.syntax_for_file(file_name, temp_string)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts syntaxes.class&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고사항==&lt;br /&gt;
&lt;br /&gt;
# 예제를 Plugin 파일과 같은 구조도 만들었는데도 안되는건 예제에 있는 뭔가가 안되는거같다&lt;br /&gt;
# 사실.. Uv 말고 그냥 textpow를 써도 될거같다. 그런데...... 거기까지 손대기에는 정신이 혼미해서 포기&lt;br /&gt;
# 또 하나 주의할게 redmine_ultraviolet 플러그인이 redmine 1.3 에 맞춰져 있어서 그런거같기도 하다. (증상을 보면 걍 문제인거같지만...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==참고문서==&lt;br /&gt;
&lt;br /&gt;
* http://www.ruby-lang.org/ko/documentation/&lt;br /&gt;
** https://docs.google.com/document/d/15yEpi2ZMB2Lld5lA1TANt13SJ_cKygP314cqyKhELwQ/preview?pli=1&lt;br /&gt;
* http://synch3d.com/wiki/moin/moin.cgi/_c7_c1_b7_ce_b1_d7_b7_a1_b9_d6_20_b7_e7_ba_f1#line305&lt;br /&gt;
* http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Ruby&lt;br /&gt;
** http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Ruby/Tutorial01&lt;br /&gt;
** http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Ruby/Tutorial02&lt;br /&gt;
** http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Ruby/File&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>