]> source.dussan.org Git - redmine.git/commitdiff
Adds multi-levels blockquotes support by using > at the beginning of lines.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 30 May 2008 16:35:36 +0000 (16:35 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Fri, 30 May 2008 16:35:36 +0000 (16:35 +0000)
Textile is preserved inside quoted text.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1479 e93f8b46-1217-0410-a6f0-8f06a7374b81

35 files changed:
lib/redcloth.rb
lib/redmine/wiki_formatting.rb
public/images/jstoolbar/bt_bq.png [new file with mode: 0644]
public/images/jstoolbar/bt_bq_remove.png [new file with mode: 0644]
public/javascripts/jstoolbar/jstoolbar.js
public/javascripts/jstoolbar/lang/jstoolbar-bg.js
public/javascripts/jstoolbar/lang/jstoolbar-cs.js
public/javascripts/jstoolbar/lang/jstoolbar-da.js
public/javascripts/jstoolbar/lang/jstoolbar-de.js
public/javascripts/jstoolbar/lang/jstoolbar-en.js
public/javascripts/jstoolbar/lang/jstoolbar-es.js
public/javascripts/jstoolbar/lang/jstoolbar-fi.js
public/javascripts/jstoolbar/lang/jstoolbar-fr.js
public/javascripts/jstoolbar/lang/jstoolbar-he.js
public/javascripts/jstoolbar/lang/jstoolbar-hu.js
public/javascripts/jstoolbar/lang/jstoolbar-it.js
public/javascripts/jstoolbar/lang/jstoolbar-ja.js
public/javascripts/jstoolbar/lang/jstoolbar-ko.js
public/javascripts/jstoolbar/lang/jstoolbar-lt.js
public/javascripts/jstoolbar/lang/jstoolbar-nl.js
public/javascripts/jstoolbar/lang/jstoolbar-no.js
public/javascripts/jstoolbar/lang/jstoolbar-pl.js
public/javascripts/jstoolbar/lang/jstoolbar-pt-br.js
public/javascripts/jstoolbar/lang/jstoolbar-pt.js
public/javascripts/jstoolbar/lang/jstoolbar-ro.js
public/javascripts/jstoolbar/lang/jstoolbar-ru.js
public/javascripts/jstoolbar/lang/jstoolbar-sr.js
public/javascripts/jstoolbar/lang/jstoolbar-sv.js
public/javascripts/jstoolbar/lang/jstoolbar-th.js
public/javascripts/jstoolbar/lang/jstoolbar-uk.js
public/javascripts/jstoolbar/lang/jstoolbar-zh-tw.js
public/javascripts/jstoolbar/lang/jstoolbar-zh.js
public/stylesheets/application.css
public/stylesheets/jstoolbar.css
test/unit/helpers/application_helper_test.rb

index fb6a053c651268f558cc14f647e6b83674457bbd..344fd6c78e8bb0e329b31cbc95c3c4bd65a491bd 100644 (file)
@@ -299,6 +299,8 @@ class RedCloth < String
         hard_break text 
         unless @lite_mode
             refs text
+            # need to do this before text is split by #blocks
+            block_textile_quotes text
             blocks text
         end
         inline text
@@ -576,6 +578,29 @@ class RedCloth < String
             lines.join( "\n" )
         end
     end
+    
+    QUOTES_RE = /(^>+([^\n]*?)\n?)+/m
+    QUOTES_CONTENT_RE = /^([> ]+)(.*)$/m
+    
+    def block_textile_quotes( text )
+      text.gsub!( QUOTES_RE ) do |match|
+        lines = match.split( /\n/ )
+        quotes = ''
+        indent = 0
+        lines.each do |line|
+          line =~ QUOTES_CONTENT_RE 
+          bq,content = $1, $2
+          l = bq.count('>')
+          if l != indent
+            quotes << ("\n\n" + (l>indent ? '<blockquote>' * (l-indent) : '</blockquote>' * (indent-l)) + "\n\n")
+            indent = l
+          end
+          quotes << (content + "\n")
+        end
+        quotes << ("\n" + '</blockquote>' * indent + "\n\n")
+        quotes
+      end
+    end
 
     CODE_RE = /(\W)
         @
index 3c1eac02097edc501296c273a2f2e10ae88b1891..7197af2c33c47bd09e116bf27a47decdbb5d99ab 100644 (file)
@@ -45,7 +45,7 @@ module Redmine
       # Patch for RedCloth.  Fixed in RedCloth r128 but _why hasn't released it yet.
       # <a href="http://code.whytheluckystiff.net/redcloth/changeset/128">http://code.whytheluckystiff.net/redcloth/changeset/128</a>
       def hard_break( text ) 
-        text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1<br />\n" ) if hard_breaks 
+        text.gsub!( /(.)\n(?!\n|\Z|>| *(>? *[#*=]+(\s|$)|[{|]))/, "\\1<br />\n" ) if hard_breaks 
       end
       
       # Patch to add code highlighting support to RedCloth
diff --git a/public/images/jstoolbar/bt_bq.png b/public/images/jstoolbar/bt_bq.png
new file mode 100644 (file)
index 0000000..c3af4e0
Binary files /dev/null and b/public/images/jstoolbar/bt_bq.png differ
diff --git a/public/images/jstoolbar/bt_bq_remove.png b/public/images/jstoolbar/bt_bq_remove.png
new file mode 100644 (file)
index 0000000..05d5ff7
Binary files /dev/null and b/public/images/jstoolbar/bt_bq_remove.png differ
index be982d4b9c5f351489c9eaf48fdfc9182058f0a0..64c460217cbae1d2e24c976ec2c7dd100b30d6d4 100644 (file)
@@ -498,6 +498,37 @@ jsToolBar.prototype.elements.ol = {
        }
 }
 
+// spacer
+jsToolBar.prototype.elements.space3 = {type: 'space'}
+
+// bq
+jsToolBar.prototype.elements.bq = {
+       type: 'button',
+       title: 'Quote',
+       fn: {
+               wiki: function() {
+                       this.encloseLineSelection('','',function(str) {
+                               str = str.replace(/\r/g,'');
+                               return str.replace(/(\n|^) *([^\n]*)/g,"$1> $2");
+                       });
+               }
+       }
+}
+
+// unbq
+jsToolBar.prototype.elements.unbq = {
+       type: 'button',
+       title: 'Unquote',
+       fn: {
+               wiki: function() {
+                       this.encloseLineSelection('','',function(str) {
+                               str = str.replace(/\r/g,'');
+                               return str.replace(/(\n|^) *[>]? *([^\n]*)/g,"$1$2");
+                       });
+               }
+       }
+}
+
 // pre
 jsToolBar.prototype.elements.pre = {
        type: 'button',
@@ -508,7 +539,7 @@ jsToolBar.prototype.elements.pre = {
 }
 
 // spacer
-jsToolBar.prototype.elements.space3 = {type: 'space'}
+jsToolBar.prototype.elements.space4 = {type: 'space'}
 
 // wiki page
 jsToolBar.prototype.elements.link = {
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 8a59a81623c10381d3f1a3bd46cddb621450fc81..f2c0dbff507984e1facb140e3acb9b1c6f3af138 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Záhlaví 2';
 jsToolBar.strings['Heading 3'] = 'Záhlaví 3';
 jsToolBar.strings['Unordered list'] = 'Seznam';
 jsToolBar.strings['Ordered list'] = 'Uspořádaný seznam';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Předformátovaný text';
 jsToolBar.strings['Wiki link'] = 'Vložit odkaz na Wiki stránku';
 jsToolBar.strings['Image'] = 'Vložit obrázek';
index 9996acaf34d65d107a1e91bcad309a7799b4fa97..6ccc8ead2e0902e3f9c0cfa982a0f4886b8fbd6e 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Overskrift 2';
 jsToolBar.strings['Heading 3'] = 'Overskrift 3';
 jsToolBar.strings['Unordered list'] = 'Unummereret list';
 jsToolBar.strings['Ordered list'] = 'Nummereret list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatteret tekst';
 jsToolBar.strings['Wiki link'] = 'Link til en Wiki side';
 jsToolBar.strings['Image'] = 'Billede';
index e2ba3fc1cdba5bcc29c277e450cabb0c9e51e1f7..ce686860f495a5845acbe12a741fb1c7faf14a18 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Überschrift 2. Ordnung';
 jsToolBar.strings['Heading 3'] = 'Überschrift 3. Ordnung';
 jsToolBar.strings['Unordered list'] = 'Aufzählungsliste';
 jsToolBar.strings['Ordered list'] = 'Nummerierte Liste';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Präformatierter Text';
 jsToolBar.strings['Wiki link'] = 'Verweis (Link) zu einer Wiki-Seite';
 jsToolBar.strings['Image'] = 'Grafik';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 357d25951841490e8a27538e57046a62424eafaf..c2229b281a1ca7e9e5e2698ca1458edf948e6ae6 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Otsikko 2';
 jsToolBar.strings['Heading 3'] = 'Otsikko 3';
 jsToolBar.strings['Unordered list'] = 'Järjestämätön lista';
 jsToolBar.strings['Ordered list'] = 'Järjestetty lista';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Ennaltamuotoiltu teksti';
 jsToolBar.strings['Wiki link'] = 'Linkki Wiki sivulle';
 jsToolBar.strings['Image'] = 'Kuva';
index 3cbc67863ddcc6c5fc5586fedf314337a856bba8..c52a783bca274ddf75dfc18a5f4f3b95668e03e5 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Titre niveau 2';
 jsToolBar.strings['Heading 3'] = 'Titre niveau 3';
 jsToolBar.strings['Unordered list'] = 'Liste à puces';
 jsToolBar.strings['Ordered list'] = 'Liste numérotée';
+jsToolBar.strings['Quote'] = 'Citer';
+jsToolBar.strings['Unquote'] = 'Supprimer citation';
 jsToolBar.strings['Preformatted text'] = 'Texte préformaté';
 jsToolBar.strings['Wiki link'] = 'Lien vers une page Wiki';
 jsToolBar.strings['Image'] = 'Image';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index e586a123b4a5ca977ba028cc7614897f04d15f0e..c31ba00c05273d1fa59e86ef5b694fa989dca87b 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Fejléc 2';
 jsToolBar.strings['Heading 3'] = 'Fejléc 3';
 jsToolBar.strings['Unordered list'] = 'Felsorolás';
 jsToolBar.strings['Ordered list'] = 'Számozott lista';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Előreformázott szöveg';
 jsToolBar.strings['Wiki link'] = 'Link egy Wiki oldalra';
 jsToolBar.strings['Image'] = 'Kép';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index fc4d987dee0cdabf0987c96f99d5c4f507282c35..c9413dac2f4d14f999d10fb1e909ba6983daef6d 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = '見出し 2';
 jsToolBar.strings['Heading 3'] = '見出し 3';
 jsToolBar.strings['Unordered list'] = '順不同リスト';
 jsToolBar.strings['Ordered list'] = '番号つきリスト';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = '整形済みテキスト';
 jsToolBar.strings['Wiki link'] = 'Wiki ページへのリンク';
 jsToolBar.strings['Image'] = '画像';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index f0a7c5d90e7b3452124b0083ad252a081d67c360..8af364c8d5e1fc4afca1e69cef1952c279db6acb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Nenumeruotas sąrašas';
 jsToolBar.strings['Ordered list'] = 'Numeruotas sąrašas';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatuotas tekstas';
 jsToolBar.strings['Wiki link'] = 'Nuoroda į Wiki puslapį';
 jsToolBar.strings['Image'] = 'Paveikslas';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index cf6e19ff93203fe7a4706d398ebf7d73e6f7304e..2fb098a9db49f3c094a17b89e335fac191eae1d0 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Overskrift 2';
 jsToolBar.strings['Heading 3'] = 'Overskrift 3';
 jsToolBar.strings['Unordered list'] = 'Punktliste';
 jsToolBar.strings['Ordered list'] = 'Nummerert liste';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatert tekst';
 jsToolBar.strings['Wiki link'] = 'Lenke til Wiki-side';
 jsToolBar.strings['Image'] = 'Bilde';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 8fc58ba6785b521ce310d4696fe9d8b743dff606..5035524ab44b3f5230219ac98cab14f1876e7096 100644 (file)
@@ -11,6 +11,8 @@ jsToolBar.strings['Heading 2'] = 'Cabeçalho 2';
 jsToolBar.strings['Heading 3'] = 'Cabeçalho 3';
 jsToolBar.strings['Unordered list'] = 'Lista não ordenada';
 jsToolBar.strings['Ordered list'] = 'Lista ordenada';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Texto pré-formatado';
 jsToolBar.strings['Wiki link'] = 'Link para uma página Wiki';
 jsToolBar.strings['Image'] = 'Imagem';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 6370a3e2d5244dfc5f64fb111572f4561d997bac..a6d8c4fad388c07f56f73fdeac6fb78744aca736 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Заголовок 2';
 jsToolBar.strings['Heading 3'] = 'Заголовок 3';
 jsToolBar.strings['Unordered list'] = 'Маркированный список';
 jsToolBar.strings['Ordered list'] = 'Нумерованный список';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Заранее форматированный текст';
 jsToolBar.strings['Wiki link'] = 'Ссылка на страницу в Wiki';
 jsToolBar.strings['Image'] = 'Вставка изображения';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 2e2f2b88eb6efbca14796b3b42b95f0e451ebaf4..d87164226c0e18c883860ee5b78ef79a409d08b7 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'หัวข้อ 2';
 jsToolBar.strings['Heading 3'] = 'หัวข้อ 3';
 jsToolBar.strings['Unordered list'] = 'รายการ';
 jsToolBar.strings['Ordered list'] = 'ลำดับเลข';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'รูปแบบข้อความคงที่';
 jsToolBar.strings['Wiki link'] = 'เชื่อมโยงไปหน้า Wiki อื่น';
 jsToolBar.strings['Image'] = 'รูปภาพ';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 1e46e24707443ff8843106e190bb7d4ef6060167..a87ad3442a39fe229df8ddb07bd6acdb402e4e7e 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = '標題 2';
 jsToolBar.strings['Heading 3'] = '標題 3';
 jsToolBar.strings['Unordered list'] = '項目清單';
 jsToolBar.strings['Ordered list'] = '編號清單';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = '格式化文字';
 jsToolBar.strings['Wiki link'] = '連結至 Wiki 頁面';
 jsToolBar.strings['Image'] = '圖片';
index cd36a4b55e113439e4b0753c1e14ae41a0155332..2d68498f99319654407ed395859b9d1e9e0a02eb 100644 (file)
@@ -9,6 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
 jsToolBar.strings['Heading 3'] = 'Heading 3';
 jsToolBar.strings['Unordered list'] = 'Unordered list';
 jsToolBar.strings['Ordered list'] = 'Ordered list';
+jsToolBar.strings['Quote'] = 'Quote';
+jsToolBar.strings['Unquote'] = 'Remove Quote';
 jsToolBar.strings['Preformatted text'] = 'Preformatted text';
 jsToolBar.strings['Wiki link'] = 'Link to a Wiki page';
 jsToolBar.strings['Image'] = 'Image';
index 4ae1c70f1c0073dc724056fea0aa185d16cecc0f..f51d1841cecfb79545eac2d893d939b77ffae98a 100644 (file)
@@ -153,6 +153,8 @@ input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
 fieldset {border: 1px solid #e4e4e4; margin:0;}
 legend {color: #484848;}
 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
+blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
+blockquote blockquote { margin-left: 0;}
 textarea.wiki-edit { width: 99%; }
 li p {margin-top: 0;}
 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
index c4ab5571146374ff618e8c1d96190a1a2528dab7..4e9d44b6c51d3e4f1c55745bfed4f6af2699429a 100644 (file)
 .jstb_ol {
        background-image: url(../images/jstoolbar/bt_ol.png);
 }
+.jstb_bq {
+       background-image: url(../images/jstoolbar/bt_bq.png);
+}
+.jstb_unbq {
+       background-image: url(../images/jstoolbar/bt_bq_remove.png);
+}
 .jstb_pre {
        background-image: url(../images/jstoolbar/bt_pre.png);
 }
index ffee28b00826dde06a2ea7fe808e9ae729abef12..f8bf4a602e33621880c1a10acb7cf7b9727752f8 100644 (file)
@@ -178,6 +178,46 @@ class ApplicationHelperTest < HelperTestCase
     assert_equal '<p>Dashes: ---</p>', textilizable('Dashes: ---')
   end
   
+  def test_blockquote
+    # orig raw text
+    raw = <<-RAW
+John said:
+> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
+> Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
+> * Donec odio lorem,
+> * sagittis ac,
+> * malesuada in,
+> * adipiscing eu, dolor.
+>
+> >Nulla varius pulvinar diam. Proin id arcu id lorem scelerisque condimentum. Proin vehicula turpis vitae lacus.
+> Proin a tellus. Nam vel neque.
+
+He's right.
+RAW
+    
+    # expected html
+    expected = <<-EXPECTED
+<p>John said:</p>
+<blockquote>
+Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas sed libero.
+Nullam commodo metus accumsan nulla. Curabitur lobortis dui id dolor.
+<ul>
+  <li>Donec odio lorem,</li>
+  <li>sagittis ac,</li>
+  <li>malesuada in,</li>
+  <li>adipiscing eu, dolor.</li>
+</ul>
+<blockquote>
+<p>Nulla varius pulvinar diam. Proin id arcu id lorem scelerisque condimentum. Proin vehicula turpis vitae lacus.</p>
+</blockquote>
+<p>Proin a tellus. Nam vel neque.</p>
+</blockquote>
+<p>He's right.</p>
+EXPECTED
+    
+    assert_equal expected.gsub(%r{\s+}, ''), textilizable(raw).gsub(%r{\s+}, '')
+  end
+  
   def test_macro_hello_world
     text = "{{hello_world}}"
     assert textilizable(text).match(/Hello world!/)