掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1347|回复: 7

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

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

    昨天 20:34
  • 签到天数: 553 天

    [LV.9]以坛为家II

    发表于 2022-3-28 15:07:02 | 显示全部楼层 |阅读模式
    本帖最后由 496147678 于 2022-3-28 15:09 编辑 - Q" [. Z; C7 v% h
    # p0 A# A. G" {: P0 g) P
    想用" l" A0 _0 X5 N0 {# P0 c
    <audio loop autoplay controls src="xxxxx.mp3">的方式完成音频无限制自动循环播放
    6 n! x+ F/ L6 P, I. ~" K5 t% a# v( U: c3 w
    于是想提取 xxxxx 的内容' [4 _: B1 S7 h. T7 C

    0 v7 |. P9 T. R5 Z9 d1 hvar price = document.getElementById("audio").innerTEXT;
    4 `8 W: P" b: o+ {) h5 S- ]0 Ialert (price)
    ! V' t6 M2 m' _. F# f& i& @& q/ t0 z1 \
    但是并不可行,想破脑袋,不知道有什么解决方法1 I. \$ \, T  H

    ; j) U: l( S6 ]1 w( f8 j; _) Y已经定义了 音频的 id=audio
    5 y9 W* q- v) A/ X1 J2 G% R" `: O/ W, rprice反馈的结果是空白: w. o, Y' J6 u& L
    , f. e# T; K) b; p
    用这个方法去弄expression,也就是{{正面}},是可行的
  • TA的每日心情

    昨天 20:34
  • 签到天数: 553 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-4-1 20:27:38 | 显示全部楼层
    arruno 发表于 2022-4-1 10:46
      J) v1 H  m8 k. ~0 ]7 B我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次 ...
    0 [6 A1 m, [' \( x

    3 }$ M$ W7 W* h  s! a" G& j十分感谢!!我就准备这么做了。另外我也看到了一个帖子,也挺有意思的,与帖子无关,也可以看看学习一下。2 Y+ p7 x+ A) w( ?4 [
    : v) I( s5 v5 J: L
    再次感谢!/ c0 e) A$ |" R

    9 c+ ]: i% T1 \( h$ N) l———————————————6 `1 v( z" F4 D$ d, v. I0 Z1 F

    4 ^/ V( `7 {% L- D 基本流程:; T" \: ]: {  s5 I# E
    • 卡负责其模板渲染: render_output+ x% w6 `+ F6 x9 u3 s9 W
        ' i4 f0 n: X& h! Y
      • render_into
        % U) M* h+ ^$ J" B. J
        * \  }3 L6 H. x) J3 K6 J/ o+ [
    • 从模板解析{{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_tags1 y9 \3 _# ]# `6 {; y7 w

        % N! ^0 U: t! O0 Q9 h! M3 [; p
      • [sound:]标签也已完成此操作
        & w# r: ~" K% W3 c: _8 b. l
      • 这会将其转换为AVTag的列表,并且文本表示形式引用此列表的索引。
        $ d% ~# k# s' j7 L! f6 U7 \" o( d# a$ b
    • AVTag的列表存储在卡中: render_card_from_contextrender_cardquestion_av_tags& [+ k7 h) I5 w. R/ S- H, T1 L$ I; O& y

        4 n6 j( b% I  }1 s. G) f
      • 列出了两个列表,一个用于问题,一个用于答案。
        0 n: N) \4 ^/ t$ T+ A( q+ e
        % h. g( ]  D! G8 u
    • 在卡片上渲染: prepare_card_text_for_display9 [/ v" g8 e# {4 e- O* e

        3 F* ]/ }) \1 Y8 d! c4 w3 x
      • [anki:play]转换为svg,其调用pycmd('play:q:0') av_refs_to_play_icons+ n' a7 W& G% B4 z' B3 f
        / P9 `  N& X# W2 Z5 {
    • 审阅者将卡中的AVTag传递给sounds.av_player : replay_audio
    • aqt.sounds.av_player是玩家列表的抽象。 这些设置为接受AVTag ,并将其排名为setup_audio _best_player_for_tag
    • 排名逻辑: voice_for_tag$ m! V" _5 }* A8 n
      * .play在播放器上被调用,
    • 添加{{tts-voices}}字段: on_tts_voices  E, W" W5 ?- L; g# V
  • TA的每日心情

    昨天 20:34
  • 签到天数: 553 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:36:58 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45
    ! b% \" L% N4 u2 L1 t5 }. {那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText% W( `# F* k" U% z
    另外,直接写上不可以么,如果这个占位 ...
    ) V; I" t, B6 g
    占位符都是[sound:appppppple.mp3]的格式,我在浏览器上测试过了没有问题,anki里跑不成,其他方式也试过了,都不行" s/ Z- W& ?; K( ?1 j! m2 I% g
    5 ~2 O% N4 s7 r$ E7 k# U
    卡片HTML部分:  w9 {/ |  o1 Z' S5 b% c  L0 ?
    <span id="audio1" class="voice">{{音频}}</span>
    ( M1 R/ w# I0 M. k3 I) U/ D<audio id="audio2" loop autoplay></audio>
    6 `& x: S% I- @$ G
    : @' F9 o. K7 o, R3 R* w! \JS部分:( B& k1 L' y; ~' u+ ~5 a& k
        var str = document.getElementById("audio1").innerHTML;
    $ m5 u/ r% c! v+ M: N' p. a, x    var txt = str.replace("[sound:","").replace("]","");
    9 F/ |5 l* o8 N# v% @, x        txt = "<source src=" + txt + ">"$ r2 I/ q; X8 H  x7 T
        document.getElementById("audio2").innerHTML = txt;
  • TA的每日心情

    昨天 20:34
  • 签到天数: 553 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-31 19:15:27 | 显示全部楼层
    arruno 发表于 2022-3-30 22:45: S' \0 a4 K' u7 G) O
    那个,js对大小写敏感,你改成innerText试试。innerHTML/innerText& }6 b4 n3 h. p
    另外,直接写上不可以么,如果这个占位 ...
    / @" ~0 X" Z9 D+ h+ j, x7 o! K
    尝试过了,不行,哎。似乎各种方法都识别不了{{音频}},似乎卡片在生成之前就已经被提取转换了。
    8 u" k, ?1 W8 Q$ w' J5 J8 U+ {4 Q! X
    . B$ |* G6 g, v/ Q头秃啊
  • TA的每日心情

    昨天 20:34
  • 签到天数: 553 天

    [LV.9]以坛为家II

     楼主| 发表于 2022-3-29 23:14:02 | 显示全部楼层
    本帖最后由 496147678 于 2022-3-29 23:23 编辑
    % u, Y) L; c, T3 k0 I2 H9 k9 v! J  k, F
    arruno 发表于 2022-3-29 12:02
    " B6 p" q+ R+ g: W没有定义id啊,document.getElementsByTagName("audio")[0].src 这样就可以

    2 l$ X8 N2 N# C" @
    ' f+ q+ z' w4 _8 v您可能没有理解我意思。
    ( e! j4 X8 @! l' Y* f9 i举个例子,我现在有一张卡片,卡片正面是apple,这张卡片是有音频的,但音频的文件名是随机的,我不清楚。我现在想让这张卡片音频循环播放,于是想到用<audio loop autoplay controls src="xxxxx.mp3">的方法,其中xxxx我不知道。于是我想提取每张卡片的音频文件的名字。; I! X7 k5 m, e7 P9 `5 n& m) j* K4 j
    卡片正面是这样的:
    8 V3 L2 @' @# G<div class="section">, i7 v4 L( h. L# _1 ^7 d5 _
    <div class="expression">{{单词}}</div>
    : Z: i: t: u4 B" T<span id=“audio” class="voice">{{音频}}</span
      ]1 d2 g# M4 w4 l7 j: }</div>
    # o1 j; X7 w" O: J% \1 J
    ) e# P! b8 ]2 m4 F# q) V' q$ k4 k4 n6 Z: b也就是我想知道  {{音频}}  的名字是什么,以便下一部操作
    $ F$ n. n! R$ j' [0 Z! ]
    / w3 V5 D5 d. ~1 F( z* f, N于是我尝试:4 x9 |8 ]! [9 F, o! l, ^, K
    var price = document.getElementById("audio").innerTEXT;
    / W$ [" P0 |9 ?, E( Z1 Ralert (price)
    ; R" ?$ s! F( R. F. e0 Cprice返回是undefined+ U) ~; {1 S) q: G. _' s+ a

    ' C" k2 D8 I3 n0 b1 l您的方法我也试了,也是一样( z; [3 T/ s0 S: T6 T
    7 `0 ]  D5 m- Y8 Y0 d- P- ~
    很抱歉麻烦您了,您看看有什么好的建议吗3 v9 S1 J/ U( j" y" R
  • 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
    , P% D' l& m2 j另外,直接写上<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 编辑
    4 l; Y9 r- \3 T9 s( H" x+ x. t( h% G; S/ q: o6 L4 p
    我今天抽空试试。其实有一个不那么美观、但是简单有效的方法,就是你在卡片里,把{{音频}}这个字段复制n次,它就会自动播放n次。
    : h8 ^3 j- j+ E7 i: B* F比如:{{音频}}{{音频}}{{音频}} 这样就会重复3次。
    1 N( G& L8 m8 q- d如果不能解决,至少这样可以部分实现你的需求。9 u7 Q3 P: u( A( F! D3 `

    : u4 z% k. g- k& k———————————————
    . h0 Q+ G) T, x# W看了一下,是我的疏忽,音频比较特殊,会被Anki模板引擎渲染成这样的HTML结构:
      M0 v' U3 Z, B8 ^* d<a class="replay-button soundLink" href="#" onclick="pycmd('play:a:0'); return false;">
    ' ~+ \. k( Y$ X) m, `<svg class="playImage" viewBox="0 0 64 64" version="1.1">
    : e% F9 p  S2 v( A$ {<circle cx="32" cy="32" r="29"></circle>
      V! `6 X# p7 p/ w' u3 S<path d="M56.502,32.301l-37.502,20.101l0.329,-40.804l37.173,20.703Z"></path>
    8 c" c; P: k0 z</svg>
    : R) }& k) t" h</a>! }4 Q- i" w: e( }5 l3 Y8 ^- i3 ]( M
    建议还是用上面的方法吧,可以加一个hidden属性做好看一点:& |8 s/ z. |2 ^2 C; G
    ( r- O; O- J* I# A; n. I
    <div hidden="true">
    + P- T8 |! T* E9 `# y1 S! C% P{{音频}}
    / G( h; v0 e& T1 n{{音频}}0 y7 }: ]7 M1 v' l% G. u8 K% h8 U$ T
    {{音频}}
    # A2 q, D( c+ E5 q</div>
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-5-7 06:08 , Processed in 0.070869 second(s), 9 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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