একটি নির্দিষ্ট অক্ষরযুক্ত সমস্ত ফন্টের তালিকা পান


8

ম্যাকোস সিয়েরায়, আমি নির্দিষ্ট ইউনিকোড অক্ষরকে আবরণ করার জন্য (একটি গ্লাইফ ধারণ করে) সমস্ত ফন্টের একটি ব্যবহারযোগ্য তালিকা পেতে চাই। এটি করার কোনও উপায় কি হয় কোনও সরঞ্জামের মাধ্যমে, বা কমান্ডলাইন দ্বারা, বা কোনও প্রোগ্রাম লিখে?

এখনই, আমি এটিই করতে পারি:

  1. সিস্টেম পছন্দসমূহ → কীবোর্ড → কীবোর্ডের অধীনে, " কীবোর্ড দেখান আমি মেনু বারে কীবোর্ড এবং ইমোজি দর্শকদের দেখান" এর বিকল্প রয়েছে which এটি সময় এবং তারিখের পাশের পর্দার উপরের-ডান কোণায় একটি মেনু সক্ষম করে।
  2. সেই মেনুতে, আমি "ইমোজি এবং প্রতীকগুলি দেখান" নির্বাচন করি (যা আমার মনে হয় আগে "চরিত্র প্রদর্শক" বলা হত):

ইমোজি এবং চিহ্নগুলি দেখান

  1. এখানে আমি চরিত্রটি অনুসন্ধান করতে পারি এবং "ফন্ট ভেরিয়েশন" এর নীচে আমি প্রতিটি রেন্ডারিংয়ে ক্লিক করতে পারি এবং সংশ্লিষ্ট ফন্টটি দেখতে পারি:

হরফ বিভিন্নতা

অক্ষরটি ধারণ করে এমন যথেষ্ট পরিমাণ ফন্ট রয়েছে তবে এটি হস্তান্তরিত হয় না (যখন প্রচুর ক্লিক এবং অনুলিপি করতে হয়) যখন ফন্টগুলির তালিকা বড় হয় This আমি যা চাই তা হ'ল সরল-পাঠ্য অনুলিপি আকারে এই জাতীয় ফন্টের একটি তালিকা পাওয়া।

আমি এটা কিভাবে করবো? আমি প্রয়োজনে কোড লিখতে রাজি এবং খুশি।

উত্তর:


6

এটি এখনও ম্যাকোস দ্বারা কীভাবে করা হয় তা এখনও আমার কাছে পরিষ্কার নয় তবে এর মধ্যে আমি এখানে কী করে শেষ করেছি।

আমি যে সমাধানগুলি পেয়েছি সেগুলি নিম্নলিখিত আকারের ছিল:

  1. উপলব্ধ সমস্ত ফন্টের একটি তালিকা পান।
  2. নির্বাচিত অক্ষর রয়েছে এমন ফন্টগুলি সন্ধানের জন্য তালিকার উপরে লুপ করুন।

সমস্ত ফন্ট তালিকাভুক্ত

