Skip to content

Commit 8cedb9e

Browse files
authored
Merge pull request #94 from theonion/article-position
add article positition to ad call
2 parents e01baad + 8dcfb8f commit 8cedb9e

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

src/helpers/TargetingPairs.js

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,48 @@ var TargetingPairs = {
3131
return (tagMeta.tags || '').split(',');
3232
},
3333

34+
/**
35+
* Gets index of article position in reading list
36+
*
37+
* @param HTMLElement adContainer the ad container currently being filled
38+
* @param object kinjaMeta kinja-specific post meta
39+
*/
40+
getArticlePosition: function (adContainer, kinjaMeta) {
41+
if (document && adContainer && kinjaMeta.pageType === "permalink" && !(kinjaMeta.post && kinjaMeta.post.isFeatured)) {
42+
var readingListPostIds = Array.from(document.getElementsByClassName('js_reading-list-item')).map(post => post.dataset.postId);
43+
44+
if (readingListPostIds.length > 0) {
45+
var readingListItem = adContainer.closest('.js_reading-list-item');
46+
if (readingListItem) {
47+
var currentPostId = readingListItem.dataset.postId;
48+
return readingListPostIds.indexOf(currentPostId) + 2;
49+
}
50+
}
51+
}
52+
53+
return 1;
54+
},
55+
3456
/**
3557
* Constructs associative array of targeting pairs from post meta
3658
*
3759
* @param Window scope the window to use for the kinja meta info.
3860
*
3961
*/
40-
buildTargetingPairs: function (scope, positionTargeting) {
62+
buildTargetingPairs: function (scope, positionTargeting, adContainer) {
4163
var kinjaMeta = scope.kinja.meta,
4264
post = scope.kinja.postMeta || {},
4365
content = scope.kinja.postContentRatings || [],
4466
experimentVariation = Experiments.getExperimentVariation(scope),
4567
experimentId = Experiments.getExperimentId(scope),
4668
socialTargeting, key,
47-
targeting = {};
69+
targeting = {},
70+
articlePosition = TargetingPairs.getArticlePosition(adContainer, kinjaMeta);
4871

4972
// Begin slot level params AKA 'scp'
5073
targeting.slotOptions = {
5174
// Standard targeting options
75+
article_position: articlePosition,
5276
pos: positionTargeting || null,
5377
postId: post ? post.postId : null,
5478
socialReferrer: SocialReferrer.getSocialReferrer(),
@@ -78,17 +102,18 @@ var TargetingPairs = {
78102
*
79103
* @param string forcedAdZone forced ad zone, if any
80104
* @param Window scope the window to use for the kinja meta info.
105+
* @param element adContainer optional ad container to determine positioning
81106
*
82107
*/
83-
getTargetingPairs: function (forcedAdZone, positionTargeting) {
108+
getTargetingPairs: function (forcedAdZone, positionTargeting, adContainer) {
84109
if (forcedAdZone && !window.kinja) {
85110
return { pageOptions : { forcedAdZone : forcedAdZone} };
86111
}
87112
if (!window.kinja) {
88113
return {};
89114
}
90115

91-
var targetingOptions = this.buildTargetingPairs(window, positionTargeting);
116+
var targetingOptions = this.buildTargetingPairs(window, positionTargeting, adContainer);
92117

93118
targetingOptions.pageOptions.forcedAdZone = forcedAdZone || false;
94119

src/helpers/TargetingPairs.spec.jest.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,5 +235,20 @@ describe('TargetingPairs', function() {
235235
expect(spy).not.toHaveBeenCalled();
236236
});
237237
});
238+
239+
describe('article positioning', function() {
240+
beforeEach(function() {
241+
window.document.body.innerHTML = `
242+
<div class='js_reading-list-item' data-post-id='1' >
243+
<div class='ad-container' />
244+
</div>
245+
`;
246+
});
247+
248+
it('returns the index of the article in reading list', function() {
249+
var childElement = document.body.getElementsByClassName('ad-container')[0];
250+
expect(TargetingPairs.getArticlePosition(childElement, {})).toEqual(1);
251+
});
252+
});
238253
});
239254
});

src/manager.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ AdManager.prototype.slotInfo = function () {
494494
AdManager.prototype.setSlotTargeting = function (element, slot, adUnitConfig) {
495495
var slotTargeting = element.dataset.targeting ? JSON.parse(element.dataset.targeting) : {};
496496
slotTargeting.pos = slotTargeting.pos || adUnitConfig.pos || adUnitConfig.slotName || element.dataset.adUnit;
497-
var kinjaPairs = TargetingPairs.getTargetingPairs(AdZone.forcedAdZone(), slotTargeting.pos).slotOptions;
497+
var kinjaPairs = TargetingPairs.getTargetingPairs(AdZone.forcedAdZone(), slotTargeting.pos, element).slotOptions;
498498

499499
slotTargeting = utils.extend(kinjaPairs, slotTargeting);
500500

0 commit comments

Comments
 (0)