old_contents: #
  #
  
  # Copyright (C) 2012 Google Inc.
  #
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 2 of the License, or
  # (at your option) any later version.
  #
  # This program is distributed in the hope that it will be useful, but
  # WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  # General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  # 02110-1301, USA.
  
  
  """Pygments lexer for our custom shell example sessions.
  
  The lexer support the following custom markup:
  
    - comments: # this is a comment
    - command lines: '$ ' at the beginning of a line denotes a command
    - variable input: %input% (works in both commands and screen output)
    - otherwise, regular text output from commands will be plain
  
  """
  
  from pygments.lexer import RegexLexer, bygroups, include
  from pygments.token import Name, Text, Generic, Comment
  
  
  class ShellExampleLexer(RegexLexer):
    name = "ShellExampleLexer"
    aliases = "shell-example"
    filenames = []
  
    tokens = {
      "root": [
        include("comments"),
        include("userinput"),
        # switch to state input on '$ ' at the start of the line
        (r"^\$ ", Text, "input"),
        (r"\s+", Text),
        (r"[^#%\s]+", Text),
        ],
      "input": [
        include("comments"),
        include("userinput"),
        (r"[^%\\\s]+", Generic.Strong),
        (r"\\\n", Generic.Strong),
        (r"\\", Generic.Strong),
        # switch to prev state at non-escaped new-line
        (r"\n", Text, "#pop"),
        (r"\s+", Text),
        ],
      "comments": [
        (r"#.*\n", Comment.Single),
        ],
      "userinput": [
        (r"\\%", Text),
        (r"(%)([^%]*)(%)", bygroups(None, Name.Variable, None)),
        ],
      }
  
  
  def setup(app):
    app.add_lexer("shell-example", ShellExampleLexer())
  
new_contents: #
  #
  
  # Copyright (C) 2012 Google Inc.
  #
  # This program is free software; you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation; either version 2 of the License, or
  # (at your option) any later version.
  #
  # This program is distributed in the hope that it will be useful, but
  # WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  # General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  # 02110-1301, USA.
  
  
  """Pygments lexer for our custom shell example sessions.
  
  The lexer support the following custom markup:
  
    - comments: # this is a comment
    - command lines: '$ ' at the beginning of a line denotes a command
    - variable input: %input% (works in both commands and screen output)
    - otherwise, regular text output from commands will be plain
  
  """
  
  from pygments.lexer import RegexLexer, bygroups, include
  from pygments.token import Name, Text, Generic, Comment
  
  
  class ShellExampleLexer(RegexLexer):
    name = "ShellExampleLexer"
    aliases = "shell-example"
    filenames = []
  
    tokens = {
      "root": [
        include("comments"),
        include("userinput"),
        # switch to state input on '$ ' at the start of the line
        (r"^\$ ", Text, "input"),
        (r"\s+", Text),
        (r"[^#%\s\\]+", Text),
        (r"\\", Text),
        ],
      "input": [
        include("comments"),
        include("userinput"),
        (r"[^#%\s\\]+", Generic.Strong),
        (r"\\\n", Generic.Strong),
        (r"\\", Generic.Strong),
        # switch to prev state at non-escaped new-line
        (r"\n", Text, "#pop"),
        (r"\s+", Text),
        ],
      "comments": [
        (r"#.*\n", Comment.Single),
        ],
      "userinput": [
        (r"(\\)(%)", bygroups(None, Text)),
        (r"(%)([^%]*)(%)", bygroups(None, Name.Variable, None)),
        ],
      }
  
  
  def setup(app):
    app.add_lexer("shell-example", ShellExampleLexer())
  
subject: Fix escaping of percent signs in the shell lexer