Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перенос по слогам (https://javascript.ru/forum/misc/84303-perenos-po-slogam.html)

Сергей Ракипов 07.08.2022 08:35

рони,
Да то что нужно я был просто не внимателен и не увидел разницу в символе. Спасибо.

А как вы считаете насколько корректен это перенос с точки зрения русского языка ?
И это скрипт не сильно будет тормозить страницу если так будет большой объем текста?

Сергей Ракипов 07.08.2022 08:43

рони,

А как это скрипт переделать что бы он работал с только с тем блоком у которого есть к класс .tekst

рони 07.08.2022 11:21

Сергей Ракипов,
строка 64 укажите нужный класс/ы.
<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .separated {
            width: 80%;
            margin: 30px auto;
        }
        .separated.min{
            width: 30%;
        }

    </style>
    <script>
        var WholeWord = /[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+/ig;
        var Prefixes = /^(над?|объ?|отъ?|пере|подъ?|по|предъ?|при|про|разъ?|рас|со)/i;

        function Separatist(part, pos, text) {
            var slab, next, seps = [];
            var pref;
            pos += part.match(/^\s*/)[0].length;
            part = part.replace(/^\s+/, "");
            while ((pref = part.match(Prefixes)) && pref[0] != "") {
                seps.push(pref[0]);
                part = part.substr(pref[0].length);
            }
            if (slab = part.match(/^й[ао][дшк]+[аеёиоуыэюя]?/)) {
                seps.push(part.substr(0, slab[0].length));
                part = part.substr(slab[0].length);
            }
            while (part.length) {
                if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя](й|[бвгджзклмнпрстфхцчшщ]+[ъь]?$)/i)) {
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else
                if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя]?/i)) {
                    if (next = part.substr(slab[0].length).match(/^[бвгджзклмнпрстфхцчшщ][ъь]?[аеёиоуыэюя]?/i)) {
                        if (!next[0].match(/[аеёиоуыэюя]/i))
                            slab[0] += next[0];
                    }
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else
                if (slab = part.match(/^[аеёиоуыэюя][бвгджзклмнпрстфхцчшщь]*/i)) {
                    if (slab[0].length > 1 && part.charAt(slab[0].length).match(/[аеёиоуыэюя]/i))
                        slab[0] = slab[0].substr(0, slab[0].length - 1);
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else {
                    seps.push(part);
                    part = "";
                }
            }
            if (seps.length > 1 && seps[0].length == 1)
                seps[0] = seps.shift() + seps[0];
            if (seps.length > 1 && seps[seps.length - 1].length == 1)
                seps[seps.length - 2] = seps[seps.length - 2] + seps.pop();
            return seps.join("\u00AD");
        }
        document.addEventListener("DOMContentLoaded", function() {
            let elems = document.querySelectorAll(".separated");
            elems.forEach(el => {
                let txt = el.textContent;
                el.textContent = txt.replace(WholeWord, Separatist);

            })
        })
    </script>
</head>

<body>
    <div class="separated">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
        если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
        связь, потому что проводится много мероприятий, бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
        что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
        и те, кто выбирается на служение о многом не знают.</div>
   <div class="separated min">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
        если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
        связь, потому что проводится много мероприятий, бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
        что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
        и те, кто выбирается на служение о многом не знают.</div>
</body>

</html>

Сергей Ракипов 07.08.2022 11:59

рони,
:) Спасибо :)

Сергей Ракипов 07.08.2022 14:44

