Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
50 most recent check-ins
|
2026-10-16
| ||
| 18:30 |
Version 1.7
- configure.ac and tclpdf.tcl carry 1.7, the manual synopsis and its header follow, the list-in-a-cell paragraph says since 1.7; configure regenerated by autoconf | |
| 17:57 |
Lists in table cells: bullet and numbered items as runs, tags or Markdown
- tableLayout: a cell of runs may carry item, start and continued; only heading is still refused as a paragraph of its own size - a cell holding a list is marked listed | |
|
2026-10-04
| ||
| 18:20 |
README rewritten: short, current, pointing to the manual and the wiki
- README: one line per feature area up to 1.6 - runs and markup, form fields, signatures and timestamps, import, layers, colour fonts, encryption - in place of the long description | |
|
2026-10-02
| ||
| 18:58 |
Version 1.6.1: a changed module carries a new version, and a release is checked for it
- io 1.3, text 1.26, textBlock 1.20, sign 1.8, structureDest 1.2 - each had changed since an earlier release under the number it carried there, so two installed releases side by side loaded the older file under the newer package; a table cell of runs then failed on a method the older textBlock lacks | |
| 06:06 |
Version 1.6
- configure.ac and tclpdf.tcl carry 1.6, the manual synopsis follows; configure regenerated by autoconf | |
|
2026-10-01
| ||
| 11:49 |
io: one road through open, closed on every exit - with thanks to Ralf Fassel for pointing it out
- io.tcl - read, head and write go through one private Transfer: open in try, trap POSIX, finally close, so a channel never stays open after a refusal; the refusal is sorted out AFTER open failed (Refuse: MISSING for a missing file on read, DIRECTORY for a directory on read and write) instead of a file check in front of open, and no POSIX name is matched; a close error of a write reaches the caller | |
|
2026-09-30
| ||
| 22:00 |
Table cells set as runs, and cells read as tags or Markdown
- tableLayout.tcl, table.tcl - runs is a cell key holding the pairs of text -runs 1, and markup a style key (plain, tags, markdown) said for the table, a section, a column or the cell; the string stays under text, and a translation that marks nothing leaves the cell plain - a cell of runs is measured line by line in its faces and the natural column width follows; refused by name: text beside runs, an odd list, runs beside markup, the pair form of markup, decimal on a body cell of runs, a heading or list item in a cell, and what a didParseCell hook hands back is checked like a written cell | |
|
2026-09-28
| ||
| 15:01 |
Version 1.5
- configure.ac and tclpdf.tcl carry 1.5, the manual synopsis follows; configure regenerated by autoconf | |
| 13:15 |
Lists in flowing text: bullet and numbered items in tags, in Markdown and as runs
- textRun.tcl, textBlock.tcl, text.tcl - a list item is a paragraph state like a heading: the runs carry item bullet or item number, the item is indented on every line and labelled in front of its first, the package counts the numbers; headings and items now share one paragraph table, which also gives the second paragraph of a two-line heading its heading leading; the rest of a height-limited block carries start and continued so that numbering and indent survive the cut; in a tagged document a list is L with ListNumbering holding LI, Lbl and LBody, and is refused beside -paginate and -columns | |
| 05:48 |
Skill reference: runs inside a paragraph, and the check runs against the source tree
- reference/03-text.md - new section with tags, Markdown, the list of -runs 1, font family on an embedded face, three refusals shown by their error codes, and textLines/textHeight answering runs; SKILL.md names it | |
|
2026-09-27
| ||
| 22:11 |
Examples 1.17 and 1.18 cut along the rule of one thing per example
- 01.17-markup - the two notations, one page each, as typed and as set: the string in Courier without -markup, underneath the same string with -markup tags and with -markup markdown; the last line measures that both break into the same lines, the underline apart | |
| 21:20 |
Markdown as the second notation of -markup
- markdown.tcl (new) - text -markup markdown reads strong, em, both, strikeout, links and headings 1 to 3 into the same runs the tags become; read as strictly as the tags, with OPEN, NESTING, LINK and HEADING refusals naming the position; underscore is text, there is no underline, and the rest of Markdown is text rather than refused | |
| 20:31 |
Examples put the source tree in front of auto_path; 02.09 builds its astral characters from code points
- every example inserts the tree at the front of auto_path instead of appending it, so a run from the tree tests the tree whatever copy of the same version is installed; 00.01 says why | |
| 20:29 |
Standard faces underline from their AFM; module versions after the runs check-in
- afmData.tcl regenerated from the Adobe AFMs in the tree: every descriptor carries UnderlinePosition and UnderlineThickness, nothing else changes; mkafm.tcl writes the module version it generates | |
| 19:59 |
Runs in flowing text: bold, italic, underline, strikeout, links and headings inside a paragraph, with tags as the notation
- textRun.tcl (new) - text -runs 1 takes a list of {text options} pairs and sets each run in its own face: -style, -underline, -strike, -url, and -heading 1|2|3 as a paragraph of its own; the line breaker measures per piece, textLines and the rest of a height-limited block answer in the same shape, strokes and link annotations go onto the page after the block's mark | |
|
2026-08-31
| ||
| 13:24 |
Version 1.4
- configure.ac and tclpdf.tcl carry 1.4, the manual synopsis follows | |
| 13:14 |
Document timestamps: new module timestamp.tcl, examples, tests, shared signing helpers
- timestamp.tcl - ::tclpdf::sign timestamp appends an RFC 3161 document timestamp (/Type /DocTimeStamp) to a finished file; no signature required, the authority is configurable through -url or a -tsa transport prefix, and the reply's digest, nonce and status are verified before the file is touched | |
|
2026-08-27
| ||
| 23:39 |
Download page: the label column no longer wraps
- uv/template-download.html - white-space nowrap and top alignment on the three label cells (tclpdf VERSION, source code, tdom), so the generated download.html keeps "tclpdf 1.3" and "source code" on one line check-in: 456b2e4724 user: alex tags: trunk | |
| 22:46 |
Skill reference: a structureResume snippet and -min on hyphenate load
- doc/claude/skills/tclpdf-tcl/reference/09-tagged-ua.md - a Sect resumed on a second pass takes a further child, and resuming a leaf is shown refused as TCLPDF STRUCTURE PLACE leaf; every call the manual describes has a snippet again | |
| 22:39 |
Version 1.3; the four decisions of round 8 named in the manual, an unknown path letter reported, the shipped profile found through a link, the suite run in its own directory
- configure.ac, tclpdf.tcl, configure - the package is 1.3 | |
| 22:03 |
Norm review round 8 built: object generations kept, one extension schema bag, transactional structure scripts, marks on the right ligature component, SVG transforms the right way round, rotation about the point named
- importRead.tcl, import.tcl, importInfo.tcl, update.tcl, filter.tcl - an object is identified by number and generation through parsing, resolution, copying, update and serialisation; a reference to a generation the file does not have is the null object and a null value is a missing entry; the header of an object stream is checked against the cross-reference table; literal strings read end-of-line as LF and cap an octal escape at a byte under Tcl 8.6 and 9 alike; ASCII85 and ASCIIHex refuse characters outside the encoding; the last of two equal dictionary keys wins and only one is written; every leading zero goes through one decimal reader; an integer beyond 2^31 is serialised as a real; an imported page raises the version to what its source claims and is refused where the document cannot follow; a layer only an XObject refers to reaches OCProperties; the Artifact brackets of an imported page are stripped with its marked content; a Flate stream is bounded at 64 MiB | |
| 13:38 |
Signature in the structure tree, sign add refuses PDF/UA, ModDate on every attachment, Inf refused as a colour, SVG colour values held finite
- sign.tcl - a visible signature (-rect) is a form field of the document: its widget carries /StructParent, /TU from -tooltip and /Contents from -contents, stands in a Form structure element with an object reference and in the /Fields record like any field, so the three PDF/UA questions read it; an invisible signature stays an artifact, since ISO 14289-2 makes a widget of zero extent one (8.9.2.4.13) and a structure element around it fails the file; sign add refuses a file that claims PDF/UA as TCLPDF SIGN STATE ua before a session is opened, naming the write-time signature as the way | |
| 09:25 |
Reader hardening, COLR radial rings, UA-2 list numbering, NaN colours, update error contract
- importRead.tcl - a number token is held to the grammar of 7.3.3 and anything else is refused as TCLPDF IMPORT SYNTAX with token and offset; an object stream is bounded by its own header before the loop (First inside the stream, N at most what the header can hold, every word a digit string with an offset inside the object part) instead of by whatever the file claims; an unknown cross-reference entry type is the null object of 7.5.8.3 and shadows an older live entry; object and generation numbers written with leading zeros are the numbers they mean, in the reference, at the object head and in the object stream header, through one Decimal helper; a missing path, a directory and an unreadable file are refused at the reader's one entry under TCLPDF IMPORT FILE, so pdf import and the five reading commands answer alike | |
| 06:06 |
Bitmap colour fonts: sbix faces, AAT morx shaping, and a TrueType collection read by face
- sfnt.tcl - a collection is opened by face (-face, default 0) and rebuilt as a face of its own; the picture tables sbix, CBDT and EBDT stay on disk and are read by offset through openFace, slice and extent, so a 192 MB face costs 0.06 seconds and 28 MB where reading it whole cost 13 seconds and 4.3 GB; a file that is neither a collection nor a bitmap face goes through the old path byte for byte; a table left on disk is refused by sfnt table rather than answered empty | |
|
2026-08-26
| ||
| 20:58 |
One equation under each skin-tone ramp of the emoji example
- examples/02.18-noto-color-emoji.tcl - under each of the three ramps a line "base + tone = toned base" out of the face's own glyphs, the modifier on its own drawn as the swatch the face has for it, the builder and the farmer with their third part, so that what the modifier does stands on the page beside the ramp that shows it; the five parts join the colour font's character list check-in: 4edc54d76b user: alex tags: trunk | |
| 20:41 |
Name the origin and the terms of the Tcl 9 logo
- examples/assets/README.md - Tcl9logo.svg is the Tcl/Tk 9.0 logo by Valerie Carroll with Steve Landers, taken unchanged from the published SVG, under the Tcl licence as the wiki page that introduced it says; the placeholder asking the author to confirm the terms is gone check-in: 051f014c92 user: alex tags: trunk | |
| 20:28 |
Put the library names back into the skill and one measurement comment
- doc/claude/TCLPDF.md, SKILL.md - the warning against writing a tclpdf call from memory of jsPDF, ReportLab, FPDF or pdf4tcl names them again, as intended: with the names the warning is sharper than without. The previous check-in had taken them out under the naming rule, and had cut the second half of the sentence in SKILL.md with them; both are restored to their earlier wording | |
| 20:21 |
Norm-review round seven: twenty-nine findings no validator sees, all built
- Graphics - overprint never writes /OP without a word on the fill side, a pattern belongs to the stream that carries it (canvas id), an integer beyond 2^31 is written as a real, a shading angle under -matrix is mapped once, an open arc under a fill in force is refused, save without restore and a q depth past 28 are refused at the stream end, a name past 127 bytes at the call, /Rotate is normalised, an ICC v4 profile binds PDF 1.7, Exif orientation is read into image info and not applied, and the one PDF number bound lives in pdfObj fits behind option number, option point and page distance | |
| 14:01 |
Source In as a clip path, and the winding that decides it
- colorFontRegion.tcl - new: the arithmetic behind a clip standing in for a mask - outlines flattened, the winding number asked at the faces of an outline's own arrangement rather than at its vertices, a contour turned to run the other way, and one shape tested for lying inside a union of others | |
| 12:27 |
Soft masks out of Type 3 glyphs where a plainer construction exists
- colorFontBand.tcl - new: a gradient with varying stop alphas is drawn as nested bands of constant alpha instead of a luminosity soft mask - level sets, each painting the same shading over a narrower clip with the alpha increment as ca, so that a band edge is an increment over painted ground and not a seam. Strips across a linear axis, even-odd rings for a nested radial, the wedges of the sweep. Two readers anchor the matrix of a soft mask set inside a Type 3 glyph stream to the page rather than the glyph and lose the masked shape; a clip and a constant alpha are misplaced by no reader. The technote of 2026-08-26 records the finding | |
| 10:07 |
Feature wiring behind the context machine, and emoji sequences
- forms.tcl - the closing stage runs in two hb-order stages, rlig first and then liga with clig under the resolved script, proved with a patched face whose lookup numbering would have caught a shared stage. The DejaVu lam-alef gap is closed; Arabic still matches hb-shape word for word, and -ligatures 0 keeps rlig, since shaping is not typography | |
| 05:25 |
Contextual substitution and COLR version 1
- gsubContext.tcl - new: contextual and chaining substitution, GSUB types 5 and 6 in all six formats plus the extension wrapper, read and matched but never applied here. gsubApply.tcl rebuilt onto one application walk whose nested lookups run through the same machine, with the HarfBuzz shift arithmetic for records that grow or shrink the run. With this the last Arabic refusal falls: rlig over chaining lookups is applied, and the shaped output of every Arabic face in the tree now matches hb-shape exactly, Nastaliq included | |
|
2026-08-25
| ||
| 23:00 |
A public arc command, and a Tk canvas drawn as vectors
- shape.tcl, geometry.tcl, svgPath.tcl, document.tcl - doc arc with -start, -extent and the styles arc, pieslice and chord, angles counter-clockwise from three o'clock as the page shows them. The Bezier approximation moves out of svgPath into geometry as arcSegments and both callers share it; svgPath writes the same bytes as before. Modules to 1.7, 1.4, 1.2 and 1.14 | |
| 20:24 |
Every refusal carries an error code, and two examples at the front
- forty-eight modules - the five hundred and eleven refusals that carried no -errorcode have one. With them, every refusal this package makes carries one. Fifty-four topics; where a topic has classes the third word is one, and it says what the caller has to do about it: ARGUMENT a wrong value, STATE a wrong order, NAME or ALIAS something that does not exist, FOREIGN a file this package did not write, DAMAGED a broken one, ROOM too little reserved space | |
| 17:48 |
Overprint, and the three examples that came out of it
- graphics.tcl, shape.tcl - overprint as a graphics state: doc overprint -fill -stroke -mode writes OP, op and OPM, and every shape takes -overprint for both sides inside its own q and Q. The version asked for is the one the call writes, a call naming none of the three is refused, and the shapes keep their own bracket so an overprint cannot leak into the rest of the page. Modules to 1.6 and 1.5 | |
| 14:21 |
Norm review round 6, and the work it turned up
- annot.tcl, field.tcl, import.tcl, font.tcl, writer.tcl, update.tcl - refusals that stood after an object number was reserved now stand before it, and what cannot be moved gives the number back through the new writer and update release, so an error the caller catches leaves the document writable | |
| 05:16 |
Eight reopened gaps closed: error codes, interpolate under PDF/A, fitting, anchors, emergency hyphen, function pool, geometry annotations, vertical breaking
- sfnt.tcl, type1.tcl, subset.tcl - forty-five refusals given an error code in seven classes, so a script can tell a wrong format from a broken file, an unsupported variant from a missing table, and a face that cannot be subsetted from any of them. Two new test files with them: these were the two largest private modules and neither had one | |
|
2026-08-24
| ||
| 20:55 |
Nine gaps closed: shadings, annotations, DeviceN, CCITT, inline images, vertical writing, bare CFF
- shading.tcl, shadingMesh.tcl - shading types 1 and 4 to 7: a colour that is a calculation over an area, and the four mesh types that carry their colours in the points. Type 1 needed a PostScript calculator function, since types 2 and 3 take one input by definition; the four mesh types share one packer, and the Decode range comes from the mesh rather than from the page | |
| 12:32 |
The break hyphen of a table, and two ways into a radio set
- textBlock.tcl, tableLayout.tcl, tableDraw.tcl, text.tcl - a broken table cell brackets its break hyphen the way a text -width paragraph does, so extracting a tagged table gives the word whole. The breaker already knew which line ends on an inserted hyphen and textLines threw it away; it now travels to the cell and on to text, which does the splitting inside one text object after the position of the whole line is fixed. The cell never cuts its own string | |
| 11:07 |
Hyphenation in table cells
- table.tcl, tableLayout.tcl - a cell with more than one line can be hyphenated: hyphenate joins the style keys beside direction, so it reaches a table, a head or body or foot, a column and a single cell, and the more specific one wins. Measuring passes it on to textLines; the drawing side needs nothing, since it sets lines the measure already broke - the same list, so the two cannot disagree | |
| 10:28 |
An errorcode for every option refusal, and the text field in a module of its own
- option.tcl - all seven refusals of the shared option parser threw with errorCode NONE, so a misspelt option name was the one error a trap could not catch. They now carry TCLPDF OPTION with six class words: UNKNOWN, PAIRS, DICT, KEY, REQUIRED and POINT, each followed by the facts and the calling context. No message wording changed | |
| 09:29 |
Interactive form fields, and reading one back
- field.tcl - the AcroForm core and the text field: the field tree, /AcroForm on the event bus, the document DA and DR, an appearance stream drawn for every widget, and a declaration that takes several widgets for one field. NeedAppearances is not written at all | |
|
2026-08-22
| ||
| 22:14 |
Correct what openssl can and cannot do under a PAdES claim
- sign.tcl - the refusal of a signing-time attribute said openssl and BouncyCastle offer no switch to leave it out and therefore cannot produce a PAdES signature. Measured with OpenSSL 3.6.3: "cms -sign -cades -no_signing_time" makes an object this package takes under /ETSI.CAdES.detached, and the same signer without the switch is refused. The message, the module comment, the manual and the skill reference now say what the switch is and that the LibreSSL shipped as /usr/bin/openssl on macOS has none | |
| 17:14 |
Version 1.2
- configure.ac, tclpdf.tcl - the package version is 1.2 | |
| 16:21 |
Norm review round five: what no validator sees
- importRead.tcl - a foreign file can no longer hang the reader or die in raw Tcl: an unclosed array bracket, a self-referential /Length, an object stream that contains itself, a page tree that names itself among its kids, a subsection count larger than the file, and an /Index whose numbers are not numbers each end in a named refusal now. Every refusal in the reader carries a TCLPDF IMPORT code | |
| 06:13 |
TIFF pictures are read, and a colour font reaches the page
- imageTiff.tcl, new - the structure of a TIFF: tag directories, the IFD chain, the strips with their offsets and lengths, the resolution, an ICC profile. What it will not read it refuses by name rather than half-reading: BigTIFF, tiled files, separate planes, an alpha channel, YCbCr outside a JPEG stream, and any depth, sample format or predictor PDF cannot be told about. The format is recognised by its magic bytes, never by the file name | |
|
2026-08-21
| ||
| 17:39 |
Colour font stage 1, the two readers - plus two defects in the checked-in state
- colr.tcl, new - COLR version 0 and CPAL are read: a base glyph answers its layers bottom-up, a palette entry answers colour and alpha, and the 0xFFFF sentinel answers the caller's text colour. Version 1, an empty table and a damaged one are each refused by name | |
| 17:04 |
01.14 carries its specimens on both pages, one language each
- examples/01.14-hyphenation.tcl - the specimen block is split by language: the German words close the first page, the English ones the second, both drawn by one shared procedure instead of a single block at the end of the document check-in: c01711095a user: alex tags: trunk | |
| 15:44 |
Combining marks are placed, and words are hyphenated by language
- markPos.tcl, new - GPOS mark attachment, lookup types 4, 5 and 6: a combining mark is put where its anchors say instead of at the pen. otLayout gains the anchor reader, since cursive attachment reads the same table. Script resolution is two-stage - the resolved script stays authoritative and a fallback lookup is offered only where the first stage left a mark alone, because a union lets one script's coverage overrule another's | |
| 12:33 |
Layers, an inventory of a foreign file, Lab colour, drawn glyphs, and a fallback chain
- layer.tcl, new - optional content (8.11): layer create declares a group, layer draw -script puts content into it between /OC ... BDC and EMC, and state, radio and configure make the default configuration. It hangs on the bus, so the core knows one line about it. In a tagged document the layer bracket and the structure marks nest rather than cross, which the test asserts by walking the ORDER of the brackets - the right count in the wrong order passes a count | |