Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » OutWiker

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

Открыть новую тему     Написать ответ в эту тему

Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OutWiker


Текущая стабильная версия: 3.0.0

Текущая бета-версия: 3.0.0.888 (13.05.2021)



 
Поддерживаемые операционные системы: Windows / Linux.
 
Программа OutWiker предназначена для хранения заметок в виде дерева. Такие программы называют outliner'ами, персональными вики или древовидными редакторами. Я долго подбирал для себя подобную программу из имеющихся, но в итоге решил сделать свой outliner в том виде, как он мне представляется наиболее удобным для использования.
Основное отличие OutWiker от других подобных программ заключается в том, что OutWiker не только хранит дерево заметок в виде обычных директорий на диске, но и поощряет изменение такой базы внешними средствами. Также к программе может быть прикреплено любое количество файлов.
Кроме того, OutWiker может содержать страницы разного типа, в данный момент поддерживаются два типа страниц: обычный текст и HTML, но в будущем количество типов страниц будет увеличиваться.
 
Основные возможности
* База хранится в виде директорий на диске.
* Поддержка плагинов
* К каждой заметке можно прикреплять любое количество файлов.
* Страницы могут быть разных типов. В данный момент поддерживаются текстовые страницы, страницы в формате HTML и вики-страницы.
* Прикрепленные картинки могут быть вставлены в HTML-страницы.
* Раскраска синтаксиса HTML.
* Поддержка тегов.
* Поддержка закладок на страницы.
* Каждая ветвь дерева может быть открыта как отдельная вики.
* Иконки для страниц.
* Кроссплатформенность (поддержка Windows и Linux).
* Портабельность. Программа все настройки хранит рядом с запускаемым файлом.
* Программа распространяется с открытыми исходниками.
* Возможность создания ссылок между страницами.
* Есть глобальный поиск по заметкам и поиск по тегам.
* К программе прилагается справка.

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 19:47 04-05-2010 | Исправлено: Jenyay, 19:39 13-05-2021
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
del

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 15:25 16-02-2015 | Исправлено: unreal666, 15:55 16-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Тоже попробую.

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 15:27 16-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хотя нет. Надо еще подумать - регесп подправить. Временно убрал. Если получится, обратно выложу.

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 15:45 16-02-2015 | Исправлено: unreal666, 15:55 16-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
unreal666
 
Я тут сейчас переписываю HtmlImprover, так что готовься морально, что в твоем форке что-то не смержится.

----------
http://jenyay.net - софт, исходники и фото

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 20:08 16-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jenyay
кажется намутил

Код:
# -*- coding: UTF-8 -*-
 
from outwiker.libs.pyparsing import Suppress, CharsNotIn, Combine, ZeroOrMore, NotAny, Forward, OneOrMore
 
 
class QuoteFactory (object):
    """
    Фабрика для создания токена для цитат
    """
    @staticmethod
    def make (parser):
        return QuoteToken(parser).getToken()
 
 
class QuoteToken (object):
    quoteStart = Suppress('[>')
    quoteEnd = Suppress('<]')
    anyChar = CharsNotIn('', exact=1)
    anyExcept = Combine( ZeroOrMore( NotAny (quoteStart | quoteEnd) + anyChar ) )
    # anyExcept = Regex(r'(?:(?!\[>|<\]).)*')
    token = Forward()
    token << (quoteStart + ( OneOrMore( anyExcept + OneOrMore(token) ) + anyExcept | anyExcept ) +
                  quoteEnd).leaveWhitespace()
 
    def __init__ (self, parser):
        self.parser = parser
 
 
    def getToken (self):
        return QuoteToken.token.setParseAction(self.__parse)("quote")
 
 
    def __parse (self, s, l, t):
        return u''.join([u'<blockquote>', self.parser.parseWikiMarkup (u''.join(t)), u'</blockquote>'])
 

за идею взял инфу о парсинге S-выражений из книги "Getting Started with Pyparsing".
кажется работает норм
 
Добавлено:
блин. Почти нормально. Косяк в том, что текст внутри цитаты не обрабатывается другими командами.
 
Добавлено:
исправил. Теперь кажется работает как положено.
 
Добавлено:
хотя нет. Есть косячок с тем, что ссылки 2 раза обрабатываются из-за обработки вложенных цитат более одного раза ;)
Надо быдет подумать, как это обойти ;)

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 22:16 17-02-2015 | Исправлено: unreal666, 22:47 17-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
короче просто дополнительно модифицировал tokenurl.py для защиты от лишних преобразований :

