#!/usr/bin/ruby
#
# Cyrka (degibberish tool)
# Recovers Cyrillic text improperly transcoded from Windows charset.
# Author: Paul Philippov, http://paulphilippov.com/
# License: http://creativecommons.org/licenses/BSD/
# Last change: 25-Sep-2009.
#

require 'gtk2'
require 'iconv'

module Ppds
  class Cyrka < Gtk::Window
    def initialize
      super Gtk::Window::TOPLEVEL

      set_size_request 250, 150
      set_border_width 8
      set_allow_shrink false
      set_title 'Cyrka'
      signal_connect(:destroy) { Gtk::main_quit }

      button = Gtk::Button.new 'degibberish'
      button.signal_connect(:clicked) {
        @target.set_value @source.get_value.from_1252_to_1251
      }

      @source = Gtk::LabeledTextView.new
      @target = Gtk::LabeledTextView.new
      @target.set_editable false

      box = Gtk::VBox.new false, 8
      box.pack_start scrollable(@source)
      box.pack_start scrollable(@target)
      box.pack_start button, false

      self.add box
      self.show_all
    end

    def scrollable(widget)
      scroll = Gtk::ScrolledWindow.new
      scroll.set_shadow_type Gtk::SHADOW_IN
      scroll.set_policy Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC
      scroll.add widget
      scroll.show_all
    end
  end
end

module Gtk
  class LabeledTextView < TextView
    def initialize()
      super
      self.set_wrap_mode Gtk::TextTag::WRAP_WORD
      self.set_accepts_tab false
      self.set_right_margin 5
      self.set_left_margin 5
      self.buffer.set_text ''
    end

    def get_value
      self.buffer.get_text
    end

    def set_value(value)
      self.buffer.set_text value
    end
  end
end

class String
  def from_1252_to_1251
    Iconv.new('utf8', 'cp1251').iconv(Iconv.new('cp1252', 'utf8').iconv(self))
  end
end

w = Ppds::Cyrka.new
Gtk::main

