Ruby Forum Rails Germany > Markup-Sprachen erweitern?!

Posted by Stefan Frank (Guest)
on 09.04.2008 09:12
(Received via mailing list)
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
Posted by Derek Kastner (Guest)
on 13.04.2008 15:40
(Received via mailing list)
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
Posted by Björn Großmann (Guest)
on 13.04.2008 16:53
(Received via mailing list)
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
Posted by Phillip Oertel (phillipoertel)
on 13.04.2008 18:08
(Received via mailing list)
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:
Posted by Stefan Frank (mugwump)
on 16.04.2008 07:48
(Received via mailing list)
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: