|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Xcode documentation set generator.
|
|
Packit |
2fc92b |
*
|
|
Packit |
2fc92b |
* Copyright 2007-2012 by Apple Inc.
|
|
Packit |
2fc92b |
* Copyright 1997-2007 by Easy Software Products.
|
|
Packit |
2fc92b |
*
|
|
Packit |
2fc92b |
* These coded instructions, statements, and computer programs are the
|
|
Packit |
2fc92b |
* property of Apple Inc. and are protected by Federal copyright
|
|
Packit |
2fc92b |
* law. Distribution and use rights are outlined in the file "LICENSE.txt"
|
|
Packit |
2fc92b |
* which should have been included with this file. If this file is
|
|
Packit |
2fc92b |
* missing or damaged, see the license at "http://www.cups.org/".
|
|
Packit |
2fc92b |
*
|
|
Packit |
2fc92b |
* Usage:
|
|
Packit |
2fc92b |
*
|
|
Packit |
2fc92b |
* makedocset directory *.tokens
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Include necessary headers...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
#include "cgi-private.h"
|
|
Packit |
2fc92b |
#include <errno.h>
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Local structures...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
typedef struct _cups_html_s /**** Help file ****/
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
char *path; /* Path to help file */
|
|
Packit |
2fc92b |
char *title; /* Title of help file */
|
|
Packit |
2fc92b |
} _cups_html_t;
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
typedef struct _cups_section_s /**** Help section ****/
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
char *name; /* Section name */
|
|
Packit |
2fc92b |
cups_array_t *files; /* Files in this section */
|
|
Packit |
2fc92b |
} _cups_section_t;
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Local functions...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static int compare_html(_cups_html_t *a, _cups_html_t *b);
|
|
Packit |
2fc92b |
static int compare_sections(_cups_section_t *a, _cups_section_t *b);
|
|
Packit |
2fc92b |
static int compare_sections_files(_cups_section_t *a, _cups_section_t *b);
|
|
Packit |
2fc92b |
static void write_index(const char *path, help_index_t *hi);
|
|
Packit |
2fc92b |
static void write_info(const char *path, const char *revision);
|
|
Packit |
2fc92b |
static void write_nodes(const char *path, help_index_t *hi);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'main()' - Test the help index code.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
int /* O - Exit status */
|
|
Packit |
2fc92b |
main(int argc, /* I - Number of command-line args */
|
|
Packit |
2fc92b |
char *argv[]) /* I - Command-line arguments */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
int i; /* Looping var */
|
|
Packit |
2fc92b |
char path[1024], /* Path to documentation */
|
|
Packit |
2fc92b |
line[1024]; /* Line from file */
|
|
Packit |
2fc92b |
help_index_t *hi; /* Help index */
|
|
Packit |
2fc92b |
cups_file_t *tokens, /* Tokens.xml file */
|
|
Packit |
2fc92b |
*fp; /* Current file */
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if (argc < 4)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
puts("Usage: makedocset directory revision *.tokens");
|
|
Packit |
2fc92b |
return (1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Index the help documents...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
snprintf(path, sizeof(path), "%s/Contents/Resources/Documentation", argv[1]);
|
|
Packit |
2fc92b |
if ((hi = helpLoadIndex(NULL, path)) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fputs("makedocset: Unable to index help files!\n", stderr);
|
|
Packit |
2fc92b |
return (1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
snprintf(path, sizeof(path), "%s/Contents/Resources/Documentation/index.html",
|
|
Packit |
2fc92b |
argv[1]);
|
|
Packit |
2fc92b |
write_index(path, hi);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
snprintf(path, sizeof(path), "%s/Contents/Resources/Nodes.xml", argv[1]);
|
|
Packit |
2fc92b |
write_nodes(path, hi);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Write the Info.plist file...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
snprintf(path, sizeof(path), "%s/Contents/Info.plist", argv[1]);
|
|
Packit |
2fc92b |
write_info(path, argv[2]);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Merge the Tokens.xml files...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
snprintf(path, sizeof(path), "%s/Contents/Resources/Tokens.xml", argv[1]);
|
|
Packit |
2fc92b |
if ((tokens = cupsFileOpen(path, "w")) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fprintf(stderr, "makedocset: Unable to create \"%s\": %s\n", path,
|
|
Packit |
2fc92b |
strerror(errno));
|
|
Packit |
2fc92b |
return (1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePuts(tokens, "\n");
|
|
Packit |
2fc92b |
cupsFilePuts(tokens, "<Tokens version=\"1.0\">\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
for (i = 3; i < argc; i ++)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if ((fp = cupsFileOpen(argv[i], "r")) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fprintf(stderr, "makedocset: Unable to open \"%s\": %s\n", argv[i],
|
|
Packit |
2fc92b |
strerror(errno));
|
|
Packit |
2fc92b |
return (1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if (!cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "
|
|
Packit |
2fc92b |
!cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fprintf(stderr, "makedocset: Bad Tokens.xml file \"%s\"!\n", argv[i]);
|
|
Packit |
2fc92b |
return (1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
while (cupsFileGets(fp, line, sizeof(line)))
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (strcmp(line, "</Tokens>"))
|
|
Packit |
2fc92b |
cupsFilePrintf(tokens, "%s\n", line);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFileClose(fp);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePuts(tokens, "</Tokens>\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFileClose(tokens);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Return with no errors...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
return (0);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'compare_html()' - Compare the titles of two HTML files.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static int /* O - Result of comparison */
|
|
Packit |
2fc92b |
compare_html(_cups_html_t *a, /* I - First file */
|
|
Packit |
2fc92b |
_cups_html_t *b) /* I - Second file */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
return (_cups_strcasecmp(a->title, b->title));
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'compare_sections()' - Compare the names of two help sections.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static int /* O - Result of comparison */
|
|
Packit |
2fc92b |
compare_sections(_cups_section_t *a, /* I - First section */
|
|
Packit |
2fc92b |
_cups_section_t *b) /* I - Second section */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
return (_cups_strcasecmp(a->name, b->name));
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'compare_sections_files()' - Compare the number of files and section names.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static int /* O - Result of comparison */
|
|
Packit |
2fc92b |
compare_sections_files(
|
|
Packit |
2fc92b |
_cups_section_t *a, /* I - First section */
|
|
Packit |
2fc92b |
_cups_section_t *b) /* I - Second section */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
int ret = cupsArrayCount(b->files) - cupsArrayCount(a->files);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if (ret)
|
|
Packit |
2fc92b |
return (ret);
|
|
Packit |
2fc92b |
else
|
|
Packit |
2fc92b |
return (_cups_strcasecmp(a->name, b->name));
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'write_index()' - Write an index file for the CUPS help.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static void
|
|
Packit |
2fc92b |
write_index(const char *path, /* I - File to write */
|
|
Packit |
2fc92b |
help_index_t *hi) /* I - Index of files */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
cups_file_t *fp; /* Output file */
|
|
Packit |
2fc92b |
help_node_t *node; /* Current help node */
|
|
Packit |
2fc92b |
_cups_section_t *section, /* Current section */
|
|
Packit |
2fc92b |
key; /* Section search key */
|
|
Packit |
2fc92b |
_cups_html_t *html; /* Current HTML file */
|
|
Packit |
2fc92b |
cups_array_t *sections, /* Sections in index */
|
|
Packit |
2fc92b |
*sections_files,/* Sections sorted by size */
|
|
Packit |
2fc92b |
*columns[3]; /* Columns in final HTML file */
|
|
Packit |
2fc92b |
int column, /* Current column */
|
|
Packit |
2fc92b |
lines[3], /* Number of lines in each column */
|
|
Packit |
2fc92b |
min_column, /* Smallest column */
|
|
Packit |
2fc92b |
min_lines; /* Smallest number of lines */
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Build an array of sections and their files.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
sections = cupsArrayNew((cups_array_func_t)compare_sections, NULL);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
for (node = (help_node_t *)cupsArrayFirst(hi->nodes);
|
|
Packit |
2fc92b |
node;
|
|
Packit |
2fc92b |
node = (help_node_t *)cupsArrayNext(hi->nodes))
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (node->anchor)
|
|
Packit |
2fc92b |
continue;
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
key.name = node->section ? node->section : "Miscellaneous";
|
|
Packit |
2fc92b |
if ((section = (_cups_section_t *)cupsArrayFind(sections, &key)) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
section = (_cups_section_t *)calloc(1, sizeof(_cups_section_t));
|
|
Packit |
2fc92b |
section->name = key.name;
|
|
Packit |
2fc92b |
section->files = cupsArrayNew((cups_array_func_t)compare_html, NULL);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsArrayAdd(sections, section);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
html = (_cups_html_t *)calloc(1, sizeof(_cups_html_t));
|
|
Packit |
2fc92b |
html->path = node->filename;
|
|
Packit |
2fc92b |
html->title = node->text;
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsArrayAdd(section->files, html);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Build a sorted list of sections based on the number of files in each section
|
|
Packit |
2fc92b |
* and the section name...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
sections_files = cupsArrayNew((cups_array_func_t)compare_sections_files,
|
|
Packit |
2fc92b |
NULL);
|
|
Packit |
2fc92b |
for (section = (_cups_section_t *)cupsArrayFirst(sections);
|
|
Packit |
2fc92b |
section;
|
|
Packit |
2fc92b |
section = (_cups_section_t *)cupsArrayNext(sections))
|
|
Packit |
2fc92b |
cupsArrayAdd(sections_files, section);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Then build three columns to hold everything, trying to balance the number of
|
|
Packit |
2fc92b |
* lines in each column...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
for (column = 0; column < 3; column ++)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
columns[column] = cupsArrayNew((cups_array_func_t)compare_sections, NULL);
|
|
Packit |
2fc92b |
lines[column] = 0;
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
for (section = (_cups_section_t *)cupsArrayFirst(sections_files);
|
|
Packit |
2fc92b |
section;
|
|
Packit |
2fc92b |
section = (_cups_section_t *)cupsArrayNext(sections_files))
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
for (min_column = 0, min_lines = lines[0], column = 1;
|
|
Packit |
2fc92b |
column < 3;
|
|
Packit |
2fc92b |
column ++)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (lines[column] < min_lines)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
min_column = column;
|
|
Packit |
2fc92b |
min_lines = lines[column];
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsArrayAdd(columns[min_column], section);
|
|
Packit |
2fc92b |
lines[min_column] += cupsArrayCount(section->files) + 2;
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* Write the HTML file...
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if ((fp = cupsFileOpen(path, "w")) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fprintf(stderr, "makedocset: Unable to create %s: %s\n", path,
|
|
Packit |
2fc92b |
strerror(errno));
|
|
Packit |
2fc92b |
exit(1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "
|
|
Packit |
2fc92b |
"Transitional//EN\" "
|
|
Packit |
2fc92b |
"\"http://www.w3.org/TR/html4/loose.dtd\">\n"
|
|
Packit |
2fc92b |
"<html>\n"
|
|
Packit |
2fc92b |
"<head>\n"
|
|
Packit |
2fc92b |
"<title>CUPS Documentation</title>\n"
|
|
Packit |
2fc92b |
"
|
|
Packit |
2fc92b |
"href='cups-printable.css'>\n"
|
|
Packit |
2fc92b |
"</head>\n"
|
|
Packit |
2fc92b |
"<body>\n"
|
|
Packit |
2fc92b |
"CUPS Documentation\n"
|
|
Packit |
2fc92b |
"\n"
|
|
Packit |
2fc92b |
"\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
for (column = 0; column < 3; column ++)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (column)
|
|
Packit |
2fc92b |
cupsFilePuts(fp, " \n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "");
|
|
Packit |
2fc92b |
for (section = (_cups_section_t *)cupsArrayFirst(columns[column]);
|
|
Packit |
2fc92b |
section;
|
|
Packit |
2fc92b |
section = (_cups_section_t *)cupsArrayNext(columns[column]))
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
cupsFilePrintf(fp, "%s\n", section->name);
|
|
Packit |
2fc92b |
for (html = (_cups_html_t *)cupsArrayFirst(section->files);
|
|
Packit |
2fc92b |
html;
|
|
Packit |
2fc92b |
html = (_cups_html_t *)cupsArrayNext(section->files))
|
|
Packit |
2fc92b |
cupsFilePrintf(fp, "%s \n",
|
|
Packit |
2fc92b |
html->path, html->title);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "\n");
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "\n"
|
|
Packit |
2fc92b |
"\n"
|
|
Packit |
2fc92b |
"</body>\n"
|
|
Packit |
2fc92b |
"</html>\n");
|
|
Packit |
2fc92b |
cupsFileClose(fp);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'write_info()' - Write the Info.plist file.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static void
|
|
Packit |
2fc92b |
write_info(const char *path, /* I - File to write */
|
|
Packit |
2fc92b |
const char *revision) /* I - Subversion revision number */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
cups_file_t *fp; /* File */
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if ((fp = cupsFileOpen(path, "w")) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fprintf(stderr, "makedocset: Unable to create %s: %s\n", path,
|
|
Packit |
2fc92b |
strerror(errno));
|
|
Packit |
2fc92b |
exit(1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePrintf(fp, "\n"
|
|
Packit |
2fc92b |
"
|
|
Packit |
2fc92b |
"\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
|
|
Packit |
2fc92b |
"<plist version=\"1.0\">\n"
|
|
Packit |
2fc92b |
"<dict>\n"
|
|
Packit |
2fc92b |
"\t<key>CFBundleIdentifier</key>\n"
|
|
Packit |
2fc92b |
"\t<string>org.cups.docset</string>\n"
|
|
Packit |
2fc92b |
"\t<key>CFBundleName</key>\n"
|
|
Packit |
2fc92b |
"\t<string>CUPS Documentation</string>\n"
|
|
Packit |
2fc92b |
"\t<key>CFBundleVersion</key>\n"
|
|
Packit |
2fc92b |
"\t<string>%d.%d.%s</string>\n"
|
|
Packit |
2fc92b |
"\t<key>CFBundleShortVersionString</key>\n"
|
|
Packit |
2fc92b |
"\t<string>%d.%d.%d</string>\n"
|
|
Packit |
2fc92b |
"\t<key>DocSetFeedName</key>\n"
|
|
Packit |
2fc92b |
"\t<string>cups.org</string>\n"
|
|
Packit |
2fc92b |
"\t<key>DocSetFeedURL</key>\n"
|
|
Packit |
2fc92b |
"\t<string>http://www.cups.org/org.cups.docset.atom"
|
|
Packit |
2fc92b |
"</string>\n"
|
|
Packit |
2fc92b |
"\t<key>DocSetPublisherIdentifier</key>\n"
|
|
Packit |
2fc92b |
"\t<string>org.cups</string>\n"
|
|
Packit |
2fc92b |
"\t<key>DocSetPublisherName</key>\n"
|
|
Packit |
2fc92b |
"\t<string>CUPS</string>\n"
|
|
Packit |
2fc92b |
"</dict>\n"
|
|
Packit |
2fc92b |
"</plist>\n",
|
|
Packit |
2fc92b |
CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, revision,
|
|
Packit |
2fc92b |
CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH);
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFileClose(fp);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
/*
|
|
Packit |
2fc92b |
* 'write_nodes()' - Write the Nodes.xml file.
|
|
Packit |
2fc92b |
*/
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
static void
|
|
Packit |
2fc92b |
write_nodes(const char *path, /* I - File to write */
|
|
Packit |
2fc92b |
help_index_t *hi) /* I - Index of files */
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
cups_file_t *fp; /* Output file */
|
|
Packit |
2fc92b |
int id; /* Current node ID */
|
|
Packit |
2fc92b |
help_node_t *node; /* Current help node */
|
|
Packit |
2fc92b |
int subnodes; /* Currently in Subnodes for file? */
|
|
Packit |
2fc92b |
int needclose; /* Need to close the current node? */
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if ((fp = cupsFileOpen(path, "w")) == NULL)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
fprintf(stderr, "makedocset: Unable to create %s: %s\n", path,
|
|
Packit |
2fc92b |
strerror(errno));
|
|
Packit |
2fc92b |
exit(1);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "\n"
|
|
Packit |
2fc92b |
"<DocSetNodes version=\"1.0\">\n"
|
|
Packit |
2fc92b |
"<TOC>\n"
|
|
Packit |
2fc92b |
"<Node id=\"0\">\n"
|
|
Packit |
2fc92b |
"<Name>CUPS Documentation</Name>\n"
|
|
Packit |
2fc92b |
"<Path>Documentation/index.html</Path>\n"
|
|
Packit |
2fc92b |
"</Node>\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
for (node = (help_node_t *)cupsArrayFirst(hi->nodes), id = 1, subnodes = 0,
|
|
Packit |
2fc92b |
needclose = 0;
|
|
Packit |
2fc92b |
node;
|
|
Packit |
2fc92b |
node = (help_node_t *)cupsArrayNext(hi->nodes), id ++)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (node->anchor)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (!subnodes)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "<Subnodes>\n");
|
|
Packit |
2fc92b |
subnodes = 1;
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePrintf(fp, "<Node id=\"%d\">\n"
|
|
Packit |
2fc92b |
"<Path>Documentation/%s</Path>\n"
|
|
Packit |
2fc92b |
"<Anchor>%s</Anchor>\n"
|
|
Packit |
2fc92b |
"<Name>%s</Name>\n"
|
|
Packit |
2fc92b |
"</Node>\n", id, node->filename, node->anchor,
|
|
Packit |
2fc92b |
node->text);
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
else
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
if (subnodes)
|
|
Packit |
2fc92b |
{
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "</Subnodes>\n");
|
|
Packit |
2fc92b |
subnodes = 0;
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if (needclose)
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "</Node>\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePrintf(fp, "<Node id=\"%d\">\n"
|
|
Packit |
2fc92b |
"<Path>Documentation/%s</Path>\n"
|
|
Packit |
2fc92b |
"<Name>%s</Name>\n", id, node->filename, node->text);
|
|
Packit |
2fc92b |
needclose = 1;
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
}
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if (subnodes)
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "</Subnodes>\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
if (needclose)
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "</Node>\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFilePuts(fp, "</TOC>\n"
|
|
Packit |
2fc92b |
"</DocSetNodes>\n");
|
|
Packit |
2fc92b |
|
|
Packit |
2fc92b |
cupsFileClose(fp);
|
|
Packit |
2fc92b |
}
|