module Redwood
module Chunk
+ WRAP_LEN = 80 # wrap messages and text attachments at this width
+
class Attachment
HookManager.register "mime-decode", <<EOS
-Executes when decoding a MIME attachment.
+Decodes a MIME attachment into text form. The text will be displayed
+directly in Sup. For attachments that you wish to use a separate program
+to view (e.g. images), you should use the mime-view hook instead.
+
Variables:
content_type: the content-type of the message
filename: the filename of the attachment as saved to disk
EOS
HookManager.register "mime-view", <<EOS
-Executes when viewing a MIME attachment, i.e., launching a separate
-viewer program.
+Views a non-text MIME attachment. This hook allows you to run
+third-party programs for attachments that require such a thing (e.g.
+images). To instead display a text version of the attachment directly in
+Sup, use the mime-decode hook instead.
+
+Note that by default (at least on systems that have a run-mailcap command),
+Sup uses the default mailcap handler for the attachment's MIME type. If
+you want a particular behavior to be global, you may wish to change your
+mailcap instead.
+
Variables:
content_type: the content-type of the attachment
filename: the filename of the attachment as saved to disk
Return value:
- True if the viewing was successful, false otherwise.
+ True if the viewing was successful, false otherwise. If false, calling
+ /usr/bin/run-mailcap will be tried.
EOS
#' stupid ruby-mode
text =
case @content_type
when /^text\/plain\b/
- Message.convert_from @raw_content, encoded_content.charset
+ Iconv.easy_decode $encoding, encoded_content.charset || $encoding, @raw_content
else
HookManager.run "mime-decode", :content_type => content_type,
:filename => lambda { write_to_disk },
@lines = nil
if text
@lines = text.gsub("\r\n", "\n").gsub(/\t/, " ").gsub(/\r/, "").split("\n")
+ @lines = lines.map {|l| l.chomp.wrap WRAP_LEN}.flatten
@quotable = true
end
end
if expandable?
"Attachment: #{filename} (#{lines.length} lines)"
else
- "Attachment: #{filename} (#{content_type})"
+ "Attachment: #{filename} (#{content_type}; #{@raw_content.size.to_human_size})"
end
end
def initial_state; :open end
def viewable?; @lines.nil? end
def view_default! path
- cmd = "/usr/bin/run-mailcap --action=view '#{@content_type}:#{path}' 2>/dev/null"
- Redwood::log "running: #{cmd.inspect}"
- system cmd
+ cmd = "/usr/bin/run-mailcap --action=view '#{@content_type}:#{path}'"
+ debug "running: #{cmd.inspect}"
+ BufferManager.shell_out(cmd)
$? == 0
end
end
class Text
- WRAP_LEN = 80 # wrap at this width
attr_reader :lines
def initialize lines
def patina_color
case status
- when :valid: :cryptosig_valid_color
- when :invalid: :cryptosig_invalid_color
+ when :valid then :cryptosig_valid_color
+ when :invalid then :cryptosig_invalid_color
else :cryptosig_unknown_color
end
end