You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现LGP-30模拟器中Friden Flexowriter退格重叠字符功能?

实现Friden Flexowriter退格重叠效果的优化方案

针对你模拟LGP-30和Friden Flexowriter的需求,以下几种方案可以简化字符重叠的实现,无需手动维护每个位置的字符数组:

一、CSS层面的精准调整

因为使用等宽字体,推荐用ch单位代替固定的em值,确保重叠位置的精准性:

/* 让字符左移一个等宽字符的宽度,实现重叠 */
.overlap {
  margin-left: -1ch;
}

1ch在等宽字体中恰好等于一个字符的宽度,无论字体大小如何调整,都能保证后续字符精准覆盖在前一个字符的位置上,比固定的-0.6em更通用。

二、TypeScript解析函数自动生成HTML

编写一个解析函数,将包含退格标记(如&bksp;或ASCII退格符\b)的输入文本自动转换成带重叠类的HTML,无需手动拼接:

function parseFlexowriterText(input: string): string {
  const charPositions: string[][] = [];
  let cursorPos = 0;

  // 分割输入为普通字符和退格标记
  const tokens = input.split(/(&bksp;|\b)/);
  
  for (const token of tokens) {
    // 处理退格:光标左移(不能小于0)
    if (token === '&bksp;' || token === '\b') {
      cursorPos = Math.max(0, cursorPos - 1);
      continue;
    }

    // 处理普通字符:添加到当前光标位置,然后光标右移
    for (const char of token) {
      if (!charPositions[cursorPos]) {
        charPositions[cursorPos] = [];
      }
      charPositions[cursorPos].push(char);
      cursorPos++;
    }
  }

  // 将每个位置的重叠字符转换为HTML
  return charPositions.map(chars => {
    if (chars.length === 0) return '';
    // 第一个字符正常显示,后续字符添加重叠类
    return chars[0] + chars.slice(1).map(c => `<span class="overlap">${c}</span>`).join('');
  }).join('');
}

使用示例:

输入:

O&bksp;/
text&bksp;&bksp;&bksp;&bksp;____

解析后生成的HTML:

O<span class="overlap">/</span>
t<span class="overlap">_</span>e<span class="overlap">_</span>x<span class="overlap">_</span>t<span class="overlap">_</span>

这样你只需要传入带退格标记的文本,函数会自动处理光标位置和重叠字符的HTML生成,完全替代手动维护字符数组的工作。

三、可选:简化输入标记

如果你觉得&bksp;太繁琐,可以直接使用ASCII退格符\b(字符编码\x08)作为输入标记,只需要修改解析函数中的分割规则即可,这样输入更贴近真实的打字机指令流。

四、Node.js工具集成

不需要额外的第三方库,上述TypeScript函数可以直接编译为JavaScript在Node.js环境中使用,或者封装成一个小模块,用于批量处理输入文本生成对应的HTML输出。如果需要处理更复杂的终端指令,可以基于此函数扩展,支持更多老式打字机的特殊指令。

内容的提问来源于stack exchange,提问作者Dorian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:57:37