Commit graph

84 commits

Author SHA1 Message Date
Subramanya Sastry a8a6951f9c Bump Parsoid/JS version to 0.11.0 for deb package release
Change-Id: I2f5df42fe7d8275f0a3d4d77cd4cd410f76e9974
2020-01-11 13:43:13 +05:30
Subramanya Sastry ad229c1ac0 One more fix for T235656
It is about time to implement a generic fix for T214994 which will
capture the Cite-specific scenario we are tackling here in bits
and pieces. We have fragments of a T214994 solution spread in
Utils/ and here while tackling shiftDSR and convertOffsets
for Parsoid/PHP. So, someone needs to take a look at all these
pieces and implement the necessary abstraction.

As part of that, maybe we also need to revisit our embedded HTML
data-* representation so there is a uniform way to inspect these
attributes rather than every semantic element (template, extensions,
lang variants, media) choosing their own custom embedding scheme
which makes discoverability harder and error-prone.

Change-Id: Ifd19d2d8d20dbd0dda0fa1cc338a07afb37c4213
2019-11-06 14:03:29 -06:00
C. Scott Ananian d55a8db4e4 Clean up typeOf matching in Cite extension
Change-Id: I88388a2120cc1bd79ef7ec5de3c40e93db22844f
2019-11-04 20:08:33 +00:00
Subramanya Sastry 965203b301 Process <ref>s found in nodes with mw:ExpandedAttrs typeof
* This is an instance of a bigger issue that we need to look closely
  when we are integrating Parsoid with core parser.

Bug: T235656
Change-Id: I3d652727293461c7968e83be8994ba0572bae8e4
2019-10-29 21:52:09 +00:00
Arlo Breault e6204a1561 Test against ref name length instead of coercing to bool
Since "0" is falsy in php.

Couple tests now pass.

Change-Id: I9b62b9f78680de6e1d5c31723af7212a58a535f3
2019-08-14 18:59:28 -04:00
C. Scott Ananian b84b71af22 Gallery: shift TSRs in the DOM, rather than fibbing about srcOffset
Passing srcOffsets which don't actually correspond to actual regions of
the source wikitext cause problems in the token offset conversion code.
Instead, parse the wikitext as itself, then adjust the TSRs in the DOM
tree.

Since Gallery isn't ported to PHP (yet), update the
automatically-generated Gallery/index.php.  The newly-added
ContentUtils::shiftDSR() was ported, however.

Change-Id: I28f3d3398930733ae2bcf9759e49c45f93bc7190
2019-06-28 14:10:16 +00:00
Subramanya Sastry 04efa43c4c s/typeOf/typeof in various files
- git grep is a wonderful thing to help catch identical errors.
- Saw this "bug" first in the cite extension port.
- Turns out this is only a bug on the PHP side since the PHP DOM
  treats attributes in a case-sensitive manner but Domino.js
  treats attributes in a case-insensitive manner.
- Better to use the correct attribute name everywhere.

Change-Id: I3735dc768a10a820b4816c211aa72291df9b1413
2019-06-20 11:46:07 -05:00
Subramanya Sastry 30aaf6574c DOMFragments: Use sealFragment instead of unwrapFragment
* unwrapFragment had a somewhat unusual behavior which could be
  a source of bugs while reasoning with it.

  If undefined, it's default value is true which is contrary
  to how we think of undefined.

* Flipping the polarity of the flag to sealFragment makes the
  semantics easier to reason with and where !empty(..) applies
  more naturally to it.

Change-Id: Ia50cba345f37e815e5f5f95abb452c8eefcf9011
2019-06-13 13:38:20 -05:00
Subramanya Sastry f5c8aacc6e Cite lint handler: Use nextSibling instead of nextNode
* Not sure why nextNode was used in the first place, possibly
  some oversight?

Change-Id: Ied76591947bb7505c59b9a11589a19b13dc58790
2019-05-28 17:30:10 +00:00
Arlo Breault 05cb13ddf9 Make extensions with post-processors return constructors
This allows us to finish the cleanup started in 0b3bb10 and inline
setupProcessors.

