Code für Silbentrennung (deutsch)
Verfasst: 02.05.2009 17:56
				
				Eine Silbentrennung basierend auf dem Algorithmus von Frankling Mark Liang (1983).
Der Code findet mögliche Trennstellen in dem Wort und markiert diese mit einem "|". Zum Code benötigt man noch die Datei mit den Trennmustern.
Sourecode + Hyphenation Patterns
			Der Code findet mögliche Trennstellen in dem Wort und markiert diese mit einem "|". Zum Code benötigt man noch die Datei mit den Trennmustern.
Sourecode + Hyphenation Patterns
Code: Alles auswählen
;/ Silbentrennung
;/ Algorithmus von Frankling Mark Liang (1983)
;/ basierend auf "hyphenator für HTML" (Mathias Nater, Zürich)
;/ Mai 2009 Thorsten Hoeppner (Thorsten1867)
Structure LangStructure
  shortestPattern.b
  longestPattern.b
  leftmin.b
  rightmin.b
EndStructure
Global Language.LangStructure
Structure PatternStructure
  chars.s
  pattern.s
EndStructure
Global NewList HyphPattern.PatternStructure(), NewList pattern.PatternStructure()
Procedure LoadPattern(PatternFile.s)
  ClearList(HyphPattern())
  If ReadFile(0, PatternFile.s)
    While Eof(0) = 0 
      pattern$ = Trim(ReadString(0,#PB_UTF8))
      AddElement(HyphPattern())
      HyphPattern()\chars = StringField(pattern$,1,":")
      HyphPattern()\pattern = StringField(pattern$,2,":")
    Wend 
    CloseFile(0)
    Select GetExtensionPart(PatternFile) ;{ Spracheinstellungen
      Case "de"
        Language\shortestPattern = 2
        Language\longestPattern = 9
        Language\leftmin = 2
        Language\rightmin = 2
      Case "en"
        Language\shortestPattern = 2
        Language\longestPattern = 8
        Language\leftmin = 2
        Language\rightmin = 2
      Case "fr"
        Language\shortestPattern = 1
        Language\longestPattern = 14
        Language\leftmin = 2
        Language\rightmin = 2
    EndSelect ;}
  Else
    MessageRequester("Lade Trennungsmuster", "Datei konnte nicht eingelesen werden.", 0)
  EndIf
EndProcedure
Procedure MathMin(zahl1, zahl2)
  If zahl1 < zahl2
    ProcedureReturn zahl1
  Else
    ProcedureReturn zahl2
  EndIf
EndProcedure
Procedure.b IsNumber(char$)
  If Asc(char$) >= 48 And Asc(char$) <= 57
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure
Procedure.s GetPattern(chars.s)
  ForEach pattern()
    If chars = pattern()\chars
      ProcedureReturn pattern()\pattern
    EndIf
  Next
EndProcedure
Procedure.s InsertString(string.s, idx.b, chars.s)
  If idx > 1
    result.s = Left(string, idx-1)+chars+Mid(string, idx)
  ElseIf idx >= Len(string)
    result.s = string + chars
  Else
    result.s = chars + string
  EndIf
  ProcedureReturn result
EndProcedure
Procedure.s HyphenateWord(wort.s)
  wort = "_"+wort+"_"
  word.s = LCase(wort)
  WLen.b = Len(word)
  
  ;{ Suche Pattern
  ClearList(pattern())
  ForEach HyphPattern()
    If FindString(word, HyphPattern()\chars, 1)
      AddElement(pattern())
      pattern()\chars = HyphPattern()\chars
      pattern()\pattern = HyphPattern()\pattern
    EndIf
  Next
  ;}
  
  Dim Hypos.s(WLen)
  
  n = WLen - Language\shortestPattern
  For p = 1 To n+1
    max = MathMin(WLen-p+1, Language\longestPattern)
    For w = Language\shortestPattern To max
      pattern.s = GetPattern(Mid(word, p, w))
      If pattern
        digits = 1
        PLen = Len(pattern)
        For i=1 To PLen ; Pattern auswerten
          char$ = Mid(pattern, i, 1)
          If IsNumber(char$)
            If i = 1
              z = p
            Else
              z = p + i - digits
            EndIf
            If Not Hypos(z) Or Hypos(z) < char$
              Hypos(z) = char$
            EndIf
            digits + 1
          EndIf
        Next
      EndIf
    Next
  Next
  inserted.b = 0
  For i = Language\leftmin To WLen-Language\rightmin
    If Val(Hypos(i))
      wort = InsertString(wort, i + inserted, Hypos(i))
      inserted + 1
    EndIf
  Next
  
  result.s = RemoveString(wort, "_")
  For i = 1 To 9
    Select i
      Case 1,3,5,7,9
        result = ReplaceString(result, Str(i), "|")
      Case 2,4,6,8
        result = RemoveString(result, Str(i))
    EndSelect
  Next
  If Left(result,1) = "|" : result = Mid(result,2) : EndIf
  ProcedureReturn result
EndProcedure
LoadPattern("HyphenPattern.de")
wort$ =  InputRequester("Silbentrennung", "Wort eingeben:", "")
result$ = HyphenateWord(wort$)
MessageRequester("Silbentrennung", ReplaceString(result$, "|", " - "), #MB_OK)