docs: def main(md=None, filename=None, cols=None, theme=None, c_theme=None, bg=None,
           c_no_guess=None, display_links=None, from_txt=None, do_html=None,
           no_colors=None, **kw):
      """ md is markdown string. alternatively we use filename and read """
  
      args = locals()
      if not md:
          if not filename:
              print 'Using sample markdown:'
              make_sample()
              md = args['md'] = md_sample
              print md
              print
              print 'Styling Result'
          else:
              with open(filename) as f:
                  md = f.read()
  
      global term_columns
      # style rolers requested?
      if c_theme == 'all' or theme == 'all':
          args.pop('kw')
          themes = read_themes()
          for k, v in themes.items():
              if not filename:
                  yl = 'You like *%s*, *%s*?' % (k, v['name'])
                  args['md'] = md_sample.replace(you_like, yl)
              print col('%s%s%s' % ('\n\n', '=' * term_columns,'\n'), L)
              # should really create an iterator here:
              if theme == 'all':
                  args['theme'] = k
              else:
                  args['c_theme'] = k
              print main(**args)
          return ''
  
      if cols:
          term_columns = int(cols)
  
      global show_links
      show_links = display_links
  
      if bg and bg == 'light':
          # not in use rite now:
          global background, color
          background = BGL
          color = T
  
      set_theme(theme)
  
      global guess_lexer
      guess_lexer = not c_no_guess
  
      if not c_theme:
          c_theme = theme or 'default'
  
      if c_theme == 'None':
          c_theme = None
  
      if c_theme:
          set_theme(c_theme, for_code=1)
  
      if c_theme or c_guess:
          # info:
          if not have_pygments:
              print col('No pygments, can not analyze code for hilite', R)
  
  
      # Create an instance of the Markdown class with the new extension
      MD = markdown.Markdown(extensions=[AnsiPrintExtension(),
                                         TableExtension(),
                                         fenced_code.FencedCodeExtension()])
      # html?
      the_html = MD.convert(md)
      if do_html:
          return the_html
  
      # who wants html, here is our result:
      try:
          ansi = MD.ansi
      except:
          if html:
              # can this happen? At least show:
              print "we have markdown result but no ansi."
              print html
          else:
              ansi = 'n.a. (no parsing result)'
  
      # The RAW html within source, incl. fenced code blocks:
      # phs are numbered like this in the md, we replace back:
      PH = markdown.util.HTML_PLACEHOLDER
      stash = MD.htmlStash
      nr = -1
      tags = Tags()
      for ph in stash.rawHtmlBlocks:
          nr += 1
          raw = html_parser.unescape(ph[0])
          pre = '<pre><code'
          if raw.startswith(pre):
              pre, raw = raw.split(pre, 1)
              raw = raw.split('>', 1)[1].rsplit('</code>', 1)[0]
              if 'class="' in pre:
                  # language:
                  lang = pre.split('class="', 1)[1].split('"')[0]
              else:
                  lang = ''
              raw = tags.code(raw.strip(), from_fenced_block=1, lang=lang)
          ansi = ansi.replace(PH % nr, raw)
  
      # don't want these: gone through the extension now:
      # ansi = ansi.replace('```', '')
  
      # sub part display (the -f feature)
      if from_txt:
          if not from_txt.split(':', 1)[0] in ansi:
              # display from top then:
              from_txt = ansi.strip()[1]
          from_txt, mon_lines = (from_txt + ':%s' % (term_rows-6)).split(':')[:2]
          mon_lines = int(mon_lines)
          pre, post = ansi.split(from_txt, 1)
          post = '\n'.join(post.split('\n')[:mon_lines])
          ansi = '\n(...)%s%s%s' % (
                 '\n'.join(pre.rsplit('\n', 2)[-2:]), from_txt, post)
  
      ansi = set_hr_widths(ansi) + '\n'
      if no_colors:
          return clean_ansi(ansi)
      return ansi + '\n'