<?xml version="1.0" encoding="utf-8"?>
<!-- Created by Leo: http://leoeditor.com/leo_toc.html -->
<leo_file xmlns:leo="http://leoeditor.com/namespaces/leo-python-editor/1.1" >
<leo_header file_format="2"/>
<globals/>
<preferences/>
<find_panel_settings/>
<vnodes>
<v t="ekr.20050315084904"><vh>Startup</vh>
<v t="ekr.20141117135127.2"><vh>@settings</vh>
<v t="ekr.20141117135127.3"><vh>@bool wikiview-active = False</vh></v>
</v>
<v t="ekr.20070325123540"><vh>@chapters</vh></v>
<v t="ekr.20101025095431.1517"><vh>Installer/Distribution bugs &amp; to-do</vh>
<v t="ekr.20101025095431.1518"><vh>Fixed Bug 514656 Uninstall operation does not work as expected</vh>
<v t="ekr.20090901092556.1576"><vh>genUninstallData &amp; helpers</vh>
<v t="ekr.20090901121423.1568"><vh>getDeleteDirectories</vh></v>
<v t="ekr.20090901121423.1569"><vh>getDeleteFiles</vh></v>
<v t="ekr.20090901121423.1567"><vh>getUninstallVariableData</vh></v>
</v>
</v>
<v t="ekr.20101026142031.1516"><vh>Registry Keys</vh></v>
</v>
<v t="ekr.20170911061827.1"><vh>@button check .leo files</vh>
<v t="ekr.20170911062209.1"><vh>&lt;&lt; define files &gt;&gt;</vh></v>
</v>
</v>
<v t="ekr.20161024113526.1"><vh>Notes</vh>
<v t="ekr.20160501153808.1"><vh>Anaconda install notes</vh></v>
<v t="ekr.20161024113542.1"><vh>#106 Homebrew (MacOS) notes</vh>
<v t="ekr.20161025114444.1"><vh>The latest formula</vh></v>
<v t="ekr.20161025114433.1"><vh>Posts</vh>
<v t="ekr.20161024113553.1"><vh>Post 1: Winn Dixie</vh></v>
<v t="ekr.20161024113810.1"><vh>Post 2: ludwigschwardt</vh></v>
<v t="ekr.20161024114150.1"><vh>Post 3: me April 15, 2015</vh></v>
<v t="ekr.20161025091538.1"><vh>Post 4: me April 24, 2015</vh></v>
<v t="ekr.20161025091621.1"><vh>Post 5: ludwidswardt April 24, 2015</vh></v>
<v t="ekr.20161024115114.1"><vh>Post 4: me May 1, 2015</vh></v>
</v>
<v t="ekr.20161024115257.1"><vh>How to compute the sha256 hash</vh></v>
</v>
</v>
<v t="EKR.20040519091259"><vh>Announcements</vh>
<v t="EKR.20040519091259.1"><vh>Download statistics</vh></v>
<v t="ekr.20180828034134.1"><vh>Leo 5.8 b1 release notes</vh></v>
<v t="ekr.20180527084946.1"><vh>Leo 5.7.3 release notes</vh>
<v t="ekr.20180527084946.2"><vh>Bugs</vh>
<v t="ekr.20180527084946.3"><vh>#841: Python importer does not always handle decorators properly </vh></v>
<v t="ekr.20180527084946.4"><vh>#892: Crash in checkForChangedNodes</vh></v>
<v t="ekr.20180527084946.5"><vh>#893: Python Console gets stuck on IndentationError </vh></v>
<v t="ekr.20180527084946.6"><vh>#901: The Windows Right-Menu key insert "Menu" into text</vh></v>
</v>
<v t="ekr.20180527084946.7"><vh>Code</vh>
<v t="ekr.20180527084946.8"><vh>#875: Rename json reader/writer plugins</vh></v>
<v t="ekr.20180527084946.9"><vh>BackgroundProcessManager supports clickable links</vh></v>
<v t="ekr.20180527084946.10"><vh>Removed most g.trace statements</vh></v>
</v>
<v t="ekr.20180527084946.11"><vh>Info items</vh>
<v t="ekr.20180527084946.12"><vh>#909: How to use LaTeX with Leo</vh></v>
<v t="ekr.20180527084946.13"><vh>#910: Summary of developer info items</vh></v>
</v>
<v t="ekr.20180527084946.14"><vh>Features</vh>
<v t="ekr.20180527084946.15"><vh>#309: Support Jedi autocompletion</vh></v>
<v t="ekr.20180527084946.16"><vh>#738: Links in Tips dialogs are now clickable</vh></v>
<v t="ekr.20180527084946.17"><vh>#868: Allow separate bindings for numeric keypad keys</vh></v>
<v t="ekr.20180527084946.18"><vh>#904: Allow local overrides of abbreviations</vh></v>
<v t="ekr.20180527084946.19"><vh>Added diff-related wrappers</vh></v>
<v t="ekr.20180527084946.20"><vh>Added leo_babel plugin</vh></v>
<v t="ekr.20180527084946.21"><vh>Improved recursive import script</vh></v>
<v t="ekr.20180527084946.22"><vh>Improved typescript importer</vh></v>
<v t="ekr.20180527084946.23"><vh>pylint creates clickable links</vh></v>
<v t="ekr.20180527084946.24"><vh>Removed settings</vh></v>
<v t="ekr.20180527084946.25"><vh>Smart searches for functions and methods</vh></v>
</v>
</v>
<v t="EKR.20040519091259.2"><vh>Quotes of the month</vh>
<v t="ekr.20080901114425.2"><vh>Sept 2008</vh></v>
<v t="ekr.20070425092712"><vh>April 2007</vh></v>
<v t="ekr.20070101093904"><vh>January 2007</vh></v>
<v t="ekr.20060823090437"><vh>August 2006</vh></v>
<v t="ekr.20060213160806"><vh>February 2005</vh></v>
<v t="ekr.20040828084148"><vh>August 2004</vh></v>
<v t="ekr.20040630210818"><vh>July 2004</vh></v>
<v t="EKR.20040519091259.3"><vh>November 2003</vh></v>
<v t="EKR.20040519091259.4"><vh>October 2003</vh></v>
</v>
</v>
<v t="ekr.20150326055410.1"><vh>Update versions</vh></v>
<v t="ekr.20150416081546.1"><vh>Distribution check scripts</vh>
<v t="ekr.20150416081546.2"><vh>Catch mixed newlines in distribution files</vh>
<v t="ekr.20150416081546.3"><vh>check</vh></v>
</v>
<v t="ekr.20150416081546.4"><vh>Catch mixed tab &amp; space in derived files</vh>
<v t="ekr.20150416081546.5"><vh>check</vh></v>
</v>
<v t="ekr.20150416081546.6"><vh>Check all colorizer files for problem regex's</vh></v>
<v t="ekr.20150416081546.7"><vh>Clean ekr-spellpyx.txt</vh></v>
<v t="ekr.20150416081546.8"><vh>Linux install script</vh></v>
<v t="ekr.20150416081546.9"><vh>Warn if leoProjects.txt or leoToDo.txt contain clones</vh></v>
</v>
<v t="EKR.20040519090846"><vh>Distribution files</vh>
<v t="ekr.20141016105045.2119"><vh>@asis ../../.gitattributes</vh></v>
<v t="ekr.20130809141000.1990"><vh>@asis ../../INSTALL.TXT</vh>
<v t="ekr.20130809141000.1991"><vh>System requirements</vh></v>
<v t="ekr.20130809141000.1992"><vh>Leo's HOME directory</vh></v>
<v t="ekr.20130809141000.1993"><vh>Linux installation</vh></v>
<v t="ekr.20130809141000.1994"><vh>Windows installation</vh></v>
<v t="ekr.20130809141000.1995"><vh>Running Leo</vh></v>
<v t="ekr.20130809141000.1996"><vh>Creating file associations</vh></v>
<v t="ekr.20130809141000.1997"><vh>Adding Leo to your path</vh></v>
<v t="ekr.20130809141000.1998"><vh>Running Leo for the first time</vh></v>
</v>
<v t="EKR.20040519090846.1"><vh>@asis ../../LICENSE</vh></v>
<v t="EKR.20040519090846.8"><vh>@asis ../../PKG-INFO.TXT</vh></v>
<v t="EKR.20040519090846.9"><vh>@asis ../../README.md</vh></v>
<v t="ekr.20151227063335.1"><vh>@asis ../../About leo.exe.TXT</vh></v>
<v t="ekr.20150425135153.1"><vh>homebrew istall script</vh>
<v t="ekr.20150425135153.2"><vh>brew install formula</vh></v>
</v>
</v>
<v t="ekr.20141118074110.4"><vh>How to...</vh>
<v t="ekr.20141118074110.3"><vh>How to Install Leo on Linux</vh></v>
<v t="maphew.20180128212042.1"><vh>How to build Leo's PyPi Package</vh>
<v t="maphew.20180128212042.3"><vh>Create an PyPi.org account</vh></v>
<v t="maphew.20180128212042.2"><vh>Build requirements</vh></v>
<v t="maphew.20180128212042.4"><vh>Build &amp; publish a release</vh></v>
<v t="maphew.20180128213245.1"><vh>Not recommended: Test with TestPyPI</vh></v>
<v t="maphew.20180128212042.5"><vh>Caveats</vh></v>
</v>
<v t="ekr.20180124100848.1"><vh>Failures in unified version</vh></v>
</v>
<v t="ekr.20101027131034.1490"><vh>NSIS source files</vh>
<v t="ekr.20101027160251.1500"><vh>Notes</vh>
<v t="ekr.20101027135430.1492"><vh>@url nsi new ui readme</vh></v>
<v t="ekr.20101027135430.1493"><vh>@url about pages</vh></v>
<v t="ekr.20101027160251.1497"><vh>@url nsDialogs</vh></v>
</v>
<v t="ekr.20160510090441.1"><vh>@file ../../leo_assoc.nsi</vh></v>
<v t="ekr.20101027054254.1590"><vh>@file ../../leo.nsi</vh></v>
</v>
<v t="ekr.20100202061222.1494"><vh>Distribution checklist (Full)</vh>
<v t="ekr.20161015091353.2"><vh>Files</vh></v>
<v t="ekr.20161015091353.1"><vh>Web docs</vh></v>
<v t="ekr.20161015091350.1"><vh>Pre-testing</vh></v>
<v t="ekr.20161015092224.1"><vh>Create distribution</vh></v>
<v t="ekr.20161020040946.1"><vh>Test</vh></v>
<v t="ekr.20161020041000.1"><vh>Create git tag</vh></v>
<v t="ekr.20170316104916.1"><vh>Publish release</vh></v>
<v t="ekr.20161015091353.3"><vh>Announcements</vh></v>
<v t="ekr.20180301115911.1"><vh>Create python wheel</vh></v>
</v>
<v t="ekr.20180405171433.1"><vh>Distribution checklist (GitHub Only)</vh>
<v t="ekr.20180405171433.2"><vh>Files</vh></v>
<v t="ekr.20180405171433.3"><vh>Web docs</vh></v>
<v t="ekr.20180405171433.4"><vh>Pre-testing</vh></v>
<v t="ekr.20180828095749.1"><vh>Create a -rel *branch* late.</vh></v>
<v t="ekr.20180828095843.1"><vh>Update verions.py in the -rel branch</vh></v>
<v t="ekr.20180405171433.7"><vh>Create git tag in master</vh></v>
<v t="ekr.20180405171433.8"><vh>Publish release</vh></v>
<v t="ekr.20180405171433.9"><vh>Announcements</vh></v>
</v>
</vnodes>
<tnodes>
<t tx="EKR.20040519090846">@language rest
@wrap
</t>
<t tx="EKR.20040519090846.1">MIT License