Код:
# -*- coding: UTF-8 -*-
 
import re
 
from outwiker.libs.pyparsing import Regex, NotAny
 
 
class UrlFactory (object):
    @staticmethod
    def make (parser):
        return UrlToken(parser).getToken()
 
 
class UrlToken (object):
    token = ( Regex (ur'(?:=\s*")?', re.IGNORECASE | re.UNICODE) +
              Regex (ur"((?# Начало разбора IP )(?<!\.)(?:25[0-5]|2[0-4]\d|1\d\d|0?[1-9]\d|0{,2}[1-9])(?:\.(?:25[0-5]|2[0-4]\d|[01]?\d?\d)){3}(?!\.[0-9])(?!\w)(?# Конец разбора IP )|(((news|telnet|nttp|file|http|ftp|https|page)://)|(www|ftp)\.)[-\w0-9\.]+[-\w0-9]+)(:[0-9]*)?(/([-\w0-9_,\$\.\+\!\*\(\):@|&=\?/~\#\%]*[-\w0-9_\$\+\!\*\(\):@|&=\?/~\#\%])?)?", re.IGNORECASE | re.UNICODE) +
              NotAny('</a>') )("url")
 
    def __init__ (self, parser):
        self.parser = parser
 
 
    def getToken (self):
        return UrlToken.token.setParseAction(self.__convertToUrlLink)
 
 
    def __convertToUrlLink (self, s, l, t):
        """
        Преобразовать ссылку на интернет-адрес
        """
        if t[0] is not u'':
            return t
 
        start = t[1]
 
        if (not start.startswith ("http://") and
                not start.startswith ("ftp://") and
                not start.startswith ("news://") and
                not start.startswith ("gopher://") and
                not start.startswith ("telnet://") and
                not start.startswith ("nttp://") and
                not start.startswith ("file://") and
                not start.startswith ("https://") and
                not start.startswith ("page://")):
            return self.__getUrlTag ("http://" + start, start)
 
        return self.__getUrlTag (start, start)
 
 
    def __getUrlTag (self, url, comment):
        return '<a href="%s">%s</a>' % (url.strip(), self.parser.parseLinkMarkup (comment.strip()))
 

