*@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/04a61deb-86f6-43f4-925d-1f4af7234aafn%40googlegroups.com.

Reply via email to