Программно генерировать слайды 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

который создал этот слайд:

Слайд Keynote, созданный с использованием AppleScript

Имейте в виду, что уровень отступа на фактическом слайде определяется не вкладками в текстовом файле, а значениями свойства tabulations определяется в верхней части сценария. Следовательно, единственным эффектом присутствия вкладки в разобранном текстовом файле будет определение набора характеристик, применяемых к тексту при его отображении на слайде (шрифт, цвет, размер и отступ, независимо от его текстового файла). отступ).

В заключение я должен отметить, что строки в текстовом файле могут начинаться с 0-5 вкладок. 6 или более вкладок обрабатываются так, как если бы было только 5 вкладок. Однако, что важно, остальная часть строки не должна содержать никаких вкладок в тексте. Поскольку сценарий стоит, это даст некоторые странные результаты. Можно настроить скрипт так, чтобы он соответствовал строкам, которые должны содержать вкладки в тексте, но в настоящее время я не видел в этом необходимости.

Другие вопросы по тегам