keyword generator frontend

This commit is contained in:
age 2006-04-05 21:27:14 +00:00
parent efb77a790d
commit 86bfa4454a
6 changed files with 520 additions and 2 deletions

View file

@ -0,0 +1,27 @@
#!/usr/bin/env python
class Main:
'run this class to see the keyword generator in action'
import sys
try:
import pygtk
pygtk.require("2.0") #we want to use gtk2
except:
print "\nYou need \"pygtk\" to get this working."
print "In Debian do: apt-get install python2.3-gtk2\n"
sys.exit(1)
try:
import gtk
from gtk import glade
except:
print "\nYou need \"libglade\" to get this working."
print "In Debian do: apt-get install python2.3-glade2\n"
sys.exit(1)
import kg_frontend
kgf = kg_frontend.KeywordGeneratorFrontend(gtk)
gtk.main()

View file

@ -0,0 +1,340 @@
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
<glade-interface>
<widget class="GtkWindow" id="window1">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="title" translatable="yes">Keyword Generator</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
<property name="default_width">300</property>
<property name="default_height">500</property>
<property name="resizable">True</property>
<property name="destroy_with_parent">False</property>
<property name="icon_name">stock_filters</property>
<property name="decorated">True</property>
<property name="skip_taskbar_hint">False</property>
<property name="skip_pager_hint">False</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
<property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
<property name="focus_on_map">True</property>
<signal name="destroy_event" handler="on_window1_destroy_event" last_modification_time="Wed, 05 Apr 2006 19:16:16 GMT"/>
<signal name="destroy" handler="on_window1_destroy" last_modification_time="Wed, 05 Apr 2006 19:22:48 GMT"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="label" translatable="yes">Keyword Generator 0.1</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_CENTER</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">5</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<property name="spacing">5</property>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">5</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
<widget class="GtkEntry" id="entry2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">5</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<property name="spacing">0</property>
<child>
<widget class="GtkEntry" id="entry3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">True</property>
<property name="visibility">True</property>
<property name="max_length">0</property>
<property name="text" translatable="yes"></property>
<property name="has_frame">True</property>
<property name="invisible_char">*</property>
<property name="activates_default">False</property>
</widget>
<packing>
<property name="padding">5</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="pack_type">GTK_PACK_END</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
<child>
<widget class="GtkEventBox" id="eventbox1">
<property name="visible">True</property>
<property name="visible_window">True</property>
<property name="above_child">False</property>
<child>
<widget class="GtkHBox" id="hbox4">
<property name="border_width">5</property>
<property name="visible">True</property>
<property name="homogeneous">True</property>
<property name="spacing">0</property>
<child>
<widget class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="label" translatable="yes"></property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="bu_ok">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
<signal name="clicked" handler="on_bu_ok_clicked" last_modification_time="Wed, 05 Apr 2006 13:37:09 GMT"/>
<child>
<widget class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<property name="top_padding">0</property>
<property name="bottom_padding">0</property>
<property name="left_padding">0</property>
<property name="right_padding">0</property>
<child>
<widget class="GtkHBox" id="hbox5">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">2</property>
<child>
<widget class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-apply</property>
<property name="icon_size">4</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="label" translatable="yes">loslegen</property>
<property name="use_underline">True</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
<property name="wrap">False</property>
<property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
<property name="width_chars">-1</property>
<property name="single_line_mode">False</property>
<property name="angle">0</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow1">
<property name="height_request">180</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_IN</property>
<property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
<widget class="GtkTextView" id="tf_output">
<property name="border_width">3</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="overwrite">False</property>
<property name="accepts_tab">True</property>
<property name="justification">GTK_JUSTIFY_LEFT</property>
<property name="wrap_mode">GTK_WRAP_WORD</property>
<property name="cursor_visible">False</property>
<property name="pixels_above_lines">0</property>
<property name="pixels_below_lines">0</property>
<property name="pixels_inside_wrap">0</property>
<property name="left_margin">0</property>
<property name="right_margin">0</property>
<property name="indent">0</property>
<property name="text" translatable="yes">In jedes der drei oberen Textfelder können kommaseparierte Wortlisten eingetragen werden. Daraus wird dann in dieser Textbox die Keywordliste generiert.
Aber das Beste ist, das funktioniert auch alles ohne Maus 8]</property>
</widget>
</child>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">True</property>
<property name="fill">True</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
<glade-project>
<name>Kg-frontend</name>
<program_name>kg-frontend</program_name>
<gnome_support>FALSE</gnome_support>
</glade-project>

101
adstreme/glade/kg_calc.py Normal file
View file

