[svn] r6758: nemerle/trunk/tools/ndp: . AssemblyAnalyzer.n
COPYRIGHT DataTree.n Makefile XMLMacro.n nemerl...
malekith
svnadmin at nemerle.org
Sat Oct 14 13:36:59 CEST 2006
Log:
Import NDP by Marcin Mlotkowski.
Author: malekith
Date: Sat Oct 14 13:36:57 2006
New Revision: 6758
Added:
nemerle/trunk/tools/ndp/
nemerle/trunk/tools/ndp/AssemblyAnalyzer.n
nemerle/trunk/tools/ndp/COPYRIGHT
nemerle/trunk/tools/ndp/DataTree.n
nemerle/trunk/tools/ndp/Makefile
nemerle/trunk/tools/ndp/XMLMacro.n
nemerle/trunk/tools/ndp/nemerle-doc.css
Added: nemerle/trunk/tools/ndp/AssemblyAnalyzer.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/tools/ndp/AssemblyAnalyzer.n Sat Oct 14 13:36:57 2006
@@ -0,0 +1,26 @@
+using System;
+using System.Reflection;
+
+module AssemblyAnalyzer
+{
+ mutable ass : Assembly;
+ public analyze (filename : string, tree : DataTree) : void
+ {
+ ass = Assembly.LoadFile(filename);
+ foreach (t in ass.GetTypes())
+ {
+ // Console.WriteLine("Namespace: {0}, name: {1}", t.Namespace, t.FullName);
+ foreach (_m in t.GetMembers()) {
+ mutable info = "";
+ when (t.IsAbstract) info += " abstract ";
+ when (t.IsArray) info += " array ";
+ when (t.IsClass) info += " class ";
+ when (t.IsInterface) info += " interface ";
+ tree.AddItem(t.ToString(), t.Attributes, info);
+ // Console.WriteLine(" nazwa {0}, opis {1}, atrybut {2}", t.Name, t.ToString(), t.Attributes);
+ }
+ }
+
+ }
+
+}
Added: nemerle/trunk/tools/ndp/COPYRIGHT
==============================================================================
--- (empty file)
+++ nemerle/trunk/tools/ndp/COPYRIGHT Sat Oct 14 13:36:57 2006
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2006 The University of Wroclaw.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the University may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE UNIVERSITY BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
Added: nemerle/trunk/tools/ndp/DataTree.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/tools/ndp/DataTree.n Sat Oct 14 13:36:57 2006
@@ -0,0 +1,407 @@
+using System;
+using Nemerle.Collections;
+
+
+module HtmlGenerator
+{
+ public Page (f : void -> string, fname : string) : void
+ {
+ def buf = System.Text.StringBuilder();
+ _ = buf.Append("<?xml version=\"1.0\"?>\n");
+ _ = buf.Append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n");
+ _ = buf.Append(" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n");
+ _ = buf.Append("<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">\n");
+ _ = buf.Append("<head>\n");
+ _ = buf.Append("<title>Nemerle Documentation Project</title>\n");
+ _ = buf.Append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
+ _ = buf.Append("<link rel=\"stylesheet\" type=\"text/css\" href=\"nemerle-doc.css\" />\n");
+ _ = buf.Append("</head>\n");
+ _ = buf.Append("<body>\n");
+ _ = buf.Append(f());
+ _ = buf.Append("<div class=\"footer\">Nemerle Documentation Project</div>");
+ _ = buf.Append("</body>\n");
+ _ = buf.Append("</html>\n");
+
+ def outf = IO.StreamWriter(fname);
+ outf.Write(buf);
+ outf.Close();
+ // Console.WriteLine("---> zapis do {0}", fname);
+ }
+
+ public Title (title : string, subtitle : string) : string
+ {
+ mutable content = "";
+ content += "<div class=\"title\">";
+ content += "<span class=\"title\">" + title + "</span><br />";
+ content += "<span class=\"subtitle\">";
+ content += subtitle;
+ content += "</span>";
+ content += "</div>\n\n";
+ content;
+ }
+
+}
+
+variant ElementType
+{
+ | Unknown
+ | Property
+ | Method
+ | Field
+ | Type
+}
+
+class TopNode
+{
+
+ internal mutable elements : list [ Node ] = [];
+
+ /// <summary>A reference on a html page</summary>
+ public href : string = this.ToString() + this.GetHashCode().ToString();
+
+ internal mutable current : Node;
+
+ internal mutable comment : string = "";
+ internal mutable remark : string = "";
+ internal mutable return : string = "";
+ internal mutable param : string = "";
+ internal mutable attr : Reflection.TypeAttributes;
+ internal mutable info : string;
+ internal parent : TopNode;
+
+
+ internal page_content (elements : list [ Node ], ns : string) : string
+ {
+ mutable res = "";
+ res += "<div class=\"ns-index\">\n";
+ res += "<span class=\"ns-index\" id=\"" + this.href + "\">Namespace " + (if (ns.Length ==0) "?Empty?" else ns) +"</span>\n";
+ foreach (e in elements)
+ when (e.elemType.Equals(ElementType.Type()) || e.elemType.Equals(ElementType.Unknown()))
+ {
+ def ahref = match (e.elemType) { | Unknown => "#" + e.href | _ => e.html_file + "#" + e.href };
+ res += "<div title=\"" + e.full_name + "\" class=\"index-element\">";
+ res += match (e.elemType) { | Type => "class" | Unknown => "namespace" | _ => e.elemType.ToString() };
+ res += " ";
+ res += "<a href=\"" + ahref + "\">" + e.name + "</a>";
+ res += if (comment.Length > 0) "<div class=\"komentarz\">Comment: " + comment + "</div>" else "";
+ res += if (remark.Length > 0) "<div class=\"uwaga\">Remark: " + remark + "</div>" else "";
+ res += "</div>\n";
+ }
+ res += "</div>\n";
+ res
+ }
+
+ public virtual ToIndex (content : ref string) : void
+ {
+ // first group types in 'anonymous' namespace
+ mutable is_anonymous_ns = false;
+ foreach (e in elements)
+ when (e.elemType.Equals(ElementType.Type())) is_anonymous_ns = true;
+
+ // add elements in anonymous
+ when (is_anonymous_ns)
+ {
+ content += page_content(this.elements, "");
+ }
+
+ foreach (e in elements)
+ when (e.elemType.Equals(ElementType.Unknown())) e.ToIndex(ref content)
+ }
+
+ public virtual infoPages () : void
+ {
+ foreach (e in elements)
+ when (e.elemType.Equals(ElementType.Unknown())) e.infoPages();
+ }
+
+ public Comment(str : string) : void {
+ current.comment += str;
+ }
+
+ public Remark(str : string) : void {
+ current.remark += str;
+ }
+
+ public Return(str : string) : void {
+ current.return += str;
+ }
+
+ public Param(str : string) : void {
+ current.param += str;
+ }
+
+}
+
+
+class Node : TopNode
+{
+ public mutable elemType : ElementType = ElementType.Unknown();
+ /// <summary>Name of the element</summary>
+ public mutable name : string;
+ /// <summary>Full name (with namespaces path)</summary>
+ public mutable full_name : string = "";
+
+ public html_file : string {
+ get { if (parent is Node) (parent :> Node).full_name + ".html" else "index.html"}
+
+ }
+
+ public override ToIndex (content : ref string) : void
+ {
+ when (this.elemType.Equals(ElementType.Unknown()))
+ {
+ // Console.WriteLine("Podstrona typu {0}, nazwa {1}", this.elemType, this.full_name);
+ // self-explanation
+ content += page_content(this.elements, this.full_name);
+
+ foreach (e in elements)
+ when (e.elemType.Equals(ElementType.Unknown())) e.ToIndex(ref content);
+ }
+ }
+
+ public override infoPages () : void
+ {
+ // create page for current namespace
+ // Console.WriteLine("Zapis pliku {0}", this);
+ when (this.elemType.Equals(ElementType.Unknown()))
+ {
+ def fname = this.full_name ;
+ mutable content = "";
+ content += HtmlGenerator.Title("Nemerle Library", "Namespace " + fname);
+ foreach (e in elements)
+ content += e.ToHtml();
+ HtmlGenerator.Page ( fun () { content }, fname + ".html");
+ }
+
+ foreach (e in elements)
+ when (e.elemType.Equals(ElementType.Unknown())) e.infoPages();
+ }
+
+
+ public this(name : string, prefiks : string, parent : TopNode) {
+ this.name = name;
+ this.full_name = prefiks;
+ this.parent = parent;
+ // Console.WriteLine("Nowy element Name " + prefiks);
+ }
+
+
+
+ filteredIter (l : list [ Node ], cond : Node -> bool, iter : Node -> string) : string
+ {
+ mutable res = "";
+ foreach (e in l) when (cond(e)) res += iter(e);
+ res;
+ }
+
+ public ToHtml () : string
+ {
+ mutable res = "";
+ mutable com = if (comment.Length > 0) "<div class=\"komentarz\">" + comment + "</div>" else "";
+ com += if (remark.Length > 0) "<div class=\"uwaga\">Remark: " + remark + "</div>" else "";
+ com += if (return.Length > 0) "<div class=\"return\">Return: " + return + "</div>" else "";
+ com += if (param.Length > 0) "<div class=\"param\">Parameter: " + param + "</div>" else "";
+
+ /*
+ mutable att = this.info;
+ when (!this.attr.Equals(null))
+ att += " " + this.attr.ToString() + " ";
+ att += " ";
+ */
+ def att = "";
+
+ match (elemType) {
+ | Unknown =>
+ /**
+ res += att + "<span class=\"namespace\" title=\"" + this.full_name + "\">" + name + "</span>\n";
+ res += com;
+ res += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Method()) }, fun (e) { e.ToHtml() });
+ res += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Property()) }, fun (e) { e.ToHtml() });
+ res += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Field()) }, fun (e) { e.ToHtml() });
+ res += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Type()) }, fun (e) { e.ToHtml() });
+ // foreach (e in elements) when (!e.elemType.Equals(ElementType.Unknown())) res += e.ToHtml();
+ **/
+ res = "";
+ | Property => res += "Property: " + att + name + com;
+ | Method => res += "Method: " + att + name + com;
+ | Field => res += "Field: " + att + name + com;
+ | Type =>
+ res += "<div class=\"ns-index\"" + ("id=\"" + this.href + "\"") + ">Class " + att;
+ res += "<span class=\"ns-index\" title=\"" + this.full_name + "\">" + name + "</span>\n";
+ res += com;
+ mutable components = "";
+ components += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Method()) }, fun (e) { "<li>" + e.ToHtml() + "</li>\n"});
+ components += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Property()) }, fun (e) { "<li>" + e.ToHtml() + "</li>\n"});
+ components += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Field()) }, fun (e) { "<li>" + e.ToHtml() + "</li>\n"});
+ components += filteredIter(elements, fun (e) { e.elemType.Equals(ElementType.Type()) }, fun (e) { "<li>" + e.ToHtml() + "</li>\n"});
+ when (components.Length > 0)
+ res += "<ul>\n" + components + "</ul>\n";
+ res += "</div>\n";
+ }
+ res
+ }
+}
+
+// -----------------------------------------------
+class DataTree
+{
+ split (str : string) : char*string { (str[0], str.Substring(2)) }
+
+ mutable tree : TopNode = TopNode();
+ mutable sources : list [ string ] = [];
+
+ public sourcesToString () : string
+ {
+ mutable res = "";
+ res +=
+ match (sources.Length) {
+ | 0 => "No sources?"
+ | 1 => "Source: "
+ | _ => "Sources:<br /> "
+ }
+ res += List.Head(sources);
+ def r = List.Tail(sources);
+ foreach (e in r) res += ", " + e;
+ res
+ }
+
+ public AddSource(src : string) : void
+ {
+ sources += [ src ]
+ }
+
+ smart_strip(path : string) : list [ string ]
+ {
+ // first split into name and parameters
+ def par_pos = path.IndexOf('(');
+ def path_name = if (par_pos != -1) path.Substring(0, par_pos) else path;
+ def param = if (par_pos != -1) path.Substring(par_pos) else "";
+
+ // Console.WriteLine("{0} = ({1},{2})", path, path_name, param);
+
+ mutable token_list = Nemerle.Collections.List.FromArray(path_name.Split(array ['.']));
+ mutable res = [];
+ // analyze name
+ while (token_list.Length > 1)
+ {
+ mutable r = List.Hd(token_list);
+
+ /// when not .., i.e. ctor
+ when (r.Length != 0)
+ {
+ res += [ r ];
+ // Console.WriteLine("<-- " + r);
+ }
+ when (token_list.Length > 0) token_list = List.Tl(token_list)
+ } // while ()
+ def last = List.Hd(token_list);
+ def last_token = if (par_pos > -1) (last + param) else last;
+ res += [ last_token ];
+ res
+ }
+
+ memb (set : TopNode, name : string) : Node
+ {
+ mutable res = null;
+ foreach (e in set.elements) when (name.Equals(e.name)) res = e;
+ res;
+ }
+
+ public AddItem(str : string, attr : System.Reflection.TypeAttributes, info : string) : void
+ {
+ def path = str.Split(array ['.']);
+ mutable pointer = tree;
+ mutable next;
+ foreach (edge in path)
+ {
+ // Console.WriteLine("ĹcieĹźka " + edge);
+ next = memb(pointer, edge);
+ when (next == null)
+ {
+ def pref = if (pointer is Node) ((pointer :> Node).full_name + "." + edge) else edge;
+ next = Node(edge, pref, pointer);
+ pointer.elements = pointer.elements + [ next ];
+ }
+ pointer = next;
+ }
+ pointer.attr = attr;
+ pointer.info = info;
+ }
+
+ public AddItem (str : string) : void
+ {
+ // System.Console.WriteLine("---> " + str);
+ def (tySy, path) = split(str);
+ // System.Console.WriteLine("---> split({0}) = ({1}, {2})", str, tySy, path);
+ def ty =
+ match (tySy) {
+ | 'T' => ElementType.Type();
+ | 'F' => ElementType.Field();
+ | 'M' => ElementType.Method();
+ | 'P' => ElementType.Property()
+ | _ => ElementType.Unknown()
+ }
+
+ def pathList = smart_strip(path);
+ mutable pointer = tree;
+ mutable next;
+ foreach (edge in pathList)
+ {
+ next = memb(pointer, edge);
+ when (next == null)
+ {
+ def pref = if (pointer is Node) ((pointer :> Node).full_name + "." + edge) else edge;
+ next = Node(edge, pref, pointer);
+ pointer.elements = pointer.elements + [ next ];
+ }
+ pointer = next;
+ }
+ tree.current = next;
+ tree.current.elemType = ty;
+ // Console.WriteLine("Added {0} {1}", tree.current.full_name, tree.current.elemType);
+ }
+
+ public AddComment (str : string) : void
+ {
+ tree.Comment(str);
+ }
+
+ public AddRemark (str : string) : void
+ {
+ tree.Remark(str);
+ }
+
+ public AddReturn (str : string) : void
+ {
+ tree.Return(str);
+ }
+
+ public AddParam (str : string) : void
+ {
+ tree.Param(str);
+ }
+
+
+ index_content () : string
+ {
+ mutable content = "";
+ content += HtmlGenerator.Title("Nemerle Library", this.sourcesToString());
+ // teraz zawartoĹÄ
+
+ tree.ToIndex(ref content);
+ content;
+ }
+
+
+ public indexPage() : void
+ {
+ HtmlGenerator.Page(index_content, "index.html");
+ }
+
+ public infoPages () : void
+ {
+ tree.infoPages();
+ }
+
+}
+
Added: nemerle/trunk/tools/ndp/Makefile
==============================================================================
--- (empty file)
+++ nemerle/trunk/tools/ndp/Makefile Sat Oct 14 13:36:57 2006
@@ -0,0 +1,3 @@
+
+nemerledoc.exe: XMLMacro.n DataTree.n AssemblyAnalyzer.n
+ ncc -g -Ot -texe -doc:test.xml -out:$@ $^
Added: nemerle/trunk/tools/ndp/XMLMacro.n
==============================================================================
--- (empty file)
+++ nemerle/trunk/tools/ndp/XMLMacro.n Sat Oct 14 13:36:57 2006
@@ -0,0 +1,199 @@
+// xml
+// Top-down (LL) parser
+
+using System;
+using System.Collections;
+using System.Text;
+using System.Xml;
+// using System.Xml.XPath;
+using Nemerle.Assertions;
+
+
+module NemerleDocXml
+{
+
+ _info () : void
+ {
+ Console.WriteLine("Typ:" + cursor.NodeType.ToString() + " nazwa: " + cursor.Name +
+ " atrybut: " + (if (cursor.AttributeCount > 0) cursor[0] else "") +
+ " val: " + cursor.Value + " line:" + cursor.LineNumber.ToString())
+ }
+
+ /// <summary>hygienic tests</summary>
+ StartTag(name : string) : void
+ {
+ def error = String.Format("Open tag <{0}> expected, line: {1}", name, cursor.LineNumber);
+ assert(cursor.NodeType == XmlNodeType.Element && cursor.Name.Equals(name), error);
+ }
+
+ SkipStartTag(name : string) : void
+ {
+ def error = String.Format("Open tag <{0}> expected, line: {1}", name, cursor.LineNumber);
+ assert(cursor.NodeType == XmlNodeType.Element && cursor.Name.Equals(name), error);
+ _ = cursor.Read()
+ }
+
+ SkipEndTag(name : string) : void
+ {
+ def error = String.Format("Closing tag </{0}> expected, line: {1}", name, cursor.LineNumber);
+ assert(cursor.NodeType == XmlNodeType.EndElement && cursor.Name.Equals(name), error);
+ _ = cursor.Read();
+ }
+
+ readText () : string
+ {
+ mutable res = "";
+ when (cursor.NodeType == XmlNodeType.Text)
+ {
+ res = cursor.Value;
+ _ = cursor.Read()
+ }
+ res
+ }
+
+ isOpenTag(name : string) : bool
+ {
+ cursor.NodeType == XmlNodeType.Element && cursor.Name.Equals(name)
+ }
+
+ isEndTag(name : string) : bool
+ {
+ cursor.NodeType == XmlNodeType.EndElement && cursor.Name.Equals(name);
+ }
+
+ // ---------------------------
+ mutable cursor : XmlTextReader;
+ mutable tree : DataTree;
+
+ paramTag () : void
+ {
+ mutable res = "";
+ res = cursor[0];
+ SkipStartTag("param");
+ res += ": " + readText();
+ tree.AddParam(res);
+ SkipEndTag("param");
+ }
+
+ /// <summary>
+ /// Why summary is doubly quoted???? Why?
+ /// </summary>
+ summaryTag() : void
+ {
+ SkipStartTag("summary");
+
+ match ((cursor.NodeType, cursor.Name)) {
+ | (XmlNodeType.Element, "summary") =>
+ SkipStartTag("summary");
+ tree.AddComment(readText());
+ SkipEndTag("summary");
+ when (isOpenTag("param"))
+ paramTag ();
+ when (isEndTag("summary")) SkipEndTag("summary");
+ | (XmlNodeType.Text, _ ) =>
+ tree.AddComment(readText());
+ while (!isEndTag("summary"))
+ {
+ when (isOpenTag("param"))
+ paramTag();
+ when (isOpenTag("returns"))
+ {
+ SkipStartTag("returns");
+ tree.AddReturn(readText());
+ SkipEndTag("returns");
+ }
+ }
+ SkipEndTag("summary");
+
+ when (isOpenTag("remarks")) {
+ SkipStartTag("remarks");
+ tree.AddRemark(readText());
+ SkipEndTag("remarks");
+ }
+ | _ => throw Exception("Not implemented " + cursor.LineNumber.ToString());
+ }
+ }
+
+
+
+ memberTag() : void
+ {
+ StartTag("member");
+ // Info();
+ tree.AddItem(cursor[0]);
+ if (cursor.IsEmptyElement)
+ {
+ _ = cursor.Read();
+ }
+ else {
+ _ = cursor.Read();
+ summaryTag();
+ SkipEndTag("member");
+ }
+ }
+
+ membersTag() : void
+ {
+ SkipStartTag("members");
+ while (isOpenTag("member"))
+ memberTag();
+ SkipEndTag("members");
+ }
+
+ nameTag() : void
+ {
+ SkipStartTag("name");
+ _ = cursor.Read();
+ SkipEndTag("name")
+ }
+
+ assemblyTag() : void
+ {
+ SkipStartTag("assembly");
+ nameTag();
+ SkipEndTag("assembly");
+ }
+
+ docTag() : void
+ {
+ SkipStartTag("doc");
+
+ assemblyTag();
+ // Info();
+ membersTag();
+ // Info();
+
+ SkipEndTag("doc")
+ }
+
+ rootTag() : void
+ {
+ assert(cursor.NodeType == XmlNodeType.XmlDeclaration, "Oczekiwano znacznik <?xml>");
+ when (cursor.Read())
+ docTag();
+ }
+
+
+ public static Main(arg : array [ string ]) : void
+ {
+ tree = DataTree();
+ foreach (file in arg)
+ {
+ when (file.EndsWith(".dll"))
+ AssemblyAnalyzer.analyze(file, tree);
+
+ when (file.EndsWith(".xml"))
+ {
+ cursor = XmlTextReader(file);
+ cursor.WhitespaceHandling = WhitespaceHandling.None;
+ _ = cursor.Read();
+ rootTag();
+ }
+
+ tree.AddSource(file);
+ }
+ tree.indexPage();
+ tree.infoPages();
+ }
+
+} // -- NemerleDocXml
Added: nemerle/trunk/tools/ndp/nemerle-doc.css
==============================================================================
--- (empty file)
+++ nemerle/trunk/tools/ndp/nemerle-doc.css Sat Oct 14 13:36:57 2006
@@ -0,0 +1,137 @@
+html,body { color: darkblue; background: #E6ECFF;
+ font-family: helvetica, arial, sans-serif }
+
+
+div.title { border-bottom: 1px solid black;
+ background: rgb(153,212,239);
+ color: black;
+ padding: 4px }
+
+span.title { font-weight: bold;
+ font-size: large; }
+
+span.subtitle { font-size: small; }
+
+
+div.ns-index { background-color: white;
+ color: black;
+ border-collapse: collapse;
+ border: 1px solid #aaa;
+ padding: 0 .8em .3em .5em;
+ margin-top: 1ex;
+ margin-bottom: 1ex; }
+
+span.ns-index { font-weight: bold; }
+
+div.index-element { padding-left: 20px; margin-left: 20px; }
+
+div.footer {
+ background: #E6ECFF;
+ border: none;
+ margin: .6em 0 0.8em 0;
+ padding: .4em 0 .4em 0;
+ text-align: center;
+ font-size: 90%;
+ font-variant: small-caps;
+}
+
+/* ------------ OLD ------------*/
+a { text-decoration: underline; }
+a:link { color: blue; }
+a:visited { color: darkblue; }
+a:active { color: red; }
+
+
+
+div.site { border-bottom: 1px solid black;
+ background: #f0f0d0; padding-bottom: 5px;
+ font-size:large; font-weight: bold }
+
+div.salve {
+ font-size: 200%;
+ text-align: center;
+ color: rgb(204,149,97);
+ margin-top: 1ex;
+ margin-bottom: 1ex;
+}
+
+/** nawigacja **/
+
+// div.navigator { position: fixed; float: left; margin-left: 50%; margin-top: 2ex; }
+div.navigator { }
+
+
+div.navigator p { border-left: 2px solid white;
+ border-top: 2px solid white;
+ border-right: 2px solid #806040;
+ border-bottom: 2px solid #806040;
+ padding-left: 2ex;
+ padding-right: 2ex;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ margin-top: 0em;
+ margin-bottom: 1em;
+ background: white; color: black }
+
+div.navi span { display: block; text-align: center; font-weight: bold; margin-bottom: 1ex }
+
+div.navigator a { text-decoration: none; display: block;
+ text-align: left; padding: 1px;
+ font-size: small;
+ border-bottom: 1px solid #806040; }
+
+div.navigator a:hover { color: black; background: grey }
+
+
+
+/*** info ***/
+
+p.namespace,div.namespace {
+ width: 90%;
+ border-left: 2px solid white;
+ border-top: 2px solid white;
+ border-right: 2px solid #806040;
+ border-bottom: 2px solid #806040;
+ font-size: small;
+ float: right;
+ padding-left: 2ex;
+ padding-right: 2ex;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ margin-top: 0em;
+ margin-bottom: 1em;
+ background: white; color: black;
+}
+
+span.namespace {
+ font-size: 130%;
+ text-align: center;
+ background: white;
+ color: red;
+}
+
+
+/*** klasa ***/
+div.klasa {
+ border: 1px solid grey;
+}
+
+span.klasa {
+ color: magenta;
+}
+
+/** komnetarz **/
+div.komentarz {
+ font-style: italic;
+ color: green;
+}
+
+div.uwaga {
+ font-style: italic;
+ color: pink;
+}
+
+div.param {
+ font-style: italic;
+ color: orange;
+}
More information about the svn
mailing list