Avatar billede rotco Juniormester
07. marts 2012 - 00:12 Der er 7 kommentarer og
2 løsninger

TinyMCE tæller æ,ø og å for 2 ord = Fejl!

Hejsa,

Jeg har en hjemmeside hvor der er en implementeret WYSIWYG-editor i - til den har jeg tilføjet et plugin der tæller ordene der bliver skrevet. Problemet er bare at den tæller æ, ø og å for 2 ord, hvilket gør at det er direkte misvisende. Jeg vil gerne have det fikset hurtigst muligt.

Script kommer længere nede, men umiddelbart hænger det sådan sammen at når den skal tælle alle ord, så stripper den alt HTML fra, således der kun er ren tekst tilbage. Samtidig med det, så laver den bogstaver æ, ø og å om til:

æ = æ
ø = ø
å = å

Da den samtidig køre alle tegn osv. væk og erstatter disse med et mellemrum, så vil et ord som eksempelvis "græder" bliver til: "græder", men eftersom den "stripper" alle tegn og erstatter disse med et mellemrum, så vil det se sådan her ud når ordene tælles: "gr&aelig der" - hvilket altså i det tilfælde tælles som 2 ord.

Jeg er overhovedet ikke inde i javascript, men jeg kunne dog tyde noget af koden, ved hjælp af mit PHP, men kunne ikke selv fikse det.

SCRIPT 1
--------------------------------------------

(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(a,b){var c=this,d=0;c.countre=a.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);c.cleanre=a.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);c.id=a.id+"-word-count";a.onPostRender.add(function(f,e){var g,h;h=f.getParam("wordcount_target_id");if(!h){g=tinymce.DOM.get(f.id+"_path_row");if(g){tinymce.DOM.add(g.parentNode,"div",{style:"float: right"},f.getLang("wordcount.words","Words: ")+'<span id="'+c.id+'">0</span>')}}else{tinymce.DOM.add(h,"span",{},'<span id="'+c.id+'">0</span>')}});a.onInit.add(function(e){e.selection.onSetContent.add(function(){c._count(e)});c._count(e)});a.onSetContent.add(function(e){c._count(e)});a.onKeyUp.add(function(f,g){if(g.keyCode==d){return}if(13==g.keyCode||8==d||46==d){c._count(f)}d=g.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},2000)},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})();

SCRIPT 2
--------------------------------------------

(function() {
    tinymce.create('tinymce.plugins.WordCount', {
        block : 0,
        id : null,
        countre : null,
        cleanre : null,

        init : function(ed, url) {
            var t = this, last = 0;

            t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == &rsquo;
            t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);
            t.id = ed.id + '-word-count';

            ed.onPostRender.add(function(ed, cm) {
                var row, id;

                // Add it to the specified id or the theme advanced path
                id = ed.getParam('wordcount_target_id');
                if (!id) {
                    row = tinymce.DOM.get(ed.id + '_path_row');

                    if (row)
                        tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '<span id="' + t.id + '">0</span>');
                } else {
                    tinymce.DOM.add(id, 'span', {}, '<span id="' + t.id + '">0</span>');
                }
            });

            ed.onInit.add(function(ed) {
                ed.selection.onSetContent.add(function() {
                    t._count(ed);
                });

                t._count(ed);
            });

            ed.onSetContent.add(function(ed) {
                t._count(ed);
            });

            ed.onKeyUp.add(function(ed, e) {
                if (e.keyCode == last)
                    return;

                if (13 == e.keyCode || 8 == last || 46 == last)
                    t._count(ed);

                last = e.keyCode;
            });
        },

        _getCount : function(ed) {
            var tc = 0;
            var tx = ed.getContent({ format: 'raw' });

            if (tx) {
                    tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces
                    tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/&nbsp;|&#160;/gi, ' '); // remove html tags and space chars

                    // deal with html entities
                    tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' ');
                    tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation

                    var wordArray = tx.match(this.countre);
                    if (wordArray) {
                            tc = wordArray.length;
                    }
            }

            return tc;
        },

        _count : function(ed) {
            var t = this;

            // Keep multiple calls from happening at the same time
            if (t.block)
                return;

            t.block = 1;

            setTimeout(function() {
                    var tc = t._getCount(ed);

                    tinymce.DOM.setHTML(t.id, tc.toString());

                    setTimeout(function() {t.block = 0;}, 2000);
            }, 1);
        },

        getInfo: function() {
            return {
                longname : 'Word Count plugin',
                author : 'Moxiecode Systems AB',
                authorurl : 'http://tinymce.moxiecode.com',
                infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount',
                version : tinymce.majorVersion + "." + tinymce.minorVersion
            };
        }
    });

    tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount);
})();



