我刚开始在一个网站上工作,这将有助于人们了解说唱歌手正在谈论什么。用户将看到一首说唱歌曲的歌词,他们将能够点击某些歌词来查看解释。这是截图(您还可以查看网站本身here):
alt text http://img146.imageshack.us/img146/6882/clocal.png
(原始歌词审查; click here查看)
无论如何,我的问题是如何在我的应用程序中建模这些注释。现在,我将歌词和注释存储为这种格式的一大块HTML:
<div class="lyrics">
With the goons I spy
<a href="#note1">Stay in tune with ma</a>
<a href="#note2">She like damn
This the realest since 'Kumbaya'</a>
Kumbayay Killa Cam my lord
</div>
<div class="annotations">
<div id="note1">
"Ma" refers to ladies, generally, and specifically also the woman singing the hook; "Stay in tune" is a musical metaphor: he literally stays in tune with the singer and also in the sense that he has game.
</div>
<div id="note2">
Kumbaya is a campfire singalong.
</div>
</div>
然后使用此方法处理它以进行输出:
class Song < ActiveRecord::Base
include ActionView::Helpers
def annotated_lyrics
lyrics = read_attribute('annotated_lyrics')
return if lyrics.blank?
require 'hpricot'
doc = Hpricot lyrics
doc.at('.lyrics').inner_html = doc.at('.lyrics').inner_html.strip
doc.search("a[@href^='#note']").set('class', 'tooltip').each do |t|
t.inner_html = t.inner_html.strip
end
doc.search("div[@id^='note']").set('class', 'annotation').each do |a|
a.inner_html = auto_link(a.inner_html.strip, :all, :target => '_blank')
end
simple_format doc.html.strip
end
end
其余的我使用jQuery和精彩的qTip插件。
这适用于显示,但由于我的应用程序不知道注释和歌词之间的关系,因此很难添加一个界面来内联(或者根本就是真的)更新单个注释。
另一方面,我真的不知道在ActiveRecord中表示这个的最佳方法。我想一首歌可以“has_many”注释,但我如何表示哪些歌词被注释?我可以存储开始和结束单词索引,但这似乎很痛苦,并且对歌词中的微小变化很敏感。
答案 0 :(得分:8)
如何呈现这样的歌词(感谢People's Champ)?
Well it's that [grain grippa][1] from Houston, Tex That bar sippa, that bar no plex I'm straight up outta that [Swishahouse][2] Where G. Dash write all the checks So [check the neck, check the wrist][3] I'm balla status from head to toe [1]Referring to the wood grain steering wheel common to luxury cars [2]Swisha House is the record label Paul Wall records for [3]"Look at my watch and necklace because they are expensive"
只是一个想法,我受到了用于在此网站上添加评论的标记的启发。
因此,对于数据库,请创建Lyric,LyricLine和Annotation表。注释具有LyricLineIds,StartChar和EndChar值以及含义或描述字段。 LyricLines是每行的文本,与LyricIds的Lyric实体相关。歌词存储歌曲信息,语言信息等等。
这种格式应该很容易从数据库中生成,并且具有比XML更“人类可读”且可就地编辑的好处,因此您可以在开发整个UI之前更轻松地测试它
我对这个问题很感兴趣,并期待看到网站的进展。有趣的工作!
答案 1 :(得分:3)
Stand-off注释允许您随着时间的推移添加更多功能,例如让许多用户注释相同的歌词。通过对齐注释生成您存储为blob的HTML很容易。
您可能对语言学家众所周知的注释工具的(xml)数据模型感兴趣:例如MMAX2和Callisto。这些可以轻松转换为数据库模型。
答案 2 :(得分:1)
XML也是一个很棒的模型。
<song>
<title>...</title>
<lyrics>
<verse>
<line>Well it's that <dd>grain grippa</dd><dt>Referring to the wood grain steering wheel common to luxury cars</dt> from Houston, Tex</line>
<line>That bar sippa, that bar no plex</line>
<line>I'm straight up outta that <dd>Swishahouse</dd><dt>Swisha House is the record label Paul Wall records for</dt></line>
<line>Where G. Dash write all the checks</line>
<line>So <dd>check the neck, check the wrist</dd><dt>"Look at my watch and necklace because they are expensive"</dt></line>
<line>I'm balla status from head to toe</line>
</verse>
<chorus>
<line>...</line>
</chorus>
<verse>...</verse>
<repeat-chorus/>
</lyrics>
</song>
非常容易编辑和更新。为它创建UI可能并不困难。如果您向公众开放创建记录,则可以将<dd>
和<dt>
更改为<phrase>
和<definition>
。但是dd和dt是HTML标准,这就是我首先使用它们的原因。这将使您能够使用直接的CSS来设置它的样式,只需一点点来自JavaScript,使它看起来很棒。 (顺便说一句,该网站很棒。)
答案 3 :(得分:0)
你设置与一首有很多注释的歌曲联想的第一直觉肯定会奏效。存储开始和停止注释索引的两种可能方法:
或
答案 4 :(得分:0)
至于链接注释和歌词,你可以有几种方法:
将上述建议的注释链接到歌词中的确切位置(例如,行号,单词, 字符)。
制作字典短语/单词&lt; - &gt;注解。就在显示搜索之前 字典并插入页面注释。 如果速度或特异性与每个条目有关 字典可以由相关歌曲标记。如果你想要你的注释是健壮的 歌词中的小变化,而不是在注释短语使用的歌词中找到匹配 Longest common subsequence metric。
结合#1和#2