Hyphenation

En enkel orddeling algoritme (syllabicates spanske ord) Orddeling
Noen ganger trenger vi å vise eller skrive en tekst, og vi ønsker å dele ord lange ord som ikke passer på slutten av en linje, for å hindre dem fra å falle helt til neste linje forlater for mye plass unused.The viktigste problemet som oppstår er hvordan man skal dele et ord i stavelser. Vel, jeg vet ikke hvordan de skal syllabicate på engelsk, så jeg la den delen til deg, men jeg håper du finner et eksempel på spansk syllabication nyttig: prosedyre Syllabify (Syllables: TStringList; s: string); konst Konsonanter = [ 'b', 'B', 'c', 'C', 'd', 'D', 'f', 'F', 'g', 'G', 'h', 'H ',' j ',' J ',' k ',' K ',' l ',' L ',' m ',' m ',' n ',' N ',' 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', 'A', 'A', 'e', ​​'E', 'e', ​​'e', ​​"jeg", "jeg", "o", "o" , 'O', 'O', 'U', 'U']; WeakVowels = [ 'i', 'I', 'u', 'U', 'ü', 'Ü']; Vokaler = StrongVowels + WeakVowels; Letters = vokaler + Konsonanter; Var i, j, n, m, bindestrek: integer; begynne j: = 2; s: = # 0 + s + # 0; n: = Lengde (s) - 1; i: = 2; Syllables.Clear; mens jeg < = n ikke begynne bindestrek: = 0; //Ikke dele ord om s [i] i Konsonanter deretter begynne hvis s [i + 1] i Vokaler deretter begynne hvis s [i-1] i Vokaler deretter bindestrek: = 1; ende else if (s [i + 1] i Konsonanter) og (s [i-1] i Vokaler), og start hvis s [i + 1] i [ 'r', 'R'] da begynne hvis s [i] i [ 'b', 'B', 'c', 'C', 'd', 'D', 'f', 'F', 'g', 'g', 'k', 'K', 'p', 'P', 'r', 'R', 't', 'T', 'v', 'V'] deretter bindestrek: = 1 annet bindestrek: = 2; ende else if s [i + 1] i [ 'l', 'L'] da begynne hvis s [i] i [ 'b', 'B', 'c', 'C', 'd', 'D ',' f ',' F ',' g ',' g ',' k ',' K ',' l ',' L ',' p ',' P ',' t ',' T ', 'v', 'V'] deretter bindestrek: = 1 annet bindestrek: = 2; ende else if s [i + 1] i [ 'h', 'H'] da begynne hvis s [i] i [ 'c', 'C', 's', 'S', 'p', 'P '] deretter bindestrek: = 1 annet bindestrek: = 2; ende annet bindestrek: = 2; slutt; ende else if s [i] i StrongVowels deretter begynne if (s [i-1] i StrongVowels) deretter bindestrek: = 1 end else if s [i] = '-' og deretter begynne Syllables.Add (Copy (s, j, i - j)); Syllables.Add ( '-'); inc (i); j: = i; slutt; hvis bindestrek = 1 da begynne //Orddeling her Syllables.Add (Copy (s, j, i - j)); j: = i; ende annet hvis bindestrek = 2 da begynne //Orddeling etter inc (i); Syllables.Add (Copy (s, j, i - j)); j: = i; slutt; inc (i); slutt; m: = Syllables.Count - 1; if (j = n) og (m > = 0) og (s [n] i Konsonanter) så Syllables [m]: = Syllables [m] + s [n] //Siste brev annet Syllables.Add (Copy ( s, j, n - j + 1)); //Siste stavelse slutten, å teste prosedyren yon kan slippe en tekstboks og en etikett på en form og i Endre tilfelle av Tekstboks' skrive: prosedyre TForm1.Edit1Change (Sender: TObject); Var Syllables: TStringList; begynne Syllables: = TStringList.Create; prøve Syllabify (stavelser, Edit1.Text); Label1.Caption: = StringReplace (Trim (Syllables.Text), # 13 # 10, '-', [rfReplaceAll]); endelig Syllables.Free; slutt; ende, nå som vi har en syllabication prosedyre, må vi være oppmerksom på at vi ikke kan dele et ord i noen stavelse pause. Det er vanligvis correctand /eller ønskelig å delta i små stavelser på venstre og /eller høyre side av et ord for å garantere for eksempel at det er minst to stavelser på hver side av ordet når det blir bindestrek, eller -liker i det etterfølgende eksempel-å sørge for at minst har vi fire tegnene i hver side: prosedyre ApplyRules (Syllables: TStringList); //Garanti er det minst fire bokstaver i venstre //og høyre del av ordet begynner med Syllables ikke begynne hvis Count = 1 og avslutter; mens Count > En gjør begynne hvis Lengde (Strings [0]) > = 4 deretter bryte; Strings [0]: = Strings [0] + Strings [1]; Slette (1); slutt; mens Syllables.Count > En gjør begynne hvis Lengde (Strings [Count-1]) > = 4 deretter bryte; Strings [Count-2]: = Strings [Count-2] + Strings [Count-1]; Slett (Count-1); slutt; slutt; slutt, slutt, det gjelder tid til å analysere teksten skille linjene i et avsnitt bestemme hvilke ord som skal deles. Følgende eksempel gjør det med en tekst som skal vises i et Memo: prosedyre Orddeling (Memo: TMemo; OriginalText: TStrings); Var ledd, i, j, k, m, n, MaxLineWidth: integer; s, linje: string; Bitmap: TBitmap; Canvas: TCanvas; Stavelser: TStringList; begynne Syllables: = TStringList.Create; prøv //Vi trenger et lerret til å bruke sin TextWidth metode for å få bredden //av teksten for å se om det passer inn i klientområdet eller ikke. Den //TMemo klassen har ikke et lerret eiendom, så vi må //skape en av våre egne. Bitmap: = TBitmap.Create; Canvas: = Bitmap.Canvas; prøve Canvas.Font: = Memo.Font; MaxLineWidth: = Memo.ClientWidth - 6; //Maksimal bredde Memo.Lines.Clear; for ledd: = 0 til OriginalText.Count - en ikke begynne //For hvert avsnitt s: = OriginalText [punkt]; //Hent den opprinnelige avsnitt //Få linjene der vi må bryte punkt mens Canvas.TextWidth (s) > MaxLineWidth ikke begynne //Først finner vi (i "j") indeksen for starten av //første ordet som ikke passer (den ene å dele ord) j: = 1; n: = lengde (s); i: = 2; mens jeg < = n ikke begynne if (s [i-1] = '') og (s [i] < > '') så j: = i; //Siste begynnelsen av et ord hvis Canvas.TextWidth (Copy (s, 1, i)) > MaxLineWidth deretter bryte; //Nådde en bredde som ikke passer inc (i); slutt; //Hvor kommer pause oppstår? hvis s [i] = '' da begynne //Great! Vi bryter på en plass Memo.Lines.Add (Copy (s, 1, i - 1)); //Legg til linjen s: = Kopier (s, i + 1, n - i); //Fjern linjen slutten ellers begynne //Vi bryter et sted i et ord. Nå finner vi (i "k") //den første plassen etter ordet (k) k: = j + 1; while (k < = n) og (s [K] < > '') gjøre inc (k); //Del ord i stavelser Syllabify (stavelser, Kopier (s, j, k - j)); ApplyRules (stavelser); //Sjekk (i "m") hvor mange stavelser passe m: = 0; Line: = Kopier (s, 1, j-1); mens Canvas.TextWidth (Linje + Syllables [m] + '-') < = MaxLineWidth ikke begynne Line: = Linje + Syllables [m]; inc (m); slutt; if (m < > 0) og (Syllables [m-1] < > '-'), og start //Orddeling Line: = Linje + '-'; j: = Lengde (Line); hvis Syllables [m] = '-' deretter økes (j); slutt; Memo.Lines.Add (Line); //Legg til linjen s: = Kopier (s, j, n - j + 1); //Fjern lineenden; slutt; Memo.Lines.Add (s); //Legg til den siste linjen (det passer) ende; endelig Bitmap.Free; slutt; endelig Syllables.Free; slutt; enden, å teste prosedyren, slippe en Memo komponent på et skjema, justere den for eksempel til toppen av skjemaet (Align = alTop) og skrive inn følgende kode i Resize tilfelle av skjemaet: prosedyre TForm1.FormResize (Sender: TObject); Var OriginalText: TStringList; begynne OriginalText: = TStringList.Create; prøve OriginalText.Add ( 'Si se ha preguntado cómo hacen los' + 'programas procesamiento de textos para dividir palabras "+" con de Guiones al endelig de una Linea, Aqui han un' + 'ejemplo sencillo (en comparación con los que Usan las '+' Aplicaciones de procesamiento de textos). '); OriginalText.Add ( 'Este es un segundo párrafo que se provee "+" con bøter de ejemplo.'); Orddeling (Memo1, OriginalText); endelig OriginalText.Free; slutt; end, du finner hele kildekoden til denne artikkelen i arkivet som følger med Pascal Nyhetsbrev # 23