We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 6316
    • 92 Posts
    Я тоже люблю, чтобы тире были mdash’ными и кавычки ёлочками (для тех, кто в танке). Есть ли какие-нибудь идеи как их замену автоматизировать в MODx?
    Я спросил сначала на Западном форуме, но боюсь, что они меня тем более не поймут. Длинные тире у них можно увидеть разве что в понтовых WordPress’овских блогах, и в Википедии. У нас почитателей этого нехитрого дела на порядок больше.
      • 30354
      • 227 Posts
      а в чем проблема? Пишем плугин, ставим событие "OnWebPagePrerender" (если не ошибаюсь) который будет парсить контент и регулярным выражением заменять такое тире "-" на вот такое модное "—".
      Можно, конечно, ручками.
      Есть плугин в репозитории, который парсит bbcode на странице. Встречает какой-нить ... и заменяет его на <b>...</b>. Можно счуток поправить его и переписать под замену " " на « », а "-" на "—".
        http://www.avizion.ru/ — строим стартап!
        http://tonatos.ru/ — Заходите в гости...
        • 21610
        • 360 Posts
        åõà!

        TonatosSN à ìîæåøü íàïèñàòü òàêîé ïëàãè!? Èäåÿ òî õîðîøàÿ!!!
          Разработка сайтов на MODx
          • 30354
          • 227 Posts
          Да с удовольствием! Только после сессии! grin
            http://www.avizion.ru/ — строим стартап!
            http://tonatos.ru/ — Заходите в гости...
            • 17773
            • 6 Posts
            Можно использовать по идее Кавычкер

            Вариант который на предыдущих цмсках использовал я (там заодно e-mail "пряталка" простенькая)
            function encode_email($txt) { 
             $n = strlen($txt); 
             for($i = 0; $i<$n; $i++) { 
             $a = substr($txt, $i, 1); 
             $new .= sprintf('&#%s;', ord($a)); 
             } 
             return $new; 
            } 
            
            function kavych ($contents)
            {
            
            
            // Copyright (c) Spectator.ru
            
            // замена кавычек в html-тэгах на символ "¬"
            $contents=preg_replace ( "/<([^>]*)>/es", "'<'.str_replace ('\\\"', '¬','\\1').'>'", $contents); 
            
            // замена кавычек внутри <code> на символ "¬"
            $contents=preg_replace ( "/<code>(.*?)<\/code>/es", "'<code>'.str_replace ('\\\"', '¬','\\1').'</code>'", $contents); 
            
            // расстановка кавычек: кавычка, перед которой идет ( или > или пробел = начало слова,
            // кавычка, после которой не идет пробел = это конец слова.
            
            $contents=preg_replace ( "/([>(\s])(\")([^\"]*)([^\s\"(])(\")/", "\\1«\\3\\4»", $contents); 
            
            // что, остались в тексте нераставленные кавычки? значит есть вложенные!
            if (stristr ($contents, '"')):
            
            // расставляем оставшиеся кавычки (еще раз).
            $contents=preg_replace ( "/([>(\s])(\")([^\"]*)([^\s\"(])(\")/", "\\1«\\3\\4»", $contents); 
            
            // расставляем вложенные кавычки
            // видим: комбинация из идущих двух подряд открывающихся кавычек без закрывающей
            // значит, вторая кавычка - вложенная. меняем ее и идущую после нее, на вложенную (132 и 147)
            while (preg_match ("/(«)([^»]*)(«)/", $contents)) $contents=preg_replace ( "/(«)([^»]*)(«)([^»]*)(»)/", "\\1\\2&#132;\\4&#147;", $contents);
            
            // конец вложенным кавычкам
            endif;
            
            // кавычки снаружу
            $contents = preg_replace("/\<a\s+href([^>]*)\>\s*\«([^<^«^»]*)\»\s*\<\/a\>/", "«<a href\\1>\\2</a>»", $contents); 
            
            // расстанавливаем правильные коды, тире и многоточия
            
            $contents = str_replace ('«','«', $contents); 
            $contents = str_replace ('»','»', $contents); 
            $contents = str_replace (' - ',' &#151; ', $contents); 
            $contents = str_replace ('...','…', $contents); 
            
            
            // тире в начале строки (диалоги)
            $contents = preg_replace ('/([>|\s])- /',"\\1&#151; ", $contents); 
            
            // меняем  "¬" обратно на кавычки
            $contents = str_replace ('¬','"', $contents); 
            
            // предлоги вместе со словом (слово не переносится на другую строку отдельно от предлога)
            $contents = preg_replace("/ (.) (.)/", " \\1 \\2", $contents); 
            
            $contents = preg_replace("'((?:mailto:)?[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z]{2,3})'e",'encode_email("$1")', $contents); 
            
            
            // дефисы
            // $contents = preg_replace("/(\s[^- >]*)-([^ - >]*\s)/", "<nobr>\\1-\\2</nobr>", $contents); 
            
            
            return $contents;
            
            }
              
            
            



            но проблема, что
             $modx->documentOutput =  kavych($modx->documentOutput);

            - полностью весь код странички заменяет, что есть неправильно - как-бы выцепить только область контента,
            например ограниченного определёнными тегами <!-- content_begin --> <!-- content_end -->

              • 897
              • 1,620 Posts
              во-первых
               $modx->documentObject['content'];


              во-вторых делаться это должно в момент сохранения документа. думаю понятно почему.
                "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                Не используйте Revo для "просто сайтов". Используйте Evo

                Who can defeat the Russian bear?
                • 17773
                • 6 Posts
                Quote from: aleksey.stepanov at Apr 17, 2007, 02:22 AM

                во-вторых делаться это должно в момент сохранения документа. думаю понятно почему.
                Можно чуть подробней - не дошло wink
                  • 897
                  • 1,620 Posts
                  странно конечно что не дошло. grin

                  документ сохраняется/изменяется гораздо больше раз чем просматривается. теперь сравните кол-во вызовов регулярных выражений при сохранении документа и при его просмотре посетителями.
                    "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                    Не используйте Revo для "просто сайтов". Используйте Evo

                    Who can defeat the Russian bear?
                    • 33694
                    • 742 Posts
                    * пришлось всё удалить, автор ответил быстрее, хотя своё присутствие на форуме не выдавал

                    ... т.е. нужно обрабатывать событие OnBeforeDocFormSave, вместо OnWebPagePrerender или близкого.
                      • 33694
                      • 742 Posts
                      Всем кому ещё интересно, спешу сообщить — случилось.