From 868cf77b9cf3134a70f90802440ec713b3703e1c Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Sat, 14 Jan 2017 13:31:52 -0600 Subject: [PATCH] Added explode/implode convenience commands. Explode will take all the non-included content from the master document and split them into separate files in include/. Implode undoes this heinous action. ;-) --- explode | Bin 0 -> 16432 bytes explode.cpp | 305 +++++++++++++++++++++++++++++++++++ implode | Bin 0 -> 17688 bytes implode.cpp | 339 +++++++++++++++++++++++++++++++++++++++ master-doc.txt | 41 ++++- munge | Bin 16384 -> 18768 bytes munge.cpp | 419 ++++++++++++++++++++++++++++--------------------- 7 files changed, 921 insertions(+), 183 deletions(-) create mode 100755 explode create mode 100644 explode.cpp create mode 100755 implode create mode 100644 implode.cpp diff --git a/explode b/explode new file mode 100755 index 0000000000000000000000000000000000000000..ff2bd23ba167ed6457ff73ce4bfcf8b9cb4755b0 GIT binary patch literal 16432 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 +#include +#include +#include // For mkdir() +#include + + +// Global variable (OMG YOU EVIL BASTARD!!) +char buffer[1024000], keyword[1024], token[1024]; +char title[1024], shortTitle[1024], inclFile[1024], style[1024]; +int level = 0, lastLevel = -1; +int lineCount = 0, startLine, sectionLineCount, fileCount = 0; +int part = 0, chapter = 0, subchapter = 0; +bool first = true; +bool nomove = false; +FILE * newFile = NULL; +char level1File[1024], level2File[1024], level3File[1024], temp[1024]; +char partFN[1024], chapterFN[1024], scLink[4096]; + + +void MakeFilename(char * fn) +{ + int l = strlen(fn); + + for(int i=0; i= 'A' && fn[i] <= 'Z') + fn[i] |= 0x20; + else if (fn[i] >= 'a' && fn[i] <= 'z') + ; + else if (fn[i] >= '0' && fn[i] <= '9') + ; + else + fn[i] = '_'; + } +} + + +bool ParseHeader(FILE * file) +{ + while (true) + { + // If we hit the EOF before finishing, something went horribly wrong + if (feof(file)) + break; + + fgets(buffer, 1023999, file); + lineCount++; + + // If we're seeing the end of header sentinel, return; we're done. + if (strncmp(buffer, "---", 3) == 0) + return true; + + sscanf(buffer, "%[^:]: %[^\n]", keyword, token); + + if (strcmp(keyword, "title") == 0) + { + strcpy(title, token); + } + else if (strcmp(keyword, "part") == 0) + { + lastLevel = level; + int len = strlen(token); + + if (len == 4) + level = 0, part++; + else if (len == 7) + level = 1, chapter++, subchapter = 0; + else if (len == 10) + level = 2, subchapter++; + else + level = -1; // Something went wrong + } + else if (strcmp(keyword, "include") == 0) + { + strcpy(inclFile, token); + } + else if (strcmp(keyword, "menu_title") == 0) + { + strcpy(shortTitle, token); + } + else if (strcmp(keyword, "style") == 0) + { + strcpy(style, token); + } + else if (strcmp(keyword, "exclude") == 0) + { + // Don't care about the token, just the keyword + nomove = true; + } + else + printf("Unknown keyword '%s' (token: %s)\n", keyword, token); + } + + // If we end up here, something went horribly wrong... + return false; +} + + +int main(int argc, char * argv[]) +{ + // First, check to see if this has been run here already. + FILE * fp = fopen("master-doc.txt", "r"); + fgets(buffer, 1023999, fp); + fclose(fp); + + if (strncmp(buffer, "", 17) == 0) + { + printf("Master file has already been exploded.\n"); + return 0; + } + + // First, rename the master document + rename("master-doc.txt", "master-doc.bak"); + + // Then open the .bak file + FILE * master = fopen("master-doc.bak", "r"); + + if (master == NULL) + { + printf("Could not open master doc (master-doc.txt) file!\n"); + return -1; + } + + // Create new master document + FILE * exp = fopen("master-doc.txt", "w"); + + if (exp == NULL) + { + printf("Could not open 'master-doc.txt' file!\n"); + fclose(master); + return -1; + } + + fprintf(exp, "\n"); + + while (!feof(master)) + { + fgets(buffer, 1023999, master); + lineCount++; + + // Look for start of file marker + if (strncmp(buffer, "---", 3) == 0) + { + // Reset the "short" title, include file & sytle + shortTitle[0] = 0; + inclFile[0] = 0; + style[0] = 0; + nomove = false; + + if (!ParseHeader(master)) + { + printf("Something went horribly wrong with the header parsing! Aborting!\n"); + break; + } + + // Close any previously opened files... + if (newFile != NULL) + { + fclose(newFile); + newFile = NULL; + } + + // We finished parsing our keyword block, now do something about + // it... :-P + + // temp, for explode only: + if (strlen(inclFile) > 0) + nomove = true; + + if (level == 0) + { + // Parts don't have any content... + + // Set up the "part" level of TOC link + sprintf(partFN, "%s", temp); + + // Set up content for the exploded part level + fprintf(exp, "\n---\n"); + fprintf(exp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(exp, "menu_title: %s\n", shortTitle); + + fprintf(exp, "part: part\n"); + fprintf(exp, "---\n\n\n"); + } + else if (level == 1) + { + // Make a filename from the title (not short title!) + strcpy(chapterFN, title); + MakeFilename(chapterFN); + + // Set up content for the exploded chapter level + fprintf(exp, "---\n"); + fprintf(exp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(exp, "menu_title: %s\n", shortTitle); + + if (strlen(inclFile) > 0) + fprintf(exp, "include: %s\n", inclFile); + else + fprintf(exp, "include: %s.html\n", chapterFN); + + // If it was already an include file, mark it to stay in include/ + if (nomove) + fprintf(exp, "exclude: yes\n"); + + fprintf(exp, "part: chapter\n"); + fprintf(exp, "---\n\n"); + + // Make the file expected at this level (but only if not + // included)... + if (nomove == false) + { + fileCount++; + sprintf(temp, "include/%s.html", chapterFN); + newFile = fopen(temp, "w"); + fprintf(newFile, "---\n"); + fprintf(newFile, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(newFile, "menu_title: %s\n", shortTitle); + + fprintf(newFile, "---\n"); + } + } + else if (level == 2) + { + strcpy(scLink, title); + MakeFilename(scLink); + + // Set up content for the exploded subchapter level + fprintf(exp, "---\n"); + fprintf(exp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(exp, "menu_title: %s\n", shortTitle); + + if (strlen(inclFile) > 0) + fprintf(exp, "include: %s\n", inclFile); + else + fprintf(exp, "include: %s.html\n", scLink); + + // If it was already an include file, mark it to stay in include/ + if (nomove) + fprintf(exp, "exclude: yes\n"); + + fprintf(exp, "part: subchapter\n"); + fprintf(exp, "---\n\n"); + + if (nomove == false) + { + fileCount++; + sprintf(temp, "include/%s.html", scLink); + newFile = fopen(temp, "w"); + fprintf(newFile, "---\n"); + fprintf(newFile, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(newFile, "menu_title: %s\n", shortTitle); + + if (strlen(style) > 0) + fprintf(newFile, "style: %s\n", style); + + fprintf(newFile, "---\n"); + } + } + } + else + { + if (((level == 1) || (level == 2)) && (newFile != NULL)) + fprintf(newFile, "%s", buffer); + } + + // Kill the buffer to prevent false positives... + buffer[0] = 0; + } + + printf("\nProcessed %i lines.\n", lineCount); + printf("Exploded master document into %i files.\n", fileCount); + + fclose(master); + fclose(exp); + + if (newFile) + fclose(newFile); + + // Finally, remove the .bak file: + remove("master-doc.bak"); + + return 0; +} + diff --git a/implode b/implode new file mode 100755 index 0000000000000000000000000000000000000000..c9b87955c75c93d283bfe9da360bd4090cdf6b5f GIT binary patch literal 17688 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 J9Gg4re*tL>_hbM7 literal 0 HcmV?d00001 diff --git a/implode.cpp b/implode.cpp new file mode 100644 index 0000000..f845c1e --- /dev/null +++ b/implode.cpp @@ -0,0 +1,339 @@ +// +// Small program to 'implode' the master document automagically from separate +// files in the include/ directory. +// +// by James Hammons +// (C) 2017 Underground Software +// + +#include +#include +#include +#include // For mkdir() +#include + + +// Global variable (OMG YOU EVIL BASTARD!!) +char buffer[1024000], keyword[1024], token[1024]; +char title[1024], shortTitle[1024], inclFile[1024], style[1024]; +int level = 0, lastLevel = -1; +int lineCount = 0, startLine, sectionLineCount, fileCount = 0; +int part = 0, chapter = 0, subchapter = 0; +bool first = true; +bool nomove = false; +FILE * newFile = NULL; +char level1File[1024], level2File[1024], level3File[1024], temp[1024]; +char partFN[1024], chapterFN[1024], scLink[4096]; + + +void MakeFilename(char * fn) +{ + int l = strlen(fn); + + for(int i=0; i= 'A' && fn[i] <= 'Z') + fn[i] |= 0x20; + else if (fn[i] >= 'a' && fn[i] <= 'z') + ; + else if (fn[i] >= '0' && fn[i] <= '9') + ; + else + fn[i] = '_'; + } +} + + +long SkipHeader(FILE * file) +{ + long length = 0; + + while (true) + { + // If we hit the EOF before finishing, something went horribly wrong + if (feof(file)) + break; + + fgets(buffer, 1023999, file); + length += strlen(buffer) + 1; + + // If we're seeing the end of header sentinel, return; we're done. + if (strncmp(buffer, "---", 3) == 0) + break; + } + + while (true) + { + // If we hit the EOF before finishing, something went horribly wrong + if (feof(file)) + break; + + fgets(buffer, 1023999, file); + length += strlen(buffer) + 1; + + // If we're seeing the end of header sentinel, return; we're done. + if (strncmp(buffer, "---", 3) == 0) + break; + } + + return length; +} + + +void CopyFileToStream(char * from, FILE * toFile) +{ + FILE * fromFile = fopen(from, "r"); + + if (fromFile == NULL) + { + printf("\n\nCould not open file '%s' for reading! Aborting!!\n", from); + exit(1); + } + + fseek(fromFile, 0, SEEK_END); + long length = ftell(fromFile); + rewind(fromFile); + long skipped = SkipHeader(fromFile); + skipped = ftell(fromFile); + + for(long i=skipped; i", 17) == 0) + { + printf("Master file has already been imploded.\n"); + return 0; + } + + // First, rename the master document + rename("master-doc.txt", "master-doc.bak"); + + // Then open the .bak file + FILE * master = fopen("master-doc.bak", "r"); + + if (master == NULL) + { + printf("Could not open master doc (master-doc.txt) file!\n"); + return -1; + } + + // Create new master document + FILE * exp = fopen("master-doc.txt", "w"); + + if (exp == NULL) + { + printf("Could not open 'master-doc.txt' file!\n"); + fclose(master); + return -1; + } + + fprintf(exp, "\n"); + + while (!feof(master)) + { + fgets(buffer, 1023999, master); + lineCount++; + + // Look for start of file marker + if (strncmp(buffer, "---", 3) == 0) + { + // Reset the "short" title, include file & style + shortTitle[0] = 0; + inclFile[0] = 0; + style[0] = 0; + nomove = false; + + if (!ParseHeader(master)) + { + printf("Something went horribly wrong with the header parsing! Aborting!\n"); + break; + } + + // Close any previously opened files... + if (newFile != NULL) + { + fclose(newFile); + newFile = NULL; + } + + // We finished parsing our keyword block, now do something about + // it... :-P + if (level == 0) + { + // Parts don't have any content... + + // Set up the "part" level of TOC link + sprintf(partFN, "%s", temp); + + // Set up content for the imploded part level + fprintf(exp, "\n---\n"); + fprintf(exp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(exp, "menu_title: %s\n", shortTitle); + + fprintf(exp, "part: part\n"); + fprintf(exp, "---\n\n\n"); + } + else if (level == 1) + { + // Make a filename from the title (not short title!) + strcpy(chapterFN, title); + MakeFilename(chapterFN); + + // Set up content for the imploded chapter level + fprintf(exp, "---\n"); + fprintf(exp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(exp, "menu_title: %s\n", shortTitle); + + // If it was already an include file, mark it to stay in include/ + if (nomove) + { + fprintf(exp, "include: %s\n", inclFile); + fprintf(exp, "exclude: yes\n"); + } + + fprintf(exp, "part: chapter\n"); + fprintf(exp, "---\n"); + + // Make the file expected at this level (but only if not + // included)... + if (nomove == false) + { + fileCount++; + sprintf(temp, "include/%s.html", chapterFN); + CopyFileToStream(temp, exp); + remove(temp); + } + else + fprintf(exp, "\n"); + } + else if (level == 2) + { + strcpy(scLink, title); + MakeFilename(scLink); + + // Set up content for the exploded subchapter level + fprintf(exp, "---\n"); + fprintf(exp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(exp, "menu_title: %s\n", shortTitle); + + // If it was already an include file, mark it to stay in include/ + if (nomove) + { + fprintf(exp, "include: %s\n", inclFile); + fprintf(exp, "exclude: yes\n"); + } + + fprintf(exp, "part: subchapter\n"); + fprintf(exp, "---\n"); + + if (nomove == false) + { + fileCount++; + sprintf(temp, "include/%s.html", scLink); + CopyFileToStream(temp, exp); + remove(temp); + } + else + fprintf(exp, "\n"); + } + } + + // Kill the buffer to prevent false positives... + buffer[0] = 0; + } + + printf("\nProcessed %i lines.\n", lineCount); + printf("Imploded master document from %i files.\n", fileCount); + + fclose(master); + fclose(exp); + + if (newFile) + fclose(newFile); + + // Finally, remove the .bak file: + remove("master-doc.bak"); + + return 0; +} + diff --git a/master-doc.txt b/master-doc.txt index 2b0f672..b55c71d 100644 --- a/master-doc.txt +++ b/master-doc.txt @@ -1,3 +1,5 @@ + + --- title: Introduction to Ardour part: part @@ -1833,6 +1835,8 @@ part: subchapter + + --- title: System Configuration part: part @@ -2416,7 +2420,7 @@ part: subchapter dialog"/> --- -title: Misc Tab +title: Global Misc Tab menu_title: Misc Tab part: subchapter --- @@ -3960,7 +3964,7 @@ part: subchapter image of meterbidge with all options on --- -title: Misc Tab +title: Session Misc Tab menu_title: Misc Tab part: subchapter --- @@ -4018,14 +4022,16 @@ part: chapter --- title: Controlling Ardour with OSC -part: subchapter include: controlling-ardour-with-osc.html +exclude: yes +part: subchapter --- --- title: Controlling Ardour with OSC (Ardour 4.7 and Prior) -part: subchapter include: controlling-ardour-with-osc-4.7-and-prior.html +exclude: yes +part: subchapter --- --- @@ -6950,6 +6956,8 @@ part: subchapter + + --- title: Ardour's Interface part: part @@ -8100,6 +8108,8 @@ part: subchapter + + --- title: Sessions & Tracks part: part @@ -9805,6 +9815,8 @@ part: chapter --- + + --- title: Playback & Recording part: part @@ -10416,6 +10428,8 @@ part: subchapter

