about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThibaut Girka <thib@sitedethib.com>2018-07-31 11:44:12 +0200
committerThibG <thib@sitedethib.com>2018-07-31 16:26:36 +0200
commit88b593a63ff3d607d6f98553654c46bc7cfc0b7b (patch)
tree458ac146f6fcc2264e6d96b1e2f3677b527b0ea9
parentc4bec9263cabdd141d5e83e57869dec97426c0d9 (diff)
Drop glitch-style account bio fields
Upstream's implementation has been merged a while ago and is the preferred
way to set fields, as it is the only one compatible with upstream and is
more user-friendly.

This commit deletes the legacy glitch-soc FrontMatter functionality in order
to clean up the code and make it easier to maintain.
-rw-r--r--app/javascript/core/settings.js5
-rw-r--r--app/javascript/flavours/glitch/features/account/components/header.js17
-rw-r--r--app/javascript/flavours/glitch/util/bio_metadata.js331
-rw-r--r--app/lib/frontmatter_handler.rb223
-rw-r--r--app/views/accounts/_header.html.haml12
5 files changed, 6 insertions, 582 deletions
diff --git a/app/javascript/core/settings.js b/app/javascript/core/settings.js
index c9edcf197..1add0314d 100644
--- a/app/javascript/core/settings.js
+++ b/app/javascript/core/settings.js
@@ -3,8 +3,6 @@
 const { length } = require('stringz');
 const { delegate } = require('rails-ujs');
 
