Background: lxr.linux.no - the original Linux cross reference (hence LXR) lxr.mozilla.org - LXR adapted to mozilla.org's needs, in my opinion by the time these changes were implemented it ceased to be LXR, but that's all a matter of perspective. landfill.mozilla.org/mxr - LXR re-branded as MXR with symlinks instead of real Apache roots, designed mostly as a reference point landfill.mozilla.org/mxr-test - MXR evolved those two eventually became: mxr.landfill.bugzilla.org and mxr-test.landfill.bugzilla.org swift - my personal box, the first time I've actually needed to host my own MXR. most of the referenced code was in SVN repositories with either Trac or ViewCVS/ViewVC - the code involves Debian packages, Linux code including man pages - we have specifications (wow)! which I converted from .doc format (...) using MS Word, the resulting HTML files have corresponding _files/ directories - I kept swift and mxr-test in sync for about half a year, but I try to keep internal information from leaking out, it seems that includes missing some functions lxr.mozilla.org originally ran Solaris, these days it runs Linux swift runs snv (Solaris Nevada, an OpenSolaris derivative) the indexer is glimpse, unfortunately there are licensing issues that can affect commercial users (this isn't an issue for mozilla.org, but for purists, it's a pain). There are comments and patches in various places describing suggested versions of glimpse and how to deal with it. Some day, glimpse might be replaced.... Over time, people have decided that they really want mxr-test to land. unfortunately, I hadn't managed to split my patches / work, and worked on various enhancements concurrently, often without finishing an enhancement to my satisfaction. Even when I did have features ready, I couldn't find any reviewers. So mxr-test grew and grew. As it happens, when I do commits for commercial groups, the comments I write tend to be very long and detailed. This comment resembles them, not the ones people familiar w/ mozilla.org are familiar seeing me write. .htaccess: * Whitelisting localhost - this makes testing and various other things slightly easier. If you're being attacked from localhost, you have bigger issues. * FollowSymlinks, Directory index.cgi add support for symlink style multiple root hosting. * ExecCGI is an effort to reduce the amount of configuration work required when one tries to configure MXR. - Note that .htaccess directives such as these will only work if the server delegates enough flexibility to them, see your manual for more information. INSTALL: * first note about setting up multiple roots using symlinks. More to come. * mentions the difference in docroots if you use symlinks! * sourceprefix is a new directive. Basic documentation note in file style. Local.pm: * support for Bonsai, Trac and ViewCVS - Note that ViewCVS and ViewVC should be about the same, I'm not sure that the functions were really written against ViewCVS installs instead of ViewVC installs, but as long as the basic URL syntax is the same, it doesn't matter. * Spelling :) * fdescexpand - new license parsing algorithm. - Handles the LICENSE BLOCK markers present in some modern license headers - Title tag trumps (but all markup is stripped) * descexpand - support Debian/control files * dirdesc - support for directories that supplement HTML files (from save as web page complete in various applications) - support for Debian/control files * deschtmlfilesfolder - if a foo_files/ directory exists, then hopefully it's paired to a foo.html or a foo.htm - when it is, the description for the directory is given as a link to the file with its title as the linked text * descreadme - preformat readme text * descdebcontrol - basic algorithm for reading Debian/control files - this implementation is basic and isn't expected to handle files that describe multiple packages well * readman - removes line continuation characters (\) from file handle DESC. * descmanfile - tries to pull man page names from manual files (support for Japanese is especially painful) * beginskip, endskip - very very very poor man's comment marker statements for use by other template statements == The following functions will need to be tailored. after all, this is Local.pm == * bonsaihost - map CVS/Root to a Bonsai host root X this should probably rely on a $Path property. * beginbonsai - some logic to decide if a directory is CVS managed and has a corresponding Bonsai install - if it doesn't, then comment out the Bonsai section of the template * endbonsai - reverses beginbonsai * trachost - maps a SVN repository to a Trac host root * begintrac - some logic to decide if a directory is SVN managed and has a corresponding Trac install - if it doesn't, then comment out the Trac section of the template * endtrac - reverses begintrac X viewcvshost X this function isn't in mxr-test on landfill. The function was written but was dropped when I exported the code from swift. X I'll retrieve this function in a later landing. X this function would behave like bonsaihost and trachost, mapping a CVS (or SVN in some ViewVC case) root to a ViewCVS/ViewVC host. * beginviewcvs - some logic to decide if a directory is SVN managed and has a corresponding ViewCVS install - if it doesn't, then comment out the Trac section of the template * endviewcvs * reverses beginviewcvs diff: * generic change from lib/ to lib (affects all scripts) X note that diff isn't used on MXR (or lxr.mozilla.org) and hasn't been enabled in a long time. X I plan to resurrect this relatively soon as we foresee more use for it on swift. find: * changetarget - support for changing search tree using a drop down * link to change from a file find to a text search based on the filename. the goal here is to increase discoverability of related features. * small sanity check about glimpse file format (first line should be the number of files in the list) * link to each matching directory segment instead of just the file * support for redirecting to the right tree (/wrongtree/find?tree=righttree will result in an HTTP header redirect to /righttree/find) - this is mostly for people w/ JavaScript disabled. X if the admin changes the srcroot for a tree but doesn't update the indexes then you'll get search results that list full paths, and the links will of course not work. This isn't really a new bug, it's just something that I should fix later. genxref: * support for Perl (basic) * refactored support for IDL (tentative) * findidentPL - modeled after findident - "package" is treated as class declaration - "my", "our", and "local" are treated as variable declarations (globals will result in unrecognized markers which can be styled in e.g. red dotted boxes) - "sub" is treated as a function declaration X "=>" should be treated as constant declarations, but I didn't get around to writing this part and it seems people want mxr-test to land. Yes, I know that it isn't always a constant, but IME it seems to be often enough and I think I can make the logic work. * file counting for all of the sections has been changed to give numbers by file class instead of the current system which just results in bogus numbers for anything after the first group. (in a way this fixes a regression from the JavaScript landing.) - this can be seen in the $curfnum variables and the use of $#{ftypelist} * c_clean - no longer filters local variables. - Filtering blocks like this results in complaints about nested declarations in C++ headers - Besides, it turns out that local variables are worth indexing, and JavaScript indexes local variables * findidentIDL - basically just refactored because of a fear relating to not catching SetFoo/GetFoo statements properly X the code to actually catch them isn't written at this time and is in the section labeled readonly attribute const * findusagePL - some basic understanding of Perl comments - basic recognition of using known variables * findusageIDL - this function is required for counting symmetry otherwise the cross reference gets corrupted X it should recognize places where an interface is referenced as an attribute, parameter or return of a method * toplevel (yeah yeah, I know, don't use top level code) - -follow enables symlink mazes inside source repositories, this enables me to setup cross references of messy SVN repositories - the general approach is this: 1. SVN co the *entire* repository (this gets you all branches for everything) into a tree called evil-all 2. setup a tree called evil, for each file/directory that you want, make a symlink to the corresponding evil-all directory, and set up intermediate directories as needed. =how_to_set_up_a_svn_world simple example: d evil-all/ d evil-all/branches d evil-all/icons d evil-all/icons/tags d evil-all/icons/trunk d evil-all/tags d evil-all/trunk d evil-all/vendor d evil-all/vendor/tags d evil-all/vendor/trunk d evil/ d evil/icons s evil/icons/trunk => ../../../evil-all/icons/trunk s evil/trunk => ../../evil-all/trunk d evil/vendor s evil/vendor/trunk => ../../../evil-all/vendor/trunk to |svn update evil|, simply |svn update evil-all|. whether or not you actually expose a cross reference for evil-all is your choice. just make sure you have lots of space. X I'd suggest setting up ZFS and a hacked SVN implementation that plays nicely w/ ZFS snapshots and zero-byte copies (this is on my to-do list) =cut * Add support for .hh (one of many silly extensions that some systems use to mean C++ Header) * optimize regexps not to capture needlessly * Perl files are: .pl, .pm, .cgi. This means you don't get .bm (mozbot modules) or dot-less files such as the driving files for MXR itself - Note that /source/ has some magic to recover from this, however it does mean that sub in such files will not be indexed. - The alternative is a mandatory read off all files being cross referenced. ident: * use Local for template magic * blamerefs - each identifier will pull in a template which enables references to a cross reference similar to the links at the top of source - fpos is a common delimited list of lines made available to the template X this should be optimized to cache the file * ident - changetarget - support for changing search tree using a drop down - support for using Perl regular expressions to filter matching files - support for IDL variations: attribute long foo; maps to: C++ ->GetFoo(), ->SetFoo(), and JavaScript .foo; - If asked to match IDL variations and the requested identifier is SetFoo/setFoo/GetFoo/getFoo, then we check for each of four identifiers: SetFoo, setFoo, Foo, and foo or GetFoo, getFoo, Foo, and foo. If asked to match IDL variations and the requested identifier is some other Foo, then we check for each of six identifiers: SetFoo, setFoo, GetFoo, getFoo, Foo, and foo. - link to change from an identifier search to a text search based on the identifier name and file filter. the goal here is to increase discoverability of related features. the identifier token is included twice in this search: - first as the search text (which is a glimpse input and has a limit on the pattern length) - second as a Perl regular expression filter with \b hints indicating that only whole word matches for the identifier are wanted. X Perhaps this should include ([sg]et|) if the identifier search is set to include IDL variations. - line isn't linked to X there is tentative support for not including blame refs ever, to my knowledge only one person has complained about them, the previous code only included such links once and the links were on their own line. currently the template sticks these references on the same line. * support for redirecting to the right tree (/wrongtree/ident?tree=righttree will result in an HTTP header redirect to /righttree/ident) - this is mostly for people w/ js disabled. - if an identifier is requested containing :: then the text before the :: is used as a find, this happens to work fairly well for C++ and Perl index.cgi: * This file is designed to aid in symlink style tree roots. It picks either root/index.html (which is the real root) or index.html which it treats as a template for a tree root. X there's a bit of magic code here that assumes something about your MXR server configuration, you should tune it as appropriate... - As long as your server name includes MXR or LXR, it assumes that the cross reference lives in the root of the web server (as is the case for http://lxr.mozilla.org) - Otherwise, it assumes that it lives under a directory e.g. /mxr/, /mxr-test/, /lxr/. X this is just a simplistic heuristic to save me from checking if the configuration recognizes the root (which I should do...) index.html: * it's an html file, we can include a start HTML tag :) * a basic style rule X this should probably move into style/, but .... * the number of trees on mxr-test installations tends to be much bigger than the number of trees on older LXR configurations (probably partly because it's much easier to add new trees) - as such the layout if changed to have the description head not interfere with the starting point block * replacing some instances of FONT tags with more appropriate heading tags X some of the remaining ones really should be replaced with class=note * wider search fields! - note that 29 is a very special number to glimpse, it's the largest number of characters glimpse allows for a search pattern * wider starting point column - the text on the right of the root pages is mostly fluff, so in this design more space is allocated to the starting points column * a link to the parent (index.html is the file used per tree root) - while this may be confusing, it's life, the real MXR root index file lives in root/index.html * new description text - the old text talked about lxr.mozilla.org's main source referencing. - the new text talks about what you can do with an MXR installation, and how you can do it. - the reference to Linux.no has been moved to the root index.html file as it's assumed that when someone is already browsing a tree they don't really care about the history of LXR. X the MXR's I've run index 30+GB of content, I think it'd be kinda nice if each tree knew approximately how big it was so that it could say here lxr.conf: * spelling X note that bonsaihome is now slightly less important as Local::bonsaihost is responsible for most of the work - in theory bonsaihome could be rewritten to support per tree style home definitions ala source root. I've found that sometimes a root contains more than one kind of repository, so trying to force everything in a single tree to relate to a single kind of Bonsai/... just doesn't work so well. X if you really want this feature, file a bug, I'll fix it. * identref - template for extra per file/line links for each identifier search result X this can be adapted to have per tree ident files ... * sourceprefix - per tree alternate source prefix see webtools and NSPR for examples, this is used by the source/ script * imported most of the current roots from lxr.mozilla.org * lxr.mozilla.org changed its locations for lxr-data and glimpse - this is obviously a configuration setting, but not conflicting w/ lxr.mozilla.org is slightly advantageous. word of caution: you don't want lxr-data to be inside the directory containing your MXR code, doing so means that cross referencing your cross reference becomes a cyclically prohibitive task. I made this mistake on landfill, it is not possible to cross reference /mxr/ because the cross reference data lives inside that directory. Also, you really do want to have the LXR data directory as shallow as possible and note that it shouldn't really be in the same place as the database directory. It's OK for them to be near each other, but having them too close results in bad tree naming (mozilla/mozilla/mozilla and similarly yuck things). This warning especially applies to e.g. justdave for when he sets up lxr.mozilla.org Note that with the exception of not being able to index the cross reference, the only other hazard is wasting backup space/time on generated content. It's much better to have that content in its own directory, e.g. /lxr-root/indices v. /lxr-root/sources. (Perhaps justdave will change the lxr.conf after reconfiguring lxr.mozilla.org.) This isn't of course a requirement, it's just a word of advice. Speaking from experience as someone who has made these sorts of mistakes repeatedly. On swift, I set up /export/home/svn/lxr-root/lxr-data, this ended up being silly, if only because it had way too much nesting for my own good, and also because not everything was an SVN! eventually I moved a bunch of the source roots to /export/home/svn/rootname, leaving the data directories in /export/home/svn/lxr-root/lxr-data. At some future time, I'll probably move lxr-data to /export/home/lxr-data. If you're using ZFS, I highly recommend that each LXR source root be given its own volume, this lets you cheaply answer the question "How much space is that tree wasting." Glimpse versions. Landfill was running 4.18 at one time. Swift is running something like 3.62 (I can't see swift now). There is a minimum version for glimpse as configured here, previous versions chose not to index numbers. It turns out that indexing numbers is appreciated, so it's enabled. Very old versions of glimpse don't support this. If you actually want to use such an old version, you can remove the glimpseindex flag. search: * changetarget - support for changing search tree using a drop down * changefindpreset - support for frequently used suggested file search restrictions - this is based on my own guesses. this will be tuned eventually based on reading logs. * support for case sensitive searching - this is done in a post processing step * support for limiting search file domain - this is done by glimpse and can save lots of time * drop down list of suggested file restrictions (handled either using JavaScript or server side) - there's a warning for people who don't enable JavaScript and how select a file find restriction and a different suggestion. X I've been asked for the ability to search multiple distinct directories, at this time, I'd suggest searching one directory and copying the URL into another window and changing it to search your other directory. - If enough people want this feature, I could work on it, but AFAICT glimpse only wants a single restriction, so this probably entails multiple invocations of glimpse (not a big deal really, but...). * Perl filtering of search results - this is done in a post processing step, but it gives you all the comforts of home (Perl, nice, warm, and cozy) - link to change from text search to file find based on the files that were searched here. the goal here is to increase discoverability of related features. X there's still a limit on the number of results, I'm considering removing this. * computers know the difference between 1 and more than 1! * link to each matching directory segment instead of just the file X mxr-test includes the glimpse command so that people can see what was searched. This isn't recommended for production sites and is not included in this commit. * support for redirecting to the right tree (/wrongtree/search?tree=righttree will result in an HTTP header redirect to /righttree/search) - this is mostly for people w/ JavaScript disabled. * cleanFilter - controls the acceptable input for the filter parameter * cleanFind - controls the acceptable input for the find parameter X currently LXR and mxr-test give a really rude message if you try to search for ""s and certain other characters, that should be fixed. In testing I don't believe that check is needed at all. It will probably be removed in the next commit. X if the admin changes the srcroot for a tree but doesn't update the indexes then you'll get search results that list full paths, and the links will of course not work. This isn't really a new bug, it's just something that I should fix later. source: * diricon - poor gopher menus, instead of gopher menus we use even uglier web server icons - symlinks are given a different folder icon (hopefully including an arrow) * fileicon - poor gopher menus, instead of gopher menus we use even uglier web server icons - pictures now have a picture icon - or if they're smaller than 10k, they are used themselves inline X if someone thinks 5k is a better cutoff, file a bug. * filename - the goal of force is to enable people to see html files in friendly MXR style markup instead of as html files. X force is actually broken atm. I need to fix it. I don't think I actually ever wrote it, so atm it actually breaks more things than it helps. * printdir - local $/ is the more proper way to slurp files - this isn't used everywhere. "small changes" *chuckle* - CVS and .svn are management directories for version control systems - _files directories are *supposed* to have corresponding html files, and we assume they do and skip them. X eventually MXR should let you ask to see these things. * isHTML X this should say false for force=1 * isCSS - checks if the file seems like CSS - checks that the web browser doesn't express an interest in html content. * isImage X this isn't consistent with fileicon - checks if the file seems like CSS - checks that the web browser doesn't express an interest in html content. * noWrap - files that should be served as html, images, or CSS don't get wrapped ... * printfile - use isHTML check and undef $/ :), and print the content - use isCSS, change the content type header and print the content X why isn't this consistent with isHTML - use isImage, maps known image kinds to proper mime types. prints image X why isn't this consistent with isHTML - lower-casing some html tags - link to file find based if the file isn't where the client claims it should be. the goal here is to increase discoverability of related features. * support for redirecting to the right tree (/wrongtree/source?tree=righttree will result in an HTTP header redirect to /righttree/source) - this is mostly for people w/ JavaScript disabled. X strange_inexplicable_check - I think the idea here is that if the file doesn't exist but would be an HTML file, then we would serve an empty document to the user, which isn't very nice. template-dir: * lowercase tags template-head: * stylesheet references X generator tag really should be changed * lowercase tags * class for banner * moving link from MCR to treename template-ident-fileref: * based on content in ident * used by ident * basic support for Bonsai and Trac template-source-head: * stylesheet references X generator tag really should be changed X lowercase tags * class for banner, header, * moving link from MCR to treename * support for Bonsai and Trac X ViewCVS support isn't included in mxr-test on landfill X Bonsai support includes two tables, Trac only has one. template-sourcedir-head: * stylesheet references X generator tag really should be changed X lowercase tags * class for banner, header, * moving link from MCR to treename * non Bonsais get no link box (because I don't know of equivalent entry points for non Bonsais) * search within directory. the goal here is to increase discoverability of related features. X should offer a way to find files within this directory. UI suggestions wanted. template-tail: * class for footer * branding update-lxr.sh: X this file should be replaced - it isn't used on landfill or swift * new trees: - security js webtools aviarybranch mozilla1.0 mozilla1.0.x mozilla1.4.x mozilla1.7.x mozilla1.8.x * updated pull script for seamonkey update-search.pl: * replaces update-search.sh * paths are mostly to help the script find glimpse X yes it could and probably should just read lxr.conf X yes it should probably use lib/LXR * enforces some requirements about lxr.conf file structure * glimpseinclude and glimpseexclude are used to tell glimpse what files/directories should be indexed - CVS and .svn directories are exclude . Note: _files directories are fair game! X there needs to be an lxr.conf statement for additional directories so that you can e.g. have a symlink to /usr/include update-src.pl * replaces update-src.sh X yes it should probably use lib/LXR * many new trees: js security webtools bugzilla* update1.0 *-org and similar various seamonkey branches netbeans openoffice gnome eclipse X there seem to be conflicting checkout commands for mozilla*-* and devmo* update-xref.pl: * replaces update-xref.sh X yes it should probably use lib/LXR X yes calling yourself when you're tiny is silly * support for using SetEnv statement from .htaccess - this may seem strange, but I didn't have BerkeleyDB in system path on swift, so I configured .htaccess to supply it lib/SimpleParse.pm: * frag_debug is for debugging (never enabled as this commit is written) lib/LXR/Common.pm: * freetextmarkup is replaced by statustextmarkup ? * bigexpandtemplate * new basic term list * java and cterm are increments over term * cppterm is an increment over cterm * jsterm is an increment over javaterm * pterm is just its own rules... * tterm for template toolkit ... * idref - class ident (styles!) * atomref - class atom (styles!) - this is any identifier as defined by SimpleParse for whatever term library is active that does *not* have a corresponding identifier in the cross reference - you can use this to e.g. color undeclared global variables in red dashed boxes * http_wash - trying to get gtk+ to actually work correctly (double escaping) * htmlquote - mark up by making the quoted text a link X doesn't handle ''s X I don't plan to handle unquoted X I'm not quite sure I care about people rude enough to stick whitespace around =s * statustextmarkup - recognize interface statuses and give them a class (IDL_FROZEN, IDL_UNDERREVIEW, IDL_DEPRECATED) * linetag - add a class to mark lines * markupstring - refactor filtering to markspecials - collect email addresses into a single regexp - add .hh, .pl, .pm, .js and README.txt/.html to list of local files * getnext_fileentry_* - this family is so that a profiler can explain which step takes the most time. * getnext_fileentry - try to find matching files in the file index X note that the file index can be *huge* X this should be replaced with an index of the fileindex and another call to glimpse * filelookup - try to figure out what #include "foopy.h" means - sometimes it means #include "./foopy.h" - sometimes it means #include "./foopy.IDL" - sometimes it means #include "../poo/foopy.h" - sometimes there are multiple matches ... - sometimes all we can find is ../foopy.html or something similarly strange. * notvcalled - is actually called and needs a better name - returns CVS entry version, branch, and keywords for the current $Path file * notycalled - returns the CVS branch for the current $Path directory * markupfile - selects corresponding @term array based on kind. - as mentioned earlier, for Perl files, we sniff the first line. - this gives correct syntax highlighting but is no substitute for cross referencing - spelling - hook for IDL comments - more classes: - comment - string - verb - ident/atom - include statement handling - tries to handle C++ (.h) and Perl (.pm) - use statement handling (this is a Perl statement) - some recognition that line ending handling is painful X this causes glimpse line numbers to not match source/ line numbers - image file type handling X again the list isn't in sync - center is a value for align, middle is the corresponding value for valign - some recognition of CVS binary files. - attempt to recognize mac line endings - offer links with forced mime types. * fixpaths - handle SVN repositories - sourceprefix is used here * set_this_url - refactored from *init - handles http/https - don't include query if there is none - don't include port if it matches the default * glimpse_init - use set_this_url - return header from init_all instead of having init_all print it * init - use set_this_url - return header from init_all instead of having init_all print it * pretty_date - include leading zero for day (per spec) * init_all - provide ctype field (for specifying content type) - return header instead of printing it - use 3 parameter flavor of open * expandtemplate - pass expfunc to expfun * pathname - url_quote ... * pathname X having two functions with the same name probably isn't a good idea the following are mostly for use in templates: * urlpath * pathname_unquoted * filename * virtfold * virttree * titleexpand - list the treename * rooturl - strip the last file fragment from the baseurl if any * stylesheet - pick a stylesheet based on the kind of file and a parameter * stylesheets - build a list of stylesheets for the current file * makeheader - html requires a title tag :) * bigexpandtemplate - adding Bonsai/Trac/ViewCVS hooks into hijacked call to expandtemplate * makefooter - adding baseurl and dotdoturl * url_quote - url quote for user facing strings lib/LXR/Config.pm: * treeify - add support for sourceprefix, e.g. for when you have multiple trees that are really supposed to have the same root but need names so that they can be addressed... - store treehash so that consumers can peek (it maps trees to sourceroots) - I'm clobbering a complaint about invalid tree url. the consumers handle this much better than any stupid pm could - store trees so that consumers can peek (it's a sorted list of trees) * treehash * prefix * sourcerootname - returns sourceprefix or default srcrootname if there's no specifically defined prefix * identref - fill in an identref template root/index.html: * this is the real root (but it might not be the root of the web server) - links are changed to use relative links instead of absolute, to support things like: http://landfill.mozilla.org/mxr-test/seamonkey/source/ * it's an html file, we can include a start HTML tag :) * a basic style rule X this should probably move into style/, but .... * quote percents * the number of trees on mxr-test installations tends to be much bigger than the number of trees on older LXR configurations (probably partly because it's much easier to add new trees) - as such the layout if changed to have the description head not interfere with the starting point block * replacing some instances of FONT tags with more appropriate heading tags X some of the remaining ones really should be replaced with class=note or h4 or ... * wider starting point column - the text on the right of the root pages is mostly fluff, so in this design more space is allocated to the starting points column * new description text - the old text talked about lxr.mozilla.org's main source referencing. - the new text talks about what you can do with an MXR installation, and how you can do it. - the reference to Linux.no has been moved to the root index.html file as it's assumed that when someone is already browsing a tree they don't really care about the history of LXR. X the MXR's I've run index 30+GB of content, I think it'd be kinda nice if each tree knew approximately how big it was so that it could say here * reference to glimpse 3.6 X the patches directory is on mxr-test, I'm not quite sure I want it in CVS (although it would have been a good thing a long time ago) - that includes the glimpse 3.6 Solaris patch.... * imported most of the current root descriptions from lxr.mozilla.org style/: * this directory contains style sheets, both global, and per file type * currently styles are expected to somehow import style.CSS if they exist and want it. style/alt1-pl.CSS: * demonstration alternate style (not very good, but hey, alternates are for having fun, right?) * imports pl.CSS style/alt1-pm.CSS: * import alt1-pl.CSS style/alt1-cgi.CSS: * import alt1-pl.CSS style/pm.CSS: * import pl.CSS style/pl.CSS: * basic definitions for Perl - strings bold - comments bold style/h.CSS: * basic definitions for headers - comments bold - IDL status markings style/IDL.CSS: * basic definitions for interfaces - comments bold - IDL status markings style/style.CSS: * default styles - comments italic and gray - verbs red - strings purple - includes blue -