bindestreger, en simpel bindestreger algoritme (syllabicates spanske ord), bindestreger,,,,,,, nogle gange er det nødvendigt at udvise eller trykke en tekst, og vi vil gerne gøre det lange ord, der ikke passer ind i slutningen af en linje, der forhindrer dem i at falde helt ind i næste linje går for meget plads uudnyttede.,,, det største problem, der opstår, er, hvordan vi skal dele et ord i stavelser.Well, I really don't know how to syllabicate in English, so I leave that part to you, but I hope you find the example on Spanish syllabication useful:,,, procedure Syllabify(Syllables: TStringList; s: string);,, const,, Consonants = ['b','B','c','C','d','D','f','F','g','G',,, 'h','H','j','J','k','K','l','L','m','M','n','N',,, 'ñ','Ñ','p','P','q','Q','r','R','s','S','t','T',,, 'v','V','w','W','x','X','y','Y','z','Z'];,, StrongVowels = ['a','A','á','Á','e','E','é','É',,, 'í','Í','o','ó','O','Ó','ú','Ú'];,, WeakVowels = ['i','I','u','U','ü','Ü'];,, Vowels = StrongVowels + WeakVowels;,, Letters = Vowels + Consonants;,, var,, i, j, n, m, hyphen: integer;,, begin,, j := 2;,, s := #0 + s + #0;,, n := Length(s) - 1;,, i := 2;,, Syllables.Clear;,, while i <= n do begin,, hyphen := 0; //Do not hyphenate,, if s[i] in Consonants then begin,, if s[i+1] in Vowels then begin,, if s[i-1] in Vowels then hyphen := 1;,, end else if (s[i+1] in Consonants) and,, (s[i-1] in Vowels) then begin,, if s[i+1] in ['r','R'] then begin,, if s[i] in ['b','B','c','C','d','D','f','F','g',,, 'G','k','K','p','P','r','R','t','T','v','V'],, then hyphen := 1 else hyphen := 2;,, end else if s[i+1] in ['l','L'] then begin,, if s[i] in ['b','B','c','C','d','D','f','F','g',,, 'G','k','K','l','L','p','P','t','T','v','V'],, then hyphen := 1 else hyphen := 2;,, end else if s[i+1] in ['h', 'H'] then begin,, if s[i] in ['c', 'C', 's', 'S', 'p', 'P'],, then hyphen := 1 else hyphen := 2;,, end else,, hyphen := 2;,, end;,, end else if s[i] in StrongVowels then begin,, if (s[i-1] in StrongVowels) then hyphen := 1,, end else if s[i] = '-' then begin,, Syllables.Add(Copy(s, j, i - j));,, Syllables.Add('-');,, inc(i);,, j := i;,, end;,, if hyphen = 1 then begin //Hyphenate here,, Syllables.Add(Copy(s, j, i - j));,, j := i;,, end else if hyphen = 2 then begin //Hyphenate after,, inc(i);,, Syllables.Add(Copy(s, j, i - j));,, j := i;,, end;,, inc(i);,, end;,, m := Syllables.Count - 1;,, if (j = n) and (m >= 0) and (s[n] in Consonants) then,, Syllables[m] := Syllables[m] + s[n] //Last letter,, else,, Syllables.Add(Copy(s, j, n - j + 1)); //Last syllable,, end;,,, To test the procedure yon can drop a Textbox and a Label on a form and in the Change event of the Textbox write:,,, procedure TForm1.Edit1Change(Sender: TObject);,, var,, Syllables: TStringList;,, begin,, Syllables := TStringList.Create;,, try,, Syllabify(Syllables, Edit1.Text);,, Label1.Captiom: = stringreplace (trim (stavelser. tekst),,, - [rfreplaceall]); og endelig, stavelser. fri,,,,,,,,,,,,,, at vi nu har en syllabication procedure, må vi konstatere, at vi ikke kan gøre et ord i en stavelse pause.normalt er det korrekt, og /eller ønskeligt med små stavelser til venstre og /eller højre side af et ord til garanti for eksempel, at der er mindst to stavelser, på begge sider af ordet, når det bliver med bindestreg, eller - som i nedenstående eksempel - for at sikre, at mindst fire tegn på begge sider:,,, procedure applyrules (stavelser: tstringlist); //garanti, der er mindst fire bogstaver i venstre, //og dele af ord, begynder med stavelser begynder, hvis tæller = 1 - udgang, og tæller > 1 begynder, hvis længde (strenge [0]) > = 4, så bryd;,, strenge [0]: = strenge [0] + strenge [1], udgår (1);,,,,,, mens stavelser. tæl > 1.begynder, hvis længde (strenge [count-1]) > = 4, så bryd;,, strenge [count-2]: = strenge [count-2] + strenge [count-1], udgår (count-1);,,,,,,,,,,,, endelig det er tid til at analysere teksten mellem linjerne for et stykke af, hvilke ord med bindestreg.følgende eksempel er, at en tekst, der skal vises i en meddelelse:,,, procedure og hiphopperen (notat: tmemo; originaltext: tstrings);,, var, afsnit i, j, k, m, n, maxlinewidth: heltal,,,,,, bitmap:: string. tbitmap;,, lærred: tcanvas;,, stavelser: tstringlist;,, begynder, stavelser: = tstringlist. skabe;,,,, //, vi har brug for et lærred til at bruge sin textwidth metode til at få den bredde, //af teksten for at se, om den passer i kundens område eller ej..den //tmemo klasse har ikke et lærred ejendom, så vi er nødt til at, //skabe en af vores egne.,, bitmap: = tbitmap. skabe;,, lærred: = bitmap. kanvas, prøv, lærred. skrifttype: = memo. skrifttype,,, maxlinewidth: = memo.clientwidth - 6; //maksimale bredde, memo. linjer. klart, for punkt: = 0 til originaltext. regne - 1 begynder, //for hvert stykke, s = originaltext [stk.]; //få det oprindelige punkt, //få linjer, der vi må bryde den præmis, mens lærred. textwidth (s). > maxlinewidth begynder, //først finder vi (j) indeks for påbegyndelse af, //første ord, der ikke passer (en bindestregspiste), j = 1;,, n = længde (s), det: = 2, mens jeg < = n begynder, hvis (e [1] = ") og s [i] < > ') så, j = jeg; //i begyndelsen af et ord, hvis lærred. textwidth (kopi (s, 1) > maxlinewidth så, bryde; //nået en bredde, der ikke passer, inc. (i),,,,,, ////////hvor er bruddet indtræder?,, hvis s [i] = "så begynde, //fedt!vi slår på en plads, memo. linjer. tilføje (kopi (s, 1 - 1); //tilføje den linje, s = kopi (s, jeg + 1, n - jeg); //fjerne den linje, ellers begynder, //vi bryde et eller andet sted i et ord.Now, we find (in "k"),, //the first space after the word (k),, k := j + 1;,, while (k <= n) and (s[k] <> ' ') do inc(k);,, //Divide the word in Syllables,, Syllabify(Syllables, Copy(s, j, k - j));,, ApplyRules(Syllables);,, //Check (in "m") how many syllables fit,, m := 0;,, Line := Copy(s, 1, j-1);,, while Canvas.TextWidth(Line + Syllables[m] + '-'),, <= MaxLineWidth do begin,, Line := Line + Syllables[m];,, inc(m);,, end;,, if (m <> 0) and (Syllables[m-1] <> '-') then begin,, //Hyphenate,, Line := Line + '-';,, j := Length(Line);,, if Syllables[m] = '-' then inc(j);,, end;,, Memo.Lines.Add(Line); //Add the line,, s := Copy(s, j, n - j + 1); //Remove the line,, end;,, end;,, Memo.Lines.Add(s); //Add the last line (it fits),, end;,, finally,, Bitmap.Free;,, end;,, finally,, Syllables.Free;,, end;,, end;,,, To test the procedure, drop a Memo component on a form, align it for example to the top of the form (Align = alTop) and write the following code in the Resize event of the form:,,, procedure TForm1.FormResize(Sender: TObject);,, var, originaltext: tstringlist;,, begynder, originaltext: = tstringlist. skabe;,,,, originaltext. der tilsættes ('si se ha preguntado c ó mo hacen los,, + programas procesamiento de textos para dividir palabras, +), som de guiones al endelig de una l í nea, han aqu í fn 's ", +' eksempel sencillo (en comparaci ó n de los que usan las,, + aplicaciones de procesamiento de textos). '), originaltext. der tilsættes ('este es un segundo p á rrafo que se provee, +" con bøder de eksempel.');,, glemmes (memo1, originaltext); og endelig, originaltext. fri,,,,,,,,,, du kan finde den fulde kildekode af denne artikel i arkivet, der ledsager pascal nyhedsbrev #23,



Previous:
Next Page: