text: // Parse abbreviation definitions, i.e. `*[abbr]: description`
  //
  
  import StateInline from '../rules_inline/state_inline';
  import parseLinkLabel from '../helpers/parse_link_label';
  
  
  function parseAbbr(str, parserInline, options, env) {
    var state, labelEnd, pos, max, label, title;
  
    if (str.charCodeAt(0) !== 0x2A/* * */) { return -1; }
    if (str.charCodeAt(1) !== 0x5B/* [ */) { return -1; }
  
    if (str.indexOf(']:') === -1) { return -1; }
  
    state = new StateInline(str, parserInline, options, env, []);
    labelEnd = parseLinkLabel(state, 1);
  
    if (labelEnd < 0 || str.charCodeAt(labelEnd + 1) !== 0x3A/* : */) { return -1; }
  
    max = state.posMax;
  
    // abbr title is always one line, so looking for ending "\n" here
    for (pos = labelEnd + 2; pos < max; pos++) {
      if (state.src.charCodeAt(pos) === 0x0A) { break; }
    }
  
    label = str.slice(2, labelEnd);
    title = str.slice(labelEnd + 2, pos).trim();
    if (title.length === 0) { return -1; }
    if (!env.abbreviations) { env.abbreviations = {}; }
    // prepend ':' to avoid conflict with Object.prototype members
    if (typeof env.abbreviations[':' + label] === 'undefined') {
      env.abbreviations[':' + label] = title;
    }
  
    return pos;
  }
  
  export default function abbr(state) {
    var tokens = state.tokens, i, l, content, pos;
  
    if (state.inlineMode) {
      return;
    }
  
    // Parse inlines
    for (i = 1, l = tokens.length - 1; i < l; i++) {
      if (tokens[i - 1].type === 'paragraph_open' &&
          tokens[i].type === 'inline' &&
          tokens[i + 1].type === 'paragraph_close') {
  
        content = tokens[i].content;
        while (content.length) {
          pos = parseAbbr(content, state.inline, state.options, state.env);
          if (pos < 0) { break; }
          content = content.slice(pos).trim();
        }
  
        tokens[i].content = content;
        if (!content.length) {
          tokens[i - 1].tight = true;
          tokens[i + 1].tight = true;
        }
      }
    }
  };
  