Español
Fuente/ Codesnippets

Automatisch Entfernen Características überflüssige

 
- Página 1 -



Jörg
Sellmeyer
¡Hola,
Yo habe veces unos pocos Regexpressions zusammengefummelt, con denen Características como Sub, Mul u.s.w automáticamente de el Ver código fuente lejos voluntad puede.
Hiermit puede no verschachtelte Funktonen ersetzt y ser auch O y AND bleiben unbehandelt.
Trotzdem kann lo una una Menge Trabajos puntuales.
KompilierenMarcaSeparación
Declare Term$[10,2],Wert$[5]
Declare Edit&,Text&,hFont&,btnLaden&,btnStarten&,btnSpeichern&,Liste&,ListeFertig&
Term$[0,0] = ([Ss][Uu][Bb])+ ?~(
Term$[1,0] = (([Aa][Dd][Dd])+ ?~()
Term$[2,0] = (([Aa][Dd][Dd]~$)+ ?~()
Term$[3,0] = (([Mm][Uu][Ll])+ ?~()
Term$[4,0] = ([Dd][Ii][Vv]+ ?~()
Term$[5,0] = ([Dd][Ii][Vv]&+ ?~()
Term$[6,0] = ([Aa][Nn][Nn]+ ?~()Wem was dazu einfällt...
Term$[7,0] = ([Oo][Rr]+ ?~()
Term$[8,0] = ([Mm][Oo][Vv][Ee][Ll][Ii][Ss][Tt][Tt][Oo]+([Ll][Ii][Ss][Tt]|[Cc][Hh][Oo][Ii][Cc][Ee]|[Ee][Dd][Ii][Tt]) ?~()
Term$[9,0] = (([Ss][Ee][Tt])([Aa][Uu][Tt][Oo][Pp][Aa][Ii][Nn][Tt]|
[Dd][Ee][Cc][Ii][Mm][Aa][Ll][Ss]|
[Nn][Uu][Mm][Ww][Ii][Dd][Tt][Hh]|
[Cc][Hh][Aa][Rr][Ss][Ee][Tt]|
[Ee][Rr][Rr][Oo][Rr][Ll][Ee][Vv][Ee][Ll]|
[Ff][Ii][Ll][Ee][Mm][Oo][Dd][Ee]|
[Tt][Rr][Uu][Ee][Cc][Oo][Ll][Oo][Rr]|
[Ss][Tt][Rr][Ww][Ii][Dd][Tt][Hh])) [0-9]+
Term$[0,1] = -
Term$[1,1] = +
Term$[2,1] = +
Term$[3,1] = *
Term$[4,1] = /
Term$[5,1] = \
Term$[6,1] = &
Term$[7,1] = |
Term$[8,1] = MoveListToHandle(
Wert$[0] = ( ?[0-9]+(~.[0-9]+)? ?)Zahl
Wert$[1] =  ( ?[!%&]?[A-Za-z0-9]+[!%&]? ?)numerische Variable; Hex-, Binär- oder Octalzahl; Konstante oder Systemvariable
Wert$[2] = ( ?q{1}.*q{1} ?)String
Wert$[3] = ( ?([A-Za-z0-9ÄÖÜäöü~-_])+~$+ ?)Stringvariable oder Konstante
Wert$[4] = ( ?~$+[A-Za-z0-9ÄÖÜäöü~-_]+ ?)Stringkonstante

Proc Bearbeiten

    Parameters Zeile$,hEdit&,hText&
    Declare Funktion$,RegExpVar$,FunktionTransformiert$
    Case Zeile$ > :SetText hEdit&,Zeile$

    { Sub:

        RegExpVar$ = Term$[0,0] + ( + Wert$[0] + | + Wert$[1] + )  + , + ( + Wert$[0] + | + Wert$[1] + ) + ~)

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Set(RegEx,1)
            FunktionTransformiert$ = Translate$(Funktion$,Term$[0,0],()
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,,,Term$[0,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    { Add:

        RegExpVar$ = Term$[1,0] + ( + Wert$[0] + | + Wert$[1] + )  + , + ( + Wert$[0] + | + Wert$[1] + ) + ~)

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Set(RegEx,1)
            FunktionTransformiert$ = Translate$(Funktion$,Term$[1,0],()
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,,,Term$[1,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    {Add$:

        RegExpVar$ = Term$[2,0] + ( + Wert$[2] + | + Wert$[3] + | + Wert$[4] + ),( + Wert$[2] + | + Wert$[3] + | + Wert$[4] + ) + ~)

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Set(RegEx,1)
            FunktionTransformiert$ = Translate$(Funktion$,Term$[2,0],()
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,,,Term$[2,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    {Mul:

        RegExpVar$ = Term$[3,0] + ( + Wert$[0] + | + Wert$[1] + )  + , + ( + Wert$[0] + | + Wert$[1] + ) + ~)

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Set(RegEx,1)
            FunktionTransformiert$ = Translate$(Funktion$,Term$[3,0],()
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,,,Term$[3,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    {Div

        RegExpVar$ = Term$[4,0] + ( + Wert$[0] + | + Wert$[1] + )  + , + ( + Wert$[0] + | + Wert$[1] + ) + ~)

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Set(RegEx,1)
            FunktionTransformiert$ = Translate$(Funktion$,Term$[4,0],()
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,,,Term$[4,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    {Div&

        RegExpVar$ = Term$[5,0] + ( + Wert$[0] + | + Wert$[1] + )  + , + ( + Wert$[0] + | + Wert$[1] + ) + ~)

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Set(RegEx,1)
            FunktionTransformiert$ = Translate$(Funktion$,Term$[5,0],()
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,,,Term$[5,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    {MoveListTo

        RegExpVar$ = Term$[8,0]

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            FunktionTransformiert$ = Translate$(Funktion$,Funktion$,Term$[8,1])
            Set(RegEx,0)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    {Set...

        RegExpVar$ = Term$[9,0]
        Declare Zahl$

        While Match$(RegExpVar$,Zeile$) >

            Funktion$ = Match$(RegExpVar$,Zeile$)
            Zahl$ = SubStr$(Funktion$,2, )
            FunktionTransformiert$ = Translate$(Funktion$,Zahl$,q, + Zahl$ + ))
            FunktionTransformiert$ = Translate$(FunktionTransformiert$,Left$(FunktionTransformiert$,3),Left$(FunktionTransformiert$,3) + (q)
            Zeile$ = Translate$(Zeile$,Funktion$,FunktionTransformiert$)
            Case Zeile$ > :SetText hText&,Zeile$

        Wend

    }

    Return Zeile$

EndProc

Proc DateiLaden

    Declare Datei$,Zeile$
    Datei$=LoadFile$(Profan-Code laden,Profan-Code (*.prf)|*.prf|
    + Include-Datei (*.inc)|*.inc)

    If Datei$ >

        ClearList Liste&
        Assign #1,Datei$
        Reset #1

        WhileNot @Eof(#1)

            Input #1,Zeile$
            AddString(Liste&, Zeile$)

        Wend

        Close #1
        WindowTitle Datei$ +  geladen

    EndIf

EndProc

Proc DateiBearbeiten

    If GetCount(Liste&) > 0

        Declare Zeile$,ZeileNeu$
        ClearList ListeFertig&

        WhileLoop 0,GetCount(Liste&)

            locate 12,0
            Zeile$ = GetString$(Liste&,&Loop)
            ZeileNeu$ = Bearbeiten(Zeile$,Edit&,Text&)
            AddString(ListeFertig&,ZeileNeu$)

            If ZeileNeu$ <> Zeile$

                AddString Str$(&Loop) +   + Trim$(Zeile$)
                AddString Str$(&Loop) +   + Trim$(ZeileNeu$)

            EndIf

        Wend

        ListBox$(Änderungen,2)
        WindowTitle Translate$(GetText$(%hwnd),geladen,bearbeitet)

    EndIf

EndProc

Proc DateiSpeichern

    If GetCount(ListeFertig&) > 0

        Declare Datei$
        Datei$ = SaveFile$(Datei speichern,Profan-Code (*.prf)|*.prf|
        + Include-Datei (*.inc)|*.inc|
        + Andere (*.*)|*.*))

        If Datei$ >

            Assign #1,Datei$
            ReWrite #1

            WhileLoop 0,GetCount(ListeFertig&)

                Print #1,GetString$(ListeFertig&,&Loop)

            Wend

            Close #1
            WindowTitle Translate$(GetText$(%hwnd),bearbeitet,gespeichert)

        EndIf

    EndIf

EndProc

Window 1,1 - 1100,400
hFont& = Create(Font,MS Sans Serif,14,0,0,0,0)
SetDialogFont hFont&
Edit& = Create(Edit,%hwnd,,0,0,Width(%hwnd),24)
Text& = Create(Text,%hwnd,,0,50,Width(%hwnd),24)
btnLaden& = Create(Button,%hwnd,laden,10,100,60,24)
btnStarten& = Create(Button,%hwnd,starten,80,100,60,24)
btnSpeichern& = Create(Button,%hwnd,speichern,150,100,60,24)
Liste&=Create(List,0)
ListeFertig&=Create(List,0)

While 1

    Waitinput

    If Clicked(btnLaden&)

        ChDir C:/ProfanTools
        DateiLaden

    ElseIf Clicked(btnStarten&)

        DateiBearbeiten

    ElseIf Clicked(btnSpeichern&)

        DateiSpeichern

    EndIf

Wend

DeleteObject hFont&
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
10.10.2006  
 



 
- Página 4 -



Jac
de
Lad
Hab grad gesehen, dass el con TrueColor no a mich gerichtet war. Und Yo todavía una Fehler en el @s gefunden, ellos dürfen nämlich NICHT todos lejos voluntad: el en Klassendefinitionen necesario obtener bleiben.

226 kB
Hochgeladen:13.10.2006
Ladeanzahl88
Descargar
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
13.10.2006  
 




Jörg
Sellmeyer
¡Hola Jac,
Mach doch veces a la eigenen Hilo para Su Programa. Sonst weiß uno nada mehr, wer en qué antwortet.

Klammern necesario en cada Fall drin bleiben, como el Operatoren diferente Rangstufen haben.

(( 1< 2) < (3 < 4)) es qué komplett Anderes como 1 < 2 < 3 < 4
El Klammerungen geben sí jede para se primero una Valor. Das a unterscheiden, kann glaube Yo kein Programa leisten, como como el Hirnschmalz vom Programmierer drinsteckt.

Saludo
Jörg
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
13.10.2006  
 




Peter
Max
Müller
Aloha,

An J.L


Jetzt es eigentlich nichts mehr a tun...


Oh doch.

Orginal:
KompilierenMarcaSeparación
dbCreateIndex NUMMER+NAME > IndexPfad$  Name abgeschnitten
dbGet$(NUMMER)                                                         db(Get,
dbIndex ((PrgDir$+DATENIXNAME))

IF lt (stanzahl$,7)  or lt (stanzahl$,07)

    MoveListToEdit(Info%[1])                                                MoveListToHandle
    MoveListToChoice(VorCombo&)

    IF equ$ (result$,PCA1$a>


Ergebnis:
KompilierenMarcaSeparación
db(CreateIndex,NUMMER+NAM,IndexPfad$)
dbGet$(NUMMER)
dbIndex ((PrgDir$+DATENIXNAME))

IF lt (stanzahl$,7)  or lt (stanzahl$,07)

    MoveListToEdit(Info%[1])
    MoveListToChoice(VorCombo&)

    IF equ$ (resultado$,PCA1$)


Das son el letzten bajo XProfed 0.99c angezeigten Hinweise.
Si usted el todavía hinbekommst , wovon Yo ausgehe , es Su Prog wohl fertig.

Saludo
P.M.M

PS.: Haben otro XProfan Comunidad Miembros no Code para testen? Wohl todos ya en Ensamblador.Oder Copy y Paste Junkies y ya fertig con modernisieren
 
XProfan X3, X4ß, Win 10.1
13.10.2006  
 




Jörg
Sellmeyer
Hi Mäxchen,
kommst Usted etwa como wech, wo Yo auch wech komme?

Peter Max Müller
ollaH,
@Jörch

Nachdem Yo, el Code para laufen gekriegt habe (quería con dieser Línea no starten):
KompilierenMarcaSeparación
Window 1,1 - 1100,800
>

lief lo ya bastante bien.

Como?? El Fenstererzeugung en mi oder en Deinem Code? Das wäre en cada Fall algo para el Bug-Ecke!

Peter Max Müller
Aber
KompilierenMarcaSeparación
se de XProfan angemeckert.Leerzeichen después de el pequeño r


Wird hecho

Peter Max Müller
Und esta se auch no correcto gewandelt
KompilierenMarcaSeparación
dbCreateIndex NUMMER+NAME > IndexPfad$
>

Frag mich pero no como correcto lauten muß

Sonst


Ist el porque el Originalzeile de Deinem Code?

Jedenfalls Gracias fürs Testen!

Jörg
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
13.10.2006  
 




Jörg
Sellmeyer
So, ahora gibts el Programa igual como Exe:

algunos optische Verbesserungen vorgenommen
el Bequemlichkeit aumenta (Zeilen puede verändert voluntad, en Code nachzubearbeiten)
Minimalhilfe hinzugefügt
Fortschrittsanzeige mejorado
Abbruchmöglichkeit en Hängern instalado
oben erwähnte Codezeilen trabajo ahora
weitere kleine Bugs expandido
hoffentlich no Neuen instalado (Yo glaube no, daß alguien una Copyright en el Spruch ha, oder?)

Saludo
Jörg
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
14.10.2006  
 




Dietmar
Horn
¡Hola Jörg,

en me bajo XP-Home läßt se el Programa desafortunadamente nada sólo starten.

Saludo
Dietmar

64 kB
Hochgeladen:14.10.2006
Ladeanzahl96
Descargar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
14.10.2006  
 




Jörg
Sellmeyer
Seltsam, el gleiche ha Michael auch ya berichtet y uno kryptischen Fehlermeldung belegt.
Schau veces en diesem Hilo 2 Páginas vorher.
Max ha algo ähnliches erlebt y el Línea Ventana 1,1 - 1100,800 geändert. Danach lief lo.
Er ha por desgracia, no geschrieben, qué él geändert ha.
Hast Usted veces una frühere Versión des Progamms getestet. En me bajo XP Professional se ejecuta lo como geschmiert.
IF ha con seinem Okrea auch el problema. Hoffentlich ha se no todavía una übler Bug en Profano eingenistet.

Yo habs veces algo umgestaltet. Evtl war una Textfeld, el encima el Rand rausragte el problema.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
14.10.2006  
 




Dietmar
Horn
Sí, esta Versión startet wenigstens, auch si el Programmfenster para 1024 x 768 en el Höhe en etwa 20 - 30 Pixel kleiner ser podría, así lo vollständig en el Bildschjirm paßt.

Den Rest voluntad Yo später testen.

Ach así: ältere Versionen Yo quería ebenfalls testen, doch porque como en me absolut gar nichts passierte (todavía no veces una Fehlermeldung), Tuve mich sólo veces no groß más así befaßt.

Saludo
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
14.10.2006  
 




Dietmar
Horn
Auf el Schnelle rausgefischt:

Aus -> FileMode 2 se -> Conjunto(Filemode ,2) gemacht (also Bug, porque una Leerzeichen zuviel).

Saludo
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
14.10.2006  
 




Jörg
Sellmeyer
El Größe Yo ahora otra vez a kleiner Bildschirme angepaßt. Yo vergeß siempre, Yo una 19él habe y el nichtgerade Standard es.
El Conjunto...-Befehle debería ahora trabajo.


(todavía no veces una Fehlermeldung), Tuve mich sólo veces no groß más así befaßt.


Schade, hätteste wenigstens el veces kurz mitgeteilt, entonces hätte Yo mich früher en el Fehlersuche hacer puede.

Saludo
Jörg
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
14.10.2006  
 




Dietmar
Horn
¡Hola Jörg,

en kleineren Bildschirmauflösungen knallt lo a ahora trotzdem todavía!

Tip: simplemente %MaxX y %MaxY abfragen y dementsprechend (bajo Berücksichtigung des Client-Bereiches des Hauptfensters) el Objetos en el Ventana principal remendar.

Meiner Meinung después de debería una solches Tool auch heutzutage todavía abwärtskompatibel a a 640 x 480 ser (sólo dazu podría Yo Usted una kilometerlanges Posting como Begründung enviar - por qué, wieso, por qué usw. una solche Vorgehensweise todavía siempre günstiger wäre ...).

El oberen beiden CreateText-Zeilen sería Yo bastante weglassen. Auf schnelleren Rechnern erkennt uno como sowieso nix (außer daß como Irgendwas relativ sinnlos antes se rumzappelt) - y en langsameren PCs se por el zweimalige SetText en cada Codezeile el Programa sólo unnötig ausgebremst. En längeren Quelltexten interés solche Infos eh no - außer daß el Programa con seinem Getue möglichst rápidamente fertig voluntad möge.

Auch sería Yo el beiden Listviews o. Gridboxen ebenfalls no zeitnah ständig con cada el gerade bearbeiteten Codezeilen füllen, porque el bremst sólo unnötig y interessiert no. Einfach vom Programa el Arbeit así rápidamente como posible hacer dejar - y bien is lo.

Zum Schluß se schlicht y simplemente en irgendeiner vernünftigen Form el Ergebnis präsentiert, evtl. todavía con Editiermöglichkeit, o.ä. Den Rest se se cada Programmierer sowieso selber con seinem bevorzugten Editor anschauen y testen - also, si alles korrekt umgewandelt worden es, usw. ...

Der todo Grafik-Schnick-Schnack, usw. es meiner Meinung después de en una solchen Tool Pille-Palle y also völlig uninteressant.

Notfalls würden en längeren Sources como Fortschrittsanzeige (así el User no glaubt, daß se el Programa evtl. aufgehängt hätte) unos pocos kreiselnde o zappelnde einfache ASCII- oder Ansi-Signo ausreichen.

Yo glaube, algo como se total auch como Software-Ergonomie bezeichnet (más o menos ähnlich ...).

Saludo
Dietmar
 
Multimedia für Jugendliche und junge Erwachsene - MMJ Hoyerswerda e.V.  [...] 

Windows 95 bis Windows 7
Profan² 6.6 bis XProfan X2 mit XPSE

Das große XProfan-Lehrbuch:  [...] 
14.10.2006  
 




Jörg
Sellmeyer

en kleineren Bildschirmauflösungen knallt lo a ahora trotzdem todavía!


Es sí ärgerlich! Usted hast natürlich bastante - el muß angepaßt voluntad. Trotzdem darf meiner Meinung después de kein simpler Choque passieren. Yo vermute veces, el Profano como ni Macke ha.
Su Sugerencias Tuve todos ya en el ToDo-Liste. Lo voluntad todavía unos pocos Optionseinstellungen dazukommen, el el grafischen Sachen Abschaltbar hacer. (simplemente veces con rechter Botón del ratón el Ventana clic)
Sind porque Su Codes korrekt traducido worden? Wenn como todavía Fehler son, es me en el Moment wichtiger, el a korrigieren.

Gracias fürs Testen!
Saludo
Jörg
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
14.10.2006  
 




Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

43.539 Views

Untitledvor 0 min.
Walter16.02.2019
AndreasS27.11.2018
Jörg Sellmeyer14.05.2018
PETER195605.09.2015
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie