Category: TypeMetal

  • TypeMetal’s Unique Editing Engine

    One of TypeMetal’s most unique features is in large part invisible: a modern HTML editing engine unlike any other, that I’ve devoted over a year and a half to developing and refining. Appreciating the motivation and design philosophy behind TypeMetal’s engine will help you understand the challenges TypeMetal is uniquely positioned to solve, and get a feel for what it is and isn’t.

    I developed TypeMetal to be an app I’ve long wanted to have: a Mac-native writing tool that lives and breathes modern, streamlined, professional-grade HTML as its model. I wanted an easy way to dash off bits of top-quality HTML, without having to manually manage the mechanics of markup syntax and formatting. I also wanted an app that helped me to develop, and consistently apply, semantic CSS styling vocabularies, in the course of producing a large, stylistically cohesive body of work — such as TypeMetal’s User Guide, or the News posts on this site. It’s struck me as odd that writing HTML by hand, or writing shorthands other than HTML to get an HTML result, is still so common. Can’t we do better? I felt compelled to find out, and TypeMetal 1.0 is the first result.

    Needless to say, in the process of developing TypeMetal, I quickly found out why the app I’d wished for hadn’t already been written: There were a number of fundamental challenges to solve. In particular: Undoable editing of a tree-structured document model, such as HTML’s, is a whole level of complexity beyond working with a flat attributed-text model. Every operation — from applying styling (which, in HTML, means wrapping content in elements) to simple Find and Replace — is substantially more complicated than with simple, linear text. WebKit provides the field-tested HTML parsing, layout, and rendering that underpins TypeMetal, but TypeMetal’s editing functionality and UI are entirely its own. The challenges inherent in their development were many, but the rewards of persisting through tackling them have been great — for much of HTML’s utility and expressiveness lies in its inherently tree-structured document model. Sectioning of content for layout and styling depends on that model, and there is great potential, both in use and yet-to-be-fully-realized, for automated document processing to leverage it.

    One thing I haven’t done with TypeMetal is try to solve every possible use case for an HTML development tool. Solving problems well in software requires focus. Without it, you get lost in a swamp of intractable generality and likely don’t find your way out to a finished or comprehensible product. I didn’t want my efforts to end that way.

    TypeMetal’s focus is content editing: providing a helpful, productive, and rewarding way to write the text, interleaved with images and other media, that is a website’s entire reason for existing. That’s what TypeMetal really strives, above all else, to shine at.

    Within that focus, I’ve gone to great lengths to make TypeMetal as general as possible, all the way down to its foundations. TypeMetal will work with any HTML file or fragment you give it, and puts the expressive power of HTML’s entire element and attribute vocabulary at your fingertips. Block Mode’s exacting selection capabilities make some remarkably general structural editing feats possible, making it much easier to assemble trees of nested <section>s, <div>s, and other elements. You could leverage this capability to build or prototype a page template for a site, but that’s straying a bit outside the realm of what TypeMetal is really designed to be best at. Similarly, TypeMetal doesn’t attempt to be a visual layout editor or CSS editor. Those problem domains have been well explored by other apps, and have more to do with establishing or changing the look of a site than producing the content that the site will host. TypeMetal’s entire focus is crafting exacting HTML content that meets your highest standards, and is suitable for use either as standalone pages, or with whatever templating, styling, and content management system you use. (As I’ve mentioned before, I write all the News posts for coherencelabs.com using TypeMetal, then incorporate them into my WordPress workflow as described here.)

    The first version of TypeMetal has gone a very long way toward achieving my goals. I have exciting things in store for the future, but have also been greatly enjoying the chance to finally use the app that TypeMetal already is. I hope many others will find it as handy and helpful as I do. Your support means everything to TypeMetal’s future (Thank you!), and I’m committed to continuing to refine its user experience based on users’ feedback.

    Whether you’re using TypeMetal already, or weighing the possible purchase and looking to learn more about it, please accept this invitation to drop by the TypeMetal Support Forum, where I reply to questions daily. It’s an excellent place to post any questions you may have about what TypeMetal is and isn’t, drop suggestions for ways it could be extended, and get all manner of other help.

    I also encourage you to subscribe to the RSS feed for News posts like this one. And if you use Twitter, please feel invited to message us @CoherenceLabs!

    Happy content editing!

  • TypeMetal 1.0.4

    …is now live on the Mac App Store.

    This update makes the path bar context menu work again, fixing the regression that appeared in version 1.0.3. (Sorry for the inconvenience that caused — we’ll be more careful next time!)

    1.0.4 also fixes a bug wherein using the arrow keys inside a <pre> element would collapse whitespace, just as TypeMetal does in ordinary text. Condensing whitespace makes sense in most parts of an HTML document, but it’s not something you want in a preformatted text block, where whitespace and newlines are significant. With the fix in 1.0.4, you now can safely use the arrow keys inside a <pre> element, without disturbing the formatting of its content.

    <pre> elements are especially useful for featuring clippings of literal markup or program source code in your writing, by the way. A common construct for this is a <pre> wrapped around a <code>, where the <pre> element preserves spaces and line breaks, and the <code> element marks the content as being some kind of program source code, typically prompting appropriate styling such as use of a monospaced font.

    You can assemble a <pre><code> construct easily by inserting a <pre> element (Control+/ p r [return]), then inserting a <code> element (Control+/ c o [return]). This leaves you inside the <code> element ready to type. Note that when you’re all done typing the content of this code block, and you want to type what follows the <pre><code> block, you can simply hit the [tab] key to pop out of both the <code> and the enclosing <pre>.

    Creating this kind of construct will give you something like this in your HTML:

    <pre><code>for (id thing in collection) {
        [thing doYourThing];
    }</pre></code>

    which, with CSS styling applied, might be rendered something like this:

    for (id thing in collection) {
        [thing doYourThing];
    }

    If this is a construct you use a lot, you might want to create a snippet to make it even quicker to assemble. The snippet body would look like this:

    <pre><code>{content}</code></pre>

    With that snippet added to my HTML file’s associated snippet set, I’m able to insert a <pre><code> construct by typing Control+/ p r e c [return].

    If you ever want to paste some HTML markup for people to read as markup, note that you’ll need to use TypeMetal’s “Paste as Plain Text” command (Command+Shift+Option+V). Ordinary “Paste” (Command+V) would interpret the HTML markup, putting the described elements in your document, instead of the HTML source code description of them. By pasting “as Plain Text”, you get the exact text that’s on the pasteboard, without any interpretation of HTML element tags it might contain. (Relevant User Guide page: Paste)

    I hope you’ll enjoy this update! Stay tuned for more improvements to come!