We use ExtendScript with Adobe Indesign. Part of the workflow is to use a InDesign document as a template. The ExtendScript open a InDesign document, and replaces some text and images, and saves a pdf.
e.g. part of the code.
app.activeDocument.textFrames.item('design.name').contents= "John Doe"
Most items in the document are named. (done by modifying the names of the element in the Layer Toolbar)
Now when another user opens this document and saves it, it will place the elements in a group automatically.
This causes the script to stop working because the reference of textFrames.item('design.name') isn't available anymore.
How to handle this issue? because I don't want to manually move the elements out of the group after our designer has changed the InDesign document. Any suggestions are welcome.
Related
I start with a working example:
Open PowerPoint with a blank presentation.
Right-click the title slide and choose "Layout - Title and Content".
You see "• Click to add text"? Click and add some text.
Right-click the slide again and choose "Layout - Two Content".
See how smart PowerPoint can be?
The text you entered in the single placeholder before is now in one the of two placeholders.
Specifically, the left one.
My questions:
Why? (And not in an extra one?)
Why? (And not in the right one?)
My questions arises because I have received a set of master slides in which the above is not working, and I am trying to repair it without having to regenerate everything.
This is a site for programming issues, but the background behind this issue might be sufficiently complex. Modern PowerPoint files are XML. In the XML for each slide layout, each placeholder has an idx reference number. PowerPoint uses these on numbers to decide where to place content.
Lazy Designer Syndrome is the cause of what you're seeing. Instead of creating new placeholders in order, so the idx numbers would increment in a logical order, the designer has copied and pasted placeholders to avoid extra formatting work. The pasted placeholders all have the same idx number. As a result, PowerPoint has no idea of placeholder order and inserts content randomly.
This isn't always easy to solve without editing the XML, but you can try deleting all but the leftmost placeholder. Then create new placeholders by inserting them one at a time and reformatting them manually to match the first.
At first my attempts to follow the above failed, but now I got it working as well.
There are two different, but similar tags, id="" and idx="".
All objects in the slide has an id="" tag, this is not the tag to solve this problem.
The idx="" tag is only on Placeholder objects, except the those of Type=Title.
As described above you can set it to an integer value 1 and greater (I assume).
Make a plan for what Placeholder objects should be replaced across your layouts. I think of these as "groups" or "families", then assign the idx-values consistently throughout your slide layouts.
These "groups" or "families" of placeholders needs to be compatible for this to work, i.e. matching Type. The absence of Type means the placeholder is a general Content Type and match all Types.
During layout change, if Placeholders has incompatible Type while having the same idx-tag, PPT will look for the next Placeholder with matching Type.
#JohnKorchok's accepted answer provides the technical details for the procedure described here. Note that I only had "Content Placeholders" in my presentation.
Install 7-Zip and your favorite text editor (you can use one with an XML formatter, which will simplify things, but it's not required).
Open your file.pptx in 7-Zip (no need to rename to .zip, just right-click and "Open Archive")
Navigate to ppt/slideLayouts.
See a list of slideLayout....xml files.
Identify the ones you want to edit, e.g., by opening each one and looking for <p:cSld name. (The numbers may be indicative only of the order the layouts have been created, not of the order in which they are now shown in PowerPoint - although saving a .pptx files in PowerPoint 2016 does modify the slide layouts for me so that the display order matches the file name numbers.)
Look for <p:ph until you find the ones you want to edit. You probably want to ignore the ones with type="title", type="ftr", type="sldNum".
Change the idx of all other placeholders to 1, 2, ... in the order in which you want them filled (use the <p:cNvPr ... name= to identify the placeholders).
Save the .xml files, close your editor, and be asked by 7-Zip to update the archive. Answer "Yes".
So I set the idx to 1 for the one placeholder in my 1-content layout, to 1 for the left placeholder in my 2-content layout, and to 2 for the right placeholder in my 2-content layout.
My app supports being scripted with Applescript.
I am trying to make styled text content, stored in NSAttributedString objects, available to an Applescript user.
I thought I could simply deliver styled text with the NSAttributedString class, just like I deliver plain text with the NSString class, but that does not work - Cocoa Scripting then reports that it cannot convert or coerce the data.
I wonder if I'm missing something or if this is just plain impossible with the standard classes supported by Cocoa Scripting?
AppleScript does know the "styled text" type, as seen in this example:
set stxt to "foo" as styled text
So, if AppleScript knows this type by default, shouldn't the Cocoa Scripting engine support it as well somehow?
As always there are many choices for solving an AS problem.
In my scriptable text editor (Ted), I implemented the Text Suite, which is based on rich text (NSTextStorage, a subclass of NSMutableAttributedString). I wanted to be able to script tabs in my paragraphs, so I added a style record, which contains all the paragraph style information. This lets me write scripts like this:
tell application "Ted"
set doc1 to make new document at beginning with properties {name:"Document One"}
tell doc1
set p1 to make new paragraph at end with data "Paragraph One" with properties {size:24, color:maraschino}
set p2 to make new paragraph at end with data "Paragraph Two" with properties {style:style of paragraph 1}
set color of paragraph 1 to blue
end tell
set doc2 to make new document at beginning with properties {name:"Document Two"}
copy p1 to beginning of doc2
properties of paragraph 1 of doc2
end tell
Since p1 is rich text, the second document ends up with both the text and formatting of the first paragraph of the first document.
You can also ask for the properties of a piece of text, where I have implemented the usual Text Suite properties, as well as a "style" property for paragraph style (backed by NSParagraphStyle, since I wanted to be able to script the tab stops):
properties of paragraph 1 of doc2
Result:
{height:60.0, italic:false, size:24, style:{paragraph spacing after:0.0, head indent:0.0, line break mode:0, alignment:4, line spacing:0.0, minimum line height:0.0, first line head indent:0.0, paragraph spacing before:0.0, tabs:{"28L", "56L", "84L", "112L", "140L", "168L", "196L", "224L", "252L", "280L", "308L", "336L"}, tail indent:0.0, maximum line height:0.0, line height multiple:0.0, default tab interval:0.0}, color:blue, width:164.109375, font:"Helvetica", bold:false, class:attribute run}
This works well for passing rich text within my application, but may not be as useful for passing styled text to other applications, which may be what you wanted to do. I think adding a "style" property (of type record) is probably the best way to convey style info for use in other scriptable apps. Then in the second app, the scripter can make use of any properties in the style record that the second app understands.
It looks like there is no implicit support for styled text in AppleScript. And there is also no common interchange record type for passing styled text.
AppleScript was developed in the pre-OSX days when styled text was often represented by a combination of a plain text (in System or MacRoman encoding) and a styl resource. With Unicode came an alternative format of a ustl style format. These are still used with the Carbon Pasteboard API (PasteboardCreate etc.) today. Yet, none of these seem to have made it into the use with AppleScript.
The fact that AppleScript knows of a styled text type has no special meaning. Even its class is just text.
Update
I just found that Matt Neuburg's book "AppleScript The Definitive Guide" mentions styled text and gives an example where it's indeed showing a record containing both the plain text (class ktxt) and style data (class ksty) with data of type styl, just as I had expected above. He also points out that most applications don't use that format, though.
So, it appears using a record with style resource data is indeed the intended way, only that hardly anyone knows about it. Go figure.
What i am wondering is, is there a way to load up a keynote slide, have the slide run an applescript(which reads a text file) and takes that information and uses it to populate text fields on that keynote slide?
Example: Open Keynote presentation. Play the presentation. When we get to slide #4, launch the applescript to get the info that you need from the text file, then populate the text field.
It's an old question but the answer is yes. You can use Applescript to run through the presentation and pause on whatever slide you like. The boxes for inserting text are called "text items" and you can set their contents through the object text property. I found this site very helpful (link goes to the text item page)
This is maybe a weird request but hear me out:
I have a huge database at my shop containing product codes, like 87 445 G 6 which I need to check for availability on a supplier's website. The problem is, the supplier's website consists of a web form in which I have to enter the code without spaces, so imagine that I have to manually delete spaces every time I paste a code or write it manually without.
I can't edit the database from which I copy the codes.
I wonder if some sort of plugin, script, or trick can be used directly in browser on the supplier's web form, or some software to modify how the windows clipboard works, maybe some option to copy text without spaces. Using Windows XP.
The OP has probably moved on, but for anyone else looking here, my approach was to tackle this from the windows clipboard side.
For background: I keep a list of my credit card info in Keepass. Sometimes (poorly coded) shopping cart checkout forms don't like spaces in between card numbers. I like storing them with spaces since it's easier to read off that way.
There's various Windows clipboard utilites out there, but it took me a while to find one that could do some processing on the clipboard contents and pasting it out - Clipboard Help and Spell
The program has a way to "save" a bunch of text transformations, and even assign the action to a hotkey.
For reference, my "Find and Replace" action is to find "\s" (without quotes) and leave the Replace textbox empty. "\s" will match whitespace character.
Use the javascript console
You could use the javascript console for your browser to edit the textarea after you paste.
Using Google Chrome (or Firefox)
Paste your text in the text area.
Right click the text area and click Inspect Element
Look at the id for the element
Now switch to the console view
then run these lines (making sure to replace with 'the-id' with your id)
var my_text_area = document.getElementById('the-id'); // Put your id in here
my_text_area.value = my_text_area.value.replace(/ /g,"") // Deletes just spaces
It's even simpler if you have access to jQuery:
$('#the-id').val($('#the-id').val().replace(/ /g, ""))
The replace function is simply using regular expressions to convert spaces to nothing. If you want to replace all whitespace (including newlines) you would use .replace(/\s/g,"").
For firefox, the names are the same but the UI is a little bit different.
Use greasemonkey
You can either write a greasemonkey plugin or try to find one that fits your needs.
I am no AppleScript Jedi, I've only done a few simple things, but I haven't been able to figure this one out and could use some help:
My wife uses slides for her Art History courses and would like to use the same slides for exams (sans identifying names). Rather than create a new presentation, I'd like a tool that iterates through the slides and hides the text fields.
Looking through the Keynote dictionary didn't give me any clues as to how to approach this, any ideas?
AFAIK, with Applescript you can only access the title and the body boxes of the slides. If the text you wish to remove is consistently in either of these boxes the simplest solution would be to loop through the slides replacing that text and then saving a copy of the document.
tell application "Keynote"
open "/Path/To/Document"
repeat with currentSlide in slides of first slideshow
set title of currentSlide to " "
set body of currentSlide to " "
end repeat
save first slideshow in "/Path/To/Document without answers"
end tell
If the text is in a container created with the textbox tool, I don't think you can solve it with Applescript, but Keynote uses an XML based file format, so you could try doing it by editing the XML with your scripting language of choice. The XML schema is documented in the iWork Programming Guide.