Copyright (c) 1997-2018 by Edward K. Ream.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</t>
<t tx="EKR.20040519090846.8">Metadata-Version: 1.0
Name: leo
Version: 5.8
Summary: An IDE, PIM and Outliner. See leoeditor.com/preface.html.
Description: See users own descriptions of Leo at leoeditor.com/testimonials.html.
Home-page: http://leoeditor.com/
Author: Edward K. Ream
Author-email: edreamleo@gmail.com
License: MIT
Keywords: Outliner, IDE, PIM, DAG, Scripting
Platform: Windows, Linux, MaxOS
Classifier: Development Status :: 6 - Mature
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
Classifier: Topic :: Text Processing
Download-URL: http://sourceforge.net/projects/leo/files/

</t>
<t tx="EKR.20040519090846.9">Leo 5.8 final, http://leoeditor.com, is now available on
[GitHub](https://github.com/leo-editor/leo-editor).

Leo is an IDE, outliner and PIM, as described [here](http://leoeditor.com/preface.html).

**The highlights of Leo 5.8**

- Much faster file-read code.
- Leo no longer caches file contents. Removed --no-cache!
- Leo using ElementTree instead of sax to read .leo files.
- Refactored and improved Leo's key-handling code.
- Improved Leo's outline drawing code.
- The usual minor bug fixes.

**Links**

- Leo's home page: http://leoeditor.com
- [Documentation](http://leoeditor.com/leo_toc.html)
- [Tutorials](http://leoeditor.com/tutorial.html)
- [Video tutorials](http://leoeditor.com/screencasts.html)
- [Forum](http://groups.google.com/group/leo-editor)
- [Download](http://sourceforge.net/projects/leo/files/)
- [Leo on GitHub](https://github.com/leo-editor/leo-editor)
- [LeoVue](https://github.com/kaleguy/leovue#leo-vue)
- [What people are saying about Leo](http://leoeditor.com/testimonials.html)
- [A web page that displays .leo files](http://leoeditor.com/load-leo.html)
- [More links](http://leoeditor.com/leoLinks.html)
</t>
<t tx="EKR.20040519091259">@pagewidth 70
@language rest
@wrap

See LeoDocs.leo for previous release notes.</t>
<t tx="EKR.20040519091259.1">5.1:        setup: 1,114    zip: 2,912
5.0:        setup: 552      zip: 1,617
4.4.5       setup: 547   zip: 379  2007-12-11
4.4.4       setup: 856  zip: 539  2007-11-02
4.4.3.1     setup: 1092 zip: 743  2007-7-03
4.4.3       setup: 363  zip: 282  2007-6-26
4.4.2.1     setup: 2847 zip: 2044 2006-10-19
4.4.1.1     setup: 1041 zip: 813  2006-9-3
4.4         setup: 1318 zip: 1075 2006-5-11
3.3.3       setup: 1503 zip: 1145 2005-9-19
4.3.2 final setup: 409  zip: 222
4.3.1 final setup: 2168 zip: 1781
4.3 final   setup: 942  zip: 686
4.2.1 final setup: 413  zip: 490
4.2-final   setup: 1828 zip: 1508
4.2b3       setup: 563, zip: 338
4.1rc3      setup: 870  zip: 630
4.1 b5      setup: 195, zip: 128
4.0.4       setup: 340, zip: 385
4.0                     zip: 382
3.12        setup: 953  zip: 592
3.11                    zip: 102
3.10                    zip: 1193</t>
<t tx="EKR.20040519091259.2"></t>
<t tx="EKR.20040519091259.3">I like Leo more the more I use it...It's an unexpected pleasure to
see my (linearly written) code outlined in Leo. I can't wait to use
Leo to start a new project, going from outline to code...Thanks again
for providing the computing community with such a fine piece of
software. -- Jim Shapiro, Ph.D.

If you think you have used all possible programmer's editors, but
have not yet tried Leo, you are wrong...I rate Leo as a "must have"
for Python programmers. The code makes for a good read.
-- John Tobler  http://weblogs.asp.net/Jtobler/
</t>
<t tx="EKR.20040519091259.4">I've written documentation in WordPerfert, Ventura, Word, PageMaker, and
FrameMaker and even though they create wonderfully looking and useful
documents, they've never been able to do what I've been looking for. HTML,
compiled help files, and later PDF came closer, but still not there. I think
I've found it in LEO, a way to make a "living" document. A document built out
of discrete parts that can be re-organized on the fly to meet the needs of a
varying audience...Being a convert for less than a day I've still got a lot to
learn, but just the possibility of keeping system maintenance scripts in the IT
manual is mind boggling.  -- David Nichols dnichols@amci.com</t>
<t tx="ekr.20040630210818">HTML Editing in Leo is soooo much easier then with NoNodeEditors. Ive
had a blast working on a web page. Usually I had to look at a bunch of
gunk all at once. Now I can look at little pieces of gunk! :) 

-Anon (for now)

Before leo, I try to avoid or refactor long functions. With leo, I am
very tempted not to. Being able to view and slice my code at a higher
level in pretty much anyway I want, I feel like a commanding master in
my own mess...Leo lets me be lazy and get away with it. ;)

Mark Ng

[Quote] I have just finished a little embedded system for someone, written in
C using leo as the editor. I told the customer he _had_ to use leo for
ongoing maintenance, after I looked at one of the main state machines:
600 lines in the derived file, but trivially easy to get your head
around in Leo...

The good news is that having been forced to meet leo he thinks it'll
solve many other problems that his company has with code maintenance.
Another step to world domination!

Leo allows you to do things that you'd never consider with another editor. 

BTW: in a real-time embedded system like I was working on, not having
the overhead of a function call (which you'd have had if you'd split
the case statement as you would with a normal editor) saves time, and
makes the system more flexible...
[End Quote]</t>
<t tx="ekr.20040828084148">Leo is the best IDE that I have had the pleasure to use. I have been using it
now for about 2 -- 3 months. It has totally changed not only the way that I
program, but also the way that I store and organize all of the information that
I need for the job that I do. -- Ian Mulvany</t>
<t tx="ekr.20050315084904"></t>
<t tx="ekr.20060213160806">"Thanks for a wonderful program – everybody should be using it! It blows the
socks off that Java Mind mapping software that won project of the month a while
back on sourceforge!" -- Derick van Niekerk.
</t>
<t tx="ekr.20060823090437">Thanks for creating the most useful and amazing application that
I've come across in years. I use Leo every day.</t>
<t tx="ekr.20070101093904">Leo is THE BEST THING to ever had happened to me. I've done in two
weeks what would have taken me years (not exaggerating!). Thanks Ed
for a terrific tool!!!!
 
Julian S. Fecteau 
</t>
<t tx="ekr.20070325123540"></t>
<t tx="ekr.20070425092712">Leo--especially with its feature of user-controllable outlining and
overview--has for the last 4-5 years had the greatest positive effect
on my overall programming quality of life than anything else out there
in the software world (apart maybe from the Python language itself,
and those who contribute Python modules to the world). -- David McNab
</t>
<t tx="ekr.20080901114425.2">For me Squeak and Leo have been two of the most significant technologies to
redefine my personal computer experience and the ideas behind computing.</t>
<t tx="ekr.20090901092556.1576">def genUninstallData(self,dirs,dirDict,filesDict):

    '''Generate the manifest-specific uninstall data.'''

    trace = True

    s = r'''
Section Uninstall

    DeleteRegKey HKEY_LOCAL_MACHINE "${hkey_local_machine}"

    ; Delete files &amp; directories only if we own them!
    ReadRegStr $$1 HKCR "${ext}" ""
    StrCmp $$1 "${name}File" 0 FinishUninstall

    ; Delete files &amp; directories only if there is no backup_val key.
    ReadRegStr $$1 HKCR "${ext}" "backup_val"
    StrCmp $$1 "" 0 DeleteLeoKeysAndFiles
      DeleteRegKey HKCR "${ext}"
    Goto FinishUninstall

DeleteLeoKeysAndFiles:
    WriteRegStr HKCR "${ext}" "" $$1
    DeleteRegValue HKCR "${ext}" "backup_val"

    ; ---- Start of manifest-related data...
'''

    self.put(s,substitute=True)

    # Does all the hard work.
    s = self.getUninstallVariableData(dirs,dirDict,filesDict)
    if trace: g.trace('\n',s)
    self.put(s,adjust = False)

    s = r'''
    ; ---- End of manifest related data.

FinishUninstall:
    ; MessageBox MB_YESNO|MB_ICONQUESTION \
    ;    "Delete all files in ${INSTDIR}?" IDNO NoDelete
; NoDelete:

  Delete "${SMPROGRAMS}\${name}\Uninstall.lnk"
  RMDir "${SMPROGRAMS}\${name}-${version}"
  Delete "${DESKTOP}\${name}.lnk"

  DeleteRegKey ${uninst_root_key} "${uninst_key}"
  SetAutoClose false

; end Uninstall section
SectionEnd
'''

    self.put(s,substitute=True)
</t>
<t tx="ekr.20090901121423.1567">def getUninstallVariableData(self,dirs,dirDict,filesDict):

    s1 = self.getDeleteFiles(dirs,dirDict,filesDict)
    s2 = self.getDeleteDirectories(dirs,dirDict)
    return '%s\n%s' % (s1,s2)
</t>
<t tx="ekr.20090901121423.1568">def getDeleteDirectories (self,dirs,dirDict):

    reverseDirs = dirs[:]
    reverseDirs.reverse()

    result = []

    if 1:
        result.append('; Recursively delete the leo directory and everything in it.\n')
        result.append('RMDir /r "$INSTDIR\\leo"\n\n')
    else:
        result.append('; Uninstall directories in reverse order\n')
        for theDir in reverseDirs:
            # Delete the directory even if it has files.
            if theDir and theDir != '**top':
                if not theDir.startswith('.bzr'):
                    result.append('RMDir "$INSTDIR\\%s"\n' % (
                        theDir.replace('/','\\')))

    # top-level folder.
    result.append('; Delete the top-level directory.\n')
    result.append('RMDir "$INSTDIR"\n')

    result = [self.indent(z) for z in result]
    return ''.join(result)
</t>
<t tx="ekr.20090901121423.1569">def getDeleteFiles (self,dirs,dirDict,filesDict):

    result = []
    result.append('\n')
    result.append('; Uninstall files...\n\n')

    # top-level files.
    result.append('; Delete top-level files...\n')
    aList = dirDict.get('**top',[])
    # Add *.py, *.pyo, *.pyc and *.leo, the most common added files.
    if 0: # This seems way too drastic, and not needed.
        for fn in ('*.py','*.pyo','*.pyc','*.leo',):
            aList.append(fn)
    # special case.
    aList.append('uninst.exe')
    # Warning: **never** delete all files in the top-level directory.
    for fn in aList:
        result.append('Delete "$INSTDIR\\%s"\n' % fn)

    if 0:
        wildcard_delete = True
        if wildcard_delete:
            result.append('\n')
        # Use the \r option to recursively delete everything in the leo directory.

        for theDir in dirs:
            if theDir:
                dir2 = theDir.replace('/','\\')
                if wildcard_delete:
                    result.append('Delete "$INSTDIR\\%s\\*.*"\n' % (dir2))
                else:
                    aList = dirDict.get(theDir,[])
                    if aList:
                        result.append('\n')
                        result.append('Delete "$INSTDIR\\%s\\*.pyc"\n' % (dir2))
                        result.append('Delete "$INSTDIR\\%s\\*.pyo"\n' % (dir2))
                    for fn in aList:
                        result.append('Delete "$INSTDIR\\%s\\%s"\n' % (
                            dir2,fn))

    result = [self.indent(z) for z in result]
    return ''.join(result)
</t>
<t tx="ekr.20100202061222.1494">@language rest
</t>
<t tx="ekr.20101025095431.1517">@language rest</t>
<t tx="ekr.20101025095431.1518">https://bugs.launchpad.net/leo-editor/+bug/514656
</t>
<t tx="ekr.20101026142031.1516">@nocolor-node

HKEY_CURRENT_USER\Software\Classes\Applications\python.exe
HKEY_CURRENT_USER\Software\Classes\Applications\python.exe\shell\open\command
    val = c:\Python26\python.exe %1
HKCU
HKEY_CURRENT_USER\Software\Classes\Applications\pythonw.exe
HKEY_CURRENT_USER\Software\Classes\Applications\pythonw.exe\shell\open\command
    val = c:\Python26\pythonw.exe %1

HKEY_CURRENT_USER\Software\Classes\Applications\py_auto_file\shell\open\command
    val = c:\Python26\python.exe %1
    
HKEY_CURRENT_USER\Software\Classes\Installer\Products\nnnnnn

HKLM
HKEY_LOCAL_MACHINE\SOFTWARE\Python
HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore
HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath
    val = c:\python27\
HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonPath
    val = c:\Python27\Lib;\Python27\DLLs;C:\Python27\Lib\lib-tk
</t>
<t tx="ekr.20101027131034.1490">@color</t>
<t tx="ekr.20101027135430.1492">http://nsis.sourceforge.net/Docs/Modern%20UI%202/Readme.html</t>
<t tx="ekr.20101027135430.1493">http://nsis.sourceforge.net/Docs/Chapter4.html#4.5</t>
<t tx="ekr.20101027160251.1497">http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html</t>
<t tx="ekr.20101027160251.1500"></t>
<t tx="ekr.20130809141000.1990">@language rest
</t>
<t tx="ekr.20130809141000.1991">System requirements
-------------------

Leo requires the `Python`_ and `PyQt_` package.
The `PyEnchant`_ package is optional. 

**Python**: Leo will work on any platform that supports Python 2.6 or
above, including Python 3.0 and above. To install Python, see
http://python.org.

**PyQt**: PyQt provides Leo's widgets. To install PyQt, get the binary
package from: http://www.riverbankcomputing.co.uk/software/pyqt/download
The PyQt version must match your installed Python version. Remember that
Leo requires Python 2.6 or later, or Python 3.0 or later. Now run the
binary PyQt installer.

**PyEnchant**: You must install the PyEnchant package if you want to use
Leo's Spell tab. Download and install the PyEnchant package from
http://pythonhosted.org/pyenchant/download.html There is an executable
installer for Windows users.

</t>
<t tx="ekr.20130809141000.1992">
Leo's HOME directory
--------------------

Python's HOME environment variable specifies Leo's HOME directory.
See http://docs.python.org/lib/os-procinfo.html for details.

Leo puts several files in your HOME/.leo directory:
.leoID.txt, .leoRecentFiles.txt, and myLeoSettings.leo.
There are various fallback directories if there is no home directory.
</t>
<t tx="ekr.20130809141000.1993">
Installing Leo on Linux
-----------------------

You may download Leo's sources in one of three ways, as described at:
http://leoeditor.com/download.html If the sources are zipped, unzip them
into a folder in your home directory, say ~/leo-5.2 (or /usr/bin, etc.)

To gain access to Leo, you have two choices:

A. Add  ~/leo-5.2 to your path.
B. Create alias for Leo.

I prefer using aliases because they allow me to start Leo using Python 2 or 3,
or other distributions, like Anaconda 2 or 3.

See `Running Leo`_ for how to run Leo after installing it.
</t>
<t tx="ekr.20130809141000.1994">
Installing Leo on Windows
--------------------------

Install Python and Qt, as described above.

Now you have a choice.  You can use Leo's binary (single-click) installer
or download Leo's sources directly.

1. Using the single-click installer

Leo has a binary installer for Windows, available at
http://sourceforge.net/projects/leo/files/Leo/ The binary installer
installs Leo and sets Windows file associations.

2. Installing from sources

You may download Leo's sources in one of three ways, as described at:
http://leoeditor.com/download.html If the sources are zipped, unpack them
into a temp folder. You may place the sources anywhere you like, including
Python's *site-packages* folder, for example,
C:\Python26\Lib\site-packages.

</t>
<t tx="ekr.20130809141000.1995">
Running Leo
-----------

You can run Leo from a Python interpreter as follows::

    import leo
    leo.run() # runs Leo, opening a new outline or,
    leo.run(fileName=aFileName) # runs Leo, opening the given file name.

Another way to run Leo is as follows::

    cd &lt;path-to-launchLeo.py&gt;
    python launchLeo.py
</t>
<t tx="ekr.20130809141000.1996">
Creating File Associations
--------------------------

**Linux**

The following shell script will allow you to open foo.leo files by typing leo foo::

    #!/bin/sh 
    python &lt;leopath&gt;launchLeo.py $1

where &lt;leopath&gt; is the path to the directory *containing* the leo directory. 

**Windows**

*Important*: Leo's binary Windows installer sets file associations
automatically, so this section is needed only if you are installing Leo
from a .zip file or other sources.

There are two ways of associating .leo files with Leo. The first uses the
Windows control panel, the second, the Windows console.

**Method 1: Using the Windows Control Panel**

The goal is that you want to associate .leo files with the following command::

    "&lt;path to python&gt;\python.exe" "&lt;path to launchLeo.py&gt;\launchLeo.py" "%1"
    
Before Windows 7, you do this with using the Folder Options control panel.
In Windows 7, you do this with the Default Programs control panel.

*Note*: "%1" passes just the file being clicked on, quoted for spaces etc.
The quotation marks are needed to handle file paths containing spaces.

*Warning:* In a batch file, %1 passes just the first command line parameter.
It is logical to expect %* to work for file associations just as in batch
files. Alas, it does not.

**Method 2: Using the Windows Console**

Open a Windows console with administrator privileges, then type::

    ftype LeoFile="&lt;path to python&gt;\pythonw.exe" "&lt;path to launchLeo.py&gt;\launchLeo.py" "%1" %*
    assoc .leo=LeoFile

And put this leo.bat in %PATH%::

    @start /b "Leo" "&lt;path to python&gt;\python.exe" "&lt;path to launchLeo.py&gt;\launchLeo.py" %*
    
You may omit the /b option if you want to create a separate console window for Leo.
</t>
<t tx="ekr.20130809141000.1997">
Adding Leo to Your Path
-----------------------

After you have installed Leo, you should add the location of your leo/core folder to your python path.
One way to do this is adding something like the following to python/Lib/sitecustomize.py:

    import sys
    sys.path.append(r'&lt;path-to-leo&gt;leo\core')

Another way is to append &lt;path-to-leo&gt; to the Windows PYTHONPATH environment variable.
</t>
<t tx="ekr.20130809141000.1998">
Running Leo for the first time
------------------------------

The first time you start Leo, a dialog will ask you for a unique identifier. If
you are using cvs, use your cvs login name. Otherwise your initials will do. Leo
stores this identifier in the file ``.leoID.txt``. Leo attempts to create
``leoID.txt`` in the .leo sub-directory of your home directory, then in Leo's config directory, and
finally in Leo's core directory. You can change this identifier at any time by
editing ``.leoID.txt``.
</t>
<t tx="ekr.20141016105045.2119"># .gitattributes file for Leo distribution

# Commit this file after changing it!

.gitattributes                  export-ignore
.gitignore                      export-ignore
nsi.log.txt                     export-ignore

git-manifest.txt                export-ignore
MakeFile                        export-ignore
MANIFEST.in                     export-ignore

leoStandAloneGlobals.py         export-ignore
stand_alone_globals.leo         export-ignore
# setup.cfg                     export-ignore
# setup.py                      export-ignore

# Do not include the top-level docs folder in distributions
docs/                           export-ignore
docs/*                          export-ignore

# Do not include various local files.
leo/core/leoPy.leo              export-ignore
leo/core/ekrLeoPy.leo           export-ignore
leo/test/unittest/.leo_shadow/  export-ignore

leo/core/commit_timestamp.json merge=ours
</t>
<t tx="ekr.20141117135127.2"></t>
<t tx="ekr.20141117135127.3"></t>
<t tx="ekr.20141118074110.3">https://groups.google.com/forum/#!topic/leo-editor/VvnDYjV4aIk</t>
<t tx="ekr.20141118074110.4"></t>
<t tx="ekr.20150326055410.1">@language rest

1. Search for ##version

    **Note**: The final version in PKG-INFO.TXT must be called 5.x, not 5.x-final.
    See Pep 440: https://www.python.org/dev/peps/pep-0440/

2. Search for copyright

    Latest copyright date: 2018.

    Note: install.txt file embeds a copyright message in the nsi installer.</t>
<t tx="ekr.20150416081546.1"></t>
<t tx="ekr.20150416081546.2">import glob

@others

verbose = False

# extraFiles = ('..\\install','..\\uninstall','test\\unittest\\perfectImport\\formatter.py',)
extraFiles = () # 'test\\test-line-ending.py',)

baseDir = g.os_path_abspath(g.os_path_join(g.app.loadDir,'..'))
n = 0
dirs = ('','src','scripts','plugins',)
# dirs = ('src',)

if 1:
    for dir2 in dirs:
        theDir = g.os_path_abspath(g.os_path_join(baseDir,dir2))
        print theDir
        files1 = glob.glob('%s\*.py' % theDir)
        files2 = glob.glob('%s\*.leo' % theDir)
        files = files1
        files.extend(files2)
        for name in files:
            f = file(name)
            lines = f.readlines()
            # print '%5d %s' % (len(lines),name)
            f.close()
            check(name,lines)
            n += 1

for z in extraFiles:
    name = g.os_path_abspath(g.os_path_join(baseDir,z))
    f = file(name)
    lines = f.readlines()
    # print '%5d %s' % (len(lines),name)
    f.close()
    check(name,lines)
    n += 1

print 'done.  checked %d files' % (n)
</t>
<t tx="ekr.20150416081546.3">def check(name,lines):

    cr = 0 ; nl = 0

    for s in lines:
       for ch in s:
        if ch == '\r': cr += 1
        if ch == '\n': nl += 1

    if verbose or cr &gt; 0:
        print "%55s %s cr's %4s nl's" % (name,cr,nl)
</t>
<t tx="ekr.20150416081546.4">import glob

@others

baseDir = g.os_path_abspath(g.os_path_join(g.app.loadDir,'..'))
n = 0
for dir2 in ('','src','scripts','plugins',):

    theDir = g.os_path_abspath(g.os_path_join(baseDir,dir2))
    print theDir
    files = glob.glob('%s\*.py' % theDir)
    for name in files:
        f = file(name)
        lines = f.readlines()
        # print '%5d %s' % (len(lines),name)
        f.close()
        check(name,lines)
        n += 1

print 'done.  checked %d files' % (n)
</t>
<t tx="ekr.20150416081546.5">def check(name,lines):

    n = 0
    for line in lines:
        n += 1
        i = g.skip_ws(line,0)
        lws = line[0:i]
        if lws:
            if lws.find(' ') &gt; -1 and lws.find('\t') &gt; -1:
                print '%20s %5d %s' % (name,n,repr(line))
</t>
<t tx="ekr.20150416081546.6">import glob
pattern = g.os_path_finalize_join(g.app.loadDir,'..','modes','*.py')
for fn in glob.glob(pattern):
    sfn = g.shortFileName(fn)
    f = open(fn)
    s = f.read()
    f.close()
    if s.find(r'regexp="\\') &gt; -1:
        g.es(sfn)

@ found: Rules indicated are dubious or broken

md.py:
    [ \t]   leadins: 8,20,24,25(?),50,51
    space   leadins: 23,46,49
    [=-]    leadins: 21,47
    [\\_]   leadins: 54,55
    #       leadins: 22
    other   leadins: 7,12,19,53

moin.py:
    [ \t]           rule 3.
    single-quote    rule 6.

erlang.py:  no obvious problem.
lilypond.py:no obvious problem.
perl.py:    no obvious problem.
pl1.py:     no obvious problem.
rest.py:    no obvious problem.
rtf.py:     no obvious problem.
scala.py:   no obvious problem.
yaml.py:    fixed</t>
<t tx="ekr.20150416081546.7">'''
Regularize newlines in ekr-spellpyx.txt.

Replaces sorts the file, removes duplicate lines and ensuring a trailing newline.
'''
fn = g.os_path_finalize_join(g.app.loadDir,'..','..','ekr-spellpyx.txt')
with open(fn) as f:
    s = ''.join(sorted(set(g.splitLines(f.read().strip()+'\n'))))
with open(fn,'w') as f:
    f.write(s)
</t>
<t tx="ekr.20150416081546.8">@first

"""
A simple script to install Leo on Linux.

Contributed by David McNab &lt;david@rebirthing.co.nz&gt;
"""

import commands,os,sys # commands module is for Unix only.

# We must be root to use this script.
if os.getuid() != 0:
    print "You need to run this install script as root"
    sys.exit(1)

# Create /usr/lib/leo and copy all files there.
print "***** Installing Leo to /usr/lib/leo..."
commands.getoutput("mkdir -p /usr/lib/leo")
commands.getoutput("cp -rp * /usr/lib/leo")

# Create user's 'leo' command script into /usr/bin/leo
print "***** Creating Leo startup script -&gt; /usr/bin/leo"
fd = open("/usr/bin/leo", "w")
fd.write("""#!/usr/bin/python
import commands,sys
files = " ".join(sys.argv[1:])
print commands.getoutput("python /usr/lib/leo/leo.py %s" % files)
""")
fd.close()
commands.getoutput("chmod 755 /usr/bin/leo")
print "***** Leo installed successfully - type 'leo filename.leo' to use it."
</t>
<t tx="ekr.20150416081546.9">@language python

# This script must be run from leoPy.leo.

'''Warn if leoProjects.txt or leoToDo.txt contain any clones.'''

clones,nodes,seen = 0,0,set()
table = (
  '@file ../doc/leoProjects.txt',
  '@file ../doc/leoToDo.txt',
)

def check_clone(c,p0,root):
    '''Warn if p appears in any @&lt;file&gt; node outside of root's tree.'''
    global nodes,seen
    v = p0.v
    for p in c.all_positions():
        nodes += 1
        if p.v == v:
            # Check *all* ancestors, not just the nearest one.
            for parent in p.self_and_parents():
                nodes += 1
                if parent.isAnyAtFileNode() and parent.v != root.v:
                    if parent.v not in seen:
                        seen.add(parent.v)
                        g.es_print('%s and %s contain clone: %s' % (
                            root.h,parent.h,p0.h))

for h in table:
    root = g.findNodeAnywhere(c,h)
    if root:
        for p in root.self_and_subtree():
            nodes += 1
            if p.isCloned():
                clones += 1
                check_clone(c,p,root)
    else:
        g.es_print('not found',h,color='red')
print('done: %s nodes, %s clones' % (nodes,clones))
</t>
<t tx="ekr.20150425135153.1">@language ruby
@tabwidth -2
</t>
<t tx="ekr.20150425135153.2">class Leo &lt; Formula

  homepage "http://leoeditor.com/"
  url "http://sourceforge.net/projects/leo/files/Leo/5.0-final/Leo-5.0-final.zip"
  sha256 "2d742f9825959ba5c7624d1179b9f3065e14e055c90272fbce199f91770de826"
  head "https://github.com/leo-editor/leo-editor", :using =&gt; :git

  depends_on "pyqt"
  depends_on "enchant" =&gt; :recommended
  depends_on :python if MacOS.version &lt;= :snow_leopard

  def install
    (lib+"python2.7/site-packages").install "leo"
    bin.install "launchLeo.py" =&gt; "leo" 
  end

  test do
    system bin/"python", "-c", "import leo"
  end
end
</t>
<t tx="ekr.20151227063335.1">leo.exe contains everything you need to run Leo on Windows without
installing *anything* else. It contains all needed libraries, including
Python itself, PyQt, pylint and other packages. It also contains many data
files, including Leo's source code and various .leo files.

Notes:

1. leo.exe was created by PyInstaller: http://pythonhosted.org/PyInstaller

2. Before Leo starts, PyInstaller unpacks all libraries and data files to a
   temp folder: ~\AppData\Local\Temp\_MEInnn. As a result, starting leo.exe
   is slower than usual.

3. *Warning*: You can open Leo files from the "Files:Open Leo File" menu,
   but these files will be in the temp folder. They will be *destroyed*
   when you exit leo.exe. If you want to do real work with Leo you must
   create .leo files in a permanent folder on your machine.
</t>
<t tx="ekr.20160501153808.1">- Install pyenchant. (spelling)
- Install meta (livecode plugin)
- Downinstall setuptools:
    - Erase setuptools stuff from Lib/sitecustomize.
    - pip2/3 install setuptools==19.2
</t>
<t tx="ekr.20161015091350.1">- Make sure no distributed .leo file contains xml-stylesheet elements.
  Run @button check .leo files in leo-dist.leo.
- Make sure Leo looks good without myLeoSettings.leo.
- Run the "check-bindings" button in leoSettings.leo.
- Run all unit tests with *both* Python 2 and 3.
- Run ll -a with *both* Python 2 and 3.</t>
<t tx="ekr.20161015091353.1">- Regenerate all .html files.
- Copy files to web, including leo/doc/html/index.html
  Do **not** copy searchindex.js.
</t>
<t tx="ekr.20161015091353.2">LeoDocs.leo:
- Make sure copyright dates are correct.
- Update the "last updated" text in index.html.
- Update version numbers in html/conf.py
- Update the release notes.
- Remove @language rest where possible in new notes.
- Create new "what's new" section.
- Remove top-level clones.
- Spell check entire file.
- Copy release notes to leoDist.leo.
- Copy release notes to LeoReleaseNotes.leo
- Select the readme node.

LeoDist.leo:
- Make sure copyright dates are correct.
- Update version numbers: search leoDist.leo for ##version.
- Update readme.md.
- Check readme.md spelling.
- Check 'PKG-INFO.TXT'

leoVersion.py:
- Update version constant.

LeoPyRef.leo and LeoPluginsRef.leo:
- Regenerate from corresponding local file.
- Remove top-level clones.
</t>
<t tx="ekr.20161015091353.3">- Update the *GitHub* release at https://github.com/leo-editor/leo-editor/releases
   This must be done *soon* after the release's actual commit.
   There is a "Draft New Release" button at the top-right of the page.

- Update version number on Leo's wikipedia site:
  http://en.wikipedia.org/wiki/Leo_%28editor%29
  - Edit with the 'Edit this page' *tab* (not a link)
  - Update version number on web site.

- Announce to SourceForge:  http://sourceforge.net/projects/leo/
   **Markdown accepted, so paste release notes in LeoDocs.leo.**.

- Announce to leo-editor: **Paste source-forge announcement**.

- Announce to Python-announce-list using email:
   mailto:python-announce-list@python.org
   **Paste source-forge or leo-editor announcement**.

  - Check it by visiting the archive:
  https://mail.python.org/pipermail/python-announce-list/

- Register Leo at https://pypi.python.org/pypi/leo

- My blog: http://edreamleo.blogspot.com/
  **Paste source-forge or leo-editor announcement**.
  **To get HTML, just use html tab**.
</t>
<t tx="ekr.20161015092224.1">Run make-leo.
- Commit all files before running make-leo.
- Run make-leo button in leoDist.leo.
- Commit any changed files.
- If any files change, rerun make-leo.

Create the executable installer:
- Double-click leo.nsi. (Run with makeNSIS.exe)

Run pyinstaller on Windows:
- Delete leo-editor/dist and leo-editor/build folders.
- Run [a32]&gt; pyinstaller --clean --win-private-assemblies launchLeo-unified.spec
- Test a *copy* of the result so .pyo files are not added to the package)
- Rename leo/dist/LeoAppFolder to LeoApp (fixes windows naming problem).
- Compress the LeoApp folder to Leo_&lt;version&gt;_Win.zip.
    
Run pyinstaller on Linux:
- (optional) Delete leo-editor/dist and leo-editor/build folders.
- Run pyinstaller2 launchLeo-unified.spec
- Test a *copy* of the result so .pyo files are not added to the package)
- Compress the folder to Leo_&lt;version&gt;_Linux_64_bit.tar.gz.
</t>
<t tx="ekr.20161020040946.1">Test files in installed folder:

- Run all unit tests in the installed folder, with the installed Leo.

- Make sure the following open without errors:
    - leoPlugins.leo
    - leoPy.leo
    - LeoDocs.leo
</t>
<t tx="ekr.20161020041000.1">Create a git tag **last**

- Create a full (annotated) tag: do not use the -f option.

    git tag -a 5.xxx -m "Added 5.xxx tag"
    git push --follow-tags
</t>
<t tx="ekr.20161024113526.1">@language rest
@wrap
</t>
<t tx="ekr.20161024113542.1">@language rest
@wrap

https://github.com/leo-editor/leo-editor/issues/106

How to Create and Maintain a Tap
https://github.com/Homebrew/brew/blob/master/docs/How-to-Create-and-Maintain-a-Tap.md

How To Open a Homebrew Pull Request (and get it merged)
https://github.com/Homebrew/brew/blob/master/docs/How-To-Open-a-Homebrew-Pull-Request-(and-get-it-merged).md
</t>
<t tx="ekr.20161024113553.1">From: Winn Dixie incredible0n3@gmail.com

Would be stellar to have a brew install leo. http://brew.sh/

Homebrew formulae are simple Ruby scripts::

require "formula"

class Wget &lt; Formula
  homepage "http://www.gnu.org/software/wget/"
  url "http://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha1 "f3c925f19dfe5ed386daae4f339175c108c50574"

  def install
    system "./configure", "--prefix=#{prefix}"
    system "make", "install"
  end
end

To install homebrew, paste this in a terminal::

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

The script explains what it will do and then pauses before it does it.
</t>
<t tx="ekr.20161024113810.1">https://github.com/ludwigschwardt

I've made a first draft of this many moons ago (1 Oct 2013, to be exact :-)).

It still installs Leo 4.10 final. That is if it still works, as I haven't tested it in a while...

You can try it out like this from my tap:

brew tap ska-sa/tap
brew install leo

You are more than welcome to copy it from [here](https://github.com/ska-sa/homebrew-tap/blob/master/leo.rb) and tinker with it.
</t>
<t tx="ekr.20161024114150.1">Whew. Added this pull request: https://github.com/Homebrew/legacy-homebrew/pull/38980
We'll see what happens...

Here is the updated leo.rb file that passes brew audit --strict Leo:

@language ruby

class Leo &lt; Formula
  homepage "http://leoeditor.com/"
  url "https://downloads.sourceforge.net/projects/leo/files/Leo/5.1-final/Leo-5.1-final.zip"
  sha256 "2d742f9825959ba5c7624d1179b9f3065e14e055c90272fbce199f91770de826"

  depends_on "pyqt"
  depends_on "enchant" =&gt; :recommended

  def install
    # Obtain information on Python installation
    python_xy = "python" + `%x(python -c "import sys;print(sys.version[:3])")`.chomp
    python_site_packages = lib + "#{python_xy}/site-packages"
    python_site_packages.install "leo"
    bin.install ["launchLeo.py", "profileLeo.py"]
    ln_s "#{bin}/launchLeo.py", "#{bin}/leo"
  end

  test do
    # Create, run in and delete a temporary directory.
    if system "python" "-c" "import leo"
      onoe "Leo FAILED"
    else
      ohai "Leo OK"
    end
  end
end

@language rest

It took quite awhile to grok what was going on. Here are my notes:

brew update
  # updates formulae.
brew doctor
# Clone homebrew into ~/leo.repo/homebrew
cd ~/leo.repo
git clone https://github.com/leo-editor/homebrew.git
brew create http://sourceforge.net/projects/leo/files/Leo/5.1-final/Leo-5.1-final.zip
    # This Downloaded the file and opened vim:
    # ==&gt; Downloading http://sourceforge.net/projects/leo/files/Leo/5.1-final/Leo-5.1-
    # The second time I did this I simply replaced the file with the proper leo.rb.
brew audit --strict Leo
  # Caught various problems.
cd homebrew
  # Not part of the instructions.
git checkout -b Leo
  # Switched to a new branch 'Homebrew-Leo'
git add Library/Formula/leo.rb
  # Not part of the instructions.
git commit Library/Formula/leo.rb ### &amp;&amp; git push
git push
  # (within SourceTree) using my normal GitHub username and password.

</t>
<t tx="ekr.20161024115114.1">Here is the latest leo.rb:

@language ruby

class Leo &lt; Formula
  homepage "http://leoeditor.com/"
  url "http://sourceforge.net/projects/leo/files/Leo/5.0-final/Leo-5.0-final.zip"
  sha256 "2d742f9825959ba5c7624d1179b9f3065e14e055c90272fbce199f91770de826"
  head "https://github.com/leo-editor/leo-editor", :using =&gt; :git

  depends_on "pyqt"
  depends_on "enchant" =&gt; :recommended
  depends_on :python if MacOS.version &lt;= :snow_leopard

  def install
    (lib+"python2.7/site-packages").install "leo"
    bin.install "launchLeo.py" =&gt; "leo"
  end

  test do
    system bin/"python", "-c", "import leo"
  end
end

@language rest


This passes the following::

    brew audit --strict Leo
    brew install --verbose --debug Leo

However, after:

    brew uninstall Leo
    brew install Leo

I get the following:

    sh: -c: line 0: syntax error near unexpected token `python'
    sh: -c: line 0: `%x(python -c "import sys;print(sys.version[:3])")'

This looks like an old version of leo.rb is being used, but a thorough search shows no such file. Any help would be appreciated.</t>
<t tx="ekr.20161024115257.1">*Note*: Brew create now computes the hash automatically.

http://stackoverflow.com/questions/32673943/how-to-update-homebrew-sha256

After editing the formula, you can run:

    brew fetch your-formula --build-from-source

to fetch the tarball and display the new checksum.

If you've already downloaded the tarball somewhere, you can calculate the hash with:

    openssl sha256 &lt; some_tarball.tar.gz

or:

    shasum -a 256 some_tarball.tar.gz
</t>
<t tx="ekr.20161025091538.1">Here, I'd like to add to the previous post, to show the big picture. Creating a pull request is actually pretty simple, as the homebrew readme suggests:

1. Fork Homebrew.
2. brew create http://example.com/foo-0.1.tar.gz
3. git checkout -b foo
4. git commit Library/Formula/foo.rb &amp;&amp; git push
5. Pull Request: links to https://github.com/Homebrew/homebrew/pulls

This kind of abbreviated list strikes a good balance for those who know the big picture. But for those who don't, a few more details would be helpful:

Directories

The instructions don't mention directories, which was confusing:

    I forked homebrew in ~/leo.repo, my standard place for repos. This created all kinds of stuff in /usr/local, but those places don't matter. Everything actually should happen in ~/leo.repo/homebrew. It took me awhile to realize I could ignore everything in /usr/local.

    Steps 2, 3 and 4 happened, iirc, in ~/leo.repo or in ~/leo.repo/homebrew, which, in retrospect, makes sense, but did not at the time.

Pushing &amp; the pull request

The following may be blindingly obvious to those with more experience with git, but this was the first time I had used git in a more collaborative way:

    The push happens in my fork, so I can (must) use my own GitHub credentials to do the push. I'm simply modifying my own fork.
    The link in the step 5, pull request, isn't really helpful. Instead, after the push, a button in my fork of homebrew appeared called something like "submit pull request". I pressed the button, added a few comments, and off we went. Next time, I'll add a link to Leo's home page. The email link was redundant, but it may have encouraged the helpful comments that I received...

Changing the pull request

The first pull request had problems, so I assume it won't be pulled. I also assume that I can simply make the changes in leo.rb in my already existing branch, push them, and then issue a new pull request.

Summary: This is actually a straightforward process, but nobody knows better than I that describing a straightforward process is anything but straightforward!
</t>
<t tx="ekr.20161025091621.1">he Formula Cookbook, https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md, is a must-read, especially the Python-related parts!)

These instructions for contributing to Homebrew (specifically calling brew commands) assume that you are actually *using* Homebrew, and normally the Homebrew repo then lives in /usr/local. I normally work in that repo and would then copy the formula elsewhere for pushing (typically to my tap repo).

You don't have to issue a new pull request. Just add your changes to the same branch and push them, and they will remain associated with the same pull request. This is a great feature of the PR: you can commit and discuss until everyone is happy and the PR then gets accepted.

I would rename the pull request "leo 5.1 (new formula)". :-)
</t>
<t tx="ekr.20161025114433.1"></t>
<t tx="ekr.20161025114444.1">@language ruby

class LeoEditor &lt; Formula
  desc "The Leo IDE/Outliner/PIM"
  homepage "http://leoeditor.com/"
  url "https://github.com/leo-editor/leo-editor/archive/5.4.1.tar.gz"
  sha256 "2cf0f598aa46e8ced6dd7da0229157e7b523704d0a03604a4da14b715c0a232f"

  depends_on :python if MacOS.version &lt;= :snow_leopard
  depends_on "pyqt"
  depends_on "enchant" =&gt; :recommended

  def install
    bin.install "leo"
    bin.install ["launchLeo.py", "profileLeo.py"]
    ln_s "#{bin}/launchLeo.py", "#{bin}/leo"
  end

  test do
    if system "python", "-c", "import", "leo"
      onoe "Leo FAILED"
    else
      ohai "Leo OK"
    end
  end
end</t>
<t tx="ekr.20170316104916.1">- Create Release on SourceForge: http://sourceforge.net/projects/leo/
    - Make sure to upload readme.md and Readme-quick-install.txt.
</t>
<t tx="ekr.20170911061827.1">'''Make sure no distributed .leo file contains xml-stylesheet elements.'''
# g.cls()
&lt;&lt; define files &gt;&gt;
for fn in files:
    path = g.os_path_finalize_join(g.app.loadDir, '..', fn)
    if g.os_path_exists(path):
        with open(path, 'rb') as f:
            s = f.read()
        s = g.toUnicode(s)
        if s.find('&lt;xml-stylesheet') &gt; -1:
            g.es_print('contains xml-stylesheet element: %s' % (path))
    else:
        g.es_print('does not exist: %s' % path)
g.es_print('done')
</t>
<t tx="ekr.20170911062209.1">files = (
    'config/exampleSettings.leo',
    'config/leoSettings.leo',
    'core/leoPyRef.leo',
    'dist/leoDist.leo',
    'doc/LeoReleaseNotes.leo',
    'doc/cheatSheet.leo',
    'doc/default_workbook.leo',
    'doc/leoDocs.leo',
    'doc/leoSlideShows.leo',
    'doc/quickstart.leo',
    'external/leo2html.leo',
    'plugins/leoGuiPluginsRef.leo',
    'plugins/leoPluginsRef.leo',
    'scripts/scripts.leo',
    'test/test.leo',
)</t>
<t tx="ekr.20180124100848.1">c:\Test\LeoAppFolder&gt;LeoApp.exe


reading settings in C:\Users\edreamleo\.leo\workbook.leo
reading settings in C:\Test\LEOAPP~1\leo\test\unitTest.leo
reading: @file unitTestStartup.txt
reading: @file activeUnitTests.txt
.saved: save-new-test.py
....
Traceback (most recent call last):
  File "launchLeo.py", line 8, in &lt;module&gt;
  File "leo\core\runLeo.py", line 71, in run
    g.app.loadManager.load(fileName, pymacs)
  File "leo\core\leoApp.py", line 2117, in load
    ok = lm.doPostPluginsInit()
  File "leo\core\leoApp.py", line 2722, in doPostPluginsInit
    c = lm.loadLocalFile(fn, gui=g.app.gui, old_c=None)
  File "leo\core\leoApp.py", line 2959, in loadLocalFile
    c = lm.openFileByName(fn, gui, old_c, previousSettings)
  File "leo\core\leoApp.py", line 3007, in openFileByName
    lm.initWrapperLeoFile(c, fn)
  File "leo\core\leoApp.py", line 3084, in initWrapperLeoFile
    p.h = g.shortFileName(fn) if fn.endswith('.leo') else '@edit %s' % fn
AttributeError: 'NoneType' object has no attribute 'h'
Failed to execute script launchLeo
F...................test of at.printError: La Pe?a
..............s...........................
End of leoAtFile tests
..........s...
c:\Test\LeoAppFolder&gt;python2 C:\Test\LEOAPP~1\leo\test\leo-bridge-test.py

c:\Test\LeoAppFolder&gt;c:\Anaconda2\python.exe C:\Test\LEOAPP~1\leo\test\leo-bridge-test.py
.ssss........................................
End of leoColor tests
................................
End of leoCommands tests
........
End of leoConfig tests
....ss...................................
.........................................................................................................................................s...........................
End of typing tests
.
End of leoEditCommands tests.
............
End of leoFileCommands tests.
.....
End of leoFind tests.
.............
End of leoFrame tests.
..........................F.............................................
End of leoGlobals tests.
...
End of leoGui tests.
...............................................................................................................................
End of leoImport tests.
..s....
End of leoKeys tests.
.........................................
End of leoNodes tests.
................................s..................................................................
End of leoUndo tests.
...............................................................................................................................................................
End of plugins unit tests
.@test print redraw count: 736
..all unit tests done
..
======================================================================
FAIL: runTest (leo.core.leoTest.GeneralTestCase)
@test batch mode

----------------------------------------------------------------------
Traceback (most recent call last):
  File "leo\core\leoTest.py", line 211, in runTest
    builtins.execfile(scriptFile, d)
  File "C:\Test\LEOAPP~1\leo\test\scriptFile.py", line 38, in &lt;module&gt;
    assert(g.os_path_exists(test_file))
AssertionError

======================================================================
FAIL: runTest (leo.core.leoTest.GeneralTestCase)
@test g.importModule

----------------------------------------------------------------------
Traceback (most recent call last):
  File "leo\core\leoTest.py", line 211, in runTest
    builtins.execfile(scriptFile, d)
  File "C:\Test\LEOAPP~1\leo\test\scriptFile.py", line 5, in &lt;module&gt;
    assert g.importModule('rope',verbose=False)
AssertionError

----------------------------------------------------------------------
Ran 916 tests in 123.577s

FAILED (failures=2, skipped=11)

c:\Test\LeoAppFolder&gt;

##### can not open @edit C:\Test\LEOAPP~1\README.MD</t>
<t tx="ekr.20180301115911.1">- git checkout {release-tag}
- python setup.py bdist_wheel
- twine upload dist/leo*.whl
</t>
<t tx="ekr.20180405171433.1">@language rest

Overview:

1. Do as much work as possible in "devel".
2. Update leoVersion.py *after* creating -rel branch.</t>
<t tx="ekr.20180405171433.2">LeoDocs.leo:
- Make sure copyright dates are correct.
- Update the "last updated" text in index.html.
- Update version numbers in html/conf.py
- Update the release notes.
- Remove @language rest where possible in new notes.
- Create new "what's new" section.
- Remove top-level clones.
- Spell check entire file.
- Copy release notes to leoDist.leo.
- Copy release notes to LeoReleaseNotes.leo
- Select the readme node.

LeoDist.leo:
- Make sure copyright dates are correct.
- Update version numbers: search leoDist.leo for ##version.
- Update readme.md.
- Check readme.md spelling.
- Check 'PKG-INFO.TXT'

LeoPyRef.leo and LeoPluginsRef.leo:
- Regenerate from corresponding local file.
- Remove top-level clones.
</t>
<t tx="ekr.20180405171433.3">- Regenerate all .html files.
- Copy files to web, including leo/doc/html/index.html
  Do **not** copy searchindex.js.
</t>
<t tx="ekr.20180405171433.4">- Make sure no distributed .leo file contains xml-stylesheet elements.
  Run @button check .leo files in leo-dist.leo.
- Make sure Leo looks good without myLeoSettings.leo.
- Run the "check-bindings" button in leoSettings.leo.
- Run all unit tests with *both* Python 2 and 3.
- Run ll -a with *both* Python 2 and 3.</t>
<t tx="ekr.20180405171433.7">Merge the -rel branch into master.
- Run all unit tests.
- Run pylint on all files.

Create a git tag **last**

- Create a full (annotated) tag:
  - Do not use the -f option.
  - Make sure the tag does not conflict with the release branch.
    Release *branches* should end with "-rel"
    Tags should *not* end with "-rel"

git tag -a 5.xxx -m "Added 5.xxx tag"
git push --follow-tags
</t>
<t tx="ekr.20180405171433.8">- Create a documentation file at SourceForge, directing people to GitHub.

- Update the *GitHub* release at https://github.com/leo-editor/leo-editor/releases
   This must be done *soon* after the release's actual commit.
   There is a "Draft New Release" button at the top-right of the page.
</t>
<t tx="ekr.20180405171433.9">- Update version number on Leo's wikipedia site:
  http://en.wikipedia.org/wiki/Leo_%28editor%29
  - Edit with the 'Edit this page' *tab* (not a link)
  - Update version number on web site.

- Announce to SourceForge:  http://sourceforge.net/projects/leo/
   **Markdown accepted, so paste release notes in LeoDocs.leo.**.

- Announce to leo-editor: **Paste source-forge announcement**.

- Announce to Python-announce-list using email:
   mailto:python-announce-list@python.org
   **Paste source-forge or leo-editor announcement**.

  - Check it by visiting the archive:
  https://mail.python.org/pipermail/python-announce-list/

- Register Leo at https://pypi.python.org/pypi/leo

- My blog: http://edreamleo.blogspot.com/
  **Paste source-forge or leo-editor announcement** as text, not html.
  
- Email Matt Wilkie, maphew@gmail.com, announcing the release.
  </t>
<t tx="ekr.20180527084946.1">May 28, 2018
Leo 5.7.3, http://leoeditor.com, is now available on
[GitHub](https://github.com/leo-editor/leo-editor).

Leo is an IDE, outliner and PIM, as described [here](http://leoeditor.com/preface.html).

**The highlights of Leo 5.7.3**

- Added support for Jedi autocompletion.
- Much improved python_terminal plugin.
- Much improved recursive import script.
- New leo_babel plugin.
- Leo's pylint command writes clickable links.
- Smart searches for functions and methods.
- Allow separate bindings for numeric keypad keys
- Added easy-to-use diff-related wrappers for scripts.
- Allow local overrides of all abbreviations.
- Improved TypeScript importer.
- The usual minor bug fixes.

**Links**

- Leo's home page: http://leoeditor.com
- [Documentation](http://leoeditor.com/leo_toc.html)
- [Tutorials](http://leoeditor.com/tutorial.html)
- [Video tutorials](http://leoeditor.com/screencasts.html)
- [Forum](http://groups.google.com/group/leo-editor)
- [Download](http://sourceforge.net/projects/leo/files/)
- [Leo on GitHub](https://github.com/leo-editor/leo-editor)
- [LeoVue](https://github.com/kaleguy/leovue#leo-vue)
- [What people are saying about Leo](http://leoeditor.com/testimonials.html)
- [A web page that displays .leo files](http://leoeditor.com/load-leo.html)
- [More links](http://leoeditor.com/leoLinks.html)
</t>
<t tx="ekr.20180527084946.10">A mass cleanup of Leo's code, removing many unused tracing statements.</t>
<t tx="ekr.20180527084946.11"></t>
<t tx="ekr.20180527084946.12">https://github.com/leo-editor/leo-editor/issues/909
</t>
<t tx="ekr.20180527084946.13">https://github.com/leo-editor/leo-editor/issues/910</t>
<t tx="ekr.20180527084946.14"></t>
<t tx="ekr.20180527084946.15">https://github.com/leo-editor/leo-editor/issues/309
</t>
<t tx="ekr.20180527084946.16">https://github.com/leo-editor/leo-editor/issues/738
</t>
<t tx="ekr.20180527084946.17">https://github.com/leo-editor/leo-editor/issues/868

As usual, spellings are not significant. For example:

clone-find-all-flattened = Key_Pad+9
clone-find-all = keypad-PageUp
    # Same as keypad+pageup, etc. etc.</t>
<t tx="ekr.20180527084946.18">Allow local overrides of @data global-abbreviations &amp; @outline-data tree-abbreviations
https://github.com/leo-editor/leo-editor/issues/904</t>
<t tx="ekr.20180527084946.19">@language rest

Added c.diff_file, c.diff_two_branches and c.git_diff. Examples:

@language python

# creates outline-oriented diffs between all changed files between any two revs.
# In this case, rev1 is the last rev in devel not affected by removing trace statements.

c.diff_two_revs(
 rev1="24abd822b", # devel
 rev2="HEAD", # will work in *any* branch
)

# Leo's git-diff command:
c.git_diff()

# Compares a file in two different branches:
c.diff_two_branches(
    branch1='master',
    branch2='devel',
    fn='leo/core/leoCommands.py',
)
</t>
<t tx="ekr.20180527084946.2"></t>
<t tx="ekr.20180527084946.20">For documentation, see the leo/plugins/leo_babel/doc folder.</t>
<t tx="ekr.20180527084946.21">The recursive import script now adds disambiguating headline comments as follows:

- If a node is a descendant of a class node, the script prepends the class's name:

    aClass.headline

- Otherwise, the script appends the file name:

    headline (x.py)

This is a huge help when using the clone-find commands.
</t>
<t tx="ekr.20180527084946.22"></t>
<t tx="ekr.20180527084946.23">Clicking on underlined links in the log pane takes you to the proper node and line.</t>
<t tx="ekr.20180527084946.24">- Removed @bool trace_import.
- Removed @bool trace_bind_key_exceptions.</t>
<t tx="ekr.20180527084946.25">The find-def command is typically invoked by control-clicking a function name. This command now will search for possible *alternative spellings* of the name if no match is found initially:

- If the original name contains an underscore, say x_y, the second search will be for the camelCase version, xY.

- Otherwise, we assume the name may be camelCase, say xY, and we attempt to convert it to x_y.

A second search is attempted only if the converted name is different from the original.  In particular, names starting with a leading underscore are never converted.

The new setting: @bool find-def-creates-clones (default False) controls whether a clone-find-flattened command is used to show all matching definitions. This setting has no effect when only one definition is found.</t>
<t tx="ekr.20180527084946.3">https://github.com/leo-editor/leo-editor/issues/841</t>
<t tx="ekr.20180527084946.4">https://github.com/leo-editor/leo-editor/issues/892
</t>
<t tx="ekr.20180527084946.5">https://github.com/leo-editor/leo-editor/issues/893

A complete rewrite of the python_terminal plugin.</t>
<t tx="ekr.20180527084946.6">https://github.com/leo-editor/leo-editor/issues/901
</t>
<t tx="ekr.20180527084946.7"></t>
<t tx="ekr.20180527084946.8">https://github.com/leo-editor/leo-editor/issues/875</t>
<t tx="ekr.20180527084946.9">BackgroundProcessManager.start_process now takes two new kwargs:  link_pattern and link_root:

- link_pattern: a regex string or compiled regex pattern, used to determine whether a message contains a link.

- link_root: the root @file node.

When present, bpm.put_log uses these as follows::

    unl = link_root.get_UNL(with_proto=True, with_count=True)
    nodeLink = "%s,%d" % (unl, -line)
    c.frame.log.put(s + '\n', nodeLink=nodeLink)
</t>
<t tx="ekr.20180828034134.1">Leo 5.8 b1, http://leoeditor.com, is now available on
[GitHub](https://github.com/leo-editor/leo-editor).

Leo is an IDE, outliner and PIM, as described [here](http://leoeditor.com/preface.html).

**The highlights of Leo 5.8**

- Much faster file-read code.
- Leo no longer caches file contents. Removed --no-cache!
- Leo using ElementTree instead of sax to read .leo files.
- Refactored and improved Leo's key-handling code.
- Improved Leo's outline drawing code.
- The usual minor bug fixes.

**Links**

- Leo's home page: http://leoeditor.com
- [Documentation](http://leoeditor.com/leo_toc.html)
- [Tutorials](http://leoeditor.com/tutorial.html)
- [Video tutorials](http://leoeditor.com/screencasts.html)
- [Forum](http://groups.google.com/group/leo-editor)
- [Download](http://sourceforge.net/projects/leo/files/)
- [Leo on GitHub](https://github.com/leo-editor/leo-editor)
- [LeoVue](https://github.com/kaleguy/leovue#leo-vue)
- [What people are saying about Leo](http://leoeditor.com/testimonials.html)
- [A web page that displays .leo files](http://leoeditor.com/load-leo.html)
- [More links](http://leoeditor.com/leoLinks.html)
</t>
<t tx="ekr.20180828095749.1">git checkout -b x.y-final-rel
git push origin x.y-final-rel
</t>
<t tx="ekr.20180828095843.1">leoVersion.py:
- Update version constant.
</t>
<t tx="maphew.20180128212042.1">@language md
@wrap

Written by Matt Wilkie. Slightly revised by EKR.

PyPi is the Python Package Index Page: https://pypi.python.org/pypi

See https://github.com/leo-editor/leo-editor/issues/562

Once published to pypi Leo can be installed with:

    pip install leo

Python 2.7 will need to install PyQt 4 or 5 as a separate step. Anaconda or
miniconda is recommended:

    conda install pyqt

Developers should install from git as some files are left out when using pip (see Caveats):

    git clone --depth=500 https://github.com/leo-editor/leo-editor.git
    pip install -e .\leo-editor

nb: Optional `--depth=500` fetches the last 3-4 months of activity and is
    orders of magnitude faster than a full clone. If needed later use `git pull
    --unshallow` to grab everything that was missed.
</t>
<t tx="maphew.20180128212042.2">Install using pip if needed:

 - Wheel: for building cross platform binaries (might be installed already)
 - Setuptools: because ...setup!
 - Twine: for secure upload to pypi.org
 - PyPandoc: to convert markdown to rst for Readme
 - Semantic_version: make version number compatible with Pypi.org

    pip install pypandoc setuptools twine wheel semantic_version

Pandoc executable must be in PATH. If not installed already one these should
work (or use your own preferred method):

    # Preferred
    conda install pandoc

    # Alternate
    from pypandoc.pandoc_download import download_pandoc
    download_pandoc()</t>
<t tx="maphew.20180128212042.3">A PyPi account is needed to update Leo's pypi reference. Contact one of the
package index owners to be added as a maintainer if needed. See end of
https://pypi.python.org/pypi/leo

Verify access Leo package edit page at:
https://pypi.python.org/pypi?%3Aaction=pkg_edit&amp;name=leo
</t>
<t tx="maphew.20180128212042.4">## Overview

* Remove stale distribution files &amp; folders.  
* Optionally set local checkout to specific version tag.  
* Build redistributable source and binary wheel package.  
* Upload to PyPi (assumes account registration already completed).  
* Test download and install from PyPi. Best to uninstall old Leo first or run in clean virtual env.

## Example

Windows syntax. 'Activate/deactivate' assume using virtual environments; skip those lines if not:

    activate leo-build
    
    rmdir /s/q dist build leo.egg-info
    git checkout tags/5.7
    python setup.py bdist_wheel
    
    :: Optional, test install locally
    pip install dist\*.whl
    leo-console --version
    pip uninstall leo
    
    twine upload dist\*.whl
    
    :: Optional, inspect public page for problems
    start https://pypi.python.org/pypi/leo
    
    deactivate
    
    :: For fuller test `conda create --name py3-clean` first instead of re-using
    activate py3-clean
    
    pip install leo
    leo-console --version

Twine upload will use username and password stored in `.pypirc`, or will prompt
if that doesn't exist.
</t>
<t tx="maphew.20180128212042.5">`pip install leo` only installs the contents of `leo` folder.
So links to files in the project root or other folders will be broken. (Background https://github.com/leo-editor/leo-editor/issues/573)

    ./leo-editor/*         --&gt; left out
    ./leo-editor/docs/*    --&gt; left out
    ./leo-editor/leo/*/*/* --&gt; PYTHONHOME/Lib/site-packages/leo

Docs: of little concern. These can regenerated from sources in ./leo (leoDocs.leo), and are on the website: http://leoeditor.com

Root: these files should only be involved in building installers and similar activities (e.g. leoDist.leo). Work from a git checkout or source tarball instead: https://github.com/leo-editor/leo-editor</t>
<t tx="maphew.20180128213245.1">TestPyPI: https://packaging.python.org/guides/using-testpypi/
is a separate instance of the Python Package Index (PyPI) that allows
trying out the distribution tools and process without worrying about affecting
the real index.

I (Matt) don't recommend using Test PyPi for Leo unless problems with the
package on the PyPi side are anticipated. It's too much of a pain to switch back
and forth between test and production when testing installs. In practice most
problems will be found and encountered when testing an install straight from the
whl file on disk:

    pip install dist\Leo-*.whl

That said, here's my recipe for packaging a new release for Test PyPi:
(Windows syntax)

    ::Verify integrity and Build (see leo\dist\build-*.bat)
    python setup.py check
    python setup.py bdist_wheel

    ::Test default install locally
    pip install dist\leo-5.7.dev344-py2.py3-none-any.whl
    leo-c --version
    pip uninstall leo

    ::Upload
    twine upload --repository-url https://test.pypi.org/legacy/ dist/leo-5.7.dev344-py2.py3-none-any

    ::Install from remote
    pip install --pre --index-url https://test.pypi.org/simple/ leo
    leo-c --version

Remove broken releases (still can't re-use identical version numbers and file names though):
https://testpypi.python.org/pypi?%3Aaction=pkg_edit&amp;name=leo
</t>
</tnodes>
</leo_file>
