concept G22LeftArrowScript { S description; // the script ("saved" text) S text; // text currently modified in an editor (or null) // Note that "" doesn't count as null. S editingText; @Override void _doneLoading2() { //print("_doneLoading " + this); cMigrateField(this, "code", "text"); } S myType() { ret dropPrefix("G22", shortClassName(this)); } toString { ret or2(description, myType() + " " + id); } S latestText() { ret or(editingText, text); } S stableText() { ret text; } File historyFile() { ret fileInConceptsDir("History/" + shortDynName(this) + id + ".history"); } void saveTextToHistory() { File historyFile = assertNotNull(+historyFile()); S text = this.text; appendToTextFile(historyFile, "\n===\n" + "Concept ID: " + id + "\n" + "Date: " + dateWithMSUTC() + "\n" + "Text (" + nLines(text) + ", " + nChars(text) + "):\n" + indentx(text) + "\n" + "\n" + "===" + "\n"); } }