Please create a colorful handbook pdf from from list mentioned below,write list of vocabulary words list with respelling of individual vocabulary words in bracelet and it's meaning in English and later in Russian language for all individual vocabulary words and also add 3 daily life use of vocabulary as examples of sentences with it's Russian translation. Russian translation should be under every sentence. The vocabulary words should be at top with different background color. Serendipity Fiery Cloying Acrid Mouth -puckering Bone - chilling Censure Erroneous Gallant Humdrum Discourteous Cynical Petrified Resplendent Inundated Ignominy Ambivalence Disdain Irascible Stalwart
ls -la /tmp/workspace/; fc-list | grep -i -E "dejavu|noto|liberation" | head -20
fc-list : file | grep -v -i "noto" | head -30; python -c "import matplotlib,os;print(os.path.join(os.path.dirname(matplotlib.__file__),'mpl-data/fonts/ttf'))"; ls $(python -c "import matplotlib,os;print(os.path.join(os.path.dirname(matplotlib.__file__),'mpl-data/fonts/ttf'))") | grep DejaVu
mkdir -p /tmp/workspace/vocab-handbook && cat > /tmp/workspace/vocab-handbook/make.py <<'EOF' import os, matplotlib from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import ParagraphStyle from reportlab.lib.units import mm from reportlab.platypus import (BaseDocTemplate, PageTemplate, Frame, Paragraph, Spacer, Table, TableStyle, KeepTogether, PageBreak, NextPageTemplate) from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont fd = os.path.join(os.path.dirname(matplotlib.__file__), 'mpl-data/fonts/ttf') for n, f in [('DV','DejaVuSans'),('DV-B','DejaVuSans-Bold'),('DV-I','DejaVuSans-Oblique'),('DV-BI','DejaVuSans-BoldOblique')]: pdfmetrics.registerFont(TTFont(n, f'{fd}/{f}.ttf')) pdfmetrics.registerFontFamily('DV', normal='DV', bold='DV-B', italic='DV-I', boldItalic='DV-BI') W, H = A4 M = 16*mm # word, respelling, POS, EN meaning, RU word, RU meaning, [(EN, RU) x3] D = [ ("Serendipity","ser-uhn-DIP-i-tee","noun","Finding something good or valuable by chance, without looking for it; a happy accident.","счастливая случайность; удача","Приятная находка или событие, которое случается неожиданно, без поиска.", [("I found my favourite old book at a street market by pure serendipity.","Я нашёл свою любимую старую книгу на уличном рынке по чистой счастливой случайности."), ("Meeting my best friend on the train was serendipity.","Встреча с лучшим другом в поезде была счастливой случайностью."), ("By serendipity, the shop was still open when I needed a gift.","По счастливой случайности магазин ещё работал, когда мне понадобился подарок.")]), ("Fiery","FYE-uh-ree","adjective","Burning or looking like fire; very hot or spicy; full of strong emotion such as anger or passion.","огненный; жгучий; пылкий","Горящий или похожий на огонь; очень острый; полный сильных чувств, например гнева или страсти.", [("The curry was so fiery that I needed two glasses of water.","Карри был таким жгучим, что мне понадобилось два стакана воды."), ("She gave a fiery speech at the town meeting.","Она произнесла пылкую речь на городском собрании."), ("The sky turned a fiery orange at sunset.","На закате небо стало огненно-оранжевым.")]), ("Cloying","KLOY-ing","adjective","Too sweet, rich or sentimental, so that it becomes unpleasant or sickening.","приторный; чересчур сладкий","Слишком сладкий, насыщенный или сентиментальный, так что становится неприятным.", [("The cake was so cloying that I could eat only one bite.","Торт был таким приторным, что я смог съесть только один кусочек."), ("The cloying smell of perfume filled the lift.","Приторный запах духов наполнил лифт."), ("I find his constant flattery cloying.","Его постоянная лесть кажется мне приторной.")]), ("Acrid","AK-rid","adjective","Having a sharp, bitter and unpleasantly strong smell or taste that irritates the nose or throat.","едкий; резкий","Имеющий резкий, горький и неприятно сильный запах или вкус, который раздражает нос и горло.", [("Acrid smoke came from the burnt toast.","От подгоревшего тоста шёл едкий дым."), ("The acrid smell of burning rubber made us cover our noses.","Едкий запах горящей резины заставил нас закрыть носы."), ("The coffee I forgot on the stove left an acrid taste.","Кофе, который я забыл на плите, оставил едкий привкус.")]), ("Mouth-puckering","MOWTH-PUK-er-ing","adjective","Extremely sour or sharp in taste, making your lips and mouth draw tightly together.","сводящий рот; очень кислый","Чрезвычайно кислый на вкус, от которого губы и рот сильно сжимаются.", [("This lemon is so sour, it is truly mouth-puckering.","Этот лимон такой кислый, что от него буквально сводит рот."), ("The unripe plums were mouth-puckering.","Неспелые сливы были невероятно кислыми, аж рот сводило."), ("She drank a mouth-puckering lemonade on a hot day.","Жарким днём она выпила очень кислый лимонад, от которого сводило рот.")]), ("Bone-chilling","BOHN-CHIL-ing","adjective","Extremely cold, so that you feel it deep inside; or very frightening.","пронизывающий до костей; леденящий душу","Очень холодный, так что холод чувствуется глубоко внутри; или очень пугающий.", [("A bone-chilling wind blew across the platform.","По платформе дул пронизывающий до костей ветер."), ("We heard a bone-chilling scream from the forest.","Мы услышали леденящий душу крик из леса."), ("It was a bone-chilling winter morning, so I wore two coats.","Это было пронизывающе холодное зимнее утро, поэтому я надел два пальто.")]), ("Censure","SEN-sher","noun / verb","Strong and formal disapproval or criticism; to criticise someone severely.","осуждение; порицание; осуждать","Резкое и официальное неодобрение или критика; строго критиковать кого-либо.", [("The manager faced public censure for the mistake.","Руководитель подвергся публичному осуждению за ошибку."), ("My parents censured me for coming home so late.","Родители отчитали меня за то, что я пришёл домой так поздно."), ("The council voted to censure the mayor.","Совет проголосовал за вынесение порицания мэру.")]), ("Erroneous","i-ROH-nee-uhs","adjective","Wrong or incorrect; based on a mistake.","ошибочный; неверный","Неправильный; основанный на ошибке.", [("The bill had an erroneous charge, so I called the shop.","В счёте была ошибочная сумма, поэтому я позвонил в магазин."), ("He had an erroneous belief that the bank closes at six.","У него было ошибочное мнение, что банк закрывается в шесть."), ("Please correct the erroneous address on the parcel.","Пожалуйста, исправьте неверный адрес на посылке.")]), ("Gallant","GAL-uhnt","adjective","Brave and heroic; also polite and respectful, especially towards women.","храбрый; доблестный; галантный","Смелый и героический; также вежливый и почтительный, особенно по отношению к женщинам.", [("The gallant firefighter rescued the child from the building.","Доблестный пожарный спас ребёнка из здания."), ("He made a gallant gesture by giving his seat to an elderly lady.","Он поступил галантно, уступив место пожилой даме."), ("The team made a gallant effort, even though they lost.","Команда проявила отвагу, хотя и проиграла.")]), ("Humdrum","HUM-drum","adjective","Dull, boring and lacking variety or excitement.","скучный; однообразный; монотонный","Нудный, неинтересный, лишённый разнообразия и волнения.", [("I need a break from my humdrum daily routine.","Мне нужен отдых от моей скучной повседневной рутины."), ("Washing dishes every day is a humdrum chore.","Мытьё посуды каждый день - однообразное занятие."), ("She left her humdrum office job to travel the world.","Она бросила скучную офисную работу, чтобы путешествовать по миру.")]), ("Discourteous","dis-KUR-tee-uhs","adjective","Rude, impolite and showing a lack of respect for others.","невежливый; грубый","Грубый, неучтивый, не проявляющий уважения к другим.", [("It is discourteous to talk loudly on the phone in a cinema.","Невежливо громко разговаривать по телефону в кинотеатре."), ("The waiter was discourteous to the customers.","Официант был груб с посетителями."), ("Interrupting someone while they speak is discourteous.","Перебивать человека, пока он говорит, невежливо.")]), ("Cynical","SIN-i-kuhl","adjective","Believing that people act only from selfish motives; distrustful and doubtful about honesty or goodness.","циничный; недоверчивый","Считающий, что люди действуют только из корыстных побуждений; не доверяющий и сомневающийся в честности.", [("He is cynical about advertisements and never believes them.","Он циничен в отношении рекламы и никогда ей не верит."), ("She gave a cynical laugh when they promised her quick riches.","Она цинично усмехнулась, когда ей пообещали быстрое богатство."), ("Don't be so cynical; some people really do help for free.","Не будь таким циничным: некоторые люди действительно помогают бесплатно.")]), ("Petrified","PET-ruh-fyd","adjective","So frightened that you cannot move or think; (literally) turned into stone.","оцепеневший от страха; окаменевший","Настолько напуганный, что не можешь двигаться или думать; (буквально) превращённый в камень.", [("I was petrified when I heard footsteps behind me at night.","Я оцепенел от страха, когда ночью услышал шаги за спиной."), ("The little boy was petrified of the big dog.","Маленький мальчик до ужаса боялся большой собаки."), ("She stood petrified as the car skidded towards her.","Она стояла в оцепенении, пока машину несло юзом прямо на неё.")]), ("Resplendent","ri-SPLEN-duhnt","adjective","Shining brilliantly; splendid and impressive in appearance.","блистательный; сияющий; великолепный","Ярко сияющий; роскошный и впечатляющий на вид.", [("The bride looked resplendent in her gold dress.","Невеста выглядела блистательно в своём золотом платье."), ("The old palace was resplendent with thousands of lights.","Старый дворец сиял тысячами огней."), ("The garden was resplendent in its spring colours.","Сад блистал своими весенними красками.")]), ("Inundated","IN-uhn-day-tid","adjective / verb","Flooded with water; or overwhelmed by a very large amount of things to deal with.","затопленный; заваленный (делами)","Залитый водой; или перегруженный огромным количеством дел или вещей.", [("I am inundated with emails after my holiday.","Я завален электронными письмами после отпуска."), ("The streets were inundated after the heavy rain.","Улицы были затоплены после сильного дождя."), ("The restaurant was inundated with orders on Friday night.","Ресторан был завален заказами в пятницу вечером.")]), ("Ignominy","IG-nuh-min-ee","noun","Public shame, disgrace or loss of respect.","позор; бесчестье","Публичный стыд, унижение или потеря уважения.", [("He left the company in ignominy after the scandal.","После скандала он с позором покинул компанию."), ("The team suffered the ignominy of losing 10-0.","Команда пережила позор поражения со счётом 10:0."), ("She could not bear the ignominy of being caught cheating.","Она не могла вынести позора, когда её поймали на списывании.")]), ("Ambivalence","am-BIV-uh-luhns","noun","Having mixed or contradictory feelings about something or someone; being unable to decide.","двойственность чувств; нерешительность","Наличие смешанных или противоречивых чувств по отношению к чему-либо или кому-либо; неспособность решиться.", [("She felt ambivalence about moving to a new city.","Она испытывала противоречивые чувства по поводу переезда в новый город."), ("His ambivalence made it hard to choose between the two jobs.","Его нерешительность мешала ему выбрать между двумя работами."), ("There was ambivalence in her voice when she said yes.","В её голосе слышалась двойственность, когда она сказала «да».")]), ("Disdain","dis-DAYN","noun / verb","A feeling that someone or something is unworthy of respect; contempt; to look down on.","презрение; пренебрежение; презирать","Чувство, что кто-то или что-то недостойно уважения; презрение; смотреть свысока.", [("He looked at the cheap meal with disdain.","Он с презрением посмотрел на дешёвую еду."), ("She disdains people who gossip about others.","Она презирает людей, которые сплетничают о других."), ("The critic spoke with disdain about the new film.","Критик с пренебрежением говорил о новом фильме.")]), ("Irascible","i-RAS-uh-buhl","adjective","Easily made angry; hot-tempered and quick to lose patience.","вспыльчивый; раздражительный","Легко выходящий из себя; горячий нравом и быстро теряющий терпение.", [("My irascible neighbour shouts at the children playing outside.","Мой вспыльчивый сосед кричит на детей, играющих на улице."), ("He becomes irascible when he is hungry.","Он становится раздражительным, когда голоден."), ("The irascible old driver honked at everyone on the road.","Вспыльчивый старый водитель сигналил всем на дороге.")]), ("Stalwart","STAWL-wert","adjective / noun","Loyal, reliable and hard-working; strong and determined in supporting a cause or group.","стойкий; верный; надёжный","Преданный, надёжный и трудолюбивый; сильный и решительный в поддержке дела или группы.", [("She is a stalwart supporter of the local school.","Она - верная сторонница местной школы."), ("My stalwart friend helped me move house all day.","Мой надёжный друг помогал мне с переездом целый день."), ("The stalwart team worked through the night to finish.","Стойкая команда работала всю ночь, чтобы закончить.")]), ] PAL = ["#E63946","#F77F00","#2A9D8F","#3A86FF","#8338EC","#D81E7A","#0F9D58","#E76F51","#5E60CE","#1D8FA8"] def C(h): return colors.HexColor(h) def tint(h, t=0.88): c = C(h); return colors.Color(c.red+(1-c.red)*t, c.green+(1-c.green)*t, c.blue+(1-c.blue)*t) def dark(h, k=0.72): c = C(h); return colors.Color(c.red*k, c.green*k, c.blue*k) def S(name, **kw): base = dict(fontName='DV', fontSize=10, leading=14) base.update(kw); return ParagraphStyle(name, **base) FW = W - 2*M def card(i, row): w, resp, pos, en, ru_w, ru_m, ex = row col = PAL[i % len(PAL)]; tn = tint(col); dk = dark(col) # header head = Table([[Paragraph(f"{i+1}", S('n', fontName='DV-B', fontSize=16, leading=20, textColor=C(col), alignment=1)), [Paragraph(w, S('w', fontName='DV-B', fontSize=24, leading=28, textColor=colors.white)), Paragraph(f"[{resp}] <i>{pos}</i>", S('r', fontSize=11.5, leading=15, textColor=colors.white))]]], colWidths=[14*mm, FW-14*mm]) head.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1),C(col)), ('BACKGROUND',(0,0),(0,0),colors.white), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8), ('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7), ('ROUNDEDCORNERS',[8,8,0,0]), ])) lab = S('lab', fontName='DV-B', fontSize=8.5, leading=11, textColor=dk) en_s = S('en', fontSize=10, leading=14, textColor=colors.HexColor('#222222')) ru_s = S('ru', fontSize=10, leading=14, textColor=dk) ru_i = S('rui', fontName='DV-I', fontSize=9.5, leading=13, textColor=dk) mean = Table([ [Paragraph("MEANING (ENGLISH)", lab), Paragraph(en, en_s)], [Paragraph("ЗНАЧЕНИЕ (РУССКИЙ)", lab), Paragraph(f"<b>{ru_w}</b> - {ru_m}", ru_s)], ], colWidths=[34*mm, FW-34*mm]) mean.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,-1),tn), ('VALIGN',(0,0),(-1,-1),'TOP'), ('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('LINEBELOW',(0,0),(-1,0),0.6,colors.white), ])) rows = [[Paragraph("3 EXAMPLES FROM DAILY LIFE / ПРИМЕРЫ ИЗ ЖИЗНИ", S('eh', fontName='DV-B', fontSize=8.5, textColor=dk)), ""]] ex_rows = [] for k, (e, r) in enumerate(ex, 1): badge = Paragraph(f"{k}", S('b', fontName='DV-B', fontSize=11, leading=14, textColor=colors.white, alignment=1)) txt = [Paragraph(e, en_s), Spacer(1,2), Paragraph(r, ru_i)] ex_rows.append([badge, txt]) et = Table(ex_rows, colWidths=[9*mm, FW-9*mm]) st = [('VALIGN',(0,0),(-1,-1),'TOP'), ('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8), ('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BOX',(0,0),(-1,-1),1,C(col)),('BACKGROUND',(0,0),(-1,-1),colors.white)] for k in range(3): st += [('BACKGROUND',(0,k),(0,k),C(col)),('LINEBELOW',(0,k),(-1,k),0.4,tn)] # make badge column narrow circles-like squares et.setStyle(TableStyle(st)) exh = Table([[Paragraph("3 EXAMPLES FROM DAILY LIFE / ПРИМЕРЫ ИЗ ЖИЗНИ", S('eh', fontName='DV-B', fontSize=8.5, leading=11, textColor=colors.white))]], colWidths=[FW]) exh.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),dk),('LEFTPADDING',(0,0),(-1,-1),8), ('TOPPADDING',(0,0),(-1,-1),4),('BOTTOMPADDING',(0,0),(-1,-1),4)])) return KeepTogether([head, mean, exh, et]) def cover(c, doc): c.saveState() c.setFillColor(C("#2B2D6E")); c.rect(0,0,W,H,fill=1,stroke=0) # colourful bands bw = W/len(PAL) for k,h in enumerate(PAL): c.setFillColor(C(h)); c.rect(k*bw, H-22*mm, bw, 22*mm, fill=1, stroke=0) c.rect(k*bw, 0, bw, 14*mm, fill=1, stroke=0) for k,(x,y,r,h) in enumerate([(40,640,60,"#E63946"),(540,700,45,"#F77F00"),(500,200,80,"#2A9D8F"),(60,180,50,"#8338EC"),(300,120,35,"#FFD166")]): c.setFillColor(C(h)); c.setFillAlpha(0.25); c.circle(x,y,r,fill=1,stroke=0) c.setFillAlpha(1) c.setFillColor(colors.white); c.setFont('DV-B', 44); c.drawCentredString(W/2, H/2+60, "Vocabulary") c.setFillColor(C("#FFD166")); c.setFont('DV-B', 44); c.drawCentredString(W/2, H/2+10, "Handbook") c.setFillColor(colors.white); c.setFont('DV', 14) c.drawCentredString(W/2, H/2-30, "20 Words / Respelling / English + Russian") c.setFont('DV', 12) c.drawCentredString(W/2, H/2-55, "Сборник слов: произношение, значения и примеры") c.setFont('DV-I', 11); c.setFillColor(C("#CFD2FF")) c.drawCentredString(W/2, 40*mm, "Each word: respelling in [brackets], meaning in English and Russian,") c.drawCentredString(W/2, 40*mm-15, "and 3 daily-life sentences with Russian translation") c.restoreState() def later(c, doc): c.saveState() c.setFillColor(C(PAL[(doc.page) % len(PAL)])); c.rect(0, H-6, W, 6, fill=1, stroke=0) c.setFont('DV', 8); c.setFillColor(colors.grey) c.drawString(M, 10*mm, "Vocabulary Handbook / Сборник слов") c.drawRightString(W-M, 10*mm, f"{doc.page}") c.restoreState() doc = BaseDocTemplate("/tmp/workspace/vocab-handbook/Vocabulary_Handbook.pdf", pagesize=A4, leftMargin=M, rightMargin=M, topMargin=14*mm, bottomMargin=16*mm, title="Vocabulary Handbook", author="Orris") fr = Frame(M, 16*mm, FW, H-30*mm, id='f', leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0) doc.addPageTemplates([PageTemplate('cover', [Frame(0,0,W,H,id='c')], onPage=cover), PageTemplate('main', [fr], onPage=later)]) story = [NextPageTemplate('main'), PageBreak()] # index page story.append(Paragraph("Word List / Список слов", S('t', fontName='DV-B', fontSize=22, leading=28, textColor=C("#2B2D6E")))) story.append(Spacer(1,6)) story.append(Paragraph("Each page shows two words. Say the CAPITAL syllable louder (stressed).<br/>На каждой странице по два слова. Слог, написанный ЗАГЛАВНЫМИ буквами, - ударный.", S('s', fontSize=9.5, leading=14, textColor=colors.HexColor('#555555')))) story.append(Spacer(1,10)) idx = [] for i, r in enumerate(D): col = PAL[i % len(PAL)] cell = Table([[Paragraph(f"{i+1}. {r[0]}", S('iw', fontName='DV-B', fontSize=12, leading=15, textColor=colors.white))], [Paragraph(f"[{r[2+0-0] if False else r[1]}]", S('ir', fontSize=8.5, leading=11, textColor=colors.white))], [Paragraph(r[4], S('iru', fontName='DV-I', fontSize=8.5, leading=11, textColor=colors.white))]], colWidths=[FW/2-4]) cell.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C(col)),('LEFTPADDING',(0,0),(-1,-1),8), ('TOPPADDING',(0,0),(-1,-1),2),('BOTTOMPADDING',(0,0),(-1,-1),2), ('TOPPADDING',(0,0),(-1,0),6),('BOTTOMPADDING',(0,-1),(-1,-1),6),('ROUNDEDCORNERS',[6,6,6,6])])) idx.append(cell) rows = [[idx[i], idx[i+1]] for i in range(0, len(idx), 2)] it = Table(rows, colWidths=[FW/2, FW/2]) it.setStyle(TableStyle([('LEFTPADDING',(0,0),(-1,-1),2),('RIGHTPADDING',(0,0),(-1,-1),2),('TOPPADDING',(0,0),(-1,-1),3),('BOTTOMPADDING',(0,0),(-1,-1),3)])) story.append(it) story.append(PageBreak()) for i, r in enumerate(D): story.append(card(i, r)) if i % 2 == 0: story.append(Spacer(1, 12*mm)) elif i < len(D)-1: story.append(PageBreak()) doc.build(story) EOF cd /tmp/workspace/vocab-handbook && python make.py && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook.pdf');print(len(p.pages)) im=p.pages[2].to_image(resolution=60);im.save('p3.png') p.pages[0].to_image(resolution=60).save('p1.png');p.pages[1].to_image(resolution=60).save('p2.png')"
cd /tmp/workspace/vocab-handbook && python - <<'EOF' s=open('make.py').read() s=s.replace("en_s = S('en', fontSize=10, leading=14","en_s = S('en', fontSize=12, leading=17") s=s.replace("ru_s = S('ru', fontSize=10, leading=14","ru_s = S('ru', fontSize=12, leading=17") s=s.replace("ru_i = S('rui', fontName='DV-I', fontSize=9.5, leading=13","ru_i = S('rui', fontName='DV-I', fontSize=11.5, leading=16") s=s.replace("fontSize=24, leading=28","fontSize=30, leading=34").replace("fontSize=11.5, leading=15, textColor=colors.white","fontSize=13.5, leading=18, textColor=colors.white") s=s.replace("fontSize=8.5, leading=11, textColor=dk","fontSize=9.5, leading=12, textColor=dk") s=s.replace("fontSize=8.5, leading=11, textColor=colors.white))]], colWidths=[FW])","fontSize=10, leading=13, textColor=colors.white))]], colWidths=[FW])") s=s.replace("colWidths=[34*mm, FW-34*mm]","colWidths=[38*mm, FW-38*mm]") s=s.replace("('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),\n ('LINEBELOW'","('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),\n ('LINEBELOW'") s=s.replace("('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5),\n ('BOX'","('TOPPADDING',(0,0),(-1,-1),9),('BOTTOMPADDING',(0,0),(-1,-1),9),\n ('BOX'") s=s.replace("('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7),\n ('ROUNDED","('TOPPADDING',(0,0),(-1,-1),10),('BOTTOMPADDING',(0,0),(-1,-1),10),\n ('ROUNDED") s=s.replace("Spacer(1, 12*mm)","Spacer(1, 10*mm)") open('make.py','w').write(s) EOF python make.py && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook.pdf');print(len(p.pages)) p.pages[2].to_image(resolution=70).save('p3.png');p.pages[11].to_image(resolution=70).save('p12.png')"
cd /tmp/workspace/vocab-handbook && python - <<'EOF' s=open('make.py').read() s=s.replace("('TOPPADDING',(0,0),(-1,-1),9),('BOTTOMPADDING',(0,0),(-1,-1),9)","('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)") s=s.replace("('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),\n ('LINEBELOW'","('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6),\n ('LINEBELOW'") s=s.replace("Spacer(1, 10*mm)","Spacer(1, 7*mm)") s=s.replace("fontSize=12, leading=17","fontSize=11.5, leading=16").replace("fontSize=11.5, leading=16, textColor=dk)\n mean","fontSize=11.5, leading=16, textColor=dk)\n mean") open('make.py','w').write(s) EOF python make.py && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook.pdf');print(len(p.pages)) p.pages[2].to_image(resolution=70).save('v2_p3.png');p.pages[11].to_image(resolution=70).save('v2_p12.png')"
Vocabulary Handbook
PDF Document · PDF
Please add 10 conversation questions for my ESL student for C1 advance proficiency Cambridge speaking practice test using the vocabulary words list used above recently in handbook pdf created by you
cd /tmp/workspace/vocab-handbook && python - <<'EOF' s=open('make.py').read() s=s.replace('c.drawCentredString(W/2, 40*mm-15, "and 3 daily-life sentences with Russian translation")', 'c.drawCentredString(W/2, 40*mm-15, "and 3 daily-life sentences with Russian translation")\n c.drawCentredString(W/2, 40*mm-30, "Bonus: 10 C1 Advanced speaking questions")') s=s.replace('"20 Words / Respelling / English + Russian"','"20 Words / Respelling / English + Russian"') q = r''' Q = [ ("Serendipity, Humdrum", "Describe a time when <b>serendipity</b> changed your <b>humdrum</b> routine. In your opinion, what matters more in life: luck or careful planning?", "Расскажите о случае, когда счастливая случайность изменила вашу скучную рутину. Что, по-вашему, важнее в жизни: удача или тщательное планирование?", "Do you think people can create their own luck?","Как вы думаете, могут ли люди сами создавать себе удачу?"), ("Fiery, Mouth-puckering", "What is the most <b>fiery</b> or <b>mouth-puckering</b> food you have ever tried? Does a person's taste in strong flavours say anything about their personality?", "Какое самое жгучее или невероятно кислое блюдо вы когда-либо пробовали? Говорит ли любовь человека к насыщенным вкусам что-то о его характере?", "Should children be encouraged to try strong flavours?","Нужно ли поощрять детей пробовать насыщенные вкусы?"), ("Cloying, Acrid", "Some smells and tastes are <b>cloying</b>, while others are <b>acrid</b>. Which everyday smells do you find the most unpleasant, and why?", "Некоторые запахи и вкусы приторные, а другие едкие. Какие повседневные запахи вам неприятны больше всего и почему?", "Why do you think smell is so closely linked to memory?","Как вы думаете, почему запах так тесно связан с памятью?"), ("Bone-chilling, Petrified", "Have you ever been out in <b>bone-chilling</b> weather, or felt <b>petrified</b> by something? Why do so many people enjoy being frightened by horror films?", "Вы когда-нибудь оказывались на пронизывающем до костей холоде или цепенели от страха? Почему многим людям нравится пугаться на фильмах ужасов?", "Is fear ever a useful emotion?","Бывает ли страх полезной эмоцией?"), ("Censure, Erroneous", "Should public figures face <b>censure</b> when they make <b>erroneous</b> statements? How should social media deal with false information?", "Должны ли публичные люди подвергаться осуждению за ошибочные заявления? Как социальным сетям следует бороться с ложной информацией?", "Who should check the facts: journalists, readers or the platforms themselves?","Кто должен проверять факты: журналисты, читатели или сами платформы?"), ("Gallant, Stalwart", "Is <b>gallant</b> behaviour still expected in modern society? What qualities make someone a <b>stalwart</b> friend or colleague?", "Ожидается ли галантное поведение в современном обществе? Какие качества делают человека стойким и надёжным другом или коллегой?", "Do you think good manners are the same in every culture?","Как вы считаете, одинаковы ли хорошие манеры во всех культурах?"), ("Discourteous, Irascible", "How should we respond to <b>discourteous</b> or <b>irascible</b> people at work or in shops? Do you think social media makes people ruder?", "Как следует реагировать на невежливых или вспыльчивых людей на работе или в магазинах? Как вы думаете, делают ли соцсети людей грубее?", "Is it ever acceptable to answer rudeness with rudeness?","Допустимо ли когда-нибудь отвечать грубостью на грубость?"), ("Cynical, Disdain", "Is it healthy to be <b>cynical</b> about the news and advertising? Why do some people treat idealists with <b>disdain</b>?", "Полезно ли быть циничным по отношению к новостям и рекламе? Почему некоторые люди относятся к идеалистам с презрением?", "Can being too sceptical stop us from trusting anyone?","Может ли чрезмерный скептицизм помешать нам кому-либо доверять?"), ("Resplendent, Inundated", "Describe a <b>resplendent</b> place you have visited. Famous sights are often <b>inundated</b> with tourists: should the number of visitors be limited?", "Опишите великолепное место, которое вы посещали. Известные достопримечательности часто заполонены туристами: следует ли ограничивать число посетителей?", "How can cities protect their landmarks and still welcome visitors?","Как городам сохранять свои достопримечательности и при этом принимать гостей?"), ("Ignominy, Ambivalence", "How does public <b>ignominy</b> affect a person in the age of the internet? Do you feel any <b>ambivalence</b> about the role of technology in our lives?", "Как публичный позор влияет на человека в эпоху интернета? Испытываете ли вы двойственные чувства по поводу роли технологий в нашей жизни?", "Should people get a second chance after a public mistake?","Нужно ли давать людям второй шанс после публичной ошибки?"), ] def qcard(i, row): words, q, qr, fu, fur = row col = PAL[(i+3) % len(PAL)]; tn = tint(col); dk = dark(col) en_s = S('qe', fontSize=11.5, leading=16.5, textColor=colors.HexColor('#222222')) ru_s = S('qr', fontName='DV-I', fontSize=10.5, leading=15, textColor=dk) fu_s = S('fe', fontSize=10.5, leading=15, textColor=colors.HexColor('#333333')) fr_s = S('fr', fontName='DV-I', fontSize=10, leading=14, textColor=dk) num = Paragraph(f"Q{i+1}", S('qn', fontName='DV-B', fontSize=15, leading=18, textColor=colors.white, alignment=1)) tgt = Paragraph(f"<b>Target words:</b> {words}", S('tw', fontSize=9.5, leading=13, textColor=colors.white)) top = Table([[num, tgt]], colWidths=[16*mm, FW-16*mm]) top.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C(col)),('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BACKGROUND',(0,0),(0,0),dk)])) body = Table([[[Paragraph(q, en_s), Spacer(1,3), Paragraph(qr, ru_s), Spacer(1,6), Paragraph("<b>Follow-up:</b> "+fu, fu_s), Spacer(1,2), Paragraph(fur, fr_s)]]], colWidths=[FW]) body.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),tn),('LEFTPADDING',(0,0),(-1,-1),10),('RIGHTPADDING',(0,0),(-1,-1),10), ('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8)])) return KeepTogether([top, body, Spacer(1, 4*mm)]) story.append(PageBreak()) story.append(Paragraph("Speaking Practice / Разговорная практика", S('t2', fontName='DV-B', fontSize=22, leading=28, textColor=C("#2B2D6E")))) story.append(Paragraph("C1 Advanced (CAE) style discussion questions", S('t3', fontName='DV-B', fontSize=13, leading=18, textColor=C("#E63946")))) story.append(Spacer(1,5)) tips = Table([[Paragraph("<b>How to use:</b> Ask one question at a time. The student speaks for about 1 minute, using the target words naturally, then answers the follow-up. " "<b>Aim for:</b> a clear opinion, a reason, an example, and a contrasting view (for example: <i>On the one hand... however... to some extent...</i>).<br/>" "<b>Как использовать:</b> задавайте по одному вопросу. Ученик говорит около минуты, естественно употребляя выделенные слова, затем отвечает на дополнительный вопрос.", S('tp', fontSize=9.5, leading=14, textColor=colors.HexColor('#333333')))]], colWidths=[FW]) tips.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),colors.HexColor('#FFF3C4')),('LEFTPADDING',(0,0),(-1,-1),10),('RIGHTPADDING',(0,0),(-1,-1),10), ('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),('BOX',(0,0),(-1,-1),1,C("#FFD166"))])) story += [tips, Spacer(1,6*mm)] for i, r in enumerate(Q): story.append(qcard(i, r)) doc.build(story) ''' s=s.replace("\ndoc.build(story)\n", q) open('make.py','w').write(s) EOF python make.py && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook.pdf');n=len(p.pages);print(n) for k in range(12,n): p.pages[k].to_image(resolution=65).save(f'q{k}.png')"
cd /tmp/workspace/vocab-handbook && python - <<'EOF' s=open('make.py').read() s=s.replace("colWidths=[16*mm, FW-16*mm]","colWidths=[20*mm, FW-20*mm]") s=s.replace("S('t2', fontName='DV-B', fontSize=22, leading=28","S('t2', fontName='DV-B', fontSize=19, leading=26") open('make.py','w').write(s) EOF python make.py && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook.pdf');print(len(p.pages)) p.pages[12].to_image(resolution=50).save('f12.png');p.pages[14].to_image(resolution=50).save('f14.png')"
cd /tmp/workspace/vocab-handbook && ls -la && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook.pdf');print(len(p.pages)) p.pages[14].to_image(resolution=50).save('g14.png')"
Vocabulary Handbook
PDF Document · PDF
| Q | Target words | Topic |
|---|---|---|
| 1 | Serendipity, Humdrum | Luck versus planning |
| 2 | Fiery, Mouth-puckering | Strong flavours and personality |
| 3 | Cloying, Acrid | Unpleasant smells and tastes |
| 4 | Bone-chilling, Petrified | Fear and horror films |
| 5 | Censure, Erroneous | Public figures and misinformation |
| 6 | Gallant, Stalwart | Manners and loyal friends |
| 7 | Discourteous, Irascible | Dealing with rude people |
| 8 | Cynical, Disdain | Scepticism and idealists |
| 9 | Resplendent, Inundated | Tourism and famous places |
| 10 | Ignominy, Ambivalence | Public shame online and technology |
I can't see 10 conversation questions
cd /tmp/workspace/vocab-handbook && cp Vocabulary_Handbook.pdf Vocabulary_Handbook_with_Speaking_Questions.pdf && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook_with_Speaking_Questions.pdf');print(len(p.pages)) for k in (12,13,14): print(k+1, p.pages[k].extract_text()[:120].replace('\n',' | '))"; ls -la *.pdf
cd /tmp/workspace/vocab-handbook && grep -c "qcard" make.py; ls -la;
cd /tmp/workspace/vocab-handbook && python - <<'EOF' s=open('make.py').read() s=s.replace('c.drawCentredString(W/2, 40*mm-15, "and 3 daily-life sentences with Russian translation")', 'c.drawCentredString(W/2, 40*mm-15, "and 3 daily-life sentences with Russian translation")\n c.drawCentredString(W/2, 40*mm-30, "Bonus: 10 C1 Advanced speaking questions")') q = r''' Q = [ ("Serendipity, Humdrum", "Describe a time when <b>serendipity</b> changed your <b>humdrum</b> routine. In your opinion, what matters more in life: luck or careful planning?", "Расскажите о случае, когда счастливая случайность изменила вашу скучную рутину. Что, по-вашему, важнее в жизни: удача или тщательное планирование?", "Do you think people can create their own luck?","Как вы думаете, могут ли люди сами создавать себе удачу?"), ("Fiery, Mouth-puckering", "What is the most <b>fiery</b> or <b>mouth-puckering</b> food you have ever tried? Does a person's taste in strong flavours say anything about their personality?", "Какое самое жгучее или невероятно кислое блюдо вы когда-либо пробовали? Говорит ли любовь человека к насыщенным вкусам что-то о его характере?", "Should children be encouraged to try strong flavours?","Нужно ли поощрять детей пробовать насыщенные вкусы?"), ("Cloying, Acrid", "Some smells and tastes are <b>cloying</b>, while others are <b>acrid</b>. Which everyday smells do you find the most unpleasant, and why?", "Некоторые запахи и вкусы приторные, а другие едкие. Какие повседневные запахи вам неприятны больше всего и почему?", "Why do you think smell is so closely linked to memory?","Как вы думаете, почему запах так тесно связан с памятью?"), ("Bone-chilling, Petrified", "Have you ever been out in <b>bone-chilling</b> weather, or felt <b>petrified</b> by something? Why do so many people enjoy being frightened by horror films?", "Вы когда-нибудь оказывались на пронизывающем до костей холоде или цепенели от страха? Почему многим людям нравится пугаться на фильмах ужасов?", "Is fear ever a useful emotion?","Бывает ли страх полезной эмоцией?"), ("Censure, Erroneous", "Should public figures face <b>censure</b> when they make <b>erroneous</b> statements? How should social media deal with false information?", "Должны ли публичные люди подвергаться осуждению за ошибочные заявления? Как социальным сетям следует бороться с ложной информацией?", "Who should check the facts: journalists, readers or the platforms themselves?","Кто должен проверять факты: журналисты, читатели или сами платформы?"), ("Gallant, Stalwart", "Is <b>gallant</b> behaviour still expected in modern society? What qualities make someone a <b>stalwart</b> friend or colleague?", "Ожидается ли галантное поведение в современном обществе? Какие качества делают человека стойким и надёжным другом или коллегой?", "Do you think good manners are the same in every culture?","Как вы считаете, одинаковы ли хорошие манеры во всех культурах?"), ("Discourteous, Irascible", "How should we respond to <b>discourteous</b> or <b>irascible</b> people at work or in shops? Do you think social media makes people ruder?", "Как следует реагировать на невежливых или вспыльчивых людей на работе или в магазинах? Как вы думаете, делают ли соцсети людей грубее?", "Is it ever acceptable to answer rudeness with rudeness?","Допустимо ли когда-нибудь отвечать грубостью на грубость?"), ("Cynical, Disdain", "Is it healthy to be <b>cynical</b> about the news and advertising? Why do some people treat idealists with <b>disdain</b>?", "Полезно ли быть циничным по отношению к новостям и рекламе? Почему некоторые люди относятся к идеалистам с презрением?", "Can being too sceptical stop us from trusting anyone?","Может ли чрезмерный скептицизм помешать нам кому-либо доверять?"), ("Resplendent, Inundated", "Describe a <b>resplendent</b> place you have visited. Famous sights are often <b>inundated</b> with tourists: should the number of visitors be limited?", "Опишите великолепное место, которое вы посещали. Известные достопримечательности часто заполонены туристами: следует ли ограничивать число посетителей?", "How can cities protect their landmarks and still welcome visitors?","Как городам сохранять свои достопримечательности и при этом принимать гостей?"), ("Ignominy, Ambivalence", "How does public <b>ignominy</b> affect a person in the age of the internet? Do you feel any <b>ambivalence</b> about the role of technology in our lives?", "Как публичный позор влияет на человека в эпоху интернета? Испытываете ли вы двойственные чувства по поводу роли технологий в нашей жизни?", "Should people get a second chance after a public mistake?","Нужно ли давать людям второй шанс после публичной ошибки?"), ] def qcard(i, row): words, q, qr, fu, fur = row col = PAL[(i+3) % len(PAL)]; tn = tint(col); dk = dark(col) en_s = S('qe', fontSize=11.5, leading=16.5, textColor=colors.HexColor('#222222')) ru_s = S('qr', fontName='DV-I', fontSize=10.5, leading=15, textColor=dk) fu_s = S('fe', fontSize=10.5, leading=15, textColor=colors.HexColor('#333333')) fr_s = S('fr', fontName='DV-I', fontSize=10, leading=14, textColor=dk) num = Paragraph(f"Q{i+1}", S('qn', fontName='DV-B', fontSize=15, leading=18, textColor=colors.white, alignment=1)) tgt = Paragraph(f"<b>Target words:</b> {words}", S('tw', fontSize=9.5, leading=13, textColor=colors.white)) top = Table([[num, tgt]], colWidths=[20*mm, FW-20*mm]) top.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),C(col)),('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('LEFTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5), ('BACKGROUND',(0,0),(0,0),dk)])) body = Table([[[Paragraph(q, en_s), Spacer(1,3), Paragraph(qr, ru_s), Spacer(1,6), Paragraph("<b>Follow-up:</b> "+fu, fu_s), Spacer(1,2), Paragraph(fur, fr_s)]]], colWidths=[FW]) body.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),tn),('LEFTPADDING',(0,0),(-1,-1),10),('RIGHTPADDING',(0,0),(-1,-1),10), ('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8)])) return KeepTogether([top, body, Spacer(1, 4*mm)]) story.append(PageBreak()) story.append(Paragraph("Speaking Practice / Разговорная практика", S('t2', fontName='DV-B', fontSize=19, leading=26, textColor=C("#2B2D6E")))) story.append(Paragraph("C1 Advanced (CAE) style discussion questions", S('t3', fontName='DV-B', fontSize=13, leading=18, textColor=C("#E63946")))) story.append(Spacer(1,5)) tips = Table([[Paragraph("<b>How to use:</b> Ask one question at a time. The student speaks for about 1 minute, using the target words naturally, then answers the follow-up. " "<b>Aim for:</b> a clear opinion, a reason, an example, and a contrasting view (for example: <i>On the one hand... however... to some extent...</i>).<br/>" "<b>Как использовать:</b> задавайте по одному вопросу. Ученик говорит около минуты, естественно употребляя выделенные слова, затем отвечает на дополнительный вопрос.", S('tp', fontSize=9.5, leading=14, textColor=colors.HexColor('#333333')))]], colWidths=[FW]) tips.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),colors.HexColor('#FFF3C4')),('LEFTPADDING',(0,0),(-1,-1),10),('RIGHTPADDING',(0,0),(-1,-1),10), ('TOPPADDING',(0,0),(-1,-1),8),('BOTTOMPADDING',(0,0),(-1,-1),8),('BOX',(0,0),(-1,-1),1,C("#FFD166"))])) story += [tips, Spacer(1,6*mm)] for i, r in enumerate(Q): story.append(qcard(i, r)) doc.build(story) ''' assert "\ndoc.build(story)\n" in s s=s.replace("\ndoc.build(story)\n", q) open('make.py','w').write(s) EOF python make.py && cp Vocabulary_Handbook.pdf Vocabulary_Handbook_with_Speaking_Questions.pdf && python -c " import pdfplumber p=pdfplumber.open('Vocabulary_Handbook_with_Speaking_Questions.pdf');print(len(p.pages)) for k in range(12,len(p.pages)): print(k+1, p.pages[k].extract_text()[:150].replace('\n',' | ')) p.pages[13].to_image(resolution=55).save('z14.png')"; ls -la *.pdf