Какой простой способ динамически генерировать JavaScript в Seaside?

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

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

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

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

2 ответа

Решение

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

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

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

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

То, что я сделал в своем блоге, это небольшой специализированный приморский компонент с именем BITRetweet, который вы настраиваете с помощью постоянной ссылки (а также имени пользователя и стиля). Забудьте о файлах (это только усложнит), все на лету. Это оказывает с этим:

BITRetweet>>renderContentOn: html

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

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 вы должны сделать что-то вроде этого в основном компоненте приложения:

BlogApplication>>initialRequest: aRequestOrNil

| 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 доступен в http://squeaksource.com/, если вам это нужно

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

о /

Другие вопросы по тегам