!7 sclass Entry { S fullLine, time, text, comments; } module SpeechLogTable > DynObjectTable { start { debug = true; dontPersist(); addCountToName(); itemToMap = func(Entry a) -> Map { humanizeKeys(objectToMapExcept(a, 'fullLine)) }; setData(map(func(S line) -> Entry { makeEntry(line) }, scanLog(speechRecognitionLog()))); onSpeechRecognized_raw(voidfunc(S line) { addAndScrollDown(makeEntry(line)) }); } afterVisualize { onComponentFirstShow(table, r scrollDown); } Entry makeEntry(S line) { ret nu(Entry, fullLine := line, text := speechRecognitionLog_extractUtterance(line), time := localDateWithMillisecondsIfReasonable(parseLeadingLong(line))); } L getList() { ret syncCloneList(data); } L getTexts() { ret syncCollect(data, 'text); } }