More of a TODO tree than a list. - Indentation for sub-tasks or notes. - An arrow "→" on the left indicates what I'm currently working on. - Completed tasks get a check mark and are eventually gc'd. 3box: v0.3: "notepad mode" implementation saving when saving, don't reset the textarea (probably this happens via the server cache update) integrate with revision history HistoryBar make the height constant (calculated when the display is initialized, based on revision frequency over total time) add a hover delay (but once in preview mode, this goes away) color coding in change bars drag and drop to diff two revisions (?) click on commit when in preview mode to "revert" while in preview mode, add something to "revert" individual changes add 'asof' permalinks in preview mode needs 'revert' and 'cancel' buttons to get out of preview mode (no, hovering can be used for this) CanvasText SVGText DOMText Tagger PathCrumbs HideMenu REPL demo/tutorial integration with revstore ✓ a way to create an editor for a file (can use a ?3box or ?edit query parameter) ... features should probably have standard summaries and a standard way to start a mini tutorial for that feature add a demo with real-time syntax highlighting of ECMAScript in an HTML output make a way to display HTML output needs a grep (1 day) needs realtime logging output (like a log() function, i.e. "printf-style debugging" support) add a pastebin verb on output (and other) displays for easy sharing without sharing the entire workspace current buffer edit stream representation write 'diff' feedback if needed, another feedback can maintain a history of these diffs write a diff algorithm, or several write a faster algorithm by sacrificing the optimality guarantee can we combine these in an algorithm that starts with the easiest answers and stops at a configurable 'good enough' point? at the least, write a fallback that returns deletion of A and insertion of B rather than allocating a too-huge table (2h) write 'patch' for completeness, but don't register it (2h) http://demo.qooxdoo.org/current/playground/#Window misc bugfixes: HTML output and error output don't play well together when a server update finishes, a syntax or pure error message is no longer displayed when the _iset cfunc is changed but the JavaScript environment is not, sometimes a previous Worker will continue running handle file and line numbers better (2d) when generating the JavaScript context, record a line-number → file map when rendering error messages, use this to show the original file and line know what function you are in (4h) current_function state value and maintainer feedback, inputs are AST and current character position add a 'hold' feedback or button which holds the main output fixed until it is released add the ability to compare the output with previous output or with last-tagged-correct output, showing a diff new tutorial (2d) always updated as features are added genuinely interactive, tells you only what you need to know to make it to the next step (i.e. not written like documentation) get some early feedback bug: when files are re-ordered in the conf file, the re-ordering doesn't take effect in the generated JavaScript environment we have a get verb now in the shell, but this kind of thing should be integrated into 3box directly (i.e. in the blog build recipe) canvas support as a feedback output type (estimated 3 days) add pure feedback selection based on the current function add navigation by function this is desperately needed example: in the PEG project, most of my time getting back into it is just *finding* where functions are defined in the myriad of files that project contains the conf file itself should have its own feedback for syntax errors, etc (estimated 1 day) the value dictionary file name should be chosen in the same way the conf file name is chosen, or it should be a conf item itself generalize the dictionary value anti-UI to a generic anti-UI by which the entire state space may be directly manipulated changes take effect immediately as by putState() of the changed state values a 'begin' button begins an atomic transaction and turns into a 'commit' button which putState()'s the collected changes only terminate a worker if we are waiting for it, otherwise just create a new environment (if necessary) in the same worker write input set selection feedback (probably replacing or extending current main output selection) input is a current set of function names and input sets what the user selects is a (function, input set) pair revision control means diffs, history UI, branching, and merging history view with diffs ala Wikipedia (1 day) we need the ability to tag a particular version of a function, and then refer to that version in isets, outputs, deployments, tests, etc (the idea of having an iset with an optional timestamp member is really powerful) the _iset feature desperately needs output modes like pp(), HTML, etc; this is the main reason why I still use testing functions _iset needs to show the inputs to the function, not only the output if extensions like TAL can add conf file directives, the conf file parser needs to be split up, perhaps into line recognizers and parsers, or into a more general record format show statistics not only for the current buffer but for the whole project (possibly behind a click) state space should be a tree, not flat state space might want to have flags or tags as a kind of cross-cutting classification system infer type annotations, not just by inference from other type annotations, but by watching the arguments given in testing runs these potential type annotations can then be presented to the user and, if confirmed, become full type annotations write a cron job to analyze httpd logs and prune unused 3boxen feedbacks should be able to unregister themselves (e.g. one which only runs on init) add a 'notification' state value and feedback the most recent notification is displayed at first and then fades out there might be a button to view older notifications there is a simple putState({notification:...}) interface used by other feedbacks if the notification feedback wants to support showing the history, then it maintains this itself change the rest of the code to use this for e.g. server updates, error messages, etc. display the files that remain to be loaded, when first loading the workspace (gives the user something to watch) should display as a list e.g. "[foo.js, bar.html, ...]" of files not yet loaded now that we have a diff stream representation, store this, rather than every revision, on the server better handling of very large text outputs (e.g. paged output) (currently just truncate at N when output is > 2N) (4 hours) make it possible to import 'packages' e.g. popular libraries, 3box workspaces, etc, with a click or two, using symlinks. (estimated 1 day) there's now a terminology collision between pure feedbacks and the more general feedbacks fixed by renaming the former to 'main outputs', this change still needs to be propagated everywhere reduce some of the redundancy in the feedback registrations and API (est. 3 hours) as an aid to debugging and robustness, the feedback plumbing can allow registration and testing of state invariants (est. 2 days) any putState() call which violates an invariant will throw write a scoped eval that creates an environment and then allows running arbitrary code in it (est. 6 hours) see doc/scope_sandbox the putState() stuff works, but it is insufficiently composable a function should be able to put some state, call further functions which may also put state, and then commit text editor (2 weeks) as a test case for incremental parsing and syntax highlighting, support JSON before jumping into full ES5 support XML validation as a 3box output check a better widget for selecting files and feedbacks (2 days) use JIT now that 1.0 is out what we really want sometimes is not just one feedback but a closely related set; a tree, not a list display content-type per file in the file list add multiple simultaneous feedbacks try using tree explorer keep track of scroll position in each file and recently edited positions one keystroke takes you back; the last N always visible; I don't want to have to maintain this stack in my head create a 3box demo screencast (2 days) application/x-javascript outputs should not succeed if the code does not parse PanPG: ✓ add a JavaScript AST ✓ initial implementation ✓ add comments ✓ testing ✓ add a demo → http://boshi.inimino.org/3box/PanPG/corpus/javascript/test v0.0.8 build system work rvs_get needs to be able to get all dependencies out of the revstore (currently it can't go back up to parent directories) ideally this will be solved by adding hard links to the revstore, then rvs_get can stay in one directory, dependencies can be linked in. (blocking on revstore hard links) → finish js_pp using js_ast simple micro-profile tool state export serialize restore compare extract tree update reset (for speed: dfa revivification, etc) js_pp and js_ast are really two projects, both separate from PanPG; should be moved out (...actually, the codegen is probably eventually going to depend on both) add ASCII alternative syntax get rid of the "parse already failed" message, at least from the single string special case. the demos should probably be moved out of build/ add a supplementary character codegen test add a compile API starting from a PEG parse tree instead of a string (e.g. for the demo, so that parsing can be a separate step) fuzz test: random grammar, random inputs, assertions on, and `explain` trace tests fuzz test: elide random rules, reparse, assert remaining nodes are in the same places (i.e. anonymous nodes are correctly generated) fix the "ERROR: empty stack" bug in `explain` add a build procedure that isn't unspeakably arcane add a way to check out any "PanPG: " tag add a test runner "c=(c&0x3FF)<<10 | s.charCodeAt(pos+1)&0x3FF | 0x10000" looks wrong (in the non-dfa code) add end-to-end supplementary characters tests add something like PEG_info or PEG_summary again add a benchmarking page with old and new revisions reduce/merge re.js with the other expression representation in the v6 codegen there are bugs when the function name happens to be the same as one of the internal variables, e.g. when testing with a start rule 'S', then the parser won't work (because S is the internal state value, and the single-call-special-case will call S as a function) (arguments.callee could be used instead) npm requires `require("PanPG/PanPG_util")` instead of `require("PanPG_util")`, this needs to be fixed somehow v0.1.0 Streaming add some automatic error reporting ("parse failed at X in rule Y, expected Z") [deferred till more streaming work is done] opportunistic DFA construction ✓ design ✓ initial implementation (extremely limited) ✓ dfa construction ✓ dfa codegen expand to simple cases (e.g. strings) commit point analysis show DFA coverage of a grammar using color or markup ✓ add an extension of the ES5 grammar to support "Web-compatible JavaScript" stream output chunks need to be self-contained as are success results and errors, with at least {tree_segment,input_chunk,names} implement HTML syntax highlighting for ECMAScript look into scope leak in character set equivalence classes use Expression and Token instead of Expr and Tok in the ES5 grammar (or go the other way like JsonML does) bug under Opera: as seen at http://boshi.inimino.org/3box/PEG/build/ES5.html Expr doesn't parse correctly bug: interpret C-style escapes in strLits bug: g() isn't fully implemented, supplemental characters in grammars won't be supported atm http://es-lab.googlecode.com/svn/trunk/site/esparser/index.html http://tinlizzie.org/ometa/ http://www.brics.dk/TAJS/ extensions as necessary for parsing Markdown (lpeg feature parity) backtick-quoting ∀n. "`"{n} ( !("`"{n}) [^] )* "`"{n} embedded HTML (ugh) matching end with corresponding start tags note that some end tags can be implied by specific other start tags, e.g. "

