2015-01-19 4 views
5

पेंगो सिंटैक्स कुछ पाठ केवल मार्कअप का समर्थन करता है। जहां तक ​​मैं इसे देख सकता हूं, यह छवियों को एम्बेड करने के लिए भी विस्तारित नहीं होता है।पेंगो + काहिरा; पाठ में <img> शैली टैग को संभालने के लिए कोई मौजूदा दृष्टिकोण है?

आसपास देखकर मुझे मौजूदा कार्यान्वयन के रास्ते में बहुत कुछ नहीं मिल रहा है, लेकिन मैंने पहले पेंगो + कैरो काम किया है, इसलिए मैं इसके लिए स्पष्ट समुदाय खो सकता हूं।

जहां तक ​​मैं एक उचित दृष्टिकोण बता सकता हूं, केवल एक स्ट्रिंग का विश्लेषण करना होगा, किसी भी टैग को खींचें, कैरो छवियां बनाएं, और उसके बाद उनके चारों ओर पेंगो लेआउट को संशोधित करें।

ऐसा लगता है कि किसी ने पहले ऐसा किया होगा।

इम विशेष रूप से इन सवालों पर एक जवाब की तलाश में:

  1. Pango + पहले से ही काहिरा इस का समाधान करता है और मैं बस डॉक्स पढ़ने में भूलना है?
  2. क्या ऐसा कुछ ऐसा पहले किया गया है, और संदर्भ कहां है?
  3. क्या यह एक उचित दृष्टिकोण है, या मुझे कुछ और करने की कोशिश करनी चाहिए, और क्या?

(यह भी ध्यान रखें मैं, रूबी का उपयोग कर रहा है, ताकि मेरे विकल्प को प्रभावित कर सकता)

+0

संक्षिप्त अनुमान: आप इसमें सबसे पहले हैं।पेंगो एक पूर्ण एचटीएमएल रेंडरर नहीं है - बस एक टेक्स्ट लेआउट इंजन। लेकिन फिर भी एक अच्छी तरह से सवाल रखा - शायद किसी ने पहले वहां पीछे हटना पड़ा था। – jsbueno

उत्तर

4

मैं मार्कअप पार्सर के स्रोत के माध्यम से किया गया है और यह "आकार" के लिए अनुमति नहीं है जिम्मेदार बताते हैं (वैसे Pango लगभग ग्राफिक्स को शामिल करता है) लेकिन इसे "हाथ से" करना संभव है।

के बाद से वहाँ वेब पर बिल्कुल कोई उदाहरण कोड है, यहाँ Pango/काहिरा है/छवियाँ 101.

एक सरल डेमो के लिए, मैं एक 800x400 खिड़की बनाया है, एक GtkDrawingArea जोड़ा गया है और "आकर्षित" संकेत अप जुड़ा हुआ है। मुख्य कार्यक्रम पाश प्रवेश करने से पहले, मैं इसे निम्न कोड के साथ प्रारंभ:

PangoLayout  *Pango; 
void init_drawingArea (GtkWidget *pWidget) 
{ 
    cairo_surface_t *pImg = cairo_image_surface_create_from_png ("linux.png"); 
    PangoRectangle r = {0, 0, PANGO_SCALE * cairo_image_surface_get_width (pImg), 
           PANGO_SCALE * cairo_image_surface_get_height(pImg)}; 
    PangoContext *ctxt = gtk_widget_get_pango_context (pWidget); 
    PangoAttrList *attList = pango_attr_list_new(); 
    PangoAttribute *attr; 

    Pango = pango_layout_new (ctxt); 

    pango_cairo_context_set_shape_renderer (ctxt, render, NULL, NULL); 
    pango_layout_set_text (Pango, pszLorem, -1); 
    pango_layout_set_width(Pango, PANGO_SCALE * 800); 
    attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL); 
    attr->start_index = 0; attr->end_index = 1; 
    pango_attr_list_insert (attList, attr); 

    attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL); 
    attr->start_index = 152; attr->end_index = 153; 
    pango_attr_list_insert (attList, attr); 

    pango_layout_set_attributes (Pango, attList); 
} 

संदर्भ के आकार रेंडरर() रेंडर करने के लिए सेट कर दिया जाता है और एक PangoLayout बनाया है और आरंभ नहीं हो जाता। इसके बाद यह 2 आकार विशेषताओं को बनाता है, उपयोगकर्ता डेटा को कैरो सतह पर सेट करता है जिसे हम एक पीएनजी फ़ाइल से पॉप्युलेट करते हैं और टेक्स्ट के अक्षर 0 और 152 में गुण लागू करते हैं।

"ड्रॉ" सिग्नल प्रोसेसिंग सरल है।

gboolean onDraw (GtkWidget *pWidget, cairo_t *cr, gpointer user_data) 
{ 
    pango_cairo_show_layout (cr, Pango); 
    return 1; 
} 

और रेंडर() PangoCairoShapeRenderFunc समारोह के रूप में की जरूरत है कहा जाता है:

void render (cairo_t *cr, PangoAttrShape *pShape, gboolean do_path, gpointer data) 
{ 
    cairo_surface_t *img = (cairo_surface_t *)pShape->data; 
    double dx, dy; 

    cairo_get_current_point(cr, &dx, &dy); 
    cairo_set_source_surface(cr, img, dx, dy); 
    cairo_rectangle (cr, dx, dy, pShape->ink_rect.width/PANGO_SCALE, 
           pShape->ink_rect.height/PANGO_SCALE); 
    cairo_fill(cr); 
} 

काहिरा से वर्तमान बिंदु ले रहा है तो यह एक आयत आकर्षित करता है और छवि के साथ भरता है। This really sucks!

और यह काफी कुछ है। छवियों को बाद में विचार के रूप में जोड़ा गया था और यह दिखाता है। वे किसी भी अन्य ग्लिफ के समान नियमों के अधीन हैं, इसलिए वे सीएसएस के प्रदर्शन के बराबर तक सीमित हैं: इनलाइन।

यदि कोई इसके साथ खेलना चाहता है तो मैंने कोड को http://immortalsofar.com/PangoDemo/ पर रखा है। मैं, मैं यहाँ GtkTextBuffer की सीमाओं को पाने की कोशिश कर रहा था। मान लीजिए मुझे गहरा जाना होगा।

+0

मैंने एचटीएमएल + सीएसएस को आउटपुट करके और ब्राउज़र को हैंडल प्रतिपादन देकर अपनी समस्या को हल कर दिया। आपका उत्तर मूल रूप से समस्या की अधिक समझ दिखाता है और शायद इस समस्या को हल करने की कोशिश कर रहे किसी और के लिए एक उचित कदम पत्थर है, प्रयासों के लिए उत्साहजनक :) – Vusak

+1

बहुत बहुत धन्यवाद। जीटीके/पेंगो दुनिया वास्तव में एक प्रोग्रामर मैनुअल गायब है, विस्तार दस्तावेज खराब नहीं है, लेकिन इसे एक साथ कैसे रखा जाए ... ओह हाँ और GtkTextBuffer की सीमा के आसपास हो रही है, यह भी मुझे सही गैर लिखने के लिए मेरी खोज के दौरान लाया एचटीएमएल आधारित मार्कडाउन संपादक – Lothar

संबंधित मुद्दे

 संबंधित मुद्दे