如何使用Aeson生成文字未加引号的javascript表达式?

如何解决如何使用Aeson生成文字未加引号的javascript表达式?

我正在使用this function,需要将其传递给Aeson Value

{ logLevel : vega.Debug }

这应该是指绑定不会导出的javascript程序包中的enum

为此,我应该使用Data.Aeson.QQ.Simple,但是我尝试编译的所有内容都会在"vega.Debug"周围加上引号,而我却没有。

[aesonQQ| { logLevel : "vega.Debug" } |]

我想念什么?有没有办法使用encode

解决方法

通常,Aeson Value仅表示JSON对象,因此它们不支持嵌入式JavaScript表达式或任何其他扩展。

如果此API仅接受 Value个,则您将陷入困境。我认为 best 的解决方案是仅复制vega.Debug的整数值并将其序列化。

否则,一个简单的解决方案是制作toHtmlWith的修改版本,以接受更灵活的输入类型,例如字符串:

toHtmlWith' :: Maybe Text -> VegaLite -> Text
toHtmlWith' mopts vl =
  let spec = encodeToLazyText (fromVL vl)
      -- NB: Removed ‘encodeToLazyText’ call here.
      opts = maybe "" (\o -> "," <> o) mopts

  in TL.unlines
    [ "<!DOCTYPE html>","<html>","<head>"
      -- versions are fixed at vega 5,vega-lite 4,"  <script src=\"https://cdn.jsdelivr.net/npm/vega@5\"></script>","  <script src=\"https://cdn.jsdelivr.net/npm/vega-lite@4\"></script>","  <script src=\"https://cdn.jsdelivr.net/npm/vega-embed\"></script>","</head>","<body>","<div id=\"vis\"></div>","<script type=\"text/javascript\">","  var spec = " <> spec <> ";","  vegaEmbed(\'#vis\',spec" <> opts <> ").then(function(result) {","  // Access the Vega view instance (https://vega.github.io/vega/docs/api/view/) as result.view","  }).catch(console.error);","</script>","</body>","</html>"
    ]

然后,您可以根据自己的Aeson值调用encodeToLazyText,或根据需要包含任意Text字符串。

如果您确实要避免重复页面内容,那么您也可以调用现有的toHtmlWithValue,其中包含您控制的特殊分隔符,例如String "<user1441998>vega.Debug</user1441998>",然后使用该定界符对结果进行后处理:

unquoteHackSplices = replace "\"<user1441998>" ""
  . replace "</user1441998>\"" ""

有没有办法使用编码?

作为另一种技巧,您可以为您的类型创建一个ToJSON实例,该实例实现toEncoding不是 toJSON,并且编码值是JavaScript表达式(即无效的JSON)。您可能希望使toJSON出现错误,以免您无意中使用它。


如果您想生成一般的JavaScript代码,请看language-javascript。代替产生Value,而是产生JSExpression,然后使用像renderToText这样的漂亮打印功能之一来渲染它。这是一个可能的解决方案的结构草图:

-- Like ‘ToJSON’ but may produce arbitrary JavaScript expressions
class ToJavaScript a where
  toJavaScript :: a -> JSExpression

-- Helper function to convert from Aeson Value
jsFromJson :: Value -> JSExpression
jsFromJson v = case v of
  Object o -> JSObjectLiteral …
  Array a -> JSArrayLiteral …
  String s -> JSStringLiteral …
  …

instance ToJavaScript YourType where
  toJavaScript = …

rendered :: Text
rendered = renderToText
  $ JSAstExpression (toJavaScript yourValue) JSNoAnnot

您的表达式将采用以下格式:

JSMemberDot
  (JSIdentifier JSNoAnnot "vega")
  JSNoAnnot
  (JSIdentifier JSNoAnnot "Debug")

JSAnnot类型还允许您在生成的结果中包括注释。请记住,与Aeson的JSON序列化相比,language-javascript的精美印刷可能没有得到很好的优化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?