From 8a3e713f2f776b0f2be4c4238661cae3c5b8bfd6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 2 Sep 2007 20:41:47 +0000 Subject: Added Redmine::WikiFormatting module and tests for wiki links. RedCloth librairy is now present in Redmine lib directory. git-svn-id: http://redmine.rubyforge.org/svn/trunk@699 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/wiki_formatting.rb | 79 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 lib/redmine/wiki_formatting.rb (limited to 'lib/redmine/wiki_formatting.rb') diff --git a/lib/redmine/wiki_formatting.rb b/lib/redmine/wiki_formatting.rb new file mode 100644 index 000000000..b6b2ff802 --- /dev/null +++ b/lib/redmine/wiki_formatting.rb @@ -0,0 +1,79 @@ +require 'redcloth' + +module Redmine + module WikiFormatting + + private + + class TextileFormatter < RedCloth + RULES = [:inline_auto_link, :inline_auto_mailto, :textile ] + + def initialize(*args) + super + self.hard_breaks=true + end + + def to_html + super(*RULES).to_s + end + + private + + # Patch for RedCloth. Fixed in RedCloth r128 but _why hasn't released it yet. + # http://code.whytheluckystiff.net/redcloth/changeset/128 + def hard_break( text ) + text.gsub!( /(.)\n(?!\n|\Z| *([#*=]+(\s|$)|[{|]))/, "\\1
" ) if hard_breaks + end + + AUTO_LINK_RE = %r{ + ( # leading text + <\w+.*?>| # leading HTML tag, or + [^=<>!:'"/]| # leading punctuation, or + ^ # beginning of line + ) + ( + (?:https?://)| # protocol spec, or + (?:www\.) # www.* + ) + ( + [-\w]+ # subdomain or domain + (?:\.[-\w]+)* # remaining subdomains or domain + (?::\d+)? # port + (?:/(?:(?:[~\w\+%-]|(?:[,.;:][^\s$]))+)?)* # path + (?:\?[\w\+%&=.;-]+)? # query string + (?:\#[\w\-]*)? # trailing anchor + ) + ([[:punct:]]|\s|<|$) # trailing text + }x unless const_defined?(:AUTO_LINK_RE) + + # Turns all urls into clickable links (code from Rails). + def inline_auto_link(text) + text.gsub!(AUTO_LINK_RE) do + all, a, b, c, d = $&, $1, $2, $3, $4 + if a =~ /=]?/ + # don't replace URL's that are already linked + # and URL's prefixed with ! !> !< != (textile images) + all + else + text = b + c + %(#{a}#{text}#{d}) + end + end + end + + # Turns all email addresses into clickable links (code from Rails). + def inline_auto_mailto(text) + text.gsub!(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do + text = $1 + %{} + end + end + end + + public + + def self.to_html(text, options = {}) + TextileFormatter.new(text).to_html + end + end +end -- cgit v1.2.3