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. <a href="http://www.ncbi.nlm.nih.gov/pubmed/18344731" title="Antipsychotic-induced extrapyramidal side effects in bipolar disorder and schizophrenia: a systematic review">J Clin Psychopharmacol. 2008 Apr;28(2):203-9.</a> 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
on 09.04.2008 09:12
on 13.04.2008 15:40
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: http://www.mediawiki.org/wiki/Extension:Cite/Cite.php Alternativ: Ein helper: def parse_pubmed(text) text =~ /\[pubmed:(\d+)/ # vielleicht das Artikel Titel mit Net::HTTP nehmen return "<a href=\"http://www.ncbi.nlm.nih.gov/pubmed/#{$1}\" #{titel}>#{andere_data}</a>" end
on 13.04.2008 16:53
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)
<a href="http://www.ncbi.nlm.nih.gov/pubmed/#{id}"
title="#{pubmed.description}">#{pubmed.name}</a>
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 <a href="...">...</a> ausgibt und bei externen
links
als Target "_blank" hinzufügen.
Falls Du noch Fragen hast, sag Bescheid!
Schöne Grüße,
Björn
on 13.04.2008 18:08
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 :-)
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:
on 16.04.2008 07:48
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 Oertel: