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!<p>#{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! <td><input type="button" onclick="window.status='xxx'" value="本文に追加"> </td>\n!
+      s1 << %Q! <td><input type="button" onclick="ins('{{attach_view(&quot;#{f}&quot;,#{img_w},#{img_h}}}')" value="本文に追加"> </td>\n!
+      #s1 << %Q! <td><input type="button" onclick="window.status='xxx'; ins({{attach_view(#{f})}})" value="本文に追加"> </td>\n!
+      #s1 << %Q! <td>{{attach_view(#{f},#{img_w},#{img_h})}} </td>\n!
+      s2 << %Q! <td>#{attach_view(f,img_w,img_h)} </td>\n!
+      s3 << %Q! <td><input type="button" onclick="ins('{{attach_view(&quot;#{f}&quot;,#{img_w},#{img_h}}}')" value="本文に追加"><br>#{img_info[1]}x#{img_info[2]}(#{img_info[3]/1024}K)<br><input type="checkbox" name="file_#{file_name}" value="true">#{attach_anchor(f)} </td>\n!
     end
+    #s << %Q!<br><table><tr>#{s1}</tr><tr>#{s2}</tr><tr>#{s3}</tr></table><br>!
+    s << %Q!<br><table>\n<tr>\n#{s2}</tr>\n<tr>\n#{s3}</tr>\n</table><br>!
     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
 }
+
Last modified: 2011-03-20 by Unknown