Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

« Newer Snippets
Older Snippets »
Showing 1-2 of 2 total  RSS 

Converting Twiki formatting to MediaWiki

// It's not necessarily the cleanest, but it got the job done on an internal transfer we were doing. Your mileage may vary by quite a bit.

def convert_from_twiki_to_mediawiki(old_page_text)
  new_page_text = ""
  
  # shifting the tables over
  while (true)
    if (old_page_text.index(/\n\|/).nil?)
      new_page_text += old_page_text
      break
    end
        
    # table extraction
    table_index = old_page_text.index("\n|")
    first_chunk = old_page_text.slice!(0..table_index)
    table_chunk = ""
    old_page_text.each_line do |line|
      if line[0..0] == '|'
        table_chunk += line
      else
        break
      end
    end
    old_page_text.slice!(table_chunk)
    
    # table conversion
    table_chunk.gsub!(/\|/, "||")
    table_chunk.gsub!(/\|\|\s*$/, "\n|-")
    table_chunk.gsub!(/^\|\|/, "|")
    table_chunk.gsub!(/\|-\s*\Z/, "|}")
    table_chunk.gsub!(/\A\|/, "{|class=\"wikitable sortable\"\n|")
    
    # process new table looking for headings
    new_table_chunk = ""
    table_chunk.each_line do |line|
      if line.match(/\*\s.*\s\*/)
        line.gsub!(/\|\|/, "!!")
        line.gsub!(/^\|/, "!")
        line.gsub!("*", '')
      end
      
      new_table_chunk += line
    end
    
    new_page_text += first_chunk + new_table_chunk
  end
  
  # bold
  new_page_text.gsub!(/(^|[\s\(])\*([^ ].*?[^ ])\*([\s\)\.\,\:\;\!\?]|$)/, "\\1'''\\2'''\\3")
  # italic bold
  new_page_text.gsub!(/(^|[\s\(])\_\_([^ ].*?[^ ])\_\_([\s\)\.\,\:\;\!\?]|$)/, "\\1''<b>\\2<\/b>''\\3") 
  # italic
  new_page_text.gsub!(/(^|[\s\(])\_([^ ].*?[^ ])\_([\s\)\.\,\:\;\!\?]|$)/, "\\1''\\2''\\3")
  # monospaced bold
  new_page_text.gsub!(/(^|[\s\(])==([^ ].*?[^ ])==([\s\)\.\,\:\;\!\?]|$)/, "\\1'''<tt>\\2<\/tt>'''\\3")
  # monospaced
  new_page_text.gsub!(/(^|[\s\(])=([^ ].*?[^ ])=([\s\)\.\,\:\;\!\?]|$)/, "\\1<tt>\\2<\/tt>\\3")
  # H6
  new_page_text.gsub!(/(^|[\n\r])---\+\+\+\+\+\+([^\n\r]*)/, "\\1======\\2 ======")
  # H5
  new_page_text.gsub!(/(^|[\n\r])---\+\+\+\+\+([^\n\r]*)/, "\\1=====\\2 =====")
  # H4
  new_page_text.gsub!(/(^|[\n\r])---\+\+\+\+([^\n\r]*)/, "\\1====\\2 ====")
  # H3
  new_page_text.gsub!(/(^|[\n\r])---\+\+\+([^\n\r]*)/, "\\1===\\2 ===")
  # H2
  new_page_text.gsub!(/(^|[\n\r])---\+\+([^\n\r]*)/, "\\1==\\2 ==")
  # H1
  new_page_text.gsub!(/(^|[\n\r])---\+([^\n\r]*)/, "\\1=\\2 =")
  # external link
  new_page_text.gsub!(/\[\[(https?\:.*?)\]\[(.*?)\]\]/, "\[\\1 \\2\]")
  # internal link [[WikiWord][WikiWord]]
  new_page_text.gsub!(/\[\[([^\]]*)\]\]/, "\[\[\\1\|\\1\]\]")
  # internal lnk [[WikiWord][label]]
  new_page_text.gsub!(/\[\[([^\]]*)\]\[(.*?)\]\]/, "\[\[\\1\|\\2\]\]")
  # level 1 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{3}\* /, "\\1*")
  # level 2 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{6}\* /, "\\1**")
  # level 3 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{9}\* /, "\\1***")
  # level 4 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{12}\* /, "\\1****")
  # level 5 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{15}\* /, "\\1*****")
  # level 6 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{18}\* /, "\\1******")
  # level 7 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{21}\* /, "\\1*******")
  # level 8 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{24}\* /, "\\1********")
  # level 9 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{27}\* /, "\\1*********")
  # level 10 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{30}\* /, "\\1**********")
  # level 1 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{3}[0-9]\.? /, "\\1#")
  # level 2 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{6}[0-9]\.? /, "\\1##")
  # level 3 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{9}[0-9]\.? /, "\\1###")
  # level 4 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{12}[0-9]\.? /, "\\1####")
  # level 5 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{15}[0-9]\.? /, "\\1#####")
  # level 6 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{18}[0-9]\.? /, "\\1######")
  # level 7 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{21}[0-9]\.? /, "\\1#######")
  # level 8 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{24}[0-9]\.? /, "\\1########")
  # level 9 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{27}[0-9]\.? /, "\\1#########")
  # level 10 bullet
  new_page_text.gsub!(/(^|[\n\r])[ ]{30}[0-9]\.? /, "\\1##########")
    
  
  new_page_text
end

HTML (TWiki Calendar) to iCal Proxy

Run the Ruby on Rails code below in a webserver (like Lighthttp) and you can subscribe your TWiki Calendar with iCal or Mozilla Sunbird.

It is also a nice example to show, how good and easy the icalendar (create and read icalendars) and the hpricot (html parser) libraries (gems) are.

require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'icalendar'
require 'date'

class IcalController < ApplicationController
	include Icalendar
	def index
		doc = Hpricot(open("http://irgendwo.net/twiki/bin/view/Main/TermineProjekte"))

		cal = Calendar.new
	
		(doc/"#kalender/table").each do |table|
			(table/"/tr").each do |row|
	
				inner_table = (row/"/td/table").first
	
				first_row = true 
				monat = nil
				monat_jahr = Array.new
	
				(inner_table/"/tr").each do | inner_row |
					if first_row
						monat = "#{(inner_row/"/td/center/font").inner_html}"
						monat_jahr = monat.split
						first_row = false
					else
	
						(inner_row/"td").each do |cell|
							text = cell.inner_html
							text = text.gsub(/<(br )\/?>/," / ")
							text = text.gsub( /<\/?[^>]+(>|$)/, "" ) 
							
							unless text == "&nbsp;" or text.size <= 2
								event = Event.new
								event.start = Date.new(monat_jahr[1].to_i, Date::MONTHNAMES.index(monat_jahr[0]), text[0..1].to_i)
								event.summary = "#{text[5..text.size]}"
								cal.add_event(event)
							end
						end
					end
				end
			end  
		end
		cal_string = cal.to_ical
		send_data cal_string, :filename => "it_calendar.ics", :type => "text/calendar"
	end
end
« Newer Snippets
Older Snippets »
Showing 1-2 of 2 total  RSS