Markup for note taking

Overview

Subtext: markup for note-taking

Subtext is a text-based, block-oriented hypertext format. It is designed with note-taking in mind. It has a simple, people-friendly syntax with a passing resemblance to Markdown.

See the Speculative Specification.

We're experimenting with Subtext as part of Subconscious, a new tool for thought.

Warning to implementors: Subtext is currently experimental status. We'll be spending some time living with Subtext and building experimental tools on top of it before committing to anything. The language design is just a hypothesis! It might undergo radical breaking changes! This is work in progress, and shared in the spirit of working with the garage door open.

A bit of Subtext

Here’s an example:

# Heading

Plain text

- List item
- List item

> Quoted text

& example.csv
& https://example.com

Subtext is line-oriented. Each line in the file is treated as a discrete block of content. The type of a line is determined by a sigil character, like #, &, >, at the front of the line. If a line doesn’t have a sigil character, it is treated as plain text. This makes Subtext very easy to parse, and very easy to write. It is currently impossible to write broken Subtext, which is nice!

Subtext is for notes

Today the book is already… an outdated mediation between two different filing systems. For everything that matters is to be found in the card box of the researcher who wrote it, and the scholar studying it assimilates it into his own card index. (Walter Benjamin)

HTML comes in web pages. The analogy for an HTML document is quite literally a page. The image that springs to mind is of an 8.5x11” sheet, carefully typeset, with multiple fonts, headings, complex formatting, perhaps laid out across many columns. HTML is a publication format, designed to produce complete, indivisible artifacts, called pages.

The right mental analogy for Subtext is not the page. It is the the index card.

Subtext deliberately avoids the kind of complex presentation features offered by publishing formats like HTML, PDF, and LaTex. It has no opinions about fonts, colors, sizes.

Like a stack of index cards, there are many ways to use Subtext, beyond simple linear layout. It isn’t just for narrative. It’s hypertext montage.

Subtext is block-oriented

Subtext represents block-oriented documents as line-oriented markup.

A block-oriented document is made up of a list of blocks of different types (or occasionally, a tree of blocks). Each block type may be displayed differently. For example, a quote block may render as quote-formatted text, while an image block may render an image in-place.

Some of the earliest hypertext proposals were block-oriented, including Ted Nelson's ELF (Nelson, 1965). Block-oriented documents have also independently evolved within many contemporary tools-for-thought, including Notion, Roam, and Ward Cunningham's Federated Wiki.

Why does this pattern keep re-emerging? One reason might be that block-oriented editing is an easy way to express rich formatting. But more importantly…

Blocks are composable

Blocks are thought legos. A block-oriented document is composable (and decomposable). You can break it apart into component blocks, filter it down to blocks of a particular type, merge documents, pluck out blocks, link to specific blocks, etc.

In theory, this is true of any tree-based markup language, such as HTML. But try meaningfully merging two HTML files in practice... Yikes! Tag soup!

A linear block-oriented format resolves the problem by radically simplifying it. With a linear data model, the range of meaningful document structures is narrowed, and this means you can make complex, yet meaningful programmatic decisions, without much context about the specific document:

  • Excerpt a document by taking the first text block
  • Select all quotes from a collection of documents
  • Select all links, and generate a link graph for a collection of documents
  • Find all backlinks and append them to the document as links

Linear block-oriented documents are like shipping containers for discrete thoughts. Because blocks are structurally uniform, they can be automatically moved around and reorganized. Software can split, join, and merge documents easily and effectively, because the document structure is simple.

Subtext is hypertext

Link blocks (&) are the most important feature in Subtext. They let you reference other files, and URLs. You can link to any kind of file, including other Subtext files!

The plan is to have Subconscious display these links as transclusions. Rather than linked words in text, imagine something more like a quote tweet… Links to images display as literal images, links to videos display as playable videos with playback controls, links to documents display some or all of the content inside of the linked document. This lets you compose hypertext documents from many smaller documents.

This keeps Subtext simple. Rather than extending the syntax of Subtext to include a complex feature like tables, we might, for example, link to a .csv file, which then gets rendered as a table. This also means the data stays in its native file type, and can be used in other applications.

One of the many attempts of nature to evolve a Xanadu

By an accident of convergent evolution, Subtext happens to have some similarities to Ted Nelson's ELF format (Nelson, 1965).