Ser overstående FULDSTÆNDIGT kaotisk ud, så kan filerne også hentes her, såfremt det ville være bedre:

http://omhunde.dk/tinymcefiler.zip (2,5 KB)

Det er MEGET vigtigt at jeg får løst problemet hurtigt, så 200 points til den der kan fikse det. Mange, mange tak!

Med Venlig Hilsen
Rotco
Avatar billede rotco Juniormester
07. marts 2012 - 00:13 #1
Argh - der skete lige en fejl med noget links og sådan. Jeg håber det går. På forhånd - tak.
Avatar billede olebole Juniormester
07. marts 2012 - 00:40 #2
<ole>

Hvis du anvender et tidsvarende tegnsæt som utf-8, tvivler jeg på, TinyMCE indsætter HTML entities. Bruger du derimod iso-8859-1, vil jeg formode, den gør det.

Hvilken meta bruger du i HTML-koden? Gemmer du dine filer som ANSI (iso-8859-1) eller utf-8? Er din database sat op til at køre latin1 eller utf-8? Hvilken Content-Type server din server dokumenterne med?

/mvh
</bole>
Avatar billede rotco Juniormester
07. marts 2012 - 01:28 #3
Jeg har lige forsøgt at lave tegnsættet om til utf-8, hvilket ikke virker - den tæller stadig som 2.

Meta: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

Gemmer filerne i ANSI (iflg. notepad++)

Databasen køre latin1_swedish_ci

Sidste spørgsmål omkring server og Content-Type forstår jeg desværre ikke.

Jeg har lige sat TinyMCE op på siden, så du evt. kan se det, hvis det hjælper. http://omhunde.dk

Det skal lige siges at hvis ordet STARTER eller SLUTTER med æ, ø eller å, så registrere den det som ét ord og ikke 2. Hvis du skriver: væk, tråd, stjålet, både, netværk etc. etc. - så vil du se at de tæller som 2 ord.

Tak for hjælpen indtil videre.
Avatar billede olebole Juniormester
07. marts 2012 - 10:38 #4
"Jeg har lige forsøgt at lave tegnsættet om til utf-8"

At skifte til utf-8 betyder:

*) Brug af utf-8 Content-Type meta.

*) Gemme alle filer som utf-8.

*) Sætte database (og tabeller) til utf8_danish_ci.

*) Sørge for, at alt databaseindhold er indsat som utf-8. (Gammelt indhold, indsat som iso-8859-1, bliver ikke pludselig utf-8).

Du kan tjekke, hvilken Content-Type din server sender siderne som, ved at teste dem med W3C's validator og sætte flueben i Verbose Output.

Prøv at kikke på dette i dokumentationen
Avatar billede DeeDawg Nybegynder
07. marts 2012 - 18:22 #5
Vær opmærksom på, at der er forskel på UTF-8 og UTF-8 uden BOM, når du vil omdanne filen fra ANSI til UTF-8 med Notepad++.

Og eftersom dine filer er oprettet, vil den nemmeste måde at gøre dette på være, at vælge den fil du vil omdanne i programmet, og derefter gå til Encoding > Convert to UTF-8 without BOM. Ved ikke hvad det præcist bliver kaldt i den danske udgave, men det burde være til at finde. ;)
Avatar billede rotco Juniormester
08. marts 2012 - 15:54 #6
Ole Bole - Tak for det. Jeg rodede lidt med det, og ændrede de ting du bad mig om, og nu tæller den rigtig. Fedt! Skriv et svar, så smider jeg 180 points efter dig (og 20 til DeeDawg for hans hjælp).

Smid i bare et par svar. Tak for det.
Avatar billede olebole Juniormester
08. marts 2012 - 16:19 #7
Ellers tak, jeg samler ikke point. Dem må du enten give DeeDawg - eller dele dem med ham  =)
Avatar billede DeeDawg Nybegynder
09. marts 2012 - 07:19 #8
Jeg skal gerne tage imod de 20 point, du oprindelig havde tiltænkt at tildele mig. Men jeg har bestemt ikke fortjent 200 point for #5, så tag du bare resten til dig selv. ;)
Avatar billede rotco Juniormester
24. maj 2012 - 00:02 #9
Vi splitter ;) Tak for hjælpen, og tak olebole.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester