برنامه نویسی

خرد کردن خط فرمان با Amazon Q: ساخت یک مبدل متوسط ​​به dev.to

این یک ارسال برای توسعه دهنده Amazon Q “Quack the Code” چالش: خرد کردن خط فرمان است

آنچه من ساختم

من ساختم medium2dev، یک ابزار خط فرمان که به طور خودکار پست های وبلاگ متوسط ​​را به فرمت Markdown سازگار با Dev.to تبدیل می کند و به صورت اختیاری آنها را مستقیماً به عنوان پیش نویس پست ها منتشر می کند. این ابزار برای نویسندگان فنی که در چندین سیستم عامل منتشر می کنند ، یک مشکل مشترک را حل می کند: حفظ قالب بندی مداوم در سیستم عامل های مختلف انتشار.

ابزار حفظ می کند:

  • عنوان مقاله و عناوین
  • قالب بندی متن (جسورانه ، ایتالیایی و غیره)
  • بلوک های کد با برجسته سازی نحو مناسب
  • تصاویر درون خطی (به طور خودکار بارگیری و ارجاع شده)
  • لیست ها و سایر عناصر ساختاری
  • Frontmatter مناسب dev.to را تولید می کند

نسخه آزمایشی

در اینجا نمایشی از تبدیل یک مقاله متوسط ​​به قالب dev.to آورده شده است:

# Basic conversion
python3 medium2dev.py https://medium.com/aws-in-plain-english/aws-resource-tag-compliance-with-automation-64ae16e42a11

# Publish directly to DEV.to as a draft
python3 medium2dev.py https://medium.com/aws-in-plain-english/aws-resource-tag-compliance-with-automation-64ae16e42a11 --publish --api-key YOUR_DEVTO_API_KEY

# Or use environment variable for API key
export DEVTO_API_KEY=your_api_key
python3 medium2dev.py https://medium.com/aws-in-plain-english/aws-resource-tag-compliance-with-automation-64ae16e42a11 --publish
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

خروجی:

2025-05-03 15:07:49,696 - medium2dev - INFO - Fetching article from https://medium.com/aws-in-plain-english/aws-resource-tag-compliance-with-automation-64ae16e42a11
2025-05-03 15:07:51,100 - medium2dev - INFO - Original Medium content word count: 463
2025-05-03 15:07:51,100 - medium2dev - INFO - Downloaded 0 content images
2025-05-03 15:07:51,116 - medium2dev - INFO - Conversion complete! Output saved to /Users/vivekvelso/Documents/opensource/medium2dev/new/aws-resource-tag-compliance-with-automation-64ae16e42a11.md

Conversion successful! Output saved to: /Users/vivekvelso/Documents/opensource/medium2dev/aws-resource-tag-compliance-with-automation-64ae16e42a11.md
Images saved to: /Users/vivekvelso/Documents/opensource/medium2dev/images
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هنگام انتشار به dev.to ، همچنین یک مقایسه تعداد کلمات را نشان می دهد:

Successfully published as draft to DEV.to!

Word Count Comparison:
| Platform | Word Count |
|----------|------------|
| Medium   | 463        |
| DEV.to   | 458        |
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ابزار با موفقیت:

  1. مقاله متوسط ​​را واگذار می کند
  2. ابرداده نویسنده و عناصر UI غیر ضروری را پاک می کند
  3. عناصر UI خاص متوسط ​​مانند “گوش دادن” ، “به اشتراک گذاری” و غیره را حذف می کند.
  4. محتوا را به Markdown تبدیل می کند
  5. یک پرونده markdown به درستی فرمت شده ایجاد می کند
  6. (به صورت اختیاری) مقاله را به عنوان پیش نویس dev.to منتشر می کند
  7. مقایسه تعداد کلمات بین سیستم عامل ها را فراهم می کند

مخزن کد

کد در GitHub موجود است: Medium2Dev

پرونده های کلیدی:

  • medium2dev.py: فیلمنامه اصلی پایتون
  • requirements.txt: وابستگی ها
  • README.md: مستندات

چگونه من از توسعه دهنده Amazon Q استفاده کردم

من از Amazon Q Developer CLI برای ایجاد کل این پروژه از ابتدا استفاده کردم. در اینجا نحوه گفتگو آمده است:

اعلان اولیه

من با توضیح ایده خود در آمازون س:

I am submitting an idea for this challenge. Crushing the Command Line
Build an automation with Amazon Q Developer CLI that makes your work easier, faster, or better.

My idea is to create a tool to convert medium posts to dev.to markdown posts preserving the title heading, formatting and inline images the same way. Please give exact steps and prompts by referring to collection from promptz tool if you find anything to enhance the solution, and also what prompts were given to automate the whole command line solution to q and how q responded, log all that in this blog post for submission, along with the code that is generated, then test it on the url https://medium.com/aws-in-plain-english/aws-resource-tag-compliance-with-automation-64ae16e42a11 and verify the markdown generated, and confirm that all text, image, formatting is same.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

رویکرد آمازون Q

Amazon Q برای اولین بار در مجموعه Promptz.dev که ممکن است به این کار کمک کند ، اقدامات مربوطه را بررسی کرد:



["CLI", "Markdown"]


حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

Amazon Q پس از پیدا کردن هیچ یک از اقدامات خاص برای تبدیل Markdown ، اقدام به طراحی راه حل از ابتدا کرد. این یک اسکریپت پایتون ایجاد کرد که:

  1. مقالات متوسط ​​را با استفاده از خراش وب واگذار کنید
  2. در حین حفظ ساختار محتوا را استخراج کنید
  3. تصاویر را بارگیری و به درستی ارجاع دهید
  4. HTML را به قالب Markdown تبدیل کنید
  5. Frontmatter سازگار Dev.to را ایجاد کنید

راه حل

Amazon Q کامل را تولید کرد medium2dev.py اسکریپت با این مؤلفه های کلیدی:

class Medium2Dev:
    def __init__(self, url, output_dir=None, image_dir=None, api_key=None):
        """Initialize the converter with the Medium post URL."""
        self.url = url
        self.output_dir = output_dir or os.getcwd()
        self.image_dir = image_dir or os.path.join(self.output_dir, 'images')
        self.api_key = api_key
        # ...

    def fetch_article(self):
        """Fetch the Medium article content."""
        # ...

    def extract_content(self, html_content):
        """Extract the article content from the HTML."""
        # ...

    def download_images(self, content):
        """Download images and update their references in the content."""
        # ...

    def convert_to_markdown(self, content):
        """Convert HTML content to Markdown format suitable for DEV.to."""
        # ...

    def generate_frontmatter(self, title, date):
        """Generate DEV.to frontmatter."""
        # ...

    def convert(self):
        """Convert the Medium post to DEV.to markdown format."""
        # ...

    def publish_to_devto(self, title, markdown_content):
        """Publish the converted markdown as a draft post to DEV.to."""
        # ...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

Amazon Q همچنین پرونده های پشتیبانی لازم را ایجاد کرد:

  • requirements.txt با وابستگی های مورد نیاز
  • README.md با دستورالعمل استفاده

بهبود راه حل

پس از آزمایش اولیه ، من متوجه برخی از مسائل با Markdown تولید شده شدم:

  1. ابرداده نویسنده هنوز گنجانده شده بود
  2. اسکریپت به درستی تصاویر محتوا را استخراج نمی کرد
  3. عناصر UI خاص مانند “گوش دادن” ، “اشتراک” و غیره در خروجی ظاهر می شدند

من از آمازون Q خواستم تا راه حل را بهبود بخشد ، و این چندین پیشرفت کلیدی را ایجاد کرد:

استخراج بهتر محتوای: تجزیه و تحلیل HTML را بهبود بخشید تا فقط روی محتوای مقاله واقعی متمرکز شود

   # Create a new div to hold only the content we want
   content_div = soup.new_tag('div')

   # Find all the content sections (paragraphs, headings, code blocks, images)
   content_elements = article_tag.find_all(['p', 'h2', 'h3', 'h4', 'pre', 'figure', 'img', 'blockquote', 'ul', 'ol'])
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

حذف ابرداده: فیلتر قوی تر برای از بین بردن خطوط اصلی نویسنده ، بست و سایر عناصر UI متوسط ​​متوسط ​​اضافه شده است

   # Skip elements with author info, claps, etc.
   if element.find(string=re.compile(r'clap|follow|min read|sign up|bookmark|Listen|Share')):
       continue

   # Skip elements that just contain "--" or numbers at the beginning
   if element.name == 'p' and re.match(r'^\s*--\s*$|^\s*\d+\s*$', element.text.strip()):
       continue
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

دست زدن به تصویر پیشرفته: روند استخراج و بارگیری تصویر را بهبود بخشید

   # For Medium images, try to get the full-size version
   if 'miro.medium.com' in img_url:
       # Remove size constraints from URL to get original image
       img_url = re.sub(r'/resize:[^/]+/', '/', img_url)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پاکسازی بهتر علامت گذاری: برای تمیز کردن عناصر متوسط ​​اضافه شده پس از پردازش اضافه شد

   # Remove Medium-specific footer text and links
   markdown = re.sub(r'\n\s*\[.*?\]\(https?://medium\.com/.*?\)\s*\n', '\n\n', markdown)

   # Remove clap indicators and other Medium UI elements
   markdown = re.sub(r'\d+\s*claps?', '', markdown)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پیشرفت های CLI: اضافه شده گزینه های خط فرمان برای انتشار مستقیم به dev.to

   parser.add_argument('-p', '--publish', action='store_true', help='Publish to DEV.to as draft')
   parser.add_argument('-k', '--api-key', help='DEV.to API key (if not set via DEVTO_API_KEY environment variable)')
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ادغام dev.to: قابلیت اضافه شده برای انتشار مستقیم به dev.to به عنوان پیش نویس پست

   def publish_to_devto(self, title, markdown_content):
       """Publish the converted markdown as a draft post to DEV.to."""
       if not self.api_key:
           logger.error("No DEV.to API key provided. Skipping publish.")
           return False

       logger.info("Publishing to DEV.to as draft...")

       api_url = "https://dev.to/api/articles"
       headers = {
           "api-key": self.api_key,
           "Content-Type": "application/json"
       }

       # Prepare the article data
       article_data = {
           "article": {
               "title": title,
               "body_markdown": markdown_content,
               "published": False  # Set as draft
           }
       }

       try:
           response = requests.post(api_url, headers=headers, json=article_data)
           response.raise_for_status()
           article_data = response.json()
           logger.info(f"Successfully published draft to DEV.to!")
           return True
       except requests.RequestException as e:
           logger.error(f"Error publishing to DEV.to: {e}")
           return False
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مقایسه تعداد کلمات: قابلیت اضافه شده برای مقایسه تعداد کلمات بین نسخه های متوسط ​​و dev.to

   # Calculate the word count of the original content
   content_text = ' '.join([element.get_text() for element in content_div.contents])
   self.medium_word_count = len(content_text.split())
   logger.info(f"Original Medium content word count: {self.medium_word_count}")

   # Calculate DEV.to word count
   devto_word_count = len(re.sub(r'---.*?---\n', '', markdown_content, flags=re.DOTALL).split())

   # Display comparison when publishing
   print("\nWord Count Comparison:")
   print("| Platform | Word Count |")
   print("|----------|------------|")
   print(f"| Medium   | {converter.medium_word_count} |")
   print(f"| DEV.to   | {devto_word_count} |")
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