এই প্রশ্নের হিসাবে , দুটি পন্থা রয়েছে (প্লাস তৃতীয়টি এখানে আমি পেয়েছি ):

  1. system_profiler SPFontsDataTypeআপনি -xmlএক্সএমএলে আউটপুট পেতে যোগ করতে পারেন ,

  2. fc-listযা কোনও প্যাটার্ন গ্রহণ করতে পারে ( :এটি হ'ল খালি প্যাটার্ন যা সমস্ত ফন্টের সাথে মেলে) এবং একটি ফর্ম্যাট স্পেসিফায়ার।

  3. তাত্ক্ষণিকভাবে python-fontconfig, তারপরে import fontconfig; fontconfig.query()হরফ পাথগুলির একটি তালিকা পেতে চালান ।

দুটি পদ্ধতির তুলনা করা (আমি এটি তৃতীয়টি লক্ষ্য করার আগে এটি লিখেছিলাম) আকর্ষণীয়:

  • গতি: আমার কম্পিউটারে এবং আমার ফন্টগুলির সেটের জন্য, fc-listপ্রথমবারের মতো প্রায় 24 সেকেন্ড এবং তার পরে 0.04 সেকেন্ড সময় system_profilerলাগে , যখন ধারাবাহিকভাবে প্রতিবার প্রায় 3 সেকেন্ড সময় লাগে।

  • ব্যাপকতা: আমার বর্তমান সিস্টেমে system_profiler702 ফন্টের fc-listতালিকা রয়েছে যখন 770 তালিকাবদ্ধ করে: সমস্ত 702 প্লাস 68 আরও। একদিকে, system_profilerএটি "অফিসিয়াল" উপায় বলে মনে হচ্ছে এবং হরফ ফন্ট বইয়ের সাথে দেখা ফন্টগুলির সাথে মেলে, যা অক্ষর / প্রতীক দর্শকের (প্রশ্ন হিসাবে) "ফন্টের পরিবর্তনে" প্রদর্শিত হবে, টেক্সটএডিট-এ মেনু ইত্যাদি অন্যদিকে, কমপক্ষে কিছু ফন্ট যেটি মিস করে তা হ'ল প্রকৃতভাবে ব্যবহারযোগ্য ফন্ট। এর মধ্যে কেবলমাত্র 5 টি হরফ অন্তর্ভুক্ত নয় /Library/Fonts/{Athelas.ttc,Charter.ttc,Marion.ttc,Seravek.ttc,SuperClarendon.ttc}যার সম্পর্কে আপনি অনলাইনে কিছু বিভ্রান্তিকর পৃষ্ঠা খুঁজে পেতে পারেন (যেমন এটি এবং এটি ), /Library/Fonts/{DIN Alternate Bold.ttf,DIN Condensed Bold.ttf,Iowan Old Style.ttc}এবং 177 নোটো স্যানগুলির 57আমি আমার সিস্টেমে ফন্টগুলি ইনস্টল করেছি। উদাহরণস্বরূপ, আমি নোটো সান ব্রাহ্মী ইনস্টল করেছি তবে আমি ব্রাহ্মী চিঠিটি অনুসন্ধান করার সময় এই ফন্টটি ফন্ট বুক বা "ফন্টের ভেরিয়েশন" তে প্রদর্শিত হয় না, তবে এটি টেক্সটএডিটে ব্যবহৃত হয় (এবং আমারটিতে প্রদর্শিত হয়) ব্রাউজার)। এই অদ্ভুততার কারণ যাই হোক না কেন, আমি খুশি যে আমি পুরো তালিকাটি পেয়ে যেতে পারি fc-list

  • সহজলভ্যতা: উভয় পদ্ধতির সাথে আউটপুট পার্সিংয়ের সামান্য বিস্তৃত প্রয়োজন। এর সাথে fc-listআমি ফর্ম্যাটটি নির্দিষ্ট করতে পারি (উদাহরণস্বরূপ fc-list --format="%{family}\n%{file}\n%{lang}\n\n"তবে ক্ষেত্রগুলির নামের জন্য আমি কোনও রেফারেন্স পাইনি!); এর সাহায্যে system_profilerআমি এক্সপিএমএলটির জন্য কেবল গ্রেপ করতে পারি Location:বা এক্সএমএল আউটপুট করতে পারি এবং এক্সএমএলকে পার্স করতে পারি ( xML.etree.ElementTree এর সাথে উদাহরণস্বরূপ , plistlib সহ )।

এই ফন্টটি এই চরিত্রটি কভার করে?

তবে আমরা হরফগুলির তালিকা পাই, তারপরে আমাদের পরীক্ষা করতে হবে একটি নির্দিষ্ট ফন্টের মধ্যে কোনও অক্ষর আবৃত আছে কিনা (নাম বা পথ দিয়ে দেওয়া)। আবার, যেভাবে আমি খুঁজে পেয়েছি:

  • ফ্রিটাইপ বাইন্ডিংগুলির মধ্যে একটি ব্যবহার করুন । পাইথনের জন্য, ফ্রিটাইপ- পাই রয়েছে তবে কীভাবে এটি ব্যবহার করব তা কয়েক মিনিটের মধ্যে আমি বুঝতে পারি না।

  • Ttx / fonttools দিয়ে ফন্টের cmap টেবিলটি ফেলে দিন , তারপরে টেবিলের উপরে লুপ করুন। এটি অবশ্যই করা সম্ভব এবং আমি এমন ব্যবহার করেছি অনেক বার ডাম্পিং (এক মাত্র পারেন ttx foo.ttfপেতে foo.ttxXML ফাইল এমনকি মানুষের পাঠযোগ্য), কিন্তু এই ব্যবহার-ক্ষেত্রে জন্য (সমস্ত ফন্ট অনুসন্ধানের), এটা ভাল নয় যেমন লাগে প্রতি ফন্টে সেকেন্ড

  • এর জন্য লেখা একটি লাইব্রেরি থেকে cmap টেবিলটি দেখুন: use Font::TTF::Fontপার্লে , from fontTools.ttLib import TTFontপাইথনের - এটি এমন হবে:

    def has_char(font_path, c):
        """Does font at `font_path` contain the character `c`?"""
        from fontTools.ttLib import TTFont
        from fontTools.unicode import Unicode
        try:
            font = TTFont(font_path)
            for table in font['cmap'].tables:
                for char_code, glyph_name in table.cmap.items():
                    if char_code == ord(c):
                        font.close()
                        return True
        except Exception as e:
            print('Error while looking at font %s: %s' % (font_path, e))
            pass
        return False
    

    দুর্ভাগ্যক্রমে এটি ব্যবহার করতে অনেক বেশি ফন্টে ব্যর্থ।

  • আপনি যদি পাইথন-ফন্টকনফিগ সমাধানটি ব্যবহার করেন তবে এর has_charমতো ব্যবহার রয়েছে:font = fontconfig.FcFont(path); return font.has_char(c)

সারাংশ

আমি এখান থেকে সমাধানটি ব্যবহার করে শেষ করেছি, যা এটিকে ন্যূনতম রাখার জন্য আমি হালকাভাবে আবার লিখেছি:

#!/usr/bin/env python

def find_fonts(c):
    """Finds fonts containing  the (Unicode) character c."""
    import fontconfig
    fonts = fontconfig.query()
    for path in sorted(fonts):
        font = fontconfig.FcFont(path)
        if font.has_char(c):
            yield path

if __name__ == '__main__':
    import sys
    search = sys.argv[1]
    char = search.decode('utf-8') if isinstance(search, bytes) else search
    for path in find_fonts(char):
        print(path)

ব্যবহারের উদাহরণ:

% python3 find_fonts.py 'ಠ'
/Library/Fonts/Arial Unicode.ttf
/Library/Fonts/Kannada MN.ttc
/Library/Fonts/Kannada MN.ttc
/Library/Fonts/Kannada Sangam MN.ttc
/Library/Fonts/Kannada Sangam MN.ttc
/System/Library/Fonts/LastResort.ttf
/Users/shreevatsa/Library/Fonts/Kedage-b.TTF
/Users/shreevatsa/Library/Fonts/Kedage-i.TTF
/Users/shreevatsa/Library/Fonts/Kedage-n.TTF
/Users/shreevatsa/Library/Fonts/Kedage-t.TTF
/Users/shreevatsa/Library/Fonts/NotoSansKannada-Bold.ttf
/Users/shreevatsa/Library/Fonts/NotoSansKannada-Regular.ttf
/Users/shreevatsa/Library/Fonts/NotoSansKannadaUI-Bold.ttf
/Users/shreevatsa/Library/Fonts/NotoSansKannadaUI-Regular.ttf
/Users/shreevatsa/Library/Fonts/NotoSerifKannada-Bold.ttf
/Users/shreevatsa/Library/Fonts/NotoSerifKannada-Regular.ttf
/Users/shreevatsa/Library/Fonts/akshar.ttf

(উভয় সঙ্গে কাজ করে python3এবং python2, যেটা pythonআপনার আছে। আমার কম্পিউটারে 29 সম্পর্কে সেকেন্ড সময় লাগে, হরফ আমি ইনস্টল করা আছে সেট এর জন্য।)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.