That's not what I am commenting on - I'm well aware of all of that.

I am commenting on the fact that the documentation says that an @path 
directive (and all the others in the table below) takes the form

@path **=** my/path

whereas in fact no equals sign is necessary (any might well cause an error?)

@path  my/path




On Sunday, March 24, 2024 at 4:10:38 AM UTC tbp1...@gmail.com wrote:

> *@path* headlines must be like this: @path c:/test/python. Use forward 
> slashes even on Windows. The pathlib methods will use forward slashes and 
> output whatever is right for the OS.
>
> On Saturday, March 23, 2024 at 7:14:14 PM UTC-4 jkn wrote:
>
>> BTW [Edward], isn't this documentation, from 
>> https://leo-editor.github.io/leo-editor/customizing.html#simple-settings-nodes,
>>  
>> incorrect - or am I misunderstanding something?
>>
>> """
>> Simple settings nodes have headlines of the form @<type> name = val. 
>> These settings set the value of name to val, with the indicated type:
>> """
>> ISTM that the headlines are of the form
>>
>>     @type val
>>
>> or can you actually write
>>
>> @path = <some path>
>>
>> etc? I can find no examples of this...
>>
>> On Saturday, March 23, 2024 at 10:55:16 PM UTC jkn wrote:
>>
>>> I think I have an earlier version of this snippet from you somewhere - I 
>>> was going to take a look at it for this purpose. So thanks!
>>>
>>>     J^n
>>>
>>>
>>> On Saturday, March 23, 2024 at 10:42:32 PM UTC tbp1...@gmail.com wrote:
>>>
>>>> I've been using an "images" subdirectory under the location of the 
>>>> outline, or under the @path location if you use one.  It would make backup 
>>>> or sharing easier than some random location in the file system.  The 
>>>> script 
>>>> could check for its existence and create it if needed.  
>>>>
>>>> Here's how I get the path of the node or it's @path into the clipboard:
>>>>
>>>> """Copy the effective path of the current node to the clipboard.
>>>>
>>>> This command honors @path directives.
>>>> """
>>>> from pathlib import Path
>>>>
>>>> pth = Path(c.fullPath(p))
>>>> if pth.exists():
>>>>     if pth.is_file():
>>>>         direc = pth.parent
>>>>     else:
>>>>         direc = pth
>>>> else:
>>>>     direc = Path(g.scanAllAtPathDirectives(c, p))
>>>>
>>>> if direc:
>>>>     normdir = str(direc.resolve())
>>>>     g.app.gui.replaceClipboardWith(normdir)
>>>> else:
>>>>     g.es(f"Path {direc} doesn't exist")
>>>>
>>>> BTW, I have this script linked to a button, which is very convenient 
>>>> sometimes.
>>>> On Saturday, March 23, 2024 at 6:30:21 PM UTC-4 jkn wrote:
>>>>
>>>>> Hi Thomas
>>>>>     not sure what an undoer would do here? maybe delete the file? 
>>>>> There is no leo-relevant action here (yet)
>>>>>
>>>>> I'm well aware I don't *need* the main(), but I prefer to write this 
>>>>> way. Same as with bash scripts etc. It helps for future modularity, I 
>>>>> find. 
>>>>> Of course, 'YAGNI', but still. f course you are right that main() could 
>>>>> be 
>>>>> more descriptive, this is only a POC.
>>>>>
>>>>> The tricky bit is deciding where to store the clipboard files. 
>>>>> Obsidian has a special action when you click on inserted 'snippet' 
>>>>> images; 
>>>>> it just stores the filename in the 'body', and uses its knowledge of 
>>>>> where 
>>>>> the snippets are located when you do the equivalent of CTRL-click on the 
>>>>> URL
>>>>>
>>>>> Linking the location of the 'snippets' to the leo file and/or node is 
>>>>> an interesting challenge...
>>>>>
>>>>>
>>>>>
>>>>> On Saturday, March 23, 2024 at 10:09:59 PM UTC tbp1...@gmail.com 
>>>>> wrote:
>>>>>
>>>>>> Looks pretty straightforward.  Perhaps you'll want to make it 
>>>>>> undoable (so far as Leo is concerned).  As a matter of Python 
>>>>>> programming, 
>>>>>> defining a main() function here isn't needed.  If you are only going to 
>>>>>> use 
>>>>>> it as a script, then you don't need a function at all. Just unindent 
>>>>>> those 
>>>>>> lines of code (and delete the "main()" line) and they will run when the 
>>>>>> script runs.  No need to call main() at all.   If you want that 
>>>>>> clipboard 
>>>>>> part of the block to run and if it succeeds then insert the markdown 
>>>>>> text 
>>>>>> into a node, then the function shouldn't be called "main" but something 
>>>>>> more descriptive.
>>>>>>
>>>>>> On Saturday, March 23, 2024 at 4:59:25 PM UTC-4 jkn wrote:
>>>>>>
>>>>>>> OK, here is a simple demonstration of part of the feature I am 
>>>>>>> interested in.
>>>>>>>
>>>>>>> When run with an image in the (global) clipboard, it saves this to a 
>>>>>>> local timestamped file (under ~/tmp), and indicates how a markdown 
>>>>>>> reference to that file could be inserted.
>>>>>>>
>>>>>>> There's plenty more needed but this is the QClipboard part, I think.
>>>>>>>
>>>>>>> import os
>>>>>>> import time
>>>>>>>     
>>>>>>> def unique_png_fname():
>>>>>>>     """ return a unique (timestamped) filename to use
>>>>>>>     """
>>>>>>>     FORMAT="%Y-%m-%d-%H-%M-%S.png"
>>>>>>>     return time.strftime(FORMAT)
>>>>>>>
>>>>>>> def link_string_md(fname):
>>>>>>>     """ get markdown format to insert a filename
>>>>>>>     """
>>>>>>>     return "![[%s]]" % fname
>>>>>>>
>>>>>>> def main():
>>>>>>>     # get clipboard contents - default mode is global clipboard
>>>>>>>     cb = g.app.gui.qtApp.clipboard()
>>>>>>>     # is it in image format?
>>>>>>>     img = cb.image()
>>>>>>>     if not img.isNull():
>>>>>>>         basefiledir = os.path.expanduser("~/tmp")
>>>>>>>         fqfilepath = os.path.join(basefiledir, unique_png_fname())
>>>>>>>         img.save(fqfilepath, "PNG")
>>>>>>>         g.es("wrote clipboard to:", fqfilepath)
>>>>>>>         g.es("could insert:", link_string_md(fqfilepath))
>>>>>>>     else:
>>>>>>>         g.es("clipboard not in image format")
>>>>>>>
>>>>>>> main()
>>>>>>>
>>>>>>>
>>>>>>> On Monday, March 11, 2024 at 8:23:42 PM UTC jkn wrote:
>>>>>>>
>>>>>>>> Doh! should have read the documentation better.
>>>>>>>>
>>>>>>>> you have to test for a 'null image' using eg. img.isnull()
>>>>>>>>
>>>>>>>> on with my trivial experiments...
>>>>>>>>
>>>>>>>>
>>>>>>>> On Monday, March 11, 2024 at 8:10:03 PM UTC jkn wrote:
>>>>>>>>
>>>>>>>>> Has anyone played much with class QClipboard? I did a couple of 
>>>>>>>>> trivial experiments but I must be misunderstanding something.
>>>>>>>>>
>>>>>>>>> for instance, QClipboard.image() returns a non-null value even if 
>>>>>>>>> the clipboard does not contain an image.
>>>>>>>>>
>>>>>>>>>     J^n
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Monday, March 11, 2024 at 4:33:23 PM UTC tbp1...@gmail.com 
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> It turns out that to get the relative path conversion w have to 
>>>>>>>>>> remove any quotation marks around the path before running 
>>>>>>>>>> os.relpath(). So 
>>>>>>>>>> the script becomes:
>>>>>>>>>>
>>>>>>>>>> """Insert RsT code at cursor to display an image.
>>>>>>>>>>
>>>>>>>>>> The path to the image file will come from a file dialog.
>>>>>>>>>> This action is undoable.
>>>>>>>>>> """
>>>>>>>>>> PATH = g.app.gui.runOpenFileDialog(c,
>>>>>>>>>>     title="Import File",
>>>>>>>>>>     filetypes=[("All files", "*"),],
>>>>>>>>>>     defaultextension=".*",
>>>>>>>>>>     multiple=False)
>>>>>>>>>>
>>>>>>>>>> if PATH:
>>>>>>>>>>     from os.path import relpath
>>>>>>>>>>     PATH = PATH.replace('"', '').replace("'", '')
>>>>>>>>>>     PATH = relpath(PATH)
>>>>>>>>>>     PATH = PATH.replace('\\', '/')
>>>>>>>>>>
>>>>>>>>>>     IMAGE_TEMPLATE = f'''
>>>>>>>>>>
>>>>>>>>>> .. figure:: {PATH}
>>>>>>>>>>     :scale: 50%
>>>>>>>>>>
>>>>>>>>>> '''
>>>>>>>>>>
>>>>>>>>>>     w = c.frame.body.wrapper
>>>>>>>>>>     p = c.p
>>>>>>>>>>     s = p.b
>>>>>>>>>>     u = c.undoer
>>>>>>>>>>
>>>>>>>>>>     start, _ = w.getSelectionRange()
>>>>>>>>>>
>>>>>>>>>>     undoType = 'insert-rst-image-code'
>>>>>>>>>>     undoData = u.beforeChangeNodeContents(p)
>>>>>>>>>>
>>>>>>>>>>     head, tail = s[:start], s[start:]
>>>>>>>>>>     p.b = head + IMAGE_TEMPLATE + tail
>>>>>>>>>>
>>>>>>>>>>     c.setChanged()
>>>>>>>>>>     p.setDirty()
>>>>>>>>>>     u.afterChangeNodeContents(p, undoType, undoData)
>>>>>>>>>>     c.redraw()
>>>>>>>>>>
>>>>>>>>>> On Saturday, March 9, 2024 at 2:04:19 PM UTC-5 Thomas Passin 
>>>>>>>>>> wrote:
>>>>>>>>>>
>>>>>>>>>>> We can't directly insert an image into a standard Leo node 
>>>>>>>>>>> because they are text-only.  I find this very annoying sometimes, 
>>>>>>>>>>> especially when I am writing a note and want to include an image.  
>>>>>>>>>>>
>>>>>>>>>>> But we can do the next best thing - insert an ReStructuredText 
>>>>>>>>>>> (RsT) instruction to display an image so that we can view it with 
>>>>>>>>>>> the 
>>>>>>>>>>> viewrendered3 plugin (VR3). The instruction is short and easy, but 
>>>>>>>>>>> it's 
>>>>>>>>>>> still annoying to type and I usually forget the exact details. I 
>>>>>>>>>>> have a 
>>>>>>>>>>> button that toggles VR3 on and off so that it's easy to view an 
>>>>>>>>>>> embedded 
>>>>>>>>>>> image once the RsT instruction is there. An embedding command would 
>>>>>>>>>>> make 
>>>>>>>>>>> embedding with Leo as easy as embedding an image in a word 
>>>>>>>>>>> processor.  
>>>>>>>>>>>  Aha, this is Leo, let's write a script!
>>>>>>>>>>>
>>>>>>>>>>> Here is a script that pops up a file dialog and inserts a 
>>>>>>>>>>> relative path to the chosen file.  There are several small 
>>>>>>>>>>> variations which 
>>>>>>>>>>> I discuss after the code.
>>>>>>>>>>>
>>>>>>>>>>> """Insert RsT code at cursor to display an image.
>>>>>>>>>>>
>>>>>>>>>>> The path to the image file will come from a file dialog.
>>>>>>>>>>> This action is undoable.
>>>>>>>>>>> """
>>>>>>>>>>> PATH = g.app.gui.runOpenFileDialog(c,
>>>>>>>>>>>     title="Import File",
>>>>>>>>>>>     filetypes=[("All files", "*"),],
>>>>>>>>>>>     defaultextension=".*",
>>>>>>>>>>>     multiple=False)
>>>>>>>>>>>
>>>>>>>>>>> if PATH:
>>>>>>>>>>>     from os.path import relpath
>>>>>>>>>>>     PATH = relpath(PATH)
>>>>>>>>>>>     PATH = PATH.replace('\\', '/').replace('"', '').replace("'", 
>>>>>>>>>>> '')
>>>>>>>>>>>     IMAGE_TEMPLATE = f'''
>>>>>>>>>>>
>>>>>>>>>>> .. figure:: {PATH}
>>>>>>>>>>>     :scale: 50%
>>>>>>>>>>>
>>>>>>>>>>> '''
>>>>>>>>>>>     w = c.frame.body.wrapper
>>>>>>>>>>>     p = c.p
>>>>>>>>>>>     s = p.b
>>>>>>>>>>>     u = c.undoer
>>>>>>>>>>>
>>>>>>>>>>>     start, _ = w.getSelectionRange()
>>>>>>>>>>>
>>>>>>>>>>>     undoType = 'insert-rst-image-code'
>>>>>>>>>>>     undoData = u.beforeChangeNodeContents(p)
>>>>>>>>>>>
>>>>>>>>>>>     head, tail = s[:start], s[start:]
>>>>>>>>>>>     p.b = head + IMAGE_TEMPLATE + tail
>>>>>>>>>>>
>>>>>>>>>>>     c.setChanged()
>>>>>>>>>>>     p.setDirty()
>>>>>>>>>>>     u.afterChangeNodeContents(p, undoType, undoData)
>>>>>>>>>>>     c.redraw()
>>>>>>>>>>>
>>>>>>>>>>> Variations:
>>>>>>>>>>> 1.  If you want an absolute path instead of a relative path, 
>>>>>>>>>>> delete the lines
>>>>>>>>>>>     from os.path import relpath
>>>>>>>>>>>     PATH = relpath(PATH)
>>>>>>>>>>> with
>>>>>>>>>>>
>>>>>>>>>>> 2. If you  want to get the path from the clipboard instead of a 
>>>>>>>>>>> file dialog, replace the lines
>>>>>>>>>>>
>>>>>>>>>>> PATH = g.app.gui.runOpenFileDialog(c,
>>>>>>>>>>>     title="Import File",
>>>>>>>>>>>     filetypes=[("All files", "*"),],
>>>>>>>>>>>     defaultextension=".*",
>>>>>>>>>>>     multiple=False)
>>>>>>>>>>>
>>>>>>>>>>> with the line 
>>>>>>>>>>>
>>>>>>>>>>>     PATH = g.app.gui.getTextFromClipboard()
>>>>>>>>>>>
>>>>>>>>>>> 3. If you want the embedded image to be full width instead of 
>>>>>>>>>>> 50%, delete the line
>>>>>>>>>>>
>>>>>>>>>>>     :scale: 50%
>>>>>>>>>>>
>>>>>>>>>>> 4. You can make this work with Markdown or Asciidoc by using 
>>>>>>>>>>> their embedding instruction in the TEMPLATE instead of the RsT one.
>>>>>>>>>>>
>>>>>>>>>>> I have added the command to my own local menu.  VR3 can open in 
>>>>>>>>>>> a tab in the log pane; the command for toggling in a tab is 
>>>>>>>>>>> *vr3-toggle-tab. * I usually like opening it in the log pane 
>>>>>>>>>>> instead of in its own separate pane.
>>>>>>>>>>>
>>>>>>>>>>> If you would like to create a local menu of your own and don't 
>>>>>>>>>>> know how, it's easy.  Just ask and I'll show what to add to 
>>>>>>>>>>> myLeoSettings,leo.
>>>>>>>>>>>
>>>>>>>>>>

-- 
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 leo-editor+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/leo-editor/a24a069b-d2d4-43cc-a2eb-7735788ca73an%40googlegroups.com.

Reply via email to