1
0
Fork 0

Compare commits

...

2 commits

Author SHA1 Message Date
saji 26ddcbfa89 wip: add markdown-it-figcaption
Some checks failed
Build Blog / Build (push) Failing after 5m1s
2025-05-02 21:31:28 -05:00
saji bcf0092dd8 added initial wyse 60 repair 2025-05-02 21:31:07 -05:00
2 changed files with 117 additions and 9 deletions

View file

@ -100,19 +100,44 @@ Uh, guys?
Image of more cold joints on a different chip. Image of more cold joints on a different chip.
It can't possibly be this, right? U17 and U15 are part of character storage, and It can't possibly be this, right? U17 and U15 are part of character storage,
I did see the font RAM output non-zero, meaning it had to have rendered and I did see the font RAM output non-zero, meaning it had to have rendered
something! I quickly cleaned up the joints and powered it on. I couldn't see it something! I quickly cleaned up the joints and powered it on. I couldn't see it
at first, but it worked. This highlights the two styles of troubleshooting: at first, but it worked.
# Takeaway
This highlights the two styles of troubleshooting:
1. Hypothesis -> Solution 1. Hypothesis -> Solution
2. Hypothesis -> Validate -> Solution 2. Hypothesis -> Validate -> Solution
It feels pretty good to zero-shot a repair or fix, but it also can leave you with blind spots. It feels pretty good to zero-shot a repair or fix, but it also can leave you
In my case, I didn't want to try to probe the board while hot, but later it became necessary unless with blind spots. In my case, I didn't want to try to probe the board while
I just started replacing chips indiscriminately. Once I started probing, I wanted to find something that hot, but later it became necessary unless I just started replacing chips
seemed "off" before going further. I would have noticed the character RAM eventually, if I finished my indiscriminately. Once I started probing, I wanted to find something that
testing of the Attribute RAM. In this case it was easy to spot visually and so I didn't need to test it seemed "off" before going further. I would have noticed the character RAM
any further. eventually, if I finished my testing of the Attribute RAM. In this case it was
easy to spot visually and so I didn't need to test it any further.
While I was working on this, my friend was using his unit to develop a USB
keyboard adapter. His unit was slightly more yellow and has some centering
issues, but otherwise is fully functional. By the time I had mine figured out,
the firmware was mostly complete, so it was a quick flash away. I might blog
about it some time, but the protocol is really simple.
I'm typing this last portion in Vim on the terminal, using the VT100 mode.
( image of editing this post with the terminal )
# Next
It's not perfect. I don't know much about ye olde terminal behaviors
and finding replacements for modern tools that weren't built
with a VT100 compatible in mind is a task of itself. The flow control seems
to be DTR-based, which Linux doesn't support natively. We might be able
to hack around that with a shim but that's a problem for later. It works
fine at 9600 baud using software flow control.
To the folks who rave about the terminals of yore, I get it now.

83
markdown-it-figcaption.js Normal file
View file

@ -0,0 +1,83 @@
export default function figcaptionPlugin(md) {
// Rule to identify images followed by italicized text for figcaption
function figcaptionRule(state) {
const tokens = state.tokens;
let figcaptionStartIndex = -1;
for (let i = 0; i < tokens.length; i++) {
// Check for paragraph containing only an image
if (
tokens[i].type === 'paragraph_open' &&
i + 2 < tokens.length &&
tokens[i + 1].type === 'inline' &&
tokens[i + 1].children &&
tokens[i + 1].children.length === 1 &&
tokens[i + 1].children[0].type === 'image' &&
tokens[i + 2].type === 'paragraph_close'
) {
// Check if the next token is a paragraph starting with emphasis
if (
i + 5 < tokens.length &&
tokens[i + 3].type === 'paragraph_open' &&
tokens[i + 4].type === 'inline' &&
tokens[i + 4].children &&
tokens[i + 4].children.length > 0 &&
tokens[i + 4].children[0].type === 'em_open' &&
tokens[i + 5].type === 'paragraph_close'
) {
figcaptionStartIndex = i + 3; // Start index of the caption paragraph
// --- Replace tokens ---
// 1. Change paragraph_open to figure_open
const figureOpen = new state.Token('figure_open', 'figure', 1);
tokens[i] = figureOpen; // Replace paragraph_open
// 2. Keep the inline token with the image as is (tokens[i+1])
// 3. Change paragraph_close to figcaption_open
const figcaptionOpen = new state.Token('figcaption_open', 'figcaption', 1);
tokens[i + 2] = figcaptionOpen; // Replace paragraph_close
// 4. Remove the caption's paragraph_open
tokens.splice(figcaptionStartIndex, 1); // Remove paragraph_open at i+3
// 5. Modify the caption's inline content: remove outer <em> tags
const captionInlineToken = tokens[figcaptionStartIndex]; // Now at index i+3 after splice
if (
captionInlineToken.children[0].type === 'em_open' &&
captionInlineToken.children[captionInlineToken.children.length - 1].type === 'em_close'
) {
captionInlineToken.children.shift(); // Remove em_open
captionInlineToken.children.pop(); // Remove em_close
}
// Adjust level for caption content
captionInlineToken.level += 1;
captionInlineToken.children.forEach(child => { child.level += 1; });
// 6. Change the caption's paragraph_close to figcaption_close
const figcaptionClose = new state.Token('figcaption_close', 'figcaption', -1);
tokens[figcaptionStartIndex + 1] = figcaptionClose; // Replace paragraph_close (now at i+4)
// 7. Add figure_close after figcaption_close
const figureClose = new state.Token('figure_close', 'figure', -1);
tokens.splice(figcaptionStartIndex + 2, 0, figureClose); // Insert figure_close (at i+5)
// Adjust token index to skip the newly inserted/modified tokens
i += 6; // Move past the figure structure
}
}
}
}
md.core.ruler.after('inline', 'figcaption', figcaptionRule);
// Add renderer rules if they don't exist
md.renderer.rules.figure_open = md.renderer.rules.figure_open || function () { return '<figure>\n'; };
md.renderer.rules.figure_close = md.renderer.rules.figure_close || function () { return '</figure>\n'; };
md.renderer.rules.figcaption_open = md.renderer.rules.figcaption_open || function () { return '<figcaption>'; };
md.renderer.rules.figcaption_close = md.renderer.rules.figcaption_close || function () { return '</figcaption>\n'; };
}