diff --git a/www/account.php b/www/account.php index 0b17cfd..78487b9 100644 --- a/www/account.php +++ b/www/account.php @@ -1,6 +1,6 @@ "; $abstract = htmlspecialchars($row['abstract'], ENT_QUOTES); $date = date("M d, Y", $row['modify_date']); - if ($row['is_published'] == 0) - $title .= " Private"; - html_start_row(); print(" diff --git a/www/index.php b/www/index.php index ef8000c..fa9afec 100644 --- a/www/index.php +++ b/www/index.php @@ -1,412 +1,94 @@ +print("

Mini-XML Home Page

"); -

Mini-XML Home Page

+print("

\n" + .""); +html_end_row(); +html_end_table(); -

Introduction

+print("" + ."\n" + ."
"); -

Current Release: v1.3, December 21, 2003
-[ Download Source (.tar.gz 82k) -| Download Linux RPM (.i386.rpm 76k) -| Change Log | Documentation | Rate/Make Comments ]

+html_start_table(array("Quick Info"), "100%", "100%"); +html_start_row(); +print("
" + ."

Current Release: v1.3, " + ."December 21, 2003

\n" + ."

Mini-XML is a small XML parsing library that you can use to " + ."read XML and XML-like data files in your application without " + ."requiring large non-standard libraries. Mini-XML only requires " + ."an ANSI C compatible compiler (GCC works, as do most vendors' " + ."ANSI C compilers) and a 'make' program.

\n" + ."

Mini-XML provides the following functionality:

\n" + ."
    \n" + ."
  • Reading of UTF-8 and UTF-16 and writing of UTF-8 encoded " + ."XML files and strings.
  • \n" + ."
  • Data is stored in a linked-list tree structure, " + ."preserving the XML data hierarchy.
  • \n" + ."
  • Supports arbitrary element names, attributes, and " + ."attribute values with no preset limits, just available " + ."memory.
  • \n" + ."
  • Supports integer, real, opaque (\"cdata\"), and text " + ."data types in \"leaf\" nodes.
  • \n" + ."
  • Functions for creating, indexing, and managing trees of data.
  • \n" + ."
  • \"Find\" and \"walk\" functions for easily locating and " + ."navigating trees of data.
  • \n" + ."
\n" + ."
    "); -

Mini-XML is a small XML parsing library that you can use to -read XML and XML-like data files in your application without -requiring large non-standard libraries. Mini-XML only requires -an ANSI C compatible compiler (GCC works, as do most vendors' -ANSI C compilers) and a "make" program.

+$result = db_query("SELECT * FROM article WHERE is_published = 1 " + ."ORDER BY modify_date DESC LIMIT 4"); +$count = db_count($result); -

Mini-XML provides the following functionality:

- -
    -
  • Reading and writing of UTF-8 encoded XML files and - strings.
  • -
  • Data is stored in a linked-list tree structure, - preserving the XML data hierarchy.
  • -
  • Supports arbitrary element names, attributes, and - attribute values with no preset limits, just available - memory.
  • -
  • Supports integer, real, opaque ("cdata"), and text - data types in "leaf" nodes.
  • -
  • Functions for creating and managing trees of data.
  • -
  • "Find" and "walk" functions for easily locating and - navigating trees of data.
  • -
- -

Mini-XML doesn't do validation or other types of processing -on the data based upon schema files or other sources of -definition information, nor does it support character entities -other than those required by the XML specification. Also, since -Mini-XML does not support the UTF-16 encoding, it is technically -not a conforming XML consumer/client.

- -

Building Mini-XML

- -

Mini-XML comes with an autoconf-based configure script; just -type the following command to get things going:

- -
-./configure
-
- -

The default install prefix is /usr/local, which can be -overridden using the --prefix option:

- -
-./configure --prefix=/foo
-
- -

Other configure options can be found using the --help -option:

- -
-./configure --help
-
- -

Once you have configured the software, type "make" to do the -build and run the test program to verify that things are -working, as follows:

- -
-make
-
- -

Installing Mini-XML

- -

The "install" target will install Mini-XML in the lib and -include directories:

- -
-make install
-
- -

Once you have installed it, use the "-lmxml" option to link -your application against it.

- -

Documentation

- -

The documentation is currently a work in progress. Aside from -the information that follows, the documentation page provides a -handy reference and is automatically generated using Mini-XML. -You can also look at the testmxml.c and mxmldoc.c source files for examples of -using Mini-XML.

- -

The Basics

- -

Mini-XML provides a single header file which you include:

- -
-#include <mxml.h>
-
- -

Nodes are defined by the mxml_node_t -structure; the type member -defines the node type (element, integer, opaque, real, or text) -which determines which value you want to look at in the value -union. New nodes can be created using the mxmlNewElement(), -mxmlNewInteger(), -mxmlNewOpaque(), -mxmlNewReal(), -and mxmlNewText() -functions. Only elements can have child nodes, and the top node -must be an element, usually "?xml".

- -

Each node has pointers for the node above (parent), below (child), -to the left (prev), and to the right (next) of the current -node. If you have an XML file like the following:

- -
-    <?xml version="1.0"?>
-    <data>
-        <node>val1</node>
-        <node>val2</node>
-        <node>val3</node>
-        <group>
-            <node>val4</node>
-            <node>val5</node>
-            <node>val6</node>
-        </group>
-        <node>val7</node>
-        <node>val8</node>
-        <node>val9</node>
-    </data>
-
- -

the node tree returned by mxmlLoadFile() would look -like the following in memory:

- -
-    ?xml
-      |
-    data
-      |
-    node - node - node - group - node - node - node
-      |      |      |      |       |      |      |
-    val1   val2   val3     |     val7   val8   val9
-                           |
-                         node - node - node
-                           |      |      |
-                         val4   val5   val6
-
- -

where "-" is a pointer to the next node and "|" is a pointer -to the first child node.

- -

Once you are done with the XML data, use the mxmlDelete() -function to recursively free the memory that is used for a -particular node or the entire tree:

- -
-mxmlDelete(tree);
-
- -

Loading and Saving XML Files

- -

You load an XML file using the mxmlLoadFile() -function:

- -
-FILE *fp;
-mxml_node_t *tree;
-
-fp = fopen("filename.xml", "r");
-tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
-fclose(fp);
-
- -

The third argument specifies a callback function which -returns the value type of the immediate children for a new -element node: MXML_INTEGER, MXML_OPAQUE, -MXML_REAL, or MXML_TEXT. This function is -called after the element and its attributes have been -read, so you can look at the element name, attributes, and -attribute values to determine the proper value type to return. -The default value type is MXML_TEXT if no callback is used.

- -

Similarly, you save an XML file using the mxmlSaveFile() -function:

- -
-FILE *fp;
-mxml_node_t *tree;
-
-fp = fopen("filename.xml", "w");
-mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
-fclose(fp);
-
- -

Callback functions for saving are used to optionally insert -whitespace before and after elements in the node tree. Your -function will be called up to four times for each element node -with a pointer to the node and a "where" value of -MXML_WS_BEFORE_OPEN, MXML_WS_AFTER_OPEN, -MXML_WS_BEFORE_CLOSE, or MXML_WS_AFTER_CLOSE. -The callback function should return 0 if no whitespace should be -added and the character to insert (space, tab, newline) -otherwise.

- -

The mxmlLoadString(), -mxmlSaveAllocString(), -and mxmlSaveString() -functions load XML node trees from and save XML node trees to -strings:

- -
-char buffer[8192];
-char *ptr;
-mxml_node_t *tree;
-
-...
-tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK);
-
-...
-mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK);
-
-...
-ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
-
- -

Finding and Iterating Nodes

- -

The mxmlWalkPrev() -and mxmlWalkNext()functions -can be used to iterate through the XML node tree:

- -
-mxml_node_t *node = mxmlWalkPrev(current, tree, MXML_DESCEND);
-
-mxml_node_t *node = mxmlWalkNext(current, tree, MXML_DESCEND);
-
- -

In addition, you can find a named element/node using the mxmlFindElement() -function:

- -
-mxml_node_t *node = mxmlFindElement(tree, tree, "name", "attr",
-                                    "value", MXML_DESCEND);
-
- -

The name, attr, and value -arguments can be passed as NULL to act as wildcards, -e.g.:

- -
-/* Find the first "a" element */
-node = mxmlFindElement(tree, tree, "a", NULL, NULL, MXML_DESCEND);
-
-/* Find the first "a" element with "href" attribute */
-node = mxmlFindElement(tree, tree, "a", "href", NULL, MXML_DESCEND);
-
-/* Find the first "a" element with "href" to a URL */
-node = mxmlFindElement(tree, tree, "a", "href",
-                       "http://www.easysw.com/~mike/mxml/", MXML_DESCEND);
-
-/* Find the first element with a "src" attribute*/
-node = mxmlFindElement(tree, tree, NULL, "src", NULL, MXML_DESCEND);
-
-/* Find the first element with a "src" = "foo.jpg" */
-node = mxmlFindElement(tree, tree, NULL, "src", "foo.jpg", MXML_DESCEND);
-
- -

You can also iterate with the same function:

- -
-mxml_node_t *node;
-
-for (node = mxmlFindElement(tree, tree, "name", NULL, NULL, MXML_DESCEND);
-     node != NULL;
-     node = mxmlFindElement(node, tree, "name", NULL, NULL, MXML_DESCEND))
+if ($count == 0)
+  print("

No articles found.

\n"); +else { - ... do something ... + while ($row = db_next($result)) + { + $id = $row['id']; + $title = htmlspecialchars($row['title'], ENT_QUOTES); + $abstract = htmlspecialchars($row['abstract'], ENT_QUOTES); + $date = date("H:i M d, Y", $row['modify_date']); + $count = count_comments("articles.php_L$id"); + + if ($count == 1) + $count .= " comment"; + else + $count .= " comments"; + + print("

$title

\n" + ."

$date, $count
$abstract [ " + ."Read ]

\n"); + } } -
-

The MXML_DESCEND argument can actually be one of three constants:

+db_free($result); -
    +html_start_links(); +html_link("View Articles", "articles.php"); +html_link("Submit Bug Report", "str.php"); +html_link("Download Software", "software.php"); +html_end_links(); -
  • MXML_NO_DESCEND means to not to look at any - child nodes in the element hierarchy, just look at - siblings at the same level or parent nodes until the top - node or top-of-tree is reached. The previous node from - "group" would be the "node" element to the left, while - the next node from "group" would be the "node" element - to the right.
  • - -
  • MXML_DESCEND_FIRST means that it is OK to - descend to the first child of a node, but not to descend - further when searching. You'll normally use this when - iterating through direct children of a parent node, e.g. - all of the "node" elements under the "?xml" parent node - in the example above. This mode is only applicable to - the search function; the walk functions treat this as - MXML_DESCEND since every call is a first - time.
  • - -
  • MXML_DESCEND means to keep descending until - you hit the bottom of the tree. The previous node from - "group" would be the "val3" node and the next node would - be the first node element under "group". If you were to - walk from the root node "?xml" to the end of the - tree with mxmlWalkNext(), the order would be: - -
    -    ?xml
    -    data
    -    node
    -    val1
    -    node
    -    val2
    -    node
    -    val3
    -    group
    -    node
    -    val4
    -    node
    -    val5
    -    node
    -    val6
    -    node
    -    val7
    -    node
    -    val8
    -    node
    -    val9
    -
    - -

    If you started at "val9" and walked using - mxmlWalkPrev(), the order would be reversed, - ending at "?xml".

  • - -
- -

Getting Help and Reporting Problems

- -

You can email me at "mxml at easysw dot com" to -report problems and/or ask for help. Just don't expect an -instant response, as I get a lot of email...

- -

Legal Stuff

- -

The Mini-XML library is Copyright 2003-2004 by Michael Sweet.

- -

This library is free software; you can redistribute it -and/or modify it under the terms of the GNU Library General -Public License as published by the Free Software Foundation; -either version 2 of the License, or (at your option) any -later version.

- -

This library is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY; without even the implied -warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for -more details.

- -

You should have received a copy of the GNU Library General -Public License along with this library; if not, write to the -Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA -02139, USA.

- -

\n"); html_footer(); // -// End of "$Id: index.php,v 1.1 2004/05/17 02:14:55 mike Exp $". +// End of "$Id: index.php,v 1.2 2004/05/19 01:39:04 mike Exp $". // ?> diff --git a/www/login.php b/www/login.php index 9c015ca..76ecd93 100644 --- a/www/login.php +++ b/www/login.php @@ -1,6 +1,6 @@ Login\n" + ."

Logins are currently only available to Mini-XML developers. " + ."If you are not a Mini-XML developer, please return to the " + ."home page and choose a different " + ."link.

\n" ."
" ."

\n" ."" @@ -43,6 +47,6 @@ else // -// End of "$Id: login.php,v 1.1 2004/05/17 20:28:52 mike Exp $". +// End of "$Id: login.php,v 1.2 2004/05/19 01:39:04 mike Exp $". // ?> diff --git a/www/phplib/html.php b/www/phplib/html.php index e50c979..793b480 100644 --- a/www/phplib/html.php +++ b/www/phplib/html.php @@ -1,6 +1,6 @@
Username:
\n"); + print(" \n"); print("" ."" @@ -228,11 +229,18 @@ html_links($links) // I - Associated array of hyperlinks // function -html_start_table($headings) // I - Array of heading strings +html_start_table($headings, // I - Array of heading strings + $width = "100%", // I - Width of table + $height = "") // I - Height of table { global $html_row, $html_cols; - print("

" + print("

" ."

"); diff --git a/www/style.css b/www/style.css index 5eb1eba..425f303 100644 --- a/www/style.css +++ b/www/style.css @@ -10,10 +10,6 @@ P, TD, TH { font-family: serif; } -P.center { - text-align: center; -} - H1, H2, H3, H4, H5, H6 { color: #000000; font-family: sans-serif;
" ."