Как создать кликабельную ссылку в реболе VID? - PullRequest
1 голос
/ 07 августа 2010

Допустим, я хочу создать твиттер-клиент, в котором есть твиты. Как мне создать и обнаружить кликабельную ссылку в текстовой зоне?

Обновление: я имею ввиду в реболе VID

Ответы [ 2 ]

2 голосов
/ 08 августа 2010

Это скрипт, который обнаруживает URL-адреса в face/text и накладывает гиперссылки: http://www.ross -gill.com / r / link-up.html

view layout [
    my-text: text read %some.txt
    do [link-up my-text]
]

Он основанна шаблоне в статье ниже, поэтому вам может понадобиться адаптировать шаблон распознавания к вашим спецификациям.Ссылки передаются через функцию to-link, которая по умолчанию такая же, как to-url

1 голос
/ 08 августа 2010

В принципе, вы хотите:

  • анализ вашей строки для определения URL-адресов
  • замените каждый URL тегом привязки

REBOL.org использует код, очень похожий на код ниже, чтобы сделать это. Обратите внимание, что в реализации есть три элемента:

  1. набор определений разбора, которые определяют URL и его компоненты
  2. функция, которая анализирует строку. Каждый раз, когда он находит URL в строке, он вызывает внешнюю функцию. Он заменяет URL исходной строки на то, что ему возвращает внешняя функция
  3. внешняя функция, которая просто помещает URL в тег привязки

    ;;   ======================================
    ;;   Definitions provided by
    ;;   Andrew Martin, 15-June-2004
    ;;   ....not all are needed for locating URLs ... so
    ;;   feel free to remove unnecessary items
    
    Octet: charset [#"^(00)" - #"^(FF)"]
    Digit: charset "0123456789"
    Digits: [some Digit]
    Upper: charset [#"A" - #"Z"]
    Lower: charset [#"a" - #"z"]
    Alpha: union Upper Lower
    Alphas: [some Alpha]
    AlphaDigit: union Alpha Digit
    AlphaDigits: [some AlphaDigit]
    Hex: charset "0123456789ABCDEFabcdef"
    Char: union AlphaDigit charset "-_~+*'"
    Chars: [some [Char | Escape]]
    Escape: [#"%" Hex Hex]
    Path: union AlphaDigit charset "-_~+*'/.?=&;{}#"
    Domain-Label: Chars
    Domain: [Domain-Label any [#"." Domain-Label]]
    IP-Address: [Digits #"." Digits #"." Digits #"." Digits]
    User: [some [Char | Escape | #"."]]
    Host: [Domain | IP-Address]
    Email^: [User #"@" Host]
    Url^: [["http://" | "ftp://" | "https://"] some Path] 
    
    
    ;; function to locate URLs in a string
    ;; and call an action func when each is found
    ;; ==========================================
    
    find-urls:  func [
        String [string!]
        action-func [function!]
       /local Start Stop
     ][
      parse/all String [
         any [
            Start: copy url url^  Stop: (
               Stop: change/part Start action-func url Stop
               print start 
               )
               thru </a>    ;; this is dependent on the action-func setting </a> as an end marker
            | skip
            ]
         end
         ]
        return String
          ]
    
        ;; example of usage with an action-func that
        ;; replaces url references with an anchor tag
        ;; ===========================================
    
    target-string: {this string has this url http://www.test.com/path in it
    and also this one: https://www.test.com/example.php}
    
    find-urls target-string
         func [url][print url return rejoin [{<a href="} url {">} url </a>]]
    probe target-string
    
     {this string has this url <a href="http://www.test.com/path">http://www.test.com/path</a> in it
     and also this one: <a href="https://www.test.com/example.php">https://www.test.com/example.php</a>}
    

Примечания

  1. Вы легко сможете увидеть, как адаптировать find-urls , скажем, к find-email-address для обфукации и / или кликабельности; все определения разбора для поиска адресов электронной почты приведены в примере выше
  2. Здесь вы можете увидеть версию этого кода REBOL.org, например: http://www.rebol.org/aga-display-posts.r?offset=0&post=r3wp157x17091
  3. Я оставлю вам упражнение в обходе, сделав его кликабельным, если URL уже находится в теге привязки
  4. Также не учтено: необходимо избегать символов в URL (например, & ==> amp;)
  5. Спасибо пионеру REBOL Эндрю Мартину за оригинальный код, на котором он основан.
...