Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: MealMaster receptbestanden uitlezen.  (gelezen 1285 keer)

MealMaster receptbestanden uitlezen.
« Gepost op: 2011/08/16, 10:44:00 »
Ik heb een vraagje over iets waar ik over lig te denken.
Is het mogelijk om met een 'simpel' shell script (of python) MealMaster (receptenprogramma, dos-based) uit te lezen?

Er bestaan wel een paar programma's om deze recepten programma's die dit veel gebruikte formaat ondersteunen maar dat houdt met Gourmet, Anymeal en Krecipes op. Anymeal krijg ik sowieso niet werkende, Krecipes is een KDE programma (en heeft ook KDE dingen nodig), Gourmet is een Gnome programma en is python, PyGTK  en nog wat anders nodig. Kortom eigenlijk best veel voor iets wat simpel is. Er bestaan honderduizenden recepten in dit formaat en gek genoeg kan ik er geen simpel scriptje/programma vinden die de titels kan weergeven met/of een selectie keuze om de recept te bekijken.

De opbouw van zo'n bestand is als volgt:

MMMMM----- Recipe via Meal-Master (tm) v8.05

 

      Title: Mexicali Pizza

 Categories: Pizza, Main dish, Mexican

      Yield: 2 servings

 

      2    9" flour tortillas

      2 c  Monterey Jack cheese

      1 cn VEG-ALL Mixed Vegetables,

           -drained (16 oz)

      1 c  Chopped tomato

    1/2 c  Finely chopped green onion

    1/2 c  Finely chopped green pepper

      3 T  Mild green chilis

    1/4 c  Sliced ripe olives

 

  1. Place tortillas on lightly greased baking sheet. Sprinkle one

  tortilla with 1/2 cup cheese; top with half of the VEG-ALL, tomato,

  onion, pepper, and chilis.

 

  2. Sprinkle with 1/2 cup cheese and top with 1/2 of the olives.

 

  3. Repeat proceure with second tortilla.

 

  4. Bake at 425'F. approximately 10-12 minutes, until cheese is melted

  and tortillas are crisp.

 

MMMMM

 

Elk recept begint met MMMMM------ etc etc. en eindigt met MMMMM
De derde regel is de titel
De vierde regel is de categorie waar het recept onder valt
De vijfde regel is het aantal porties
De zesde regel is leeg
De zevende regel begint met een lijstje van de ingrediƫnten tot een lege regel.
Daarna volgt de bereidingswijze tot de laatste MMMMM
Na de MMMM volgt een lege regel en eventueel een MMMMM----- etc. voor een nieuw recept die uiteraard dezelfde opbouw heeft als hier boven.

Nu is mijn programmeer-ervaring wat betreft linux nihil en sowieso erg verwaterd (dos tijdperk en langer terug) anders had ik zelf hier al iets voor geschreven. Zelf lig ik op dit moment nog in de lappenmand (operatie) en wil hier best aan beginnen maar misschien heeft iemand anders hier binnen de kortste keren een simpele oplossing voor.
Alle tips en hulp zijn welkom.

Groetjes,
Theo
Ryzen 7 1700 16gb, RX 580 8gb, AOC 24" FreeSync scherm,  Corsair Strafe Red (mechanisch toetsenbord), 256GB SSD, 4 TB HDD. OS: Linux Mint

Re: MealMaster receptbestanden uitlezen.
« Reactie #1 Gepost op: 2011/08/16, 11:29:51 »
Ik denk dat de broncode van Gourmet een makkelijke oplossing kan zijn. Als dat programma wat goed is opgebouwd, kan het zijn dat zij gewoon een module in hun code hebben die dit bestand kan uitlezen.

Anderzijds is het helemaal niet moeilijk om met Python zo een bestand te verwerken. Zeker als altijd alles op ongeveer dezelfde plaats staat, dan is het maar kwestie om regel per regel uit te lezen en de correcte data eruit te halen.

Re: MealMaster receptbestanden uitlezen.
« Reactie #2 Gepost op: 2011/08/16, 12:04:31 »
Ik kan geen python, en mijn perl is een beetje roestig, maar dit zou, in pseudocode, moeten doen wat jij wilt.

enum {
    ST_BEGIN,
    ST_TITLE,
    ST_CAT,
    ST_YIELD,
    ST_INGR,
    ST_PRC,
    ST_END
} state = ST_BEGIN;

String title;
Array<String> categories;
int yield;
Vector<String> ingredients;
Vector<String> process;

template<class T>
bool expect(T a, T b) {
    return a == b;
}

bool expect(String a, String b) {
    return a.matchesRegex(b);
}

void error(int lnum, String line) {
    fail(format("Parsing error at line %d: %s" % lnum % line));

int main(Array<String> args) {
    expect(args, 2) or fail(format("Usage: %s <file>") % args[0]));

    File f = args[1];
    f.exists() or fail(format("No such file or directory: %s" % f));
    f.readable() or fail(format("Cannot read from file: %s" % f));

    LineParser in = f;
    
    int lnum = 0;
    while(String line = in.readline(), ++i) {
        switch(state) {
        case ST_BEGIN:
            expect(line, "^MMMMM----- Recipe via Meal-Master") or error(lnum,line);
            readline();
            state = ST_TITLE;
            break;
        case ST_TITLE:
            line = line.trim();
            expect(line, "^Title: .*$") or error(lnum,line);
            title = line.getRegexSubstring("^Title: (.*)$",1);
            state = ST_CAT;
            break;
       case ST_CAT:
            line = line.trim();
            expect(line, "^Categories: .*$" or error(lnum,line);
            String cat = line.getRegexSubstring("^Categories: (.*)$",1);
            categories = cat.split({", "});
            state = ST_YIELD;
            break;
       case ST_YIELD:
            // etc... Ik hoop dat je het punt nu snapt
       }
}
« Laatst bewerkt op: 2011/08/16, 15:36:11 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

[opgelost] Re: MealMaster receptbestanden uitlezen.
« Reactie #3 Gepost op: 2011/08/19, 12:06:15 »
Bedankt voor de antwoorden, als ik weer richting de 100% ben ga ik er wat mee doen.
Aangezien er 'heul veul' recepten in dit formaat zijn te vinden is het denk ik wel handig om te hebben.
Ryzen 7 1700 16gb, RX 580 8gb, AOC 24" FreeSync scherm,  Corsair Strafe Red (mechanisch toetsenbord), 256GB SSD, 4 TB HDD. OS: Linux Mint