Ted Nelson “A File Structure for the Complex, the Changing, and the Indeterminate”, 1965

Like ELF, Subtext documents are made up of a list of small blocks. Also like ELF, links are transcluded. Big documents can be composed by linking to small documents.

I discovered Ted Nelson’s ELF paper after writing up my first draft of Subtext. Uncovering this bit of convergent evolution was encouraging! It suggests I’m pulling on a worthwhile thread. Xanadu by way of Markdown? Something like that.

Why not Markdown?

I took a deep breath before thinking about the jump from Markdown. If you’re a programmer, Markdown is a de-facto standard for formatted text. For many, it is the first obvious choice for this kind of thing. So why Subtext?

Subtext has evolved out personal experiments with plain-text note-taking, spanning 10 years and 12k notes. Many of these notes are written in Markdown. However, over time, I noticed that my markup needs for note-taking were different from my markup needs for publishing. My note-taking style organically converged on a tiny subset of Markdown's features: text, links, lists, quotes, and one level of heading. To have more may be useful for publishing, but is often overkill for note-taking.

At the same time, I began to write small generative programs that worked with this collection of notes, little scripts that would combine ideas, remix notes, algorithmically generate new notes… these were the seeds that would later become Subconscious.

Here, I started to run into limitations with Markdown and HTML. As a complex publishing format, it is unclear how to meaningfully decompose or merge Markdown/HTML documents. When you combine documents, heading levels may need to be changed, lists may need to be flattened or nested. Because the document format is complex, foreknowledge of the meaning of the document is necessary to make meaningful changes. That limits what you can do with software.

Subtext is an attempt to resolve the problem by radically simplifying it. Paradoxically, by limiting the format to a flat list of blocks, we radically expand what software can usefully do with it. Blocks are easy to parse, easy to work with, and you can do all sorts of interesting generative algorithmic things with them.

The syntax is also simple, and hard to mess up, and I’m happy about that, too.

Project links

