Cap a una lliure distribució de converses

I would like to make constructive criticism to the ones that like bloggers here in planet.communia.org, have decided to have a space to enunciate, to talk and to create knowledge. One of the reasons is to present alternatives to the gray landscape that comes with concentration and capitalization of vectors where information flows. I will talk about common infrastructure and   silos ,an analogy that I think is so accurate when it comes to structures in information systems that are poorly related to other structures, so they prevent the free exchange of data.

 

Any network consists of nodes and links between them. Whether removed content creators (nodes) as infrastructure and communication technologies (links) network ceases to exist. In this post I will not discuss how to regulate the links between content creators and consumers on the basis of the conflict, there is a lot writtings about this topic...

When you create content, there comes a time when you should draw a strategy to generate network while blocking certain network topologies which prevent to express yourself with maximum autonomy and personality. We heard by every way imaginable that we should try to move towards free distribution of content,   Paul Baran graphics on decentralization and distribution networks to make them resilient are common in   reports and studies .But to do so, in addition to generating content (become active nodes), we should think about the relationship and how to care for the link between us and our conversations, especially when there is a tendency to abuse it by successive reforms of intellectual property .

Analyzing the possibilities that are currently creating content nodes to become active and productive, we can put them on a scale according to the degree of restriction, brokerage, and control (monitoring). Within this division if on one side there are the   silos , websites that offer content publishing often owned by large companies (twitter, facebook, gplus ...), on the other there is the   blogosphere .According to the proposed features by   https://indiewebcamp.com/silos , we oppose them:

  • Requirement to create an identity in situ Vs. Flexible identity determined by the user.
  • Isolated communication: between the users of this site Vs. Communication with any contact of any network.
  • Creation of content of a specific type. Vs. Creation of any content (text, hypertext, images, video, audio).
  • Restriction when indexing whole content Vs. Indexing possibility.
  • Accept terms of service and terms of use Vs. Create your own terms.
  • Obligation to transfer part of the authorship or license of any created content Vs. Flexible autorship and licensing (it's up to you).
  • Restricts your ability to import/export your content, or content about your content (e.g. comments, tags) Vs. Possibility to export according to the possibilities and technical skills
  • Temporal context creation, transforming conversations to ranking in short time (for example, if you want to use Twitter as a channel for feedback, you will find that the talk lasts one week ) Vs.Generation of permanent context (limited to the existence of the blog).
  • Scalability by corporation decisions Vs. Scalability depending on technical skills and framework.

While to get some features you are dependent on the technical skills and infrastructure (often requires paying a hosting), you can enjoy much autonomy if you get a blog with a provider like wordpress.com, so on the degree of autonomy remains significant as compared to the all-in-one solutions as facebook.

So, I think we can accept that nowadays the more independent system to create content is still the blog. However there are some components of user experience in which the blog hasn't continued to innovate while silos do : Likes, shares, retweet ...Actions that have enabled new content streams and new relationships. Although they can be criticized of aggregation behaviors tend that decrease interaction, we must admit that there has been innovation and in many cases the users themselves(without previous strategy by provider) are the ones that have implemented improvements. An example of this is   semantic topics of debate via twitter hashtag .Interestingly in autonomous areas as blogosphere networks, the degree of improvement by content creators, is not frequent, at least much less valued and displayed.

As regards the social interaction of blogs it remains in 1) comments and in 2) mentions. Comments are reactions flow on a blog entry(the wall). I think Mentions are one of the cornerstones; They are a warning when someone links to your blog, and currently the most common way is to do it through   pingbacks (I am ignoring trackbacks, as they are too weak against spam): When someone mentions my text, whether to recognize, to reflect, or for whatever reason, I can accept the conversation and publish on my entry that the text has been referred in a remote blog entry.It is the social part of blogging that allows the federation of content and the articulation of agreements peer to peer (I am expresing myself from my space, who mentioned me acts in the same condition). So conversation is on equal terms. But surprisingly, this little gem of interaction is often ignored and even disabled, it is an old technology that is not understood visually and does not provide anything. For example, in Radical Community Manager workshops, I saw that in the training about content creation tools, the pingbacks were deactivated by default without debate. I think it is a strategic mistake, since not giving the possibility of interaction and conversation follows the logic of creating new parliaments, where who is speaking doesn't listen to the listener.

What is true is that it is an old technology that hasn't been improved since the technology has not changed too much since 2002 .This becomes critical because in the case of blogs the link between nodes is sufficient but inefficient and could be richer. I'm not talking about putting social media icons or SEO campaigns. I mean how to deepen the essence of the blog, allowing the network to continue talking, improving the context and details of the conversation. As I said before, if we don't take care of the links among us, all nodes suffers. In this sense a new simple and efficient mechanism appears to solve some shortcomings: the   webmentions .This protocol tries to make simple and standard communication in the blogosphere because it uses   Standard HTTP instead of  pingbacks' xmlrpc .Also it proposes the implementation of "social" actions categorizing mentions as Likes, Repost, Reply , although not enough, this implementation draws a more interactive blogging and opens the door to a rich conversation.

Going further, I think that in front of the idiosyncrasies and specificity of each silo or restrictive "social network" when we talk about indexing content, it is necessary to seek out improvements in the federation of content and conversations, that would mean a substantial added value of blogging systems. And what a better way than to follow the distributed way that allows http protocol? Going even further we can bet the semantization via RDF or JSON-LD to deal with the APIs that are used in major hubs, that usually reduces content to an artificial scarcity. Why semantics? because when you see the mention that you made me, it should be easy to discover the author, the content of entry, date, comments ...

To do this, it would mean that it is important that blogs open a section explaining what possibilities of interaction are offered. A section telling that:

  • This blog publishes content enriched through RSS protocols in:______
  • This blog publishes resources described via RDFa 1.1 in each node.
  • This blog allows webmentions, comments and pingbacks.

We would love to articulate conversations so comfortable and so the idea is to implement properly pingbacks and webmentions.

The way it works is that when I publish a blog entry, and someone mentions it, the references system goes to the place where mention comes and seeks for the context of the reference. With pingbacks is simply a statement of the type:

... On the way described method is a formula of ...

It provides little or nothing.

The problem is how the reources are described: we need a more careful context. It would be interesting to get the author, date, blog, tags, pictures ... But mainly, define the description of the entry and the body of the article, in order to allocate scrapping resources to look bold phrases instead of dealing with silos' widgets. The degree of permeability of your website depends not only on the fact that it has a pleasing design and it is optimized for readability, it's required to enrich the link and make it stronger, especially now that some laws tends to criminalize it. We need that each blog understands with each others, and in the same way as a link leads to another, we are at one step to get the clicked link to perform an action (to be known if it is a response, if it is of type favorite or like, or if it is wanted to share the content you mention it ...).

If some proposal was described in 2010 at http://www.w3.org/2010/02/rdfa/sources/rdfa-primer/alice-example.html   Now it seems that schema.org is the leading voice when it comes to description of resources, but regardless of this, we still have foaf, sioc ...If not enough with them you can always create specific ontologies to your community, extending some existing ones. It may seem complicated, but for simple content such as blog entries it should not be, especifically when we have written examples like http://www.w3.org/TR/html-rdfa/#bib-XHTML-RDFA .We have both   webmentions plugins as rdf plugins for blog services (there is a version for drupal to github, which I am bringing them hours ), there are also services which capture mentions of our blogs to prevent and break the commons enclosures .

But there are also dangers. It is paradoxical that some value on the free distribution of content methods, such as RDF, gets distorted when appears the word SEO. Then useful federation could become just marketing to bring up your post on top of the seek results. We must highlight the tools and perceive them beyond allowing Google to fix the shop window that   each blog owns .So SEO is an additional benefit, not the main purpose, and we have to take care in not giving or sublicense our own resources and responsabilities. For example: Google will put a picture on your search index with your blog but to get that "rich snippet"   you must transfer your identity to Google Plus .We must take advantage of progress as a community and between communities, not only allocate them to enrich the middlemen and thus give them the benefit of owning our resources. As always think the web and its distribution standards for the peer exchange, not for centralization.

So far, planet.communia.org had built a system of dual pingbacks and trackbacks. From now, we incorporate webmentions system, and we use still the pingbacks while we cancel the trackbacks, because in all the time that we have had them active, we only received 4 good ones (coming from the same planet) and about 2500 that were spam.

In drupal, semantics default is done via RDFa 1.0 in every content type, some microformats and html 5 tags that helps define the good content. The mechanisms of interaction will be reflected in the entrance (un) API in footer's menu   .In addition we have added   microformats , some schema.org specifications and RDFa 1.1.So the content will get foaf, sioc, og and schema.org specifications. Trying to implement standards when possible. So can we keep the web talking again?

Comments

Molt interessant el tema, me guarde el post per rellegir-lo i provar alguns plugins en wordpress.

Jo he fet algunes proves amb FoaF i OpenID per l'enregistrament, açò últim sense molt d'èxit. També tinc una guerra oberta amb els pingbacks/trackbacks (no entenc molt bé la diferència entre els dos) en RSS, no aporten molt en xarxes espesses i no se filtrar-los, si estigueren un un feed distint seria molt millor.

Aniré fent proves i les relataré en el blog, espere que continuem investigant.

Un plaer i salut!


In reply to by Litox

El plaer és meu! Pel que tinc entès, el trackback és un avís en un sentit:  Té l'extracte de la menció en l'avís d'aquesta(per tant no té validació intrínsica). Mentre que el pingback és un avís de menció en dos sentits: Ja que l'avís va sense informació extra, i es compta que hi haurà validació quan el mencionat busqui l'enllaç al cos del text que el menciona. Així a nivell de spam s'entén que el pingback serà més segur. 

Sobre separar mencions i comentaris. En drupal, comentaris i mencions són entitats diferents i es poden indexar de manera molt flexible i separada, en wordpress ni idea ... crec que t'hauràs d'endinsar en el codi o posar camps extres als comentaris ( https://wordpress.org/plugins/wp-comment-fields/ ).

A veure què tal els webmentions amb wordpress...


Add new comment

The content of this field is kept private and will not be shown publicly.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.

Semantic linkbacks

This site uses semantic webmentions to interact between sites and build federated conversations.
Twig context array(16)
'items' => array(0)
'information' => Drupal\Core\StringTranslation\TranslatableMarkup(5)
  • contents
  • Available methods (14)
  • protected string -> string(96) "This site uses semantic webmentions to interact between sites and build federate…"
    This site uses semantic webmentions to interact between sites and build federated conversations.
    protected translatedMarkup -> string(96) "This site uses semantic webmentions to interact between sites and build federate…"
    This site uses semantic webmentions to interact between sites and build federated conversations.
    protected options -> array(0)
    protected stringTranslation -> Drupal\Core\StringTranslation\TranslationManager(4)
    • contents
    • Available methods (10)
    • protected translators -> array(1)
      '30' => array(1)
      Drupal\Core\StringTranslation\Translator\CustomStrings(4)
      • contents
      • Available methods (6)
      • protected settings -> Drupal\Core\Site\Settings(2)
        *DEPTH TOO GREAT*
        protected translations -> array(1)
        *DEPTH TOO GREAT*
        protected _serviceIds -> array(0)
        public _serviceId -> string(32) "string_translator.custom_strings"
      • public __construct(Drupal\Core\Site\Settings $settings)
        Constructs a CustomStrings object.
        
        @param \Drupal\Core\Site\Settings $settings
        The settings read only object.
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:31
        public __sleep()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:22
        public __wakeup()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:46
        public getStringTranslation($langcode, $string, $context)
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:33
        public reset()
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:48
        protected getLanguage($langcode)
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:39
      protected sortedTranslators -> array(1)
      Drupal\Core\StringTranslation\Translator\CustomStrings(4)
      • contents
      • Available methods (6)
      • protected settings -> Drupal\Core\Site\Settings(2)
        • contents
        • Available methods (9)
        • Static class properties (1)
        • private storage -> array(9)
          *DEPTH TOO GREAT*
          public _serviceId -> string(8) "settings"
        • public static get($name, $default = NULL) -> mixed
          Returns a setting.
          
          Settings can be set in settings.php in the $settings array and requested
          by this function. Settings should be used over configuration for read-only,
          possibly low bootstrap configuration that is environment specific.
          
          @param string $name
          The name of the setting to return.
          @param mixed $default
          (optional) The default value to use if this setting is not set.
          
          @return mixed
          The value of the setting, the provided default if not set.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:86
          public static getAll() -> array
          Returns all the settings. This is only used for testing purposes.
          
          @return array
          All the settings.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:96
          public static getApcuPrefix($identifier, $root, $site_path = "") -> string
          Generates a prefix for APCu user cache keys.
          
          A standardized prefix is useful to allow visual inspection of an APCu user
          cache. By default, this method will produce a unique prefix per site using
          the hash salt. If the setting 'apcu_ensure_unique_prefix' is set to FALSE
          then if the caller does not provide a $site_path only the Drupal root will
          be used. This allows WebTestBase to use the same prefix ensuring that the
          number of APCu items created during a full test run is kept to a minimum.
          Additionally, if a multi site implementation does not use site specific
          module directories setting apcu_ensure_unique_prefix would allow the sites
          to share APCu cache items.
          
          @param $identifier
          An identifier for the prefix. For example, 'class_loader' or
          'cache_backend'.
          
          @return string
          The prefix for APCu user cache keys.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:172
          public static getHashSalt() -> string
          Gets a salt useful for hardening against SQL injection.
          
          @return string
          A salt based on information in settings.php, not in the database.
          
          @throws \RuntimeException
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:140
          public static getInstance() -> \Drupal\Core\Site\Settings
          Returns the settings instance.
          
          A singleton is used because this class is used before the container is
          available.
          
          @return \Drupal\Core\Site\Settings
          
          @throws \BadMethodCallException
          Thrown when the settings instance has not been initialized yet.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:51
          public static initialize($app_root, $site_path, &$class_loader)
          Bootstraps settings.php and the Settings singleton.
          
          @param string $app_root
          The app root.
          @param string $site_path
          The current site path.
          @param \Composer\Autoload\ClassLoader $class_loader
          The class loader that is used for this request. Passed by reference and
          exposed to the local scope of settings.php, so as to allow it to be
          decorated with Symfony's ApcClassLoader, for example.
          
          @see default.settings.php
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:114
          public __construct(array $settings)
          Constructor.
          
          @param array $settings
          Array with the settings.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:35
          public __sleep()
          Prevents settings from being serialized.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:67
          private __clone()
          Protects creating with clone.
          
          Defined in .../core/lib/Drupal/Core/Site/Settings.php:61
        • private $instance :: Drupal\Core\Site\Settings(2) *RECURSION*
        protected translations -> array(1)
        'en' => array(0)
        protected _serviceIds -> array(0)
        public _serviceId -> string(32) "string_translator.custom_strings"
      • public __construct(Drupal\Core\Site\Settings $settings)
        Constructs a CustomStrings object.
        
        @param \Drupal\Core\Site\Settings $settings
        The settings read only object.
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:31
        public __sleep()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:22
        public __wakeup()
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php:46
        public getStringTranslation($langcode, $string, $context)
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:33
        public reset()
        {@inheritdoc}
        
        Inherited from Drupal\Core\StringTranslation\Translator\StaticTranslation
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/StaticTranslation.php:48
        protected getLanguage($langcode)
        {@inheritdoc}
        
        Defined in .../core/lib/Drupal/Core/StringTranslation/Translator/CustomStrings.php:39
      protected defaultLangcode -> string(2) "en"
      public _serviceId -> string(18) "string_translation"
    • public __construct(Drupal\Core\Language\LanguageDefault $default_language)
      Constructs a TranslationManager object.
      
      @param \Drupal\Core\Language\LanguageDefault $default_language
      The default language.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:52
      public addTranslator(Drupal\Core\StringTranslation\Translator\TranslatorInterface $translator, $priority = 0) -> $this
      Appends a translation system to the translation chain.
      
      @param \Drupal\Core\StringTranslation\Translator\TranslatorInterface $translator
      The translation interface to be appended to the translation chain.
      @param int $priority
      The priority of the logger being added.
      
      @return $this
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:66
      public formatPlural($count, $singular, $plural, array $args = array(), array $options = array())
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:152
      public getStringTranslation($langcode, $string, $context)
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:92
      public reset()
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:169
      public setDefaultLangcode($langcode)
      Sets the default langcode.
      
      @param string $langcode
      A language code.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:162
      public translate($string, array $args = array(), array $options = array())
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:109
      public translateString(Drupal\Core\StringTranslation\TranslatableMarkup $translated_string)
      {@inheritdoc}
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:116
      protected doTranslate($string, array $options = array()) -> string
      Translates a string to the current language or to a given language.
      
      @param string $string
      A string containing the English text to translate.
      @param array $options
      An associative array of additional options, with the following elements:
      - 'langcode': The language code to translate to a language other than
      what is used to display the page.
      - 'context': The context the source string belongs to.
      
      @return string
      The translated string.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:134
      protected sortTranslators() -> \Drupal\Core\StringTranslation\Translator\TranslatorInterface[]
      Sorts translators according to priority.
      
      @return \Drupal\Core\StringTranslation\Translator\TranslatorInterface[]
      A sorted array of translator objects.
      
      Defined in .../core/lib/Drupal/Core/StringTranslation/TranslationManager.php:79
    protected arguments -> array(0)
  • public __construct($string, array $arguments = array(), array $options = array(), Drupal\Core\StringTranslation\TranslationInterface $string_translation = NULL)
    Constructs a new class instance.
    
    When possible, use the
    \Drupal\Core\StringTranslation\StringTranslationTrait $this->t(). Otherwise
    create a new \Drupal\Core\StringTranslation\TranslatableMarkup object
    directly.
    
    Calling the trait's t() method or instantiating a new TranslatableMarkup
    object serves two purposes:
    - At run-time it translates user-visible text into the appropriate
    language.
    - Static analyzers detect calls to t() and new TranslatableMarkup, and add
    the first argument (the string to be translated) to the database of
    strings that need translation. These strings are expected to be in
    English, so the first argument should always be in English.
    To allow the site to be localized, it is important that all human-readable
    text that will be displayed on the site or sent to a user is made available
    in one of the ways supported by the
    @link https://www.drupal.org/node/322729 Localization API @endlink.
    See the @link https://www.drupal.org/node/322729 Localization API @endlink
    pages for more information, including recommendations on how to break up or
    not break up strings for translation.
    
    @section sec_translating_vars Translating Variables
    $string should always be an English literal string.
    
    $string should never contain a variable, such as:
    @code
    new TranslatableMarkup($text)
    @endcode
    There are several reasons for this:
    - Using a variable for $string that is user input is a security risk.
    - Using a variable for $string that has even guaranteed safe text (for
    example, user interface text provided literally in code), will not be
    picked up by the localization static text processor. (The parameter could
    be a variable if the entire string in $text has been passed into t() or
    new TranslatableMarkup() elsewhere as the first argument, but that
    strategy is not recommended.)
    
    It is especially important never to call new TranslatableMarkup($user_text)
    or t($user_text) where $user_text is some text that a user entered -- doing
    that can lead to cross-site scripting and other security problems. However,
    you can use variable substitution in your string, to put variable text such
    as user names or link URLs into translated text. Variable substitution
    looks like this:
    @code
    new TranslatableMarkup("@name's blog", array('@name' => $account->getDisplayName()));
    @endcode
    Basically, you can put placeholders like @name into your string, and the
    method will substitute the sanitized values at translation time. (See the
    Localization API pages referenced above and the documentation of
    \Drupal\Component\Render\FormattableMarkup::placeholderFormat()
    for details about how to safely and correctly define variables in your
    string.) Translators can then rearrange the string as necessary for the
    language (e.g., in Spanish, it might be "blog de @name").
    
    @param string $string
    A string containing the English text to translate.
    @param array $arguments
    (optional) An associative array of replacements to make after
    translation. Based on the first character of the key, the value is
    escaped and/or themed. See
    \Drupal\Component\Render\FormattableMarkup::placeholderFormat() for
    details.
    @param array $options
    (optional) An associative array of additional options, with the following
    elements:
    - 'langcode' (defaults to the current language): A language code, to
    translate to a language other than what is used to display the page.
    - 'context' (defaults to the empty context): The context the source
    string belongs to.
    @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
    (optional) The string translation service.
    
    @throws \InvalidArgumentException
    Exception thrown when $string is not a string.
    
    @see \Drupal\Component\Render\FormattableMarkup::placeholderFormat()
    @see \Drupal\Core\StringTranslation\StringTranslationTrait::t()
    
    @ingroup sanitization
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:137
    public __sleep()
    Magic __sleep() method to avoid serializing the string translator.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:212
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Component/Utility/ToStringTrait.php:13
    public count() -> int
    Returns the string length.
    
    @return int
    The length of the string.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:236
    public getArguments() -> mixed[]
    Gets all arguments from this translated string.
    
    @return mixed[]
    The array of arguments.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:187
    public getOption($name) -> mixed
    Gets a specific option from this translated string.
    
    @param string $name
    Option name.
    
    @return mixed
    The value of this option or empty string of option is not set.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:167
    public getOptions() -> mixed[]
    Gets all options from this translated string.
    
    @return mixed[]
    The array of options.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:177
    public getUntranslatedString() -> string
    Gets the untranslated string value stored in this translated string.
    
    @return string
    The string stored in this wrapper.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:154
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Inherited from Drupal\Component\Render\FormattableMarkup
    Defined in .../core/lib/Drupal/Component/Render/FormattableMarkup.php:112
    public render() -> string
    Renders the object as a string.
    
    @return string
    The translated string.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:197
    protected static placeholderEscape($value) -> string
    Escapes a placeholder replacement value if needed.
    
    @param string|\Drupal\Component\Render\MarkupInterface $value
    A placeholder replacement value.
    
    @return string
    The properly escaped replacement value.
    
    Inherited from Drupal\Component\Render\FormattableMarkup
    Defined in .../core/lib/Drupal/Component/Render/FormattableMarkup.php:258
    protected static placeholderFormat($string, array $args) -> string
    Replaces placeholders in a string with values.
    
    @param string $string
    A string containing placeholders. The string itself is expected to be
    safe and correct HTML. Any unsafe content must be in $args and
    inserted via placeholders.
    @param array $args
    An associative array of replacements. Each array key should be the same
    as a placeholder in $string. The corresponding value should be a string
    or an object that implements
    \Drupal\Component\Render\MarkupInterface. The value replaces the
    placeholder in $string. Sanitization and formatting will be done before
    replacement. The type of sanitization and formatting depends on the first
    character of the key:
    - @variable: When the placeholder replacement value is:
    - A string, the replaced value in the returned string will be sanitized
    using \Drupal\Component\Utility\Html::escape().
    - A MarkupInterface object, the replaced value in the returned string
    will not be sanitized.
    - A MarkupInterface object cast to a string, the replaced value in the
    returned string be forcibly sanitized using
    \Drupal\Component\Utility\Html::escape().
    @code
    $this->placeholderFormat('This will force HTML-escaping of the replacement value: @text', ['@text' => (string) $safe_string_interface_object));
    @endcode
    Use this placeholder as the default choice for anything displayed on
    the site, but not within HTML attributes, JavaScript, or CSS. Doing so
    is a security risk.
    - %variable: Use when the replacement value is to be wrapped in <em>
    tags.
    A call like:
    @code
    $string = "%output_text";
    $arguments = ['%output_text' => 'text output here.'];
    $this->placeholderFormat($string, $arguments);
    @endcode
    makes the following HTML code:
    @code
    <em class="placeholder">text output here.</em>
    @endcode
    As with @variable, do not use this within HTML attributes, JavaScript,
    or CSS. Doing so is a security risk.
    - :variable: Return value is escaped with
    \Drupal\Component\Utility\Html::escape() and filtered for dangerous
    protocols using UrlHelper::stripDangerousProtocols(). Use this when
    using the "href" attribute, ensuring the attribute value is always
    wrapped in quotes:
    @code
    // Secure (with quotes):
    $this->placeholderFormat('<a href=":url">@variable</a>', [':url' => $url, '@variable' => $variable]);
    // Insecure (without quotes):
    $this->placeholderFormat('<a href=:url>@variable</a>', [':url' => $url, '@variable' => $variable]);
    @endcode
    When ":variable" comes from arbitrary user input, the result is secure,
    but not guaranteed to be a valid URL (which means the resulting output
    could fail HTML validation). To guarantee a valid URL, use
    Url::fromUri($user_input)->toString() (which either throws an exception
    or returns a well-formed URL) before passing the result into a
    ":variable" placeholder.
    
    @return string
    A formatted HTML string with the placeholders replaced.
    
    @ingroup sanitization
    
    @see \Drupal\Core\StringTranslation\TranslatableMarkup
    @see \Drupal\Core\StringTranslation\PluralTranslatableMarkup
    @see \Drupal\Component\Utility\Html::escape()
    @see \Drupal\Component\Utility\UrlHelper::stripDangerousProtocols()
    @see \Drupal\Core\Url::fromUri()
    
    Inherited from Drupal\Component\Render\FormattableMarkup
    Defined in .../core/lib/Drupal/Component/Render/FormattableMarkup.php:188
    protected _die()
    For test purposes, wrap die() in an overridable method.
    
    Defined in .../core/lib/Drupal/Component/Utility/ToStringTrait.php:31
    protected getStringTranslation() -> \Drupal\Core\StringTranslation\TranslationInterface
    Gets the string translation service.
    
    @return \Drupal\Core\StringTranslation\TranslationInterface
    The string translation service.
    
    Defined in .../core/lib/Drupal/Core/StringTranslation/TranslatableMarkup.php:222
'linkbacks' => NULL
'theme_hook_original' => string(26) "semantic_linkbacks_counter"
'attributes' => Drupal\Core\Template\Attribute(1)
  • contents
  • Available methods (17)
  • Iterator contents (0)
  • protected storage -> array(0)
  • public __clone()
    Implements the magic __clone() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:315
    public __construct($attributes = array())
    Constructs a \Drupal\Core\Template\Attribute object.
    
    @param array $attributes
    An associative array of key-value pairs to be converted to attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:80
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:285
    public addClass() -> $this
    Adds classes or merges them on to array of existing CSS classes.
    
    @param string|array ...
    CSS classes to add to the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:170
    public getIterator()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:324
    public hasClass($class) -> bool
    Checks if the class array has the given CSS class.
    
    @param string $class
    The CSS class to check for.
    
    @return bool
    Returns TRUE if the class exists, or FALSE otherwise.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:273
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:341
    public offsetExists($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:158
    public offsetGet($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:89
    public offsetSet($name, $value)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:98
    public offsetUnset($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:151
    public removeAttribute() -> $this
    Removes an attribute from an Attribute object.
    
    @param string|array ...
    Attributes to remove from the attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:219
    public removeClass() -> $this
    Removes argument values from array of existing CSS classes.
    
    @param string|array ...
    CSS classes to remove from the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:244
    public setAttribute($attribute, $value) -> $this
    Sets values for an attribute key.
    
    @param string $attribute
    Name of the attribute.
    @param string|array $value
    Value(s) to set for the given attribute key.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:205
    public storage()
    Returns the whole array.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:331
    public toArray() -> array
    Returns all storage elements as an array.
    
    @return array
    An associative array of attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:303
    protected createAttributeValue($name, $value) -> \Drupal\Core\Template\AttributeValueBase
    Creates the different types of attribute values.
    
    @param string $name
    The attribute name.
    @param mixed $value
    The attribute value.
    
    @return \Drupal\Core\Template\AttributeValueBase
    An AttributeValueBase representation of the attribute's value.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:113
'title_attributes' => Drupal\Core\Template\Attribute(1)
  • contents
  • Available methods (17)
  • Iterator contents (0)
  • protected storage -> array(0)
  • public __clone()
    Implements the magic __clone() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:315
    public __construct($attributes = array())
    Constructs a \Drupal\Core\Template\Attribute object.
    
    @param array $attributes
    An associative array of key-value pairs to be converted to attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:80
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:285
    public addClass() -> $this
    Adds classes or merges them on to array of existing CSS classes.
    
    @param string|array ...
    CSS classes to add to the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:170
    public getIterator()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:324
    public hasClass($class) -> bool
    Checks if the class array has the given CSS class.
    
    @param string $class
    The CSS class to check for.
    
    @return bool
    Returns TRUE if the class exists, or FALSE otherwise.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:273
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:341
    public offsetExists($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:158
    public offsetGet($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:89
    public offsetSet($name, $value)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:98
    public offsetUnset($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:151
    public removeAttribute() -> $this
    Removes an attribute from an Attribute object.
    
    @param string|array ...
    Attributes to remove from the attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:219
    public removeClass() -> $this
    Removes argument values from array of existing CSS classes.
    
    @param string|array ...
    CSS classes to remove from the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:244
    public setAttribute($attribute, $value) -> $this
    Sets values for an attribute key.
    
    @param string $attribute
    Name of the attribute.
    @param string|array $value
    Value(s) to set for the given attribute key.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:205
    public storage()
    Returns the whole array.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:331
    public toArray() -> array
    Returns all storage elements as an array.
    
    @return array
    An associative array of attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:303
    protected createAttributeValue($name, $value) -> \Drupal\Core\Template\AttributeValueBase
    Creates the different types of attribute values.
    
    @param string $name
    The attribute name.
    @param mixed $value
    The attribute value.
    
    @return \Drupal\Core\Template\AttributeValueBase
    An AttributeValueBase representation of the attribute's value.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:113
'content_attributes' => Drupal\Core\Template\Attribute(1)
  • contents
  • Available methods (17)
  • Iterator contents (0)
  • protected storage -> array(0)
  • public __clone()
    Implements the magic __clone() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:315
    public __construct($attributes = array())
    Constructs a \Drupal\Core\Template\Attribute object.
    
    @param array $attributes
    An associative array of key-value pairs to be converted to attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:80
    public __toString()
    Implements the magic __toString() method.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:285
    public addClass() -> $this
    Adds classes or merges them on to array of existing CSS classes.
    
    @param string|array ...
    CSS classes to add to the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:170
    public getIterator()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:324
    public hasClass($class) -> bool
    Checks if the class array has the given CSS class.
    
    @param string $class
    The CSS class to check for.
    
    @return bool
    Returns TRUE if the class exists, or FALSE otherwise.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:273
    public jsonSerialize() -> string
    Returns a representation of the object for use in JSON serialization.
    
    @return string
    The safe string content.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:341
    public offsetExists($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:158
    public offsetGet($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:89
    public offsetSet($name, $value)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:98
    public offsetUnset($name)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:151
    public removeAttribute() -> $this
    Removes an attribute from an Attribute object.
    
    @param string|array ...
    Attributes to remove from the attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:219
    public removeClass() -> $this
    Removes argument values from array of existing CSS classes.
    
    @param string|array ...
    CSS classes to remove from the class attribute array.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:244
    public setAttribute($attribute, $value) -> $this
    Sets values for an attribute key.
    
    @param string $attribute
    Name of the attribute.
    @param string|array $value
    Value(s) to set for the given attribute key.
    
    @return $this
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:205
    public storage()
    Returns the whole array.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:331
    public toArray() -> array
    Returns all storage elements as an array.
    
    @return array
    An associative array of attributes.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:303
    protected createAttributeValue($name, $value) -> \Drupal\Core\Template\AttributeValueBase
    Creates the different types of attribute values.
    
    @param string $name
    The attribute name.
    @param mixed $value
    The attribute value.
    
    @return \Drupal\Core\Template\AttributeValueBase
    An AttributeValueBase representation of the attribute's value.
    
    Defined in .../core/lib/Drupal/Core/Template/Attribute.php:113
'title_prefix' => array(0)
'title_suffix' => array(0)
'db_is_active' => boolTRUE
'is_admin' => boolFALSE
'logged_in' => boolFALSE
'user' => Drupal\Core\Session\AccountProxy(4)
  • contents
  • Available methods (17)
  • Static class properties (2)
  • protected account -> Drupal\Core\Session\AnonymousUserSession(8)
    • contents
    • Available methods (15)
    • Static class properties (2)
    • protected uid -> integer0
      protected roles -> array(1)
      string(9) "anonymous"
      protected access -> NULL
      public name -> string(0) ""
      protected preferred_langcode -> NULL
      protected preferred_admin_langcode -> NULL
      protected mail -> NULL
      protected timezone -> NULL
    • public __construct()
      Constructs a new anonymous user session.
      
      Intentionally don't allow parameters to be passed in like UserSession.
      
      Defined in .../core/lib/Drupal/Core/Session/AnonymousUserSession.php:15
      public getAccountName()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:164
      public getDisplayName()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:171
      public getEmail()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:180
      public getLastAccessedTime()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:194
      public getPreferredAdminLangcode($fallback_to_default = true)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:144
      public getPreferredLangcode($fallback_to_default = true)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:131
      public getRoles($exclude_locked_roles = false)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:92
      public getTimeZone()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:187
      public getUsername()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:157
      public hasPermission($permission)
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:105
      public id()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:85
      public isAnonymous()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:124
      public isAuthenticated()
      {@inheritdoc}
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:117
      protected getRoleStorage() -> \Drupal\user\RoleStorageInterface
      Returns the role storage object.
      
      @return \Drupal\user\RoleStorageInterface
      The role storage object.
      
      Inherited from Drupal\Core\Session\UserSession
      Defined in .../core/lib/Drupal/Core/Session/UserSession.php:204
    • constant ANONYMOUS_ROLE :: string(9) "anonymous"
      constant AUTHENTICATED_ROLE :: string(13) "authenticated"
    protected id -> integer0
    protected initialAccountId -> NULL
    public _serviceId -> string(12) "current_user"
  • public getAccount()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:58
    public getAccountName()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:133
    public getDisplayName()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:140
    public getEmail()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:147
    public getLastAccessedTime()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:161
    public getPreferredAdminLangcode($fallback_to_default = true)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:119
    public getPreferredLangcode($fallback_to_default = true)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:112
    public getRoles($exclude_locked_roles = false)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:84
    public getTimeZone()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:154
    public getUsername()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:126
    public hasPermission($permission)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:91
    public id()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:77
    public isAnonymous()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:105
    public isAuthenticated()
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:98
    public setAccount(Drupal\Core\Session\AccountInterface $account)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:44
    public setInitialAccountId($account_id)
    {@inheritdoc}
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:168
    protected loadUserEntity($account_id) -> \Drupal\Core\Session\AccountInterface|null
    Load a user entity.
    
    The entity manager requires additional initialization code and cache
    clearing after the list of modules is changed. Therefore it is necessary to
    retrieve it as late as possible.
    
    Because of serialization issues it is currently not possible to inject the
    container into the AccountProxy. Thus it is necessary to retrieve the
    entity manager statically.
    
    @see https://www.drupal.org/node/2430447
    
    @param int $account_id
    The id of an account to load.
    
    @return \Drupal\Core\Session\AccountInterface|null
    An account or NULL if none is found.
    
    Defined in .../core/lib/Drupal/Core/Session/AccountProxy.php:195
  • constant ANONYMOUS_ROLE :: string(9) "anonymous"
    constant AUTHENTICATED_ROLE :: string(13) "authenticated"
'directory' => string(22) "themes/planet_founding"
  • Directory (4.00K)
  • drwxr-x---
'#cache' => array(1)
'contexts' => array(1)
string(16) "user.permissions"
'theme_hook_suggestions' => array(0)