我正在尝试查看是否可以在主要DuckDuckGo网站的上下文之外使用DuckDuckHack Instant Answers中的代码。毕竟,Instant Answer大多是一个独立的组件,由一些HTML,CSS和Javascript组成,应该相对独立且可重用。

由于DuckDuckHack项目处于维护模式,因此获取信息似乎有点困难:Developer Guide上提到的Slack和Forum已被禁用。我试图找出其他人是否试图使“即时答案”在其他情况下起作用,但我什么也找不到。有一些有关编写即时答案的教程,例如使用Perl和DuckPAN工具编写的this。我尝试使用这些工具来获取现有的即时答案,但无法正常工作(不确定是否仍在维护它们)。

由于这些工具似乎有点重量级,我认为有可能完全绕过它们并尝试直接使用Instant Answer中的HTML,CSS和JS。

我已经给Calculator提供了第一枪。我在duckduckgo/zeroclickinfo-goodies存储库的目录share/goodie/calculator中标识了相关的源代码。 HTML似乎在content.handlebars中,然后是calculator.csscalculator.js。我创建了一个plain HTML file,将content.handlebars中的HTML放入其中,并包括对CSS文件和JS文件的引用。起初,CSS不起作用,因为CSS规则在不添加更多包装div的情况下不适用,在使用可见的即时答案查看DuckDuckGo网站时可以轻松找到更多包装div。添加这些包装div后,计算器UI appears more or less intact。但是,UI的按钮根本无法使用。

查看Javascript控制台,我收到此错误:

Uncaught ReferenceError: DDH is not defined
    at calculator.js:1


显然,calculator.js需要一个对象DDH,但是我不知道该对象应该是什么以及如何创建它。

有人知道这个DDH变量通常是如何初始化的,或更笼统地说如何使它起作用吗?任何对在自己的站点上重用DuckDuckHack的代码的项目的引用也将受到高度赞赏。

最佳答案

我认为关于DDH对象如何组合的细节可能不会通过DDG的开源部分公开。

我还做了一些尝试来重新利用一些内置的DDG IA功能(例如,通过编程方式访问通过API无法获得的许多有用的即时答案)。

在此过程中,我克隆了goodie repo并戳了戳。模式似乎是,对于大多数商品,要显示的有效载荷为DDH.<goodie>.content。在我的goodie存储库本地副本中:

$ grep -rE 'DDH' ./lib/

./lib/DDG/Goodie/Conversions.pm:                    content => 'DDH.conversions.content'
./lib/DDG/Goodie/Conversions.pm:                content => 'DDH.conversions.content'
./lib/DDG/Goodie/Game2048.pm:                content => 'DDH.game2048.content'
./lib/DDG/Goodie/PublicDNS.pm:                list_content => 'DDH.public_dns.content',
./lib/DDG/Goodie/JsBeautifier.pm:                    content => 'DDH.js_beautifier.content'
./lib/DDG/Goodie/SassToCss.pm:                    content => 'DDH.sass_to_css.content'
./lib/DDG/Goodie/Constants.pm:                title_content => 'DDH.constants.title_content'
...



在javascript方面,您可以在.js目录中找到相应的share/goodie文件,就像处理计算器好东西一样。

<goodie>.js文件似乎引入了DDH.<goodie>命名空间(通常在文件顶部)并定义了DDH.<goodie>.build函数。 goodie-display docs中引用了此过程(请参阅其中的标题为“设置Goodie显示选项”的部分)。

但是,在文档中没有任何地方记录了contentDDH.<goodie>属性是如何组合在一起的。我克隆了docs repo并对DDH进行了grep处理,结果没有发现任何结果。

但是,goodie repo.js文件夹中的share/goodie文件似乎都没有提供有关如何组装DDH.<goodie>.content的线索。实际上,某些.js文件甚至不包含字符串content。对于包含字符串share*.js的所有content文件的列表,我做了(在goodie存储库的本地副本中):

$ find ./share -name "*.js" |xargs grep -l 'content'

./share/goodie/countdown/countdown.js
./share/goodie/text_converter/text_converter.js



其他.js文件根本不包含该字符串。

编辑

但是另一方面,我看到您确实设法使calculator.js file进行了一些修改(例如,通过插入缺少的DDH命名空间)。

关于javascript - 使DuckDuckHack Instant Answer在自己的网站上工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56865420/

10-13 01:40