Broken links + + --- title: Editing part: part @@ -11125,7 +11139,7 @@ part: subchapter --- -title: Editing Clips and Selections +title: Editing Regions and Selections part: chapter --- @@ -11684,6 +11698,8 @@ part: chapter --- + + --- title: MIDI part: part @@ -12460,6 +12476,8 @@ part: chapter --- + + --- title: Arranging part: part @@ -12681,6 +12699,8 @@ part: chapter --- + + --- title: Mixing part: part @@ -14840,6 +14860,8 @@ part: subchapter

+ + --- title: Surround part: part @@ -14968,6 +14990,8 @@ panner in 4 in, 5 out mode"/>

+ + --- title: Sync & Video part: part @@ -16097,6 +16121,8 @@ part: subchapter

+ + --- title: Scripting part: part @@ -16576,8 +16602,9 @@ close_session() --- -style: luadoc title: Class Reference -part: subchapter include: class_reference.html +exclude: yes +part: subchapter --- + diff --git a/munge b/munge index 8176b440ba9520076b34da785cfb743818f62081..216c93de19e12cd34720e54ec1b17028e438f5db 100755 GIT binary patch literal 18768 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 gJ)Du|;-V&z<3T+L+}dEv1C28Sb(DgXcg diff --git a/munge.cpp b/munge.cpp index 61e1a6b..7cca133 100644 --- a/munge.cpp +++ b/munge.cpp @@ -13,6 +13,18 @@ #include +// Global variables (ZOMG YOU HIDEOUS BASTARD!!) +char buffer[1024000], keyword[1024], token[1024]; +char title[1024], shortTitle[1024], inclFile[1024], style[1024]; +int level = 0, lastLevel = -1; +int lineCount = 0, startLine, sectionLineCount; +int part = 0, chapter = 0, subchapter = 0; +bool first = true, nomove = false; +FILE * newFile = NULL; +char level1File[1024], level2File[1024], level3File[1024], temp[1024], temp2[1024]; +char partFN[1024], chapterFN[1024], scLink[4096]; + + void MakeFilename(char * fn) { int l = strlen(fn); @@ -33,6 +45,101 @@ void MakeFilename(char * fn) } +// +// There's probably posix function to do this, if you find it, feel free to +// nuke this crap +// +void CopyFile(char * from, char * to) +{ + FILE * fromFile = fopen(from, "r"); + + if (fromFile == NULL) + { + printf("\n\nCould not open file '%s' for reading! Aborting!!\n", from); + exit(1); + } + + FILE * toFile = fopen(to, "w"); + + if (toFile == NULL) + { + printf("\n\nCould not open file '%s' for writing! Aborting!!\n", to); + exit(1); + } + + fseek(fromFile, 0, SEEK_END); + long length = ftell(fromFile); + rewind(fromFile); + + for(long i=0; i 0) + printf(" [%s]", inclFile); + + startLine = lineCount; + + // Add appropriate suffix chapter content if needed + if ((lastLevel == 1) && (level == 2)) + { + if (newFile != NULL) + { + fprintf(newFile, "\n{%% children %%}\n\n"); + } + else + { + // If it didn't stream, it was a included file, so append to + // it directly... + sprintf(temp2, "%s.html", level2File); + FILE * tfp = fopen(temp2, "a"); + fprintf(tfp, "\n{%% children %%}\n\n"); + fclose(tfp); + } + } + + // Close any previously opened files... + if (newFile != NULL) + { + fclose(newFile); + newFile = NULL; + } - while (true) + if (level == 0) + { + // Parts don't have any content... + strcpy(temp, title); + MakeFilename(temp); + sprintf(level1File, "_manual/%02d_%s", part, temp); + mkdir(level1File, 0777); + + // Set up the "part" level of TOC link + sprintf(partFN, "%s", temp); + fprintf(toc, "

Part %s: %s

\n", roman[part], title); + + // Make the file expected at this level... + sprintf(temp, "%s.html", level1File); + FILE * tfp = fopen(temp, "w"); + fprintf(tfp, "---\n"); + fprintf(tfp, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(tfp, "menu_title: %s\n", shortTitle); + + fprintf(tfp, "---\n"); + fprintf(tfp, "\n{%% children %%}\n\n"); + fclose(tfp); + } + else if (level == 1) { - fgets(buffer, 1023999, master); - lineCount++; - - if (strncmp(buffer, "---", 3) != 0) + strcpy(temp, title); + MakeFilename(temp); + sprintf(level2File, "%s/%02d_%s", level1File, chapter, temp); + mkdir(level2File, 0777); + + // Set up the "chapter" part of the TOC link + sprintf(chapterFN, "%s", temp); + fprintf(toc, "

Ch. %d:  %s

\n", chapter, partFN, chapterFN, title); + + // If there's an include file, copy it... + if (strlen(inclFile) > 0) { - sscanf(buffer, "%[^:]: %[^\n]", keyword, token); - - if (strcmp(keyword, "title") == 0) - { - strcpy(title, token); - } - else if (strcmp(keyword, "part") == 0) - { - lastLevel = level; - int len = strlen(token); - - if (len == 4) - level = 0, part++; - else if (len == 7) - level = 1, chapter++, subchapter = 0; - else if (len == 10) - level = 2, subchapter++; - else - level = -1; // Something went wrong - } - else if (strcmp(keyword, "include") == 0) - { - strcpy(inclFile, token); - } - else if (strcmp(keyword, "menu_title") == 0) - { - strcpy(shortTitle, token); - } - else if (strcmp(keyword, "style") == 0) - { - strcpy(style, token); - } - else - printf("Unknown keyword '%s' (token: %s)\n", keyword, token); + sprintf(temp, "include/%s", inclFile); + sprintf(temp2, "%s.html", level2File); + CopyFile(temp, temp2); } else { - // We hit the end of our keyword block, now do something - // about it... :-P - if (level == 0) - printf("\nPart %s: ", roman[part]); - else if (level == 1) - printf("\n\tCh. %d: ", chapter); - else if (level == 2) - printf("\t\t"); - - printf("%s", title); - - if (strlen(inclFile) > 0) - printf(" [%s]", inclFile); - - startLine = lineCount; - - // Cleanup our chapter content - if (lastLevel == 1) - { - if (newFile != NULL) - { - if (level == 2) - fprintf(newFile, "\n{%% children %%}\n\n"); - - fclose(newFile); - newFile = NULL; - } - } - - if (level == 0) - { - // Parts & chapters don't have any content... - strcpy(temp, title); - MakeFilename(temp); - sprintf(level1File, "_manual/%02d_%s", part, temp); - mkdir(level1File, 0777); - - // Set up the "part" level of TOC link - sprintf(partFN, "%s", temp); - fprintf(toc, "

Part %s: %s

\n", roman[part], title); - - // Make the file expected at this level... - sprintf(temp, "%s.html", level1File); - FILE * tfp = fopen(temp, "w"); - fprintf(tfp, "---\n"); - fprintf(tfp, "title: %s\n", title); - - if (strlen(shortTitle) > 0) - fprintf(tfp, "menu_title: %s\n", shortTitle); - - fprintf(tfp, "---\n"); - fprintf(tfp, "\n{%% children %%}\n\n"); - fclose(tfp); - } - else if (level == 1) - { - strcpy(temp, title); - MakeFilename(temp); - sprintf(level2File, "%s/%02d_%s", level1File, chapter, temp); - mkdir(level2File, 0777); - - // Set up the "chapter" part of the TOC link - sprintf(chapterFN, "%s", temp); - fprintf(toc, "

Ch. %d:  %s

\n", chapter, partFN, chapterFN, title); - - // Make the file expected at this level... - sprintf(temp, "%s.html", level2File); - newFile = fopen(temp, "w"); - fprintf(newFile, "---\n"); - fprintf(newFile, "title: %s\n", title); - - if (strlen(shortTitle) > 0) - fprintf(newFile, "menu_title: %s\n", shortTitle); - - fprintf(newFile, "---\n\n"); -// fprintf(tfp, "\n{%% children %%}\n\n"); -// fclose(tfp); - } - else if (level == 2) - { - strcpy(temp, title); - MakeFilename(temp); - sprintf(level3File, "%s/%02d_%s.html", level2File, subchapter, temp); - - // Make the file expected at this level... - if (newFile != NULL) - fclose(newFile); - - // Make the link - sprintf(scLink, "/%s/%s/%s/", partFN, chapterFN, temp); - fprintf(toc, " %s
\n", scLink, title); - - if (strlen(inclFile) > 0) - { - // Copy the include file to the appropriate spot... - sprintf(temp, "include/%s", inclFile); - FILE * fileToCopy = fopen(temp, "r"); - newFile = fopen(level3File, "w"); - fseek(fileToCopy, 0, SEEK_END); - long length = ftell(fileToCopy); - rewind(fileToCopy); - - for(long i=0; i 0) - fprintf(newFile, "menu_title: %s\n", shortTitle); - - if (strlen(style) > 0) - fprintf(newFile, "style: %s\n", style); - - fprintf(newFile, "---\n\n"); - } - } - - break; + // Make the file expected at this level... + sprintf(temp, "%s.html", level2File); + newFile = fopen(temp, "w"); + fprintf(newFile, "---\n"); + fprintf(newFile, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(newFile, "menu_title: %s\n", shortTitle); + + fprintf(newFile, "---\n\n"); + } + } + else if (level == 2) + { + strcpy(temp, title); + MakeFilename(temp); + sprintf(level3File, "%s/%02d_%s.html", level2File, subchapter, temp); + + // Make the file expected at this level... + + // Make the link + sprintf(scLink, "/%s/%s/%s/", partFN, chapterFN, temp); + fprintf(toc, " %s
\n", scLink, title); + + // If there's an include file, copy it... + if (strlen(inclFile) > 0) + { + sprintf(temp, "include/%s", inclFile); + CopyFile(temp, level3File); + } + else + { + // Otherwise, stream it out of the master document + newFile = fopen(level3File, "w"); + fprintf(newFile, "---\n"); + fprintf(newFile, "title: %s\n", title); + + if (strlen(shortTitle) > 0) + fprintf(newFile, "menu_title: %s\n", shortTitle); + + if (strlen(style) > 0) + fprintf(newFile, "style: %s\n", style); + + fprintf(newFile, "---\n\n"); } } } else { if (((level == 1) || (level == 2)) && (newFile != NULL)) - fprintf(newFile, "%s\n", buffer); + fprintf(newFile, "%s", buffer); } + + // Make sure no spurious garbage signals a false positive + buffer[0] = 0; } printf("\n\nProcessed %i lines.\n", lineCount); -- 2.37.2