Hikiのattachプラグイン

tDiaryのimageプラグインを無理やりHikiに突っ込んで表示メソッドだけを使っていたのだが、どうしてもuploadフォームが動かない。imageプラグインを参考にして、attachプラグインを添付画像一覧を表示するように改造してみた。attachプラグインは、どんなファイルでも添付できるのに、ファイルは画像しか無い前提のコードになっているのでまだ不完全。

--- save/attach.rb	Sat Jun 26 23:11:24 2004
+++ ./attach.rb	Fri Apr  8 17:08:51 2005
@@ -23,6 +23,53 @@
</ul></div>'
end

+#
+# service methods below. (from tDiary image.rb plugin)
+#
+
+def attach_file_info(fname)
+	image_type = nil
+	image_height = nil
+	image_width = nil
+  attach_file = "#{@cache_path}/attach/#{@page.escape}/#{fname.escape}"
+	f = File.open(attach_file)
+
+	sig = f.read( 24 )
+	if /\A\x89PNG\x0D\x0A\x1A\x0A(....)IHDR(........)/on =~ sig
+		image_type = 'png'
+		image_height, image_width = $2.unpack( 'NN' )
+
+	elsif /\AGIF8[79]a(....)/on =~ sig
+		image_type   = 'gif'
+		image_height, image_width = $1.unpack( 'vv' )
+
+	elsif /\A\xFF\xD8/on =~ sig
+		image_type = 'jpg'
+		data = $'
+		until data.empty?
+			break if data[0] != 0xFF
+			break if data[1] == 0xD9
+
+			data_size = data[2,2].unpack( 'n' ).first + 2
+			if data[1] == 0xC0
+				image_width, image_height = data[5,4].unpack('nn')
+				break
+			else
+				if data.size < data_size
+					f.seek(data_size - data.size, IO::SEEK_CUR)
+					data = ''
+				else
+					data = data[data_size .. -1]
+				end
+				data << f.read( 128 ) if data.size < 4
+			end
+		end
+	end
+
+	return image_type, image_height, image_width, FileTest.size(f)
+end
+#
+#
def attach_form(s = '')
command = @command == 'create' ? 'edit' : @command
<<EOS
@@ -75,8 +122,13 @@
s << %Q!#{file_name.escapeHTML}</a>!
end

-def attach_image_anchor(file_name, page=@page)
-  s =  %Q!<img alt="#{file_name.escapeHTML}" src="!
+def attach_image_anchor(file_name, page=@page, width=nil, height=nil, place=nil)
+  if (width && height)
+    imgsize = %Q!width="#{width}" height="#{height}"!
+  else
+    imgsize = ''
+  end
+  s =  %Q!<img class="#{place}" alt="#{file_name.escapeHTML}" #{imgsize} src="!
s << %Q!#{$cgi_name}#{cmdstr('plugin', "plugin=attach_download;p=#{page.escape};file_name=#{file_name.escape}")}">!
s << %Q!</img>!
end
@@ -149,11 +201,11 @@
end
end

-def attach_view(file_name, page=@page)
+def attach_view(file_name, width=nil, height=nil, place=nil, page=@page)
if file_name =~ /\.(txt|rd|rb|c|pl|py|sh|java|html|htm|css|xml|xsl)\z/i
attach_src(file_name, page)
elsif file_name =~ /\.(jpeg|jpg|png|gif|bmp)\z/i
-    attach_image_anchor(file_name, page)
+    attach_image_anchor(file_name, page, width, height, place)
end
end

@@ -201,10 +253,36 @@
end

def attach_show_page_files_checkbox
-  s =  ''
+  s = %Q[
+    <script type="text/javascript">
+    <!--
+      var elem=null
+      function ins(val){
+      //  alert(val)
+          elem.value+=val
+      }
+      window.onload=function(){
+        for(var i=0;i<document.forms.length;i++){
+          for(var j=0;j<document.forms[i].elements.length;j++){
+            var e=document.forms[i].elements[j]
+            if(e.type&&e.type=="textarea"){
+              if(elem==null){
+                elem=e
+              }
+              e.onfocus=new Function("elem=this")
+            }
+          }
+        }
+      }
+    //-->
+    </script>
+  ]
if (files = attach_page_files).size > 0
s << %Q!&lt;p&gt;#{attach_files_label}:
!
+    s1 = ''
+    s2 = ''
+    s3 = ''
files.each do |file_name|
f = file_name.unescape
case $charset
@@ -213,8 +291,23 @@
when 'Shift_JIS'
f = file_name.unescape.to_sjis
end
-      s << %Q! [<input type="checkbox" name="file_#{file_name}" value="true">#{attach_anchor(f)}] \n!
+      #img_info = image_info(file_name)
+      img_info = attach_file_info(f)
+      img_w = img_info[1]
+      img_h = img_info[2]
+      while (img_w > 200)
+        img_w = img_w / 2
+        img_h = img_h / 2
+      end
+      #s1 << %Q! &lt;td&gt;<input type="button" onclick="window.status='xxx'" value="本文に追加"> </td>\n!
+      s1 << %Q! &lt;td&gt;<input type="button" onclick="ins('{{attach_view(&quot;#{f}&quot;,#{img_w},#{img_h}}}')" value="本文に追加"> </td>\n!
+      #s1 << %Q! &lt;td&gt;<input type="button" onclick="window.status='xxx'; ins({{attach_view(#{f})}})" value="本文に追加"> </td>\n!
+      #s1 << %Q! &lt;td&gt;{{attach_view(#{f},#{img_w},#{img_h})}} </td>\n!
+      s2 << %Q! &lt;td&gt;#{attach_view(f,img_w,img_h)} </td>\n!
+      s3 << %Q! &lt;td&gt;<input type="button" onclick="ins('{{attach_view(&quot;#{f}&quot;,#{img_w},#{img_h}}}')" value="本文に追加">&lt;br&gt;#{img_info[1]}x#{img_info[2]}(#{img_info[3]/1024}K)&lt;br&gt;<input type="checkbox" name="file_#{file_name}" value="true">#{attach_anchor(f)} </td>\n!
end
+    #s << %Q!&lt;br&gt;&lt;table&gt;&lt;tr&gt;#{s1}</tr>&lt;tr&gt;#{s2}</tr>&lt;tr&gt;#{s3}</tr></table>&lt;br&gt;!
+    s << %Q!&lt;br&gt;&lt;table&gt;\n&lt;tr&gt;\n#{s2}</tr>\n&lt;tr&gt;\n#{s3}</tr>\n</table>&lt;br&gt;!
s << %Q!<input type="submit" name="detach" value="#{detach_upload_label}">\n</p>!
end
s
@@ -235,12 +328,13 @@

add_form_proc {
begin
-    s = case @options['attach.form']
-    when 'edit', 'both'
+    #s = case @options['attach.form']
+    #when 'edit', 'both'
attach_form(attach_show_page_files_checkbox)
-    else
-      ''
-    end
+      #else
+      #''
+      #end
rescue Exception
end
}
+