Программно генерировать слайды Keynote из текстовых данных
Я написал веб-приложение для баз данных, предназначенное для обработки песен для церковного культа, и пытаюсь добавить модуль для вывода выбранных песен для проецирования текстов песен. Сначала я думал, что все мои пользователи используют Powerpoint, который может импортировать простой текстовый файл, каждая строка которого начинается с 0-5 вкладок (строка с 0 вкладками становится названием нового слайда, а одна или несколько вкладок означают "точку маркера"). с уровнем, соответствующим количеству вкладок). Таким образом, мой модуль в настоящее время выводит такой текстовый файл, и докладчик открывает шаблон Powerpoint, стилизованный так, как он хочет для презентации песни, вставляет текстовый файл как "контур" для новых слайдов и вуаля. Вот небольшой пример структуры текстового файла, который работает в Powerpoint (с одним слайдом на японском языке с латинизацией более мелким шрифтом с использованием следующего уровня структуры):
As the Deer
As the deer panteth for the water
So my soul longeth after Thee
You alone are my heart's desire
And I long to worship Thee
As the Deer
You alone are my strength, my shield
To You alone may my spirit yield
You alone are my heart's desire
And I long to worship Thee
鹿のように (As the Deer)
谷川の流れを したう鹿のように
tanigawa no nagare o shitau shika no yoo ni
主よ、わが魂 あなたをしたう
shu yo, waga tamashii anata o shitau
鹿のように (As the Deer)
あなたこそ わが盾、 あなたこそ わが力
anata koso waga tate, anata koso waga chikara
あなたこそ わが望み われは主をあおぐ
anata koso waga nozomi, ware wa shu o aogu
Но пастор моей церкви (чей компьютер используется для проецирования) и два других лидера поклонения, кроме меня, которые выбирают песни, все используют Mac. Они всегда говорили о слайдах для Powerpoint, поэтому я предположил, что это то, что они использовали. Но как только я закончил код для вывода текста с вкладками, я обнаружил, что когда они говорят "Powerpoint", они действительно имеют в виду Keynote, который не имеет возможности использовать простые текстовые файлы. Старые версии Keynote хранят данные слайдов внутри XML в формате ( https://www.xml.com/pub/a/2004/01/07/keynote.html), но в новых версиях Keynote используются все более непрозрачные форматы ( http://justsolve.archiveteam.org/wiki/IWork). Apple явно не хочет ничего, кроме того, чтобы Keynote создавал или редактировал презентации Keynote.
Поэтому я ищу предложения о том, как подойти к этому. Мне бы хотелось, чтобы процесс не включал создание файла Powerpoint для их преобразования в Keynote. Я не только не должен быть в курсе каждую неделю, но есть некоторые проблемы с межстрочным интервалом в преобразовании.
Я знаю, как использовать LaTeX для создания PDF-файлов из данных (в настоящее время я делаю это только для печатных аккордов, но я уверен, что смогу понять, как делать макеты в стиле слайдов), но Keynote, по-видимому, импортирует только одну страницу PDF в то время - типичное воскресное богослужение было бы около 30-50 слайдов, так что это было бы довольно неприятно. Кроме того, я хотел бы, чтобы лидер / пастор поклонения мог настраивать что-то в Keynote, если это необходимо - если это происходит из PDF, это будет невозможно. Так что мой первый выбор - как-то жениться на "шаблоне" Keynote с каким-либо текстом (XML, JSON, текст с вкладками или что-то еще).
Этот разговор, казалось, намекнул, что это возможно с помощью Applescript (который звучит как iWorks, эквивалентный Office VBA), но, поскольку у меня нет Mac, это потребовало бы долгих часов заимствования чужого компьютера для изучения языка и разработки / проверить сценарий (если он не достаточно прост, чтобы один из вас захотел что-то сделать для меня). Идеи?
Изменить: После ответа и комментариев CJK, я понял, что пример конечного результата может помочь визуализировать то, что я пытаюсь сделать. Вот два слайда из Powerpoint, в которых выбираются примеры японских слайдов, потому что, если я смогу заставить это работать, английские слайды будут простыми. Когда я пытался импортировать эту Powerpoint в Keynote неделю назад, самым упрямым стилем были межстрочный интервал японцев ("пуля" первого уровня) и латинизация (уровень два).
(Если вам интересно, да, это поле для заголовка внизу - я знаю, что это нетрадиционно, но из-за низкого потолка, верхняя половина наших слайдов - первоклассная недвижимость.)
В следующем примере, в несезонной версии, я добавил что-то, что не поддерживает импорт текстовых файлов Powerpoint, потому что подход CJK вдохновил меня посмотреть, как это можно сделать с помощью расширенного текста в сценарии: два разных текстовых формата в поле заголовка, (Ранее я планировал просто разместить информацию об авторских правах на последнем слайде каждой песни под лирикой, используя 3 или 4 уровень стилей "bullet". Но мне больше нравится название.)
Редактировать 2: Попытка прыгнуть с трамплина из скрипта CJK, здесь делается попытка кода использовать существующий мастер-слайд, такой как "Заголовок и маркеры" и стили абзаца (полностью не проверено - только биты из примеров в Интернете). Я смогу проверить это через два дня, но я помещу это здесь, чтобы CJK мог видеть, что я сделал до сих пор:
-- *** I'd like to use relative path so it would be portable, but (path to home folder as text) gave errors ***
property SambiDBTextFile : "/Users/Rachel/Desktop/Songs.txt"
property masterSlideName : "Lyrics" -- custom master slide based on "Title & Bullets"
-- ** If I can use paragraph styles, I won't need these ***
property TextSizes : {32, 28, 20}
property TextColours : {"white", {63222,57568,41634}, {63222,57568,41634}}
property TextFonts : {"Hiragino Kaku Gothic Pro", "Arial Italic", "Hiragino Kaku Gothic Pro"}
-- ** This is what I really want to use, but I don't know if I can ***
property TextStyles : {"Main Lyrics", "Romaji Lyrics", "Song Credits"}
set AppleScript's text item delimiters to tab
set notes to paragraphs of (read SambiDBTextFile)
tell application "Keynote" to tell current document
-- *** Check for master slide existence, and substitute if absent ***
set masterSlideList to the name of every master slide
if masterSlideName is not in masterSlideList then
-- *** Create master slide? Nah, probably not possible ***
display alert ("Master Slide") message "Master slide '" & masterSlideName & "' not found; using 'Title & Bullets' instead."
set masterSlideName to "Title & Bullets"
end if
-- Create slides with content from Keynote text file
repeat with i from 1 to number of notes
if item i of notes is "" then exit repeat -- EOF
-- Get the text (without tabstops) and the level of indentation
set [TextContent, TabValue] to [last text item, number of rest of reverse of text items] of item i of notes
if TabValue is 0 then -- Indicates title of new slide
set current slide to make new slide with properties {base slide:master slide masterSlideName}
set object text of the default title item to TextContent
else -- TabValue is not 0, indicating lyrics
if TabValue > 3 then set TabValue to 3
-- *** I have no idea if this will work, but the point is to append
set object text of default body item to object text of default body item & TextContent & return
-- *** Style the line just added ***
-- *** Plan A: use paragraph styles (not sure if I can do this) ***
set paragraph style of paragraph ((count of paragraphs of default body item) - 1) of default body item to item TabValue of TextStyles
-- *** Plan B: hardcoded styling (uncomment if above line doesn't work) ***
--tell paragraph ((count of paragraphs of default body item) - 1) of default body item
--set its color to item TabValue of TextColours
--set its font to item TabValue of TextFonts
--set its size to item TabValue of TextSizes
--end tell
end if
end repeat
end tell
1 ответ
Немного поиграв сегодня с Keynote и AppleScript, я думаю, что следующий скрипт произведет что-то в соответствии с тем, что вы хотите. Он включает в себя возможность установки различных параметров текста на основе уровня табулирования (1-5) каждой строки в анализируемом текстовом файле.
property KeynoteTextFile : "/Users/CK/Desktop/Keynote.txt"
property PresentationTitle : "My Presentation"
property _W : 1024 -- The width of each slide
property _H : 768 -- The Height of each slide
-- Text properties for the cover title and each slide title
property CoverTextStyle : {font:"Arial Bold", color:"white", size:96}
property TitleTextStyle : {font:"Arial Bold", color:"white", size:48}
-- Spacing above and below the title of each slide
property TitleMargins : {top:30, bottom:100}
-- Spacing between lines in the body of each slide
property VerticalSpacing : 75
-- Text properties for the body of each slide for
-- each level of tabulation
property Tabulations : {0.1, 0.2, 0.3, 0.4, 0.5}
property TextSizes : {32, 28, 24, 20, 16}
property TextColours : {"white", "blue", "green", "magenta", "orange"}
property TextFonts : {"Arial", "Arial Italic", "Times New Roman Bold", ¬
"Times New Roman Bold Italic", "Times New Roman Italic"}
set AppleScript's text item delimiters to tab
set notes to paragraphs of (read KeynoteTextFile)
-- Create new presentation with cover slide
tell application "Keynote" to tell (make new document with properties ¬
{document theme:theme "Black", width:_W, height:_H})
set MyPresentation to it
set base slide of current slide to master slide "Blank"
tell the first slide to ¬
set CoverTitle to make new text item ¬
with properties {object text:PresentationTitle}
set properties of object text of the CoverTitle to CoverTextStyle
end tell
-- Create slides with content from Keynote text file
repeat with i from 1 to number of notes
if item i of notes is "" then exit repeat -- EOF
-- Get the text (without tabstops)
-- and the level of indentation
set [TextContent, TabValue] to ¬
[last text item, number of rest of reverse of text items] ¬
of item i of notes
if TabValue is 0 then -- Indicates title of new slide
tell application "Keynote"
tell (make new slide at end of slides of MyPresentation) to ¬
set Title to make new text item ¬
with properties {object text:TextContent}
set properties of object text of the Title to TitleTextStyle
copy position of Title to [_x, _y]
set position of Title to [_x, |top| of TitleMargins]
end tell
else -- TabValue is not 0, indicating slide content
if TabValue > 5 then set TabValue to 5
tell application "Keynote" to tell current slide of MyPresentation
set n to number of text items
set T to make new text item with properties ¬
{object text:TextContent}
tell object text of T
set its color to item TabValue of TextColours
set its font to item TabValue of TextFonts
set its size to item TabValue of TextSizes
end tell
set position of T to ¬
[(item TabValue of Tabulations) * _W, ¬
VerticalSpacing * n + (|bottom| of TitleMargins)]
end tell
end if
end repeat
-- Go to first slide of presentation and bring Keynote
-- into the foreground
tell application "Keynote"
set current slide of MyPresentation to first slide of MyPresentation
activate
end tell
Вот несколько строк из моего файла Keynote.txt:
This is a Title
This is indented by 1 tab
So is this
This is indented by 2 tabs
This is 3 tabs
Back to 1 tab
который создал этот слайд:
Имейте в виду, что уровень отступа на фактическом слайде определяется не вкладками в текстовом файле, а значениями свойства tabulations
определяется в верхней части сценария. Следовательно, единственным эффектом присутствия вкладки в разобранном текстовом файле будет определение набора характеристик, применяемых к тексту при его отображении на слайде (шрифт, цвет, размер и отступ, независимо от его текстового файла). отступ).
В заключение я должен отметить, что строки в текстовом файле могут начинаться с 0-5 вкладок. 6 или более вкладок обрабатываются так, как если бы было только 5 вкладок. Однако, что важно, остальная часть строки не должна содержать никаких вкладок в тексте. Поскольку сценарий стоит, это даст некоторые странные результаты. Можно настроить скрипт так, чтобы он соответствовал строкам, которые должны содержать вкладки в тексте, но в настоящее время я не видел в этом необходимости.