crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику Tonal ::: Спасибо сказали: 69 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
1.9.2008, 7:35 Схема работы по переводу документации
Цитата(Litkevich Yuriy @ 29.8.2008, 22:36) *
= 1=
Исходная дукументация преобразуется в UTF-8, c коррекцией единственного тэга: с
<?xml version="1.0" encoding="iso-8859-1"?>
на
<?xml version="1.0" encoding="utf-8"?>

Назовем полученое, например, "первой версией"

Набросал утилитку на python-е которая это делает:
Раскрывающийся текст
# -*- coding: cp1251 -*-

import sys, os, os.path as osp
import codecs, re

#<?xml version="1.0" encoding="iso-8859-1"?>
_re_enc = re.compile(r'encoding=\"([^\"]+)\"')
def get_enc(fname):
  """
  Получение текущей кодировки файла
  @param fname Имя файла
  @return имя кодировки или None
  """
  mo = _re_enc.search(file(fname).readline())
  if not mo:
    return None
  return mo.group(1)

def do_file(ifname, ofname, out_enc):
  """
  Перевод файла из текущей кодировки в заданную с коррекцией тага
  @param ifname Исходный файл
  @param out_enc Выходная кодировка
  """
  inp_enc = get_enc(ifname)
  inp_file = codecs.open(ifname, 'r', inp_enc)
  out_file = codecs.open(ofname, 'wt', out_enc)
  line = inp_file.readline()
  print>>out_file, _re_enc.sub(
    'encoding="%s"' % out_enc, line.rstrip())
  for line in inp_file:
    print>>out_file, line.rstrip()

def iname2oname(iname, out_enc):
  """
  Преобразование имени входного файла в имя выходного
  @param iname Исходный файл
  @param out_enc Выходная кодировка
  @return имя кодировки или None
  """
  return '.utf-8.'.join(iname.rsplit('.', 1))

def main(out_enc):
  """
  Перевод всех файлов в указанной или текущей директории
  @param out_enc Выходная кодировка
  """
  if len(sys.argv) < 2 or not osp.isdir(sys.argv[1]):
    path = '.'
  else:
    path = sys.argv[1]
  for name in os.listdir(path):
    if name.endswith('.html') and not name.endswith('.%s.html' % out_enc):
      oname = iname2oname(name, out_enc)
      do_file(
        osp.normpath(osp.join(path, name)),
        osp.normpath(osp.join(path, oname)), out_enc)

if __name__ == '__main__':
  main('utf-8')

Для всех файлов в указанной или текущей директории оканчивающихся на .html создаётся файл .utf-8.html в кодировке utf-8 и поправленным тагом.
Цитата(Litkevich Yuriy @ 29.8.2008, 22:36) *
= Фантазии =
Некий робот периодически, если есть обновления в хранилище, запускает нужные утилиты которые конвертируют изменившиеся "переводы" в выше указаные форматы

Вполне просто организовывается - в свине есть механизм хуков. Пишем хук на после-коммит. :)
Litkevich Yuriy,
30.8.2008, 0:08 Правильное написание regexp
1) Составляем выражение, которое найдёт последовательность символов которую нужно оставить:
[\d.]+[WC]?_O(N|FF)\b
Кстати, минус у чисел может быть?
И ещё куда-то нужно запятую присобачить - из примера не видно.
2) Создаём QRegExp с этим выражением.
3) Для исходной строки ищем все вхождения и собираем из них выходящую строку.

Вот реализация на python-е:
import re

def clear_str(str):
  regExp = re.compile(r'[\d.]+[WC]?_O(N|FF)\b')
  return ' '.join(regExp.findAll(str))

Думаю перевести на С++ труда не составит? :)

П.С. Приведённое выражение поймает и такую последовательность: 1.2.3.4.5._ON
Непонятно нужно ли с этим бороться...
AD,
25.8.2008, 7:13 Как присоединить сигнал к функции
Цитата(Litkevich Yuriy @ 23.8.2008, 11:25) *

Кстати, можно сделать такой объект более универсальным:
class TmpSlot: QObject {
  Q_OBJECT
public:
  typedef void(*RealSlot)();
  TmpSlot(RealSlot realSlot, QWidget *parent = 0) :
    QObject(parent), realSlot(realSlot) {
    assert(realSlot);
  }

public slots:
    void doSlot() {realSlot();}
private:
  RealSlot realSlot;
};

