Small and capable word processor that runs as a Desk Accessory (so you
don't need MultiFinder or Switcher to use it while you're running
another program). Includes font selection, find command, word count,
line-length limit, and can make sure your text has only valid
characters.
"Writer Douglas Adams once compared it to Microsoft Word; he preferred
miniWRITER because it had a word count feature" ? [Maitreya Design
Home Page][1]
Possibly the first Macintosh (or ever?) implementation of smart
quotation marks:
>
>
>
> ## Smart Quotes (" ' -> ? ? ? ?)
>
> ### Overview
>
> ?Smart Quotes? is the automatic replacement of the correct
> typographic quote character (? or ? and ? or ?) as you type (' and
> "). It does not refer to the curved quotes themselves.
>
> ### History
>
> In the early days of Macintosh, you used to have to remember some
> arcane keyboard combinations to enter curved quotes. One day, while
> driving from Santa Barbara to a user group in southern California, I
> realized that this could be done automatically.
>
> I first implemented smart quotes in the desk accessory miniWRITER,
> and then in [Acta][2]. I don?t know the exact date, but the earliest
> relevant change comment in miniWRITER is a bug fix in version 1.05,
> on 24 August 1986. So smart quotes are probably almost 20 years old.
>
> I originally offered the algorithm to anyone who asked, provided
> they sent me a copy of the application it appeared in. I know
> PageMaker used it, as did WriteNow. Other applications have reverse-
> engineered the process. Unfortunately, they seldom offer a way to
> enter a straight quote (or inch mark, ").
>
> ### Summary
>
> As the user types, the characters typed are automatically replaced,
> according to the context of the insertion point, before being
> inserted into the text. A quote is turned into its left equivalent
> if it is at the beginning of the text, or if it follows a space,
> tab, return, or left punctuation (?(,? ?[,? ?{,? or ?<?). a quote is
> also considered an opening quote if it follows an opening quote of
> the opposite type (as in: ??sorry? is all you have to say?? she
> asked).
>
> ### Cocoa Implementation
>
> Subclass NSTextView and override keyDown:.
>
>
> unichar gLeftApostrophe = 0x2018;
> unichar gRightApostrophe = 0x2019;
>
> unichar gLeftQuote = 0x201C;
> unichar gRightQuote = 0x201D;
>
> - (void) keyDown: (NSEvent*) anEvent
> {
> // Don't worry about having to allocate an NSString; [NSTextView
> keyDown:] will do so anyway,
> // and it's apparently lazily instantiated by NSEvent.
> NSString* unmodifiedKeys = [anEvent
> charactersIgnoringModifiers];
> NSString* newKeys;
>
> // Grab the first character, so we don't have to send messages
> to test for all the possibilities
> // NOTE: In some cases, we get more than one character at once,
> if someone is banging on
> // the keys or something. It might be better to iterate through
> unmodifiedKeys.
> unichar theChar = [unmodifiedKeys length] > 0 ?
> [unmodifiedKeys characterAtIndex: 0] : 0;
> unichar prevChar;
>
> if (theChar == '"' || theChar == '\'') {
> // Possible smart quote/apostrophe
> if (![[NSUserDefaults standardUserDefaults] boolForKey:
> @"smartQuotes"]) {
> [super keyDown: anEvent];
> return;
> }
> if ([anEvent modifierFlags] & NSControlKeyMask) {
> // Override smart quotes with ctrl key; we will need
> to strip the modifier
> newKeys = [NSString stringWithCharacters: &theChar
> length: 1];
> } else {
> NSCharacterSet* startSet = [NSCharacterSet
> whitespaceAndNewlineCharacterSet];
> NSRange selection = [self
> selectedRange];
> if (selection.location == 0)
> prevChar = 0;
> else
> prevChar = [[self string] characterAtIndex:
> selection.location - 1];
> if (prevChar == 0 ||
> // Beginning of text
> prevChar == '(' || prevChar == '[' || prevChar
> == '{' || // Left thingies
> prevChar == '<' || prevchar == 0x00AB ||
> // More left thingies
> prevChar == 0x3008 || prevChar == 0x300A ||
> // Even more left thingies (we could add more Unicode)
> (prevChar == gLeftQuote && theChar == '\'') ||
> // Nest apostrophe inside quote
> (prevChar == gLeftApostrophe && theChar ==
> '"') || // Alternate nesting
> [startSet characterIsMember: prevChar])
> // Beginning of word/line
> newKeys = [NSString stringWithCharacters:
> theChar == '"' ? &gLeftQuote : &gLeftApostrophe length: 1];
> else
> newKeys = [NSString stringWithCharacters:
> theChar == '"' ? &gRightQuote : &gRightApostrophe length: 1];
> }
> NSEvent *newEvent = [NSEvent keyEventWithType: [anEvent type]
> location: [anEvent locationInWindow]
> modifierFlags: 0
> timestamp:1
> windowNumber:[[NSApp mainWindow]
> windowNumber]
> context:[NSGraphicsContext
> currentContext]
> characters:newKeys
> charactersIgnoringModifiers:newKeys
> isARepeat:NO
> keyCode: 0];
> [super keyDown: newEvent];
> } else {
> [super keyDown: anEvent];
> }
> } // keyDown:
>
>
> Thanks to Justin Bur for pointing out a bug (fixed above): ?Many
> non-U.S. keyboards have floating accent keys, available without any
> modifiers, which generate a keyDown event with no characters.?
>
> * * *
>
> Copyright �2006. Last updated 15 Aug 06 [drd][3]
>
> [David Dunham Page][4]
? [Smart Quotes - poppyware.com][5]
Attested Missing Versions:
v1.42 included miniWRITER.doc as a comprehensive manual.
v1.34 (no details)
v1.3 (no details)
v.1.05 bug fix; added "Smart Quotes"
DL #1 miniWRITER version 1.72
DL #2: version 1.73
Compatibility
Architecture: 68k
Compatible Mac OS 8.1 (and should also still work on older systems)
[1]:
http://www.pensee.com/maitreya/#miniwriter
[2]:
http://a-sharp.com/acta/
[3]: mailto:
[email protected]
[4]:
http://www.poppyware.com/dunham/
[5]:
http://www.poppyware.com/dunham/smartQuotes.html