Este post é um exercício. Está sujeito a ajustes no período.
a) Contexto
O Brasil tem mais de 200 milhões de habitantes, IDH 0,754 (79 no ranking), R$ 6,266 trilhões em 2016, PIB per capita ficou em R$ 30.407 – uma redução de 4,4%. O indice de Gini — chegou a 0,5229 no ano passado, alta de 1,6% em
relação ao ano anterior. A taxa de desemprego chegou a 13,7% no primeiro trimestre de 2017.
b) Propostas
Ajuste das finanças públicas:
1) Eliminação da remuneração do depósito compulsório que os bancos fazem ao Banco Central
ver http://www.valor.com.br/financas/2525808/remuneracao-sobre-compulsorio-de-deposito-prazo-caira-mais-devagar
A eliminação dessa remuneração deve destravar mais de 300 bilhões de reais anuais ao orçamento público federal, a serem alocadas nas prioridades abaixo:
2) Desenvolvimento local
A fim de reduzir o desemprego e a desigualdade, devem ser identificados os 'bolsões de miséria', bairros e regiões com alto desemprego e baixa renda, e fornecidos empréstimos e serviços públicos para que em um raio de 2 km cada cidadão tenha escola, posto de saúde, comércio, lazer, serviços e trabalho.
quarta-feira, junho 07, 2017
quarta-feira, maio 17, 2017
Reconhecendo texto em um pdf scaneado com python e tesseract
Como converter um arquivo pdf scaneado em um arquivo pdf que permita a busca pelo texto?
As orientações são para o ubuntu 16.04
1) Instale o pypdfocr
sudo pip install pypdfocr
2) instale o tesseract e o language pack
sudo apt install tesseract-ocr tesseract-por
3) para converter um arquivo
pypdfocr -l por scaneado.pdf
irá gerar um arquivo scaneado_ocr.pdf.
Para mais opções, consulte a documentação em
http://virantha.github.io/pypdfocr/html/
---------------------------------------------------------------------------------------
Para instalação no Centos 7, siga as orientações de
http://www.keienberg.com/install-tesseract-3-04-centos-7/
Se reclamar 'leptonic not found' no passo 3, use:
$ setenv LIBLEPT_HEADERSDIR /usr/local/include/leptonica ; setenv LDFLAGS -L/usr/lib ; ./configure --prefix=/usr
make install e ldconfig devem ser executados como
sudo make install
sudo ldconfig
no passo 5, faça
export TESSDATA_PREFIX=/usr/share/tessdata
----------------------------------------------------------------------------------
Versão corrigida
Tesseract installation is supported beautifully with Ubuntu, but with Centos it requires effort to build. Below is a description of how to install Tesseract on CentOs.
Used versions:
Tesseract: 3.04.01 tesseract-3.04.01.tar.gz
Leptonica: 1.73 leptonica-1.73.tar.gz
Tesseract-ocr 3.02 tesseract-ocr-3.02.deu.tar.gz, tesseract-ocr-3.02.eng.tar.gz, tesseract-ocr-3.02.nld.tar.gz, tesseract-ocr-3.02.por.tar.gz
GhostScript: Install Tesseract 3.04 on CentOs 7
I executed all commands as root, but if you prefer, you can use another account and ‘sudo‘ the commands
1) First update your system:
yum update
Because Tesseract-ocr is not available using yum, we need to download source and build both Tesseract-ocr and leptonica.
This requires development tools to be installed.
yum groupinstall “Development Tools”
Se der erro use:.
yum groupinstall "Ferramentas de desenvolvimento"
yum -y install automake autoconf libtool zlib-devel libjpeg-devel giflib libtiff-devel libwebp libwebp-devel libicu-devel openjpeg-devel cairo-devel
2) Now download and install Leptonica :
wget http://www.leptonica.com/source/leptonica-1.73.tar.gz
tar xzvf leptonica-1.73.tar.gz
cd leptonica-1.73
./configure
make
make install
3) Download and install Tesseract:
wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
mv 3.04.01.tar.gz tesseract-3.04.01.tar.gz
tar xzvf tesseract-3.04.01.tar.gz
cd tesseract-3.04.01/
./autogen.sh
setenv LIBLEPT_HEADERSDIR /usr/local/include/leptonica ; setenv LDFLAGS -L/usr/lib ; ./configure --prefix=/usr
./configure
make
make install
ldconfig
make training
make training-install
4) Download and install Tesseract trainer files:
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.eng.tar.gz
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.nld.tar.gz
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.deu.tar.gz
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.por.tar.gz
tar xzvf tesseract-ocr-3.02.eng.tar.gz
tar xzvf tesseract-ocr-3.02.nld.tar.gz
tar xzvf tesseract-ocr-3.02.deu.tar.gz
tar xzvf tesseract-ocr-3.02.por.tar.gz
cp -r tesseract-ocr/tessdata/ /usr/share/
5) Export TESSDATA_PREFIX:
export TESSDATA_PREFIX=/usr/share/tessdata
6) Last, install Ghostscript for processing png:
wget https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs920/ghostscript-9.20.tar.gz
tar xzvf ghostscript-9.20.tar.gz
cd ghostscript-9.20/
./autogen.sh
./configure
make
make install
if tesseract complains about not find liblept.so.5 , do:
ln -s /usr/local/lib/liblept.so.5 /usr/lib64/
quinta-feira, abril 06, 2017
Iniciando com NLTK
Para instalar:
pip3 install nltk
Para instalar os pacotes adicionais, o NLTK tem uma lógica expecial, é preciso usar o prompt do python:
python3
import nltk
nltk.download()
Se tem espaço bastante, simplemente configure o diretório padrão para /usr/share/nltk (ou o seu venv) e download 'all'
Páginas interessantes:
https://www.ibm.com/developerworks/br/library/os-pythonnltk/
NLTK Book
sexta-feira, março 31, 2017
Melhores Sites de ciclismo
Internacionais
- http://www.steephill.tv/ - A melhor cobertura da elite do ciclismo mundial
- http://www.cycling.tv/ - Pena que só nos EUA (snif, snif) - videos de corrida ao vivo e on demand
- http://www.cyclingnews.com/ - Site com boas matérias sobre ciclismo
- http://www.cyclingweekly.com/ - Site inglês
- http://tiz-cycling.racing/live-stream/ transmissão ao vivo
- www.bikemagazine.com.br/
- www.pedal.com.br
- www.fmc.org.br - Federação Mineira
Se discordar ou tiver uma contribuição, deixe seu comentário abaixo!
quinta-feira, março 30, 2017
Vivaldi - Navegador
o Vivaldi (vivaldi.com) é um navegador desenvolvido por uma equipe dissidente do Ópera.
O que acho legal nele é mostrar número e o tamanho dos arquivos da página que está baixando.
Sempre fico surpreso com o tamanho das páginas!
Como imprimir uma página direto do browser
No Firefox você pode fazer algumas modificações que permitem imprimir um documento sem o prompt de confirmação da seguinte forma:
- Digite
about:configpara entrar na aba de configurações (clique em "serei cuidadoso, prometo") e prossiga. - Crie uma nova preferência do tipo booleano. Dê o nome de
print.always_print_silente marque-a comotrue.
window.print() iniciará a impressão automaticamente. Assim, até mesmo um link como o abaixo funcionará:<a href='javascript:window.print()'>Imprimir essa página</a>
Mas como pode ver de qualquer maneira é necessária a permissão por parte do usuário.ps: Caso tenha feito o teste acima, não esqueça de entrar novamente na aba de preferências do Firefox e alterar a chave
print.always_print_silent para false (ou então clicar em "restaurar o padrão"). Referência:
http://pt.stackoverflow.com/questions/54858/como-imprimir-uma-p%C3%A1gina-diretamente-sem-caixa-de-di%C3%A1logo-do-navegador-usando
Web2py ERROR', 'relation "auth_user" already exists
É comum ocorrerem errors de migração no DAL do web2py. Seja porque foi feito um restore diretamente via banco de dados, alguma alteração direta no banco, ou outro motivo.
Se a instalação é nova, e o banco foi criado/restaurado a partir de um backup, normalmente basta alterar as linhas no arquivo db.py de :
db = DAL(myconf.get('db.uri'),
pool_size=myconf.get('db.pool_size'),
migrate=True,
check_reserved=['all'])
para:
db = DAL(myconf.get('db.uri'),
pool_size=myconf.get('db.pool_size'),
fake_migrate_all=True,
#migrate=True,
check_reserved=['all'])
Faça essa alteração, rode uma vez, e volte para o padrão.
Ao deixar o fake_migrate ativado, ao se criar um novo campo ou tabela no web2py, ela não é criada no banco, levando o banco de dados informar o erro que o campo ou tabela não existe.
Nesse caso, é preciso fazer a alteração diretamente no banco de dados. O arquivo databases/sql.log pode ajudar com o sql que 'deveria' ter sido aplicado no banco, mas foi 'fake'. Em alguns casos mais complexos, os erros tem que ser corrigidos à mão.
Portanto, via de regra, não deixe o fake_migrate_all ativo por padrão.
Se a instalação é nova, e o banco foi criado/restaurado a partir de um backup, normalmente basta alterar as linhas no arquivo db.py de :
db = DAL(myconf.get('db.uri'),
pool_size=myconf.get('db.pool_size'),
migrate=True,
check_reserved=['all'])
para:
db = DAL(myconf.get('db.uri'),
pool_size=myconf.get('db.pool_size'),
fake_migrate_all=True,
#migrate=True,
check_reserved=['all'])
Faça essa alteração, rode uma vez, e volte para o padrão.
Ao deixar o fake_migrate ativado, ao se criar um novo campo ou tabela no web2py, ela não é criada no banco, levando o banco de dados informar o erro que o campo ou tabela não existe.
Nesse caso, é preciso fazer a alteração diretamente no banco de dados. O arquivo databases/sql.log pode ajudar com o sql que 'deveria' ter sido aplicado no banco, mas foi 'fake'. Em alguns casos mais complexos, os erros tem que ser corrigidos à mão.
Portanto, via de regra, não deixe o fake_migrate_all ativo por padrão.
Como alterar a senha de um usuario no Postgresql
Quando se instala o Postgresql, normalmente é necessário alterar a senha do usuário no banco por segurança.
Para isso, siga 3 passos:
1. Assuma o usuário root
su
2. Assuma o usuário postgres
su postgres
3. Entre no psql e digite o comando a seguir:
psql
Para isso, siga 3 passos:
1. Assuma o usuário root
su
2. Assuma o usuário postgres
su postgres
3. Entre no psql e digite o comando a seguir:
psql
ALTER USER postgres WITH PASSWORD '';
Como instalar o desktop MATE no Ubuntu
Para instalar/atualizar o desktop MATE no Ubuntu 16.04:
sudo apt-add-repository ppa:ubuntu-mate-dev/xenial-mate sudo apt-get update sudo apt-get install mate
Usando ssh key para autenticar em seu servidor
Esse post mostra como criar uma chave no seu computador (linux) e exportá-la para seu servidor para para autenticar sem usar senha
1. Crie a chave. Aceite os padrões ou altere, se preferir
2. Exporte a chave. Será preciso entrar com a senha do usuário do servidor desta vez:
3. Se precisar colar a chave em algum site (Digital Ocean, Bitbucket, e outros) , use o comando abaixo para exibir a chave. Copie o resultado e cole no campo apropriado:
1. Crie a chave. Aceite os padrões ou altere, se preferir
ssh-keygen
2. Exporte a chave. Será preciso entrar com a senha do usuário do servidor desta vez:
ssh-copy-id username@remote_host
3. Se precisar colar a chave em algum site (Digital Ocean, Bitbucket, e outros) , use o comando abaixo para exibir a chave. Copie o resultado e cole no campo apropriado:
cat ~/.ssh/id_rsa.pub
ou
cat ~/.ssh/id_rsa.pub | xclip -sel clip
(se tiver o xclip instalado)
Instalar desktop Pantheon no Ubuntu 16.04
O Pantheon é o Desktop do ElementaryOS.
Para instalá-lo no Ubuntu, use os seguintes comandos:
Para instalá-lo no Ubuntu, use os seguintes comandos:
sudo add-apt-repository ppa:elementary-os/stable sudo apt-get update sudo apt-get install elementary-desktop
Experimentei um pouco e confesso que não gostei, ainda prefiro o MATE
quarta-feira, abril 01, 2015
Big data com python
Hangout com slides e material. Posteriormente posso comentar o que achei.
http://pycursos.com/big-data-python/
http://pycursos.com/big-data-python/
domingo, setembro 14, 2014
Dicas para sua vida profissional
1-Pense
em algo que é importante para as pessoas e que você se veria capaz
de fazer.
2-Procure
saber um pouco mais das tarefas da profissão e imagine se você
gostaria de realizá-las.
3-Procure
saber se a remuneração média dessa profissão atende a qualidade
de vida que você pretende ter.
4-Entenda
que a escolha de uma profissão não é definitiva e que você pode
mudar ao longo da vida.
5-Como
dica de carreira, sempre procure deixar uma boa impressão em seus
empregos, pois eles poderão servir de referência para novas
oportunidades.
6-Procure
fazer seu trabalho pensando como se você fosse o dono do negócio,
isso lhe abrirá muitas portas para o crescimento profissional.
7-Você
deve estar sempre se atualizando sobre sua profissão.
8-Pense
sempre que você tem que conciliar a sua dedicação ao trabalho com
seu lazer; sua família e amigos.
quinta-feira, setembro 26, 2013
a teoria do criacionismo ou a tradução da palavra nada
Até data recente, havia em mim a dúvida se Deus existe ou não. Em outros termos, um agnóstico.
Colocando na balança que mesmo a melhor teoria científica chega a conclusão de que houve um momento que toda a matéria esteve concentrada em um ponto e 'explodiu', a partir daí, e que este ponto deveria ter toda a matéria existente, e que numa fração de segundo anterior este ponto sequer existisse, só pode-se chegar a conclusão de que o nada criou o primeiro ponto e a partir daí houve um crescimento do universo.
Humberto Gessinger, em uma das suas músicas, afirma que 'nada é uma palavra esperando tradução'.
Pois para mim, 'nada = Deus".
Quando ninguém pode ajudar, do nada pode surgir ajuda, se sua fé e força de vontade forem fortes o bastante.
Pois o nada criou o ponto, e a partir daí, foi possível criar todas as outras coisas.
Colocando na balança que mesmo a melhor teoria científica chega a conclusão de que houve um momento que toda a matéria esteve concentrada em um ponto e 'explodiu', a partir daí, e que este ponto deveria ter toda a matéria existente, e que numa fração de segundo anterior este ponto sequer existisse, só pode-se chegar a conclusão de que o nada criou o primeiro ponto e a partir daí houve um crescimento do universo.
Humberto Gessinger, em uma das suas músicas, afirma que 'nada é uma palavra esperando tradução'.
Pois para mim, 'nada = Deus".
Quando ninguém pode ajudar, do nada pode surgir ajuda, se sua fé e força de vontade forem fortes o bastante.
Pois o nada criou o ponto, e a partir daí, foi possível criar todas as outras coisas.
terça-feira, maio 21, 2013
cursos de programação gratuitos (em inglês)
Procurando no udemy, que tem muitos cursos gratuitos e pagos, encontrei um curso de c gratuito, que parece de boa qualidade..
No curso, descobri que o professor mantinha um site com vários cursos gratuitos:
http://itube.igneustech.com/list-courses.igneustech/9
terça-feira, março 19, 2013
IS_CEP validator para web2py
Inclua o código abaixo em um model, no início do arquivo db.py em um arquivo que em ordem alfabética seja anterior a db.py. Eu uso 0_validators.py
Para usar, use como um validator comum, na definição da tabela
...
Field('cep', requires=IS_CEP()),
...
ou após a definição:
db.mytable.cep.requires = IS_CEP()
class IS_CEP(object):
def __init__(self, format=True, error_message='Digite apenas os números!'):
self.format = format
self.error_message = error_message
def __call__(self, value):
try:
#return (value, 'cpf incorreto'+str(value))
#return (value, 'cpf incorreto'+str(cl))
c = []
for d in value:
if d.isdigit():
c.append(d)
cl = str(''.join(c))
#return (value, 'cpf incorreto'+str(cl))
if len(cl) == 8:
cep = cl
return(str(cep),None)
else:
return (value, 'Número de dígitos incorreto para CEP')
except:
return (value, 'algum erro'+str(value))
def formatter(self, value):
formatado = value[0:2]+'.'+value[2:5]+'-'+value[5:8]
return formatado
Para usar, use como um validator comum, na definição da tabela
...
Field('cep', requires=IS_CEP()),
...
ou após a definição:
db.mytable.cep.requires = IS_CEP()
class IS_CEP(object):
def __init__(self, format=True, error_message='Digite apenas os números!'):
self.format = format
self.error_message = error_message
def __call__(self, value):
try:
#return (value, 'cpf incorreto'+str(value))
#return (value, 'cpf incorreto'+str(cl))
c = []
for d in value:
if d.isdigit():
c.append(d)
cl = str(''.join(c))
#return (value, 'cpf incorreto'+str(cl))
if len(cl) == 8:
cep = cl
return(str(cep),None)
else:
return (value, 'Número de dígitos incorreto para CEP')
except:
return (value, 'algum erro'+str(value))
def formatter(self, value):
formatado = value[0:2]+'.'+value[2:5]+'-'+value[5:8]
return formatado
Melhor IDE ou Editor para Python
Essa é uma pergunta que a maior parte dos programadores python não gosta de responder.
Dizem que você deve experimentar e escolher o que é melhor para você.
Eu fiz isso.
Dos pagos, gostei do WingIDE (versão trial). Rápido, confiável, multiplataforma.
O Komodo ficaria em segundo lugar, porque é mais lento.
Dos gratuitos, a maioria são instáveis ou lentos, ou tem usabilidade ruim. Tão ruim que às vezes preferia um editor de texto como o Notepad++ no windows ou o Gedit no linux.
Mas existe uma luz no fim do túnel. O Aptana 3 apresenta muitas qualidades sem o defeito de ser pago.
Portanto, minha resposta para a pergunta acima é: Aptana Studio 3.
Ele é baseado no pydev, só que é fácil de instalar.
Para baixá-lo, vá a http://www.aptana.com/products/studio3
Atualização em março de 2017:
Hoje, fico longe dos editores acima. A melhor IDE seria a PyCharm, mesmo a Comunity Edition já tem muitas qualidades. Mas por ser em java, é pesada.
Na prática, adotei o Sublime Text 3. É leve e supre todas necessidades de um programador. Não tem todas as funcionalidades de uma IDE, mas se vocẽ conhece bem as bibliotecas/frameworks que trabalha e o seu código, é mais que suficiente. Se não, talvez seja melhor gastar um tempo estudando a documentação do framework ou biblioteca do que contar com a ajuda da IDE.
Dizem que você deve experimentar e escolher o que é melhor para você.
Eu fiz isso.
Dos pagos, gostei do WingIDE (versão trial). Rápido, confiável, multiplataforma.
O Komodo ficaria em segundo lugar, porque é mais lento.
Dos gratuitos, a maioria são instáveis ou lentos, ou tem usabilidade ruim. Tão ruim que às vezes preferia um editor de texto como o Notepad++ no windows ou o Gedit no linux.
Mas existe uma luz no fim do túnel. O Aptana 3 apresenta muitas qualidades sem o defeito de ser pago.
Portanto, minha resposta para a pergunta acima é: Aptana Studio 3.
Ele é baseado no pydev, só que é fácil de instalar.
Para baixá-lo, vá a http://www.aptana.com/products/studio3
Atualização em março de 2017:
Hoje, fico longe dos editores acima. A melhor IDE seria a PyCharm, mesmo a Comunity Edition já tem muitas qualidades. Mas por ser em java, é pesada.
Na prática, adotei o Sublime Text 3. É leve e supre todas necessidades de um programador. Não tem todas as funcionalidades de uma IDE, mas se vocẽ conhece bem as bibliotecas/frameworks que trabalha e o seu código, é mais que suficiente. Se não, talvez seja melhor gastar um tempo estudando a documentação do framework ou biblioteca do que contar com a ajuda da IDE.
quinta-feira, fevereiro 14, 2013
Postgresql, mysql databases smallest footprint
short answer: Postgresql
Detailled answer:
Postgresql 36 MB
Mysql 134MB
If you have a small vps, or your dev PC/Laptop haven't much memory, choose Postgresql.
--
Atenciosamente
Alexandre Andrade
Detailled answer:
Postgresql 36 MB
Mysql 134MB
If you have a small vps, or your dev PC/Laptop haven't much memory, choose Postgresql.
--
Atenciosamente
Alexandre Andrade
sexta-feira, agosto 10, 2012
Roteiro prático para resolução de bugs
Segue procedimentos básicos na resolução dos bugs:
1 Execute
o procedimento descrito que gera o problema
- Verifique as mensagens de erro informadas
- Busque na internet (Google) referencias e a documentação do framework/linguagem/sistema operacional a erros similiares.
- Se o erro já tiver solução, avalie se a solução aplica ao seu caso
- Se
a solução da internet não resolver o problema,siga o roteiro abaixo:
Se não há mensagens de erro:
1. Ative
ou aumente o nível de mensagens de erro do framework/linguagem de programação,
ou utilize um debugger (xdebug)2. Se ainda assim não gerar nenhuma mensagem de erro, analise o código e insira pontos de interrupção no código para identificar até onde o código funciona corretamente.
3. Se a interrupção ocorrer na chamada de uma classe ou função, inclua pontos de interrupção no código de declaração da classe ou função, para identificar até onde o código funciona corretamente
Uma vez identificado o ponto de erro, avalie suas causas, e
aplique a solução.
Erros mais comuns:
Valores não tratados (Ex: texto onde deveria ser número)
-> inclua código para tratar os valores antes de utilizá-los
Tipagem errada (a variável é uma string mas deveria ser número)
-> providencie a conversão
Permissões: alguma configuração do framework, linguagem ou
sistema operacional não está adequada -> identifique a configuração errada,
consulte a documentação, e providencie a configuração correta
Bibliotecas não existentes ou antigas - > providencie a
instalação/atualização.
Consultas SQL erradas -> avalie o que a consulta deveria
realmente fazer e providencie as correções necessárias
Modelagem errada do banco -> providencie a
adequação da modelagem à solução do problemasegunda-feira, janeiro 30, 2012
como fazer mascara em campos - passo a passo
De
Flavio Lichtenstein flalix@gmail.com para a lista web2py users brasil:
Ola pessoal, consegui fazer as máscaras de CEP, Telefone, etc dentro do Web2Py. A seguir vai a "receita de bolo":
1) adicionar código em web2py_ajax.html
response.files.insert(3,URL(r= request,c='static',f='js/ jquery.maskedinput-1.3.min.js' ))
cuidado! o número três é porque já havia as referencias 0,1 e2 - cuiado para sequenciar corretamente
2) no final da(s) página(s) onde está seu código - normalmente default\minha_pagina.html, adicionar os filtros necessários como vistos abaixo - adeque à sua realidade:
a) "pessoa" é nome da sua tabela
b) maskMoney() não é necessário só para quem usar $$$
3) adicionar o JS de mascara em static\js - ver no final deste email
4) em _utils (ou rotina inicial que adotar) colocar a classe que Bruno enviou --> repare que alterei para funcionar "no meu código" (Bruno, obrigado por ter enviado e alertado)
# do Bruno Rocha em 23/01/2012
class REMOVE_MASK(object):
def __init__(self, symbols=["_",".","-","/",")"," ("," "]):
# print 'symbols', symbols
self.symbols = symbols
def __call__(self, value):
for symbol in self.symbols:
value = value.replace(symbol, "")
# print 'value',value
# print 'symbol', symbol
return (value, None)
5) nas definições do(s) campo(s) da(s) tabela(s) onde ocorrerem a máscara deve-se adicionar "REMOVE_MASK" (como alertou Bruno) de forma que os caracteres sejem removidos "antes do post"
exemplo:
SQLField('cpf','string', length=11, unique=True, label="CPF", \
comment="cadastro de pessoa física", requires=REMOVE_MASK([".", "-"])),
------------------------------ ------------------------------ ------------------------------ ---------------
como enviado pela Relsi, veja o email anterior dela, onde pode-se ver um exemplo com html puro - não em Web2py (obrigado Relsi).
------------------------------ ------------------------------ ------------------------------ ---------------
/*
Masked Input plugin for jQuery
Copyright (c) 2007-2011 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/ projects/masked-input-plugin/# license)
Version: 1.3
*/
(function(a){var b=(a.browser.msie?"paste":" input")+".mask",c=window. orientation!=undefined;a.mask= {definitions:{9:"[0-9]",a:"[A- Za-z]","*":"[A-Za-z0-9]"}, dataName:"rawMaskFn"},a.fn. extend({caret:function(a,b){ if(this.length!=0){if(typeof a=="number"){b=typeof b=="number"?b:a;return this.each(function(){if(this. setSelectionRange)this. setSelectionRange(a,b);else if(this.createTextRange){var c=this.createTextRange();c. collapse(!0),c.moveEnd(" character",b),c.moveStart(" character",a),c.select()}})} if(this[0].setSelectionRange) a=this[0].selectionStart,b= this[0].selectionEnd;else if(document.selection&& document.selection. createRange){var c=document.selection. createRange();a=0-c.duplicate( ).moveStart("character",-1e5), b=a+c.text.length}return{ begin:a,end:b}}},unmask: function(){return this.trigger("unmask")},mask: function(d,e){if(!d&&this. length>0){var f=a(this[0]);return f.data(a.mask.dataName)()}e=a. extend({placeholder:"_", completed:null},e);var g=a.mask.definitions,h=[],i=d. length,j=null,k=d.length;a. each(d.split(""),function(a,b) {b=="?"?(k--,i=a):g[b]?(h. push(new RegExp(g[b])),j==null&&(j=h. length-1)):h.push(null)}); return this.trigger("unmask").each( function(){function v(a){var b=f.val(),c=-1;for(var d=0,g=0;de.placeholder;while(g++length){var m=b.charAt(g-1);if(h[d].test( m)){l[d]=m,c=d;break}}if(g>b. length)break}else l[d]==b.charAt(g)&&d!=i&&(g++, c=d);if(!a&&c+10,k);else if(a||c+1>=i)u(),a||f.val(f. val().substring(0,c+1));return i?d:j}function u(){return f.val(l.join("")).val()} function t(a,b){for(var c=a;ce.placeholder)}function s(a){var b=a.which,c=f.caret();if(a. ctrlKey||a.altKey||a.metaKey|| b<32)return!0;if(b){c.end-c. begin!=0&&(t(c.begin,c.end),p( c.begin,c.end-1));var d=n(c.begin-1);if(dd].test(g)){q(d),l[d]=g,u(); var i=n(d);f.caret(i),e.completed& &i>=k&&e.completed.call(f)}} return!1}}function r(a){var b=a.which;if(b==8||b==46||c&& b==127){var d=f.caret(),e=d.begin,g=d.end; g-e==0&&(e=b!=46?o(e):g=n(e-1) ,g=b==46?n(g):g),t(e,g),p(e,g- 1);return!1}if(b==27){f.val(m) ,f.caret(0,v());return!1}} function q(a){for(var b=a,c=e.placeholder;bif(h[b]){var d=n(b),f=l[b];l[b]=c;if(dh[d].test(f))c=f;else break}}function p(a,b){if(!(a<0)){for(var c=a,d=n(b);cif(dl[d],l[d]=e.placeholder;else break;d=n(d)}u(),f.caret(Math. max(j,a))}}function o(a){while(--a>=0&&!h[a]); return a}function n(a){while(++a<=k&&!h[a]); return a}var f=a(this),l=a.map(d.split(""), function(a,b){if(a!="?")return g[a]?e.placeholder:a}),m=f. val();f.data(a.mask.dataName, function(){return a.map(l,function(a,b){return h[b]&&a!=e.placeholder?a:null} ).join("")}),f.attr("readonly" )||f.one("unmask",function(){ f.unbind(".mask").removeData( a.mask.dataName)}).bind(" focus.mask",function(){m=f. val();var b=v();u();var c=function(){b==d.length?f. caret(0,b):f.caret(b)};(a. browser.msie?c:function(){ setTimeout(c,0)})()}).bind(" blur.mask",function(){v(),f. val()!=m&&f.change()}).bind(" keydown.mask",r).bind(" keypress.mask",s).bind(b, function(){setTimeout( function(){f.caret(v(!0))},0)} ),v()})}})})(jQuery)
Assinar:
Comentários (Atom)