I want as a pdf simple 3 days gym workout plan with how to do it including warm up and cool down or stretching for fat loss and strength training especially core strengthening. my body weight is 83kg and 150cm in height. i had severe back pain that is radiculitis flare up 4 months ago which last for two months. now im doing core strengthening exercises prescribed by physiotherapist. Now i have no pain but still there is a tendency of flaring if i do heavy weight things or bending or cold weather. Give me 4-5 exercises which is very effective per day because long duration and high number of exercises cause pain. I need to be at 70kg at the end of this year so suggest me daily calorie intake and macros needed. i have poky metabolic ovarian syndrome also. if my weight goal is unrealistic suggest me realistic weight goal also.
"polycystic ovary syndrome" AND exercise
"low back pain" AND exercise
2023 international evidence based guideline PCOS lifestyle weight management physical activity nutrition
https://integration.asrm.org/practice-guidance/practice-comm…
PMID: 42679860
PMID: 40312680
~/
mkdir -p "/tmp/workspace/back_safe_workout_pdf/src" "/tmp/workspace/back_safe_workout_pdf/output" && python - <<'PY' from pathlib import Path p=Path('/tmp/workspace/back_safe_workout_pdf/src/create_plan.py') p.write_text(r'''from reportlab.lib import colors from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, KeepTogether from reportlab.pdfbase.pdfmetrics import stringWidth OUT = '/tmp/workspace/back_safe_workout_pdf/output/3_Day_Back_Safe_Gym_Plan.pdf' navy = colors.HexColor('#17324D') teal = colors.HexColor('#147D8C') light_teal = colors.HexColor('#E8F4F5') pale = colors.HexColor('#F4F7F8') orange = colors.HexColor('#A64B00') red = colors.HexColor('#9B1B30') grey = colors.HexColor('#4A5560') styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='CoverTitle', parent=styles['Title'], fontName='Helvetica-Bold', fontSize=23, leading=28, textColor=navy, alignment=TA_CENTER, spaceAfter=10)) styles.add(ParagraphStyle(name='CoverSub', parent=styles['Normal'], fontSize=11, leading=15, textColor=grey, alignment=TA_CENTER, spaceAfter=12)) styles.add(ParagraphStyle(name='H1x', parent=styles['Heading1'], fontName='Helvetica-Bold', fontSize=16, leading=20, textColor=navy, spaceBefore=5, spaceAfter=8)) styles.add(ParagraphStyle(name='H2x', parent=styles['Heading2'], fontName='Helvetica-Bold', fontSize=11.5, leading=14, textColor=teal, spaceBefore=8, spaceAfter=4)) styles.add(ParagraphStyle(name='Bodyx', parent=styles['BodyText'], fontName='Helvetica', fontSize=9.1, leading=12.3, textColor=colors.HexColor('#20262D'), spaceAfter=4)) styles.add(ParagraphStyle(name='Smallx', parent=styles['BodyText'], fontName='Helvetica', fontSize=8.15, leading=10.5, textColor=colors.HexColor('#20262D'), spaceAfter=2)) styles.add(ParagraphStyle(name='CardTitle', parent=styles['BodyText'], fontName='Helvetica-Bold', fontSize=10.5, leading=13, textColor=navy, spaceAfter=3)) styles.add(ParagraphStyle(name='Note', parent=styles['BodyText'], fontName='Helvetica-Bold', fontSize=9.1, leading=12.3, textColor=red, spaceAfter=4)) styles.add(ParagraphStyle(name='Foot', parent=styles['BodyText'], fontName='Helvetica', fontSize=7.5, leading=9, textColor=grey, alignment=TA_CENTER)) P = lambda text, style='Bodyx': Paragraph(text, styles[style]) def box(content, bg=light_teal, border=teal, pad=8): t=Table([[content]], colWidths=[17.1*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),bg),('BOX',(0,0),(-1,-1),0.55,border),('LEFTPADDING',(0,0),(-1,-1),pad),('RIGHTPADDING',(0,0),(-1,-1),pad),('TOPPADDING',(0,0),(-1,-1),pad),('BOTTOMPADDING',(0,0),(-1,-1),pad)])) return t def bullet(items, small=False): s='Smallx' if small else 'Bodyx' return [P('• '+x, s) for x in items] def exercise(name, sets, how, dose, notes=''): parts=[P(name, 'CardTitle'), P('<b>Sets:</b> '+sets+' <b>Effort:</b> '+dose, 'Smallx'), P('<b>How:</b> '+how, 'Smallx')] if notes: parts.append(P('<b>Form cue:</b> '+notes, 'Smallx')) t=Table([[parts]], colWidths=[17.1*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),pale),('BOX',(0,0),(-1,-1),0.35,colors.HexColor('#C8D3D8')),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)])) return KeepTogether([t, Spacer(1,5)]) def header_footer(canvas, doc): canvas.saveState() canvas.setStrokeColor(colors.HexColor('#BCD4D8')); canvas.setLineWidth(.4) canvas.line(1.45*cm, 1.35*cm, 19.55*cm, 1.35*cm) canvas.setFont('Helvetica', 7.3); canvas.setFillColor(grey) canvas.drawString(1.45*cm, .88*cm, '3-day back-conscious gym plan | Educational plan, not a substitute for your clinician or physiotherapist') canvas.drawRightString(19.55*cm, .88*cm, f'Page {doc.page}') canvas.restoreState() doc=SimpleDocTemplate(OUT, pagesize=A4, rightMargin=1.45*cm, leftMargin=1.45*cm, topMargin=1.25*cm, bottomMargin=1.75*cm) story=[] # Cover story += [Spacer(1,1.2*cm), P('3-Day Gym Plan', 'CoverTitle'), P('Fat loss, strength, and core stability with a cautious return after lumbar radicular pain', 'CoverSub')] story.append(box([P('<b>Your starting point</b>', 'CardTitle'), P('Body weight: <b>83 kg</b> | Height: <b>150 cm</b> | BMI: about <b>36.9 kg/m<super>2</super></b>. You are currently pain-free, but bending and heavy loads may trigger symptoms. This plan therefore uses supported machines, neutral-spine training, short sessions, and the core exercises already prescribed by your physiotherapist.', 'Bodyx')])) story += [Spacer(1,10), P('Safety gate before every session', 'H1x')] story.append(box([P('Continue only if the session is pain-free. Stop immediately for pain shooting into the buttock or leg, numbness, tingling, new weakness, loss of balance, or worsening pain later that day or next morning. Seek urgent medical care for new bladder or bowel changes, saddle numbness, or rapidly worsening leg weakness.', 'Note'), P('Please show this plan to your physiotherapist before progressing gym loads. Their prescribed core program takes priority over any exercise here.', 'Bodyx')], bg=colors.HexColor('#FFF3F0'), border=orange)) story += [Spacer(1,9), P('How to use it', 'H1x')] story += bullet(['Train on 3 non-consecutive days, for example Monday, Wednesday, Friday. Each session is about 35-45 minutes including warm-up and cool-down.', 'Do only 4-5 main exercises per day. Keep 1-2 repetitions in reserve: finish each set feeling you could do 1-2 more with perfect form.', 'Start at the lowest comfortable resistance. Do not hold your breath, twist while loaded, force deep bending, or lift from the floor.', 'On other days, take an easy 10-20 minute walk if symptoms allow. Build overall weekly movement slowly.']) story += [Spacer(1,8), P('Progress rule', 'H2x'), P('For an exercise that stays symptom-free during, later that day, and the next morning: first add repetitions until the top of the range is comfortable. Only then increase the machine by its smallest increment. Change one thing at a time. If symptoms rise above mild discomfort or last more than 24 hours, reduce range, repetitions, or resistance and discuss it with your physiotherapist.', 'Bodyx'), PageBreak()] # universal preparation story += [P('Every Session: Warm-up and Cool-down', 'H1x'), P('Keep the back warm in cold weather. Wear a light layer, begin slowly, and avoid starting with deep stretches or heavy resistance.', 'Bodyx')] story += [P('Warm-up: 7-8 minutes', 'H2x')] warm=[['1. Easy cardio','5 minutes on a recumbent bike or treadmill walk. Comfortable pace, able to speak in full sentences.'],['2. Brace practice','5 slow breaths. Lie on your back with knees bent, or stand tall. Gently tighten the lower abdomen as if preparing for a light cough. Keep breathing normally.'],['3. Gentle mobility','6-8 controlled shoulder rolls and hip hinges with hands on thighs. Stop well before pain and do not force lumbar bending.']] t=Table([[P(a,'Smallx'),P(b,'Smallx')] for a,b in warm],colWidths=[4.0*cm,13.1*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),light_teal),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B9D6D9')),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)])) story += [t, Spacer(1,9), P('Cool-down: 5-7 minutes', 'H2x')] story += bullet(['Easy walk or very easy bike for 3-5 minutes until breathing settles.', 'Gentle stretches: chest doorway stretch, hip-flexor stretch, and calf stretch. Hold each 20-30 seconds, 1-2 times per side. Keep pelvis and back neutral. No bouncing.', 'If a stretch causes leg symptoms, skip it. Choose relaxed breathing instead.'], small=False) story.append(box(P('<b>Do not use</b> sit-ups, crunches, weighted twisting, Russian twists, hanging leg raises, heavy barbell squats/deadlifts, or bent-over rows for now unless specifically cleared and coached by your physiotherapist.', 'Bodyx'), bg=colors.HexColor('#FFF8E8'), border=orange)) story += [Spacer(1,8), P('Weekly layout', 'H2x')] weekly=[['Day 1','Supported legs + pull + anti-extension core'],['Day 2','Cardio intervals + push + core control'],['Day 3','Full-body supported strength + carry/core']] t=Table([[P(a,'Smallx'),P(b,'Smallx')] for a,b in weekly],colWidths=[4.0*cm,13.1*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(0,-1),light_teal),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B9D6D9')),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)])) story.append(PageBreak()) # Day 1 story += [P('Day 1: Supported Strength + Core', 'H1x'), P('Rest 60-90 seconds between strength sets. All movements should feel controlled and stable, not maximal.', 'Bodyx')] story += [exercise('1. Leg press - short, comfortable range','2 sets of 8-10','Set the seat so your lower back stays supported. Place feet hip-width on the platform. Press away slowly, then return only as far as you can without the pelvis tucking or low back rounding.','Light to moderate'), exercise('2. Seated cable row or chest-supported row','2 sets of 10-12','Sit tall with ribs down. Pull handles toward lower ribs, squeezing shoulder blades gently. Return slowly without leaning back or rounding forward.','Light to moderate','Keep neck relaxed and torso still.'), exercise('3. Glute bridge - only if already cleared by physiotherapist','2 sets of 8-10','Lie on back, knees bent. Lightly brace. Press through heels and lift hips only to a straight line from shoulders to knees. Lower slowly.','Body weight','No arching, no pushing through low-back pain.'), exercise('4. Bird-dog - use your physiotherapist version','2 sets of 5-6 per side, hold 5 seconds','From hands and knees, brace gently. Slide or lift opposite arm and leg only as far as the spine stays still. Return with control.','Body weight','A smaller movement is better than a wobbly one.'), exercise('5. Side plank from knees','2 sets of 10-20 seconds per side','Support on forearm and lower knee. Lift hips gently so trunk stays in one line. Breathe normally, then lower.','Body weight','Stop if shoulder or back hurts.')] story += [P('Optional only if you feel fresh', 'H2x'), P('5-10 minutes easy recumbent bike or treadmill walk. Do not add this if it makes the session long or worsens symptoms.', 'Bodyx'), PageBreak()] # Day 2 story += [P('Day 2: Cardio + Upper Body + Core Control', 'H1x'), P('This is the lower-load day. The purpose is to build consistency and calorie expenditure without irritating the back.', 'Bodyx')] story += [exercise('1. Recumbent bike intervals','12-15 minutes','After the warm-up, pedal 1 minute at a brisk but controlled pace, then 1 minute very easy. Repeat 6-7 times. Keep back supported and cadence smooth.','RPE 4-6 out of 10'), exercise('2. Seated chest press machine','2 sets of 8-10','Set handles around mid-chest. Keep back and head supported. Exhale as you press; return slowly until elbows are just behind the body or before shoulder discomfort.','Light to moderate','No back arching or breath-holding.'), exercise('3. Lat pulldown - neutral or comfortable grip','2 sets of 8-10','Sit tall with thighs secured. Pull bar toward upper chest while gently bringing elbows down. Control it back up. Do not pull behind the neck or lean back.','Light to moderate'), exercise('4. Pallof press - cable or resistance band','2 sets of 6-8 per side, 3-5 second hold','Stand sideways to cable or band at chest height. Brace gently and press hands straight out, resisting rotation. Bring hands back slowly.','Very light','Keep hips and ribs facing forward.'), exercise('5. Heel taps or dead-bug march - use your physio version','2 sets of 6-8 per side','Lie on back with knees bent. Brace gently. Lift one foot a few centimetres or tap a heel while pelvis and low back remain quiet. Alternate sides.','Body weight','Make it easier by sliding the heel rather than lifting.')] story.append(PageBreak()) # Day 3 story += [P('Day 3: Full-Body Supported Strength + Core', 'H1x'), P('Finish the week with simple machine work and a low-load stability challenge. Do not test your maximum strength.', 'Bodyx')] story += [exercise('1. Sit-to-stand from a high bench or box','2 sets of 8-10','Sit near the front of a high bench. Feet under knees. Brace gently, stand by pushing through feet, then lower slowly with hips moving back. Use hands or a higher surface if needed.','Body weight','Maintain a neutral spine; no deep squat needed.'), exercise('2. Seated hamstring curl machine','2 sets of 10-12','Adjust the pad just above the heels. Keep hips back against the seat and curl heels down/back smoothly. Return with control.','Light to moderate'), exercise('3. Supported machine shoulder press OR cable face pull','2 sets of 8-10','Choose shoulder press only if it feels fully comfortable with back support. Otherwise do face pulls: pull rope toward face with elbows high, then return slowly.','Light','Avoid leaning or low-back arching.'), exercise('4. Suitcase carry - only if cleared and completely symptom-free','2 walks of 20-30 seconds each side','Hold one light dumbbell at your side. Stand tall, gently brace, and walk slowly without leaning toward or away from the weight.','Very light','If this causes back symptoms, replace it with Pallof press.'), exercise('5. Modified plank on bench','2 sets of 10-20 seconds','Place forearms on a bench, step feet back, and make a straight line from head to heels. Light brace, breathe, and stop before the back sags.','Body weight','Higher bench = easier. Use knees on floor if needed.')] story += [Spacer(1,6), box(P('<b>Four-week starting approach:</b> Weeks 1-2: keep 2 sets and light loads. Week 3: add reps within the stated range if all symptoms remain quiet. Week 4: add the smallest load increase to one or two exercises only. Keep the session short. Then review with your physiotherapist.', 'Bodyx'))] story.append(PageBreak()) # Nutrition story += [P('Nutrition Targets for Fat Loss and PCOS', 'H1x'), P('Because age, daily activity, medications, menstrual factors, and medical history were not provided, these are safe starting estimates, not a personal medical prescription. A registered dietitian can individualize them, especially if you use glucose-lowering medication, have kidney disease, are pregnant, or plan pregnancy.', 'Bodyx')] story.append(box([P('Target and pace', 'CardTitle'),P('From 83 kg to 70 kg is a 13 kg loss. With about 13 weeks left in 2026, this averages roughly 1 kg per week. That is aggressive and may be difficult to sustain while protecting strength and your back. A more realistic end-of-year range is <b>74-77 kg</b>, assuming an average loss of about 0.4-0.7 kg per week. Reaching 70 kg can remain your next milestone, likely in early 2027. Even a 5-10% loss (about 4-8 kg) can improve PCOS-related metabolic health.', 'Bodyx')], bg=colors.HexColor('#EEF7F2'), border=colors.HexColor('#5A9B75')) story += [Spacer(1,8), P('Daily starting target', 'H2x')] macros=[['Calories','1,450-1,600 kcal/day','Start near 1,500 kcal/day for 2-3 weeks, then adjust from trend. Do not routinely go below 1,200 kcal/day without clinician supervision.'],['Protein','100-115 g/day','Supports fullness and helps preserve muscle during fat loss. Divide across 3 meals, about 25-35 g each.'],['Fat','45-55 g/day','Prioritize nuts, seeds, olive oil, fish, eggs, dairy, and avocado.'],['Carbohydrate','120-150 g/day','Choose high-fibre, minimally processed sources and spread them across meals.'],['Fibre','25-35 g/day','Vegetables, fruit, beans, lentils, oats, whole grains, seeds. Increase gradually with water.']] t=Table([[P(a,'Smallx'),P(b,'Smallx'),P(c,'Smallx')] for a,b,c in macros],colWidths=[3.1*cm,3.3*cm,10.7*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),navy),('TEXTCOLOR',(0,0),(-1,0),colors.white),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B9D6D9')),('BACKGROUND',(0,1),(-1,-1),pale),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),6),('RIGHTPADDING',(0,0),(-1,-1),6),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)])) story += [t, Spacer(1,8), P('Simple plate template', 'H2x')] story += bullet(['At each main meal: 1 palm of protein, 2 fists of non-starchy vegetables, 1 cupped hand of high-fibre carbohydrate, and 1 thumb of healthy fat.', 'Protein ideas: eggs, Greek yogurt/curd, tofu, paneer in moderate portions, chicken, fish, lentils, beans, whey protein if tolerated.', 'For PCOS, there is no single proven best diet pattern. The best option is a sustainable calorie deficit built around adequate protein, fibre, minimally processed foods, and foods you enjoy.', 'Aim for mostly water or unsweetened drinks. Plan a protein-and-fibre snack if hungry, for example yogurt plus fruit, roasted chickpeas, or apple plus nuts.']) story += [P('Monitoring and adjustment', 'H2x'), P('Weigh 2-4 mornings per week after using the toilet, then compare weekly averages. Also measure waist monthly and track energy, pain, sleep, and menstrual changes. If after 3 consistent weeks your weekly average is not falling at all, reduce by about 100-150 kcal/day or add 10 minutes of easy walking on most days, but do not do both at once. If you are losing more than about 0.8 kg/week for 2 weeks, feel overly tired, or your back flares, add 100-150 kcal/day and contact your clinician or dietitian.', 'Bodyx'), PageBreak()] # references story += [P('Clinical Notes and References', 'H1x'), P('This plan intentionally favours regular, tolerable activity over bed rest and avoids high spinal loading while you rebuild capacity. Your individual diagnosis and physiotherapist assessment determine what is appropriate.', 'Bodyx')] story += [P('Evidence used', 'H2x')] story += bullet(['Rheumatology, 2-Volume Set (2022), pp. 3508-3543: regular activity as tolerated is preferred to bed rest; therapeutic exercise may help mechanical low-back pain; back and abdominal strengthening is associated with fewer and shorter episodes of low-back pain.', '2023 International Evidence-based Guideline for PCOS: lifestyle intervention is recommended to improve metabolic health and support weight management; dietary changes should be individual, flexible, and not nutritionally unbalanced.', 'Zou et al. 2026, systematic review and meta-analysis, PMID 42679860: exercise improved several metabolic and hormonal outcomes in PCOS; benefits were more evident with at least 150 minutes per week in analysed studies.', 'Cheng et al. 2025, systematic review and meta-analysis, PMID 40312680: exercise interventions improved low-back pain outcomes. This does not mean every exercise is suitable for every person with radicular symptoms.']) story += [P('When to get individual help', 'H2x'), P('Arrange review with your physiotherapist or clinician before progression if you have recurrent sciatica/radicular symptoms, diabetes or prediabetes, uncontrolled blood pressure, pregnancy or planned pregnancy, a history of eating disorder, or medications that affect blood glucose or weight. A dietitian can calculate a more exact calorie target when you provide age, usual activity, food preferences, and medical details.', 'Bodyx')] story.append(box(P('Important: pain-free today does not guarantee that an exercise is right for your spine. The next-morning response matters. Keep a brief log of exercise, resistance, symptoms, sleep, and steps so your physiotherapist can tailor the plan.', 'Bodyx'), bg=colors.HexColor('#FFF3F0'), border=orange)) doc.build(story, onFirstPage=header_footer, onLaterPages=header_footer) print(OUT) ''') PY python "/tmp/workspace/back_safe_workout_pdf/src/create_plan.py" python - <<'PY' from pypdf import PdfReader p='/tmp/workspace/back_safe_workout_pdf/output/3_Day_Back_Safe_Gym_Plan.pdf' r=PdfReader(p) print('pages',len(r.pages),'size',__import__('os').path.getsize(p)) for i,x in enumerate(r.pages): t=x.extract_text() or '' print(i+1,len(t),t[:80].replace('\n',' | ')) PY
~/back_safe_workout_pdf/src/create_plan.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/back_safe_workout_pdf/src/create_plan.py'
python "/tmp/workspace/back_safe_workout_pdf/src/create_plan.py" && python - <<'PY' from pypdf import PdfReader from pathlib import Path p=Path('/tmp/workspace/back_safe_workout_pdf/output/3_Day_Back_Safe_Gym_Plan.pdf') r=PdfReader(str(p)) print('pages',len(r.pages),'size',p.stat().st_size) for i,page in enumerate(r.pages): t=page.extract_text() or '' print(i+1, len(t), t[:100].replace('\n',' | ')) PY
3 Day Back Safe Gym Plan
PDF Document · PDF
Create a weekly PCOS-friendly meal plan with calorie targets im sri lankan tamil adopt foods accroding to my culture
"polycystic ovary syndrome" AND diet
2023 international PCOS guideline diet nutrition no specific diet healthy eating
| Choose more often | Keep smaller or less frequent |
|---|---|
| Red rice, parboiled rice, samba rice in measured portions | Large plates of white rice |
| Dhal, cowpea, green gram, chickpeas, kollu | Sweet buns, biscuits, cakes |
| Fish, eggs, chicken, tofu, curd | Deep-fried vadai, rolls, cutlets, chips |
| Gotukola, murunga leaves, mallum, beans, brinjal, okra | Large portions of potato and cassava |
| Whole-wheat/kurakkan roti | Refined-flour roti, paratha, bakery foods |
| Papaya, guava, orange, apple, small banana | Fruit juice, cordial, sweetened drinks |
| Unsweetened tea/coffee | Sugar tea, milkshakes, soft drinks |
make it as pdf
~/
mkdir -p "/tmp/workspace/pcos_sri_lankan_meal_plan/src" "/tmp/workspace/pcos_sri_lankan_meal_plan/output" && python - <<'PY' from pathlib import Path p=Path('/tmp/workspace/pcos_sri_lankan_meal_plan/src/create_meal_plan.py') p.write_text(r'''from reportlab.lib import colors from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, KeepTogether from reportlab.pdfbase.pdfmetrics import stringWidth out='/tmp/workspace/pcos_sri_lankan_meal_plan/output/PCOS_Friendly_Sri_Lankan_Tamil_Weekly_Meal_Plan.pdf' navy=colors.HexColor('#1C3852'); teal=colors.HexColor('#177D76'); pale=colors.HexColor('#F2F8F6'); mint=colors.HexColor('#E2F1EC'); gold=colors.HexColor('#A45F0D'); grey=colors.HexColor('#4B5563') ss=getSampleStyleSheet() ss.add(ParagraphStyle(name='TitleX',parent=ss['Title'],fontName='Helvetica-Bold',fontSize=22,leading=27,textColor=navy,alignment=TA_CENTER,spaceAfter=9)) ss.add(ParagraphStyle(name='SubX',parent=ss['Normal'],fontSize=10.5,leading=14,textColor=grey,alignment=TA_CENTER,spaceAfter=11)) ss.add(ParagraphStyle(name='H1X',parent=ss['Heading1'],fontName='Helvetica-Bold',fontSize=15.5,leading=19,textColor=navy,spaceBefore=5,spaceAfter=7)) ss.add(ParagraphStyle(name='H2X',parent=ss['Heading2'],fontName='Helvetica-Bold',fontSize=11.3,leading=14,textColor=teal,spaceBefore=7,spaceAfter=4)) ss.add(ParagraphStyle(name='BodyX',parent=ss['BodyText'],fontName='Helvetica',fontSize=9,leading=12.2,textColor=colors.HexColor('#252A31'),spaceAfter=3)) ss.add(ParagraphStyle(name='SmallX',parent=ss['BodyText'],fontName='Helvetica',fontSize=8.1,leading=10.3,textColor=colors.HexColor('#252A31'),spaceAfter=2)) ss.add(ParagraphStyle(name='CardX',parent=ss['BodyText'],fontName='Helvetica-Bold',fontSize=10.2,leading=12.5,textColor=navy,spaceAfter=2)) ss.add(ParagraphStyle(name='FootX',parent=ss['BodyText'],fontName='Helvetica',fontSize=7.2,leading=9,textColor=grey,alignment=TA_CENTER)) P=lambda x,s='BodyX': Paragraph(x,ss[s]) def box(content,bg=mint,line=teal): t=Table([[content]],colWidths=[17.1*cm]); t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),bg),('BOX',(0,0),(-1,-1),.5,line),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7)])); return t def day(title, cal, meals): rows=[[P(title,'CardX'),P(cal,'SmallX')]] for k,v in meals: rows.append([P('<b>'+k+'</b>','SmallX'),P(v,'SmallX')]) t=Table(rows,colWidths=[3.25*cm,13.85*cm]) t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),mint),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B7D4CC')),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)])) return KeepTogether([t,Spacer(1,7)]) def footer(c,d): c.saveState(); c.setStrokeColor(colors.HexColor('#BCD5D0')); c.setLineWidth(.4); c.line(1.45*cm,1.35*cm,19.55*cm,1.35*cm); c.setFont('Helvetica',7.2); c.setFillColor(grey); c.drawString(1.45*cm,.88*cm,'PCOS-friendly Sri Lankan Tamil weekly meal plan | Educational nutrition guide'); c.drawRightString(19.55*cm,.88*cm,f'Page {d.page}'); c.restoreState() doc=SimpleDocTemplate(out,pagesize=A4,leftMargin=1.45*cm,rightMargin=1.45*cm,topMargin=1.25*cm,bottomMargin=1.75*cm) st=[] st += [Spacer(1,1.1*cm),P('Weekly PCOS-Friendly Meal Plan','TitleX'),P('Sri Lankan Tamil foods | About 1,450-1,600 kcal/day | Designed for gradual fat loss','SubX')] st.append(box([P('Your daily starting targets','CardX'),P('<b>Calories:</b> about 1,500 kcal/day <b>Protein:</b> 100-115 g/day <b>Fibre:</b> 25-35 g/day. This is based on the earlier plan and is a starting estimate, not a prescription. Adjustments need individual medical information, especially if you use diabetes medication, are pregnant, or have kidney disease.', 'BodyX')])) st += [Spacer(1,9),P('The approach','H1X'),P('You do not have to eliminate rice, dosa, string hoppers, pittu, or coconut foods. The focus is measured portions, protein at every meal, vegetables, fibre-rich carbohydrates, minimal sugary drinks, and practical cooking methods. Current PCOS guidance supports a flexible and culturally appropriate pattern rather than one restrictive diet.', 'BodyX'),P('Portion guide','H2X')] portion=[['Food','Usual cooked portion'],['Red/parboiled rice','3/4 cup at lunch or dinner'],['Dosa','2 medium, made with minimal oil'],['String hoppers','3-4 small'],['Pittu','1 small cylinder, about 3/4 cup'],['Whole-wheat/kurakkan roti','1 medium'],['Fish or chicken','100-130 g cooked'],['Dhal, beans, chickpeas','3/4-1 cup'],['Vegetables','At least 2 cups at lunch and dinner'],['Coconut milk/oil','Use for flavour; measure rather than pour freely']] t=Table([[P(a,'SmallX'),P(b,'SmallX')] for a,b in portion],colWidths=[5.2*cm,11.9*cm]);t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),navy),('TEXTCOLOR',(0,0),(-1,0),colors.white),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B7D4CC')),('BACKGROUND',(0,1),(-1,-1),pale),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)]));st += [t,Spacer(1,8),box(P('<b>Daily drink target:</b> water, soda water, plain tea, coffee without sugar, or buttermilk without added sugar. Reduce sugar in tea gradually to zero. Fruit juice, cordial, soft drinks, and sweetened milk tea are occasional items, not daily drinks.','BodyX'),bg=colors.HexColor('#FFF7E9'),line=gold),PageBreak()] st += [P('Days 1-3','H1X')] st.append(day('Day 1','Approx. 1,500 kcal | Approx. 100 g protein',[('Breakfast','3 small idiyappam, 2 boiled eggs, onion-tomato-lime sambol with a small amount of coconut, and unsweetened tea or coffee with low-fat milk.'),('Mid-morning','1 guava or apple plus 8-10 almonds or peanuts.'),('Lunch','3/4 cup red rice, fish curry with 120 g fish, 3/4 cup parippu, gotukola sambol, and 1-2 cups beans, cabbage, brinjal, or okra curry.'),('Snack','150 g plain curd or Greek yogurt with cinnamon.'),('Dinner','1 whole-wheat or kurakkan roti, 100 g chicken curry, and mixed vegetables.')])) st.append(day('Day 2','Approx. 1,450-1,550 kcal | Approx. 105 g protein',[('Breakfast','2 medium dosa, 1 cup vegetable sambar, and 1 boiled egg.'),('Mid-morning','1 small orange or 1 cup papaya.'),('Lunch','3/4 cup red rice, 120 g chicken curry, snake gourd/cabbage/pumpkin curry, 1/2-3/4 cup dhal, and cucumber-tomato salad.'),('Snack','1/2 cup roasted chickpeas.'),('Dinner','2-egg vegetable omelette with onion, tomato, and spinach or mukunuwenna; 1 small whole-wheat roti; salad.')])) st.append(day('Day 3','Approx. 1,500 kcal | Approx. 100 g protein',[('Breakfast','Oats upma made with 1/2 cup dry oats, onion, carrot, beans, curry leaves, and minimal oil, plus 2 eggs.'),('Mid-morning','1 pear or guava.'),('Lunch','3/4 cup red rice, tuna or salaya curry with 120 g fish, murunga leaves or mukunuwenna mallum, 3/4 cup dhal, and vegetable curry.'),('Snack','Unsweetened milk tea plus a 15 g handful of roasted peanuts.'),('Dinner','1 small pittu with 1 cup chickpea, cowpea, or green gram curry and cucumber-onion salad. Add 100-150 g plain curd if protein is low.')])) st.append(PageBreak()) st += [P('Days 4-7','H1X')] st.append(day('Day 4','Approx. 1,450-1,550 kcal | Approx. 100 g protein',[('Breakfast','2 whole-wheat or kurakkan roti, 1 cup dhal curry, 1 boiled egg, and tomato-onion sambol.'),('Mid-morning','1 cup papaya with lime.'),('Lunch','3/4 cup red rice, 120 g prawn, fish, or chicken curry, brinjal curry made with limited oil, leafy vegetables, and 1/2 cup dhal.'),('Snack','150 g curd with cinnamon and 1 teaspoon chia or ground flaxseed.'),('Dinner','2 small vegetable dosa with sambar and 75-100 g grilled fish or tofu.')])) st.append(day('Day 5','Approx. 1,500 kcal | Approx. 100 g protein',[('Breakfast','3 small string hoppers, fish sambol made with tuna or dried fish using limited coconut, and 1 boiled egg.'),('Mid-morning','1 apple or guava.'),('Lunch','3/4 cup red rice, 1 cup mixed bean curry such as cowpea/chickpeas/green gram, 1 cup dhal, large serving of vegetables, and salad.'),('Snack','Unsweetened buttermilk or yogurt drink plus 1 small handful roasted gram.'),('Dinner','100-120 g grilled or air-fried fish, stir-fried vegetables, and 1 small whole-wheat roti.')])) st.append(day('Day 6','Approx. 1,500-1,600 kcal | Approx. 100 g protein',[('Breakfast','2-egg vegetable omelette, 1 medium whole-wheat roti, and 1 small fruit.'),('Mid-morning','Unsweetened tea/coffee plus 10 almonds or peanuts.'),('Lunch','3/4 cup red rice, 100-120 g lean mutton, chicken, or fish curry, okra or beans curry, gotukola/mallum, and 1/2 cup dhal.'),('Snack','150 g plain curd or yogurt with cinnamon.'),('Dinner','Vegetable soup with chicken, fish, tofu, or lentils, plus 1 small roti.')])) st.append(day('Day 7','Approx. 1,450-1,550 kcal | Approx. 100 g protein',[('Breakfast','2 medium dosa, vegetable sambar, and 150 g plain curd or Greek yogurt.'),('Mid-morning','1 orange, guava, or small banana.'),('Lunch','3/4 cup red rice, 120 g fish or chicken curry, 3/4 cup dhal, 2 cups vegetables, and salad or mallum.'),('Snack','1/2 cup roasted chickpeas or green gram.'),('Dinner','1 kurakkan roti or 1 small pittu with tofu, egg, or chicken curry and non-starchy vegetables.')])) st.append(PageBreak()) st += [P('Food Swaps and Practical Tips','H1X')] swaps=[['Choose more often','Limit or keep smaller'],['Red rice, parboiled rice, samba rice in measured portions','Large plates of white rice'],['Dhal, cowpea, green gram, chickpeas, kollu','Sweet buns, biscuits, cakes'],['Fish, eggs, chicken, tofu, curd','Deep-fried vadai, rolls, cutlets, chips'],['Gotukola, murunga leaves, mallum, beans, brinjal, okra','Large portions of potato and cassava'],['Whole-wheat or kurakkan roti','Refined-flour roti, paratha, bakery foods'],['Papaya, guava, orange, apple, small banana','Fruit juice, cordial, sweetened drinks']] t=Table([[P(a,'SmallX'),P(b,'SmallX')] for a,b in swaps],colWidths=[8.55*cm,8.55*cm]);t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),navy),('TEXTCOLOR',(0,0),(-1,0),colors.white),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B7D4CC')),('BACKGROUND',(0,1),(0,-1),mint),('BACKGROUND',(1,1),(1,-1),pale),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)]));st += [t,Spacer(1,8),P('Helpful habits','H2X')] for text in ['Do not skip breakfast if it leads to late-evening hunger. Choose eggs, fish, curd, dhal, sambar, tofu, or chickpeas for protein.','Rice is allowed. Keep it to about 3/4 cup cooked, then fill the plate with protein and vegetables.','Coconut sambol and coconut milk can remain part of your culture. Measure the amount and avoid making every meal high in coconut milk and oil.','Plan one flexible meal a week. If you have biryani, kottu, or a festive meal, use a smaller portion, add salad/protein, and return to the usual plan at the next meal.','Track 2-4 morning weights per week and compare the weekly average. If there is no downward trend after 3 consistent weeks, review portions of rice, oil, coconut milk, snacks, and sweet drinks before reducing calories further.']: st.append(P('• '+text,'BodyX')) st += [Spacer(1,8),box(P('<b>Medical note:</b> If you take medicines that lower blood glucose, have kidney disease, are pregnant or planning pregnancy, or have a history of disordered eating, seek individual guidance from your clinician or registered dietitian before following a calorie-restricted plan.','BodyX'),bg=colors.HexColor('#FFF3F0'),line=colors.HexColor('#A45F0D')),Spacer(1,8),P('References: 2023 International Evidence-based Guideline for PCOS; Akbas et al., Nutrition interventions in women with PCOS: systematic review, PMID 42371137 (2026).','SmallX')] doc.build(st,onFirstPage=footer,onLaterPages=footer) print(out) ''') PY python "/tmp/workspace/pcos_sri_lankan_meal_plan/src/create_meal_plan.py" && python - <<'PY' from pypdf import PdfReader from pathlib import Path p=Path('/tmp/workspace/pcos_sri_lankan_meal_plan/output/PCOS_Friendly_Sri_Lankan_Tamil_Weekly_Meal_Plan.pdf') r=PdfReader(str(p)) print('PAGES',len(r.pages),'BYTES',p.stat().st_size) for i, page in enumerate(r.pages): t=page.extract_text() or '' print(i+1,len(t),t[:55].replace('\n',' | ')) PY
PCOS Friendly Sri Lankan Tamil Weekly Meal Plan
PDF Document · PDF
Create a weekly PCOS-friendly meal plan with calorie targets im sri lankan tamil but living in belarus adopt foods accroding to my culture. suggest easy foods to make give it as pdf
~/
"polycystic ovary syndrome" AND diet
Belarus supermarkets common foods buckwheat kefir tvorog cottage cheese chicken frozen vegetables
mkdir -p "/tmp/workspace/pcos_tamil_belarus_meal_plan/src" "/tmp/workspace/pcos_tamil_belarus_meal_plan/output" && python - <<'PY' from pathlib import Path p=Path('/tmp/workspace/pcos_tamil_belarus_meal_plan/src/create_plan.py') p.write_text(r'''from reportlab.lib import colors from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER from reportlab.lib.units import cm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, KeepTogether OUT='/tmp/workspace/pcos_tamil_belarus_meal_plan/output/PCOS_Friendly_Tamil_Belarus_Weekly_Meal_Plan.pdf' navy=colors.HexColor('#1B3854'); teal=colors.HexColor('#187A72'); mint=colors.HexColor('#E5F3EE'); pale=colors.HexColor('#F4F8F7'); gold=colors.HexColor('#9B5D0C'); grey=colors.HexColor('#4C5660') s=getSampleStyleSheet() s.add(ParagraphStyle(name='T',parent=s['Title'],fontName='Helvetica-Bold',fontSize=22,leading=27,textColor=navy,alignment=TA_CENTER,spaceAfter=9)) s.add(ParagraphStyle(name='ST',parent=s['Normal'],fontName='Helvetica',fontSize=10.5,leading=14,textColor=grey,alignment=TA_CENTER,spaceAfter=11)) s.add(ParagraphStyle(name='H1x',parent=s['Heading1'],fontName='Helvetica-Bold',fontSize=15.5,leading=19,textColor=navy,spaceBefore=4,spaceAfter=7)) s.add(ParagraphStyle(name='H2x',parent=s['Heading2'],fontName='Helvetica-Bold',fontSize=11.3,leading=14,textColor=teal,spaceBefore=7,spaceAfter=4)) s.add(ParagraphStyle(name='B',parent=s['BodyText'],fontName='Helvetica',fontSize=9,leading=12.2,textColor=colors.HexColor('#20272D'),spaceAfter=3)) s.add(ParagraphStyle(name='S',parent=s['BodyText'],fontName='Helvetica',fontSize=8.05,leading=10.4,textColor=colors.HexColor('#20272D'),spaceAfter=1)) s.add(ParagraphStyle(name='C',parent=s['BodyText'],fontName='Helvetica-Bold',fontSize=10.2,leading=12.5,textColor=navy,spaceAfter=2)) P=lambda x,st='B':Paragraph(x,s[st]) def box(contents,bg=mint,line=teal): t=Table([[contents]],colWidths=[17.1*cm]);t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),bg),('BOX',(0,0),(-1,-1),.5,line),('LEFTPADDING',(0,0),(-1,-1),8),('RIGHTPADDING',(0,0),(-1,-1),8),('TOPPADDING',(0,0),(-1,-1),7),('BOTTOMPADDING',(0,0),(-1,-1),7)]));return t def day(name,summary,rows): data=[[P(name,'C'),P(summary,'S')]]+[[P('<b>'+a+'</b>','S'),P(b,'S')] for a,b in rows] t=Table(data,colWidths=[3.1*cm,14*cm]);t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),mint),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B7D5CE')),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)]));return KeepTogether([t,Spacer(1,7)]) def foot(c,d): c.saveState();c.setStrokeColor(colors.HexColor('#B7D5CE'));c.setLineWidth(.4);c.line(1.45*cm,1.35*cm,19.55*cm,1.35*cm);c.setFont('Helvetica',7.2);c.setFillColor(grey);c.drawString(1.45*cm,.88*cm,'PCOS-friendly Tamil meal plan using easy foods in Belarus | Educational guide');c.drawRightString(19.55*cm,.88*cm,'Page %d'%d.page);c.restoreState() doc=SimpleDocTemplate(OUT,pagesize=A4,leftMargin=1.45*cm,rightMargin=1.45*cm,topMargin=1.25*cm,bottomMargin=1.75*cm) st=[] st += [Spacer(1,1*cm),P('PCOS-Friendly Weekly Meal Plan','T'),P('Sri Lankan Tamil flavour with easy Belarus supermarket foods | about 1,450-1,600 kcal/day','ST')] st.append(box([P('Daily target','C'),P('<b>Start around 1,500 kcal/day</b>, with <b>100-115 g protein</b> and <b>25-35 g fibre</b>. These are starting targets from your earlier plan. They are not a medical prescription. If you use glucose-lowering medicines, are pregnant/planning pregnancy, or have kidney disease, ask a clinician or dietitian for an individual plan.','B')])) st += [Spacer(1,8),P('Made for life in Belarus','H1x'),P('This plan keeps Tamil-style meals simple but relies on foods that are commonly easy to find in Belarus: eggs, chicken, canned tuna/sardines, white fish, kefir, tvorog (cottage cheese), plain yogurt, oats, buckwheat (grechka), rye or whole-grain bread, potatoes, cabbage, beets, carrots, cucumber, tomatoes, frozen vegetables, lentils, beans, and fruit. Use Tamil spices you already have or can buy from an Indian/Asian store: turmeric, chilli, cumin, mustard seeds, curry leaves, pepper, and garam masala.','B'),P('Easy cooking method','H2x')] for x in ['Batch-cook 2-3 days of dhal or lentil curry, chicken curry, and a tray of roasted vegetables. Store in containers.','Use an air fryer, oven, non-stick pan, or one-pot cooking. Measure oil: aim for about 3-4 teaspoons total per day.','For fast curry: saute onion + tomato + spices in 1 teaspoon oil, add fish/chicken/tofu and frozen vegetables, then simmer. Use a small amount of coconut milk only if you want it.','Keep ready foods at home: boiled eggs, plain kefir/yogurt, tvorog, roasted chickpeas, frozen vegetables, canned fish in water, and washed fruit.'] : st.append(P('• '+x,'B')) st += [Spacer(1,6),P('Portion guide','H2x')] port=[['Food','Simple portion'],['Cooked rice or buckwheat','3/4 cup'],['Oats','1/2 cup dry oats before cooking'],['Rye/whole-grain bread','1-2 small slices'],['Chicken, fish, tofu','100-130 g cooked'],['Eggs','2 eggs'],['Dhal, lentils, beans','3/4-1 cup'],['Tvorog, cottage cheese, Greek yogurt','150-200 g'],['Vegetables','2 cups at lunch and dinner'],['Fruit','1 medium piece or 1 cup berries']] t=Table([[P(a,'S'),P(b,'S')] for a,b in port],colWidths=[6*cm,11.1*cm]);t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),navy),('TEXTCOLOR',(0,0),(-1,0),colors.white),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B7D5CE')),('BACKGROUND',(0,1),(-1,-1),pale),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),5),('BOTTOMPADDING',(0,0),(-1,-1),5)]));st += [t,PageBreak()] st += [P('Days 1-3','H1x')] st.append(day('Day 1','Approx. 1,500 kcal | 100 g protein',[('Breakfast','Overnight oats: 1/2 cup oats + 200 ml kefir + cinnamon + 1/2 apple. Add 2 boiled eggs.'),('Snack','1 apple or pear + 10 almonds/peanuts.'),('Lunch','3/4 cup buckwheat (grechka), 120 g Tamil-spiced chicken curry, cabbage-carrot stir-fry, and 3/4 cup dhal.'),('Snack','150 g plain tvorog/cottage cheese with cucumber, pepper, and salt.'),('Dinner','Quick tuna salad: 1 can tuna in water, lettuce/cabbage, cucumber, tomato, onion, lime, and 1 slice rye bread.')])) st.append(day('Day 2','Approx. 1,450-1,550 kcal | 105 g protein',[('Breakfast','2 egg vegetable omelette with onion, tomato, spinach or frozen mixed vegetables; 1 slice rye bread; unsweetened tea/coffee.'),('Snack','1 orange or kiwi, plus 150 ml kefir.'),('Lunch','3/4 cup red/parboiled rice if available, or buckwheat; 120 g fish curry; 1 cup dhal; frozen green beans or cabbage.'),('Snack','1/2 cup roasted chickpeas or boiled green gram with chilli, lime, and onion.'),('Dinner','Lentil soup with carrot, cabbage, tomato, and spices; add 100 g cooked chicken or tofu. Have 1 small slice rye bread if needed.')])) st.append(day('Day 3','Approx. 1,500 kcal | 100 g protein',[('Breakfast','Tvorog bowl: 200 g plain tvorog/cottage cheese, cinnamon, berries or 1/2 banana, and 1 tablespoon chopped walnuts. Add 1 boiled egg.'),('Snack','1 guava, apple, or pear.'),('Lunch','Chicken and vegetable curry: 120 g chicken, frozen vegetables, tomato, turmeric, cumin, chilli, and 3/4 cup buckwheat.'),('Snack','Plain yogurt or kefir, 200 ml, with cinnamon.'),('Dinner','2 small whole-wheat chapati or 1-2 rye slices, 2-egg curry, cucumber-tomato salad, and 1/2 cup dhal.')])) st.append(PageBreak()) st += [P('Days 4-7','H1x')] st.append(day('Day 4','Approx. 1,450-1,550 kcal | 100 g protein',[('Breakfast','Savory oats: 1/2 cup oats cooked with egg, onion, carrot, peas/frozen vegetables, curry leaves if available, and spices.'),('Snack','1 apple plus 10 peanuts.'),('Lunch','3/4 cup rice or buckwheat, canned sardine/mackerel or fresh fish curry (120 g), beet-cabbage salad, and 3/4 cup dhal.'),('Snack','150 g tvorog/cottage cheese with herbs, cucumber, and black pepper.'),('Dinner','Tamil-style chicken soup with cabbage, carrot, onion, pepper, and turmeric; 1 slice rye bread.')])) st.append(day('Day 5','Approx. 1,500 kcal | 100 g protein',[('Breakfast','2 small whole-wheat dosa if you prepare batter, with sambar. Easy alternative: 2 rye toast slices with 2 eggs and tomato chutney.'),('Snack','Kefir 200 ml and 1 small fruit.'),('Lunch','Bean and chicken bowl: 3/4 cup beans or chickpeas, 100 g chicken, cucumber, tomato, cabbage, lime, chilli, and 1/2-3/4 cup buckwheat.'),('Snack','Roasted chickpeas or a boiled egg.'),('Dinner','Baked white fish, 120 g, rubbed with turmeric, pepper, and chilli; roasted broccoli/cauliflower/carrot; 1 small boiled potato.')])) st.append(day('Day 6','Approx. 1,500-1,600 kcal | 105 g protein',[('Breakfast','2 eggs scrambled with frozen vegetables; 1 small boiled potato or 1 slice rye bread; tea without sugar.'),('Snack','Plain yogurt, 150 g, with cinnamon and 1 teaspoon flaxseed.'),('Lunch','One-pot dhal chicken curry with 120 g chicken and 3/4 cup lentils, served with 3/4 cup rice or buckwheat and cabbage salad.'),('Snack','1 fruit plus 10 almonds/peanuts.'),('Dinner','Tvorog or cottage cheese 200 g with cucumber/tomato/onion salad, pepper, and 1 slice rye bread.')])) st.append(day('Day 7','Approx. 1,450-1,550 kcal | 100 g protein',[('Breakfast','Kefir-oat bowl: 1/2 cup oats, 200 ml kefir, cinnamon, 1/2 apple, plus 2 boiled eggs.'),('Snack','1 orange or apple.'),('Lunch','Tamil-spiced turkey/chicken mince, 120 g, sauteed with cabbage, carrot, peas, and tomato; 3/4 cup buckwheat or rice; side salad.'),('Snack','1/2 cup chickpeas or 150 g plain yogurt.'),('Dinner','Vegetable omelette using 2 eggs, 1/2 cup dhal, and 1 slice rye bread or 1 small chapati.')])) st.append(PageBreak()) st += [P('Shopping List and Food Swaps','H1x'),P('One simple weekly shopping list','H2x')] for x in ['<b>Protein:</b> eggs, chicken thighs/breast, white fish, canned tuna or sardines in water, tofu if available, lentils, chickpeas/beans, kefir, plain yogurt, tvorog/cottage cheese.','<b>Carbohydrates:</b> oats, buckwheat (grechka), red/parboiled rice when available, whole-wheat flour/chapati, rye or whole-grain bread, potatoes.','<b>Vegetables and fruit:</b> cabbage, beetroot, carrots, cucumber, tomato, onion, broccoli/cauliflower, frozen mixed vegetables, apples, pears, oranges, berries when affordable.','<b>Tamil flavour:</b> turmeric, cumin, coriander, chilli, black pepper, mustard seeds, curry powder, garlic, ginger, lime/lemon, small carton of coconut milk.'] : st.append(P('• '+x,'B')) st += [P('Easy swaps','H2x')] sw=[['If you cannot find...','Use instead'],['Red rice','Buckwheat, barley, oats, small portion of regular rice, or boiled potato'],['String hoppers/dosa/chapati','Oats, rye toast, whole-grain bread, or buckwheat'],['Fresh fish','Frozen white fish, canned tuna, sardines, or mackerel in water'],['Sri Lankan vegetables','Cabbage, beetroot, carrot, cauliflower, broccoli, cucumber, frozen vegetables'],['Fresh curd','Kefir, plain yogurt, skyr, tvorog, or cottage cheese'],['Coconut sambol','Onion-tomato-lime-chilli sambol, or use only 1-2 teaspoons coconut']] t=Table([[P(a,'S'),P(b,'S')] for a,b in sw],colWidths=[7.1*cm,10*cm]);t.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,0),navy),('TEXTCOLOR',(0,0),(-1,0),colors.white),('GRID',(0,0),(-1,-1),.35,colors.HexColor('#B7D5CE')),('BACKGROUND',(0,1),(0,-1),mint),('BACKGROUND',(1,1),(1,-1),pale),('VALIGN',(0,0),(-1,-1),'TOP'),('LEFTPADDING',(0,0),(-1,-1),7),('RIGHTPADDING',(0,0),(-1,-1),7),('TOPPADDING',(0,0),(-1,-1),6),('BOTTOMPADDING',(0,0),(-1,-1),6)]));st += [t,Spacer(1,7),P('Tips for PCOS and gradual weight loss','H2x')] for x in ['Keep rice and buckwheat portions measured. You do not need to avoid carbohydrates, but pair them with protein, vegetables, and fibre.','Choose plain kefir/yogurt and unsweetened tea or coffee. Avoid sweet drinks, juice, and frequent bakery sweets.','Keep coconut milk and oil measured. Tamil flavour comes mainly from spices, onion, tomato, ginger, garlic, curry leaves, and lime.','Weigh 2-4 mornings a week and use the weekly average. If there is no loss after 3 consistent weeks, check oil, bread/rice portions, snacks, and sweet drinks before lowering calories.','Seek individual advice if you become pregnant, have recurrent low blood sugar symptoms, or are taking medicines that affect glucose.'] : st.append(P('• '+x,'B')) st += [Spacer(1,6),box(P('<b>Evidence note:</b> PCOS guidance recommends lifestyle management and flexible, culturally appropriate dietary changes rather than a single restrictive diet. Recent systematic-review evidence is still evolving, so focus on a calorie level and meal pattern you can maintain. References: 2023 International Evidence-based Guideline for PCOS; Akbas et al., 2026, PMID 42371137.','B'),bg=colors.HexColor('#FFF7E9'),line=gold)] doc.build(st,onFirstPage=foot,onLaterPages=foot) print(OUT) ''') PY python "/tmp/workspace/pcos_tamil_belarus_meal_plan/src/create_plan.py" && python - <<'PY' from pypdf import PdfReader from pathlib import Path p=Path('/tmp/workspace/pcos_tamil_belarus_meal_plan/output/PCOS_Friendly_Tamil_Belarus_Weekly_Meal_Plan.pdf') r=PdfReader(str(p)) print('PAGES',len(r.pages),'BYTES',p.stat().st_size) for i,page in enumerate(r.pages): txt=page.extract_text() or '' print(i+1,len(txt),txt[:75].replace('\n',' | ')) assert len(r.pages)>=4 and 'Day 7' in ''.join(x.extract_text() or '' for x in r.pages) PY
PCOS Friendly Tamil Belarus Weekly Meal Plan
PDF Document · PDF