{"id":1224,"date":"2015-06-19T17:26:02","date_gmt":"2015-06-19T21:26:02","guid":{"rendered":"http:\/\/linguagemprisma.net\/blog\/?p=1224"},"modified":"2015-06-19T17:27:24","modified_gmt":"2015-06-19T21:27:24","slug":"o-codigo-fonte-do-prismacod","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/igprisma\/o-codigo-fonte-do-prismacod\/","title":{"rendered":"O c\u00f3digo fonte do prismacod"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>Estou disponibilizando o c\u00f3digo fonte do prismacod, ap\u00f3s v\u00e1rias sess\u00f5es de corre\u00e7\u00f5es.<\/p>\n<p>Ainda cont\u00e9m algumas limita\u00e7\u00f5es, mas \u00e9 um \u00f3timo meio de estudos para aperfei\u00e7oamento deste pequeno editor.<\/p>\n<p>Por enquanto ele est\u00e1 com 1213 linhas de comando em arquivo \u00fanico, isto pode ser melhorado dividindo-o em v\u00e1rias partes e um programa principal.<\/p>\n<p>Tem caracter\u00edsticas como:<\/p>\n<p>*Colora\u00e7\u00e3o dos comandos e fun\u00e7\u00f5es. *procura de palavras. \u00a0 *fun\u00e7\u00e3o de executar e compilar arquivos prisma. *suporte a plugins.<\/p>\n<p>Ele \u00e9 gratuito para uso e modifica\u00e7\u00e3o, para servir de base a um programa comercial e ser vendido ou para uso pessoal.<\/p>\n<pre class=\"lang:prisma decode:true \" title=\"prismacod\">#!\/usr\/local\/bin\/prisma\r\n\/\/a primeira linha \u00e9 apenas para linux, em win \u00e9 ignorada\r\n\/\/ Simples editor para igprisma e prisma, apesar de ter sintaxe colorida para outras linguagens.\r\n\r\n\/\/este script usa o auto interpretador em Windows, uma versao prisma compilada \r\n\/\/ para que quando executada, procura a pasta com o mesmo nome do interpretador finalizado por um underline e \r\n\/\/ executa automaticamente dentro desta pasta o arquivo inic.pris que \u00e9 um script prisma ou\r\n\/\/em byte code.\r\n\r\n\/\/n\u00e3o fique receoso ao estudar este c\u00f3digo, parece grande devido aos coment\u00e1rios, mas d\u00e1 para tirar muito proveito\r\n\/\/aqui. Se encontrar erros, fique a vontade para comentar no site: http:\/\/www.linguagemprisma.net\/blog\r\n\r\n\r\n\r\n\/\/========================   \tLICENCA  =========================\r\n\r\n\r\n_Licenca = \r\n\r\n[[prismacod, prisma e igprisma  &lt;linguagemprisma@gmail.com&gt;\r\n\r\n\r\n\r\nPrisma que \u00e9 baseada nos fontes Lua-5.2, e igprisma, seu derivado, bem como \r\no editor feito nesta linguagem, tem a similar licen\u00e7a:\r\n\r\n\r\n Permission is hereby granted, free of charge, to any person obtaining a copy\r\n of this software and associated documentation files (the \"Software\"), to deal\r\n in the Software without restriction, including without limitation the rights\r\n to use, copy, modify, merge, publish, distribute, sublicense, and\/or sell\r\n copies of the Software, and to permit persons to whom the Software is\r\n furnished to do so, subject to the following conditions:\r\n\r\n The above authory notice and this permission notice shall be included in\r\n all copies or substantial portions of the Software.\r\n\r\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n THE SOFTWARE.\r\n\r\n\r\nTraducao via google translator (revisada):\r\n\r\n\r\n  A permiss\u00e3o \u00e9 concedida, a t\u00edtulo gratuito, a qualquer pessoa que obtenha uma \r\n  c\u00f3pia deste software e arquivos de documenta\u00e7\u00e3o associados (o \"Software\"), para\r\n  negociar o Software sem restri\u00e7\u00e3o, incluindo, sem limita\u00e7\u00e3o, os direitos para \r\n  usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e \/ ou \r\n  vender   c\u00f3pias do Software, e permitir que as pessoas a quem o Software \u00e9 \r\n  fornecido o fa\u00e7am, sujeito \u00e0s seguintes condi\u00e7\u00f5es:\r\n\r\n  O aviso de autoria acima e este aviso de permiss\u00e3o devem ser inclu\u00eddos em\r\n  todas as c\u00f3pias ou partes substanciais do Software.\r\n\r\n  O SOFTWARE \u00c9 FORNECIDO \"COMO EST\u00c1\", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU\r\n  IMPL\u00cdCITA, INCLUINDO, SEM LIMITA\u00c7\u00c3O, AS GARANTIAS DE COMERCIALIZA\u00c7\u00c3O,\r\n  ADEQUA\u00c7\u00c3O A UM DETERMINADO FIM E N\u00c3O VIOLA\u00c7\u00c3O. EM NENHUMA HIP\u00d3TESE OS\r\n  AUTORES OU DETENTORES DE DIREITOS AUTORAIS SER\u00c3O RESPONS\u00c1VEIS POR QUALQUER \r\n  RECLAMA\u00c7\u00c3O, DANOS OU OUTRAS RESPONSABILIDADES, SEJA EM UMA A\u00c7\u00c3O DE CUMPRIMENTO \r\n  DE CONTRATO OU QUALQUER OUTRO MEIO, OU EM CONEX\u00c3O COM O SOFTWARE OU O USO OU \r\n  OUTRAS FUN\u00c7\u00d5ES DO SOFTWARE.]]\r\n\r\n\r\n\r\n\/\/definindo diretorio de imagens linux e win\r\n\r\nse sis.nome == 'linux' entao\r\n  _Logo_prismacod = '\/usr\/local\/share\/prismacod\/imagens\/prismacod.png';\r\n  _Icone_prismacod = '\/usr\/local\/share\/prismacod\/imagens\/prismacod2.png';\r\n  _Sep_ = '\/';\r\nsenaose sis.nome == 'win32' entao\r\n  \r\n  _Logo_prismacod = prismadir .. 'prismacod_\\\\imagens\\\\prismacod.png';\r\n  _Icone_prismacod = prismadir ..'prismacod_\\\\imagens\\\\prismacod2.png';\r\n  _Sep_ = '\\\\' ; \/\/separador de diretorio para Winodws \u00e9 diferente do Linux\r\n  \/\/lembre-se que prismadir \u00e9 uma variavel predefinida do diretorio \r\n  \/\/do executavel prisma\r\n\r\nfim \r\n\r\n\r\n_PRISMACOD_VERSAO_ = 'Prismacod-0.3 Release'\r\n\r\n local str = inclua'str_analise'; \/\/biblioteca que tem fun\u00e7\u00f5es para separar strings por tokens\r\n\r\nig = inclua'igbr'  \/\/inclui a biblioteca grafica igbr\r\n\r\n_LINGUAGEM_DEFINIDA_ = 'prismabr' ; \/\/este \u00e9 o nome que est\u00e1 no arquivo spec em gtksourceview-2.0\/specs\r\n\r\n\/\/saindo do programa:\r\n\r\n\r\n\r\n\r\nfuncao arquivo_abrir( sBuf , Nome_arquivo ) \r\n\r\n  se sBuf == nulo entao retorne falso fim     \/\/se Nome_arquivo == nulo entao retorne falso fim  \r\n  se ig.codigo_buffer_sim( sBuf ) == falso entao retorne falso fim\r\n  \r\n \/\/ig.codigo_linguagem_def_pasta( lm, \"lang\/linguagem-specs\" ); \r\n \/\/ define o diret\u00f3rio de busca dos specs de linguagem, podendo customizar um diretorio   \r\n  local linguagem = ig.codigo_gerenciador_linguagem_obt_linguagem ( lm, _LINGUAGEM_DEFINIDA_ ); \/\/_LINGUAGEM_DEFINIDA_ = 'prismabr'\r\n  \/\/o codigo acima so para demostrar se a linguagem foi encontrada ou nao    \r\n  imprima( string.formate( \"\\nLinguagem: [%s]\\n\", ig.codigo_linguagem_obt_nome(linguagem)  )     );   \r\n      \r\n   se linguagem == nulo entao\r\n      imprima( \r\n        string.formate( \"Nenhuma linguagem para o mime tipo `%s'\\n\", \"text\/x-csrc\")\r\n      );\r\n   senao\r\n         ig.codigo_buffer_def_linguagem( sBuf, linguagem);  \r\n         \/\/definindo a linguagem para reconhecimento e colorizacao \r\n   fim\r\n   \r\n   se Nome_arquivo &lt;&gt; nulo entao \/\/se o nome do arquivo nao for nulo\r\n   \r\n    \r\n \/\/acabou de abrir o arquivo entao desativa o salvar, n\u00e3o h\u00e1\r\n \/\/altera\u00e7\u00f5es por enquanto\r\n    \r\n   local arq = es.abra(Nome_arquivo , 'leitura' ); \/\/open a arquivo mode leia\r\n        \r\n      \/\/abaixo: se arquivo nao for aberto text \u00e9 padrao:\r\n        se arq == nulo entao text = [[\/\/este \u00e9 um coment\u00e1rio\r\nimprima'Ola Mundo Em Prisma!'\r\n]]\r\n        senao\r\n        \r\n        \r\n          poe'\\nArquivo aberto:'\r\n          poe( Nome_arquivo );\r\n          poe'\\n'; \/\/nova linha\r\n          local text = arq:leia('*t' ); \r\n          \/\/o argumento '*t' \u00e9 opcional e faz ler todo o arquivo de uma so vez        \r\n      arq:feche(); \/\/fechando o objeto aberto\r\n                    \r\n          ig.texto_buffer_def_texto ( sBuf, text );\r\n          ig.texto_area_def_buffer( editor, sBuf);\r\n          \r\n          ig.componente_def_sensitivo( tool_salvar , falso );\r\n          \r\n        fim \/\/fim se arquivo == nulo\r\n  senao\/\/se Nome_arquivo &lt;&gt; nulo\r\n        text = '\/\/exemplo de comentario de linha unica\\nimprima(\"ola mundo!\")\\n\\n' ;\r\n        ig.texto_buffer_def_texto ( sBuf, text );\r\n        ig.texto_area_def_buffer( editor, sBuf);\r\n        \r\n        \r\nfim  \r\n\r\n  \r\n retorne arquivo\r\nfim \/\/fim funcao arquivo_abrir\r\n\r\n\r\nfuncao atualiza_linguagem()\r\n_LINGUAGEM_DEFINIDA_ = ig.caixa_combo_obt_texto_ativo( combo ); \/\/obtendo texto selecionado no combo box\r\nlinguagem = ig.codigo_gerenciador_linguagem_obt_linguagem  ( lm, _LINGUAGEM_DEFINIDA_ );\r\n     se linguagem == nulo entao \/\/caso a sintaxe da linguagem nao seja encontrada\r\n      imprima( \r\n        string.formate( \"Nenhuma linguagem encontrada para o mime tipo `%s'\\n\", \"text\/x-csrc\")\r\n      );\r\n   senao  \/\/se for encotrada defina como sintaxe do buffer\r\n      ig.codigo_buffer_def_linguagem(  buffer, linguagem);   \r\n   fim\r\n\r\nfim \/\/fim funcao\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/- definindo variaveis no escopo global\r\neditor = nulo; \/\/area de texto\r\njanela_principal = nulo;\r\nNome_arquivo = nulo;\r\ncomme = nulo;\r\nexecute_command_menu_item = nulo;\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/- refresh titulo\r\n\r\n\r\nfuncao atualiza_titulo()\r\n\r\n  titulo_app = ' - Prismacod IDE' ;\r\n  se Nome_arquivo == nulo entao\r\n      titulo_empty = 'Sem t\u00edtulo';\r\n      titulo = titulo_empty;\r\n      titulo = titulo .. titulo_app;\r\n  senao\r\n      titulo = Nome_arquivo;\r\n      titulo = titulo .. titulo_app;\r\n  fim\r\n\r\n  ig.janela_def_titulo( janela_principal, titulo );\r\n\r\nfim\r\n\r\nfuncao comando_executar( menu_item )\r\n\r\n     \r\n      \r\n     se Nome_arquivo == nulo entao ig.msg( janela_principal ,'Aten\u00e7\u00e3o','Antes de executar \u00e9 necess\u00e1rio salvar o programa!') ;  comando_salvar() fim\r\n     se Nome_arquivo == nulo entao retorne fim; \r\n     \r\n     ig.componente_def_sensitivo( tool_salvar , falso );\r\n   \r\n     local buffer = ig.texto_area_obt_buffer( editor );     \r\n     local Inicio_txt , Fim_txt = ig.texto_buffer_obt_limites ( buffer );    \r\n     \/\/esta funcao acima retorna os ponteiros que indicam o inicio e fim do texto \r\n     local text = ig.texto_iter_obt_texto( Inicio_txt, Fim_txt ); \r\n     \/\/depois basta usar esses ponteiros para capturar o texto\r\n     \r\n     \/\/nao precismaos mais dos iteradores entao apagamos eles:\r\n     ig.texto_iter_libere( Inicio_txt );\r\n     ig.texto_iter_libere( Fim_txt );\r\n     \r\n     local arquivo = es.abra( Nome_arquivo , 'escrita' );    \r\n     se arquivo entao  \r\n       arquivo:escreva( text );     \r\n       arquivo:feche();  \r\n     fim \/\/fim se arquivo \r\n     \r\n              \r\n          path_arquivo = str.separe(  Nome_arquivo , _Sep_ ) ;\r\n          se path_arquivo == nulo entao path_arquivo = '.' fim;\r\n          path_arquivo = path_arquivo .. _Sep_ ;     \r\n                 \r\n\r\nse sis.nome == 'win32' entao\r\n\r\nimprima'Executando em ambiente win32\\n';\r\n   \r\n   dir = prismadir .. '\\\\prisma.exe';\r\n \r\n     local cmd = 'cd ' .. '\"'.. path_arquivo .. '\" &amp;&amp; \"'.. dir .. '\" '  .. '  \"' .. Nome_arquivo .. '\" ';\r\n   \r\n   shPath =  prismadir .. 'run_prismacod_script.bat'; \/\/unido a string path_arquivo com 'run...\r\n local run = es.abra(  shPath , 'escrita');\r\n  se run entao\r\n  run:escreva( '@ECHO OFF\\n');\r\n     run:escreva( cmd );\r\n     run:escreva(\"\\npause\");\r\n     run:escreva(\"\\nexit\");      \r\n   run:feche(); \r\n fim  \r\n   \r\n     exec = 'start \"\" \"' .. prismadir .. 'run_prismacod_script.bat\" '\r\n     imprima('Executando:\\n' .. exec );\r\n  sis.execute( exec );\r\n\r\nsenaose sis.nome == 'linux' entao\r\n\r\nimprima'Executando em ambiente linux\\n';\r\n\r\n local cmd =  'cd \"' .. path_arquivo ..'\"  &amp;&amp; ' ..   'prisma ' .. Nome_arquivo  ;\r\n   shPath =  path_arquivo ..'run_prismacod_script.sh'\r\n local run = es.abra(  shPath , 'escrita');\r\n  se run entao\r\n      run:escreva( \"\\n\\n\" );\r\n      run:escreva( cmd );     \r\n      run:escreva( \"\\necho \\n echo\");\r\n      run:escreva( \"\\necho \\\"Aperte &lt;ENTER&gt; para continuar...\\\" \\n\");       \r\n   run:feche(); \r\n fim  \r\n   \r\n     exec = 'cd \"' .. path_arquivo ..'\"  &amp;&amp; ' ..  'xterm -e  \"bash run_prismacod_script.sh; read g \" &amp;'\r\n     imprima('Executando:\\n' .. exec );\r\n  sis.execute( exec );\r\n\r\nfim \/\/fim se sis.nome == ...\r\n  \r\n    \r\n  \r\nfim\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-=========================  compile comando\r\n\r\nfuncao comando_compilar( menu_item , dado_extra )\r\n\r\n   \r\n  \r\n  se Nome_arquivo == nulo entao ig.msg(janela_principal,'Aten\u00e7\u00e3o','Antes de compilar \u00e9 necess\u00e1rio salvar o programa!') ;  comando_salvar() fim\r\n     se Nome_arquivo == nulo entao retorne fim; \r\n     \r\n     ig.componente_def_sensitivo( tool_salvar , falso );\r\n   \r\n     local buffer = ig.texto_area_obt_buffer( editor );     \r\n     local Inicio_txt , Fim_txt = ig.texto_buffer_obt_limites ( buffer );     \r\n     local text = ig.texto_iter_obt_texto( Inicio_txt, Fim_txt );\r\n     \r\n     \/\/nao precismaos mais dos iteradores entao apagamos eles:\r\n     ig.texto_iter_libere( Inicio_txt );\r\n     ig.texto_iter_libere( Fim_txt );\r\n     \/\/esta acao \u00e9 muito importante para evitar problemas com mem\u00f3ria\r\n     \r\n     local arquivo = es.abra( Nome_arquivo , 'escrita' );    \r\n     se arquivo entao  \r\n       arquivo:escreva( text );     \r\n       arquivo:feche();  \r\n     fim \/\/fim se arquivo  \r\n\r\nlocal arq_sem_extensao = str.separe(  Nome_arquivo , '.' ) ;\r\n\r\n se dado_extra == verdadeiro entao \r\n   extensao_saida = '.pris' \r\n senao\r\n   extensao_saida = '.pbrexe';\r\n fim \r\n \/\/lembra que ao conectar o item menu compilarLib passamos o dado_extra como verdadeiro!\r\n\r\nlocal arq_saida = arq_sem_extensao .. extensao_saida;  \r\n\r\n   \r\n   \r\n   \r\nse sis.nome == 'win32' entao  \/\/comandos de compilacao para Windows\r\n\r\nimprima'\\nCompilando em ambiente win32\\n';\r\n     \r\n     local dir = '\"'.. prismadir .. 'prismac.exe\\\" -o  \\\"' ..  arq_saida ..  '\" ';\/\/prismac -o saida.pbrexe\r\n     local cmd =  dir .. '  \"' .. Nome_arquivo .. '\" '; \r\n     \r\n      \/\/mudando diretorio corrente\r\n     local path_arquivo = str.separe(  Nome_arquivo , '\\\\' ) ;\r\n      se path_arquivo == nulo entao path_arquivo = '.' fim;\r\n      path_arquivo = path_arquivo .. '\\\\';    \r\n     \r\n shPath =  prismadir .. 'run_prismacod_script.bat'; \/\/unido a string path_arquivo com 'run...\r\n local run = es.abra(  shPath , 'escrita');\r\n  se run entao\r\n  run:escreva( '@ECHO OFF\\n');\r\n     run:escreva( cmd );\r\n     run:escreva(\"\\necho 'Processo terminado, verifique a saida'\");\r\n     run:escreva(\"\\npause\");\r\n     run:escreva(\"\\nexit\");      \r\n   run:feche(); \r\n fim  \r\n   \r\n    local exec = 'start \"\" \"' .. prismadir .. 'run_prismacod_script.bat\" '\r\n     imprima('Executando:\\n' .. exec );\r\n  sis.execute( exec );\r\n  \r\n  \r\n  \r\n  \r\nsenaose sis.nome == 'linux' entao  \/\/comando de compilacao para Linux\r\n\r\nimprima'\\nCompilando em ambiente linux\\n';\r\n\r\n\r\n     local dir =  'prismac -o  \\\"' ..  arq_saida ..  '\" ';   \/\/prismac -o saida.pbrexe\r\n \r\n     local cmd =  dir .. '  \"' .. Nome_arquivo .. '\" ';    \r\n     \r\n      \/\/mudando diretorio corrente\r\n     local path_arquivo = str.separe(  Nome_arquivo , '\/' ) ;\r\n      se path_arquivo == nulo entao path_arquivo = '.' fim;\r\n      path_arquivo = path_arquivo .. '\/';  \r\n      \r\n      shPath =  path_arquivo ..'run_prismacod_script.sh'  \r\n     \r\n local run = es.abra( path_arquivo .. 'run_prismacod_script.sh', 'escrita');\r\n      run:escreva( \"\\n\\n\" );\r\n      run:escreva( cmd );\r\n     \/\/ run:escreva(\"\\npause\\n\");\r\n     run:escreva( \"\\necho \\n echo\\necho \\\"Processo terminado, verifique a saida\\\"\\necho\");\r\n     run:escreva( \"\\necho \\\"Aperte &lt;ENTER&gt; para continuar...\\\" \\n\");   \r\n run:feche();  \r\n    exec = 'cd \"' .. path_arquivo ..'\"  &amp;&amp; ' .. 'xterm -e  \"bash run_prismacod_script.sh; read g \" &amp;';    \r\n   sis.execute( exec );\r\n   \r\n\r\nfim    \/\/fim se sis.nome == ...\r\n   \r\n       \r\nfim\r\n\r\nfuncao comando_novo ( )  \/\/novo arquivo\r\n   local text = '' ;  \r\n   ig.texto_buffer_def_texto ( buffer , text );\r\n   \/\/buffer \u00e9 um armazenador de texto, um ponteiro para manipular o texto de um editor.\r\n   ig.texto_area_def_buffer( editor, buffer);\r\n   atualiza_linguagem();\r\n   Nome_arquivo = nulo;\r\n   atualiza_titulo();\r\nfim\r\n\r\nfuncao comando_abrir()   \/\/abre um arquivo                                   \r\n      local ret = ig.dialogo_abrir(janela_principal) ;      \r\n      se ret == ig.ret_cancelar entao\r\n         imprima'Dialogo abrir cancelado'\r\n      senaose ret == ig.ret_fechar entao\r\n         imprima'Dialogo abrir fechado'\r\n      senao\r\n        Nome_arquivo = string.troque( ret , \"\\\"\" , \"\") ; \/\/tirando as aspas. \r\n        Nome_arquivo = string.troque ( Nome_arquivo , ' ' , ''); \/\/tirando os espacos\r\n                 \r\n        atualiza_titulo();        \r\n        arquivo_abrir( buffer , Nome_arquivo )       \r\n      fim  \r\nfim \/\/comando abrir()\r\n\r\n\/\/==============================  salvar\r\n\r\nfuncao comando_salvar( )\r\n \r\n  ig.componente_def_sensitivo( tool_salvar , falso);\r\n\r\n  se Nome_arquivo == nulo entao  \r\n     comando_salvar_como( nulo,nulo) ; \/\/usuario ainda tem que escolher um Nome_arquivo\r\n  senao\r\n     \/\/save the editor s text, useing the given Nome_arquivo\r\n    \r\n    local buffer = ig.texto_area_obt_buffer( editor );    \r\n    \r\n     \/\/existe um jeito baixo n\u00edvel complicado e um jeito f\u00e1cil de pegar o texto do editor veja:\r\n     \/\/local Inicio_txt , Fim_txt = ig.texto_buffer_obt_limites ( buffer, Inicio_txt, Fim_txt );     \r\n     \/\/local text = ig.texto_iter_obt_texto( Inicio_txt, Fim_txt );    \r\n     local text = ig.texto_area_obt_texto ( editor );\r\n     \r\n     local arquivo = es.abra( Nome_arquivo  , 'escrita' );   \r\n     \r\n     se arquivo entao   \r\n         arquivo:escreva( text );     \r\n         arquivo:feche();     \r\n         atualiza_titulo();  \r\n     fim \/\/fim se arquivo\r\n  \r\n  fim \/\/fim se Nome_arquivo\r\n  \r\n  retorne Nome_arquivo;\r\n\r\nfim\r\n\r\n\/\/==============================  salvar como\r\n\r\nfuncao comando_salvar_como  ( menu_item )  \r\n        \r\n   local ret = ig.dialogo_salvar ( janela_principal ,  'Salvar arquivo'  );   \r\n   \r\n   se ret == ig.ret_cancelar entao\r\n      poe'Salvar arquivo Prisma: cancelado';\r\n      \/\/ig.componente_def_sensitivo ( tool_salvar , verdadeiro);\r\n   senaose ret == ig.ret_fechar entao\r\n      poe'Salvar arquivo Prisma: fechado';\r\n      \/\/ig.componente_def_sensitivo ( tool_salvar , verdadeiro);\r\n   senao\r\n       Nome_arquivo = ret;\r\n      comando_salvar(nulo,nulo);\r\n   fim \/\/fim se\r\n      \r\n    \r\nfim \r\n\r\n\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/- Deseja sair?\r\nfuncao sair()\r\n\r\nse shPath entao\r\n  imprima( 'removendo --&gt;' , shPath );\r\n  sis.remova(shPath);\r\nfim\r\n\r\nse ig.componente_obt_sensitivo( tool_salvar ) entao \r\n\/\/caso o botao salvar esteja ativado o conte\u00fado alterado n\u00e3o foi salvo ainda:\r\n\r\n  \/\/criando um dialogo que pergunta se quer salvar ou nao, na unha:\r\n    local dial = ig.janela('Aten\u00e7\u00e3o' );\r\n    ig.janela_def_icone_arquivo ( dial ,  _Icone_prismacod );\r\n    ig.caixa_def_borda_largura( dial , 7 );\r\n    ig.janela_def_posicao( dial , ig.janela_pos_centro );\r\n    local vbox = ig.caixavertical(falso , 0 );\r\n     ig.ad( dial , vbox );\r\n\r\n    msg_box = ig.caixahorizontal( falso , 0 ); \r\n    \/\/criando uma caixa horizontal para icone e texto da mensagem\r\n    ig.ad( vbox , msg_box );\/\/adicionando-a na caixa vertical principal\r\n    \r\n    local image = ig.imagem_estoque( ig.estoque_dialogo_questao , 6 );\r\n    ig.ad( msg_box , image);\r\n    \r\n    local rotulo = ig.rotulo'\\nDeseja salvar as altera\u00e7\u00f5es antes de sair?\\n\\n';\r\n    ig.componente_modifique_fonte( rotulo , 'Arial' , 10 );\r\n    ig.caixa_ad( msg_box , rotulo , verdadeiro , verdadeiro , 4);\r\n    \r\n    hbox = ig.caixahorizontal( falso , 0 );\r\n    ig.caixa_ad( vbox , hbox , falso , falso , 2 );\r\n    \r\n    local bt_sim = ig.botao_estoque ( ig.estoque_sim ); \/\/sim salvar\r\n    ig.caixa_ad_inverso( hbox , bt_sim , verdadeiro , verdadeiro , 5 );\r\n    ig.conecte_funcao( bt_sim , ig.clique , \r\n         \/\/note que voce pode criar a funcao dentro do comando conecte_funcao\r\n         \/\/assim \u00e9 bom para chamar mais de uma funcao dentro dela ok\r\n         funcao(wid , jan ) \r\n           ig.componente_destrua(jan);\r\n           x = comando_salvar();\r\n           se x entao\r\n             sis.saia();\r\n           fim\r\n         fim , \r\n         \r\n         dial  \/\/este quarto arqumento \u00e9 o dado extra que na funao conectada \u00e9 o segundo parametro,\r\n               \/\/neste caso o jan\r\n     );\r\n    \r\n    local bt_nao = ig.botao_estoque( ig.estoque_nao ); \/\/nao sair direto\r\n    ig.caixa_ad_inverso( hbox , bt_nao , verdadeiro , verdadeiro , 5 );\r\n    ig.conecte_funcao ( bt_nao , ig.clique , funcao() sis.saia() fim , nulo );\r\n    \r\n    local bt_cancelar = ig.botao_estoque( ig.estoque_cancelar ); \/\/cancelar e voltar ao programa\r\n    ig.caixa_ad( hbox , bt_cancelar , verdadeiro , verdadeiro , 5 );\r\n    ig.conecte_funcao( bt_cancelar , ig.clique , funcao(wid , jan ) ig.componente_destrua(jan) fim , dial );\r\n    \r\n    \r\n    ig.componente_mostre_todos( dial );\r\n \r\n senao \/\/caso esteja desativado, j\u00e1 foi salvo, entao s\u00f3 pergunta se quer realmente sair:\r\n \r\n    local dialogo = ig.dialogo_mensagem( janela_principal, 'Aten\u00e7\u00e3o' , \r\n     '\\n\\nDeseja realmente sair?' ,\r\n     ig.msg_questao , \r\n     ig.botao_sim_nao \r\n   );\r\n\r\n   \r\n   local x = ig.dialogo_execute( dialogo );\r\n   ig.componente_destrua( dialogo );\r\n   \r\n   se x == ig.ret_sim entao \/\/  yes = -8 \/ no = -9\r\n      ig.saia();\r\n   senao\r\n       imprima'retornando ao programa';\r\n   fim\r\n \r\n fim \/\/fim se ig.widget_obt_sensitivo()\r\n   \r\n  retorne verdadeiro; \r\n  \/\/retornando verdadeiro em uma funcao com evento_delete a janela n\u00e3o fecha ao clicar no x.\r\nfim \/\/fim funcao sair()\r\n\r\n\r\nfuncao main()  \/\/funcao principal - criacao da interface e conex\u00e3o dos eventos as funcoes\r\n\r\njanela_principal = ig.janela(); \/\/cria uma outra janela comborda por padrao\r\n\r\nig.conecte_funcao( janela_principal , ig['evento_delete'] , sair , nulo );\r\n\r\n\r\nig.janela_def_icone_arquivo( janela_principal, _Icone_prismacod );\r\n\r\natualiza_titulo();\r\n\r\nig.conteiner_def_borda_largura ( janela_principal , 3 );\r\nig.janela_def_nome_icone_padrao('text-editor'); \/\/set a icon by name default\r\nig.janela_def_posicao( janela_principal , ig.janela_pos_centro ); \/\/show janela em center of screen\r\n\r\n\/\/bellow set the default size of janela ( janela, largura, altura )\r\nig.janela_def_tamanho_padrao ( janela_principal , 800 , 500 );\r\nig.janela_destrua( janela_principal ); \/\/do detroy program when main janela is closed\r\n\r\n\/\/ create a vertical caixa para menu e editor\r\ncaixavertical = ig.caixavertical( falso , 0 );\r\nig.conteiner_ad( janela_principal , caixavertical );\r\n\r\n\/\/create a accelerator grupo para mappin keyboard\r\naccel_grupo = ig.accel_grupo();\r\nig.janela_ad_accel_grupo ( janela_principal, accel_grupo);\r\n\r\n\/\/create a menu bar\r\nmenubar = ig.menu_barra();\r\nig.caixa_ad( caixavertical, \/\/a caixavertical container \r\n                   menubar, \/\/ig componente added\r\n                   falso, \/\/do nao give the child all the space\r\n                   falso, \/\/center the child\r\n                   0); \/\/pixels of padg around the child componente\r\n                   \r\n                   \r\n    \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n \r\n arquivo = ig.menu_item_mnemonico( \"_Arquivo\"); \/\/cria um item de menu com letra atalho\r\n ig.menu_shell_anexe( menubar , arquivo );\r\n \r\n arquivo_menu = ig.menu();\r\n ig.menu_item_def_submenu ( arquivo , arquivo_menu );   \r\n \r\n \/\/ create the novo menu item\r\n novo = ig.menu_imagem_estoque( ig.estoque_novo , accel_grupo );\r\n \r\n ig.componente_ad_accelerator( novo, \/\/componente\r\n                            ig.ativado , \/\/ signal to emit\r\n                            accel_grupo, \/\/accelerator grupo\r\n                            ig_n,  \/\/tecla N\r\n                            ig.mascara_control, \/\/tecla control + \r\n                            accel_visivel ); \/\/ flags\r\n                            \r\nig.menu_shell_anexe ( arquivo_menu , novo );\r\nig.conecte_funcao( novo ,  \/\/ componente conecteed\r\n                   ig.ativado,  \/\/ signal tipo\r\n                   comando_novo,\r\n                   nulo); \/\/ \r\n                   \r\n\r\nabrir = ig.menu_imagem_estoque( ig.estoque_abrir , accel_grupo  );\r\n\r\nig.componente_ad_accelerator( abrir , ig.ativado,\r\n                           accel_grupo,\r\n                           ig_o, \/\/tecla 'O' \u00e9 atalho para abrir\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n                           \r\nig.menu_shell_anexe( arquivo_menu , abrir );\r\nig.conecte_funcao( abrir , ig.ativado , comando_abrir , nulo );\r\n\r\nig.menu_shell_anexe( arquivo_menu , ig.menu_separador_item() );\r\n\r\n\/\/create the save menu item\r\nsave = ig.menu_imagem_estoque( ig.estoque_salvar, accel_grupo );\r\nig.componente_ad_accelerator( save,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_s,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\nig.menu_shell_anexe( arquivo_menu , save );\r\nig.conecte_funcao ( save, ig.ativado , comando_salvar , nulo );\r\n\r\n\/\/create the save as menu item\r\n\r\nsave_as = ig.menu_imagem_estoque( ig.estoque_salvar_como, accel_grupo );\r\nig.componente_ad_accelerator ( save_as,\r\n                            ig.ativado,\r\n                            accel_grupo,\r\n                            ig_s,\r\n                            ig.bit_ou( ig_shift_mask , ig.mascara_control) ,\r\n                            accel_visivel);\r\n\r\nig.menu_shell_anexe( arquivo_menu , save_as );\r\nig.conecte_funcao( save_as , ig.ativado, comando_salvar_como , nulo );\r\n\r\nig.menu_shell_anexe( arquivo_menu , ig.menu_separador_item()  );\r\n\r\n\/\/create the quit menu item\r\nquit = ig.menu_imagem_estoque( ig.estoque_sair , accel_grupo );\r\nig.componente_ad_accelerator ( quit,\r\n                            ig.ativado,\r\n                            accel_grupo,\r\n                            ig_q,\r\n                            ig.mascara_control,\r\n                            accel_visivel);\r\nig.menu_shell_anexe( arquivo_menu, quit );\r\n\r\nig.conecte_funcao( quit, ig.ativado , sair , nulo );\r\n\r\n\r\n\/\/create the tools menu\r\n\r\ntools = ig.menu_item_mnemonico( \"_Ferramentas\");\r\nig.menu_shell_anexe( menubar , tools );\r\ntools_menu = ig.menu ();\r\nig.menu_item_def_submenu( tools , tools_menu );\r\n\r\n\r\n\/\/create the execute comme menu item.\r\nexecute_command_menu_item = ig.menu_imagem_estoque(\r\n    ig.estoque_avancar ,\r\n    accel_grupo );\r\n    \r\nig.menu_item_def_rotulo( execute_command_menu_item,\r\n                        \"_Executar\" );\r\nig.componente_ad_accelerator( execute_command_menu_item,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_e,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n\r\n\r\n\/\/disable the item of menu\r\n\/\/ig.componente_def_sensitivo ( execute_command_menu_item , falso );\r\n\r\nig.menu_shell_anexe( tools_menu , execute_command_menu_item );\r\n\r\nig.conecte_funcao (   execute_command_menu_item , \/\/componente conectado\r\n                      ig.ativado, \/\/tipo de evento, equivale ao clique no menu, ou enter se for um entra texto\r\n                      comando_executar , \/\/funcao\r\n                      nulo  \/\/dado extra ou nulo \r\n   );\r\n   \r\n   \r\n \/\/compilar menu  \r\n   \r\ncompile_menu_item = ig.menu_imagem_estoque( ig.estoque_converter , accel_grupo );\r\n    \r\nig.menu_item_def_rotulo( compile_menu_item,\r\n                        \"Compilar\" );\r\nig.componente_ad_accelerator( compile_menu_item,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_x,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n\r\n\r\n\/\/disable the item of menu\r\n\/\/ig.componente_def_sensitivo ( execute_command_menu_item , falso );\r\n\r\nig.menu_shell_anexe( tools_menu , compile_menu_item );\r\n\r\nig.conecte_funcao (compile_menu_item,ig.ativado, comando_compilar , nulo );\r\n\r\n\r\n\r\n\r\n  \r\ncompileLib_menu_item = ig.menu_imagem_estoque( ig.estoque_saltar_para , accel_grupo );\r\n    \r\nig.menu_item_def_rotulo( compileLib_menu_item,\r\n                        \"Compi_lar Biblioteca Prisma\" );\r\nig.componente_ad_accelerator( compileLib_menu_item,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_l,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n\r\n\r\n\/\/disable the item of menu\r\n\/\/ig.componente_def_sensitivo ( execute_command_menu_item , falso );\r\n\r\nig.menu_shell_anexe( tools_menu , compileLib_menu_item );\r\n\r\nig.conecte_funcao (compileLib_menu_item,ig.ativado, comando_compilar , verdadeiro );\r\n\/\/passo o quarto argumento (dado extra) e assim \u00e9 poss\u00edvel saber que foi \r\n\/\/o item menu compilar lib, com isso posso controlar a extensao na funcao conectada.\r\n\r\n\r\n\r\n \r\n\/\/====================================   CARREGANDO OS PLUGINS NO MENU FERRAMENTAS =========\r\n\r\nse sis.nome == 'linux' entao\r\n\r\n    _Local_plugin = '\/usr\/local\/share\/prismacod\/plugins\/plugin_registro.prisma';\r\nsenaose sis.nome == 'win32' entao\r\n\r\n   _Local_plugin = prismadir .. 'prismacod_\/plugins\/plugin_registro.prisma';\r\n   \r\nfim\r\n\r\nlocal carregue_plugins = carreguearquivo( _Local_plugin );\r\n\r\nse carregue_plugins entao\r\n\r\n   carregue_plugins( { menu = tools_menu , accel_grupo = accel_grupo } );\r\n   \r\nsenao\r\n\r\n imprima'Erro ao carregar os plugins, verifique plugin_registro.prisma';\r\n   \r\n\r\nfim\r\n\r\n\r\n\r\n\r\n\r\n\r\n\/\/=====================================  FIM PLUGINS NO MENU FERRAMENTAS ==============\r\n\r\n\r\ntools = ig.menu_item_mnemonico( \"A_juda\");\r\nig.menu_shell_anexe( menubar , tools );\r\ntools_menu = ig.menu ();\r\nig.menu_item_def_submenu( tools , tools_menu );\r\n\r\n\/\/create the execute comme menu item.\r\nhelp_item = ig.menu_imagem_estoque(    ig.estoque_ajuda ,  accel_grupo );\r\n    \r\nig.menu_item_def_rotulo( help_item,\r\n                        \"So_bre\" );\r\nig.componente_ad_accelerator( help_item,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_b,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n\r\n\r\nig.menu_shell_anexe( tools_menu , help_item );\r\n\r\n\r\nfuncao mostrar_sobre( componente , data) \r\n\r\npixbuf = ig.pixbuf_arquivo( _Icone_prismacod ); \/\/image fixbuf from arquivo\r\n\r\ndialogo = ig.dialogo_sobre();  \/\/creating about dialogo\r\nig.janela_def_icone_pixbuf( dialogo,  pixbuf);\r\nig.janela_def_posicao( dialogo, ig.janela_pos_centro);\r\nig.dialogo_sobre_def_nome( dialogo , 'Prismacod Editor'); \/\/set name of it\r\nig.dialogo_sobre_def_versao( dialogo , \"0.3\"); \/\/ set version\r\nig.dialogo_sobre_def_copyright( dialogo , \"\u00a9 Adalberto 2014-2015\"); \/\/copyright\r\nig.dialogo_sobre_def_comentario( dialogo , \r\n \"Um Simples editor para a linguagem Prisma\\nVisite o site &lt;linguagemprisma.net&gt;\\n E-mail: &lt;adalbermirom@hotmail.com&gt;\"); \/\/comments \r\nig.dialogo_sobre_def_site( dialogo , 'http:\/\/www.linguagemprisma.net'); \/\/web site\r\nig.dialogo_sobre_def_imagem( dialogo , pixbuf ); \/\/ set image logo\r\n\r\nse pixbuf entao\r\n ig.objeto_desref( pixbuf ); \/\/ free the pixbuf\r\nfim\r\npixbuf = nulo; \/\/destroy pixbuf reference\r\n\r\nig.janela_def_titulo( dialogo , \"Sobre o Editor Prismacod\"); \/\/ set titulo of dialogo\r\n\r\n\/\/executing the dialogo e put retorne botao em x variable\r\nx = ig.dialogo_execute( dialogo ); ig.componente_destrua( dialogo);\r\n\/\/imprima(x); \/\/ botao close = -6 , close janela botao = -4\r\n\r\nfim \/\/fim funcao mostre_sobre\r\n\r\nig.conecte_funcao(         help_item  ,  ig.ativado,mostrar_sobre, janela_principal  ) ; \r\n\/\/criando a barra de ferramenta \r\n\r\n\r\n\/\/menu manual. apenas no windows\r\nse sis.nome == 'win32' entao\r\n\r\nmanual_item = ig.menu_imagem_estoque(    ig.estoque_arquivo ,  accel_grupo );\r\n    \r\nig.menu_item_def_rotulo( manual_item,\r\n                        \"Abrir _Manual\" );\r\nig.componente_ad_accelerator( manual_item,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_m,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n\r\n\r\nig.menu_shell_anexe( tools_menu , manual_item );\r\nig.conecte_funcao( manual_item , ig.ativado , \r\nfuncao () sis.execute('start ' .. prismadir .. 'doc\\\\manual_basico_prisma_1.0.pdf') fim\r\n);\r\n\r\nfim \/\/fim se win\r\n\r\n\r\n\/\/menu licen\u00e7a\r\n\r\nlicenca_item = ig.menu_imagem_estoque(    ig.estoque_arquivo ,  accel_grupo );\r\n    \r\nig.menu_item_def_rotulo( licenca_item,\r\n                        \"Abrir L_icen\u00e7a\" );\r\nig.componente_ad_accelerator( licenca_item,\r\n                           ig.ativado,\r\n                           accel_grupo,\r\n                           ig_i,\r\n                           ig.mascara_control,\r\n                           accel_visivel);\r\n                           \r\n                           \r\nfuncao jan_licenca()\r\n  local j = ig.janela('Arquivo de licen\u00e7a' , 800 , 200);\r\n  ig.janela_def_posicao( j , ig.janela_pos_centro );\r\n  \r\n  \r\n local janela_rolagem = ig.janela_rolagem( nulo , nulo );\r\n ig.ad( j , janela_rolagem );\r\nig.janela_rolagem_def_policiamento ( janela_rolagem , \r\n                                ig.automatico, \/\/horizontal\r\n                                ig.automatico ); \/\/vertical\r\n                                \r\n local edit = ig.texto_area();\r\n ig.texto_area_def_editavel ( edit , falso ); \/\/texto n\u00e3o \u00e9 edit\u00e1vel.\r\n ig.componente_modifique_fonte( edit , 'monospace', 11 );\r\n ig.ad( janela_rolagem , edit );\r\n \r\n   local cor = ig.cor_analise(ig.azul);\r\n   ig.componente_modifique_corletra( edit , ig.estado_normal , cor )\r\n    \r\n  local buff = ig.texto_area_obt_buffer( edit );\r\n  ig.texto_buffer_def_texto ( buff, _Licenca );\r\n  ig.texto_area_def_buffer( edit, buff);\r\n  \r\n  ig.componente_mostre_todos( j );\r\nfim\r\n\r\n\r\nig.menu_shell_anexe( tools_menu , licenca_item );\r\nig.conecte_funcao( licenca_item , ig.ativado , jan_licenca , nulo );\r\n\r\n\r\nbarraferramenta = ig.barraferramenta();\r\nig.barraferramenta_def_estilo( barraferramenta, 'icons');\r\n\r\nig.conteiner_def_borda_largura( barraferramenta, 2 );\r\n\r\ntool_novo = ig.ferramenta_botao_estoque(ig.estoque_novo);\r\nig.barraferramenta_ad( barraferramenta , tool_novo , -1);\r\nig.componente_def_dica_texto( tool_novo,\"Novo\");\r\n\r\nig.conecte_funcao (tool_novo , ig.clique , comando_novo , nulo );\r\n\r\ntool_abrir = ig.ferramenta_botao_estoque(ig.estoque_abrir);\r\nig.barraferramenta_ad( barraferramenta , tool_abrir , -1);\r\nig.componente_def_dica_texto( tool_abrir,\"abrir\");\r\nig.conecte_funcao (tool_abrir , ig.clique , comando_abrir , nulo );\r\n\r\ntool_salvar = ig.ferramenta_botao_estoque(ig.estoque_salvar);\r\nig.barraferramenta_ad( barraferramenta , tool_salvar , -1);\r\nig.componente_def_dica_texto( tool_salvar,\"salvar\");\r\nig.conecte_funcao (tool_salvar , ig.clique ,  comando_salvar , nulo);\r\n\r\n\r\ntool_salvar_como = ig.ferramenta_botao_estoque(ig.estoque_salvar_como);\r\nig.barraferramenta_ad( barraferramenta , tool_salvar_como , -1);\r\nig.componente_def_dica_texto( tool_salvar_como ,\"salvar como\");\r\nig.conecte_funcao (tool_salvar_como , ig.clique ,  comando_salvar_como , nulo);\r\n\r\ntool_sep = ig.separador_ferramenta_item();\r\nig.barraferramenta_ad( barraferramenta , tool_sep  , -1);\r\n\r\ntool_execute = ig.ferramenta_botao_estoque(ig.estoque_avancar);\r\nig.barraferramenta_ad( barraferramenta, tool_execute, -1);\r\nig.componente_def_dica_texto( tool_execute,\"executar\");\r\nig.conecte_funcao( tool_execute,ig.clique, comando_executar , nulo );\r\n\r\ntool_sep = ig.separador_ferramenta_item();\r\nig.barraferramenta_ad( barraferramenta , tool_sep  , -1);\r\n\r\ntool_compilar = ig.ferramenta_botao_estoque(ig.estoque_converter);\r\nig.barraferramenta_ad( barraferramenta, tool_compilar, -1);\r\nig.componente_def_dica_texto( tool_compilar,\"Compilar\");\r\nig.conecte_funcao ( tool_compilar,ig.clique, comando_compilar , nulo );\r\n\r\ntool_compilarLib = ig.ferramenta_botao_estoque(ig.estoque_saltar_para);\r\nig.barraferramenta_ad( barraferramenta, tool_compilarLib, -1);\r\nig.componente_def_dica_texto( tool_compilarLib,\"Compilar uma biblioteca din\u00e2mica Prisma\");\r\nig.conecte_funcao ( tool_compilarLib,ig.clique, comando_compilar , verdadeiro );\r\n\r\ntool_sep = ig.separador_ferramenta_item();\r\nig.barraferramenta_ad( barraferramenta , tool_sep  , -1);\r\n\r\ntool_font = ig.ferramenta_botao_estoque( ig.estoque_selecionar_fonte);\r\nig.barraferramenta_ad( barraferramenta, tool_font , -1 )\r\nig.componente_def_dica_texto( tool_font, \"Defina A fonte do texto\");\r\n\r\nfuncao select_font( bt )\r\n  local  dialogo = ig.dialogo_fonte(\"Selecionar Fonte\");\r\n   result = ig.dialogo_execute( dialogo );   \r\n   se result == ig.ret_ok ou result == ig.ret_aplicar entao   \r\n     fontname = ig.dialogo_fonte_obt_nome( dialogo ); \/\/retornes a string          \r\n     font_desc = ig.fonte_descricao_string( fontname ); \/\/convert string to font description     \r\n     ig.componente_modifique_fonte( editor , font_desc );     \r\n     fontname = nulo;   \r\n    fim\r\n    ig.componente_destrua(dialogo);\r\nfim\r\n\r\nig.conecte_funcao( tool_font , ig.clique , select_font, nulo ); \r\n\r\ntool_sair = ig.ferramenta_botao_estoque( ig.estoque_sair );\r\nig.barraferramenta_ad( barraferramenta , tool_sair , -1);\r\nig.componente_def_dica_texto( tool_sair, \"Sair do Prismacod\");\r\nig.conecte_funcao (tool_sair , ig.clique , sair , nulo );\r\n\r\n\/\/adicionando a barraferramenta no vertical caixa\r\nig.caixa_ad( caixavertical,barraferramenta, falso, falso,0 );\r\n\r\n\/\/ search\r\nig.botao_mostre_imagem( verdadeiro );\r\n\r\ncaixah = ig.caixahorizontal( falso, 0 );\r\n\r\n\/\/criando o caixa de selec\u00e3o de linguagem\r\nrotulo = ig.rotulo'Definir linguagem:';\r\nig.caixa_ad( caixah, rotulo , falso, falso, 0);\r\n\r\ncombo = ig.caixa_combo(\"prismabr\");\r\nig.componente_def_tamanho( combo , 100 , 10 )\r\n\r\nig.caixa_ad( caixah , combo, falso , falso , 0);\r\n\r\n\/\/ig.caixa_combo_anexe_texto( combo, 'prismabr');\r\nig.caixa_combo_anexe_texto( combo, 'prismaen');\r\n\r\nig.caixa_combo_anexe_texto( combo,'ada');\r\nig.caixa_combo_anexe_texto( combo, 'c');\r\nig.caixa_combo_anexe_texto( combo, 'cpp');\r\nig.caixa_combo_anexe_texto( combo,'html');\r\nig.caixa_combo_anexe_texto( combo,'java');\r\nig.caixa_combo_anexe_texto( combo,'javascript');\r\n\r\nig.caixa_combo_anexe_texto( combo, 'lua');\r\nig.caixa_combo_anexe_texto( combo, 'php');\r\nig.caixa_combo_anexe_texto( combo, 'python');\r\nig.caixa_combo_anexe_texto( combo,'perl');\r\n\r\nig.caixa_combo_anexe_texto( combo,'pascal');\r\nig.caixa_combo_anexe_texto( combo,'sql');\r\nig.caixa_combo_anexe_texto( combo,'styles');\r\n\r\nig.caixa_combo_anexe_texto( combo,'scheme');\r\nig.caixa_combo_anexe_texto( combo,'sh');\r\nig.caixa_combo_anexe_texto( combo,'tcl');\r\n\r\nig.caixa_combo_anexe_texto( combo,'vala');\r\nig.caixa_combo_anexe_texto( combo,'vbnet');\r\nig.caixa_combo_anexe_texto( combo, 'xml');\r\n\r\nig.conecte_funcao ( combo , ig.modificado , atualiza_linguagem , nulo );\r\n\/\/o evento modificado,(selecionando) executa a funcao para atualizar_linguagem\r\n\r\nentra_texto_localizar = ig.texto();\r\nig.caixa_ad( caixah , entra_texto_localizar, falso,verdadeiro,1);\r\nig.caixa_ad( caixavertical, caixah , falso , verdadeiro , 0);\r\nbotao_localizar = ig.botao_estoque(ig.estoque_localizar );\r\n\/\/ig.botao_def_imagem( botao_localizar, search_image, 3);\r\nig.caixa_ad( caixah, botao_localizar,falso ,falso,0);\r\n\r\n\/\/SEARCH funcao \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/-\r\n\r\n\r\nfuncao procurar_palavra (wid,  texto_s )   \r\n\r\n   se texto_s == nulo entao texto_s = wid fim;\r\n\r\n   local abuffer = ig.texto_area_obt_buffer( editor );\r\n  \r\n  \/\/definindo o escopo visivel dentro da funcao procurar_palavra\r\n   \r\n   local iter_inicio_busca = nulo;\r\n   local iter_fim_busca = nulo\r\n   local iter_inicio_comparacao = nulo;\r\n   local iter_fim_comparacao = nulo;\r\n\r\n se ig.texto_obt_texto( texto_s) == '' entao \r\n         \/\/ig.texto_iter_libere( ultima_posicao );\r\n         ultima_posicao = falso;\r\n fim\r\n\r\n   se  ultima_posicao entao \/\/se ultima_posicao for v\u00e1lido \u00e9 por que j\u00e1 foi pesquisado antes e guardada a ultima posicao   \r\n   \r\n    imprima'ultima_posicao atribuida';        \r\n             ultima_posicao = ig.texto_buffer_obt_marcador( abuffer , \"ultima_posicao\")  ;\r\n             iter_inicio_busca = ig.texto_buffer_obt_iter_no_marcador( abuffer, ultima_posicao );\r\n             \r\n   senao   \r\n              iter_inicio_busca = ig.texto_buffer_obt_iter_inicial( abuffer );\r\n   fim\r\n   \r\n   \r\n  \r\n   iter_fim_busca = ig.texto_buffer_obt_iter_final( abuffer); \/\/pega o limite final do texto em um iterador\r\n   \r\n   ig.texto_buffer_remova_tag_por_nome( abuffer, cor_palavra_encontrada , iter_inicio_busca, iter_fim_busca );   \r\n                                           \r\n                                           \r\n   local palavra_procurada = ig.texto_obt_texto( texto_s ); \r\n   \r\n   \r\n   \r\n  iter_inicio_comparacao , iter_fim_comparacao , teste   =\r\n        \r\n        ig.texto_iter_localize_proximo(       \r\n                   iter_inicio_busca,  \/\/ponto inicial de busca um iterador previamente criado\r\n                   palavra_procurada , \/\/string a ser procurada\r\n                   ig.bit_ou( ig.texto_pesquise_somente_texto, ig.texto_pesquise_somente_visiveis),  \r\n                   \/\/modos de busca, quando mais de um use o ig.bit_ou\r\n                   iter_fim_busca \/\/ultimo parametro \u00e9 o limite da busca um iterador previamente criado\r\n       );\r\n       \r\n \/\/ veja que s\u00e3o tres retornos, os dois primeiros iteradores, o ultimo um falso ou verdadeiro;\r\n               \r\n           \r\n   \r\n   \r\n   \r\n se  teste entao           \r\n           \/\/um marcador serve para salvar a ultima posicao para que a proxima busca \r\n           \/\/n\u00e3o seja do in\u00edcio mas da ultima palavra encontrada\r\n             ultima_posicao = ig.texto_buffer_crie_marcador( abuffer, 'ultima_posicao', iter_fim_comparacao, falso );\r\n\r\n             ig.texto_area_deslize_marcador_natela (editor ,  ultima_posicao ); \/\/ultima_posicao); \/\/go to the line of word searched\r\n                               \r\n             ig.texto_buffer_aplique_tag_por_nome( abuffer, cor_palavra_encontrada, iter_inicio_comparacao, iter_fim_comparacao );\r\n                 \r\n             pos_num = ig.texto_iter_obt_comprimento( iter_fim_comparacao );\r\n             imprima( pos_num );               \r\n\r\n senao \r\n    \r\n   local dialogo = ig.dialogo_mensagem( janela_principal , 'Aten\u00e7\u00e3o' ,\r\n    \"N\u00e3o houve mais retorno ...\\n\\nDeseja reiniciar a busca do in\u00edcio?\" , \r\n    ig.msg_questao , \r\n    ig.botao_sim_nao  \r\n    );\r\n    \r\n    local ret = ig.dialogo_execute( dialogo );\r\n    ig.componente_destrua( dialogo );\r\n    \r\n     se ret == ig.ret_sim entao \r\n       iter_inicio_busca = ig.texto_buffer_obt_iter_no_comprimento( abuffer , 0 ); \r\n          ig.texto_buffer_remova_tag_por_nome( abuffer, cor_palavra_encontrada , iter_inicio_busca, iter_fim_busca ); \r\n         \r\n         \/\/a ultima posicao agora \u00e9 o inicio do texto\r\n         ultima_posicao = ig.texto_buffer_crie_marcador( abuffer, 'ultima_posicao', iter_inicio_busca, falso ); \r\n         procurar_palavra (wid,  texto_s ); \/\/chamando a propria funcao dela mesma. \r\n         \r\n     fim\r\n\r\n         \/\/ ig.dialogo_mensagem( janela_principal , ig.questao , ' ' , \"Nenhum retorno\");        \r\n      \r\n    fim \/\/ se   \r\n  \r\n   ig.texto_iter_libere( iter_inicio_busca );\r\n   ig.texto_iter_libere( iter_fim_busca );\r\n   ig.texto_iter_libere( iter_inicio_comparacao);\r\n   ig.texto_iter_libere( iter_fim_comparacao );\r\n     \r\nfim\r\n\r\nig.conecte_funcao ( botao_localizar,ig.clique, procurar_palavra , entra_texto_localizar ); \/\/clicando o botao localizar\r\nig.conecte_funcao ( entra_texto_localizar, ig.ativado, procurar_palavra , nulo ); \/\/clicando o enter\r\n              \r\n\/\/create a scrollable area para the editor.\r\njanela_rolagem = ig.janela_rolagem( nulo , nulo );\r\nig.janela_rolagem_def_policiamento ( janela_rolagem , \r\n                                ig.automatico, \/\/horizontal\r\n                                ig.automatico ); \/\/vertical\r\n                   \r\nig.caixa_ad( caixavertical, janela_rolagem,\r\n              verdadeiro, \/\/caixavertical gives componente all remaining space\r\n              verdadeiro, \/\/ componente expands to fill given space\r\n              0);   \/\/ pixel of padg around the componente\r\n              \r\n   lm = ig.codigo_gerenciador_linguagem();\r\n   buffer = ig.codigo_buffer ();\r\n              \r\neditor =  ig.codigo_area_com_buffer( buffer ); \r\n\r\n_Editor_ = editor;\r\n\/\/cria um novo editor de fonte com buffer\r\n\r\nig.ad( janela_rolagem , editor ); \r\nig.codigo_area_def_auto_indent( editor , verdadeiro );\r\n\r\n\/\/definindo indentacao (recuo) de 2 espacos\r\nig.codigo_area_def_largura_indent ( editor, 2 ) ;\r\n\/\/destacando a linha atual\r\nig.codigo_area_def_destaque_linha_atual( editor , verdadeiro );\r\n\/\/mostrando os numeros de linhas, falso oculta\r\nig.codigo_area_def_mostre_numero_linhas ( editor , verdadeiro );\r\n\/\/define aquela linha vertical na margem direita\r\nig.codigo_area_def_margem_direita_posicao( editor, 80 );\r\n\/\/definindo a linha de margem direita como visivel\r\nig.codigo_area_def_mostre_margem_direita( editor , verdadeiro );\r\n\/\/faz com que a linha quebre ao chegar no fim da margem, falso desabilita\r\nig.codigo_area_def_modo_disposicao( editor, ig.modo_quebre_linha );\r\n\r\n\/\/font = ig.fonte_descricao ();\r\n\/\/ig.fonte_descricao_def_familia( font , 'monospace' );\r\n\/\/ig.componente_modifique_fonte( editor , font );\r\n\r\nfont2 = ig.fonte_descricao_string( \"monospace\" , 11);\r\nig.componente_modifique_fonte( editor, font2);\r\n\r\nig.componente_def_foco( editor );\r\n\r\n\r\nfuncao comando_sensitivo( wid , dado ) \/\/dado = tool salvar\r\nlocal dado = dado;\r\n     ig.componente_def_sensitivo ( dado , verdadeiro);\r\n fim\r\nig.conecte_funcao( buffer ,ig.modificado ,  comando_sensitivo , tool_salvar  );\r\n\r\n\/\/cria uma tag de cor fundo para o texto encontrado no campo busca\r\ncor_palavra_encontrada = ig.texto_area_crie_tag( buffer, ig['tag_corfundo'] , ig.amarelo );\r\n\r\n\r\n\r\nig.componente_ad_eventos( editor , ig.botao_mascara_pressionado); \/\/como o componente codigo_area\r\n\/\/assim como o texto_area n\u00e3o possuem o evento clicar, temos que adicion\u00e1-lo\r\nig.conecte_funcao ( editor , ig.botao_evento_pressionado , \r\n  funcao()   \r\n\r\n   local iter_inicio_busca = ig.texto_buffer_obt_iter_inicial( buffer);\r\n   local iter_fim_busca = ig.texto_buffer_obt_iter_final( buffer); \/\/pega o limite final do texto em um iterador  \r\n    \r\n   ig.texto_buffer_remova_tag_por_nome( buffer, cor_palavra_encontrada , iter_inicio_busca, iter_fim_busca );   \r\n            \r\n\r\n  fim , \r\n\r\nnulo);\r\n\r\n\r\n\r\n\/\/caso seja passado um argumento ele \u00e9 aberto\r\nse args[1] entao \/\/args[1] \u00e9 o primeiro argumento passado.\r\nNome_arquivo = args[1];\r\natualiza_titulo();\r\narquivo_abrir( buffer, args[1]);\r\nsenao\r\n arquivo_abrir( buffer);\r\nfim\r\nig.componente_mostre_todos( janela_principal );  \/\/ mostra a janela e seus componentes filhos\r\nig.fimprograma(); \/\/inicia o laco de eventos\r\n\r\nfim \/\/fim main();\r\n\r\nmain(); \/\/iniciando o aplicativo\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Estou disponibilizando o c\u00f3digo fonte do prismacod, ap\u00f3s v\u00e1rias sess\u00f5es de corre\u00e7\u00f5es. Ainda cont\u00e9m algumas limita\u00e7\u00f5es, mas \u00e9 um \u00f3timo meio de estudos para aperfei\u00e7oamento deste pequeno editor. Por enquanto ele est\u00e1 com 1213 linhas de comando em arquivo \u00fanico, isto pode ser melhorado dividindo-o em v\u00e1rias partes e um programa principal. Tem caracter\u00edsticas&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,5],"tags":[],"class_list":["post-1224","post","type-post","status-publish","format-standard","hentry","category-igprisma","category-interface_grafica"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=1224"}],"version-history":[{"count":3,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1224\/revisions"}],"predecessor-version":[{"id":1227,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1224\/revisions\/1227"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=1224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=1224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=1224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}