Skip to content

Instantly share code, notes, and snippets.

@sma
Created December 19, 2023 22:35
Show Gist options
  • Save sma/f3a252af64ac0d230eaef235852c9ef3 to your computer and use it in GitHub Desktop.
Save sma/f3a252af64ac0d230eaef235852c9ef3 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: PaperTape(
codes: encode(example).toList(),
),
),
),
);
}
}
class PaperTape extends StatelessWidget {
const PaperTape({super.key, required this.codes});
final List<int> codes;
@override
Widget build(BuildContext context) {
return Container(
width: 144,
color: Colors.yellow.shade100,
child: DefaultTextStyle(
style: TextStyle(
color: Colors.grey.shade600,
fontFamily: 'Courier',
fontFamilyFallback: const ['Courier New', 'monospace'],
fontSize: 24,
),
child: ListView.builder(
padding: const EdgeInsets.all(24),
itemBuilder: (context, index) => Code(code: codes[index]),
itemCount: codes.length,
itemExtent: 24,
),
),
);
}
}
class Code extends StatelessWidget {
const Code({super.key, required this.code});
final int code;
@override
Widget build(BuildContext context) {
var data = '';
for (var i = 0; i < 5; i++) {
if (i == 2) data += '·';
data += (code & (1 << i)) == 0 ? ' ' : '•';
}
return Center(child: Text(data));
}
}
/// Converts [s] into a sequence of baudot-murray codes.
Iterable<int> encode(String s) sync* {
const ltr = '\vE\nA SIU\rDRJNFCKTZLWHYPQOBG\vMXV\v';
const fig = '\v3\n- "87\r\v4\b,!(5+)2\$6019?&\v./;\v';
var isLtr = true;
s = s.replaceAll('\v', '').replaceAll('\n', '\r\n').replaceAll("'", '"').toUpperCase();
for (var i = 0; i < s.length; i++) {
final j = (isLtr ? ltr : fig).indexOf(s[i]);
if (j != -1) {
yield j;
} else {
final k = (isLtr ? fig : ltr).indexOf(s[i]);
if (k != -1) {
yield (isLtr = !isLtr) ? 27 : 31; // (un)shift
yield k;
} else {
yield 0; // invalid
}
}
}
}
const example = '''
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: PaperTape(
codes: encode(example).toList(),
),
),
),
);
}
}
class PaperTape extends StatelessWidget {
const PaperTape({super.key, required this.codes});
final List<int> codes;
@override
Widget build(BuildContext context) {
return Container(
width: 144,
color: Colors.yellow.shade100,
child: DefaultTextStyle(
style: TextStyle(
color: Colors.grey.shade600,
fontFamily: 'Courier',
fontFamilyFallback: const ['Courier New', 'monospace'],
fontSize: 24,
),
child: ListView.builder(
padding: const EdgeInsets.all(24),
itemBuilder: (context, index) => Code(code: codes[index]),
itemCount: codes.length,
itemExtent: 24,
),
),
);
}
}
class Code extends StatelessWidget {
const Code({super.key, required this.code});
final int code;
@override
Widget build(BuildContext context) {
var data = '';
for (var i = 0; i < 5; i++) {
if (i == 2) data += '·';
data += (code & (1 << i)) == 0 ? ' ' : '•';
}
return Center(child: Text(data));
}
}
/// Converts [s] into a sequence of baudot-murray codes.
Iterable<int> encode(String s) sync* {
const ltr = '\vE\nA SIU\rDRJNFCKTZLWHYPQOBG\vMXV\v';
const fig = '\v3\n- "87\r\v4\b,!(5+)2\$6019?&\v./;\v';
var isLtr = true;
s = s.replaceAll('\v', '').replaceAll('\n', '\r\n').replaceAll("'", '"').toUpperCase();
for (var i = 0; i < s.length; i++) {
final j = (isLtr ? ltr : fig).indexOf(s[i]);
if (j != -1) {
yield j;
} else {
final k = (isLtr ? fig : ltr).indexOf(s[i]);
if (k != -1) {
yield (isLtr = !isLtr) ? 27 : 31; // (un)shift
yield k;
} else {
yield 0; // invalid
}
}
}
}
''';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment