Chandra

 view release on metacpan or  search on metacpan

xs/element.xs  view on Meta::CPAN

                                : &PL_sv_undef;
                            PUTBACK;
                            FREETMPS;
                            LEAVE;
                        } else {
                            child = newSVsv(*csvp);
                        }
                        av_push(children, child);
                    }
                }
            }
        }
    }

    RETVAL = self_rv;
}
OUTPUT:
    RETVAL

SV *
add_child(self, child)
    SV *self
    SV *child
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **ch_svp = hv_fetchs(hv, "children", 0);
    AV *children = (AV *)SvRV(*ch_svp);

    if (SvROK(child) && SvTYPE(SvRV(child)) == SVt_PVHV &&
        !sv_isobject(child)) {
        /* Hashref → create new Element */
        int count;
        SV *new_child;
        dSP;
        ENTER;
        SAVETMPS;
        PUSHMARK(SP);
        XPUSHs(sv_2mortal(newSVpvs("Chandra::Element")));
        XPUSHs(child);
        PUTBACK;
        count = call_method("new", G_SCALAR);
        SPAGAIN;
        new_child = (count > 0) ? SvREFCNT_inc(POPs) : &PL_sv_undef;
        PUTBACK;
        FREETMPS;
        LEAVE;
        av_push(children, new_child);
        RETVAL = SvREFCNT_inc(new_child);
    } else {
        av_push(children, SvREFCNT_inc(child));
        RETVAL = SvREFCNT_inc(child);
    }
}
OUTPUT:
    RETVAL

void
children(self)
    SV *self
PPCODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **ch_svp = hv_fetchs(hv, "children", 0);
    if (ch_svp && *ch_svp && SvROK(*ch_svp) &&
        SvTYPE(SvRV(*ch_svp)) == SVt_PVAV) {
        AV *children = (AV *)SvRV(*ch_svp);
        SSize_t i, len = av_len(children) + 1;
        if (GIMME_V == G_SCALAR) {
            XPUSHs(sv_2mortal(newSViv(len)));
        } else {
            EXTEND(SP, len);
            for (i = 0; i < len; i++) {
                SV **csvp = av_fetch(children, i, 0);
                if (csvp && *csvp)
                    PUSHs(*csvp);
            }
        }
    } else if (GIMME_V == G_SCALAR) {
        XPUSHs(sv_2mortal(newSViv(0)));
    }
}

SV *
tag(self)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **svp = hv_fetchs(hv, "tag", 0);
    RETVAL = (svp && *svp) ? SvREFCNT_inc(*svp) : newSVpvs("div");
}
OUTPUT:
    RETVAL

SV *
id(self, ...)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **svp;
    if (items > 1 && SvOK(ST(1))) {
        (void)hv_stores(hv, "id", newSVsv(ST(1)));
    }
    svp = hv_fetchs(hv, "id", 0);
    RETVAL = (svp && *svp) ? SvREFCNT_inc(*svp) : newSV(0);
}
OUTPUT:
    RETVAL

SV *
class(self, ...)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **svp;
    if (items > 1 && SvOK(ST(1))) {
        (void)hv_stores(hv, "class", newSVsv(ST(1)));
    }

xs/element.xs  view on Meta::CPAN

    if (items > 1 && SvOK(ST(1))) {
        (void)hv_stores(hv, "style", newSVsv(ST(1)));
    }
    svp = hv_fetchs(hv, "style", 0);
    RETVAL = (svp && *svp) ? SvREFCNT_inc(*svp) : newSV(0);
}
OUTPUT:
    RETVAL

SV *
attribute(self, key, ...)
    SV *self
    SV *key
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **attrs_svp = hv_fetchs(hv, "attributes", 0);
    HV *attrs = (HV *)SvRV(*attrs_svp);
    STRLEN klen;
    const char *kstr = SvPV(key, klen);
    SV **vsvp;

    if (items > 2 && SvOK(ST(2))) {
        (void)hv_store(attrs, kstr, (I32)klen, newSVsv(ST(2)), 0);
    }

    vsvp = hv_fetch(attrs, kstr, (I32)klen, 0);
    RETVAL = (vsvp && *vsvp) ? SvREFCNT_inc(*vsvp) : newSV(0);
}
OUTPUT:
    RETVAL

SV *
get_element_by_id(self, target_id)
    SV *self
    const char *target_id
CODE:
{
    SV *found = _elem_find_by_id(aTHX_ self, target_id);
    RETVAL = found ? SvREFCNT_inc(found) : &PL_sv_undef;
}
OUTPUT:
    RETVAL

SV *
get_element_by_tag(self, target_tag)
    SV *self
    const char *target_tag
CODE:
{
    SV *found = _elem_find_by_tag(aTHX_ self, target_tag);
    RETVAL = found ? SvREFCNT_inc(found) : &PL_sv_undef;
}
OUTPUT:
    RETVAL

void
get_elements_by_class(self, target_class)
    SV *self
    const char *target_class
PPCODE:
{
    AV *results = newAV();
    STRLEN tlen = strlen(target_class);
    SSize_t i, len;

    _elem_collect_by_class(aTHX_ self, target_class, tlen, results);

    len = av_len(results) + 1;
    EXTEND(SP, len);
    for (i = 0; i < len; i++) {
        SV **svp = av_fetch(results, i, 0);
        if (svp && *svp)
            PUSHs(*svp);
    }
    SvREFCNT_dec((SV *)results);
}

SV *
render(self)
    SV *self
CODE:
    RETVAL = _elem_render(aTHX_ self);
OUTPUT:
    RETVAL

SV *
handlers(...)
CODE:
{
    HV *h;
    PERL_UNUSED_VAR(items);
    h = _elem_get_handlers(aTHX);
    RETVAL = newRV_inc((SV *)h);
}
OUTPUT:
    RETVAL

SV *
get_handler(self_or_class, hid)
    SV *self_or_class
    SV *hid
CODE:
{
    HV *h;
    STRLEN hlen;
    const char *hstr;
    SV **svp;

    PERL_UNUSED_VAR(self_or_class);
    h = _elem_get_handlers(aTHX);
    hstr = SvPV(hid, hlen);
    svp = hv_fetch(h, hstr, (I32)hlen, 0);
    if (svp && *svp) {
        RETVAL = SvREFCNT_inc(*svp);
    } else {
        RETVAL = &PL_sv_undef;
    }
}
OUTPUT:
    RETVAL



( run in 1.026 second using v1.01-cache-2.11-cpan-71847e10f99 )