int Indexer::get_text_from_html(const string& fileAbsolutePath, string& text)
{
	string fileContent;
	fstream fsFileContent;
	fsFileContent.open(fileAbsolutePath.c_str(), ios_base::in);
	
	if(fsFileContent.fail())
	{
		fsFileContent.close();
		cout<<fileAbsolutePath<<" Open Failed"<<endl;
		
		fsFileContent.close();
		return -1;
	}

	istreambuf_iterator<char> beginIter(fsFileContent), endIter;
	fileContent = string(beginIter, endIter);
	
	string tagBefore, tagAfter;
	size_t posTagBefore, posTagAfter, posStart = 0;

	if((posTagBefore = find_html_tag(fileContent, tagBefore, posStart)) == string::npos)
	{
		return -1;
	}
	
	posStart = posTagBefore + tagBefore.size();

	while((posTagAfter = find_html_tag(fileContent, tagAfter, posStart)) != string::npos)
	{
		if(posTagAfter - posTagBefore >= tagBefore.size() + 1 && tagBefore.find("<script") == string::npos && tagBefore.find("<style") == string::npos)
		{
			string textSegment = fileContent.substr(posTagBefore + tagBefore.size(), posTagAfter - (posTagBefore + tagBefore.size()));
			text.append(textSegment).append(" ");
		}

		posTagBefore = posTagAfter;
		tagBefore = tagAfter;
		posStart = posTagBefore + tagBefore.size();
	}
	
	fsFileContent.close();
	return 0;
}
Exemple #2
0
/**
 * Dieses Programm oeffnet die datei "datei.txt" und schreibt die Ausgabe in
 * die Datei die als Parameter angegeben ist oder, wenn kein Argument uebergeben
 * wird, auf die Konsole.
 *
 * Die datei.txt muss so aufgebaut sein, dass in jeder Zeile ein Befehl mit
 * einem oder mehr Argumenten steht.
 *
 * Gueltige Befehle sind 'test', 'blah' und 'html_tag'
 * Bei test und blah wird ein String-Argument angegeben. Beispiel:
 *         blah StringOhneLeerzeichen
 *         test NochEinString
 *
 * Bei 'html_tag' wird nach Text in spitzen klammern <...> gesucht.
 * Der Text kann auch Leerzeichen enthalten. Beispiel:
 *
 *         html_tag <Das ist ein Tag mit Leerzeichen>
 *
 * Dieses Programm achtet kaum auf Randfalle und bietet somit keine Grundlage
 * für die abzugebende Aufgabe ;)
 */
int main(int argc, char** argv) {

    FILE* ausgabe;
    FILE* eingabe;

    // Je nachdem ob ein parameter uebergeben wurde, schreiben wir die Ausgabe mit
    // fprintf entweder in die Datei oder nach stdout
    if (argc == 2) {
        ausgabe = fopen(argv[1], "w+");
    } else {
        ausgabe = stdout;
    }

    // Wenn ausgabe == NULL ist, dann hat das oeffnen der Datei wohl nicht geklappt
    if (ausgabe == NULL) {
        printf("Could not open output file!\n");
        return 1;
    }


    // Oeffnen der Datei datei.txt. Falls das nicht klappt brechen wir ab.
    eingabe = fopen("datei.txt", "r");
    if (eingabe == NULL) {
        fprintf(ausgabe, "Could not open input file!\n");
        return 1;
    }

    // In einer while-Schleife gehen wir hier durch jede Zeile in eingabe
    char line[1000];
    int line_no = 1;
    while (fgets(line, 999, eingabe) != NULL) {

        // Wenn nichts in der Zeile steht ueberspringen wir die Zeile
        if (strlen(line) == 0) {
            line_no++;
            continue;
        }

        char token[1000];
        char value[1000];
        char rest[1000];

        // Wir scanen einen Token, einen Wert und den Rest aus dem line string
        int scan_count = sscanf(line, "%s %s %s", token, value, rest);

        // Wenn wir 2 Elemente gescannt haben koennte die Eingabe korrekt sein
        if (scan_count >= 2) {
            // Wir ueberpruefen ob es unsere zu suchenden strings 'test' oder 'blah' sind
            if (strlen(token) == 4 && strcmp(token, "test") == 0) {
                fprintf(ausgabe, "Token was 'test' and value was '%s'\n", value);
            } else if (strlen(token) == 4 && strcmp(token, "blah") == 0) {
                fprintf(ausgabe, "Token was 'blah' and value was '%s'\n", value);
            } else if (strlen(token) == 8 && strcmp(token, "html_tag") == 0) {
                char* msg_ptr = strstr(line, "html_tag");  // Position von 'html_tag' finden
                msg_ptr+=8; //Position auf _nach_ html_tag schieben

                char parsed_message[1000];

                // Diese funktion findet den String zwischen den Spitzen klammern heraus
                find_html_tag(msg_ptr, parsed_message);

                fprintf(ausgabe, "%s\n", parsed_message);
            } else {
                fprintf(ausgabe, "Token '%s' in line %d did not match any of 'test', 'blah', 'html_tag'\n", token, line_no);
            }
        }

        line_no++;
    }

    return EXIT_SUCCESS;
}