Change-Id: Ia7840091607e9a75153031b5db7600d5a0018da6
2019-04-03 18:44:21 +00:00
Arlo Breault 20c627e3f4 Convert cite extension to es6 class structure
Also, runs js2php on these files.

Change-Id: Id8ee13ad536d75f63e0045a21fdfdb667a0df65d
2019-04-03 12:20:41 -04:00
C. Scott Ananian eb70a83eb0 Audit uses of Node#getAttribute() + add missing file to PHP codebase
In PHP, DOMNode#getAttribute() return '' if the attribute is not present,
not null.  Audit our uses and try to either explicitly use `|| ''` (which
will ensure that PHP behaves the same was as JS) or use `hasAttribute`
to explicitly test for the presence of the attribute.

Changes have also been ported to PHP from JS.
Also added src/Wt2Html/PP/Processors/AddMediaInfo.php which was missing.

Change-Id: Ie1ae1df88e4fca70daf97b6f720f28014ebc99ed
2019-03-15 15:48:20 +00:00
Arlo Breault 550d3d71eb Use a bag-on-the-side implementation for node data
Centralizing where all the docs are created is also useful for T179082

Bug: T204608
Change-Id: I5f0f1d4e696794dc8666edcbf290dea790c06673
2019-02-21 15:13:32 +00:00
Arlo Breault a8be3ad6e4 Fix crasher in cite extension from accessing data after it's stored
Follow up to b0f2adc

Change-Id: I840924ba1ba1b7af963d541c2cb6619543fbe69d
2019-02-19 13:05:10 -05:00
C. Scott Ananian 11147b88f4 Minor JS fixes to make conversion to PHP better
Change-Id: Ia36dab7c9a0a59df80c582b18cbc5a0a9bf8a36a
2019-02-04 13:39:16 -05:00
Arlo Breault 1855c046ac Add media info in a post-processing pass
The basic idea here is to generate the media structure in the token
stream using a stuffed span with a redlink, as in T169975, and
augmenting the nodes on the DOM once the media info has been fetched.

A redlink is justified as the canonical representation of the media
elements before info is fetched because it's the fallback if fetching
fails and the media type is unknown until the info is retrieved.

Most options are stored in data-mw until the media type is fetched and
it's determined that they're applicable.  This is a bit of a reversion
of how things were done before where inapplicable options were removed
post-facto.

For consistency and styling's sake, figcaptions are now always added to
block figures.

The pass has to be run before generating headings anchor, since that
depends on the text content (ie. redlinks).  This rearranges things in
the post-processor and adds another pass.

The post-processing pass to add media info is run on subpipelines as
well as the top level so that the media info is present in cases where
we embed HTML in data-mw (which is currently skipped by the top level
only passes, except for the cite extension, which has special handling,
see T214994) and to avoid an additional post-processing pass for the
gallery extension, which scales media of packed galleries.  This comes
at the cost of making additional queries for each pipeline and requires
the add media pass to be idempotent.

Filed T214241 for figuring out what to do about data-mw info being
clobbered by template annotations.

The newly failing blacklisted tests are from roundtripping media options
in galleries, which requires a general refactor for support.  See the
FIXMEs added there.

Performance should be expected to regress by the amount of work we're
able to overlap in the async phase of the pipeline while the media info
is being fetched.  Considering a lot of that work is caught up waiting
for the batch to return (other async requests are found in the same
batch), this doesn't turn out to be much in practice in the average
case.

Bug: T153080
Bug: T169975
Change-Id: I856ee962b70cef1f8d49652396ea5264e11a8ade
2019-02-01 13:30:07 -08:00
Subramanya Sastry 59b6621db3 extapi: Stop leaking manager (an impl. detail) to extensions
* Extensions only need config info (env) and potentially abstract
  parsing context (frame).

* Added some FIXMEs about potential future improvements.

Change-Id: Ib4cec4a77ecb96c855798eeb06f7742c5efb0729
2019-01-08 00:21:56 +00:00
Arlo Breault df161e78eb Add helpers to ease binding context when load/storing data attribs
Bug: T209772
Change-Id: Iebe68b179656538955c0c438806a1a724e7d185c
2018-12-18 12:39:04 -05:00
Subramanya Sastry 8a9908abbc Remove .bind() usages in native extension code.
Bug: T205336
Change-Id: I544205d7f32f755c0d0616af404a68ea40f4d2f5
2018-12-07 03:23:31 +00:00
Arlo Breault c1b003553d Move applying about ids from fragment wrappers to extension content
It's only the extension content that needs the about ids.  This matches
b241ac6 where span wrapping was only applied to extension content, and
goes hand-in-hand.  The one necessitates the other.

