From 0f885d0c2f58999f4d988bdac07bca1217059280 Mon Sep 17 00:00:00 2001 From: Junya Ogura Date: Thu, 11 Jun 2009 22:08:05 +0900 Subject: [PATCH] Initial commit --- README | 33 +++ .../helper.rb | 26 +++ assets/help/markdown_extra_syntax.html | 179 +++++++++++++++ assets/images/jstoolbar/bt_code.png | Bin 0 -> 4177 bytes assets/images/jstoolbar/bt_em.png | Bin 0 -> 4118 bytes assets/images/jstoolbar/bt_h1.png | Bin 0 -> 362 bytes assets/images/jstoolbar/bt_h2.png | Bin 0 -> 371 bytes assets/images/jstoolbar/bt_h3.png | Bin 0 -> 376 bytes assets/images/jstoolbar/bt_img.png | Bin 0 -> 1142 bytes assets/images/jstoolbar/bt_kbd.png | Bin 0 -> 4095 bytes assets/images/jstoolbar/bt_link.png | Bin 0 -> 408 bytes assets/images/jstoolbar/bt_ol.png | Bin 0 -> 363 bytes assets/images/jstoolbar/bt_pre.png | Bin 0 -> 1040 bytes assets/images/jstoolbar/bt_ul.png | Bin 0 -> 365 bytes assets/images/jstoolbar/bt_unpre.png | Bin 0 -> 4132 bytes assets/images/jstoolbar/bt_var.png | Bin 0 -> 4023 bytes assets/javascripts/lang/markdown-ja.js | 14 ++ assets/javascripts/markdown_extra.js | 204 ++++++++++++++++++ assets/stylesheets/markdown_extra.css | 41 ++++ init.rb | 13 ++ .../wiki_formatter.rb | 18 ++ 21 files changed, 528 insertions(+) create mode 100644 README create mode 100644 app/helpers/redmine_markdown_extra_formatter/helper.rb create mode 100644 assets/help/markdown_extra_syntax.html create mode 100644 assets/images/jstoolbar/bt_code.png create mode 100644 assets/images/jstoolbar/bt_em.png create mode 100644 assets/images/jstoolbar/bt_h1.png create mode 100644 assets/images/jstoolbar/bt_h2.png create mode 100644 assets/images/jstoolbar/bt_h3.png create mode 100644 assets/images/jstoolbar/bt_img.png create mode 100644 assets/images/jstoolbar/bt_kbd.png create mode 100644 assets/images/jstoolbar/bt_link.png create mode 100644 assets/images/jstoolbar/bt_ol.png create mode 100644 assets/images/jstoolbar/bt_pre.png create mode 100644 assets/images/jstoolbar/bt_ul.png create mode 100644 assets/images/jstoolbar/bt_unpre.png create mode 100644 assets/images/jstoolbar/bt_var.png create mode 100644 assets/javascripts/lang/markdown-ja.js create mode 100644 assets/javascripts/markdown_extra.js create mode 100644 assets/stylesheets/markdown_extra.css create mode 100644 init.rb create mode 100644 lib/redmine_markdown_extra_formatter/wiki_formatter.rb diff --git a/README b/README new file mode 100644 index 0000000..102f8ef --- /dev/null +++ b/README @@ -0,0 +1,33 @@ += Redmine Markdown Extra formatter + +This is a redmine plugin for supporting Markdown Extra as a wiki format. + +== What is redmine? +Redmine is a flexible project management web application. +See (()) for more details. + +== What is Markdown Extra? +(from http://michelf.com/projects/php-markdown/extra/) +PHP Markdown Extra is a special version of PHP Markdown implementing some +features currently not available with the plain Markdown syntax. + + +== Plugin installation +=== Prerequisites +* Redmine and its prerequisites +* bluefeather gem - see http://ruby.morphball.net/bluefeather/ + +=== Installation +(1) Copy the plugin directory into the vendor/plugins directory +(2) Start Redmine + +Installed plugins are listed on 'Admin -> Information' screen. + +=== Credits +* Yuki Sonoda (http://github.com/yugui) did the real work by creating the + redmine_rd_formatter +* Jean-Philippe Lang for making the change to RedMine (based on Yuki's patch) to + allow pluggable formatters + +== Future Plans +* update HTML syntax help and implement JavaScript preview diff --git a/app/helpers/redmine_markdown_extra_formatter/helper.rb b/app/helpers/redmine_markdown_extra_formatter/helper.rb new file mode 100644 index 0000000..2afc26c --- /dev/null +++ b/app/helpers/redmine_markdown_extra_formatter/helper.rb @@ -0,0 +1,26 @@ +module RedmineMarkdownExtraFormatter + module Helper + unloadable + + def wikitoolbar_for(field_id) + file = Engines::RailsExtensions::AssetHelpers.plugin_asset_path('redmine_markdown_extra_formatter', 'help', 'markdown_extra_syntax.html') + help_link = l(:setting_text_formatting) + ': ' + + link_to(l(:label_help), file, + :onclick => "window.open(\"#{file}\", \"\", \"resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes\"); return false;") + + javascript_include_tag('jstoolbar/jstoolbar') + + javascript_include_tag('markdown_extra', :plugin => 'redmine_markdown_extra_formatter') + + javascript_include_tag("jstoolbar/lang/jstoolbar-#{current_language}") + + javascript_tag("var toolbar = new jsToolBar($('#{field_id}')); toolbar.setHelpLink('#{help_link}'); toolbar.draw();") + end + + + def initial_page_content(page) + "#{page.pretty_title}\n#{'='*page.pretty_title.length}" + end + + def heads_for_wiki_formatter + stylesheet_link_tag('jstoolbar') + end + end +end diff --git a/assets/help/markdown_extra_syntax.html b/assets/help/markdown_extra_syntax.html new file mode 100644 index 0000000..1471415 --- /dev/null +++ b/assets/help/markdown_extra_syntax.html @@ -0,0 +1,179 @@ + + + + + + Wiki formatting + + + + +

Wiki Syntax Quick Reference

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Font Styles
+ Strong + **Strong**Strong
Emphasis*Emphasis*Emphasis
Underline<ins>Underline</ins>>Underline
Deleted<del>Deleted</del>Deleted
</cite>Quote</cite>Quote
Inline Code`Inline Code`Inline Code
Preformatted text<pre>
 lines
 of code
</pre>
+
+ lines
+ of code
+
+
Lists
Unordered list* Item 1
* Item 2
  • Item 1
  • Item 2
Ordered list1. Item 1
1. Item 2
  1. Item 1
  2. Item 2
Headings
Heading 1Title 1
=======

Title 1

Heading 2Title 2
------

Title 2

Heading 3### Title 3

Title 3

External Links
[foobar](http://foo.bar) +
+ [foobar][1]
+ . . .
+ [1]: http://foo.bar +
+ [foobar][foobar]
+ . . .
+ [foobar]: http://foo.bar +
+ [foobar][]
+ . . .
+ [foobar]: http://foo.bar +
foobar
Redmine links
Link
+          to a Wiki page[[Wiki page]]Wiki page
Issue #12Issue #12
Revision r43Revision r43
commit:f30e13e43f30e13e4
source:some/filesource:some/file
Inline images
Image![alt text](image_url)
+ +

See John Gruber's + Markdown + and + SmartyPants + postings for more details. +

+ + + diff --git a/assets/images/jstoolbar/bt_code.png b/assets/images/jstoolbar/bt_code.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4952388e35638898b232c26d4eb33e5d8b2bd9 GIT binary patch literal 4177 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 bVed^B)BQA>DqhiJ00000NkvXXu0mjfzT`5y literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_em.png b/assets/images/jstoolbar/bt_em.png new file mode 100644 index 0000000000000000000000000000000000000000..1c89f3aff893545853282ef0d17d2cfd48f08cb2 GIT binary patch literal 4118 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 U?!g&{^8f$<07*qoM6N<$f@k&=^8f$< literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_h1.png b/assets/images/jstoolbar/bt_h1.png new file mode 100644 index 0000000000000000000000000000000000000000..b64e759941a2987a813f7c9a3b6d85320c7a2b43 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eu-;DiE~kEVo7FxorMq>1fPyUPj=qiz3>*8o|0J>k`Q8COA+G-!80O5GQ(awM zTwJ_$>(;ev*CrXdy6$FaIgj( z`J=jI>eS!ynKSyNPCuA?xYmbZhGFYYr>`qic127(Fnit<_AN~MN}}v4!Ck^P*msmo z^lMz~e1PpIyP43(Z*RH2G99zZ&$;k=ihtbkQ_SYk6LlqkwlH|Q`njxgN@xNAm|c7- literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_h2.png b/assets/images/jstoolbar/bt_h2.png new file mode 100644 index 0000000000000000000000000000000000000000..1e88cb936d295fffc18d41ff2dfafd98473bd91a GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eu-;DiE~kEVo7Fxo2BR0pdd@Sqpu?a!^VE@KZ&eBzDIyhi0gj_hBAG{-o59$j^qN(WGo5t3ubV5b|VeQN%M4Z45_%a_PjS=g8~oBg`kNK zqaEz-{a?n#?Vlii_Q}$jOI+%GW*c9KjTGJXUCj9Y(b|MV{k)})mz#9B4LwGvma~cnEpjtRDPBpGxzf|`u!J}Ib@lqatV6H0&QgQboFyt I=akR{0BB=^ZvX%Q literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_h3.png b/assets/images/jstoolbar/bt_h3.png new file mode 100644 index 0000000000000000000000000000000000000000..646bad11d9d38bfafe8581ae47d75da433a74835 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eu-;DiE~kEVo7Fxo+ zEiIovf9~bwwRGuHCnu-9d-vWino|ulnXx3uFPOpM*^M+HC)Lx%F{I+w+VkFg4GKIg z7lJnYnHnUz^S>*ruT5jDkDC5w%>(k+U5rZFS0%mdpU`t)vS&`kLEjxe9z2WJ@Xjt{ zSo))3Zucf*`E(;;8$XWKk9M787fCwxdYXIa3SOO*t;)G|l`MI>-OMkhZHbctTFBt( L>gTe~DWM4f1k{A2 literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_img.png b/assets/images/jstoolbar/bt_img.png new file mode 100644 index 0000000000000000000000000000000000000000..ddded465c9bd9e10697f8789e5df1f0fe413e06b GIT binary patch literal 1142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eu-;DiE~kEVo7Fxo?0v(btiIVPik{pF~y$24;o;pAc8CY=)p}AQFgb zVTkHsNN&+gp2CnkMId>KVe%Y?Y#>?+MCXc^G88X8R=o6m@zU?bYo8ad{a(EFfAtin z>N#H3YXz#e9;@DZu4Rr_%bcK=rP(c84O_MbO<9{gWv}IwV?Z=z&N0iS=Yp1=Ygu}( zXYIMDwbzojUQ6D4uXyjh>T~DL-Me@1IS{=6{vHIrzyJRIKLf-6Q7{?;v=4y?^Y?;s zp>au&Uoh#mF%-_*+XvKM@9E+gQgJKy{Ar;k1D@8072RU4?yDXw@Q@8;Q`++3AOG^s z*<5v}>(4!NuxD6&;X*&#i&X1}F~1!h%AP;G;5skg!nRB4V%7dm6ZZ1euUBbp*4aC6 zyU?lUcW2z0ar)s5uM>|8&N|J}v)IBI?4@|lL2R|E(z&Bg@;97I&is@5;~OvYEydrC T@24LDI)%a0)z4*}Q$iB}Fpym5 literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_kbd.png b/assets/images/jstoolbar/bt_kbd.png new file mode 100644 index 0000000000000000000000000000000000000000..c8463785f54ee95c71a0fb1d52136a1685be9e2e GIT binary patch literal 4095 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 literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_link.png b/assets/images/jstoolbar/bt_link.png new file mode 100644 index 0000000000000000000000000000000000000000..8d67e3d905c3556ed49ab61f59eda1015dc16195 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eu-;DiE~kEVo7Fxo?0v(btiIVPik{pF~z5-y^^$#PvS|!@Ya=&Ye4V z?AWojYu83aMI|REXJ=>6nKS46_wQ4tOerod?&<0I|NsBerAyCUyVlau;^gEM6ckil zUG3%NwRi8{=g*(NfB*iC>!p=IGZ{;Q{DK)Ap4~_Ta=JZT978H@`JVUWJEFkDazH}3 zr&CfP=l}ng8&raRJ#b!mbyELg%^IfTT}j`xW40@t|8lS9w(J*u1O1x^nB5ARzwf>* z7ttO3i+x*7qVC=Up=%uEkAITddTBuyv%^N=EWV8r(|tQpC7PTd$+V#o7rKZ9q+`eF3(!*?@r^4kCo`r0XmDp)78&qol`;+0JUSATmS$7 literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_ol.png b/assets/images/jstoolbar/bt_ol.png new file mode 100644 index 0000000000000000000000000000000000000000..0cce2fae0c25f75d64f0fad5d2e319f6e32869af GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!eu-;DiE~kEVo7Fxo2BR0pdd@Sqpu?a!^VE@KZ&eBeqex4i0gj_hT^5qr)+)y z{Qdv6Yu9ROYAPx!N=Qfu2ncX+Z~#@ctbJa+_W9nud!wSFf`Wp)yu6&8oGdLZ4Gj%@ zwmzS;_x;ji?~ffjR$N@1ot>SWoXjb>?=estV@Z%-FoVOh8)-mJsHcl#NX4zzUT?kz z1p#MkC5=T5@&Y^lJ6_!&E%auc{$GY(mlTDf2Jt(ZPh+}DO$9H6b2QzLIU}90`P}>C xnpfF-BJ15cJ0?GCHSk)xEb{fzu(o$kn0J{lE&Z2X&T1 z9he6c;wTR6hzvLtxm4KumCp9?+AFB|(0{3=Yq3qyahJo-U3d6}Ptb zIr23)a4@%TI`F?fr~K=qn;uTg!WswU4TGDmMi?_?&DkRL#Ef5HtIeIA2erb@C!}0a q&Od!a>~=_Th>XzBhU+)a&yO$q!f<2FGq)q4fb?|rb6Mw<&;$UBwp*V7 literal 0 HcmV?d00001 diff --git a/assets/images/jstoolbar/bt_ul.png b/assets/images/jstoolbar/bt_ul.png new file mode 100644 index 0000000000000000000000000000000000000000..df9ecc0cfd80167a3b3ca46f0d9c7c73797c4c57 GIT binary patch literal 365 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 literal 0 HcmV?d00001 diff --git a/assets/javascripts/lang/markdown-ja.js b/assets/javascripts/lang/markdown-ja.js new file mode 100644 index 0000000..2f01172 --- /dev/null +++ b/assets/javascripts/lang/markdown-ja.js @@ -0,0 +1,14 @@ +jsToolBar.strings = {}; +jsToolBar.strings['Emphasized'] = '強調'; +jsToolBar.strings['Code'] = 'コード'; +jsToolBar.strings['Keyboard'] = 'キーボード入力'; +jsToolBar.strings['Variable'] = '可変部分'; +jsToolBar.strings['Heading 1'] = '見出し 1'; +jsToolBar.strings['Heading 2'] = '見出し 2'; +jsToolBar.strings['Heading 3'] = '見出し 3'; +jsToolBar.strings['Unordered list'] = '順不同リスト'; +jsToolBar.strings['Ordered list'] = '番号つきリスト'; +jsToolBar.strings['Preformatted'] = '整形済み'; +jsToolBar.strings['Un-preformatted'] = '未整形'; +jsToolBar.strings['Wiki link'] = 'Wiki ページへのリンク'; +jsToolBar.strings['Image'] = '画像'; diff --git a/assets/javascripts/markdown_extra.js b/assets/javascripts/markdown_extra.js new file mode 100644 index 0000000..8aa2258 --- /dev/null +++ b/assets/javascripts/markdown_extra.js @@ -0,0 +1,204 @@ +// Elements definition ------------------------------------ + +// strong +jsToolBar.prototype.elements.strong = { + type: 'button', + title: 'Strong', + fn: { + wiki: function() { this.singleTag("**", "**") } + } +} + +// em +jsToolBar.prototype.elements.em = { + type: 'button', + title: 'Emphasized', + fn: { + wiki: function() { this.singleTag("*", "*") } + } +} + +// ins +jsToolBar.prototype.elements.ins = { + type: 'button', + title: 'Underline', + fn: { + wiki: function() { this.singleTag("", "") } + } +} + +// del +jsToolBar.prototype.elements.del = { + type: 'button', + title: 'Deleted', + fn: { + wiki: function() { this.singleTag("", "") } + } +} + +// code +jsToolBar.prototype.elements.code = { + type: 'button', + title: 'Code', + fn: { + wiki: function() { this.singleTag('`', '`') } + } +} + +// spacer +jsToolBar.prototype.elements.space1 = {type: 'space'} + +// headings +jsToolBar.prototype.elements.h1 = { + type: 'button', + title: 'Heading 1', + fn: { + wiki: function() { + this.encloseLineSelection('# ', ' #',function(str) { + str = str.replace(/^\s*#+\s*/, '') + str = str.replace(/\s*#+\s*$/, '') + return str; + }); + } + } +} +jsToolBar.prototype.elements.h2 = { + type: 'button', + title: 'Heading 2', + fn: { + wiki: function() { + this.encloseLineSelection('## ', ' ##',function(str) { + str = str.replace(/^\s*#+\s*/, '') + str = str.replace(/\s*#+\s*$/, '') + return str; + }); + } + } +} +jsToolBar.prototype.elements.h3 = { + type: 'button', + title: 'Heading 3', + fn: { + wiki: function() { + this.encloseLineSelection('### ', ' ###',function(str) { + str = str.replace(/^\s*#+\s*/, '') + str = str.replace(/\s*#+\s*$/, '') + return str; + }); + } + } +} + +// spacer +jsToolBar.prototype.elements.space2 = {type: 'space'} + +// ul +jsToolBar.prototype.elements.ul = { +type: 'button', + title: 'Unordered list', + fn: { + wiki: function() { + this.encloseLineSelection('','',function(str) { + str = str.replace(/r/g,''); + return str.replace(/((?:\n|^)\s*)(\*|\d+\.)?\s*/g,"$1* "); + }); + } + } +} + +// ol +jsToolBar.prototype.elements.ol = { +type: 'button', + title: 'Ordered list', + fn: { + wiki: function() { + this.encloseLineSelection('','',function(str) { + str = str.replace(/r/g,''); + return str.replace(/((?:\n|^)\s*)(\*|\d+\.)?\s*/g,"$11. "); + }); + } + } +} + +// spacer +jsToolBar.prototype.elements.space3 = {type: 'space'} + +// bq +jsToolBar.prototype.elements.bq = { + type: 'button', + title: 'Quote', + fn: { + wiki: function() { + return this.encloseLineSelection('', '', function(str) { + return "
\n"+str+"\n
"; + }); + } + } +} + +// unbq +jsToolBar.prototype.elements.unbq = { + type: 'button', + title: 'Unquote', + fn: { + wiki: function() { + return this.encloseLineSelection('','',function(str) { + return str.replace(/\r/g,''). + replace(/(
\n|\n<\/blockquote>)/g, ''); + }); + } + } +} + +// pre +jsToolBar.prototype.elements.pre = { + type: 'button', + title: 'Preformatted', + fn: { + wiki: function() { + this.encloseLineSelection('','',function(str) { + str = str.replace(/\r/g,''); + return str.replace(/(\n|^)\s*/g,"$1 "); + }); + } + } +} + +// unpre +// jsToolBar.prototype.elements.unpre = { +// type: 'button', +// title: 'Un-preformatted', +// fn: { +// wiki: function() { +// this.encloseLineSelection('','',function(str) { +// str = str.replace(/\r/g,''); +// return str.replace(/(\n|^)(\t| )/g,"$1"); +// }); +// } +// } +// } + +// spacer +jsToolBar.prototype.elements.space4 = {type: 'space'} + +// wiki page +jsToolBar.prototype.elements.link = { + type: 'button', + title: 'Wiki link', + fn: { + wiki: function() { this.encloseSelection("[[", "]]") } + } +} +// image +jsToolBar.prototype.elements.img = { + type: 'button', + title: 'Image', + fn: { + wiki: function() { + this.encloseSelection('', '', function(str) { + altText = str.replace(/^\/?(?:[^\/]*\/)*([^\/]*)$/, '$1'); + return '!['+altText+']('+str+')'; + }); + } + } +} diff --git a/assets/stylesheets/markdown_extra.css b/assets/stylesheets/markdown_extra.css new file mode 100644 index 0000000..4552167 --- /dev/null +++ b/assets/stylesheets/markdown_extra.css @@ -0,0 +1,41 @@ +/* Buttons +-------------------------------------------------------- */ +.jstb_em { + background-image: url(../images/jstoolbar/bt_em.png); +} +.jstb_code { + background-image: url(../images/jstoolbar/bt_code.png); +} +.jstb_kbd { + background-image: url(../images/jstoolbar/bt_kbd.png); +} +.jstb_var { + background-image: url(../images/jstoolbar/bt_var.png); +} +.jstb_h1 { + background-image: url(../images/jstoolbar/bt_h1.png); +} +.jstb_h2 { + background-image: url(../images/jstoolbar/bt_h2.png); +} +.jstb_h3 { + background-image: url(../images/jstoolbar/bt_h3.png); +} +.jstb_ul { + background-image: url(../images/jstoolbar/bt_ul.png); +} +.jstb_ol { + background-image: url(../images/jstoolbar/bt_ol.png); +} +.jstb_pre { + background-image: url(../images/jstoolbar/bt_pre.png); +} +.jstb_unpre { + background-image: url(../images/jstoolbar/bt_unpre.png); +} +.jstb_link { + background-image: url(../images/jstoolbar/bt_link.png); +} +.jstb_img { + background-image: url(../images/jstoolbar/bt_img.png); +} diff --git a/init.rb b/init.rb new file mode 100644 index 0000000..a7201ba --- /dev/null +++ b/init.rb @@ -0,0 +1,13 @@ +# Redmine Markdown Extra formatter +require 'redmine' + +RAILS_DEFAULT_LOGGER.info 'Starting Markdown Extra formatter for RedMine' + +Redmine::Plugin.register :redmine_markdown_extra_formatter do + name 'Markdown Extra formatter' + author 'Junya Ogura' + description 'This provides Markdown Extra as a wiki format' + version '0.0.1' + + wiki_format_provider 'Markdown Extra', RedmineMarkdownExtraFormatter::WikiFormatter, RedmineMarkdownExtraFormatter::Helper +end diff --git a/lib/redmine_markdown_extra_formatter/wiki_formatter.rb b/lib/redmine_markdown_extra_formatter/wiki_formatter.rb new file mode 100644 index 0000000..ce1fd93 --- /dev/null +++ b/lib/redmine_markdown_extra_formatter/wiki_formatter.rb @@ -0,0 +1,18 @@ +require 'bluefeather' + +module RedmineMarkdownExtraFormatter + class WikiFormatter + def initialize(text) + @text = text + end + + def to_html(&block) + BlueFeather.parse(@text) + rescue => e + return("
problem parsing wiki text: #{e.message}\n"+
+             "original text: \n"+
+             @text+
+             "
") + end + end +end