Вы находитесь на странице: 1из 78

Universidade Federeal Fluminense

Semana de Engenharia 2009

Introduo `s Linguagens NCL e Lua: ca a Desenvolvendo Aplicaes Interativas para co TV Digital

Autores: Rafael Carvalho1 Joel Andr Ferreira dos Santos2 e Jean Ribeiro Damasceno3 Julia Varanda da Silva4 Dbora Christina Muchaluat Saade e

E-mails: rafael.carvalho@peta5.com.br, (joel, damascon, julia, debora)@midiacom.u.br

19 de outubro de 2009
1 2

Peta5 Laboratrio M o diaCom, Peta5, Departamento de Engenharia de Telecomunicaoes c 3 Laboratrio M o diaCom, Departamento de Engenharia de Telecomunicaoes c 4 Peta5, Laboratrio M o diaCom, Instituto de Computaao c 5 Laboratrio M o diacom, Instituto de Computaao c

Sumrio a
1 Introduo ca 2 Middleware 2.1 Linguagem Declarativa X Linguagem 2.1.1 Linguagens Declarativas . . . 2.1.2 Linguagens Procedurais . . . 2.1.3 Aplicaes H co bridas . . . . . 3 Linguagem NCL 3.1 Introduo . . . . . . . . . . . . . . ca 3.1.1 Nested Context Model . . . 3.1.2 Onde . . . . . . . . . . . . 3.1.3 Como . . . . . . . . . . . . 3.1.4 O que . . . . . . . . . . . . 3.1.5 Quando . . . . . . . . . . . 3.2 Extensible Markup Language . . . 3.3 Estrutura de um documento NCL . 3.3.1 Cabealho . . . . . . . . . . c 3.3.2 Corpo . . . . . . . . . . . . 3.4 Denindo a apresentao . . . . . . ca 3.4.1 Regies . . . . . . . . . . . o 3.4.2 Descritores . . . . . . . . . 3.4.3 Prtica . . . . . . . . . . . a 3.5 Inserindo os elementos . . . . . . . 3.5.1 M dias . . . . . . . . . . . . 3.5.2 Ancoras . . . . . . . . . . . 3.5.3 Propriedades . . . . . . . . 3.5.4 Prtica . . . . . . . . . . . a 3.6 Organizando o documento . . . . . 3.6.1 Contexto . . . . . . . . . . 3.6.2 Portas . . . . . . . . . . . . 3.6.3 Prtica . . . . . . . . . . . a 3.7 Sincronizando os elementos . . . . 3.7.1 Conectores . . . . . . . . . 3.7.2 Elos . . . . . . . . . . . . . 3.7.3 Prtica . . . . . . . . . . . a 3.8 Denindo alternativas . . . . . . . 3.8.1 Regras . . . . . . . . . . . . 3 6 7 7 7 7 10 10 10 10 11 11 11 12 13 14 14 14 14 16 17 17 18 18 19 20 20 20 21 21 21 22 24 25 28 28

Procedural . . . . . . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.8.2

Switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28 31 31 31 31 32 32 33 34 35 35 36 36 36 37 38 38 39 39 40 40 40 41 42 42 43 43 44 44 45 45 46 46 49 49 49 49 50 53 60 60 62

4 Linguagem Lua 4.1 Introduo . . . . . . . . . . . . . . . . . . . ca 4.1.1 Pequeno histrico . . . . . . . . . . . o 4.1.2 Convenes Lxicas . . . . . . . . . co e 4.1.3 O interpretador de linha de comando 4.1.4 Prtica . . . . . . . . . . . . . . . . a 4.2 Tipos e variveis . . . . . . . . . . . . . . . a 4.2.1 Tipos . . . . . . . . . . . . . . . . . 4.2.2 Variveis . . . . . . . . . . . . . . . a 4.2.3 Prtica . . . . . . . . . . . . . . . . a 4.3 Operadores . . . . . . . . . . . . . . . . . . 4.3.1 Aritimticos . . . . . . . . . . . . . . e 4.3.2 Relacionais . . . . . . . . . . . . . . 4.3.3 Lgicos . . . . . . . . . . . . . . . . o 4.3.4 Concatenao . . . . . . . . . . . . . ca 4.3.5 Prtica . . . . . . . . . . . . . . . . a 4.4 Estruturas de controle . . . . . . . . . . . . 4.4.1 if then else . . . . . . . . . . . . . . 4.4.2 while . . . . . . . . . . . . . . . . . . 4.4.3 repeat . . . . . . . . . . . . . . . . . 4.4.4 for numrico . . . . . . . . . . . . . e 4.4.5 for genrico . . . . . . . . . . . . . . e 4.5 Saindo de um bloco . . . . . . . . . . . . . . 4.6 Funes . . . . . . . . . . . . . . . . . . . . co 4.6.1 Declarao e execuo . . . . . . . . ca ca 4.6.2 Nmero varivel de argumentos . . . u a 4.6.3 Retorno . . . . . . . . . . . . . . . . 4.6.4 Prtica . . . . . . . . . . . . . . . . a 4.7 Tabelas . . . . . . . . . . . . . . . . . . . . 4.7.1 Criao de tabelas . . . . . . . . . . ca 4.7.2 Tamanho de tabelas . . . . . . . . . 4.7.3 Prtica . . . . . . . . . . . . . . . . a 5 Integrao NCL-Lua ca 5.1 Introduo . . . . . . . . . ca 5.2 Scripts NCLua . . . . . . 5.3 Mdulos NCLua . . . . . o 5.3.1 Mdulo event . . . o 5.3.2 Mdulo canvas . . o 5.3.3 Mdulo settings . . o 5.3.4 Mdulo persistent o A Exemplos da Apostila

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

B Ferramentas 71 B.1 Composer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 B.2 NCL Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Cap tulo 1

Introduo ca
A TV digital interativa traz inmeras facilidades e oportunidades para os programas de televiso. u a Com o uso deste sistema, os telespectadores podem ter acesso a jogos e programas interativos cujo contedo pode ser moldado de acordo com a sua escolha. u O recente sistema brasileiro de TV digital [1] foi denido de forma a possibilitar a criao ca de programas com as caracter sticas citadas. O sistema brasileiro de TV digital possui uma arquitetura em camadas, onde cada camada oferece servios para a camada imediatamente superior e usa os servios da camada imediatac c mente inferior, como ilustrado na Figura 2.1.

Figura 1.1: Arquitetura do Sistema Brasileiro de TV Digital. As camadas so caracterizadas da seguinte forma: a Servios, aplicaes e contedo: camada responsvel pela captura e formatao dos sinais c co u a ca de udio e v a deo, bem como a implementao de servios interativos na forma de software ca c pare serem executadas em uma ou mais entidades de hardware [2]. Middleware: camada de software que realiza a integrao de todas as subcamadas do sisca tema. O middleware permite que os aplicativos gerados pelas emissoras sejam compat veis com todas as plataformas de recepo desenvolvidas para o padro de TV digital [3]. ca a Compresso: camada responsvel pela remoo de redundncias nos sinais de udio e a a ca a a v deo, reduzindo assim a taxa de bits necessria para transmitir essas informaes [2]. No a co receptor, essa camada decodica os uxos de udio e v a deo recebidos. O sistema brasileiro

adotou o padro MPEG-4 HE AAC para compresso de udio e o padro H.264 para a a a a compresso de v a deo. Multiplexao: camada responsvel por gerar um unico uxo de dados contendo o v ca a deo, a udio e aplicaes dos diversos programas a serem transmitidos, baseada no padro MPEGco a 2 Systems [2]. Transmisso/Recepo: tambm denominada de camada f a ca e sica, a camada responsvel e a por levar as informaes digitais da emissora at a casa do telespectador [4]. O sistema co e brasileiro adotou a mesma tecnologia utilizada no sistema japons de TV digital, baseada e em BST-OFDM. Os programas, ou aplicaes, para o ambiente de TV digital podem ser criados com o uso de co dois paradigmas de programao distintos: declarativo e procedural. O middleware Ginga [5], ca adotado como padro no sistema brasileiro, subdivido em Ginga-NCL [3, 6], que d suporte `s a e a a aplicaes declarativas e Ginga-J [8], que oferece suporte `s aplicaes que utilizam o paradigma co a co procedural. Esta apostila apresenta o middleware Ginga, focando em sua parte declarativa Ginga-NCL, que permite o uso das linguagens NCL (Nested Context Language) [6] e Lua [7] para autoria de aplicaes para o ambiente de TV digital. co O Cap tulo 2 apresenta uma introduo ao middleware Ginga e discute diferenas entre os ca c paradigmas de programao declarativo e procedural. ca O Cap tulo 3 introduz a linguagem NCL apresentando os principais elementos da linguagem atravs de exemplos prticos. e a O Cap tulo 4 aborda a linguagem Lua e tambm utiliza exemplos para discutir suas principais e caracter sticas. O Cap tulo 5 discute a integrao entre as linguagens NCL e Lua em uma mesma aplicao ca ca para TV digital. Os Apndices A e B apresentam os cdigos fonte dos exemplos completos discutidos ao e o longo do texto e tambm abordam as principais ferramentas de autoria de aplicaes para o e co Ginga-NCL.

Referncias e
[1] Norma ABNT 15606-2:2007. Televiso digital terrestre - Codicao de dados e especicaes a ca co de transmisso para radiodifuso digital - Parte 2: Ginga-NCL para receptores xos e mveis a a o Linguagem de aplicao XML para codicao de aplicaes. ca ca co [2] Marcelo Sampaio de Alencar. Televiso Digital. Editora Erica. Edio1. a ca [3] Soares, L.F.G; Rodrigues, R.F; Moreno, M.F. Ginga-NCL: The Declarative Environment of the Brazilian Digital TV System. Journal of the Brazilian Computer Society. Maro, 2007. c [4] Mendes, L. L. SBTVD - Uma viso sobre a TV Digital no Brasil. Outubro, 2007. TC a Amaznia, Ano V, Nmero 12. o u [5] Ginga, Brazilians Digital TV Middleware. (http://www.ginga.org.br). Acessado em Outubro de 2009. [6] ITU International Telecommunication Union. Nested Context Language (NCL) and Ginga-NCL for IPTV services. ITU-T Recommendation H.761. 2009. (http://www.itu.int/rec/TREC-H.761-200904-P). [7] R. Ierusalimschy, L. H. de Figueiredo, W. Celes. The evolution of Lua. Proceedings of ACM HOPL III (2007) 2-12-26. [8] G. Souza Filho, L. Leite, C. Batista. Ginga-J: The Procedural Middleware for the Brazilian Digital TV System. Journal of the Brazilian Computer Society. Maro, 2007. c

Cap tulo 2

Middleware
Ginga o nome do Middleware aberto do Sistema Brasileiro de TV Digital [1]. A arquitetura e e as facilidades Ginga foram projetadas para serem aplicadas a sistemas de radiodifuso e rea ceptores de radiodifuso terrestre e a sistemas IPTV [2]. Adicionalmente, a mesma arquitetura a e facilidades podem ser aplicadas a sistemas que utilizam outros mecanismos de transporte de dados (como sistema de televiso via satlite ou a cabo). a e A nalidade da camada de middleware oferecer um servio padronizado para as aplicaes, e c co escondendo as peculiaridades e heterogeneidades das camadas inferiores, tais como, tcnicas de e compresso de m a dias, de transporte e de modulao. Um middleware padronizado facilita a ca portabilidade das aplicaes, permitindo que sejam executadas em qualquer receptor digital (ou co set-top box) que suporte o middleware adotado. Essa portabilidade primordial em sistemas de e TV digital, pois imposs considerar como premissa que todos os receptores digitais sejam e vel exatamente iguais. A arquitetura da implementao de referncia do middleware Ginga, ilustrada na Figuras 2.1, ca e pode ser dividida em trs grandes mdulos: Ginga-CC (Common Core) que concentra servios e o c necessrios tanto para a mquina de apresentao quanto para a mquina de execuo; o ama a ca a ca biente de apresentao Ginga-NCL (declarativo), que suporta o desenvolvimento de aplicaes ca co declarativas; e o ambiente de execuo Ginga-J (procedural), que suporta o desenvolvimento ca de aplicaes procedurais. Dependendo das funcionalidades requeridas no projeto de cada co aplicao, um ambiente de desenvolvimento de aplicaes ser mais adequado que o outro. ca co a

Figura 2.1: Arquitetura do middleware Ginga.

Uma aplicao de TV Digital pode ser declarativa, procedural ou h ca brida. As sees a seguir co apresentam esses conceitos.

2.1
2.1.1

Linguagem Declarativa X Linguagem Procedural


Linguagens Declarativas

As linguagens declarativas so mais intuitivas (de mais alto n a vel) e, por isso, mais fceis de a usar. Elas normalmente no exigem um perito em programao. O programador fornece apenas a ca o conjunto de tarefas a serem realizadas, no estando preocupado com os detalhes de como o exea cutor da linguagem (interpretador, compilador ou a prpria mquina real ou virtual de execuo) o a ca realmente implementar essas tarefas. Em outras palavras, a linguagem enfatiza a declarao a ca descritiva de um problema ao invs de sua decomposio em implementaes algor e ca co tmicas, no a necessitando, em geral, de tantas linhas de cdigo para denir certa tarefa. Contudo, as linguao gens declarativas tm de ser denidas com um foco espec e co. Quando o foco da aplicao no ca a casa com o da linguagem, o uso de uma linguagem procedural no apenas vantajoso, mas se a e faz necessrio. a No padro Brasileiro, o ambiente declarativo Ginga-NCL adotou NCL (Nested Context Lana guage) [3], uma aplicao XML, para a autoria de contedo multim ca u dia interativo. NCL e baseada no NCM (Nested Context Model ) [4], modelo conceitual para especicao de docuca mentos hiperm dia com sincronizao temporal e espacial entre seus objetos de m ca dia. NCL permite ao autor descrever o comportamento espacial e temporal de uma apresentao mulca tim dia, associar hyperlinks (interao do usurio) a objetos de m ca a dia, denir alternativas para apresentao (adaptao) e descrever o leiaute da apresentao em mltiplos dispositivos. ca ca ca u

2.1.2

Linguagens Procedurais

O uso de linguagens procedurais (imperativas) usualmente requer um perito em programao. ca O programador deve informar ao computador cada passo a ser executado. Pode-se armar que, em linguagens procedurais, o programador possui um maior controle do cdigo, sendo capaz de o estabelecer todo o uxo de controle e execuo de seu programa. Entretanto, para isso, ele deve ca ser bem qualicado e conhecer bem os recursos de implementao. ca Linguagens procedurais para sistemas de TV digital so frequentemente usadas em tarefas, a como processamento matemtico, manipulao sobre textos, uso do canal de interatividade, a ca controle no do teclado, animaes e colises para objetos grcos e, de maneira geral, tarefas co o a que necessitem da especicao de algoritmos e estruturas de dados. Por outro lado, linguaca gens procedurais, apesar de genricas, introduzem uma maior complexidade de programao e e ca dependem de uma base lgica que autores de contedo audio-visual nem sempre possuem. o u O ambiente procedural Ginga-J [5] adota a linguagem Java [6], como uma ferramenta para a criao de contedo interativo, tal como os sistemas de TV digital Americano, Europeu e ca u Japons o zeram. e

2.1.3

Aplicaes H co bridas

Uma aplicao de TV digital pode ser declarativa, procedural ou h ca brida. Uma aplicao h ca brida aquela cujo conjunto de entidades possui tanto contedo do tipo declarativo quanto procedural. e u Em particular, as aplicaes declarativas frequentemente fazem uso de scripts, cujo contedo co u e de natureza procedural. Alm disso, uma aplicao declarativa pode fazer referncia a um cdigo e ca e o Java TV Xlet embutido. Da mesma forma, uma aplicao procedural pode fazer referncia a ca e

uma aplicao declarativa, contendo, por exemplo, contedo grco, ou pode construir e iniciar ca u a a apresentao de aplicaes com contedo declarativo. Portanto, ambos os tipos de aplicao ca co u ca no middleware Ginga podem utilizar as facilidades dos ambientes de aplicao declarativo e ca procedural. O ambiente Ginga-NCL tambm permite o uso de Lua [7], uma linguagem de script, dentro e de aplicaes NCL. co O poder de uma linguagem declarativa elevado quando integrada com uma linguagem e procedural, passando a ter acesso a recursos computacionais genricos. Essa integrao deve e ca seguir critrios que no afetem os princ e a pios da linguagem declarativa, mantendo uma separao ca bem denida entre os dois ambientes. O autor da aplicao usa a forma declarativa sempre que ca poss e lana mo da forma procedural somente quando necessrio. vel c a a A criao da nova classe de objetos de m ca dia Lua, os quais so chamados de NCLua, a a e principal via de integrao de NCL a um ambiente procedural, conforme denido em seu perl ca para TV Digital. Por meio de elementos de m dia, scripts NCLua podem ser inseridos em documentos NCL, trazendo poder computacional adicional `s aplicaes declarativas. a co

