From 0dd2d8b15aaf97916172b22c01943a14c8fb61b3 Mon Sep 17 00:00:00 2001 From: Bogdan Cordier Date: Fri, 25 May 2012 23:36:03 +0200 Subject: [PATCH] Code Refactor Added icons Added cli support --- README | 26 ++- icons/hicolor/128x128/apps/kcnrtl.png | Bin 0 -> 9754 bytes icons/hicolor/16x16/apps/kcnrtl.png | Bin 0 -> 803 bytes icons/hicolor/32x32/apps/kcnrtl.png | Bin 0 -> 1795 bytes icons/hicolor/64x64/apps/kcnrtl.png | Bin 0 -> 4211 bytes icons/kcnrtl.ico | Bin 0 -> 13054 bytes icons/pixmaps/kcnrtl.xpm | 305 ++++++++++++++++++++++++++ kcnrtl.py | 6 + kcnrtl/fetchparsebs.py | 38 ++++ kcnrtl/fetchparseqt.py | 107 +++++++++ kcnrtl/gui/Ui_kcnrtl.py | 2 +- kcnrtl/gui/gui.py | 124 +++++++++++ kcnrtl/kcnrtl.py | 191 ---------------- kcnrtl/main.py | 57 +++++ kcnrtl/models.py | 17 ++ kcnrtl/resources/kcnrtl_icon.svg | 223 +++++++++++++++++++ setup.py | 6 +- 17 files changed, 897 insertions(+), 205 deletions(-) create mode 100644 icons/hicolor/128x128/apps/kcnrtl.png create mode 100644 icons/hicolor/16x16/apps/kcnrtl.png create mode 100644 icons/hicolor/32x32/apps/kcnrtl.png create mode 100644 icons/hicolor/64x64/apps/kcnrtl.png create mode 100644 icons/kcnrtl.ico create mode 100644 icons/pixmaps/kcnrtl.xpm create mode 100755 kcnrtl.py create mode 100644 kcnrtl/fetchparsebs.py create mode 100644 kcnrtl/fetchparseqt.py create mode 100755 kcnrtl/gui/gui.py delete mode 100755 kcnrtl/kcnrtl.py create mode 100755 kcnrtl/main.py create mode 100644 kcnrtl/models.py create mode 100644 kcnrtl/resources/kcnrtl_icon.svg diff --git a/README b/README index 73a6e7a..55d5742 100644 --- a/README +++ b/README @@ -5,34 +5,34 @@ KCnrtl :Author: Bogdan Cordier :Date: 2012-10-05 :Copyright: GPLv3 -:Version: 0.3b +:Version: 0.4b Description =========== KCnrtl is a simple Qt graphical client to access the CNRTL french linguistic resources. -It offers the possibility to check the definitions, synonyms, antonyms of a given -french word. Features: --------- - *Check the definitions, synomyms, antonyms of any given french word - For now the TLFi (Trésor de la Langue Française) is the only available dictionary. + *Check the synomyms, antonyms (CLI & GUI), definitions (GUI only) of any given french word - *The "AMAZING Clipboard mode" : + *Dictionaries available for now: + -TLFi (Trésor de la Langue Française informatisé) + -Dictionnaire de l'Académie Française 9th, 8th & 4th Edition + + *Clipboard mode (GUI only) : With the "Clipboard mode" you can easily check for a synonym/antonym and replace it in your text. To do so, just check the "Clipboard mode" checkbox, copy in the clipboard any word, KCnrtl will do an automatic request to the CNRTL website and you can easily copy any synonym or antonym by - just clicking on them. + just clicking on them in the result list. Now you just have to paste it back in you text ! Planned features: ----------------- - *cli client - *access to other dictionary offered by the CNRTL (Dictionnaire de l'Académie française 9e, etc) + *access to other dictionaries offered by the CNRTL (Dictionnaire du Moyen Français, etc) Installation ============ @@ -44,6 +44,10 @@ TODO!! Requirements ============ -*Python:2.7 -*PyQT4 +*Python: 2.7 +*PyQt4: >= 4.6 + +Optional if you don't use command-line: +*BeautifulSoup4 +*Httplib2 diff --git a/icons/hicolor/128x128/apps/kcnrtl.png b/icons/hicolor/128x128/apps/kcnrtl.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4f1030f363ec58be93293113aebab06ebe86df GIT binary patch literal 9754 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 literal 0 HcmV?d00001 diff --git a/icons/hicolor/16x16/apps/kcnrtl.png b/icons/hicolor/16x16/apps/kcnrtl.png new file mode 100644 index 0000000000000000000000000000000000000000..5b84db92e7271b45f7a2443661c907bde8f130f1 GIT binary patch literal 803 zcmV+;1Kj+HP)AzCSd zXxhj&BB+=0v6t+nqzIyipq|X4$RY5hXk}>Hw2(B78jbcvTTEK?({W}_5A}tubm4Lj zhjaet|Nq~kM1*zuzLHFT-^X(%<<}p-T)i`%jF%pZN)7*Ul!&lqv{jvuZ47UY}j+4L9YB0AP9y4pBzo9W1w)o==;*V0^ND@u3X;S3`3 z8^DSz3bdil(coyX4P*@L&!TyA=|3=?=2tJceJxCP$L9t|Q95`ipx z)QHd03>i6^ei;FBCeI|<-sbOWd$ZVyQJ+_|>%P{Csg?pufu+B_MuGVr-@ARChO1}k z?CRum+%RIvHd6caeiBQg62P)FS(fh6+#~k#ZE+j7Ac$?-v{qGMy4&{$E5G@mEkl{d zz?=Fjn?7S^;<_$wM+aZ7m48S}rOY!?XQWeX6sOEDQ-5NUk&o-TwBHM(Tb~}B9ugO& zrlXXtM1 z?=I_Y%~4DDkfOmFoK3H26id1pk~72gFWS1DP$PE2c{vGVuL3m zk)Frn++1RvHkYuk+3Eza`qiA>md&B?$ literal 0 HcmV?d00001 diff --git a/icons/hicolor/32x32/apps/kcnrtl.png b/icons/hicolor/32x32/apps/kcnrtl.png new file mode 100644 index 0000000000000000000000000000000000000000..aae2bccb4c75996ec8e3e5da68e86b325929bdad GIT binary patch literal 1795 zcmV+e2mJVnP)sIOobLK zD&_scE%)`Dd!PN`<@SQSNaK?{e>}f)&hPvA{+{P|P7X>blu`iVTlu_MoyDq|*snm= zg2YF4i4)JkZ@gSUc);1vGdiMscX_ zL-iqdaYO)W>|!s9KLNz+8kMDXDmE7|G3{l_?WLim4X@W1l!Cts$-zH%sY`bkAYc3e z*e?ZW;aOUc%~!XT;t2$akBg(Tr;oFa4p1R9L6cBCeWXjByITNl0?IT2Qho+uTf3U= zWhE5m=Wu;wl8p3Jj-NhDZ(skddn9KOJbkcDo%q}UHQ6G8SX`Pwk5nKEA~iXI@~x$m z7Hz=k_7E4Bfa&+rbn+CFPA8fGDQMT>pxMUXYLyBt3!vIAwrOxKy8PN4kQgbbxbI%F ztyc1_+4K$!Qjlwp1hO$i?85|wQ>kqK8xR|T$7r1!xZ36D8$a7NisU~<)4|1fs zSq()1s_j@}VPvuLFL*YjpnS(JlGfz0GA)(ttZX_jU&U&(k+w3GOU>_c_1tj?1*47J z=(-&)fP*DDgRBx7{0#yC*03Uuz2+ch}H2HjSCG zfsBXCF{Q+J^D^EWSI{MORZVJQ7Jvl%vRp^S=R$^xzQR!UPEu?dJ}Hrgfu?DUoO%ge zV(3AhncD@rCPrgl9m!A2cAnljs`1nWZYk z&Ika&k#;qSkKIyoemSnA*V?)-+*W~5>tE0%|EYLKou6a;*9cJ_0RVWuSGjy9RZ`Hh z?2d>}M5JY5`g|nz^k8u~NI&}?@sq>o8iyjX6%`gTGoJ_Yfx`fLG}iCC)bx}0iU*Al z4MOn1opwab+CmJ|WZn7mlr=U&ULNG+pf>*uk(9gxXau08Wt5VVew@w>yxt6i__}1y zsC6h$%t{`XaPp2jBBKD)G_iDaKvEK{SOMwjh|Dao*?vl0-R_7$clUE7CU%BbKfVnB zptf20R!#9WA!xjlj!^fk$1n_>nVGa#RdIQ>hoMi~U8JQ2$;}0e6ZioPvLSwAh0u%xUw=8 zrAosq=YjwLwOuOUNuXK^-dd<5)G8ZBNJZLj#Yg`jCKMPC1*l_Ws9bcA-=n2I{_)!8{HB9G+X5Tzk1X`yfNk0 zgW*rEQi__IElBwdrlv9&8VWEr){0^L7o`F)rwtdagi;}d_}-s)5)|Qlu~=o@B>Zo@~tfp_(dG1X_7K=m6Yil2Jq~1 zQZ5f54Dp@Q>hV~OW4cr-*>#PO-@}IMO`tehRIdh>lP>aW_IbvM2gT1*V#WRy@iIXW le8r#2FSZ<8`e!71{2!`s0H92*l=}bx002ovPDHLkV1oK7THOEu literal 0 HcmV?d00001 diff --git a/icons/hicolor/64x64/apps/kcnrtl.png b/icons/hicolor/64x64/apps/kcnrtl.png new file mode 100644 index 0000000000000000000000000000000000000000..36dbf94d0f1af0e706887021e005b4120ed7d997 GIT binary patch literal 4211 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 literal 0 HcmV?d00001 diff --git a/icons/kcnrtl.ico b/icons/kcnrtl.ico new file mode 100644 index 0000000000000000000000000000000000000000..a4e03ffcfe3ac0b1233b673b62b6149798b84e9f GIT binary patch literal 13054 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 c #75754C4B3030", +", c #797950503434", +"< c #840034840009", +"1 c #8A0A36CD0000", +"2 c #8DFF38960010", +"3 c #85853B3B0B0B", +"4 c #93F93AE60007", +"5 c #9BA83DF50006", +"6 c #82823F3F1515", +"7 c #FFFF00BF00BF", +"8 c #FFFF0CB70CB7", +"9 c #FFFF14471447", +"0 c #FFFF1AD21AD2", +"q c #F6F622222222", +"w c #FFFF23E423E4", +"e c #FFFF2AC42AC4", +"r c #FFA933893389", +"t c #FFCB3B6E3B6E", +"y c #9E9E40EB0202", +"u c #931242820D4D", +"i c #9AEF44440AB5", +"p c #8B8B44441494", +"a c #8CE249F41D1D", +"s c #97164ACA17D8", +"d c #A3914135001E", +"f c #A7A746C70606", +"g c #ABAB44A00025", +"h c #B1DC471C002B", +"j c #B49448E90141", +"k c #BBF44AF50000", +"l c #B8B851510C0C", +"z c #A34D4CF71414", +"x c #A4A44DCE1515", +"c c #B73755D61494", +"v c #88324B4B22CD", +"b c #90904D4D2020", +"n c #9E1E54D42323", +"m c #92E755552C2C", +"M c #9B9B55D62828", +"N c #9A1A58D82D2D", +"B c #91915ADA3636", +"V c #9E1E5EDE34B4", +"C c #A1A156AC24CF", +"Z c #A3A35D072E2E", +"A c #A2A25EDF32B3", +"S c #BBBB61B72626", +"D c #B86264642BD6", +"F c #ABEB63233272", +"G c #A33C64973BA2", +"H c #ACAC68683A90", +"J c #B6B66A6A36B7", +"K c #B9B96D6D3B3B", +"L c #BDBD71713DBE", +"P c #C1C14E4E0181", +"I c #CC4B521200E1", +"U c #C5C456560C0C", +"Y c #D3AB55550129", +"T c #D3D25B5B0B8B", +"R c #C0BF59581515", +"E c #C7C760601A1A", +"W c #D5D462B7166C", +"Q c #DBDA5C5C2C2B", +"! c #C0C066E72B2B", +"~ c #D7D76D6D2E2E", +"^ c #C8C76E6D3131", +"/ c #C4C470703838", +"( c #83835E5E4545", +") c #8E8E67674D4D", +"_ c #9C1B6AEB4A4A", +"` c #8E8E6D6C5656", +"' c #94936E6E5555", +"] c #97D773335ADA", +"[ c #A471699C4310", +"{ c #AC006D1743EE", +"} c #A34D6C1647F2", +"| c #B0B06F6F4444", +" . c #AD57731D4C4C", +".. c #BE3E73734242", +"X. c #B58276424C7F", +"o. c #B9B976B64ACB", +"O. c #AC5675CB51A7", +"+. c #AB2A7BFC5CDC", +"@. c #B4B47C7C5757", +"#. c #BBBB7C2651FC", +"$. c #8F8F7C7C6F6F", +"%. c #9A447B2566BC", +"&. c #A2A27F7F6868", +"*. c #D2D25A5A5A5A", +"=. c #E0E04D4D4D4D", +"-. c #F1F144444444", +";. c #FFFF43434343", +":. c #FFFF4DCD4DCD", +">. c #E0E058585858", +",. c #F6F650505050", +"<. c #FF3E53135313", +"1. c #FF295BDB5B5B", +"2. c #C646797945C5", +"3. c #C71B7A2446F1", +"4. c #CD4D7E7E4ACA", +"5. c #EEEE60604A4A", +"6. c #F5F562625F5F", +"7. c #FD7D686864E5", +"8. c #FFFF6BFE6BFE", +"9. c #FFFF75F575F5", +"0. c #FFFF7CFC7CFC", +"q. c #BD6782D75CB2", +"w. c #959583837777", +"e. c #A6FC84DA6E18", +"r. c #BB1085DB63B9", +"t. c #A62589897777", +"y. c #ACAC92117F7F", +"u. c #DADA82824848", +"i. c #DEDE87074CCC", +"p. c #CD2285855555", +"a. c #C46E85DB5CB2", +"s. c #CBCB88885C5C", +"d. c #D757898955D6", +"f. c #D4D4894957D8", +"g. c #EB6B900F5353", +"h. c #EDED96965D5D", +"j. c #C645898960E0", +"k. c #C4438E8E6B6B", +"l. c #D0D08C8C6060", +"z. c #CDCD922B6A9D", +"x. c #DC3194EA65BB", +"c. c #D8D895956913", +"v. c #DFDF9B9B6DC3", +"b. c #C7C79696760F", +"n. c #E53A964062B8", +"m. c #E58F99436666", +"M. c #E6E69B9B6A6A", +"N. c #F6F69D9D6262", +"B. c #F2F29F1F68E8", +"V. c #E5E59F9F7070", +"C. c #DCDCA12078F8", +"Z. c #FEFEA0A06262", +"A. c #FD3CA6A66D6D", +"S. c #EABFA7517AFA", +"D. c #FDFDABEB75B5", +"F. c #F6F6AD137C49", +"G. c #FEA8B1067D7D", +"H. c #84EB84B7849E", +"J. c #8CBB8CBB8CBB", +"K. c #9431941D941D", +"L. c #9B9B97979595", +"P. c #9C409C409C40", +"I. c #B7368B8B8B8B", +"U. c #AD0295EB8731", +"Y. c #B1B19A198A8A", +"T. c #A3229A199414", +"R. c #B4339C1C9494", +"E. c #B6B6A4A49999", +"W. c #A38EA38EA38E", +"Q. c #ABABA8A8A7A7", +"!. c #ABCBABABABAB", +"~. c #BCBCAFAFA6A6", +"^. c #B535B535B535", +"/. c #B8B8B7B7B7B7", +"(. c #BCCABCCABCCA", +"). c #C4C49F9F8686", +"_. c #C0C096969696", +"`. c #FFFF853C853C", +"'. c #FFFF8AF88AF8", +"]. c #FFFF94609460", +"[. c #FFFF9BCE9BCE", +"{. c #DF5FA9A98585", +"}. c #DADAABAB8C8C", +"|. c #C544A7A79494", +" X c #D1D1AAAA9191", +".X c #EC41AE58852F", +"XX c #E9E9B2B28E8E", +"oX c #F4F4B2078585", +"OX c #FECBB4E7841D", +"+X c #F635B6368B4B", +"@X c #FF47BA4C8C8C", +"#X c #E867B7379615", +"$X c #ED42BABA9999", +"%X c #F348B9639393", +"&X c #FE46BE2B936E", +"*X c #C1C1AF2FA2A2", +"=X c #CA49B5B5A827", +"-X c #D3D3BB3AAB2A", +";X c #CCCCBCBCB2B2", +":X c #FFFFA40AA40A", +">X c #FFFFAB86AB86", +",X c #FFFFB2F2B2F2", +" Y.CXCXCXCXCXMX * U.nXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXBX ` BXCXCXMX*X @ e.cXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXeX $ A A.2.V i.M . . . o ] fXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXY. o a i.h.F 2.h.a o o o O ] fXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCX` . a J Z.4.N h.d.= O O O + _ aXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCX: . . . o 6 M h.N.F ..A.2.# O O O # B 4XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXcX . . . . o o & Z 2.A.d.A n.B.F # # + # # m -XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCX;X . . . o o o O + F A B.A.H { D.n.b # # % % # m =XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXt. . . . . o o o O O O n H d.D.n.V m.G.p.6 % % % % < b |.BXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCX( . . . o o o O O O O + p o.H D.D.o.| G.F...< % % < % < a b.MXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXX . . . . o o o O O + + + # & 4.A m.D.M.A x.OXS.F < < < < 1 1 u b.MXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXfX . . o o o o O O + O + + + # # 2.o.o.G.G.#.| OXOXv.s 1 1 1 1 2 2 s r.bXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCX*X . . . . o o o O + O + + # + # # # n x.G S.OXS.G z.@X@Xf.u 1 1 2 2 4 4 5 q.jXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCX%. . . . . o o o O O + + + + + # # # # % p M.| s.OXOXa.{ oX@X+X..2 4 2 4 4 4 4 5 X.pXCXCXCXCXCXCXCXCXCXCXCX", +"CXCX, . . . o o o o O + O + + # + # # # # % % 3 f.l.[ oX@XoX .z.1X&X.XD 4 4 5 4 5 5 y y o.pXCXCXCXCXCXCXCXCXCX", +"CXVX. . . o o o O O O + + O # + # # # # % % % % % J F.[ c.&X&Xz.[ +X2X2XM.z 5 5 5 5 y y y d K 9XCXCXCXCXCXCXCX", +"CXrX. . . o o o o o + O O + + + # # # # # % % % % < < C .Xs. .@X&X+XO.k.2X2X2Xl.i d 5 d d y d d g L 9XCXCXCXCXCX", +"CXR.. . . o o o O O O + + # + # # # # % # % % < < < < < u V.S.[ .X&X2XC.} XX6X6X%X2.d d d g g g g g z.CXCXCXCXCX", +"CX] . . . o o O O O O + + + + # # # # # % % % % % < < < 1 3 4.&X@.@.2X2X2X@.r.6X8X8X.XS d d g g g g kXCXCXCXCXCX", +"CX: . . o o o O O O + + + # # + # # # % % % % % % < < < 1 1 1 J @XC.} %X6X6X{._ XX8X8X8XM.c g g g s.CXCXCXCXCXCX", +"nX. . o o o o O + + + + + + # # # % # % % % < % < < 1 < 1 1 2 2 C +X%XO.z.6X6X7Xr.r.8X8X#X{.j g h hXCXCXCXCXCXCX", +"4X. o o o O O O O + + # # # # # # # % % % % < < < < 1 1 1 2 2 2 4 i .X6Xb.O.&X6X#X).=XzXzX Xh h 2.CXCXCXCXCXCXCX", +"y.o . o O O O O + + + + + # # # % % % % < % < < < 1 1 1 2 2 2 2 2 4 M.6X$X X=XyXyXzXzXyXzXD h h 0XCXCXCXCXCXCXCX", +") . o o O O O O + + # # + # # % % % % % < % < < < 1 1 1 2 2 2 4 4 4 3XtXtXtXyXyXyXyXyXyX-Xh h / CXCXCXCXCXCXCXCX", +"- o o O O O + + + + + # # # # % # % % % % < < < 1 1 1 2 2 2 4 4 4 n tXtXtXtXtXtXyXyXyXyX2.h j 5XCXCXCXCXCXCXCXCX", +"@ o O o O O O + + # + # # % # # % % % < < < < < 1 1 1 2 2 2 4 4 5 O.wXwXtXtXtXtXtXtXyX4Xh j ! CXCXCXCXCXCXCXCXCX", +"- o O O O + O # + + # # # # % % % % < % < < < 1 < 1 1 2 2 2 4 4 5 Y.wXwXwXwXtXtXtXtXtXa.j j #XCXCXCXCXCXCXCXCXCX", +"&.O O O + O + # # # # # # % % % % % < < < 1 < 1 1 1 2 2 4 4 4 4 4 ~.wXwXwXwXwXwXtXtXeXl j R VXCXCXCXCXCXCXCXCXCX", +"nX- O O + + + + + # # # # # % % % < % < < < 1 1 1 2 2 2 4 4 4 4 z qXqXqXwXwXwXwXwXwXb.k k {.CXCXCXCXCXCXCXCXCXCX", +"CXaX= O + + # # # # # # % % % % % < < < < 1 1 1 2 2 4 4 4 4 5 4 { qXqXqXqXqXwXwXwXwXc k U BXCXCXCXCXCXCXCXCXCXCX", +"CXCXfX= + O # + # # # % # % % % < < < < < 1 1 2 2 2 4 4 4 4 4 5 e.qX(.qXqXqXqXqXwX).k k C.CXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXfX; + # # # # # % % % % < < < < 1 < 1 1 2 2 2 4 4 4 5 5 5 E.(.(.qXqXqXqXqXqXD k U NXCXCXCXCXCXCX0.CXCXCXCX", +"CXCXCXCXjX; + # # # # % % % < % % < < 1 1 1 2 2 2 4 4 4 4 4 4 i /.(.(.(.(.(.(.qX*Xk k x.CXCXCXCXCXCXCXw `.CXCXCX", +"CXCXCXCXCXjXv # % # % % % % % < < 1 < 1 1 1 2 2 4 4 4 4 5 5 5 A ^././.(.(.(.(.(.2.P P kXCXCXCXCXCXCXCXe 7 uXCXCX", +"CXCXCXCXCXCXxXv # % % % % % < < < < 1 1 1 1 2 4 4 4 4 4 4 5 5 +.^.^.^./.(.(.(.~.k P d.CXCXCXCXCXuX'.`.0 7 e VXCX", +"CXCXCXCXCXCXCXxXv % % % < < < < < 1 1 1 1 2 2 2 4 4 4 5 5 5 5 U.!.^._.>.-.t :.1.5.Q dXCXCXCXCXCXVX8.0 7 7 7 '.CX", +"CXCXCXCXCXCXCXCXnXm % < % < < < < 1 1 1 2 2 4 4 4 4 4 5 5 5 y Q.!.!.=.w r ;.<.8.9.0.[.mXCXCXCXCXCXVX;.8 7 7 9 VX", +"CXCXCXCXCXCXCXCXCXnXm % % < < 1 1 1 1 2 2 4 4 4 4 4 5 5 5 5 C !.!.!.q e t :.7.9.`.].].>XCXCXCXCXCXCXuX8 7 7 7 :X", +"CXCXCXCXCXCXCXCXCXCXnXN < < < < 1 1 2 2 2 2 4 4 4 5 4 5 5 5 } !.!.I.0 e ;.<.8.0.].:X>X>XvXCXCXCXCXCXCXt 7 7 7 <.", +"CXCXCXCXCXCXCXCXCXCXCXMXV < 1 1 1 1 2 2 2 4 4 4 4 5 5 5 5 5 t.W.W.*.0 r ,.6.8.`.[.>XXw 7 7 7 <.", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBX{ 2 2 4 4 4 5 5 5 5 d d d %.L.P.P.P.W.T.I I XXCXCXuX[.:X[.'.].'.8.;.e 9 7 7 7 uX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXX.4 4 4 5 4 5 5 5 d 5 d w.L.P.L.P.P.#.Y T VXCXCXgX'.'.`.0.8.1.;.t w 8 7 7 0.CX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXVXX.2 5 4 5 5 5 5 d d z K.K.L.P.L.L.U I V.CXCXCXCX].9.9.8.1.<.t e 0 7 9 :XCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXVX#.5 5 5 5 d 5 d d A J.K.K.K.L.+.I T NXCXCXCXCXVX>X8.1.:.;.t ;.1.>XVXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXq.5 5 5 5 d d d ' J.J.K.K.K.E Y n.CXCXCXCXCXCXCXCXVXVXVXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXVXq.5 d d d d d $.J.J.J.J.e.Y Y lXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXj.d d d d f H.J.J.J.J.D Y g.CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXa.d d d z H.H.H.J.w.I Y dXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXz.d d z H.H.H.H.J Y u.CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXz.g h ] H.H.%.Y Y sXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX}.g I S S Y Y %XCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX", +"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXpX^ W W i.sXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX" +}; diff --git a/kcnrtl.py b/kcnrtl.py new file mode 100755 index 0000000..b331e95 --- /dev/null +++ b/kcnrtl.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python + +from kcnrtl.main import main + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/kcnrtl/fetchparsebs.py b/kcnrtl/fetchparsebs.py new file mode 100644 index 0000000..609c2b6 --- /dev/null +++ b/kcnrtl/fetchparsebs.py @@ -0,0 +1,38 @@ +#-*- coding: utf-8 -*- + +######################################################################## +# This file is part of KCnrtl # +# # +# # +# Copyright (C) 2012 Bogdan Cordier    # +# # +# KCnrtl is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# KCnrtl is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see .# +######################################################################## + +import httplib2 +from bs4 import BeautifulSoup + +def getSynoAnto(text, form): + conn = httplib2.Http(".cache") + htmlSource = conn.request("http://www.cnrtl.fr/%s/%s" % + (form, text), "GET") + soup = BeautifulSoup(htmlSource[1], "lxml") + tagy = soup.find_all('td', "%s_format" % (form[:4])) + i = 0 + while i < len(tagy): + tag_a = tagy[i] + i += 1 + print tag_a.text + + diff --git a/kcnrtl/fetchparseqt.py b/kcnrtl/fetchparseqt.py new file mode 100644 index 0000000..6711772 --- /dev/null +++ b/kcnrtl/fetchparseqt.py @@ -0,0 +1,107 @@ +#-*- coding: utf-8 -*- + +######################################################################## +# This file is part of KCnrtl # +# # +# # +# Copyright (C) 2012 Bogdan Cordier    # +# # +# KCnrtl is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# KCnrtl is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see .# +######################################################################## + + +from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest +from PyQt4.QtWebKit import QWebPage +from PyQt4.QtCore import QEventLoop, QUrl + + +class FetchParse: + def __init__(self, word, dico, combo1_index, combo2_index, combo2_text, wordclass): + self.word = word + self.dico = dico + self.combo1_index = combo1_index + self.combo2_index = combo2_index + self.combo2_text = combo2_text + self.wordclass = wordclass + self.manager = QNetworkAccessManager() + self.manager.finished.connect(self.replyFinished) + self.loop = QEventLoop() + self.manager.finished.connect(self.loop.quit) + self._reply = "" + + def _get_reply(self): + self.fetch(self.dico) + return self._reply + + reply = property(_get_reply) + + def fetch(self, dico): + if dico == "Lexi": + if not self.combo2_index: + url = ("http://www.cnrtl.fr/definition/%s//%s" % + (self.word, self.combo1_index)) + if self.combo2_index > 0: + acad = unicode(self.combo2_text) + acadnum = filter(lambda x: x.isdigit(), acad) + acadnumf = "academie" + str(acadnum) + url = ("http://www.cnrtl.fr/definition/%s/%s//%s" % + (acadnumf, self.word, self.combo1_index)) + if dico == "Syno": + url = ("http://www.cnrtl.fr/synonymie/%s" % + (self.word)) + if dico == "Anto": + url = ("http://www.cnrtl.fr/antonymie/%s" % + (self.word)) + self.manager.get(QNetworkRequest(QUrl(url))) + self.loop.exec_() + + def replyFinished(self, datareply): + data = datareply.readAll() + page = QWebPage() + page.mainFrame().setContent(data) + webpage = page.mainFrame().documentElement() + if self.wordclass == "definition": + result = webpage.findAll("div#contentbox") + a = "" + if not self.combo2_index: + a = "div.tlf_cvedette" + if 1 <= self.combo2_index <= 3: + a = "span.tlf_cvedette" + result_to_remove = webpage.findAll(a) + string_to_remove = result_to_remove.first().toInnerXml() + final_page = result.first().toInnerXml() + resultf = final_page.replace(string_to_remove, '') + + result_box = webpage.findFirst('div#vtoolbar') + result_test = result_box.findAll("a[href]") + self.formtype = [] + i = 0 + while i < len(result_test): + multdef_a = unicode(result_test.at(i).toPlainText()) + # Delete digits in definition title + multdef_clean = ''.join(c for c in + multdef_a if not c.isdigit()) + self.formtype.append(multdef_clean) + i += 1 + self._reply = resultf, self.formtype + if self.wordclass == "synonyme" or self.wordclass == "antonyme": + self._reply = [] + result = webpage.findAll("td." + self.wordclass[:4] + "_format") + tag = [] + i = 0 + while i < len(result): + tag.append(result.at(i).firstChild().toPlainText()) + i += 1 + self._reply = tag + diff --git a/kcnrtl/gui/Ui_kcnrtl.py b/kcnrtl/gui/Ui_kcnrtl.py index b95ea43..7942fef 100644 --- a/kcnrtl/gui/Ui_kcnrtl.py +++ b/kcnrtl/gui/Ui_kcnrtl.py @@ -93,7 +93,7 @@ class Ui_MainWindow(object): self.checkBox.setText(QtGui.QApplication.translate("MainWindow", "Clipboard Mode", None, QtGui.QApplication.UnicodeUTF8)) from PyQt4 import QtWebKit -import resources.kcnrtl_rc +from kcnrtl.resources import kcnrtl_rc if __name__ == "__main__": import sys diff --git a/kcnrtl/gui/gui.py b/kcnrtl/gui/gui.py new file mode 100755 index 0000000..6bf0e19 --- /dev/null +++ b/kcnrtl/gui/gui.py @@ -0,0 +1,124 @@ +#!/usr/bin/python +#-*- coding: utf-8 -*- + +######################################################################## +# This file is part of KCnrtl # +# # +# # +# Copyright (C) 2012 Bogdan Cordier    # +# # +# KCnrtl is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# KCnrtl is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see .# +######################################################################## + +import sys +from PyQt4.QtCore import QUrl, Qt +from PyQt4.QtGui import QApplication, QMainWindow, QWidget +from kcnrtl.fetchparseqt import FetchParse +from kcnrtl.models import ListModel +from Ui_kcnrtl import Ui_MainWindow + + +def main(): + app = QApplication(sys.argv) + myapp = Main() + myapp.show() + sys.exit(app.exec_()) + + +class Main(QMainWindow): + def __init__(self, parent=None): + super(QWidget, self).__init__(parent) + + self.ui = Ui_MainWindow() + + self.ui.setupUi(self) + + self.ui.lineEdit.selectAll() + + self.ui.lineEdit.setFocus() + + self.ui.comboBox.setCurrentIndex(0) + + self.ui.checkBox.setChecked(False) + + + self.dictionaries = [str("TLFi").decode("utf-8", "strict"), + str("Académie 9e Ed.").decode("utf-8", "strict"), + str("Académie 8e Ed.").decode("utf-8", "strict"), + str("Académie 4e Ed.").decode("utf-8", "strict"), + ] + self.ui.comboBox_2.addItems(self.dictionaries) + + self.clipboard = QApplication.clipboard() + + self.ui.lineEdit.returnPressed.connect(self.updateUi) + + self.ui.comboBox.activated.connect(self.on_combo_change) + + self.ui.webView.settings().setUserStyleSheetUrl( + QUrl.fromLocalFile(':/lexi.css')) + + self.ui.listView.clicked.connect(self.on_row_clicked) + + self.clipboard.dataChanged.connect(self.get_from_clipboard) + + + + def updateUi(self): + # Check if input text is a word + if len(unicode(self.ui.lineEdit.text()).split()) <= 1: + wordclass = "definition" + dico = "Lexi" + lexi = FetchParse(self.ui.lineEdit.text(),dico, self.ui.comboBox.currentIndex(), + self.ui.comboBox_2.currentIndex(), self.ui.comboBox_2.currentText(), wordclass) + result_lexi = lexi.reply + self.ui.webView.setHtml(result_lexi[0]) + self.ui.comboBox.clear() + self.ui.comboBox.addItems(result_lexi[1]) + wordclass = "synonyme" + dico = "Syno" + syno = FetchParse(self.ui.lineEdit.text(),dico, self.ui.comboBox.currentIndex(), + self.ui.comboBox_2.currentIndex(), self.ui.comboBox_2.currentText(), wordclass) + model = ListModel(syno.reply, self) + self.ui.listView.setModel(model) + wordclass = "antonyme" + dico = "Anto" + anto = FetchParse(self.ui.lineEdit.text(),dico, self.ui.comboBox.currentIndex(), + self.ui.comboBox_2.currentIndex(), self.ui.comboBox_2.currentText(), wordclass) + model = ListModel(anto.reply, self) + self.ui.listView_2.setModel(model) + + else: + self.ui.lineEdit.setText("Veuillez entrer UN mot") + + # Copy selected item in list to the clipboard + def on_row_clicked(self, qmodelindex): + item = qmodelindex.data(Qt.DisplayRole).toString() + self.clipboard.setText(item) +# + def get_from_clipboard(self): + if self.ui.checkBox.isChecked(): + self.ui.lineEdit.setText(unicode(self.clipboard.text())) + self.updateUi() +# + def on_combo_change(self): + wordclass = "definition" + dico = "Lexi" + lexi = FetchParse(self.ui.lineEdit.text(),dico, self.ui.comboBox.currentIndex(), + self.ui.comboBox_2.currentIndex(), self.ui.comboBox_2.currentText(), wordclass) + result_lexi = lexi.reply + self.ui.webView.setHtml(result_lexi[0]) + +if __name__ == "__main__": + main() diff --git a/kcnrtl/kcnrtl.py b/kcnrtl/kcnrtl.py deleted file mode 100755 index 30c77c7..0000000 --- a/kcnrtl/kcnrtl.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- - -######################################################################## -# KCnrtl - A simple Qt graphical client to access the CNRTL # -# french linguistic resources. # -# # -# Copyright (C) 2012 Bogdan Cordier    # -# # -# This program is free software: you can redistribute it and/or modify # -# it under the terms of the GNU General Public License as published by # -# the Free Software Foundation, either version 3 of the License, or # -# (at your option) any later version. # -# # -# This program is distributed in the hope that it will be useful, # -# but WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # -# GNU General Public License for more details. # -# # -# You should have received a copy of the GNU General Public License # -# along with this program. If not, see .# -######################################################################## - -import sys -from PyQt4.QtCore import QEventLoop, QUrl, QAbstractListModel, QModelIndex, QVariant, Qt -from PyQt4.QtGui import QApplication, QMainWindow, QWidget -from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest -from PyQt4.QtWebKit import QWebPage -from gui.Ui_kcnrtl import Ui_MainWindow - - -def main(): - app = QApplication(sys.argv) - myapp = Main() - myapp.show() - sys.exit(app.exec_()) - - -class Main(QMainWindow): - def __init__(self, parent=None): - super(QWidget, self).__init__(parent) - - self.ui = Ui_MainWindow() - - self.ui.setupUi(self) - - self.ui.lineEdit.selectAll() - - self.ui.lineEdit.setFocus() - - self.ui.comboBox.setCurrentIndex(0) - - self.ui.checkBox.setChecked(False) - - self.manager = QNetworkAccessManager() - - self.dictionaries = [str("TLFi").decode("utf-8", "strict"), - str("Académie 9e Ed.").decode("utf-8", "strict"), - str("Académie 8e Ed.").decode("utf-8", "strict"), - str("Académie 4e Ed.").decode("utf-8", "strict"), - ] - self.ui.comboBox_2.addItems(self.dictionaries) - - self.clipboard = QApplication.clipboard() - - self.ui.lineEdit.returnPressed.connect(self.updateUi) - - self.ui.comboBox.activated.connect(self.on_combo_change) - - self.ui.webView.settings().setUserStyleSheetUrl( - QUrl.fromLocalFile(':/lexi.css')) - - self.ui.listView.clicked.connect(self.on_row_clicked) - - self.clipboard.dataChanged.connect(self.get_from_clipboard) - - self.manager.finished.connect(self.replyFinished) - - self.loop = QEventLoop() - - self.manager.finished.connect(self.loop.quit) - - self.tagform = [] - - def updateUi(self): - # Check if input text is a word - if len(unicode(self.ui.lineEdit.text()).split()) <= 1: - self.formtype = "definition" - self.fetch("Lexi") - self.ui.comboBox.clear() - self.ui.comboBox.addItems(self.tagform) - self.formtype = "synonyme" - self.fetch("Syno") - self.formtype = "antonyme" - self.fetch("Anto") - else: - self.ui.lineEdit.setText("Veuillez entrer UN mot") - - # Copy selected item in list to the clipboard - def on_row_clicked(self, qmodelindex): - item = qmodelindex.data(Qt.DisplayRole).toString() - self.clipboard.setText(item) -# - def get_from_clipboard(self): - if self.ui.checkBox.isChecked(): - self.ui.lineEdit.setText(unicode(self.clipboard.text())) - self.updateUi() -# - def on_combo_change(self): - self.formtype = "definition" - self.fetch("Lexi") - - - def fetch(self, dico): - if dico == "Lexi": - if not self.ui.comboBox_2.currentIndex(): - url = ("http://www.cnrtl.fr/definition/%s//%s" % - (self.ui.lineEdit.text(), self.ui.comboBox.currentIndex())) - if self.ui.comboBox_2.currentIndex() > 0: - acad = unicode(self.ui.comboBox_2.currentText()) - acadnum = filter(lambda x: x.isdigit(), acad) - acadnumf = "academie" + str(acadnum) - url = ("http://www.cnrtl.fr/definition/%s/%s//%s" % - (acadnumf, self.ui.lineEdit.text(), self.ui.comboBox.currentIndex())) - if dico == "Syno": - url = ("http://www.cnrtl.fr/synonymie/%s" % - (self.ui.lineEdit.text())) - if dico == "Anto": - url = ("http://www.cnrtl.fr/antonymie/%s" % - (self.ui.lineEdit.text())) - self.manager.get(QNetworkRequest(QUrl(url))) - self.loop.exec_() - - def replyFinished(self, reply): - data = reply.readAll() - page = QWebPage() - page.mainFrame().setContent(data) - webpage = page.mainFrame().documentElement() - if self.formtype == "definition": - result = webpage.findAll("div#contentbox") - if not self.ui.comboBox_2.currentIndex(): - result_to_remove = webpage.findAll("div.tlf_cvedette") - if 1 <= self.ui.comboBox_2.currentIndex() <= 3: - result_to_remove = webpage.findAll("span.tlf_cvedette") - string_to_remove = result_to_remove.first().toInnerXml() - final_page = result.first().toInnerXml() - resultf = final_page.replace(string_to_remove, '') - self.ui.webView.setHtml(resultf) - - result_box = webpage.findFirst('div#vtoolbar') - result_test = result_box.findAll("a[href]") - self.tagform = [] - i = 0 - while i < len(result_test): - multdef_a = unicode(result_test.at(i).toPlainText()) - # Delete digits in definition title - multdef_clean = ''.join(c for c in - multdef_a if not c.isdigit()) - self.tagform.append(multdef_clean) - i += 1 - if self.formtype == "synonyme" or "antonyme": - result = webpage.findAll("td." + self.formtype[:4] + "_format") - tag = [] - i = 0 - while i < len(result): - tag.append(result.at(i).firstChild().toPlainText()) - i += 1 - model = ListModel(tag, self) - if self.formtype == "synonyme": - self.ui.listView.setModel(model) - if self.formtype == "antonyme": - self.ui.listView_2.setModel(model) - -class ListModel(QAbstractListModel): - def __init__(self, datain, parent=None, *args): - """ datain: a list where each item is a row - """ - QAbstractListModel.__init__(self, parent, *args) - self.listdata = datain - - def rowCount(self, parent=QModelIndex()): - return len(self.listdata) - - def data(self, index, role): - if index.isValid() and role == Qt.DisplayRole: - return QVariant(self.listdata[index.row()]) - else: - return QVariant() - -if __name__ == "__main__": - main() diff --git a/kcnrtl/main.py b/kcnrtl/main.py new file mode 100755 index 0000000..b234a19 --- /dev/null +++ b/kcnrtl/main.py @@ -0,0 +1,57 @@ +#!/usr/bin/python +#-*- coding: utf-8 -*- + +######################################################################## +# This file is part of KCnrtl # +# # +# # +# Copyright (C) 2012 Bogdan Cordier    # +# # +# KCnrtl is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# KCnrtl is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see .# +######################################################################## + + +import argparse +import sys + +def main(): + cmd = argparse.ArgumentParser(description="Check for synonyms or antonyms", + prog='kcnrtl', usage='%(prog)s --help [options] word') + + cmd.add_argument('word', default="", nargs='?', + help="The word to look for") + + cmd.add_argument('-s', '--synonym', action="store_true", + help="Display synonyms of any word") + + cmd.add_argument('-a', '--antonym', action="store_true", + help="Display antonyms of any word") + + args = cmd.parse_args() + + if 'word' in args: + wordset = args.word + + if len(sys.argv) < 2: + from gui.gui import main + exit(main()) + else: + from fetchparsebs import getSynoAnto + if args.synonym: + getSynoAnto(wordset, "synonymie") + if args.antonym: + getSynoAnto(wordset, "antonymie") + +if __name__ == '__main__': + main() diff --git a/kcnrtl/models.py b/kcnrtl/models.py new file mode 100644 index 0000000..c233407 --- /dev/null +++ b/kcnrtl/models.py @@ -0,0 +1,17 @@ +from PyQt4.QtCore import QModelIndex, QVariant, Qt, QAbstractListModel + +class ListModel(QAbstractListModel): + def __init__(self, datain, parent=None, *args): + """ datain: a list where each item is a row + """ + QAbstractListModel.__init__(self, parent, *args) + self.listdata = datain + + def rowCount(self, parent=QModelIndex()): + return len(self.listdata) + + def data(self, index, role): + if index.isValid() and role == Qt.DisplayRole: + return QVariant(self.listdata[index.row()]) + else: + return QVariant() \ No newline at end of file diff --git a/kcnrtl/resources/kcnrtl_icon.svg b/kcnrtl/resources/kcnrtl_icon.svg new file mode 100644 index 0000000..5e3a7b4 --- /dev/null +++ b/kcnrtl/resources/kcnrtl_icon.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/setup.py b/setup.py index acf3639..76bdf12 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ def read(fname): return open(os.path.join(os.path.dirname(__file__), fname)).read() setup(name='KCnrtl', - version='0.3b', + version='0.4b', description='Qt graphical client for the CNRTL french linguistic resources', license = "GPLv3", author="Bogdan Cordier", @@ -15,10 +15,12 @@ setup(name='KCnrtl', url="http://code.lm7.fr/p/kcnrtl/", download_url="http://code.lm7.fr/p/kcnrtl/downloads/", packages=['kcnrtl'], + requires=['BeautifulSoup4','httplib2'], long_description=read('README'), classifiers=[ "Development Status :: 4 - Beta", - "Environment :: X11 Applications :: Qt" + "Environment :: X11 Applications :: Qt", + "Environment :: Console", "Topic :: Utilities", "Natural Language :: French", "Intended Audience :: Education"