Markup-Sprachen erweitern?!

Hi Liste,

ich bin gerade auf der Suche nach einer einfachen, erweiterbaren
Markup-Sprache: Konkret möchte ich gerne sowas machen:

[pubmed:18344731] oder [ref:Axon]

die dann je nach Typ in entsprechende vollständige Links aufgelöst
werden, also z.b.

J Clin
Psychopharmacol. 2008 Apr;28(2):203-9.

Nun hatte ich mir dazu RedCloth und BlueCloth angeschaut, aber die
sind nicht gerade toll dokumentiert: Man kann findet dazu ein paar
Blogeinträge, wie man das Markdown bzw. Textile aufhacken kann (z.B.
fürs Syntaxhighlighting), aber so richtig toll&sauber sieht das alles
auf den ersten Blick nicht aus: Hat jemand mit den beiden *Cloth schon
Erfahrung, wie man die erweitert und was da das Beste ist? Gibt’s noch
andere Alternativen?!

Danke&GrüßeStefan

Stefan,

Es gibt nicht so viele wikis die auf Ruby programmiert sind, und so
gibt es keine Markup Gems wie Cite fur Wikipedia. Cite ist in PHP
programmiert. Vielleicht koennen Sie ein Cite gem fur Ruby machen.

Cite: Extension:Cite - MediaWiki

Alternativ:

Ein helper:

def parse_pubmed(text)
text =~ /[pubmed:(\d+)/

vielleicht das Artikel Titel mit Net::HTTP nehmen

return “<a href="PubMed
#{titel}>#{andere_data}"
end

Hallo Derek,

versuch mal so was:
(z.B. nach config/initializers/redcloth.rb legen und dann eine Instanz
von
RedClothCustom instantiieren.)

class RedClothCustom < RedCloth

RULES = [:refs_textile, :block_textile_table, :block_textile_lists,
:block_textile_prefix, :inline_textile_image,
:inline_textile_link,
:inline_textile_code, :inline_textile_span,
:glyphs_textile,
# + custom rules:
:inline_textile_pubmed]

def inline_textile_pubmed( text )
# search for pubmed:id
text.gsub!(/pubmed:(\d+)/) do |m|
id = $1
pubmed = Pubmed.find(id)
if nil != pubmed
rip_offtags( <<-EOF)
#{pubmed.name}
EOF
else
“!!! PUBMED not found: #{id} !!!”
end
end
def to_html
super(*RULES)
end
end

Damit kann man auch sonst noch sehr coole Sachen machen, z.B. custom
Tags
für das Einbetten von Flash- oder Quicktime Videos oder die Methode
überschreiben, die die ausgibt und bei externen
links
als Target “_blank” hinzufügen.

Falls Du noch Fragen hast, sag Bescheid!

Schöne Grüße,

Björn

hallo stefan,

du kannst das ganze auch mit einem after_filter machen, dann musst du
Red/BlueCloth nicht anfassen.
dein filter wird nach dem template-parser ausgeführt und fügt dann die
links in das (fast) fertige html ein.

klingt vielleicht ein bischen dreckiger als die erweiterung der
template-engine, funktioniert aber :slight_smile:

beispiel:

class MyController < ApplicationController

 after_filter :generate_links_from_custom_tags

 # evtl. in config-datei umziehen
 TAG_MAPPING = {
   :pubmed => {
     :href      => 'http://www.ncbi.nlm.nih.gov/pubmed/%d',
     :title     => Proc.new { |article_id | "(this will be the

title for #{article_id}, once it is resolved)" },
:link_text => Proc.new { |article_id| “(this will be the
link_text for #{article_id}, once it is resolved)” }
},
:ref => {
:href => ‘…’,
:title => Proc.new { ‘’ },
:link_text => Proc.new { ‘’ }
}
}

   private

     def generate_links_from_custom_tags
       # ? in regex is for non-greedy :-)
       response.body.gsub!(/\[(.+?):(.+?)\]/) do |match|
         tag, value = $1.to_sym, $2
         href      = TAG_MAPPING[tag][:href] % value
         title     = TAG_MAPPING[tag][:title].call(value)
         link_text = TAG_MAPPING[tag][:link_text].call(value)
         '<a href="%s" title="%s">%s</a>' % [href, title, link_text]
       end
     end

end

viele
grüße,phillip

Am 13.04.2008 um 15:39 schrieb Derek Kastner:

Vielen Dank an alle für die Tips! Mittlerweile hab ich auch einen
Artikel gefunden, wie man RedCloth erweitert
(http://nubyonrails.com/articles/about-this-blog-custom-textile
) - aber ich werde wohl doch bei dieser “handgemachten” Erweiterung
bleiben: Das scheint mir irgendwie das sicherste zu sein, dann kann
man auch leichter die darunter liegende Engine auswechseln.

Viele
GrüßeStefan

Am 13.04.2008 um 18:08 schrieb Phillip O.: