воскресенье, 11 января 2009 г.

gedit encoding converter

Казалось бы такая бытовая операция как открытие текстового файла, представляет из себя серезную проблемму если вы находитесь под ОС линукс.

Если вы недавно перешли на операционную систему Линукс наверняка захватите с собой все файлы сохраненные под Windows в кодировке CP-1251. Чье содержимое при просмотре стандартными программами под Линукс привидет к искожению содержимого. Так например станартный редактор текста gedit показывается содержимое виндус файлов в кодировке ISO-8859-15, что не позволяет читать его содержимое. Так же вы можете попробовать вывести файл в терминал или, напирмер посмотреть фильм с русскими субтитрами программой VLC Player. Во всех этих случаях вы получаете искаженный вывод.

Одно из возможных решений - перевести файлы в формат UTF-8.

Для этой цели я набросал небольшой плагин для текстового редактора gedit. В настоящий момент он поддерживает переобразование из кодировки CP-1251 в UTF-8. Но без труда может быть доработан до включения всех поддерживаемых расскладок.

~/.gnome2/gedit/plugins/encodingconverter.gedit-plugin
[Gedit Plugin]
Loader=python
Module=encodingconverter
IAge=2
Name=Encoding Converter
Description=Converts open files to other encoding
Authors=Alexey Kuznetsov
Copyright=Copyright © 2009 Alexey Kuznetsov <ak@axet.ru>
Website=http://axet.ru

~/.gnome2/gedit/plugins/encodingconverter.py
'''
thx to http://live.gnome.org/Gedit/PythonPluginHowTo

Copyright (C) 2009 Alexey Kuznetsov <ak@axet.ru>

version 1.0.0

'''

import gedit
import gtk
import codecs
import os
import sys
from os.path import join, getsize

class EncodingConverterPluginHelper:
  submenu = """<ui>
    <menubar name='MenuBar'>  
      <menu name='ToolsMenu' action='Tools'>
        <menuitem action='fromCP1251'/>
      </menu>
    </menubar>
  </ui>"""

  def __init__(self, plugin, window):
    self.window = window
    self.plugin = plugin

    doc = self.window.get_active_document()

    actions = (
        ("fromCP1251", None, "Convert text from CP1251", None, "Convert text from CP1251", self.fromCP1251),
    )

    self.action_group = gtk.ActionGroup("GeditToUTF8EncodingConverterPluginActions")
    self.action_group.add_actions(actions, window)

    manager = window.get_ui_manager()
    manager.insert_action_group(self.action_group, -1)
    self.ui_id = manager.add_ui_from_string(self.submenu)

  def __del__(self):
    manager = self.window.get_ui_manager()
    manager.remove_ui(self.ui_id)
    manager.remove_action_group(self.action_group)
    manager.ensure_update()

  def update_ui(self):
    doc = self.window.get_active_document()
    self.action_group.set_sensitive(bool(doc and not doc.get_readonly()))

  def fromCP1251(self, widget, window):
    doc = window.get_active_document()
    start, end = doc.get_bounds()

    text = doc.get_text(start, end)

    currentencoder = codecs.lookup(doc.get_encoding().get_charset())[0]

    utf8decoder = codecs.lookup('utf-8')[1]
    windecoder = codecs.lookup('windows-1251')[1]
    utf8encoder = codecs.lookup('utf-8')[0]

    text = utf8decoder(text)[0]

    text = currentencoder(text)[0]

    text = windecoder(text)[0]

    text = utf8encoder(text)[0];

    doc.begin_user_action()
    it = doc.get_iter_at_mark(doc.get_insert())
    line = it.get_line()
    doc.delete(start, end)
    doc.insert(start, text)
    doc.end_user_action()

class EncodingConverterPlugin(gedit.Plugin):
  def __init__(self):
    gedit.Plugin.__init__(self)
    self._instances = {}

  def activate(self, window):
    self._instances[window] = EncodingConverterPluginHelper(self, window)

  def deactivate(self, window):
    del self._instances[window]

  def update_ui(self, window):
    self._instances[window].update_ui()


Домашняя страница проекта:

2 коммент.:

  1. не найдя на http://live.gnome.org/Gedit/Plugins подобного плагина уже сам принялся писать, пока гуглил документацию, наткнулся на эту запись, спасибо за плагин :)
    ОтветитьУдалить