You should be able to instantiate Leo with a null gui, and use its 
variables, like g.  That's what the LeoBridge does.  This would construct 
all the data structures that Leo needs to create outlines and import 
files.  (Disclaimer - I've not done this myself).

On Sunday, September 10, 2023 at 12:38:58 PM UTC-4 brian wrote:

> In the past, I’ve seen hacks like this take way too much time to maintain 
> and be way too fragile.  I’m trying to use the Leo code to abstract away 
> these low level details.  
>
> On Thursday, September 7, 2023 at 11:16:21 PM UTC-4 [email protected] 
> wrote:
>
>> If your notes are not too complicated, here's something you could do.
>>
>> 1. Open a Leo file with at least one of your note subtrees.  Select the 
>> top node of a note.
>> 2. Copy the node to the clipboard (*Outline/Copy Node*).
>> 3. Open an ordinary text editor and paste the clipboard into it.
>>
>> If you save this with a .leo extension, it will open as an ordinary Leo 
>> outline. 
>>
>> The structure should be pretty self explanatory. The node identifiers 
>> (they are "gnx"s) are your Leo user name concatenated with a time stamp 
>> (documented somewhere in Leo's codebase but pretty obvious to figure out) 
>> and you will need to come up with a way for your program to generate them 
>> so they have the correct format and are unique time stamps.  That won't be 
>> hard.  Here is a little example from my own workbook.leo file:
>>
>> <!-- Created by Leo: https://leo-editor.github.io/leo-editor/leo_toc.html 
>> -->
>> <leo_file xmlns:leo="
>> http://leo-editor.github.io/leo-editor/namespaces/leo-python-editor/1.1"; 
>> >
>> <leo_header file_format="2"/>
>> <vnodes>
>> <v t="tom.20230828142729.1"><vh>@md md-test-file.md</vh>
>> <v t="tom.20230828143844.1"><vh>Node 1</vh>
>> <v t="tom.20230828143916.1"><vh>Node 1.1</vh></v>
>> </v>
>> <v t="tom.20230828143933.1"><vh>Node 2</vh></v>
>> </v>
>> </vnodes>
>> <tnodes>
>> <t tx="tom.20230828142729.1">This is the head of the MD file.
>> </t>
>> <t tx="tom.20230828143844.1">This is node 1.
>> </t>
>> <t tx="tom.20230828143916.1">Node 1.1
>> </t>
>> <t tx="tom.20230828143933.1">Node 2
>> </t>
>> </tnodes>
>> </leo_file>
>>
>> You can see that the *vh* elements represent the headlines and the 
>> corresponding *t* elements represent the body text.  As long as your 
>> notes do not use any special XML characters you can put the text directly 
>> into the right places.  Otherwise you will have to perform XML escaping on 
>> the text.  The file will have to be encoded with utf-8, but that should be 
>> the default for any text file you write with Python 3+.
>>
>> The whole thing will be pretty easy to generate with a little Python 
>> code.  I don't think it's necessary to actually generate the file with an 
>> XML library but that would be easy too, especially if you already know how 
>> to do work with the library.  The standard Python library 
>> *xml.etree.ElementTree* should do.
>> On Thursday, September 7, 2023 at 10:07:08 PM UTC-4 brian wrote:
>>
>>> I’ve written a program that manages media and creates playlists.  It 
>>> does things like download RSS feeds, convert video to audio, sync with my 
>>> cell phone, etc.  
>>>
>>> I use Leo to keep notes.  When I find media that I want to add to my Leo 
>>> notes, I manually create the node and put in my notes in the text body.  I 
>>> want to expand my software where in addition to creating playlists, it will 
>>> create a .leo file so that I only have to add my notes.  
>>>
>>> I do NOT want to interact with an existing Leo instance.  If I did, I 
>>> would use leoBridge.  I want to create a .leo file that I can open with 
>>> Leo.  Like my program outputs playlists now, I want to output a .leo file 
>>> that I can open with Leo.  
>>>
>>> Looking at the API and classes, it would seems it would be possible to 
>>> create a .leo file.  It seems the code base has the core and the GUI in 
>>> different modules.  I like using the API or python classes most since I can 
>>> use my IDE and debugger.  Another option would be to spin up another 
>>> instance of Leo and use the bridge.  Another option would be to have my 
>>> program output the code that I could paste into a leo node to execute.  
>>>
>>> I have not considered outputting a format that leo can read directly. 
>>>  It would still be easier to code and debug if I used the Leo API or Leo 
>>> code base.  
>>>
>>> On Thursday, September 7, 2023 at 4:57:18 PM UTC-4 [email protected] 
>>> wrote:
>>>
>>>> Could you say more about what you want to accomplish?  Maybe there is 
>>>> another way to go about it.  Do you really need to open Leo 
>>>> programmatically from another program?  For example, you could write some 
>>>> (non-Leo) file with your program, launch Leo (from your program) with that 
>>>> file on the command line, and Leo would open or import that file.
>>>>
>>>> Well, it *used* to but just now when I tested it, you only get a node 
>>>> with the file name (if it's not a .leo file) and no content.  I don't know 
>>>> if that is now the intended behavior or not but it's a change.  I'm going 
>>>> to file an issue on that.
>>>>
>>>> Otherwise, to communicate with Leo requires the Leo bridge or some kind 
>>>> of server like leoserver, but you'd have to write a client for that.  But 
>>>> perhaps there is another way to do what you want to end up with.
>>>>
>>>> On Thursday, September 7, 2023 at 4:16:56 PM UTC-4 brian wrote:
>>>>
>>>>> How do I create a Leo outline from within a Python program? I have a 
>>>>> Python program where I want to export into a Leo outline format file. 
>>>>>
>>>>>
>>>>> All the snippets of code I’ve found assumes the code is running within 
>>>>> Leo. I want to run outside LEO 
>>>>>
>>>>>
>>>>> I tried this:
>>>>>
>>>>> from leo.core import leoGlobals as leo_g
>>>>>
>>>>> from leo.core import leoApp
>>>>>
>>>>> leo_g.app = leoApp.LeoApp()
>>>>>
>>>>> leo_c = leo_g.app.newCommander(‘test.leo’) 
>>>>>
>>>>> But I got the exception NoneType object has no attribute 
>>>>> ‘globalSettingsDict’ 
>>>>>
>>>>>
>>>>> I also tried:
>>>>>
>>>>> from leo.core.loeGlobals import createScratchCommander 
>>>>>
>>>>> c = createScratchCommander(‘test.leo’)
>>>>>
>>>>> I got the same error. 
>>>>>
>>>>>
>>>>> I found the “mod_read_dir_outline.py” plugin but it seems to be 
>>>>> written to work within Leo. 
>>>>>
>>>>>
>>>>> I found a post about “web-to-outline script” (
>>>>> https://groups.google.com/g/leo-editor/c/CkS8MLRStsA/m/7xbIowG9BAAJ) 
>>>>> but I could not find this script. 
>>>>>
>>>>>
>>>>> I also found LeoBridge to interface with an existing instance of Leo 
>>>>> but I just want to create an leo outline in another program and then 
>>>>> manually open the file with Leo.  I don't want to risk corrupting an 
>>>>> existing leo file.  
>>>>>
>>>>>
>>>>>

-- 
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/16a4369e-cb8a-4024-bbe2-7571c1aef4d8n%40googlegroups.com.

Reply via email to