630 karma · joined November 1, 2014
The code has three parts: Markdown to HTML text, HTML DOM to Markdown, and the editor. The total size is about 30KB uncompressed (27KB JS + 3KB CSS). It didn't use any icon font or images.
My goal is to make Markdown and HTML editors working together. I want to support Markdown because it's very productive for long-form article writing.
The default mode is WYSIWYG since Markdown syntax frustrates people who don't know Markdown well.
Thanks for mentioning Typora! It's an interesting implementation. I've thought about that approach (in-place real-time preview as you type Markdown text) before, but inside a browser, it's too cumbersome to fight against the inconsistent contenteditable behavior.
In terms of a markup language in pure text, I think Markdown is your best bet. Folks in CommonMark.org tries to "standardize" Markdown. Our implementation in Twincl.com follows that standard as much as we can.
It seems Markdown editing is a red flag for broader adoption. I've thought about a dual approach before: allow casual users to edit with GUI, and provide the Markdown editing capability for pro users.
I do not have a fool-proof way to prevent plugin copying. If somehow it's widely copied, it's not a bad thing (to most people), too.
Thanks for your comment. We'll take that into account.
Correct. When comparing a static programming language to a dynamic one such as Go vs Python, this is a critical difference. It impacts system stability (production outage rate) and code maintainability a lot, the two characteristics a long-running product desperately needs.
But Go is not comparable to C. Go is garbage-collected, so unlike Rust, it is not a true system programming language (i.e. not low-level enough). On the other hand, it is not high-level enough. It lacks many advanced language constructs, and its type system is rather limited. Simplicity is a big merit of Go, but it's too limited IMO.
Go solves many software development problems for large engineering teams, so I think its ecosystem will keep growing for a while.
I’ve updated the code and article with HashMap. It runs about 6~7% faster than BTreeMap.
The issue is &'a is so common in Rust code. We simply call it lifetime 'a, which is misleading. It is not any object’s or pointer’s lifetime, but a set of lifetime requirements (or lifetime bound in your term) that every borrower imposes on the borrowed resources. It is the B I mentioned in the last section of my blog post:
When we talk about borrow, there are three different kinds of “lifetime” involved:
A: the lifetime of the resource owner (or the owned/borrowed resource)
B: the “lifetime” of the whole borrow, i.e. from the first borrow to the last return
C: the lifetime of an individual borrower or borrowed pointer
The required condition is A >= B, where B = C1 U C2 U ... U Cn.