Fragment wrappers don't need abouts since they don't have siblings and
are represented as a single node.

When we get to unpacking, it's now clear that if the wrapper has an
about id, it came from template encapsulation and would need to be
applied to the top-level nodes in the fragment.  This being true of
all fragment, it lets use get rid of the `isForeignContent` option to
`encapsulateExpansionHTML`, since that no longer serves to distinguish
anything.

Change-Id: Id9faae3d4e3c8771c2de1fb42ba62a7d92d76673
2018-12-06 23:35:07 +00:00
Subramanya Sastry cee1086f35 Update HISTORY.md + bump version numbers to 0.10.0 for deb release
Change-Id: I0be0c80a3f47ba3b1c2f94016bd9304de99388d4
2018-12-05 12:09:26 -05:00
Subramanya Sastry 7bee635f21 Split utils/DOMUtils.js into separate functional units
* DOMUtils was perhaps the biggest kitchen sink utility class we had
  with different classes of utilities.

* The split reflects a clear dependence hierarchy:
  DOMUtils -> DOMDataUtils -> WTUtils -> ContentUtils

  This also seems to reflect a bit in the use patterns.
  Content helpers are not used as much in html2wt.

* DOMUtils now only has DOM utilities that are independent of Parsoid
  and could be useful in another project.

* Moved a couple helpers into WTSUtils.js since they are very narrowly
  scoped to html2wt functionality and are unlikely to be every useful
  elsewhere.

* Moved diffing related utils to html2wt/DiffUtils.js
  - There is still a dependency in development / debug mode when
    doms have to be dumped. I couldn't think of an easy way of
    removing this dependency.

  - But otherwise, DiffUtils is scoped to html2wt use cases only.

* One more circular dependency eliminated.

* All tests pass.

Bug: T208360
Bug: T205333
Change-Id: I522e8b5c7d726706f994386282476102fe35e91e
2018-12-03 14:57:40 -06:00
Arlo Breault 878f6c7937 Unnecessary passing along of "responsive" attribute
These are already set on the first encapsulation node by toDOM.

Change-Id: I1eefdaf94e28222fc44d0be9d017eeab2f70c592
2018-12-03 03:54:26 +00:00
Arlo Breault 26984c0294 Allow extensions to set more options to encapsulateExpansionHTML
The nowiki extension will want to override `isForeignContent` so that
about attributes are omitted on the contents.

Change-Id: Iea28d7a66a90d516226ba9dce4518be6b996d18e
2018-11-29 20:28:54 -05:00
Subramanya Sastry b4d7a158cd Cite: Import Sanitizer from extapi
Change-Id: Ic4cb95d2fbe678641b4496d38295ec8e06269d28
2018-11-21 20:24:48 +00:00
Arlo Breault e644753c6b Introduce a parseTokenContentsToDOM helper
It calls out to a slimmed down parseWikitextToDOM, since only a subset
of that functionality is needed in some extensions, like gallery.

Change-Id: I72e29c4b285fc8cae0207966cc2eddd0fe3ebcf3
2018-11-19 12:20:43 -05:00
Subramanya Sastry 678effaf0e Extension API: Add a html2wtPreprocessor DOM processor stub
* This patch doesn't do any actual work beyond adding the framework
  in place for HTML preprocessing before actual serialization.

Change-Id: I2505f5937657813480abef8ec5da9d765a953e29
2018-11-07 17:22:31 +00:00
Subramanya Sastry a944352878 Extracted token-related helpers from Util to TokenUtils
* Things to investigate as followups:
  - Should this be part of the Token base class in parser.defines.js?
  - Can we remove nowiki & cite usage of these helpers? Why do they
    need to know about (parser internals) tokens?

