There are a lot of plugins for Leo, but it's hard to know what they all 
do.  Some of them are mentioned in various Leo documentation, but I find it 
hard to find and understand when I wonder about a particular one.  So I 
wrote a Python script to extract the docstring from each .py file in the 
plugins directory.  The script and results are attached.

It's a little tricky to do because the various docstrings are formatted 
differently, use both kinds of multi-line quotes (""" and '''), and have 
sentinals.  The script extracts the first three non-blank, non-sentinal 
docstring lines.  Note that the script hard-codes my own plugins directory, 
so make sure to change that if you want to use it yourself.

I'm not going to pretend the results are perfect, but at least you get all 
the basic information in one place.

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/leo-editor/5f69d256-0bfa-48ee-af62-90de9d511c85n%40googlegroups.com.
active_path.py
--------------
Synchronizes \@path nodes with folders.
If a node is named '\@path *<path_to_folder>*', the content (file and folder
names) of the folder and the children of that node will synchronized whenever

add_directives.py
-----------------
Allows users to define new @direcives.

anki.py
-------
 Push @anki nodes.
- Download instructions here: https://apps.ankiweb.net/#linux
- Once Anki installed, install the AnkiConnect extension: 
https://ankiweb.net/shared/info/2055492159

attrib_edit.py
--------------
 Edits user attributes in a Qt frame.
This plugin creates a frame for editing attributes similar to::
    Name:   Fred Blogs

at_folder.py
------------
Synchronizes @folder nodes with folders.
If a node is named '\@folder *<path_to_folder>*', the content (filenames) of the
folder and the children of that node will be sync. Whenever a new file is put

at_produce.py
-------------
 Executes commands in nodes whose body text starts with @produce.
WARNING: trying to execute a non-existent command will hang Leo.
To use, put in the body text of a node::

at_view.py
----------
 Adds support for \@clip, \@view and \@strip nodes.
- Selecting a headline containing \@clip appends the contents of the clipboard 
to
  the end of the body pane.

auto_colorize2_0.py
-------------------
 Manipulates appearance of individual tree widget items based on Yaml file.
Settings are defined in a node labeled "Headline Formats".
By Adrian Calvin.

backlink.py
-----------
Allows arbitrary links between nodes.
FIXME: add more docs.
@Settings

baseNativeTree.py
-----------------
No match

bibtex.py
---------
 Creates a BibTex file from an  '@bibtex <filename>' tree.
Nodes of the form '@<x> key' create entries in the file.
When the user creates a new node (presses enter in headline text) the plugin

bigdash.py
----------
Global search window
Use the global-search command to show this window.
To restore the original appearance of the window, type help.

bookmarks.py
------------
 Manage bookmarks in a list, and show bookmarks in a pane.
This plugin has two bookmark related functions.  It manages nodes that
contain bookmarks, and can also display those nodes in a special

bzr_qcommands.py
----------------
 Adds a context menu to each node containing all the commands in the bzr Qt
interface. Bzr is invoked based on the path of the current node.
*Requires contextmenu.py.*

chapter_hoist.py
----------------
 Creates hoist buttons.
This plugin puts two buttons in the icon area: a button called 'Save Hoist' and
a button called 'Dehoist'. The 'Save Hoist' button hoists the presently selected

colorize_headlines.py
---------------------
 Manipulates appearance of individual tree widget items. (Qt only).
This plugin is mostly an example of how to change the appearance of headlines. 
As
such, it does a relatively mundane chore of highlighting @thin, @auto, @shadow

contextmenu.py
--------------
 Defines various useful actions for context menus (Qt only).
Examples are:
- Edit in $EDITOR

ctagscompleter.py
-----------------
 This plugin uses ctags to provide an autocompletion list.
Requirements:
    - Exuberant Ctags:

cursesGui.py
------------
A minimal text-oriented gui.

cursesGui2.py
-------------
A curses gui for Leo using npyscreen.
The ``--gui=curses`` command-line option enables this plugin.
**Warnings**

datenodes.py
------------
Allows users to insert headlines containing dates.
'Date nodes' are nodes that have dates in their headlines. They may be added to
the outline one at a time, a month's-worth at a time, or a year's-worth at a

debugger_pudb.py
----------------
 Makes g.pdb() enter the Pudb debugger instead of pdb.
Pudb is a full-screen Python debugger:
http://pypi.python.org/pypi/pudb

demo.py
-------
A plugin that makes making Leo demos easy. See:
https://github.com/leo-editor/leo-editor/blob/master/leo/doc/demo.md
generated in LeoDocs.leo: demo.md

dragdropgoodies.py
------------------
Adds "Back" and "Forward" buttons (Qt only).
Creates "back" and "forward" buttons on button bar. These navigate
the node history.

dtest.py
--------
 Sends code to the doctest module and reports the result.
When the Dtest plugin is enabled, the ``dtest`` command is active.
Typing::

dump_globals.py
---------------
Dumps Python globals at startup.

empty_leo_file.py
-----------------
Allows Leo to open any empty file as a minimal .leo file.

enable_gc.py
------------
Enables debugging and tracing for Python's garbage collector.

example_rst_filter.py
---------------------
Filters for the rst3 command.

expfolder.py
------------
 Adds @expfolder nodes that represent folders in the file system.
The double-click-icon-box command on an @expfolder node reads the files in
the directory at the path specified and creates child nodes for each file

FileActions.py
--------------
 Defines actions taken when double-clicking on @<file> nodes and supports
@file-ref nodes.
The double-click-icon-box command on any kind of @<file> node writes out

freewin.py
----------
Freewin - a plugin with a basic editor pane that tracks an outline node.
Provides a free-floating window tied to one node in an outline.
The window functions as a plain text editor, and can also be

free_layout.py
--------------
Free layout
===========
Adds flexible panel layout through context menus on the handles between panels.

ftp.py
------
Uploading of file by ftp.

geotag.py
---------
 Tags nodes with latitude and longitude. 

gitarchive.py
-------------
 Store snapshots of outline in git.

graphcanvas.py
--------------
Provides a widget for displaying graphs (networks) in Leo.
graphcanvas has one command:
`graph-toggle-autoload`

history_tracer.py
-----------------
This plugin cooperates with leo-ver-serv utilty.
   To install leo-ver-serv visit https://crates.io/crates/leo-ver-serv
   In idle time, whenever user has no activity in last 5 seconds,

import_cisco_config.py
----------------------
 Allows the user to import Cisco configuration files.
Adds the "File:Import:Import Cisco Configuration" menu item. The plugin will:
1)  Create a new node, under the current node, where the configuration will be

initinclass.py
--------------
 Modifies the Python @auto importer so that the importer
puts the __init__ method (ctor) into the body of the class node.
This makes it easier to keep the instance variable docs in the class

interact.py
-----------
 Adds buttons so Leo can interact with command line environments.
:20100226: see also leoscreen.py for a simpler approach.
Currently implements `bash` shell and `psql` (postresql SQL db shell).

jinjarender.py
--------------
 Render @jinja nodes.
- sudo apt-get install python-jinja2
Create headline like this:

leocursor.py
------------
 Creates a LeoCursor object that can walk around a Leo outline and decode
attributes from nodes.
Node names can be used through . (dot) notation so ``cursor.Data.Name._B`` for

leofeeds.py
-----------
Read feeds from rss / atom / whatever sources
Usage: Create node with a headline like:
    @feed http://www.planetqt.org/atom.xml

leoflexx.py
-----------
flexx.py: LeoWapp (Leo as a web browser), implemented using flexx:
https://flexx.readthedocs.io/en/stable/
Start Leo using the --gui=browser option. Like this::

leoflexx_js.py
--------------
A Stand-alone prototype for Leo using flexx.

leofts.py
---------
 map gnx => vnode 

leomail.py
----------
Sync local mailbox files over to Leo.
Creates mail-refresh command, which can only be applied to @mbox nodes of the 
form:
    @mbox <path to .mbox file>

leomylyn.py
-----------
 Provides an experience like Mylyn:http://en.wikipedia.org/wiki/Mylyn for Leo.
It "scores" the nodes based on how interesting they probably are for you,
allowing you to focus on your "working set".

leoOPML.py
----------
A plugin to read and write Leo outlines in .opml
(http://en.wikipedia.org/wiki/OPML) format.
The OPML plugin creates two new commands that read and write Leo outlines in

leoremote.py
------------
 Remote control for Leo.
    NOTE: as of 2015-07-29 the http://localhostL:8130/_/exec/ mode of
    the mod_http plug-in is intended to replace this module's functionality.

leoscreen.py
------------
Allows interaction with shell apps via screen.
status: daily-use py2.7 Wed Aug  5 09:30:38 2015
Analysis environments like SQL, R, scipy, ipython, etc. can be

leowapp.py
----------
This file is deprecated/obsolete. It may be removed soon.
leoflexx.py implements LeoWapp using flexx.

leo_cloud.py
------------
leo_cloud.py - synchronize Leo subtrees with remote central server
Terry N. Brown, [email protected], Fri Sep 22 10:34:10 2017
This plugin allows subtrees within a .leo file to be stored in the cloud. It

leo_cloud_server.py
-------------------
leo_cloud.py - synchronize Leo subtrees with remote central server
Terry N. Brown, [email protected], Fri Sep 22 10:34:10 2017
(this is the server half, see also leo_cloud.py for the Leo plugin)

leo_interface.py
----------------
 Allows the user to browse XML documents in Leo.
This plugin implements an interface to XML generation,
so that the resulting file can be processed by leo.

leo_mypy_plugin.py
------------------
A mypy plugin to add annotations for Leo's standard names,
such as c, p, i, j, k, n, s, w, etc.

leo_pdf.py
----------
This NOT a Leo plugin: this is a docutils writer for .pdf files.
That file uses the reportlab module to convert html markup to pdf.
The original code written by Engelbert Gruber.

leo_to_html.py
--------------
Converts a leo outline to an html web page.
This plugin takes an outline stored in Leo and converts it to html which is then
either saved in a file or shown in a browser. It is based on the original

leo_to_rtf.py
-------------
 Outputs a Leo outline as a numbered list to an RTF file. The RTF file
can be loaded into Microsoft Word and formatted as a proper outline.
This plug-in loads installs an "Outline to Microsoft RTF" menu item in your

lineNumbers.py
--------------
 Adds #line directives in perl and perlpod programs.
Over-rides two methods in leoAtFile.py to write #line directives after node
sentinels. This allows compilers to give locations of errors in relation to the

line_numbering.py
-----------------
This plugin makes line numbers in gutter (if used), to represent
   real line numbers in generated file. Root of file is either a
   first of ancestor nodes with heading at-(file,clean,...), or first

livecode.py
-----------
Show results of code in another pane as it's edited.
livecode-show opens the livecode pane on c.p.
Thereafter, pressing return in that body pane re-evaluates the code.

macros.py
---------
 Creates new nodes containing parameterized section reference.
.. No longer available: http://sourceforge.net/forum/message.php?msg_id=2444117
This plugin adds nodes under the currently selected tree that are to act as

markup_inline.py
----------------
Commands to go with keybindings in @settings-->@keys-->@shortcuts
to implement Ctrl-B,I,U Bold Italic Underline markup in plain text.
RST flavored, could be made language aware.

maximizeNewWindows.py
---------------------
Maximizes all new windows.

md_docer.py
-----------
This plugin adds few commands for those who use Leo for writing
   markdown documentation with code samples taken from real source
   files.

mime.py
-------
 Opens files with their default platform program.
The double-click-icon-box command on @mime nodes will attempt to open the
named file as if opened from a file manager. \@path parent nodes are used

mnplugins.py
------------
mnplugins.py
mnplugins shows how to :
define new Commands  "insertOK" + "insertUser"

mod_autosave.py
---------------
 Autosaves the Leo outline every so often.
The time between saves is given by the setting, with default as shown::
    @int mod_autosave_interval = 300

mod_framesize.py
----------------
 Sets a hardcoded frame size.
Prevents Leo from setting custom frame size (e.g. from an external .leo
document)

mod_http.py
-----------
An http plug-in for LEO, based on AsyncHttpServer.py.
Adapted and extended from the Python Cookbook:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/259148

mod_leo2ascd.py
---------------
Return True if the plugin has loaded successfully.

mod_read_dir_outline.py
-----------------------
Allows Leo to read a complete directory tree into a Leo outline. Converts
directories into headlines and puts the list of file names into bodies.
Ce plug-in permet de traduire l'arborescence d'un répertoire en une arborescence

mod_scripting.py
----------------
This plugin script buttons and eval* commands.
Overview of script buttons
--------------------------

mod_speedups.py
---------------
 Experimental speedups
Various optimizations. Use at your own risk.
If stuff breaks, disable this plugin before reporting bugs.

mod_timestamp.py
----------------
 Timestamps all save operations to show when they occur.

multifile.py
------------
 Allows Leo to write a file to multiple locations.
This plugin acts as a post-write mechanism, a file must be written to the
file system for it to work. At this point it is not a replacement for @path or 
an

nav_qt.py
---------
Adds "Back" and "Forward" buttons (Qt only).
Creates "back" and "forward" buttons on button bar. These navigate
the node history.

nested_splitter.py
------------------
Nested splitter classes.

niceNosent.py
-------------
 Ensures that all descendants of @file-nosent nodes end
with exactly one newline, replaces all tabs with spaces, and
adds a newline before class and functions in the derived file.

nodeActions.py
--------------
 Allows the definition of double-click actions.
Calling the nodeaction-act command or double-clicking a node causes this plugin
checks for a match of the clicked node's headline text with a list of

nodediff.py
-----------
Provides commands to run text diffs on node bodies within Leo.
By Jacob M. Peck
Configuration Settings

nodetags.py
-----------
Provides node tagging capabilities to Leo
By Jacob M. Peck
API

nodewatch.py
------------
Provides a GUI in the Log pane (tab name 'Nodewatch') that lists node headlines.
The nodes that show up in this GUI are scriptable on a per-outline basis, with
@nodewatch nodes.

notebook.py
-----------
 QML Notebook
Edit several nodes at once, in a pannable "notebook" view.
Use <Alt-x>nb-<tab> to see the list of commands.

open_shell.py
-------------
 Creates an 'Extensions' menu containing two commands:
Open Console Window and Open Explorer.
The Open Console Window command opens xterm on Linux.

outline_export.py
-----------------
Modifies the way exported outlines are written.

paste_as_headlines.py
---------------------
 Creates new headlines from clipboard text.
If the pasted text would be greater than 50 characters in length, the plugin
truncates the headline to 50 characters and pastes the entire line into the body

patch_python_colorizer.py
-------------------------
Shows how to patch python colorizer.

plugins_menu.py
---------------
 Creates a Plugins menu and adds all actives plugins to it.
Selecting these menu items will bring up a short **About Plugin** dialog
with the details of the plugin. In some circumstances a submenu will be created

projectwizard.py
----------------
 Creates a wizard that creates @auto nodes.
Opens a file dialog and recursively creates @auto & @path nodes from the path
where the selected file is (the selected file itself doesn't matter.)

pyplot_backend.py
-----------------
    A helper for the viewrendered plugin.
    This is *NOT* a real plugin.

python_terminal.py
------------------
Provides an interactive python terminal in the log pane.
**Warning**: Use at your own risk.
Numerous significant problems have been reported, including segfaults.

QNCalendarWidget.py
-------------------
QNCalendarWidget.py - a QCalendarWidget which shows N months at a time.
Not a full QCalendarWidget implementation, just enough to work
with a QDateEdit (QNDateEdit) in a particular context.

qtGui.py
--------
qt gui plugin.

qt_commands.py
--------------
Leo's Qt-related commands defined by @g.command.

qt_events.py
------------
Leo's Qt event handling code.

qt_frame.py
-----------
Leo's qt frame classes.

qt_gui.py
---------
This file contains the gui wrapper for Qt: g.app.gui.

qt_idle_time.py
---------------
Leo's Qt idle-time code.

qt_main.py
----------
No docstring

qt_quickheadlines.py
--------------------
qt_quickheadlines plugin.

qt_quicksearch.py
-----------------
No docstring

qt_quicksearch_sub.py
---------------------
No docstring

qt_text.py
----------
Text classes for the Qt version of Leo

qt_tree.py
----------
Leo's Qt tree class.

quickMove.py
------------
Creates buttons to move nodes quickly to other nodes.
Quickly move/copy/clone nodes from around the tree to one or more target nodes.
It can also create bookmark and tagging functionality in an outline (see `Set

quicksearch.py
--------------
Adds a fast-to-use search widget, like the "Find in files" feature of many 
editors.
Quicksearch searches node headlines only, *not* body text
Just load the plugin, activate "Nav" tab, enter search text and press enter.

quit_leo.py
-----------
 Shows how to force Leo to quit.

read_only_nodes.py
------------------
 Creates and updates @read-only nodes.
Here's my first attempt at customizing leo. I wanted to have the ability to
import files in "read-only" mode, that is, in a mode where files could only

redirect_to_log.py
------------------
Sends all output to the log pane.

richtext.py
-----------
richtext.py - Rich text editing
===============================
This plugin allows you to use CKEditor__ to edit rich text

rss.py
------
Adds primitive RSS reader functionality to Leo.
By Jacob M. Peck.
RSS feeds

rst3.py
-------
 Creates output files from Leo outlines containing rST (reStructuredText)
markup. This plugin has been superseded by Leo's core rst3 command.
This is a powerful plugin with many options.  The full documentation is at:

run_nodes.py
------------
 Runs a program and interface Leo through its input/output/error streams.
The double-click-icon-box command on a node whose headlines is @run 'cmd args' 
will execute
the command. There are several other features, including @arg and @input nodes.

screencast.py
-------------
Overview
========
This plugin is a tool for people wanting to demonstrate Leo or some Leonine

screenshots.py
--------------
 Creates stand-alone slideshows containing screenshots.
This plugin defines five commands. The
**help-for-slides** command prints this message to

screen_capture.py
-----------------
screen_capture.py
=================
Capture screen shots - single frames are useful.  The

script_io_to_body.py
--------------------
Sends output from the Execute Script command to the end of the body pane.

setHomeDirectory.py
-------------------
Sets g.app.homeDir to a hard-coded path.

settings_finder.py
------------------
Let the user pick settings from a menu, find the relevant @settings nodes and 
open them.

sftp.py
-------
@edit-like functionality for remote files over SFTP
By Jacob M. Peck
@sftp nodes

slideshow.py
------------
 Supports slideshows in Leo outlines.
This plugin defines four new commands:
- next-slide-show:  move to the start of the next slide show,

spydershell.py
--------------
 Launches the spyder environment with access to Leo instance.
See http://packages.python.org/spyder/
Execute alt-x spyder-launch to start spyder. Execute alt-x spyder-update to pass

startfile.py
------------
Launches (starts) a file given by a headline when executing the
double-click-icon-box
This plugin ignores headlines starting with an '@'. Uses the @folder path if the

stickynotes.py
--------------
 Adds simple "sticky notes" feature (popout editors) for Qt gui.
Adds the following (``Alt-X``) commands:
``stickynote``

stickynotes_plus.py
-------------------
 Adds simple "sticky notes" feature (popout editors) for Qt gui.
alt-x stickynote to pop out current node as a note.

systray.py
----------
systray

tables.py
---------
A plugin that inserts tables, inspired by org mode tables:
Written by Edward K. Ream, February 17, 2017.

testRegisterCommand.py
----------------------
A plugin to test k.registerCommand.

textnode.py
-----------
 Supports @text nodes for reading and writing external files.
This plugin has been superceded by @edit nodes.
The @text node is for embedding text files in a leo node that won't be

threadutil.py
-------------
Return True if the plugin has loaded successfully.

timestamp.py
------------
If this plugin is enabled, the following node attributes will be managed:
    - str_ctime: creation time
    - str_mtime: time node was last modified

todo.py
-------
 Provides to-do list and simple task management.
This plugin adds time required, progress and priority settings for nodes. With
the @project tag a branch can display progress and time required with dynamic

tomboy_import.py
----------------
 Allows imports of notes created in Tomboy / gnote.
Usage:
* Create a node with the headline 'tomboy'

trace_gc_plugin.py
------------------
 Traces changes to Leo's objects at idle time.

trace_keys.py
-------------
 Traces keystrokes in the outline and body panes.

trace_tags.py
-------------
 Trace most common hooks, but not key, drag or idle hooks.

valuespace.py
-------------
Supports Leo scripting using per-Leo-outline namespaces.
Commands
========

viewrendered.py
---------------
Creates a window for *live* rendering of reSTructuredText, markdown text,
images, movies, sounds, rst, html, jupyter notebooks, etc.
Dependencies

viewrendered2.py
----------------
viewrendered2.py: Creates a window for *live* rendering of reSTructuredText, 
markdown text,
images, movies, sounds, rst, html, etc.
Dependencies

viewrendered3.py
----------------
Creates a window for live rendering of reSTructuredText, 
Markdown and Asciidoc text, images, movies, sounds, rst, html, jupyter 
notebooks, etc.
About Viewrendered3 V3.2b7

vim.py
------
Enables two-way communication with gVim (recommended) or Vim.
Commands
--------

wikiview.py
-----------
Hide text in the body editor, each time a new node is selected.  Makes::
  file;//#some-->headlines-->mynode appear as mynode,
  http;//www.google.com/search as search, and

word_count.py
-------------
Word Count plugin by Dan Rahmel
Counts characters, words, lines, and paragraphs in the body pane.
It adds a "Word Count..." option to the bottom of the Edit menu that will

word_export.py
--------------
Adds the Plugins\:Word Export\:Export menu item to format and export
the selected outline to a Word document, starting Word if necessary.

xdb_pane.py
-----------
Creates a Debug tab in the log pane, containing buttons for common xdb
commands, and an input area in which the user can type other commands.

xemacs.py
---------
 Allows you to edit nodes in emacs/xemacs.
Provides the emacs-open-node command which passes the body
text of the node to emacs.

xml_edit.py
-----------
 Provides commands (Alt-x) for importing and exporting XML from a Leo
outline. These commands are to XML what ``@auto-rst`` is to
reStructuredText.

xsltWithNodes.py
----------------
 Adds the Outline:XSLT menu containing XSLT-related commands.
This menu contains the following items:
- Set StyleSheet Node:

zenity_file_dialogs.py
----------------------
 Replaces the tk file dialogs on Linux with external
calls to the zenity gtk dialog package.
This plugin is more a proof of concept demo than

__init__.py
-----------
No docstring

clicky_splitter.py
------------------
clicky_splitter.py - a QSplitter which allows flipping / rotating of
content by clicking on the splitter handle
Terry Brown, [email protected], Sun Oct 29 21:02:25 2017

csvedit.py
----------
DBG - temporary debugging function
    :param str text: text to print

editpane.py
-----------
Support for the edit-pane-test-open command and window.

leotextedit.py
--------------
DBG - temporary debugging function
    Args:
        text (str): text to print

markdownview.py
---------------
to_html - convert to HTML
    Args:
        text (str): markdown text to convert

pandownview.py
--------------
Markdown view using Pandoc.
There could also be a more generic Pandoc view that handles more input
languages, but this just does markdown.

plaintextedit.py
----------------
DBG - temporary debugging function
    Args:
        text (str): text to print

plaintextview.py
----------------
LEP_PlainTextView - simplest possible LeoEditorPane viewer

vanillascintilla.py
-------------------
vanillascintilla.py - a LeoEditPane editor that uses QScintilla
but does not try to add Leo key handling
Terry Brown, [email protected], Sat Feb  4 12:38:26 2017

webengineview.py
----------------
LEP_PlainTextView - simplest possible LeoEditorPane viewer

webkitview.py
-------------
_path_from_pos - get folder for position
    FIXME: should be in Leo core somewhere.
    Args:

__init__.py
-----------
No docstring

chinese_menu.py
---------------
Translate a few menu items into Simplified Chinese
本插件将部分Leo菜单翻译成简体中文
   By Zhang Le <[email protected]>

french_fm.py
------------
traduit les menus en Français

override_classes.py
-------------------
A plugin showing how to override Leo's core classes.

override_commands.py
--------------------
Override the Equal Sized Pane command

print_cp.py
-----------
A plugin showing how to convert an @button node to a plugin.
This plugin registers the 'print-cp' minibuffer command.

redefine_put.py
---------------
Redefine the "put" and "put_nl" methods

slowOut.py
----------
No docstring

slowOutNoFlush.py
-----------------
No docstring

template_gui.py
---------------
An example of a gui plugin that completes startup without doing anything.

c.py
----
The @auto importer for the C language and other related languages.

coffeescript.py
---------------
The @auto importer for coffeescript.

csharp.py
---------
The @auto importer for the csharp language.

ctext.py
--------
    Read/Write simple text files with hierarchy embedded in headlines::
        Leading text in root node of subtree
        Etc. etc.

cython.py
---------
@auto importer for cython.

dart.py
-------
The @auto importer for the dart language.

elisp.py
--------
The @auto importer for the elisp language.

html.py
-------
The @auto importer for HTML.

ini.py
------
The @auto importer for .ini files.

ipynb.py
--------
The @auto importer for Jupyter (.ipynb) files.

java.py
-------
The @auto importer for the java language.

javascript.py
-------------
The @auto importer for JavaScript.

leo_json.py
-----------
The @auto importer for .json files.

leo_rst.py
----------
The @auto importer for restructured text.
This module must **not** be named rst, so as not to conflict with docutils.

linescanner.py
--------------
**Overview**
Leo's import infrastructure in `leoImport.py` instantiates the
Importer instance and calls `i.run`, which calls `i.scan_lines`.

lua.py
------
The @auto importer for the lua language.
Created 2017/05/30 by the `importer;;` abbreviation.

markdown.py
-----------
The @auto importer for the markdown language.

org.py
------
The @auto importer for the org language.

otl.py
------
The @auto importer for vim-outline files.

pascal.py
---------
The @auto importer for the pascal language.

perl.py
-------
The @auto importer for Perl.

php.py
------
The @auto importer for the php language.

python.py
---------
The new, line-based, @auto importer for Python.

rust.py
-------
The @auto importer for rust.

tcl.py
------
The @auto importer for the tcl language.
Created 2017/06/15 by the `importer;;` abbreviation.

treepad.py
----------
The @auto importer for the TreePad file format.

typescript.py
-------------
The @auto importer for TypeScript.

xml.py
------
The @auto importer for the xml language.

__init__.py
-----------
No docstring

babel.py
--------
    {0}

babel_api.py
------------
 Language specified is not currently
    supported by Leo-Babel

babel_kill.py
-------------
No docstring

babel_lib.py
------------
The scheme for real-time streaming of stdout and stderr while the script is 
still executing is taken from:
http://stackoverflow.com/questions/18421757/live-output-from-subprocess-command

__init__.py
-----------
No docstring

slowOut.py
----------
No docstring

slowOutNoFlush.py
-----------------
No docstring

idle_time.py
------------
 This is an implementation of the Leo-Editor
    class IdleTime() for use with Leo-Bridge.

lib_test.py
-----------
 Find all the Leo-Babel test nodes in the specified file
    Arguments:
        cmdrT: Leo-Editor commander for the file containing tests

tests.py
--------
usage: tests.py [options] tests results
Run Leo-Babel Tests
positional arguments:

__init__.py
-----------
No docstring

gtkDialogs.py
-------------
Replace Tk dialogs with Gtk dialogs.
At the moment this plugin only replaces Tk's file dialogs, but
other dialogs may be replaced in future.

gtkGui.py
---------
The plugin part of the gtk gui code.

ironPythonGui.py
----------------
A plugin to use IronPython and .Net Forms as Leo's gui.

swing_gui.py
------------
The plugin part of the swing gui code.

tkGui.py
--------
Leo's tkinter gui plugin.

wxGui.py
--------
A plugin to use wxWidgets as Leo's gui.
**Important**: this plugin is largely unfinished.
Do not use thi plugin for production work!

pygeotag.py
-----------
from 
http://stackoverflow.com/questions/1564501/add-timeout-argument-to-pythons-queue-join
    by Lukáš Lalinský

__init__.py
-----------
No docstring

launchqmlnb.py
--------------
No docstring

ekr_test.py
-----------
Return True if the plugin has loaded successfully.

failed_import.py
----------------
A plugin to test import problems.

failed_to_load_plugin.py
------------------------
This plugin intentially reports that it fails to load.
It is used for testing Leo's plugin loading logic.

syntax_error_plugin.py
----------------------
This plugin intentially has a syntax error.
It is used for testing Leo's plugin loading logic.

basewriter.py
-------------
A module defining the base class for all writers in leo.plugins.writers.

ctext.py
--------
No docstring

dart.py
-------
The @auto write code for Emacs org-mode (.org) files.

ipynb.py
--------
The @auto write code for jupyter (.ipynb) files.

leo_json.py
-----------
The @auto write code for .json files.

leo_rst.py
----------
The write code for @auto-rst and other reStructuredText nodes.
This is very different from rst3's write code.
This module must **not** be named rst, so as not to conflict with docutils.

markdown.py
-----------
The @auto write code for markdown.

org.py
------
The @auto write code for Emacs org-mode (.org) files.

otl.py
------
The @auto write code for vimoutline (.otl) files.

test.py
-------
The @auto writer for .xyzzy files and @auto-test nodes.

treepad.py
----------
The @auto write code for TreePad (.hjt) files.

__init__.py
-----------
No docstring
Find all .py files in the plugins directory.  Read their docstrings if any.

@language python
from pathlib import Path
import re

DIR = r'C:\Tom\git\leo-editor\leo\plugins'
DOCSTR1 = '.*?"""(.+?)"""'
DOCSTR2 = ".*?'''(.+?)'''"

paths = Path(DIR).rglob('*.py')

result = []
for p in paths:
    with open(p, encoding='utf-8') as f:
        result.append('\n' + p.name)
        result.append('-'*len(p.name))
        text = f.read()

    pos_single = text.find("'''")
    pos_double = text.find('"""')
    has_docstr = False

    has_docstr = (pos_single > -1 or pos_double > -1)
    if has_docstr:
        if pos_single == -1:
            pattern = DOCSTR1
        elif pos_double == -1:
            pattern = DOCSTR2
        elif pos_single < pos_double:
            pattern = DOCSTR2
        else:
            pattern = DOCSTR1

        matched = re.match(pattern, text, re.DOTALL)
        if not matched:
            result.append('No match')
        else:
            lines = matched.group(1).split('\n')
            lines = [l for l in lines if l.strip()]
            lines = [l for l in lines if not l.startswith('#@')]
            if len(lines):
                result.extend(lines[0:3])
            else:
                result.append('???')

    else:
        result.append('No docstring')

print('\n'.join(result))

Reply via email to