前提・実現したいこと
Rubyで掲示板を作っています。
掲示板にコメントする際に、URLを含んでいる場合、そのURLをハイパーリンクにしたいです。
どのようにコードを書けばいいでしょうか?
どこを調べてもRailsでの実装しか出てきません。Rubyでの実装がしたいです。
bbs.logファイルは下のrubyファイルと同じところに作ってる状態です。
Ruby
1# coding: utf-8 2 3require "socket" 4require "uri" 5require "cgi/util" 6require "pathname" 7 8LOG = "bbs.log" 9 10ss = TCPServer.open(8160) 11 12loop do 13 Thread.start(ss.accept) do |s| 14 begin 15 path, params = s.gets.split[1].split("?") 16 17 header = "" 18 body = "" 19 myname = "名無し" 20 value = "" 21 color = "" 22 size = "" 23 24 if (params != nil) 25 params.split("&").each do |param| 26 pair = param.split("=") 27 pname = pair[0] 28 pvalue = URI.decode(pair[1] == nil ? "" : pair[1]) 29 myname = pvalue if (pname == "myname") 30 value = pvalue if (pname == "value") 31 color = pvalue if (pname == "color") 32 size = pvalue if (pname == "size") 33 34 end 35 end 36 37 38 39 if (path == "/") 40 status = "200 OK" 41 header = "Content-Type: text/html; charset=utf-8" 42 43 log = [] 44 message = "" 45 46 if value != "" 47 value=value.gsub(/(\r\n|\r|\n)/, "<br />") 48 log.unshift("<b>#{myname}</b> : (<I>#{Time.new}</I>)<br><font color=" + color + " size=" + size +">" + value + "</font></p><br>\n") 49 f = open(LOG, "a") 50 log.each{ 51 |line| 52 f.print line 53 } 54 f.close 55 end 56 57 f = open(LOG) 58 f.each{|line| 59 message = line + message 60 } 61 f.close 62 63 def text_url_to_link message 64 65 URI.extract(message, ['http']).uniq.each do |url| 66 sub_text = "" 67 sub_text << "<a href=" << url << " target=\"_blank\">" << url << "</a>" 68 69 text.gsub!(url, sub_text) 70 end 71 72 return message 73 end 74 75 body = "<html><body>こんにちは<br>" 76 body += "<form method=get>" 77 body += "name:<input type=text name=myname value=名無し>" 78 body += "<select name=color>\n" 79 body += "<option value=black" 80 body +=" selected" if (color=="black") 81 body += ">黒</option>\n" 82 body += "<option value=red" 83 body +=" selected" if (color=="red") 84 body += ">赤</option>\n" 85 body += "<option value=blue" 86 body +=" selected" if (color=="blue") 87 body += ">青</option>\n" 88 body += "<option value=green" 89 body +=" selected" if (color=="green") 90 body += ">緑</option>\n" 91 body += "<option value=yellow" 92 body +=" selected" if (color=="yellow") 93 body += ">黄</option>\n" 94 body += "</select>\n" 95 body += "<select name=size>\n" 96 body += "<option value=1" 97 body +=" selected" if (size=="1") 98 body += ">1</option>\n" 99 body += "<option value=2" 100 body +=" selected" if (size=="2") 101 body += ">2</option>\n" 102 body += "<option value=3" 103 body +=" selected" if (size=="3") 104 body += ">3</option>\n" 105 body += "<option value=4" 106 body +=" selected" if (size=="4") 107 body += ">4</option>\n" 108 body += "<option value=5" 109 body +=" selected" if (size=="5") 110 body += ">5</option>\n" 111 body += "</select><br>\n" 112 body += "comment:<textarea name=value cols=40 rows=3></textarea>" 113 body += "<input type=submit value=書き込み>" 114 body += "</form><hr>" 115 body = body+message 116 body = body + "</body></html>" 117 118 else 119 status = "302 Moved" 120 header = "Location: /" 121 end 122 123 124 s.write("HTTP/1.0 " + status + "\r\n") 125 s.write(header + "\r\n") if (header != "") 126 s.write("\r\n") 127 s.write(body) 128 puts Time.new.to_s + " " + status + " " + path 129 s.close 130 end 131 end 132end
>Railsでの実装しか出てきません
Railsは結局Rubyで組まれてるので、ほぼ同じ考え方ができるのでは?
結局のところ正規表現による置換になると思いますし、
「Railsのやり方」がでてくるのでしたら、対応している機能など追っていくことで考え方を学ぶこともできるはずです。
require "uri"
def text_url_to_link text
URI.extract(text, ['http']).uniq.each do |url|
sub_text = ""
sub_text << "<a href=" << url << " target=\"_blank\">" << url << "</a>"
text.gsub!(url, sub_text)
end
return text
end
Railsのやり方はこれらしいのですが、これをRubyの正規表現で上のコードに入れることはできますでしょうか?
Railsのこのコードの場合、textの中に代入された文の中からhttpで始まる部分を抽出していると思いますが、上のコードだと掲示板でコメントした際にどこにそのコメントが代入されているのかがわかりません。
URIモジュールはRuby由来のものっぽいですが(リファレンスマニュアルにも載ってる)、それは使えないということですか?
いえ、URIモジュールは使えるので、このtext_url_to_linkをうまく上のコードに実装できていないだけだと思います。ここの実装がうまくいかなくて困っているところです。