Bug: T208360
Change-Id: Ib962b4acf9534852240fcb083ce67d696a997a83
2018-10-30 18:05:24 -05:00
Subramanya Sastry e1a6c9a953 Rename parsing pipeline options to something more semantic
* noPwrapping and noPre existed to reproduce the symptomatic
  effects of other behavior / semantics in the parsing pipeline.

  One of that semantic source was the fact that the content
  being parsed in their own pipeline was being using in inline
  contexts and p-wrapping and indent-pre generation doesn't
  make sense in those contexts.

  The other semantic source was the fact that when the content
  being parsed in their own pipeline was embedded "inPHPBlock"
  in the PHP Parser's doBlockLevels sense, i.e. inside a block
  element that existed on the same wikitext source line.

* This patch introduces inPHPBlock and inlineContext as two
  new parsing pipeline options and uses one or the other or both
  where appropriate.

* No change in parser test results as expected.

Change-Id: I2c625456c6593e49b6a247fb9b2f2e3d6021155b
2018-10-02 23:05:53 +00:00
Subramanya Sastry 499c2c4564 Remove more Cite leakage from html2wt code
* This removes Cite leakage in html2wt code by adding PHP parser
  side-effect leakage into the Cite extension configs.
  This is a somewhat temporary solution which we hope to address
  better as part of ongoing cleanup.

* After 4 years, 'a quick hack for now' introduced in 3301393515f
  has been addressed.

* No change in parser test passes.

Change-Id: Ic5f8c160d4eedcc4236bce5f095344bd879188cd
2018-10-02 23:00:15 +00:00
Subramanya Sastry 635be2e906 Tweak extension config a bit more
* Move the name property to the top level

Change-Id: Id8730f35e40ad9f01d250f29ef3c2545fd4fd612
2018-08-30 19:00:35 +00:00
Subramanya Sastry bf0a743c2d Document more extension-API related FIXMEs
* Cite-specific code has leaked in html2wt
* Other possible FIXMEs in Cite about generalizing or
  adding new extension API functions.

Change-Id: I30712a3af81edfce0760f4a45ab694c798fb294a
2018-08-29 21:48:43 +00:00
Subramanya Sastry 62cd9789f2 Tweak extension DOM config for extensibility
* Make the dom part of extension registration / config more general
  to allow for other kinds of dom processors.

* For example, we will probably be letting extensions define DOM
  handlers that lets us take a document's subtree and convert it to
  self-contained top-level document.

Change-Id: I0ddfe3bc677041cedf63e79faa9c5af939953419
2018-08-23 19:39:16 +00:00
Arlo Breault 93371d4dee Support directionality for reference
Ports commit 1ca27aa from extensions/Cite

Bug: T198221
Depends-On: Iaf84966e37cea730c9eca07c19a555971ffeadf3
Change-Id: I28c8efa6fd5cb06220af4399aa26f3d01b8d3761
2018-08-23 14:36:04 -04:00
Arlo Breault a118efbbd7 Ensure the ref.cachedHtml isn't being regenerated needlessly
Change-Id: If319ad282ed7dd437dce400417e4555291a2dc38
2018-08-16 19:34:04 -04:00
Arlo Breault 9928fe4044 Separate which source of data attributes are used in extractRefFromNode
Follow up to 53ae5aa

It's somewhat unclear which attributes belong on the representation for
the fragment, so don't rely on them unnecessarily.

Change-Id: Ib5ba0110291f0c02bd703482813b9567dab63cd6
2018-08-16 19:33:22 -04:00
Subramanya Sastry 8fa5bc3376 Enable extensions to distinguish between <ext /> and <ext></ext>
* This now lets Cite distinguish between <ref></ref> and <ref />
  Seen in improvement in blacklisted output of a parser test.

Bug: T130224
Change-Id: If9511498fe8f6d091f8a725b51810eb452db95de
2018-08-14 21:47:43 +00:00
Subramanya Sastry 1a2b7e796f Remove Cite-specific flag from parser pipeline options
* Use a generic extTagOpts that is opaque to the core parser
  but the individual extension can inspect.

Change-Id: I4d1331604828d583b820084e00af68232ec767f8
2018-08-09 02:00:03 +00:00
Subramanya Sastry d8f4a31efe Handle <references></references> without crashing
* Fixes rt regressions on svwiki:Havre and a bunch of other titles.

