Join GitHub today
GitHub is home to over 20 million developers working together to host and review code, manage projects, and build software together.
Common Lisp HTML
Fetching latest commit…
Cannot retrieve the latest commit at this time.
|Failed to load latest commit information.|
Wormtrails The general idea is this: - a CHART object contains a bunch of BUCKETs and knows about a bunch of THINGs - a BUCKET holds a number of SAMPLEs. A bucket might represent a weekend (for box offices), an hour (for measuring samples across a 24 hour period), a day, etc. A bucket is identified within a chart by a numerical index. For example, the box office buckets are identified by indexes of the form 200801, meaning the first weekend of 2008. Hourly buckets are indexed from 0 to 23. BUCKETs with the same index are EQ. - a THING represents a discrete item being tracked over time. For the IRC charts, that's a nickname. For the movie charts, that's a movie. The THING's name is used as a unique identifier; all THINGs with the same name are EQ. - a SAMPLE is the aggregate value of a THING in a BUCKET. The value might represent a simple count, as in the IRC and referer charts, or the monetary gross, as in the movie charts. Before layout, a SAMPLE is The CHART is the top-level data structure. The steps are generally: - create a CHART (or subclass) object - use ADD-DATA for a simple way to create and accumulate BUCKET, THING, and SAMPLE objects into the CHART - lay out the CHART with LAYOUT; this establishes the rectangles associated with SAMPLEs and their relative positions on an abstract canvas Drawing with vecto: - draw the labels and grid for the entire CHART - draw the rectangles for each SAMPLE into the PNG and add connecting glue - the colors for each samplebox/glue are taken from the color of the THING. the colors of each thing are initialized with ESTABLISH-COLORS. See RAINBOW-COLOR-MIXIN in wormtrails.lisp to see an example of how to set colors up by the position of the debut bucket for a thing, or irc.lisp to see how to set colors of a thing based on which bucket the max sample value falls in. - draw the labels for each THING with DRAW-LABEL. The default method does that by drawing the CHART-LABEL of the THING into the SCREENBOX of an appropriate SAMPLE for the THING, as found with BEST-LABEL-SAMPLE - the default method for BEST-LABEL-SAMPLE just returns first sample that would fit the label, but it can be specialized. The IRC example changes things to use the sample with the maximum value - (samples thing) returns a list of all samples for a THING, and could be used for some other criteria to select one to draw - draw the labels for each BUCKET with DRAW-LABEL; the default method just draws the CHART-LABEL of the BUCKET beneath the bounding box of the bucket - CHART-LABEL for a BUCKET could be specialized to produce a prettier string than just the numerical index; for example the IRC hours are converted to HH:00, with MIDNIGHT and NOON returned for 0 and 12 respectively Scaling is important to get a chart that looks pretty. I haven't determined any automatic way to do scaling yet; I just fiddle with values. Using consistent scaling also makes it much easier to compare chart-to-chart. The imagemap in this version is somehwat primitive. You will need to change the link and onmouseover actions in WRITE-IMAGEMAP-AREA to do something useful if you want to use the PNG/imagemap capability. I think irc.lisp, referers.lisp, and pastes.lisp are good ways to figure out how to get started with simple stuff. More complex stuff, just let me know.