Comments
  • Compare with Gemtext

    Compare with Gemtext

    A more detailed comparision with Gemini's Gemtext could be helpful. I found this so far:

    | | subtext | gemtext | |-|--------|----| | text blocks | any line not starting with a sigil | any line not starting with #, >, => or * | blank lines | ignored | are valid text blocks | links | & link | => link optional-link-name | heading blocks | # heading | #, ## or ### followed by the heading | list blocks | - item | * item | quote blocks | > text | > text | space after sigil | required | optional | other sigils | reserved | become part of text blocks | preformatted | not supported | toggled with ``` | line breaks | \n but \r\n is also also supported | \r\n but \n is also also supported

    opened by nichtich 5
  • Ambiguity of leading whitespace that precedes sigil

    Ambiguity of leading whitespace that precedes sigil

    I'm currently reworking some of the Rust subtext parser's AST representation to line it up more closely to the spec. I'm trying to reason about how to treat leading whitespace. This is important in the context of https://github.com/subconsciousnetwork/subtext/issues/31; if leading whitespace has presentational significance for a list block (it doesn't yet, but it might in the future), then some amount of leading whitespace ought to be captured context for that block. This may be true for other blocks even if that leading whitespace isn't used for presentational purposes in those cases.

    At any rate, right now the Rust parser considers any leading whitespace is to be part of a Blank that precedes the content. But, this actually violates the intention of the spec in its own way, I think.

    Would you be willing to clarify in the spec the way such leading whitespace that precedes a sigil on a given line should be treated?

    opened by cdata 4
  • Escape sigil at start of line

    Escape sigil at start of line

    Does \ at the start of a line escape the character, so it can be used at the start of a text block?:

    \#
    \&
    \-
    \\
    

    If so, does it also act as escape character elsewhere like in Markdown?

    opened by nichtich 4
  • Add sigil for keyvalue pairs

    Add sigil for keyvalue pairs

    Just adding this as a possible alternative to header keyvalue pairs, as discussed in #19.

    That link mentions @ as a possible sigil, ie

    @ foo: bar

    Some alternatives -

    .foo bar .foo=bar .foo: bar

    I like this syntax as it's like property assignment in oo, and @ seems more appropriate for other uses.

    For my project Neomem, I had been planning to just parse out any plain 'key: value' lines and treat them as metadata. Each item has a text representation similar to markdown, corresponding to a record in a database.

    There's also 'key:: value' as in obsidian - I don't like that syntax though.

    enhancement 
    opened by bburns 3
  • Define line break

    Define line break

    Which character(s) are considered a line break? LF? Also CRLF? All linebreaks defined by Unicode? I'd not include additional Unciode line breaks such as U+2029 so you can still use them for linebreaks within a block (if you your editor supports entering it instead of a normal line break)

    opened by nichtich 2
  • Machine header envelopes for Subtext

    Machine header envelopes for Subtext

    This issue exists to document background and decisions w/r/t machine headers in Subtext. Related to #19. No action is necessary.

    Background

    Key-value metadata is a generally useful primitive (see If headers did not exist it would be necessary to invent them). In our design discussions, we broadly identified two kinds of key-value metadata:

    • Machine metadata (tracked here in #41). this includes things like cache-control headers, content-type flags, user agent strings, etc. This kind of metadata is often invisible to the user and authored by the program.
    • User metadata (tracked in #19). Anything authored by the user for their own purposes.

    Both of these use-cases can technically be supported by the same mechanism. However, machine headers are often visually noisy and potentially confusing. We believe it is valuable to have separate mechanisms for these two features so that the mess of machine headers can be hidden from the user.

    Design goals

    • Should be expressive enough that an app can reify state as metadata, such that any internal caches, indexes, or databases can be regenerated from files.
    • Should provide a content-type mechanism
    • Ideally, plain text body content should be readable as plain text

    Prior art and notes

    HTTP-like

    Packets, HTTP, and email all use the memo pattern for key-value metadata.

    A document begins with a series of key: value lines, followed by an empty line. Lines after the first empty line are considered content.

    Title: Floop
    Date: 2022-01-15
    exotic-header: {"msg": "you can put anything in header body"}
    
    Content.
    

    This design has been very successful in the wild, and our sense is that our design solution should be heavily influenced by this pattern.

    Note: earlier version of HTTP allowed for multi-line headers through line folding, then later obsoleted this feature. We wish to avoid line folding in Subtext. See #40.

    Observations:

    • Pro: It's what you would write anyway
    • Pro: Header keys are case-insensitive, so you can write them nice style
    • Pro: It works for email and the web
    • Pro: Header bodies are specified separately from header syntax. This makes headers a completely open-ended extension mechanism.
    • Pro: different applications can write to the same file without conflicts provided they use their own header fields (e.g. subconscious-meta, obsidian-meta)
    • Pro: Happens to fit with the way SQL thinks about JSON. Blobs of JSON belong to a specific column.
    • Con: Trends toward bespoke DSLs for each header.
      • Pro: This is also a pro, because it allows for open-ended evolution.
      • Synthesis: we could strongly encourage all headers to be one of a few types: String, Number, Bool, JSON. At the same time, it would be technically possible to do things beyond these types.
    • Con: Requires at least one header, or a line break at the beginning of the file

    Sidecar files

    Another option is to make metadata a separate file that references the content file. In this case, the obvious choice for metadata format would be JSON. Like the envelope format approach, no specification would be necessary for Subtext to support this.

    Tradeoffs:

    • Pro: Multiple apps can generate sidecar files without conflicts
    • Con: they don't travel together with the file (not the biggest deal)

    Prior art:

    • iTunes used to (still?) generates its plist data store by crawling your music library.
    • You can delete your plist, and the application will regenerate it.

    Reference:

    • https://en.wikipedia.org/wiki/Sidecar_file
    opened by gordonbrander 1
  • Line folding

    Line folding

    This issue exists to document background research on header line folding, related to #19. No action is necessary.

    Line folding

    Email and HTTP header syntaxes are line-oriented, where each line is a header, and key and value are separated by :. Headers in email also support "line folding". Line folding means multi-line headers are allowed as long as the following line is preceded by at least one space.

    Folded-Header: some value
      which continues on next line
    

    HTTP also used to support line folding, but this was obsoleted in https://www.rfc-editor.org/rfc/rfc7230#section-3.2.4.

    Benefits/costs of line folding

    Line folding has some useful aspects.

    The absolute best thing about YAML is the support for indented multi-line strings - so useful for embedding other languages inside of a YAML document, e.g. the giant hunk of JavaScript in my shots.yml file here (https://twitter.com/simonw/status/1501762626941947909)

    However it comes with the cost of making parsing more complex. If parsers do not implement it, or implement it incorrectly, you end up with broken or malformed headers. This ended up happening in practice with HTTP, leading to the obsolescence of line-folding (see below).

    Why was line folding obsoleted in http headers?

    Some popular servers did not implement line-folding, or implemented it incorrectly, leading to complexities and issues. This practical issue lead to the obsoletion of line folding. Simplification of the spec was also cited as a reason.

    Snipping a few relevant passages from the email archives and specs:

    On 23 Aug 2015, at 5:44 am, Mike Bishop [email protected] wrote:

    We’ve encountered a site (whom we shall leave nameless, unless they choose otherwise) that included a 0x0A20202020202020 sequence inside an HPACK value –carriage return followed by several spaces, which is to say line-folding. Edge rejects that (as will IIS if clients send it), because that’s an HTTP/1.1 legacy artifact. RFC 7540 just references RFC 7230 section 3.2 for header values, which in turn says in section 3.2.4:

    Historically, HTTP header field values could be extended over multiple lines by preceding each extra line with at least one space or horizontal tab (obs-fold). This specification deprecates such line folding except within the message/http media type (Section 8.3.1). A sender MUST NOT generate a message that includes line folding (i.e., that has any field-value that contains a match to the obs-fold rule) unless the message is intended for packaging within the message/http media type.

    While there’s no requirement for HTTP/1.1 clients to reject this pattern (for back-compat), it seems like an HTTP/2 implementation might want to hold its peers to that MUST NOT. Osama has additionally pointed out that being tolerant of this could make HTTP/1.1 to HTTP/2 conversion “wreak havoc and bugs.” In an offline thread with a few others, the general feeling seems to be that we should all change to reject this as broken header framing.

    (Quoted in https://lists.w3.org/Archives/Public/ietf-http-wg/2015JulSep/0249.html)

    Many implementations do not implement header line folding; should it be deprecated / removed? (https://www.w3.org/Protocols/HTTP/1.1/rfc2616bis/issues/#i77)

    We deprecated folding, but couldn't require implementations to reject it, because (as you've seen) it still happens in the wild. (https://lists.w3.org/Archives/Public/ietf-http-wg/2015JulSep/0250.html)

    opened by gordonbrander 1
  • IP anonymity

    IP anonymity

    At what level of the application should IP anonymity be built, or is it out of scope for this project? Use case: A neighborhood community of marginalized people needs to communicate privately in order to plan a protest and ensure that authorities cannot trace a social graph of IP connections to find the leader and pre-empt the protest.

    opened by erangell 1
  • Implement prototype Rust Subtext parser

    Implement prototype Rust Subtext parser

    Rust Subtext

    This change proposes a prototype Subtext parser written in Rust.

    Currently it is implemented as a basic recursive descent parser. No sophisticated matching (e.g., regex) and almost no backtracking is used in the implementation. This simplicity is afforded us by Subtext's relative simple grammar. However, many edge cases may yet be unrecognized at this time.

    Included is a small, not-comprehensive suite of tests that cover various Subtext block formats.

    Additionally, there is an example that prints out the AST of a given input Subtext file.

    The parser has only one dependency: a Servo crate that makes it more ergonomic to exercise zero-copy string sharing.

    opened by cdata 1
  • Slashlinks

    Slashlinks

    This proposal does a radical rethink of Subtext link syntax, proposing to replace the current block links with inline links that are much simpler.

    The gist:

    • Links are wrapped in angle brackets <https://example.com>, and can appear anywhere in text.
    • You can also just paste bare links https://example.com, and Subtext will automatically link them. This only works for http and https, not exotic protocols like <ipfs://asdfasdfasdfasdf>. Use angle brackets for the funky stuff.
    • This is a /slashlink it's a shortcut for linking to internal pages. Slashlinks can also include paths, /like/this.

    /slashlinks are like the #hashtag of links. A simple syntax for referencing things. Spiritually similar to the original camelcase WikiLink. The simplest thing that could possibly work.

    Rendered: https://github.com/gordonbrander/subtext/blob/slashlink/rfcs/2021-10-07-slashlinks.md

    This PR also introduces a user guide, and rewrites the specification to reflect the proposed changes.

    opened by gordonbrander 1
  • Unprefixed link blocks

    Unprefixed link blocks

    I’m realizing that since #14 requires links to start with ./, ../, /, or scheme: it is possible to detect link blocks by sniffing the line with a regular expression.

    We introduced this constraint to disambiguate wiki links from protocol links in #14. The disambiguation opens up an additional approach that was not obvious at the time of the RFC:

    • Remove sigil from link blocks, restrict them to path and URL, sniff out block type with regular expression.
    • Introduce a separate wiki link block.

    This is very tempting because writing it looks like what you might do absent of any formal syntax. There are tradeoffs though. (TODO: Elaborate on these…)

    opened by gordonbrander 1
  • JavaScript parser

    JavaScript parser

    This is a JavaScript parser for Subtext with streaming capability. Since I am using something similar for my own notes app, I thought I might as well provide a parser for this repo.

    It uses the Web Streams API which means it can be used with compatible browsers and server runtimes like Node.js and Deno. The parser does not have any dependency.

    I have included the example from the Rust parser and some tests from the Rust test suite.

    You can run the example via npm run example and run tests via npm run test.

    Feel free to suggest improvements or close the request if it does not match your requirements. If you prefer TypeScript, I could also make the adjustments.

    enhancement 
    opened by SebastianZimmer 0
  • RFC for outlining

    RFC for outlining

    I was wondering how one might go about writing an outline in subtext, or writing one with an editor that supported transclusions. You guys have probably already thought this through, but I've been wondering how I was gonna do it in Neomem also.

    So, this is a bit pedantic, but it helped me understand the issue better.

    This is a solved problem with things like Roam and Logseq, which both use lines as blocks, as I understand it, and have custom editors. I haven't tried Roam, and didn't stay long with Logseq.

    Alternatives:

    • Embedded outlines - could use indentation as in Python or Markdown. Space as a sigil character? This goes against the idea of a flat list of blocks. But it's lightweight, and simple for a text editor to work with.

    • Transcluded items - each item could be a separate memo, and each parent embeds references to its children. This seems rigid though - like a strict folder hierarchy.

    • Store link to parent in each child item. Also rigid.

    • Graph of items - each item in the outline could be a separate memo, and links between them are stored in an edge table. This seems heavyweight for just a simple outline, but preserves the idea of a flat list of blocks. Different orderings are possible in the same db.

    So if we want a set of notes that could be arranged in any linear order or hierarchy, storing them in a graph makes sense.

    How would you transform a text outline like this to a graph version?

    • home
      • ladder99 a data pipeline
        • task1
        • task2
      • neomem a data gateway
        • task3
        • task4
          • task5
          • task6

    Flatten everything - each item to a node - eg with addr:contents for shorthand -

    home ladder99: a data pipeline task1 task2 neomem: a data gateway task3 task4 task5 task6

    and construct the edges between them - eg from, relation, to, props - which could accommodate ordered lists, trees, graphs, and have multiple hierarchies possible.

    So say we have that list of nodes, and a list of edges like this -

    home, parent, -null-, {} ladder99, parent, home, {order:1} task1, parent, ladder99, {order:1} task2, parent, ladder99, {order:2} neomem, parent, home, {order:2} task3, parent, neomem, {order:1} task4, parent, neomem, {order:2} task5, parent, task4, {order:1} task6, parent, task4, {order:2}

    Now we've got a graph storing an ordered tree. If we need to rearrange things it's a matter of changing the numbers - floating point can go pretty far before needing to renumber a set of siblings.

    You can define multiple trees/orderings on the same items, by using a different relation address, eg parent2, container, part-of, etc.

    q. How would an editor render this?

    It could traverse the graph structure, being wary of cycles. eg start at null - who are the children of null? home. who are the children of home? ladder99, neomem. It could do depth first traversal and add divs to a doc, with indentation. Use the order in the props set to order siblings.

    q. How would an editor let you edit this tree/outline?

    Say we have a rendering of the tree with each item having a text input for heading and a textarea for contents. Then changing the values is easy. Can reorder things by shortcut keys or mouse and updating order values. And can switch between different orderings by selecting the relation name/addr. It's easy to show a flat list of all the items, or any number of trees, or graphs.

    For Neomem I had gotten as far as a flat list of items connected to a db - catch the up/down arrows when you're at the start/end of the textarea to move to prev/next item. Hadn't thought through outlines/graphs yet.

    I haven't read enough about Subconscious to know how this all connects with the rest of the system. For Neomem each item would have a uuid, but you guys have content-addressing in mind? With some kind of address/alias system?

    I'm still trying to catch up!

    Anyway, as far as Subtext goes, I guess this doesn't have much bearing on it, other than that transcluding items is one way to make an outline...

    opened by bburns 1
  • RFC for comment sigils

    RFC for comment sigils

    Just an idea, could comment out a line/block by prefixing with ~. This would roughly correspond to a possible strikethrough representation.

    Why comment out lines/blocks?

    I often want a way to do this quickly in notes, to keep around things I want to disregard, or color differently, eg grayed out.

    In orgmode can do with #, which matches shell and python, but conflicts with the heading sigil.

    In markdown, have to use html comments <!-- foo -->, which is obviously very awkward.

    Alternatives - ; as in lisp, ' as in basic, ! as in fortran (nah).

    opened by bburns 0
  • Direct linking to content by CID

    Direct linking to content by CID

    It would be nice to be able to link directly to a CID from Subtext. There are a few reasons why one might want to do this, but perhaps the most relevant one to Subtext is to enable a user to capture a "permalink" to a piece of content.

    Note that when linking to a CID directly, peer key / pet name is no longer needed to resolve to the content ID. So, it's possible to imagine linking by CID as a stand-alone link (with trade-offs at the margins).

    Some ideas for what this could look like:

    • A stand-alone link type with some distinguishing sigil. Ex: %bafyrei...
    • A specialization of a slashlink. Ex: /cid:bafyrei...
    • Support for ipfs:// hyperlinks. Ex: ipfs://bafyrei...
    opened by cdata 7
  • Consider making Subtext MAYA

    Consider making Subtext MAYA

    Umbrella for:

    • [x] Bold/italic #20 TODO: write up RFC
    • [x] Wikilinks #29 TODO: write up RFC
    • [ ] Hashtags #21
    • [ ] Deep lists (implemented as line-oriented list plus whitespace "indent", similar in concept to heading levels)
    • [ ] Deep headings

    I am ambivalent about this, but the value would be in trying to hit a MAYA (most advanced yet acceptable) threshold of "good enough" surface-level compatibility with the unofficial Markdown flavors used in some wikis and TfTs, while retaining the advantage of having a programmatically useful flat-list block model.

    Goals:

    • Surface-level MAYA compatibility with some major markup (not all) features used in Markdown-flavored wikis and TfTs.
    • "Mostly working" for the simplest markdown/wikilink markup cases. This will be a subjective criteria.

    Non-goals:

    • Compatibility. It is a non-goal to implement 1:1 feature compatibility with Markdown or Obsidian
    • Strict subsetting. It is a non-goal to implement strict subset compatibility. This would be a "mostly works due to passing resemblance" kind of thing. The value is in the familiarity, not in 1:1 semantic equivalency.

    Subtext deliberately takes a fundamentally different, line-oriented parsing strategy that enables you to treat lines as a flat list of blocks. This means that while it has a passing resemblance to Markdown, it will always be subtly different from Markdown at a deeper level (by design!)

    Tradeoffs:

    • Pro: conformability with existing infrastructure
    • Pro: known/proven set of features (although I think many of these, such as deep headings are long-tail)
    • Con: complicates Subtext
    • Con: not a strict subset. There will be edge-cases.
    • Con: adds an additional linking flavor
    enhancement 
    opened by gordonbrander 2
  • Canonical JSON serialization of Subtext

    Canonical JSON serialization of Subtext

    Related to #19.

    Subtext should have a canonical JSON serialization. This would make it conformable to many other systems, and give parsers a default input/output interchange format.

    opened by gordonbrander 0
Owner
Gordon Brander
Building something new (prev @google, @mitmedialab, @mozilla).
Gordon Brander
A command line simple note taking app

Why yet another note taking program? note was designed with a very specific target in mind: me, and my 2354 scraps of paper. It runs from the command

null 64 Nov 20, 2022
A simple, fantasy and fast note taking program.

notes A simple, fantasy and fast note taking program Installation This program supposed to run in linux and may have some bugs on windows or any other

Ali Hosseinverdi 1 Apr 6, 2022
An automated scanning, enumeration, and note taking tool for pentesters

EV1L J3ST3R An automated scanning, enumeration, and note taking tool Created by S1n1st3r Meant to help easily go through Hack The Box machine and TryH

null 14 Oct 2, 2022
Bleach is an allowed-list-based HTML sanitizing library that escapes or strips markup and attributes

Bleach Bleach is an allowed-list-based HTML sanitizing library that escapes or strips markup and attributes. Bleach can also linkify text safely, appl

Mozilla 2.5k Dec 29, 2022
Safely add untrusted strings to HTML/XML markup.

MarkupSafe MarkupSafe implements a text object that escapes characters so it is safe to use in HTML and XML. Characters that have special meanings are

The Pallets Projects 514 Dec 31, 2022
Extract embedded metadata from HTML markup

extruct extruct is a library for extracting embedded metadata from HTML markup. Currently, extruct supports: W3C's HTML Microdata embedded JSON-LD Mic

Scrapinghub 725 Jan 3, 2023
Bleach is an allowed-list-based HTML sanitizing library that escapes or strips markup and attributes

Bleach Bleach is an allowed-list-based HTML sanitizing library that escapes or strips markup and attributes. Bleach can also linkify text safely, appl

Mozilla 2.5k Dec 29, 2022
A python server markup language

PSML - Python server markup language How to install: python install.py

LMFS 6 May 18, 2022
Python wrapper and CLI utility to render LaTeX markup and equations as SVG using dvisvgm and svgo.

latex2svg Python wrapper and CLI utility to render LaTeX markup and equations as SVG using dvisvgm and svgo. Based on the original work by Tino Wagner

Matthias C. Hormann 4 Feb 18, 2022
A simple note taker CLI program written in python

note-taker A simple note taker program written in python This allows you to snip your todo's, notes, and your tasks easily without extra charges Requi

marcusz 4 Nov 2, 2021
SongFinder Bot helps you to find song name by recognising via voice note or instagram reels shared link.

SongFinder V1.1 SongFinder to detect songs name by just sending voice note or instagram reels links to your telegram bot. FFMPEG must be installed on

Abhishek Pathak 4 Dec 30, 2022
Platform Tree for Xiaomi Redmi Note 7/7S (lavender)

The Xiaomi Redmi Note 7 (codenamed "lavender") is a mid-range smartphone from Xiaomi announced in January 2019. Device specifications Device Xiaomi Re

MUHAMAD KHOIRON 2 Dec 20, 2021
🌟 Python algorithm team note for programming competition or coding test

?? Python algorithm team note for programming competition or coding test

Seung Hoon Lee 3 Feb 25, 2022
Reverse the infix string. Note that while reversing the string you must interchange left and right parentheses

Reverse the infix string. Note that while reversing the string you must interchange left and right parentheses. Obtain the postfix expression of the infix expression Step 1.Reverse the postfix expression to get the prefix expression

Sazzad Hossen 1 Jan 4, 2022
JoplinPdf2Images - Converts a PDF to images in Joplin and adds it to the specified note as a printout

joplinPdf2Images Converts a PDF to images in Joplin and adds it to the specified

Morten Haahr Kristensen 2 Apr 20, 2022
Python client for ETAPI of Trilium Note.

Python client for ETAPI of Trilium Note.

null 33 Dec 31, 2022
Stephen's Obsessive Note-Storage Engine.

Latest Release · PyPi Package · Issues · Changelog · License # Get Sonse and tell it where your notes are... $ pip install sonse $ export SONSE="$HOME

Stephen Malone 23 Jun 10, 2022
💛 Code and Dataset for our EMNLP 2021 paper: "Perspective-taking and Pragmatics for Generating Empathetic Responses Focused on Emotion Causes"

Perspective-taking and Pragmatics for Generating Empathetic Responses Focused on Emotion Causes Official PyTorch implementation and EmoCause evaluatio

Hyunwoo Kim 50 Dec 21, 2022
ScreenTeX is a tool that grabs all text when taking a screenshot rather than getting an image.

The ScreenTeX project By: Seanpm2001 / ScreenTeX, Et; Al. Top README.md Read this article in a different language ?? List of languages Sorted by: A-Z

Sean P. Myrick V19.1.7.2 3 Oct 25, 2022
A webapp for taking fast notes, designed for business, school, and collaboration with groups.

JOTS Journal of the Session A webapp for taking fast notes, designed for business, school, and collaboration with groups.

Zebadiah S. Taylor 2 Jun 10, 2022