Change-Id: I1d31ccf1045ba5a4fef9377101ad4e90a534c1e9
2018-08-09 02:00:01 +00:00
Subramanya Sastry 53ae5aac06 Cite: Get rid of tokenHandler that relies on Parsoid internals
* This still exposes and exploits some Parsoid internals, but
  that can be fixed in the next round of updates.

* Cite (and any other extension) that want to manage fragments
  on their own vs. running the default fragment unpacking routine
  can now specify that they don't want the content unwrapped.

* Changes to parser tests are to rearrange the attrs and body
  attributes which switched positions in data-mw.

* The blacklist changes show that there has actually been an
  improvement in test failures.

Change-Id: I1e1a651e8f2d6d9456bb5849b0bce1f8a87c4446
2018-08-06 21:40:52 +00:00
Subramanya Sastry 116d3c3744 Bump Parsoid release version to 0.9.0
Change-Id: Icd71628513380d7a7fe4fb88fa7e26150ed0e7ef
2018-03-22 13:29:06 -05:00
C. Scott Ananian 4fbcb99cc6 Improve jsdoc summaries.
The summary is the first sentence of the method/class description.  In
some cases we're missing a period so our "summary" runs on and on.

Many of these were fixed up automatically by the
`jsdoc/require-description-complete-sentence` eslint rule, but
it has a few bugs yet (especially
https://github.com/gajus/eslint-plugin-jsdoc/issues/62 ) so we
can't yet turn it on by default.

Change-Id: I5163ed2c52b21090ce018573bb3ff06d50620d73
2018-02-27 22:41:39 +00:00
C. Scott Ananian e82f60f62d Turn on eslint jsdoc/check-tag-names rule.
Change-Id: Ifd9a5319171684015463d6b5759ed2308bff1a5b
2018-02-27 18:10:04 +00:00
C. Scott Ananian 6668c45947 Improve jsdoc
Lots of doc comment tweaks to better match JSDoc standards.  Also use
the latest version of jsdoc-wmf-theme.

Change-Id: I9bf4f22b292b9cff0ad926f31005bccc7c89cbdb
2018-02-22 14:16:58 -05:00
Arlo Breault ab3f062098 Upgrade eslint
Then changes here were made by running `npm run eslint-fix`

Change-Id: Ifb623af610cadc4200b34b52af41c9fa29856b6b
2018-02-17 09:08:32 -05:00
C. Scott Ananian fd719e02e2 Use Promise.async/yield in lib/ext/Cite
Change-Id: I08458b0083de8d9aec9673af7f08c4b2e25112e5
2018-02-16 23:21:09 +00:00
C. Scott Ananian 8713e6cb55 Replace .bind(this) and var self = this; with arrow functions.
Arrow functions don't redefine `this`; they are supported in node >= 4.

http://node.green/#ES2015-functions-arrow-functions

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Change-Id: I03790eaa790b00194d137eef397371d63f242ac1
2018-02-09 14:56:48 -05:00
Arlo Breault c60d8f6078 Rethink responsive references wrappers
Emit them earlier (before post-processing) so that attributes don't need
to be migrated.

Bug: T181408
Change-Id: I2b5c7ff552b3322be74f79a81936c41d58fecabc
2018-02-01 17:53:30 +00:00
Arlo Breault 04aa4beb5b Fix infinite recursion from linting named ref cycles
On pages like,
http://localhost:8000/fr.wikipedia.org/v3/page/html/Krzysztof_Charamsa/142052535
http://localhost:8000/es.wikipedia.org/v3/page/html/Taxonom%C3%ADa/104913080

Bug: T185267
Change-Id: I156cce384873609a65b659360667323b8f0a497b
2018-01-22 18:43:11 -05:00
sbailey 4eaddbb890 Fix for T45094 replaces <span> with <sup> for references
This change was prompted by a request to follow the PHP Cite extensions
lead in using <sup> for linkbacks. Also, using superscript for
notations/citations is semantically appropriate and follows style guide
conventions.

Change-Id: I7c83d12dd900682799c124ddae1a8689969d5e8c
2018-01-16 18:41:25 +00:00