только не понял, нафига в __getUrlTag нужно self.parser.parseLinkMarkup, если в ссылке нечего парсить?

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 07:51 18-02-2015 | Исправлено: unreal666, 18:48 18-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
только не понял, нафига в __getUrlTag нужно self.parser.parseLinkMarkup, если в ссылке нечего парсить?

 
Например, чтобы можно было писать [[http://example.com | '''коммент''']].

----------
http://jenyay.net - софт, исходники и фото

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 08:35 18-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jenyay
но в данном классе какой от этого толк? Ведь ему на вход подаются обычные ссылки, а не текст такого вида.

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 08:42 18-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Нет, почему? Он же комментарий к ссылке обрабатывает таким образом, а не саму ссылку.

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 08:55 18-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
это в классе LinkToken имеет смысл, а этот класс парсит чисто ссылку (то, что подпадает под шаблон).
даже по коду видно, что передается в этот метод.

Код:
    def __convertToUrlLink (self, s, l, t):  
         """  
         Преобразовать ссылку на интернет-адрес  
         """  
         if t[0] is not u'':  
             return t  
   
         start = t[1]  
   
         if (not start.startswith ("http://") and  
                 not start.startswith ("ftp://") and  
                 not start.startswith ("news://") and  
                 not start.startswith ("gopher://") and  
                 not start.startswith ("telnet://") and  
                 not start.startswith ("nttp://") and  
                 not start.startswith ("file://") and  
                 not start.startswith ("https://") and  
                 not start.startswith ("page://")):  
             return self.__getUrlTag ("http://" + start, start)
   
         return self.__getUrlTag (start, start)

там всяким доп. тегам просто неоткуда взяться.
 
там даже .strip() не нужен:

Код:
    def __getUrlTag (self, url, comment):
        return '<a href="%s">%s</a>' % (url, comment)

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 09:01 18-02-2015 | Исправлено: unreal666, 09:03 18-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А, я думал мы и говорим про LinkToken. Тогда да, это не нужно.

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 09:13 18-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ты в ближайшее время не собираешься править файлы в папке src\outwiker\pages\wiki\parser ?
 
А то собираюсь там много чего подправить:
- вынести токены из методов getToken в поля их классов. Методы токенов setParseAction будут все также добавлять в методе getToken.
- в классы фабрик токенов добавить метод __init__. При создании объектов-экземпляров_классов_фабрик у этих фабрик будет присваиваться поле parser, которое и будет юзаться в кэлбеках для setParseAction. Один фиг эти кэлбеки вызываются уже после создания парсера, так что это поле на момент вызова кэлбека уже будет заполнено.
 
ЗЫ.
Хотя наверно этот поле parser буду заполнять не у всех фабрик, а создам общую фиктивную пустую фабрику-контейнер, в которой и хранить это поле (может еще и для чего другого хранить пригодится).
 
В чем польза такого? При перезагрузке/переходе на другие заметки токены не будут пересоздаваться. Будет изменяться только парсер.
 
Я сейчас у себя сделал возможность вложения жирного текста в курсив (пока не заливал в git), т.е.

Код:
''курсив '''жирный курсив''' курсив''

И в полях FontsFactory сейчас хранятся парсер и boldToken.
 
ЗЫ2.
Кстати, классы-токены в таком случае тоже могут стать просто контейнерами для хранения полей. Возможно в них, кроме методов у вспомогательных классов-токенов, даже методов не станет.

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 10:49 20-02-2015 | Исправлено: unreal666, 10:58 20-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
unreal666

Цитата:
Ты в ближайшее время не собираешься править файлы в папке src\outwiker\pages\wiki\parser

 
Хотел поправить что-то по мелочам, но не глобально.  
 
Добавлено:
unreal666
 
Я тут в отдельной ветке htmlimprover сделал возможность переключения между "улучшателями" и добавил "новый" улучшатель, которые расставляет расставляет абзацы с помощью тегов p. Вроде получилось лучше, чем было, но, наверное, надо где-то еще подточить напильником.
 
Там еще дальше буду продолжать пилить, собираюсь вынести новый "улучшатель" в отдельный плагин.

----------
http://jenyay.net - софт, исходники и фото

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 12:53 20-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jenyay
да уже заметил. Просто пока времени не было разобраться, что к чему там

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 14:32 20-02-2015 | Исправлено: unreal666, 14:33 20-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посмотрел сейчас улучшайзер. По умолчанию в качестве разделителя строк установлен <br/>. Может лучше установить <p>, что по умолчанию было как в предыдущих версиях?

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 06:10 21-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
unreal666

Цитата:
Посмотрел сейчас улучшайзер. По умолчанию в качестве разделителя строк установлен <br/>. Может лучше установить <p>, что по умолчанию было как в предыдущих версиях?

 
Улучшатель через <p> я вообще собираюсь в плагин вынести. Через BR поведение мне кажется более логичным для тех, кому не нужен HTML-код.

----------
http://jenyay.net - софт, исходники и фото

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 20:43 23-02-2015 | Исправлено: Jenyay, 20:44 23-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jenyay
- <br> - тег текстового (или как там в css они наз-ся) уровня, а не блочного, в отличие от <p> => соответствующие ограничения css
- через <p> проще применять css для абзацев (точнее не проще, а вообще непонятно как)
- нельзя будет применять css отдельно для абзаца и отдельно при двойного принудительного разрыва строк.

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 20:46 27-02-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
unreal666
 
Что правильнее с точки зрения HTML использовать <p>, я понимаю. Но обычному пользователю, далекому от HTML, понятнее, когда сколько раз нажмешь Enter, столько же пропустится строк.

----------
http://jenyay.net - софт, исходники и фото

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 22:06 27-02-2015
unreal666



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Парсинг страниц (т.е. создание/использование объекта - экземпляра класса Parser) может происходить одновременно (параллельно) для нескольких заметок, к примеру, в разных вкладках?
Или этот процесс происходит последовательно, т.е. пока одна вкладка не отпрасит, другая не будет парсить?

Всего записей: 6611 | Зарегистр. 14-02-2005 | Отправлено: 18:46 03-03-2015
Jenyay



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
unreal666
 
Парсинг происходит только при переключении в режим Просмотр или HTML для викистраниц.

----------
http://jenyay.net - софт, исходники и фото

Всего записей: 1738 | Зарегистр. 13-10-2001 | Отправлено: 19:06 03-03-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

Компьютерный форум Ru.Board » Компьютеры » Программы » OutWiker


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru