4

我编写了一个用于处理教堂敬拜歌曲的数据库网络应用程序,并且我正在尝试添加一个模块来输出选定的歌曲以投射歌词。我最初以为我所有的用户都在使用 Powerpoint,它可以导入一个简单的文本文件,每行前面都有 0-5 个标签(0-tab 行成为新幻灯片的标题,一个或多个标签意味着“要点”级别对应于多少个选项卡)。所以我的模块当前输出这样一个文本文件,演示者将打开一个 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)。除了 Keynote 创建或编辑 Keynote 演示文稿,Apple 显然不想要任何东西。

因此,我正在寻找有关如何解决此问题的建议。我想要一个不涉及我为他们创建 Powerpoint 文件以转换为 Keynote 的过程。我不仅不应该每周都在循环中,而且在转换中存在一些行距问题。

我知道如何使用 LaTeX 从数据中生成 PDF(我目前只为打印的和弦表这样做,但我确信我可以弄清楚如何进行幻灯片式布局),但 Keynote 显然只导入 PDF 的一页一次——一个典型的周日崇拜集大约有 30-50 张幻灯片,所以这会很烦人。另外,我希望敬拜领袖/牧师能够在必要时调整 Keynote 中的内容 - 如果它来自 PDF,那将是不可能的。所以我的第一选择是以某种方式将 Keynote“模板”与某种文本(XML、JSON、选项卡式文本或其他)结合起来。

这段对话似乎暗示 Applescript 可能是可能的(这听起来像是 iWorks 相当于 Office 的 VBA),但由于我没有 Mac,所以需要长时间借用别人的计算机来学习语言和开发/test 脚本(除非它足够简单以至于你们中的一个人愿意为我准备一些东西)。想法?


编辑:在 CJK 的回答和评论之后,我意识到最终结果的示例可能有助于可视化我正在尝试做的事情。这是来自 Powerpoint 的两张幻灯片,选择日文幻灯片示例,因为如果我能做到这一点,英文幻灯片很容易。一周前我尝试将这个 Powerpoint 导入 Keynote 时,最顽固的样式是日文(一级“子弹”)和罗马化(二级)的行距。

(如果您想知道,是的,那是底部的标题框 - 我知道这是非常规的,但由于天花板较低,我们幻灯片的上半部分是优质房地产。)

在此处输入图像描述

在下一个示例(非季节性版本)中,我添加了 Powerpoint 的文本文件导入不支持的内容,因为 CJK 的方法启发了我了解如何使用脚本中的富文本来完成: 标题框中的两种不同文本格式. (以前我打算把版权信息放在每首歌的最后一张幻灯片上,在歌词下方使用“子弹”风格的 3 级或 4 级。但我更喜欢标题。) 在此处输入图像描述

编辑 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
4

1 回答 1

3

今天玩了一点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

制作了这张幻灯片:

使用 AppleScript 制作的 Keynote 幻灯片

请记住,实际幻灯片上的缩进级别不是由文本文件中的选项卡决定的,而是由tabulations脚本顶部定义的属性值决定的。因此,在解析的文本文件中存在选项卡的唯一影响将是确定在幻灯片上呈现文本时应用于文本的一组特征(字体、颜色、大小和缩进,与文本文件无关缩进)。

最后一点,我应该指出,文本文件中的行可以以 0-5 个制表符开头。6 个或更多选项卡被视为只有 5 个选项卡。但是,重要的是,该行的其余部分不应包含文本中的任何选项卡。就脚本而言,这会产生一些奇怪的结果。可以调整脚本以适应需要在文本中包含制表符的行,但我目前没有看到需要。

于 2017-12-29T09:21:45.273 回答