Extracting scripts from forum posts

It is all doable, except for the “AppleScript://” link. But you can use two separate scripts or macros to achieve the same:

  1. One script/macro to copy selection from SD and paste into forum post using markdown which will auto format for AppleScript (or any other supported language).
  2. Another script/macro to copy selected script (or script that is moused-over) from forum and paste into SD.

For #1, see Keyboard Maestro Macro to Paste Script in Discourse Forum . You will just need to insert steps at the beginning to copy the SD selection.

For #2, see this script by Chris Stone, above.

For reference, here’s the forum markdown to format a script as AppleScript:

 ```applescript
 -- your code here

It is best to convert any TABs used for formatting to spaces.  Otherwise the forum software will use 8 spaces/TAB.

And please note that I have made AppleScript the default language for code blocks so even if you omit the applescript specification, it will still work.

1 Like

One script/macro to copy selection from SD and paste into forum post using markdown which will auto format for AppleScript (or any other supported language).

Right, and I have those that work in other contexts, but I’m not sure about discourse and markdown. The version I use requires style sheets.

Another script/macro to copy selected script (or script that is moused-over) from forum and paste into SD.

It really should be as simple to use for anyone as macScripter. You can’t expect users to install some proprietary software to make simple things work.

1 Like

I thought I had clearly explained that. No CSS is required. Only Markdown, as shown in this post:

You speak of Keyboard Maestro as if it were some otherwise useless piece of software. It is quite the contrary. It is one of the most useful software apps/utilities I have ever owned. I use it countless times a day. If you are not familiar with it, I suggest you try the 30-day free trial – full version with no limitations.

I was simply offering a KM solution for those that want to use it. AFAIK, MacScripters.net is the only forum that offers the “applescript://” protocol, but maybe there are others.

Discourse forum software is open source, and supports custom plugins.
If you feel strongly about making it very easy for users to copy from the forum to SD, then you can do any of the following:

  1. Write an AppleScript that will do it (to be run from FastScripts or the Apple Script menu). It should be easy enough, given the scripts/macros already posted here.
  2. Write a Discourse plugin that will do it.

I was throwing my script snippets into TextWrangler, adding four spaces at the beginning and then doing a search & replace on \n with four spaces and \n.

Now that I’ve seen the four backticks trick, hopefully that won’t be necessary.

I didn’t get that impression. I think Ed was making a valid point that people shouldn’t have to install software - however valuable it might be for other uses - just to grab a script from this forum.

Definitely not necessary. And it is only 3 backticks.
See above.

Thanks for the correction.

This info should really be more prominent, like in a pinned thread somewhere. I’ve been here almost since day 1 and I’ve only just learned how this is done.

In a couple of weeks time this thread will be buried and newcomers will be forever asking how it’s done.

Just an FYI, I’ve been copying and pasting script samples from the forum into scripts with no problem. (Although when that link becomes available, that will be good).

But today I tried to copy and paste the script into an email (Outlook) and while it looked OK on my end, the received message looked terrible and was unusable. (see below).

I don’t know if that’s an outlook issue, or a general email issue or what, but if there’s anything that can be done to avoid the issue or fix it in the forum, that would be good.


use
AppleScript
version
"2.5"

10.11 or later
use framework "Foundation"
use framework "AppKit"
use framework “Carbon”

AEInteractWithUser() is in Carbon
use scripting additions property
returnCode : missing
value
on
showMessage:theMessage withTitle:boldBit textFrame:textFieldSize textMaxWidth:maxWidth withButtons:buttonsList

credit to Shane Stanley for this handler

make attributed string system font with monospaced digits
set
fontSize to
current
application’s
NSFont’s systemFontSizeForControlSize:(current
application’s
NSRegularControlSize) set
theFont to
current
application’s
NSFont’s monospacedDigitSystemFontOfSize:fontSize weight:(current
application’s
NSFontWeightRegular) set
attsDict to
current
application’s
NSDictionary’s dictionaryWithObject:theFont forKey:(current
application’s
NSFontAttributeName) set
attString to
current
application’s
NSAttributedString’s alloc()'s initWithString:theMessage attributes:attsDict –
make a text field to hold the message
set
theField to
(current
application’s
NSTextField’s alloc()'s initWithFrame:textFieldSize) tell
theField (its
setEditable:false)
(its
setBordered:false)
its
setDrawsBackground:false
its
(cell()'s setWraps:true)
its
setPreferredMaxLayoutWidth:maxWidth its
setAttributedStringValue:attString end
tell

make it fit; needs to be done on the main thread
my
performSelectorOnMainThread:"fitToSizeView:"
withObject:theField waitUntilDone:true

make sure we have permission
set
theError to
current
application’s
AEInteractWithUser(-1,
missing
value,
missing
value)

-1 is kAEDefaultTimeout
if
theError is
not
0
then
error
"User
interaction disallowed"
number
theError –
create an alert set
theAlert to
current
application’s
NSAlert’s alloc()'s init() tell
theAlert its
setMessageText:boldBit repeat
with
anEntry in
buttonsList (its
addButtonWithTitle:anEntry) end
repeat
its
setAccessoryView:theField end
tell

show the alert; needs to be done on the main thread
my
performSelectorOnMainThread:"showTheAlert:"
withObject:theAlert waitUntilDone:true
set
buttonNumber to
returnCode mod
1000

  • 1

    where 1 = right-most button
    set
    buttonName to
    item
    buttonNumber of
    buttonsList return
    buttonName end
    showMessage:withTitle:textFrame:textMaxWidth:withButtons: on
    showTheAlert:theAlert #
    credit to Shane Stanley for this handler

    check we are running in foreground
    if
    not
    (current
    application’s
    NSThread’s isMainThread()) as
    boolean
    then
    error
    "This
    handler must be called on the main thread.“
    from
    current
    application
    set
    my
    returnCode to
    theAlert’s runModal() end
    showTheAlert: on
    fitToSizeView:aView #
    credit to Shane Stanley for this handler
    aView’s setFrameSize:(aView’s fittingSize()) end
    fitToSizeView: #
    set up the parameters for the showMessage call:
    set
    theMessage to
    "How
    many buttons would you like? There’s no real limit except for practical and aesthetic considerations.”
    & return
    & “Of
    course, I hope you’ll never really think about using something as ugly as this!”
    & return
    & return
    & "Choose
    your heart out!“
    set
    theTitle to
    "Many
    Buttons”

increase or decrease the second item’s numbers

to fit larger or smaller amounts of text

the ‘650’ here is the text field’s width

the ‘80’ is its height
set
theTextFieldSize to
{{0,
0},
{650,
80}}
set
buttonsToDisplay to
{“OK”,
“Five”,
“Four”,
“Three”,
“Two”,
“One”,
“Cancel”}
set
theButtonReturned to
its
showMessage:theMessage withTitle:theTitle textFrame:theTextFieldSize textMaxWidth:(650)
withButtons:buttonsToDisplay

Hi Ed

I’ve been caught out by the pasteboard adding formatting (often the wrong quotes marks, as well as line endings) so many times when copying from webpages that as a matter of habit I always paste a script into the editor and check it compiles first, then copy it from there directly before pasting it into anywhere else.

I’ve had this happen as well.

Two other workarounds:

  1. Attach script as a file
  2. Send the email as plain text

All good solutions.

If possible, I think it’s better to fix at the source.

They Yahoo group and the MacScripter list both allow copy and paste directly from displayed, formatted appleScript into email (and other apps). The result is plain text, which works just fine.

That would be better than what I’m seeing here.

Interesting. I have copy/paste a lot of scripts from other Discourse forums, and have never noticed this – never had an issue. Then I realized I am always pasting into an app that is expecting plain text.

I just tested pasting into Evernote and Outlook 2011, and in both cases the script was not pasted correctly.

BUT, when I did a “Paste & Match Style”, the script pasted correctly into both.

Thanks to a great little app named Script Debugger (ever hear of it?), I can easily discover the classes put on the clipboard:

set clipRec to the clipboard as record

shows this:

The problem is the «class HTML» class.

Thanks to Shane for some really cool code:

use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions

use framework "Foundation"
use framework "AppKit" -- for pasteboard

### SHANE'S CODE ###

set pb to current application's NSPasteboard's generalPasteboard()

-- read as html
set htmlText to (pb's stringForType:"public.html") as text

I can get the actual HTML text from the encoded «class HTML» class.

I have to say it is shocking! It is very verbose, may worse than the HTML code that Microsoft Word produces. I would post it here, but it is too long. Just run the above script after a copy of script from a script block somewhere in this forum, and you will see the results. As you know, HTML ignores CR and LF, and needs <BR> for line breaks. I didn’t see any in the HTML text. Or, it needs to be put in a block using <pre> tags. Didn’t see any of these either.

###The Workaround
Use “Paste & Match Style” in rich text apps.

OR, use this simple script (enhance as you see fit):

set scriptStr to the clipboard as text
set the clipboard to scriptStr as text

###The Fix
I’ll report this in the Discourse forum (meta.discourse.org), and see if they are aware of it, and if so, have any fixes/suggestions.

1 Like

If I understand correctly, Discourse uses code from https://highlightjs.org

Shane, I’m referring to the code put on the clipboard, not the HTML actually on the page. They are quite different.

I took a look at the highlightjs code and extending it to provide the Open-In-Script-Debugger link does not look too hard. The difficulty will be getting an updated version of highlightjs integrated into Discourse. Once I have the highlightjs code doing the right thing here, I’ll start on the problem of getting Discourse to service it for me.

A quick update on this issue:

I have a version of Highlight.js which generates an Open in Script Debugger link and that all works nicely. Now the challenge is integrated this into the Discourse software. I’ve posted a question on their forum and once I get a workable response, I’ll try installing my version of Highlight.js here.

Okay folks, its working. All AppleScript code blocks now have an Open in Script Debugger link which, when clicked, opens the code in Script Debugger. Have fun!

1 Like