Какой простой способ динамически генерировать JavaScript в Seaside? - PullRequest
0 голосов
/ 25 января 2011

Я пытаюсь добавить Disqus в блог, который я пишу.Чтобы иметь дело с сеансами Seaside, мне нужно либо добавить в JS уникальный Discus_identifier, либо disqus_url.Я переопределил метод #script моего компонента, но он может возвращать только строковый литерал.

Я вижу два варианта:

  1. Динамически генерировать JS, сохранить его в файл и загрузить его.файл в мой компонент.
  2. Добавить постоянную ссылку для каждой записи в блоге.

Есть ли более простой способ?Или один (или оба) из этих способов легко сделать?Я новичок в Smalltalk и Seaside и не уверен, как выполнить любую из этих двух вещей.

Ответы [ 2 ]

1 голос
/ 06 февраля 2011

динамический материал JavaScript

если я прав, такой сценарий вы получите и для таких вещей, как кнопки ретвитов. (это то, что я имею в виду, чтобы предоставить вам примеры).

То, что я сделал в своем блоге, это небольшой специализированный приморский компонент с именем BITRetweet, который вы настраиваете с помощью постоянной ссылки (а также имени пользователя и стиля). Забудьте о файлах (это только усложнит), все на лету. Это оказывает с этим: </p> <p>BITRetweet>>renderContentOn: html</p> <pre><code>html script with: self customizedJavascript. html script url: self buttonJavascriptSource.

BITRetweet >> customizedJavascript

| script |

script := JSScript new.

script add: (('"',self permalink,'"') asJSObject assignTo: 'tweetmeme_url').

isCompact ifTrue:[
    script add: ('"compact"' asJSObject assignTo: 'tweetmeme_style')].

script add: (('"',username,'"') asJSObject assignTo: 'tweetmeme_source').
script add: (('"',shortener,'"') asJSObject assignTo: 'tweetmeme_service').

^ script 

BITRetweet >>> buttonJavascriptSource

"Answers the url to the source of the script for the button.
See: 
http://help.tweetmeme.com/2009/04/06/tweetmeme-button/"

^ 'http://tweetmeme.com/i/scripts/button.js'

и, наконец, небольшой взлом String, например:

Строка >> asJSObject

^ JSObject new alias: self

работа с постоянными ссылками

для постоянной ссылки есть две вещи:

  1. генерирует его
  2. используя его (заставляя приложение реагировать на запрос)

для 1 вы можете сделать что-то вроде этого:

PostComponent>>updateUrl: anUrl</p> <pre><code>super updateUrl: anUrl. anUrl addToPath: model asURLNice

Сообщение >> asURLNice

"Answers the receiver in an (destructive) encoded 
way which is url friendly"

^ String streamContents: [:stream|
    self do:[:char|
        char isSeparator 
            ifTrue:[stream nextPut: $-]
            ifFalse:[
                char isAlphaNumeric ifTrue:[
                    stream nextPut: char asLowercase asNonDiacritical]]]]

и для 2 вы должны сделать что-то вроде этого в основном компоненте приложения: </p> <p>BlogApplication>>initialRequest: aRequestOrNil</p> <pre><code>| paths | super initialRequest: aRequestOrNil. aRequestOrNil ifNil:[^ nil]. (aRequestOrNil url asString endsWith: '/sitemap.xml') ifTrue:[ ^ self respondSitemap]. paths := aRequestOrNil url path. paths size < 2 ifTrue:[^nil]. (Post atURLTitle: paths last) ifNotNilDo: [:value | ^ self readPost: value].

живые примеры

Вы можете увидеть все это в действии в моем блоге или в выборочном творчестве asNonDiacritical нужен мне, потому что я пишу на трех языках, но DiacriticalSupport доступен в squeaksource , если вам это нужно

весело взломать

о /

1 голос
/ 26 января 2011

Да, есть более простой способ.Вы можете сгенерировать правильный JS-код Discus прямо в методе #script.Он должен возвращать строковый литерал, но вы можете создать эту строку на лету.Например, используя WriteStream.

Записи в вашем блоге также нуждаются в постоянной ссылке.Вы можете использовать #initialRequest: метод для обработки этих постоянных ссылок.

...