рони,
А что получается если внутри какой то класс то это класс не будет работать?

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .separated {
            width: 80%;
            margin: 30px auto;
        }
        .separated.min{
            width: 30%;
        }
        .test{
            font-size: 2rem;
        }
    </style>
    <script>
        var WholeWord = /[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+/ig;
        var Prefixes = /^(над?|объ?|отъ?|пере|подъ?|по|предъ?|при|про|разъ?|рас|со)/i;

        function Separatist(part, pos, text) {
            var slab, next, seps = [];
            var pref;
            pos += part.match(/^\s*/)[0].length;
            part = part.replace(/^\s+/, "");
            while ((pref = part.match(Prefixes)) && pref[0] != "") {
                seps.push(pref[0]);
                part = part.substr(pref[0].length);
            }
            if (slab = part.match(/^й[ао][дшк]+[аеёиоуыэюя]?/)) {
                seps.push(part.substr(0, slab[0].length));
                part = part.substr(slab[0].length);
            }
            while (part.length) {
                if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя](й|[бвгджзклмнпрстфхцчшщ]+[ъь]?$)/i)) {
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else
                if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя]?/i)) {
                    if (next = part.substr(slab[0].length).match(/^[бвгджзклмнпрстфхцчшщ][ъь]?[аеёиоуыэюя]?/i)) {
                        if (!next[0].match(/[аеёиоуыэюя]/i))
                            slab[0] += next[0];
                    }
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else
                if (slab = part.match(/^[аеёиоуыэюя][бвгджзклмнпрстфхцчшщь]*/i)) {
                    if (slab[0].length > 1 && part.charAt(slab[0].length).match(/[аеёиоуыэюя]/i))
                        slab[0] = slab[0].substr(0, slab[0].length - 1);
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else {
                    seps.push(part);
                    part = "";
                }
            }
            if (seps.length > 1 && seps[0].length == 1)
                seps[0] = seps.shift() + seps[0];
            if (seps.length > 1 && seps[seps.length - 1].length == 1)
                seps[seps.length - 2] = seps[seps.length - 2] + seps.pop();
            return seps.join("\u00AD");
        }
        document.addEventListener("DOMContentLoaded", function() {

            let elems = document.querySelectorAll(".separated"); 
            // указать нужные классы 
            
            elems.forEach(el => {
                let txt = el.textContent;
                el.textContent = txt.replace(WholeWord, Separatist);

            })
        })
    </script>
</head>

<body>
    <div class="separated">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
        если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
        связь, <span class="test">потому что проводится много мероприятий,</span> бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
        что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
        и те, кто выбирается на служение о многом не знают.</div>
   <div class="separated min">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
        если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
        связь, потому что проводится много мероприятий, бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
        что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
        и те, кто выбирается на служение о многом не знают.</div>
</body>

</html>

рони 07.08.2022 16:38

Цитата:

Сообщение от Сергей Ракипов
А что получается если внутри какой то класс то это класс не будет работать?

:lol:
<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .separated {
            width: 80%;
            margin: 30px auto;
        }
        .separated.min{
            width: 30%;
        }
        .test{
            font-size: 2rem;
        }
    </style>
    <script>
        var WholeWord = /[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+/ig;
        var Prefixes = /^(над?|объ?|отъ?|пере|подъ?|по|предъ?|при|про|разъ?|рас|со)/i;

        function Separatist(part, pos, text) {
            var slab, next, seps = [];
            var pref;
            pos += part.match(/^\s*/)[0].length;
            part = part.replace(/^\s+/, "");
            while ((pref = part.match(Prefixes)) && pref[0] != "") {
                seps.push(pref[0]);
                part = part.substr(pref[0].length);
            }
            if (slab = part.match(/^й[ао][дшк]+[аеёиоуыэюя]?/)) {
                seps.push(part.substr(0, slab[0].length));
                part = part.substr(slab[0].length);
            }
            while (part.length) {
                if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя](й|[бвгджзклмнпрстфхцчшщ]+[ъь]?$)/i)) {
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else
                if (slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя]?/i)) {
                    if (next = part.substr(slab[0].length).match(/^[бвгджзклмнпрстфхцчшщ][ъь]?[аеёиоуыэюя]?/i)) {
                        if (!next[0].match(/[аеёиоуыэюя]/i))
                            slab[0] += next[0];
                    }
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else
                if (slab = part.match(/^[аеёиоуыэюя][бвгджзклмнпрстфхцчшщь]*/i)) {
                    if (slab[0].length > 1 && part.charAt(slab[0].length).match(/[аеёиоуыэюя]/i))
                        slab[0] = slab[0].substr(0, slab[0].length - 1);
                    seps.push(slab[0]);
                    part = part.substr(slab[0].length);
                } else {
                    seps.push(part);
                    part = "";
                }
            }
            if (seps.length > 1 && seps[0].length == 1)
                seps[0] = seps.shift() + seps[0];
            if (seps.length > 1 && seps[seps.length - 1].length == 1)
                seps[seps.length - 2] = seps[seps.length - 2] + seps.pop();
            return seps.join("\u00AD");
        }
        document.addEventListener("DOMContentLoaded", function() {

            let elems = document.querySelectorAll(".separated");
            // указать нужные классы

            elems.forEach(el => {
                let txt;
                walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
                while(txt=walk.nextNode()) txt.data = txt.data.replace(WholeWord, Separatist);

            })
        })
    </script>
