lib/handlers/text.js
function needsSpace(a, b) {
  var aa = a.slice(-1);
  var bb = b.charAt(0);

  if (bb === '.' && /\w/.test(b.charAt(1)) && aa !== '\n') {
    return true;
  }

  if (utils.isEndingChar(bb)) {
    return false;
  }

  if (aa === '`' && !/\s/.test(a.charAt(a.length - 2))) {
    return true;
  }

  if (/[*_]/.test(aa) && /\w/.test(bb)) {
    return true;
  }

  if (utils.isOpeningChar(aa)) {
    return false;
  }

  if (utils.isTightSeparator(aa) || utils.isTightSeparator(bb)) {
    return false;
  }

  if ((utils.isLooseSeparator(aa) || utils.isLooseSeparator(bb)) && !/\s/.test(aa)) {
    return true;
  }

  if (/\s/.test(aa) && utils.isStartingChar(bb)) {
    return false;
  }

  if (utils.isWrappingChar(aa) && utils.isStartingChar(bb)) {
    return true;
  }

  if (utils.isEndingChar(aa) && !/<br>$/.test(a) && !/\s/.test(bb) && !utils.isEndingChar(bb)) {
    return true;
  }

  if ((utils.isStartingChar(bb) || utils.isWrappingChar(bb) || utils.isWrappingChar(aa)) && !utils.isStartingChar(aa)) {
    return true;
  }

  if (utils.isWordChar(aa) && utils.isWordChar(bb)) {
    return true;
  }

  if (/\W/.test(bb) && !utils.isStartingChar(bb) && !utils.isOpeningChar(bb) && !utils.isEndingChar(bb) && !utils.isSpecialChar(bb) && !utils.isSeparator(bb) && !utils.isStartingChar(aa)) {
    return true;
  }

  return false;
}
function needsSpace(a, b) {
  var aa = a.slice(-1);
  var bb = b.charAt(0);

  if (bb === '.' && /\w/.test(b.charAt(1)) && aa !== '\n') {
    return true;
  }

  if (utils.isEndingChar(bb)) {
    return false;
  }

  if (aa === '`' && !/\s/.test(a.charAt(a.length - 2))) {
    return true;
  }

  if (/[*_]/.test(aa) && /\w/.test(bb)) {
    return true;
  }

  if (utils.isOpeningChar(aa)) {
    return false;
  }

  if (utils.isTightSeparator(aa) || utils.isTightSeparator(bb)) {
    return false;
  }

  if ((utils.isLooseSeparator(aa) || utils.isLooseSeparator(bb)) && !/\s/.test(aa)) {
    return true;
  }

  if (/\s/.test(aa) && utils.isStartingChar(bb)) {
    return false;
  }

  if (utils.isWrappingChar(aa) && utils.isStartingChar(bb)) {
    return true;
  }

  if (utils.isEndingChar(aa) && !/<br>$/.test(a) && !/\s/.test(bb) && !utils.isEndingChar(bb)) {
    return true;
  }

  if ((utils.isStartingChar(bb) || utils.isWrappingChar(bb) || utils.isWrappingChar(aa)) && !utils.isStartingChar(aa)) {
    return true;
  }

  if (utils.isWordChar(aa) && utils.isWordChar(bb)) {
    return true;
  }

  if (/\W/.test(bb) && !utils.isStartingChar(bb) && !utils.isOpeningChar(bb) && !utils.isEndingChar(bb) && !utils.isSpecialChar(bb) && !utils.isSeparator(bb) && !utils.isStartingChar(aa)) {
    return true;
  }

  return false;
}
function needsSpace ( a , b ) { var aa = a . slice ( - 1 ) ; var bb = b . charAt ( 0 ) ; if ( bb === '.' && / \w / . test ( b . charAt ( 1 ) ) && aa !== '\n' ) { return true ; } if ( utils . isEndingChar ( bb ) ) { return false ; } if ( aa === '`' && ! / \s / . test ( a . charAt ( a . length - 2 ) ) ) { return true ; } if ( / [*_] / . test ( aa ) && / \w / . test ( bb ) ) { return true ; } if ( utils . isOpeningChar ( aa ) ) { return false ; } if ( utils . isTightSeparator ( aa ) || utils . isTightSeparator ( bb ) ) { return false ; } if ( ( utils . isLooseSeparator ( aa ) || utils . isLooseSeparator ( bb ) ) && ! / \s / . test ( aa ) ) { return true ; } if ( / \s / . test ( aa ) && utils . isStartingChar ( bb ) ) { return false ; } if ( utils . isWrappingChar ( aa ) && utils . isStartingChar ( bb ) ) { return true ; } if ( utils . isEndingChar ( aa ) && ! / <br>$ / . test ( a ) && ! / \s / . test ( bb ) && ! utils . isEndingChar ( bb ) ) { return true ; } if ( ( utils . isStartingChar ( bb ) || utils . isWrappingChar ( bb ) || utils . isWrappingChar ( aa ) ) && ! utils . isStartingChar ( aa ) ) { return true ; } if ( utils . isWordChar ( aa ) && utils . isWordChar ( bb ) ) { return true ; } if ( / \W / . test ( bb ) && ! utils . isStartingChar ( bb ) && ! utils . isOpeningChar ( bb ) && ! utils . isEndingChar ( bb ) && ! utils . isSpecialChar ( bb ) && ! utils . isSeparator ( bb ) && ! utils . isStartingChar ( aa ) ) { return true ; } return false ; }
a => ending character
b => starting character
a = > ending character b = > starting character