Ich hab mir gedacht, wenn Du schon Buchtitel umwandeln willst - warum dazu nicht den Buchtitel auf einer der Internet-Plattformen suchen und das Ergebnis mit Deinem Buchtitel abgleichen.
Ist also nicht unbedingt eine universelle Lösung für korrekte Groß-/Kleinschreibung, aber für Buchtitel ja vielleicht ganz gut geeignet.
Code: Alles auswählen
EnableExplicit
InitNetwork()
Global Check_Result, Check_AlternativeTitle$
#Q = Chr(34) ; Anführungszeichen / Chicken Shit
#Check_NoEntry = -1
#Check_ERROR = 0
#Check_OK = 1
#Check_AlternativeTitle = 2
#SearchEngine_Amazon = 1
#SearchEngine_Google = 2
#SearchEngine_Thalia = 3
Global NewList Buecher.s()
Global SearchEngine = #SearchEngine_Thalia
Procedure.s HTML2Text(Text$, AuchZeilenumbrueche = #False) ; converts all HTML-Codes for German Umlaute into ASCii
Text$ = ReplaceString(Text$, "ä", "ä")
Text$ = ReplaceString(Text$, "ö", "ö")
Text$ = ReplaceString(Text$, "ü", "ü")
Text$ = ReplaceString(Text$, "Ä", "Ä")
Text$ = ReplaceString(Text$, "Ö", "Ö")
Text$ = ReplaceString(Text$, "Ü", "Ü")
Text$ = ReplaceString(Text$, "ß","ß")
Text$ = ReplaceString(Text$, "€", "€")
Text$ = ReplaceString(Text$, "“", "'")
Text$ = ReplaceString(Text$, "”", "'")
Text$ = ReplaceString(Text$, "&", "&")
If AuchZeilenumbrueche
Text$ = ReplaceString(Text$, " ", Chr(160))
Text$ = ReplaceString(Text$, "²", Chr(178))
Text$ = ReplaceString(Text$, "<br />", #CR$)
Text$ = ReplaceString(Text$, "</br>", #CR$)
Text$ = ReplaceString(Text$, "<br>", #CR$)
EndIf
ProcedureReturn Text$
EndProcedure
Procedure LoadBookTitles() ; Hier wird als Beispiel eine CSV-Liste mit Büchertiteln aus dem Web geladen (Quelle: https://antolin.westermann.de/all/info/titel-listen.jsp )
Protected ActBook.s, LastBook.s, myBookList.s = GetTemporaryDirectory()+"myBookList.csv"
If FileSize(myBookList) < 1 ; Prüfen, ob Bücherliste ggfl. bereits heruntergeladen wurde (Read Only once, to minimize Traffic)
ReceiveHTTPFile("https://antolin.westermann.de/all/downloads/antolingesamt-utf8.csv", myBookList)
EndIf
If ReadFile(0, myBookList, #PB_UTF8)
ReadString(0) ; ignoriere erste Zeile (enthält nur Spaltentitel)
While Not Eof(0)
ActBook = ReadString(0)
ActBook = UCase(StringField(ActBook,2,#Q+";"+#Q)) ; Buchtitel filtern und in Gro0buchstaben umwandeln, um vorher/nachher Vergleich zu haben
If ActBook <> LastBook
AddElement(Buecher())
Buecher() = ActBook
LastBook = Buecher()
EndIf
Wend
CloseFile(0)
Else
Debug "Keine Bücherliste gefunden"
End
EndIf
EndProcedure
Procedure.s CheckProduktName(ProduktName.s)
Protected *Buffer, Search.s, Pos, Result.s, HTML.s
Check_Result = #Check_ERROR
Search = ReplaceString(ProduktName, " ", "+") ; Alle Leerzeichen durch "+" ersetzen, für Amazon-Suche
If SearchEngine = #SearchEngine_Amazon ;--------------------- Search per Amazon ------------------------------
; removed
ElseIf SearchEngine = #SearchEngine_Google ;-------------------- Google Suche -----------------------------------------
; removed
ElseIf SearchEngine = #SearchEngine_Thalia ;-------------------- Thalia Suche -----------------------------------------
Search = ReplaceString(Search, #Q, "")
Search = ReplaceString(Search, "++", "+")
Search = ReplaceString(Search, "ä", "ae",#PB_String_NoCase)
Search = ReplaceString(Search, "ö", "oe",#PB_String_NoCase)
Search = ReplaceString(Search, "ü", "ue",#PB_String_NoCase)
Search = ReplaceString(Search, "Ä", "AE",#PB_String_NoCase)
Search = ReplaceString(Search, "Ö", "OE",#PB_String_NoCase)
Search = ReplaceString(Search, "Ü", "UE",#PB_String_NoCase)
Search = ReplaceString(Search, "ß", "ss",#PB_String_NoCase)
*Buffer = ReceiveHTTPMemory("https://www.thalia.de/suche?filterPATHROOT=&sq="+Search)
Repeat ; Dummy-Repeat um eine definierte Exit-Möglichkeit zu haben
If *Buffer
HTML.s = HTML2Text(PeekS(*Buffer, MemorySize(*Buffer), #PB_UTF8|#PB_ByteLength)) ; Suchergebis von Talia Webseite abrufen
FreeMemory(*Buffer)
Else
Break
EndIf
Pos = FindString(HTML, "<div class="+#Q+"productList socs_product_list"+#Q,1,#PB_String_NoCase) ; Position des Suchtextes einschränken um ungewollte Einträge auszuschließen
Pos = FindString(HTML, "<div class="+#Q,Pos+100,#PB_String_NoCase)
Pos = FindString(HTML, ProduktName, Pos, #PB_String_NoCase)
If Pos > 0 And Pos < FindString(HTML,"<div class="+#Q+"socs_paginierung"+#Q+">")
Result = Mid(HTML, FindString(HTML, ProduktName, Pos, #PB_String_NoCase), Len(ProduktName))
Check_Result = #Check_OK
EndIf
; Erstes Suchergebnis filtern und als alternatives Ergebnis anbieten
Define HTML_Tag.s = StringField(HTML, 2, "<div class="+#Q+"productList socs_product_list"+#Q)
HTML_Tag.s = StringField(HTML_Tag, 2, "title="+#Q)
HTML_Tag.s = StringField(HTML_Tag, 1, #Q)
Check_AlternativeTitle$ = HTML_Tag
If Len(Check_AlternativeTitle$) > 0 And Check_Result = #Check_ERROR
Result = Check_AlternativeTitle$ ; Wenn der exakte Titel zuvor nicht gefunden wurde, gebe alternativtitel zurück und setze Flag
Check_Result = #Check_AlternativeTitle
EndIf
Until #True ; Ende des Dummy-Repeat
If Check_Result = #Check_ERROR And FindString(HTML, "keine Treffer")
Check_Result = #Check_NoEntry
EndIf
EndIf
If Check_Result = #Check_ERROR : Debug "Fehler bei Suche nach: "+Search : EndIf
If Check_Result = #Check_NoEntry : Debug "Kein Eintrag gefunden zu: "+ProduktName : EndIf
ProcedureReturn Result
EndProcedure
AddElement(Buecher())
Buecher() = "Das Herz der Nation"
LoadBookTitles()
Define BookName.s, Row.s, Quit
OpenWindow(0,0,0,960,400,"Büchersuche per Amazon", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ListIconGadget(0,0,0,960,400,"Such-Name", 300)
AddGadgetColumn(0,1,"Status",55)
AddGadgetColumn(0,2,"korigierter Name",200)
AddGadgetColumn(0,3,"alternativer Buchtitel",390)
SelectElement(Buecher(), 3975) ; Mit irgendeinem Buch anfangen
AddWindowTimer(0,0,2000)
Repeat
Select WaitWindowEvent()
Case #PB_Event_Timer
RemoveWindowTimer(0,0)
BookName.s = CheckProduktName(Buecher()) ; Suchanfrage für ein Buch starten
If Check_Result = #Check_OK ; Ergenis prüfen - #Check_OK bedeutet, der exakte Buchname wurde gefunden
AddGadgetItem(0,#PB_Any,Buecher() + #LF$ + row + "ok" + #LF$ + BookName + #LF$ + Check_AlternativeTitle$)
ElseIf Check_Result = #Check_AlternativeTitle ; #Check_AlternativeTitle bedeutet, das der exakte Name nicht gefunden werden konnte und statt dessen der erste angebotene Buchtitel zurückgegeben wurde.
AddGadgetItem(0,#PB_Any,Buecher() + #LF$ + row + "alternativ" + #LF$ + #LF$ + Check_AlternativeTitle$)
EndIf
If NextElement(Buecher()) And CountGadgetItems(0) < 40 ; Nächsten Abruf mit hilfe eines Timer-Events einleiten
AddWindowTimer(0,0,100)
EndIf
Case #PB_Event_CloseWindow
Quit = #True
EndSelect
Until Quit
Für die Demo wird eine Bücher-Liste aus dem Internet herunter geladen und die Buchtitel in die Liste Buecher() eingetragen.
Hier müsstet Du statt dessen also Deine Titel einpflegen.
Über die globale Variable Check_Result kannst Du abfragen, ob Dein Buchtitel zu 100% gefunden (#Check_OK) wurde, oder ob statt dessen ein Alternativ-Titel zurück gegeben wurde (#Check_AlternativeTitle).
Hoffe Du kannst was damit anfangen.