├── .gitignore
├── Microsoft.VC90.CRT
├── Microsoft.VC90.CRT.manifest
├── msvcm90.dll
├── msvcp90.dll
└── msvcr90.dll
├── README
├── build.bat
├── cache.py
├── clean.bat
├── core.py
├── icons
├── align-center.png
├── align-left.png
├── align-right.png
├── bigger.png
├── exit.png
├── icon.ico
├── minus.png
├── new.png
├── open.png
├── plus.png
├── save.png
└── smaller.png
├── images
├── 10-Guy.jpg
├── Advice-Dog.jpg
├── Advice-God.jpg
├── Advice-Yoda.jpg
├── Ancient-Aliens.jpg
├── Annoying-Childhood-Friend.jpg
├── Annoying-Facebook-Girl.jpg
├── Anti-Joke-Chicken.jpg
├── Art-Student-Owl.jpg
├── Baby-Godfather.jpg
├── Bad-Advice-Cat.jpg
├── Bad-Joke-Eel.jpg
├── Bad-Luck-Brian.jpg
├── Bear-Grylls.jpg
├── Blank-Colored-Background.jpg
├── Brace-Yourselves-X-is-Coming.jpg
├── Business-Cat.jpg
├── Butthurt-Dweller.jpg
├── Chemistry-Cat.jpg
├── College-Freshman.jpg
├── Computer-Guy.jpg
├── Confession-Bear.jpg
├── Conspiracy-Keanu.jpg
├── Courage-Wolf.jpg
├── Crazy-Girlfriend-Praying-Mantis.jpg
├── Creepy-Condescending-Wonka.jpg
├── Depression-Dog.jpg
├── Downvoting-Roman.jpg
├── Drunk-Baby.jpg
├── Dwight-Schrute.jpg
├── Ermahgerd-Berks.jpg
├── Evil-Cows.jpg
├── Family-Tech-Support-Guy.jpg
├── First-World-Problems-Cat.jpg
├── First-World-Problems.jpg
├── Fk-Yeah.jpg
├── Forever-Alone.jpg
├── Foul-Bachelor-Frog.jpg
├── Foul-Bachelorette-Frog.jpg
├── Futurama-Fry.jpg
├── Futurama-Zoidberg.jpg
├── Gasp-Rage-Face.jpg
├── Good-Guy-Greg.jpg
├── Grandma-Finds-The-Internet.jpg
├── Hawkward.jpg
├── Helpful-Tyler-Durden.jpg
├── High-Expectations-Asian-Father.jpg
├── Hipster-Barista.jpg
├── Hipster-Kitty.jpg
├── I-Have-No-Idea-What-I-Am-Doing.jpg
├── Idiot-Nerd-Girl.jpg
├── Ill-Just-Wait-Here.jpg
├── Insanity-Wolf.jpg
├── Joseph-Ducreux.jpg
├── Karate-Kyle.jpg
├── LOL-Guy.jpg
├── Lame-Pun-Coon.jpg
├── Lazy-College-Senior.jpg
├── Matrix-Morpheus.jpg
├── Men-Laughing.jpg
├── Musically-Oblivious-8th-Grader.jpg
├── Neil-deGrasse-Tyson.jpg
├── Oh-No.jpg
├── One-Does-Not-Simply.jpg
├── Ordinary-Muslim-Man.jpg
├── Original-I-Lied.jpg
├── Overly-Attached-Girlfriend.jpg
├── PTSD-Clarinet-Boy.jpg
├── Paranoid-Parrot.jpg
├── Patriotic-Eagle.jpg
├── Pedobear.jpg
├── Philosoraptor.jpg
├── Pickup-Line-Panda.jpg
├── Priority-Peter.jpg
├── Put-It-Somewhere-Else-Patrick.jpg
├── Question-Rage-Face.jpg
├── Rasta-Science-Teacher.jpg
├── Redditors-Wife.jpg
├── Redneck-Randal.jpg
├── Rich-Raven.jpg
├── Sad-X-All-The-Y.jpg
├── Say-That-Again-I-Dare-You.jpg
├── Scumbag-Brain.jpg
├── Scumbag-Minecraft.jpg
├── Scumbag-Redditor.jpg
├── Scumbag-Steve.jpg
├── Sexually-Oblivious-Rhino.jpg
├── Sheltering-Suburban-Mom.jpg
├── Shut-Up-And-Take-My-Money-Fry.jpg
├── Skeptical-Baby.jpg
├── Slowpoke.jpg
├── Socially-Awesome-Awkward-Penguin.jpg
├── Socially-Awesome-Penguin.jpg
├── Socially-Awkward-Penguin.jpg
├── Stoner-Dog.jpg
├── Success-Kid.jpg
├── Successful-Black-Man.jpg
├── Sudden-Clarity-Clarence.jpg
├── Surprised-Coala.jpg
├── Tech-Impaired-Duck.jpg
├── The-Most-Interesting-Cat-In-The-World.jpg
├── The-Most-Interesting-Man-In-The-World.jpg
├── Third-World-Skeptical-Kid.jpg
├── Third-World-Success-Kid.jpg
├── Too-Damn-High.jpg
├── Troll-Face-Colored.jpg
├── True-Story.jpg
├── Unhelpful-High-School-Teacher.jpg
├── Vengeance-Dad.jpg
├── We-Will-Rebuild.jpg
├── X-All-The-Y.jpg
├── Y-U-No.jpg
├── Yao-Ming.jpg
└── Yo-Dawg-Heard-You.jpg
├── installer.iss
├── main.py
└── setup.py
/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyd
2 | *.pyc
3 | *.pyo
4 | *.tmp
5 | *.bak
6 | *~
7 |
8 |
--------------------------------------------------------------------------------
/Microsoft.VC90.CRT/Microsoft.VC90.CRT.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | KSaO8M0iCtPF6YEr79P1dZsnomY= ojDmTgpYMFRKJYkPcM6ckpYkWUU= tVogb8kezDre2mXShlIqpp8ErIg=
6 |
--------------------------------------------------------------------------------
/Microsoft.VC90.CRT/msvcm90.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/Microsoft.VC90.CRT/msvcm90.dll
--------------------------------------------------------------------------------
/Microsoft.VC90.CRT/msvcp90.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/Microsoft.VC90.CRT/msvcp90.dll
--------------------------------------------------------------------------------
/Microsoft.VC90.CRT/msvcr90.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/Microsoft.VC90.CRT/msvcr90.dll
--------------------------------------------------------------------------------
/README:
--------------------------------------------------------------------------------
1 | pyMeme is the official Python port of iMeme, a meme generator for Mac OS X.
2 |
3 | pyMeme has been tested on Windows and Mac OS X but should also work on Linux.
4 |
5 | http://www.michaelfogleman.com/imeme/
6 |
7 | * Over 50 built-in templates.
8 | * Enter your own header and footer text.
9 | * Adjustable text size and alignment.
10 | * Use your own images.
11 | * Save as JPG.
12 | * Works on Windows XP and up.
13 |
--------------------------------------------------------------------------------
/build.bat:
--------------------------------------------------------------------------------
1 | python setup.py
2 | "C:\Program Files (x86)\Inno Setup 5\Compil32.exe" /cc installer.iss
3 |
--------------------------------------------------------------------------------
/cache.py:
--------------------------------------------------------------------------------
1 | import wx
2 | import urllib2
3 | import os
4 | from StringIO import StringIO
5 | class Cache(object):
6 | def __init__(self):
7 | self.cache = {}
8 | def get_bitmap(self, key):
9 | if key is None or isinstance(key, wx.Bitmap):
10 | return key
11 | if key not in self.cache:
12 | if os.path.exists(key):
13 | self.cache[key] = wx.Bitmap(key)
14 | else:
15 | fp = urllib2.urlopen(key)
16 | data = fp.read()
17 | fp.close()
18 | img = wx.ImageFromStream(StringIO(data))
19 | self.cache[key] = img.ConvertToBitmap()
20 | return self.cache[key]
21 | def get_color(self, key):
22 | if key is None or isinstance(key, wx.Colour):
23 | return key
24 | if key not in self.cache:
25 | self.cache[key] = wx.Colour(*key)
26 | return self.cache[key]
27 | def get_font(self, key):
28 | if key is None or isinstance(key, wx.Font):
29 | return key
30 | if key not in self.cache:
31 | self.cache[key] = self.make_font(key)
32 | return self.cache[key]
33 | def make_font(self, key):
34 | face, size, bold, italic, underline = key
35 | family = wx.FONTFAMILY_DEFAULT
36 | style = wx.FONTSTYLE_ITALIC if italic else wx.FONTSTYLE_NORMAL
37 | weight = wx.FONTWEIGHT_BOLD if bold else wx.FONTWEIGHT_NORMAL
38 | font = wx.Font(size, family, style, weight, underline, face)
39 | return font
40 |
41 | DEFAULT_CACHE = Cache()
42 |
43 | def get_bitmap(key):
44 | return DEFAULT_CACHE.get_bitmap(key)
45 |
46 | def get_color(key):
47 | return DEFAULT_CACHE.get_color(key)
48 |
49 | def get_font(key):
50 | return DEFAULT_CACHE.get_font(key)
51 |
--------------------------------------------------------------------------------
/clean.bat:
--------------------------------------------------------------------------------
1 | rmdir /S /Q build
2 | rmdir /S /Q dist
3 | rmdir /S /Q installer
4 |
--------------------------------------------------------------------------------
/core.py:
--------------------------------------------------------------------------------
1 | import cache
2 | import re
3 | import wx
4 |
5 | # Constants
6 | LEFT = 1
7 | RIGHT = 2
8 | CENTER = 3
9 |
10 | # Functions
11 | def font(face='', size=12, bold=False, italic=False, underline=False):
12 | return (face, size, bold, italic, underline)
13 |
14 | def word_wrap(dc, width, text):
15 | lines = []
16 | pattern = re.compile(r'(\s+)')
17 | lookup = dict((c, dc.GetTextExtent(c)[0]) for c in set(text))
18 | for line in text.splitlines():
19 | tokens = pattern.split(line)
20 | tokens.append('')
21 | widths = [sum(lookup[c] for c in token) for token in tokens]
22 | start, total = 0, 0
23 | for index in xrange(0, len(tokens), 2):
24 | if total + widths[index] > width:
25 | end = index + 2 if index == start else index
26 | lines.append(''.join(tokens[start:end]))
27 | start, total = end, 0
28 | if end == index + 2:
29 | continue
30 | total += widths[index] + widths[index + 1]
31 | if start < len(tokens):
32 | lines.append(''.join(tokens[start:]))
33 | lines = [line.strip() for line in lines]
34 | return lines or ['']
35 |
36 | def get_dc():
37 | return wx.MemoryDC(wx.EmptyBitmap(1, 1))
38 |
39 | # Classes
40 | class Control(object):
41 | def __init__(self, **kwargs):
42 | kwargs.setdefault('position', (0, 0))
43 | kwargs.setdefault('anchor', (0, 0))
44 | for name, value in kwargs.items():
45 | setattr(self, name, value)
46 | def get_computed_position(self, size):
47 | ww, wh = size
48 | ax, ay = self.anchor
49 | x, y = self.position
50 | w, h = self.get_size()
51 | x = ww + x if x < 0 else x
52 | y = wh + y if y < 0 else y
53 | x -= w * ax
54 | y -= h * ay
55 | return (x, y)
56 | def render(self, dc, size, offset):
57 | dx, dy = offset
58 | x, y = self.get_computed_position(size)
59 | x, y = x + dx, y + dy
60 | w, h = self.get_size()
61 | dc.SetDeviceOrigin(x, y)
62 | dc.SetClippingRegion(0, 0, w, h)
63 | self.draw(dc)
64 | dc.DestroyClippingRegion()
65 | dc.SetDeviceOrigin(0, 0)
66 | def get_size(self):
67 | raise NotImplementedError
68 | def draw(self, dc):
69 | raise NotImplementedError
70 |
71 | class Page(object):
72 | def __init__(self):
73 | self.controls = []
74 | def add(self, control, position=None, anchor=None):
75 | if position:
76 | control.position = position
77 | if anchor:
78 | control.anchor = anchor
79 | self.controls.append(control)
80 | def render(self, dc, size, offset):
81 | for control in self.controls:
82 | control.render(dc, size, offset)
83 |
84 | class Bitmap(Control):
85 | def __init__(self, bitmap, **kwargs):
86 | super(Bitmap, self).__init__(**kwargs)
87 | self.bitmap = bitmap
88 | def get_size(self):
89 | bitmap = cache.get_bitmap(self.bitmap)
90 | return bitmap.GetSize()
91 | def draw(self, dc):
92 | bitmap = cache.get_bitmap(self.bitmap)
93 | dc.DrawBitmap(bitmap, 0, 0, True)
94 |
95 | class Text(Control):
96 | def __init__(self, label, width, **kwargs):
97 | kwargs.setdefault('alignment', LEFT)
98 | kwargs.setdefault('color', (0, 0, 0))
99 | kwargs.setdefault('font', font())
100 | kwargs.setdefault('shadow', None)
101 | kwargs.setdefault('max_height', None)
102 | kwargs.setdefault('line_offset', 0)
103 | kwargs.setdefault('border_color', None)
104 | kwargs.setdefault('border_size', 0)
105 | super(Text, self).__init__(**kwargs)
106 | self.label = label
107 | self.width = width
108 | height = self.compute_height()
109 | if self.max_height is not None:
110 | height = min(height, self.max_height)
111 | self.height = height
112 | def get_size(self):
113 | return (self.width, self.height)
114 | def get_lines(self, dc=None):
115 | dc = dc or get_dc()
116 | dc.SetFont(cache.get_font(self.font))
117 | lines = word_wrap(dc, self.width, self.label)
118 | lines = [line or ' ' for line in lines]
119 | return lines
120 | def compute_height(self):
121 | dc = get_dc()
122 | lines = self.get_lines(dc)
123 | height = sum(dc.GetTextExtent(line)[1] for line in lines)
124 | return height
125 | def draw_text(self, dc, text, x, y):
126 | color = cache.get_color(self.color)
127 | shadow_color = cache.get_color(self.shadow)
128 | border_color = cache.get_color(self.border_color)
129 | p = self.border_size
130 | if shadow_color is not None:
131 | dc.SetTextForeground(shadow_color)
132 | dc.DrawText(text, x + p + 1, y + p + 1)
133 | if border_color is not None:
134 | dc.SetTextForeground(border_color)
135 | for dy in xrange(-p, p + 1):
136 | for dx in xrange(-p, p + 1):
137 | if dx * dx + dy * dy > p * p:
138 | continue
139 | dc.DrawText(text, x + dx, y + dy)
140 | dc.SetTextForeground(color)
141 | dc.DrawText(text, x, y)
142 | def draw(self, dc):
143 | dc.SetFont(cache.get_font(self.font))
144 | lines = self.get_lines(dc)
145 | lines = lines[self.line_offset:]
146 | padding, _ = dc.GetTextExtent(' ')
147 | y = 0
148 | for line in lines:
149 | tw, th = dc.GetTextExtent(line)
150 | if y + th > self.height:
151 | break
152 | if self.alignment == LEFT:
153 | x = padding
154 | elif self.alignment == RIGHT:
155 | x = self.width - tw - padding
156 | else:
157 | x = self.width / 2 - tw / 2
158 | self.draw_text(dc, line, x, y)
159 | y += th
160 |
--------------------------------------------------------------------------------
/icons/align-center.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/align-center.png
--------------------------------------------------------------------------------
/icons/align-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/align-left.png
--------------------------------------------------------------------------------
/icons/align-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/align-right.png
--------------------------------------------------------------------------------
/icons/bigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/bigger.png
--------------------------------------------------------------------------------
/icons/exit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/exit.png
--------------------------------------------------------------------------------
/icons/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/icon.ico
--------------------------------------------------------------------------------
/icons/minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/minus.png
--------------------------------------------------------------------------------
/icons/new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/new.png
--------------------------------------------------------------------------------
/icons/open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/open.png
--------------------------------------------------------------------------------
/icons/plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/plus.png
--------------------------------------------------------------------------------
/icons/save.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/save.png
--------------------------------------------------------------------------------
/icons/smaller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/icons/smaller.png
--------------------------------------------------------------------------------
/images/10-Guy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/10-Guy.jpg
--------------------------------------------------------------------------------
/images/Advice-Dog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Advice-Dog.jpg
--------------------------------------------------------------------------------
/images/Advice-God.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Advice-God.jpg
--------------------------------------------------------------------------------
/images/Advice-Yoda.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Advice-Yoda.jpg
--------------------------------------------------------------------------------
/images/Ancient-Aliens.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ancient-Aliens.jpg
--------------------------------------------------------------------------------
/images/Annoying-Childhood-Friend.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Annoying-Childhood-Friend.jpg
--------------------------------------------------------------------------------
/images/Annoying-Facebook-Girl.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Annoying-Facebook-Girl.jpg
--------------------------------------------------------------------------------
/images/Anti-Joke-Chicken.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Anti-Joke-Chicken.jpg
--------------------------------------------------------------------------------
/images/Art-Student-Owl.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Art-Student-Owl.jpg
--------------------------------------------------------------------------------
/images/Baby-Godfather.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Baby-Godfather.jpg
--------------------------------------------------------------------------------
/images/Bad-Advice-Cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bad-Advice-Cat.jpg
--------------------------------------------------------------------------------
/images/Bad-Joke-Eel.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bad-Joke-Eel.jpg
--------------------------------------------------------------------------------
/images/Bad-Luck-Brian.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bad-Luck-Brian.jpg
--------------------------------------------------------------------------------
/images/Bear-Grylls.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Bear-Grylls.jpg
--------------------------------------------------------------------------------
/images/Blank-Colored-Background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Blank-Colored-Background.jpg
--------------------------------------------------------------------------------
/images/Brace-Yourselves-X-is-Coming.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Brace-Yourselves-X-is-Coming.jpg
--------------------------------------------------------------------------------
/images/Business-Cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Business-Cat.jpg
--------------------------------------------------------------------------------
/images/Butthurt-Dweller.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Butthurt-Dweller.jpg
--------------------------------------------------------------------------------
/images/Chemistry-Cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Chemistry-Cat.jpg
--------------------------------------------------------------------------------
/images/College-Freshman.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/College-Freshman.jpg
--------------------------------------------------------------------------------
/images/Computer-Guy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Computer-Guy.jpg
--------------------------------------------------------------------------------
/images/Confession-Bear.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Confession-Bear.jpg
--------------------------------------------------------------------------------
/images/Conspiracy-Keanu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Conspiracy-Keanu.jpg
--------------------------------------------------------------------------------
/images/Courage-Wolf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Courage-Wolf.jpg
--------------------------------------------------------------------------------
/images/Crazy-Girlfriend-Praying-Mantis.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Crazy-Girlfriend-Praying-Mantis.jpg
--------------------------------------------------------------------------------
/images/Creepy-Condescending-Wonka.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Creepy-Condescending-Wonka.jpg
--------------------------------------------------------------------------------
/images/Depression-Dog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Depression-Dog.jpg
--------------------------------------------------------------------------------
/images/Downvoting-Roman.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Downvoting-Roman.jpg
--------------------------------------------------------------------------------
/images/Drunk-Baby.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Drunk-Baby.jpg
--------------------------------------------------------------------------------
/images/Dwight-Schrute.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Dwight-Schrute.jpg
--------------------------------------------------------------------------------
/images/Ermahgerd-Berks.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ermahgerd-Berks.jpg
--------------------------------------------------------------------------------
/images/Evil-Cows.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Evil-Cows.jpg
--------------------------------------------------------------------------------
/images/Family-Tech-Support-Guy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Family-Tech-Support-Guy.jpg
--------------------------------------------------------------------------------
/images/First-World-Problems-Cat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/First-World-Problems-Cat.jpg
--------------------------------------------------------------------------------
/images/First-World-Problems.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/First-World-Problems.jpg
--------------------------------------------------------------------------------
/images/Fk-Yeah.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Fk-Yeah.jpg
--------------------------------------------------------------------------------
/images/Forever-Alone.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Forever-Alone.jpg
--------------------------------------------------------------------------------
/images/Foul-Bachelor-Frog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Foul-Bachelor-Frog.jpg
--------------------------------------------------------------------------------
/images/Foul-Bachelorette-Frog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Foul-Bachelorette-Frog.jpg
--------------------------------------------------------------------------------
/images/Futurama-Fry.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Futurama-Fry.jpg
--------------------------------------------------------------------------------
/images/Futurama-Zoidberg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Futurama-Zoidberg.jpg
--------------------------------------------------------------------------------
/images/Gasp-Rage-Face.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Gasp-Rage-Face.jpg
--------------------------------------------------------------------------------
/images/Good-Guy-Greg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Good-Guy-Greg.jpg
--------------------------------------------------------------------------------
/images/Grandma-Finds-The-Internet.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Grandma-Finds-The-Internet.jpg
--------------------------------------------------------------------------------
/images/Hawkward.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Hawkward.jpg
--------------------------------------------------------------------------------
/images/Helpful-Tyler-Durden.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Helpful-Tyler-Durden.jpg
--------------------------------------------------------------------------------
/images/High-Expectations-Asian-Father.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/High-Expectations-Asian-Father.jpg
--------------------------------------------------------------------------------
/images/Hipster-Barista.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Hipster-Barista.jpg
--------------------------------------------------------------------------------
/images/Hipster-Kitty.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Hipster-Kitty.jpg
--------------------------------------------------------------------------------
/images/I-Have-No-Idea-What-I-Am-Doing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/I-Have-No-Idea-What-I-Am-Doing.jpg
--------------------------------------------------------------------------------
/images/Idiot-Nerd-Girl.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Idiot-Nerd-Girl.jpg
--------------------------------------------------------------------------------
/images/Ill-Just-Wait-Here.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ill-Just-Wait-Here.jpg
--------------------------------------------------------------------------------
/images/Insanity-Wolf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Insanity-Wolf.jpg
--------------------------------------------------------------------------------
/images/Joseph-Ducreux.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Joseph-Ducreux.jpg
--------------------------------------------------------------------------------
/images/Karate-Kyle.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Karate-Kyle.jpg
--------------------------------------------------------------------------------
/images/LOL-Guy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/LOL-Guy.jpg
--------------------------------------------------------------------------------
/images/Lame-Pun-Coon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Lame-Pun-Coon.jpg
--------------------------------------------------------------------------------
/images/Lazy-College-Senior.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Lazy-College-Senior.jpg
--------------------------------------------------------------------------------
/images/Matrix-Morpheus.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Matrix-Morpheus.jpg
--------------------------------------------------------------------------------
/images/Men-Laughing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Men-Laughing.jpg
--------------------------------------------------------------------------------
/images/Musically-Oblivious-8th-Grader.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Musically-Oblivious-8th-Grader.jpg
--------------------------------------------------------------------------------
/images/Neil-deGrasse-Tyson.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Neil-deGrasse-Tyson.jpg
--------------------------------------------------------------------------------
/images/Oh-No.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Oh-No.jpg
--------------------------------------------------------------------------------
/images/One-Does-Not-Simply.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/One-Does-Not-Simply.jpg
--------------------------------------------------------------------------------
/images/Ordinary-Muslim-Man.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Ordinary-Muslim-Man.jpg
--------------------------------------------------------------------------------
/images/Original-I-Lied.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Original-I-Lied.jpg
--------------------------------------------------------------------------------
/images/Overly-Attached-Girlfriend.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Overly-Attached-Girlfriend.jpg
--------------------------------------------------------------------------------
/images/PTSD-Clarinet-Boy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/PTSD-Clarinet-Boy.jpg
--------------------------------------------------------------------------------
/images/Paranoid-Parrot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Paranoid-Parrot.jpg
--------------------------------------------------------------------------------
/images/Patriotic-Eagle.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Patriotic-Eagle.jpg
--------------------------------------------------------------------------------
/images/Pedobear.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Pedobear.jpg
--------------------------------------------------------------------------------
/images/Philosoraptor.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Philosoraptor.jpg
--------------------------------------------------------------------------------
/images/Pickup-Line-Panda.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Pickup-Line-Panda.jpg
--------------------------------------------------------------------------------
/images/Priority-Peter.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Priority-Peter.jpg
--------------------------------------------------------------------------------
/images/Put-It-Somewhere-Else-Patrick.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Put-It-Somewhere-Else-Patrick.jpg
--------------------------------------------------------------------------------
/images/Question-Rage-Face.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Question-Rage-Face.jpg
--------------------------------------------------------------------------------
/images/Rasta-Science-Teacher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Rasta-Science-Teacher.jpg
--------------------------------------------------------------------------------
/images/Redditors-Wife.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Redditors-Wife.jpg
--------------------------------------------------------------------------------
/images/Redneck-Randal.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Redneck-Randal.jpg
--------------------------------------------------------------------------------
/images/Rich-Raven.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Rich-Raven.jpg
--------------------------------------------------------------------------------
/images/Sad-X-All-The-Y.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sad-X-All-The-Y.jpg
--------------------------------------------------------------------------------
/images/Say-That-Again-I-Dare-You.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Say-That-Again-I-Dare-You.jpg
--------------------------------------------------------------------------------
/images/Scumbag-Brain.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Brain.jpg
--------------------------------------------------------------------------------
/images/Scumbag-Minecraft.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Minecraft.jpg
--------------------------------------------------------------------------------
/images/Scumbag-Redditor.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Redditor.jpg
--------------------------------------------------------------------------------
/images/Scumbag-Steve.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Scumbag-Steve.jpg
--------------------------------------------------------------------------------
/images/Sexually-Oblivious-Rhino.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sexually-Oblivious-Rhino.jpg
--------------------------------------------------------------------------------
/images/Sheltering-Suburban-Mom.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sheltering-Suburban-Mom.jpg
--------------------------------------------------------------------------------
/images/Shut-Up-And-Take-My-Money-Fry.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Shut-Up-And-Take-My-Money-Fry.jpg
--------------------------------------------------------------------------------
/images/Skeptical-Baby.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Skeptical-Baby.jpg
--------------------------------------------------------------------------------
/images/Slowpoke.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Slowpoke.jpg
--------------------------------------------------------------------------------
/images/Socially-Awesome-Awkward-Penguin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Socially-Awesome-Awkward-Penguin.jpg
--------------------------------------------------------------------------------
/images/Socially-Awesome-Penguin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Socially-Awesome-Penguin.jpg
--------------------------------------------------------------------------------
/images/Socially-Awkward-Penguin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Socially-Awkward-Penguin.jpg
--------------------------------------------------------------------------------
/images/Stoner-Dog.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Stoner-Dog.jpg
--------------------------------------------------------------------------------
/images/Success-Kid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Success-Kid.jpg
--------------------------------------------------------------------------------
/images/Successful-Black-Man.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Successful-Black-Man.jpg
--------------------------------------------------------------------------------
/images/Sudden-Clarity-Clarence.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Sudden-Clarity-Clarence.jpg
--------------------------------------------------------------------------------
/images/Surprised-Coala.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Surprised-Coala.jpg
--------------------------------------------------------------------------------
/images/Tech-Impaired-Duck.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Tech-Impaired-Duck.jpg
--------------------------------------------------------------------------------
/images/The-Most-Interesting-Cat-In-The-World.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/The-Most-Interesting-Cat-In-The-World.jpg
--------------------------------------------------------------------------------
/images/The-Most-Interesting-Man-In-The-World.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/The-Most-Interesting-Man-In-The-World.jpg
--------------------------------------------------------------------------------
/images/Third-World-Skeptical-Kid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Third-World-Skeptical-Kid.jpg
--------------------------------------------------------------------------------
/images/Third-World-Success-Kid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Third-World-Success-Kid.jpg
--------------------------------------------------------------------------------
/images/Too-Damn-High.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Too-Damn-High.jpg
--------------------------------------------------------------------------------
/images/Troll-Face-Colored.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Troll-Face-Colored.jpg
--------------------------------------------------------------------------------
/images/True-Story.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/True-Story.jpg
--------------------------------------------------------------------------------
/images/Unhelpful-High-School-Teacher.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Unhelpful-High-School-Teacher.jpg
--------------------------------------------------------------------------------
/images/Vengeance-Dad.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Vengeance-Dad.jpg
--------------------------------------------------------------------------------
/images/We-Will-Rebuild.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/We-Will-Rebuild.jpg
--------------------------------------------------------------------------------
/images/X-All-The-Y.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/X-All-The-Y.jpg
--------------------------------------------------------------------------------
/images/Y-U-No.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Y-U-No.jpg
--------------------------------------------------------------------------------
/images/Yao-Ming.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Yao-Ming.jpg
--------------------------------------------------------------------------------
/images/Yo-Dawg-Heard-You.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fogleman/pyMeme/9336888a28399f6e96ef0d3c9cee077c082e3064/images/Yo-Dawg-Heard-You.jpg
--------------------------------------------------------------------------------
/installer.iss:
--------------------------------------------------------------------------------
1 | ; Script generated by the Inno Setup Script Wizard.
2 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
3 |
4 | [Setup]
5 | ; NOTE: The value of AppId uniquely identifies this application.
6 | ; Do not use the same AppId value in installers for other applications.
7 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
8 | AppId={{66CA7D93-1FDD-4152-B241-42971934D8E0}
9 | AppName=iMeme
10 | AppVerName=iMeme 1.0
11 | AppPublisher=Michael Fogleman
12 | AppPublisherURL=http://www.michaelfogleman.com/
13 | AppSupportURL=http://www.michaelfogleman.com/imeme/
14 | AppUpdatesURL=http://www.michaelfogleman.com/imeme/
15 | DefaultDirName={pf}\iMeme
16 | DefaultGroupName=iMeme
17 | AllowNoIcons=yes
18 | OutputDir=installer
19 | OutputBaseFilename=iMeme-setup
20 | Compression=lzma
21 | SolidCompression=yes
22 |
23 | [Languages]
24 | Name: "english"; MessagesFile: "compiler:Default.isl"
25 |
26 | [Tasks]
27 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
28 | Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
29 |
30 | [Dirs]
31 | Name: "{app}"; Permissions: everyone-modify
32 |
33 | [Files]
34 | Source: "dist\iMeme.exe"; DestDir: "{app}"; Flags: ignoreversion; Permissions: everyone-readexec
35 | Source: "dist\w9xpopen.exe"; DestDir: "{app}"; Flags: ignoreversion; Permissions: everyone-readexec
36 | ;Source: "dist\library.zip"; DestDir: "{app}"; Flags: ignoreversion; Permissions: everyone-readexec
37 | Source: "dist\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
38 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
39 |
40 | [Icons]
41 | Name: "{group}\iMeme"; Filename: "{app}\iMeme.exe"; WorkingDir: "{app}";
42 | Name: "{group}\{cm:UninstallProgram,iMeme}"; Filename: "{uninstallexe}"
43 | Name: "{userdesktop}\iMeme"; Filename: "{app}\iMeme.exe"; WorkingDir: "{app}"; Tasks: desktopicon
44 | Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\iMeme"; Filename: "{app}\iMeme.exe"; WorkingDir: "{app}"; Tasks: quicklaunchicon
45 |
46 | [Run]
47 | Filename: "{app}\iMeme.exe"; Description: "{cm:LaunchProgram,iMeme}"; Flags: nowait postinstall
48 |
49 |
--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------
1 | import cache
2 | import core
3 | import os
4 | import wx
5 | import platform
6 | import subprocess
7 | import urllib2
8 |
9 | IMAGES_PATH = os.path.abspath('images')
10 |
11 | def show_folder(path):
12 | system = platform.system().lower()
13 | if system == 'darwin':
14 | try:
15 | from appscript import App, mactypes
16 | if os.path.exists(path):
17 | App("Finder").reveal(mactypes.Alias(path).alias)
18 | except:
19 | subprocess.call(['open', '-R', path])
20 | elif system == 'windows':
21 | if os.path.exists(IMAGES_PATH):
22 | subprocess.call(['start', path], shell=True)
23 | elif system == 'linux':
24 | print 'Linux not implemented yet.'
25 |
26 | def menu_item(window, menu, label, func):
27 | item = wx.MenuItem(menu, -1, label)
28 | menu.AppendItem(item)
29 | if func:
30 | window.Bind(wx.EVT_MENU, func, id=item.GetId())
31 | return item
32 |
33 | def tool_item(window, toolbar, label, func, icon):
34 | item = toolbar.AddSimpleTool(-1, wx.Bitmap(icon), label)
35 | if func:
36 | window.Bind(wx.EVT_TOOL, func, id=item.GetId())
37 | return item
38 |
39 | def load_images():
40 | result = []
41 | names = os.listdir(IMAGES_PATH)
42 | for name in names:
43 | base, ext = os.path.splitext(name)
44 | if ext in ('.png', '.jpg', '.jpeg'):
45 | title = base.replace('-', ' ')
46 | title = title.replace('_', ' ')
47 | full_path = os.path.join(IMAGES_PATH, name)
48 | result.append((title, full_path))
49 | return result
50 |
51 | class ImageDropTarget(wx.PyDropTarget):
52 | def __init__(self, callback):
53 | super(ImageDropTarget, self).__init__()
54 | self.callback = callback
55 | self.do = wx.DataObjectComposite()
56 | self.file_do = wx.FileDataObject()
57 | self.url_do = wx.TextDataObject()
58 | self.do.Add(self.file_do)
59 | self.do.Add(self.url_do)
60 | self.SetDataObject(self.do)
61 |
62 | def OnData(self, x, y, data):
63 | if self.GetData():
64 | df = self.do.GetReceivedFormat().GetType()
65 | if df in [wx.DF_UNICODETEXT, wx.DF_TEXT]:
66 | try:
67 | self.callback(self.url_do.GetText())
68 | except:
69 | pass
70 | elif df == wx.DF_FILENAME:
71 | try:
72 | self.callback(self.file_do.GetFilenames()[0])
73 | except:
74 | pass
75 |
76 | class Model(object):
77 | def __init__(self):
78 | self.path = ''
79 | self.reset()
80 | def reset(self):
81 | self.header = ''
82 | self.footer = ''
83 | self.header_size = 20
84 | self.footer_size = 20
85 | self.header_alignment = core.CENTER
86 | self.footer_alignment = core.CENTER
87 | self.padding = 10
88 | self.border_size = 3
89 | def generate(self):
90 | background = cache.get_bitmap(self.path)
91 | width, height = background.GetSize()
92 | page = core.Page()
93 | page.add(core.Bitmap(background))
94 | text_width = width - self.padding * 2
95 | adjusted_header_size = int(height*(self.header_size/200.0))
96 | adjusted_footer_size = int(height*(self.footer_size/200.0))
97 | header = core.Text(
98 | self.header.upper(),
99 | text_width,
100 | alignment=self.header_alignment,
101 | border_color=(0, 0, 0),
102 | border_size=self.border_size,
103 | color=(255, 255, 255),
104 | font=core.font('Impact', adjusted_header_size),
105 | )
106 | page.add(header, (width / 2, self.padding), (0.5, 0))
107 | footer = core.Text(
108 | self.footer.upper(),
109 | text_width,
110 | alignment=self.footer_alignment,
111 | border_color=(0, 0, 0),
112 | border_size=self.border_size,
113 | color=(255, 255, 255),
114 | font=core.font('Impact', adjusted_footer_size),
115 | )
116 | page.add(footer, (width / 2, -self.padding), (0.5, 1))
117 | bitmap = wx.EmptyBitmap(width, height)
118 | dc = wx.MemoryDC(bitmap)
119 | page.render(dc, (width, height), (0, 0))
120 | return bitmap
121 |
122 | class BitmapView(wx.Panel):
123 | def __init__(self, parent):
124 | super(BitmapView, self).__init__(parent, style=wx.BORDER_STATIC)
125 | self.bitmap = None
126 | self.scaled_bitmap = None
127 | self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
128 | self.Bind(wx.EVT_PAINT, self.on_paint)
129 | self.Bind(wx.EVT_SIZE, self.on_size)
130 | def set_bitmap(self, bitmap):
131 | self.bitmap = bitmap
132 | self.Refresh()
133 | def on_size(self, event):
134 | event.Skip()
135 | self.Refresh()
136 | def on_paint(self, event):
137 | color = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE)
138 | dc = wx.BufferedPaintDC(self)
139 | dc.SetBackground(wx.Brush(color))
140 | dc.Clear()
141 | dc = wx.GCDC(dc)
142 | if self.bitmap is None:
143 | return
144 | pad = 0
145 | cw, ch = self.GetClientSize()
146 | dw, dh = cw - pad * 2, ch - pad * 2
147 | bw, bh = self.bitmap.GetSize()
148 | xr, yr = float(dw) / float(bw), float(dh) / float(bh)
149 | ratio = min(xr, yr)
150 | ratio = min(ratio, 1)
151 | sw, sh = int(cw / ratio), int(ch / ratio)
152 | x, y = (sw - bw) / 2, (sh - bh) / 2
153 | dc.SetUserScale(ratio, ratio)
154 | dc.DrawBitmap(self.bitmap, x, y)
155 |
156 | class Frame(wx.Frame):
157 | def __init__(self):
158 | super(Frame, self).__init__(None, -1, 'iMeme')
159 | self.SetIcon(wx.Icon('icons/icon.ico', wx.BITMAP_TYPE_ICO))
160 | self.model = Model()
161 | self.create_menu()
162 | self.create_toolbar()
163 | panel = self.create_contents(self)
164 | sizer = wx.BoxSizer(wx.VERTICAL)
165 | sizer.Add(panel, 1, wx.EXPAND)
166 | self.SetSizerAndFit(sizer)
167 | self.on_change()
168 | def on_change(self):
169 | self.bitmap_view.set_bitmap(self.model.generate())
170 | def on_files_dropped(self, data):
171 | if data:
172 | self.model.path = data
173 | self.on_change()
174 |
175 | def create_contents(self, parent):
176 | panel = wx.Panel(parent)
177 | controls = self.create_controls(panel)
178 | sizer = wx.BoxSizer(wx.VERTICAL)
179 | sizer.Add(controls, 1, wx.EXPAND | wx.ALL, 12)
180 | panel.SetSizerAndFit(sizer)
181 | return panel
182 | def create_controls(self, parent):
183 | list_box = self.create_list_box(parent)
184 | right = self.create_right(parent)
185 | sizer = wx.BoxSizer(wx.HORIZONTAL)
186 | sizer.Add(list_box, 0, wx.EXPAND)
187 | sizer.AddSpacer(8)
188 | sizer.Add(right, 1, wx.EXPAND)
189 | return sizer
190 | def create_list_box(self, parent):
191 | self.list_box = wx.ListBox(parent, size=(200, -1))
192 | self.list_box.Bind(wx.EVT_LISTBOX, self.on_list_box)
193 | data = load_images()
194 | for title, path in data:
195 | self.list_box.Append(title, path)
196 | self.model.path = data[0][1]
197 | self.list_box.Select(0)
198 | return self.list_box
199 | def create_right(self, parent):
200 | view = self.create_view(parent)
201 | widgets = self.create_widgets(parent)
202 | sizer = wx.BoxSizer(wx.VERTICAL)
203 | sizer.Add(view, 1, wx.EXPAND)
204 | sizer.AddSpacer(8)
205 | sizer.Add(widgets, 0, wx.EXPAND)
206 | return sizer
207 | def create_view(self, parent):
208 | self.bitmap_view = BitmapView(parent)
209 | self.bitmap_view.SetMinSize((400, 400))
210 | self.bitmap_view.SetDropTarget(ImageDropTarget(self.on_files_dropped))
211 | return self.bitmap_view
212 | def create_widgets(self, parent):
213 | self.header = header = wx.TextCtrl(parent)
214 | self.footer = footer = wx.TextCtrl(parent)
215 | header_smaller = wx.BitmapButton(parent, -1, wx.Bitmap('icons/minus.png'))
216 | header_bigger = wx.BitmapButton(parent, -1, wx.Bitmap('icons/plus.png'))
217 | header_left = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-left.png'))
218 | header_center = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-center.png'))
219 | header_right = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-right.png'))
220 | footer_smaller = wx.BitmapButton(parent, -1, wx.Bitmap('icons/minus.png'))
221 | footer_bigger = wx.BitmapButton(parent, -1, wx.Bitmap('icons/plus.png'))
222 | footer_left = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-left.png'))
223 | footer_center = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-center.png'))
224 | footer_right = wx.BitmapButton(parent, -1, wx.Bitmap('icons/align-right.png'))
225 | header.Bind(wx.EVT_TEXT, self.on_header)
226 | header_smaller.Bind(wx.EVT_BUTTON, self.on_header_smaller)
227 | header_bigger.Bind(wx.EVT_BUTTON, self.on_header_bigger)
228 | header_left.Bind(wx.EVT_BUTTON, self.on_header_left)
229 | header_center.Bind(wx.EVT_BUTTON, self.on_header_center)
230 | header_right.Bind(wx.EVT_BUTTON, self.on_header_right)
231 | footer.Bind(wx.EVT_TEXT, self.on_footer)
232 | footer_smaller.Bind(wx.EVT_BUTTON, self.on_footer_smaller)
233 | footer_bigger.Bind(wx.EVT_BUTTON, self.on_footer_bigger)
234 | footer_left.Bind(wx.EVT_BUTTON, self.on_footer_left)
235 | footer_center.Bind(wx.EVT_BUTTON, self.on_footer_center)
236 | footer_right.Bind(wx.EVT_BUTTON, self.on_footer_right)
237 | grid = wx.FlexGridSizer(2, 8, 8, 0)
238 | grid.AddGrowableCol(0)
239 | grid.Add(header, flag=wx.EXPAND)
240 | grid.AddSpacer(8)
241 | grid.Add(header_smaller)
242 | grid.Add(header_bigger)
243 | grid.AddSpacer(8)
244 | grid.Add(header_left)
245 | grid.Add(header_center)
246 | grid.Add(header_right)
247 | grid.Add(footer, flag=wx.EXPAND)
248 | grid.AddSpacer(8)
249 | grid.Add(footer_smaller)
250 | grid.Add(footer_bigger)
251 | grid.AddSpacer(8)
252 | grid.Add(footer_left)
253 | grid.Add(footer_center)
254 | grid.Add(footer_right)
255 | return grid
256 | def create_menu(self):
257 | menubar = wx.MenuBar()
258 | # File
259 | menu = wx.Menu()
260 | menu_item(self, menu, 'New\tCtrl+N', self.on_new)
261 | menu_item(self, menu, 'Open...\tCtrl+O', self.on_open)
262 | menu_item(self, menu, 'Save As...\tCtrl+S', self.on_save)
263 | menu.AppendSeparator()
264 | menu_item(self, menu, 'Show Images Folder', self.on_show_images)
265 | menu.AppendSeparator()
266 | menu_item(self, menu, 'Exit\tAlt+F4', self.on_exit)
267 | menubar.Append(menu, '&File')
268 | self.SetMenuBar(menubar)
269 | def create_toolbar(self):
270 | toolbar = self.CreateToolBar()
271 | toolbar.SetToolBitmapSize((18, 18))
272 | tool_item(self, toolbar, 'New', self.on_new, 'icons/new.png')
273 | tool_item(self, toolbar, 'Open', self.on_open, 'icons/open.png')
274 | tool_item(self, toolbar, 'Save', self.on_save, 'icons/save.png')
275 | toolbar.Realize()
276 | toolbar.Fit()
277 | self.SetToolBar(toolbar)
278 | def on_list_box(self, event):
279 | index = self.list_box.GetSelection()
280 | if index >= 0:
281 | self.model.path = self.list_box.GetClientData(index)
282 | self.on_change()
283 | def on_header(self, event):
284 | self.model.header = self.header.GetValue()
285 | self.on_change()
286 | def on_header_smaller(self, event):
287 | if self.model.header_size <= 10:
288 | self.model.header_size -= 1
289 | else:
290 | self.model.header_size -= 4
291 | self.model.header_size = max(self.model.header_size, 1)
292 | self.on_change()
293 | def on_header_bigger(self, event):
294 | if self.model.header_size <= 10:
295 | self.model.header_size += 1
296 | else:
297 | self.model.header_size += 4
298 | self.model.header_size = min(self.model.header_size, 100)
299 | self.on_change()
300 | def on_header_left(self, event):
301 | self.model.header_alignment = core.LEFT
302 | self.on_change()
303 | def on_header_center(self, event):
304 | self.model.header_alignment = core.CENTER
305 | self.on_change()
306 | def on_header_right(self, event):
307 | self.model.header_alignment = core.RIGHT
308 | self.on_change()
309 | def on_footer(self, event):
310 | self.model.footer = self.footer.GetValue()
311 | self.on_change()
312 | def on_footer_smaller(self, event):
313 | if self.model.footer_size <= 10:
314 | self.model.footer_size -= 1
315 | else:
316 | self.model.footer_size -= 4
317 | self.model.footer_size = max(self.model.footer_size, 1)
318 | self.on_change()
319 | def on_footer_bigger(self, event):
320 | if self.model.footer_size <= 10:
321 | self.model.footer_size += 1
322 | else:
323 | self.model.footer_size += 4
324 | self.model.footer_size = min(self.model.footer_size, 100)
325 | self.on_change()
326 | def on_footer_left(self, event):
327 | self.model.footer_alignment = core.LEFT
328 | self.on_change()
329 | def on_footer_center(self, event):
330 | self.model.footer_alignment = core.CENTER
331 | self.on_change()
332 | def on_footer_right(self, event):
333 | self.model.footer_alignment = core.RIGHT
334 | self.on_change()
335 | def on_new(self, event):
336 | self.model.reset()
337 | self.header.SetValue('')
338 | self.footer.SetValue('')
339 | self.on_change()
340 | def on_open(self, event):
341 | exts = sorted(['*.png', '*.jpg', '*.jpeg', '*.gif', '*.bmp'])
342 | wildcard = ';'.join(exts)
343 | dialog = wx.FileDialog(self, 'Open', wildcard=wildcard,
344 | style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
345 | if dialog.ShowModal() == wx.ID_OK:
346 | path = dialog.GetPath()
347 | self.model.path = path
348 | self.on_change()
349 | def on_save(self, event):
350 | dialog = wx.FileDialog(self, 'Save As', wildcard='*.jpg',
351 | style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT)
352 | if dialog.ShowModal() == wx.ID_OK:
353 | path = dialog.GetPath()
354 | bitmap = self.model.generate()
355 | image = wx.ImageFromBitmap(bitmap)
356 | image.SetOptionInt(wx.IMAGE_OPTION_QUALITY, 95)
357 | image.SaveFile(path, wx.BITMAP_TYPE_JPEG)
358 | def on_show_images(self, event):
359 | show_folder(IMAGES_PATH)
360 | def on_exit(self, event):
361 | self.Close()
362 |
363 | def main():
364 | app = wx.PySimpleApp()
365 | frame = Frame()
366 | frame.Center()
367 | frame.Show()
368 | app.MainLoop()
369 |
370 | if __name__ == '__main__':
371 | main()
372 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | import distutils
2 | import os
3 | import py2exe
4 | import shutil
5 | import sys
6 |
7 | def run_py2exe():
8 | py2exe.__version__
9 | sys.argv.append('py2exe')
10 | distutils.core.setup(
11 | options = {"py2exe":{
12 | "compressed": True,
13 | "optimize": 2,
14 | "bundle_files": 1,
15 | "excludes": ['Tkconstants', 'Tkinter', 'tcl'],
16 | "dll_excludes": ['msvcp90.dll'],
17 | }},
18 | windows = [{
19 | "script": "main.py",
20 | "dest_base": "iMeme",
21 | "icon_resources": [(1, "icons/icon.ico")],
22 | "other_resources": [(24, 1, MANIFEST)],
23 | }],
24 | zipfile=None,
25 | )
26 |
27 | def copy_file(src):
28 | print 'Copying:', src
29 | dst = os.path.join('dist', src)
30 | try:
31 | os.makedirs(os.path.split(dst)[0])
32 | except Exception:
33 | pass
34 | shutil.copyfile(src, dst)
35 |
36 | def copy_directory(src):
37 | for path, _, files in os.walk(src):
38 | if '.svn' in path:
39 | continue
40 | for filename in files:
41 | copy_file(os.path.join(path, filename))
42 |
43 | def main():
44 | run_py2exe()
45 | copy_directory('icons')
46 | copy_directory('images')
47 | copy_directory('Microsoft.VC90.CRT')
48 |
49 | MANIFEST = '''
50 |
52 |
58 | Star Rocket Level Editor 1.0
59 |
60 |
61 |
62 |
66 |
67 |
68 |
69 |
70 |
71 |
78 |
79 |
80 |
81 |
82 |
90 |
91 |
92 |
93 | '''
94 |
95 | if __name__ == '__main__':
96 | main()
97 |
--------------------------------------------------------------------------------