آزمایش راه حل

من راه حل بهبود یافته را با URL مقاله متوسط ​​ارائه کردم:

python3 medium2dev.py https://medium.com/aws-in-plain-english/aws-resource-tag-compliance-with-automation-64ae16e42a11
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

فیلمنامه با موفقیت:

  1. محتوای مقاله را بارگیری کرد
  2. ابرداده نویسنده و عناصر UI متوسط ​​را حذف کرد
  3. محتوای HTML را برای تمیز کردن Markdown تبدیل کرد
  4. یک فایل markdown به درستی فرمت شده با برچسب های معتبر ایجاد کرد

من همچنین با یک فرمت URL متفاوت آزمایش کردم تا اطمینان حاصل شود که راه حل استحکام دارد:

python3 medium2dev.py https://medium.com/@vivek-aws/aws-resource-tag-compliance-with-automation-64ae16e42a11
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این ابزار کاملاً با هر دو قالب URL کار کرده و انعطاف پذیری آن را نشان می دهد.

چالش ها و راه حل ها

در طول توسعه ، Amazon Q به چالش های مختلفی پرداخت:

محتوای پویا متوسط: از هدرهای مناسب استفاده شده و پارامترهای درخواست شده برای اطمینان از بارگیری کامل محتوا

   headers = {
       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
       # Additional headers...
   }
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

استخراج محتوا: یک رویکرد قوی برای استخراج فقط محتوای مربوطه ایجاد کرد

   # Try multiple approaches to find the content
   article_tag = soup.find('article')
   if not article_tag:
       article_tag = soup.select_one('div.section-content')
   if not article_tag:
       article_tag = soup.find('div', class_='postArticle-content')
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

حذف ابرداده: فیلترهای جامع ایجاد شده برای حذف عناصر UI خاص متوسط

   # Remove Medium-specific UI elements and metadata
   for element in content.select('.postMetaLockup, .graf--pullquote, .section-divider'):
       if element:
           element.decompose()
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ادغام dev.to: پشتیبانی از انتشار مستقیم به Dev.to با استفاده از API خود اضافه شده است

   # Get API key from environment or command line
   api_key = args.api_key or os.environ.get('DEVTO_API_KEY')
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

dev.to قالب برچسب: فرمت برچسب ثابت برای مطابقت با الزامات dev.to

   # Convert "aws in plain english" to "awsinplainenglish"
   potential_tag = re.sub(r'[^a-zA-Z0-9]', '', potential_tag)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مقایسه تعداد کلمات: عملکردی برای مقایسه تعداد کلمات بین سیستم عامل ها بدون تغییر پرونده خروجی اضافه شده است

   # Calculate word counts and display comparison
   medium_word_count = converter.medium_word_count
   devto_word_count = len(re.sub(r'---.*?---\n', '', markdown_content, flags=re.DOTALL).split())
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پایان

با استفاده از Amazon Q Developer CLI ، من توانستم به سرعت یک ابزار کاربردی ایجاد کنم که یک مشکل واقعی را برای نویسندگان فنی حل کند. کل فرآیند از ایده تا اجرای فقط چند دقیقه طول کشید و نشان داد که چگونه Amazon Q می تواند گردش کار توسعه را تسریع کند.

این ابزار باعث صرفه جویی در وقت قابل توجهی برای نویسندگانی که در چندین سیستم عامل منتشر می کنند ، نیاز به اصلاح دستی و اطمینان از ارائه مداوم در سیستم عامل ها را از بین می برد. افزودن انتشار مستقیم به dev.to باعث می شود گردش کار حتی ساده تر شود و به نویسندگان این امکان را می دهد تا از مقاله متوسط ​​به dev.to با یک دستور واحد بروند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا