code: def get_groups_markdown():
      """Generate markdown for function groups using the Abstract API
  
      Returns a dictionary of group_name -> documentation for group functions
      """
  
      def unpluralize(noun):
          if noun.endswith("s"):
              if len(noun) > 2 and noun[-2] not in ["'", "e"]:
                  return noun[:-1]
          return noun
  
      doc_links = get_doc_links()
      ret = {}
      for group, funcs in talib.get_function_groups().items():
          h1 = "# %s" % unpluralize(group)
          h1 = h1 + " Functions" if "Function" not in h1 else h1 + "s"
          group_docs = [h1]
          for func in funcs:
              # figure out this function's options
              f = Function(func)
              inputs = f.info["input_names"]
              if "price" in inputs and "prices" in inputs:
                  names = [inputs["price"]]
                  names.extend(inputs["prices"])
                  input_names = ", ".join(names)
              elif "prices" in inputs:
                  input_names = ", ".join(inputs["prices"])
              else:
                  input_names = ", ".join(
                      [x for x in inputs.values() if x]
                  )
  
              params = ", ".join(
                  [
                      "%s=%i" % (param, default)
                      for param, default in f.info["parameters"].items()
                  ]
              )
              outputs = ", ".join(f.info["output_names"])
  
              # print the header
              group_docs.append(
                  "### %s - %s" % (func, f.info["display_name"])
              )
  
              if (
                  f.function_flags
                  and "Function has an unstable period"
                  in f.function_flags
              ):
                  group_docs.append(
                      "NOTE: The ``%s`` function has an unstable period.  "
                      % func
                  )
  
              # print the code definition block
              group_docs.append("```python")
              if params:
                  group_docs.append(
                      "%s = %s(%s, %s)"
                      % (outputs, func.upper(), input_names, params)
                  )
              else:
                  group_docs.append(
                      "%s = %s(%s)"
                      % (outputs, func.upper(), input_names)
                  )
              group_docs.append("```\n")
  
              # print extra info if we can
              if func in doc_links:
                  group_docs.append(
                      "Learn more about the %s at [tadoc.org](%s).  "
                      % (f.info["display_name"], doc_links[func])
                  )
  
          group_docs.append("\n[Documentation Index](../doc_index.md)")
          group_docs.append(
              "[FLOAT_RIGHTAll Function Groups](../funcs.md)"
          )
  
          ret[slugify(group)] = "\n".join(group_docs) + "\n"
      return ret
  
file_path: ta-lib-python/docs/generate_html_pages.py
imports: from __future__ import print_function
  import os
  import sys
  import talib
  import mistune
  from pygments import highlight
  from pygments.lexers import get_lexer_by_name
  from pygments.formatters.html import HtmlFormatter
  from bs4 import BeautifulSoup
  from talib.abstract import Function
label_desc: Use image node_id 4 for calling a global function with example usage: get_groups_markdown() and returns: ret, noun, noun