{"id":1228,"date":"2015-06-19T18:06:08","date_gmt":"2015-06-19T22:06:08","guid":{"rendered":"http:\/\/linguagemprisma.net\/blog\/?p=1228"},"modified":"2015-06-21T21:06:34","modified_gmt":"2015-06-22T01:06:34","slug":"criando-um-plugin-para-o-prismacod","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/igprisma\/criando-um-plugin-para-o-prismacod\/","title":{"rendered":"Criando um plugin para o prismacod"},"content":{"rendered":"<p>O plugin \u00e9 um script prisma podendo ser ou n\u00e3o compilado.<\/p>\n<p>Ele passa uma tabela com valores e uma fun\u00e7\u00e3o, possui um elemento rotulo que \u00e9 o texto a ser mostrado no menu ferramentas do prismacod.<\/p>\n<p>Vamos criar um plugin bem b\u00e1sico, veja o c\u00f3digo:<\/p>\n<pre class=\"lang:prisma decode:true\">retorne {\/\/ tabela plugin de retorno\r\n\r\nnome = 'plugin minimo' ; \/\/nome do plugin para mensagem de erro\r\n\r\nrotulo = 'minimo' ; \/\/texto que aparecera no menu-&gt;ferramentas\r\n\r\n\r\nfunc = funcao()\r\n   \r\n    ig.msg( nulo , 'Plugin minimo' , 'Plugin minimo executado' );\r\n\r\nfim\r\n\r\n} \/\/fim tabela plugin de retorno\r\n\r\n\/\/nao esqueca que \u00e9 necessario registrar o plugin no arquivo\r\n\/\/plugin_registro.prisma para funcionar;\r\n<\/pre>\n<p>Salve com o nome minimo.prisma, coloque-o no diret\u00f3rio padr\u00e3o de plugins do prismacod:<\/p>\n<p>Linux: \u00a0\/usr\/local\/share\/prisacod\/plugins\/<\/p>\n<p>(No Linux, precisa abrir o explorador de arquivos em modo sudo, ex: sudo nautilus \u00a0ou \u00a0sudo caja \u00a0 no Mint. para copiar com privil\u00e9gios o seu plugin para a pasta do prismacod.<\/p>\n<p>Use o terminal se preferir:<\/p>\n<p><strong>sudo \u00a0cp \u00a0caminho\/do\/meu_plugin.prisma \u00a0 \/usr\/local\/share\/prismacod\/plugins\/ <\/strong><\/p>\n<p>coloque a senha e pressione enter.<strong>\u00a0<\/strong>) Pode criar uma pasta se quiser, exemplo testes\/<\/p>\n<p>Windows = Prisma\/1.0\/bin\/prismacod_\/plugins\/<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p><strong>Ap\u00f3s salvar no diret\u00f3rio de plugins, no mesmo local tem um arquivo chamado &#8216;plugin_registro.prisma&#8217; , \u00e9 necess\u00e1rio registrar o nome de seu plugin nele para que tenha efeito no prismacod, nesta parte do arquivo:<\/strong><\/p>\n<pre class=\"lang:prisma decode:true \">local _Nome_plugins = {\r\n\r\n'exemplos\/template_plugin.prisma' , \r\n\/\/'mudar_tema\/inic.prisma' \r\n'exemplos\/minimo.prisma' , \/\/um pequeno teste para ver a base de criacao de plugins\r\n\/\/'exemplos\/abre_registro.prisma' , \/\/abre o arquivo plugin_registro.prisma\r\n\r\n\r\n\r\n\r\n} \/\/fim tabela de nome dos plugins<\/pre>\n<p>Lembrando que \u00e9 necess\u00e1rio estar no modo super usu\u00e1rio em Linux para alterar o arquivo.<\/p>\n<p>(Voc\u00ea pode digitar o comando no terminal: sudo prismacod;)<\/p>\n<p>Vou ver se eu fa\u00e7o um plugin para abrir o prismacod em sudo no linux e colocar a atualiza\u00e7\u00e3o. &lt;aqui&gt;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Caso haja erro no plugin n\u00e3o interromper\u00e1 o prismacod, apenas surgir\u00e1 uma mensagem.<\/p>\n<p>O plugin \u00e9 como um segundo programa, \u00e9 ilimitado, pode criar quantas novas janelas quiser na fun\u00e7\u00e3o principal do plugin, s\u00f3 n\u00e3o pode usar o fimprograma() pois este comando j\u00e1 \u00e9 usado no prismacod n\u00e3o podendo ser duplicado, tamb\u00e9m, se n\u00e3o conecte o m\u00e9todo sair na janela do plugin, nem use o ig.janela_destrua( ) nele pois caso o fa\u00e7a, ao fechar o plugin o prismacod ser\u00e1 encerrado junto.<\/p>\n<p>Obs.: n\u00e3o se esque\u00e7a de separar os elementos da tabela de retorno com v\u00edrgulas ou ponto-e-v\u00edrgulas.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>Note que \u00e9 simples, basta escrever retorne e abrir uma chave, colocar os elementos e fechar a chave.<\/p>\n<p>Os elementos podem ser:<\/p>\n<p>nome &#8211; (string) um nome para o plugin a ser mostrado na mensagem de erro caso o tenha.<\/p>\n<p>rotulo \u00a0&#8211; (string) \u00e9 o nome que aparecer\u00e1 no menu ferramentas do prismacod<\/p>\n<p>func &#8211; (funcao) a fun\u00e7\u00e3o que ser\u00e1 executada ao clicar no nome do plugin no menu ferramentas.<\/p>\n<p>A fun\u00e7\u00e3o pode ser criada antes do &#8216;retorne&#8217; e apenas ser associada ao nome dentro da tabela, assim:<\/p>\n<p>func = execute_plugin; \u00a0 \/\/por exemplo.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Abaixo outro c\u00f3digo de plugin para estudos:<\/p>\n<pre class=\"lang:prisma decode:true\">\/\/template_plugin teste de plugin by Adalberto Amorim Felipe\r\n\r\n\r\n\/\/uma funcao local para reponder ao botao\r\nlocal \tFUNC_BOTAO = funcao(wid , jan)\r\n        \r\n\/\/para acessar o editor use com muito cuidado a variavel _Editor_ .\r\n\r\nlocal txt = ig.texto_area_obt_texto ( _Editor_ ) ou 'nao tem texto' ;\r\n\r\n         ig.msg( jan , 'Botao' , txt );\r\nfim \/\/fim funcao\r\n\r\n\r\n\/\/essa funcao ser\u00e1 passada como func dentro da tabela de retorno\r\nlocal execute_plugin = funcao(dado_extra) \r\n   imprima( dado_extra);\r\n   \r\n   local jan = ig.janela('teste de plugin',400 , 250 );\r\n   ig.janela_def_icone_arquivo( jan , _Pasta_plugins_ .. 'exemplos\\\\logo.jpg' );\r\n   local fixo = ig.fixo();\r\n   ig.ad( jan , fixo);\r\n   local bt = ig.botao'clique me';\r\n   ig.fixo_ad( fixo , bt , 10 , 29 );\r\n\r\n   local img = ig.imagem_arquivo( _Pasta_plugins_ .. 'exemplos\\\\logo.jpg' );\r\n   ig.fixo_ad( fixo , img , 90 , 20);\r\n\r\n\r\n   ig.conecte_funcao( bt , ig.clique , FUNC_BOTAO  , jan ); \r\n\/\/nao passamos dado extra para call back do botao\r\n\r\n\r\n   ig.janela_def_posicao( jan , ig.janela_pos_centro);\r\n   ig.componente_mostre_todos( jan );\r\nfim\r\n\r\n\r\n\/\/separe por virgula cada item do plugin:\r\n\r\n\r\n\r\n\r\n\/\/tabela de retorno do plugin\r\n\r\n\r\nretorne {\r\n\r\nnome = 'exemplo template_plugin.prisma' , \/\/nome do plugin que aparece caso haja mensagem de erro\r\n\r\nrotulo = 'teste de plugin' ,  \/\/o texto que ir\u00e1 aparecer no menu\r\n\r\nestoque = ig.estoque_ok ,   \/\/imagem do estoque que aparecera no menu, No Ubuntu nao \u00e9 vis\u00edvel devido ao tema\r\n\r\n\/\/nao esqueca das virgulas, \r\n\r\ntecla_atalho = ig_y ,  \r\n\/\/ a tecla de atalho que aparecera no menu Y\r\n\r\ntecla_modo = ig.mascara_control , \r\n\/\/atalho para tecla control -&gt; CTRL + Y\r\n\r\nfunc = execute_plugin , \/\/passando a funcao principal do plugin\r\n\r\n\r\ndado_extra = 'O plugin executado com sucesso'\r\n\r\n\r\n\r\n} \/\/fim plugin\r\n<\/pre>\n<p>Observe que aqui foram introduzidos novos componentes \u00e0 tabela de retorno do plugin:<\/p>\n<p>estoque = imagem de estoque para o menu<\/p>\n<p>tecla_atalho = pode ser de ig_a at\u00e9 ig_z<\/p>\n<p>tecla_modo = caso queira um atalho do tipo CTRL + A<\/p>\n<p>use: \u00a0 tecla_atalho = ig_a \u00a0;<\/p>\n<p>tecla_modo = ig.mascara_control ;<\/p>\n<p>temos tamb\u00e9m um dado extra para a fun\u00e7\u00e3o principal do plugin:<\/p>\n<p>dado_extra = \u00a0dado (pode ser qualquer tipo, at\u00e9 nulo );<\/p>\n<p>&nbsp;<\/p>\n<p>Abaixo o c\u00f3digo do plugin de mudar tema que eu fiz, por enquanto s\u00f3 para Windows:<\/p>\n<pre class=\"lang:prisma decode:true \">\/\/plugin para mudar o tema do gtk\r\n\r\n\r\ndir = inclua'igdir';\r\n\r\n\r\n\/\/funcao principal do plugin:\r\n\r\nlocal plugin_execute = funcao()\r\n\r\n  local temadir = string.troque ( prismadir , 'bin' , 'share\\\\themes' );\r\n\r\n  imprima(temadir);\r\n\r\n  local tema = dir.liste_arquivos( temadir );\r\n\r\n\r\n \/\/listando os diretorios cujo nome \u00e9 o comando de mudar o tema\r\n\r\n \/\/o arquivo que \u00e9 reponsavel por mudar o tema \u00e9 C:\\Prisma\\BR\\etc\\gtk-2.0\\gtkrc\r\n\r\n \/\/sem extens\u00e3o mesmo s\u00f3 gtkrc\r\n\r\n \/\/alterando o conte\u00fado dele podemos mudar o tema do gtk\r\n\r\n\r\n  local conf_tema_dir = string.troque ( prismadir , \"bin\" , 'etc\\\\gtk-2.0\\\\' )  ; \/\/ainda nao entendi por que depois da bin tem tr\u1ebds barras, mas vou consertar futuramente.\r\n\r\n  local conf_tema_dir = conf_tema_dir .. 'gtkrc';\r\n\r\n  imprima( conf_tema_dir );\r\n\r\n  local arq = es.abra(conf_tema_dir , 'leitura' );\r\n\r\n  tema_definido = arq:leia('*t' ); \/\/l\u00ea tudo\r\n\r\n  arq:feche() ; \/\/fechando o arquivo. \r\n\r\n \/\/note que para ler e fechar precisamos usar os dois pontos, ok\r\n\r\n \/\/o conte\u00fado ser\u00e1 algo como:  gtk-theme-name = \"MS-Windows\"\r\n\r\n \/\/temos que processar para extrair somente o que esta entre aspas,\r\n\r\n \/\/usaremos o string.sub percorrendo todos os caracteres\r\n\r\n\r\n   local aspa_inicial = 0;\r\n   local aspa_final = 0;\r\n \r\n   para i = 1 , #tema_definido inicio \r\n\r\n \r\n\/\/a funcao string.sub extrai uma sub string de outra maior\r\n\r\n\/\/sua sintaxe \u00e9 :  string.sub ( string_maior , pos_x , pos_y );\r\n\/\/onde pos_x e pos_y \u00e9 o n\u00famero que indica o inicio e o fim da substring dentro\r\n\/\/da maior:\r\n\r\n      local c = string.sub ( tema_definido , i , i );\r\n\r\n      se c == '\"'  entao    \/\/quando chega na aspa ele testa outra condi\u00e7\u00e3o: \r\n                           se aspa_inicial == 0 entao \/\/se aspa_inicial ainda \u00e9 zero entao \u00e9 a primeira aspa.\r\n                                                        aspa_inicial = i  \r\n                           senao  \/\/senao for zero, \u00e9 porque j\u00e1 tem outro valor entao \u00e9 a vez do aspa_final\r\n                                                        aspa_final = i\r\n                           fim\r\n                        \r\n     fim\r\n  \r\n     \r\n  fim \/\/fim para\r\n\r\n \/\/ja sabemos a posicao das duas aspas, basta usar outra vez string.sub\r\n \/\/mas com a posical que est\u00e1 entre as aspas\r\n \/\/para isso somo 1 na primeira aspa e diminuo 1 da ultima aspa\r\n \/\/e a\u00ed tenho a posi\u00e7\u00e3o entre elas, veja:\r\n\r\n   local Texto_definido = string.sub( tema_definido , aspa_inicial + 1 , aspa_final - 1 ) ;\r\n\r\n\r\n\r\n\r\n\/\/criando a janela:\r\n\r\n   local janela = ig.janela( ig.janela_semborda  );\r\n   local cor_jan = ig.cor_analise( ig.ouro );\r\n   ig.componente_modifique_corfundo( janela , ig.estado_normal , cor_jan );\r\n   ig.janela_def_titulo ( janela , 'Mudar Tema Gtk' );\r\n   ig.janela_def_opacidade( janela , 0.9 ); \/\/90% de opacidade\r\n   \r\n   ig.janela_def_posicao( janela , ig.janela_pos_centro );\r\n   ig.caixa_def_borda_largura ( janela , 20 );\r\n\r\n   local caixav = ig.caixavertical (falso , 2 );  \/\/criando uma caixa vertical para organizar verticalmente os componentes\r\n   ig.ad( janela , caixav); \/\/colocando a caixa vertical na janela\r\n\r\n      ig.caixa_ad ( caixav , ig.rotulo '\\nEscolha um tema do combo:\\n' , falso , falso , 2 );\r\n\r\n\/\/criando o combo combo box\r\n   local Texto_padrao = 'padrao';\r\n\r\n   local combo = ig.caixa_combo_(Texto_definido );\r\n\r\n   ig.caixa_combo_anexe_texto( combo , Texto_padrao );\r\n\r\n   para i = 1 , #tema inicio\r\n\r\n     se tema[i] &lt;&gt; '.' e tema[i] &lt;&gt; '..' entao \/\/deixando de fora o ponto e os dois pontos\r\n\r\n         ig.caixa_combo_anexe_texto ( combo , tema[i]  );\r\n     fim\r\n\r\n   fim \/\/fim para\r\n\r\n   ig.caixa_ad( caixav , combo , falso , falso , 2 ); \/\/colocando combo na caixa vertical\r\n\r\n\r\n\r\n      ig.caixa_ad ( caixav , ig.rotulo '\\n\\n\u00c9 necess\u00e1rio reiniciar os programas para ver o efeito\\n' , falso , falso , 2 );\r\n\r\n\r\n  funcao mude_tema ( wid , jan )\r\n  \r\n\r\n     local selecionado =  ig.caixa_combo_obt_texto_ativo ( combo ) ; \/\/obtendo o texto atual do combo\r\n\r\n     se selecionado == 'padrao' entao selecionado = 'MS-Windows'  fim\r\n \/\/garantindo que o tema windows seja o padrao\r\n\r\n\/\/bom, a linha deve ser assim : gtk-theme-name = \"nometema\" \r\n\/\/entao vamos montar essa linha:\r\n\r\n     local grava_selecionado = \"gtk-theme-name = \" .. \"\\\"\" .. selecionado .. \"\\\"\"\r\n\r\n\/\/vamos gravar no arquivo agora:\r\n     local arq = es.abra( conf_tema_dir , 'escrita' ) ; \/\/abrindo arquivo em modo escita\r\n               arq:escreva ( grava_selecionado );\r\n       arq:feche();\r\n    \r\n\r\n       imprima(  'mudado:  ' .. selecionado   );\r\n\r\n        ig.componente_destrua( jan );\r\n       \r\n  fim \/\/fim funcao mude tema\r\n\r\n    local bt_ok = ig.botao_estoque( ig.estoque_ok);\r\n   ig.caixa_ad( caixav , bt_ok , falso , falso , 2 );   \r\n   ig.conecte_funcao ( bt_ok , ig.clique , mude_tema , janela );\r\n\r\n   local bt_cancelar = ig.botao_estoque( ig.estoque_cancelar);\r\n   ig.caixa_ad( caixav , bt_cancelar , falso , falso , 2 );   \r\n   ig.conecte_permutado ( bt_cancelar , ig.clique , ig.componente_destrua , janela );\r\n\r\n\r\n   ig.componente_mostre_todos( janela );\r\n\r\n   \r\n\r\nfim \/\/fim funcao plugin_execute\r\n\r\n\r\n\/\/tabela de retorno do plugin\r\nretorne {\r\n\r\n   nome = 'Mudar tema gtk' ;\r\n\r\n   estoque = ig.estoque_selecionar_cor ;\r\n\r\n   rotulo = \"Mudar tema do gtk\" ;\r\n\r\n   func = plugin_execute ;\r\n\r\n\r\n} \/\/fim tabela de retorno do plugin\r\n\r\n\r\n\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O plugin \u00e9 um script prisma podendo ser ou n\u00e3o compilado. Ele passa uma tabela com valores e uma fun\u00e7\u00e3o, possui um elemento rotulo que \u00e9 o texto a ser mostrado no menu ferramentas do prismacod. Vamos criar um plugin bem b\u00e1sico, veja o c\u00f3digo: retorne {\/\/ tabela plugin de retorno nome = &#8216;plugin minimo&#8217;&#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-1228","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\/1228","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=1228"}],"version-history":[{"count":4,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1228\/revisions"}],"predecessor-version":[{"id":1233,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/1228\/revisions\/1233"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=1228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=1228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=1228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}