我编写了一个用于处理教堂敬拜歌曲的数据库网络应用程序,并且我正在尝试添加一个模块来输出选定的歌曲以投射歌词。我最初以为我所有的用户都在使用 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