@ -0,0 +1,101 @@
#!/usr/bin/env python
#TODO: funktion, die aus parametern schoene listen macht.
class KeywordGenerator:
def __init__(self):
import string,sys
return
def add_prefix_to_strings(self,prefix,stringlist):
"""gets a string and a list of strings
returns a list of strings each prefixed with given string."""
ret = []
for item in stringlist:
ret.append(prefix+item)
return ret
def quotes_and_braces(self,keywords):
"""gets a string with keywords, returns
given string
"given string"
[given string]
"""
ret = '%s\n' % keywords
#ret += '"%s"\n' % keywords
#ret += '[%s]\n' % keywords
return ret
def arg_string_to_list(self,s):
"""gets a string.
removes all occurences of " and splits with , as separator."""
s = s.replace('"','')
ret = s.split(',')
return ret
def generate_keywords(self,l1,l2,l3):
"""
gets 3 lists of keyword parts.
returns a string containing every possible combination of above
keywords and its generated variants from quotes_and_braces."
"""
ret = ""
list1 = self.arg_string_to_list(l1)
list2 = self.arg_string_to_list(l2)
list3 = self.arg_string_to_list(l3)
for list1item in list1:
tmplist1 = []
tmplist1 = self.add_prefix_to_strings(list1item+" ",list2)
for tmplist1item in tmplist1:
tmplist2 = []
tmplist2 = self.add_prefix_to_strings(tmplist1item+" ",list3)
for tmplist2item in tmplist2:
ret += self.quotes_and_braces(tmplist2item)
ret += "\n"
return ret[:-3] #cut the tailing '\n\n\n'
'''
def test():
#sample data
#test quotes_and_brace
keywords = "fair clothing"
expected_result = """fair clothing\n"fair clothing"\n[fair clothing]\n"""
if quotes_and_braces(keywords) != expected_result:
raise "test of quotes_and_braces() failed!"
#test add_prefix_to_strings
pref = "fair "
strlist = ["clothing","clothings"]
expected_result = ["fair clothing","fair clothings"]
if add_prefix_to_strings(pref,strlist) != expected_result:
raise "test of add_prefix_to_strings() failed!"
#test generate_keywords
list1 = ["fair"]
list2 = ["clothing","clothings"]
list3 = ["buy"]
expected_result = """fair clothing buy\n"fair clothing buy"\n[fair clothing buy]\n\n\nfair clothings buy\n"fair clothings buy"\n[fair clothings buy]\n\n\n"""
if generate_keywords(list1,list2,list3) != expected_result:
raise "test of generate_keywords() failed!"
#test arg_string_to_list(s)
s = '"clothing,clothings"'
expected_result = ['clothing', 'clothings']
if arg_string_to_list(s) != expected_result:
raise "test of arg_string_to_list() failed!"
#test get_arguments()
(list1,list2,list3) = get_arguments()
if __name__ == "__main__":
#test()
if len(sys.argv) !=4 :
print ' %s is a script for generating keyword lists suitable for google adwords.' % sys.argv[0]
print ' usage: %s "part1,alterative part1" "part2, another part2" ",verb"' % sys.argv[0]
else:
(list1,list2,list3) = get_arguments()
print generate_keywords(list1,list2,list3)
'''

View file

@ -0,0 +1,41 @@
#!/usr/bin/env python -v
class KeywordGeneratorFrontend:
'this class handles the gui'
import kg_calc
import sys,string
def __init__(self, gtkext):
# gtk is given, it has to be known in the whole class
self.gtk = gtkext
# define which gladefile to use for frontend
gladefile = "kg-frontend/kg-frontend.glade"
self.gui = self.gtk.glade.XML(gladefile)
# set button handlers
actions = { "on_bu_ok_clicked": self.clicked_ok,
"on_window1_destroy": self.exit }
# connect the actions to the events
self.gui.signal_autoconnect (actions)
return
#### implementation of actions
def clicked_ok(self, widget):
'read input fields and print them'
#self.gui.get_widget("tf_output").set_text("saved to file")
entry1 = self.gui.get_widget("entry1").get_text()
entry2 = self.gui.get_widget("entry2").get_text()
entry3 = self.gui.get_widget("entry3").get_text()
kg = self.kg_calc.KeywordGenerator()
self.keywords = kg.generate_keywords(entry1,entry2,entry3)
self.outputfield = self.gui.get_widget("tf_output")
self.textbuffer = self.outputfield.get_buffer()
self.textbuffer.set_text(self.keywords)
def exit(self, widget):
print "schiss digga"
self.sys.exit(1)

View file

@ -1,3 +1,4 @@
#!/usr/bin/env python
#TODO: funktion, die aus parametern schoene listen macht.
import string,sys
@ -107,7 +108,7 @@ def test():
if __name__ == "__main__":
#test()
if len(sys.argv) <=1:
if len(sys.argv) !=4 :
print ' %s is a script for generating keyword lists suitable for google adwords.' % sys.argv[0]
print ' usage: %s "part1,alterative part1" "part2, another part2" ",verb"' % sys.argv[0]
else: