sketchucation logo sketchucation
    • 登入
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    ⚠️ Important | Libfredo 15.6b introduces important bugfixes for Fredo's Extensions Update

    JSON in Ruby

    已排程 已置頂 已鎖定 已移動 Developers' Forum
    48 貼文 7 Posters 7.7k 瀏覽 7 Watching
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • Dan RathbunD 離線
      Dan Rathbun
      最後由 編輯

      @myhand said:

      @aerilius said:

      please take a look and make use of the WebDialogX project.

      I cannot access the content. I get "You do not have access to the wiki." message, even after I have registered.

      Sorry, it is a 5-slot private repository at this time, and we really need very experienced Rubyists for the slots.

      And you are kinda re-inventing the wheel. Js has %(#8000BF)[escape()] and %(#8000BF)[unescape()], and Ruby has them in the URI library.

      See topic: http://sketchucation.com/forums/viewtopic.php?f=180&t=49183#p442102

      In fact I would vote for Ruby's URI::Escape module to be mixed into the SketchUp API UI::WebDialog class.

      I'm not here much anymore.

      1 條回覆 最後回覆 回覆 引用 0
      • M 離線
        Myhand
        最後由 編輯

        @dan rathbun said:

        Sorry, it is a 5-slot private repository at this time, and we really need very experienced Rubyists for the slots.

        No problem Dan, I only looked there as Aerilius recommended I do so.

        @dan rathbun said:

        And you are kinda re-inventing the wheel. Js has %(#8000BF)[escape()] and %(#8000BF)[unescape()], and Ruby has them in the URI library.

        See topic: http://sketchucation.com/forums/viewtopic.php?f=180&t=49183#p442102

        In fact I would vote for Ruby's URI::Escape module to be mixed into the SketchUp API UI::WebDialog class.

        Thank you, I will try the URI library (I already use escape() in my latest JS code). I do not really want to reinvent the wheel, hence me asking the question here.

        http://www.keepingmyhandin.com/

        1 條回覆 最後回覆 回覆 引用 0
        • M 離線
          Myhand
          最後由 編輯

          @aerilius said:

          1. You need to escape \ characters in the double-quoted javascript code that you want to bring into the webdialog (this first escaping is what makes a valid Ruby string).
            %(#000000)["alert('C:\users')"] # bad Ruby string
            %(#000000)["alert('C:\\users')"] # good Ruby string
          2. In the webdialog, the string arrives written in a script element. As always, the same escaping rules apply again:
            %(#000000)[alert('C:\users')] // bad JavaScript code
            %(#000000)[alert('C:\\users')] // good JavaScript code

          => So finally this means we need double escaping on the Ruby side!
          %(#000000)["alert('C:\\\\users')"] # Ruby string

          Thanks for a very clear explanation. 👍 I tried this last night and it worked. Need 7 '''s for a "!

          http://www.keepingmyhandin.com/

          1 條回覆 最後回覆 回覆 引用 0
          • thomthomT 離線
            thomthom
            最後由 編輯

            @myhand said:

            Need 7 '''s for a "!

            ❓ ❓

            What?

            Thomas Thomassen — SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 條回覆 最後回覆 回覆 引用 0
            • M 離線
              Myhand
              最後由 編輯

              @dan rathbun said:

              And you are kinda re-inventing the wheel. Js has %(#8000BF)[escape()] and %(#8000BF)[unescape()], and Ruby has them in the URI library.

              See topic: http://sketchucation.com/forums/viewtopic.php?f=180&t=49183#p442102

              Thanks for this Dan! It works well, and I do not need to remember the number of slashes. 😄

              I see that escape() and unescape() are deprecated though and that you are recommended to use

              decodeURI()
              
              decodeURIComponent()
              

              Which do you recommend or should I continue with unescape()?

              http://www.keepingmyhandin.com/

              1 條回覆 最後回覆 回覆 引用 0
              • M 離線
                Myhand
                最後由 編輯

                @thomthom said:

                @myhand said:

                Need 7 '''s for a "!

                ❓ ❓

                What?

                Sorry, meant you need

                "a JSON escaped double quote need to be specified like this \\\\\\\" in Ruby for a WebDialog call"

                to produce

                "a JSON escaped double quote need to be specified like this \" in Ruby for a WebDialog call"
                

                as the parameter of the JS function called.

                http://www.keepingmyhandin.com/

                1 條回覆 最後回覆 回覆 引用 0
                • Dan RathbunD 離線
                  Dan Rathbun
                  最後由 編輯

                  Hmmm..

                  given a Js function named say()

                  .. and a Ruby string:
                  jarg = %q('a JSON escaped double quote need to be specified like this %q(\") in Ruby for a WebDialog call')

                  I usually do something like this:

                  dlg.execute_script("say(#{jarg});")

                  or I will leave the single quotes out of the jarg string, and put them in at the call ...

                  jarg = %q(a JSON escaped double quote need to be specified like this %q(\") in Ruby for a WebDialog call.)
                  dlg.execute_script( "say('" << jarg << "');" )

                  💭

                  I'm not here much anymore.

                  1 條回覆 最後回覆 回覆 引用 0
                  • Dan RathbunD 離線
                    Dan Rathbun
                    最後由 編輯

                    [quote="Myhand":31wco2xd]I see that %(#8000BF)[escape()] and %(#8000BF)[unescape()] are deprecated (in Javascript,) though, and that you are recommending to use [them]
                    ***%(#BF4000)[
                    @unknownuser said:

                    ]***

                    @unknownuser said:

                    ](http://msdn.microsoft.com/en-us/library/dz4x90hk(v)":31wco2xd]The unescape function should not be used to decode Uniform Resource Identifiers (URI). Use decodeURI and decodeURIComponent functions instead.
                    %(#8000BF)[decodeURI()]
                    %(#8000BF)[decodeURIComponent()]

                    Which do you recommend or should I continue with %(#8000BF)[unescape()]?

                    The old functions are ASCII, the new ones are Unicode.

                    Taking a look at the most recent released ECMA-262 (but not the latest proposed revision,) the old functions are no longer listed.

                    see: ECMA-262, 5.1, Global Object: 15.1.3 URI Handling Function Properties
                    ECMAScript Language Specification
                    Standard ECMA-262
                    5.1 Edition / June 2011

                    Link to the downloadable PDF of the specification.


                    But you need to handle the situation where an older browser does not have these functions so, write a wrapper in JS:

                    var unesc = function(uri) {
                        var test = false;
                        if (typeof(decodeURI) == "function") test = true;
                        return test ? decodeURI(uri) ; unescape(uri);
                    }
                    

                    💭

                    I'm not here much anymore.

                    1 條回覆 最後回覆 回覆 引用 0
                    • 1
                    • 2
                    • 3
                    • 3 / 3
                    • 第一個貼文
                      最後的貼文
                    Buy SketchPlus
                    Buy SUbD
                    Buy WrapR
                    Buy eBook
                    Buy Modelur
                    Buy Vertex Tools
                    Buy SketchCuisine
                    Buy FormFonts

                    Advertisement