-import { processBio } from 'flavours/glitch/util/bio_metadata';
-
 delegate(document, '.account_display_name', 'input', ({ target }) => {
   const nameCounter = document.querySelector('.name-counter');
 
@@ -17,8 +15,7 @@ delegate(document, '.account_note', 'input', ({ target }) => {
   const noteCounter = document.querySelector('.note-counter');
 
   if (noteCounter) {
-    const noteWithoutMetadata = processBio(target.value).text;
-    noteCounter.textContent = 500 - length(noteWithoutMetadata);
+    noteCounter.textContent = 500 - length(target.value);
   }
 });
 
diff --git a/app/javascript/flavours/glitch/features/account/components/header.js b/app/javascript/flavours/glitch/features/account/components/header.js
index 59d9477d6..174df0cc9 100644
--- a/app/javascript/flavours/glitch/features/account/components/header.js
+++ b/app/javascript/flavours/glitch/features/account/components/header.js
@@ -7,9 +7,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import Avatar from 'flavours/glitch/components/avatar';
 import IconButton from 'flavours/glitch/components/icon_button';
 
-import emojify from 'flavours/glitch/util/emoji';
 import { me } from 'flavours/glitch/util/initial_state';
-import { processBio } from 'flavours/glitch/util/bio_metadata';
 import classNames from 'classnames';
 
 const messages = defineMessages({
@@ -83,7 +81,7 @@ export default class Header extends ImmutablePureComponent {
       actionBtn = '';
     }
 
-    const { text, metadata } = processBio(account.get('note_emojified'));
+    const content = { __html: account.get('note_emojified') };
 
     return (
       <div className='account__header__wrapper'>
@@ -104,7 +102,7 @@ export default class Header extends ImmutablePureComponent {
 
             {badge}
 
-            <div className='account__header__content' dangerouslySetInnerHTML={{ __html: emojify(text) }} />
+            <div className='account__header__content' dangerouslySetInnerHTML={content} />
 
             {fields.size > 0 && (
               <div className='account__header__fields'>
@@ -117,17 +115,6 @@ export default class Header extends ImmutablePureComponent {
               </div>
             )}
 
-            {fields.size == 0 && metadata.length && (
-              <div className='account__header__fields'>
-                {metadata.map((pair, i) => (
-                  <dl key={i}>
-                    <dt dangerouslySetInnerHTML={{ __html: pair[0] }} title={pair[0]} />
-                    <dd dangerouslySetInnerHTML={{ __html: pair[1] }} title={pair[1]} />
-                  </dl>
-                ))}
-              </div>
-            ) || null}
-
             {info}
             {mutingInfo}
             {actionBtn}
diff --git a/app/javascript/flavours/glitch/util/bio_metadata.js b/app/javascript/flavours/glitch/util/bio_metadata.js
deleted file mode 100644
index 3c9c2b8b1..000000000
--- a/app/javascript/flavours/glitch/util/bio_metadata.js
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
-
-`util/bio_metadata`
-===================
-
->   For more information on the contents of this file, please contact:
->
->   - kibigo! [@kibi@glitch.social]
-
-This file provides two functions for dealing with bio metadata. The
-functions are:
-
- -  __`processBio(content)` :__
-    Processes `content` to extract any frontmatter. The returned
-    object has two properties: `text`, which contains the text of
-    `content` sans-frontmatter, and `metadata`, which is an array
-    of key-value pairs (in two-element array format). If no
-    frontmatter was provided in `content`, then `metadata` will be
-    an empty array.
-
- -  __`createBio(note, data)` :__
-    Reverses the process in `processBio()`; takes a `note` and an
-    array of two-element arrays (which should give keys and values)
-    and outputs a string containing a well-formed bio with
-    frontmatter.
-
-*/
-
-//  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
-/*********************************************************************\
-
-                                       To my lovely code maintainers,
-
-  The syntax recognized by the Mastodon frontend for its bio metadata
-  feature is a subset of that provided by the YAML 1.2 specification.
-  In particular, Mastodon recognizes metadata which is provided as an
-  implicit YAML map, where each key-value pair takes up only a single
-  line (no multi-line values are permitted). To simplify the level of
-  processing required, Mastodon metadata frontmatter has been limited
-  to only allow those characters in the `c-printable` set, as defined
-  by the YAML 1.2 specification, instead of permitting those from the
-  `nb-json` characters inside double-quoted strings like YAML proper.
-    ¶ It is important to note that Mastodon only borrows the *syntax*
-  of YAML, not its semantics. This is to say, Mastodon won't make any
-  attempt to interpret the data it receives. `true` will not become a
-  boolean; `56` will not be interpreted as a number. Rather, each key
-  and every value will be read as a string, and as a string they will
-  remain. The order of the pairs is unchanged, and any duplicate keys
-  are preserved. However, YAML escape sequences will be replaced with
-  the proper interpretations according to the YAML 1.2 specification.
-    ¶ The implementation provided below interprets `<br>` as `\n` and
-  allows for an open <p> tag at the beginning of the bio. It replaces
-  the escaped character entities `&apos;` and `&quot;` with single or
-  double quotes, respectively, prior to processing. However, no other
-  escaped characters are replaced, not even those which might have an
-  impact on the syntax otherwise. These minor allowances are provided
-  because the Mastodon backend will insert these things automatically
-  into a bio before sending it through the API, so it is important we
-  account for them. Aside from this, the YAML frontmatter must be the
-  very first thing in the bio, leading with three consecutive hyphen-
-  minues (`---`), and ending with the same or, alternatively, instead
-  with three periods (`...`). No limits have been set with respect to
-  the number of characters permitted in the frontmatter, although one
-  should note that only limited space is provided for them in the UI.
-    ¶ The regular expression used to check the existence of, and then
-  process, the YAML frontmatter has been split into a number of small
-  components in the code below, in the vain hope that it will be much
-  easier to read and to maintain. I leave it to the future readers of
-  this code to determine the extent of my successes in this endeavor.
-
-  UPDATE 19 Oct 2017: We no longer allow character escapes inside our
-  double-quoted strings for ease of processing. We now internally use
-  the name "ƔAML" in our code to clarify that this is Not Quite YAML.
-
-                                       Sending love + warmth eternal,
-                                       - kibigo [@kibi@glitch.social]
-
-\*********************************************************************/
-
-/*  "u" FLAG COMPATABILITY  */
-
-let compat_mode = false;
-try {
-  new RegExp('.', 'u');
-} catch (e) {
-  compat_mode = true;
-}
-
-/*  CONVENIENCE FUNCTIONS  */
-
-const unirex = str => compat_mode ? new RegExp(str) : new RegExp(str, 'u');
-const rexstr = exp => '(?:' + exp.source + ')';
-
-/*  CHARACTER CLASSES  */
-
-const DOCUMENT_START    = /^/;
-const DOCUMENT_END      = /$/;
-const ALLOWED_CHAR      =  unirex( //  `c-printable` in the YAML 1.2 spec.
-  compat_mode ? '[\t\n\r\x20-\x7e\x85\xa0-\ufffd]' : '[\t\n\r\x20-\x7e\x85\xa0-\ud7ff\ue000-\ufffd\u{10000}-\u{10FFFF}]'
-);
-const WHITE_SPACE       = /[ \t]/;
-const LINE_BREAK        = /\r?\n|\r|<br\s*\/?>/;
-const INDICATOR         = /[-?:,[\]{}&#*!|>'"%@`]/;
-const FLOW_CHAR         = /[,[\]{}]/;
-
-/*  NEGATED CHARACTER CLASSES  */
-
-const NOT_WHITE_SPACE   = unirex('(?!' + rexstr(WHITE_SPACE) + ')[^]');
-const NOT_LINE_BREAK    = unirex('(?!' + rexstr(LINE_BREAK) + ')[^]');
-const NOT_INDICATOR     = unirex('(?!' + rexstr(INDICATOR) + ')[^]');
-const NOT_FLOW_CHAR     = unirex('(?!' + rexstr(FLOW_CHAR) + ')[^]');
-const NOT_ALLOWED_CHAR  = unirex(
-  '(?!' + rexstr(ALLOWED_CHAR) + ')[^]'
-);
-
-/*  BASIC CONSTRUCTS  */
-
-const ANY_WHITE_SPACE   = unirex(rexstr(WHITE_SPACE) + '*');
-const ANY_ALLOWED_CHARS = unirex(rexstr(ALLOWED_CHAR) + '*');
-const NEW_LINE          = unirex(
-  rexstr(ANY_WHITE_SPACE) + rexstr(LINE_BREAK)
-);
-const SOME_NEW_LINES    = unirex(
-  '(?:' + rexstr(NEW_LINE) + ')+'
-);
-const POSSIBLE_STARTS   = unirex(
-  rexstr(DOCUMENT_START) + rexstr(/<p[^<>]*>/) + '?'
-);
-const POSSIBLE_ENDS     = unirex(
-  rexstr(SOME_NEW_LINES) + '|' +
-  rexstr(DOCUMENT_END) + '|' +
-  rexstr(/<\/p>/)
-);
-const QUOTE_CHAR         = unirex(
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')[^"]'
-);
-const ANY_QUOTE_CHAR    = unirex(
-  rexstr(QUOTE_CHAR) + '*'
-);
-
-const ESCAPED_APOS      = unirex(
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' + rexstr(/[^']|''/)
-);
-const ANY_ESCAPED_APOS  = unirex(
-  rexstr(ESCAPED_APOS) + '*'
-);
-const FIRST_KEY_CHAR    = unirex(
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-  '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-  rexstr(NOT_INDICATOR) + '|' +
-  rexstr(/[?:-]/) +
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-  '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-  '(?=' + rexstr(NOT_FLOW_CHAR) + ')'
-);
-const FIRST_VALUE_CHAR  = unirex(
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-  '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-  rexstr(NOT_INDICATOR) + '|' +
-  rexstr(/[?:-]/) +
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-  '(?=' + rexstr(NOT_WHITE_SPACE) + ')'
-  //  Flow indicators are allowed in values.
-);
-const LATER_KEY_CHAR    = unirex(
-  rexstr(WHITE_SPACE) + '|' +
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-  '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-  '(?=' + rexstr(NOT_FLOW_CHAR) + ')' +
-  rexstr(/[^:#]#?/) + '|' +
-  rexstr(/:/) + '(?=' + rexstr(NOT_WHITE_SPACE) + ')'
-);
-const LATER_VALUE_CHAR  = unirex(
-  rexstr(WHITE_SPACE) + '|' +
-  '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-  '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-  //  Flow indicators are allowed in values.
-  rexstr(/[^:#]#?/) + '|' +
-  rexstr(/:/) + '(?=' + rexstr(NOT_WHITE_SPACE) + ')'
-);
-
-/*  YAML CONSTRUCTS  */
-
-const ƔAML_START        = unirex(
-  rexstr(ANY_WHITE_SPACE) + '---'
-);
-const ƔAML_END          = unirex(
-  rexstr(ANY_WHITE_SPACE) + '(?:---|\.\.\.)'
-);
-const ƔAML_LOOKAHEAD    = unirex(
-  '(?=' +
-    rexstr(ƔAML_START) +
-    rexstr(ANY_ALLOWED_CHARS) + rexstr(NEW_LINE) +
-    rexstr(ƔAML_END) + rexstr(POSSIBLE_ENDS) +
-  ')'
-);
-const ƔAML_DOUBLE_QUOTE = unirex(
-  '"' + rexstr(ANY_QUOTE_CHAR) + '"'
-);
-const ƔAML_SINGLE_QUOTE = unirex(
-  '\'' + rexstr(ANY_ESCAPED_APOS) + '\''
-);
-const ƔAML_SIMPLE_KEY   = unirex(
-  rexstr(FIRST_KEY_CHAR) + rexstr(LATER_KEY_CHAR) + '*'
-);
-const ƔAML_SIMPLE_VALUE = unirex(
-  rexstr(FIRST_VALUE_CHAR) + rexstr(LATER_VALUE_CHAR) + '*'
-);
-const ƔAML_KEY          = unirex(
-  rexstr(ƔAML_DOUBLE_QUOTE) + '|' +
-  rexstr(ƔAML_SINGLE_QUOTE) + '|' +
-  rexstr(ƔAML_SIMPLE_KEY)
-);
-const ƔAML_VALUE        = unirex(
-  rexstr(ƔAML_DOUBLE_QUOTE) + '|' +
-  rexstr(ƔAML_SINGLE_QUOTE) + '|' +
-  rexstr(ƔAML_SIMPLE_VALUE)
-);
-const ƔAML_SEPARATOR    = unirex(
-  rexstr(ANY_WHITE_SPACE) +
-  ':' + rexstr(WHITE_SPACE) +
-  rexstr(ANY_WHITE_SPACE)
-);
-const ƔAML_LINE         = unirex(
-  '(' + rexstr(ƔAML_KEY) + ')' +
-  rexstr(ƔAML_SEPARATOR) +
-  '(' + rexstr(ƔAML_VALUE) + ')'
-);
-
-/*  FRONTMATTER REGEX  */
-
-const ƔAML_FRONTMATTER  = unirex(
-  rexstr(POSSIBLE_STARTS) +
-  rexstr(ƔAML_LOOKAHEAD) +
-  rexstr(ƔAML_START) + rexstr(SOME_NEW_LINES) +
-  '(?:' +
-    rexstr(ANY_WHITE_SPACE) + rexstr(ƔAML_LINE) + rexstr(SOME_NEW_LINES) +
-  '){0,5}' +
-  rexstr(ƔAML_END) + rexstr(POSSIBLE_ENDS)
-);
-
-/*  SEARCHES  */
-
-const FIND_ƔAML_LINE    = unirex(
-  rexstr(NEW_LINE) + rexstr(ANY_WHITE_SPACE) + rexstr(ƔAML_LINE)
-);
-
-/*  STRING PROCESSING  */
-
-function processString (str) {
-  switch (str.charAt(0)) {
-  case '"':
-    return str.substring(1, str.length - 1);
-  case '\'':
-    return str
-      .substring(1, str.length - 1)
-      .replace(/''/g, '\'');
-  default:
-    return str;
-  }
-}
-
-/*  BIO PROCESSING  */
-
-export function processBio(content) {
-  content = content.replace(/&quot;/g, '"').replace(/&apos;/g, '\'');
-  let result = {
-    text: content,
-    metadata: [],
-  };
-  let ɣaml = content.match(ƔAML_FRONTMATTER);
-  if (!ɣaml) {
-    return result;
-  } else {
-    ɣaml = ɣaml[0];
-  }
-  const start = content.search(ƔAML_START);
-  const end = start + ɣaml.length - ɣaml.search(ƔAML_START);
-  result.text = content.substr(end);
-  let metadata = null;
-  let query = new RegExp(rexstr(FIND_ƔAML_LINE), 'g');  //  Some browsers don't allow flags unless both args are strings
-  while ((metadata = query.exec(ɣaml))) {
-    result.metadata.push([
-      processString(metadata[1]),
-      processString(metadata[2]),
-    ]);
-  }
-  return result;
-}
-
-/*  BIO CREATION  */
-
-export function createBio(note, data) {
-  if (!note) note = '';
-  let frontmatter = '';
-  if ((data && data.length) || note.match(/^\s*---\s+/)) {
-    if (!data) frontmatter = '---\n...\n';
-    else {
-      frontmatter += '---\n';
-      for (let i = 0; i < data.length; i++) {
-        let key = '' + data[i][0];
-        let val = '' + data[i][1];
-
-        //  Key processing
-        if (key === (key.match(ƔAML_SIMPLE_KEY) || [])[0]) /*  do nothing  */;
-        else if (key === (key.match(ANY_QUOTE_CHAR) || [])[0]) key = '"' + key + '"';
-        else {
-          key = key
-            .replace(/'/g, '\'\'')
-            .replace(new RegExp(rexstr(NOT_ALLOWED_CHAR), compat_mode ? 'g' : 'gu'), '�');
-          key = '\'' + key + '\'';
-        }
-
-        //  Value processing
-        if (val === (val.match(ƔAML_SIMPLE_VALUE) || [])[0]) /*  do nothing  */;
-        else if (val === (val.match(ANY_QUOTE_CHAR) || [])[0]) val = '"' + val + '"';
-        else {
-          key = key
-            .replace(/'/g, '\'\'')
-            .replace(new RegExp(rexstr(NOT_ALLOWED_CHAR), compat_mode ? 'g' : 'gu'), '�');
-          key = '\'' + key + '\'';
-        }
-
-        frontmatter += key + ': ' + val + '\n';
-      }
-      frontmatter += '...\n';
-    }
-  }
-  return frontmatter + note;
-}
diff --git a/app/lib/frontmatter_handler.rb b/app/lib/frontmatter_handler.rb
deleted file mode 100644
index fa787630d..000000000
--- a/app/lib/frontmatter_handler.rb
+++ /dev/null
@@ -1,223 +0,0 @@
-# frozen_string_literal: true
-
-require 'singleton'
-
-#  See also `app/javascript/features/account/util/bio_metadata.js`.
-
-class FrontmatterHandler
-  include Singleton
-
-  #  CONVENIENCE FUNCTIONS  #
-
-  def self.unirex(str)
-    Regexp.new str, Regexp::MULTILINE
-  end
-  def self.rexstr(exp)
-    '(?:' + exp.source + ')'
-  end
-
-  #  CHARACTER CLASSES  #
-
-  DOCUMENT_START    = /^/
-  DOCUMENT_END      = /$/
-  ALLOWED_CHAR      =  #  c-printable` in the YAML 1.2 spec.
-    /[\t\n\r\u{20}-\u{7e}\u{85}\u{a0}-\u{d7ff}\u{e000}-\u{fffd}\u{10000}-\u{10ffff}]/u
-  WHITE_SPACE       = /[ \t]/
-  INDENTATION       = / */
-  LINE_BREAK        = /\r?\n|\r|<br\s*\/?>/
-  ESCAPE_CHAR       = /[0abt\tnvfre "\/\\N_LP]/
-  HEXADECIMAL_CHARS = /[0-9a-fA-F]/
-  INDICATOR         = /[-?:,\[\]{}&#*!|>'"%@`]/
-  FLOW_CHAR         = /[,\[\]{}]/
-
-  #  NEGATED CHARACTER CLASSES  #
-
-  NOT_WHITE_SPACE   = unirex '(?!' + rexstr(WHITE_SPACE) + ').'
-  NOT_LINE_BREAK    = unirex '(?!' + rexstr(LINE_BREAK) + ').'
-  NOT_INDICATOR     = unirex '(?!' + rexstr(INDICATOR) + ').'
-  NOT_FLOW_CHAR     = unirex '(?!' + rexstr(FLOW_CHAR) + ').'
-  NOT_ALLOWED_CHAR  = unirex '(?!' + rexstr(ALLOWED_CHAR) + ').'
-
-  #  BASIC CONSTRUCTS  #
-
-  ANY_WHITE_SPACE   = unirex rexstr(WHITE_SPACE) + '*'
-  ANY_ALLOWED_CHARS = unirex rexstr(ALLOWED_CHAR) + '*'
-  NEW_LINE          = unirex(
-    rexstr(ANY_WHITE_SPACE) + rexstr(LINE_BREAK)
-  )
-  SOME_NEW_LINES    = unirex(
-    '(?:' + rexstr(ANY_WHITE_SPACE) + rexstr(LINE_BREAK) + ')+'
-  )
-  POSSIBLE_STARTS   = unirex(
-    rexstr(DOCUMENT_START) + rexstr(/<p[^<>]*>/) + '?'
-  )
-  POSSIBLE_ENDS     = unirex(
-    rexstr(SOME_NEW_LINES) + '|' +
-    rexstr(DOCUMENT_END) + '|' +
-    rexstr(/<\/p>/)
-  )
-  CHARACTER_ESCAPE  = unirex(
-    rexstr(/\\/) +
-    '(?:' +
-      rexstr(ESCAPE_CHAR) + '|' +
-      rexstr(/x/) + rexstr(HEXADECIMAL_CHARS) + '{2}' + '|' +
-      rexstr(/u/) + rexstr(HEXADECIMAL_CHARS) + '{4}' + '|' +
-      rexstr(/U/) + rexstr(HEXADECIMAL_CHARS) + '{8}' +
-    ')'
-  )
-  ESCAPED_CHAR      = unirex(
-    rexstr(/(?!["\\])/) + rexstr(NOT_LINE_BREAK) + '|' +
-    rexstr(CHARACTER_ESCAPE)
-  )
-  ANY_ESCAPED_CHARS = unirex(
-    rexstr(ESCAPED_CHAR) + '*'
-  )
-  ESCAPED_APOS      = unirex(
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' + rexstr(/[^']|''/)
-  )
-  ANY_ESCAPED_APOS  = unirex(
-    rexstr(ESCAPED_APOS) + '*'
-  )
-  FIRST_KEY_CHAR    = unirex(
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-    '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-    rexstr(NOT_INDICATOR) + '|' +
-    rexstr(/[?:-]/) +
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-    '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-    '(?=' + rexstr(NOT_FLOW_CHAR) + ')'
-  )
-  FIRST_VALUE_CHAR  = unirex(
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-    '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-    rexstr(NOT_INDICATOR) + '|' +
-    rexstr(/[?:-]/) +
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-    '(?=' + rexstr(NOT_WHITE_SPACE) + ')'
-    #  Flow indicators are allowed in values.
-  )
-  LATER_KEY_CHAR    = unirex(
-    rexstr(WHITE_SPACE) + '|' +
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-    '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-    '(?=' + rexstr(NOT_FLOW_CHAR) + ')' +
-    rexstr(/[^:#]#?/) + '|' +
-    rexstr(/:/) + '(?=' + rexstr(NOT_WHITE_SPACE) + ')'
-  )
-  LATER_VALUE_CHAR  = unirex(
-    rexstr(WHITE_SPACE) + '|' +
-    '(?=' + rexstr(NOT_LINE_BREAK) + ')' +
-    '(?=' + rexstr(NOT_WHITE_SPACE) + ')' +
-    #  Flow indicators are allowed in values.
-    rexstr(/[^:#]#?/) + '|' +
-    rexstr(/:/) + '(?=' + rexstr(NOT_WHITE_SPACE) + ')'
-  )
-
-  #  YAML CONSTRUCTS  #
-
-  YAML_START        = unirex(
-    rexstr(ANY_WHITE_SPACE) + rexstr(/---/)
-  )
-  YAML_END          = unirex(
-    rexstr(ANY_WHITE_SPACE) + rexstr(/(?:---|\.\.\.)/)
-  )
-  YAML_LOOKAHEAD    = unirex(
-    '(?=' +
-      rexstr(YAML_START) +
-      rexstr(ANY_ALLOWED_CHARS) + rexstr(NEW_LINE) +
-      rexstr(YAML_END) + rexstr(POSSIBLE_ENDS) +
-    ')'
-  )
-  YAML_DOUBLE_QUOTE = unirex(
-    rexstr(/"/) + rexstr(ANY_ESCAPED_CHARS) + rexstr(/"/)
-  )
-  YAML_SINGLE_QUOTE = unirex(
-    rexstr(/'/) + rexstr(ANY_ESCAPED_APOS) + rexstr(/'/)
-  )
-  YAML_SIMPLE_KEY   = unirex(
-    rexstr(FIRST_KEY_CHAR) + rexstr(LATER_KEY_CHAR) + '*'
-  )
-  YAML_SIMPLE_VALUE = unirex(
-    rexstr(FIRST_VALUE_CHAR) + rexstr(LATER_VALUE_CHAR) + '*'
-  )
-  YAML_KEY          = unirex(
-    rexstr(YAML_DOUBLE_QUOTE) + '|' +
-    rexstr(YAML_SINGLE_QUOTE) + '|' +
-    rexstr(YAML_SIMPLE_KEY)
-  )
-  YAML_VALUE        = unirex(
-    rexstr(YAML_DOUBLE_QUOTE) + '|' +
-    rexstr(YAML_SINGLE_QUOTE) + '|' +
-    rexstr(YAML_SIMPLE_VALUE)
-  )
-  YAML_SEPARATOR    = unirex(
-    rexstr(ANY_WHITE_SPACE) +
-    ':' + rexstr(WHITE_SPACE) +
-    rexstr(ANY_WHITE_SPACE)
-  )
-  YAML_LINE         = unirex(
-    '(' + rexstr(YAML_KEY) + ')' +
-    rexstr(YAML_SEPARATOR) +
-    '(' + rexstr(YAML_VALUE) + ')'
-  )
-
-  #  FRONTMATTER REGEX  #
-
-  YAML_FRONTMATTER  = unirex(
-    rexstr(POSSIBLE_STARTS) +
-    rexstr(YAML_LOOKAHEAD) +
-    rexstr(YAML_START) + rexstr(SOME_NEW_LINES) +
-    '(?:' +
-      '(' + rexstr(INDENTATION) + ')' +
-      rexstr(YAML_LINE) + rexstr(SOME_NEW_LINES) +
-      '(?:' +
-        '\\1' + rexstr(YAML_LINE) + rexstr(SOME_NEW_LINES) +
-      '){0,4}' +
-    ')?' +
-    rexstr(YAML_END) + rexstr(POSSIBLE_ENDS)
-  )
-
-  #  SEARCHES  #
-
-  FIND_YAML_LINES   = unirex(
-    rexstr(NEW_LINE) + rexstr(INDENTATION) + rexstr(YAML_LINE)
-  )
-
-  #  STRING PROCESSING  #
-
-  def process_string(str)
-    case str[0]
-    when '"'
-      str[1..-2]
-    when "'"
-      str[1..-2].gsub(/''/, "'")
-    else
-      str
-    end
-  end
-
-  #  BIO PROCESSING  #
-
-  def process_bio content
-    result = {
-      text: content.gsub(/&quot;/, '"').gsub(/&apos;/, "'"),
-      metadata: []
-    }
-    yaml = YAML_FRONTMATTER.match(result[:text])
-    return result unless yaml
-    yaml = yaml[0]
-    start = YAML_START =~ result[:text]
-    ending = start + yaml.length - (YAML_START =~ yaml)
-    result[:text][start..ending - 1] = ''
-    metadata = nil
-    index = 0
-    while metadata = FIND_YAML_LINES.match(yaml, index) do
-      index = metadata.end(0)
-      result[:metadata].push [
-        process_string(metadata[1]), process_string(metadata[2])
-      ]
-    end
-    return result
-  end
-
-end
diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml
index b5653f161..4098d6778 100644
--- a/app/views/accounts/_header.html.haml
+++ b/app/views/accounts/_header.html.haml
@@ -1,4 +1,3 @@
-- processed_bio = FrontmatterHandler.instance.process_bio Formatter.instance.simplified_format(account, custom_emojify: true)
 .card.h-card.p-author{ style: "background-image: url(#{account.header.url(:original)})" }
   .card__illustration
     = render 'accounts/follow_button', account: account
@@ -24,21 +23,16 @@
         .roles
           .account-role.moderator
             = t 'accounts.roles.moderator'
+
     .bio
-      .account__header__content.p-note.emojify!=processed_bio[:text]
+      .account__header__content.p-note.emojify= Formatter.instance.simplified_format(account, custom_emojify: true)
 
-      - if !account.fields.empty?
+      - unless account.fields.empty?
         .account__header__fields
           - account.fields.each do |field|
             %dl
               %dt.emojify{ title: field.name }= field.name
               %dd.emojify{ title: field.value }= Formatter.instance.format_field(account, field.value, custom_emojify: true)
-      - elsif processed_bio[:metadata].length > 0
-        .account__header__fields
-          - processed_bio[:metadata].each do |i|
-            %dl
-              %dt.emojify{ title: i[0] }!= i[0]
-              %dd.emojify{ title: i[1] }!= i[1]
 
     .details-counters
       .counter{ class: active_nav_class(short_account_url(account)) }