Тогда использование становится таким:
int main(int argc, char *argv[]) {
  QPushButton *btnPath = new QPushButton("Open");
....
  TmpSlot tmp(&myfunk);
  QObject::connect(btnPath, SIGNAL(clicked()), &tmp, SLOT(doSlot()));
....
}
Litkevich Yuriy, niXman,
18.8.2008, 13:02 Есть ли в Qt видоизмененный QMap
Опять же всё зависит от того, что ты собираешься делать с данными из этого файла.
Если эти данные изменятся не будут, то и твоё решение вполне прокатит.
Если же будут изменятся, то лучше сделать так:
Выбираешь "нормальную форму ключа, например для "km|км" пусть это всегда будет строка km (а можно просто enum использовать, если ключи заранее известны)
В мапе хранишь данные для ключей только в "нормальной" форме.
При приходе ключа, сначала преобразовываешь его в "нормальную форму", а потом достаёшь данные.
AD,
18.8.2008, 8:36 Регулярное выражение от <form...> до первого </form>
Ага, проверил. Qt действительно не понимает конструкций +?, *? и ?? но при переключении во второй синтаксис все квантификаторы делаются "нежадными".
Т.е. работает <form[^>]+>(.+)</form> + QRegExp::RegExp2.
+ setMinimal
ViGOur,
11.8.2008, 11:07 Упрощение кода
1) После проверок где...
Код
if(...) isContinue = false;

заменить на
if(...) 
  return false;

2) Проверку на..
Код
if(isContinue && init_gaps) {

заменить на
if(!init_gaps)
  return true

3) Изменение, которое после checkStatusDist...
У тебя 3 ветки. Если смотреть на код этих веток после if(isContinue && init_gaps)... то ясно что третья ветка - это объединение первых 2. Стало быть мы выносим этот код из 1ий и 2ой ветви в отдельные функции а в третьей ветви вызываем обе этих функции.
4) Ну и из...
Из кода (time_t)fabs(double(next -> time_marker - cur -> time_marker));
Делаем функцию timeDist
5) Функции checkStatus* переименовываем в isStatus*.
AD,
10.8.2008, 14:51 Приведение типов C++/QT
Для того, чтобы работал qobject_cast, нужно не только унаследоваться от QObject, но и добавить макрос Q_OBJECT в описание класса. Для остальных Qt-шных кастов тоже требуются некоторые телодвижения. В отличие от dynamic_cast для которого всё делается автоматом при наличии хотя бы одного виртуального метода. :)
AD,
6.8.2008, 7:13 Валидность строки
2 AD
Скорее всего строка тут не причём. :)
Подобные вещи происходят тогда, когда ты разрушил память - кучу или стек.
Например вылетел за границы массива, дважды удалил один и тот же объект, или просто поработал по неинециализированному указателю.
Вот программа и валится в самых неожиданных местах.

2 void*
Если конструктор вызвался - объект уже инициализирован.
В QString() все данные корректно инициализируются, так что мусора там быть не может. Кроме случаев удара по памяти. :)
AD,
4.8.2008, 11:08 Солнечное затмение
Снималось на бытовой фотик + дискетка. :)
В реале конечно гораздо красивее.
AD, void*,
26.7.2008, 10:29 анекдот
Dr_Mebius: Несколько лет назад мой кабинет был превращен в полигон. По стене на разной высоте были ввинчены шпильки, а на пол прибиты бруски. Задача робота была: самостоятельно провести замеры шпилек, подготовить щит из фанеры (засверлить отверстия правильных диаметров), навесить щит на шпильки и привинтить гайками.

Отлаживали программу месяц. Когда сдавали заказчику, он подготовил на полигоне проверку: одну шпильку ввинтили под углом. Когда я заметил это, я затрепетал: что будет? Догадается ли сделать больше диаметр отверстия? Мой программер (молюсь на него) только улыбался. Когда машинка добралась до кривой шпильки, она произнесла: "вот cyka...", навинтила на шпильку гайку и выпрямила молотком. Японцы были в обмороке. Сказали, что не просили машину с "русским" интеллектом. Тем не менее, работу приняли.

http://bash.org.ru/quote/397957
elesy.ural, mihailikus,
24.7.2008, 10:16 Секреты и интересные возможности Qt
Цитата(AD @ 24.7.2008, 13:29) *
Не знаю, возможно, это и известный факт, но мне показалось не совсем обычным такое применение функции read/write. При этом применении она становится аналогом функций Windows Api ::ReadFile/::WriteFile:

Оно вполне обычное - сохранение буфера.
Но мне кажется, код у тебя не правильный.
Если сохранение/восстановление происходят в разных программах, или даже при разных запусках одной программы, в поле strOut.s с большой вероятностью будет мусор.
97WzugSKd31, 9or6UxhWRa1,

3 страниц V  < 1 2 3
RSS Текстовая версия Сейчас: 19.4.2024, 16:54