</head>

<body>
    <div class="separated">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
        если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
        связь, <span class="test">потому что проводится много мероприятий,</span> бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
        что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
        и те, кто выбирается на служение о многом не знают.</div>
   <div class="separated min">И я постоянно спрашиваю представителей Литкома, группы, ведь это мнение важно. Мы можем посмотреть у других местностей, какие есть проекты, например, как те же открытки. Он затрагивает денежный ресурс. мы можем все это напечатать и сделать, но что
        если они группам не нужны войлок, йодомарин в йошкар-оле? И только вот эта связь через представителя группы с Комитетом осуществляет продуктивность, как я это понимаю сегодня и как я понимал, когда был Литкомом группы. Мы просим приносить обратную
        связь, потому что проводится много мероприятий, бывают периодически опросы переводческого Комитета, ZOOM собрания, где регионы просят обратную связь и Литком — связующее звено. Наше служение — не только обеспечение литературой. Мало кто знает,
        что девяносто процентов всех денег АН идут с продажи литературы. Для миссий на развитие, рабочие поездки, обеспечение БУ Комитета литературой. Деньги на это идут с продажи литературы. И вот обо всем об этом рассказывет Литком, ведь новички приходят
        и те, кто выбирается на служение о многом не знают.</div>
</body>

</html>

Сергей Ракипов 08.08.2022 05:16

рони,
А это я был не внимательный или скрипт изменен был?

рони 08.08.2022 07:30

Сергей Ракипов,
скрипт, конечно, изменён, в новом варианте, внутри элемента изменяются все текстовые блоки, а не текст целиком, что приводило к стиранию внутренних элементов.

Сергей Ракипов 08.08.2022 07:48

рони,
Спасибо ) я правда вам благодарен за все года что вы помогаете тут. Спасибо :)

Alikberov 08.08.2022 15:00

Неплохo было бы вставить весь текст отсюда («Война и Мир») здесь и оценить время работы функции на большом объёме текста…:yes:
(К тому же все баги переноса выявятся на этой классике.)

P.S.: Не думаю, что на сайтах будут публиковать колонки размером больше классики…
В худшем случае, можно на серверной стороне предобработать все тексты заранее (в момент первого доступа к конкретному) и закешировать, выдавая пользователю их уже в готовом виде с переносами.

P.P.S.: Исправил ещё один баг: Слово «тускловатый» делилось на «тус-кло-ва-тый» (верно - «туск-ло-ва-тый»)…
Фиксится вот этот код этим:
if(slab = part.match(/^[бвгджзклмнпрстфхцчшщ]+[аеёиоуыьэюя]?/i)) {
			if(next = part.substr(slab[0].length).match(/^([бвгджзклмнпрстфхцчшщ]+)[бвгджзклмнпрстфхцчшщ][ъь]?[аеёиоуыэюя]?/i))
				slab[0] += next[1];
			seps.push(slab[0]);
			part = part.substr(slab[0].length);
		} else


Часовой пояс GMT +3, время: 22:15.