掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1318|回复: 7

[经验交流] 如何在卡片编辑界面提取[sound:xxxxxx.mp3]这个元素

[复制链接]
  • TA的每日心情

    5 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑 8 k3 i7 d% c+ k6 D

    - c) b, v# ]( B) g$ ~- R想用
    5 k) n) ~$ N% M' O  @$ O8 k<audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放. |" y: H& _* r# h$ Y  s' h5 _
    % o- g; C1 M2 m" H. Y6 R
    于是想提取 xxxxx 的内容1 `1 a1 i7 `+ Q  |7 _7 P

    ( ]6 ]% w6 y3 A* q+ bvar price = document.getElementById("audio").innerTEXT;  B" S1 j4 \  Q, g
    alert (price)
    : C# l5 W$ v/ D; a9 g( W1 U) E5 B) ^/ f) d; f
    但是并不可行,想破脑袋,不知道有什么解决方法& p) X3 N& @2 V& E

    + D% V9 m( D+ h! N0 F已经定义了 音频的 id=audio
    ' |# e" ~8 C  {1 a, |0 U6 Zprice反馈的结果是空白- i3 a5 O* ]  v- g- W: X
    ! ~& Y5 U$ ^3 _  v/ ]
    用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情

    5 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:465 i4 w& G$ [( i0 b
    我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...

    , M) d% i1 `& `$ C" J% W6 S/ |& i
    $ U1 w6 E, K6 l! Z) b. z8 z十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。
    8 L& ~4 e6 R6 ~' h( p2 Y! |+ h7 S! ^, c" r# e: g% p
    再次感谢!# [2 l* q1 R% J8 K! c" @2 f4 g
    " [! X" ]# I3 r9 j$ v
    ———————————————
    0 d4 A! w- B+ H/ q& R
    4 J  H- A0 o6 Y( x2 T, V 基本流程:
    5 B: s( M* G$ _; w( h  R) s
    • 卡负责其模板渲染: render_output
      ! ]3 W- R; r9 w" r2 ~

        ) ^- c. ^+ C( H/ ]" }
      • render_into
        3 ?6 E- ^; z3 x' y3 g% o$ v" F; l3 |  c5 _3 a6 n9 {
    • 从模板解析{{tts en_US voices=Bob,Jane:Field}}并转换为[anki:tts][en_US voices=Bob,Jane]text[/anki:tts] : tts_filter
    • 从[anki:tts]转换为[anki:play:q:0] : extract_av_tags/ ^; c9 f! x4 p% m( J

        # t9 G/ L1 j, L2 l- w
      • [sound:]标签也已完成此操作
        1 j4 }9 e/ P- Z# Y1 L
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。+ \3 O4 F5 y! W

        ; h$ o2 z& L+ C# A9 l  N
    • AVTag的列表存储在卡中: render_card_from_contextrender_cardquestion_av_tags
      : R+ K& w, H, Q5 B, C; C

        , G  }/ m, w4 _0 O
      • 列出了两个列表,一个用于问题,一个用于答案。
        5 K" b# P: B/ y7 w  |+ @& k2 q% P3 [6 f; U; v- t
    • 在卡片上渲染: prepare_card_text_for_display
      . H/ x% A8 j- c

        + F8 {- Y. x- f; d0 r/ D
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons
        6 o) f+ g$ s9 f8 K3 x: s7 `1 Y8 ~( a* b, J
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag+ Q, J1 ]/ Z; S2 h) i  g
      * .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices
      ; F. L! {- h& N
  • TA的每日心情

    5 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45! Z' N- J- ~* V3 s- N5 o1 {+ l5 t% Q" c
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText
    . q- r/ k2 P5 \另外,直接写上不可以么,如果这个占位 ...
    . ^# q% j, n& u/ g0 p' C
    占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行) q1 R. k7 A% [6 Q4 C

    / x$ G7 k" i% X5 J4 m7 [% U卡片HTML部分:
    $ S5 z$ C& x# x<span id="audio1" class="voice">{{音频}}</span>
    5 h& X- a' O0 C# X6 A<audio id="audio2" loop autoplay></audio>& w/ N' s; F& ]! C" f8 e
    3 m+ S! K+ Y/ R5 V' d  p! l
    JS部分:8 I; a& t9 E. u+ X
        var str = document.getElementById("audio1").innerHTML;
    0 g5 U, ?+ `! Y+ ]    var txt = str.replace("[sound:","").replace("]","");  s+ o& H3 H4 M" z4 ^
            txt = "<source src=" + txt + ">"
    * T$ }% c8 Q. m; y2 k$ f  m  @    document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情

    5 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45; T2 ~! [, X2 a6 r+ t
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText' |$ c8 u9 a7 C0 Z+ v4 i6 \
    另外,直接写上不可以么,如果这个占位 ...

    3 n: A5 r' ~- L, ~9 s7 k% z尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。' @" ^4 V2 S& h( F" B

    + R- y% Q8 F* H' j4 G3 d头秃啊
  • TA的每日心情

    5 天前
  • 签到天数: 548 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑 9 v1 W1 L* ^2 M4 V
    arruno 发表于 2022-3-29 12:02, m, b& y1 a7 w/ l
    没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以

    $ ]2 [+ @6 [; x. y) _1 E3 b: Q$ g( S) l6 _
    您可能没有理解我意思。+ U; _$ f' z6 X, a. D: W+ {/ X- E
    举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。0 w3 K& Z/ Q5 k# b6 @' u% z
    卡片正面是这样的:
    $ }+ ]( N5 v% P9 m' d1 z; _<div class="section">! G+ V. K2 r" F3 G: W6 @% k
    <div class="expression">{{单词}}</div>
    / |0 v& D+ ]" d& ~9 t* K0 F% H* ^' \# t<span id=“audio” class="voice">{{音频}}</span
    $ C( b' S. m) r1 g# L- h2 e) ?</div>
    & g, m3 I+ f0 ?: r( g( f3 k- o* B5 Q+ q
    也就是我想知道  {{音频}}  的名字是什么,以便下一部操作. R; B) S+ \/ T+ r, _" V
    - A3 |' J6 m9 g0 m) Y4 h
    于是我尝试:: I' T5 `0 c2 v+ R9 D9 R
    var price = document.getElementById("audio").innerTEXT;9 B, ]& D0 y% j- k9 j" ?- G
    alert (price)  o/ d, G, {5 [3 h8 b+ G; V
    price返回是undefined! s8 X2 p2 T1 M8 u

    5 H, t2 }0 O0 z; M0 c( ~& t1 M您的方法我也试了,也是一样2 V& ~+ w4 [, d1 g/ f
    # C, ?3 i: Z3 ^
    很抱歉麻烦您了,您看看有什么好的建议吗
    : f9 x+ \) E7 X' O
  • TA的每日心情
    奋斗
    2023-7-19 19:29
  • 签到天数: 458 天

    [LV.9]以坛为家II

    发表于 2022-3-29 12:02:08 | 显示全部楼层
    <audio loop autoplay controls src="xxxxx.mp3"> 没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以
  • TA的每日心情
    奋斗
    2023-7-19 19:29
  • 签到天数: 458 天

    [LV.9]以坛为家II

    发表于 2022-3-30 22:45:04 | 显示全部楼层
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText. U7 O9 u) l4 ^& B/ d; W8 e( ?
    另外,直接写上<audio loop autoplay controls src="{{音频}}">不可以么,如果这个占位符就是文件名本身的话,不需要再用js绕一下。
  • TA的每日心情
    奋斗
    2023-7-19 19:29
  • 签到天数: 458 天

    [LV.9]以坛为家II

    发表于 2022-4-1 10:46:14 | 显示全部楼层
    本帖最后由 arruno 于 2022-4-1 10:59 编辑
    ' q3 |9 F, O9 m3 M" f  ^% ~
    2 m' C: ]. r$ l* `9 x6 @, L( o: A* Y我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。0 s7 A5 N- t9 p: H) k% Y# Q3 ]0 p
    比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。4 q+ L( s" }# i9 c9 \4 b3 k
    如果不能解决,至少这样可以部分实现你的需求。7 Q2 R1 b# A& e2 C5 c
    5 k# r" _4 z+ U- f" f* k
    ———————————————' C) h3 a2 Q1 R7 y  Z  p1 B
    看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:% U- q. y' L* ~( `% b$ o- w
    <a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">4 [" J3 f: ?, P; Q" c
    <svg class="playImage" viewBox="0 0 64 64" version="1.1">  X( K7 S9 \* h4 e+ c
    <circle cx="32" cy="32" r="29"></circle>5 u. k, m9 Y; f1 G: ]: @
    <path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>
    & A/ a9 f) k2 x</svg>, `; D2 U$ x" G  A- b/ _
    </a>
    7 x4 P( }" z+ V. e( w建议还是用上面的方法吧,可以加一个hidden属性做好看一点:
    7 n  x2 A, L5 _# w3 R
    " `7 K# I4 Y: x- o' k<div hidden="true">0 S4 q3 m! r" Y. s2 C- K/ A5 M. n! h
    {{音频}}" T) H' y& e8 a: N. R. |
    {{音频}}( I$ ]0 y2 v: y% e4 c
    {{音频}}4 U* n3 E. n9 x& P
    </div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-4-28 06:18 , Processed in 0.050408 second(s), 9 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

    快速回复 返回顶部 返回列表