Rails中的自动wiki链接

时间:2009-07-13 11:10:07

标签: ruby-on-rails

我正在尝试在Rails中构建一个简单的wiki系统。

我想做的是自动将双括号内的单词转换为链接。

E.g。如果我有一个像[[示例]]

这样的单词

Rails会自动生成如下链接:

/笔记/显示/示例

关于我如何做到这一点的任何想法?

非常感谢

4 个答案:

答案 0 :(得分:0)

我会使用正则表达式检查用户输入(当有人编辑页面时)然后保存将找到的匹配转换为链接。

reg = Regexp.new('\[{2}[a-z]+\]{2}')
reg.match(page.content) do |match|
  #your code here
end

请参阅http://www.regular-expressions.info/ruby.html

在“页面”模型中,我将有一个字段来存储转换后的文本,并具有包含未过滤文本的虚拟属性。然后,此虚拟属性的“set”方法提供所有转换逻辑。

对于额外的奖励积分,我首先要检查维基页面是否存在。

答案 1 :(得分:0)

我猜你想为用户提供一个文本编辑器,他/她将通过该文本编辑器输入文本。在这种情况下,建议使用Javascript WYSIWYG编辑器,如textile,markdown,TinyMCE或YUI。

如果没有,您可以在解析用户输入时编写正则表达式:

pattern = Regexp.new('\[\[([a-zA-Z]+)\]\]') # Replace [a-zA-Z]+ with your choice of text match
link_converted_text = entered_text.gsub(pattern) {|match| link_generator_function(match[1]) }

链接到gsub method of String class

答案 2 :(得分:0)

我会在保存Note时使用Model callback生成html:

class Note < ActiveRecord::Base
  before_save :generate_html

  # ...other stuff...

  def generate_html
    # 'html' is a field whose value is a HTML version of the 'content' field
    self.html = self.content.gsub(/\[{2}([a-z]*?)\]{2}/) { |match| link_to $1, "/notes/show/#{$1}" }

    # generate other html...
  end
end

为了在像/notes/show/something这样的URL上实际查看Note,你需要告诉Rails如何接受它(Rails'show'路径通常需要你正在显示的记录的ID)。在你的Notes模型中,输入这样的内容(我假设你有一个名为url的字段是一个对URL友好的标题):

def Note.find_by_id_or_url id
  Note.find :first, :conditions => ['id = ? or url = ?', id, id]
end

然后在Notes控制器中,为show操作添加类似的内容:

@note = Note.find_by_id_or_url(params[:id])

就个人而言,我建议不要编写自己的语法分析器,只使用Markdown之类的东西。

答案 3 :(得分:0)

我不喜欢用插件来解决每个问题,但也许是“wikicloth”,MediaWiki标记语言的实现会帮助你解决问题?