Referncias e
[1] Norma ABNT 15606-2:2007. Televiso digital terrestre - Codicao de dados e especicaes a ca co de transmisso para radiodifuso digital - Parte 2: Ginga-NCL para receptores xos e mveis a a o Linguagem de aplicao XML para codicao de aplicaes. ca ca co [2] ITU International Telecommunication Union. Nested Context Language (NCL) and Ginga-NCL for IPTV services. ITU-T Recommendation H.761. 2009. (http://www.itu.int/rec/TREC-H.761-200904-P). [3] H. Silva, D. Saade, R. Rodrigues, and L. Soares. Ncl 2.0: Integrating new concepts to xml modular languages. ACM DocEng 2004, 2004. Wisconsin. [4] L. Soares and R. Rodrigues. Nested context model 3.0 part 1 NCM Core. Monograas em Cincia da Computao do Departamento de Informtica. PUC-Rio, No. 18/05. Rio de e ca a Janeiro, Maio 2005. ISSN 0103-9741. [5] G. Souza Filho, L. Leite, and C. Batista. Ginga-J: The Procedural Middleware for the Brazilian Digital TV System. Journal of the Brazilian Computer Society, 12(4), March 2007. [6] H. M. Deitel e P.J. Deitel. (2006) Java Como Programar. Pearson Prentice Hall, 6o edio. ca [7] F. SantAnna, R. Cerqueira, and L. Soares. NCLua - Objetos Imperativos Lua na Linguagem Declarativa NCL. XIV Brazilian Symposium on Multimedia and the Web (WebMedia 2008), pages 8390, 2008. Porto Alegre, RS, Brazil.

Cap tulo 3

Linguagem NCL
3.1 Introduo ca

Este cap tulo descreve a linguagem NCL (Nested Context Language) [1] em sua verso 3.0. NCL a uma linguagem baseada em XML [2], destinada ` autoria de documentos hiperm e a dia. Por ser uma linguagem de colagem, NCL utilizada para reunir objetos de m e dia em uma apresentao ca multim dia. Estes objetos de m dia podem ser de qualquer tipo, udio, v a deo, um documento HTML ou mesmo um objeto procedural. Para entender a linguagem NCL, bem como seu uso, se faz necessrio um estudo sobre o modelo que a gerou. As sees a seguir apresentam o modelo a co NCM (Nested Context Model), no qual NCL baseada. e

3.1.1

Nested Context Model

Um documento hiperm dia, de uma forma genrica, composto por ns e elos. Os ns represene e o o tam abstraes das m co dias utilizadas no documento alm de trazerem informaes adicionais, e co como por exemplo informaes sobre a sua apresentao. Os elos fazem a sincronizao espacial co ca ca ou temporal entre os ns que compem o documento. o o O modelo NCM (Nested Context Model) [3], Modelo de Contextos Aninhados, estende os conceitos acima aumentando o poder e exibilidade de um documento hiperm dia. NCM estende a denio de ns em dois tipos, ns de contedo e ns de composio. Um n de contedo ca o o u o ca o u traz informaes sobre uma m co dia utilizada pelo documento, enquanto um n de composio o ca possui um conjunto de ns de contedo e/ou outros ns de composio e conjunto de elos, sendo o u o ca utilizado para dar estrutura e organizao a um documento hiperm ca dia. Na construo de um documento hiperm ca dia, algumas informaes bsicas so necessrias, co a a a indicando o que deve ser apresentado, como, quando e onde deve ser apresentado. As prximas o sees discutem as entidades do modelo NCM utilizadas para especicar essas informaes. co co

3.1.2

Onde

Para que um n em um documento hiperm o dia seja apresentado, necessria a denio de e a ca uma rea para a exibio do mesmo. O modelo NCM dene elementos espec a ca cos para este m, denominados regies. Estes elementos indicam a posio e o tamanho da rea onde ns podero o ca a o a ser apresentados, sem se preocupar com a denio dos ns que efetivamente sero apresentados ca o a nesta rea. A Figura 3.1, demonstra uma regio. a a

10

Figura 3.1: Representao de uma regio. ca a

3.1.3

Como

A denio de uma regio precisa ser complementada com outras informaes que indicam ca a co como cada n ser apresentado. Esta descrio completa das caracter o a ca sticas de apresentao de ca cada n feita atravs de elementos denominados descritores. Um descritor pode descrever oe e parmetros sobre a apresentao dos ns, incluindo a regio onde ser apresentado, seu volume, a ca o a a sua transparncia, a durao de sua apresentao, entre outros. A Figura 3.2, demonstra um e ca ca descritor.

Figura 3.2: Representao de um descritor. ca

3.1.4

O que

O contedo de um documento hiperm u dia representado atravs de elementos denominados e e m dia. Uma m dia representa cada n de um documento, informando o descritor ao qual est o a relacionado. De acordo com o modelo NCM, uma m dia deve estar necessariamente dentro de um n de composio, denominado contexto, que utilizado para representar um documento o ca e completo ou parte dele. A Figura 3.3, demonstra o conceito de m dias e contextos.

3.1.5

Quando

Uma vez tendo escolhido os ns que faro parte do documento hiperm o a dia, torna-se necessrio a denir qual ser o primeiro n a ser apresentado e a ordem de apresentao dos demais ns. Essa a o ca o denio feita com o uso de elementos chamados portas e elos (links). As portas denem os ca e ns a serem apresentados quando um n de contexto iniciado e os links denem os relacionao o e mentos de sincronizao entre os ns e a interatividade do programa. Um link, entretanto, no ca o a dene todo o comportamento de um relacionamento por si s, para isso necessrio o uso de o e a conectores. A Figura 3.4, demonstra o uso de portas e elos.

11

Figura 3.3: Representao de m ca dias e contextos.

Figura 3.4: Representao de portas e elos. ca

3.2

Extensible Markup Language

Criada pelo World Wide Web Consortium (W3C) [4] em meados da dcada de 1990, a linguagem e XML (Extensible Markup Language) [2] um formato textual simples e bastante ex criado e vel para estruturar, armazenar e representar informao. Como XML no foi projetada para uma ca a aplicao espec ca ca, ela pode ser usada como base (metalinguagem) para a criao de linguagens ca de marcao. ca Em XML os documentos so organizados de forma hierrquica em uma rvore onde cada a a a elemento possui um elemento pai e elementos lhos. Essa organizao se assemelha a da rvore ca a genealgica de uma fam onde cada indiv o lia duo seria um elemento XML. Assim como no exemplo da rvore genealgica, onde cada indiv a o duo possui um nome e atributos (cor de cabelo, altura, etc) que o denem, um elemento em XML tambm possui uma identicao e atributos. Um e ca exemplo pode ser visto na Figura 3.7. No padro textual XML a denio de um elemento iniciada pelo s a ca e mbolo < e terminado pelos s mbolos />. Entre esses dois s mbolos so denidos o nome do elemento e os atributos a do mesmo. Os atributos de um elemento XML so denidos por uma dupla (nome, valor). A a Figura 3.5 demonstra a denio de um elemento usado para identicar um livro. ca No exemplo acima o elemento possui o nome livro e os atributos autor, titulo e subtitulo. Pode-se notar que o valor de cada atributo indicado aps o s e o mbolo =e entre aspas. Podese notar tambm que o nome do elemento, assim como os seus atributos, no possuem letras e a

12

<livro autor="J. R. R. Tolkien" titulo="Senhor do Anis" e subtitulo="O Retorno do Rei"/> Figura 3.5: Denio de um elemento. ca maisculas nem acentos, essa uma boa prtica para evitar o surgimento de erros na utilizao u e a ca do documento criado, j que XML case sensitive. a e Um elemento, como dito anteriormente, pode possuir outros elementos como lhos. No caso do exemplo acima, podemos estender o elemento livro denindo os elementos lhos capitulo, como pode ser visto na Figura 3.6. A Figura 3.7 demostra gracamente a rvore do elemento a livro. <livro autor="J. R. R. Tolkien" titulo="Senhor do Anis" e subtitulo="O Retorno do Rei"> <captulo numero="1" nome="Minas Tirith" inicio="5"/> <captulo numero="4" nome="O cerco de Gondor" inicio="69"/> </livro> Figura 3.6: Representao em cdigo do elemento livro. ca o

Figura 3.7: Representao grca do elemento livro. ca a Neste segundo exemplo, pode-se perceber uma segunda notao para um elemento. O eleca mento no terminado por />, como apresentado anteriormente, mas pela repetio do nome a e ca do elemento entre os s mbolos </e >, como visto no exemplo em </livro>. Outro ponto a ser observado que os elementos capitulo lhos de livro so denidos dentro deste ultimo, e a mantendo uma organizao e hierarquia entre os elementos. ca

3.3

Estrutura de um documento NCL

Para possibilitar a criao de documentos hiperm ca dia seguindo o modelo NCM apresentado anteriormente, foi desenvolvida a linguagem NCL. NCL uma linguagem baseada em XML. e

13

Todo o contedo de um documento NCL denido dentro do elemento <ncl> sendo sua estrutura u e dividida em duas grandes partes, o cabealho e o corpo do documento. c

3.3.1

Cabealho c

No cabealho do documento NCL so denidas as caracter c a sticas de apresentao do documento, ca atravs das regies e descritores, os relacionamentos que sero utilizados para a sincronizao e o a ca dos ns, atravs dos conectores, entre outras facilidades. o e

3.3.2

Corpo

Uma vez tendo sido denido o cabealho do documento NCL, necessria denio dos elemenc e a ca tos e a sincronizao entre eles. O corpo do documento NCL ca ento responsvel por esta ca a a denio. Alm da denio dos ns e elos, o corpo de um documento NCL pode tambm deca e ca o e nir composies, como visto na introduo sobre o modelo NCM, para melhorar sua estrutura e co ca organizao. Vale ressaltar que o corpo do documento NCL considerado um tipo especial de ca e composio e como toda composio deve possuir pelo menos uma porta para que seu contedo ca ca u seja exibido. Aps esta introduo sobre a linguagem NCL, podemos passar para o aprendizado da lino ca guagem. As sees seguintes apresentaro gradativamente as facilidades da linguagem NCL co a explicando os elementos que as proveem. Alm das explicaes sero propostos exerc e co a cios para a xao dos conceitos apresentados e promover desde o princ ca pio um maior contato com a linguagem. Ao nal deste cap tulo, seguindo os complementos gradativos dos exemplos, o leitor ter criado um programa em NCL que exibe um boto em quatro momentos diferentes e conta a a o nmero de vezes que esse boto selecionado. u a e

3.4

Denindo a apresentao ca

Nesta seo, deniremos como sero apresentados os elementos que compem o programa sendo ca a o criado. Como visto anteriormente, essas denies so feitas atravs das regies e descritores. co a e o

3.4.1

Regies o

As regies indicam as reas da tela onde os elementos do programa (v o a deo, texto, imagem, etc) podero ser apresentados. Com isso o documento NCL dene a posio inicial de um elemento. a ca Para que um documento seja apresentado, ao menos uma regio dever ser denida, sendo essa a a a regio que denir a dimenso da tela onde o documento NCL ser apresentado. a a a a As regies so denidas no cabealho do documento NCL na base de regies, elemento o a c o <regionBase> e so denidas pelo elemento <region>. Uma regio pode tambm conter outras a a e regies para permitir uma maior organizao do documento NCL. O exemplo da Figura 3.8 o ca demonstra a criao de duas regies (rgFundo e rgVideo). ca o <region id="rgFundo" width="640" height="480"> <region id="rgVideo" left="320" top="0" width="320" height="240"/> </region> Figura 3.8: Criao de duas regies. ca o

14

A regio rgFundo dene o tamanho total do dispositivo onde o documento ser apresentado, a a neste caso o tamanho ser de 640 por 480 pixels. A regio rgFundo possui uma regio interna a a a rgVideo. Essa regio dene o local onde, provavelmente, um v a deo ser apresentado, neste caso a no canto superior direito da tela e tendo o tamanho de 1/4 do tamanho total da tela. Pode-se observar que como a regio rgVideo est contida na regio rgFundo, seu posicioa a a namento e tamanho (caso este fosse representado de forma percentual) tem como referncia a e regio rgFundo. a Note que toda regio possui um identicador unico representado pelo atributo id. Este a identicador ser utilizado por outros elementos do documento NCL sempre que uma referncia a e a ` regio for necessria. Uma regio pode possuir os atributos listados abaixo. Destes atributos, a a a apenas o atributo id obrigatrio. e o id: identicador da regio. Este valor, que deve ser unico, ser utilizado sempre que uma a a referncia ` regio for necessria. e a a a left: Dene a coordenada horizontal ` esquerda da regio. Esta coordenada pode ser a a indicada em valores absolutos (sem a necessidade de indicar a unidade de medida usada) ou percentuais. Este valor ter como referncia a regio pai ou, no caso de a regio em a e a a questo no estar contida em outra, a tela do dispositivo de exibio. a a ca top: Dene a coordenada vertical superior da regio. Esta coordenada pode ser indicada a em valores absolutos (sem a necessidade de indicar a unidade de medida usada) ou percentuais. Este valor ter como referncia a regio pai ou, no caso de a regio em questo a e a a a no estar contida em outra, a tela do dispositivo de exibio. a ca right: Dene a coordenada horizontal ` direita da regio. Esta coordenada pode ser a a indicada em valores absolutos (sem a necessidade de indicar a unidade de medida usada) ou percentuais. Este valor ter como referncia a regio pai ou, no caso de a regio em a e a a questo no estar contida em outra, a tela do dispositivo de exibio. a a ca bottom: Dene a coordenada vertical inferior da regio. Esta coordenada pode ser ina dicada em valores absolutos (sem a necessidade de indicar a unidade de medida usada) ou percentuais. Este valor ter como referncia a regio pai ou, no caso de a regio em a e a a questo no estar contida em outra, a tela do dispositivo de exibio. a a ca width: Dene a dimenso horizontal da regio. Vale observar que esta dimenso tambm a a a e poderia ser denida com o uso dos atributos left e right. A escolha de como denir a dimenso da regio ca a cargo do programador. Entretanto, no caso dos atributos left e a a width serem denidos, o valor do atributo right no considerado. a e height: Dene a dimenso vertical da regio. Vale observar que esta dimenso tambm a a a e poderia ser denida com o uso dos atributos top e bottom. A escolha de como denir a dimenso da regio ca a cargo do programador. Entretanto, no caso dos atributos top e a a height serem denidos, o valor do atributo bottom no considerado. a e zIndex: Dene a sobreposio das camadas. De acordo com o valor contido neste atributo, ca uma regio ser apresentada acima de outras regies com zIndex menor e abaixo a a o de outras regies com zIndex maior. Caso duas regies com mesmo valor de zIndex o o sejam denidas, no caso de uma m dia ser apresentada em cada regio, existem duas a possibilidades de ordenao das regies: a m ca o dia apresentada por ultimo ser apresentada a acima da anterior; caso as duas sejam apresentadas ao mesmo tempo, a ordem escolhida e pelo formatador (executor).

15

3.4.2

Descritores

Os descritores denem como os elementos sero apresentados nas reas da tela. Para isso, um a a descritor deve indicar a regio ` qual est relacionado e denir especicidades de sua aprea a a sentao. ca Os descritores so denidos no cabealho do documento NCL na base de descritores, elemento a c <descriptorBase> e denido pelo elemento <descriptor>. O exemplo da Figura 3.9 demonstra a criao de dois descritores (dpFundo e dpVideo). ca <descriptor id="dpFundo" region="rgFundo"/> <descriptor id="dpVideo" region="rgVideo"/> Figura 3.9: Criao de dois descritores. ca Note que um descritor tambm dene um identicador unico. Alm disso, um descritor dene e e a regio ` qual este est associado atravs do atributo region. Um descritor no utilizado a a a e a e somente para relacionar um elemento com uma regio da tela. Alm disso, o descritor pode a e ser utilizado para denir como ser feita a navegao pela tela, atravs dos botes do controle a ca e o remoto, bem como mudar a forma como um elemento apresentado, mudando seu tempo de e exibio ou sua caracter ca stica de transparncia. e Um descritor possui os seguintes atributos: id: Identicador do descritor. Este atributo contm um valor unico que ser utilizado em e a referncias ao descritor. e region: Identica a regio ` qual o descritor est relacionado. Caso o elemento no possua a a a a contedo visual, no necessrio denir uma regio. u a e a a explicitDur: Dene a duraao da apresentao do elemento associado ao descritor. Caso c ca uma durao no seja especicada neste atributo, ser considerada a durao padro de ca a a ca a cada elemento. Se o elemento for um texto ou imagem, o tempo padro de apresentao a ca innito. Nos casos onde os elementos possuem uma durao, esta ser considerada sua e ca a durao padro. O valor denido neste atributo deve estar em segundos (considerando a ca a unidade s). focusIndex: Dene um ndice a ser utilizado na navegao entre os elementos apresentaca dos na tela. Se um descritor no denir um a ndice, o elemento a ele associado no receber a a foco na navegao. No in da execuo do documento, o foco passado para o elemento ca cio ca e associado ao descritor de menor ndice. Uma observao a ser feita que o valor do ca e ndice pode no ser numrico, nesse caso ser escolhido o a e a ndice lexicogracamente menor. moveLeft: Dene o descrito, atravs do seu e ndice, que receber foco quando o boto seta a a para esquerdado controle remoto for pressionado. Esse mapeamento s ser realizado o a quando o descritor que o dene estiver com o foco. moveRight: Dene o descritor, atravs do seu e ndice, que receber foco quando o boto a a seta para direitado controle remoto for pressionado. Esse mapeamento s ser realizado o a quando o descritor que o dene estiver com o foco. moveUp: Dene o descritor, atravs do seu e ndice, que receber foco quando o boto a a seta para cimado controle remoto for pressionado. Esse mapeamento s ser realizado o a quando o descritor que o dene estiver com o foco.

16

moveDown: Dene o descritor, atravs do seu e ndice, que receber foco quando o boto a a seta para baixodo controle remoto for pressionado. Esse mapeamento s ser realizado o a quando o descritor que o dene estiver com o foco. focusBorderColor: Dene a cor da borda da regio associada ao descritor quando o a elemento utilizando o descritor recebe foco. O atributo pode assumir um dos seguintes valores: white, black, silver, gray, red, maroon, fuchsia, purple, lime, green, yellow, olive, blue, navy, aqua, ou teal. focusBorderWidth: Dene a espessura da borda apresentada em pixels. A espessura pode assumir valores positivos e negativos. No caso de um valor positivo ser atribu do, a borda ser apresentada fora da regio, caso negativo, a borda ser apresentada dentro da a a a regio. a

3.4.3

Prtica a

Agora que aprendemos como criar regies e descritores, podemos comear a criao da nossa o c ca aplicao NCL. Comearemos denindo as regies e descritores onde sero apresentados os ca c o a seguintes elementos: v deo: v deo principal apresentado durante todo o programa; boto: boto apresentado em alguns momentos. a a A Figura 3.10 demonstra a criao da base de regies, enquanto a Figura 3.11 demonstra a ca o criao da base de descritores. ca <regionBase> <region id="rg_video" left="0" top="0" width="100%" height="100%" zIndex="1"> <region id="rg_button" left="40%" top="40%" width="20%" height="20%" zIndex="3"/> </region> </regionBase> Figura 3.10: Base de regies. o <descriptorBase> <descriptor id="dp_video" region="rg_video"/> <descriptor id="dp_button" region="rg_button" focusIndex="0"/> </descriptorBase> Figura 3.11: Base de descritores.

3.5

Inserindo os elementos

Para que um documento NCL tenha algo a apresentar, necessria a denio dos contedos e a ca u que sero apresentados. Estes contedos so denidos pelas m a u a dias de NCL como veremos a seguir. Os elementos denidos nesta seo pertencem ao corpo do documento NCL. ca

17

Tabela 3.1: MIME Types utilizados por NCL. MIME Type Signicado text/html .htm, .html text/css .css text/xml .xml image/bmp .bmp image/png .png image/gif .gif image/jpeg .jpg audio/basic .wav audio/mp3 .mp3 audio/mp2 .mp2 audio/mpeg4 .mp4, .mpg4 video/mpeg .mpeg, .mpg application/x.lua ginga-NCLua

3.5.1

M dias

Uma m dia, ou seja, a representao do objeto que ser apresentado pelo documento, denida ca a e pelo elemento <media> de NCL. Na Figura 3.12 podemos ver como feita a criao de um elemento <media>. e ca <media id="video" src="video.avi" descriptor="dpVideo"/> Figura 3.12: Criao de um elemento media. ca Uma m dia possui os seguintes atributos: id: Identicador da m dia ser utilizado, assim como os demais identicadores, em rea ferncias a esta m e dia. src: Dene a localizao do contedo objeto de m ca u dia representado (URI). descriptor: Dene o descritor que controla a apresentao da m ca dia. O valor desse atributo dever ser o identicador do descritor. a type: Dene o tipo da m dia (audio, video, text, etc). O valor desse atributo ser um dos a MIME Types denidos pela IANA (Internet Assigned Numbers Authority) [?]. A Tabela 3.1 demonstra os MIME Types utilizados por NCL.

3.5.2

Ancoras

As ncoras denem uma parte do contedo de uma m a u dia. Por parte do contedo de uma m u dia, pode-se entender como um subconjunto dos elementos que compem uma m o dia. Por exemplo, digamos que queremos denir ncoras de um v a deo. Nesse caso o v deo em si seria a m dia enquanto as ncoras seriam trechos desse v a deo. As ncoras so utilizadas para permitir a sincronizao de objetos de m (msicas, v a a ca dia u deos, textos, etc) com outros objetos de m dia. Imagine o exemplo de um lme legendado. Este lme

18

possui diversas cenas, sendo que cada cena possui um dilogo. Neste caso o lme dever possuir a a uma ncora para cada cena, possibilitando assim que as legendas (dilogos) sejam apresentadas a a no tempo correto. Uma ncora denida pelo elemento <area>, sendo este um elemento lho de uma m a e dia. O exemplo da Figura 3.13 demonstra a criao de um v ca deo com ncoras. a <media id="video" src="video.avi" descriptor="dpVideo"> <area id="cena01" begin="2s" end="5s"/> <area id="cena02" begin="5s" end="6s"/> </media> Figura 3.13: Criao de um v ca deo com ncoras. a Uma ncora possui os seguintes atributos: a id: Identicador unico da ncora. Este atributo usado em referncias feitas a este a e e elemento. begin: In cio da ncora. Este atributo usado quando denida uma ncora de um a e e a objeto de m dia cont nuo. O valor desse atributo pode ser no formato segundo.fraoou ca hora:minuto:segundo.frao. ca end: Fim da ncora. Este atributo usado em conjunto com o atributo begin, de forma a e a denir o nal da ncora. Seu valor possui o mesmo formato do atributo begin. Caso a este atributo (end) no seja denido, o nal da ncora considerado como sendo o nal a a e da m dia que a contm. e label: Dene um identicador para a ncora. Um label usado em ncoras de objetos a e a procedurais, podendo ser usado para identicar um conjunto de ncoras, como ser visto a a mas adiante. Uma ncora pode possuir outros atributos a serem usados com outros tipos de m a dias, como m dias no cont a nuas, por exemplo. Por ser esta uma apostila bsica de NCL, esses atributos a no sero apresentados neste texto. a a

3.5.3

Propriedades

As propriedades denem, como o prprio nome indica, uma propriedade de uma m o dia. Uma propriedade usada quando a manipulao de algum atributo de uma m e ca dia necessria. e a Uma propriedade denida pelo elemento <property> sendo este um elemento lho da e m dia. O elemento <property> contm apenas os atributos name e value. e O atributo name indica o nome da propriedade da m dia que ser manipulada. O atributo a value, por sua vez, indica o valor desta propriedade. O exemplo da Figura 3.14 demonstra o uso de propriedades. Note que uma propriedade nem sempre denida com um valor. Outro ponto a se notar e e que, no caso de uma propriedade ser denida com um valor, este ser o valor inicial do referido a atributo.

19

<media id="video" src="video.avi" descriptor="dpVideo"/> <property name="descriptor"/> <property name="explicitDur" value="60s"/> </media> Figura 3.14: Uso de propriedades.

3.5.4

Prtica a

Agora que aprendemos como criar m dias, suas ncoras e propriedades, podemos continuar a a criao da nossa aplicao NCL. Precisamos denir os seguintes elementos: ca ca v deo: v deo principal apresentado durante todo o programa; boto: boto apresentado em alguns momentos; a a contador: responsvel por armazenar o nmero de vezes que o boto foi selecionado. a u a A Figura 3.15 demonstra a criao das m ca dias. <media id="video" <area id="area01" <area id="area02" <area id="area03" <area id="area04" </media> src="video.mpg" type="video/mpeg" descriptor="dp_video"> begin="3s" end="6s"/> begin="10s" end="13s"/> begin="17s" end="20s"/> begin="24s" end="27s"/>

<media id="button" descriptor="dp_button" src="button.jpg" type="image/jpeg"/> <media id="clicks" src="clicks.lua"> <property name="inc"/> <property name="counter"/> </media> Figura 3.15: M dias do documento.

3.6

Organizando o documento

Como visto na seo 3.1.1, o modelo NCM dene, alm de ns de contedo, ns de composio. ca e o u o ca Estes ns so usados para organizar e estruturar um documento seguindo o modelo. Nesta seo o a ca veremos como estruturar um documento NCL usando composies. co

3.6.1

Contexto

Em NCL, um n de composio representado pelo elemento <context>. Este elemento pode o ca e ter outros elementos, inclusive outros contextos, como elementos lhos. Um contexto permanece ativo enquanto um de seus elementos lhos estiver ativo e, caso uma interface espec ca do contexto no seja especicada em um elo, um contexto inicia todos a

20

os seus elementos lhos quanto ele iniciado. A criao de interfaces para contextos ser vista e ca a mais a frente. Um contexto dene tambm um atributo id para identic-lo em relacionamentos que venha e a a participar. O exemplo da Figura 3.16 demonstra a criao de um contexto. ca <context id="context01"> ... elementos ... </context> Figura 3.16: Criao de um contexto. ca

3.6.2

Portas

Uma porta dene uma interface para um contexto. Como o modelo NCM no permite que um a elemento dentro de um contexto seja acessado diretamente de fora do contexto, necessrio o e a uso de portas sempre que tal ao seja necessria. ca a Uma porta contm os seguintes atributos: e id: Identicador unico permitindo que esta seja referenciada por outro elemento do docu mento NCL. component: n componente sendo mapeado pela porta. o interface: Interface do n componente sendo mapeado. Podem ser ncoras ou proprio a edades, caso o elemento mapeado seja uma m dia, ou outras portas, caso o elemento mapeado seja um contexto. O corpo do documento NCL, elemento <body>, considerado um tipo especial de contexto. e Logo o corpo do documento NCL deve conter pelo menos uma porta, mapeando um n denido o dentro dele, para que o documento possa ser apresentado.

3.6.3

Prtica a

Agora que aprendemos como estruturar nosso documento, podemos continuar com nosso aplicativo. Precisamos denir os seguintes elementos: corpo do documento ncl; uma porta para o primeiro elemento a ser apresentado. A Figura 3.17 demonstra a criao dos contextos e suas portas. Os elementos apresentados ca so os mesmos criados na Seo 3.5.4. a ca

3.7

Sincronizando os elementos

At agora aprendemos como criar elementos, organizar o documento NCL e denir quais elemene tos sero exibidos no in do documento. Alm disso, necessitamos denir como os elementos a cio e se relacionam durante a apresentaao e ao receber a interao do usurio. Os conectores e links c ca a so utilizados para esse propsito. a o

21

<body> <port component="video" id="inicio"/> <media id="video" src="video.mpg" type="video/mpeg" descriptor="dp_video"> <area id="area01" begin="3s" end="6s"/> <area id="area02" begin="10s" end="13s"/> <area id="area03" begin="17s" end="20s"/> <area id="area04" begin="24s" end="27s"/> </media> <media id="button" descriptor="dp_button" src="button.jpg" type="image/jpeg"/> <media id="clicks" src="clicks.lua"> <property name="inc"/> <property name="counter"/> </media> </body>

Figura 3.17: Corpo do documento e contexto da tela.

3.7.1

Conectores

Os conectores denem relaes genricas que sero utilizadas pelos elementos de um documento co e a NCL. Durante essa denio no so indicados os participantes de um relacionamento espec ca a a co. Imagine, por exemplo, a relao ensina `. Esta relao dene que algum ensina a algum, ca a ca e e porm no dene que ensina e quem aprende, ou seja, os participantes. e a Um conector denido numa base de conectores, elemento <connectorBase> pelo elemento e <causalConnector>. Este elemento dene uma relao de causa e efeito, como seu prprio nome ca o j indica, atravs de papis de condio e papis de ao. Um papel pode ser compreendido a e e ca e ca como uma interface de um conector e este que indica qual a participao que um n tem na e ca o relao. ca Voltando ao exemplo citado anteriormente, a relao ensina `possui dois papis, o de quem ca a e ensina e o de quem aprende. O exemplo da Figura 3.18 demonstra a criao de um conector. ca <causalConnector id="onBeginStart"> <simpleCondition role="onBegin"/> <simpleAction role="start" max="unbounded" qualifier="par"/> </causalConnector> Figura 3.18: Criao de um conector. ca Pode-se reparar no exemplo acima que a condio dada pelo papel onBegin, indicando ca e que a condio espera pelo in da apresentao de um elemento, enquanto a ao dada pelo ca cio ca ca e papel start, indicando que a apresentao de um elemento ser iniciada. ca a Condioes Simples c O elemento <simpleCondition> dene uma condio que dever ser satisfeita para que o conecca a tor seja ativado. Este elemento dene, atravs do atributo role o nome do papel de condio. e ca NCL possui um conjunto de nomes reservados para papis de condio. Estes nomes identicam e ca uma condio, ou ao, sem a necessidade de mais informaes. Os nomes e seus signicados ca ca co so listados abaixo: a onBegin: E ativado quando a apresentao do elemento ligado a esse papel iniciada. ca e

22

onEnd: E ativado quando a apresentao do elemento ligado a esse papel terminada. ca e onAbort: E ativado quando a apresentao do elemento ligado a esse papel abortado. ca e onPause: E ativado quando a apresentao do elemento ligado a esse papel pausada. ca e onResume: E ativado quando a apresentao do elemento ligado a esse papel retomada ca e aps um pause. o onSelection: E ativado quando uma tecla a ser especicada for pressionada durante a apresentao do elemento ligado a esse papel ou quando a tecla ENTER for pressionada ca enquanto o elemento estiver com foco. onBeginAttribution: E ativado logo antes de um valor ser atribu a uma propriedade do do elemento ligado a esse papel. onEndAttribution: E ativado logo aps um valor ser atribu a uma propriedade do o do elemento ligado a esse papel. Quando a condio onSelection utilizada, torna-se necessrio denir o atributo key do ca e a elemento <simpleCondition>. Este valor indica qual a tecla que dever ser pressionada para que a o conector seja ativado. Os valores poss veis so: 0a 9, Aa Z, *, #, MENU, INFO, a GUIDE, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT, CURSOR_UP, CHANNEL_DOWN, CHANNEL_UP, VOLUME_DOWN, VOLUME_UP, ENTER, RED, GREEN, YELLOW, BLUE, BACK, EXIT, POWER, REWIND, STOP, EJECT, PLAY, RECORDe PAUSE. Este valor pode ser estabelecido com o uso de parmetros do conector como ser visto mais adiante. a a O elemento <simpleCondition> pode denir outros tipos de condies diferentes das condies co co padro apresentadas acima. Esta facilidade, entretanto, no ser apresentada neste texto. a a a Condies Compostas co Alm de uma condio simples, um conector pode denir uma condio composta. Uma condio e ca ca ca composta denida pelo elemento <compoundCondition>. Este elemento possui duas ou mais e condies simples como lhas. Quando utilizado, este elemento deve denir um atributo opeco rator que recebe os valores andou or, indicando se todas ou pelo menos uma condio deve ca ser satisfeita para que o conector seja ativado. Aes Simples co O elemento <simpleAction> dene uma ao a ser executada quando o conector ativado. Este ca e elemento dene, atravs do atributo role o nome do papel de ao. Alm do nome do papel, este e ca e elemento dene atravs do atributo max o nmero mximo de elementos que podero utilizar e u a a este papel. O valor unboundeddene um nmero mximo ilimitado. Caso o atributo max u a seja denido, necessria a denio de outro atributo chamado qualier, este dene se as e a ca aes sero executadas em paralelo ou sequencialmente, valores pare seqrespectivamente. co a NCL tambm possui um conjunto de nomes reservados para papis de ao. Os nomes e e e ca seus signicados so listados abaixo: a start: Inicia a apresentao do elemento ligado a esse papel. ca stop: Termina a apresentao do elemento ligado a esse papel. ca abort: Aborta a apresentao do elemento ligado a esse papel. ca

23

pause: Pausa a apresentao do elemento ligado a esse papel. ca resume: Retoma a apresentao do elemento ligado a esse papel. ca set: Estabelece um valor a uma propriedade de um elemento associado a esse papel. Quando o papel set usado, a condio que o dene deve tambm declarar o atributo e ca e value. Este atributo responsvel por indicar o valor a ser recebido pela propriedade. Este e a valor pode ser estabelecido com o uso de parmetros do conector como ser visto mais adiante. a a O elemento <simpleAction> pode denir outros tipos de aes diferentes das aes padro co co a apresentadas acima. Esta facilidade, entretanto, no ser apresentada neste texto. a a Aes compostas co Alm de uma ao simples, um conector pode denir uma ao composta. Uma ao come ca ca ca posta denida pelo elemento <compoundAction>. Uma ao composta possui outras aes e ca co simples como lhas. Quando utilizado, este elemento deve denir um atributo operator que recebe os valores parou seq, indicando se as aes devero ser executadas em paralelo ou co a sequencialmente. Parmetros a Um conector tambm pode denir parmetros. Esses parmetros so denidos pelo elemento e a a a <connectorParam> e utilizados para que o valor a ser avaliado, ou estabelecido, possa ser indicado no momento do uso do conector. O exemplo da Figura 3.19 ilustra esse conceito. <causalConnector id="onKeySelectionStart"> <connectorParam name="keyCode"/> <simpleCondition role="onSelection" key="$keyCode"/> <simpleAction role="start" max="unbounded" qualifier="par"/> </causalConnector> Figura 3.19: Denio de parmetro em conector. ca a Note que o parmetro dene apenas o seu nome, deixando a denio do seu valor para a ca o momento do seu uso. Os locais onde o valor desse parmetro for utilizado indicam esta a funcionalidade atravs do valor $nome_do_par^metro. e a

3.7.2

Elos

Um elo utilizado para identicar os elementos participantes de uma relao. Seguindo o e ca exemplo de relao ensina `apresentada na seo anterior, um elo que utilizasse essa relao ca a ca ca identicaria os elementos professore aluno. O relacionamento completo, especicado pelo elo, caria ento o professor ensina ao aluno. a Um elo denido pelo elemento <link>. Este elemento dene a relao sendo utilizada e ca atravs do seu atributo xconnector. e Para a criao de ligaes entre os elementos e os papis, um elo dene elementos lhos ca co e <bind>. Um <bind> dene os atributos: role: Identica o papel sendo utilizado.

24

component: Identica, atravs do seu id, o elemento participando da relao. e ca interface: Identica uma ncora ou propriedade do elemento, caso este seja uma m a dia, ou uma porta de um elemento, caso este seja uma composio, atravs do seu id. ca e O exemplo da Figura 3.20 demonstra a criao de um elo. ca <link id="link1" xconnector="onKeySelectionStart"> <bind component="video" role="onSelection"> <bindParam name="keyCode" value="YELLOW"/> </bind> <bind component="bkg" role="start"/> <bind component="screen" role="start"/> </link> Figura 3.20: Criao de elo. ca No exemplo acima podemos notar a existncia do elemento <bindParam>. Este elemento e utilizado em casos onde a passagem de parmetros necessria. Este elemento dene os e a e a atributos name e value, onde o primeiro identica o parmetro e o segundo o seu valor. a

3.7.3

Prtica a

Agora que aprendemos como criar relacionamentos em nosso documento, podemos continuar a criao do nosso programa. Precisamos denir as seguintes relaes: ca co quando um elemento comear, comear outro elemento; c c quando um elemento terminar, terminar outro elemento; quando um elemento for selecionado, denir o valor de um outro elemento. e os elos que utilizam essas relaes (conectores). co A Figura 3.21 demonstra a criao dos conectores que sero usados pelo documento NCL. ca a Enquanto a Figura 3.22 demonstra a utilizao dos mesmos. ca

25

<causalConnector id="onBeginStart"> <simpleCondition role="onBegin"/> <simpleAction role="start"/> </causalConnector> <causalConnector id="onEndStop"> <simpleCondition role="onEnd"/> <simpleAction role="stop" max="unbounded"/> </causalConnector> <causalConnector id="onSelectionSet"> <simpleCondition role="onSelection"/> <connectorParam name="var"/> <simpleAction role="set" value="$var"/> </causalConnector> Figura 3.21: Conectores da base de conectores.

26

<link xconnector="onBeginStart"> <bind role="onBegin" component="video"/> <bind role="start" component="clicks"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area01"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area02"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area03"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area04"/> <bind role="start" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area01"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area02"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area03"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area04"/> <bind role="stop" component="button"/> </link> <link xconnector="onSelectionStopSet"> <bind role="onSelection" component="button"/> <bind role="set" component="clicks" interface="inc"> <bindParam name="var" value="1"/> </bind> </link> Figura 3.22: Links utilizados no programa.

27

Tabela 3.2: Comparadores utilizados em regras NCL. eq igual a ne diferente de gt maior que ge maior ou igual a lt menor que le menor ou igual a

3.8

Denindo alternativas

At agora, vimos como criar um programa NCL, denindo como seus elementos sero apresene a tados, que elementos sero apresentados e a ordem em que sero apresentados. A este tipo de a a ordem de apresentao podemos chamar de uxo temporal do programa NCL. ca Alm das facilidades apresentadas, NCL tambm permite que um programa possa ter seu e e uxo temporal modicado durante sua apresentao. Essa modicao feita atravs da deca ca e e nio de alternativas de contedo. Uma alternativa dene, para um determinado momento da ca u apresentao do programa NCL, poss ca veis caminhos a serem seguidos. A escolha de um caminho dada pela avaliao de condies, chamadas regras. e ca co

3.8.1

Regras

As regras representam condies que podem ser usadas em um documento NCL. Uma regra, co basicamente, compara uma propriedade de um elemento NCL com um valor, retornando o resultado dessa comparao. Uma regra denida pelo elemento <rule>. ca e Uma regra dene os seguintes atributos: id: Identicador da regra, referenciado quando o uso da mesma for necessrio; e a var: Indica que propriedade estar sendo testada. O valor desse atributo ser o identia a cador de uma propriedade; comparator: Indica que tipo de comparao ser feita pela regra; ca a value: Indica o valor que ser comparado com a propriedade. a A Tabela 3.2 demonstra os poss veis comparadores utilizados em uma regra. O exemplo da Figura 3.23 demonstra a criao de uma regra. ca <rule id="rule_pt" var="idioma" comparator="eq" value="pt"/> Figura 3.23: Criao de uma regra. ca Uma regra denida na base de regras, representada pelo elemento <ruleBase>, no cabealho e c do documento NCL.

3.8.2

Switch

Um switch um elemento que apresenta as alternativas de contedo que um programa NCL pode e u tomar em um determinado momento. Este elemento avalia uma srie de regras e, dependendo e da regra avaliada verdadeira, ativa um dos elementos denidos dentro dele.

28

Um switch ativado da mesma forma como um elemento qualquer de NCL, seu identicador e pode ser utilizado em elos tornando poss que este seja ativado, parado ou mesmo participe vel de alguma condio de disparo. O exemplo da Figura 3.24 demonstra a criao de um switch. ca ca <switch id="escolhe_audio"> <bindRule rule="rule_en" constituent="audio_en"/> <bindRule rule="rule_pt" constituent="audio_pt"/> <media id="audio_en" ... /> <media id="audio_pt" ... /> </switch> Figura 3.24: Criao de um switch. ca Para que um switch escolha um elemento para ser apresentado, necessria a denio e a ca de mapeamentos. Esses mapeamentos so denidos pelo elemento <bindRule> como visto no a exemplo acima. Um mapeamento dene a regra que deve ser avaliada e, caso esta seja verdadeira, o elemento que dever ser ativado. a Vale ressaltar, que as regras so avaliadas de forma sequencial, sendo a primeira regra a avaliada como verdadeira a que ir denir qual elemento ser apresentado. Com isso, mesmo a a que mais de uma regra seja verdadeira em um determinado momento, somente um elemento ser exibido. a Caso um switch possua elementos do tipo context, necessrio tambm se indicar a porta e a e de destino de cada mapeamento. Essa indicao feita pelo elemento <switchPort> como ca e mostrado no exemplo da Figura 3.25. <switch id="escolhe_audio"> <switchPort id="mapeamento"> <mapping component="context_en" interface="port_en" /> <mapping component="context_pt" interface="port_pt" /> </switchPort> <bindRule rule="rule_en" constituent="context_en" /> <bindRule rule="rule_pt" constituent="context_pt" /> <context id="context_en"> <port id="port_en" ... /> ... </context> <context id="context_pt"> <port id="port_pt" ... /> ... </context> </switch> Figura 3.25: Porta em switch.

29

Referncias e
[1] Soares, L.F.G., Barbosa, S.D.J. Programando em NCL: desenvolvimento de aplicaes para co middleware Ginga, TV digital e Web. Editora Elsevier. Rio de Janeiro, 2009. ISBN 978-85352-3457-2. [2] W3C World-Wide Web Consortium. XML Schema Part 0: Primer Second Edition. W3C Recommendation. 2004. (http://www.w3.org/TR/xmlschema-0/). [3] Soares L.F.G, Rodrigues R.F. Nested Context Model 3.0: Part 1 NCM Core. Technical Report, Departamento de Informtica PUC-Rio. 2005. a [4] W3C World-Wide Web Consortium. (http://www.w3.org/)

30

Cap tulo 4

Linguagem Lua
4.1
4.1.1

Introduo ca
Pequeno histrico o

A linguagem Lua [1] foi criada em 1993 dentro do Tecgraf [2] na PUC-Rio pelos professores Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes. Um dos grandes parceiros do Tecgraf era a Petrobras, que demandava por programas para engenharia com interao grca. Em 1993 foram desenvolvidas duas linguagens para atender ca a essa demanda, estas linguagens foram batizadas de DEL, coordenada pelo professor Luiz, e SOL, coordenada pelo professor Roberto. Em meados de 1993, os professores Roberto, Luiz e Waldemar se reuniram para discutir SOL e DEL e conclu ram que as duas linguagens poderiam ser substitu das por apenas uma. Assim nasceu a equipe dos desenvolvedores de Lua. Lua foi parcialmente inspirada em SOL, por isso um amigo do Tecgraf, Carlos Henrique Levy, sugeriu o nome Lua. Assim nasceu Lua.

4.1.2

Convenoes Lxicas c e

Na linguagem Lua, nomes - ou identicadores - podem ser qualquer cadeia de letras, d gitos e sublinhados, porm no podem comear com um d e a c gito. Os identicadores so utilizados para a nomear funes, variveis e campos de tabelas. co a Algumas palavras so reservadas e no podem ser utilizadas como nomes. A Figura 4.1 a a mostra a lista das palavras reservadas pela linguagem. and end in repeat break false local return do for nil then else function not true elseif if or until

while

Figura 4.1: Palavras reservadas. Lua diferencia maisculas de minsculas. Portanto for ser interpretado diferente de For ou u u a fOr ou foR ou FOR ou FOr ou FoR. Uma string (cadeia de caracteres) pode ser delimitada com o uso de aspas simples ou aspas duplas e podem conter sequncias de escape no estilo de C. A Figura 4.2 exibe uma lista com e os caracteres de escape:

31

\a \b \f \n \r \t \v \\ \" \

(campainha) (backspace) (alimenta~o de formulrio) ca a (quebra de linha) (retorno de carro) (tabula~o horizontal) ca (tabula~o vertical) ca (barra invertida) (cita~o [aspa dupla]) ca (apstrofo [aspa simples]) o Figura 4.2: Caracteres de escape.

4.1.3

O interpretador de linha de comando

Apesar de Lua ter sido originalmente projetada como uma linguagem de extenso, ela frea e quentemente utilizada como linguagem principal. Um interpretador para Lua, chamado lua, e disponibilizado com a distribuio padro da linguagem. O interpretador inclui todas as biblica a otecas padro. a A sintaxe para uso : lua [options] [script [args]]. e As opes so: co a -e stat: executa a cadeia stat; -l mod : requisitamod; -i: entra em modo interativo aps executar script; o -v: imprime informao de verso; ca a : pra de tratar opes; a co -: executa stdin como um arquivo e pra de tratar opes. a co Aps tratar as opes passadas, lua executa o script fornecido, passando para ele os arguo co mentos. Quando chamado sem argumentos, lua comporta-se como lua -v -i, entrando no modo e interativo. Na Figura 4.3 poss observar a tela do interpretador lua em modo interativo. e vel Em sistemas Unix, scripts Lua podem ser usados como programas executveis. Para isso a basta inserir na primeira linha do script uma chamada com o caminho para o interpretador lua, como pode-se observar na Figura 4.4. Para tornar o script executvel: chmod +x nome-do-script.lua a

4.1.4

Prtica a

Vamos iniciar nossa aventura pelo mundo da Lua. Primeiro iremos instalar o interpretador Lua. Se voc j tem o interpretador instalado em e a seu computador, sinta-se livre para pular esta parte. Alguns sistemas Unix-like disponibilizam pacotes pr-compilados do interpretador. Em sise temas Debian-like, com os repositrios atualizados, digite: aptitude search lua para vericar o se existe um pacote do interpretador Lua dispon vel. Para instalar: aptitude install nome-do-pacote-lua.

32

Figura 4.3: Interpretador Lua em modo interativo. #!/usr/local/bin/lua Figura 4.4: Chamada com caminho do interpretador Lua. Para instalar no Slackware, entre no site http://www.linuxpackages.net e procure pelo pacote mais adequado para sua verso. Voc pode baixar a verso mais nova diretamente deste link: a e a
http://mirror.slackwarebrasil.org/linuxpackages//Slackware/Slackware-12.1/Library/Lua/lua-5.1.4-i486-1gds.tgz

Para instalar, logado como root, digite: installpkg nome-do-pacote-lua.tgz. Aps instalar o interpretador Lua, abra o terminal e digite: lua. o Se tudo ocorreu bem, voc entrar no modo interativo do interpretador. A tela ser semee a a lhante a da Figura 4.3. Usurios do Microsoft Windows, no desanimem! Existe esperana para os que ainda no a a c a alcanaram a luz! O interpretador Lua tambm foi portado para esse sistema. Maiores inc e formaes podem ser encontradas neste site: http://luaforwindows.luaforge.net. co

4.2

Tipos e variveis a

Para uma melhor compreenso desta seo, segue uma denio formal para o termo varivel : a ca ca a Varivel um objeto (uma posio, frequentemente localizada na memria) capaz a e ca o de reter e representar um valor ou expresso. Enquanto as variveis s existemem a a o tempo de execuo, elas so associadas a nomes, chamados identicadores, durante ca a o tempo de desenvolvimento. Quando nos referimos ` varivel, do ponto de vista da programao de computaa a ca dores, estamos tratando de uma regio de memria (do computador) previamente a o identicada cuja nalidade armazenar os dados ou informaes de um programa e co por um determinado espao de tempo. c

33

4.2.1

Tipos

Lua uma linguagem de tipagem dinmica. Isso signica que no necessrio declarar o tipo e a a e a de uma varivel; ele determinado dinamicamente dependendo do valor que a varivel est a e a a armazenando. Existem oito tipos bsicos em Lua: nil, boolean, number, string, userdata, function, thread, a e table. Observe a Figura 4.5. print(type("Hello world")) print(type(10.4*3)) print(type(print)) print(type(type)) print(type(true)) print(type(nil)) print(type(type(X))) --> --> --> --> --> --> --> string number function function boolean nil string

Figura 4.5: Tipos. A funo print imprime, a princ ca pio, um conjunto de caracteres na tela. A funo type retorna uma string com o nome do tipo do valor recebido. Repare que, na ca ultima linha, a sa da funo print uma string; isso no causado pelo valor de X, mas da ca e a e sim porque a funo type retorna uma string. ca nil : utilizado para indicar a ausncia de um valor; se uma varivel for criada e nenhum e e a valor for atribu do, seu valor ser igual a nil, por exemplo; a boolean: representa os valores booleanos true e false. Se uma expresso for igual a nil ou a false ser considerada falsa, sendo verdadeira caso contrrio (inclusive quando ela for 0); a a number : Lua possui apenas um tipo numrico bsico, number, que ponto utuante por e a e padro; a string: representa cadeias de caracteres, que podem ser delimitadas por aspas duplas ou simples. Se desejar escrever uma cadeia que se estende por vrias linhas, deve-se usar a a notao [[ para abrir a cadeia e ]] para fechar a cadeia; ca userdata: usado para armazenar dados C em variveis Lua. Valores deste tipo somente e a podem ser criados ou modicados atravs da API de Lua com C. Nesta apostila no e a abordaremos a API de Lua com C, se desejar obter maiores informaes sobre esse assunto: co google is your friend ; function: tipo que representa funes. Em Lua, funes so valores de primeira classe, co co a isso signica que um valor do tipo funo no requer nenhum tratamento especial. Assim, ca a a mesma varivel pode ser utilizada para armazenar um valor numrico ou uma funo; a e ca thread : representam uxos de execuo independentes. O tipo thread d suporte ao uso ca a de co-rotinas. O uso de co-rotinas no ser abordado nesta verso da apostila; a a a table: representa uma tabela Lua. Tabelas so o unico mecanismo de estruturao de a ca dados de Lua. Com tabelas podemos representar arrays, tabelas de s mbolos, conjuntos, grafos, registros, etc;

34

4.2.2

Variveis a

Para declarar uma varivel basta escrever seu nome. Em Lua os nomes de variveis devem a a comear com letras ou sublinhado. c Para atribuir um valor a uma varivel, utiliza-se o operador de atribuio =. Operadores a ca sero melhor estudados na seo 4.3. Um pequeno exemplo pode ser visto na Figura 4.6. a ca a = 10 -- a declarada e recebe o valor 10. e b, c = "oi", 20 -- b recebe a string "oi" e c recebe 20. d -- o valor de d nil e print(b,d) --> oi nil Figura 4.6: Exemplo de atribuio. ca Numa operao de atribuio, os valores do lado direito so avaliados e, posteriormente, ca ca a atribu dos `s variveis do lado esquerdo. E poss efetuar atribuio de mais de um valor para a a vel ca mais de uma varivel com um unico comando, como visto na Figura 4.7. a a, b = "ol", "lua" a print(a, b) --> oi lua

Figura 4.7: Mais um exemplo de atribuio. ca Se existirem mais valores do que variveis, os valores extra so descartados. Caso contrrio, a a a as variveis extras recebem nil. a a, b = "ol", "mundo", "da lua" a print(a, b) --> ol mundo a a, b, c = "ol", "mundo" a print(a, b, c) --> ol mundo a

nil

Em Lua as variveis, por padro, so consideradas globais. Para restringirmos o escopo de a a a uma varivel precisamos utilizar a palavra chave local, sendo que o escopo de uma varivel local a a determinado pelo bloco de cdigo onde ela foi declarada. e o Se uma varivel declarada como local fora de qualquer bloco de cdigo, ela ser vis em a e o a vel todo o arquivo. Blocos de cdigo sero abordados na seo 4.4. o a ca

4.2.3

Prtica a

Vamos trabalhar um pouco nossos conhecimentos sobre variveis. a Abra o terminal e execute o interpretador lua em modo interativo. Em seguida execute alguns exemplos que foram dados nesta seo, sua sa dever ser semelhante a da Figura 4.8. ca da a Reparem na mensagem de erro: stdin:1: = expected near lua. Ela causada, propositalmente, por no fecharmos, com aspas dupla, a declarao da string e a ca ol. a Ao apertar o cursor para cima o interpretador lua exibe os comandos que foram digitados, assim como o shell do Linux. Portanto para corrigir este erro, basta retornar para o comando que o causou e fechar a declarao da string. ca

35

Figura 4.8: Sa esperada para os exemplos. da

4.3
4.3.1

Operadores
Aritimticos e

Lua oferece suporte para os operadores aritmticos mais utilizados: e + Adio; ca - subtrao; ca * multip co; licaa / diviso; a ^ exponenciao; ca - negao. ca Na Figura 4.9 poss observar o uso de alguns destes operadores. e vel Se deseja obter maiores informaes sobre operaes matemticas com Lua, consulte o maco co a nual de referncia em: e
http://www.lua.org/manual/5.1/pt/

4.3.2

Relacionais

Lua suporta os seguintes operadores relacionais: < Menor que;

36

a = 5 + 2 print(a) a = 5 - 2 print(a) b = 3 * 2 print(b) b = 6 / 2 print(b) c = 2^(2) print(c) d = 4 * -3 print(d)

--> 7

--> 3

--> 6

--> 3

--> 4

--> -12 Figura 4.9: Operadores.

> maior que; <= menor ou igual a; >= maior ou igual a; == igual a; ~= negao da igualdade (diferente). ca Os operadores relacionais sempre retornam true ou false. Lua compara os tipos table, userdata e function por referncia. Dois valores sero considee a rados iguais apenas se forem exatamente o mesmo objeto. Aps a execuo deste cdigo: o ca o a = {}; a.x = 1; a.y = 0 b = {}; b.x = 1; b.y = 0 c = a Temos a igual a c, porm diferente de b. e

4.3.3

Lgicos o

Os operadores lgicos so: o a and; or; not.

37

Em Lua os operadores lgicos consideram false e nil como falso e qualquer outra coisa como o verdadeiro. O operador and retorna o primeiro argumento se ele for falso, caso contrrio retorna o a segundo. O operador or retorna o primeiro argumento se ele no for falso, caso contrrio a a retorna o segundo argumento. Os dois operadores s avaliam o segundo argumento quando o necessrio. a Para um melhor entendimento observe o exemplo abaixo: print(2 and 3) print(nil and 1) print(false and 1) print(2 or 3) print(false or 3) --> 3 --> nil --> false --> 3 --> 3

O operador not retorna true ou false: print(not print(not print(not print(not nil) false) 0) not nil) --> --> --> --> true true false false

4.3.4

Concatenao ca

Lua permite concatenao de strings e para isso disponibiliza o operador .. (dois pontos seguica dos). Se na operao de concatenao um dos operandos for um nmero, este ser convertido ca ca u a para string. A operao de concatenao cria uma nova string, sem alterar os operandos originais. ca ca Exemplo: print("Ol " .. "mundo " .. "da Lua.") a a = 0 .. 1 print(type(a)) a = "Ol" a print(a .. " mundo da Lua.") print(a) --> Ol mundo da Lua. a --> string

--> Ol mundo da Lua. a --> Ol a

4.3.5

Prtica a

Para xao dos conceitos apresentados nesta seo iremos escrever um cdigo Lua para calcular ca ca o a mdia ponderada entre dois valores. e Vamos construir nosso primeiro script Lua. Escolha seu editor de textos preferido (sugestes: o gedit ou Vim) e digite o cdigo apresentado na Figura 4.10. o Agora salve com um nome espec co (por exemplo: script.lua). Torne seu script executvel: chmod +x script.lua a Para ver o resultado entre no diretrio onde salvou seu script e digite:./script.lua. o

38

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

#!/usr/bin/lua print("\n\n") print("Digite o primeiro valor:") valor1 = io.stdin:read*l print("Digite o peso:") peso_valor1 = io.stdin:read*l print("Digite o segundo valor:") valor2 = io.stdin:read*l print("Digite o peso:") peso_valor2 = io.stdin:read*l media = ((valor1 * peso_valor1) + (valor2 * peso_valor2)) media = media / (peso_valor1 + peso_valor2) print("A media ponderada eh: " .. media .. "\n\n")

Figura 4.10: Mo na massa. a Repare que na linha 6 utilizamos uma funo da biblioteca de E/S padro de Lua. Para ca a maiores detalhes consulte o manual de referncia [3]. e Outra observao importante que nosso script no valida os dados digitados, logo um ca e a usurio desavisado poderia no digitar um nmero ou mesmo digitar uma string, isso faria seu a a u programa quebrar.

4.4

Estruturas de controle

Em Lua pode-se utilizar um conjunto, no to extenso porm suciente, de estruturas de cona a e trole. if e/ou else para condicionais e while, repeat e for para interao. ca Todo bloco de cdigo de uma estrutura de controle deve ter um terminador expl o cito. Para if, for, e while o terminador o end; para o repeat o terminador o until. e e

4.4.1

if then else

A estrutura if testa se uma condio verdadeira ou falsa. Se a condio for verdadeira a parte ca e ca then executada, seno else executada. A parte else opcional. e a e e Veja alguns exemplos na Figura 4.11. if a < 6 then a = 0 end if a < b then return a else return b end if line > MAXLINES then showpage() line = 0 end Figura 4.11: Exemplo de estrutura de controle.

39

Em Lua no existe a estrutura switch-case. Se voc deseja construir uma estrutura de a e if s aninhados poder utilizar elseif que similar a um else seguido por um if. Veja alguns a e exemplos: if casa == "azul" then dono = "jose" elseif casa == "verde" then dono = "manoel" elseif casa == "amarela" then dono = "maria" elseif casa == "vermelha" then dono = "madalena" else error("Casa sem dono") end

4.4.2

while

O while uma das estruturas de repetio de Lua. Primeiramente a condio testada, se e ca ca e for falsa no entra no loop; caso contrrio, Lua executa o bloco do loop e avalia novamente a a a condio. ca Segue um exemplo: local i = 1 while a[i] do print(a[i]) i = i + 1 end

4.4.3

repeat

A estrutura repeat-until repete o que est em seu bloco de cdigo at a condio (testada pelo a o e ca until) ser verdadeira. O exemplo abaixo escreve na tela a primeira linha no-vazia. a repeat line = os.read() until line ~= "" print(line) Repare que a condio s testada no nal da estrutura, portanto o bloco de cdigo sempre ca o e o e executado ao menos uma vez.

4.4.4

for numrico e

Essa estrutura poderia ser conhecida como o for tradicional, quem j programou em C ou Java, a por exemplo, observar que sua sintaxe bem familiar. a e

40

for var=exp1,exp2,exp3 do bloco de cdigo o end

Temos que exp1 o valor inicial de var. O bloco de cdigo ser executado enquanto var e o a for menor ou igual exp2, no caso de um passo positivo, ou maior ou igual a exp2, no caso de um passo negativo. A exp3 representa o passo do lao (valor incrementado), quando no c a e especicada assume-se que seu valor 1. Observe alguns exemplos: e for i=1,f(x) do print(i) end for i=10,1,-1 do print(i) end

A varivel var (no exemplo acima i ) vis apenas no corpo da estrutura e no deve ser a e vel a alterada. Um erro t pico presumir que a varivel var existir depois que o loop terminar. e a a for i=1,100 do print(i) end test = i -- errado! i aqui global e

A construo correta deveria ser como a apresentada na Figura 4.12. ca -- encontrar um valor em uma lista local found = nil for i=1,a.n do if a[i] == value then found = i -- salvar o indice do valor (i) break end end print(found) Figura 4.12: for numrico: construo correta. e ca

4.4.5

for genrico e

O for genrico utilizado para percorrer os valores retornados por uma funo iteradora. Os e e ca principais iteradores oferecidos por Lua so: a pairs: percorre as chaves de uma tabela; ipairs: percorre os ndices de um array; io.lines: percorre as linhas de um arquivo; string.gnd : percorre palavras de uma string; Ainda poss escrevermos nossos prprios iteradores, porm isso no ser abordado nesta e vel o e a a apostila.

41

No exemplo da Figura 4.13 a um array. Para imprimirmos todos os seus valores podemos e utilizar um iterador. for i, v in ipairs (a) do print (v) end -- i armazena o ndice, v o valor

Figura 4.13: for genrico: exemplo. e Para imprimir todas as chaves de uma tabela t (em qualquer ordem), podemos proceder como exibido na Figura 4.14. for k, v in pairs (t) do print (k, v) end -- k armazena a chave, v o valor

Figura 4.14: for genrico: mais um exemplo. e

4.5

Saindo de um bloco

Para sair de um bloco de programas podemos utilizar os comandos break e return. O comando break muito utilizado em estruturas de controle, pois permite terminar e execuo da e ca estrutura. Com o comando return poss retornar valores de uma funo ou simplesmente terminar e vel ca sua execuo. Funes sero abordadas na Seo 4.6. ca co a ca Na utilizao destes comandos deve-se atentar para o fato de que eles devem ser os ultimos ca comandos do bloco de cdigo. Observe o exemplo da Figura 4.15. o i = 5 while i < 10 do break i = i + 1 end

-- Erro!

Figura 4.15: Exemplo de sa de bloco. da O cdigo da Figura 4.15 no ser executado corretamente. Existem duas formas para soluo a a cionar este problema. Podemos reordenar o cdigo, para deixar o comando break ou return o como ultimo comando do bloco, ou criar um novo bloco do-end ao redor do comando. Na Figura 4.16 pode-se observar um exemplo com a segunda abordagem.

4.6

Funes co

Segue uma pequena denio. ca Em cincia da computao, mais especicamente no contexto da programao, e ca ca uma funo (subrotina, procedimento ou mesmo subprograma) consiste numa poro ca ca

42

i = 5 while i < 10 do do break -- Ok! break como ltimo comando do bloco u end i = i + 1 -- Atribui~o como ltimo comando do bloco while ca u end Figura 4.16: Correo do exemplo de sa de bloco. ca da de cdigo que resolve um problema muito espec o co, parte de um problema maior (a aplicao nal). [4] ca Em Lua as funes so o principal mecanismo para abstrao e expresso. Podem executar co a ca a tanto uma tarefa (conhecido como procedimento ou subrotina) como computar e retornar valores.

4.6.1

Declarao e execuo ca ca

Uma funo pode ser declarada da forma mostrada na Figura 4.17. ca function nome_da_funcao (arg_1, arg_2, ..., arg_n) corpo_da_funcao end Figura 4.17: Declarao de funo. ca ca As variveis arg-N so os parmetros da funo. Em Lua uma funo pode ter mltiplos a a a ca ca u argumentos, assim como pode no ter nenhum. a Como exemplo (Figura 4.18), vamos denir uma funo que recebe dois parmetros e retorna ca a a soma deles. function soma (a, b) local x = a or 1 local y = b or 1 return x + y end -- x = 1 se a falso e -- y = 1 se b falso e

Figura 4.18: Funes: exemplo 1. co Repare que existe uma falha nesta funo. Sabe a resposta? Continue no caminho da luz... ca A funo soma possui dois parmetros, porm poss cham-la com um nmero diferente ca a e e vel a u de parmetros. Se chamarmos a funo soma com mais parmetros do que ele espera, os valores a ca a extras sero descartados. Se a funo for chamada com um nmero menor de parmetros, o a ca u a valor dos parmetros que no foram fornecidos ser nil. Observe o exemplo da Figura 4.19. a a a

4.6.2

N mero varivel de argumentos u a

Lua permite a declarao de funes com um nmero varivel de argumentos. Para isso basta ca co u a utilizar trs pontos (...) como argumento da funo. e ca

43

s = soma(2, 3) print(s) s = soma(2) print(s)

-- a = 2, b = 3 --> 5 -- a = 2, b = nil, y = 1 --> 3 Figura 4.19: Funes: exemplo 2. co

Para acessar os argumentos que foram passados, utilizamos a notao ..., para criar um ca array onde o primeiro argumento da funo est na posio 1, o segundo na posio 2 e assim ca a ca ca consecutivamente. Observe o exemplo (Figura 4.20) que mostra uma funo que recebe uma ca string e imprime aquelas com tamanho maior que 4. function maior_que_4 (...) for i, t in ipairs {...} do -- percorre a lista de argumentos if #t > 4 then -- # o operador de tamanho para cadeia de arrays e print (t) end end end maior_que_4 ("abobora", "sol", "lua", "balao") -- Imprime "abobora" e "balao" Figura 4.20: Funes: exemplo 3. co

4.6.3

Retorno

Uma funo pode no retornar nenhum valor, retornar apenas um valor ou retornar mltiplos ca a u valores. Contudo, nem sempre poss obter todos os valores retornados por uma funo. e vel ca Para um melhor entendimento, observe a funo da Figura 4.21. ca function soma_multiplica (a, b) local x = a or 1 -- x = 1 se a falso e local y = b or 1 -- y = 1 se b falso e return x + y, x * y end Figura 4.21: Exemplo de retorno em funo. a

4.6.4

Prtica a

Vamos criar uma funo para testar se uma varivel do tipo string. ca a e Se o valor recebido for do tipo desejado ela deve retornar true, seno retorna false. a A denio da funo pode ser vista na Figura 4.22. ca ca Essa funo pode ser utilizada em outra parte de seu programa, como mostrado na gura ca 4.23.

44

function verifica_string(var) if (type(var) == "string") then return true else return false end end Figura 4.22: Prtica: denio da funo. a ca ca ... if(verifica_string(teste)) then print "A variavel teste eh do tipo string" else print "A variavel teste NAO eh do tipo string" end ... Figura 4.23: Prtica: programa utilizando funo. a ca

4.7

Tabelas

Em Lua, tabelas so o unico mecanismo de estrutura de dados existente. Elas implementam a arrays, matrizes, conjuntos e diversas outras estruturas. Nesta apostila no exploraremos toda a a potencialidade das tabelas. Para maiores detalhes, consulte o manual [3].

4.7.1

Criao de tabelas ca

Tabelas so criadas utilizando o construtor {} e podem ser criadas de vrias formas diferentes. a a Para criar um tabela vazia basta fazer: tabela = {}. Pode-se tambm criar a tabela j iniciando alguns valores, como pode ser visto na Figura e a 4.24. tabela = {"semana","engenharia",2009} Figura 4.24: Criando tabela com valores. Com a execuo do cdigo da Figura 4.24, tabela[1] ter a string semana, tabela[2] a string ca o a engenhariae tabela[3] o valor 2009. Uma outra forma de inicializar tabelas como array, neste caso devemos informar o valor e e a chave. A Figura 4.25 exemplica este uso. tabela = {p="semana",e="engenharia",t=2009,a="UFF"} print(tabela["e"], tabela.t) --> engenharia 2009 Figura 4.25: Criando tabela como array.

45

Aps a execuo do cdigo appresentado na Figura 4.25, a tabela tabela possui quatro chaves. o ca o Para inserir um novo valor nesta tabela, basta fazer uma nova atrubuio: tabela.cinco = "peta5". ca Ainda podemos inserir valores em uma tabela utilizando a funo table.insert. Para maiores ca detalhes sobre a funo table.insert consulte o manual [3]. ca Uma tabela tambm pode conter outras tabelas. A Figura 4.26 exeplica este uso. e tabela = {peta={cinco=5}} print (tabela.peta.cinco) --> 5 Figura 4.26: Criando tabela que contm outra tabela. e

4.7.2

Tamanho de tabelas

E poss saber o tamanho de uma tabela, que est sendo utilizada como array, utilizando o vel a operador #. Este operador retorna um ndice n do array onde o valor da posio n diferente de nil e o ca e valor da posio n + 1 nil. Evite o uso deste operador em arrays que possam conter valores ca e nil no meio deles. E poss ver um exemplo de uso do operador # na Figura 4.27. vel tabela = {p="semana",e="engenharia",t=2009,a="UFF"} print(#tabela) --> 4 table.insert(tabela,"cinco") print(#tabela) --> 5 Figura 4.27: Exemplo de uso do operador #.

4.7.3

Prtica a

Nosso objetivo nesta prtica criar uma funo que testa alguns valores de uma determinada a e ca tabela. Isso ser muito utilizado no restante da apostila. a Primeiro vamos criar nossa tabela (Figura 4.28). event = {} event.post = { class = ncl, type = attribution, property = myProp, action = start, value = 10 } Figura 4.28: Prtica: criao da tabela. a ca Agora criaremos a funo que receber nossa tabela e testar os valores de alguns campos. ca a a Pode ser visto na Figura 4.29.

46

function handler(evt) if evt.class ~= ncl then return end if evt.type ~= attribution then return end if evt.property ~= myProp then return end print("Acao: ", evt.action) print("Valor: ", evt.value) return end Figura 4.29: Prtica: criao da funo que testar a tabela. a ca ca a Na funo apresentada na Figura 4.29 os campos class, type e property so testados. Se no ca a a contiverem os valores desejados, a funo nalizada. Se os valores desejados forem encontrados, ca e imprime o contedo dos campos action e value. u A Figura 4.30 exibe o cdigo completo. o --tabela event = {} event.post = { class = ncl, type = attribution, property = myProp, action = start, value = 10 } --funcao verificadora function handler(evt) if evt.class ~= ncl then return end if evt.type ~= attribution then return end if evt.property ~= myProp then return end print("Acao: ", evt.action) print("Valor: ", evt.value) return end --uso da funcao handler(event)

--> start

10

Figura 4.30: Prtica: cdigo completo. a o O cdigo da Figura 4.30 pode parecer no ter muito sentido neste momento. Nas prximas o a o sees ele car mais claro. co a

47

Referncias e
[1] R. Ierusalimschy, L. H. de Figueiredo, W. Celes. The evolution of Lua. Proceedings of ACM HOPL III (2007) 2-12-26. [2] Grupo de Tecnologia em Computao Grca. http://www.tecgraf.puc-rio.br/ ca a [3] Manual de Referncia de Lua 5.1. http://www.lua.org/manual/5.1/pt/ e [4] Wikipdia. http://pt.wikipedia.org/wiki/Subrotina e

48

Cap tulo 5

Integrao NCL-Lua ca
5.1 Introduo ca

A importncia da integrao entre as linguagens NCL e Lua [1] se deve principalmente ao fato a ca de NCL se tratar de uma linguagem declarativa, pecando, portanto, pela falta de um maior controle das informaes processadas, o que j no acontece com uma linguagem procedural co a a como Lua. Por exemplo, no de fcil implementao permitir a entrada de dados por parte a e a ca do telespectador utilizando apenas NCL. Este cap tulo descreve como feita essa integrao, a e ca qual permite um aumento do potencial dos programas para a televiso digital. a

5.2

Scripts NCLua

Os scripts NCLua usam a mesma abstrao para objetos de m utilizada para imagens, v ca dia deos e outras m dias. Em outras palavras, um documento NCL apenas relaciona objetos de m dia, no importando qual o tipo de seu contedo. Esses scripts seguem sintaxe idntica ` de Lua e a u e a possuem um conjunto de bibliotecas similar. Ou seja, a linguagem Lua possui adaptaes para co funcionar embutida em documentos NCL. O arquivo Lua deve ser escrito em um arquivo (com extenso .lua) separado do documento NCL, que apenas o referencia, como qualquer outro n a o de m dia. A principal peculiaridade do NCLua est no fato de que o seu ciclo de vida controlado a e pelo documento NCL que o referencia, ou seja, ca denido no documento NCL em que instante o programa Lua se inicia. As funoes podem receber um valor de tempo como um parmetro c a opcional que pode ser usado para especicar o exato momento que o comando deve ser executado. O modelo de execuo de um n NCLua orientado a eventos, isto , o uxo da aplicao ca o e e ca guiado por eventos externos oriundos do formatador NCL. O acionamento desses eventos ora e feito pelo formatador NCL, ora feito pelo NCLua que sinaliza ao formatador uma mudana e e c interna. Esse comportamento caracteriza uma ponte de comunicao bidirecional entre o forca matador e o NCLua.

5.3

Mdulos NCLua o

As bibliotecas dispon veis para o NCLua esto divididas em quatro mdulos essenciais onde a o cada um exporta um conjunto de funes. Esses mdulos so: co o a Mdulo event: Permite a comunicao do NCLua com o formatador NCL atravs de o ca e eventos.

49

Mdulo canvas: Oferece uma API para desenhar primitivas grcas e imagens. o a Mdulo settings: Exporta a tabela settings com variveis denidas pelo autor do doo a cumento NCL e variveis de ambiente reservadas, contidas no n application/x-gingaa o settings. Mdulo persistent: Oferece uma API para exportar a tabela persistent com variveis o a denidas em uma rea reservada, restrita do middleware. a

5.3.1

Mdulo event o

O mdulo event o mdulo mais importante por fazer a ponte entre o documento NCL e o o e o script NCLua. Para que o NCLua receba um evento do formatador, o script deve registrar pelo menos uma funo de tratamento de eventos. A partir de ento, qualquer ao tomada pela ca a ca aplicao apenas em resposta ao evento recebido. ca e A funo event.register usada conforme mostrado na Figura 5.1. ca e function handler (evt) ... -- cdigo para tratar os eventos o end event.register(handler) -- registro do tratador

Figura 5.1: Uso da funo event.register. ca Um NCLua tambm pode enviar eventos para se comunicar com o ambiente. Para isso, e utiliza-se a funo event.post, como exibido na ura 5.2. ca event.post (dst; evt) Figura 5.2: Uso da funo event.post. ca Os eventos so tabelas Lua simples sendo o campo class responsvel por identicar a classe a a do evento. Podemos denir cinco classes distintas: ncl: Um NCLua se comunica com o documento no qual est inserido atravs desta classe a e de eventos. Por exemplo, consideremos que o NCLua recebeu um evento conforme a Figura 5.3. {class=ncl, type=presentation, action=start} Figura 5.3: NCLua recebendo evento. Isso indica que a m dia .lua ir iniciar sua apresentao. E para o NCLua postar um a ca evento ao formator, ele pode, por exemplo, proceder conforme exibido na Figura 5.4. Isso indica que a m dia .lua ir parar sua apresentao. a ca Os campos type e action sero explicados mais adiante. a key: utilizada para representar o uso do controle remoto pelo usurio. a

50

event.post {class=ncl, type=presentation, action=stop} Figura 5.4: NCLua postando evento. tcp: O uso do canal de interatividade realizado por meio desta classe de eventos. e sms: envio e recebimento de mensagens de texto. user: permite a criao de eventos prprios. Como eventos desta classe so para uso ca o a interno, no faz sentido a postagem de seus eventos com o destino igual a out. a Na norma da ABNT [2], pode-se encontrar outros tipos de classes, no entanto estas no a foram aqui mencionadas por ainda no estarem implementadas na ultima verso do Ginga. a a Para a classe de eventos ncl, utilizamos os seguintes campos: type: Pode ser do tipo presentation, do tipo attribution ou do tipo selection. action: Pode assumir os seguintes valores: start, stop, pause, resume ou abort. area ou property: Eventos podem ser direcionados a ncoras espec a cas ou ao n como o um todo. Quando ausente, assume o n inteiro. o value: Recebe o valor da propriedade denida no campo property, no caso onde type do e tipo attribution. A Figura 5.5 mostra um modelo: event.post { class type property action value } = = = = = ncl, attribution, myProp, start, 10,

Figura 5.5: NCLua postando evento de atribuio. ca Para a classe de eventos key, utilizamos os seguintes campos: type: Deve ser do tipo press ou do tipo release. key: Valor da tecla em questo. a Para a classe de eventos user nenhum campo da tabela representando o evento est denido a (alm, claro, do campo class). e

51

Funes do mdulo event co o event.register (pos, f, class): registra a funo passada como um tratador de eventos. ca pos: [number] Posio de insero da funo de tratamento (opcional). ca ca ca f: [funo] Funo de tratamento. ca ca class: [string] Filtro de classe (opcional). O parmetro pos indica a posio em que f registrada. Caso no seja passado, a funo a ca e a ca registrada ser a ultima a receber eventos. a A funo f a funo de tratamento de eventos. ca e ca O parmetro class indica que classe de eventos a funo deve receber. a ca A assinatura de f deve ser como mostrado na Figura 5.6. function f (evt) -- returns boolean end Figura 5.6: Funo de tratamento de eventos. ca Onde evt o evento que, ao ocorrer, ativa a funo f. e ca event.unregister (f ): cancela o registro da funo passada como um tratador de eventos. ca f: [funo] Funo de tratamento. ca ca Novos eventos no sero mais passados a f. a a event.post (dst, evt): posta (gera) um evento. Onde: dst: [string] E o destino do evento. evt: [table] Evento a ser postado. O parmetro dst pode assumir os valores in (envio para a prpria aplicao) e out (envio a o ca para o formatador). Caso seja omitido, assume o valor out. Retorna: sent: [boolean] Se o evento foi enviado com sucesso. err msg: [string] Mensagem em caso de erro. event.timer (time, f ): cria um timer de time milissegundos e, ao m deste, chama a funo f. ca Onde: time: [number] Tempo em milissegundos. f: [fun~o] Funo de retomada. ca ca Retorna: unreg: [fun~o] Funo que, quando chamada, cancela o timer. ca ca A assinatura de f deve ser: function f () end O valor de zero milissegundos vlido. e a

52

event.uptimer (time): retorna o nmero de milissegundos decorridos desde o in da u cio aplicao. ca Onde: time: [number] Tempo em milissegundos.

5.3.2

Mdulo canvas o

Um NCLua tem a possibilidade de fazer operaes grcas durante a apresentao de uma co a ca aplicao, tais como desenho de linhas, c ca rculos, imagens, etc. Tudo isso poss e vel, pois o mdulo canvas oferece uma API grca para ser usada por aplicaes NCLua. o a co Quando um objeto de m NCLua iniciado, a regio do elemento <media> correspondente dia e a (do tipo application/x-ginga-NCLua) ca dispon como a varivel global canvas para o script vel a Lua. Se o elemento de <media> no tiver nenhuma regio especicada (propriedades left, right, a a top and bottom), ento o valor para canvas deve ser estabelecido como nil. a Funes do mdulo canvas co o canvas:new(width, height): criao de novo objeto grco com tamanho especicado. ca a Onde: width: [number] Largura do canvas. height: [number] Altura do canvas. canvas:new(image path): uma imagem passada como parmetro. e a Onde: image path: [string] Caminho da imagem. canvas:attrSize(): retorna as dimenses do canvas. o Retorna width e height, nessa ordem. No poss alterar as dimenses de um canvas a e vel o instanciado. canvas:attrColor(R, G, B ,A): altera a cor do canvas. As cores so passadas em RGB. a O argumento A varia de 0 (totalmente transparente) ` 255 (totalmente opaco). a As primitivas so desenhadas com a cor desse atributo e o seu valor inicial 0, 0, 0, 255. a e Tambm poss passar diretamente o nome da cor: canvas:attrColor(color_name, A). e e vel Onde color_name pode assumir os seguintes valores: white, aqua, lime, yellow, red, fuchsia, purple, maroon, blue, navy, teal, green, olive, silver, gray e black. canvas:attrColor(): retorna as cores do canvas. Retorna R, G, B e A, nessa ordem. canvas:attrClip(x, y, width, height): limita a rea do canvas para desenho. a Onde: x: [number] Coordenada x da rea limitada. a

53

y: [number] Coordenada y da rea limitada. a width: [number] Largura da rea limitada. a height: [number] Altura da rea limitada. a O valor inicial o canvas inteiro. e canvas:attrClip(): retorna as dimenses da rea limitada. o a Retorna na ordem: x, y, width e height. canvas:attrCrop(x, y, width, height): atributo de corte do canvas. Onde: x: [number] Coordenada x da rea limitada. a y: [number] Coordenada y da rea limitada. a width: [number] Largura da rea limitada. a height: [number] Altura da rea limitada. a Quando o canvas composto sobre outro, apenas a regio de recorte copiada para o e a e canvas de destino. O valor inicial o canvas inteiro. e canvas:attrCrop(): retorna as dimenses de corte do canvas. o Retorna na ordem: x, y, width e height. canvas:attrFont(face, size, style): altera a fonte do canvas. Onde: face: [string] Nome da fonte size: [number] Tamanho da fonte style: [string] Estilo da fonte As seguintes fontes devem obrigatoriamente estar dispon veis: Tiresias, Verdana. O tamanho em pixels e representa a altura mxima de uma linha escrita com a fonte e a escolhida. Os estilos poss veis so: bold, italic ou bold-italic. a O valor nil assume que nenhum dos estilos ser usado. a canvas:attrFont(): retorna a fonte do canvas. Retorna na ordem: face, size e style. canvas:attrFlip (horiz, vert): espelhamento do canvas usado em funes de composio. co ca Onde: horiz: [boolean] Se o espelhamento for horizontal. vert: [boolean] Se o espelhamento for vertical. canvas:attrFlip (horiz, vert): retorna a congurao de espelhamento do canvas. ca Retorna horiz se for horizontal e vert se for vertical. canvas:attrOpacity (opacity): altera a opacidade do canvas. Onde: opacity: [number] Novo valor de opacidade do canvas.

54

canvas:attrOpacity (): retorna a opacidade do canvas. canvas:attrRotation (degrees): congura o atributo de rotao do canvas. ca Onde: degree: [number] Rotao do canvas em graus (deve ser mltiplo de 90). ca u canvas:attrRotation (degrees): retorna o atributo de rotao do canvas. ca canvas:attrScale (w, h): escalona o canvas com nova largura e altura. Onde: w: [number] Largura de escalonamento do canvas. h: [number] Altura de escalonamento do canvas. Um dos valores pode ser true, indicando que a proporo do canvas deve ser mantida. ca O atributo de escalonamento independente do atributo de tamanho, ou seja, o tamanho e do canvas mantido. e canvas:attrScale (): retorna os valores de escalonamento do canvas. Retorna na ordem: w e h. canvas:drawLine (x1, y1, x2, y2): desenha uma linha. A linha tem extremidades em (x1,y1) e (x2,y2). Utiliza a cor especicada em attrColor. canvas:drawRect (mode, x, y, width, height): desenha um retngulo. a Onde: mode: [string] Modo de desenho x: [nmero] Coordenada do retngulo u a y: [nmero] Coordenada do retngulo u a width: [nmero] Largura do retngulo u a height: [nmero] Altura do retngulo u a O parmetro mode pode receber frame para desenhar a moldura ou ll para preench-lo. a e canvas:drawRoundRect(mode, x, y, width, height, arcWidth, arcHeight): desenha um retngulo com bordas arredondadas. a Onde: arcWidth: [nmero] Largura do arco do canto arredondado u arcHeight: [nmero] Altura do arco do canto arredondado u Os outros parmetros funcionam da mesma forma que em canvas:drawRect. a canvas:drawPolygon(mode): desenha um polinmio. o O parmetro mode pode receber: a open: para desenhar o pol gono sem ligar o ultimo ponto ao primeiro; close: para desenhar o pol gono ligando o ultimo ponto ao primeiro; ll : para desenhar o pol gono ligando o ultimo ponto ao primeiro e colorir a regio interior. a

55

canvas:drawEllipse (mode, xc, yc, width, height, ang start, ang end): desenha uma elipse. Onde: mode: [string] Modo de desenho xc: [nmero] Centro da elipse u yc: [nmero] Centro da elipse u width: [nmero] Largura da elipse u height: [nmero] Altura da elipse u u cio ang start: [nmero] Angulo de in ang end: [nmero] Angulo de m u O parmetro mode pode receber arc para desenhar apenas a circunferncia ou ll para a e preenchimento interno. canvas:drawText (x, y, text): desenha um texto. Onde: x: [nmero] Coordenada do texto u y: [nmero] Coordenada do texto u text: [string] Texto a ser desenhado Desenha o texto utilizando a fonte congurada em canvas:attrFont(). canvas:clear (x, y, w, h): limpa o canvas com a cor congurada em attrColor. Onde: x: [nmero] Coordenada da rea de clear u a y: [nmero] Coordenada da rea de clear u a w: [nmero] Largura da rea de clear u a h: [nmero] Altura da rea de clear u a Caso no sejam passados os parmetros de rea, assume-se que o canvas inteiro ser limpo. a a a a canvas:ush (): atualiza o canvas aps operaes de desenho e de composio. o co ca E suciente cham-lo apenas uma vez aps uma sequncia de operaes. a o e co canvas:compose (x, y, src, [src x, src y, src width, src height]): faz sobre o canvas (canvas de destino), em sua posio (x,y), a composio pixel a pixel com src (canvas de ca ca origem). Onde: x: [nmero] Posio da composio u ca ca y: [nmero] Posio da composio u ca ca src: [canvas] Canvas a ser composto src x: [nmero] Posio da composio no canvas src u ca ca src y: [nmero] Posio da composio no canvas src u ca ca src width: [nmero] Largura da composio no canvas src u ca

56

src height: [nmero] Altura da composio no canvas src u ca Os outros parmetros entre colchetes so opcionais e indicam que parte do canvas src a a compor. Quando ausentes, o canvas inteiro composto. e Essa operao chama src:ush() automaticamente antes da composio. E aps a operao, ca ca o ca o canvas de destino possui o resultado da composio e src no sofre qualquer alterao. ca a ca canvas:pixel (x, y, R, G, B, A): altera a cor de um pixel do canvas. Onde: x: [nmero] Posio do pixel u ca y: [nmero] Posio do pixel u ca R: [nmero] Componente vermelha da cor u G: [nmero] Componente verde da cor u B: [nmero] Componente azul da cor u A: [nmero] Componente alpha da cor u canvas:pixel (x, y): retorna a cor de um pixel do canvas. Onde os parmetros x e y funcionam como em canvas:pixel. a Retorna os valores R, G, B e A, nesta ordem. canvas:measureText (text): retorna as coordenadas para o texto passado. Onde: text: [string] Texto a ser medido Retorna dx e dy, largura e altura do texto respectivamente. Prtica a Vamos fazer um exemplo bem simples para melhor entendermos a utilizao do mdulo event. ca o O nosso exemplo ir mostrar na tela um boto, mas este s aparece por alguns instantes e a a o depois some. Este boto ir aparecer quatro vezes e o objetivo clicar nele. Se clicarmos nele a a e pelo menos trs vezes, ser desenhado na tela um retngulo verde e a frase You win, caso e a a contrrio ser desenhado um x vermelho e a frase You lose. a a No nosso documento NCL, j criado no Cap a tulo 3, precisamos declarar nosso n NCLua e o este deve incluir duas propriedades conforme a gura 5.7. <media id="clicks" src="clicks.lua"> <area id="counter"/> <property name="inc"/> </media> Figura 5.7: N NCLua com duas propriedades. o A ncora counter, ao ser inicializada, far o cdigo Lua contar quantas vezes o boto foi a a o a pressionado. A propriedade inc um incrementador e ser responsvel por somar um ao valor e a a de counter. O elo para incrementar o contador acionado na seleo do boto, que deve desaparecer e ca a (Figura 5.8).

57

<link xconnector="onSelectionStopSet"> <bind role="onSelection" component="button"/> <bind role="stop" component="button"/> <bind role="set" component="clicks" interface="inc"> <bindParam name="var" value="1"/> </bind> </link> Figura 5.8: Elo para incrementar o contador. Conforme mostrado acima, o incremento acionado por uma simpleAction de set. A ao de e ca set um apelido para uma ao de start em um evento do tipo attribution, portanto, o evento e ca gerado apresentado na Figura 5.9. e evt = { class type property action value } = = = = = ncl, attribution, inc, start, 1,

Figura 5.9: Evento gerado pelo link. Um novo conector foi criado (Figura 5.10). <causalConnector id="onEndStopStart"> <simpleCondition role="onEnd"/> <compoundAction operator="seq"> <simpleAction role="stop" max="unbounded"/> <simpleAction role="start" max="unbounded"/> </compoundAction> </causalConnector> Figura 5.10: Novo conector criado. Ele responsvel por fazer o elo entre o m de area04 da m e a dia timer e o in de counter cio da m dia clicks. Na Figura 5.11 podemos ver como cou esse elo. <link xconnector="onEndStopStart"> <bind role="onEnd" component="timer" interface="area04"/> <bind role="stop" component="button"/> <bind role="start" component="clicks" interface="counter"/> </link> Figura 5.11: Novo elo.

58

Nosso cdigo Lua pode ser visualizado na Figura 5.12. o counter = 0 local class type name } counterEvt = { = ncl, = attribution, = counter,

function handler (evt) if((evt.class == ncl) and (evt.type == attribution)) then if (evt.name == inc) then counter = counter + evt.value event.post{ class = ncl, type = attribution, name = inc, action = stop, value = counter, } end elseif(evt.label == counter) if (counter >= 3) then canvas:attrFont(vera, 20) canvas:attrColor(green) canvas:drawText(280, 200, "You canvas:drawRect (frame, 270, canvas:flush() else canvas:attrFont(vera, 20) canvas:attrColor(red) canvas:drawText(280, 200, "You canvas:drawLine(270, 230, 360, canvas:drawLine(270, 300, 360, canvas:flush() end end end event.register(handler) Figura 5.12: Cdigo Lua alterado. o then

win") 230, 90, 70)

lose") 300) 230)

59

5.3.3

Mdulo settings o

Propriedades de um n settings s podem ser modicadas por meio de elos NCL. No permitido o o a e atribuir valores aos campos representando variveis nos ns settings. a o A tabela settings particiona seus grupos em vrias subtabelas, correspondendo a cada grupo a do n application/x-ginga-settings. Por exemplo, em um objeto NCLua, a varivel do n settings o a o system.CPU referida como settings.system.CPU. e Exemplos de uso (Figura 5.13). lang = settings.system.language age = settings.user.age val = settings.default.selBorderColor settings.user.age = 18 --> ERRO! Figura 5.13: Exemplo: mdulo settings. o

5.3.4

Mdulo persistent o

Aplicaes NCLua permitem que dados sejam salvos em uma rea restrita do middleware e recuco a perados entre execues. O exibidor Lua dene uma rea reservada, inaccess a objetos NCL co a vel no procedurais. No existe nenhuma varivel pr-denida ou reservada e objetos procedurais a a a e podem atribuir valores a essas variveis diretamente. a O uso da tabela persistent semelhante ao uso da tabela settings, exceto pelo fato de que, e neste caso, o cdigo procedural pode mudar os valores dos campos. o Exemplos de uso (Figura 5.14). persistent.service.total = 10 color = persistent.shared.color Figura 5.14: Exemplo: mdulo persistent. o

60

Referncias e
[1] F. SantAnna, R. Cerqueira, L.F.G. Soares. NCLua - Objetos Imperativos Lua na Linguagem Declarativa NCL. [2] ABNT NBR 15606-5. Televiso digital terrestre - Codicao de dados e especicaes a ca co de transmisso para radiodifuso digital. Parte 5: Ginga-NCL para receptores portteis - Lina a a guagem de aplicao XML para codicao de aplicaes. ca ca co

61

Apndice A e

Exemplos da Apostila

62

<?xml version="1.0" encoding="ISO-8859-1"?> <ncl id="exemplo01" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head> <regionBase> <region id="rg_video" left="0" top="0" width="100%" height="100%" zIndex="1"> <region id="rg_button" left="40%" top="40%" width="20%" height="20%" zIndex="3"/> </region> </regionBase> <descriptorBase> <descriptor id="dp_video" region="rg_video"/> <descriptor id="dp_button" region="rg_button" focusIndex="0"/> </descriptorBase> <connectorBase> <causalConnector id="onBeginStart"> <simpleCondition role="onBegin"/> <simpleAction role="start"/> </causalConnector> <causalConnector id="onEndStop"> <simpleCondition role="onEnd"/> <simpleAction role="stop" max="unbounded"/> </causalConnector> <causalConnector id="onSelectionSet"> <simpleCondition role="onSelection"/> <connectorParam name="var"/> <simpleAction role="set" value="$var"/> </causalConnector> </connectorBase> </head> Figura A.1: Parte 1 do exemplo completo do Cap tulo 3.

63

<body> <port component="video" id="inicio"/> <media id="video" src="video.mpg" type="video/mpeg" descriptor="dp_video"> <area id="area01" begin="3s" end="6s"/> <area id="area02" begin="10s" end="13s"/> <area id="area03" begin="17s" end="20s"/> <area id="area04" begin="24s" end="27s"/> </media> <media id="button" descriptor="dp_button" src="button.jpg" type="image/jpeg"/> <media id="clicks" src="clicks.lua"> <property name="inc"/> <property name="counter"/> </media> <link xconnector="onBeginStart"> <bind role="onBegin" component="video"/> <bind role="start" component="clicks"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area01"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area02"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area03"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area04"/> <bind role="start" component="button"/> </link> Figura A.2: Parte 2 do exemplo completo do Cap tulo 3.

64

<link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area01"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area02"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area03"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area04"/> <bind role="stop" component="button"/> </link> <link xconnector="onSelectionStopSet"> <bind role="onSelection" component="button"/> <bind role="set" component="clicks" interface="inc"> <bindParam name="var" value="1"/> </bind> </link> </body> </ncl> Figura A.3: Parte 3 do exemplo completo do Cap tulo 3.

65

--tabela event = {} event.post = { class = ncl, type = attribution, property = myProp, action = start, value = 10 } --funcao verificadora function handler(evt) if evt.class ~= ncl then return end if evt.type ~= attribution then return end if evt.property ~= myProp then return end print("Acao: ", evt.action) print("Valor: ", evt.value) return end --uso da funcao handler(event)

--> start

10

Figura A.4: Exemplo completo do Cap tulo 4.

66

<?xml version="1.0" encoding="ISO-8859-1"?> <ncl id="exemplo01" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head> <regionBase> <region id="rg_video" left="0" top="0" width="100%" height="100%" zIndex="1"> <region id="rg_button" left="40%" top="40%" width="20%" height="20%" zIndex="3"/> </region> </regionBase> <descriptorBase> <descriptor id="dp_video" region="rg_video"/> <descriptor id="dp_button" region="rg_button" focusIndex="0"/> </descriptorBase> <connectorBase> <causalConnector id="onBeginStart"> <simpleCondition role="onBegin"/> <simpleAction role="start"/> </causalConnector> <causalConnector id="onEndStop"> <simpleCondition role="onEnd"/> <simpleAction role="stop" max="unbounded"/> </causalConnector> <causalConnector id="onSelectionStopSet"> <simpleCondition role="onSelection"/> <connectorParam name="var"/> <compoundAction operator="seq"> <simpleAction role="stop" max="unbounded"/> <simpleAction role="set" value="$var"/> </compoundAction> </causalConnector> <causalConnector id="onEndStopStart"> <simpleCondition role="onEnd"/> <compoundAction operator="seq"> <simpleAction role="stop" max="unbounded"/> <simpleAction role="start" max="unbounded"/> </compoundAction> </causalConnector> </connectorBase> </head> Figura A.5: Parte 1 do exemplo completo do Cap tulo 5. 67

<body> <port component="video" id="inicio"/> <media id="video" src="video.mpg" type="video/mpeg" descriptor="dp_video"> <area id="area01" begin="3s" end="6s"/> <area id="area02" begin="10s" end="13s"/> <area id="area03" begin="17s" end="20s"/> <area id="area04" begin="24s" end="27s"/> </media> <media id="button" descriptor="dp_button" src="button.jpg" type="image/jpeg"/> <media id="clicks" src="clicks.lua"> <area id="counter"/> <property name="inc"/> </media> <link xconnector="onBeginStart"> <bind role="onBegin" component="video"/> <bind role="start" component="clicks"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area01"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area02"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area03"/> <bind role="start" component="button"/> </link> <link xconnector="onBeginStart"> <bind role="onBegin" component="video" interface="area04"/> <bind role="start" component="button"/> </link> Figura A.6: Parte 2 do exemplo completo do Cap tulo 5.

68

<link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area01"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area02"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStop"> <bind role="onEnd" component="video" interface="area03"/> <bind role="stop" component="button"/> </link> <link xconnector="onEndStopStart"> <bind role="onEnd" component="video" interface="area04"/> <bind role="stop" component="button"/> <bind role="start" component="clicks" interface="counter"/> </link> <link xconnector="onSelectionStopSet"> <bind role="onSelection" component="button"/> <bind role="stop" component="button"/> <bind role="set" component="clicks" interface="inc"> <bindParam name="var" value="1"/> </bind> </link> </body> </ncl> Figura A.7: Parte 3 do exemplo completo do Cap tulo 5.

69

counter = 0 local class type name } counterEvt = { = ncl, = attribution, = counter,

function handler (evt) if((evt.class == ncl) and (evt.type == attribution)) then if (evt.name == inc) then counter = counter + evt.value event.post{ class = ncl, type = attribution, name = inc, action = stop, value = counter, } end elseif(evt.label == counter) if (counter >= 3) then canvas:attrFont(vera, 20) canvas:attrColor(green) canvas:drawText(280, 200, "You canvas:drawRect (frame, 270, canvas:flush() else canvas:attrFont(vera, 20) canvas:attrColor(red) canvas:drawText(280, 200, "You canvas:drawLine(270, 230, 360, canvas:drawLine(270, 300, 360, canvas:flush() end end end event.register(handler) Figura A.8: Parte 4 do exemplo completo do Cap tulo 5. then

win") 230, 90, 70)

lose") 300) 230)

70

Apndice B e

Ferramentas
B.1 Composer

O Composer [1] uma ferramenta de autoria hiperm e dia desenvolvida pelo Laboratrio Teo leM dia [2] do Departamento de Informtica da PUC-Rio. Ele um editor grco que fornece a e a vrias vises integradas para a criao de documentos NCL. As diversas vises facilitam a a o ca o edio de documentos NCL por programadores com pouco conhecimento da linguagem NCL. ca A apresentao de um documento em diversas vises fornece ao usurio uma maior intuio no ca o a ca desenvolvimento de suas aplicaes. A Figura B.1 apresenta o Composer e as diversas vises co o que o usurio pode trabalhar. a

Figura B.1: Ferramenta de autoria Composer. A verso atual do Composer permite ao usurio trabalhar com vises Estrutural 1, Temporal a a o 2, Textual 3 e de Leiaute 4. A Viso Estrutural (Structural View ) apresenta os ns e os elos entre os ns. A Figura B.2 a o o apresenta a viso estrutural de um documento NCL. Um n de m a o dia ilustrado por um e cone representando seu contedo. Uma composio desenhada como uma caixa (cubo) e, quando u ca e ela aberta (expanded), como um retngulo, com ns lhos e links dentro. e a o

71

Nessa viso um autor pode gracamente criar, editar e remover ns de m a o dia, contextos e elos, bem como denir suas propriedades. Ele pode tambm expandir e fechar composies. e co

Figura B.2: Viso estrutural da ferramenta Composer. a A Viso Temporal (Temporal View ) ilustra o sincronismo temporal entre os ns de m a o dia, e as oportunidades de interatividade. A viso temporal preserva tanto quanto poss o paradigma a vel de linha de tempo. Usando essa viso, a autoria pode ser feita colocando objetos de m a dia sobre um eixo de tempo, mas preservando os relacionamentos relativos entre eles. A Figura B.3 apresenta a viso temporal de um documento hiperm a dia que exibe uma imagem iconeInteracao durante um determinado segmento de apresentao da m ca dia videoPrinc.

72

Figura B.3: Viso temporal da ferramenta Composer. a A Viso de Leiaute (Layout View ) exibe as regies da tela onde as m a o dias do documento podero ser apresentadas. Ela dividida em duas partes. Considerando que uma regio pode a e a ser especicada como lha de outra regio, do lado esquerdo da viso de leiaute mostrado a a a e organizao hierrquica de regies. Do lado direito exibido a representao espacial. Quando ca a o e ca a regio pai movida, todas as regies lhas tambm so movidas, preservando suas posies a e o e a co relativas. A Figura B.4 apresenta a viso de leiaute de um documento hiperm a dia que contm e trs regies: a tela inteira (rgTV ), uma rea para exibir v e o a deos (rgVideo) e uma rea que exibe a um logo (rgLogo).

Figura B.4: Viso de leiaute da ferramenta Composer. a A Viso Textual (Textual View ) faz a apresentao textual do cdigo NCL. Nessa viso, o a ca o a usurio pode editar diretamente o cdigo NCL como em um editor de texto. Ela oferece algumas a o funcionalidades para a edio de documentos NCL, como viso em rvore do cdigo, colorao ca a a o ca

73

de palavras reservadas da linguagem. A gura B.5 apresenta a viso textual. a

Figura B.5: Viso textual da ferramenta Composer. a As vises do Composer so integradas, pois sempre que so feitas alteraes em uma viso, o a a co a elas so reetidas nas demais vises da ferramenta. a o

B.2

NCL Eclipse

NCL Eclipse um editor XML/NCL desenvolvido como um plug-in para a plataforma Eclipse e [3] que oferece diversas funcionalidades centradas nas necessidades de autores de aplicaes co NCL, tais como a sugesto de cdigo automtica e contextual, validao de documentos NCL, a o a ca colorao de elementos XML e de palavras reservadas da linguagem. ca Ao ser desenvolvido como um plug-in para o Eclipse o NCL Eclipse permite que todo esse ambiente, j bem conhecido dos programadores, seja reutilizado e facilita a integrao com a ca outras ferramentas de desenvolvimento para a TV Digital, como, por exemplo, o Lua Eclipse [4]. Uma das funcionalidades interessantes no desenvolvimento de programas com o NCL Eclipse a identicao e marcao de erros no momento da autoria, permitindo que o autor identique e ca ca o erro de forma rpida, visto que diminui a necessidade de executar o documento para evidenciar a que o mesmo possui erros sintticos e/ou semnticos. O NCL Eclipse reusa o NCL Validator a a com o objetivo de identicar e marcar erros em documentos NCL, em tempo de autoria. O processo de instalao do NCL Eclipse muito simples e segue o padro da instalao de ca e a ca plug-ins para o Eclipse. No site http://laws.deinf.ufma.br/ ncleclipse/documentacao.htm existe um tutorial bsico sobre como instalar e usar o NCL Eclipse. a A Figura B.6 apresenta uma viso geral do NCL Eclipse com um documento NCL recm a e criado.

74

Figura B.6: Viso geral do NCL Eclipse: a) viso textual; b) viso de problemas; c) viso a a a a outline. A Figura B.7 apresenta um documento com um erro, a linha do erro sublinhada e uma e descrio pode ser visualizada na Problem View . ca Na autoria de documentos o autor pode utilizar a opo de autocomplete. O programador ca precisa apenas colocar o cursor em um trecho de texto interno ao contedo de um determinado u elemento e teclar Ctrl + espao para visualizar uma sugesto dos poss c a veis elementos lhos. A Figura B.8 apresenta a opo de autocomplete. ca

75

Figura B.7: Identicao e marcao de erros em documentos NCL. ca ca

Figura B.8: Sugesto de cdigo contextual automtica (Autocomplete). a o a

Referncias e
[1] Construindo Programas Audiovisuais Interativos Utilizando a NCL 3.0 e a Ferramenta Composer - 2a. edio (verso 3.0), PUC-Rio, 31/07/2007. ca a

76

[2] TeleM dia (http://www.telemidia.puc-rio.br). Acessado em 14 de outubro de 2009. [3] Eclipse (http://www.eclipse.org). Acessado em 19 de outubro de 2009. [4] LuaEclipse (http://luaeclipse.luaforge.net). Acessado em 19 de outubro de 2009.

77

Вам также может понравиться