" after "

" implies "

" the lpeg solution of embedded code is a hack http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html something for sets of related grammars, e.g. ES5 and JS1.8, where the same parser can be used for both with a runtime flag the compiler takes a grammar and a set of patches, and produces a parser which takes a set of flags to turn each patch on or off micro-profiler: blocking on a JavaScript AST and a pretty-printer assign an id to each statement or expression in a JavaScript program generate an annotated program that increments a hit counter when each statement is reached generate a program that stores a sampling of the values of variables when expressions are evaluated run the expressions with representative values and measure the time elapsed from all of this, generate a profile, by statement, of the expensive code paths ECMAScript PEG matches ES5, but some of my code is JavaScript 1.7 or 1.8. write a translator from JS1.8 to ES5, handling destructuring assignment, etc (1 week) write a diff from the ES5 grammar to the current Mozilla JavaScript grammar (1 day) it's possible to automatically elide parse tree child nodes which matched the same extent as the parent, at least in showTree() detect left recursion and signal an error regex serialization could use a database of character frequencies for optimization in e.g. ECMAScript, parse first as ASCII subset, reparse as full Unicode only on failure !() and &() don't need to require the parens, should be just ! and & and paren grouping is already in the grammar. fixed in the grammar but requires a rebuild of the PEG parser which will probably require some TAL updates this should also fix the issue with leading and trailing newlines review the narcissus (and maybe mozilla C++) JavaScript parsers and translate the code into PEG form (2 days) compare the PEG-generated code with the hand-written code for performance compare the PEG with the ECMAScript standard and look for differences re simplifications a(?!b)|c(?!b) → (a|c)(?!b), especially where b is expensive or long replace a (seq (neg cset) cset) with a single cset writing the universal cset as [^] should be valid (currently this breaks because codegen assumes a cset negation has a descendant) (2 hrs) this can be fixed by changing the NegCharSet and CharSetUnion productions so that a union can contain zero CodePointExprs in the ECMAScript PEG, SourceCharacter and EOF and some other places can be changed once this is done fixed but blocking on PEG parser rebuild as above in 3box.js, parse3boxConf() is a model of simplicity. make it possible to use PEG this easily. some kind of metalanguage would be very nice to support repetitive constructs like HTML elements, which vary only by tag name sessions: create a home page and/or blog post add serialization support add authn shell: ✓ add a history verb (in a revstore verb set) add `cat` or similar verb to view file contents links that work in directory listings in POSIX you can use redirection, this needs a similar capacity ✓ start something under shell/doc [ http://boshi.inimino.org/3box/shell/doc/notes-20100813.ed ] revstore: see revstore/TODO cset: separate from PanPG into own project ['import'] crap -- replace with CommonJS/browser hybrid module - see https://bugs.webkit.org/show_bug.cgi?id=32722 difference and union can be combined into a more general algorithm support the Cn general category, probably as difference(universe, union(all other categories)) support the main general categories L M N P S Z C (1 hr) support UTS #18 level 1 TAL: http://www.txl.ca/nabouttxl.html TAL visualizations: a real ASCII-art tree view, , tree explorer-style interaction, JIT (3 days) an API analogous to regexes with match()/replace(), but using a minimalist PEG, and short TAL programs (e.g. in lgrep). implement structural negation (1 day) support comments (1 hr) better error messages (visualizations will help) signal an error when more than one rule defines the same attribute on the same node in a given tree support selection by assigned attribute with arbitrary ordering and cycle detection lgrep: build features needed for ES5 project build an import/mirror tool like wget -m, it looks at an HTTP URI, spiders it according to some particular rules, and returns a list of URIs the user can the review the list in aggregate for each of these, it then does a GET and a corresponding PUT integrate PEG parser (add a parse verb) integrate with 3box use DRP create a type system for 3box functions and lgrep DRP: composability / sub-spaces everything uses callbacks, add a wrapper for immediate functions no 'path' arguments nhttpd: support redirects resolve installation issues (use npm) move the staticFile.js sendfile stuff into the fileIO module cache function promises in functionFromURI so that the same file isn't eval'd repeatedly add the ability to capture an HTTP request and then 'replay' it, or test a request handler against it in a 3box feedback add a 'Web app development mode' where every request is captured in this way, and request histories can be replayed and tested in 3box documentation request handler and dispatch generator API we don't have dispatching on regexes, instead we escape into a generator (which is more powerful), which then generates a branch that can persist, be relocated to a different host, etc. however, there's no reason we can't have a convenience function of type Regex → (RegexMatch → RequestHandler) → DispatchGenerator JSON format used in dispatch GET and POST requests probably could be simplified too the documentation is in the code, and it should stay this way, but an HTML view of code with comments would be nice (with a TOC, show/hide code, etc) constructors for branches and handlers would be nice fileIO: update to latest node (with added fs methods) js_pp: ed: add a link to the containing directory (useful now that we have directory listings) ed isn't fully contained anymore which means that even though the ed dispatch generator is installed, if the JS and CSS dependencies aren't in the revision store, it's unusable; so an out-of-the-box nhttpd + revstore + ed installation is unusable. add a textbox with the current content-type displayed, when edited, this results in a metadata update POST to the server edGenerator.js doesn't belong in revstore/, they are separate projects